summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xBuild/source/texk/texlive/linked_scripts/context/stubs/unix/mtxrun3573
-rwxr-xr-xMaster/bin/win32/mtxrun.lua3573
-rw-r--r--Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-context.lua4
-rw-r--r--Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-interfaces.lua16
-rw-r--r--Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-metafun.lua2
-rw-r--r--Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-metapost.lua10
-rw-r--r--Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-tex.lua4
-rw-r--r--Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-bibtex.lua25
-rw-r--r--Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-dummy.lua35
-rw-r--r--Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-lua.lua5
-rw-r--r--Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-tex.lua6
-rw-r--r--Master/texmf-dist/context/data/scite/context/scite-context-data-context.properties361
-rw-r--r--Master/texmf-dist/context/data/scite/context/scite-context-data-interfaces.properties1525
-rw-r--r--Master/texmf-dist/context/data/scite/context/scite-context-data-metafun.properties75
-rw-r--r--Master/texmf-dist/context/data/scite/context/scite-context-data-metapost.properties139
-rw-r--r--Master/texmf-dist/context/data/scite/context/scite-context-data-tex.properties7
-rw-r--r--Master/texmf-dist/context/data/scite/context/scite-context-external.properties11
-rw-r--r--Master/texmf-dist/context/data/scite/context/scite-context.properties3
-rw-r--r--Master/texmf-dist/context/data/scite/context/scite-ctx.lua21
-rw-r--r--Master/texmf-dist/doc/context/document/general/manuals/mreadme.pdfbin85996 -> 0 bytes
-rw-r--r--Master/texmf-dist/doc/context/document/general/manuals/tiptrick.pdfbin30607 -> 0 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/epub-mkiv-demo.epubbin0 -> 13085 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/epub-mkiv-demo.pdfbin0 -> 19063 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/epub-mkiv.pdfbin0 -> 98652 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/mreadme.pdfbin0 -> 40916 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/swiglib-mkiv.pdfbin0 -> 169015 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/tiptrick.pdfbin0 -> 47397 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/tools-mkiv.pdfbin0 -> 374218 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/units-mkiv.pdfbin0 -> 163989 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/workflows-mkiv.pdfbin0 -> 74818 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/xtables-mkiv.pdfbin0 -> 136973 bytes
-rw-r--r--Master/texmf-dist/doc/context/manuals/allkind/mcommon.tex199
-rw-r--r--Master/texmf-dist/doc/context/manuals/allkind/mkiv-publications-graph.bib53
-rw-r--r--Master/texmf-dist/doc/context/manuals/allkind/mkiv-publications.bib36
-rw-r--r--Master/texmf-dist/doc/context/manuals/allkind/mkiv-publications.pdfbin290580 -> 0 bytes
-rw-r--r--Master/texmf-dist/doc/context/manuals/allkind/mkiv-publications.tex1523
-rw-r--r--Master/texmf-dist/doc/context/manuals/allkind/mreadme.tex361
-rw-r--r--Master/texmf-dist/doc/context/manuals/allkind/publications-en.xml372
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/ctxtools.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/imgtopdf.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/pdftools.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/pstopdf.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/rlxtools.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/texexec.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/texmfstart.html2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/texmfstart.man8
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/texmfstart.xml2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/textools.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/texutil.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/tmftools.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/xmltools.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/context.html8
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/context.man11
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/context.xml25
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/luatools.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-babel.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-base.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-bibtex.html53
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-bibtex.man30
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-bibtex.xml26
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-cache.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-chars.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-check.html2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-check.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-check.xml2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-colors.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.html8
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.man11
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.xml25
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-epub.html9
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-epub.man17
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-epub.xml7
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-fcd.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-flac.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.html2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.xml2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-grep.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-interface.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-metapost.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-metatex.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-modules.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-package.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.html2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.man5
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.xml2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-pdf.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-plain.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-profile.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-rsync.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-scite.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-server.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-texworks.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-timing.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-tools.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-unzip.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-update.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-watch.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-youless.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.html2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.man8
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.xml2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/epub/epub-mkiv-demo.tex43
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/epub/epub-mkiv.tex466
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mcommon.tex210
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/readme/mreadme.tex372
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/swiglib/swiglib-mkiv.tex335
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/tiptrick/tiptrick.tex117
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/tiptrick/tiptrick.xml53
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/tools/tools-mkiv.tex501
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/units/units-mkiv.tex538
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-contents.tex13
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-graphics.tex157
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-injectors.tex86
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-introduction.tex27
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-mkiv.tex30
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-resources.tex156
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-setups.tex72
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-style.tex49
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-suspects.tex54
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-titlepage.tex37
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-xml.tex96
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/xtables/xtables-mkiv.tex1225
-rw-r--r--Master/texmf-dist/doc/man/man1/context.111
-rw-r--r--Master/texmf-dist/doc/man/man1/context.man1.pdfbin7613 -> 7742 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/latexdiff-vc.174
-rw-r--r--Master/texmf-dist/doc/man/man1/latexdiff-vc.man1.pdfbin8669 -> 10964 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/latexdiff.1153
-rw-r--r--Master/texmf-dist/doc/man/man1/latexdiff.man1.pdfbin34129 -> 37584 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/latexrevise.131
-rw-r--r--Master/texmf-dist/doc/man/man1/latexrevise.man1.pdfbin8935 -> 8976 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/luatools.12
-rw-r--r--Master/texmf-dist/doc/man/man1/luatools.man1.pdfbin5105 -> 5105 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-babel.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-babel.man1.pdfbin3673 -> 3672 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-base.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-base.man1.pdfbin5124 -> 5124 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-bibtex.130
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-bibtex.man1.pdfbin3493 -> 0 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-cache.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-cache.man1.pdfbin3708 -> 3707 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-chars.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-chars.man1.pdfbin3566 -> 3565 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-check.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-check.man1.pdfbin3581 -> 3554 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-colors.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-colors.man1.pdfbin3442 -> 3442 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-context.111
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-context.man1.pdfbin7613 -> 7742 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-epub.117
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-epub.man1.pdfbin3536 -> 3826 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-fcd.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-fcd.man1.pdfbin3960 -> 3959 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-flac.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-flac.man1.pdfbin3669 -> 3668 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-fonts.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-fonts.man1.pdfbin4207 -> 4213 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-grep.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-grep.man1.pdfbin3545 -> 3545 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-interface.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-interface.man1.pdfbin4105 -> 4105 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-metapost.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-metapost.man1.pdf24
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-metatex.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-metatex.man1.pdfbin3630 -> 3630 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-modules.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-modules.man1.pdfbin3761 -> 3754 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-package.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-package.man1.pdfbin3568 -> 3568 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-patterns.15
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-patterns.man1.pdfbin4084 -> 4137 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-pdf.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-pdf.man1.pdfbin3695 -> 3695 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-plain.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-plain.man1.pdfbin3711 -> 3709 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-profile.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-profile.man1.pdf56
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-rsync.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-rsync.man1.pdfbin3636 -> 3638 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-scite.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-scite.man1.pdfbin3752 -> 3752 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-server.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-server.man1.pdf24
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-texworks.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-texworks.man1.pdfbin3558 -> 3557 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-timing.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-timing.man1.pdfbin3679 -> 3679 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-tools.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-tools.man1.pdfbin3995 -> 3995 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-unzip.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-unzip.man1.pdfbin3597 -> 3597 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-update.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-update.man1.pdfbin5030 -> 5029 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-watch.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-watch.man1.pdfbin3868 -> 3867 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-youless.12
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-youless.man1.pdfbin3859 -> 3858 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtxrun.18
-rw-r--r--Master/texmf-dist/doc/man/man1/mtxrun.man1.pdfbin7032 -> 7216 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/texexec.12
-rw-r--r--Master/texmf-dist/doc/man/man1/texexec.man1.pdfbin4713 -> 4713 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/texmfstart.18
-rw-r--r--Master/texmf-dist/doc/man/man1/texmfstart.man1.pdfbin7032 -> 7216 bytes
-rw-r--r--Master/texmf-dist/fonts/map/pdftex/context/mkiv-base.map182
-rw-r--r--Master/texmf-dist/metapost/context/base/metafun.mpiv4
-rw-r--r--Master/texmf-dist/metapost/context/base/mp-bare.mpiv93
-rw-r--r--Master/texmf-dist/metapost/context/base/mp-base.mpiv13
-rw-r--r--Master/texmf-dist/metapost/context/base/mp-chem.mpiv34
-rw-r--r--Master/texmf-dist/metapost/context/base/mp-func.mpiv33
-rw-r--r--Master/texmf-dist/metapost/context/base/mp-grap.mpiv28
-rw-r--r--Master/texmf-dist/metapost/context/base/mp-luas.mpiv9
-rw-r--r--Master/texmf-dist/metapost/context/base/mp-mlib.mpiv566
-rw-r--r--Master/texmf-dist/metapost/context/base/mp-page.mpiv513
-rw-r--r--Master/texmf-dist/metapost/context/base/mp-tool.mpii2
-rw-r--r--Master/texmf-dist/metapost/context/base/mp-tool.mpiv192
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-bibtex.lua52
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-check.lua43
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-context.lua138
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-context.xml25
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-convert.lua2
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-epub.lua879
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-fcd.lua4
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-fonts.lua2
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-interface.lua8
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-metapost.lua60
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-patterns.lua47
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-server.lua25
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-update.lua2
-rwxr-xr-xMaster/texmf-dist/scripts/context/lua/mtxrun.lua3573
-rw-r--r--Master/texmf-dist/scripts/context/stubs/mswin/mtxrun.lua3573
-rwxr-xr-xMaster/texmf-dist/scripts/context/stubs/unix/mtxrun3573
-rw-r--r--Master/texmf-dist/scripts/context/stubs/win64/mtxrun.lua3573
-rw-r--r--Master/texmf-dist/tex/context/base/anch-bar.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/base/anch-bck.mkvi6
-rw-r--r--Master/texmf-dist/tex/context/base/anch-pgr.lua145
-rw-r--r--Master/texmf-dist/tex/context/base/anch-pgr.mkiv49
-rw-r--r--Master/texmf-dist/tex/context/base/anch-pos.lua361
-rw-r--r--Master/texmf-dist/tex/context/base/anch-pos.mkiv124
-rw-r--r--Master/texmf-dist/tex/context/base/anch-snc.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/base/anch-tab.mkiv8
-rw-r--r--Master/texmf-dist/tex/context/base/attr-col.lua57
-rw-r--r--Master/texmf-dist/tex/context/base/attr-eff.lua41
-rw-r--r--Master/texmf-dist/tex/context/base/attr-eff.mkiv12
-rw-r--r--Master/texmf-dist/tex/context/base/attr-ini.lua60
-rw-r--r--Master/texmf-dist/tex/context/base/attr-ini.mkiv35
-rw-r--r--Master/texmf-dist/tex/context/base/attr-lay.lua88
-rw-r--r--Master/texmf-dist/tex/context/base/attr-lay.mkiv36
-rw-r--r--Master/texmf-dist/tex/context/base/attr-neg.lua12
-rw-r--r--Master/texmf-dist/tex/context/base/attr-neg.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/back-exp.lua3944
-rw-r--r--Master/texmf-dist/tex/context/base/back-exp.mkiv157
-rw-r--r--Master/texmf-dist/tex/context/base/back-ini.lua17
-rw-r--r--Master/texmf-dist/tex/context/base/back-ini.mkiv8
-rw-r--r--Master/texmf-dist/tex/context/base/back-pdf.lua114
-rw-r--r--Master/texmf-dist/tex/context/base/back-pdf.mkiv272
-rw-r--r--Master/texmf-dist/tex/context/base/bibl-bib.mkiv24
-rw-r--r--Master/texmf-dist/tex/context/base/bibl-tra.mkii3
-rw-r--r--Master/texmf-dist/tex/context/base/bibl-tra.mkiv68
-rw-r--r--Master/texmf-dist/tex/context/base/blob-ini.lua21
-rw-r--r--Master/texmf-dist/tex/context/base/blob-ini.mkiv8
-rw-r--r--Master/texmf-dist/tex/context/base/buff-imp-default.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/buff-imp-lua.lua4
-rw-r--r--Master/texmf-dist/tex/context/base/buff-ini.lua301
-rw-r--r--Master/texmf-dist/tex/context/base/buff-ini.mkiv78
-rw-r--r--Master/texmf-dist/tex/context/base/buff-par.lua112
-rw-r--r--Master/texmf-dist/tex/context/base/buff-par.mkvi68
-rw-r--r--Master/texmf-dist/tex/context/base/buff-ver.lua133
-rw-r--r--Master/texmf-dist/tex/context/base/buff-ver.mkiv246
-rw-r--r--Master/texmf-dist/tex/context/base/bxml-apa.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/base/catc-act.mkiv6
-rw-r--r--Master/texmf-dist/tex/context/base/catc-ini.mkiv32
-rw-r--r--Master/texmf-dist/tex/context/base/catc-sym.mkiv8
-rw-r--r--Master/texmf-dist/tex/context/base/char-act.mkiv7
-rw-r--r--Master/texmf-dist/tex/context/base/char-def.lua44458
-rw-r--r--Master/texmf-dist/tex/context/base/char-enc.lua11
-rw-r--r--Master/texmf-dist/tex/context/base/char-ent.lua10
-rw-r--r--Master/texmf-dist/tex/context/base/char-fio.lua94
-rw-r--r--Master/texmf-dist/tex/context/base/char-ini.lua1017
-rw-r--r--Master/texmf-dist/tex/context/base/char-ini.mkiv50
-rw-r--r--Master/texmf-dist/tex/context/base/char-tex.lua654
-rw-r--r--Master/texmf-dist/tex/context/base/char-utf.lua746
-rw-r--r--Master/texmf-dist/tex/context/base/char-utf.mkiv17
-rw-r--r--Master/texmf-dist/tex/context/base/chem-ini.lua37
-rw-r--r--Master/texmf-dist/tex/context/base/chem-ini.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/chem-str.lua83
-rw-r--r--Master/texmf-dist/tex/context/base/chem-str.mkiv78
-rw-r--r--Master/texmf-dist/tex/context/base/cldf-bas.lua24
-rw-r--r--Master/texmf-dist/tex/context/base/cldf-ini.lua351
-rw-r--r--Master/texmf-dist/tex/context/base/cldf-prs.lua88
-rw-r--r--Master/texmf-dist/tex/context/base/cldf-scn.lua163
-rw-r--r--Master/texmf-dist/tex/context/base/colo-ext.mkiv18
-rw-r--r--Master/texmf-dist/tex/context/base/colo-grp.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/colo-imp-rgb.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/base/colo-ini.lua445
-rw-r--r--Master/texmf-dist/tex/context/base/colo-ini.mkiv151
-rw-r--r--Master/texmf-dist/tex/context/base/colo-run.mkiv8
-rw-r--r--Master/texmf-dist/tex/context/base/colo-xwi.mkii7
-rw-r--r--Master/texmf-dist/tex/context/base/cont-fil.mkii2
-rw-r--r--Master/texmf-dist/tex/context/base/cont-fil.mkiv1
-rw-r--r--Master/texmf-dist/tex/context/base/cont-log.mkiv141
-rw-r--r--Master/texmf-dist/tex/context/base/cont-new.mkiv57
-rw-r--r--Master/texmf-dist/tex/context/base/cont-run.lua252
-rw-r--r--Master/texmf-dist/tex/context/base/cont-run.mkiv20
-rw-r--r--Master/texmf-dist/tex/context/base/cont-yes.mkiv154
-rw-r--r--Master/texmf-dist/tex/context/base/context-version.pdfbin4275 -> 4187 bytes
-rw-r--r--Master/texmf-dist/tex/context/base/context.mkiv47
-rw-r--r--Master/texmf-dist/tex/context/base/core-con.lua284
-rw-r--r--Master/texmf-dist/tex/context/base/core-con.mkiv171
-rw-r--r--Master/texmf-dist/tex/context/base/core-ctx.lua76
-rw-r--r--Master/texmf-dist/tex/context/base/core-ctx.mkiv14
-rw-r--r--Master/texmf-dist/tex/context/base/core-dat.lua58
-rw-r--r--Master/texmf-dist/tex/context/base/core-dat.mkiv38
-rw-r--r--Master/texmf-dist/tex/context/base/core-def.mkiv12
-rw-r--r--Master/texmf-dist/tex/context/base/core-env.lua295
-rw-r--r--Master/texmf-dist/tex/context/base/core-env.mkiv211
-rw-r--r--Master/texmf-dist/tex/context/base/core-ini.mkiv3
-rw-r--r--Master/texmf-dist/tex/context/base/core-sys.lua60
-rw-r--r--Master/texmf-dist/tex/context/base/core-sys.mkiv72
-rw-r--r--Master/texmf-dist/tex/context/base/core-two.lua52
-rw-r--r--Master/texmf-dist/tex/context/base/core-two.mkiv27
-rw-r--r--Master/texmf-dist/tex/context/base/core-uti.lua74
-rw-r--r--Master/texmf-dist/tex/context/base/core-uti.mkiv18
-rw-r--r--Master/texmf-dist/tex/context/base/data-crl.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/data-env.lua19
-rw-r--r--Master/texmf-dist/tex/context/base/data-exp.lua355
-rw-r--r--Master/texmf-dist/tex/context/base/data-fil.lua28
-rw-r--r--Master/texmf-dist/tex/context/base/data-ini.lua150
-rw-r--r--Master/texmf-dist/tex/context/base/data-lst.lua26
-rw-r--r--Master/texmf-dist/tex/context/base/data-lua.lua23
-rw-r--r--Master/texmf-dist/tex/context/base/data-met.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/data-pre.lua234
-rw-r--r--Master/texmf-dist/tex/context/base/data-res.lua795
-rw-r--r--Master/texmf-dist/tex/context/base/data-sch.lua16
-rw-r--r--Master/texmf-dist/tex/context/base/data-tex.lua8
-rw-r--r--Master/texmf-dist/tex/context/base/data-tmf.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/data-tmp.lua23
-rw-r--r--Master/texmf-dist/tex/context/base/data-tre.lua222
-rw-r--r--Master/texmf-dist/tex/context/base/data-vir.lua10
-rw-r--r--Master/texmf-dist/tex/context/base/data-zip.lua62
-rw-r--r--Master/texmf-dist/tex/context/base/enco-ini.mkiv238
-rw-r--r--Master/texmf-dist/tex/context/base/export-example.css444
-rw-r--r--Master/texmf-dist/tex/context/base/export-example.tex4
-rw-r--r--Master/texmf-dist/tex/context/base/file-ini.lua45
-rw-r--r--Master/texmf-dist/tex/context/base/file-ini.mkvi30
-rw-r--r--Master/texmf-dist/tex/context/base/file-job.lua589
-rw-r--r--Master/texmf-dist/tex/context/base/file-job.mkvi171
-rw-r--r--Master/texmf-dist/tex/context/base/file-lib.lua65
-rw-r--r--Master/texmf-dist/tex/context/base/file-mod.lua89
-rw-r--r--Master/texmf-dist/tex/context/base/file-mod.mkvi60
-rw-r--r--Master/texmf-dist/tex/context/base/file-res.lua35
-rw-r--r--Master/texmf-dist/tex/context/base/file-res.mkvi8
-rw-r--r--Master/texmf-dist/tex/context/base/file-syn.lua35
-rw-r--r--Master/texmf-dist/tex/context/base/file-syn.mkvi6
-rw-r--r--Master/texmf-dist/tex/context/base/font-afm.lua89
-rw-r--r--Master/texmf-dist/tex/context/base/font-agl.lua12
-rw-r--r--Master/texmf-dist/tex/context/base/font-chk.lua100
-rw-r--r--Master/texmf-dist/tex/context/base/font-chk.mkiv8
-rw-r--r--Master/texmf-dist/tex/context/base/font-cid.lua25
-rw-r--r--Master/texmf-dist/tex/context/base/font-col.lua43
-rw-r--r--Master/texmf-dist/tex/context/base/font-col.mkvi12
-rw-r--r--Master/texmf-dist/tex/context/base/font-con.lua112
-rw-r--r--Master/texmf-dist/tex/context/base/font-ctx.lua777
-rw-r--r--Master/texmf-dist/tex/context/base/font-def.lua4
-rw-r--r--Master/texmf-dist/tex/context/base/font-enc.lua8
-rw-r--r--Master/texmf-dist/tex/context/base/font-enh.lua28
-rw-r--r--Master/texmf-dist/tex/context/base/font-ext.lua95
-rw-r--r--Master/texmf-dist/tex/context/base/font-fbk.lua41
-rw-r--r--Master/texmf-dist/tex/context/base/font-fea.mkvi36
-rw-r--r--Master/texmf-dist/tex/context/base/font-fil.mkvi100
-rw-r--r--Master/texmf-dist/tex/context/base/font-gds.lua30
-rw-r--r--Master/texmf-dist/tex/context/base/font-gds.mkvi4
-rw-r--r--Master/texmf-dist/tex/context/base/font-hsh.lua44
-rw-r--r--Master/texmf-dist/tex/context/base/font-ini.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/font-ini.mkvi194
-rw-r--r--Master/texmf-dist/tex/context/base/font-inj.lua1052
-rw-r--r--Master/texmf-dist/tex/context/base/font-lib.mkvi28
-rw-r--r--Master/texmf-dist/tex/context/base/font-map.lua305
-rw-r--r--Master/texmf-dist/tex/context/base/font-mis.lua14
-rw-r--r--Master/texmf-dist/tex/context/base/font-nod.lua169
-rw-r--r--Master/texmf-dist/tex/context/base/font-odv.lua19
-rw-r--r--Master/texmf-dist/tex/context/base/font-ota.lua430
-rw-r--r--Master/texmf-dist/tex/context/base/font-otb.lua111
-rw-r--r--Master/texmf-dist/tex/context/base/font-otf.lua545
-rw-r--r--Master/texmf-dist/tex/context/base/font-otn.lua1164
-rw-r--r--Master/texmf-dist/tex/context/base/font-otp.lua49
-rw-r--r--Master/texmf-dist/tex/context/base/font-ott.lua9
-rw-r--r--Master/texmf-dist/tex/context/base/font-otx.lua419
-rw-r--r--Master/texmf-dist/tex/context/base/font-pre.mkiv76
-rw-r--r--Master/texmf-dist/tex/context/base/font-run.mkiv8
-rw-r--r--Master/texmf-dist/tex/context/base/font-sel.lua102
-rw-r--r--Master/texmf-dist/tex/context/base/font-sel.mkvi185
-rw-r--r--Master/texmf-dist/tex/context/base/font-set.mkvi23
-rw-r--r--Master/texmf-dist/tex/context/base/font-sol.lua56
-rw-r--r--Master/texmf-dist/tex/context/base/font-sol.mkvi32
-rw-r--r--Master/texmf-dist/tex/context/base/font-sty.mkvi4
-rw-r--r--Master/texmf-dist/tex/context/base/font-sym.mkvi18
-rw-r--r--Master/texmf-dist/tex/context/base/font-syn.lua101
-rw-r--r--Master/texmf-dist/tex/context/base/font-tfm.lua12
-rw-r--r--Master/texmf-dist/tex/context/base/font-tra.mkiv17
-rw-r--r--Master/texmf-dist/tex/context/base/font-uni.mkiv10
-rw-r--r--Master/texmf-dist/tex/context/base/grph-epd.lua9
-rw-r--r--Master/texmf-dist/tex/context/base/grph-epd.mkiv6
-rw-r--r--Master/texmf-dist/tex/context/base/grph-fig.mkiv6
-rw-r--r--Master/texmf-dist/tex/context/base/grph-fil.lua6
-rw-r--r--Master/texmf-dist/tex/context/base/grph-inc.lua717
-rw-r--r--Master/texmf-dist/tex/context/base/grph-inc.mkiv182
-rw-r--r--Master/texmf-dist/tex/context/base/grph-raw.lua15
-rw-r--r--Master/texmf-dist/tex/context/base/grph-raw.mkiv16
-rw-r--r--Master/texmf-dist/tex/context/base/grph-trf.mkiv16
-rw-r--r--Master/texmf-dist/tex/context/base/hand-ini.mkiv12
-rw-r--r--Master/texmf-dist/tex/context/base/java-imp-fld.mkiv33
-rw-r--r--Master/texmf-dist/tex/context/base/java-ini.lua52
-rw-r--r--Master/texmf-dist/tex/context/base/java-ini.mkiv20
-rw-r--r--Master/texmf-dist/tex/context/base/l-boolean.lua6
-rw-r--r--Master/texmf-dist/tex/context/base/l-dir.lua398
-rw-r--r--Master/texmf-dist/tex/context/base/l-file.lua193
-rw-r--r--Master/texmf-dist/tex/context/base/l-io.lua5
-rw-r--r--Master/texmf-dist/tex/context/base/l-lpeg.lua250
-rw-r--r--Master/texmf-dist/tex/context/base/l-lua.lua11
-rw-r--r--Master/texmf-dist/tex/context/base/l-math.lua4
-rw-r--r--Master/texmf-dist/tex/context/base/l-md5.lua64
-rw-r--r--Master/texmf-dist/tex/context/base/l-os.lua14
-rw-r--r--Master/texmf-dist/tex/context/base/l-sandbox.lua271
-rw-r--r--Master/texmf-dist/tex/context/base/l-string.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/l-table.lua135
-rw-r--r--Master/texmf-dist/tex/context/base/l-unicode.lua689
-rw-r--r--Master/texmf-dist/tex/context/base/l-url.lua68
-rw-r--r--Master/texmf-dist/tex/context/base/lang-def.mkiv34
-rw-r--r--Master/texmf-dist/tex/context/base/lang-dis.lua203
-rw-r--r--Master/texmf-dist/tex/context/base/lang-hyp.lua1648
-rw-r--r--Master/texmf-dist/tex/context/base/lang-hyp.mkiv267
-rw-r--r--Master/texmf-dist/tex/context/base/lang-ini.lua121
-rw-r--r--Master/texmf-dist/tex/context/base/lang-ini.mkiv138
-rw-r--r--Master/texmf-dist/tex/context/base/lang-lab.lua49
-rw-r--r--Master/texmf-dist/tex/context/base/lang-lab.mkiv49
-rw-r--r--Master/texmf-dist/tex/context/base/lang-mis.mkiv229
-rw-r--r--Master/texmf-dist/tex/context/base/lang-rep.lua21
-rw-r--r--Master/texmf-dist/tex/context/base/lang-rep.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/base/lang-txt.lua222
-rw-r--r--Master/texmf-dist/tex/context/base/lang-url.lua93
-rw-r--r--Master/texmf-dist/tex/context/base/lang-url.mkiv73
-rw-r--r--Master/texmf-dist/tex/context/base/lang-wrd.lua29
-rw-r--r--Master/texmf-dist/tex/context/base/lang-wrd.mkiv9
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-ano.lua195
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-col.lua41
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-epa.lua240
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-epd.lua809
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-fld.lua8
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-fmt.lua12
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-grp.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-ini.lua589
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-mis.lua96
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-pda.xml9
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-pdx.xml8
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-ren.lua36
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-tag.lua422
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-xmp.lua18
-rw-r--r--Master/texmf-dist/tex/context/base/luat-bas.mkiv3
-rw-r--r--Master/texmf-dist/tex/context/base/luat-cnf.lua72
-rw-r--r--Master/texmf-dist/tex/context/base/luat-cod.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/luat-exe.lua143
-rw-r--r--Master/texmf-dist/tex/context/base/luat-fmt.lua4
-rw-r--r--Master/texmf-dist/tex/context/base/luat-ini.lua186
-rw-r--r--Master/texmf-dist/tex/context/base/luat-ini.mkiv175
-rw-r--r--Master/texmf-dist/tex/context/base/luat-iop.lua203
-rw-r--r--Master/texmf-dist/tex/context/base/luat-lib.mkiv6
-rw-r--r--Master/texmf-dist/tex/context/base/luat-mac.lua11
-rw-r--r--Master/texmf-dist/tex/context/base/luat-run.lua31
-rw-r--r--Master/texmf-dist/tex/context/base/luat-usr.lua192
-rw-r--r--Master/texmf-dist/tex/context/base/luat-usr.mkiv126
-rw-r--r--Master/texmf-dist/tex/context/base/lxml-aux.lua314
-rw-r--r--Master/texmf-dist/tex/context/base/lxml-css.lua14
-rw-r--r--Master/texmf-dist/tex/context/base/lxml-ini.lua136
-rw-r--r--Master/texmf-dist/tex/context/base/lxml-ini.mkiv337
-rw-r--r--Master/texmf-dist/tex/context/base/lxml-lpt.lua19
-rw-r--r--Master/texmf-dist/tex/context/base/lxml-sor.mkiv5
-rw-r--r--Master/texmf-dist/tex/context/base/lxml-tab.lua64
-rw-r--r--Master/texmf-dist/tex/context/base/lxml-tex.lua407
-rw-r--r--Master/texmf-dist/tex/context/base/m-chart.lua89
-rw-r--r--Master/texmf-dist/tex/context/base/m-chart.mkvi10
-rw-r--r--Master/texmf-dist/tex/context/base/m-hemistich.mkiv10
-rw-r--r--Master/texmf-dist/tex/context/base/m-matrix.mkiv495
-rw-r--r--Master/texmf-dist/tex/context/base/m-morse.mkvi273
-rw-r--r--Master/texmf-dist/tex/context/base/m-oldfun.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/m-oldnum.mkiv32
-rw-r--r--Master/texmf-dist/tex/context/base/m-scite.mkiv6
-rw-r--r--Master/texmf-dist/tex/context/base/m-spreadsheet.mkiv6
-rw-r--r--Master/texmf-dist/tex/context/base/m-steps.lua21
-rw-r--r--Master/texmf-dist/tex/context/base/m-steps.mkvi2
-rw-r--r--Master/texmf-dist/tex/context/base/m-translate.mkiv31
-rw-r--r--Master/texmf-dist/tex/context/base/m-visual.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/base/math-act.lua136
-rw-r--r--Master/texmf-dist/tex/context/base/math-ali.mkiv54
-rw-r--r--Master/texmf-dist/tex/context/base/math-arr.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/math-def.mkiv3
-rw-r--r--Master/texmf-dist/tex/context/base/math-dir.lua7
-rw-r--r--Master/texmf-dist/tex/context/base/math-fbk.lua74
-rw-r--r--Master/texmf-dist/tex/context/base/math-frc.lua18
-rw-r--r--Master/texmf-dist/tex/context/base/math-frc.mkiv230
-rw-r--r--Master/texmf-dist/tex/context/base/math-ini.lua160
-rw-r--r--Master/texmf-dist/tex/context/base/math-ini.mkiv334
-rw-r--r--Master/texmf-dist/tex/context/base/math-int.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/math-map.lua43
-rw-r--r--Master/texmf-dist/tex/context/base/math-noa.lua454
-rw-r--r--Master/texmf-dist/tex/context/base/math-rad.mkvi30
-rw-r--r--Master/texmf-dist/tex/context/base/math-ren.lua8
-rw-r--r--Master/texmf-dist/tex/context/base/math-stc.mkvi441
-rw-r--r--Master/texmf-dist/tex/context/base/math-tag.lua610
-rw-r--r--Master/texmf-dist/tex/context/base/math-vfu.lua46
-rw-r--r--Master/texmf-dist/tex/context/base/meta-fig.mkiv5
-rw-r--r--Master/texmf-dist/tex/context/base/meta-fnt.lua43
-rw-r--r--Master/texmf-dist/tex/context/base/meta-fnt.mkiv8
-rw-r--r--Master/texmf-dist/tex/context/base/meta-fun.lua4
-rw-r--r--Master/texmf-dist/tex/context/base/meta-imp-dum.mkiv3
-rw-r--r--Master/texmf-dist/tex/context/base/meta-imp-tab.mkiv73
-rw-r--r--Master/texmf-dist/tex/context/base/meta-imp-txt.mkiv9
-rw-r--r--Master/texmf-dist/tex/context/base/meta-ini.lua28
-rw-r--r--Master/texmf-dist/tex/context/base/meta-ini.mkiv330
-rw-r--r--Master/texmf-dist/tex/context/base/meta-pag.mkiv126
-rw-r--r--Master/texmf-dist/tex/context/base/meta-pdf.lua13
-rw-r--r--Master/texmf-dist/tex/context/base/meta-pdf.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/meta-pdh.mkiv10
-rw-r--r--Master/texmf-dist/tex/context/base/meta-tex.lua47
-rw-r--r--Master/texmf-dist/tex/context/base/meta-tex.mkiv14
-rw-r--r--Master/texmf-dist/tex/context/base/mlib-ctx.lua226
-rw-r--r--Master/texmf-dist/tex/context/base/mlib-ctx.mkiv1
-rw-r--r--Master/texmf-dist/tex/context/base/mlib-int.lua149
-rw-r--r--Master/texmf-dist/tex/context/base/mlib-lua.lua203
-rw-r--r--Master/texmf-dist/tex/context/base/mlib-pdf.lua295
-rw-r--r--Master/texmf-dist/tex/context/base/mlib-pdf.mkiv59
-rw-r--r--Master/texmf-dist/tex/context/base/mlib-pps.lua471
-rw-r--r--Master/texmf-dist/tex/context/base/mlib-pps.mkiv35
-rw-r--r--Master/texmf-dist/tex/context/base/mlib-run.lua399
-rw-r--r--Master/texmf-dist/tex/context/base/mtx-context-arrange.tex25
-rw-r--r--Master/texmf-dist/tex/context/base/mtx-context-listing.tex9
-rw-r--r--Master/texmf-dist/tex/context/base/mtx-context-precache.tex161
-rw-r--r--Master/texmf-dist/tex/context/base/mult-aux.lua12
-rw-r--r--Master/texmf-dist/tex/context/base/mult-aux.mkiv163
-rw-r--r--Master/texmf-dist/tex/context/base/mult-chk.lua21
-rw-r--r--Master/texmf-dist/tex/context/base/mult-chk.mkiv7
-rw-r--r--Master/texmf-dist/tex/context/base/mult-de.mkii21
-rw-r--r--Master/texmf-dist/tex/context/base/mult-def.lua107
-rw-r--r--Master/texmf-dist/tex/context/base/mult-def.mkiv187
-rw-r--r--Master/texmf-dist/tex/context/base/mult-en.mkii19
-rw-r--r--Master/texmf-dist/tex/context/base/mult-fr.mkii23
-rw-r--r--Master/texmf-dist/tex/context/base/mult-fun.lua93
-rw-r--r--Master/texmf-dist/tex/context/base/mult-ini.lua62
-rw-r--r--Master/texmf-dist/tex/context/base/mult-ini.mkiv24
-rw-r--r--Master/texmf-dist/tex/context/base/mult-it.mkii23
-rw-r--r--Master/texmf-dist/tex/context/base/mult-low.lua83
-rw-r--r--Master/texmf-dist/tex/context/base/mult-mes.lua9
-rw-r--r--Master/texmf-dist/tex/context/base/mult-mps.lua67
-rw-r--r--Master/texmf-dist/tex/context/base/mult-nl.mkii29
-rw-r--r--Master/texmf-dist/tex/context/base/mult-pe.mkii23
-rw-r--r--Master/texmf-dist/tex/context/base/mult-prm.lua5
-rw-r--r--Master/texmf-dist/tex/context/base/mult-ro.mkii21
-rw-r--r--Master/texmf-dist/tex/context/base/mult-sys.mkiv56
-rw-r--r--Master/texmf-dist/tex/context/base/node-aux.lua19
-rw-r--r--Master/texmf-dist/tex/context/base/node-bck.lua18
-rw-r--r--Master/texmf-dist/tex/context/base/node-bck.mkiv14
-rw-r--r--Master/texmf-dist/tex/context/base/node-fin.lua51
-rw-r--r--Master/texmf-dist/tex/context/base/node-fin.mkiv10
-rw-r--r--Master/texmf-dist/tex/context/base/node-fnt.lua212
-rw-r--r--Master/texmf-dist/tex/context/base/node-ini.lua8
-rw-r--r--Master/texmf-dist/tex/context/base/node-ini.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/node-inj.lua33
-rw-r--r--Master/texmf-dist/tex/context/base/node-ltp.lua17
-rw-r--r--Master/texmf-dist/tex/context/base/node-nut.lua56
-rw-r--r--Master/texmf-dist/tex/context/base/node-pro.lua6
-rw-r--r--Master/texmf-dist/tex/context/base/node-ref.lua373
-rw-r--r--Master/texmf-dist/tex/context/base/node-res.lua12
-rw-r--r--Master/texmf-dist/tex/context/base/node-rul.lua49
-rw-r--r--Master/texmf-dist/tex/context/base/node-rul.mkiv88
-rw-r--r--Master/texmf-dist/tex/context/base/node-shp.lua144
-rw-r--r--Master/texmf-dist/tex/context/base/node-tex.lua27
-rw-r--r--Master/texmf-dist/tex/context/base/node-tra.lua239
-rw-r--r--Master/texmf-dist/tex/context/base/node-tsk.lua8
-rw-r--r--Master/texmf-dist/tex/context/base/pack-bck.mkvi9
-rw-r--r--Master/texmf-dist/tex/context/base/pack-box.mkiv115
-rw-r--r--Master/texmf-dist/tex/context/base/pack-com.mkiv28
-rw-r--r--Master/texmf-dist/tex/context/base/pack-fen.mkiv18
-rw-r--r--Master/texmf-dist/tex/context/base/pack-lyr.mkiv33
-rw-r--r--Master/texmf-dist/tex/context/base/pack-mis.mkvi3
-rw-r--r--Master/texmf-dist/tex/context/base/pack-mrl.mkiv14
-rw-r--r--Master/texmf-dist/tex/context/base/pack-obj.lua67
-rw-r--r--Master/texmf-dist/tex/context/base/pack-obj.mkiv15
-rw-r--r--Master/texmf-dist/tex/context/base/pack-pos.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/pack-rul.lua18
-rw-r--r--Master/texmf-dist/tex/context/base/pack-rul.mkiv277
-rw-r--r--Master/texmf-dist/tex/context/base/page-app.mkiv3
-rw-r--r--Master/texmf-dist/tex/context/base/page-bck.mkiv56
-rw-r--r--Master/texmf-dist/tex/context/base/page-brk.mkiv16
-rw-r--r--Master/texmf-dist/tex/context/base/page-flt.lua128
-rw-r--r--Master/texmf-dist/tex/context/base/page-flt.mkiv30
-rw-r--r--Master/texmf-dist/tex/context/base/page-flw.mkiv7
-rw-r--r--Master/texmf-dist/tex/context/base/page-imp.mkiv14
-rw-r--r--Master/texmf-dist/tex/context/base/page-ini.mkiv13
-rw-r--r--Master/texmf-dist/tex/context/base/page-inj.lua29
-rw-r--r--Master/texmf-dist/tex/context/base/page-inj.mkvi20
-rw-r--r--Master/texmf-dist/tex/context/base/page-ins.lua54
-rw-r--r--Master/texmf-dist/tex/context/base/page-ins.mkiv22
-rw-r--r--Master/texmf-dist/tex/context/base/page-lay.mkiv61
-rw-r--r--Master/texmf-dist/tex/context/base/page-lin.lua46
-rw-r--r--Master/texmf-dist/tex/context/base/page-lin.mkvi76
-rw-r--r--Master/texmf-dist/tex/context/base/page-mak.mkvi5
-rw-r--r--Master/texmf-dist/tex/context/base/page-mbk.mkvi2
-rw-r--r--Master/texmf-dist/tex/context/base/page-mix.lua229
-rw-r--r--Master/texmf-dist/tex/context/base/page-mix.mkiv149
-rw-r--r--Master/texmf-dist/tex/context/base/page-mul.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/page-one.mkiv15
-rw-r--r--Master/texmf-dist/tex/context/base/page-pst.lua41
-rw-r--r--Master/texmf-dist/tex/context/base/page-pst.mkiv7
-rw-r--r--Master/texmf-dist/tex/context/base/page-run.mkiv14
-rw-r--r--Master/texmf-dist/tex/context/base/page-sel.mkvi2
-rw-r--r--Master/texmf-dist/tex/context/base/page-set.mkiv12
-rw-r--r--Master/texmf-dist/tex/context/base/page-sid.mkiv101
-rw-r--r--Master/texmf-dist/tex/context/base/page-str.lua56
-rw-r--r--Master/texmf-dist/tex/context/base/page-str.mkiv26
-rw-r--r--Master/texmf-dist/tex/context/base/page-txt.mkvi19
-rw-r--r--Master/texmf-dist/tex/context/base/phys-dim.lua58
-rw-r--r--Master/texmf-dist/tex/context/base/phys-dim.mkiv19
-rw-r--r--Master/texmf-dist/tex/context/base/ppchtex.mkiv38
-rw-r--r--Master/texmf-dist/tex/context/base/publ-aut.lua739
-rw-r--r--Master/texmf-dist/tex/context/base/publ-dat.lua1347
-rw-r--r--Master/texmf-dist/tex/context/base/publ-fnd.lua411
-rw-r--r--Master/texmf-dist/tex/context/base/publ-imp-apa.lua521
-rw-r--r--Master/texmf-dist/tex/context/base/publ-imp-apa.mkiv547
-rw-r--r--Master/texmf-dist/tex/context/base/publ-imp-apa.mkvi1473
-rw-r--r--Master/texmf-dist/tex/context/base/publ-imp-aps.lua479
-rw-r--r--Master/texmf-dist/tex/context/base/publ-imp-aps.mkvi1156
-rw-r--r--Master/texmf-dist/tex/context/base/publ-imp-author.mkvi303
-rw-r--r--Master/texmf-dist/tex/context/base/publ-imp-cite.mkiv256
-rw-r--r--Master/texmf-dist/tex/context/base/publ-imp-cite.mkvi314
-rw-r--r--Master/texmf-dist/tex/context/base/publ-imp-commands.mkvi (renamed from Master/texmf-dist/tex/context/base/publ-imp-commands.mkiv)0
-rw-r--r--Master/texmf-dist/tex/context/base/publ-imp-default.lua124
-rw-r--r--Master/texmf-dist/tex/context/base/publ-imp-default.mkvi594
-rw-r--r--Master/texmf-dist/tex/context/base/publ-imp-definitions.mkvi (renamed from Master/texmf-dist/tex/context/base/publ-imp-definitions.mkiv)59
-rw-r--r--Master/texmf-dist/tex/context/base/publ-imp-list.mkvi90
-rw-r--r--Master/texmf-dist/tex/context/base/publ-imp-page.mkvi78
-rw-r--r--Master/texmf-dist/tex/context/base/publ-imp-replacements.lua13
-rw-r--r--Master/texmf-dist/tex/context/base/publ-imp-test.bib294
-rw-r--r--Master/texmf-dist/tex/context/base/publ-ini.lua4185
-rw-r--r--Master/texmf-dist/tex/context/base/publ-ini.mkiv1963
-rw-r--r--Master/texmf-dist/tex/context/base/publ-jrn.lua188
-rw-r--r--Master/texmf-dist/tex/context/base/publ-oth.lua16
-rw-r--r--Master/texmf-dist/tex/context/base/publ-reg.lua177
-rw-r--r--Master/texmf-dist/tex/context/base/publ-sor.lua276
-rw-r--r--Master/texmf-dist/tex/context/base/publ-tra.lua670
-rw-r--r--Master/texmf-dist/tex/context/base/publ-tra.mkiv70
-rw-r--r--Master/texmf-dist/tex/context/base/publ-usr.lua131
-rw-r--r--Master/texmf-dist/tex/context/base/publ-xml.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/regi-ini.lua234
-rw-r--r--Master/texmf-dist/tex/context/base/regi-ini.mkiv32
-rw-r--r--Master/texmf-dist/tex/context/base/regi-pdfdoc.lua26
-rw-r--r--Master/texmf-dist/tex/context/base/s-abr-01.tex6
-rw-r--r--Master/texmf-dist/tex/context/base/s-art-01.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/base/s-figures-names.mkiv99
-rw-r--r--Master/texmf-dist/tex/context/base/s-fnt-10.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/base/s-fnt-21.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/s-fonts-coverage.lua14
-rw-r--r--Master/texmf-dist/tex/context/base/s-fonts-ligatures.mkiv292
-rw-r--r--Master/texmf-dist/tex/context/base/s-fonts-shapes.lua89
-rw-r--r--Master/texmf-dist/tex/context/base/s-fonts-tables.lua9
-rw-r--r--Master/texmf-dist/tex/context/base/s-inf-01.mkvi12
-rw-r--r--Master/texmf-dist/tex/context/base/s-inf-03.mkiv21
-rw-r--r--Master/texmf-dist/tex/context/base/s-languages-hyphenation.lua16
-rw-r--r--Master/texmf-dist/tex/context/base/s-languages-hyphenation.mkiv6
-rw-r--r--Master/texmf-dist/tex/context/base/s-languages-system.lua63
-rw-r--r--Master/texmf-dist/tex/context/base/s-languages-system.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/s-languages-words.lua32
-rw-r--r--Master/texmf-dist/tex/context/base/s-languages-words.mkiv22
-rw-r--r--Master/texmf-dist/tex/context/base/s-map-10.mkiv16
-rw-r--r--Master/texmf-dist/tex/context/base/s-math-characters.lua286
-rw-r--r--Master/texmf-dist/tex/context/base/s-math-characters.mkiv15
-rw-r--r--Master/texmf-dist/tex/context/base/s-math-coverage.lua121
-rw-r--r--Master/texmf-dist/tex/context/base/s-math-coverage.mkiv10
-rw-r--r--Master/texmf-dist/tex/context/base/s-math-repertoire.mkiv56
-rw-r--r--Master/texmf-dist/tex/context/base/s-pre-17.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/s-references-show.mkiv132
-rw-r--r--Master/texmf-dist/tex/context/base/s-structure-sections.mkiv80
-rw-r--r--Master/texmf-dist/tex/context/base/s-syntax.mkii (renamed from Master/texmf-dist/tex/context/base/s-syn-01.tex)2
-rw-r--r--Master/texmf-dist/tex/context/base/s-syntax.mkiv96
-rw-r--r--Master/texmf-dist/tex/context/base/s-typesetting-kerning.mkiv209
-rw-r--r--Master/texmf-dist/tex/context/base/s-youless.mkiv11
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-bar.mkvi2
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-but.lua10
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-but.mkvi30
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-fld.lua163
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-fld.mkvi139
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-hlp.lua123
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-hlp.mkvi18
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-ini.lua19
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-ini.mkvi18
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-pag.lua37
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-pag.mkvi77
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-ref.lua18
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-ref.mkvi14
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-wid.lua211
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-wid.mkvi195
-rw-r--r--Master/texmf-dist/tex/context/base/scrp-ini.lua28
-rw-r--r--Master/texmf-dist/tex/context/base/scrp-ini.mkiv8
-rw-r--r--Master/texmf-dist/tex/context/base/sort-ini.lua220
-rw-r--r--Master/texmf-dist/tex/context/base/spac-adj.lua8
-rw-r--r--Master/texmf-dist/tex/context/base/spac-adj.mkiv7
-rw-r--r--Master/texmf-dist/tex/context/base/spac-ali.lua6
-rw-r--r--Master/texmf-dist/tex/context/base/spac-ali.mkiv16
-rw-r--r--Master/texmf-dist/tex/context/base/spac-chr.lua26
-rw-r--r--Master/texmf-dist/tex/context/base/spac-chr.mkiv1
-rw-r--r--Master/texmf-dist/tex/context/base/spac-hor.lua23
-rw-r--r--Master/texmf-dist/tex/context/base/spac-hor.mkiv55
-rw-r--r--Master/texmf-dist/tex/context/base/spac-lin.mkiv10
-rw-r--r--Master/texmf-dist/tex/context/base/spac-pag.mkiv11
-rw-r--r--Master/texmf-dist/tex/context/base/spac-par.mkiv3
-rw-r--r--Master/texmf-dist/tex/context/base/spac-ver.lua359
-rw-r--r--Master/texmf-dist/tex/context/base/spac-ver.mkiv135
-rw-r--r--Master/texmf-dist/tex/context/base/status-files.pdfbin24584 -> 24437 bytes
-rw-r--r--Master/texmf-dist/tex/context/base/status-lua.pdfbin244257 -> 250375 bytes
-rw-r--r--Master/texmf-dist/tex/context/base/status-mkiv.lua68
-rw-r--r--Master/texmf-dist/tex/context/base/strc-bkm.lua425
-rw-r--r--Master/texmf-dist/tex/context/base/strc-bkm.mkiv68
-rw-r--r--Master/texmf-dist/tex/context/base/strc-blk.lua31
-rw-r--r--Master/texmf-dist/tex/context/base/strc-blk.mkiv12
-rw-r--r--Master/texmf-dist/tex/context/base/strc-con.mkvi144
-rw-r--r--Master/texmf-dist/tex/context/base/strc-def.mkiv20
-rw-r--r--Master/texmf-dist/tex/context/base/strc-des.mkvi15
-rw-r--r--Master/texmf-dist/tex/context/base/strc-doc.lua315
-rw-r--r--Master/texmf-dist/tex/context/base/strc-doc.mkiv9
-rw-r--r--Master/texmf-dist/tex/context/base/strc-enu.mkvi11
-rw-r--r--Master/texmf-dist/tex/context/base/strc-flt.mkvi228
-rw-r--r--Master/texmf-dist/tex/context/base/strc-ini.lua13
-rw-r--r--Master/texmf-dist/tex/context/base/strc-ini.mkvi10
-rw-r--r--Master/texmf-dist/tex/context/base/strc-itm.lua75
-rw-r--r--Master/texmf-dist/tex/context/base/strc-itm.mkvi175
-rw-r--r--Master/texmf-dist/tex/context/base/strc-lab.mkiv3
-rw-r--r--Master/texmf-dist/tex/context/base/strc-lev.lua43
-rw-r--r--Master/texmf-dist/tex/context/base/strc-lev.mkvi12
-rw-r--r--Master/texmf-dist/tex/context/base/strc-lnt.mkvi8
-rw-r--r--Master/texmf-dist/tex/context/base/strc-lst.lua971
-rw-r--r--Master/texmf-dist/tex/context/base/strc-lst.mkvi379
-rw-r--r--Master/texmf-dist/tex/context/base/strc-mar.lua40
-rw-r--r--Master/texmf-dist/tex/context/base/strc-mar.mkiv38
-rw-r--r--Master/texmf-dist/tex/context/base/strc-mat.lua48
-rw-r--r--Master/texmf-dist/tex/context/base/strc-mat.mkiv10
-rw-r--r--Master/texmf-dist/tex/context/base/strc-not.lua108
-rw-r--r--Master/texmf-dist/tex/context/base/strc-not.mkvi101
-rw-r--r--Master/texmf-dist/tex/context/base/strc-num.lua126
-rw-r--r--Master/texmf-dist/tex/context/base/strc-num.mkiv466
-rw-r--r--Master/texmf-dist/tex/context/base/strc-pag.lua82
-rw-r--r--Master/texmf-dist/tex/context/base/strc-pag.mkiv46
-rw-r--r--Master/texmf-dist/tex/context/base/strc-ref.lua866
-rw-r--r--Master/texmf-dist/tex/context/base/strc-ref.mkvi639
-rw-r--r--Master/texmf-dist/tex/context/base/strc-reg.lua436
-rw-r--r--Master/texmf-dist/tex/context/base/strc-reg.mkiv331
-rw-r--r--Master/texmf-dist/tex/context/base/strc-ren.mkiv40
-rw-r--r--Master/texmf-dist/tex/context/base/strc-rsc.lua47
-rw-r--r--Master/texmf-dist/tex/context/base/strc-sbe.mkiv12
-rw-r--r--Master/texmf-dist/tex/context/base/strc-sec.mkiv222
-rw-r--r--Master/texmf-dist/tex/context/base/strc-syn.lua277
-rw-r--r--Master/texmf-dist/tex/context/base/strc-syn.mkiv342
-rw-r--r--Master/texmf-dist/tex/context/base/strc-tag.lua633
-rw-r--r--Master/texmf-dist/tex/context/base/strc-tag.mkiv439
-rw-r--r--Master/texmf-dist/tex/context/base/supp-box.lua280
-rw-r--r--Master/texmf-dist/tex/context/base/supp-box.mkiv141
-rw-r--r--Master/texmf-dist/tex/context/base/supp-ran.lua42
-rw-r--r--Master/texmf-dist/tex/context/base/supp-ran.mkiv20
-rw-r--r--Master/texmf-dist/tex/context/base/symb-imp-cc.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/base/symb-ini.lua29
-rw-r--r--Master/texmf-dist/tex/context/base/symb-ini.mkiv13
-rw-r--r--Master/texmf-dist/tex/context/base/syst-aux.lua201
-rw-r--r--Master/texmf-dist/tex/context/base/syst-aux.mkiv492
-rw-r--r--Master/texmf-dist/tex/context/base/syst-con.lua86
-rw-r--r--Master/texmf-dist/tex/context/base/syst-con.mkiv37
-rw-r--r--Master/texmf-dist/tex/context/base/syst-ini.mkiv62
-rw-r--r--Master/texmf-dist/tex/context/base/syst-lua.lua151
-rw-r--r--Master/texmf-dist/tex/context/base/syst-lua.mkiv62
-rw-r--r--Master/texmf-dist/tex/context/base/syst-rtp.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/tabl-ltb.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/base/tabl-ntb.mkii29
-rw-r--r--Master/texmf-dist/tex/context/base/tabl-ntb.mkiv644
-rw-r--r--Master/texmf-dist/tex/context/base/tabl-tab.mkiv15
-rw-r--r--Master/texmf-dist/tex/context/base/tabl-tbl.lua9
-rw-r--r--Master/texmf-dist/tex/context/base/tabl-tbl.mkiv107
-rw-r--r--Master/texmf-dist/tex/context/base/tabl-tsp.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/tabl-xtb.lua470
-rw-r--r--Master/texmf-dist/tex/context/base/tabl-xtb.mkvi167
-rw-r--r--Master/texmf-dist/tex/context/base/task-ini.lua38
-rw-r--r--Master/texmf-dist/tex/context/base/toks-ini.lua524
-rw-r--r--Master/texmf-dist/tex/context/base/toks-ini.mkiv52
-rw-r--r--Master/texmf-dist/tex/context/base/toks-map.lua70
-rw-r--r--Master/texmf-dist/tex/context/base/toks-map.mkiv63
-rw-r--r--Master/texmf-dist/tex/context/base/toks-scn.lua437
-rw-r--r--Master/texmf-dist/tex/context/base/toks-tra.lua298
-rw-r--r--Master/texmf-dist/tex/context/base/toks-tra.mkiv31
-rw-r--r--Master/texmf-dist/tex/context/base/trac-ctx.lua42
-rw-r--r--Master/texmf-dist/tex/context/base/trac-ctx.mkiv8
-rw-r--r--Master/texmf-dist/tex/context/base/trac-deb.lua19
-rw-r--r--Master/texmf-dist/tex/context/base/trac-deb.mkiv34
-rw-r--r--Master/texmf-dist/tex/context/base/trac-inf.lua14
-rw-r--r--Master/texmf-dist/tex/context/base/trac-jus.lua9
-rw-r--r--Master/texmf-dist/tex/context/base/trac-jus.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/trac-lmx.lua9
-rw-r--r--Master/texmf-dist/tex/context/base/trac-log.lua377
-rw-r--r--Master/texmf-dist/tex/context/base/trac-set.lua5
-rw-r--r--Master/texmf-dist/tex/context/base/trac-tex.lua77
-rw-r--r--Master/texmf-dist/tex/context/base/trac-vis.lua68
-rw-r--r--Master/texmf-dist/tex/context/base/trac-vis.mkiv30
-rw-r--r--Master/texmf-dist/tex/context/base/type-imp-dejavu.mkiv63
-rw-r--r--Master/texmf-dist/tex/context/base/type-ini.lua121
-rw-r--r--Master/texmf-dist/tex/context/base/type-ini.mkvi28
-rw-r--r--Master/texmf-dist/tex/context/base/type-run.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/base/typo-bld.lua27
-rw-r--r--Master/texmf-dist/tex/context/base/typo-bld.mkiv14
-rw-r--r--Master/texmf-dist/tex/context/base/typo-brk.lua46
-rw-r--r--Master/texmf-dist/tex/context/base/typo-brk.mkiv28
-rw-r--r--Master/texmf-dist/tex/context/base/typo-cap.lua348
-rw-r--r--Master/texmf-dist/tex/context/base/typo-cap.mkiv11
-rw-r--r--Master/texmf-dist/tex/context/base/typo-chr.lua155
-rw-r--r--Master/texmf-dist/tex/context/base/typo-chr.mkiv28
-rw-r--r--Master/texmf-dist/tex/context/base/typo-cln.lua6
-rw-r--r--Master/texmf-dist/tex/context/base/typo-cln.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/typo-del.mkiv250
-rw-r--r--Master/texmf-dist/tex/context/base/typo-dha.lua7
-rw-r--r--Master/texmf-dist/tex/context/base/typo-dig.lua13
-rw-r--r--Master/texmf-dist/tex/context/base/typo-dig.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/typo-dir.lua22
-rw-r--r--Master/texmf-dist/tex/context/base/typo-dir.mkiv23
-rw-r--r--Master/texmf-dist/tex/context/base/typo-drp.lua31
-rw-r--r--Master/texmf-dist/tex/context/base/typo-drp.mkiv30
-rw-r--r--Master/texmf-dist/tex/context/base/typo-dua.lua8
-rw-r--r--Master/texmf-dist/tex/context/base/typo-dub.lua13
-rw-r--r--Master/texmf-dist/tex/context/base/typo-fln.lua27
-rw-r--r--Master/texmf-dist/tex/context/base/typo-fln.mkiv20
-rw-r--r--Master/texmf-dist/tex/context/base/typo-inj.lua94
-rw-r--r--Master/texmf-dist/tex/context/base/typo-inj.mkiv77
-rw-r--r--Master/texmf-dist/tex/context/base/typo-itc.lua406
-rw-r--r--Master/texmf-dist/tex/context/base/typo-itc.mkvi6
-rw-r--r--Master/texmf-dist/tex/context/base/typo-itm.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/base/typo-krn.lua534
-rw-r--r--Master/texmf-dist/tex/context/base/typo-krn.mkiv9
-rw-r--r--Master/texmf-dist/tex/context/base/typo-lan.lua8
-rw-r--r--Master/texmf-dist/tex/context/base/typo-lan.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/typo-lig.mkiv31
-rw-r--r--Master/texmf-dist/tex/context/base/typo-man.lua113
-rw-r--r--Master/texmf-dist/tex/context/base/typo-mar.lua105
-rw-r--r--Master/texmf-dist/tex/context/base/typo-mar.mkiv76
-rw-r--r--Master/texmf-dist/tex/context/base/typo-pag.lua23
-rw-r--r--Master/texmf-dist/tex/context/base/typo-prc.lua25
-rw-r--r--Master/texmf-dist/tex/context/base/typo-prc.mkvi15
-rw-r--r--Master/texmf-dist/tex/context/base/typo-rep.lua7
-rw-r--r--Master/texmf-dist/tex/context/base/typo-rep.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/typo-spa.lua30
-rw-r--r--Master/texmf-dist/tex/context/base/typo-spa.mkiv18
-rw-r--r--Master/texmf-dist/tex/context/base/typo-sus.lua304
-rw-r--r--Master/texmf-dist/tex/context/base/typo-sus.mkiv51
-rw-r--r--Master/texmf-dist/tex/context/base/typo-tal.lua282
-rw-r--r--Master/texmf-dist/tex/context/base/typo-tal.mkiv61
-rw-r--r--Master/texmf-dist/tex/context/base/typo-txt.mkvi47
-rw-r--r--Master/texmf-dist/tex/context/base/typo-wrp.lua76
-rw-r--r--Master/texmf-dist/tex/context/base/typo-wrp.mkiv65
-rw-r--r--Master/texmf-dist/tex/context/base/unic-ini.lua14
-rw-r--r--Master/texmf-dist/tex/context/base/unic-ini.mkiv3
-rw-r--r--Master/texmf-dist/tex/context/base/util-dim.lua97
-rw-r--r--Master/texmf-dist/tex/context/base/util-env.lua42
-rw-r--r--Master/texmf-dist/tex/context/base/util-prs.lua108
-rw-r--r--Master/texmf-dist/tex/context/base/util-sbx.lua415
-rw-r--r--Master/texmf-dist/tex/context/base/util-seq.lua45
-rw-r--r--Master/texmf-dist/tex/context/base/util-sql-loggers.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/util-sta.lua22
-rw-r--r--Master/texmf-dist/tex/context/base/util-str.lua49
-rw-r--r--Master/texmf-dist/tex/context/base/util-tab.lua19
-rw-r--r--Master/texmf-dist/tex/context/base/util-tpl.lua41
-rw-r--r--Master/texmf-dist/tex/context/base/x-asciimath.lua2242
-rw-r--r--Master/texmf-dist/tex/context/base/x-asciimath.mkiv411
-rw-r--r--Master/texmf-dist/tex/context/base/x-cals.lua7
-rw-r--r--Master/texmf-dist/tex/context/base/x-ct.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/x-html.mkiv379
-rw-r--r--Master/texmf-dist/tex/context/base/x-math-svg.lua169
-rw-r--r--Master/texmf-dist/tex/context/base/x-mathml-basics.mkiv276
-rw-r--r--Master/texmf-dist/tex/context/base/x-mathml.lua214
-rw-r--r--Master/texmf-dist/tex/context/base/x-mathml.mkiv436
-rw-r--r--Master/texmf-dist/tex/context/base/x-mathml.xsd6
-rw-r--r--Master/texmf-dist/tex/context/base/x-res-01.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/x-set-11.mkiv97
-rw-r--r--Master/texmf-dist/tex/context/base/x-set-12.mkiv3
-rw-r--r--Master/texmf-dist/tex/context/base/x-xtag.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/bib/bibl-apa-it.tex385
-rw-r--r--Master/texmf-dist/tex/context/bib/sample.bib1
-rw-r--r--Master/texmf-dist/tex/context/extra/showunic.tex130
-rw-r--r--Master/texmf-dist/tex/context/fonts/treatments.lfg62
-rw-r--r--Master/texmf-dist/tex/context/foxet/fe-bryson.xml12
-rw-r--r--Master/texmf-dist/tex/context/foxet/fe-ward.xml8
-rw-r--r--Master/texmf-dist/tex/context/foxet/fe-zapf.xml14
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-0101.fo17
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-0102.fo25
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-0103.fo21
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-0201.fo22
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-0301.fo56
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-0601.fo29
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-0602.fo27
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-0603.fo26
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-0604.fo26
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-0611.fo21
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-0612.fo21
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-0613.fo21
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-0621.fo106
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-0641.fo25
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-0642.fo27
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-0643.fo27
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-0644.fo27
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-0650.fo26
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-0651.fo26
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-0701.fo39
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-0801.fo55
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-0901.fo58
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-0902.fo33
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-1001.fo63
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-1002.fo31
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-1003.fo31
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-1004.fo35
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-1101.fo63
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-1102.fo128
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-1103.fo85
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-1104.fo28
-rw-r--r--Master/texmf-dist/tex/context/foxet/fo-1201.fo40
-rw-r--r--Master/texmf-dist/tex/context/interface/keys-cs.xml21
-rw-r--r--Master/texmf-dist/tex/context/interface/keys-de.xml21
-rw-r--r--Master/texmf-dist/tex/context/interface/keys-en.xml19
-rw-r--r--Master/texmf-dist/tex/context/interface/keys-fr.xml23
-rw-r--r--Master/texmf-dist/tex/context/interface/keys-it.xml23
-rw-r--r--Master/texmf-dist/tex/context/interface/keys-nl.xml29
-rw-r--r--Master/texmf-dist/tex/context/interface/keys-pe.xml23
-rw-r--r--Master/texmf-dist/tex/context/interface/keys-ro.xml21
-rw-r--r--Master/texmf-dist/tex/context/sample/darwin.tex19
-rw-r--r--Master/texmf-dist/tex/context/sample/dawkins.tex6
-rw-r--r--Master/texmf-dist/tex/context/sample/douglas.tex8
-rw-r--r--Master/texmf-dist/tex/context/sample/sample.tex80
-rw-r--r--Master/texmf-dist/tex/context/sample/samples.bib29
-rw-r--r--Master/texmf-dist/tex/context/sample/samples.tex78
-rw-r--r--Master/texmf-dist/tex/context/test/pdf-a1b-2005.mkiv6
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex/luatex-basics-gen.lua14
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex/luatex-basics-nod.lua108
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-cbk.lua117
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-inj.lua1293
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-merged.lua3624
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-ota.lua459
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-otn.lua809
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex/luatex-fonts.lua19
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex/luatex-test.tex19
948 files changed, 124211 insertions, 52246 deletions
diff --git a/Build/source/texk/texlive/linked_scripts/context/stubs/unix/mtxrun b/Build/source/texk/texlive/linked_scripts/context/stubs/unix/mtxrun
index 5cb5c8d2416..48a9a27a250 100755
--- a/Build/source/texk/texlive/linked_scripts/context/stubs/unix/mtxrun
+++ b/Build/source/texk/texlive/linked_scripts/context/stubs/unix/mtxrun
@@ -56,7 +56,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lua"] = package.loaded["l-lua"] or true
--- original size: 3409, stripped down to: 1763
+-- original size: 3888, stripped down to: 2197
if not modules then modules={} end modules ['l-lua']={
version=1.001,
@@ -139,6 +139,13 @@ end
if lua then
lua.mask=load([[τεχ = 1]]) and "utf" or "ascii"
end
+local flush=io.flush
+if flush then
+ local execute=os.execute if execute then function os.execute(...) flush() return execute(...) end end
+ local exec=os.exec if exec then function os.exec (...) flush() return exec (...) end end
+ local spawn=os.spawn if spawn then function os.spawn (...) flush() return spawn (...) end end
+ local popen=io.popen if popen then function io.popen (...) flush() return popen (...) end end
+end
end -- of closure
@@ -437,7 +444,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lpeg"] = package.loaded["l-lpeg"] or true
--- original size: 29983, stripped down to: 16202
+-- original size: 36225, stripped down to: 19891
if not modules then modules={} end modules ['l-lpeg']={
version=1.001,
@@ -498,6 +505,8 @@ patterns.utfbom_16_le=utfbom_16_le
patterns.utfbom_8=utfbom_8
patterns.utf_16_be_nl=P("\000\r\000\n")+P("\000\r")+P("\000\n")
patterns.utf_16_le_nl=P("\r\000\n\000")+P("\r\000")+P("\n\000")
+patterns.utf_32_be_nl=P("\000\000\000\r\000\000\000\n")+P("\000\000\000\r")+P("\000\000\000\n")
+patterns.utf_32_le_nl=P("\r\000\000\000\n\000\000\000")+P("\r\000\000\000")+P("\n\000\000\000")
patterns.utf8one=R("\000\127")
patterns.utf8two=R("\194\223")*utf8next
patterns.utf8three=R("\224\239")*utf8next*utf8next
@@ -527,9 +536,21 @@ patterns.nonwhitespace=nonwhitespace
local stripper=spacer^0*C((spacer^0*nonspacer^1)^0)
local fullstripper=whitespace^0*C((whitespace^0*nonwhitespace^1)^0)
local collapser=Cs(spacer^0/""*nonspacer^0*((spacer^0/" "*nonspacer^1)^0))
+local b_collapser=Cs(whitespace^0/""*(nonwhitespace^1+whitespace^1/" ")^0)
+local e_collapser=Cs((whitespace^1*P(-1)/""+nonwhitespace^1+whitespace^1/" ")^0)
+local m_collapser=Cs((nonwhitespace^1+whitespace^1/" ")^0)
+local b_stripper=Cs(spacer^0/""*(nonspacer^1+spacer^1/" ")^0)
+local e_stripper=Cs((spacer^1*P(-1)/""+nonspacer^1+spacer^1/" ")^0)
+local m_stripper=Cs((nonspacer^1+spacer^1/" ")^0)
patterns.stripper=stripper
patterns.fullstripper=fullstripper
patterns.collapser=collapser
+patterns.b_collapser=b_collapser
+patterns.m_collapser=m_collapser
+patterns.e_collapser=e_collapser
+patterns.b_stripper=b_stripper
+patterns.m_stripper=m_stripper
+patterns.e_stripper=e_stripper
patterns.lowercase=lowercase
patterns.uppercase=uppercase
patterns.letter=patterns.lowercase+patterns.uppercase
@@ -566,9 +587,12 @@ patterns.integer=sign^-1*digit^1
patterns.unsigned=digit^0*period*digit^1
patterns.float=sign^-1*patterns.unsigned
patterns.cunsigned=digit^0*comma*digit^1
+patterns.cpunsigned=digit^0*(period+comma)*digit^1
patterns.cfloat=sign^-1*patterns.cunsigned
+patterns.cpfloat=sign^-1*patterns.cpunsigned
patterns.number=patterns.float+patterns.integer
patterns.cnumber=patterns.cfloat+patterns.integer
+patterns.cpnumber=patterns.cpfloat+patterns.integer
patterns.oct=zero*octdigit^1
patterns.octal=patterns.oct
patterns.HEX=zero*P("X")*(digit+uppercase)^1
@@ -985,23 +1009,40 @@ function lpeg.append(list,pp,delayed,checked)
end
return p
end
+local p_false=P(false)
+local p_true=P(true)
local function make(t)
- local p
+ local function making(t)
+ local p=p_false
+ local keys=sortedkeys(t)
+ for i=1,#keys do
+ local k=keys[i]
+ if k~="" then
+ local v=t[k]
+ if v==true then
+ p=p+P(k)*p_true
+ elseif v==false then
+ else
+ p=p+P(k)*making(v)
+ end
+ end
+ end
+ if t[""] then
+ p=p+p_true
+ end
+ return p
+ end
+ local p=p_false
local keys=sortedkeys(t)
for i=1,#keys do
local k=keys[i]
- local v=t[k]
- if not p then
- if next(v) then
- p=P(k)*make(v)
- else
- p=P(k)
- end
- else
- if next(v) then
- p=p+P(k)*make(v)
+ if k~="" then
+ local v=t[k]
+ if v==true then
+ p=p+P(k)*p_true
+ elseif v==false then
else
- p=p+P(k)
+ p=p+P(k)*making(v)
end
end
end
@@ -1009,13 +1050,73 @@ local function make(t)
end
function lpeg.utfchartabletopattern(list)
local tree={}
- for i=1,#list do
- local t=tree
- for c in gmatch(list[i],".") do
- if not t[c] then
- t[c]={}
+ local n=#list
+ if n==0 then
+ for s in next,list do
+ local t=tree
+ local p,pk
+ for c in gmatch(s,".") do
+ if t==true then
+ t={ [c]=true,[""]=true }
+ p[pk]=t
+ p=t
+ t=false
+ elseif t==false then
+ t={ [c]=false }
+ p[pk]=t
+ p=t
+ t=false
+ else
+ local tc=t[c]
+ if not tc then
+ tc=false
+ t[c]=false
+ end
+ p=t
+ t=tc
+ end
+ pk=c
+ end
+ if t==false then
+ p[pk]=true
+ elseif t==true then
+ else
+ t[""]=true
+ end
+ end
+ else
+ for i=1,n do
+ local s=list[i]
+ local t=tree
+ local p,pk
+ for c in gmatch(s,".") do
+ if t==true then
+ t={ [c]=true,[""]=true }
+ p[pk]=t
+ p=t
+ t=false
+ elseif t==false then
+ t={ [c]=false }
+ p[pk]=t
+ p=t
+ t=false
+ else
+ local tc=t[c]
+ if not tc then
+ tc=false
+ t[c]=false
+ end
+ p=t
+ t=tc
+ end
+ pk=c
+ end
+ if t==false then
+ p[pk]=true
+ elseif t==true then
+ else
+ t[""]=true
end
- t=t[c]
end
end
return make(tree)
@@ -1055,6 +1156,65 @@ local case_2=period*(digit-trailingzeros)^1*(trailingzeros/"")
local number=digit^1*(case_1+case_2)
local stripper=Cs((number+1)^0)
lpeg.patterns.stripzeros=stripper
+local byte_to_HEX={}
+local byte_to_hex={}
+local byte_to_dec={}
+local hex_to_byte={}
+for i=0,255 do
+ local H=format("%02X",i)
+ local h=format("%02x",i)
+ local d=format("%03i",i)
+ local c=char(i)
+ byte_to_HEX[c]=H
+ byte_to_hex[c]=h
+ byte_to_dec[c]=d
+ hex_to_byte[h]=c
+ hex_to_byte[H]=c
+end
+local hextobyte=P(2)/hex_to_byte
+local bytetoHEX=P(1)/byte_to_HEX
+local bytetohex=P(1)/byte_to_hex
+local bytetodec=P(1)/byte_to_dec
+local hextobytes=Cs(hextobyte^0)
+local bytestoHEX=Cs(bytetoHEX^0)
+local bytestohex=Cs(bytetohex^0)
+local bytestodec=Cs(bytetodec^0)
+patterns.hextobyte=hextobyte
+patterns.bytetoHEX=bytetoHEX
+patterns.bytetohex=bytetohex
+patterns.bytetodec=bytetodec
+patterns.hextobytes=hextobytes
+patterns.bytestoHEX=bytestoHEX
+patterns.bytestohex=bytestohex
+patterns.bytestodec=bytestodec
+function string.toHEX(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(bytestoHEX,s)
+ end
+end
+function string.tohex(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(bytestohex,s)
+ end
+end
+function string.todec(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(bytestodec,s)
+ end
+end
+function string.tobytes(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(hextobytes,s)
+ end
+end
end -- of closure
@@ -1082,7 +1242,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-string"] = package.loaded["l-string"] or true
--- original size: 5671, stripped down to: 2827
+-- original size: 5694, stripped down to: 2827
if not modules then modules={} end modules ['l-string']={
version=1.001,
@@ -1187,7 +1347,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-table"] = package.loaded["l-table"] or true
--- original size: 31860, stripped down to: 20846
+-- original size: 33830, stripped down to: 21894
if not modules then modules={} end modules ['l-table']={
version=1.001,
@@ -1230,11 +1390,12 @@ function table.keys(t)
end
end
local function compare(a,b)
- local ta,tb=type(a),type(b)
- if ta==tb then
+ local ta=type(a)
+ local tb=type(b)
+ if ta==tb and ta=="number" then
return a<b
else
- return tostring(a)<tostring(b)
+ return tostring(a)<tostring(b)
end
end
local function sortedkeys(tab)
@@ -1334,14 +1495,14 @@ local function sortedhash(t,cmp)
end
local n=0
local m=#s
- local function kv(s)
+ local function kv()
if n<m then
n=n+1
local k=s[n]
return k,t[k]
end
end
- return kv,s
+ return kv
else
return nothing
end
@@ -1506,7 +1667,7 @@ local function simple_table(t)
if tv=="number" then
nt=nt+1
if hexify then
- tt[nt]=format("0x%04X",v)
+ tt[nt]=format("0x%X",v)
else
tt[nt]=tostring(v)
end
@@ -1537,7 +1698,7 @@ local function do_serialize(root,name,depth,level,indexed)
local tn=type(name)
if tn=="number" then
if hexify then
- handle(format("%s[0x%04X]={",depth,name))
+ handle(format("%s[0x%X]={",depth,name))
else
handle(format("%s[%s]={",depth,name))
end
@@ -1554,7 +1715,7 @@ local function do_serialize(root,name,depth,level,indexed)
end
end
end
- if root and next(root) then
+ if root and next(root)~=nil then
local first,last=nil,0
if compact then
last=#root
@@ -1576,7 +1737,7 @@ local function do_serialize(root,name,depth,level,indexed)
if compact and first and tk=="number" and k>=first and k<=last then
if tv=="number" then
if hexify then
- handle(format("%s 0x%04X,",depth,v))
+ handle(format("%s 0x%X,",depth,v))
else
handle(format("%s %s,",depth,v))
end
@@ -1587,7 +1748,7 @@ local function do_serialize(root,name,depth,level,indexed)
handle(format("%s %q,",depth,v))
end
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
handle(format("%s {},",depth))
elseif inline then
local st=simple_table(v)
@@ -1617,25 +1778,25 @@ local function do_serialize(root,name,depth,level,indexed)
elseif tv=="number" then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=0x%04X,",depth,k,v))
+ handle(format("%s [0x%X]=0x%X,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
elseif tk=="boolean" then
if hexify then
- handle(format("%s [%s]=0x%04X,",depth,k and "true" or "false",v))
+ handle(format("%s [%s]=0x%X,",depth,k and "true" or "false",v))
else
handle(format("%s [%s]=%s,",depth,k and "true" or "false",v))
end
elseif noquotes and not reserved[k] and lpegmatch(propername,k) then
if hexify then
- handle(format("%s %s=0x%04X,",depth,k,v))
+ handle(format("%s %s=0x%X,",depth,k,v))
else
handle(format("%s %s=%s,",depth,k,v))
end
else
if hexify then
- handle(format("%s [%q]=0x%04X,",depth,k,v))
+ handle(format("%s [%q]=0x%X,",depth,k,v))
else
handle(format("%s [%q]=%s,",depth,k,v))
end
@@ -1644,7 +1805,7 @@ local function do_serialize(root,name,depth,level,indexed)
if reduce and tonumber(v) then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%s,",depth,k,v))
+ handle(format("%s [0x%X]=%s,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
@@ -1658,7 +1819,7 @@ local function do_serialize(root,name,depth,level,indexed)
else
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%q,",depth,k,v))
+ handle(format("%s [0x%X]=%q,",depth,k,v))
else
handle(format("%s [%s]=%q,",depth,k,v))
end
@@ -1671,10 +1832,10 @@ local function do_serialize(root,name,depth,level,indexed)
end
end
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]={},",depth,k))
+ handle(format("%s [0x%X]={},",depth,k))
else
handle(format("%s [%s]={},",depth,k))
end
@@ -1690,7 +1851,7 @@ local function do_serialize(root,name,depth,level,indexed)
if st then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]={ %s },",depth,k,concat(st,", ")))
+ handle(format("%s [0x%X]={ %s },",depth,k,concat(st,", ")))
else
handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
end
@@ -1710,7 +1871,7 @@ local function do_serialize(root,name,depth,level,indexed)
elseif tv=="boolean" then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%s,",depth,k,v and "true" or "false"))
+ handle(format("%s [0x%X]=%s,",depth,k,v and "true" or "false"))
else
handle(format("%s [%s]=%s,",depth,k,v and "true" or "false"))
end
@@ -1726,7 +1887,7 @@ local function do_serialize(root,name,depth,level,indexed)
local f=getinfo(v).what=="C" and dump(dummy) or dump(v)
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=load(%q),",depth,k,f))
+ handle(format("%s [0x%X]=load(%q),",depth,k,f))
else
handle(format("%s [%s]=load(%q),",depth,k,f))
end
@@ -1741,7 +1902,7 @@ local function do_serialize(root,name,depth,level,indexed)
else
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%q,",depth,k,tostring(v)))
+ handle(format("%s [0x%X]=%q,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%q,",depth,k,tostring(v)))
end
@@ -1795,7 +1956,7 @@ local function serialize(_handle,root,name,specification)
end
elseif tname=="number" then
if hexify then
- handle(format("[0x%04X]={",name))
+ handle(format("[0x%X]={",name))
else
handle("["..name.."]={")
end
@@ -1813,7 +1974,7 @@ local function serialize(_handle,root,name,specification)
local dummy=root._w_h_a_t_e_v_e_r_
root._w_h_a_t_e_v_e_r_=nil
end
- if next(root) then
+ if next(root)~=nil then
do_serialize(root,name,"",0)
end
end
@@ -1942,14 +2103,25 @@ local function identical(a,b)
end
table.identical=identical
table.are_equal=are_equal
-function table.compact(t)
- if t then
- for k,v in next,t do
- if not next(v) then
- t[k]=nil
+local function sparse(old,nest,keeptables)
+ local new={}
+ for k,v in next,old do
+ if not (v=="" or v==false) then
+ if nest and type(v)=="table" then
+ v=sparse(v,nest)
+ if keeptables or next(v)~=nil then
+ new[k]=v
+ end
+ else
+ new[k]=v
end
end
end
+ return new
+end
+table.sparse=sparse
+function table.compact(t)
+ return sparse(t,true,true)
end
function table.contains(t,v)
if t then
@@ -2054,10 +2226,10 @@ function table.sub(t,i,j)
return { unpack(t,i,j) }
end
function table.is_empty(t)
- return not t or not next(t)
+ return not t or next(t)==nil
end
function table.has_one_entry(t)
- return t and not next(t,next(t))
+ return t and next(t,next(t))==nil
end
function table.loweredkeys(t)
local l={}
@@ -2102,6 +2274,44 @@ function table.values(t,s)
return {}
end
end
+function table.filtered(t,pattern,sort,cmp)
+ if t and type(pattern)=="string" then
+ if sort then
+ local s
+ if cmp then
+ s=sortedhashkeys(t,function(a,b) return cmp(t,a,b) end)
+ else
+ s=sortedkeys(t)
+ end
+ local n=0
+ local m=#s
+ local function kv(s)
+ while n<m do
+ n=n+1
+ local k=s[n]
+ if find(k,pattern) then
+ return k,t[k]
+ end
+ end
+ end
+ return kv,s
+ else
+ local n=next(t)
+ local function iterator()
+ while n~=nil do
+ local k=n
+ n=next(t,k)
+ if find(k,pattern) then
+ return k,t[k]
+ end
+ end
+ end
+ return iterator,t
+ end
+ else
+ return nothing
+ end
+end
end -- of closure
@@ -2110,7 +2320,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-io"] = package.loaded["l-io"] or true
--- original size: 8824, stripped down to: 6347
+-- original size: 8643, stripped down to: 6232
if not modules then modules={} end modules ['l-io']={
version=1.001,
@@ -2417,8 +2627,6 @@ function io.readstring(f,n,m)
local str=gsub(f:read(n),"\000","")
return str
end
-if not io.i_limiter then function io.i_limiter() end end
-if not io.o_limiter then function io.o_limiter() end end
end -- of closure
@@ -2645,7 +2853,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-os"] = package.loaded["l-os"] or true
--- original size: 16093, stripped down to: 9704
+-- original size: 15761, stripped down to: 9403
if not modules then modules={} end modules ['l-os']={
version=1.001,
@@ -2719,13 +2927,10 @@ if not os.__getenv__ then
setmetatable(os.env,{ __index=__index,__newindex=__newindex } )
end
end
-local execute,spawn,exec,iopopen,ioflush=os.execute,os.spawn or os.execute,os.exec or os.execute,io.popen,io.flush
-function os.execute(...) ioflush() return execute(...) end
-function os.spawn (...) ioflush() return spawn (...) end
-function os.exec (...) ioflush() return exec (...) end
-function io.popen (...) ioflush() return iopopen(...) end
+local execute=os.execute
+local iopopen=io.popen
function os.resultof(command)
- local handle=io.popen(command,"r")
+ local handle=iopopen(command,"r")
if handle then
local result=handle:read("*all") or ""
handle:close()
@@ -2754,7 +2959,7 @@ local launchers={
unix="$BROWSER %s &> /dev/null &",
}
function os.launch(str)
- os.execute(format(launchers[os.name] or launchers.unix,str))
+ execute(format(launchers[os.name] or launchers.unix,str))
end
if not os.times then
function os.times()
@@ -3029,7 +3234,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-file"] = package.loaded["l-file"] or true
--- original size: 18308, stripped down to: 9948
+-- original size: 20949, stripped down to: 9945
if not modules then modules={} end modules ['l-file']={
version=1.001,
@@ -3043,41 +3248,28 @@ local file=file
if not lfs then
lfs=optionalrequire("lfs")
end
-if not lfs then
- lfs={
- getcurrentdir=function()
- return "."
- end,
- attributes=function()
- return nil
- end,
- isfile=function(name)
- local f=io.open(name,'rb')
- if f then
- f:close()
- return true
- end
- end,
- isdir=function(name)
- print("you need to load lfs")
- return false
- end
- }
-elseif not lfs.isfile then
- local attributes=lfs.attributes
- function lfs.isdir(name)
- return attributes(name,"mode")=="directory"
- end
- function lfs.isfile(name)
- return attributes(name,"mode")=="file"
- end
-end
local insert,concat=table.insert,table.concat
local match,find,gmatch=string.match,string.find,string.gmatch
local lpegmatch=lpeg.match
local getcurrentdir,attributes=lfs.currentdir,lfs.attributes
local checkedsplit=string.checkedsplit
local P,R,S,C,Cs,Cp,Cc,Ct=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Cs,lpeg.Cp,lpeg.Cc,lpeg.Ct
+local tricky=S("/\\")*P(-1)
+local attributes=lfs.attributes
+if sandbox then
+ sandbox.redefine(lfs.isfile,"lfs.isfile")
+ sandbox.redefine(lfs.isdir,"lfs.isdir")
+end
+function lfs.isdir(name)
+ if lpegmatch(tricky,name) then
+ return attributes(name,"mode")=="directory"
+ else
+ return attributes(name.."/.","mode")=="directory"
+ end
+end
+function lfs.isfile(name)
+ return attributes(name,"mode")=="file"
+end
local colon=P(":")
local period=P(".")
local periods=P("..")
@@ -3279,28 +3471,30 @@ local isroot=fwslash^1*-1
local hasroot=fwslash^1
local reslasher=lpeg.replacer(S("\\/"),"/")
local deslasher=lpeg.replacer(S("\\/")^1,"/")
-function file.join(...)
- local lst={... }
- local one=lst[1]
+function file.join(one,two,three,...)
+ if not two then
+ return one=="" and one or lpegmatch(stripper,one)
+ end
+ if one=="" then
+ return lpegmatch(stripper,three and concat({ two,three,... },"/") or two)
+ end
if lpegmatch(isnetwork,one) then
local one=lpegmatch(reslasher,one)
- local two=lpegmatch(deslasher,concat(lst,"/",2))
+ local two=lpegmatch(deslasher,three and concat({ two,three,... },"/") or two)
if lpegmatch(hasroot,two) then
return one..two
else
return one.."/"..two
end
elseif lpegmatch(isroot,one) then
- local two=lpegmatch(deslasher,concat(lst,"/",2))
+ local two=lpegmatch(deslasher,three and concat({ two,three,... },"/") or two)
if lpegmatch(hasroot,two) then
return two
else
return "/"..two
end
- elseif one=="" then
- return lpegmatch(stripper,concat(lst,"/",2))
else
- return lpegmatch(deslasher,concat(lst,"/"))
+ return lpegmatch(deslasher,concat({ one,two,three,... },"/"))
end
end
local drivespec=R("az","AZ")^1*colon
@@ -3474,7 +3668,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-md5"] = package.loaded["l-md5"] or true
--- original size: 3760, stripped down to: 2088
+-- original size: 3248, stripped down to: 2266
if not modules then modules={} end modules ['l-md5']={
version=1.001,
@@ -3492,14 +3686,20 @@ if not md5 then
}
end
local md5,file=md5,file
-local gsub,format,byte=string.gsub,string.format,string.byte
-local md5sum=md5.sum
-local function convert(str,fmt)
- return (gsub(md5sum(str),".",function(chr) return format(fmt,byte(chr)) end))
-end
-if not md5.HEX then function md5.HEX(str) return convert(str,"%02X") end end
-if not md5.hex then function md5.hex(str) return convert(str,"%02x") end end
-if not md5.dec then function md5.dec(str) return convert(str,"%03i") end end
+local gsub=string.gsub
+do
+ local patterns=lpeg and lpeg.patterns
+ if patterns then
+ local bytestoHEX=patterns.bytestoHEX
+ local bytestohex=patterns.bytestohex
+ local bytestodec=patterns.bytestodec
+ local lpegmatch=lpeg.match
+ local md5sum=md5.sum
+ if not md5.HEX then function md5.HEX(str) if str then return lpegmatch(bytestoHEX,md5sum(str)) end end end
+ if not md5.hex then function md5.hex(str) if str then return lpegmatch(bytestohex,md5sum(str)) end end end
+ if not md5.dec then function md5.dec(str) if str then return lpegmatch(bytestodec,md5sum(str)) end end end
+ end
+end
function file.needsupdating(oldname,newname,threshold)
local oldtime=lfs.attributes(oldname,"modification")
if oldtime then
@@ -3556,7 +3756,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-url"] = package.loaded["l-url"] or true
--- original size: 12292, stripped down to: 5585
+-- original size: 12531, stripped down to: 5721
if not modules then modules={} end modules ['l-url']={
version=1.001,
@@ -3642,19 +3842,25 @@ local splitquery=Cf (Ct("")*P { "sequence",
pair=Cg(key*equal*value),
},rawset)
local function hashed(str)
- if str=="" then
+ if not str or str=="" then
return {
scheme="invalid",
original=str,
}
end
- local s=split(str)
- local rawscheme=s[1]
- local rawquery=s[4]
- local somescheme=rawscheme~=""
- local somequery=rawquery~=""
+ local detailed=split(str)
+ local rawscheme=""
+ local rawquery=""
+ local somescheme=false
+ local somequery=false
+ if detailed then
+ rawscheme=detailed[1]
+ rawquery=detailed[4]
+ somescheme=rawscheme~=""
+ somequery=rawquery~=""
+ end
if not somescheme and not somequery then
- s={
+ return {
scheme="file",
authority="",
path=str,
@@ -3664,28 +3870,28 @@ local function hashed(str)
noscheme=true,
filename=str,
}
- else
- local authority,path,filename=s[2],s[3]
- if authority=="" then
- filename=path
- elseif path=="" then
- filename=""
- else
- filename=authority.."/"..path
- end
- s={
- scheme=rawscheme,
- authority=authority,
- path=path,
- query=lpegmatch(unescaper,rawquery),
- queries=lpegmatch(splitquery,rawquery),
- fragment=s[5],
- original=str,
- noscheme=false,
- filename=filename,
- }
end
- return s
+ local authority=detailed[2]
+ local path=detailed[3]
+ local filename=nil
+ if authority=="" then
+ filename=path
+ elseif path=="" then
+ filename=""
+ else
+ filename=authority.."/"..path
+ end
+ return {
+ scheme=rawscheme,
+ authority=authority,
+ path=path,
+ query=lpegmatch(unescaper,rawquery),
+ queries=lpegmatch(splitquery,rawquery),
+ fragment=detailed[5],
+ original=str,
+ noscheme=false,
+ filename=filename,
+ }
end
url.split=split
url.hasscheme=hasscheme
@@ -3719,7 +3925,7 @@ function url.construct(hash)
end
return lpegmatch(escaper,concat(fullurl))
end
-local pattern=Cs(noslash*R("az","AZ")*(S(":|")/":")*noslash*P(1)^0)
+local pattern=Cs(slash^-1/""*R("az","AZ")*((S(":|")/":")+P(":"))*slash*P(1)^0)
function url.filename(filename)
local spec=hashed(filename)
local path=spec.path
@@ -3767,7 +3973,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-dir"] = package.loaded["l-dir"] or true
--- original size: 14788, stripped down to: 9096
+-- original size: 16765, stripped down to: 11003
if not modules then modules={} end modules ['l-dir']={
version=1.001,
@@ -3777,7 +3983,7 @@ if not modules then modules={} end modules ['l-dir']={
license="see context related readme files"
}
local type,select=type,select
-local find,gmatch,match,gsub=string.find,string.gmatch,string.match,string.gsub
+local find,gmatch,match,gsub,sub=string.find,string.gmatch,string.match,string.gsub,string.sub
local concat,insert,remove,unpack=table.concat,table.insert,table.remove,table.unpack
local lpegmatch=lpeg.match
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
@@ -3786,53 +3992,126 @@ local dir=dir
local lfs=lfs
local attributes=lfs.attributes
local walkdir=lfs.dir
-local isdir=lfs.isdir
-local isfile=lfs.isfile
+local isdir=lfs.isdir
+local isfile=lfs.isfile
local currentdir=lfs.currentdir
local chdir=lfs.chdir
local mkdir=lfs.mkdir
local onwindows=os.type=="windows" or find(os.getenv("PATH"),";",1,true)
-if not isdir then
- function isdir(name)
- local a=attributes(name)
- return a and a.mode=="directory"
+if onwindows then
+ local tricky=S("/\\")*P(-1)
+ isdir=function(name)
+ if lpegmatch(tricky,name) then
+ return attributes(name,"mode")=="directory"
+ else
+ return attributes(name.."/.","mode")=="directory"
+ end
+ end
+ isfile=function(name)
+ return attributes(name,"mode")=="file"
end
lfs.isdir=isdir
-end
-if not isfile then
- function isfile(name)
- local a=attributes(name)
- return a and a.mode=="file"
+ lfs.isfile=isfile
+else
+ isdir=function(name)
+ return attributes(name,"mode")=="directory"
end
+ isfile=function(name)
+ return attributes(name,"mode")=="file"
+ end
+ lfs.isdir=isdir
lfs.isfile=isfile
end
function dir.current()
return (gsub(currentdir(),"\\","/"))
end
-local lfsisdir=isdir
-local function isdir(path)
- path=gsub(path,"[/\\]+$","")
- return lfsisdir(path)
+local function glob_pattern_function(path,patt,recurse,action)
+ if isdir(path) then
+ local usedpath
+ if path=="/" then
+ usedpath="/."
+ elseif not find(path,"/$") then
+ usedpath=path.."/."
+ path=path.."/"
+ else
+ usedpath=path
+ end
+ local dirs
+ for name in walkdir(usedpath) do
+ if name~="." and name~=".." then
+ local full=path..name
+ local mode=attributes(full,'mode')
+ if mode=='file' then
+ if not patt or find(full,patt) then
+ action(full)
+ end
+ elseif recurse and mode=="directory" then
+ if not dirs then
+ dirs={ full }
+ else
+ dirs[#dirs+1]=full
+ end
+ end
+ end
+ end
+ if dirs then
+ for i=1,#dirs do
+ glob_pattern_function(dirs[i],patt,recurse,action)
+ end
+ end
+ end
end
-lfs.isdir=isdir
-local function globpattern(path,patt,recurse,action)
- if path=="/" then
- path=path.."."
- elseif not find(path,"/$") then
- path=path..'/'
- end
- if isdir(path) then
- for name in walkdir(path) do
- local full=path..name
- local mode=attributes(full,'mode')
- if mode=='file' then
- if find(full,patt) then
- action(full)
+local function glob_pattern_table(path,patt,recurse,result)
+ if not result then
+ result={}
+ end
+ if isdir(path) then
+ local usedpath
+ if path=="/" then
+ usedpath="/."
+ elseif not find(path,"/$") then
+ usedpath=path.."/."
+ path=path.."/"
+ else
+ usedpath=path
+ end
+ local dirs
+ for name in walkdir(usedpath) do
+ if name~="." and name~=".." then
+ local full=path..name
+ local mode=attributes(full,'mode')
+ if mode=='file' then
+ if not patt or find(full,patt) then
+ result[#result+1]=full
+ end
+ elseif recurse and mode=="directory" then
+ if not dirs then
+ dirs={ full }
+ else
+ dirs[#dirs+1]=full
+ end
end
- elseif recurse and (mode=="directory") and (name~='.') and (name~="..") then
- globpattern(full,patt,recurse,action)
end
end
+ if dirs then
+ for i=1,#dirs do
+ glob_pattern_table(dirs[i],patt,recurse,result)
+ end
+ end
+ end
+ return result
+end
+local function globpattern(path,patt,recurse,method)
+ local kind=type(method)
+ if patt and sub(patt,1,-3)==path then
+ patt=false
+ end
+ if kind=="function" then
+ return glob_pattern_function(path,patt,recurse,method)
+ elseif kind=="table" then
+ return glob_pattern_table(path,patt,recurse,method)
+ else
+ return glob_pattern_table(path,patt,recurse,{})
end
end
dir.globpattern=globpattern
@@ -3845,34 +4124,40 @@ local function collectpattern(path,patt,recurse,result)
ok,scanner,first=xpcall(function() return walkdir(path) end,function() end)
end
if ok and type(scanner)=="function" then
- if not find(path,"/$") then path=path..'/' end
+ if not find(path,"/$") then
+ path=path..'/'
+ end
for name in scanner,first do
- local full=path..name
- local attr=attributes(full)
- local mode=attr.mode
- if mode=='file' then
- if find(full,patt) then
+ if name=="." then
+ elseif name==".." then
+ else
+ local full=path..name
+ local attr=attributes(full)
+ local mode=attr.mode
+ if mode=='file' then
+ if find(full,patt) then
+ result[name]=attr
+ end
+ elseif recurse and mode=="directory" then
+ attr.list=collectpattern(full,patt,recurse)
result[name]=attr
end
- elseif recurse and (mode=="directory") and (name~='.') and (name~="..") then
- attr.list=collectpattern(full,patt,recurse)
- result[name]=attr
end
end
end
return result
end
dir.collectpattern=collectpattern
-local separator
-if onwindows then
+local separator,pattern
+if onwindows then
local slash=S("/\\")/"/"
- pattern=Ct {
+ pattern={
[1]=(Cs(P(".")+slash^1)+Cs(R("az","AZ")*P(":")*slash^0)+Cc("./"))*V(2)*V(3),
[2]=Cs(((1-S("*?/\\"))^0*slash)^0),
[3]=Cs(P(1)^0)
}
-else
- pattern=Ct {
+else
+ pattern={
[1]=(C(P(".")+P("/")^1)+Cc("./"))*V(2)*V(3),
[2]=C(((1-S("*?/"))^0*P("/"))^0),
[3]=C(P(1)^0)
@@ -3890,9 +4175,8 @@ local function glob(str,t)
elseif 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 root,path,base=lpegmatch(pattern,str)
+ if root and path and base then
local recurse=find(base,"**",1,true)
local start=root..path
local result=lpegmatch(filter,start..base)
@@ -3914,16 +4198,12 @@ local function glob(str,t)
return { str }
end
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 root,path,base=lpegmatch(pattern,str)
+ if root and path and base then
local recurse=find(base,"**",1,true)
local start=root..path
local result=lpegmatch(filter,start..base)
- globpattern(start,result,recurse,action)
- return t
+ return globpattern(start,result,recurse,t)
else
return {}
end
@@ -4071,47 +4351,51 @@ else
end
end
dir.makedirs=dir.mkdirs
-if onwindows then
- function dir.expandname(str)
- 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()
+do
+ local chdir=sandbox and sandbox.original(chdir) or chdir
+ if onwindows then
+ local xcurrentdir=dir.current
+ function dir.expandname(str)
+ local first,nothing,last=match(str,"^(//)(//*)(.*)$")
+ if first then
+ first=xcurrentdir().."/"
+ 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=xcurrentdir()
+ end
+ chdir(d)
end
- chdir(d)
+ end
+ if not first then
+ first,last=xcurrentdir(),str
+ end
+ last=gsub(last,"//","/")
+ last=gsub(last,"/%./","/")
+ last=gsub(last,"^/*","")
+ first=gsub(first,"/*$","")
+ if last=="" or last=="." then
+ return first
+ else
+ return first.."/"..last
end
end
- if not first then
- first,last=dir.current(),str
- end
- last=gsub(last,"//","/")
- last=gsub(last,"/%./","/")
- last=gsub(last,"^/*","")
- first=gsub(first,"/*$","")
- if last=="" or last=="." then
- return first
- else
- return first.."/"..last
- end
- end
-else
- function dir.expandname(str)
- if not find(str,"^/") then
- str=currentdir().."/"..str
+ else
+ function dir.expandname(str)
+ if not find(str,"^/") then
+ str=currentdir().."/"..str
+ end
+ str=gsub(str,"//","/")
+ str=gsub(str,"/%./","/")
+ str=gsub(str,"(.)/%.$","%1")
+ return str
end
- str=gsub(str,"//","/")
- str=gsub(str,"/%./","/")
- str=gsub(str,"(.)/%.$","%1")
- return str
end
end
file.expandname=dir.expandname
@@ -4154,7 +4438,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-boolean"] = package.loaded["l-boolean"] or true
--- original size: 1809, stripped down to: 1527
+-- original size: 1850, stripped down to: 1568
if not modules then modules={} end modules ['l-boolean']={
version=1.001,
@@ -4208,11 +4492,11 @@ function string.booleanstring(str)
return str=="yes" or str=="on" or str=="t"
end
end
-function string.is_boolean(str,default)
+function string.is_boolean(str,default,strict)
if type(str)=="string" then
- if str=="true" or str=="yes" or str=="on" or str=="t" or str=="1" then
+ if str=="true" or str=="yes" or str=="on" or str=="t" or (not strict and str=="1") then
return true
- elseif str=="false" or str=="no" or str=="off" or str=="f" or str=="0" then
+ elseif str=="false" or str=="no" or str=="off" or str=="f" or (not strict and str=="0") then
return false
end
end
@@ -4226,7 +4510,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-unicode"] = package.loaded["l-unicode"] or true
--- original size: 33706, stripped down to: 14938
+-- original size: 37233, stripped down to: 15684
if not modules then modules={} end modules ['l-unicode']={
version=1.001,
@@ -4242,7 +4526,9 @@ local type=type
local char,byte,format,sub,gmatch=string.char,string.byte,string.format,string.sub,string.gmatch
local concat=table.concat
local P,C,R,Cs,Ct,Cmt,Cc,Carg,Cp=lpeg.P,lpeg.C,lpeg.R,lpeg.Cs,lpeg.Ct,lpeg.Cmt,lpeg.Cc,lpeg.Carg,lpeg.Cp
-local lpegmatch,patterns=lpeg.match,lpeg.patterns
+local lpegmatch=lpeg.match
+local patterns=lpeg.patterns
+local tabletopattern=lpeg.utfchartabletopattern
local bytepairs=string.bytepairs
local finder=lpeg.finder
local replacer=lpeg.replacer
@@ -4251,7 +4537,7 @@ local utfgmatch=utf.gmatch
local p_utftype=patterns.utftype
local p_utfstricttype=patterns.utfstricttype
local p_utfoffset=patterns.utfoffset
-local p_utf8char=patterns.utf8char
+local p_utf8char=patterns.utf8character
local p_utf8byte=patterns.utf8byte
local p_utfbom=patterns.utfbom
local p_newline=patterns.newline
@@ -4450,15 +4736,52 @@ if not utf.sub then
end
end
end
-function utf.remapper(mapping)
- local pattern=Cs((p_utf8char/mapping)^0)
- return function(str)
- if not str or str=="" then
- return ""
+function utf.remapper(mapping,option)
+ local variant=type(mapping)
+ if variant=="table" then
+ if option=="dynamic" then
+ local pattern=false
+ table.setmetatablenewindex(mapping,function(t,k,v) rawset(t,k,v) pattern=false end)
+ return function(str)
+ if not str or str=="" then
+ return ""
+ else
+ if not pattern then
+ pattern=Cs((tabletopattern(mapping)/mapping+p_utf8char)^0)
+ end
+ return lpegmatch(pattern,str)
+ end
+ end
+ elseif option=="pattern" then
+ return Cs((tabletopattern(mapping)/mapping+p_utf8char)^0)
else
- return lpegmatch(pattern,str)
+ local pattern=Cs((tabletopattern(mapping)/mapping+p_utf8char)^0)
+ return function(str)
+ if not str or str=="" then
+ return ""
+ else
+ return lpegmatch(pattern,str)
+ end
+ end,pattern
+ end
+ elseif variant=="function" then
+ if option=="pattern" then
+ return Cs((p_utf8char/mapping+p_utf8char)^0)
+ else
+ local pattern=Cs((p_utf8char/mapping+p_utf8char)^0)
+ return function(str)
+ if not str or str=="" then
+ return ""
+ else
+ return lpegmatch(pattern,str)
+ end
+ end,pattern
+ end
+ else
+ return function(str)
+ return str or ""
end
- end,pattern
+ end
end
function utf.replacer(t)
local r=replacer(t,false,false,true)
@@ -4508,190 +4831,157 @@ function utf.magic(f)
end
local utf16_to_utf8_be,utf16_to_utf8_le
local utf32_to_utf8_be,utf32_to_utf8_le
-local utf_16_be_linesplitter=patterns.utfbom_16_be^-1*lpeg.tsplitat(patterns.utf_16_be_nl)
-local utf_16_le_linesplitter=patterns.utfbom_16_le^-1*lpeg.tsplitat(patterns.utf_16_le_nl)
-if bytepairs then
- utf16_to_utf8_be=function(t)
- if type(t)=="string" then
- t=lpegmatch(utf_16_be_linesplitter,t)
- end
- local 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)
- end
- return t
+local utf_16_be_getbom=patterns.utfbom_16_be^-1
+local utf_16_le_getbom=patterns.utfbom_16_le^-1
+local utf_32_be_getbom=patterns.utfbom_32_be^-1
+local utf_32_le_getbom=patterns.utfbom_32_le^-1
+local utf_16_be_linesplitter=utf_16_be_getbom*lpeg.tsplitat(patterns.utf_16_be_nl)
+local utf_16_le_linesplitter=utf_16_le_getbom*lpeg.tsplitat(patterns.utf_16_le_nl)
+local utf_32_be_linesplitter=utf_32_be_getbom*lpeg.tsplitat(patterns.utf_32_be_nl)
+local utf_32_le_linesplitter=utf_32_le_getbom*lpeg.tsplitat(patterns.utf_32_le_nl)
+local more=0
+local p_utf16_to_utf8_be=C(1)*C(1)/function(left,right)
+ local now=256*byte(left)+byte(right)
+ if more>0 then
+ now=(more-0xD800)*0x400+(now-0xDC00)+0x10000
+ more=0
+ return utfchar(now)
+ elseif now>=0xD800 and now<=0xDBFF then
+ more=now
+ return ""
+ else
+ return utfchar(now)
+ end
+end
+local p_utf16_to_utf8_le=C(1)*C(1)/function(right,left)
+ local now=256*byte(left)+byte(right)
+ if more>0 then
+ now=(more-0xD800)*0x400+(now-0xDC00)+0x10000
+ more=0
+ return utfchar(now)
+ elseif now>=0xD800 and now<=0xDBFF then
+ more=now
+ return ""
+ else
+ return utfchar(now)
+ end
+end
+local p_utf32_to_utf8_be=C(1)*C(1)*C(1)*C(1)/function(a,b,c,d)
+ return utfchar(256*256*256*byte(a)+256*256*byte(b)+256*byte(c)+byte(d))
+end
+local p_utf32_to_utf8_le=C(1)*C(1)*C(1)*C(1)/function(a,b,c,d)
+ return utfchar(256*256*256*byte(d)+256*256*byte(c)+256*byte(b)+byte(a))
+end
+p_utf16_to_utf8_be=P(true)/function() more=0 end*utf_16_be_getbom*Cs(p_utf16_to_utf8_be^0)
+p_utf16_to_utf8_le=P(true)/function() more=0 end*utf_16_le_getbom*Cs(p_utf16_to_utf8_le^0)
+p_utf32_to_utf8_be=P(true)/function() more=0 end*utf_32_be_getbom*Cs(p_utf32_to_utf8_be^0)
+p_utf32_to_utf8_le=P(true)/function() more=0 end*utf_32_le_getbom*Cs(p_utf32_to_utf8_le^0)
+patterns.utf16_to_utf8_be=p_utf16_to_utf8_be
+patterns.utf16_to_utf8_le=p_utf16_to_utf8_le
+patterns.utf32_to_utf8_be=p_utf32_to_utf8_be
+patterns.utf32_to_utf8_le=p_utf32_to_utf8_le
+utf16_to_utf8_be=function(s)
+ if s and s~="" then
+ return lpegmatch(p_utf16_to_utf8_be,s)
+ else
+ return s
end
- utf16_to_utf8_le=function(t)
- if type(t)=="string" then
- t=lpegmatch(utf_16_le_linesplitter,t)
- end
- local 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)
- end
- return t
+end
+local utf16_to_utf8_be_t=function(t)
+ if not t then
+ return nil
+ elseif type(t)=="string" then
+ t=lpegmatch(utf_16_be_linesplitter,t)
end
- utf32_to_utf8_be=function(t)
- if type(t)=="string" then
- t=lpegmatch(utflinesplitter,t)
- end
- local result={}
- for i=1,#t do
- local r,more=0,-1
- for a,b in bytepairs(t[i]) do
- if a and b then
- if more<0 then
- more=256*256*256*a+256*256*b
- else
- r=r+1
- result[t]=utfchar(more+256*a+b)
- more=-1
- end
- else
- break
- end
- end
- t[i]=concat(result,"",1,r)
+ for i=1,#t do
+ local s=t[i]
+ if s~="" then
+ t[i]=lpegmatch(p_utf16_to_utf8_be,s)
end
- return t
end
- utf32_to_utf8_le=function(t)
- if type(t)=="string" then
- t=lpegmatch(utflinesplitter,t)
- end
- local result={}
- for i=1,#t do
- local r,more=0,-1
- for a,b in bytepairs(t[i]) do
- if a and b then
- if more<0 then
- more=256*b+a
- else
- r=r+1
- result[t]=utfchar(more+256*256*256*b+256*256*a)
- more=-1
- end
- else
- break
- end
- end
- t[i]=concat(result,"",1,r)
- end
- return t
+ return t
+end
+utf16_to_utf8_le=function(s)
+ if s and s~="" then
+ return lpegmatch(p_utf16_to_utf8_le,s)
+ else
+ return s
end
-else
- utf16_to_utf8_be=function(t)
- if type(t)=="string" then
- t=lpegmatch(utf_16_be_linesplitter,t)
- end
- local result={}
- for i=1,#t do
- local r,more=0,0
- for left,right in gmatch(t[i],"(.)(.)") do
- if left=="\000" then
- r=r+1
- result[r]=utfchar(byte(right))
- elseif right then
- local now=256*byte(left)+byte(right)
- if more>0 then
- now=(more-0xD800)*0x400+(now-0xDC00)+0x10000
- 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)
+end
+local utf16_to_utf8_le_t=function(t)
+ if not t then
+ return nil
+ elseif type(t)=="string" then
+ t=lpegmatch(utf_16_le_linesplitter,t)
+ end
+ for i=1,#t do
+ local s=t[i]
+ if s~="" then
+ t[i]=lpegmatch(p_utf16_to_utf8_le,s)
end
- return t
end
- utf16_to_utf8_le=function(t)
- if type(t)=="string" then
- t=lpegmatch(utf_16_le_linesplitter,t)
+ return t
+end
+utf32_to_utf8_be=function(s)
+ if s and s~="" then
+ return lpegmatch(p_utf32_to_utf8_be,s)
+ else
+ return s
+ end
+end
+local utf32_to_utf8_be_t=function(t)
+ if not t then
+ return nil
+ elseif type(t)=="string" then
+ t=lpegmatch(utf_32_be_linesplitter,t)
+ end
+ for i=1,#t do
+ local s=t[i]
+ if s~="" then
+ t[i]=lpegmatch(p_utf32_to_utf8_be,s)
end
- local result={}
- for i=1,#t do
- local r,more=0,0
- for left,right in gmatch(t[i],"(.)(.)") do
- if right=="\000" then
- r=r+1
- result[r]=utfchar(byte(left))
- elseif right then
- local now=256*byte(right)+byte(left)
- if more>0 then
- now=(more-0xD800)*0x400+(now-0xDC00)+0x10000
- 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)
+ end
+ return t
+end
+utf32_to_utf8_le=function(s)
+ if s and s~="" then
+ return lpegmatch(p_utf32_to_utf8_le,s)
+ else
+ return s
+ end
+end
+local utf32_to_utf8_le_t=function(t)
+ if not t then
+ return nil
+ elseif type(t)=="string" then
+ t=lpegmatch(utf_32_le_linesplitter,t)
+ end
+ for i=1,#t do
+ local s=t[i]
+ if s~="" then
+ t[i]=lpegmatch(p_utf32_to_utf8_le,s)
end
- return t
end
- utf32_to_utf8_le=function() return {} end
- utf32_to_utf8_be=function() return {} end
+ return t
end
+utf.utf16_to_utf8_le_t=utf16_to_utf8_le_t
+utf.utf16_to_utf8_be_t=utf16_to_utf8_be_t
+utf.utf32_to_utf8_le_t=utf32_to_utf8_le_t
+utf.utf32_to_utf8_be_t=utf32_to_utf8_be_t
utf.utf16_to_utf8_le=utf16_to_utf8_le
utf.utf16_to_utf8_be=utf16_to_utf8_be
utf.utf32_to_utf8_le=utf32_to_utf8_le
utf.utf32_to_utf8_be=utf32_to_utf8_be
-function utf.utf8_to_utf8(t)
+function utf.utf8_to_utf8_t(t)
return type(t)=="string" and lpegmatch(utflinesplitter,t) or t
end
-function utf.utf16_to_utf8(t,endian)
- return endian and utf16_to_utf8_be(t) or utf16_to_utf8_le(t) or t
+function utf.utf16_to_utf8_t(t,endian)
+ return endian and utf16_to_utf8_be_t(t) or utf16_to_utf8_le_t(t) or t
end
-function utf.utf32_to_utf8(t,endian)
- return endian and utf32_to_utf8_be(t) or utf32_to_utf8_le(t) or t
+function utf.utf32_to_utf8_t(t,endian)
+ return endian and utf32_to_utf8_be_t(t) or utf32_to_utf8_le_t(t) or t
end
-local function little(c)
- local b=byte(c)
+local function little(b)
if b<0x10000 then
return char(b%256,b/256)
else
@@ -4700,8 +4990,7 @@ local function little(c)
return char(b1%256,b1/256,b2%256,b2/256)
end
end
-local function big(c)
- local b=byte(c)
+local function big(b)
if b<0x10000 then
return char(b/256,b%256)
else
@@ -4710,27 +4999,29 @@ local function big(c)
return char(b1/256,b1%256,b2/256,b2%256)
end
end
-local _,l_remap=utf.remapper(little)
-local _,b_remap=utf.remapper(big)
-function utf.utf8_to_utf16_be(str,nobom)
+local l_remap=Cs((p_utf8byte/little+P(1)/"")^0)
+local b_remap=Cs((p_utf8byte/big+P(1)/"")^0)
+local function utf8_to_utf16_be(str,nobom)
if nobom then
return lpegmatch(b_remap,str)
else
return char(254,255)..lpegmatch(b_remap,str)
end
end
-function utf.utf8_to_utf16_le(str,nobom)
+local function utf8_to_utf16_le(str,nobom)
if nobom then
return lpegmatch(l_remap,str)
else
return char(255,254)..lpegmatch(l_remap,str)
end
end
+utf.utf8_to_utf16_be=utf8_to_utf16_be
+utf.utf8_to_utf16_le=utf8_to_utf16_le
function utf.utf8_to_utf16(str,littleendian,nobom)
if littleendian then
- return utf.utf8_to_utf16_le(str,nobom)
+ return utf8_to_utf16_le(str,nobom)
else
- return utf.utf8_to_utf16_be(str,nobom)
+ return utf8_to_utf16_be(str,nobom)
end
end
local pattern=Cs (
@@ -4746,16 +5037,16 @@ function utf.xstring(s)
return format("0x%05X",type(s)=="number" and s or utfbyte(s))
end
function utf.toeight(str)
- if not str then
+ if not str or str=="" then
return nil
end
local utftype=lpegmatch(p_utfstricttype,str)
if utftype=="utf-8" then
- return sub(str,4)
- elseif utftype=="utf-16-le" then
- return utf16_to_utf8_le(str)
+ return sub(str,4)
elseif utftype=="utf-16-be" then
- return utf16_to_utf8_ne(str)
+ return utf16_to_utf8_be(str)
+ elseif utftype=="utf-16-le" then
+ return utf16_to_utf8_le(str)
else
return str
end
@@ -4834,7 +5125,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-math"] = package.loaded["l-math"] or true
--- original size: 915, stripped down to: 836
+-- original size: 974, stripped down to: 890
if not modules then modules={} end modules ['l-math']={
version=1.001,
@@ -4844,6 +5135,9 @@ if not modules then modules={} end modules ['l-math']={
license="see context related readme files"
}
local floor,sin,cos,tan=math.floor,math.sin,math.cos,math.tan
+if not math.ceiling then
+ math.ceiling=math.ceil
+end
if not math.round then
function math.round(x) return floor(x+0.5) end
end
@@ -4871,7 +5165,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-str"] = package.loaded["util-str"] or true
--- original size: 33063, stripped down to: 18397
+-- original size: 34407, stripped down to: 18852
if not modules then modules={} end modules ['util-str']={
version=1.001,
@@ -5001,10 +5295,12 @@ local striplinepatterns={
["retain"]=p_retain_normal,
["retain and collapse"]=p_retain_collapse,
["retain and no empty"]=p_retain_noempty,
+ ["collapse"]=patterns.collapser,
}
+setmetatable(striplinepatterns,{ __index=function(t,k) return p_prune_collapse end })
strings.striplinepatterns=striplinepatterns
function strings.striplines(str,how)
- return str and lpegmatch(how and striplinepatterns[how] or p_prune_collapse,str) or str
+ return str and lpegmatch(striplinepatterns[how],str) or str
end
strings.striplong=strings.striplines
function strings.nice(str)
@@ -5044,10 +5340,10 @@ string.tracedchars=tracedchars
strings.tracers=tracedchars
function string.tracedchar(b)
if type(b)=="number" then
- return tracedchars[b] or (utfchar(b).." (U+"..format('%05X',b)..")")
+ return tracedchars[b] or (utfchar(b).." (U+"..format("%05X",b)..")")
else
local c=utfbyte(b)
- return tracedchars[c] or (b.." (U+"..format('%05X',c)..")")
+ return tracedchars[c] or (b.." (U+"..(c and format("%05X",c) or "?????")..")")
end
end
function number.signed(i)
@@ -5184,12 +5480,12 @@ local format_f=function(f)
n=n+1
return format("format('%%%sf',a%s)",f,n)
end
-local format_F=function(f)
+local format_F=function(f)
n=n+1
if not f or f=="" then
- return format("(((a%s > -0.0000000005 and a%s < 0.0000000005) and '0') or (a%s == 1 and '1') or format('%%.9f',a%s))",n,n,n,n)
+ return format("(((a%s > -0.0000000005 and a%s < 0.0000000005) and '0') or format((a%s %% 1 == 0) and '%%i' or '%%.9f',a%s))",n,n,n,n)
else
- return format("((a%s == 0 and '0') or (a%s == 1 and '1') or format('%%%sf',a%s))",n,n,f,n)
+ return format("format((a%s %% 1 == 0) and '%%i' or '%%%sf',a%s)",n,f,n)
end
end
local format_g=function(f)
@@ -5417,7 +5713,6 @@ local builder=Cs { "start",
+V("j")+V("J")
+V("m")+V("M")
+V("z")
-+V("*")
)+V("*")
)*(P(-1)+Carg(1))
)^0,
@@ -5461,6 +5756,7 @@ local builder=Cs { "start",
["a"]=(prefix_any*P("a"))/format_a,
["A"]=(prefix_any*P("A"))/format_A,
["*"]=Cs(((1-P("%"))^1+P("%%")/"%%")^1)/format_rest,
+ ["?"]=Cs(((1-P("%"))^1 )^1)/format_rest,
["!"]=Carg(2)*prefix_any*P("!")*C((1-P("!"))^1)*P("!")/format_extension,
}
local direct=Cs (
@@ -5535,6 +5831,15 @@ else
add(formatters,"tex",[[lpegmatch(texescape,%s)]],{ texescape=lpeg.patterns.texescape })
add(formatters,"lua",[[lpegmatch(luaescape,%s)]],{ luaescape=lpeg.patterns.luaescape })
end
+local dquote=patterns.dquote
+local equote=patterns.escaped+dquote/'\\"'+1
+local space=patterns.space
+local cquote=Cc('"')
+local pattern=Cs(dquote*(equote-P(-2))^0*dquote)
++Cs(cquote*(equote-space)^0*space*equote^0*cquote)
+function string.optionalquoted(str)
+ return lpegmatch(pattern,str) or str
+end
end -- of closure
@@ -5543,7 +5848,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tab"] = package.loaded["util-tab"] or true
--- original size: 23985, stripped down to: 16069
+-- original size: 24267, stripped down to: 16260
if not modules then modules={} end modules ['util-tab']={
version=1.001,
@@ -5633,6 +5938,15 @@ function tables.removevalue(t,value)
end
end
end
+function tables.replacevalue(t,oldvalue,newvalue)
+ if oldvalue and newvalue then
+ for i=1,#t do
+ if t[i]==oldvalue then
+ t[i]=newvalue
+ end
+ end
+ end
+end
function tables.insertbeforevalue(t,value,extra)
for i=1,#t do
if t[i]==extra then
@@ -6026,7 +6340,7 @@ function table.serialize(root,name,specification)
end
depth=depth+1
end
- if root and next(root) then
+ if root and next(root)~=nil then
local first=nil
local last=0
last=#root
@@ -6051,7 +6365,7 @@ function table.serialize(root,name,specification)
elseif tv=="string" then
n=n+1 t[n]=f_val_str(depth,v)
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
n=n+1 t[n]=f_val_not(depth)
else
local st=simple_table(v)
@@ -6081,7 +6395,7 @@ function table.serialize(root,name,specification)
n=n+1 t[n]=f_key_boo_value_str(depth,k,v)
end
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
if tk=="number" then
n=n+1 t[n]=f_key_num_value_not(depth,k,v)
elseif tk=="string" then
@@ -6139,7 +6453,7 @@ function table.serialize(root,name,specification)
local dummy=root._w_h_a_t_e_v_e_r_
root._w_h_a_t_e_v_e_r_=nil
end
- if next(root) then
+ if next(root)~=nil then
do_serialize(root,name,1,0)
end
end
@@ -6302,7 +6616,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-prs"] = package.loaded["util-prs"] or true
--- original size: 19618, stripped down to: 14012
+-- original size: 21751, stripped down to: 15108
if not modules then modules={} end modules ['util-prs']={
version=1.001,
@@ -6458,11 +6772,30 @@ function parsers.settings_to_array(str,strict)
return { str }
end
end
-local separator=space^0*comma*space^0
-local value=P(lbrace*C((nobrace+nestedbraces)^0)*rbrace)+C((nestedbraces+(1-(space^0*(comma+P(-1)))))^0)
-local withvalue=Carg(1)*value/function(f,s) return f(s) end
-local pattern_a=spaces*Ct(value*(separator*value)^0)
-local pattern_b=spaces*withvalue*(separator*withvalue)^0
+local cache_a={}
+local cache_b={}
+function parsers.groupedsplitat(symbol,withaction)
+ if not symbol then
+ symbol=","
+ end
+ local pattern=(withaction and cache_b or cache_a)[symbol]
+ if not pattern then
+ local symbols=S(symbol)
+ local separator=space^0*symbols*space^0
+ local value=P(lbrace*C((nobrace+nestedbraces)^0)*rbrace)+C((nestedbraces+(1-(space^0*(symbols+P(-1)))))^0)
+ if withaction then
+ local withvalue=Carg(1)*value/function(f,s) return f(s) end
+ pattern=spaces*withvalue*(separator*withvalue)^0
+ cache_b[symbol]=pattern
+ else
+ pattern=spaces*Ct(value*(separator*value)^0)
+ cache_a[symbol]=pattern
+ end
+ end
+ return pattern
+end
+local pattern_a=parsers.groupedsplitat(",",false)
+local pattern_b=parsers.groupedsplitat(",",true)
function parsers.stripped_settings_to_array(str)
if not str or str=="" then
return {}
@@ -6524,12 +6857,9 @@ function parsers.array_to_string(a,separator)
return ""
end
end
-function parsers.settings_to_set(str,t)
- t=t or {}
- for s in gmatch(str,"[^, ]+") do
- t[s]=true
- end
- return t
+local pattern=Cf(Ct("")*Cg(C((1-S(", "))^1)*S(", ")^0*Cc(true))^1,rawset)
+function utilities.parsers.settings_to_set(str,t)
+ return str and lpegmatch(pattern,str) or {}
end
function parsers.simple_hash_to_string(h,separator)
local t,tn={},0
@@ -6541,12 +6871,16 @@ function parsers.simple_hash_to_string(h,separator)
end
return concat(t,separator or ",")
end
-local str=C((1-whitespace-equal)^1)
+local str=Cs(lpegpatterns.unquoted)+C((1-whitespace-equal)^1)
local setting=Cf(Carg(1)*(whitespace^0*Cg(str*whitespace^0*(equal*whitespace^0*str+Cc(""))))^1,rawset)
local splitter=setting^1
function utilities.parsers.options_to_hash(str,target)
return str and lpegmatch(splitter,str,1,target or {}) or {}
end
+local splitter=lpeg.tsplitat(" ")
+function utilities.parsers.options_to_array(str)
+ return str and lpegmatch(splitter,str) or {}
+end
local value=P(lbrace*C((nobrace+nestedbraces)^0)*rbrace)+C(digit^1*lparent*(noparent+nestedparents)^1*rparent)+C((nestedbraces+(1-comma))^1)
local pattern_a=spaces*Ct(value*(separator*value)^0)
local function repeater(n,str)
@@ -6668,7 +7002,7 @@ function parsers.rfc4180splitter(specification)
local field=escaped+non_escaped+Cc("")
local record=Ct(field*(separator*field)^1)
local headerline=record*Cp()
- local wholeblob=Ct((newline^-1*record)^0)
+ local wholeblob=Ct((newline^(specification.strict and -1 or 1)*record)^0)
return function(data,getheader)
if getheader then
local header,position=lpegmatch(headerline,data)
@@ -6705,13 +7039,13 @@ function parsers.stepper(str,n,action)
lpegmatch(stepper,str,1,n,action or print)
end
end
-local pattern_math=Cs((P("%")/"\\percent "+P("^")*Cc("{")*lpegpatterns.integer*Cc("}")+P(1))^0)
-local pattern_text=Cs((P("%")/"\\percent "+(P("^")/"\\high")*Cc("{")*lpegpatterns.integer*Cc("}")+P(1))^0)
+local pattern_math=Cs((P("%")/"\\percent "+P("^")*Cc("{")*lpegpatterns.integer*Cc("}")+anything)^0)
+local pattern_text=Cs((P("%")/"\\percent "+(P("^")/"\\high")*Cc("{")*lpegpatterns.integer*Cc("}")+anything)^0)
patterns.unittotex=pattern
function parsers.unittotex(str,textmode)
return lpegmatch(textmode and pattern_text or pattern_math,str)
end
-local pattern=Cs((P("^")/"<sup>"*lpegpatterns.integer*Cc("</sup>")+P(1))^0)
+local pattern=Cs((P("^")/"<sup>"*lpegpatterns.integer*Cc("</sup>")+anything)^0)
function parsers.unittoxml(str)
return lpegmatch(pattern,str)
end
@@ -6783,6 +7117,18 @@ function utilities.parsers.runtime(time)
local seconds=mod(time,60)
return days,hours,minutes,seconds
end
+local spacing=whitespace^0
+local apply=P("->")
+local method=C((1-apply)^1)
+local token=lbrace*C((1-rbrace)^1)*rbrace+C(anything^1)
+local pattern=spacing*(method*spacing*apply+Carg(1))*spacing*token
+function utilities.parsers.splitmethod(str,default)
+ if str then
+ return lpegmatch(pattern,str,1,default or false)
+ else
+ return default or false,""
+ end
+end
end -- of closure
@@ -6872,7 +7218,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-set"] = package.loaded["trac-set"] or true
--- original size: 12365, stripped down to: 8799
+-- original size: 12482, stripped down to: 8864
if not modules then modules={} end modules ['trac-set']={
version=1.001,
@@ -6900,7 +7246,7 @@ function setters.initialize(filename,name,values)
local data=setter.data
if data then
for key,newvalue in next,values do
- local newvalue=is_boolean(newvalue,newvalue)
+ local newvalue=is_boolean(newvalue,newvalue,true)
local functions=data[key]
if functions then
local oldvalue=functions.value
@@ -6954,7 +7300,7 @@ local function set(t,what,newvalue)
elseif not value then
value=false
else
- value=is_boolean(value,value)
+ value=is_boolean(value,value,true)
end
w=topattern(w,true,true)
for name,functions in next,data do
@@ -7093,6 +7439,7 @@ function setters.new(name)
report=function(...) setters.report (setter,...) end,
enable=function(...) enable (setter,...) end,
disable=function(...) disable (setter,...) end,
+ reset=function(...) reset (setter,...) end,
register=function(...) register(setter,...) end,
list=function(...) list (setter,...) end,
show=function(...) show (setter,...) end,
@@ -7184,7 +7531,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-log"] = package.loaded["trac-log"] or true
--- original size: 25613, stripped down to: 16617
+-- original size: 29359, stripped down to: 20483
if not modules then modules={} end modules ['trac-log']={
version=1.001,
@@ -7193,15 +7540,18 @@ if not modules then modules={} end modules ['trac-log']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local next,type,select,print=next,type,select,print
local write_nl,write=texio and texio.write_nl or print,texio and texio.write or io.write
local format,gmatch,find=string.format,string.gmatch,string.find
local concat,insert,remove=table.concat,table.insert,table.remove
local topattern=string.topattern
-local next,type,select=next,type,select
local utfchar=utf.char
+local datetime=os.date
+local openfile=io.open
local setmetatableindex=table.setmetatableindex
local formatters=string.formatters
local texgetcount=tex and tex.getcount
+local variant="default"
logs=logs or {}
local logs=logs
local moreinfo=[[
@@ -7211,32 +7561,122 @@ 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
]]
-utilities.strings.formatters.add (
+formatters.add (
formatters,"unichr",
[["U+" .. format("%%05X",%s) .. " (" .. utfchar(%s) .. ")"]]
)
-utilities.strings.formatters.add (
+formatters.add (
formatters,"chruni",
[[utfchar(%s) .. " (U+" .. format("%%05X",%s) .. ")"]]
)
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,setlogfile,settimedlog,setprocessor,setformatters
+local direct,subdirect,writer,pushtarget,poptarget,setlogfile,settimedlog,setprocessor,setformatters,newline
if tex and (tex.jobname or tex.formatname) then
- local valueiskey={ __index=function(t,k) t[k]=k return k end }
- local target="term and log"
+ local function useluawrites()
+ local texio_write_nl=texio.write_nl
+ local texio_write=texio.write
+ local io_write=io.write
+ write_nl=function(target,...)
+ if not io_write then
+ io_write=io.write
+ end
+ if target=="term and log" then
+ texio_write_nl("log",...)
+ texio_write_nl("term","")
+ io_write(...)
+ elseif target=="log" then
+ texio_write_nl("log",...)
+ elseif target=="term" then
+ texio_write_nl("term","")
+ io_write(...)
+ elseif target~="none" then
+ texio_write_nl("log",target,...)
+ texio_write_nl("term","")
+ io_write(target,...)
+ end
+ end
+ write=function(target,...)
+ if not io_write then
+ io_write=io.write
+ end
+ if target=="term and log" then
+ texio_write("log",...)
+ io_write(...)
+ elseif target=="log" then
+ texio_write("log",...)
+ elseif target=="term" then
+ io_write(...)
+ elseif target~="none" then
+ texio_write("log",target,...)
+ io_write(target,...)
+ end
+ end
+ texio.write=write
+ texio.write_nl=write_nl
+ useluawrites=ignore
+ end
+ local whereto="both"
+ local target=nil
+ local targets=nil
+ local formats=table.setmetatableindex("self")
+ local translations=table.setmetatableindex("self")
+ local report_yes,subreport_yes,direct_yes,subdirect_yes,status_yes
+ local report_nop,subreport_nop,direct_nop,subdirect_nop,status_nop
+ local variants={
+ default={
+ formats={
+ report_yes=formatters["%-15s > %s\n"],
+ report_nop=formatters["%-15s >\n"],
+ direct_yes=formatters["%-15s > %s"],
+ direct_nop=formatters["%-15s >"],
+ subreport_yes=formatters["%-15s > %s > %s\n"],
+ subreport_nop=formatters["%-15s > %s >\n"],
+ subdirect_yes=formatters["%-15s > %s > %s"],
+ subdirect_nop=formatters["%-15s > %s >"],
+ status_yes=formatters["%-15s : %s\n"],
+ status_nop=formatters["%-15s :\n"],
+ },
+ targets={
+ logfile="log",
+ log="log",
+ file="log",
+ console="term",
+ terminal="term",
+ both="term and log",
+ },
+ },
+ ansi={
+ formats={
+ report_yes=formatters["%-15s > %s\n"],
+ report_nop=formatters["%-15s >\n"],
+ direct_yes=formatters["%-15s > %s"],
+ direct_nop=formatters["%-15s >"],
+ subreport_yes=formatters["%-15s > %s > %s\n"],
+ subreport_nop=formatters["%-15s > %s >\n"],
+ subdirect_yes=formatters["%-15s > %s > %s"],
+ subdirect_nop=formatters["%-15s > %s >"],
+ status_yes=formatters["%-15s : %s\n"],
+ status_nop=formatters["%-15s :\n"],
+ },
+ targets={
+ logfile="none",
+ log="none",
+ file="none",
+ console="term",
+ terminal="term",
+ both="term",
+ },
+ }
+ }
logs.flush=io.flush
- local formats={} setmetatable(formats,valueiskey)
- local translations={} setmetatable(translations,valueiskey)
writer=function(...)
write_nl(target,...)
end
newline=function()
write_nl(target,"\n")
end
- local report_yes=formatters["%-15s > %s\n"]
- local report_nop=formatters["%-15s >\n"]
report=function(a,b,c,...)
if c then
write_nl(target,report_yes(translations[a],formatters[formats[b]](c,...)))
@@ -7248,8 +7688,6 @@ if tex and (tex.jobname or tex.formatname) then
write_nl(target,"\n")
end
end
- local direct_yes=formatters["%-15s > %s"]
- local direct_nop=formatters["%-15s >"]
direct=function(a,b,c,...)
if c then
return direct_yes(translations[a],formatters[formats[b]](c,...))
@@ -7261,8 +7699,6 @@ if tex and (tex.jobname or tex.formatname) then
return ""
end
end
- local subreport_yes=formatters["%-15s > %s > %s\n"]
- local subreport_nop=formatters["%-15s > %s >\n"]
subreport=function(a,s,b,c,...)
if c then
write_nl(target,subreport_yes(translations[a],translations[s],formatters[formats[b]](c,...)))
@@ -7274,8 +7710,6 @@ if tex and (tex.jobname or tex.formatname) then
write_nl(target,"\n")
end
end
- local subdirect_yes=formatters["%-15s > %s > %s"]
- local subdirect_nop=formatters["%-15s > %s >"]
subdirect=function(a,s,b,c,...)
if c then
return subdirect_yes(translations[a],translations[s],formatters[formats[b]](c,...))
@@ -7287,8 +7721,6 @@ if tex and (tex.jobname or tex.formatname) then
return ""
end
end
- local status_yes=formatters["%-15s : %s\n"]
- local status_nop=formatters["%-15s :\n"]
status=function(a,b,c,...)
if c then
write_nl(target,status_yes(translations[a],formatters[formats[b]](c,...)))
@@ -7300,16 +7732,13 @@ if tex and (tex.jobname or tex.formatname) then
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
+ settarget=function(askedwhereto)
+ whereto=askedwhereto or whereto or "both"
+ target=targets[whereto]
+ if not target then
+ whereto="both"
+ target=targets[whereto]
+ end
if target=="term" or target=="term and log" then
logs.flush=io.flush
else
@@ -7338,21 +7767,74 @@ if tex and (tex.jobname or tex.formatname) then
writeline(target,f(...))
end
end
- setformatters=function(f)
- report_yes=f.report_yes or report_yes
- report_nop=f.report_nop or report_nop
- subreport_yes=f.subreport_yes or subreport_yes
- subreport_nop=f.subreport_nop or subreport_nop
- direct_yes=f.direct_yes or direct_yes
- direct_nop=f.direct_nop or direct_nop
- subdirect_yes=f.subdirect_yes or subdirect_yes
- subdirect_nop=f.subdirect_nop or subdirect_nop
- status_yes=f.status_yes or status_yes
- status_nop=f.status_nop or status_nop
- end
+ setformatters=function(specification)
+ local t=nil
+ local f=nil
+ local d=variants.default
+ if not specification then
+ elseif type(specification)=="table" then
+ t=specification.targets
+ f=specification.formats or specification
+ else
+ local v=variants[specification]
+ if v then
+ t=v.targets
+ f=v.formats
+ variant=specification
+ end
+ end
+ targets=t or d.targets
+ target=targets[whereto] or target
+ if f then
+ d=d.formats
+ else
+ f=d.formats
+ d=f
+ end
+ setmetatableindex(f,d)
+ report_yes=f.report_yes
+ report_nop=f.report_nop
+ subreport_yes=f.subreport_yes
+ subreport_nop=f.subreport_nop
+ direct_yes=f.direct_yes
+ direct_nop=f.direct_nop
+ subdirect_yes=f.subdirect_yes
+ subdirect_nop=f.subdirect_nop
+ status_yes=f.status_yes
+ status_nop=f.status_nop
+ if variant=="ansi" then
+ useluawrites()
+ end
+ settarget(whereto)
+ end
+ setformatters(variant)
setlogfile=ignore
settimedlog=ignore
else
+ local report_yes,subreport_yes,status_yes
+ local report_nop,subreport_nop,status_nop
+ local variants={
+ default={
+ formats={
+ report_yes=formatters["%-15s | %s"],
+ report_nop=formatters["%-15s |"],
+ subreport_yes=formatters["%-15s | %s | %s"],
+ subreport_nop=formatters["%-15s | %s |"],
+ status_yes=formatters["%-15s : %s\n"],
+ status_nop=formatters["%-15s :\n"],
+ },
+ },
+ ansi={
+ formats={
+ report_yes=formatters["%-15s | %s"],
+ report_nop=formatters["%-15s |"],
+ subreport_yes=formatters["%-15s | %s | %s"],
+ subreport_nop=formatters["%-15s | %s |"],
+ status_yes=formatters["%-15s : %s\n"],
+ status_nop=formatters["%-15s :\n"],
+ },
+ },
+ }
logs.flush=ignore
writer=function(s)
write_nl(s)
@@ -7360,8 +7842,6 @@ else
newline=function()
write_nl("\n")
end
- local report_yes=formatters["%-15s | %s"]
- local report_nop=formatters["%-15s |"]
report=function(a,b,c,...)
if c then
write_nl(report_yes(a,formatters[b](c,...)))
@@ -7373,8 +7853,6 @@ else
write_nl("")
end
end
- local subreport_yes=formatters["%-15s | %s | %s"]
- local subreport_nop=formatters["%-15s | %s |"]
subreport=function(a,sub,b,c,...)
if c then
write_nl(subreport_yes(a,sub,formatters[b](c,...)))
@@ -7386,8 +7864,6 @@ else
write_nl("")
end
end
- local status_yes=formatters["%-15s : %s\n"]
- local status_nop=formatters["%-15s :\n"]
status=function(a,b,c,...)
if c then
write_nl(status_yes(a,formatters[b](c,...)))
@@ -7412,14 +7888,34 @@ else
writeline(f(s))
end
end
- setformatters=function(f)
- report_yes=f.report_yes or report_yes
- report_nop=f.report_nop or report_nop
- subreport_yes=f.subreport_yes or subreport_yes
- subreport_nop=f.subreport_nop or subreport_nop
- status_yes=f.status_yes or status_yes
- status_nop=f.status_nop or status_nop
- end
+ setformatters=function(specification)
+ local f=nil
+ local d=variants.default
+ if specification then
+ if type(specification)=="table" then
+ f=specification.formats or specification
+ else
+ local v=variants[specification]
+ if v then
+ f=v.formats
+ end
+ end
+ end
+ if f then
+ d=d.formats
+ else
+ f=d.formats
+ d=f
+ end
+ setmetatableindex(f,d)
+ report_yes=f.report_yes
+ report_nop=f.report_nop
+ subreport_yes=f.subreport_yes
+ subreport_nop=f.subreport_nop
+ status_yes=f.status_yes
+ status_nop=f.status_nop
+ end
+ setformatters(variant)
setlogfile=function(name,keepopen)
if name and name~="" then
local localtime=os.localtime
@@ -7672,13 +8168,13 @@ end
local simple=logs.reporter("comment")
logs.simple=simple
logs.simpleline=simple
-function logs.setprogram () end
-function logs.extendbanner() end
-function logs.reportlines () end
-function logs.reportbanner() end
-function logs.reportline () end
-function logs.simplelines () end
-function logs.help () end
+logs.setprogram=ignore
+logs.extendbanner=ignore
+logs.reportlines=ignore
+logs.reportbanner=ignore
+logs.reportline=ignore
+logs.simplelines=ignore
+logs.help=ignore
local Carg,C,lpegmatch=lpeg.Carg,lpeg.C,lpeg.match
local p_newline=lpeg.patterns.newline
local linewise=(
@@ -7755,10 +8251,11 @@ function logs.application(t)
end
return t
end
-function logs.system(whereto,process,jobname,category,...)
- local message=formatters["%s %s => %s => %s => %s\r"](os.date("%d/%m/%y %H:%m:%S"),process,jobname,category,format(...))
+local f_syslog=formatters["%s %s => %s => %s => %s\r"]
+function logs.system(whereto,process,jobname,category,fmt,arg,...)
+ local message=f_syslog(datetime("%d/%m/%y %H:%m:%S"),process,jobname,category,arg==nil and fmt or format(fmt,arg,...))
for i=1,10 do
- local f=io.open(whereto,"a")
+ local f=openfile(whereto,"a")
if f then
f:write(message)
f:close()
@@ -7820,7 +8317,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-inf"] = package.loaded["trac-inf"] or true
--- original size: 7011, stripped down to: 5590
+-- original size: 6704, stripped down to: 5343
if not modules then modules={} end modules ['trac-inf']={
version=1.001,
@@ -7993,15 +8490,6 @@ function statistics.tracefunction(base,tag,...)
statistics.register(formatters["%s.%s"](tag,name),function() return serialize(stat,"calls") end)
end
end
-commands=commands or {}
-function commands.resettimer(name)
- resettiming(name or "whatever")
- starttiming(name or "whatever")
-end
-function commands.elapsedtime(name)
- stoptiming(name or "whatever")
- context(elapsedtime(name or "whatever"))
-end
end -- of closure
@@ -8568,7 +9056,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tpl"] = package.loaded["util-tpl"] or true
--- original size: 6251, stripped down to: 3488
+-- original size: 7100, stripped down to: 3978
if not modules then modules={} end modules ['util-tpl']={
version=1.001,
@@ -8610,7 +9098,7 @@ local sqlescape=lpeg.replacer {
{ "\r\n","\\n" },
{ "\r","\\n" },
}
-local sqlquoted=lpeg.Cs(lpeg.Cc("'")*sqlescape*lpeg.Cc("'"))
+local sqlquoted=Cs(Cc("'")*sqlescape*Cc("'"))
lpegpatterns.sqlescape=sqlescape
lpegpatterns.sqlquoted=sqlquoted
local luaescape=lpegpatterns.luaescape
@@ -8633,12 +9121,24 @@ local quotedescapers={
local luaescaper=escapers.lua
local quotedluaescaper=quotedescapers.lua
local function replacekeyunquoted(s,t,how,recurse)
- local escaper=how and escapers[how] or luaescaper
- return escaper(replacekey(s,t,how,recurse))
+ if how==false then
+ return replacekey(s,t,how,recurse)
+ else
+ local escaper=how and escapers[how] or luaescaper
+ return escaper(replacekey(s,t,how,recurse))
+ end
end
local function replacekeyquoted(s,t,how,recurse)
- local escaper=how and quotedescapers[how] or quotedluaescaper
- return escaper(replacekey(s,t,how,recurse))
+ if how==false then
+ return replacekey(s,t,how,recurse)
+ else
+ local escaper=how and quotedescapers[how] or quotedluaescaper
+ return escaper(replacekey(s,t,how,recurse))
+ end
+end
+local function replaceoptional(l,m,r,t,how,recurse)
+ local v=t[l]
+ return v and v~="" and lpegmatch(replacer,r,1,t,how or "lua",recurse or false) or ""
end
local single=P("%")
local double=P("%%")
@@ -8653,11 +9153,16 @@ local nolquoted=lquoted/''
local norquoted=rquoted/''
local nolquotedq=lquotedq/''
local norquotedq=rquotedq/''
-local key=nosingle*((C((1-nosingle )^1)*Carg(1)*Carg(2)*Carg(3))/replacekey )*nosingle
-local quoted=nolquotedq*((C((1-norquotedq)^1)*Carg(1)*Carg(2)*Carg(3))/replacekeyquoted )*norquotedq
-local unquoted=nolquoted*((C((1-norquoted )^1)*Carg(1)*Carg(2)*Carg(3))/replacekeyunquoted)*norquoted
+local noloptional=P("%?")/''
+local noroptional=P("?%")/''
+local nomoptional=P(":")/''
+local args=Carg(1)*Carg(2)*Carg(3)
+local key=nosingle*((C((1-nosingle )^1)*args)/replacekey )*nosingle
+local quoted=nolquotedq*((C((1-norquotedq )^1)*args)/replacekeyquoted )*norquotedq
+local unquoted=nolquoted*((C((1-norquoted )^1)*args)/replacekeyunquoted)*norquoted
+local optional=noloptional*((C((1-nomoptional)^1)*nomoptional*C((1-noroptional)^1)*args)/replaceoptional)*noroptional
local any=P(1)
- replacer=Cs((unquoted+quoted+escape+key+any)^0)
+ replacer=Cs((unquoted+quoted+escape+optional+key+any)^0)
local function replace(str,mapping,how,recurse)
if mapping and str then
return lpegmatch(replacer,str,1,mapping,how or "lua",recurse or false) or str
@@ -8696,7 +9201,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-env"] = package.loaded["util-env"] or true
--- original size: 8814, stripped down to: 5092
+-- original size: 8022, stripped down to: 5038
if not modules then modules={} end modules ['util-env']={
version=1.001,
@@ -8707,7 +9212,7 @@ if not modules then modules={} end modules ['util-env']={
}
local allocate,mark=utilities.storage.allocate,utilities.storage.mark
local format,sub,match,gsub,find=string.format,string.sub,string.match,string.gsub,string.find
-local unquoted,quoted=string.unquoted,string.quoted
+local unquoted,quoted,optionalquoted=string.unquoted,string.quoted,string.optionalquoted
local concat,insert,remove=table.concat,table.insert,table.remove
environment=environment or {}
local environment=environment
@@ -8820,24 +9325,14 @@ function environment.splitarguments(separator)
return before,after
end
function environment.reconstructcommandline(arg,noquote)
+ local resolveprefix=resolvers.resolve
arg=arg or environment.originalarguments
if noquote and #arg==1 then
- local a=arg[1]
- a=resolvers.resolve(a)
- a=unquoted(a)
- return a
+ return unquoted(resolveprefix and resolveprefix(arg[1]) or arg[1])
elseif #arg>0 then
local result={}
for i=1,#arg do
- local a=arg[i]
- a=resolvers.resolve(a)
- a=unquoted(a)
- a=gsub(a,'"','\\"')
- if find(a," ",1,true) then
- result[#result+1]=quoted(a)
- else
- result[#result+1]=a
- end
+ result[i]=optionalquoted(resolveprefix and resolveprefix(arg[i]) or resolveprefix)
end
return concat(result," ")
else
@@ -9046,7 +9541,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-tab"] = package.loaded["lxml-tab"] or true
--- original size: 42614, stripped down to: 26694
+-- original size: 43882, stripped down to: 26870
if not modules then modules={} end modules ['lxml-tab']={
version=1.001,
@@ -9061,10 +9556,10 @@ if lpeg.setmaxstack then lpeg.setmaxstack(1000) end
xml=xml or {}
local xml=xml
local concat,remove,insert=table.concat,table.remove,table.insert
-local type,next,setmetatable,getmetatable,tonumber=type,next,setmetatable,getmetatable,tonumber
+local type,next,setmetatable,getmetatable,tonumber,rawset=type,next,setmetatable,getmetatable,tonumber,rawset
local lower,find,match,gsub=string.lower,string.find,string.match,string.gsub
local utfchar=utf.char
-local lpegmatch=lpeg.match
+local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns
local P,S,R,C,V,C,Cs=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.V,lpeg.C,lpeg.Cs
local formatters=string.formatters
xml.xmlns=xml.xmlns or {}
@@ -9226,9 +9721,10 @@ local function fromdec(s)
return formatters["d:%s"](s),true
end
end
-local rest=(1-P(";"))^0
-local many=P(1)^0
-local parsedentity=P("&")*(P("#x")*(rest/fromhex)+P("#")*(rest/fromdec))*P(";")*P(-1)+(P("#x")*(many/fromhex)+P("#")*(many/fromdec))
+local p_rest=(1-P(";"))^0
+local p_many=P(1)^0
+local p_char=lpegpatterns.utf8character
+local parsedentity=P("&")*(P("#x")*(p_rest/fromhex)+P("#")*(p_rest/fromdec))*P(";")*P(-1)+(P("#x")*(p_many/fromhex)+P("#")*(p_many/fromdec))
local predefined_unified={
[38]="&amp;",
[42]="&quot;",
@@ -9254,7 +9750,9 @@ local privates_u={
local privates_p={}
local privates_n={
}
-local escaped=utf.remapper(privates_u)
+local escaped=utf.remapper(privates_u,"dynamic")
+local unprivatized=utf.remapper(privates_p,"dynamic")
+xml.unprivatized=unprivatized
local function unescaped(s)
local p=privates_n[s]
if not p then
@@ -9267,9 +9765,7 @@ local function unescaped(s)
end
return p
end
-local unprivatized=utf.remapper(privates_p)
xml.privatetoken=unescaped
-xml.unprivatized=unprivatized
xml.privatecodes=privates_n
local function handle_hex_entity(str)
local h=hcache[str]
@@ -9422,7 +9918,7 @@ local valid=R('az','AZ','09')+S('_-.')
local name_yes=C(valid^1)*colon*C(valid^1)
local name_nop=C(P(true))*C(valid^1)
local name=name_yes+name_nop
-local utfbom=lpeg.patterns.utfbom
+local utfbom=lpegpatterns.utfbom
local spacing=C(space^0)
local anyentitycontent=(1-open-semicolon-space-close)^0
local hexentitycontent=R("AF","af","09")^0
@@ -9590,7 +10086,7 @@ local function _xmlconvert_(data,settings)
reported_attribute_errors,mt,errorhandler=nil,nil,nil
return result
end
-function xmlconvert(data,settings)
+local function xmlconvert(data,settings)
local ok,result=pcall(function() return _xmlconvert_(data,settings) end)
if ok then
return result
@@ -9682,14 +10178,17 @@ function xml.checkbom(root)
insert(dt,2,"\n" )
end
end
-local function verbose_element(e,handlers)
+local f_attribute=formatters['%s=%q']
+local function verbose_element(e,handlers,escape)
local handle=handlers.handle
local serialize=handlers.serialize
local ens,etg,eat,edt,ern=e.ns,e.tg,e.at,e.dt,e.rn
local ats=eat and next(eat) and {}
if ats then
+ local n=0
for k,v in next,eat do
- ats[#ats+1]=formatters['%s=%q'](k,escaped(v))
+ n=n+1
+ ats[n]=f_attribute(k,escaped(v))
end
end
if ern and trace_entities and ern~=ens then
@@ -10033,7 +10532,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-lpt"] = package.loaded["lxml-lpt"] or true
--- original size: 48030, stripped down to: 30595
+-- original size: 48229, stripped down to: 30684
if not modules then modules={} end modules ['lxml-lpt']={
version=1.001,
@@ -10418,8 +10917,8 @@ 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")+S("-_:"))^1)*Cc("'])")
-lp_fastpos_p=P("+")^0*R("09")^1*P(-1)/"l==%0"
-lp_fastpos_n=P("-")*R("09")^1*P(-1)/"(%0<0 and (#list+%0==l))"
+local lp_fastpos_p=P("+")^0*R("09")^1*P(-1)/"l==%0"
+local lp_fastpos_n=P("-")*R("09")^1*P(-1)/"(%0<0 and (#list+%0==l))"
local lp_fastpos=lp_fastpos_n+lp_fastpos_p
local lp_reserved=C("and")+C("or")+C("not")+C("div")+C("mod")+C("true")+C("false")
local lp_lua_function=Cs((R("az","AZ","__")^1*(P(".")*R("az","AZ","__")^1)^1)*("("))/"%0"
@@ -10598,7 +11097,7 @@ local function nodesettostring(set,nodetest)
if not ns or ns=="" then ns="*" end
if not tg or tg=="" then tg="*" end
tg=(tg=="@rt@" and "[root]") or format("%s:%s",ns,tg)
- t[i]=(directive and tg) or format("not(%s)",tg)
+ t[#t+1]=(directive and tg) or format("not(%s)",tg)
end
if nodetest==false then
return format("not(%s)",concat(t,"|"))
@@ -10864,7 +11363,6 @@ expressions.print=function(...)
print(...)
return true
end
-expressions.contains=find
expressions.find=find
expressions.upper=upper
expressions.lower=lower
@@ -10886,6 +11384,9 @@ function expressions.contains(str,pattern)
end
return false
end
+function xml.expressions.idstring(str)
+ return type(str)=="string" and gsub(str,"^#","") or ""
+end
local function traverse(root,pattern,handle)
local collected=applylpath(root,pattern)
if collected then
@@ -11173,7 +11674,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-aux"] = package.loaded["lxml-aux"] or true
--- original size: 23804, stripped down to: 16817
+-- original size: 28225, stripped down to: 20125
if not modules then modules={} end modules ['lxml-aux']={
version=1.001,
@@ -11183,16 +11684,19 @@ if not modules then modules={} end modules ['lxml-aux']={
license="see context related readme files"
}
local trace_manipulations=false trackers.register("lxml.manipulations",function(v) trace_manipulations=v end)
+local trace_inclusions=false trackers.register("lxml.inclusions",function(v) trace_inclusions=v end)
local report_xml=logs.reporter("xml")
local xml=xml
-local xmlconvert,xmlcopy,xmlname=xml.convert,xml.copy,xml.name
+local xmlcopy,xmlname=xml.copy,xml.name
local xmlinheritedconvert=xml.inheritedconvert
local xmlapplylpath=xml.applylpath
local xmlfilter=xml.filter
-local type,setmetatable,getmetatable=type,setmetatable,getmetatable
+local type,next,setmetatable,getmetatable=type,next,setmetatable,getmetatable
local insert,remove,fastcopy,concat=table.insert,table.remove,table.fastcopy,table.concat
local gmatch,gsub,format,find,strip=string.gmatch,string.gsub,string.format,string.find,string.strip
local utfbyte=utf.byte
+local lpegmatch=lpeg.match
+local striplinepatterns=utilities.strings.striplinepatterns
local function report(what,pattern,c,e)
report_xml("%s element %a, root %a, position %a, index %a, pattern %a",what,xmlname(e),xmlname(e.__p__),c,e.ni,pattern)
end
@@ -11247,13 +11751,15 @@ end
function xml.each(root,pattern,handle,reverse)
local collected=xmlapplylpath(root,pattern)
if collected then
- if reverse then
- for c=#collected,1,-1 do
- handle(collected[c])
- end
- else
- for c=1,#collected do
- handle(collected[c])
+ if handle then
+ if reverse then
+ for c=#collected,1,-1 do
+ handle(collected[c])
+ end
+ else
+ for c=1,#collected do
+ handle(collected[c])
+ end
end
end
return collected
@@ -11309,6 +11815,7 @@ local function redo_ni(d)
end
end
end
+xml.reindex=redo_ni
local function xmltoelement(whatever,root)
if not whatever then
return nil
@@ -11360,8 +11867,16 @@ function xml.delete(root,pattern)
report('deleting',pattern,c,e)
end
local d=p.dt
- remove(d,e.ni)
- redo_ni(d)
+ local ni=e.ni
+ if ni<=#d then
+ if false then
+ p.dt[ni]=""
+ else
+ remove(d,ni)
+ redo_ni(d)
+ end
+ else
+ end
end
end
end
@@ -11481,28 +11996,40 @@ 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)
+local function include(xmldata,pattern,attribute,recursive,loaddata,level)
pattern=pattern or 'include'
loaddata=loaddata or io.loaddata
local collected=xmlapplylpath(xmldata,pattern)
if collected then
+ if not level then
+ level=1
+ end
for c=1,#collected do
local ek=collected[c]
local name=nil
local ekdt=ek.dt
local ekat=ek.at
- local epdt=ek.__p__.dt
+ local ekrt=ek.__p__
+ local epdt=ekrt.dt
if not attribute or attribute=="" then
name=(type(ekdt)=="table" and ekdt[1]) or ekdt
end
if not name then
for a in gmatch(attribute or "href","([^|]+)") do
name=ekat[a]
- if name then break end
+ if name then
+ break
+ end
+ end
+ end
+ local data=nil
+ if name and name~="" then
+ data=loaddata(name) or ""
+ if trace_inclusions then
+ report_xml("including %s bytes from %a at level %s by pattern %a and attribute %a (%srecursing)",#data,name,level,pattern,attribute or "",recursive and "" or "not ")
end
end
- local data=(name and name~="" and loaddata(name)) or ""
- if data=="" then
+ if not data or data=="" then
epdt[ek.ni]=""
elseif ekat["parse"]=="text" then
epdt[ek.ni]=xml.escaped(data)
@@ -11512,70 +12039,113 @@ local function include(xmldata,pattern,attribute,recursive,loaddata)
epdt[ek.ni]=""
else
if recursive then
- include(xi,pattern,attribute,recursive,loaddata)
+ include(xi,pattern,attribute,recursive,loaddata,level+1)
+ end
+ local child=xml.body(xi)
+ child.__p__=ekrt
+ child.__f__=name
+ epdt[ek.ni]=child
+ local inclusions=xmldata.settings.inclusions
+ if inclusions then
+ inclusions[#inclusions+1]=name
+ else
+ xmldata.settings.inclusions={ name }
end
- epdt[ek.ni]=xml.body(xi)
end
end
end
end
end
xml.include=include
+function xml.inclusion(e,default)
+ while e do
+ local f=e.__f__
+ if f then
+ return f
+ else
+ e=e.__p__
+ end
+ end
+ return default
+end
+function xml.inclusions(e,sorted)
+ while e do
+ local settings=e.settings
+ if settings then
+ local inclusions=settings.inclusions
+ if inclusions then
+ inclusions=table.unique(inclusions)
+ if sorted then
+ table.sort(inclusions)
+ end
+ return inclusions
+ else
+ e=e.__p__
+ end
+ else
+ e=e.__p__
+ end
+ end
+end
+local b_collapser=lpeg.patterns.b_collapser
+local m_collapser=lpeg.patterns.m_collapser
+local e_collapser=lpeg.patterns.e_collapser
+local b_stripper=lpeg.patterns.b_stripper
+local m_stripper=lpeg.patterns.m_stripper
+local e_stripper=lpeg.patterns.e_stripper
+local lpegmatch=lpeg.match
local function stripelement(e,nolines,anywhere)
local edt=e.dt
if edt then
- if anywhere then
- local t,n={},0
- for e=1,#edt do
+ local n=#edt
+ if n==0 then
+ return e
+ elseif anywhere then
+ local t={}
+ local m=0
+ for e=1,n do
local str=edt[e]
if type(str)~="string" then
- n=n+1
- t[n]=str
+ m=m+1
+ t[m]=str
elseif str~="" then
if nolines then
- str=gsub(str,"%s+"," ")
+ str=lpegmatch((n==1 and b_collapser) or (n==m and e_collapser) or m_collapser,str)
+ else
+ str=lpegmatch((n==1 and b_stripper) or (n==m and e_stripper) or m_stripper,str)
end
- str=gsub(str,"^%s*(.-)%s*$","%1")
if str~="" then
- n=n+1
- t[n]=str
+ m=m+1
+ t[m]=str
end
end
end
e.dt=t
else
- if #edt>0 then
- local str=edt[1]
- if type(str)~="string" then
- elseif str=="" then
+ local str=edt[1]
+ if type(str)=="string" then
+ if str~="" then
+ str=lpegmatch(nolines and b_collapser or b_stripper,str)
+ end
+ if str=="" then
remove(edt,1)
+ n=n-1
else
- if nolines then
- str=gsub(str,"%s+"," ")
- end
- str=gsub(str,"^%s+","")
- if str=="" then
- remove(edt,1)
- else
- edt[1]=str
- end
+ edt[1]=str
end
end
- local nedt=#edt
- if nedt>0 then
- local str=edt[nedt]
- if type(str)~="string" then
- elseif str=="" then
- remove(edt)
- else
- if nolines then
- str=gsub(str,"%s+"," ")
- end
- str=gsub(str,"%s+$","")
+ if n>0 then
+ str=edt[n]
+ if type(str)=="string" then
if str=="" then
remove(edt)
else
- edt[nedt]=str
+ str=lpegmatch(nolines and e_collapser or e_stripper,str)
+ if str=="" then
+ remove(edt)
+ else
+ edt[n]=str
+ end
end
end
end
@@ -11761,8 +12331,8 @@ function xml.finalizers.xml.cdata(collected)
end
return ""
end
-function xml.insertcomment(e,str,n)
- table.insert(e.dt,n or 1,{
+function xml.insertcomment(e,str,n)
+ insert(e.dt,n or 1,{
tg="@cm@",
ns="",
special=true,
@@ -11770,7 +12340,25 @@ function xml.insertcomment(e,str,n)
dt={ str },
})
end
-function xml.setcdata(e,str)
+function xml.insertcdata(e,str,n)
+ insert(e.dt,n or 1,{
+ tg="@cd@",
+ ns="",
+ special=true,
+ at={},
+ dt={ str },
+ })
+end
+function xml.setcomment(e,str,n)
+ e.dt={ {
+ tg="@cm@",
+ ns="",
+ special=true,
+ at={},
+ dt={ str },
+ } }
+end
+function xml.setcdata(e,str)
e.dt={ {
tg="@cd@",
ns="",
@@ -11840,7 +12428,7 @@ local function recurse(e,action)
for i=1,#edt do
local str=edt[i]
if type(str)~="string" then
- recurse(str,action,recursive)
+ recurse(str,action)
elseif str~="" then
edt[i]=action(str)
end
@@ -11858,6 +12446,65 @@ function helpers.recursetext(collected,action,recursive)
end
end
end
+local specials={
+ ["@rt@"]="root",
+ ["@pi@"]="instruction",
+ ["@cm@"]="comment",
+ ["@dt@"]="declaration",
+ ["@cd@"]="cdata",
+}
+local function convert(x,strip,flat)
+ local ns=x.ns
+ local tg=x.tg
+ local at=x.at
+ local dt=x.dt
+ local node=flat and {
+ [0]=(not x.special and (ns~="" and ns..":"..tg or tg)) or nil,
+ } or {
+ _namespace=ns~="" and ns or nil,
+ _tag=not x.special and tg or nil,
+ _type=specials[tg] or "_element",
+ }
+ if at then
+ for k,v in next,at do
+ node[k]=v
+ end
+ end
+ local n=0
+ for i=1,#dt do
+ local di=dt[i]
+ if type(di)=="table" then
+ if flat and di.special then
+ else
+ di=convert(di,strip,flat)
+ if di then
+ n=n+1
+ node[n]=di
+ end
+ end
+ elseif strip then
+ di=lpegmatch(strip,di)
+ if di~="" then
+ n=n+1
+ node[n]=di
+ end
+ else
+ n=n+1
+ node[n]=di
+ end
+ end
+ if next(node) then
+ return node
+ end
+end
+function xml.totable(x,strip,flat)
+ if type(x)=="table" then
+ if strip then
+ strip=striplinepatterns[strip]
+ end
+ return convert(x,strip,flat)
+ end
+end
end -- of closure
@@ -12414,7 +13061,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-ini"] = package.loaded["data-ini"] or true
--- original size: 7927, stripped down to: 5528
+-- original size: 11085, stripped down to: 7662
if not modules then modules={} end modules ['data-ini']={
version=1.001,
@@ -12423,14 +13070,15 @@ if not modules then modules={} end modules ['data-ini']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files",
}
+local next,type,getmetatable,rawset=next,type,getmetatable,rawset
local gsub,find,gmatch,char=string.gsub,string.find,string.gmatch,string.char
-local next,type=next,type
local filedirname,filebasename,filejoin=file.dirname,file.basename,file.join
+local ostype,osname,osuname,ossetenv,osgetenv=os.type,os.name,os.uname,os.setenv,os.getenv
+local P,S,R,C,Cs,Cc,lpegmatch=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local trace_detail=false trackers.register("resolvers.details",function(v) trace_detail=v end)
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
resolvers=resolvers or {}
local resolvers=resolvers
texconfig.kpse_init=false
@@ -12563,10 +13211,103 @@ if type(profiler)=="table" and not jit then
profiler.start("luatex-profile.log")
end)
end
-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
+local prefixes=utilities.storage.allocate()
+resolvers.prefixes=prefixes
+local resolved={}
+local abstract={}
+local dynamic={}
+function resolvers.resetresolve(str)
+ resolved,abstract={},{}
+end
+function resolvers.allprefixes(separator)
+ local all=table.sortedkeys(prefixes)
+ if separator then
+ for i=1,#all do
+ all[i]=all[i]..":"
+ end
+ end
+ return all
+end
+local function _resolve_(method,target)
+ local action=prefixes[method]
+ if action then
+ return action(target)
+ else
+ return method..":"..target
+ end
+end
+function resolvers.unresolve(str)
+ return abstract[str] or str
+end
+function resolvers.setdynamic(str)
+ dynamic[str]=true
+end
+local pattern=Cs((C(R("az")^2)*P(":")*C((1-S(" \"\';,"))^1)/_resolve_+P(1))^0)
+local prefix=C(R("az")^2)*P(":")
+local target=C((1-S(" \"\';,"))^1)
+local notarget=(#S(";,")+P(-1))*Cc("")
+local p_resolve=Cs(((prefix*(target+notarget))/_resolve_+P(1))^0)
+local p_simple=prefix*P(-1)
+local function resolve(str)
+ if type(str)=="table" then
+ local res={}
+ for i=1,#str do
+ res[i]=resolve(str[i])
+ end
+ return res
+ end
+ local res=resolved[str]
+ if res then
+ return res
+ end
+ local simple=lpegmatch(p_simple,str)
+ local action=prefixes[simple]
+ if action then
+ local res=action(res)
+ if not dynamic[simple] then
+ resolved[simple]=res
+ abstract[res]=simple
+ end
+ return res
+ end
+ res=lpegmatch(p_resolve,str)
+ resolved[str]=res
+ abstract[res]=str
+ return res
+end
+resolvers.resolve=resolve
+if type(osuname)=="function" then
+ for k,v in next,osuname() do
+ if not prefixes[k] then
+ prefixes[k]=function() return v end
+ end
+ end
+end
+if ostype=="unix" then
+ local pattern
+ local function makepattern(t,k,v)
+ if t then
+ rawset(t,k,v)
+ end
+ local colon=P(":")
+ for k,v in table.sortedpairs(prefixes) do
+ if p then
+ p=P(k)+p
+ else
+ p=P(k)
+ end
+ end
+ pattern=Cs((p*colon+colon/";"+P(1))^0)
+ end
+ makepattern()
+ table.setmetatablenewindex(prefixes,makepattern)
+ function resolvers.repath(str)
+ return lpegmatch(pattern,str)
+ end
+else
+ function resolvers.repath(str)
+ return str
+ end
end
@@ -12576,7 +13317,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-exp"] = package.loaded["data-exp"] or true
--- original size: 15317, stripped down to: 9723
+-- original size: 17216, stripped down to: 10657
if not modules then modules={} end modules ['data-exp']={
version=1.001,
@@ -12590,12 +13331,16 @@ local concat,sort=table.concat,table.sort
local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns
local Ct,Cs,Cc,Carg,P,C,S=lpeg.Ct,lpeg.Cs,lpeg.Cc,lpeg.Carg,lpeg.P,lpeg.C,lpeg.S
local type,next=type,next
+local isdir=lfs.isdir
local ostype=os.type
-local collapsepath=file.collapsepath
+local collapsepath,joinpath,basename=file.collapsepath,file.join,file.basename
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local trace_expansions=false trackers.register("resolvers.expansions",function(v) trace_expansions=v end)
+local trace_globbing=true trackers.register("resolvers.globbing",function(v) trace_globbing=v end)
local report_expansions=logs.reporter("resolvers","expansions")
+local report_globbing=logs.reporter("resolvers","globbing")
local resolvers=resolvers
+local resolveprefix=resolvers.resolve
local function f_both(a,b)
local t,n={},0
for sb in gmatch(b,"[^,]+") do
@@ -12685,35 +13430,27 @@ function resolvers.expandedpathfromlist(pathlist)
end
return newlist
end
-local cleanup=lpeg.replacer {
- { "!","" },
- { "\\","/" },
-}
-function resolvers.cleanpath(str)
- local doslashes=(P("\\")/"/"+1)^0
- local donegation=(P("!")/"" )^0
- local homedir=lpegmatch(Cs(donegation*doslashes),environment.homedir or "")
- if homedir=="~" or homedir=="" or not lfs.isdir(homedir) then
- if trace_expansions then
- report_expansions("no home dir set, ignoring dependent paths")
- end
- function resolvers.cleanpath(str)
- if not str or find(str,"~",1,true) then
- return ""
- else
- return lpegmatch(cleanup,str)
+local usedhomedir=nil
+local donegation=(P("!")/"" )^0
+local doslashes=(P("\\")/"/"+1)^0
+local function expandedhome()
+ if not usedhomedir then
+ usedhomedir=lpegmatch(Cs(donegation*doslashes),environment.homedir or "")
+ if usedhomedir=="~" or usedhomedir=="" or not isdir(usedhomedir) then
+ if trace_expansions then
+ report_expansions("no home dir set, ignoring dependent path using current path")
end
- end
- else
- local dohome=((P("~")+P("$HOME"))/homedir)^0
- local cleanup=Cs(donegation*dohome*doslashes)
- function resolvers.cleanpath(str)
- return str and lpegmatch(cleanup,str) or ""
+ usedhomedir="."
end
end
- return resolvers.cleanpath(str)
+ return usedhomedir
+end
+local dohome=((P("~")+P("$HOME")+P("%HOME%"))/expandedhome)^0
+local cleanup=Cs(donegation*dohome*doslashes)
+resolvers.cleanpath=function(str)
+ return str and lpegmatch(cleanup,str) or ""
end
-local expandhome=P("~")/"$HOME"
+local expandhome=P("~")/"$HOME"
local dodouble=P('"')/""*(expandhome+(1-P('"')))^0*P('"')/""
local dosingle=P("'")/""*(expandhome+(1-P("'")))^0*P("'")/""
local dostring=(expandhome+1 )^0
@@ -12765,46 +13502,67 @@ function resolvers.splitpath(str)
end
function resolvers.joinpath(str)
if type(str)=='table' then
- return file.joinpath(str)
+ return joinpath(str)
else
return str
end
end
local attributes,directory=lfs.attributes,lfs.dir
local weird=P(".")^1+lpeg.anywhere(S("~`!#$%^&*()={}[]:;\"\'||<>,?\n\r\t"))
+local lessweird=P(".")^1+lpeg.anywhere(S("~`#$%^&*:;\"\'||<>,?\n\r\t"))
local timer={}
local scanned={}
local nofscans=0
local scancache={}
-local function scan(files,spec,path,n,m,r)
- local full=(path=="" and spec) or (spec..path..'/')
+local fullcache={}
+local nofsharedscans=0
+local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant)
+ local full=path=="" and spec or (spec..path..'/')
local dirs={}
local nofdirs=0
+ local pattern=tolerant and lessweird or weird
for name in directory(full) do
- if not lpegmatch(weird,name) then
- local mode=attributes(full..name,'mode')
- if mode=='file' then
+ if not lpegmatch(pattern,name) then
+ local mode=attributes(full..name,"mode")
+ if mode=="file" then
n=n+1
- local f=files[name]
- if f then
- if type(f)=='string' then
- files[name]={ f,path }
+ local lower=lower(name)
+ local paths=files[lower]
+ if paths then
+ if onlyone then
else
- f[#f+1]=path
+ if type(paths)=="string" then
+ files[lower]={ paths,path }
+ else
+ paths[#paths+1]=path
+ end
+ if name~=lower then
+ local rl=remap[lower]
+ if not rl then
+ remap[lower]=name
+ r=r+1
+ elseif trace_globbing and rl~=name then
+ report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl)
+ end
+ end
end
else
- files[name]=path
- local lower=lower(name)
+ files[lower]=path
if name~=lower then
- files["remap:"..lower]=name
- r=r+1
+ local rl=remap[lower]
+ if not rl then
+ remap[lower]=name
+ r=r+1
+ elseif trace_globbing and rl~=name then
+ report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl)
+ end
end
end
- elseif mode=='directory' then
+ elseif mode=="directory" then
m=m+1
nofdirs=nofdirs+1
if path~="" then
- dirs[nofdirs]=path..'/'..name
+ dirs[nofdirs]=path.."/"..name
else
dirs[nofdirs]=name
end
@@ -12814,107 +13572,69 @@ local function scan(files,spec,path,n,m,r)
if nofdirs>0 then
sort(dirs)
for i=1,nofdirs do
- files,n,m,r=scan(files,spec,dirs[i],n,m,r)
+ files,remap,n,m,r=scan(files,remap,spec,dirs[i],n,m,r,onlyonce,tolerant)
end
end
scancache[sub(full,1,-2)]=files
- return files,n,m,r
+ return files,remap,n,m,r
end
-local fullcache={}
-function resolvers.scanfiles(path,branch,usecache)
- statistics.starttiming(timer)
- local realpath=resolvers.resolve(path)
+function resolvers.scanfiles(path,branch,usecache,onlyonce,tolerant)
+ local realpath=resolveprefix(path)
if usecache then
- local files=fullcache[realpath]
- if files then
+ local content=fullcache[realpath]
+ if content then
if trace_locating then
- report_expansions("using caches scan of path %a, branch %a",path,branch or path)
+ report_expansions("using cached scan of path %a, branch %a",path,branch or path)
end
- return files
+ nofsharedscans=nofsharedscans+1
+ return content
end
end
+ statistics.starttiming(timer)
if trace_locating then
report_expansions("scanning path %a, branch %a",path,branch or path)
end
- local files,n,m,r=scan({},realpath..'/',"",0,0,0)
- files.__path__=path
- 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
- if usecache then
- scanned[#scanned+1]=realpath
- fullcache[realpath]=files
- end
- nofscans=nofscans+1
- statistics.stoptiming(timer)
- return files
-end
-local function simplescan(files,spec,path)
- local full=(path=="" and spec) or (spec..path..'/')
- local dirs={}
- local nofdirs=0
- for name in directory(full) do
- if not lpegmatch(weird,name) then
- local mode=attributes(full..name,'mode')
- if mode=='file' then
- if not files[name] then
- files[name]=path
- end
- elseif mode=='directory' then
- nofdirs=nofdirs+1
- if path~="" then
- dirs[nofdirs]=path..'/'..name
- else
- dirs[nofdirs]=name
- end
- end
- end
- end
- if nofdirs>0 then
- sort(dirs)
- for i=1,nofdirs do
- files=simplescan(files,spec,dirs[i])
- end
- end
- return files
-end
-local simplecache={}
-local nofsharedscans=0
-function resolvers.simplescanfiles(path,branch,usecache)
- statistics.starttiming(timer)
- local realpath=resolvers.resolve(path)
- if usecache then
- local files=simplecache[realpath]
- if not files then
- files=scancache[realpath]
- if files then
- nofsharedscans=nofsharedscans+1
- end
+ local content
+ if isdir(realpath) then
+ local files,remap,n,m,r=scan({},{},realpath..'/',"",0,0,0,onlyonce,tolerant)
+ content={
+ metadata={
+ path=path,
+ files=n,
+ directories=m,
+ remappings=r,
+ },
+ files=files,
+ remap=remap,
+ }
+ if trace_locating then
+ report_expansions("%s files found on %s directories with %s uppercase remappings",n,m,r)
end
- if files then
- if trace_locating then
- report_expansions("using caches scan of path %a, branch %a",path,branch or path)
- end
- return files
+ else
+ content={
+ metadata={
+ path=path,
+ files=0,
+ directories=0,
+ remappings=0,
+ },
+ files={},
+ remap={},
+ }
+ if trace_locating then
+ report_expansions("invalid path %a",realpath)
end
end
- if trace_locating then
- report_expansions("scanning path %a, branch %a",path,branch or path)
- end
- local files=simplescan({},realpath..'/',"")
- if trace_locating then
- report_expansions("%s files found",table.count(files))
- end
if usecache then
scanned[#scanned+1]=realpath
- simplecache[realpath]=files
+ fullcache[realpath]=content
end
nofscans=nofscans+1
statistics.stoptiming(timer)
- return files
+ return content
+end
+function resolvers.simplescanfiles(path,branch,usecache)
+ return resolvers.scanfiles(path,branch,usecache,true,true)
end
function resolvers.scandata()
table.sort(scanned)
@@ -12925,6 +13645,52 @@ function resolvers.scandata()
paths=scanned,
}
end
+function resolvers.get_from_content(content,path,name)
+ if not content then
+ return
+ end
+ local files=content.files
+ if not files then
+ return
+ end
+ local remap=content.remap
+ if not remap then
+ return
+ end
+ if name then
+ local used=lower(name)
+ return path,remap[used] or used
+ else
+ local name=path
+ local used=lower(name)
+ local path=files[used]
+ if path then
+ return path,remap[used] or used
+ end
+ end
+end
+local nothing=function() end
+function resolvers.filtered_from_content(content,pattern)
+ if content and type(pattern)=="string" then
+ local pattern=lower(pattern)
+ local files=content.files
+ local remap=content.remap
+ if files and remap then
+ local n=next(files)
+ local function iterator()
+ while n do
+ local k=n
+ n=next(files,k)
+ if find(k,pattern) then
+ return files[k],remap and remap[k] or k
+ end
+ end
+ end
+ return iterator
+ end
+ end
+ return nothing
+end
end -- of closure
@@ -12933,7 +13699,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-env"] = package.loaded["data-env"] or true
--- original size: 8769, stripped down to: 6490
+-- original size: 9216, stripped down to: 6798
if not modules then modules={} end modules ['data-env']={
version=1.001,
@@ -12951,10 +13717,12 @@ local formats=allocate()
local suffixes=allocate()
local dangerous=allocate()
local suffixmap=allocate()
+local usertypes=allocate()
resolvers.formats=formats
resolvers.suffixes=suffixes
resolvers.dangerous=dangerous
resolvers.suffixmap=suffixmap
+resolvers.usertypes=usertypes
local luasuffixes=utilities.lua.suffixes
local relations=allocate {
core={
@@ -13022,11 +13790,13 @@ local relations=allocate {
names={ "mp" },
variable='MPINPUTS',
suffixes={ 'mp','mpvi','mpiv','mpii' },
+ usertype=true,
},
tex={
names={ "tex" },
variable='TEXINPUTS',
- suffixes={ 'tex',"mkvi","mkiv","mkii" },
+ suffixes={ "tex","mkvi","mkiv","mkii","cld","lfg","xml" },
+ usertype=true,
},
icc={
names={ "icc","icc profile","icc profiles" },
@@ -13042,6 +13812,7 @@ local relations=allocate {
names={ "lua" },
variable='LUAINPUTS',
suffixes={ luasuffixes.lua,luasuffixes.luc,luasuffixes.tma,luasuffixes.tmc },
+ usertype=true,
},
lib={
names={ "lib" },
@@ -13050,11 +13821,15 @@ local relations=allocate {
},
bib={
names={ 'bib' },
+ variable='BIBINPUTS',
suffixes={ 'bib' },
+ usertype=true,
},
bst={
names={ 'bst' },
+ variable='BSTINPUTS',
suffixes={ 'bst' },
+ usertype=true,
},
fontconfig={
names={ 'fontconfig','fontconfig file','fontconfig files' },
@@ -13136,8 +13911,9 @@ function resolvers.updaterelations()
for name,relation in next,categories do
local rn=relation.names
local rv=relation.variable
- local rs=relation.suffixes
if rn and rv then
+ local rs=relation.suffixes
+ local ru=relation.usertype
for i=1,#rn do
local rni=lower(gsub(rn[i]," ",""))
formats[rni]=rv
@@ -13149,8 +13925,9 @@ function resolvers.updaterelations()
end
end
end
- end
- if rs then
+ if ru then
+ usertypes[name]=true
+ end
end
end
end
@@ -13201,7 +13978,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tmp"] = package.loaded["data-tmp"] or true
--- original size: 15532, stripped down to: 11648
+-- original size: 15681, stripped down to: 11761
if not modules then modules={} end modules ['data-tmp']={
version=1.100,
@@ -13220,6 +13997,7 @@ local trace_cache=false trackers.register("resolvers.cache",function(v) trace_ca
local report_caches=logs.reporter("resolvers","caches")
local report_resolvers=logs.reporter("resolvers","caching")
local resolvers=resolvers
+local cleanpath=resolvers.cleanpath
local directive_cleanup=false directives.register("system.compile.cleanup",function(v) directive_cleanup=v end)
local directive_strip=false directives.register("system.compile.strip",function(v) directive_strip=v end)
local compile=utilities.lua.compile
@@ -13241,7 +14019,7 @@ caches.relocate=false
caches.defaults={ "TMPDIR","TEMPDIR","TMP","TEMP","HOME","HOMEPATH" }
local writable,readables,usedreadables=nil,{},{}
local function identify()
- local texmfcaches=resolvers.cleanpathlist("TEXMFCACHE")
+ local texmfcaches=resolvers.cleanpathlist("TEXMFCACHE")
if texmfcaches then
for k=1,#texmfcaches do
local cachepath=texmfcaches[k]
@@ -13495,10 +14273,12 @@ 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(addsuffix(name,luasuffixes.lua),"trees")
- local filename=file.join(path,name)
+function caches.loadcontent(cachename,dataname,filename)
+ if not filename then
+ local name=caches.hashed(cachename)
+ local full,path=caches.getfirstreadablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename=file.join(path,name)
+ end
local blob=loadfile(addsuffix(filename,luasuffixes.luc)) or loadfile(addsuffix(filename,luasuffixes.lua))
if blob then
local data=blob()
@@ -13530,10 +14310,12 @@ function caches.collapsecontent(content)
end
end
end
-function caches.savecontent(cachename,dataname,content)
- local name=caches.hashed(cachename)
- local full,path=caches.setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
- local filename=file.join(path,name)
+function caches.savecontent(cachename,dataname,content,filename)
+ if not filename then
+ local name=caches.hashed(cachename)
+ local full,path=caches.setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename=file.join(path,name)
+ end
local luaname=addsuffix(filename,luasuffixes.lua)
local lucname=addsuffix(filename,luasuffixes.luc)
if trace_locating then
@@ -13576,7 +14358,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-met"] = package.loaded["data-met"] or true
--- original size: 5460, stripped down to: 4014
+-- original size: 5347, stripped down to: 4015
if not modules then modules={} end modules ['data-met']={
version=1.100,
@@ -13604,7 +14386,7 @@ local function splitmethod(filename)
if type(filename)=="table" then
return filename
end
- filename=file.collapsepath(filename,".")
+ filename=file.collapsepath(filename,".")
if not find(filename,"://",1,true) then
return { scheme="file",path=filename,original=filename,filename=filename }
end
@@ -13695,7 +14477,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-res"] = package.loaded["data-res"] or true
--- original size: 62045, stripped down to: 43116
+-- original size: 67003, stripped down to: 46291
if not modules then modules={} end modules ['data-res']={
version=1.001,
@@ -13705,7 +14487,7 @@ if not modules then modules={} end modules ['data-res']={
license="see context related readme files",
}
local gsub,find,lower,upper,match,gmatch=string.gsub,string.find,string.lower,string.upper,string.match,string.gmatch
-local concat,insert,sortedkeys=table.concat,table.insert,table.sortedkeys
+local concat,insert,remove,sortedkeys,sortedhash=table.concat,table.insert,table.remove,table.sortedkeys,table.sortedhash
local next,type,rawget=next,type,rawget
local os=os
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
@@ -13714,17 +14496,23 @@ local formatters=string.formatters
local filedirname=file.dirname
local filebasename=file.basename
local suffixonly=file.suffixonly
+local addsuffix=file.addsuffix
+local removesuffix=file.removesuffix
local filejoin=file.join
local collapsepath=file.collapsepath
local joinpath=file.joinpath
+local is_qualified_path=file.is_qualified_path
local allocate=utilities.storage.allocate
local settings_to_array=utilities.parsers.settings_to_array
+local getcurrentdir=lfs.currentdir
+local isfile=lfs.isfile
+local isdir=lfs.isdir
local setmetatableindex=table.setmetatableindex
local luasuffixes=utilities.lua.suffixes
-local getcurrentdir=lfs.currentdir
local trace_locating=false trackers .register("resolvers.locating",function(v) trace_locating=v end)
local trace_detail=false trackers .register("resolvers.details",function(v) trace_detail=v end)
local trace_expansions=false trackers .register("resolvers.expansions",function(v) trace_expansions=v end)
+local trace_paths=false trackers .register("resolvers.paths",function(v) trace_paths=v end)
local resolve_otherwise=true directives.register("resolvers.otherwise",function(v) resolve_otherwise=v end)
local report_resolving=logs.reporter("resolvers","resolving")
local resolvers=resolvers
@@ -13732,10 +14520,14 @@ local expandedpathfromlist=resolvers.expandedpathfromlist
local checkedvariable=resolvers.checkedvariable
local splitconfigurationpath=resolvers.splitconfigurationpath
local methodhandler=resolvers.methodhandler
+local filtered=resolvers.filtered_from_content
+local lookup=resolvers.get_from_content
+local cleanpath=resolvers.cleanpath
+local resolveprefix=resolvers.resolve
local initializesetter=utilities.setters.initialize
local ostype,osname,osenv,ossetenv,osgetenv=os.type,os.name,os.env,os.setenv,os.getenv
-resolvers.cacheversion='1.0.1'
-resolvers.configbanner=''
+resolvers.cacheversion="1.100"
+resolvers.configbanner=""
resolvers.homedir=environment.homedir
resolvers.criticalvars=allocate { "SELFAUTOLOC","SELFAUTODIR","SELFAUTOPARENT","TEXMFCNF","TEXMF","TEXOS" }
resolvers.luacnfname="texmfcnf.lua"
@@ -13754,6 +14546,7 @@ end
local unset_variable="unset"
local formats=resolvers.formats
local suffixes=resolvers.suffixes
+local usertypes=resolvers.usertypes
local dangerous=resolvers.dangerous
local suffixmap=resolvers.suffixmap
resolvers.defaultsuffixes={ "tex" }
@@ -13762,7 +14555,7 @@ local instance=resolvers.instance or nil
function resolvers.setenv(key,value,raw)
if instance then
instance.environment[key]=value
- ossetenv(key,raw and value or resolvers.resolve(value))
+ ossetenv(key,raw and value or resolveprefix(value))
end
end
local function getenv(key)
@@ -13776,7 +14569,7 @@ local function getenv(key)
end
resolvers.getenv=getenv
resolvers.env=getenv
-local function resolve(k)
+local function resolvevariable(k)
return instance.expansions[k]
end
local dollarstripper=lpeg.stripper("$")
@@ -13785,19 +14578,19 @@ 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 variableexpander=Cs((somevariable*(somekey/resolvevariable)+somethingelse)^1 )
local cleaner=P("\\")/"/"+P(";")*S("!{}/\\")^0*P(";")^1/";"
local variablecleaner=Cs((cleaner+P(1))^0)
-local somevariable=R("az","AZ","09","__","--")^1/resolve
+local somevariable=R("az","AZ","09","__","--")^1/resolvevariable
local variable=(P("$")/"")*(somevariable+(P("{")/"")*somevariable*(P("}")/""))
local variableresolver=Cs((variable+P(1))^0)
local function expandedvariable(var)
return lpegmatch(variableexpander,var) or var
end
-function resolvers.newinstance()
- if trace_locating then
+function resolvers.newinstance()
+ if trace_locating then
report_resolving("creating instance")
- end
+ end
local environment,variables,expansions,order=allocate(),allocate(),allocate(),allocate()
local newinstance={
environment=environment,
@@ -13810,6 +14603,7 @@ function resolvers.newinstance()
foundintrees=allocate(),
hashes=allocate(),
hashed=allocate(),
+ pathlists=false,
specification=allocate(),
lists=allocate(),
data=allocate(),
@@ -13822,6 +14616,7 @@ function resolvers.newinstance()
savelists=true,
pattern=nil,
force_suffixes=true,
+ pathstack={},
}
setmetatableindex(variables,function(t,k)
local v
@@ -13871,8 +14666,13 @@ function resolvers.reset()
end
local function reset_hashes()
instance.lists={}
+ instance.pathlists=false
instance.found={}
end
+local function reset_caches()
+ instance.lists={}
+ instance.pathlists=false
+end
local slash=P("/")
local pathexpressionpattern=Cs (
Cc("^")*(
@@ -13924,13 +14724,13 @@ local function identify_configuration_files()
for i=1,#cnfpaths do
local filepath=cnfpaths[i]
local filename=collapsepath(filejoin(filepath,luacnfname))
- local realname=resolvers.resolve(filename)
+ local realname=resolveprefix(filename)
if trace_locating then
- local fullpath=gsub(resolvers.resolve(collapsepath(filepath)),"//","/")
+ local fullpath=gsub(resolveprefix(collapsepath(filepath)),"//","/")
local weirdpath=find(fullpath,"/texmf.+/texmf") or not find(fullpath,"/web2c",1,true)
report_resolving("looking for %a on %s path %a from specification %a",luacnfname,weirdpath and "weird" or "given",fullpath,filepath)
end
- if lfs.isfile(realname) then
+ if isfile(realname) then
specification[#specification+1]=filename
if trace_locating then
report_resolving("found configuration file %a",realname)
@@ -13952,7 +14752,7 @@ local function load_configuration_files()
local filename=specification[i]
local pathname=filedirname(filename)
local filename=filejoin(pathname,luacnfname)
- local realname=resolvers.resolve(filename)
+ local realname=resolveprefix(filename)
local blob=loadfile(realname)
if blob then
local setups=instance.setups
@@ -13960,7 +14760,7 @@ local function load_configuration_files()
local parent=data and data.parent
if parent then
local filename=filejoin(pathname,parent)
- local realname=resolvers.resolve(filename)
+ local realname=resolveprefix(filename)
local blob=loadfile(realname)
if blob then
local parentdata=blob()
@@ -13985,7 +14785,7 @@ local function load_configuration_files()
elseif variables[k]==nil then
if trace_locating and not warning then
report_resolving("variables like %a in configuration file %a should move to the 'variables' subtable",
- k,resolvers.resolve(filename))
+ k,resolveprefix(filename))
warning=true
end
variables[k]=v
@@ -14045,7 +14845,7 @@ local function locate_file_databases()
local stripped=lpegmatch(inhibitstripper,path)
if stripped~="" then
local runtime=stripped==path
- path=resolvers.cleanpath(path)
+ path=cleanpath(path)
local spec=resolvers.splitmethod(stripped)
if runtime and (spec.noscheme or spec.scheme=="file") then
stripped="tree:///"..stripped
@@ -14108,8 +14908,8 @@ function resolvers.renew(hashname)
report_resolving("identifying tree %a",hashname)
end
end
- local realpath=resolvers.resolve(hashname)
- if lfs.isdir(realpath) then
+ local realpath=resolveprefix(hashname)
+ if isdir(realpath) then
if trace_locating then
report_resolving("using path %a",realpath)
end
@@ -14210,19 +15010,53 @@ end
function resolvers.unexpandedpath(str)
return joinpath(resolvers.unexpandedpathlist(str))
end
+function resolvers.pushpath(name)
+ local pathstack=instance.pathstack
+ local lastpath=pathstack[#pathstack]
+ local pluspath=filedirname(name)
+ if lastpath then
+ lastpath=collapsepath(filejoin(lastpath,pluspath))
+ else
+ lastpath=collapsepath(pluspath)
+ end
+ insert(pathstack,lastpath)
+ if trace_paths then
+ report_resolving("pushing path %a",lastpath)
+ end
+end
+function resolvers.poppath()
+ local pathstack=instance.pathstack
+ if trace_paths and #pathstack>0 then
+ report_resolving("popping path %a",pathstack[#pathstack])
+ end
+ remove(pathstack)
+end
+function resolvers.stackpath()
+ local pathstack=instance.pathstack
+ local currentpath=pathstack[#pathstack]
+ return currentpath~="" and currentpath or nil
+end
local done={}
function resolvers.resetextrapath()
local ep=instance.extra_paths
if not ep then
- ep,done={},{}
- instance.extra_paths=ep
+ done={}
+ instance.extra_paths={}
elseif #ep>0 then
- instance.lists,done={},{}
+ done={}
+ reset_caches()
end
end
function resolvers.registerextrapath(paths,subpaths)
- paths=settings_to_array(paths)
- subpaths=settings_to_array(subpaths)
+ if not subpaths or subpaths=="" then
+ if not paths or path=="" then
+ return
+ elseif done[paths] then
+ return
+ end
+ end
+ local paths=settings_to_array(paths)
+ local subpaths=settings_to_array(subpaths)
local ep=instance.extra_paths or {}
local oldn=#ep
local newn=oldn
@@ -14237,7 +15071,7 @@ function resolvers.registerextrapath(paths,subpaths)
local ps=p.."/"..s
if not done[ps] then
newn=newn+1
- ep[newn]=resolvers.cleanpath(ps)
+ ep[newn]=cleanpath(ps)
done[ps]=true
end
end
@@ -14247,7 +15081,7 @@ function resolvers.registerextrapath(paths,subpaths)
local p=paths[i]
if not done[p] then
newn=newn+1
- ep[newn]=resolvers.cleanpath(p)
+ ep[newn]=cleanpath(p)
done[p]=true
end
end
@@ -14259,7 +15093,7 @@ function resolvers.registerextrapath(paths,subpaths)
local ps=ep[i].."/"..s
if not done[ps] then
newn=newn+1
- ep[newn]=resolvers.cleanpath(ps)
+ ep[newn]=cleanpath(ps)
done[ps]=true
end
end
@@ -14268,52 +15102,70 @@ function resolvers.registerextrapath(paths,subpaths)
if newn>0 then
instance.extra_paths=ep
end
- if newn>oldn then
- instance.lists={}
+ if newn~=oldn then
+ reset_caches()
end
end
-local function made_list(instance,list)
- local ep=instance.extra_paths
- if not ep or #ep==0 then
- return list
+function resolvers.pushextrapath(path)
+ local paths=settings_to_array(path)
+ if instance.extra_stack then
+ insert(instance.extra_stack,1,paths)
else
- local done,new,newn={},{},0
- for k=1,#list do
- local v=list[k]
- if not done[v] then
- if find(v,"^[%.%/]$") then
- done[v]=true
- newn=newn+1
- new[newn]=v
- else
- break
- end
- end
- end
- for k=1,#ep do
- local v=ep[k]
+ instance.extra_stack={ paths }
+ end
+ reset_caches()
+end
+function resolvers.popextrapath()
+ if instance.extra_stack then
+ reset_caches()
+ return remove(instance.extra_stack,1)
+ end
+end
+local function made_list(instance,list,extra_too)
+ local done={}
+ local new={}
+ local newn=0
+ local function add(p)
+ for k=1,#p do
+ local v=p[k]
if not done[v] then
done[v]=true
newn=newn+1
new[newn]=v
end
end
- for k=1,#list do
- local v=list[k]
- if not done[v] then
- done[v]=true
- newn=newn+1
- new[newn]=v
+ end
+ for k=1,#list do
+ local v=list[k]
+ if done[v] then
+ elseif find(v,"^[%.%/]$") then
+ done[v]=true
+ newn=newn+1
+ new[newn]=v
+ else
+ break
+ end
+ end
+ if extra_too then
+ local es=instance.extra_stack
+ if es and #es>0 then
+ for k=1,#es do
+ add(es[k])
end
end
- return new
+ local ep=instance.extra_paths
+ if ep and #ep>0 then
+ add(ep)
+ end
end
+ add(list)
+ return new
end
function resolvers.cleanpathlist(str)
local t=resolvers.expandedpathlist(str)
if t then
for i=1,#t do
- t[i]=collapsepath(resolvers.cleanpath(t[i]))
+ t[i]=collapsepath(cleanpath(t[i]))
end
end
return t
@@ -14321,22 +15173,22 @@ end
function resolvers.expandpath(str)
return joinpath(resolvers.expandedpathlist(str))
end
-function resolvers.expandedpathlist(str)
+function resolvers.expandedpathlist(str,extra_too)
if not str then
return {}
- elseif instance.savelists then
+ elseif instance.savelists then
str=lpegmatch(dollarstripper,str)
local lists=instance.lists
local lst=lists[str]
if not lst then
- local l=made_list(instance,resolvers.splitpath(resolvers.expansion(str)))
+ local l=made_list(instance,resolvers.splitpath(resolvers.expansion(str)),extra_too)
lst=expandedpathfromlist(l)
lists[str]=lst
end
return lst
else
local lst=resolvers.splitpath(resolvers.expansion(str))
- return made_list(instance,expandedpathfromlist(lst))
+ return made_list(instance,expandedpathfromlist(lst),extra_too)
end
end
function resolvers.expandedpathlistfromvariable(str)
@@ -14347,6 +15199,13 @@ end
function resolvers.expandpathfromvariable(str)
return joinpath(resolvers.expandedpathlistfromvariable(str))
end
+function resolvers.cleanedpathlist(v)
+ local t=resolvers.expandedpathlist(v)
+ for i=1,#t do
+ t[i]=resolvers.resolve(resolvers.cleanpath(t[i]))
+ end
+ return t
+end
function resolvers.expandbraces(str)
local ori=str
local pth=expandedpathfromlist(resolvers.splitpath(ori))
@@ -14363,7 +15222,7 @@ function resolvers.registerfilehash(name,content,someerror)
end
end
local function isreadable(name)
- local readable=lfs.isfile(name)
+ local readable=isfile(name)
if trace_detail then
if readable then
report_resolving("file %a is readable",name)
@@ -14373,70 +15232,57 @@ local function isreadable(name)
end
return readable
end
-local function collect_files(names)
- local filelist,noffiles={},0
+local function collect_files(names)
+ local filelist={}
+ local noffiles=0
+ local function check(hash,root,pathname,path,name)
+ if not pathname or find(path,pathname) then
+ local variant=hash.type
+ local search=filejoin(root,path,name)
+ local result=methodhandler('concatinators',variant,root,path,name)
+ if trace_detail then
+ report_resolving("match: variant %a, search %a, result %a",variant,search,result)
+ end
+ noffiles=noffiles+1
+ filelist[noffiles]={ variant,search,result }
+ end
+ end
for k=1,#names do
- local fname=names[k]
+ local filename=names[k]
if trace_detail then
- report_resolving("checking name %a",fname)
+ report_resolving("checking name %a",filename)
end
- local bname=filebasename(fname)
- local dname=filedirname(fname)
- if dname=="" or find(dname,"^%.") then
- dname=false
+ local basename=filebasename(filename)
+ local pathname=filedirname(filename)
+ if pathname=="" or find(pathname,"^%.") then
+ pathname=false
else
- dname=gsub(dname,"%*",".*")
- dname="/"..dname.."$"
+ pathname=gsub(pathname,"%*",".*")
+ pathname="/"..pathname.."$"
end
local hashes=instance.hashes
for h=1,#hashes do
local hash=hashes[h]
- local blobpath=hash.name
- local files=blobpath and instance.files[blobpath]
- if files then
+ local hashname=hash.name
+ local content=hashname and instance.files[hashname]
+ if content then
if trace_detail then
- report_resolving("deep checking %a, base %a, pattern %a",blobpath,bname,dname)
- 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
+ report_resolving("deep checking %a, base %a, pattern %a",hashname,basename,pathname)
end
- if blobfile then
- local blobroot=files.__path__ or blobpath
- if type(blobfile)=='string' then
- if not dname or find(blobfile,dname) then
- local variant=hash.type
- local search=filejoin(blobroot,blobfile,bname)
- local result=methodhandler('concatinators',hash.type,blobroot,blobfile,bname)
- if trace_detail then
- report_resolving("match: variant %a, search %a, result %a",variant,search,result)
- end
- noffiles=noffiles+1
- filelist[noffiles]={ variant,search,result }
- end
+ local path,name=lookup(content,basename)
+ if path then
+ local metadata=content.metadata
+ local realroot=metadata and metadata.path or hashname
+ if type(path)=="string" then
+ check(hash,realroot,pathname,path,name)
else
- for kk=1,#blobfile do
- local vv=blobfile[kk]
- if not dname or find(vv,dname) then
- local variant=hash.type
- local search=filejoin(blobroot,vv,bname)
- local result=methodhandler('concatinators',hash.type,blobroot,vv,bname)
- if trace_detail then
- report_resolving("match: variant %a, search %a, result %a",variant,search,result)
- end
- noffiles=noffiles+1
- filelist[noffiles]={ variant,search,result }
- end
+ for i=1,#path do
+ check(hash,realroot,pathname,path[i],name)
end
end
end
elseif trace_locating then
- report_resolving("no match in %a (%s)",blobpath,bname)
+ report_resolving("no match in %a (%s)",hashname,basename)
end
end
end
@@ -14461,7 +15307,7 @@ end
local function can_be_dir(name)
local fakepaths=instance.fakepaths
if not fakepaths[name] then
- if lfs.isdir(name) then
+ if isdir(name) then
fakepaths[name]=1
else
fakepaths[name]=2
@@ -14477,10 +15323,11 @@ local function find_analyze(filename,askedformat,allresults)
if askedformat=="" then
if ext=="" or not suffixmap[ext] then
local defaultsuffixes=resolvers.defaultsuffixes
+ local formatofsuffix=resolvers.formatofsuffix
for i=1,#defaultsuffixes do
local forcedname=filename..'.'..defaultsuffixes[i]
wantedfiles[#wantedfiles+1]=forcedname
- filetype=resolvers.formatofsuffix(forcedname)
+ filetype=formatofsuffix(forcedname)
if trace_locating then
report_resolving("forcing filetype %a",filetype)
end
@@ -14520,14 +15367,14 @@ local function find_wildcard(filename,allresults)
if trace_locating then
report_resolving("checking wildcard %a",filename)
end
- local method,result=resolvers.findwildcardfiles(filename)
+ local result=resolvers.findwildcardfiles(filename)
if result then
return "wildcard",result
end
end
end
local function find_qualified(filename,allresults,askedformat,alsostripped)
- if not file.is_qualified_path(filename) then
+ if not is_qualified_path(filename) then
return
end
if trace_locating then
@@ -14601,33 +15448,66 @@ local function check_subpath(fname)
return fname
end
end
-local function find_intree(filename,filetype,wantedfiles,allresults)
+local function makepathlist(list,filetype)
local typespec=resolvers.variableofformat(filetype)
- local pathlist=resolvers.expandedpathlist(typespec)
- local method="intree"
+ local pathlist=resolvers.expandedpathlist(typespec,filetype and usertypes[filetype])
+ local entry={}
if pathlist and #pathlist>0 then
- local filelist=collect_files(wantedfiles)
+ for k=1,#pathlist do
+ local path=pathlist[k]
+ local prescanned=find(path,'^!!')
+ local resursive=find(path,'//$')
+ local pathname=lpegmatch(inhibitstripper,path)
+ local expression=makepathexpression(pathname)
+ local barename=gsub(pathname,"/+$","")
+ barename=resolveprefix(barename)
+ local scheme=url.hasscheme(barename)
+ local schemename=gsub(barename,"%.%*$",'')
+ entry[k]={
+ path=path,
+ pathname=pathname,
+ prescanned=prescanned,
+ recursive=recursive,
+ expression=expression,
+ barename=barename,
+ scheme=scheme,
+ schemename=schemename,
+ }
+ end
+ entry.typespec=typespec
+ list[filetype]=entry
+ else
+ list[filetype]=false
+ end
+ return entry
+end
+local function find_intree(filename,filetype,wantedfiles,allresults)
+ local pathlists=instance.pathlists
+ if not pathlists then
+ pathlists=setmetatableindex(allocate(),makepathlist)
+ instance.pathlists=pathlists
+ end
+ local pathlist=pathlists[filetype]
+ if pathlist then
+ local method="intree"
+ local filelist=collect_files(wantedfiles)
local dirlist={}
+ local result={}
if filelist then
for i=1,#filelist do
dirlist[i]=filedirname(filelist[i][3]).."/"
end
end
if trace_detail then
- report_resolving("checking filename %a",filename)
+ report_resolving("checking filename %a in tree",filename)
end
- local resolve=resolvers.resolve
- local result={}
for k=1,#pathlist do
- local path=pathlist[k]
- local pathname=lpegmatch(inhibitstripper,path)
- local doscan=path==pathname
- if not find (pathname,'//$') then
- doscan=false
- end
+ local entry=pathlist[k]
+ local path=entry.path
+ local pathname=entry.pathname
local done=false
if filelist then
- local expression=makepathexpression(pathname)
+ local expression=entry.expression
if trace_detail then
report_resolving("using pattern %a for path %a",expression,pathname)
end
@@ -14635,8 +15515,8 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
local fl=filelist[k]
local f=fl[2]
local d=dirlist[k]
- if find(d,expression) or find(resolve(d),expression) then
- result[#result+1]=resolve(fl[3])
+ if find(d,expression) or find(resolveprefix(d),expression) then
+ result[#result+1]=resolveprefix(fl[3])
done=true
if allresults then
if trace_detail then
@@ -14657,56 +15537,62 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
method="database"
else
method="filesystem"
- pathname=gsub(pathname,"/+$","")
- pathname=resolve(pathname)
- local scheme=url.hasscheme(pathname)
+ local scheme=entry.scheme
if not scheme or scheme=="file" then
- local pname=gsub(pathname,"%.%*$",'')
+ local pname=entry.schemename
if not find(pname,"*",1,true) then
if can_be_dir(pname) then
- for k=1,#wantedfiles do
- local w=wantedfiles[k]
- local fname=check_subpath(filejoin(pname,w))
- if fname then
- result[#result+1]=fname
- done=true
- if not allresults then
- break
- end
+ if not done and not entry.prescanned then
+ if trace_detail then
+ report_resolving("quick root scan for %a",pname)
end
- end
- if not done and doscan then
- local files=resolvers.simplescanfiles(pname,false,true)
for k=1,#wantedfiles do
local w=wantedfiles[k]
- local subpath=files[w]
- if not subpath or subpath=="" then
- elseif type(subpath)=="string" then
- local fname=check_subpath(filejoin(pname,subpath,w))
- if fname then
- result[#result+1]=fname
- done=true
- if not allresults then
- break
- end
+ local fname=check_subpath(filejoin(pname,w))
+ if fname then
+ result[#result+1]=fname
+ done=true
+ if not allresults then
+ break
end
- else
- for i=1,#subpath do
- local sp=subpath[i]
- if sp=="" then
- else
- local fname=check_subpath(filejoin(pname,sp,w))
- if fname then
- result[#result+1]=fname
- done=true
- if not allresults then
- break
+ end
+ end
+ if not done and entry.recursive then
+ if trace_detail then
+ report_resolving("scanning filesystem for %a",pname)
+ end
+ local files=resolvers.simplescanfiles(pname,false,true)
+ for k=1,#wantedfiles do
+ local w=wantedfiles[k]
+ local subpath=files[w]
+ if not subpath or subpath=="" then
+ elseif type(subpath)=="string" then
+ local fname=check_subpath(filejoin(pname,subpath,w))
+ if fname then
+ result[#result+1]=fname
+ done=true
+ if not allresults then
+ break
+ end
+ end
+ else
+ for i=1,#subpath do
+ local sp=subpath[i]
+ if sp=="" then
+ else
+ local fname=check_subpath(filejoin(pname,sp,w))
+ if fname then
+ result[#result+1]=fname
+ done=true
+ if not allresults then
+ break
+ end
end
end
end
- end
- if done and not allresults then
- break
+ if done and not allresults then
+ break
+ end
end
end
end
@@ -14714,6 +15600,18 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
else
end
+ else
+ for k=1,#wantedfiles do
+ local pname=entry.barename
+ local fname=methodhandler('finders',pname.."/"..wantedfiles[k])
+ if fname then
+ result[#result+1]=fname
+ done=true
+ if not allresults then
+ break
+ end
+ end
+ end
end
end
if done and not allresults then
@@ -14748,10 +15646,13 @@ local function find_otherwise(filename,filetype,wantedfiles,allresults)
local filelist=collect_files(wantedfiles)
local fl=filelist and filelist[1]
if fl then
- return "otherwise",{ resolvers.resolve(fl[3]) }
+ return "otherwise",{ resolveprefix(fl[3]) }
end
end
collect_instance_files=function(filename,askedformat,allresults)
+ if not filename or filename=="" then
+ return {}
+ end
askedformat=askedformat or ""
filename=collapsepath(filename,".")
filename=gsub(filename,"^%./",getcurrentdir().."/")
@@ -14786,7 +15687,11 @@ collect_instance_files=function(filename,askedformat,allresults)
else
local method,result,stamp,filetype,wantedfiles
if instance.remember then
- stamp=formatters["%s--%s"](filename,askedformat)
+ if askedformat=="" then
+ stamp=formatters["%s::%s"](suffixonly(filename),filename)
+ else
+ stamp=formatters["%s::%s"](askedformat,filename)
+ end
result=stamp and instance.found[stamp]
if result then
if trace_locating then
@@ -14821,7 +15726,7 @@ collect_instance_files=function(filename,askedformat,allresults)
end
if stamp then
if trace_locating then
- report_resolving("remembering file %a",filename)
+ report_resolving("remembering file %a using hash %a",filename,stamp)
end
instance.found[stamp]=result
end
@@ -14829,6 +15734,9 @@ collect_instance_files=function(filename,askedformat,allresults)
end
end
local function findfiles(filename,filetype,allresults)
+ if not filename or filename=="" then
+ return {}
+ end
local result,status=collect_instance_files(filename,filetype or "",allresults)
if not result or #result==0 then
local lowered=lower(filename)
@@ -14848,39 +15756,30 @@ 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 base=filebasename(filename)
+ local result={}
local hashes=instance.hashes
- local noffound=0
+ local function okay(hash,path,name)
+ local found=methodhandler('concatinators',hash.type,hash.name,path,name)
+ if found and found~="" then
+ result[#result+1]=resolveprefix(found)
+ return not allresults
+ end
+ end
for k=1,#hashes do
local hash=hashes[k]
- local files=instance.files[hash.name] or {}
- local blist=files[bname]
- if not blist then
- local rname="remap:"..bname
- blist=files[rname]
- if blist then
- bname=files[rname]
- blist=files[bname]
- end
- end
- if blist then
- if type(blist)=='string' then
- local found=methodhandler('concatinators',hash.type,hash.name,blist,bname) or ""
- if found~="" then
- noffound=noffound+1
- result[noffound]=resolvers.resolve(found)
- if not allresults then
- break
- end
+ local content=instance.files[hash.name]
+ if content then
+ local path,name=lookup(content,base)
+ if not path then
+ elseif type(path)=="string" then
+ if okay(hash,path,name) then
+ return result
end
else
- for kk=1,#blist do
- local vv=blist[kk]
- local found=methodhandler('concatinators',hash.type,hash.name,vv,bname) or ""
- if found~="" then
- noffound=noffound+1
- result[noffound]=resolvers.resolve(found)
- if not allresults then break end
+ for i=1,#path do
+ if okay(hash,path[i],name) then
+ return result
end
end
end
@@ -14894,64 +15793,80 @@ end
function resolvers.findgivenfile(filename)
return findgivenfiles(filename,false)[1] or ""
end
-local function doit(path,blist,bname,tag,variant,result,allresults)
- local done=false
- if blist and variant then
- local resolve=resolvers.resolve
- if type(blist)=='string' then
- if find(lower(blist),path) then
- local full=methodhandler('concatinators',variant,tag,blist,bname) or ""
- result[#result+1]=resolve(full)
- done=true
- end
- else
- for kk=1,#blist do
- local vv=blist[kk]
- if find(lower(vv),path) then
- local full=methodhandler('concatinators',variant,tag,vv,bname) or ""
- result[#result+1]=resolve(full)
- done=true
- if not allresults then break end
- end
- end
- end
- end
- return done
-end
local makewildcard=Cs(
(P("^")^0*P("/")*P(-1)+P(-1))/".*"+(P("^")^0*P("/")/"")^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)
- result=result or {}
+local function findwildcardfiles(filename,allresults,result)
+ local result=result or {}
local base=filebasename(filename)
local dirn=filedirname(filename)
local path=lower(lpegmatch(makewildcard,dirn) or dirn)
local name=lower(lpegmatch(makewildcard,base) or base)
- local files,done=instance.files,false
+ local files=instance.files
if find(name,"*",1,true) then
local hashes=instance.hashes
+ local function okay(found,path,base,hashname,hashtype)
+ if find(found,path) then
+ local full=methodhandler('concatinators',hashtype,hashname,found,base)
+ if full and full~="" then
+ result[#result+1]=resolveprefix(full)
+ return not allresults
+ end
+ end
+ end
for k=1,#hashes do
local hash=hashes[k]
- local hashname,hashtype=hash.name,hash.type
- for kk,hh in next,files[hashname] do
- if not find(kk,"^remap:") then
- if find(lower(kk),name) then
- if doit(path,hh,kk,hashname,hashtype,result,allresults) then done=true end
- if done and not allresults then break end
+ local hashname=hash.name
+ local hashtype=hash.type
+ if hashname and hashtype then
+ for found,base in filtered(files[hashname],name) do
+ if type(found)=='string' then
+ if okay(found,path,base,hashname,hashtype) then
+ break
+ end
+ else
+ for i=1,#found do
+ if okay(found[i],path,base,hashname,hashtype) then
+ break
+ end
+ end
end
end
end
end
else
+ local function okayokay(found,path,base,hashname,hashtype)
+ if find(found,path) then
+ local full=methodhandler('concatinators',hashtype,hashname,found,base)
+ if full and full~="" then
+ result[#result+1]=resolveprefix(full)
+ return not allresults
+ end
+ end
+ end
local hashes=instance.hashes
for k=1,#hashes do
local hash=hashes[k]
- local hashname,hashtype=hash.name,hash.type
- if doit(path,files[hashname][base],base,hashname,hashtype,result,allresults) then done=true end
- if done and not allresults then break end
+ local hashname=hash.name
+ local hashtype=hash.type
+ if hashname and hashtype then
+ local found,base=lookup(content,base)
+ if not found then
+ elseif type(found)=='string' then
+ if okay(found,path,base,hashname,hashtype) then
+ break
+ end
+ else
+ for i=1,#found do
+ if okay(found[i],path,base,hashname,hashtype) then
+ break
+ end
+ end
+ end
+ end
end
end
return result
@@ -15024,7 +15939,7 @@ end
function resolvers.dowithpath(name,func)
local pathlist=resolvers.expandedpathlist(name)
for i=1,#pathlist do
- func("^"..resolvers.cleanpath(pathlist[i]))
+ func("^"..cleanpath(pathlist[i]))
end
end
function resolvers.dowithvariable(name,func)
@@ -15032,23 +15947,23 @@ function resolvers.dowithvariable(name,func)
end
function resolvers.locateformat(name)
local engine=environment.ownmain or "luatex"
- local barename=file.removesuffix(name)
- local fullname=file.addsuffix(barename,"fmt")
+ local barename=removesuffix(name)
+ local fullname=addsuffix(barename,"fmt")
local fmtname=caches.getfirstreadablefile(fullname,"formats",engine) or ""
if fmtname=="" then
fmtname=resolvers.findfile(fullname)
- fmtname=resolvers.cleanpath(fmtname)
+ fmtname=cleanpath(fmtname)
end
if fmtname~="" then
- local barename=file.removesuffix(fmtname)
- local luaname=file.addsuffix(barename,luasuffixes.lua)
- local lucname=file.addsuffix(barename,luasuffixes.luc)
- local luiname=file.addsuffix(barename,luasuffixes.lui)
- if lfs.isfile(luiname) then
+ local barename=removesuffix(fmtname)
+ local luaname=addsuffix(barename,luasuffixes.lua)
+ local lucname=addsuffix(barename,luasuffixes.luc)
+ local luiname=addsuffix(barename,luasuffixes.lui)
+ if isfile(luiname) then
return barename,luiname
- elseif lfs.isfile(lucname) then
+ elseif isfile(lucname) then
return barename,lucname
- elseif lfs.isfile(luaname) then
+ elseif isfile(luaname) then
return barename,luaname
end
end
@@ -15070,29 +15985,24 @@ function resolvers.dowithfilesintree(pattern,handle,before,after)
local hash=hashes[i]
local blobtype=hash.type
local blobpath=hash.name
- if blobpath then
+ if blobtype and blobpath then
+ local total=0
+ local checked=0
+ local done=0
if before then
before(blobtype,blobpath,pattern)
end
- local files=instance.files[blobpath]
- local total,checked,done=0,0,0
- if files then
- for k,v in table.sortedhash(files) do
- total=total+1
- if find(k,"^remap:") then
- elseif find(k,pattern) then
- if type(v)=="string" then
- checked=checked+1
- if handle(blobtype,blobpath,v,k) then
- done=done+1
- end
- else
- checked=checked+#v
- for i=1,#v do
- if handle(blobtype,blobpath,v[i],k) then
- done=done+1
- end
- end
+ for path,name in filtered(instance.files[blobpath],pattern) do
+ if type(path)=="string" then
+ checked=checked+1
+ if handle(blobtype,blobpath,path,name) then
+ done=done+1
+ end
+ else
+ checked=checked+#path
+ for i=1,#path do
+ if handle(blobtype,blobpath,path[i],name) then
+ done=done+1
end
end
end
@@ -15103,8 +16013,8 @@ function resolvers.dowithfilesintree(pattern,handle,before,after)
end
end
end
-resolvers.obsolete=resolvers.obsolete or {}
-local obsolete=resolvers.obsolete
+local obsolete=resolvers.obsolete or {}
+resolvers.obsolete=obsolete
resolvers.find_file=resolvers.findfile obsolete.find_file=resolvers.findfile
resolvers.find_files=resolvers.findfiles obsolete.find_files=resolvers.findfiles
@@ -15115,7 +16025,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-pre"] = package.loaded["data-pre"] or true
--- original size: 6643, stripped down to: 4401
+-- original size: 3950, stripped down to: 2935
if not modules then modules={} end modules ['data-pre']={
version=1.001,
@@ -15125,44 +16035,51 @@ if not modules then modules={} end modules ['data-pre']={
license="see context related readme files"
}
local resolvers=resolvers
-local prefixes=utilities.storage.allocate()
-resolvers.prefixes=prefixes
-local cleanpath,findgivenfile,expansion=resolvers.cleanpath,resolvers.findgivenfile,resolvers.expansion
+local prefixes=resolvers.prefixes
+local cleanpath=resolvers.cleanpath
+local findgivenfile=resolvers.findgivenfile
+local expansion=resolvers.expansion
local getenv=resolvers.getenv
-local P,S,R,C,Cs,Cc,lpegmatch=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.match
-local joinpath,basename,dirname=file.join,file.basename,file.dirname
-local getmetatable,rawset,type=getmetatable,rawset,type
+local basename=file.basename
+local dirname=file.dirname
+local joinpath=file.join
+local isfile=lfs.isfile
prefixes.environment=function(str)
return cleanpath(expansion(str))
end
-prefixes.relative=function(str,n)
- if io.exists(str) then
- elseif io.exists("./"..str) then
- str="./"..str
- else
- local p="../"
- for i=1,n or 2 do
- if io.exists(p..str) then
- str=p..str
- break
- else
- p=p.."../"
+local function relative(str,n)
+ if not isfile(str) then
+ local pstr="./"..str
+ if isfile(pstr) then
+ str=pstr
+ else
+ local p="../"
+ for i=1,n or 2 do
+ local pstr=p..str
+ if isfile(pstr) then
+ str=pstr
+ break
+ else
+ p=p.."../"
+ end
end
end
end
return cleanpath(str)
end
+local function locate(str)
+ local fullname=findgivenfile(str) or ""
+ return cleanpath(fullname~="" and fullname or str)
+end
+prefixes.relative=relative
+prefixes.locate=locate
prefixes.auto=function(str)
- local fullname=prefixes.relative(str)
- if not lfs.isfile(fullname) then
- fullname=prefixes.locate(str)
+ local fullname=relative(str)
+ if not isfile(fullname) then
+ fullname=locate(str)
end
return fullname
end
-prefixes.locate=function(str)
- local fullname=findgivenfile(str) or ""
- return cleanpath((fullname~="" and fullname) or str)
-end
prefixes.filename=function(str)
local fullname=findgivenfile(str) or ""
return cleanpath(basename((fullname~="" and fullname) or str))
@@ -15183,6 +16100,13 @@ end
prefixes.home=function(str)
return cleanpath(joinpath(getenv('HOME'),str))
end
+prefixes.env=prefixes.environment
+prefixes.rel=prefixes.relative
+prefixes.loc=prefixes.locate
+prefixes.kpse=prefixes.locate
+prefixes.full=prefixes.locate
+prefixes.file=prefixes.filename
+prefixes.path=prefixes.pathname
local function toppath()
local inputstack=resolvers.inputstack
if not inputstack then
@@ -15195,98 +16119,22 @@ local function toppath()
return pathname
end
end
-resolvers.toppath=toppath
-prefixes.toppath=function(str)
- return cleanpath(joinpath(toppath(),str))
-end
-prefixes.env=prefixes.environment
-prefixes.rel=prefixes.relative
-prefixes.loc=prefixes.locate
-prefixes.kpse=prefixes.locate
-prefixes.full=prefixes.locate
-prefixes.file=prefixes.filename
-prefixes.path=prefixes.pathname
-function resolvers.allprefixes(separator)
- local all=table.sortedkeys(prefixes)
- if separator then
- for i=1,#all do
- all[i]=all[i]..":"
- end
- end
- return all
-end
-local function _resolve_(method,target)
- local action=prefixes[method]
- if action then
- return action(target)
- else
- return method..":"..target
- end
-end
-local resolved,abstract={},{}
-function resolvers.resetresolve(str)
- resolved,abstract={},{}
-end
-local pattern=Cs((C(R("az")^2)*P(":")*C((1-S(" \"\';,"))^1)/_resolve_+P(1))^0)
-local prefix=C(R("az")^2)*P(":")
-local target=C((1-S(" \"\';,"))^1)
-local notarget=(#S(";,")+P(-1))*Cc("")
-local pattern=Cs(((prefix*(target+notarget))/_resolve_+P(1))^0)
-local function resolve(str)
- if type(str)=="table" then
- local t={}
- for i=1,#str do
- t[i]=resolve(str[i])
- end
- return t
+local function jobpath()
+ local path=resolvers.stackpath()
+ if not path or path=="" then
+ return "."
else
- local res=resolved[str]
- if not res then
- res=lpegmatch(pattern,str)
- resolved[str]=res
- abstract[res]=str
- end
- return res
- end
-end
-local function unresolve(str)
- return abstract[str] or str
-end
-resolvers.resolve=resolve
-resolvers.unresolve=unresolve
-if type(os.uname)=="function" then
- for k,v in next,os.uname() do
- if not prefixes[k] then
- prefixes[k]=function() return v end
- end
- end
-end
-if os.type=="unix" then
- local pattern
- local function makepattern(t,k,v)
- if t then
- rawset(t,k,v)
- end
- local colon=P(":")
- for k,v in table.sortedpairs(prefixes) do
- if p then
- p=P(k)+p
- else
- p=P(k)
- end
- end
- pattern=Cs((p*colon+colon/";"+P(1))^0)
- end
- makepattern()
- getmetatable(prefixes).__newindex=makepattern
- function resolvers.repath(str)
- return lpegmatch(pattern,str)
- end
-else
- function resolvers.repath(str)
- return str
+ return path
end
end
+resolvers.toppath=toppath
+resolvers.jobpath=jobpath
+prefixes.toppath=function(str) return cleanpath(joinpath(toppath(),str)) end
+prefixes.jobpath=function(str) return cleanpath(joinpath(jobpath(),str)) end
+resolvers.setdynamic("toppath")
+resolvers.setdynamic("jobpath")
+prefixes.jobfile=prefixes.jobpath
+resolvers.setdynamic("jobfile")
end -- of closure
@@ -15348,7 +16196,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-fil"] = package.loaded["data-fil"] or true
--- original size: 3801, stripped down to: 3231
+-- original size: 3863, stripped down to: 3310
if not modules then modules={} end modules ['data-fil']={
version=1.001,
@@ -15360,30 +16208,31 @@ if not modules then modules={} end modules ['data-fil']={
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 resolveprefix=resolvers.resolve
local finders,openers,loaders,savers=resolvers.finders,resolvers.openers,resolvers.loaders,resolvers.savers
local locators,hashers,generators,concatinators=resolvers.locators,resolvers.hashers,resolvers.generators,resolvers.concatinators
local checkgarbage=utilities.garbagecollector and utilities.garbagecollector.check
function locators.file(specification)
- local name=specification.filename
- local realname=resolvers.resolve(name)
+ local filename=specification.filename
+ local realname=resolveprefix(filename)
if realname and realname~='' and lfs.isdir(realname) then
if trace_locating then
- report_files("file locator %a found as %a",name,realname)
+ report_files("file locator %a found as %a",filename,realname)
end
- resolvers.appendhash('file',name,true)
+ resolvers.appendhash('file',filename,true)
elseif trace_locating then
- report_files("file locator %a not found",name)
+ report_files("file locator %a not found",filename)
end
end
function hashers.file(specification)
- local name=specification.filename
- local content=caches.loadcontent(name,'files')
- resolvers.registerfilehash(name,content,content==nil)
+ local pathname=specification.filename
+ local content=caches.loadcontent(pathname,'files')
+ resolvers.registerfilehash(pathname,content,content==nil)
end
function generators.file(specification)
- local path=specification.filename
- local content=resolvers.scanfiles(path,false,true)
- resolvers.registerfilehash(path,content,true)
+ local pathname=specification.filename
+ local content=resolvers.scanfiles(pathname,false,true)
+ resolvers.registerfilehash(pathname,content,true)
end
concatinators.file=file.join
function finders.file(specification,filetype)
@@ -15665,7 +16514,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-zip"] = package.loaded["data-zip"] or true
--- original size: 8489, stripped down to: 6757
+-- original size: 8772, stripped down to: 6841
if not modules then modules={} end modules ['data-zip']={
version=1.001,
@@ -15684,16 +16533,6 @@ zip.archives=zip.archives or {}
local archives=zip.archives
zip.registeredfiles=zip.registeredfiles or {}
local registeredfiles=zip.registeredfiles
-local limited=false
-directives.register("system.inputmode",function(v)
- if not limited then
- local i_limiter=io.i_limiter(v)
- if i_limiter then
- zip.open=i_limiter.protect(zip.open)
- limited=true
- end
- end
-end)
local function validzip(str)
if not find(str,"^zip://") then
return "zip:///"..str
@@ -15708,7 +16547,7 @@ function zip.openarchive(name)
local arch=archives[name]
if not arch then
local full=resolvers.findfile(name) or ""
- arch=(full~="" and zip.open(full)) or false
+ arch=full~="" and zip.open(full) or false
archives[name]=arch
end
return arch
@@ -15867,31 +16706,42 @@ function resolvers.usezipfile(archive)
end
end
function resolvers.registerzipfile(z,tree)
- local files,filter={},""
- if tree=="" then
- filter="^(.+)/(.-)$"
- else
- filter=format("^%s/(.+)/(.-)$",tree)
- end
+ local names={}
+ local files={}
+ local remap={}
+ local n=0
+ local filter=tree=="" and "^(.+)/(.-)$" or format("^%s/(.+)/(.-)$",tree)
+ local register=resolvers.registerfile
if trace_locating then
report_zip("registering: using filter %a",filter)
end
- local register,n=resolvers.registerfile,0
for i in z:files() do
- local path,name=match(i.filename,filter)
- if path then
- if name and name~='' then
- register(files,name,path)
- n=n+1
- else
+ local filename=i.filename
+ local path,name=match(filename,filter)
+ if not path then
+ n=n+1
+ register(names,filename,"")
+ local usedname=lower(filename)
+ files[usedname]=""
+ if usedname~=filename then
+ remap[usedname]=filename
end
- else
- register(files,i.filename,'')
+ elseif name and name~="" then
n=n+1
+ register(names,name,path)
+ local usedname=lower(name)
+ files[usedname]=path
+ if usedname~=name then
+ remap[usedname]=name
+ end
+ else
end
end
report_zip("registering: %s files registered",n)
- return files
+ return {
+ files=files,
+ remap=remap,
+ }
end
@@ -15901,7 +16751,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tre"] = package.loaded["data-tre"] or true
--- original size: 2508, stripped down to: 2074
+-- original size: 8479, stripped down to: 5580
if not modules then modules={} end modules ['data-tre']={
version=1.001,
@@ -15910,42 +16760,64 @@ if not modules then modules={} end modules ['data-tre']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local find,gsub,format=string.find,string.gsub,string.format
+local find,gsub,lower=string.find,string.gsub,string.lower
+local basename,dirname,joinname=file.basename,file.dirname,file .join
+local globdir,isdir,isfile=dir.glob,lfs.isdir,lfs.isfile
+local P,lpegmatch=lpeg.P,lpeg.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_trees=logs.reporter("resolvers","trees")
local resolvers=resolvers
-local done,found,notfound={},{},resolvers.finders.notfound
-function resolvers.finders.tree(specification)
+local resolveprefix=resolvers.resolve
+local notfound=resolvers.finders.notfound
+local lookup=resolvers.get_from_content
+local collectors={}
+local found={}
+function resolvers.finders.tree(specification)
local spec=specification.filename
- local fnd=found[spec]
- if fnd==nil then
+ local okay=found[spec]
+ if okay==nil then
if spec~="" then
- local path,name=file.dirname(spec),file.basename(spec)
- if path=="" then path="." end
- local hash=done[path]
- if not hash then
- local pattern=path.."/*"
- hash=dir.glob(pattern)
- done[path]=hash
+ local path=dirname(spec)
+ local name=basename(spec)
+ if path=="" then
+ path="."
+ end
+ local names=collectors[path]
+ if not names then
+ local pattern=find(path,"/%*+$") and path or (path.."/*")
+ names=globdir(pattern)
+ collectors[path]=names
end
local pattern="/"..gsub(name,"([%.%-%+])","%%%1").."$"
- for k=1,#hash do
- local v=hash[k]
- if find(v,pattern) then
- found[spec]=v
- return v
+ for i=1,#names do
+ local fullname=names[i]
+ if find(fullname,pattern) then
+ found[spec]=fullname
+ return fullname
+ end
+ end
+ local pattern=lower(pattern)
+ for i=1,#names do
+ local fullname=lower(names[i])
+ if find(fullname,pattern) then
+ if isfile(fullname) then
+ found[spec]=fullname
+ return fullname
+ else
+ break
+ end
end
end
end
- fnd=notfound()
- found[spec]=fnd
+ okay=notfound()
+ found[spec]=okay
end
- return fnd
+ return okay
end
function resolvers.locators.tree(specification)
local name=specification.filename
- local realname=resolvers.resolve(name)
- if realname and realname~='' and lfs.isdir(realname) then
+ local realname=resolveprefix(name)
+ if realname and realname~='' and isdir(realname) then
if trace_locating then
report_trees("locator %a found",realname)
end
@@ -15956,16 +16828,110 @@ function resolvers.locators.tree(specification)
end
function resolvers.hashers.tree(specification)
local name=specification.filename
- if trace_locating then
- report_trees("analysing %a",name)
- end
+ report_trees("analyzing %a",name)
resolvers.methodhandler("hashers",name)
resolvers.generators.file(specification)
end
-resolvers.concatinators.tree=resolvers.concatinators.file
-resolvers.generators.tree=resolvers.generators.file
-resolvers.openers.tree=resolvers.openers.file
-resolvers.loaders.tree=resolvers.loaders.file
+local collectors={}
+local splitter=lpeg.splitat("/**/")
+local stripper=lpeg.replacer { [P("/")*P("*")^1*P(-1)]="" }
+table.setmetatableindex(collectors,function(t,k)
+ local rootname=lpegmatch(stripper,k)
+ local dataname=joinname(rootname,"dirlist")
+ local content=caches.loadcontent(dataname,"files",dataname)
+ if not content then
+ content=resolvers.scanfiles(rootname,nil,nil,false,true)
+ caches.savecontent(dataname,"files",content,dataname)
+ end
+ t[k]=content
+ return content
+end)
+local function checked(root,p,n)
+ if p then
+ if type(p)=="table" then
+ for i=1,#p do
+ local fullname=joinname(root,p[i],n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ else
+ local fullname=joinname(root,p,n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ end
+ return notfound()
+end
+local function resolve(specification)
+ local filename=specification.filename
+ if filename~="" then
+ local root,rest=lpegmatch(splitter,filename)
+ if root and rest then
+ local path,name=dirname(rest),basename(rest)
+ if name~=rest then
+ local content=collectors[root]
+ local p,n=lookup(content,name)
+ if not p then
+ return notfound()
+ end
+ local pattern=".*/"..path.."$"
+ local istable=type(p)=="table"
+ if istable then
+ for i=1,#p do
+ local pi=p[i]
+ if pi==path or find(pi,pattern) then
+ local fullname=joinname(root,pi,n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ end
+ elseif p==path or find(p,pattern) then
+ local fullname=joinname(root,p,n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ local queries=specification.queries
+ if queries and queries.option=="fileonly" then
+ return checked(root,p,n)
+ else
+ return notfound()
+ end
+ end
+ end
+ local path,name=dirname(filename),basename(filename)
+ local root=lpegmatch(stripper,path)
+ local content=collectors[path]
+ local p,n=lookup(content,name)
+ if p then
+ return checked(root,p,n)
+ end
+ end
+ return notfound()
+end
+resolvers.finders .dirlist=resolve
+resolvers.locators .dirlist=resolvers.locators .tree
+resolvers.hashers .dirlist=resolvers.hashers .tree
+resolvers.generators.dirlist=resolvers.generators.file
+resolvers.openers .dirlist=resolvers.openers .file
+resolvers.loaders .dirlist=resolvers.loaders .file
+function resolvers.finders.dirfile(specification)
+ local queries=specification.queries
+ if queries then
+ queries.option="fileonly"
+ else
+ specification.queries={ option="fileonly" }
+ end
+ return resolve(specification)
+end
+resolvers.locators .dirfile=resolvers.locators .dirlist
+resolvers.hashers .dirfile=resolvers.hashers .dirlist
+resolvers.generators.dirfile=resolvers.generators.dirlist
+resolvers.openers .dirfile=resolvers.openers .dirlist
+resolvers.loaders .dirfile=resolvers.loaders .dirlist
end -- of closure
@@ -15974,7 +16940,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-sch"] = package.loaded["data-sch"] or true
--- original size: 6213, stripped down to: 5160
+-- original size: 6569, stripped down to: 5304
if not modules then modules={} end modules ['data-sch']={
version=1.001,
@@ -16000,8 +16966,13 @@ directives.register("schemes.threshold",function(v) threshold=tonumber(v) or thr
function cleaners.none(specification)
return specification.original
end
-function cleaners.strip(specification)
- return (gsub(specification.original,"[^%a%d%.]+","-"))
+function cleaners.strip(specification)
+ local path,name=file.splitbase(specification.original)
+ if path=="" then
+ return (gsub(name,"[^%a%d%.]+","-"))
+ else
+ return (gsub((gsub(path,"%.","-").."-"..name),"[^%a%d%.]+","-"))
+ end
end
function cleaners.md5(specification)
return file.addsuffix(md5.hex(specification.original),file.suffix(specification.path))
@@ -16018,7 +16989,7 @@ end
local cached,loaded,reused,thresholds,handlers={},{},{},{},{}
local function runcurl(name,cachename)
local command="curl --silent --insecure --create-dirs --output "..cachename.." "..name
- os.spawn(command)
+ os.execute(command)
end
local function fetch(specification)
local original=specification.original
@@ -16150,7 +17121,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-lua"] = package.loaded["data-lua"] or true
--- original size: 4237, stripped down to: 3177
+-- original size: 4313, stripped down to: 3227
if not modules then modules={} end modules ['data-lua']={
version=1.001,
@@ -16159,7 +17130,7 @@ if not modules then modules={} end modules ['data-lua']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local resolvers,package=resolvers,package
+local package,lpeg=package,lpeg
local gsub=string.gsub
local concat=table.concat
local addsuffix=file.addsuffix
@@ -16170,9 +17141,11 @@ local luaformats={ 'TEXINPUTS','LUAINPUTS' }
local libformats={ 'CLUAINPUTS' }
local helpers=package.helpers or {}
local methods=helpers.methods or {}
+local resolvers=resolvers
+local resolveprefix=resolvers.resolve
+helpers.report=logs.reporter("resolvers","libraries")
trackers.register("resolvers.libraries",function(v) helpers.trace=v end)
trackers.register("resolvers.locating",function(v) helpers.trace=v end)
-helpers.report=logs.reporter("resolvers","libraries")
helpers.sequence={
"already loaded",
"preload table",
@@ -16187,7 +17160,7 @@ helpers.sequence={
}
local pattern=Cs(P("!")^0/""*(P("/")*P(-1)/"/"+P("/")^1/"/"+1)^0)
function helpers.cleanpath(path)
- return resolvers.resolve(lpegmatch(pattern,path))
+ return resolveprefix(lpegmatch(pattern,path))
end
local loadedaslib=helpers.loadedaslib
local getextraluapaths=package.extraluapaths
@@ -16324,7 +17297,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tmf"] = package.loaded["data-tmf"] or true
--- original size: 2600, stripped down to: 1627
+-- original size: 2601, stripped down to: 1627
if not modules then modules={} end modules ['data-tmf']={
version=1.001,
@@ -16380,7 +17353,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-lst"] = package.loaded["data-lst"] or true
--- original size: 2654, stripped down to: 2301
+-- original size: 2734, stripped down to: 2354
if not modules then modules={} end modules ['data-lst']={
version=1.001,
@@ -16389,10 +17362,13 @@ if not modules then modules={} end modules ['data-lst']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local find,concat,upper,format=string.find,table.concat,string.upper,string.format
+local rawget,type,next=rawget,type,next
+local find,concat,upper=string.find,table.concat,string.upper
local fastcopy,sortedpairs=table.fastcopy,table.sortedpairs
-resolvers.listers=resolvers.listers or {}
local resolvers=resolvers
+local listers=resolvers.listers or {}
+resolvers.listers=listers
+local resolveprefix=resolvers.resolve
local report_lists=logs.reporter("resolvers","lists")
local function tabstr(str)
if type(str)=='table' then
@@ -16401,7 +17377,7 @@ local function tabstr(str)
return str
end
end
-function resolvers.listers.variables(pattern)
+function listers.variables(pattern)
local instance=resolvers.instance
local environment=instance.environment
local variables=instance.variables
@@ -16422,10 +17398,10 @@ function resolvers.listers.variables(pattern)
for key,value in sortedpairs(configured) do
if key~="" and (pattern=="" or find(upper(key),pattern)) then
report_lists(key)
- report_lists(" env: %s",tabstr(rawget(environment,key)) or "unset")
- report_lists(" var: %s",tabstr(configured[key]) or "unset")
- report_lists(" exp: %s",tabstr(expansions[key]) or "unset")
- report_lists(" res: %s",tabstr(resolvers.resolve(expansions[key])) or "unset")
+ report_lists(" env: %s",tabstr(rawget(environment,key)) or "unset")
+ report_lists(" var: %s",tabstr(configured[key]) or "unset")
+ report_lists(" exp: %s",tabstr(expansions[key]) or "unset")
+ report_lists(" res: %s",tabstr(resolveprefix(expansions[key])) or "unset")
end
end
instance.environment=fastcopy(env)
@@ -16433,15 +17409,15 @@ function resolvers.listers.variables(pattern)
instance.expansions=fastcopy(exp)
end
local report_resolved=logs.reporter("system","resolved")
-function resolvers.listers.configurations()
+function listers.configurations()
local configurations=resolvers.instance.specification
for i=1,#configurations do
- report_resolved("file : %s",resolvers.resolve(configurations[i]))
+ report_resolved("file : %s",resolveprefix(configurations[i]))
end
report_resolved("")
local list=resolvers.expandedpathfromlist(resolvers.splitpath(resolvers.luacnfspec))
for i=1,#list do
- local li=resolvers.resolve(list[i])
+ local li=resolveprefix(list[i])
if lfs.isdir(li) then
report_resolved("path - %s",li)
else
@@ -16746,7 +17722,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["luat-fmt"] = package.loaded["luat-fmt"] or true
--- original size: 5951, stripped down to: 4922
+-- original size: 5955, stripped down to: 4926
if not modules then modules={} end modules ['luat-fmt']={
version=1.001,
@@ -16834,7 +17810,7 @@ function environment.make_format(name)
end
local command=format("%s --ini %s --lua=%s %s %sdump",engine,primaryflags(),quoted(usedluastub),quoted(fulltexsourcename),os.platform=="unix" and "\\\\" or "\\")
report_format("running command: %s\n",command)
- os.spawn(command)
+ os.execute(command)
local pattern=file.removesuffix(file.basename(usedluastub)).."-*.mem"
local mp=dir.glob(pattern)
if mp then
@@ -16869,7 +17845,7 @@ function environment.run_format(name,data,more)
else
local command=format("%s %s --fmt=%s --lua=%s %s %s",engine,primaryflags(),quoted(barename),quoted(luaname),quoted(data),more~="" and quoted(more) or "")
report_format("running command: %s",command)
- os.spawn(command)
+ os.execute(command)
end
end
end
@@ -16880,8 +17856,8 @@ end -- of closure
-- used libraries : l-lua.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-mrg.lua util-tpl.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.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-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
-- skipped libraries : -
--- original bytes : 695180
--- stripped bytes : 246794
+-- original bytes : 739251
+-- stripped bytes : 264497
-- end library merge
@@ -17107,6 +18083,7 @@ local helpinfo = [[
<category name="basic">
<subcategory>
<flag name="script"><short>run an mtx script (lua prefered method) (<ref name="noquotes"/>), no script gives list</short></flag>
+ <flag name="evaluate"><short>run code passed on the commandline (between quotes)</short></flag>
<flag name="execute"><short>run a script or program (texmfstart method) (<ref name="noquotes"/>)</short></flag>
<flag name="resolve"><short>resolve prefixed arguments</short></flag>
<flag name="ctxlua"><short>run internally (using preloaded libs)</short></flag>
@@ -17132,6 +18109,7 @@ local helpinfo = [[
<flag name="verbose"><short>give a bit more info</short></flag>
<flag name="trackers" value="list"><short>enable given trackers</short></flag>
<flag name="progname" value="str"><short>format or backend</short></flag>
+ <flag name="systeminfo" value="str"><short>show current operating system, processor, etc</short></flag>
</subcategory>
<subcategory>
<flag name="edit"><short>launch editor with found file</short></flag>
@@ -17761,6 +18739,39 @@ function runners.associate(filename)
os.launch(filename)
end
+function runners.evaluate(code,filename) -- for Luigi
+ if code == "loop" then
+ while true do
+ io.write("> ")
+ local code = io.read()
+ if code ~= "" then
+ local temp = string.match(code,"^= (.*)$")
+ if temp then
+ code = "print("..temp..")"
+ end
+ local compiled, message = loadstring(code)
+ if type(compiled) ~= "function" then
+ io.write("! " .. (message or code).."\n")
+ else
+ io.write(compiled())
+ end
+ end
+ end
+ else
+ if type(code) ~= "string" or code == "" then
+ code = filename
+ end
+ if code ~= "" then
+ local compiled, message = loadstring(code)
+ if type(compiled) ~= "function" then
+ io.write("invalid lua code: " .. (message or code))
+ return
+ end
+ io.write(compiled())
+ end
+ end
+end
+
function runners.gethelp(filename)
local url = environment.argument("url")
if url and url ~= "" then
@@ -17772,6 +18783,15 @@ function runners.gethelp(filename)
end
end
+function runners.systeminfo()
+ report("architecture : %s",os.platform or "<unset>")
+ report("operating system : %s",os.name or "<unset>")
+ report("file architecture : %s",os.type or "<unset>")
+ report("binary path : %s",os.selfdir or "<unset>")
+ report("binary suffix : %s",os.binsuffix or "<unset>")
+ report("library suffix : %s",os.libsuffix or "<unset>")
+end
+
-- this is a bit dirty ... first we store the first filename and next we
-- split the arguments so that we only see the ones meant for this script
-- ... later we will use the second half
@@ -17887,16 +18907,7 @@ end
if e_argument("ansi") then
- local formatters = string.formatters
-
- logs.setformatters {
- report_yes = formatters["%-15s | %s"],
- report_nop = formatters["%-15s |"],
- subreport_yes = formatters["%-15s | %s | %s"],
- subreport_nop = formatters["%-15s | %s |"],
- status_yes = formatters["%-15s : %s\n"],
- status_nop = formatters["%-15s :\n"],
- }
+ logs.setformatters("ansi")
local script = e_argument("script") or e_argument("scripts")
@@ -17921,6 +18932,10 @@ if e_argument("script") or e_argument("scripts") then
ok = runners.execute_ctx_script(filename)
end
+elseif e_argument("evaluate") then
+
+ runners.evaluate(e_argument("evaluate"),filename)
+
elseif e_argument("selfmerge") then
-- embed used libraries
@@ -18213,6 +19228,10 @@ elseif e_argument("exporthelp") then
runners.loadbase()
application.export(e_argument("exporthelp"),filename)
+elseif e_argument("systeminfo") then
+
+ runners.systeminfo()
+
elseif e_argument("help") or filename=='help' or filename == "" then
application.help()
diff --git a/Master/bin/win32/mtxrun.lua b/Master/bin/win32/mtxrun.lua
index 5cb5c8d2416..48a9a27a250 100755
--- a/Master/bin/win32/mtxrun.lua
+++ b/Master/bin/win32/mtxrun.lua
@@ -56,7 +56,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lua"] = package.loaded["l-lua"] or true
--- original size: 3409, stripped down to: 1763
+-- original size: 3888, stripped down to: 2197
if not modules then modules={} end modules ['l-lua']={
version=1.001,
@@ -139,6 +139,13 @@ end
if lua then
lua.mask=load([[τεχ = 1]]) and "utf" or "ascii"
end
+local flush=io.flush
+if flush then
+ local execute=os.execute if execute then function os.execute(...) flush() return execute(...) end end
+ local exec=os.exec if exec then function os.exec (...) flush() return exec (...) end end
+ local spawn=os.spawn if spawn then function os.spawn (...) flush() return spawn (...) end end
+ local popen=io.popen if popen then function io.popen (...) flush() return popen (...) end end
+end
end -- of closure
@@ -437,7 +444,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lpeg"] = package.loaded["l-lpeg"] or true
--- original size: 29983, stripped down to: 16202
+-- original size: 36225, stripped down to: 19891
if not modules then modules={} end modules ['l-lpeg']={
version=1.001,
@@ -498,6 +505,8 @@ patterns.utfbom_16_le=utfbom_16_le
patterns.utfbom_8=utfbom_8
patterns.utf_16_be_nl=P("\000\r\000\n")+P("\000\r")+P("\000\n")
patterns.utf_16_le_nl=P("\r\000\n\000")+P("\r\000")+P("\n\000")
+patterns.utf_32_be_nl=P("\000\000\000\r\000\000\000\n")+P("\000\000\000\r")+P("\000\000\000\n")
+patterns.utf_32_le_nl=P("\r\000\000\000\n\000\000\000")+P("\r\000\000\000")+P("\n\000\000\000")
patterns.utf8one=R("\000\127")
patterns.utf8two=R("\194\223")*utf8next
patterns.utf8three=R("\224\239")*utf8next*utf8next
@@ -527,9 +536,21 @@ patterns.nonwhitespace=nonwhitespace
local stripper=spacer^0*C((spacer^0*nonspacer^1)^0)
local fullstripper=whitespace^0*C((whitespace^0*nonwhitespace^1)^0)
local collapser=Cs(spacer^0/""*nonspacer^0*((spacer^0/" "*nonspacer^1)^0))
+local b_collapser=Cs(whitespace^0/""*(nonwhitespace^1+whitespace^1/" ")^0)
+local e_collapser=Cs((whitespace^1*P(-1)/""+nonwhitespace^1+whitespace^1/" ")^0)
+local m_collapser=Cs((nonwhitespace^1+whitespace^1/" ")^0)
+local b_stripper=Cs(spacer^0/""*(nonspacer^1+spacer^1/" ")^0)
+local e_stripper=Cs((spacer^1*P(-1)/""+nonspacer^1+spacer^1/" ")^0)
+local m_stripper=Cs((nonspacer^1+spacer^1/" ")^0)
patterns.stripper=stripper
patterns.fullstripper=fullstripper
patterns.collapser=collapser
+patterns.b_collapser=b_collapser
+patterns.m_collapser=m_collapser
+patterns.e_collapser=e_collapser
+patterns.b_stripper=b_stripper
+patterns.m_stripper=m_stripper
+patterns.e_stripper=e_stripper
patterns.lowercase=lowercase
patterns.uppercase=uppercase
patterns.letter=patterns.lowercase+patterns.uppercase
@@ -566,9 +587,12 @@ patterns.integer=sign^-1*digit^1
patterns.unsigned=digit^0*period*digit^1
patterns.float=sign^-1*patterns.unsigned
patterns.cunsigned=digit^0*comma*digit^1
+patterns.cpunsigned=digit^0*(period+comma)*digit^1
patterns.cfloat=sign^-1*patterns.cunsigned
+patterns.cpfloat=sign^-1*patterns.cpunsigned
patterns.number=patterns.float+patterns.integer
patterns.cnumber=patterns.cfloat+patterns.integer
+patterns.cpnumber=patterns.cpfloat+patterns.integer
patterns.oct=zero*octdigit^1
patterns.octal=patterns.oct
patterns.HEX=zero*P("X")*(digit+uppercase)^1
@@ -985,23 +1009,40 @@ function lpeg.append(list,pp,delayed,checked)
end
return p
end
+local p_false=P(false)
+local p_true=P(true)
local function make(t)
- local p
+ local function making(t)
+ local p=p_false
+ local keys=sortedkeys(t)
+ for i=1,#keys do
+ local k=keys[i]
+ if k~="" then
+ local v=t[k]
+ if v==true then
+ p=p+P(k)*p_true
+ elseif v==false then
+ else
+ p=p+P(k)*making(v)
+ end
+ end
+ end
+ if t[""] then
+ p=p+p_true
+ end
+ return p
+ end
+ local p=p_false
local keys=sortedkeys(t)
for i=1,#keys do
local k=keys[i]
- local v=t[k]
- if not p then
- if next(v) then
- p=P(k)*make(v)
- else
- p=P(k)
- end
- else
- if next(v) then
- p=p+P(k)*make(v)
+ if k~="" then
+ local v=t[k]
+ if v==true then
+ p=p+P(k)*p_true
+ elseif v==false then
else
- p=p+P(k)
+ p=p+P(k)*making(v)
end
end
end
@@ -1009,13 +1050,73 @@ local function make(t)
end
function lpeg.utfchartabletopattern(list)
local tree={}
- for i=1,#list do
- local t=tree
- for c in gmatch(list[i],".") do
- if not t[c] then
- t[c]={}
+ local n=#list
+ if n==0 then
+ for s in next,list do
+ local t=tree
+ local p,pk
+ for c in gmatch(s,".") do
+ if t==true then
+ t={ [c]=true,[""]=true }
+ p[pk]=t
+ p=t
+ t=false
+ elseif t==false then
+ t={ [c]=false }
+ p[pk]=t
+ p=t
+ t=false
+ else
+ local tc=t[c]
+ if not tc then
+ tc=false
+ t[c]=false
+ end
+ p=t
+ t=tc
+ end
+ pk=c
+ end
+ if t==false then
+ p[pk]=true
+ elseif t==true then
+ else
+ t[""]=true
+ end
+ end
+ else
+ for i=1,n do
+ local s=list[i]
+ local t=tree
+ local p,pk
+ for c in gmatch(s,".") do
+ if t==true then
+ t={ [c]=true,[""]=true }
+ p[pk]=t
+ p=t
+ t=false
+ elseif t==false then
+ t={ [c]=false }
+ p[pk]=t
+ p=t
+ t=false
+ else
+ local tc=t[c]
+ if not tc then
+ tc=false
+ t[c]=false
+ end
+ p=t
+ t=tc
+ end
+ pk=c
+ end
+ if t==false then
+ p[pk]=true
+ elseif t==true then
+ else
+ t[""]=true
end
- t=t[c]
end
end
return make(tree)
@@ -1055,6 +1156,65 @@ local case_2=period*(digit-trailingzeros)^1*(trailingzeros/"")
local number=digit^1*(case_1+case_2)
local stripper=Cs((number+1)^0)
lpeg.patterns.stripzeros=stripper
+local byte_to_HEX={}
+local byte_to_hex={}
+local byte_to_dec={}
+local hex_to_byte={}
+for i=0,255 do
+ local H=format("%02X",i)
+ local h=format("%02x",i)
+ local d=format("%03i",i)
+ local c=char(i)
+ byte_to_HEX[c]=H
+ byte_to_hex[c]=h
+ byte_to_dec[c]=d
+ hex_to_byte[h]=c
+ hex_to_byte[H]=c
+end
+local hextobyte=P(2)/hex_to_byte
+local bytetoHEX=P(1)/byte_to_HEX
+local bytetohex=P(1)/byte_to_hex
+local bytetodec=P(1)/byte_to_dec
+local hextobytes=Cs(hextobyte^0)
+local bytestoHEX=Cs(bytetoHEX^0)
+local bytestohex=Cs(bytetohex^0)
+local bytestodec=Cs(bytetodec^0)
+patterns.hextobyte=hextobyte
+patterns.bytetoHEX=bytetoHEX
+patterns.bytetohex=bytetohex
+patterns.bytetodec=bytetodec
+patterns.hextobytes=hextobytes
+patterns.bytestoHEX=bytestoHEX
+patterns.bytestohex=bytestohex
+patterns.bytestodec=bytestodec
+function string.toHEX(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(bytestoHEX,s)
+ end
+end
+function string.tohex(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(bytestohex,s)
+ end
+end
+function string.todec(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(bytestodec,s)
+ end
+end
+function string.tobytes(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(hextobytes,s)
+ end
+end
end -- of closure
@@ -1082,7 +1242,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-string"] = package.loaded["l-string"] or true
--- original size: 5671, stripped down to: 2827
+-- original size: 5694, stripped down to: 2827
if not modules then modules={} end modules ['l-string']={
version=1.001,
@@ -1187,7 +1347,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-table"] = package.loaded["l-table"] or true
--- original size: 31860, stripped down to: 20846
+-- original size: 33830, stripped down to: 21894
if not modules then modules={} end modules ['l-table']={
version=1.001,
@@ -1230,11 +1390,12 @@ function table.keys(t)
end
end
local function compare(a,b)
- local ta,tb=type(a),type(b)
- if ta==tb then
+ local ta=type(a)
+ local tb=type(b)
+ if ta==tb and ta=="number" then
return a<b
else
- return tostring(a)<tostring(b)
+ return tostring(a)<tostring(b)
end
end
local function sortedkeys(tab)
@@ -1334,14 +1495,14 @@ local function sortedhash(t,cmp)
end
local n=0
local m=#s
- local function kv(s)
+ local function kv()
if n<m then
n=n+1
local k=s[n]
return k,t[k]
end
end
- return kv,s
+ return kv
else
return nothing
end
@@ -1506,7 +1667,7 @@ local function simple_table(t)
if tv=="number" then
nt=nt+1
if hexify then
- tt[nt]=format("0x%04X",v)
+ tt[nt]=format("0x%X",v)
else
tt[nt]=tostring(v)
end
@@ -1537,7 +1698,7 @@ local function do_serialize(root,name,depth,level,indexed)
local tn=type(name)
if tn=="number" then
if hexify then
- handle(format("%s[0x%04X]={",depth,name))
+ handle(format("%s[0x%X]={",depth,name))
else
handle(format("%s[%s]={",depth,name))
end
@@ -1554,7 +1715,7 @@ local function do_serialize(root,name,depth,level,indexed)
end
end
end
- if root and next(root) then
+ if root and next(root)~=nil then
local first,last=nil,0
if compact then
last=#root
@@ -1576,7 +1737,7 @@ local function do_serialize(root,name,depth,level,indexed)
if compact and first and tk=="number" and k>=first and k<=last then
if tv=="number" then
if hexify then
- handle(format("%s 0x%04X,",depth,v))
+ handle(format("%s 0x%X,",depth,v))
else
handle(format("%s %s,",depth,v))
end
@@ -1587,7 +1748,7 @@ local function do_serialize(root,name,depth,level,indexed)
handle(format("%s %q,",depth,v))
end
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
handle(format("%s {},",depth))
elseif inline then
local st=simple_table(v)
@@ -1617,25 +1778,25 @@ local function do_serialize(root,name,depth,level,indexed)
elseif tv=="number" then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=0x%04X,",depth,k,v))
+ handle(format("%s [0x%X]=0x%X,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
elseif tk=="boolean" then
if hexify then
- handle(format("%s [%s]=0x%04X,",depth,k and "true" or "false",v))
+ handle(format("%s [%s]=0x%X,",depth,k and "true" or "false",v))
else
handle(format("%s [%s]=%s,",depth,k and "true" or "false",v))
end
elseif noquotes and not reserved[k] and lpegmatch(propername,k) then
if hexify then
- handle(format("%s %s=0x%04X,",depth,k,v))
+ handle(format("%s %s=0x%X,",depth,k,v))
else
handle(format("%s %s=%s,",depth,k,v))
end
else
if hexify then
- handle(format("%s [%q]=0x%04X,",depth,k,v))
+ handle(format("%s [%q]=0x%X,",depth,k,v))
else
handle(format("%s [%q]=%s,",depth,k,v))
end
@@ -1644,7 +1805,7 @@ local function do_serialize(root,name,depth,level,indexed)
if reduce and tonumber(v) then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%s,",depth,k,v))
+ handle(format("%s [0x%X]=%s,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
@@ -1658,7 +1819,7 @@ local function do_serialize(root,name,depth,level,indexed)
else
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%q,",depth,k,v))
+ handle(format("%s [0x%X]=%q,",depth,k,v))
else
handle(format("%s [%s]=%q,",depth,k,v))
end
@@ -1671,10 +1832,10 @@ local function do_serialize(root,name,depth,level,indexed)
end
end
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]={},",depth,k))
+ handle(format("%s [0x%X]={},",depth,k))
else
handle(format("%s [%s]={},",depth,k))
end
@@ -1690,7 +1851,7 @@ local function do_serialize(root,name,depth,level,indexed)
if st then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]={ %s },",depth,k,concat(st,", ")))
+ handle(format("%s [0x%X]={ %s },",depth,k,concat(st,", ")))
else
handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
end
@@ -1710,7 +1871,7 @@ local function do_serialize(root,name,depth,level,indexed)
elseif tv=="boolean" then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%s,",depth,k,v and "true" or "false"))
+ handle(format("%s [0x%X]=%s,",depth,k,v and "true" or "false"))
else
handle(format("%s [%s]=%s,",depth,k,v and "true" or "false"))
end
@@ -1726,7 +1887,7 @@ local function do_serialize(root,name,depth,level,indexed)
local f=getinfo(v).what=="C" and dump(dummy) or dump(v)
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=load(%q),",depth,k,f))
+ handle(format("%s [0x%X]=load(%q),",depth,k,f))
else
handle(format("%s [%s]=load(%q),",depth,k,f))
end
@@ -1741,7 +1902,7 @@ local function do_serialize(root,name,depth,level,indexed)
else
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%q,",depth,k,tostring(v)))
+ handle(format("%s [0x%X]=%q,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%q,",depth,k,tostring(v)))
end
@@ -1795,7 +1956,7 @@ local function serialize(_handle,root,name,specification)
end
elseif tname=="number" then
if hexify then
- handle(format("[0x%04X]={",name))
+ handle(format("[0x%X]={",name))
else
handle("["..name.."]={")
end
@@ -1813,7 +1974,7 @@ local function serialize(_handle,root,name,specification)
local dummy=root._w_h_a_t_e_v_e_r_
root._w_h_a_t_e_v_e_r_=nil
end
- if next(root) then
+ if next(root)~=nil then
do_serialize(root,name,"",0)
end
end
@@ -1942,14 +2103,25 @@ local function identical(a,b)
end
table.identical=identical
table.are_equal=are_equal
-function table.compact(t)
- if t then
- for k,v in next,t do
- if not next(v) then
- t[k]=nil
+local function sparse(old,nest,keeptables)
+ local new={}
+ for k,v in next,old do
+ if not (v=="" or v==false) then
+ if nest and type(v)=="table" then
+ v=sparse(v,nest)
+ if keeptables or next(v)~=nil then
+ new[k]=v
+ end
+ else
+ new[k]=v
end
end
end
+ return new
+end
+table.sparse=sparse
+function table.compact(t)
+ return sparse(t,true,true)
end
function table.contains(t,v)
if t then
@@ -2054,10 +2226,10 @@ function table.sub(t,i,j)
return { unpack(t,i,j) }
end
function table.is_empty(t)
- return not t or not next(t)
+ return not t or next(t)==nil
end
function table.has_one_entry(t)
- return t and not next(t,next(t))
+ return t and next(t,next(t))==nil
end
function table.loweredkeys(t)
local l={}
@@ -2102,6 +2274,44 @@ function table.values(t,s)
return {}
end
end
+function table.filtered(t,pattern,sort,cmp)
+ if t and type(pattern)=="string" then
+ if sort then
+ local s
+ if cmp then
+ s=sortedhashkeys(t,function(a,b) return cmp(t,a,b) end)
+ else
+ s=sortedkeys(t)
+ end
+ local n=0
+ local m=#s
+ local function kv(s)
+ while n<m do
+ n=n+1
+ local k=s[n]
+ if find(k,pattern) then
+ return k,t[k]
+ end
+ end
+ end
+ return kv,s
+ else
+ local n=next(t)
+ local function iterator()
+ while n~=nil do
+ local k=n
+ n=next(t,k)
+ if find(k,pattern) then
+ return k,t[k]
+ end
+ end
+ end
+ return iterator,t
+ end
+ else
+ return nothing
+ end
+end
end -- of closure
@@ -2110,7 +2320,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-io"] = package.loaded["l-io"] or true
--- original size: 8824, stripped down to: 6347
+-- original size: 8643, stripped down to: 6232
if not modules then modules={} end modules ['l-io']={
version=1.001,
@@ -2417,8 +2627,6 @@ function io.readstring(f,n,m)
local str=gsub(f:read(n),"\000","")
return str
end
-if not io.i_limiter then function io.i_limiter() end end
-if not io.o_limiter then function io.o_limiter() end end
end -- of closure
@@ -2645,7 +2853,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-os"] = package.loaded["l-os"] or true
--- original size: 16093, stripped down to: 9704
+-- original size: 15761, stripped down to: 9403
if not modules then modules={} end modules ['l-os']={
version=1.001,
@@ -2719,13 +2927,10 @@ if not os.__getenv__ then
setmetatable(os.env,{ __index=__index,__newindex=__newindex } )
end
end
-local execute,spawn,exec,iopopen,ioflush=os.execute,os.spawn or os.execute,os.exec or os.execute,io.popen,io.flush
-function os.execute(...) ioflush() return execute(...) end
-function os.spawn (...) ioflush() return spawn (...) end
-function os.exec (...) ioflush() return exec (...) end
-function io.popen (...) ioflush() return iopopen(...) end
+local execute=os.execute
+local iopopen=io.popen
function os.resultof(command)
- local handle=io.popen(command,"r")
+ local handle=iopopen(command,"r")
if handle then
local result=handle:read("*all") or ""
handle:close()
@@ -2754,7 +2959,7 @@ local launchers={
unix="$BROWSER %s &> /dev/null &",
}
function os.launch(str)
- os.execute(format(launchers[os.name] or launchers.unix,str))
+ execute(format(launchers[os.name] or launchers.unix,str))
end
if not os.times then
function os.times()
@@ -3029,7 +3234,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-file"] = package.loaded["l-file"] or true
--- original size: 18308, stripped down to: 9948
+-- original size: 20949, stripped down to: 9945
if not modules then modules={} end modules ['l-file']={
version=1.001,
@@ -3043,41 +3248,28 @@ local file=file
if not lfs then
lfs=optionalrequire("lfs")
end
-if not lfs then
- lfs={
- getcurrentdir=function()
- return "."
- end,
- attributes=function()
- return nil
- end,
- isfile=function(name)
- local f=io.open(name,'rb')
- if f then
- f:close()
- return true
- end
- end,
- isdir=function(name)
- print("you need to load lfs")
- return false
- end
- }
-elseif not lfs.isfile then
- local attributes=lfs.attributes
- function lfs.isdir(name)
- return attributes(name,"mode")=="directory"
- end
- function lfs.isfile(name)
- return attributes(name,"mode")=="file"
- end
-end
local insert,concat=table.insert,table.concat
local match,find,gmatch=string.match,string.find,string.gmatch
local lpegmatch=lpeg.match
local getcurrentdir,attributes=lfs.currentdir,lfs.attributes
local checkedsplit=string.checkedsplit
local P,R,S,C,Cs,Cp,Cc,Ct=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Cs,lpeg.Cp,lpeg.Cc,lpeg.Ct
+local tricky=S("/\\")*P(-1)
+local attributes=lfs.attributes
+if sandbox then
+ sandbox.redefine(lfs.isfile,"lfs.isfile")
+ sandbox.redefine(lfs.isdir,"lfs.isdir")
+end
+function lfs.isdir(name)
+ if lpegmatch(tricky,name) then
+ return attributes(name,"mode")=="directory"
+ else
+ return attributes(name.."/.","mode")=="directory"
+ end
+end
+function lfs.isfile(name)
+ return attributes(name,"mode")=="file"
+end
local colon=P(":")
local period=P(".")
local periods=P("..")
@@ -3279,28 +3471,30 @@ local isroot=fwslash^1*-1
local hasroot=fwslash^1
local reslasher=lpeg.replacer(S("\\/"),"/")
local deslasher=lpeg.replacer(S("\\/")^1,"/")
-function file.join(...)
- local lst={... }
- local one=lst[1]
+function file.join(one,two,three,...)
+ if not two then
+ return one=="" and one or lpegmatch(stripper,one)
+ end
+ if one=="" then
+ return lpegmatch(stripper,three and concat({ two,three,... },"/") or two)
+ end
if lpegmatch(isnetwork,one) then
local one=lpegmatch(reslasher,one)
- local two=lpegmatch(deslasher,concat(lst,"/",2))
+ local two=lpegmatch(deslasher,three and concat({ two,three,... },"/") or two)
if lpegmatch(hasroot,two) then
return one..two
else
return one.."/"..two
end
elseif lpegmatch(isroot,one) then
- local two=lpegmatch(deslasher,concat(lst,"/",2))
+ local two=lpegmatch(deslasher,three and concat({ two,three,... },"/") or two)
if lpegmatch(hasroot,two) then
return two
else
return "/"..two
end
- elseif one=="" then
- return lpegmatch(stripper,concat(lst,"/",2))
else
- return lpegmatch(deslasher,concat(lst,"/"))
+ return lpegmatch(deslasher,concat({ one,two,three,... },"/"))
end
end
local drivespec=R("az","AZ")^1*colon
@@ -3474,7 +3668,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-md5"] = package.loaded["l-md5"] or true
--- original size: 3760, stripped down to: 2088
+-- original size: 3248, stripped down to: 2266
if not modules then modules={} end modules ['l-md5']={
version=1.001,
@@ -3492,14 +3686,20 @@ if not md5 then
}
end
local md5,file=md5,file
-local gsub,format,byte=string.gsub,string.format,string.byte
-local md5sum=md5.sum
-local function convert(str,fmt)
- return (gsub(md5sum(str),".",function(chr) return format(fmt,byte(chr)) end))
-end
-if not md5.HEX then function md5.HEX(str) return convert(str,"%02X") end end
-if not md5.hex then function md5.hex(str) return convert(str,"%02x") end end
-if not md5.dec then function md5.dec(str) return convert(str,"%03i") end end
+local gsub=string.gsub
+do
+ local patterns=lpeg and lpeg.patterns
+ if patterns then
+ local bytestoHEX=patterns.bytestoHEX
+ local bytestohex=patterns.bytestohex
+ local bytestodec=patterns.bytestodec
+ local lpegmatch=lpeg.match
+ local md5sum=md5.sum
+ if not md5.HEX then function md5.HEX(str) if str then return lpegmatch(bytestoHEX,md5sum(str)) end end end
+ if not md5.hex then function md5.hex(str) if str then return lpegmatch(bytestohex,md5sum(str)) end end end
+ if not md5.dec then function md5.dec(str) if str then return lpegmatch(bytestodec,md5sum(str)) end end end
+ end
+end
function file.needsupdating(oldname,newname,threshold)
local oldtime=lfs.attributes(oldname,"modification")
if oldtime then
@@ -3556,7 +3756,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-url"] = package.loaded["l-url"] or true
--- original size: 12292, stripped down to: 5585
+-- original size: 12531, stripped down to: 5721
if not modules then modules={} end modules ['l-url']={
version=1.001,
@@ -3642,19 +3842,25 @@ local splitquery=Cf (Ct("")*P { "sequence",
pair=Cg(key*equal*value),
},rawset)
local function hashed(str)
- if str=="" then
+ if not str or str=="" then
return {
scheme="invalid",
original=str,
}
end
- local s=split(str)
- local rawscheme=s[1]
- local rawquery=s[4]
- local somescheme=rawscheme~=""
- local somequery=rawquery~=""
+ local detailed=split(str)
+ local rawscheme=""
+ local rawquery=""
+ local somescheme=false
+ local somequery=false
+ if detailed then
+ rawscheme=detailed[1]
+ rawquery=detailed[4]
+ somescheme=rawscheme~=""
+ somequery=rawquery~=""
+ end
if not somescheme and not somequery then
- s={
+ return {
scheme="file",
authority="",
path=str,
@@ -3664,28 +3870,28 @@ local function hashed(str)
noscheme=true,
filename=str,
}
- else
- local authority,path,filename=s[2],s[3]
- if authority=="" then
- filename=path
- elseif path=="" then
- filename=""
- else
- filename=authority.."/"..path
- end
- s={
- scheme=rawscheme,
- authority=authority,
- path=path,
- query=lpegmatch(unescaper,rawquery),
- queries=lpegmatch(splitquery,rawquery),
- fragment=s[5],
- original=str,
- noscheme=false,
- filename=filename,
- }
end
- return s
+ local authority=detailed[2]
+ local path=detailed[3]
+ local filename=nil
+ if authority=="" then
+ filename=path
+ elseif path=="" then
+ filename=""
+ else
+ filename=authority.."/"..path
+ end
+ return {
+ scheme=rawscheme,
+ authority=authority,
+ path=path,
+ query=lpegmatch(unescaper,rawquery),
+ queries=lpegmatch(splitquery,rawquery),
+ fragment=detailed[5],
+ original=str,
+ noscheme=false,
+ filename=filename,
+ }
end
url.split=split
url.hasscheme=hasscheme
@@ -3719,7 +3925,7 @@ function url.construct(hash)
end
return lpegmatch(escaper,concat(fullurl))
end
-local pattern=Cs(noslash*R("az","AZ")*(S(":|")/":")*noslash*P(1)^0)
+local pattern=Cs(slash^-1/""*R("az","AZ")*((S(":|")/":")+P(":"))*slash*P(1)^0)
function url.filename(filename)
local spec=hashed(filename)
local path=spec.path
@@ -3767,7 +3973,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-dir"] = package.loaded["l-dir"] or true
--- original size: 14788, stripped down to: 9096
+-- original size: 16765, stripped down to: 11003
if not modules then modules={} end modules ['l-dir']={
version=1.001,
@@ -3777,7 +3983,7 @@ if not modules then modules={} end modules ['l-dir']={
license="see context related readme files"
}
local type,select=type,select
-local find,gmatch,match,gsub=string.find,string.gmatch,string.match,string.gsub
+local find,gmatch,match,gsub,sub=string.find,string.gmatch,string.match,string.gsub,string.sub
local concat,insert,remove,unpack=table.concat,table.insert,table.remove,table.unpack
local lpegmatch=lpeg.match
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
@@ -3786,53 +3992,126 @@ local dir=dir
local lfs=lfs
local attributes=lfs.attributes
local walkdir=lfs.dir
-local isdir=lfs.isdir
-local isfile=lfs.isfile
+local isdir=lfs.isdir
+local isfile=lfs.isfile
local currentdir=lfs.currentdir
local chdir=lfs.chdir
local mkdir=lfs.mkdir
local onwindows=os.type=="windows" or find(os.getenv("PATH"),";",1,true)
-if not isdir then
- function isdir(name)
- local a=attributes(name)
- return a and a.mode=="directory"
+if onwindows then
+ local tricky=S("/\\")*P(-1)
+ isdir=function(name)
+ if lpegmatch(tricky,name) then
+ return attributes(name,"mode")=="directory"
+ else
+ return attributes(name.."/.","mode")=="directory"
+ end
+ end
+ isfile=function(name)
+ return attributes(name,"mode")=="file"
end
lfs.isdir=isdir
-end
-if not isfile then
- function isfile(name)
- local a=attributes(name)
- return a and a.mode=="file"
+ lfs.isfile=isfile
+else
+ isdir=function(name)
+ return attributes(name,"mode")=="directory"
end
+ isfile=function(name)
+ return attributes(name,"mode")=="file"
+ end
+ lfs.isdir=isdir
lfs.isfile=isfile
end
function dir.current()
return (gsub(currentdir(),"\\","/"))
end
-local lfsisdir=isdir
-local function isdir(path)
- path=gsub(path,"[/\\]+$","")
- return lfsisdir(path)
+local function glob_pattern_function(path,patt,recurse,action)
+ if isdir(path) then
+ local usedpath
+ if path=="/" then
+ usedpath="/."
+ elseif not find(path,"/$") then
+ usedpath=path.."/."
+ path=path.."/"
+ else
+ usedpath=path
+ end
+ local dirs
+ for name in walkdir(usedpath) do
+ if name~="." and name~=".." then
+ local full=path..name
+ local mode=attributes(full,'mode')
+ if mode=='file' then
+ if not patt or find(full,patt) then
+ action(full)
+ end
+ elseif recurse and mode=="directory" then
+ if not dirs then
+ dirs={ full }
+ else
+ dirs[#dirs+1]=full
+ end
+ end
+ end
+ end
+ if dirs then
+ for i=1,#dirs do
+ glob_pattern_function(dirs[i],patt,recurse,action)
+ end
+ end
+ end
end
-lfs.isdir=isdir
-local function globpattern(path,patt,recurse,action)
- if path=="/" then
- path=path.."."
- elseif not find(path,"/$") then
- path=path..'/'
- end
- if isdir(path) then
- for name in walkdir(path) do
- local full=path..name
- local mode=attributes(full,'mode')
- if mode=='file' then
- if find(full,patt) then
- action(full)
+local function glob_pattern_table(path,patt,recurse,result)
+ if not result then
+ result={}
+ end
+ if isdir(path) then
+ local usedpath
+ if path=="/" then
+ usedpath="/."
+ elseif not find(path,"/$") then
+ usedpath=path.."/."
+ path=path.."/"
+ else
+ usedpath=path
+ end
+ local dirs
+ for name in walkdir(usedpath) do
+ if name~="." and name~=".." then
+ local full=path..name
+ local mode=attributes(full,'mode')
+ if mode=='file' then
+ if not patt or find(full,patt) then
+ result[#result+1]=full
+ end
+ elseif recurse and mode=="directory" then
+ if not dirs then
+ dirs={ full }
+ else
+ dirs[#dirs+1]=full
+ end
end
- elseif recurse and (mode=="directory") and (name~='.') and (name~="..") then
- globpattern(full,patt,recurse,action)
end
end
+ if dirs then
+ for i=1,#dirs do
+ glob_pattern_table(dirs[i],patt,recurse,result)
+ end
+ end
+ end
+ return result
+end
+local function globpattern(path,patt,recurse,method)
+ local kind=type(method)
+ if patt and sub(patt,1,-3)==path then
+ patt=false
+ end
+ if kind=="function" then
+ return glob_pattern_function(path,patt,recurse,method)
+ elseif kind=="table" then
+ return glob_pattern_table(path,patt,recurse,method)
+ else
+ return glob_pattern_table(path,patt,recurse,{})
end
end
dir.globpattern=globpattern
@@ -3845,34 +4124,40 @@ local function collectpattern(path,patt,recurse,result)
ok,scanner,first=xpcall(function() return walkdir(path) end,function() end)
end
if ok and type(scanner)=="function" then
- if not find(path,"/$") then path=path..'/' end
+ if not find(path,"/$") then
+ path=path..'/'
+ end
for name in scanner,first do
- local full=path..name
- local attr=attributes(full)
- local mode=attr.mode
- if mode=='file' then
- if find(full,patt) then
+ if name=="." then
+ elseif name==".." then
+ else
+ local full=path..name
+ local attr=attributes(full)
+ local mode=attr.mode
+ if mode=='file' then
+ if find(full,patt) then
+ result[name]=attr
+ end
+ elseif recurse and mode=="directory" then
+ attr.list=collectpattern(full,patt,recurse)
result[name]=attr
end
- elseif recurse and (mode=="directory") and (name~='.') and (name~="..") then
- attr.list=collectpattern(full,patt,recurse)
- result[name]=attr
end
end
end
return result
end
dir.collectpattern=collectpattern
-local separator
-if onwindows then
+local separator,pattern
+if onwindows then
local slash=S("/\\")/"/"
- pattern=Ct {
+ pattern={
[1]=(Cs(P(".")+slash^1)+Cs(R("az","AZ")*P(":")*slash^0)+Cc("./"))*V(2)*V(3),
[2]=Cs(((1-S("*?/\\"))^0*slash)^0),
[3]=Cs(P(1)^0)
}
-else
- pattern=Ct {
+else
+ pattern={
[1]=(C(P(".")+P("/")^1)+Cc("./"))*V(2)*V(3),
[2]=C(((1-S("*?/"))^0*P("/"))^0),
[3]=C(P(1)^0)
@@ -3890,9 +4175,8 @@ local function glob(str,t)
elseif 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 root,path,base=lpegmatch(pattern,str)
+ if root and path and base then
local recurse=find(base,"**",1,true)
local start=root..path
local result=lpegmatch(filter,start..base)
@@ -3914,16 +4198,12 @@ local function glob(str,t)
return { str }
end
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 root,path,base=lpegmatch(pattern,str)
+ if root and path and base then
local recurse=find(base,"**",1,true)
local start=root..path
local result=lpegmatch(filter,start..base)
- globpattern(start,result,recurse,action)
- return t
+ return globpattern(start,result,recurse,t)
else
return {}
end
@@ -4071,47 +4351,51 @@ else
end
end
dir.makedirs=dir.mkdirs
-if onwindows then
- function dir.expandname(str)
- 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()
+do
+ local chdir=sandbox and sandbox.original(chdir) or chdir
+ if onwindows then
+ local xcurrentdir=dir.current
+ function dir.expandname(str)
+ local first,nothing,last=match(str,"^(//)(//*)(.*)$")
+ if first then
+ first=xcurrentdir().."/"
+ 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=xcurrentdir()
+ end
+ chdir(d)
end
- chdir(d)
+ end
+ if not first then
+ first,last=xcurrentdir(),str
+ end
+ last=gsub(last,"//","/")
+ last=gsub(last,"/%./","/")
+ last=gsub(last,"^/*","")
+ first=gsub(first,"/*$","")
+ if last=="" or last=="." then
+ return first
+ else
+ return first.."/"..last
end
end
- if not first then
- first,last=dir.current(),str
- end
- last=gsub(last,"//","/")
- last=gsub(last,"/%./","/")
- last=gsub(last,"^/*","")
- first=gsub(first,"/*$","")
- if last=="" or last=="." then
- return first
- else
- return first.."/"..last
- end
- end
-else
- function dir.expandname(str)
- if not find(str,"^/") then
- str=currentdir().."/"..str
+ else
+ function dir.expandname(str)
+ if not find(str,"^/") then
+ str=currentdir().."/"..str
+ end
+ str=gsub(str,"//","/")
+ str=gsub(str,"/%./","/")
+ str=gsub(str,"(.)/%.$","%1")
+ return str
end
- str=gsub(str,"//","/")
- str=gsub(str,"/%./","/")
- str=gsub(str,"(.)/%.$","%1")
- return str
end
end
file.expandname=dir.expandname
@@ -4154,7 +4438,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-boolean"] = package.loaded["l-boolean"] or true
--- original size: 1809, stripped down to: 1527
+-- original size: 1850, stripped down to: 1568
if not modules then modules={} end modules ['l-boolean']={
version=1.001,
@@ -4208,11 +4492,11 @@ function string.booleanstring(str)
return str=="yes" or str=="on" or str=="t"
end
end
-function string.is_boolean(str,default)
+function string.is_boolean(str,default,strict)
if type(str)=="string" then
- if str=="true" or str=="yes" or str=="on" or str=="t" or str=="1" then
+ if str=="true" or str=="yes" or str=="on" or str=="t" or (not strict and str=="1") then
return true
- elseif str=="false" or str=="no" or str=="off" or str=="f" or str=="0" then
+ elseif str=="false" or str=="no" or str=="off" or str=="f" or (not strict and str=="0") then
return false
end
end
@@ -4226,7 +4510,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-unicode"] = package.loaded["l-unicode"] or true
--- original size: 33706, stripped down to: 14938
+-- original size: 37233, stripped down to: 15684
if not modules then modules={} end modules ['l-unicode']={
version=1.001,
@@ -4242,7 +4526,9 @@ local type=type
local char,byte,format,sub,gmatch=string.char,string.byte,string.format,string.sub,string.gmatch
local concat=table.concat
local P,C,R,Cs,Ct,Cmt,Cc,Carg,Cp=lpeg.P,lpeg.C,lpeg.R,lpeg.Cs,lpeg.Ct,lpeg.Cmt,lpeg.Cc,lpeg.Carg,lpeg.Cp
-local lpegmatch,patterns=lpeg.match,lpeg.patterns
+local lpegmatch=lpeg.match
+local patterns=lpeg.patterns
+local tabletopattern=lpeg.utfchartabletopattern
local bytepairs=string.bytepairs
local finder=lpeg.finder
local replacer=lpeg.replacer
@@ -4251,7 +4537,7 @@ local utfgmatch=utf.gmatch
local p_utftype=patterns.utftype
local p_utfstricttype=patterns.utfstricttype
local p_utfoffset=patterns.utfoffset
-local p_utf8char=patterns.utf8char
+local p_utf8char=patterns.utf8character
local p_utf8byte=patterns.utf8byte
local p_utfbom=patterns.utfbom
local p_newline=patterns.newline
@@ -4450,15 +4736,52 @@ if not utf.sub then
end
end
end
-function utf.remapper(mapping)
- local pattern=Cs((p_utf8char/mapping)^0)
- return function(str)
- if not str or str=="" then
- return ""
+function utf.remapper(mapping,option)
+ local variant=type(mapping)
+ if variant=="table" then
+ if option=="dynamic" then
+ local pattern=false
+ table.setmetatablenewindex(mapping,function(t,k,v) rawset(t,k,v) pattern=false end)
+ return function(str)
+ if not str or str=="" then
+ return ""
+ else
+ if not pattern then
+ pattern=Cs((tabletopattern(mapping)/mapping+p_utf8char)^0)
+ end
+ return lpegmatch(pattern,str)
+ end
+ end
+ elseif option=="pattern" then
+ return Cs((tabletopattern(mapping)/mapping+p_utf8char)^0)
else
- return lpegmatch(pattern,str)
+ local pattern=Cs((tabletopattern(mapping)/mapping+p_utf8char)^0)
+ return function(str)
+ if not str or str=="" then
+ return ""
+ else
+ return lpegmatch(pattern,str)
+ end
+ end,pattern
+ end
+ elseif variant=="function" then
+ if option=="pattern" then
+ return Cs((p_utf8char/mapping+p_utf8char)^0)
+ else
+ local pattern=Cs((p_utf8char/mapping+p_utf8char)^0)
+ return function(str)
+ if not str or str=="" then
+ return ""
+ else
+ return lpegmatch(pattern,str)
+ end
+ end,pattern
+ end
+ else
+ return function(str)
+ return str or ""
end
- end,pattern
+ end
end
function utf.replacer(t)
local r=replacer(t,false,false,true)
@@ -4508,190 +4831,157 @@ function utf.magic(f)
end
local utf16_to_utf8_be,utf16_to_utf8_le
local utf32_to_utf8_be,utf32_to_utf8_le
-local utf_16_be_linesplitter=patterns.utfbom_16_be^-1*lpeg.tsplitat(patterns.utf_16_be_nl)
-local utf_16_le_linesplitter=patterns.utfbom_16_le^-1*lpeg.tsplitat(patterns.utf_16_le_nl)
-if bytepairs then
- utf16_to_utf8_be=function(t)
- if type(t)=="string" then
- t=lpegmatch(utf_16_be_linesplitter,t)
- end
- local 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)
- end
- return t
+local utf_16_be_getbom=patterns.utfbom_16_be^-1
+local utf_16_le_getbom=patterns.utfbom_16_le^-1
+local utf_32_be_getbom=patterns.utfbom_32_be^-1
+local utf_32_le_getbom=patterns.utfbom_32_le^-1
+local utf_16_be_linesplitter=utf_16_be_getbom*lpeg.tsplitat(patterns.utf_16_be_nl)
+local utf_16_le_linesplitter=utf_16_le_getbom*lpeg.tsplitat(patterns.utf_16_le_nl)
+local utf_32_be_linesplitter=utf_32_be_getbom*lpeg.tsplitat(patterns.utf_32_be_nl)
+local utf_32_le_linesplitter=utf_32_le_getbom*lpeg.tsplitat(patterns.utf_32_le_nl)
+local more=0
+local p_utf16_to_utf8_be=C(1)*C(1)/function(left,right)
+ local now=256*byte(left)+byte(right)
+ if more>0 then
+ now=(more-0xD800)*0x400+(now-0xDC00)+0x10000
+ more=0
+ return utfchar(now)
+ elseif now>=0xD800 and now<=0xDBFF then
+ more=now
+ return ""
+ else
+ return utfchar(now)
+ end
+end
+local p_utf16_to_utf8_le=C(1)*C(1)/function(right,left)
+ local now=256*byte(left)+byte(right)
+ if more>0 then
+ now=(more-0xD800)*0x400+(now-0xDC00)+0x10000
+ more=0
+ return utfchar(now)
+ elseif now>=0xD800 and now<=0xDBFF then
+ more=now
+ return ""
+ else
+ return utfchar(now)
+ end
+end
+local p_utf32_to_utf8_be=C(1)*C(1)*C(1)*C(1)/function(a,b,c,d)
+ return utfchar(256*256*256*byte(a)+256*256*byte(b)+256*byte(c)+byte(d))
+end
+local p_utf32_to_utf8_le=C(1)*C(1)*C(1)*C(1)/function(a,b,c,d)
+ return utfchar(256*256*256*byte(d)+256*256*byte(c)+256*byte(b)+byte(a))
+end
+p_utf16_to_utf8_be=P(true)/function() more=0 end*utf_16_be_getbom*Cs(p_utf16_to_utf8_be^0)
+p_utf16_to_utf8_le=P(true)/function() more=0 end*utf_16_le_getbom*Cs(p_utf16_to_utf8_le^0)
+p_utf32_to_utf8_be=P(true)/function() more=0 end*utf_32_be_getbom*Cs(p_utf32_to_utf8_be^0)
+p_utf32_to_utf8_le=P(true)/function() more=0 end*utf_32_le_getbom*Cs(p_utf32_to_utf8_le^0)
+patterns.utf16_to_utf8_be=p_utf16_to_utf8_be
+patterns.utf16_to_utf8_le=p_utf16_to_utf8_le
+patterns.utf32_to_utf8_be=p_utf32_to_utf8_be
+patterns.utf32_to_utf8_le=p_utf32_to_utf8_le
+utf16_to_utf8_be=function(s)
+ if s and s~="" then
+ return lpegmatch(p_utf16_to_utf8_be,s)
+ else
+ return s
end
- utf16_to_utf8_le=function(t)
- if type(t)=="string" then
- t=lpegmatch(utf_16_le_linesplitter,t)
- end
- local 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)
- end
- return t
+end
+local utf16_to_utf8_be_t=function(t)
+ if not t then
+ return nil
+ elseif type(t)=="string" then
+ t=lpegmatch(utf_16_be_linesplitter,t)
end
- utf32_to_utf8_be=function(t)
- if type(t)=="string" then
- t=lpegmatch(utflinesplitter,t)
- end
- local result={}
- for i=1,#t do
- local r,more=0,-1
- for a,b in bytepairs(t[i]) do
- if a and b then
- if more<0 then
- more=256*256*256*a+256*256*b
- else
- r=r+1
- result[t]=utfchar(more+256*a+b)
- more=-1
- end
- else
- break
- end
- end
- t[i]=concat(result,"",1,r)
+ for i=1,#t do
+ local s=t[i]
+ if s~="" then
+ t[i]=lpegmatch(p_utf16_to_utf8_be,s)
end
- return t
end
- utf32_to_utf8_le=function(t)
- if type(t)=="string" then
- t=lpegmatch(utflinesplitter,t)
- end
- local result={}
- for i=1,#t do
- local r,more=0,-1
- for a,b in bytepairs(t[i]) do
- if a and b then
- if more<0 then
- more=256*b+a
- else
- r=r+1
- result[t]=utfchar(more+256*256*256*b+256*256*a)
- more=-1
- end
- else
- break
- end
- end
- t[i]=concat(result,"",1,r)
- end
- return t
+ return t
+end
+utf16_to_utf8_le=function(s)
+ if s and s~="" then
+ return lpegmatch(p_utf16_to_utf8_le,s)
+ else
+ return s
end
-else
- utf16_to_utf8_be=function(t)
- if type(t)=="string" then
- t=lpegmatch(utf_16_be_linesplitter,t)
- end
- local result={}
- for i=1,#t do
- local r,more=0,0
- for left,right in gmatch(t[i],"(.)(.)") do
- if left=="\000" then
- r=r+1
- result[r]=utfchar(byte(right))
- elseif right then
- local now=256*byte(left)+byte(right)
- if more>0 then
- now=(more-0xD800)*0x400+(now-0xDC00)+0x10000
- 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)
+end
+local utf16_to_utf8_le_t=function(t)
+ if not t then
+ return nil
+ elseif type(t)=="string" then
+ t=lpegmatch(utf_16_le_linesplitter,t)
+ end
+ for i=1,#t do
+ local s=t[i]
+ if s~="" then
+ t[i]=lpegmatch(p_utf16_to_utf8_le,s)
end
- return t
end
- utf16_to_utf8_le=function(t)
- if type(t)=="string" then
- t=lpegmatch(utf_16_le_linesplitter,t)
+ return t
+end
+utf32_to_utf8_be=function(s)
+ if s and s~="" then
+ return lpegmatch(p_utf32_to_utf8_be,s)
+ else
+ return s
+ end
+end
+local utf32_to_utf8_be_t=function(t)
+ if not t then
+ return nil
+ elseif type(t)=="string" then
+ t=lpegmatch(utf_32_be_linesplitter,t)
+ end
+ for i=1,#t do
+ local s=t[i]
+ if s~="" then
+ t[i]=lpegmatch(p_utf32_to_utf8_be,s)
end
- local result={}
- for i=1,#t do
- local r,more=0,0
- for left,right in gmatch(t[i],"(.)(.)") do
- if right=="\000" then
- r=r+1
- result[r]=utfchar(byte(left))
- elseif right then
- local now=256*byte(right)+byte(left)
- if more>0 then
- now=(more-0xD800)*0x400+(now-0xDC00)+0x10000
- 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)
+ end
+ return t
+end
+utf32_to_utf8_le=function(s)
+ if s and s~="" then
+ return lpegmatch(p_utf32_to_utf8_le,s)
+ else
+ return s
+ end
+end
+local utf32_to_utf8_le_t=function(t)
+ if not t then
+ return nil
+ elseif type(t)=="string" then
+ t=lpegmatch(utf_32_le_linesplitter,t)
+ end
+ for i=1,#t do
+ local s=t[i]
+ if s~="" then
+ t[i]=lpegmatch(p_utf32_to_utf8_le,s)
end
- return t
end
- utf32_to_utf8_le=function() return {} end
- utf32_to_utf8_be=function() return {} end
+ return t
end
+utf.utf16_to_utf8_le_t=utf16_to_utf8_le_t
+utf.utf16_to_utf8_be_t=utf16_to_utf8_be_t
+utf.utf32_to_utf8_le_t=utf32_to_utf8_le_t
+utf.utf32_to_utf8_be_t=utf32_to_utf8_be_t
utf.utf16_to_utf8_le=utf16_to_utf8_le
utf.utf16_to_utf8_be=utf16_to_utf8_be
utf.utf32_to_utf8_le=utf32_to_utf8_le
utf.utf32_to_utf8_be=utf32_to_utf8_be
-function utf.utf8_to_utf8(t)
+function utf.utf8_to_utf8_t(t)
return type(t)=="string" and lpegmatch(utflinesplitter,t) or t
end
-function utf.utf16_to_utf8(t,endian)
- return endian and utf16_to_utf8_be(t) or utf16_to_utf8_le(t) or t
+function utf.utf16_to_utf8_t(t,endian)
+ return endian and utf16_to_utf8_be_t(t) or utf16_to_utf8_le_t(t) or t
end
-function utf.utf32_to_utf8(t,endian)
- return endian and utf32_to_utf8_be(t) or utf32_to_utf8_le(t) or t
+function utf.utf32_to_utf8_t(t,endian)
+ return endian and utf32_to_utf8_be_t(t) or utf32_to_utf8_le_t(t) or t
end
-local function little(c)
- local b=byte(c)
+local function little(b)
if b<0x10000 then
return char(b%256,b/256)
else
@@ -4700,8 +4990,7 @@ local function little(c)
return char(b1%256,b1/256,b2%256,b2/256)
end
end
-local function big(c)
- local b=byte(c)
+local function big(b)
if b<0x10000 then
return char(b/256,b%256)
else
@@ -4710,27 +4999,29 @@ local function big(c)
return char(b1/256,b1%256,b2/256,b2%256)
end
end
-local _,l_remap=utf.remapper(little)
-local _,b_remap=utf.remapper(big)
-function utf.utf8_to_utf16_be(str,nobom)
+local l_remap=Cs((p_utf8byte/little+P(1)/"")^0)
+local b_remap=Cs((p_utf8byte/big+P(1)/"")^0)
+local function utf8_to_utf16_be(str,nobom)
if nobom then
return lpegmatch(b_remap,str)
else
return char(254,255)..lpegmatch(b_remap,str)
end
end
-function utf.utf8_to_utf16_le(str,nobom)
+local function utf8_to_utf16_le(str,nobom)
if nobom then
return lpegmatch(l_remap,str)
else
return char(255,254)..lpegmatch(l_remap,str)
end
end
+utf.utf8_to_utf16_be=utf8_to_utf16_be
+utf.utf8_to_utf16_le=utf8_to_utf16_le
function utf.utf8_to_utf16(str,littleendian,nobom)
if littleendian then
- return utf.utf8_to_utf16_le(str,nobom)
+ return utf8_to_utf16_le(str,nobom)
else
- return utf.utf8_to_utf16_be(str,nobom)
+ return utf8_to_utf16_be(str,nobom)
end
end
local pattern=Cs (
@@ -4746,16 +5037,16 @@ function utf.xstring(s)
return format("0x%05X",type(s)=="number" and s or utfbyte(s))
end
function utf.toeight(str)
- if not str then
+ if not str or str=="" then
return nil
end
local utftype=lpegmatch(p_utfstricttype,str)
if utftype=="utf-8" then
- return sub(str,4)
- elseif utftype=="utf-16-le" then
- return utf16_to_utf8_le(str)
+ return sub(str,4)
elseif utftype=="utf-16-be" then
- return utf16_to_utf8_ne(str)
+ return utf16_to_utf8_be(str)
+ elseif utftype=="utf-16-le" then
+ return utf16_to_utf8_le(str)
else
return str
end
@@ -4834,7 +5125,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-math"] = package.loaded["l-math"] or true
--- original size: 915, stripped down to: 836
+-- original size: 974, stripped down to: 890
if not modules then modules={} end modules ['l-math']={
version=1.001,
@@ -4844,6 +5135,9 @@ if not modules then modules={} end modules ['l-math']={
license="see context related readme files"
}
local floor,sin,cos,tan=math.floor,math.sin,math.cos,math.tan
+if not math.ceiling then
+ math.ceiling=math.ceil
+end
if not math.round then
function math.round(x) return floor(x+0.5) end
end
@@ -4871,7 +5165,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-str"] = package.loaded["util-str"] or true
--- original size: 33063, stripped down to: 18397
+-- original size: 34407, stripped down to: 18852
if not modules then modules={} end modules ['util-str']={
version=1.001,
@@ -5001,10 +5295,12 @@ local striplinepatterns={
["retain"]=p_retain_normal,
["retain and collapse"]=p_retain_collapse,
["retain and no empty"]=p_retain_noempty,
+ ["collapse"]=patterns.collapser,
}
+setmetatable(striplinepatterns,{ __index=function(t,k) return p_prune_collapse end })
strings.striplinepatterns=striplinepatterns
function strings.striplines(str,how)
- return str and lpegmatch(how and striplinepatterns[how] or p_prune_collapse,str) or str
+ return str and lpegmatch(striplinepatterns[how],str) or str
end
strings.striplong=strings.striplines
function strings.nice(str)
@@ -5044,10 +5340,10 @@ string.tracedchars=tracedchars
strings.tracers=tracedchars
function string.tracedchar(b)
if type(b)=="number" then
- return tracedchars[b] or (utfchar(b).." (U+"..format('%05X',b)..")")
+ return tracedchars[b] or (utfchar(b).." (U+"..format("%05X",b)..")")
else
local c=utfbyte(b)
- return tracedchars[c] or (b.." (U+"..format('%05X',c)..")")
+ return tracedchars[c] or (b.." (U+"..(c and format("%05X",c) or "?????")..")")
end
end
function number.signed(i)
@@ -5184,12 +5480,12 @@ local format_f=function(f)
n=n+1
return format("format('%%%sf',a%s)",f,n)
end
-local format_F=function(f)
+local format_F=function(f)
n=n+1
if not f or f=="" then
- return format("(((a%s > -0.0000000005 and a%s < 0.0000000005) and '0') or (a%s == 1 and '1') or format('%%.9f',a%s))",n,n,n,n)
+ return format("(((a%s > -0.0000000005 and a%s < 0.0000000005) and '0') or format((a%s %% 1 == 0) and '%%i' or '%%.9f',a%s))",n,n,n,n)
else
- return format("((a%s == 0 and '0') or (a%s == 1 and '1') or format('%%%sf',a%s))",n,n,f,n)
+ return format("format((a%s %% 1 == 0) and '%%i' or '%%%sf',a%s)",n,f,n)
end
end
local format_g=function(f)
@@ -5417,7 +5713,6 @@ local builder=Cs { "start",
+V("j")+V("J")
+V("m")+V("M")
+V("z")
-+V("*")
)+V("*")
)*(P(-1)+Carg(1))
)^0,
@@ -5461,6 +5756,7 @@ local builder=Cs { "start",
["a"]=(prefix_any*P("a"))/format_a,
["A"]=(prefix_any*P("A"))/format_A,
["*"]=Cs(((1-P("%"))^1+P("%%")/"%%")^1)/format_rest,
+ ["?"]=Cs(((1-P("%"))^1 )^1)/format_rest,
["!"]=Carg(2)*prefix_any*P("!")*C((1-P("!"))^1)*P("!")/format_extension,
}
local direct=Cs (
@@ -5535,6 +5831,15 @@ else
add(formatters,"tex",[[lpegmatch(texescape,%s)]],{ texescape=lpeg.patterns.texescape })
add(formatters,"lua",[[lpegmatch(luaescape,%s)]],{ luaescape=lpeg.patterns.luaescape })
end
+local dquote=patterns.dquote
+local equote=patterns.escaped+dquote/'\\"'+1
+local space=patterns.space
+local cquote=Cc('"')
+local pattern=Cs(dquote*(equote-P(-2))^0*dquote)
++Cs(cquote*(equote-space)^0*space*equote^0*cquote)
+function string.optionalquoted(str)
+ return lpegmatch(pattern,str) or str
+end
end -- of closure
@@ -5543,7 +5848,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tab"] = package.loaded["util-tab"] or true
--- original size: 23985, stripped down to: 16069
+-- original size: 24267, stripped down to: 16260
if not modules then modules={} end modules ['util-tab']={
version=1.001,
@@ -5633,6 +5938,15 @@ function tables.removevalue(t,value)
end
end
end
+function tables.replacevalue(t,oldvalue,newvalue)
+ if oldvalue and newvalue then
+ for i=1,#t do
+ if t[i]==oldvalue then
+ t[i]=newvalue
+ end
+ end
+ end
+end
function tables.insertbeforevalue(t,value,extra)
for i=1,#t do
if t[i]==extra then
@@ -6026,7 +6340,7 @@ function table.serialize(root,name,specification)
end
depth=depth+1
end
- if root and next(root) then
+ if root and next(root)~=nil then
local first=nil
local last=0
last=#root
@@ -6051,7 +6365,7 @@ function table.serialize(root,name,specification)
elseif tv=="string" then
n=n+1 t[n]=f_val_str(depth,v)
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
n=n+1 t[n]=f_val_not(depth)
else
local st=simple_table(v)
@@ -6081,7 +6395,7 @@ function table.serialize(root,name,specification)
n=n+1 t[n]=f_key_boo_value_str(depth,k,v)
end
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
if tk=="number" then
n=n+1 t[n]=f_key_num_value_not(depth,k,v)
elseif tk=="string" then
@@ -6139,7 +6453,7 @@ function table.serialize(root,name,specification)
local dummy=root._w_h_a_t_e_v_e_r_
root._w_h_a_t_e_v_e_r_=nil
end
- if next(root) then
+ if next(root)~=nil then
do_serialize(root,name,1,0)
end
end
@@ -6302,7 +6616,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-prs"] = package.loaded["util-prs"] or true
--- original size: 19618, stripped down to: 14012
+-- original size: 21751, stripped down to: 15108
if not modules then modules={} end modules ['util-prs']={
version=1.001,
@@ -6458,11 +6772,30 @@ function parsers.settings_to_array(str,strict)
return { str }
end
end
-local separator=space^0*comma*space^0
-local value=P(lbrace*C((nobrace+nestedbraces)^0)*rbrace)+C((nestedbraces+(1-(space^0*(comma+P(-1)))))^0)
-local withvalue=Carg(1)*value/function(f,s) return f(s) end
-local pattern_a=spaces*Ct(value*(separator*value)^0)
-local pattern_b=spaces*withvalue*(separator*withvalue)^0
+local cache_a={}
+local cache_b={}
+function parsers.groupedsplitat(symbol,withaction)
+ if not symbol then
+ symbol=","
+ end
+ local pattern=(withaction and cache_b or cache_a)[symbol]
+ if not pattern then
+ local symbols=S(symbol)
+ local separator=space^0*symbols*space^0
+ local value=P(lbrace*C((nobrace+nestedbraces)^0)*rbrace)+C((nestedbraces+(1-(space^0*(symbols+P(-1)))))^0)
+ if withaction then
+ local withvalue=Carg(1)*value/function(f,s) return f(s) end
+ pattern=spaces*withvalue*(separator*withvalue)^0
+ cache_b[symbol]=pattern
+ else
+ pattern=spaces*Ct(value*(separator*value)^0)
+ cache_a[symbol]=pattern
+ end
+ end
+ return pattern
+end
+local pattern_a=parsers.groupedsplitat(",",false)
+local pattern_b=parsers.groupedsplitat(",",true)
function parsers.stripped_settings_to_array(str)
if not str or str=="" then
return {}
@@ -6524,12 +6857,9 @@ function parsers.array_to_string(a,separator)
return ""
end
end
-function parsers.settings_to_set(str,t)
- t=t or {}
- for s in gmatch(str,"[^, ]+") do
- t[s]=true
- end
- return t
+local pattern=Cf(Ct("")*Cg(C((1-S(", "))^1)*S(", ")^0*Cc(true))^1,rawset)
+function utilities.parsers.settings_to_set(str,t)
+ return str and lpegmatch(pattern,str) or {}
end
function parsers.simple_hash_to_string(h,separator)
local t,tn={},0
@@ -6541,12 +6871,16 @@ function parsers.simple_hash_to_string(h,separator)
end
return concat(t,separator or ",")
end
-local str=C((1-whitespace-equal)^1)
+local str=Cs(lpegpatterns.unquoted)+C((1-whitespace-equal)^1)
local setting=Cf(Carg(1)*(whitespace^0*Cg(str*whitespace^0*(equal*whitespace^0*str+Cc(""))))^1,rawset)
local splitter=setting^1
function utilities.parsers.options_to_hash(str,target)
return str and lpegmatch(splitter,str,1,target or {}) or {}
end
+local splitter=lpeg.tsplitat(" ")
+function utilities.parsers.options_to_array(str)
+ return str and lpegmatch(splitter,str) or {}
+end
local value=P(lbrace*C((nobrace+nestedbraces)^0)*rbrace)+C(digit^1*lparent*(noparent+nestedparents)^1*rparent)+C((nestedbraces+(1-comma))^1)
local pattern_a=spaces*Ct(value*(separator*value)^0)
local function repeater(n,str)
@@ -6668,7 +7002,7 @@ function parsers.rfc4180splitter(specification)
local field=escaped+non_escaped+Cc("")
local record=Ct(field*(separator*field)^1)
local headerline=record*Cp()
- local wholeblob=Ct((newline^-1*record)^0)
+ local wholeblob=Ct((newline^(specification.strict and -1 or 1)*record)^0)
return function(data,getheader)
if getheader then
local header,position=lpegmatch(headerline,data)
@@ -6705,13 +7039,13 @@ function parsers.stepper(str,n,action)
lpegmatch(stepper,str,1,n,action or print)
end
end
-local pattern_math=Cs((P("%")/"\\percent "+P("^")*Cc("{")*lpegpatterns.integer*Cc("}")+P(1))^0)
-local pattern_text=Cs((P("%")/"\\percent "+(P("^")/"\\high")*Cc("{")*lpegpatterns.integer*Cc("}")+P(1))^0)
+local pattern_math=Cs((P("%")/"\\percent "+P("^")*Cc("{")*lpegpatterns.integer*Cc("}")+anything)^0)
+local pattern_text=Cs((P("%")/"\\percent "+(P("^")/"\\high")*Cc("{")*lpegpatterns.integer*Cc("}")+anything)^0)
patterns.unittotex=pattern
function parsers.unittotex(str,textmode)
return lpegmatch(textmode and pattern_text or pattern_math,str)
end
-local pattern=Cs((P("^")/"<sup>"*lpegpatterns.integer*Cc("</sup>")+P(1))^0)
+local pattern=Cs((P("^")/"<sup>"*lpegpatterns.integer*Cc("</sup>")+anything)^0)
function parsers.unittoxml(str)
return lpegmatch(pattern,str)
end
@@ -6783,6 +7117,18 @@ function utilities.parsers.runtime(time)
local seconds=mod(time,60)
return days,hours,minutes,seconds
end
+local spacing=whitespace^0
+local apply=P("->")
+local method=C((1-apply)^1)
+local token=lbrace*C((1-rbrace)^1)*rbrace+C(anything^1)
+local pattern=spacing*(method*spacing*apply+Carg(1))*spacing*token
+function utilities.parsers.splitmethod(str,default)
+ if str then
+ return lpegmatch(pattern,str,1,default or false)
+ else
+ return default or false,""
+ end
+end
end -- of closure
@@ -6872,7 +7218,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-set"] = package.loaded["trac-set"] or true
--- original size: 12365, stripped down to: 8799
+-- original size: 12482, stripped down to: 8864
if not modules then modules={} end modules ['trac-set']={
version=1.001,
@@ -6900,7 +7246,7 @@ function setters.initialize(filename,name,values)
local data=setter.data
if data then
for key,newvalue in next,values do
- local newvalue=is_boolean(newvalue,newvalue)
+ local newvalue=is_boolean(newvalue,newvalue,true)
local functions=data[key]
if functions then
local oldvalue=functions.value
@@ -6954,7 +7300,7 @@ local function set(t,what,newvalue)
elseif not value then
value=false
else
- value=is_boolean(value,value)
+ value=is_boolean(value,value,true)
end
w=topattern(w,true,true)
for name,functions in next,data do
@@ -7093,6 +7439,7 @@ function setters.new(name)
report=function(...) setters.report (setter,...) end,
enable=function(...) enable (setter,...) end,
disable=function(...) disable (setter,...) end,
+ reset=function(...) reset (setter,...) end,
register=function(...) register(setter,...) end,
list=function(...) list (setter,...) end,
show=function(...) show (setter,...) end,
@@ -7184,7 +7531,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-log"] = package.loaded["trac-log"] or true
--- original size: 25613, stripped down to: 16617
+-- original size: 29359, stripped down to: 20483
if not modules then modules={} end modules ['trac-log']={
version=1.001,
@@ -7193,15 +7540,18 @@ if not modules then modules={} end modules ['trac-log']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local next,type,select,print=next,type,select,print
local write_nl,write=texio and texio.write_nl or print,texio and texio.write or io.write
local format,gmatch,find=string.format,string.gmatch,string.find
local concat,insert,remove=table.concat,table.insert,table.remove
local topattern=string.topattern
-local next,type,select=next,type,select
local utfchar=utf.char
+local datetime=os.date
+local openfile=io.open
local setmetatableindex=table.setmetatableindex
local formatters=string.formatters
local texgetcount=tex and tex.getcount
+local variant="default"
logs=logs or {}
local logs=logs
local moreinfo=[[
@@ -7211,32 +7561,122 @@ 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
]]
-utilities.strings.formatters.add (
+formatters.add (
formatters,"unichr",
[["U+" .. format("%%05X",%s) .. " (" .. utfchar(%s) .. ")"]]
)
-utilities.strings.formatters.add (
+formatters.add (
formatters,"chruni",
[[utfchar(%s) .. " (U+" .. format("%%05X",%s) .. ")"]]
)
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,setlogfile,settimedlog,setprocessor,setformatters
+local direct,subdirect,writer,pushtarget,poptarget,setlogfile,settimedlog,setprocessor,setformatters,newline
if tex and (tex.jobname or tex.formatname) then
- local valueiskey={ __index=function(t,k) t[k]=k return k end }
- local target="term and log"
+ local function useluawrites()
+ local texio_write_nl=texio.write_nl
+ local texio_write=texio.write
+ local io_write=io.write
+ write_nl=function(target,...)
+ if not io_write then
+ io_write=io.write
+ end
+ if target=="term and log" then
+ texio_write_nl("log",...)
+ texio_write_nl("term","")
+ io_write(...)
+ elseif target=="log" then
+ texio_write_nl("log",...)
+ elseif target=="term" then
+ texio_write_nl("term","")
+ io_write(...)
+ elseif target~="none" then
+ texio_write_nl("log",target,...)
+ texio_write_nl("term","")
+ io_write(target,...)
+ end
+ end
+ write=function(target,...)
+ if not io_write then
+ io_write=io.write
+ end
+ if target=="term and log" then
+ texio_write("log",...)
+ io_write(...)
+ elseif target=="log" then
+ texio_write("log",...)
+ elseif target=="term" then
+ io_write(...)
+ elseif target~="none" then
+ texio_write("log",target,...)
+ io_write(target,...)
+ end
+ end
+ texio.write=write
+ texio.write_nl=write_nl
+ useluawrites=ignore
+ end
+ local whereto="both"
+ local target=nil
+ local targets=nil
+ local formats=table.setmetatableindex("self")
+ local translations=table.setmetatableindex("self")
+ local report_yes,subreport_yes,direct_yes,subdirect_yes,status_yes
+ local report_nop,subreport_nop,direct_nop,subdirect_nop,status_nop
+ local variants={
+ default={
+ formats={
+ report_yes=formatters["%-15s > %s\n"],
+ report_nop=formatters["%-15s >\n"],
+ direct_yes=formatters["%-15s > %s"],
+ direct_nop=formatters["%-15s >"],
+ subreport_yes=formatters["%-15s > %s > %s\n"],
+ subreport_nop=formatters["%-15s > %s >\n"],
+ subdirect_yes=formatters["%-15s > %s > %s"],
+ subdirect_nop=formatters["%-15s > %s >"],
+ status_yes=formatters["%-15s : %s\n"],
+ status_nop=formatters["%-15s :\n"],
+ },
+ targets={
+ logfile="log",
+ log="log",
+ file="log",
+ console="term",
+ terminal="term",
+ both="term and log",
+ },
+ },
+ ansi={
+ formats={
+ report_yes=formatters["%-15s > %s\n"],
+ report_nop=formatters["%-15s >\n"],
+ direct_yes=formatters["%-15s > %s"],
+ direct_nop=formatters["%-15s >"],
+ subreport_yes=formatters["%-15s > %s > %s\n"],
+ subreport_nop=formatters["%-15s > %s >\n"],
+ subdirect_yes=formatters["%-15s > %s > %s"],
+ subdirect_nop=formatters["%-15s > %s >"],
+ status_yes=formatters["%-15s : %s\n"],
+ status_nop=formatters["%-15s :\n"],
+ },
+ targets={
+ logfile="none",
+ log="none",
+ file="none",
+ console="term",
+ terminal="term",
+ both="term",
+ },
+ }
+ }
logs.flush=io.flush
- local formats={} setmetatable(formats,valueiskey)
- local translations={} setmetatable(translations,valueiskey)
writer=function(...)
write_nl(target,...)
end
newline=function()
write_nl(target,"\n")
end
- local report_yes=formatters["%-15s > %s\n"]
- local report_nop=formatters["%-15s >\n"]
report=function(a,b,c,...)
if c then
write_nl(target,report_yes(translations[a],formatters[formats[b]](c,...)))
@@ -7248,8 +7688,6 @@ if tex and (tex.jobname or tex.formatname) then
write_nl(target,"\n")
end
end
- local direct_yes=formatters["%-15s > %s"]
- local direct_nop=formatters["%-15s >"]
direct=function(a,b,c,...)
if c then
return direct_yes(translations[a],formatters[formats[b]](c,...))
@@ -7261,8 +7699,6 @@ if tex and (tex.jobname or tex.formatname) then
return ""
end
end
- local subreport_yes=formatters["%-15s > %s > %s\n"]
- local subreport_nop=formatters["%-15s > %s >\n"]
subreport=function(a,s,b,c,...)
if c then
write_nl(target,subreport_yes(translations[a],translations[s],formatters[formats[b]](c,...)))
@@ -7274,8 +7710,6 @@ if tex and (tex.jobname or tex.formatname) then
write_nl(target,"\n")
end
end
- local subdirect_yes=formatters["%-15s > %s > %s"]
- local subdirect_nop=formatters["%-15s > %s >"]
subdirect=function(a,s,b,c,...)
if c then
return subdirect_yes(translations[a],translations[s],formatters[formats[b]](c,...))
@@ -7287,8 +7721,6 @@ if tex and (tex.jobname or tex.formatname) then
return ""
end
end
- local status_yes=formatters["%-15s : %s\n"]
- local status_nop=formatters["%-15s :\n"]
status=function(a,b,c,...)
if c then
write_nl(target,status_yes(translations[a],formatters[formats[b]](c,...)))
@@ -7300,16 +7732,13 @@ if tex and (tex.jobname or tex.formatname) then
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
+ settarget=function(askedwhereto)
+ whereto=askedwhereto or whereto or "both"
+ target=targets[whereto]
+ if not target then
+ whereto="both"
+ target=targets[whereto]
+ end
if target=="term" or target=="term and log" then
logs.flush=io.flush
else
@@ -7338,21 +7767,74 @@ if tex and (tex.jobname or tex.formatname) then
writeline(target,f(...))
end
end
- setformatters=function(f)
- report_yes=f.report_yes or report_yes
- report_nop=f.report_nop or report_nop
- subreport_yes=f.subreport_yes or subreport_yes
- subreport_nop=f.subreport_nop or subreport_nop
- direct_yes=f.direct_yes or direct_yes
- direct_nop=f.direct_nop or direct_nop
- subdirect_yes=f.subdirect_yes or subdirect_yes
- subdirect_nop=f.subdirect_nop or subdirect_nop
- status_yes=f.status_yes or status_yes
- status_nop=f.status_nop or status_nop
- end
+ setformatters=function(specification)
+ local t=nil
+ local f=nil
+ local d=variants.default
+ if not specification then
+ elseif type(specification)=="table" then
+ t=specification.targets
+ f=specification.formats or specification
+ else
+ local v=variants[specification]
+ if v then
+ t=v.targets
+ f=v.formats
+ variant=specification
+ end
+ end
+ targets=t or d.targets
+ target=targets[whereto] or target
+ if f then
+ d=d.formats
+ else
+ f=d.formats
+ d=f
+ end
+ setmetatableindex(f,d)
+ report_yes=f.report_yes
+ report_nop=f.report_nop
+ subreport_yes=f.subreport_yes
+ subreport_nop=f.subreport_nop
+ direct_yes=f.direct_yes
+ direct_nop=f.direct_nop
+ subdirect_yes=f.subdirect_yes
+ subdirect_nop=f.subdirect_nop
+ status_yes=f.status_yes
+ status_nop=f.status_nop
+ if variant=="ansi" then
+ useluawrites()
+ end
+ settarget(whereto)
+ end
+ setformatters(variant)
setlogfile=ignore
settimedlog=ignore
else
+ local report_yes,subreport_yes,status_yes
+ local report_nop,subreport_nop,status_nop
+ local variants={
+ default={
+ formats={
+ report_yes=formatters["%-15s | %s"],
+ report_nop=formatters["%-15s |"],
+ subreport_yes=formatters["%-15s | %s | %s"],
+ subreport_nop=formatters["%-15s | %s |"],
+ status_yes=formatters["%-15s : %s\n"],
+ status_nop=formatters["%-15s :\n"],
+ },
+ },
+ ansi={
+ formats={
+ report_yes=formatters["%-15s | %s"],
+ report_nop=formatters["%-15s |"],
+ subreport_yes=formatters["%-15s | %s | %s"],
+ subreport_nop=formatters["%-15s | %s |"],
+ status_yes=formatters["%-15s : %s\n"],
+ status_nop=formatters["%-15s :\n"],
+ },
+ },
+ }
logs.flush=ignore
writer=function(s)
write_nl(s)
@@ -7360,8 +7842,6 @@ else
newline=function()
write_nl("\n")
end
- local report_yes=formatters["%-15s | %s"]
- local report_nop=formatters["%-15s |"]
report=function(a,b,c,...)
if c then
write_nl(report_yes(a,formatters[b](c,...)))
@@ -7373,8 +7853,6 @@ else
write_nl("")
end
end
- local subreport_yes=formatters["%-15s | %s | %s"]
- local subreport_nop=formatters["%-15s | %s |"]
subreport=function(a,sub,b,c,...)
if c then
write_nl(subreport_yes(a,sub,formatters[b](c,...)))
@@ -7386,8 +7864,6 @@ else
write_nl("")
end
end
- local status_yes=formatters["%-15s : %s\n"]
- local status_nop=formatters["%-15s :\n"]
status=function(a,b,c,...)
if c then
write_nl(status_yes(a,formatters[b](c,...)))
@@ -7412,14 +7888,34 @@ else
writeline(f(s))
end
end
- setformatters=function(f)
- report_yes=f.report_yes or report_yes
- report_nop=f.report_nop or report_nop
- subreport_yes=f.subreport_yes or subreport_yes
- subreport_nop=f.subreport_nop or subreport_nop
- status_yes=f.status_yes or status_yes
- status_nop=f.status_nop or status_nop
- end
+ setformatters=function(specification)
+ local f=nil
+ local d=variants.default
+ if specification then
+ if type(specification)=="table" then
+ f=specification.formats or specification
+ else
+ local v=variants[specification]
+ if v then
+ f=v.formats
+ end
+ end
+ end
+ if f then
+ d=d.formats
+ else
+ f=d.formats
+ d=f
+ end
+ setmetatableindex(f,d)
+ report_yes=f.report_yes
+ report_nop=f.report_nop
+ subreport_yes=f.subreport_yes
+ subreport_nop=f.subreport_nop
+ status_yes=f.status_yes
+ status_nop=f.status_nop
+ end
+ setformatters(variant)
setlogfile=function(name,keepopen)
if name and name~="" then
local localtime=os.localtime
@@ -7672,13 +8168,13 @@ end
local simple=logs.reporter("comment")
logs.simple=simple
logs.simpleline=simple
-function logs.setprogram () end
-function logs.extendbanner() end
-function logs.reportlines () end
-function logs.reportbanner() end
-function logs.reportline () end
-function logs.simplelines () end
-function logs.help () end
+logs.setprogram=ignore
+logs.extendbanner=ignore
+logs.reportlines=ignore
+logs.reportbanner=ignore
+logs.reportline=ignore
+logs.simplelines=ignore
+logs.help=ignore
local Carg,C,lpegmatch=lpeg.Carg,lpeg.C,lpeg.match
local p_newline=lpeg.patterns.newline
local linewise=(
@@ -7755,10 +8251,11 @@ function logs.application(t)
end
return t
end
-function logs.system(whereto,process,jobname,category,...)
- local message=formatters["%s %s => %s => %s => %s\r"](os.date("%d/%m/%y %H:%m:%S"),process,jobname,category,format(...))
+local f_syslog=formatters["%s %s => %s => %s => %s\r"]
+function logs.system(whereto,process,jobname,category,fmt,arg,...)
+ local message=f_syslog(datetime("%d/%m/%y %H:%m:%S"),process,jobname,category,arg==nil and fmt or format(fmt,arg,...))
for i=1,10 do
- local f=io.open(whereto,"a")
+ local f=openfile(whereto,"a")
if f then
f:write(message)
f:close()
@@ -7820,7 +8317,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-inf"] = package.loaded["trac-inf"] or true
--- original size: 7011, stripped down to: 5590
+-- original size: 6704, stripped down to: 5343
if not modules then modules={} end modules ['trac-inf']={
version=1.001,
@@ -7993,15 +8490,6 @@ function statistics.tracefunction(base,tag,...)
statistics.register(formatters["%s.%s"](tag,name),function() return serialize(stat,"calls") end)
end
end
-commands=commands or {}
-function commands.resettimer(name)
- resettiming(name or "whatever")
- starttiming(name or "whatever")
-end
-function commands.elapsedtime(name)
- stoptiming(name or "whatever")
- context(elapsedtime(name or "whatever"))
-end
end -- of closure
@@ -8568,7 +9056,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tpl"] = package.loaded["util-tpl"] or true
--- original size: 6251, stripped down to: 3488
+-- original size: 7100, stripped down to: 3978
if not modules then modules={} end modules ['util-tpl']={
version=1.001,
@@ -8610,7 +9098,7 @@ local sqlescape=lpeg.replacer {
{ "\r\n","\\n" },
{ "\r","\\n" },
}
-local sqlquoted=lpeg.Cs(lpeg.Cc("'")*sqlescape*lpeg.Cc("'"))
+local sqlquoted=Cs(Cc("'")*sqlescape*Cc("'"))
lpegpatterns.sqlescape=sqlescape
lpegpatterns.sqlquoted=sqlquoted
local luaescape=lpegpatterns.luaescape
@@ -8633,12 +9121,24 @@ local quotedescapers={
local luaescaper=escapers.lua
local quotedluaescaper=quotedescapers.lua
local function replacekeyunquoted(s,t,how,recurse)
- local escaper=how and escapers[how] or luaescaper
- return escaper(replacekey(s,t,how,recurse))
+ if how==false then
+ return replacekey(s,t,how,recurse)
+ else
+ local escaper=how and escapers[how] or luaescaper
+ return escaper(replacekey(s,t,how,recurse))
+ end
end
local function replacekeyquoted(s,t,how,recurse)
- local escaper=how and quotedescapers[how] or quotedluaescaper
- return escaper(replacekey(s,t,how,recurse))
+ if how==false then
+ return replacekey(s,t,how,recurse)
+ else
+ local escaper=how and quotedescapers[how] or quotedluaescaper
+ return escaper(replacekey(s,t,how,recurse))
+ end
+end
+local function replaceoptional(l,m,r,t,how,recurse)
+ local v=t[l]
+ return v and v~="" and lpegmatch(replacer,r,1,t,how or "lua",recurse or false) or ""
end
local single=P("%")
local double=P("%%")
@@ -8653,11 +9153,16 @@ local nolquoted=lquoted/''
local norquoted=rquoted/''
local nolquotedq=lquotedq/''
local norquotedq=rquotedq/''
-local key=nosingle*((C((1-nosingle )^1)*Carg(1)*Carg(2)*Carg(3))/replacekey )*nosingle
-local quoted=nolquotedq*((C((1-norquotedq)^1)*Carg(1)*Carg(2)*Carg(3))/replacekeyquoted )*norquotedq
-local unquoted=nolquoted*((C((1-norquoted )^1)*Carg(1)*Carg(2)*Carg(3))/replacekeyunquoted)*norquoted
+local noloptional=P("%?")/''
+local noroptional=P("?%")/''
+local nomoptional=P(":")/''
+local args=Carg(1)*Carg(2)*Carg(3)
+local key=nosingle*((C((1-nosingle )^1)*args)/replacekey )*nosingle
+local quoted=nolquotedq*((C((1-norquotedq )^1)*args)/replacekeyquoted )*norquotedq
+local unquoted=nolquoted*((C((1-norquoted )^1)*args)/replacekeyunquoted)*norquoted
+local optional=noloptional*((C((1-nomoptional)^1)*nomoptional*C((1-noroptional)^1)*args)/replaceoptional)*noroptional
local any=P(1)
- replacer=Cs((unquoted+quoted+escape+key+any)^0)
+ replacer=Cs((unquoted+quoted+escape+optional+key+any)^0)
local function replace(str,mapping,how,recurse)
if mapping and str then
return lpegmatch(replacer,str,1,mapping,how or "lua",recurse or false) or str
@@ -8696,7 +9201,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-env"] = package.loaded["util-env"] or true
--- original size: 8814, stripped down to: 5092
+-- original size: 8022, stripped down to: 5038
if not modules then modules={} end modules ['util-env']={
version=1.001,
@@ -8707,7 +9212,7 @@ if not modules then modules={} end modules ['util-env']={
}
local allocate,mark=utilities.storage.allocate,utilities.storage.mark
local format,sub,match,gsub,find=string.format,string.sub,string.match,string.gsub,string.find
-local unquoted,quoted=string.unquoted,string.quoted
+local unquoted,quoted,optionalquoted=string.unquoted,string.quoted,string.optionalquoted
local concat,insert,remove=table.concat,table.insert,table.remove
environment=environment or {}
local environment=environment
@@ -8820,24 +9325,14 @@ function environment.splitarguments(separator)
return before,after
end
function environment.reconstructcommandline(arg,noquote)
+ local resolveprefix=resolvers.resolve
arg=arg or environment.originalarguments
if noquote and #arg==1 then
- local a=arg[1]
- a=resolvers.resolve(a)
- a=unquoted(a)
- return a
+ return unquoted(resolveprefix and resolveprefix(arg[1]) or arg[1])
elseif #arg>0 then
local result={}
for i=1,#arg do
- local a=arg[i]
- a=resolvers.resolve(a)
- a=unquoted(a)
- a=gsub(a,'"','\\"')
- if find(a," ",1,true) then
- result[#result+1]=quoted(a)
- else
- result[#result+1]=a
- end
+ result[i]=optionalquoted(resolveprefix and resolveprefix(arg[i]) or resolveprefix)
end
return concat(result," ")
else
@@ -9046,7 +9541,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-tab"] = package.loaded["lxml-tab"] or true
--- original size: 42614, stripped down to: 26694
+-- original size: 43882, stripped down to: 26870
if not modules then modules={} end modules ['lxml-tab']={
version=1.001,
@@ -9061,10 +9556,10 @@ if lpeg.setmaxstack then lpeg.setmaxstack(1000) end
xml=xml or {}
local xml=xml
local concat,remove,insert=table.concat,table.remove,table.insert
-local type,next,setmetatable,getmetatable,tonumber=type,next,setmetatable,getmetatable,tonumber
+local type,next,setmetatable,getmetatable,tonumber,rawset=type,next,setmetatable,getmetatable,tonumber,rawset
local lower,find,match,gsub=string.lower,string.find,string.match,string.gsub
local utfchar=utf.char
-local lpegmatch=lpeg.match
+local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns
local P,S,R,C,V,C,Cs=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.V,lpeg.C,lpeg.Cs
local formatters=string.formatters
xml.xmlns=xml.xmlns or {}
@@ -9226,9 +9721,10 @@ local function fromdec(s)
return formatters["d:%s"](s),true
end
end
-local rest=(1-P(";"))^0
-local many=P(1)^0
-local parsedentity=P("&")*(P("#x")*(rest/fromhex)+P("#")*(rest/fromdec))*P(";")*P(-1)+(P("#x")*(many/fromhex)+P("#")*(many/fromdec))
+local p_rest=(1-P(";"))^0
+local p_many=P(1)^0
+local p_char=lpegpatterns.utf8character
+local parsedentity=P("&")*(P("#x")*(p_rest/fromhex)+P("#")*(p_rest/fromdec))*P(";")*P(-1)+(P("#x")*(p_many/fromhex)+P("#")*(p_many/fromdec))
local predefined_unified={
[38]="&amp;",
[42]="&quot;",
@@ -9254,7 +9750,9 @@ local privates_u={
local privates_p={}
local privates_n={
}
-local escaped=utf.remapper(privates_u)
+local escaped=utf.remapper(privates_u,"dynamic")
+local unprivatized=utf.remapper(privates_p,"dynamic")
+xml.unprivatized=unprivatized
local function unescaped(s)
local p=privates_n[s]
if not p then
@@ -9267,9 +9765,7 @@ local function unescaped(s)
end
return p
end
-local unprivatized=utf.remapper(privates_p)
xml.privatetoken=unescaped
-xml.unprivatized=unprivatized
xml.privatecodes=privates_n
local function handle_hex_entity(str)
local h=hcache[str]
@@ -9422,7 +9918,7 @@ local valid=R('az','AZ','09')+S('_-.')
local name_yes=C(valid^1)*colon*C(valid^1)
local name_nop=C(P(true))*C(valid^1)
local name=name_yes+name_nop
-local utfbom=lpeg.patterns.utfbom
+local utfbom=lpegpatterns.utfbom
local spacing=C(space^0)
local anyentitycontent=(1-open-semicolon-space-close)^0
local hexentitycontent=R("AF","af","09")^0
@@ -9590,7 +10086,7 @@ local function _xmlconvert_(data,settings)
reported_attribute_errors,mt,errorhandler=nil,nil,nil
return result
end
-function xmlconvert(data,settings)
+local function xmlconvert(data,settings)
local ok,result=pcall(function() return _xmlconvert_(data,settings) end)
if ok then
return result
@@ -9682,14 +10178,17 @@ function xml.checkbom(root)
insert(dt,2,"\n" )
end
end
-local function verbose_element(e,handlers)
+local f_attribute=formatters['%s=%q']
+local function verbose_element(e,handlers,escape)
local handle=handlers.handle
local serialize=handlers.serialize
local ens,etg,eat,edt,ern=e.ns,e.tg,e.at,e.dt,e.rn
local ats=eat and next(eat) and {}
if ats then
+ local n=0
for k,v in next,eat do
- ats[#ats+1]=formatters['%s=%q'](k,escaped(v))
+ n=n+1
+ ats[n]=f_attribute(k,escaped(v))
end
end
if ern and trace_entities and ern~=ens then
@@ -10033,7 +10532,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-lpt"] = package.loaded["lxml-lpt"] or true
--- original size: 48030, stripped down to: 30595
+-- original size: 48229, stripped down to: 30684
if not modules then modules={} end modules ['lxml-lpt']={
version=1.001,
@@ -10418,8 +10917,8 @@ 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")+S("-_:"))^1)*Cc("'])")
-lp_fastpos_p=P("+")^0*R("09")^1*P(-1)/"l==%0"
-lp_fastpos_n=P("-")*R("09")^1*P(-1)/"(%0<0 and (#list+%0==l))"
+local lp_fastpos_p=P("+")^0*R("09")^1*P(-1)/"l==%0"
+local lp_fastpos_n=P("-")*R("09")^1*P(-1)/"(%0<0 and (#list+%0==l))"
local lp_fastpos=lp_fastpos_n+lp_fastpos_p
local lp_reserved=C("and")+C("or")+C("not")+C("div")+C("mod")+C("true")+C("false")
local lp_lua_function=Cs((R("az","AZ","__")^1*(P(".")*R("az","AZ","__")^1)^1)*("("))/"%0"
@@ -10598,7 +11097,7 @@ local function nodesettostring(set,nodetest)
if not ns or ns=="" then ns="*" end
if not tg or tg=="" then tg="*" end
tg=(tg=="@rt@" and "[root]") or format("%s:%s",ns,tg)
- t[i]=(directive and tg) or format("not(%s)",tg)
+ t[#t+1]=(directive and tg) or format("not(%s)",tg)
end
if nodetest==false then
return format("not(%s)",concat(t,"|"))
@@ -10864,7 +11363,6 @@ expressions.print=function(...)
print(...)
return true
end
-expressions.contains=find
expressions.find=find
expressions.upper=upper
expressions.lower=lower
@@ -10886,6 +11384,9 @@ function expressions.contains(str,pattern)
end
return false
end
+function xml.expressions.idstring(str)
+ return type(str)=="string" and gsub(str,"^#","") or ""
+end
local function traverse(root,pattern,handle)
local collected=applylpath(root,pattern)
if collected then
@@ -11173,7 +11674,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-aux"] = package.loaded["lxml-aux"] or true
--- original size: 23804, stripped down to: 16817
+-- original size: 28225, stripped down to: 20125
if not modules then modules={} end modules ['lxml-aux']={
version=1.001,
@@ -11183,16 +11684,19 @@ if not modules then modules={} end modules ['lxml-aux']={
license="see context related readme files"
}
local trace_manipulations=false trackers.register("lxml.manipulations",function(v) trace_manipulations=v end)
+local trace_inclusions=false trackers.register("lxml.inclusions",function(v) trace_inclusions=v end)
local report_xml=logs.reporter("xml")
local xml=xml
-local xmlconvert,xmlcopy,xmlname=xml.convert,xml.copy,xml.name
+local xmlcopy,xmlname=xml.copy,xml.name
local xmlinheritedconvert=xml.inheritedconvert
local xmlapplylpath=xml.applylpath
local xmlfilter=xml.filter
-local type,setmetatable,getmetatable=type,setmetatable,getmetatable
+local type,next,setmetatable,getmetatable=type,next,setmetatable,getmetatable
local insert,remove,fastcopy,concat=table.insert,table.remove,table.fastcopy,table.concat
local gmatch,gsub,format,find,strip=string.gmatch,string.gsub,string.format,string.find,string.strip
local utfbyte=utf.byte
+local lpegmatch=lpeg.match
+local striplinepatterns=utilities.strings.striplinepatterns
local function report(what,pattern,c,e)
report_xml("%s element %a, root %a, position %a, index %a, pattern %a",what,xmlname(e),xmlname(e.__p__),c,e.ni,pattern)
end
@@ -11247,13 +11751,15 @@ end
function xml.each(root,pattern,handle,reverse)
local collected=xmlapplylpath(root,pattern)
if collected then
- if reverse then
- for c=#collected,1,-1 do
- handle(collected[c])
- end
- else
- for c=1,#collected do
- handle(collected[c])
+ if handle then
+ if reverse then
+ for c=#collected,1,-1 do
+ handle(collected[c])
+ end
+ else
+ for c=1,#collected do
+ handle(collected[c])
+ end
end
end
return collected
@@ -11309,6 +11815,7 @@ local function redo_ni(d)
end
end
end
+xml.reindex=redo_ni
local function xmltoelement(whatever,root)
if not whatever then
return nil
@@ -11360,8 +11867,16 @@ function xml.delete(root,pattern)
report('deleting',pattern,c,e)
end
local d=p.dt
- remove(d,e.ni)
- redo_ni(d)
+ local ni=e.ni
+ if ni<=#d then
+ if false then
+ p.dt[ni]=""
+ else
+ remove(d,ni)
+ redo_ni(d)
+ end
+ else
+ end
end
end
end
@@ -11481,28 +11996,40 @@ 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)
+local function include(xmldata,pattern,attribute,recursive,loaddata,level)
pattern=pattern or 'include'
loaddata=loaddata or io.loaddata
local collected=xmlapplylpath(xmldata,pattern)
if collected then
+ if not level then
+ level=1
+ end
for c=1,#collected do
local ek=collected[c]
local name=nil
local ekdt=ek.dt
local ekat=ek.at
- local epdt=ek.__p__.dt
+ local ekrt=ek.__p__
+ local epdt=ekrt.dt
if not attribute or attribute=="" then
name=(type(ekdt)=="table" and ekdt[1]) or ekdt
end
if not name then
for a in gmatch(attribute or "href","([^|]+)") do
name=ekat[a]
- if name then break end
+ if name then
+ break
+ end
+ end
+ end
+ local data=nil
+ if name and name~="" then
+ data=loaddata(name) or ""
+ if trace_inclusions then
+ report_xml("including %s bytes from %a at level %s by pattern %a and attribute %a (%srecursing)",#data,name,level,pattern,attribute or "",recursive and "" or "not ")
end
end
- local data=(name and name~="" and loaddata(name)) or ""
- if data=="" then
+ if not data or data=="" then
epdt[ek.ni]=""
elseif ekat["parse"]=="text" then
epdt[ek.ni]=xml.escaped(data)
@@ -11512,70 +12039,113 @@ local function include(xmldata,pattern,attribute,recursive,loaddata)
epdt[ek.ni]=""
else
if recursive then
- include(xi,pattern,attribute,recursive,loaddata)
+ include(xi,pattern,attribute,recursive,loaddata,level+1)
+ end
+ local child=xml.body(xi)
+ child.__p__=ekrt
+ child.__f__=name
+ epdt[ek.ni]=child
+ local inclusions=xmldata.settings.inclusions
+ if inclusions then
+ inclusions[#inclusions+1]=name
+ else
+ xmldata.settings.inclusions={ name }
end
- epdt[ek.ni]=xml.body(xi)
end
end
end
end
end
xml.include=include
+function xml.inclusion(e,default)
+ while e do
+ local f=e.__f__
+ if f then
+ return f
+ else
+ e=e.__p__
+ end
+ end
+ return default
+end
+function xml.inclusions(e,sorted)
+ while e do
+ local settings=e.settings
+ if settings then
+ local inclusions=settings.inclusions
+ if inclusions then
+ inclusions=table.unique(inclusions)
+ if sorted then
+ table.sort(inclusions)
+ end
+ return inclusions
+ else
+ e=e.__p__
+ end
+ else
+ e=e.__p__
+ end
+ end
+end
+local b_collapser=lpeg.patterns.b_collapser
+local m_collapser=lpeg.patterns.m_collapser
+local e_collapser=lpeg.patterns.e_collapser
+local b_stripper=lpeg.patterns.b_stripper
+local m_stripper=lpeg.patterns.m_stripper
+local e_stripper=lpeg.patterns.e_stripper
+local lpegmatch=lpeg.match
local function stripelement(e,nolines,anywhere)
local edt=e.dt
if edt then
- if anywhere then
- local t,n={},0
- for e=1,#edt do
+ local n=#edt
+ if n==0 then
+ return e
+ elseif anywhere then
+ local t={}
+ local m=0
+ for e=1,n do
local str=edt[e]
if type(str)~="string" then
- n=n+1
- t[n]=str
+ m=m+1
+ t[m]=str
elseif str~="" then
if nolines then
- str=gsub(str,"%s+"," ")
+ str=lpegmatch((n==1 and b_collapser) or (n==m and e_collapser) or m_collapser,str)
+ else
+ str=lpegmatch((n==1 and b_stripper) or (n==m and e_stripper) or m_stripper,str)
end
- str=gsub(str,"^%s*(.-)%s*$","%1")
if str~="" then
- n=n+1
- t[n]=str
+ m=m+1
+ t[m]=str
end
end
end
e.dt=t
else
- if #edt>0 then
- local str=edt[1]
- if type(str)~="string" then
- elseif str=="" then
+ local str=edt[1]
+ if type(str)=="string" then
+ if str~="" then
+ str=lpegmatch(nolines and b_collapser or b_stripper,str)
+ end
+ if str=="" then
remove(edt,1)
+ n=n-1
else
- if nolines then
- str=gsub(str,"%s+"," ")
- end
- str=gsub(str,"^%s+","")
- if str=="" then
- remove(edt,1)
- else
- edt[1]=str
- end
+ edt[1]=str
end
end
- local nedt=#edt
- if nedt>0 then
- local str=edt[nedt]
- if type(str)~="string" then
- elseif str=="" then
- remove(edt)
- else
- if nolines then
- str=gsub(str,"%s+"," ")
- end
- str=gsub(str,"%s+$","")
+ if n>0 then
+ str=edt[n]
+ if type(str)=="string" then
if str=="" then
remove(edt)
else
- edt[nedt]=str
+ str=lpegmatch(nolines and e_collapser or e_stripper,str)
+ if str=="" then
+ remove(edt)
+ else
+ edt[n]=str
+ end
end
end
end
@@ -11761,8 +12331,8 @@ function xml.finalizers.xml.cdata(collected)
end
return ""
end
-function xml.insertcomment(e,str,n)
- table.insert(e.dt,n or 1,{
+function xml.insertcomment(e,str,n)
+ insert(e.dt,n or 1,{
tg="@cm@",
ns="",
special=true,
@@ -11770,7 +12340,25 @@ function xml.insertcomment(e,str,n)
dt={ str },
})
end
-function xml.setcdata(e,str)
+function xml.insertcdata(e,str,n)
+ insert(e.dt,n or 1,{
+ tg="@cd@",
+ ns="",
+ special=true,
+ at={},
+ dt={ str },
+ })
+end
+function xml.setcomment(e,str,n)
+ e.dt={ {
+ tg="@cm@",
+ ns="",
+ special=true,
+ at={},
+ dt={ str },
+ } }
+end
+function xml.setcdata(e,str)
e.dt={ {
tg="@cd@",
ns="",
@@ -11840,7 +12428,7 @@ local function recurse(e,action)
for i=1,#edt do
local str=edt[i]
if type(str)~="string" then
- recurse(str,action,recursive)
+ recurse(str,action)
elseif str~="" then
edt[i]=action(str)
end
@@ -11858,6 +12446,65 @@ function helpers.recursetext(collected,action,recursive)
end
end
end
+local specials={
+ ["@rt@"]="root",
+ ["@pi@"]="instruction",
+ ["@cm@"]="comment",
+ ["@dt@"]="declaration",
+ ["@cd@"]="cdata",
+}
+local function convert(x,strip,flat)
+ local ns=x.ns
+ local tg=x.tg
+ local at=x.at
+ local dt=x.dt
+ local node=flat and {
+ [0]=(not x.special and (ns~="" and ns..":"..tg or tg)) or nil,
+ } or {
+ _namespace=ns~="" and ns or nil,
+ _tag=not x.special and tg or nil,
+ _type=specials[tg] or "_element",
+ }
+ if at then
+ for k,v in next,at do
+ node[k]=v
+ end
+ end
+ local n=0
+ for i=1,#dt do
+ local di=dt[i]
+ if type(di)=="table" then
+ if flat and di.special then
+ else
+ di=convert(di,strip,flat)
+ if di then
+ n=n+1
+ node[n]=di
+ end
+ end
+ elseif strip then
+ di=lpegmatch(strip,di)
+ if di~="" then
+ n=n+1
+ node[n]=di
+ end
+ else
+ n=n+1
+ node[n]=di
+ end
+ end
+ if next(node) then
+ return node
+ end
+end
+function xml.totable(x,strip,flat)
+ if type(x)=="table" then
+ if strip then
+ strip=striplinepatterns[strip]
+ end
+ return convert(x,strip,flat)
+ end
+end
end -- of closure
@@ -12414,7 +13061,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-ini"] = package.loaded["data-ini"] or true
--- original size: 7927, stripped down to: 5528
+-- original size: 11085, stripped down to: 7662
if not modules then modules={} end modules ['data-ini']={
version=1.001,
@@ -12423,14 +13070,15 @@ if not modules then modules={} end modules ['data-ini']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files",
}
+local next,type,getmetatable,rawset=next,type,getmetatable,rawset
local gsub,find,gmatch,char=string.gsub,string.find,string.gmatch,string.char
-local next,type=next,type
local filedirname,filebasename,filejoin=file.dirname,file.basename,file.join
+local ostype,osname,osuname,ossetenv,osgetenv=os.type,os.name,os.uname,os.setenv,os.getenv
+local P,S,R,C,Cs,Cc,lpegmatch=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local trace_detail=false trackers.register("resolvers.details",function(v) trace_detail=v end)
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
resolvers=resolvers or {}
local resolvers=resolvers
texconfig.kpse_init=false
@@ -12563,10 +13211,103 @@ if type(profiler)=="table" and not jit then
profiler.start("luatex-profile.log")
end)
end
-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
+local prefixes=utilities.storage.allocate()
+resolvers.prefixes=prefixes
+local resolved={}
+local abstract={}
+local dynamic={}
+function resolvers.resetresolve(str)
+ resolved,abstract={},{}
+end
+function resolvers.allprefixes(separator)
+ local all=table.sortedkeys(prefixes)
+ if separator then
+ for i=1,#all do
+ all[i]=all[i]..":"
+ end
+ end
+ return all
+end
+local function _resolve_(method,target)
+ local action=prefixes[method]
+ if action then
+ return action(target)
+ else
+ return method..":"..target
+ end
+end
+function resolvers.unresolve(str)
+ return abstract[str] or str
+end
+function resolvers.setdynamic(str)
+ dynamic[str]=true
+end
+local pattern=Cs((C(R("az")^2)*P(":")*C((1-S(" \"\';,"))^1)/_resolve_+P(1))^0)
+local prefix=C(R("az")^2)*P(":")
+local target=C((1-S(" \"\';,"))^1)
+local notarget=(#S(";,")+P(-1))*Cc("")
+local p_resolve=Cs(((prefix*(target+notarget))/_resolve_+P(1))^0)
+local p_simple=prefix*P(-1)
+local function resolve(str)
+ if type(str)=="table" then
+ local res={}
+ for i=1,#str do
+ res[i]=resolve(str[i])
+ end
+ return res
+ end
+ local res=resolved[str]
+ if res then
+ return res
+ end
+ local simple=lpegmatch(p_simple,str)
+ local action=prefixes[simple]
+ if action then
+ local res=action(res)
+ if not dynamic[simple] then
+ resolved[simple]=res
+ abstract[res]=simple
+ end
+ return res
+ end
+ res=lpegmatch(p_resolve,str)
+ resolved[str]=res
+ abstract[res]=str
+ return res
+end
+resolvers.resolve=resolve
+if type(osuname)=="function" then
+ for k,v in next,osuname() do
+ if not prefixes[k] then
+ prefixes[k]=function() return v end
+ end
+ end
+end
+if ostype=="unix" then
+ local pattern
+ local function makepattern(t,k,v)
+ if t then
+ rawset(t,k,v)
+ end
+ local colon=P(":")
+ for k,v in table.sortedpairs(prefixes) do
+ if p then
+ p=P(k)+p
+ else
+ p=P(k)
+ end
+ end
+ pattern=Cs((p*colon+colon/";"+P(1))^0)
+ end
+ makepattern()
+ table.setmetatablenewindex(prefixes,makepattern)
+ function resolvers.repath(str)
+ return lpegmatch(pattern,str)
+ end
+else
+ function resolvers.repath(str)
+ return str
+ end
end
@@ -12576,7 +13317,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-exp"] = package.loaded["data-exp"] or true
--- original size: 15317, stripped down to: 9723
+-- original size: 17216, stripped down to: 10657
if not modules then modules={} end modules ['data-exp']={
version=1.001,
@@ -12590,12 +13331,16 @@ local concat,sort=table.concat,table.sort
local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns
local Ct,Cs,Cc,Carg,P,C,S=lpeg.Ct,lpeg.Cs,lpeg.Cc,lpeg.Carg,lpeg.P,lpeg.C,lpeg.S
local type,next=type,next
+local isdir=lfs.isdir
local ostype=os.type
-local collapsepath=file.collapsepath
+local collapsepath,joinpath,basename=file.collapsepath,file.join,file.basename
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local trace_expansions=false trackers.register("resolvers.expansions",function(v) trace_expansions=v end)
+local trace_globbing=true trackers.register("resolvers.globbing",function(v) trace_globbing=v end)
local report_expansions=logs.reporter("resolvers","expansions")
+local report_globbing=logs.reporter("resolvers","globbing")
local resolvers=resolvers
+local resolveprefix=resolvers.resolve
local function f_both(a,b)
local t,n={},0
for sb in gmatch(b,"[^,]+") do
@@ -12685,35 +13430,27 @@ function resolvers.expandedpathfromlist(pathlist)
end
return newlist
end
-local cleanup=lpeg.replacer {
- { "!","" },
- { "\\","/" },
-}
-function resolvers.cleanpath(str)
- local doslashes=(P("\\")/"/"+1)^0
- local donegation=(P("!")/"" )^0
- local homedir=lpegmatch(Cs(donegation*doslashes),environment.homedir or "")
- if homedir=="~" or homedir=="" or not lfs.isdir(homedir) then
- if trace_expansions then
- report_expansions("no home dir set, ignoring dependent paths")
- end
- function resolvers.cleanpath(str)
- if not str or find(str,"~",1,true) then
- return ""
- else
- return lpegmatch(cleanup,str)
+local usedhomedir=nil
+local donegation=(P("!")/"" )^0
+local doslashes=(P("\\")/"/"+1)^0
+local function expandedhome()
+ if not usedhomedir then
+ usedhomedir=lpegmatch(Cs(donegation*doslashes),environment.homedir or "")
+ if usedhomedir=="~" or usedhomedir=="" or not isdir(usedhomedir) then
+ if trace_expansions then
+ report_expansions("no home dir set, ignoring dependent path using current path")
end
- end
- else
- local dohome=((P("~")+P("$HOME"))/homedir)^0
- local cleanup=Cs(donegation*dohome*doslashes)
- function resolvers.cleanpath(str)
- return str and lpegmatch(cleanup,str) or ""
+ usedhomedir="."
end
end
- return resolvers.cleanpath(str)
+ return usedhomedir
+end
+local dohome=((P("~")+P("$HOME")+P("%HOME%"))/expandedhome)^0
+local cleanup=Cs(donegation*dohome*doslashes)
+resolvers.cleanpath=function(str)
+ return str and lpegmatch(cleanup,str) or ""
end
-local expandhome=P("~")/"$HOME"
+local expandhome=P("~")/"$HOME"
local dodouble=P('"')/""*(expandhome+(1-P('"')))^0*P('"')/""
local dosingle=P("'")/""*(expandhome+(1-P("'")))^0*P("'")/""
local dostring=(expandhome+1 )^0
@@ -12765,46 +13502,67 @@ function resolvers.splitpath(str)
end
function resolvers.joinpath(str)
if type(str)=='table' then
- return file.joinpath(str)
+ return joinpath(str)
else
return str
end
end
local attributes,directory=lfs.attributes,lfs.dir
local weird=P(".")^1+lpeg.anywhere(S("~`!#$%^&*()={}[]:;\"\'||<>,?\n\r\t"))
+local lessweird=P(".")^1+lpeg.anywhere(S("~`#$%^&*:;\"\'||<>,?\n\r\t"))
local timer={}
local scanned={}
local nofscans=0
local scancache={}
-local function scan(files,spec,path,n,m,r)
- local full=(path=="" and spec) or (spec..path..'/')
+local fullcache={}
+local nofsharedscans=0
+local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant)
+ local full=path=="" and spec or (spec..path..'/')
local dirs={}
local nofdirs=0
+ local pattern=tolerant and lessweird or weird
for name in directory(full) do
- if not lpegmatch(weird,name) then
- local mode=attributes(full..name,'mode')
- if mode=='file' then
+ if not lpegmatch(pattern,name) then
+ local mode=attributes(full..name,"mode")
+ if mode=="file" then
n=n+1
- local f=files[name]
- if f then
- if type(f)=='string' then
- files[name]={ f,path }
+ local lower=lower(name)
+ local paths=files[lower]
+ if paths then
+ if onlyone then
else
- f[#f+1]=path
+ if type(paths)=="string" then
+ files[lower]={ paths,path }
+ else
+ paths[#paths+1]=path
+ end
+ if name~=lower then
+ local rl=remap[lower]
+ if not rl then
+ remap[lower]=name
+ r=r+1
+ elseif trace_globbing and rl~=name then
+ report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl)
+ end
+ end
end
else
- files[name]=path
- local lower=lower(name)
+ files[lower]=path
if name~=lower then
- files["remap:"..lower]=name
- r=r+1
+ local rl=remap[lower]
+ if not rl then
+ remap[lower]=name
+ r=r+1
+ elseif trace_globbing and rl~=name then
+ report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl)
+ end
end
end
- elseif mode=='directory' then
+ elseif mode=="directory" then
m=m+1
nofdirs=nofdirs+1
if path~="" then
- dirs[nofdirs]=path..'/'..name
+ dirs[nofdirs]=path.."/"..name
else
dirs[nofdirs]=name
end
@@ -12814,107 +13572,69 @@ local function scan(files,spec,path,n,m,r)
if nofdirs>0 then
sort(dirs)
for i=1,nofdirs do
- files,n,m,r=scan(files,spec,dirs[i],n,m,r)
+ files,remap,n,m,r=scan(files,remap,spec,dirs[i],n,m,r,onlyonce,tolerant)
end
end
scancache[sub(full,1,-2)]=files
- return files,n,m,r
+ return files,remap,n,m,r
end
-local fullcache={}
-function resolvers.scanfiles(path,branch,usecache)
- statistics.starttiming(timer)
- local realpath=resolvers.resolve(path)
+function resolvers.scanfiles(path,branch,usecache,onlyonce,tolerant)
+ local realpath=resolveprefix(path)
if usecache then
- local files=fullcache[realpath]
- if files then
+ local content=fullcache[realpath]
+ if content then
if trace_locating then
- report_expansions("using caches scan of path %a, branch %a",path,branch or path)
+ report_expansions("using cached scan of path %a, branch %a",path,branch or path)
end
- return files
+ nofsharedscans=nofsharedscans+1
+ return content
end
end
+ statistics.starttiming(timer)
if trace_locating then
report_expansions("scanning path %a, branch %a",path,branch or path)
end
- local files,n,m,r=scan({},realpath..'/',"",0,0,0)
- files.__path__=path
- 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
- if usecache then
- scanned[#scanned+1]=realpath
- fullcache[realpath]=files
- end
- nofscans=nofscans+1
- statistics.stoptiming(timer)
- return files
-end
-local function simplescan(files,spec,path)
- local full=(path=="" and spec) or (spec..path..'/')
- local dirs={}
- local nofdirs=0
- for name in directory(full) do
- if not lpegmatch(weird,name) then
- local mode=attributes(full..name,'mode')
- if mode=='file' then
- if not files[name] then
- files[name]=path
- end
- elseif mode=='directory' then
- nofdirs=nofdirs+1
- if path~="" then
- dirs[nofdirs]=path..'/'..name
- else
- dirs[nofdirs]=name
- end
- end
- end
- end
- if nofdirs>0 then
- sort(dirs)
- for i=1,nofdirs do
- files=simplescan(files,spec,dirs[i])
- end
- end
- return files
-end
-local simplecache={}
-local nofsharedscans=0
-function resolvers.simplescanfiles(path,branch,usecache)
- statistics.starttiming(timer)
- local realpath=resolvers.resolve(path)
- if usecache then
- local files=simplecache[realpath]
- if not files then
- files=scancache[realpath]
- if files then
- nofsharedscans=nofsharedscans+1
- end
+ local content
+ if isdir(realpath) then
+ local files,remap,n,m,r=scan({},{},realpath..'/',"",0,0,0,onlyonce,tolerant)
+ content={
+ metadata={
+ path=path,
+ files=n,
+ directories=m,
+ remappings=r,
+ },
+ files=files,
+ remap=remap,
+ }
+ if trace_locating then
+ report_expansions("%s files found on %s directories with %s uppercase remappings",n,m,r)
end
- if files then
- if trace_locating then
- report_expansions("using caches scan of path %a, branch %a",path,branch or path)
- end
- return files
+ else
+ content={
+ metadata={
+ path=path,
+ files=0,
+ directories=0,
+ remappings=0,
+ },
+ files={},
+ remap={},
+ }
+ if trace_locating then
+ report_expansions("invalid path %a",realpath)
end
end
- if trace_locating then
- report_expansions("scanning path %a, branch %a",path,branch or path)
- end
- local files=simplescan({},realpath..'/',"")
- if trace_locating then
- report_expansions("%s files found",table.count(files))
- end
if usecache then
scanned[#scanned+1]=realpath
- simplecache[realpath]=files
+ fullcache[realpath]=content
end
nofscans=nofscans+1
statistics.stoptiming(timer)
- return files
+ return content
+end
+function resolvers.simplescanfiles(path,branch,usecache)
+ return resolvers.scanfiles(path,branch,usecache,true,true)
end
function resolvers.scandata()
table.sort(scanned)
@@ -12925,6 +13645,52 @@ function resolvers.scandata()
paths=scanned,
}
end
+function resolvers.get_from_content(content,path,name)
+ if not content then
+ return
+ end
+ local files=content.files
+ if not files then
+ return
+ end
+ local remap=content.remap
+ if not remap then
+ return
+ end
+ if name then
+ local used=lower(name)
+ return path,remap[used] or used
+ else
+ local name=path
+ local used=lower(name)
+ local path=files[used]
+ if path then
+ return path,remap[used] or used
+ end
+ end
+end
+local nothing=function() end
+function resolvers.filtered_from_content(content,pattern)
+ if content and type(pattern)=="string" then
+ local pattern=lower(pattern)
+ local files=content.files
+ local remap=content.remap
+ if files and remap then
+ local n=next(files)
+ local function iterator()
+ while n do
+ local k=n
+ n=next(files,k)
+ if find(k,pattern) then
+ return files[k],remap and remap[k] or k
+ end
+ end
+ end
+ return iterator
+ end
+ end
+ return nothing
+end
end -- of closure
@@ -12933,7 +13699,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-env"] = package.loaded["data-env"] or true
--- original size: 8769, stripped down to: 6490
+-- original size: 9216, stripped down to: 6798
if not modules then modules={} end modules ['data-env']={
version=1.001,
@@ -12951,10 +13717,12 @@ local formats=allocate()
local suffixes=allocate()
local dangerous=allocate()
local suffixmap=allocate()
+local usertypes=allocate()
resolvers.formats=formats
resolvers.suffixes=suffixes
resolvers.dangerous=dangerous
resolvers.suffixmap=suffixmap
+resolvers.usertypes=usertypes
local luasuffixes=utilities.lua.suffixes
local relations=allocate {
core={
@@ -13022,11 +13790,13 @@ local relations=allocate {
names={ "mp" },
variable='MPINPUTS',
suffixes={ 'mp','mpvi','mpiv','mpii' },
+ usertype=true,
},
tex={
names={ "tex" },
variable='TEXINPUTS',
- suffixes={ 'tex',"mkvi","mkiv","mkii" },
+ suffixes={ "tex","mkvi","mkiv","mkii","cld","lfg","xml" },
+ usertype=true,
},
icc={
names={ "icc","icc profile","icc profiles" },
@@ -13042,6 +13812,7 @@ local relations=allocate {
names={ "lua" },
variable='LUAINPUTS',
suffixes={ luasuffixes.lua,luasuffixes.luc,luasuffixes.tma,luasuffixes.tmc },
+ usertype=true,
},
lib={
names={ "lib" },
@@ -13050,11 +13821,15 @@ local relations=allocate {
},
bib={
names={ 'bib' },
+ variable='BIBINPUTS',
suffixes={ 'bib' },
+ usertype=true,
},
bst={
names={ 'bst' },
+ variable='BSTINPUTS',
suffixes={ 'bst' },
+ usertype=true,
},
fontconfig={
names={ 'fontconfig','fontconfig file','fontconfig files' },
@@ -13136,8 +13911,9 @@ function resolvers.updaterelations()
for name,relation in next,categories do
local rn=relation.names
local rv=relation.variable
- local rs=relation.suffixes
if rn and rv then
+ local rs=relation.suffixes
+ local ru=relation.usertype
for i=1,#rn do
local rni=lower(gsub(rn[i]," ",""))
formats[rni]=rv
@@ -13149,8 +13925,9 @@ function resolvers.updaterelations()
end
end
end
- end
- if rs then
+ if ru then
+ usertypes[name]=true
+ end
end
end
end
@@ -13201,7 +13978,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tmp"] = package.loaded["data-tmp"] or true
--- original size: 15532, stripped down to: 11648
+-- original size: 15681, stripped down to: 11761
if not modules then modules={} end modules ['data-tmp']={
version=1.100,
@@ -13220,6 +13997,7 @@ local trace_cache=false trackers.register("resolvers.cache",function(v) trace_ca
local report_caches=logs.reporter("resolvers","caches")
local report_resolvers=logs.reporter("resolvers","caching")
local resolvers=resolvers
+local cleanpath=resolvers.cleanpath
local directive_cleanup=false directives.register("system.compile.cleanup",function(v) directive_cleanup=v end)
local directive_strip=false directives.register("system.compile.strip",function(v) directive_strip=v end)
local compile=utilities.lua.compile
@@ -13241,7 +14019,7 @@ caches.relocate=false
caches.defaults={ "TMPDIR","TEMPDIR","TMP","TEMP","HOME","HOMEPATH" }
local writable,readables,usedreadables=nil,{},{}
local function identify()
- local texmfcaches=resolvers.cleanpathlist("TEXMFCACHE")
+ local texmfcaches=resolvers.cleanpathlist("TEXMFCACHE")
if texmfcaches then
for k=1,#texmfcaches do
local cachepath=texmfcaches[k]
@@ -13495,10 +14273,12 @@ 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(addsuffix(name,luasuffixes.lua),"trees")
- local filename=file.join(path,name)
+function caches.loadcontent(cachename,dataname,filename)
+ if not filename then
+ local name=caches.hashed(cachename)
+ local full,path=caches.getfirstreadablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename=file.join(path,name)
+ end
local blob=loadfile(addsuffix(filename,luasuffixes.luc)) or loadfile(addsuffix(filename,luasuffixes.lua))
if blob then
local data=blob()
@@ -13530,10 +14310,12 @@ function caches.collapsecontent(content)
end
end
end
-function caches.savecontent(cachename,dataname,content)
- local name=caches.hashed(cachename)
- local full,path=caches.setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
- local filename=file.join(path,name)
+function caches.savecontent(cachename,dataname,content,filename)
+ if not filename then
+ local name=caches.hashed(cachename)
+ local full,path=caches.setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename=file.join(path,name)
+ end
local luaname=addsuffix(filename,luasuffixes.lua)
local lucname=addsuffix(filename,luasuffixes.luc)
if trace_locating then
@@ -13576,7 +14358,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-met"] = package.loaded["data-met"] or true
--- original size: 5460, stripped down to: 4014
+-- original size: 5347, stripped down to: 4015
if not modules then modules={} end modules ['data-met']={
version=1.100,
@@ -13604,7 +14386,7 @@ local function splitmethod(filename)
if type(filename)=="table" then
return filename
end
- filename=file.collapsepath(filename,".")
+ filename=file.collapsepath(filename,".")
if not find(filename,"://",1,true) then
return { scheme="file",path=filename,original=filename,filename=filename }
end
@@ -13695,7 +14477,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-res"] = package.loaded["data-res"] or true
--- original size: 62045, stripped down to: 43116
+-- original size: 67003, stripped down to: 46291
if not modules then modules={} end modules ['data-res']={
version=1.001,
@@ -13705,7 +14487,7 @@ if not modules then modules={} end modules ['data-res']={
license="see context related readme files",
}
local gsub,find,lower,upper,match,gmatch=string.gsub,string.find,string.lower,string.upper,string.match,string.gmatch
-local concat,insert,sortedkeys=table.concat,table.insert,table.sortedkeys
+local concat,insert,remove,sortedkeys,sortedhash=table.concat,table.insert,table.remove,table.sortedkeys,table.sortedhash
local next,type,rawget=next,type,rawget
local os=os
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
@@ -13714,17 +14496,23 @@ local formatters=string.formatters
local filedirname=file.dirname
local filebasename=file.basename
local suffixonly=file.suffixonly
+local addsuffix=file.addsuffix
+local removesuffix=file.removesuffix
local filejoin=file.join
local collapsepath=file.collapsepath
local joinpath=file.joinpath
+local is_qualified_path=file.is_qualified_path
local allocate=utilities.storage.allocate
local settings_to_array=utilities.parsers.settings_to_array
+local getcurrentdir=lfs.currentdir
+local isfile=lfs.isfile
+local isdir=lfs.isdir
local setmetatableindex=table.setmetatableindex
local luasuffixes=utilities.lua.suffixes
-local getcurrentdir=lfs.currentdir
local trace_locating=false trackers .register("resolvers.locating",function(v) trace_locating=v end)
local trace_detail=false trackers .register("resolvers.details",function(v) trace_detail=v end)
local trace_expansions=false trackers .register("resolvers.expansions",function(v) trace_expansions=v end)
+local trace_paths=false trackers .register("resolvers.paths",function(v) trace_paths=v end)
local resolve_otherwise=true directives.register("resolvers.otherwise",function(v) resolve_otherwise=v end)
local report_resolving=logs.reporter("resolvers","resolving")
local resolvers=resolvers
@@ -13732,10 +14520,14 @@ local expandedpathfromlist=resolvers.expandedpathfromlist
local checkedvariable=resolvers.checkedvariable
local splitconfigurationpath=resolvers.splitconfigurationpath
local methodhandler=resolvers.methodhandler
+local filtered=resolvers.filtered_from_content
+local lookup=resolvers.get_from_content
+local cleanpath=resolvers.cleanpath
+local resolveprefix=resolvers.resolve
local initializesetter=utilities.setters.initialize
local ostype,osname,osenv,ossetenv,osgetenv=os.type,os.name,os.env,os.setenv,os.getenv
-resolvers.cacheversion='1.0.1'
-resolvers.configbanner=''
+resolvers.cacheversion="1.100"
+resolvers.configbanner=""
resolvers.homedir=environment.homedir
resolvers.criticalvars=allocate { "SELFAUTOLOC","SELFAUTODIR","SELFAUTOPARENT","TEXMFCNF","TEXMF","TEXOS" }
resolvers.luacnfname="texmfcnf.lua"
@@ -13754,6 +14546,7 @@ end
local unset_variable="unset"
local formats=resolvers.formats
local suffixes=resolvers.suffixes
+local usertypes=resolvers.usertypes
local dangerous=resolvers.dangerous
local suffixmap=resolvers.suffixmap
resolvers.defaultsuffixes={ "tex" }
@@ -13762,7 +14555,7 @@ local instance=resolvers.instance or nil
function resolvers.setenv(key,value,raw)
if instance then
instance.environment[key]=value
- ossetenv(key,raw and value or resolvers.resolve(value))
+ ossetenv(key,raw and value or resolveprefix(value))
end
end
local function getenv(key)
@@ -13776,7 +14569,7 @@ local function getenv(key)
end
resolvers.getenv=getenv
resolvers.env=getenv
-local function resolve(k)
+local function resolvevariable(k)
return instance.expansions[k]
end
local dollarstripper=lpeg.stripper("$")
@@ -13785,19 +14578,19 @@ 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 variableexpander=Cs((somevariable*(somekey/resolvevariable)+somethingelse)^1 )
local cleaner=P("\\")/"/"+P(";")*S("!{}/\\")^0*P(";")^1/";"
local variablecleaner=Cs((cleaner+P(1))^0)
-local somevariable=R("az","AZ","09","__","--")^1/resolve
+local somevariable=R("az","AZ","09","__","--")^1/resolvevariable
local variable=(P("$")/"")*(somevariable+(P("{")/"")*somevariable*(P("}")/""))
local variableresolver=Cs((variable+P(1))^0)
local function expandedvariable(var)
return lpegmatch(variableexpander,var) or var
end
-function resolvers.newinstance()
- if trace_locating then
+function resolvers.newinstance()
+ if trace_locating then
report_resolving("creating instance")
- end
+ end
local environment,variables,expansions,order=allocate(),allocate(),allocate(),allocate()
local newinstance={
environment=environment,
@@ -13810,6 +14603,7 @@ function resolvers.newinstance()
foundintrees=allocate(),
hashes=allocate(),
hashed=allocate(),
+ pathlists=false,
specification=allocate(),
lists=allocate(),
data=allocate(),
@@ -13822,6 +14616,7 @@ function resolvers.newinstance()
savelists=true,
pattern=nil,
force_suffixes=true,
+ pathstack={},
}
setmetatableindex(variables,function(t,k)
local v
@@ -13871,8 +14666,13 @@ function resolvers.reset()
end
local function reset_hashes()
instance.lists={}
+ instance.pathlists=false
instance.found={}
end
+local function reset_caches()
+ instance.lists={}
+ instance.pathlists=false
+end
local slash=P("/")
local pathexpressionpattern=Cs (
Cc("^")*(
@@ -13924,13 +14724,13 @@ local function identify_configuration_files()
for i=1,#cnfpaths do
local filepath=cnfpaths[i]
local filename=collapsepath(filejoin(filepath,luacnfname))
- local realname=resolvers.resolve(filename)
+ local realname=resolveprefix(filename)
if trace_locating then
- local fullpath=gsub(resolvers.resolve(collapsepath(filepath)),"//","/")
+ local fullpath=gsub(resolveprefix(collapsepath(filepath)),"//","/")
local weirdpath=find(fullpath,"/texmf.+/texmf") or not find(fullpath,"/web2c",1,true)
report_resolving("looking for %a on %s path %a from specification %a",luacnfname,weirdpath and "weird" or "given",fullpath,filepath)
end
- if lfs.isfile(realname) then
+ if isfile(realname) then
specification[#specification+1]=filename
if trace_locating then
report_resolving("found configuration file %a",realname)
@@ -13952,7 +14752,7 @@ local function load_configuration_files()
local filename=specification[i]
local pathname=filedirname(filename)
local filename=filejoin(pathname,luacnfname)
- local realname=resolvers.resolve(filename)
+ local realname=resolveprefix(filename)
local blob=loadfile(realname)
if blob then
local setups=instance.setups
@@ -13960,7 +14760,7 @@ local function load_configuration_files()
local parent=data and data.parent
if parent then
local filename=filejoin(pathname,parent)
- local realname=resolvers.resolve(filename)
+ local realname=resolveprefix(filename)
local blob=loadfile(realname)
if blob then
local parentdata=blob()
@@ -13985,7 +14785,7 @@ local function load_configuration_files()
elseif variables[k]==nil then
if trace_locating and not warning then
report_resolving("variables like %a in configuration file %a should move to the 'variables' subtable",
- k,resolvers.resolve(filename))
+ k,resolveprefix(filename))
warning=true
end
variables[k]=v
@@ -14045,7 +14845,7 @@ local function locate_file_databases()
local stripped=lpegmatch(inhibitstripper,path)
if stripped~="" then
local runtime=stripped==path
- path=resolvers.cleanpath(path)
+ path=cleanpath(path)
local spec=resolvers.splitmethod(stripped)
if runtime and (spec.noscheme or spec.scheme=="file") then
stripped="tree:///"..stripped
@@ -14108,8 +14908,8 @@ function resolvers.renew(hashname)
report_resolving("identifying tree %a",hashname)
end
end
- local realpath=resolvers.resolve(hashname)
- if lfs.isdir(realpath) then
+ local realpath=resolveprefix(hashname)
+ if isdir(realpath) then
if trace_locating then
report_resolving("using path %a",realpath)
end
@@ -14210,19 +15010,53 @@ end
function resolvers.unexpandedpath(str)
return joinpath(resolvers.unexpandedpathlist(str))
end
+function resolvers.pushpath(name)
+ local pathstack=instance.pathstack
+ local lastpath=pathstack[#pathstack]
+ local pluspath=filedirname(name)
+ if lastpath then
+ lastpath=collapsepath(filejoin(lastpath,pluspath))
+ else
+ lastpath=collapsepath(pluspath)
+ end
+ insert(pathstack,lastpath)
+ if trace_paths then
+ report_resolving("pushing path %a",lastpath)
+ end
+end
+function resolvers.poppath()
+ local pathstack=instance.pathstack
+ if trace_paths and #pathstack>0 then
+ report_resolving("popping path %a",pathstack[#pathstack])
+ end
+ remove(pathstack)
+end
+function resolvers.stackpath()
+ local pathstack=instance.pathstack
+ local currentpath=pathstack[#pathstack]
+ return currentpath~="" and currentpath or nil
+end
local done={}
function resolvers.resetextrapath()
local ep=instance.extra_paths
if not ep then
- ep,done={},{}
- instance.extra_paths=ep
+ done={}
+ instance.extra_paths={}
elseif #ep>0 then
- instance.lists,done={},{}
+ done={}
+ reset_caches()
end
end
function resolvers.registerextrapath(paths,subpaths)
- paths=settings_to_array(paths)
- subpaths=settings_to_array(subpaths)
+ if not subpaths or subpaths=="" then
+ if not paths or path=="" then
+ return
+ elseif done[paths] then
+ return
+ end
+ end
+ local paths=settings_to_array(paths)
+ local subpaths=settings_to_array(subpaths)
local ep=instance.extra_paths or {}
local oldn=#ep
local newn=oldn
@@ -14237,7 +15071,7 @@ function resolvers.registerextrapath(paths,subpaths)
local ps=p.."/"..s
if not done[ps] then
newn=newn+1
- ep[newn]=resolvers.cleanpath(ps)
+ ep[newn]=cleanpath(ps)
done[ps]=true
end
end
@@ -14247,7 +15081,7 @@ function resolvers.registerextrapath(paths,subpaths)
local p=paths[i]
if not done[p] then
newn=newn+1
- ep[newn]=resolvers.cleanpath(p)
+ ep[newn]=cleanpath(p)
done[p]=true
end
end
@@ -14259,7 +15093,7 @@ function resolvers.registerextrapath(paths,subpaths)
local ps=ep[i].."/"..s
if not done[ps] then
newn=newn+1
- ep[newn]=resolvers.cleanpath(ps)
+ ep[newn]=cleanpath(ps)
done[ps]=true
end
end
@@ -14268,52 +15102,70 @@ function resolvers.registerextrapath(paths,subpaths)
if newn>0 then
instance.extra_paths=ep
end
- if newn>oldn then
- instance.lists={}
+ if newn~=oldn then
+ reset_caches()
end
end
-local function made_list(instance,list)
- local ep=instance.extra_paths
- if not ep or #ep==0 then
- return list
+function resolvers.pushextrapath(path)
+ local paths=settings_to_array(path)
+ if instance.extra_stack then
+ insert(instance.extra_stack,1,paths)
else
- local done,new,newn={},{},0
- for k=1,#list do
- local v=list[k]
- if not done[v] then
- if find(v,"^[%.%/]$") then
- done[v]=true
- newn=newn+1
- new[newn]=v
- else
- break
- end
- end
- end
- for k=1,#ep do
- local v=ep[k]
+ instance.extra_stack={ paths }
+ end
+ reset_caches()
+end
+function resolvers.popextrapath()
+ if instance.extra_stack then
+ reset_caches()
+ return remove(instance.extra_stack,1)
+ end
+end
+local function made_list(instance,list,extra_too)
+ local done={}
+ local new={}
+ local newn=0
+ local function add(p)
+ for k=1,#p do
+ local v=p[k]
if not done[v] then
done[v]=true
newn=newn+1
new[newn]=v
end
end
- for k=1,#list do
- local v=list[k]
- if not done[v] then
- done[v]=true
- newn=newn+1
- new[newn]=v
+ end
+ for k=1,#list do
+ local v=list[k]
+ if done[v] then
+ elseif find(v,"^[%.%/]$") then
+ done[v]=true
+ newn=newn+1
+ new[newn]=v
+ else
+ break
+ end
+ end
+ if extra_too then
+ local es=instance.extra_stack
+ if es and #es>0 then
+ for k=1,#es do
+ add(es[k])
end
end
- return new
+ local ep=instance.extra_paths
+ if ep and #ep>0 then
+ add(ep)
+ end
end
+ add(list)
+ return new
end
function resolvers.cleanpathlist(str)
local t=resolvers.expandedpathlist(str)
if t then
for i=1,#t do
- t[i]=collapsepath(resolvers.cleanpath(t[i]))
+ t[i]=collapsepath(cleanpath(t[i]))
end
end
return t
@@ -14321,22 +15173,22 @@ end
function resolvers.expandpath(str)
return joinpath(resolvers.expandedpathlist(str))
end
-function resolvers.expandedpathlist(str)
+function resolvers.expandedpathlist(str,extra_too)
if not str then
return {}
- elseif instance.savelists then
+ elseif instance.savelists then
str=lpegmatch(dollarstripper,str)
local lists=instance.lists
local lst=lists[str]
if not lst then
- local l=made_list(instance,resolvers.splitpath(resolvers.expansion(str)))
+ local l=made_list(instance,resolvers.splitpath(resolvers.expansion(str)),extra_too)
lst=expandedpathfromlist(l)
lists[str]=lst
end
return lst
else
local lst=resolvers.splitpath(resolvers.expansion(str))
- return made_list(instance,expandedpathfromlist(lst))
+ return made_list(instance,expandedpathfromlist(lst),extra_too)
end
end
function resolvers.expandedpathlistfromvariable(str)
@@ -14347,6 +15199,13 @@ end
function resolvers.expandpathfromvariable(str)
return joinpath(resolvers.expandedpathlistfromvariable(str))
end
+function resolvers.cleanedpathlist(v)
+ local t=resolvers.expandedpathlist(v)
+ for i=1,#t do
+ t[i]=resolvers.resolve(resolvers.cleanpath(t[i]))
+ end
+ return t
+end
function resolvers.expandbraces(str)
local ori=str
local pth=expandedpathfromlist(resolvers.splitpath(ori))
@@ -14363,7 +15222,7 @@ function resolvers.registerfilehash(name,content,someerror)
end
end
local function isreadable(name)
- local readable=lfs.isfile(name)
+ local readable=isfile(name)
if trace_detail then
if readable then
report_resolving("file %a is readable",name)
@@ -14373,70 +15232,57 @@ local function isreadable(name)
end
return readable
end
-local function collect_files(names)
- local filelist,noffiles={},0
+local function collect_files(names)
+ local filelist={}
+ local noffiles=0
+ local function check(hash,root,pathname,path,name)
+ if not pathname or find(path,pathname) then
+ local variant=hash.type
+ local search=filejoin(root,path,name)
+ local result=methodhandler('concatinators',variant,root,path,name)
+ if trace_detail then
+ report_resolving("match: variant %a, search %a, result %a",variant,search,result)
+ end
+ noffiles=noffiles+1
+ filelist[noffiles]={ variant,search,result }
+ end
+ end
for k=1,#names do
- local fname=names[k]
+ local filename=names[k]
if trace_detail then
- report_resolving("checking name %a",fname)
+ report_resolving("checking name %a",filename)
end
- local bname=filebasename(fname)
- local dname=filedirname(fname)
- if dname=="" or find(dname,"^%.") then
- dname=false
+ local basename=filebasename(filename)
+ local pathname=filedirname(filename)
+ if pathname=="" or find(pathname,"^%.") then
+ pathname=false
else
- dname=gsub(dname,"%*",".*")
- dname="/"..dname.."$"
+ pathname=gsub(pathname,"%*",".*")
+ pathname="/"..pathname.."$"
end
local hashes=instance.hashes
for h=1,#hashes do
local hash=hashes[h]
- local blobpath=hash.name
- local files=blobpath and instance.files[blobpath]
- if files then
+ local hashname=hash.name
+ local content=hashname and instance.files[hashname]
+ if content then
if trace_detail then
- report_resolving("deep checking %a, base %a, pattern %a",blobpath,bname,dname)
- 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
+ report_resolving("deep checking %a, base %a, pattern %a",hashname,basename,pathname)
end
- if blobfile then
- local blobroot=files.__path__ or blobpath
- if type(blobfile)=='string' then
- if not dname or find(blobfile,dname) then
- local variant=hash.type
- local search=filejoin(blobroot,blobfile,bname)
- local result=methodhandler('concatinators',hash.type,blobroot,blobfile,bname)
- if trace_detail then
- report_resolving("match: variant %a, search %a, result %a",variant,search,result)
- end
- noffiles=noffiles+1
- filelist[noffiles]={ variant,search,result }
- end
+ local path,name=lookup(content,basename)
+ if path then
+ local metadata=content.metadata
+ local realroot=metadata and metadata.path or hashname
+ if type(path)=="string" then
+ check(hash,realroot,pathname,path,name)
else
- for kk=1,#blobfile do
- local vv=blobfile[kk]
- if not dname or find(vv,dname) then
- local variant=hash.type
- local search=filejoin(blobroot,vv,bname)
- local result=methodhandler('concatinators',hash.type,blobroot,vv,bname)
- if trace_detail then
- report_resolving("match: variant %a, search %a, result %a",variant,search,result)
- end
- noffiles=noffiles+1
- filelist[noffiles]={ variant,search,result }
- end
+ for i=1,#path do
+ check(hash,realroot,pathname,path[i],name)
end
end
end
elseif trace_locating then
- report_resolving("no match in %a (%s)",blobpath,bname)
+ report_resolving("no match in %a (%s)",hashname,basename)
end
end
end
@@ -14461,7 +15307,7 @@ end
local function can_be_dir(name)
local fakepaths=instance.fakepaths
if not fakepaths[name] then
- if lfs.isdir(name) then
+ if isdir(name) then
fakepaths[name]=1
else
fakepaths[name]=2
@@ -14477,10 +15323,11 @@ local function find_analyze(filename,askedformat,allresults)
if askedformat=="" then
if ext=="" or not suffixmap[ext] then
local defaultsuffixes=resolvers.defaultsuffixes
+ local formatofsuffix=resolvers.formatofsuffix
for i=1,#defaultsuffixes do
local forcedname=filename..'.'..defaultsuffixes[i]
wantedfiles[#wantedfiles+1]=forcedname
- filetype=resolvers.formatofsuffix(forcedname)
+ filetype=formatofsuffix(forcedname)
if trace_locating then
report_resolving("forcing filetype %a",filetype)
end
@@ -14520,14 +15367,14 @@ local function find_wildcard(filename,allresults)
if trace_locating then
report_resolving("checking wildcard %a",filename)
end
- local method,result=resolvers.findwildcardfiles(filename)
+ local result=resolvers.findwildcardfiles(filename)
if result then
return "wildcard",result
end
end
end
local function find_qualified(filename,allresults,askedformat,alsostripped)
- if not file.is_qualified_path(filename) then
+ if not is_qualified_path(filename) then
return
end
if trace_locating then
@@ -14601,33 +15448,66 @@ local function check_subpath(fname)
return fname
end
end
-local function find_intree(filename,filetype,wantedfiles,allresults)
+local function makepathlist(list,filetype)
local typespec=resolvers.variableofformat(filetype)
- local pathlist=resolvers.expandedpathlist(typespec)
- local method="intree"
+ local pathlist=resolvers.expandedpathlist(typespec,filetype and usertypes[filetype])
+ local entry={}
if pathlist and #pathlist>0 then
- local filelist=collect_files(wantedfiles)
+ for k=1,#pathlist do
+ local path=pathlist[k]
+ local prescanned=find(path,'^!!')
+ local resursive=find(path,'//$')
+ local pathname=lpegmatch(inhibitstripper,path)
+ local expression=makepathexpression(pathname)
+ local barename=gsub(pathname,"/+$","")
+ barename=resolveprefix(barename)
+ local scheme=url.hasscheme(barename)
+ local schemename=gsub(barename,"%.%*$",'')
+ entry[k]={
+ path=path,
+ pathname=pathname,
+ prescanned=prescanned,
+ recursive=recursive,
+ expression=expression,
+ barename=barename,
+ scheme=scheme,
+ schemename=schemename,
+ }
+ end
+ entry.typespec=typespec
+ list[filetype]=entry
+ else
+ list[filetype]=false
+ end
+ return entry
+end
+local function find_intree(filename,filetype,wantedfiles,allresults)
+ local pathlists=instance.pathlists
+ if not pathlists then
+ pathlists=setmetatableindex(allocate(),makepathlist)
+ instance.pathlists=pathlists
+ end
+ local pathlist=pathlists[filetype]
+ if pathlist then
+ local method="intree"
+ local filelist=collect_files(wantedfiles)
local dirlist={}
+ local result={}
if filelist then
for i=1,#filelist do
dirlist[i]=filedirname(filelist[i][3]).."/"
end
end
if trace_detail then
- report_resolving("checking filename %a",filename)
+ report_resolving("checking filename %a in tree",filename)
end
- local resolve=resolvers.resolve
- local result={}
for k=1,#pathlist do
- local path=pathlist[k]
- local pathname=lpegmatch(inhibitstripper,path)
- local doscan=path==pathname
- if not find (pathname,'//$') then
- doscan=false
- end
+ local entry=pathlist[k]
+ local path=entry.path
+ local pathname=entry.pathname
local done=false
if filelist then
- local expression=makepathexpression(pathname)
+ local expression=entry.expression
if trace_detail then
report_resolving("using pattern %a for path %a",expression,pathname)
end
@@ -14635,8 +15515,8 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
local fl=filelist[k]
local f=fl[2]
local d=dirlist[k]
- if find(d,expression) or find(resolve(d),expression) then
- result[#result+1]=resolve(fl[3])
+ if find(d,expression) or find(resolveprefix(d),expression) then
+ result[#result+1]=resolveprefix(fl[3])
done=true
if allresults then
if trace_detail then
@@ -14657,56 +15537,62 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
method="database"
else
method="filesystem"
- pathname=gsub(pathname,"/+$","")
- pathname=resolve(pathname)
- local scheme=url.hasscheme(pathname)
+ local scheme=entry.scheme
if not scheme or scheme=="file" then
- local pname=gsub(pathname,"%.%*$",'')
+ local pname=entry.schemename
if not find(pname,"*",1,true) then
if can_be_dir(pname) then
- for k=1,#wantedfiles do
- local w=wantedfiles[k]
- local fname=check_subpath(filejoin(pname,w))
- if fname then
- result[#result+1]=fname
- done=true
- if not allresults then
- break
- end
+ if not done and not entry.prescanned then
+ if trace_detail then
+ report_resolving("quick root scan for %a",pname)
end
- end
- if not done and doscan then
- local files=resolvers.simplescanfiles(pname,false,true)
for k=1,#wantedfiles do
local w=wantedfiles[k]
- local subpath=files[w]
- if not subpath or subpath=="" then
- elseif type(subpath)=="string" then
- local fname=check_subpath(filejoin(pname,subpath,w))
- if fname then
- result[#result+1]=fname
- done=true
- if not allresults then
- break
- end
+ local fname=check_subpath(filejoin(pname,w))
+ if fname then
+ result[#result+1]=fname
+ done=true
+ if not allresults then
+ break
end
- else
- for i=1,#subpath do
- local sp=subpath[i]
- if sp=="" then
- else
- local fname=check_subpath(filejoin(pname,sp,w))
- if fname then
- result[#result+1]=fname
- done=true
- if not allresults then
- break
+ end
+ end
+ if not done and entry.recursive then
+ if trace_detail then
+ report_resolving("scanning filesystem for %a",pname)
+ end
+ local files=resolvers.simplescanfiles(pname,false,true)
+ for k=1,#wantedfiles do
+ local w=wantedfiles[k]
+ local subpath=files[w]
+ if not subpath or subpath=="" then
+ elseif type(subpath)=="string" then
+ local fname=check_subpath(filejoin(pname,subpath,w))
+ if fname then
+ result[#result+1]=fname
+ done=true
+ if not allresults then
+ break
+ end
+ end
+ else
+ for i=1,#subpath do
+ local sp=subpath[i]
+ if sp=="" then
+ else
+ local fname=check_subpath(filejoin(pname,sp,w))
+ if fname then
+ result[#result+1]=fname
+ done=true
+ if not allresults then
+ break
+ end
end
end
end
- end
- if done and not allresults then
- break
+ if done and not allresults then
+ break
+ end
end
end
end
@@ -14714,6 +15600,18 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
else
end
+ else
+ for k=1,#wantedfiles do
+ local pname=entry.barename
+ local fname=methodhandler('finders',pname.."/"..wantedfiles[k])
+ if fname then
+ result[#result+1]=fname
+ done=true
+ if not allresults then
+ break
+ end
+ end
+ end
end
end
if done and not allresults then
@@ -14748,10 +15646,13 @@ local function find_otherwise(filename,filetype,wantedfiles,allresults)
local filelist=collect_files(wantedfiles)
local fl=filelist and filelist[1]
if fl then
- return "otherwise",{ resolvers.resolve(fl[3]) }
+ return "otherwise",{ resolveprefix(fl[3]) }
end
end
collect_instance_files=function(filename,askedformat,allresults)
+ if not filename or filename=="" then
+ return {}
+ end
askedformat=askedformat or ""
filename=collapsepath(filename,".")
filename=gsub(filename,"^%./",getcurrentdir().."/")
@@ -14786,7 +15687,11 @@ collect_instance_files=function(filename,askedformat,allresults)
else
local method,result,stamp,filetype,wantedfiles
if instance.remember then
- stamp=formatters["%s--%s"](filename,askedformat)
+ if askedformat=="" then
+ stamp=formatters["%s::%s"](suffixonly(filename),filename)
+ else
+ stamp=formatters["%s::%s"](askedformat,filename)
+ end
result=stamp and instance.found[stamp]
if result then
if trace_locating then
@@ -14821,7 +15726,7 @@ collect_instance_files=function(filename,askedformat,allresults)
end
if stamp then
if trace_locating then
- report_resolving("remembering file %a",filename)
+ report_resolving("remembering file %a using hash %a",filename,stamp)
end
instance.found[stamp]=result
end
@@ -14829,6 +15734,9 @@ collect_instance_files=function(filename,askedformat,allresults)
end
end
local function findfiles(filename,filetype,allresults)
+ if not filename or filename=="" then
+ return {}
+ end
local result,status=collect_instance_files(filename,filetype or "",allresults)
if not result or #result==0 then
local lowered=lower(filename)
@@ -14848,39 +15756,30 @@ 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 base=filebasename(filename)
+ local result={}
local hashes=instance.hashes
- local noffound=0
+ local function okay(hash,path,name)
+ local found=methodhandler('concatinators',hash.type,hash.name,path,name)
+ if found and found~="" then
+ result[#result+1]=resolveprefix(found)
+ return not allresults
+ end
+ end
for k=1,#hashes do
local hash=hashes[k]
- local files=instance.files[hash.name] or {}
- local blist=files[bname]
- if not blist then
- local rname="remap:"..bname
- blist=files[rname]
- if blist then
- bname=files[rname]
- blist=files[bname]
- end
- end
- if blist then
- if type(blist)=='string' then
- local found=methodhandler('concatinators',hash.type,hash.name,blist,bname) or ""
- if found~="" then
- noffound=noffound+1
- result[noffound]=resolvers.resolve(found)
- if not allresults then
- break
- end
+ local content=instance.files[hash.name]
+ if content then
+ local path,name=lookup(content,base)
+ if not path then
+ elseif type(path)=="string" then
+ if okay(hash,path,name) then
+ return result
end
else
- for kk=1,#blist do
- local vv=blist[kk]
- local found=methodhandler('concatinators',hash.type,hash.name,vv,bname) or ""
- if found~="" then
- noffound=noffound+1
- result[noffound]=resolvers.resolve(found)
- if not allresults then break end
+ for i=1,#path do
+ if okay(hash,path[i],name) then
+ return result
end
end
end
@@ -14894,64 +15793,80 @@ end
function resolvers.findgivenfile(filename)
return findgivenfiles(filename,false)[1] or ""
end
-local function doit(path,blist,bname,tag,variant,result,allresults)
- local done=false
- if blist and variant then
- local resolve=resolvers.resolve
- if type(blist)=='string' then
- if find(lower(blist),path) then
- local full=methodhandler('concatinators',variant,tag,blist,bname) or ""
- result[#result+1]=resolve(full)
- done=true
- end
- else
- for kk=1,#blist do
- local vv=blist[kk]
- if find(lower(vv),path) then
- local full=methodhandler('concatinators',variant,tag,vv,bname) or ""
- result[#result+1]=resolve(full)
- done=true
- if not allresults then break end
- end
- end
- end
- end
- return done
-end
local makewildcard=Cs(
(P("^")^0*P("/")*P(-1)+P(-1))/".*"+(P("^")^0*P("/")/"")^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)
- result=result or {}
+local function findwildcardfiles(filename,allresults,result)
+ local result=result or {}
local base=filebasename(filename)
local dirn=filedirname(filename)
local path=lower(lpegmatch(makewildcard,dirn) or dirn)
local name=lower(lpegmatch(makewildcard,base) or base)
- local files,done=instance.files,false
+ local files=instance.files
if find(name,"*",1,true) then
local hashes=instance.hashes
+ local function okay(found,path,base,hashname,hashtype)
+ if find(found,path) then
+ local full=methodhandler('concatinators',hashtype,hashname,found,base)
+ if full and full~="" then
+ result[#result+1]=resolveprefix(full)
+ return not allresults
+ end
+ end
+ end
for k=1,#hashes do
local hash=hashes[k]
- local hashname,hashtype=hash.name,hash.type
- for kk,hh in next,files[hashname] do
- if not find(kk,"^remap:") then
- if find(lower(kk),name) then
- if doit(path,hh,kk,hashname,hashtype,result,allresults) then done=true end
- if done and not allresults then break end
+ local hashname=hash.name
+ local hashtype=hash.type
+ if hashname and hashtype then
+ for found,base in filtered(files[hashname],name) do
+ if type(found)=='string' then
+ if okay(found,path,base,hashname,hashtype) then
+ break
+ end
+ else
+ for i=1,#found do
+ if okay(found[i],path,base,hashname,hashtype) then
+ break
+ end
+ end
end
end
end
end
else
+ local function okayokay(found,path,base,hashname,hashtype)
+ if find(found,path) then
+ local full=methodhandler('concatinators',hashtype,hashname,found,base)
+ if full and full~="" then
+ result[#result+1]=resolveprefix(full)
+ return not allresults
+ end
+ end
+ end
local hashes=instance.hashes
for k=1,#hashes do
local hash=hashes[k]
- local hashname,hashtype=hash.name,hash.type
- if doit(path,files[hashname][base],base,hashname,hashtype,result,allresults) then done=true end
- if done and not allresults then break end
+ local hashname=hash.name
+ local hashtype=hash.type
+ if hashname and hashtype then
+ local found,base=lookup(content,base)
+ if not found then
+ elseif type(found)=='string' then
+ if okay(found,path,base,hashname,hashtype) then
+ break
+ end
+ else
+ for i=1,#found do
+ if okay(found[i],path,base,hashname,hashtype) then
+ break
+ end
+ end
+ end
+ end
end
end
return result
@@ -15024,7 +15939,7 @@ end
function resolvers.dowithpath(name,func)
local pathlist=resolvers.expandedpathlist(name)
for i=1,#pathlist do
- func("^"..resolvers.cleanpath(pathlist[i]))
+ func("^"..cleanpath(pathlist[i]))
end
end
function resolvers.dowithvariable(name,func)
@@ -15032,23 +15947,23 @@ function resolvers.dowithvariable(name,func)
end
function resolvers.locateformat(name)
local engine=environment.ownmain or "luatex"
- local barename=file.removesuffix(name)
- local fullname=file.addsuffix(barename,"fmt")
+ local barename=removesuffix(name)
+ local fullname=addsuffix(barename,"fmt")
local fmtname=caches.getfirstreadablefile(fullname,"formats",engine) or ""
if fmtname=="" then
fmtname=resolvers.findfile(fullname)
- fmtname=resolvers.cleanpath(fmtname)
+ fmtname=cleanpath(fmtname)
end
if fmtname~="" then
- local barename=file.removesuffix(fmtname)
- local luaname=file.addsuffix(barename,luasuffixes.lua)
- local lucname=file.addsuffix(barename,luasuffixes.luc)
- local luiname=file.addsuffix(barename,luasuffixes.lui)
- if lfs.isfile(luiname) then
+ local barename=removesuffix(fmtname)
+ local luaname=addsuffix(barename,luasuffixes.lua)
+ local lucname=addsuffix(barename,luasuffixes.luc)
+ local luiname=addsuffix(barename,luasuffixes.lui)
+ if isfile(luiname) then
return barename,luiname
- elseif lfs.isfile(lucname) then
+ elseif isfile(lucname) then
return barename,lucname
- elseif lfs.isfile(luaname) then
+ elseif isfile(luaname) then
return barename,luaname
end
end
@@ -15070,29 +15985,24 @@ function resolvers.dowithfilesintree(pattern,handle,before,after)
local hash=hashes[i]
local blobtype=hash.type
local blobpath=hash.name
- if blobpath then
+ if blobtype and blobpath then
+ local total=0
+ local checked=0
+ local done=0
if before then
before(blobtype,blobpath,pattern)
end
- local files=instance.files[blobpath]
- local total,checked,done=0,0,0
- if files then
- for k,v in table.sortedhash(files) do
- total=total+1
- if find(k,"^remap:") then
- elseif find(k,pattern) then
- if type(v)=="string" then
- checked=checked+1
- if handle(blobtype,blobpath,v,k) then
- done=done+1
- end
- else
- checked=checked+#v
- for i=1,#v do
- if handle(blobtype,blobpath,v[i],k) then
- done=done+1
- end
- end
+ for path,name in filtered(instance.files[blobpath],pattern) do
+ if type(path)=="string" then
+ checked=checked+1
+ if handle(blobtype,blobpath,path,name) then
+ done=done+1
+ end
+ else
+ checked=checked+#path
+ for i=1,#path do
+ if handle(blobtype,blobpath,path[i],name) then
+ done=done+1
end
end
end
@@ -15103,8 +16013,8 @@ function resolvers.dowithfilesintree(pattern,handle,before,after)
end
end
end
-resolvers.obsolete=resolvers.obsolete or {}
-local obsolete=resolvers.obsolete
+local obsolete=resolvers.obsolete or {}
+resolvers.obsolete=obsolete
resolvers.find_file=resolvers.findfile obsolete.find_file=resolvers.findfile
resolvers.find_files=resolvers.findfiles obsolete.find_files=resolvers.findfiles
@@ -15115,7 +16025,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-pre"] = package.loaded["data-pre"] or true
--- original size: 6643, stripped down to: 4401
+-- original size: 3950, stripped down to: 2935
if not modules then modules={} end modules ['data-pre']={
version=1.001,
@@ -15125,44 +16035,51 @@ if not modules then modules={} end modules ['data-pre']={
license="see context related readme files"
}
local resolvers=resolvers
-local prefixes=utilities.storage.allocate()
-resolvers.prefixes=prefixes
-local cleanpath,findgivenfile,expansion=resolvers.cleanpath,resolvers.findgivenfile,resolvers.expansion
+local prefixes=resolvers.prefixes
+local cleanpath=resolvers.cleanpath
+local findgivenfile=resolvers.findgivenfile
+local expansion=resolvers.expansion
local getenv=resolvers.getenv
-local P,S,R,C,Cs,Cc,lpegmatch=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.match
-local joinpath,basename,dirname=file.join,file.basename,file.dirname
-local getmetatable,rawset,type=getmetatable,rawset,type
+local basename=file.basename
+local dirname=file.dirname
+local joinpath=file.join
+local isfile=lfs.isfile
prefixes.environment=function(str)
return cleanpath(expansion(str))
end
-prefixes.relative=function(str,n)
- if io.exists(str) then
- elseif io.exists("./"..str) then
- str="./"..str
- else
- local p="../"
- for i=1,n or 2 do
- if io.exists(p..str) then
- str=p..str
- break
- else
- p=p.."../"
+local function relative(str,n)
+ if not isfile(str) then
+ local pstr="./"..str
+ if isfile(pstr) then
+ str=pstr
+ else
+ local p="../"
+ for i=1,n or 2 do
+ local pstr=p..str
+ if isfile(pstr) then
+ str=pstr
+ break
+ else
+ p=p.."../"
+ end
end
end
end
return cleanpath(str)
end
+local function locate(str)
+ local fullname=findgivenfile(str) or ""
+ return cleanpath(fullname~="" and fullname or str)
+end
+prefixes.relative=relative
+prefixes.locate=locate
prefixes.auto=function(str)
- local fullname=prefixes.relative(str)
- if not lfs.isfile(fullname) then
- fullname=prefixes.locate(str)
+ local fullname=relative(str)
+ if not isfile(fullname) then
+ fullname=locate(str)
end
return fullname
end
-prefixes.locate=function(str)
- local fullname=findgivenfile(str) or ""
- return cleanpath((fullname~="" and fullname) or str)
-end
prefixes.filename=function(str)
local fullname=findgivenfile(str) or ""
return cleanpath(basename((fullname~="" and fullname) or str))
@@ -15183,6 +16100,13 @@ end
prefixes.home=function(str)
return cleanpath(joinpath(getenv('HOME'),str))
end
+prefixes.env=prefixes.environment
+prefixes.rel=prefixes.relative
+prefixes.loc=prefixes.locate
+prefixes.kpse=prefixes.locate
+prefixes.full=prefixes.locate
+prefixes.file=prefixes.filename
+prefixes.path=prefixes.pathname
local function toppath()
local inputstack=resolvers.inputstack
if not inputstack then
@@ -15195,98 +16119,22 @@ local function toppath()
return pathname
end
end
-resolvers.toppath=toppath
-prefixes.toppath=function(str)
- return cleanpath(joinpath(toppath(),str))
-end
-prefixes.env=prefixes.environment
-prefixes.rel=prefixes.relative
-prefixes.loc=prefixes.locate
-prefixes.kpse=prefixes.locate
-prefixes.full=prefixes.locate
-prefixes.file=prefixes.filename
-prefixes.path=prefixes.pathname
-function resolvers.allprefixes(separator)
- local all=table.sortedkeys(prefixes)
- if separator then
- for i=1,#all do
- all[i]=all[i]..":"
- end
- end
- return all
-end
-local function _resolve_(method,target)
- local action=prefixes[method]
- if action then
- return action(target)
- else
- return method..":"..target
- end
-end
-local resolved,abstract={},{}
-function resolvers.resetresolve(str)
- resolved,abstract={},{}
-end
-local pattern=Cs((C(R("az")^2)*P(":")*C((1-S(" \"\';,"))^1)/_resolve_+P(1))^0)
-local prefix=C(R("az")^2)*P(":")
-local target=C((1-S(" \"\';,"))^1)
-local notarget=(#S(";,")+P(-1))*Cc("")
-local pattern=Cs(((prefix*(target+notarget))/_resolve_+P(1))^0)
-local function resolve(str)
- if type(str)=="table" then
- local t={}
- for i=1,#str do
- t[i]=resolve(str[i])
- end
- return t
+local function jobpath()
+ local path=resolvers.stackpath()
+ if not path or path=="" then
+ return "."
else
- local res=resolved[str]
- if not res then
- res=lpegmatch(pattern,str)
- resolved[str]=res
- abstract[res]=str
- end
- return res
- end
-end
-local function unresolve(str)
- return abstract[str] or str
-end
-resolvers.resolve=resolve
-resolvers.unresolve=unresolve
-if type(os.uname)=="function" then
- for k,v in next,os.uname() do
- if not prefixes[k] then
- prefixes[k]=function() return v end
- end
- end
-end
-if os.type=="unix" then
- local pattern
- local function makepattern(t,k,v)
- if t then
- rawset(t,k,v)
- end
- local colon=P(":")
- for k,v in table.sortedpairs(prefixes) do
- if p then
- p=P(k)+p
- else
- p=P(k)
- end
- end
- pattern=Cs((p*colon+colon/";"+P(1))^0)
- end
- makepattern()
- getmetatable(prefixes).__newindex=makepattern
- function resolvers.repath(str)
- return lpegmatch(pattern,str)
- end
-else
- function resolvers.repath(str)
- return str
+ return path
end
end
+resolvers.toppath=toppath
+resolvers.jobpath=jobpath
+prefixes.toppath=function(str) return cleanpath(joinpath(toppath(),str)) end
+prefixes.jobpath=function(str) return cleanpath(joinpath(jobpath(),str)) end
+resolvers.setdynamic("toppath")
+resolvers.setdynamic("jobpath")
+prefixes.jobfile=prefixes.jobpath
+resolvers.setdynamic("jobfile")
end -- of closure
@@ -15348,7 +16196,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-fil"] = package.loaded["data-fil"] or true
--- original size: 3801, stripped down to: 3231
+-- original size: 3863, stripped down to: 3310
if not modules then modules={} end modules ['data-fil']={
version=1.001,
@@ -15360,30 +16208,31 @@ if not modules then modules={} end modules ['data-fil']={
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 resolveprefix=resolvers.resolve
local finders,openers,loaders,savers=resolvers.finders,resolvers.openers,resolvers.loaders,resolvers.savers
local locators,hashers,generators,concatinators=resolvers.locators,resolvers.hashers,resolvers.generators,resolvers.concatinators
local checkgarbage=utilities.garbagecollector and utilities.garbagecollector.check
function locators.file(specification)
- local name=specification.filename
- local realname=resolvers.resolve(name)
+ local filename=specification.filename
+ local realname=resolveprefix(filename)
if realname and realname~='' and lfs.isdir(realname) then
if trace_locating then
- report_files("file locator %a found as %a",name,realname)
+ report_files("file locator %a found as %a",filename,realname)
end
- resolvers.appendhash('file',name,true)
+ resolvers.appendhash('file',filename,true)
elseif trace_locating then
- report_files("file locator %a not found",name)
+ report_files("file locator %a not found",filename)
end
end
function hashers.file(specification)
- local name=specification.filename
- local content=caches.loadcontent(name,'files')
- resolvers.registerfilehash(name,content,content==nil)
+ local pathname=specification.filename
+ local content=caches.loadcontent(pathname,'files')
+ resolvers.registerfilehash(pathname,content,content==nil)
end
function generators.file(specification)
- local path=specification.filename
- local content=resolvers.scanfiles(path,false,true)
- resolvers.registerfilehash(path,content,true)
+ local pathname=specification.filename
+ local content=resolvers.scanfiles(pathname,false,true)
+ resolvers.registerfilehash(pathname,content,true)
end
concatinators.file=file.join
function finders.file(specification,filetype)
@@ -15665,7 +16514,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-zip"] = package.loaded["data-zip"] or true
--- original size: 8489, stripped down to: 6757
+-- original size: 8772, stripped down to: 6841
if not modules then modules={} end modules ['data-zip']={
version=1.001,
@@ -15684,16 +16533,6 @@ zip.archives=zip.archives or {}
local archives=zip.archives
zip.registeredfiles=zip.registeredfiles or {}
local registeredfiles=zip.registeredfiles
-local limited=false
-directives.register("system.inputmode",function(v)
- if not limited then
- local i_limiter=io.i_limiter(v)
- if i_limiter then
- zip.open=i_limiter.protect(zip.open)
- limited=true
- end
- end
-end)
local function validzip(str)
if not find(str,"^zip://") then
return "zip:///"..str
@@ -15708,7 +16547,7 @@ function zip.openarchive(name)
local arch=archives[name]
if not arch then
local full=resolvers.findfile(name) or ""
- arch=(full~="" and zip.open(full)) or false
+ arch=full~="" and zip.open(full) or false
archives[name]=arch
end
return arch
@@ -15867,31 +16706,42 @@ function resolvers.usezipfile(archive)
end
end
function resolvers.registerzipfile(z,tree)
- local files,filter={},""
- if tree=="" then
- filter="^(.+)/(.-)$"
- else
- filter=format("^%s/(.+)/(.-)$",tree)
- end
+ local names={}
+ local files={}
+ local remap={}
+ local n=0
+ local filter=tree=="" and "^(.+)/(.-)$" or format("^%s/(.+)/(.-)$",tree)
+ local register=resolvers.registerfile
if trace_locating then
report_zip("registering: using filter %a",filter)
end
- local register,n=resolvers.registerfile,0
for i in z:files() do
- local path,name=match(i.filename,filter)
- if path then
- if name and name~='' then
- register(files,name,path)
- n=n+1
- else
+ local filename=i.filename
+ local path,name=match(filename,filter)
+ if not path then
+ n=n+1
+ register(names,filename,"")
+ local usedname=lower(filename)
+ files[usedname]=""
+ if usedname~=filename then
+ remap[usedname]=filename
end
- else
- register(files,i.filename,'')
+ elseif name and name~="" then
n=n+1
+ register(names,name,path)
+ local usedname=lower(name)
+ files[usedname]=path
+ if usedname~=name then
+ remap[usedname]=name
+ end
+ else
end
end
report_zip("registering: %s files registered",n)
- return files
+ return {
+ files=files,
+ remap=remap,
+ }
end
@@ -15901,7 +16751,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tre"] = package.loaded["data-tre"] or true
--- original size: 2508, stripped down to: 2074
+-- original size: 8479, stripped down to: 5580
if not modules then modules={} end modules ['data-tre']={
version=1.001,
@@ -15910,42 +16760,64 @@ if not modules then modules={} end modules ['data-tre']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local find,gsub,format=string.find,string.gsub,string.format
+local find,gsub,lower=string.find,string.gsub,string.lower
+local basename,dirname,joinname=file.basename,file.dirname,file .join
+local globdir,isdir,isfile=dir.glob,lfs.isdir,lfs.isfile
+local P,lpegmatch=lpeg.P,lpeg.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_trees=logs.reporter("resolvers","trees")
local resolvers=resolvers
-local done,found,notfound={},{},resolvers.finders.notfound
-function resolvers.finders.tree(specification)
+local resolveprefix=resolvers.resolve
+local notfound=resolvers.finders.notfound
+local lookup=resolvers.get_from_content
+local collectors={}
+local found={}
+function resolvers.finders.tree(specification)
local spec=specification.filename
- local fnd=found[spec]
- if fnd==nil then
+ local okay=found[spec]
+ if okay==nil then
if spec~="" then
- local path,name=file.dirname(spec),file.basename(spec)
- if path=="" then path="." end
- local hash=done[path]
- if not hash then
- local pattern=path.."/*"
- hash=dir.glob(pattern)
- done[path]=hash
+ local path=dirname(spec)
+ local name=basename(spec)
+ if path=="" then
+ path="."
+ end
+ local names=collectors[path]
+ if not names then
+ local pattern=find(path,"/%*+$") and path or (path.."/*")
+ names=globdir(pattern)
+ collectors[path]=names
end
local pattern="/"..gsub(name,"([%.%-%+])","%%%1").."$"
- for k=1,#hash do
- local v=hash[k]
- if find(v,pattern) then
- found[spec]=v
- return v
+ for i=1,#names do
+ local fullname=names[i]
+ if find(fullname,pattern) then
+ found[spec]=fullname
+ return fullname
+ end
+ end
+ local pattern=lower(pattern)
+ for i=1,#names do
+ local fullname=lower(names[i])
+ if find(fullname,pattern) then
+ if isfile(fullname) then
+ found[spec]=fullname
+ return fullname
+ else
+ break
+ end
end
end
end
- fnd=notfound()
- found[spec]=fnd
+ okay=notfound()
+ found[spec]=okay
end
- return fnd
+ return okay
end
function resolvers.locators.tree(specification)
local name=specification.filename
- local realname=resolvers.resolve(name)
- if realname and realname~='' and lfs.isdir(realname) then
+ local realname=resolveprefix(name)
+ if realname and realname~='' and isdir(realname) then
if trace_locating then
report_trees("locator %a found",realname)
end
@@ -15956,16 +16828,110 @@ function resolvers.locators.tree(specification)
end
function resolvers.hashers.tree(specification)
local name=specification.filename
- if trace_locating then
- report_trees("analysing %a",name)
- end
+ report_trees("analyzing %a",name)
resolvers.methodhandler("hashers",name)
resolvers.generators.file(specification)
end
-resolvers.concatinators.tree=resolvers.concatinators.file
-resolvers.generators.tree=resolvers.generators.file
-resolvers.openers.tree=resolvers.openers.file
-resolvers.loaders.tree=resolvers.loaders.file
+local collectors={}
+local splitter=lpeg.splitat("/**/")
+local stripper=lpeg.replacer { [P("/")*P("*")^1*P(-1)]="" }
+table.setmetatableindex(collectors,function(t,k)
+ local rootname=lpegmatch(stripper,k)
+ local dataname=joinname(rootname,"dirlist")
+ local content=caches.loadcontent(dataname,"files",dataname)
+ if not content then
+ content=resolvers.scanfiles(rootname,nil,nil,false,true)
+ caches.savecontent(dataname,"files",content,dataname)
+ end
+ t[k]=content
+ return content
+end)
+local function checked(root,p,n)
+ if p then
+ if type(p)=="table" then
+ for i=1,#p do
+ local fullname=joinname(root,p[i],n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ else
+ local fullname=joinname(root,p,n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ end
+ return notfound()
+end
+local function resolve(specification)
+ local filename=specification.filename
+ if filename~="" then
+ local root,rest=lpegmatch(splitter,filename)
+ if root and rest then
+ local path,name=dirname(rest),basename(rest)
+ if name~=rest then
+ local content=collectors[root]
+ local p,n=lookup(content,name)
+ if not p then
+ return notfound()
+ end
+ local pattern=".*/"..path.."$"
+ local istable=type(p)=="table"
+ if istable then
+ for i=1,#p do
+ local pi=p[i]
+ if pi==path or find(pi,pattern) then
+ local fullname=joinname(root,pi,n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ end
+ elseif p==path or find(p,pattern) then
+ local fullname=joinname(root,p,n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ local queries=specification.queries
+ if queries and queries.option=="fileonly" then
+ return checked(root,p,n)
+ else
+ return notfound()
+ end
+ end
+ end
+ local path,name=dirname(filename),basename(filename)
+ local root=lpegmatch(stripper,path)
+ local content=collectors[path]
+ local p,n=lookup(content,name)
+ if p then
+ return checked(root,p,n)
+ end
+ end
+ return notfound()
+end
+resolvers.finders .dirlist=resolve
+resolvers.locators .dirlist=resolvers.locators .tree
+resolvers.hashers .dirlist=resolvers.hashers .tree
+resolvers.generators.dirlist=resolvers.generators.file
+resolvers.openers .dirlist=resolvers.openers .file
+resolvers.loaders .dirlist=resolvers.loaders .file
+function resolvers.finders.dirfile(specification)
+ local queries=specification.queries
+ if queries then
+ queries.option="fileonly"
+ else
+ specification.queries={ option="fileonly" }
+ end
+ return resolve(specification)
+end
+resolvers.locators .dirfile=resolvers.locators .dirlist
+resolvers.hashers .dirfile=resolvers.hashers .dirlist
+resolvers.generators.dirfile=resolvers.generators.dirlist
+resolvers.openers .dirfile=resolvers.openers .dirlist
+resolvers.loaders .dirfile=resolvers.loaders .dirlist
end -- of closure
@@ -15974,7 +16940,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-sch"] = package.loaded["data-sch"] or true
--- original size: 6213, stripped down to: 5160
+-- original size: 6569, stripped down to: 5304
if not modules then modules={} end modules ['data-sch']={
version=1.001,
@@ -16000,8 +16966,13 @@ directives.register("schemes.threshold",function(v) threshold=tonumber(v) or thr
function cleaners.none(specification)
return specification.original
end
-function cleaners.strip(specification)
- return (gsub(specification.original,"[^%a%d%.]+","-"))
+function cleaners.strip(specification)
+ local path,name=file.splitbase(specification.original)
+ if path=="" then
+ return (gsub(name,"[^%a%d%.]+","-"))
+ else
+ return (gsub((gsub(path,"%.","-").."-"..name),"[^%a%d%.]+","-"))
+ end
end
function cleaners.md5(specification)
return file.addsuffix(md5.hex(specification.original),file.suffix(specification.path))
@@ -16018,7 +16989,7 @@ end
local cached,loaded,reused,thresholds,handlers={},{},{},{},{}
local function runcurl(name,cachename)
local command="curl --silent --insecure --create-dirs --output "..cachename.." "..name
- os.spawn(command)
+ os.execute(command)
end
local function fetch(specification)
local original=specification.original
@@ -16150,7 +17121,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-lua"] = package.loaded["data-lua"] or true
--- original size: 4237, stripped down to: 3177
+-- original size: 4313, stripped down to: 3227
if not modules then modules={} end modules ['data-lua']={
version=1.001,
@@ -16159,7 +17130,7 @@ if not modules then modules={} end modules ['data-lua']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local resolvers,package=resolvers,package
+local package,lpeg=package,lpeg
local gsub=string.gsub
local concat=table.concat
local addsuffix=file.addsuffix
@@ -16170,9 +17141,11 @@ local luaformats={ 'TEXINPUTS','LUAINPUTS' }
local libformats={ 'CLUAINPUTS' }
local helpers=package.helpers or {}
local methods=helpers.methods or {}
+local resolvers=resolvers
+local resolveprefix=resolvers.resolve
+helpers.report=logs.reporter("resolvers","libraries")
trackers.register("resolvers.libraries",function(v) helpers.trace=v end)
trackers.register("resolvers.locating",function(v) helpers.trace=v end)
-helpers.report=logs.reporter("resolvers","libraries")
helpers.sequence={
"already loaded",
"preload table",
@@ -16187,7 +17160,7 @@ helpers.sequence={
}
local pattern=Cs(P("!")^0/""*(P("/")*P(-1)/"/"+P("/")^1/"/"+1)^0)
function helpers.cleanpath(path)
- return resolvers.resolve(lpegmatch(pattern,path))
+ return resolveprefix(lpegmatch(pattern,path))
end
local loadedaslib=helpers.loadedaslib
local getextraluapaths=package.extraluapaths
@@ -16324,7 +17297,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tmf"] = package.loaded["data-tmf"] or true
--- original size: 2600, stripped down to: 1627
+-- original size: 2601, stripped down to: 1627
if not modules then modules={} end modules ['data-tmf']={
version=1.001,
@@ -16380,7 +17353,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-lst"] = package.loaded["data-lst"] or true
--- original size: 2654, stripped down to: 2301
+-- original size: 2734, stripped down to: 2354
if not modules then modules={} end modules ['data-lst']={
version=1.001,
@@ -16389,10 +17362,13 @@ if not modules then modules={} end modules ['data-lst']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local find,concat,upper,format=string.find,table.concat,string.upper,string.format
+local rawget,type,next=rawget,type,next
+local find,concat,upper=string.find,table.concat,string.upper
local fastcopy,sortedpairs=table.fastcopy,table.sortedpairs
-resolvers.listers=resolvers.listers or {}
local resolvers=resolvers
+local listers=resolvers.listers or {}
+resolvers.listers=listers
+local resolveprefix=resolvers.resolve
local report_lists=logs.reporter("resolvers","lists")
local function tabstr(str)
if type(str)=='table' then
@@ -16401,7 +17377,7 @@ local function tabstr(str)
return str
end
end
-function resolvers.listers.variables(pattern)
+function listers.variables(pattern)
local instance=resolvers.instance
local environment=instance.environment
local variables=instance.variables
@@ -16422,10 +17398,10 @@ function resolvers.listers.variables(pattern)
for key,value in sortedpairs(configured) do
if key~="" and (pattern=="" or find(upper(key),pattern)) then
report_lists(key)
- report_lists(" env: %s",tabstr(rawget(environment,key)) or "unset")
- report_lists(" var: %s",tabstr(configured[key]) or "unset")
- report_lists(" exp: %s",tabstr(expansions[key]) or "unset")
- report_lists(" res: %s",tabstr(resolvers.resolve(expansions[key])) or "unset")
+ report_lists(" env: %s",tabstr(rawget(environment,key)) or "unset")
+ report_lists(" var: %s",tabstr(configured[key]) or "unset")
+ report_lists(" exp: %s",tabstr(expansions[key]) or "unset")
+ report_lists(" res: %s",tabstr(resolveprefix(expansions[key])) or "unset")
end
end
instance.environment=fastcopy(env)
@@ -16433,15 +17409,15 @@ function resolvers.listers.variables(pattern)
instance.expansions=fastcopy(exp)
end
local report_resolved=logs.reporter("system","resolved")
-function resolvers.listers.configurations()
+function listers.configurations()
local configurations=resolvers.instance.specification
for i=1,#configurations do
- report_resolved("file : %s",resolvers.resolve(configurations[i]))
+ report_resolved("file : %s",resolveprefix(configurations[i]))
end
report_resolved("")
local list=resolvers.expandedpathfromlist(resolvers.splitpath(resolvers.luacnfspec))
for i=1,#list do
- local li=resolvers.resolve(list[i])
+ local li=resolveprefix(list[i])
if lfs.isdir(li) then
report_resolved("path - %s",li)
else
@@ -16746,7 +17722,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["luat-fmt"] = package.loaded["luat-fmt"] or true
--- original size: 5951, stripped down to: 4922
+-- original size: 5955, stripped down to: 4926
if not modules then modules={} end modules ['luat-fmt']={
version=1.001,
@@ -16834,7 +17810,7 @@ function environment.make_format(name)
end
local command=format("%s --ini %s --lua=%s %s %sdump",engine,primaryflags(),quoted(usedluastub),quoted(fulltexsourcename),os.platform=="unix" and "\\\\" or "\\")
report_format("running command: %s\n",command)
- os.spawn(command)
+ os.execute(command)
local pattern=file.removesuffix(file.basename(usedluastub)).."-*.mem"
local mp=dir.glob(pattern)
if mp then
@@ -16869,7 +17845,7 @@ function environment.run_format(name,data,more)
else
local command=format("%s %s --fmt=%s --lua=%s %s %s",engine,primaryflags(),quoted(barename),quoted(luaname),quoted(data),more~="" and quoted(more) or "")
report_format("running command: %s",command)
- os.spawn(command)
+ os.execute(command)
end
end
end
@@ -16880,8 +17856,8 @@ end -- of closure
-- used libraries : l-lua.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-mrg.lua util-tpl.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.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-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
-- skipped libraries : -
--- original bytes : 695180
--- stripped bytes : 246794
+-- original bytes : 739251
+-- stripped bytes : 264497
-- end library merge
@@ -17107,6 +18083,7 @@ local helpinfo = [[
<category name="basic">
<subcategory>
<flag name="script"><short>run an mtx script (lua prefered method) (<ref name="noquotes"/>), no script gives list</short></flag>
+ <flag name="evaluate"><short>run code passed on the commandline (between quotes)</short></flag>
<flag name="execute"><short>run a script or program (texmfstart method) (<ref name="noquotes"/>)</short></flag>
<flag name="resolve"><short>resolve prefixed arguments</short></flag>
<flag name="ctxlua"><short>run internally (using preloaded libs)</short></flag>
@@ -17132,6 +18109,7 @@ local helpinfo = [[
<flag name="verbose"><short>give a bit more info</short></flag>
<flag name="trackers" value="list"><short>enable given trackers</short></flag>
<flag name="progname" value="str"><short>format or backend</short></flag>
+ <flag name="systeminfo" value="str"><short>show current operating system, processor, etc</short></flag>
</subcategory>
<subcategory>
<flag name="edit"><short>launch editor with found file</short></flag>
@@ -17761,6 +18739,39 @@ function runners.associate(filename)
os.launch(filename)
end
+function runners.evaluate(code,filename) -- for Luigi
+ if code == "loop" then
+ while true do
+ io.write("> ")
+ local code = io.read()
+ if code ~= "" then
+ local temp = string.match(code,"^= (.*)$")
+ if temp then
+ code = "print("..temp..")"
+ end
+ local compiled, message = loadstring(code)
+ if type(compiled) ~= "function" then
+ io.write("! " .. (message or code).."\n")
+ else
+ io.write(compiled())
+ end
+ end
+ end
+ else
+ if type(code) ~= "string" or code == "" then
+ code = filename
+ end
+ if code ~= "" then
+ local compiled, message = loadstring(code)
+ if type(compiled) ~= "function" then
+ io.write("invalid lua code: " .. (message or code))
+ return
+ end
+ io.write(compiled())
+ end
+ end
+end
+
function runners.gethelp(filename)
local url = environment.argument("url")
if url and url ~= "" then
@@ -17772,6 +18783,15 @@ function runners.gethelp(filename)
end
end
+function runners.systeminfo()
+ report("architecture : %s",os.platform or "<unset>")
+ report("operating system : %s",os.name or "<unset>")
+ report("file architecture : %s",os.type or "<unset>")
+ report("binary path : %s",os.selfdir or "<unset>")
+ report("binary suffix : %s",os.binsuffix or "<unset>")
+ report("library suffix : %s",os.libsuffix or "<unset>")
+end
+
-- this is a bit dirty ... first we store the first filename and next we
-- split the arguments so that we only see the ones meant for this script
-- ... later we will use the second half
@@ -17887,16 +18907,7 @@ end
if e_argument("ansi") then
- local formatters = string.formatters
-
- logs.setformatters {
- report_yes = formatters["%-15s | %s"],
- report_nop = formatters["%-15s |"],
- subreport_yes = formatters["%-15s | %s | %s"],
- subreport_nop = formatters["%-15s | %s |"],
- status_yes = formatters["%-15s : %s\n"],
- status_nop = formatters["%-15s :\n"],
- }
+ logs.setformatters("ansi")
local script = e_argument("script") or e_argument("scripts")
@@ -17921,6 +18932,10 @@ if e_argument("script") or e_argument("scripts") then
ok = runners.execute_ctx_script(filename)
end
+elseif e_argument("evaluate") then
+
+ runners.evaluate(e_argument("evaluate"),filename)
+
elseif e_argument("selfmerge") then
-- embed used libraries
@@ -18213,6 +19228,10 @@ elseif e_argument("exporthelp") then
runners.loadbase()
application.export(e_argument("exporthelp"),filename)
+elseif e_argument("systeminfo") then
+
+ runners.systeminfo()
+
elseif e_argument("help") or filename=='help' or filename == "" then
application.help()
diff --git a/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-context.lua b/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-context.lua
index aeee8590f67..0dc4c4af000 100644
--- a/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-context.lua
+++ b/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-context.lua
@@ -1,4 +1,4 @@
return {
- ["constants"]={ "zerocount", "minusone", "minustwo", "plusone", "plustwo", "plusthree", "plusfour", "plusfive", "plussix", "plusseven", "pluseight", "plusnine", "plusten", "plussixteen", "plushundred", "plusthousand", "plustenthousand", "plustwentythousand", "medcard", "maxcard", "zeropoint", "onepoint", "halfapoint", "onebasepoint", "maxdimen", "scaledpoint", "thousandpoint", "points", "halfpoint", "zeroskip", "zeromuskip", "onemuskip", "pluscxxvii", "pluscxxviii", "pluscclv", "pluscclvi", "normalpagebox", "endoflinetoken", "outputnewlinechar", "emptytoks", "empty", "undefined", "voidbox", "emptybox", "emptyvbox", "emptyhbox", "bigskipamount", "medskipamount", "smallskipamount", "fmtname", "fmtversion", "texengine", "texenginename", "texengineversion", "luatexengine", "pdftexengine", "xetexengine", "unknownengine", "etexversion", "pdftexversion", "xetexversion", "xetexrevision", "activecatcode", "bgroup", "egroup", "endline", "conditionaltrue", "conditionalfalse", "attributeunsetvalue", "uprotationangle", "rightrotationangle", "downrotationangle", "leftrotationangle", "inicatcodes", "ctxcatcodes", "texcatcodes", "notcatcodes", "txtcatcodes", "vrbcatcodes", "prtcatcodes", "nilcatcodes", "luacatcodes", "tpacatcodes", "tpbcatcodes", "xmlcatcodes", "ctdcatcodes", "escapecatcode", "begingroupcatcode", "endgroupcatcode", "mathshiftcatcode", "alignmentcatcode", "endoflinecatcode", "parametercatcode", "superscriptcatcode", "subscriptcatcode", "ignorecatcode", "spacecatcode", "lettercatcode", "othercatcode", "activecatcode", "commentcatcode", "invalidcatcode", "tabasciicode", "newlineasciicode", "formfeedasciicode", "endoflineasciicode", "endoffileasciicode", "spaceasciicode", "hashasciicode", "dollarasciicode", "commentasciicode", "ampersandasciicode", "colonasciicode", "backslashasciicode", "circumflexasciicode", "underscoreasciicode", "leftbraceasciicode", "barasciicode", "rightbraceasciicode", "tildeasciicode", "delasciicode", "lessthanasciicode", "morethanasciicode", "doublecommentsignal", "atsignasciicode", "exclamationmarkasciicode", "questionmarkasciicode", "doublequoteasciicode", "singlequoteasciicode", "forwardslashasciicode", "primeasciicode", "activemathcharcode", "activetabtoken", "activeformfeedtoken", "activeendoflinetoken", "batchmodecode", "nonstopmodecode", "scrollmodecode", "errorstopmodecode", "bottomlevelgroupcode", "simplegroupcode", "hboxgroupcode", "adjustedhboxgroupcode", "vboxgroupcode", "vtopgroupcode", "aligngroupcode", "noaligngroupcode", "outputgroupcode", "mathgroupcode", "discretionarygroupcode", "insertgroupcode", "vcentergroupcode", "mathchoicegroupcode", "semisimplegroupcode", "mathshiftgroupcode", "mathleftgroupcode", "vadjustgroupcode", "charnodecode", "hlistnodecode", "vlistnodecode", "rulenodecode", "insertnodecode", "marknodecode", "adjustnodecode", "ligaturenodecode", "discretionarynodecode", "whatsitnodecode", "mathnodecode", "gluenodecode", "kernnodecode", "penaltynodecode", "unsetnodecode", "mathsnodecode", "charifcode", "catifcode", "numifcode", "dimifcode", "oddifcode", "vmodeifcode", "hmodeifcode", "mmodeifcode", "innerifcode", "voidifcode", "hboxifcode", "vboxifcode", "xifcode", "eofifcode", "trueifcode", "falseifcode", "caseifcode", "definedifcode", "csnameifcode", "fontcharifcode", "fontslantperpoint", "fontinterwordspace", "fontinterwordstretch", "fontinterwordshrink", "fontexheight", "fontemwidth", "fontextraspace", "slantperpoint", "interwordspace", "interwordstretch", "interwordshrink", "exheight", "emwidth", "extraspace", "mathsupdisplay", "mathsupnormal", "mathsupcramped", "mathsubnormal", "mathsubcombined", "mathaxisheight", "startmode", "stopmode", "startnotmode", "stopnotmode", "startmodeset", "stopmodeset", "doifmode", "doifmodeelse", "doifnotmode", "startmodeset", "stopmodeset", "startallmodes", "stopallmodes", "startnotallmodes", "stopnotallmodes", "doifallmodes", "doifallmodeselse", "doifnotallmodes", "startenvironment", "stopenvironment", "environment", "startcomponent", "stopcomponent", "component", "startproduct", "stopproduct", "product", "startproject", "stopproject", "project", "starttext", "stoptext", "startnotext", "stopnotext", "startdocument", "stopdocument", "documentvariable", "setupdocument", "startmodule", "stopmodule", "usemodule", "usetexmodule", "useluamodule", "setupmodule", "currentmoduleparameter", "moduleparameter", "everystarttext", "startTEXpage", "stopTEXpage", "enablemode", "disablemode", "preventmode", "globalenablemode", "globaldisablemode", "globalpreventmode", "pushmode", "popmode", "typescriptone", "typescripttwo", "typescriptthree", "mathsizesuffix", "mathordcode", "mathopcode", "mathbincode", "mathrelcode", "mathopencode", "mathclosecode", "mathpunctcode", "mathalphacode", "mathinnercode", "mathnothingcode", "mathlimopcode", "mathnolopcode", "mathboxcode", "mathchoicecode", "mathaccentcode", "mathradicalcode", "constantnumber", "constantnumberargument", "constantdimen", "constantdimenargument", "constantemptyargument", "continueifinputfile", "luastringsep", "!!bs", "!!es", "lefttorightmark", "righttoleftmark", "breakablethinspace", "nobreakspace", "narrownobreakspace", "zerowidthnobreakspace", "ideographicspace", "ideographichalffillspace", "twoperemspace", "threeperemspace", "fourperemspace", "fiveperemspace", "sixperemspace", "figurespace", "punctuationspace", "hairspace", "zerowidthspace", "zerowidthnonjoiner", "zerowidthjoiner", "zwnj", "zwj", "optionalspace" },
- ["helpers"]={ "startsetups", "stopsetups", "startxmlsetups", "stopxmlsetups", "startluasetups", "stopluasetups", "starttexsetups", "stoptexsetups", "startrawsetups", "stoprawsetups", "startlocalsetups", "stoplocalsetups", "starttexdefinition", "stoptexdefinition", "starttexcode", "stoptexcode", "startcontextcode", "stopcontextcode", "startcontextdefinitioncode", "stopcontextdefinitioncode", "doifsetupselse", "doifsetups", "doifnotsetups", "setup", "setups", "texsetup", "xmlsetup", "luasetup", "directsetup", "doifelsecommandhandler", "doifnotcommandhandler", "doifcommandhandler", "newmode", "setmode", "resetmode", "newsystemmode", "setsystemmode", "resetsystemmode", "pushsystemmode", "popsystemmode", "booleanmodevalue", "newcount", "newdimen", "newskip", "newmuskip", "newbox", "newtoks", "newread", "newwrite", "newmarks", "newinsert", "newattribute", "newif", "newlanguage", "newfamily", "newfam", "newhelp", "then", "begcsname", "strippedcsname", "firstargumentfalse", "firstargumenttrue", "secondargumentfalse", "secondargumenttrue", "thirdargumentfalse", "thirdargumenttrue", "fourthargumentfalse", "fourthargumenttrue", "fifthargumentfalse", "fifthsargumenttrue", "sixthargumentfalse", "sixtsargumenttrue", "doglobal", "dodoglobal", "redoglobal", "resetglobal", "donothing", "dontcomplain", "forgetall", "donetrue", "donefalse", "htdp", "unvoidbox", "hfilll", "vfilll", "mathbox", "mathlimop", "mathnolop", "mathnothing", "mathalpha", "currentcatcodetable", "defaultcatcodetable", "catcodetablename", "newcatcodetable", "startcatcodetable", "stopcatcodetable", "startextendcatcodetable", "stopextendcatcodetable", "pushcatcodetable", "popcatcodetable", "restorecatcodes", "setcatcodetable", "letcatcodecommand", "defcatcodecommand", "uedcatcodecommand", "hglue", "vglue", "hfillneg", "vfillneg", "hfilllneg", "vfilllneg", "ruledhss", "ruledhfil", "ruledhfill", "ruledhfilneg", "ruledhfillneg", "normalhfillneg", "ruledvss", "ruledvfil", "ruledvfill", "ruledvfilneg", "ruledvfillneg", "normalvfillneg", "ruledhbox", "ruledvbox", "ruledvtop", "ruledvcenter", "ruledmbox", "ruledhskip", "ruledvskip", "ruledkern", "ruledmskip", "ruledmkern", "ruledhglue", "ruledvglue", "normalhglue", "normalvglue", "ruledpenalty", "filledhboxb", "filledhboxr", "filledhboxg", "filledhboxc", "filledhboxm", "filledhboxy", "filledhboxk", "scratchcounter", "globalscratchcounter", "scratchdimen", "globalscratchdimen", "scratchskip", "globalscratchskip", "scratchmuskip", "globalscratchmuskip", "scratchtoks", "globalscratchtoks", "scratchbox", "globalscratchbox", "normalbaselineskip", "normallineskip", "normallineskiplimit", "availablehsize", "localhsize", "setlocalhsize", "nextbox", "dowithnextbox", "dowithnextboxcs", "dowithnextboxcontent", "dowithnextboxcontentcs", "scratchwidth", "scratchheight", "scratchdepth", "scratchoffset", "scratchdistance", "scratchhsize", "scratchvsize", "scratchxoffset", "scratchyoffset", "scratchhoffset", "scratchvoffset", "scratchxposition", "scratchyposition", "scratchtopoffset", "scratchbottomoffset", "scratchleftoffset", "scratchrightoffset", "scratchcounterone", "scratchcountertwo", "scratchcounterthree", "scratchdimenone", "scratchdimentwo", "scratchdimenthree", "scratchskipone", "scratchskiptwo", "scratchskipthree", "scratchmuskipone", "scratchmuskiptwo", "scratchmuskipthree", "scratchtoksone", "scratchtokstwo", "scratchtoksthree", "scratchboxone", "scratchboxtwo", "scratchboxthree", "scratchnx", "scratchny", "scratchmx", "scratchmy", "scratchunicode", "scratchleftskip", "scratchrightskip", "scratchtopskip", "scratchbottomskip", "doif", "doifnot", "doifelse", "doifinset", "doifnotinset", "doifinsetelse", "doifnextcharelse", "doifnextoptionalelse", "doifnextoptionalcselse", "doiffastoptionalcheckelse", "doifnextbgroupelse", "doifnextbgroupcselse", "doifnextparenthesiselse", "doifundefinedelse", "doifdefinedelse", "doifundefined", "doifdefined", "doifelsevalue", "doifvalue", "doifnotvalue", "doifnothing", "doifsomething", "doifelsenothing", "doifsomethingelse", "doifvaluenothing", "doifvaluesomething", "doifelsevaluenothing", "doifdimensionelse", "doifnumberelse", "doifnumber", "doifnotnumber", "doifcommonelse", "doifcommon", "doifnotcommon", "doifinstring", "doifnotinstring", "doifinstringelse", "doifassignmentelse", "docheckassignment", "tracingall", "tracingnone", "loggingall", "removetoks", "appendtoks", "prependtoks", "appendtotoks", "prependtotoks", "to", "endgraf", "endpar", "everyendpar", "reseteverypar", "finishpar", "empty", "null", "space", "quad", "enspace", "obeyspaces", "obeylines", "obeyedspace", "obeyedline", "normalspace", "executeifdefined", "singleexpandafter", "doubleexpandafter", "tripleexpandafter", "dontleavehmode", "removelastspace", "removeunwantedspaces", "keepunwantedspaces", "wait", "writestatus", "define", "defineexpandable", "redefine", "setmeasure", "setemeasure", "setgmeasure", "setxmeasure", "definemeasure", "freezemeasure", "measure", "measured", "installcorenamespace", "getvalue", "getuvalue", "setvalue", "setevalue", "setgvalue", "setxvalue", "letvalue", "letgvalue", "resetvalue", "undefinevalue", "ignorevalue", "setuvalue", "setuevalue", "setugvalue", "setuxvalue", "globallet", "glet", "udef", "ugdef", "uedef", "uxdef", "checked", "unique", "getparameters", "geteparameters", "getgparameters", "getxparameters", "forgetparameters", "copyparameters", "getdummyparameters", "dummyparameter", "directdummyparameter", "setdummyparameter", "letdummyparameter", "usedummystyleandcolor", "usedummystyleparameter", "usedummycolorparameter", "processcommalist", "processcommacommand", "quitcommalist", "quitprevcommalist", "processaction", "processallactions", "processfirstactioninset", "processallactionsinset", "unexpanded", "expanded", "startexpanded", "stopexpanded", "protected", "protect", "unprotect", "firstofoneargument", "firstoftwoarguments", "secondoftwoarguments", "firstofthreearguments", "secondofthreearguments", "thirdofthreearguments", "firstoffourarguments", "secondoffourarguments", "thirdoffourarguments", "fourthoffourarguments", "firstoffivearguments", "secondoffivearguments", "thirdoffivearguments", "fourthoffivearguments", "fifthoffivearguments", "firstofsixarguments", "secondofsixarguments", "thirdofsixarguments", "fourthofsixarguments", "fifthofsixarguments", "sixthofsixarguments", "firstofoneunexpanded", "gobbleoneargument", "gobbletwoarguments", "gobblethreearguments", "gobblefourarguments", "gobblefivearguments", "gobblesixarguments", "gobblesevenarguments", "gobbleeightarguments", "gobbleninearguments", "gobbletenarguments", "gobbleoneoptional", "gobbletwooptionals", "gobblethreeoptionals", "gobblefouroptionals", "gobblefiveoptionals", "dorecurse", "doloop", "exitloop", "dostepwiserecurse", "recurselevel", "recursedepth", "dofastloopcs", "dowith", "newconstant", "setnewconstant", "setconstant", "setconstantvalue", "newconditional", "settrue", "setfalse", "settruevalue", "setfalsevalue", "newmacro", "setnewmacro", "newfraction", "newsignal", "dosingleempty", "dodoubleempty", "dotripleempty", "doquadrupleempty", "doquintupleempty", "dosixtupleempty", "doseventupleempty", "dosingleargument", "dodoubleargument", "dotripleargument", "doquadrupleargument", "doquintupleargument", "dosixtupleargument", "doseventupleargument", "dosinglegroupempty", "dodoublegroupempty", "dotriplegroupempty", "doquadruplegroupempty", "doquintuplegroupempty", "permitspacesbetweengroups", "dontpermitspacesbetweengroups", "nopdfcompression", "maximumpdfcompression", "normalpdfcompression", "modulonumber", "dividenumber", "getfirstcharacter", "doiffirstcharelse", "startnointerference", "stopnointerference", "twodigits", "threedigits", "leftorright", "offinterlineskip", "oninterlineskip", "nointerlineskip", "strut", "setstrut", "strutbox", "strutht", "strutdp", "strutwd", "struthtdp", "begstrut", "endstrut", "lineheight", "ordordspacing", "ordopspacing", "ordbinspacing", "ordrelspacing", "ordopenspacing", "ordclosespacing", "ordpunctspacing", "ordinnerspacing", "opordspacing", "opopspacing", "opbinspacing", "oprelspacing", "opopenspacing", "opclosespacing", "oppunctspacing", "opinnerspacing", "binordspacing", "binopspacing", "binbinspacing", "binrelspacing", "binopenspacing", "binclosespacing", "binpunctspacing", "bininnerspacing", "relordspacing", "relopspacing", "relbinspacing", "relrelspacing", "relopenspacing", "relclosespacing", "relpunctspacing", "relinnerspacing", "openordspacing", "openopspacing", "openbinspacing", "openrelspacing", "openopenspacing", "openclosespacing", "openpunctspacing", "openinnerspacing", "closeordspacing", "closeopspacing", "closebinspacing", "closerelspacing", "closeopenspacing", "closeclosespacing", "closepunctspacing", "closeinnerspacing", "punctordspacing", "punctopspacing", "punctbinspacing", "punctrelspacing", "punctopenspacing", "punctclosespacing", "punctpunctspacing", "punctinnerspacing", "innerordspacing", "inneropspacing", "innerbinspacing", "innerrelspacing", "inneropenspacing", "innerclosespacing", "innerpunctspacing", "innerinnerspacing", "normalreqno", "startimath", "stopimath", "normalstartimath", "normalstopimath", "startdmath", "stopdmath", "normalstartdmath", "normalstopdmath", "uncramped", "cramped", "triggermathstyle", "mathstylefont", "mathsmallstylefont", "mathstyleface", "mathsmallstyleface", "mathstylecommand", "mathpalette", "mathstylehbox", "mathstylevbox", "mathstylevcenter", "mathstylevcenteredhbox", "mathstylevcenteredvbox", "mathtext", "setmathsmalltextbox", "setmathtextbox", "triggerdisplaystyle", "triggertextstyle", "triggerscriptstyle", "triggerscriptscriptstyle", "triggeruncrampedstyle", "triggercrampedstyle", "triggersmallstyle", "triggeruncrampedsmallstyle", "triggercrampedsmallstyle", "triggerbigstyle", "triggeruncrampedbigstyle", "triggercrampedbigstyle", "luaexpr", "expdoifelse", "expdoif", "expdoifnot", "expdoifcommonelse", "expdoifinsetelse", "ctxdirectlua", "ctxlatelua", "ctxsprint", "ctxwrite", "ctxcommand", "ctxdirectcommand", "ctxlatecommand", "ctxreport", "ctxlua", "luacode", "lateluacode", "directluacode", "registerctxluafile", "ctxloadluafile", "luaversion", "luamajorversion", "luaminorversion", "ctxluacode", "luaconditional", "luaexpanded", "startluaparameterset", "stopluaparameterset", "luaparameterset", "definenamedlua", "obeylualines", "obeyluatokens", "startluacode", "stopluacode", "startlua", "stoplua", "startctxfunction", "stopctxfunction", "ctxfunction", "startctxfunctiondefinition", "stopctxfunctiondefinition", "carryoverpar", "assumelongusagecs", "Umathbotaccent", "righttolefthbox", "lefttorighthbox", "righttoleftvbox", "lefttorightvbox", "righttoleftvtop", "lefttorightvtop", "rtlhbox", "ltrhbox", "rtlvbox", "ltrvbox", "rtlvtop", "ltrvtop", "autodirhbox", "autodirvbox", "autodirvtop", "lefttoright", "righttoleft", "synchronizelayoutdirection", "synchronizedisplaydirection", "synchronizeinlinedirection", "lesshyphens", "morehyphens", "nohyphens", "dohyphens", "Ucheckedstartdisplaymath", "Ucheckedstopdisplaymath" },
+ ["constants"]={ "zerocount", "minusone", "minustwo", "plusone", "plustwo", "plusthree", "plusfour", "plusfive", "plussix", "plusseven", "pluseight", "plusnine", "plusten", "plussixteen", "plushundred", "plusthousand", "plustenthousand", "plustwentythousand", "medcard", "maxcard", "maxcardminusone", "zeropoint", "onepoint", "halfapoint", "onebasepoint", "maxdimen", "scaledpoint", "thousandpoint", "points", "halfpoint", "zeroskip", "zeromuskip", "onemuskip", "pluscxxvii", "pluscxxviii", "pluscclv", "pluscclvi", "normalpagebox", "endoflinetoken", "outputnewlinechar", "emptytoks", "empty", "undefined", "voidbox", "emptybox", "emptyvbox", "emptyhbox", "bigskipamount", "medskipamount", "smallskipamount", "fmtname", "fmtversion", "texengine", "texenginename", "texengineversion", "luatexengine", "pdftexengine", "xetexengine", "unknownengine", "activecatcode", "bgroup", "egroup", "endline", "conditionaltrue", "conditionalfalse", "attributeunsetvalue", "uprotationangle", "rightrotationangle", "downrotationangle", "leftrotationangle", "inicatcodes", "ctxcatcodes", "texcatcodes", "notcatcodes", "txtcatcodes", "vrbcatcodes", "prtcatcodes", "nilcatcodes", "luacatcodes", "tpacatcodes", "tpbcatcodes", "xmlcatcodes", "ctdcatcodes", "escapecatcode", "begingroupcatcode", "endgroupcatcode", "mathshiftcatcode", "alignmentcatcode", "endoflinecatcode", "parametercatcode", "superscriptcatcode", "subscriptcatcode", "ignorecatcode", "spacecatcode", "lettercatcode", "othercatcode", "activecatcode", "commentcatcode", "invalidcatcode", "tabasciicode", "newlineasciicode", "formfeedasciicode", "endoflineasciicode", "endoffileasciicode", "spaceasciicode", "hashasciicode", "dollarasciicode", "commentasciicode", "ampersandasciicode", "colonasciicode", "backslashasciicode", "circumflexasciicode", "underscoreasciicode", "leftbraceasciicode", "barasciicode", "rightbraceasciicode", "tildeasciicode", "delasciicode", "lessthanasciicode", "morethanasciicode", "doublecommentsignal", "atsignasciicode", "exclamationmarkasciicode", "questionmarkasciicode", "doublequoteasciicode", "singlequoteasciicode", "forwardslashasciicode", "primeasciicode", "hyphenasciicode", "activemathcharcode", "activetabtoken", "activeformfeedtoken", "activeendoflinetoken", "batchmodecode", "nonstopmodecode", "scrollmodecode", "errorstopmodecode", "bottomlevelgroupcode", "simplegroupcode", "hboxgroupcode", "adjustedhboxgroupcode", "vboxgroupcode", "vtopgroupcode", "aligngroupcode", "noaligngroupcode", "outputgroupcode", "mathgroupcode", "discretionarygroupcode", "insertgroupcode", "vcentergroupcode", "mathchoicegroupcode", "semisimplegroupcode", "mathshiftgroupcode", "mathleftgroupcode", "vadjustgroupcode", "charnodecode", "hlistnodecode", "vlistnodecode", "rulenodecode", "insertnodecode", "marknodecode", "adjustnodecode", "ligaturenodecode", "discretionarynodecode", "whatsitnodecode", "mathnodecode", "gluenodecode", "kernnodecode", "penaltynodecode", "unsetnodecode", "mathsnodecode", "charifcode", "catifcode", "numifcode", "dimifcode", "oddifcode", "vmodeifcode", "hmodeifcode", "mmodeifcode", "innerifcode", "voidifcode", "hboxifcode", "vboxifcode", "xifcode", "eofifcode", "trueifcode", "falseifcode", "caseifcode", "definedifcode", "csnameifcode", "fontcharifcode", "fontslantperpoint", "fontinterwordspace", "fontinterwordstretch", "fontinterwordshrink", "fontexheight", "fontemwidth", "fontextraspace", "slantperpoint", "interwordspace", "interwordstretch", "interwordshrink", "exheight", "emwidth", "extraspace", "mathsupdisplay", "mathsupnormal", "mathsupcramped", "mathsubnormal", "mathsubcombined", "mathaxisheight", "muquad", "startmode", "stopmode", "startnotmode", "stopnotmode", "startmodeset", "stopmodeset", "doifmode", "doifelsemode", "doifmodeelse", "doifnotmode", "startmodeset", "stopmodeset", "startallmodes", "stopallmodes", "startnotallmodes", "stopnotallmodes", "doifallmodes", "doifelseallmodes", "doifallmodeselse", "doifnotallmodes", "startenvironment", "stopenvironment", "environment", "startcomponent", "stopcomponent", "component", "startproduct", "stopproduct", "product", "startproject", "stopproject", "project", "starttext", "stoptext", "startnotext", "stopnotext", "startdocument", "stopdocument", "documentvariable", "setupdocument", "startmodule", "stopmodule", "usemodule", "usetexmodule", "useluamodule", "setupmodule", "currentmoduleparameter", "moduleparameter", "everystarttext", "startTEXpage", "stopTEXpage", "enablemode", "disablemode", "preventmode", "definemode", "globalenablemode", "globaldisablemode", "globalpreventmode", "pushmode", "popmode", "typescriptone", "typescripttwo", "typescriptthree", "mathsizesuffix", "mathordcode", "mathopcode", "mathbincode", "mathrelcode", "mathopencode", "mathclosecode", "mathpunctcode", "mathalphacode", "mathinnercode", "mathnothingcode", "mathlimopcode", "mathnolopcode", "mathboxcode", "mathchoicecode", "mathaccentcode", "mathradicalcode", "constantnumber", "constantnumberargument", "constantdimen", "constantdimenargument", "constantemptyargument", "continueifinputfile", "luastringsep", "!!bs", "!!es", "lefttorightmark", "righttoleftmark", "breakablethinspace", "nobreakspace", "nonbreakablespace", "narrownobreakspace", "zerowidthnobreakspace", "ideographicspace", "ideographichalffillspace", "twoperemspace", "threeperemspace", "fourperemspace", "fiveperemspace", "sixperemspace", "figurespace", "punctuationspace", "hairspace", "zerowidthspace", "zerowidthnonjoiner", "zerowidthjoiner", "zwnj", "zwj", "optionalspace", "asciispacechar" },
+ ["helpers"]={ "startsetups", "stopsetups", "startxmlsetups", "stopxmlsetups", "startluasetups", "stopluasetups", "starttexsetups", "stoptexsetups", "startrawsetups", "stoprawsetups", "startlocalsetups", "stoplocalsetups", "starttexdefinition", "stoptexdefinition", "starttexcode", "stoptexcode", "startcontextcode", "stopcontextcode", "startcontextdefinitioncode", "stopcontextdefinitioncode", "texdefinition", "doifelsesetups", "doifsetupselse", "doifsetups", "doifnotsetups", "setup", "setups", "texsetup", "xmlsetup", "luasetup", "directsetup", "fastsetup", "doifelsecommandhandler", "doifcommandhandlerelse", "doifnotcommandhandler", "doifcommandhandler", "newmode", "setmode", "resetmode", "newsystemmode", "setsystemmode", "resetsystemmode", "pushsystemmode", "popsystemmode", "booleanmodevalue", "newcount", "newdimen", "newskip", "newmuskip", "newbox", "newtoks", "newread", "newwrite", "newmarks", "newinsert", "newattribute", "newif", "newlanguage", "newfamily", "newfam", "newhelp", "then", "begcsname", "strippedcsname", "checkedstrippedcsname", "firstargumentfalse", "firstargumenttrue", "secondargumentfalse", "secondargumenttrue", "thirdargumentfalse", "thirdargumenttrue", "fourthargumentfalse", "fourthargumenttrue", "fifthargumentfalse", "fifthsargumenttrue", "sixthargumentfalse", "sixtsargumenttrue", "doglobal", "dodoglobal", "redoglobal", "resetglobal", "donothing", "dontcomplain", "forgetall", "donetrue", "donefalse", "inlineordisplaymath", "indisplaymath", "forcedisplaymath", "startforceddisplaymath", "stopforceddisplaymath", "reqno", "htdp", "unvoidbox", "hfilll", "vfilll", "mathbox", "mathlimop", "mathnolop", "mathnothing", "mathalpha", "currentcatcodetable", "defaultcatcodetable", "catcodetablename", "newcatcodetable", "startcatcodetable", "stopcatcodetable", "startextendcatcodetable", "stopextendcatcodetable", "pushcatcodetable", "popcatcodetable", "restorecatcodes", "setcatcodetable", "letcatcodecommand", "defcatcodecommand", "uedcatcodecommand", "hglue", "vglue", "hfillneg", "vfillneg", "hfilllneg", "vfilllneg", "ruledhss", "ruledhfil", "ruledhfill", "ruledhfilneg", "ruledhfillneg", "normalhfillneg", "ruledvss", "ruledvfil", "ruledvfill", "ruledvfilneg", "ruledvfillneg", "normalvfillneg", "ruledhbox", "ruledvbox", "ruledvtop", "ruledvcenter", "ruledmbox", "ruledhskip", "ruledvskip", "ruledkern", "ruledmskip", "ruledmkern", "ruledhglue", "ruledvglue", "normalhglue", "normalvglue", "ruledpenalty", "filledhboxb", "filledhboxr", "filledhboxg", "filledhboxc", "filledhboxm", "filledhboxy", "filledhboxk", "scratchcounter", "globalscratchcounter", "scratchdimen", "globalscratchdimen", "scratchskip", "globalscratchskip", "scratchmuskip", "globalscratchmuskip", "scratchtoks", "globalscratchtoks", "scratchbox", "globalscratchbox", "normalbaselineskip", "normallineskip", "normallineskiplimit", "availablehsize", "localhsize", "setlocalhsize", "distributedhsize", "hsizefraction", "nextbox", "dowithnextbox", "dowithnextboxcs", "dowithnextboxcontent", "dowithnextboxcontentcs", "scratchwidth", "scratchheight", "scratchdepth", "scratchoffset", "scratchdistance", "scratchhsize", "scratchvsize", "scratchxoffset", "scratchyoffset", "scratchhoffset", "scratchvoffset", "scratchxposition", "scratchyposition", "scratchtopoffset", "scratchbottomoffset", "scratchleftoffset", "scratchrightoffset", "scratchcounterone", "scratchcountertwo", "scratchcounterthree", "scratchdimenone", "scratchdimentwo", "scratchdimenthree", "scratchskipone", "scratchskiptwo", "scratchskipthree", "scratchmuskipone", "scratchmuskiptwo", "scratchmuskipthree", "scratchtoksone", "scratchtokstwo", "scratchtoksthree", "scratchboxone", "scratchboxtwo", "scratchboxthree", "scratchnx", "scratchny", "scratchmx", "scratchmy", "scratchunicode", "scratchleftskip", "scratchrightskip", "scratchtopskip", "scratchbottomskip", "doif", "doifnot", "doifelse", "doifinset", "doifnotinset", "doifelseinset", "doifinsetelse", "doifelsenextchar", "doifnextcharelse", "doifelsenextoptional", "doifnextoptionalelse", "doifelsenextoptionalcs", "doifnextoptionalcselse", "doifelsefastoptionalcheck", "doiffastoptionalcheckelse", "doifelsenextbgroup", "doifnextbgroupelse", "doifelsenextbgroupcs", "doifnextbgroupcselse", "doifelsenextparenthesis", "doifnextparenthesiselse", "doifelseundefined", "doifundefinedelse", "doifelsedefined", "doifdefinedelse", "doifundefined", "doifdefined", "doifelsevalue", "doifvalue", "doifnotvalue", "doifnothing", "doifsomething", "doifelsenothing", "doifnothingelse", "doifelsesomething", "doifsomethingelse", "doifvaluenothing", "doifvaluesomething", "doifelsevaluenothing", "doifvaluenothingelse", "doifelsedimension", "doifdimensionelse", "doifelsenumber", "doifnumberelse", "doifnumber", "doifnotnumber", "doifelsecommon", "doifcommonelse", "doifcommon", "doifnotcommon", "doifinstring", "doifnotinstring", "doifelseinstring", "doifinstringelse", "doifelseassignment", "doifassignmentelse", "docheckassignment", "tracingall", "tracingnone", "loggingall", "removetoks", "appendtoks", "prependtoks", "appendtotoks", "prependtotoks", "to", "endgraf", "endpar", "everyendpar", "reseteverypar", "finishpar", "empty", "null", "space", "quad", "enspace", "nbsp", "obeyspaces", "obeylines", "obeyedspace", "obeyedline", "obeyedtab", "obeyedpage", "normalspace", "executeifdefined", "singleexpandafter", "doubleexpandafter", "tripleexpandafter", "dontleavehmode", "removelastspace", "removeunwantedspaces", "keepunwantedspaces", "wait", "writestatus", "define", "defineexpandable", "redefine", "setmeasure", "setemeasure", "setgmeasure", "setxmeasure", "definemeasure", "freezemeasure", "measure", "measured", "installcorenamespace", "getvalue", "getuvalue", "setvalue", "setevalue", "setgvalue", "setxvalue", "letvalue", "letgvalue", "resetvalue", "undefinevalue", "ignorevalue", "setuvalue", "setuevalue", "setugvalue", "setuxvalue", "globallet", "glet", "udef", "ugdef", "uedef", "uxdef", "checked", "unique", "getparameters", "geteparameters", "getgparameters", "getxparameters", "forgetparameters", "copyparameters", "getdummyparameters", "dummyparameter", "directdummyparameter", "setdummyparameter", "letdummyparameter", "usedummystyleandcolor", "usedummystyleparameter", "usedummycolorparameter", "processcommalist", "processcommacommand", "quitcommalist", "quitprevcommalist", "processaction", "processallactions", "processfirstactioninset", "processallactionsinset", "unexpanded", "expanded", "startexpanded", "stopexpanded", "protected", "protect", "unprotect", "firstofoneargument", "firstoftwoarguments", "secondoftwoarguments", "firstofthreearguments", "secondofthreearguments", "thirdofthreearguments", "firstoffourarguments", "secondoffourarguments", "thirdoffourarguments", "fourthoffourarguments", "firstoffivearguments", "secondoffivearguments", "thirdoffivearguments", "fourthoffivearguments", "fifthoffivearguments", "firstofsixarguments", "secondofsixarguments", "thirdofsixarguments", "fourthofsixarguments", "fifthofsixarguments", "sixthofsixarguments", "firstofoneunexpanded", "firstoftwounexpanded", "secondoftwounexpanded", "firstofthreeunexpanded", "secondofthreeunexpanded", "thirdofthreeunexpanded", "gobbleoneargument", "gobbletwoarguments", "gobblethreearguments", "gobblefourarguments", "gobblefivearguments", "gobblesixarguments", "gobblesevenarguments", "gobbleeightarguments", "gobbleninearguments", "gobbletenarguments", "gobbleoneoptional", "gobbletwooptionals", "gobblethreeoptionals", "gobblefouroptionals", "gobblefiveoptionals", "dorecurse", "doloop", "exitloop", "dostepwiserecurse", "recurselevel", "recursedepth", "dofastloopcs", "dowith", "newconstant", "setnewconstant", "setconstant", "setconstantvalue", "newconditional", "settrue", "setfalse", "settruevalue", "setfalsevalue", "newmacro", "setnewmacro", "newfraction", "newsignal", "dosingleempty", "dodoubleempty", "dotripleempty", "doquadrupleempty", "doquintupleempty", "dosixtupleempty", "doseventupleempty", "dosingleargument", "dodoubleargument", "dotripleargument", "doquadrupleargument", "doquintupleargument", "dosixtupleargument", "doseventupleargument", "dosinglegroupempty", "dodoublegroupempty", "dotriplegroupempty", "doquadruplegroupempty", "doquintuplegroupempty", "permitspacesbetweengroups", "dontpermitspacesbetweengroups", "nopdfcompression", "maximumpdfcompression", "normalpdfcompression", "modulonumber", "dividenumber", "getfirstcharacter", "doifelsefirstchar", "doiffirstcharelse", "startnointerference", "stopnointerference", "twodigits", "threedigits", "leftorright", "offinterlineskip", "oninterlineskip", "nointerlineskip", "strut", "halfstrut", "quarterstrut", "depthstrut", "setstrut", "strutbox", "strutht", "strutdp", "strutwd", "struthtdp", "begstrut", "endstrut", "lineheight", "ordordspacing", "ordopspacing", "ordbinspacing", "ordrelspacing", "ordopenspacing", "ordclosespacing", "ordpunctspacing", "ordinnerspacing", "opordspacing", "opopspacing", "opbinspacing", "oprelspacing", "opopenspacing", "opclosespacing", "oppunctspacing", "opinnerspacing", "binordspacing", "binopspacing", "binbinspacing", "binrelspacing", "binopenspacing", "binclosespacing", "binpunctspacing", "bininnerspacing", "relordspacing", "relopspacing", "relbinspacing", "relrelspacing", "relopenspacing", "relclosespacing", "relpunctspacing", "relinnerspacing", "openordspacing", "openopspacing", "openbinspacing", "openrelspacing", "openopenspacing", "openclosespacing", "openpunctspacing", "openinnerspacing", "closeordspacing", "closeopspacing", "closebinspacing", "closerelspacing", "closeopenspacing", "closeclosespacing", "closepunctspacing", "closeinnerspacing", "punctordspacing", "punctopspacing", "punctbinspacing", "punctrelspacing", "punctopenspacing", "punctclosespacing", "punctpunctspacing", "punctinnerspacing", "innerordspacing", "inneropspacing", "innerbinspacing", "innerrelspacing", "inneropenspacing", "innerclosespacing", "innerpunctspacing", "innerinnerspacing", "normalreqno", "startimath", "stopimath", "normalstartimath", "normalstopimath", "startdmath", "stopdmath", "normalstartdmath", "normalstopdmath", "uncramped", "cramped", "triggermathstyle", "mathstylefont", "mathsmallstylefont", "mathstyleface", "mathsmallstyleface", "mathstylecommand", "mathpalette", "mathstylehbox", "mathstylevbox", "mathstylevcenter", "mathstylevcenteredhbox", "mathstylevcenteredvbox", "mathtext", "setmathsmalltextbox", "setmathtextbox", "pushmathstyle", "popmathstyle", "triggerdisplaystyle", "triggertextstyle", "triggerscriptstyle", "triggerscriptscriptstyle", "triggeruncrampedstyle", "triggercrampedstyle", "triggersmallstyle", "triggeruncrampedsmallstyle", "triggercrampedsmallstyle", "triggerbigstyle", "triggeruncrampedbigstyle", "triggercrampedbigstyle", "luaexpr", "expelsedoif", "expdoif", "expdoifnot", "expdoifelsecommon", "expdoifcommonelse", "expdoifelseinset", "expdoifinsetelse", "ctxdirectlua", "ctxlatelua", "ctxsprint", "ctxwrite", "ctxcommand", "ctxdirectcommand", "ctxlatecommand", "ctxreport", "ctxlua", "luacode", "lateluacode", "directluacode", "registerctxluafile", "ctxloadluafile", "luaversion", "luamajorversion", "luaminorversion", "ctxluacode", "luaconditional", "luaexpanded", "startluaparameterset", "stopluaparameterset", "luaparameterset", "definenamedlua", "obeylualines", "obeyluatokens", "startluacode", "stopluacode", "startlua", "stoplua", "startctxfunction", "stopctxfunction", "ctxfunction", "startctxfunctiondefinition", "stopctxfunctiondefinition", "installctxfunction", "carryoverpar", "assumelongusagecs", "Umathbotaccent", "righttolefthbox", "lefttorighthbox", "righttoleftvbox", "lefttorightvbox", "righttoleftvtop", "lefttorightvtop", "rtlhbox", "ltrhbox", "rtlvbox", "ltrvbox", "rtlvtop", "ltrvtop", "autodirhbox", "autodirvbox", "autodirvtop", "lefttoright", "righttoleft", "synchronizelayoutdirection", "synchronizedisplaydirection", "synchronizeinlinedirection", "lesshyphens", "morehyphens", "nohyphens", "dohyphens", "Ucheckedstartdisplaymath", "Ucheckedstopdisplaymath", "nobreak", "allowbreak", "goodbreak" },
} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-interfaces.lua b/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-interfaces.lua
index b2c09b62a82..43994afaae4 100644
--- a/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-interfaces.lua
+++ b/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-interfaces.lua
@@ -1,10 +1,10 @@
return {
- ["cs"]={ "CAP", "Cap", "Caps", "Cisla", "KAP", "Kap", "Kaps", "MESIC", "Rimskecislice", "SLOVA", "SLOVO", "Slova", "Slovo", "VSEDNIDEN", "Znak", "Znaky", "aktualnicislonadpisu", "aktualnidatum", "appendix", "arg", "atleftmargin", "atrightmargin", "barevnalista", "barva", "bilemisto", "bottomspace", "bublinkovanapoveda", "bydliste", "bypassblocks", "cap", "celkovypocetstran", "cernalinka", "cernelinky", "chapter", "chem", "cisla", "cislonadpisu", "cislopodrovnice", "cislorovnice", "cislostrany", "citace", "citovat", "comment", "completecombinedlist", "completelistoffloats", "completelistofsorts", "completelistofsynonyms", "completepagenumber", "completeregister", "coupledregister", "crlf", "cutspace", "datum", "decrementnumber", "definebodyfontDEF", "definebodyfontREF", "definecolumnbreak", "definecolumnset", "definecombination", "definedfont", "definefontfeature", "definefonthandling", "defineindentedtext", "defineinmargin", "defineitemgroup", "definelayer", "definelayout", "definemathalignment", "definepagebreak", "defineplacement", "definerawfont", "definerule", "definetextposition", "definetextvariable", "definetype", "definetypeface", "definuj", "definujakcent", "definujbarvu", "definujblok", "definujbloksekce", "definujbuffer", "definujfont", "definujformatodkazu", "definujhbox", "definujhlavnipole", "definujinterakcnimenu", "definujkombinovanyseznam", "definujkonverzi", "definujlogo", "definujnadpis", "definujobrazeksymbol", "definujodkaz", "definujodstavce", "definujopis", "definujoramovani", "definujoramovanytext", "definujpaletu", "definujplvouciobjekt", "definujpodpole", "definujpole", "definujpopis", "definujpopisek", "definujprekryv", "definujpreskok", "definujprikaz", "definujprofil", "definujprogram", "definujprostredizakladnihofontu", "definujrejstrik", "definujsablonutabulky", "definujsekci", "definujseznam", "definujseznamodkazu", "definujskupinubarev", "definujstartstop", "definujstyl", "definujstylfontu", "definujsymbol", "definujsynonumumfontu", "definujsynonyma", "definujtabelaci", "definujtext", "definujtrideni", "definujupravu", "definujvelikostpapiru", "definujverzi", "definujvycet", "definujvystup", "definujzakladnifont", "definujzasobnikpoli", "definujznaceni", "definujznak", "delkaseznamu", "description", "dodrzujprofil", "dodrzujverzi", "dodrzujverziprofilu", "dvoustrannypapir", "emptylines", "enumeration", "externiobraz", "fakt", "footnotetext", "forceblocks", "framedtext", "getnumber", "headsym", "hl", "hlavnijazyk", "hlavniuroven", "hodnotabarvy", "hodnotasedi", "immediatebetweenlist", "immediatetolist", "indentation", "ininner", "inneredgedistance", "inneredgewidth", "innermargindistance", "innermarginwidth", "inouter", "instalacejazyka", "interakcnilista", "interakcnitlacitka", "interaktivnimenu", "jazyk", "jdidolu", "jdina", "jdinabox", "jdinastranu", "jmeno", "kap", "klonujpole", "komponenta", "konvertujcislo", "kopirujpole", "korekcebilehomista", "labeling", "leg", "listsymbol", "loadsorts", "loadsynonyms", "maoramovani", "mapfontsize", "marginalnilinka", "marginalninadpis", "marginalnislovo", "marginalnitext", "matematika", "mazaramovani", "mediaeval", "meritko", "mesic", "mezera", "moveformula", "movesidefloat", "mrizka", "nadpis", "nadruhyokraj", "nalevo", "nalevyokraj", "name", "naokraj", "napravo", "napravyokraj", "nastavbarvu", "nastavbarvy", "nastavbilamista", "nastavblok", "nastavbloksekce", "nastavbuffer", "nastavcernelinky", "nastavcislonadpisu", "nastavcislostrany", "nastavcislovani", "nastavcislovaniodstavcu", "nastavcislovaniradku", "nastavcislovanistran", "nastavcitaci", "nastavdefinicipoznamekpodcarou", "nastavdeleniplvoucichobjektu", "nastavdelitko", "nastavdolnitexty", "nastaveni", "nastavexterniobrazy", "nastavhorejsek", "nastavhornitexty", "nastavinterakci", "nastavinterakcnilistu", "nastavinterakcnimenu", "nastavinterakcniobrazovku", "nastavjazyk", "nastavkapitalky", "nastavkombinovanyseznam", "nastavkomentar", "nastavkomentarstrany", "nastavlegendu", "nastavmarginalie", "nastavmarginalniblok", "nastavmarginalnilinky", "nastavmeziradkovoumezeru", "nastavnadpis", "nastavnadpisy", "nastavodkazovani", "nastavodsazovani", "nastavodstavce", "nastavopis", "nastavoramovanetexty", "nastavoramovani", "nastavorez", "nastavotoceni", "nastavpaletu", "nastavplvouciobjekt", "nastavplvouciobjekty", "nastavpodcislostrany", "nastavpodtrzeni", "nastavpole", "nastavpolozky", "nastavpopisek", "nastavpopisky", "nastavpopisy", "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", "navigating", "nejakyradek", "nekde", "nextsection", "neznamo", "nivy", "nizky", "nocap", "nokap", "nop", "numberofsubpages", "obrazovka", "odkaz", "odkaznadatum", "odkaznastranu", "odkaznatext", "odkazujici", "odsazenishora", "odsazenizleva", "odsazovani", "okr", "opakovat", "opis", "opissoubor", "oramovani", "oref", "orez", "otocit", "outeredgedistance", "outeredgewidth", "outermargindistance", "outermarginwidth", "overbar", "overbars", "overstrike", "overstrikes", "oznaceni", "oznacverzi", "pagedepth", "pageoffset", "paragraph", "parovastrana", "part", "pis", "placefloat", "placeheadnumber", "placeheadtext", "placelistoffloats", "placelistofsorts", "placelistofsynonyms", "placepagenumber", "placerawlist", "placereferencelist", "placerule", "placetextvariable", "plnezneni", "pol", "pole", "polozka", "polozky", "popisky", "poppisek", "porovnejpaletu", "porovnejskupinubarev", "positiontext", "pozadi", "pozice", "poznamka", "poznamkapodcarou", "pref", "prelozit", "premistinamrizku", "prepninazakladnifont", "preskoc", "prizpusobivepole", "prizpusobvzhled", "produkt", "program", "projekt", "propojeneznaceni", "propojenydokument", "propojenyrejstrik", "prostredi", "publikace", "ran", "ref", "register", "reservefloat", "reset", "resetnumber", "resettextcontent", "resetznaceni", "rimskecislice", "rozdelplvouciobjekt", "rozmer", "rozpojeneznaceni", "roztazene", "schovejbloky", "section", "sedabarva", "seeregister", "setnumber", "settextcontent", "settextvariable", "setupanswerarea", "setupcolumnset", "setupcolumnsetlines", "setupcolumnsetstart", "setupfonthandling", "setupfontsynonym", "setupforms", "setupindentedtext", "setupinterlinespace2", "setupitemgroup", "setuplistalternative", "setupmathalignment", "setupnumber", "setuppaper", "setupplacement", "setuprule", "setupstartstop", "setupstrut", "setuptextposition", "setuptextvariable", "sirkalevehookraje", "sirkalevemarginalie", "sirkamarginalie", "sirkaokraje", "sirkapapiru", "sirkapravehookraje", "sirkapravemarginalie", "sirkasazby", "sirkaseznamu", "sirkatextu", "sirkatiskpapiru", "sloupec", "slovovpravo", "sort", "spodek", "stanovcharakteristickuseznamu", "stanovcislonadpisu", "startalignment", "startbarva", "startbuffer", "startcislovaniradku", "startcitace", "startcolumnmakeup", "startcolumns", "startcolumnset", "startcombination", "startcomment", "startdescription", "startdocument", "startdokument", "startenumeration", "startfakt", "startfigure", "startfloattext", "startformula", "startframedtext", "startglobalni", "starthiding", "startinteraktivnimenu", "startitemgroup", "startkodovani", "startkomponenta", "startkorekceradku", "startlegend", "startline", "startlinecorrection", "startlinenumbering", "startlines", "startlocal", "startlocalenvironment", "startlocalfootnotes", "startlokalni", "startlokalnipoznamkypodcarou", "startmakeup", "startmarginalniblok", "startmarginalnilinka", "startmarginblock", "startnamemakeup", "startnarrower", "startnezhustene", "startobraz", "startopposite", "startoverlay", "startoverview", "startparagraph", "startpositioning", "startpostponing", "startpozadi", "startprehled", "startprekryv", "startprodukt", "startprofil", "startprofile", "startprojekt", "startprostredi", "startprotejsek", "startradek", "startradky", "startrastr", "startregister", "startsadasymbolu", "startsloupce", "startspojeni", "startsymbolset", "startsynchronizace", "startsynchronization", "starttable", "starttables", "starttabulate", "starttabulka", "starttabulky", "starttext", "starttextovalinka", "starttyping", "startumistovani", "startunpacked", "startuprava", "startverze", "startzarovnavani", "startzhustene", "startzuzeni", "stopalignment", "stopbarva", "stopbuffer", "stopcislovaniradku", "stopcitace", "stopcolumnmakeup", "stopcolumns", "stopcolumnset", "stopcombination", "stopcomment", "stopdescription", "stopdocument", "stopdokument", "stopenumeration", "stopfakt", "stopfigure", "stopfloattext", "stopformula", "stopframedtext", "stopglobalni", "stophiding", "stopinteraktivnimenu", "stopitemgroup", "stopkodovani", "stopkomponenta", "stopkorekceradku", "stoplegend", "stopline", "stoplinecorrection", "stoplinenumbering", "stoplines", "stoplocal", "stoplocalenvironment", "stoplocalfootnotes", "stoplokalni", "stoplokalnipoznamkypodcarou", "stopmakeup", "stopmarginalniblok", "stopmarginalnilinka", "stopmarginblock", "stopnamemakeup", "stopnarrower", "stopnezhustene", "stopopposite", "stopoverlay", "stopoverview", "stopparagraph", "stoppositioning", "stoppostponing", "stoppozadi", "stopprehled", "stopprekryv", "stopprodukt", "stopprofil", "stopprofile", "stopprojekt", "stopprostredi", "stopprotejsek", "stopradek", "stopradky", "stoprastr", "stopsloupce", "stopspojeni", "stopsymbolset", "stopsynchronizace", "stopsynchronization", "stoptable", "stoptables", "stoptabulate", "stoptabulka", "stoptabulky", "stoptext", "stoptextovalinka", "stoptyping", "stopumistovani", "stopunpacked", "stopuprava", "stopverze", "stopzarovnavani", "stopzhustene", "stopzuzeni", "strana", "sub", "subject", "subpagenumber", "subsection", "subsubject", "subsubsection", "subsubsubject", "switchtorawfont", "sym", "symbol", "synchronizacnilista", "synchronizovat", "synonym", "tab", "tecky", "tenkalinka", "tenkelinky", "testcolumn", "testpage", "tex", "texthlavicky", "textovalinka", "textpopisku", "textvariable", "title", "tlacitko", "tlacitkomenu", "tloustkacary", "tref", "tvrdamezera", "tvrdemezery", "txt", "typebuffer", "ukazbarvu", "ukazexterniobrazy", "ukazmrizku", "ukaznastaveni", "ukazpaletu", "ukazpodpery", "ukazpole", "ukazpostredizakladnihofontu", "ukazramecek", "ukazsadusymbolu", "ukazskupinubarev", "ukazupravu", "ukazvytisk", "ukazvzhled", "ukazzakladnifont", "umistikombinovanyseznam", "umistilegendu", "umistiloga", "umistilokalnipoznamkypodcarou", "umistinadsebe", "umistinamrizku", "umistipodrovnici", "umistipoznamkypodcarou", "umistirejstrik", "umistirovnici", "umistiseznam", "umistivedlesebe", "umistizalozky", "underbar", "underbars", "urcicharakteristikurejstriku", "useXMLfilter", "usedirectory", "usetypescript", "usetypescriptfile", "uzijJSscripts", "uzijURL", "uzijadresar", "uzijbloky", "uzijexternidokument", "uzijexterniobraz", "uzijexternisoubor", "uzijexternisoubory", "uzijexternizvuk", "uzijkodovani", "uzijmodul", "uzijmoduly", "uzijodkazy", "uzijprikazy", "uzijspeciality", "uzijsymbol", "uzijurl", "verze", "vl", "vlasovalinka", "vlevo", "vpravo", "vradku", "vsedniden", "vyberbloky", "vyberpapir", "vyberverzi", "vyplnenytext", "vyplnovelinky", "vyplnovepole", "vyplnovyradek", "vyskahorejsku", "vyskapapiru", "vyskasazby", "vyskaseznamu", "vyskaspodku", "vyskatextu", "vyskatiskpapiru", "vyskaupati", "vyskazahlavi", "vysoky", "vyznam", "vzdalenosthorejsku", "vzdalenostlevehookraje", "vzdalenostlevemarginalie", "vzdalenostmarginalie", "vzdalenostokraje", "vzdalenostpravehookraje", "vzdalenostpravemarginalie", "vzdalenostspodku", "vzdalenostupati", "vzdalenostzahlavi", "zablokujinterakcnimenu", "zachovejbloky", "zadnamezera", "zadnebilemisto", "zadnedalsibloky", "zadnedalsisoubory", "zadnehorniadolniradky", "zadneodsazovani", "zadnezahlaviaupati", "zadneznaceni", "zadnyrozmer", "zadnyseznam", "zadnytest", "zalozka", "zapisdorejstriku", "zapisdoseznamu", "zapisdoseznamuodkazu", "zapismeziseznam", "zaramovani", "zarovnanonastred", "zarovnanovlevo", "zarovnanovpravo", "zasobnikpoli", "zaznamovepole", "zhustene", "ziskejbuffer", "ziskejznaceni", "zlomek", "znaceni", "znak", "znaky", "zpracujbloky", "zpracujstranu", "zrcadlit", "zref", "zvysujicicislo" },
- ["de"]={ "Buchstabe", "Buchstaben", "CAP", "Cap", "Caps", "KAP", "Kap", "Kaps", "MONAT", "Roemischezahlen", "WOCHENTAG", "WOERTER", "WORT", "Woerter", "Wort", "Ziffern", "abstandlinkerrand", "abstandoben", "abstandrechterrand", "abstandunten", "amgitterausrichten", "amgitterneuausrichten", "appendix", "arg", "atleftmargin", "atrightmargin", "aufseite", "ausfuellfeld", "ausfuelltext", "ausschnitt", "bearbeitebloecke", "bearbeiteseite", "bedeutung", "behaltebloecke", "bei", "bemerkung", "benutzekodierung", "benutzespezielles", "benutzeverzeichnis", "beschrifteversion", "beschriftung", "bestimmekopfnummer", "bestimmelistencharakeristika", "bestimmeregistercharakteristika", "bildschirm", "blanko", "bookmark", "bottomspace", "breitelinkerrand", "breiterechterrand", "bruch", "buchstabe", "buchstaben", "but", "bypassblocks", "cap", "chapter", "chem", "comment", "completecombinedlist", "completelistoffloats", "completelistofsorts", "completelistofsynonyms", "completepagenumber", "completeregister", "coupledregister", "crlf", "cutspace", "datum", "decrementnumber", "definebodyfontDEF", "definebodyfontREF", "definecolumnbreak", "definecolumnset", "definecombination", "definedfont", "definefontfeature", "definefonthandling", "defineindentedtext", "defineinmargin", "defineitemgroup", "definelayer", "definelayout", "definemathalignment", "defineoutput", "definepagebreak", "defineplacement", "definerawfont", "definerule", "defineschriftsynonym", "definetextposition", "definetextvariable", "definetype", "definetypeface", "definiereabbsymbol", "definiereabsaetze", "definiereabschnitt", "definiereabschnittsblock", "definiereakzent", "definierebefehl", "definierebeschreibung", "definierebeschreibungen", "definierebeschriftung", "definiereblanko", "definiereblock", "definierefarbe", "definierefarbengruppe", "definierefeld", "definierefeldstapel", "definierefliesstext", "definierefliesstextumgebung", "definieregleitobjekt", "definierehauptfeld", "definierehbox", "definiereinteraktionsmenue", "definierekonversion", "definierelabel", "definiereliste", "definierelogo", "definieren", "definierenummerierung", "definiereoverlay", "definierepalette", "definierepapierformat", "definiereprofil", "definiereprogramme", "definierepuffer", "definierereferenz", "definierereferenzformat", "definierereferenzliste", "definiereregister", "definiereschrift", "definiereschriftstil", "definieresortieren", "definierestartstop", "definierestil", "definieresubfeld", "definieresymbol", "definieresynonyme", "definieretabellenvorlage", "definieretabulator", "definieretext", "definieretippen", "definiereueberschrift", "definiereumbruch", "definiereumrahmt", "definiereumrahmtertext", "definiereversion", "definierezeichen", "definierezusammengestellteliste", "description", "dimension", "doppelseite", "doppelseitigespapier", "drehen", "duennelinie", "duennerumriss", "einezeile", "einstellungen", "einziehen", "emptylines", "entknuepfebeschriftung", "enumeration", "externeabbildung", "farbbalken", "farbe", "farbewert", "feld", "feldstapel", "festesspatium", "folgeprofil", "folgeprofilversion", "folgeversion", "footnotetext", "forceblocks", "format", "formelnummer", "framedtext", "fussnote", "fusszeileabstand", "fusszeilenhoehe", "gefuelltesrechteck", "gefuelltezeile", "geg", "gesamtseitenanzahl", "gestreckt", "getnumber", "gitter", "graufarbe", "grauwert", "haarlinie", "hauptsprache", "headsym", "heutigesdatum", "heutigeskopfnummer", "hintergrund", "hl", "hoch", "hoeheoben", "hoeheunten", "holebeschriftung", "holepuffer", "imlinken", "imlinkenrand", "immaumrise", "immediatebetweenlist", "immediatetolist", "imrechten", "imrechtenrand", "imumriss", "in", "inaktiviereinteraktionsmenue", "inanderermarginale", "indentation", "ininner", "inlinkermarginale", "inmarginalie", "inneredgedistance", "inneredgewidth", "innermargindistance", "innermarginwidth", "inouter", "inrechtermarginale", "installieresprache", "interaktionsbalken", "interaktionsknopfe", "interaktionsmenue", "inzeile", "irgendwo", "its", "kap", "keindimension", "keinebeschriftung", "keinebloeckemehr", "keinedateienmehr", "keinekopfundfusszeilen", "keineliste", "keinspatium", "keintest", "keinzeilenobenundunten", "keinzwischenraum", "kleinerdurchschuss", "klonierefeld", "knopf", "komponente", "konvertierezahl", "kopf", "kopfniveau", "kopfnummer", "kopfweite", "kopfzeilenabstand", "kopfzeilenhoehe", "kopierefeld", "korrigierezwischenraum", "label", "labeling", "labels", "labeltext", "leg", "liniendicke", "linkemarginalafstand", "linkemarginalbreite", "linksbuendig", "listenbreite", "listenhoehe", "listenlaenge", "listsymbol", "loadsorts", "loadsynonyms", "mapfontsize", "mar", "marginalafstand", "marginalbreite", "marginallinie", "marginaltext", "marginaltitel", "marginalwort", "mathematik", "maumrise", "mediaeval", "menueknopf", "monat", "moveformula", "movesidefloat", "nachunten", "name", "navigating", "nextsection", "nichteinziehen", "nocap", "nokap", "nop", "notiz", "numberofsubpages", "nummererhoehen", "outeredgedistance", "outeredgewidth", "outermargindistance", "outermarginwidth", "overbar", "overbars", "overstrike", "overstrikes", "pagedepth", "pageoffset", "papierbreite", "papierhoehe", "paragraph", "part", "passelayoutan", "passendfeld", "placefloat", "placeheadnumber", "placeheadtext", "placelistoffloats", "placelistofsorts", "placelistofsynonyms", "placepagenumber", "placerawlist", "placereferencelist", "placerule", "placetextvariable", "platzierebookmarks", "platziereformel", "platzierefussnoten", "platzierelegende", "platziereliste", "platzierelogo", "platzierelokalefussnoten", "platzierenebeneinander", "platziereregister", "platziereuntereinander", "platziereunterformel", "platzierezusammengestellteliste", "pos", "position", "positiontext", "posten", "printpapierbreite", "printpapierhoehe", "produkt", "programm", "projekt", "publikation", "punkt", "ran", "randabstand", "randbreite", "rechteck", "rechtecke", "rechtemarginalafstand", "rechtemarginalbreite", "rechtsbuendig", "ref", "referenz", "referieren", "register", "registrierefelder", "reservefloat", "resetnumber", "resettextcontent", "roemischezahlen", "ruecksetzten", "ruecksetztenbeschriftung", "rumpfweite", "satzbreite", "satzhoehe", "schreibezumregister", "schreibezurliste", "schreibezurreferenzliste", "schreibezwischenliste", "section", "seeregister", "seite", "seitenreferenz", "seitenummer", "setnumber", "settext", "settextvariable", "setupanswerarea", "setupcolumnset", "setupcolumnsetlines", "setupcolumnsetstart", "setupfonthandling", "setupfontsynonym", "setupforms", "setupindentedtext", "setupinterlinespace2", "setupitemgroup", "setuplistalternative", "setupmathalignment", "setupnumber", "setuppaper", "setupplacement", "setuprule", "setupstartstop", "setupstrut", "setuptextposition", "setuptextvariable", "showsymbolset", "sort", "spalte", "spatium", "spiegeln", "sprache", "startabbildung", "startalignment", "startausrichtung", "startbuffer", "startcolumnmakeup", "startcolumns", "startcolumnset", "startcombination", "startcomment", "startdescription", "startdocument", "startdokument", "startenger", "startenumeration", "startfarbe", "startfigure", "startfloattext", "startformula", "startframedtext", "startgeg", "startgegenueber", "startglobal", "startgrosserdurchschuss", "starthiding", "starthintergrund", "startinteraktionsmenue", "startitemgroup", "startkleinerdurchschuss", "startkodierung", "startkombination", "startkomponente", "startlegend", "startline", "startlinecorrection", "startlinenumbering", "startlines", "startlocal", "startlocalenvironment", "startlocalfootnotes", "startlokal", "startlokalefussnoten", "startmakeup", "startmarginalblock", "startmarginallinie", "startmarginblock", "startnamemakeup", "startnarrower", "startopposite", "startoverlay", "startoverview", "startparagraph", "startpositionieren", "startpositioning", "startpostponing", "startprodukt", "startprofil", "startprofile", "startprojekt", "startraster", "startregister", "startspalten", "startsymbolset", "startsynchronisation", "startsynchronization", "starttabelle", "starttabellen", "starttable", "starttables", "starttabulate", "starttext", "starttextlinie", "starttyping", "startueberblick", "startumbruch", "startumgebung", "startunpacked", "startversion", "startzeile", "startzeilen", "startzeilenkorrektur", "startzeilennumerierung", "startzitat", "stelleabsaetzeein", "stelleabsatznummerierungein", "stelleabschnittein", "stelleabschnittsblockein", "stelleanordnenein", "stelleaufzaehlungenein", "stelleausgabeein", "stelleausrichtungein", "stelleausschnittein", "stellebeschreibungein", "stellebeschriftungein", "stellebilderunterschriftein", "stellebildunterschriftein", "stellebindestrichein", "stelleblankoein", "stelleblockein", "stelledrehenein", "stelleduennerumrissein", "stelleeinziehenein", "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", "stelleseitenkommentarein", "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", "stopausrichtung", "stopbuffer", "stopcolumnmakeup", "stopcolumns", "stopcolumnset", "stopcombination", "stopcomment", "stopdescription", "stopdocument", "stopdokument", "stopenger", "stopenumeration", "stopfarbe", "stopfigure", "stopfloattext", "stopformula", "stopframedtext", "stopgeg", "stopgegenueber", "stopglobal", "stopgrosserdurchschuss", "stophiding", "stophintergrund", "stopinteraktionsmenue", "stopitemgroup", "stopkleinerdurchschuss", "stopkodierung", "stopkombination", "stopkomponente", "stoplegend", "stopline", "stoplinecorrection", "stoplinenumbering", "stoplines", "stoplocal", "stoplocalenvironment", "stoplocalfootnotes", "stoplokal", "stoplokalefussnoten", "stopmakeup", "stopmarginalblock", "stopmarginallinie", "stopmarginblock", "stopnamemakeup", "stopnarrower", "stopopposite", "stopoverlay", "stopoverview", "stopparagraph", "stoppositionieren", "stoppositioning", "stoppostponing", "stopprodukt", "stopprofil", "stopprofile", "stopprojekt", "stopraster", "stopspalten", "stopsymbolset", "stopsynchronisation", "stopsynchronization", "stoptabelle", "stoptabellen", "stoptable", "stoptables", "stoptabulate", "stoptext", "stoptextlinie", "stoptyping", "stopueberblick", "stopumbruch", "stopumgebung", "stopunpacked", "stopversion", "stopzeile", "stopzeilen", "stopzeilenkorrektur", "stopzeilennumerierung", "stopzitat", "sub", "subject", "subpagenumber", "subsection", "subsubject", "subsubsection", "subsubsubject", "switchtorawfont", "sym", "symbol", "synchronisationsbalken", "synchronisieren", "synonym", "tab", "teilegleitobjekt", "testcolumn", "testpage", "tex", "textbreite", "texthoehe", "textlinie", "textreferenz", "textvariable", "tief", "tiho", "tip", "tippedatei", "tippen", "tippepuffer", "title", "tooltip", "txt", "ueber", "ueberschrifttext", "uebersetzten", "umgebung", "umrahmt", "unbekant", "underbar", "underbars", "unterformelnummer", "useXMLfilter", "usedirectory", "usetypescript", "usetypescriptfile", "verbergebloecke", "vergleichefarbengruppe", "vergleichepalette", "verknuepfebeschriftung", "verknuepfedokument", "verknuepfregister", "version", "verweis", "verweisdatum", "verwendeJSscript", "verwendeURL", "verwendebefehl", "verwendebloecke", "verwendeexteresdokument", "verwendeexterneabbildung", "verwendeexternedatei", "verwendeexternedateien", "verwendeexternestonstueck", "verwendemodul", "verwendemodule", "verwendereferenzen", "verwendesymbole", "verwendeurl", "vl", "volleswort", "von", "waehlebloeckeaus", "waehlepapieraus", "waehleversionaus", "wechselezumfliesstext", "wiederholen", "wochentag", "wohnort", "wortrechts", "zeigedruck", "zeigeeinstellungen", "zeigeexterneabbildungen", "zeigefarbe", "zeigefarbengruppe", "zeigefelder", "zeigefliesstext", "zeigefliesstextumgebung", "zeigegitter", "zeigelayout", "zeigepalette", "zeigerahmen", "zeigestruts", "zeigeumbruch", "zentriert", "ziffern", "zitat", "zitieren", "zu", "zurbox", "zurseite", "zwischenraum" },
- ["en"]={ "CAP", "Cap", "Caps", "Character", "Characters", "MONTH", "Numbers", "Romannumerals", "WEEKDAY", "WORD", "WORDS", "Word", "Words", "about", "adaptlayout", "adding", "appendix", "arg", "at", "atleftmargin", "atpage", "atrightmargin", "background", "backspace", "blackrule", "blackrules", "blank", "bookmark", "bottomdistance", "bottomheight", "bottomspace", "but", "button", "bypassblocks", "cap", "chapter", "character", "characters", "chem", "clip", "clonefield", "color", "colorbar", "colorvalue", "column", "comment", "comparecolorgroup", "comparepalet", "completecombinedlist", "completelistoffloats", "completelistofsorts", "completelistofsynonyms", "completepagenumber", "completeregister", "component", "convertnumber", "copyfield", "correctwhitespace", "coupledocument", "coupledregister", "couplemarking", "couplepage", "couplepaper", "coupleregister", "crlf", "currentdate", "currentheadnumber", "cutspace", "date", "decouplemarking", "decrementnumber", "define", "defineaccent", "defineblank", "defineblock", "definebodyfont", "definebodyfontDEF", "definebodyfontREF", "definebodyfontenvironment", "definebuffer", "definecharacter", "definecolor", "definecolorgroup", "definecolumnbreak", "definecolumnset", "definecombination", "definecombinedlist", "definecommand", "defineconversion", "definedescription", "definedfont", "defineenumeration", "definefield", "definefieldstack", "definefiguresymbol", "definefloat", "definefont", "definefontfeature", "definefonthandling", "definefontstyle", "definefontsynonym", "defineframed", "defineframedtext", "definehbox", "definehead", "defineindentedtext", "defineinmargin", "defineinteractionmenu", "defineitemgroup", "definelabel", "definelayer", "definelayout", "definelist", "definelogo", "definemainfield", "definemakeup", "definemarking", "definemathalignment", "defineoutput", "defineoverlay", "definepagebreak", "definepalet", "definepapersize", "defineparagraphs", "defineplacement", "defineprofile", "defineprogram", "definerawfont", "definereference", "definereferenceformat", "definereferencelist", "defineregister", "definerule", "definesection", "definesectionblock", "definesorting", "definestartstop", "definestyle", "definesubfield", "definesymbol", "definesynonyms", "definetabletemplate", "definetabulate", "definetext", "definetextposition", "definetextvariable", "definetype", "definetypeface", "definetyping", "defineversion", "description", "determineheadnumber", "determinelistcharacteristics", "determineregistercharacteristics", "dimension", "disableinteractionmenu", "domicile", "donttest", "edgedistance", "edgewidth", "emptylines", "enumeration", "environment", "externalfigure", "fact", "field", "fieldstack", "fillinfield", "fillinline", "fillinrules", "fillintext", "fitfield", "fixedspace", "fixedspaces", "followprofile", "followprofileversion", "followversion", "footerdistance", "footerheight", "footnote", "footnotetext", "forceblocks", "formulanumber", "fraction", "framed", "framedtext", "from", "getbuffer", "getmarking", "getnumber", "godown", "goto", "gotobox", "gotopage", "graycolor", "greyvalue", "grid", "hairline", "head", "headerdistance", "headerheight", "headlevel", "headnumber", "headsym", "headtext", "hideblocks", "high", "hl", "immediatebetweenlist", "immediatetolist", "in", "incrementnumber", "indentation", "indenting", "inframed", "infull", "ininner", "inleft", "inleftedge", "inleftmargin", "inline", "inmaframed", "inmargin", "inneredgedistance", "inneredgewidth", "innermargindistance", "innermarginwidth", "inothermargin", "inouter", "inright", "inrightedge", "inrightmargin", "installlanguage", "interactionbar", "interactionbuttons", "interactionmenu", "item", "items", "its", "keepblocks", "label", "labeling", "labels", "labeltext", "language", "leftaligned", "leftedgedistance", "leftedgewidth", "leftmargindistance", "leftmarginwidth", "leg", "linethickness", "listheight", "listlength", "listsymbol", "listwidth", "loadsorts", "loadsynonyms", "logfields", "lohi", "low", "maframed", "mainlanguage", "makeupheight", "makeupwidth", "mapfontsize", "mar", "margindistance", "marginrule", "margintext", "margintitle", "marginwidth", "marginword", "marking", "markversion", "mathematics", "mediaeval", "menubutton", "midaligned", "mirror", "month", "moveformula", "moveongrid", "movesidefloat", "name", "navigating", "nextsection", "nocap", "nodimension", "noheaderandfooterlines", "noindenting", "nolist", "nomarking", "nomoreblocks", "nomorefiles", "nop", "nospace", "note", "notopandbottomlines", "nowhitespace", "numberofsubpages", "numbers", "outeredgedistance", "outeredgewidth", "outermargindistance", "outermarginwidth", "overbar", "overbars", "overstrike", "overstrikes", "packed", "page", "pagedepth", "pagenumber", "pageoffset", "pagereference", "paperheight", "paperwidth", "paragraph", "part", "periods", "placebookmarks", "placecombinedlist", "placefloat", "placefootnotes", "placeformula", "placeheadnumber", "placeheadtext", "placelegend", "placelist", "placelistoffloats", "placelistofsorts", "placelistofsynonyms", "placelocalfootnotes", "placelogos", "placeongrid", "placeontopofeachother", "placepagenumber", "placerawlist", "placereferencelist", "placeregister", "placerule", "placesidebyside", "placesubformula", "placetextvariable", "position", "positiontext", "printpaperheight", "printpaperwidth", "processblocks", "processpage", "product", "program", "project", "publication", "quotation", "quote", "ran", "redo", "ref", "reference", "referral", "referraldate", "referring", "register", "remark", "reservefloat", "reset", "resetmarking", "resetnumber", "resettextcontent", "rightaligned", "rightedgedistance", "rightedgewidth", "rightmargindistance", "rightmarginwidth", "romannumerals", "rotate", "scale", "screen", "section", "seeregister", "selectblocks", "selectpaper", "selectversion", "setnumber", "settextcontent", "settextvariable", "setupalign", "setupanswerarea", "setuparranging", "setupbackground", "setupbackgrounds", "setupblackrules", "setupblank", "setupblock", "setupbodyfont", "setupbodyfontenvironment", "setupbottom", "setupbottomtexts", "setupbuffer", "setupbuttons", "setupcapitals", "setupcaption", "setupcaptions", "setupclipping", "setupcolor", "setupcolors", "setupcolumns", "setupcolumnset", "setupcolumnsetlines", "setupcolumnsetstart", "setupcombinations", "setupcombinedlist", "setupcomment", "setupdescriptions", "setupenumerations", "setupexternalfigures", "setupfield", "setupfields", "setupfillinlines", "setupfillinrules", "setupfloat", "setupfloats", "setupfloatsplitting", "setupfonthandling", "setupfontsynonym", "setupfooter", "setupfootertexts", "setupfootnotedefinition", "setupfootnotes", "setupforms", "setupformulae", "setupframed", "setupframedtexts", "setuphead", "setupheader", "setupheadertexts", "setupheadnumber", "setupheads", "setupheadtext", "setuphyphenmark", "setupindentedtext", "setupindenting", "setupinmargin", "setupinteraction", "setupinteractionbar", "setupinteractionmenu", "setupinteractionscreen", "setupinterlinespace", "setupinterlinespace2", "setupitemgroup", "setupitemizations", "setupitems", "setuplabeltext", "setuplanguage", "setuplayout", "setuplegend", "setuplinenumbering", "setuplines", "setuplinewidth", "setuplist", "setuplistalternative", "setupmakeup", "setupmarginblocks", "setupmarginrules", "setupmarking", "setupmathalignment", "setupnarrower", "setupnumber", "setupnumbering", "setupoppositeplacing", "setupoutput", "setuppagecomment", "setuppagenumber", "setuppagenumbering", "setuppagetransitions", "setuppalet", "setuppaper", "setuppapersize", "setupparagraphnumbering", "setupparagraphs", "setupplacement", "setuppositioning", "setupprofiles", "setupprograms", "setuppublications", "setupquote", "setupreferencelist", "setupreferencing", "setupregister", "setuprotate", "setuprule", "setups", "setupscreens", "setupsection", "setupsectionblock", "setupsorting", "setupspacing", "setupstartstop", "setupstrut", "setupsubpagenumber", "setupsymbolset", "setupsynchronization", "setupsynchronizationbar", "setupsynonyms", "setupsystem", "setuptab", "setuptables", "setuptabulate", "setuptext", "setuptextposition", "setuptextrules", "setuptexttexts", "setuptextvariable", "setupthinrules", "setuptolerance", "setuptop", "setuptoptexts", "setuptype", "setuptyping", "setupunderbar", "setupurl", "setupversions", "setupwhitespace", "showbodyfont", "showbodyfontenvironment", "showcolor", "showcolorgroup", "showexternalfigures", "showfields", "showframe", "showgrid", "showlayout", "showmakeup", "showpalet", "showprint", "showsetups", "showstruts", "showsymbolset", "someline", "somewhere", "sort", "space", "splitfloat", "startalignment", "startbackground", "startbuffer", "startcoding", "startcolor", "startcolumnmakeup", "startcolumns", "startcolumnset", "startcombination", "startcomment", "startcomponent", "startdescription", "startdocument", "startenumeration", "startenvironment", "startfact", "startfigure", "startfloattext", "startformula", "startframedtext", "startglobal", "starthiding", "startinteractionmenu", "startitemgroup", "startlegend", "startline", "startlinecorrection", "startlinenumbering", "startlines", "startlocal", "startlocalenvironment", "startlocalfootnotes", "startmakeup", "startmarginblock", "startmarginrule", "startnamemakeup", "startnarrower", "startopposite", "startoverlay", "startoverview", "startpacked", "startparagraph", "startpositioning", "startpostponing", "startproduct", "startprofile", "startproject", "startquotation", "startraster", "startregister", "startsymbolset", "startsynchronization", "starttable", "starttables", "starttabulate", "starttext", "starttextrule", "starttyping", "startunpacked", "startversion", "stopalignment", "stopbackground", "stopbuffer", "stopcoding", "stopcolor", "stopcolumnmakeup", "stopcolumns", "stopcolumnset", "stopcombination", "stopcomment", "stopcomponent", "stopdescription", "stopdocument", "stopenumeration", "stopenvironment", "stopfact", "stopfigure", "stopfloattext", "stopformula", "stopframedtext", "stopglobal", "stophiding", "stopinteractionmenu", "stopitemgroup", "stoplegend", "stopline", "stoplinecorrection", "stoplinenumbering", "stoplines", "stoplocal", "stoplocalenvironment", "stoplocalfootnotes", "stopmakeup", "stopmarginblock", "stopmarginrule", "stopnamemakeup", "stopnarrower", "stopopposite", "stopoverlay", "stopoverview", "stoppacked", "stopparagraph", "stoppositioning", "stoppostponing", "stopproduct", "stopprofile", "stopproject", "stopquotation", "stopraster", "stopsymbolset", "stopsynchronization", "stoptable", "stoptables", "stoptabulate", "stoptext", "stoptextrule", "stoptyping", "stopunpacked", "stopversion", "stretched", "sub", "subformulanumber", "subject", "subpagenumber", "subsection", "subsubject", "subsubsection", "subsubsubject", "switchtobodyfont", "switchtorawfont", "sym", "symbol", "symoffset", "synchronizationbar", "synchronize", "synonym", "tab", "testcolumn", "testpage", "tex", "textheight", "textreference", "textrule", "textvariable", "textwidth", "thinrule", "thinrules", "title", "tooltip", "topdistance", "topheight", "topspace", "totalnumberofpages", "translate", "txt", "typ", "type", "typebuffer", "typefile", "underbar", "underbars", "unitmeaning", "unknown", "useJSscripts", "useURL", "useXMLfilter", "useblocks", "usecommands", "usedirectory", "useencoding", "useexternaldocument", "useexternalfigure", "useexternalfile", "useexternalfiles", "useexternalsoundtrack", "usemodule", "usemodules", "usereferences", "usespecials", "usesymbols", "usetypescript", "usetypescriptfile", "useurl", "version", "vl", "weekday", "whitespace", "wordright", "writebetweenlist", "writetolist", "writetoreferencelist", "writetoregister" },
- ["fr"]={ "CAP", "Cap", "Caps", "Caractere", "Caracteres", "Chiffresromains", "JOURSEMAINE", "MOIS", "MOT", "MOTS", "Mot", "Mots", "Numeros", "a", "adaptedisposition", "affectenumero", "affectevariabletexte", "ajustechamp", "alaligne", "alapage", "aligneadroite", "aligneagauche", "aligneaumilieu", "appendix", "arg", "arriereplan", "atleftmargin", "atrightmargin", "baha", "barrecouleur", "barreinteraction", "barresynchronisation", "bas", "bouton", "boutonmenu", "boutonsinteraction", "but", "cacheblocs", "cap", "caractere", "caracteres", "champ", "changepolicebrute", "changepolicecorps", "chapter", "chem", "chiffresromains", "citation", "citer", "clip", "clonechamp", "colonne", "comment", "commentaire", "comparegroupecouleur", "comparepalette", "completecombinedlist", "completelistoffloats", "completelistofsorts", "completelistofsynonyms", "completenumeropage", "completeregistre", "composant", "composeenalinea", "concernant", "convertitnumero", "copitchamp", "corrigeespaceblanc", "couleur", "couleurgrise", "coupledocument", "coupledregister", "couplemarquage", "couplepapier", "coupleregistre", "crlf", "cutspace", "dactylographier", "dans", "dansautremarge", "dansborddroit", "dansbordgauche", "dansdroite", "dansgauche", "dansmarge", "dansmargedroite", "dansmargegauche", "date", "datecourante", "daterecommandation", "de", "decouplemarquage", "decrementenumero", "definebodyfontDEF", "definebodyfontREF", "definecombination", "definedfont", "definefontfeature", "definefonthandling", "defineframed", "defineframedtext", "defineindentedtext", "defineitemgroup", "definemathalignment", "defineplacement", "definetypeface", "definicaractere", "definit", "definitaccent", "definitbloc", "definitblocsection", "definitbuffer", "definitcalque", "definitchamp", "definitchampprincipal", "definitcommande", "definitconversion", "definitcouleur", "definitdactylo", "definitdansmarge", "definitdemarrestoppe", "definitdescription", "definitdisposition", "definitenumeration", "definitenvironnementpolicecorps", "definitetiquette", "definitflottant", "definitformatreference", "definitgroupecouleur", "definithbox", "definitjeucolonne", "definitliste", "definitlisteimbriquee", "definitlistereference", "definitlogo", "definitmakeup", "definitmarquage", "definitmenuinteraction", "definitnotepdp", "definitpalette", "definitparagraphes", "definitpilechamp", "definitpolice", "definitpolicebrute", "definitpolicecorps", "definitpositiontexte", "definitprofil", "definitprogramme", "definitreference", "definitregistre", "definitregle", "definitrevetement", "definitsautdecolonne", "definitsautdepage", "definitsection", "definitsortie", "definitsouschamp", "definitstyle", "definitstylepolice", "definitsymbole", "definitsymbolefigure", "definitsynonymepolice", "definitsynonymes", "definittabulation", "definittaillepapier", "definittete", "definittexte", "definittrametableau", "definittri", "definittype", "definitvariabletexte", "definitversion", "definitvide", "demarrealignement", "demarrearriereplan", "demarreblocmarge", "demarrecitation", "demarreciter", "demarrecodage", "demarrecolonnes", "demarrecombinaison", "demarrecompoetroite", "demarrecomposant", "demarrecorrectionligne", "demarrecouleur", "demarredegroupe", "demarredocument", "demarreenvironement", "demarrefigure", "demarreglobal", "demarregroupe", "demarrejeucolonne", "demarrejeusymboles", "demarreligne", "demarreligneregleetexte", "demarrelignes", "demarrelocal", "demarremakeup", "demarremargereglee", "demarrenotespdplocales", "demarrenumerotationligne", "demarreopposition", "demarrepositionnement", "demarreproduit", "demarreprofil", "demarreprojet", "demarreraster", "demarrerevetement", "demarresynchronisation", "demarretableau", "demarretableaux", "demarretexte", "demarreversion", "demarrevuedensemble", "deplaceformule", "deplacesurgrille", "description", "determinecaracteristiqueliste", "determinecaracteristiquesregistre", "determinenumerotete", "dimension", "distancebord", "distanceborddroit", "distancebordgauche", "distanceentete", "distanceinf", "distancemarge", "distancemargedroite", "distancemargegauche", "distancepdp", "distancesup", "domicile", "echelle", "ecran", "ecritdansliste", "ecritdanslistereference", "ecritentreliste", "ecritregistre", "el", "element", "elements", "emptylines", "enumeration", "environement", "espace", "espaceblanc", "espacefixe", "espaceinf", "espacesfixes", "espacesup", "etiquette", "etiquettes", "etire", "fait", "faitreference", "fichierdactylo", "figureexterne", "forceblocs", "fraction", "framed", "framedtext", "gardeblocs", "getnumber", "grille", "groupe", "haut", "hauteureditionpapier", "hauteurentete", "hauteurinf", "hauteurliste", "hauteurmakeup", "hauteurpapier", "hauteurpdp", "hauteursup", "hauteurtexte", "headsym", "hl", "immediatebetweenlist", "immediatetolist", "inconnu", "incrementenumero", "indentation", "inframed", "infull", "inhibemenuinteraction", "ininner", "inmframed", "inneredgedistance", "inneredgewidth", "innermargindistance", "innermarginwidth", "inouter", "installelangue", "joursemaine", "labeling", "labeltexte", "langue", "langueprincipale", "largeurbord", "largeurborddroit", "largeurbordgauche", "largeureditionpapier", "largeurligne", "largeurliste", "largeurmakeup", "largeurmarge", "largeurmargedroite", "largeurmargegauche", "largeurpapier", "largeurtexte", "leg", "ligneh", "lignenoire", "ligneregleetexte", "lignesnoires", "listesymbole", "llongueurliste", "loadsorts", "loadsynonyms", "logchamp", "mapfontsize", "mar", "margereglee", "marquage", "marquageversion", "marquepage", "mathematique", "mediaeval", "menuinteraction", "mframed", "mois", "montrecadre", "montrechamps", "montrecouleur", "montredisposition", "montreedition", "montreenvironnementpolicecorps", "montrefiguresexternes", "montregrille", "montregroupecouleur", "montrejeusymboles", "montremakeup", "montrepalette", "montrepolicecorps", "montrereglages", "montrestruts", "motdroit", "motmarge", "movesidefloat", "name", "navigating", "nextsection", "niveautete", "nocap", "nombredesouspages", "nombretotaldepages", "nommacro", "nop", "note", "notepdp", "numeroformule", "numeropage", "numeros", "numerosousformule", "numerotete", "numerotetecourant", "obtientmarquage", "oriente", "outeredgedistance", "outeredgewidth", "outermargindistance", "outermarginwidth", "overbar", "overbars", "overstrike", "overstrikes", "page", "pagedepth", "pagedouble", "pageoffset", "paragraph", "part", "pasplusdeblocs", "pasplusdefichiers", "periodes", "pilechamp", "placecoteacote", "placeflottant", "placeformule", "placelegende", "placelesunsaudessusdesautres", "placeliste", "placelisteinmbriquee", "placelistereference", "placelistoffloats", "placelistofsorts", "placelistofsynonyms", "placelogos", "placemarquespages", "placenotespdp", "placenotespdplocales", "placenumeropage", "placenumerotete", "placerawlist", "placeregistre", "placeregle", "placesousformule", "placesurgrille", "placetextetete", "placevariabletexte", "position", "positionnetexte", "prendbuffer", "produit", "programme", "projet", "publication", "qqpart", "ran", "raz", "razmarquage", "raznumero", "recommandation", "ref", "refait", "reference", "referencepage", "referencetexte", "reflete", "register", "reglages", "reglealignement", "reglearrangement", "reglearriereplan", "reglearriereplans", "reglebarreinteraction", "reglebarresynchronisation", "reglebloc", "regleblocmarge", "regleblocsection", "regleboutons", "reglebuffer", "reglecapitales", "reglechamp", "reglechamps", "regleclipping", "reglecolonnes", "reglecombinaisons", "reglecommentaire", "reglecommentairepage", "reglecompoetroite", "reglecomposeenalinea", "reglecouleur", "reglecouleurs", "regledactylo", "regledansmarge", "regledemarrestoppe", "regledescriptions", "regledisposition", "regleecraninteraction", "regleecrans", "regleelements", "regleencadre", "regleentete", "regleenumerations", "regleenvironnementpolicecorps", "regleepaisseurligne", "regleespaceblanc", "regleespacement", "regleespacementinterligne", "reglefiguresexternes", "regleflottant", "regleflottants", "regleformulaires", "regleformules", "reglegroupeselements", "regleinf", "regleinteraction", "regleintitule", "regleintitules", "reglejeucolonne", "reglejeusymboles", "reglelabeltexte", "reglelangue", "reglelegende", "reglelignes", "reglelignesnoires", "reglelignesreglestexte", "regleliste", "reglelisteimbriquee", "reglelistereference", "reglemakeup", "reglemargereglee", "reglemarquage", "reglemarquagehyphenation", "reglemenuinteraction", "reglenotepdp", "reglenumero", "reglenumeropage", "reglenumerotation", "reglenumerotationligne", "reglenumerotationpage", "reglenumerotationparagraphe", "reglenumerotete", "regleoriente", "reglepalette", "reglepapier", "regleparagraphes", "reglepdp", "regleplacementopposition", "reglepolicecorps", "reglepositionnement", "reglepositiontexte", "regleprofils", "regleprogrammes", "reglepublications", "reglereferencage", "regleregistre", "regleregle", "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", "reglevariabletexte", "regleversions", "remplitchamp", "remplitligne", "remplitlignesreglees", "remplittexte", "reservefloat", "resettextcontent", "retourarriere", "sansalinea", "sansdimension", "sansespace", "sansespaceblanc", "sanslignesenteteetpdp", "sanslignessupetinf", "sansliste", "sansmarquage", "sanstest", "sauteblocs", "section", "seeregister", "selectionneblocs", "selectionnepapier", "selectionneversion", "sensunite", "separeflottant", "settext", "setupanswerarea", "setupcolumnsetlines", "setupcolumnsetstart", "setupfonthandling", "setupfontsynonym", "setupframedtexts", "setupindentedtext", "setupinterlinespace2", "setupitemgroup", "setuplistalternative", "setupmathalignment", "setupplacement", "sort", "sousnumeropage", "startalignment", "startarriereplan", "startbuffer", "startcitation", "startcolumnmakeup", "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", "stopcitation", "stopcolumnmakeup", "stopcolumns", "stopcombination", "stopcomment", "stopcompoetroite", "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", "stoppealignement", "stoppearriereplan", "stoppeblocmarge", "stoppecitation", "stoppecodage", "stoppecolonnes", "stoppecombinaison", "stoppecomposant", "stoppecorrectionligne", "stoppecouleur", "stoppedegroupe", "stoppedocument", "stoppeenvironement", "stoppeglobal", "stoppegroupe", "stoppejeucolonne", "stoppeligne", "stoppeligneregleetexte", "stoppelignes", "stoppelocal", "stoppemakeup", "stoppemargereglee", "stoppenotespdplocales", "stoppenumerotationligne", "stoppeopposition", "stoppepositionnement", "stoppeproduit", "stoppeprofil", "stoppeprojet", "stopperaster", "stopperevetement", "stoppesynchronisation", "stoppetableau", "stoppetableaux", "stoppetexte", "stoppeversion", "stoppevuedensemble", "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", "testcolumn", "testpage", "tete", "tex", "textemarge", "textenotepdp", "textetete", "title", "titremarge", "traduire", "traiteblocs", "traitepage", "traitfin", "traitsfins", "txt", "typ", "underbar", "underbars", "uneligne", "useXMLfilter", "usedirectory", "usetypescript", "usetypescriptfile", "utiliseJSscripts", "utiliseURL", "utiliseblocs", "utilisechemin", "utilisecommandes", "utilisedocumentexterne", "utiliseencodage", "utilisefichierexterne", "utilisefichiersexternes", "utilisefigureexterne", "utilisemodule", "utilisemodules", "utilisepsiteaudioexterne", "utilisereferences", "utilisespecialites", "utilisesymboles", "utiliseurl", "va", "vaalaboite", "vaalapage", "vaenbas", "valeurcouleur", "valeurgris", "variabletexte", "version", "vide", "vl" },
- ["it"]={ "CAP", "Cap", "Caps", "GIORNOSETTIMANA", "Lettera", "Lettere", "MESE", "Numeri", "Numeriromani", "PAROLA", "PAROLE", "Parola", "Parole", "accoppiacarta", "accoppiadocumento", "accoppiamarcatura", "accoppiapagina", "accoppiaregistro", "adattacampo", "adattalayout", "al", "allineacentro", "allineadestra", "allineasinistra", "altezzacarta", "altezzacartastampa", "altezzacima", "altezzaelenco", "altezzafondo", "altezzaintestazione", "altezzamakeup", "altezzapdp", "altezzatesto", "ambiente", "ampiezzabordo", "ampiezzabordodestro", "ampiezzabordosinistro", "ampiezzacarta", "ampiezzacartastampa", "ampiezzaelenco", "ampiezzamakeup", "ampiezzamargine", "ampiezzamarginedestro", "ampiezzamarginesinistro", "ampiezzatesto", "ap", "apagina", "appendix", "arg", "atleftmargin", "atrightmargin", "barracolori", "barrainterazione", "barrasincronizzazione", "bastablocchi", "bastafile", "cambiaafontdeltesto", "campi", "camporiempimento", "cap", "capello", "chapter", "chim", "circondato", "citazione", "clip", "clonacampo", "colonna", "colore", "coloregrigio", "comment", "commento", "completecombinedlist", "completelistoffloats", "completelistofsorts", "completelistofsynonyms", "completeregister", "componenet", "confrontagruppocolori", "confrontatavolozza", "convertinumero", "copiacampo", "correggispaziobianco", "coupledregister", "crlf", "cutspace", "da", "daqualcheparte", "data", "datadioggi", "datareferral", "decrementnumber", "definebodyfontDEF", "definebodyfontREF", "definecolumnbreak", "definecombination", "definedfont", "definefontfeature", "definefonthandling", "defineindentedtext", "defineinmargin", "defineitemgroup", "definelayer", "definemathalignment", "definepagebreak", "defineplacement", "definetypeface", "definisci", "definisciaccento", "definisciambientefontdeltesto", "definisciblocco", "definiscibloccosezione", "definiscibuffer", "definiscicampo", "definiscicampoprincipale", "definiscicapoversi", "definiscicarattere", "definiscicolore", "definiscicomando", "definisciconversione", "definiscidescrizione", "definiscidimensionicarta", "definiscielenco", "definiscielencocombinato", "definiscienumerazione", "definiscietichetta", "definiscifigurasimbolo", "definiscifont", "definiscifontdeltesto", "definiscifontgrezzo", "definisciformatoriferimento", "definiscigruppocolonne", "definiscigruppocolori", "definiscihbox", "definisciincorniciato", "definisciiniziatermina", "definiscilayout", "definiscilinea", "definiscilistariferimenti", "definiscilogo", "definiscimakeup", "definiscimarcatura", "definiscimenuinterazione", "definiscimodellotabella", "definiscioggettomobile", "definisciordinamento", "definiscioutput", "definisciposizionetesto", "definisciprofilo", "definisciprogramma", "definisciregistro", "definisciriferimento", "definiscirigovuoto", "definiscisezione", "definiscisimbolo", "definiscisinonimi", "definiscisinonimofont", "definiscisottocampo", "definiscisovrapposizione", "definiscistackcampi", "definiscistile", "definiscistilefont", "definiscitabulato", "definiscitavolozza", "definiscitesta", "definiscitesto", "definiscitestoincorniciato", "definiscitype", "definiscityping", "definiscivariabiletesto", "definisciversion", "description", "determinacaratteristicheregistro", "determinacarattersticheelenco", "determinanumerotesta", "dimensione", "disabilitamenuinterazione", "distanzabordo", "distanzabordodestro", "distanzabordosinistro", "distanzacima", "distanzafondo", "distanzaintestazione", "distanzamargine", "distanzamarginedestro", "distanzamarginesinistro", "distanzapdp", "domicilio", "el", "elaborablocchi", "elaborapagina", "elementi", "elemento", "emptylines", "enumeration", "etichetta", "etichette", "fatto", "figuraesterna", "fondo", "forzablocchi", "framedtext", "frazione", "getnumber", "giornosettimana", "griglia", "headsym", "hl", "ignoto", "immediatebetweenlist", "immediatetolist", "impaccato", "impostaallineamento", "impostaambientefontdeltesto", "impostaampiezzariga", "impostabarrainterazione", "impostabarrasincronizzazione", "impostablocchimargine", "impostablocco", "impostabloccosezione", "impostabuffer", "impostacampi", "impostacampo", "impostacapoversi", "impostacaption", "impostacaptions", "impostacima", "impostaclippling", "impostacolonne", "impostacolore", "impostacolori", "impostacombinazioni", "impostacommento", "impostacommentopagina", "impostadefinizionenotepdp", "impostadescrizioni", "impostadimensionicarta", "impostaelementi", "impostaelencazioni", "impostaelenco", "impostaelencocombinato", "impostaenumerazioni", "impostafigureesterne", "impostafondo", "impostafontdeltesto", "impostaforms", "impostaformule", "impostagruppocolonne", "impostaincorniciato", "impostainiziatermina", "impostainmargine", "impostainstestazione", "impostainterazione", "impostainterlinea", "impostalayout", "impostalegenda", "impostalinea", "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", "impostaposizionetesto", "impostaprofili", "impostaprogrammi", "impostapubblicazioni", "impostapulsanti", "impostaregistro", "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", "impostavariabiletesto", "impostaversioni", "impostazioni", "in", "inaltromargine", "incorniciato", "incrementanumero", "indentation", "indestra", "ininner", "iniziaallineamento", "iniziaambiente", "iniziabloccomargine", "iniziacitazione", "iniziacodifica", "iniziacolonne", "iniziacolore", "iniziacombinazione", "iniziacomponente", "iniziacorrezioneriga", "iniziadocumento", "iniziafigura", "iniziaglobale", "iniziagruppocolonne", "iniziaimpaccato", "inizialineamargine", "inizialineatesto", "inizialocale", "iniziamakeup", "inizianotepdplocali", "inizianumerazionerighe", "iniziaopposto", "iniziaoverview", "iniziapiustretto", "iniziaposizionamento", "iniziaprodotto", "iniziaprofilo", "iniziaprogetto", "iniziaraster", "iniziariga", "iniziarighe", "iniziasetsimboli", "iniziasfondo", "iniziasincronizzazione", "iniziasovrapposizione", "iniziatabella", "iniziatabelle", "iniziatesto", "iniziaunpacked", "iniziaversione", "inlatodestro", "inlatosinistro", "inmaframed", "inmargine", "inmarginedestro", "inmarginesinistro", "inneredgedistance", "inneredgewidth", "innermargindistance", "innermarginwidth", "inouter", "inriga", "insinistra", "installalingua", "intorno", "labeling", "leg", "lettera", "lettere", "lineamargine", "lineanera", "lineasottile", "lineatesto", "lineenere", "lineeriempimento", "lineesottili", "lingua", "linguaprincipale", "listsymbol", "livellotesta", "loadsorts", "loadsynonyms", "logcampi", "lunghezzaelenco", "maframed", "mapfontsize", "mar", "marcatura", "marcaversione", "matematica", "mediaeval", "menuinterattivo", "menzione", "mese", "mettielenco", "mettielencocombinato", "mettifiancoafianco", "mettiformula", "mettiingriglia", "mettilegenda", "mettilinea", "mettiloghi", "mettinotepdp", "mettinotepdplocali", "mettinumeropagina", "mettiregistro", "mettisegnalibro", "mettisottoformula", "mettiunosullaltro", "mettivariabiletesto", "mostraambientefontdeltesto", "mostracampi", "mostracolore", "mostracornice", "mostrafiguresterne", "mostrafontdeltesto", "mostragriglia", "mostragruppocolori", "mostraimpostazioni", "mostralyout", "mostramakeup", "mostrasetsimboli", "mostrastampa", "mostrastruts", "mostratavolozza", "movesidefloat", "name", "nascondiblocchi", "navigating", "nextsection", "nientedimensioni", "nienteelenco", "nientelineecimafondo", "nientelineintestazionepdp", "nientemarcatura", "nienterientro", "nientespazio", "nientespaziobianco", "nocap", "nome", "nomeunita", "nop", "nota", "notapdp", "notest", "numberofsubpages", "numeri", "numeriromani", "numeroformula", "numeropagina", "numeropaginacompleto", "numerosottoformula", "numerotesta", "numerotestacorrente", "numerototaledipagine", "outeredgedistance", "outeredgewidth", "outermargindistance", "outermarginwidth", "overbar", "overbars", "overstrike", "overstrikes", "pagedepth", "pageoffset", "pagina", "paragraph", "paroladestra", "parolainmargine", "part", "passaafontgrezzo", "ped", "pedap", "perlungo", "placefloat", "placelistoffloats", "placelistofsorts", "placelistofsynonyms", "placerawlist", "placereferencelist", "posizionanumerotesta", "posizionatesto", "posizionatestotesta", "posizione", "prendibuffer", "prendimarcatura", "prodotto", "progetto", "programma", "pubblicazione", "pulsante", "pulsantemenu", "pulsantinterazione", "punti", "qualcheriga", "ran", "referral", "referring", "register", "reimposta", "reimpostamarcatura", "reservefloat", "resetnumber", "resettextcontent", "rientro", "rif", "rifai", "riferimento", "riferimentopagina", "riferimentotesto", "riflessione", "rigariempimento", "rigovuoto", "ruota", "saltablocchi", "scala", "schermo", "scrividentroelenco", "scriviinelenco", "scriviinlistariferimenti", "scriviinregistro", "section", "seeregister", "segnalibro", "seguiprofilo", "seguiversione", "seguiversioneprofilo", "selezionablocchi", "selezionacarta", "selezionaversione", "separamarcatura", "setnumber", "settext", "setupanswerarea", "setupcolumnsetlines", "setupcolumnsetstart", "setupfonthandling", "setupfontsynonym", "setupindentedtext", "setupinterlinespace2", "setupitemgroup", "setuplistalternative", "setupmathalignment", "setuppaper", "setupplacement", "setvariabiletesto", "sfondo", "sim", "simbolo", "sincronizza", "sort", "spazifissi", "spazio", "spaziobianco", "spaziocima", "spaziodietro", "spaziofisso", "spaziofondo", "spessoreriga", "spezzaoggettomobile", "spostaagriglia", "spostaformula", "stackcampi", "startalignment", "startambiente", "startbuffer", "startcitazione", "startcolore", "startcolumnmakeup", "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", "stopcitazione", "stopcolore", "stopcolumnmakeup", "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", "subpagenumber", "subsection", "subsubject", "subsubsection", "subsubsubject", "synonym", "tab", "terminaallineamento", "terminaambiente", "terminabloccomargine", "terminacitazione", "terminacodifica", "terminacolonne", "terminacolore", "terminacombinazione", "terminacomponente", "terminacorrezioneriga", "terminadocumento", "terminaglobale", "terminagruppocolonne", "terminaimpaccato", "terminalineamargine", "terminalineatesto", "terminalocale", "terminamakeup", "terminanotepdplocali", "terminanumerazionerighe", "terminaopposto", "terminaoverview", "terminapiustretto", "terminaposizionamento", "terminaprodotto", "terminaprofili", "terminaprogetto", "terminaraster", "terminariga", "terminarighe", "terminasfondo", "terminasincronizzazione", "terminasovrapposizione", "terminatabella", "terminatabelle", "terminatesto", "terminaunpacked", "terminaversioni", "testa", "testcolumn", "testoetichetta", "testoinmargine", "testoinstestazioni", "testonotapdp", "testoriempimento", "testpage", "tex", "tieniblocchi", "title", "titoloinmargine", "tooltip", "traduci", "txt", "typ", "type", "typebuffer", "typefile", "underbar", "underbars", "usaJSscripts", "usaURL", "usablocco", "usacartella", "usacodifica", "usacolonnasonoraesterna", "usacomandi", "usadocumentoesterno", "usafiguraesterna", "usafileesterni", "usafileesterno", "usamoduli", "usamodulo", "usariferimenti", "usasimboli", "usaspecialita", "usaurl", "useXMLfilter", "usedirectory", "usetypescript", "usetypescriptfile", "vaia", "vaiabox", "vaiapagina", "vaigiu", "valorecolore", "valoregrigio", "variabiletesto", "versione", "vl" },
- ["nl"]={ "CAP", "Cap", "Caps", "Cijfers", "KAP", "Kap", "Kaps", "Letter", "Letters", "MAAND", "Romeins", "WEEKDAG", "WOORD", "WOORDEN", "Woord", "Woorden", "aantalsubpaginas", "about", "achtergrond", "appendix", "arg", "bepaalkopnummer", "bepaallijstkenmerken", "bepaalregisterkenmerken", "betekenis", "binnenmargeafstand", "binnenmargebreedte", "binnenrandafstand", "binnenrandbreedte", "blanko", "blokje", "blokjes", "blokkeerinteractiemenu", "bodemwit", "bookmark", "bovenafstand", "bovenhoogte", "breuk", "buitenmargeafstand", "buitenmargebreedte", "buitenrandafstand", "buitenrandbreedte", "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", "definerawfont", "definetypeface", "definieer", "definieeraccent", "definieeralineas", "definieerbeeldmerk", "definieerblanko", "definieerblok", "definieerbuffer", "definieercombinatie", "definieercommando", "definieerconversie", "definieerfiguursymbool", "definieerfont", "definieerfontstijl", "definieerfontsynoniem", "definieerhbox", "definieerhoofdveld", "definieeringesprongentext", "definieerinmarge", "definieerinteractiemenu", "definieeritemgroep", "definieerkadertekst", "definieerkarakter", "definieerkleur", "definieerkleurgroep", "definieerkolomgroep", "definieerkolomovergang", "definieerkop", "definieerkorps", "definieerkorpsomgeving", "definieerlayer", "definieerlayout", "definieerletter", "definieerlijn", "definieerlijst", "definieermarkering", "definieeromlijnd", "definieeropmaak", "definieeroverlay", "definieerpaginaovergang", "definieerpalet", "definieerpapierformaat", "definieerplaats", "definieerplaatsblok", "definieerprofiel", "definieerprogramma", "definieerreferentie", "definieerreferentieformaat", "definieerreferentielijst", "definieerregister", "definieersamengesteldelijst", "definieersectie", "definieersectieblok", "definieersorteren", "definieerstartstop", "definieersubveld", "definieersymbool", "definieersynoniemen", "definieertabelvorm", "definieertabulatie", "definieertekst", "definieertekstpositie", "definieertekstvariabele", "definieertype", "definieertypen", "definieeruitvoer", "definieerveld", "definieerveldstapel", "definieerversie", "definieerwiskundeuitlijnen", "description", "dimensie", "directnaarlijst", "directtussenlijst", "doordefinieren", "doorlabelen", "doornummeren", "dunnelijn", "dunnelijnen", "eenregel", "enumeration", "ergens", "externfiguur", "forceerblokken", "formulenummer", "framedtext", "gebruikJSscripts", "gebruikURL", "gebruikXMLfilter", "gebruikblokken", "gebruikcommandos", "gebruikexterndocument", "gebruikexternefile", "gebruikexternefiles", "gebruikexternfiguur", "gebruikexterngeluidsfragment", "gebruikgebied", "gebruikmodule", "gebruikmodules", "gebruikreferenties", "gebruikspecials", "gebruiksymbolen", "gebruiktypescript", "gebruiktypescriptfile", "gebruikurl", "geenblokkenmeer", "geenbovenenonderregels", "geendimensie", "geenfilesmeer", "geenhoofdenvoetregels", "geenlijst", "geenmarkering", "geenspatie", "geentest", "geenwitruimte", "geg", "grijskleur", "grijswaarde", "haalbuffer", "haalmarkering", "haalnummer", "haarlijn", "handhaafblokken", "herhaal", "hl", "hoofdafstand", "hoofdhoogte", "hoofdtaal", "hoog", "huidigedatum", "huidigekopnummer", "in", "inanderemarge", "inbinnen", "inbuiten", "indentation", "inlijnd", "inlinker", "inlinkermarge", "inlinkerrand", "inmarge", "inrechter", "inrechtermarge", "inrechterrand", "inregel", "inspringen", "installeertaal", "instellingen", "interactiebalk", "interactiebuttons", "interactiemenu", "invullijnen", "invulregel", "invultekst", "invulveld", "inwilijnd", "items", "its", "kantlijn", "kap", "kenmerk", "kenmerkdatum", "kentekstvariabeletoe", "kleur", "kleurenbalk", "kleurwaarde", "kloonveld", "kolom", "kop", "kopniveau", "kopnummer", "koppeldocument", "koppelmarkering", "koppelpagina", "koppelpapier", "koppelregister", "kopsym", "koptekst", "kopwit", "laag", "label", "labeling", "labels", "labeltekst", "laho", "leg", "legeregels", "letter", "letters", "lijndikte", "lijstbreedte", "lijsthoogte", "lijstlengte", "lijstsymbool", "linkermargeafstand", "linkermargebreedte", "linkerrandafstand", "linkerrandbreedte", "loadsorts", "loadsynonyms", "maand", "mapfontsize", "mar", "margeafstand", "margebreedte", "margetekst", "margetitel", "margewoord", "markeer", "markeerversie", "mediaeval", "menubutton", "naam", "naar", "naarbox", "naarpagina", "name", "navigerend", "nextsection", "nietinspringen", "nocap", "nokap", "noot", "nop", "omgeving", "omlaag", "omlijnd", "onbekend", "onderafstand", "onderdeel", "onderhoogte", "ontkoppelmarkering", "op", "opelkaar", "oplinkermarge", "oppagina", "oprechtermarge", "overbar", "overbars", "overstrike", "overstrikes", "pagina", "paginadiepte", "paginanummer", "paginaoffset", "paginareferentie", "papierbreedte", "papierhoogte", "paragraph", "part", "paslayoutaan", "passeerblokken", "passendveld", "plaatsbeeldmerken", "plaatsbookmarks", "plaatsformule", "plaatskopnummer", "plaatskoptekst", "plaatslegenda", "plaatslijn", "plaatslijst", "plaatslokalevoetnoten", "plaatsnaastelkaar", "plaatsonderelkaar", "plaatsopgrid", "plaatspaginanummer", "plaatsplaatsblok", "plaatsreferentielijst", "plaatsregister", "plaatsruwelijst", "plaatssamengesteldelijst", "plaatssubformule", "plaatstekstvariabele", "plaatsvoetnoten", "placelistoffloats", "placelistofsorts", "placelistofsynonyms", "positioneer", "positioneertekst", "printpapierbreedte", "printpapierhoogte", "produkt", "programma", "projekt", "publicatie", "punten", "ran", "randafstand", "randbreedte", "rechtermargeafstand", "rechtermargebreedte", "rechterrandafstand", "rechterrandbreedte", "ref", "refereer", "referentie", "regellinks", "regelmidden", "regelrechts", "register", "registreervelden", "reservefloat", "reset", "resetmarkering", "resetnummer", "resettekstinhoud", "resettextcontent", "romeins", "rooster", "roteer", "rugwit", "schaal", "scherm", "schrijfnaarlijst", "schrijfnaarreferentielijst", "schrijfnaarregister", "schrijftussenlijst", "section", "seeregister", "selecteerblokken", "selecteerpapier", "selecteerversie", "setnummer", "setupfonthandling", "setupfontsynonym", "setupinterlinespace2", "setuplistalternative", "snijwit", "som", "sort", "spatie", "spiegel", "splitsplaatsblok", "startachtergrond", "startalignment", "startbuffer", "startcitaat", "startcodering", "startcolumns", "startcombinatie", "startcombination", "startcomment", "startdescription", "startdocument", "startenumeration", "startfigure", "startfiguur", "startfloattext", "startformula", "startframedtext", "startgeg", "startglobaal", "starthiding", "startinteractiemenu", "startitemgroup", "startkantlijn", "startkleur", "startkolomgroep", "startkolommen", "startkolomopmaak", "startlegend", "startline", "startlinecorrection", "startlinenumbering", "startlines", "startlocal", "startlocalenvironment", "startlocalfootnotes", "startlokaal", "startlokalevoetnoten", "startmakeup", "startmargeblok", "startmarginblock", "startnaast", "startnamemakeup", "startnarrower", "startomgeving", "startonderdeel", "startopelkaar", "startopmaak", "startopposite", "startoverlay", "startoverview", "startoverzicht", "startparagraph", "startpositioneren", "startpositioning", "startpostponing", "startprodukt", "startprofiel", "startprofile", "startprojekt", "startraster", "startregel", "startregelcorrectie", "startregelnummeren", "startregels", "startregister", "startsmaller", "startsymbolset", "startsymboolset", "startsynchronisatie", "startsynchronization", "starttabel", "starttabellen", "starttable", "starttables", "starttabulate", "starttekst", "starttekstlijn", "starttyping", "startuitlijnen", "startunpacked", "startvanelkaar", "startversie", "stelachtergrondenin", "stelachtergrondin", "stelalineasin", "stelantwoordgebiedin", "stelarrangerenin", "stelblankoin", "stelblokin", "stelblokjesin", "stelblokkopjein", "stelblokkopjesin", "stelbovenin", "stelboventekstenin", "stelbufferin", "stelbuttonsin", "stelciterenin", "stelclipin", "stelcombinatiesin", "stelcommentaarin", "steldoordefinierenin", "steldoornummerenin", "steldunnelijnenin", "stelexternefigurenin", "stelformulesin", "stelformulierenin", "stelhoofdin", "stelhoofdtekstenin", "stelingesprongentextin", "stelinmargein", "stelinspringenin", "stelinteractiebalkin", "stelinteractiein", "stelinteractiemenuin", "stelinteractieschermin", "stelinterliniein", "stelinvullijnenin", "stelinvulregelsin", "stelitemgroepin", "stelitemsin", "stelkadertekstenin", "stelkantlijnin", "stelkapitalenin", "stelkleurenin", "stelkleurin", "stelkolomgroepin", "stelkolomgroepregelsin", "stelkolomgroepstartin", "stelkolommenin", "stelkopin", "stelkopnummerin", "stelkoppeltekenin", "stelkoppenin", "stelkoptekstin", "stelkorpsin", "stelkorpsomgevingin", "stellabeltekstin", "stellayoutin", "stellegendain", "stellijndiktein", "stellijnin", "stellijstin", "stelmargeblokkenin", "stelmarkeringin", "stelnaastplaatsenin", "stelnummerenin", "stelnummerin", "stelomlijndin", "stelonderin", "stelonderstrepenin", "stelondertekstenin", "stelopmaakin", "stelopsommingenin", "stelpaginacommentaarin", "stelpaginanummerin", "stelpaginanummeringin", "stelpaginaovergangenin", "stelpaletin", "stelpapierformaatin", "stelpapierin", "stelparagraafnummerenin", "stelplaatsblokin", "stelplaatsblokkenin", "stelplaatsbloksplitsenin", "stelplaatsin", "stelpositionerenin", "stelprofielenin", "stelprogrammasin", "stelpublicatiesin", "stelrastersin", "stelreferentielijstin", "stelrefererenin", "stelregelnummerenin", "stelregelsin", "stelregisterin", "stelroterenin", "stelsamengesteldelijstin", "stelsectieblokin", "stelsectiein", "stelsmallerin", "stelsorterenin", "stelspatieringin", "stelstartstopin", "stelstrutin", "stelsubpaginanummerin", "stelsymboolsetin", "stelsynchronisatiebalkin", "stelsynchronisatiein", "stelsynoniemenin", "stelsysteemin", "steltaalin", "steltabellenin", "steltabin", "steltabulatiein", "steltekstin", "steltekstinhoudin", "steltekstlijnenin", "steltekstpositiein", "stelteksttekstenin", "steltekstvariabelein", "steltolerantiein", "steltypein", "steltypenin", "steluitlijnenin", "steluitvoerin", "stelurlin", "stelveldenin", "stelveldin", "stelversiesin", "stelvoetin", "stelvoetnootdefinitiein", "stelvoetnotenin", "stelvoettekstenin", "stelwiskundeuitlijnenin", "stelwitruimtein", "stopachtergrond", "stopalignment", "stopbuffer", "stopcitaat", "stopcodering", "stopcolumns", "stopcombinatie", "stopcombination", "stopcomment", "stopdescription", "stopdocument", "stopenumeration", "stopfigure", "stopfloattext", "stopformula", "stopframedtext", "stopgeg", "stopglobaal", "stophiding", "stopinteractiemenu", "stopitemgroup", "stopkantlijn", "stopkleur", "stopkolomgroep", "stopkolommen", "stopkolomopmaak", "stoplegend", "stopline", "stoplinecorrection", "stoplinenumbering", "stoplines", "stoplocal", "stoplocalenvironment", "stoplocalfootnotes", "stoplokaal", "stoplokalevoetnoten", "stopmakeup", "stopmargeblok", "stopmarginblock", "stopnaast", "stopnamemakeup", "stopnarrower", "stopomgeving", "stoponderdeel", "stopopelkaar", "stopopmaak", "stopopposite", "stopoverlay", "stopoverview", "stopoverzicht", "stopparagraph", "stoppositioneren", "stoppositioning", "stoppostponing", "stopprodukt", "stopprofiel", "stopprofile", "stopprojekt", "stopraster", "stopregel", "stopregelcorrectie", "stopregelnummeren", "stopregels", "stopsmaller", "stopsymbolset", "stopsynchronisatie", "stopsynchronization", "stoptabel", "stoptabellen", "stoptable", "stoptables", "stoptabulate", "stoptekst", "stoptekstlijn", "stoptyping", "stopuitlijnen", "stopunpacked", "stopvanelkaar", "stopversie", "sub", "subformulenummer", "subject", "subpaginanummer", "subsection", "subsubject", "subsubsection", "subsubsubject", "suggestie", "switchnaarkorps", "switchtorawfont", "sym", "symbool", "symoffset", "synchronisatiebalk", "synchroniseer", "synonym", "taal", "tab", "tekstbreedte", "teksthoogte", "tekstlijn", "tekstreferentie", "tekstvariabele", "testkolom", "testpagina", "tex", "title", "toelichting", "toonexternefiguren", "toongrid", "tooninstellingen", "toonkader", "toonkleur", "toonkleurgroep", "toonkorps", "toonkorpsomgeving", "toonlayout", "toonopmaak", "toonpalet", "toonprint", "toonstruts", "toonsymboolset", "toonvelden", "totaalaantalpaginas", "txt", "typ", "type", "typebuffer", "typefile", "uit", "uitgerekt", "underbar", "underbars", "usecodering", "usedirectory", "vastespatie", "vastespaties", "veld", "veldstapel", "verbergblokken", "vergelijkkleurgroep", "vergelijkpalet", "verhoognummer", "verlaagnummer", "verplaatsformule", "verplaatsopgrid", "verplaatszijblok", "versie", "vertaal", "verwerkblokken", "verwerkpagina", "vl", "voetafstand", "voethoogte", "voetnoot", "voetnoottekst", "volgprofiel", "volgprofielversie", "volgversie", "volledigepaginanummer", "volledigregister", "voluit", "weekdag", "wilijnd", "wiskunde", "witruimte", "woonplaats", "woordrechts", "zetbreedte", "zethoogte" },
- ["pe"]={ "CAP", "Cap", "Caps", "Character", "Characters", "MONTH", "Numbers", "Romannumerals", "WEEKDAY", "WORD", "WORDS", "Word", "Words", "appendix", "cap", "chapter", "chem", "comment", "completecombinedlist", "completelistoffloats", "completelistofsorts", "completelistofsynonyms", "coupledregister", "crlf", "definebodyfontDEF", "definebodyfontREF", "definedfont", "definefontfeature", "definefonthandling", "defineindentedtext", "definetypeface", "description", "enumeration", "framedtext", "indentation", "inmframed", "its", "labeling", "loadsorts", "loadsynonyms", "mapfontsize", "mediaeval", "mframed", "name", "nextsection", "nocap", "overbar", "overbars", "overstrike", "overstrikes", "paragraph", "part", "placelistoffloats", "placelistofsorts", "placelistofsynonyms", "ran", "register", "reservefloat", "resettextcontent", "section", "seeregister", "setupanswerarea", "setupcapitals", "setupfonthandling", "setupfontsynonym", "setupindentedtext", "setupinterlinespace2", "setuplistalternative", "setupurl", "sort", "startalignment", "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", "startraster", "startregister", "startsymbolset", "startsynchronization", "starttable", "starttables", "starttabulate", "starttyping", "startunpacked", "startتولید", "startحقیقت", "startخط‌حاشیه", "startخط‌متن", "startرنگ", "startفشرده", "startمحیط", "startمنوی‌پانل", "startمولفه", "startنسخه", "startنقل‌قول", "startپروژه", "startپس‌زمینه", "stopalignment", "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", "stopraster", "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", "txt", "typ", "underbar", "underbars", "useJSscripts", "useURL", "useXMLfilter", "usedirectory", "useurl", "آفست‌صفحه", "آیتم", "آیتمها", "آینه", "اجباربلوکها", "ارتفاع‌آرایش", "ارتفاع‌بالا", "ارتفاع‌برگ", "ارتفاع‌ته‌برگ", "ارتفاع‌خط", "ارتفاع‌سربرگ", "ارتفاع‌متن", "ارتفاع‌پایین", "از", "ازکارانداختن‌منوی‌پانل", "استفاده‌بلوکها", "استفاده‌دستخط‌تایپ", "استفاده‌رمزینه", "استفاده‌شکل‌خارجی", "استفاده‌فرمانها", "استفاده‌قطعه‌موزیک‌خارجی", "استفاده‌مدول", "استفاده‌مدولها", "استفاده‌مرجعها", "استفاده‌مسیر", "استفاده‌نمادها", "استفاده‌نوشتارخارجی", "استفاده‌ویژگیها", "استفاده‌پرونده‌خارجی", "استفاده‌پرونده‌دستخط‌تایپ", "استفاده‌پرونده‌های‌خارجی", "اعدادلاتین", "افزودن", "اما", "امتحان‌نکن", "انتخاب‌برگ", "انتخاب‌بلوکها", "انتخاب‌نسخه", "انتقال‌به‌توری", "انتقال‌فرمول", "انتقال‌کنار‌شناور", "انجام‌دوباره", "بارگذاریها", "بارگذاری‌آرایش", "بارگذاری‌آیتمها", "بارگذاری‌ارجاع", "بارگذاری‌اندازه‌برگ", "بارگذاری‌باریکتر", "بارگذاری‌بافر", "بارگذاری‌بالا", "بارگذاری‌بخش", "بارگذاری‌بردباری", "بارگذاری‌برنامه‌ها", "بارگذاری‌برگ", "بارگذاری‌بست", "بارگذاری‌بلوک", "بارگذاری‌بلوکهای‌حاشیه", "بارگذاری‌بلوک‌بخش", "بارگذاری‌تایپ", "بارگذاری‌تایپ‌کردن", "بارگذاری‌تب", "بارگذاری‌ترتیب", "بارگذاری‌ترکیب‌ها", "بارگذاری‌تطابق", "بارگذاری‌تعریف‌پانوشت", "بارگذاری‌تنظیم", "بارگذاری‌تنظیم‌ریاضی", "بارگذاری‌ته‌برگ", "بارگذاری‌تورفتگی", "بارگذاری‌توضیح", "بارگذاری‌توضیح‌صفحه", "بارگذاری‌ثبت", "بارگذاری‌جانشانی", "بارگذاری‌جدولها", "بارگذاری‌جدول‌بندی", "بارگذاری‌خالی", "بارگذاری‌خروجی", "بارگذاری‌خط", "بارگذاری‌خطها", "بارگذاری‌خطهای‌حاشیه", "بارگذاری‌خطهای‌سیاه", "بارگذاری‌خطهای‌متن", "بارگذاری‌خطهای‌مجموعه‌ستون", "بارگذاری‌خطها‌ی‌نازک", "بارگذاری‌درج‌درخطها", "بارگذاری‌درج‌مخالف", "بارگذاری‌درون‌حاشیه", "بارگذاری‌دوران", "بارگذاری‌دکمه‌ها", "بارگذاری‌راهنما", "بارگذاری‌رنگ", "بارگذاری‌رنگها", "بارگذاری‌زبان", "بارگذاری‌ستونها", "بارگذاری‌سر", "بارگذاری‌سربرگ", "بارگذاری‌سرها", "بارگذاری‌سیستم", "بارگذاری‌شرح", "بارگذاری‌شرحها", "بارگذاری‌شروع‌مجموعه‌ستون", "بارگذاری‌شروع‌پایان", "بارگذاری‌شماره", "بارگذاری‌شماره‌زیرصفحه", "بارگذاری‌شماره‌سر", "بارگذاری‌شماره‌صفحه", "بارگذاری‌شماره‌گذاری", "بارگذاری‌شماره‌گذاریها", "بارگذاری‌شماره‌گذاری‌صفحه", "بارگذاری‌شماره‌گذاری‌پاراگراف", "بارگذاری‌شماره‌‌گذاری‌خط", "بارگذاری‌شناور", "بارگذاری‌شناورها", "بارگذاری‌شکافتن‌شناورها", "بارگذاری‌شکلهای‌خارجی", "بارگذاری‌طرح", "بارگذاری‌طرح‌بندی", "بارگذاری‌عرض‌خط", "بارگذاری‌فاصله‌بین‌خط", "بارگذاری‌فرمولها", "بارگذاری‌فضای‌سفید", "بارگذاری‌فضا‌گذاری", "بارگذاری‌قالبی", "بارگذاری‌قلم‌متن", "بارگذاری‌لوح", "بارگذاری‌لیست", "بارگذاری‌لیست‌ترکیبی", "بارگذاری‌لیست‌مرجع", "بارگذاری‌مترادفها", "بارگذاری‌متغیر‌متن", "بارگذاری‌متن", "بارگذاری‌متنهای‌بالا", "بارگذاری‌متن‌سر", "بارگذاری‌متن‌سربرگ", "بارگذاری‌متن‌قالبی", "بارگذاری‌متن‌متنها", "بارگذاری‌متن‌پانوشت", "بارگذاری‌متن‌پایین", "بارگذاری‌مجموعه‌ستون", "بارگذاری‌مجموعه‌نماد", "بارگذاری‌محیط‌قلم‌متن", "بارگذاری‌منوی‌پانل", "بارگذاری‌مکان‌متن", "بارگذاری‌مکان‌گذاری", "بارگذاری‌میدان", "بارگذاری‌میدانها", "بارگذاری‌میله‌تطابق", "بارگذاری‌میله‌زیر", "بارگذاری‌میله‌پانل", "بارگذاری‌نسخه‌ها", "بارگذاری‌نشانه‌شکستن", "بارگذاری‌نشانه‌گذاری", "بارگذاری‌نشرها", "بارگذاری‌نقل", "بارگذاری‌پاراگرافها", "بارگذاری‌پانل", "بارگذاری‌پانوشتها", "بارگذاری‌پایین", "بارگذاری‌پرده‌ها", "بارگذاری‌پرده‌پانل", "بارگذاری‌پروفایلها", "بارگذاری‌پرکردن‌خطها", "بارگذاری‌پس‌زمینه", "بارگذاری‌پس‌زمینه‌ها", "بارگذاری‌چیدن", "بارگذاری‌گذارصفحه", "بارگذاری‌گروههای‌آیتم", "بارگذاری‌گروه‌آیتم", "بازنشانی", "بازنشانی‌شماره", "بازنشانی‌متن", "بازنشانی‌نشانه‌گذاری", "باگذاری‌متن‌برچسب", "بدون‌بعد", "بدون‌بلوکهای‌بیشتر", "بدون‌تورفتگی", "بدون‌خط‌بالاوپایین", "بدون‌خط‌سروته‌برگ", "بدون‌فایلهای‌بیشتر", "بدون‌فضا", "بدون‌فضای‌سفید", "بدون‌لیست", "بدون‌نشانه‌گذاری", "برنامه", "بروبه", "بروبه‌جعبه", "بروبه‌صفحه", "بروپایین", "برچسب", "برچسبها", "بعد", "بلند", "بلوکهای‌پردازش", "بلوکها‌پنهان", "بنویس‌بین‌لیست", "بنویس‌درثبت", "بنویس‌درلیست‌مرجع", "بنویس‌در‌لیست", "تاریخ", "تاریخ‌جاری", "تاریخ‌رجوع", "تایپ", "تایپ‌بافر", "تایپ‌پرونده", "تب", "ترجمه", "تطابق", "تعریف", "تعریف‌آرایش", "تعریف‌آرم", "تعریف‌الگوی‌جدول", "تعریف‌اندازه‌برگ", "تعریف‌بافر", "تعریف‌بخش", "تعریف‌برنامه", "تعریف‌برچسب", "تعریف‌بلوک", "تعریف‌بلوک‌بخش", "تعریف‌تایپ", "تعریف‌تایپ‌کردن", "تعریف‌تبدیل", "تعریف‌ترتیب", "تعریف‌ترکیب", "تعریف‌تنظیم‌ریاضی", "تعریف‌توده‌میدان", "تعریف‌ثبت", "تعریف‌جانشانی", "تعریف‌جدول‌بندی", "تعریف‌جعبه‌‌افقی", "تعریف‌حرف", "تعریف‌خالی", "تعریف‌خروجی", "تعریف‌خط‌حائل", "تعریف‌درون‌حاشیه", "تعریف‌رنگ", "تعریف‌زیرمیدان", "تعریف‌سبک", "تعریف‌سبک‌قلم", "تعریف‌سر", "تعریف‌شرح", "تعریف‌شروع‌پایان", "تعریف‌شماره‌بندی", "تعریف‌شمایل‌مرجع", "تعریف‌شناور", "تعریف‌شکستن‌ستون", "تعریف‌شکست‌صفحه", "تعریف‌طرح‌بندی", "تعریف‌فرمان", "تعریف‌قالبی", "تعریف‌قلم", "تعریف‌قلم‌خام", "تعریف‌قلم‌متن", "تعریف‌لایه", "تعریف‌لهجه", "تعریف‌لوح", "تعریف‌لیست", "تعریف‌لیست‌ترکیبی", "تعریف‌لیست‌مرجع", "تعریف‌مترادفها", "تعریف‌مترادف‌قلم", "تعریف‌متغیرمتن", "تعریف‌متن", "تعریف‌متن‌قالبی", "تعریف‌مجموعه‌ستون", "تعریف‌محیط‌قلم‌بدنه", "تعریف‌مرجع", "تعریف‌منوی‌پانل", "تعریف‌مکان‌متن", "تعریف‌میدان", "تعریف‌میدان‌اصلی", "تعریف‌نسخه", "تعریف‌نشانه‌گذاری", "تعریف‌نماد", "تعریف‌نمادشکل", "تعریف‌پاراگرافها", "تعریف‌پروفایل", "تعریف‌پوشش", "تعریف‌گروه‌آیتم", "تعریف‌گروه‌رنگ", "تعیین‌شماره", "تعیین‌شماره‌سر", "تعیین‌متغیر‌متن", "تعیین‌محتوای‌متن", "تعیین‌مشخصات‌ثبت", "تعیین‌مشخصات‌لیست", "تغییربه‌قلم‌بدنه", "تغییربه‌قلم‌خام", "تنظیم‌راست", "تنظیم‌طرح‌بندی", "تنظیم‌وسط", "توجه", "تورفتگی", "توری", "تولید", "تک", "ثبت‌زوج", "ثبت‌کامل", "جداسازی‌نشانه‌گذاری", "حاش", "حرف", "حرفها", "حفظ‌بلوکها", "حقیقت", "خالی", "خطهای‌سیاه", "خطهای‌نازک", "خطها‌خالی", "خط‌حاشیه", "خط‌سیاه", "خط‌متن", "خط‌مو", "خط‌نازک", "خ‌ا", "خ‌ع", "در", "درج‌آرمها", "درج‌ثبت", "درج‌خط", "درج‌درخط", "درج‌درخطها", "درج‌درمتن", "درج‌درمیدان", "درج‌در‌بالای‌یکدیگر", "درج‌در‌توری", "درج‌راهنما", "درج‌زیرفرمول", "درج‌شماره‌سر", "درج‌شماره‌صفحه", "درج‌شناور", "درج‌فرمول", "درج‌لیست", "درج‌لیست‌خام", "درج‌لیست‌مختلط", "درج‌لیست‌مرجع", "درج‌متغیرمتن", "درج‌متن‌سر", "درج‌پانوشتها", "درج‌پانوشتهای‌موضعی", "درج‌چوب‌خط", "درج‌کنار‌به‌کنار", "درحاشیه", "درحاشیه‌دیگر", "درحاشیه‌راست", "درحاشیه‌چپ", "درخارجی", "درخط", "درداخلی", "درراست", "درصفحه", "درقالبی", "درلبه‌راست", "درلبه‌چپ", "درمورد", "درون", "درپر", "درچپ", "دریافت‌بافر", "دریافت‌شماره", "دریافت‌نشانه", "دوران", "دکمه", "دکمه‌منو", "دکمه‌پانل", "رج", "رجوع", "رنگ", "رنگ‌خاکستری", "روزهفته", "ریاضی", "زبان", "زبان‌اصلی", "ستون", "ستون‌امتحان", "سر", "سرپوش‌کوچک‌نه", "شروع‌آرایش", "شروع‌آرایش‌ستون", "شروع‌باریکتر", "شروع‌بازبینی", "شروع‌بلوک‌حاشیه", "شروع‌ترکیب", "شروع‌تصحیح‌خط", "شروع‌تطابق", "شروع‌تنظیم", "شروع‌تولید", "شروع‌جدول", "شروع‌جدولها", "شروع‌خط", "شروع‌خطها", "شروع‌خط‌حاشیه", "شروع‌خط‌متن", "شروع‌رنگ", "شروع‌ستونها", "شروع‌سراسری", "شروع‌شماره‌گذاری‌خط", "شروع‌شکل", "شروع‌غیر‌فشرده", "شروع‌فشرده", "شروع‌متن", "شروع‌مجموعه‌ستون", "شروع‌مجموعه‌نماد", "شروع‌محیط", "شروع‌مخالف", "شروع‌موضعی", "شروع‌مولفه", "شروع‌مکان‌گذاری", "شروع‌نسخه", "شروع‌نقل‌قول", "شروع‌نوشتار", "شروع‌پانوشتهای‌موضعی", "شروع‌پروفایل", "شروع‌پروژه", "شروع‌پس‌زمینه", "شروع‌پوشش", "شروع‌کد", "شماره‌افزایش", "شماره‌زیرصفحه", "شماره‌زیرفرمول", "شماره‌سر", "شماره‌سرجاری", "شماره‌صفحه", "شماره‌صفحه‌کامل", "شماره‌فرمول", "شماره‌مبدل", "شماره‌ها", "شماره‌کاهش", "شماره‌کل‌صفحه‌ها", "شکافتن‌شناور", "شکل‌خارجی", "صفحه", "صفحه‌تست", "صفحه‌زوج", "صفحه‌پردازش", "طول‌لیست", "عبوربلوکها", "عرض‌آرایش", "عرض‌برگ", "عرض‌حاشیه", "عرض‌حاشیه‌خارجی", "عرض‌حاشیه‌داخلی", "عرض‌حاشیه‌راست", "عرض‌حاشیه‌چپ", "عرض‌خط", "عرض‌لبه", "عرض‌لبه‌خارجی", "عرض‌لبه‌داخلی", "عرض‌لبه‌راست", "عرض‌لبه‌چپ", "عرض‌لیست", "عرض‌متن", "عمق‌صفحه", "عنوان‌حاشیه", "فاصله‌بالا", "فاصله‌ته‌برگ", "فاصله‌حاشیه", "فاصله‌حاشیه‌خارجی", "فاصله‌حاشیه‌داخلی", "فاصله‌حاشیه‌راست", "فاصله‌حاشیه‌چپ", "فاصله‌سربرگ", "فاصله‌لبه", "فاصله‌لبه‌خارجی", "فاصله‌لبه‌داخلی", "فاصله‌لبه‌راست", "فاصله‌لبه‌چپ", "فاصله‌پایین", "فاصله‌پشت", "فشرده", "فضا", "فضاهای‌ثابت", "فضای‌بالا", "فضای‌برش", "فضای‌ثابت", "فضای‌سفید", "فضای‌سفیدصحیح", "فضای‌پایین", "فوری‌به‌لیست", "فوری‌بین‌لیست", "قالبی", "لوح‌مقایسه", "ماه", "متغیر متن", "متن‌برچسب", "متن‌حاشیه", "متن‌سر", "متن‌پانوشت", "محیط", "مراجعه", "مرجع", "مرجع‌صفحه", "مرجع‌متن", "مرحله‌سر", "مسکن", "معنی‌واحد", "مقایسه‌گروه‌رنگ", "مقدارخاکستری", "مقداررنگ", "مقیاس", "منفی", "منوی‌پانل", "مولفه", "مکان", "مکان‌متن", "میدان", "میدانهای‌گزارش", "میدان‌شبیه‌سازی", "میدان‌پشته", "میدان‌کپی", "میله‌تطابق", "میله‌رنگ", "میله‌پانل", "ناشناس", "نام‌ماکرو", "نسخه", "نسخه‌نشانه", "نشانه‌گذاری", "نشانه‌گذاری‌زوج", "نشر", "نصب‌زبان", "نقطه‌ها", "نقل", "نقل‌قول", "نم", "نماد", "نمادسر", "نمادلیست", "نمایش‌آرایش", "نمایش‌بارگذاریها", "نمایش‌بستها", "نمایش‌توری", "نمایش‌رنگ", "نمایش‌شکلهای‌خارجی", "نمایش‌طرح‌بندی", "نمایش‌قالب", "نمایش‌قلم‌بدنه", "نمایش‌لوح", "نمایش‌مجموعه‌علامت", "نمایش‌محیط‌قلم‌بدنه", "نمایش‌میدانها", "نمایش‌چاپ", "نمایش‌گروه‌رنگ", "نوشتارزوج", "هدایت", "پا", "پابا", "پانوشت", "پایان‌آرایش", "پایان‌آرایش‌ستون", "پایان‌بازبینی", "پایان‌بلوک‌حاشیه", "پایان‌ترکیب", "پایان‌تصحیح‌خط", "پایان‌تطابق", "پایان‌تنظیم", "پایان‌تولید", "پایان‌جدول", "پایان‌جدولها", "پایان‌خط", "پایان‌خطها", "پایان‌خط‌حاشیه", "پایان‌خط‌متن", "پایان‌رنگ", "پایان‌ستونها", "پایان‌سراسری", "پایان‌شماره‌گذاری‌خط", "پایان‌غیرفشرده", "پایان‌فشرده", "پایان‌متن", "پایان‌مجموعه‌ستون", "پایان‌محیط", "پایان‌مخالف", "پایان‌موضعی", "پایان‌مولفه", "پایان‌مکان‌گذاری", "پایان‌نازکتر", "پایان‌نسخه", "پایان‌نقل‌قول", "پایان‌نوشتار", "پایان‌پانوشتهای‌موضعی", "پایان‌پروفایل", "پایان‌پروژه", "پایان‌پس‌زمینه", "پایان‌پوشش", "پایان‌کد", "پایین", "پرده", "پروژه", "پرکردن‌میدان", "پس‌زمینه", "پیروی‌نسخه", "پیروی‌نسخه‌پروفایل", "پیروی‌پروفایل", "چاپ‌ارتفاع‌برگ", "چاپ‌عرض‌برگ", "چوبخط", "چپ‌چین", "کاغذزوج", "کسر", "کشیده", "کلمه‌حاشیه", "کلمه‌راست", "گیره", "یادداشت", "یک‌جا", "یک‌خط" },
- ["ro"]={ "CAP", "CUVANT", "CUVINTE", "Cap", "Caps", "Cuvant", "Cuvinte", "KAP", "Kap", "Kaps", "LUNA", "Litera", "Litere", "Numere", "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", "arg", "ascundeblocuri", "atleftmargin", "atrightmargin", "baraculoare", "barainteractiune", "barasincronizare", "blanc", "but", "butoaneinteractiune", "buton", "butonmeniu", "camp", "campumplere", "cap", "chapter", "chem", "citat", "clip", "cloneazacamp", "coloana", "comment", "comparagrupculoare", "comparapaleta", "completeazanumarpagina", "completecombinedlist", "completelistoffloats", "completelistofsorts", "completelistofsynonyms", "completeregister", "componenta", "convertestenumar", "copiazacamp", "corecteazaspatiualb", "coupledregister", "crlf", "culoare", "culoaregri", "cupleazadocument", "cupleazamarcaje", "cupleazaregistru", "cutspace", "cuvantdreapta", "cuvantmarginal", "data", "datacurenta", "datareferit", "decrementnumber", "decupleazamarcaje", "definebodyfontDEF", "definebodyfontREF", "definecolumnbreak", "definecolumnset", "definecombination", "definedfont", "definefontfeature", "definefonthandling", "defineindentedtext", "defineinmargin", "defineitemgroup", "definelayer", "definelayout", "definemathalignment", "definepagebreak", "defineplacement", "defineste", "definesteaccent", "definesteantet", "definesteblanc", "definestebloc", "definesteblocsectiune", "definestebuffer", "definestecamp", "definestecampprincipal", "definestecaracter", "definestecomanda", "definesteconversie", "definesteculoare", "definestedescriere", "definestedimensiunehartie", "definesteenumerare", "definesteeticheta", "definestefloat", "definestefont", "definestefontraw", "definestefonttext", "definesteformatreferinte", "definestegrupculori", "definestehbox", "definesteinconjurare", "definestelista", "definestelistacombinata", "definestelistareferinte", "definestelogo", "definestemakeup", "definestemarcaje", "definestemediulfonttext", "definestemeniuinteractiune", "definesteoutput", "definesteoverlay", "definestepaleta", "definesteparagraf", "definestepozitietext", "definesteprofil", "definesteprogram", "definestereferinte", "definesteregistru", "definesterigla", "definestesablontabel", "definestesectiune", "definestesimbol", "definestesimbolfigura", "definestesinonim", "definestesinonimfont", "definestesortare", "definestestartstop", "definestestil", "definestestilfont", "definestestivacampuri", "definestesubcamp", "definestetabulatori", "definestetext", "definestetexteinconjurate", "definestetextinconjurat", "definestetyping", "definestevariabilatext", "definesteversiune", "definetype", "definetypeface", "description", "despre", "determinacaracteristicilelistei", "determinacaracteristiciregistru", "determinanumartitlu", "dezactiveazameniuinteractiune", "dimensiune", "din", "distantaantet", "distantacolt", "distantacoltdreapta", "distantacoltstanga", "distantajos", "distantamargine", "distantamarginedreapta", "distantamarginestanga", "distantasubsol", "distantasus", "domiciliu", "dute", "dutebox", "dutepagina", "ecran", "el", "element", "emptylines", "enumeration", "eticheta", "etichete", "fact", "faraaliniat", "faradimensiune", "farafisiere", "faraliniiantetsisubsol", "faraliniisussijos", "faralista", "faramarcaje", "faraspatiu", "faraspatiualb", "figuraexterna", "firdepar", "folosesteURL", "folosestebloc", "folosestecodificarea", "folosestecomenzi", "folosestedirector", "folosestedocumentextern", "folosestefiguraexterna", "folosestefisiereexterne", "folosestefisierextern", "folosestemodul", "folosestemodule", "folosestemuzicaexterna", "folosestereferinte", "folosestescriptJS", "folosestesimboluri", "folosestespeciale", "folosesteurl", "footnotetext", "forteazablocuri", "fractie", "framed", "framedtext", "fundal", "gatablocuri", "getnumber", "grid", "grosimelinie", "hartiedubla", "headsym", "hl", "immediatebetweenlist", "immediatetolist", "impachetat", "impartefloat", "in", "inalt", "inaltamargine", "inaltimeantet", "inaltimehartie", "inaltimehartieimprimanta", "inaltimejos", "inaltimelista", "inaltimemakeup", "inaltimesubsol", "inaltimesus", "inaltimetext", "indentation", "indreapta", "inframed", "ininner", "injos", "inlinie", "inmaframed", "inmargineadreapta", "inmargineastanga", "inneredgedistance", "inneredgewidth", "innermargindistance", "innermarginwidth", "inouter", "inparteadreapta", "inparteastanga", "instalarelimba", "instanga", "intins", "jos", "jossus", "kap", "la", "labeling", "lapagina", "latimecoltdreapta", "latimecoltstanga", "latimecolturi", "latimehartie", "latimehartieimprimanta", "latimelista", "latimemakeup", "latimemargine", "latimemarginedreapta", "latimemarginestanga", "latimetext", "leg", "limba", "limbaprincipala", "liniemargine", "linieneagra", "liniesubtire", "linieumplere", "liniinegre", "liniisubtiri", "listsymbol", "litera", "litere", "loadsorts", "loadsynonyms", "logcampuri", "luna", "lungimelista", "maframed", "mapfontsize", "mar", "marcaje", "marcheazaversiune", "marginal", "matematica", "mediaeval", "mediu", "meniuinteractiune", "minicitat", "moveformula", "movesidefloat", "mutapegrid", "name", "navigating", "necunoscut", "nextsection", "niveltitlu", "nocap", "nokap", "nop", "nota", "notasubsol", "numarformula", "numarincrement", "numarpagina", "numarsubformula", "numartitlu", "numartitlucurent", "numartotalpagini", "numberofsubpages", "nume", "numere", "numereromane", "numeunitate", "nutesta", "olinie", "outeredgedistance", "outeredgewidth", "outermargindistance", "outermarginwidth", "overbar", "overbars", "overstrike", "overstrikes", "pagedepth", "pageoffset", "pagina", "paginadubla", "paragraph", "part", "pastreazablocuri", "pelung", "placefloat", "placeheadnumber", "placeheadtext", "placelistoffloats", "placelistofsorts", "placelistofsynonyms", "placerawlist", "placereferencelist", "plaseazapegrid", "plaseazasemnecarte", "potrivestecamp", "pozitie", "pozitietext", "proceseazabloc", "proceseazapagina", "produs", "program", "proiect", "publicatie", "puncte", "punedeasuprafiecareia", "punefatainfata", "puneformula", "punelegenda", "punelista", "punelistacombinata", "punelogouri", "punenotesubsol", "punenotesubsollocale", "punenumarpagina", "puneregistru", "punerigla", "punesubformula", "punevariabilatext", "ran", "ref", "refa", "referinta", "referintapagina", "referintatext", "referit", "referring", "reflexie", "register", "remarca", "reservefloat", "reset", "reseteazamarcaje", "resetnumber", "resettextcontent", "riglatext", "rigleumplere", "roteste", "saripesteblocuri", "scala", "scriebuffer", "scrieinlista", "scrieinlistareferinte", "scrieinregistru", "scrieintreliste", "section", "seeregister", "selecteazablocuri", "selecteazahartie", "selecteazaversiune", "semncarte", "setarebarasincronizare", "setareitemization", "setarelimba", "setareoutput", "setarepozitie", "setaresincronizare", "setari", "seteazaaliniat", "seteazaalinierea", "seteazaantet", "seteazaaranjareapag", "seteazaaspect", "seteazabarainteractiune", "seteazablanc", "seteazabloc", "seteazablocsectiune", "seteazablocurimarginale", "seteazabuffer", "seteazabutoane", "seteazacamp", "seteazacampuri", "seteazaclipping", "seteazacoloane", "seteazacombinari", "seteazacomentariu", "seteazacomentariupagina", "seteazaculoare", "seteazaculori", "seteazadefinireanotasubsol", "seteazadescriere", "seteazadimensiunihartie", "seteazaecrane", "seteazaecraninteractiune", "seteazaelemente", "seteazaenumerare", "seteazafiguriexterne", "seteazafloat", "seteazafloats", "seteazafonttext", "seteazaformulare", "seteazaformule", "seteazafundal", "seteazafundaluri", "seteazagrosimelinie", "seteazaimpartireafloat", "seteazainconjurat", "seteazaingust", "seteazainteractiunea", "seteazajos", "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", "seteazapozitietext", "seteazaprofile", "seteazaprograme", "seteazapublicatii", "seteazareferinte", "seteazaregistru", "seteazarigla", "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", "seteazavariabilatext", "seteazaversiuni", "setnumber", "settextcontent", "setupanswerarea", "setupcolumnset", "setupcolumnsetlines", "setupcolumnsetstart", "setupfonthandling", "setupfontsynonym", "setupindentedtext", "setupinterlinespace2", "setupitemgroup", "setuplistalternative", "setupmathalignment", "setupnumber", "setuppaper", "setupplacement", "setupstartstop", "setvariabilatext", "sim", "simbol", "sincronizeaza", "sort", "spatiifixate", "spatiu", "spatiualb", "spatiufixat", "spatiujos", "spatiuspate", "spatiusus", "startalignment", "startaliniere", "startblocmarginal", "startbuffer", "startcitat", "startcodificare", "startcoloane", "startcolumnmakeup", "startcolumns", "startcolumnset", "startcombinare", "startcombination", "startcomment", "startcomponenta", "startcorectielinie", "startculoare", "startdescription", "startdocument", "startenumeration", "startfact", "startfigura", "startfigure", "startfloattext", "startformula", "startframedtext", "startfundal", "startglobal", "starthiding", "startimpachetat", "startingust", "startitemgroup", "startlegend", "startline", "startlinecorrection", "startlinenumbering", "startlines", "startlinie", "startliniemargine", "startlinii", "startlocal", "startlocalenvironment", "startlocalfootnotes", "startmakeup", "startmarginblock", "startmediu", "startmeniuinteractiune", "startnamemakeup", "startnarrower", "startneimpachetat", "startnotesubsollocale", "startnumerotarelinii", "startopozit", "startopposite", "startoverlay", "startoverview", "startparagraph", "startpositioning", "startpostponing", "startpozitionare", "startprodus", "startprofil", "startprofile", "startproiect", "startraster", "startregister", "startriglatext", "startsetsimboluri", "startsincronizare", "startsymbolset", "startsynchronization", "starttabel", "starttabele", "starttable", "starttables", "starttabulate", "starttext", "starttyping", "startunpacked", "startversiune", "stivacampuri", "stopalignment", "stopaliniere", "stopblobal", "stopblocmarginal", "stopbuffer", "stopcitat", "stopcodificare", "stopcoloane", "stopcolumnmakeup", "stopcolumns", "stopcolumnset", "stopcombinare", "stopcombination", "stopcomment", "stopcomponenta", "stopcorectielinie", "stopculoare", "stopdescription", "stopdocument", "stopenumeration", "stopfact", "stopfigure", "stopfloattext", "stopformula", "stopframedtext", "stopfundal", "stophiding", "stopimpachetat", "stopingust", "stopitemgroup", "stoplegend", "stopline", "stoplinecorrection", "stoplinenumbering", "stoplines", "stoplinie", "stopliniemargine", "stoplinii", "stoplocal", "stoplocalenvironment", "stoplocalfootnotes", "stopmakeup", "stopmarginblock", "stopmediu", "stopmeniuinteractiune", "stopnamemakeup", "stopnarrower", "stopneimpachetat", "stopnotesubsollocale", "stopnumerotarelinii", "stopopozit", "stopopposite", "stopoverlay", "stopoverview", "stopparagraph", "stoppositioning", "stoppostponing", "stoppozitionare", "stopprodus", "stopprofil", "stopprofile", "stopproiect", "stopraster", "stopriglatext", "stopsincronizare", "stopsymbolset", "stopsynchronization", "stoptabel", "stoptabele", "stoptable", "stoptables", "stoptabulate", "stoptext", "stoptyping", "stopunpacked", "stopversiune", "sub", "subject", "subpagenumber", "subsection", "subsubject", "subsubsection", "subsubsubject", "synonym", "tab", "testcolumn", "testpage", "tex", "texteticheta", "textmarginal", "texttitlu", "textumplere", "title", "titlu", "titlumarginal", "tooltip", "traduce", "trecilafontraw", "trecilafonttext", "txt", "typ", "type", "typefile", "underbar", "underbars", "undeva", "urmeazaprofil", "urmeazaversiune", "urmeazaversiuneprofil", "useXMLfilter", "usedirectory", "usetypescript", "usetypescriptfile", "valoareculoare", "valoaregri", "variabilatext", "versiune", "vl", "zidinsaptamana" },
+ ["cs"]={ "CAP", "Cap", "Caps", "Cisla", "KAP", "Kap", "Kaps", "MESIC", "Rimskecislice", "SLOVA", "SLOVO", "Slova", "Slovo", "VSEDNIDEN", "Znak", "Znaky", "aktualnicislonadpisu", "aktualnidatum", "appendix", "arg", "atleftmargin", "atrightmargin", "barevnalista", "barva", "bilemisto", "bottomspace", "bublinkovanapoveda", "bydliste", "bypassblocks", "cap", "celkovypocetstran", "cernalinka", "cernelinky", "chapter", "chem", "cisla", "cislonadpisu", "cislopodrovnice", "cislorovnice", "cislostrany", "citace", "citovat", "comment", "completecombinedlist", "completelistoffloats", "completelistofsorts", "completelistofsynonyms", "completepagenumber", "completeregister", "coupledregister", "crlf", "cutspace", "datum", "decrementnumber", "definebodyfontDEF", "definebodyfontREF", "definecolumnbreak", "definecolumnset", "definecombination", "definedfont", "definefontfeature", "definefonthandling", "defineindentedtext", "defineinmargin", "defineitemgroup", "definelayer", "definelayout", "definemathalignment", "definepagebreak", "defineplacement", "definerawfont", "definerule", "definetextposition", "definetextvariable", "definetype", "definetypeface", "definuj", "definujakcent", "definujbarvu", "definujblok", "definujbloksekce", "definujbuffer", "definujfont", "definujformatodkazu", "definujhbox", "definujhlavnipole", "definujinterakcnimenu", "definujkombinovanyseznam", "definujkonverzi", "definujlogo", "definujnadpis", "definujobrazeksymbol", "definujodkaz", "definujodstavce", "definujopis", "definujoramovani", "definujoramovanytext", "definujpaletu", "definujplvouciobjekt", "definujpodpole", "definujpole", "definujpopis", "definujpopisek", "definujprekryv", "definujpreskok", "definujprikaz", "definujprofil", "definujprogram", "definujprostredizakladnihofontu", "definujrejstrik", "definujsablonutabulky", "definujsekci", "definujseznam", "definujseznamodkazu", "definujskupinubarev", "definujstartstop", "definujstyl", "definujstylfontu", "definujsymbol", "definujsynonumumfontu", "definujsynonyma", "definujtabelaci", "definujtext", "definujtrideni", "definujupravu", "definujvelikostpapiru", "definujverzi", "definujvycet", "definujvystup", "definujzakladnifont", "definujzasobnikpoli", "definujznaceni", "definujznak", "delkaseznamu", "description", "dodrzujprofil", "dodrzujverzi", "dodrzujverziprofilu", "dvoustrannypapir", "emptylines", "enumeration", "externiobraz", "fakt", "footnotetext", "forceblocks", "framedtext", "getnumber", "headsym", "hl", "hlavnijazyk", "hlavniuroven", "hodnotabarvy", "hodnotasedi", "immediatebetweenlist", "immediatetolist", "indentation", "ininner", "inneredgedistance", "inneredgewidth", "innermargindistance", "innermarginwidth", "inouter", "instalacejazyka", "interakcnilista", "interakcnitlacitka", "interaktivnimenu", "jazyk", "jdidolu", "jdina", "jdinabox", "jdinastranu", "jmeno", "kap", "klonujpole", "komponenta", "konvertujcislo", "kopirujpole", "korekcebilehomista", "labeling", "leg", "listsymbol", "loadsorts", "loadsynonyms", "maoramovani", "mapfontsize", "marginalnilinka", "marginalninadpis", "marginalnislovo", "marginalnitext", "matematika", "mazaramovani", "mediaeval", "meritko", "mesic", "mezera", "moveformula", "movesidefloat", "mrizka", "nadpis", "nadruhyokraj", "nalevo", "nalevyokraj", "name", "naokraj", "napravo", "napravyokraj", "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", "nastavkomentarstrany", "nastavlegendu", "nastavmarginalie", "nastavmarginalniblok", "nastavmarginalnilinky", "nastavmeziradkovoumezeru", "nastavnadpis", "nastavnadpisy", "nastavodkazovani", "nastavodsazovani", "nastavodstavce", "nastavopis", "nastavoramovanetexty", "nastavoramovani", "nastavorez", "nastavotoceni", "nastavpaletu", "nastavplvouciobjekt", "nastavplvouciobjekty", "nastavpodcislostrany", "nastavpodtrzeni", "nastavpole", "nastavpolozky", "nastavpopisek", "nastavpopisky", "nastavpopisy", "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", "navigating", "nejakyradek", "nekde", "nextsection", "neznamo", "nivy", "nizky", "nocap", "nokap", "nop", "numberofsubpages", "obrazovka", "odkaz", "odkaznadatum", "odkaznastranu", "odkaznatext", "odkazujici", "odsazenishora", "odsazenizleva", "odsazovani", "okr", "opakovat", "opis", "opissoubor", "oramovani", "oref", "orez", "otocit", "outeredgedistance", "outeredgewidth", "outermargindistance", "outermarginwidth", "overbar", "overbars", "overstrike", "overstrikes", "oznaceni", "oznacverzi", "pagedepth", "pageoffset", "paragraph", "parovastrana", "part", "pis", "placefloat", "placeheadnumber", "placeheadtext", "placelistoffloats", "placelistofsorts", "placelistofsynonyms", "placepagenumber", "placerawlist", "placereferencelist", "placerule", "placetextvariable", "plnezneni", "pol", "pole", "polozka", "polozky", "popisky", "poppisek", "porovnejpaletu", "porovnejskupinubarev", "positiontext", "pozadi", "pozice", "poznamka", "poznamkapodcarou", "pref", "prelozit", "premistinamrizku", "prepninazakladnifont", "preskoc", "prizpusobivepole", "prizpusobvzhled", "produkt", "program", "projekt", "propojeneznaceni", "propojenydokument", "propojenyrejstrik", "prostredi", "publikace", "ran", "ref", "register", "reservefloat", "reset", "resetnumber", "resettextcontent", "resetznaceni", "rimskecislice", "rozdelplvouciobjekt", "rozmer", "rozpojeneznaceni", "roztazene", "schovejbloky", "section", "sedabarva", "seeregister", "setnumber", "settextcontent", "settextvariable", "setupanswerarea", "setupcolumnset", "setupcolumnsetlines", "setupcolumnsetstart", "setupfonthandling", "setupfontsynonym", "setupforms", "setupindentedtext", "setupinterlinespace2", "setupitemgroup", "setuplistalternative", "setupmathalignment", "setupnumber", "setuppaper", "setupplacement", "setuprule", "setupstartstop", "setupstrut", "setuptextposition", "setuptextvariable", "sirkalevehookraje", "sirkalevemarginalie", "sirkamarginalie", "sirkaokraje", "sirkapapiru", "sirkapravehookraje", "sirkapravemarginalie", "sirkasazby", "sirkaseznamu", "sirkatextu", "sirkatiskpapiru", "sloupec", "slovovpravo", "sort", "spodek", "stanovcharakteristickuseznamu", "stanovcislonadpisu", "startalignment", "startbarva", "startbuffer", "startcislovaniradku", "startcitace", "startcolumnmakeup", "startcolumns", "startcolumnset", "startcombination", "startcomment", "startdescription", "startdocument", "startdokument", "startenumeration", "startfakt", "startfigure", "startfloattext", "startformula", "startframedtext", "startglobalni", "starthiding", "startinteraktivnimenu", "startitemgroup", "startkodovani", "startkomponenta", "startkorekceradku", "startlegend", "startline", "startlinecorrection", "startlinenumbering", "startlines", "startlocal", "startlocalenvironment", "startlocalfootnotes", "startlokalni", "startlokalnipoznamkypodcarou", "startmakeup", "startmarginalniblok", "startmarginalnilinka", "startmarginblock", "startnamemakeup", "startnarrower", "startnezhustene", "startobraz", "startopposite", "startoverlay", "startoverview", "startparagraph", "startpositioning", "startpostponing", "startpozadi", "startprehled", "startprekryv", "startprodukt", "startprofil", "startprofile", "startprojekt", "startprostredi", "startprotejsek", "startradek", "startradky", "startrastr", "startregister", "startsadasymbolu", "startsloupce", "startspojeni", "startsymbolset", "startsynchronizace", "startsynchronization", "starttable", "starttables", "starttabulate", "starttabulka", "starttabulky", "starttext", "starttextovalinka", "starttyping", "startumistovani", "startunpacked", "startuprava", "startverze", "startzarovnavani", "startzhustene", "startzuzeni", "stopalignment", "stopbarva", "stopbuffer", "stopcislovaniradku", "stopcitace", "stopcolumnmakeup", "stopcolumns", "stopcolumnset", "stopcombination", "stopcomment", "stopdescription", "stopdocument", "stopdokument", "stopenumeration", "stopfakt", "stopfigure", "stopfloattext", "stopformula", "stopframedtext", "stopglobalni", "stophiding", "stopinteraktivnimenu", "stopitemgroup", "stopkodovani", "stopkomponenta", "stopkorekceradku", "stoplegend", "stopline", "stoplinecorrection", "stoplinenumbering", "stoplines", "stoplocal", "stoplocalenvironment", "stoplocalfootnotes", "stoplokalni", "stoplokalnipoznamkypodcarou", "stopmakeup", "stopmarginalniblok", "stopmarginalnilinka", "stopmarginblock", "stopnamemakeup", "stopnarrower", "stopnezhustene", "stopopposite", "stopoverlay", "stopoverview", "stopparagraph", "stoppositioning", "stoppostponing", "stoppozadi", "stopprehled", "stopprekryv", "stopprodukt", "stopprofil", "stopprofile", "stopprojekt", "stopprostredi", "stopprotejsek", "stopradek", "stopradky", "stoprastr", "stopsloupce", "stopspojeni", "stopsymbolset", "stopsynchronizace", "stopsynchronization", "stoptable", "stoptables", "stoptabulate", "stoptabulka", "stoptabulky", "stoptext", "stoptextovalinka", "stoptyping", "stopumistovani", "stopunpacked", "stopuprava", "stopverze", "stopzarovnavani", "stopzhustene", "stopzuzeni", "strana", "sub", "subject", "subpagenumber", "subsection", "subsubject", "subsubsection", "subsubsubject", "switchtorawfont", "sym", "symbol", "synchronizacnilista", "synchronizovat", "synonym", "tab", "tecky", "tenkalinka", "tenkelinky", "testcolumn", "testpage", "tex", "texthlavicky", "textovalinka", "textpopisku", "textvariable", "title", "tlacitko", "tlacitkomenu", "tloustkacary", "tref", "tvrdamezera", "tvrdemezery", "txt", "typebuffer", "ukazbarvu", "ukazexterniobrazy", "ukazmrizku", "ukaznastaveni", "ukazpaletu", "ukazpodpery", "ukazpole", "ukazpostredizakladnihofontu", "ukazramecek", "ukazsadusymbolu", "ukazskupinubarev", "ukazupravu", "ukazvytisk", "ukazvzhled", "ukazzakladnifont", "umistikombinovanyseznam", "umistilegendu", "umistiloga", "umistilokalnipoznamkypodcarou", "umistinadsebe", "umistinamrizku", "umistipodrovnici", "umistipoznamkypodcarou", "umistirejstrik", "umistirovnici", "umistiseznam", "umistivedlesebe", "umistizalozky", "underbar", "underbars", "urcicharakteristikurejstriku", "useXMLfilter", "usedirectory", "usetypescript", "usetypescriptfile", "uzijJSscripts", "uzijURL", "uzijadresar", "uzijbloky", "uzijexternidokument", "uzijexterniobraz", "uzijexternisoubor", "uzijexternisoubory", "uzijexternizvuk", "uzijkodovani", "uzijmodul", "uzijmoduly", "uzijodkazy", "uzijprikazy", "uzijspeciality", "uzijsymbol", "uzijurl", "verze", "vl", "vlasovalinka", "vlevo", "vpravo", "vradku", "vsedniden", "vyberbloky", "vyberpapir", "vyberverzi", "vyplnenytext", "vyplnovelinky", "vyplnovepole", "vyplnovyradek", "vyskahorejsku", "vyskapapiru", "vyskasazby", "vyskaseznamu", "vyskaspodku", "vyskatextu", "vyskatiskpapiru", "vyskaupati", "vyskazahlavi", "vysoky", "vyznam", "vzdalenosthorejsku", "vzdalenostlevehookraje", "vzdalenostlevemarginalie", "vzdalenostmarginalie", "vzdalenostokraje", "vzdalenostpravehookraje", "vzdalenostpravemarginalie", "vzdalenostspodku", "vzdalenostupati", "vzdalenostzahlavi", "zablokujinterakcnimenu", "zachovejbloky", "zadnamezera", "zadnebilemisto", "zadnedalsibloky", "zadnedalsisoubory", "zadnehorniadolniradky", "zadneodsazovani", "zadnezahlaviaupati", "zadneznaceni", "zadnyrozmer", "zadnyseznam", "zadnytest", "zalozka", "zapisdorejstriku", "zapisdoseznamu", "zapisdoseznamuodkazu", "zapismeziseznam", "zaramovani", "zarovnanonastred", "zarovnanovlevo", "zarovnanovpravo", "zasobnikpoli", "zaznamovepole", "zhustene", "ziskejbuffer", "ziskejznaceni", "zlomek", "znaceni", "znak", "znaky", "zpracujbloky", "zpracujstranu", "zrcadlit", "zref", "zvysujicicislo" },
+ ["de"]={ "Buchstabe", "Buchstaben", "CAP", "Cap", "Caps", "KAP", "Kap", "Kaps", "MONAT", "Roemischezahlen", "WOCHENTAG", "WOERTER", "WORT", "Woerter", "Wort", "Ziffern", "abstandlinkerrand", "abstandoben", "abstandrechterrand", "abstandunten", "amgitterausrichten", "amgitterneuausrichten", "appendix", "arg", "atleftmargin", "atrightmargin", "aufseite", "ausfuellfeld", "ausfuelltext", "ausschnitt", "bearbeitebloecke", "bearbeiteseite", "bedeutung", "behaltebloecke", "bei", "bemerkung", "benutzekodierung", "benutzespezielles", "benutzeverzeichnis", "beschrifteversion", "beschriftung", "bestimmekopfnummer", "bestimmelistencharakeristika", "bestimmeregistercharakteristika", "bildschirm", "blanko", "bookmark", "bottomspace", "breitelinkerrand", "breiterechterrand", "bruch", "buchstabe", "buchstaben", "but", "bypassblocks", "cap", "chapter", "chem", "comment", "completecombinedlist", "completelistoffloats", "completelistofsorts", "completelistofsynonyms", "completepagenumber", "completeregister", "coupledregister", "crlf", "cutspace", "datum", "decrementnumber", "definebodyfontDEF", "definebodyfontREF", "definecolumnbreak", "definecolumnset", "definecombination", "definedfont", "definefontfeature", "definefonthandling", "defineindentedtext", "defineinmargin", "defineitemgroup", "definelayer", "definelayout", "definemathalignment", "defineoutput", "definepagebreak", "defineplacement", "definerawfont", "definerule", "defineschriftsynonym", "definetextposition", "definetextvariable", "definetype", "definetypeface", "definiereabbsymbol", "definiereabsaetze", "definiereabschnitt", "definiereabschnittsblock", "definiereakzent", "definierebefehl", "definierebeschreibung", "definierebeschreibungen", "definierebeschriftung", "definiereblanko", "definiereblock", "definierefarbe", "definierefarbengruppe", "definierefeld", "definierefeldstapel", "definierefliesstext", "definierefliesstextumgebung", "definieregleitobjekt", "definierehauptfeld", "definierehbox", "definiereinteraktionsmenue", "definierekonversion", "definierelabel", "definiereliste", "definierelogo", "definieren", "definierenummerierung", "definiereoverlay", "definierepalette", "definierepapierformat", "definiereprofil", "definiereprogramme", "definierepuffer", "definierereferenz", "definierereferenzformat", "definierereferenzliste", "definiereregister", "definiereschrift", "definiereschriftstil", "definieresortieren", "definierestartstop", "definierestil", "definieresubfeld", "definieresymbol", "definieresynonyme", "definieretabellenvorlage", "definieretabulator", "definieretext", "definieretippen", "definiereueberschrift", "definiereumbruch", "definiereumrahmt", "definiereumrahmtertext", "definiereversion", "definierezeichen", "definierezusammengestellteliste", "description", "dimension", "doppelseite", "doppelseitigespapier", "drehen", "duennelinie", "duennerumriss", "einezeile", "einziehen", "emptylines", "entknuepfebeschriftung", "enumeration", "externeabbildung", "farbbalken", "farbe", "farbewert", "feld", "feldstapel", "festesspatium", "folgeprofil", "folgeprofilversion", "folgeversion", "footnotetext", "forceblocks", "format", "formelnummer", "framedtext", "fussnote", "fusszeileabstand", "fusszeilenhoehe", "gefuelltesrechteck", "gefuelltezeile", "geg", "gesamtseitenanzahl", "gestreckt", "getnumber", "gitter", "graufarbe", "grauwert", "haarlinie", "hauptsprache", "headsym", "heutigesdatum", "heutigeskopfnummer", "hintergrund", "hl", "hoch", "hoeheoben", "hoeheunten", "holebeschriftung", "holepuffer", "imlinken", "imlinkenrand", "immaumrise", "immediatebetweenlist", "immediatetolist", "imrechten", "imrechtenrand", "imumriss", "in", "inaktiviereinteraktionsmenue", "inanderermarginale", "indentation", "ininner", "inlinkermarginale", "inmarginalie", "inneredgedistance", "inneredgewidth", "innermargindistance", "innermarginwidth", "inouter", "inrechtermarginale", "installieresprache", "interaktionsbalken", "interaktionsknopfe", "interaktionsmenue", "inzeile", "irgendwo", "its", "kap", "keindimension", "keinebeschriftung", "keinebloeckemehr", "keinedateienmehr", "keinekopfundfusszeilen", "keineliste", "keinspatium", "keintest", "keinzeilenobenundunten", "keinzwischenraum", "kleinerdurchschuss", "klonierefeld", "knopf", "komponente", "konvertierezahl", "kopf", "kopfniveau", "kopfnummer", "kopfweite", "kopfzeilenabstand", "kopfzeilenhoehe", "kopierefeld", "korrigierezwischenraum", "label", "labeling", "labels", "labeltext", "leg", "liniendicke", "linkemarginalafstand", "linkemarginalbreite", "linksbuendig", "listenbreite", "listenhoehe", "listenlaenge", "listsymbol", "loadsorts", "loadsynonyms", "mapfontsize", "mar", "marginalafstand", "marginalbreite", "marginallinie", "marginaltext", "marginaltitel", "marginalwort", "mathematik", "maumrise", "mediaeval", "menueknopf", "monat", "moveformula", "movesidefloat", "nachunten", "name", "navigating", "nextsection", "nichteinziehen", "nocap", "nokap", "nop", "notiz", "numberofsubpages", "nummererhoehen", "outeredgedistance", "outeredgewidth", "outermargindistance", "outermarginwidth", "overbar", "overbars", "overstrike", "overstrikes", "pagedepth", "pageoffset", "papierbreite", "papierhoehe", "paragraph", "part", "passelayoutan", "passendfeld", "placefloat", "placeheadnumber", "placeheadtext", "placelistoffloats", "placelistofsorts", "placelistofsynonyms", "placepagenumber", "placerawlist", "placereferencelist", "placerule", "placetextvariable", "platzierebookmarks", "platziereformel", "platzierefussnoten", "platzierelegende", "platziereliste", "platzierelogo", "platzierelokalefussnoten", "platzierenebeneinander", "platziereregister", "platziereuntereinander", "platziereunterformel", "platzierezusammengestellteliste", "pos", "position", "positiontext", "posten", "printpapierbreite", "printpapierhoehe", "produkt", "programm", "projekt", "publikation", "punkt", "ran", "randabstand", "randbreite", "rechteck", "rechtecke", "rechtemarginalafstand", "rechtemarginalbreite", "rechtsbuendig", "ref", "referenz", "referieren", "register", "registrierefelder", "reservefloat", "resetnumber", "resettextcontent", "roemischezahlen", "ruecksetzten", "ruecksetztenbeschriftung", "rumpfweite", "satzbreite", "satzhoehe", "schreibezumregister", "schreibezurliste", "schreibezurreferenzliste", "schreibezwischenliste", "section", "seeregister", "seite", "seitenreferenz", "seitenummer", "setnumber", "settext", "settextvariable", "setupanswerarea", "setupcolumnset", "setupcolumnsetlines", "setupcolumnsetstart", "setupfonthandling", "setupfontsynonym", "setupforms", "setupindentedtext", "setupinterlinespace2", "setupitemgroup", "setuplistalternative", "setupmathalignment", "setupnumber", "setuppaper", "setupplacement", "setuprule", "setupstartstop", "setupstrut", "setuptextposition", "setuptextvariable", "showsymbolset", "sort", "spalte", "spatium", "spiegeln", "sprache", "startabbildung", "startalignment", "startausrichtung", "startbuffer", "startcolumnmakeup", "startcolumns", "startcolumnset", "startcombination", "startcomment", "startdescription", "startdocument", "startdokument", "startenger", "startenumeration", "startfarbe", "startfigure", "startfloattext", "startformula", "startframedtext", "startgeg", "startgegenueber", "startglobal", "startgrosserdurchschuss", "starthiding", "starthintergrund", "startinteraktionsmenue", "startitemgroup", "startkleinerdurchschuss", "startkodierung", "startkombination", "startkomponente", "startlegend", "startline", "startlinecorrection", "startlinenumbering", "startlines", "startlocal", "startlocalenvironment", "startlocalfootnotes", "startlokal", "startlokalefussnoten", "startmakeup", "startmarginalblock", "startmarginallinie", "startmarginblock", "startnamemakeup", "startnarrower", "startopposite", "startoverlay", "startoverview", "startparagraph", "startpositionieren", "startpositioning", "startpostponing", "startprodukt", "startprofil", "startprofile", "startprojekt", "startraster", "startregister", "startspalten", "startsymbolset", "startsynchronisation", "startsynchronization", "starttabelle", "starttabellen", "starttable", "starttables", "starttabulate", "starttext", "starttextlinie", "starttyping", "startueberblick", "startumbruch", "startumgebung", "startunpacked", "startversion", "startzeile", "startzeilen", "startzeilenkorrektur", "startzeilennumerierung", "startzitat", "stelleabsaetzeein", "stelleabsatznummerierungein", "stelleabschnittein", "stelleabschnittsblockein", "stelleanordnenein", "stelleaufzaehlungenein", "stelleausgabeein", "stelleausrichtungein", "stelleausschnittein", "stellebeschreibungein", "stellebeschriftungein", "stellebilderunterschriftein", "stellebildunterschriftein", "stellebindestrichein", "stelleblankoein", "stelleblockein", "stelledrehenein", "stelleduennerumrissein", "stelleeinziehenein", "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", "stelleseitenkommentarein", "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", "stopausrichtung", "stopbuffer", "stopcolumnmakeup", "stopcolumns", "stopcolumnset", "stopcombination", "stopcomment", "stopdescription", "stopdocument", "stopdokument", "stopenger", "stopenumeration", "stopfarbe", "stopfigure", "stopfloattext", "stopformula", "stopframedtext", "stopgeg", "stopgegenueber", "stopglobal", "stopgrosserdurchschuss", "stophiding", "stophintergrund", "stopinteraktionsmenue", "stopitemgroup", "stopkleinerdurchschuss", "stopkodierung", "stopkombination", "stopkomponente", "stoplegend", "stopline", "stoplinecorrection", "stoplinenumbering", "stoplines", "stoplocal", "stoplocalenvironment", "stoplocalfootnotes", "stoplokal", "stoplokalefussnoten", "stopmakeup", "stopmarginalblock", "stopmarginallinie", "stopmarginblock", "stopnamemakeup", "stopnarrower", "stopopposite", "stopoverlay", "stopoverview", "stopparagraph", "stoppositionieren", "stoppositioning", "stoppostponing", "stopprodukt", "stopprofil", "stopprofile", "stopprojekt", "stopraster", "stopspalten", "stopsymbolset", "stopsynchronisation", "stopsynchronization", "stoptabelle", "stoptabellen", "stoptable", "stoptables", "stoptabulate", "stoptext", "stoptextlinie", "stoptyping", "stopueberblick", "stopumbruch", "stopumgebung", "stopunpacked", "stopversion", "stopzeile", "stopzeilen", "stopzeilenkorrektur", "stopzeilennumerierung", "stopzitat", "sub", "subject", "subpagenumber", "subsection", "subsubject", "subsubsection", "subsubsubject", "switchtorawfont", "sym", "symbol", "synchronisationsbalken", "synchronisieren", "synonym", "tab", "teilegleitobjekt", "testcolumn", "testpage", "tex", "textbreite", "texthoehe", "textlinie", "textreferenz", "textvariable", "tief", "tiho", "tip", "tippedatei", "tippen", "tippepuffer", "title", "tooltip", "txt", "ueber", "ueberschrifttext", "uebersetzten", "umgebung", "umrahmt", "unbekant", "underbar", "underbars", "unterformelnummer", "useXMLfilter", "usedirectory", "usetypescript", "usetypescriptfile", "verbergebloecke", "vergleichefarbengruppe", "vergleichepalette", "verknuepfebeschriftung", "verknuepfedokument", "verknuepfregister", "version", "verweis", "verweisdatum", "verwendeJSscript", "verwendeURL", "verwendebefehl", "verwendebloecke", "verwendeexteresdokument", "verwendeexterneabbildung", "verwendeexternedatei", "verwendeexternedateien", "verwendeexternestonstueck", "verwendemodul", "verwendemodule", "verwendereferenzen", "verwendesymbole", "verwendeurl", "vl", "volleswort", "von", "waehlebloeckeaus", "waehlepapieraus", "waehleversionaus", "wechselezumfliesstext", "wiederholen", "wochentag", "wohnort", "wortrechts", "zeigedruck", "zeigeeinstellungen", "zeigeexterneabbildungen", "zeigefarbe", "zeigefarbengruppe", "zeigefelder", "zeigefliesstext", "zeigefliesstextumgebung", "zeigegitter", "zeigelayout", "zeigepalette", "zeigerahmen", "zeigestruts", "zeigeumbruch", "zentriert", "ziffern", "zitat", "zitieren", "zu", "zurbox", "zurseite", "zwischenraum" },
+ ["en"]={ "CAP", "Cap", "Caps", "Character", "Characters", "MONTH", "Numbers", "Romannumerals", "WEEKDAY", "WORD", "WORDS", "Word", "Words", "about", "adaptlayout", "adding", "appendix", "arg", "at", "atleftmargin", "atpage", "atrightmargin", "background", "backspace", "blackrule", "blackrules", "blank", "bookmark", "bottomdistance", "bottomheight", "bottomspace", "but", "button", "bypassblocks", "cap", "chapter", "character", "characters", "chem", "clip", "clonefield", "color", "colorbar", "colorvalue", "column", "comment", "comparecolorgroup", "comparepalet", "completecombinedlist", "completelistoffloats", "completelistofsorts", "completelistofsynonyms", "completepagenumber", "completeregister", "component", "convertnumber", "copyfield", "correctwhitespace", "coupledocument", "coupledregister", "couplemarking", "couplepage", "couplepaper", "coupleregister", "crlf", "currentdate", "currentheadnumber", "cutspace", "date", "decouplemarking", "decrementnumber", "define", "defineaccent", "defineblank", "defineblock", "definebodyfont", "definebodyfontDEF", "definebodyfontREF", "definebodyfontenvironment", "definebuffer", "definecharacter", "definecolor", "definecolorgroup", "definecolumnbreak", "definecolumnset", "definecombination", "definecombinedlist", "definecommand", "defineconversion", "definedescription", "definedfont", "defineenumeration", "definefield", "definefieldstack", "definefiguresymbol", "definefloat", "definefont", "definefontfeature", "definefonthandling", "definefontstyle", "definefontsynonym", "defineframed", "defineframedtext", "definehbox", "definehead", "defineindentedtext", "defineinmargin", "defineinteractionmenu", "defineitemgroup", "definelabel", "definelayer", "definelayout", "definelist", "definelogo", "definemainfield", "definemakeup", "definemarking", "definemathalignment", "defineoutput", "defineoverlay", "definepagebreak", "definepalet", "definepapersize", "defineparagraphs", "defineplacement", "defineprofile", "defineprogram", "definerawfont", "definereference", "definereferenceformat", "definereferencelist", "defineregister", "definerule", "definesection", "definesectionblock", "definesorting", "definestartstop", "definestyle", "definesubfield", "definesymbol", "definesynonyms", "definetabletemplate", "definetabulate", "definetext", "definetextbackground", "definetextposition", "definetextvariable", "definetype", "definetypeface", "definetyping", "defineversion", "description", "determineheadnumber", "determinelistcharacteristics", "determineregistercharacteristics", "dimension", "disableinteractionmenu", "domicile", "donttest", "edgedistance", "edgewidth", "emptylines", "enumeration", "environment", "externalfigure", "fact", "field", "fieldstack", "fillinfield", "fillinline", "fillinrules", "fillintext", "fitfield", "fixedspace", "fixedspaces", "followprofile", "followprofileversion", "followversion", "footerdistance", "footerheight", "footnote", "footnotetext", "forceblocks", "formulanumber", "fraction", "framed", "framedtext", "from", "getbuffer", "getmarking", "getnumber", "godown", "goto", "gotobox", "gotopage", "graycolor", "greyvalue", "grid", "hairline", "head", "headerdistance", "headerheight", "headlevel", "headnumber", "headsym", "headtext", "hideblocks", "high", "hl", "immediatebetweenlist", "immediatetolist", "in", "incrementnumber", "indentation", "indenting", "inframed", "infull", "ininner", "inleft", "inleftedge", "inleftmargin", "inline", "inmaframed", "inmargin", "inneredgedistance", "inneredgewidth", "innermargindistance", "innermarginwidth", "inothermargin", "inouter", "inright", "inrightedge", "inrightmargin", "installlanguage", "interactionbar", "interactionbuttons", "interactionmenu", "item", "items", "its", "keepblocks", "label", "labeling", "labels", "labeltext", "language", "leftaligned", "leftedgedistance", "leftedgewidth", "leftmargindistance", "leftmarginwidth", "leg", "linethickness", "listheight", "listlength", "listsymbol", "listwidth", "loadsorts", "loadsynonyms", "logfields", "lohi", "low", "maframed", "mainlanguage", "makeupheight", "makeupwidth", "mapfontsize", "mar", "margindistance", "marginrule", "margintext", "margintitle", "marginwidth", "marginword", "marking", "markversion", "mathematics", "mediaeval", "menubutton", "midaligned", "mirror", "month", "moveformula", "moveongrid", "movesidefloat", "name", "navigating", "nextsection", "nocap", "nodimension", "noheaderandfooterlines", "noindenting", "nolist", "nomarking", "nomoreblocks", "nomorefiles", "nop", "nospace", "note", "notopandbottomlines", "nowhitespace", "numberofsubpages", "numbers", "outeredgedistance", "outeredgewidth", "outermargindistance", "outermarginwidth", "overbar", "overbars", "overstrike", "overstrikes", "packed", "page", "pagedepth", "pagenumber", "pageoffset", "pagereference", "paperheight", "paperwidth", "paragraph", "part", "periods", "placebookmarks", "placecombinedlist", "placefloat", "placefootnotes", "placeformula", "placeheadnumber", "placeheadtext", "placelegend", "placelist", "placelistoffloats", "placelistofsorts", "placelistofsynonyms", "placelocalfootnotes", "placelogos", "placeongrid", "placeontopofeachother", "placepagenumber", "placerawlist", "placereferencelist", "placeregister", "placerule", "placesidebyside", "placesubformula", "placetextvariable", "position", "positiontext", "printpaperheight", "printpaperwidth", "processblocks", "processpage", "product", "program", "project", "publication", "quotation", "quote", "ran", "redo", "ref", "reference", "referral", "referraldate", "referring", "register", "remark", "reservefloat", "reset", "resetmarking", "resetnumber", "resettextcontent", "rightaligned", "rightedgedistance", "rightedgewidth", "rightmargindistance", "rightmarginwidth", "romannumerals", "rotate", "scale", "screen", "section", "seeregister", "selectblocks", "selectpaper", "selectversion", "setnumber", "settextcontent", "settextvariable", "setupalign", "setupanswerarea", "setuparranging", "setupbackground", "setupbackgrounds", "setupblackrules", "setupblank", "setupblock", "setupbodyfont", "setupbodyfontenvironment", "setupbottom", "setupbottomtexts", "setupbuffer", "setupbuttons", "setupcapitals", "setupcaption", "setupcaptions", "setupclipping", "setupcolor", "setupcolors", "setupcolumns", "setupcolumnset", "setupcolumnsetlines", "setupcolumnsetstart", "setupcombinations", "setupcombinedlist", "setupcomment", "setupdescriptions", "setupenumerations", "setupexternalfigures", "setupfield", "setupfields", "setupfillinlines", "setupfillinrules", "setupfloat", "setupfloats", "setupfloatsplitting", "setupfonthandling", "setupfontsynonym", "setupfooter", "setupfootertexts", "setupfootnotedefinition", "setupfootnotes", "setupforms", "setupformulae", "setupframed", "setupframedtexts", "setuphead", "setupheader", "setupheadertexts", "setupheadnumber", "setupheads", "setupheadtext", "setuphyphenmark", "setupindentedtext", "setupindenting", "setupinmargin", "setupinteraction", "setupinteractionbar", "setupinteractionmenu", "setupinteractionscreen", "setupinterlinespace", "setupinterlinespace2", "setupitemgroup", "setupitemizations", "setupitems", "setuplabeltext", "setuplanguage", "setuplayout", "setuplegend", "setuplinenumbering", "setuplines", "setuplinewidth", "setuplist", "setuplistalternative", "setupmakeup", "setupmarginblocks", "setupmarginrules", "setupmarking", "setupmathalignment", "setupnarrower", "setupnumber", "setupnumbering", "setupoppositeplacing", "setupoutput", "setuppagecomment", "setuppagenumber", "setuppagenumbering", "setuppagetransitions", "setuppalet", "setuppaper", "setuppapersize", "setupparagraphnumbering", "setupparagraphs", "setupplacement", "setuppositioning", "setupprofiles", "setupprograms", "setuppublications", "setupquote", "setupreferencelist", "setupreferencing", "setupregister", "setuprotate", "setuprule", "setupscreens", "setupsection", "setupsectionblock", "setupsorting", "setupspacing", "setupstartstop", "setupstrut", "setupsubpagenumber", "setupsymbolset", "setupsynchronization", "setupsynchronizationbar", "setupsynonyms", "setupsystem", "setuptab", "setuptables", "setuptabulate", "setuptext", "setuptextbackground", "setuptextposition", "setuptextrules", "setuptexttexts", "setuptextvariable", "setupthinrules", "setuptolerance", "setuptop", "setuptoptexts", "setuptype", "setuptyping", "setupunderbar", "setupurl", "setupversions", "setupwhitespace", "showbodyfont", "showbodyfontenvironment", "showcolor", "showcolorgroup", "showexternalfigures", "showfields", "showframe", "showgrid", "showlayout", "showmakeup", "showpalet", "showprint", "showsetups", "showstruts", "showsymbolset", "someline", "somewhere", "sort", "space", "splitfloat", "startalignment", "startbackground", "startbuffer", "startcoding", "startcolor", "startcolumnmakeup", "startcolumns", "startcolumnset", "startcombination", "startcomment", "startcomponent", "startdescription", "startdocument", "startenumeration", "startenvironment", "startfact", "startfigure", "startfloattext", "startformula", "startframed", "startframedtext", "startglobal", "starthiding", "startinteractionmenu", "startitemgroup", "startlegend", "startline", "startlinecorrection", "startlinenumbering", "startlines", "startlocal", "startlocalenvironment", "startlocalfootnotes", "startmakeup", "startmarginblock", "startmarginrule", "startnamemakeup", "startnarrower", "startopposite", "startoverlay", "startoverview", "startpacked", "startparagraph", "startpositioning", "startpostponing", "startproduct", "startprofile", "startproject", "startquotation", "startraster", "startregister", "startsymbolset", "startsynchronization", "starttable", "starttables", "starttabulate", "starttext", "starttextbackground", "starttextrule", "starttyping", "startunpacked", "startversion", "stopalignment", "stopbackground", "stopbuffer", "stopcoding", "stopcolor", "stopcolumnmakeup", "stopcolumns", "stopcolumnset", "stopcombination", "stopcomment", "stopcomponent", "stopdescription", "stopdocument", "stopenumeration", "stopenvironment", "stopfact", "stopfigure", "stopfloattext", "stopformula", "stopframed", "stopframedtext", "stopglobal", "stophiding", "stopinteractionmenu", "stopitemgroup", "stoplegend", "stopline", "stoplinecorrection", "stoplinenumbering", "stoplines", "stoplocal", "stoplocalenvironment", "stoplocalfootnotes", "stopmakeup", "stopmarginblock", "stopmarginrule", "stopnamemakeup", "stopnarrower", "stopopposite", "stopoverlay", "stopoverview", "stoppacked", "stopparagraph", "stoppositioning", "stoppostponing", "stopproduct", "stopprofile", "stopproject", "stopquotation", "stopraster", "stopsymbolset", "stopsynchronization", "stoptable", "stoptables", "stoptabulate", "stoptext", "stoptextbackground", "stoptextrule", "stoptyping", "stopunpacked", "stopversion", "stretched", "sub", "subformulanumber", "subject", "subpagenumber", "subsection", "subsubject", "subsubsection", "subsubsubject", "switchtobodyfont", "switchtorawfont", "sym", "symbol", "symoffset", "synchronizationbar", "synchronize", "synonym", "tab", "testcolumn", "testpage", "tex", "textheight", "textreference", "textrule", "textvariable", "textwidth", "thinrule", "thinrules", "title", "tooltip", "topdistance", "topheight", "topspace", "totalnumberofpages", "translate", "txt", "typ", "type", "typebuffer", "typefile", "underbar", "underbars", "unitmeaning", "unknown", "useJSscripts", "useURL", "useXMLfilter", "useblocks", "usecommands", "usedirectory", "useencoding", "useexternaldocument", "useexternalfigure", "useexternalfile", "useexternalfiles", "useexternalsoundtrack", "usemodule", "usemodules", "usereferences", "usespecials", "usesymbols", "usetypescript", "usetypescriptfile", "useurl", "version", "vl", "weekday", "whitespace", "wordright", "writebetweenlist", "writetolist", "writetoreferencelist", "writetoregister" },
+ ["fr"]={ "CAP", "Cap", "Caps", "Caractere", "Caracteres", "Chiffresromains", "JOURSEMAINE", "MOIS", "MOT", "MOTS", "Mot", "Mots", "Numeros", "a", "adaptedisposition", "affectenumero", "affectevariabletexte", "ajustechamp", "alaligne", "alapage", "aligneadroite", "aligneagauche", "aligneaumilieu", "appendix", "arg", "arriereplan", "atleftmargin", "atrightmargin", "baha", "barrecouleur", "barreinteraction", "barresynchronisation", "bas", "bouton", "boutonmenu", "boutonsinteraction", "but", "cacheblocs", "cap", "caractere", "caracteres", "champ", "changepolicebrute", "changepolicecorps", "chapter", "chem", "chiffresromains", "citation", "citer", "clip", "clonechamp", "colonne", "comment", "commentaire", "comparegroupecouleur", "comparepalette", "completecombinedlist", "completelistoffloats", "completelistofsorts", "completelistofsynonyms", "completenumeropage", "completeregistre", "composant", "composeenalinea", "concernant", "convertitnumero", "copitchamp", "corrigeespaceblanc", "couleur", "couleurgrise", "coupledocument", "coupledregister", "couplemarquage", "couplepapier", "coupleregistre", "crlf", "cutspace", "dactylographier", "dans", "dansautremarge", "dansborddroit", "dansbordgauche", "dansdroite", "dansgauche", "dansmarge", "dansmargedroite", "dansmargegauche", "date", "datecourante", "daterecommandation", "de", "decouplemarquage", "decrementenumero", "definebodyfontDEF", "definebodyfontREF", "definecombination", "definedfont", "definefontfeature", "definefonthandling", "defineframed", "defineframedtext", "defineindentedtext", "defineitemgroup", "definemathalignment", "defineplacement", "definetypeface", "definicaractere", "definit", "definitaccent", "definitbloc", "definitblocsection", "definitbuffer", "definitcalque", "definitchamp", "definitchampprincipal", "definitcommande", "definitconversion", "definitcouleur", "definitdactylo", "definitdansmarge", "definitdemarrestoppe", "definitdescription", "definitdisposition", "definitenumeration", "definitenvironnementpolicecorps", "definitetiquette", "definitflottant", "definitformatreference", "definitgroupecouleur", "definithbox", "definitjeucolonne", "definitliste", "definitlisteimbriquee", "definitlistereference", "definitlogo", "definitmakeup", "definitmarquage", "definitmenuinteraction", "definitnotepdp", "definitpalette", "definitparagraphes", "definitpilechamp", "definitpolice", "definitpolicebrute", "definitpolicecorps", "definitpositiontexte", "definitprofil", "definitprogramme", "definitreference", "definitregistre", "definitregle", "definitrevetement", "definitsautdecolonne", "definitsautdepage", "definitsection", "definitsortie", "definitsouschamp", "definitstyle", "definitstylepolice", "definitsymbole", "definitsymbolefigure", "definitsynonymepolice", "definitsynonymes", "definittabulation", "definittaillepapier", "definittete", "definittexte", "definittrametableau", "definittri", "definittype", "definitvariabletexte", "definitversion", "definitvide", "demarrealignement", "demarrearriereplan", "demarreblocmarge", "demarrecitation", "demarreciter", "demarrecodage", "demarrecolonnes", "demarrecombinaison", "demarrecompoetroite", "demarrecomposant", "demarrecorrectionligne", "demarrecouleur", "demarredegroupe", "demarredocument", "demarreenvironement", "demarrefigure", "demarreglobal", "demarregroupe", "demarrejeucolonne", "demarrejeusymboles", "demarreligne", "demarreligneregleetexte", "demarrelignes", "demarrelocal", "demarremakeup", "demarremargereglee", "demarrenotespdplocales", "demarrenumerotationligne", "demarreopposition", "demarrepositionnement", "demarreproduit", "demarreprofil", "demarreprojet", "demarreraster", "demarrerevetement", "demarresynchronisation", "demarretableau", "demarretableaux", "demarretexte", "demarreversion", "demarrevuedensemble", "deplaceformule", "deplacesurgrille", "description", "determinecaracteristiqueliste", "determinecaracteristiquesregistre", "determinenumerotete", "dimension", "distancebord", "distanceborddroit", "distancebordgauche", "distanceentete", "distanceinf", "distancemarge", "distancemargedroite", "distancemargegauche", "distancepdp", "distancesup", "domicile", "echelle", "ecran", "ecritdansliste", "ecritdanslistereference", "ecritentreliste", "ecritregistre", "el", "element", "elements", "emptylines", "enumeration", "environement", "espace", "espaceblanc", "espacefixe", "espaceinf", "espacesfixes", "espacesup", "etiquette", "etiquettes", "etire", "fait", "faitreference", "fichierdactylo", "figureexterne", "forceblocs", "fraction", "framed", "framedtext", "gardeblocs", "getnumber", "grille", "groupe", "haut", "hauteureditionpapier", "hauteurentete", "hauteurinf", "hauteurliste", "hauteurmakeup", "hauteurpapier", "hauteurpdp", "hauteursup", "hauteurtexte", "headsym", "hl", "immediatebetweenlist", "immediatetolist", "inconnu", "incrementenumero", "indentation", "inframed", "infull", "inhibemenuinteraction", "ininner", "inmframed", "inneredgedistance", "inneredgewidth", "innermargindistance", "innermarginwidth", "inouter", "installelangue", "joursemaine", "labeling", "labeltexte", "langue", "langueprincipale", "largeurbord", "largeurborddroit", "largeurbordgauche", "largeureditionpapier", "largeurligne", "largeurliste", "largeurmakeup", "largeurmarge", "largeurmargedroite", "largeurmargegauche", "largeurpapier", "largeurtexte", "leg", "ligneh", "lignenoire", "ligneregleetexte", "lignesnoires", "listesymbole", "llongueurliste", "loadsorts", "loadsynonyms", "logchamp", "mapfontsize", "mar", "margereglee", "marquage", "marquageversion", "marquepage", "mathematique", "mediaeval", "menuinteraction", "mframed", "mois", "montrecadre", "montrechamps", "montrecouleur", "montredisposition", "montreedition", "montreenvironnementpolicecorps", "montrefiguresexternes", "montregrille", "montregroupecouleur", "montrejeusymboles", "montremakeup", "montrepalette", "montrepolicecorps", "montrereglages", "montrestruts", "motdroit", "motmarge", "movesidefloat", "name", "navigating", "nextsection", "niveautete", "nocap", "nombredesouspages", "nombretotaldepages", "nommacro", "nop", "note", "notepdp", "numeroformule", "numeropage", "numeros", "numerosousformule", "numerotete", "numerotetecourant", "obtientmarquage", "oriente", "outeredgedistance", "outeredgewidth", "outermargindistance", "outermarginwidth", "overbar", "overbars", "overstrike", "overstrikes", "page", "pagedepth", "pagedouble", "pageoffset", "paragraph", "part", "pasplusdeblocs", "pasplusdefichiers", "periodes", "pilechamp", "placecoteacote", "placeflottant", "placeformule", "placelegende", "placelesunsaudessusdesautres", "placeliste", "placelisteinmbriquee", "placelistereference", "placelistoffloats", "placelistofsorts", "placelistofsynonyms", "placelogos", "placemarquespages", "placenotespdp", "placenotespdplocales", "placenumeropage", "placenumerotete", "placerawlist", "placeregistre", "placeregle", "placesousformule", "placesurgrille", "placetextetete", "placevariabletexte", "position", "positionnetexte", "prendbuffer", "produit", "programme", "projet", "publication", "qqpart", "ran", "raz", "razmarquage", "raznumero", "recommandation", "ref", "refait", "reference", "referencepage", "referencetexte", "reflete", "register", "reglealignement", "reglearrangement", "reglearriereplan", "reglearriereplans", "reglebarreinteraction", "reglebarresynchronisation", "reglebloc", "regleblocmarge", "regleblocsection", "regleboutons", "reglebuffer", "reglecapitales", "reglechamp", "reglechamps", "regleclipping", "reglecolonnes", "reglecombinaisons", "reglecommentaire", "reglecommentairepage", "reglecompoetroite", "reglecomposeenalinea", "reglecouleur", "reglecouleurs", "regledactylo", "regledansmarge", "regledemarrestoppe", "regledescriptions", "regledisposition", "regleecraninteraction", "regleecrans", "regleelements", "regleencadre", "regleentete", "regleenumerations", "regleenvironnementpolicecorps", "regleepaisseurligne", "regleespaceblanc", "regleespacement", "regleespacementinterligne", "reglefiguresexternes", "regleflottant", "regleflottants", "regleformulaires", "regleformules", "reglegroupeselements", "regleinf", "regleinteraction", "regleintitule", "regleintitules", "reglejeucolonne", "reglejeusymboles", "reglelabeltexte", "reglelangue", "reglelegende", "reglelignes", "reglelignesnoires", "reglelignesreglestexte", "regleliste", "reglelisteimbriquee", "reglelistereference", "reglemakeup", "reglemargereglee", "reglemarquage", "reglemarquagehyphenation", "reglemenuinteraction", "reglenotepdp", "reglenumero", "reglenumeropage", "reglenumerotation", "reglenumerotationligne", "reglenumerotationpage", "reglenumerotationparagraphe", "reglenumerotete", "regleoriente", "reglepalette", "reglepapier", "regleparagraphes", "reglepdp", "regleplacementopposition", "reglepolicecorps", "reglepositionnement", "reglepositiontexte", "regleprofils", "regleprogrammes", "reglepublications", "reglereferencage", "regleregistre", "regleregle", "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", "reglevariabletexte", "regleversions", "remplitchamp", "remplitligne", "remplitlignesreglees", "remplittexte", "reservefloat", "resettextcontent", "retourarriere", "sansalinea", "sansdimension", "sansespace", "sansespaceblanc", "sanslignesenteteetpdp", "sanslignessupetinf", "sansliste", "sansmarquage", "sanstest", "sauteblocs", "section", "seeregister", "selectionneblocs", "selectionnepapier", "selectionneversion", "sensunite", "separeflottant", "settext", "setupanswerarea", "setupcolumnsetlines", "setupcolumnsetstart", "setupfonthandling", "setupfontsynonym", "setupframedtexts", "setupindentedtext", "setupinterlinespace2", "setupitemgroup", "setuplistalternative", "setupmathalignment", "setupplacement", "sort", "sousnumeropage", "startalignment", "startarriereplan", "startbuffer", "startcitation", "startcolumnmakeup", "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", "stopcitation", "stopcolumnmakeup", "stopcolumns", "stopcombination", "stopcomment", "stopcompoetroite", "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", "stoppealignement", "stoppearriereplan", "stoppeblocmarge", "stoppecitation", "stoppecodage", "stoppecolonnes", "stoppecombinaison", "stoppecomposant", "stoppecorrectionligne", "stoppecouleur", "stoppedegroupe", "stoppedocument", "stoppeenvironement", "stoppeglobal", "stoppegroupe", "stoppejeucolonne", "stoppeligne", "stoppeligneregleetexte", "stoppelignes", "stoppelocal", "stoppemakeup", "stoppemargereglee", "stoppenotespdplocales", "stoppenumerotationligne", "stoppeopposition", "stoppepositionnement", "stoppeproduit", "stoppeprofil", "stoppeprojet", "stopperaster", "stopperevetement", "stoppesynchronisation", "stoppetableau", "stoppetableaux", "stoppetexte", "stoppeversion", "stoppevuedensemble", "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", "testcolumn", "testpage", "tete", "tex", "textemarge", "textenotepdp", "textetete", "title", "titremarge", "traduire", "traiteblocs", "traitepage", "traitfin", "traitsfins", "txt", "typ", "underbar", "underbars", "uneligne", "useXMLfilter", "usedirectory", "usetypescript", "usetypescriptfile", "utiliseJSscripts", "utiliseURL", "utiliseblocs", "utilisechemin", "utilisecommandes", "utilisedocumentexterne", "utiliseencodage", "utilisefichierexterne", "utilisefichiersexternes", "utilisefigureexterne", "utilisemodule", "utilisemodules", "utilisepsiteaudioexterne", "utilisereferences", "utilisespecialites", "utilisesymboles", "utiliseurl", "va", "vaalaboite", "vaalapage", "vaenbas", "valeurcouleur", "valeurgris", "variabletexte", "version", "vide", "vl" },
+ ["it"]={ "CAP", "Cap", "Caps", "GIORNOSETTIMANA", "Lettera", "Lettere", "MESE", "Numeri", "Numeriromani", "PAROLA", "PAROLE", "Parola", "Parole", "accoppiacarta", "accoppiadocumento", "accoppiamarcatura", "accoppiapagina", "accoppiaregistro", "adattacampo", "adattalayout", "al", "allineacentro", "allineadestra", "allineasinistra", "altezzacarta", "altezzacartastampa", "altezzacima", "altezzaelenco", "altezzafondo", "altezzaintestazione", "altezzamakeup", "altezzapdp", "altezzatesto", "ambiente", "ampiezzabordo", "ampiezzabordodestro", "ampiezzabordosinistro", "ampiezzacarta", "ampiezzacartastampa", "ampiezzaelenco", "ampiezzamakeup", "ampiezzamargine", "ampiezzamarginedestro", "ampiezzamarginesinistro", "ampiezzatesto", "ap", "apagina", "appendix", "arg", "atleftmargin", "atrightmargin", "barracolori", "barrainterazione", "barrasincronizzazione", "bastablocchi", "bastafile", "cambiaafontdeltesto", "campi", "camporiempimento", "cap", "capello", "chapter", "chim", "circondato", "citazione", "clip", "clonacampo", "colonna", "colore", "coloregrigio", "comment", "commento", "completecombinedlist", "completelistoffloats", "completelistofsorts", "completelistofsynonyms", "completeregister", "componenet", "confrontagruppocolori", "confrontatavolozza", "convertinumero", "copiacampo", "correggispaziobianco", "coupledregister", "crlf", "cutspace", "da", "daqualcheparte", "data", "datadioggi", "datareferral", "decrementnumber", "definebodyfontDEF", "definebodyfontREF", "definecolumnbreak", "definecombination", "definedfont", "definefontfeature", "definefonthandling", "defineindentedtext", "defineinmargin", "defineitemgroup", "definelayer", "definemathalignment", "definepagebreak", "defineplacement", "definetypeface", "definisci", "definisciaccento", "definisciambientefontdeltesto", "definisciblocco", "definiscibloccosezione", "definiscibuffer", "definiscicampo", "definiscicampoprincipale", "definiscicapoversi", "definiscicarattere", "definiscicolore", "definiscicomando", "definisciconversione", "definiscidescrizione", "definiscidimensionicarta", "definiscielenco", "definiscielencocombinato", "definiscienumerazione", "definiscietichetta", "definiscifigurasimbolo", "definiscifont", "definiscifontdeltesto", "definiscifontgrezzo", "definisciformatoriferimento", "definiscigruppocolonne", "definiscigruppocolori", "definiscihbox", "definisciincorniciato", "definisciiniziatermina", "definiscilayout", "definiscilinea", "definiscilistariferimenti", "definiscilogo", "definiscimakeup", "definiscimarcatura", "definiscimenuinterazione", "definiscimodellotabella", "definiscioggettomobile", "definisciordinamento", "definiscioutput", "definisciposizionetesto", "definisciprofilo", "definisciprogramma", "definisciregistro", "definisciriferimento", "definiscirigovuoto", "definiscisezione", "definiscisimbolo", "definiscisinonimi", "definiscisinonimofont", "definiscisottocampo", "definiscisovrapposizione", "definiscistackcampi", "definiscistile", "definiscistilefont", "definiscitabulato", "definiscitavolozza", "definiscitesta", "definiscitesto", "definiscitestoincorniciato", "definiscitype", "definiscityping", "definiscivariabiletesto", "definisciversion", "description", "determinacaratteristicheregistro", "determinacarattersticheelenco", "determinanumerotesta", "dimensione", "disabilitamenuinterazione", "distanzabordo", "distanzabordodestro", "distanzabordosinistro", "distanzacima", "distanzafondo", "distanzaintestazione", "distanzamargine", "distanzamarginedestro", "distanzamarginesinistro", "distanzapdp", "domicilio", "el", "elaborablocchi", "elaborapagina", "elementi", "elemento", "emptylines", "enumeration", "etichetta", "etichette", "fatto", "figuraesterna", "fondo", "forzablocchi", "framedtext", "frazione", "getnumber", "giornosettimana", "griglia", "headsym", "hl", "ignoto", "immediatebetweenlist", "immediatetolist", "impaccato", "impostaallineamento", "impostaambientefontdeltesto", "impostaampiezzariga", "impostabarrainterazione", "impostabarrasincronizzazione", "impostablocchimargine", "impostablocco", "impostabloccosezione", "impostabuffer", "impostacampi", "impostacampo", "impostacapoversi", "impostacaption", "impostacaptions", "impostacima", "impostaclippling", "impostacolonne", "impostacolore", "impostacolori", "impostacombinazioni", "impostacommento", "impostacommentopagina", "impostadefinizionenotepdp", "impostadescrizioni", "impostadimensionicarta", "impostaelementi", "impostaelencazioni", "impostaelenco", "impostaelencocombinato", "impostaenumerazioni", "impostafigureesterne", "impostafondo", "impostafontdeltesto", "impostaforms", "impostaformule", "impostagruppocolonne", "impostaincorniciato", "impostainiziatermina", "impostainmargine", "impostainstestazione", "impostainterazione", "impostainterlinea", "impostalayout", "impostalegenda", "impostalinea", "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", "impostaposizionetesto", "impostaprofili", "impostaprogrammi", "impostapubblicazioni", "impostapulsanti", "impostaregistro", "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", "impostavariabiletesto", "impostaversioni", "in", "inaltromargine", "incorniciato", "incrementanumero", "indentation", "indestra", "ininner", "iniziaallineamento", "iniziaambiente", "iniziabloccomargine", "iniziacitazione", "iniziacodifica", "iniziacolonne", "iniziacolore", "iniziacombinazione", "iniziacomponente", "iniziacorrezioneriga", "iniziadocumento", "iniziafigura", "iniziaglobale", "iniziagruppocolonne", "iniziaimpaccato", "inizialineamargine", "inizialineatesto", "inizialocale", "iniziamakeup", "inizianotepdplocali", "inizianumerazionerighe", "iniziaopposto", "iniziaoverview", "iniziapiustretto", "iniziaposizionamento", "iniziaprodotto", "iniziaprofilo", "iniziaprogetto", "iniziaraster", "iniziariga", "iniziarighe", "iniziasetsimboli", "iniziasfondo", "iniziasincronizzazione", "iniziasovrapposizione", "iniziatabella", "iniziatabelle", "iniziatesto", "iniziaunpacked", "iniziaversione", "inlatodestro", "inlatosinistro", "inmaframed", "inmargine", "inmarginedestro", "inmarginesinistro", "inneredgedistance", "inneredgewidth", "innermargindistance", "innermarginwidth", "inouter", "inriga", "insinistra", "installalingua", "intorno", "labeling", "leg", "lettera", "lettere", "lineamargine", "lineanera", "lineasottile", "lineatesto", "lineenere", "lineeriempimento", "lineesottili", "lingua", "linguaprincipale", "listsymbol", "livellotesta", "loadsorts", "loadsynonyms", "logcampi", "lunghezzaelenco", "maframed", "mapfontsize", "mar", "marcatura", "marcaversione", "matematica", "mediaeval", "menuinterattivo", "menzione", "mese", "mettielenco", "mettielencocombinato", "mettifiancoafianco", "mettiformula", "mettiingriglia", "mettilegenda", "mettilinea", "mettiloghi", "mettinotepdp", "mettinotepdplocali", "mettinumeropagina", "mettiregistro", "mettisegnalibro", "mettisottoformula", "mettiunosullaltro", "mettivariabiletesto", "mostraambientefontdeltesto", "mostracampi", "mostracolore", "mostracornice", "mostrafiguresterne", "mostrafontdeltesto", "mostragriglia", "mostragruppocolori", "mostraimpostazioni", "mostralyout", "mostramakeup", "mostrasetsimboli", "mostrastampa", "mostrastruts", "mostratavolozza", "movesidefloat", "name", "nascondiblocchi", "navigating", "nextsection", "nientedimensioni", "nienteelenco", "nientelineecimafondo", "nientelineintestazionepdp", "nientemarcatura", "nienterientro", "nientespazio", "nientespaziobianco", "nocap", "nome", "nomeunita", "nop", "nota", "notapdp", "notest", "numberofsubpages", "numeri", "numeriromani", "numeroformula", "numeropagina", "numeropaginacompleto", "numerosottoformula", "numerotesta", "numerotestacorrente", "numerototaledipagine", "outeredgedistance", "outeredgewidth", "outermargindistance", "outermarginwidth", "overbar", "overbars", "overstrike", "overstrikes", "pagedepth", "pageoffset", "pagina", "paragraph", "paroladestra", "parolainmargine", "part", "passaafontgrezzo", "ped", "pedap", "perlungo", "placefloat", "placelistoffloats", "placelistofsorts", "placelistofsynonyms", "placerawlist", "placereferencelist", "posizionanumerotesta", "posizionatesto", "posizionatestotesta", "posizione", "prendibuffer", "prendimarcatura", "prodotto", "progetto", "programma", "pubblicazione", "pulsante", "pulsantemenu", "pulsantinterazione", "punti", "qualcheriga", "ran", "referral", "referring", "register", "reimposta", "reimpostamarcatura", "reservefloat", "resetnumber", "resettextcontent", "rientro", "rif", "rifai", "riferimento", "riferimentopagina", "riferimentotesto", "riflessione", "rigariempimento", "rigovuoto", "ruota", "saltablocchi", "scala", "schermo", "scrividentroelenco", "scriviinelenco", "scriviinlistariferimenti", "scriviinregistro", "section", "seeregister", "segnalibro", "seguiprofilo", "seguiversione", "seguiversioneprofilo", "selezionablocchi", "selezionacarta", "selezionaversione", "separamarcatura", "setnumber", "settext", "setupanswerarea", "setupcolumnsetlines", "setupcolumnsetstart", "setupfonthandling", "setupfontsynonym", "setupindentedtext", "setupinterlinespace2", "setupitemgroup", "setuplistalternative", "setupmathalignment", "setuppaper", "setupplacement", "setvariabiletesto", "sfondo", "sim", "simbolo", "sincronizza", "sort", "spazifissi", "spazio", "spaziobianco", "spaziocima", "spaziodietro", "spaziofisso", "spaziofondo", "spessoreriga", "spezzaoggettomobile", "spostaagriglia", "spostaformula", "stackcampi", "startalignment", "startambiente", "startbuffer", "startcitazione", "startcolore", "startcolumnmakeup", "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", "stopcitazione", "stopcolore", "stopcolumnmakeup", "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", "subpagenumber", "subsection", "subsubject", "subsubsection", "subsubsubject", "synonym", "tab", "terminaallineamento", "terminaambiente", "terminabloccomargine", "terminacitazione", "terminacodifica", "terminacolonne", "terminacolore", "terminacombinazione", "terminacomponente", "terminacorrezioneriga", "terminadocumento", "terminaglobale", "terminagruppocolonne", "terminaimpaccato", "terminalineamargine", "terminalineatesto", "terminalocale", "terminamakeup", "terminanotepdplocali", "terminanumerazionerighe", "terminaopposto", "terminaoverview", "terminapiustretto", "terminaposizionamento", "terminaprodotto", "terminaprofili", "terminaprogetto", "terminaraster", "terminariga", "terminarighe", "terminasfondo", "terminasincronizzazione", "terminasovrapposizione", "terminatabella", "terminatabelle", "terminatesto", "terminaunpacked", "terminaversioni", "testa", "testcolumn", "testoetichetta", "testoinmargine", "testoinstestazioni", "testonotapdp", "testoriempimento", "testpage", "tex", "tieniblocchi", "title", "titoloinmargine", "tooltip", "traduci", "txt", "typ", "type", "typebuffer", "typefile", "underbar", "underbars", "usaJSscripts", "usaURL", "usablocco", "usacartella", "usacodifica", "usacolonnasonoraesterna", "usacomandi", "usadocumentoesterno", "usafiguraesterna", "usafileesterni", "usafileesterno", "usamoduli", "usamodulo", "usariferimenti", "usasimboli", "usaspecialita", "usaurl", "useXMLfilter", "usedirectory", "usetypescript", "usetypescriptfile", "vaia", "vaiabox", "vaiapagina", "vaigiu", "valorecolore", "valoregrigio", "variabiletesto", "versione", "vl" },
+ ["nl"]={ "CAP", "Cap", "Caps", "Cijfers", "KAP", "Kap", "Kaps", "Letter", "Letters", "MAAND", "Romeins", "WEEKDAG", "WOORD", "WOORDEN", "Woord", "Woorden", "aantalsubpaginas", "about", "achtergrond", "appendix", "arg", "bepaalkopnummer", "bepaallijstkenmerken", "bepaalregisterkenmerken", "betekenis", "binnenmargeafstand", "binnenmargebreedte", "binnenrandafstand", "binnenrandbreedte", "blanko", "blokje", "blokjes", "blokkeerinteractiemenu", "bodemwit", "bookmark", "bovenafstand", "bovenhoogte", "breuk", "buitenmargeafstand", "buitenmargebreedte", "buitenrandafstand", "buitenrandbreedte", "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", "definerawfont", "definetypeface", "definieer", "definieeraccent", "definieeralineas", "definieerbeeldmerk", "definieerblanko", "definieerblok", "definieerbuffer", "definieercombinatie", "definieercommando", "definieerconversie", "definieerfiguursymbool", "definieerfont", "definieerfontstijl", "definieerfontsynoniem", "definieerhbox", "definieerhoofdveld", "definieeringesprongentext", "definieerinmarge", "definieerinteractiemenu", "definieeritemgroep", "definieerkadertekst", "definieerkarakter", "definieerkleur", "definieerkleurgroep", "definieerkolomgroep", "definieerkolomovergang", "definieerkop", "definieerkorps", "definieerkorpsomgeving", "definieerlayer", "definieerlayout", "definieerletter", "definieerlijn", "definieerlijst", "definieermarkering", "definieeromlijnd", "definieeropmaak", "definieeroverlay", "definieerpaginaovergang", "definieerpalet", "definieerpapierformaat", "definieerplaats", "definieerplaatsblok", "definieerprofiel", "definieerprogramma", "definieerreferentie", "definieerreferentieformaat", "definieerreferentielijst", "definieerregister", "definieersamengesteldelijst", "definieersectie", "definieersectieblok", "definieersorteren", "definieerstartstop", "definieersubveld", "definieersymbool", "definieersynoniemen", "definieertabelvorm", "definieertabulatie", "definieertekst", "definieertekstachtergrond", "definieertekstpositie", "definieertekstvariabele", "definieertype", "definieertypen", "definieeruitvoer", "definieerveld", "definieerveldstapel", "definieerversie", "definieerwiskundeuitlijnen", "description", "dimensie", "directnaarlijst", "directtussenlijst", "doordefinieren", "doorlabelen", "doornummeren", "dunnelijn", "dunnelijnen", "eenregel", "enumeration", "ergens", "externfiguur", "forceerblokken", "formulenummer", "framedtext", "gebruikJSscripts", "gebruikURL", "gebruikXMLfilter", "gebruikblokken", "gebruikcommandos", "gebruikexterndocument", "gebruikexternefile", "gebruikexternefiles", "gebruikexternfiguur", "gebruikexterngeluidsfragment", "gebruikgebied", "gebruikmodule", "gebruikmodules", "gebruikreferenties", "gebruikspecials", "gebruiksymbolen", "gebruiktypescript", "gebruiktypescriptfile", "gebruikurl", "geenblokkenmeer", "geenbovenenonderregels", "geendimensie", "geenfilesmeer", "geenhoofdenvoetregels", "geenlijst", "geenmarkering", "geenspatie", "geentest", "geenwitruimte", "geg", "grijskleur", "grijswaarde", "haalbuffer", "haalmarkering", "haalnummer", "haarlijn", "handhaafblokken", "herhaal", "hl", "hoofdafstand", "hoofdhoogte", "hoofdtaal", "hoog", "huidigedatum", "huidigekopnummer", "in", "inanderemarge", "inbinnen", "inbuiten", "indentation", "inlijnd", "inlinker", "inlinkermarge", "inlinkerrand", "inmarge", "inrechter", "inrechtermarge", "inrechterrand", "inregel", "inspringen", "installeertaal", "interactiebalk", "interactiebuttons", "interactiemenu", "invullijnen", "invulregel", "invultekst", "invulveld", "inwilijnd", "items", "its", "kantlijn", "kap", "kenmerk", "kenmerkdatum", "kentekstvariabeletoe", "kleur", "kleurenbalk", "kleurwaarde", "kloonveld", "kolom", "kop", "kopniveau", "kopnummer", "koppeldocument", "koppelmarkering", "koppelpagina", "koppelpapier", "koppelregister", "kopsym", "koptekst", "kopwit", "laag", "label", "labeling", "labels", "labeltekst", "laho", "leg", "legeregels", "letter", "letters", "lijndikte", "lijstbreedte", "lijsthoogte", "lijstlengte", "lijstsymbool", "linkermargeafstand", "linkermargebreedte", "linkerrandafstand", "linkerrandbreedte", "loadsorts", "loadsynonyms", "maand", "mapfontsize", "mar", "margeafstand", "margebreedte", "margetekst", "margetitel", "margewoord", "markeer", "markeerversie", "mediaeval", "menubutton", "naam", "naar", "naarbox", "naarpagina", "name", "navigerend", "nextsection", "nietinspringen", "nocap", "nokap", "noot", "nop", "omgeving", "omlaag", "omlijnd", "onbekend", "onderafstand", "onderdeel", "onderhoogte", "ontkoppelmarkering", "op", "opelkaar", "oplinkermarge", "oppagina", "oprechtermarge", "overbar", "overbars", "overstrike", "overstrikes", "pagina", "paginadiepte", "paginanummer", "paginaoffset", "paginareferentie", "papierbreedte", "papierhoogte", "paragraph", "part", "paslayoutaan", "passeerblokken", "passendveld", "plaatsbeeldmerken", "plaatsbookmarks", "plaatsformule", "plaatskopnummer", "plaatskoptekst", "plaatslegenda", "plaatslijn", "plaatslijst", "plaatslijstmetsynoniemen", "plaatslokalevoetnoten", "plaatsnaastelkaar", "plaatsonderelkaar", "plaatsopgrid", "plaatspaginanummer", "plaatsplaatsblok", "plaatsreferentielijst", "plaatsregister", "plaatsruwelijst", "plaatssamengesteldelijst", "plaatssubformule", "plaatstekstvariabele", "plaatsvoetnoten", "placelistoffloats", "placelistofsorts", "positioneer", "positioneertekst", "printpapierbreedte", "printpapierhoogte", "produkt", "programma", "projekt", "publicatie", "punten", "ran", "randafstand", "randbreedte", "rechtermargeafstand", "rechtermargebreedte", "rechterrandafstand", "rechterrandbreedte", "ref", "refereer", "referentie", "regellinks", "regelmidden", "regelrechts", "register", "registreervelden", "reservefloat", "reset", "resetmarkering", "resetnummer", "resettekstinhoud", "resettextcontent", "romeins", "rooster", "roteer", "rugwit", "schaal", "scherm", "schrijfnaarlijst", "schrijfnaarreferentielijst", "schrijfnaarregister", "schrijftussenlijst", "section", "seeregister", "selecteerblokken", "selecteerpapier", "selecteerversie", "setnummer", "setupfonthandling", "setupfontsynonym", "setupinterlinespace2", "setuplistalternative", "snijwit", "som", "sort", "spatie", "spiegel", "splitsplaatsblok", "startachtergrond", "startalignment", "startbuffer", "startcitaat", "startcodering", "startcolumns", "startcombinatie", "startcombination", "startcomment", "startdescription", "startdocument", "startenumeration", "startfigure", "startfiguur", "startfloattext", "startformula", "startframedtext", "startgeg", "startglobaal", "starthiding", "startinteractiemenu", "startitemgroup", "startkantlijn", "startkleur", "startkolomgroep", "startkolommen", "startkolomopmaak", "startlegend", "startline", "startlinecorrection", "startlinenumbering", "startlines", "startlocal", "startlocalenvironment", "startlocalfootnotes", "startlokaal", "startlokalevoetnoten", "startmakeup", "startmargeblok", "startmarginblock", "startnaast", "startnamemakeup", "startnarrower", "startomgeving", "startomlijnd", "startonderdeel", "startopelkaar", "startopmaak", "startopposite", "startoverlay", "startoverview", "startoverzicht", "startparagraph", "startpositioneren", "startpositioning", "startpostponing", "startprodukt", "startprofiel", "startprofile", "startprojekt", "startraster", "startregel", "startregelcorrectie", "startregelnummeren", "startregels", "startregister", "startsmaller", "startsymbolset", "startsymboolset", "startsynchronisatie", "startsynchronization", "starttabel", "starttabellen", "starttable", "starttables", "starttabulate", "starttekst", "starttekstachtergrond", "starttekstlijn", "starttyping", "startuitlijnen", "startunpacked", "startvanelkaar", "startversie", "stelachtergrondenin", "stelachtergrondin", "stelalineasin", "stelantwoordgebiedin", "stelarrangerenin", "stelblankoin", "stelblokin", "stelblokjesin", "stelblokkopjein", "stelblokkopjesin", "stelbovenin", "stelboventekstenin", "stelbufferin", "stelbuttonsin", "stelciterenin", "stelclipin", "stelcombinatiesin", "stelcommentaarin", "steldoordefinierenin", "steldoornummerenin", "steldunnelijnenin", "stelexternefigurenin", "stelformulesin", "stelformulierenin", "stelhoofdin", "stelhoofdtekstenin", "stelingesprongentextin", "stelinmargein", "stelinspringenin", "stelinteractiebalkin", "stelinteractiein", "stelinteractiemenuin", "stelinteractieschermin", "stelinterliniein", "stelinvullijnenin", "stelinvulregelsin", "stelitemgroepin", "stelitemsin", "stelkadertekstenin", "stelkantlijnin", "stelkapitalenin", "stelkleurenin", "stelkleurin", "stelkolomgroepin", "stelkolomgroepregelsin", "stelkolomgroepstartin", "stelkolommenin", "stelkopin", "stelkopnummerin", "stelkoppeltekenin", "stelkoppenin", "stelkoptekstin", "stelkorpsin", "stelkorpsomgevingin", "stellabeltekstin", "stellayoutin", "stellegendain", "stellijndiktein", "stellijnin", "stellijstin", "stelmargeblokkenin", "stelmarkeringin", "stelnaastplaatsenin", "stelnummerenin", "stelnummerin", "stelomlijndin", "stelonderin", "stelonderstrepenin", "stelondertekstenin", "stelopmaakin", "stelopsommingenin", "stelpaginacommentaarin", "stelpaginanummerin", "stelpaginanummeringin", "stelpaginaovergangenin", "stelpaletin", "stelpapierformaatin", "stelpapierin", "stelparagraafnummerenin", "stelplaatsblokin", "stelplaatsblokkenin", "stelplaatsbloksplitsenin", "stelplaatsin", "stelpositionerenin", "stelprofielenin", "stelprogrammasin", "stelpublicatiesin", "stelrastersin", "stelreferentielijstin", "stelrefererenin", "stelregelnummerenin", "stelregelsin", "stelregisterin", "stelroterenin", "stelsamengesteldelijstin", "stelsectieblokin", "stelsectiein", "stelsmallerin", "stelsorterenin", "stelspatieringin", "stelstartstopin", "stelstrutin", "stelsubpaginanummerin", "stelsymboolsetin", "stelsynchronisatiebalkin", "stelsynchronisatiein", "stelsynoniemenin", "stelsysteemin", "steltaalin", "steltabellenin", "steltabin", "steltabulatiein", "steltekstachtergrondin", "steltekstin", "steltekstinhoudin", "steltekstlijnenin", "steltekstpositiein", "stelteksttekstenin", "steltekstvariabelein", "steltolerantiein", "steltypein", "steltypenin", "steluitlijnenin", "steluitvoerin", "stelurlin", "stelveldenin", "stelveldin", "stelversiesin", "stelvoetin", "stelvoetnootdefinitiein", "stelvoetnotenin", "stelvoettekstenin", "stelwiskundeuitlijnenin", "stelwitruimtein", "stopachtergrond", "stopalignment", "stopbuffer", "stopcitaat", "stopcodering", "stopcolumns", "stopcombinatie", "stopcombination", "stopcomment", "stopdescription", "stopdocument", "stopenumeration", "stopfigure", "stopfloattext", "stopformula", "stopframedtext", "stopgeg", "stopglobaal", "stophiding", "stopinteractiemenu", "stopitemgroup", "stopkantlijn", "stopkleur", "stopkolomgroep", "stopkolommen", "stopkolomopmaak", "stoplegend", "stopline", "stoplinecorrection", "stoplinenumbering", "stoplines", "stoplocal", "stoplocalenvironment", "stoplocalfootnotes", "stoplokaal", "stoplokalevoetnoten", "stopmakeup", "stopmargeblok", "stopmarginblock", "stopnaast", "stopnamemakeup", "stopnarrower", "stopomgeving", "stopomlijnd", "stoponderdeel", "stopopelkaar", "stopopmaak", "stopopposite", "stopoverlay", "stopoverview", "stopoverzicht", "stopparagraph", "stoppositioneren", "stoppositioning", "stoppostponing", "stopprodukt", "stopprofiel", "stopprofile", "stopprojekt", "stopraster", "stopregel", "stopregelcorrectie", "stopregelnummeren", "stopregels", "stopsmaller", "stopsymbolset", "stopsynchronisatie", "stopsynchronization", "stoptabel", "stoptabellen", "stoptable", "stoptables", "stoptabulate", "stoptekst", "stoptekstachtergrond", "stoptekstlijn", "stoptyping", "stopuitlijnen", "stopunpacked", "stopvanelkaar", "stopversie", "sub", "subformulenummer", "subject", "subpaginanummer", "subsection", "subsubject", "subsubsection", "subsubsubject", "suggestie", "switchnaarkorps", "switchtorawfont", "sym", "symbool", "symoffset", "synchronisatiebalk", "synchroniseer", "synonym", "taal", "tab", "tekstbreedte", "teksthoogte", "tekstlijn", "tekstreferentie", "tekstvariabele", "testkolom", "testpagina", "tex", "title", "toelichting", "toonexternefiguren", "toongrid", "tooninstellingen", "toonkader", "toonkleur", "toonkleurgroep", "toonkorps", "toonkorpsomgeving", "toonlayout", "toonopmaak", "toonpalet", "toonprint", "toonstruts", "toonsymboolset", "toonvelden", "totaalaantalpaginas", "txt", "typ", "type", "typebuffer", "typefile", "uit", "uitgerekt", "underbar", "underbars", "usecodering", "usedirectory", "vastespatie", "vastespaties", "veld", "veldstapel", "verbergblokken", "vergelijkkleurgroep", "vergelijkpalet", "verhoognummer", "verlaagnummer", "verplaatsformule", "verplaatsopgrid", "verplaatszijblok", "versie", "vertaal", "verwerkblokken", "verwerkpagina", "vl", "voetafstand", "voethoogte", "voetnoot", "voetnoottekst", "volgprofiel", "volgprofielversie", "volgversie", "volledigepaginanummer", "volledigregister", "voluit", "weekdag", "wilijnd", "wiskunde", "witruimte", "woonplaats", "woordrechts", "zetbreedte", "zethoogte" },
+ ["pe"]={ "CAP", "Cap", "Caps", "Character", "Characters", "MONTH", "Numbers", "Romannumerals", "WEEKDAY", "WORD", "WORDS", "Word", "Words", "appendix", "cap", "chapter", "chem", "comment", "completecombinedlist", "completelistoffloats", "completelistofsorts", "completelistofsynonyms", "coupledregister", "crlf", "definebodyfontDEF", "definebodyfontREF", "definedfont", "definefontfeature", "definefonthandling", "defineindentedtext", "definetypeface", "description", "enumeration", "framedtext", "indentation", "inmframed", "its", "labeling", "loadsorts", "loadsynonyms", "mapfontsize", "mediaeval", "mframed", "name", "nextsection", "nocap", "overbar", "overbars", "overstrike", "overstrikes", "paragraph", "part", "placelistoffloats", "placelistofsorts", "placelistofsynonyms", "ran", "register", "reservefloat", "resettextcontent", "section", "seeregister", "setupanswerarea", "setupcapitals", "setupfonthandling", "setupfontsynonym", "setupindentedtext", "setupinterlinespace2", "setuplistalternative", "setupurl", "sort", "startalignment", "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", "startraster", "startregister", "startsymbolset", "startsynchronization", "starttable", "starttables", "starttabulate", "starttyping", "startunpacked", "startتولید", "startحقیقت", "startخط‌حاشیه", "startخط‌متن", "startرنگ", "startفشرده", "startمحیط", "startمنوی‌پانل", "startمولفه", "startنسخه", "startنقل‌قول", "startپروژه", "startپس‌زمینه", "stopalignment", "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", "stopraster", "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", "txt", "typ", "underbar", "underbars", "useJSscripts", "useURL", "useXMLfilter", "usedirectory", "useurl", "آفست‌صفحه", "آیتم", "آیتمها", "آینه", "اجباربلوکها", "ارتفاع‌آرایش", "ارتفاع‌بالا", "ارتفاع‌برگ", "ارتفاع‌ته‌برگ", "ارتفاع‌خط", "ارتفاع‌سربرگ", "ارتفاع‌متن", "ارتفاع‌پایین", "از", "ازکارانداختن‌منوی‌پانل", "استفاده‌بلوکها", "استفاده‌دستخط‌تایپ", "استفاده‌رمزینه", "استفاده‌شکل‌خارجی", "استفاده‌فرمانها", "استفاده‌قطعه‌موزیک‌خارجی", "استفاده‌مدول", "استفاده‌مدولها", "استفاده‌مرجعها", "استفاده‌مسیر", "استفاده‌نمادها", "استفاده‌نوشتارخارجی", "استفاده‌ویژگیها", "استفاده‌پرونده‌خارجی", "استفاده‌پرونده‌دستخط‌تایپ", "استفاده‌پرونده‌های‌خارجی", "اعدادلاتین", "افزودن", "اما", "امتحان‌نکن", "انتخاب‌برگ", "انتخاب‌بلوکها", "انتخاب‌نسخه", "انتقال‌به‌توری", "انتقال‌فرمول", "انتقال‌کنار‌شناور", "انجام‌دوباره", "بارگذاری‌آرایش", "بارگذاری‌آیتمها", "بارگذاری‌ارجاع", "بارگذاری‌اندازه‌برگ", "بارگذاری‌باریکتر", "بارگذاری‌بافر", "بارگذاری‌بالا", "بارگذاری‌بخش", "بارگذاری‌بردباری", "بارگذاری‌برنامه‌ها", "بارگذاری‌برگ", "بارگذاری‌بست", "بارگذاری‌بلوک", "بارگذاری‌بلوکهای‌حاشیه", "بارگذاری‌بلوک‌بخش", "بارگذاری‌تایپ", "بارگذاری‌تایپ‌کردن", "بارگذاری‌تب", "بارگذاری‌ترتیب", "بارگذاری‌ترکیب‌ها", "بارگذاری‌تطابق", "بارگذاری‌تعریف‌پانوشت", "بارگذاری‌تنظیم", "بارگذاری‌تنظیم‌ریاضی", "بارگذاری‌ته‌برگ", "بارگذاری‌تورفتگی", "بارگذاری‌توضیح", "بارگذاری‌توضیح‌صفحه", "بارگذاری‌ثبت", "بارگذاری‌جانشانی", "بارگذاری‌جدولها", "بارگذاری‌جدول‌بندی", "بارگذاری‌خالی", "بارگذاری‌خروجی", "بارگذاری‌خط", "بارگذاری‌خطها", "بارگذاری‌خطهای‌حاشیه", "بارگذاری‌خطهای‌سیاه", "بارگذاری‌خطهای‌متن", "بارگذاری‌خطهای‌مجموعه‌ستون", "بارگذاری‌خطها‌ی‌نازک", "بارگذاری‌درج‌درخطها", "بارگذاری‌درج‌مخالف", "بارگذاری‌درون‌حاشیه", "بارگذاری‌دوران", "بارگذاری‌دکمه‌ها", "بارگذاری‌راهنما", "بارگذاری‌رنگ", "بارگذاری‌رنگها", "بارگذاری‌زبان", "بارگذاری‌ستونها", "بارگذاری‌سر", "بارگذاری‌سربرگ", "بارگذاری‌سرها", "بارگذاری‌سیستم", "بارگذاری‌شرح", "بارگذاری‌شرحها", "بارگذاری‌شروع‌مجموعه‌ستون", "بارگذاری‌شروع‌پایان", "بارگذاری‌شماره", "بارگذاری‌شماره‌زیرصفحه", "بارگذاری‌شماره‌سر", "بارگذاری‌شماره‌صفحه", "بارگذاری‌شماره‌گذاری", "بارگذاری‌شماره‌گذاریها", "بارگذاری‌شماره‌گذاری‌صفحه", "بارگذاری‌شماره‌گذاری‌پاراگراف", "بارگذاری‌شماره‌‌گذاری‌خط", "بارگذاری‌شناور", "بارگذاری‌شناورها", "بارگذاری‌شکافتن‌شناورها", "بارگذاری‌شکلهای‌خارجی", "بارگذاری‌طرح", "بارگذاری‌طرح‌بندی", "بارگذاری‌عرض‌خط", "بارگذاری‌فاصله‌بین‌خط", "بارگذاری‌فرمولها", "بارگذاری‌فضای‌سفید", "بارگذاری‌فضا‌گذاری", "بارگذاری‌قالبی", "بارگذاری‌قلم‌متن", "بارگذاری‌لوح", "بارگذاری‌لیست", "بارگذاری‌لیست‌ترکیبی", "بارگذاری‌لیست‌مرجع", "بارگذاری‌مترادفها", "بارگذاری‌متغیر‌متن", "بارگذاری‌متن", "بارگذاری‌متنهای‌بالا", "بارگذاری‌متن‌سر", "بارگذاری‌متن‌سربرگ", "بارگذاری‌متن‌قالبی", "بارگذاری‌متن‌متنها", "بارگذاری‌متن‌پانوشت", "بارگذاری‌متن‌پایین", "بارگذاری‌مجموعه‌ستون", "بارگذاری‌مجموعه‌نماد", "بارگذاری‌محیط‌قلم‌متن", "بارگذاری‌منوی‌پانل", "بارگذاری‌مکان‌متن", "بارگذاری‌مکان‌گذاری", "بارگذاری‌میدان", "بارگذاری‌میدانها", "بارگذاری‌میله‌تطابق", "بارگذاری‌میله‌زیر", "بارگذاری‌میله‌پانل", "بارگذاری‌نسخه‌ها", "بارگذاری‌نشانه‌شکستن", "بارگذاری‌نشانه‌گذاری", "بارگذاری‌نشرها", "بارگذاری‌نقل", "بارگذاری‌پاراگرافها", "بارگذاری‌پانل", "بارگذاری‌پانوشتها", "بارگذاری‌پایین", "بارگذاری‌پرده‌ها", "بارگذاری‌پرده‌پانل", "بارگذاری‌پروفایلها", "بارگذاری‌پرکردن‌خطها", "بارگذاری‌پس‌زمینه", "بارگذاری‌پس‌زمینه‌ها", "بارگذاری‌چیدن", "بارگذاری‌گذارصفحه", "بارگذاری‌گروههای‌آیتم", "بارگذاری‌گروه‌آیتم", "بازنشانی", "بازنشانی‌شماره", "بازنشانی‌متن", "بازنشانی‌نشانه‌گذاری", "باگذاری‌متن‌برچسب", "بدون‌بعد", "بدون‌بلوکهای‌بیشتر", "بدون‌تورفتگی", "بدون‌خط‌بالاوپایین", "بدون‌خط‌سروته‌برگ", "بدون‌فایلهای‌بیشتر", "بدون‌فضا", "بدون‌فضای‌سفید", "بدون‌لیست", "بدون‌نشانه‌گذاری", "برنامه", "بروبه", "بروبه‌جعبه", "بروبه‌صفحه", "بروپایین", "برچسب", "برچسبها", "بعد", "بلند", "بلوکهای‌پردازش", "بلوکها‌پنهان", "بنویس‌بین‌لیست", "بنویس‌درثبت", "بنویس‌درلیست‌مرجع", "بنویس‌در‌لیست", "تاریخ", "تاریخ‌جاری", "تاریخ‌رجوع", "تایپ", "تایپ‌بافر", "تایپ‌پرونده", "تب", "ترجمه", "تطابق", "تعریف", "تعریف‌آرایش", "تعریف‌آرم", "تعریف‌الگوی‌جدول", "تعریف‌اندازه‌برگ", "تعریف‌بافر", "تعریف‌بخش", "تعریف‌برنامه", "تعریف‌برچسب", "تعریف‌بلوک", "تعریف‌بلوک‌بخش", "تعریف‌تایپ", "تعریف‌تایپ‌کردن", "تعریف‌تبدیل", "تعریف‌ترتیب", "تعریف‌ترکیب", "تعریف‌تنظیم‌ریاضی", "تعریف‌توده‌میدان", "تعریف‌ثبت", "تعریف‌جانشانی", "تعریف‌جدول‌بندی", "تعریف‌جعبه‌‌افقی", "تعریف‌حرف", "تعریف‌خالی", "تعریف‌خروجی", "تعریف‌خط‌حائل", "تعریف‌درون‌حاشیه", "تعریف‌رنگ", "تعریف‌زیرمیدان", "تعریف‌سبک", "تعریف‌سبک‌قلم", "تعریف‌سر", "تعریف‌شرح", "تعریف‌شروع‌پایان", "تعریف‌شماره‌بندی", "تعریف‌شمایل‌مرجع", "تعریف‌شناور", "تعریف‌شکستن‌ستون", "تعریف‌شکست‌صفحه", "تعریف‌طرح‌بندی", "تعریف‌فرمان", "تعریف‌قالبی", "تعریف‌قلم", "تعریف‌قلم‌خام", "تعریف‌قلم‌متن", "تعریف‌لایه", "تعریف‌لهجه", "تعریف‌لوح", "تعریف‌لیست", "تعریف‌لیست‌ترکیبی", "تعریف‌لیست‌مرجع", "تعریف‌مترادفها", "تعریف‌مترادف‌قلم", "تعریف‌متغیرمتن", "تعریف‌متن", "تعریف‌متن‌قالبی", "تعریف‌مجموعه‌ستون", "تعریف‌محیط‌قلم‌بدنه", "تعریف‌مرجع", "تعریف‌منوی‌پانل", "تعریف‌مکان‌متن", "تعریف‌میدان", "تعریف‌میدان‌اصلی", "تعریف‌نسخه", "تعریف‌نشانه‌گذاری", "تعریف‌نماد", "تعریف‌نمادشکل", "تعریف‌پاراگرافها", "تعریف‌پروفایل", "تعریف‌پوشش", "تعریف‌گروه‌آیتم", "تعریف‌گروه‌رنگ", "تعیین‌شماره", "تعیین‌شماره‌سر", "تعیین‌متغیر‌متن", "تعیین‌محتوای‌متن", "تعیین‌مشخصات‌ثبت", "تعیین‌مشخصات‌لیست", "تغییربه‌قلم‌بدنه", "تغییربه‌قلم‌خام", "تنظیم‌راست", "تنظیم‌طرح‌بندی", "تنظیم‌وسط", "توجه", "تورفتگی", "توری", "تولید", "تک", "ثبت‌زوج", "ثبت‌کامل", "جداسازی‌نشانه‌گذاری", "حاش", "حرف", "حرفها", "حفظ‌بلوکها", "حقیقت", "خالی", "خطهای‌سیاه", "خطهای‌نازک", "خطها‌خالی", "خط‌حاشیه", "خط‌سیاه", "خط‌متن", "خط‌مو", "خط‌نازک", "خ‌ا", "خ‌ع", "در", "درج‌آرمها", "درج‌ثبت", "درج‌خط", "درج‌درخط", "درج‌درخطها", "درج‌درمتن", "درج‌درمیدان", "درج‌در‌بالای‌یکدیگر", "درج‌در‌توری", "درج‌راهنما", "درج‌زیرفرمول", "درج‌شماره‌سر", "درج‌شماره‌صفحه", "درج‌شناور", "درج‌فرمول", "درج‌لیست", "درج‌لیست‌خام", "درج‌لیست‌مختلط", "درج‌لیست‌مرجع", "درج‌متغیرمتن", "درج‌متن‌سر", "درج‌پانوشتها", "درج‌پانوشتهای‌موضعی", "درج‌چوب‌خط", "درج‌کنار‌به‌کنار", "درحاشیه", "درحاشیه‌دیگر", "درحاشیه‌راست", "درحاشیه‌چپ", "درخارجی", "درخط", "درداخلی", "درراست", "درصفحه", "درقالبی", "درلبه‌راست", "درلبه‌چپ", "درمورد", "درون", "درپر", "درچپ", "دریافت‌بافر", "دریافت‌شماره", "دریافت‌نشانه", "دوران", "دکمه", "دکمه‌منو", "دکمه‌پانل", "رج", "رجوع", "رنگ", "رنگ‌خاکستری", "روزهفته", "ریاضی", "زبان", "زبان‌اصلی", "ستون", "ستون‌امتحان", "سر", "سرپوش‌کوچک‌نه", "شروع‌آرایش", "شروع‌آرایش‌ستون", "شروع‌باریکتر", "شروع‌بازبینی", "شروع‌بلوک‌حاشیه", "شروع‌ترکیب", "شروع‌تصحیح‌خط", "شروع‌تطابق", "شروع‌تنظیم", "شروع‌تولید", "شروع‌جدول", "شروع‌جدولها", "شروع‌خط", "شروع‌خطها", "شروع‌خط‌حاشیه", "شروع‌خط‌متن", "شروع‌رنگ", "شروع‌ستونها", "شروع‌سراسری", "شروع‌شماره‌گذاری‌خط", "شروع‌شکل", "شروع‌غیر‌فشرده", "شروع‌فشرده", "شروع‌متن", "شروع‌مجموعه‌ستون", "شروع‌مجموعه‌نماد", "شروع‌محیط", "شروع‌مخالف", "شروع‌موضعی", "شروع‌مولفه", "شروع‌مکان‌گذاری", "شروع‌نسخه", "شروع‌نقل‌قول", "شروع‌نوشتار", "شروع‌پانوشتهای‌موضعی", "شروع‌پروفایل", "شروع‌پروژه", "شروع‌پس‌زمینه", "شروع‌پوشش", "شروع‌کد", "شماره‌افزایش", "شماره‌زیرصفحه", "شماره‌زیرفرمول", "شماره‌سر", "شماره‌سرجاری", "شماره‌صفحه", "شماره‌صفحه‌کامل", "شماره‌فرمول", "شماره‌مبدل", "شماره‌ها", "شماره‌کاهش", "شماره‌کل‌صفحه‌ها", "شکافتن‌شناور", "شکل‌خارجی", "صفحه", "صفحه‌تست", "صفحه‌زوج", "صفحه‌پردازش", "طول‌لیست", "عبوربلوکها", "عرض‌آرایش", "عرض‌برگ", "عرض‌حاشیه", "عرض‌حاشیه‌خارجی", "عرض‌حاشیه‌داخلی", "عرض‌حاشیه‌راست", "عرض‌حاشیه‌چپ", "عرض‌خط", "عرض‌لبه", "عرض‌لبه‌خارجی", "عرض‌لبه‌داخلی", "عرض‌لبه‌راست", "عرض‌لبه‌چپ", "عرض‌لیست", "عرض‌متن", "عمق‌صفحه", "عنوان‌حاشیه", "فاصله‌بالا", "فاصله‌ته‌برگ", "فاصله‌حاشیه", "فاصله‌حاشیه‌خارجی", "فاصله‌حاشیه‌داخلی", "فاصله‌حاشیه‌راست", "فاصله‌حاشیه‌چپ", "فاصله‌سربرگ", "فاصله‌لبه", "فاصله‌لبه‌خارجی", "فاصله‌لبه‌داخلی", "فاصله‌لبه‌راست", "فاصله‌لبه‌چپ", "فاصله‌پایین", "فاصله‌پشت", "فشرده", "فضا", "فضاهای‌ثابت", "فضای‌بالا", "فضای‌برش", "فضای‌ثابت", "فضای‌سفید", "فضای‌سفیدصحیح", "فضای‌پایین", "فوری‌به‌لیست", "فوری‌بین‌لیست", "قالبی", "لوح‌مقایسه", "ماه", "متغیر متن", "متن‌برچسب", "متن‌حاشیه", "متن‌سر", "متن‌پانوشت", "محیط", "مراجعه", "مرجع", "مرجع‌صفحه", "مرجع‌متن", "مرحله‌سر", "مسکن", "معنی‌واحد", "مقایسه‌گروه‌رنگ", "مقدارخاکستری", "مقداررنگ", "مقیاس", "منفی", "منوی‌پانل", "مولفه", "مکان", "مکان‌متن", "میدان", "میدانهای‌گزارش", "میدان‌شبیه‌سازی", "میدان‌پشته", "میدان‌کپی", "میله‌تطابق", "میله‌رنگ", "میله‌پانل", "ناشناس", "نام‌ماکرو", "نسخه", "نسخه‌نشانه", "نشانه‌گذاری", "نشانه‌گذاری‌زوج", "نشر", "نصب‌زبان", "نقطه‌ها", "نقل", "نقل‌قول", "نم", "نماد", "نمادسر", "نمادلیست", "نمایش‌آرایش", "نمایش‌بارگذاریها", "نمایش‌بستها", "نمایش‌توری", "نمایش‌رنگ", "نمایش‌شکلهای‌خارجی", "نمایش‌طرح‌بندی", "نمایش‌قالب", "نمایش‌قلم‌بدنه", "نمایش‌لوح", "نمایش‌مجموعه‌علامت", "نمایش‌محیط‌قلم‌بدنه", "نمایش‌میدانها", "نمایش‌چاپ", "نمایش‌گروه‌رنگ", "نوشتارزوج", "هدایت", "پا", "پابا", "پانوشت", "پایان‌آرایش", "پایان‌آرایش‌ستون", "پایان‌بازبینی", "پایان‌بلوک‌حاشیه", "پایان‌ترکیب", "پایان‌تصحیح‌خط", "پایان‌تطابق", "پایان‌تنظیم", "پایان‌تولید", "پایان‌جدول", "پایان‌جدولها", "پایان‌خط", "پایان‌خطها", "پایان‌خط‌حاشیه", "پایان‌خط‌متن", "پایان‌رنگ", "پایان‌ستونها", "پایان‌سراسری", "پایان‌شماره‌گذاری‌خط", "پایان‌غیرفشرده", "پایان‌فشرده", "پایان‌متن", "پایان‌مجموعه‌ستون", "پایان‌محیط", "پایان‌مخالف", "پایان‌موضعی", "پایان‌مولفه", "پایان‌مکان‌گذاری", "پایان‌نازکتر", "پایان‌نسخه", "پایان‌نقل‌قول", "پایان‌نوشتار", "پایان‌پانوشتهای‌موضعی", "پایان‌پروفایل", "پایان‌پروژه", "پایان‌پس‌زمینه", "پایان‌پوشش", "پایان‌کد", "پایین", "پرده", "پروژه", "پرکردن‌میدان", "پس‌زمینه", "پیروی‌نسخه", "پیروی‌نسخه‌پروفایل", "پیروی‌پروفایل", "چاپ‌ارتفاع‌برگ", "چاپ‌عرض‌برگ", "چوبخط", "چپ‌چین", "کاغذزوج", "کسر", "کشیده", "کلمه‌حاشیه", "کلمه‌راست", "گیره", "یادداشت", "یک‌جا", "یک‌خط" },
+ ["ro"]={ "CAP", "CUVANT", "CUVINTE", "Cap", "Caps", "Cuvant", "Cuvinte", "KAP", "Kap", "Kaps", "LUNA", "Litera", "Litere", "Numere", "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", "arg", "ascundeblocuri", "atleftmargin", "atrightmargin", "baraculoare", "barainteractiune", "barasincronizare", "blanc", "but", "butoaneinteractiune", "buton", "butonmeniu", "camp", "campumplere", "cap", "chapter", "chem", "citat", "clip", "cloneazacamp", "coloana", "comment", "comparagrupculoare", "comparapaleta", "completeazanumarpagina", "completecombinedlist", "completelistoffloats", "completelistofsorts", "completelistofsynonyms", "completeregister", "componenta", "convertestenumar", "copiazacamp", "corecteazaspatiualb", "coupledregister", "crlf", "culoare", "culoaregri", "cupleazadocument", "cupleazamarcaje", "cupleazaregistru", "cutspace", "cuvantdreapta", "cuvantmarginal", "data", "datacurenta", "datareferit", "decrementnumber", "decupleazamarcaje", "definebodyfontDEF", "definebodyfontREF", "definecolumnbreak", "definecolumnset", "definecombination", "definedfont", "definefontfeature", "definefonthandling", "defineindentedtext", "defineinmargin", "defineitemgroup", "definelayer", "definelayout", "definemathalignment", "definepagebreak", "defineplacement", "defineste", "definesteaccent", "definesteantet", "definesteblanc", "definestebloc", "definesteblocsectiune", "definestebuffer", "definestecamp", "definestecampprincipal", "definestecaracter", "definestecomanda", "definesteconversie", "definesteculoare", "definestedescriere", "definestedimensiunehartie", "definesteenumerare", "definesteeticheta", "definestefloat", "definestefont", "definestefontraw", "definestefonttext", "definesteformatreferinte", "definestegrupculori", "definestehbox", "definesteinconjurare", "definestelista", "definestelistacombinata", "definestelistareferinte", "definestelogo", "definestemakeup", "definestemarcaje", "definestemediulfonttext", "definestemeniuinteractiune", "definesteoutput", "definesteoverlay", "definestepaleta", "definesteparagraf", "definestepozitietext", "definesteprofil", "definesteprogram", "definestereferinte", "definesteregistru", "definesterigla", "definestesablontabel", "definestesectiune", "definestesimbol", "definestesimbolfigura", "definestesinonim", "definestesinonimfont", "definestesortare", "definestestartstop", "definestestil", "definestestilfont", "definestestivacampuri", "definestesubcamp", "definestetabulatori", "definestetext", "definestetexteinconjurate", "definestetextinconjurat", "definestetyping", "definestevariabilatext", "definesteversiune", "definetype", "definetypeface", "description", "despre", "determinacaracteristicilelistei", "determinacaracteristiciregistru", "determinanumartitlu", "dezactiveazameniuinteractiune", "dimensiune", "din", "distantaantet", "distantacolt", "distantacoltdreapta", "distantacoltstanga", "distantajos", "distantamargine", "distantamarginedreapta", "distantamarginestanga", "distantasubsol", "distantasus", "domiciliu", "dute", "dutebox", "dutepagina", "ecran", "el", "element", "emptylines", "enumeration", "eticheta", "etichete", "fact", "faraaliniat", "faradimensiune", "farafisiere", "faraliniiantetsisubsol", "faraliniisussijos", "faralista", "faramarcaje", "faraspatiu", "faraspatiualb", "figuraexterna", "firdepar", "folosesteURL", "folosestebloc", "folosestecodificarea", "folosestecomenzi", "folosestedirector", "folosestedocumentextern", "folosestefiguraexterna", "folosestefisiereexterne", "folosestefisierextern", "folosestemodul", "folosestemodule", "folosestemuzicaexterna", "folosestereferinte", "folosestescriptJS", "folosestesimboluri", "folosestespeciale", "folosesteurl", "footnotetext", "forteazablocuri", "fractie", "framed", "framedtext", "fundal", "gatablocuri", "getnumber", "grid", "grosimelinie", "hartiedubla", "headsym", "hl", "immediatebetweenlist", "immediatetolist", "impachetat", "impartefloat", "in", "inalt", "inaltamargine", "inaltimeantet", "inaltimehartie", "inaltimehartieimprimanta", "inaltimejos", "inaltimelista", "inaltimemakeup", "inaltimesubsol", "inaltimesus", "inaltimetext", "indentation", "indreapta", "inframed", "ininner", "injos", "inlinie", "inmaframed", "inmargineadreapta", "inmargineastanga", "inneredgedistance", "inneredgewidth", "innermargindistance", "innermarginwidth", "inouter", "inparteadreapta", "inparteastanga", "instalarelimba", "instanga", "intins", "jos", "jossus", "kap", "la", "labeling", "lapagina", "latimecoltdreapta", "latimecoltstanga", "latimecolturi", "latimehartie", "latimehartieimprimanta", "latimelista", "latimemakeup", "latimemargine", "latimemarginedreapta", "latimemarginestanga", "latimetext", "leg", "limba", "limbaprincipala", "liniemargine", "linieneagra", "liniesubtire", "linieumplere", "liniinegre", "liniisubtiri", "listsymbol", "litera", "litere", "loadsorts", "loadsynonyms", "logcampuri", "luna", "lungimelista", "maframed", "mapfontsize", "mar", "marcaje", "marcheazaversiune", "marginal", "matematica", "mediaeval", "mediu", "meniuinteractiune", "minicitat", "moveformula", "movesidefloat", "mutapegrid", "name", "navigating", "necunoscut", "nextsection", "niveltitlu", "nocap", "nokap", "nop", "nota", "notasubsol", "numarformula", "numarincrement", "numarpagina", "numarsubformula", "numartitlu", "numartitlucurent", "numartotalpagini", "numberofsubpages", "nume", "numere", "numereromane", "numeunitate", "nutesta", "olinie", "outeredgedistance", "outeredgewidth", "outermargindistance", "outermarginwidth", "overbar", "overbars", "overstrike", "overstrikes", "pagedepth", "pageoffset", "pagina", "paginadubla", "paragraph", "part", "pastreazablocuri", "pelung", "placefloat", "placeheadnumber", "placeheadtext", "placelistoffloats", "placelistofsorts", "placelistofsynonyms", "placerawlist", "placereferencelist", "plaseazapegrid", "plaseazasemnecarte", "potrivestecamp", "pozitie", "pozitietext", "proceseazabloc", "proceseazapagina", "produs", "program", "proiect", "publicatie", "puncte", "punedeasuprafiecareia", "punefatainfata", "puneformula", "punelegenda", "punelista", "punelistacombinata", "punelogouri", "punenotesubsol", "punenotesubsollocale", "punenumarpagina", "puneregistru", "punerigla", "punesubformula", "punevariabilatext", "ran", "ref", "refa", "referinta", "referintapagina", "referintatext", "referit", "referring", "reflexie", "register", "remarca", "reservefloat", "reset", "reseteazamarcaje", "resetnumber", "resettextcontent", "riglatext", "rigleumplere", "roteste", "saripesteblocuri", "scala", "scriebuffer", "scrieinlista", "scrieinlistareferinte", "scrieinregistru", "scrieintreliste", "section", "seeregister", "selecteazablocuri", "selecteazahartie", "selecteazaversiune", "semncarte", "setarebarasincronizare", "setareitemization", "setarelimba", "setareoutput", "setarepozitie", "setaresincronizare", "seteazaaliniat", "seteazaalinierea", "seteazaantet", "seteazaaranjareapag", "seteazaaspect", "seteazabarainteractiune", "seteazablanc", "seteazabloc", "seteazablocsectiune", "seteazablocurimarginale", "seteazabuffer", "seteazabutoane", "seteazacamp", "seteazacampuri", "seteazaclipping", "seteazacoloane", "seteazacombinari", "seteazacomentariu", "seteazacomentariupagina", "seteazaculoare", "seteazaculori", "seteazadefinireanotasubsol", "seteazadescriere", "seteazadimensiunihartie", "seteazaecrane", "seteazaecraninteractiune", "seteazaelemente", "seteazaenumerare", "seteazafiguriexterne", "seteazafloat", "seteazafloats", "seteazafonttext", "seteazaformulare", "seteazaformule", "seteazafundal", "seteazafundaluri", "seteazagrosimelinie", "seteazaimpartireafloat", "seteazainconjurat", "seteazaingust", "seteazainteractiunea", "seteazajos", "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", "seteazapozitietext", "seteazaprofile", "seteazaprograme", "seteazapublicatii", "seteazareferinte", "seteazaregistru", "seteazarigla", "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", "seteazavariabilatext", "seteazaversiuni", "setnumber", "settextcontent", "setupanswerarea", "setupcolumnset", "setupcolumnsetlines", "setupcolumnsetstart", "setupfonthandling", "setupfontsynonym", "setupindentedtext", "setupinterlinespace2", "setupitemgroup", "setuplistalternative", "setupmathalignment", "setupnumber", "setuppaper", "setupplacement", "setupstartstop", "setvariabilatext", "sim", "simbol", "sincronizeaza", "sort", "spatiifixate", "spatiu", "spatiualb", "spatiufixat", "spatiujos", "spatiuspate", "spatiusus", "startalignment", "startaliniere", "startblocmarginal", "startbuffer", "startcitat", "startcodificare", "startcoloane", "startcolumnmakeup", "startcolumns", "startcolumnset", "startcombinare", "startcombination", "startcomment", "startcomponenta", "startcorectielinie", "startculoare", "startdescription", "startdocument", "startenumeration", "startfact", "startfigura", "startfigure", "startfloattext", "startformula", "startframedtext", "startfundal", "startglobal", "starthiding", "startimpachetat", "startingust", "startitemgroup", "startlegend", "startline", "startlinecorrection", "startlinenumbering", "startlines", "startlinie", "startliniemargine", "startlinii", "startlocal", "startlocalenvironment", "startlocalfootnotes", "startmakeup", "startmarginblock", "startmediu", "startmeniuinteractiune", "startnamemakeup", "startnarrower", "startneimpachetat", "startnotesubsollocale", "startnumerotarelinii", "startopozit", "startopposite", "startoverlay", "startoverview", "startparagraph", "startpositioning", "startpostponing", "startpozitionare", "startprodus", "startprofil", "startprofile", "startproiect", "startraster", "startregister", "startriglatext", "startsetsimboluri", "startsincronizare", "startsymbolset", "startsynchronization", "starttabel", "starttabele", "starttable", "starttables", "starttabulate", "starttext", "starttyping", "startunpacked", "startversiune", "stivacampuri", "stopalignment", "stopaliniere", "stopblobal", "stopblocmarginal", "stopbuffer", "stopcitat", "stopcodificare", "stopcoloane", "stopcolumnmakeup", "stopcolumns", "stopcolumnset", "stopcombinare", "stopcombination", "stopcomment", "stopcomponenta", "stopcorectielinie", "stopculoare", "stopdescription", "stopdocument", "stopenumeration", "stopfact", "stopfigure", "stopfloattext", "stopformula", "stopframedtext", "stopfundal", "stophiding", "stopimpachetat", "stopingust", "stopitemgroup", "stoplegend", "stopline", "stoplinecorrection", "stoplinenumbering", "stoplines", "stoplinie", "stopliniemargine", "stoplinii", "stoplocal", "stoplocalenvironment", "stoplocalfootnotes", "stopmakeup", "stopmarginblock", "stopmediu", "stopmeniuinteractiune", "stopnamemakeup", "stopnarrower", "stopneimpachetat", "stopnotesubsollocale", "stopnumerotarelinii", "stopopozit", "stopopposite", "stopoverlay", "stopoverview", "stopparagraph", "stoppositioning", "stoppostponing", "stoppozitionare", "stopprodus", "stopprofil", "stopprofile", "stopproiect", "stopraster", "stopriglatext", "stopsincronizare", "stopsymbolset", "stopsynchronization", "stoptabel", "stoptabele", "stoptable", "stoptables", "stoptabulate", "stoptext", "stoptyping", "stopunpacked", "stopversiune", "sub", "subject", "subpagenumber", "subsection", "subsubject", "subsubsection", "subsubsubject", "synonym", "tab", "testcolumn", "testpage", "tex", "texteticheta", "textmarginal", "texttitlu", "textumplere", "title", "titlu", "titlumarginal", "tooltip", "traduce", "trecilafontraw", "trecilafonttext", "txt", "typ", "type", "typefile", "underbar", "underbars", "undeva", "urmeazaprofil", "urmeazaversiune", "urmeazaversiuneprofil", "useXMLfilter", "usedirectory", "usetypescript", "usetypescriptfile", "valoareculoare", "valoaregri", "variabilatext", "versiune", "vl", "zidinsaptamana" },
} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-metafun.lua b/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-metafun.lua
index 3db3010d6c1..547b8c14507 100644
--- a/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-metafun.lua
+++ b/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-metafun.lua
@@ -1,4 +1,4 @@
return {
- ["commands"]={ "sqr", "log", "ln", "exp", "inv", "pow", "pi", "radian", "tand", "cotd", "sin", "cos", "tan", "cot", "atan", "asin", "acos", "invsin", "invcos", "invtan", "acosh", "asinh", "sinh", "cosh", "paired", "tripled", "unitcircle", "fulldiamond", "unitdiamond", "fullsquare", "llcircle", "lrcircle", "urcircle", "ulcircle", "tcircle", "bcircle", "lcircle", "rcircle", "lltriangle", "lrtriangle", "urtriangle", "ultriangle", "uptriangle", "downtriangle", "lefttriangle", "righttriangle", "triangle", "smoothed", "cornered", "superellipsed", "randomized", "squeezed", "enlonged", "shortened", "punked", "curved", "unspiked", "simplified", "blownup", "stretched", "enlarged", "leftenlarged", "topenlarged", "rightenlarged", "bottomenlarged", "crossed", "laddered", "randomshifted", "interpolated", "paralleled", "cutends", "peepholed", "llenlarged", "lrenlarged", "urenlarged", "ulenlarged", "llmoved", "lrmoved", "urmoved", "ulmoved", "rightarrow", "leftarrow", "centerarrow", "boundingbox", "innerboundingbox", "outerboundingbox", "pushboundingbox", "popboundingbox", "bottomboundary", "leftboundary", "topboundary", "rightboundary", "xsized", "ysized", "xysized", "sized", "xyscaled", "intersection_point", "intersection_found", "penpoint", "bbwidth", "bbheight", "withshade", "withlinearshading", "withcircularshading", "withfromshadecolor", "withtoshadecolor", "withshading", "shadedinto", "withcircularshade", "withlinearshade", "cmyk", "spotcolor", "multitonecolor", "namedcolor", "drawfill", "undrawfill", "inverted", "uncolored", "softened", "grayed", "greyed", "onlayer", "along", "graphictext", "loadfigure", "externalfigure", "withmask", "figure", "register", "bitmapimage", "colordecimals", "ddecimal", "dddecimal", "ddddecimal", "textext", "thetextext", "rawtextext", "textextoffset", "verbatim", "thelabel", "label", "autoalign", "transparent", "withtransparency", "property", "properties", "withproperties", "asgroup", "infont", "set_linear_vector", "linear_shade", "define_linear_shade", "define_circular_linear_shade", "define_sampled_linear_shade", "set_circular_vector", "circular_shade", "define_circular_shade", "define_circular_linear_shade", "define_sampled_circular_shade", "space", "CRLF", "grayscale", "greyscale", "withgray", "withgrey", "colorpart", "readfile", "clearxy", "unitvector", "center", "epsed", "anchored", "originpath", "infinite", "break", "xstretched", "ystretched", "snapped", "pathconnectors", "function", "constructedpath", "constructedpairs", "punkedfunction", "curvedfunction", "tightfunction", "punkedpath", "curvedpath", "tightpath", "punkedpairs", "curvedpairs", "tightpairs", "evenly", "oddly", "condition", "pushcurrentpicture", "popcurrentpicture", "arrowpath", "tensecircle", "roundedsquare", "colortype", "whitecolor", "blackcolor", "normalfill", "normaldraw", "visualizepaths", "naturalizepaths", "drawboundary", "drawwholepath", "visualizeddraw", "visualizedfill", "draworigin", "drawboundingbox", "drawpath", "drawpoint", "drawpoints", "drawcontrolpoints", "drawcontrollines", "drawpointlabels", "drawlineoptions", "drawpointoptions", "drawcontroloptions", "drawlabeloptions", "draworiginoptions", "drawboundoptions", "drawpathoptions", "resetdrawoptions", "undashed", "decorated", "redecorated", "undecorated", "passvariable", "passarrayvariable", "tostring", "format", "formatted", "startpassingvariable", "stoppassingvariable" },
+ ["commands"]={ "transparency", "sqr", "log", "ln", "exp", "inv", "pow", "pi", "radian", "tand", "cotd", "sin", "cos", "tan", "cot", "atan", "asin", "acos", "invsin", "invcos", "invtan", "acosh", "asinh", "sinh", "cosh", "zmod", "paired", "tripled", "unitcircle", "fulldiamond", "unitdiamond", "fullsquare", "llcircle", "lrcircle", "urcircle", "ulcircle", "tcircle", "bcircle", "lcircle", "rcircle", "lltriangle", "lrtriangle", "urtriangle", "ultriangle", "uptriangle", "downtriangle", "lefttriangle", "righttriangle", "triangle", "smoothed", "cornered", "superellipsed", "randomized", "squeezed", "enlonged", "shortened", "punked", "curved", "unspiked", "simplified", "blownup", "stretched", "enlarged", "leftenlarged", "topenlarged", "rightenlarged", "bottomenlarged", "crossed", "laddered", "randomshifted", "interpolated", "paralleled", "cutends", "peepholed", "llenlarged", "lrenlarged", "urenlarged", "ulenlarged", "llmoved", "lrmoved", "urmoved", "ulmoved", "rightarrow", "leftarrow", "centerarrow", "boundingbox", "innerboundingbox", "outerboundingbox", "pushboundingbox", "popboundingbox", "bottomboundary", "leftboundary", "topboundary", "rightboundary", "xsized", "ysized", "xysized", "sized", "xyscaled", "intersection_point", "intersection_found", "penpoint", "bbwidth", "bbheight", "withshade", "withcircularshade", "withlinearshade", "defineshade", "shaded", "shadedinto", "withshadecolors", "withshadedomain", "withshademethod", "withshadefactor", "withshadevector", "withshadecenter", "cmyk", "spotcolor", "multitonecolor", "namedcolor", "drawfill", "undrawfill", "inverted", "uncolored", "softened", "grayed", "greyed", "onlayer", "along", "graphictext", "loadfigure", "externalfigure", "figure", "register", "withmask", "bitmapimage", "colordecimals", "ddecimal", "dddecimal", "ddddecimal", "textext", "thetextext", "rawtextext", "textextoffset", "verbatim", "thelabel", "label", "autoalign", "transparent", "withtransparency", "property", "properties", "withproperties", "asgroup", "infont", "space", "crlf", "dquote", "percent", "SPACE", "CRLF", "DQUOTE", "PERCENT", "grayscale", "greyscale", "withgray", "withgrey", "colorpart", "readfile", "clearxy", "unitvector", "center", "epsed", "anchored", "originpath", "infinite", "break", "xstretched", "ystretched", "snapped", "pathconnectors", "function", "constructedfunction", "constructedpath", "constructedpairs", "straightfunction", "straightpath", "straightpairs", "curvedfunction", "curvedpath", "curvedpairs", "evenly", "oddly", "condition", "pushcurrentpicture", "popcurrentpicture", "arrowpath", "tensecircle", "roundedsquare", "colortype", "whitecolor", "blackcolor", "basiccolors", "normalfill", "normaldraw", "visualizepaths", "naturalizepaths", "drawboundary", "drawwholepath", "visualizeddraw", "visualizedfill", "draworigin", "drawboundingbox", "drawpath", "drawpoint", "drawpoints", "drawcontrolpoints", "drawcontrollines", "drawpointlabels", "drawlineoptions", "drawpointoptions", "drawcontroloptions", "drawlabeloptions", "draworiginoptions", "drawboundoptions", "drawpathoptions", "resetdrawoptions", "undashed", "decorated", "redecorated", "undecorated", "passvariable", "passarrayvariable", "tostring", "format", "formatted", "startpassingvariable", "stoppassingvariable", "eofill", "eoclip", "area" },
["internals"]={ "nocolormodel", "greycolormodel", "graycolormodel", "rgbcolormodel", "cmykcolormodel", "shadefactor", "textextoffset", "normaltransparent", "multiplytransparent", "screentransparent", "overlaytransparent", "softlighttransparent", "hardlighttransparent", "colordodgetransparent", "colorburntransparent", "darkentransparent", "lightentransparent", "differencetransparent", "exclusiontransparent", "huetransparent", "saturationtransparent", "colortransparent", "luminositytransparent", "metapostversion", "maxdimensions" },
} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-metapost.lua b/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-metapost.lua
index d4759854abb..f3ace2b6ad9 100644
--- a/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-metapost.lua
+++ b/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-metapost.lua
@@ -1,7 +1,9 @@
return {
- ["commands"]={ "beginfig", "endfig", "beginglyph", "endglyph", "charscale", "rotatedaround", "reflectedabout", "arrowhead", "currentpen", "currentpicture", "cuttings", "defaultfont", "extra_beginfig", "extra_endfig", "ditto", "EOF", "down", "evenly", "fullcircle", "halfcircle", "identity", "in", "left", "origin", "pensquare", "quartercircle", "right", "unitsquare", "up", "withdots", "abs", "bbox", "ceiling", "center", "cutafter", "cutbefore", "dir", "directionpoint", "div", "dotprod", "intersectionpoint", "inverse", "mod", "round", "unitvector", "whatever", "cutdraw", "draw", "drawarrow", "drawdblarrow", "fill", "filldraw", "drawdot", "loggingall", "interact", "tracingall", "tracingnone", "pickup", "undraw", "unfill", "unfilldraw", "buildcycle", "dashpattern", "decr", "dotlabel", "dotlabels", "drawoptions", "incr", "label", "labels", "max", "min", "thelabel", "z", "beginchar", "blacker", "capsule_end", "change_width", "define_blacker_pixels", "define_corrected_pixels", "define_good_x_pixels", "define_good_y_pixels", "define_horizontal_corrected_pixels", "define_pixels", "define_whole_blacker_pixels", "define_whole_pixels", "define_whole_vertical_blacker_pixels", "define_whole_vertical_pixels", "endchar", "extra_beginchar", "extra_endchar", "extra_setup", "font_coding_scheme", "clearxy", "clearit", "clearpen", "shipit", "font_extra_space", "exitunless", "relax", "hide", "gobble", "gobbled", "stop", "blankpicture", "counterclockwise", "tensepath", "takepower", "direction", "softjoin", "makelabel", "rotatedabout", "flex", "superellipse", "erase", "image", "nullpen", "savepen", "clearpen", "penpos", "penlabels", "range", "numtok", "thru", "z", "laboff", "bye", "red", "green", "blue", "cyan", "magenta", "yellow", "black", "white", "background", "graypart", "graycolor", "mm", "pt", "dd", "bp", "cm", "pc", "cc", "in", "triplet", "quadruplet" },
- ["internals"]={ "mitered", "rounded", "beveled", "butt", "squared", "eps", "epsilon", "infinity", "bboxmargin", "ahlength", "ahangle", "labeloffset", "dotlabeldiam", "defaultpen", "defaultscale", "join_radius", "pen_lft", "pen_rt", "pen_top", "pen_bot" },
- ["primitives"]={ "charcode", "day", "linecap", "linejoin", "miterlimit", "month", "pausing", "prologues", "showstopping", "time", "tracingcapsules", "tracingchoices", "mpprocset", "tracingcommands", "tracingequations", "tracinglostchars", "tracingmacros", "tracingonline", "tracingoutput", "tracingrestores", "tracingspecs", "tracingstats", "tracingtitles", "truecorners", "warningcheck", "year", "false", "nullpicture", "pencircle", "true", "and", "angle", "arclength", "arctime", "ASCII", "boolean", "bot", "char", "color", "cosd", "cycle", "decimal", "directiontime", "floor", "fontsize", "hex", "infont", "intersectiontimes", "known", "length", "llcorner", "lrcorner", "makepath", "makepen", "mexp", "mlog", "normaldeviate", "not", "numeric", "oct", "odd", "or", "path", "pair", "pen", "penoffset", "picture", "point", "postcontrol", "precontrol", "reverse", "rotated", "scaled", "shifted", "sind", "slanted", "sqrt", "str", "string", "subpath", "substring", "transform", "transformed", "ulcorner", "uniformdeviate", "unknown", "urcorner", "xpart", "xscaled", "xxpart", "xypart", "ypart", "yscaled", "yxpart", "yypart", "zscaled", "addto", "clip", "input", "interim", "let", "newinternal", "save", "setbounds", "shipout", "show", "showdependencies", "showtoken", "showvariable", "special", "begingroup", "endgroup", "of", "curl", "tension", "and", "controls", "interpath", "on", "off", "def", "vardef", "enddef", "expr", "suffix", "text", "primary", "secondary", "tertiary", "primarydef", "secondarydef", "tertiarydef", "randomseed", "also", "contour", "doublepath", "withcolor", "withcmykcolor", "withpen", "dashed", "if", "else", "elseif", "fi", "for", "endfor", "forever", "exitif", "within", "forsuffixes", "downto", "upto", "step", "until", "charlist", "extensible", "fontdimen", "headerbyte", "kern", "ligtable", "boundarychar", "chardp", "charext", "charht", "charic", "charwd", "designsize", "fontmaking", "charexists", "cullit", "currenttransform", "gfcorners", "grayfont", "hround", "imagerules", "lowres_fix", "nodisplays", "notransforms", "openit", "displaying", "currentwindow", "screen_rows", "screen_cols", "pixels_per_inch", "cull", "display", "openwindow", "numspecial", "totalweight", "autorounding", "fillin", "proofing", "tracingpens", "xoffset", "chardx", "granularity", "smoothing", "turningcheck", "yoffset", "chardy", "hppp", "tracingedges", "vppp", "extra_beginfig", "extra_endfig", "mpxbreak", "endinput", "message", "delimiters", "turningnumber", "errmessage", "readstring", "scantokens", "end", "outer", "inner", "write", "to", "readfrom", "withprescript", "withpostscript", "top", "bot", "lft", "rt", "ulft", "urt", "llft", "lrt", "redpart", "greenpart", "bluepart", "cyanpart", "magentapart", "yellowpart", "blackpart", "greypart", "prescriptpart", "postscriptpart", "rgbcolor", "cmykcolor", "greycolor", "graycolor", "colormodel", "graypart", "dashpart", "penpart", "stroked", "filled", "textual", "clipped", "bounded", "pathpart", "expandafter", "minute", "hour", "outputformat", "outputtemplate", "filenametemplate", "fontmapfile", "fontmapline", "fontpart", "fontsize", "glyph", "restoreclipcolor", "troffmode", "runscript" },
- ["shortcuts"]={ "..", "...", "--", "---", "&" },
+ ["commands"]={ "upto", "downto", "beginfig", "endfig", "beginglyph", "endglyph", "rotatedaround", "reflectedabout", "arrowhead", "currentpen", "currentpicture", "cuttings", "defaultfont", "extra_beginfig", "extra_endfig", "ditto", "EOF", "down", "evenly", "fullcircle", "halfcircle", "identity", "in", "left", "pensquare", "penrazor", "penspec", "origin", "quartercircle", "right", "unitsquare", "up", "withdots", "abs", "bbox", "ceiling", "center", "cutafter", "cutbefore", "dir", "directionpoint", "div", "dotprod", "intersectionpoint", "inverse", "mod", "round", "unitvector", "whatever", "cutdraw", "draw", "drawarrow", "drawdblarrow", "fill", "filldraw", "drawdot", "loggingall", "interact", "tracingall", "tracingnone", "pickup", "undraw", "unfill", "unfilldraw", "buildcycle", "dashpattern", "decr", "dotlabel", "dotlabels", "drawoptions", "incr", "label", "labels", "max", "min", "thelabel", "z", "beginchar", "blacker", "capsule_end", "change_width", "define_blacker_pixels", "define_corrected_pixels", "define_good_x_pixels", "define_good_y_pixels", "define_horizontal_corrected_pixels", "define_pixels", "define_whole_blacker_pixels", "define_whole_pixels", "define_whole_vertical_blacker_pixels", "define_whole_vertical_pixels", "endchar", "extra_beginchar", "extra_endchar", "extra_setup", "font_coding_scheme", "clearxy", "clearit", "clearpen", "shipit", "font_extra_space", "exitunless", "relax", "hide", "gobble", "gobbled", "stop", "blankpicture", "counterclockwise", "tensepath", "takepower", "direction", "softjoin", "makelabel", "rotatedabout", "flex", "superellipse", "image", "nullpen", "savepen", "clearpen", "penpos", "penlabels", "range", "thru", "z", "laboff", "bye", "red", "green", "blue", "cyan", "magenta", "yellow", "black", "white", "background", "mm", "pt", "dd", "bp", "cm", "pc", "cc", "in", "triplet", "quadruplet" },
+ ["disabled"]={ "verbatimtex", "troffmode" },
+ ["internals"]={ "mitered", "rounded", "beveled", "butt", "squared", "eps", "epsilon", "infinity", "bboxmargin", "ahlength", "ahangle", "labeloffset", "dotlabeldiam", "defaultpen", "defaultscale", "join_radius", "charscale", "pen_lft", "pen_rt", "pen_top", "pen_bot" },
+ ["metafont"]={ "autorounding", "beginchar", "blacker", "boundarychar", "capsule_def", "capsule_end", "change_width", "chardp", "chardx", "chardy", "charexists", "charext", "charht", "charic", "charlist", "charwd", "cull", "cullit", "currenttransform", "currentwindow", "define_blacker_pixels", "define_corrected_pixels", "define_good_x_pixels", "define_good_y_pixels", "define_horizontal_corrected_pixels", "define_pixels", "define_whole_blacker_pixels", "define_whole_pixels", "define_whole_vertical_blacker_pixels", "define_whole_vertical_pixels", "designsize", "display", "displaying", "endchar", "extensible", "extra_beginchar", "extra_endchar", "extra_setup", "fillin", "font_coding_scheme", "font_extra_space", "font_identifier", "font_normal_shrink", "font_normal_space", "font_normal_stretch", "font_quad", "font_size", "font_slant", "font_x_height", "fontdimen", "fontmaking", "gfcorners", "granularity", "grayfont", "headerbyte", "hppp", "hround", "imagerules", "italcorr", "kern", "labelfont", "ligtable", "lowres_fix", "makebox", "makegrid", "maketicks", "mode_def", "mode_setup", "nodisplays", "notransforms", "numspecial", "o_correction", "openit", "openwindow", "pixels_per_inch", "proofing", "proofoffset", "proofrule", "proofrulethickness", "rulepen", "screenchars", "screenrule", "screenstrokes", "screen_cols", "screen_rows", "showit", "slantfont", "smode", "smoothing", "titlefont", "totalweight", "tracingedges", "tracingpens", "turningcheck", "unitpixel", "vppp", "vround", "xoffset", "yoffset" },
+ ["primitives"]={ "charcode", "day", "linecap", "linejoin", "miterlimit", "month", "pausing", "prologues", "showstopping", "time", "tracingcapsules", "tracingchoices", "mpprocset", "tracingcommands", "tracingequations", "tracinglostchars", "tracingmacros", "tracingonline", "tracingoutput", "tracingrestores", "tracingspecs", "tracingstats", "tracingtitles", "truecorners", "warningcheck", "year", "false", "nullpicture", "pencircle", "true", "and", "angle", "arclength", "arctime", "ASCII", "boolean", "bot", "char", "color", "cosd", "cycle", "decimal", "directiontime", "floor", "fontsize", "hex", "infont", "intersectiontimes", "known", "length", "llcorner", "lrcorner", "makepath", "makepen", "mexp", "mlog", "normaldeviate", "not", "numeric", "oct", "odd", "or", "path", "pair", "pen", "penoffset", "picture", "point", "postcontrol", "precontrol", "reverse", "rotated", "scaled", "shifted", "sind", "slanted", "sqrt", "str", "string", "subpath", "substring", "transform", "transformed", "ulcorner", "uniformdeviate", "unknown", "urcorner", "xpart", "xscaled", "xxpart", "xypart", "ypart", "yscaled", "yxpart", "yypart", "zscaled", "addto", "clip", "input", "interim", "let", "newinternal", "save", "setbounds", "shipout", "show", "showdependencies", "showtoken", "showvariable", "special", "begingroup", "endgroup", "of", "curl", "tension", "and", "controls", "interpath", "on", "off", "def", "vardef", "enddef", "expr", "suffix", "text", "primary", "secondary", "tertiary", "primarydef", "secondarydef", "tertiarydef", "randomseed", "also", "contour", "doublepath", "withcolor", "withcmykcolor", "withpen", "dashed", "if", "else", "elseif", "fi", "for", "endfor", "forever", "exitif", "within", "forsuffixes", "step", "until", "charlist", "extensible", "fontdimen", "headerbyte", "kern", "ligtable", "boundarychar", "chardp", "charext", "charht", "charic", "charwd", "designsize", "fontmaking", "charexists", "cullit", "currenttransform", "gfcorners", "grayfont", "hround", "imagerules", "lowres_fix", "nodisplays", "notransforms", "openit", "displaying", "currentwindow", "screen_rows", "screen_cols", "pixels_per_inch", "cull", "display", "openwindow", "numspecial", "totalweight", "autorounding", "fillin", "proofing", "tracingpens", "xoffset", "chardx", "granularity", "smoothing", "turningcheck", "yoffset", "chardy", "hppp", "tracingedges", "vppp", "extra_beginfig", "extra_endfig", "mpxbreak", "endinput", "message", "delimiters", "turningnumber", "errmessage", "readstring", "scantokens", "end", "outer", "inner", "write", "to", "readfrom", "withprescript", "withpostscript", "top", "bot", "lft", "rt", "ulft", "urt", "llft", "lrt", "redpart", "greenpart", "bluepart", "cyanpart", "magentapart", "yellowpart", "blackpart", "prescriptpart", "postscriptpart", "rgbcolor", "cmykcolor", "colormodel", "graypart", "greypart", "greycolor", "graycolor", "dashpart", "penpart", "stroked", "filled", "textual", "clipped", "bounded", "pathpart", "expandafter", "minute", "hour", "outputformat", "outputtemplate", "filenametemplate", "fontmapfile", "fontmapline", "fontpart", "fontsize", "glyph", "restoreclipcolor", "troffmode", "runscript", "maketext" },
+ ["shortcuts"]={ "..", "...", "--", "---", "&", "\\" },
["tex"]={ "btex", "etex", "verbatimtex" },
} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-tex.lua b/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-tex.lua
index 415b7412834..90b64c5123d 100644
--- a/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-tex.lua
+++ b/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-tex.lua
@@ -1,9 +1,9 @@
return {
["aleph"]={ "AlephVersion", "Alephminorversion", "Alephrevision", "Alephversion", "Omegaminorversion", "Omegarevision", "Omegaversion", "boxdir", "pagebottomoffset", "pagerightoffset" },
["etex"]={ "botmarks", "clubpenalties", "currentgrouplevel", "currentgrouptype", "currentifbranch", "currentiflevel", "currentiftype", "detokenize", "dimexpr", "displaywidowpenalties", "eTeXVersion", "eTeXminorversion", "eTeXrevision", "eTeXversion", "everyeof", "firstmarks", "fontchardp", "fontcharht", "fontcharic", "fontcharwd", "glueexpr", "glueshrink", "glueshrinkorder", "gluestretch", "gluestretchorder", "gluetomu", "ifcsname", "ifdefined", "iffontchar", "interactionmode", "interlinepenalties", "lastlinefit", "lastnodetype", "marks", "muexpr", "mutoglue", "numexpr", "pagediscards", "parshapedimen", "parshapeindent", "parshapelength", "predisplaydirection", "protected", "readline", "savinghyphcodes", "savingvdiscards", "scantokens", "showgroups", "showifs", "showtokens", "splitbotmarks", "splitdiscards", "splitfirstmarks", "topmarks", "tracingassigns", "tracinggroups", "tracingifs", "tracingnesting", "tracingscantokens", "unexpanded", "unless", "widowpenalties" },
- ["luatex"]={ "Uchar", "Udelcode", "Udelcodenum", "Udelimiter", "Udelimiterover", "Udelimiterunder", "Umathaccent", "Umathaxis", "Umathbinbinspacing", "Umathbinclosespacing", "Umathbininnerspacing", "Umathbinopenspacing", "Umathbinopspacing", "Umathbinordspacing", "Umathbinpunctspacing", "Umathbinrelspacing", "Umathchar", "Umathchardef", "Umathcharnum", "Umathclosebinspacing", "Umathcloseclosespacing", "Umathcloseinnerspacing", "Umathcloseopenspacing", "Umathcloseopspacing", "Umathcloseordspacing", "Umathclosepunctspacing", "Umathcloserelspacing", "Umathcode", "Umathcodenum", "Umathconnectoroverlapmin", "Umathfractiondelsize", "Umathfractiondenomdown", "Umathfractiondenomvgap", "Umathfractionnumup", "Umathfractionnumvgap", "Umathfractionrule", "Umathinnerbinspacing", "Umathinnerclosespacing", "Umathinnerinnerspacing", "Umathinneropenspacing", "Umathinneropspacing", "Umathinnerordspacing", "Umathinnerpunctspacing", "Umathinnerrelspacing", "Umathlimitabovebgap", "Umathlimitabovekern", "Umathlimitabovevgap", "Umathlimitbelowbgap", "Umathlimitbelowkern", "Umathlimitbelowvgap", "Umathopbinspacing", "Umathopclosespacing", "Umathopenbinspacing", "Umathopenclosespacing", "Umathopeninnerspacing", "Umathopenopenspacing", "Umathopenopspacing", "Umathopenordspacing", "Umathopenpunctspacing", "Umathopenrelspacing", "Umathoperatorsize", "Umathopinnerspacing", "Umathopopenspacing", "Umathopopspacing", "Umathopordspacing", "Umathoppunctspacing", "Umathoprelspacing", "Umathordbinspacing", "Umathordclosespacing", "Umathordinnerspacing", "Umathordopenspacing", "Umathordopspacing", "Umathordordspacing", "Umathordpunctspacing", "Umathordrelspacing", "Umathoverbarkern", "Umathoverbarrule", "Umathoverbarvgap", "Umathoverdelimiterbgap", "Umathoverdelimitervgap", "Umathpunctbinspacing", "Umathpunctclosespacing", "Umathpunctinnerspacing", "Umathpunctopenspacing", "Umathpunctopspacing", "Umathpunctordspacing", "Umathpunctpunctspacing", "Umathpunctrelspacing", "Umathquad", "Umathradicaldegreeafter", "Umathradicaldegreebefore", "Umathradicaldegreeraise", "Umathradicalkern", "Umathradicalrule", "Umathradicalvgap", "Umathrelbinspacing", "Umathrelclosespacing", "Umathrelinnerspacing", "Umathrelopenspacing", "Umathrelopspacing", "Umathrelordspacing", "Umathrelpunctspacing", "Umathrelrelspacing", "Umathspaceafterscript", "Umathstackdenomdown", "Umathstacknumup", "Umathstackvgap", "Umathsubshiftdown", "Umathsubshiftdrop", "Umathsubsupshiftdown", "Umathsubsupvgap", "Umathsubtopmax", "Umathsupbottommin", "Umathsupshiftdrop", "Umathsupshiftup", "Umathsupsubbottommax", "Umathunderbarkern", "Umathunderbarrule", "Umathunderbarvgap", "Umathunderdelimiterbgap", "Umathunderdelimitervgap", "Uoverdelimiter", "Uradical", "Uroot", "Ustack", "Ustartdisplaymath", "Ustartmath", "Ustopdisplaymath", "Ustopmath", "Usubscript", "Usuperscript", "Uunderdelimiter", "alignmark", "aligntab", "attribute", "attributedef", "catcodetable", "clearmarks", "crampeddisplaystyle", "crampedscriptscriptstyle", "crampedscriptstyle", "crampedtextstyle", "fontid", "formatname", "gleaders", "ifabsdim", "ifabsnum", "ifprimitive", "initcatcodetable", "latelua", "luaescapestring", "luastartup", "luatexdatestamp", "luatexrevision", "luatexversion", "luafunction", "mathstyle", "nokerns", "noligs", "outputbox", "pageleftoffset", "pagetopoffset", "postexhyphenchar", "posthyphenchar", "preexhyphenchar", "prehyphenchar", "primitive", "savecatcodetable", "scantextokens", "suppressfontnotfounderror", "suppressifcsnameerror", "suppresslongerror", "suppressoutererror", "synctex" },
+ ["luatex"]={ "Uchar", "Udelcode", "Udelcodenum", "Udelimiter", "Udelimiterover", "Udelimiterunder", "Umathaccent", "Umathaxis", "Umathbinbinspacing", "Umathbinclosespacing", "Umathbininnerspacing", "Umathbinopenspacing", "Umathbinopspacing", "Umathbinordspacing", "Umathbinpunctspacing", "Umathbinrelspacing", "Umathchar", "Umathchardef", "Umathcharnum", "Umathclosebinspacing", "Umathcloseclosespacing", "Umathcloseinnerspacing", "Umathcloseopenspacing", "Umathcloseopspacing", "Umathcloseordspacing", "Umathclosepunctspacing", "Umathcloserelspacing", "Umathcode", "Umathcodenum", "Umathconnectoroverlapmin", "Umathfractiondelsize", "Umathfractiondenomdown", "Umathfractiondenomvgap", "Umathfractionnumup", "Umathfractionnumvgap", "Umathfractionrule", "Umathinnerbinspacing", "Umathinnerclosespacing", "Umathinnerinnerspacing", "Umathinneropenspacing", "Umathinneropspacing", "Umathinnerordspacing", "Umathinnerpunctspacing", "Umathinnerrelspacing", "Umathlimitabovebgap", "Umathlimitabovekern", "Umathlimitabovevgap", "Umathlimitbelowbgap", "Umathlimitbelowkern", "Umathlimitbelowvgap", "Umathopbinspacing", "Umathopclosespacing", "Umathopenbinspacing", "Umathopenclosespacing", "Umathopeninnerspacing", "Umathopenopenspacing", "Umathopenopspacing", "Umathopenordspacing", "Umathopenpunctspacing", "Umathopenrelspacing", "Umathoperatorsize", "Umathopinnerspacing", "Umathopopenspacing", "Umathopopspacing", "Umathopordspacing", "Umathoppunctspacing", "Umathoprelspacing", "Umathordbinspacing", "Umathordclosespacing", "Umathordinnerspacing", "Umathordopenspacing", "Umathordopspacing", "Umathordordspacing", "Umathordpunctspacing", "Umathordrelspacing", "Umathoverbarkern", "Umathoverbarrule", "Umathoverbarvgap", "Umathoverdelimiterbgap", "Umathoverdelimitervgap", "Umathpunctbinspacing", "Umathpunctclosespacing", "Umathpunctinnerspacing", "Umathpunctopenspacing", "Umathpunctopspacing", "Umathpunctordspacing", "Umathpunctpunctspacing", "Umathpunctrelspacing", "Umathquad", "Umathradicaldegreeafter", "Umathradicaldegreebefore", "Umathradicaldegreeraise", "Umathradicalkern", "Umathradicalrule", "Umathradicalvgap", "Umathrelbinspacing", "Umathrelclosespacing", "Umathrelinnerspacing", "Umathrelopenspacing", "Umathrelopspacing", "Umathrelordspacing", "Umathrelpunctspacing", "Umathrelrelspacing", "Umathspaceafterscript", "Umathstackdenomdown", "Umathstacknumup", "Umathstackvgap", "Umathsubshiftdown", "Umathsubshiftdrop", "Umathsubsupshiftdown", "Umathsubsupvgap", "Umathsubtopmax", "Umathsupbottommin", "Umathsupshiftdrop", "Umathsupshiftup", "Umathsupsubbottommax", "Umathunderbarkern", "Umathunderbarrule", "Umathunderbarvgap", "Umathunderdelimiterbgap", "Umathunderdelimitervgap", "Uoverdelimiter", "Uradical", "Uroot", "Ustack", "Ustartdisplaymath", "Ustartmath", "Ustopdisplaymath", "Ustopmath", "Usubscript", "Usuperscript", "Uunderdelimiter", "alignmark", "aligntab", "attribute", "attributedef", "catcodetable", "clearmarks", "crampeddisplaystyle", "crampedscriptscriptstyle", "crampedscriptstyle", "crampedtextstyle", "fontid", "formatname", "gleaders", "ifabsdim", "ifabsnum", "ifprimitive", "initcatcodetable", "latelua", "luaescapestring", "luastartup", "luatexbanner", "luatexrevision", "luatexversion", "luafunction", "mathstyle", "nokerns", "noligs", "outputbox", "pageleftoffset", "pagetopoffset", "postexhyphenchar", "posthyphenchar", "preexhyphenchar", "prehyphenchar", "primitive", "savecatcodetable", "scantextokens", "suppressfontnotfounderror", "suppressifcsnameerror", "suppresslongerror", "suppressoutererror", "suppressmathparerror", "synctex" },
["omega"]={ "OmegaVersion", "bodydir", "chardp", "charht", "charit", "charwd", "leftghost", "localbrokenpenalty", "localinterlinepenalty", "localleftbox", "localrightbox", "mathdir", "odelcode", "odelimiter", "omathaccent", "omathchar", "omathchardef", "omathcode", "oradical", "pagedir", "pageheight", "pagewidth", "pardir", "rightghost", "textdir" },
["pdftex"]={ "efcode", "expanded", "ifincsname", "ifpdfabsdim", "ifpdfabsnum", "ifpdfprimitive", "leftmarginkern", "letterspacefont", "lpcode", "pdfadjustspacing", "pdfannot", "pdfcatalog", "pdfcolorstack", "pdfcolorstackinit", "pdfcompresslevel", "pdfcopyfont", "pdfcreationdate", "pdfdecimaldigits", "pdfdest", "pdfdestmargin", "pdfdraftmode", "pdfeachlinedepth", "pdfeachlineheight", "pdfendlink", "pdfendthread", "pdffirstlineheight", "pdffontattr", "pdffontexpand", "pdffontname", "pdffontobjnum", "pdffontsize", "pdfgamma", "pdfgentounicode", "pdfglyphtounicode", "pdfhorigin", "pdfignoreddimen", "pdfimageapplygamma", "pdfimagegamma", "pdfimagehicolor", "pdfimageresolution", "pdfincludechars", "pdfinclusioncopyfonts", "pdfinclusionerrorlevel", "pdfinfo", "pdfinsertht", "pdflastannot", "pdflastlinedepth", "pdflastlink", "pdflastobj", "pdflastxform", "pdflastximage", "pdflastximagecolordepth", "pdflastximagepages", "pdflastxpos", "pdflastypos", "pdflinkmargin", "pdfliteral", "pdfmapfile", "pdfmapline", "pdfminorversion", "pdfnames", "pdfnoligatures", "pdfnormaldeviate", "pdfobj", "pdfobjcompresslevel", "pdfoptionpdfminorversion", "pdfoutline", "pdfoutput", "pdfpageattr", "pdfpagebox", "pdfpageheight", "pdfpageref", "pdfpageresources", "pdfpagesattr", "pdfpagewidth", "pdfpkmode", "pdfpkresolution", "pdfprimitive", "pdfprotrudechars", "pdfpxdimen", "pdfrandomseed", "pdfrefobj", "pdfrefxform", "pdfrefximage", "pdfreplacefont", "pdfrestore", "pdfretval", "pdfsave", "pdfsavepos", "pdfsetmatrix", "pdfsetrandomseed", "pdfstartlink", "pdfstartthread", "pdftexbanner", "pdftexrevision", "pdftexversion", "pdfthread", "pdfthreadmargin", "pdftracingfonts", "pdftrailer", "pdfuniformdeviate", "pdfuniqueresname", "pdfvorigin", "pdfxform", "pdfxformattr", "pdfxformname", "pdfxformresources", "pdfximage", "pdfximagebbox", "quitvmode", "rightmarginkern", "rpcode", "tagcode" },
- ["tex"]={ "-", "/", "AlephVersion", "Alephminorversion", "Alephrevision", "Alephversion", "OmegaVersion", "Omegaminorversion", "Omegarevision", "Omegaversion", "Udelcode", "Udelcodenum", "Udelimiter", "Udelimiterover", "Udelimiterunder", "Umathaccent", "Umathaxis", "Umathbinbinspacing", "Umathbinclosespacing", "Umathbininnerspacing", "Umathbinopenspacing", "Umathbinopspacing", "Umathbinordspacing", "Umathbinpunctspacing", "Umathbinrelspacing", "Umathchar", "Umathchardef", "Umathcharnum", "Umathclosebinspacing", "Umathcloseclosespacing", "Umathcloseinnerspacing", "Umathcloseopenspacing", "Umathcloseopspacing", "Umathcloseordspacing", "Umathclosepunctspacing", "Umathcloserelspacing", "Umathcode", "Umathcodenum", "Umathconnectoroverlapmin", "Umathfractiondelsize", "Umathfractiondenomdown", "Umathfractiondenomvgap", "Umathfractionnumup", "Umathfractionnumvgap", "Umathfractionrule", "Umathinnerbinspacing", "Umathinnerclosespacing", "Umathinnerinnerspacing", "Umathinneropenspacing", "Umathinneropspacing", "Umathinnerordspacing", "Umathinnerpunctspacing", "Umathinnerrelspacing", "Umathlimitabovebgap", "Umathlimitabovekern", "Umathlimitabovevgap", "Umathlimitbelowbgap", "Umathlimitbelowkern", "Umathlimitbelowvgap", "Umathopbinspacing", "Umathopclosespacing", "Umathopenbinspacing", "Umathopenclosespacing", "Umathopeninnerspacing", "Umathopenopenspacing", "Umathopenopspacing", "Umathopenordspacing", "Umathopenpunctspacing", "Umathopenrelspacing", "Umathoperatorsize", "Umathopinnerspacing", "Umathopopenspacing", "Umathopopspacing", "Umathopordspacing", "Umathoppunctspacing", "Umathoprelspacing", "Umathordbinspacing", "Umathordclosespacing", "Umathordinnerspacing", "Umathordopenspacing", "Umathordopspacing", "Umathordordspacing", "Umathordpunctspacing", "Umathordrelspacing", "Umathoverbarkern", "Umathoverbarrule", "Umathoverbarvgap", "Umathoverdelimiterbgap", "Umathoverdelimitervgap", "Umathpunctbinspacing", "Umathpunctclosespacing", "Umathpunctinnerspacing", "Umathpunctopenspacing", "Umathpunctopspacing", "Umathpunctordspacing", "Umathpunctpunctspacing", "Umathpunctrelspacing", "Umathquad", "Umathradicaldegreeafter", "Umathradicaldegreebefore", "Umathradicaldegreeraise", "Umathradicalkern", "Umathradicalrule", "Umathradicalvgap", "Umathrelbinspacing", "Umathrelclosespacing", "Umathrelinnerspacing", "Umathrelopenspacing", "Umathrelopspacing", "Umathrelordspacing", "Umathrelpunctspacing", "Umathrelrelspacing", "Umathspaceafterscript", "Umathstackdenomdown", "Umathstacknumup", "Umathstackvgap", "Umathsubshiftdown", "Umathsubshiftdrop", "Umathsubsupshiftdown", "Umathsubsupvgap", "Umathsubtopmax", "Umathsupbottommin", "Umathsupshiftdrop", "Umathsupshiftup", "Umathsupsubbottommax", "Umathunderbarkern", "Umathunderbarrule", "Umathunderbarvgap", "Umathunderdelimiterbgap", "Umathunderdelimitervgap", "Uoverdelimiter", "Uradical", "Uroot", "Ustack", "Ustartdisplaymath", "Ustartmath", "Ustopdisplaymath", "Ustopmath", "Usubscript", "Usuperscript", "Uunderdelimiter", "above", "abovedisplayshortskip", "abovedisplayskip", "abovewithdelims", "accent", "adjdemerits", "advance", "afterassignment", "aftergroup", "alignmark", "aligntab", "atop", "atopwithdelims", "attribute", "attributedef", "badness", "baselineskip", "batchmode", "begingroup", "belowdisplayshortskip", "belowdisplayskip", "binoppenalty", "bodydir", "botmark", "botmarks", "box", "boxdir", "boxmaxdepth", "brokenpenalty", "catcode", "catcodetable", "char", "chardef", "cleaders", "clearmarks", "closein", "closeout", "clubpenalties", "clubpenalty", "copy", "count", "countdef", "cr", "crampeddisplaystyle", "crampedscriptscriptstyle", "crampedscriptstyle", "crampedtextstyle", "crcr", "csname", "currentgrouplevel", "currentgrouptype", "currentifbranch", "currentiflevel", "currentiftype", "day", "deadcycles", "def", "defaulthyphenchar", "defaultskewchar", "delcode", "delimiter", "delimiterfactor", "delimitershortfall", "detokenize", "dimen", "dimendef", "dimexpr", "directlua", "discretionary", "displayindent", "displaylimits", "displaystyle", "displaywidowpenalties", "displaywidowpenalty", "displaywidth", "divide", "doublehyphendemerits", "dp", "dump", "eTeXVersion", "eTeXminorversion", "eTeXrevision", "eTeXversion", "edef", "efcode", "else", "emergencystretch", "end", "endcsname", "endgroup", "endinput", "endlinechar", "eqno", "errhelp", "errmessage", "errorcontextlines", "errorstopmode", "escapechar", "everycr", "everydisplay", "everyeof", "everyhbox", "everyjob", "everymath", "everypar", "everyvbox", "exhyphenchar", "exhyphenpenalty", "expandafter", "expanded", "fam", "fi", "finalhyphendemerits", "firstmark", "firstmarks", "floatingpenalty", "font", "fontchardp", "fontcharht", "fontcharic", "fontcharwd", "fontdimen", "fontid", "fontname", "formatname", "futurelet", "gdef", "gleaders", "global", "globaldefs", "glueexpr", "glueshrink", "glueshrinkorder", "gluestretch", "gluestretchorder", "gluetomu", "halign", "hangafter", "hangindent", "hbadness", "hbox", "hfil", "hfill", "hfilneg", "hfuzz", "hoffset", "holdinginserts", "hrule", "hsize", "hskip", "hss", "ht", "hyphenation", "hyphenchar", "hyphenpenalty", "if", "ifabsdim", "ifabsnum", "ifcase", "ifcat", "ifcsname", "ifdefined", "ifdim", "ifeof", "iffalse", "iffontchar", "ifhbox", "ifhmode", "ifincsname", "ifinner", "ifmmode", "ifnum", "ifodd", "ifpdfabsdim", "ifpdfabsnum", "ifpdfprimitive", "ifprimitive", "iftrue", "ifvbox", "ifvmode", "ifvoid", "ifx", "ignorespaces", "immediate", "indent", "initcatcodetable", "input", "inputlineno", "insert", "insertpenalties", "interactionmode", "interlinepenalties", "interlinepenalty", "jobname", "kern", "language", "lastbox", "lastkern", "lastlinefit", "lastnodetype", "lastpenalty", "lastskip", "latelua", "lccode", "leaders", "left", "leftghost", "lefthyphenmin", "leftmarginkern", "leftskip", "leqno", "let", "letterspacefont", "limits", "linepenalty", "lineskip", "lineskiplimit", "localbrokenpenalty", "localinterlinepenalty", "localleftbox", "localrightbox", "long", "looseness", "lower", "lowercase", "lpcode", "luaescapestring", "luastartup", "luatexdatestamp", "luatexrevision", "luatexversion", "mag", "mark", "marks", "mathaccent", "mathbin", "mathchar", "mathchardef", "mathchoice", "mathclose", "mathcode", "mathdir", "mathinner", "mathop", "mathopen", "mathord", "mathpunct", "mathrel", "mathstyle", "mathsurround", "maxdeadcycles", "maxdepth", "meaning", "medmuskip", "message", "middle", "mkern", "month", "moveleft", "moveright", "mskip", "muexpr", "multiply", "muskip", "muskipdef", "mutoglue", "newlinechar", "noalign", "noboundary", "noexpand", "noindent", "nokerns", "noligs", "nolimits", "nolocaldirs", "nolocalwhatsits", "nonscript", "nonstopmode", "nulldelimiterspace", "nullfont", "number", "numexpr", "odelcode", "odelimiter", "omathaccent", "omathchar", "omathchardef", "omathcode", "omit", "openin", "openout", "or", "oradical", "outer", "output", "outputbox", "outputpenalty", "over", "overfullrule", "overline", "overwithdelims", "pagebottomoffset", "pagedepth", "pagedir", "pagediscards", "pagefilllstretch", "pagefillstretch", "pagefilstretch", "pagegoal", "pageheight", "pageleftoffset", "pagerightoffset", "pageshrink", "pagestretch", "pagetopoffset", "pagetotal", "pagewidth", "par", "pardir", "parfillskip", "parindent", "parshape", "parshapedimen", "parshapeindent", "parshapelength", "parskip", "patterns", "pausing", "pdfadjustspacing", "pdfannot", "pdfcatalog", "pdfcolorstack", "pdfcolorstackinit", "pdfcompresslevel", "pdfcopyfont", "pdfcreationdate", "pdfdecimaldigits", "pdfdest", "pdfdestmargin", "pdfdraftmode", "pdfeachlinedepth", "pdfeachlineheight", "pdfendlink", "pdfendthread", "pdffirstlineheight", "pdffontattr", "pdffontexpand", "pdffontname", "pdffontobjnum", "pdffontsize", "pdfgamma", "pdfgentounicode", "pdfglyphtounicode", "pdfhorigin", "pdfignoreddimen", "pdfimageapplygamma", "pdfimagegamma", "pdfimagehicolor", "pdfimageresolution", "pdfincludechars", "pdfinclusioncopyfonts", "pdfinclusionerrorlevel", "pdfinfo", "pdfinsertht", "pdflastannot", "pdflastlinedepth", "pdflastlink", "pdflastobj", "pdflastxform", "pdflastximage", "pdflastximagecolordepth", "pdflastximagepages", "pdflastxpos", "pdflastypos", "pdflinkmargin", "pdfliteral", "pdfmapfile", "pdfmapline", "pdfminorversion", "pdfnames", "pdfnoligatures", "pdfnormaldeviate", "pdfobj", "pdfobjcompresslevel", "pdfoptionpdfminorversion", "pdfoutline", "pdfoutput", "pdfpageattr", "pdfpagebox", "pdfpageheight", "pdfpageref", "pdfpageresources", "pdfpagesattr", "pdfpagewidth", "pdfpkmode", "pdfpkresolution", "pdfprimitive", "pdfprotrudechars", "pdfpxdimen", "pdfrandomseed", "pdfrefobj", "pdfrefxform", "pdfrefximage", "pdfreplacefont", "pdfrestore", "pdfretval", "pdfsave", "pdfsavepos", "pdfsetmatrix", "pdfsetrandomseed", "pdfstartlink", "pdfstartthread", "pdftexbanner", "pdftexrevision", "pdftexversion", "pdfthread", "pdfthreadmargin", "pdftracingfonts", "pdftrailer", "pdfuniformdeviate", "pdfuniqueresname", "pdfvorigin", "pdfxform", "pdfxformattr", "pdfxformname", "pdfxformresources", "pdfximage", "pdfximagebbox", "penalty", "postdisplaypenalty", "postexhyphenchar", "posthyphenchar", "predisplaydirection", "predisplaypenalty", "predisplaysize", "preexhyphenchar", "prehyphenchar", "pretolerance", "prevdepth", "prevgraf", "primitive", "protected", "quitvmode", "radical", "raise", "read", "readline", "relax", "relpenalty", "right", "rightghost", "righthyphenmin", "rightmarginkern", "rightskip", "romannumeral", "rpcode", "savecatcodetable", "savinghyphcodes", "savingvdiscards", "scantextokens", "scantokens", "scriptfont", "scriptscriptfont", "scriptscriptstyle", "scriptspace", "scriptstyle", "scrollmode", "setbox", "setlanguage", "sfcode", "shipout", "show", "showbox", "showboxbreadth", "showboxdepth", "showgroups", "showifs", "showlists", "showthe", "showtokens", "skewchar", "skip", "skipdef", "spacefactor", "spaceskip", "span", "special", "splitbotmark", "splitbotmarks", "splitdiscards", "splitfirstmark", "splitfirstmarks", "splitmaxdepth", "splittopskip", "string", "suppressfontnotfounderror", "suppressifcsnameerror", "suppresslongerror", "suppressoutererror", "synctex", "tabskip", "tagcode", "textdir", "textfont", "textstyle", "the", "thickmuskip", "thinmuskip", "time", "toks", "toksdef", "tolerance", "topmark", "topmarks", "topskip", "tracingassigns", "tracingcommands", "tracinggroups", "tracingifs", "tracinglostchars", "tracingmacros", "tracingnesting", "tracingonline", "tracingoutput", "tracingpages", "tracingparagraphs", "tracingrestores", "tracingscantokens", "tracingstats", "uccode", "uchyph", "underline", "unexpanded", "unhbox", "unhcopy", "unkern", "unless", "unpenalty", "unskip", "unvbox", "unvcopy", "uppercase", "vadjust", "valign", "vbadness", "vbox", "vcenter", "vfil", "vfill", "vfilneg", "vfuzz", "voffset", "vrule", "vsize", "vskip", "vsplit", "vss", "vtop", "wd", "widowpenalties", "widowpenalty", "write", "xdef", "xleaders", "xspaceskip", "year" },
+ ["tex"]={ "-", "/", "AlephVersion", "Alephminorversion", "Alephrevision", "Alephversion", "OmegaVersion", "Omegaminorversion", "Omegarevision", "Omegaversion", "Udelcode", "Udelcodenum", "Udelimiter", "Udelimiterover", "Udelimiterunder", "Umathaccent", "Umathaxis", "Umathbinbinspacing", "Umathbinclosespacing", "Umathbininnerspacing", "Umathbinopenspacing", "Umathbinopspacing", "Umathbinordspacing", "Umathbinpunctspacing", "Umathbinrelspacing", "Umathchar", "Umathchardef", "Umathcharnum", "Umathclosebinspacing", "Umathcloseclosespacing", "Umathcloseinnerspacing", "Umathcloseopenspacing", "Umathcloseopspacing", "Umathcloseordspacing", "Umathclosepunctspacing", "Umathcloserelspacing", "Umathcode", "Umathcodenum", "Umathconnectoroverlapmin", "Umathfractiondelsize", "Umathfractiondenomdown", "Umathfractiondenomvgap", "Umathfractionnumup", "Umathfractionnumvgap", "Umathfractionrule", "Umathinnerbinspacing", "Umathinnerclosespacing", "Umathinnerinnerspacing", "Umathinneropenspacing", "Umathinneropspacing", "Umathinnerordspacing", "Umathinnerpunctspacing", "Umathinnerrelspacing", "Umathlimitabovebgap", "Umathlimitabovekern", "Umathlimitabovevgap", "Umathlimitbelowbgap", "Umathlimitbelowkern", "Umathlimitbelowvgap", "Umathopbinspacing", "Umathopclosespacing", "Umathopenbinspacing", "Umathopenclosespacing", "Umathopeninnerspacing", "Umathopenopenspacing", "Umathopenopspacing", "Umathopenordspacing", "Umathopenpunctspacing", "Umathopenrelspacing", "Umathoperatorsize", "Umathopinnerspacing", "Umathopopenspacing", "Umathopopspacing", "Umathopordspacing", "Umathoppunctspacing", "Umathoprelspacing", "Umathordbinspacing", "Umathordclosespacing", "Umathordinnerspacing", "Umathordopenspacing", "Umathordopspacing", "Umathordordspacing", "Umathordpunctspacing", "Umathordrelspacing", "Umathoverbarkern", "Umathoverbarrule", "Umathoverbarvgap", "Umathoverdelimiterbgap", "Umathoverdelimitervgap", "Umathpunctbinspacing", "Umathpunctclosespacing", "Umathpunctinnerspacing", "Umathpunctopenspacing", "Umathpunctopspacing", "Umathpunctordspacing", "Umathpunctpunctspacing", "Umathpunctrelspacing", "Umathquad", "Umathradicaldegreeafter", "Umathradicaldegreebefore", "Umathradicaldegreeraise", "Umathradicalkern", "Umathradicalrule", "Umathradicalvgap", "Umathrelbinspacing", "Umathrelclosespacing", "Umathrelinnerspacing", "Umathrelopenspacing", "Umathrelopspacing", "Umathrelordspacing", "Umathrelpunctspacing", "Umathrelrelspacing", "Umathspaceafterscript", "Umathstackdenomdown", "Umathstacknumup", "Umathstackvgap", "Umathsubshiftdown", "Umathsubshiftdrop", "Umathsubsupshiftdown", "Umathsubsupvgap", "Umathsubtopmax", "Umathsupbottommin", "Umathsupshiftdrop", "Umathsupshiftup", "Umathsupsubbottommax", "Umathunderbarkern", "Umathunderbarrule", "Umathunderbarvgap", "Umathunderdelimiterbgap", "Umathunderdelimitervgap", "Uoverdelimiter", "Uradical", "Uroot", "Ustack", "Ustartdisplaymath", "Ustartmath", "Ustopdisplaymath", "Ustopmath", "Usubscript", "Usuperscript", "Uunderdelimiter", "above", "abovedisplayshortskip", "abovedisplayskip", "abovewithdelims", "accent", "adjdemerits", "advance", "afterassignment", "aftergroup", "alignmark", "aligntab", "atop", "atopwithdelims", "attribute", "attributedef", "badness", "baselineskip", "batchmode", "begingroup", "belowdisplayshortskip", "belowdisplayskip", "binoppenalty", "bodydir", "botmark", "botmarks", "box", "boxdir", "boxmaxdepth", "brokenpenalty", "catcode", "catcodetable", "char", "chardef", "cleaders", "clearmarks", "closein", "closeout", "clubpenalties", "clubpenalty", "copy", "count", "countdef", "cr", "crampeddisplaystyle", "crampedscriptscriptstyle", "crampedscriptstyle", "crampedtextstyle", "crcr", "csname", "currentgrouplevel", "currentgrouptype", "currentifbranch", "currentiflevel", "currentiftype", "day", "deadcycles", "def", "defaulthyphenchar", "defaultskewchar", "delcode", "delimiter", "delimiterfactor", "delimitershortfall", "detokenize", "dimen", "dimendef", "dimexpr", "directlua", "discretionary", "displayindent", "displaylimits", "displaystyle", "displaywidowpenalties", "displaywidowpenalty", "displaywidth", "divide", "doublehyphendemerits", "dp", "dump", "eTeXVersion", "eTeXminorversion", "eTeXrevision", "eTeXversion", "edef", "efcode", "else", "emergencystretch", "end", "endcsname", "endgroup", "endinput", "endlinechar", "eqno", "errhelp", "errmessage", "errorcontextlines", "errorstopmode", "escapechar", "everycr", "everydisplay", "everyeof", "everyhbox", "everyjob", "everymath", "everypar", "everyvbox", "exhyphenchar", "exhyphenpenalty", "expandafter", "expanded", "fam", "fi", "finalhyphendemerits", "firstmark", "firstmarks", "floatingpenalty", "font", "fontchardp", "fontcharht", "fontcharic", "fontcharwd", "fontdimen", "fontid", "fontname", "formatname", "futurelet", "gdef", "gleaders", "global", "globaldefs", "glueexpr", "glueshrink", "glueshrinkorder", "gluestretch", "gluestretchorder", "gluetomu", "halign", "hangafter", "hangindent", "hbadness", "hbox", "hfil", "hfill", "hfilneg", "hfuzz", "hoffset", "holdinginserts", "hrule", "hsize", "hskip", "hss", "ht", "hyphenation", "hyphenchar", "hyphenpenalty", "if", "ifabsdim", "ifabsnum", "ifcase", "ifcat", "ifcsname", "ifdefined", "ifdim", "ifeof", "iffalse", "iffontchar", "ifhbox", "ifhmode", "ifincsname", "ifinner", "ifmmode", "ifnum", "ifodd", "ifpdfabsdim", "ifpdfabsnum", "ifpdfprimitive", "ifprimitive", "iftrue", "ifvbox", "ifvmode", "ifvoid", "ifx", "ignorespaces", "immediate", "indent", "initcatcodetable", "input", "inputlineno", "insert", "insertpenalties", "interactionmode", "interlinepenalties", "interlinepenalty", "jobname", "kern", "language", "lastbox", "lastkern", "lastlinefit", "lastnodetype", "lastpenalty", "lastskip", "latelua", "lccode", "leaders", "left", "leftghost", "lefthyphenmin", "leftmarginkern", "leftskip", "leqno", "let", "letterspacefont", "limits", "linepenalty", "lineskip", "lineskiplimit", "localbrokenpenalty", "localinterlinepenalty", "localleftbox", "localrightbox", "long", "looseness", "lower", "lowercase", "lpcode", "luaescapestring", "luastartup", "luatexbanner", "luatexrevision", "luatexversion", "mag", "mark", "marks", "mathaccent", "mathbin", "mathchar", "mathchardef", "mathchoice", "mathclose", "mathcode", "mathdir", "mathinner", "mathop", "mathopen", "mathord", "mathpunct", "mathrel", "mathstyle", "mathsurround", "maxdeadcycles", "maxdepth", "meaning", "medmuskip", "message", "middle", "mkern", "month", "moveleft", "moveright", "mskip", "muexpr", "multiply", "muskip", "muskipdef", "mutoglue", "newlinechar", "noalign", "noboundary", "noexpand", "noindent", "nokerns", "noligs", "nolimits", "nolocaldirs", "nolocalwhatsits", "nonscript", "nonstopmode", "nulldelimiterspace", "nullfont", "number", "numexpr", "odelcode", "odelimiter", "omathaccent", "omathchar", "omathchardef", "omathcode", "omit", "openin", "openout", "or", "oradical", "outer", "output", "outputbox", "outputpenalty", "over", "overfullrule", "overline", "overwithdelims", "pagebottomoffset", "pagedepth", "pagedir", "pagediscards", "pagefilllstretch", "pagefillstretch", "pagefilstretch", "pagegoal", "pageheight", "pageleftoffset", "pagerightoffset", "pageshrink", "pagestretch", "pagetopoffset", "pagetotal", "pagewidth", "par", "pardir", "parfillskip", "parindent", "parshape", "parshapedimen", "parshapeindent", "parshapelength", "parskip", "patterns", "pausing", "pdfadjustspacing", "pdfannot", "pdfcatalog", "pdfcolorstack", "pdfcolorstackinit", "pdfcompresslevel", "pdfcopyfont", "pdfcreationdate", "pdfdecimaldigits", "pdfdest", "pdfdestmargin", "pdfdraftmode", "pdfeachlinedepth", "pdfeachlineheight", "pdfendlink", "pdfendthread", "pdffirstlineheight", "pdffontattr", "pdffontexpand", "pdffontname", "pdffontobjnum", "pdffontsize", "pdfgamma", "pdfgentounicode", "pdfglyphtounicode", "pdfhorigin", "pdfignoreddimen", "pdfimageapplygamma", "pdfimagegamma", "pdfimagehicolor", "pdfimageresolution", "pdfincludechars", "pdfinclusioncopyfonts", "pdfinclusionerrorlevel", "pdfinfo", "pdfinsertht", "pdflastannot", "pdflastlinedepth", "pdflastlink", "pdflastobj", "pdflastxform", "pdflastximage", "pdflastximagecolordepth", "pdflastximagepages", "pdflastxpos", "pdflastypos", "pdflinkmargin", "pdfliteral", "pdfmapfile", "pdfmapline", "pdfminorversion", "pdfnames", "pdfnoligatures", "pdfnormaldeviate", "pdfobj", "pdfobjcompresslevel", "pdfoptionpdfminorversion", "pdfoutline", "pdfoutput", "pdfpageattr", "pdfpagebox", "pdfpageheight", "pdfpageref", "pdfpageresources", "pdfpagesattr", "pdfpagewidth", "pdfpkmode", "pdfpkresolution", "pdfprimitive", "pdfprotrudechars", "pdfpxdimen", "pdfrandomseed", "pdfrefobj", "pdfrefxform", "pdfrefximage", "pdfreplacefont", "pdfrestore", "pdfretval", "pdfsave", "pdfsavepos", "pdfsetmatrix", "pdfsetrandomseed", "pdfstartlink", "pdfstartthread", "pdftexbanner", "pdftexrevision", "pdftexversion", "pdfthread", "pdfthreadmargin", "pdftracingfonts", "pdftrailer", "pdfuniformdeviate", "pdfuniqueresname", "pdfvorigin", "pdfxform", "pdfxformattr", "pdfxformname", "pdfxformresources", "pdfximage", "pdfximagebbox", "penalty", "postdisplaypenalty", "postexhyphenchar", "posthyphenchar", "predisplaydirection", "predisplaypenalty", "predisplaysize", "preexhyphenchar", "prehyphenchar", "pretolerance", "prevdepth", "prevgraf", "primitive", "protected", "quitvmode", "radical", "raise", "read", "readline", "relax", "relpenalty", "right", "rightghost", "righthyphenmin", "rightmarginkern", "rightskip", "romannumeral", "rpcode", "savecatcodetable", "savinghyphcodes", "savingvdiscards", "scantextokens", "scantokens", "scriptfont", "scriptscriptfont", "scriptscriptstyle", "scriptspace", "scriptstyle", "scrollmode", "setbox", "setlanguage", "sfcode", "shipout", "show", "showbox", "showboxbreadth", "showboxdepth", "showgroups", "showifs", "showlists", "showthe", "showtokens", "skewchar", "skip", "skipdef", "spacefactor", "spaceskip", "span", "special", "splitbotmark", "splitbotmarks", "splitdiscards", "splitfirstmark", "splitfirstmarks", "splitmaxdepth", "splittopskip", "string", "suppressfontnotfounderror", "suppressifcsnameerror", "suppresslongerror", "suppressoutererror", "synctex", "tabskip", "tagcode", "textdir", "textfont", "textstyle", "the", "thickmuskip", "thinmuskip", "time", "toks", "toksdef", "tolerance", "topmark", "topmarks", "topskip", "tracingassigns", "tracingcommands", "tracinggroups", "tracingifs", "tracinglostchars", "tracingmacros", "tracingnesting", "tracingonline", "tracingoutput", "tracingpages", "tracingparagraphs", "tracingrestores", "tracingscantokens", "tracingstats", "uccode", "uchyph", "underline", "unexpanded", "unhbox", "unhcopy", "unkern", "unless", "unpenalty", "unskip", "unvbox", "unvcopy", "uppercase", "vadjust", "valign", "vbadness", "vbox", "vcenter", "vfil", "vfill", "vfilneg", "vfuzz", "voffset", "vrule", "vsize", "vskip", "vsplit", "vss", "vtop", "wd", "widowpenalties", "widowpenalty", "write", "xdef", "xleaders", "xspaceskip", "year" },
["xetex"]={ "XeTeXversion" },
} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-bibtex.lua b/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-bibtex.lua
index 88b070e5ee2..ebcd7cbc694 100644
--- a/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-bibtex.lua
+++ b/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-bibtex.lua
@@ -17,7 +17,7 @@ local patterns = context.patterns
local token = lexer.token
local exact_match = lexer.exact_match
-local bibtexlexer = lexer.new("xml","scite-context-lexer-xml")
+local bibtexlexer = lexer.new("bib","scite-context-lexer-bibtex")
local whitespace = bibtexlexer.whitespace
local escape, left, right = P("\\"), P('{'), P('}')
@@ -45,8 +45,11 @@ local spaces = space^1
local equal = P("=")
local keyword = (R("az","AZ","09") + S("@_:-"))^1
-local s_quoted = ((escape*single) + spaces^1 + (1-single))^0
-local d_quoted = ((escape*double) + spaces^1 + (1-double))^0
+----- s_quoted = ((escape*single) + spaces + (1-single))^0
+----- d_quoted = ((escape*double) + spaces + (1-double))^0
+local s_quoted = ((escape*single) + (1-single))^0
+local d_quoted = ((escape*double) + (1-double))^0
+
local balanced = patterns.balanced
local t_spacing = token(whitespace, space^1)
@@ -119,6 +122,22 @@ local t_rest = token("default",anything)
--
-- function OnOpen(filename) editor:Colourise(1,editor.TextLength) end -- or is it 0?
+-- somehow lexing fails on this more complex lexer when we insert something, there is no
+-- backtracking to whitespace when we have no embedded lexer, so we fake one ... this works
+-- to some extend but not in all cases (e.g. editing inside line fails) .. maybe i need to
+-- patch the dll ... (better not)
+
+local dummylexer = lexer.load("scite-context-lexer-dummy","bib-dum")
+
+local dummystart = token("embedded",P("\001")) -- an unlikely to be used character
+local dummystop = token("embedded",P("\002")) -- an unlikely to be used character
+
+lexer.embed_lexer(bibtexlexer,dummylexer,dummystart,dummystop)
+
+-- maybe we need to define each functional block as lexer (some 4) so i'll do that when
+-- this issue is persistent ... maybe consider making a local lexer options (not load,
+-- just lexer.new or so) .. or maybe do the reverse, embed the main one in a dummy child
+
bibtexlexer._rules = {
{ "whitespace", t_spacing },
{ "forget", t_forget },
diff --git a/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-dummy.lua b/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-dummy.lua
new file mode 100644
index 00000000000..9465561f36a
--- /dev/null
+++ b/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-dummy.lua
@@ -0,0 +1,35 @@
+local info = {
+ version = 1.002,
+ comment = "scintilla lpeg lexer that triggers whitespace backtracking",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files",
+}
+
+-- the lexer dll doesn't backtrack when there is no embedded lexer so
+-- we need to trigger that, for instance in the bibtex lexer, but still
+-- we get failed lexing
+
+local lexer = require("lexer")
+local context = lexer.context
+local patterns = context.patterns
+
+local token = lexer.token
+
+local dummylexer = lexer.new("dummy","scite-context-lexer-dummy")
+local whitespace = dummylexer.whitespace
+
+local space = patterns.space
+local nospace = (1-space)
+
+local t_spacing = token(whitespace, space ^1)
+local t_rest = token("default", nospace^1)
+
+dummylexer._rules = {
+ { "whitespace", t_spacing },
+ { "rest", t_rest },
+}
+
+dummylexer._tokenstyles = context.styleset
+
+return dummylexer
diff --git a/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-lua.lua b/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-lua.lua
index c44d586bab5..3d5d18fc80c 100644
--- a/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-lua.lua
+++ b/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-lua.lua
@@ -25,6 +25,7 @@ local lualexer = lexer.new("lua","scite-context-lexer-lua")
local whitespace = lualexer.whitespace
local stringlexer = lexer.load("scite-context-lexer-lua-longstring")
+local labellexer = lexer.load("scite-context-lexer-lua-labelstring")
local directives = { } -- communication channel
@@ -185,11 +186,15 @@ local structure = token("special", S('{}[]()'))
local optionalspace = spacing^0
local hasargument = #S("{([")
+-- ideal should be an embedded lexer ..
+
local gotokeyword = token("keyword", P("goto"))
* spacing
* token("grouping",validword)
local gotolabel = token("keyword", P("::"))
+ * (spacing + shortcomment)^0
* token("grouping",validword)
+ * (spacing + shortcomment)^0
* token("keyword", P("::"))
local p_keywords = exact_match(keywords)
diff --git a/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-tex.lua b/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-tex.lua
index 0099b968a2d..b109630ce8f 100644
--- a/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-tex.lua
+++ b/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-tex.lua
@@ -410,6 +410,8 @@ local stoplua = P("\\stop") * Cmt(luaenvironment,stopdisplaylua)
local startluacode = token("embedded", startlua)
local stopluacode = #stoplua * token("embedded", stoplua)
+local luacall = P("clf_") * R("az","__","AZ")^1
+
local metafuncall = ( P("reusable") + P("usable") + P("unique") + P("use") + P("reuse") ) * ("MPgraphic")
+ P("uniqueMPpagegraphic")
+ P("MPpositiongraphic")
@@ -420,6 +422,8 @@ local metafunenvironment = metafuncall -- ( P("use") + P("reusable") + P("un
local startmetafun = P("\\start") * metafunenvironment
local stopmetafun = P("\\stop") * metafunenvironment -- todo match start
+local xmlmacro = token("embedded", P("\\xml") * R("az")^1)
+
local openargument = token("special", P("{"))
local closeargument = token("special", P("}"))
local argumentcontent = token("default",(1-P("}"))^0) -- maybe space needs a treatment
@@ -430,6 +434,7 @@ local startmetafuncode = token("embedded", startmetafun) * metafunargument
local stopmetafuncode = token("embedded", stopmetafun)
local callers = token("embedded", P("\\") * metafuncall) * metafunarguments
+ + token("embedded", P("\\") * luacall)
lexer.embed_lexer(contextlexer, cldlexer, startluacode, stopluacode)
lexer.embed_lexer(contextlexer, mpslexer, startmetafuncode, stopmetafuncode)
@@ -441,6 +446,7 @@ contextlexer._rules = {
{ "text", text }, -- non words
{ "comment", comment },
{ "constant", constant },
+ { "xmlmacro", xmlmacro },
{ "callers", callers },
{ "helper", helper },
{ "command", command },
diff --git a/Master/texmf-dist/context/data/scite/context/scite-context-data-context.properties b/Master/texmf-dist/context/data/scite/context/scite-context-data-context.properties
index d709dbe51e6..6cd49449ce0 100644
--- a/Master/texmf-dist/context/data/scite/context/scite-context-data-context.properties
+++ b/Master/texmf-dist/context/data/scite/context/scite-context-data-context.properties
@@ -3,193 +3,204 @@ zerocount minusone minustwo plusone \
plustwo plusthree plusfour plusfive plussix \
plusseven pluseight plusnine plusten plussixteen \
plushundred plusthousand plustenthousand plustwentythousand medcard \
-maxcard zeropoint onepoint halfapoint onebasepoint \
-maxdimen scaledpoint thousandpoint points halfpoint \
-zeroskip zeromuskip onemuskip pluscxxvii pluscxxviii \
-pluscclv pluscclvi normalpagebox endoflinetoken outputnewlinechar \
-emptytoks empty undefined voidbox emptybox \
-emptyvbox emptyhbox bigskipamount medskipamount smallskipamount \
-fmtname fmtversion texengine texenginename texengineversion \
-luatexengine pdftexengine xetexengine unknownengine etexversion \
-pdftexversion xetexversion xetexrevision activecatcode bgroup \
-egroup endline conditionaltrue conditionalfalse attributeunsetvalue \
-uprotationangle rightrotationangle downrotationangle leftrotationangle inicatcodes \
-ctxcatcodes texcatcodes notcatcodes txtcatcodes vrbcatcodes \
-prtcatcodes nilcatcodes luacatcodes tpacatcodes tpbcatcodes \
-xmlcatcodes ctdcatcodes escapecatcode begingroupcatcode endgroupcatcode \
-mathshiftcatcode alignmentcatcode endoflinecatcode parametercatcode superscriptcatcode \
-subscriptcatcode ignorecatcode spacecatcode lettercatcode othercatcode \
-activecatcode commentcatcode invalidcatcode tabasciicode newlineasciicode \
-formfeedasciicode endoflineasciicode endoffileasciicode spaceasciicode hashasciicode \
-dollarasciicode commentasciicode ampersandasciicode colonasciicode backslashasciicode \
-circumflexasciicode underscoreasciicode leftbraceasciicode barasciicode rightbraceasciicode \
-tildeasciicode delasciicode lessthanasciicode morethanasciicode doublecommentsignal \
-atsignasciicode exclamationmarkasciicode questionmarkasciicode doublequoteasciicode singlequoteasciicode \
-forwardslashasciicode primeasciicode activemathcharcode activetabtoken activeformfeedtoken \
-activeendoflinetoken batchmodecode nonstopmodecode scrollmodecode errorstopmodecode \
-bottomlevelgroupcode simplegroupcode hboxgroupcode adjustedhboxgroupcode vboxgroupcode \
-vtopgroupcode aligngroupcode noaligngroupcode outputgroupcode mathgroupcode \
-discretionarygroupcode insertgroupcode vcentergroupcode mathchoicegroupcode semisimplegroupcode \
-mathshiftgroupcode mathleftgroupcode vadjustgroupcode charnodecode hlistnodecode \
-vlistnodecode rulenodecode insertnodecode marknodecode adjustnodecode \
-ligaturenodecode discretionarynodecode whatsitnodecode mathnodecode gluenodecode \
-kernnodecode penaltynodecode unsetnodecode mathsnodecode charifcode \
-catifcode numifcode dimifcode oddifcode vmodeifcode \
-hmodeifcode mmodeifcode innerifcode voidifcode hboxifcode \
-vboxifcode xifcode eofifcode trueifcode falseifcode \
-caseifcode definedifcode csnameifcode fontcharifcode fontslantperpoint \
-fontinterwordspace fontinterwordstretch fontinterwordshrink fontexheight fontemwidth \
-fontextraspace slantperpoint interwordspace interwordstretch interwordshrink \
-exheight emwidth extraspace mathsupdisplay mathsupnormal \
-mathsupcramped mathsubnormal mathsubcombined mathaxisheight startmode \
-stopmode startnotmode stopnotmode startmodeset stopmodeset \
-doifmode doifmodeelse doifnotmode startmodeset stopmodeset \
+maxcard maxcardminusone zeropoint onepoint halfapoint \
+onebasepoint maxdimen scaledpoint thousandpoint points \
+halfpoint zeroskip zeromuskip onemuskip pluscxxvii \
+pluscxxviii pluscclv pluscclvi normalpagebox endoflinetoken \
+outputnewlinechar emptytoks empty undefined voidbox \
+emptybox emptyvbox emptyhbox bigskipamount medskipamount \
+smallskipamount fmtname fmtversion texengine texenginename \
+texengineversion luatexengine pdftexengine xetexengine unknownengine \
+activecatcode bgroup egroup endline conditionaltrue \
+conditionalfalse attributeunsetvalue uprotationangle rightrotationangle downrotationangle \
+leftrotationangle inicatcodes ctxcatcodes texcatcodes notcatcodes \
+txtcatcodes vrbcatcodes prtcatcodes nilcatcodes luacatcodes \
+tpacatcodes tpbcatcodes xmlcatcodes ctdcatcodes escapecatcode \
+begingroupcatcode endgroupcatcode mathshiftcatcode alignmentcatcode endoflinecatcode \
+parametercatcode superscriptcatcode subscriptcatcode ignorecatcode spacecatcode \
+lettercatcode othercatcode activecatcode commentcatcode invalidcatcode \
+tabasciicode newlineasciicode formfeedasciicode endoflineasciicode endoffileasciicode \
+spaceasciicode hashasciicode dollarasciicode commentasciicode ampersandasciicode \
+colonasciicode backslashasciicode circumflexasciicode underscoreasciicode leftbraceasciicode \
+barasciicode rightbraceasciicode tildeasciicode delasciicode lessthanasciicode \
+morethanasciicode doublecommentsignal atsignasciicode exclamationmarkasciicode questionmarkasciicode \
+doublequoteasciicode singlequoteasciicode forwardslashasciicode primeasciicode hyphenasciicode \
+activemathcharcode activetabtoken activeformfeedtoken activeendoflinetoken batchmodecode \
+nonstopmodecode scrollmodecode errorstopmodecode bottomlevelgroupcode simplegroupcode \
+hboxgroupcode adjustedhboxgroupcode vboxgroupcode vtopgroupcode aligngroupcode \
+noaligngroupcode outputgroupcode mathgroupcode discretionarygroupcode insertgroupcode \
+vcentergroupcode mathchoicegroupcode semisimplegroupcode mathshiftgroupcode mathleftgroupcode \
+vadjustgroupcode charnodecode hlistnodecode vlistnodecode rulenodecode \
+insertnodecode marknodecode adjustnodecode ligaturenodecode discretionarynodecode \
+whatsitnodecode mathnodecode gluenodecode kernnodecode penaltynodecode \
+unsetnodecode mathsnodecode charifcode catifcode numifcode \
+dimifcode oddifcode vmodeifcode hmodeifcode mmodeifcode \
+innerifcode voidifcode hboxifcode vboxifcode xifcode \
+eofifcode trueifcode falseifcode caseifcode definedifcode \
+csnameifcode fontcharifcode fontslantperpoint fontinterwordspace fontinterwordstretch \
+fontinterwordshrink fontexheight fontemwidth fontextraspace slantperpoint \
+interwordspace interwordstretch interwordshrink exheight emwidth \
+extraspace mathsupdisplay mathsupnormal mathsupcramped mathsubnormal \
+mathsubcombined mathaxisheight muquad startmode stopmode \
+startnotmode stopnotmode startmodeset stopmodeset doifmode \
+doifelsemode doifmodeelse doifnotmode startmodeset stopmodeset \
startallmodes stopallmodes startnotallmodes stopnotallmodes doifallmodes \
-doifallmodeselse doifnotallmodes startenvironment stopenvironment environment \
-startcomponent stopcomponent component startproduct stopproduct \
-product startproject stopproject project starttext \
-stoptext startnotext stopnotext startdocument stopdocument \
-documentvariable setupdocument startmodule stopmodule usemodule \
-usetexmodule useluamodule setupmodule currentmoduleparameter moduleparameter \
-everystarttext startTEXpage stopTEXpage enablemode disablemode \
-preventmode globalenablemode globaldisablemode globalpreventmode pushmode \
-popmode typescriptone typescripttwo typescriptthree mathsizesuffix \
-mathordcode mathopcode mathbincode mathrelcode mathopencode \
-mathclosecode mathpunctcode mathalphacode mathinnercode mathnothingcode \
-mathlimopcode mathnolopcode mathboxcode mathchoicecode mathaccentcode \
-mathradicalcode constantnumber constantnumberargument constantdimen constantdimenargument \
-constantemptyargument continueifinputfile luastringsep !!bs !!es \
-lefttorightmark righttoleftmark breakablethinspace nobreakspace narrownobreakspace \
-zerowidthnobreakspace ideographicspace ideographichalffillspace twoperemspace threeperemspace \
-fourperemspace fiveperemspace sixperemspace figurespace punctuationspace \
-hairspace zerowidthspace zerowidthnonjoiner zerowidthjoiner zwnj \
-zwj optionalspace
+doifelseallmodes doifallmodeselse doifnotallmodes startenvironment stopenvironment \
+environment startcomponent stopcomponent component startproduct \
+stopproduct product startproject stopproject project \
+starttext stoptext startnotext stopnotext startdocument \
+stopdocument documentvariable setupdocument startmodule stopmodule \
+usemodule usetexmodule useluamodule setupmodule currentmoduleparameter \
+moduleparameter everystarttext startTEXpage stopTEXpage enablemode \
+disablemode preventmode definemode globalenablemode globaldisablemode \
+globalpreventmode pushmode popmode typescriptone typescripttwo \
+typescriptthree mathsizesuffix mathordcode mathopcode mathbincode \
+mathrelcode mathopencode mathclosecode mathpunctcode mathalphacode \
+mathinnercode mathnothingcode mathlimopcode mathnolopcode mathboxcode \
+mathchoicecode mathaccentcode mathradicalcode constantnumber constantnumberargument \
+constantdimen constantdimenargument constantemptyargument continueifinputfile luastringsep \
+!!bs !!es lefttorightmark righttoleftmark breakablethinspace \
+nobreakspace nonbreakablespace narrownobreakspace zerowidthnobreakspace ideographicspace \
+ideographichalffillspace twoperemspace threeperemspace fourperemspace fiveperemspace \
+sixperemspace figurespace punctuationspace hairspace zerowidthspace \
+zerowidthnonjoiner zerowidthjoiner zwnj zwj optionalspace \
+asciispacechar
keywordclass.context.helpers=\
startsetups stopsetups startxmlsetups stopxmlsetups \
startluasetups stopluasetups starttexsetups stoptexsetups startrawsetups \
stoprawsetups startlocalsetups stoplocalsetups starttexdefinition stoptexdefinition \
starttexcode stoptexcode startcontextcode stopcontextcode startcontextdefinitioncode \
-stopcontextdefinitioncode doifsetupselse doifsetups doifnotsetups setup \
-setups texsetup xmlsetup luasetup directsetup \
-doifelsecommandhandler doifnotcommandhandler doifcommandhandler newmode setmode \
-resetmode newsystemmode setsystemmode resetsystemmode pushsystemmode \
-popsystemmode booleanmodevalue newcount newdimen newskip \
-newmuskip newbox newtoks newread newwrite \
-newmarks newinsert newattribute newif newlanguage \
-newfamily newfam newhelp then begcsname \
-strippedcsname firstargumentfalse firstargumenttrue secondargumentfalse secondargumenttrue \
+stopcontextdefinitioncode texdefinition doifelsesetups doifsetupselse doifsetups \
+doifnotsetups setup setups texsetup xmlsetup \
+luasetup directsetup fastsetup doifelsecommandhandler doifcommandhandlerelse \
+doifnotcommandhandler doifcommandhandler newmode setmode resetmode \
+newsystemmode setsystemmode resetsystemmode pushsystemmode popsystemmode \
+booleanmodevalue newcount newdimen newskip newmuskip \
+newbox newtoks newread newwrite newmarks \
+newinsert newattribute newif newlanguage newfamily \
+newfam newhelp then begcsname strippedcsname \
+checkedstrippedcsname firstargumentfalse firstargumenttrue secondargumentfalse secondargumenttrue \
thirdargumentfalse thirdargumenttrue fourthargumentfalse fourthargumenttrue fifthargumentfalse \
fifthsargumenttrue sixthargumentfalse sixtsargumenttrue doglobal dodoglobal \
redoglobal resetglobal donothing dontcomplain forgetall \
-donetrue donefalse htdp unvoidbox hfilll \
-vfilll mathbox mathlimop mathnolop mathnothing \
-mathalpha currentcatcodetable defaultcatcodetable catcodetablename newcatcodetable \
-startcatcodetable stopcatcodetable startextendcatcodetable stopextendcatcodetable pushcatcodetable \
-popcatcodetable restorecatcodes setcatcodetable letcatcodecommand defcatcodecommand \
-uedcatcodecommand hglue vglue hfillneg vfillneg \
-hfilllneg vfilllneg ruledhss ruledhfil ruledhfill \
-ruledhfilneg ruledhfillneg normalhfillneg ruledvss ruledvfil \
-ruledvfill ruledvfilneg ruledvfillneg normalvfillneg ruledhbox \
-ruledvbox ruledvtop ruledvcenter ruledmbox ruledhskip \
-ruledvskip ruledkern ruledmskip ruledmkern ruledhglue \
-ruledvglue normalhglue normalvglue ruledpenalty filledhboxb \
-filledhboxr filledhboxg filledhboxc filledhboxm filledhboxy \
-filledhboxk scratchcounter globalscratchcounter scratchdimen globalscratchdimen \
-scratchskip globalscratchskip scratchmuskip globalscratchmuskip scratchtoks \
-globalscratchtoks scratchbox globalscratchbox normalbaselineskip normallineskip \
-normallineskiplimit availablehsize localhsize setlocalhsize nextbox \
-dowithnextbox dowithnextboxcs dowithnextboxcontent dowithnextboxcontentcs scratchwidth \
-scratchheight scratchdepth scratchoffset scratchdistance scratchhsize \
-scratchvsize scratchxoffset scratchyoffset scratchhoffset scratchvoffset \
-scratchxposition scratchyposition scratchtopoffset scratchbottomoffset scratchleftoffset \
-scratchrightoffset scratchcounterone scratchcountertwo scratchcounterthree scratchdimenone \
-scratchdimentwo scratchdimenthree scratchskipone scratchskiptwo scratchskipthree \
-scratchmuskipone scratchmuskiptwo scratchmuskipthree scratchtoksone scratchtokstwo \
-scratchtoksthree scratchboxone scratchboxtwo scratchboxthree scratchnx \
-scratchny scratchmx scratchmy scratchunicode scratchleftskip \
-scratchrightskip scratchtopskip scratchbottomskip doif doifnot \
-doifelse doifinset doifnotinset doifinsetelse doifnextcharelse \
-doifnextoptionalelse doifnextoptionalcselse doiffastoptionalcheckelse doifnextbgroupelse doifnextbgroupcselse \
-doifnextparenthesiselse doifundefinedelse doifdefinedelse doifundefined doifdefined \
-doifelsevalue doifvalue doifnotvalue doifnothing doifsomething \
-doifelsenothing doifsomethingelse doifvaluenothing doifvaluesomething doifelsevaluenothing \
-doifdimensionelse doifnumberelse doifnumber doifnotnumber doifcommonelse \
-doifcommon doifnotcommon doifinstring doifnotinstring doifinstringelse \
-doifassignmentelse docheckassignment tracingall tracingnone loggingall \
-removetoks appendtoks prependtoks appendtotoks prependtotoks \
-to endgraf endpar everyendpar reseteverypar \
-finishpar empty null space quad \
-enspace obeyspaces obeylines obeyedspace obeyedline \
-normalspace executeifdefined singleexpandafter doubleexpandafter tripleexpandafter \
-dontleavehmode removelastspace removeunwantedspaces keepunwantedspaces wait \
-writestatus define defineexpandable redefine setmeasure \
-setemeasure setgmeasure setxmeasure definemeasure freezemeasure \
-measure measured installcorenamespace getvalue getuvalue \
-setvalue setevalue setgvalue setxvalue letvalue \
-letgvalue resetvalue undefinevalue ignorevalue setuvalue \
-setuevalue setugvalue setuxvalue globallet glet \
-udef ugdef uedef uxdef checked \
-unique getparameters geteparameters getgparameters getxparameters \
-forgetparameters copyparameters getdummyparameters dummyparameter directdummyparameter \
-setdummyparameter letdummyparameter usedummystyleandcolor usedummystyleparameter usedummycolorparameter \
-processcommalist processcommacommand quitcommalist quitprevcommalist processaction \
-processallactions processfirstactioninset processallactionsinset unexpanded expanded \
-startexpanded stopexpanded protected protect unprotect \
-firstofoneargument firstoftwoarguments secondoftwoarguments firstofthreearguments secondofthreearguments \
-thirdofthreearguments firstoffourarguments secondoffourarguments thirdoffourarguments fourthoffourarguments \
-firstoffivearguments secondoffivearguments thirdoffivearguments fourthoffivearguments fifthoffivearguments \
-firstofsixarguments secondofsixarguments thirdofsixarguments fourthofsixarguments fifthofsixarguments \
-sixthofsixarguments firstofoneunexpanded gobbleoneargument gobbletwoarguments gobblethreearguments \
-gobblefourarguments gobblefivearguments gobblesixarguments gobblesevenarguments gobbleeightarguments \
-gobbleninearguments gobbletenarguments gobbleoneoptional gobbletwooptionals gobblethreeoptionals \
-gobblefouroptionals gobblefiveoptionals dorecurse doloop exitloop \
-dostepwiserecurse recurselevel recursedepth dofastloopcs dowith \
-newconstant setnewconstant setconstant setconstantvalue newconditional \
-settrue setfalse settruevalue setfalsevalue newmacro \
-setnewmacro newfraction newsignal dosingleempty dodoubleempty \
-dotripleempty doquadrupleempty doquintupleempty dosixtupleempty doseventupleempty \
-dosingleargument dodoubleargument dotripleargument doquadrupleargument doquintupleargument \
-dosixtupleargument doseventupleargument dosinglegroupempty dodoublegroupempty dotriplegroupempty \
-doquadruplegroupempty doquintuplegroupempty permitspacesbetweengroups dontpermitspacesbetweengroups nopdfcompression \
-maximumpdfcompression normalpdfcompression modulonumber dividenumber getfirstcharacter \
+donetrue donefalse inlineordisplaymath indisplaymath forcedisplaymath \
+startforceddisplaymath stopforceddisplaymath reqno htdp unvoidbox \
+hfilll vfilll mathbox mathlimop mathnolop \
+mathnothing mathalpha currentcatcodetable defaultcatcodetable catcodetablename \
+newcatcodetable startcatcodetable stopcatcodetable startextendcatcodetable stopextendcatcodetable \
+pushcatcodetable popcatcodetable restorecatcodes setcatcodetable letcatcodecommand \
+defcatcodecommand uedcatcodecommand hglue vglue hfillneg \
+vfillneg hfilllneg vfilllneg ruledhss ruledhfil \
+ruledhfill ruledhfilneg ruledhfillneg normalhfillneg ruledvss \
+ruledvfil ruledvfill ruledvfilneg ruledvfillneg normalvfillneg \
+ruledhbox ruledvbox ruledvtop ruledvcenter ruledmbox \
+ruledhskip ruledvskip ruledkern ruledmskip ruledmkern \
+ruledhglue ruledvglue normalhglue normalvglue ruledpenalty \
+filledhboxb filledhboxr filledhboxg filledhboxc filledhboxm \
+filledhboxy filledhboxk scratchcounter globalscratchcounter scratchdimen \
+globalscratchdimen scratchskip globalscratchskip scratchmuskip globalscratchmuskip \
+scratchtoks globalscratchtoks scratchbox globalscratchbox normalbaselineskip \
+normallineskip normallineskiplimit availablehsize localhsize setlocalhsize \
+distributedhsize hsizefraction nextbox dowithnextbox dowithnextboxcs \
+dowithnextboxcontent dowithnextboxcontentcs scratchwidth scratchheight scratchdepth \
+scratchoffset scratchdistance scratchhsize scratchvsize scratchxoffset \
+scratchyoffset scratchhoffset scratchvoffset scratchxposition scratchyposition \
+scratchtopoffset scratchbottomoffset scratchleftoffset scratchrightoffset scratchcounterone \
+scratchcountertwo scratchcounterthree scratchdimenone scratchdimentwo scratchdimenthree \
+scratchskipone scratchskiptwo scratchskipthree scratchmuskipone scratchmuskiptwo \
+scratchmuskipthree scratchtoksone scratchtokstwo scratchtoksthree scratchboxone \
+scratchboxtwo scratchboxthree scratchnx scratchny scratchmx \
+scratchmy scratchunicode scratchleftskip scratchrightskip scratchtopskip \
+scratchbottomskip doif doifnot doifelse doifinset \
+doifnotinset doifelseinset doifinsetelse doifelsenextchar doifnextcharelse \
+doifelsenextoptional doifnextoptionalelse doifelsenextoptionalcs doifnextoptionalcselse doifelsefastoptionalcheck \
+doiffastoptionalcheckelse doifelsenextbgroup doifnextbgroupelse doifelsenextbgroupcs doifnextbgroupcselse \
+doifelsenextparenthesis doifnextparenthesiselse doifelseundefined doifundefinedelse doifelsedefined \
+doifdefinedelse doifundefined doifdefined doifelsevalue doifvalue \
+doifnotvalue doifnothing doifsomething doifelsenothing doifnothingelse \
+doifelsesomething doifsomethingelse doifvaluenothing doifvaluesomething doifelsevaluenothing \
+doifvaluenothingelse doifelsedimension doifdimensionelse doifelsenumber doifnumberelse \
+doifnumber doifnotnumber doifelsecommon doifcommonelse doifcommon \
+doifnotcommon doifinstring doifnotinstring doifelseinstring doifinstringelse \
+doifelseassignment doifassignmentelse docheckassignment tracingall tracingnone \
+loggingall removetoks appendtoks prependtoks appendtotoks \
+prependtotoks to endgraf endpar everyendpar \
+reseteverypar finishpar empty null space \
+quad enspace nbsp obeyspaces obeylines \
+obeyedspace obeyedline obeyedtab obeyedpage normalspace \
+executeifdefined singleexpandafter doubleexpandafter tripleexpandafter dontleavehmode \
+removelastspace removeunwantedspaces keepunwantedspaces wait writestatus \
+define defineexpandable redefine setmeasure setemeasure \
+setgmeasure setxmeasure definemeasure freezemeasure measure \
+measured installcorenamespace getvalue getuvalue setvalue \
+setevalue setgvalue setxvalue letvalue letgvalue \
+resetvalue undefinevalue ignorevalue setuvalue setuevalue \
+setugvalue setuxvalue globallet glet udef \
+ugdef uedef uxdef checked unique \
+getparameters geteparameters getgparameters getxparameters forgetparameters \
+copyparameters getdummyparameters dummyparameter directdummyparameter setdummyparameter \
+letdummyparameter usedummystyleandcolor usedummystyleparameter usedummycolorparameter processcommalist \
+processcommacommand quitcommalist quitprevcommalist processaction processallactions \
+processfirstactioninset processallactionsinset unexpanded expanded startexpanded \
+stopexpanded protected protect unprotect firstofoneargument \
+firstoftwoarguments secondoftwoarguments firstofthreearguments secondofthreearguments thirdofthreearguments \
+firstoffourarguments secondoffourarguments thirdoffourarguments fourthoffourarguments firstoffivearguments \
+secondoffivearguments thirdoffivearguments fourthoffivearguments fifthoffivearguments firstofsixarguments \
+secondofsixarguments thirdofsixarguments fourthofsixarguments fifthofsixarguments sixthofsixarguments \
+firstofoneunexpanded firstoftwounexpanded secondoftwounexpanded firstofthreeunexpanded secondofthreeunexpanded \
+thirdofthreeunexpanded gobbleoneargument gobbletwoarguments gobblethreearguments gobblefourarguments \
+gobblefivearguments gobblesixarguments gobblesevenarguments gobbleeightarguments gobbleninearguments \
+gobbletenarguments gobbleoneoptional gobbletwooptionals gobblethreeoptionals gobblefouroptionals \
+gobblefiveoptionals dorecurse doloop exitloop dostepwiserecurse \
+recurselevel recursedepth dofastloopcs dowith newconstant \
+setnewconstant setconstant setconstantvalue newconditional settrue \
+setfalse settruevalue setfalsevalue newmacro setnewmacro \
+newfraction newsignal dosingleempty dodoubleempty dotripleempty \
+doquadrupleempty doquintupleempty dosixtupleempty doseventupleempty dosingleargument \
+dodoubleargument dotripleargument doquadrupleargument doquintupleargument dosixtupleargument \
+doseventupleargument dosinglegroupempty dodoublegroupempty dotriplegroupempty doquadruplegroupempty \
+doquintuplegroupempty permitspacesbetweengroups dontpermitspacesbetweengroups nopdfcompression maximumpdfcompression \
+normalpdfcompression modulonumber dividenumber getfirstcharacter doifelsefirstchar \
doiffirstcharelse startnointerference stopnointerference twodigits threedigits \
leftorright offinterlineskip oninterlineskip nointerlineskip strut \
-setstrut strutbox strutht strutdp strutwd \
-struthtdp begstrut endstrut lineheight ordordspacing \
-ordopspacing ordbinspacing ordrelspacing ordopenspacing ordclosespacing \
-ordpunctspacing ordinnerspacing opordspacing opopspacing opbinspacing \
-oprelspacing opopenspacing opclosespacing oppunctspacing opinnerspacing \
-binordspacing binopspacing binbinspacing binrelspacing binopenspacing \
-binclosespacing binpunctspacing bininnerspacing relordspacing relopspacing \
-relbinspacing relrelspacing relopenspacing relclosespacing relpunctspacing \
-relinnerspacing openordspacing openopspacing openbinspacing openrelspacing \
-openopenspacing openclosespacing openpunctspacing openinnerspacing closeordspacing \
-closeopspacing closebinspacing closerelspacing closeopenspacing closeclosespacing \
-closepunctspacing closeinnerspacing punctordspacing punctopspacing punctbinspacing \
-punctrelspacing punctopenspacing punctclosespacing punctpunctspacing punctinnerspacing \
-innerordspacing inneropspacing innerbinspacing innerrelspacing inneropenspacing \
-innerclosespacing innerpunctspacing innerinnerspacing normalreqno startimath \
-stopimath normalstartimath normalstopimath startdmath stopdmath \
-normalstartdmath normalstopdmath uncramped cramped triggermathstyle \
-mathstylefont mathsmallstylefont mathstyleface mathsmallstyleface mathstylecommand \
-mathpalette mathstylehbox mathstylevbox mathstylevcenter mathstylevcenteredhbox \
-mathstylevcenteredvbox mathtext setmathsmalltextbox setmathtextbox triggerdisplaystyle \
+halfstrut quarterstrut depthstrut setstrut strutbox \
+strutht strutdp strutwd struthtdp begstrut \
+endstrut lineheight ordordspacing ordopspacing ordbinspacing \
+ordrelspacing ordopenspacing ordclosespacing ordpunctspacing ordinnerspacing \
+opordspacing opopspacing opbinspacing oprelspacing opopenspacing \
+opclosespacing oppunctspacing opinnerspacing binordspacing binopspacing \
+binbinspacing binrelspacing binopenspacing binclosespacing binpunctspacing \
+bininnerspacing relordspacing relopspacing relbinspacing relrelspacing \
+relopenspacing relclosespacing relpunctspacing relinnerspacing openordspacing \
+openopspacing openbinspacing openrelspacing openopenspacing openclosespacing \
+openpunctspacing openinnerspacing closeordspacing closeopspacing closebinspacing \
+closerelspacing closeopenspacing closeclosespacing closepunctspacing closeinnerspacing \
+punctordspacing punctopspacing punctbinspacing punctrelspacing punctopenspacing \
+punctclosespacing punctpunctspacing punctinnerspacing innerordspacing inneropspacing \
+innerbinspacing innerrelspacing inneropenspacing innerclosespacing innerpunctspacing \
+innerinnerspacing normalreqno startimath stopimath normalstartimath \
+normalstopimath startdmath stopdmath normalstartdmath normalstopdmath \
+uncramped cramped triggermathstyle mathstylefont mathsmallstylefont \
+mathstyleface mathsmallstyleface mathstylecommand mathpalette mathstylehbox \
+mathstylevbox mathstylevcenter mathstylevcenteredhbox mathstylevcenteredvbox mathtext \
+setmathsmalltextbox setmathtextbox pushmathstyle popmathstyle triggerdisplaystyle \
triggertextstyle triggerscriptstyle triggerscriptscriptstyle triggeruncrampedstyle triggercrampedstyle \
triggersmallstyle triggeruncrampedsmallstyle triggercrampedsmallstyle triggerbigstyle triggeruncrampedbigstyle \
-triggercrampedbigstyle luaexpr expdoifelse expdoif expdoifnot \
-expdoifcommonelse expdoifinsetelse ctxdirectlua ctxlatelua ctxsprint \
-ctxwrite ctxcommand ctxdirectcommand ctxlatecommand ctxreport \
-ctxlua luacode lateluacode directluacode registerctxluafile \
-ctxloadluafile luaversion luamajorversion luaminorversion ctxluacode \
-luaconditional luaexpanded startluaparameterset stopluaparameterset luaparameterset \
-definenamedlua obeylualines obeyluatokens startluacode stopluacode \
-startlua stoplua startctxfunction stopctxfunction ctxfunction \
-startctxfunctiondefinition stopctxfunctiondefinition carryoverpar assumelongusagecs Umathbotaccent \
-righttolefthbox lefttorighthbox righttoleftvbox lefttorightvbox righttoleftvtop \
-lefttorightvtop rtlhbox ltrhbox rtlvbox ltrvbox \
-rtlvtop ltrvtop autodirhbox autodirvbox autodirvtop \
-lefttoright righttoleft synchronizelayoutdirection synchronizedisplaydirection synchronizeinlinedirection \
-lesshyphens morehyphens nohyphens dohyphens Ucheckedstartdisplaymath \
-Ucheckedstopdisplaymath
+triggercrampedbigstyle luaexpr expelsedoif expdoif expdoifnot \
+expdoifelsecommon expdoifcommonelse expdoifelseinset expdoifinsetelse ctxdirectlua \
+ctxlatelua ctxsprint ctxwrite ctxcommand ctxdirectcommand \
+ctxlatecommand ctxreport ctxlua luacode lateluacode \
+directluacode registerctxluafile ctxloadluafile luaversion luamajorversion \
+luaminorversion ctxluacode luaconditional luaexpanded startluaparameterset \
+stopluaparameterset luaparameterset definenamedlua obeylualines obeyluatokens \
+startluacode stopluacode startlua stoplua startctxfunction \
+stopctxfunction ctxfunction startctxfunctiondefinition stopctxfunctiondefinition installctxfunction \
+carryoverpar assumelongusagecs Umathbotaccent righttolefthbox lefttorighthbox \
+righttoleftvbox lefttorightvbox righttoleftvtop lefttorightvtop rtlhbox \
+ltrhbox rtlvbox ltrvbox rtlvtop ltrvtop \
+autodirhbox autodirvbox autodirvtop lefttoright righttoleft \
+synchronizelayoutdirection synchronizedisplaydirection synchronizeinlinedirection lesshyphens morehyphens \
+nohyphens dohyphens Ucheckedstartdisplaymath Ucheckedstopdisplaymath nobreak \
+allowbreak goodbreak
diff --git a/Master/texmf-dist/context/data/scite/context/scite-context-data-interfaces.properties b/Master/texmf-dist/context/data/scite/context/scite-context-data-interfaces.properties
index 9c2ca4623fc..2da33d45ae6 100644
--- a/Master/texmf-dist/context/data/scite/context/scite-context-data-interfaces.properties
+++ b/Master/texmf-dist/context/data/scite/context/scite-context-data-interfaces.properties
@@ -44,119 +44,118 @@ napravo napravyokraj nastavbarvu nastavbarvy nastavbilamista \
nastavblok nastavbloksekce nastavbuffer nastavcernelinky nastavcislonadpisu \
nastavcislostrany nastavcislovani nastavcislovaniodstavcu nastavcislovaniradku nastavcislovanistran \
nastavcitaci nastavdefinicipoznamekpodcarou nastavdeleniplvoucichobjektu nastavdelitko nastavdolnitexty \
-nastaveni nastavexterniobrazy nastavhorejsek nastavhornitexty nastavinterakci \
-nastavinterakcnilistu nastavinterakcnimenu nastavinterakcniobrazovku nastavjazyk nastavkapitalky \
-nastavkombinovanyseznam nastavkomentar nastavkomentarstrany nastavlegendu nastavmarginalie \
-nastavmarginalniblok nastavmarginalnilinky nastavmeziradkovoumezeru nastavnadpis nastavnadpisy \
-nastavodkazovani nastavodsazovani nastavodstavce nastavopis nastavoramovanetexty \
-nastavoramovani nastavorez nastavotoceni nastavpaletu nastavplvouciobjekt \
-nastavplvouciobjekty nastavpodcislostrany nastavpodtrzeni nastavpole nastavpolozky \
-nastavpopisek nastavpopisky nastavpopisy 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 navigating nejakyradek \
-nekde nextsection neznamo nivy nizky \
-nocap nokap nop numberofsubpages obrazovka \
-odkaz odkaznadatum odkaznastranu odkaznatext odkazujici \
-odsazenishora odsazenizleva odsazovani okr opakovat \
-opis opissoubor oramovani oref orez \
-otocit outeredgedistance outeredgewidth outermargindistance outermarginwidth \
-overbar overbars overstrike overstrikes oznaceni \
-oznacverzi pagedepth pageoffset paragraph parovastrana \
-part pis placefloat placeheadnumber placeheadtext \
-placelistoffloats placelistofsorts placelistofsynonyms placepagenumber placerawlist \
-placereferencelist placerule placetextvariable plnezneni pol \
-pole polozka polozky popisky poppisek \
-porovnejpaletu porovnejskupinubarev positiontext pozadi pozice \
-poznamka poznamkapodcarou pref prelozit premistinamrizku \
-prepninazakladnifont preskoc prizpusobivepole prizpusobvzhled produkt \
-program projekt propojeneznaceni propojenydokument propojenyrejstrik \
-prostredi publikace ran ref register \
-reservefloat reset resetnumber resettextcontent resetznaceni \
-rimskecislice rozdelplvouciobjekt rozmer rozpojeneznaceni roztazene \
-schovejbloky section sedabarva seeregister setnumber \
-settextcontent settextvariable setupanswerarea setupcolumnset setupcolumnsetlines \
-setupcolumnsetstart setupfonthandling setupfontsynonym setupforms setupindentedtext \
-setupinterlinespace2 setupitemgroup setuplistalternative setupmathalignment setupnumber \
-setuppaper setupplacement setuprule setupstartstop setupstrut \
-setuptextposition setuptextvariable sirkalevehookraje sirkalevemarginalie sirkamarginalie \
-sirkaokraje sirkapapiru sirkapravehookraje sirkapravemarginalie sirkasazby \
-sirkaseznamu sirkatextu sirkatiskpapiru sloupec slovovpravo \
-sort spodek stanovcharakteristickuseznamu stanovcislonadpisu startalignment \
-startbarva startbuffer startcislovaniradku startcitace startcolumnmakeup \
-startcolumns startcolumnset startcombination startcomment startdescription \
-startdocument startdokument startenumeration startfakt startfigure \
-startfloattext startformula startframedtext startglobalni starthiding \
-startinteraktivnimenu startitemgroup startkodovani startkomponenta startkorekceradku \
-startlegend startline startlinecorrection startlinenumbering startlines \
-startlocal startlocalenvironment startlocalfootnotes startlokalni startlokalnipoznamkypodcarou \
-startmakeup startmarginalniblok startmarginalnilinka startmarginblock startnamemakeup \
-startnarrower startnezhustene startobraz startopposite startoverlay \
-startoverview startparagraph startpositioning startpostponing startpozadi \
-startprehled startprekryv startprodukt startprofil startprofile \
-startprojekt startprostredi startprotejsek startradek startradky \
-startrastr startregister startsadasymbolu startsloupce startspojeni \
-startsymbolset startsynchronizace startsynchronization starttable starttables \
-starttabulate starttabulka starttabulky starttext starttextovalinka \
-starttyping startumistovani startunpacked startuprava startverze \
-startzarovnavani startzhustene startzuzeni stopalignment stopbarva \
-stopbuffer stopcislovaniradku stopcitace stopcolumnmakeup stopcolumns \
-stopcolumnset stopcombination stopcomment stopdescription stopdocument \
-stopdokument stopenumeration stopfakt stopfigure stopfloattext \
-stopformula stopframedtext stopglobalni stophiding stopinteraktivnimenu \
-stopitemgroup stopkodovani stopkomponenta stopkorekceradku stoplegend \
-stopline stoplinecorrection stoplinenumbering stoplines stoplocal \
-stoplocalenvironment stoplocalfootnotes stoplokalni stoplokalnipoznamkypodcarou stopmakeup \
-stopmarginalniblok stopmarginalnilinka stopmarginblock stopnamemakeup stopnarrower \
-stopnezhustene stopopposite stopoverlay stopoverview stopparagraph \
-stoppositioning stoppostponing stoppozadi stopprehled stopprekryv \
-stopprodukt stopprofil stopprofile stopprojekt stopprostredi \
-stopprotejsek stopradek stopradky stoprastr stopsloupce \
-stopspojeni stopsymbolset stopsynchronizace stopsynchronization stoptable \
-stoptables stoptabulate stoptabulka stoptabulky stoptext \
-stoptextovalinka stoptyping stopumistovani stopunpacked stopuprava \
-stopverze stopzarovnavani stopzhustene stopzuzeni strana \
-sub subject subpagenumber subsection subsubject \
-subsubsection subsubsubject switchtorawfont sym symbol \
-synchronizacnilista synchronizovat synonym tab tecky \
-tenkalinka tenkelinky testcolumn testpage tex \
-texthlavicky textovalinka textpopisku textvariable title \
-tlacitko tlacitkomenu tloustkacary tref tvrdamezera \
-tvrdemezery txt typebuffer ukazbarvu ukazexterniobrazy \
-ukazmrizku ukaznastaveni ukazpaletu ukazpodpery ukazpole \
-ukazpostredizakladnihofontu ukazramecek ukazsadusymbolu ukazskupinubarev ukazupravu \
-ukazvytisk ukazvzhled ukazzakladnifont umistikombinovanyseznam umistilegendu \
-umistiloga umistilokalnipoznamkypodcarou umistinadsebe umistinamrizku umistipodrovnici \
-umistipoznamkypodcarou umistirejstrik umistirovnici umistiseznam umistivedlesebe \
-umistizalozky underbar underbars urcicharakteristikurejstriku useXMLfilter \
-usedirectory usetypescript usetypescriptfile uzijJSscripts uzijURL \
-uzijadresar uzijbloky uzijexternidokument uzijexterniobraz uzijexternisoubor \
-uzijexternisoubory uzijexternizvuk uzijkodovani uzijmodul uzijmoduly \
-uzijodkazy uzijprikazy uzijspeciality uzijsymbol uzijurl \
-verze vl vlasovalinka vlevo vpravo \
-vradku vsedniden vyberbloky vyberpapir vyberverzi \
-vyplnenytext vyplnovelinky vyplnovepole vyplnovyradek vyskahorejsku \
-vyskapapiru vyskasazby vyskaseznamu vyskaspodku vyskatextu \
-vyskatiskpapiru vyskaupati vyskazahlavi vysoky vyznam \
-vzdalenosthorejsku vzdalenostlevehookraje vzdalenostlevemarginalie vzdalenostmarginalie vzdalenostokraje \
-vzdalenostpravehookraje vzdalenostpravemarginalie vzdalenostspodku vzdalenostupati vzdalenostzahlavi \
-zablokujinterakcnimenu zachovejbloky zadnamezera zadnebilemisto zadnedalsibloky \
-zadnedalsisoubory zadnehorniadolniradky zadneodsazovani zadnezahlaviaupati zadneznaceni \
-zadnyrozmer zadnyseznam zadnytest zalozka zapisdorejstriku \
-zapisdoseznamu zapisdoseznamuodkazu zapismeziseznam zaramovani zarovnanonastred \
-zarovnanovlevo zarovnanovpravo zasobnikpoli zaznamovepole zhustene \
-ziskejbuffer ziskejznaceni zlomek znaceni znak \
-znaky zpracujbloky zpracujstranu zrcadlit zref \
-zvysujicicislo
+nastavexterniobrazy nastavhorejsek nastavhornitexty nastavinterakci nastavinterakcnilistu \
+nastavinterakcnimenu nastavinterakcniobrazovku nastavjazyk nastavkapitalky nastavkombinovanyseznam \
+nastavkomentar nastavkomentarstrany nastavlegendu nastavmarginalie nastavmarginalniblok \
+nastavmarginalnilinky nastavmeziradkovoumezeru nastavnadpis nastavnadpisy nastavodkazovani \
+nastavodsazovani nastavodstavce nastavopis nastavoramovanetexty nastavoramovani \
+nastavorez nastavotoceni nastavpaletu nastavplvouciobjekt nastavplvouciobjekty \
+nastavpodcislostrany nastavpodtrzeni nastavpole nastavpolozky nastavpopisek \
+nastavpopisky nastavpopisy 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 navigating nejakyradek nekde \
+nextsection neznamo nivy nizky nocap \
+nokap nop numberofsubpages obrazovka odkaz \
+odkaznadatum odkaznastranu odkaznatext odkazujici odsazenishora \
+odsazenizleva odsazovani okr opakovat opis \
+opissoubor oramovani oref orez otocit \
+outeredgedistance outeredgewidth outermargindistance outermarginwidth overbar \
+overbars overstrike overstrikes oznaceni oznacverzi \
+pagedepth pageoffset paragraph parovastrana part \
+pis placefloat placeheadnumber placeheadtext placelistoffloats \
+placelistofsorts placelistofsynonyms placepagenumber placerawlist placereferencelist \
+placerule placetextvariable plnezneni pol pole \
+polozka polozky popisky poppisek porovnejpaletu \
+porovnejskupinubarev positiontext pozadi pozice poznamka \
+poznamkapodcarou pref prelozit premistinamrizku prepninazakladnifont \
+preskoc prizpusobivepole prizpusobvzhled produkt program \
+projekt propojeneznaceni propojenydokument propojenyrejstrik prostredi \
+publikace ran ref register reservefloat \
+reset resetnumber resettextcontent resetznaceni rimskecislice \
+rozdelplvouciobjekt rozmer rozpojeneznaceni roztazene schovejbloky \
+section sedabarva seeregister setnumber settextcontent \
+settextvariable setupanswerarea setupcolumnset setupcolumnsetlines setupcolumnsetstart \
+setupfonthandling setupfontsynonym setupforms setupindentedtext setupinterlinespace2 \
+setupitemgroup setuplistalternative setupmathalignment setupnumber setuppaper \
+setupplacement setuprule setupstartstop setupstrut setuptextposition \
+setuptextvariable sirkalevehookraje sirkalevemarginalie sirkamarginalie sirkaokraje \
+sirkapapiru sirkapravehookraje sirkapravemarginalie sirkasazby sirkaseznamu \
+sirkatextu sirkatiskpapiru sloupec slovovpravo sort \
+spodek stanovcharakteristickuseznamu stanovcislonadpisu startalignment startbarva \
+startbuffer startcislovaniradku startcitace startcolumnmakeup startcolumns \
+startcolumnset startcombination startcomment startdescription startdocument \
+startdokument startenumeration startfakt startfigure startfloattext \
+startformula startframedtext startglobalni starthiding startinteraktivnimenu \
+startitemgroup startkodovani startkomponenta startkorekceradku startlegend \
+startline startlinecorrection startlinenumbering startlines startlocal \
+startlocalenvironment startlocalfootnotes startlokalni startlokalnipoznamkypodcarou startmakeup \
+startmarginalniblok startmarginalnilinka startmarginblock startnamemakeup startnarrower \
+startnezhustene startobraz startopposite startoverlay startoverview \
+startparagraph startpositioning startpostponing startpozadi startprehled \
+startprekryv startprodukt startprofil startprofile startprojekt \
+startprostredi startprotejsek startradek startradky startrastr \
+startregister startsadasymbolu startsloupce startspojeni startsymbolset \
+startsynchronizace startsynchronization starttable starttables starttabulate \
+starttabulka starttabulky starttext starttextovalinka starttyping \
+startumistovani startunpacked startuprava startverze startzarovnavani \
+startzhustene startzuzeni stopalignment stopbarva stopbuffer \
+stopcislovaniradku stopcitace stopcolumnmakeup stopcolumns stopcolumnset \
+stopcombination stopcomment stopdescription stopdocument stopdokument \
+stopenumeration stopfakt stopfigure stopfloattext stopformula \
+stopframedtext stopglobalni stophiding stopinteraktivnimenu stopitemgroup \
+stopkodovani stopkomponenta stopkorekceradku stoplegend stopline \
+stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment \
+stoplocalfootnotes stoplokalni stoplokalnipoznamkypodcarou stopmakeup stopmarginalniblok \
+stopmarginalnilinka stopmarginblock stopnamemakeup stopnarrower stopnezhustene \
+stopopposite stopoverlay stopoverview stopparagraph stoppositioning \
+stoppostponing stoppozadi stopprehled stopprekryv stopprodukt \
+stopprofil stopprofile stopprojekt stopprostredi stopprotejsek \
+stopradek stopradky stoprastr stopsloupce stopspojeni \
+stopsymbolset stopsynchronizace stopsynchronization stoptable stoptables \
+stoptabulate stoptabulka stoptabulky stoptext stoptextovalinka \
+stoptyping stopumistovani stopunpacked stopuprava stopverze \
+stopzarovnavani stopzhustene stopzuzeni strana sub \
+subject subpagenumber subsection subsubject subsubsection \
+subsubsubject switchtorawfont sym symbol synchronizacnilista \
+synchronizovat synonym tab tecky tenkalinka \
+tenkelinky testcolumn testpage tex texthlavicky \
+textovalinka textpopisku textvariable title tlacitko \
+tlacitkomenu tloustkacary tref tvrdamezera tvrdemezery \
+txt typebuffer ukazbarvu ukazexterniobrazy ukazmrizku \
+ukaznastaveni ukazpaletu ukazpodpery ukazpole ukazpostredizakladnihofontu \
+ukazramecek ukazsadusymbolu ukazskupinubarev ukazupravu ukazvytisk \
+ukazvzhled ukazzakladnifont umistikombinovanyseznam umistilegendu umistiloga \
+umistilokalnipoznamkypodcarou umistinadsebe umistinamrizku umistipodrovnici umistipoznamkypodcarou \
+umistirejstrik umistirovnici umistiseznam umistivedlesebe umistizalozky \
+underbar underbars urcicharakteristikurejstriku useXMLfilter usedirectory \
+usetypescript usetypescriptfile uzijJSscripts uzijURL uzijadresar \
+uzijbloky uzijexternidokument uzijexterniobraz uzijexternisoubor uzijexternisoubory \
+uzijexternizvuk uzijkodovani uzijmodul uzijmoduly uzijodkazy \
+uzijprikazy uzijspeciality uzijsymbol uzijurl verze \
+vl vlasovalinka vlevo vpravo vradku \
+vsedniden vyberbloky vyberpapir vyberverzi vyplnenytext \
+vyplnovelinky vyplnovepole vyplnovyradek vyskahorejsku vyskapapiru \
+vyskasazby vyskaseznamu vyskaspodku vyskatextu vyskatiskpapiru \
+vyskaupati vyskazahlavi vysoky vyznam vzdalenosthorejsku \
+vzdalenostlevehookraje vzdalenostlevemarginalie vzdalenostmarginalie vzdalenostokraje vzdalenostpravehookraje \
+vzdalenostpravemarginalie vzdalenostspodku vzdalenostupati vzdalenostzahlavi zablokujinterakcnimenu \
+zachovejbloky zadnamezera zadnebilemisto zadnedalsibloky zadnedalsisoubory \
+zadnehorniadolniradky zadneodsazovani zadnezahlaviaupati zadneznaceni zadnyrozmer \
+zadnyseznam zadnytest zalozka zapisdorejstriku zapisdoseznamu \
+zapisdoseznamuodkazu zapismeziseznam zaramovani zarovnanonastred zarovnanovlevo \
+zarovnanovpravo zasobnikpoli zaznamovepole zhustene ziskejbuffer \
+ziskejznaceni zlomek znaceni znak znaky \
+zpracujbloky zpracujstranu zrcadlit zref zvysujicicislo
keywordclass.context.de=\
Buchstabe Buchstaben CAP Cap \
@@ -190,132 +189,132 @@ definierestartstop definierestil definieresubfeld definieresymbol definieresynon
definieretabellenvorlage definieretabulator definieretext definieretippen definiereueberschrift \
definiereumbruch definiereumrahmt definiereumrahmtertext definiereversion definierezeichen \
definierezusammengestellteliste description dimension doppelseite doppelseitigespapier \
-drehen duennelinie duennerumriss einezeile einstellungen \
-einziehen emptylines entknuepfebeschriftung enumeration externeabbildung \
-farbbalken farbe farbewert feld feldstapel \
-festesspatium folgeprofil folgeprofilversion folgeversion footnotetext \
-forceblocks format formelnummer framedtext fussnote \
-fusszeileabstand fusszeilenhoehe gefuelltesrechteck gefuelltezeile geg \
-gesamtseitenanzahl gestreckt getnumber gitter graufarbe \
-grauwert haarlinie hauptsprache headsym heutigesdatum \
-heutigeskopfnummer hintergrund hl hoch hoeheoben \
-hoeheunten holebeschriftung holepuffer imlinken imlinkenrand \
-immaumrise immediatebetweenlist immediatetolist imrechten imrechtenrand \
-imumriss in inaktiviereinteraktionsmenue inanderermarginale indentation \
-ininner inlinkermarginale inmarginalie inneredgedistance inneredgewidth \
-innermargindistance innermarginwidth inouter inrechtermarginale installieresprache \
-interaktionsbalken interaktionsknopfe interaktionsmenue inzeile irgendwo \
-its kap keindimension keinebeschriftung keinebloeckemehr \
-keinedateienmehr keinekopfundfusszeilen keineliste keinspatium keintest \
-keinzeilenobenundunten keinzwischenraum kleinerdurchschuss klonierefeld knopf \
-komponente konvertierezahl kopf kopfniveau kopfnummer \
-kopfweite kopfzeilenabstand kopfzeilenhoehe kopierefeld korrigierezwischenraum \
-label labeling labels labeltext leg \
-liniendicke linkemarginalafstand linkemarginalbreite linksbuendig listenbreite \
-listenhoehe listenlaenge listsymbol loadsorts loadsynonyms \
-mapfontsize mar marginalafstand marginalbreite marginallinie \
-marginaltext marginaltitel marginalwort mathematik maumrise \
-mediaeval menueknopf monat moveformula movesidefloat \
-nachunten name navigating nextsection nichteinziehen \
-nocap nokap nop notiz numberofsubpages \
-nummererhoehen outeredgedistance outeredgewidth outermargindistance outermarginwidth \
-overbar overbars overstrike overstrikes pagedepth \
-pageoffset papierbreite papierhoehe paragraph part \
-passelayoutan passendfeld placefloat placeheadnumber placeheadtext \
-placelistoffloats placelistofsorts placelistofsynonyms placepagenumber placerawlist \
-placereferencelist placerule placetextvariable platzierebookmarks platziereformel \
-platzierefussnoten platzierelegende platziereliste platzierelogo platzierelokalefussnoten \
-platzierenebeneinander platziereregister platziereuntereinander platziereunterformel platzierezusammengestellteliste \
-pos position positiontext posten printpapierbreite \
-printpapierhoehe produkt programm projekt publikation \
-punkt ran randabstand randbreite rechteck \
-rechtecke rechtemarginalafstand rechtemarginalbreite rechtsbuendig ref \
-referenz referieren register registrierefelder reservefloat \
-resetnumber resettextcontent roemischezahlen ruecksetzten ruecksetztenbeschriftung \
-rumpfweite satzbreite satzhoehe schreibezumregister schreibezurliste \
-schreibezurreferenzliste schreibezwischenliste section seeregister seite \
-seitenreferenz seitenummer setnumber settext settextvariable \
-setupanswerarea setupcolumnset setupcolumnsetlines setupcolumnsetstart setupfonthandling \
-setupfontsynonym setupforms setupindentedtext setupinterlinespace2 setupitemgroup \
-setuplistalternative setupmathalignment setupnumber setuppaper setupplacement \
-setuprule setupstartstop setupstrut setuptextposition setuptextvariable \
-showsymbolset sort spalte spatium spiegeln \
-sprache startabbildung startalignment startausrichtung startbuffer \
-startcolumnmakeup startcolumns startcolumnset startcombination startcomment \
-startdescription startdocument startdokument startenger startenumeration \
-startfarbe startfigure startfloattext startformula startframedtext \
-startgeg startgegenueber startglobal startgrosserdurchschuss starthiding \
-starthintergrund startinteraktionsmenue startitemgroup startkleinerdurchschuss startkodierung \
-startkombination startkomponente startlegend startline startlinecorrection \
-startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes \
-startlokal startlokalefussnoten startmakeup startmarginalblock startmarginallinie \
-startmarginblock startnamemakeup startnarrower startopposite startoverlay \
-startoverview startparagraph startpositionieren startpositioning startpostponing \
-startprodukt startprofil startprofile startprojekt startraster \
-startregister startspalten startsymbolset startsynchronisation startsynchronization \
-starttabelle starttabellen starttable starttables starttabulate \
-starttext starttextlinie starttyping startueberblick startumbruch \
-startumgebung startunpacked startversion startzeile startzeilen \
-startzeilenkorrektur startzeilennumerierung startzitat stelleabsaetzeein stelleabsatznummerierungein \
-stelleabschnittein stelleabschnittsblockein stelleanordnenein stelleaufzaehlungenein stelleausgabeein \
-stelleausrichtungein stelleausschnittein stellebeschreibungein stellebeschriftungein stellebilderunterschriftein \
-stellebildunterschriftein stellebindestrichein stelleblankoein stelleblockein stelledrehenein \
-stelleduennerumrissein stelleeinziehenein 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 stelleseitenkommentarein 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 stopausrichtung \
-stopbuffer stopcolumnmakeup stopcolumns stopcolumnset stopcombination \
-stopcomment stopdescription stopdocument stopdokument stopenger \
-stopenumeration stopfarbe stopfigure stopfloattext stopformula \
-stopframedtext stopgeg stopgegenueber stopglobal stopgrosserdurchschuss \
-stophiding stophintergrund stopinteraktionsmenue stopitemgroup stopkleinerdurchschuss \
-stopkodierung stopkombination stopkomponente stoplegend stopline \
-stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment \
-stoplocalfootnotes stoplokal stoplokalefussnoten stopmakeup stopmarginalblock \
-stopmarginallinie stopmarginblock stopnamemakeup stopnarrower stopopposite \
-stopoverlay stopoverview stopparagraph stoppositionieren stoppositioning \
-stoppostponing stopprodukt stopprofil stopprofile stopprojekt \
-stopraster stopspalten stopsymbolset stopsynchronisation stopsynchronization \
-stoptabelle stoptabellen stoptable stoptables stoptabulate \
-stoptext stoptextlinie stoptyping stopueberblick stopumbruch \
-stopumgebung stopunpacked stopversion stopzeile stopzeilen \
-stopzeilenkorrektur stopzeilennumerierung stopzitat sub subject \
-subpagenumber subsection subsubject subsubsection subsubsubject \
-switchtorawfont sym symbol synchronisationsbalken synchronisieren \
-synonym tab teilegleitobjekt testcolumn testpage \
-tex textbreite texthoehe textlinie textreferenz \
-textvariable tief tiho tip tippedatei \
-tippen tippepuffer title tooltip txt \
-ueber ueberschrifttext uebersetzten umgebung umrahmt \
-unbekant underbar underbars unterformelnummer useXMLfilter \
-usedirectory usetypescript usetypescriptfile verbergebloecke vergleichefarbengruppe \
-vergleichepalette verknuepfebeschriftung verknuepfedokument verknuepfregister version \
-verweis verweisdatum verwendeJSscript verwendeURL verwendebefehl \
-verwendebloecke verwendeexteresdokument verwendeexterneabbildung verwendeexternedatei verwendeexternedateien \
-verwendeexternestonstueck verwendemodul verwendemodule verwendereferenzen verwendesymbole \
-verwendeurl vl volleswort von waehlebloeckeaus \
-waehlepapieraus waehleversionaus wechselezumfliesstext wiederholen wochentag \
-wohnort wortrechts zeigedruck zeigeeinstellungen zeigeexterneabbildungen \
-zeigefarbe zeigefarbengruppe zeigefelder zeigefliesstext zeigefliesstextumgebung \
-zeigegitter zeigelayout zeigepalette zeigerahmen zeigestruts \
-zeigeumbruch zentriert ziffern zitat zitieren \
-zu zurbox zurseite zwischenraum
+drehen duennelinie duennerumriss einezeile einziehen \
+emptylines entknuepfebeschriftung enumeration externeabbildung farbbalken \
+farbe farbewert feld feldstapel festesspatium \
+folgeprofil folgeprofilversion folgeversion footnotetext forceblocks \
+format formelnummer framedtext fussnote fusszeileabstand \
+fusszeilenhoehe gefuelltesrechteck gefuelltezeile geg gesamtseitenanzahl \
+gestreckt getnumber gitter graufarbe grauwert \
+haarlinie hauptsprache headsym heutigesdatum heutigeskopfnummer \
+hintergrund hl hoch hoeheoben hoeheunten \
+holebeschriftung holepuffer imlinken imlinkenrand immaumrise \
+immediatebetweenlist immediatetolist imrechten imrechtenrand imumriss \
+in inaktiviereinteraktionsmenue inanderermarginale indentation ininner \
+inlinkermarginale inmarginalie inneredgedistance inneredgewidth innermargindistance \
+innermarginwidth inouter inrechtermarginale installieresprache interaktionsbalken \
+interaktionsknopfe interaktionsmenue inzeile irgendwo its \
+kap keindimension keinebeschriftung keinebloeckemehr keinedateienmehr \
+keinekopfundfusszeilen keineliste keinspatium keintest keinzeilenobenundunten \
+keinzwischenraum kleinerdurchschuss klonierefeld knopf komponente \
+konvertierezahl kopf kopfniveau kopfnummer kopfweite \
+kopfzeilenabstand kopfzeilenhoehe kopierefeld korrigierezwischenraum label \
+labeling labels labeltext leg liniendicke \
+linkemarginalafstand linkemarginalbreite linksbuendig listenbreite listenhoehe \
+listenlaenge listsymbol loadsorts loadsynonyms mapfontsize \
+mar marginalafstand marginalbreite marginallinie marginaltext \
+marginaltitel marginalwort mathematik maumrise mediaeval \
+menueknopf monat moveformula movesidefloat nachunten \
+name navigating nextsection nichteinziehen nocap \
+nokap nop notiz numberofsubpages nummererhoehen \
+outeredgedistance outeredgewidth outermargindistance outermarginwidth overbar \
+overbars overstrike overstrikes pagedepth pageoffset \
+papierbreite papierhoehe paragraph part passelayoutan \
+passendfeld placefloat placeheadnumber placeheadtext placelistoffloats \
+placelistofsorts placelistofsynonyms placepagenumber placerawlist placereferencelist \
+placerule placetextvariable platzierebookmarks platziereformel platzierefussnoten \
+platzierelegende platziereliste platzierelogo platzierelokalefussnoten platzierenebeneinander \
+platziereregister platziereuntereinander platziereunterformel platzierezusammengestellteliste pos \
+position positiontext posten printpapierbreite printpapierhoehe \
+produkt programm projekt publikation punkt \
+ran randabstand randbreite rechteck rechtecke \
+rechtemarginalafstand rechtemarginalbreite rechtsbuendig ref referenz \
+referieren register registrierefelder reservefloat resetnumber \
+resettextcontent roemischezahlen ruecksetzten ruecksetztenbeschriftung rumpfweite \
+satzbreite satzhoehe schreibezumregister schreibezurliste schreibezurreferenzliste \
+schreibezwischenliste section seeregister seite seitenreferenz \
+seitenummer setnumber settext settextvariable setupanswerarea \
+setupcolumnset setupcolumnsetlines setupcolumnsetstart setupfonthandling setupfontsynonym \
+setupforms setupindentedtext setupinterlinespace2 setupitemgroup setuplistalternative \
+setupmathalignment setupnumber setuppaper setupplacement setuprule \
+setupstartstop setupstrut setuptextposition setuptextvariable showsymbolset \
+sort spalte spatium spiegeln sprache \
+startabbildung startalignment startausrichtung startbuffer startcolumnmakeup \
+startcolumns startcolumnset startcombination startcomment startdescription \
+startdocument startdokument startenger startenumeration startfarbe \
+startfigure startfloattext startformula startframedtext startgeg \
+startgegenueber startglobal startgrosserdurchschuss starthiding starthintergrund \
+startinteraktionsmenue startitemgroup startkleinerdurchschuss startkodierung startkombination \
+startkomponente startlegend startline startlinecorrection startlinenumbering \
+startlines startlocal startlocalenvironment startlocalfootnotes startlokal \
+startlokalefussnoten startmakeup startmarginalblock startmarginallinie startmarginblock \
+startnamemakeup startnarrower startopposite startoverlay startoverview \
+startparagraph startpositionieren startpositioning startpostponing startprodukt \
+startprofil startprofile startprojekt startraster startregister \
+startspalten startsymbolset startsynchronisation startsynchronization starttabelle \
+starttabellen starttable starttables starttabulate starttext \
+starttextlinie starttyping startueberblick startumbruch startumgebung \
+startunpacked startversion startzeile startzeilen startzeilenkorrektur \
+startzeilennumerierung startzitat stelleabsaetzeein stelleabsatznummerierungein stelleabschnittein \
+stelleabschnittsblockein stelleanordnenein stelleaufzaehlungenein stelleausgabeein stelleausrichtungein \
+stelleausschnittein stellebeschreibungein stellebeschriftungein stellebilderunterschriftein stellebildunterschriftein \
+stellebindestrichein stelleblankoein stelleblockein stelledrehenein stelleduennerumrissein \
+stelleeinziehenein 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 \
+stelleseitenkommentarein 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 stopausrichtung stopbuffer \
+stopcolumnmakeup stopcolumns stopcolumnset stopcombination stopcomment \
+stopdescription stopdocument stopdokument stopenger stopenumeration \
+stopfarbe stopfigure stopfloattext stopformula stopframedtext \
+stopgeg stopgegenueber stopglobal stopgrosserdurchschuss stophiding \
+stophintergrund stopinteraktionsmenue stopitemgroup stopkleinerdurchschuss stopkodierung \
+stopkombination stopkomponente stoplegend stopline stoplinecorrection \
+stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes \
+stoplokal stoplokalefussnoten stopmakeup stopmarginalblock stopmarginallinie \
+stopmarginblock stopnamemakeup stopnarrower stopopposite stopoverlay \
+stopoverview stopparagraph stoppositionieren stoppositioning stoppostponing \
+stopprodukt stopprofil stopprofile stopprojekt stopraster \
+stopspalten stopsymbolset stopsynchronisation stopsynchronization stoptabelle \
+stoptabellen stoptable stoptables stoptabulate stoptext \
+stoptextlinie stoptyping stopueberblick stopumbruch stopumgebung \
+stopunpacked stopversion stopzeile stopzeilen stopzeilenkorrektur \
+stopzeilennumerierung stopzitat sub subject subpagenumber \
+subsection subsubject subsubsection subsubsubject switchtorawfont \
+sym symbol synchronisationsbalken synchronisieren synonym \
+tab teilegleitobjekt testcolumn testpage tex \
+textbreite texthoehe textlinie textreferenz textvariable \
+tief tiho tip tippedatei tippen \
+tippepuffer title tooltip txt ueber \
+ueberschrifttext uebersetzten umgebung umrahmt unbekant \
+underbar underbars unterformelnummer useXMLfilter usedirectory \
+usetypescript usetypescriptfile verbergebloecke vergleichefarbengruppe vergleichepalette \
+verknuepfebeschriftung verknuepfedokument verknuepfregister version verweis \
+verweisdatum verwendeJSscript verwendeURL verwendebefehl verwendebloecke \
+verwendeexteresdokument verwendeexterneabbildung verwendeexternedatei verwendeexternedateien verwendeexternestonstueck \
+verwendemodul verwendemodule verwendereferenzen verwendesymbole verwendeurl \
+vl volleswort von waehlebloeckeaus waehlepapieraus \
+waehleversionaus wechselezumfliesstext wiederholen wochentag wohnort \
+wortrechts zeigedruck zeigeeinstellungen zeigeexterneabbildungen zeigefarbe \
+zeigefarbengruppe zeigefelder zeigefliesstext zeigefliesstextumgebung zeigegitter \
+zeigelayout zeigepalette zeigerahmen zeigestruts zeigeumbruch \
+zentriert ziffern zitat zitieren zu \
+zurbox zurseite zwischenraum
keywordclass.context.en=\
CAP Cap Caps Character \
@@ -347,110 +346,111 @@ defineplacement defineprofile defineprogram definerawfont definereference \
definereferenceformat definereferencelist defineregister definerule definesection \
definesectionblock definesorting definestartstop definestyle definesubfield \
definesymbol definesynonyms definetabletemplate definetabulate definetext \
-definetextposition definetextvariable definetype definetypeface definetyping \
-defineversion description determineheadnumber determinelistcharacteristics determineregistercharacteristics \
-dimension disableinteractionmenu domicile donttest edgedistance \
-edgewidth emptylines enumeration environment externalfigure \
-fact field fieldstack fillinfield fillinline \
-fillinrules fillintext fitfield fixedspace fixedspaces \
-followprofile followprofileversion followversion footerdistance footerheight \
-footnote footnotetext forceblocks formulanumber fraction \
-framed framedtext from getbuffer getmarking \
-getnumber godown goto gotobox gotopage \
-graycolor greyvalue grid hairline head \
-headerdistance headerheight headlevel headnumber headsym \
-headtext hideblocks high hl immediatebetweenlist \
-immediatetolist in incrementnumber indentation indenting \
-inframed infull ininner inleft inleftedge \
-inleftmargin inline inmaframed inmargin inneredgedistance \
-inneredgewidth innermargindistance innermarginwidth inothermargin inouter \
-inright inrightedge inrightmargin installlanguage interactionbar \
-interactionbuttons interactionmenu item items its \
-keepblocks label labeling labels labeltext \
-language leftaligned leftedgedistance leftedgewidth leftmargindistance \
-leftmarginwidth leg linethickness listheight listlength \
-listsymbol listwidth loadsorts loadsynonyms logfields \
-lohi low maframed mainlanguage makeupheight \
-makeupwidth mapfontsize mar margindistance marginrule \
-margintext margintitle marginwidth marginword marking \
-markversion mathematics mediaeval menubutton midaligned \
-mirror month moveformula moveongrid movesidefloat \
-name navigating nextsection nocap nodimension \
-noheaderandfooterlines noindenting nolist nomarking nomoreblocks \
-nomorefiles nop nospace note notopandbottomlines \
-nowhitespace numberofsubpages numbers outeredgedistance outeredgewidth \
-outermargindistance outermarginwidth overbar overbars overstrike \
-overstrikes packed page pagedepth pagenumber \
-pageoffset pagereference paperheight paperwidth paragraph \
-part periods placebookmarks placecombinedlist placefloat \
-placefootnotes placeformula placeheadnumber placeheadtext placelegend \
-placelist placelistoffloats placelistofsorts placelistofsynonyms placelocalfootnotes \
-placelogos placeongrid placeontopofeachother placepagenumber placerawlist \
-placereferencelist placeregister placerule placesidebyside placesubformula \
-placetextvariable position positiontext printpaperheight printpaperwidth \
-processblocks processpage product program project \
-publication quotation quote ran redo \
-ref reference referral referraldate referring \
-register remark reservefloat reset resetmarking \
-resetnumber resettextcontent rightaligned rightedgedistance rightedgewidth \
-rightmargindistance rightmarginwidth romannumerals rotate scale \
-screen section seeregister selectblocks selectpaper \
-selectversion setnumber settextcontent settextvariable setupalign \
-setupanswerarea setuparranging setupbackground setupbackgrounds setupblackrules \
-setupblank setupblock setupbodyfont setupbodyfontenvironment setupbottom \
-setupbottomtexts setupbuffer setupbuttons setupcapitals setupcaption \
-setupcaptions setupclipping setupcolor setupcolors setupcolumns \
-setupcolumnset setupcolumnsetlines setupcolumnsetstart setupcombinations setupcombinedlist \
-setupcomment setupdescriptions setupenumerations setupexternalfigures setupfield \
-setupfields setupfillinlines setupfillinrules setupfloat setupfloats \
-setupfloatsplitting setupfonthandling setupfontsynonym setupfooter setupfootertexts \
-setupfootnotedefinition setupfootnotes setupforms setupformulae setupframed \
-setupframedtexts setuphead setupheader setupheadertexts setupheadnumber \
-setupheads setupheadtext setuphyphenmark setupindentedtext setupindenting \
-setupinmargin setupinteraction setupinteractionbar setupinteractionmenu setupinteractionscreen \
-setupinterlinespace setupinterlinespace2 setupitemgroup setupitemizations setupitems \
-setuplabeltext setuplanguage setuplayout setuplegend setuplinenumbering \
-setuplines setuplinewidth setuplist setuplistalternative setupmakeup \
-setupmarginblocks setupmarginrules setupmarking setupmathalignment setupnarrower \
-setupnumber setupnumbering setupoppositeplacing setupoutput setuppagecomment \
-setuppagenumber setuppagenumbering setuppagetransitions setuppalet setuppaper \
-setuppapersize setupparagraphnumbering setupparagraphs setupplacement setuppositioning \
-setupprofiles setupprograms setuppublications setupquote setupreferencelist \
-setupreferencing setupregister setuprotate setuprule setups \
+definetextbackground definetextposition definetextvariable definetype definetypeface \
+definetyping defineversion description determineheadnumber determinelistcharacteristics \
+determineregistercharacteristics dimension disableinteractionmenu domicile donttest \
+edgedistance edgewidth emptylines enumeration environment \
+externalfigure fact field fieldstack fillinfield \
+fillinline fillinrules fillintext fitfield fixedspace \
+fixedspaces followprofile followprofileversion followversion footerdistance \
+footerheight footnote footnotetext forceblocks formulanumber \
+fraction framed framedtext from getbuffer \
+getmarking getnumber godown goto gotobox \
+gotopage graycolor greyvalue grid hairline \
+head headerdistance headerheight headlevel headnumber \
+headsym headtext hideblocks high hl \
+immediatebetweenlist immediatetolist in incrementnumber indentation \
+indenting inframed infull ininner inleft \
+inleftedge inleftmargin inline inmaframed inmargin \
+inneredgedistance inneredgewidth innermargindistance innermarginwidth inothermargin \
+inouter inright inrightedge inrightmargin installlanguage \
+interactionbar interactionbuttons interactionmenu item items \
+its keepblocks label labeling labels \
+labeltext language leftaligned leftedgedistance leftedgewidth \
+leftmargindistance leftmarginwidth leg linethickness listheight \
+listlength listsymbol listwidth loadsorts loadsynonyms \
+logfields lohi low maframed mainlanguage \
+makeupheight makeupwidth mapfontsize mar margindistance \
+marginrule margintext margintitle marginwidth marginword \
+marking markversion mathematics mediaeval menubutton \
+midaligned mirror month moveformula moveongrid \
+movesidefloat name navigating nextsection nocap \
+nodimension noheaderandfooterlines noindenting nolist nomarking \
+nomoreblocks nomorefiles nop nospace note \
+notopandbottomlines nowhitespace numberofsubpages numbers outeredgedistance \
+outeredgewidth outermargindistance outermarginwidth overbar overbars \
+overstrike overstrikes packed page pagedepth \
+pagenumber pageoffset pagereference paperheight paperwidth \
+paragraph part periods placebookmarks placecombinedlist \
+placefloat placefootnotes placeformula placeheadnumber placeheadtext \
+placelegend placelist placelistoffloats placelistofsorts placelistofsynonyms \
+placelocalfootnotes placelogos placeongrid placeontopofeachother placepagenumber \
+placerawlist placereferencelist placeregister placerule placesidebyside \
+placesubformula placetextvariable position positiontext printpaperheight \
+printpaperwidth processblocks processpage product program \
+project publication quotation quote ran \
+redo ref reference referral referraldate \
+referring register remark reservefloat reset \
+resetmarking resetnumber resettextcontent rightaligned rightedgedistance \
+rightedgewidth rightmargindistance rightmarginwidth romannumerals rotate \
+scale screen section seeregister selectblocks \
+selectpaper selectversion setnumber settextcontent settextvariable \
+setupalign setupanswerarea setuparranging setupbackground setupbackgrounds \
+setupblackrules setupblank setupblock setupbodyfont setupbodyfontenvironment \
+setupbottom setupbottomtexts setupbuffer setupbuttons setupcapitals \
+setupcaption setupcaptions setupclipping setupcolor setupcolors \
+setupcolumns setupcolumnset setupcolumnsetlines setupcolumnsetstart setupcombinations \
+setupcombinedlist setupcomment setupdescriptions setupenumerations setupexternalfigures \
+setupfield setupfields setupfillinlines setupfillinrules setupfloat \
+setupfloats setupfloatsplitting setupfonthandling setupfontsynonym setupfooter \
+setupfootertexts setupfootnotedefinition setupfootnotes setupforms setupformulae \
+setupframed setupframedtexts setuphead setupheader setupheadertexts \
+setupheadnumber setupheads setupheadtext setuphyphenmark setupindentedtext \
+setupindenting setupinmargin setupinteraction setupinteractionbar setupinteractionmenu \
+setupinteractionscreen setupinterlinespace setupinterlinespace2 setupitemgroup setupitemizations \
+setupitems setuplabeltext setuplanguage setuplayout setuplegend \
+setuplinenumbering setuplines setuplinewidth setuplist setuplistalternative \
+setupmakeup setupmarginblocks setupmarginrules setupmarking setupmathalignment \
+setupnarrower setupnumber setupnumbering setupoppositeplacing setupoutput \
+setuppagecomment setuppagenumber setuppagenumbering setuppagetransitions setuppalet \
+setuppaper setuppapersize setupparagraphnumbering setupparagraphs setupplacement \
+setuppositioning setupprofiles setupprograms setuppublications setupquote \
+setupreferencelist setupreferencing setupregister setuprotate setuprule \
setupscreens setupsection setupsectionblock setupsorting setupspacing \
setupstartstop setupstrut setupsubpagenumber setupsymbolset setupsynchronization \
setupsynchronizationbar setupsynonyms setupsystem setuptab setuptables \
-setuptabulate setuptext setuptextposition setuptextrules setuptexttexts \
-setuptextvariable setupthinrules setuptolerance setuptop setuptoptexts \
-setuptype setuptyping setupunderbar setupurl setupversions \
-setupwhitespace showbodyfont showbodyfontenvironment showcolor showcolorgroup \
-showexternalfigures showfields showframe showgrid showlayout \
-showmakeup showpalet showprint showsetups showstruts \
-showsymbolset someline somewhere sort space \
-splitfloat startalignment startbackground startbuffer startcoding \
-startcolor startcolumnmakeup startcolumns startcolumnset startcombination \
-startcomment startcomponent startdescription startdocument startenumeration \
-startenvironment startfact startfigure startfloattext startformula \
-startframedtext startglobal starthiding startinteractionmenu startitemgroup \
-startlegend startline startlinecorrection startlinenumbering startlines \
-startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginblock \
-startmarginrule startnamemakeup startnarrower startopposite startoverlay \
-startoverview startpacked startparagraph startpositioning startpostponing \
-startproduct startprofile startproject startquotation startraster \
-startregister startsymbolset startsynchronization starttable starttables \
-starttabulate starttext starttextrule starttyping startunpacked \
-startversion stopalignment stopbackground stopbuffer stopcoding \
-stopcolor stopcolumnmakeup stopcolumns stopcolumnset stopcombination \
-stopcomment stopcomponent stopdescription stopdocument stopenumeration \
-stopenvironment stopfact stopfigure stopfloattext stopformula \
-stopframedtext stopglobal stophiding stopinteractionmenu stopitemgroup \
-stoplegend stopline stoplinecorrection stoplinenumbering stoplines \
-stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginblock \
-stopmarginrule stopnamemakeup stopnarrower stopopposite stopoverlay \
-stopoverview stoppacked stopparagraph stoppositioning stoppostponing \
-stopproduct stopprofile stopproject stopquotation stopraster \
-stopsymbolset stopsynchronization stoptable stoptables stoptabulate \
-stoptext stoptextrule stoptyping stopunpacked stopversion \
+setuptabulate setuptext setuptextbackground setuptextposition setuptextrules \
+setuptexttexts setuptextvariable setupthinrules setuptolerance setuptop \
+setuptoptexts setuptype setuptyping setupunderbar setupurl \
+setupversions setupwhitespace showbodyfont showbodyfontenvironment showcolor \
+showcolorgroup showexternalfigures showfields showframe showgrid \
+showlayout showmakeup showpalet showprint showsetups \
+showstruts showsymbolset someline somewhere sort \
+space splitfloat startalignment startbackground startbuffer \
+startcoding startcolor startcolumnmakeup startcolumns startcolumnset \
+startcombination startcomment startcomponent startdescription startdocument \
+startenumeration startenvironment startfact startfigure startfloattext \
+startformula startframed startframedtext startglobal starthiding \
+startinteractionmenu startitemgroup startlegend startline startlinecorrection \
+startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes \
+startmakeup startmarginblock startmarginrule startnamemakeup startnarrower \
+startopposite startoverlay startoverview startpacked startparagraph \
+startpositioning startpostponing startproduct startprofile startproject \
+startquotation startraster startregister startsymbolset startsynchronization \
+starttable starttables starttabulate starttext starttextbackground \
+starttextrule starttyping startunpacked startversion stopalignment \
+stopbackground stopbuffer stopcoding stopcolor stopcolumnmakeup \
+stopcolumns stopcolumnset stopcombination stopcomment stopcomponent \
+stopdescription stopdocument stopenumeration stopenvironment stopfact \
+stopfigure stopfloattext stopformula stopframed stopframedtext \
+stopglobal stophiding stopinteractionmenu stopitemgroup stoplegend \
+stopline stoplinecorrection stoplinenumbering stoplines stoplocal \
+stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginblock stopmarginrule \
+stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview \
+stoppacked stopparagraph stoppositioning stoppostponing stopproduct \
+stopprofile stopproject stopquotation stopraster stopsymbolset \
+stopsynchronization stoptable stoptables stoptabulate stoptext \
+stoptextbackground stoptextrule stoptyping stopunpacked stopversion \
stretched sub subformulanumber subject subpagenumber \
subsection subsubject subsubsection subsubsubject switchtobodyfont \
switchtorawfont sym symbol symoffset synchronizationbar \
@@ -554,81 +554,81 @@ placevariabletexte position positionnetexte prendbuffer produit \
programme projet publication qqpart ran \
raz razmarquage raznumero recommandation ref \
refait reference referencepage referencetexte reflete \
-register reglages reglealignement reglearrangement reglearriereplan \
-reglearriereplans reglebarreinteraction reglebarresynchronisation reglebloc regleblocmarge \
-regleblocsection regleboutons reglebuffer reglecapitales reglechamp \
-reglechamps regleclipping reglecolonnes reglecombinaisons reglecommentaire \
-reglecommentairepage reglecompoetroite reglecomposeenalinea reglecouleur reglecouleurs \
-regledactylo regledansmarge regledemarrestoppe regledescriptions regledisposition \
-regleecraninteraction regleecrans regleelements regleencadre regleentete \
-regleenumerations regleenvironnementpolicecorps regleepaisseurligne regleespaceblanc regleespacement \
-regleespacementinterligne reglefiguresexternes regleflottant regleflottants regleformulaires \
-regleformules reglegroupeselements regleinf regleinteraction regleintitule \
-regleintitules reglejeucolonne reglejeusymboles reglelabeltexte reglelangue \
-reglelegende reglelignes reglelignesnoires reglelignesreglestexte regleliste \
-reglelisteimbriquee reglelistereference reglemakeup reglemargereglee reglemarquage \
-reglemarquagehyphenation reglemenuinteraction reglenotepdp reglenumero reglenumeropage \
-reglenumerotation reglenumerotationligne reglenumerotationpage reglenumerotationparagraphe reglenumerotete \
-regleoriente reglepalette reglepapier regleparagraphes reglepdp \
-regleplacementopposition reglepolicecorps reglepositionnement reglepositiontexte regleprofils \
-regleprogrammes reglepublications reglereferencage regleregistre regleregle \
-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 reglevariabletexte regleversions remplitchamp remplitligne \
-remplitlignesreglees remplittexte reservefloat resettextcontent retourarriere \
-sansalinea sansdimension sansespace sansespaceblanc sanslignesenteteetpdp \
-sanslignessupetinf sansliste sansmarquage sanstest sauteblocs \
-section seeregister selectionneblocs selectionnepapier selectionneversion \
-sensunite separeflottant settext setupanswerarea setupcolumnsetlines \
-setupcolumnsetstart setupfonthandling setupfontsynonym setupframedtexts setupindentedtext \
-setupinterlinespace2 setupitemgroup setuplistalternative setupmathalignment setupplacement \
-sort sousnumeropage startalignment startarriereplan startbuffer \
-startcitation startcolumnmakeup 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 \
-stopcitation stopcolumnmakeup stopcolumns stopcombination stopcomment \
-stopcompoetroite 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 stoppealignement \
-stoppearriereplan stoppeblocmarge stoppecitation stoppecodage stoppecolonnes \
-stoppecombinaison stoppecomposant stoppecorrectionligne stoppecouleur stoppedegroupe \
-stoppedocument stoppeenvironement stoppeglobal stoppegroupe stoppejeucolonne \
-stoppeligne stoppeligneregleetexte stoppelignes stoppelocal stoppemakeup \
-stoppemargereglee stoppenotespdplocales stoppenumerotationligne stoppeopposition stoppepositionnement \
-stoppeproduit stoppeprofil stoppeprojet stopperaster stopperevetement \
-stoppesynchronisation stoppetableau stoppetableaux stoppetexte stoppeversion \
-stoppevuedensemble 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 \
-testcolumn testpage tete tex textemarge \
-textenotepdp textetete title titremarge traduire \
-traiteblocs traitepage traitfin traitsfins txt \
-typ underbar underbars uneligne useXMLfilter \
-usedirectory usetypescript usetypescriptfile utiliseJSscripts utiliseURL \
-utiliseblocs utilisechemin utilisecommandes utilisedocumentexterne utiliseencodage \
-utilisefichierexterne utilisefichiersexternes utilisefigureexterne utilisemodule utilisemodules \
-utilisepsiteaudioexterne utilisereferences utilisespecialites utilisesymboles utiliseurl \
-va vaalaboite vaalapage vaenbas valeurcouleur \
-valeurgris variabletexte version vide vl
+register reglealignement reglearrangement reglearriereplan reglearriereplans \
+reglebarreinteraction reglebarresynchronisation reglebloc regleblocmarge regleblocsection \
+regleboutons reglebuffer reglecapitales reglechamp reglechamps \
+regleclipping reglecolonnes reglecombinaisons reglecommentaire reglecommentairepage \
+reglecompoetroite reglecomposeenalinea reglecouleur reglecouleurs regledactylo \
+regledansmarge regledemarrestoppe regledescriptions regledisposition regleecraninteraction \
+regleecrans regleelements regleencadre regleentete regleenumerations \
+regleenvironnementpolicecorps regleepaisseurligne regleespaceblanc regleespacement regleespacementinterligne \
+reglefiguresexternes regleflottant regleflottants regleformulaires regleformules \
+reglegroupeselements regleinf regleinteraction regleintitule regleintitules \
+reglejeucolonne reglejeusymboles reglelabeltexte reglelangue reglelegende \
+reglelignes reglelignesnoires reglelignesreglestexte regleliste reglelisteimbriquee \
+reglelistereference reglemakeup reglemargereglee reglemarquage reglemarquagehyphenation \
+reglemenuinteraction reglenotepdp reglenumero reglenumeropage reglenumerotation \
+reglenumerotationligne reglenumerotationpage reglenumerotationparagraphe reglenumerotete regleoriente \
+reglepalette reglepapier regleparagraphes reglepdp regleplacementopposition \
+reglepolicecorps reglepositionnement reglepositiontexte regleprofils regleprogrammes \
+reglepublications reglereferencage regleregistre regleregle 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 \
+reglevariabletexte regleversions remplitchamp remplitligne remplitlignesreglees \
+remplittexte reservefloat resettextcontent retourarriere sansalinea \
+sansdimension sansespace sansespaceblanc sanslignesenteteetpdp sanslignessupetinf \
+sansliste sansmarquage sanstest sauteblocs section \
+seeregister selectionneblocs selectionnepapier selectionneversion sensunite \
+separeflottant settext setupanswerarea setupcolumnsetlines setupcolumnsetstart \
+setupfonthandling setupfontsynonym setupframedtexts setupindentedtext setupinterlinespace2 \
+setupitemgroup setuplistalternative setupmathalignment setupplacement sort \
+sousnumeropage startalignment startarriereplan startbuffer startcitation \
+startcolumnmakeup 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 stopcitation \
+stopcolumnmakeup stopcolumns stopcombination stopcomment stopcompoetroite \
+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 stoppealignement stoppearriereplan \
+stoppeblocmarge stoppecitation stoppecodage stoppecolonnes stoppecombinaison \
+stoppecomposant stoppecorrectionligne stoppecouleur stoppedegroupe stoppedocument \
+stoppeenvironement stoppeglobal stoppegroupe stoppejeucolonne stoppeligne \
+stoppeligneregleetexte stoppelignes stoppelocal stoppemakeup stoppemargereglee \
+stoppenotespdplocales stoppenumerotationligne stoppeopposition stoppepositionnement stoppeproduit \
+stoppeprofil stoppeprojet stopperaster stopperevetement stoppesynchronisation \
+stoppetableau stoppetableaux stoppetexte stoppeversion stoppevuedensemble \
+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 testcolumn \
+testpage tete tex textemarge textenotepdp \
+textetete title titremarge traduire traiteblocs \
+traitepage traitfin traitsfins txt typ \
+underbar underbars uneligne useXMLfilter usedirectory \
+usetypescript usetypescriptfile utiliseJSscripts utiliseURL utiliseblocs \
+utilisechemin utilisecommandes utilisedocumentexterne utiliseencodage utilisefichierexterne \
+utilisefichiersexternes utilisefigureexterne utilisemodule utilisemodules utilisepsiteaudioexterne \
+utilisereferences utilisespecialites utilisesymboles utiliseurl va \
+vaalaboite vaalapage vaenbas valeurcouleur valeurgris \
+variabletexte version vide vl
keywordclass.context.it=\
CAP Cap Caps GIORNOSETTIMANA \
@@ -698,100 +698,100 @@ impostatabelle impostatabulato impostatavolozza impostatesta impostateste \
impostatesticima impostatestifondo impostatestiincorniciati impostatestiintestazioni impostatestipdp \
impostatesto impostatestoetichette impostatestointestazioni impostatestotesti impostatolleranza \
impostatransizionepagina impostatype impostatyping impostaurl impostavariabiletesto \
-impostaversioni impostazioni in inaltromargine incorniciato \
-incrementanumero indentation indestra ininner iniziaallineamento \
-iniziaambiente iniziabloccomargine iniziacitazione iniziacodifica iniziacolonne \
-iniziacolore iniziacombinazione iniziacomponente iniziacorrezioneriga iniziadocumento \
-iniziafigura iniziaglobale iniziagruppocolonne iniziaimpaccato inizialineamargine \
-inizialineatesto inizialocale iniziamakeup inizianotepdplocali inizianumerazionerighe \
-iniziaopposto iniziaoverview iniziapiustretto iniziaposizionamento iniziaprodotto \
-iniziaprofilo iniziaprogetto iniziaraster iniziariga iniziarighe \
-iniziasetsimboli iniziasfondo iniziasincronizzazione iniziasovrapposizione iniziatabella \
-iniziatabelle iniziatesto iniziaunpacked iniziaversione inlatodestro \
-inlatosinistro inmaframed inmargine inmarginedestro inmarginesinistro \
-inneredgedistance inneredgewidth innermargindistance innermarginwidth inouter \
-inriga insinistra installalingua intorno labeling \
-leg lettera lettere lineamargine lineanera \
-lineasottile lineatesto lineenere lineeriempimento lineesottili \
-lingua linguaprincipale listsymbol livellotesta loadsorts \
-loadsynonyms logcampi lunghezzaelenco maframed mapfontsize \
-mar marcatura marcaversione matematica mediaeval \
-menuinterattivo menzione mese mettielenco mettielencocombinato \
-mettifiancoafianco mettiformula mettiingriglia mettilegenda mettilinea \
-mettiloghi mettinotepdp mettinotepdplocali mettinumeropagina mettiregistro \
-mettisegnalibro mettisottoformula mettiunosullaltro mettivariabiletesto mostraambientefontdeltesto \
-mostracampi mostracolore mostracornice mostrafiguresterne mostrafontdeltesto \
-mostragriglia mostragruppocolori mostraimpostazioni mostralyout mostramakeup \
-mostrasetsimboli mostrastampa mostrastruts mostratavolozza movesidefloat \
-name nascondiblocchi navigating nextsection nientedimensioni \
-nienteelenco nientelineecimafondo nientelineintestazionepdp nientemarcatura nienterientro \
-nientespazio nientespaziobianco nocap nome nomeunita \
-nop nota notapdp notest numberofsubpages \
-numeri numeriromani numeroformula numeropagina numeropaginacompleto \
-numerosottoformula numerotesta numerotestacorrente numerototaledipagine outeredgedistance \
-outeredgewidth outermargindistance outermarginwidth overbar overbars \
-overstrike overstrikes pagedepth pageoffset pagina \
-paragraph paroladestra parolainmargine part passaafontgrezzo \
-ped pedap perlungo placefloat placelistoffloats \
-placelistofsorts placelistofsynonyms placerawlist placereferencelist posizionanumerotesta \
-posizionatesto posizionatestotesta posizione prendibuffer prendimarcatura \
-prodotto progetto programma pubblicazione pulsante \
-pulsantemenu pulsantinterazione punti qualcheriga ran \
-referral referring register reimposta reimpostamarcatura \
-reservefloat resetnumber resettextcontent rientro rif \
-rifai riferimento riferimentopagina riferimentotesto riflessione \
-rigariempimento rigovuoto ruota saltablocchi scala \
-schermo scrividentroelenco scriviinelenco scriviinlistariferimenti scriviinregistro \
-section seeregister segnalibro seguiprofilo seguiversione \
-seguiversioneprofilo selezionablocchi selezionacarta selezionaversione separamarcatura \
-setnumber settext setupanswerarea setupcolumnsetlines setupcolumnsetstart \
-setupfonthandling setupfontsynonym setupindentedtext setupinterlinespace2 setupitemgroup \
-setuplistalternative setupmathalignment setuppaper setupplacement setvariabiletesto \
-sfondo sim simbolo sincronizza sort \
-spazifissi spazio spaziobianco spaziocima spaziodietro \
-spaziofisso spaziofondo spessoreriga spezzaoggettomobile spostaagriglia \
-spostaformula stackcampi startalignment startambiente startbuffer \
-startcitazione startcolore startcolumnmakeup 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 stopcitazione stopcolore stopcolumnmakeup 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 subpagenumber \
-subsection subsubject subsubsection subsubsubject synonym \
-tab terminaallineamento terminaambiente terminabloccomargine terminacitazione \
-terminacodifica terminacolonne terminacolore terminacombinazione terminacomponente \
-terminacorrezioneriga terminadocumento terminaglobale terminagruppocolonne terminaimpaccato \
-terminalineamargine terminalineatesto terminalocale terminamakeup terminanotepdplocali \
-terminanumerazionerighe terminaopposto terminaoverview terminapiustretto terminaposizionamento \
-terminaprodotto terminaprofili terminaprogetto terminaraster terminariga \
-terminarighe terminasfondo terminasincronizzazione terminasovrapposizione terminatabella \
-terminatabelle terminatesto terminaunpacked terminaversioni testa \
-testcolumn testoetichetta testoinmargine testoinstestazioni testonotapdp \
-testoriempimento testpage tex tieniblocchi title \
-titoloinmargine tooltip traduci txt typ \
-type typebuffer typefile underbar underbars \
-usaJSscripts usaURL usablocco usacartella usacodifica \
-usacolonnasonoraesterna usacomandi usadocumentoesterno usafiguraesterna usafileesterni \
-usafileesterno usamoduli usamodulo usariferimenti usasimboli \
-usaspecialita usaurl useXMLfilter usedirectory usetypescript \
-usetypescriptfile vaia vaiabox vaiapagina vaigiu \
-valorecolore valoregrigio variabiletesto versione vl
+impostaversioni in inaltromargine incorniciato incrementanumero \
+indentation indestra ininner iniziaallineamento iniziaambiente \
+iniziabloccomargine iniziacitazione iniziacodifica iniziacolonne iniziacolore \
+iniziacombinazione iniziacomponente iniziacorrezioneriga iniziadocumento iniziafigura \
+iniziaglobale iniziagruppocolonne iniziaimpaccato inizialineamargine inizialineatesto \
+inizialocale iniziamakeup inizianotepdplocali inizianumerazionerighe iniziaopposto \
+iniziaoverview iniziapiustretto iniziaposizionamento iniziaprodotto iniziaprofilo \
+iniziaprogetto iniziaraster iniziariga iniziarighe iniziasetsimboli \
+iniziasfondo iniziasincronizzazione iniziasovrapposizione iniziatabella iniziatabelle \
+iniziatesto iniziaunpacked iniziaversione inlatodestro inlatosinistro \
+inmaframed inmargine inmarginedestro inmarginesinistro inneredgedistance \
+inneredgewidth innermargindistance innermarginwidth inouter inriga \
+insinistra installalingua intorno labeling leg \
+lettera lettere lineamargine lineanera lineasottile \
+lineatesto lineenere lineeriempimento lineesottili lingua \
+linguaprincipale listsymbol livellotesta loadsorts loadsynonyms \
+logcampi lunghezzaelenco maframed mapfontsize mar \
+marcatura marcaversione matematica mediaeval menuinterattivo \
+menzione mese mettielenco mettielencocombinato mettifiancoafianco \
+mettiformula mettiingriglia mettilegenda mettilinea mettiloghi \
+mettinotepdp mettinotepdplocali mettinumeropagina mettiregistro mettisegnalibro \
+mettisottoformula mettiunosullaltro mettivariabiletesto mostraambientefontdeltesto mostracampi \
+mostracolore mostracornice mostrafiguresterne mostrafontdeltesto mostragriglia \
+mostragruppocolori mostraimpostazioni mostralyout mostramakeup mostrasetsimboli \
+mostrastampa mostrastruts mostratavolozza movesidefloat name \
+nascondiblocchi navigating nextsection nientedimensioni nienteelenco \
+nientelineecimafondo nientelineintestazionepdp nientemarcatura nienterientro nientespazio \
+nientespaziobianco nocap nome nomeunita nop \
+nota notapdp notest numberofsubpages numeri \
+numeriromani numeroformula numeropagina numeropaginacompleto numerosottoformula \
+numerotesta numerotestacorrente numerototaledipagine outeredgedistance outeredgewidth \
+outermargindistance outermarginwidth overbar overbars overstrike \
+overstrikes pagedepth pageoffset pagina paragraph \
+paroladestra parolainmargine part passaafontgrezzo ped \
+pedap perlungo placefloat placelistoffloats placelistofsorts \
+placelistofsynonyms placerawlist placereferencelist posizionanumerotesta posizionatesto \
+posizionatestotesta posizione prendibuffer prendimarcatura prodotto \
+progetto programma pubblicazione pulsante pulsantemenu \
+pulsantinterazione punti qualcheriga ran referral \
+referring register reimposta reimpostamarcatura reservefloat \
+resetnumber resettextcontent rientro rif rifai \
+riferimento riferimentopagina riferimentotesto riflessione rigariempimento \
+rigovuoto ruota saltablocchi scala schermo \
+scrividentroelenco scriviinelenco scriviinlistariferimenti scriviinregistro section \
+seeregister segnalibro seguiprofilo seguiversione seguiversioneprofilo \
+selezionablocchi selezionacarta selezionaversione separamarcatura setnumber \
+settext setupanswerarea setupcolumnsetlines setupcolumnsetstart setupfonthandling \
+setupfontsynonym setupindentedtext setupinterlinespace2 setupitemgroup setuplistalternative \
+setupmathalignment setuppaper setupplacement setvariabiletesto sfondo \
+sim simbolo sincronizza sort spazifissi \
+spazio spaziobianco spaziocima spaziodietro spaziofisso \
+spaziofondo spessoreriga spezzaoggettomobile spostaagriglia spostaformula \
+stackcampi startalignment startambiente startbuffer startcitazione \
+startcolore startcolumnmakeup 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 \
+stopcitazione stopcolore stopcolumnmakeup 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 subpagenumber subsection \
+subsubject subsubsection subsubsubject synonym tab \
+terminaallineamento terminaambiente terminabloccomargine terminacitazione terminacodifica \
+terminacolonne terminacolore terminacombinazione terminacomponente terminacorrezioneriga \
+terminadocumento terminaglobale terminagruppocolonne terminaimpaccato terminalineamargine \
+terminalineatesto terminalocale terminamakeup terminanotepdplocali terminanumerazionerighe \
+terminaopposto terminaoverview terminapiustretto terminaposizionamento terminaprodotto \
+terminaprofili terminaprogetto terminaraster terminariga terminarighe \
+terminasfondo terminasincronizzazione terminasovrapposizione terminatabella terminatabelle \
+terminatesto terminaunpacked terminaversioni testa testcolumn \
+testoetichetta testoinmargine testoinstestazioni testonotapdp testoriempimento \
+testpage tex tieniblocchi title titoloinmargine \
+tooltip traduci txt typ type \
+typebuffer typefile underbar underbars usaJSscripts \
+usaURL usablocco usacartella usacodifica usacolonnasonoraesterna \
+usacomandi usadocumentoesterno usafiguraesterna usafileesterni usafileesterno \
+usamoduli usamodulo usariferimenti usasimboli usaspecialita \
+usaurl useXMLfilter usedirectory usetypescript usetypescriptfile \
+vaia vaiabox vaiapagina vaigiu valorecolore \
+valoregrigio variabiletesto versione vl
keywordclass.context.nl=\
CAP Cap Caps Cijfers \
@@ -820,24 +820,24 @@ definieerpapierformaat definieerplaats definieerplaatsblok definieerprofiel defi
definieerreferentie definieerreferentieformaat definieerreferentielijst definieerregister definieersamengesteldelijst \
definieersectie definieersectieblok definieersorteren definieerstartstop definieersubveld \
definieersymbool definieersynoniemen definieertabelvorm definieertabulatie definieertekst \
-definieertekstpositie definieertekstvariabele definieertype definieertypen definieeruitvoer \
-definieerveld definieerveldstapel definieerversie definieerwiskundeuitlijnen description \
-dimensie directnaarlijst directtussenlijst doordefinieren doorlabelen \
-doornummeren dunnelijn dunnelijnen eenregel enumeration \
-ergens externfiguur forceerblokken formulenummer framedtext \
-gebruikJSscripts gebruikURL gebruikXMLfilter gebruikblokken gebruikcommandos \
-gebruikexterndocument gebruikexternefile gebruikexternefiles gebruikexternfiguur gebruikexterngeluidsfragment \
-gebruikgebied gebruikmodule gebruikmodules gebruikreferenties gebruikspecials \
-gebruiksymbolen gebruiktypescript gebruiktypescriptfile gebruikurl geenblokkenmeer \
-geenbovenenonderregels geendimensie geenfilesmeer geenhoofdenvoetregels geenlijst \
-geenmarkering geenspatie geentest geenwitruimte geg \
-grijskleur grijswaarde haalbuffer haalmarkering haalnummer \
-haarlijn handhaafblokken herhaal hl hoofdafstand \
-hoofdhoogte hoofdtaal hoog huidigedatum huidigekopnummer \
-in inanderemarge inbinnen inbuiten indentation \
-inlijnd inlinker inlinkermarge inlinkerrand inmarge \
-inrechter inrechtermarge inrechterrand inregel inspringen \
-installeertaal instellingen interactiebalk interactiebuttons interactiemenu \
+definieertekstachtergrond definieertekstpositie definieertekstvariabele definieertype definieertypen \
+definieeruitvoer definieerveld definieerveldstapel definieerversie definieerwiskundeuitlijnen \
+description dimensie directnaarlijst directtussenlijst doordefinieren \
+doorlabelen doornummeren dunnelijn dunnelijnen eenregel \
+enumeration ergens externfiguur forceerblokken formulenummer \
+framedtext gebruikJSscripts gebruikURL gebruikXMLfilter gebruikblokken \
+gebruikcommandos gebruikexterndocument gebruikexternefile gebruikexternefiles gebruikexternfiguur \
+gebruikexterngeluidsfragment gebruikgebied gebruikmodule gebruikmodules gebruikreferenties \
+gebruikspecials gebruiksymbolen gebruiktypescript gebruiktypescriptfile gebruikurl \
+geenblokkenmeer geenbovenenonderregels geendimensie geenfilesmeer geenhoofdenvoetregels \
+geenlijst geenmarkering geenspatie geentest geenwitruimte \
+geg grijskleur grijswaarde haalbuffer haalmarkering \
+haalnummer haarlijn handhaafblokken herhaal hl \
+hoofdafstand hoofdhoogte hoofdtaal hoog huidigedatum \
+huidigekopnummer in inanderemarge inbinnen inbuiten \
+indentation inlijnd inlinker inlinkermarge inlinkerrand \
+inmarge inrechter inrechtermarge inrechterrand inregel \
+inspringen installeertaal interactiebalk interactiebuttons interactiemenu \
invullijnen invulregel invultekst invulveld inwilijnd \
items its kantlijn kap kenmerk \
kenmerkdatum kentekstvariabeletoe kleur kleurenbalk kleurwaarde \
@@ -860,10 +860,10 @@ pagina paginadiepte paginanummer paginaoffset paginareferentie \
papierbreedte papierhoogte paragraph part paslayoutaan \
passeerblokken passendveld plaatsbeeldmerken plaatsbookmarks plaatsformule \
plaatskopnummer plaatskoptekst plaatslegenda plaatslijn plaatslijst \
-plaatslokalevoetnoten plaatsnaastelkaar plaatsonderelkaar plaatsopgrid plaatspaginanummer \
-plaatsplaatsblok plaatsreferentielijst plaatsregister plaatsruwelijst plaatssamengesteldelijst \
-plaatssubformule plaatstekstvariabele plaatsvoetnoten placelistoffloats placelistofsorts \
-placelistofsynonyms positioneer positioneertekst printpapierbreedte printpapierhoogte \
+plaatslijstmetsynoniemen plaatslokalevoetnoten plaatsnaastelkaar plaatsonderelkaar plaatsopgrid \
+plaatspaginanummer plaatsplaatsblok plaatsreferentielijst plaatsregister plaatsruwelijst \
+plaatssamengesteldelijst plaatssubformule plaatstekstvariabele plaatsvoetnoten placelistoffloats \
+placelistofsorts positioneer positioneertekst printpapierbreedte printpapierhoogte \
produkt programma projekt publicatie punten \
ran randafstand randbreedte rechtermargeafstand rechtermargebreedte \
rechterrandafstand rechterrandbreedte ref refereer referentie \
@@ -883,55 +883,56 @@ startkleur startkolomgroep startkolommen startkolomopmaak startlegend \
startline startlinecorrection startlinenumbering startlines startlocal \
startlocalenvironment startlocalfootnotes startlokaal startlokalevoetnoten startmakeup \
startmargeblok startmarginblock startnaast startnamemakeup startnarrower \
-startomgeving startonderdeel startopelkaar startopmaak startopposite \
-startoverlay startoverview startoverzicht startparagraph startpositioneren \
-startpositioning startpostponing startprodukt startprofiel startprofile \
-startprojekt startraster startregel startregelcorrectie startregelnummeren \
-startregels startregister startsmaller startsymbolset startsymboolset \
-startsynchronisatie startsynchronization starttabel starttabellen starttable \
-starttables starttabulate starttekst starttekstlijn starttyping \
-startuitlijnen startunpacked startvanelkaar startversie stelachtergrondenin \
-stelachtergrondin stelalineasin stelantwoordgebiedin stelarrangerenin stelblankoin \
-stelblokin stelblokjesin stelblokkopjein stelblokkopjesin stelbovenin \
-stelboventekstenin stelbufferin stelbuttonsin stelciterenin stelclipin \
-stelcombinatiesin stelcommentaarin steldoordefinierenin steldoornummerenin steldunnelijnenin \
-stelexternefigurenin stelformulesin stelformulierenin stelhoofdin stelhoofdtekstenin \
-stelingesprongentextin stelinmargein stelinspringenin stelinteractiebalkin stelinteractiein \
-stelinteractiemenuin stelinteractieschermin stelinterliniein stelinvullijnenin stelinvulregelsin \
-stelitemgroepin stelitemsin stelkadertekstenin stelkantlijnin stelkapitalenin \
-stelkleurenin stelkleurin stelkolomgroepin stelkolomgroepregelsin stelkolomgroepstartin \
-stelkolommenin stelkopin stelkopnummerin stelkoppeltekenin stelkoppenin \
-stelkoptekstin stelkorpsin stelkorpsomgevingin stellabeltekstin stellayoutin \
-stellegendain stellijndiktein stellijnin stellijstin stelmargeblokkenin \
-stelmarkeringin stelnaastplaatsenin stelnummerenin stelnummerin stelomlijndin \
-stelonderin stelonderstrepenin stelondertekstenin stelopmaakin stelopsommingenin \
-stelpaginacommentaarin stelpaginanummerin stelpaginanummeringin stelpaginaovergangenin stelpaletin \
-stelpapierformaatin stelpapierin stelparagraafnummerenin stelplaatsblokin stelplaatsblokkenin \
-stelplaatsbloksplitsenin stelplaatsin stelpositionerenin stelprofielenin stelprogrammasin \
-stelpublicatiesin stelrastersin stelreferentielijstin stelrefererenin stelregelnummerenin \
-stelregelsin stelregisterin stelroterenin stelsamengesteldelijstin stelsectieblokin \
-stelsectiein stelsmallerin stelsorterenin stelspatieringin stelstartstopin \
-stelstrutin stelsubpaginanummerin stelsymboolsetin stelsynchronisatiebalkin stelsynchronisatiein \
-stelsynoniemenin stelsysteemin steltaalin steltabellenin steltabin \
-steltabulatiein steltekstin steltekstinhoudin steltekstlijnenin steltekstpositiein \
-stelteksttekstenin steltekstvariabelein steltolerantiein steltypein steltypenin \
-steluitlijnenin steluitvoerin stelurlin stelveldenin stelveldin \
-stelversiesin stelvoetin stelvoetnootdefinitiein stelvoetnotenin stelvoettekstenin \
-stelwiskundeuitlijnenin stelwitruimtein stopachtergrond stopalignment stopbuffer \
-stopcitaat stopcodering stopcolumns stopcombinatie stopcombination \
-stopcomment stopdescription stopdocument stopenumeration stopfigure \
-stopfloattext stopformula stopframedtext stopgeg stopglobaal \
-stophiding stopinteractiemenu stopitemgroup stopkantlijn stopkleur \
-stopkolomgroep stopkolommen stopkolomopmaak stoplegend stopline \
-stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment \
-stoplocalfootnotes stoplokaal stoplokalevoetnoten stopmakeup stopmargeblok \
-stopmarginblock stopnaast stopnamemakeup stopnarrower stopomgeving \
-stoponderdeel stopopelkaar stopopmaak stopopposite stopoverlay \
-stopoverview stopoverzicht stopparagraph stoppositioneren stoppositioning \
-stoppostponing stopprodukt stopprofiel stopprofile stopprojekt \
-stopraster stopregel stopregelcorrectie stopregelnummeren stopregels \
-stopsmaller stopsymbolset stopsynchronisatie stopsynchronization stoptabel \
-stoptabellen stoptable stoptables stoptabulate stoptekst \
+startomgeving startomlijnd startonderdeel startopelkaar startopmaak \
+startopposite startoverlay startoverview startoverzicht startparagraph \
+startpositioneren startpositioning startpostponing startprodukt startprofiel \
+startprofile startprojekt startraster startregel startregelcorrectie \
+startregelnummeren startregels startregister startsmaller startsymbolset \
+startsymboolset startsynchronisatie startsynchronization starttabel starttabellen \
+starttable starttables starttabulate starttekst starttekstachtergrond \
+starttekstlijn starttyping startuitlijnen startunpacked startvanelkaar \
+startversie stelachtergrondenin stelachtergrondin stelalineasin stelantwoordgebiedin \
+stelarrangerenin stelblankoin stelblokin stelblokjesin stelblokkopjein \
+stelblokkopjesin stelbovenin stelboventekstenin stelbufferin stelbuttonsin \
+stelciterenin stelclipin stelcombinatiesin stelcommentaarin steldoordefinierenin \
+steldoornummerenin steldunnelijnenin stelexternefigurenin stelformulesin stelformulierenin \
+stelhoofdin stelhoofdtekstenin stelingesprongentextin stelinmargein stelinspringenin \
+stelinteractiebalkin stelinteractiein stelinteractiemenuin stelinteractieschermin stelinterliniein \
+stelinvullijnenin stelinvulregelsin stelitemgroepin stelitemsin stelkadertekstenin \
+stelkantlijnin stelkapitalenin stelkleurenin stelkleurin stelkolomgroepin \
+stelkolomgroepregelsin stelkolomgroepstartin stelkolommenin stelkopin stelkopnummerin \
+stelkoppeltekenin stelkoppenin stelkoptekstin stelkorpsin stelkorpsomgevingin \
+stellabeltekstin stellayoutin stellegendain stellijndiktein stellijnin \
+stellijstin stelmargeblokkenin stelmarkeringin stelnaastplaatsenin stelnummerenin \
+stelnummerin stelomlijndin stelonderin stelonderstrepenin stelondertekstenin \
+stelopmaakin stelopsommingenin stelpaginacommentaarin stelpaginanummerin stelpaginanummeringin \
+stelpaginaovergangenin stelpaletin stelpapierformaatin stelpapierin stelparagraafnummerenin \
+stelplaatsblokin stelplaatsblokkenin stelplaatsbloksplitsenin stelplaatsin stelpositionerenin \
+stelprofielenin stelprogrammasin stelpublicatiesin stelrastersin stelreferentielijstin \
+stelrefererenin stelregelnummerenin stelregelsin stelregisterin stelroterenin \
+stelsamengesteldelijstin stelsectieblokin stelsectiein stelsmallerin stelsorterenin \
+stelspatieringin stelstartstopin stelstrutin stelsubpaginanummerin stelsymboolsetin \
+stelsynchronisatiebalkin stelsynchronisatiein stelsynoniemenin stelsysteemin steltaalin \
+steltabellenin steltabin steltabulatiein steltekstachtergrondin steltekstin \
+steltekstinhoudin steltekstlijnenin steltekstpositiein stelteksttekstenin steltekstvariabelein \
+steltolerantiein steltypein steltypenin steluitlijnenin steluitvoerin \
+stelurlin stelveldenin stelveldin stelversiesin stelvoetin \
+stelvoetnootdefinitiein stelvoetnotenin stelvoettekstenin stelwiskundeuitlijnenin stelwitruimtein \
+stopachtergrond stopalignment stopbuffer stopcitaat stopcodering \
+stopcolumns stopcombinatie stopcombination stopcomment stopdescription \
+stopdocument stopenumeration stopfigure stopfloattext stopformula \
+stopframedtext stopgeg stopglobaal stophiding stopinteractiemenu \
+stopitemgroup stopkantlijn stopkleur stopkolomgroep stopkolommen \
+stopkolomopmaak stoplegend stopline stoplinecorrection stoplinenumbering \
+stoplines stoplocal stoplocalenvironment stoplocalfootnotes stoplokaal \
+stoplokalevoetnoten stopmakeup stopmargeblok stopmarginblock stopnaast \
+stopnamemakeup stopnarrower stopomgeving stopomlijnd stoponderdeel \
+stopopelkaar stopopmaak stopopposite stopoverlay stopoverview \
+stopoverzicht stopparagraph stoppositioneren stoppositioning stoppostponing \
+stopprodukt stopprofiel stopprofile stopprojekt stopraster \
+stopregel stopregelcorrectie stopregelnummeren stopregels stopsmaller \
+stopsymbolset stopsynchronisatie stopsynchronization stoptabel stoptabellen \
+stoptable stoptables stoptabulate stoptekst stoptekstachtergrond \
stoptekstlijn stoptyping stopuitlijnen stopunpacked stopvanelkaar \
stopversie sub subformulenummer subject subpaginanummer \
subsection subsubject subsubsection subsubsubject suggestie \
@@ -1002,119 +1003,119 @@ useXMLfilter usedirectory useurl آفست‌صفحه آیتم \
استفاده‌ویژگیها استفاده‌پرونده‌خارجی استفاده‌پرونده‌دستخط‌تایپ استفاده‌پرونده‌های‌خارجی اعدادلاتین \
افزودن اما امتحان‌نکن انتخاب‌برگ انتخاب‌بلوکها \
انتخاب‌نسخه انتقال‌به‌توری انتقال‌فرمول انتقال‌کنار‌شناور انجام‌دوباره \
-بارگذاریها بارگذاری‌آرایش بارگذاری‌آیتمها بارگذاری‌ارجاع بارگذاری‌اندازه‌برگ \
-بارگذاری‌باریکتر بارگذاری‌بافر بارگذاری‌بالا بارگذاری‌بخش بارگذاری‌بردباری \
-بارگذاری‌برنامه‌ها بارگذاری‌برگ بارگذاری‌بست بارگذاری‌بلوک بارگذاری‌بلوکهای‌حاشیه \
-بارگذاری‌بلوک‌بخش بارگذاری‌تایپ بارگذاری‌تایپ‌کردن بارگذاری‌تب بارگذاری‌ترتیب \
-بارگذاری‌ترکیب‌ها بارگذاری‌تطابق بارگذاری‌تعریف‌پانوشت بارگذاری‌تنظیم بارگذاری‌تنظیم‌ریاضی \
-بارگذاری‌ته‌برگ بارگذاری‌تورفتگی بارگذاری‌توضیح بارگذاری‌توضیح‌صفحه بارگذاری‌ثبت \
-بارگذاری‌جانشانی بارگذاری‌جدولها بارگذاری‌جدول‌بندی بارگذاری‌خالی بارگذاری‌خروجی \
-بارگذاری‌خط بارگذاری‌خطها بارگذاری‌خطهای‌حاشیه بارگذاری‌خطهای‌سیاه بارگذاری‌خطهای‌متن \
-بارگذاری‌خطهای‌مجموعه‌ستون بارگذاری‌خطها‌ی‌نازک بارگذاری‌درج‌درخطها بارگذاری‌درج‌مخالف بارگذاری‌درون‌حاشیه \
-بارگذاری‌دوران بارگذاری‌دکمه‌ها بارگذاری‌راهنما بارگذاری‌رنگ بارگذاری‌رنگها \
-بارگذاری‌زبان بارگذاری‌ستونها بارگذاری‌سر بارگذاری‌سربرگ بارگذاری‌سرها \
-بارگذاری‌سیستم بارگذاری‌شرح بارگذاری‌شرحها بارگذاری‌شروع‌مجموعه‌ستون بارگذاری‌شروع‌پایان \
-بارگذاری‌شماره بارگذاری‌شماره‌زیرصفحه بارگذاری‌شماره‌سر بارگذاری‌شماره‌صفحه بارگذاری‌شماره‌گذاری \
-بارگذاری‌شماره‌گذاریها بارگذاری‌شماره‌گذاری‌صفحه بارگذاری‌شماره‌گذاری‌پاراگراف بارگذاری‌شماره‌‌گذاری‌خط بارگذاری‌شناور \
-بارگذاری‌شناورها بارگذاری‌شکافتن‌شناورها بارگذاری‌شکلهای‌خارجی بارگذاری‌طرح بارگذاری‌طرح‌بندی \
-بارگذاری‌عرض‌خط بارگذاری‌فاصله‌بین‌خط بارگذاری‌فرمولها بارگذاری‌فضای‌سفید بارگذاری‌فضا‌گذاری \
-بارگذاری‌قالبی بارگذاری‌قلم‌متن بارگذاری‌لوح بارگذاری‌لیست بارگذاری‌لیست‌ترکیبی \
-بارگذاری‌لیست‌مرجع بارگذاری‌مترادفها بارگذاری‌متغیر‌متن بارگذاری‌متن بارگذاری‌متنهای‌بالا \
-بارگذاری‌متن‌سر بارگذاری‌متن‌سربرگ بارگذاری‌متن‌قالبی بارگذاری‌متن‌متنها بارگذاری‌متن‌پانوشت \
-بارگذاری‌متن‌پایین بارگذاری‌مجموعه‌ستون بارگذاری‌مجموعه‌نماد بارگذاری‌محیط‌قلم‌متن بارگذاری‌منوی‌پانل \
-بارگذاری‌مکان‌متن بارگذاری‌مکان‌گذاری بارگذاری‌میدان بارگذاری‌میدانها بارگذاری‌میله‌تطابق \
-بارگذاری‌میله‌زیر بارگذاری‌میله‌پانل بارگذاری‌نسخه‌ها بارگذاری‌نشانه‌شکستن بارگذاری‌نشانه‌گذاری \
-بارگذاری‌نشرها بارگذاری‌نقل بارگذاری‌پاراگرافها بارگذاری‌پانل بارگذاری‌پانوشتها \
-بارگذاری‌پایین بارگذاری‌پرده‌ها بارگذاری‌پرده‌پانل بارگذاری‌پروفایلها بارگذاری‌پرکردن‌خطها \
-بارگذاری‌پس‌زمینه بارگذاری‌پس‌زمینه‌ها بارگذاری‌چیدن بارگذاری‌گذارصفحه بارگذاری‌گروههای‌آیتم \
-بارگذاری‌گروه‌آیتم بازنشانی بازنشانی‌شماره بازنشانی‌متن بازنشانی‌نشانه‌گذاری \
-باگذاری‌متن‌برچسب بدون‌بعد بدون‌بلوکهای‌بیشتر بدون‌تورفتگی بدون‌خط‌بالاوپایین \
-بدون‌خط‌سروته‌برگ بدون‌فایلهای‌بیشتر بدون‌فضا بدون‌فضای‌سفید بدون‌لیست \
-بدون‌نشانه‌گذاری برنامه بروبه بروبه‌جعبه بروبه‌صفحه \
-بروپایین برچسب برچسبها بعد بلند \
-بلوکهای‌پردازش بلوکها‌پنهان بنویس‌بین‌لیست بنویس‌درثبت بنویس‌درلیست‌مرجع \
-بنویس‌در‌لیست تاریخ تاریخ‌جاری تاریخ‌رجوع تایپ \
-تایپ‌بافر تایپ‌پرونده تب ترجمه تطابق \
-تعریف تعریف‌آرایش تعریف‌آرم تعریف‌الگوی‌جدول تعریف‌اندازه‌برگ \
-تعریف‌بافر تعریف‌بخش تعریف‌برنامه تعریف‌برچسب تعریف‌بلوک \
-تعریف‌بلوک‌بخش تعریف‌تایپ تعریف‌تایپ‌کردن تعریف‌تبدیل تعریف‌ترتیب \
-تعریف‌ترکیب تعریف‌تنظیم‌ریاضی تعریف‌توده‌میدان تعریف‌ثبت تعریف‌جانشانی \
-تعریف‌جدول‌بندی تعریف‌جعبه‌‌افقی تعریف‌حرف تعریف‌خالی تعریف‌خروجی \
-تعریف‌خط‌حائل تعریف‌درون‌حاشیه تعریف‌رنگ تعریف‌زیرمیدان تعریف‌سبک \
-تعریف‌سبک‌قلم تعریف‌سر تعریف‌شرح تعریف‌شروع‌پایان تعریف‌شماره‌بندی \
-تعریف‌شمایل‌مرجع تعریف‌شناور تعریف‌شکستن‌ستون تعریف‌شکست‌صفحه تعریف‌طرح‌بندی \
-تعریف‌فرمان تعریف‌قالبی تعریف‌قلم تعریف‌قلم‌خام تعریف‌قلم‌متن \
-تعریف‌لایه تعریف‌لهجه تعریف‌لوح تعریف‌لیست تعریف‌لیست‌ترکیبی \
-تعریف‌لیست‌مرجع تعریف‌مترادفها تعریف‌مترادف‌قلم تعریف‌متغیرمتن تعریف‌متن \
-تعریف‌متن‌قالبی تعریف‌مجموعه‌ستون تعریف‌محیط‌قلم‌بدنه تعریف‌مرجع تعریف‌منوی‌پانل \
-تعریف‌مکان‌متن تعریف‌میدان تعریف‌میدان‌اصلی تعریف‌نسخه تعریف‌نشانه‌گذاری \
-تعریف‌نماد تعریف‌نمادشکل تعریف‌پاراگرافها تعریف‌پروفایل تعریف‌پوشش \
-تعریف‌گروه‌آیتم تعریف‌گروه‌رنگ تعیین‌شماره تعیین‌شماره‌سر تعیین‌متغیر‌متن \
-تعیین‌محتوای‌متن تعیین‌مشخصات‌ثبت تعیین‌مشخصات‌لیست تغییربه‌قلم‌بدنه تغییربه‌قلم‌خام \
-تنظیم‌راست تنظیم‌طرح‌بندی تنظیم‌وسط توجه تورفتگی \
-توری تولید تک ثبت‌زوج ثبت‌کامل \
-جداسازی‌نشانه‌گذاری حاش حرف حرفها حفظ‌بلوکها \
-حقیقت خالی خطهای‌سیاه خطهای‌نازک خطها‌خالی \
-خط‌حاشیه خط‌سیاه خط‌متن خط‌مو خط‌نازک \
-خ‌ا خ‌ع در درج‌آرمها درج‌ثبت \
-درج‌خط درج‌درخط درج‌درخطها درج‌درمتن درج‌درمیدان \
-درج‌در‌بالای‌یکدیگر درج‌در‌توری درج‌راهنما درج‌زیرفرمول درج‌شماره‌سر \
-درج‌شماره‌صفحه درج‌شناور درج‌فرمول درج‌لیست درج‌لیست‌خام \
-درج‌لیست‌مختلط درج‌لیست‌مرجع درج‌متغیرمتن درج‌متن‌سر درج‌پانوشتها \
-درج‌پانوشتهای‌موضعی درج‌چوب‌خط درج‌کنار‌به‌کنار درحاشیه درحاشیه‌دیگر \
-درحاشیه‌راست درحاشیه‌چپ درخارجی درخط درداخلی \
-درراست درصفحه درقالبی درلبه‌راست درلبه‌چپ \
-درمورد درون درپر درچپ دریافت‌بافر \
-دریافت‌شماره دریافت‌نشانه دوران دکمه دکمه‌منو \
-دکمه‌پانل رج رجوع رنگ رنگ‌خاکستری \
-روزهفته ریاضی زبان زبان‌اصلی ستون \
-ستون‌امتحان سر سرپوش‌کوچک‌نه شروع‌آرایش شروع‌آرایش‌ستون \
-شروع‌باریکتر شروع‌بازبینی شروع‌بلوک‌حاشیه شروع‌ترکیب شروع‌تصحیح‌خط \
-شروع‌تطابق شروع‌تنظیم شروع‌تولید شروع‌جدول شروع‌جدولها \
-شروع‌خط شروع‌خطها شروع‌خط‌حاشیه شروع‌خط‌متن شروع‌رنگ \
-شروع‌ستونها شروع‌سراسری شروع‌شماره‌گذاری‌خط شروع‌شکل شروع‌غیر‌فشرده \
-شروع‌فشرده شروع‌متن شروع‌مجموعه‌ستون شروع‌مجموعه‌نماد شروع‌محیط \
-شروع‌مخالف شروع‌موضعی شروع‌مولفه شروع‌مکان‌گذاری شروع‌نسخه \
-شروع‌نقل‌قول شروع‌نوشتار شروع‌پانوشتهای‌موضعی شروع‌پروفایل شروع‌پروژه \
-شروع‌پس‌زمینه شروع‌پوشش شروع‌کد شماره‌افزایش شماره‌زیرصفحه \
-شماره‌زیرفرمول شماره‌سر شماره‌سرجاری شماره‌صفحه شماره‌صفحه‌کامل \
-شماره‌فرمول شماره‌مبدل شماره‌ها شماره‌کاهش شماره‌کل‌صفحه‌ها \
-شکافتن‌شناور شکل‌خارجی صفحه صفحه‌تست صفحه‌زوج \
-صفحه‌پردازش طول‌لیست عبوربلوکها عرض‌آرایش عرض‌برگ \
-عرض‌حاشیه عرض‌حاشیه‌خارجی عرض‌حاشیه‌داخلی عرض‌حاشیه‌راست عرض‌حاشیه‌چپ \
-عرض‌خط عرض‌لبه عرض‌لبه‌خارجی عرض‌لبه‌داخلی عرض‌لبه‌راست \
-عرض‌لبه‌چپ عرض‌لیست عرض‌متن عمق‌صفحه عنوان‌حاشیه \
-فاصله‌بالا فاصله‌ته‌برگ فاصله‌حاشیه فاصله‌حاشیه‌خارجی فاصله‌حاشیه‌داخلی \
-فاصله‌حاشیه‌راست فاصله‌حاشیه‌چپ فاصله‌سربرگ فاصله‌لبه فاصله‌لبه‌خارجی \
-فاصله‌لبه‌داخلی فاصله‌لبه‌راست فاصله‌لبه‌چپ فاصله‌پایین فاصله‌پشت \
-فشرده فضا فضاهای‌ثابت فضای‌بالا فضای‌برش \
-فضای‌ثابت فضای‌سفید فضای‌سفیدصحیح فضای‌پایین فوری‌به‌لیست \
-فوری‌بین‌لیست قالبی لوح‌مقایسه ماه متغیر متن \
-متن‌برچسب متن‌حاشیه متن‌سر متن‌پانوشت محیط \
-مراجعه مرجع مرجع‌صفحه مرجع‌متن مرحله‌سر \
-مسکن معنی‌واحد مقایسه‌گروه‌رنگ مقدارخاکستری مقداررنگ \
-مقیاس منفی منوی‌پانل مولفه مکان \
-مکان‌متن میدان میدانهای‌گزارش میدان‌شبیه‌سازی میدان‌پشته \
-میدان‌کپی میله‌تطابق میله‌رنگ میله‌پانل ناشناس \
-نام‌ماکرو نسخه نسخه‌نشانه نشانه‌گذاری نشانه‌گذاری‌زوج \
-نشر نصب‌زبان نقطه‌ها نقل نقل‌قول \
-نم نماد نمادسر نمادلیست نمایش‌آرایش \
-نمایش‌بارگذاریها نمایش‌بستها نمایش‌توری نمایش‌رنگ نمایش‌شکلهای‌خارجی \
-نمایش‌طرح‌بندی نمایش‌قالب نمایش‌قلم‌بدنه نمایش‌لوح نمایش‌مجموعه‌علامت \
-نمایش‌محیط‌قلم‌بدنه نمایش‌میدانها نمایش‌چاپ نمایش‌گروه‌رنگ نوشتارزوج \
-هدایت پا پابا پانوشت پایان‌آرایش \
-پایان‌آرایش‌ستون پایان‌بازبینی پایان‌بلوک‌حاشیه پایان‌ترکیب پایان‌تصحیح‌خط \
-پایان‌تطابق پایان‌تنظیم پایان‌تولید پایان‌جدول پایان‌جدولها \
-پایان‌خط پایان‌خطها پایان‌خط‌حاشیه پایان‌خط‌متن پایان‌رنگ \
-پایان‌ستونها پایان‌سراسری پایان‌شماره‌گذاری‌خط پایان‌غیرفشرده پایان‌فشرده \
-پایان‌متن پایان‌مجموعه‌ستون پایان‌محیط پایان‌مخالف پایان‌موضعی \
-پایان‌مولفه پایان‌مکان‌گذاری پایان‌نازکتر پایان‌نسخه پایان‌نقل‌قول \
-پایان‌نوشتار پایان‌پانوشتهای‌موضعی پایان‌پروفایل پایان‌پروژه پایان‌پس‌زمینه \
-پایان‌پوشش پایان‌کد پایین پرده پروژه \
-پرکردن‌میدان پس‌زمینه پیروی‌نسخه پیروی‌نسخه‌پروفایل پیروی‌پروفایل \
-چاپ‌ارتفاع‌برگ چاپ‌عرض‌برگ چوبخط چپ‌چین کاغذزوج \
-کسر کشیده کلمه‌حاشیه کلمه‌راست گیره \
-یادداشت یک‌جا یک‌خط
+بارگذاری‌آرایش بارگذاری‌آیتمها بارگذاری‌ارجاع بارگذاری‌اندازه‌برگ بارگذاری‌باریکتر \
+بارگذاری‌بافر بارگذاری‌بالا بارگذاری‌بخش بارگذاری‌بردباری بارگذاری‌برنامه‌ها \
+بارگذاری‌برگ بارگذاری‌بست بارگذاری‌بلوک بارگذاری‌بلوکهای‌حاشیه بارگذاری‌بلوک‌بخش \
+بارگذاری‌تایپ بارگذاری‌تایپ‌کردن بارگذاری‌تب بارگذاری‌ترتیب بارگذاری‌ترکیب‌ها \
+بارگذاری‌تطابق بارگذاری‌تعریف‌پانوشت بارگذاری‌تنظیم بارگذاری‌تنظیم‌ریاضی بارگذاری‌ته‌برگ \
+بارگذاری‌تورفتگی بارگذاری‌توضیح بارگذاری‌توضیح‌صفحه بارگذاری‌ثبت بارگذاری‌جانشانی \
+بارگذاری‌جدولها بارگذاری‌جدول‌بندی بارگذاری‌خالی بارگذاری‌خروجی بارگذاری‌خط \
+بارگذاری‌خطها بارگذاری‌خطهای‌حاشیه بارگذاری‌خطهای‌سیاه بارگذاری‌خطهای‌متن بارگذاری‌خطهای‌مجموعه‌ستون \
+بارگذاری‌خطها‌ی‌نازک بارگذاری‌درج‌درخطها بارگذاری‌درج‌مخالف بارگذاری‌درون‌حاشیه بارگذاری‌دوران \
+بارگذاری‌دکمه‌ها بارگذاری‌راهنما بارگذاری‌رنگ بارگذاری‌رنگها بارگذاری‌زبان \
+بارگذاری‌ستونها بارگذاری‌سر بارگذاری‌سربرگ بارگذاری‌سرها بارگذاری‌سیستم \
+بارگذاری‌شرح بارگذاری‌شرحها بارگذاری‌شروع‌مجموعه‌ستون بارگذاری‌شروع‌پایان بارگذاری‌شماره \
+بارگذاری‌شماره‌زیرصفحه بارگذاری‌شماره‌سر بارگذاری‌شماره‌صفحه بارگذاری‌شماره‌گذاری بارگذاری‌شماره‌گذاریها \
+بارگذاری‌شماره‌گذاری‌صفحه بارگذاری‌شماره‌گذاری‌پاراگراف بارگذاری‌شماره‌‌گذاری‌خط بارگذاری‌شناور بارگذاری‌شناورها \
+بارگذاری‌شکافتن‌شناورها بارگذاری‌شکلهای‌خارجی بارگذاری‌طرح بارگذاری‌طرح‌بندی بارگذاری‌عرض‌خط \
+بارگذاری‌فاصله‌بین‌خط بارگذاری‌فرمولها بارگذاری‌فضای‌سفید بارگذاری‌فضا‌گذاری بارگذاری‌قالبی \
+بارگذاری‌قلم‌متن بارگذاری‌لوح بارگذاری‌لیست بارگذاری‌لیست‌ترکیبی بارگذاری‌لیست‌مرجع \
+بارگذاری‌مترادفها بارگذاری‌متغیر‌متن بارگذاری‌متن بارگذاری‌متنهای‌بالا بارگذاری‌متن‌سر \
+بارگذاری‌متن‌سربرگ بارگذاری‌متن‌قالبی بارگذاری‌متن‌متنها بارگذاری‌متن‌پانوشت بارگذاری‌متن‌پایین \
+بارگذاری‌مجموعه‌ستون بارگذاری‌مجموعه‌نماد بارگذاری‌محیط‌قلم‌متن بارگذاری‌منوی‌پانل بارگذاری‌مکان‌متن \
+بارگذاری‌مکان‌گذاری بارگذاری‌میدان بارگذاری‌میدانها بارگذاری‌میله‌تطابق بارگذاری‌میله‌زیر \
+بارگذاری‌میله‌پانل بارگذاری‌نسخه‌ها بارگذاری‌نشانه‌شکستن بارگذاری‌نشانه‌گذاری بارگذاری‌نشرها \
+بارگذاری‌نقل بارگذاری‌پاراگرافها بارگذاری‌پانل بارگذاری‌پانوشتها بارگذاری‌پایین \
+بارگذاری‌پرده‌ها بارگذاری‌پرده‌پانل بارگذاری‌پروفایلها بارگذاری‌پرکردن‌خطها بارگذاری‌پس‌زمینه \
+بارگذاری‌پس‌زمینه‌ها بارگذاری‌چیدن بارگذاری‌گذارصفحه بارگذاری‌گروههای‌آیتم بارگذاری‌گروه‌آیتم \
+بازنشانی بازنشانی‌شماره بازنشانی‌متن بازنشانی‌نشانه‌گذاری باگذاری‌متن‌برچسب \
+بدون‌بعد بدون‌بلوکهای‌بیشتر بدون‌تورفتگی بدون‌خط‌بالاوپایین بدون‌خط‌سروته‌برگ \
+بدون‌فایلهای‌بیشتر بدون‌فضا بدون‌فضای‌سفید بدون‌لیست بدون‌نشانه‌گذاری \
+برنامه بروبه بروبه‌جعبه بروبه‌صفحه بروپایین \
+برچسب برچسبها بعد بلند بلوکهای‌پردازش \
+بلوکها‌پنهان بنویس‌بین‌لیست بنویس‌درثبت بنویس‌درلیست‌مرجع بنویس‌در‌لیست \
+تاریخ تاریخ‌جاری تاریخ‌رجوع تایپ تایپ‌بافر \
+تایپ‌پرونده تب ترجمه تطابق تعریف \
+تعریف‌آرایش تعریف‌آرم تعریف‌الگوی‌جدول تعریف‌اندازه‌برگ تعریف‌بافر \
+تعریف‌بخش تعریف‌برنامه تعریف‌برچسب تعریف‌بلوک تعریف‌بلوک‌بخش \
+تعریف‌تایپ تعریف‌تایپ‌کردن تعریف‌تبدیل تعریف‌ترتیب تعریف‌ترکیب \
+تعریف‌تنظیم‌ریاضی تعریف‌توده‌میدان تعریف‌ثبت تعریف‌جانشانی تعریف‌جدول‌بندی \
+تعریف‌جعبه‌‌افقی تعریف‌حرف تعریف‌خالی تعریف‌خروجی تعریف‌خط‌حائل \
+تعریف‌درون‌حاشیه تعریف‌رنگ تعریف‌زیرمیدان تعریف‌سبک تعریف‌سبک‌قلم \
+تعریف‌سر تعریف‌شرح تعریف‌شروع‌پایان تعریف‌شماره‌بندی تعریف‌شمایل‌مرجع \
+تعریف‌شناور تعریف‌شکستن‌ستون تعریف‌شکست‌صفحه تعریف‌طرح‌بندی تعریف‌فرمان \
+تعریف‌قالبی تعریف‌قلم تعریف‌قلم‌خام تعریف‌قلم‌متن تعریف‌لایه \
+تعریف‌لهجه تعریف‌لوح تعریف‌لیست تعریف‌لیست‌ترکیبی تعریف‌لیست‌مرجع \
+تعریف‌مترادفها تعریف‌مترادف‌قلم تعریف‌متغیرمتن تعریف‌متن تعریف‌متن‌قالبی \
+تعریف‌مجموعه‌ستون تعریف‌محیط‌قلم‌بدنه تعریف‌مرجع تعریف‌منوی‌پانل تعریف‌مکان‌متن \
+تعریف‌میدان تعریف‌میدان‌اصلی تعریف‌نسخه تعریف‌نشانه‌گذاری تعریف‌نماد \
+تعریف‌نمادشکل تعریف‌پاراگرافها تعریف‌پروفایل تعریف‌پوشش تعریف‌گروه‌آیتم \
+تعریف‌گروه‌رنگ تعیین‌شماره تعیین‌شماره‌سر تعیین‌متغیر‌متن تعیین‌محتوای‌متن \
+تعیین‌مشخصات‌ثبت تعیین‌مشخصات‌لیست تغییربه‌قلم‌بدنه تغییربه‌قلم‌خام تنظیم‌راست \
+تنظیم‌طرح‌بندی تنظیم‌وسط توجه تورفتگی توری \
+تولید تک ثبت‌زوج ثبت‌کامل جداسازی‌نشانه‌گذاری \
+حاش حرف حرفها حفظ‌بلوکها حقیقت \
+خالی خطهای‌سیاه خطهای‌نازک خطها‌خالی خط‌حاشیه \
+خط‌سیاه خط‌متن خط‌مو خط‌نازک خ‌ا \
+خ‌ع در درج‌آرمها درج‌ثبت درج‌خط \
+درج‌درخط درج‌درخطها درج‌درمتن درج‌درمیدان درج‌در‌بالای‌یکدیگر \
+درج‌در‌توری درج‌راهنما درج‌زیرفرمول درج‌شماره‌سر درج‌شماره‌صفحه \
+درج‌شناور درج‌فرمول درج‌لیست درج‌لیست‌خام درج‌لیست‌مختلط \
+درج‌لیست‌مرجع درج‌متغیرمتن درج‌متن‌سر درج‌پانوشتها درج‌پانوشتهای‌موضعی \
+درج‌چوب‌خط درج‌کنار‌به‌کنار درحاشیه درحاشیه‌دیگر درحاشیه‌راست \
+درحاشیه‌چپ درخارجی درخط درداخلی درراست \
+درصفحه درقالبی درلبه‌راست درلبه‌چپ درمورد \
+درون درپر درچپ دریافت‌بافر دریافت‌شماره \
+دریافت‌نشانه دوران دکمه دکمه‌منو دکمه‌پانل \
+رج رجوع رنگ رنگ‌خاکستری روزهفته \
+ریاضی زبان زبان‌اصلی ستون ستون‌امتحان \
+سر سرپوش‌کوچک‌نه شروع‌آرایش شروع‌آرایش‌ستون شروع‌باریکتر \
+شروع‌بازبینی شروع‌بلوک‌حاشیه شروع‌ترکیب شروع‌تصحیح‌خط شروع‌تطابق \
+شروع‌تنظیم شروع‌تولید شروع‌جدول شروع‌جدولها شروع‌خط \
+شروع‌خطها شروع‌خط‌حاشیه شروع‌خط‌متن شروع‌رنگ شروع‌ستونها \
+شروع‌سراسری شروع‌شماره‌گذاری‌خط شروع‌شکل شروع‌غیر‌فشرده شروع‌فشرده \
+شروع‌متن شروع‌مجموعه‌ستون شروع‌مجموعه‌نماد شروع‌محیط شروع‌مخالف \
+شروع‌موضعی شروع‌مولفه شروع‌مکان‌گذاری شروع‌نسخه شروع‌نقل‌قول \
+شروع‌نوشتار شروع‌پانوشتهای‌موضعی شروع‌پروفایل شروع‌پروژه شروع‌پس‌زمینه \
+شروع‌پوشش شروع‌کد شماره‌افزایش شماره‌زیرصفحه شماره‌زیرفرمول \
+شماره‌سر شماره‌سرجاری شماره‌صفحه شماره‌صفحه‌کامل شماره‌فرمول \
+شماره‌مبدل شماره‌ها شماره‌کاهش شماره‌کل‌صفحه‌ها شکافتن‌شناور \
+شکل‌خارجی صفحه صفحه‌تست صفحه‌زوج صفحه‌پردازش \
+طول‌لیست عبوربلوکها عرض‌آرایش عرض‌برگ عرض‌حاشیه \
+عرض‌حاشیه‌خارجی عرض‌حاشیه‌داخلی عرض‌حاشیه‌راست عرض‌حاشیه‌چپ عرض‌خط \
+عرض‌لبه عرض‌لبه‌خارجی عرض‌لبه‌داخلی عرض‌لبه‌راست عرض‌لبه‌چپ \
+عرض‌لیست عرض‌متن عمق‌صفحه عنوان‌حاشیه فاصله‌بالا \
+فاصله‌ته‌برگ فاصله‌حاشیه فاصله‌حاشیه‌خارجی فاصله‌حاشیه‌داخلی فاصله‌حاشیه‌راست \
+فاصله‌حاشیه‌چپ فاصله‌سربرگ فاصله‌لبه فاصله‌لبه‌خارجی فاصله‌لبه‌داخلی \
+فاصله‌لبه‌راست فاصله‌لبه‌چپ فاصله‌پایین فاصله‌پشت فشرده \
+فضا فضاهای‌ثابت فضای‌بالا فضای‌برش فضای‌ثابت \
+فضای‌سفید فضای‌سفیدصحیح فضای‌پایین فوری‌به‌لیست فوری‌بین‌لیست \
+قالبی لوح‌مقایسه ماه متغیر متن متن‌برچسب \
+متن‌حاشیه متن‌سر متن‌پانوشت محیط مراجعه \
+مرجع مرجع‌صفحه مرجع‌متن مرحله‌سر مسکن \
+معنی‌واحد مقایسه‌گروه‌رنگ مقدارخاکستری مقداررنگ مقیاس \
+منفی منوی‌پانل مولفه مکان مکان‌متن \
+میدان میدانهای‌گزارش میدان‌شبیه‌سازی میدان‌پشته میدان‌کپی \
+میله‌تطابق میله‌رنگ میله‌پانل ناشناس نام‌ماکرو \
+نسخه نسخه‌نشانه نشانه‌گذاری نشانه‌گذاری‌زوج نشر \
+نصب‌زبان نقطه‌ها نقل نقل‌قول نم \
+نماد نمادسر نمادلیست نمایش‌آرایش نمایش‌بارگذاریها \
+نمایش‌بستها نمایش‌توری نمایش‌رنگ نمایش‌شکلهای‌خارجی نمایش‌طرح‌بندی \
+نمایش‌قالب نمایش‌قلم‌بدنه نمایش‌لوح نمایش‌مجموعه‌علامت نمایش‌محیط‌قلم‌بدنه \
+نمایش‌میدانها نمایش‌چاپ نمایش‌گروه‌رنگ نوشتارزوج هدایت \
+پا پابا پانوشت پایان‌آرایش پایان‌آرایش‌ستون \
+پایان‌بازبینی پایان‌بلوک‌حاشیه پایان‌ترکیب پایان‌تصحیح‌خط پایان‌تطابق \
+پایان‌تنظیم پایان‌تولید پایان‌جدول پایان‌جدولها پایان‌خط \
+پایان‌خطها پایان‌خط‌حاشیه پایان‌خط‌متن پایان‌رنگ پایان‌ستونها \
+پایان‌سراسری پایان‌شماره‌گذاری‌خط پایان‌غیرفشرده پایان‌فشرده پایان‌متن \
+پایان‌مجموعه‌ستون پایان‌محیط پایان‌مخالف پایان‌موضعی پایان‌مولفه \
+پایان‌مکان‌گذاری پایان‌نازکتر پایان‌نسخه پایان‌نقل‌قول پایان‌نوشتار \
+پایان‌پانوشتهای‌موضعی پایان‌پروفایل پایان‌پروژه پایان‌پس‌زمینه پایان‌پوشش \
+پایان‌کد پایین پرده پروژه پرکردن‌میدان \
+پس‌زمینه پیروی‌نسخه پیروی‌نسخه‌پروفایل پیروی‌پروفایل چاپ‌ارتفاع‌برگ \
+چاپ‌عرض‌برگ چوبخط چپ‌چین کاغذزوج کسر \
+کشیده کلمه‌حاشیه کلمه‌راست گیره یادداشت \
+یک‌جا یک‌خط
keywordclass.context.ro=\
CAP CUVANT CUVINTE Cap \
@@ -1204,73 +1205,73 @@ roteste saripesteblocuri scala scriebuffer scrieinlista \
scrieinlistareferinte scrieinregistru scrieintreliste section seeregister \
selecteazablocuri selecteazahartie selecteazaversiune semncarte setarebarasincronizare \
setareitemization setarelimba setareoutput setarepozitie setaresincronizare \
-setari seteazaaliniat seteazaalinierea seteazaantet seteazaaranjareapag \
-seteazaaspect seteazabarainteractiune seteazablanc seteazabloc seteazablocsectiune \
-seteazablocurimarginale seteazabuffer seteazabutoane seteazacamp seteazacampuri \
-seteazaclipping seteazacoloane seteazacombinari seteazacomentariu seteazacomentariupagina \
-seteazaculoare seteazaculori seteazadefinireanotasubsol seteazadescriere seteazadimensiunihartie \
-seteazaecrane seteazaecraninteractiune seteazaelemente seteazaenumerare seteazafiguriexterne \
-seteazafloat seteazafloats seteazafonttext seteazaformulare seteazaformule \
-seteazafundal seteazafundaluri seteazagrosimelinie seteazaimpartireafloat seteazainconjurat \
-seteazaingust seteazainteractiunea seteazajos 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 seteazapozitietext seteazaprofile seteazaprograme \
-seteazapublicatii seteazareferinte seteazaregistru seteazarigla 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 seteazavariabilatext seteazaversiuni setnumber \
-settextcontent setupanswerarea setupcolumnset setupcolumnsetlines setupcolumnsetstart \
-setupfonthandling setupfontsynonym setupindentedtext setupinterlinespace2 setupitemgroup \
-setuplistalternative setupmathalignment setupnumber setuppaper setupplacement \
-setupstartstop setvariabilatext sim simbol sincronizeaza \
-sort spatiifixate spatiu spatiualb spatiufixat \
-spatiujos spatiuspate spatiusus startalignment startaliniere \
-startblocmarginal startbuffer startcitat startcodificare startcoloane \
-startcolumnmakeup startcolumns startcolumnset startcombinare startcombination \
-startcomment startcomponenta startcorectielinie startculoare startdescription \
-startdocument startenumeration startfact startfigura startfigure \
-startfloattext startformula startframedtext startfundal startglobal \
-starthiding startimpachetat startingust startitemgroup startlegend \
-startline startlinecorrection startlinenumbering startlines startlinie \
-startliniemargine startlinii startlocal startlocalenvironment startlocalfootnotes \
-startmakeup startmarginblock startmediu startmeniuinteractiune startnamemakeup \
-startnarrower startneimpachetat startnotesubsollocale startnumerotarelinii startopozit \
-startopposite startoverlay startoverview startparagraph startpositioning \
-startpostponing startpozitionare startprodus startprofil startprofile \
-startproiect startraster startregister startriglatext startsetsimboluri \
-startsincronizare startsymbolset startsynchronization starttabel starttabele \
-starttable starttables starttabulate starttext starttyping \
-startunpacked startversiune stivacampuri stopalignment stopaliniere \
-stopblobal stopblocmarginal stopbuffer stopcitat stopcodificare \
-stopcoloane stopcolumnmakeup stopcolumns stopcolumnset stopcombinare \
-stopcombination stopcomment stopcomponenta stopcorectielinie stopculoare \
-stopdescription stopdocument stopenumeration stopfact stopfigure \
-stopfloattext stopformula stopframedtext stopfundal stophiding \
-stopimpachetat stopingust stopitemgroup stoplegend stopline \
-stoplinecorrection stoplinenumbering stoplines stoplinie stopliniemargine \
-stoplinii stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup \
-stopmarginblock stopmediu stopmeniuinteractiune stopnamemakeup stopnarrower \
-stopneimpachetat stopnotesubsollocale stopnumerotarelinii stopopozit stopopposite \
-stopoverlay stopoverview stopparagraph stoppositioning stoppostponing \
-stoppozitionare stopprodus stopprofil stopprofile stopproiect \
-stopraster stopriglatext stopsincronizare stopsymbolset stopsynchronization \
-stoptabel stoptabele stoptable stoptables stoptabulate \
-stoptext stoptyping stopunpacked stopversiune sub \
-subject subpagenumber subsection subsubject subsubsection \
-subsubsubject synonym tab testcolumn testpage \
-tex texteticheta textmarginal texttitlu textumplere \
-title titlu titlumarginal tooltip traduce \
-trecilafontraw trecilafonttext txt typ type \
-typefile underbar underbars undeva urmeazaprofil \
-urmeazaversiune urmeazaversiuneprofil useXMLfilter usedirectory usetypescript \
-usetypescriptfile valoareculoare valoaregri variabilatext versiune \
-vl zidinsaptamana
+seteazaaliniat seteazaalinierea seteazaantet seteazaaranjareapag seteazaaspect \
+seteazabarainteractiune seteazablanc seteazabloc seteazablocsectiune seteazablocurimarginale \
+seteazabuffer seteazabutoane seteazacamp seteazacampuri seteazaclipping \
+seteazacoloane seteazacombinari seteazacomentariu seteazacomentariupagina seteazaculoare \
+seteazaculori seteazadefinireanotasubsol seteazadescriere seteazadimensiunihartie seteazaecrane \
+seteazaecraninteractiune seteazaelemente seteazaenumerare seteazafiguriexterne seteazafloat \
+seteazafloats seteazafonttext seteazaformulare seteazaformule seteazafundal \
+seteazafundaluri seteazagrosimelinie seteazaimpartireafloat seteazainconjurat seteazaingust \
+seteazainteractiunea seteazajos 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 seteazapozitietext seteazaprofile seteazaprograme seteazapublicatii \
+seteazareferinte seteazaregistru seteazarigla 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 seteazavariabilatext seteazaversiuni setnumber settextcontent \
+setupanswerarea setupcolumnset setupcolumnsetlines setupcolumnsetstart setupfonthandling \
+setupfontsynonym setupindentedtext setupinterlinespace2 setupitemgroup setuplistalternative \
+setupmathalignment setupnumber setuppaper setupplacement setupstartstop \
+setvariabilatext sim simbol sincronizeaza sort \
+spatiifixate spatiu spatiualb spatiufixat spatiujos \
+spatiuspate spatiusus startalignment startaliniere startblocmarginal \
+startbuffer startcitat startcodificare startcoloane startcolumnmakeup \
+startcolumns startcolumnset startcombinare startcombination startcomment \
+startcomponenta startcorectielinie startculoare startdescription startdocument \
+startenumeration startfact startfigura startfigure startfloattext \
+startformula startframedtext startfundal startglobal starthiding \
+startimpachetat startingust startitemgroup startlegend startline \
+startlinecorrection startlinenumbering startlines startlinie startliniemargine \
+startlinii startlocal startlocalenvironment startlocalfootnotes startmakeup \
+startmarginblock startmediu startmeniuinteractiune startnamemakeup startnarrower \
+startneimpachetat startnotesubsollocale startnumerotarelinii startopozit startopposite \
+startoverlay startoverview startparagraph startpositioning startpostponing \
+startpozitionare startprodus startprofil startprofile startproiect \
+startraster startregister startriglatext startsetsimboluri startsincronizare \
+startsymbolset startsynchronization starttabel starttabele starttable \
+starttables starttabulate starttext starttyping startunpacked \
+startversiune stivacampuri stopalignment stopaliniere stopblobal \
+stopblocmarginal stopbuffer stopcitat stopcodificare stopcoloane \
+stopcolumnmakeup stopcolumns stopcolumnset stopcombinare stopcombination \
+stopcomment stopcomponenta stopcorectielinie stopculoare stopdescription \
+stopdocument stopenumeration stopfact stopfigure stopfloattext \
+stopformula stopframedtext stopfundal stophiding stopimpachetat \
+stopingust stopitemgroup stoplegend stopline stoplinecorrection \
+stoplinenumbering stoplines stoplinie stopliniemargine stoplinii \
+stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginblock \
+stopmediu stopmeniuinteractiune stopnamemakeup stopnarrower stopneimpachetat \
+stopnotesubsollocale stopnumerotarelinii stopopozit stopopposite stopoverlay \
+stopoverview stopparagraph stoppositioning stoppostponing stoppozitionare \
+stopprodus stopprofil stopprofile stopproiect stopraster \
+stopriglatext stopsincronizare stopsymbolset stopsynchronization stoptabel \
+stoptabele stoptable stoptables stoptabulate stoptext \
+stoptyping stopunpacked stopversiune sub subject \
+subpagenumber subsection subsubject subsubsection subsubsubject \
+synonym tab testcolumn testpage tex \
+texteticheta textmarginal texttitlu textumplere title \
+titlu titlumarginal tooltip traduce trecilafontraw \
+trecilafonttext txt typ type typefile \
+underbar underbars undeva urmeazaprofil urmeazaversiune \
+urmeazaversiuneprofil useXMLfilter usedirectory usetypescript usetypescriptfile \
+valoareculoare valoaregri variabilatext versiune vl \
+zidinsaptamana
diff --git a/Master/texmf-dist/context/data/scite/context/scite-context-data-metafun.properties b/Master/texmf-dist/context/data/scite/context/scite-context-data-metafun.properties
index db66f9ec32c..977ca9dfd4b 100644
--- a/Master/texmf-dist/context/data/scite/context/scite-context-data-metafun.properties
+++ b/Master/texmf-dist/context/data/scite/context/scite-context-data-metafun.properties
@@ -1,52 +1,53 @@
keywordclass.metafun.commands=\
-sqr log ln exp \
-inv pow pi radian tand \
-cotd sin cos tan cot \
-atan asin acos invsin invcos \
-invtan acosh asinh sinh cosh \
-paired tripled unitcircle fulldiamond unitdiamond \
-fullsquare llcircle lrcircle urcircle ulcircle \
-tcircle bcircle lcircle rcircle lltriangle \
-lrtriangle urtriangle ultriangle uptriangle downtriangle \
-lefttriangle righttriangle triangle smoothed cornered \
-superellipsed randomized squeezed enlonged shortened \
-punked curved unspiked simplified blownup \
-stretched enlarged leftenlarged topenlarged rightenlarged \
-bottomenlarged crossed laddered randomshifted interpolated \
-paralleled cutends peepholed llenlarged lrenlarged \
-urenlarged ulenlarged llmoved lrmoved urmoved \
-ulmoved rightarrow leftarrow centerarrow boundingbox \
-innerboundingbox outerboundingbox pushboundingbox popboundingbox bottomboundary \
-leftboundary topboundary rightboundary xsized ysized \
-xysized sized xyscaled intersection_point intersection_found \
-penpoint bbwidth bbheight withshade withlinearshading \
-withcircularshading withfromshadecolor withtoshadecolor withshading shadedinto \
-withcircularshade withlinearshade cmyk spotcolor multitonecolor \
+transparency sqr log ln \
+exp inv pow pi radian \
+tand cotd sin cos tan \
+cot atan asin acos invsin \
+invcos invtan acosh asinh sinh \
+cosh zmod paired tripled unitcircle \
+fulldiamond unitdiamond fullsquare llcircle lrcircle \
+urcircle ulcircle tcircle bcircle lcircle \
+rcircle lltriangle lrtriangle urtriangle ultriangle \
+uptriangle downtriangle lefttriangle righttriangle triangle \
+smoothed cornered superellipsed randomized squeezed \
+enlonged shortened punked curved unspiked \
+simplified blownup stretched enlarged leftenlarged \
+topenlarged rightenlarged bottomenlarged crossed laddered \
+randomshifted interpolated paralleled cutends peepholed \
+llenlarged lrenlarged urenlarged ulenlarged llmoved \
+lrmoved urmoved ulmoved rightarrow leftarrow \
+centerarrow boundingbox innerboundingbox outerboundingbox pushboundingbox \
+popboundingbox bottomboundary leftboundary topboundary rightboundary \
+xsized ysized xysized sized xyscaled \
+intersection_point intersection_found penpoint bbwidth bbheight \
+withshade withcircularshade withlinearshade defineshade shaded \
+shadedinto withshadecolors withshadedomain withshademethod withshadefactor \
+withshadevector withshadecenter cmyk spotcolor multitonecolor \
namedcolor drawfill undrawfill inverted uncolored \
softened grayed greyed onlayer along \
-graphictext loadfigure externalfigure withmask figure \
-register bitmapimage colordecimals ddecimal dddecimal \
+graphictext loadfigure externalfigure figure register \
+withmask bitmapimage colordecimals ddecimal dddecimal \
ddddecimal textext thetextext rawtextext textextoffset \
verbatim thelabel label autoalign transparent \
withtransparency property properties withproperties asgroup \
-infont set_linear_vector linear_shade define_linear_shade define_circular_linear_shade \
-define_sampled_linear_shade set_circular_vector circular_shade define_circular_shade define_circular_linear_shade \
-define_sampled_circular_shade space CRLF grayscale greyscale \
-withgray withgrey colorpart readfile clearxy \
-unitvector center epsed anchored originpath \
-infinite break xstretched ystretched snapped \
-pathconnectors function constructedpath constructedpairs punkedfunction \
-curvedfunction tightfunction punkedpath curvedpath tightpath \
-punkedpairs curvedpairs tightpairs evenly oddly \
-condition pushcurrentpicture popcurrentpicture arrowpath tensecircle \
-roundedsquare colortype whitecolor blackcolor normalfill \
+infont space crlf dquote percent \
+SPACE CRLF DQUOTE PERCENT grayscale \
+greyscale withgray withgrey colorpart readfile \
+clearxy unitvector center epsed anchored \
+originpath infinite break xstretched ystretched \
+snapped pathconnectors function constructedfunction constructedpath \
+constructedpairs straightfunction straightpath straightpairs curvedfunction \
+curvedpath curvedpairs evenly oddly condition \
+pushcurrentpicture popcurrentpicture arrowpath tensecircle roundedsquare \
+colortype whitecolor blackcolor basiccolors normalfill \
normaldraw visualizepaths naturalizepaths drawboundary drawwholepath \
visualizeddraw visualizedfill draworigin drawboundingbox drawpath \
drawpoint drawpoints drawcontrolpoints drawcontrollines drawpointlabels \
drawlineoptions drawpointoptions drawcontroloptions drawlabeloptions draworiginoptions \
drawboundoptions drawpathoptions resetdrawoptions undashed decorated \
redecorated undecorated passvariable passarrayvariable tostring \
-format formatted startpassingvariable stoppassingvariable
+format formatted startpassingvariable stoppassingvariable eofill \
+eoclip area
keywordclass.metafun.internals=\
nocolormodel greycolormodel graycolormodel rgbcolormodel \
diff --git a/Master/texmf-dist/context/data/scite/context/scite-context-data-metapost.properties b/Master/texmf-dist/context/data/scite/context/scite-context-data-metapost.properties
index afa6e894ad3..59014623a22 100644
--- a/Master/texmf-dist/context/data/scite/context/scite-context-data-metapost.properties
+++ b/Master/texmf-dist/context/data/scite/context/scite-context-data-metapost.properties
@@ -1,41 +1,66 @@
keywordclass.metapost.commands=\
-beginfig endfig beginglyph endglyph \
-charscale rotatedaround reflectedabout arrowhead currentpen \
-currentpicture cuttings defaultfont extra_beginfig extra_endfig \
-ditto EOF down evenly fullcircle \
-halfcircle identity in left origin \
-pensquare quartercircle right unitsquare up \
-withdots abs bbox ceiling center \
-cutafter cutbefore dir directionpoint div \
-dotprod intersectionpoint inverse mod round \
-unitvector whatever cutdraw draw drawarrow \
-drawdblarrow fill filldraw drawdot loggingall \
-interact tracingall tracingnone pickup undraw \
-unfill unfilldraw buildcycle dashpattern decr \
-dotlabel dotlabels drawoptions incr label \
-labels max min thelabel z \
-beginchar blacker capsule_end change_width define_blacker_pixels \
-define_corrected_pixels define_good_x_pixels define_good_y_pixels define_horizontal_corrected_pixels define_pixels \
-define_whole_blacker_pixels define_whole_pixels define_whole_vertical_blacker_pixels define_whole_vertical_pixels endchar \
-extra_beginchar extra_endchar extra_setup font_coding_scheme clearxy \
-clearit clearpen shipit font_extra_space exitunless \
-relax hide gobble gobbled stop \
-blankpicture counterclockwise tensepath takepower direction \
-softjoin makelabel rotatedabout flex superellipse \
-erase image nullpen savepen clearpen \
-penpos penlabels range numtok thru \
-z laboff bye red green \
-blue cyan magenta yellow black \
-white background graypart graycolor mm \
-pt dd bp cm pc \
-cc in triplet quadruplet
+upto downto beginfig endfig \
+beginglyph endglyph rotatedaround reflectedabout arrowhead \
+currentpen currentpicture cuttings defaultfont extra_beginfig \
+extra_endfig ditto EOF down evenly \
+fullcircle halfcircle identity in left \
+pensquare penrazor penspec origin quartercircle \
+right unitsquare up withdots abs \
+bbox ceiling center cutafter cutbefore \
+dir directionpoint div dotprod intersectionpoint \
+inverse mod round unitvector whatever \
+cutdraw draw drawarrow drawdblarrow fill \
+filldraw drawdot loggingall interact tracingall \
+tracingnone pickup undraw unfill unfilldraw \
+buildcycle dashpattern decr dotlabel dotlabels \
+drawoptions incr label labels max \
+min thelabel z beginchar blacker \
+capsule_end change_width define_blacker_pixels define_corrected_pixels define_good_x_pixels \
+define_good_y_pixels define_horizontal_corrected_pixels define_pixels define_whole_blacker_pixels define_whole_pixels \
+define_whole_vertical_blacker_pixels define_whole_vertical_pixels endchar extra_beginchar extra_endchar \
+extra_setup font_coding_scheme clearxy clearit clearpen \
+shipit font_extra_space exitunless relax hide \
+gobble gobbled stop blankpicture counterclockwise \
+tensepath takepower direction softjoin makelabel \
+rotatedabout flex superellipse image nullpen \
+savepen clearpen penpos penlabels range \
+thru z laboff bye red \
+green blue cyan magenta yellow \
+black white background mm pt \
+dd bp cm pc cc \
+in triplet quadruplet
+
+keywordclass.metapost.disabled=\
+verbatimtex troffmode
keywordclass.metapost.internals=\
mitered rounded beveled butt \
squared eps epsilon infinity bboxmargin \
ahlength ahangle labeloffset dotlabeldiam defaultpen \
-defaultscale join_radius pen_lft pen_rt pen_top \
-pen_bot
+defaultscale join_radius charscale pen_lft pen_rt \
+pen_top pen_bot
+
+keywordclass.metapost.metafont=\
+autorounding beginchar blacker boundarychar \
+capsule_def capsule_end change_width chardp chardx \
+chardy charexists charext charht charic \
+charlist charwd cull cullit currenttransform \
+currentwindow define_blacker_pixels define_corrected_pixels define_good_x_pixels define_good_y_pixels \
+define_horizontal_corrected_pixels define_pixels define_whole_blacker_pixels define_whole_pixels define_whole_vertical_blacker_pixels \
+define_whole_vertical_pixels designsize display displaying endchar \
+extensible extra_beginchar extra_endchar extra_setup fillin \
+font_coding_scheme font_extra_space font_identifier font_normal_shrink font_normal_space \
+font_normal_stretch font_quad font_size font_slant font_x_height \
+fontdimen fontmaking gfcorners granularity grayfont \
+headerbyte hppp hround imagerules italcorr \
+kern labelfont ligtable lowres_fix makebox \
+makegrid maketicks mode_def mode_setup nodisplays \
+notransforms numspecial o_correction openit openwindow \
+pixels_per_inch proofing proofoffset proofrule proofrulethickness \
+rulepen screenchars screenrule screenstrokes screen_cols \
+screen_rows showit slantfont smode smoothing \
+titlefont totalweight tracingedges tracingpens turningcheck \
+unitpixel vppp vround xoffset yoffset
keywordclass.metapost.primitives=\
charcode day linecap linejoin \
@@ -68,34 +93,34 @@ primarydef secondarydef tertiarydef randomseed also \
contour doublepath withcolor withcmykcolor withpen \
dashed if else elseif fi \
for endfor forever exitif within \
-forsuffixes downto upto step until \
-charlist extensible fontdimen headerbyte kern \
-ligtable boundarychar chardp charext charht \
-charic charwd designsize fontmaking charexists \
-cullit currenttransform gfcorners grayfont hround \
-imagerules lowres_fix nodisplays notransforms openit \
-displaying currentwindow screen_rows screen_cols pixels_per_inch \
-cull display openwindow numspecial totalweight \
-autorounding fillin proofing tracingpens xoffset \
-chardx granularity smoothing turningcheck yoffset \
-chardy hppp tracingedges vppp extra_beginfig \
-extra_endfig mpxbreak endinput message delimiters \
-turningnumber errmessage readstring scantokens end \
-outer inner write to readfrom \
-withprescript withpostscript top bot lft \
-rt ulft urt llft lrt \
-redpart greenpart bluepart cyanpart magentapart \
-yellowpart blackpart greypart prescriptpart postscriptpart \
-rgbcolor cmykcolor greycolor graycolor colormodel \
-graypart dashpart penpart stroked filled \
-textual clipped bounded pathpart expandafter \
-minute hour outputformat outputtemplate filenametemplate \
-fontmapfile fontmapline fontpart fontsize glyph \
-restoreclipcolor troffmode runscript
+forsuffixes step until charlist extensible \
+fontdimen headerbyte kern ligtable boundarychar \
+chardp charext charht charic charwd \
+designsize fontmaking charexists cullit currenttransform \
+gfcorners grayfont hround imagerules lowres_fix \
+nodisplays notransforms openit displaying currentwindow \
+screen_rows screen_cols pixels_per_inch cull display \
+openwindow numspecial totalweight autorounding fillin \
+proofing tracingpens xoffset chardx granularity \
+smoothing turningcheck yoffset chardy hppp \
+tracingedges vppp extra_beginfig extra_endfig mpxbreak \
+endinput message delimiters turningnumber errmessage \
+readstring scantokens end outer inner \
+write to readfrom withprescript withpostscript \
+top bot lft rt ulft \
+urt llft lrt redpart greenpart \
+bluepart cyanpart magentapart yellowpart blackpart \
+prescriptpart postscriptpart rgbcolor cmykcolor colormodel \
+graypart greypart greycolor graycolor dashpart \
+penpart stroked filled textual clipped \
+bounded pathpart expandafter minute hour \
+outputformat outputtemplate filenametemplate fontmapfile fontmapline \
+fontpart fontsize glyph restoreclipcolor troffmode \
+runscript maketext
keywordclass.metapost.shortcuts=\
.. ... -- --- \
-&
+& \
keywordclass.metapost.tex=\
btex etex verbatimtex
diff --git a/Master/texmf-dist/context/data/scite/context/scite-context-data-tex.properties b/Master/texmf-dist/context/data/scite/context/scite-context-data-tex.properties
index d1780794d18..95933ad531a 100644
--- a/Master/texmf-dist/context/data/scite/context/scite-context-data-tex.properties
+++ b/Master/texmf-dist/context/data/scite/context/scite-context-data-tex.properties
@@ -49,11 +49,12 @@ Usubscript Usuperscript Uunderdelimiter alignmark aligntab \
attribute attributedef catcodetable clearmarks crampeddisplaystyle \
crampedscriptscriptstyle crampedscriptstyle crampedtextstyle fontid formatname \
gleaders ifabsdim ifabsnum ifprimitive initcatcodetable \
-latelua luaescapestring luastartup luatexdatestamp luatexrevision \
+latelua luaescapestring luastartup luatexbanner luatexrevision \
luatexversion luafunction mathstyle nokerns noligs \
outputbox pageleftoffset pagetopoffset postexhyphenchar posthyphenchar \
preexhyphenchar prehyphenchar primitive savecatcodetable scantextokens \
-suppressfontnotfounderror suppressifcsnameerror suppresslongerror suppressoutererror synctex
+suppressfontnotfounderror suppressifcsnameerror suppresslongerror suppressoutererror suppressmathparerror \
+synctex
keywordclass.tex.omega=\
OmegaVersion bodydir chardp charht \
@@ -163,7 +164,7 @@ leftmarginkern leftskip leqno let letterspacefont \
limits linepenalty lineskip lineskiplimit localbrokenpenalty \
localinterlinepenalty localleftbox localrightbox long looseness \
lower lowercase lpcode luaescapestring luastartup \
-luatexdatestamp luatexrevision luatexversion mag mark \
+luatexbanner luatexrevision luatexversion mag mark \
marks mathaccent mathbin mathchar mathchardef \
mathchoice mathclose mathcode mathdir mathinner \
mathop mathopen mathord mathpunct mathrel \
diff --git a/Master/texmf-dist/context/data/scite/context/scite-context-external.properties b/Master/texmf-dist/context/data/scite/context/scite-context-external.properties
index c7d0c4a17d3..b48f2552543 100644
--- a/Master/texmf-dist/context/data/scite/context/scite-context-external.properties
+++ b/Master/texmf-dist/context/data/scite/context/scite-context-external.properties
@@ -17,12 +17,12 @@ fold.line.comments=0
# <scitehome>/lexers
if PLAT_WIN
- lexerpath.*.lpeg=$(lexer.lpeg.home)/../../lexers/lexlpeg.dll
-# lexerpath.*.lpeg=$(lexer.lpeg.home)/lexers/lexlpeg.dll
+ lexerpath.*.lpeg=$(lexer.lpeg.home)/../../lexers/lexlpeg.dll
+# lexerpath.*.lpeg=$(lexer.lpeg.home)/lexers/lexlpeg.dll
if PLAT_GTK
- lexerpath.*.lpeg=$(lexer.lpeg.home)/../../lexers/liblexlpeg.so
-# lexerpath.*.lpeg=$(lexer.lpeg.home)/lexers/liblexlpeg.so
+ lexerpath.*.lpeg=$(lexer.lpeg.home)/../../lexers/liblexlpeg.so
+# lexerpath.*.lpeg=$(lexer.lpeg.home)/lexers/liblexlpeg.so
# the variable lexer.name is automatically set but I'm not sure what the following
# one is supposed to do so we keep it around (sams as in lpeg.properties, which we
@@ -76,6 +76,9 @@ comment.block.at.line.start.lpeg_scite-context-lexer-lua=1
comment.block.lpeg_scite-context-lexer-cld=--
comment.block.at.line.start.lpeg_scite-context-lexer-cld=1
+comment.block.lpeg_scite-context-lexer-bibtex=%
+comment.block.at.line.start.lpeg_scite-context-lexer-bibtex=1
+
comment.block.lpeg_props=#
comment.block.at.line.start.lpeg_props=1
diff --git a/Master/texmf-dist/context/data/scite/context/scite-context.properties b/Master/texmf-dist/context/data/scite/context/scite-context.properties
index 78850ef0d0e..f1deb9df5f6 100644
--- a/Master/texmf-dist/context/data/scite/context/scite-context.properties
+++ b/Master/texmf-dist/context/data/scite/context/scite-context.properties
@@ -677,6 +677,9 @@ fold.margin.colour=#CCCCCC
# testing
+caret.width = 3
+selection.rectangular.switch.mouse = 1
+
#~ cache.layout=
find.command=mtxrun --script grep "$(find.what)" "$(find.files)"
diff --git a/Master/texmf-dist/context/data/scite/context/scite-ctx.lua b/Master/texmf-dist/context/data/scite/context/scite-ctx.lua
index 24f5b34b8aa..a529b3ced0e 100644
--- a/Master/texmf-dist/context/data/scite/context/scite-ctx.lua
+++ b/Master/texmf-dist/context/data/scite/context/scite-ctx.lua
@@ -902,13 +902,16 @@ local textlists = { -- taken from sort-lan.lua
"U", "V", "W", "X", "Y", "Z",
},
fr = {
- "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",
+ "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",
+
+ "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",
- "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",
},
de = {
"a", "ä", "b", "c", "d", "e", "f", "g", "h", "i",
@@ -1169,12 +1172,12 @@ local textlists = { -- taken from sort-lan.lua
"T", "U", "Ú", "Ü", "V", "W", "X", "Y", "Z",
},
lt = { -- lithuanian
- "a", "ą", "b", "c", ch, "č", "d", "e", "ę", "ė",
+ "a", "ą", "b", "c", "ch", "č", "d", "e", "ę", "ė",
"f", "g", "h", "i", "į", "y", "j", "k", "l", "m",
"n", "o", "p", "r", "s", "š", "t", "u", "ų", "ū",
"v", "z", "ž",
- "A", "Ą", "B", "C", CH, "Č", "D", "E", "Ę", "Ė",
+ "A", "Ą", "B", "C", "CH", "Č", "D", "E", "Ę", "Ė",
"F", "G", "H", "I", "Į", "Y", "J", "K", "L", "M",
"N", "O", "P", "R", "S", "Š", "T", "U", "Ų", "Ū",
"V", "Z", "Ž",
@@ -1389,7 +1392,7 @@ end
function OnOpen(filename)
-- print("opening: " .. filename .. " (size: " .. editor.TextLength .. ")")
- editor:Colourise(1,editor.TextLength)
+ editor:Colourise(0,editor.TextLength)
end
-- output.LexerLanguage = ""
diff --git a/Master/texmf-dist/doc/context/document/general/manuals/mreadme.pdf b/Master/texmf-dist/doc/context/document/general/manuals/mreadme.pdf
deleted file mode 100644
index 33800801520..00000000000
--- a/Master/texmf-dist/doc/context/document/general/manuals/mreadme.pdf
+++ /dev/null
Binary files differ
diff --git a/Master/texmf-dist/doc/context/document/general/manuals/tiptrick.pdf b/Master/texmf-dist/doc/context/document/general/manuals/tiptrick.pdf
deleted file mode 100644
index 3ced360e14a..00000000000
--- a/Master/texmf-dist/doc/context/document/general/manuals/tiptrick.pdf
+++ /dev/null
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/epub-mkiv-demo.epub b/Master/texmf-dist/doc/context/documents/general/manuals/epub-mkiv-demo.epub
new file mode 100644
index 00000000000..111d044d5d9
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/epub-mkiv-demo.epub
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/epub-mkiv-demo.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/epub-mkiv-demo.pdf
new file mode 100644
index 00000000000..2382d188c50
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/epub-mkiv-demo.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/epub-mkiv.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/epub-mkiv.pdf
new file mode 100644
index 00000000000..6ffb5b1fd6e
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/epub-mkiv.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/mreadme.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/mreadme.pdf
new file mode 100644
index 00000000000..59cc2a6215b
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/mreadme.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/swiglib-mkiv.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/swiglib-mkiv.pdf
new file mode 100644
index 00000000000..54e2cb62364
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/swiglib-mkiv.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/tiptrick.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/tiptrick.pdf
new file mode 100644
index 00000000000..5332e70ec12
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/tiptrick.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/tools-mkiv.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/tools-mkiv.pdf
new file mode 100644
index 00000000000..b0560258b25
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/tools-mkiv.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/units-mkiv.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/units-mkiv.pdf
new file mode 100644
index 00000000000..e04f7f41740
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/units-mkiv.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/workflows-mkiv.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/workflows-mkiv.pdf
new file mode 100644
index 00000000000..828fb86cb2e
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/workflows-mkiv.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/xtables-mkiv.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/xtables-mkiv.pdf
new file mode 100644
index 00000000000..ee213f4d714
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/xtables-mkiv.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/manuals/allkind/mcommon.tex b/Master/texmf-dist/doc/context/manuals/allkind/mcommon.tex
deleted file mode 100644
index f0c22cff42e..00000000000
--- a/Master/texmf-dist/doc/context/manuals/allkind/mcommon.tex
+++ /dev/null
@@ -1,199 +0,0 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
-\startenvironment mcommon
-
-% modules
-
-\usemodule[abr-02]
-
-% layout
-
-\startmode[screen]
- \setuppapersize[S6][S6]
- \setupinteraction[state=start]
- \setupinteractionscreen[options=max]
-\stopmode
-
-\setuplayout
- [footer=0cm,
- width=middle,
- height=middle]
-
-% fonts
-
-\startmode[atpragma]
-
- \startMPenvironment[global]
- \usetypescriptfile[type-buy]
- \usetypescript[lucida][texnansi]
- \setupbodyfont[lucida,10pt]
- \stopMPenvironment
-
- \setupbodyfont[11pt]
-
-\stopmode
-
-\startnotmode[atpragma]
-
- \startMPenvironment[global]
- \usetypescript[palatino][ec]
- \setupbodyfont[palatino,10pt]
- \stopMPenvironment
-
- \setupbodyfont[11pt]
-
-\stopnotmode
-
-\definefont [BigFont] [SansBold at 60pt]
-\definefont [MedFont] [SansBold at 30pt]
-
-% colors
-
-\setupcolors
- [state=start]
-
-\definecolor [NopColor] [r=.6,g=.4,b=.5]
-\definecolor [AltColor] [r=.4,g=.6,b=.5]
-\definecolor [TheColor] [r=.4,g=.5,b=.6]
-\definecolor [TmpColor] [r=.6,g=.5,b=.4]
-
-\definecolor [red] [NopColor]
-\definecolor [green] [AltColor]
-\definecolor [blue] [TheColor]
-\definecolor [yellow][TmpColor]
-
-% spacing
-
-\setupwhitespace
- [big]
-
-\setuptolerance
- [verytolerant,stretch]
-
-% verbatim
-
-\setuptype
- [color=AltColor]
-
-\setuptyping
- [color=AltColor]
-
-% structure
-
-\setupitemize
- [each]
- [color=TheColor]
-
-\definedescription
- [switch]
- [headstyle=type,
- headcolor=TheColor,
- location=serried,
- width=broad]
-
-\defineenumeration
- [topic]
- [location=serried,
- width=broad,
- headstyle=,
- headcolor=TheColor,
- text=,
- left={[},
- right={]}]
-
-\setuphead
- [section]
- [style=\ss\bfb,
- color=TheColor]
-
-\setuplist
- [section]
- [alternative=c,
- color=TheColor,
- textcolor=black,
- pagecolor=black]
-
-% whatever
-
-\setupsystem
- [random=medium]
-
-\setupfloats
- [ntop=100]
-
-\setupinteraction
- [style=,
- color=NopColor,
- contrastcolor=NopColor]
-
-% tables and frames
-
-\setuptabulate
- [rulethickness=.5pt,
- rulecolor=AltColor]
-
-\setuptables
- [rulethickness=.5pt,
- rulecolor=AltColor]
-
-\setupframedtexts
- [rulethickness=.5pt,
- framecolor=TheColor,
- width=\textwidth]
-
-% quick reference things
-
-\usemodule[set-11] \loadsetups
-
-\setupframedtexts
- [setuptext]
- [rulethickness=.5pt,
- framecolor=AltColor]
-
-% basic titlepage and colofon, a bit old fashioned approach, but let's not
-% modernize everything now
-
-\def\TitlePage#1#2#3#4#5% number/name angle title author screen
- {\doifnumberelse{#1}
- {\ifcase#1
- \defineoverlay
- [logo]
- [\useMPgraphic{titlepage}{width=\overlaywidth,height=\overlayheight}]
- \else
- \startMPrun
- logo_type := #1 ; mpgraph := #1 ; input mp-cont ;
- \stopMPrun
- \defineoverlay
- [logo]
- [{\externalfigure
- [\MPrunfile{#1}]
- [width=\overlaywidth,height=\overlayheight]}]
- \fi}
- {\defineoverlay
- [logo]
- [\useMPgraphic{#1}{width=\overlaywidth,height=\overlayheight}]}
- \setupbackgrounds
- [page]
- [background=logo]
- \definecolor[Gray][s=#5]
- \startstandardmakeup
- \dontcomplain
- \BigFont \setupinterlinespace \vfill \setupalign[left] \let\\=\par
- \ifcase#2\relax
- \noindent\color[Gray]{#3}\par
- \else
- \noindent\rotate[rotation=#2]{\color[Gray]{#3}}\par
- \fi
- \stopstandardmakeup
- \setupbackgrounds
- [page]
- [background=]}
-
-\def\ColofonPage
- {\startstandardmakeup
- \vfill \setups [pragma-colofon]
- \stopstandardmakeup}
-
-\stopenvironment
diff --git a/Master/texmf-dist/doc/context/manuals/allkind/mkiv-publications-graph.bib b/Master/texmf-dist/doc/context/manuals/allkind/mkiv-publications-graph.bib
deleted file mode 100644
index 2e781179cc6..00000000000
--- a/Master/texmf-dist/doc/context/manuals/allkind/mkiv-publications-graph.bib
+++ /dev/null
@@ -1,53 +0,0 @@
-% A few examples from the MetaPost graph manual that Alan was updating
-% at the time we wrote the new bib code. Watch how uppercase is used here
-% as well as curly braces instead of double quote characters,
-
-@INCOLLECTION{Bentley1990,
- author = {Bentley, Jon L. and Kernighan, Brian W.},
- year = {1990},
- title = {Grap—A language for Typesetting Graphs},
- booktitle = {Unix Research System Papers},
- publisher = {{AT\&T} Bell Laboratories},
- volume = {{II}},
- pages = {109–146},
- address = {Murray Hill, New Jersey},
- edition = {Tenth},
-}
-
-@BOOK{Cleveland1985,
- author = {Cleveland, William S.},
- year = {1985, revised 1994},
- title = {The Elements of Graphing Data},
- publisher = {Hobart Press},
- address = {Summit, New Jersey},
-}
-
-@BOOK{Cleveland1993,
- author = {Cleveland, William S.},
- year = {1993},
- title = {Visualizing Data},
- publisher = {Hobart Press},
- address = {Summit, New Jersey},
-}
-
-@ARTICLE{Cleveland1993a,
- author = {Cleveland, William S.},
- year = {1993},
- title = {A Model for Studying Display Methods of StatisticalGraphics (with
- discussion)},
- journal = {Journal of Computational and Statistical Graphics},
- volume = {2},
- pages = {323–343},
- number = {4},
- doi = {10.1080/10618600.1993.10474616},
- eprint = {http://www.tandfonline.com/doi/pdf/10.1080/10618600.1993.10474616},
- url = {http://www.tandfonline.com/doi/abs/10.1080/10618600.1993.10474616},
-}
-
-@BOOK{Tufte1983,
- author = {Tufte, Edward R.},
- year = {1983},
- title = {Visual Display of Quantitative Information},
- publisher = {Graphics Press},
- address = {Box 430, Cheshire, Connecticut 06410},
-}
diff --git a/Master/texmf-dist/doc/context/manuals/allkind/mkiv-publications.bib b/Master/texmf-dist/doc/context/manuals/allkind/mkiv-publications.bib
deleted file mode 100644
index 9e9984bfc5b..00000000000
--- a/Master/texmf-dist/doc/context/manuals/allkind/mkiv-publications.bib
+++ /dev/null
@@ -1,36 +0,0 @@
-% A few silly but simple examples.
-
-@book{demo-001,
- author = "Hans Hagen",
- title = "\BIBTEX, the \CONTEXT\ way",
- year = "2013",
-}
-
-@book{demo-002,
- crossref = "demo-001"
- year = "2014",
-}
-
-@book{demo-003,
- author = "Hans Hagen and Ton Otten",
- title = "Typesetting education documents",
- year = "1996",
- comment = "a non-existing document",
-}
-
-@book{demo-004,
- author = "Luigi Scarso",
- title = "Designing high speed trains properly!",
- year = "2021",
- comment = "still to be published",
-}
-
-@book{demo-005,
- author = "author",
- title = "title",
- year = "year",
- serial = "serial",
- doi = "doi",
- url = "url",
- pages = "pages"
-}
diff --git a/Master/texmf-dist/doc/context/manuals/allkind/mkiv-publications.pdf b/Master/texmf-dist/doc/context/manuals/allkind/mkiv-publications.pdf
deleted file mode 100644
index 2aadba29d2e..00000000000
--- a/Master/texmf-dist/doc/context/manuals/allkind/mkiv-publications.pdf
+++ /dev/null
Binary files differ
diff --git a/Master/texmf-dist/doc/context/manuals/allkind/mkiv-publications.tex b/Master/texmf-dist/doc/context/manuals/allkind/mkiv-publications.tex
deleted file mode 100644
index c5bdab14a27..00000000000
--- a/Master/texmf-dist/doc/context/manuals/allkind/mkiv-publications.tex
+++ /dev/null
@@ -1,1523 +0,0 @@
-% language=uk
-
-
-\setupbtxlistvariant [interaction=start]
-\setupbtxcitevariant [interaction=start]
-
-% \btxfield{manipulator_a->manipulator_b->fieldname}
-
-% engine=luajittex
-
-% criterium: all + sorttype=cite => citex before rest
-% criterium: all + sorttype=database => database order
-% criterium: used
-% numbering: label, short, indexinlist, indexused
-
-\usemodule[abr-02]
-\usemodule[set-11]
-
-\loadsetups[publications-en.xml] \enablemode[interface:setup:defaults]
-
-\setupbackend
- [export=yes,
- xhtml=yes,
- css=export-example.css]
-
-\setupexport
- [hyphen=yes,
- width=60em]
-
-% \input publ-tmp.mkiv
-
-\setupbodyfont
- [dejavu,10pt]
-
-\setuphead
- [chapter]
- [header=high,
- style=\bfc,
- color=darkmagenta]
-
-\setuplayout
- [topspace=2cm,
- bottomspace=1cm,
- header=0cm,
- width=middle,
- height=middle]
-
-\setupwhitespace
- [big]
-
-\setuptyping
- [color=darkmagenta]
-
-\setuptyping
- [keeptogether=yes]
-
-\setuptype
- [color=darkcyan]
-
-\setupfootertexts
- [pagenumber]
-
-\setupMPgraphics
- [mpy=\jobname.mpy]
-
-\setupinteraction
- [state=start,
- color=darkcyan,
- contrastcolor=darkyellow]
-
-\starttext
-
-\startMPpage
-
- StartPage ;
-
- % input "mkiv-publications.mpy" ;
-
- picture pic ; pic := image (
- path pth ; pth := ((0,0) for i=1 step 2 until 20 : -- (i,1) -- (i+1,0) endfor) ;
- for i=0 upto 9 : draw pth shifted (0,2*i) ; endfor ;
- ) ;
-
- % picture btx ; btx := textext("\ssbf BIBTEX") ;
- % picture ctx ; ctx := textext("\ssbf THE CONTEXT WAY") ;
- picture btx ; btx := image(graphictext("\ssbf BIBTEX") withfillcolor white) ;
- picture ctx ; ctx := image(graphictext("\ssbf THE CONTEXT WAY") withfillcolor white) ;
-
- pic := pic shifted - llcorner pic ;
- btx := btx shifted - llcorner btx ;
- ctx := ctx shifted - llcorner ctx ;
-
- pic := pic xysized (PaperWidth,PaperHeight) ;
- btx := btx xsized (2PaperWidth/3) shifted (.25PaperWidth,.15PaperHeight) ;
- ctx := ctx xsized (2PaperWidth/3) shifted (.25PaperWidth,.075PaperHeight) ;
-
- fill Page withcolor \MPcolor{darkcyan} ;
-
- draw pic withcolor \MPcolor{darkmagenta} ;
- draw btx withcolor \MPcolor{lightgray} ;
- draw ctx withcolor \MPcolor{lightgray} ;
-
- % draw boundingbox btx ;
- % draw boundingbox ctx ;
-
- StopPage ;
-
-\stopMPpage
-
-
-\startfrontmatter
-
-\starttitle[title=Contents]
- \placelist[chapter,section][color=black]
-\stoptitle
-
-\startchapter[title=Introduction]
-
-This manual describes how \MKIV\ handles bibliographies. Support in \CONTEXT\
-started in \MKII for \BIBTEX, using a module written by Taco Hoekwater. Later his
-code was adapted to \MKIV, but because users demanded more, I decided that
-reimplementing made more sense than patching. In particular, through the use of
-\LUA, the \BIBTEX\ data files can be easily directly parsed, thus liberating
-\CONTEXT\ from the dependency on an external \BIBTEX\ executable. The CritEd
-project (by Thomas Schmitz, Alan Braslau, Luigi Scarso and myself) was a good
-reason to undertake this rewrite. As part that project users were invited to come
-up with ideas about extensions. Not all of them are (yet) honored, but the
-rewrite makes more functionality possible.
-
-This manual is dedicated to Taco Hoekwater who in a previous century implemented
-the first \BIBTEX\ module and saw it morf into a \TEX||\LUA\ hybrid in this
-century. The fact that there was support for bibliographies made it possible for
-users to use \CONTEXT\ in an academic environment, dominated by bibliographic
-databases encoded in the \BIBTEX\ format.
-
-\startlines
-Hans Hagen
-PRAGMA ADE
-Hasselt NL
-\stoplines
-
-\stopchapter
-
-\stopfrontmatter
-
-\startbodymatter
-
-\startchapter[title=The database]
-
-The \BIBTEX\ format is rather popular in the \TEX\ community and even with its
-shortcomings it will stay around for a while. Many publication websites can
-export and many tools are available to work with this database format. It is
-rather simple and looks a bit like \LUA\ tables. Unfortunately the content can be
-polluted with non|-|standardized \TEX\ commands which complicates pre- or
-postprocessing outside \TEX. In that sense a \BIBTEX\ database is often not coded
-neutrally. Some limitations, like the use of commands to encode accented
-characters root in the \ASCII\ world and can be bypassed by using \UTF\ instead
-(as handled somewhat in \LATEX\ through extensions such as \type {bibtex8}).
-
-The normal way to deal with a bibliography is to refer to entries using a unique
-tag or key. When a list of entries is typeset, this reference can be used for
-linking purposes. The typeset list can be processed and sorted using the \type
-{bibtex} program that converts the database into something more \TEX\ friendly (a
-\type {.bbl} file). I never used the program myself (nor bibliographies) so I
-will not go into too much detail here, if only because all I say can be wrong.
-
-In \CONTEXT\ we no longer use the \type {bibtex} program: we just use
-database files and deal with the necessary manipulations directly in \CONTEXT.
-One or more such databases can be used and combined with additional entries
-defined within the document. We can have several such datasets active at the same
-time.
-
-A \BIBTEX\ file looks like this:
-
-\starttyping
-@Article{sometag,
- author = "An Author and Another One",
- title = "A hopefully meaningful title",
- journal = maps,
- volume = "25",
- number = "2",
- pages = "5--9",
- month = mar,
- year = "2013",
- ISSN = "1234-5678",
-}
-\stoptyping
-
-Normally a value is given between quotes (or curly brackets) but single words are
-also OK (there is no real benefit in not using quotes, so we advise to always use
-them). There can be many more fields and instead of strings one can use
-predefined shortcuts. The title for example quite often contains \TEX\ macros.
-Some fields, like \type {pages} have funny characters such as the endash
-(typically as \type {--}) so we have a mixture of data and typesetting
-directives. If you are covering non||english references, you often need
-characters that are not in the \ASCII\ subset but \CONTEXT\ is quite happy with
-\UTF. If your database file uses old|-|fashioned \TEX\ accent commands then these
-will be internally converted automatically to \UTF. Commands (macros) are
-converted to an indirect call, which is quite robust.
-
-The \BIBTEX\ files are loaded in memory as \LUA\ table but can be converted to
-\XML\ so that we can access them in a more flexible way, but that is a subject
-for specialists.
-
-In the old \MKII\ setup we have two kinds of entries: the ones that come from the
-\BIBTEX\ run and user supplied ones. We no longer rely on \BIBTEX\ output but we
-do still support the user supplied definitions. These were in fact prepared in a
-way that suits the processing of \BIBTEX\ generated entries. The next variant
-reflects the \CONTEXT\ recoding of the old \BIBTEX\ output.
-
-\starttyping
-\startpublication[k=Hagen:Second,t=article,a={Hans Hagen},y=2013,s=HH01]
- \artauthor[]{Hans}[H.]{}{Hagen}
- \arttitle{Who knows more?}
- \journal{MyJournal}
- \pubyear{2013}
- \month{8}
- \volume{1}
- \issue{3}
- \issn{1234-5678}
- \pages{123--126}
-\stoppublication
-\stoptyping
-
-The split \type {\artauthor} fields are collapsed into a single \type {author}
-field as we deal with the splitting later when it gets parsed in \LUA. The \type
-{\artauthor} syntax is only kept around for backward compatibility with the
-previous use of \BIBTEX.
-
-In the new setup we support these variants as well:
-
-\starttyping
-\startpublication[k=Hagen:Third,t=article]
- \author{Hans Hagen}
- \title{Who knows who?}
- ...
-\stoppublication
-\stoptyping
-
-and
-
-\starttyping
-\startpublication[tag=Hagen:Third,category=article]
- \author{Hans Hagen}
- \title{Who knows who?}
- ...
-\stoppublication
-\stoptyping
-
-and
-
-\starttyping
-\startpublication
- \tag{Hagen:Third}
- \category{article}
- \author{Hans Hagen}
- \title{Who knows who?}
- ...
-\stoppublication
-\stoptyping
-
-Because internally the entries are \LUA\ tables, we also support loading of \LUA\
-based definitions:
-
-\starttyping
-return {
- ["Hagen:First"] = {
- author = "Hans Hagen",
- category = "article",
- issn = "1234-5678",
- issue = "3",
- journal = "MyJournal",
- month = "8",
- pages = "123--126",
- tag = "Hagen:First",
- title = "Who knows nothing?",
- volume = "1",
- year = "2013",
- },
-}
-\stoptyping
-
-Files set up like this can be loaded too. The following \XML\ input is rather
-close to this, and is also accepted as input.
-
-\starttyping
-<?xml version="2.0" standalone="yes" ?>
-<bibtex>
- <entry tag="Hagen:First" category="article">
- <field name="author">Hans Hagen</field>
- <field name="category">article</field>
- <field name="issn">1234-5678</field>
- <field name="issue">3</field>
- <field name="journal">MyJournal</field>
- <field name="month">8</field>
- <field name="pages">123--126</field>
- <field name="tag">Hagen:First</field>
- <field name="title">Who knows nothing?</field>
- <field name="volume">1</field>
- <field name="year">2013</field>
- </entry>
-</bibtex>
-\stoptyping
-
-{\em Todo: Add some remarks about loading EndNote and RIS formats, but first we
-need to complete the tag mapping (on Alan's plate).}
-
-So the user has a rather wide choice of formatting style for bibliography
-database files.
-
-\stopchapter
-
-You can load more data than you actually need. Only entries that are referred to
-explicitly through the \type {\cite} and \type {\nocite} commands will be shown
-in lists. We will cover these details later.
-
-\startchapter[title=Commands in entries]
-
-One unfortunate aspect commonly found in \BIBTEX\ files is that they often
-contain \TEX\ commands. Even worse is that there is no standard on what these
-commands can be and what they mean, at least not formally, as \BIBTEX\ is a
-program intended to be used with many variants of \TEX\ style: plain, \LATEX, and
-others. This means that we need to define our use of these typesetting commands.
-However, in most cases, they are just abbreviations or font switches and these
-are often known. Therefore, \CONTEXT\ will try to resolve them before reporting
-an issue. In the log file there is a list of commands that has been seen in the
-loaded databases. For instance, loading \type {tugboat.bib} gives a long list of
-commands of which we show a small set here:
-
-\starttyping
-publications > start used btx commands
-
-publications > standard CONTEXT 1 known
-publications > standard ConTeXt 4 known
-publications > standard TeXLive 3 KNOWN
-publications > standard eTeX 1 known
-publications > standard hbox 6 known
-publications > standard sltt 1 unknown
-
-publications > stop used btxcommands
-\stoptyping
-
-You can define unknown commands, or overload existing definitions in the
-following way:
-
-\starttyping
-\definebtxcommand\TUB {TUGboat}
-\definebtxcommand\sltt{\tt}
-\definebtxcommand\<#1>{\type{#1}}
-\stoptyping
-
-Unknown commands do not stall processing, but their names are then typeset in a
-mono|-|spaced font so they probably stand out for proofreading. You can
-access the commands with \type {\btxcommand {...}}, as in:
-
-\startbuffer
-commands like \btxcommand{MySpecialCommand} are handled in an indirect way
-\stopbuffer
-
-\typebuffer
-
-As this is an undefined command we get: \quotation {\inlinebuffer}.
-
-??
-
-\stopchapter
-
-\startchapter[title=Datasets]
-
-Normally in a document you will use only one bibliographic database, whether or
-not distributed over multiple files. Nevertheless we support multiple databases as well
-which is why we talk of datasets instead. A dataset is loaded with the \type
-{\usebtxdataset} command. Although currently it is not necessary to define a
-(default) dataset you can best do this because in the future we might provide more
-options. Here are some examples:
-
-\starttyping
-\definebtxdataset[standard]
-
-\usebtxdataset[standard][tugboat.bib]
-\usebtxdataset[standard][mtx-bibtex-output.xml]
-\usebtxdataset[standard][test-001-btx-standard.lua]
-\stoptyping
-
-These three suffixes are understood by the loader. Here the dataset has the name
-\type {standard} and the three database files are merged, where later entries having the
-same tag overload previous ones. Definitions in the document source (coded in \TEX\
-speak) are also added, and they are saved for successive runs. This means that if
-you load and define entries, they will be known at a next run beforehand, so that
-references to them are independent of when loading and definitions take place.
-
-\showsetup{setupbtxdataset}
-
-\showsetup{definebtxdataset}
-
-\showsetup{usebtxdataset}
-
-In this document we use some example databases, so let's load one of them now:
-
-\startbuffer
-\definebtxdataset[example]
-
-\usebtxdataset[example][mkiv-publications.bib]
-\stopbuffer
-
-\typebuffer \getbuffer
-
-You can ask for an overview of entries in a dataset with:
-
-\startbuffer
-\showbtxdatasetfields[example]
-\stopbuffer
-
-\typebuffer
-
-this gives:
-
-\getbuffer
-
-You can set the current active dataset with
-
-\starttyping
-\setbtxdataset[standard]
-\stoptyping
-
-but most publication|-|related commands accept optional arguments that denote the
-dataset and references to entries can be prefixed with a dataset identifier.. More
-about that later.
-
-Sometimes you want to check a database. One way of doing that is the following:
-
-\startbuffer
-\definebtxdataset[check]
-
-\usebtxdataset[check][mkiv-publications-check.bib]
-
-\showbtxdatasetcompleteness[check]
-\stopbuffer
-
-\typebuffer
-
-The database like like this:
-
-\typefile{mkiv-publications-check.bib}
-
-The completeness check shows (with green field names) the required fields and
-when one is missing this is indicated in red. In blue we show what gets
-inherited.
-
-\getbuffer
-
-\stopchapter
-
-\startchapter[title=Renderings]
-
-A list of publications can be rendered at any place in the document. A database
-can be much larger than needed for a document. The same is true for the fields
-that make up an entry. Here is the list of fields that are currently handled, but
-of course there can be additional ones:
-
-
-\startalignment[flushleft,verytolerant,nothyphenated]
-\startluacode
-local fields = publications.tracers.fields
-
-for i=1,#fields do
- if i > 1 then
- context(", ")
- end
- context.type(fields[i])
-end
-\stopluacode
-\stopalignment
-
-If you want to see what publications are in the database, the easiest way is to
-ask for a complete list:
-
-\startbuffer
-\definebtxrendering
- [example]
- [dataset=example,
- method=local,
- alternative=apa]
-\placelistofpublications % \placebtxrendering
- [example]
- [criterium=all]
-\stopbuffer
-
-\typebuffer
-
-This gives:
-
-\getbuffer
-
-The rendering itself is somewhat complex to set up because we have not only many
-different standards but also many fields that can be set up. This means that
-there are several commands involved. Often there is a prescribed style to render
-bibliographic descriptions, for example \type {apa}. A rendering is setup and
-defined with:
-
-\showsetup[setupbtxrendering]
-%showrootvalues[btxrendering]
-\showsetup[definebtxrendering]
-
-And a list of such descriptions is generated with:
-
-\showsetup[placebtxrendering]
-
-A dataset can have all kind of entries:
-
-\startalignment[flushleft,verytolerant,nothyphenated]
-\startluacode
- local categories = publications.tracers.categories
-
- for i=1,#categories do
- if i > 1 then
- context(", ")
- end
- context.type(categories[i])
- end
-\stopluacode
-\stopalignment
-
-Each has its own rendering variant. To keep things simple we have their settings
-separated. However, these settings are shared for all rendering alternatives. In
-practice this is seldom a problem in a publication as only one rendering
-alternative will be active. If this be not sufficient, you can always group local
-settings in a setup and hook that into the specific rendering.
-
-\showsetup[setupbtxlistvariant]
-%showrootvalues[btxlistvariant]
-\showsetup[definebtxlistvariant]
-
-Examples of list variants are:
-
-\startluacode
- local variants = publications.tracers.listvariants
-
- for i=1,#variants do
- context.showinstancevalues( { "btxlistvariant" }, { variants[i] })
- end
-\stopluacode
-
-The exact rendering of list entries is determined by the \type {alternative} key
-and defaults to \type {apa} which uses definitions from \type
-{publ-imp-apa.mkiv}. If you look at that file you will see that each category has
-its own setup. You may also notice that additional tests are needed to make sure
-that empty fields don't trigger separators and such.
-
-% \showsetup{setuplists}
-
-There are a couple of accessors and helpers to get the job done. When you want to
-fetch a field from the current entry you use \type {\btxfield}. In most cases
-you want to make sure this field has a value, for instance because you don't want
-fences or punctuation that belongs to a field.
-
-\starttyping
-\btxdoif {title} {
- \bold{\btxfield{title}},
-}
-\stoptyping
-
-There are three test macros:
-
-\starttyping
-\btxdoifelse{fieldname}{action when found}{action when not found}
-\btxdoif {fieldname}{action when found}
-\btxdoifnot {fieldname} {action when not found}
-\stoptyping
-
-An extra conditional is available for testing interactivity:
-
-\starttyping
-\btxdoifelseinteraction{action when true}{action when false}
-\stoptyping
-
-In addition there is also a conditional \type {\btxinteractive} which is
-more efficient, although in practice efficiency is not so important here.
-
-There are three commands to flush data:
-
-\starttabulate[|||] % Funny usage here! Could not tabulate work without
- % even specifying the number of columns?
-\NC \type {\btxfield} \NC fetch a explicit field (e.g. \type {year}) \NC \NR
-\NC \type {\btxdetail} \NC fetch a derived field (e.g. \type {short}) \NC \NR
-\NC \type {\btxflush} \NC fetch a derived or explicit field \NC \NR
-\stoptabulate
-
-Normally you can use \type {\btxfield} or \type {\btxflush} as derived fields
-just like analyzed author fields are flushed in a special way.
-
-You can improve readability by using setups, for instance:
-
-\starttyping
-\btxdoifelse {author} {
- \btxsetup{btx:apa:author:yes}
-} {
- \btxsetup{btx:apa:author:nop}
-}
-\stoptyping
-
-Keep in mind that normally you don't need to mess with definitions like this
-because standard rendering styles are provided. These styles use a few helpers
-that inject symbols but also take care of leading and trailing spaces:
-
-\starttabulate[|||]
-\NC \type {\btxspace } \NC before \btxspace after \NC \NR
-\NC \type {\btxperiod } \NC before \btxperiod after \NC \NR
-\NC \type {\btxcomma } \NC before \btxcomma after \NC \NR
-\NC \type {\btxlparent } \NC before \btxlparent after \NC \NR
-\NC \type {\btxrparent } \NC before \btxrparent after \NC \NR
-\NC \type {\btxlbracket} \NC before \btxlbracket after \NC \NR
-\NC \type {\btxrbracket} \NC before \btxrbracket after \NC \NR
-\stoptabulate
-
-So, the previous example setup can be rewritten as:
-
-\starttyping
-\btxdoif {title} {
- \bold{\btxfield{title}}
- \btxcomma
-}
-\stoptyping
-
-There is a special command for rendering a (combination) of authors:
-
-\starttyping
-\btxflushauthor{author}
-\btxflushauthor{editor}
-\btxflushauthor[inverted]{editor}
-\stoptyping
-
-Instead of the last one you can also use:
-
-\starttyping
-\btxflushauthorinverted{editor}
-\stoptyping
-
-You can use a (configurable) default or pass directives: Valid directives are
-
-\starttabulate
-\NC \bf conversion \NC \bf rendering \NC \NR
-\HL
-\NC \type{inverted} \NC the Frog jr, Kermit \NC \NR
-\NC \type{invertedshort} \NC the Frog jr, K \NC \NR
-\NC \type{normal} \NC Kermit, the Frog, jr \NC \NR
-\NC \type{normalshort} \NC K, the Frog, jr \NC \NR
-\stoptabulate
-
-The list itself is not a list in the sense of a regular \CONTEXT\ structure related
-list. We do use the list mechanism to keep track of used entries but that is mostly
-because we can then reuse filtering mechanisms. The actual rendering of a reference
-and entry runs on top of so called constructions (other examples of constructions are
-descriptions, enumerations and notes).
-
-\showsetup[setupbtxlist]
-
-You need to be aware what command is used to achieve the desired result. For instance,
-in order to put parentheses around a number reference you say:
-
-\starttyping
-\setupbtxlistvariant
- [num]
- [left=(,
- right=)]
-\stoptyping
-
-If you want automated width calculations, the following does the trick:
-
-\starttyping
-\setupbtxrendering
- [standard]
- [width=auto]
-\stoptyping
-
-but if you want to control it yourself you say something:
-
-\starttyping
-\setupbtxrendering
- [width=none]
-
-\setupbtxlist
- [standard]
- [width=3cm,
- distance=\emwidth,
- color=red,
- headcolor=blue,
- headalign=flushright]
-\stoptyping
-
-In most cases the defaults will work out fine.
-
-\stopchapter
-
-\startchapter[title=Citations]
-
-Citations are references to bibliographic entries that normally show up in lists
-someplace in the document: at the end of a chapter, in an appendix, at the end of
-an article, etc. We discussed the rendering of these lists in the previous chapter.
-A citation is normally pretty short as its main purpose is to refer uniquely to a more
-detailed description. But, there are several ways to refer, which is why the citation
-subsystem is configurable and extensible. Just look at the following commands:
-
-\startbuffer
-\cite[author][example::demo-003]
-\cite[authoryear][example::demo-003]
-\cite[authoryears][example::demo-003]
-\cite[author][example::demo-003,demo-004]
-\cite[authoryear][example::demo-003,demo-004]
-\cite[authoryears][example::demo-003,demo-004]
-\cite[author][example::demo-004,demo-003]
-\cite[authoryear][example::demo-004,demo-003]
-\cite[authoryears][example::demo-004,demo-003]
-\stopbuffer
-
-\typebuffer
-
-\startlines \getbuffer \stoplines
-
-The first argument is optional.
-% What is the default? How can one set this up?
-
-\showsetup[cite]
-
-You can tune the way a citation shows up:
-
-\startbuffer
-\setupbtxcitevariant[author] [sorttype=author,color=darkyellow]
-\setupbtxcitevariant[authoryear] [sorttype=author,color=darkyellow]
-\setupbtxcitevariant[authoryears][sorttype=author,color=darkyellow]
-
-\cite[author][example::demo-004,demo-003]
-\cite[authoryear][example::demo-004,demo-003]
-\cite[authoryears][example::demo-004,demo-003]
-\stopbuffer
-
-\typebuffer
-
-Here we sort the authors and color the citation:
-
-\startlines \getbuffer \stoplines
-
-For reasons of backward compatibility the \type {\cite} command is a bit picky
-about spaces between the two arguments, of which the first is optional. This is
-a consequence of allowing its use with the key specified between curly brackets
-as is the traditional practice. (We do encourage users to adopt the more
-coherent \CONTEXT\ syntax by using square brackets for keywords and reserving
-curly brackets to regroup text to be typeset.)
-% Just how is it picky?
-
-The \type {\citation} command is synonymous but is more flexible with respect to
-spacing of its arguments:
-
-\starttyping
-\citation[author] [example::demo-004,demo-003]
-\citation[authoryear] [example::demo-004,demo-003]
-\citation[authoryears][example::demo-004,demo-003]
-\stoptyping
-
-% The first argument of cite and citation is optional. What is the default and how does one set it?
-
-There is a whole bunch of cite options and more can be easily defined.
-
-\startluacode
-local variants = publications.tracers.citevariants
-
-context.starttabulate { "|l|p|" }
- context.NC() context.bold("key")
- context.NC() context.bold("rendering")
- context.NC() context.NR() context.FL()
- for i=1,#variants do
- local variant = variants[i]
- context.NC() context.type(variant)
- context.NC() context.citation( { variant }, { "example::demo-005" })
- context.NC() context.NR()
- end
-context.stoptabulate()
-\stopluacode
-
-Because we are dealing with database input and because we generally need to
-manipulate entries, much of the work is delegated to \LUA. This makes it easier
-to maintain and extend the code. Of course \TEX\ still does the rendering. The
-typographic details are controlled by parameters but not all are used in all
-variants. As with most \CONTEXT\ commands, it starts out with a general setup
-command:
-
-\showsetup[setupbtxcitevariant]
-
-On top of that we can define instances that inherit either from a given parent or
-from the topmost setup.
-
-\showsetup[definebtxcitevariant]
-
-% The default values are:
-
-% \showrootvalues[btxcitevariant]
-
-But, specific variants can have them overloaded:
-
-% \showinstancevalues[setupbtxcitevariant][author]
-% \showinstancevalues[setupbtxcitevariant][authornum]
-
-\startluacode
- local variants = publications.tracers.citevariants
-
- for i=1,#variants do
- context.showinstancevalues( { "btxcitevariant" }, { variants[i] })
- end
-\stopluacode
-
-A citation variant is defined in several steps and if you really want to know
-the dirty details, you should look into the \type {publ-imp-*.mkiv} files. Here
-we stick to the concept.
-
-\starttyping
-\startsetups btx:cite:author
- \btxcitevariant{author}
-\stopsetups
-\stoptyping
-
-You can overload such setups if needed, but that only makes sense when you cannot
-configure the rendering with parameters. The \type {\btxcitevariant} command is
-one of the build in accessors and it calls out to \LUA\ where more complex
-manipulation takes place if needed. If no manipulation is known, the field with
-the same name (if found) will be flushed. A command like \type {\btxcitevariant}
-assumes that a dataset and specific tag has been set. This is normally done in
-the wrapper macros, like \type {\cite}. For special purposes you can use these
-commands
-
-\starttyping
-\setbtxdataset[example]
-\setbtxentry[hh2013]
-\stoptyping
-
-But don't expect too much support for such low level rendering control.
-
-Unless you use \type {criterium=all} only publications that are cited will end up
-in the lists. You can force a citation into a list using \type {\usecitation}, for
-example:
-
-\starttyping
-\usecitation[example::demo-004,demo-003]
-\stoptyping
-
-This command has two synonyms: \type {\nocite} and \type {\nocitation} so you can
-choose whatever fits you best.
-
-\showsetup[nocite]
-
-\stopchapter
-
-\startchapter[title=The \LUA\ view]
-
-Because we manage data at the \LUA\ end it is tempting to access it there for
-other purposes. This is fine as long as you keep in mind that aspects of the
-implementation may change over time, although this is unlikely once the modules
-become stable.
-
-The entries are collected in datasets and each set has a unique name. In this
-document we have the set named \type {example}. A dataset table has several
-fields, and probably the one of most interest is the \type {luadata} field. Each
-entry in this table describes a publication:
-
-\startluacode
- context.tocontext(publications.datasets.example.luadata["demo-001"])
-\stopluacode
-
-This is \type {publications.datasets.example.luadata["demo-001"]}. There can be
-a companion entry in the parallel \type {details} table.
-
-\startluacode
- context.tocontext(publications.datasets.example.details["demo-001"])
-\stopluacode
-
-These details are accessed as \type
-{publications.datasets.example.details["demo-001"]} and by using a separate table
-we can overload fields in the original entry without losing the original.
-
-You can loop over the entries using regular \LUA\ code combined with \MKIV\
-helpers:
-
-\startbuffer
-local dataset = publications.datasets.example
-
-context.starttabulate { "|l|l|l|" }
-for tag, entry in table.sortedhash(dataset.luadata) do
- local detail = dataset.details[tag] or { }
- context.NC() context.type(tag)
- context.NC() context(detail.short)
- context.NC() context(entry.title)
- context.NC() context.NR()
-end
-context.stoptabulate()
-\stopbuffer
-
-\typebuffer
-
-This results in:
-
-\ctxluabuffer
-
-You can manipulate a dataset after loading. Of course this assumes that you know
-what kind of content you have and what you need for rendering. As example we
-load a small dataset.
-
-\startbuffer
-\definebtxdataset[drumming]
-\usebtxdataset[drumming][mkiv-publications.lua]
-\stopbuffer
-
-\typebuffer \getbuffer
-
-Because we're going to do some \LUA, we could also have loaded the dataset
-with:
-
-\starttyping
-publications.load("drumming","mkiv-publications.lua","lua")
-\stoptyping
-
-The dataset has three entries:
-
-\typefile{mkiv-publications.lua}
-
-As you can see, we can have a subtitle. We will combine the title and subtitle
-into one:
-
-\startbuffer
-\startluacode
-for tag, entry in next, publications.datasets.drumming.luadata do
- if entry.subtitle then
- if entry.title then
- entry.title = entry.title .. ", " .. entry.subtitle
- else
- entry.title = entry.subtitle
- end
- entry.subtitle = nil
- logs.report("btx","combining title and subtitle of entry tagged %a",tag)
- end
-end
-\stopluacode
-\stopbuffer
-
-\typebuffer \getbuffer
-
-We can now typeset the entries with:
-
-\startbuffer
-\definebtxrendering[drumming][dataset=drumming,method=dataset]
-\placebtxrendering[drumming]
-\stopbuffer
-
-\typebuffer
-
-Because we just want to show the entries, and have no citations that force them
-to be shown, we have to the \type {method} to \type {dataset}. \footnote {Gavin
-Harrison is in my opinion one of the most creative, diverse and interesting
-drummers of our time. It's also fascinating to watch him play and a welcome
-distraction from writing code and manuals.}
-
-\blank \getbuffer \blank
-
-\stopchapter
-
-\startchapter[title=The \XML\ view]
-
-The \type {luadata} table can be converted into an \XML\ representation. This is
-a follow up on earlier experiments with an \XML|-|only approach. I decided in the end
-to stick to a \LUA\ approach and provide some simple \XML\ support in addition.
-
-Once a dataset is accessible as \XML\ tree, you can use the regular \type {\xml...}
-commands. We start with loading a dataset, in this case from just one file.
-
-\startbuffer
-\usebtxdataset[tugboat][tugboat.bib]
-\stopbuffer
-
-\typebuffer \getbuffer
-
-The dataset has to be converted to \XML:
-
-\startbuffer
-\convertbtxdatasettoxml[tugboat]
-\stopbuffer
-
-\typebuffer \getbuffer
-
-The tree is now accessible by its root reference \type {btx:tugboat}. If we want simple
-field access we can use a few setups:
-
-\startbuffer
-\startxmlsetups btx:initialize
- \xmlsetsetup{#1}{bibtex|entry|field}{btx:*}
- \xmlmain{#1}
-\stopxmlsetups
-
-\startxmlsetups btx:field
- \xmlflushcontext{#1}
-\stopxmlsetups
-
-\xmlsetup{btx:tugboat}{btx:initialize}
-\stopbuffer
-
-\typebuffer \getbuffer
-
-The two setups are predefined in the core already, but you might want to change them. They are
-applied in for instance:
-
-\startbuffer
-\starttabulate[|||]
- \NC \type {tag} \NC \xmlfirst {btx:tugboat}
- {/bibtex/entry[string.find(@tag,'Hagen')]/attribute('tag')}
- \NC \NR
- \NC \type {title} \NC \xmlfirst {btx:tugboat}
- {/bibtex/entry[string.find(@tag,'Hagen')]/field[@name='title']}
- \NC \NR
-\stoptabulate
-\stopbuffer
-
-\typebuffer \getbuffer
-
-\startbuffer
-\startxmlsetups btx:demo
- \xmlcommand
- {#1}
- {/bibtex/entry[string.find(@tag,'Hagen')][1]}{btx:table}
-\stopxmlsetups
-
-\startxmlsetups btx:table
-\starttabulate[|||]
- \NC \type {tag} \NC \xmlatt{#1}{tag} \NC \NR
- \NC \type {title} \NC \xmlfirst{#1}{/field[@name='title']} \NC \NR
-\stoptabulate
-\stopxmlsetups
-
-\xmlsetup{btx:tugboat}{btx:demo}
-\stopbuffer
-
-\typebuffer \getbuffer
-
-Here is another example:
-
-\startbuffer
-\startxmlsetups btx:row
- \NC \xmlatt{#1}{tag}
- \NC \xmlfirst{#1}{/field[@name='title']}
- \NC \NR
-\stopxmlsetups
-
-\startxmlsetups btx:demo
- \xmlfilter {#1} {
- /bibtex
- /entry[@category='article']
- /field[@name='author' and (find(text(),'Knuth') or find(text(),'DEK'))]
- /../command(btx:row)
- }
-\stopxmlsetups
-
-\starttabulate[|||]
- \xmlsetup{btx:tugboat}{btx:demo}
-\stoptabulate
-\stopbuffer
-
-\typebuffer \getbuffer
-
-A more extensive example is the following. Of course this assumes that you
-know what \XML\ support mechanisms and macros are available.
-
-\startbuffer
-\startxmlsetups btx:getkeys
- \xmladdsortentry{btx}{#1}{\xmlfilter{#1}{/field[@name='author']/text()}}
- \xmladdsortentry{btx}{#1}{\xmlfilter{#1}{/field[@name='year' ]/text()}}
- \xmladdsortentry{btx}{#1}{\xmlatt{#1}{tag}}
-\stopxmlsetups
-
-\startxmlsetups btx:sorter
- \xmlresetsorter{btx}
- % \xmlfilter{#1}{entry/command(btx:getkeys)}
- \xmlfilter{#1}{
- /bibtex
- /entry[@category='article']
- /field[@name='author' and find(text(),'Knuth')]
- /../command(btx:getkeys)}
- \xmlsortentries{btx}
- \starttabulate[||||]
- \xmlflushsorter{btx}{btx:entry:flush}
- \stoptabulate
-\stopxmlsetups
-
-\startxmlsetups btx:entry:flush
- \NC \xmlfilter{#1}{/field[@name='year' ]/context()}
- \NC \xmlatt{#1}{tag}
- \NC \xmlfilter{#1}{/field[@name='author']/context()}
- \NC \NR
-\stopxmlsetups
-
-\xmlsetup{btx:tugboat}{btx:sorter}
-\stopbuffer
-
-\typebuffer \getbuffer
-
-The original data is stored in a \LUA\ table, hashed by tag. Starting with \LUA\ 5.2
-each run of \LUA\ gets a different ordering of such a hash. In older versions, when you
-looped over a hash, the order was undefined, but the same as long as you used the same
-binary. This had the advantage that successive runs, something we often have in document
-processing gave consistent results. In today's \LUA\ we need to do much more sorting of
-hashes before we loop, especially when we save multi||pass data. It is for this reason
-that the \XML\ tree is sorted by hash key by default. That way lookups (especially
-the first of a set) give consistent outcomes.
-
-\stopchapter
-
-\startchapter[title=Standards]
-
-The rendering of bibliographic entries is often standardized and prescribed by
-the publisher. If you submit an article to a journal, normally it will be
-reformatted (or even re|-|keyed) and the rendering will happen at the publishers
-end. In that case it may not matter how entries were rendered when writing the
-publication, because the publisher will do it his or her way.
-This means that most users probably will stick to the standard \APA\ rules and for
-them we provide some configuration. Because we use setups it is easy to overload
-specifics. If you really want to tweak, best look in the files that deal with it.
-
-Many standards exist and support for other renderings may be added to the core.
-Interested users are invited to develop and to test alternate standard renderings
-according to their needs.
-
-Todo: maybe a list of categories and fields.
-
-\stopchapter
-
-\startchapter[title=Cleaning up]
-
-Although the \BIBTEX\ format is reasonably well defined, in practice there are
-many ways to organize the data. For instance, one can use predefined string
-constants that get used (either or not combined with other strings) later on. A string
-can be enclosed in curly braces or double quotes. The strings can contain \TEX\ commands
-but these are not standardized. The databases often have somewhat complex
-ways to deal with special characters and the use of braces in their definition is also
-not normalized.
-
-The most complex to deal with are the fields that contain names of people. At some point it
-might be needed to split a combination of names into individual ones that then get split into
-title, first name, optional inbetweens, surname(s) and additional: \type {Prof. Dr. Alfred
-B. C. von Kwik Kwak Jr. II and P. Q. Olet} is just one example of this. The convention seems
-to be not to use commas but \type {and} to separate names (often each name will be specified
-as lastname, firstname).
-
-We don't see it as challenge nor as a duty to support all kinds of messy definitions. Of
-course we try to be somewhat tolerant, but you will be sure to get better results if you
-use nicely setup, consistent databases.
-
-Todo: maybe some examples of bad.
-
-\stopchapter
-
-\startchapter[title=Transition]
-
-In the original bibliography support module usage was as follows (example taken
-from the contextgarden wiki):
-
-\starttyping
-% engine=pdftex
-
-\usemodule[bib]
-\usemodule[bibltx]
-
-\setupbibtex
- [database=xampl]
-
-\setuppublications
- [numbering=yes]
-
-\starttext
- As \cite [article-full] already indicated, bibtex is a \LATEX||centric
- program.
-
- \completepublications
-\stoptext
-\stoptyping
-
-For \MKIV\ the modules were partly rewritten and ended up in the core so the two
-{\usemodule} commands were no longer needed. The overhead associated with the
-automatic loading of the bibliography macros can be neglected these days, so
-standardized modules such as \type {bib} are all being moved to the core and do
-not need to be explicitly loaded.
-
-The first \type {\setupbibtex} command in this example is needed to bootstrap
-the process: it tells what database has to be processed by \BIBTEX\ between
-runs. The second \type {\setuppublications} command is optional. Each citation
-(tagged with \type {\cite}) ends up in the list of publications.
-
-In the new approach we no longer use \BIBTEX so we don't need to setup \BIBTEX.
-Instead we define dataset(s). We also no longer set up publications with one
-command, but have split that up in rendering-, list-, and cite|-|variants. The
-basic \type {\cite} command remains. The above example becomes:
-
-\starttyping
-\definebtxdataset
- [document]
-
-\usebtxdataset
- [document]
- [mybibfile.bib]
-
-\definebtxrendering
- [document]
-
-\setupbtxrendering
- [document]
- [numbering=yes]
-
-\starttext
- As \cite [article-full] already indicated, bibtex is a \LATEX||centric
- program.
-
- \completebtxrendering[document]
-\stoptext
-\stoptyping
-
-So, we have a few more commands to set up things. If you intend to use just a
-single dataset and rendering, the above preamble can be simplified to:
-
-\starttyping
-\usebtxdataset
- [mybibfile.bib]
-
-\setupbtxrendering
- [numbering=yes]
-\stoptyping
-
-But keep in mind that compared to the old \MKII\ derived method we have moved
-some of the options to the rendering, list and cite setup variants.
-
-Another difference is now the use of lists. When you define a rendering, you
-also define a list. However, all entries are collected in a common list tagged
-\type {btx}. Although you will normally configure a rendering you can still set
-some properties of lists, but in that case you need to prefix the list
-identifier. In the case of the above example this is \type {btx:document}.
-
-\stopchapter
-
-\startchapter[title=\MLBIBTEX]
-
-Todo: how to plug in \MLBIBTEX\ for sorting and other advanced operations.
-
-\stopchapter
-
-\startchapter[title=Extensions]
-
-As \TEX\ and \LUA\ are both open and accessible in \CONTEXT\ it is possible to
-extend the functionality of the bibliography related code. For instance, you can add
-extra loaders.
-
-\starttyping
-function publications.loaders.myformat(dataset,filename)
- local t = { }
- -- Load data from 'filename' and convert it to a Lua table 't' with
- -- the key as hash entry and fields conforming the luadata table
- -- format.
- loaders.lua(dataset,t)
-end
-\stoptyping
-
-This then permits loading a database (into a dataset) with the command:
-
-\starttyping
-\usebtxdataset[standard][myfile.myformat]
-\stoptyping
-
-The \type {myformat} suffix is recognized automatically. If you want to use another
-suffix, you can do this:
-
-\starttyping
-\usebtxdataset[standard][myformat::myfile.txt]
-\stoptyping
-
-\stopchapter
-
-\startchapter[title=Searching]
-
-Finding the right key in a database can be a pain. On the other hand, asking for
-a wildcard also makes no sense. Nevertheless we provide a mechanism for matching
-a query. For this we load a small bibliographic database:
-
-\startbuffer
-\usebtxdataset[graph][mkiv-publications-graph.bib]
-\stopbuffer
-
-\typebuffer \getbuffer
-
-We could switch to this base using:
-
-\starttyping
-\setbtxdataset[graph]
-\stoptyping
-
-but instead we will use a prefix. For instance, if we have this in our source:
-
-\startbuffer
-searching give a few hits, so we get: \cite [ graph :: match ( author:cleveland and
-year:1993 ) ].
-\stopbuffer
-
-\typebuffer
-
-We will get: \quotation {\inlinebuffer}. Of course this assumes that we also
-typeset a list of referred to references, so let's do that:
-
-\startbuffer
-\definebtxrendering[graph][dataset=graph]
-\placebtxrendering[graph][criterium=chapter]
-\stopbuffer
-
-\typebuffer
-
-We get:
-
-\blank \getbuffer \blank
-
-Let's look in more detail at the \type {\cite} command. In order to distinguish
-efficiently between a normal reference and a more clever one, we use the \type
-{match} keyword:
-
-\startbuffer
-dataset::match(query)
-dataset :: match ( query )
-\stopbuffer
-
-The handler is rather tolerant for spaces:
-
-\startbuffer
-dataset :: match ( query )
-\stopbuffer
-
-Which is handy if you have long queries that wrap around in the source code. Of
-course the \type {dataset::} prefix is optional in which case the current dataset
-is taken.
-
-A query eventually becomes a \LUA\ expression so you can use helpers to achieve
-your goal. As a convenience there are some shortcuts to access fields. The
-following examples demonstrate this:
-
-\starttyping
-match(author:hagen)
-match(author:hagen and author:hoekwater and year:1990-2010)
-match(author:"Bogusław Jackowski")
-match(author:"Bogusław Jackowski" and (tonumber(field:year) or 0) > 2000)
-\stoptyping
-
-You can use quotes when spaces are involved. Of course you can use other
-characters that the basic alphabet. Ranges (of numbers) are recognized. String
-lookups are partial and case insensitive. \footnote {At the time of this
-writing, may 2014, this mechanism is still somewhat experimental.}
-
-\startbuffer
-Wildcards: \cite [graph::match(author:cleve)].
-\stopbuffer
-
-\typebuffer
-
-We get three entries: \quotation {\inlinebuffer}.
-
-% To be checked: are indeed three entries found?
-
-% Match : \cite [match(author:cleveland and year:1993)] \par
-
-\stopchapter
-
-\startchapter[title=Combining]
-
-It is possible to refer to two sources in one go. In that case the list will have one
-entry for two bibliographic entries.
-
-\startbuffer
-Let's save numbers and refer to Bentley and Tufte with one: \cite [graph ::
-Bentley1990 + Tufte1983]!
-\stopbuffer
-
-\typebuffer
-
-Indeed we get one number only: \quotation {\inlinebuffer}.
-
-\startbuffer
-\setupbtxrendering[graph][continue=yes,separator={; }]
-\placebtxrendering[graph][criterium=chapter]
-\stopbuffer
-
-We produce the (local) list with:
-
-\typebuffer
-
-which shows the two entries pasted together:
-
-\setupbtxrendering[separator=]
-
-\blank \getbuffer \blank
-
-As demonstration we also specified the separator although that one is already
-set up by default.
-
-You can combine citations with additional text before and|/|or after it. This can
-be done per citation. This feature is of course not that useful, as one can
-put text before and after a citation anyway.
-
-\startbuffer
-foo bar \citation [before=<<,after=>>] [graph::Cleveland1993] foo bar
-\stopbuffer
-
-\typebuffer
-
-Gives:
-
-\blank \getbuffer \blank
-
-\stopchapter
-
-\startchapter[title=Summary]
-
-\start
-\setbtxdataset[graph]
-
-There are a lot of combinations possible and not all of them make sense.
-Nevertheless we show most of them here. (There will be more.)
-
-\startbuffer[samples]
-Cleveland : \cite [Cleveland1993,Cleveland1985,Cleveland1993a] \par
-Tufte : \cite [Tufte1983] \par
-Bentley : \cite [Bentley1990] \par
-All : \cite [Tufte1983,Cleveland1993,Bentley1990,Cleveland1985,
- Cleveland1993a] \par
-\stopbuffer
-
-\starttexdefinition BibSampleSet #1#2
- \subsubsubject{alternative=#1 / compress=#2}
- \startpacked
- \setupbtxcitevariant[#1][compress=#2]
- \setupbtxcitevariant[alternative=#1]
- \getbuffer[samples]
- \stoppacked
-\stoptexdefinition
-
-\BibSampleSet{author} {no}
-\BibSampleSet{authoryear} {no}
-\BibSampleSet{authoryear} {yes}
-\BibSampleSet{authoryears}{no}
-\BibSampleSet{authoryears}{yes}
-\BibSampleSet{authornum} {no}
-\BibSampleSet{authornum} {yes}
-\BibSampleSet{year} {no}
-\BibSampleSet{year} {yes}
-\BibSampleSet{short} {no}
-\BibSampleSet{serial} {no}
-\BibSampleSet{serial} {yes}
-\BibSampleSet{tag} {no}
-\BibSampleSet{key} {no}
-\BibSampleSet{doi} {no}
-\BibSampleSet{url} {no}
-\BibSampleSet{type} {no}
-\BibSampleSet{category} {no}
-\BibSampleSet{page} {no}
-\BibSampleSet{num} {no}
-\BibSampleSet{num} {yes}
-
-\startbuffer
-\setupbtxrendering[graph][continue=yes]
-\placebtxrendering[graph][criterium=chapter]
-\stopbuffer
-
-We produce a local list with:
-
-\typebuffer
-
-and get a list with (new) entries:
-
-\blank \getbuffer \blank
-
-\stop
-
-\stopchapter
-
-\startchapter[title=Notes]
-
-The move from external \BIBTEX\ processing to internal processing has the
-advantage that we stay within the same run. In the traditional approach we had
-roughly the following steps:
-
-\startitemize[packed]
-\startitem the first run information is collected and written to file \stopitem
-\startitem after that run the \BIBTEX\ program converts that file to another one \stopitem
-\startitem successive runs use that data for references and producing lists \stopitem
-\stopitemize
-
-In the \MKIV\ approach the bibliographic database is loaded in memory each run
-and processing also happens each run. On paper this looks less efficient but as
-\LUA\ is quite fast, in practice performance is much better.
-
-Probably most demanding is the treatment of authors as we have to analyze names,
-split multiple authors and reassemble firstnames, vons, surnames and juniors.
-When we sort by author sorting vectors have to be made which also has a penalty.
-However, in practice the user will not notice a performance degradation. We did
-some tests with a list of 500.000 authors, sorted them and typeset them as list
-(producing some 5400 dense pages in a small font and with small margins). This is
-typical one of these cases where using \LUAJITTEX\ saves quite time. On my
-machine it took just over 100 seconds to get this done. Unfortunately not all
-operating systems performed equally well: 32 bit versions worked fine, but 64 bit
-\LINUX\ either crashed (stalled) the machine or ran out of memory rather fast,
-while \MACOSX\ and \WINDOWS\ performed fine. In practice you will never run into
-this, unless you produce massive amounts of bibliographic entries. \LUAJIT\ has
-some benefits but also some drawbacks.
-
-\stopchapter
-
-\stopbodymatter
-
-\stoptext
-
-Todo:
-
-\setuplabeltext[en][reprint=reprint]
-\setuplabeltext[de][reprint=Nachdruck]
-
-note = {\labeltext{reprint} 2004}
-
diff --git a/Master/texmf-dist/doc/context/manuals/allkind/mreadme.tex b/Master/texmf-dist/doc/context/manuals/allkind/mreadme.tex
deleted file mode 100644
index 22af40afe7f..00000000000
--- a/Master/texmf-dist/doc/context/manuals/allkind/mreadme.tex
+++ /dev/null
@@ -1,361 +0,0 @@
-% interface=en output=pdftex language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
-\environment mcommon
-
-\useurl[gpl-simple] [http://creativecommons.org/licenses/GPL/2.0/]
-\useurl[gpl-legal] [http://creativecommons.org/licenses/GPL/2.0/legalcode]
-\useurl[byncsa-simple][http://creativecommons.org/licenses/by-nc-sa/2.5/]
-\useurl[byncsa-legal] [http://creativecommons.org/licenses/by-nc-sa/2.5/legalcode]
-
-\useurl[garden] [http://contextgarden.net]
-\useurl[contextlist] [http://www.ntg.nl/mailman/listinfo/ntg-context]
-\useurl[development] [http://www.ntg.nl/mailman/listinfo/dev-context]
-\useurl[announce] [http://www.ntg.nl/mailman/listinfo/ann-context]
-\useurl[collector] [http://context.literatesolutions.com]
-\useurl[pragma] [http://www.pragma-ade.com]
-\useurl[mirror] [http://context.aanhet.net]
-
-\setupinteraction[state=start]
-
-% copied from cont-log: readme_logo
-
-\startuseMPgraphic{titlepage}{width,height}
- numeric width ; width = \MPvar{width} ;
- numeric height ; height = \MPvar{height} ;
- numeric delta ; delta := width/10 ;
- numeric circle ; circle := 2.5delta ;
- color c ; c := (.2,.4,.6) ;
- path p, q, r ;
- p := unitsquare xscaled width yscaled height ;
- z1 = (delta,height-2delta) ;
- z2 = (width-delta,height-delta) ;
- z3 = (width/2-delta,2delta+circle) ;
- z4 = (x3,delta+circle/2) ;
- q := z1 { dir -15 } .. z2 &
- z2 { dir -105 } .. z3 &
- z3 { dir 135 } .. z1 &
- cycle ;
- r := fullcircle xscaled circle yscaled (.85circle) rotated 15 shifted z4 ;
- pickup pencircle scaled (delta/1.5) ;
- fill p withcolor .50c ;
- fill q withcolor .75c ;
- fill r withcolor .75c ;
- draw p withcolor c ;
- draw q withcolor c ;
- pickup pencircle scaled (delta/2) ;
- draw r withcolor c ;
- setbounds currentpicture to p ;
-\stopuseMPgraphic
-
-\starttext
-
-\TitlePage{titlepage}{90}{Read Me First}{}{1}
-
-\subject {Introduction}
-
-What licence suits best for a \TEX\ like system is a matter of
-taste. Personally we dislike any licence that needs more than a few
-pages of dense legal code to get the message accross. A \TEX\
-related system like \CONTEXT\ is a hybrid of programs, scripts
-and|/|or macro code as well as documentation and sample code,
-including graphics. \TEX\ related systems also have a long
-standing tradition of providing support structures for users. In
-order to make support feasable, a \TEX\ based system like
-\CONTEXT\ assumes a certain logic and structure in the way the
-related files are named and organized in a tree structure. Even a
-small change in one of the elements may let such a system behave
-differently than manuals suggest. Swap a font, change some style
-defaults, leave out some pieces, and users may end up in
-confusion. A licence does not give a user any guarantees!
-
-In order to satisfy those responsible for distributing \CONTEXT,
-we need to choose a licence that makes them feel comfortable.
-Unfortunately we don't feel that comfortable with a licence that does
-not provide the guarantees that a system will not be adapted in
-such ways that the advertised behaviour changes. On the
-other hand, it is the responsibility of those distributing and
-extending the system to make sure that this does not happen.
-However, users should not automatically assume that what they get
-shipped is the same as the original, which is why we stress that
-support (from our side) will only be given on unaltered systems.
-
-First of all, what is \CONTEXT ? It's just a bunch of macros,
-written in \TEX\ and \METAPOST, meant for typesetting documents.
-The macros are accompanied by some scripts, written in \PERL\ (mainly
-the older scripts) \RUBY\ (the official ones) and \LUA\ (for
-embedded usage). The \CONTEXT\ distribution comes with a few fonts,
-files that help manage resources (e.g.\ map files), as well as
-patterns (based on official ones, so this is a derived work).
-
-The \CONTEXT\ distribution is packaged in a zip file organized in
-the \TDS\ structure.
-
-\starttabulate
-\NC \type {cont-tmf.zip} \NC The main distribution. \NC \NR
-\NC \type {cont-img.zip} \NC A few extra resources. \NC \NR
-\NC \type {cont-ext.zip} \NC Third party modules. \NC \NR
-\stoptabulate
-
-When we talk about \CONTEXT\ we also mean its graphical companion
-\METAFUN\ and \FOXET, an \XML\ related product. All these are
-included in the main distribution archive.
-
-The documentation can be downloaded from our website, one of its
-mirrors, the \TEX\ collection as distributed by \TEX\ user groups.
-For some manuals, source code is available in a subversion
-repository. The archives are also kept on \CTAN.
-
-That said, what licence does apply? We need to distinguish between
-things that resemble a program on the one hand and documentation
-on the other hand. We (currently) use a different licence for
-either of them.
-
-\subject {The Code}
-
-The program code (i.e. anything not under the \type {/doc}
-subtree) is distributed under the
-
-\startnarrower
-\goto{Creative Commons GNU GPL}[url(gpl-simple)]
-\stopnarrower
-
-For practical purposes distributers may also choose the \LATEX\
-project licence, which is considered to be a bit more \TEX\
-friendly. (BSD alike licences, the Ruby Licence and the Apache
-are all licences that apply well for \CONTEXT.)
-
-In practice, users may forget about the legal part, if only
-because I haven't even read (and understood) it completely myself,
-so let's stick to what Creative Commons makes of it:
-
-\startcolor[blue]
-The GNU General Public License is a Free Software license. Like
-any Free Software license, it grants to you the four following
-freedoms:
-
-\startitemize
-\item The freedom to run the program for any purpose.
-\item The freedom to study how the program works and adapt it to
- your needs.
-\item The freedom to redistribute copies so you can help your neighbour.
-\item The freedom to improve the program and release your improvements
- to the public, so that the whole community benefits.
-\stopitemize
-
-You may exercise the freedoms specified here provided that you
-comply with the express conditions of this license. The principal
-conditions are:
-
-You must conspicuously and appropriately publish on each copy
-distributed an appropriate copyright notice and disclaimer of
-warranty and keep intact all the notices that refer to this
-License and to the absence of any warranty; and give any other
-recipients of the Program a copy of the GNU General Public License
-along with the Program. Any translation of the GNU General Public
-License must be accompanied by the GNU General Public License.
-
-If you modify your copy or copies of the program or any portion of
-it, or develop a program based upon it, you may distribute the
-resulting work provided you do so under the GNU General Public
-License. Any translation of the GNU General Public License must be
-accompanied by the GNU General Public License.
-
-If you copy or distribute the program, you must accompany it with
-the complete corresponding machine-readable source code or with a
-written offer, valid for at least three years, to furnish the
-complete corresponding machine-readable source code.
-
-Any of these conditions can be waived if you get permission from
-the copyright holder.
-
-Your fair use and other rights are in no way affected by the above.
-\stopcolor
-
-\subject {Recommendations}
-
-Here are a few recommendations in case you want to distribute,
-extend of embed \CONTEXT\ in applications:
-
-\startitemize
-
-\item You can best leave the code base untouched. Most of
-\CONTEXT\ provides hooks and it's relatively easy to overload
-code. Leave the lower level system code untouched: changes may
-backfire when you update. Asking for more hooks is the best way to
-go.
-
-\item Put your own code in the right subpaths, i.e.\ modules
-approved by the development team under \type {.../third}, and
-styles and whatever else under \type {.../user}. This way your
-code will not interfere with existing code and updating will give
-less problems. Keep in mind that \TEX\ systems have their own way
-and order in locating files, and the load order often matters.
-
-\item Don't copy styles and change a few lines, but load the base one
-and built|/|patch on top of that. In the end you may benefit from
-improvements to the base style.
-
-\item Be original. The whole idea behind \CONTEXT\ is that you can
-write your own styles. On the \CONTEXT\ mailing list as well as on
-the Wiki there are enough advanced users to help you make a start.
-
-\item Don't hesitate to submit bugs reports and ask for
-extensions. It may even be that what you want is already present
-but yet undocumented.
-
-\item If things don't work as expected, check to what extend your
-system matches the (more or less) standard. We provide so called
-minimal \CONTEXT\ trees that can serve as a reference. Because
-\CONTEXT\ evolves, make sure your system is up to date.
-
-\item The scripts can best be called using \type {texmfstart}. This
-lessens dependencies on the location in the tree and ensures upward
-compatibility. It also prevents clashes with similary named scripts.
-
-\item Some scripts depend on each other. Don't mess around with the
-existing functionality and names of the scripts and then feed them
-back into the standard distributions.
-
-\stopitemize
-
-\subject {Documents}
-
-The documentation is provided under another Creative Commons licence
-
-\startnarrower
-\goto{Attribution NonCommercial ShareAlike}[url(byncsa-simple)]
-\stopnarrower
-
-This one says:
-
-\startcolor[blue]
-You are free:
-
-\startitemize
-\item to copy, distribute, display, and perform the work
-\item to make derivative works
-\stopitemize
-
-{\sc Attribution:} You must attribute the work in the manner
-specified by the author or licensor.
-
-{\sc NonCommercial:} You may not use this work for commercial
-purposes.
-
-{\sc Share Alike:} If you alter, transform, or build upon this
-work, you may distribute the resulting work only under a license
-identical to this one.
-
-\startitemize
-\item For any reuse or distribution, you must make clear to others
- the license terms of this work.
-\item Any of these conditions can be waived if you get permission from
- the copyright holder.
-\stopitemize
-
-Your fair use and other rights are in no way affected by the above.
-\stopcolor
-
-The non||commercial part is mostly a safeguard. We don't mind if
-user groups distribute printed copies, publish (parts of) manuals
-and|/|or if authors use example code in manuals and books about
-\CONTEXT.
-
-If you distribute \CONTEXT\ and related software on electronic media
-as part of \TEX\ distributions (either or not for money), you may
-also distribute the manuals and their sources in electronic form,
-preferable as provided by the maintainers of \CONTEXT.
-
-Keep in mind that logos and cover designs are not meant to be
-copied. We provide the source code for some manuals, but we don't
-always provide all graphics and other resources. For instance, in
-some manuals we use commercial fonts and you have to buy those
-yourself.
-
-We provide the typeset manuals at our website. Those are the official
-ones. We appreciate it if you do not to distribute manuals compiled
-on your own system as substitutes. The manuals are a showcase for what
-\CONTEXT\ provides. Help us to assure the quality.
-
-\subject {More information}
-
-We're not going to fill \mathematics{n}~pages with legal stuff, so if
-you want to know more, you have to consult the web for the legalities
-mentioned. Here are a few starting points:
-
-\startlines
-\goto{\url[gpl-simple]}[url(gpl-simple)]
-\goto{\url[gpl-legal]}[url(gpl-legal)]
-\stoplines
-
-\startlines
-\goto{\url[byncsa-simple]}[url(byncsa-simple)]
-\goto{\url[byncsa-legal]}[url(byncsa-legal)]
-\stoplines
-
-\CONTEXT\ itself can be fetched from the main site or its primary mirror:
-
-\startlines
-\goto{\url[pragma]}[url(pragma)]
-\goto{\url[mirror]}[url(mirror)]
-\stoplines
-
-A starting point for support can be found at:
-
-\startlines
-\goto{\url[contextlist]}[url(contextlist)]
-\goto{\url[garden]}[url(garden)]
-\stoplines
-
-Bugs and feature requests can be registered at the collector:
-
-\startlines
-\goto{\url[collector]}[url(collector)]
-\stoplines
-
-Releases are announced at:
-
-\startlines
-\goto{\url[announce]}[url(announce)]
-\stoplines
-
-The developers can be met at:
-
-\startlines
-\goto{\url[development]}[url(development)]
-\stoplines
-
-\subject {Disclaimer}
-
-To play safe we include a disclaimer here, taken from the BSD style
-licence. For some reason such a text is in capitals, so \unknown
-
-\start \sc \blue
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR \quotation {AS IS} AND ANY EXPRESS OR
-IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-\stop
-
-\unknown\ and don't bother discussing licence issues and related things
-with us for the mere sake of discussing licence stuff.
-
-\blank[2*big]
-
-\startlines
-Hans Hagen
-PRAGMA ADE
-Hasselt NL
-\stoplines
-
-\ColofonPage
-
-\stoptext
diff --git a/Master/texmf-dist/doc/context/manuals/allkind/publications-en.xml b/Master/texmf-dist/doc/context/manuals/allkind/publications-en.xml
deleted file mode 100644
index 002b425bbdd..00000000000
--- a/Master/texmf-dist/doc/context/manuals/allkind/publications-en.xml
+++ /dev/null
@@ -1,372 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!-- bibliographies -->
-
-<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="publications" language="en" version="2013.12.22">
-
- <!-- datasets -->
-
- <cd:command name="setupbtxdataset" file="publ-ini.mkiv" category="publications" hash="btxdataset">
- <cd:sequence>
- <cd:string value="setupbtxdataset"/>
- </cd:sequence>
- <cd:arguments>
- <cd:keywords n="1" optional="yes">
- <cd:constant type="cd:name"/>
- </cd:keywords>
- <cd:assignments n="2" optional="yes">
- <!-- todo -->
- </cd:assignments>
- </cd:arguments>
- </cd:command>
-
- <cd:command name="definebtxdataset" file="publ-ini.mkiv" category="publications" hash="btxdataset">
- <cd:sequence>
- <cd:string value="definebtxdataset"/>
- </cd:sequence>
- <cd:arguments>
- <cd:keywords n="1">
- <cd:constant type="cd:name"/>
- </cd:keywords>
- <cd:assignments n="2" optional="yes">
- <cd:inherit name="setupbtxdataset" n="2"/>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
-
- <cd:command name="usebtxdataset" file="publ-ini.mkiv" category="publications" hash="btxdataset">
- <cd:sequence>
- <cd:string value="usebtxdataset"/>
- </cd:sequence>
- <cd:arguments>
- <cd:keywords n="1">
- <cd:constant type="cd:name"/>
- </cd:keywords>
- <cd:keywords n="2">
- <cd:constant type="cd:file"/>
- </cd:keywords>
- </cd:arguments>
- </cd:command>
-
- <!-- rendering -->
-
- <cd:command name="setupbtxrendering" file="publ-ini.mkiv" category="publications" hash="btxrendering">
- <cd:sequence>
- <cd:string value="setupbtxrendering"/>
- </cd:sequence>
- <cd:arguments>
- <cd:keywords n="1" optional="yes">
- <cd:constant type="cd:name"/>
- </cd:keywords>
- <cd:assignments n="2">
- <cd:parameter name="alternative">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="dataset">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="setups">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="method">
- <cd:constant type="local"/>
- <cd:constant type="global"/>
- <cd:constant type="none"/>
- <cd:constant type="force"/>
- </cd:parameter>
- <cd:parameter name="sorttype">
- <cd:constant type="short"/>
- <cd:constant type="reference"/>
- <cd:constant type="dataset"/>
- <cd:constant type="default"/>
- </cd:parameter>
- <cd:parameter name="criterium">
- <cd:constant type="cd:text"/> <!-- todo -->
- </cd:parameter>
- <cd:parameter name="refcommand">
- <cd:constant type="cd:text"/> <!-- todo -->
- </cd:parameter>
- <cd:parameter name="numbering">
- <cd:constant type="yes"/>
- <cd:constant type="cite"/>
- </cd:parameter>
- <cd:parameter name="width">
- <cd:constant type="cd:dimension"/>
- <cd:constant type="auto"/>
- </cd:parameter>
- <cd:parameter name="distance">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="continue">
- <cd:constant type="yes"/>
- <cd:constant type="no"/>
- </cd:parameter>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
-
- <cd:command name="definebtxrendering" file="publ-ini.mkiv" category="publications" hash="btxrendering">
- <cd:sequence>
- <cd:string value="definebtxrendering"/>
- </cd:sequence>
- <cd:arguments>
- <cd:keywords n="1">
- <cd:constant type="cd:name"/>
- </cd:keywords>
- <cd:keywords n="2" optional="yes">
- <cd:constant type="cd:name"/>
- </cd:keywords>
- <cd:assignments n="3" optional="yes">
- <cd:inherit name="setupbtxrendering" n="2"/>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
-
- <cd:command name="placebtxrendering" file="publ-ini.mkiv" category="publications" hash="btxrendering">
- <cd:sequence>
- <cd:string value="placebtxrendering"/>
- </cd:sequence>
- </cd:command>
-
- <!-- lists -->
-
- <cd:command name="setupbtxlistvariant" file="publ-ini.mkiv" category="publications" hash="btxlistvariant">
- <cd:sequence>
- <cd:string value="setupbtxlistvariant"/>
- </cd:sequence>
- <cd:arguments>
- <cd:keywords n="1" optional="yes">
- <cd:constant type="cd:name"/>
- </cd:keywords>
- <cd:assignments n="2">
- <cd:parameter name="separator">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="namesep">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="lastnamesep">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="finalnamesep">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="firstnamesep">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="juniorsep">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="vonsep">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="surnamesep">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="surnamejuniorsep">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="juniorjuniorsep">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="surnamefirstnamesep">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="surnameinitialsep">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="etallimit">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="etaldisplay">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="etaltext">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="monthconversion">
- <cd:constant type="number"/>
- <cd:constant type="month"/>
- <cd:constant type="month:mnem"/>
- </cd:parameter>
- <cd:parameter name="authorconversion">
- <cd:constant type="normal"/>
- <cd:constant type="inverted"/>
- <cd:constant type="normalshort"/>
- <cd:constant type="invertedshort"/>
- </cd:parameter>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
-
- <cd:command name="definebtxlistvariant" file="publ-ini.mkiv" category="publications" hash="btxlistvariant">
- <cd:sequence>
- <cd:string value="definebtxlistvariant"/>
- </cd:sequence>
- <cd:arguments>
- <cd:keywords n="1">
- <cd:constant type="cd:name"/>
- </cd:keywords>
- </cd:arguments>
- </cd:command>
-
- <!-- variants -->
-
- <cd:command name="setupbtxcitevariant" file="publ-ini.mkiv" category="publications" hash="btxcitevariant">
- <cd:sequence>
- <cd:string value="setupbtxcitevariant"/>
- </cd:sequence>
- <cd:arguments>
- <cd:keywords n="1" optional="yes">
- <cd:constant type="cd:name"/>
- </cd:keywords>
- <cd:assignments n="2">
- <cd:parameter name="alternative">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="setups">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="interaction">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="andtext">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="otherstext">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="compress">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="putsep">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="lastputsep">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="inbetween">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="right">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="middle">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="left">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
-
- <cd:command name="definebtxcitevariant" file="publ-ini.mkiv" category="publications" hash="btxcitevariant">
- <cd:sequence>
- <cd:string value="definebtxcitevariant"/>
- </cd:sequence>
- <cd:arguments>
- <cd:keywords n="1">
- <cd:constant type="cd:name"/>
- </cd:keywords>
- <cd:keywords n="2" optional="yes">
- <cd:constant type="cd:name"/>
- </cd:keywords>
- <cd:assignments n="3" optional="yes">
- <cd:inherit name="setupbtxvariant" n="3"/>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
-
- <!-- refering -->
-
- <cd:command name="cite" file="publ-ini.mkiv" category="publications">
- <cd:sequence>
- <cd:string value="cite"/>
- </cd:sequence>
- <cd:arguments>
- <cd:keywords n="1" optional="yes">
- <cd:constant type="cd:name"/>
- </cd:keywords>
- <cd:keywords n="2">
- <cd:constant type="cd:name"/>
- </cd:keywords>
- </cd:arguments>
- </cd:command>
-
- <cd:command name="nocite" file="publ-ini.mkiv" category="publications">
- <cd:sequence>
- <cd:string value="nocite"/>
- </cd:sequence>
- <cd:arguments>
- <cd:keywords n="1">
- <cd:constant type="cd:name"/>
- </cd:keywords>
- </cd:arguments>
- </cd:command>
-
- <!-- list entries -->
-
-
- <cd:command name="setupbtxlist" file="publ-ini.mkiv" category="publications" hash="btxlist">
- <cd:sequence>
- <cd:string value="setupbtxlist"/>
- </cd:sequence>
- <cd:arguments>
- <cd:assignments n="1">
- <cd:parameter name="alternative">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="style">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="color">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="headstyle">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="headcolor">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="width">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="distance">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="hang">
- <cd:constant type="cd:number"/>
- </cd:parameter>
- <cd:parameter name="align">
- <cd:resolve name="align"/>
- </cd:parameter>
- <cd:parameter name="headalign">
- <cd:resolve name="symalign"/>
- </cd:parameter>
- <cd:parameter name="margin">
- <cd:constant type="cd:yes"/>
- <cd:constant type="cd:no"/>
- </cd:parameter>
- <cd:parameter name="before">
- <cd:constant type="cd:command" default="\blank"/>
- </cd:parameter>
- <cd:parameter name="inbetween">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="after">
- <cd:constant type="cd:command" default="\blank"/>
- </cd:parameter>
- <cd:parameter name="display">
- <cd:constant type="cd:yes"/>
- <cd:constant type="cd:no"/>
- </cd:parameter>
- <cd:parameter name="command">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
-
-
-</cd:interface>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/ctxtools.man b/Master/texmf-dist/doc/context/scripts/mkii/ctxtools.man
index 3eb988c9c44..38f10ef7c62 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/ctxtools.man
+++ b/Master/texmf-dist/doc/context/scripts/mkii/ctxtools.man
@@ -1,4 +1,4 @@
-.TH "ctxtools" "1" "01-01-2014" "version 1.3.5" "CtxTools"
+.TH "ctxtools" "1" "01-01-2015" "version 1.3.5" "CtxTools"
.SH NAME
.B ctxtools
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/imgtopdf.man b/Master/texmf-dist/doc/context/scripts/mkii/imgtopdf.man
index ade6ce4f3a6..864cf5a981b 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/imgtopdf.man
+++ b/Master/texmf-dist/doc/context/scripts/mkii/imgtopdf.man
@@ -1,4 +1,4 @@
-.TH "imgtopdf" "1" "01-01-2014" "version 1.1.2" "ImgToPdf"
+.TH "imgtopdf" "1" "01-01-2015" "version 1.1.2" "ImgToPdf"
.SH NAME
.B imgtopdf
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/pdftools.man b/Master/texmf-dist/doc/context/scripts/mkii/pdftools.man
index ddbebe386c0..f63bf7e39eb 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/pdftools.man
+++ b/Master/texmf-dist/doc/context/scripts/mkii/pdftools.man
@@ -1,4 +1,4 @@
-.TH "pdftools" "1" "01-01-2014" "version 1.2.1" "PDFTools"
+.TH "pdftools" "1" "01-01-2015" "version 1.2.1" "PDFTools"
.SH NAME
.B pdftools
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/pstopdf.man b/Master/texmf-dist/doc/context/scripts/mkii/pstopdf.man
index 9a8e5c6379b..8203e76cc19 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/pstopdf.man
+++ b/Master/texmf-dist/doc/context/scripts/mkii/pstopdf.man
@@ -1,4 +1,4 @@
-.TH "pstopdf" "1" "01-01-2014" "version 2.0.1" "PStoPDF"
+.TH "pstopdf" "1" "01-01-2015" "version 2.0.1" "PStoPDF"
.SH NAME
.B pstopdf
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/rlxtools.man b/Master/texmf-dist/doc/context/scripts/mkii/rlxtools.man
index a42a80c38f2..58e7032d8dd 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/rlxtools.man
+++ b/Master/texmf-dist/doc/context/scripts/mkii/rlxtools.man
@@ -1,4 +1,4 @@
-.TH "rlxtools" "1" "01-01-2014" "version 1.0.1" "RlxTools"
+.TH "rlxtools" "1" "01-01-2015" "version 1.0.1" "RlxTools"
.SH NAME
.B rlxtools
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/texexec.man b/Master/texmf-dist/doc/context/scripts/mkii/texexec.man
index cfefa9a74a6..841622bcda1 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/texexec.man
+++ b/Master/texmf-dist/doc/context/scripts/mkii/texexec.man
@@ -1,4 +1,4 @@
-.TH "texexec" "1" "01-01-2014" "version 6.2.1" "TeXExec"
+.TH "texexec" "1" "01-01-2015" "version 6.2.1" "TeXExec"
.SH NAME
.B texexec
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.html b/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.html
index 8d44012bfee..ed149a0d09d 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.html
+++ b/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.html
@@ -40,6 +40,7 @@
<tr><th style="width: 10em">flag</th><th style="width: 8em">value</th><th>description</th></tr>
<tr><th/><td/><td/></tr>
<tr><th>--script</th><td></td><td>run an mtx script (lua prefered method) (--noquotes), no script gives list</td></tr>
+ <tr><th>--evaluate</th><td></td><td>run code passed on the commandline (between quotes)</td></tr>
<tr><th>--execute</th><td></td><td>run a script or program (texmfstart method) (--noquotes)</td></tr>
<tr><th>--resolve</th><td></td><td>resolve prefixed arguments</td></tr>
<tr><th>--ctxlua</th><td></td><td>run internally (using preloaded libs)</td></tr>
@@ -62,6 +63,7 @@
<tr><th>--verbose</th><td></td><td>give a bit more info</td></tr>
<tr><th>--trackers</th><td>list</td><td>enable given trackers</td></tr>
<tr><th>--progname</th><td>str</td><td>format or backend</td></tr>
+ <tr><th>--systeminfo</th><td>str</td><td>show current operating system, processor, etc</td></tr>
<tr><th/><td/><td/></tr>
<tr><th>--edit</th><td></td><td>launch editor with found file</td></tr>
<tr><th>--launch</th><td></td><td>launch files like manuals, assumes os support (--all)</td></tr>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.man b/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.man
index 77dc02dc5c5..8a3a75b64a5 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.man
+++ b/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.man
@@ -1,4 +1,4 @@
-.TH "mtxrun" "1" "01-01-2014" "version 1.31" "ConTeXt TDS Runner Tool"
+.TH "mtxrun" "1" "01-01-2015" "version 1.31" "ConTeXt TDS Runner Tool"
.SH NAME
.B mtxrun
.SH SYNOPSIS
@@ -14,6 +14,9 @@
.B --script
run an mtx script (lua prefered method) (--noquotes), no script gives list
.TP
+.B --evaluate
+run code passed on the commandline (between quotes)
+.TP
.B --execute
run a script or program (texmfstart method) (--noquotes)
.TP
@@ -71,6 +74,9 @@ enable given trackers
.B --progname=str
format or backend
.TP
+.B --systeminfo=str
+show current operating system, processor, etc
+.TP
.B --edit
launch editor with found file
.TP
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.xml b/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.xml
index 249a9bb54ad..c7e71954160 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.xml
+++ b/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.xml
@@ -8,6 +8,7 @@
<category name="basic">
<subcategory>
<flag name="script"><short>run an mtx script (lua prefered method) (<ref name="noquotes"/>), no script gives list</short></flag>
+ <flag name="evaluate"><short>run code passed on the commandline (between quotes)</short></flag>
<flag name="execute"><short>run a script or program (texmfstart method) (<ref name="noquotes"/>)</short></flag>
<flag name="resolve"><short>resolve prefixed arguments</short></flag>
<flag name="ctxlua"><short>run internally (using preloaded libs)</short></flag>
@@ -33,6 +34,7 @@
<flag name="verbose"><short>give a bit more info</short></flag>
<flag name="trackers" value="list"><short>enable given trackers</short></flag>
<flag name="progname" value="str"><short>format or backend</short></flag>
+ <flag name="systeminfo" value="str"><short>show current operating system, processor, etc</short></flag>
</subcategory>
<subcategory>
<flag name="edit"><short>launch editor with found file</short></flag>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/textools.man b/Master/texmf-dist/doc/context/scripts/mkii/textools.man
index ce26c5172c3..c256969fddd 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/textools.man
+++ b/Master/texmf-dist/doc/context/scripts/mkii/textools.man
@@ -1,4 +1,4 @@
-.TH "textools" "1" "01-01-2014" "version 1.3.1" "TeXTools"
+.TH "textools" "1" "01-01-2015" "version 1.3.1" "TeXTools"
.SH NAME
.B textools
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/texutil.man b/Master/texmf-dist/doc/context/scripts/mkii/texutil.man
index 0dab17baa11..c92f51a6fb4 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/texutil.man
+++ b/Master/texmf-dist/doc/context/scripts/mkii/texutil.man
@@ -1,4 +1,4 @@
-.TH "texutil" "1" "01-01-2014" "version 9.1.0" "TeXUtil"
+.TH "texutil" "1" "01-01-2015" "version 9.1.0" "TeXUtil"
.SH NAME
.B texutil
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/tmftools.man b/Master/texmf-dist/doc/context/scripts/mkii/tmftools.man
index 98044171905..780efb7ebfb 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/tmftools.man
+++ b/Master/texmf-dist/doc/context/scripts/mkii/tmftools.man
@@ -1,4 +1,4 @@
-.TH "tmftools" "1" "01-01-2014" "version 1.1.0" "TMFTools"
+.TH "tmftools" "1" "01-01-2015" "version 1.1.0" "TMFTools"
.SH NAME
.B tmftools
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/xmltools.man b/Master/texmf-dist/doc/context/scripts/mkii/xmltools.man
index 2e61a14314e..d43cc1a03ad 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/xmltools.man
+++ b/Master/texmf-dist/doc/context/scripts/mkii/xmltools.man
@@ -1,4 +1,4 @@
-.TH "xmltools" "1" "01-01-2014" "version 1.2.2" "XMLTools"
+.TH "xmltools" "1" "01-01-2015" "version 1.2.2" "XMLTools"
.SH NAME
.B xmltools
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/context.html b/Master/texmf-dist/doc/context/scripts/mkiv/context.html
index 0833089aaba..b409de6e738 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/context.html
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/context.html
@@ -14,7 +14,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
- <title>ConTeXt Process Management 0.60</title>
+ <title>ConTeXt Process Management 0.61</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<style type="text/css">
body { color: #FFFFFF; background-color: #808080; font-family: optima, verdana, futura, "lucida sans", arial, geneva, helvetica, sans; font-size: 12px; line-height: 18px; } a:link, a:active, a:visited { color: #FFFFFF; } a.dir-view:link, a.dir-view:active, a.dir-view:visited { color: #FFFFFF; text-decoration: underline; } .valid { color: #00FF00; } .invalid { color: #FF0000; } button, .commonlink, .smallbutton { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; border-color: #7F7F7F; border-style: solid; border-width: .125ex; background-color: #FFFFFF; padding: .5ex; } .smallbutton { width: 1em; } a.commonlink:link, a.commonlink:active, a.commonlink:visited, a.smalllink:link, a.smalllink:active, a.smalllink:visited { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; } h1, .title { font-style: normal; font-weight: normal; font-size: 18px; line-height: 18px; margin-bottom: 20px; } h2, .subtitle { font-style: normal; font-weight: normal; font-size: 12px; margin-top: 18px; margin-bottom: 18px; } table { line-height: 18px; font-size: 12px; margin: 0; } th { font-weight: bold; text-align: left; padding-bottom: 6px; } .tc { font-weight: bold; text-align: left; } p, li { max-width: 60em; } .empty-line { margin-top: 4px; } .more-room { margin-right: 1.5em; } .much-more-room { margin-right: 3em; } #main { position: absolute; left: 10%; top: 10%; right: 10%; bottom: 10%; z-index: 2; width: 80%; height: 80%; padding: 0%; margin: 0%; overflow: auto; border-style: none; border-width: 0; background-color: #3F3F3F; } #main-settings { margin: 12px; x_max-width: 60em; line-height: 18px; font-size: 12px; } #left { position: absolute; top : 10%; left: 0%; bottom: 0%; right: 90%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; } #right { position: absolute; top : 0%; left: 90%; bottom: 10%; right: 0%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; _margin-left: -15px; } #bottom { position: absolute; left: 10%; right: 0%; top: 90%; bottom: 0%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top { position: absolute; left: 0%; right: 10%; top: 0%; bottom: 90%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #top-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: right; vertical-align: middle; } #bottom-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #bottom-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: left; vertical-align: middle; } #left-one { position: absolute; width: 100%; buggedheight: 100%; } #left-two { position: relative; margin-top: 12px; line-height: 18px; text-align: center; vertical-align: top; } #right-one { display: table; height: 100%; width: 100%; } #right-two { display: table-row; height: 100%; width: 100%; } #right-three { display: table-cell; width: 100%; vertical-align: bottom; _position: absolute; _top: 100%; } #right-four { text-align: center; margin-bottom: 2ex; _position: relative; _top: -100%; } #more-top { position: absolute; top: 0%; left: 90%; bottom: 90%; right: 0%; z-index: 3; width: 10%; height: 10%; padding: 0%; margin: 0%; border-style: none; border-width: 0; } #more-top-settings { text-align: center; } #more-right-settings { margin-right: 12px; margin-left: 12px; line-height: 18px; font-size: 10px; text-align: center; } #right-safari { _display: table; width: 100%; height: 100%; }
@@ -24,7 +24,7 @@
</head>
<body>
<div id="top"> <div id="top-one">
- <div id="top-two">ConTeXt Process Management 0.60 </div>
+ <div id="top-two">ConTeXt Process Management 0.61 </div>
</div>
</div>
<div id="bottom"> <div id="bottom-one">
@@ -95,6 +95,8 @@
<tr><th>--update</th><td></td><td>update context from website (not to be confused with contextgarden)</td></tr>
<tr><th>--profile</th><td></td><td>profile job (use: mtxrun --script profile --analyze)</td></tr>
<tr><th>--timing</th><td></td><td>generate timing and statistics overview</td></tr>
+ <tr><th>--keeptuc</th><td></td><td>keep previous tuc files (jobname-tuc-[run].tmp)</td></tr>
+ <tr><th>--keeplog</th><td></td><td>keep previous log files (jobname-log-[run].tmp)</td></tr>
<tr><th/><td/><td/></tr>
<tr><th>--extra=name</th><td></td><td>process extra (mtx-context-... in distribution)</td></tr>
<tr><th>--extras</th><td></td><td>show extras</td></tr>
@@ -105,6 +107,8 @@
<tr><th>--mkii</th><td></td><td>process file with texexec</td></tr>
<tr><th/><td/><td/></tr>
<tr><th>--pipe</th><td></td><td>do not check for file and enter scroll mode (--dummyfile=whatever.tmp)</td></tr>
+ <tr><th/><td/><td/></tr>
+ <tr><th>--sandbox</th><td></td><td>process file in a limited environment</td></tr>
</table>
<br/>
</div>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/context.man b/Master/texmf-dist/doc/context/scripts/mkiv/context.man
index c1808f0735a..0c2f607f21d 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/context.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/context.man
@@ -1,4 +1,4 @@
-.TH "mtx-context" "1" "01-01-2014" "version 0.60" "ConTeXt Process Management"
+.TH "mtx-context" "1" "01-01-2015" "version 0.60" "ConTeXt Process Management"
.SH NAME
.B mtx-context
.SH SYNOPSIS
@@ -141,6 +141,12 @@ profile job (use: mtxrun --script profile --analyze)
.B --timing
generate timing and statistics overview
.TP
+.B --keeptuc
+keep previous tuc files (jobname-tuc-[run].tmp)
+.TP
+.B --keeplog
+keep previous log files (jobname-log-[run].tmp)
+.TP
.B --extra=name
process extra (mtx-context-... in distribution)
.TP
@@ -159,6 +165,9 @@ process file with texexec
.TP
.B --pipe
do not check for file and enter scroll mode (--dummyfile=whatever.tmp)
+.TP
+.B --sandbox
+process file in a limited environment
.SH AUTHOR
More information about ConTeXt and the tools that come with it can be found at:
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/context.xml b/Master/texmf-dist/doc/context/scripts/mkiv/context.xml
index af8d5cc20e5..c4109328900 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/context.xml
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/context.xml
@@ -142,7 +142,7 @@
<short>assume given file present elsewhere</short>
</flag>
<flag name="nofile">
- <short>use dummy file as jobname</short>
+ <short>use dummy file as jobname</short>
</flag>
</subcategory>
</category>
@@ -152,16 +152,22 @@
<short>update context version number (also provide <ref name="expert"/>, optionally provide <ref name="basepath"/>)</short>
</flag>
<flag name="nostatistics">
- <short>omit runtime statistics at the end of the run</short>
+ <short>omit runtime statistics at the end of the run</short>
</flag>
<flag name="update">
- <short>update context from website (not to be confused with contextgarden)</short>
+ <short>update context from website (not to be confused with contextgarden)</short>
</flag>
- <flag name="profile">
- <short>profile job (use: mtxrun <ref name="script"/> profile <ref name="analyze"/>)</short>
+ <flag name="profile">
+ <short>profile job (use: mtxrun <ref name="script"/> profile <ref name="analyze"/>)</short>
</flag>
- <flag name="timing">
- <short>generate timing and statistics overview</short>
+ <flag name="timing">
+ <short>generate timing and statistics overview</short>
+ </flag>
+ <flag name="keeptuc">
+ <short>keep previous tuc files (jobname-tuc-[run].tmp)</short>
+ </flag>
+ <flag name="keeplog">
+ <short>keep previous log files (jobname-log-[run].tmp)</short>
</flag>
</subcategory>
<subcategory>
@@ -190,6 +196,11 @@
<short>do not check for file and enter scroll mode (<ref name="dummyfile"/>=whatever.tmp)</short>
</flag>
</subcategory>
+ <subcategory>
+ <flag name="sandbox">
+ <short>process file in a limited environment</short>
+ </flag>
+ </subcategory>
</category>
</flags>
</application>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/luatools.man b/Master/texmf-dist/doc/context/scripts/mkiv/luatools.man
index 72dea580063..ecdd6aa326a 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/luatools.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/luatools.man
@@ -1,4 +1,4 @@
-.TH "luatools" "1" "01-01-2014" "version 1.35" "ConTeXt TDS Management Tool (aka luatools)"
+.TH "luatools" "1" "01-01-2015" "version 1.35" "ConTeXt TDS Management Tool (aka luatools)"
.SH NAME
.B luatools
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-babel.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-babel.man
index 6f78cf43d2b..8477eb522e2 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-babel.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-babel.man
@@ -1,4 +1,4 @@
-.TH "mtx-babel" "1" "01-01-2014" "version 1.20" "Babel Input To UTF Conversion"
+.TH "mtx-babel" "1" "01-01-2015" "version 1.20" "Babel Input To UTF Conversion"
.SH NAME
.B mtx-babel
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-base.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-base.man
index 84d67a3fe29..08e13b09d67 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-base.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-base.man
@@ -1,4 +1,4 @@
-.TH "mtx-base" "1" "01-01-2014" "version 1.35" "ConTeXt TDS Management Tool (aka luatools)"
+.TH "mtx-base" "1" "01-01-2015" "version 1.35" "ConTeXt TDS Management Tool (aka luatools)"
.SH NAME
.B mtx-base
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-bibtex.html b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-bibtex.html
deleted file mode 100644
index ba1591b4bee..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-bibtex.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<!-- compare with lmx framework variant -->
-
-<!--
- filename : context-base.xml
- comment : companion to mtx-server-ctx-startup.tex
- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
- copyright: PRAGMA ADE / ConTeXt Development Team
- license : see context related readme files
--->
-
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
- <head>
- <title>bibtex helpers</title>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
- <style type="text/css">
- body { color: #FFFFFF; background-color: #808080; font-family: optima, verdana, futura, "lucida sans", arial, geneva, helvetica, sans; font-size: 12px; line-height: 18px; } a:link, a:active, a:visited { color: #FFFFFF; } a.dir-view:link, a.dir-view:active, a.dir-view:visited { color: #FFFFFF; text-decoration: underline; } .valid { color: #00FF00; } .invalid { color: #FF0000; } button, .commonlink, .smallbutton { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; border-color: #7F7F7F; border-style: solid; border-width: .125ex; background-color: #FFFFFF; padding: .5ex; } .smallbutton { width: 1em; } a.commonlink:link, a.commonlink:active, a.commonlink:visited, a.smalllink:link, a.smalllink:active, a.smalllink:visited { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; } h1, .title { font-style: normal; font-weight: normal; font-size: 18px; line-height: 18px; margin-bottom: 20px; } h2, .subtitle { font-style: normal; font-weight: normal; font-size: 12px; margin-top: 18px; margin-bottom: 18px; } table { line-height: 18px; font-size: 12px; margin: 0; } th { font-weight: bold; text-align: left; padding-bottom: 6px; } .tc { font-weight: bold; text-align: left; } p, li { max-width: 60em; } .empty-line { margin-top: 4px; } .more-room { margin-right: 1.5em; } .much-more-room { margin-right: 3em; } #main { position: absolute; left: 10%; top: 10%; right: 10%; bottom: 10%; z-index: 2; width: 80%; height: 80%; padding: 0%; margin: 0%; overflow: auto; border-style: none; border-width: 0; background-color: #3F3F3F; } #main-settings { margin: 12px; x_max-width: 60em; line-height: 18px; font-size: 12px; } #left { position: absolute; top : 10%; left: 0%; bottom: 0%; right: 90%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; } #right { position: absolute; top : 0%; left: 90%; bottom: 10%; right: 0%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; _margin-left: -15px; } #bottom { position: absolute; left: 10%; right: 0%; top: 90%; bottom: 0%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top { position: absolute; left: 0%; right: 10%; top: 0%; bottom: 90%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #top-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: right; vertical-align: middle; } #bottom-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #bottom-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: left; vertical-align: middle; } #left-one { position: absolute; width: 100%; buggedheight: 100%; } #left-two { position: relative; margin-top: 12px; line-height: 18px; text-align: center; vertical-align: top; } #right-one { display: table; height: 100%; width: 100%; } #right-two { display: table-row; height: 100%; width: 100%; } #right-three { display: table-cell; width: 100%; vertical-align: bottom; _position: absolute; _top: 100%; } #right-four { text-align: center; margin-bottom: 2ex; _position: relative; _top: -100%; } #more-top { position: absolute; top: 0%; left: 90%; bottom: 90%; right: 0%; z-index: 3; width: 10%; height: 10%; padding: 0%; margin: 0%; border-style: none; border-width: 0; } #more-top-settings { text-align: center; } #more-right-settings { margin-right: 12px; margin-left: 12px; line-height: 18px; font-size: 10px; text-align: center; } #right-safari { _display: table; width: 100%; height: 100%; }
- </style>
- <style type="text/css">
- </style>
- </head>
- <body>
- <div id="top"> <div id="top-one">
- <div id="top-two">bibtex helpers </div>
- </div>
- </div>
- <div id="bottom"> <div id="bottom-one">
- <div id="bottom-two">wiki: http://contextgarden.net | mail: ntg-context@ntg.nl | website: http://www.pragma-ade.nl</div>
- </div>
- </div>
- <div id="left"></div>
- <div id="right"></div>
- <div id="main">
- <div id='main-settings'>
- <h1>Command line options</h1>
-<table>
- <tr><th style="width: 10em">flag</th><th style="width: 8em">value</th><th>description</th></tr>
- <tr><th/><td/><td/></tr>
- <tr><th>--toxml</th><td></td><td>convert bibtex database(s) to xml</td></tr>
- <tr><th>--tolua</th><td></td><td>convert bibtex database(s) to lua</td></tr>
- </table>
-<br/>
-<h1>Example</h1>
-<tt>mtxrun --script bibtex --tolua bibl-001.bib</tt>
-<br/><tt>mtxrun --script bibtex --tolua --simple bibl-001.bib</tt>
-<br/><tt>mtxrun --script bibtex --toxml bibl-001.bib bibl-002.bib bibl-003.bib biblio.xml</tt>
-<br/><br/> </div>
- </div>
- </body>
- </html>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-bibtex.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-bibtex.man
deleted file mode 100644
index cedf41b8bc6..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-bibtex.man
+++ /dev/null
@@ -1,30 +0,0 @@
-.TH "mtx-bibtex" "1" "01-01-2014" "version 1.00" "bibtex helpers"
-.SH NAME
-.B mtx-bibtex
-.SH SYNOPSIS
-.B mtxrun --script bibtex [
-.I OPTIONS ...
-.B ] [
-.I FILENAMES
-.B ]
-.SH DESCRIPTION
-.B bibtex helpers
-.SH OPTIONS
-.TP
-.B --toxml
-convert bibtex database(s) to xml
-.TP
-.B --tolua
-convert bibtex database(s) to lua
-.SH AUTHOR
-More information about ConTeXt and the tools that come with it can be found at:
-
-
-.B "maillist:"
-ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
-
-.B "webpage:"
-http://www.pragma-ade.nl / http://tex.aanhet.net
-
-.B "wiki:"
-http://contextgarden.net
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-bibtex.xml b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-bibtex.xml
deleted file mode 100644
index b33e1809c37..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-bibtex.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0"?>
-<application>
- <metadata>
- <entry name="name">mtx-bibtex</entry>
- <entry name="detail">bibtex helpers</entry>
- <entry name="version">1.00</entry>
- </metadata>
- <flags>
- <category name="basic">
- <subcategory>
- <flag name="toxml"><short>convert bibtex database(s) to xml</short></flag>
- <flag name="tolua"><short>convert bibtex database(s) to lua</short></flag>
- </subcategory>
- </category>
- </flags>
- <examples>
- <category>
- <title>Example</title>
- <subcategory>
- <example><command>mtxrun --script bibtex --tolua bibl-001.bib</command></example>
- <example><command>mtxrun --script bibtex --tolua --simple bibl-001.bib</command></example>
- <example><command>mtxrun --script bibtex --toxml bibl-001.bib bibl-002.bib bibl-003.bib biblio.xml</command></example>
- </subcategory>
- </category>
- </examples>
-</application>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-cache.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-cache.man
index 02f8a2ec470..a7acb8b2e86 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-cache.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-cache.man
@@ -1,4 +1,4 @@
-.TH "mtx-cache" "1" "01-01-2014" "version 0.10" "ConTeXt &error; MetaTeX Cache Management"
+.TH "mtx-cache" "1" "01-01-2015" "version 0.10" "ConTeXt &error; MetaTeX Cache Management"
.SH NAME
.B mtx-cache
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-chars.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-chars.man
index 749f6315edb..5c9d79bb3b8 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-chars.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-chars.man
@@ -1,4 +1,4 @@
-.TH "mtx-chars" "1" "01-01-2014" "version 0.10" "MkII Character Table Generators"
+.TH "mtx-chars" "1" "01-01-2015" "version 0.10" "MkII Character Table Generators"
.SH NAME
.B mtx-chars
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-check.html b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-check.html
index bf1f7da131a..0ebbe750f64 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-check.html
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-check.html
@@ -39,7 +39,7 @@
<table>
<tr><th style="width: 10em">flag</th><th style="width: 8em">value</th><th>description</th></tr>
<tr><th/><td/><td/></tr>
- <tr><th>--convert</th><td></td><td>check tex file for errors</td></tr>
+ <tr><th>--check</th><td></td><td>check tex file for errors</td></tr>
</table>
<br/>
</div>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-check.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-check.man
index 3893081cbb6..ca18bc1a601 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-check.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-check.man
@@ -1,4 +1,4 @@
-.TH "mtx-check" "1" "01-01-2014" "version 0.10" "Basic ConTeXt Syntax Checking"
+.TH "mtx-check" "1" "01-01-2015" "version 0.10" "Basic ConTeXt Syntax Checking"
.SH NAME
.B mtx-check
.SH SYNOPSIS
@@ -11,7 +11,7 @@
.B Basic ConTeXt Syntax Checking
.SH OPTIONS
.TP
-.B --convert
+.B --check
check tex file for errors
.SH AUTHOR
More information about ConTeXt and the tools that come with it can be found at:
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-check.xml b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-check.xml
index a8dcb82fdca..b1c5163131b 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-check.xml
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-check.xml
@@ -8,7 +8,7 @@
<flags>
<category name="basic">
<subcategory>
- <flag name="convert"><short>check tex file for errors</short></flag>
+ <flag name="check"><short>check tex file for errors</short></flag>
</subcategory>
</category>
</flags>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-colors.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-colors.man
index 68959ae744b..a969e474cbc 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-colors.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-colors.man
@@ -1,4 +1,4 @@
-.TH "mtx-colors" "1" "01-01-2014" "version 0.10" "ConTeXt Color Management"
+.TH "mtx-colors" "1" "01-01-2015" "version 0.10" "ConTeXt Color Management"
.SH NAME
.B mtx-colors
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.html b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.html
index 0833089aaba..b409de6e738 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.html
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.html
@@ -14,7 +14,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
- <title>ConTeXt Process Management 0.60</title>
+ <title>ConTeXt Process Management 0.61</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<style type="text/css">
body { color: #FFFFFF; background-color: #808080; font-family: optima, verdana, futura, "lucida sans", arial, geneva, helvetica, sans; font-size: 12px; line-height: 18px; } a:link, a:active, a:visited { color: #FFFFFF; } a.dir-view:link, a.dir-view:active, a.dir-view:visited { color: #FFFFFF; text-decoration: underline; } .valid { color: #00FF00; } .invalid { color: #FF0000; } button, .commonlink, .smallbutton { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; border-color: #7F7F7F; border-style: solid; border-width: .125ex; background-color: #FFFFFF; padding: .5ex; } .smallbutton { width: 1em; } a.commonlink:link, a.commonlink:active, a.commonlink:visited, a.smalllink:link, a.smalllink:active, a.smalllink:visited { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; } h1, .title { font-style: normal; font-weight: normal; font-size: 18px; line-height: 18px; margin-bottom: 20px; } h2, .subtitle { font-style: normal; font-weight: normal; font-size: 12px; margin-top: 18px; margin-bottom: 18px; } table { line-height: 18px; font-size: 12px; margin: 0; } th { font-weight: bold; text-align: left; padding-bottom: 6px; } .tc { font-weight: bold; text-align: left; } p, li { max-width: 60em; } .empty-line { margin-top: 4px; } .more-room { margin-right: 1.5em; } .much-more-room { margin-right: 3em; } #main { position: absolute; left: 10%; top: 10%; right: 10%; bottom: 10%; z-index: 2; width: 80%; height: 80%; padding: 0%; margin: 0%; overflow: auto; border-style: none; border-width: 0; background-color: #3F3F3F; } #main-settings { margin: 12px; x_max-width: 60em; line-height: 18px; font-size: 12px; } #left { position: absolute; top : 10%; left: 0%; bottom: 0%; right: 90%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; } #right { position: absolute; top : 0%; left: 90%; bottom: 10%; right: 0%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; _margin-left: -15px; } #bottom { position: absolute; left: 10%; right: 0%; top: 90%; bottom: 0%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top { position: absolute; left: 0%; right: 10%; top: 0%; bottom: 90%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #top-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: right; vertical-align: middle; } #bottom-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #bottom-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: left; vertical-align: middle; } #left-one { position: absolute; width: 100%; buggedheight: 100%; } #left-two { position: relative; margin-top: 12px; line-height: 18px; text-align: center; vertical-align: top; } #right-one { display: table; height: 100%; width: 100%; } #right-two { display: table-row; height: 100%; width: 100%; } #right-three { display: table-cell; width: 100%; vertical-align: bottom; _position: absolute; _top: 100%; } #right-four { text-align: center; margin-bottom: 2ex; _position: relative; _top: -100%; } #more-top { position: absolute; top: 0%; left: 90%; bottom: 90%; right: 0%; z-index: 3; width: 10%; height: 10%; padding: 0%; margin: 0%; border-style: none; border-width: 0; } #more-top-settings { text-align: center; } #more-right-settings { margin-right: 12px; margin-left: 12px; line-height: 18px; font-size: 10px; text-align: center; } #right-safari { _display: table; width: 100%; height: 100%; }
@@ -24,7 +24,7 @@
</head>
<body>
<div id="top"> <div id="top-one">
- <div id="top-two">ConTeXt Process Management 0.60 </div>
+ <div id="top-two">ConTeXt Process Management 0.61 </div>
</div>
</div>
<div id="bottom"> <div id="bottom-one">
@@ -95,6 +95,8 @@
<tr><th>--update</th><td></td><td>update context from website (not to be confused with contextgarden)</td></tr>
<tr><th>--profile</th><td></td><td>profile job (use: mtxrun --script profile --analyze)</td></tr>
<tr><th>--timing</th><td></td><td>generate timing and statistics overview</td></tr>
+ <tr><th>--keeptuc</th><td></td><td>keep previous tuc files (jobname-tuc-[run].tmp)</td></tr>
+ <tr><th>--keeplog</th><td></td><td>keep previous log files (jobname-log-[run].tmp)</td></tr>
<tr><th/><td/><td/></tr>
<tr><th>--extra=name</th><td></td><td>process extra (mtx-context-... in distribution)</td></tr>
<tr><th>--extras</th><td></td><td>show extras</td></tr>
@@ -105,6 +107,8 @@
<tr><th>--mkii</th><td></td><td>process file with texexec</td></tr>
<tr><th/><td/><td/></tr>
<tr><th>--pipe</th><td></td><td>do not check for file and enter scroll mode (--dummyfile=whatever.tmp)</td></tr>
+ <tr><th/><td/><td/></tr>
+ <tr><th>--sandbox</th><td></td><td>process file in a limited environment</td></tr>
</table>
<br/>
</div>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.man
index c1808f0735a..0c2f607f21d 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.man
@@ -1,4 +1,4 @@
-.TH "mtx-context" "1" "01-01-2014" "version 0.60" "ConTeXt Process Management"
+.TH "mtx-context" "1" "01-01-2015" "version 0.60" "ConTeXt Process Management"
.SH NAME
.B mtx-context
.SH SYNOPSIS
@@ -141,6 +141,12 @@ profile job (use: mtxrun --script profile --analyze)
.B --timing
generate timing and statistics overview
.TP
+.B --keeptuc
+keep previous tuc files (jobname-tuc-[run].tmp)
+.TP
+.B --keeplog
+keep previous log files (jobname-log-[run].tmp)
+.TP
.B --extra=name
process extra (mtx-context-... in distribution)
.TP
@@ -159,6 +165,9 @@ process file with texexec
.TP
.B --pipe
do not check for file and enter scroll mode (--dummyfile=whatever.tmp)
+.TP
+.B --sandbox
+process file in a limited environment
.SH AUTHOR
More information about ConTeXt and the tools that come with it can be found at:
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.xml b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.xml
index af8d5cc20e5..c4109328900 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.xml
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.xml
@@ -142,7 +142,7 @@
<short>assume given file present elsewhere</short>
</flag>
<flag name="nofile">
- <short>use dummy file as jobname</short>
+ <short>use dummy file as jobname</short>
</flag>
</subcategory>
</category>
@@ -152,16 +152,22 @@
<short>update context version number (also provide <ref name="expert"/>, optionally provide <ref name="basepath"/>)</short>
</flag>
<flag name="nostatistics">
- <short>omit runtime statistics at the end of the run</short>
+ <short>omit runtime statistics at the end of the run</short>
</flag>
<flag name="update">
- <short>update context from website (not to be confused with contextgarden)</short>
+ <short>update context from website (not to be confused with contextgarden)</short>
</flag>
- <flag name="profile">
- <short>profile job (use: mtxrun <ref name="script"/> profile <ref name="analyze"/>)</short>
+ <flag name="profile">
+ <short>profile job (use: mtxrun <ref name="script"/> profile <ref name="analyze"/>)</short>
</flag>
- <flag name="timing">
- <short>generate timing and statistics overview</short>
+ <flag name="timing">
+ <short>generate timing and statistics overview</short>
+ </flag>
+ <flag name="keeptuc">
+ <short>keep previous tuc files (jobname-tuc-[run].tmp)</short>
+ </flag>
+ <flag name="keeplog">
+ <short>keep previous log files (jobname-log-[run].tmp)</short>
</flag>
</subcategory>
<subcategory>
@@ -190,6 +196,11 @@
<short>do not check for file and enter scroll mode (<ref name="dummyfile"/>=whatever.tmp)</short>
</flag>
</subcategory>
+ <subcategory>
+ <flag name="sandbox">
+ <short>process file in a limited environment</short>
+ </flag>
+ </subcategory>
</category>
</flags>
</application>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-epub.html b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-epub.html
index 45015a34e94..9b63234bea1 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-epub.html
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-epub.html
@@ -14,7 +14,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
- <title>ConTeXt EPUB Helpers 0.12</title>
+ <title>ConTeXt EPUB Helpers 1.10</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<style type="text/css">
body { color: #FFFFFF; background-color: #808080; font-family: optima, verdana, futura, "lucida sans", arial, geneva, helvetica, sans; font-size: 12px; line-height: 18px; } a:link, a:active, a:visited { color: #FFFFFF; } a.dir-view:link, a.dir-view:active, a.dir-view:visited { color: #FFFFFF; text-decoration: underline; } .valid { color: #00FF00; } .invalid { color: #FF0000; } button, .commonlink, .smallbutton { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; border-color: #7F7F7F; border-style: solid; border-width: .125ex; background-color: #FFFFFF; padding: .5ex; } .smallbutton { width: 1em; } a.commonlink:link, a.commonlink:active, a.commonlink:visited, a.smalllink:link, a.smalllink:active, a.smalllink:visited { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; } h1, .title { font-style: normal; font-weight: normal; font-size: 18px; line-height: 18px; margin-bottom: 20px; } h2, .subtitle { font-style: normal; font-weight: normal; font-size: 12px; margin-top: 18px; margin-bottom: 18px; } table { line-height: 18px; font-size: 12px; margin: 0; } th { font-weight: bold; text-align: left; padding-bottom: 6px; } .tc { font-weight: bold; text-align: left; } p, li { max-width: 60em; } .empty-line { margin-top: 4px; } .more-room { margin-right: 1.5em; } .much-more-room { margin-right: 3em; } #main { position: absolute; left: 10%; top: 10%; right: 10%; bottom: 10%; z-index: 2; width: 80%; height: 80%; padding: 0%; margin: 0%; overflow: auto; border-style: none; border-width: 0; background-color: #3F3F3F; } #main-settings { margin: 12px; x_max-width: 60em; line-height: 18px; font-size: 12px; } #left { position: absolute; top : 10%; left: 0%; bottom: 0%; right: 90%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; } #right { position: absolute; top : 0%; left: 90%; bottom: 10%; right: 0%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; _margin-left: -15px; } #bottom { position: absolute; left: 10%; right: 0%; top: 90%; bottom: 0%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top { position: absolute; left: 0%; right: 10%; top: 0%; bottom: 90%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #top-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: right; vertical-align: middle; } #bottom-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #bottom-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: left; vertical-align: middle; } #left-one { position: absolute; width: 100%; buggedheight: 100%; } #left-two { position: relative; margin-top: 12px; line-height: 18px; text-align: center; vertical-align: top; } #right-one { display: table; height: 100%; width: 100%; } #right-two { display: table-row; height: 100%; width: 100%; } #right-three { display: table-cell; width: 100%; vertical-align: bottom; _position: absolute; _top: 100%; } #right-four { text-align: center; margin-bottom: 2ex; _position: relative; _top: -100%; } #more-top { position: absolute; top: 0%; left: 90%; bottom: 90%; right: 0%; z-index: 3; width: 10%; height: 10%; padding: 0%; margin: 0%; border-style: none; border-width: 0; } #more-top-settings { text-align: center; } #more-right-settings { margin-right: 12px; margin-left: 12px; line-height: 18px; font-size: 10px; text-align: center; } #right-safari { _display: table; width: 100%; height: 100%; }
@@ -24,7 +24,7 @@
</head>
<body>
<div id="top"> <div id="top-one">
- <div id="top-two">ConTeXt EPUB Helpers 0.12 </div>
+ <div id="top-two">ConTeXt EPUB Helpers 1.10 </div>
</div>
</div>
<div id="bottom"> <div id="bottom-one">
@@ -40,6 +40,11 @@
<tr><th style="width: 10em">flag</th><th style="width: 8em">value</th><th>description</th></tr>
<tr><th/><td/><td/></tr>
<tr><th>--make</th><td></td><td>create epub zip file</td></tr>
+ <tr><th>--purge</th><td></td><td>remove obsolete files</td></tr>
+ <tr><th>--rename</th><td></td><td>rename images to sane names</td></tr>
+ <tr><th>--svgmath</th><td></td><td>convert mathml to svg</td></tr>
+ <tr><th>--svgstyle</th><td></td><td>use given tex style for svg generation (overloads style in specification)</td></tr>
+ <tr><th>--all</th><td></td><td>assume: --purge --rename --svgmath (for fast testing)</td></tr>
</table>
<br/>
<h1>Example</h1>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-epub.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-epub.man
index 52bcd1d88f6..bb33c23df29 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-epub.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-epub.man
@@ -1,4 +1,4 @@
-.TH "mtx-epub" "1" "01-01-2014" "version 0.12" "ConTeXt EPUB Helpers"
+.TH "mtx-epub" "1" "01-01-2015" "version 1.10" "ConTeXt EPUB Helpers"
.SH NAME
.B mtx-epub
.SH SYNOPSIS
@@ -13,6 +13,21 @@
.TP
.B --make
create epub zip file
+.TP
+.B --purge
+remove obsolete files
+.TP
+.B --rename
+rename images to sane names
+.TP
+.B --svgmath
+convert mathml to svg
+.TP
+.B --svgstyle
+use given tex style for svg generation (overloads style in specification)
+.TP
+.B --all
+assume: --purge --rename --svgmath (for fast testing)
.SH AUTHOR
More information about ConTeXt and the tools that come with it can be found at:
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-epub.xml b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-epub.xml
index 5ef5dc81b39..4ef0f85e392 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-epub.xml
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-epub.xml
@@ -3,12 +3,17 @@
<metadata>
<entry name="name">mtx-epub</entry>
<entry name="detail">ConTeXt EPUB Helpers</entry>
- <entry name="version">0.12</entry>
+ <entry name="version">1.10</entry>
</metadata>
<flags>
<category name="basic">
<subcategory>
<flag name="make"><short>create epub zip file</short></flag>
+ <flag name="purge"><short>remove obsolete files</short></flag>
+ <flag name="rename"><short>rename images to sane names</short></flag>
+ <flag name="svgmath"><short>convert mathml to svg</short></flag>
+ <flag name="svgstyle"><short>use given tex style for svg generation (overloads style in specification)</short></flag>
+ <flag name="all"><short>assume: --purge --rename --svgmath (for fast testing)</short></flag>
</subcategory>
</category>
</flags>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fcd.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fcd.man
index 41d5120e09d..311f90e4a8a 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fcd.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fcd.man
@@ -1,4 +1,4 @@
-.TH "mtx-fcd" "1" "01-01-2014" "version 1.00" "Fast Directory Change"
+.TH "mtx-fcd" "1" "01-01-2015" "version 1.00" "Fast Directory Change"
.SH NAME
.B mtx-fcd
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-flac.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-flac.man
index 0d2c94308b0..4ab875899c6 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-flac.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-flac.man
@@ -1,4 +1,4 @@
-.TH "mtx-flac" "1" "01-01-2014" "version 0.10" "ConTeXt Flac Helpers"
+.TH "mtx-flac" "1" "01-01-2015" "version 0.10" "ConTeXt Flac Helpers"
.SH NAME
.B mtx-flac
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.html b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.html
index 3ddc2fa8ef6..97a16c79a0e 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.html
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.html
@@ -53,7 +53,7 @@
<tr><th>--filter</th><td>list</td><td>key-value pairs</td></tr>
<tr><th>--all</th><td></td><td>show all found instances (combined with other flags)</td></tr>
<tr><th>--info</th><td></td><td>give more details</td></tr>
- <tr><th>--track</th><td>list</td><td>enable trackers</td></tr>
+ <tr><th>--trackers</th><td>list</td><td>enable trackers</td></tr>
<tr><th>--statistics</th><td></td><td>some info about the database</td></tr>
</table>
<br/>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.man
index 9136e30fe58..c0806a32c8c 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.man
@@ -1,4 +1,4 @@
-.TH "mtx-fonts" "1" "01-01-2014" "version 0.21" "ConTeXt Font Database Management"
+.TH "mtx-fonts" "1" "01-01-2015" "version 0.21" "ConTeXt Font Database Management"
.SH NAME
.B mtx-fonts
.SH SYNOPSIS
@@ -44,7 +44,7 @@ show all found instances (combined with other flags)
.B --info
give more details
.TP
-.B --track=list
+.B --trackers=list
enable trackers
.TP
.B --statistics
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.xml b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.xml
index b138a064a26..c3c571ca82b 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.xml
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.xml
@@ -25,7 +25,7 @@
<flag name="filter" value="list"><short>key-value pairs</short></flag>
<flag name="all"><short>show all found instances (combined with other flags)</short></flag>
<flag name="info"><short>give more details</short></flag>
- <flag name="track" value="list"><short>enable trackers</short></flag>
+ <flag name="trackers" value="list"><short>enable trackers</short></flag>
<flag name="statistics"><short>some info about the database</short></flag>
</subcategory>
</category>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-grep.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-grep.man
index 4bc7ea62e57..6b85f541fd3 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-grep.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-grep.man
@@ -1,4 +1,4 @@
-.TH "mtx-grep" "1" "01-01-2014" "version 0.10" "Simple Grepper"
+.TH "mtx-grep" "1" "01-01-2015" "version 0.10" "Simple Grepper"
.SH NAME
.B mtx-grep
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-interface.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-interface.man
index 862fa08bc54..36bf8bc138b 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-interface.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-interface.man
@@ -1,4 +1,4 @@
-.TH "mtx-interface" "1" "01-01-2014" "version 0.13" "ConTeXt Interface Related Goodies"
+.TH "mtx-interface" "1" "01-01-2015" "version 0.13" "ConTeXt Interface Related Goodies"
.SH NAME
.B mtx-interface
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-metapost.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-metapost.man
index 0c60e33e26e..37b1b7c9f3a 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-metapost.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-metapost.man
@@ -1,4 +1,4 @@
-.TH "mtx-metapost" "1" "01-01-2014" "version 0.10" "MetaPost to PDF processor"
+.TH "mtx-metapost" "1" "01-01-2015" "version 0.10" "MetaPost to PDF processor"
.SH NAME
.B mtx-metapost
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-metatex.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-metatex.man
index a852686454a..72635044ff6 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-metatex.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-metatex.man
@@ -1,4 +1,4 @@
-.TH "mtx-metatex" "1" "01-01-2014" "version 0.10" "MetaTeX Process Management"
+.TH "mtx-metatex" "1" "01-01-2015" "version 0.10" "MetaTeX Process Management"
.SH NAME
.B mtx-metatex
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-modules.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-modules.man
index ebdc51c9ef1..a51a1b00e22 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-modules.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-modules.man
@@ -1,4 +1,4 @@
-.TH "mtx-modules" "1" "01-01-2014" "version 1.00" "ConTeXt Module Documentation Generators"
+.TH "mtx-modules" "1" "01-01-2015" "version 1.00" "ConTeXt Module Documentation Generators"
.SH NAME
.B mtx-modules
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-package.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-package.man
index 6df6cf0ca17..83c140f35f7 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-package.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-package.man
@@ -1,4 +1,4 @@
-.TH "mtx-package" "1" "01-01-2014" "version 0.10" "Distribution Related Goodies"
+.TH "mtx-package" "1" "01-01-2015" "version 0.10" "Distribution Related Goodies"
.SH NAME
.B mtx-package
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.html b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.html
index 07d5265c82a..8aa0d813233 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.html
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.html
@@ -46,6 +46,7 @@
<tr><th>--specification</th><td></td><td>additional patterns: e.g.: =cy,hyph-cy,welsh</td></tr>
<tr><th>--compress</th><td></td><td>compress data</td></tr>
<tr><th>--words</th><td></td><td>update words in given file</td></tr>
+ <tr><th>--hyphenate</th><td></td><td>show hypephenated words</td></tr>
</table>
<br/>
<h1>Examples</h1>
@@ -53,6 +54,7 @@
<br/><tt>mtxrun --script pattern --check --path=c:/data/develop/svn-hyphen/trunk/hyph-utf8/tex/generic/hyph-utf8/patterns</tt>
<br/><tt>mtxrun --script pattern --convert --path=c:/data/develop/svn-hyphen/trunk/hyph-utf8/tex/generic/hyph-utf8/patterns/tex --destination=e:/tmp/patterns</tt>
<br/><tt>mtxrun --script pattern --convert --path=c:/data/develop/svn-hyphen/trunk/hyph-utf8/tex/generic/hyph-utf8/patterns/txt --destination=e:/tmp/patterns</tt>
+<br/><tt>mtxrun --script pattern --hyphenate --language=nl --left=3 nogalwiedes inderdaad</tt>
<br/><br/> </div>
</div>
</body>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.man
index 3d6bf4d3c67..e93c1aff063 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.man
@@ -1,4 +1,4 @@
-.TH "mtx-patterns" "1" "01-01-2014" "version 0.20" "ConTeXt Pattern File Management"
+.TH "mtx-patterns" "1" "01-01-2015" "version 0.20" "ConTeXt Pattern File Management"
.SH NAME
.B mtx-patterns
.SH SYNOPSIS
@@ -31,6 +31,9 @@ compress data
.TP
.B --words
update words in given file
+.TP
+.B --hyphenate
+show hypephenated words
.SH AUTHOR
More information about ConTeXt and the tools that come with it can be found at:
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.xml b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.xml
index 132fd4d208c..86f3aa48011 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.xml
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.xml
@@ -15,6 +15,7 @@
<flag name="specification"><short>additional patterns: e.g.: =cy,hyph-cy,welsh</short></flag>
<flag name="compress"><short>compress data</short></flag>
<flag name="words"><short>update words in given file</short></flag>
+ <flag name="hyphenate"><short>show hypephenated words</short></flag>
</subcategory>
</category>
</flags>
@@ -26,6 +27,7 @@
<example><command>mtxrun --script pattern --check --path=c:/data/develop/svn-hyphen/trunk/hyph-utf8/tex/generic/hyph-utf8/patterns</command></example>
<example><command>mtxrun --script pattern --convert --path=c:/data/develop/svn-hyphen/trunk/hyph-utf8/tex/generic/hyph-utf8/patterns/tex --destination=e:/tmp/patterns</command></example>
<example><command>mtxrun --script pattern --convert --path=c:/data/develop/svn-hyphen/trunk/hyph-utf8/tex/generic/hyph-utf8/patterns/txt --destination=e:/tmp/patterns</command></example>
+ <example><command>mtxrun --script pattern --hyphenate --language=nl --left=3 nogalwiedes inderdaad</command></example>
</subcategory>
</category>
</examples>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-pdf.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-pdf.man
index 97914846200..29b5ad420c2 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-pdf.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-pdf.man
@@ -1,4 +1,4 @@
-.TH "mtx-pdf" "1" "01-01-2014" "version 0.10" "ConTeXt PDF Helpers"
+.TH "mtx-pdf" "1" "01-01-2015" "version 0.10" "ConTeXt PDF Helpers"
.SH NAME
.B mtx-pdf
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-plain.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-plain.man
index 717c9b6e153..c2e0e0bd9d5 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-plain.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-plain.man
@@ -1,4 +1,4 @@
-.TH "mtx-plain" "1" "01-01-2014" "version 1.00" "Plain TeX Runner"
+.TH "mtx-plain" "1" "01-01-2015" "version 1.00" "Plain TeX Runner"
.SH NAME
.B mtx-plain
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-profile.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-profile.man
index 9b4671f13cf..6aa8e2087a4 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-profile.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-profile.man
@@ -1,4 +1,4 @@
-.TH "mtx-profile" "1" "01-01-2014" "version 1.00" "ConTeXt MkIV LuaTeX Profiler"
+.TH "mtx-profile" "1" "01-01-2015" "version 1.00" "ConTeXt MkIV LuaTeX Profiler"
.SH NAME
.B mtx-profile
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-rsync.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-rsync.man
index 5119eae2907..195b6b0f0e4 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-rsync.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-rsync.man
@@ -1,4 +1,4 @@
-.TH "mtx-rsync" "1" "01-01-2014" "version 0.10" "Rsync Helpers"
+.TH "mtx-rsync" "1" "01-01-2015" "version 0.10" "Rsync Helpers"
.SH NAME
.B mtx-rsync
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-scite.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-scite.man
index 8f268c5541d..cbaed08d1bc 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-scite.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-scite.man
@@ -1,4 +1,4 @@
-.TH "mtx-scite" "1" "01-01-2014" "version 1.00" "Scite Helper Script"
+.TH "mtx-scite" "1" "01-01-2015" "version 1.00" "Scite Helper Script"
.SH NAME
.B mtx-scite
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-server.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-server.man
index a43fd449c4c..f3d3ae6e429 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-server.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-server.man
@@ -1,4 +1,4 @@
-.TH "mtx-server" "1" "01-01-2014" "version 0.10" "Simple Webserver For Helpers"
+.TH "mtx-server" "1" "01-01-2015" "version 0.10" "Simple Webserver For Helpers"
.SH NAME
.B mtx-server
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-texworks.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-texworks.man
index 21dd62fe46a..b9cc2ed98d7 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-texworks.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-texworks.man
@@ -1,4 +1,4 @@
-.TH "mtx-texworks" "1" "01-01-2014" "version 1.00" "TeXworks Startup Script"
+.TH "mtx-texworks" "1" "01-01-2015" "version 1.00" "TeXworks Startup Script"
.SH NAME
.B mtx-texworks
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-timing.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-timing.man
index 19aaca1732d..2f7584f3da7 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-timing.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-timing.man
@@ -1,4 +1,4 @@
-.TH "mtx-timing" "1" "01-01-2014" "version 0.10" "ConTeXt Timing Tools"
+.TH "mtx-timing" "1" "01-01-2015" "version 0.10" "ConTeXt Timing Tools"
.SH NAME
.B mtx-timing
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-tools.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-tools.man
index 45011d21d46..408d467cdbf 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-tools.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-tools.man
@@ -1,4 +1,4 @@
-.TH "mtx-tools" "1" "01-01-2014" "version 1.01" "Some File Related Goodies"
+.TH "mtx-tools" "1" "01-01-2015" "version 1.01" "Some File Related Goodies"
.SH NAME
.B mtx-tools
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-unzip.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-unzip.man
index ffddc1cf9a8..d9e2c844760 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-unzip.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-unzip.man
@@ -1,4 +1,4 @@
-.TH "mtx-unzip" "1" "01-01-2014" "version 0.10" "Simple Unzipper"
+.TH "mtx-unzip" "1" "01-01-2015" "version 0.10" "Simple Unzipper"
.SH NAME
.B mtx-unzip
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-update.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-update.man
index 60ba09fb579..e27c2ab43f0 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-update.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-update.man
@@ -1,4 +1,4 @@
-.TH "mtx-update" "1" "01-01-2014" "version 1.02" "ConTeXt Minimals Updater"
+.TH "mtx-update" "1" "01-01-2015" "version 1.02" "ConTeXt Minimals Updater"
.SH NAME
.B mtx-update
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-watch.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-watch.man
index babd2fcca5a..d8fab3acd5b 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-watch.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-watch.man
@@ -1,4 +1,4 @@
-.TH "mtx-watch" "1" "01-01-2014" "version 1.00" "ConTeXt Request Watchdog"
+.TH "mtx-watch" "1" "01-01-2015" "version 1.00" "ConTeXt Request Watchdog"
.SH NAME
.B mtx-watch
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-youless.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-youless.man
index c1e9594c1b0..2703ec34f79 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-youless.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-youless.man
@@ -1,4 +1,4 @@
-.TH "mtx-youless" "1" "01-01-2014" "version 1.00" "youless Fetcher"
+.TH "mtx-youless" "1" "01-01-2015" "version 1.00" "youless Fetcher"
.SH NAME
.B mtx-youless
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.html b/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.html
index f2c0e69fab7..6e414689983 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.html
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.html
@@ -40,6 +40,7 @@
<tr><th style="width: 10em">flag</th><th style="width: 8em">value</th><th>description</th></tr>
<tr><th/><td/><td/></tr>
<tr><th>--script</th><td></td><td>run an mtx script (lua prefered method) (--noquotes), no script gives list</td></tr>
+ <tr><th>--evaluate</th><td></td><td>run code passed on the commandline (between quotes)</td></tr>
<tr><th>--execute</th><td></td><td>run a script or program (texmfstart method) (--noquotes)</td></tr>
<tr><th>--resolve</th><td></td><td>resolve prefixed arguments</td></tr>
<tr><th>--ctxlua</th><td></td><td>run internally (using preloaded libs)</td></tr>
@@ -62,6 +63,7 @@
<tr><th>--verbose</th><td></td><td>give a bit more info</td></tr>
<tr><th>--trackers</th><td>list</td><td>enable given trackers</td></tr>
<tr><th>--progname</th><td>str</td><td>format or backend</td></tr>
+ <tr><th>--systeminfo</th><td>str</td><td>show current operating system, processor, etc</td></tr>
<tr><th/><td/><td/></tr>
<tr><th>--edit</th><td></td><td>launch editor with found file</td></tr>
<tr><th>--launch</th><td></td><td>launch files like manuals, assumes os support (--all)</td></tr>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.man
index 77dc02dc5c5..8a3a75b64a5 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.man
@@ -1,4 +1,4 @@
-.TH "mtxrun" "1" "01-01-2014" "version 1.31" "ConTeXt TDS Runner Tool"
+.TH "mtxrun" "1" "01-01-2015" "version 1.31" "ConTeXt TDS Runner Tool"
.SH NAME
.B mtxrun
.SH SYNOPSIS
@@ -14,6 +14,9 @@
.B --script
run an mtx script (lua prefered method) (--noquotes), no script gives list
.TP
+.B --evaluate
+run code passed on the commandline (between quotes)
+.TP
.B --execute
run a script or program (texmfstart method) (--noquotes)
.TP
@@ -71,6 +74,9 @@ enable given trackers
.B --progname=str
format or backend
.TP
+.B --systeminfo=str
+show current operating system, processor, etc
+.TP
.B --edit
launch editor with found file
.TP
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.xml b/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.xml
index f1b1e01f4b6..138afc96e08 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.xml
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.xml
@@ -9,6 +9,7 @@
<category name="basic">
<subcategory>
<flag name="script"><short>run an mtx script (lua prefered method) (<ref name="noquotes"/>), no script gives list</short></flag>
+ <flag name="evaluate"><short>run code passed on the commandline (between quotes)</short></flag>
<flag name="execute"><short>run a script or program (texmfstart method) (<ref name="noquotes"/>)</short></flag>
<flag name="resolve"><short>resolve prefixed arguments</short></flag>
<flag name="ctxlua"><short>run internally (using preloaded libs)</short></flag>
@@ -34,6 +35,7 @@
<flag name="verbose"><short>give a bit more info</short></flag>
<flag name="trackers" value="list"><short>enable given trackers</short></flag>
<flag name="progname" value="str"><short>format or backend</short></flag>
+ <flag name="systeminfo" value="str"><short>show current operating system, processor, etc</short></flag>
</subcategory>
<subcategory>
<flag name="edit"><short>launch editor with found file</short></flag>
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/epub/epub-mkiv-demo.tex b/Master/texmf-dist/doc/context/sources/general/manuals/epub/epub-mkiv-demo.tex
new file mode 100644
index 00000000000..b4b979874bb
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/epub/epub-mkiv-demo.tex
@@ -0,0 +1,43 @@
+
+% \usemodule[luacalls]
+
+\usemodule[mathml]
+
+\setupexternalfigures
+ [location=default]
+
+\setupbackend
+ [export=yes]
+
+\setupexport
+ [svgstyle=mathtest-style,
+ hyphen=yes,
+ width=60em]
+
+\setupbodyfont[pagella]
+
+\definefloat[graphic][graphics][figure]
+
+% \environment [mathtest-style]
+
+\starttext
+
+ \startsection[title=First]
+
+ \startitemize
+ \startitem one \stopitem
+ \startitem two \stopitem
+ \stopitemize
+
+ \startplacefigure[title=First]
+ \externalfigure[cow.pdf]
+ \stopplacefigure
+
+ \startplacegraphic[title=Second]
+ \externalfigure[cow.pdf]
+ \stopplacegraphic
+
+ some math: \m{e=mc^2}
+
+ \stopsection
+\stoptext
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/epub/epub-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/epub/epub-mkiv.tex
new file mode 100644
index 00000000000..6fc4ed9d4f0
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/epub/epub-mkiv.tex
@@ -0,0 +1,466 @@
+% language=uk
+
+% todo:
+%
+% metadata
+% properties
+% \dontleavehmode before hbox
+% cover page
+%
+% http://www.cnet.com/news/google-subtracts-mathml-from-chrome-and-anger-multiplies/
+
+% \usemodule[luacalls]
+
+\usemodule[art-01,abr-02]
+
+\definehighlight[notabene][style=bold]
+
+\definecolor[darkorange] [.70(green,red)]
+\definecolor[lightorange][.45(orange,white)]
+\definecolor[lesswhite] [.90(white)]
+
+\setuptyping[color=darkorange]
+\setuptype [color=darkorange]
+
+\starttext
+
+\startMPpage
+
+numeric w ; w := 21cm ;
+numeric h ; h := 29.7cm ;
+numeric ww ; ww := 9w/10 ;
+numeric oo ; oo := (w-ww) / 2 ;
+numeric hh ; hh := h/5.5 ;
+path p ; p := unitsquare xysized(w,h) ;
+
+color orange ; orange := \MPcolor{darkorange} ; % .7[green,red] ;
+
+fill p enlarged 2mm withcolor orange ;
+
+draw image (
+ draw anchored.top(
+ textext("\ttbf\setupinterlinespace[line=1.7ex]\framed[frame=off,align=middle,offset=0mm]{\smash{<div/>}\\\smash{<div >}\\\smash{</div>}}")
+ xsized w,
+ center topboundary p shifted (0,-12mm)) withcolor \MPcolor{lightorange} ; % 0.45[white,orange] ;
+ draw anchored.bot(
+ textext("\ssbf\setupinterlinespace[line=2.2ex]\framed[frame=off,align=middle]{exporting\\xml and epub\\from context}")
+ xsized w,
+ center bottomboundary p shifted (0,4mm)) withcolor \MPcolor {lesswhite} ; % 0.90white ;
+) ;
+
+setbounds currentpicture to p ;
+
+\stopMPpage
+
+\startsection[title=Introduction]
+
+There is a pretty long tradition of typesetting math with \TEX\ and it looks like
+this program will dominate for many more years. Even if we move to the web, the
+simple fact that support for \MATHML\ in some browsers is suboptimal will drive
+those who want a quality document to use \PDF\ instead.
+
+I'm writing this in 2014, at a time when \XML\ is widespread. The idea of \XML\ is
+that you code your data in a very structured way, so that it can be manipulated and
+(if needed) validated. Text has always been a target for \XML\ which is a follow|-|up
+to \SGML\ that was in use by publishers. Because \HTML\ is less structured (and also
+quite tolerant with respect to end tags) we prefer to use \XHTML\ but unfortunately
+support for that is less widespread.
+
+Interestingly, documents are probably among the more complex targets of the
+\XML\ format. The reason is that unless the author restricts him|/|herself or
+gets restricted by the publisher, tag abuse can happen. At \PRAGMA\ we mostly
+deal with education|-|related \XML\ and it's not always easy to come up with
+something that suits the specific needs of the educational concept behind a
+school method. Even if we start out nice and clean, eventually we end up with a
+polluted source, often with additional structure needed to satisfy the tools used
+for conversion.
+
+We have been supporting \XML\ from the day it showed up and most of our projects
+involve \XML\ in one way or the other. That doesn't mean that we don't use \TEX\
+for coding documents. This manual is for instance a regular \TEX\ document. In
+many ways a structured \TEX\ document is much more convenient to edit, especially
+if one wants to add a personal touch and do some local page make|-|up. On the other hand,
+diverting from standard structure commands makes the document less suitable for
+output other than \PDF. There is simply no final solution for coding a document,
+it's mostly a matter of taste.
+
+So we have a dilemma: if we want to have multiple output, frozen \PDF\ as well as
+less-controlled \HTML\ output, we can best code in \XML, but when we want to code
+comfortably we'd like to use \TEX. There are other ways, like Markdown, that can
+be converted to intermediate formats like \TEX, but that is only suitable for
+simple documents: the more advanced documents get, the more one has to escape
+from the boundaries of (any) document encoding, and then often \TEX\ is not a bad
+choice. There is a good reason why \TEX\ survived for so long.
+
+It is for this reason that in \CONTEXT\ \MKIV\ we can export the content in a
+reasonable structured way to \XML. Of course we assume a structured document. It
+started out as an experiment because it was relatively easy to implement, and it
+is now an integral component.
+
+\stopsection
+
+\startsection[title=The output]
+
+The regular output is an \XML\ file but as we have some more related data it gets
+organized in a tree. We also export a few variants. An example is given below:
+
+\starttyping
+./test-export
+./test-export/images
+./test-export/images/...
+./test-export/styles
+./test-export/styles/test-defaults.css
+./test-export/styles/test-images.css
+./test-export/styles/test-styles.css
+./test-export/styles/test-templates.css
+./test-export/test-raw.xml
+./test-export/test-raw.lua
+./test-export/test-tag.xhtml
+./test-export/test-div.xhtml
+\stoptyping
+
+Say that we have this input:
+
+\starttyping
+\setupbackend
+ [export=yes]
+
+\starttext
+ \startsection[title=First]
+ \startitemize
+ \startitem one \stopitem
+ \startitem two \stopitem
+ \stopitemize
+ \stopsection
+\stoptext
+\stoptyping
+
+The main export ends up in the \type {test-raw.xml} export file and looks like
+the following (we leave out the preamble and style references):
+
+\starttyping
+<document> <!-- with some attributes -->
+ <section detail="section" chain="section" level="3">
+ <sectionnumber>1</sectionnumber>
+ <sectiontitle>First</sectiontitle>
+ <sectioncontent>
+ <itemgroup detail="itemize" chain="itemize" symbol="1" level="1">
+ <item>
+ <itemtag><m:math ..><m:mo>•</m:mo></m:math></itemtag>
+ <itemcontent>one</itemcontent>
+ </item>
+ <item>
+ <itemtag><m:math ..><m:mo>•</m:mo></m:math></itemtag>
+ <itemcontent>two</itemcontent>
+ </item>
+ </itemgroup>
+ </sectioncontent>
+ </section>
+</document>
+\stoptyping
+
+This file refers to the stylesheets and therefore renders quite well in a browser
+like Firefox that can handle \XHTML\ with arbitrary tags.
+
+The \type {detail} attribute tells us what instance of the element is used.
+Normally the \type {chain} attribute is the same but it can have more values.
+For instance, if we have:
+
+\starttyping
+\definefloat[graphic][graphics][figure]
+
+.....
+
+\startplacefigure[title=First]
+ \externalfigure[cow.pdf]
+\stopplacefigure
+
+.....
+
+\startplacegraphic[title=Second]
+ \externalfigure[cow.pdf]
+\stopplacegraphic
+\stoptyping
+
+we get this:
+
+\starttyping
+<float detail="figure" chain="figure">
+ <floatcontent>...</floatcontent>
+ <floatcaption>...</floatcaption>
+</float>
+<float detail="graphic" chain="figure graphic">
+ <floatcontent>...</floatcontent>
+ <floatcaption>...</floatcaption>
+</float>
+\stoptyping
+
+This makes it possible to style specific categories of floats by using a
+(combination of) \type {detail} and|/|or \type {chain} as filters.
+
+The body of the \type {test-tag.xhtml} file looks similar but it is slightly more
+tuned for viewing. For instance, hyperlinks are converted to a way that \CSS\ and
+browsers like more. Keep in mind that the raw file can be the base for conversion
+to other formats, so that one stays closest to the original structure.
+
+The \type {test-div.xhtml} file is even more tuned for viewing in browsers as it
+completely does away with specific tags. We explicitly don't map onto native
+\HTML\ elements because that would make everything look messy and horrible, if only
+because there seldom is a relation between those elements and the original. One
+can always transform one of the export formats to pure \HTML\ tags if needed.
+
+\starttyping
+<body>
+ <div class="document">
+ <div class="section" id="aut-1">
+ <div class="sectionnumber">1</div>
+ <div class="sectiontitle">First</div>
+ <div class="sectioncontent">
+ <div class="itemgroup itemize symbol-1">
+ <div class="item">
+ <div class="itemtag"><m:math ...><m:mo>•</m:mo></m:math></div>
+ <div class="itemcontent">one</div>
+ </div>
+ <div class="item">
+ <div class="itemtag"><m:math ...><m:mo>•</m:mo></m:math></div>
+ <div class="itemcontent">two</div>
+ </div>
+ </div>
+ <div class="float figure">
+ <div class="floatcontent">...</div></div>
+ <div class="floatcaption">...></div>
+ </div>
+ <div class="float figure graphic">
+ <div class="floatcontent">...</div></div>
+ <div class="floatcaption">...></div>
+ </div>
+ </div>
+ </div>
+</body>
+\stoptyping
+
+The default \CSS\ file can deal with tags as well as classes. The file
+of additional styles contains definitions of so|-|called highlights. In the \CONTEXT\ source
+one is better off using explicit named highlights instead of local font and color
+switches because these properties are then exported to the \CSS. The images style
+defines all images used. The templates file lists all the elements used and can
+be used as a starting point for additional \CSS\ styling.
+
+Keep in mind that the export is \notabene{not} meant as a one|-|to|-|one visual
+representation. It represents structure so that it can be converted to whatever
+you like.
+
+In order to get an export you must start your document with:
+
+\starttyping
+\setupbackend
+ [export=yes]
+\stoptyping
+
+So, we trigger a specific (extra) backend. In addition you can set up the export:
+
+\starttyping
+\setupexport
+ [svgstyle=test-basic-style.tex,
+ cssfile=test-extras.css,
+ hyphen=yes,
+ width=60em]
+\stoptyping
+
+The \type {hyphen} option will also export hyphenation information so that the
+text can be nicely justified. The \type {svgstyle} option can be used to specify
+a file where math is set up; normally this would only contain a \type{bodyfont} setup,
+and this option is only needed if you want to create an \EPUB\ file afterwards which
+has math represented as \SVG.
+
+The value of \type {cssfile} ends up as a style reference in the exported files.
+You can also pass a comma|-|separated list of names (between curly braces). These
+entries come after those of the automatically generated \CSS\ files so you need
+to be aware of default properties.
+
+\stopsection
+
+\startsection[title=Images]
+
+Inclusion of images is done in an indirect way. Each image gets an entry in a
+special image related stylesheet and then gets referred to by \type {id}. Some
+extra information is written to a status file so that the script that creates
+\EPUB\ files can deal with the right conversion, for instance from \PDF\ to \SVG.
+Because we can refer to specific pages in a \PDF\ file, this subsystem deals with
+that too. Images are expected to be in an \type {images} subdirectory and because in \CSS\
+the references are relative to the path where the stylesheet resides, we use
+\type {../images} instead. If you do some postprocessing on the files or relocate
+them you need to keep in mind that you might have to change these paths in the
+image|-|related \CSS\ file.
+
+\stopsection
+
+\startsection[title=Epub files]
+
+At the end of a run with exporting enabled you will get a message to the console that
+tells you how to generate an \EPUB\ file. For instance:
+
+\starttyping
+mtxrun --script epub --make --purge test
+\stoptyping
+
+This will create a tree with the following organization:
+
+\starttyping
+./test-epub
+./test-epub/META-INF
+./test-epub/META-INF/container.xml
+./test-epub/OEBPS
+./test-epub/OEBPS/content.opf
+./test-epub/OEBPS/toc.ncx
+./test-epub/OEBPS/nav.xhtml
+./test-epub/OEBPS/cover.xhtml
+./test-epub/OEBPS/test-div.xhtml
+./test-epub/OEBPS/images
+./test-epub/OEBPS/images/...
+./test-epub/styles
+./test-epub/styles/test-defaults.css
+./test-epub/styles/test-images.css
+./test-epub/styles/test-styles.css
+./test-epub/mimetype
+\stoptyping
+
+Images will be moved to this tree as well and if needed they will be converted,
+for instance into \SVG. Converted \PDF\ files can have a \typ {page-<number>} in
+their name when a specific page has been used.
+
+You can pass the option \type {--svgmath} in which case math will be converted to
+\SVG. The main reason for this feature is that we found out that \MATHML\ support
+in browsers is not currently as widespread as might be expected. The best bet is Firefox which
+natively supports it. The Chrome browser had it for a while but it got dropped
+and math is now delegated to \JAVASCRIPT\ and friends. In Internet Explorer
+\MATHML\ should work (but I need to test that again).
+
+This conversion mechanism is
+kind of interesting: one enters \TEX\ math, then gets \MATHML\ in the export, and
+that gets rendered by \TEX\ again, but now as a standalone snippet that then gets
+converted to \SVG\ and embedded in the result.
+
+\stopsection
+
+\startsection[title=Styles]
+
+One can argue that we should use native \HTML\ elements but since we don't have a nice
+guaranteed|-|consistent mapping onto that, it makes no sense to do so. Instead, we
+rely on either explicit tags with details and chains or divisions with classes
+that combine the tag, detail and chain. The tagged variant has some more
+attributes and those that use a fixed set of values become classes in the
+division variant. Also, once we start going the (for instance) \type {H1}, \type
+{H2}, etc.\ route we're lost when we have more levels than that or use a
+different structure. If an \type {H3} can reflect several levels it makes no
+sense to use it. The same is true for other tags: if a list is not really a list
+than tagging it with \type {LI} is counterproductive. We're often dealing with
+very complex documents so basic \HTML\ tagging becomes rather meaningless.
+
+If you look at the division variant (this is used for \EPUB\ too) you will notice
+that there are no empty elements but \type {div} blocks with a comment as content.
+This is needed because otherwise they get ignored, which for instance makes table
+cells invisible.
+
+The relation between \type {detail} and \type {chain} (reflected in \type {class})
+can best be seen from the next example.
+
+\starttyping
+\definefloat[myfloata]
+\definefloat[myfloatb][myfloatbs][figure]
+\definefloat[myfloatc][myfloatcs][myfloatb]
+\stoptyping
+
+This creates two new float instances. The first inherits from the main float
+settings, but can have its own properties. The second example inherits from
+the \type {figure} so in fact it is part of a chain. The third one has a longer
+chain.
+
+\starttyping
+<float detail="myfloata">...</float>
+<float detail="myfloatb" chain="figure">...</float>
+<float detail="myfloatc" chain="figure myfloatb">...</float>
+\stoptyping
+
+In a \CSS\ style you can now configure tags, details, and chains as well as
+classes (we show only a few possibilities). Here, the \CSS\ element on the
+first line of each pair is invoked by the \CSS\ selector on the second line.
+
+\starttyping
+div.float.myfloata { } float[detail='myfloata'] { }
+div.float.myfloatb { } float[detail='myfloatb'] { }
+div.float.figure { } float[detail='figure'] { }
+div.float.figure.myfloatb { } float[chain~='figure'][detail='myfloata'] { }
+div.myfloata { } *[detail='myfloata'] { }
+div.myfloatb { } *[detail='myfloatb'] { }
+div.figure { } *[chain~='figure'] { }
+div.figure.myfloatb { } *[chain~='figure'][detail='myfloatb'] { }
+\stoptyping
+
+The default styles cover some basics but if you're serious about the export
+or want to use \EPUB\ then it makes sense to overload some of it and|/|or
+provide additional styling. You can find plenty about \CSS\ and its options
+on the Internet.
+
+\stopsection
+
+\startsection[title=Coding]
+
+The default output reflects the structure present in the document. If that is not
+enough you can add your own structure, as in:
+
+\starttyping
+\startelement[question]
+Is this right?
+\stopelement
+\stoptyping
+
+You can also pass attributes:
+
+\starttyping
+\startelement[question][level=difficult]
+Is this right?
+\stopelement
+\stoptyping
+
+But these will be exported only when you also say:
+
+\starttyping
+\setupexport
+ [properties=yes]
+\stoptyping
+
+You can create a namespace. The following will generate attributes
+like \type {my-level}.
+
+\starttyping
+\setupexport
+ [properties=my-]
+\stoptyping
+
+In most cases it makes more sense to use highlights:
+
+\starttyping
+\definehighlight
+ [important]
+ [style=bold]
+\stoptyping
+
+This has the advantage that the style and color are exported to a special
+\CSS\ file.
+
+Headers, footers, and other content that is part of the page builder are not
+exported. If your document has cover pages you might want to hide them too. The
+same is true when you create special chapter title rendering with a side
+effect that content ends up in the page stream. If something shows up that you
+don't want, you can wrap it in an \type {ignore} element:
+
+\starttyping
+\startelement[ignore]
+Don't export this.
+\stopelement
+\stoptyping
+
+\stopsection
+
+\stoptext
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mcommon.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mcommon.tex
new file mode 100644
index 00000000000..b6b6026e968
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mcommon.tex
@@ -0,0 +1,210 @@
+% content=tex
+%
+% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+
+\startenvironment mcommon
+
+% modules
+
+\usemodule[abr-02]
+
+% layout
+
+% \startmode[screen]
+% \setuppapersize[S6][S6]
+% \setupinteractionscreen[options=max]
+% \stopmode
+
+\setuplayout
+ [topspace=15mm,
+ header=15mm,
+ headerdistance=0mm,
+ footer=0cm,
+ width=middle,
+ height=middle]
+
+\setupinteraction
+ [state=start,
+ color=,
+ contrastcolor=,
+ style=]
+
+% fonts
+
+\definetypeface [mainface] [rm] [serif] [pagella] [default]
+\definetypeface [mainface] [ss] [sans] [heros] [default] % [rscale=1.1]
+\definetypeface [mainface] [tt] [mono] [heros] [default] % [rscale=1.1]
+\definetypeface [mainface] [mm] [math] [pagella] [default]
+
+\setupbodyfont[mainface,12pt]
+
+\definefont [BigFont] [SansBold*default at 60pt]
+\definefont [MedFont] [SansBold*default at 30pt]
+
+% colors (historically)
+
+\definecolor [NopColor] [r=.6,g=.4,b=.5]
+\definecolor [AltColor] [r=.4,g=.6,b=.5]
+\definecolor [TheColor] [r=.4,g=.5,b=.6]
+\definecolor [TmpColor] [r=.6,g=.5,b=.4]
+
+\definecolor [NopColor] [r=.40,g=.20,b=.20]
+\definecolor [AltColor] [r=.20,g=.40,b=.20]
+\definecolor [TheColor] [r=.20,g=.20,b=.40]
+\definecolor [TmpColor] [r=.40,g=.40,b=.20]
+
+\definecolor [red] [NopColor]
+\definecolor [green] [AltColor]
+\definecolor [blue] [TheColor]
+\definecolor [yellow][TmpColor]
+
+% spacing
+
+\setupwhitespace
+ [big]
+
+\setuptolerance
+ [verytolerant,stretch]
+
+% verbatim
+
+\setuptype
+ [color=AltColor]
+
+\setuptyping
+ [color=AltColor]
+
+% structure
+
+\setupitemize
+ [each]
+ [color=TheColor]
+
+\definedescription
+ [switch]
+ [headstyle=type,
+ headcolor=TheColor,
+ location=serried,
+ width=broad]
+
+\defineenumeration
+ [topic]
+ [location=serried,
+ width=broad,
+ headstyle=,
+ headcolor=TheColor,
+ text=,
+ left={[},
+ right={]}]
+
+\setuphead
+ [section]
+ [style=\bfb,
+ color=TheColor]
+
+\setuplist
+ [section]
+ [alternative=c,
+ color=TheColor,
+ textcolor=black,
+ pagecolor=black]
+
+% whatever
+
+\setupsystem
+ [random=medium]
+
+\setupfloats
+ [ntop=100]
+
+\setupinteraction
+ [style=,
+ color=NopColor,
+ contrastcolor=NopColor]
+
+% tables and frames
+
+\setuptabulate
+ [rulethickness=.5pt,
+ rulecolor=AltColor]
+
+\setuptables
+ [rulethickness=.5pt,
+ rulecolor=AltColor]
+
+\setupframedtexts
+ [rulethickness=.5pt,
+ framecolor=TheColor,
+ width=\textwidth]
+
+% quick reference things
+
+\usemodule[set-11] \loadsetups
+
+\setupframedtexts
+ [setuptext]
+ [rulethickness=.5pt,
+ framecolor=AltColor]
+
+% titlepage
+
+\startsetups titlepage
+ \defineoverlay
+ [logo]
+ [\useMPgraphic{titlepage}{width=\overlaywidth,height=\overlayheight}]
+ \setupbackgrounds
+ [page]
+ [background=logo]
+ \startstandardmakeup
+ \dontcomplain
+ \BigFont
+ \setupinterlinespace
+ \vfill
+ \setupalign[left]
+ \let\\=\par
+ \dontleavehmode
+ \rotate
+ [rotation=90]
+ {\color
+ [lightgray]
+ {\getvariable{document}{title}}}
+ \par
+ \stopstandardmakeup
+ \setupbackgrounds
+ [page]
+ [background=]
+\stopsetups
+
+\startsetups colofon
+ \blank[2*big]
+ \testpage[3]
+ \startpacked
+ \getvariable{document}{author}\par
+ \getvariable{document}{affiliation}\par
+ \getvariable{document}{location}\par
+ \stoppacked
+\stopsetups
+
+\setupdocument
+ [title=No Title,
+ before=\setups{titlepage},
+ after=\setups{colofon}]
+
+% urls
+
+\useurl[gpl-simple] [http://creativecommons.org/licenses/GPL/2.0/]
+\useurl[gpl-legal] [http://creativecommons.org/licenses/GPL/2.0/legalcode]
+\useurl[byncsa-simple][http://creativecommons.org/licenses/by-nc-sa/2.5/]
+\useurl[byncsa-legal] [http://creativecommons.org/licenses/by-nc-sa/2.5/legalcode]
+
+\useurl[garden] [http://contextgarden.net]
+\useurl[install] [http://wiki.contextgarden.net/ConTeXt_Standalone]
+\useurl[texlive] [http://www.tug.org/texlive/]
+\useurl[group] [http://group.contextgarden.net]
+\useurl[list] [http://www.ntg.nl/mailman/listinfo/ntg-context]
+\useurl[development] [http://www.ntg.nl/mailman/listinfo/dev-context]
+\useurl[announce] [http://www.ntg.nl/mailman/listinfo/ann-context]
+\useurl[collector] [http://tracker.luatex.org]
+\useurl[pragma] [http://www.pragma-ade.com]
+
+\stopenvironment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/readme/mreadme.tex b/Master/texmf-dist/doc/context/sources/general/manuals/readme/mreadme.tex
new file mode 100644
index 00000000000..b2af11bc4de
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/readme/mreadme.tex
@@ -0,0 +1,372 @@
+% interface=en engine=luatex language=uk
+%
+% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+
+\environment mcommon
+
+% copied from cont-log: readme_logo
+
+\startuseMPgraphic{titlepage}{width,height}
+ numeric width ; width = \MPvar{width} ;
+ numeric height ; height = \MPvar{height} ;
+ numeric delta ; delta := width/10 ;
+ numeric circle ; circle := 2.5delta ;
+ color c ; c := (.2,.4,.6) ;
+ path p, q, r ;
+ p := unitsquare xscaled width yscaled height ;
+ z1 = (delta,height-2delta) ;
+ z2 = (width-delta,height-delta) ;
+ z3 = (width/2-delta,2delta+circle) ;
+ z4 = (x3,delta+circle/2) ;
+ q := z1 { dir -15 } .. z2 & z2 { dir -105 } .. z3 & z3 { dir 135 } .. z1 & cycle ;
+ r := fullcircle xscaled circle yscaled (.85circle) rotated 15 shifted z4 ;
+ pickup pencircle scaled (delta/1.5) ;
+ fill p withcolor .50c ;
+ fill q withcolor .75c ;
+ fill r withcolor .75c ;
+ draw p withcolor c ;
+ draw q withcolor c ;
+ pickup pencircle scaled (delta/2) ;
+ draw r withcolor c ;
+ setbounds currentpicture to p ;
+\stopuseMPgraphic
+
+\startdocument
+ [title={Read Me First},
+ author={Hans Hagen},
+ affiliation={PRAGMA ADE},
+ location={Hasselt NL}]
+
+\startsubject[title={Introduction}]
+
+What licence suits best for a \TEX\ like system is a matter of taste. Personally
+we dislike any licence that needs more than a few pages of dense legal code to
+get the message across. A \TEX\ related system like \CONTEXT\ is a hybrid of
+programs, scripts and|/|or macro code as well as documentation and sample code,
+including graphics. \TEX\ related systems also have a long standing tradition of
+providing support structures for users. In order to make support feasible, a
+\TEX\ based system like \CONTEXT\ assumes a certain logic and structure in the
+way the related files are named and organized in a tree structure. Even a small
+change in one of the elements may let such a system behave differently than
+manuals suggest. Swap a font, change some style defaults, leave out some pieces,
+and users may end up in confusion. A licence does not give a user any guarantees!
+
+In order to satisfy those responsible for distributing \CONTEXT, we need to
+choose a licence that makes them feel comfortable. Unfortunately we don't feel
+that comfortable with a licence that does not provide the guarantees that a
+system will not be adapted in such ways that the advertised behaviour changes. On
+the other hand, it is the responsibility of those distributing and extending the
+system to make sure that this does not happen. However, users should not
+automatically assume that what they get shipped is the same as the original,
+which is why we stress that support (from our side) will only be given on
+unaltered systems.
+
+First of all, what is \CONTEXT ? It's just a bunch of macros, written in \TEX\
+and \METAPOST, meant for typesetting documents. The macros are accompanied by
+some scripts, written in \PERL\ (mainly the older scripts) \RUBY\ (also older
+ones) and \LUA\ (the current fashion). The \CONTEXT\ distribution comes with a
+few fonts, files that help manage resources (e.g.\ map files needed for \MKII),
+as well as patterns (based on official ones, so this is a derived work).
+
+The \CONTEXT\ distribution is packaged in a zip file organized in the \TDS\
+structure.
+
+\starttabulate[|lT|p|]
+\NC \type {cont-tmf.zip} \NC the main distribution that has all relevant files \NC \NR
+\NC \type {cont-tst.7z} \NC a bunch of test files that can also serve as examples \NC \NR
+\NC \type {cont-mpd.zip} \NC a \METAPOST\ to \PDF\ converter (not needed in \CONTEXT) \NC \NR
+\NC \type {cont-ppc.zip} \NC a macro package for typesetting chemistry (not needed in \CONTEXT) \NC \NR
+\NC \type {cont-sci.zip} \NC configuration files for using \CONTEXT\ in the \SCITE\ editor \NC \NR
+\stoptabulate
+
+There are two flavours of \CONTEXT: \MKII\ and \MKIV. The first one is frozen and
+will not be extended. It runs on top of \PDFTEX\ or \XETEX. The \MKIV\ version is
+actively developed and runs on top of \LUATEX\ (an engine that is developed
+alongside \CONTEXT\ but that can also be used for other macro packages).
+
+The documentation can be downloaded from our website or the Wiki. Some manuals
+ship with source code. We might ship more source code but only when the source is
+stable and clean and can serve as an example.
+
+That said, what licence does apply? We need to distinguish between things that
+resemble a program on the one hand and documentation on the other hand. We
+(currently) use a different licence for either of them.
+
+\stopsubject
+
+\startsubject[title={The Code}]
+
+The program code (i.e. anything not under the \type {/doc} subtree) is
+distributed under the
+
+\startnarrower
+\goto{Creative Commons GNU GPL}[url(gpl-simple)]
+\stopnarrower
+
+For practical purposes distributers may also choose the \LATEX\ project licence,
+which is considered to be a bit more \TEX\ friendly. (BSD alike licences, the
+Ruby Licence and the Apache are all licences that apply well for \CONTEXT.)
+
+In practice, users may forget about the legal part, if only because I haven't
+even read (and understood) it completely myself, so let's stick to what Creative
+Commons makes of it:
+
+\startcolor[blue]
+The GNU General Public License is a Free Software license. Like any Free Software
+license, it grants to you the four following freedoms:
+
+\startitemize
+ \startitem
+ The freedom to run the program for any purpose.
+ \stopitem
+ \startitem
+ The freedom to study how the program works and adapt it to your needs.
+ \stopitem
+ \startitem
+ The freedom to redistribute copies so you can help your neighbour.
+ \stopitem
+ \startitem
+ The freedom to improve the program and release your improvements to the
+ public, so that the whole community benefits.
+ \stopitem
+\stopitemize
+
+You may exercise the freedoms specified here provided that you comply with the
+express conditions of this license. The principal conditions are:
+
+You must conspicuously and appropriately publish on each copy distributed an
+appropriate copyright notice and disclaimer of warranty and keep intact all the
+notices that refer to this License and to the absence of any warranty; and give
+any other recipients of the Program a copy of the GNU General Public License
+along with the Program. Any translation of the GNU General Public License must be
+accompanied by the GNU General Public License.
+
+If you modify your copy or copies of the program or any portion of it, or develop
+a program based upon it, you may distribute the resulting work provided you do so
+under the GNU General Public License. Any translation of the GNU General Public
+License must be accompanied by the GNU General Public License.
+
+If you copy or distribute the program, you must accompany it with the complete
+corresponding machine-readable source code or with a written offer, valid for at
+least three years, to furnish the complete corresponding machine-readable source
+code.
+
+Any of these conditions can be waived if you get permission from the copyright
+holder.
+
+Your fair use and other rights are in no way affected by the above.
+\stopcolor
+
+\stopsubject
+
+\startsubject[title={Recommendations}]
+
+Here are a few recommendations in case you want to distribute, extend of embed
+\CONTEXT\ in applications:
+
+\startitemize
+
+\startitem
+ You can best leave the code base untouched. Most of \CONTEXT\ provides hooks
+ and it's relatively easy to overload code. Leave the lower level system code
+ untouched: changes may backfire when you update. Asking for more hooks is the
+ best way to go.
+\stopitem
+
+\startitem
+ Put your own code in the right subpaths, i.e.\ modules approved by the
+ development team under \type {.../third}, and styles and whatever else under
+ \type {.../user}. This way your code will not interfere with existing code
+ and updating will give less problems. Keep in mind that \TEX\ systems have
+ their own way and order in locating files, and the load order often matters.
+\stopitem
+
+\startitem
+ Don't copy styles and change a few lines, but load the base one and
+ built|/|patch on top of that. In the end you may benefit from improvements to
+ the base style.
+\stopitem
+
+\startitem
+ Be original. The whole idea behind \CONTEXT\ is that you can write your own
+ styles. On the \CONTEXT\ mailing list as well as on the Wiki there are enough
+ advanced users to help you make a start.
+\stopitem
+
+\startitem
+ Don't hesitate to submit bugs reports and ask for extensions. It may even be
+ that what you want is already present but yet undocumented.
+\stopitem
+
+\startitem
+ If things don't work as expected, check to what extend your system matches
+ the (more or less) standard. We provide so called minimal \CONTEXT\ trees
+ that can serve as a reference. Because \CONTEXT\ evolves, make sure your
+ system is up to date. The \CONTEXT\ garden provides ways to install and
+ update the standard distribution.
+\stopitem
+
+\startitem
+ The scripts can best be called using \type {mtxrun}. This lessens dependencies
+ on the location in the tree and ensures upward compatibility. It also prevents
+ clashes with similar scripts.
+\stopitem
+
+\startitem
+ Some scripts depend on each other. Don't mess around with the existing
+ functionality and names of the scripts and then feed them back into the
+ standard distributions.
+\stopitem
+
+\stopitemize
+
+\stopsubject
+
+\startsubject[title={Documents}]
+
+The documentation is provided under another Creative Commons licence
+
+\startnarrower
+ \goto{Attribution NonCommercial ShareAlike}[url(byncsa-simple)]
+\stopnarrower
+
+This one says:
+
+\startcolor[blue]
+You are free:
+
+\startitemize
+ \startitem to copy, distribute, display, and perform the work \stopitem
+ \startitem to make derivative works \stopitem
+\stopitemize
+
+{\sc Attribution:} You must attribute the work in the manner specified by the
+author or licensor.
+
+{\sc NonCommercial:} You may not use this work for commercial purposes.
+
+{\sc Share Alike:} If you alter, transform, or build upon this work, you may
+distribute the resulting work only under a license identical to this one.
+
+\startitemize
+ \startitem
+ For any reuse or distribution, you must make clear to others the license
+ terms of this work.
+ \stopitem
+ \startitem
+ Any of these conditions can be waived if you get permission from the
+ copyright holder.
+ \stopitem
+\stopitemize
+
+Your fair use and other rights are in no way affected by the above.
+\stopcolor
+
+The non||commercial part is mostly a safeguard. We don't mind if user groups
+distribute printed copies, publish (parts of) manuals and|/|or if authors use
+example code in manuals and books about \CONTEXT.
+
+If you distribute \CONTEXT\ and related software on electronic media as part of
+\TEX\ distributions (either or not for money), you may also distribute the
+manuals and their sources in electronic form, preferable as provided by the
+maintainers of \CONTEXT.
+
+Keep in mind that logos and cover designs are not meant to be copied. We provide
+the source code for some manuals, but we don't always provide all graphics and
+other resources. For instance, in some manuals we use commercial fonts and you
+have to buy those yourself.
+
+We provide the typeset manuals at our website. Those are the official ones. We
+appreciate it if you do not to distribute manuals compiled on your own system as
+substitutes. The manuals are a showcase for what \CONTEXT\ provides. Help us to
+assure the quality.
+
+\stopsubject
+
+\startsubject[title={More information}]
+
+We're not going to fill \mathematics{n}~pages with legal stuff, so if you want to
+know more, you have to consult the web for the legalities mentioned. Here are a
+few starting points:
+
+\startlines
+\goto{\url[gpl-simple]}[url(gpl-simple)]
+\goto{\url[gpl-legal]}[url(gpl-legal)]
+\stoplines
+
+\startlines
+\goto{\url[byncsa-simple]}[url(byncsa-simple)]
+\goto{\url[byncsa-legal]}[url(byncsa-legal)]
+\stoplines
+
+\CONTEXT\ itself can be fetched from the main site or the garden:
+
+\startlines
+\goto{\url[pragma]}[url(pragma)]
+\goto{\url[install]}[url(install)]
+\stoplines
+
+These always ship the latest versions. Alternatively you can install the whole
+\TEX\ distribution, which is a yearly snapshot:
+
+\startlines
+\goto{\url[texlive]}[url(texlive)]
+\stoplines
+
+A starting point for support can be found at:
+
+\startlines
+\goto{\url[list]}[url(list)]
+\goto{\url[garden]}[url(garden)]
+\stoplines
+
+And of course there is the \CONTEXT\ group:
+
+\startlines
+\goto{\url[group]}[url(group)]
+\stoplines
+
+Bugs and feature requests can be registered at the collector:
+
+\startlines
+\goto{\url[collector]}[url(collector)]
+\stoplines
+
+Releases are announced at:
+
+\startlines
+\goto{\url[announce]}[url(announce)]
+\stoplines
+
+The developers can be met at:
+
+\startlines
+\goto{\url[development]}[url(development)]
+\stoplines
+
+\stopsubject
+
+\startsubject[title={Disclaimer}]
+
+To play safe we include a disclaimer here, taken from the BSD style licence. For
+some reason such a text is always in unreadable capitals, so \unknown
+
+\start \txx \blue
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR \quotation {AS IS} AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\stop
+
+\unknown\ and don't bother discussing licence issues and related things with us
+for the mere sake of discussing licence stuff.
+
+\stopsubject
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/swiglib/swiglib-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/swiglib/swiglib-mkiv.tex
new file mode 100644
index 00000000000..fc7a269bb5d
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/swiglib/swiglib-mkiv.tex
@@ -0,0 +1,335 @@
+% language=uk
+
+% author : Hans Hagen, PRAGMA ADE, NL
+% license : Creative Commons, Attribution-NonCommercial-ShareAlike 3.0 Unported
+
+\usemodule[art-01,abr-02]
+
+\definecolor
+ [maincolor]
+ [r=.4]
+
+\definecolor
+ [extracolor]
+ [g=.4]
+
+\setupbodyfont
+ [11pt]
+
+\setuptype
+ [color=maincolor]
+
+\setuptyping
+ [color=maincolor]
+
+\definefontsynonym
+ [TitlePageMono]
+ [file:lmmonoproplt10-bold*default]
+
+\setuphead
+ [color=maincolor]
+
+\usesymbols
+ [cc]
+
+\setupinteraction
+ [hidden]
+
+\loadfontgoodies[lm]
+
+\startdocument
+ [metadata:author=Hans Hagen,
+ metadata:title=SwigLib basics,
+ author=Hans Hagen,
+ affiliation=PRAGMA ADE,
+ location=Hasselt NL,
+ title=SwigLib basics,
+ support=www.contextgarden.net,
+ website=www.pragma-ade.nl]
+
+\startluasetups[swiglib]
+ for i=1,640 do
+ context.definedfont { string.formatters["TitlePageMono at %p"](65536*(10+math.random(5))) }
+ context("SwigLib ")
+ end
+ context.removeunwantedspaces()
+\stopluasetups
+
+\startMPpage
+
+StartPage ;
+
+ fill Page enlarged 1cm withcolor \MPcolor{extracolor} ;
+
+ draw textext("\framed[loffset=2pt,roffset=2pt,frame=off,width=\paperwidth,align={normal,paragraph,verytolerant,stretch}]{\luasetup{swiglib}}")
+ xysized (PaperWidth,PaperHeight)
+ shifted center Page
+ withcolor .8white ;
+
+ draw textext.ulft("\definedfont[TitlePageMono]basics")
+ xsized .75PaperWidth
+ shifted lrcorner Page
+ shifted (-1cm,2cm)
+ withcolor \MPcolor{maincolor} ;
+
+% draw textext.ulft("\definedfont[TitlePageMono]in context mkiv")
+% xsized .6PaperWidth
+% shifted lrcorner Page
+% shifted (-1cm,6cm)
+% withcolor \MPcolor{maincolor} ;
+
+StopPage ;
+
+\stopMPpage
+
+\dontcomplain
+
+\startsubject[title=Contents]
+
+\placelist[section][alternative=a]
+
+\stopsubject
+
+\startsection[title=Introduction]
+
+The \SWIGLIB\ project is related to \LUATEX\ and aims as adding portable library
+support to this \TEX\ engine without too much fixed binding. The project does not
+provide \LUA\ code, unless really needed, because it assumes that macro packages
+have different demands. It also fits in the spirit of \TEX\ and \LUA\ to minimize
+the core components.
+
+The technical setup is by Luigi Scarso and documentation about how to build the
+libraries is part of the \SWIGLIB\ repository. Testing happens with help of the
+\CONTEXT\ (garden) infrastructure. This short document only deals with usage in
+\CONTEXT\ but also covers rather plain usage.
+
+\blank \start \em todo: reference to Luigi's manual \stop \blank
+
+\stopsection
+
+\startsection[title=Inside \CONTEXT]
+
+The recommended way to load a library in \CONTEXT\ is by using the
+\type {swiglib} function. This function lives in the global namespace.
+
+\starttyping
+local gm = swiglib("gmwand.core")
+\stoptyping
+
+After this call you have the functionality available in the \type {gm}
+namespace. This way of loading makes \CONTEXT\ aware that such a library
+has been loading and it will report the loaded libraries as part of the
+statistics.
+
+If you want, you can use the more ignorant \type {require} instead but in
+that case you need to be more explicit.
+
+\starttyping
+local gm = require("swiglib.gmwand.core")
+\stoptyping
+
+Here is an example of using such a library (by Luigi):
+
+\startbuffer
+\startluacode
+local gm = swiglib("gmwand.core")
+local findfile = resolvers.findfile
+
+gm.InitializeMagick(".")
+
+local magick_wand = gm.NewMagickWand()
+local drawing_wand = gm.NewDrawingWand()
+local pixel_wand = gm.NewPixelWand();
+
+gm.MagickSetSize(magick_wand,800,600)
+gm.MagickReadImage(magick_wand,"xc:gray")
+
+gm.DrawPushGraphicContext(drawing_wand)
+
+gm.DrawSetFillColor(drawing_wand,pixel_wand)
+
+gm.DrawSetFont(drawing_wand,findfile("dejavuserifbold.ttf"))
+gm.DrawSetFontSize(drawing_wand,96)
+gm.DrawAnnotation(drawing_wand,200,200,"ConTeXt 1")
+
+gm.DrawSetFont(drawing_wand,findfile("texgyreschola-bold.otf"))
+gm.DrawSetFontSize(drawing_wand,78)
+gm.DrawAnnotation(drawing_wand,250,300,"ConTeXt 2")
+
+gm.DrawSetFont(drawing_wand,findfile("lmroman10-bold.otf"))
+gm.DrawSetFontSize(drawing_wand,48)
+gm.DrawAnnotation(drawing_wand,300,400,"ConTeXt 3")
+
+gm.DrawPopGraphicContext(drawing_wand)
+
+gm.MagickDrawImage(magick_wand,drawing_wand)
+
+gm.MagickWriteImages(magick_wand,"./swiglib-mkiv-gm-1.png",1)
+gm.MagickWriteImages(magick_wand,"./swiglib-mkiv-gm-1.jpg",1)
+gm.MagickWriteImages(magick_wand,"./swiglib-mkiv-gm-1.pdf",1)
+
+gm.DestroyDrawingWand(drawing_wand)
+gm.DestroyPixelWand(pixel_wand)
+gm.DestroyMagickWand(magick_wand)
+\stopluacode
+\stopbuffer
+
+\typebuffer \getbuffer
+
+In practice you will probably stay away from manipulating text this way, but it
+illustrates that you can use the regular \CONTEXT\ helpers to locate files.
+
+\startlinecorrection[big]
+ \startcombination[3*1]
+ {\externalfigure[swiglib-mkiv-gm-1.png][width=.3\textwidth]} {png}
+ {\externalfigure[swiglib-mkiv-gm-1.pdf][width=.3\textwidth]} {pdf}
+ {\externalfigure[swiglib-mkiv-gm-1.jpg][width=.3\textwidth]} {jpg}
+ \stopcombination
+\stoplinecorrection
+
+You'd better make sure to use unique filenames for such graphics. Of course a more
+clever mechanism would only run time consuming tasks once for each iteration of a
+document.
+
+\stopsection
+
+\startsection[title=Outside \CONTEXT]
+
+In the \CONTEXT\ distribution we ship some generic macros and code for usage in
+plain \TEX\ but there is no reason why they shouldn't work in other macro packages
+as well. A rather plain example is this:
+
+\starttyping
+\input luatex-swiglib.tex
+
+\directlua {
+ dofile("luatex-swiglib-test.lua")
+}
+
+\pdfximage {luatex-swiglib-test.jpg} \pdfrefximage\pdflastximage
+
+\end
+\stoptyping
+
+Assuming that you made the \type {luatex-plain} format, such a file can be processed using:
+
+\starttyping
+luatex --fmt=luatex=plain luatex-swiglib-test.tex
+\stoptyping
+
+The loaded \LUA\ file \type {luatex-swiglib-test.lua} liike like this:
+
+\starttyping
+local gm = swiglib("gmwand.core")
+
+gm.InitializeMagick(".")
+
+local magick_wand = gm.NewMagickWand()
+local drawing_wand = gm.NewDrawingWand()
+
+gm.MagickSetSize(magick_wand,800,600)
+gm.MagickReadImage(magick_wand,"xc:red")
+gm.DrawPushGraphicContext(drawing_wand)
+gm.DrawSetFillColor(drawing_wand,gm.NewPixelWand())
+gm.DrawPopGraphicContext(drawing_wand)
+gm.MagickDrawImage(magick_wand,drawing_wand)
+gm.MagickWriteImages(magick_wand,"./luatex-swiglib-test.jpg",1)
+
+gm.DestroyDrawingWand(drawing_wand)
+gm.DestroyMagickWand(magick_wand)
+\stoptyping
+
+Instead of loading a library with the \type {swiglib} function, you can also
+use \type {require}:
+
+\starttyping
+local gm = require("swiglib.gmwand.core")
+\stoptyping
+
+Watch the explicit \type {swiglib} reference. Both methods are equivalent.
+
+\stopsection
+
+\startsection[title={The libraries}]
+
+Most libraries are small but some can be rather large and have additional files.
+This is why we keep them separated. On my system they are collected in the
+platform binary tree:
+
+\starttyping
+e:/tex-context/tex/texmf-mswin/bin/lib/luatex/lua/swiglib/gmwand
+e:/tex-context/tex/texmf-mswin/bin/lib/luatex/lua/swiglib/mysql
+e:/tex-context/tex/texmf-mswin/bin/lib/luatex/lua/swiglib/....
+\stoptyping
+
+One can modulate on this:
+
+\starttyping
+...tex/texmf-mswin/bin/lib/luatex/lua/swiglib/mysql/core.dll
+...tex/texmf-mswin/bin/lib/luajittex/lua/swiglib/mysql/core.dll
+...tex/texmf-mswin/bin/lib/luatex/context/lua/swiglib/mysql/core.dll
+\stoptyping
+
+are all valid. When versions are used you can provide an additional argument to the
+\type {swiglib} loader:
+
+\starttyping
+tex/texmf-mswin/bin/lib/luatex/lua/swiglib/mysql/5.6/core.dll
+\stoptyping
+
+This works with:
+
+\starttyping
+local mysql = swiglib("mysql.core","5.6")
+\stoptyping
+
+as well as:
+
+\starttyping
+local mysql = swiglib("mysql.core")
+\stoptyping
+
+It is hard to predict how operating systems look up libraries and especially
+nested loads, but as long as the root of the \type {swiglib} path is known to the
+file search routine. We've kept the main conditions for success simple: the core
+library is called \type {core.dll} or \type {core.so}. Each library has an
+(automatically called) initialize function named \type {luaopen_core}. There is no
+reason why (sym)links from the \type {swiglib} path to someplace else shouldn't
+work.
+
+In \type {texmfcnf.lua} you will find an entry like:
+
+\starttyping
+CLUAINPUTS = ".;$SELFAUTOLOC/lib/{$engine/context,$engine}/lua//"
+\stoptyping
+
+Which in practice boils down to a search for \type {luatex} or \type {luajittex}
+specific libraries. When both binaries are compatible and there are no \type
+{luajittex} binaries, the regular \type {luatex} libraries will be used.
+
+The \type {swiglib} loader function mentioned in previous sections load libraries
+in a special way: it changes dir to the specific path and then loads the library
+in the usual way. After that it returns to the path where it started out. After
+this, when the library needs additional libraries (and for instance graphicmagick
+needs a lot of them) it will first look on its own path (which is remembered).
+
+The \MKIV\ lookups are somewhat more robust in the sense that they first check
+for matches on engine specific paths. This comes in handy when the search
+patterns are too generic and one can match on for instance \type {luajittex}
+whilc \type {luatex} is used.
+
+\stopsection
+
+\startsection[title=Colofon]
+
+\starttabulate[|B|p|]
+\NC author \NC \getvariable{document}{author}, \getvariable{document}{affiliation}, \getvariable{document}{location} \NC \NR
+\NC version \NC \currentdate \NC \NR
+\NC website \NC \getvariable{document}{website} \endash\ \getvariable{document}{support} \NC \NR
+\NC copyright \NC \symbol[cc][cc-by-sa-nc] \NC \NR
+\NC comment \NC the swiglib infrastructure is implemented by Luigi Scarso \NC \NR
+\stoptabulate
+
+\stopsection
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/tiptrick/tiptrick.tex b/Master/texmf-dist/doc/context/sources/general/manuals/tiptrick/tiptrick.tex
new file mode 100644
index 00000000000..54a78513453
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/tiptrick/tiptrick.tex
@@ -0,0 +1,117 @@
+% interface=en
+%
+% author: Hans Hagen - Pragma ADE - www.pragma-ade.com
+
+\setupbodyfont
+ [dejavu]
+
+\setuppapersize
+ [HD-]
+
+\setuplayout
+ [location=middle,
+ header=0pt,
+ footer=0pt,
+ backspace=2.25cm,
+ topspace=2.25cm,
+ width=middle,
+ height=middle]
+
+\setupcolors
+ [state=start]
+
+\startreusableMPgraphic{page}
+ StartPage ;
+ picture p ; path s ;
+ fill Page withcolor .5red ;
+ draw Page withpen pensquare scaled 2cm withcolor .75[.5red,white] ;
+ s := (Field[Text][Text] enlarged .5cm) squeezed (.1cm,.15cm) ;
+ fill s withcolor .75[.5red,white] ;
+ if false :
+ p := image (graphictext "\ss TIP" withfillcolor .2white ;) ;
+ else :
+ p := textext.raw("\ss TIP") ;
+ setbounds p to (boundingbox p rightenlarged -0.025bbwidth(p)) ;
+ fi ;
+ p := p xysized(PaperWidth-1cm,PaperHeight-1cm) ;
+ p := p shifted .5(bbwidth(Page)-bbwidth(p),bbheight(Page)-bbheight(p)) ;
+ draw p withcolor .2white ;
+ clip p to s ;
+ draw p withcolor .875[.5red,white] ; ;
+ StopPage ;
+\stopreusableMPgraphic
+
+\defineoverlay
+ [page]
+ [\reuseMPgraphic{page}]
+
+\setupbackgrounds
+ [page]
+ [background=page,
+ state=repeat]
+
+\definecolor[red][r=.5]
+
+\setuphead
+ [chapter]
+ [style=\tfb,
+ before=,
+ after={\blank[line]}]
+
+\setupblank
+ [halfline]
+
+% xml interface
+
+\startxmlsetups xml:tips
+ \xmlflush{#1}
+\stopxmlsetups
+
+\startxmlsetups xml:tip
+ \startstandardmakeup
+ \startnamedsection[title][title=\xmlfirst{#1}{/title}]
+ \xmlall{#1}{/(remark|command)}
+ \vfill
+ \stopnamedsection
+ \stopstandardmakeup
+\stopxmlsetups
+
+\startxmlsetups xml:remark
+ \blank
+ \xmlflush{#1}
+ \blank
+\stopxmlsetups
+
+\definehighlight
+ [command]
+ [style=mono,
+ color=red,
+ command=no]
+
+\startxmlsetups xml:command
+ \blank
+ \starthighlight[command]
+ \xmlflush{#1}
+ \stophighlight
+ \blank
+\stopxmlsetups
+
+\startxmlsetups xml:reference
+ \vfill
+ \hfill\strut see:\space
+ \xmlflush{#1}
+\stopxmlsetups
+
+\startxmlsetups xml:initialize
+ \xmlsetsetup {#1} {
+ tips|tip|remark|command|reference
+ } {xml:*}
+\stopxmlsetups
+
+\xmlregisterdocumentsetup{main}{xml:initialize}
+
+\starttext
+
+ \xmlprocessfile{main}{tiptrick.xml}{}
+
+\stoptext
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/tiptrick/tiptrick.xml b/Master/texmf-dist/doc/context/sources/general/manuals/tiptrick/tiptrick.xml
new file mode 100644
index 00000000000..8b4a3001108
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/tiptrick/tiptrick.xml
@@ -0,0 +1,53 @@
+<?xml version='1.0'?>
+
+<!-- author: Hans Hagen - Pragma ADE - www.pragma-ade.com -->
+
+<!-- feel free to submit more tips -->
+
+<tips xmlns="www.pragma-ade.com/schemas/tip.rng">
+
+ <tip>
+ <title>Generating Formats</title>
+ <remark>for all languages:</remark>
+ <command>context --make --all</command>
+ <remark>only english interface:</remark>
+ <command>context --make en</command>
+ <remark>for plain tex:</remark>
+ <command>mtxrun --script plain --make</command>
+ <!-- reference>mtexexec.pdf</reference -->
+ </tip>
+
+ <tip>
+ <title>Updating</title>
+ <remark>when installed from the wiki:</remark>
+ <command>..../first-setup(.cmd)</command>
+ <remark>when downloaded from the website:</remark>
+ <command>cd ..../tex/texmf-context</command>
+ <command>wget http://www.pragma-ade.com/context/current/cont-tmf.zip</command>
+ <command>unzip cont-tmf.zip</command>
+ <command>mtxrun --generate</command>
+ <!-- reference>minstall.pdf</reference -->
+ </tip>
+
+ <tip>
+ <title>Generating Command Lists</title>
+ <remark>quick reference document of english and dutch commands:</remark>
+ <command>context --interface=nl --global --result=setup-nl x-set-12.mkiv</command>
+ <command>context --interface=en --global --result=setup-en x-set-12.mkiv</command>
+ </tip>
+
+ <tip>
+ <title>Module Documentation</title>
+ <remark>pretty printed, annotated module documentation:</remark>
+ <command>mtxrun --script modules syst-aux.mkiv</command>
+ </tip>
+
+ <tip>
+ <title>Listings</title>
+ <remark>verbatim listings of (ascii) files:</remark>
+ <command>context --extra=listing --bodyfont=8pt --scite somefile.tex</command>
+ <command>context --extra=listing --bodyfont=8pt --scite somefile.lua</command>
+ <command>context --extra=listing --bodyfont=8pt --scite somefile.xml</command>
+ </tip>
+
+</tips>
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/tools/tools-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/tools/tools-mkiv.tex
new file mode 100644
index 00000000000..5f20e6985d3
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/tools/tools-mkiv.tex
@@ -0,0 +1,501 @@
+% language=uk
+
+% author : Hans Hagen, PRAGMA ADE, NL
+% license : Creative Commons, Attribution-NonCommercial-ShareAlike 3.0 Unported
+
+\usemodule[abr-02]
+
+\setuplayout
+ [width=middle,
+ height=middle,
+ backspace=2cm,
+ topspace=1cm,
+ footer=0pt,
+ bottomspace=2cm]
+
+\definecolor
+ [DocumentColor]
+ [r=.5]
+
+\setuptype
+ [color=DocumentColor]
+
+\setuptyping
+ [color=DocumentColor]
+
+\usetypescript
+ [iwona]
+
+\setupbodyfont
+ [iwona]
+
+\setuphead
+ [chapter]
+ [style=\bfc,
+ color=DocumentColor]
+
+\setuphead
+ [section]
+ [style=\bfb,
+ color=DocumentColor]
+
+\setupinteraction
+ [hidden]
+
+\setupwhitespace
+ [big]
+
+\setupheadertexts
+ []
+
+\setupheadertexts
+ []
+ [{\DocumentColor \type {luatools mtxrun context}\quad\pagenumber}]
+
+\usesymbols[cc]
+
+\def\sTEXMFSTART{\type{texmfstart}}
+\def\sLUATOOLS {\type{luatools}}
+\def\sMTXRUN {\type{mtxrun}}
+\def\sCONTEXT {\type{context}}
+\def\sKPSEWHICH {\type{kpsewhich}}
+\def\sMKTEXLSR {\type{mktexlsr}}
+\def\sXSLTPROC {\type{xsltproc}}
+
+\usemodule[narrowtt]
+
+\startdocument
+ [metadata:author=Hans Hagen,
+ metadata:title={Tools: luatools, mtxrun, context},
+ author=Hans Hagen,
+ affiliation=PRAGMA ADE,
+ location=Hasselt NL,
+ title=Tools,
+ extra-1=luatools,
+ extra-2=mtxrun,
+ extra-3=context,
+ support=www.contextgarden.net,
+ website=www.pragma-ade.nl]
+
+\startMPpage
+ StartPage ;
+ picture p ; p := image (
+ for i=1 upto 21 :
+ for j=1 upto 30 :
+ drawarrow (fullcircle rotated uniformdeviate 360) scaled 10 shifted (i*15,j*15) ;
+ endfor ;
+ endfor ;
+ ) ;
+ p := p ysized (bbheight(Page)-4mm) ;
+ fill Page enlarged 2mm withcolor \MPcolor{DocumentColor} ;
+ draw p shifted (center Page - center p) withpen pencircle scaled 2 withcolor .5white ;
+ numeric dx ; dx := bbwidth(Page)/21 ;
+ numeric dy ; dy := bbheight(Page)/30 ;
+ p := textext("\tt\bf\white\getvariable{document}{extra-1}") xsized(14*dx) ;
+ p := p shifted (-lrcorner p) shifted lrcorner Page shifted (-1dx,8dy) ;
+ draw p ;
+ p := textext("\tt\bf\white\getvariable{document}{extra-2}") xsized(14*dx) ;
+ p := p shifted (-lrcorner p) shifted lrcorner Page shifted (-1dx,5dy) ;
+ draw p ;
+ p := textext("\tt\bf\white\getvariable{document}{extra-3}") xsized(14*dx) ;
+ p := p shifted (-lrcorner p) shifted lrcorner Page shifted (-1dx,2dy) ;
+ draw p ;
+ setbounds currentpicture to Page ;
+ StopPage
+\stopMPpage
+
+\startsubject[title=Contents]
+
+\placelist[section][alternative=a]
+
+\stopsubject
+
+\startsection[title={Remark}]
+
+This manual is work in progress. Feel free to submit additions or corrections.
+Before you start reading, it is good to know that in order to get starting with
+\CONTEXT, the easiest way to do that is to download the standalone distribution
+from \type {contextgarden.net}. After that you only need to make sure that \type
+{luatex} is in your path. The main command you use is then \type {context} and
+normally it does all the magic it needs itself.
+
+\stopsection
+
+\startsection[title={Introduction}]
+
+Right from the start \CONTEXT\ came with programs that managed the process of
+\TEX-ing. Although you can perfectly well run \TEX\ directly, it is a fact that
+often multiple runs are needed as well as that registers need to be sorted.
+Therefore managing a job makes sense.
+
+First we had \TEXEXEC\ and \TEXUTIL, and both were written in \MODULA, and as
+this language was not supported on all platforms the programs were rewritten in
+\PERL. Following that a few more tools were shipped with \CONTEXT.
+
+When we moved on to \RUBY\ all the \PERL\ scripts were rewritten and when
+\CONTEXT\ \MKIV\ showed up, \LUA\ replaced \RUBY. As we use \LUATEX\ this means
+that currently the tools and the main program share the same language. For \MKII\
+scripts like \TEXEXEC\ will stay around but the idea is that there will be \LUA\
+alternatives for them as well.
+
+Because we shipped many scripts, and because the de facto standard \TEX\
+directory structure expects scripts to be in certain locations we not only ship
+tools but also some more generic scripts that locate and run these tools.
+
+\stopsection
+
+\startsection[title={The location}]
+
+Normally you don't need to know so many details about where the scripts
+are located but here they are:
+
+\starttyping
+<texroot>/scripts/context/perl
+<texroot>/scripts/context/ruby
+<texroot>/scripts/context/lua
+<texroot>/scripts/context/stubs
+\stoptyping
+
+This hierarchy was actually introduced because \CONTEXT\ was shipped with a bunch
+of tools. As mentioned, we nowadays focus on \LUA\ but we keep a few of the older
+scripts around in the \PERL\ and \RUBY\ paths.Now, if you're only using \CONTEXT\
+\MKIV, and this is highly recommended, you can forget about all but the \LUA\
+scripts.
+
+\stopsection
+
+\startsection[title={The traditional finder}]
+
+When you run scripts multiple times, and in the case of \CONTEXT\ they are even
+run inside other scripts, you want to minimize the startup time. Unfortunately
+the traditional way to locate a script, using \sKPSEWHICH, is not that fast,
+especially in a setup with many large trees Also, because not all tasks can be
+done with the traditional scripts (take format generation) we provided a runner
+that could deal with this: \sTEXMFSTART. As this script was also used in more
+complex workflows, it had several tasks:
+
+\startitemize[packed]
+\item locate scripts in the distribution and run them using the right
+ interpreter
+\item do this selectively, for instance identify the need for a run using
+ checksums for potentially changed files (handy for image conversion)
+\item pass information to child processes so that lookups are avoided
+\item choose a distribution among several installed versions (set the root
+ of the \TEX\ tree)
+\item change the working directory before running the script
+\item resolve paths and names on demand and launch programs with arguments
+ where names are expanded controlled by prefixes (handy for
+ \TEX-unware programs)
+\item locate and open documentation, mostly as part the help systems in
+ editors, but also handy for seeing what configuration file is used
+\item act as a \KPSEWHICH\ server cq.\ client (only used in special cases,
+ and using its own database)
+\stopitemize
+
+Of course there were the usual more obscure and undocumented features as
+well. The idea was to use this runner as follows:
+
+\starttyping
+texmfstart texexec <further arguments>
+texmfstart --tree <rootoftree> texexec <further arguments>
+\stoptyping
+
+These are just two ways of calling this program. As \sTEXMFSTART\ can initialize
+the environment as well, it is basically the only script that has to be present
+in the binary path. This is quite comfortable as this avoids conflicts in names
+between the called scripts and other installed programs.
+
+Of course calls like above can be wrapped in a shell script or batch file without
+penalty as long as \sTEXMFSTART\ itself is not wrapped in a caller script that
+applies other inefficient lookups. If you use the \CONTEXT\ minimals you can be
+sure that the most efficient method is chosen, but we've seen quite inefficient
+call chains elsewhere.
+
+In the \CONTEXT\ minimals this script has been replaced by the one we will
+discuss in the next section: \sMTXRUN\ but a stub is still provided.
+
+\stopsection
+
+\startsection[title={The current finder}]
+
+In \MKIV\ we went a step further and completely abandoned the traditional lookup
+methods and do everything in \LUA. As we want a clear separation between
+functionality we have two main controlling scripts: \sMTXRUN\ and \sLUATOOLS. The
+last name may look somewhat confusing but the name is just one on in a series.
+\footnote {We have \type {ctxtools}, \type {exatools}, \type {mpstools}, \type
+{mtxtools}, \type {pdftools}, \type {rlxtools}, \type {runtools}, \type
+{textools}, \type {tmftools} and \type {xmltools}. Most if their funtionality is
+already reimplemented.}
+
+In \MKIV\ the \sLUATOOLS\ program is nowadays seldom used. It's just a drop in
+for \sKPSEWHICH\ plus a bit more. In that respect it's rather dumb in that it
+does not use the database, but clever at the same time because it can make one
+based on the little information available when it runs. It can also be used to
+generate format files either or not using \LUA\ stubs but in practice this is not
+needed at all.
+
+For \CONTEXT\ users, the main invocation of this tool is when the \TEX\ tree is
+updated. For instance, after adding a font to the tree or after updating
+\CONTEXT, you need to run:
+
+\starttyping
+mtxrun --generate
+\stoptyping
+
+After that all tools will know where to find stuff and how to behave well within
+the tree. This is because they share the same code, mostly because they are
+started using \sMTXRUN. For instance, you process a file with:
+
+\starttyping
+mtxrun --script context <somefile>
+\stoptyping
+
+Because this happens often, there's also a shortcut:
+
+\starttyping
+context <somefile>
+\stoptyping
+
+But this does use \sMTXRUN\ as well. The help information of \sMTXRUN\ is rather
+minimalistic and if you have no clue what an option does, you probably never
+needed it anyway. Here we discuss a few options. We already saw that we can
+explicitly ask for a script:
+
+\starttyping
+mtxrun --script context <somefile>
+\stoptyping
+
+but
+
+\starttyping
+mtxrun context <somefile>
+\stoptyping
+
+also works. However, by using \type {--script} you limit te lookup to the valid
+\CONTEXT\ \MKIV\ scripts. In the \TEX\ tree these have names prefixed by \type
+{mtx-} and a lookup look for a plural as well. So, the next two lookups are
+equivalent:
+
+\starttyping
+mtxrun --script font
+mtxrun --script fonts
+\stoptyping
+
+Both will run \type {mtx-fonts.lua}. Actually, this is one of the scripts that
+you might need when your font database is somehow outdated and not updated
+automatically:
+
+\starttyping
+mtxrun --script fonts --reload --force
+\stoptyping
+
+Normally \sMTXRUN\ is all you need in order to run a script. However, there are a
+few more options:
+
+\ctxlua{os.execute("mtxrun > tools-mkiv-help.tmp")}
+
+\typefile[ntyping]{tools-mkiv-help.tmp}
+
+Don't worry,you only need those obscure features when you integrate \CONTEXT\ in
+for instance a web service or when you run large projects where runs and paths
+take special care.
+
+\stopsection
+
+\startsection[title={Updating}]
+
+There are two ways to update \CONTEXT\ \MKIV. When you manage your
+trees yourself or when you use for instance \TEXLIVE, you act as
+follows:
+
+\startitemize[packed]
+\item download the file cont-tmf.zip from \type {www.pragma-ade.com} or elsewhere
+\item unzip this file in a subtree, for instance \type {tex/texmf-local}
+\item run \type {mtxrun --generate}
+\item run \type {mtxrun --script font --reload}
+\item run \type {mtxrun --script context --make}
+\stopitemize
+
+Or shorter:
+
+\startitemize[packed]
+\item run \type {mtxrun --generate}
+\item run \type {mtxrun font --reload}
+\item run \type {context --make}
+\stopitemize
+
+Normally these commands are not even needed, but they are a nice test if your
+tree is still okay. To some extend \sCONTEXT\ is clever enough to decide if the
+databases need to be regenerated and|/|or a format needs to be remade and|/|or if
+a new font database is needed.
+
+Now, if you also want to run \MKII, you need to add:
+
+\startitemize[packed]
+\item run \type {mktexlsr}
+\item run \type {texexec --make}
+\stopitemize
+
+The question is, how to act when \sLUATOOLS\ and \sMTXRUN\ have been updated
+themselves? In that case, after unzipping the archive, you need to do the
+following:
+
+\startitemize[packed]
+\item run \type {luatools --selfupdate}
+\item run \type {mtxrun --selfupdate}
+\stopitemize
+
+For quite a while we shipped so called \CONTEXT\ minimals. These zip files
+contained only the resources and programs that made sense for running \CONTEXT.
+Nowadays the minimals are installed and synchronized via internet. \footnote
+{This project was triggered by Mojca Miklavec who is also charge of this bit of
+the \CONTEXT\ infrastructure. More information can be found at \type
+{contextgarden.net}.} You can just run the installer again and no additional
+commands are needed. In the console you will see several calls to \sMTXRUN\ and
+\sLUATOOLS\ fly by.
+
+\stopsection
+
+\startsection[title={The tools}]
+
+We only mention the tools here. The most important ones are \sCONTEXT\ and \type
+{fonts}. You can ask for a list of installed scripts with:
+
+\starttyping
+mtxrun --script
+\stoptyping
+
+On my machine this gives:
+
+\ctxlua{os.execute("mtxrun --script > tools-mkiv-help.tmp")}
+
+\typefile[ntyping]{tools-mkiv-help.tmp}
+
+The most important scripts are \type {mtx-fonts} and \type {mtx-context}. By
+default fonts are looked up by filename (the \type {file:} prefix before font
+names in \CONTEXT\ is default). But you can also lookup fonts by name (\type
+{name:}) or by specification (\type {spec:}). If you want to use these two
+methods, you need to generate a font database as mentioned in the previous
+section. You can also use the font tool to get information about the fonts
+installed on your system.
+
+\stopsection
+
+\startsection[title={Running \CONTEXT}]
+
+The \sCONTEXT\ tool is what you will use most as it manages your
+run.
+
+\ctxlua{os.execute("context > tools-mkiv-help.tmp")}
+
+\typefile[ntyping]{tools-mkiv-help.tmp}
+
+There are few exert options too:
+
+\ctxlua{os.execute("context --expert > tools-mkiv-help.tmp")}
+
+\typefile[ntyping]{tools-mkiv-help.tmp}
+
+You might as well forget about these unless you are one of the
+\CONTEXT\ developers.
+
+\stopsection
+
+\startsection[title={Prefixes}]
+
+A handy feature of \sMTXRUN\ (and as most features an inheritance of
+\sTEXMFSTART) is that it will resolve prefixed arguments. This can be of help
+when you run programs that are unaware of the \TEX\ tree but nevertheless need to
+locate files in it.
+
+\ctxlua{os.execute("mtxrun --prefixes > tools-mkiv-help.tmp")}
+
+\typefile[ntyping]{tools-mkiv-help.tmp}
+
+An example is:
+
+\starttyping
+mtxrun --execute xsltproc file:whatever.xsl file:whatever.xml
+\stoptyping
+
+The call to \sXSLTPROC\ will get two arguments, being the complete path to the
+files (given that it can be resolved). This permits you to organize the files in
+a similar was as \TEX\ files.
+
+\stopsection
+
+\startsection[title={Stubs}]
+
+As the tools are written in the \LUA\ language we need a \LUA\ interpreter and or
+course we use \LUATEX\ itself. On \UNIX\ we can copy \sLUATOOLS\ and \sMTXRUN\ to
+files in the binary path with the same name but without suffix. Starting them in
+another way is a waste of time, especially when \sKPSEWHICH\ is used to find
+then, something which is useless in \MKIV\ anyway. Just use these scripts
+directly as they are self contained.
+
+For \sCONTEXT\ and other scripts that we want convenient access to, stubs are
+needed, like:
+
+\starttyping
+#!/bin/sh
+mtxrun --script context "$@"
+\stoptyping
+
+This is also quite efficient as the \sCONTEXT\ script \type {mtx-context} is
+loaded in \sMTXRUN\ and uses the same database.
+
+On \WINDOWS\ you can copy the scripts as|-|is and associate the suffix with
+\LUATEX\ (or more precisely: \type {texlua}) but then all \LUA\ script will be
+run that way which is not what you might want.
+
+In \TEXLIVE\ stubs for starting scripts were introduced by Fabrice Popineau. Such
+a stub would start for instance \sTEXMFSTART, that is: it located the script
+(\PERL\ or \RUBY) in the \TEX\ tree and launched it with the right interpreter.
+Later we shipped pseudo binaries of \sTEXMFSTART: a \RUBY\ interpreter plus
+scripts wrapped into a self contained binary.
+
+For \MKIV\ we don't need such methods and started with simple batch files,
+similar to the \UNIX\ startup scripts. However, these have the disadvantage that
+they cannot be used in other batch files without using the \type {start} command.
+In \TEXLIVE\ this is taken care of by a small binary written bij T.M.\ Trzeciak
+so on \TEXLIVE\ 2009 we saw a call chain from \type {exe} to \type {cmd} to \type
+{lua} which is somewhat messy.
+
+This is why we now use an adapted and stripped down version of that program that
+is tuned for \sMTXRUN, \sLUATOOLS\ and \sCONTEXT. So, we moved from the original
+\type {cmd} based approach to an \type {exe} one.
+
+\starttyping
+mtxrun.dll
+mtxrun.exe
+\stoptyping
+
+You can copy \type {mtxrun.exe} to for instance \type {context.exe} and it will
+still use \sMTXRUN\ for locating the right script. It also takes care of mapping
+\sTEXMFSTART\ to \sMTXRUN. So we've removed the intermediate \type {cmd} step,
+can not run the script as any program, and most of all, we're as efficient as can
+be.
+
+Of course this program is only meaningful for the \CONTEXT\ approach to tools.
+
+It may all sound more complex than it is but once it works users will not notice
+those details. Als, in practice not that much has changed in running the tools
+between \MKII\ and \MKIV\ as we've seen no reason to change the methods.
+
+\stopsection
+
+\startsubject[title={Colofon}]
+
+\starttabulate[|B|p|]
+ \NC author \NC \documentvariable{author},
+ \documentvariable{affiliation},
+ \documentvariable{location} \NC \NR
+ \NC version \NC \currentdate \NC \NR
+ \NC website \NC \documentvariable{website} \endash\
+ \documentvariable{support} \NC \NR
+ \NC copyright \NC \symbol[cc][cc-by-sa-nc] \NC \NR
+\stoptabulate
+
+\stopsubject
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/units/units-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/units/units-mkiv.tex
new file mode 100644
index 00000000000..0d91c67df11
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/units/units-mkiv.tex
@@ -0,0 +1,538 @@
+% language=uk
+
+\usemodule[art-01,abr-02,physics-units]
+
+\definecolor[red] [darkred]
+\definecolor[green] [darkgreen]
+\definecolor[blue] [darkblue]
+\definecolor[yellow] [darkyellow]
+\definecolor[magenta][darkmagenta]
+\definecolor[cyan] [darkcyan]
+
+\definecolor[maincolor] [darkcyan]
+\definecolor[extracolor][darkmagenta]
+
+\setupbodyfont
+ [10pt]
+
+\setuptyping
+ [color=extracolor]
+
+\setuptype
+ [color=extracolor] % darkyellow
+
+% \setupnumbering
+% [alternative=doublesided]
+
+\setupinteraction
+ [hidden]
+
+\setuphead
+ [section]
+ [color=maincolor]
+
+\usesymbols[cc]
+
+\startdocument
+ [metadata:author=Hans Hagen,
+ metadata:title=Units,
+ author=Hans Hagen,
+ affiliation=PRAGMA ADE,
+ location=Hasselt NL,
+ title=Units,
+ extra=ConTeXt MkIV,
+ support=www.contextgarden.net,
+ website=www.pragma-ade.nl]
+
+\unexpanded\def\UnitsHack#1#2%
+ {\setbox\scratchbox\hbox{\bf\strut#1#2/}% kerning and such
+ \hbox to \wd\scratchbox{\bf\strut#1\hss/\hss#2}}
+
+\startMPpage
+
+ StartPage ;
+ fill Page enlarged 2mm withcolor \MPcolor{darkcyan} ;
+ pickup pencircle scaled 2mm ;
+ picture p, q, r ;
+ p := textext("\ssbf\WORD{\documentvariable{title}}") xsized (bbheight Page - 2cm) rotated 90 ;
+ q := textext("\ssbf\WORD{\documentvariable{author}}") ysized 1cm ;
+ r := textext("\ssbf\WORD{\documentvariable{extra}}") xsized bbwidth q ;
+ draw anchored.rt (p, center rightboundary Page shifted (-1cm, 0mm)) withcolor white ;
+ draw anchored.lft(q, ulcorner Page shifted ( 1cm, -84mm)) withcolor white ; % \MPcolor{darkred} ;
+ draw anchored.lft(r, ulcorner Page shifted ( 1cm,-108mm)) withcolor white ; % \MPcolor{darkred} ;
+ StopPage ;
+
+\stopMPpage
+
+% \page[empty] \setuppagenumber[start=1]
+
+\startsubject[title={Contents}]
+
+\placelist[section][criterium=all,interaction=all]
+
+\stopsubject
+
+\startsection[title={Introduction}]
+
+In \CONTEXT\ \MKII\ there is a module that implements consistent
+typesetting of units (quantities and dimensions). In \MKIV\ this
+functionality is now part of the physics core modules. This is
+also one of the mechanisms that got a new user interface: instead
+of using commands we now parse text. Thanks to those users who
+provided input we're more complete now that in \MKII. You can browse
+the mailing list archive to get some sense of history.
+
+\stopsection
+
+\startsection[title={The main command}]
+
+The core command is \type {\unit}. The argument to this command gets
+parsed and converted into a properly typeset dimension. Normally there
+will be a quantity in front.
+
+\starttabulate
+\NC \type{10 meter} \NC \unit{10 meter} \NC \NR
+\NC \type{10 meter per second} \NC \unit{10 meter per second} \NC \NR
+\NC \type{10 square meter per second} \NC \unit{10 square meter per second} \NC \NR
+\stoptabulate
+
+The parser knows about special cases, like synonyms:
+
+\starttabulate
+\NC \type{10 degree celsius} \NC \unit{10 degree celsius} \NC \NR
+\NC \type{10 degrees celsius} \NC \unit{10 degrees celsius} \NC \NR
+\NC \type{10 celsius} \NC \unit{10 celsius} \NC \NR
+\stoptabulate
+
+The units can be rather complex, for example:
+
+\startbuffer
+\unit{30 kilo pascal square meter / second kelvin}
+\stopbuffer
+
+\typebuffer
+
+This comes out as: \ignorespaces\getbuffer\removeunwantedspaces. Depending
+on the unit at had, recognition is quite flexible. The following variants
+all work out ok.
+
+\starttabulate
+\NC \type{10 kilogram} \NC \unit{10 kilogram} \NC \NR
+\NC \type{10 kilo gram} \NC \unit{10 kilo gram} \NC \NR
+\NC \type{10 k gram} \NC \unit{10 k gram} \NC \NR
+\NC \type{10 kilo g} \NC \unit{10 kilo g} \NC \NR
+\NC \type{10 k g} \NC \unit{10 k g} \NC \NR
+\NC \type{10 kg} \NC \unit{10 kg} \NC \NR
+\NC \type{10 kilog} \NC \unit{10 kilog} \NC \NR
+\NC \type{10 kgram} \NC \unit{10 kgram} \NC \NR
+\stoptabulate
+
+Of course being consistent makes sense, so normally you will use
+a consistent mix of short or long keywords.
+
+You can provide a qualifier that gets lowered and appended to
+the preceding unit.
+
+\startbuffer
+\unit{112 decibel (A)}
+\stopbuffer
+
+\typebuffer
+
+This gives: \ignorespaces\getbuffer\removeunwantedspaces. Combinations
+are also possible:
+
+\starttabulate
+\NC \type{5 watt per meter celsius} \NC \unit{5 watt per meter celsius} \NC \NR
+\NC \type{5 watt per meter degrees celsius} \NC \unit{5 watt per meter degrees celsius} \NC \NR
+\NC \type{5 watt per meter kelvin} \NC \unit{5 watt per meter kelvin} \NC \NR
+\NC \type{5 watt per meter per kelvin} \NC \unit{5 watt per meter per kelvin} \NC \NR
+\NC \type{10 arcminute} \NC \unit{10 arcminute} \NC \NR
+\NC \type{10 arcminute 20 arcsecond} \NC \unit{10 arcminute 20 arcsecond} \NC \NR
+\stoptabulate
+
+\stopsection
+
+\startsection[title={Extra units}]
+
+To some extent units can be tuned. You can for instance
+influence the spacing between a number and a unit:
+
+\startbuffer
+ \unit{35 kilogram per cubic meter}
+\setupunit[space=normal] \unit{35 kilogram per cubic meter}
+\setupunit[space=big] \unit{35 kilogram per cubic meter}
+\setupunit[space=medium] \unit{35 kilogram per cubic meter}
+\setupunit[space=small] \unit{35 kilogram per cubic meter}
+\setupunit[space=none] \unit{35 kilogram per cubic meter}
+\stopbuffer
+
+\typebuffer
+
+Of course no spacing looks rather bad:
+
+\startlines
+\getbuffer
+\stoplines
+
+Another parameter is \type {separator}. In order to demonstrate
+this we define an extra unit command:
+
+\startbuffer
+\defineunit[sunit][separator=small]
+\defineunit[nunit][separator=none]
+\stopbuffer
+
+\typebuffer \getbuffer
+
+We now have two more commands:
+
+\startbuffer
+\unit {35 kilogram cubic meter}
+\sunit{35 kilogram cubic meter}
+\nunit{35 kilogram cubic meter}
+\stopbuffer
+
+\typebuffer
+
+These three commands give different results:
+
+\startlines
+\getbuffer
+\stoplines
+
+Valid separators are \type {normal}, \type {big}, \type {medium},
+\type {small}, \type {none}. You can let units stand out by
+applying color or a specific style.
+
+\startbuffer
+\setupunit[style=\bi,color=maincolor]
+\unit{10 square meter per second}
+\stopbuffer
+
+\typebuffer
+
+Keep in mind that all defined units inherit from their parent
+definition unless they are set up themselves.
+
+\start \blank \getbuffer \blank \stop
+
+To some extent you can control rendering in text and math mode. As
+an example we define an extra instance.
+
+\startbuffer
+\defineunit[textunit][alternative=text]
+\stopbuffer
+
+\typebuffer \getbuffer
+
+\startbuffer
+test \unit {10 cubic meter per second} test
+test \textunit{10 cubic meter per second} test
+test $\unit {10 cubic meter per second}$ test
+test $\textunit{10 cubic meter per second}$ test
+test 10 \unit {cubic meter per second} test
+test 10 \textunit{cubic meter per second} test
+test $10 \unit {cubic meter per second}$ test
+test $10 \textunit{cubic meter per second}$ test
+\stopbuffer
+
+\typebuffer
+
+\startlines
+\getbuffer
+\stoplines
+
+\stopsection
+
+\startsection[title={Labels}]
+
+The units, prefixes and operators are typeset using the label
+mechanism which means that they can be made to adapt to a language
+and|/|or adapted. Instead of language specific labels you can also
+introduce mappings that don't relate to a language at all. As an
+example we define some bogus mapping.
+
+\startbuffer
+\setupunittext
+ [whatever]
+ [meter=retem,
+ second=dnoces]
+
+\setupprefixtext
+ [whatever]
+ [kilo=olik]
+
+\setupoperatortext
+ [whatever]
+ [solidus={ rep }]
+\stopbuffer
+
+\typebuffer \getbuffer
+
+Such a mapping can be partial and the current language will
+be the default fallback and itselfs falls back on the English
+language mapping.
+
+\startbuffer
+\unit{10 km/s}
+\unit{10 Kilo Meter/s}
+\unit{10 kilo Meter/s}
+\unit{10 Kilo m/s}
+\unit{10 k Meter/s}
+\stopbuffer
+
+\typebuffer
+
+When we typeset this we get the normal rendering:
+
+\startlines
+\getbuffer
+\stoplines
+
+However, when we change the language parameter, we get
+a different result:
+
+\startlines
+\setupunit[language=whatever]\getbuffer
+\stoplines
+
+The alternative rendering is set up as follows:
+
+\starttyping
+\setupunit[language=whatever]
+\stoptyping
+
+You can also decide to use a special instance of units:
+
+\starttyping
+\defineunit[wunit][language=whatever]
+\stoptyping
+
+This will define the \type {\wunit} command and leave the original
+\type {\unit} command untouched.
+
+\stopsection
+
+\startsection[title={Digits}]
+
+In addition to units we have digits. These can be used independently
+but the same functionality is also integrated in the unit commands.
+The main purpose of this command is formatting in tables, of which
+we give an example below.
+
+\starttabulate[|l|r|]
+\NC \type{12,345.67 kilogram} \NC \unit{12,345.67 kilogram} \NR
+\NC \type{__,__1.23 kilogram} \NC \unit{__,__1.23 kilogram} \NR
+\NC \type{__,___.12 kilogram} \NC \unit{__,___.12 kilogram} \NR
+\NC \type{__,__1.== kilogram} \NC \unit{__,__1.== kilogram} \NR
+\NC \type{__,___:23 kilogram} \NC \unit{__,___:23 kilogram} \NR
+\stoptabulate
+
+The \type {_} character serves as placeholders. There are some
+assumptions to how numbers are constructed. In principe the input
+assumes a comma to separate thousands and a period to separate the
+fraction.
+
+\getbuffer
+
+You can swap periods and commas in the output. In fact there are a
+few methods available. For instance we can separate the thousands
+with a small space instead of a symbol.
+
+\startbuffer
+\starttabulate[|c|r|r|]
+\HL
+\NC 0 \NC \setupunit[method=0]\unit{00,000.10 kilogram}
+ \NC \setupunit[method=0]\unit{@@,@@0.10 kilogram} \NC \NR
+\NC 1 \NC \setupunit[method=1]\unit{00,000.10 kilogram}
+ \NC \setupunit[method=1]\unit{@@,@@0.10 kilogram} \NC \NR
+\NC 2 \NC \setupunit[method=2]\unit{00,000.10 kilogram}
+ \NC \setupunit[method=2]\unit{@@,@@0.10 kilogram} \NC \NR
+\NC 3 \NC \setupunit[method=3]\unit{00,000.10 kilogram}
+ \NC \setupunit[method=3]\unit{@@,@@0.10 kilogram} \NC \NR
+\NC 4 \NC \setupunit[method=4]\unit{00,000.10 kilogram}
+ \NC \setupunit[method=4]\unit{@@,@@0.10 kilogram} \NC \NR
+\NC 5 \NC \setupunit[method=5]\unit{00,000.10 kilogram}
+ \NC \setupunit[method=5]\unit{@@,@@0.10 kilogram} \NC \NR
+\NC 6 \NC \setupunit[method=6]\unit{00,000.10 kilogram}
+ \NC \setupunit[method=6]\unit{@@,@@0.10 kilogram} \NC \NR
+\HL
+\stoptabulate
+\stopbuffer
+
+\typebuffer % [bodyfont=9pt]
+
+\getbuffer
+
+The digit modes can be summarized as::
+
+\startitemize[n,packed]
+\item periods/comma
+\item commas/period
+\item thinmuskips/comma
+\item thinmuskips/period
+\item thickmuskips/comma
+\item thickmuskips/period
+\stopitemize
+
+You can reverse the order of commas and period in the input by
+setting the parameter \type {order} to \type {reverse}.
+
+The digit parser handles a bunch of special characters as
+well as different formats. We strongly suggest you to use
+the grouped call.
+
+\starttabulate[|l|l|l|]
+\NC \type{.} \NC , . \NC comma or period \NC \NR
+\NC \type{,} \NC , . \NC comma or period \NC \NR
+\NC \type{:} \NC \NC invisible period \NC \NR
+\NC \type{;} \NC \NC invisible comma \NC \NR
+\NC \type{_} \NC \NC invisible space \NC \NR
+\NC \type{/} \NC \NC invisible sign \NC \NR
+\NC \type{-} \NC $-$ \NC minus sign \NC \NR
+\NC \type{+} \NC $+$ \NC plus sign \NC \NR
+\NC \type{//} \NC \NC invisible high sign \NC \NR
+\NC \type{--} \NC $\negative$ \NC high minus sign \NC \NR
+\NC \type{++} \NC $\positive$ \NC high plus sign \NC \NR
+\NC \type{=} \NC $\zeroamount$ \NC zero padding \NC \NR
+\stoptabulate
+
+Let's give some examples:
+
+\starttabulate[|l|r|]
+\NC \type{1} \NC \ruledhbox{\strut\digits{1}} \NC \NR
+\NC \type{12} \NC \ruledhbox{\strut\digits{12}} \NC \NR
+\NC \type{12.34} \NC \ruledhbox{\strut\digits{12.34}} \NC \NR
+\NC \type{123,456} \NC \ruledhbox{\strut\digits{123,456}} \NC \NR
+\NC \type{123,456.78} \NC \ruledhbox{\strut\digits{123,456.78}} \NC \NR
+\NC \type{12,34} \NC \ruledhbox{\strut\digits{12,34}} \NC \NR
+\NC \type{.1234} \NC \ruledhbox{\strut\digits{.1234}} \NC \NR
+\NC \type{1234} \NC \ruledhbox{\strut\digits{1234}} \NC \NR
+\NC \type{123,456.78^9} \NC \ruledhbox{\strut\digits{123,456.78^9}} \NC \NR
+\NC \type{123,456.78e9} \NC \ruledhbox{\strut\digits{123,456.78e9}} \NC \NR
+\NC \type{/123,456.78e-9} \NC \ruledhbox{\strut\digits{/123,456.78e-9}} \NC \NR
+\NC \type{-123,456.78e-9} \NC \ruledhbox{\strut\digits{-123,456.78e-9}} \NC \NR
+\NC \type{+123,456.78e-9} \NC \ruledhbox{\strut\digits{+123,456.78e-9}} \NC \NR
+\NC \type{//123,456.78e-9} \NC \ruledhbox{\strut\digits{//123,456.78e-9}} \NC \NR
+\NC \type{--123,456.78e-9} \NC \ruledhbox{\strut\digits{--123,456.78e-9}} \NC \NR
+\NC \type{++123,456.78e-9} \NC \ruledhbox{\strut\digits{++123,456.78e-9}} \NC \NR
+\NC \type{___,___,123,456,789.00} \NC \ruledhbox{\strut\digits{___,___,123,456,789.00}} \NC \NR
+\NC \type{___,___,_12,345,678.==} \NC \ruledhbox{\strut\digits{___,___,_12,345,678.==}} \NC \NR
+\stoptabulate
+
+\stopsection
+
+\startsection[title={Adding units}]
+
+It is possible to add extra snippets. This is a two step process:
+first some snippet is defined, next a proper label is set up. In the
+next example we define a couple of \TEX\ dimensions:
+
+\startbuffer
+\registerunit
+ [unit]
+ [point=point,
+ basepoint=basepoint,
+ scaledpoint=scaledpoint,
+ didot=didot,
+ cicero=cicero]
+\stopbuffer
+
+\typebuffer \getbuffer
+
+Possible categories are: \type {prefix}, \type {unit}, \type {operator},
+\type {suffix}, \type {symbol},\type {packaged}. Next we define labels:
+
+\startbuffer
+\setupunittext
+ [point=pt,
+ basepoint=bp,
+ scaledpoint=sp,
+ didot=dd,
+ cicero=cc]
+\stopbuffer
+
+\typebuffer \getbuffer
+
+Now we can use use these:
+
+\startbuffer
+\unit{10 point / second}
+\stopbuffer
+
+\typebuffer
+
+Of course you can wonder what this means.
+
+\blank \getbuffer \blank
+
+When no label is defined the long name is used:
+
+\startbuffer
+\registerunit
+ [unit]
+ [page=page]
+\stopbuffer
+
+\typebuffer \getbuffer
+
+This is used as:
+
+\startbuffer
+\unit{10 point / page}
+\stopbuffer
+
+\typebuffer
+
+Which gives:
+
+\blank \getbuffer \blank
+
+\stopsection
+
+\startsection[title={Built in keywords}]
+
+A given sequence of keywords is translated in an list of internal
+keywords. For instance \type {m}, \type {Meter} and \type {meter}
+all become \type {meter} and that one is used when resolving a
+label. In the next tables the right column mentions the internal
+keyword. The right column shows the Cased variant, but a lowercase
+one is built|-|in as well.
+
+The following prefixes are built|-|in:
+
+\showunits[prefixes]
+
+The following units are supported, including some combinations:
+
+\showunits[units]
+
+The amount of operators is small:
+
+\showunits[operators]
+
+There is also a small set of (names) suffixes:
+
+\showunits[suffixes]
+
+Some symbols get a special treatment:
+
+\showunits[symbols]
+
+These are also special:
+
+\showunits[packaged]
+
+\startsection[title={Colofon}]
+
+\starttabulate[|B|p|]
+\NC author \NC \getvariable{document}{author}, \getvariable{document}{affiliation}, \getvariable{document}{location} \NC \NR
+\NC version \NC \currentdate \NC \NR
+\NC website \NC \getvariable{document}{website} \endash\ \getvariable{document}{support} \NC \NR
+\NC copyright \NC \symbol[cc][cc-by-sa-nc] \NC \NR
+\stoptabulate
+
+\stopsection
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-contents.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-contents.tex
new file mode 100644
index 00000000000..a32f4737dcc
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-contents.tex
@@ -0,0 +1,13 @@
+% language=uk
+
+\environment workflows-style
+
+\startcomponent workflows-contents
+
+\starttitle[title=Contents]
+
+ \placelist[chapter]
+
+\stoptitle
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-graphics.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-graphics.tex
new file mode 100644
index 00000000000..dc3c6e10694
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-graphics.tex
@@ -0,0 +1,157 @@
+% language=uk
+
+\environment workflows-style
+
+\startcomponent workflows-graphics
+
+\startchapter[title=Graphics]
+
+\startsection[title=Bad names]
+
+After many years of using \CONTEXT\ in workflows where large amounts of source files
+as well as graphics were involved we can safely say that it's hard for publishers to
+control the way these are named. This is probably due to the fact that in a
+click|-|and|-|point based desktop publishing workflow names don't matter as one stays on
+one machine, and names are only entered once (after that these names become abstractions and
+get cut and pasted). Proper consistent resource managament is simply not part of the flow.
+
+This means that you get names like:
+
+\starttyping
+foo_Bar_01_03-a.EPS
+foo__Bar-01a_03.eps
+foo__Bar-01a_03.eps
+foo BarA 01-03.eps
+\stoptyping
+
+Especially when a non proportional screen font is used multiple spaces can look
+like one. In fancy screen fonts upper and lowercase usage might get obscured. It
+really makes one wonder if copy|-|editing or adding labels to graphics isn't
+suffering from the same problem.
+
+Anyhow, as in an automated rendering workflow the rendering is often the last step you
+can imagine that when names get messed up it's that last step that gets blamed. It's not
+that hard to sanitize names of files on disk as well as in the files that refer to them,
+and we normally do that we have complete control. This is no option when all the resources
+are synchronzied from elsewhere. In that case the only way out is signaling potential
+issues. Say that in the source file there is a reference:
+
+\starttyping
+foo_Bar_01_03-a.EPS
+\stoptyping
+
+and that the graphic on disk has the same name, but for some reason after an update
+has become:
+
+\starttyping
+foo-Bar_01_03-a.EPS
+\stoptyping
+
+The old image is probably still there so the update is not reflected in the final
+product. This is not that uncommon when you deal with tens of thousands of files,
+many editors and graphic designers, and no strict filename policy.
+
+For this we provide the following tracing option:
+
+\starttyping
+\enabletrackers[graphics.lognames]
+\stoptyping
+
+This will put information in the log file about included graphics, like:
+
+\starttyping
+system > graphics > start names
+
+used graphic > asked : cow.pdf
+used graphic > comment : not found
+used graphic > asked : t:/sources/cow.pdf
+used graphic > format : pdf
+used graphic > found : t:/sources/cow.pdf
+used graphic > used : t:/sources/cow.pdf
+
+system > graphics > stop names
+\stoptyping
+
+You can also information to the file itself:
+
+\starttyping
+\usemodule[s-figures-names]
+\stoptyping
+
+Of course that has to be done at the end of the document. Bad names are reported
+and suitable action can be taken.
+
+\stopsection
+
+\startsection[title=Downsampling]
+
+You can plug in you rown converter, here is an example:
+
+\starttyping
+\startluacode
+
+figures.converters.jpg = figures.converters.jpg or { }
+
+figures.converters.jpg["lowresjpg.pdf"] =
+ function(oldname,newname,resolution)
+ figures.programs.run (
+ [[gm]],
+ [[convert -geometry %nx%x%ny% -compress JPEG "%old%" "%new%"]],
+ {
+ old = old,
+ new = new,
+ nx = resolution or 300,
+ ny = resolution or 300,
+ }
+ )
+ end
+\stopluacode
+\stoptyping
+
+You can limit the search to a few types and set the resolution with:
+
+\starttyping
+\setupexternalfigures
+ [order={pdf,jpg},
+ resolution=100,
+ method=auto]
+\stoptyping
+
+And use it like:
+
+\starttyping
+\externalfigure[verybig.jpg][height=10cm]
+\stoptyping
+
+The second string passed to the \type {run} helper contains the arguments to the
+first one. The variables between percent signs get replaced by the variables in
+the tables passed as third argument.
+
+\stopsection
+
+\startsection[title=Trackers]
+
+If you want a lot of info you can say:
+
+\starttyping
+\enabletrackers[figures.*]
+\stoptyping
+
+But you can be more specific. With \type {graphics.locating} you will get some
+insight in where files are looked for. The \type {graphics.inclusion} tracker
+gives some more info about actual inclusion. The \type {graphics.bases} is kind
+of special and only makes sense when you use the graphic database options. The
+\type {graphics.conversion} and related tracker \type {graphics.programs} show if
+and how conversion of images takes place.
+
+The \type {graphics.lognames} will make sure that some extra information about
+used graphics is saved in the log file, while \type {graphics.usage} will produce
+a file \typ {<jobname>-figures-usage.lua} that contains information about found
+(or not found) images and the way they are used.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
+
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-injectors.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-injectors.tex
new file mode 100644
index 00000000000..d2f837d8236
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-injectors.tex
@@ -0,0 +1,86 @@
+% language=uk
+
+\environment workflows-style
+
+\startcomponent workflows-injectors
+
+\startchapter[title={Injectors}]
+
+When you have no control over the source but need to manually tweak some aspects
+of the typesetting, like an occasional page break of column switch, you can use
+the injector mechanism. This mechanism is part of list and register building but
+can also be used elsewhere.
+
+\startbuffer[one]
+\startmixedcolumns[balance=yes]
+ \dotestinjector{test}line 1 \par
+ \dotestinjector{test}line 2 \par
+ \dotestinjector{test}line 3 \par
+ \dotestinjector{test}line 4 \par
+ \dotestinjector{test}line 5
+\stopmixedcolumns
+\stopbuffer
+
+\startbuffer[two]
+\startmixedcolumns[balance=yes]
+ \dotestinjector{test}line 1 \par
+ \dotestinjector{test}line 2 \par
+ \dotestinjector{test}line 3 \par
+ \dotestinjector{test}line 4 \par
+ \dotestinjector{test}line 5
+\stopmixedcolumns
+\stopbuffer
+
+We have two buffers:
+
+\typebuffer[one]
+
+and
+
+\typebuffer[two]
+
+When typeset these come out as:
+
+\blank \startpacked \bf \getbuffer[one] \stoppacked \blank
+
+and
+
+\blank \startpacked \bf \getbuffer[two] \stoppacked \blank
+
+We can enable (and show) the injectors with:
+
+\startbuffer
+\doactivateinjector{test} \showinjector
+\stopbuffer
+
+\typebuffer \getbuffer
+
+Now we get:
+
+\blank \startpacked \bf \getbuffer[one] \stoppacked \blank
+
+and
+
+\blank \startpacked \bf \getbuffer[two] \stoppacked \blank
+
+The small numbers are injector points. These will of course change when we add
+more in|-|between. Let's add actions to some of the injection points:
+
+\startbuffer
+\setinjector[test][13][{\column}]
+\setinjector[test][17][{\column}]
+\stopbuffer
+
+\typebuffer \getbuffer
+
+As expected we now get column breaks:
+
+\blank \startpacked \bf \getbuffer[one] \stoppacked \blank
+
+and
+
+\blank \startpacked \bf \getbuffer[two] \stoppacked \blank
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-introduction.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-introduction.tex
new file mode 100644
index 00000000000..298158a6308
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-introduction.tex
@@ -0,0 +1,27 @@
+% language=uk
+
+\environment workflows-style
+
+\startcomponent workflows-introduction
+
+\startchapter[title=Introduction]
+
+This manual contains some information about features that can help you to manage
+workflows or \CONTEXT\ related processes. Because we use \CONTEXT\ ourselves all
+that we need ends up in the distribution. When you discover something workflow
+related that is not yet covered here, you can tell me. I simply forget about all
+there is, especially if it's made for projects. Don't expect this manual to be
+complete or extensive, it's just a goodie.
+
+\startlines
+\documentvariable{author},
+\documentvariable{affiliation}
+\documentvariable{location}
+\currentdate[month,year]
+\stoplines
+
+\stopsubject
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-mkiv.tex
new file mode 100644
index 00000000000..919b5cc74b7
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-mkiv.tex
@@ -0,0 +1,30 @@
+\environment workflows-style
+
+\startdocument
+ [metadata:author=Hans Hagen,
+ metadata:title=Workflow support in context,
+ author=Hans Hagen,
+ affiliation=PRAGMA ADE,
+ location=Hasselt NL,
+ title=workflow,
+ extra=support in context,
+ support=www.contextgarden.net,
+ website=www.pragma-ade.nl]
+
+\component workflows-titlepage
+
+\startfrontmatter
+ \component workflows-contents
+ \component workflows-introduction
+\stopfrontmatter
+
+\startbodymatter
+ \component workflows-resources
+ \component workflows-graphics
+ \component workflows-suspects
+ \component workflows-injectors
+ \component workflows-xml
+ \component workflows-setups
+\stopbodymatter
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-resources.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-resources.tex
new file mode 100644
index 00000000000..cbed648640f
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-resources.tex
@@ -0,0 +1,156 @@
+% language=uk
+
+\environment workflows-style
+
+\startcomponent workflows-resources
+
+\startchapter[title=Accessing resources]
+
+One of the benefits of \TEX\ is that you can use it in automated workflows
+where large quantities of data is involved. A document can consist of
+several files and normally also includes images. Of course there are styles
+involved too. At \PRAGMA\ normally put styles and fonts in:
+
+\starttyping
+/data/site/context/tex/texmf-project/tex/context/user/<project>/...
+/data/site/context/tex/texmf-fonts/data/<foundry>/<collection>/...
+\stoptyping
+
+alongside
+
+\starttyping
+/data/framework/...
+\stoptyping
+
+where the job management services are put, while we put resources in:
+
+\starttyping
+/data/resources/...
+\stoptyping
+
+The processing happens in:
+
+\starttyping
+/data/work/<uuid user space>/
+\stoptyping
+
+Putting styles (and resources like logos and common images) and fonts (if the
+project has specific ones not present in the distribution) in the \TEX\ tree
+makes sense because that is where such files are normally searched. Of course you
+need to keep the distributions file database upto|-|date after adding files there.
+
+Processing has to happen isolated from other runs so there we use unique
+locations. The services responsible for running also deal with regular cleanup
+of these temporary files.
+
+Resources are somewhat special. They can be stable, i.e.\ change seldom, but more
+often they are updated or extended periodically (or even daily). We're not
+talking of a few files here but of thousands. In one project we have 20 thousand
+resources, that can be combined into arbitrary books, and in another one, each
+chapter alone is about 400 \XML\ and image files. That means we can have 5000
+files per book and as we have at least 20 books, we end up with 100K files. In
+the first case accessing the resources is easy because there is a well defined
+structure (under our control) so we know exactly where each file sits in the
+resource tree. In the 100K case there is a deeper structure which is in itself
+predictable but because many authors are involved the references to these files
+are somewhat instable (and undefined). It is surprising to notice that publishers
+don't care about filenames (read: cannot control all the parties involved) which
+means that we have inconsist use of mixed case in filenames, and spaces,
+underscores and dashes creeping in. Because typesetting for paper is always at
+the end of the pipeline (which nowadays is mostly driven by (limitations) of web
+products) we need to have a robust and flexible lookup mechanism. It's a side
+effect of the click and point culture: if objects are associated (filename in
+source file with file on the system) anything you key in will work, and
+consistency completely depends on the user. And bad things then happen when files
+are copied, renamed, etc. In that stadium we can better be tolerant than try to
+get it fixed. \footnote {From what we normally receive we often conclude that
+copy|-|editing and image production companies don't impose any discipline or
+probably simply lack the tools and methods to control this. Some of our workflows
+had checkers and fixers, so that when we got 5000 new resources while only a few
+needed to be replaced we could filter the right ones. It was not uncommon to find
+duplicates for thousands of pictures: similar or older variants.}
+
+\starttyping
+foo.jpg
+bar/foo.jpg
+images/bar/foo.jpg
+images/foo.jpg
+\stoptyping
+
+The xml files have names like:
+
+\starttyping
+b-c.xml
+a/b-c.jpg
+a/b/b-c.jpg
+a/b/c/b-c.jpg
+\stoptyping
+
+So it's sort of a mess, especially if you add arbitrary casing to this. Of course
+one can argue that a wrong (relative) location is asking for problems, it's less
+an issue here because each image has a unique name. We could flatten the resource
+tree but having tens of thousands of files on one directory is asking for
+problems when you want to manage them.
+
+The typesetting (and related services) run on virtual machines. The three
+directories:
+
+\starttyping
+/data/site
+/data/resources
+/data/work
+\stoptyping
+
+are all mounted as nfs shares on a network storage. For the styles (and binaries)
+this is no big deal as normally these files are cached, but the resources are
+another story. Scanning the complete (mounted) resource tree each run is no
+option so there we use a special mechanism in \CONTEXT\ for locating files.
+
+Already early in the development of \MKIV\ one of the locating mechanisms was
+the following:
+
+\starttyping
+tree:////data/resources/foo/**/drawing.jpg
+tree:////data/resources/foo/**/Drawing.jpg
+\stoptyping
+
+Here the tree is scanned once per run, which is normally quite okay when there
+are not that many files and when the files reside on the machine itself. For a
+more high performance approach using network shares we have a different
+mechanism. This time it looks like this:
+
+\starttyping
+dirlist:/data/resources/**/drawing.jpg
+dirlist:/data/resources/**/Drawing.jpg
+dirlist:/data/resources/**/just/some/place/drawing.jpg
+dirlist:/data/resources/**/images/drawing.jpg
+dirlist:/data/resources/**/images/drawing.jpg?option=fileonly
+dirfile:/data/resources/**/images/drawing.jpg
+\stoptyping
+
+The first two lookups are wildcard. If there is a file with that name, it will be
+found. If there are more, the first hit is used. The second and third examples
+are more selective. Here the part after the \type {**} has to match too. So here
+we can deal with multiple files named \type {drawing.jpg}. The last two
+equivalent examples are more tolerant. If no explicit match is found, a lookup
+happens without being selective. The case of a name is ignored but when found, a
+name with the right case is used.
+
+You can hook a path into the resolver for source files, for example:
+
+\starttyping
+\usepath [dirfile://./resources/**]
+\setupexternalfigures[directory=dirfile://./resources/**]
+\stoptyping
+
+You need to make sure that file(name)s in that location don't override ones in
+the regular \TEX\ tree. These extra paths are only used for source file lookups
+so for instance font lookups are not affected.
+
+When you add, remove or move files the tree, you need to remove the \type
+{dirlist.*} files in the root because these are used for locating files. A new
+file will be generated automatically. Don't forget this!
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-setups.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-setups.tex
new file mode 100644
index 00000000000..e9d120f7b91
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-setups.tex
@@ -0,0 +1,72 @@
+% language=uk
+
+\environment workflows-style
+
+\startcomponent workflows-setups
+
+\startchapter[title={Setups}]
+
+Setups are a powerful way to organize styles. They are basically macros but live
+in their own namespace. One advantage is that spaces in a setup are ignored so
+you can code without bothering about spurious spaces. Here is a trick that you
+can use when one style contains directives for multiple products:
+
+\startbuffer
+\startsetups tex:whatever
+ \fastsetup{tex:whatever:\documentvariable{stylevariant}}
+\stopsetups
+
+\startsetups tex:whatever:foo
+ FOO
+\stopsetups
+
+\startsetups tex:whatever:bar
+ BAR
+\stopsetups
+\stopbuffer
+
+\typebuffer \getbuffer
+
+Here we define a main setup \type {tex:whatever} that gets expanded in one of two
+variants, controlled by a document variable.
+
+\startbuffer
+\setups{tex:whatever}
+
+\setupdocument
+ [stylevariant=foo]
+
+\setups{tex:whatever}
+
+\setupdocument
+ [stylevariant=bar]
+
+\setups{tex:whatever}
+\stopbuffer
+
+\typebuffer
+
+These lines result in:
+
+\getbuffer
+
+In a similar fashion you can define \XML\ setups that are used to render
+elements:
+
+\starttyping
+\startxmlsetups xml:whatever
+ \xmlsetup{#1}{xml:whatever:\documentvariable{stylevariant}}
+\stopxmlsetups
+
+\startxmlsetups xml:whatever:foo
+ FOO: \xmlflush{#1}
+\stopxmlsetups
+
+\startxmlsetups xml:whatever:bar
+ BAR: \xmlflush{#1}
+\stopxmlsetups
+\stoptyping
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-style.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-style.tex
new file mode 100644
index 00000000000..9d46aaad899
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-style.tex
@@ -0,0 +1,49 @@
+\startenvironment workflows-style
+
+\usemodule
+ [abr-04]
+
+\setupbodyfont
+ [bookman,11pt]
+
+\definecolor
+ [maincolor]
+ [s=.35]
+
+\setuplayout
+ [height=middle,
+ width=middle,
+ footer=0pt]
+
+\setupwhitespace
+ [big]
+
+\setuphead
+ [chapter]
+ [style=\bfc,
+ color=maincolor,
+ header=high]
+
+\setuphead
+ [section]
+ [style=\bfb,
+ color=maincolor]
+
+\setuptyping
+ [color=maincolor]
+
+\setuptype
+ [color=maincolor]
+
+\setupdocument
+ [metadata:author=<author>,
+ metadata:title=<title>,
+ author=<author>,
+ affiliation=<affiliation>,
+ location=<location>,
+ title=<title>,
+ extra=<extra>,
+ support=<support>,
+ website=<website>]
+
+\stopenvironment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-suspects.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-suspects.tex
new file mode 100644
index 00000000000..621fd6f5975
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-suspects.tex
@@ -0,0 +1,54 @@
+% language=uk
+
+\environment workflows-style
+
+\startcomponent workflows-suspects
+
+\startchapter[title={Suspects}]
+
+When many authors and editors are involved there is the danger of inconsistent
+spacing being applied. We're not only talking of the (often invisible in editing
+programs) nobreak spaces, but also spacing inside or outside quotations and
+before and after punctuation or around math.
+
+In \CONTEXT\ we have a built||in suspects checker that you can enable with the
+following command:
+
+\starttyping
+\enabletrackers[typesetters.suspects]
+\stoptyping
+
+The next table shows some identified suspects.
+
+\starttexdefinition ShowSample #1
+ \NC \type{#1}
+ \NC \enabletrackers[typesetters.suspects]#1\disabletrackers[typesetters.spacing]
+ \NC \NR
+\stoptexdefinition
+
+\starttabulate[|||][before=,after=]
+ \ShowSample{foo$x$}
+ \ShowSample{$x$bar}
+ \ShowSample{foo$x$bar}
+ \ShowSample{$f+o+o$:}
+ \ShowSample{;$f+o+o$}
+ \ShowSample{; bar}
+ \ShowSample{foo:bar}
+ \ShowSample{\quote{ foo }}
+ \ShowSample{\quote{bar }}
+ \ShowSample{\quote{ bar}}
+ \ShowSample{(foo )}
+ \ShowSample{\{foo \}}
+ \ShowSample{foo{\bf gnu}bar}
+ \ShowSample{foo{\it gnu}bar}
+ \ShowSample{foo$x^2$bar}
+ \ShowSample{foo\nobreakspace bar}
+\stoptabulate
+
+Of course this analysis is not perfect but we use it in final checking of complex
+documents that are generated automatically from \XML. \footnote {Think of math
+school books where each book is assembled from over a thousands files.}
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-titlepage.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-titlepage.tex
new file mode 100644
index 00000000000..f184152b34a
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-titlepage.tex
@@ -0,0 +1,37 @@
+% language=uk
+
+\environment workflows-style
+
+\startcomponent workflows-titlepage
+
+\definefontfeature[LatinModernMonoVariable][default][liga=no]
+\definefont[LatinModernMonoVariable][LMTypewriterVarWd-Regular*LatinModernMonoVariable sa 1]
+
+\startMPpage
+
+ fill fullsquare xysized(PaperWidth,PaperHeight) withcolor .4white ;
+
+ draw image (
+ fill arrowhead fullcircle scaled .5 rotated 0 scaled 10 withcolor white ;
+ fill arrowhead fullcircle scaled .5 rotated 120 scaled 10 withcolor white ;
+ fill arrowhead fullcircle scaled .5 rotated 240 scaled 10 withcolor white ;
+ fill arrowhead fullcircle scaled .5 rotated 60 scaled 10 withcolor white ;
+ fill arrowhead fullcircle scaled .5 rotated 180 scaled 10 withcolor white ;
+ fill arrowhead fullcircle scaled .5 rotated 300 scaled 10 withcolor white ;
+ ) xsized (.9PaperWidth) shifted (0,.2PaperWidth) ;
+
+ draw image (
+ fill arrowhead fullcircle scaled .5 rotated 0 scaled 10 withcolor .4red withtransparency (1,.5) ;
+ fill arrowhead fullcircle scaled .5 rotated 120 scaled 10 withcolor .4green withtransparency (1,.5) ;
+ fill arrowhead fullcircle scaled .5 rotated 240 scaled 10 withcolor .4blue withtransparency (1,.5) ;
+ fill arrowhead fullcircle scaled .5 rotated 60 scaled 10 withcolor .4cyan withtransparency (1,.5) ;
+ fill arrowhead fullcircle scaled .5 rotated 180 scaled 10 withcolor .4magenta withtransparency (1,.5) ;
+ fill arrowhead fullcircle scaled .5 rotated 300 scaled 10 withcolor .4yellow withtransparency (1,.5) ;
+ ) xsized (.9PaperWidth) shifted (0,.2PaperWidth) ;
+
+ draw textext ("\LatinModernMonoVariable \documentvariable{title}") xsized (.9PaperWidth) shifted (0,-.425PaperWidth) withcolor white ;
+ draw textext ("\LatinModernMonoVariable \documentvariable{extra}") xsized (.9PaperWidth) shifted (0,-.575PaperWidth) withcolor white ;
+
+\stopMPpage
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-xml.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-xml.tex
new file mode 100644
index 00000000000..0f29f5f5533
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-xml.tex
@@ -0,0 +1,96 @@
+% language=uk
+
+\environment workflows-style
+
+\startcomponent workflows-xml
+
+\startluacode
+ for i=1,10 do
+ local filename = string.formatters["temp-%02i.xml"](i)
+ local filedata = string.formatters["<?xml version='1.0'?><p>snippet %i</p>"](i)
+ io.savedata(filename,filedata)
+ end
+\stopluacode
+
+\startchapter[title={XML}]
+
+When you have an \XML\ project with many files involved, finding the right spot
+of something that went wrong can be a pain. In one of our project the production of
+some 50 books involves 60.000 \XML\ files and 20.000 images. Say that we have the
+following file:
+
+\startbuffer[demo]
+<?xml version='1.0'?>
+<document>
+ <include name="temp-01.xml"/> <include name="temp-02.xml"/>
+ <include name="temp-03.xml"/> <include name="temp-04.xml"/>
+ <include name="temp-05.xml"/> <include name="temp-06.xml"/>
+ <include name="temp-07.xml"/> <include name="temp-08.xml"/>
+ <include name="temp-09.xml"/> <include name="temp-10.xml"/>
+</document>
+\stopbuffer
+
+\typebuffer[demo]
+
+Before we process this file we will merge the content of the files defined
+as includes into it. When this happens the filename is automatically
+registered so it can be accessed later.
+
+\startbuffer
+\startxmlsetups xml:initialize
+ \xmlincludeoptions{#1}{include}{filename|name}{recurse,basename}
+ \xmlsetsetup{#1}{p|document}{xml:*}
+\stopxmlsetups
+
+\startxmlsetups xml:document
+ \xmlflush{#1}
+\stopxmlsetups
+
+\startxmlsetups xml:p
+ \inleftmargin{\infofont\xmlinclusion{#1}}
+ \xmlflush{#1}
+ \par
+\stopxmlsetups
+
+\xmlregistersetup{xml:initialize}
+
+\xmlprocessbuffer{main}{demo}{}
+\stopbuffer
+
+\typebuffer
+
+In this case we put the name of the file in the margin. Depending on when and how
+elements are flushed other solutions, like overlays, can be used.
+
+\startpacked
+\getbuffer
+\stoppacked
+
+At any moment you can see what the current node contains. The whole (merged)
+document is also available:
+
+\startbuffer
+\xmlshow{main}
+\stopbuffer
+
+\typebuffer
+
+A small font is used to typeset the (sub)tree:
+
+\blank \getbuffer \blank
+
+You can also save the tree:
+
+\startbuffer
+\xmlsave{main}{temp.xml}
+\stopbuffer
+
+\typebuffer \getbuffer
+
+This file looks like:
+
+\typefile{temp.xml}
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/xtables/xtables-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/xtables/xtables-mkiv.tex
new file mode 100644
index 00000000000..302f2880cc4
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/xtables/xtables-mkiv.tex
@@ -0,0 +1,1225 @@
+% language=uk
+
+% author : Hans Hagen, PRAGMA ADE, NL
+% license : Creative Commons, Attribution-NonCommercial-ShareAlike 3.0 Unported
+
+\usemodule[art-01,abr-02]
+
+\definecolor[red] [darkred]
+\definecolor[green] [darkgreen]
+\definecolor[blue] [darkblue]
+\definecolor[yellow] [darkyellow]
+\definecolor[magenta][darkmagenta]
+\definecolor[cyan] [darkcyan]
+
+\setupexternalfigures
+ [location={local,default}]
+
+\setupbodyfont
+ [10pt]
+
+\setuptyping
+ [color=darkyellow]
+
+\setuptype
+ [color=darkcyan]
+
+% \setupnumbering
+% [alternative=doublesided]
+
+\setuphead
+ [section]
+ [color=darkmagenta]
+
+\setupinteraction
+ [hidden]
+
+\startdocument
+ [metadata:author=Hans Hagen,
+ metadata:title=Extreme Tables,
+ author=Hans Hagen,
+ affiliation=PRAGMA ADE,
+ location=Hasselt NL,
+ title=Extreme Tables,
+ extra=ConTeXt MkIV,
+ support=www.contextgarden.net,
+ website=www.pragma-ade.nl]
+
+\startMPpage
+
+ StartPage ;
+ fill Page enlarged 2mm withcolor magenta/4 ;
+ pickup pencircle scaled 2mm ;
+ numeric n ; n := bbheight Page ;
+ forever :
+ n := n / 1.5 ;
+ draw bottomboundary Page shifted (0, n) withcolor 2yellow/3 withtransparency (1,0.5) ;
+ draw topboundary Page shifted (0,-n) withcolor 2yellow/3 withtransparency (1,0.5) ;
+ exitif n < 2cm ;
+ endfor ;
+ numeric n ; n := bbheight Page ;
+ forever :
+ n := n / 1.5 ;
+ draw leftboundary Page shifted ( n,0) withcolor 2cyan/3 withtransparency (1,0.5) ;
+ draw rightboundary Page shifted (-n,0) withcolor 2cyan/3 withtransparency (1,0.5) ;
+ exitif n < 2cm ;
+ endfor ;
+ picture p, q, r ;
+ p := textext("\ssbf\WORD{\documentvariable{title}}") xsized (bbheight Page - 2cm) rotated 90 ;
+ q := textext("\ssbf\WORD{\documentvariable{author}}") ysized 1cm ;
+ r := textext("\ssbf\WORD{\documentvariable{extra}}") xsized bbwidth q ;
+ draw anchored.rt (p, center rightboundary Page shifted (-1cm,0cm)) withcolor white ;
+ draw anchored.bot(q, center bottomboundary Page shifted ( 1cm,4.4cm)) withcolor white ;
+ draw anchored.bot(r, center bottomboundary Page shifted ( 1cm,2.8cm)) withcolor white ;
+ StopPage ;
+
+\stopMPpage
+
+% \page[empty] \setuppagenumber[start=1]
+
+\startsubject[title={Contents}]
+
+\placelist[section][criterium=all,interaction=all]
+
+\stopsubject
+
+\startsection[title={Introduction}]
+
+This is a short introduction to yet another table mechanism built in \CONTEXT. It
+is a variant of the so called natural tables but it has a different
+configuration. Also, the implementation is completely different. The reason for
+writing it is that in one of our projects we had to write styles for documents
+that had tables spanning 30 or more pages and apart from memory constraints this
+is quite a challenge for the other mechanisms, if only because splitting them
+into successive floats is not possible due to limitations of \TEX. The extreme
+table mechanism can handle pretty large tables and split them too. As each cell
+is basically a \type {\framed} and as we need to do two passes over the table,
+this mechanism is not the fastest but it is some two times faster than the
+natural tables mechanism, and in most cases can be used instead.
+
+\stopsection
+
+\startsection[title={The structure}]
+
+The structure of the tables is summarized here. There can be the usual head, body
+and foot specifications and we also support the optional header in following
+pages.
+
+\starttyping
+\definextable [tag] | [tag][parent]
+\setupxtable [settings] | [tag][settings]
+
+\startxtable[tag|settings]
+ \startxtablehead|next|body|foot[tag|settings]
+ \startxrowgroup[tag|settings]
+ \startxrow[settings]
+ \startxcellgroup[tag|settings]
+ \startxcell[settings] ... \stopxcell
+ \stopxcellgroup
+ \stopxrow
+ \startxrowgroup
+ \stopxtablehead|next|body|foot
+\stopxtable
+\stoptyping
+
+Contrary to what you might expect, the definition command defines a new set of
+command. You don't need to use this in order to set up a new settings
+environment. Settings and definitions can inherit so you can build a chain of
+parent|-|child settings. The grouping is nothing more than a switch to a new set
+of settings.
+
+\stopsection
+
+\startsection[title={Direct control}]
+
+A simple table with just frames is defined as follows:
+
+\startbuffer
+\startxtable
+ \startxrow
+ \startxcell one \stopxcell
+ \startxcell two \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell alpha \stopxcell
+ \startxcell beta \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+\typebuffer
+
+\startlinecorrection[blank] \getbuffer \stoplinecorrection
+
+You can pass parameters for tuning the table:
+
+\startbuffer
+\startxtable[offset=1cm]
+ \startxrow
+ \startxcell one \stopxcell
+ \startxcell two \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell alpha \stopxcell
+ \startxcell beta \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+\typebuffer
+
+\startlinecorrection[blank] \getbuffer \stoplinecorrection
+
+You can (for as much as they make sense) use the same settings as the \type
+{\framed} command, as long as you keep in mind that messing with the frame
+related offsets can have side effects.
+
+\stopsection
+
+\startsection[title={Sets of settings}]
+
+Instead of directly passing settings you can use a predefined set. Of course you
+can also combine these methods.
+
+\startbuffer
+\definextable
+ [myxtable]
+
+\definextable
+ [myxtable:important]
+ [myxtable]
+
+\setupxtable
+ [myxtable]
+ [width=4cm,
+ foregroundcolor=red]
+
+\setupxtable
+ [myxtable:important]
+ [background=color,
+ backgroundcolor=red,
+ foregroundcolor=white]
+\stopbuffer
+
+\typebuffer \getbuffer
+
+We can use these settings in table. Although it is not really needed to define a
+set beforehand (i.e.\ you can just use the setup command) it is cleaner and more
+efficient too.
+
+\startbuffer
+\startxtable[myxtable]
+ \startxrow[foregroundcolor=green]
+ \startxcell one \stopxcell
+ \startxcell two \stopxcell
+ \startxcellgroup[foregroundcolor=blue]
+ \startxcell tree \stopxcell
+ \startxcell four \stopxcell
+ \stopxcellgroup
+ \stopxrow
+ \startxrow
+ \startxcell alpha \stopxcell
+ \startxcell beta \stopxcell
+ \startxcellgroup[myxtable:important]
+ \startxcell gamma \stopxcell
+ \startxcell delta \stopxcell
+ \stopxcellgroup
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+\typebuffer
+
+\startlinecorrection[blank] \getbuffer \stoplinecorrection
+
+The overhead of (chained) settings is quite acceptable and it helps to keep the
+source of the table uncluttered from specific settings.
+
+\stopsection
+
+\startsection[title={Defining}]
+
+If needed you can define your own encapsulating commands. The following example
+demonstrates this:
+
+\startbuffer
+\definextable[mytable]
+\stopbuffer
+
+\getbuffer \typebuffer
+
+We now can use the \type{mytable} wrapper:
+
+\startbuffer
+\startmytable[height=4cm,width=8cm,align={middle,lohi}]
+ \startxrow
+ \startxcell test \stopxcell
+ \stopxrow
+\stopmytable
+\stopbuffer
+
+\typebuffer
+
+\startlinecorrection[blank] \getbuffer \stoplinecorrection
+
+One drawback of using buffers is that they don't play well in macro definitions.
+In that case you need to use the following wrapper:
+
+\startbuffer
+\starttexdefinition MyTable #1#2#3#4
+ \startembeddedxtable
+ \startxrow
+ \startxcell #1 \stopxcell
+ \startxcell #2 \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell #3 \stopxcell
+ \startxcell #4 \stopxcell
+ \stopxrow
+ \stopembeddedxtable
+\stoptexdefinition
+\stopbuffer
+
+\typebuffer \getbuffer
+
+This macro is used as any other macro with arguments:
+
+\startbuffer
+\MyTable{one}{two}{three}{four}
+\stopbuffer
+
+\typebuffer
+
+\startlinecorrection[blank] \getbuffer \stoplinecorrection
+
+\stopsection
+
+\startsection[title={Stretching}]
+
+If you don't give the width of a cell, the widest natural size will be taken.
+Otherwise the given width applies to the whole column.
+
+\startbuffer
+\startxtable
+ \startxrow
+ \startxcell[width=1cm] one \stopxcell
+ \startxcell[width=2cm] two \stopxcell
+ \startxcell[width=3cm] tree \stopxcell
+ \startxcell[width=4cm] four \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell alpha \stopxcell
+ \startxcell beta \stopxcell
+ \startxcell gamma \stopxcell
+ \startxcell delta \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+\typebuffer
+
+\startlinecorrection[blank] \getbuffer \stoplinecorrection
+
+You can let the cells stretch so that the whole width of the text area is taken.
+
+\startbuffer[one]
+\startxtable[option=stretch]
+ \startxrow
+ \startxcell[width=1cm] one \stopxcell
+ \startxcell[width=2cm] two \stopxcell
+ \startxcell[width=3cm] tree \stopxcell
+ \startxcell[width=4cm] four \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell alpha \stopxcell
+ \startxcell beta \stopxcell
+ \startxcell gamma \stopxcell
+ \startxcell delta \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+\typebuffer[one]
+
+The available left over space is equally distributed among the cells.
+
+\startlinecorrection[blank] \getbuffer[one] \stoplinecorrection
+
+\startbuffer[two]
+\startxtable[option={stretch,width}]
+ \startxrow
+ \startxcell[width=1cm] one \stopxcell
+ \startxcell[width=2cm] two \stopxcell
+ \startxcell[width=3cm] tree \stopxcell
+ \startxcell[width=4cm] four \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell alpha \stopxcell
+ \startxcell beta \stopxcell
+ \startxcell gamma \stopxcell
+ \startxcell delta \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+An alternative is to distribute the space proportionally:
+
+\typebuffer[two]
+
+\startlinecorrection[blank] \getbuffer[two] \stoplinecorrection
+
+Just to stress the difference we show both alongside now:
+
+\startlinecorrection[blank]
+ \getbuffer[one]
+ \blank
+ \getbuffer[two]
+\stoplinecorrection
+
+You can specify the width of a cell with each cell but need to keep into mind
+that that value is then used for the whole column:
+
+\startbuffer
+\startxtable
+ \startxrow
+ \startxcell[width=1em] one \stopxcell
+ \startxcell[width=2em] two \stopxcell
+ \startxcell[width=3em] tree \stopxcell
+ \startxcell[width=4em] four \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell alpha \stopxcell
+ \startxcell beta \stopxcell
+ \startxcell gamma \stopxcell
+ \startxcell delta \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+\typebuffer
+
+\startlinecorrection[blank] \getbuffer \stoplinecorrection
+
+You can enforce that larger columns win via the \type {option} parameter:
+
+\startbuffer
+\startxtable[option=max]
+ \startxrow
+ \startxcell[width=1em] one \stopxcell
+ \startxcell[width=2em] two \stopxcell
+ \startxcell[width=3em] tree \stopxcell
+ \startxcell[width=4em] four \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell alpha \stopxcell
+ \startxcell beta \stopxcell
+ \startxcell gamma \stopxcell
+ \startxcell delta \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+\typebuffer
+
+\startlinecorrection[blank] \getbuffer \stoplinecorrection
+
+\stopsection
+
+\startsection[title={Spacing}]
+
+It is possible to separate the cells by horizontal and/or vertical space. As an
+example we create a setup.
+
+\startbuffer
+\setupxtable
+ [myztable]
+ [option=stretch,
+ foregroundcolor=blue,
+ columndistance=10pt,
+ leftmargindistance=20pt,
+ rightmargindistance=30pt]
+\stopbuffer
+
+\typebuffer \getbuffer
+
+You can use the \type {textwidth} parameter to set a specific maximum width. We
+now apply the previous settings to an extreme table:
+
+\startbuffer
+\startxtable[myztable]
+ \startxrow
+ \startxcell[width=1cm] one \stopxcell
+ \startxcell[width=2cm,distance=5pt] two \stopxcell
+ \startxcell[width=3cm] tree \stopxcell
+ \startxcell[width=4cm] four \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell[width=1cm] alpha \stopxcell
+ \startxcell[width=2cm] beta \stopxcell
+ \startxcell[width=3cm] gamma \stopxcell
+ \startxcell[width=4cm] delta \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+\typebuffer
+
+As you can see here, we can still locally overload the settings but keep in mind
+that these apply to the whole column then, not to the specific cell.
+
+\startlinecorrection[blank] \getbuffer \stoplinecorrection
+
+Vertical spacing is (currently) setup differently, i.e.\ as an argument to the
+\type {\blank} command.
+
+\startbuffer
+\startxtable[spaceinbetween=medium]
+ \startxrow
+ \startxcell one \stopxcell
+ \startxcell two \stopxcell
+ \startxcell tree \stopxcell
+ \startxcell four \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell alpha \stopxcell
+ \startxcell beta \stopxcell
+ \startxcell gamma \stopxcell
+ \startxcell delta \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+\typebuffer
+
+Specifying spacing this way improves consistency with the rest of the document
+spacing.
+
+\startlinecorrection[blank] \getbuffer \stoplinecorrection
+
+\stopsection
+
+\startsection[title={Spanning}]
+
+Of course we can span cells horizontally as well as vertically. Future versions
+might provide more advanced options but the basics work okay.
+
+\startbuffer
+\startxtable
+ \startxrow
+ \startxcell one \stopxcell
+ \startxcell[nx=2] two + three \stopxcell
+ \startxcell four \stopxcell
+ \startxcell five \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell[nx=3] alpha + beta + gamma \stopxcell
+ \startxcell[nx=2] delta + epsilon \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+\typebuffer
+
+This spans a few cells horizontally:
+
+\startlinecorrection[blank] \getbuffer \stoplinecorrection
+
+The next example gives a span in two directions:
+
+\startbuffer
+\startxtable
+ \startxrow
+ \startxcell alpha 1 \stopxcell
+ \startxcell beta 1 \stopxcell
+ \startxcell gamma 1 \stopxcell
+ \startxcell delta 1 \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell alpha 2 \stopxcell
+ \startxcell[nx=2,ny=2] whatever \stopxcell
+ \startxcell delta 2 \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell alpha 3 \stopxcell
+ \startxcell delta 3 \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell alpha 4 \stopxcell
+ \startxcell beta 4 \stopxcell
+ \startxcell gamma 4 \stopxcell
+ \startxcell delta 4 \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+\typebuffer
+
+Of course, spanning is always a compromise but the best fit found by this
+mechanism takes natural width, given width and available space into account.
+
+\startlinecorrection[blank] \getbuffer \stoplinecorrection
+
+\stopsection
+
+\startsection[title={Partitioning}]
+
+You can partition a table as follows:
+
+\startbuffer
+\startxtable
+ \startxtablehead
+ \startxrow
+ \startxcell head one \stopxcell
+ \startxcell head two \stopxcell
+ \startxcell head tree \stopxcell
+ \startxcell head four \stopxcell
+ \stopxrow
+ \stopxtablehead
+ \startxtablenext
+ \startxrow
+ \startxcell next one \stopxcell
+ \startxcell next two \stopxcell
+ \startxcell next tree \stopxcell
+ \startxcell next four \stopxcell
+ \stopxrow
+ \stopxtablenext
+ \startxtablebody
+ \startxrow
+ \startxcell body one \stopxcell
+ \startxcell body two \stopxcell
+ \startxcell body tree \stopxcell
+ \startxcell body four \stopxcell
+ \stopxrow
+ \stopxtablebody
+ \startxtablefoot
+ \startxrow
+ \startxcell foot one \stopxcell
+ \startxcell foot two \stopxcell
+ \startxcell foot tree \stopxcell
+ \startxcell foot four \stopxcell
+ \stopxrow
+ \stopxtablefoot
+\stopxtable
+\stopbuffer
+
+\typebuffer
+
+There can be multiple such partitions and they are collected in head, next, body
+and foot groups. Normally the header ends up at the beginning and the footer at
+the end. When a table is split, the first page gets the header and the following
+pages the next one.
+
+You can let headers and footers be repeated by setting the \type {header}
+and|/|or \type {footer} parameters to \type {repeat}.
+
+\starttyping
+\setupxtable
+ [split=yes,
+ header=repeat,
+ footer=repeat]
+\stoptyping
+
+The table can be flushed in the running text but also in successive
+floats. Given that the table is in a buffer:
+
+\starttyping
+\placetable[here,split]{A big table.}{\getbuffer}
+\stoptyping
+
+When you specify \type {split} as \type {yes} the caption is taken into account
+when calculating the available space.
+
+There are actually three different split methods. The \type {yes} option works in
+text mode as well as in floats, but in text mode no headers and footers get
+repeated. If you want that feature in a text flush you have to set \type {split}
+to \type {repeat} as well.
+
+You can keep rows together by passing a \type {samepage} directive. This
+parameter can get the values \type {before}, \type {after} and \type {both}.
+
+\starttyping
+\startxtable[split=yes]
+ \startxrow \startxcell \tttf .01. \stopxcell \stopxrow
+ \startxrow \startxcell \tttf .... \stopxcell \stopxrow
+ \startxrow \startxcell \tttf \red .21. \stopxcell \stopxrow
+ \startxrow[samepage=both] \startxcell \tttf \red .22. \stopxcell \stopxrow
+ \startxrow[samepage=both] \startxcell \tttf \red .23. \stopxcell \stopxrow
+ \startxrow \startxcell \tttf .... \stopxcell \stopxrow
+ \startxrow \startxcell \tttf .99. \stopxcell \stopxrow
+\stopxtable
+\stoptyping
+
+\stopsection
+
+\startsection[title={Options}]
+
+On the average a table will come out okay but you need to keep in mind that when
+(complex) spans are used the results can be less that optimal. However, as
+normally one pays attention to creating tables, the amount of control provided
+often makes it possible to get what you want.
+
+In the following situations, the first cell width is determined by the span. It
+is possible to make a more clever analyzer but we need to keep in mind that in
+the same column there can be entries that span a different amount of columns. Not
+only would that be inefficient but it would also be rather unpredictable unless
+you know exactly what happens deep down. The following two examples demonstrate
+default behaviour.
+
+\startbuffer
+\startxtable
+ \startxrow
+ \startxcell[nx=3]
+ 1/2/3
+ \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell 1 \stopxcell
+ \startxcell 2 \stopxcell
+ \startxcell 3 \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+\typebuffer \getbuffer
+
+\startbuffer
+\startxtable
+ \startxrow
+ \startxcell[nx=3]
+ 1 / 2 / 3
+ \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell 1 \stopxcell
+ \startxcell 2 \stopxcell
+ \startxcell 3 \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+\typebuffer \getbuffer
+
+In practice you will set the width of the columns, as in:
+
+\startbuffer
+\startxtable
+ \startxrow
+ \startxcell[nx=3]
+ 1/2/3
+ \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell[width=\dimexpr\textwidth/3] 1 \stopxcell
+ \startxcell[width=\dimexpr\textwidth/3] 2 \stopxcell
+ \startxcell[width=\dimexpr\textwidth/3] 3 \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+\typebuffer \getbuffer
+
+But, if you want you can control the enforced width by setting an option:
+
+\startbuffer
+\startxtable
+ \startxrow
+ \startxcell[nx=3,option=tight]
+ 1/2/3
+ \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell 1 \stopxcell
+ \startxcell 2 \stopxcell
+ \startxcell 3 \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+\typebuffer \getbuffer
+
+\startbuffer
+\startxtable
+ \startxrow
+ \startxcell[nx=3,option=tight]
+ 1 / 2 / 3
+ \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell 1 \stopxcell
+ \startxcell 2 \stopxcell
+ \startxcell 3 \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+\typebuffer \getbuffer
+
+There is also a global setting:
+
+\startbuffer
+\startxtable[option=tight]
+ \startxrow
+ \startxcell[nx=3]
+ 1/2/3
+ \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell 1 \stopxcell
+ \startxcell 2 \stopxcell
+ \startxcell 3 \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+\typebuffer \getbuffer
+
+\stopsection
+
+\startsection[title={Nesting}]
+
+Extreme tables can be nested but you need to keep an eye on inheritance here as
+the inner table uses the settings from the encapsulating cell. The widths and
+heights of the inner table default to \type {fit}. We could cook up a more
+complex nesting model but this one is easy to follow.
+
+\startbuffer
+\startxtable
+ \startxrow
+ \startxcell[offset=0pt]
+ \startxtable[background=color,backgroundcolor=green,
+ foregroundcolor=white,offset=1ex]
+ \startxrow
+ \startxcell[width=1cm] one \stopxcell
+ \startxcell[width=2cm] two \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell[width=3cm] alpha \stopxcell
+ \startxcell[width=4cm] beta \stopxcell
+ \stopxrow
+ \stopxtable
+ \stopxcell
+ \startxcell two \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell alpha \stopxcell
+ \startxcell
+ \startxtable[background=color,backgroundcolor=red,
+ foregroundcolor=white]
+ \startxrow
+ \startxcell one \stopxcell
+ \startxcell two \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell alpha \stopxcell
+ \startxcell beta \stopxcell
+ \stopxrow
+ \stopxtable
+ \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+\typebuffer
+
+Here we just manipulate the offset a bit.
+
+\startlinecorrection[blank] \getbuffer \stoplinecorrection
+
+\stopsection
+
+\startsection[title={Buffers}]
+
+When you don't want to clutter your document source too much buffers can be if
+help:
+
+\startbuffer
+\startbuffer[test]
+\startxtable
+ \startxrow
+ \startxcell[width=1cm] one \stopxcell
+ \startxcell[width=2cm] two \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell alpha \stopxcell
+ \startxcell beta \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+\stopbuffer
+
+\typebuffer \getbuffer
+
+One way of getting this table typeset is to say:
+
+\starttyping
+\getbuffer[test]
+\stoptyping
+
+Normally this is quite okay. However, internally extreme tables become also
+buffers. If you don't like the overhead of this double buffering you can use the
+following command:
+
+\starttyping
+\processxtablebuffer[test]
+\stoptyping
+
+This can save you some memory and runtime, but don't expect miracles. Also, this
+way of processing does not support nested tables (unless \type {{}} is used).
+
+\stopsection
+
+\startsection[title={XML}]
+
+The following example demonstrates that we can use this mechanism in \XML\ too.
+The example was provided by Thomas Schmitz. First we show how a table looks like
+in \XML:
+
+\startbuffer[test]
+<table>
+ <tablerow>
+ <tablecell>
+ One
+ </tablecell>
+ <tablecell>
+ Two
+ </tablecell>
+ </tablerow>
+ <tablerow>
+ <tablecell>
+ <b>Three</b>
+ </tablecell>
+ <tablecell>
+ Four
+ </tablecell>
+ </tablerow>
+</table>
+\stopbuffer
+
+\typebuffer[test]
+
+We need to map these elements to setups:
+
+\startbuffer
+\startxmlsetups xml:testsetups
+ \xmlsetsetup{main}{b|table|tablerow|tablecell}{xml:*}
+\stopxmlsetups
+
+\xmlregistersetup{xml:testsetups}
+\stopbuffer
+
+\typebuffer \getbuffer
+
+The setups themselves are rather simple as we don't capture any attributes.
+
+\startbuffer
+\startxmlsetups xml:b
+ \bold{\xmlflush{#1}}
+\stopxmlsetups
+
+\startxmlsetups xml:table
+ \startembeddedxtable
+ \xmlflush{#1}
+ \stopembeddedxtable
+\stopxmlsetups
+
+\startxmlsetups xml:tablerow
+ \startxrow
+ \xmlflush{#1}
+ \stopxrow
+\stopxmlsetups
+
+\startxmlsetups xml:tablecell
+ \startxcell
+ \xmlflush{#1}
+ \stopxcell
+\stopxmlsetups
+\stopbuffer
+
+\typebuffer \getbuffer
+
+We now process the example. Of course it will also work for files.
+
+\startbuffer
+ \xmlprocessbuffer{main}{test}{}
+\stopbuffer
+
+\typebuffer
+
+The result is:
+
+\startlinecorrection[blank] \getbuffer \stoplinecorrection
+
+\stopsection
+
+\startsection[title={Natural tables}]
+
+For the impatient a small additional module is provided that remaps the natural
+table commands onto extreme tables:
+
+\startbuffer
+\usemodule[ntb-to-xtb]
+\stopbuffer
+
+\typebuffer \getbuffer
+
+After that:
+
+\startbuffer
+\bTABLE
+ \bTR
+ \bTD[background=color,backgroundcolor=red] one \eTD
+ \bTD[width=2cm] two \eTD
+ \eTR
+ \bTR
+ \bTD[width=5cm] alpha \eTD
+ \bTD[background=color,backgroundcolor=yellow] beta \eTD
+ \eTR
+\eTABLE
+\stopbuffer
+\stopbuffer
+
+\typebuffer
+
+Will come out as:
+
+\startlinecorrection[blank]
+\getbuffer
+\stoplinecorrection
+
+You can restore and remap the commands with the following helpers:
+
+\starttyping
+\restoreTABLEfromxtable
+\mapTABLEtoxtable
+\stoptyping
+
+Of course not all functionality of the natural tables maps onto similar
+functionality of extreme tables, but on the average the result will look rather
+similar.
+
+\stopsection
+
+\startsection[title={Colofon}]
+
+\starttabulate[|B|p|]
+\NC author \NC \getvariable{document}{author}, \getvariable{document}{affiliation}, \getvariable{document}{location} \NC \NR
+\NC version \NC \currentdate \NC \NR
+\NC website \NC \getvariable{document}{website} \endash\ \getvariable{document}{support} \NC \NR
+\NC copyright \NC \symbol[cc][cc-by-sa-nc] \NC \NR
+\stoptabulate
+
+\stopsection
+
+\startsection[title={Examples}]
+
+On the following pages we show some examples of (experimental) features. For this
+we will use the usual quotes from Ward, Tufte and Davis etc.\ that you can find
+in the distribution.
+
+\page
+
+\startbuffer
+\startxtable[bodyfont=6pt]
+ \startxrow
+ \startxcell \input ward \stopxcell
+ \startxcell \input tufte \stopxcell
+ \startxcell \input davis \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+\typebuffer \getbuffer
+
+\startbuffer
+\startxtable[bodyfont=6pt,option=width]
+ \startxrow
+ \startxcell \input ward \stopxcell
+ \startxcell \input tufte \stopxcell
+ \startxcell \input davis \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+\typebuffer \getbuffer
+
+\page
+
+\startbuffer
+\startxtable[bodyfont=6pt]
+ \startxrow
+ \startxcell \externalfigure[cow.pdf][width=3cm] \stopxcell
+ \startxcell \input tufte \stopxcell
+ \startxcell \input davis \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+\typebuffer \getbuffer
+
+\startbuffer
+\startxtable[bodyfont=6pt,option=width]
+ \startxrow
+ \startxcell \externalfigure[cow.pdf][width=3cm] \stopxcell
+ \startxcell \input tufte \stopxcell
+ \startxcell \input davis \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+\typebuffer \getbuffer
+
+\page
+
+\startbuffer
+\startxtable[option=stretch]
+ \startxrow
+ \startxcell bla \stopxcell
+ \startxcell bla bla \stopxcell
+ \startxcell bla bla bla \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+\typebuffer \getbuffer
+
+\startbuffer
+\startxtable[option={stretch,width}]
+ \startxrow
+ \startxcell bla \stopxcell
+ \startxcell bla bla \stopxcell
+ \startxcell bla bla bla \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+\typebuffer \getbuffer
+
+\page
+
+\startbuffer
+\setupxtable[suffix][align=middle,foregroundcolor=red]
+\setupxtable[blabla][foregroundstyle=slanted]
+\setupxtable[crap] [foregroundcolor=blue]
+\setupxtable[bold] [crap][foregroundstyle=bold]
+
+\startxtable % [frame=off]
+ \startxtablehead
+ \startxrow[bold]
+ \startxcell[suffix] head a \stopxcell
+ \startxcell[blabla] head b \stopxcell
+ \startxcell head c \stopxcell
+ \stopxrow
+ \stopxtablehead
+ \startxtablebody
+ \startxrow
+ \startxcell[suffix][ny=2] cell a 1 \stopxcell
+ \startxcell cell b 1 \stopxcell
+ \startxcell cell c 1 \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell cell b 2 \stopxcell
+ \startxcell cell c 2 \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell[suffix] cell a 3 \stopxcell
+ \startxcell cell b 3 \stopxcell
+ \startxcell cell c 3 \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell[suffix] cell a 4 \stopxcell
+ \startxcell cell b 4 \stopxcell
+ \startxcell cell c 4 \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell[suffix] cell a 5 \stopxcell
+ \startxcell cell b 5 \stopxcell
+ \startxcell cell c 5 \stopxcell
+ \stopxrow
+ \stopxtablebody
+\stopxtable
+\stopbuffer
+
+\typebuffer \start \getbuffer \stop
+
+\page
+
+\startbuffer
+\startxtable[option=stretch]
+ \startxrow
+ \startxcell[option=fixed] first cell \stopxcell
+ \startxcell 101 \stopxcell
+ \startxcell 102 \stopxcell
+ \startxcell 103 \stopxcell
+ \stopxrow
+ \startxrow
+ \startxcell 2\high{nd} cell \stopxcell
+ \startxcell a \stopxcell
+ \startxcell b \stopxcell
+ \startxcell c \stopxcell
+ \stopxrow
+\stopxtable
+\stopbuffer
+
+\typebuffer \start \getbuffer \stop
+
+\page
+
+\startbuffer[demo]
+\startxtable
+\startxrow
+ \startxcell[demo][nx=4] 1 / 2 / 3 / 4 \stopxcell
+\stopxrow
+\startxrow
+ \startxcell[demo][nx=3] 1 / 2 / 3 \stopxcell
+ \startxcell 4 \stopxcell
+\stopxrow
+\startxrow
+ \startxcell 1 \stopxcell
+ \startxcell[demo][nx=3] 2 / 3 / 4 \stopxcell
+\stopxrow
+\startxrow
+ \startxcell[demo][nx=2] 1 / 2 \stopxcell
+ \startxcell 3 \stopxcell
+ \startxcell 4 \stopxcell
+\stopxrow
+\startxrow
+ \startxcell 1 \stopxcell
+ \startxcell[demo][nx=2] 2 / 3 \stopxcell
+ \startxcell 4 \stopxcell
+\stopxrow
+\startxrow
+ \startxcell 1 \stopxcell
+ \startxcell 2 \stopxcell
+ \startxcell[demo][nx=2] 3 / 4 \stopxcell
+\stopxrow
+\startxrow
+ \startxcell[demo][nx=2] 1 / 2 \stopxcell
+ \startxcell[demo][nx=2] 3 / 4 \stopxcell
+\stopxrow
+\startxrow
+ \startxcell 1 \stopxcell
+ \startxcell 2 \stopxcell
+ \startxcell 3 \stopxcell
+ \startxcell 4 \stopxcell
+\stopxrow
+\stopxtable
+\stopbuffer
+
+\startbuffer[tight]
+\setupxtable[demo][option=tight]
+\stopbuffer
+
+\startbuffer[normal]
+\setupxtable[demo][option=]
+\stopbuffer
+
+\typebuffer[demo]
+
+\page
+
+\typebuffer[tight] \start \getbuffer[tight,demo] \stop
+\typebuffer[normal] \start \getbuffer[normal,demo] \stop
+
+% \ruledhbox{\getbuffer[normal,demo]}
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/man/man1/context.1 b/Master/texmf-dist/doc/man/man1/context.1
index c1808f0735a..0c2f607f21d 100644
--- a/Master/texmf-dist/doc/man/man1/context.1
+++ b/Master/texmf-dist/doc/man/man1/context.1
@@ -1,4 +1,4 @@
-.TH "mtx-context" "1" "01-01-2014" "version 0.60" "ConTeXt Process Management"
+.TH "mtx-context" "1" "01-01-2015" "version 0.60" "ConTeXt Process Management"
.SH NAME
.B mtx-context
.SH SYNOPSIS
@@ -141,6 +141,12 @@ profile job (use: mtxrun --script profile --analyze)
.B --timing
generate timing and statistics overview
.TP
+.B --keeptuc
+keep previous tuc files (jobname-tuc-[run].tmp)
+.TP
+.B --keeplog
+keep previous log files (jobname-log-[run].tmp)
+.TP
.B --extra=name
process extra (mtx-context-... in distribution)
.TP
@@ -159,6 +165,9 @@ process file with texexec
.TP
.B --pipe
do not check for file and enter scroll mode (--dummyfile=whatever.tmp)
+.TP
+.B --sandbox
+process file in a limited environment
.SH AUTHOR
More information about ConTeXt and the tools that come with it can be found at:
diff --git a/Master/texmf-dist/doc/man/man1/context.man1.pdf b/Master/texmf-dist/doc/man/man1/context.man1.pdf
index 3b0178d850f..c7489bee3f7 100644
--- a/Master/texmf-dist/doc/man/man1/context.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/context.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/latexdiff-vc.1 b/Master/texmf-dist/doc/man/man1/latexdiff-vc.1
index 87341f1e358..dec9e1306fb 100644
--- a/Master/texmf-dist/doc/man/man1/latexdiff-vc.1
+++ b/Master/texmf-dist/doc/man/man1/latexdiff-vc.1
@@ -1,4 +1,4 @@
-.\" Automatically generated by Pod::Man 2.27 (Pod::Simple 3.28)
+.\" Automatically generated by Pod::Man 2.25 (Pod::Simple 3.16)
.\"
.\" Standard preamble:
.\" ========================================================================
@@ -38,8 +38,6 @@
. ds PI \(*p
. ds L" ``
. ds R" ''
-. ds C`
-. ds C'
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
@@ -50,24 +48,17 @@
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
.\" entries marked with X<> in POD. Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
-.\"
-.\" Avoid warning from groff about undefined register 'F'.
-.de IX
+.ie \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
..
-.nr rF 0
-.if \n(.g .if rF .nr rF 1
-.if (\n(rF:(\n(.g==0)) \{
-. if \nF \{
-. de IX
-. tm Index:\\$1\t\\n%\t"\\$2"
+. nr % 0
+. rr F
+.\}
+.el \{\
+. de IX
..
-. if !\nF==2 \{
-. nr % 0
-. nr F 2
-. \}
-. \}
.\}
-.rr rF
.\"
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
.\" Fear. Run. Save yourself. No user-serviceable parts.
@@ -133,7 +124,7 @@
.\" ========================================================================
.\"
.IX Title "LATEXDIFF-VC 1"
-.TH LATEXDIFF-VC 1 "2014-07-20" "perl v5.18.2" " "
+.TH LATEXDIFF-VC 1 "2015-04-14" "perl v5.14.2" " "
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
@@ -152,15 +143,15 @@ latexdiff\-vc \- wrapper script that calls latexdiff for different versions of a
.SH "DESCRIPTION"
.IX Header "DESCRIPTION"
\&\fIlatexdiff-vc\fR is a wrapper script that applies \fIlatexdiff\fR to a
-file, or multiple files under version control (\s-1CVS, RCS\s0 or \s-1SVN\s0), and optionally runs the
+file, or multiple files under version control (\s-1CVS\s0, \s-1RCS\s0 or \s-1SVN\s0), and optionally runs the
sequence of \f(CW\*(C`latex\*(C'\fR and \f(CW\*(C`dvips\*(C'\fR or \f(CW\*(C`pdflatex\*(C'\fR commands necessary to
produce pdf or postscript output of the difference tex file(s). It can
also be applied to a pair of files to automatise the generation of difference
file in postscript or pdf format.
.SH "OPTIONS"
.IX Header "OPTIONS"
-.IP "\fB\-\-rcs\fR, \fB\-\-svn\fR, \fB\-\-cvs\fR, or \fB\-\-git\fR" 4
-.IX Item "--rcs, --svn, --cvs, or --git"
+.IP "\fB\-\-rcs\fR, \fB\-\-svn\fR, \fB\-\-cvs\fR, \fB\-\-git\fR or \fB\-\-hg\fR" 4
+.IX Item "--rcs, --svn, --cvs, --git or --hg"
Set the version system.
If no version system is specified, latexdiff-vc will venture a guess.
.Sp
@@ -168,12 +159,12 @@ latexdiff-cvs and latexdiff-rcs are variants of latexdiff-vc which default to
the respective versioning system. However, this default can still be overridden using the options above.
.IP "\fB\-r\fR, \fB\-r\fR \fIrev\fR or \fB\-\-revision\fR, \fB\-\-revision=\fR\fIrev\fR" 4
.IX Item "-r, -r rev or --revision, --revision=rev"
-Choose revision (under \s-1RCS, CVS, SVN\s0 or \s-1GIT\s0). One or two \fB\-r\fR options can be
+Choose revision (under \s-1RCS\s0, \s-1CVS\s0, \s-1SVN\s0, \s-1GIT\s0 or \s-1HG\s0). One or two \fB\-r\fR options can be
specified, and they result in different behaviour:
.RS 4
.IP "\fBlatexdiff-vc\fR \-r \fIfile.tex\fR ..." 4
.IX Item "latexdiff-vc -r file.tex ..."
-compares \fIfile.tex\fR with the most recent version checked into \s-1RCS.\s0
+compares \fIfile.tex\fR with the most recent version checked into \s-1RCS\s0.
.IP "\fBlatexdiff-vc\fR \-r \fIrev1\fR \fIfile.tex\fR ..." 4
.IX Item "latexdiff-vc -r rev1 file.tex ..."
compares \fIfile.tex\fR with revision \fIrev1\fR.
@@ -184,7 +175,7 @@ compares revisions \fIrev1\fR and \fIrev2\fR of \fIfile.tex\fR.
Multiple files can be specified for all of the above options. All files must have the
extension \f(CW\*(C`.tex\*(C'\fR, though.
.IP "\fBlatexdiff-vc\fR \fIold.tex\fR \fInew.tex\fR" 4
-.IX Item "latexdiff-vc old.tex new.tex"
+.IX Item "latexdiff-vc old.tex new.tex"
compares two files.
.RE
.RS 4
@@ -193,12 +184,20 @@ The name of the difference file is generated automatically and
reported to stdout.
.RE
.IP "\fB\-d\fR or \fB\-\-dir\fR \fB\-d\fR \fIpath\fR or \fB\-\-dir=\fR\fIpath\fR" 4
-.IX Item "-d or --dir -d path or --dir=path"
+.IX Item "-d or --dir -d path or --dir=path"
Rather than appending the string \f(CW\*(C`diff\*(C'\fR and optionally the version
numbers given to the output-file, this will prepend a directory name \f(CW\*(C`diff\*(C'\fR
to the
original filename, creating the directory and subdirectories should they not exist already. This is particularly useful in order to clone a
complete directory hierarchy. Optionally, a pathname \fIpath\fR can be specified, which is prepended instead of \f(CW\*(C`diff\*(C'\fR.
+.IP "\fB\-\-flatten,\-\-flatten=keep\-intermediate\fR" 4
+.IX Item "--flatten,--flatten=keep-intermediate"
+If combined with \f(CW\*(C`\-\-git\*(C'\fR, \f(CW\*(C`\-\-svn\*(C'\fR or \f(CW\*(C`\-\-hg\*(C'\fR option or the corresponding modes, check out the revisions to compare in a separate temporary directory, and then pass on option \f(CW\*(C`\-\-flatten\*(C'\fR to latexdiff. The directory in which \f(CW\*(C`latexdiff\-vc\*(C'\fR is invoked defines the subtree which will be checked out.
+Note that if additional files are needed which are not included in the flatten procedure (package files, included graphics), they need to be accessible in the current directory. If you use bibtex, it is recommended to include the \f(CW\*(C`.bbl\*(C'\fR file in the version management.
+.Sp
+The generic usage of this function is : \f(CW\*(C`latexdiff\-vc \-\-flatten \-r rev1 [\-r rev2] master.tex\*(C'\fR where master.tex is the project file containing the highest level of includes etc.
+.Sp
+With \f(CW\*(C`\-\-flatten=keep\-intermediate\*(C'\fR, the intermediate revision snapshots are kept in the current directory (Default is to store them in a temporary directory and delete them after generating the diff file.)
.IP "\fB\-\-fast\fR or \fB\-\-so\fR" 4
.IX Item "--fast or --so"
Use \f(CW\*(C`latexdiff\-fast\*(C'\fR or \f(CW\*(C`latexdiff\-so\*(C'\fR, respectively (instead of \f(CW\*(C`latexdiff\*(C'\fR).
@@ -215,6 +214,11 @@ bibtex; latex; latex; dvips\*(C'\fR.
Generate pdf output from difference file using \f(CW\*(C`pdflatex\*(C'\fR. This will
run the sequence \f(CW\*(C`pdflatex; pdflatex\*(C'\fR on the difference file, or
\&\f(CW\*(C`pdflatex; bibtex; pdflatex; pdflatex\*(C'\fR for files requiring bibtex.
+.IP "\fB\-\-only\-changes\fR" 4
+.IX Item "--only-changes"
+Post-process the output such that only pages with changes on them are displayed. This requires the use of subtype \s-1ZLABEL\s0
+in latexdiff, which will be set automatically, but any manually set \-s option will be overruled (also requires zref package to
+be installsed). (note that this option must be combined with \-\-ps or \-\-pdf to make sense)
.IP "\fB\-\-force\fR" 4
.IX Item "--force"
Overwrite existing diff files without asking for confirmation. Default
@@ -234,19 +238,19 @@ latexdiff
.SH "PORTABILITY"
.IX Header "PORTABILITY"
\&\fIlatexdiff-vc\fR uses external commands and is therefore
-limited to Unix-like systems. It also requires the \s-1RCS\s0 version control
-system and latex to be installed on the system. Modules from Perl 5.8
+limited to Unix-like systems. It also requires the a version control
+system and latex to be installed on the system to make use of all features. Modules from Perl 5.8
or higher are required.
.SH "BUG REPORTING"
.IX Header "BUG REPORTING"
Please submit bug reports using the issue tracker of the github repository page \fIhttps://github.com/ftilmann/latexdiff.git\fR,
-or send them to \fItilmann@gfz\-potsdam.de\fR. Include the serial number of \fIlatexdiff-vc\fR
-(option \f(CW\*(C`\-\-version\*(C'\fR)
-\&.
-=head1 \s-1AUTHOR\s0
-.PP
-Copyright (C) 2005,2012 Frederik Tilmann
+or send them to \fItilmann \*(-- \s-1AT\s0 \*(-- gfz\-potsdam.de\fR. Include the serial number of \fIlatexdiff-vc\fR
+(option \f(CW\*(C`\-\-version\*(C'\fR).
+.SH "AUTHOR"
+.IX Header "AUTHOR"
+Copyright (C) 2005\-2015 Frederik Tilmann
.PP
This program is free software; you can redistribute it and/or modify
it under the terms of the \s-1GNU\s0 General Public License Version 3
-Contributors: S Utcke, H Bruyninckx
+Contributors: S Utcke, H Bruyninckx; some ideas have been inspired by git-latexdiff bash script.
+C. Junghans: Mercurial Support.
diff --git a/Master/texmf-dist/doc/man/man1/latexdiff-vc.man1.pdf b/Master/texmf-dist/doc/man/man1/latexdiff-vc.man1.pdf
index f934e07627e..aa1fcab822f 100644
--- a/Master/texmf-dist/doc/man/man1/latexdiff-vc.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/latexdiff-vc.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/latexdiff.1 b/Master/texmf-dist/doc/man/man1/latexdiff.1
index cc7c69a5fd5..24834cbde14 100644
--- a/Master/texmf-dist/doc/man/man1/latexdiff.1
+++ b/Master/texmf-dist/doc/man/man1/latexdiff.1
@@ -1,4 +1,4 @@
-.\" Automatically generated by Pod::Man 2.27 (Pod::Simple 3.28)
+.\" Automatically generated by Pod::Man 2.25 (Pod::Simple 3.16)
.\"
.\" Standard preamble:
.\" ========================================================================
@@ -38,8 +38,6 @@
. ds PI \(*p
. ds L" ``
. ds R" ''
-. ds C`
-. ds C'
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
@@ -50,24 +48,17 @@
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
.\" entries marked with X<> in POD. Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
-.\"
-.\" Avoid warning from groff about undefined register 'F'.
-.de IX
+.ie \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
..
-.nr rF 0
-.if \n(.g .if rF .nr rF 1
-.if (\n(rF:(\n(.g==0)) \{
-. if \nF \{
-. de IX
-. tm Index:\\$1\t\\n%\t"\\$2"
+. nr % 0
+. rr F
+.\}
+.el \{\
+. de IX
..
-. if !\nF==2 \{
-. nr % 0
-. nr F 2
-. \}
-. \}
.\}
-.rr rF
.\"
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
.\" Fear. Run. Save yourself. No user-serviceable parts.
@@ -133,7 +124,7 @@
.\" ========================================================================
.\"
.IX Title "LATEXDIFF 1"
-.TH LATEXDIFF 1 "2014-07-21" "perl v5.18.2" " "
+.TH LATEXDIFF 1 "2015-04-14" "perl v5.14.2" " "
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
@@ -271,7 +262,7 @@ Add code to preamble for selected markup style. This option defines
Available styles:
.Sp
\&\f(CW\*(C`UNDERLINE CTRADITIONAL TRADITIONAL CFONT FONTSTRIKE INVISIBLE
-CHANGEBAR CCHANGEBAR CULINECHBAR CFONTCBHBAR\*(C'\fR
+CHANGEBAR CCHANGEBAR CULINECHBAR CFONTCBHBAR BOLD\*(C'\fR
.Sp
[ Default: \f(CW\*(C`UNDERLINE\*(C'\fR ]
.IP "\fB\-\-subtype=markstyle\fR or \fB\-s markstyle\fR" 4
@@ -279,9 +270,10 @@ CHANGEBAR CCHANGEBAR CULINECHBAR CFONTCBHBAR\*(C'\fR
Add code to preamble for selected style for bracketing
commands (e.g. to mark changes in margin). This option defines
\&\f(CW\*(C`\eDIFaddbegin\*(C'\fR, \f(CW\*(C`\eDIFaddend\*(C'\fR, \f(CW\*(C`\eDIFdelbegin\*(C'\fR and \f(CW\*(C`\eDIFdelend\*(C'\fR commands.
-Available styles: \f(CW\*(C`SAFE MARGINAL COLOR DVIPSCOL LABEL\*(C'\fR
+Available styles: \f(CW\*(C`SAFE MARGINAL COLOR DVIPSCOL ZLABEL ONLYCHANGEDPAGE (LABEL)*\*(C'\fR
.Sp
[ Default: \f(CW\*(C`SAFE\*(C'\fR ]
+* Subtype \f(CW\*(C`LABEL\*(C'\fR is deprecated
.IP "\fB\-\-floattype=markstyle\fR or \fB\-f markstyle\fR" 4
.IX Item "--floattype=markstyle or -f markstyle"
Add code to preamble for selected style which
@@ -302,7 +294,7 @@ obtained by executing
.Sp
[Default encoding is utf8 unless the first few lines of the preamble contain
an invocation \f(CW\*(C`\eusepackage[..]{inputenc}\*(C'\fR in which case the
-encoding chosen by this command is asssumed. Note that \s-1ASCII \s0(standard
+encoding chosen by this command is asssumed. Note that \s-1ASCII\s0 (standard
latex) is a subset of utf8]
.IP "\fB\-\-preamble=file\fR or \fB\-p file\fR" 4
.IX Item "--preamble=file or -p file"
@@ -327,7 +319,8 @@ The following packages trigger special behaviour:
.ie n .IP """amsmath""" 8
.el .IP "\f(CWamsmath\fR" 8
.IX Item "amsmath"
-Configuration variable amsmath is set to \f(CW\*(C`align*\*(C'\fR (Default: \f(CW\*(C`eqnarray*\*(C'\fR)
+Configuration variable \s-1MATHARRREPL\s0 is set to \f(CW\*(C`align*\*(C'\fR (Default: \f(CW\*(C`eqnarray*\*(C'\fR). (Note that many of the
+amsmath array environments are already recognised by default as such)
.ie n .IP """endfloat""" 8
.el .IP "\f(CWendfloat\fR" 8
.IX Item "endfloat"
@@ -343,11 +336,31 @@ errors).
.el .IP "\f(CWapacite\fR" 8
.IX Item "apacite"
Redefine the commands recognised as citation commands.
+.ie n .IP """siunitx""" 8
+.el .IP "\f(CWsiunitx\fR" 8
+.IX Item "siunitx"
+Treat \f(CW\*(C`\eSI\*(C'\fR as equivalent to citation commands (i.e. protect with \f(CW\*(C`\embox\*(C'\fR if markup style uses ulem package.
+.ie n .IP """cleveref""" 8
+.el .IP "\f(CWcleveref\fR" 8
+.IX Item "cleveref"
+Treat \f(CW\*(C`\ecref,\eCref\*(C'\fR, etc as equivalent to citation commands (i.e. protect with \f(CW\*(C`\embox\*(C'\fR if markup style uses ulem package.
+.ie n .IP """glossaries""" 8
+.el .IP "\f(CWglossaries\fR" 8
+.IX Item "glossaries"
+Define most of the glossaries commands as safe, protecting them with \embox'es where needed
+.ie n .IP """mhchem""" 8
+.el .IP "\f(CWmhchem\fR" 8
+.IX Item "mhchem"
+Treat \f(CW\*(C`\ece\*(C'\fR as a safe command, i.e. it will be highlighted (note that \f(CW\*(C`\ecee\*(C'\fR will not be highlighted in equations as this leads to processing errors)
+.ie n .IP """chemformula""" 8
+.el .IP "\f(CWchemformula\fR" 8
+.IX Item "chemformula"
+Treat \f(CW\*(C`\ech\*(C'\fR as a safe command outside equations, i.e. it will be highlighted (note that \f(CW\*(C`\ech\*(C'\fR will not be highlighted in equations as this leads to processing errors)
.RE
.RS 4
.Sp
-[ Default: scan the preamble for \f(CW\*(C`\e\eusepackage\*(C'\fR commands to determine
- loaded packages.]
+[ Default: scan the preamble for \f(CW\*(C`\eusepackage\*(C'\fR commands to determine
+ loaded packages. ]
.RE
.IP "\fB\-\-show\-preamble\fR" 4
.IX Item "--show-preamble"
@@ -356,7 +369,7 @@ Print generated or included preamble commands to stdout.
.IX Subsection "Configuration"
.ie n .IP "\fB\-\-exclude\-safecmd=exclude\-file\fR or \fB\-A exclude-file\fR or \fB\-\-exclude\-safecmd=""cmd1,cmd2,...""\fR" 4
.el .IP "\fB\-\-exclude\-safecmd=exclude\-file\fR or \fB\-A exclude-file\fR or \fB\-\-exclude\-safecmd=``cmd1,cmd2,...''\fR" 4
-.IX Item "--exclude-safecmd=exclude-file or -A exclude-file or --exclude-safecmd=cmd1,cmd2,..."
+.IX Item "--exclude-safecmd=exclude-file or -A exclude-file or --exclude-safecmd=cmd1,cmd2,..."
.PD 0
.IP "\fB\-\-replace\-safecmd=replace\-file\fR" 4
.IX Item "--replace-safecmd=replace-file"
@@ -407,11 +420,28 @@ argument is shown as deleted text.
.IP "\fB\-\-replace\-context2cmd=replace\-file\fR" 4
.IX Item "--replace-context2cmd=replace-file"
.PD 0
-.ie n .IP "\fB\-\-append\-context2cmd=append\-file\fR or =item \fB\-\-append\-context2cmd=""cmd1,cmd2,...""\fR As corresponding commands for context1. The only difference is that context2 commands are completely disabled in deleted sections, including their arguments." 4
-.el .IP "\fB\-\-append\-context2cmd=append\-file\fR or =item \fB\-\-append\-context2cmd=``cmd1,cmd2,...''\fR As corresponding commands for context1. The only difference is that context2 commands are completely disabled in deleted sections, including their arguments." 4
-.IX Item "--append-context2cmd=append-file or =item --append-context2cmd=cmd1,cmd2,... As corresponding commands for context1. The only difference is that context2 commands are completely disabled in deleted sections, including their arguments."
+.ie n .IP "\fB\-\-append\-context2cmd=append\-file\fR or =item \fB\-\-append\-context2cmd=""cmd1,cmd2,...""\fR" 4
+.el .IP "\fB\-\-append\-context2cmd=append\-file\fR or =item \fB\-\-append\-context2cmd=``cmd1,cmd2,...''\fR" 4
+.IX Item "--append-context2cmd=append-file or =item --append-context2cmd=cmd1,cmd2,..."
+.PD
+As corresponding commands for context1. The only difference is that
+context2 commands are completely disabled in deleted sections, including
+their arguments.
+.ie n .IP "\fB\-\-exclude\-mboxsafecmd=exclude\-file\fR or \fB\-\-exclude\-mboxsafecmd=""cmd1,cmd2,...""\fR" 4
+.el .IP "\fB\-\-exclude\-mboxsafecmd=exclude\-file\fR or \fB\-\-exclude\-mboxsafecmd=``cmd1,cmd2,...''\fR" 4
+.IX Item "--exclude-mboxsafecmd=exclude-file or --exclude-mboxsafecmd=cmd1,cmd2,..."
+.PD 0
+.ie n .IP "\fB\-\-append\-mboxsafecmd=append\-file\fR or \fB\-\-append\-mboxsafecmd=""cmd1,cmd2,...""\fR" 4
+.el .IP "\fB\-\-append\-mboxsafecmd=append\-file\fR or \fB\-\-append\-mboxsafecmd=``cmd1,cmd2,...''\fR" 4
+.IX Item "--append-mboxsafecmd=append-file or --append-mboxsafecmd=cmd1,cmd2,..."
+.PD
+Define safe commands, which additionally need to be protected by encapsulating
+in an \e\embox{..}. This is sometimes needed to get around incompatibilities
+between external packages and the ulem package, which is used for highlighting
+in the default style \s-1UNDERLINE\s0 as well as \s-1CULINECHBAR\s0 \s-1CFONTSTRIKE\s0
.IP "\fB\-\-config var1=val1,var2=val2,...\fR or \fB\-c var1=val1,..\fR" 4
.IX Item "--config var1=val1,var2=val2,... or -c var1=val1,.."
+.PD 0
.IP "\fB\-c configfile\fR" 4
.IX Item "-c configfile"
.PD
@@ -483,13 +513,16 @@ being changed. [Default]
\&\f(CW\*(C`fine\*(C'\fR or \f(CW3\fR: Detect small change in equations and mark up at fine granularity.
This mode is most suitable, if only minor changes to equations are
expected, e.g. correction of typos.
-.IP "\fB\-\-disable\-citation\-markup\fR" 4
-.IX Item "--disable-citation-markup"
-Suppress citation markup in styles using ulem (\s-1UNDERLINE,
-FONTSTRIKE, CULINECHBAR\s0)
-.IP "\fB\-\-enable\-citation\-markup\fR" 4
-.IX Item "--enable-citation-markup"
-Protect citation commands in changed sections with \e\embox command [i.e. use default behaviour for ulem package for other packages]
+.IP "\fB\-\-disable\-citation\-markup\fR or \fB\-\-disable\-auto\-mbox\fR" 4
+.IX Item "--disable-citation-markup or --disable-auto-mbox"
+Suppress citation markup and markup of other vulnerable commands in styles
+using ulem (\s-1UNDERLINE\s0,FONTSTRIKE, \s-1CULINECHBAR\s0)
+(the two options are identical and are simply aliases)
+.IP "\fB\-\-enable\-citation\-markup\fR or \fB\-\-enforce\-auto\-mbox\fR" 4
+.IX Item "--enable-citation-markup or --enforce-auto-mbox"
+Protect citation commands and other vulnerable commands in changed sections
+with \f(CW\*(C`\embox\*(C'\fR command, i.e. use default behaviour for ulem package for other packages
+(the two options are identical and are simply aliases)
.SS "Miscellaneous"
.IX Subsection "Miscellaneous"
.IP "\fB\-\-verbose\fR or \fB\-V\fR" 4
@@ -499,7 +532,7 @@ Default is to work silently.
.IP "\fB\-\-driver=type\fR" 4
.IX Item "--driver=type"
Choose driver for changebar package (only relevant for styles using
- changebar: \s-1CCHANGEBAR CFONTCHBAR CULINECHBAR CHANGEBAR\s0). Possible
+ changebar: \s-1CCHANGEBAR\s0 \s-1CFONTCHBAR\s0 \s-1CULINECHBAR\s0 \s-1CHANGEBAR\s0). Possible
drivers are listed in changebar manual, e.g. pdftex,dvips,dvitops
[Default: dvips]
.IP "\fB\-\-ignore\-warnings\fR" 4
@@ -522,7 +555,7 @@ labels like this \f(CW\*(C`\-L labelold \-L labelnew\*(C'\fR.
Suppress inclusion of old and new file names as comment in output file
.IP "\fB\-\-visble\-label\fR" 4
.IX Item "--visble-label"
-Include old and new filenames (or labels set with \-\-label option) as
+Include old and new filenames (or labels set with \f(CW\*(C`\-\-label\*(C'\fR option) as
visible output.
.IP "\fB\-\-flatten\fR" 4
.IX Item "--flatten"
@@ -592,6 +625,10 @@ No mark up of text, but mark margins with changebars (Requires changebar package
.el .IP "\f(CWINVISIBLE\fR" 10
.IX Item "INVISIBLE"
No visible markup (but generic markup commands will still be inserted.
+.ie n .IP """BOLD""" 10
+.el .IP "\f(CWBOLD\fR" 10
+.IX Item "BOLD"
+Added text is set in bold face, discarded is not shown.
.SS "Subtypes"
.IX Subsection "Subtypes"
The subtype defines the commands that are inserted at the begin and end of added or discarded blocks, irrespectively of whether these blocks contain text or commands (Defined commands: \f(CW\*(C`\eDIFaddbegin, \eDIFaddend, \eDIFdelbegin, \eDIFdelend\*(C'\fR)
@@ -619,6 +656,19 @@ An alternative way of marking added passages in blue, and deleted ones in red. N
that \f(CW\*(C`DVIPSCOL\*(C'\fR only works with the dvips converter, e.g. not pdflatex.
(it is recommeneded to use instead the main types to effect colored markup,
although in some cases coloring with dvipscol can be more complete).
+.ie n .IP """ZLABEL""" 10
+.el .IP "\f(CWZLABEL\fR" 10
+.IX Item "ZLABEL"
+can be used to highlight only changed pages, but requires post-processing. It is recommend to not call this option manually but use \f(CW\*(C`latexdiff\-vc\*(C'\fR with \f(CW\*(C`\-\-only\-changes\*(C'\fR option. Alternatively, use the script given within preamble of diff files made using this style.
+.ie n .IP """ONLYCHANGEDPAGE""" 10
+.el .IP "\f(CWONLYCHANGEDPAGE\fR" 10
+.IX Item "ONLYCHANGEDPAGE"
+also highlights changed pages, without the need for post-processing, but might not work reliably if
+there is floating material (figures, tables).
+.ie n .IP """LABEL""" 10
+.el .IP "\f(CWLABEL\fR" 10
+.IX Item "LABEL"
+is similar to \f(CW\*(C`ZLABEL\*(C'\fR, but does not need the zref package and works less reliably (deprecated).
.SS "Float Types"
.IX Subsection "Float Types"
Some of the markup used in the main text might cause problems when used within
@@ -693,22 +743,29 @@ numbering in the new file.
[ Default: \f(CW\*(C`COUNTERCMD\*(C'\fR=\f(CW\*(C`(?:footnote|part|section|subsection\*(C'\fR ...
.Sp
\&\f(CW\*(C`|subsubsection|paragraph|subparagraph)\*(C'\fR ]
-.SH "COMMON PROBLEMS"
-.IX Header "COMMON PROBLEMS"
+.SH "COMMON PROBLEMS AND FAQ"
+.IX Header "COMMON PROBLEMS AND FAQ"
.IP "Citations result in overfull boxes" 10
.IX Item "Citations result in overfull boxes"
There is an incompatibility between the \f(CW\*(C`ulem\*(C'\fR package, which \f(CW\*(C`latexdiff\*(C'\fR uses for underlining and striking out in the \s-1UNDERLINE\s0 style,
-the default style. In order to be able to mark up citations properly, they are placed with an \f(CW\*(C`\embox\*(C'\fR command in post-processing. As mboxes
-cannot be broken across lines, this procedure frequently results in overfull boxes, possibly obscuring the content as it extends beyond the right margin. If this is a problem, you have two possibilities:
+the default style, and the way citations are generated. In order to be able to mark up citations properly, they are enclosed with an \f(CW\*(C`\embox\*(C'\fR
+command. As mboxes cannot be broken across lines, this procedure frequently results in overfull boxes, possibly obscuring the content as it extends beyond the right margin. The same occurs for some other packages (e.g., siunitx). If this is a problem, you have two possibilities.
.Sp
-1. Use \f(CW\*(C`COLOR\*(C'\fR or \f(CW\*(C`DVIPSCOL\*(C'\fR subtype markup (option \f(CW\*(C`\-s COLOR\*(C'\fR): If this markup is chosen, then changed citations are no longer marked up
-with the wavy line (additions) or struck out (deletions), but are still highlighted in the appropriate color.
+1. Use \f(CW\*(C`CFONT\*(C'\fR type markup (option \f(CW\*(C`\-t CFONT\*(C'\fR): If this markup is chosen, then changed citations are no longer marked up
+with the wavy line (additions) or struck out (deletions), but are still highlighted in the appropriate color, and deleted text is shown with a different font. Other styles not using the \f(CW\*(C`ulem\*(C'\fR package will also work.
.Sp
2. Choose option \f(CW\*(C`\-\-disable\-citation\-markup\*(C'\fR which turns off the marking up of citations: deleted citations are no longer shown, and
-added ctations are shown without markup. (This was the default behaviour of latexdiff at versions 0.6 and older)
+added citations are shown without markup. (This was the default behaviour of latexdiff at versions 0.6 and older)
+.Sp
+For custom packages you can define the commands which need to be protected by \f(CW\*(C`\embox\*(C'\fR with \f(CW\*(C`\-\-append\-mboxsafecmd\*(C'\fR and \f(CW\*(C`\-\-excludemboxsafecmd\*(C'\fR options
+(submit your lists of command as feature request at github page to set the default behaviour of future versions, see section 6)
.IP "Changes in complicated mathematical equations result in latex processing errors" 10
.IX Item "Changes in complicated mathematical equations result in latex processing errors"
Try options \f(CW\*(C`\-\-math\-markup=whole\*(C'\fR. If even that fails, you can turn off mark up for equations with \f(CW\*(C`\-\-math\-markup=off\*(C'\fR.
+.IP "How can I just show the pages" 10
+.IX Item "How can I just show the pages"
+Use options \-\f(CW\*(C`\-s ZLABEL\*(C'\fR (some postprocessing required) or \f(CW\*(C`\-s ONLYCHANGEDPAGE\*(C'\fR. \f(CW\*(C`latexdiff\-vc \-\-ps|\-\-pdf\*(C'\fR with \f(CW\*(C`\-\-only\-changes\*(C'\fR option takes care of
+the post-processing for you (requires zref packages).
.SH "BUGS"
.IX Header "BUGS"
Option allow-spaces not implemented entirely consistently. It breaks
@@ -716,7 +773,7 @@ the rules that number and type of white space does not matter, as
different numbers of inter-argument spaces are treated as significant.
.PP
Please submit bug reports using the issue tracker of the github repository page \fIhttps://github.com/ftilmann/latexdiff.git\fR,
-or send them to \fItilmann@gfz\-potsdam.de\fR. Include the serial number of \fIlatexdiff\fR
+or send them to \fItilmann \*(-- \s-1AT\s0 \*(-- gfz\-potsdam.de\fR. Include the serial number of \fIlatexdiff\fR
(from comments at the top of the source or use \fB\-\-version\fR). If you come across latex
files that are error-free and conform to the specifications set out
above, and whose differencing still does not result in error-free
@@ -740,8 +797,8 @@ version, \fIlatexdiff-so\fR, which has this package inlined, is available, too.
\&\fIlatexdiff-fast\fR requires the \fIdiff\fR command to be present.
.SH "AUTHOR"
.IX Header "AUTHOR"
-Version 1.0.4
-Copyright (C) 2004\-2012 Frederik Tilmann
+Version 1.1.0
+Copyright (C) 2004\-2015 Frederik Tilmann
.PP
This program is free software; you can redistribute it and/or modify
it under the terms of the \s-1GNU\s0 General Public License Version 3
diff --git a/Master/texmf-dist/doc/man/man1/latexdiff.man1.pdf b/Master/texmf-dist/doc/man/man1/latexdiff.man1.pdf
index c19e2658272..72318cf6833 100644
--- a/Master/texmf-dist/doc/man/man1/latexdiff.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/latexdiff.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/latexrevise.1 b/Master/texmf-dist/doc/man/man1/latexrevise.1
index b39017e60fa..259bbc29eea 100644
--- a/Master/texmf-dist/doc/man/man1/latexrevise.1
+++ b/Master/texmf-dist/doc/man/man1/latexrevise.1
@@ -1,4 +1,4 @@
-.\" Automatically generated by Pod::Man 2.27 (Pod::Simple 3.28)
+.\" Automatically generated by Pod::Man 2.25 (Pod::Simple 3.16)
.\"
.\" Standard preamble:
.\" ========================================================================
@@ -38,8 +38,6 @@
. ds PI \(*p
. ds L" ``
. ds R" ''
-. ds C`
-. ds C'
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
@@ -50,24 +48,17 @@
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
.\" entries marked with X<> in POD. Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
-.\"
-.\" Avoid warning from groff about undefined register 'F'.
-.de IX
+.ie \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
..
-.nr rF 0
-.if \n(.g .if rF .nr rF 1
-.if (\n(rF:(\n(.g==0)) \{
-. if \nF \{
-. de IX
-. tm Index:\\$1\t\\n%\t"\\$2"
+. nr % 0
+. rr F
+.\}
+.el \{\
+. de IX
..
-. if !\nF==2 \{
-. nr % 0
-. nr F 2
-. \}
-. \}
.\}
-.rr rF
.\"
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
.\" Fear. Run. Save yourself. No user-serviceable parts.
@@ -133,7 +124,7 @@
.\" ========================================================================
.\"
.IX Title "LATEXREVISE 1"
-.TH LATEXREVISE 1 "2014-07-20" "perl v5.18.2" " "
+.TH LATEXREVISE 1 "2015-04-14" "perl v5.14.2" " "
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
@@ -219,7 +210,7 @@ which should have been removed already.
.IX Header "BUGS"
The current version is a beta version which has not yet been
extensively tested, but worked fine locally. Please submit bug reports using the issue tracker of the github repository page \fIhttps://github.com/ftilmann/latexdiff.git\fR,
-or send them to \fItilmann@gfz\-potsdam.de\fR.. Include the serial number of \fIlatexrevise\fR
+or send them to \fItilmann \*(-- \s-1AT\s0 \*(-- gfz\-potsdam.de\fR.. Include the serial number of \fIlatexrevise\fR
(Option \-\-version). If you come across latexdiff
output which is not processed correctly by \fIlatexrevise\fR please include the
problem file as well as the old and new files on which it is based,
diff --git a/Master/texmf-dist/doc/man/man1/latexrevise.man1.pdf b/Master/texmf-dist/doc/man/man1/latexrevise.man1.pdf
index 1a569f1dc7c..19a4aa582f9 100644
--- a/Master/texmf-dist/doc/man/man1/latexrevise.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/latexrevise.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/luatools.1 b/Master/texmf-dist/doc/man/man1/luatools.1
index 72dea580063..ecdd6aa326a 100644
--- a/Master/texmf-dist/doc/man/man1/luatools.1
+++ b/Master/texmf-dist/doc/man/man1/luatools.1
@@ -1,4 +1,4 @@
-.TH "luatools" "1" "01-01-2014" "version 1.35" "ConTeXt TDS Management Tool (aka luatools)"
+.TH "luatools" "1" "01-01-2015" "version 1.35" "ConTeXt TDS Management Tool (aka luatools)"
.SH NAME
.B luatools
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/luatools.man1.pdf b/Master/texmf-dist/doc/man/man1/luatools.man1.pdf
index 00a52e80762..25d788f9177 100644
--- a/Master/texmf-dist/doc/man/man1/luatools.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/luatools.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-babel.1 b/Master/texmf-dist/doc/man/man1/mtx-babel.1
index 6f78cf43d2b..8477eb522e2 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-babel.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-babel.1
@@ -1,4 +1,4 @@
-.TH "mtx-babel" "1" "01-01-2014" "version 1.20" "Babel Input To UTF Conversion"
+.TH "mtx-babel" "1" "01-01-2015" "version 1.20" "Babel Input To UTF Conversion"
.SH NAME
.B mtx-babel
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-babel.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-babel.man1.pdf
index 367b9e11ee9..c3bf10c5308 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-babel.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-babel.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-base.1 b/Master/texmf-dist/doc/man/man1/mtx-base.1
index 84d67a3fe29..08e13b09d67 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-base.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-base.1
@@ -1,4 +1,4 @@
-.TH "mtx-base" "1" "01-01-2014" "version 1.35" "ConTeXt TDS Management Tool (aka luatools)"
+.TH "mtx-base" "1" "01-01-2015" "version 1.35" "ConTeXt TDS Management Tool (aka luatools)"
.SH NAME
.B mtx-base
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-base.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-base.man1.pdf
index 938d7aa8cee..cb4aa48ac90 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-base.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-base.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-bibtex.1 b/Master/texmf-dist/doc/man/man1/mtx-bibtex.1
deleted file mode 100644
index cedf41b8bc6..00000000000
--- a/Master/texmf-dist/doc/man/man1/mtx-bibtex.1
+++ /dev/null
@@ -1,30 +0,0 @@
-.TH "mtx-bibtex" "1" "01-01-2014" "version 1.00" "bibtex helpers"
-.SH NAME
-.B mtx-bibtex
-.SH SYNOPSIS
-.B mtxrun --script bibtex [
-.I OPTIONS ...
-.B ] [
-.I FILENAMES
-.B ]
-.SH DESCRIPTION
-.B bibtex helpers
-.SH OPTIONS
-.TP
-.B --toxml
-convert bibtex database(s) to xml
-.TP
-.B --tolua
-convert bibtex database(s) to lua
-.SH AUTHOR
-More information about ConTeXt and the tools that come with it can be found at:
-
-
-.B "maillist:"
-ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
-
-.B "webpage:"
-http://www.pragma-ade.nl / http://tex.aanhet.net
-
-.B "wiki:"
-http://contextgarden.net
diff --git a/Master/texmf-dist/doc/man/man1/mtx-bibtex.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-bibtex.man1.pdf
deleted file mode 100644
index 1fe1ede1ac4..00000000000
--- a/Master/texmf-dist/doc/man/man1/mtx-bibtex.man1.pdf
+++ /dev/null
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-cache.1 b/Master/texmf-dist/doc/man/man1/mtx-cache.1
index 02f8a2ec470..a7acb8b2e86 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-cache.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-cache.1
@@ -1,4 +1,4 @@
-.TH "mtx-cache" "1" "01-01-2014" "version 0.10" "ConTeXt &error; MetaTeX Cache Management"
+.TH "mtx-cache" "1" "01-01-2015" "version 0.10" "ConTeXt &error; MetaTeX Cache Management"
.SH NAME
.B mtx-cache
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-cache.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-cache.man1.pdf
index 2bdcc36272d..41ac0ad68e5 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-cache.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-cache.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-chars.1 b/Master/texmf-dist/doc/man/man1/mtx-chars.1
index 749f6315edb..5c9d79bb3b8 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-chars.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-chars.1
@@ -1,4 +1,4 @@
-.TH "mtx-chars" "1" "01-01-2014" "version 0.10" "MkII Character Table Generators"
+.TH "mtx-chars" "1" "01-01-2015" "version 0.10" "MkII Character Table Generators"
.SH NAME
.B mtx-chars
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-chars.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-chars.man1.pdf
index c9cf00d958e..bd8a511c444 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-chars.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-chars.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-check.1 b/Master/texmf-dist/doc/man/man1/mtx-check.1
index 3893081cbb6..ca18bc1a601 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-check.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-check.1
@@ -1,4 +1,4 @@
-.TH "mtx-check" "1" "01-01-2014" "version 0.10" "Basic ConTeXt Syntax Checking"
+.TH "mtx-check" "1" "01-01-2015" "version 0.10" "Basic ConTeXt Syntax Checking"
.SH NAME
.B mtx-check
.SH SYNOPSIS
@@ -11,7 +11,7 @@
.B Basic ConTeXt Syntax Checking
.SH OPTIONS
.TP
-.B --convert
+.B --check
check tex file for errors
.SH AUTHOR
More information about ConTeXt and the tools that come with it can be found at:
diff --git a/Master/texmf-dist/doc/man/man1/mtx-check.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-check.man1.pdf
index 607068ad28b..b76a50b9358 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-check.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-check.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-colors.1 b/Master/texmf-dist/doc/man/man1/mtx-colors.1
index 68959ae744b..a969e474cbc 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-colors.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-colors.1
@@ -1,4 +1,4 @@
-.TH "mtx-colors" "1" "01-01-2014" "version 0.10" "ConTeXt Color Management"
+.TH "mtx-colors" "1" "01-01-2015" "version 0.10" "ConTeXt Color Management"
.SH NAME
.B mtx-colors
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-colors.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-colors.man1.pdf
index bb3997e59c3..b8eb88c0446 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-colors.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-colors.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-context.1 b/Master/texmf-dist/doc/man/man1/mtx-context.1
index c1808f0735a..0c2f607f21d 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-context.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-context.1
@@ -1,4 +1,4 @@
-.TH "mtx-context" "1" "01-01-2014" "version 0.60" "ConTeXt Process Management"
+.TH "mtx-context" "1" "01-01-2015" "version 0.60" "ConTeXt Process Management"
.SH NAME
.B mtx-context
.SH SYNOPSIS
@@ -141,6 +141,12 @@ profile job (use: mtxrun --script profile --analyze)
.B --timing
generate timing and statistics overview
.TP
+.B --keeptuc
+keep previous tuc files (jobname-tuc-[run].tmp)
+.TP
+.B --keeplog
+keep previous log files (jobname-log-[run].tmp)
+.TP
.B --extra=name
process extra (mtx-context-... in distribution)
.TP
@@ -159,6 +165,9 @@ process file with texexec
.TP
.B --pipe
do not check for file and enter scroll mode (--dummyfile=whatever.tmp)
+.TP
+.B --sandbox
+process file in a limited environment
.SH AUTHOR
More information about ConTeXt and the tools that come with it can be found at:
diff --git a/Master/texmf-dist/doc/man/man1/mtx-context.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-context.man1.pdf
index 53cbdcf4065..5cdae2561a8 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-context.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-context.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-epub.1 b/Master/texmf-dist/doc/man/man1/mtx-epub.1
index 52bcd1d88f6..bb33c23df29 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-epub.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-epub.1
@@ -1,4 +1,4 @@
-.TH "mtx-epub" "1" "01-01-2014" "version 0.12" "ConTeXt EPUB Helpers"
+.TH "mtx-epub" "1" "01-01-2015" "version 1.10" "ConTeXt EPUB Helpers"
.SH NAME
.B mtx-epub
.SH SYNOPSIS
@@ -13,6 +13,21 @@
.TP
.B --make
create epub zip file
+.TP
+.B --purge
+remove obsolete files
+.TP
+.B --rename
+rename images to sane names
+.TP
+.B --svgmath
+convert mathml to svg
+.TP
+.B --svgstyle
+use given tex style for svg generation (overloads style in specification)
+.TP
+.B --all
+assume: --purge --rename --svgmath (for fast testing)
.SH AUTHOR
More information about ConTeXt and the tools that come with it can be found at:
diff --git a/Master/texmf-dist/doc/man/man1/mtx-epub.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-epub.man1.pdf
index 13da4a4ffad..d1c6ec76e02 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-epub.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-epub.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-fcd.1 b/Master/texmf-dist/doc/man/man1/mtx-fcd.1
index 41d5120e09d..311f90e4a8a 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-fcd.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-fcd.1
@@ -1,4 +1,4 @@
-.TH "mtx-fcd" "1" "01-01-2014" "version 1.00" "Fast Directory Change"
+.TH "mtx-fcd" "1" "01-01-2015" "version 1.00" "Fast Directory Change"
.SH NAME
.B mtx-fcd
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-fcd.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-fcd.man1.pdf
index 5740ac3e0f7..3f2fc4ab896 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-fcd.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-fcd.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-flac.1 b/Master/texmf-dist/doc/man/man1/mtx-flac.1
index 0d2c94308b0..4ab875899c6 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-flac.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-flac.1
@@ -1,4 +1,4 @@
-.TH "mtx-flac" "1" "01-01-2014" "version 0.10" "ConTeXt Flac Helpers"
+.TH "mtx-flac" "1" "01-01-2015" "version 0.10" "ConTeXt Flac Helpers"
.SH NAME
.B mtx-flac
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-flac.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-flac.man1.pdf
index 71bc81e26ec..5dbb94d71f0 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-flac.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-flac.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-fonts.1 b/Master/texmf-dist/doc/man/man1/mtx-fonts.1
index 9136e30fe58..c0806a32c8c 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-fonts.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-fonts.1
@@ -1,4 +1,4 @@
-.TH "mtx-fonts" "1" "01-01-2014" "version 0.21" "ConTeXt Font Database Management"
+.TH "mtx-fonts" "1" "01-01-2015" "version 0.21" "ConTeXt Font Database Management"
.SH NAME
.B mtx-fonts
.SH SYNOPSIS
@@ -44,7 +44,7 @@ show all found instances (combined with other flags)
.B --info
give more details
.TP
-.B --track=list
+.B --trackers=list
enable trackers
.TP
.B --statistics
diff --git a/Master/texmf-dist/doc/man/man1/mtx-fonts.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-fonts.man1.pdf
index 57ded42f8e0..0e67b22a89f 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-fonts.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-fonts.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-grep.1 b/Master/texmf-dist/doc/man/man1/mtx-grep.1
index 4bc7ea62e57..6b85f541fd3 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-grep.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-grep.1
@@ -1,4 +1,4 @@
-.TH "mtx-grep" "1" "01-01-2014" "version 0.10" "Simple Grepper"
+.TH "mtx-grep" "1" "01-01-2015" "version 0.10" "Simple Grepper"
.SH NAME
.B mtx-grep
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-grep.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-grep.man1.pdf
index ee7abb3a69c..64ff1ede5e0 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-grep.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-grep.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-interface.1 b/Master/texmf-dist/doc/man/man1/mtx-interface.1
index 862fa08bc54..36bf8bc138b 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-interface.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-interface.1
@@ -1,4 +1,4 @@
-.TH "mtx-interface" "1" "01-01-2014" "version 0.13" "ConTeXt Interface Related Goodies"
+.TH "mtx-interface" "1" "01-01-2015" "version 0.13" "ConTeXt Interface Related Goodies"
.SH NAME
.B mtx-interface
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-interface.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-interface.man1.pdf
index 2d0e1805b8f..236610348a6 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-interface.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-interface.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-metapost.1 b/Master/texmf-dist/doc/man/man1/mtx-metapost.1
index 0c60e33e26e..37b1b7c9f3a 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-metapost.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-metapost.1
@@ -1,4 +1,4 @@
-.TH "mtx-metapost" "1" "01-01-2014" "version 0.10" "MetaPost to PDF processor"
+.TH "mtx-metapost" "1" "01-01-2015" "version 0.10" "MetaPost to PDF processor"
.SH NAME
.B mtx-metapost
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-metapost.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-metapost.man1.pdf
index 72b26f17280..d445c6e848b 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-metapost.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-metapost.man1.pdf
@@ -4,7 +4,7 @@
<</Length 6 0 R/Filter /FlateDecode>>
stream
xUَ6}WܷJIJ&t8cHG=j8#ѽeL{=$% p&֍Ca|sXb(|A)+@r!'!ą)" q M՘'=ypO8)B K$ T#l*I=?Lǵ/O GeEu@ݵeQGv0!IpY@tD$dQ"?oGIz[7Im 43zb4$D/!!5@LF_^UjǛO;O`l<,C׶Pޖa6xgnSqȄ틤7{ZMTo!k}f"ӻ0 ŦBs6ymBlLP`E|?&OȪSkR$RjّcĔGGȇWhh}1TZgTlX6ؙPN-f+#l̼buB6x 6|īML*Mg~]u +Ŀ?^&g몪-7zYhU%jk}Uƞ89.].U7x $U.3/Jt )-7<5]Ngy5\^=,[Te#Bwo~ŗa/l&n)&}XBKb69x.$rqZKmKFN0^%1Z ez&!8
-uR'rX ꕖ Za^r|T(}OCʪ|E-{ #=e>8ŽY,v?9endstream
+uR'rX ꕖ Za^r|T(}OCʪ|E-{ #=e>8eS`7?Gendstream
endobj
6 0 obj
901
@@ -66,12 +66,12 @@ endobj
<?adobe-xap-filters esc="CRLF"?>
<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
-<rdf:Description rdf:about='uuid:8ad492bf-1951-11ef-0000-aa309aaa098b' xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.10'/>
-<rdf:Description rdf:about='uuid:8ad492bf-1951-11ef-0000-aa309aaa098b' xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2014-05-22T00:12:27+02:00</xmp:ModifyDate>
-<xmp:CreateDate>2014-05-22T00:12:27+02:00</xmp:CreateDate>
-<xmp:CreatorTool>groff version 1.22.2</xmp:CreatorTool></rdf:Description>
-<rdf:Description rdf:about='uuid:8ad492bf-1951-11ef-0000-aa309aaa098b' xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:8ad492bf-1951-11ef-0000-aa309aaa098b'/>
-<rdf:Description rdf:about='uuid:8ad492bf-1951-11ef-0000-aa309aaa098b' xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+<rdf:Description rdf:about='uuid:d3d34956-1e39-11f0-0000-c9036fd95b1c' xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.16'/>
+<rdf:Description rdf:about='uuid:d3d34956-1e39-11f0-0000-c9036fd95b1c' xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2015-04-19T00:50:15+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2015-04-19T00:50:15+02:00</xmp:CreateDate>
+<xmp:CreatorTool>groff version 1.22.3</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about='uuid:d3d34956-1e39-11f0-0000-c9036fd95b1c' xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:d3d34956-1e39-11f0-0000-c9036fd95b1c'/>
+<rdf:Description rdf:about='uuid:d3d34956-1e39-11f0-0000-c9036fd95b1c' xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
</rdf:RDF>
</x:xmpmeta>
@@ -80,10 +80,10 @@ endobj
endstream
endobj
2 0 obj
-<</Producer(GPL Ghostscript 9.10)
-/CreationDate(D:20140522001227+02'00')
-/ModDate(D:20140522001227+02'00')
-/Creator(groff version 1.22.2)>>endobj
+<</Producer(GPL Ghostscript 9.16)
+/CreationDate(D:20150419005015+02'00')
+/ModDate(D:20150419005015+02'00')
+/Creator(groff version 1.22.3)>>endobj
xref
0 15
0000000000 65535 f
@@ -103,7 +103,7 @@ xref
0000001681 00000 n
trailer
<< /Size 15 /Root 1 0 R /Info 2 0 R
-/ID [<32A445A5356F79DF70ABA17EEF1C9CAF><32A445A5356F79DF70ABA17EEF1C9CAF>]
+/ID [<45D938CE1359BC067499CD2EB383147C><45D938CE1359BC067499CD2EB383147C>]
>>
startxref
3258
diff --git a/Master/texmf-dist/doc/man/man1/mtx-metatex.1 b/Master/texmf-dist/doc/man/man1/mtx-metatex.1
index a852686454a..72635044ff6 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-metatex.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-metatex.1
@@ -1,4 +1,4 @@
-.TH "mtx-metatex" "1" "01-01-2014" "version 0.10" "MetaTeX Process Management"
+.TH "mtx-metatex" "1" "01-01-2015" "version 0.10" "MetaTeX Process Management"
.SH NAME
.B mtx-metatex
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-metatex.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-metatex.man1.pdf
index 99c6c46da98..7862e59be63 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-metatex.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-metatex.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-modules.1 b/Master/texmf-dist/doc/man/man1/mtx-modules.1
index ebdc51c9ef1..a51a1b00e22 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-modules.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-modules.1
@@ -1,4 +1,4 @@
-.TH "mtx-modules" "1" "01-01-2014" "version 1.00" "ConTeXt Module Documentation Generators"
+.TH "mtx-modules" "1" "01-01-2015" "version 1.00" "ConTeXt Module Documentation Generators"
.SH NAME
.B mtx-modules
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-modules.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-modules.man1.pdf
index b9eefbace0f..ccb2b00c487 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-modules.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-modules.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-package.1 b/Master/texmf-dist/doc/man/man1/mtx-package.1
index 6df6cf0ca17..83c140f35f7 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-package.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-package.1
@@ -1,4 +1,4 @@
-.TH "mtx-package" "1" "01-01-2014" "version 0.10" "Distribution Related Goodies"
+.TH "mtx-package" "1" "01-01-2015" "version 0.10" "Distribution Related Goodies"
.SH NAME
.B mtx-package
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-package.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-package.man1.pdf
index 5188cc37235..fb242a7923f 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-package.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-package.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-patterns.1 b/Master/texmf-dist/doc/man/man1/mtx-patterns.1
index 3d6bf4d3c67..e93c1aff063 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-patterns.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-patterns.1
@@ -1,4 +1,4 @@
-.TH "mtx-patterns" "1" "01-01-2014" "version 0.20" "ConTeXt Pattern File Management"
+.TH "mtx-patterns" "1" "01-01-2015" "version 0.20" "ConTeXt Pattern File Management"
.SH NAME
.B mtx-patterns
.SH SYNOPSIS
@@ -31,6 +31,9 @@ compress data
.TP
.B --words
update words in given file
+.TP
+.B --hyphenate
+show hypephenated words
.SH AUTHOR
More information about ConTeXt and the tools that come with it can be found at:
diff --git a/Master/texmf-dist/doc/man/man1/mtx-patterns.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-patterns.man1.pdf
index 1bbcbdf472e..f593b43ef6a 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-patterns.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-patterns.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-pdf.1 b/Master/texmf-dist/doc/man/man1/mtx-pdf.1
index 97914846200..29b5ad420c2 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-pdf.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-pdf.1
@@ -1,4 +1,4 @@
-.TH "mtx-pdf" "1" "01-01-2014" "version 0.10" "ConTeXt PDF Helpers"
+.TH "mtx-pdf" "1" "01-01-2015" "version 0.10" "ConTeXt PDF Helpers"
.SH NAME
.B mtx-pdf
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-pdf.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-pdf.man1.pdf
index edef4498c44..808a65b5b36 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-pdf.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-pdf.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-plain.1 b/Master/texmf-dist/doc/man/man1/mtx-plain.1
index 717c9b6e153..c2e0e0bd9d5 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-plain.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-plain.1
@@ -1,4 +1,4 @@
-.TH "mtx-plain" "1" "01-01-2014" "version 1.00" "Plain TeX Runner"
+.TH "mtx-plain" "1" "01-01-2015" "version 1.00" "Plain TeX Runner"
.SH NAME
.B mtx-plain
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-plain.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-plain.man1.pdf
index 9e00aa8d0f0..8660bc83f7d 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-plain.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-plain.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-profile.1 b/Master/texmf-dist/doc/man/man1/mtx-profile.1
index 9b4671f13cf..6aa8e2087a4 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-profile.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-profile.1
@@ -1,4 +1,4 @@
-.TH "mtx-profile" "1" "01-01-2014" "version 1.00" "ConTeXt MkIV LuaTeX Profiler"
+.TH "mtx-profile" "1" "01-01-2015" "version 1.00" "ConTeXt MkIV LuaTeX Profiler"
.SH NAME
.B mtx-profile
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-profile.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-profile.man1.pdf
index 99036d2b310..f874b692144 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-profile.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-profile.man1.pdf
@@ -6,10 +6,10 @@ stream
xUrF+00N”)ʇQ@AS7ӃXEr >!JE0h
(^+]w 8 6FSй19ҒE`51npѼe]Wd!EU&Qo"qpM
LgaAW/rHSBcaݶ[é8}L 0%SgDnx@BycSo4Fێ@x5Dpeγ5O=|(,Y ^xZs}s;LO vD:_6B)-IBSM&7SDha .)q( 3O.bx?ۜ;}DQ#)o~O/&-ퟑm!ˠ1?z-酫Rv?fbJW|u{%*(V' `.6=d喂XJwFZӣGĈPwܰ>P S!eٯUUg(/zᚼ*{MKۢ5ϐVU+V mǕ!CO ]svډ| ;ECzڻl8J
-F\ͯpHs,FfP@ˑXrA|jH[tJF+&{XyvvԄ詾EfYaI(nW\5ޤc_S.R˞r1|QKLՏYńNc]`>g3͇WU@.ھ<!}־l(v$ !8bendstream
+F\ͯpHs,FfP@ˑXrA|jH[tJF+&{XyvvԄ詾EfYaI(nW\5ޤc_S.R˞r1|QKLՏYńNc]`>g3͇WU@.ھ<!}־l(ňyq!Fcendstream
endobj
6 0 obj
-789
+788
endobj
4 0 obj
<</Type/Page/MediaBox [0 0 612 792]
@@ -72,12 +72,12 @@ endobj
<?adobe-xap-filters esc="CRLF"?>
<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
-<rdf:Description rdf:about='uuid:89a365bf-1951-11ef-0000-d374a6315311' xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.10'/>
-<rdf:Description rdf:about='uuid:89a365bf-1951-11ef-0000-d374a6315311' xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2014-05-22T00:12:25+02:00</xmp:ModifyDate>
-<xmp:CreateDate>2014-05-22T00:12:25+02:00</xmp:CreateDate>
-<xmp:CreatorTool>groff version 1.22.2</xmp:CreatorTool></rdf:Description>
-<rdf:Description rdf:about='uuid:89a365bf-1951-11ef-0000-d374a6315311' xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:89a365bf-1951-11ef-0000-d374a6315311'/>
-<rdf:Description rdf:about='uuid:89a365bf-1951-11ef-0000-d374a6315311' xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+<rdf:Description rdf:about='uuid:d5047656-1e39-11f0-0000-b282cabedfd8' xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.16'/>
+<rdf:Description rdf:about='uuid:d5047656-1e39-11f0-0000-b282cabedfd8' xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2015-04-19T00:50:17+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2015-04-19T00:50:17+02:00</xmp:CreateDate>
+<xmp:CreatorTool>groff version 1.22.3</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about='uuid:d5047656-1e39-11f0-0000-b282cabedfd8' xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:d5047656-1e39-11f0-0000-b282cabedfd8'/>
+<rdf:Description rdf:about='uuid:d5047656-1e39-11f0-0000-b282cabedfd8' xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
</rdf:RDF>
</x:xmpmeta>
@@ -86,32 +86,32 @@ endobj
endstream
endobj
2 0 obj
-<</Producer(GPL Ghostscript 9.10)
-/CreationDate(D:20140522001225+02'00')
-/ModDate(D:20140522001225+02'00')
-/Creator(groff version 1.22.2)>>endobj
+<</Producer(GPL Ghostscript 9.16)
+/CreationDate(D:20150419005017+02'00')
+/ModDate(D:20150419005017+02'00')
+/Creator(groff version 1.22.3)>>endobj
xref
0 16
0000000000 65535 f
-0000001112 00000 n
-0000003064 00000 n
-0000001053 00000 n
-0000000893 00000 n
+0000001111 00000 n
+0000003063 00000 n
+0000001052 00000 n
+0000000892 00000 n
0000000015 00000 n
-0000000874 00000 n
-0000001177 00000 n
-0000001503 00000 n
-0000001366 00000 n
-0000001298 00000 n
-0000001218 00000 n
-0000001248 00000 n
-0000001447 00000 n
-0000001585 00000 n
-0000001641 00000 n
+0000000873 00000 n
+0000001176 00000 n
+0000001502 00000 n
+0000001365 00000 n
+0000001297 00000 n
+0000001217 00000 n
+0000001247 00000 n
+0000001446 00000 n
+0000001584 00000 n
+0000001640 00000 n
trailer
<< /Size 16 /Root 1 0 R /Info 2 0 R
-/ID [<497FDFBF3AC5C5E4F45B3F2151C02DE4><497FDFBF3AC5C5E4F45B3F2151C02DE4>]
+/ID [<F53CF2F78D4FE6661EF9E55366436DAF><F53CF2F78D4FE6661EF9E55366436DAF>]
>>
startxref
-3218
+3217
%%EOF
diff --git a/Master/texmf-dist/doc/man/man1/mtx-rsync.1 b/Master/texmf-dist/doc/man/man1/mtx-rsync.1
index 5119eae2907..195b6b0f0e4 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-rsync.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-rsync.1
@@ -1,4 +1,4 @@
-.TH "mtx-rsync" "1" "01-01-2014" "version 0.10" "Rsync Helpers"
+.TH "mtx-rsync" "1" "01-01-2015" "version 0.10" "Rsync Helpers"
.SH NAME
.B mtx-rsync
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-rsync.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-rsync.man1.pdf
index e9edd1f6bbc..797bc521604 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-rsync.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-rsync.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-scite.1 b/Master/texmf-dist/doc/man/man1/mtx-scite.1
index 8f268c5541d..cbaed08d1bc 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-scite.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-scite.1
@@ -1,4 +1,4 @@
-.TH "mtx-scite" "1" "01-01-2014" "version 1.00" "Scite Helper Script"
+.TH "mtx-scite" "1" "01-01-2015" "version 1.00" "Scite Helper Script"
.SH NAME
.B mtx-scite
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-scite.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-scite.man1.pdf
index d21f0dfb822..aef13372d38 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-scite.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-scite.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-server.1 b/Master/texmf-dist/doc/man/man1/mtx-server.1
index a43fd449c4c..f3d3ae6e429 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-server.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-server.1
@@ -1,4 +1,4 @@
-.TH "mtx-server" "1" "01-01-2014" "version 0.10" "Simple Webserver For Helpers"
+.TH "mtx-server" "1" "01-01-2015" "version 0.10" "Simple Webserver For Helpers"
.SH NAME
.B mtx-server
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-server.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-server.man1.pdf
index 3b25fdf1471..09d921c8fcd 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-server.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-server.man1.pdf
@@ -7,7 +7,7 @@ xV6} %!$1L6IllRwf<$6xGaaU`^W/6h`(
1Y( ft#J`I'RKݢ.^ҚH/Iq"=$6;M04:>OS bx ;9q wƏň$of1qȯQn$t[MAyu<}7oh_/o] JHnm٪^?RջKS&;k`QDF0YmZ"]dw{sᶺ·0K|wRgpC&~UG;R=>Ϲv 됰a+rε*e~R,{m´>ku}
{7پ[kJg4e_jJms4q+'&[[s(d@>ټxWil=v@V.hjçp( '+asG`fnxPAhVUo#TSJ
UiAk1ۛp84݃c &d&FH' vCmy|A%"̮m6Y-aGBrI/!e&NO1%RW\.*3Ի
-bYSNhesH]kU7Vvg݂D(pj? XBY?Nb7N$>endstream
+bYSNhesH]kU7Vvg݂D(pj? XBY?NY Ʃ;^$>endstream
endobj
6 0 obj
942
@@ -69,12 +69,12 @@ endobj
<?adobe-xap-filters esc="CRLF"?>
<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
-<rdf:Description rdf:about='uuid:8b6d293f-1951-11ef-0000-ff8586dca178' xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.10'/>
-<rdf:Description rdf:about='uuid:8b6d293f-1951-11ef-0000-ff8586dca178' xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2014-05-22T00:12:28+02:00</xmp:ModifyDate>
-<xmp:CreateDate>2014-05-22T00:12:28+02:00</xmp:CreateDate>
-<xmp:CreatorTool>groff version 1.22.2</xmp:CreatorTool></rdf:Description>
-<rdf:Description rdf:about='uuid:8b6d293f-1951-11ef-0000-ff8586dca178' xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:8b6d293f-1951-11ef-0000-ff8586dca178'/>
-<rdf:Description rdf:about='uuid:8b6d293f-1951-11ef-0000-ff8586dca178' xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+<rdf:Description rdf:about='uuid:d897fd56-1e39-11f0-0000-7df54779330e' xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.16'/>
+<rdf:Description rdf:about='uuid:d897fd56-1e39-11f0-0000-7df54779330e' xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2015-04-19T00:50:23+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2015-04-19T00:50:23+02:00</xmp:CreateDate>
+<xmp:CreatorTool>groff version 1.22.3</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about='uuid:d897fd56-1e39-11f0-0000-7df54779330e' xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:d897fd56-1e39-11f0-0000-7df54779330e'/>
+<rdf:Description rdf:about='uuid:d897fd56-1e39-11f0-0000-7df54779330e' xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
</rdf:RDF>
</x:xmpmeta>
@@ -83,10 +83,10 @@ endobj
endstream
endobj
2 0 obj
-<</Producer(GPL Ghostscript 9.10)
-/CreationDate(D:20140522001228+02'00')
-/ModDate(D:20140522001228+02'00')
-/Creator(groff version 1.22.2)>>endobj
+<</Producer(GPL Ghostscript 9.16)
+/CreationDate(D:20150419005023+02'00')
+/ModDate(D:20150419005023+02'00')
+/Creator(groff version 1.22.3)>>endobj
xref
0 15
0000000000 65535 f
@@ -106,7 +106,7 @@ xref
0000001722 00000 n
trailer
<< /Size 15 /Root 1 0 R /Info 2 0 R
-/ID [<2593EB0586BFC7E6D76483C7D4887A8C><2593EB0586BFC7E6D76483C7D4887A8C>]
+/ID [<5D3E1222E622DCDABF0CE8B94DFC9EF5><5D3E1222E622DCDABF0CE8B94DFC9EF5>]
>>
startxref
3299
diff --git a/Master/texmf-dist/doc/man/man1/mtx-texworks.1 b/Master/texmf-dist/doc/man/man1/mtx-texworks.1
index 21dd62fe46a..b9cc2ed98d7 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-texworks.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-texworks.1
@@ -1,4 +1,4 @@
-.TH "mtx-texworks" "1" "01-01-2014" "version 1.00" "TeXworks Startup Script"
+.TH "mtx-texworks" "1" "01-01-2015" "version 1.00" "TeXworks Startup Script"
.SH NAME
.B mtx-texworks
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-texworks.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-texworks.man1.pdf
index fa73abf244c..12d3e4c031d 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-texworks.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-texworks.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-timing.1 b/Master/texmf-dist/doc/man/man1/mtx-timing.1
index 19aaca1732d..2f7584f3da7 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-timing.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-timing.1
@@ -1,4 +1,4 @@
-.TH "mtx-timing" "1" "01-01-2014" "version 0.10" "ConTeXt Timing Tools"
+.TH "mtx-timing" "1" "01-01-2015" "version 0.10" "ConTeXt Timing Tools"
.SH NAME
.B mtx-timing
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-timing.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-timing.man1.pdf
index d7ec423ff54..0cd6cdccb17 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-timing.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-timing.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-tools.1 b/Master/texmf-dist/doc/man/man1/mtx-tools.1
index 45011d21d46..408d467cdbf 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-tools.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-tools.1
@@ -1,4 +1,4 @@
-.TH "mtx-tools" "1" "01-01-2014" "version 1.01" "Some File Related Goodies"
+.TH "mtx-tools" "1" "01-01-2015" "version 1.01" "Some File Related Goodies"
.SH NAME
.B mtx-tools
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-tools.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-tools.man1.pdf
index 2758c3733bd..bf36949e469 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-tools.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-tools.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-unzip.1 b/Master/texmf-dist/doc/man/man1/mtx-unzip.1
index ffddc1cf9a8..d9e2c844760 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-unzip.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-unzip.1
@@ -1,4 +1,4 @@
-.TH "mtx-unzip" "1" "01-01-2014" "version 0.10" "Simple Unzipper"
+.TH "mtx-unzip" "1" "01-01-2015" "version 0.10" "Simple Unzipper"
.SH NAME
.B mtx-unzip
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-unzip.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-unzip.man1.pdf
index 60c0f734892..9337221298a 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-unzip.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-unzip.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-update.1 b/Master/texmf-dist/doc/man/man1/mtx-update.1
index 60ba09fb579..e27c2ab43f0 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-update.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-update.1
@@ -1,4 +1,4 @@
-.TH "mtx-update" "1" "01-01-2014" "version 1.02" "ConTeXt Minimals Updater"
+.TH "mtx-update" "1" "01-01-2015" "version 1.02" "ConTeXt Minimals Updater"
.SH NAME
.B mtx-update
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-update.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-update.man1.pdf
index c0fa77cdc64..6633982a5fc 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-update.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-update.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-watch.1 b/Master/texmf-dist/doc/man/man1/mtx-watch.1
index babd2fcca5a..d8fab3acd5b 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-watch.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-watch.1
@@ -1,4 +1,4 @@
-.TH "mtx-watch" "1" "01-01-2014" "version 1.00" "ConTeXt Request Watchdog"
+.TH "mtx-watch" "1" "01-01-2015" "version 1.00" "ConTeXt Request Watchdog"
.SH NAME
.B mtx-watch
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-watch.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-watch.man1.pdf
index 7b4dcc05189..4c25c8caea4 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-watch.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-watch.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-youless.1 b/Master/texmf-dist/doc/man/man1/mtx-youless.1
index c1e9594c1b0..2703ec34f79 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-youless.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-youless.1
@@ -1,4 +1,4 @@
-.TH "mtx-youless" "1" "01-01-2014" "version 1.00" "youless Fetcher"
+.TH "mtx-youless" "1" "01-01-2015" "version 1.00" "youless Fetcher"
.SH NAME
.B mtx-youless
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/mtx-youless.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-youless.man1.pdf
index cbb3ad559ed..70ca0adfda0 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-youless.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-youless.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtxrun.1 b/Master/texmf-dist/doc/man/man1/mtxrun.1
index 77dc02dc5c5..8a3a75b64a5 100644
--- a/Master/texmf-dist/doc/man/man1/mtxrun.1
+++ b/Master/texmf-dist/doc/man/man1/mtxrun.1
@@ -1,4 +1,4 @@
-.TH "mtxrun" "1" "01-01-2014" "version 1.31" "ConTeXt TDS Runner Tool"
+.TH "mtxrun" "1" "01-01-2015" "version 1.31" "ConTeXt TDS Runner Tool"
.SH NAME
.B mtxrun
.SH SYNOPSIS
@@ -14,6 +14,9 @@
.B --script
run an mtx script (lua prefered method) (--noquotes), no script gives list
.TP
+.B --evaluate
+run code passed on the commandline (between quotes)
+.TP
.B --execute
run a script or program (texmfstart method) (--noquotes)
.TP
@@ -71,6 +74,9 @@ enable given trackers
.B --progname=str
format or backend
.TP
+.B --systeminfo=str
+show current operating system, processor, etc
+.TP
.B --edit
launch editor with found file
.TP
diff --git a/Master/texmf-dist/doc/man/man1/mtxrun.man1.pdf b/Master/texmf-dist/doc/man/man1/mtxrun.man1.pdf
index 914cbae3e10..3f4af3c2bde 100644
--- a/Master/texmf-dist/doc/man/man1/mtxrun.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtxrun.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/texexec.1 b/Master/texmf-dist/doc/man/man1/texexec.1
index cfefa9a74a6..841622bcda1 100644
--- a/Master/texmf-dist/doc/man/man1/texexec.1
+++ b/Master/texmf-dist/doc/man/man1/texexec.1
@@ -1,4 +1,4 @@
-.TH "texexec" "1" "01-01-2014" "version 6.2.1" "TeXExec"
+.TH "texexec" "1" "01-01-2015" "version 6.2.1" "TeXExec"
.SH NAME
.B texexec
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/man/man1/texexec.man1.pdf b/Master/texmf-dist/doc/man/man1/texexec.man1.pdf
index 7942cdf58f3..ff96d3520e9 100644
--- a/Master/texmf-dist/doc/man/man1/texexec.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/texexec.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/texmfstart.1 b/Master/texmf-dist/doc/man/man1/texmfstart.1
index 77dc02dc5c5..8a3a75b64a5 100644
--- a/Master/texmf-dist/doc/man/man1/texmfstart.1
+++ b/Master/texmf-dist/doc/man/man1/texmfstart.1
@@ -1,4 +1,4 @@
-.TH "mtxrun" "1" "01-01-2014" "version 1.31" "ConTeXt TDS Runner Tool"
+.TH "mtxrun" "1" "01-01-2015" "version 1.31" "ConTeXt TDS Runner Tool"
.SH NAME
.B mtxrun
.SH SYNOPSIS
@@ -14,6 +14,9 @@
.B --script
run an mtx script (lua prefered method) (--noquotes), no script gives list
.TP
+.B --evaluate
+run code passed on the commandline (between quotes)
+.TP
.B --execute
run a script or program (texmfstart method) (--noquotes)
.TP
@@ -71,6 +74,9 @@ enable given trackers
.B --progname=str
format or backend
.TP
+.B --systeminfo=str
+show current operating system, processor, etc
+.TP
.B --edit
launch editor with found file
.TP
diff --git a/Master/texmf-dist/doc/man/man1/texmfstart.man1.pdf b/Master/texmf-dist/doc/man/man1/texmfstart.man1.pdf
index 7dfda7505ca..e1be1d1268f 100644
--- a/Master/texmf-dist/doc/man/man1/texmfstart.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/texmfstart.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/fonts/map/pdftex/context/mkiv-base.map b/Master/texmf-dist/fonts/map/pdftex/context/mkiv-base.map
index 482bf089466..fc2aa643b39 100644
--- a/Master/texmf-dist/fonts/map/pdftex/context/mkiv-base.map
+++ b/Master/texmf-dist/fonts/map/pdftex/context/mkiv-base.map
@@ -135,110 +135,8 @@ eusm5 EUSM5 <eusm5.pfb
eusm7 EUSM7 <eusm7.pfb
eusm10 EUSM10 <eusm10.pfb
-% lm leftovers, used by inclusion
-
-cmb10 CMB10 <lm-rep-cmrm.enc <lmb10.pfb
-cmbx10 CMBX10 <lm-rep-cmrm.enc <lmbx10.pfb
-cmbx12 CMBX12 <lm-rep-cmrm.enc <lmbx12.pfb
-cmbx5 CMBX5 <lm-rep-cmrm.enc <lmbx5.pfb
-cmbx6 CMBX6 <lm-rep-cmrm.enc <lmbx6.pfb
-cmbx7 CMBX7 <lm-rep-cmrm.enc <lmbx7.pfb
-cmbx8 CMBX8 <lm-rep-cmrm.enc <lmbx8.pfb
-cmbx9 CMBX9 <lm-rep-cmrm.enc <lmbx9.pfb
-cmbxsl10 CMBXSL10 <lm-rep-cmrm.enc <lmbxo10.pfb
-cmbxti10 CMBXTI10 <lm-rep-cmit.enc <lmbxi10.pfb
-cmbxti12 CMBXTI12 <lm-rep-cmit.enc <lmbxti10.pfb
-cmbxti7 CMBXTI7 <lm-rep-cmit.enc <lmbxti10.pfb
-cmcsc10 CMCSC10 <lm-rep-cmsc.enc <lmcsc10.pfb
-cmcsc8 CMCSC8 <lm-rep-cmsc.enc <lmcsc10.pfb
-cmcsc9 CMCSC9 <lm-rep-cmsc.enc <lmcsc10.pfb
-cminch CMINCH <lm-rep-cmin.enc <lmssbx10.pfb
-cmitt10 CMITT10 <lm-rep-cmitt.enc <lmtti10.pfb
-cmitt12 CMITT12 <lm-rep-cmitt.enc <lmtti10.pfb
-cmitt9 CMITT9 <lm-rep-cmitt.enc <lmtti10.pfb
-cmr10 CMR10 <lm-rep-cmrm.enc <lmr10.pfb
-cmr12 CMR12 <lm-rep-cmrm.enc <lmr12.pfb
-cmr17 CMR17 <lm-rep-cmrm.enc <lmr17.pfb
-cmr5 CMR5 <lm-rep-cmsc.enc <lmr5.pfb
-cmr6 CMR6 <lm-rep-cmrm.enc <lmr6.pfb
-cmr7 CMR7 <lm-rep-cmrm.enc <lmr7.pfb
-cmr8 CMR8 <lm-rep-cmrm.enc <lmr8.pfb
-cmr9 CMR9 <lm-rep-cmrm.enc <lmr9.pfb
-cmsl10 CMSL10 <lm-rep-cmrm.enc <lmro10.pfb
-cmsl12 CMSL12 <lm-rep-cmrm.enc <lmro12.pfb
-cmsl6 CMSL6 <lm-rep-cmrm.enc <lmro8.pfb
-cmsl8 CMSL8 <lm-rep-cmrm.enc <lmro8.pfb
-cmsl9 CMSL9 <lm-rep-cmrm.enc <lmro9.pfb
-cmsltt10 CMSLTT10 <lm-rep-cmtt.enc <lmtto10.pfb
-cmsltt9 CMSLTT9 <lm-rep-cmtt.enc <lmtto10.pfb
-cmss10 CMS10 <lm-rep-cmrm.enc <lmss10.pfb
-cmss12 CMS12 <lm-rep-cmrm.enc <lmss12.pfb
-cmss17 CMS17 <lm-rep-cmrm.enc <lmss17.pfb
-cmss8 CMS8 <lm-rep-cmrm.enc <lmss8.pfb
-cmss9 CMS9 <lm-rep-cmrm.enc <lmss9.pfb
-cmssbx10 CMSSBX10 <lm-rep-cmrm.enc <lmssbx10.pfb
-cmssbxo10 CMSSBXO10 <lm-rep-cmrm.enc <lmssbo10.pfb
-cmssdc10 CMSSDC10 <lm-rep-cmrm.enc <lmssdc10.pfb
-cmssi10 CMSI10 <lm-rep-cmrm.enc <lmsso10.pfb
-cmssi12 CMSI12 <lm-rep-cmrm.enc <lmsso12.pfb
-cmssi17 CMSI17 <lm-rep-cmrm.enc <lmsso17.pfb
-cmssi8 CMSSI8 <lm-rep-cmrm.enc <lmsso8.pfb
-cmssi9 CMSSI9 <lm-rep-cmrm.enc <lmsso9.pfb
-cmssq8 CMSQ8 <lm-rep-cmrm.enc <lmssq8.pfb
-cmssqi8 CMSSQI8 <lm-rep-cmrm.enc <lmssqo8.pfb
-cmtcsc10 CMTCSC10 <lm-rep-cmtt.enc <lmtcsc10.pfb
-cmti10 CMTI10 <lm-rep-cmit.enc <lmri10.pfb
-cmti12 CMTI12 <lm-rep-cmit.enc <lmri12.pfb
-cmti7 CMTI7 <lm-rep-cmit.enc <lmri7.pfb
-cmti8 CMTI8 <lm-rep-cmit.enc <lmri8.pfb
-cmti9 CMTI9 <lm-rep-cmit.enc <lmri9.pfb
-cmtt10 CMTT10 <lm-rep-cmtt.enc <lmtt10.pfb
-cmtt12 CMTT12 <lm-rep-cmtt.enc <lmtt12.pfb
-cmtt8 CMTT8 <lm-rep-cmtt.enc <lmtt8.pfb
-cmtt9 CMTT9 <lm-rep-cmtt.enc <lmtt9.pfb
-cmvtt10 CMVTT10 <lm-rep-cmrm.enc <lmvtt10.pfb
-
-% math
-
-cmex10 LMMathExtension10-Regular "enclmmathex ReEncodeFont" <lm-mathex.enc <lmex10.pfb
-cmex9 LMMathExtension10-Regular "enclmmathex ReEncodeFont" <lm-mathex.enc <lmex10.pfb
-cmex8 LMMathExtension10-Regular "enclmmathex ReEncodeFont" <lm-mathex.enc <lmex10.pfb
-cmex7 LMMathExtension10-Regular "enclmmathex ReEncodeFont" <lm-mathex.enc <lmex10.pfb
-
-cmmi5 LMMathItalic5-Italic "enclmmathit ReEncodeFont" <lm-mathit.enc <lmmi5.pfb
-cmmi6 LMMathItalic6-Italic "enclmmathit ReEncodeFont" <lm-mathit.enc <lmmi6.pfb
-cmmi7 LMMathItalic7-Italic "enclmmathit ReEncodeFont" <lm-mathit.enc <lmmi7.pfb
-cmmi8 LMMathItalic8-Italic "enclmmathit ReEncodeFont" <lm-mathit.enc <lmmi8.pfb
-cmmi9 LMMathItalic9-Italic "enclmmathit ReEncodeFont" <lm-mathit.enc <lmmi9.pfb
-cmmi10 LMMathItalic10-Italic "enclmmathit ReEncodeFont" <lm-mathit.enc <lmmi10.pfb
-cmmi12 LMMathItalic12-Italic "enclmmathit ReEncodeFont" <lm-mathit.enc <lmmi12.pfb
-
-cmmib5 LMMathItalic5-BoldItalic "enclmmathit ReEncodeFont" <lm-mathit.enc <lmmib5.pfb
-cmmib6 LMMathItalic6-BoldItalic "enclmmathit ReEncodeFont" <lm-mathit.enc <lmmib6.pfb
-cmmib7 LMMathItalic7-BoldItalic "enclmmathit ReEncodeFont" <lm-mathit.enc <lmmib7.pfb
-cmmib8 LMMathItalic8-BoldItalic "enclmmathit ReEncodeFont" <lm-mathit.enc <lmmib8.pfb
-cmmib9 LMMathItalic9-BoldItalic "enclmmathit ReEncodeFont" <lm-mathit.enc <lmmib9.pfb
-cmmib10 LMMathItalic10-BoldItalic "enclmmathit ReEncodeFont" <lm-mathit.enc <lmmib10.pfb
-cmmib12 LMMathItalic12-BoldItalic "enclmmathit ReEncodeFont" <lm-mathit.enc <lmmib12.pfb
-
-cmsy5 LMMathSymbols5-Italic "enclmmathsy ReEncodeFont" <lm-mathsy.enc <lmsy5.pfb
-cmsy6 LMMathSymbols6-Italic "enclmmathsy ReEncodeFont" <lm-mathsy.enc <lmsy6.pfb
-cmsy7 LMMathSymbols7-Italic "enclmmathsy ReEncodeFont" <lm-mathsy.enc <lmsy7.pfb
-cmsy8 LMMathSymbols8-Italic "enclmmathsy ReEncodeFont" <lm-mathsy.enc <lmsy8.pfb
-cmsy9 LMMathSymbols9-Italic "enclmmathsy ReEncodeFont" <lm-mathsy.enc <lmsy9.pfb
-cmsy10 LMMathSymbols10-Italic "enclmmathsy ReEncodeFont" <lm-mathsy.enc <lmsy10.pfb
-
-cmbsy5 LMMathSymbols5-BoldItalic "enclmmathsy ReEncodeFont" <lm-mathsy.enc <lmbsy5.pfb
-cmbsy6 LMMathSymbols6-BoldItalic "enclmmathsy ReEncodeFont" <lm-mathsy.enc <lmbsy6.pfb
-cmbsy7 LMMathSymbols7-BoldItalic "enclmmathsy ReEncodeFont" <lm-mathsy.enc <lmbsy7.pfb
-cmbsy8 LMMathSymbols8-BoldItalic "enclmmathsy ReEncodeFont" <lm-mathsy.enc <lmbsy8.pfb
-cmbsy9 LMMathSymbols9-BoldItalic "enclmmathsy ReEncodeFont" <lm-mathsy.enc <lmbsy9.pfb
-cmbsy10 LMMathSymbols10-BoldItalic "enclmmathsy ReEncodeFont" <lm-mathsy.enc <lmbsy10.pfb
-
% original
-cmdunh10 CMDUNH10 <cmdunh10.pfb
-
cmtex10 CMTEX10 <cmtex10.pfb
cmtex8 CMTEX8 <cmtex8.pfb
cmtex9 CMTEX9 <cmtex9.pfb
@@ -247,6 +145,80 @@ cmff10 CMFF10 <cmff10.pfb
cmfi10 CMFI10 <cmfi10.pfb
cmfib8 CMFIB8 <cmfib8.pfb
-% a weird one, not used in context
-
-cmu10 LMRoman10-Italic "-0.25 SlantFont" <lm-rep-cmit.enc <lmri10.pfb
+% the latest gust list
+
+cmb10 LMRomanDemi10-Regular "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmb10.pfb
+cmbx10 LMRoman10-Bold "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmbx10.pfb
+cmbx5 LMRoman5-Bold "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmbx5.pfb
+cmbx6 LMRoman6-Bold "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmbx6.pfb
+cmbx7 LMRoman7-Bold "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmbx7.pfb
+cmbx8 LMRoman8-Bold "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmbx8.pfb
+cmbx9 LMRoman9-Bold "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmbx9.pfb
+cmbxsl10 LMRomanSlant10-Bold "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmbxo10.pfb
+cmbxti10 LMRoman10-BoldItalic "enclmrepcmit ReEncodeFont" <lm-rep-cmit.enc <lmbxi10.pfb
+cmcsc10 LMRomanCaps10-Regular "enclmrepcmsc ReEncodeFont" <lm-rep-cmsc.enc <lmcsc10.pfb
+cmcscsl10 LMRomanCaps10-Oblique "enclmrepcmsc ReEncodeFont" <lm-rep-cmsc.enc <lmcsco10.pfb
+cmdunh10 LMRomanDunh10-Regular "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmdunh10.pfb
+cminch LMSans10-Bold "enclmrepcmin ReEncodeFont" <lm-rep-cmin.enc <lmssbx10.pfb
+cmitt10 LMMono10-Italic "enclmrepcmitt ReEncodeFont" <lm-rep-cmitt.enc <lmtti10.pfb
+cmr10 LMRoman10-Regular "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmr10.pfb
+cmr12 LMRoman12-Regular "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmr12.pfb
+cmr17 LMRoman17-Regular "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmr17.pfb
+cmr5 LMRoman5-Regular "enclmrepcmsc ReEncodeFont" <lm-rep-cmsc.enc <lmr5.pfb
+cmr6 LMRoman6-Regular "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmr6.pfb
+cmr7 LMRoman7-Regular "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmr7.pfb
+cmr8 LMRoman8-Regular "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmr8.pfb
+cmr9 LMRoman9-Regular "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmr9.pfb
+cmsl10 LMRomanSlant10-Regular "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmro10.pfb
+cmsl12 LMRomanSlant12-Regular "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmro12.pfb
+cmsl8 LMRomanSlant8-Regular "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmro8.pfb
+cmsl9 LMRomanSlant9-Regular "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmro9.pfb
+cmsltt10 LMMonoSlant10-Regular "enclmrepcmtt ReEncodeFont" <lm-rep-cmtt.enc <lmtto10.pfb
+cmss10 LMSans10-Regular "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmss10.pfb
+cmss12 LMSans12-Regular "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmss12.pfb
+cmss17 LMSans17-Regular "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmss17.pfb
+cmss8 LMSans8-Regular "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmss8.pfb
+cmss9 LMSans9-Regular "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmss9.pfb
+cmssbx10 LMSans10-Bold "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmssbx10.pfb
+cmssbxo10 LMSans10-BoldOblique "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmssbo10.pfb
+cmssdc10 LMSansDemiCond10-Regular "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmssdc10.pfb
+cmssi10 LMSans10-Oblique "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmsso10.pfb
+cmssi12 LMSans12-Oblique "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmsso12.pfb
+cmssi17 LMSans17-Oblique "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmsso17.pfb
+cmssi8 LMSans8-Oblique "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmsso8.pfb
+cmssi9 LMSans9-Oblique "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmsso9.pfb
+cmssq8 LMSansQuot8-Regular "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmssq8.pfb
+cmssqi8 LMSansQuot8-Oblique "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmssqo8.pfb
+cmtcsc10 LMMonoCaps10-Regular "enclmrepcmtt ReEncodeFont" <lm-rep-cmtt.enc <lmtcsc10.pfb
+cmti10 LMRoman10-Italic "enclmrepcmit ReEncodeFont" <lm-rep-cmit.enc <lmri10.pfb
+cmti12 LMRoman12-Italic "enclmrepcmit ReEncodeFont" <lm-rep-cmit.enc <lmri12.pfb
+cmti7 LMRoman7-Italic "enclmrepcmit ReEncodeFont" <lm-rep-cmit.enc <lmri7.pfb
+cmti8 LMRoman8-Italic "enclmrepcmit ReEncodeFont" <lm-rep-cmit.enc <lmri8.pfb
+cmti9 LMRoman9-Italic "enclmrepcmit ReEncodeFont" <lm-rep-cmit.enc <lmri9.pfb
+cmtt10 LMMono10-Regular "enclmrepcmtt ReEncodeFont" <lm-rep-cmtt.enc <lmtt10.pfb
+cmtt12 LMMono12-Regular "enclmrepcmtt ReEncodeFont" <lm-rep-cmtt.enc <lmtt12.pfb
+cmtt8 LMMono8-Regular "enclmrepcmtt ReEncodeFont" <lm-rep-cmtt.enc <lmtt8.pfb
+cmtt9 LMMono9-Regular "enclmrepcmtt ReEncodeFont" <lm-rep-cmtt.enc <lmtt9.pfb
+cmu10 LMRomanUnsl10-Regular "enclmrepcmit ReEncodeFont" <lm-rep-cmit.enc <lmu10.pfb
+cmvtt10 LMMonoProp10-Regular "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmvtt10.pfb
+
+cmbsy5 LMMathSymbols5-Bold "enclmmathsy ReEncodeFont" <lm-mathsy.enc <lmbsy5.pfb
+cmbsy7 LMMathSymbols7-Bold "enclmmathsy ReEncodeFont" <lm-mathsy.enc <lmbsy7.pfb
+cmbsy10 LMMathSymbols10-Bold "enclmmathsy ReEncodeFont" <lm-mathsy.enc <lmbsy10.pfb
+cmsy5 LMMathSymbols5-Regular "enclmmathsy ReEncodeFont" <lm-mathsy.enc <lmsy5.pfb
+cmsy6 LMMathSymbols6-Regular "enclmmathsy ReEncodeFont" <lm-mathsy.enc <lmsy6.pfb
+cmsy7 LMMathSymbols7-Regular "enclmmathsy ReEncodeFont" <lm-mathsy.enc <lmsy7.pfb
+cmsy8 LMMathSymbols8-Regular "enclmmathsy ReEncodeFont" <lm-mathsy.enc <lmsy8.pfb
+cmsy9 LMMathSymbols9-Regular "enclmmathsy ReEncodeFont" <lm-mathsy.enc <lmsy9.pfb
+cmsy10 LMMathSymbols10-Regular "enclmmathsy ReEncodeFont" <lm-mathsy.enc <lmsy10.pfb
+cmex10 LMMathExtension10-Regular "enclmmathex ReEncodeFont" <lm-mathex.enc <lmex10.pfb
+cmmi5 LMMathItalic5-Regular "enclmmathit ReEncodeFont" <lm-mathit.enc <lmmi5.pfb
+cmmi6 LMMathItalic6-Regular "enclmmathit ReEncodeFont" <lm-mathit.enc <lmmi6.pfb
+cmmi7 LMMathItalic7-Regular "enclmmathit ReEncodeFont" <lm-mathit.enc <lmmi7.pfb
+cmmi8 LMMathItalic8-Regular "enclmmathit ReEncodeFont" <lm-mathit.enc <lmmi8.pfb
+cmmi9 LMMathItalic9-Regular "enclmmathit ReEncodeFont" <lm-mathit.enc <lmmi9.pfb
+cmmi10 LMMathItalic10-Regular "enclmmathit ReEncodeFont" <lm-mathit.enc <lmmi10.pfb
+cmmi12 LMMathItalic12-Regular "enclmmathit ReEncodeFont" <lm-mathit.enc <lmmi12.pfb
+cmmib5 LMMathItalic5-Bold "enclmmathit ReEncodeFont" <lm-mathit.enc <lmmib5.pfb
+cmmib7 LMMathItalic7-Bold "enclmmathit ReEncodeFont" <lm-mathit.enc <lmmib7.pfb
+cmmib10 LMMathItalic10-Bold "enclmmathit ReEncodeFont" <lm-mathit.enc <lmmib10.pfb
diff --git a/Master/texmf-dist/metapost/context/base/metafun.mpiv b/Master/texmf-dist/metapost/context/base/metafun.mpiv
index 095b84b0ecc..b1d4f32e7ee 100644
--- a/Master/texmf-dist/metapost/context/base/metafun.mpiv
+++ b/Master/texmf-dist/metapost/context/base/metafun.mpiv
@@ -15,6 +15,9 @@
%D prevent dependency problems and in the end even may use a patched version,
%D we prefer to use a copy.
+prologues := 0 ;
+mpprocset := 1 ;
+
input "mp-base.mpiv" ;
input "mp-tool.mpiv" ;
input "mp-mlib.mpiv" ;
@@ -47,6 +50,7 @@ let normalend = end ;
if known mplib :
def end = ; message "" ; message metafunversion ; message "" ; endinput ; enddef ;
+ def bye = ; message "" ; message metafunversion ; message "" ; endinput ; enddef ;
else :
def end = ; message "" ; message metafunversion ; message "" ; normalend ; enddef ;
fi ;
diff --git a/Master/texmf-dist/metapost/context/base/mp-bare.mpiv b/Master/texmf-dist/metapost/context/base/mp-bare.mpiv
new file mode 100644
index 00000000000..c6194b1ee00
--- /dev/null
+++ b/Master/texmf-dist/metapost/context/base/mp-bare.mpiv
@@ -0,0 +1,93 @@
+%D \module
+%D [ file=mp-bare.mpiv,
+%D version=2014.10.31,
+%D title=\CONTEXT\ \METAPOST\ graphics,
+%D subtitle=plain plugins,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See licen-en.pdf for
+%C details.
+
+if known context_bare : endinput ; fi ;
+boolean context_bare ; context_bare := true ;
+
+numeric mfun_tt_w[], mfun_tt_h[], mfun_tt_d[] ;
+numeric mfun_tt_n ; mfun_tt_n := 0 ;
+picture mfun_tt_p ; mfun_tt_p := nullpicture ;
+picture mfun_tt_o ; mfun_tt_o := nullpicture ;
+picture mfun_tt_c ; mfun_tt_c := nullpicture ;
+
+if unknown mfun_trial_run :
+ boolean mfun_trial_run ;
+ mfun_trial_run := false ;
+fi ;
+
+if unknown mfun_first_run :
+ boolean mfun_first_run ;
+ mfun_first_run := true ;
+fi ;
+
+def mfun_reset_tex_texts =
+ mfun_tt_n := 0 ;
+ mfun_tt_p := nullpicture ;
+ mfun_tt_o := nullpicture ; % redundant
+ mfun_tt_c := nullpicture ; % redundant
+enddef ;
+
+def mfun_flush_tex_texts =
+ addto currentpicture also mfun_tt_p
+enddef ;
+
+extra_beginfig := extra_beginfig & "mfun_reset_tex_texts ;" ;
+extra_endfig := "mfun_flush_tex_texts ; mfun_reset_tex_texts ; " & extra_endfig ;
+
+vardef colordecimals primary c =
+ if cmykcolor c :
+ decimal cyanpart c & ":" & decimal magentapart c & ":" & decimal yellowpart c & ":" & decimal blackpart c
+ elseif rgbcolor c :
+ decimal redpart c & ":" & decimal greenpart c & ":" & decimal bluepart c
+ else :
+ decimal c
+ fi
+enddef ;
+
+vardef rawtextext(expr str) = % todo: avoid currentpicture
+ if str = "" :
+ nullpicture
+ else :
+ mfun_tt_n := mfun_tt_n + 1 ;
+ mfun_tt_c := nullpicture ;
+ if mfun_trial_run :
+ mfun_tt_o := nullpicture ;
+ addto mfun_tt_o doublepath origin _op_ ; % save drawoptions
+ addto mfun_tt_c doublepath unitsquare
+ withprescript "tx_number=" & decimal mfun_tt_n
+ withprescript "tx_stage=trial"
+ withprescript "tx_color=" & colordecimals colorpart mfun_tt_o
+ withpostscript str ;
+ addto mfun_tt_p also mfun_tt_c ;
+ elseif known mfun_tt_d[mfun_tt_n] :
+ addto mfun_tt_c doublepath unitsquare
+ xscaled mfun_tt_w[mfun_tt_n]
+ yscaled (mfun_tt_h[mfun_tt_n] + mfun_tt_d[mfun_tt_n])
+ shifted (0,-mfun_tt_d[mfun_tt_n])
+ withprescript "tx_number=" & decimal mfun_tt_n
+ withprescript "tx_stage=final" ;
+ else :
+ addto mfun_tt_c doublepath unitsquare ; % unitpicture
+ fi ;
+ mfun_tt_c
+ fi
+enddef ;
+
+primarydef str infont name = % nasty hack
+ if name = "" :
+ rawtextext(str)
+ else :
+ rawtextext("\definedfont[" & name & "]" & str)
+ fi
+enddef ;
+
diff --git a/Master/texmf-dist/metapost/context/base/mp-base.mpiv b/Master/texmf-dist/metapost/context/base/mp-base.mpiv
index 94379050bc8..28eb57fb895 100644
--- a/Master/texmf-dist/metapost/context/base/mp-base.mpiv
+++ b/Master/texmf-dist/metapost/context/base/mp-base.mpiv
@@ -195,7 +195,8 @@ yellow := (1,1,0) ;
background := white ; % obsolete
let graypart = greypart ;
-let graycolor = greycolor ;
+let greycolor = numeric ;
+let graycolor = numeric ;
% color part (will be overloaded)
@@ -865,7 +866,7 @@ vardef labels@#(text t) =
endfor
enddef ;
-% til lhere
+% till lhere
vardef dotlabels@#(text t) =
forsuffixes $=t:
@@ -881,17 +882,19 @@ vardef penlabels@#(text t) =
endfor
enddef ;
+% range 4 thru 10
+
def range expr x =
- numtok[x]
+ _numtok_[x]
enddef ;
-def numtok suffix x =
+def _numtok_ suffix x =
x
enddef ;
tertiarydef m thru n =
m for x=m+1 step 1 until n :
- , numtok[x]
+ , _numtok_[x]
endfor
enddef ;
diff --git a/Master/texmf-dist/metapost/context/base/mp-chem.mpiv b/Master/texmf-dist/metapost/context/base/mp-chem.mpiv
index a316a1a30cb..b861d3f123e 100644
--- a/Master/texmf-dist/metapost/context/base/mp-chem.mpiv
+++ b/Master/texmf-dist/metapost/context/base/mp-chem.mpiv
@@ -11,7 +11,8 @@
%C therefore copyrighted by \PRAGMA. See licen-en.pdf for
%C details.
-%D This module is incomplete and experimental.
+%D This module is incomplete and experimental. Okay, it's not that bad but we do need
+%D some disclaimer.
% either consistent setting or not
@@ -131,6 +132,8 @@ vardef chem_init_some (suffix $) (expr e) =
fi
if not chem_star[$] :
scaled (.5/(sind .5chem_num1))
+ % carbon-carbon benzene bond length
+ scaled (1.4/1.54)
fi ;
fi ;
@@ -300,7 +303,6 @@ enddef ;
chem_init_all ; % WHY does this not work unless defined and then called?
-
% Like most often in ConTeXt, we will trap but then silently ignore mistaken use,
% unless of course the error be too harmful...
@@ -529,6 +531,17 @@ vardef chem_set (suffix $) =
% This is a fairly complicated optimization and ajustement. It took some
% thinking to get right, so beware!
+ % And then even more time fixing a bug of a rotation +- half the symmetry
+ % angle of a structure depending on the scale and/or the font size
+ % (through chem_b_length).
+
+ % first save the symmetry angle of the structure (as in chem_rot):
+ chem_num0 := if chem_stacked[$] : 3 else : 0 fi ;
+ chem_num9 := if chem_tetra[$] : 360 else :
+ abs(angle(point 0+chem_num0 of chem_b_path[$]) -
+ angle(point 1+chem_num0 of chem_b_path[$]))
+ fi ;
+
if (chem_adjacent<>0) and chem_star[P] and chem_star[$] :
% nop
chem_adjacent := 0 ;
@@ -581,7 +594,8 @@ vardef chem_set (suffix $) =
-((point (chem_adjacent-1) of chem_b_path[P]) chem_transformed(P)) ;
fi
% adjust the bond angles
- chem_rotation := (chem_rotation + angle(chem_pair1)-angle(chem_pair3)) mod 360 ;
+ chem_num4 := (angle(chem_pair1)-angle(chem_pair3)) zmod chem_num9 ;
+ chem_rotation := chem_rotation + chem_num4 ;
if not chem_star[$] :
chem_pair4 :=
if chem_star[P] :
@@ -666,7 +680,8 @@ vardef chem_set (suffix $) =
fi
endfor
if not chem_front[$] : % adjust rotation
- chem_rotation := (chem_rotation + angle(chem_pair1)-angle(chem_pair3)) mod 360 ;
+ chem_num4 := angle(chem_pair1)-angle(chem_pair3) ;
+ chem_rotation := (chem_rotation + chem_num4) mod 360 ;
fi ;
chem_t := identity chem_transformed($) ;
chem_pair4 := (point chem_num3 of chem_b_path[$]) transformed chem_t ;
@@ -674,6 +689,9 @@ vardef chem_set (suffix $) =
currentpicture := currentpicture shifted chem_pair4 ;
chem_origin := chem_origin shifted chem_pair4 ;
fi
+ if not chem_front[$] : % adjust rotation
+ chem_rotation := chem_rotation zmod chem_num9 ;
+ fi
fi
chem_substituent := 0 ;
fi ;
@@ -1571,9 +1589,9 @@ vardef chem_rot (suffix $) (expr d, s) = % ROT
chem_rotation := 0
else :
chem_num0 := if chem_stacked[$] : 3 else : 0 fi ;
- chem_num1 := .5(angle(point d+chem_num0 of chem_b_path[$]) -
+ chem_num1 := .5(angle(point d+chem_num0 of chem_b_path[$]) -
angle(point d+chem_num0-1 of chem_b_path[$])) ;
- chem_rotation := (chem_rotation + s*chem_num1) mod 360 ;
+ chem_rotation := (chem_rotation + s*chem_num1) zmod 360 ;
fi
fi
enddef ;
@@ -1584,7 +1602,7 @@ vardef chem_mir (suffix $) (expr d, s) = % MIR
if not chem_front[$] :
if d=0 : % inversion
if chem_mirror=origin :
- chem_rotation := (chem_rotation + 180*s) mod 360 ;
+ chem_rotation := (chem_rotation + 180*s) zmod 360 ;
else :
chem_mirror := chem_mirror rotated 90 ;
fi
@@ -1600,7 +1618,7 @@ vardef chem_mir (suffix $) (expr d, s) = % MIR
chem_num0 := -360 - chem_num0 ;
fi
chem_num0 := chem_num0 * s ;
- chem_rotation := (chem_rotation + 2chem_num0) mod 360 ;
+ chem_rotation := (chem_rotation + 2chem_num0) zmod 360 ;
chem_mirror := origin ;
fi
fi
diff --git a/Master/texmf-dist/metapost/context/base/mp-func.mpiv b/Master/texmf-dist/metapost/context/base/mp-func.mpiv
index 58df711f2f3..b1b9d6d5d22 100644
--- a/Master/texmf-dist/metapost/context/base/mp-func.mpiv
+++ b/Master/texmf-dist/metapost/context/base/mp-func.mpiv
@@ -23,30 +23,36 @@ mfun_pathconnectors[0] := "," ;
mfun_pathconnectors[1] := "--" ;
mfun_pathconnectors[2] := ".." ;
mfun_pathconnectors[3] := "..." ;
+mfun_pathconnectors[4] := "---" ;
def pathconnectors = mfun_pathconnectors enddef ;
vardef mfun_function (expr f) (expr u, t, b, e, s) =
save x ; numeric x ;
+ save c ; string c ; c := if string f : f else : mfun_pathconnectors[f] fi ;
for xx := b step s until e :
hide (x := xx ;)
if xx > b :
- scantokens(mfun_pathconnectors[f])
+ scantokens(c)
fi
(scantokens(u),scantokens(t))
endfor
enddef ;
-def function = mfun_function enddef ; % let doesn't work here
-def punkedfunction = mfun_function (1) enddef ;
-def curvedfunction = mfun_function (2) enddef ;
-def tightfunction = mfun_function (3) enddef ;
+def function = mfun_function enddef ; % let doesn't work here
+def constructedfunction = mfun_function enddef ;
+def straightfunction = mfun_function (1) enddef ;
+def curvedfunction = mfun_function (2) enddef ;
+
+% def punkedfunction = mfun_function (1) enddef ; % same as straightfunction
+% def tightfunction = mfun_function (3) enddef ; % same as curvedfunction
vardef mfun_constructedpath (expr f) (text t) =
save ok ; boolean ok ; ok := false ;
+ save c ; string c ; c := if string f : f else : mfun_pathconnectors[f] fi ;
for i=t :
if ok :
- scantokens(mfun_pathconnectors[f])
+ scantokens(c)
else :
ok := true ;
fi
@@ -55,24 +61,27 @@ vardef mfun_constructedpath (expr f) (text t) =
enddef ;
def constructedpath = mfun_constructedpath enddef ; % let doesn't work here
-def punkedpath = mfun_constructedpath (1) enddef ;
+def straightpath = mfun_constructedpath (1) enddef ;
def curvedpath = mfun_constructedpath (2) enddef ;
-def tightpath = mfun_constructedpath (3) enddef ;
+
+% def punkedpath = mfun_constructedpath (1) enddef ; % same as straightpath
+% def tightpath = mfun_constructedpath (3) enddef ; % same as curvedpath
vardef mfun_constructedpairs (expr f) (text p) =
save i ; i := -1 ;
+ save c ; string c ; c := if string f : f else : mfun_pathconnectors[f] fi ;
forever :
exitif unknown p[incr(i)] ;
if i>0 :
- scantokens(mfun_pathconnectors[f])
+ scantokens(c)
fi
p[i]
endfor
enddef ;
def constructedpairs = mfun_constructedpairs enddef ; % let doesn't work here
-def punkedpairs = mfun_constructedpairs (1) enddef ;
+def straightpairs = mfun_constructedpairs (1) enddef ;
def curvedpairs = mfun_constructedpairs (2) enddef ;
-def tightpairs = mfun_constructedpairs (3) enddef ;
-
+% def punkedpairs = mfun_constructedpairs (1) enddef ; % same as straightpairs
+% def tightpairs = mfun_constructedpairs (3) enddef ; % same as curvedpairs
diff --git a/Master/texmf-dist/metapost/context/base/mp-grap.mpiv b/Master/texmf-dist/metapost/context/base/mp-grap.mpiv
index 6d2924c5263..4fd8ee5bd59 100644
--- a/Master/texmf-dist/metapost/context/base/mp-grap.mpiv
+++ b/Master/texmf-dist/metapost/context/base/mp-grap.mpiv
@@ -17,7 +17,10 @@ boolean context_grap ; context_grap := true ;
% Below is a modified graph.mp
-if epsilon/4 = 0 : % numbersystem="scaled" : (not reliable...)
+show numbersystem, numberprecision ;
+
+%if epsilon/4 = 0 :
+if numbersystem <> "double" :
errmessage "The graph macros require the double precision number system." ;
endinput ;
fi
@@ -75,7 +78,7 @@ newinternal mlogten ; mlogten := mlog(10) ;
newinternal largestmantissa ; largestmantissa := 2**52 ; % internal double warningcheck
newinternal singleinfinity ; singleinfinity := 2**128 ;
newinternal doubleinfinity ; doubleinfinity := 2**1024 ;
-Mzero := -largestmantissa ; % Note that we get arithmetic overflows if we set to -doubleinfinity
+%Mzero := -largestmantissa ; % Note that we get arithmetic overflows if we set to -doubleinfinity
% Safely convert a number to mlog form, trapping zero.
@@ -428,13 +431,15 @@ vardef graph_pair_adjust(expr p)(suffix tx, ty) = (tx xpart p, ty ypart p) endde
vardef graph_convert_user_path_to_internal primary p =
interim warningcheck :=0 ;
- graph_scan_path(p,
- (abs X_.graph_coordinate_type<>linear) or (abs Y_.graph_coordinate_type<>linear),
- if abs X_.graph_coordinate_type=log : graph_mlog fi,
- if abs Y_.graph_coordinate_type=log : graph_mlog fi)
- transformed (identity
- if X_.graph_coordinate_type<0 : xscaled -1 fi
- if Y_.graph_coordinate_type<0 : yscaled -1 fi)
+ if known p :
+ graph_scan_path(p,
+ (abs X_.graph_coordinate_type<>linear) or (abs Y_.graph_coordinate_type<>linear),
+ if abs X_.graph_coordinate_type=log : graph_mlog fi,
+ if abs Y_.graph_coordinate_type=log : graph_mlog fi)
+ transformed (identity
+ if X_.graph_coordinate_type<0 : xscaled -1 fi
+ if Y_.graph_coordinate_type<0 : yscaled -1 fi)
+ fi
enddef ;
% Convert label location t_ from user graph coords to internal graph coords.
@@ -520,10 +525,11 @@ enddef ;
% Execute c for each line of data read from file f, and stop at the first
% line with no data. Commands c can use line number i and tokens $1, $2, ...
+% and j is the number of fields.
def gdata(expr f)(suffix $)(text c) =
- boolean flag ;
- for i=1 upto infinity :
+ %boolean flag ; % not used?
+ for i=1 upto largestmantissa :
exitunless graph_read_line$(f) ;
c
endfor
diff --git a/Master/texmf-dist/metapost/context/base/mp-luas.mpiv b/Master/texmf-dist/metapost/context/base/mp-luas.mpiv
index b926b586c46..c919ba2159c 100644
--- a/Master/texmf-dist/metapost/context/base/mp-luas.mpiv
+++ b/Master/texmf-dist/metapost/context/base/mp-luas.mpiv
@@ -13,6 +13,15 @@
if known context_luas : endinput ; fi ;
+% When I prototyped the runscript primitive I was just thinking of a usage like
+% the original \directlua primitive in luatex: genererate something and pipe
+% that back to metapost, and have access to some internals. Instead of compiling
+% the code a the metapost end here we delegate that to the lua end. Only strings
+% get passed. Of course in the end the real usage got a bit beyong the intended
+% usage. So, in addition to some definitions here there are and will be use in
+% other metafun modules too. Of course in retrospect I should have done this five
+% years earlier.
+
boolean context_luas ; context_luas := true ;
% First variant:
diff --git a/Master/texmf-dist/metapost/context/base/mp-mlib.mpiv b/Master/texmf-dist/metapost/context/base/mp-mlib.mpiv
index 56815028e8f..b19f47f1e55 100644
--- a/Master/texmf-dist/metapost/context/base/mp-mlib.mpiv
+++ b/Master/texmf-dist/metapost/context/base/mp-mlib.mpiv
@@ -60,32 +60,70 @@ def namedcolor (expr n) =
withprescript "sp_name=" & n
enddef ;
+% def spotcolor(expr n, v) =
+% 1
+% withprescript "sp_type=spot"
+% withprescript "sp_name=" & n
+% withprescript "sp_value=" & (if numeric v : decimal v else : v fi)
+% enddef ;
+%
+% def multitonecolor(expr name, fractions, components, value) =
+% 1
+% withprescript "sp_type=multitone"
+% withprescript "sp_name=" & name
+% withprescript "sp_fractions=" & decimal fractions
+% withprescript "sp_components=" & components
+% withprescript "sp_value=" & value
+% enddef ;
+
def spotcolor(expr n, v) =
1
withprescript "sp_type=spot"
withprescript "sp_name=" & n
- withprescript "sp_value=" & v
+ withprescript "sp_value=" & colordecimals v
enddef ;
-def multitonecolor(expr name, fractions, components, value) =
+def multitonecolor(expr name)(text t) =
1
withprescript "sp_type=multitone"
- withprescript "sp_name=" & name
- withprescript "sp_fractions=" & decimal fractions
- withprescript "sp_components=" & components
- withprescript "sp_value=" & value
+ withprescript "sp_name=" & name
+ withprescript "sp_value=" & colordecimalslist(t)
enddef ;
-def transparent(expr alternative, transparency)(text c) =
+def transparent(expr a, t)(text c) = % use withtransparency instead
1 % this permits withcolor x intoshade y
- withprescript "tr_alternative=" & decimal transparency_alternative_to_number(alternative)
- withprescript "tr_transparency=" & decimal transparency
+ withprescript "tr_alternative=" & decimal transparency_alternative_to_number(a)
+ withprescript "tr_transparency=" & decimal t
withcolor c
enddef ;
-def withtransparency(expr alternative, transparency) =
- withprescript "tr_alternative=" & decimal transparency_alternative_to_number(alternative)
- withprescript "tr_transparency=" & decimal transparency
+% def withtransparency(expr a, t) =
+% withprescript "tr_alternative=" & decimal transparency_alternative_to_number(a)
+% withprescript "tr_transparency=" & decimal t
+% enddef ;
+
+let transparency = pair ;
+
+% def withtransparency expr t =
+% withprescript "tr_alternative=" & decimal transparency_alternative_to_number(xpart t)
+% withprescript "tr_transparency=" & decimal ypart t
+% enddef ;
+%
+% withtransparency (1,.5)
+% withtransparency ("normal",.5)
+
+def withtransparency (expr t) (text rest) =
+ if pair t :
+ withprescript "tr_alternative=" & decimal transparency_alternative_to_number(xpart t)
+ withprescript "tr_transparency=" & decimal ypart t
+ else :
+ mfun_with_transparency (transparency_alternative_to_number(t))
+ fi rest
+enddef ;
+
+def mfun_with_transparency (expr a) expr t =
+ withprescript "tr_alternative=" & decimal a
+ withprescript "tr_transparency=" & decimal t
enddef ;
def cmyk(expr c, m, y, k) = % provided for downward compability
@@ -96,7 +134,8 @@ enddef ;
newinternal textextoffset ; textextoffset := 0 ;
-numeric mfun_tt_w[], mfun_tt_h[], mfun_tt_d[] ; % we can consider using colors (less hash space)
+%%%%%%% mfun_tt_w[], mfun_tt_h[], mfun_tt_d[] ; % we can consider using colors (less hash space)
+color mfun_tt_b ;
numeric mfun_tt_n ; mfun_tt_n := 0 ;
picture mfun_tt_p ; mfun_tt_p := nullpicture ;
picture mfun_tt_o ; mfun_tt_o := nullpicture ;
@@ -135,44 +174,10 @@ extra_beginfig := extra_beginfig & "mfun_reset_tex_texts ;" ;
% 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 mfun_trial_run :
-% mfun_tt_n := mfun_tt_n + 1 ;
-% mfun_tt_o := image(draw origin) ; % save drawoptions
-% addto mfun_tt_p doublepath unitsquare
-% withprescript "tx_number=" & decimal mfun_tt_n
-% withprescript "tx_stage=extra"
-% withpostscript str ;
-% image (
-% addto currentpicture doublepath unitsquare
-% withprescript "tx_number=" & decimal mfun_tt_n
-% withprescript "tx_stage=trial"
-% withprescript "tx_color=" & colordecimals colorpart mfun_tt_o
-% withpostscript str
-% ; )
-% else :
-% mfun_tt_n := mfun_tt_n + 1 ;
-% if known mfun_tt_d[mfun_tt_n] :
-% image (
-% addto currentpicture doublepath unitsquare
-% xscaled mfun_tt_w[mfun_tt_n]
-% yscaled (mfun_tt_h[mfun_tt_n] + mfun_tt_d[mfun_tt_n])
-% withprescript "tx_number=" & decimal mfun_tt_n
-% withprescript "tx_stage=final"
-% % withpostscript str ; % for tracing
-% ; ) shifted (0,-mfun_tt_d[mfun_tt_n])
-% else :
-% image (
-% addto currentpicture doublepath unitsquare
-% ; )
-% fi
-% fi
-% enddef ;
+% see mp-keep.mpiv for older code
-% vardef rawtextext(expr str) = % todo: avoid currentpicture
-% if str = "" :
+% vardef rawtextext(expr s) = % todo: avoid currentpicture
+% if s = "" :
% nullpicture
% else :
% mfun_tt_n := mfun_tt_n + 1 ;
@@ -180,15 +185,12 @@ extra_beginfig := extra_beginfig & "mfun_reset_tex_texts ;" ;
% if mfun_trial_run :
% mfun_tt_o := nullpicture ;
% addto mfun_tt_o doublepath origin _op_ ; % save drawoptions
-% addto mfun_tt_p doublepath unitsquare
-% withprescript "tx_number=" & decimal mfun_tt_n
-% withprescript "tx_stage=extra"
-% withpostscript str ;
% addto mfun_tt_c doublepath unitsquare
% withprescript "tx_number=" & decimal mfun_tt_n
% withprescript "tx_stage=trial"
% withprescript "tx_color=" & colordecimals colorpart mfun_tt_o
-% withpostscript str ;
+% withpostscript s ;
+% addto mfun_tt_p also mfun_tt_c ;
% elseif known mfun_tt_d[mfun_tt_n] :
% addto mfun_tt_c doublepath unitsquare
% xscaled mfun_tt_w[mfun_tt_n]
@@ -203,8 +205,8 @@ extra_beginfig := extra_beginfig & "mfun_reset_tex_texts ;" ;
% fi
% enddef ;
-vardef rawtextext(expr str) = % todo: avoid currentpicture
- if str = "" :
+vardef rawtextext(expr s) = % todo: avoid currentpicture
+ if s = "" :
nullpicture
else :
mfun_tt_n := mfun_tt_n + 1 ;
@@ -216,17 +218,16 @@ vardef rawtextext(expr str) = % todo: avoid currentpicture
withprescript "tx_number=" & decimal mfun_tt_n
withprescript "tx_stage=trial"
withprescript "tx_color=" & colordecimals colorpart mfun_tt_o
- withpostscript str ;
+ withpostscript s ;
addto mfun_tt_p also mfun_tt_c ;
- elseif known mfun_tt_d[mfun_tt_n] :
+ else :
+ mfun_tt_b := lua.mp.tt_dimensions(mfun_tt_n) ;
addto mfun_tt_c doublepath unitsquare
- xscaled mfun_tt_w[mfun_tt_n]
- yscaled (mfun_tt_h[mfun_tt_n] + mfun_tt_d[mfun_tt_n])
- shifted (0,-mfun_tt_d[mfun_tt_n])
+ xscaled redpart mfun_tt_b
+ yscaled (greenpart mfun_tt_b + bluepart mfun_tt_b)
+ shifted (0,- bluepart mfun_tt_b)
withprescript "tx_number=" & decimal mfun_tt_n
withprescript "tx_stage=final" ;
- else :
- addto mfun_tt_c doublepath unitsquare ; % unitpicture
fi ;
mfun_tt_c
fi
@@ -234,7 +235,10 @@ enddef ;
% More text
-defaultfont := "Mono" ; % was cmr10, could be lmmono10-regular, but is fed into context anyway
+defaultfont := "Mono" ;
+defaultscale := 1 ;
+
+extra_beginfig := extra_beginfig & "defaultscale:=1;" ;
vardef fontsize expr name =
save size ; numeric size ;
@@ -403,19 +407,171 @@ enddef ;
let normalinfont = infont ;
-primarydef str infont name = % nasty hack
+primarydef s infont name = % nasty hack
if name = "" :
- textext(str)
+ textext(s)
else :
- textext("\definedfont[" & name & "]" & str)
+ textext("\definedfont[" & name & "]" & s)
fi
enddef ;
+% Helper
+
+string mfun_prescript_separator ; mfun_prescript_separator := char(13) ;
+
% Shades
-newinternal shadefactor ; shadefactor := 1 ;
-pair shadeoffset ; shadeoffset := origin ;
-boolean trace_shades ; trace_shades := false ;
+% for while we had this:
+
+newinternal shadefactor ; shadefactor := 1 ; % currently obsolete
+pair shadeoffset ; shadeoffset := origin ; % currently obsolete
+boolean trace_shades ; trace_shades := false ; % still there
+
+% 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 withshading (expr how)(text rest) =
+% if how = "linear" :
+% withlinearshading(rest)
+% elseif how = "circular" :
+% withcircularshading(rest)
+% else :
+% % nothing
+% fi
+% 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 ;
+
+% but this is nicer
+
+path mfun_shade_path ;
+
+primarydef p withshademethod m =
+ hide(mfun_shade_path := p ;)
+ p
+ withprescript "sh_domain=0 1"
+ withprescript "sh_color=into"
+ withprescript "sh_color_a=" & colordecimals white
+ withprescript "sh_color_b=" & colordecimals black
+ if m = "linear" :
+ withprescript "sh_type=linear"
+ withprescript "sh_factor=1"
+ withprescript "sh_center_a=" & ddecimal llcorner p
+ withprescript "sh_center_b=" & ddecimal urcorner p
+ else :
+ withprescript "sh_type=circular"
+ withprescript "sh_factor=1.2"
+ withprescript "sh_center_a=" & ddecimal center p
+ withprescript "sh_center_b=" & ddecimal center p
+ withprescript "sh_radius_a=" & decimal 0
+ withprescript "sh_radius_b=" & decimal ( max (
+ (xpart center p - xpart llcorner p) ++ (ypart center p - ypart llcorner p),
+ (xpart center p - xpart ulcorner p) ++ (ypart ulcorner p - ypart center p),
+ (xpart lrcorner p - xpart center p) ++ (ypart center p - ypart lrcorner p),
+ (xpart urcorner p - xpart center p) ++ (ypart urcorner p - ypart center p)
+ ) )
+ fi
+enddef ;
+
+def withshadevector expr a =
+ withprescript "sh_center_a=" & ddecimal (point xpart a of mfun_shade_path)
+ withprescript "sh_center_b=" & ddecimal (point ypart a of mfun_shade_path)
+enddef ;
+
+def withshadecenter expr a =
+ withprescript "sh_center_a=" & ddecimal (
+ center mfun_shade_path shifted (
+ xpart a * bbwidth (mfun_shade_path)/2,
+ ypart a * bbheight(mfun_shade_path)/2
+ )
+ )
+enddef ;
+
+def withshadedomain expr d =
+ withprescript "sh_domain=" & ddecimal d
+enddef ;
+
+def withshadefactor expr f =
+ withprescript "sh_factor=" & decimal f
+enddef ;
+
+def withshadecolors (expr a, b) =
+ withprescript "sh_color=into"
+ withprescript "sh_color_a=" & colordecimals a
+ withprescript "sh_color_b=" & colordecimals b
+enddef ;
+
+primarydef a shadedinto b = % withcolor red shadedinto green
+ 1 % does not work with transparency
+ withprescript "sh_color=into"
+ withprescript "sh_color_a=" & colordecimals a
+ withprescript "sh_color_b=" & colordecimals b
+enddef ;
+
+primarydef p withshade sc =
+ p withprescript mfun_defined_cs_pre[sc]
+enddef ;
+
+def defineshade suffix s =
+ mfun_defineshade(str s)
+enddef ;
+
+def mfun_defineshade (expr s) text t =
+ expandafter def scantokens s = t enddef ;
+enddef ;
+
+def shaded text s =
+ s
+enddef ;
+
+% Old macros:
+
+def withcircularshade (expr a, b, ra, rb, ca, cb) =
+ withprescript "sh_type=circular"
+ withprescript "sh_domain=0 1"
+ withprescript "sh_factor=1"
+ withprescript "sh_color_a=" & colordecimals ca
+ withprescript "sh_color_b=" & colordecimals cb
+ withprescript "sh_center_a=" & ddecimal a % (a shifted shadeoffset)
+ withprescript "sh_center_b=" & ddecimal b % (b shifted shadeoffset)
+ withprescript "sh_radius_a=" & decimal ra
+ withprescript "sh_radius_b=" & decimal rb
+enddef ;
+
+def withlinearshade (expr a, b, ca, cb) =
+ withprescript "sh_type=linear"
+ withprescript "sh_domain=0 1"
+ withprescript "sh_factor=1"
+ withprescript "sh_color_a=" & colordecimals ca
+ withprescript "sh_color_b=" & colordecimals cb
+ withprescript "sh_center_a=" & ddecimal a % (a shifted shadeoffset)
+ withprescript "sh_center_b=" & ddecimal b % (b shifted shadeoffset)
+enddef ;
+
+% replaced (obsolete):
def set_linear_vector (suffix a,b)(expr p,n) =
if (n=1) : a := llcorner p ; b := urcorner p ;
@@ -430,7 +586,7 @@ def set_linear_vector (suffix a,b)(expr p,n) =
fi ;
enddef ;
-def set_circular_vector (suffix ab, r)(expr p,n) =
+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 ;
@@ -453,7 +609,7 @@ enddef ;
def linear_shade (expr p, n, ca, cb) =
begingroup ;
- save a, b, sh ; pair a, b ;
+ save a, b ; pair a, b ;
set_linear_vector(a,b)(p,n) ;
fill p withlinearshade(a,b,ca,cb) ;
if trace_shades :
@@ -462,43 +618,19 @@ def linear_shade (expr p, n, ca, cb) =
endgroup ;
enddef ;
-def withcircularshade (expr a, b, ra, rb, ca, cb) =
- 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 "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 mfun_defined_cs_pre[] ; numeric mfun_defined_cs ; mfun_defined_cs := 0 ;
-string mfun_prescript_separator ; mfun_prescript_separator := char(13) ;
-
vardef define_circular_shade (expr a, b, ra, rb, ca, cb) =
mfun_defined_cs := mfun_defined_cs + 1 ;
mfun_defined_cs_pre[mfun_defined_cs] := "sh_type=circular"
- & mfun_prescript_separator & "sh_domain=0 1"
- & mfun_prescript_separator & "sh_factor=" & decimal shadefactor
- & mfun_prescript_separator & "sh_color_a=" & colordecimals ca
- & mfun_prescript_separator & "sh_color_b=" & colordecimals cb
- & mfun_prescript_separator & "sh_center_a=" & ddecimal (a shifted shadeoffset)
- & mfun_prescript_separator & "sh_center_b=" & ddecimal (b shifted shadeoffset)
- & mfun_prescript_separator & "sh_radius_a=" & decimal ra
- & mfun_prescript_separator & "sh_radius_b=" & decimal rb
+ & mfun_prescript_separator & "sh_domain=0 1"
+ & mfun_prescript_separator & "sh_factor=1"
+ & mfun_prescript_separator & "sh_color_a=" & colordecimals ca
+ & mfun_prescript_separator & "sh_color_b=" & colordecimals cb
+ & mfun_prescript_separator & "sh_center_a=" & ddecimal a % (a shifted shadeoffset)
+ & mfun_prescript_separator & "sh_center_b=" & ddecimal b % (b shifted shadeoffset)
+ & mfun_prescript_separator & "sh_radius_a=" & decimal ra
+ & mfun_prescript_separator & "sh_radius_b=" & decimal rb
;
mfun_defined_cs
enddef ;
@@ -506,52 +638,49 @@ enddef ;
vardef define_linear_shade (expr a, b, ca, cb) =
mfun_defined_cs := mfun_defined_cs + 1 ;
mfun_defined_cs_pre[mfun_defined_cs] := "sh_type=linear"
- & mfun_prescript_separator & "sh_domain=0 1"
- & mfun_prescript_separator & "sh_factor=" & decimal shadefactor
- & mfun_prescript_separator & "sh_color_a=" & colordecimals ca
- & mfun_prescript_separator & "sh_color_b=" & colordecimals cb
- & mfun_prescript_separator & "sh_center_a=" & ddecimal (a shifted shadeoffset)
- & mfun_prescript_separator & "sh_center_b=" & ddecimal (b shifted shadeoffset)
+ & mfun_prescript_separator & "sh_domain=0 1"
+ & mfun_prescript_separator & "sh_factor=1"
+ & mfun_prescript_separator & "sh_color_a=" & colordecimals ca
+ & mfun_prescript_separator & "sh_color_b=" & colordecimals cb
+ & mfun_prescript_separator & "sh_center_a=" & ddecimal a % (a shifted shadeoffset)
+ & mfun_prescript_separator & "sh_center_b=" & ddecimal b % (b shifted shadeoffset)
;
mfun_defined_cs
enddef ;
-primarydef p withshade sc =
- p withprescript mfun_defined_cs_pre[sc]
-enddef ;
-
-
-vardef define_sampled_linear_shade(expr a,b,n)(text t) =
- mfun_defined_cs := mfun_defined_cs + 1 ;
- mfun_defined_cs_pre[mfun_defined_cs] := "ssh_type=linear"
- & mfun_prescript_separator & "ssh_center_a=" & ddecimal (a shifted shadeoffset)
- & mfun_prescript_separator & "ssh_center_b=" & ddecimal (b shifted shadeoffset)
- & mfun_prescript_separator & "ssh_nofcolors=" & decimal n
- & mfun_prescript_separator & "ssh_domain=" & domstr
- & mfun_prescript_separator & "ssh_extend=" & extstr
- & mfun_prescript_separator & "ssh_colors=" & colstr
- & mfun_prescript_separator & "ssh_bounds=" & bndstr
- & mfun_prescript_separator & "ssh_ranges=" & ranstr
- ;
- mfun_defined_cs
-enddef ;
-
-vardef define_sampled_circular_shade(expr a,b,ra,rb,n)(text t) =
- mfun_defined_cs := mfun_defined_cs + 1 ;
- mfun_defined_cs_pre[mfun_defined_cs] := "ssh_type=circular"
- & mfun_prescript_separator & "ssh_center_a=" & ddecimal (a shifted shadeoffset)
- & mfun_prescript_separator & "ssh_radius_a=" & decimal ra
- & mfun_prescript_separator & "ssh_center_b=" & ddecimal (b shifted shadeoffset)
- & mfun_prescript_separator & "ssh_radius_b=" & decimal rb
- & mfun_prescript_separator & "ssh_nofcolors=" & decimal n
- & mfun_prescript_separator & "ssh_domain=" & domstr
- & mfun_prescript_separator & "ssh_extend=" & extstr
- & mfun_prescript_separator & "ssh_colors=" & colstr
- & mfun_prescript_separator & "ssh_bounds=" & bndstr
- & mfun_prescript_separator & "ssh_ranges=" & ranstr
- ;
- mfun_defined_cs
-enddef ;
+% I lost the example code that uses this:
+%
+% vardef define_sampled_linear_shade(expr a,b,n)(text t) =
+% mfun_defined_cs := mfun_defined_cs + 1 ;
+% mfun_defined_cs_pre[mfun_defined_cs] := "ssh_type=linear"
+% & mfun_prescript_separator & "ssh_center_a=" & ddecimal (a shifted shadeoffset)
+% & mfun_prescript_separator & "ssh_center_b=" & ddecimal (b shifted shadeoffset)
+% & mfun_prescript_separator & "ssh_nofcolors=" & decimal n
+% & mfun_prescript_separator & "ssh_domain=" & domstr
+% & mfun_prescript_separator & "ssh_extend=" & extstr
+% & mfun_prescript_separator & "ssh_colors=" & colstr
+% & mfun_prescript_separator & "ssh_bounds=" & bndstr
+% & mfun_prescript_separator & "ssh_ranges=" & ranstr
+% ;
+% mfun_defined_cs
+% enddef ;
+%
+% vardef define_sampled_circular_shade(expr a,b,ra,rb,n)(text t) =
+% mfun_defined_cs := mfun_defined_cs + 1 ;
+% mfun_defined_cs_pre[mfun_defined_cs] := "ssh_type=circular"
+% & mfun_prescript_separator & "ssh_center_a=" & ddecimal (a shifted shadeoffset)
+% & mfun_prescript_separator & "ssh_radius_a=" & decimal ra
+% & mfun_prescript_separator & "ssh_center_b=" & ddecimal (b shifted shadeoffset)
+% & mfun_prescript_separator & "ssh_radius_b=" & decimal rb
+% & mfun_prescript_separator & "ssh_nofcolors=" & decimal n
+% & mfun_prescript_separator & "ssh_domain=" & domstr
+% & mfun_prescript_separator & "ssh_extend=" & extstr
+% & mfun_prescript_separator & "ssh_colors=" & colstr
+% & mfun_prescript_separator & "ssh_bounds=" & bndstr
+% & mfun_prescript_separator & "ssh_ranges=" & ranstr
+% ;
+% mfun_defined_cs
+% enddef ;
% vardef predefined_linear_shade (expr p, n, ca, cb) =
% save a, b, sh ; pair a, b ;
@@ -566,53 +695,6 @@ enddef ;
% 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 ;
-
-primarydef a shadedinto b =
- 1 % does not work with transparency
- withprescript "sh_color=into"
- withprescript "sh_color_a=" & colordecimals a
- withprescript "sh_color_b=" & colordecimals b
-enddef ;
-
% Layers
def onlayer primary name =
@@ -657,10 +739,10 @@ enddef ;
% Positions
-def register (expr label, width, height, offset) =
+def register (expr tag, width, height, offset) =
% draw image (
addto currentpicture doublepath unitsquare xscaled width yscaled height shifted offset
- withprescript "ps_label=" & label ;
+ withprescript "ps_label=" & tag ;
% ) ; % no transformations
enddef ;
@@ -672,8 +754,8 @@ extra_endfig := extra_endfig & "mfun_reset_tex_texts ; " ;
% Bonus
-vardef verbatim(expr str) =
- ditto & "\detokenize{" & str & "}" & ditto
+vardef verbatim(expr s) =
+ ditto & "\detokenize{" & s & "}" & ditto
enddef ;
% New
@@ -749,7 +831,7 @@ primarydef t asgroup s = % s = isolated|knockout
endgroup
enddef ;
-% Also experimental
+% Also experimental ... needs to be made better ... so it can change!
string mfun_auto_align[] ;
@@ -826,6 +908,10 @@ vardef mfun_cmykcolor_to_string(expr c) =
decimal blackpart c
enddef ;
+vardef mfun_greycolor_to_string(expr n) =
+ decimal n
+enddef ;
+
vardef mfun_path_to_string(expr p) =
mfun_point_to_string(p,0) for i=1 upto length(p) : & " " & mfun_point_to_string(p,i) endfor
enddef ;
@@ -852,6 +938,7 @@ vardef tostring(expr value) =
elseif pair value : mfun_pair_to_string(value)
elseif rgbcolor value : mfun_rgbcolor_to_string(value)
elseif cmykcolor value : mfun_cmykcolor_to_string(value)
+ elseif greycolor value : mfun_greycolor_to_string(value)
elseif boolean value : mfun_boolean_to_string(value)
elseif path value : mfun_path_to_string(value)
elseif transform value : mfun_transform_to_string(value)
@@ -1047,23 +1134,80 @@ enddef ;
% moved here from mp-grap.mpiv
+% vardef escaped_format(expr s) =
+% "" for n=0 upto length(s) : &
+% if ASCII substring (n,n+1) of s = 37 :
+% "@"
+% else :
+% substring (n,n+1) of s
+% fi
+% endfor
+% enddef ;
+
+numeric mfun_esc_b ; % begin
+numeric mfun_esc_l ; % length
+string mfun_esc_s ; % character
+
+mfun_esc_s := "%" ; % or: char(37)
+
+% this one is the fastest when we have a match
+
+% vardef escaped_format(expr s) =
+% "" for n=0 upto length(s)-1 : &
+% % if ASCII substring (n,n+1) of s = 37 :
+% if substring (n,n+1) of s = mfun_esc_s :
+% "@"
+% else :
+% substring (n,n+1) of s
+% fi
+% endfor
+% enddef ;
+
+% this one wins when we have no match
+
vardef escaped_format(expr s) =
- "" for n=0 upto length(s) : &
- if ASCII substring (n,n+1) of s = 37 :
- "@"
- else :
- substring (n,n+1) of s
+ mfun_esc_b := 0 ;
+ mfun_esc_l := length(s) ;
+ for n=0 upto mfun_esc_l-1 :
+ % if ASCII substring (n,n+1) of s = 37 :
+ if substring (n,n+1) of s = mfun_esc_s :
+ if mfun_esc_b = 0 :
+ ""
+ fi
+ if n >= mfun_esc_b :
+ & (substring (mfun_esc_b,n) of s)
+ exitif numeric begingroup mfun_esc_b := n+1 endgroup ; % hide
+ fi
+ & "@"
fi
endfor
+ if mfun_esc_b = 0 :
+ s
+ % elseif mfun_esc_b > 0 :
+ elseif mfun_esc_b < mfun_esc_l :
+ & (substring (mfun_esc_b,mfun_esc_l) of s)
+ fi
enddef ;
-vardef strfmt(expr f, x) = % maybe use mfun_ namespace
- "\MPgraphformat{" & escaped_format(f) & "}{" & mfun_tagged_string(x) & "}"
-enddef ;
-
-vardef varfmt(expr f, x) = % maybe use mfun_ namespace
- "\MPformatted{" & escaped_format(f) & "}{" & mfun_tagged_string(x) & "}"
-enddef ;
+vardef strfmt(expr f, x) = "\MPgraphformat{" & escaped_format(f) & "}{" & mfun_tagged_string(x) & "}" enddef ;
+vardef varfmt(expr f, x) = "\MPformatted{" & escaped_format(f) & "}{" & mfun_tagged_string(x) & "}" enddef ;
vardef format (expr f, x) = textext(strfmt(f, x)) enddef ;
vardef formatted(expr f, x) = textext(varfmt(f, x)) enddef ;
+
+% could be this (something to discuss with alan as it involves graph):
+%
+% vardef format (expr f,x) = lua.mp.graphformat(f,mfun_tagged_string(x) enddef ;
+% vardef formatted(expr f,x) = lua.mp.format (f, x) enddef ;
+%
+% def strfmt = format enddef ; % old
+% def varfmt = formatted enddef ; % old
+
+% new
+
+def eofill text t = fill t withpostscript "evenodd" enddef ;
+%%% eoclip text t = clip t withpostscript "evenodd" enddef ; % no postscripts yet
+
+% def withrule expr r =
+% if (t = "even-odd") or (t = "evenodd") : withpostscript "evenodd" fi
+% enddef ;
diff --git a/Master/texmf-dist/metapost/context/base/mp-page.mpiv b/Master/texmf-dist/metapost/context/base/mp-page.mpiv
index 9c538d42a65..7a6e576bd98 100644
--- a/Master/texmf-dist/metapost/context/base/mp-page.mpiv
+++ b/Master/texmf-dist/metapost/context/base/mp-page.mpiv
@@ -11,73 +11,300 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-%D This module is rather preliminary and subjected to
-%D changes.
+%D This module is rather preliminary and subjected to changes.
if known context_page : endinput ; fi ;
boolean context_page ; context_page := true ;
+% def LoadPageState =
+% % now always set
+% enddef ;
+%
+% if unknown PageStateAvailable :
+% boolean PageStateAvailable ;
+% PageStateAvailable := false ;
+% fi ;
+%
+% if unknown OnRightPage :
+% boolean OnRightPage ;
+% OnRightPage := true ;
+% fi ;
+%
+% if unknown OnOddPage :
+% boolean OnOddPage ;
+% OnOddPage := true ;
+% fi ;
+%
+% if unknown InPageBody :
+% boolean InPageBody ;
+% InPageBody := false ;
+% fi ;
+%
+% string CurrentLayout ;
+%
+% CurrentLayout := "default" ;
+%
+% PageNumber := 0 ;
+% PaperHeight := 845.04684pt ;
+% PaperWidth := 597.50787pt ;
+% PrintPaperHeight := 845.04684pt ;
+% PrintPaperWidth := 597.50787pt ;
+% TopSpace := 71.12546pt ;
+% BottomSpace := 0.0pt ;
+% BackSpace := 71.13275pt ;
+% CutSpace := 0.0pt ;
+% MakeupHeight := 711.3191pt ;
+% MakeupWidth := 426.78743pt ;
+% TopHeight := 0.0pt ;
+% TopDistance := 0.0pt ;
+% HeaderHeight := 56.90294pt ;
+% HeaderDistance := 0.0pt ;
+% TextHeight := 597.51323pt ;
+% FooterDistance := 0.0pt ;
+% FooterHeight := 56.90294pt ;
+% BottomDistance := 0.0pt ;
+% BottomHeight := 0.0pt ;
+% LeftEdgeWidth := 0.0pt ;
+% LeftEdgeDistance := 0.0pt ;
+% LeftMarginWidth := 75.58197pt ;
+% LeftMarginDistance := 11.99829pt ;
+% TextWidth := 426.78743pt ;
+% RightMarginDistance := 11.99829pt ;
+% RightMarginWidth := 75.58197pt ;
+% RightEdgeDistance := 0.0pt ;
+% RightEdgeWidth := 0.0pt ;
+%
+% PageOffset := 0.0pt ;
+% PageDepth := 0.0pt ;
+%
+% LayoutColumns := 0 ;
+% LayoutColumnDistance:= 0.0pt ;
+% LayoutColumnWidth := 0.0pt ;
+%
+% LeftEdge := -4 ; Top := -40 ;
+% LeftEdgeSeparator := -3 ; TopSeparator := -30 ;
+% LeftMargin := -2 ; Header := -20 ;
+% LeftMarginSeparator := -1 ; HeaderSeparator := -10 ;
+% Text := 0 ; Text := 0 ;
+% RightMarginSeparator := +1 ; FooterSeparator := +10 ;
+% RightMargin := +2 ; Footer := +20 ;
+% RightEdgeSeparator := +3 ; BottomSeparator := +30 ;
+% RightEdge := +4 ; Bottom := +40 ;
+%
+% Margin := LeftMargin ; % obsolete
+% Edge := LeftEdge ; % obsolete
+% InnerMargin := RightMargin ; % obsolete
+% InnerEdge := RightEdge ; % obsolete
+% OuterMargin := LeftMargin ; % obsolete
+% OuterEdge := LeftEdge ; % obsolete
+%
+% InnerMarginWidth := 0pt ;
+% OuterMarginWidth := 0pt ;
+% InnerMarginDistance := 0pt ;
+% OuterMarginDistance := 0pt ;
+%
+% InnerEdgeWidth := 0pt ;
+% OuterEdgeWidth := 0pt ;
+% InnerEdgeDistance := 0pt ;
+% OuterEdgeDistance := 0pt ;
+%
+% % path Area[][] ;
+% % pair Location[][] ;
+% % path Field[][] ;
+%
+% % numeric Hstep[] ;
+% % numeric Hsize[] ;
+% % numeric Vstep[] ;
+% % numeric Vsize[] ;
+%
+% path Page ;
+%
+% numeric HorPos ;
+% numeric VerPos ;
+%
+% % for VerPos=Top step 10 until Bottom:
+% % for HorPos=LeftEdge step 1 until RightEdge:
+% % Area[HorPos][VerPos] := origin--cycle ;
+% % Area[VerPos][HorPos] := Area[HorPos][VerPos] ;
+% % Location[HorPos][VerPos] := origin ;
+% % Location[VerPos][HorPos] := Location[HorPos][VerPos] ;
+% % Field[HorPos][VerPos] := origin--cycle ;
+% % Field[VerPos][HorPos] := Field[HorPos][VerPos] ;
+% % endfor ;
+% % endfor ;
+%
+% % def LoadPageState =
+% % scantokens "input mp-state.tmp" ;
+% % enddef ;
+%
+% numeric mfun_temp ;
+%
+% def SwapPageState =
+% if not OnRightPage :
+% BackSpace := PaperWidth-MakeupWidth-BackSpace ;
+% CutSpace := PaperWidth-MakeupWidth-CutSpace ;
+% mfun_temp := LeftMarginWidth ;
+% LeftMarginWidth := RightMarginWidth ;
+% RightMarginWidth := mfun_temp ;
+% mfun_temp := LeftMarginDistance ;
+% LeftMarginDistance := RightMarginDistance ;
+% RightMarginDistance := mfun_temp ;
+% mfun_temp := LeftEdgeWidth ;
+% LeftEdgeWidth := RightEdgeWidth ;
+% RightEdgeWidth := mfun_temp ;
+% mfun_temp := LeftEdgeDistance ;
+% LeftEdgeDistance := RightEdgeDistance ;
+% RightEdgeDistance := mfun_temp ;
+%
+% % these are now available as ..Width and ..Distance
+%
+% Margin := LeftMargin ;
+% Edge := LeftEdge ;
+% InnerMargin := RightMargin ;
+% InnerEdge := RightEdge ;
+% OuterMargin := LeftMargin ;
+% OuterEdge := LeftEdge ;
+% else :
+% Margin := RightMargin ;
+% Edge := RightEdge ;
+% InnerMargin := LeftMargin ;
+% InnerEdge := LeftEdge ;
+% OuterMargin := RightMargin ;
+% OuterEdge := RightEdge ;
+% fi ;
+% enddef ;
+
+% the new way:
+
+def LoadPageState =
+ % now always set
+enddef ;
+
if unknown PageStateAvailable :
boolean PageStateAvailable ;
PageStateAvailable := false ;
fi ;
-if unknown OnRightPage :
- boolean OnRightPage ;
- OnRightPage := true ;
-fi ;
+string CurrentLayout ; CurrentLayout := "default" ;
+
+vardef PaperHeight = lua.mp.PaperHeight () enddef ;
+vardef PaperWidth = lua.mp.PaperWidth () enddef ;
+vardef PrintPaperHeight = lua.mp.PrintPaperHeight () enddef ;
+vardef PrintPaperWidth = lua.mp.PrintPaperWidth () enddef ;
+vardef TopSpace = lua.mp.TopSpace () enddef ;
+vardef BottomSpace = lua.mp.BottomSpace () enddef ;
+vardef BackSpace = lua.mp.BackSpace () enddef ;
+vardef CutSpace = lua.mp.CutSpace () enddef ;
+vardef MakeupHeight = lua.mp.MakeupHeight () enddef ;
+vardef MakeupWidth = lua.mp.MakeupWidth () enddef ;
+vardef TopHeight = lua.mp.TopHeight () enddef ;
+vardef TopDistance = lua.mp.TopDistance () enddef ;
+vardef HeaderHeight = lua.mp.HeaderHeight () enddef ;
+vardef HeaderDistance = lua.mp.HeaderDistance () enddef ;
+vardef TextHeight = lua.mp.TextHeight () enddef ;
+vardef FooterDistance = lua.mp.FooterDistance () enddef ;
+vardef FooterHeight = lua.mp.FooterHeight () enddef ;
+vardef BottomDistance = lua.mp.BottomDistance () enddef ;
+vardef BottomHeight = lua.mp.BottomHeight () enddef ;
+vardef LeftEdgeWidth = lua.mp.LeftEdgeWidth () enddef ;
+vardef LeftEdgeDistance = lua.mp.LeftEdgeDistance () enddef ;
+vardef LeftMarginWidth = lua.mp.LeftMarginWidth () enddef ;
+vardef LeftMarginDistance = lua.mp.LeftMarginDistance () enddef ;
+vardef TextWidth = lua.mp.TextWidth () enddef ;
+vardef RightMarginDistance = lua.mp.RightMarginDistance () enddef ;
+vardef RightMarginWidth = lua.mp.RightMarginWidth () enddef ;
+vardef RightEdgeDistance = lua.mp.RightEdgeDistance () enddef ;
+vardef RightEdgeWidth = lua.mp.RightEdgeWidth () enddef ;
+vardef InnerMarginDistance = lua.mp.InnerMarginDistance () enddef ;
+vardef InnerMarginWidth = lua.mp.InnerMarginWidth () enddef ;
+vardef OuterMarginDistance = lua.mp.OuterMarginDistance () enddef ;
+vardef OuterMarginWidth = lua.mp.OuterMarginWidth () enddef ;
+vardef InnerEdgeDistance = lua.mp.InnerEdgeDistance () enddef ;
+vardef InnerEdgeWidth = lua.mp.InnerEdgeWidth () enddef ;
+vardef OuterEdgeDistance = lua.mp.OuterEdgeDistance () enddef ;
+vardef OuterEdgeWidth = lua.mp.OuterEdgeWidth () enddef ;
+vardef PageOffset = lua.mp.PageOffset () enddef ;
+vardef PageDepth = lua.mp.PageDepth () enddef ;
+vardef LayoutColumns = lua.mp.LayoutColumns () enddef ;
+vardef LayoutColumnDistance = lua.mp.LayoutColumnDistance() enddef ;
+vardef LayoutColumnWidth = lua.mp.LayoutColumnWidth () enddef ;
+
+vardef OnRightPage = lua.mp.OnRightPage () enddef ;
+vardef OnOddPage = lua.mp.OnOddPage () enddef ;
+vardef InPageBody = lua.mp.InPageBody () enddef ;
+
+vardef RealPageNumber = lua.mp.RealPageNumber () enddef ;
+vardef PageNumber = lua.mp.PageNumber () enddef ;
+vardef NOfPages = lua.mp.NOfPages () enddef ;
+vardef LastPageNumber = lua.mp.LastPageNumber () enddef ; % duplicates
+
+vardef CurrentColumn = lua.mp.CurrentColumn () enddef ;
+vardef NOfColumns = lua.mp.NOfColumns () enddef ;
+
+vardef BaseLineSkip = lua.mp.BaseLineSkip () enddef ;
+vardef LineHeight = lua.mp.LineHeight () enddef ;
+vardef BodyFontSize = lua.mp.BodyFontSize () enddef ;
+
+vardef TopSkip = lua.mp.TopSkip () enddef ;
+vardef StrutHeight = lua.mp.StrutHeight () enddef ;
+vardef StrutDepth = lua.mp.StrutDepth () enddef ;
+
+vardef CurrentWidth = lua.mp.CurrentWidth () enddef ;
+vardef CurrentHeight = lua.mp.CurrentHeight () enddef ;
+
+vardef HSize = lua.mp.HSize () enddef ; % duplicates
+vardef VSize = lua.mp.VSize () enddef ; % duplicates
+
+vardef EmWidth = lua.mp.EmWidth () enddef ;
+vardef ExHeight = lua.mp.ExHeight () enddef ;
+
+vardef PageFraction = lua.mp.PageFraction () enddef ;
+
+vardef SpineWidth = lua.mp.SpineWidth () enddef ;
+vardef PaperBleed = lua.mp.PaperBleed () enddef ;
+
+boolean mfun_swapped ;
-if unknown OnOddPage :
- boolean OnOddPage ;
- OnOddPage := true ;
-fi ;
+def SwapPageState =
+ mfun_swapped := true ;
+enddef ;
-if unknown InPageBody :
- boolean InPageBody ;
- InPageBody := false ;
-fi ;
+extra_beginfig := extra_beginfig & "mfun_swapped := false ;" ;
+
+vardef BackSpace = if (mfun_swapped and not OnRightPage) : PaperWidth - MakeupWidth - fi lua.mp.BackSpace() enddef ;
+vardef CutSpace = if (mfun_swapped and not OnRightPage) : PaperWidth - MakeupWidth - fi lua.mp.CutSpace () enddef ;
+
+vardef LeftMarginWidth = if mfun_swapped and not OnRightPage : lua.mp.RightMarginWidth () else : lua.mp.LeftMarginWidth () fi enddef ;
+vardef RightMarginWidth = if mfun_swapped and not OnRightPage : lua.mp.LeftMarginWidth () else : lua.mp.RightMarginWidth () fi enddef ;
+vardef LeftMarginDistance = if mfun_swapped and not OnRightPage : lua.mp.RightMarginDistance() else : lua.mp.LeftMarginDistance () fi enddef ;
+vardef RightMarginDistance = if mfun_swapped and not OnRightPage : lua.mp.LeftMarginDistance () else : lua.mp.RightMarginDistance() fi enddef ;
+vardef LeftEdgeWidth = if mfun_swapped and not OnRightPage : lua.mp.RightEdgeWidth () else : lua.mp.LeftEdgeWidth () fi enddef ;
+vardef RightEdgeWidth = if mfun_swapped and not OnRightPage : lua.mp.LeftEdgeWidth () else : lua.mp.RightEdgeWidth () fi enddef ;
+vardef LeftEdgeDistance = if mfun_swapped and not OnRightPage : lua.mp.RightEdgeDistance () else : lua.mp.LeftEdgeDistance () fi enddef ;
+vardef RightEdgeDistance = if mfun_swapped and not OnRightPage : lua.mp.LeftEdgeDistance () else : lua.mp.RightEdgeDistance () fi enddef ;
+
+% vardef Margin = if OnRightPage : lua.mp.RightMarginWidth else : lua.mp.LeftMarginWidth fi enddef ;
+% vardef Edge = if OnRightPage : lua.mp.RightEdgeWidth else : lua.mp.LeftEdgeWidth fi enddef ;
+% vardef InnerMargin = if OnRightPage : lua.mp.LeftMarginWidth else : lua.mp.RightMarginWidth fi enddef ;
+% vardef InnerEdge = if OnRightPage : lua.mp.LeftEdgeWidth else : lua.mp.RightEdgeWidth fi enddef ;
+% vardef OuterMargin = if OnRightPage : lua.mp.RightMarginWidth else : lua.mp.LeftMarginWidth fi enddef ;
+% vardef OuterEdge = if OnRightPage : lua.mp.RightEdgeWidth else : lua.mp.LeftEdgeWidth fi enddef ;
+
+% vardef CurrentLayout = lua.mp.CurrentLayout () enddef ;
-string CurrentLayout ;
-
-CurrentLayout := "default" ;
-
-PageNumber := 0 ;
-PaperHeight := 845.04684pt ;
-PaperWidth := 597.50787pt ;
-PrintPaperHeight := 845.04684pt ;
-PrintPaperWidth := 597.50787pt ;
-TopSpace := 71.12546pt ;
-BottomSpace := 0.0pt ;
-BackSpace := 71.13275pt ;
-CutSpace := 0.0pt ;
-MakeupHeight := 711.3191pt ;
-MakeupWidth := 426.78743pt ;
-TopHeight := 0.0pt ;
-TopDistance := 0.0pt ;
-HeaderHeight := 56.90294pt ;
-HeaderDistance := 0.0pt ;
-TextHeight := 597.51323pt ;
-FooterDistance := 0.0pt ;
-FooterHeight := 56.90294pt ;
-BottomDistance := 0.0pt ;
-BottomHeight := 0.0pt ;
-LeftEdgeWidth := 0.0pt ;
-LeftEdgeDistance := 0.0pt ;
-LeftMarginWidth := 75.58197pt ;
-LeftMarginDistance := 11.99829pt ;
-TextWidth := 426.78743pt ;
-RightMarginDistance := 11.99829pt ;
-RightMarginWidth := 75.58197pt ;
-RightEdgeDistance := 0.0pt ;
-RightEdgeWidth := 0.0pt ;
-
-PageOffset := 0.0pt ;
-PageDepth := 0.0pt ;
-
-LayoutColumns := 0 ;
-LayoutColumnDistance:= 0.0pt ;
-LayoutColumnWidth := 0.0pt ;
+vardef OverlayWidth = lua.mp.OverlayWidth () enddef ;
+vardef OverlayHeight = lua.mp.OverlayHeight () enddef ;
+vardef OverlayDepth = lua.mp.OverlayDepth () enddef ;
+vardef OverlayLineWidth = lua.mp.OverlayLineWidth() enddef ;
+vardef OverlayOffset = lua.mp.OverlayOffset () enddef ;
+
+vardef defaultcolormodel = lua.mp.defaultcolormodel() enddef ;
+
+% def OverlayLineColor = lua.mp.OverlayLineColor() enddef ;
+% def OverlayColor = lua.mp.OverlayColor () enddef ;
+
+% Next we implement the the page area model. First some constants.
LeftEdge := -4 ; Top := -40 ;
LeftEdgeSeparator := -3 ; TopSeparator := -30 ;
@@ -89,37 +316,28 @@ RightMargin := +2 ; Footer := +20 ;
RightEdgeSeparator := +3 ; BottomSeparator := +30 ;
RightEdge := +4 ; Bottom := +40 ;
-Margin := LeftMargin ; % obsolete
-Edge := LeftEdge ; % obsolete
-InnerMargin := RightMargin ; % obsolete
-InnerEdge := RightEdge ; % obsolete
-OuterMargin := LeftMargin ; % obsolete
-OuterEdge := LeftEdge ; % obsolete
+% Margin := LeftMargin ; % obsolete
+% Edge := LeftEdge ; % obsolete
+% InnerMargin := RightMargin ; % obsolete
+% InnerEdge := RightEdge ; % obsolete
+% OuterMargin := LeftMargin ; % obsolete
+% OuterEdge := LeftEdge ; % obsolete
-InnerMarginWidth := 0pt ;
-OuterMarginWidth := 0pt ;
-InnerMarginDistance := 0pt ;
-OuterMarginDistance := 0pt ;
+numeric HorPos ; HorPos := 0 ;
+numeric VerPos ; VerPos := 0 ;
-InnerEdgeWidth := 0pt ;
-OuterEdgeWidth := 0pt ;
-InnerEdgeDistance := 0pt ;
-OuterEdgeDistance := 0pt ;
+% We used to initialize these variables each (sub)run but at some point MP
+% became too slow for this. See later.
% path Area[][] ;
% pair Location[][] ;
% path Field[][] ;
-
+%
% numeric Hstep[] ;
% numeric Hsize[] ;
% numeric Vstep[] ;
% numeric Vsize[] ;
-
-path Page ;
-
-numeric HorPos ;
-numeric VerPos ;
-
+%
% for VerPos=Top step 10 until Bottom:
% for HorPos=LeftEdge step 1 until RightEdge:
% Area[HorPos][VerPos] := origin--cycle ;
@@ -130,46 +348,8 @@ numeric VerPos ;
% Field[VerPos][HorPos] := Field[HorPos][VerPos] ;
% endfor ;
% endfor ;
-
-% def LoadPageState =
-% scantokens "input mp-state.tmp" ;
-% enddef ;
-
-def SwapPageState =
- if not OnRightPage :
- BackSpace := PaperWidth-MakeupWidth-BackSpace ;
- CutSpace := PaperWidth-MakeupWidth-CutSpace ;
- i := LeftMarginWidth ;
- LeftMarginWidth := RightMarginWidth ;
- RightMarginWidth := i ;
- i := LeftMarginDistance ;
- LeftMarginDistance := RightMarginDistance ;
- RightMarginDistance := i ;
- i := LeftEdgeWidth ;
- LeftEdgeWidth := RightEdgeWidth ;
- RightEdgeWidth := i ;
- i := LeftEdgeDistance ;
- LeftEdgeDistance := RightEdgeDistance ;
- RightEdgeDistance := i ;
-
- % these are now available as ..Width and ..Distance
-
- Margin := LeftMargin ;
- Edge := LeftEdge ;
- InnerMargin := RightMargin ;
- InnerEdge := RightEdge ;
- OuterMargin := LeftMargin ;
- OuterEdge := LeftEdge ;
- else :
- Margin := RightMargin ;
- Edge := RightEdge ;
- InnerMargin := LeftMargin ;
- InnerEdge := LeftEdge ;
- OuterMargin := RightMargin ;
- OuterEdge := RightEdge ;
- fi ;
-enddef ;
-
+%
+%
% def SetPageAreas =
%
% numeric Vsize[], Hsize[], Vstep[], Hstep[] ;
@@ -338,29 +518,55 @@ def SetPageField =
endfor ;
enddef ;
-def SetPagePage =
- path Page ;
- Page := unitsquare xscaled PaperWidth yscaled PaperHeight ;
+def mfun_page_Area = hide(SetPageArea ;) Area enddef ;
+def mfun_page_Location = hide(SetPageLocation ;) Location enddef ;
+def mfun_page_Field = hide(SetPageField ;) Field enddef ;
+def mfun_page_Vsize = hide(SetPageVsize ;) Vsize enddef ;
+def mfun_page_Hsize = hide(SetPageHsize ;) Hsize enddef ;
+def mfun_page_Vstep = hide(SetPageVstep ;) Vstep enddef ;
+def mfun_page_Hstep = hide(SetPageHstep ;) Hstep enddef ;
+
+def SetAreaVariables =
+ let Area = mfun_page_Area ;
+ let Location = mfun_page_Location ;
+ let Field = mfun_page_Field ;
+ let Vsize = mfun_page_Vsize ;
+ let Hsize = mfun_page_Hsize ;
+ let Vstep = mfun_page_Vstep ;
+ let Hstep = mfun_page_Hstep ;
enddef ;
-def mfun_page_Area = hide(SetPageArea ;) Area enddef ;
-def mfun_page_Location = hide(SetPageLocation ;) Location enddef ;
-def mfun_page_Field = hide(SetPageField ;) Field enddef ;
-def mfun_page_Vsize = hide(SetPageVsize ;) Vsize enddef ;
-def mfun_page_Hsize = hide(SetPageHsize ;) Hsize enddef ;
-def mfun_page_Vstep = hide(SetPageVstep ;) Vstep enddef ;
-def mfun_page_Hstep = hide(SetPageHstep ;) Hstep enddef ;
-def mfun_page_Page = hide(SetPagePage ;) Page enddef ;
+% we should make Page no path .. from now on don't assume this .. for a while we keek it
+
+vardef FrontPageWidth = PaperWidth enddef ;
+vardef BackPageWidth = PaperWidth enddef ;
+vardef CoverWidth = 2 * PaperWidth + SpineWidth enddef ;
+vardef CoverHeight = PaperHeight enddef ;
+
+vardef FrontPageHeight = PaperHeight enddef ;
+vardef BackPageHeight = PaperHeight enddef ;
+vardef SpineHeight = PaperHeight enddef ;
+
+def SetPagePage = path Page ; Page := unitsquare xscaled PaperWidth yscaled PaperHeight ; enddef ;
+def SetPageCoverPage = path CoverPage ; CoverPage := unitsquare xscaled CoverWidth yscaled CoverHeight ; enddef ;
+def SetPageSpine = path Spine ; Spine := unitsquare xscaled SpineWidth yscaled CoverHeight shifted (BackPageWidth,0) ; enddef ;
+def SetPageBackPage = path BackPage ; BackPage := unitsquare xscaled BackPageWidth yscaled CoverHeight ; enddef ;
+def SetPageFrontPage = path FrontPage ; FrontPage := unitsquare xscaled FrontPageWidth yscaled CoverHeight shifted (BackPageWidth+SpineWidth,0) ; enddef ;
+
+def mfun_page_Page = hide(SetPagePage ;) Page enddef ;
+def mfun_page_CoverPage = hide(SetPageCoverPage;) CoverPage enddef ;
+def mfun_page_Spine = hide(SetPageSpine ;) Spine enddef ;
+def mfun_page_BackPage = hide(SetPageBackPage ;) BackPage enddef ;
+def mfun_page_FrontPage = hide(SetPageFrontPage;) FrontPage enddef ;
def SetPageVariables =
- let Area = mfun_page_Area ;
- let Location = mfun_page_Location ;
- let Field = mfun_page_Field ;
- let Vsize = mfun_page_Vsize ;
- let Hsize = mfun_page_Hsize ;
- let Vstep = mfun_page_Vstep ;
- let Hstep = mfun_page_Hstep ;
- let Page = mfun_page_Page ;
+ SetAreaVariables ;
+ %
+ let Page = mfun_page_Page ;
+ let CoverPage = mfun_page_CoverPage ;
+ let Spine = mfun_page_Spine ;
+ let BackPage = mfun_page_BackPage ;
+ let FrontPage = mfun_page_FrontPage ;
enddef ;
SetPageVariables ;
@@ -393,45 +599,10 @@ enddef ;
def BoundCoverAreas =
% todo: add cropmarks
- bboxmargin := 0 ; setbounds currentpicture to Paper enlarged PaperBleed ;
+ bboxmargin := 0 ; setbounds currentpicture to CoverPage enlarged PaperBleed ;
enddef ;
-def SetCoverAreas =
-
- if unknown SpineWidth :
- SpineWidth := 8mm ;
- fi ;
-
- if unknown PaperBleed :
- PaperBleed := 0 ;
- fi ;
-
- FrontPageWidth := PaperWidth ;
- BackPageWidth := PaperWidth ;
- PaperWidth := 2 * PaperWidth + SpineWidth ;
-
- FrontPageHeight := PaperHeight ;
- BackPageHeight := PaperHeight ;
- PaperHeight := PaperHeight ;
- SpineHeight := PaperHeight ;
-
- path Paper ; Paper := unitsquare xscaled PaperWidth yscaled PaperHeight ;
- path Spine ; Spine := unitsquare xscaled SpineWidth yscaled PaperHeight shifted (BackPageWidth,0);
- path BackPage ; BackPage := unitsquare xscaled BackPageWidth yscaled PaperHeight ;
- path FrontPage ; FrontPage := unitsquare xscaled FrontPageWidth yscaled PaperHeight shifted (BackPageWidth+SpineWidth,0) ;
-
-enddef ;
-
-% def StartCover =
-% begingroup ;
-% if PageStateAvailable :
-% LoadPageState ;
-% % SwapPageState ;
-% fi ;
-% SetPageAreas ;
-% SetCoverAreas ;
-% BoundCoverAreas ;
-% enddef ;
+let SetCoverAreas = SetPageVariables ; % compatiblity
def StartCover =
begingroup ;
diff --git a/Master/texmf-dist/metapost/context/base/mp-tool.mpii b/Master/texmf-dist/metapost/context/base/mp-tool.mpii
index 62bd122f590..a5bb345a1a3 100644
--- a/Master/texmf-dist/metapost/context/base/mp-tool.mpii
+++ b/Master/texmf-dist/metapost/context/base/mp-tool.mpii
@@ -1407,7 +1407,7 @@ primarydef pct along pat = % also negative
enddef ;
primarydef len on pat = % no outer ( ) .. somehow fails
- (arctime if len>0 : len else : (arclength(pat)+len) fi of pat) of pat
+ (arctime if len>=0 : len else : (arclength(pat)+len) fi of pat) of pat
enddef ;
% this cuts of a piece from both ends
diff --git a/Master/texmf-dist/metapost/context/base/mp-tool.mpiv b/Master/texmf-dist/metapost/context/base/mp-tool.mpiv
index 7845467a46c..e497e2f7242 100644
--- a/Master/texmf-dist/metapost/context/base/mp-tool.mpiv
+++ b/Master/texmf-dist/metapost/context/base/mp-tool.mpiv
@@ -57,8 +57,15 @@ mpprocset := 1 ;
%
% protect ;
-string space ; space := char 32 ;
-string CRLF ; CRLF := char 10 & char 13 ;
+string space ; space := char 32 ;
+string percent ; percent := char 37 ;
+string crlf ; crlf := char 10 & char 13 ;
+string dquote ; dquote := char 34 ;
+
+let SPACE = space ;
+let CRLF = crlf ;
+let DQUOTE = dquote ;
+let PERCENT = percent ;
vardef ddecimal primary p =
decimal xpart p & " " & decimal ypart p
@@ -90,8 +97,8 @@ newinternal graycolormodel ; graycolormodel := 3 ;
newinternal rgbcolormodel ; rgbcolormodel := 5 ;
newinternal cmykcolormodel ; cmykcolormodel := 7 ;
-let grayscale = numeric ;
-let greyscale = numeric ;
+let grayscale = graycolor ;
+let greyscale = greycolor ;
vardef colorpart expr c =
if not picture c :
@@ -141,6 +148,39 @@ vardef colordecimals primary c =
fi
enddef ;
+vardef colordecimalslist(text t) =
+ save b ; boolean b ; b := false ;
+ for s=t :
+ if b : & " " & fi
+ colordecimals(s)
+ hide(b := true ;)
+ endfor
+enddef ;
+
+% vardef _ctx_color_spec_ primary c =
+% if cmykcolor c :
+% "c=" & decimal cyanpart c &
+% ",m=" & decimal magentapart c &
+% ",y=" & decimal yellowpart c &
+% ",k=" & decimal blackpart c
+% elseif rgbcolor c :
+% "r=" & decimal redpart c &
+% ",g=" & decimal greenpart c &
+% ",b=" & decimal bluepart c
+% else :
+% "s=" & decimal c
+% fi
+% enddef ;
+%
+% vardef _ctx_color_spec_list_(text t) =
+% save b ; boolean b ; b := false ;
+% for s=t :
+% if b : & " " & fi
+% _ctx_color_spec_(s)
+% hide(b := true ;)
+% endfor
+% enddef ;
+
%D We have standardized data file names:
def job_name =
@@ -152,7 +192,8 @@ def data_mpd_file =
enddef ;
%D Because \METAPOST\ has a hard coded limit of 4~datafiles,
-%D we need some trickery when we have multiple files.
+%D we need some trickery when we have multiple files. This will
+%D be redone (via \LUA).
if unknown collapse_data :
boolean collapse_data ;
@@ -292,12 +333,12 @@ enddef;
%D Some missing functions can be implemented rather straightforward (thanks to
%D Taco and others):
-pi := 3.14159265358979323846 ; radian := 180/pi ; % 2pi*radian = 360 ;
+% oldpi := 3.14159265358979323846 ; % from <math.h>
+pi := 3.14159265358979323846264338327950288419716939937510 ; % 50 digits
+radian := 180/pi ; % 2pi*radian = 360 ;
% let +++ = ++ ;
-numeric Pi ; Pi := pi ; % for some old compatibility reasons i guess
-
vardef sqr primary x = x*x enddef ;
vardef log primary x = if x=0: 0 else: mlog(x)/mlog(10) fi enddef ;
vardef ln primary x = if x=0: 0 else: mlog(x)/256 fi enddef ;
@@ -328,6 +369,11 @@ vardef asinh primary x = ln(x+(x++1)) enddef ;
vardef sinh primary x = save xx ; xx = exp x ; (xx-1/xx)/2 enddef ;
vardef cosh primary x = save xx ; xx = exp x ; (xx+1/xx)/2 enddef ;
+%D Like mod, but useful for anglesl it returns (-.5d,+.5d] and is used
+%D in for instance mp-chem.
+
+primarydef a zmod b = (-((b/2 - a) mod b) + b/2) enddef ;
+
%D Sometimes this is handy:
def undashed =
@@ -774,8 +820,8 @@ vardef whitecolor(expr c) =
if cmykcolor c : (0,0,0,0) elseif rgbcolor c : (1,1,1) else : 1 fi
enddef ;
-vardef blackcolor(expr c) =
- if cmykcolor c : (0,0,0,1) elseif rgbcolor c : (0,0,0) else : 0 fi
+vardef blackcolor expr c =
+ if cmykcolor c : (0,0,0,1) elseif rgbcolor c : (0,0,0) else : 0 fi
enddef ;
%D Well, this is the dangerous and naive version:
@@ -1324,7 +1370,7 @@ primarydef pct along pat = % also negative
enddef ;
primarydef len on pat = % no outer ( ) .. somehow fails
- (arctime if len>0 : len else : (arclength(pat)+len) fi of pat) of pat
+ (arctime if len>=0 : len else : (arclength(pat)+len) fi of pat) of pat
enddef ;
% this cuts of a piece from both ends
@@ -1545,9 +1591,13 @@ primarydef p softened c =
enddef ;
vardef grayed primary p =
- if color p :
+ if rgbcolor p :
tripled(.30redpart p+.59greenpart p+.11bluepart p)
- else :
+ elseif cmykcolor p :
+ tripled(.30*(1-cyanpart i)+.59*(1-magentapart i)+.11*(1-yellowpart i)+blackpart i)
+ elseif greycolor p :
+ p
+ elseif picture p :
image (
for i within p :
addto currentpicture
@@ -1563,12 +1613,24 @@ vardef grayed primary p =
else :
also i
fi
- withcolor tripled(.30redpart i+.59greenpart i+.11bluepart i) ;
+ if unknown colorpart i :
+ % nothing
+ elseif rgbcolor colorpart i :
+ withcolor tripled(.30redpart i+.59greenpart i+.11bluepart i) ;
+ elseif cmykcolor colorpart i :
+ withcolor tripled(.30*(1-cyanpart i)+.59*(1-magentapart i)+.11*(1-yellowpart i)+blackpart i) ;
+ else :
+ withcolor colorpart i ;
+ fi
endfor ;
)
- fi
+ else :
+ p
+ fi
enddef ;
+let greyed = grayed ;
+
% yes or no: "text" infont "cmr12" at 24pt ;
% let normalinfont = infont ;
@@ -2036,7 +2098,7 @@ enddef ;
% handy
def withgray primary g =
- withcolor (g,g,g)
+ withcolor g
enddef ;
% for metafun
@@ -2259,7 +2321,7 @@ enddef ;
%D Handy:
def break =
- exitif true fi ;
+ exitif true ; % fi
enddef ;
%D New too:
@@ -2272,23 +2334,31 @@ primarydef p ystretched h = (
p if (bbheight(p)>0) and (h>0) : yscaled (h/bbheight(p)) fi
) enddef ;
-primarydef p snapped s =
- hide (
- if path p :
- forever :
- exitif (bbheight(p) <= s) and (bbwidth(p) <= s) ;
- p := p scaled (1/2) ;
- endfor ;
- elseif numeric p :
- forever :
- exitif p <= s ;
- p := p scaled (1/2) ;
- endfor ;
- fi ;
- )
- p
+%D Newer:
+
+vardef area expr p =
+ % we could calculate the boundingbox once
+ (xpart llcorner boundingbox p,0) -- p --
+ (xpart lrcorner boundingbox p,0) -- cycle
enddef ;
+vardef basiccolors[] =
+ if @ = 0 :
+ white
+ else :
+ save n ; n := @ mod 7 ;
+ if n = 1 : red
+ elseif n = 2 : green
+ elseif n = 3 : blue
+ elseif n = 4 : cyan
+ elseif n = 5 : magenta
+ elseif n = 6 : yellow
+ else : black
+ fi
+ fi
+enddef ;
+
+
% vardef somecolor = (1,1,0,0) enddef ;
% fill OverlayBox withcolor (rcomponent somecolor,gcomponent somecolor,bcomponent somecolor) ;
@@ -2335,7 +2405,6 @@ vardef undecorated (text imagedata) text decoration =
currentpicture
enddef ;
-
if metapostversion < 1.770 :
vardef decorated (text imagedata) text decoration =
@@ -2455,25 +2524,76 @@ enddef ;
% )
% enddef ;
+vardef mfun_snapped(expr p, s) =
+ if p < 0 : - ( - else : ( fi p div s) * s % the less tokens the better
+enddef ;
+
+vardef mfun_applied(expr p, s)(suffix a) =
+ if path p :
+ if pair s :
+ for i=0 upto length(p)-1 :
+ (a(xpart point i of p,xpart s),a(ypart point i of p,ypart s)) --
+ endfor
+ if cycle p :
+ cycle
+ else :
+ (a(xpart point length(p) of p,xpart s),a(ypart point length(p) of p,ypart s))
+ fi
+ else :
+ for i=0 upto length(p)-1 :
+ (a(xpart point i of p,s),a(ypart point i of p,s)) --
+ endfor
+ if cycle p :
+ cycle
+ else :
+ (a(xpart point length(p) of p,s),a(ypart point length(p) of p,s))
+ fi
+ fi
+ elseif pair p :
+ if pair s :
+ (a(xpart p,xpart s),a(ypart p,ypart s))
+ else :
+ (a(xpart p,s),a(ypart p,s))
+ fi
+ elseif cmykcolor p :
+ (a(cyanpart p,s),a(magentapart p,s),a(yellowpart p,s),a(blackpart p,s))
+ elseif rgbcolor p :
+ (a(redpart p,s),a(greenpart p,s),a(bluepart p,s))
+ elseif graycolor p :
+ a(p,s)
+ elseif numeric p :
+ a(p,s)
+ else
+ p
+ fi
+enddef ;
+
+primarydef p snapped s =
+ mfun_applied(p,s)(mfun_snapped) % so we can play with variants
+enddef ;
+
%D New helpers:
+newinternal charscale ; charscale := 1 ; % persistent so one needs to 'reset' it to 0 or 1
+
def beginglyph(expr unicode, width, height, depth) =
beginfig(unicode) ; % the number is irrelevant
charcode := unicode ;
charwd := width ;
charht := height ;
chardp := depth ;
+ % charscale := 1 ; % can be set for a whole font, so no reset here
enddef ;
def endglyph =
setbounds currentpicture to (boundingbox unitsquare xscaled charwd yscaled (charht + chardp) shifted (0,-chardp)) ;
- if known charscale :
+ if known charscale : if (charscale > 0) and (charscale <> 1) :
currentpicture := currentpicture scaled charscale ;
- fi ;
+ fi ; fi ;
endfig ;
enddef ;
-%D Dimensions have bever been an issue as traditional MP can't make that large
+%D Dimensions have never been an issue as traditional MP can't make that large
%D pictures, but with double mode we need a catch:
newinternal maxdimensions ; maxdimensions := 14000 ;
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-bibtex.lua b/Master/texmf-dist/scripts/context/lua/mtx-bibtex.lua
index c81fd596f10..92036e3a5ed 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-bibtex.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-bibtex.lua
@@ -19,6 +19,7 @@ local helpinfo = [[
<subcategory>
<flag name="toxml"><short>convert bibtex database(s) to xml</short></flag>
<flag name="tolua"><short>convert bibtex database(s) to lua</short></flag>
+ <flag name="search"><short>seatch bibtex database(s)</short></flag>
</subcategory>
</category>
</flags>
@@ -29,6 +30,7 @@ local helpinfo = [[
<example><command>mtxrun --script bibtex --tolua bibl-001.bib</command></example>
<example><command>mtxrun --script bibtex --tolua --simple bibl-001.bib</command></example>
<example><command>mtxrun --script bibtex --toxml bibl-001.bib bibl-002.bib bibl-003.bib biblio.xml</command></example>
+ <example><command>mtxrun --script bibtex --search --list --pattern=match(author:foo) bar.bib</command></example>
</subcategory>
</category>
</examples>
@@ -43,7 +45,9 @@ local application = logs.application {
local report = application.report
+require("util-seq")
require("publ-dat")
+require("publ-fnd")
scripts = scripts or { }
scripts.bibtex = scripts.bibtex or { }
@@ -57,7 +61,7 @@ function scripts.bibtex.toxml(files)
if filetype == "xml" then
target = filename
elseif filetype == "bib" then
- bibtex.load(instance,filename)
+ bibtex.load { dataset = instance, filename = filename }
else
-- not supported
end
@@ -77,7 +81,8 @@ function scripts.bibtex.tolua(files)
if filetype == "lua" then
target = filename
elseif filetype == "bib" then
- bibtex.load(instance,filename)
+ bibtex.load { dataset = instance, filename = filename }
+
else
-- not supported
end
@@ -92,7 +97,48 @@ function scripts.bibtex.tolua(files)
end
end
-if environment.arguments.toxml then
+function scripts.bibtex.search(files,pattern,list)
+ if pattern then
+ local dataset = publications.datasets["whatever"]
+ for i=1,#files do
+ local filename = resolvers.findfile(files[i])
+ if filename and filename ~= "" then
+ publications.load { dataset = "whatever", filename = filename }
+ end
+ end
+ local found = publications.search(dataset,pattern)
+ local tags = table.sortedkeys(found)
+ if #tags == 0 then
+ report("no match")
+ elseif list then
+ report("%s matches:",#tags)
+ local result = { }
+ local luadata = dataset.luadata
+ for i=1,#tags do
+ local tag = tags[i]
+ local entry = luadata[tag]
+ result[i] = {
+ tag,
+ entry.year,
+ entry.author,
+ entry.title,
+ }
+ end
+ utilities.formatters.formatcolumns(result)
+ logs.newline()
+ for i=1,#result do
+ texio.write_nl(result[i])
+ end
+ logs.newline()
+ else
+ report("%s matches: % t",#tags,tags)
+ end
+ end
+end
+
+if environment.arguments.search then
+ scripts.bibtex.search(environment.files,environment.arguments.pattern,environment.arguments.list)
+elseif environment.arguments.toxml then
scripts.bibtex.toxml(environment.files)
elseif environment.arguments.tolua then
scripts.bibtex.tolua(environment.files)
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-check.lua b/Master/texmf-dist/scripts/context/lua/mtx-check.lua
index 9f52509ec7e..c456b44143e 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-check.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-check.lua
@@ -21,7 +21,7 @@ local helpinfo = [[
<flags>
<category name="basic">
<subcategory>
- <flag name="convert"><short>check tex file for errors</short></flag>
+ <flag name="check"><short>check tex file for errors</short></flag>
</subcategory>
</category>
</flags>
@@ -34,17 +34,17 @@ local application = logs.application {
helpinfo = helpinfo,
}
-local report = application.report
+local report = application.report
-scripts = scripts or { }
-scripts.checker = scripts.checker or { }
+scripts = scripts or { }
+scripts.checker = scripts.checker or { }
-local validator = { }
+local validator = { }
-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
@@ -68,27 +68,24 @@ local progress = function(position, data, kind)
end
end
-local i_m, d_m = P("$"), P("$$")
-local l_s, r_s = P("["), P("]")
-local l_g, r_g = P("{"), P("}")
+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 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 esc = P("\\")
+local space = S(" \t\f\v")
+local newline = lpeg.patterns.newline
-local line = newline / function() validator.n = validator.n + 1 end
+local line = newline / function() validator.n = validator.n + 1 end
local startluacode = P("\\startluacode")
local stopluacode = P("\\stopluacode")
-local somecode = startluacode * (1-stopluacode)^1 * stopluacode
+local somecode = startluacode * (1-stopluacode)^1 * stopluacode
-local stack = { }
+local stack = { }
local function push(p,s)
-- print("start",p,s)
@@ -117,7 +114,7 @@ local contextgrammar = P { "tokens",
["start"] = start,
["stop"] = stop,
["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,
+ ["grouped"] = l_g * (V("whatever") + V("grouped") + V("setup") + V("display") + V("inline") + line + (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,
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-context.lua b/Master/texmf-dist/scripts/context/lua/mtx-context.lua
index 37172327140..919dbbb8cd4 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-context.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-context.lua
@@ -28,10 +28,13 @@ local fileaddsuffix = file.addsuffix
local filenewsuffix = file.replacesuffix
local removesuffix = file.removesuffix
local validfile = lfs.isfile
+local removefile = os.remove
+local renamefile = os.rename
+local formatters = string.formatters
local application = logs.application {
name = "mtx-context",
- banner = "ConTeXt Process Management 0.60",
+ banner = "ConTeXt Process Management 0.61",
-- helpinfo = helpinfo, -- table with { category_a = text_1, category_b = text_2 } or helpstring or xml_blob
helpinfo = "mtx-context.xml",
}
@@ -279,11 +282,47 @@ local function multipass_changed(oldhash, newhash)
return false
end
-local function multipass_copyluafile(jobname)
+local f_tempfile = formatters["%s-%s-%02d.tmp"]
+
+local function backup(run,kind,filename)
+ if run == 1 then
+ for i=1,10 do
+ local tmpname = f_tempfile(jobname,kind,i)
+ if validfile(tmpname) then
+ removefile(tmpname)
+ report("removing %a",tmpname)
+ end
+ end
+ end
+ if validfile(filename) then
+ local tmpname = f_tempfile(jobname,kind,run or 1)
+ report("copying %a into %a",filename,tmpname)
+ file.copy(filename,tmpname)
+ else
+ report("no file %a, nothing kept",filename)
+ end
+end
+
+local function multipass_copyluafile(jobname,run)
local tuaname, tucname = jobname..".tua", jobname..".tuc"
if validfile(tuaname) then
- os.remove(tucname)
- os.rename(tuaname,tucname)
+ if run then
+ backup(run,"tuc",tucname)
+ report("copying %a into %a",tuaname,tucname)
+ report()
+ end
+ removefile(tucname)
+ renamefile(tuaname,tucname)
+ end
+end
+
+local function multipass_copylogfile(jobname,run)
+ local logname = jobname..".log"
+ if validfile(logname) then
+ if run then
+ backup(run,"log",logname)
+ report()
+ end
end
end
@@ -348,8 +387,8 @@ local function result_push_purge(oldbase,newbase)
for _, suffix in next, usedsuffixes.after do
local oldname = fileaddsuffix(oldbase,suffix)
local newname = fileaddsuffix(newbase,suffix)
- os.remove(newname)
- os.remove(oldname)
+ removefile(newname)
+ removefile(oldname)
end
end
@@ -358,10 +397,10 @@ local function result_push_keep(oldbase,newbase)
local oldname = fileaddsuffix(oldbase,suffix)
local newname = fileaddsuffix(newbase,suffix)
local tmpname = "keep-"..oldname
- os.remove(tmpname)
- os.rename(oldname,tmpname)
- os.remove(oldname)
- os.rename(newname,oldname)
+ removefile(tmpname)
+ renamefile(oldname,tmpname)
+ removefile(oldname)
+ renamefile(newname,oldname)
end
end
@@ -369,8 +408,8 @@ local function result_save_error(oldbase,newbase)
for _, suffix in next, usedsuffixes.keep do
local oldname = fileaddsuffix(oldbase,suffix)
local newname = fileaddsuffix(newbase,suffix)
- os.remove(newname) -- to be sure
- os.rename(oldname,newname)
+ removefile(newname) -- to be sure
+ renamefile(oldname,newname)
end
end
@@ -378,8 +417,8 @@ local function result_save_purge(oldbase,newbase)
for _, suffix in next, usedsuffixes.after do
local oldname = fileaddsuffix(oldbase,suffix)
local newname = fileaddsuffix(newbase,suffix)
- os.remove(newname) -- to be sure
- os.rename(oldname,newname)
+ removefile(newname) -- to be sure
+ renamefile(oldname,newname)
end
end
@@ -388,9 +427,9 @@ local function result_save_keep(oldbase,newbase)
local oldname = fileaddsuffix(oldbase,suffix)
local newname = fileaddsuffix(newbase,suffix)
local tmpname = "keep-"..oldname
- os.remove(newname)
- os.rename(oldname,newname)
- os.rename(tmpname,oldname)
+ removefile(newname)
+ renamefile(oldname,newname)
+ renamefile(tmpname,oldname)
end
end
@@ -549,6 +588,19 @@ function scripts.context.run(ctxdata,filename)
local a_jiton = getargument("jiton")
local a_jithash = getargument("jithash")
local a_texformat = getargument("texformat")
+ local a_keeptuc = getargument("keeptuc")
+ local a_keeplog = getargument("keeplog")
+
+ -- the following flag is not officially supported because i cannot forsee
+ -- side effects (so no bug reports please) .. we provide --sandbox that
+ -- does similar things but tries to ensure that context works as expected
+
+ local a_safer = getargument("safer")
+
+ if a_safer then
+ report("warning: using the luatex safer options, processing is not guaranteed")
+ end
+
--
a_batchmode = (a_batchmode and "batchmode") or (a_nonstopmode and "nonstopmode") or (a_scrollmode and "scrollmode") or nil
a_synctex = check_synctex(a_synctex)
@@ -592,6 +644,22 @@ function scripts.context.run(ctxdata,filename)
scripts.context.make(formatname,a_engine)
formatfile, scriptfile = resolvers.locateformat(formatname)
end
+ --
+ local function combine(key)
+ local flag = validstring(environment[key])
+ local plus = analysis[key]
+ if flag and plus then
+ return plus .. "," .. flag -- flag wins
+ else
+ return flag or plus -- flag wins
+ end
+ end
+ local a_trackers = analysis.trackers
+ local a_experiments = analysis.experiments
+ local directives = combine("directives")
+ local trackers = combine("trackers")
+ local experiments = combine("experiments")
+ --
if formatfile and scriptfile then
local suffix = validstring(getargument("suffix"))
local resultname = validstring(getargument("result"))
@@ -639,9 +707,9 @@ function scripts.context.run(ctxdata,filename)
local maxnofruns = once and 1 or multipass_nofruns
--
local c_flags = {
- directives = validstring(environment.directives), -- gets passed via mtxrun
- trackers = validstring(environment.trackers), -- gets passed via mtxrun
- experiments = validstring(environment.experiments), -- gets passed via mtxrun
+ directives = directives, -- gets passed via mtxrun
+ trackers = trackers, -- gets passed via mtxrun
+ experiments = experiments, -- gets passed via mtxrun
--
result = validstring(resultname),
input = validstring(getargument("input") or filename), -- alternative input
@@ -662,6 +730,7 @@ function scripts.context.run(ctxdata,filename)
["interaction"] = a_batchmode,
["synctex"] = a_synctex,
["no-parse-first-line"] = true,
+ ["safer"] = a_safer,
-- ["no-mktex"] = true,
-- ["file-line-error-style"] = true,
["fmt"] = formatfile,
@@ -671,10 +740,6 @@ function scripts.context.run(ctxdata,filename)
["jithash"] = a_jithash,
}
--
- if a_synctex then
- report("warning: synctex is enabled") -- can add upto 5% runtime
- end
- --
if not a_timing then
-- okay
elseif c_flags.usemodule then
@@ -691,6 +756,15 @@ function scripts.context.run(ctxdata,filename)
c_flags.directives = "system.profile"
end
--
+ if a_synctex then
+ report("warning: synctex is enabled") -- can add upto 5% runtime
+ if c_flags.directives then
+ c_flags.directives = format("system.synctex=%s,%s",a_synctex,c_flags.directives)
+ else
+ c_flags.directives = format("system.synctex=%s",a_synctex)
+ end
+ end
+ --
-- kindofrun: 1:first run, 2:successive run, 3:once, 4:last of maxruns
--
for currentrun=1,maxnofruns do
@@ -704,9 +778,10 @@ function scripts.context.run(ctxdata,filename)
--
local command = luatex_command(l_flags,c_flags,mainfile,a_engine)
--
- report("run %s: %s",i,command)
+ report("run %s: %s",currentrun,command)
print("") -- cleaner, else continuation on same line
local returncode, errorstring = os.spawn(command)
+ -- todo: remake format when no proper format is found
if not returncode then
report("fatal error: no return code, message: %s",errorstring or "?")
if resultname then
@@ -715,7 +790,8 @@ function scripts.context.run(ctxdata,filename)
os.exit(1)
break
elseif returncode == 0 then
- multipass_copyluafile(jobname)
+ multipass_copyluafile(jobname,a_keeptuc and currentrun)
+ multipass_copylogfile(jobname,a_keeplog and currentrun)
if not multipass_forcedruns then
newhash = multipass_hashfiles(jobname)
if multipass_changed(oldhash,newhash) then
@@ -852,7 +928,7 @@ function scripts.context.pipe() -- still used?
scripts.context.purge_job(filename)
elseif getargument("purgeall") then
scripts.context.purge_job(filename,true)
- os.remove(filename)
+ removefile(filename)
end
else
if formatname then
@@ -1046,11 +1122,11 @@ local special_runfiles = {
local function purge_file(dfile,cfile)
if cfile and validfile(cfile) then
- if os.remove(dfile) then
+ if removefile(dfile) then
return filebasename(dfile)
end
elseif dfile then
- if os.remove(dfile) then
+ if removefile(dfile) then
return filebasename(dfile)
end
end
@@ -1144,8 +1220,8 @@ local function touch(path,name,versionpattern,kind,kindpattern)
end
if newdata ~= "" and (oldversion ~= newversion or oldkind ~= newkind or newdata ~= olddata) then
local backup = filenewsuffix(name,"tmp")
- os.remove(backup)
- os.rename(name,backup)
+ removefile(backup)
+ renamefile(name,backup)
io.savedata(name,newdata)
return name, oldversion, newversion, oldkind, newkind
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-context.xml b/Master/texmf-dist/scripts/context/lua/mtx-context.xml
index af8d5cc20e5..c4109328900 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-context.xml
+++ b/Master/texmf-dist/scripts/context/lua/mtx-context.xml
@@ -142,7 +142,7 @@
<short>assume given file present elsewhere</short>
</flag>
<flag name="nofile">
- <short>use dummy file as jobname</short>
+ <short>use dummy file as jobname</short>
</flag>
</subcategory>
</category>
@@ -152,16 +152,22 @@
<short>update context version number (also provide <ref name="expert"/>, optionally provide <ref name="basepath"/>)</short>
</flag>
<flag name="nostatistics">
- <short>omit runtime statistics at the end of the run</short>
+ <short>omit runtime statistics at the end of the run</short>
</flag>
<flag name="update">
- <short>update context from website (not to be confused with contextgarden)</short>
+ <short>update context from website (not to be confused with contextgarden)</short>
</flag>
- <flag name="profile">
- <short>profile job (use: mtxrun <ref name="script"/> profile <ref name="analyze"/>)</short>
+ <flag name="profile">
+ <short>profile job (use: mtxrun <ref name="script"/> profile <ref name="analyze"/>)</short>
</flag>
- <flag name="timing">
- <short>generate timing and statistics overview</short>
+ <flag name="timing">
+ <short>generate timing and statistics overview</short>
+ </flag>
+ <flag name="keeptuc">
+ <short>keep previous tuc files (jobname-tuc-[run].tmp)</short>
+ </flag>
+ <flag name="keeplog">
+ <short>keep previous log files (jobname-log-[run].tmp)</short>
</flag>
</subcategory>
<subcategory>
@@ -190,6 +196,11 @@
<short>do not check for file and enter scroll mode (<ref name="dummyfile"/>=whatever.tmp)</short>
</flag>
</subcategory>
+ <subcategory>
+ <flag name="sandbox">
+ <short>process file in a limited environment</short>
+ </flag>
+ </subcategory>
</category>
</flags>
</application>
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-convert.lua b/Master/texmf-dist/scripts/context/lua/mtx-convert.lua
index b76b3baaf62..d5dba075acf 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-convert.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-convert.lua
@@ -48,7 +48,7 @@ local convert = scripts.convert
convert.converters = convert.converters or { }
local converters = convert.converters
-local gsprogram = os.type == "windows" and "gswin32c" or "gs"
+local gsprogram = (os.type == "windows" and (os.which("gswin64c.exe") or os.which("gswin32c.exe"))) or "gs"
local gstemplate_eps = "%s -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -dEPSCrop -dNOPAUSE -dSAFER -dNOCACHE -dBATCH -dAutoRotatePages=/None -dProcessColorModel=/DeviceCMYK -sOutputFile=%s %s -c quit"
local gstemplate_ps = "%s -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -dNOPAUSE -dSAFER -dNOCACHE -dBATCH -dAutoRotatePages=/None -dProcessColorModel=/DeviceCMYK -sOutputFile=%s %s -c quit"
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-epub.lua b/Master/texmf-dist/scripts/context/lua/mtx-epub.lua
index 11f0a202453..956ce4931a9 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-epub.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-epub.lua
@@ -18,8 +18,89 @@ if not modules then modules = { } end modules ['mtx-epub'] = {
-- first we need a decent strategy to export them. More information will be
-- available on the wiki.
-local format, gsub = string.format, string.gsub
-local concat = table.concat
+-- META-INF
+-- container.xml
+-- OEBPS
+-- content.opf
+-- toc.ncx
+-- images
+-- styles
+-- mimetype
+
+-- todo:
+--
+-- remove m_k_v_i prefixes
+-- remap fonts %mono% in css so that we can replace
+-- coverpage tests
+-- split up
+
+-- todo: automated cover page:
+--
+-- \startMPpage
+-- StartPage ;
+-- fill Page withcolor .5red ;
+-- numeric n ;
+-- for i=10 downto 1 :
+-- n := i * PaperWidth/40 ;
+-- draw
+-- lrcorner Page shifted (0,n)
+-- % -- lrcorner Page
+-- -- lrcorner Page shifted (-n,0)
+-- % -- cycle
+-- withpen pencircle scaled 1mm
+-- withcolor white ;
+-- endfor ;
+-- picture p ; p := image (
+-- draw
+-- anchored.top(
+-- textext.bot("\tttf Some Title")
+-- xsized .8PaperWidth
+-- ,center topboundary Page
+-- )
+-- withcolor white ;
+-- ) ;
+-- picture q ; q := image (
+-- draw
+-- anchored.top(
+-- textext.bot("\tttf An Author")
+-- xsized .4PaperWidth
+-- shifted (0,-PaperHeight/40)
+-- ,center bottomboundary p
+-- )
+-- withcolor white ;
+-- ) ;
+-- draw p ;
+-- draw q ;
+-- StopPage ;
+-- \stopMPpage
+
+local format, gsub, find = string.format, string.gsub, string.find
+local concat, sortedhash = table.concat, table.sortedhash
+
+local formatters = string.formatters
+local replacetemplate = utilities.templates.replace
+
+local addsuffix = file.addsuffix
+local nameonly = file.nameonly
+local basename = file.basename
+local pathpart = file.pathpart
+local joinfile = file.join
+local suffix = file.suffix
+local addsuffix = file.addsuffix
+local removesuffix = file.removesuffix
+local replacesuffix = file.replacesuffix
+
+local copyfile = file.copy
+local removefile = os.remove
+
+local needsupdating = file.needsupdating
+
+local isdir = lfs.isdir
+local isfile = lfs.isfile
+local mkdir = lfs.mkdir
+
+local pushdir = dir.push
+local popdir = dir.pop
local helpinfo = [[
<?xml version="1.0"?>
@@ -27,12 +108,17 @@ local helpinfo = [[
<metadata>
<entry name="name">mtx-epub</entry>
<entry name="detail">ConTeXt EPUB Helpers</entry>
- <entry name="version">0.12</entry>
+ <entry name="version">1.10</entry>
</metadata>
<flags>
<category name="basic">
<subcategory>
<flag name="make"><short>create epub zip file</short></flag>
+ <flag name="purge"><short>remove obsolete files</short></flag>
+ <flag name="rename"><short>rename images to sane names</short></flag>
+ <flag name="svgmath"><short>convert mathml to svg</short></flag>
+ <flag name="svgstyle"><short>use given tex style for svg generation (overloads style in specification)</short></flag>
+ <flag name="all"><short>assume: --purge --rename --svgmath (for fast testing)</short></flag>
</subcategory>
</category>
</flags>
@@ -49,10 +135,12 @@ local helpinfo = [[
local application = logs.application {
name = "mtx-epub",
- banner = "ConTeXt EPUB Helpers 0.12",
+ banner = "ConTeXt EPUB Helpers 1.10",
helpinfo = helpinfo,
}
+local report = application.report
+
-- script code
scripts = scripts or { }
@@ -60,91 +148,142 @@ scripts.epub = scripts.epub or { }
local mimetype = "application/epub+zip"
-local container = [[
+local t_container = [[
<?xml version="1.0" encoding="UTF-8"?>
<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
<rootfiles>
- <rootfile full-path="OEBPS/%s" media-type="application/oebps-package+xml"/>
+ <rootfile full-path="OEBPS/%rootfile%" media-type="application/oebps-package+xml"/>
</rootfiles>
</container>
]]
-local package = [[
+-- urn:uuid:
+
+-- <dc:identifier id="%identifier%" opf:scheme="UUID">%uuid%</dc:identifier>
+
+local t_package = [[
<?xml version="1.0" encoding="UTF-8"?>
-<package version="2.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="%s">
+<package xmlns="http://www.idpf.org/2007/opf" unique-identifier="%identifier%" version="3.0">
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
- <dc:title>%s</dc:title>
- <dc:language>%s</dc:language>
- <dc:identifier id="%s" opf:scheme="UUID">urn:uuid:%s</dc:identifier>
- <dc:creator>%s</dc:creator>
- <dc:date>%s</dc:date>
- <meta name="cover" content="%s" />
+ <dc:title>%title%</dc:title>
+ <dc:language>%language%</dc:language>
+ <dc:identifier id="%identifier%">%uuid%</dc:identifier>
+ <dc:creator>%creator%</dc:creator>
+ <dc:date>%date%</dc:date>
+ <!--
+ <dc:subject>%subject%</dc:subject>
+ <dc:description>%description%</dc:description>
+ <dc:publisher>%publisher%</dc:publisher>
+ <dc:source>%source%</dc:source>
+ <dc:relation>%relation%</dc:relation>
+ <dc:coverage>%coverage%</dc:coverage>
+ <dc:rights>%rights%</dc:rights>
+ -->
+ <meta name="cover" content="%coverpage%" />
+ <meta name="generator" content="ConTeXt MkIV" />
+ <meta property="dcterms:modified">%date%</meta>
</metadata>
<manifest>
-%s
+%manifest%
</manifest>
<spine toc="ncx">
<itemref idref="cover-xhtml" />
- <itemref idref="%s" />
+ <itemref idref="%rootfile%" />
</spine>
</package>
]]
-local item = [[ <item id="%s" href="%s" media-type="%s"/>]]
-local toc = [[
-<?xml version="1.0"?>
+local t_item = [[ <item id="%id%" href="%filename%" media-type="%mime%" />]]
+local t_prop = [[ <item id="%id%" href="%filename%" media-type="%mime%" properties="%properties%" />]]
+
+-- <!DOCTYPE ncx PUBLIC "-//NISO//DTD ncx 2005-1//EN" "http://www.daisy.org/z3986/2005/ncx-2005-1.dtd">
+
+local t_toc = [[
+<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE ncx PUBLIC "-//NISO//DTD ncx 2005-1//EN" "http://www.daisy.org/z3986/2005/ncx-2005-1.dtd">
+<!-- this is no longer needed in epub 3.0+ -->
<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1">
<head>
- <meta name="dtb:uid" content="%s" />
+ <meta name="generator" content="ConTeXt MkIV" />
+ <meta name="dtb:uid" content="%identifier%" />
<meta name="dtb:depth" content="2" />
<meta name="dtb:totalPgeCount" content="0" />
<meta name="dtb:maxPageNumber" content="0" />
</head>
<docTitle>
- <text>%s</text>
+ <text>%title%</text>
</docTitle>
+ <docAuthor>
+ <text>%author%</text>
+ </docAuthor>
+
<navMap>
<navPoint id="np-1" playOrder="1">
<navLabel>
<text>start</text>
</navLabel>
- <content src="%s"/>
+ <content src="%root%"/>
</navPoint>
</navMap>
</ncx>
]]
-local coverxhtml = [[
+local t_navtoc = [[
<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops">
+ <head>
+ <meta charset="utf-8" />
+ <title>navtoc</title>
+ </head>
+ <body>
+ <div class="navtoc">
+ <!-- <nav epub:type="lot"> -->
+ <nav epub:type="toc" id="navtoc">
+ <ol>
+ <li><a href="%root%">document</a></li>
+ </ol>
+ </nav>
+ </div>
+ </body>
+</html>
+]]
+
+-- <html xmlns="http://www.w3.org/1999/xhtml">
+-- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+
+local t_coverxhtml = [[
+<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
- <title>cover.xhtml</title>
+ <meta charset="utf-8" />
+ <title>cover page</title>
</head>
<body>
- <div>
- <img src="%s" alt="The cover image" style="max-width: 100%%;" />
+ <div class="coverpage">
+ %content%
</div>
</body>
</html>
]]
+local t_coverimg = [[
+ <img src="%image%" alt="The cover image" style="max-width: 100%%;" />
+]]
+
-- We need to figure out what is permitted. Numbers only seem to give
-- problems is some applications as do names with dashes. Also the
-- optional toc is supposed to be there and although id's are by
@@ -154,12 +293,13 @@ local coverxhtml = [[
local function dumbid(filename)
-- return (string.gsub(os.uuid(),"%-%","")) -- to be tested
- return file.nameonly(filename) .. "-" .. file.suffix(filename)
+ return nameonly(filename) .. "-" .. suffix(filename)
end
local mimetypes = {
xhtml = "application/xhtml+xml",
xml = "application/xhtml+xml",
+ html = "application/html",
css = "text/css",
svg = "image/svg+xml",
png = "image/png",
@@ -175,204 +315,601 @@ local idmakers = {
default = function(filename) return dumbid(filename) end,
}
--- specification = {
--- name = "document",
--- identifier = "123",
--- root = "a.xhtml",
--- files = {
--- "a.xhtml",
--- "b.css",
--- "c.png",
--- }
--- }
-
-local function locateimages(oldname,newname,subpath)
+local function relocateimages(imagedata,oldname,newname,subpath,rename)
local data = io.loaddata(oldname)
- local images = { }
- local done = gsub(data,"(background%-image *: * url%()(.-)(%))", function(before,name,after)
- if subpath then
- name = file.join(subpath,name)
+ if data then
+ subpath = joinfile("..",subpath)
+ report("relocating images")
+ local n = 0
+ local done = gsub(data,[[(id=")(.-)(".-background%-image *: *url%()(.-)(%))]], function(s1,id,s2,name,s3)
+ local data = imagedata[id]
+ if data then
+ local newname = data[id].newname
+ if newname then
+ if subpath then
+ name = joinfile(subpath,basename(newname))
+ else
+ name = basename(newname)
+ end
+ -- name = url.addscheme(name)
+ end
+ if newname then
+ n = n + 1
+ if rename then
+ name = joinfile(subpath,addsuffix(id,suffix(name)))
+ end
+ return s1 .. id .. s2 .. name .. s3
+ end
+ end
+ end)
+ report("%s images relocated in %a",n,newname)
+ if newname then
+ io.savedata(newname,done)
end
- images[#images+1] = name
- return before .. name .. after
- end)
- if newname then
- io.savedata(done,newname)
end
return images
end
+function reportobsolete(oldfiles,newfiles,purge)
+
+ for i=1,#oldfiles do oldfiles[i] = gsub(oldfiles[i],"^[%./]+","") end
+ for i=1,#newfiles do newfiles[i] = gsub(newfiles[i],"^[%./]+","") end
+
+ local old = table.tohash(oldfiles)
+ local new = table.tohash(newfiles)
+ local done = false
+
+ for name in sortedhash(old) do
+ if not new[name] then
+ if not done then
+ report()
+ if purge then
+ report("removing obsolete files:")
+ else
+ report("obsolete files:")
+ end
+ report()
+ done = true
+ end
+ report(" %s",name)
+ if purge then
+ removefile(name)
+ end
+ end
+ end
+
+ if done then
+ report()
+ end
+
+ return done
+
+end
+
+
local zippers = {
{
name = "zip",
+ binary = "zip",
uncompressed = "zip %s -X -0 %s",
compressed = "zip %s -X -9 -r %s",
},
{
- name = "7zip (7z)",
+ name = "7z (7zip)",
+ binary = "7z",
uncompressed = "7z a -tzip -mx0 %s %s",
compressed = "7z a -tzip %s %s",
},
}
-function scripts.epub.make()
+function scripts.epub.make(purge,rename,svgmath,svgstyle)
+
+ -- one can enter a jobname or jobname-export but the simple jobname is
+ -- preferred
local filename = environment.files[1]
- if filename and filename ~= "" and type(filename) == "string" then
+ if not filename or filename == "" or type(filename) ~= "string" then
+ report("provide filename")
+ return
+ end
+
+ local specpath, specname, specfull
- filename = file.basename(filename)
- local specfile = file.replacesuffix(filename,"specification")
- local specification = lfs.isfile(specfile) and dofile(specfile) or { }
+ if isdir(filename) then
+ specpath = filename
+ specname = addsuffix(specpath,"lua")
+ specfull = joinfile(specpath,specname)
+ end
+
+ if not specfull or not isfile(specfull) then
+ specpath = filename .. "-export"
+ specname = addsuffix(filename .. "-pub","lua")
+ specfull = joinfile(specpath,specname)
+ end
+
+ if not specfull or not isfile(specfull) then
+ report("unknown specificaton file %a for %a",specfull or "?",filename)
+ return
+ end
--- inspect(specification)
+ local specification = dofile(specfull)
+
+ if not specification or not next(specification) then
+ report("invalid specificaton file %a",specfile)
+ return
+ end
+
+ report("using specification file %a",specfull)
+
+ -- images: { ... url = location ... }
+
+ local defaultcoverpage = "cover.xhtml"
+
+ local name = specification.name or nameonly(filename)
+ local identifier = specification.identifier or ""
+ local htmlfiles = specification.htmlfiles or { }
+ local styles = specification.styles or { }
+ local images = specification.images or { }
+ local htmlroot = specification.htmlroot or htmlfiles[1] or ""
+ local language = specification.language or "en"
+ local creator = specification.creator or "context mkiv"
+ local author = specification.author or "anonymous"
+ local title = specification.title or name
+ local subtitle = specification.subtitle or ""
+ local imagefile = specification.imagefile or ""
+ local imagepath = specification.imagepath or "images"
+ local stylepath = specification.stylepath or "styles"
+ local coverpage = specification.firstpage or defaultcoverpage
+
+ if type(svgstyle) == "string" and not svgstyle then
+ svgstyle = specification.svgstyle or ""
+ end
- local name = specification.name or file.removesuffix(filename)
- local identifier = specification.identifier or os.uuid(true)
- local files = specification.files or { file.addsuffix(filename,"xhtml") }
- local images = specification.images or { }
- local root = specification.root or files[1]
- local language = specification.language or "en"
- local creator = specification.author or "My Self"
- local title = specification.title or "My Title"
- local firstpage = specification.firstpage or ""
- local lastpage = specification.lastpage or ""
+ local obsolete = false
- -- identifier = gsub(identifier,"[^a-zA-z0-9]","")
+ if #htmlfiles == 0 then
+ report("no html files specified")
+ return
+ end
+ if htmlroot == "" then
+ report("no html root file specified")
+ return
+ end
+
+ if subtitle ~= "" then
+ title = format("%s, %s",title,subtitle)
+ end
+
+ local htmlsource = specpath
+ local imagesource = joinfile(specpath,imagepath)
+ local stylesource = joinfile(specpath,stylepath)
+
+ -- once we're here we can start moving files to the right spot; first we deal
+ -- with images
+
+ -- ["image-1"]={
+ -- height = "7.056cm",
+ -- name = "file:///t:/sources/cow.svg",
+ -- page = "1",
+ -- width = "9.701cm",
+ -- }
+
+ -- end of todo
+
+ local pdftosvg = os.which("mudraw") and formatters[ [[mudraw -o "%s" "%s" %s]] ]
+
+ local f_svgpage = formatters["%s-page-%s.svg"]
+ local f_svgname = formatters["%s.svg"]
+
+ local notupdated = 0
+ local updated = 0
+ local skipped = 0
+ local oldfiles = dir.glob(file.join(imagesource,"*"))
+ local newfiles = { }
+
+ if not pdftosvg then
+ report("the %a binary is not present","mudraw")
+ end
+
+ -- a coverpage file has to be in the root of the export tree
+
+ if not coverpage then
+ report("no cover page (image) defined")
+ elseif suffix(coverpage) ~= "xhtml" then
+ report("using cover page %a",coverpage)
+ local source = coverpage
+ local target = joinfile(htmlsource,coverpage)
+ htmlfiles[#htmlfiles+1 ] = coverpage
+ report("copying coverpage %a to %a",source,target)
+ copyfile(source,target)
+ elseif isfile(coverpage) then
+ report("using cover page image %a",coverpage)
+ images.cover = {
+ height = "100%",
+ width = "100%",
+ page = "1",
+ name = url.filename(coverpage),
+ used = coverpage,
+ }
+ local data = replacetemplate(t_coverxhtml, {
+ content = replacetemplate(t_coverimg, {
+ image = coverpage,
+ })
+ })
+ coverpage = defaultcoverpage
+ local target = joinfile(htmlsource,coverpage)
+ report("saving coverpage to %a",target)
+ io.savedata(target,data)
+ htmlfiles[#htmlfiles+1 ] = coverpage
+ else
+ report("cover page image %a is not present",coverpage)
+ coverpage = false
+ end
+
+ if not coverpage then
+ local data = replacetemplate(t_coverxhtml, {
+ content = "no cover page"
+ })
+ coverpage = defaultcoverpage
+ local target = joinfile(htmlsource,coverpage)
+ report("saving dummy coverpage to %a",target)
+ io.savedata(target,data)
+ htmlfiles[#htmlfiles+1 ] = coverpage
+ end
- if firstpage ~= "" then
- images[firstpage] = firstpage
+ for id, data in sortedhash(images) do
+ local name = url.filename(data.name)
+ local used = url.filename(data.used)
+ local base = basename(used)
+ local page = tonumber(data.page) or 1
+ -- todo : check timestamp and prefix, rename to image-*
+ if suffix(used) == "pdf" then
+ -- todo: pass svg name
+ if page > 1 then
+ name = f_svgpage(nameonly(name),page)
+ else
+ name = f_svgname(nameonly(name))
+ end
+ local source = used
+ local target = joinfile(imagesource,name)
+ if needsupdating(source,target) then
+ if pdftosvg then
+ local command = pdftosvg(target,source,page)
+ report("running command %a",command)
+ os.execute(command)
+ updated = updated + 1
+ else
+ skipped = skipped + 1
+ end
+ else
+ notupdated = notupdated + 1
+ end
+ newfiles[#newfiles+1] = target
+ else
+ name = basename(used)
+ local source = used
+ local target = joinfile(imagesource,name)
+ if needsupdating(source,target) then
+ report("copying %a to %a",source,target)
+ copyfile(source,target)
+ updated = updated + 1
+ else
+ notupdated = notupdated + 1
+ -- no message
+ end
+ newfiles[#newfiles+1] = target
end
- if lastpage ~= "" then
- images[lastpage] = lastpage
+ local target = newfiles[#newfiles]
+ if suffix(target) == "svg" and isfile(target) then
+ local data = io.loaddata(target)
+ if data then
+ local done = gsub(data,"<!(DOCTYPE.-)>","<!-- %1 -->",1)
+ if data ~= done then
+ report("doctype fixed in %a",target)
+ io.savedata(target,data)
+ end
+ end
end
+ data.newname = name -- without path
+ end
+
+ report("%s images checked, %s updated, %s kept, %s skipped",updated + notupdated + skipped,updated,notupdated,skipped)
- identifier = "BookId" -- weird requirement
-
- local epubname = name
- local epubpath = file.replacesuffix(name,"tree")
- local epubfile = file.replacesuffix(name,"epub")
- local epubroot = file.replacesuffix(name,"opf")
- local epubtoc = "toc.ncx"
- local epubcover = "cover.xhtml"
-
- application.report("creating paths in tree %s",epubpath)
- lfs.mkdir(epubpath)
- lfs.mkdir(file.join(epubpath,"META-INF"))
- lfs.mkdir(file.join(epubpath,"OEBPS"))
-
- local used = { }
-
- local function copyone(filename)
- local suffix = file.suffix(filename)
- local mime = mimetypes[suffix]
- if mime then
- local idmaker = idmakers[suffix] or idmakers.default
- local target = file.join(epubpath,"OEBPS",filename)
- file.copy(filename,target)
- application.report("copying %s to %s",filename,target)
- used[#used+1] = format(item,idmaker(filename),filename,mime)
+ if reportobsolete(oldfiles,newfiles,purge) then
+ obsolete = true
+ end
+
+ -- here we can decide not to make an epub
+
+ local uuid = format("urn:uuid:%s",os.uuid(true)) -- os.uuid()
+ local identifier = "bookid" -- for now
+
+ local epubname = removesuffix(name)
+ local epubpath = name .. "-epub"
+ local epubfile = replacesuffix(name,"epub")
+ local epubroot = replacesuffix(name,"opf")
+ local epubtoc = "toc.ncx"
+ local epubmimetypes = "mimetype"
+ local epubcontainer = "container.xml"
+ local epubnavigator = "nav.xhtml"
+
+ local metapath = "META-INF"
+ local datapath = "OEBPS"
+
+ local oldfiles = dir.glob(file.join(epubpath,"**/*"))
+ local newfiles = { }
+
+ report("creating paths in tree %a",epubpath)
+
+ if not isdir(epubpath) then
+ mkdir(epubpath)
+ end
+ if not isdir(epubpath) then
+ report("unable to create path %a",epubpath)
+ return
+ end
+
+ local metatarget = joinfile(epubpath,metapath)
+ local htmltarget = joinfile(epubpath,datapath)
+ local styletarget = joinfile(epubpath,datapath,stylepath)
+ local imagetarget = joinfile(epubpath,datapath,imagepath)
+
+ mkdir(metatarget)
+ mkdir(htmltarget)
+ mkdir(styletarget)
+ mkdir(imagetarget)
+
+ local used = { }
+ local notupdated = 0
+ local updated = 0
+
+ local oldimagespecification = joinfile(htmlsource,imagefile)
+ local newimagespecification = joinfile(htmltarget,imagefile)
+
+ report("removing %a",newimagespecification)
+ -- removefile(newimagespecification) -- because we update that one
+
+ local function registerone(path,filename,mathml)
+ local suffix = suffix(filename)
+ local mime = mimetypes[suffix]
+ if mime then
+ local idmaker = idmakers[suffix] or idmakers.default
+ local fullname = path and joinfile(path,filename) or filename
+ if mathml then
+ used[#used+1] = replacetemplate(t_prop, {
+ id = idmaker(filename),
+ filename = fullname,
+ mime = mime,
+ properties = "mathml",
+ } )
+ else
+ used[#used+1] = replacetemplate(t_item, {
+ id = idmaker(filename),
+ filename = fullname,
+ mime = mime,
+ } )
end
+ return true
+ end
+ end
+
+ local function registerandcopyfile(check,path,name,sourcepath,targetpath,newname,image)
+
+ if name == "" then
+ report("ignoring unknown image")
+ return
+ end
+
+ if newname then
+ newname = replacesuffix(newname,suffix(name))
+ else
+ newname = name
end
- copyone("cover.xhtml")
- copyone("toc.ncx")
+ local source = joinfile(sourcepath,name)
+ local target = joinfile(targetpath,newname)
+ local mathml = false
- local function copythem(files)
- for i=1,#files do
- local filename = files[i]
- if type(filename) == "string" then
- copyone(filename)
+ if suffix(source) == "xhtml" then
+ if find(io.loaddata(source),"MathML") then
+ mathml = true -- inbelievable: the property is only valid when there is mathml
+ end
+ else
+ report("checking image %a -> %a",source,target)
+ end
+ if registerone(path,newname,mathml) then
+ if not check or needsupdating(source,target) or mathml and svgmath then
+ report("copying %a to %a",source,target)
+ copyfile(source,target)
+ updated = updated + 1
+ else
+ notupdated = notupdated + 1
+ end
+ newfiles[#newfiles+1] = target
+ if mathml and svgmath then
+ report()
+ report("converting mathml into svg in %a",target)
+ report()
+ local status, total, unique = moduledata.svgmath.convert(target,svgstyle)
+ report()
+ if status then
+ report("%s formulas converted, %s are unique",total,unique)
+ else
+ report("warning: %a in %a",total,target)
end
+ report()
end
end
+ end
- copythem(files)
+ -- local nofdummies = 0
+ -- local dummyname = formatters["dummy-figure-%03i"]
+ -- local makedummy = formatters["context --extra=dummies --noconsole --once --result=%s"]
+ --
+ -- local function registerandcopydummy(targetpath,name)
+ -- nofdummies = nofdummies + 1
+ -- local newname = dummyname(nofdummies)
+ -- local target = joinfile(targetpath,newname)
+ -- if not isfile(target) then
+ -- pushdir(targetpath)
+ -- report("generating dummy %a for %a",newname,name or "unknown")
+ -- os.execute(makedummy(newname))
+ -- popdir()
+ -- end
+ -- return newname
+ -- end
+
+ for image, data in sortedhash(images) do
+ -- if data.used == "" then
+ -- data.newname = registerandcopydummy(imagetarget,data.name)
+ -- end
+ registerandcopyfile(true,imagepath,data.newname,imagesource,imagetarget,rename and image,true)
+ end
+ for i=1,#styles do
+ registerandcopyfile(false,stylepath,styles[i],stylesource,styletarget)
+ end
+ for i=1,#htmlfiles do
+ registerandcopyfile(false,false,htmlfiles[i],htmlsource,htmltarget)
+ end
- local theimages = { }
+ relocateimages(images,oldimagespecification,oldimagespecification,imagepath,rename)
+ relocateimages(images,oldimagespecification,newimagespecification,imagepath,rename)
- for k, v in table.sortedpairs(images) do
- theimages[#theimages+1] = k
- if not lfs.isfile(k) and file.suffix(k) == "svg" and file.suffix(v) == "pdf" then
- local command = format("inkscape --export-plain-svg=%s %s",k,v)
- application.report("running command '%s'\n\n",command)
- os.execute(command)
- end
+ report("%s files registered, %s updated, %s kept",updated + notupdated,updated,notupdated)
+
+ local function saveinfile(what,name,data)
+ report("saving %s in %a",what,name)
+ io.savedata(name,data)
+ newfiles[#newfiles+1] = name
+ end
+
+ used[#used+1] = replacetemplate(t_prop, {
+ id = "nav",
+ filename = epubnavigator,
+ properties = "nav",
+ mime = "application/xhtml+xml",
+ })
+
+ registerone(false,epubtoc)
+
+ saveinfile("navigation data",joinfile(htmltarget,epubnavigator),replacetemplate(t_navtoc, { -- version 3.0
+ root = htmlroot,
+ } ) )
+
+ saveinfile("used mimetypes",joinfile(epubpath,epubmimetypes),mimetype)
+
+ saveinfile("version 2.0 container",joinfile(metatarget,epubcontainer),replacetemplate(t_container, {
+ rootfile = epubroot
+ } ) )
+
+ local idmaker = idmakers[suffix(htmlroot)] or idmakers.default
+
+ saveinfile("package specification",joinfile(htmltarget,epubroot),replacetemplate(t_package, {
+ identifier = identifier,
+ title = title,
+ language = language,
+ uuid = uuid,
+ creator = creator,
+ date = os.date("!%Y-%m-%dT%H:%M:%SZ"),
+ coverpage = idmaker(coverpage),
+ manifest = concat(used,"\n"),
+ rootfile = idmaker(htmlroot)
+ } ) )
+
+ -- t_toc is replaced by t_navtoc in >= 3
+
+ saveinfile("table of contents",joinfile(htmltarget,epubtoc), replacetemplate(t_toc, {
+ identifier = uuid, -- identifier,
+ title = title,
+ author = author,
+ root = htmlroot,
+ } ) )
+
+ report("creating archive\n\n")
+
+ pushdir(epubpath)
+
+ removefile(epubfile)
+
+ local usedzipper = false
+
+ local function zipped(zipper)
+ local ok = os.execute(format(zipper.uncompressed,epubfile,epubmimetypes))
+ if ok == 0 then
+ os.execute(format(zipper.compressed,epubfile,metapath))
+ os.execute(format(zipper.compressed,epubfile,datapath))
+ usedzipper = zipper.name
+ return true
end
+ end
+
+ -- nice way
+
+ for i=1,#zippers do
+ if os.which(zippers[i].binary) and zipped(zippers[i]) then
+ break
+ end
+ end
- copythem(theimages)
-
- local idmaker = idmakers[file.suffix(root)] or idmakers.default
-
- container = format(container,
- epubroot
- )
- package = format(package,
- identifier,
- title,
- language,
- identifier,
- os.uuid(),
- creator,
- os.date("!%Y-%m-%dT%H:%M:%SZ"),
- idmaker(firstpage),
- concat(used,"\n"),
- idmaker(root)
- )
- toc = format(toc,
- identifier,
- title,
- root
- )
- coverxhtml = format(coverxhtml,
- firstpage
- )
-
- io.savedata(file.join(epubpath,"mimetype"),mimetype)
- io.savedata(file.join(epubpath,"META-INF","container.xml"),container)
- io.savedata(file.join(epubpath,"OEBPS",epubroot),package)
- io.savedata(file.join(epubpath,"OEBPS",epubtoc),toc)
- io.savedata(file.join(epubpath,"OEBPS",epubcover),coverxhtml)
-
- application.report("creating archive\n\n")
-
- lfs.chdir(epubpath)
- os.remove(epubfile)
-
- local done = false
+ -- trial and error
+ if not usedzipper then
for i=1,#zippers do
- local zipper = zippers[i]
- if os.execute(format(zipper.uncompressed,epubfile,"mimetype")) then
- os.execute(format(zipper.compressed,epubfile,"META-INF"))
- os.execute(format(zipper.compressed,epubfile,"OEBPS"))
- done = zipper.name
+ if zipped(zippers[i]) then
break
end
end
+ end
- lfs.chdir("..")
+ popdir()
- if done then
- application.report("epub archive made using %s: %s",done,file.join(epubpath,epubfile))
- else
- local list = { }
- for i=1,#zippers do
- list[#list+1] = zipper.name
- end
- application.report("no epub archive made, install one of: %s",concat(list," "))
+ if usedzipper then
+ local treefile = joinfile(epubpath,epubfile)
+ removefile(epubfile)
+ copyfile(treefile,epubfile)
+ if isfile(epubfile) then
+ removefile(treefile)
end
+ report("epub archive made using %s: %s",usedzipper,epubfile)
+ else
+ local list = { }
+ for i=1,#zippers do
+ list[#list+1] = zippers[i].name
+ end
+ report("no epub archive made, install one of: % | t",list)
+ end
+
+ if reportobsolete(oldfiles,newfiles,purge) then
+ obsolete = true
+ end
+ if obsolete and not purge then
+ report("use --purge to remove obsolete files")
end
end
--
-if environment.argument("make") then
- scripts.epub.make()
-elseif environment.argument("exporthelp") then
- application.export(environment.argument("exporthelp"),environment.files[1])
+local a_exporthelp = environment.argument("exporthelp")
+local a_make = environment.argument("make")
+local a_all = environment.argument("all")
+local a_purge = a_all or environment.argument("purge")
+local a_rename = a_all or environment.argument("rename")
+local a_svgmath = a_all or environment.argument("svgmath")
+local a_svgstyle = environment.argument("svgstyle")
+
+if a_make and a_svgmath then
+ require("x-math-svg")
+end
+
+if a_make then
+ scripts.epub.make(a_purge,a_rename,a_svgmath,a_svgstyle)
+elseif a_exporthelp then
+ application.export(a_exporthelp,environment.files[1])
else
application.help()
end
+
+-- java -jar d:\epubcheck\epubcheck-3.0.1.jar -v 3.0 -mode xhtml mkiv-publications.tree\mkiv-publications.epub
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-fcd.lua b/Master/texmf-dist/scripts/context/lua/mtx-fcd.lua
index 2fcb9a2c7e9..76087cc37ea 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-fcd.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-fcd.lua
@@ -247,7 +247,7 @@ end
local function fcd_find()
found = { }
- pattern = environment.files[1] or ""
+ pattern = lower(environment.files[1] or "")
if pattern ~= "" then
pattern = string.escapedpattern(pattern)
local paths = hash.paths
@@ -255,7 +255,7 @@ local function fcd_find()
local paths = paths[i][2]
for i=1,#paths do
local path = paths[i]
- if find(path,pattern) then
+ if find(lower(path),pattern) then
found[#found+1] = path
end
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-fonts.lua b/Master/texmf-dist/scripts/context/lua/mtx-fonts.lua
index 675d9fb129e..694e6a6496f 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-fonts.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-fonts.lua
@@ -38,7 +38,7 @@ local helpinfo = [[
<flag name="filter" value="list"><short>key-value pairs</short></flag>
<flag name="all"><short>show all found instances (combined with other flags)</short></flag>
<flag name="info"><short>give more details</short></flag>
- <flag name="track" value="list"><short>enable trackers</short></flag>
+ <flag name="trackers" value="list"><short>enable trackers</short></flag>
<flag name="statistics"><short>some info about the database</short></flag>
</subcategory>
</category>
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-interface.lua b/Master/texmf-dist/scripts/context/lua/mtx-interface.lua
index 82cefd63817..1640f0891fd 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-interface.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-interface.lua
@@ -248,7 +248,7 @@ function scripts.interface.editor(editor,split,forcedinterfaces)
local mappings = { }
local environments = { }
local x = xml.load(keyfile)
- for e, d, k in xml.elements(x,"cd:command") do
+ for e, d, k in xml.elements(x,"/cd:interface/cd:commands/cd:command") do -- somehow this was variable
local at = d[k].at
local name, value = at.name, at.value
if name and value then
@@ -256,7 +256,7 @@ function scripts.interface.editor(editor,split,forcedinterfaces)
end
end
local x = xml.load(xmlfile)
- for e, d, k in xml.elements(x,"cd:command") do
+ for e, d, k in xml.elements(x,"/cd:interface/cd:command") do
local at = d[k].at
local name, type = at.name, at["type"]
if name and name ~= "" then
@@ -322,7 +322,7 @@ function scripts.interface.check()
if f then
f:write("\\starttext\n")
local x = xml.load(xmlfile)
- for e, d, k in xml.elements(x,"cd:command") do
+ for e, d, k in xml.elements(x,"/cd:interface/cd:command") do
local dk = d[k]
local at = dk.at
if at then
@@ -384,6 +384,7 @@ function scripts.interface.interfaces()
return a .. b .. c .. b
end)
end
+ -- we could just replace attributes
for language, _ in next, commands.setuplayout do
local texresult, xmlresult = { }, { }
texresult[#texresult+1] = format("%% this file is auto-generated, don't edit this file\n%%")
@@ -403,6 +404,7 @@ function scripts.interface.interfaces()
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:command', 'name', interface.commands, interface.elements, language)
newdata = replace(newdata, 'cd:string', 'value', interface.commands, interface.elements, language)
newdata = replace(newdata, 'cd:variable' , 'value', interface.variables, nil, language)
newdata = replace(newdata, 'cd:parameter', 'name', interface.constants, nil, language)
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-metapost.lua b/Master/texmf-dist/scripts/context/lua/mtx-metapost.lua
index 08daec978dc..6306125d405 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-metapost.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-metapost.lua
@@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['mtx-metapost'] = { -- this was m
license = "see context related readme files"
}
+-- todo: load map files
+
local helpinfo = [[
<?xml version="1.0"?>
<application>
@@ -60,24 +62,42 @@ local function assumes_latex(filename)
return find(d,"\\documentstyle") or find(d,"\\documentclass") or find(d,"\\begin{document}")
end
+local basemaps = "original-base.map,original-ams-base.map,original-ams-euler.map,original-public-lm.map"
+
+local wrapper = "\\starttext\n%s\n%s\\stoptext"
+local loadmap = "\\loadmapfile[%s]\n"
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)
+local function do_mapfiles(mapfiles)
+ local maps = { }
+ for i=1,#mapfiles do
+ local mapfile = mapfiles[i]
+ application.report("using map file %a",mapfile)
+ maps[i] = format(loadmap,mapfile)
+ end
+ return table.concat(maps)
+end
+
+local function do_convert(filename,mapfiles)
if find(filename,".%d+$") or find(filename,"%.mps$") then
- io.savedata(tempname,format(template,filename))
+ local body = format(template,filename)
+ local maps = do_mapfiles(mapfiles)
+ io.savedata(tempname,format(wrapper,maps,body))
local resultname = format("%s-%s.pdf",file.nameonly(filename),file.suffix(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 function do_split(filename,numbers,mapfiles)
local name = file.nameonly(filename)
+ local maps = do_mapfiles(mapfiles)
for i=1,#numbers do
- io.savedata(tempname,format(splitter,file.addsuffix(name,"pdf"),i))
+ local body = format(splitter,file.addsuffix(name,"pdf"),i)
+ io.savedata(tempname,format(wrapper,maps,body))
local resultname = format("%s-%s.pdf",name,numbers[i])
local result = os.execute(format([[context --once --batch --purge --result=%s "%s"]],resultname,tempname))
end
@@ -99,12 +119,12 @@ local function do_texify(str)
return format(texified,str), numbers
end
-local function do_convert_all(filename)
+local function do_convert_all(filename,mapfiles)
local results = dir.glob(file.nameonly(filename) .. ".*") -- reset
local report = { }
for i=1,#results do
local filename = results[i]
- local resultname = do_convert(filename)
+ local resultname = do_convert(filename,mapfiles)
if resultname then
report[#report+1] = { filename, resultname }
end
@@ -121,8 +141,8 @@ local function do_convert_all(filename)
end
end
-local function do_convert_one(filename)
- local resultname = do_convert(filename)
+local function do_convert_one(filename,mapfiles)
+ local resultname = do_convert(filename,mapfiles)
if resultname then
report("%s => %s", filename,resultname)
else
@@ -131,17 +151,13 @@ local function do_convert_one(filename)
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
+ 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 = pattern and dir.glob(file.nameonly(filename)) or environment.files
+ local mapfiles = utilities.parsers.settings_to_array(environment.arguments.mapfiles or basemaps)
if #files > 0 then
for i=1,#files do
local filename = files[i]
@@ -168,16 +184,16 @@ function scripts.mptopdf.convertall()
local done = os.execute(command)
if done then
if convert then
- do_convert_all(filename)
+ do_convert_all(filename,mapfiles)
elseif split then
- do_split(filename,numbers)
+ do_split(filename,numbers,mapfiles)
-- already pdf, maybe optionally split
end
else
report("error while processing mp file '%s'", filename)
end
else
- do_convert_one(filename)
+ do_convert_one(filename,mapfiles)
end
end
else
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-patterns.lua b/Master/texmf-dist/scripts/context/lua/mtx-patterns.lua
index 5e2b2d902ca..efd2e9faf47 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-patterns.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-patterns.lua
@@ -29,6 +29,7 @@ local helpinfo = [[
<flag name="specification"><short>additional patterns: e.g.: =cy,hyph-cy,welsh</short></flag>
<flag name="compress"><short>compress data</short></flag>
<flag name="words"><short>update words in given file</short></flag>
+ <flag name="hyphenate"><short>show hypephenated words</short></flag>
</subcategory>
</category>
</flags>
@@ -40,6 +41,7 @@ local helpinfo = [[
<example><command>mtxrun --script pattern --check --path=c:/data/develop/svn-hyphen/trunk/hyph-utf8/tex/generic/hyph-utf8/patterns</command></example>
<example><command>mtxrun --script pattern --convert --path=c:/data/develop/svn-hyphen/trunk/hyph-utf8/tex/generic/hyph-utf8/patterns/tex --destination=e:/tmp/patterns</command></example>
<example><command>mtxrun --script pattern --convert --path=c:/data/develop/svn-hyphen/trunk/hyph-utf8/tex/generic/hyph-utf8/patterns/txt --destination=e:/tmp/patterns</command></example>
+ <example><command>mtxrun --script pattern --hyphenate --language=nl --left=3 nogalwiedes inderdaad</command></example>
</subcategory>
</category>
</examples>
@@ -625,6 +627,49 @@ function scripts.patterns.words()
end
end
+-- mtxrun --script patterns --hyphenate --language=nl nogalwiedes --left=3
+--
+-- hyphenator |
+-- hyphenator | . n o g a l w i e d e s . . n o g a l w i e d e s .
+-- hyphenator | .0n4 0 4 0 0 0 0 0 0 0 0 0 0
+-- hyphenator | 0o0g0a4l0 0 4 0 0 4 0 0 0 0 0 0 0
+-- hyphenator | 1g0a0 0 4 1 0 4 0 0 0 0 0 0 0
+-- hyphenator | 0l1w0 0 4 1 0 4 1 0 0 0 0 0 0
+-- hyphenator | 4i0e0 0 4 1 0 4 1 4 0 0 0 0 0
+-- hyphenator | 0i0e3d0e0 0 4 1 0 4 1 4 0 3 0 0 0
+-- hyphenator | 0e1d0 0 4 1 0 4 1 4 0 3 0 0 0
+-- hyphenator | 1d0e0 0 4 1 0 4 1 4 0 3 0 0 0
+-- hyphenator | 0d0e2s0 0 4 1 0 4 1 4 0 3 0 2 0
+-- hyphenator | 4s0. 0 4 1 0 4 1 4 0 3 0 4 0
+-- hyphenator | .0n4o1g0a4l1w4i0e3d0e4s0. . n o-g a l-w i e-d e s .
+-- hyphenator |
+-- mtx-patterns | nl 3 3 : nogalwiedes : nogal-wie-des
+
+function scripts.patterns.hyphenate()
+ require("lang-hyp")
+ local traditional = languages.hyphenators.traditional
+ local left = tonumber(environment.arguments.left) or 3
+ local right = tonumber(environment.arguments.right) or 3
+ local language = environment.arguments.language or "us"
+ local dictionary = traditional.loadpatterns(language)
+ local words = environment.files
+ local specification = {
+ leftcharmin = left,
+ rightcharmin = right,
+ leftchar = false,
+ rightchar = false,
+ }
+ trackers.enable("hyphenator.steps")
+ for i=1,#words do
+ local word = words[i]
+ report("%s %s %s : %s : %s",
+ language, left, right,
+ word,
+ traditional.injecthyphens(dictionary,word,specification)
+ )
+ end
+end
+
if environment.argument("check") then
scripts.patterns.prepare()
scripts.patterns.check()
@@ -633,6 +678,8 @@ elseif environment.argument("convert") then
scripts.patterns.convert()
elseif environment.argument("words") then
scripts.patterns.words() -- for the moment here
+elseif environment.argument("hyphenate") then
+ scripts.patterns.hyphenate() -- for the moment here
elseif environment.argument("exporthelp") then
application.export(environment.argument("exporthelp"),environment.files[1])
else
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-server.lua b/Master/texmf-dist/scripts/context/lua/mtx-server.lua
index 5466bfe80a2..dba07f1d584 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-server.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-server.lua
@@ -278,6 +278,20 @@ handlers.html = handlers.htm
local indices = { "index.htm", "index.html" }
local portnumber = 31415 -- pi suits tex
+local newline = lpeg.patterns.newline
+local spacer = lpeg.patterns.spacer
+local whitespace = lpeg.patterns.whitespace
+local method = lpeg.P("GET")
+ + lpeg.P("POST")
+local identify = (1-method)^0
+ * lpeg.C(method)
+ * spacer^1
+ * lpeg.C((1-spacer)^1)
+ * spacer^1
+ * lpeg.P("HTTP/")
+ * (1-whitespace)^0
+ * lpeg.C(lpeg.P(1)^0)
+
function scripts.webserver.run(configuration)
-- check configuration
configuration.port = tonumber(configuration.port or os.getenv("MTX_SERVER_PORT") or portnumber) or portnumber
@@ -329,17 +343,24 @@ function scripts.webserver.run(configuration)
local from = client:getpeername()
report("request from: %s",tostring(from))
report("request data: %s",tostring(request))
- local fullurl = string.match(request,"GET (.+) HTTP/.*$") or "" -- todo: more clever / post
- if fullurl == "" then
+ -- local fullurl = string.match(request,"(GET) (.+) HTTP/.*$") or "" -- todo: more clever / post
+ -- if fullurl == "" then
+-- print("!!!!",request)
+ local method, fullurl, body = lpeg.match(identify,request)
+ if method == "" or fullurl == "" then
report("no url")
errormessage(client,configuration,404)
else
+
+ -- todo: method: POST
+
fullurl = url.unescapeget(fullurl)
report("requested url: %s",fullurl)
-- fullurl = socket.url.unescape(fullurl) -- happens later
local hashed = url.hashed(fullurl)
local query = url.query(hashed.query)
local filename = hashed.path -- hm, not query?
+ hashed.body = body
if script then
filename = script
report("forced script: %s",filename)
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-update.lua b/Master/texmf-dist/scripts/context/lua/mtx-update.lua
index aedc48041e3..daf4f5b16ef 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-update.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-update.lua
@@ -183,6 +183,8 @@ scripts.update.platforms = {
["linux-64"] = "linux-64",
["linux64"] = "linux-64",
--
+ ["linux-armhf"] = "linux-armhf",
+ --
["freebsd"] = "freebsd",
--
["freebsd-amd64"] = "freebsd-amd64",
diff --git a/Master/texmf-dist/scripts/context/lua/mtxrun.lua b/Master/texmf-dist/scripts/context/lua/mtxrun.lua
index 5cb5c8d2416..48a9a27a250 100755
--- a/Master/texmf-dist/scripts/context/lua/mtxrun.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtxrun.lua
@@ -56,7 +56,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lua"] = package.loaded["l-lua"] or true
--- original size: 3409, stripped down to: 1763
+-- original size: 3888, stripped down to: 2197
if not modules then modules={} end modules ['l-lua']={
version=1.001,
@@ -139,6 +139,13 @@ end
if lua then
lua.mask=load([[τεχ = 1]]) and "utf" or "ascii"
end
+local flush=io.flush
+if flush then
+ local execute=os.execute if execute then function os.execute(...) flush() return execute(...) end end
+ local exec=os.exec if exec then function os.exec (...) flush() return exec (...) end end
+ local spawn=os.spawn if spawn then function os.spawn (...) flush() return spawn (...) end end
+ local popen=io.popen if popen then function io.popen (...) flush() return popen (...) end end
+end
end -- of closure
@@ -437,7 +444,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lpeg"] = package.loaded["l-lpeg"] or true
--- original size: 29983, stripped down to: 16202
+-- original size: 36225, stripped down to: 19891
if not modules then modules={} end modules ['l-lpeg']={
version=1.001,
@@ -498,6 +505,8 @@ patterns.utfbom_16_le=utfbom_16_le
patterns.utfbom_8=utfbom_8
patterns.utf_16_be_nl=P("\000\r\000\n")+P("\000\r")+P("\000\n")
patterns.utf_16_le_nl=P("\r\000\n\000")+P("\r\000")+P("\n\000")
+patterns.utf_32_be_nl=P("\000\000\000\r\000\000\000\n")+P("\000\000\000\r")+P("\000\000\000\n")
+patterns.utf_32_le_nl=P("\r\000\000\000\n\000\000\000")+P("\r\000\000\000")+P("\n\000\000\000")
patterns.utf8one=R("\000\127")
patterns.utf8two=R("\194\223")*utf8next
patterns.utf8three=R("\224\239")*utf8next*utf8next
@@ -527,9 +536,21 @@ patterns.nonwhitespace=nonwhitespace
local stripper=spacer^0*C((spacer^0*nonspacer^1)^0)
local fullstripper=whitespace^0*C((whitespace^0*nonwhitespace^1)^0)
local collapser=Cs(spacer^0/""*nonspacer^0*((spacer^0/" "*nonspacer^1)^0))
+local b_collapser=Cs(whitespace^0/""*(nonwhitespace^1+whitespace^1/" ")^0)
+local e_collapser=Cs((whitespace^1*P(-1)/""+nonwhitespace^1+whitespace^1/" ")^0)
+local m_collapser=Cs((nonwhitespace^1+whitespace^1/" ")^0)
+local b_stripper=Cs(spacer^0/""*(nonspacer^1+spacer^1/" ")^0)
+local e_stripper=Cs((spacer^1*P(-1)/""+nonspacer^1+spacer^1/" ")^0)
+local m_stripper=Cs((nonspacer^1+spacer^1/" ")^0)
patterns.stripper=stripper
patterns.fullstripper=fullstripper
patterns.collapser=collapser
+patterns.b_collapser=b_collapser
+patterns.m_collapser=m_collapser
+patterns.e_collapser=e_collapser
+patterns.b_stripper=b_stripper
+patterns.m_stripper=m_stripper
+patterns.e_stripper=e_stripper
patterns.lowercase=lowercase
patterns.uppercase=uppercase
patterns.letter=patterns.lowercase+patterns.uppercase
@@ -566,9 +587,12 @@ patterns.integer=sign^-1*digit^1
patterns.unsigned=digit^0*period*digit^1
patterns.float=sign^-1*patterns.unsigned
patterns.cunsigned=digit^0*comma*digit^1
+patterns.cpunsigned=digit^0*(period+comma)*digit^1
patterns.cfloat=sign^-1*patterns.cunsigned
+patterns.cpfloat=sign^-1*patterns.cpunsigned
patterns.number=patterns.float+patterns.integer
patterns.cnumber=patterns.cfloat+patterns.integer
+patterns.cpnumber=patterns.cpfloat+patterns.integer
patterns.oct=zero*octdigit^1
patterns.octal=patterns.oct
patterns.HEX=zero*P("X")*(digit+uppercase)^1
@@ -985,23 +1009,40 @@ function lpeg.append(list,pp,delayed,checked)
end
return p
end
+local p_false=P(false)
+local p_true=P(true)
local function make(t)
- local p
+ local function making(t)
+ local p=p_false
+ local keys=sortedkeys(t)
+ for i=1,#keys do
+ local k=keys[i]
+ if k~="" then
+ local v=t[k]
+ if v==true then
+ p=p+P(k)*p_true
+ elseif v==false then
+ else
+ p=p+P(k)*making(v)
+ end
+ end
+ end
+ if t[""] then
+ p=p+p_true
+ end
+ return p
+ end
+ local p=p_false
local keys=sortedkeys(t)
for i=1,#keys do
local k=keys[i]
- local v=t[k]
- if not p then
- if next(v) then
- p=P(k)*make(v)
- else
- p=P(k)
- end
- else
- if next(v) then
- p=p+P(k)*make(v)
+ if k~="" then
+ local v=t[k]
+ if v==true then
+ p=p+P(k)*p_true
+ elseif v==false then
else
- p=p+P(k)
+ p=p+P(k)*making(v)
end
end
end
@@ -1009,13 +1050,73 @@ local function make(t)
end
function lpeg.utfchartabletopattern(list)
local tree={}
- for i=1,#list do
- local t=tree
- for c in gmatch(list[i],".") do
- if not t[c] then
- t[c]={}
+ local n=#list
+ if n==0 then
+ for s in next,list do
+ local t=tree
+ local p,pk
+ for c in gmatch(s,".") do
+ if t==true then
+ t={ [c]=true,[""]=true }
+ p[pk]=t
+ p=t
+ t=false
+ elseif t==false then
+ t={ [c]=false }
+ p[pk]=t
+ p=t
+ t=false
+ else
+ local tc=t[c]
+ if not tc then
+ tc=false
+ t[c]=false
+ end
+ p=t
+ t=tc
+ end
+ pk=c
+ end
+ if t==false then
+ p[pk]=true
+ elseif t==true then
+ else
+ t[""]=true
+ end
+ end
+ else
+ for i=1,n do
+ local s=list[i]
+ local t=tree
+ local p,pk
+ for c in gmatch(s,".") do
+ if t==true then
+ t={ [c]=true,[""]=true }
+ p[pk]=t
+ p=t
+ t=false
+ elseif t==false then
+ t={ [c]=false }
+ p[pk]=t
+ p=t
+ t=false
+ else
+ local tc=t[c]
+ if not tc then
+ tc=false
+ t[c]=false
+ end
+ p=t
+ t=tc
+ end
+ pk=c
+ end
+ if t==false then
+ p[pk]=true
+ elseif t==true then
+ else
+ t[""]=true
end
- t=t[c]
end
end
return make(tree)
@@ -1055,6 +1156,65 @@ local case_2=period*(digit-trailingzeros)^1*(trailingzeros/"")
local number=digit^1*(case_1+case_2)
local stripper=Cs((number+1)^0)
lpeg.patterns.stripzeros=stripper
+local byte_to_HEX={}
+local byte_to_hex={}
+local byte_to_dec={}
+local hex_to_byte={}
+for i=0,255 do
+ local H=format("%02X",i)
+ local h=format("%02x",i)
+ local d=format("%03i",i)
+ local c=char(i)
+ byte_to_HEX[c]=H
+ byte_to_hex[c]=h
+ byte_to_dec[c]=d
+ hex_to_byte[h]=c
+ hex_to_byte[H]=c
+end
+local hextobyte=P(2)/hex_to_byte
+local bytetoHEX=P(1)/byte_to_HEX
+local bytetohex=P(1)/byte_to_hex
+local bytetodec=P(1)/byte_to_dec
+local hextobytes=Cs(hextobyte^0)
+local bytestoHEX=Cs(bytetoHEX^0)
+local bytestohex=Cs(bytetohex^0)
+local bytestodec=Cs(bytetodec^0)
+patterns.hextobyte=hextobyte
+patterns.bytetoHEX=bytetoHEX
+patterns.bytetohex=bytetohex
+patterns.bytetodec=bytetodec
+patterns.hextobytes=hextobytes
+patterns.bytestoHEX=bytestoHEX
+patterns.bytestohex=bytestohex
+patterns.bytestodec=bytestodec
+function string.toHEX(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(bytestoHEX,s)
+ end
+end
+function string.tohex(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(bytestohex,s)
+ end
+end
+function string.todec(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(bytestodec,s)
+ end
+end
+function string.tobytes(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(hextobytes,s)
+ end
+end
end -- of closure
@@ -1082,7 +1242,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-string"] = package.loaded["l-string"] or true
--- original size: 5671, stripped down to: 2827
+-- original size: 5694, stripped down to: 2827
if not modules then modules={} end modules ['l-string']={
version=1.001,
@@ -1187,7 +1347,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-table"] = package.loaded["l-table"] or true
--- original size: 31860, stripped down to: 20846
+-- original size: 33830, stripped down to: 21894
if not modules then modules={} end modules ['l-table']={
version=1.001,
@@ -1230,11 +1390,12 @@ function table.keys(t)
end
end
local function compare(a,b)
- local ta,tb=type(a),type(b)
- if ta==tb then
+ local ta=type(a)
+ local tb=type(b)
+ if ta==tb and ta=="number" then
return a<b
else
- return tostring(a)<tostring(b)
+ return tostring(a)<tostring(b)
end
end
local function sortedkeys(tab)
@@ -1334,14 +1495,14 @@ local function sortedhash(t,cmp)
end
local n=0
local m=#s
- local function kv(s)
+ local function kv()
if n<m then
n=n+1
local k=s[n]
return k,t[k]
end
end
- return kv,s
+ return kv
else
return nothing
end
@@ -1506,7 +1667,7 @@ local function simple_table(t)
if tv=="number" then
nt=nt+1
if hexify then
- tt[nt]=format("0x%04X",v)
+ tt[nt]=format("0x%X",v)
else
tt[nt]=tostring(v)
end
@@ -1537,7 +1698,7 @@ local function do_serialize(root,name,depth,level,indexed)
local tn=type(name)
if tn=="number" then
if hexify then
- handle(format("%s[0x%04X]={",depth,name))
+ handle(format("%s[0x%X]={",depth,name))
else
handle(format("%s[%s]={",depth,name))
end
@@ -1554,7 +1715,7 @@ local function do_serialize(root,name,depth,level,indexed)
end
end
end
- if root and next(root) then
+ if root and next(root)~=nil then
local first,last=nil,0
if compact then
last=#root
@@ -1576,7 +1737,7 @@ local function do_serialize(root,name,depth,level,indexed)
if compact and first and tk=="number" and k>=first and k<=last then
if tv=="number" then
if hexify then
- handle(format("%s 0x%04X,",depth,v))
+ handle(format("%s 0x%X,",depth,v))
else
handle(format("%s %s,",depth,v))
end
@@ -1587,7 +1748,7 @@ local function do_serialize(root,name,depth,level,indexed)
handle(format("%s %q,",depth,v))
end
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
handle(format("%s {},",depth))
elseif inline then
local st=simple_table(v)
@@ -1617,25 +1778,25 @@ local function do_serialize(root,name,depth,level,indexed)
elseif tv=="number" then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=0x%04X,",depth,k,v))
+ handle(format("%s [0x%X]=0x%X,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
elseif tk=="boolean" then
if hexify then
- handle(format("%s [%s]=0x%04X,",depth,k and "true" or "false",v))
+ handle(format("%s [%s]=0x%X,",depth,k and "true" or "false",v))
else
handle(format("%s [%s]=%s,",depth,k and "true" or "false",v))
end
elseif noquotes and not reserved[k] and lpegmatch(propername,k) then
if hexify then
- handle(format("%s %s=0x%04X,",depth,k,v))
+ handle(format("%s %s=0x%X,",depth,k,v))
else
handle(format("%s %s=%s,",depth,k,v))
end
else
if hexify then
- handle(format("%s [%q]=0x%04X,",depth,k,v))
+ handle(format("%s [%q]=0x%X,",depth,k,v))
else
handle(format("%s [%q]=%s,",depth,k,v))
end
@@ -1644,7 +1805,7 @@ local function do_serialize(root,name,depth,level,indexed)
if reduce and tonumber(v) then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%s,",depth,k,v))
+ handle(format("%s [0x%X]=%s,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
@@ -1658,7 +1819,7 @@ local function do_serialize(root,name,depth,level,indexed)
else
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%q,",depth,k,v))
+ handle(format("%s [0x%X]=%q,",depth,k,v))
else
handle(format("%s [%s]=%q,",depth,k,v))
end
@@ -1671,10 +1832,10 @@ local function do_serialize(root,name,depth,level,indexed)
end
end
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]={},",depth,k))
+ handle(format("%s [0x%X]={},",depth,k))
else
handle(format("%s [%s]={},",depth,k))
end
@@ -1690,7 +1851,7 @@ local function do_serialize(root,name,depth,level,indexed)
if st then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]={ %s },",depth,k,concat(st,", ")))
+ handle(format("%s [0x%X]={ %s },",depth,k,concat(st,", ")))
else
handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
end
@@ -1710,7 +1871,7 @@ local function do_serialize(root,name,depth,level,indexed)
elseif tv=="boolean" then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%s,",depth,k,v and "true" or "false"))
+ handle(format("%s [0x%X]=%s,",depth,k,v and "true" or "false"))
else
handle(format("%s [%s]=%s,",depth,k,v and "true" or "false"))
end
@@ -1726,7 +1887,7 @@ local function do_serialize(root,name,depth,level,indexed)
local f=getinfo(v).what=="C" and dump(dummy) or dump(v)
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=load(%q),",depth,k,f))
+ handle(format("%s [0x%X]=load(%q),",depth,k,f))
else
handle(format("%s [%s]=load(%q),",depth,k,f))
end
@@ -1741,7 +1902,7 @@ local function do_serialize(root,name,depth,level,indexed)
else
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%q,",depth,k,tostring(v)))
+ handle(format("%s [0x%X]=%q,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%q,",depth,k,tostring(v)))
end
@@ -1795,7 +1956,7 @@ local function serialize(_handle,root,name,specification)
end
elseif tname=="number" then
if hexify then
- handle(format("[0x%04X]={",name))
+ handle(format("[0x%X]={",name))
else
handle("["..name.."]={")
end
@@ -1813,7 +1974,7 @@ local function serialize(_handle,root,name,specification)
local dummy=root._w_h_a_t_e_v_e_r_
root._w_h_a_t_e_v_e_r_=nil
end
- if next(root) then
+ if next(root)~=nil then
do_serialize(root,name,"",0)
end
end
@@ -1942,14 +2103,25 @@ local function identical(a,b)
end
table.identical=identical
table.are_equal=are_equal
-function table.compact(t)
- if t then
- for k,v in next,t do
- if not next(v) then
- t[k]=nil
+local function sparse(old,nest,keeptables)
+ local new={}
+ for k,v in next,old do
+ if not (v=="" or v==false) then
+ if nest and type(v)=="table" then
+ v=sparse(v,nest)
+ if keeptables or next(v)~=nil then
+ new[k]=v
+ end
+ else
+ new[k]=v
end
end
end
+ return new
+end
+table.sparse=sparse
+function table.compact(t)
+ return sparse(t,true,true)
end
function table.contains(t,v)
if t then
@@ -2054,10 +2226,10 @@ function table.sub(t,i,j)
return { unpack(t,i,j) }
end
function table.is_empty(t)
- return not t or not next(t)
+ return not t or next(t)==nil
end
function table.has_one_entry(t)
- return t and not next(t,next(t))
+ return t and next(t,next(t))==nil
end
function table.loweredkeys(t)
local l={}
@@ -2102,6 +2274,44 @@ function table.values(t,s)
return {}
end
end
+function table.filtered(t,pattern,sort,cmp)
+ if t and type(pattern)=="string" then
+ if sort then
+ local s
+ if cmp then
+ s=sortedhashkeys(t,function(a,b) return cmp(t,a,b) end)
+ else
+ s=sortedkeys(t)
+ end
+ local n=0
+ local m=#s
+ local function kv(s)
+ while n<m do
+ n=n+1
+ local k=s[n]
+ if find(k,pattern) then
+ return k,t[k]
+ end
+ end
+ end
+ return kv,s
+ else
+ local n=next(t)
+ local function iterator()
+ while n~=nil do
+ local k=n
+ n=next(t,k)
+ if find(k,pattern) then
+ return k,t[k]
+ end
+ end
+ end
+ return iterator,t
+ end
+ else
+ return nothing
+ end
+end
end -- of closure
@@ -2110,7 +2320,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-io"] = package.loaded["l-io"] or true
--- original size: 8824, stripped down to: 6347
+-- original size: 8643, stripped down to: 6232
if not modules then modules={} end modules ['l-io']={
version=1.001,
@@ -2417,8 +2627,6 @@ function io.readstring(f,n,m)
local str=gsub(f:read(n),"\000","")
return str
end
-if not io.i_limiter then function io.i_limiter() end end
-if not io.o_limiter then function io.o_limiter() end end
end -- of closure
@@ -2645,7 +2853,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-os"] = package.loaded["l-os"] or true
--- original size: 16093, stripped down to: 9704
+-- original size: 15761, stripped down to: 9403
if not modules then modules={} end modules ['l-os']={
version=1.001,
@@ -2719,13 +2927,10 @@ if not os.__getenv__ then
setmetatable(os.env,{ __index=__index,__newindex=__newindex } )
end
end
-local execute,spawn,exec,iopopen,ioflush=os.execute,os.spawn or os.execute,os.exec or os.execute,io.popen,io.flush
-function os.execute(...) ioflush() return execute(...) end
-function os.spawn (...) ioflush() return spawn (...) end
-function os.exec (...) ioflush() return exec (...) end
-function io.popen (...) ioflush() return iopopen(...) end
+local execute=os.execute
+local iopopen=io.popen
function os.resultof(command)
- local handle=io.popen(command,"r")
+ local handle=iopopen(command,"r")
if handle then
local result=handle:read("*all") or ""
handle:close()
@@ -2754,7 +2959,7 @@ local launchers={
unix="$BROWSER %s &> /dev/null &",
}
function os.launch(str)
- os.execute(format(launchers[os.name] or launchers.unix,str))
+ execute(format(launchers[os.name] or launchers.unix,str))
end
if not os.times then
function os.times()
@@ -3029,7 +3234,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-file"] = package.loaded["l-file"] or true
--- original size: 18308, stripped down to: 9948
+-- original size: 20949, stripped down to: 9945
if not modules then modules={} end modules ['l-file']={
version=1.001,
@@ -3043,41 +3248,28 @@ local file=file
if not lfs then
lfs=optionalrequire("lfs")
end
-if not lfs then
- lfs={
- getcurrentdir=function()
- return "."
- end,
- attributes=function()
- return nil
- end,
- isfile=function(name)
- local f=io.open(name,'rb')
- if f then
- f:close()
- return true
- end
- end,
- isdir=function(name)
- print("you need to load lfs")
- return false
- end
- }
-elseif not lfs.isfile then
- local attributes=lfs.attributes
- function lfs.isdir(name)
- return attributes(name,"mode")=="directory"
- end
- function lfs.isfile(name)
- return attributes(name,"mode")=="file"
- end
-end
local insert,concat=table.insert,table.concat
local match,find,gmatch=string.match,string.find,string.gmatch
local lpegmatch=lpeg.match
local getcurrentdir,attributes=lfs.currentdir,lfs.attributes
local checkedsplit=string.checkedsplit
local P,R,S,C,Cs,Cp,Cc,Ct=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Cs,lpeg.Cp,lpeg.Cc,lpeg.Ct
+local tricky=S("/\\")*P(-1)
+local attributes=lfs.attributes
+if sandbox then
+ sandbox.redefine(lfs.isfile,"lfs.isfile")
+ sandbox.redefine(lfs.isdir,"lfs.isdir")
+end
+function lfs.isdir(name)
+ if lpegmatch(tricky,name) then
+ return attributes(name,"mode")=="directory"
+ else
+ return attributes(name.."/.","mode")=="directory"
+ end
+end
+function lfs.isfile(name)
+ return attributes(name,"mode")=="file"
+end
local colon=P(":")
local period=P(".")
local periods=P("..")
@@ -3279,28 +3471,30 @@ local isroot=fwslash^1*-1
local hasroot=fwslash^1
local reslasher=lpeg.replacer(S("\\/"),"/")
local deslasher=lpeg.replacer(S("\\/")^1,"/")
-function file.join(...)
- local lst={... }
- local one=lst[1]
+function file.join(one,two,three,...)
+ if not two then
+ return one=="" and one or lpegmatch(stripper,one)
+ end
+ if one=="" then
+ return lpegmatch(stripper,three and concat({ two,three,... },"/") or two)
+ end
if lpegmatch(isnetwork,one) then
local one=lpegmatch(reslasher,one)
- local two=lpegmatch(deslasher,concat(lst,"/",2))
+ local two=lpegmatch(deslasher,three and concat({ two,three,... },"/") or two)
if lpegmatch(hasroot,two) then
return one..two
else
return one.."/"..two
end
elseif lpegmatch(isroot,one) then
- local two=lpegmatch(deslasher,concat(lst,"/",2))
+ local two=lpegmatch(deslasher,three and concat({ two,three,... },"/") or two)
if lpegmatch(hasroot,two) then
return two
else
return "/"..two
end
- elseif one=="" then
- return lpegmatch(stripper,concat(lst,"/",2))
else
- return lpegmatch(deslasher,concat(lst,"/"))
+ return lpegmatch(deslasher,concat({ one,two,three,... },"/"))
end
end
local drivespec=R("az","AZ")^1*colon
@@ -3474,7 +3668,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-md5"] = package.loaded["l-md5"] or true
--- original size: 3760, stripped down to: 2088
+-- original size: 3248, stripped down to: 2266
if not modules then modules={} end modules ['l-md5']={
version=1.001,
@@ -3492,14 +3686,20 @@ if not md5 then
}
end
local md5,file=md5,file
-local gsub,format,byte=string.gsub,string.format,string.byte
-local md5sum=md5.sum
-local function convert(str,fmt)
- return (gsub(md5sum(str),".",function(chr) return format(fmt,byte(chr)) end))
-end
-if not md5.HEX then function md5.HEX(str) return convert(str,"%02X") end end
-if not md5.hex then function md5.hex(str) return convert(str,"%02x") end end
-if not md5.dec then function md5.dec(str) return convert(str,"%03i") end end
+local gsub=string.gsub
+do
+ local patterns=lpeg and lpeg.patterns
+ if patterns then
+ local bytestoHEX=patterns.bytestoHEX
+ local bytestohex=patterns.bytestohex
+ local bytestodec=patterns.bytestodec
+ local lpegmatch=lpeg.match
+ local md5sum=md5.sum
+ if not md5.HEX then function md5.HEX(str) if str then return lpegmatch(bytestoHEX,md5sum(str)) end end end
+ if not md5.hex then function md5.hex(str) if str then return lpegmatch(bytestohex,md5sum(str)) end end end
+ if not md5.dec then function md5.dec(str) if str then return lpegmatch(bytestodec,md5sum(str)) end end end
+ end
+end
function file.needsupdating(oldname,newname,threshold)
local oldtime=lfs.attributes(oldname,"modification")
if oldtime then
@@ -3556,7 +3756,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-url"] = package.loaded["l-url"] or true
--- original size: 12292, stripped down to: 5585
+-- original size: 12531, stripped down to: 5721
if not modules then modules={} end modules ['l-url']={
version=1.001,
@@ -3642,19 +3842,25 @@ local splitquery=Cf (Ct("")*P { "sequence",
pair=Cg(key*equal*value),
},rawset)
local function hashed(str)
- if str=="" then
+ if not str or str=="" then
return {
scheme="invalid",
original=str,
}
end
- local s=split(str)
- local rawscheme=s[1]
- local rawquery=s[4]
- local somescheme=rawscheme~=""
- local somequery=rawquery~=""
+ local detailed=split(str)
+ local rawscheme=""
+ local rawquery=""
+ local somescheme=false
+ local somequery=false
+ if detailed then
+ rawscheme=detailed[1]
+ rawquery=detailed[4]
+ somescheme=rawscheme~=""
+ somequery=rawquery~=""
+ end
if not somescheme and not somequery then
- s={
+ return {
scheme="file",
authority="",
path=str,
@@ -3664,28 +3870,28 @@ local function hashed(str)
noscheme=true,
filename=str,
}
- else
- local authority,path,filename=s[2],s[3]
- if authority=="" then
- filename=path
- elseif path=="" then
- filename=""
- else
- filename=authority.."/"..path
- end
- s={
- scheme=rawscheme,
- authority=authority,
- path=path,
- query=lpegmatch(unescaper,rawquery),
- queries=lpegmatch(splitquery,rawquery),
- fragment=s[5],
- original=str,
- noscheme=false,
- filename=filename,
- }
end
- return s
+ local authority=detailed[2]
+ local path=detailed[3]
+ local filename=nil
+ if authority=="" then
+ filename=path
+ elseif path=="" then
+ filename=""
+ else
+ filename=authority.."/"..path
+ end
+ return {
+ scheme=rawscheme,
+ authority=authority,
+ path=path,
+ query=lpegmatch(unescaper,rawquery),
+ queries=lpegmatch(splitquery,rawquery),
+ fragment=detailed[5],
+ original=str,
+ noscheme=false,
+ filename=filename,
+ }
end
url.split=split
url.hasscheme=hasscheme
@@ -3719,7 +3925,7 @@ function url.construct(hash)
end
return lpegmatch(escaper,concat(fullurl))
end
-local pattern=Cs(noslash*R("az","AZ")*(S(":|")/":")*noslash*P(1)^0)
+local pattern=Cs(slash^-1/""*R("az","AZ")*((S(":|")/":")+P(":"))*slash*P(1)^0)
function url.filename(filename)
local spec=hashed(filename)
local path=spec.path
@@ -3767,7 +3973,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-dir"] = package.loaded["l-dir"] or true
--- original size: 14788, stripped down to: 9096
+-- original size: 16765, stripped down to: 11003
if not modules then modules={} end modules ['l-dir']={
version=1.001,
@@ -3777,7 +3983,7 @@ if not modules then modules={} end modules ['l-dir']={
license="see context related readme files"
}
local type,select=type,select
-local find,gmatch,match,gsub=string.find,string.gmatch,string.match,string.gsub
+local find,gmatch,match,gsub,sub=string.find,string.gmatch,string.match,string.gsub,string.sub
local concat,insert,remove,unpack=table.concat,table.insert,table.remove,table.unpack
local lpegmatch=lpeg.match
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
@@ -3786,53 +3992,126 @@ local dir=dir
local lfs=lfs
local attributes=lfs.attributes
local walkdir=lfs.dir
-local isdir=lfs.isdir
-local isfile=lfs.isfile
+local isdir=lfs.isdir
+local isfile=lfs.isfile
local currentdir=lfs.currentdir
local chdir=lfs.chdir
local mkdir=lfs.mkdir
local onwindows=os.type=="windows" or find(os.getenv("PATH"),";",1,true)
-if not isdir then
- function isdir(name)
- local a=attributes(name)
- return a and a.mode=="directory"
+if onwindows then
+ local tricky=S("/\\")*P(-1)
+ isdir=function(name)
+ if lpegmatch(tricky,name) then
+ return attributes(name,"mode")=="directory"
+ else
+ return attributes(name.."/.","mode")=="directory"
+ end
+ end
+ isfile=function(name)
+ return attributes(name,"mode")=="file"
end
lfs.isdir=isdir
-end
-if not isfile then
- function isfile(name)
- local a=attributes(name)
- return a and a.mode=="file"
+ lfs.isfile=isfile
+else
+ isdir=function(name)
+ return attributes(name,"mode")=="directory"
end
+ isfile=function(name)
+ return attributes(name,"mode")=="file"
+ end
+ lfs.isdir=isdir
lfs.isfile=isfile
end
function dir.current()
return (gsub(currentdir(),"\\","/"))
end
-local lfsisdir=isdir
-local function isdir(path)
- path=gsub(path,"[/\\]+$","")
- return lfsisdir(path)
+local function glob_pattern_function(path,patt,recurse,action)
+ if isdir(path) then
+ local usedpath
+ if path=="/" then
+ usedpath="/."
+ elseif not find(path,"/$") then
+ usedpath=path.."/."
+ path=path.."/"
+ else
+ usedpath=path
+ end
+ local dirs
+ for name in walkdir(usedpath) do
+ if name~="." and name~=".." then
+ local full=path..name
+ local mode=attributes(full,'mode')
+ if mode=='file' then
+ if not patt or find(full,patt) then
+ action(full)
+ end
+ elseif recurse and mode=="directory" then
+ if not dirs then
+ dirs={ full }
+ else
+ dirs[#dirs+1]=full
+ end
+ end
+ end
+ end
+ if dirs then
+ for i=1,#dirs do
+ glob_pattern_function(dirs[i],patt,recurse,action)
+ end
+ end
+ end
end
-lfs.isdir=isdir
-local function globpattern(path,patt,recurse,action)
- if path=="/" then
- path=path.."."
- elseif not find(path,"/$") then
- path=path..'/'
- end
- if isdir(path) then
- for name in walkdir(path) do
- local full=path..name
- local mode=attributes(full,'mode')
- if mode=='file' then
- if find(full,patt) then
- action(full)
+local function glob_pattern_table(path,patt,recurse,result)
+ if not result then
+ result={}
+ end
+ if isdir(path) then
+ local usedpath
+ if path=="/" then
+ usedpath="/."
+ elseif not find(path,"/$") then
+ usedpath=path.."/."
+ path=path.."/"
+ else
+ usedpath=path
+ end
+ local dirs
+ for name in walkdir(usedpath) do
+ if name~="." and name~=".." then
+ local full=path..name
+ local mode=attributes(full,'mode')
+ if mode=='file' then
+ if not patt or find(full,patt) then
+ result[#result+1]=full
+ end
+ elseif recurse and mode=="directory" then
+ if not dirs then
+ dirs={ full }
+ else
+ dirs[#dirs+1]=full
+ end
end
- elseif recurse and (mode=="directory") and (name~='.') and (name~="..") then
- globpattern(full,patt,recurse,action)
end
end
+ if dirs then
+ for i=1,#dirs do
+ glob_pattern_table(dirs[i],patt,recurse,result)
+ end
+ end
+ end
+ return result
+end
+local function globpattern(path,patt,recurse,method)
+ local kind=type(method)
+ if patt and sub(patt,1,-3)==path then
+ patt=false
+ end
+ if kind=="function" then
+ return glob_pattern_function(path,patt,recurse,method)
+ elseif kind=="table" then
+ return glob_pattern_table(path,patt,recurse,method)
+ else
+ return glob_pattern_table(path,patt,recurse,{})
end
end
dir.globpattern=globpattern
@@ -3845,34 +4124,40 @@ local function collectpattern(path,patt,recurse,result)
ok,scanner,first=xpcall(function() return walkdir(path) end,function() end)
end
if ok and type(scanner)=="function" then
- if not find(path,"/$") then path=path..'/' end
+ if not find(path,"/$") then
+ path=path..'/'
+ end
for name in scanner,first do
- local full=path..name
- local attr=attributes(full)
- local mode=attr.mode
- if mode=='file' then
- if find(full,patt) then
+ if name=="." then
+ elseif name==".." then
+ else
+ local full=path..name
+ local attr=attributes(full)
+ local mode=attr.mode
+ if mode=='file' then
+ if find(full,patt) then
+ result[name]=attr
+ end
+ elseif recurse and mode=="directory" then
+ attr.list=collectpattern(full,patt,recurse)
result[name]=attr
end
- elseif recurse and (mode=="directory") and (name~='.') and (name~="..") then
- attr.list=collectpattern(full,patt,recurse)
- result[name]=attr
end
end
end
return result
end
dir.collectpattern=collectpattern
-local separator
-if onwindows then
+local separator,pattern
+if onwindows then
local slash=S("/\\")/"/"
- pattern=Ct {
+ pattern={
[1]=(Cs(P(".")+slash^1)+Cs(R("az","AZ")*P(":")*slash^0)+Cc("./"))*V(2)*V(3),
[2]=Cs(((1-S("*?/\\"))^0*slash)^0),
[3]=Cs(P(1)^0)
}
-else
- pattern=Ct {
+else
+ pattern={
[1]=(C(P(".")+P("/")^1)+Cc("./"))*V(2)*V(3),
[2]=C(((1-S("*?/"))^0*P("/"))^0),
[3]=C(P(1)^0)
@@ -3890,9 +4175,8 @@ local function glob(str,t)
elseif 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 root,path,base=lpegmatch(pattern,str)
+ if root and path and base then
local recurse=find(base,"**",1,true)
local start=root..path
local result=lpegmatch(filter,start..base)
@@ -3914,16 +4198,12 @@ local function glob(str,t)
return { str }
end
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 root,path,base=lpegmatch(pattern,str)
+ if root and path and base then
local recurse=find(base,"**",1,true)
local start=root..path
local result=lpegmatch(filter,start..base)
- globpattern(start,result,recurse,action)
- return t
+ return globpattern(start,result,recurse,t)
else
return {}
end
@@ -4071,47 +4351,51 @@ else
end
end
dir.makedirs=dir.mkdirs
-if onwindows then
- function dir.expandname(str)
- 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()
+do
+ local chdir=sandbox and sandbox.original(chdir) or chdir
+ if onwindows then
+ local xcurrentdir=dir.current
+ function dir.expandname(str)
+ local first,nothing,last=match(str,"^(//)(//*)(.*)$")
+ if first then
+ first=xcurrentdir().."/"
+ 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=xcurrentdir()
+ end
+ chdir(d)
end
- chdir(d)
+ end
+ if not first then
+ first,last=xcurrentdir(),str
+ end
+ last=gsub(last,"//","/")
+ last=gsub(last,"/%./","/")
+ last=gsub(last,"^/*","")
+ first=gsub(first,"/*$","")
+ if last=="" or last=="." then
+ return first
+ else
+ return first.."/"..last
end
end
- if not first then
- first,last=dir.current(),str
- end
- last=gsub(last,"//","/")
- last=gsub(last,"/%./","/")
- last=gsub(last,"^/*","")
- first=gsub(first,"/*$","")
- if last=="" or last=="." then
- return first
- else
- return first.."/"..last
- end
- end
-else
- function dir.expandname(str)
- if not find(str,"^/") then
- str=currentdir().."/"..str
+ else
+ function dir.expandname(str)
+ if not find(str,"^/") then
+ str=currentdir().."/"..str
+ end
+ str=gsub(str,"//","/")
+ str=gsub(str,"/%./","/")
+ str=gsub(str,"(.)/%.$","%1")
+ return str
end
- str=gsub(str,"//","/")
- str=gsub(str,"/%./","/")
- str=gsub(str,"(.)/%.$","%1")
- return str
end
end
file.expandname=dir.expandname
@@ -4154,7 +4438,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-boolean"] = package.loaded["l-boolean"] or true
--- original size: 1809, stripped down to: 1527
+-- original size: 1850, stripped down to: 1568
if not modules then modules={} end modules ['l-boolean']={
version=1.001,
@@ -4208,11 +4492,11 @@ function string.booleanstring(str)
return str=="yes" or str=="on" or str=="t"
end
end
-function string.is_boolean(str,default)
+function string.is_boolean(str,default,strict)
if type(str)=="string" then
- if str=="true" or str=="yes" or str=="on" or str=="t" or str=="1" then
+ if str=="true" or str=="yes" or str=="on" or str=="t" or (not strict and str=="1") then
return true
- elseif str=="false" or str=="no" or str=="off" or str=="f" or str=="0" then
+ elseif str=="false" or str=="no" or str=="off" or str=="f" or (not strict and str=="0") then
return false
end
end
@@ -4226,7 +4510,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-unicode"] = package.loaded["l-unicode"] or true
--- original size: 33706, stripped down to: 14938
+-- original size: 37233, stripped down to: 15684
if not modules then modules={} end modules ['l-unicode']={
version=1.001,
@@ -4242,7 +4526,9 @@ local type=type
local char,byte,format,sub,gmatch=string.char,string.byte,string.format,string.sub,string.gmatch
local concat=table.concat
local P,C,R,Cs,Ct,Cmt,Cc,Carg,Cp=lpeg.P,lpeg.C,lpeg.R,lpeg.Cs,lpeg.Ct,lpeg.Cmt,lpeg.Cc,lpeg.Carg,lpeg.Cp
-local lpegmatch,patterns=lpeg.match,lpeg.patterns
+local lpegmatch=lpeg.match
+local patterns=lpeg.patterns
+local tabletopattern=lpeg.utfchartabletopattern
local bytepairs=string.bytepairs
local finder=lpeg.finder
local replacer=lpeg.replacer
@@ -4251,7 +4537,7 @@ local utfgmatch=utf.gmatch
local p_utftype=patterns.utftype
local p_utfstricttype=patterns.utfstricttype
local p_utfoffset=patterns.utfoffset
-local p_utf8char=patterns.utf8char
+local p_utf8char=patterns.utf8character
local p_utf8byte=patterns.utf8byte
local p_utfbom=patterns.utfbom
local p_newline=patterns.newline
@@ -4450,15 +4736,52 @@ if not utf.sub then
end
end
end
-function utf.remapper(mapping)
- local pattern=Cs((p_utf8char/mapping)^0)
- return function(str)
- if not str or str=="" then
- return ""
+function utf.remapper(mapping,option)
+ local variant=type(mapping)
+ if variant=="table" then
+ if option=="dynamic" then
+ local pattern=false
+ table.setmetatablenewindex(mapping,function(t,k,v) rawset(t,k,v) pattern=false end)
+ return function(str)
+ if not str or str=="" then
+ return ""
+ else
+ if not pattern then
+ pattern=Cs((tabletopattern(mapping)/mapping+p_utf8char)^0)
+ end
+ return lpegmatch(pattern,str)
+ end
+ end
+ elseif option=="pattern" then
+ return Cs((tabletopattern(mapping)/mapping+p_utf8char)^0)
else
- return lpegmatch(pattern,str)
+ local pattern=Cs((tabletopattern(mapping)/mapping+p_utf8char)^0)
+ return function(str)
+ if not str or str=="" then
+ return ""
+ else
+ return lpegmatch(pattern,str)
+ end
+ end,pattern
+ end
+ elseif variant=="function" then
+ if option=="pattern" then
+ return Cs((p_utf8char/mapping+p_utf8char)^0)
+ else
+ local pattern=Cs((p_utf8char/mapping+p_utf8char)^0)
+ return function(str)
+ if not str or str=="" then
+ return ""
+ else
+ return lpegmatch(pattern,str)
+ end
+ end,pattern
+ end
+ else
+ return function(str)
+ return str or ""
end
- end,pattern
+ end
end
function utf.replacer(t)
local r=replacer(t,false,false,true)
@@ -4508,190 +4831,157 @@ function utf.magic(f)
end
local utf16_to_utf8_be,utf16_to_utf8_le
local utf32_to_utf8_be,utf32_to_utf8_le
-local utf_16_be_linesplitter=patterns.utfbom_16_be^-1*lpeg.tsplitat(patterns.utf_16_be_nl)
-local utf_16_le_linesplitter=patterns.utfbom_16_le^-1*lpeg.tsplitat(patterns.utf_16_le_nl)
-if bytepairs then
- utf16_to_utf8_be=function(t)
- if type(t)=="string" then
- t=lpegmatch(utf_16_be_linesplitter,t)
- end
- local 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)
- end
- return t
+local utf_16_be_getbom=patterns.utfbom_16_be^-1
+local utf_16_le_getbom=patterns.utfbom_16_le^-1
+local utf_32_be_getbom=patterns.utfbom_32_be^-1
+local utf_32_le_getbom=patterns.utfbom_32_le^-1
+local utf_16_be_linesplitter=utf_16_be_getbom*lpeg.tsplitat(patterns.utf_16_be_nl)
+local utf_16_le_linesplitter=utf_16_le_getbom*lpeg.tsplitat(patterns.utf_16_le_nl)
+local utf_32_be_linesplitter=utf_32_be_getbom*lpeg.tsplitat(patterns.utf_32_be_nl)
+local utf_32_le_linesplitter=utf_32_le_getbom*lpeg.tsplitat(patterns.utf_32_le_nl)
+local more=0
+local p_utf16_to_utf8_be=C(1)*C(1)/function(left,right)
+ local now=256*byte(left)+byte(right)
+ if more>0 then
+ now=(more-0xD800)*0x400+(now-0xDC00)+0x10000
+ more=0
+ return utfchar(now)
+ elseif now>=0xD800 and now<=0xDBFF then
+ more=now
+ return ""
+ else
+ return utfchar(now)
+ end
+end
+local p_utf16_to_utf8_le=C(1)*C(1)/function(right,left)
+ local now=256*byte(left)+byte(right)
+ if more>0 then
+ now=(more-0xD800)*0x400+(now-0xDC00)+0x10000
+ more=0
+ return utfchar(now)
+ elseif now>=0xD800 and now<=0xDBFF then
+ more=now
+ return ""
+ else
+ return utfchar(now)
+ end
+end
+local p_utf32_to_utf8_be=C(1)*C(1)*C(1)*C(1)/function(a,b,c,d)
+ return utfchar(256*256*256*byte(a)+256*256*byte(b)+256*byte(c)+byte(d))
+end
+local p_utf32_to_utf8_le=C(1)*C(1)*C(1)*C(1)/function(a,b,c,d)
+ return utfchar(256*256*256*byte(d)+256*256*byte(c)+256*byte(b)+byte(a))
+end
+p_utf16_to_utf8_be=P(true)/function() more=0 end*utf_16_be_getbom*Cs(p_utf16_to_utf8_be^0)
+p_utf16_to_utf8_le=P(true)/function() more=0 end*utf_16_le_getbom*Cs(p_utf16_to_utf8_le^0)
+p_utf32_to_utf8_be=P(true)/function() more=0 end*utf_32_be_getbom*Cs(p_utf32_to_utf8_be^0)
+p_utf32_to_utf8_le=P(true)/function() more=0 end*utf_32_le_getbom*Cs(p_utf32_to_utf8_le^0)
+patterns.utf16_to_utf8_be=p_utf16_to_utf8_be
+patterns.utf16_to_utf8_le=p_utf16_to_utf8_le
+patterns.utf32_to_utf8_be=p_utf32_to_utf8_be
+patterns.utf32_to_utf8_le=p_utf32_to_utf8_le
+utf16_to_utf8_be=function(s)
+ if s and s~="" then
+ return lpegmatch(p_utf16_to_utf8_be,s)
+ else
+ return s
end
- utf16_to_utf8_le=function(t)
- if type(t)=="string" then
- t=lpegmatch(utf_16_le_linesplitter,t)
- end
- local 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)
- end
- return t
+end
+local utf16_to_utf8_be_t=function(t)
+ if not t then
+ return nil
+ elseif type(t)=="string" then
+ t=lpegmatch(utf_16_be_linesplitter,t)
end
- utf32_to_utf8_be=function(t)
- if type(t)=="string" then
- t=lpegmatch(utflinesplitter,t)
- end
- local result={}
- for i=1,#t do
- local r,more=0,-1
- for a,b in bytepairs(t[i]) do
- if a and b then
- if more<0 then
- more=256*256*256*a+256*256*b
- else
- r=r+1
- result[t]=utfchar(more+256*a+b)
- more=-1
- end
- else
- break
- end
- end
- t[i]=concat(result,"",1,r)
+ for i=1,#t do
+ local s=t[i]
+ if s~="" then
+ t[i]=lpegmatch(p_utf16_to_utf8_be,s)
end
- return t
end
- utf32_to_utf8_le=function(t)
- if type(t)=="string" then
- t=lpegmatch(utflinesplitter,t)
- end
- local result={}
- for i=1,#t do
- local r,more=0,-1
- for a,b in bytepairs(t[i]) do
- if a and b then
- if more<0 then
- more=256*b+a
- else
- r=r+1
- result[t]=utfchar(more+256*256*256*b+256*256*a)
- more=-1
- end
- else
- break
- end
- end
- t[i]=concat(result,"",1,r)
- end
- return t
+ return t
+end
+utf16_to_utf8_le=function(s)
+ if s and s~="" then
+ return lpegmatch(p_utf16_to_utf8_le,s)
+ else
+ return s
end
-else
- utf16_to_utf8_be=function(t)
- if type(t)=="string" then
- t=lpegmatch(utf_16_be_linesplitter,t)
- end
- local result={}
- for i=1,#t do
- local r,more=0,0
- for left,right in gmatch(t[i],"(.)(.)") do
- if left=="\000" then
- r=r+1
- result[r]=utfchar(byte(right))
- elseif right then
- local now=256*byte(left)+byte(right)
- if more>0 then
- now=(more-0xD800)*0x400+(now-0xDC00)+0x10000
- 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)
+end
+local utf16_to_utf8_le_t=function(t)
+ if not t then
+ return nil
+ elseif type(t)=="string" then
+ t=lpegmatch(utf_16_le_linesplitter,t)
+ end
+ for i=1,#t do
+ local s=t[i]
+ if s~="" then
+ t[i]=lpegmatch(p_utf16_to_utf8_le,s)
end
- return t
end
- utf16_to_utf8_le=function(t)
- if type(t)=="string" then
- t=lpegmatch(utf_16_le_linesplitter,t)
+ return t
+end
+utf32_to_utf8_be=function(s)
+ if s and s~="" then
+ return lpegmatch(p_utf32_to_utf8_be,s)
+ else
+ return s
+ end
+end
+local utf32_to_utf8_be_t=function(t)
+ if not t then
+ return nil
+ elseif type(t)=="string" then
+ t=lpegmatch(utf_32_be_linesplitter,t)
+ end
+ for i=1,#t do
+ local s=t[i]
+ if s~="" then
+ t[i]=lpegmatch(p_utf32_to_utf8_be,s)
end
- local result={}
- for i=1,#t do
- local r,more=0,0
- for left,right in gmatch(t[i],"(.)(.)") do
- if right=="\000" then
- r=r+1
- result[r]=utfchar(byte(left))
- elseif right then
- local now=256*byte(right)+byte(left)
- if more>0 then
- now=(more-0xD800)*0x400+(now-0xDC00)+0x10000
- 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)
+ end
+ return t
+end
+utf32_to_utf8_le=function(s)
+ if s and s~="" then
+ return lpegmatch(p_utf32_to_utf8_le,s)
+ else
+ return s
+ end
+end
+local utf32_to_utf8_le_t=function(t)
+ if not t then
+ return nil
+ elseif type(t)=="string" then
+ t=lpegmatch(utf_32_le_linesplitter,t)
+ end
+ for i=1,#t do
+ local s=t[i]
+ if s~="" then
+ t[i]=lpegmatch(p_utf32_to_utf8_le,s)
end
- return t
end
- utf32_to_utf8_le=function() return {} end
- utf32_to_utf8_be=function() return {} end
+ return t
end
+utf.utf16_to_utf8_le_t=utf16_to_utf8_le_t
+utf.utf16_to_utf8_be_t=utf16_to_utf8_be_t
+utf.utf32_to_utf8_le_t=utf32_to_utf8_le_t
+utf.utf32_to_utf8_be_t=utf32_to_utf8_be_t
utf.utf16_to_utf8_le=utf16_to_utf8_le
utf.utf16_to_utf8_be=utf16_to_utf8_be
utf.utf32_to_utf8_le=utf32_to_utf8_le
utf.utf32_to_utf8_be=utf32_to_utf8_be
-function utf.utf8_to_utf8(t)
+function utf.utf8_to_utf8_t(t)
return type(t)=="string" and lpegmatch(utflinesplitter,t) or t
end
-function utf.utf16_to_utf8(t,endian)
- return endian and utf16_to_utf8_be(t) or utf16_to_utf8_le(t) or t
+function utf.utf16_to_utf8_t(t,endian)
+ return endian and utf16_to_utf8_be_t(t) or utf16_to_utf8_le_t(t) or t
end
-function utf.utf32_to_utf8(t,endian)
- return endian and utf32_to_utf8_be(t) or utf32_to_utf8_le(t) or t
+function utf.utf32_to_utf8_t(t,endian)
+ return endian and utf32_to_utf8_be_t(t) or utf32_to_utf8_le_t(t) or t
end
-local function little(c)
- local b=byte(c)
+local function little(b)
if b<0x10000 then
return char(b%256,b/256)
else
@@ -4700,8 +4990,7 @@ local function little(c)
return char(b1%256,b1/256,b2%256,b2/256)
end
end
-local function big(c)
- local b=byte(c)
+local function big(b)
if b<0x10000 then
return char(b/256,b%256)
else
@@ -4710,27 +4999,29 @@ local function big(c)
return char(b1/256,b1%256,b2/256,b2%256)
end
end
-local _,l_remap=utf.remapper(little)
-local _,b_remap=utf.remapper(big)
-function utf.utf8_to_utf16_be(str,nobom)
+local l_remap=Cs((p_utf8byte/little+P(1)/"")^0)
+local b_remap=Cs((p_utf8byte/big+P(1)/"")^0)
+local function utf8_to_utf16_be(str,nobom)
if nobom then
return lpegmatch(b_remap,str)
else
return char(254,255)..lpegmatch(b_remap,str)
end
end
-function utf.utf8_to_utf16_le(str,nobom)
+local function utf8_to_utf16_le(str,nobom)
if nobom then
return lpegmatch(l_remap,str)
else
return char(255,254)..lpegmatch(l_remap,str)
end
end
+utf.utf8_to_utf16_be=utf8_to_utf16_be
+utf.utf8_to_utf16_le=utf8_to_utf16_le
function utf.utf8_to_utf16(str,littleendian,nobom)
if littleendian then
- return utf.utf8_to_utf16_le(str,nobom)
+ return utf8_to_utf16_le(str,nobom)
else
- return utf.utf8_to_utf16_be(str,nobom)
+ return utf8_to_utf16_be(str,nobom)
end
end
local pattern=Cs (
@@ -4746,16 +5037,16 @@ function utf.xstring(s)
return format("0x%05X",type(s)=="number" and s or utfbyte(s))
end
function utf.toeight(str)
- if not str then
+ if not str or str=="" then
return nil
end
local utftype=lpegmatch(p_utfstricttype,str)
if utftype=="utf-8" then
- return sub(str,4)
- elseif utftype=="utf-16-le" then
- return utf16_to_utf8_le(str)
+ return sub(str,4)
elseif utftype=="utf-16-be" then
- return utf16_to_utf8_ne(str)
+ return utf16_to_utf8_be(str)
+ elseif utftype=="utf-16-le" then
+ return utf16_to_utf8_le(str)
else
return str
end
@@ -4834,7 +5125,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-math"] = package.loaded["l-math"] or true
--- original size: 915, stripped down to: 836
+-- original size: 974, stripped down to: 890
if not modules then modules={} end modules ['l-math']={
version=1.001,
@@ -4844,6 +5135,9 @@ if not modules then modules={} end modules ['l-math']={
license="see context related readme files"
}
local floor,sin,cos,tan=math.floor,math.sin,math.cos,math.tan
+if not math.ceiling then
+ math.ceiling=math.ceil
+end
if not math.round then
function math.round(x) return floor(x+0.5) end
end
@@ -4871,7 +5165,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-str"] = package.loaded["util-str"] or true
--- original size: 33063, stripped down to: 18397
+-- original size: 34407, stripped down to: 18852
if not modules then modules={} end modules ['util-str']={
version=1.001,
@@ -5001,10 +5295,12 @@ local striplinepatterns={
["retain"]=p_retain_normal,
["retain and collapse"]=p_retain_collapse,
["retain and no empty"]=p_retain_noempty,
+ ["collapse"]=patterns.collapser,
}
+setmetatable(striplinepatterns,{ __index=function(t,k) return p_prune_collapse end })
strings.striplinepatterns=striplinepatterns
function strings.striplines(str,how)
- return str and lpegmatch(how and striplinepatterns[how] or p_prune_collapse,str) or str
+ return str and lpegmatch(striplinepatterns[how],str) or str
end
strings.striplong=strings.striplines
function strings.nice(str)
@@ -5044,10 +5340,10 @@ string.tracedchars=tracedchars
strings.tracers=tracedchars
function string.tracedchar(b)
if type(b)=="number" then
- return tracedchars[b] or (utfchar(b).." (U+"..format('%05X',b)..")")
+ return tracedchars[b] or (utfchar(b).." (U+"..format("%05X",b)..")")
else
local c=utfbyte(b)
- return tracedchars[c] or (b.." (U+"..format('%05X',c)..")")
+ return tracedchars[c] or (b.." (U+"..(c and format("%05X",c) or "?????")..")")
end
end
function number.signed(i)
@@ -5184,12 +5480,12 @@ local format_f=function(f)
n=n+1
return format("format('%%%sf',a%s)",f,n)
end
-local format_F=function(f)
+local format_F=function(f)
n=n+1
if not f or f=="" then
- return format("(((a%s > -0.0000000005 and a%s < 0.0000000005) and '0') or (a%s == 1 and '1') or format('%%.9f',a%s))",n,n,n,n)
+ return format("(((a%s > -0.0000000005 and a%s < 0.0000000005) and '0') or format((a%s %% 1 == 0) and '%%i' or '%%.9f',a%s))",n,n,n,n)
else
- return format("((a%s == 0 and '0') or (a%s == 1 and '1') or format('%%%sf',a%s))",n,n,f,n)
+ return format("format((a%s %% 1 == 0) and '%%i' or '%%%sf',a%s)",n,f,n)
end
end
local format_g=function(f)
@@ -5417,7 +5713,6 @@ local builder=Cs { "start",
+V("j")+V("J")
+V("m")+V("M")
+V("z")
-+V("*")
)+V("*")
)*(P(-1)+Carg(1))
)^0,
@@ -5461,6 +5756,7 @@ local builder=Cs { "start",
["a"]=(prefix_any*P("a"))/format_a,
["A"]=(prefix_any*P("A"))/format_A,
["*"]=Cs(((1-P("%"))^1+P("%%")/"%%")^1)/format_rest,
+ ["?"]=Cs(((1-P("%"))^1 )^1)/format_rest,
["!"]=Carg(2)*prefix_any*P("!")*C((1-P("!"))^1)*P("!")/format_extension,
}
local direct=Cs (
@@ -5535,6 +5831,15 @@ else
add(formatters,"tex",[[lpegmatch(texescape,%s)]],{ texescape=lpeg.patterns.texescape })
add(formatters,"lua",[[lpegmatch(luaescape,%s)]],{ luaescape=lpeg.patterns.luaescape })
end
+local dquote=patterns.dquote
+local equote=patterns.escaped+dquote/'\\"'+1
+local space=patterns.space
+local cquote=Cc('"')
+local pattern=Cs(dquote*(equote-P(-2))^0*dquote)
++Cs(cquote*(equote-space)^0*space*equote^0*cquote)
+function string.optionalquoted(str)
+ return lpegmatch(pattern,str) or str
+end
end -- of closure
@@ -5543,7 +5848,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tab"] = package.loaded["util-tab"] or true
--- original size: 23985, stripped down to: 16069
+-- original size: 24267, stripped down to: 16260
if not modules then modules={} end modules ['util-tab']={
version=1.001,
@@ -5633,6 +5938,15 @@ function tables.removevalue(t,value)
end
end
end
+function tables.replacevalue(t,oldvalue,newvalue)
+ if oldvalue and newvalue then
+ for i=1,#t do
+ if t[i]==oldvalue then
+ t[i]=newvalue
+ end
+ end
+ end
+end
function tables.insertbeforevalue(t,value,extra)
for i=1,#t do
if t[i]==extra then
@@ -6026,7 +6340,7 @@ function table.serialize(root,name,specification)
end
depth=depth+1
end
- if root and next(root) then
+ if root and next(root)~=nil then
local first=nil
local last=0
last=#root
@@ -6051,7 +6365,7 @@ function table.serialize(root,name,specification)
elseif tv=="string" then
n=n+1 t[n]=f_val_str(depth,v)
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
n=n+1 t[n]=f_val_not(depth)
else
local st=simple_table(v)
@@ -6081,7 +6395,7 @@ function table.serialize(root,name,specification)
n=n+1 t[n]=f_key_boo_value_str(depth,k,v)
end
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
if tk=="number" then
n=n+1 t[n]=f_key_num_value_not(depth,k,v)
elseif tk=="string" then
@@ -6139,7 +6453,7 @@ function table.serialize(root,name,specification)
local dummy=root._w_h_a_t_e_v_e_r_
root._w_h_a_t_e_v_e_r_=nil
end
- if next(root) then
+ if next(root)~=nil then
do_serialize(root,name,1,0)
end
end
@@ -6302,7 +6616,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-prs"] = package.loaded["util-prs"] or true
--- original size: 19618, stripped down to: 14012
+-- original size: 21751, stripped down to: 15108
if not modules then modules={} end modules ['util-prs']={
version=1.001,
@@ -6458,11 +6772,30 @@ function parsers.settings_to_array(str,strict)
return { str }
end
end
-local separator=space^0*comma*space^0
-local value=P(lbrace*C((nobrace+nestedbraces)^0)*rbrace)+C((nestedbraces+(1-(space^0*(comma+P(-1)))))^0)
-local withvalue=Carg(1)*value/function(f,s) return f(s) end
-local pattern_a=spaces*Ct(value*(separator*value)^0)
-local pattern_b=spaces*withvalue*(separator*withvalue)^0
+local cache_a={}
+local cache_b={}
+function parsers.groupedsplitat(symbol,withaction)
+ if not symbol then
+ symbol=","
+ end
+ local pattern=(withaction and cache_b or cache_a)[symbol]
+ if not pattern then
+ local symbols=S(symbol)
+ local separator=space^0*symbols*space^0
+ local value=P(lbrace*C((nobrace+nestedbraces)^0)*rbrace)+C((nestedbraces+(1-(space^0*(symbols+P(-1)))))^0)
+ if withaction then
+ local withvalue=Carg(1)*value/function(f,s) return f(s) end
+ pattern=spaces*withvalue*(separator*withvalue)^0
+ cache_b[symbol]=pattern
+ else
+ pattern=spaces*Ct(value*(separator*value)^0)
+ cache_a[symbol]=pattern
+ end
+ end
+ return pattern
+end
+local pattern_a=parsers.groupedsplitat(",",false)
+local pattern_b=parsers.groupedsplitat(",",true)
function parsers.stripped_settings_to_array(str)
if not str or str=="" then
return {}
@@ -6524,12 +6857,9 @@ function parsers.array_to_string(a,separator)
return ""
end
end
-function parsers.settings_to_set(str,t)
- t=t or {}
- for s in gmatch(str,"[^, ]+") do
- t[s]=true
- end
- return t
+local pattern=Cf(Ct("")*Cg(C((1-S(", "))^1)*S(", ")^0*Cc(true))^1,rawset)
+function utilities.parsers.settings_to_set(str,t)
+ return str and lpegmatch(pattern,str) or {}
end
function parsers.simple_hash_to_string(h,separator)
local t,tn={},0
@@ -6541,12 +6871,16 @@ function parsers.simple_hash_to_string(h,separator)
end
return concat(t,separator or ",")
end
-local str=C((1-whitespace-equal)^1)
+local str=Cs(lpegpatterns.unquoted)+C((1-whitespace-equal)^1)
local setting=Cf(Carg(1)*(whitespace^0*Cg(str*whitespace^0*(equal*whitespace^0*str+Cc(""))))^1,rawset)
local splitter=setting^1
function utilities.parsers.options_to_hash(str,target)
return str and lpegmatch(splitter,str,1,target or {}) or {}
end
+local splitter=lpeg.tsplitat(" ")
+function utilities.parsers.options_to_array(str)
+ return str and lpegmatch(splitter,str) or {}
+end
local value=P(lbrace*C((nobrace+nestedbraces)^0)*rbrace)+C(digit^1*lparent*(noparent+nestedparents)^1*rparent)+C((nestedbraces+(1-comma))^1)
local pattern_a=spaces*Ct(value*(separator*value)^0)
local function repeater(n,str)
@@ -6668,7 +7002,7 @@ function parsers.rfc4180splitter(specification)
local field=escaped+non_escaped+Cc("")
local record=Ct(field*(separator*field)^1)
local headerline=record*Cp()
- local wholeblob=Ct((newline^-1*record)^0)
+ local wholeblob=Ct((newline^(specification.strict and -1 or 1)*record)^0)
return function(data,getheader)
if getheader then
local header,position=lpegmatch(headerline,data)
@@ -6705,13 +7039,13 @@ function parsers.stepper(str,n,action)
lpegmatch(stepper,str,1,n,action or print)
end
end
-local pattern_math=Cs((P("%")/"\\percent "+P("^")*Cc("{")*lpegpatterns.integer*Cc("}")+P(1))^0)
-local pattern_text=Cs((P("%")/"\\percent "+(P("^")/"\\high")*Cc("{")*lpegpatterns.integer*Cc("}")+P(1))^0)
+local pattern_math=Cs((P("%")/"\\percent "+P("^")*Cc("{")*lpegpatterns.integer*Cc("}")+anything)^0)
+local pattern_text=Cs((P("%")/"\\percent "+(P("^")/"\\high")*Cc("{")*lpegpatterns.integer*Cc("}")+anything)^0)
patterns.unittotex=pattern
function parsers.unittotex(str,textmode)
return lpegmatch(textmode and pattern_text or pattern_math,str)
end
-local pattern=Cs((P("^")/"<sup>"*lpegpatterns.integer*Cc("</sup>")+P(1))^0)
+local pattern=Cs((P("^")/"<sup>"*lpegpatterns.integer*Cc("</sup>")+anything)^0)
function parsers.unittoxml(str)
return lpegmatch(pattern,str)
end
@@ -6783,6 +7117,18 @@ function utilities.parsers.runtime(time)
local seconds=mod(time,60)
return days,hours,minutes,seconds
end
+local spacing=whitespace^0
+local apply=P("->")
+local method=C((1-apply)^1)
+local token=lbrace*C((1-rbrace)^1)*rbrace+C(anything^1)
+local pattern=spacing*(method*spacing*apply+Carg(1))*spacing*token
+function utilities.parsers.splitmethod(str,default)
+ if str then
+ return lpegmatch(pattern,str,1,default or false)
+ else
+ return default or false,""
+ end
+end
end -- of closure
@@ -6872,7 +7218,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-set"] = package.loaded["trac-set"] or true
--- original size: 12365, stripped down to: 8799
+-- original size: 12482, stripped down to: 8864
if not modules then modules={} end modules ['trac-set']={
version=1.001,
@@ -6900,7 +7246,7 @@ function setters.initialize(filename,name,values)
local data=setter.data
if data then
for key,newvalue in next,values do
- local newvalue=is_boolean(newvalue,newvalue)
+ local newvalue=is_boolean(newvalue,newvalue,true)
local functions=data[key]
if functions then
local oldvalue=functions.value
@@ -6954,7 +7300,7 @@ local function set(t,what,newvalue)
elseif not value then
value=false
else
- value=is_boolean(value,value)
+ value=is_boolean(value,value,true)
end
w=topattern(w,true,true)
for name,functions in next,data do
@@ -7093,6 +7439,7 @@ function setters.new(name)
report=function(...) setters.report (setter,...) end,
enable=function(...) enable (setter,...) end,
disable=function(...) disable (setter,...) end,
+ reset=function(...) reset (setter,...) end,
register=function(...) register(setter,...) end,
list=function(...) list (setter,...) end,
show=function(...) show (setter,...) end,
@@ -7184,7 +7531,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-log"] = package.loaded["trac-log"] or true
--- original size: 25613, stripped down to: 16617
+-- original size: 29359, stripped down to: 20483
if not modules then modules={} end modules ['trac-log']={
version=1.001,
@@ -7193,15 +7540,18 @@ if not modules then modules={} end modules ['trac-log']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local next,type,select,print=next,type,select,print
local write_nl,write=texio and texio.write_nl or print,texio and texio.write or io.write
local format,gmatch,find=string.format,string.gmatch,string.find
local concat,insert,remove=table.concat,table.insert,table.remove
local topattern=string.topattern
-local next,type,select=next,type,select
local utfchar=utf.char
+local datetime=os.date
+local openfile=io.open
local setmetatableindex=table.setmetatableindex
local formatters=string.formatters
local texgetcount=tex and tex.getcount
+local variant="default"
logs=logs or {}
local logs=logs
local moreinfo=[[
@@ -7211,32 +7561,122 @@ 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
]]
-utilities.strings.formatters.add (
+formatters.add (
formatters,"unichr",
[["U+" .. format("%%05X",%s) .. " (" .. utfchar(%s) .. ")"]]
)
-utilities.strings.formatters.add (
+formatters.add (
formatters,"chruni",
[[utfchar(%s) .. " (U+" .. format("%%05X",%s) .. ")"]]
)
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,setlogfile,settimedlog,setprocessor,setformatters
+local direct,subdirect,writer,pushtarget,poptarget,setlogfile,settimedlog,setprocessor,setformatters,newline
if tex and (tex.jobname or tex.formatname) then
- local valueiskey={ __index=function(t,k) t[k]=k return k end }
- local target="term and log"
+ local function useluawrites()
+ local texio_write_nl=texio.write_nl
+ local texio_write=texio.write
+ local io_write=io.write
+ write_nl=function(target,...)
+ if not io_write then
+ io_write=io.write
+ end
+ if target=="term and log" then
+ texio_write_nl("log",...)
+ texio_write_nl("term","")
+ io_write(...)
+ elseif target=="log" then
+ texio_write_nl("log",...)
+ elseif target=="term" then
+ texio_write_nl("term","")
+ io_write(...)
+ elseif target~="none" then
+ texio_write_nl("log",target,...)
+ texio_write_nl("term","")
+ io_write(target,...)
+ end
+ end
+ write=function(target,...)
+ if not io_write then
+ io_write=io.write
+ end
+ if target=="term and log" then
+ texio_write("log",...)
+ io_write(...)
+ elseif target=="log" then
+ texio_write("log",...)
+ elseif target=="term" then
+ io_write(...)
+ elseif target~="none" then
+ texio_write("log",target,...)
+ io_write(target,...)
+ end
+ end
+ texio.write=write
+ texio.write_nl=write_nl
+ useluawrites=ignore
+ end
+ local whereto="both"
+ local target=nil
+ local targets=nil
+ local formats=table.setmetatableindex("self")
+ local translations=table.setmetatableindex("self")
+ local report_yes,subreport_yes,direct_yes,subdirect_yes,status_yes
+ local report_nop,subreport_nop,direct_nop,subdirect_nop,status_nop
+ local variants={
+ default={
+ formats={
+ report_yes=formatters["%-15s > %s\n"],
+ report_nop=formatters["%-15s >\n"],
+ direct_yes=formatters["%-15s > %s"],
+ direct_nop=formatters["%-15s >"],
+ subreport_yes=formatters["%-15s > %s > %s\n"],
+ subreport_nop=formatters["%-15s > %s >\n"],
+ subdirect_yes=formatters["%-15s > %s > %s"],
+ subdirect_nop=formatters["%-15s > %s >"],
+ status_yes=formatters["%-15s : %s\n"],
+ status_nop=formatters["%-15s :\n"],
+ },
+ targets={
+ logfile="log",
+ log="log",
+ file="log",
+ console="term",
+ terminal="term",
+ both="term and log",
+ },
+ },
+ ansi={
+ formats={
+ report_yes=formatters["%-15s > %s\n"],
+ report_nop=formatters["%-15s >\n"],
+ direct_yes=formatters["%-15s > %s"],
+ direct_nop=formatters["%-15s >"],
+ subreport_yes=formatters["%-15s > %s > %s\n"],
+ subreport_nop=formatters["%-15s > %s >\n"],
+ subdirect_yes=formatters["%-15s > %s > %s"],
+ subdirect_nop=formatters["%-15s > %s >"],
+ status_yes=formatters["%-15s : %s\n"],
+ status_nop=formatters["%-15s :\n"],
+ },
+ targets={
+ logfile="none",
+ log="none",
+ file="none",
+ console="term",
+ terminal="term",
+ both="term",
+ },
+ }
+ }
logs.flush=io.flush
- local formats={} setmetatable(formats,valueiskey)
- local translations={} setmetatable(translations,valueiskey)
writer=function(...)
write_nl(target,...)
end
newline=function()
write_nl(target,"\n")
end
- local report_yes=formatters["%-15s > %s\n"]
- local report_nop=formatters["%-15s >\n"]
report=function(a,b,c,...)
if c then
write_nl(target,report_yes(translations[a],formatters[formats[b]](c,...)))
@@ -7248,8 +7688,6 @@ if tex and (tex.jobname or tex.formatname) then
write_nl(target,"\n")
end
end
- local direct_yes=formatters["%-15s > %s"]
- local direct_nop=formatters["%-15s >"]
direct=function(a,b,c,...)
if c then
return direct_yes(translations[a],formatters[formats[b]](c,...))
@@ -7261,8 +7699,6 @@ if tex and (tex.jobname or tex.formatname) then
return ""
end
end
- local subreport_yes=formatters["%-15s > %s > %s\n"]
- local subreport_nop=formatters["%-15s > %s >\n"]
subreport=function(a,s,b,c,...)
if c then
write_nl(target,subreport_yes(translations[a],translations[s],formatters[formats[b]](c,...)))
@@ -7274,8 +7710,6 @@ if tex and (tex.jobname or tex.formatname) then
write_nl(target,"\n")
end
end
- local subdirect_yes=formatters["%-15s > %s > %s"]
- local subdirect_nop=formatters["%-15s > %s >"]
subdirect=function(a,s,b,c,...)
if c then
return subdirect_yes(translations[a],translations[s],formatters[formats[b]](c,...))
@@ -7287,8 +7721,6 @@ if tex and (tex.jobname or tex.formatname) then
return ""
end
end
- local status_yes=formatters["%-15s : %s\n"]
- local status_nop=formatters["%-15s :\n"]
status=function(a,b,c,...)
if c then
write_nl(target,status_yes(translations[a],formatters[formats[b]](c,...)))
@@ -7300,16 +7732,13 @@ if tex and (tex.jobname or tex.formatname) then
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
+ settarget=function(askedwhereto)
+ whereto=askedwhereto or whereto or "both"
+ target=targets[whereto]
+ if not target then
+ whereto="both"
+ target=targets[whereto]
+ end
if target=="term" or target=="term and log" then
logs.flush=io.flush
else
@@ -7338,21 +7767,74 @@ if tex and (tex.jobname or tex.formatname) then
writeline(target,f(...))
end
end
- setformatters=function(f)
- report_yes=f.report_yes or report_yes
- report_nop=f.report_nop or report_nop
- subreport_yes=f.subreport_yes or subreport_yes
- subreport_nop=f.subreport_nop or subreport_nop
- direct_yes=f.direct_yes or direct_yes
- direct_nop=f.direct_nop or direct_nop
- subdirect_yes=f.subdirect_yes or subdirect_yes
- subdirect_nop=f.subdirect_nop or subdirect_nop
- status_yes=f.status_yes or status_yes
- status_nop=f.status_nop or status_nop
- end
+ setformatters=function(specification)
+ local t=nil
+ local f=nil
+ local d=variants.default
+ if not specification then
+ elseif type(specification)=="table" then
+ t=specification.targets
+ f=specification.formats or specification
+ else
+ local v=variants[specification]
+ if v then
+ t=v.targets
+ f=v.formats
+ variant=specification
+ end
+ end
+ targets=t or d.targets
+ target=targets[whereto] or target
+ if f then
+ d=d.formats
+ else
+ f=d.formats
+ d=f
+ end
+ setmetatableindex(f,d)
+ report_yes=f.report_yes
+ report_nop=f.report_nop
+ subreport_yes=f.subreport_yes
+ subreport_nop=f.subreport_nop
+ direct_yes=f.direct_yes
+ direct_nop=f.direct_nop
+ subdirect_yes=f.subdirect_yes
+ subdirect_nop=f.subdirect_nop
+ status_yes=f.status_yes
+ status_nop=f.status_nop
+ if variant=="ansi" then
+ useluawrites()
+ end
+ settarget(whereto)
+ end
+ setformatters(variant)
setlogfile=ignore
settimedlog=ignore
else
+ local report_yes,subreport_yes,status_yes
+ local report_nop,subreport_nop,status_nop
+ local variants={
+ default={
+ formats={
+ report_yes=formatters["%-15s | %s"],
+ report_nop=formatters["%-15s |"],
+ subreport_yes=formatters["%-15s | %s | %s"],
+ subreport_nop=formatters["%-15s | %s |"],
+ status_yes=formatters["%-15s : %s\n"],
+ status_nop=formatters["%-15s :\n"],
+ },
+ },
+ ansi={
+ formats={
+ report_yes=formatters["%-15s | %s"],
+ report_nop=formatters["%-15s |"],
+ subreport_yes=formatters["%-15s | %s | %s"],
+ subreport_nop=formatters["%-15s | %s |"],
+ status_yes=formatters["%-15s : %s\n"],
+ status_nop=formatters["%-15s :\n"],
+ },
+ },
+ }
logs.flush=ignore
writer=function(s)
write_nl(s)
@@ -7360,8 +7842,6 @@ else
newline=function()
write_nl("\n")
end
- local report_yes=formatters["%-15s | %s"]
- local report_nop=formatters["%-15s |"]
report=function(a,b,c,...)
if c then
write_nl(report_yes(a,formatters[b](c,...)))
@@ -7373,8 +7853,6 @@ else
write_nl("")
end
end
- local subreport_yes=formatters["%-15s | %s | %s"]
- local subreport_nop=formatters["%-15s | %s |"]
subreport=function(a,sub,b,c,...)
if c then
write_nl(subreport_yes(a,sub,formatters[b](c,...)))
@@ -7386,8 +7864,6 @@ else
write_nl("")
end
end
- local status_yes=formatters["%-15s : %s\n"]
- local status_nop=formatters["%-15s :\n"]
status=function(a,b,c,...)
if c then
write_nl(status_yes(a,formatters[b](c,...)))
@@ -7412,14 +7888,34 @@ else
writeline(f(s))
end
end
- setformatters=function(f)
- report_yes=f.report_yes or report_yes
- report_nop=f.report_nop or report_nop
- subreport_yes=f.subreport_yes or subreport_yes
- subreport_nop=f.subreport_nop or subreport_nop
- status_yes=f.status_yes or status_yes
- status_nop=f.status_nop or status_nop
- end
+ setformatters=function(specification)
+ local f=nil
+ local d=variants.default
+ if specification then
+ if type(specification)=="table" then
+ f=specification.formats or specification
+ else
+ local v=variants[specification]
+ if v then
+ f=v.formats
+ end
+ end
+ end
+ if f then
+ d=d.formats
+ else
+ f=d.formats
+ d=f
+ end
+ setmetatableindex(f,d)
+ report_yes=f.report_yes
+ report_nop=f.report_nop
+ subreport_yes=f.subreport_yes
+ subreport_nop=f.subreport_nop
+ status_yes=f.status_yes
+ status_nop=f.status_nop
+ end
+ setformatters(variant)
setlogfile=function(name,keepopen)
if name and name~="" then
local localtime=os.localtime
@@ -7672,13 +8168,13 @@ end
local simple=logs.reporter("comment")
logs.simple=simple
logs.simpleline=simple
-function logs.setprogram () end
-function logs.extendbanner() end
-function logs.reportlines () end
-function logs.reportbanner() end
-function logs.reportline () end
-function logs.simplelines () end
-function logs.help () end
+logs.setprogram=ignore
+logs.extendbanner=ignore
+logs.reportlines=ignore
+logs.reportbanner=ignore
+logs.reportline=ignore
+logs.simplelines=ignore
+logs.help=ignore
local Carg,C,lpegmatch=lpeg.Carg,lpeg.C,lpeg.match
local p_newline=lpeg.patterns.newline
local linewise=(
@@ -7755,10 +8251,11 @@ function logs.application(t)
end
return t
end
-function logs.system(whereto,process,jobname,category,...)
- local message=formatters["%s %s => %s => %s => %s\r"](os.date("%d/%m/%y %H:%m:%S"),process,jobname,category,format(...))
+local f_syslog=formatters["%s %s => %s => %s => %s\r"]
+function logs.system(whereto,process,jobname,category,fmt,arg,...)
+ local message=f_syslog(datetime("%d/%m/%y %H:%m:%S"),process,jobname,category,arg==nil and fmt or format(fmt,arg,...))
for i=1,10 do
- local f=io.open(whereto,"a")
+ local f=openfile(whereto,"a")
if f then
f:write(message)
f:close()
@@ -7820,7 +8317,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-inf"] = package.loaded["trac-inf"] or true
--- original size: 7011, stripped down to: 5590
+-- original size: 6704, stripped down to: 5343
if not modules then modules={} end modules ['trac-inf']={
version=1.001,
@@ -7993,15 +8490,6 @@ function statistics.tracefunction(base,tag,...)
statistics.register(formatters["%s.%s"](tag,name),function() return serialize(stat,"calls") end)
end
end
-commands=commands or {}
-function commands.resettimer(name)
- resettiming(name or "whatever")
- starttiming(name or "whatever")
-end
-function commands.elapsedtime(name)
- stoptiming(name or "whatever")
- context(elapsedtime(name or "whatever"))
-end
end -- of closure
@@ -8568,7 +9056,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tpl"] = package.loaded["util-tpl"] or true
--- original size: 6251, stripped down to: 3488
+-- original size: 7100, stripped down to: 3978
if not modules then modules={} end modules ['util-tpl']={
version=1.001,
@@ -8610,7 +9098,7 @@ local sqlescape=lpeg.replacer {
{ "\r\n","\\n" },
{ "\r","\\n" },
}
-local sqlquoted=lpeg.Cs(lpeg.Cc("'")*sqlescape*lpeg.Cc("'"))
+local sqlquoted=Cs(Cc("'")*sqlescape*Cc("'"))
lpegpatterns.sqlescape=sqlescape
lpegpatterns.sqlquoted=sqlquoted
local luaescape=lpegpatterns.luaescape
@@ -8633,12 +9121,24 @@ local quotedescapers={
local luaescaper=escapers.lua
local quotedluaescaper=quotedescapers.lua
local function replacekeyunquoted(s,t,how,recurse)
- local escaper=how and escapers[how] or luaescaper
- return escaper(replacekey(s,t,how,recurse))
+ if how==false then
+ return replacekey(s,t,how,recurse)
+ else
+ local escaper=how and escapers[how] or luaescaper
+ return escaper(replacekey(s,t,how,recurse))
+ end
end
local function replacekeyquoted(s,t,how,recurse)
- local escaper=how and quotedescapers[how] or quotedluaescaper
- return escaper(replacekey(s,t,how,recurse))
+ if how==false then
+ return replacekey(s,t,how,recurse)
+ else
+ local escaper=how and quotedescapers[how] or quotedluaescaper
+ return escaper(replacekey(s,t,how,recurse))
+ end
+end
+local function replaceoptional(l,m,r,t,how,recurse)
+ local v=t[l]
+ return v and v~="" and lpegmatch(replacer,r,1,t,how or "lua",recurse or false) or ""
end
local single=P("%")
local double=P("%%")
@@ -8653,11 +9153,16 @@ local nolquoted=lquoted/''
local norquoted=rquoted/''
local nolquotedq=lquotedq/''
local norquotedq=rquotedq/''
-local key=nosingle*((C((1-nosingle )^1)*Carg(1)*Carg(2)*Carg(3))/replacekey )*nosingle
-local quoted=nolquotedq*((C((1-norquotedq)^1)*Carg(1)*Carg(2)*Carg(3))/replacekeyquoted )*norquotedq
-local unquoted=nolquoted*((C((1-norquoted )^1)*Carg(1)*Carg(2)*Carg(3))/replacekeyunquoted)*norquoted
+local noloptional=P("%?")/''
+local noroptional=P("?%")/''
+local nomoptional=P(":")/''
+local args=Carg(1)*Carg(2)*Carg(3)
+local key=nosingle*((C((1-nosingle )^1)*args)/replacekey )*nosingle
+local quoted=nolquotedq*((C((1-norquotedq )^1)*args)/replacekeyquoted )*norquotedq
+local unquoted=nolquoted*((C((1-norquoted )^1)*args)/replacekeyunquoted)*norquoted
+local optional=noloptional*((C((1-nomoptional)^1)*nomoptional*C((1-noroptional)^1)*args)/replaceoptional)*noroptional
local any=P(1)
- replacer=Cs((unquoted+quoted+escape+key+any)^0)
+ replacer=Cs((unquoted+quoted+escape+optional+key+any)^0)
local function replace(str,mapping,how,recurse)
if mapping and str then
return lpegmatch(replacer,str,1,mapping,how or "lua",recurse or false) or str
@@ -8696,7 +9201,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-env"] = package.loaded["util-env"] or true
--- original size: 8814, stripped down to: 5092
+-- original size: 8022, stripped down to: 5038
if not modules then modules={} end modules ['util-env']={
version=1.001,
@@ -8707,7 +9212,7 @@ if not modules then modules={} end modules ['util-env']={
}
local allocate,mark=utilities.storage.allocate,utilities.storage.mark
local format,sub,match,gsub,find=string.format,string.sub,string.match,string.gsub,string.find
-local unquoted,quoted=string.unquoted,string.quoted
+local unquoted,quoted,optionalquoted=string.unquoted,string.quoted,string.optionalquoted
local concat,insert,remove=table.concat,table.insert,table.remove
environment=environment or {}
local environment=environment
@@ -8820,24 +9325,14 @@ function environment.splitarguments(separator)
return before,after
end
function environment.reconstructcommandline(arg,noquote)
+ local resolveprefix=resolvers.resolve
arg=arg or environment.originalarguments
if noquote and #arg==1 then
- local a=arg[1]
- a=resolvers.resolve(a)
- a=unquoted(a)
- return a
+ return unquoted(resolveprefix and resolveprefix(arg[1]) or arg[1])
elseif #arg>0 then
local result={}
for i=1,#arg do
- local a=arg[i]
- a=resolvers.resolve(a)
- a=unquoted(a)
- a=gsub(a,'"','\\"')
- if find(a," ",1,true) then
- result[#result+1]=quoted(a)
- else
- result[#result+1]=a
- end
+ result[i]=optionalquoted(resolveprefix and resolveprefix(arg[i]) or resolveprefix)
end
return concat(result," ")
else
@@ -9046,7 +9541,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-tab"] = package.loaded["lxml-tab"] or true
--- original size: 42614, stripped down to: 26694
+-- original size: 43882, stripped down to: 26870
if not modules then modules={} end modules ['lxml-tab']={
version=1.001,
@@ -9061,10 +9556,10 @@ if lpeg.setmaxstack then lpeg.setmaxstack(1000) end
xml=xml or {}
local xml=xml
local concat,remove,insert=table.concat,table.remove,table.insert
-local type,next,setmetatable,getmetatable,tonumber=type,next,setmetatable,getmetatable,tonumber
+local type,next,setmetatable,getmetatable,tonumber,rawset=type,next,setmetatable,getmetatable,tonumber,rawset
local lower,find,match,gsub=string.lower,string.find,string.match,string.gsub
local utfchar=utf.char
-local lpegmatch=lpeg.match
+local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns
local P,S,R,C,V,C,Cs=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.V,lpeg.C,lpeg.Cs
local formatters=string.formatters
xml.xmlns=xml.xmlns or {}
@@ -9226,9 +9721,10 @@ local function fromdec(s)
return formatters["d:%s"](s),true
end
end
-local rest=(1-P(";"))^0
-local many=P(1)^0
-local parsedentity=P("&")*(P("#x")*(rest/fromhex)+P("#")*(rest/fromdec))*P(";")*P(-1)+(P("#x")*(many/fromhex)+P("#")*(many/fromdec))
+local p_rest=(1-P(";"))^0
+local p_many=P(1)^0
+local p_char=lpegpatterns.utf8character
+local parsedentity=P("&")*(P("#x")*(p_rest/fromhex)+P("#")*(p_rest/fromdec))*P(";")*P(-1)+(P("#x")*(p_many/fromhex)+P("#")*(p_many/fromdec))
local predefined_unified={
[38]="&amp;",
[42]="&quot;",
@@ -9254,7 +9750,9 @@ local privates_u={
local privates_p={}
local privates_n={
}
-local escaped=utf.remapper(privates_u)
+local escaped=utf.remapper(privates_u,"dynamic")
+local unprivatized=utf.remapper(privates_p,"dynamic")
+xml.unprivatized=unprivatized
local function unescaped(s)
local p=privates_n[s]
if not p then
@@ -9267,9 +9765,7 @@ local function unescaped(s)
end
return p
end
-local unprivatized=utf.remapper(privates_p)
xml.privatetoken=unescaped
-xml.unprivatized=unprivatized
xml.privatecodes=privates_n
local function handle_hex_entity(str)
local h=hcache[str]
@@ -9422,7 +9918,7 @@ local valid=R('az','AZ','09')+S('_-.')
local name_yes=C(valid^1)*colon*C(valid^1)
local name_nop=C(P(true))*C(valid^1)
local name=name_yes+name_nop
-local utfbom=lpeg.patterns.utfbom
+local utfbom=lpegpatterns.utfbom
local spacing=C(space^0)
local anyentitycontent=(1-open-semicolon-space-close)^0
local hexentitycontent=R("AF","af","09")^0
@@ -9590,7 +10086,7 @@ local function _xmlconvert_(data,settings)
reported_attribute_errors,mt,errorhandler=nil,nil,nil
return result
end
-function xmlconvert(data,settings)
+local function xmlconvert(data,settings)
local ok,result=pcall(function() return _xmlconvert_(data,settings) end)
if ok then
return result
@@ -9682,14 +10178,17 @@ function xml.checkbom(root)
insert(dt,2,"\n" )
end
end
-local function verbose_element(e,handlers)
+local f_attribute=formatters['%s=%q']
+local function verbose_element(e,handlers,escape)
local handle=handlers.handle
local serialize=handlers.serialize
local ens,etg,eat,edt,ern=e.ns,e.tg,e.at,e.dt,e.rn
local ats=eat and next(eat) and {}
if ats then
+ local n=0
for k,v in next,eat do
- ats[#ats+1]=formatters['%s=%q'](k,escaped(v))
+ n=n+1
+ ats[n]=f_attribute(k,escaped(v))
end
end
if ern and trace_entities and ern~=ens then
@@ -10033,7 +10532,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-lpt"] = package.loaded["lxml-lpt"] or true
--- original size: 48030, stripped down to: 30595
+-- original size: 48229, stripped down to: 30684
if not modules then modules={} end modules ['lxml-lpt']={
version=1.001,
@@ -10418,8 +10917,8 @@ 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")+S("-_:"))^1)*Cc("'])")
-lp_fastpos_p=P("+")^0*R("09")^1*P(-1)/"l==%0"
-lp_fastpos_n=P("-")*R("09")^1*P(-1)/"(%0<0 and (#list+%0==l))"
+local lp_fastpos_p=P("+")^0*R("09")^1*P(-1)/"l==%0"
+local lp_fastpos_n=P("-")*R("09")^1*P(-1)/"(%0<0 and (#list+%0==l))"
local lp_fastpos=lp_fastpos_n+lp_fastpos_p
local lp_reserved=C("and")+C("or")+C("not")+C("div")+C("mod")+C("true")+C("false")
local lp_lua_function=Cs((R("az","AZ","__")^1*(P(".")*R("az","AZ","__")^1)^1)*("("))/"%0"
@@ -10598,7 +11097,7 @@ local function nodesettostring(set,nodetest)
if not ns or ns=="" then ns="*" end
if not tg or tg=="" then tg="*" end
tg=(tg=="@rt@" and "[root]") or format("%s:%s",ns,tg)
- t[i]=(directive and tg) or format("not(%s)",tg)
+ t[#t+1]=(directive and tg) or format("not(%s)",tg)
end
if nodetest==false then
return format("not(%s)",concat(t,"|"))
@@ -10864,7 +11363,6 @@ expressions.print=function(...)
print(...)
return true
end
-expressions.contains=find
expressions.find=find
expressions.upper=upper
expressions.lower=lower
@@ -10886,6 +11384,9 @@ function expressions.contains(str,pattern)
end
return false
end
+function xml.expressions.idstring(str)
+ return type(str)=="string" and gsub(str,"^#","") or ""
+end
local function traverse(root,pattern,handle)
local collected=applylpath(root,pattern)
if collected then
@@ -11173,7 +11674,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-aux"] = package.loaded["lxml-aux"] or true
--- original size: 23804, stripped down to: 16817
+-- original size: 28225, stripped down to: 20125
if not modules then modules={} end modules ['lxml-aux']={
version=1.001,
@@ -11183,16 +11684,19 @@ if not modules then modules={} end modules ['lxml-aux']={
license="see context related readme files"
}
local trace_manipulations=false trackers.register("lxml.manipulations",function(v) trace_manipulations=v end)
+local trace_inclusions=false trackers.register("lxml.inclusions",function(v) trace_inclusions=v end)
local report_xml=logs.reporter("xml")
local xml=xml
-local xmlconvert,xmlcopy,xmlname=xml.convert,xml.copy,xml.name
+local xmlcopy,xmlname=xml.copy,xml.name
local xmlinheritedconvert=xml.inheritedconvert
local xmlapplylpath=xml.applylpath
local xmlfilter=xml.filter
-local type,setmetatable,getmetatable=type,setmetatable,getmetatable
+local type,next,setmetatable,getmetatable=type,next,setmetatable,getmetatable
local insert,remove,fastcopy,concat=table.insert,table.remove,table.fastcopy,table.concat
local gmatch,gsub,format,find,strip=string.gmatch,string.gsub,string.format,string.find,string.strip
local utfbyte=utf.byte
+local lpegmatch=lpeg.match
+local striplinepatterns=utilities.strings.striplinepatterns
local function report(what,pattern,c,e)
report_xml("%s element %a, root %a, position %a, index %a, pattern %a",what,xmlname(e),xmlname(e.__p__),c,e.ni,pattern)
end
@@ -11247,13 +11751,15 @@ end
function xml.each(root,pattern,handle,reverse)
local collected=xmlapplylpath(root,pattern)
if collected then
- if reverse then
- for c=#collected,1,-1 do
- handle(collected[c])
- end
- else
- for c=1,#collected do
- handle(collected[c])
+ if handle then
+ if reverse then
+ for c=#collected,1,-1 do
+ handle(collected[c])
+ end
+ else
+ for c=1,#collected do
+ handle(collected[c])
+ end
end
end
return collected
@@ -11309,6 +11815,7 @@ local function redo_ni(d)
end
end
end
+xml.reindex=redo_ni
local function xmltoelement(whatever,root)
if not whatever then
return nil
@@ -11360,8 +11867,16 @@ function xml.delete(root,pattern)
report('deleting',pattern,c,e)
end
local d=p.dt
- remove(d,e.ni)
- redo_ni(d)
+ local ni=e.ni
+ if ni<=#d then
+ if false then
+ p.dt[ni]=""
+ else
+ remove(d,ni)
+ redo_ni(d)
+ end
+ else
+ end
end
end
end
@@ -11481,28 +11996,40 @@ 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)
+local function include(xmldata,pattern,attribute,recursive,loaddata,level)
pattern=pattern or 'include'
loaddata=loaddata or io.loaddata
local collected=xmlapplylpath(xmldata,pattern)
if collected then
+ if not level then
+ level=1
+ end
for c=1,#collected do
local ek=collected[c]
local name=nil
local ekdt=ek.dt
local ekat=ek.at
- local epdt=ek.__p__.dt
+ local ekrt=ek.__p__
+ local epdt=ekrt.dt
if not attribute or attribute=="" then
name=(type(ekdt)=="table" and ekdt[1]) or ekdt
end
if not name then
for a in gmatch(attribute or "href","([^|]+)") do
name=ekat[a]
- if name then break end
+ if name then
+ break
+ end
+ end
+ end
+ local data=nil
+ if name and name~="" then
+ data=loaddata(name) or ""
+ if trace_inclusions then
+ report_xml("including %s bytes from %a at level %s by pattern %a and attribute %a (%srecursing)",#data,name,level,pattern,attribute or "",recursive and "" or "not ")
end
end
- local data=(name and name~="" and loaddata(name)) or ""
- if data=="" then
+ if not data or data=="" then
epdt[ek.ni]=""
elseif ekat["parse"]=="text" then
epdt[ek.ni]=xml.escaped(data)
@@ -11512,70 +12039,113 @@ local function include(xmldata,pattern,attribute,recursive,loaddata)
epdt[ek.ni]=""
else
if recursive then
- include(xi,pattern,attribute,recursive,loaddata)
+ include(xi,pattern,attribute,recursive,loaddata,level+1)
+ end
+ local child=xml.body(xi)
+ child.__p__=ekrt
+ child.__f__=name
+ epdt[ek.ni]=child
+ local inclusions=xmldata.settings.inclusions
+ if inclusions then
+ inclusions[#inclusions+1]=name
+ else
+ xmldata.settings.inclusions={ name }
end
- epdt[ek.ni]=xml.body(xi)
end
end
end
end
end
xml.include=include
+function xml.inclusion(e,default)
+ while e do
+ local f=e.__f__
+ if f then
+ return f
+ else
+ e=e.__p__
+ end
+ end
+ return default
+end
+function xml.inclusions(e,sorted)
+ while e do
+ local settings=e.settings
+ if settings then
+ local inclusions=settings.inclusions
+ if inclusions then
+ inclusions=table.unique(inclusions)
+ if sorted then
+ table.sort(inclusions)
+ end
+ return inclusions
+ else
+ e=e.__p__
+ end
+ else
+ e=e.__p__
+ end
+ end
+end
+local b_collapser=lpeg.patterns.b_collapser
+local m_collapser=lpeg.patterns.m_collapser
+local e_collapser=lpeg.patterns.e_collapser
+local b_stripper=lpeg.patterns.b_stripper
+local m_stripper=lpeg.patterns.m_stripper
+local e_stripper=lpeg.patterns.e_stripper
+local lpegmatch=lpeg.match
local function stripelement(e,nolines,anywhere)
local edt=e.dt
if edt then
- if anywhere then
- local t,n={},0
- for e=1,#edt do
+ local n=#edt
+ if n==0 then
+ return e
+ elseif anywhere then
+ local t={}
+ local m=0
+ for e=1,n do
local str=edt[e]
if type(str)~="string" then
- n=n+1
- t[n]=str
+ m=m+1
+ t[m]=str
elseif str~="" then
if nolines then
- str=gsub(str,"%s+"," ")
+ str=lpegmatch((n==1 and b_collapser) or (n==m and e_collapser) or m_collapser,str)
+ else
+ str=lpegmatch((n==1 and b_stripper) or (n==m and e_stripper) or m_stripper,str)
end
- str=gsub(str,"^%s*(.-)%s*$","%1")
if str~="" then
- n=n+1
- t[n]=str
+ m=m+1
+ t[m]=str
end
end
end
e.dt=t
else
- if #edt>0 then
- local str=edt[1]
- if type(str)~="string" then
- elseif str=="" then
+ local str=edt[1]
+ if type(str)=="string" then
+ if str~="" then
+ str=lpegmatch(nolines and b_collapser or b_stripper,str)
+ end
+ if str=="" then
remove(edt,1)
+ n=n-1
else
- if nolines then
- str=gsub(str,"%s+"," ")
- end
- str=gsub(str,"^%s+","")
- if str=="" then
- remove(edt,1)
- else
- edt[1]=str
- end
+ edt[1]=str
end
end
- local nedt=#edt
- if nedt>0 then
- local str=edt[nedt]
- if type(str)~="string" then
- elseif str=="" then
- remove(edt)
- else
- if nolines then
- str=gsub(str,"%s+"," ")
- end
- str=gsub(str,"%s+$","")
+ if n>0 then
+ str=edt[n]
+ if type(str)=="string" then
if str=="" then
remove(edt)
else
- edt[nedt]=str
+ str=lpegmatch(nolines and e_collapser or e_stripper,str)
+ if str=="" then
+ remove(edt)
+ else
+ edt[n]=str
+ end
end
end
end
@@ -11761,8 +12331,8 @@ function xml.finalizers.xml.cdata(collected)
end
return ""
end
-function xml.insertcomment(e,str,n)
- table.insert(e.dt,n or 1,{
+function xml.insertcomment(e,str,n)
+ insert(e.dt,n or 1,{
tg="@cm@",
ns="",
special=true,
@@ -11770,7 +12340,25 @@ function xml.insertcomment(e,str,n)
dt={ str },
})
end
-function xml.setcdata(e,str)
+function xml.insertcdata(e,str,n)
+ insert(e.dt,n or 1,{
+ tg="@cd@",
+ ns="",
+ special=true,
+ at={},
+ dt={ str },
+ })
+end
+function xml.setcomment(e,str,n)
+ e.dt={ {
+ tg="@cm@",
+ ns="",
+ special=true,
+ at={},
+ dt={ str },
+ } }
+end
+function xml.setcdata(e,str)
e.dt={ {
tg="@cd@",
ns="",
@@ -11840,7 +12428,7 @@ local function recurse(e,action)
for i=1,#edt do
local str=edt[i]
if type(str)~="string" then
- recurse(str,action,recursive)
+ recurse(str,action)
elseif str~="" then
edt[i]=action(str)
end
@@ -11858,6 +12446,65 @@ function helpers.recursetext(collected,action,recursive)
end
end
end
+local specials={
+ ["@rt@"]="root",
+ ["@pi@"]="instruction",
+ ["@cm@"]="comment",
+ ["@dt@"]="declaration",
+ ["@cd@"]="cdata",
+}
+local function convert(x,strip,flat)
+ local ns=x.ns
+ local tg=x.tg
+ local at=x.at
+ local dt=x.dt
+ local node=flat and {
+ [0]=(not x.special and (ns~="" and ns..":"..tg or tg)) or nil,
+ } or {
+ _namespace=ns~="" and ns or nil,
+ _tag=not x.special and tg or nil,
+ _type=specials[tg] or "_element",
+ }
+ if at then
+ for k,v in next,at do
+ node[k]=v
+ end
+ end
+ local n=0
+ for i=1,#dt do
+ local di=dt[i]
+ if type(di)=="table" then
+ if flat and di.special then
+ else
+ di=convert(di,strip,flat)
+ if di then
+ n=n+1
+ node[n]=di
+ end
+ end
+ elseif strip then
+ di=lpegmatch(strip,di)
+ if di~="" then
+ n=n+1
+ node[n]=di
+ end
+ else
+ n=n+1
+ node[n]=di
+ end
+ end
+ if next(node) then
+ return node
+ end
+end
+function xml.totable(x,strip,flat)
+ if type(x)=="table" then
+ if strip then
+ strip=striplinepatterns[strip]
+ end
+ return convert(x,strip,flat)
+ end
+end
end -- of closure
@@ -12414,7 +13061,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-ini"] = package.loaded["data-ini"] or true
--- original size: 7927, stripped down to: 5528
+-- original size: 11085, stripped down to: 7662
if not modules then modules={} end modules ['data-ini']={
version=1.001,
@@ -12423,14 +13070,15 @@ if not modules then modules={} end modules ['data-ini']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files",
}
+local next,type,getmetatable,rawset=next,type,getmetatable,rawset
local gsub,find,gmatch,char=string.gsub,string.find,string.gmatch,string.char
-local next,type=next,type
local filedirname,filebasename,filejoin=file.dirname,file.basename,file.join
+local ostype,osname,osuname,ossetenv,osgetenv=os.type,os.name,os.uname,os.setenv,os.getenv
+local P,S,R,C,Cs,Cc,lpegmatch=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local trace_detail=false trackers.register("resolvers.details",function(v) trace_detail=v end)
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
resolvers=resolvers or {}
local resolvers=resolvers
texconfig.kpse_init=false
@@ -12563,10 +13211,103 @@ if type(profiler)=="table" and not jit then
profiler.start("luatex-profile.log")
end)
end
-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
+local prefixes=utilities.storage.allocate()
+resolvers.prefixes=prefixes
+local resolved={}
+local abstract={}
+local dynamic={}
+function resolvers.resetresolve(str)
+ resolved,abstract={},{}
+end
+function resolvers.allprefixes(separator)
+ local all=table.sortedkeys(prefixes)
+ if separator then
+ for i=1,#all do
+ all[i]=all[i]..":"
+ end
+ end
+ return all
+end
+local function _resolve_(method,target)
+ local action=prefixes[method]
+ if action then
+ return action(target)
+ else
+ return method..":"..target
+ end
+end
+function resolvers.unresolve(str)
+ return abstract[str] or str
+end
+function resolvers.setdynamic(str)
+ dynamic[str]=true
+end
+local pattern=Cs((C(R("az")^2)*P(":")*C((1-S(" \"\';,"))^1)/_resolve_+P(1))^0)
+local prefix=C(R("az")^2)*P(":")
+local target=C((1-S(" \"\';,"))^1)
+local notarget=(#S(";,")+P(-1))*Cc("")
+local p_resolve=Cs(((prefix*(target+notarget))/_resolve_+P(1))^0)
+local p_simple=prefix*P(-1)
+local function resolve(str)
+ if type(str)=="table" then
+ local res={}
+ for i=1,#str do
+ res[i]=resolve(str[i])
+ end
+ return res
+ end
+ local res=resolved[str]
+ if res then
+ return res
+ end
+ local simple=lpegmatch(p_simple,str)
+ local action=prefixes[simple]
+ if action then
+ local res=action(res)
+ if not dynamic[simple] then
+ resolved[simple]=res
+ abstract[res]=simple
+ end
+ return res
+ end
+ res=lpegmatch(p_resolve,str)
+ resolved[str]=res
+ abstract[res]=str
+ return res
+end
+resolvers.resolve=resolve
+if type(osuname)=="function" then
+ for k,v in next,osuname() do
+ if not prefixes[k] then
+ prefixes[k]=function() return v end
+ end
+ end
+end
+if ostype=="unix" then
+ local pattern
+ local function makepattern(t,k,v)
+ if t then
+ rawset(t,k,v)
+ end
+ local colon=P(":")
+ for k,v in table.sortedpairs(prefixes) do
+ if p then
+ p=P(k)+p
+ else
+ p=P(k)
+ end
+ end
+ pattern=Cs((p*colon+colon/";"+P(1))^0)
+ end
+ makepattern()
+ table.setmetatablenewindex(prefixes,makepattern)
+ function resolvers.repath(str)
+ return lpegmatch(pattern,str)
+ end
+else
+ function resolvers.repath(str)
+ return str
+ end
end
@@ -12576,7 +13317,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-exp"] = package.loaded["data-exp"] or true
--- original size: 15317, stripped down to: 9723
+-- original size: 17216, stripped down to: 10657
if not modules then modules={} end modules ['data-exp']={
version=1.001,
@@ -12590,12 +13331,16 @@ local concat,sort=table.concat,table.sort
local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns
local Ct,Cs,Cc,Carg,P,C,S=lpeg.Ct,lpeg.Cs,lpeg.Cc,lpeg.Carg,lpeg.P,lpeg.C,lpeg.S
local type,next=type,next
+local isdir=lfs.isdir
local ostype=os.type
-local collapsepath=file.collapsepath
+local collapsepath,joinpath,basename=file.collapsepath,file.join,file.basename
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local trace_expansions=false trackers.register("resolvers.expansions",function(v) trace_expansions=v end)
+local trace_globbing=true trackers.register("resolvers.globbing",function(v) trace_globbing=v end)
local report_expansions=logs.reporter("resolvers","expansions")
+local report_globbing=logs.reporter("resolvers","globbing")
local resolvers=resolvers
+local resolveprefix=resolvers.resolve
local function f_both(a,b)
local t,n={},0
for sb in gmatch(b,"[^,]+") do
@@ -12685,35 +13430,27 @@ function resolvers.expandedpathfromlist(pathlist)
end
return newlist
end
-local cleanup=lpeg.replacer {
- { "!","" },
- { "\\","/" },
-}
-function resolvers.cleanpath(str)
- local doslashes=(P("\\")/"/"+1)^0
- local donegation=(P("!")/"" )^0
- local homedir=lpegmatch(Cs(donegation*doslashes),environment.homedir or "")
- if homedir=="~" or homedir=="" or not lfs.isdir(homedir) then
- if trace_expansions then
- report_expansions("no home dir set, ignoring dependent paths")
- end
- function resolvers.cleanpath(str)
- if not str or find(str,"~",1,true) then
- return ""
- else
- return lpegmatch(cleanup,str)
+local usedhomedir=nil
+local donegation=(P("!")/"" )^0
+local doslashes=(P("\\")/"/"+1)^0
+local function expandedhome()
+ if not usedhomedir then
+ usedhomedir=lpegmatch(Cs(donegation*doslashes),environment.homedir or "")
+ if usedhomedir=="~" or usedhomedir=="" or not isdir(usedhomedir) then
+ if trace_expansions then
+ report_expansions("no home dir set, ignoring dependent path using current path")
end
- end
- else
- local dohome=((P("~")+P("$HOME"))/homedir)^0
- local cleanup=Cs(donegation*dohome*doslashes)
- function resolvers.cleanpath(str)
- return str and lpegmatch(cleanup,str) or ""
+ usedhomedir="."
end
end
- return resolvers.cleanpath(str)
+ return usedhomedir
+end
+local dohome=((P("~")+P("$HOME")+P("%HOME%"))/expandedhome)^0
+local cleanup=Cs(donegation*dohome*doslashes)
+resolvers.cleanpath=function(str)
+ return str and lpegmatch(cleanup,str) or ""
end
-local expandhome=P("~")/"$HOME"
+local expandhome=P("~")/"$HOME"
local dodouble=P('"')/""*(expandhome+(1-P('"')))^0*P('"')/""
local dosingle=P("'")/""*(expandhome+(1-P("'")))^0*P("'")/""
local dostring=(expandhome+1 )^0
@@ -12765,46 +13502,67 @@ function resolvers.splitpath(str)
end
function resolvers.joinpath(str)
if type(str)=='table' then
- return file.joinpath(str)
+ return joinpath(str)
else
return str
end
end
local attributes,directory=lfs.attributes,lfs.dir
local weird=P(".")^1+lpeg.anywhere(S("~`!#$%^&*()={}[]:;\"\'||<>,?\n\r\t"))
+local lessweird=P(".")^1+lpeg.anywhere(S("~`#$%^&*:;\"\'||<>,?\n\r\t"))
local timer={}
local scanned={}
local nofscans=0
local scancache={}
-local function scan(files,spec,path,n,m,r)
- local full=(path=="" and spec) or (spec..path..'/')
+local fullcache={}
+local nofsharedscans=0
+local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant)
+ local full=path=="" and spec or (spec..path..'/')
local dirs={}
local nofdirs=0
+ local pattern=tolerant and lessweird or weird
for name in directory(full) do
- if not lpegmatch(weird,name) then
- local mode=attributes(full..name,'mode')
- if mode=='file' then
+ if not lpegmatch(pattern,name) then
+ local mode=attributes(full..name,"mode")
+ if mode=="file" then
n=n+1
- local f=files[name]
- if f then
- if type(f)=='string' then
- files[name]={ f,path }
+ local lower=lower(name)
+ local paths=files[lower]
+ if paths then
+ if onlyone then
else
- f[#f+1]=path
+ if type(paths)=="string" then
+ files[lower]={ paths,path }
+ else
+ paths[#paths+1]=path
+ end
+ if name~=lower then
+ local rl=remap[lower]
+ if not rl then
+ remap[lower]=name
+ r=r+1
+ elseif trace_globbing and rl~=name then
+ report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl)
+ end
+ end
end
else
- files[name]=path
- local lower=lower(name)
+ files[lower]=path
if name~=lower then
- files["remap:"..lower]=name
- r=r+1
+ local rl=remap[lower]
+ if not rl then
+ remap[lower]=name
+ r=r+1
+ elseif trace_globbing and rl~=name then
+ report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl)
+ end
end
end
- elseif mode=='directory' then
+ elseif mode=="directory" then
m=m+1
nofdirs=nofdirs+1
if path~="" then
- dirs[nofdirs]=path..'/'..name
+ dirs[nofdirs]=path.."/"..name
else
dirs[nofdirs]=name
end
@@ -12814,107 +13572,69 @@ local function scan(files,spec,path,n,m,r)
if nofdirs>0 then
sort(dirs)
for i=1,nofdirs do
- files,n,m,r=scan(files,spec,dirs[i],n,m,r)
+ files,remap,n,m,r=scan(files,remap,spec,dirs[i],n,m,r,onlyonce,tolerant)
end
end
scancache[sub(full,1,-2)]=files
- return files,n,m,r
+ return files,remap,n,m,r
end
-local fullcache={}
-function resolvers.scanfiles(path,branch,usecache)
- statistics.starttiming(timer)
- local realpath=resolvers.resolve(path)
+function resolvers.scanfiles(path,branch,usecache,onlyonce,tolerant)
+ local realpath=resolveprefix(path)
if usecache then
- local files=fullcache[realpath]
- if files then
+ local content=fullcache[realpath]
+ if content then
if trace_locating then
- report_expansions("using caches scan of path %a, branch %a",path,branch or path)
+ report_expansions("using cached scan of path %a, branch %a",path,branch or path)
end
- return files
+ nofsharedscans=nofsharedscans+1
+ return content
end
end
+ statistics.starttiming(timer)
if trace_locating then
report_expansions("scanning path %a, branch %a",path,branch or path)
end
- local files,n,m,r=scan({},realpath..'/',"",0,0,0)
- files.__path__=path
- 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
- if usecache then
- scanned[#scanned+1]=realpath
- fullcache[realpath]=files
- end
- nofscans=nofscans+1
- statistics.stoptiming(timer)
- return files
-end
-local function simplescan(files,spec,path)
- local full=(path=="" and spec) or (spec..path..'/')
- local dirs={}
- local nofdirs=0
- for name in directory(full) do
- if not lpegmatch(weird,name) then
- local mode=attributes(full..name,'mode')
- if mode=='file' then
- if not files[name] then
- files[name]=path
- end
- elseif mode=='directory' then
- nofdirs=nofdirs+1
- if path~="" then
- dirs[nofdirs]=path..'/'..name
- else
- dirs[nofdirs]=name
- end
- end
- end
- end
- if nofdirs>0 then
- sort(dirs)
- for i=1,nofdirs do
- files=simplescan(files,spec,dirs[i])
- end
- end
- return files
-end
-local simplecache={}
-local nofsharedscans=0
-function resolvers.simplescanfiles(path,branch,usecache)
- statistics.starttiming(timer)
- local realpath=resolvers.resolve(path)
- if usecache then
- local files=simplecache[realpath]
- if not files then
- files=scancache[realpath]
- if files then
- nofsharedscans=nofsharedscans+1
- end
+ local content
+ if isdir(realpath) then
+ local files,remap,n,m,r=scan({},{},realpath..'/',"",0,0,0,onlyonce,tolerant)
+ content={
+ metadata={
+ path=path,
+ files=n,
+ directories=m,
+ remappings=r,
+ },
+ files=files,
+ remap=remap,
+ }
+ if trace_locating then
+ report_expansions("%s files found on %s directories with %s uppercase remappings",n,m,r)
end
- if files then
- if trace_locating then
- report_expansions("using caches scan of path %a, branch %a",path,branch or path)
- end
- return files
+ else
+ content={
+ metadata={
+ path=path,
+ files=0,
+ directories=0,
+ remappings=0,
+ },
+ files={},
+ remap={},
+ }
+ if trace_locating then
+ report_expansions("invalid path %a",realpath)
end
end
- if trace_locating then
- report_expansions("scanning path %a, branch %a",path,branch or path)
- end
- local files=simplescan({},realpath..'/',"")
- if trace_locating then
- report_expansions("%s files found",table.count(files))
- end
if usecache then
scanned[#scanned+1]=realpath
- simplecache[realpath]=files
+ fullcache[realpath]=content
end
nofscans=nofscans+1
statistics.stoptiming(timer)
- return files
+ return content
+end
+function resolvers.simplescanfiles(path,branch,usecache)
+ return resolvers.scanfiles(path,branch,usecache,true,true)
end
function resolvers.scandata()
table.sort(scanned)
@@ -12925,6 +13645,52 @@ function resolvers.scandata()
paths=scanned,
}
end
+function resolvers.get_from_content(content,path,name)
+ if not content then
+ return
+ end
+ local files=content.files
+ if not files then
+ return
+ end
+ local remap=content.remap
+ if not remap then
+ return
+ end
+ if name then
+ local used=lower(name)
+ return path,remap[used] or used
+ else
+ local name=path
+ local used=lower(name)
+ local path=files[used]
+ if path then
+ return path,remap[used] or used
+ end
+ end
+end
+local nothing=function() end
+function resolvers.filtered_from_content(content,pattern)
+ if content and type(pattern)=="string" then
+ local pattern=lower(pattern)
+ local files=content.files
+ local remap=content.remap
+ if files and remap then
+ local n=next(files)
+ local function iterator()
+ while n do
+ local k=n
+ n=next(files,k)
+ if find(k,pattern) then
+ return files[k],remap and remap[k] or k
+ end
+ end
+ end
+ return iterator
+ end
+ end
+ return nothing
+end
end -- of closure
@@ -12933,7 +13699,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-env"] = package.loaded["data-env"] or true
--- original size: 8769, stripped down to: 6490
+-- original size: 9216, stripped down to: 6798
if not modules then modules={} end modules ['data-env']={
version=1.001,
@@ -12951,10 +13717,12 @@ local formats=allocate()
local suffixes=allocate()
local dangerous=allocate()
local suffixmap=allocate()
+local usertypes=allocate()
resolvers.formats=formats
resolvers.suffixes=suffixes
resolvers.dangerous=dangerous
resolvers.suffixmap=suffixmap
+resolvers.usertypes=usertypes
local luasuffixes=utilities.lua.suffixes
local relations=allocate {
core={
@@ -13022,11 +13790,13 @@ local relations=allocate {
names={ "mp" },
variable='MPINPUTS',
suffixes={ 'mp','mpvi','mpiv','mpii' },
+ usertype=true,
},
tex={
names={ "tex" },
variable='TEXINPUTS',
- suffixes={ 'tex',"mkvi","mkiv","mkii" },
+ suffixes={ "tex","mkvi","mkiv","mkii","cld","lfg","xml" },
+ usertype=true,
},
icc={
names={ "icc","icc profile","icc profiles" },
@@ -13042,6 +13812,7 @@ local relations=allocate {
names={ "lua" },
variable='LUAINPUTS',
suffixes={ luasuffixes.lua,luasuffixes.luc,luasuffixes.tma,luasuffixes.tmc },
+ usertype=true,
},
lib={
names={ "lib" },
@@ -13050,11 +13821,15 @@ local relations=allocate {
},
bib={
names={ 'bib' },
+ variable='BIBINPUTS',
suffixes={ 'bib' },
+ usertype=true,
},
bst={
names={ 'bst' },
+ variable='BSTINPUTS',
suffixes={ 'bst' },
+ usertype=true,
},
fontconfig={
names={ 'fontconfig','fontconfig file','fontconfig files' },
@@ -13136,8 +13911,9 @@ function resolvers.updaterelations()
for name,relation in next,categories do
local rn=relation.names
local rv=relation.variable
- local rs=relation.suffixes
if rn and rv then
+ local rs=relation.suffixes
+ local ru=relation.usertype
for i=1,#rn do
local rni=lower(gsub(rn[i]," ",""))
formats[rni]=rv
@@ -13149,8 +13925,9 @@ function resolvers.updaterelations()
end
end
end
- end
- if rs then
+ if ru then
+ usertypes[name]=true
+ end
end
end
end
@@ -13201,7 +13978,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tmp"] = package.loaded["data-tmp"] or true
--- original size: 15532, stripped down to: 11648
+-- original size: 15681, stripped down to: 11761
if not modules then modules={} end modules ['data-tmp']={
version=1.100,
@@ -13220,6 +13997,7 @@ local trace_cache=false trackers.register("resolvers.cache",function(v) trace_ca
local report_caches=logs.reporter("resolvers","caches")
local report_resolvers=logs.reporter("resolvers","caching")
local resolvers=resolvers
+local cleanpath=resolvers.cleanpath
local directive_cleanup=false directives.register("system.compile.cleanup",function(v) directive_cleanup=v end)
local directive_strip=false directives.register("system.compile.strip",function(v) directive_strip=v end)
local compile=utilities.lua.compile
@@ -13241,7 +14019,7 @@ caches.relocate=false
caches.defaults={ "TMPDIR","TEMPDIR","TMP","TEMP","HOME","HOMEPATH" }
local writable,readables,usedreadables=nil,{},{}
local function identify()
- local texmfcaches=resolvers.cleanpathlist("TEXMFCACHE")
+ local texmfcaches=resolvers.cleanpathlist("TEXMFCACHE")
if texmfcaches then
for k=1,#texmfcaches do
local cachepath=texmfcaches[k]
@@ -13495,10 +14273,12 @@ 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(addsuffix(name,luasuffixes.lua),"trees")
- local filename=file.join(path,name)
+function caches.loadcontent(cachename,dataname,filename)
+ if not filename then
+ local name=caches.hashed(cachename)
+ local full,path=caches.getfirstreadablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename=file.join(path,name)
+ end
local blob=loadfile(addsuffix(filename,luasuffixes.luc)) or loadfile(addsuffix(filename,luasuffixes.lua))
if blob then
local data=blob()
@@ -13530,10 +14310,12 @@ function caches.collapsecontent(content)
end
end
end
-function caches.savecontent(cachename,dataname,content)
- local name=caches.hashed(cachename)
- local full,path=caches.setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
- local filename=file.join(path,name)
+function caches.savecontent(cachename,dataname,content,filename)
+ if not filename then
+ local name=caches.hashed(cachename)
+ local full,path=caches.setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename=file.join(path,name)
+ end
local luaname=addsuffix(filename,luasuffixes.lua)
local lucname=addsuffix(filename,luasuffixes.luc)
if trace_locating then
@@ -13576,7 +14358,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-met"] = package.loaded["data-met"] or true
--- original size: 5460, stripped down to: 4014
+-- original size: 5347, stripped down to: 4015
if not modules then modules={} end modules ['data-met']={
version=1.100,
@@ -13604,7 +14386,7 @@ local function splitmethod(filename)
if type(filename)=="table" then
return filename
end
- filename=file.collapsepath(filename,".")
+ filename=file.collapsepath(filename,".")
if not find(filename,"://",1,true) then
return { scheme="file",path=filename,original=filename,filename=filename }
end
@@ -13695,7 +14477,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-res"] = package.loaded["data-res"] or true
--- original size: 62045, stripped down to: 43116
+-- original size: 67003, stripped down to: 46291
if not modules then modules={} end modules ['data-res']={
version=1.001,
@@ -13705,7 +14487,7 @@ if not modules then modules={} end modules ['data-res']={
license="see context related readme files",
}
local gsub,find,lower,upper,match,gmatch=string.gsub,string.find,string.lower,string.upper,string.match,string.gmatch
-local concat,insert,sortedkeys=table.concat,table.insert,table.sortedkeys
+local concat,insert,remove,sortedkeys,sortedhash=table.concat,table.insert,table.remove,table.sortedkeys,table.sortedhash
local next,type,rawget=next,type,rawget
local os=os
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
@@ -13714,17 +14496,23 @@ local formatters=string.formatters
local filedirname=file.dirname
local filebasename=file.basename
local suffixonly=file.suffixonly
+local addsuffix=file.addsuffix
+local removesuffix=file.removesuffix
local filejoin=file.join
local collapsepath=file.collapsepath
local joinpath=file.joinpath
+local is_qualified_path=file.is_qualified_path
local allocate=utilities.storage.allocate
local settings_to_array=utilities.parsers.settings_to_array
+local getcurrentdir=lfs.currentdir
+local isfile=lfs.isfile
+local isdir=lfs.isdir
local setmetatableindex=table.setmetatableindex
local luasuffixes=utilities.lua.suffixes
-local getcurrentdir=lfs.currentdir
local trace_locating=false trackers .register("resolvers.locating",function(v) trace_locating=v end)
local trace_detail=false trackers .register("resolvers.details",function(v) trace_detail=v end)
local trace_expansions=false trackers .register("resolvers.expansions",function(v) trace_expansions=v end)
+local trace_paths=false trackers .register("resolvers.paths",function(v) trace_paths=v end)
local resolve_otherwise=true directives.register("resolvers.otherwise",function(v) resolve_otherwise=v end)
local report_resolving=logs.reporter("resolvers","resolving")
local resolvers=resolvers
@@ -13732,10 +14520,14 @@ local expandedpathfromlist=resolvers.expandedpathfromlist
local checkedvariable=resolvers.checkedvariable
local splitconfigurationpath=resolvers.splitconfigurationpath
local methodhandler=resolvers.methodhandler
+local filtered=resolvers.filtered_from_content
+local lookup=resolvers.get_from_content
+local cleanpath=resolvers.cleanpath
+local resolveprefix=resolvers.resolve
local initializesetter=utilities.setters.initialize
local ostype,osname,osenv,ossetenv,osgetenv=os.type,os.name,os.env,os.setenv,os.getenv
-resolvers.cacheversion='1.0.1'
-resolvers.configbanner=''
+resolvers.cacheversion="1.100"
+resolvers.configbanner=""
resolvers.homedir=environment.homedir
resolvers.criticalvars=allocate { "SELFAUTOLOC","SELFAUTODIR","SELFAUTOPARENT","TEXMFCNF","TEXMF","TEXOS" }
resolvers.luacnfname="texmfcnf.lua"
@@ -13754,6 +14546,7 @@ end
local unset_variable="unset"
local formats=resolvers.formats
local suffixes=resolvers.suffixes
+local usertypes=resolvers.usertypes
local dangerous=resolvers.dangerous
local suffixmap=resolvers.suffixmap
resolvers.defaultsuffixes={ "tex" }
@@ -13762,7 +14555,7 @@ local instance=resolvers.instance or nil
function resolvers.setenv(key,value,raw)
if instance then
instance.environment[key]=value
- ossetenv(key,raw and value or resolvers.resolve(value))
+ ossetenv(key,raw and value or resolveprefix(value))
end
end
local function getenv(key)
@@ -13776,7 +14569,7 @@ local function getenv(key)
end
resolvers.getenv=getenv
resolvers.env=getenv
-local function resolve(k)
+local function resolvevariable(k)
return instance.expansions[k]
end
local dollarstripper=lpeg.stripper("$")
@@ -13785,19 +14578,19 @@ 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 variableexpander=Cs((somevariable*(somekey/resolvevariable)+somethingelse)^1 )
local cleaner=P("\\")/"/"+P(";")*S("!{}/\\")^0*P(";")^1/";"
local variablecleaner=Cs((cleaner+P(1))^0)
-local somevariable=R("az","AZ","09","__","--")^1/resolve
+local somevariable=R("az","AZ","09","__","--")^1/resolvevariable
local variable=(P("$")/"")*(somevariable+(P("{")/"")*somevariable*(P("}")/""))
local variableresolver=Cs((variable+P(1))^0)
local function expandedvariable(var)
return lpegmatch(variableexpander,var) or var
end
-function resolvers.newinstance()
- if trace_locating then
+function resolvers.newinstance()
+ if trace_locating then
report_resolving("creating instance")
- end
+ end
local environment,variables,expansions,order=allocate(),allocate(),allocate(),allocate()
local newinstance={
environment=environment,
@@ -13810,6 +14603,7 @@ function resolvers.newinstance()
foundintrees=allocate(),
hashes=allocate(),
hashed=allocate(),
+ pathlists=false,
specification=allocate(),
lists=allocate(),
data=allocate(),
@@ -13822,6 +14616,7 @@ function resolvers.newinstance()
savelists=true,
pattern=nil,
force_suffixes=true,
+ pathstack={},
}
setmetatableindex(variables,function(t,k)
local v
@@ -13871,8 +14666,13 @@ function resolvers.reset()
end
local function reset_hashes()
instance.lists={}
+ instance.pathlists=false
instance.found={}
end
+local function reset_caches()
+ instance.lists={}
+ instance.pathlists=false
+end
local slash=P("/")
local pathexpressionpattern=Cs (
Cc("^")*(
@@ -13924,13 +14724,13 @@ local function identify_configuration_files()
for i=1,#cnfpaths do
local filepath=cnfpaths[i]
local filename=collapsepath(filejoin(filepath,luacnfname))
- local realname=resolvers.resolve(filename)
+ local realname=resolveprefix(filename)
if trace_locating then
- local fullpath=gsub(resolvers.resolve(collapsepath(filepath)),"//","/")
+ local fullpath=gsub(resolveprefix(collapsepath(filepath)),"//","/")
local weirdpath=find(fullpath,"/texmf.+/texmf") or not find(fullpath,"/web2c",1,true)
report_resolving("looking for %a on %s path %a from specification %a",luacnfname,weirdpath and "weird" or "given",fullpath,filepath)
end
- if lfs.isfile(realname) then
+ if isfile(realname) then
specification[#specification+1]=filename
if trace_locating then
report_resolving("found configuration file %a",realname)
@@ -13952,7 +14752,7 @@ local function load_configuration_files()
local filename=specification[i]
local pathname=filedirname(filename)
local filename=filejoin(pathname,luacnfname)
- local realname=resolvers.resolve(filename)
+ local realname=resolveprefix(filename)
local blob=loadfile(realname)
if blob then
local setups=instance.setups
@@ -13960,7 +14760,7 @@ local function load_configuration_files()
local parent=data and data.parent
if parent then
local filename=filejoin(pathname,parent)
- local realname=resolvers.resolve(filename)
+ local realname=resolveprefix(filename)
local blob=loadfile(realname)
if blob then
local parentdata=blob()
@@ -13985,7 +14785,7 @@ local function load_configuration_files()
elseif variables[k]==nil then
if trace_locating and not warning then
report_resolving("variables like %a in configuration file %a should move to the 'variables' subtable",
- k,resolvers.resolve(filename))
+ k,resolveprefix(filename))
warning=true
end
variables[k]=v
@@ -14045,7 +14845,7 @@ local function locate_file_databases()
local stripped=lpegmatch(inhibitstripper,path)
if stripped~="" then
local runtime=stripped==path
- path=resolvers.cleanpath(path)
+ path=cleanpath(path)
local spec=resolvers.splitmethod(stripped)
if runtime and (spec.noscheme or spec.scheme=="file") then
stripped="tree:///"..stripped
@@ -14108,8 +14908,8 @@ function resolvers.renew(hashname)
report_resolving("identifying tree %a",hashname)
end
end
- local realpath=resolvers.resolve(hashname)
- if lfs.isdir(realpath) then
+ local realpath=resolveprefix(hashname)
+ if isdir(realpath) then
if trace_locating then
report_resolving("using path %a",realpath)
end
@@ -14210,19 +15010,53 @@ end
function resolvers.unexpandedpath(str)
return joinpath(resolvers.unexpandedpathlist(str))
end
+function resolvers.pushpath(name)
+ local pathstack=instance.pathstack
+ local lastpath=pathstack[#pathstack]
+ local pluspath=filedirname(name)
+ if lastpath then
+ lastpath=collapsepath(filejoin(lastpath,pluspath))
+ else
+ lastpath=collapsepath(pluspath)
+ end
+ insert(pathstack,lastpath)
+ if trace_paths then
+ report_resolving("pushing path %a",lastpath)
+ end
+end
+function resolvers.poppath()
+ local pathstack=instance.pathstack
+ if trace_paths and #pathstack>0 then
+ report_resolving("popping path %a",pathstack[#pathstack])
+ end
+ remove(pathstack)
+end
+function resolvers.stackpath()
+ local pathstack=instance.pathstack
+ local currentpath=pathstack[#pathstack]
+ return currentpath~="" and currentpath or nil
+end
local done={}
function resolvers.resetextrapath()
local ep=instance.extra_paths
if not ep then
- ep,done={},{}
- instance.extra_paths=ep
+ done={}
+ instance.extra_paths={}
elseif #ep>0 then
- instance.lists,done={},{}
+ done={}
+ reset_caches()
end
end
function resolvers.registerextrapath(paths,subpaths)
- paths=settings_to_array(paths)
- subpaths=settings_to_array(subpaths)
+ if not subpaths or subpaths=="" then
+ if not paths or path=="" then
+ return
+ elseif done[paths] then
+ return
+ end
+ end
+ local paths=settings_to_array(paths)
+ local subpaths=settings_to_array(subpaths)
local ep=instance.extra_paths or {}
local oldn=#ep
local newn=oldn
@@ -14237,7 +15071,7 @@ function resolvers.registerextrapath(paths,subpaths)
local ps=p.."/"..s
if not done[ps] then
newn=newn+1
- ep[newn]=resolvers.cleanpath(ps)
+ ep[newn]=cleanpath(ps)
done[ps]=true
end
end
@@ -14247,7 +15081,7 @@ function resolvers.registerextrapath(paths,subpaths)
local p=paths[i]
if not done[p] then
newn=newn+1
- ep[newn]=resolvers.cleanpath(p)
+ ep[newn]=cleanpath(p)
done[p]=true
end
end
@@ -14259,7 +15093,7 @@ function resolvers.registerextrapath(paths,subpaths)
local ps=ep[i].."/"..s
if not done[ps] then
newn=newn+1
- ep[newn]=resolvers.cleanpath(ps)
+ ep[newn]=cleanpath(ps)
done[ps]=true
end
end
@@ -14268,52 +15102,70 @@ function resolvers.registerextrapath(paths,subpaths)
if newn>0 then
instance.extra_paths=ep
end
- if newn>oldn then
- instance.lists={}
+ if newn~=oldn then
+ reset_caches()
end
end
-local function made_list(instance,list)
- local ep=instance.extra_paths
- if not ep or #ep==0 then
- return list
+function resolvers.pushextrapath(path)
+ local paths=settings_to_array(path)
+ if instance.extra_stack then
+ insert(instance.extra_stack,1,paths)
else
- local done,new,newn={},{},0
- for k=1,#list do
- local v=list[k]
- if not done[v] then
- if find(v,"^[%.%/]$") then
- done[v]=true
- newn=newn+1
- new[newn]=v
- else
- break
- end
- end
- end
- for k=1,#ep do
- local v=ep[k]
+ instance.extra_stack={ paths }
+ end
+ reset_caches()
+end
+function resolvers.popextrapath()
+ if instance.extra_stack then
+ reset_caches()
+ return remove(instance.extra_stack,1)
+ end
+end
+local function made_list(instance,list,extra_too)
+ local done={}
+ local new={}
+ local newn=0
+ local function add(p)
+ for k=1,#p do
+ local v=p[k]
if not done[v] then
done[v]=true
newn=newn+1
new[newn]=v
end
end
- for k=1,#list do
- local v=list[k]
- if not done[v] then
- done[v]=true
- newn=newn+1
- new[newn]=v
+ end
+ for k=1,#list do
+ local v=list[k]
+ if done[v] then
+ elseif find(v,"^[%.%/]$") then
+ done[v]=true
+ newn=newn+1
+ new[newn]=v
+ else
+ break
+ end
+ end
+ if extra_too then
+ local es=instance.extra_stack
+ if es and #es>0 then
+ for k=1,#es do
+ add(es[k])
end
end
- return new
+ local ep=instance.extra_paths
+ if ep and #ep>0 then
+ add(ep)
+ end
end
+ add(list)
+ return new
end
function resolvers.cleanpathlist(str)
local t=resolvers.expandedpathlist(str)
if t then
for i=1,#t do
- t[i]=collapsepath(resolvers.cleanpath(t[i]))
+ t[i]=collapsepath(cleanpath(t[i]))
end
end
return t
@@ -14321,22 +15173,22 @@ end
function resolvers.expandpath(str)
return joinpath(resolvers.expandedpathlist(str))
end
-function resolvers.expandedpathlist(str)
+function resolvers.expandedpathlist(str,extra_too)
if not str then
return {}
- elseif instance.savelists then
+ elseif instance.savelists then
str=lpegmatch(dollarstripper,str)
local lists=instance.lists
local lst=lists[str]
if not lst then
- local l=made_list(instance,resolvers.splitpath(resolvers.expansion(str)))
+ local l=made_list(instance,resolvers.splitpath(resolvers.expansion(str)),extra_too)
lst=expandedpathfromlist(l)
lists[str]=lst
end
return lst
else
local lst=resolvers.splitpath(resolvers.expansion(str))
- return made_list(instance,expandedpathfromlist(lst))
+ return made_list(instance,expandedpathfromlist(lst),extra_too)
end
end
function resolvers.expandedpathlistfromvariable(str)
@@ -14347,6 +15199,13 @@ end
function resolvers.expandpathfromvariable(str)
return joinpath(resolvers.expandedpathlistfromvariable(str))
end
+function resolvers.cleanedpathlist(v)
+ local t=resolvers.expandedpathlist(v)
+ for i=1,#t do
+ t[i]=resolvers.resolve(resolvers.cleanpath(t[i]))
+ end
+ return t
+end
function resolvers.expandbraces(str)
local ori=str
local pth=expandedpathfromlist(resolvers.splitpath(ori))
@@ -14363,7 +15222,7 @@ function resolvers.registerfilehash(name,content,someerror)
end
end
local function isreadable(name)
- local readable=lfs.isfile(name)
+ local readable=isfile(name)
if trace_detail then
if readable then
report_resolving("file %a is readable",name)
@@ -14373,70 +15232,57 @@ local function isreadable(name)
end
return readable
end
-local function collect_files(names)
- local filelist,noffiles={},0
+local function collect_files(names)
+ local filelist={}
+ local noffiles=0
+ local function check(hash,root,pathname,path,name)
+ if not pathname or find(path,pathname) then
+ local variant=hash.type
+ local search=filejoin(root,path,name)
+ local result=methodhandler('concatinators',variant,root,path,name)
+ if trace_detail then
+ report_resolving("match: variant %a, search %a, result %a",variant,search,result)
+ end
+ noffiles=noffiles+1
+ filelist[noffiles]={ variant,search,result }
+ end
+ end
for k=1,#names do
- local fname=names[k]
+ local filename=names[k]
if trace_detail then
- report_resolving("checking name %a",fname)
+ report_resolving("checking name %a",filename)
end
- local bname=filebasename(fname)
- local dname=filedirname(fname)
- if dname=="" or find(dname,"^%.") then
- dname=false
+ local basename=filebasename(filename)
+ local pathname=filedirname(filename)
+ if pathname=="" or find(pathname,"^%.") then
+ pathname=false
else
- dname=gsub(dname,"%*",".*")
- dname="/"..dname.."$"
+ pathname=gsub(pathname,"%*",".*")
+ pathname="/"..pathname.."$"
end
local hashes=instance.hashes
for h=1,#hashes do
local hash=hashes[h]
- local blobpath=hash.name
- local files=blobpath and instance.files[blobpath]
- if files then
+ local hashname=hash.name
+ local content=hashname and instance.files[hashname]
+ if content then
if trace_detail then
- report_resolving("deep checking %a, base %a, pattern %a",blobpath,bname,dname)
- 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
+ report_resolving("deep checking %a, base %a, pattern %a",hashname,basename,pathname)
end
- if blobfile then
- local blobroot=files.__path__ or blobpath
- if type(blobfile)=='string' then
- if not dname or find(blobfile,dname) then
- local variant=hash.type
- local search=filejoin(blobroot,blobfile,bname)
- local result=methodhandler('concatinators',hash.type,blobroot,blobfile,bname)
- if trace_detail then
- report_resolving("match: variant %a, search %a, result %a",variant,search,result)
- end
- noffiles=noffiles+1
- filelist[noffiles]={ variant,search,result }
- end
+ local path,name=lookup(content,basename)
+ if path then
+ local metadata=content.metadata
+ local realroot=metadata and metadata.path or hashname
+ if type(path)=="string" then
+ check(hash,realroot,pathname,path,name)
else
- for kk=1,#blobfile do
- local vv=blobfile[kk]
- if not dname or find(vv,dname) then
- local variant=hash.type
- local search=filejoin(blobroot,vv,bname)
- local result=methodhandler('concatinators',hash.type,blobroot,vv,bname)
- if trace_detail then
- report_resolving("match: variant %a, search %a, result %a",variant,search,result)
- end
- noffiles=noffiles+1
- filelist[noffiles]={ variant,search,result }
- end
+ for i=1,#path do
+ check(hash,realroot,pathname,path[i],name)
end
end
end
elseif trace_locating then
- report_resolving("no match in %a (%s)",blobpath,bname)
+ report_resolving("no match in %a (%s)",hashname,basename)
end
end
end
@@ -14461,7 +15307,7 @@ end
local function can_be_dir(name)
local fakepaths=instance.fakepaths
if not fakepaths[name] then
- if lfs.isdir(name) then
+ if isdir(name) then
fakepaths[name]=1
else
fakepaths[name]=2
@@ -14477,10 +15323,11 @@ local function find_analyze(filename,askedformat,allresults)
if askedformat=="" then
if ext=="" or not suffixmap[ext] then
local defaultsuffixes=resolvers.defaultsuffixes
+ local formatofsuffix=resolvers.formatofsuffix
for i=1,#defaultsuffixes do
local forcedname=filename..'.'..defaultsuffixes[i]
wantedfiles[#wantedfiles+1]=forcedname
- filetype=resolvers.formatofsuffix(forcedname)
+ filetype=formatofsuffix(forcedname)
if trace_locating then
report_resolving("forcing filetype %a",filetype)
end
@@ -14520,14 +15367,14 @@ local function find_wildcard(filename,allresults)
if trace_locating then
report_resolving("checking wildcard %a",filename)
end
- local method,result=resolvers.findwildcardfiles(filename)
+ local result=resolvers.findwildcardfiles(filename)
if result then
return "wildcard",result
end
end
end
local function find_qualified(filename,allresults,askedformat,alsostripped)
- if not file.is_qualified_path(filename) then
+ if not is_qualified_path(filename) then
return
end
if trace_locating then
@@ -14601,33 +15448,66 @@ local function check_subpath(fname)
return fname
end
end
-local function find_intree(filename,filetype,wantedfiles,allresults)
+local function makepathlist(list,filetype)
local typespec=resolvers.variableofformat(filetype)
- local pathlist=resolvers.expandedpathlist(typespec)
- local method="intree"
+ local pathlist=resolvers.expandedpathlist(typespec,filetype and usertypes[filetype])
+ local entry={}
if pathlist and #pathlist>0 then
- local filelist=collect_files(wantedfiles)
+ for k=1,#pathlist do
+ local path=pathlist[k]
+ local prescanned=find(path,'^!!')
+ local resursive=find(path,'//$')
+ local pathname=lpegmatch(inhibitstripper,path)
+ local expression=makepathexpression(pathname)
+ local barename=gsub(pathname,"/+$","")
+ barename=resolveprefix(barename)
+ local scheme=url.hasscheme(barename)
+ local schemename=gsub(barename,"%.%*$",'')
+ entry[k]={
+ path=path,
+ pathname=pathname,
+ prescanned=prescanned,
+ recursive=recursive,
+ expression=expression,
+ barename=barename,
+ scheme=scheme,
+ schemename=schemename,
+ }
+ end
+ entry.typespec=typespec
+ list[filetype]=entry
+ else
+ list[filetype]=false
+ end
+ return entry
+end
+local function find_intree(filename,filetype,wantedfiles,allresults)
+ local pathlists=instance.pathlists
+ if not pathlists then
+ pathlists=setmetatableindex(allocate(),makepathlist)
+ instance.pathlists=pathlists
+ end
+ local pathlist=pathlists[filetype]
+ if pathlist then
+ local method="intree"
+ local filelist=collect_files(wantedfiles)
local dirlist={}
+ local result={}
if filelist then
for i=1,#filelist do
dirlist[i]=filedirname(filelist[i][3]).."/"
end
end
if trace_detail then
- report_resolving("checking filename %a",filename)
+ report_resolving("checking filename %a in tree",filename)
end
- local resolve=resolvers.resolve
- local result={}
for k=1,#pathlist do
- local path=pathlist[k]
- local pathname=lpegmatch(inhibitstripper,path)
- local doscan=path==pathname
- if not find (pathname,'//$') then
- doscan=false
- end
+ local entry=pathlist[k]
+ local path=entry.path
+ local pathname=entry.pathname
local done=false
if filelist then
- local expression=makepathexpression(pathname)
+ local expression=entry.expression
if trace_detail then
report_resolving("using pattern %a for path %a",expression,pathname)
end
@@ -14635,8 +15515,8 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
local fl=filelist[k]
local f=fl[2]
local d=dirlist[k]
- if find(d,expression) or find(resolve(d),expression) then
- result[#result+1]=resolve(fl[3])
+ if find(d,expression) or find(resolveprefix(d),expression) then
+ result[#result+1]=resolveprefix(fl[3])
done=true
if allresults then
if trace_detail then
@@ -14657,56 +15537,62 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
method="database"
else
method="filesystem"
- pathname=gsub(pathname,"/+$","")
- pathname=resolve(pathname)
- local scheme=url.hasscheme(pathname)
+ local scheme=entry.scheme
if not scheme or scheme=="file" then
- local pname=gsub(pathname,"%.%*$",'')
+ local pname=entry.schemename
if not find(pname,"*",1,true) then
if can_be_dir(pname) then
- for k=1,#wantedfiles do
- local w=wantedfiles[k]
- local fname=check_subpath(filejoin(pname,w))
- if fname then
- result[#result+1]=fname
- done=true
- if not allresults then
- break
- end
+ if not done and not entry.prescanned then
+ if trace_detail then
+ report_resolving("quick root scan for %a",pname)
end
- end
- if not done and doscan then
- local files=resolvers.simplescanfiles(pname,false,true)
for k=1,#wantedfiles do
local w=wantedfiles[k]
- local subpath=files[w]
- if not subpath or subpath=="" then
- elseif type(subpath)=="string" then
- local fname=check_subpath(filejoin(pname,subpath,w))
- if fname then
- result[#result+1]=fname
- done=true
- if not allresults then
- break
- end
+ local fname=check_subpath(filejoin(pname,w))
+ if fname then
+ result[#result+1]=fname
+ done=true
+ if not allresults then
+ break
end
- else
- for i=1,#subpath do
- local sp=subpath[i]
- if sp=="" then
- else
- local fname=check_subpath(filejoin(pname,sp,w))
- if fname then
- result[#result+1]=fname
- done=true
- if not allresults then
- break
+ end
+ end
+ if not done and entry.recursive then
+ if trace_detail then
+ report_resolving("scanning filesystem for %a",pname)
+ end
+ local files=resolvers.simplescanfiles(pname,false,true)
+ for k=1,#wantedfiles do
+ local w=wantedfiles[k]
+ local subpath=files[w]
+ if not subpath or subpath=="" then
+ elseif type(subpath)=="string" then
+ local fname=check_subpath(filejoin(pname,subpath,w))
+ if fname then
+ result[#result+1]=fname
+ done=true
+ if not allresults then
+ break
+ end
+ end
+ else
+ for i=1,#subpath do
+ local sp=subpath[i]
+ if sp=="" then
+ else
+ local fname=check_subpath(filejoin(pname,sp,w))
+ if fname then
+ result[#result+1]=fname
+ done=true
+ if not allresults then
+ break
+ end
end
end
end
- end
- if done and not allresults then
- break
+ if done and not allresults then
+ break
+ end
end
end
end
@@ -14714,6 +15600,18 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
else
end
+ else
+ for k=1,#wantedfiles do
+ local pname=entry.barename
+ local fname=methodhandler('finders',pname.."/"..wantedfiles[k])
+ if fname then
+ result[#result+1]=fname
+ done=true
+ if not allresults then
+ break
+ end
+ end
+ end
end
end
if done and not allresults then
@@ -14748,10 +15646,13 @@ local function find_otherwise(filename,filetype,wantedfiles,allresults)
local filelist=collect_files(wantedfiles)
local fl=filelist and filelist[1]
if fl then
- return "otherwise",{ resolvers.resolve(fl[3]) }
+ return "otherwise",{ resolveprefix(fl[3]) }
end
end
collect_instance_files=function(filename,askedformat,allresults)
+ if not filename or filename=="" then
+ return {}
+ end
askedformat=askedformat or ""
filename=collapsepath(filename,".")
filename=gsub(filename,"^%./",getcurrentdir().."/")
@@ -14786,7 +15687,11 @@ collect_instance_files=function(filename,askedformat,allresults)
else
local method,result,stamp,filetype,wantedfiles
if instance.remember then
- stamp=formatters["%s--%s"](filename,askedformat)
+ if askedformat=="" then
+ stamp=formatters["%s::%s"](suffixonly(filename),filename)
+ else
+ stamp=formatters["%s::%s"](askedformat,filename)
+ end
result=stamp and instance.found[stamp]
if result then
if trace_locating then
@@ -14821,7 +15726,7 @@ collect_instance_files=function(filename,askedformat,allresults)
end
if stamp then
if trace_locating then
- report_resolving("remembering file %a",filename)
+ report_resolving("remembering file %a using hash %a",filename,stamp)
end
instance.found[stamp]=result
end
@@ -14829,6 +15734,9 @@ collect_instance_files=function(filename,askedformat,allresults)
end
end
local function findfiles(filename,filetype,allresults)
+ if not filename or filename=="" then
+ return {}
+ end
local result,status=collect_instance_files(filename,filetype or "",allresults)
if not result or #result==0 then
local lowered=lower(filename)
@@ -14848,39 +15756,30 @@ 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 base=filebasename(filename)
+ local result={}
local hashes=instance.hashes
- local noffound=0
+ local function okay(hash,path,name)
+ local found=methodhandler('concatinators',hash.type,hash.name,path,name)
+ if found and found~="" then
+ result[#result+1]=resolveprefix(found)
+ return not allresults
+ end
+ end
for k=1,#hashes do
local hash=hashes[k]
- local files=instance.files[hash.name] or {}
- local blist=files[bname]
- if not blist then
- local rname="remap:"..bname
- blist=files[rname]
- if blist then
- bname=files[rname]
- blist=files[bname]
- end
- end
- if blist then
- if type(blist)=='string' then
- local found=methodhandler('concatinators',hash.type,hash.name,blist,bname) or ""
- if found~="" then
- noffound=noffound+1
- result[noffound]=resolvers.resolve(found)
- if not allresults then
- break
- end
+ local content=instance.files[hash.name]
+ if content then
+ local path,name=lookup(content,base)
+ if not path then
+ elseif type(path)=="string" then
+ if okay(hash,path,name) then
+ return result
end
else
- for kk=1,#blist do
- local vv=blist[kk]
- local found=methodhandler('concatinators',hash.type,hash.name,vv,bname) or ""
- if found~="" then
- noffound=noffound+1
- result[noffound]=resolvers.resolve(found)
- if not allresults then break end
+ for i=1,#path do
+ if okay(hash,path[i],name) then
+ return result
end
end
end
@@ -14894,64 +15793,80 @@ end
function resolvers.findgivenfile(filename)
return findgivenfiles(filename,false)[1] or ""
end
-local function doit(path,blist,bname,tag,variant,result,allresults)
- local done=false
- if blist and variant then
- local resolve=resolvers.resolve
- if type(blist)=='string' then
- if find(lower(blist),path) then
- local full=methodhandler('concatinators',variant,tag,blist,bname) or ""
- result[#result+1]=resolve(full)
- done=true
- end
- else
- for kk=1,#blist do
- local vv=blist[kk]
- if find(lower(vv),path) then
- local full=methodhandler('concatinators',variant,tag,vv,bname) or ""
- result[#result+1]=resolve(full)
- done=true
- if not allresults then break end
- end
- end
- end
- end
- return done
-end
local makewildcard=Cs(
(P("^")^0*P("/")*P(-1)+P(-1))/".*"+(P("^")^0*P("/")/"")^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)
- result=result or {}
+local function findwildcardfiles(filename,allresults,result)
+ local result=result or {}
local base=filebasename(filename)
local dirn=filedirname(filename)
local path=lower(lpegmatch(makewildcard,dirn) or dirn)
local name=lower(lpegmatch(makewildcard,base) or base)
- local files,done=instance.files,false
+ local files=instance.files
if find(name,"*",1,true) then
local hashes=instance.hashes
+ local function okay(found,path,base,hashname,hashtype)
+ if find(found,path) then
+ local full=methodhandler('concatinators',hashtype,hashname,found,base)
+ if full and full~="" then
+ result[#result+1]=resolveprefix(full)
+ return not allresults
+ end
+ end
+ end
for k=1,#hashes do
local hash=hashes[k]
- local hashname,hashtype=hash.name,hash.type
- for kk,hh in next,files[hashname] do
- if not find(kk,"^remap:") then
- if find(lower(kk),name) then
- if doit(path,hh,kk,hashname,hashtype,result,allresults) then done=true end
- if done and not allresults then break end
+ local hashname=hash.name
+ local hashtype=hash.type
+ if hashname and hashtype then
+ for found,base in filtered(files[hashname],name) do
+ if type(found)=='string' then
+ if okay(found,path,base,hashname,hashtype) then
+ break
+ end
+ else
+ for i=1,#found do
+ if okay(found[i],path,base,hashname,hashtype) then
+ break
+ end
+ end
end
end
end
end
else
+ local function okayokay(found,path,base,hashname,hashtype)
+ if find(found,path) then
+ local full=methodhandler('concatinators',hashtype,hashname,found,base)
+ if full and full~="" then
+ result[#result+1]=resolveprefix(full)
+ return not allresults
+ end
+ end
+ end
local hashes=instance.hashes
for k=1,#hashes do
local hash=hashes[k]
- local hashname,hashtype=hash.name,hash.type
- if doit(path,files[hashname][base],base,hashname,hashtype,result,allresults) then done=true end
- if done and not allresults then break end
+ local hashname=hash.name
+ local hashtype=hash.type
+ if hashname and hashtype then
+ local found,base=lookup(content,base)
+ if not found then
+ elseif type(found)=='string' then
+ if okay(found,path,base,hashname,hashtype) then
+ break
+ end
+ else
+ for i=1,#found do
+ if okay(found[i],path,base,hashname,hashtype) then
+ break
+ end
+ end
+ end
+ end
end
end
return result
@@ -15024,7 +15939,7 @@ end
function resolvers.dowithpath(name,func)
local pathlist=resolvers.expandedpathlist(name)
for i=1,#pathlist do
- func("^"..resolvers.cleanpath(pathlist[i]))
+ func("^"..cleanpath(pathlist[i]))
end
end
function resolvers.dowithvariable(name,func)
@@ -15032,23 +15947,23 @@ function resolvers.dowithvariable(name,func)
end
function resolvers.locateformat(name)
local engine=environment.ownmain or "luatex"
- local barename=file.removesuffix(name)
- local fullname=file.addsuffix(barename,"fmt")
+ local barename=removesuffix(name)
+ local fullname=addsuffix(barename,"fmt")
local fmtname=caches.getfirstreadablefile(fullname,"formats",engine) or ""
if fmtname=="" then
fmtname=resolvers.findfile(fullname)
- fmtname=resolvers.cleanpath(fmtname)
+ fmtname=cleanpath(fmtname)
end
if fmtname~="" then
- local barename=file.removesuffix(fmtname)
- local luaname=file.addsuffix(barename,luasuffixes.lua)
- local lucname=file.addsuffix(barename,luasuffixes.luc)
- local luiname=file.addsuffix(barename,luasuffixes.lui)
- if lfs.isfile(luiname) then
+ local barename=removesuffix(fmtname)
+ local luaname=addsuffix(barename,luasuffixes.lua)
+ local lucname=addsuffix(barename,luasuffixes.luc)
+ local luiname=addsuffix(barename,luasuffixes.lui)
+ if isfile(luiname) then
return barename,luiname
- elseif lfs.isfile(lucname) then
+ elseif isfile(lucname) then
return barename,lucname
- elseif lfs.isfile(luaname) then
+ elseif isfile(luaname) then
return barename,luaname
end
end
@@ -15070,29 +15985,24 @@ function resolvers.dowithfilesintree(pattern,handle,before,after)
local hash=hashes[i]
local blobtype=hash.type
local blobpath=hash.name
- if blobpath then
+ if blobtype and blobpath then
+ local total=0
+ local checked=0
+ local done=0
if before then
before(blobtype,blobpath,pattern)
end
- local files=instance.files[blobpath]
- local total,checked,done=0,0,0
- if files then
- for k,v in table.sortedhash(files) do
- total=total+1
- if find(k,"^remap:") then
- elseif find(k,pattern) then
- if type(v)=="string" then
- checked=checked+1
- if handle(blobtype,blobpath,v,k) then
- done=done+1
- end
- else
- checked=checked+#v
- for i=1,#v do
- if handle(blobtype,blobpath,v[i],k) then
- done=done+1
- end
- end
+ for path,name in filtered(instance.files[blobpath],pattern) do
+ if type(path)=="string" then
+ checked=checked+1
+ if handle(blobtype,blobpath,path,name) then
+ done=done+1
+ end
+ else
+ checked=checked+#path
+ for i=1,#path do
+ if handle(blobtype,blobpath,path[i],name) then
+ done=done+1
end
end
end
@@ -15103,8 +16013,8 @@ function resolvers.dowithfilesintree(pattern,handle,before,after)
end
end
end
-resolvers.obsolete=resolvers.obsolete or {}
-local obsolete=resolvers.obsolete
+local obsolete=resolvers.obsolete or {}
+resolvers.obsolete=obsolete
resolvers.find_file=resolvers.findfile obsolete.find_file=resolvers.findfile
resolvers.find_files=resolvers.findfiles obsolete.find_files=resolvers.findfiles
@@ -15115,7 +16025,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-pre"] = package.loaded["data-pre"] or true
--- original size: 6643, stripped down to: 4401
+-- original size: 3950, stripped down to: 2935
if not modules then modules={} end modules ['data-pre']={
version=1.001,
@@ -15125,44 +16035,51 @@ if not modules then modules={} end modules ['data-pre']={
license="see context related readme files"
}
local resolvers=resolvers
-local prefixes=utilities.storage.allocate()
-resolvers.prefixes=prefixes
-local cleanpath,findgivenfile,expansion=resolvers.cleanpath,resolvers.findgivenfile,resolvers.expansion
+local prefixes=resolvers.prefixes
+local cleanpath=resolvers.cleanpath
+local findgivenfile=resolvers.findgivenfile
+local expansion=resolvers.expansion
local getenv=resolvers.getenv
-local P,S,R,C,Cs,Cc,lpegmatch=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.match
-local joinpath,basename,dirname=file.join,file.basename,file.dirname
-local getmetatable,rawset,type=getmetatable,rawset,type
+local basename=file.basename
+local dirname=file.dirname
+local joinpath=file.join
+local isfile=lfs.isfile
prefixes.environment=function(str)
return cleanpath(expansion(str))
end
-prefixes.relative=function(str,n)
- if io.exists(str) then
- elseif io.exists("./"..str) then
- str="./"..str
- else
- local p="../"
- for i=1,n or 2 do
- if io.exists(p..str) then
- str=p..str
- break
- else
- p=p.."../"
+local function relative(str,n)
+ if not isfile(str) then
+ local pstr="./"..str
+ if isfile(pstr) then
+ str=pstr
+ else
+ local p="../"
+ for i=1,n or 2 do
+ local pstr=p..str
+ if isfile(pstr) then
+ str=pstr
+ break
+ else
+ p=p.."../"
+ end
end
end
end
return cleanpath(str)
end
+local function locate(str)
+ local fullname=findgivenfile(str) or ""
+ return cleanpath(fullname~="" and fullname or str)
+end
+prefixes.relative=relative
+prefixes.locate=locate
prefixes.auto=function(str)
- local fullname=prefixes.relative(str)
- if not lfs.isfile(fullname) then
- fullname=prefixes.locate(str)
+ local fullname=relative(str)
+ if not isfile(fullname) then
+ fullname=locate(str)
end
return fullname
end
-prefixes.locate=function(str)
- local fullname=findgivenfile(str) or ""
- return cleanpath((fullname~="" and fullname) or str)
-end
prefixes.filename=function(str)
local fullname=findgivenfile(str) or ""
return cleanpath(basename((fullname~="" and fullname) or str))
@@ -15183,6 +16100,13 @@ end
prefixes.home=function(str)
return cleanpath(joinpath(getenv('HOME'),str))
end
+prefixes.env=prefixes.environment
+prefixes.rel=prefixes.relative
+prefixes.loc=prefixes.locate
+prefixes.kpse=prefixes.locate
+prefixes.full=prefixes.locate
+prefixes.file=prefixes.filename
+prefixes.path=prefixes.pathname
local function toppath()
local inputstack=resolvers.inputstack
if not inputstack then
@@ -15195,98 +16119,22 @@ local function toppath()
return pathname
end
end
-resolvers.toppath=toppath
-prefixes.toppath=function(str)
- return cleanpath(joinpath(toppath(),str))
-end
-prefixes.env=prefixes.environment
-prefixes.rel=prefixes.relative
-prefixes.loc=prefixes.locate
-prefixes.kpse=prefixes.locate
-prefixes.full=prefixes.locate
-prefixes.file=prefixes.filename
-prefixes.path=prefixes.pathname
-function resolvers.allprefixes(separator)
- local all=table.sortedkeys(prefixes)
- if separator then
- for i=1,#all do
- all[i]=all[i]..":"
- end
- end
- return all
-end
-local function _resolve_(method,target)
- local action=prefixes[method]
- if action then
- return action(target)
- else
- return method..":"..target
- end
-end
-local resolved,abstract={},{}
-function resolvers.resetresolve(str)
- resolved,abstract={},{}
-end
-local pattern=Cs((C(R("az")^2)*P(":")*C((1-S(" \"\';,"))^1)/_resolve_+P(1))^0)
-local prefix=C(R("az")^2)*P(":")
-local target=C((1-S(" \"\';,"))^1)
-local notarget=(#S(";,")+P(-1))*Cc("")
-local pattern=Cs(((prefix*(target+notarget))/_resolve_+P(1))^0)
-local function resolve(str)
- if type(str)=="table" then
- local t={}
- for i=1,#str do
- t[i]=resolve(str[i])
- end
- return t
+local function jobpath()
+ local path=resolvers.stackpath()
+ if not path or path=="" then
+ return "."
else
- local res=resolved[str]
- if not res then
- res=lpegmatch(pattern,str)
- resolved[str]=res
- abstract[res]=str
- end
- return res
- end
-end
-local function unresolve(str)
- return abstract[str] or str
-end
-resolvers.resolve=resolve
-resolvers.unresolve=unresolve
-if type(os.uname)=="function" then
- for k,v in next,os.uname() do
- if not prefixes[k] then
- prefixes[k]=function() return v end
- end
- end
-end
-if os.type=="unix" then
- local pattern
- local function makepattern(t,k,v)
- if t then
- rawset(t,k,v)
- end
- local colon=P(":")
- for k,v in table.sortedpairs(prefixes) do
- if p then
- p=P(k)+p
- else
- p=P(k)
- end
- end
- pattern=Cs((p*colon+colon/";"+P(1))^0)
- end
- makepattern()
- getmetatable(prefixes).__newindex=makepattern
- function resolvers.repath(str)
- return lpegmatch(pattern,str)
- end
-else
- function resolvers.repath(str)
- return str
+ return path
end
end
+resolvers.toppath=toppath
+resolvers.jobpath=jobpath
+prefixes.toppath=function(str) return cleanpath(joinpath(toppath(),str)) end
+prefixes.jobpath=function(str) return cleanpath(joinpath(jobpath(),str)) end
+resolvers.setdynamic("toppath")
+resolvers.setdynamic("jobpath")
+prefixes.jobfile=prefixes.jobpath
+resolvers.setdynamic("jobfile")
end -- of closure
@@ -15348,7 +16196,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-fil"] = package.loaded["data-fil"] or true
--- original size: 3801, stripped down to: 3231
+-- original size: 3863, stripped down to: 3310
if not modules then modules={} end modules ['data-fil']={
version=1.001,
@@ -15360,30 +16208,31 @@ if not modules then modules={} end modules ['data-fil']={
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 resolveprefix=resolvers.resolve
local finders,openers,loaders,savers=resolvers.finders,resolvers.openers,resolvers.loaders,resolvers.savers
local locators,hashers,generators,concatinators=resolvers.locators,resolvers.hashers,resolvers.generators,resolvers.concatinators
local checkgarbage=utilities.garbagecollector and utilities.garbagecollector.check
function locators.file(specification)
- local name=specification.filename
- local realname=resolvers.resolve(name)
+ local filename=specification.filename
+ local realname=resolveprefix(filename)
if realname and realname~='' and lfs.isdir(realname) then
if trace_locating then
- report_files("file locator %a found as %a",name,realname)
+ report_files("file locator %a found as %a",filename,realname)
end
- resolvers.appendhash('file',name,true)
+ resolvers.appendhash('file',filename,true)
elseif trace_locating then
- report_files("file locator %a not found",name)
+ report_files("file locator %a not found",filename)
end
end
function hashers.file(specification)
- local name=specification.filename
- local content=caches.loadcontent(name,'files')
- resolvers.registerfilehash(name,content,content==nil)
+ local pathname=specification.filename
+ local content=caches.loadcontent(pathname,'files')
+ resolvers.registerfilehash(pathname,content,content==nil)
end
function generators.file(specification)
- local path=specification.filename
- local content=resolvers.scanfiles(path,false,true)
- resolvers.registerfilehash(path,content,true)
+ local pathname=specification.filename
+ local content=resolvers.scanfiles(pathname,false,true)
+ resolvers.registerfilehash(pathname,content,true)
end
concatinators.file=file.join
function finders.file(specification,filetype)
@@ -15665,7 +16514,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-zip"] = package.loaded["data-zip"] or true
--- original size: 8489, stripped down to: 6757
+-- original size: 8772, stripped down to: 6841
if not modules then modules={} end modules ['data-zip']={
version=1.001,
@@ -15684,16 +16533,6 @@ zip.archives=zip.archives or {}
local archives=zip.archives
zip.registeredfiles=zip.registeredfiles or {}
local registeredfiles=zip.registeredfiles
-local limited=false
-directives.register("system.inputmode",function(v)
- if not limited then
- local i_limiter=io.i_limiter(v)
- if i_limiter then
- zip.open=i_limiter.protect(zip.open)
- limited=true
- end
- end
-end)
local function validzip(str)
if not find(str,"^zip://") then
return "zip:///"..str
@@ -15708,7 +16547,7 @@ function zip.openarchive(name)
local arch=archives[name]
if not arch then
local full=resolvers.findfile(name) or ""
- arch=(full~="" and zip.open(full)) or false
+ arch=full~="" and zip.open(full) or false
archives[name]=arch
end
return arch
@@ -15867,31 +16706,42 @@ function resolvers.usezipfile(archive)
end
end
function resolvers.registerzipfile(z,tree)
- local files,filter={},""
- if tree=="" then
- filter="^(.+)/(.-)$"
- else
- filter=format("^%s/(.+)/(.-)$",tree)
- end
+ local names={}
+ local files={}
+ local remap={}
+ local n=0
+ local filter=tree=="" and "^(.+)/(.-)$" or format("^%s/(.+)/(.-)$",tree)
+ local register=resolvers.registerfile
if trace_locating then
report_zip("registering: using filter %a",filter)
end
- local register,n=resolvers.registerfile,0
for i in z:files() do
- local path,name=match(i.filename,filter)
- if path then
- if name and name~='' then
- register(files,name,path)
- n=n+1
- else
+ local filename=i.filename
+ local path,name=match(filename,filter)
+ if not path then
+ n=n+1
+ register(names,filename,"")
+ local usedname=lower(filename)
+ files[usedname]=""
+ if usedname~=filename then
+ remap[usedname]=filename
end
- else
- register(files,i.filename,'')
+ elseif name and name~="" then
n=n+1
+ register(names,name,path)
+ local usedname=lower(name)
+ files[usedname]=path
+ if usedname~=name then
+ remap[usedname]=name
+ end
+ else
end
end
report_zip("registering: %s files registered",n)
- return files
+ return {
+ files=files,
+ remap=remap,
+ }
end
@@ -15901,7 +16751,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tre"] = package.loaded["data-tre"] or true
--- original size: 2508, stripped down to: 2074
+-- original size: 8479, stripped down to: 5580
if not modules then modules={} end modules ['data-tre']={
version=1.001,
@@ -15910,42 +16760,64 @@ if not modules then modules={} end modules ['data-tre']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local find,gsub,format=string.find,string.gsub,string.format
+local find,gsub,lower=string.find,string.gsub,string.lower
+local basename,dirname,joinname=file.basename,file.dirname,file .join
+local globdir,isdir,isfile=dir.glob,lfs.isdir,lfs.isfile
+local P,lpegmatch=lpeg.P,lpeg.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_trees=logs.reporter("resolvers","trees")
local resolvers=resolvers
-local done,found,notfound={},{},resolvers.finders.notfound
-function resolvers.finders.tree(specification)
+local resolveprefix=resolvers.resolve
+local notfound=resolvers.finders.notfound
+local lookup=resolvers.get_from_content
+local collectors={}
+local found={}
+function resolvers.finders.tree(specification)
local spec=specification.filename
- local fnd=found[spec]
- if fnd==nil then
+ local okay=found[spec]
+ if okay==nil then
if spec~="" then
- local path,name=file.dirname(spec),file.basename(spec)
- if path=="" then path="." end
- local hash=done[path]
- if not hash then
- local pattern=path.."/*"
- hash=dir.glob(pattern)
- done[path]=hash
+ local path=dirname(spec)
+ local name=basename(spec)
+ if path=="" then
+ path="."
+ end
+ local names=collectors[path]
+ if not names then
+ local pattern=find(path,"/%*+$") and path or (path.."/*")
+ names=globdir(pattern)
+ collectors[path]=names
end
local pattern="/"..gsub(name,"([%.%-%+])","%%%1").."$"
- for k=1,#hash do
- local v=hash[k]
- if find(v,pattern) then
- found[spec]=v
- return v
+ for i=1,#names do
+ local fullname=names[i]
+ if find(fullname,pattern) then
+ found[spec]=fullname
+ return fullname
+ end
+ end
+ local pattern=lower(pattern)
+ for i=1,#names do
+ local fullname=lower(names[i])
+ if find(fullname,pattern) then
+ if isfile(fullname) then
+ found[spec]=fullname
+ return fullname
+ else
+ break
+ end
end
end
end
- fnd=notfound()
- found[spec]=fnd
+ okay=notfound()
+ found[spec]=okay
end
- return fnd
+ return okay
end
function resolvers.locators.tree(specification)
local name=specification.filename
- local realname=resolvers.resolve(name)
- if realname and realname~='' and lfs.isdir(realname) then
+ local realname=resolveprefix(name)
+ if realname and realname~='' and isdir(realname) then
if trace_locating then
report_trees("locator %a found",realname)
end
@@ -15956,16 +16828,110 @@ function resolvers.locators.tree(specification)
end
function resolvers.hashers.tree(specification)
local name=specification.filename
- if trace_locating then
- report_trees("analysing %a",name)
- end
+ report_trees("analyzing %a",name)
resolvers.methodhandler("hashers",name)
resolvers.generators.file(specification)
end
-resolvers.concatinators.tree=resolvers.concatinators.file
-resolvers.generators.tree=resolvers.generators.file
-resolvers.openers.tree=resolvers.openers.file
-resolvers.loaders.tree=resolvers.loaders.file
+local collectors={}
+local splitter=lpeg.splitat("/**/")
+local stripper=lpeg.replacer { [P("/")*P("*")^1*P(-1)]="" }
+table.setmetatableindex(collectors,function(t,k)
+ local rootname=lpegmatch(stripper,k)
+ local dataname=joinname(rootname,"dirlist")
+ local content=caches.loadcontent(dataname,"files",dataname)
+ if not content then
+ content=resolvers.scanfiles(rootname,nil,nil,false,true)
+ caches.savecontent(dataname,"files",content,dataname)
+ end
+ t[k]=content
+ return content
+end)
+local function checked(root,p,n)
+ if p then
+ if type(p)=="table" then
+ for i=1,#p do
+ local fullname=joinname(root,p[i],n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ else
+ local fullname=joinname(root,p,n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ end
+ return notfound()
+end
+local function resolve(specification)
+ local filename=specification.filename
+ if filename~="" then
+ local root,rest=lpegmatch(splitter,filename)
+ if root and rest then
+ local path,name=dirname(rest),basename(rest)
+ if name~=rest then
+ local content=collectors[root]
+ local p,n=lookup(content,name)
+ if not p then
+ return notfound()
+ end
+ local pattern=".*/"..path.."$"
+ local istable=type(p)=="table"
+ if istable then
+ for i=1,#p do
+ local pi=p[i]
+ if pi==path or find(pi,pattern) then
+ local fullname=joinname(root,pi,n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ end
+ elseif p==path or find(p,pattern) then
+ local fullname=joinname(root,p,n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ local queries=specification.queries
+ if queries and queries.option=="fileonly" then
+ return checked(root,p,n)
+ else
+ return notfound()
+ end
+ end
+ end
+ local path,name=dirname(filename),basename(filename)
+ local root=lpegmatch(stripper,path)
+ local content=collectors[path]
+ local p,n=lookup(content,name)
+ if p then
+ return checked(root,p,n)
+ end
+ end
+ return notfound()
+end
+resolvers.finders .dirlist=resolve
+resolvers.locators .dirlist=resolvers.locators .tree
+resolvers.hashers .dirlist=resolvers.hashers .tree
+resolvers.generators.dirlist=resolvers.generators.file
+resolvers.openers .dirlist=resolvers.openers .file
+resolvers.loaders .dirlist=resolvers.loaders .file
+function resolvers.finders.dirfile(specification)
+ local queries=specification.queries
+ if queries then
+ queries.option="fileonly"
+ else
+ specification.queries={ option="fileonly" }
+ end
+ return resolve(specification)
+end
+resolvers.locators .dirfile=resolvers.locators .dirlist
+resolvers.hashers .dirfile=resolvers.hashers .dirlist
+resolvers.generators.dirfile=resolvers.generators.dirlist
+resolvers.openers .dirfile=resolvers.openers .dirlist
+resolvers.loaders .dirfile=resolvers.loaders .dirlist
end -- of closure
@@ -15974,7 +16940,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-sch"] = package.loaded["data-sch"] or true
--- original size: 6213, stripped down to: 5160
+-- original size: 6569, stripped down to: 5304
if not modules then modules={} end modules ['data-sch']={
version=1.001,
@@ -16000,8 +16966,13 @@ directives.register("schemes.threshold",function(v) threshold=tonumber(v) or thr
function cleaners.none(specification)
return specification.original
end
-function cleaners.strip(specification)
- return (gsub(specification.original,"[^%a%d%.]+","-"))
+function cleaners.strip(specification)
+ local path,name=file.splitbase(specification.original)
+ if path=="" then
+ return (gsub(name,"[^%a%d%.]+","-"))
+ else
+ return (gsub((gsub(path,"%.","-").."-"..name),"[^%a%d%.]+","-"))
+ end
end
function cleaners.md5(specification)
return file.addsuffix(md5.hex(specification.original),file.suffix(specification.path))
@@ -16018,7 +16989,7 @@ end
local cached,loaded,reused,thresholds,handlers={},{},{},{},{}
local function runcurl(name,cachename)
local command="curl --silent --insecure --create-dirs --output "..cachename.." "..name
- os.spawn(command)
+ os.execute(command)
end
local function fetch(specification)
local original=specification.original
@@ -16150,7 +17121,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-lua"] = package.loaded["data-lua"] or true
--- original size: 4237, stripped down to: 3177
+-- original size: 4313, stripped down to: 3227
if not modules then modules={} end modules ['data-lua']={
version=1.001,
@@ -16159,7 +17130,7 @@ if not modules then modules={} end modules ['data-lua']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local resolvers,package=resolvers,package
+local package,lpeg=package,lpeg
local gsub=string.gsub
local concat=table.concat
local addsuffix=file.addsuffix
@@ -16170,9 +17141,11 @@ local luaformats={ 'TEXINPUTS','LUAINPUTS' }
local libformats={ 'CLUAINPUTS' }
local helpers=package.helpers or {}
local methods=helpers.methods or {}
+local resolvers=resolvers
+local resolveprefix=resolvers.resolve
+helpers.report=logs.reporter("resolvers","libraries")
trackers.register("resolvers.libraries",function(v) helpers.trace=v end)
trackers.register("resolvers.locating",function(v) helpers.trace=v end)
-helpers.report=logs.reporter("resolvers","libraries")
helpers.sequence={
"already loaded",
"preload table",
@@ -16187,7 +17160,7 @@ helpers.sequence={
}
local pattern=Cs(P("!")^0/""*(P("/")*P(-1)/"/"+P("/")^1/"/"+1)^0)
function helpers.cleanpath(path)
- return resolvers.resolve(lpegmatch(pattern,path))
+ return resolveprefix(lpegmatch(pattern,path))
end
local loadedaslib=helpers.loadedaslib
local getextraluapaths=package.extraluapaths
@@ -16324,7 +17297,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tmf"] = package.loaded["data-tmf"] or true
--- original size: 2600, stripped down to: 1627
+-- original size: 2601, stripped down to: 1627
if not modules then modules={} end modules ['data-tmf']={
version=1.001,
@@ -16380,7 +17353,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-lst"] = package.loaded["data-lst"] or true
--- original size: 2654, stripped down to: 2301
+-- original size: 2734, stripped down to: 2354
if not modules then modules={} end modules ['data-lst']={
version=1.001,
@@ -16389,10 +17362,13 @@ if not modules then modules={} end modules ['data-lst']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local find,concat,upper,format=string.find,table.concat,string.upper,string.format
+local rawget,type,next=rawget,type,next
+local find,concat,upper=string.find,table.concat,string.upper
local fastcopy,sortedpairs=table.fastcopy,table.sortedpairs
-resolvers.listers=resolvers.listers or {}
local resolvers=resolvers
+local listers=resolvers.listers or {}
+resolvers.listers=listers
+local resolveprefix=resolvers.resolve
local report_lists=logs.reporter("resolvers","lists")
local function tabstr(str)
if type(str)=='table' then
@@ -16401,7 +17377,7 @@ local function tabstr(str)
return str
end
end
-function resolvers.listers.variables(pattern)
+function listers.variables(pattern)
local instance=resolvers.instance
local environment=instance.environment
local variables=instance.variables
@@ -16422,10 +17398,10 @@ function resolvers.listers.variables(pattern)
for key,value in sortedpairs(configured) do
if key~="" and (pattern=="" or find(upper(key),pattern)) then
report_lists(key)
- report_lists(" env: %s",tabstr(rawget(environment,key)) or "unset")
- report_lists(" var: %s",tabstr(configured[key]) or "unset")
- report_lists(" exp: %s",tabstr(expansions[key]) or "unset")
- report_lists(" res: %s",tabstr(resolvers.resolve(expansions[key])) or "unset")
+ report_lists(" env: %s",tabstr(rawget(environment,key)) or "unset")
+ report_lists(" var: %s",tabstr(configured[key]) or "unset")
+ report_lists(" exp: %s",tabstr(expansions[key]) or "unset")
+ report_lists(" res: %s",tabstr(resolveprefix(expansions[key])) or "unset")
end
end
instance.environment=fastcopy(env)
@@ -16433,15 +17409,15 @@ function resolvers.listers.variables(pattern)
instance.expansions=fastcopy(exp)
end
local report_resolved=logs.reporter("system","resolved")
-function resolvers.listers.configurations()
+function listers.configurations()
local configurations=resolvers.instance.specification
for i=1,#configurations do
- report_resolved("file : %s",resolvers.resolve(configurations[i]))
+ report_resolved("file : %s",resolveprefix(configurations[i]))
end
report_resolved("")
local list=resolvers.expandedpathfromlist(resolvers.splitpath(resolvers.luacnfspec))
for i=1,#list do
- local li=resolvers.resolve(list[i])
+ local li=resolveprefix(list[i])
if lfs.isdir(li) then
report_resolved("path - %s",li)
else
@@ -16746,7 +17722,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["luat-fmt"] = package.loaded["luat-fmt"] or true
--- original size: 5951, stripped down to: 4922
+-- original size: 5955, stripped down to: 4926
if not modules then modules={} end modules ['luat-fmt']={
version=1.001,
@@ -16834,7 +17810,7 @@ function environment.make_format(name)
end
local command=format("%s --ini %s --lua=%s %s %sdump",engine,primaryflags(),quoted(usedluastub),quoted(fulltexsourcename),os.platform=="unix" and "\\\\" or "\\")
report_format("running command: %s\n",command)
- os.spawn(command)
+ os.execute(command)
local pattern=file.removesuffix(file.basename(usedluastub)).."-*.mem"
local mp=dir.glob(pattern)
if mp then
@@ -16869,7 +17845,7 @@ function environment.run_format(name,data,more)
else
local command=format("%s %s --fmt=%s --lua=%s %s %s",engine,primaryflags(),quoted(barename),quoted(luaname),quoted(data),more~="" and quoted(more) or "")
report_format("running command: %s",command)
- os.spawn(command)
+ os.execute(command)
end
end
end
@@ -16880,8 +17856,8 @@ end -- of closure
-- used libraries : l-lua.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-mrg.lua util-tpl.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.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-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
-- skipped libraries : -
--- original bytes : 695180
--- stripped bytes : 246794
+-- original bytes : 739251
+-- stripped bytes : 264497
-- end library merge
@@ -17107,6 +18083,7 @@ local helpinfo = [[
<category name="basic">
<subcategory>
<flag name="script"><short>run an mtx script (lua prefered method) (<ref name="noquotes"/>), no script gives list</short></flag>
+ <flag name="evaluate"><short>run code passed on the commandline (between quotes)</short></flag>
<flag name="execute"><short>run a script or program (texmfstart method) (<ref name="noquotes"/>)</short></flag>
<flag name="resolve"><short>resolve prefixed arguments</short></flag>
<flag name="ctxlua"><short>run internally (using preloaded libs)</short></flag>
@@ -17132,6 +18109,7 @@ local helpinfo = [[
<flag name="verbose"><short>give a bit more info</short></flag>
<flag name="trackers" value="list"><short>enable given trackers</short></flag>
<flag name="progname" value="str"><short>format or backend</short></flag>
+ <flag name="systeminfo" value="str"><short>show current operating system, processor, etc</short></flag>
</subcategory>
<subcategory>
<flag name="edit"><short>launch editor with found file</short></flag>
@@ -17761,6 +18739,39 @@ function runners.associate(filename)
os.launch(filename)
end
+function runners.evaluate(code,filename) -- for Luigi
+ if code == "loop" then
+ while true do
+ io.write("> ")
+ local code = io.read()
+ if code ~= "" then
+ local temp = string.match(code,"^= (.*)$")
+ if temp then
+ code = "print("..temp..")"
+ end
+ local compiled, message = loadstring(code)
+ if type(compiled) ~= "function" then
+ io.write("! " .. (message or code).."\n")
+ else
+ io.write(compiled())
+ end
+ end
+ end
+ else
+ if type(code) ~= "string" or code == "" then
+ code = filename
+ end
+ if code ~= "" then
+ local compiled, message = loadstring(code)
+ if type(compiled) ~= "function" then
+ io.write("invalid lua code: " .. (message or code))
+ return
+ end
+ io.write(compiled())
+ end
+ end
+end
+
function runners.gethelp(filename)
local url = environment.argument("url")
if url and url ~= "" then
@@ -17772,6 +18783,15 @@ function runners.gethelp(filename)
end
end
+function runners.systeminfo()
+ report("architecture : %s",os.platform or "<unset>")
+ report("operating system : %s",os.name or "<unset>")
+ report("file architecture : %s",os.type or "<unset>")
+ report("binary path : %s",os.selfdir or "<unset>")
+ report("binary suffix : %s",os.binsuffix or "<unset>")
+ report("library suffix : %s",os.libsuffix or "<unset>")
+end
+
-- this is a bit dirty ... first we store the first filename and next we
-- split the arguments so that we only see the ones meant for this script
-- ... later we will use the second half
@@ -17887,16 +18907,7 @@ end
if e_argument("ansi") then
- local formatters = string.formatters
-
- logs.setformatters {
- report_yes = formatters["%-15s | %s"],
- report_nop = formatters["%-15s |"],
- subreport_yes = formatters["%-15s | %s | %s"],
- subreport_nop = formatters["%-15s | %s |"],
- status_yes = formatters["%-15s : %s\n"],
- status_nop = formatters["%-15s :\n"],
- }
+ logs.setformatters("ansi")
local script = e_argument("script") or e_argument("scripts")
@@ -17921,6 +18932,10 @@ if e_argument("script") or e_argument("scripts") then
ok = runners.execute_ctx_script(filename)
end
+elseif e_argument("evaluate") then
+
+ runners.evaluate(e_argument("evaluate"),filename)
+
elseif e_argument("selfmerge") then
-- embed used libraries
@@ -18213,6 +19228,10 @@ elseif e_argument("exporthelp") then
runners.loadbase()
application.export(e_argument("exporthelp"),filename)
+elseif e_argument("systeminfo") then
+
+ runners.systeminfo()
+
elseif e_argument("help") or filename=='help' or filename == "" then
application.help()
diff --git a/Master/texmf-dist/scripts/context/stubs/mswin/mtxrun.lua b/Master/texmf-dist/scripts/context/stubs/mswin/mtxrun.lua
index 5cb5c8d2416..48a9a27a250 100644
--- a/Master/texmf-dist/scripts/context/stubs/mswin/mtxrun.lua
+++ b/Master/texmf-dist/scripts/context/stubs/mswin/mtxrun.lua
@@ -56,7 +56,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lua"] = package.loaded["l-lua"] or true
--- original size: 3409, stripped down to: 1763
+-- original size: 3888, stripped down to: 2197
if not modules then modules={} end modules ['l-lua']={
version=1.001,
@@ -139,6 +139,13 @@ end
if lua then
lua.mask=load([[τεχ = 1]]) and "utf" or "ascii"
end
+local flush=io.flush
+if flush then
+ local execute=os.execute if execute then function os.execute(...) flush() return execute(...) end end
+ local exec=os.exec if exec then function os.exec (...) flush() return exec (...) end end
+ local spawn=os.spawn if spawn then function os.spawn (...) flush() return spawn (...) end end
+ local popen=io.popen if popen then function io.popen (...) flush() return popen (...) end end
+end
end -- of closure
@@ -437,7 +444,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lpeg"] = package.loaded["l-lpeg"] or true
--- original size: 29983, stripped down to: 16202
+-- original size: 36225, stripped down to: 19891
if not modules then modules={} end modules ['l-lpeg']={
version=1.001,
@@ -498,6 +505,8 @@ patterns.utfbom_16_le=utfbom_16_le
patterns.utfbom_8=utfbom_8
patterns.utf_16_be_nl=P("\000\r\000\n")+P("\000\r")+P("\000\n")
patterns.utf_16_le_nl=P("\r\000\n\000")+P("\r\000")+P("\n\000")
+patterns.utf_32_be_nl=P("\000\000\000\r\000\000\000\n")+P("\000\000\000\r")+P("\000\000\000\n")
+patterns.utf_32_le_nl=P("\r\000\000\000\n\000\000\000")+P("\r\000\000\000")+P("\n\000\000\000")
patterns.utf8one=R("\000\127")
patterns.utf8two=R("\194\223")*utf8next
patterns.utf8three=R("\224\239")*utf8next*utf8next
@@ -527,9 +536,21 @@ patterns.nonwhitespace=nonwhitespace
local stripper=spacer^0*C((spacer^0*nonspacer^1)^0)
local fullstripper=whitespace^0*C((whitespace^0*nonwhitespace^1)^0)
local collapser=Cs(spacer^0/""*nonspacer^0*((spacer^0/" "*nonspacer^1)^0))
+local b_collapser=Cs(whitespace^0/""*(nonwhitespace^1+whitespace^1/" ")^0)
+local e_collapser=Cs((whitespace^1*P(-1)/""+nonwhitespace^1+whitespace^1/" ")^0)
+local m_collapser=Cs((nonwhitespace^1+whitespace^1/" ")^0)
+local b_stripper=Cs(spacer^0/""*(nonspacer^1+spacer^1/" ")^0)
+local e_stripper=Cs((spacer^1*P(-1)/""+nonspacer^1+spacer^1/" ")^0)
+local m_stripper=Cs((nonspacer^1+spacer^1/" ")^0)
patterns.stripper=stripper
patterns.fullstripper=fullstripper
patterns.collapser=collapser
+patterns.b_collapser=b_collapser
+patterns.m_collapser=m_collapser
+patterns.e_collapser=e_collapser
+patterns.b_stripper=b_stripper
+patterns.m_stripper=m_stripper
+patterns.e_stripper=e_stripper
patterns.lowercase=lowercase
patterns.uppercase=uppercase
patterns.letter=patterns.lowercase+patterns.uppercase
@@ -566,9 +587,12 @@ patterns.integer=sign^-1*digit^1
patterns.unsigned=digit^0*period*digit^1
patterns.float=sign^-1*patterns.unsigned
patterns.cunsigned=digit^0*comma*digit^1
+patterns.cpunsigned=digit^0*(period+comma)*digit^1
patterns.cfloat=sign^-1*patterns.cunsigned
+patterns.cpfloat=sign^-1*patterns.cpunsigned
patterns.number=patterns.float+patterns.integer
patterns.cnumber=patterns.cfloat+patterns.integer
+patterns.cpnumber=patterns.cpfloat+patterns.integer
patterns.oct=zero*octdigit^1
patterns.octal=patterns.oct
patterns.HEX=zero*P("X")*(digit+uppercase)^1
@@ -985,23 +1009,40 @@ function lpeg.append(list,pp,delayed,checked)
end
return p
end
+local p_false=P(false)
+local p_true=P(true)
local function make(t)
- local p
+ local function making(t)
+ local p=p_false
+ local keys=sortedkeys(t)
+ for i=1,#keys do
+ local k=keys[i]
+ if k~="" then
+ local v=t[k]
+ if v==true then
+ p=p+P(k)*p_true
+ elseif v==false then
+ else
+ p=p+P(k)*making(v)
+ end
+ end
+ end
+ if t[""] then
+ p=p+p_true
+ end
+ return p
+ end
+ local p=p_false
local keys=sortedkeys(t)
for i=1,#keys do
local k=keys[i]
- local v=t[k]
- if not p then
- if next(v) then
- p=P(k)*make(v)
- else
- p=P(k)
- end
- else
- if next(v) then
- p=p+P(k)*make(v)
+ if k~="" then
+ local v=t[k]
+ if v==true then
+ p=p+P(k)*p_true
+ elseif v==false then
else
- p=p+P(k)
+ p=p+P(k)*making(v)
end
end
end
@@ -1009,13 +1050,73 @@ local function make(t)
end
function lpeg.utfchartabletopattern(list)
local tree={}
- for i=1,#list do
- local t=tree
- for c in gmatch(list[i],".") do
- if not t[c] then
- t[c]={}
+ local n=#list
+ if n==0 then
+ for s in next,list do
+ local t=tree
+ local p,pk
+ for c in gmatch(s,".") do
+ if t==true then
+ t={ [c]=true,[""]=true }
+ p[pk]=t
+ p=t
+ t=false
+ elseif t==false then
+ t={ [c]=false }
+ p[pk]=t
+ p=t
+ t=false
+ else
+ local tc=t[c]
+ if not tc then
+ tc=false
+ t[c]=false
+ end
+ p=t
+ t=tc
+ end
+ pk=c
+ end
+ if t==false then
+ p[pk]=true
+ elseif t==true then
+ else
+ t[""]=true
+ end
+ end
+ else
+ for i=1,n do
+ local s=list[i]
+ local t=tree
+ local p,pk
+ for c in gmatch(s,".") do
+ if t==true then
+ t={ [c]=true,[""]=true }
+ p[pk]=t
+ p=t
+ t=false
+ elseif t==false then
+ t={ [c]=false }
+ p[pk]=t
+ p=t
+ t=false
+ else
+ local tc=t[c]
+ if not tc then
+ tc=false
+ t[c]=false
+ end
+ p=t
+ t=tc
+ end
+ pk=c
+ end
+ if t==false then
+ p[pk]=true
+ elseif t==true then
+ else
+ t[""]=true
end
- t=t[c]
end
end
return make(tree)
@@ -1055,6 +1156,65 @@ local case_2=period*(digit-trailingzeros)^1*(trailingzeros/"")
local number=digit^1*(case_1+case_2)
local stripper=Cs((number+1)^0)
lpeg.patterns.stripzeros=stripper
+local byte_to_HEX={}
+local byte_to_hex={}
+local byte_to_dec={}
+local hex_to_byte={}
+for i=0,255 do
+ local H=format("%02X",i)
+ local h=format("%02x",i)
+ local d=format("%03i",i)
+ local c=char(i)
+ byte_to_HEX[c]=H
+ byte_to_hex[c]=h
+ byte_to_dec[c]=d
+ hex_to_byte[h]=c
+ hex_to_byte[H]=c
+end
+local hextobyte=P(2)/hex_to_byte
+local bytetoHEX=P(1)/byte_to_HEX
+local bytetohex=P(1)/byte_to_hex
+local bytetodec=P(1)/byte_to_dec
+local hextobytes=Cs(hextobyte^0)
+local bytestoHEX=Cs(bytetoHEX^0)
+local bytestohex=Cs(bytetohex^0)
+local bytestodec=Cs(bytetodec^0)
+patterns.hextobyte=hextobyte
+patterns.bytetoHEX=bytetoHEX
+patterns.bytetohex=bytetohex
+patterns.bytetodec=bytetodec
+patterns.hextobytes=hextobytes
+patterns.bytestoHEX=bytestoHEX
+patterns.bytestohex=bytestohex
+patterns.bytestodec=bytestodec
+function string.toHEX(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(bytestoHEX,s)
+ end
+end
+function string.tohex(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(bytestohex,s)
+ end
+end
+function string.todec(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(bytestodec,s)
+ end
+end
+function string.tobytes(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(hextobytes,s)
+ end
+end
end -- of closure
@@ -1082,7 +1242,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-string"] = package.loaded["l-string"] or true
--- original size: 5671, stripped down to: 2827
+-- original size: 5694, stripped down to: 2827
if not modules then modules={} end modules ['l-string']={
version=1.001,
@@ -1187,7 +1347,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-table"] = package.loaded["l-table"] or true
--- original size: 31860, stripped down to: 20846
+-- original size: 33830, stripped down to: 21894
if not modules then modules={} end modules ['l-table']={
version=1.001,
@@ -1230,11 +1390,12 @@ function table.keys(t)
end
end
local function compare(a,b)
- local ta,tb=type(a),type(b)
- if ta==tb then
+ local ta=type(a)
+ local tb=type(b)
+ if ta==tb and ta=="number" then
return a<b
else
- return tostring(a)<tostring(b)
+ return tostring(a)<tostring(b)
end
end
local function sortedkeys(tab)
@@ -1334,14 +1495,14 @@ local function sortedhash(t,cmp)
end
local n=0
local m=#s
- local function kv(s)
+ local function kv()
if n<m then
n=n+1
local k=s[n]
return k,t[k]
end
end
- return kv,s
+ return kv
else
return nothing
end
@@ -1506,7 +1667,7 @@ local function simple_table(t)
if tv=="number" then
nt=nt+1
if hexify then
- tt[nt]=format("0x%04X",v)
+ tt[nt]=format("0x%X",v)
else
tt[nt]=tostring(v)
end
@@ -1537,7 +1698,7 @@ local function do_serialize(root,name,depth,level,indexed)
local tn=type(name)
if tn=="number" then
if hexify then
- handle(format("%s[0x%04X]={",depth,name))
+ handle(format("%s[0x%X]={",depth,name))
else
handle(format("%s[%s]={",depth,name))
end
@@ -1554,7 +1715,7 @@ local function do_serialize(root,name,depth,level,indexed)
end
end
end
- if root and next(root) then
+ if root and next(root)~=nil then
local first,last=nil,0
if compact then
last=#root
@@ -1576,7 +1737,7 @@ local function do_serialize(root,name,depth,level,indexed)
if compact and first and tk=="number" and k>=first and k<=last then
if tv=="number" then
if hexify then
- handle(format("%s 0x%04X,",depth,v))
+ handle(format("%s 0x%X,",depth,v))
else
handle(format("%s %s,",depth,v))
end
@@ -1587,7 +1748,7 @@ local function do_serialize(root,name,depth,level,indexed)
handle(format("%s %q,",depth,v))
end
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
handle(format("%s {},",depth))
elseif inline then
local st=simple_table(v)
@@ -1617,25 +1778,25 @@ local function do_serialize(root,name,depth,level,indexed)
elseif tv=="number" then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=0x%04X,",depth,k,v))
+ handle(format("%s [0x%X]=0x%X,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
elseif tk=="boolean" then
if hexify then
- handle(format("%s [%s]=0x%04X,",depth,k and "true" or "false",v))
+ handle(format("%s [%s]=0x%X,",depth,k and "true" or "false",v))
else
handle(format("%s [%s]=%s,",depth,k and "true" or "false",v))
end
elseif noquotes and not reserved[k] and lpegmatch(propername,k) then
if hexify then
- handle(format("%s %s=0x%04X,",depth,k,v))
+ handle(format("%s %s=0x%X,",depth,k,v))
else
handle(format("%s %s=%s,",depth,k,v))
end
else
if hexify then
- handle(format("%s [%q]=0x%04X,",depth,k,v))
+ handle(format("%s [%q]=0x%X,",depth,k,v))
else
handle(format("%s [%q]=%s,",depth,k,v))
end
@@ -1644,7 +1805,7 @@ local function do_serialize(root,name,depth,level,indexed)
if reduce and tonumber(v) then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%s,",depth,k,v))
+ handle(format("%s [0x%X]=%s,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
@@ -1658,7 +1819,7 @@ local function do_serialize(root,name,depth,level,indexed)
else
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%q,",depth,k,v))
+ handle(format("%s [0x%X]=%q,",depth,k,v))
else
handle(format("%s [%s]=%q,",depth,k,v))
end
@@ -1671,10 +1832,10 @@ local function do_serialize(root,name,depth,level,indexed)
end
end
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]={},",depth,k))
+ handle(format("%s [0x%X]={},",depth,k))
else
handle(format("%s [%s]={},",depth,k))
end
@@ -1690,7 +1851,7 @@ local function do_serialize(root,name,depth,level,indexed)
if st then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]={ %s },",depth,k,concat(st,", ")))
+ handle(format("%s [0x%X]={ %s },",depth,k,concat(st,", ")))
else
handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
end
@@ -1710,7 +1871,7 @@ local function do_serialize(root,name,depth,level,indexed)
elseif tv=="boolean" then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%s,",depth,k,v and "true" or "false"))
+ handle(format("%s [0x%X]=%s,",depth,k,v and "true" or "false"))
else
handle(format("%s [%s]=%s,",depth,k,v and "true" or "false"))
end
@@ -1726,7 +1887,7 @@ local function do_serialize(root,name,depth,level,indexed)
local f=getinfo(v).what=="C" and dump(dummy) or dump(v)
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=load(%q),",depth,k,f))
+ handle(format("%s [0x%X]=load(%q),",depth,k,f))
else
handle(format("%s [%s]=load(%q),",depth,k,f))
end
@@ -1741,7 +1902,7 @@ local function do_serialize(root,name,depth,level,indexed)
else
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%q,",depth,k,tostring(v)))
+ handle(format("%s [0x%X]=%q,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%q,",depth,k,tostring(v)))
end
@@ -1795,7 +1956,7 @@ local function serialize(_handle,root,name,specification)
end
elseif tname=="number" then
if hexify then
- handle(format("[0x%04X]={",name))
+ handle(format("[0x%X]={",name))
else
handle("["..name.."]={")
end
@@ -1813,7 +1974,7 @@ local function serialize(_handle,root,name,specification)
local dummy=root._w_h_a_t_e_v_e_r_
root._w_h_a_t_e_v_e_r_=nil
end
- if next(root) then
+ if next(root)~=nil then
do_serialize(root,name,"",0)
end
end
@@ -1942,14 +2103,25 @@ local function identical(a,b)
end
table.identical=identical
table.are_equal=are_equal
-function table.compact(t)
- if t then
- for k,v in next,t do
- if not next(v) then
- t[k]=nil
+local function sparse(old,nest,keeptables)
+ local new={}
+ for k,v in next,old do
+ if not (v=="" or v==false) then
+ if nest and type(v)=="table" then
+ v=sparse(v,nest)
+ if keeptables or next(v)~=nil then
+ new[k]=v
+ end
+ else
+ new[k]=v
end
end
end
+ return new
+end
+table.sparse=sparse
+function table.compact(t)
+ return sparse(t,true,true)
end
function table.contains(t,v)
if t then
@@ -2054,10 +2226,10 @@ function table.sub(t,i,j)
return { unpack(t,i,j) }
end
function table.is_empty(t)
- return not t or not next(t)
+ return not t or next(t)==nil
end
function table.has_one_entry(t)
- return t and not next(t,next(t))
+ return t and next(t,next(t))==nil
end
function table.loweredkeys(t)
local l={}
@@ -2102,6 +2274,44 @@ function table.values(t,s)
return {}
end
end
+function table.filtered(t,pattern,sort,cmp)
+ if t and type(pattern)=="string" then
+ if sort then
+ local s
+ if cmp then
+ s=sortedhashkeys(t,function(a,b) return cmp(t,a,b) end)
+ else
+ s=sortedkeys(t)
+ end
+ local n=0
+ local m=#s
+ local function kv(s)
+ while n<m do
+ n=n+1
+ local k=s[n]
+ if find(k,pattern) then
+ return k,t[k]
+ end
+ end
+ end
+ return kv,s
+ else
+ local n=next(t)
+ local function iterator()
+ while n~=nil do
+ local k=n
+ n=next(t,k)
+ if find(k,pattern) then
+ return k,t[k]
+ end
+ end
+ end
+ return iterator,t
+ end
+ else
+ return nothing
+ end
+end
end -- of closure
@@ -2110,7 +2320,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-io"] = package.loaded["l-io"] or true
--- original size: 8824, stripped down to: 6347
+-- original size: 8643, stripped down to: 6232
if not modules then modules={} end modules ['l-io']={
version=1.001,
@@ -2417,8 +2627,6 @@ function io.readstring(f,n,m)
local str=gsub(f:read(n),"\000","")
return str
end
-if not io.i_limiter then function io.i_limiter() end end
-if not io.o_limiter then function io.o_limiter() end end
end -- of closure
@@ -2645,7 +2853,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-os"] = package.loaded["l-os"] or true
--- original size: 16093, stripped down to: 9704
+-- original size: 15761, stripped down to: 9403
if not modules then modules={} end modules ['l-os']={
version=1.001,
@@ -2719,13 +2927,10 @@ if not os.__getenv__ then
setmetatable(os.env,{ __index=__index,__newindex=__newindex } )
end
end
-local execute,spawn,exec,iopopen,ioflush=os.execute,os.spawn or os.execute,os.exec or os.execute,io.popen,io.flush
-function os.execute(...) ioflush() return execute(...) end
-function os.spawn (...) ioflush() return spawn (...) end
-function os.exec (...) ioflush() return exec (...) end
-function io.popen (...) ioflush() return iopopen(...) end
+local execute=os.execute
+local iopopen=io.popen
function os.resultof(command)
- local handle=io.popen(command,"r")
+ local handle=iopopen(command,"r")
if handle then
local result=handle:read("*all") or ""
handle:close()
@@ -2754,7 +2959,7 @@ local launchers={
unix="$BROWSER %s &> /dev/null &",
}
function os.launch(str)
- os.execute(format(launchers[os.name] or launchers.unix,str))
+ execute(format(launchers[os.name] or launchers.unix,str))
end
if not os.times then
function os.times()
@@ -3029,7 +3234,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-file"] = package.loaded["l-file"] or true
--- original size: 18308, stripped down to: 9948
+-- original size: 20949, stripped down to: 9945
if not modules then modules={} end modules ['l-file']={
version=1.001,
@@ -3043,41 +3248,28 @@ local file=file
if not lfs then
lfs=optionalrequire("lfs")
end
-if not lfs then
- lfs={
- getcurrentdir=function()
- return "."
- end,
- attributes=function()
- return nil
- end,
- isfile=function(name)
- local f=io.open(name,'rb')
- if f then
- f:close()
- return true
- end
- end,
- isdir=function(name)
- print("you need to load lfs")
- return false
- end
- }
-elseif not lfs.isfile then
- local attributes=lfs.attributes
- function lfs.isdir(name)
- return attributes(name,"mode")=="directory"
- end
- function lfs.isfile(name)
- return attributes(name,"mode")=="file"
- end
-end
local insert,concat=table.insert,table.concat
local match,find,gmatch=string.match,string.find,string.gmatch
local lpegmatch=lpeg.match
local getcurrentdir,attributes=lfs.currentdir,lfs.attributes
local checkedsplit=string.checkedsplit
local P,R,S,C,Cs,Cp,Cc,Ct=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Cs,lpeg.Cp,lpeg.Cc,lpeg.Ct
+local tricky=S("/\\")*P(-1)
+local attributes=lfs.attributes
+if sandbox then
+ sandbox.redefine(lfs.isfile,"lfs.isfile")
+ sandbox.redefine(lfs.isdir,"lfs.isdir")
+end
+function lfs.isdir(name)
+ if lpegmatch(tricky,name) then
+ return attributes(name,"mode")=="directory"
+ else
+ return attributes(name.."/.","mode")=="directory"
+ end
+end
+function lfs.isfile(name)
+ return attributes(name,"mode")=="file"
+end
local colon=P(":")
local period=P(".")
local periods=P("..")
@@ -3279,28 +3471,30 @@ local isroot=fwslash^1*-1
local hasroot=fwslash^1
local reslasher=lpeg.replacer(S("\\/"),"/")
local deslasher=lpeg.replacer(S("\\/")^1,"/")
-function file.join(...)
- local lst={... }
- local one=lst[1]
+function file.join(one,two,three,...)
+ if not two then
+ return one=="" and one or lpegmatch(stripper,one)
+ end
+ if one=="" then
+ return lpegmatch(stripper,three and concat({ two,three,... },"/") or two)
+ end
if lpegmatch(isnetwork,one) then
local one=lpegmatch(reslasher,one)
- local two=lpegmatch(deslasher,concat(lst,"/",2))
+ local two=lpegmatch(deslasher,three and concat({ two,three,... },"/") or two)
if lpegmatch(hasroot,two) then
return one..two
else
return one.."/"..two
end
elseif lpegmatch(isroot,one) then
- local two=lpegmatch(deslasher,concat(lst,"/",2))
+ local two=lpegmatch(deslasher,three and concat({ two,three,... },"/") or two)
if lpegmatch(hasroot,two) then
return two
else
return "/"..two
end
- elseif one=="" then
- return lpegmatch(stripper,concat(lst,"/",2))
else
- return lpegmatch(deslasher,concat(lst,"/"))
+ return lpegmatch(deslasher,concat({ one,two,three,... },"/"))
end
end
local drivespec=R("az","AZ")^1*colon
@@ -3474,7 +3668,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-md5"] = package.loaded["l-md5"] or true
--- original size: 3760, stripped down to: 2088
+-- original size: 3248, stripped down to: 2266
if not modules then modules={} end modules ['l-md5']={
version=1.001,
@@ -3492,14 +3686,20 @@ if not md5 then
}
end
local md5,file=md5,file
-local gsub,format,byte=string.gsub,string.format,string.byte
-local md5sum=md5.sum
-local function convert(str,fmt)
- return (gsub(md5sum(str),".",function(chr) return format(fmt,byte(chr)) end))
-end
-if not md5.HEX then function md5.HEX(str) return convert(str,"%02X") end end
-if not md5.hex then function md5.hex(str) return convert(str,"%02x") end end
-if not md5.dec then function md5.dec(str) return convert(str,"%03i") end end
+local gsub=string.gsub
+do
+ local patterns=lpeg and lpeg.patterns
+ if patterns then
+ local bytestoHEX=patterns.bytestoHEX
+ local bytestohex=patterns.bytestohex
+ local bytestodec=patterns.bytestodec
+ local lpegmatch=lpeg.match
+ local md5sum=md5.sum
+ if not md5.HEX then function md5.HEX(str) if str then return lpegmatch(bytestoHEX,md5sum(str)) end end end
+ if not md5.hex then function md5.hex(str) if str then return lpegmatch(bytestohex,md5sum(str)) end end end
+ if not md5.dec then function md5.dec(str) if str then return lpegmatch(bytestodec,md5sum(str)) end end end
+ end
+end
function file.needsupdating(oldname,newname,threshold)
local oldtime=lfs.attributes(oldname,"modification")
if oldtime then
@@ -3556,7 +3756,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-url"] = package.loaded["l-url"] or true
--- original size: 12292, stripped down to: 5585
+-- original size: 12531, stripped down to: 5721
if not modules then modules={} end modules ['l-url']={
version=1.001,
@@ -3642,19 +3842,25 @@ local splitquery=Cf (Ct("")*P { "sequence",
pair=Cg(key*equal*value),
},rawset)
local function hashed(str)
- if str=="" then
+ if not str or str=="" then
return {
scheme="invalid",
original=str,
}
end
- local s=split(str)
- local rawscheme=s[1]
- local rawquery=s[4]
- local somescheme=rawscheme~=""
- local somequery=rawquery~=""
+ local detailed=split(str)
+ local rawscheme=""
+ local rawquery=""
+ local somescheme=false
+ local somequery=false
+ if detailed then
+ rawscheme=detailed[1]
+ rawquery=detailed[4]
+ somescheme=rawscheme~=""
+ somequery=rawquery~=""
+ end
if not somescheme and not somequery then
- s={
+ return {
scheme="file",
authority="",
path=str,
@@ -3664,28 +3870,28 @@ local function hashed(str)
noscheme=true,
filename=str,
}
- else
- local authority,path,filename=s[2],s[3]
- if authority=="" then
- filename=path
- elseif path=="" then
- filename=""
- else
- filename=authority.."/"..path
- end
- s={
- scheme=rawscheme,
- authority=authority,
- path=path,
- query=lpegmatch(unescaper,rawquery),
- queries=lpegmatch(splitquery,rawquery),
- fragment=s[5],
- original=str,
- noscheme=false,
- filename=filename,
- }
end
- return s
+ local authority=detailed[2]
+ local path=detailed[3]
+ local filename=nil
+ if authority=="" then
+ filename=path
+ elseif path=="" then
+ filename=""
+ else
+ filename=authority.."/"..path
+ end
+ return {
+ scheme=rawscheme,
+ authority=authority,
+ path=path,
+ query=lpegmatch(unescaper,rawquery),
+ queries=lpegmatch(splitquery,rawquery),
+ fragment=detailed[5],
+ original=str,
+ noscheme=false,
+ filename=filename,
+ }
end
url.split=split
url.hasscheme=hasscheme
@@ -3719,7 +3925,7 @@ function url.construct(hash)
end
return lpegmatch(escaper,concat(fullurl))
end
-local pattern=Cs(noslash*R("az","AZ")*(S(":|")/":")*noslash*P(1)^0)
+local pattern=Cs(slash^-1/""*R("az","AZ")*((S(":|")/":")+P(":"))*slash*P(1)^0)
function url.filename(filename)
local spec=hashed(filename)
local path=spec.path
@@ -3767,7 +3973,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-dir"] = package.loaded["l-dir"] or true
--- original size: 14788, stripped down to: 9096
+-- original size: 16765, stripped down to: 11003
if not modules then modules={} end modules ['l-dir']={
version=1.001,
@@ -3777,7 +3983,7 @@ if not modules then modules={} end modules ['l-dir']={
license="see context related readme files"
}
local type,select=type,select
-local find,gmatch,match,gsub=string.find,string.gmatch,string.match,string.gsub
+local find,gmatch,match,gsub,sub=string.find,string.gmatch,string.match,string.gsub,string.sub
local concat,insert,remove,unpack=table.concat,table.insert,table.remove,table.unpack
local lpegmatch=lpeg.match
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
@@ -3786,53 +3992,126 @@ local dir=dir
local lfs=lfs
local attributes=lfs.attributes
local walkdir=lfs.dir
-local isdir=lfs.isdir
-local isfile=lfs.isfile
+local isdir=lfs.isdir
+local isfile=lfs.isfile
local currentdir=lfs.currentdir
local chdir=lfs.chdir
local mkdir=lfs.mkdir
local onwindows=os.type=="windows" or find(os.getenv("PATH"),";",1,true)
-if not isdir then
- function isdir(name)
- local a=attributes(name)
- return a and a.mode=="directory"
+if onwindows then
+ local tricky=S("/\\")*P(-1)
+ isdir=function(name)
+ if lpegmatch(tricky,name) then
+ return attributes(name,"mode")=="directory"
+ else
+ return attributes(name.."/.","mode")=="directory"
+ end
+ end
+ isfile=function(name)
+ return attributes(name,"mode")=="file"
end
lfs.isdir=isdir
-end
-if not isfile then
- function isfile(name)
- local a=attributes(name)
- return a and a.mode=="file"
+ lfs.isfile=isfile
+else
+ isdir=function(name)
+ return attributes(name,"mode")=="directory"
end
+ isfile=function(name)
+ return attributes(name,"mode")=="file"
+ end
+ lfs.isdir=isdir
lfs.isfile=isfile
end
function dir.current()
return (gsub(currentdir(),"\\","/"))
end
-local lfsisdir=isdir
-local function isdir(path)
- path=gsub(path,"[/\\]+$","")
- return lfsisdir(path)
+local function glob_pattern_function(path,patt,recurse,action)
+ if isdir(path) then
+ local usedpath
+ if path=="/" then
+ usedpath="/."
+ elseif not find(path,"/$") then
+ usedpath=path.."/."
+ path=path.."/"
+ else
+ usedpath=path
+ end
+ local dirs
+ for name in walkdir(usedpath) do
+ if name~="." and name~=".." then
+ local full=path..name
+ local mode=attributes(full,'mode')
+ if mode=='file' then
+ if not patt or find(full,patt) then
+ action(full)
+ end
+ elseif recurse and mode=="directory" then
+ if not dirs then
+ dirs={ full }
+ else
+ dirs[#dirs+1]=full
+ end
+ end
+ end
+ end
+ if dirs then
+ for i=1,#dirs do
+ glob_pattern_function(dirs[i],patt,recurse,action)
+ end
+ end
+ end
end
-lfs.isdir=isdir
-local function globpattern(path,patt,recurse,action)
- if path=="/" then
- path=path.."."
- elseif not find(path,"/$") then
- path=path..'/'
- end
- if isdir(path) then
- for name in walkdir(path) do
- local full=path..name
- local mode=attributes(full,'mode')
- if mode=='file' then
- if find(full,patt) then
- action(full)
+local function glob_pattern_table(path,patt,recurse,result)
+ if not result then
+ result={}
+ end
+ if isdir(path) then
+ local usedpath
+ if path=="/" then
+ usedpath="/."
+ elseif not find(path,"/$") then
+ usedpath=path.."/."
+ path=path.."/"
+ else
+ usedpath=path
+ end
+ local dirs
+ for name in walkdir(usedpath) do
+ if name~="." and name~=".." then
+ local full=path..name
+ local mode=attributes(full,'mode')
+ if mode=='file' then
+ if not patt or find(full,patt) then
+ result[#result+1]=full
+ end
+ elseif recurse and mode=="directory" then
+ if not dirs then
+ dirs={ full }
+ else
+ dirs[#dirs+1]=full
+ end
end
- elseif recurse and (mode=="directory") and (name~='.') and (name~="..") then
- globpattern(full,patt,recurse,action)
end
end
+ if dirs then
+ for i=1,#dirs do
+ glob_pattern_table(dirs[i],patt,recurse,result)
+ end
+ end
+ end
+ return result
+end
+local function globpattern(path,patt,recurse,method)
+ local kind=type(method)
+ if patt and sub(patt,1,-3)==path then
+ patt=false
+ end
+ if kind=="function" then
+ return glob_pattern_function(path,patt,recurse,method)
+ elseif kind=="table" then
+ return glob_pattern_table(path,patt,recurse,method)
+ else
+ return glob_pattern_table(path,patt,recurse,{})
end
end
dir.globpattern=globpattern
@@ -3845,34 +4124,40 @@ local function collectpattern(path,patt,recurse,result)
ok,scanner,first=xpcall(function() return walkdir(path) end,function() end)
end
if ok and type(scanner)=="function" then
- if not find(path,"/$") then path=path..'/' end
+ if not find(path,"/$") then
+ path=path..'/'
+ end
for name in scanner,first do
- local full=path..name
- local attr=attributes(full)
- local mode=attr.mode
- if mode=='file' then
- if find(full,patt) then
+ if name=="." then
+ elseif name==".." then
+ else
+ local full=path..name
+ local attr=attributes(full)
+ local mode=attr.mode
+ if mode=='file' then
+ if find(full,patt) then
+ result[name]=attr
+ end
+ elseif recurse and mode=="directory" then
+ attr.list=collectpattern(full,patt,recurse)
result[name]=attr
end
- elseif recurse and (mode=="directory") and (name~='.') and (name~="..") then
- attr.list=collectpattern(full,patt,recurse)
- result[name]=attr
end
end
end
return result
end
dir.collectpattern=collectpattern
-local separator
-if onwindows then
+local separator,pattern
+if onwindows then
local slash=S("/\\")/"/"
- pattern=Ct {
+ pattern={
[1]=(Cs(P(".")+slash^1)+Cs(R("az","AZ")*P(":")*slash^0)+Cc("./"))*V(2)*V(3),
[2]=Cs(((1-S("*?/\\"))^0*slash)^0),
[3]=Cs(P(1)^0)
}
-else
- pattern=Ct {
+else
+ pattern={
[1]=(C(P(".")+P("/")^1)+Cc("./"))*V(2)*V(3),
[2]=C(((1-S("*?/"))^0*P("/"))^0),
[3]=C(P(1)^0)
@@ -3890,9 +4175,8 @@ local function glob(str,t)
elseif 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 root,path,base=lpegmatch(pattern,str)
+ if root and path and base then
local recurse=find(base,"**",1,true)
local start=root..path
local result=lpegmatch(filter,start..base)
@@ -3914,16 +4198,12 @@ local function glob(str,t)
return { str }
end
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 root,path,base=lpegmatch(pattern,str)
+ if root and path and base then
local recurse=find(base,"**",1,true)
local start=root..path
local result=lpegmatch(filter,start..base)
- globpattern(start,result,recurse,action)
- return t
+ return globpattern(start,result,recurse,t)
else
return {}
end
@@ -4071,47 +4351,51 @@ else
end
end
dir.makedirs=dir.mkdirs
-if onwindows then
- function dir.expandname(str)
- 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()
+do
+ local chdir=sandbox and sandbox.original(chdir) or chdir
+ if onwindows then
+ local xcurrentdir=dir.current
+ function dir.expandname(str)
+ local first,nothing,last=match(str,"^(//)(//*)(.*)$")
+ if first then
+ first=xcurrentdir().."/"
+ 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=xcurrentdir()
+ end
+ chdir(d)
end
- chdir(d)
+ end
+ if not first then
+ first,last=xcurrentdir(),str
+ end
+ last=gsub(last,"//","/")
+ last=gsub(last,"/%./","/")
+ last=gsub(last,"^/*","")
+ first=gsub(first,"/*$","")
+ if last=="" or last=="." then
+ return first
+ else
+ return first.."/"..last
end
end
- if not first then
- first,last=dir.current(),str
- end
- last=gsub(last,"//","/")
- last=gsub(last,"/%./","/")
- last=gsub(last,"^/*","")
- first=gsub(first,"/*$","")
- if last=="" or last=="." then
- return first
- else
- return first.."/"..last
- end
- end
-else
- function dir.expandname(str)
- if not find(str,"^/") then
- str=currentdir().."/"..str
+ else
+ function dir.expandname(str)
+ if not find(str,"^/") then
+ str=currentdir().."/"..str
+ end
+ str=gsub(str,"//","/")
+ str=gsub(str,"/%./","/")
+ str=gsub(str,"(.)/%.$","%1")
+ return str
end
- str=gsub(str,"//","/")
- str=gsub(str,"/%./","/")
- str=gsub(str,"(.)/%.$","%1")
- return str
end
end
file.expandname=dir.expandname
@@ -4154,7 +4438,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-boolean"] = package.loaded["l-boolean"] or true
--- original size: 1809, stripped down to: 1527
+-- original size: 1850, stripped down to: 1568
if not modules then modules={} end modules ['l-boolean']={
version=1.001,
@@ -4208,11 +4492,11 @@ function string.booleanstring(str)
return str=="yes" or str=="on" or str=="t"
end
end
-function string.is_boolean(str,default)
+function string.is_boolean(str,default,strict)
if type(str)=="string" then
- if str=="true" or str=="yes" or str=="on" or str=="t" or str=="1" then
+ if str=="true" or str=="yes" or str=="on" or str=="t" or (not strict and str=="1") then
return true
- elseif str=="false" or str=="no" or str=="off" or str=="f" or str=="0" then
+ elseif str=="false" or str=="no" or str=="off" or str=="f" or (not strict and str=="0") then
return false
end
end
@@ -4226,7 +4510,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-unicode"] = package.loaded["l-unicode"] or true
--- original size: 33706, stripped down to: 14938
+-- original size: 37233, stripped down to: 15684
if not modules then modules={} end modules ['l-unicode']={
version=1.001,
@@ -4242,7 +4526,9 @@ local type=type
local char,byte,format,sub,gmatch=string.char,string.byte,string.format,string.sub,string.gmatch
local concat=table.concat
local P,C,R,Cs,Ct,Cmt,Cc,Carg,Cp=lpeg.P,lpeg.C,lpeg.R,lpeg.Cs,lpeg.Ct,lpeg.Cmt,lpeg.Cc,lpeg.Carg,lpeg.Cp
-local lpegmatch,patterns=lpeg.match,lpeg.patterns
+local lpegmatch=lpeg.match
+local patterns=lpeg.patterns
+local tabletopattern=lpeg.utfchartabletopattern
local bytepairs=string.bytepairs
local finder=lpeg.finder
local replacer=lpeg.replacer
@@ -4251,7 +4537,7 @@ local utfgmatch=utf.gmatch
local p_utftype=patterns.utftype
local p_utfstricttype=patterns.utfstricttype
local p_utfoffset=patterns.utfoffset
-local p_utf8char=patterns.utf8char
+local p_utf8char=patterns.utf8character
local p_utf8byte=patterns.utf8byte
local p_utfbom=patterns.utfbom
local p_newline=patterns.newline
@@ -4450,15 +4736,52 @@ if not utf.sub then
end
end
end
-function utf.remapper(mapping)
- local pattern=Cs((p_utf8char/mapping)^0)
- return function(str)
- if not str or str=="" then
- return ""
+function utf.remapper(mapping,option)
+ local variant=type(mapping)
+ if variant=="table" then
+ if option=="dynamic" then
+ local pattern=false
+ table.setmetatablenewindex(mapping,function(t,k,v) rawset(t,k,v) pattern=false end)
+ return function(str)
+ if not str or str=="" then
+ return ""
+ else
+ if not pattern then
+ pattern=Cs((tabletopattern(mapping)/mapping+p_utf8char)^0)
+ end
+ return lpegmatch(pattern,str)
+ end
+ end
+ elseif option=="pattern" then
+ return Cs((tabletopattern(mapping)/mapping+p_utf8char)^0)
else
- return lpegmatch(pattern,str)
+ local pattern=Cs((tabletopattern(mapping)/mapping+p_utf8char)^0)
+ return function(str)
+ if not str or str=="" then
+ return ""
+ else
+ return lpegmatch(pattern,str)
+ end
+ end,pattern
+ end
+ elseif variant=="function" then
+ if option=="pattern" then
+ return Cs((p_utf8char/mapping+p_utf8char)^0)
+ else
+ local pattern=Cs((p_utf8char/mapping+p_utf8char)^0)
+ return function(str)
+ if not str or str=="" then
+ return ""
+ else
+ return lpegmatch(pattern,str)
+ end
+ end,pattern
+ end
+ else
+ return function(str)
+ return str or ""
end
- end,pattern
+ end
end
function utf.replacer(t)
local r=replacer(t,false,false,true)
@@ -4508,190 +4831,157 @@ function utf.magic(f)
end
local utf16_to_utf8_be,utf16_to_utf8_le
local utf32_to_utf8_be,utf32_to_utf8_le
-local utf_16_be_linesplitter=patterns.utfbom_16_be^-1*lpeg.tsplitat(patterns.utf_16_be_nl)
-local utf_16_le_linesplitter=patterns.utfbom_16_le^-1*lpeg.tsplitat(patterns.utf_16_le_nl)
-if bytepairs then
- utf16_to_utf8_be=function(t)
- if type(t)=="string" then
- t=lpegmatch(utf_16_be_linesplitter,t)
- end
- local 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)
- end
- return t
+local utf_16_be_getbom=patterns.utfbom_16_be^-1
+local utf_16_le_getbom=patterns.utfbom_16_le^-1
+local utf_32_be_getbom=patterns.utfbom_32_be^-1
+local utf_32_le_getbom=patterns.utfbom_32_le^-1
+local utf_16_be_linesplitter=utf_16_be_getbom*lpeg.tsplitat(patterns.utf_16_be_nl)
+local utf_16_le_linesplitter=utf_16_le_getbom*lpeg.tsplitat(patterns.utf_16_le_nl)
+local utf_32_be_linesplitter=utf_32_be_getbom*lpeg.tsplitat(patterns.utf_32_be_nl)
+local utf_32_le_linesplitter=utf_32_le_getbom*lpeg.tsplitat(patterns.utf_32_le_nl)
+local more=0
+local p_utf16_to_utf8_be=C(1)*C(1)/function(left,right)
+ local now=256*byte(left)+byte(right)
+ if more>0 then
+ now=(more-0xD800)*0x400+(now-0xDC00)+0x10000
+ more=0
+ return utfchar(now)
+ elseif now>=0xD800 and now<=0xDBFF then
+ more=now
+ return ""
+ else
+ return utfchar(now)
+ end
+end
+local p_utf16_to_utf8_le=C(1)*C(1)/function(right,left)
+ local now=256*byte(left)+byte(right)
+ if more>0 then
+ now=(more-0xD800)*0x400+(now-0xDC00)+0x10000
+ more=0
+ return utfchar(now)
+ elseif now>=0xD800 and now<=0xDBFF then
+ more=now
+ return ""
+ else
+ return utfchar(now)
+ end
+end
+local p_utf32_to_utf8_be=C(1)*C(1)*C(1)*C(1)/function(a,b,c,d)
+ return utfchar(256*256*256*byte(a)+256*256*byte(b)+256*byte(c)+byte(d))
+end
+local p_utf32_to_utf8_le=C(1)*C(1)*C(1)*C(1)/function(a,b,c,d)
+ return utfchar(256*256*256*byte(d)+256*256*byte(c)+256*byte(b)+byte(a))
+end
+p_utf16_to_utf8_be=P(true)/function() more=0 end*utf_16_be_getbom*Cs(p_utf16_to_utf8_be^0)
+p_utf16_to_utf8_le=P(true)/function() more=0 end*utf_16_le_getbom*Cs(p_utf16_to_utf8_le^0)
+p_utf32_to_utf8_be=P(true)/function() more=0 end*utf_32_be_getbom*Cs(p_utf32_to_utf8_be^0)
+p_utf32_to_utf8_le=P(true)/function() more=0 end*utf_32_le_getbom*Cs(p_utf32_to_utf8_le^0)
+patterns.utf16_to_utf8_be=p_utf16_to_utf8_be
+patterns.utf16_to_utf8_le=p_utf16_to_utf8_le
+patterns.utf32_to_utf8_be=p_utf32_to_utf8_be
+patterns.utf32_to_utf8_le=p_utf32_to_utf8_le
+utf16_to_utf8_be=function(s)
+ if s and s~="" then
+ return lpegmatch(p_utf16_to_utf8_be,s)
+ else
+ return s
end
- utf16_to_utf8_le=function(t)
- if type(t)=="string" then
- t=lpegmatch(utf_16_le_linesplitter,t)
- end
- local 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)
- end
- return t
+end
+local utf16_to_utf8_be_t=function(t)
+ if not t then
+ return nil
+ elseif type(t)=="string" then
+ t=lpegmatch(utf_16_be_linesplitter,t)
end
- utf32_to_utf8_be=function(t)
- if type(t)=="string" then
- t=lpegmatch(utflinesplitter,t)
- end
- local result={}
- for i=1,#t do
- local r,more=0,-1
- for a,b in bytepairs(t[i]) do
- if a and b then
- if more<0 then
- more=256*256*256*a+256*256*b
- else
- r=r+1
- result[t]=utfchar(more+256*a+b)
- more=-1
- end
- else
- break
- end
- end
- t[i]=concat(result,"",1,r)
+ for i=1,#t do
+ local s=t[i]
+ if s~="" then
+ t[i]=lpegmatch(p_utf16_to_utf8_be,s)
end
- return t
end
- utf32_to_utf8_le=function(t)
- if type(t)=="string" then
- t=lpegmatch(utflinesplitter,t)
- end
- local result={}
- for i=1,#t do
- local r,more=0,-1
- for a,b in bytepairs(t[i]) do
- if a and b then
- if more<0 then
- more=256*b+a
- else
- r=r+1
- result[t]=utfchar(more+256*256*256*b+256*256*a)
- more=-1
- end
- else
- break
- end
- end
- t[i]=concat(result,"",1,r)
- end
- return t
+ return t
+end
+utf16_to_utf8_le=function(s)
+ if s and s~="" then
+ return lpegmatch(p_utf16_to_utf8_le,s)
+ else
+ return s
end
-else
- utf16_to_utf8_be=function(t)
- if type(t)=="string" then
- t=lpegmatch(utf_16_be_linesplitter,t)
- end
- local result={}
- for i=1,#t do
- local r,more=0,0
- for left,right in gmatch(t[i],"(.)(.)") do
- if left=="\000" then
- r=r+1
- result[r]=utfchar(byte(right))
- elseif right then
- local now=256*byte(left)+byte(right)
- if more>0 then
- now=(more-0xD800)*0x400+(now-0xDC00)+0x10000
- 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)
+end
+local utf16_to_utf8_le_t=function(t)
+ if not t then
+ return nil
+ elseif type(t)=="string" then
+ t=lpegmatch(utf_16_le_linesplitter,t)
+ end
+ for i=1,#t do
+ local s=t[i]
+ if s~="" then
+ t[i]=lpegmatch(p_utf16_to_utf8_le,s)
end
- return t
end
- utf16_to_utf8_le=function(t)
- if type(t)=="string" then
- t=lpegmatch(utf_16_le_linesplitter,t)
+ return t
+end
+utf32_to_utf8_be=function(s)
+ if s and s~="" then
+ return lpegmatch(p_utf32_to_utf8_be,s)
+ else
+ return s
+ end
+end
+local utf32_to_utf8_be_t=function(t)
+ if not t then
+ return nil
+ elseif type(t)=="string" then
+ t=lpegmatch(utf_32_be_linesplitter,t)
+ end
+ for i=1,#t do
+ local s=t[i]
+ if s~="" then
+ t[i]=lpegmatch(p_utf32_to_utf8_be,s)
end
- local result={}
- for i=1,#t do
- local r,more=0,0
- for left,right in gmatch(t[i],"(.)(.)") do
- if right=="\000" then
- r=r+1
- result[r]=utfchar(byte(left))
- elseif right then
- local now=256*byte(right)+byte(left)
- if more>0 then
- now=(more-0xD800)*0x400+(now-0xDC00)+0x10000
- 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)
+ end
+ return t
+end
+utf32_to_utf8_le=function(s)
+ if s and s~="" then
+ return lpegmatch(p_utf32_to_utf8_le,s)
+ else
+ return s
+ end
+end
+local utf32_to_utf8_le_t=function(t)
+ if not t then
+ return nil
+ elseif type(t)=="string" then
+ t=lpegmatch(utf_32_le_linesplitter,t)
+ end
+ for i=1,#t do
+ local s=t[i]
+ if s~="" then
+ t[i]=lpegmatch(p_utf32_to_utf8_le,s)
end
- return t
end
- utf32_to_utf8_le=function() return {} end
- utf32_to_utf8_be=function() return {} end
+ return t
end
+utf.utf16_to_utf8_le_t=utf16_to_utf8_le_t
+utf.utf16_to_utf8_be_t=utf16_to_utf8_be_t
+utf.utf32_to_utf8_le_t=utf32_to_utf8_le_t
+utf.utf32_to_utf8_be_t=utf32_to_utf8_be_t
utf.utf16_to_utf8_le=utf16_to_utf8_le
utf.utf16_to_utf8_be=utf16_to_utf8_be
utf.utf32_to_utf8_le=utf32_to_utf8_le
utf.utf32_to_utf8_be=utf32_to_utf8_be
-function utf.utf8_to_utf8(t)
+function utf.utf8_to_utf8_t(t)
return type(t)=="string" and lpegmatch(utflinesplitter,t) or t
end
-function utf.utf16_to_utf8(t,endian)
- return endian and utf16_to_utf8_be(t) or utf16_to_utf8_le(t) or t
+function utf.utf16_to_utf8_t(t,endian)
+ return endian and utf16_to_utf8_be_t(t) or utf16_to_utf8_le_t(t) or t
end
-function utf.utf32_to_utf8(t,endian)
- return endian and utf32_to_utf8_be(t) or utf32_to_utf8_le(t) or t
+function utf.utf32_to_utf8_t(t,endian)
+ return endian and utf32_to_utf8_be_t(t) or utf32_to_utf8_le_t(t) or t
end
-local function little(c)
- local b=byte(c)
+local function little(b)
if b<0x10000 then
return char(b%256,b/256)
else
@@ -4700,8 +4990,7 @@ local function little(c)
return char(b1%256,b1/256,b2%256,b2/256)
end
end
-local function big(c)
- local b=byte(c)
+local function big(b)
if b<0x10000 then
return char(b/256,b%256)
else
@@ -4710,27 +4999,29 @@ local function big(c)
return char(b1/256,b1%256,b2/256,b2%256)
end
end
-local _,l_remap=utf.remapper(little)
-local _,b_remap=utf.remapper(big)
-function utf.utf8_to_utf16_be(str,nobom)
+local l_remap=Cs((p_utf8byte/little+P(1)/"")^0)
+local b_remap=Cs((p_utf8byte/big+P(1)/"")^0)
+local function utf8_to_utf16_be(str,nobom)
if nobom then
return lpegmatch(b_remap,str)
else
return char(254,255)..lpegmatch(b_remap,str)
end
end
-function utf.utf8_to_utf16_le(str,nobom)
+local function utf8_to_utf16_le(str,nobom)
if nobom then
return lpegmatch(l_remap,str)
else
return char(255,254)..lpegmatch(l_remap,str)
end
end
+utf.utf8_to_utf16_be=utf8_to_utf16_be
+utf.utf8_to_utf16_le=utf8_to_utf16_le
function utf.utf8_to_utf16(str,littleendian,nobom)
if littleendian then
- return utf.utf8_to_utf16_le(str,nobom)
+ return utf8_to_utf16_le(str,nobom)
else
- return utf.utf8_to_utf16_be(str,nobom)
+ return utf8_to_utf16_be(str,nobom)
end
end
local pattern=Cs (
@@ -4746,16 +5037,16 @@ function utf.xstring(s)
return format("0x%05X",type(s)=="number" and s or utfbyte(s))
end
function utf.toeight(str)
- if not str then
+ if not str or str=="" then
return nil
end
local utftype=lpegmatch(p_utfstricttype,str)
if utftype=="utf-8" then
- return sub(str,4)
- elseif utftype=="utf-16-le" then
- return utf16_to_utf8_le(str)
+ return sub(str,4)
elseif utftype=="utf-16-be" then
- return utf16_to_utf8_ne(str)
+ return utf16_to_utf8_be(str)
+ elseif utftype=="utf-16-le" then
+ return utf16_to_utf8_le(str)
else
return str
end
@@ -4834,7 +5125,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-math"] = package.loaded["l-math"] or true
--- original size: 915, stripped down to: 836
+-- original size: 974, stripped down to: 890
if not modules then modules={} end modules ['l-math']={
version=1.001,
@@ -4844,6 +5135,9 @@ if not modules then modules={} end modules ['l-math']={
license="see context related readme files"
}
local floor,sin,cos,tan=math.floor,math.sin,math.cos,math.tan
+if not math.ceiling then
+ math.ceiling=math.ceil
+end
if not math.round then
function math.round(x) return floor(x+0.5) end
end
@@ -4871,7 +5165,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-str"] = package.loaded["util-str"] or true
--- original size: 33063, stripped down to: 18397
+-- original size: 34407, stripped down to: 18852
if not modules then modules={} end modules ['util-str']={
version=1.001,
@@ -5001,10 +5295,12 @@ local striplinepatterns={
["retain"]=p_retain_normal,
["retain and collapse"]=p_retain_collapse,
["retain and no empty"]=p_retain_noempty,
+ ["collapse"]=patterns.collapser,
}
+setmetatable(striplinepatterns,{ __index=function(t,k) return p_prune_collapse end })
strings.striplinepatterns=striplinepatterns
function strings.striplines(str,how)
- return str and lpegmatch(how and striplinepatterns[how] or p_prune_collapse,str) or str
+ return str and lpegmatch(striplinepatterns[how],str) or str
end
strings.striplong=strings.striplines
function strings.nice(str)
@@ -5044,10 +5340,10 @@ string.tracedchars=tracedchars
strings.tracers=tracedchars
function string.tracedchar(b)
if type(b)=="number" then
- return tracedchars[b] or (utfchar(b).." (U+"..format('%05X',b)..")")
+ return tracedchars[b] or (utfchar(b).." (U+"..format("%05X",b)..")")
else
local c=utfbyte(b)
- return tracedchars[c] or (b.." (U+"..format('%05X',c)..")")
+ return tracedchars[c] or (b.." (U+"..(c and format("%05X",c) or "?????")..")")
end
end
function number.signed(i)
@@ -5184,12 +5480,12 @@ local format_f=function(f)
n=n+1
return format("format('%%%sf',a%s)",f,n)
end
-local format_F=function(f)
+local format_F=function(f)
n=n+1
if not f or f=="" then
- return format("(((a%s > -0.0000000005 and a%s < 0.0000000005) and '0') or (a%s == 1 and '1') or format('%%.9f',a%s))",n,n,n,n)
+ return format("(((a%s > -0.0000000005 and a%s < 0.0000000005) and '0') or format((a%s %% 1 == 0) and '%%i' or '%%.9f',a%s))",n,n,n,n)
else
- return format("((a%s == 0 and '0') or (a%s == 1 and '1') or format('%%%sf',a%s))",n,n,f,n)
+ return format("format((a%s %% 1 == 0) and '%%i' or '%%%sf',a%s)",n,f,n)
end
end
local format_g=function(f)
@@ -5417,7 +5713,6 @@ local builder=Cs { "start",
+V("j")+V("J")
+V("m")+V("M")
+V("z")
-+V("*")
)+V("*")
)*(P(-1)+Carg(1))
)^0,
@@ -5461,6 +5756,7 @@ local builder=Cs { "start",
["a"]=(prefix_any*P("a"))/format_a,
["A"]=(prefix_any*P("A"))/format_A,
["*"]=Cs(((1-P("%"))^1+P("%%")/"%%")^1)/format_rest,
+ ["?"]=Cs(((1-P("%"))^1 )^1)/format_rest,
["!"]=Carg(2)*prefix_any*P("!")*C((1-P("!"))^1)*P("!")/format_extension,
}
local direct=Cs (
@@ -5535,6 +5831,15 @@ else
add(formatters,"tex",[[lpegmatch(texescape,%s)]],{ texescape=lpeg.patterns.texescape })
add(formatters,"lua",[[lpegmatch(luaescape,%s)]],{ luaescape=lpeg.patterns.luaescape })
end
+local dquote=patterns.dquote
+local equote=patterns.escaped+dquote/'\\"'+1
+local space=patterns.space
+local cquote=Cc('"')
+local pattern=Cs(dquote*(equote-P(-2))^0*dquote)
++Cs(cquote*(equote-space)^0*space*equote^0*cquote)
+function string.optionalquoted(str)
+ return lpegmatch(pattern,str) or str
+end
end -- of closure
@@ -5543,7 +5848,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tab"] = package.loaded["util-tab"] or true
--- original size: 23985, stripped down to: 16069
+-- original size: 24267, stripped down to: 16260
if not modules then modules={} end modules ['util-tab']={
version=1.001,
@@ -5633,6 +5938,15 @@ function tables.removevalue(t,value)
end
end
end
+function tables.replacevalue(t,oldvalue,newvalue)
+ if oldvalue and newvalue then
+ for i=1,#t do
+ if t[i]==oldvalue then
+ t[i]=newvalue
+ end
+ end
+ end
+end
function tables.insertbeforevalue(t,value,extra)
for i=1,#t do
if t[i]==extra then
@@ -6026,7 +6340,7 @@ function table.serialize(root,name,specification)
end
depth=depth+1
end
- if root and next(root) then
+ if root and next(root)~=nil then
local first=nil
local last=0
last=#root
@@ -6051,7 +6365,7 @@ function table.serialize(root,name,specification)
elseif tv=="string" then
n=n+1 t[n]=f_val_str(depth,v)
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
n=n+1 t[n]=f_val_not(depth)
else
local st=simple_table(v)
@@ -6081,7 +6395,7 @@ function table.serialize(root,name,specification)
n=n+1 t[n]=f_key_boo_value_str(depth,k,v)
end
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
if tk=="number" then
n=n+1 t[n]=f_key_num_value_not(depth,k,v)
elseif tk=="string" then
@@ -6139,7 +6453,7 @@ function table.serialize(root,name,specification)
local dummy=root._w_h_a_t_e_v_e_r_
root._w_h_a_t_e_v_e_r_=nil
end
- if next(root) then
+ if next(root)~=nil then
do_serialize(root,name,1,0)
end
end
@@ -6302,7 +6616,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-prs"] = package.loaded["util-prs"] or true
--- original size: 19618, stripped down to: 14012
+-- original size: 21751, stripped down to: 15108
if not modules then modules={} end modules ['util-prs']={
version=1.001,
@@ -6458,11 +6772,30 @@ function parsers.settings_to_array(str,strict)
return { str }
end
end
-local separator=space^0*comma*space^0
-local value=P(lbrace*C((nobrace+nestedbraces)^0)*rbrace)+C((nestedbraces+(1-(space^0*(comma+P(-1)))))^0)
-local withvalue=Carg(1)*value/function(f,s) return f(s) end
-local pattern_a=spaces*Ct(value*(separator*value)^0)
-local pattern_b=spaces*withvalue*(separator*withvalue)^0
+local cache_a={}
+local cache_b={}
+function parsers.groupedsplitat(symbol,withaction)
+ if not symbol then
+ symbol=","
+ end
+ local pattern=(withaction and cache_b or cache_a)[symbol]
+ if not pattern then
+ local symbols=S(symbol)
+ local separator=space^0*symbols*space^0
+ local value=P(lbrace*C((nobrace+nestedbraces)^0)*rbrace)+C((nestedbraces+(1-(space^0*(symbols+P(-1)))))^0)
+ if withaction then
+ local withvalue=Carg(1)*value/function(f,s) return f(s) end
+ pattern=spaces*withvalue*(separator*withvalue)^0
+ cache_b[symbol]=pattern
+ else
+ pattern=spaces*Ct(value*(separator*value)^0)
+ cache_a[symbol]=pattern
+ end
+ end
+ return pattern
+end
+local pattern_a=parsers.groupedsplitat(",",false)
+local pattern_b=parsers.groupedsplitat(",",true)
function parsers.stripped_settings_to_array(str)
if not str or str=="" then
return {}
@@ -6524,12 +6857,9 @@ function parsers.array_to_string(a,separator)
return ""
end
end
-function parsers.settings_to_set(str,t)
- t=t or {}
- for s in gmatch(str,"[^, ]+") do
- t[s]=true
- end
- return t
+local pattern=Cf(Ct("")*Cg(C((1-S(", "))^1)*S(", ")^0*Cc(true))^1,rawset)
+function utilities.parsers.settings_to_set(str,t)
+ return str and lpegmatch(pattern,str) or {}
end
function parsers.simple_hash_to_string(h,separator)
local t,tn={},0
@@ -6541,12 +6871,16 @@ function parsers.simple_hash_to_string(h,separator)
end
return concat(t,separator or ",")
end
-local str=C((1-whitespace-equal)^1)
+local str=Cs(lpegpatterns.unquoted)+C((1-whitespace-equal)^1)
local setting=Cf(Carg(1)*(whitespace^0*Cg(str*whitespace^0*(equal*whitespace^0*str+Cc(""))))^1,rawset)
local splitter=setting^1
function utilities.parsers.options_to_hash(str,target)
return str and lpegmatch(splitter,str,1,target or {}) or {}
end
+local splitter=lpeg.tsplitat(" ")
+function utilities.parsers.options_to_array(str)
+ return str and lpegmatch(splitter,str) or {}
+end
local value=P(lbrace*C((nobrace+nestedbraces)^0)*rbrace)+C(digit^1*lparent*(noparent+nestedparents)^1*rparent)+C((nestedbraces+(1-comma))^1)
local pattern_a=spaces*Ct(value*(separator*value)^0)
local function repeater(n,str)
@@ -6668,7 +7002,7 @@ function parsers.rfc4180splitter(specification)
local field=escaped+non_escaped+Cc("")
local record=Ct(field*(separator*field)^1)
local headerline=record*Cp()
- local wholeblob=Ct((newline^-1*record)^0)
+ local wholeblob=Ct((newline^(specification.strict and -1 or 1)*record)^0)
return function(data,getheader)
if getheader then
local header,position=lpegmatch(headerline,data)
@@ -6705,13 +7039,13 @@ function parsers.stepper(str,n,action)
lpegmatch(stepper,str,1,n,action or print)
end
end
-local pattern_math=Cs((P("%")/"\\percent "+P("^")*Cc("{")*lpegpatterns.integer*Cc("}")+P(1))^0)
-local pattern_text=Cs((P("%")/"\\percent "+(P("^")/"\\high")*Cc("{")*lpegpatterns.integer*Cc("}")+P(1))^0)
+local pattern_math=Cs((P("%")/"\\percent "+P("^")*Cc("{")*lpegpatterns.integer*Cc("}")+anything)^0)
+local pattern_text=Cs((P("%")/"\\percent "+(P("^")/"\\high")*Cc("{")*lpegpatterns.integer*Cc("}")+anything)^0)
patterns.unittotex=pattern
function parsers.unittotex(str,textmode)
return lpegmatch(textmode and pattern_text or pattern_math,str)
end
-local pattern=Cs((P("^")/"<sup>"*lpegpatterns.integer*Cc("</sup>")+P(1))^0)
+local pattern=Cs((P("^")/"<sup>"*lpegpatterns.integer*Cc("</sup>")+anything)^0)
function parsers.unittoxml(str)
return lpegmatch(pattern,str)
end
@@ -6783,6 +7117,18 @@ function utilities.parsers.runtime(time)
local seconds=mod(time,60)
return days,hours,minutes,seconds
end
+local spacing=whitespace^0
+local apply=P("->")
+local method=C((1-apply)^1)
+local token=lbrace*C((1-rbrace)^1)*rbrace+C(anything^1)
+local pattern=spacing*(method*spacing*apply+Carg(1))*spacing*token
+function utilities.parsers.splitmethod(str,default)
+ if str then
+ return lpegmatch(pattern,str,1,default or false)
+ else
+ return default or false,""
+ end
+end
end -- of closure
@@ -6872,7 +7218,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-set"] = package.loaded["trac-set"] or true
--- original size: 12365, stripped down to: 8799
+-- original size: 12482, stripped down to: 8864
if not modules then modules={} end modules ['trac-set']={
version=1.001,
@@ -6900,7 +7246,7 @@ function setters.initialize(filename,name,values)
local data=setter.data
if data then
for key,newvalue in next,values do
- local newvalue=is_boolean(newvalue,newvalue)
+ local newvalue=is_boolean(newvalue,newvalue,true)
local functions=data[key]
if functions then
local oldvalue=functions.value
@@ -6954,7 +7300,7 @@ local function set(t,what,newvalue)
elseif not value then
value=false
else
- value=is_boolean(value,value)
+ value=is_boolean(value,value,true)
end
w=topattern(w,true,true)
for name,functions in next,data do
@@ -7093,6 +7439,7 @@ function setters.new(name)
report=function(...) setters.report (setter,...) end,
enable=function(...) enable (setter,...) end,
disable=function(...) disable (setter,...) end,
+ reset=function(...) reset (setter,...) end,
register=function(...) register(setter,...) end,
list=function(...) list (setter,...) end,
show=function(...) show (setter,...) end,
@@ -7184,7 +7531,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-log"] = package.loaded["trac-log"] or true
--- original size: 25613, stripped down to: 16617
+-- original size: 29359, stripped down to: 20483
if not modules then modules={} end modules ['trac-log']={
version=1.001,
@@ -7193,15 +7540,18 @@ if not modules then modules={} end modules ['trac-log']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local next,type,select,print=next,type,select,print
local write_nl,write=texio and texio.write_nl or print,texio and texio.write or io.write
local format,gmatch,find=string.format,string.gmatch,string.find
local concat,insert,remove=table.concat,table.insert,table.remove
local topattern=string.topattern
-local next,type,select=next,type,select
local utfchar=utf.char
+local datetime=os.date
+local openfile=io.open
local setmetatableindex=table.setmetatableindex
local formatters=string.formatters
local texgetcount=tex and tex.getcount
+local variant="default"
logs=logs or {}
local logs=logs
local moreinfo=[[
@@ -7211,32 +7561,122 @@ 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
]]
-utilities.strings.formatters.add (
+formatters.add (
formatters,"unichr",
[["U+" .. format("%%05X",%s) .. " (" .. utfchar(%s) .. ")"]]
)
-utilities.strings.formatters.add (
+formatters.add (
formatters,"chruni",
[[utfchar(%s) .. " (U+" .. format("%%05X",%s) .. ")"]]
)
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,setlogfile,settimedlog,setprocessor,setformatters
+local direct,subdirect,writer,pushtarget,poptarget,setlogfile,settimedlog,setprocessor,setformatters,newline
if tex and (tex.jobname or tex.formatname) then
- local valueiskey={ __index=function(t,k) t[k]=k return k end }
- local target="term and log"
+ local function useluawrites()
+ local texio_write_nl=texio.write_nl
+ local texio_write=texio.write
+ local io_write=io.write
+ write_nl=function(target,...)
+ if not io_write then
+ io_write=io.write
+ end
+ if target=="term and log" then
+ texio_write_nl("log",...)
+ texio_write_nl("term","")
+ io_write(...)
+ elseif target=="log" then
+ texio_write_nl("log",...)
+ elseif target=="term" then
+ texio_write_nl("term","")
+ io_write(...)
+ elseif target~="none" then
+ texio_write_nl("log",target,...)
+ texio_write_nl("term","")
+ io_write(target,...)
+ end
+ end
+ write=function(target,...)
+ if not io_write then
+ io_write=io.write
+ end
+ if target=="term and log" then
+ texio_write("log",...)
+ io_write(...)
+ elseif target=="log" then
+ texio_write("log",...)
+ elseif target=="term" then
+ io_write(...)
+ elseif target~="none" then
+ texio_write("log",target,...)
+ io_write(target,...)
+ end
+ end
+ texio.write=write
+ texio.write_nl=write_nl
+ useluawrites=ignore
+ end
+ local whereto="both"
+ local target=nil
+ local targets=nil
+ local formats=table.setmetatableindex("self")
+ local translations=table.setmetatableindex("self")
+ local report_yes,subreport_yes,direct_yes,subdirect_yes,status_yes
+ local report_nop,subreport_nop,direct_nop,subdirect_nop,status_nop
+ local variants={
+ default={
+ formats={
+ report_yes=formatters["%-15s > %s\n"],
+ report_nop=formatters["%-15s >\n"],
+ direct_yes=formatters["%-15s > %s"],
+ direct_nop=formatters["%-15s >"],
+ subreport_yes=formatters["%-15s > %s > %s\n"],
+ subreport_nop=formatters["%-15s > %s >\n"],
+ subdirect_yes=formatters["%-15s > %s > %s"],
+ subdirect_nop=formatters["%-15s > %s >"],
+ status_yes=formatters["%-15s : %s\n"],
+ status_nop=formatters["%-15s :\n"],
+ },
+ targets={
+ logfile="log",
+ log="log",
+ file="log",
+ console="term",
+ terminal="term",
+ both="term and log",
+ },
+ },
+ ansi={
+ formats={
+ report_yes=formatters["%-15s > %s\n"],
+ report_nop=formatters["%-15s >\n"],
+ direct_yes=formatters["%-15s > %s"],
+ direct_nop=formatters["%-15s >"],
+ subreport_yes=formatters["%-15s > %s > %s\n"],
+ subreport_nop=formatters["%-15s > %s >\n"],
+ subdirect_yes=formatters["%-15s > %s > %s"],
+ subdirect_nop=formatters["%-15s > %s >"],
+ status_yes=formatters["%-15s : %s\n"],
+ status_nop=formatters["%-15s :\n"],
+ },
+ targets={
+ logfile="none",
+ log="none",
+ file="none",
+ console="term",
+ terminal="term",
+ both="term",
+ },
+ }
+ }
logs.flush=io.flush
- local formats={} setmetatable(formats,valueiskey)
- local translations={} setmetatable(translations,valueiskey)
writer=function(...)
write_nl(target,...)
end
newline=function()
write_nl(target,"\n")
end
- local report_yes=formatters["%-15s > %s\n"]
- local report_nop=formatters["%-15s >\n"]
report=function(a,b,c,...)
if c then
write_nl(target,report_yes(translations[a],formatters[formats[b]](c,...)))
@@ -7248,8 +7688,6 @@ if tex and (tex.jobname or tex.formatname) then
write_nl(target,"\n")
end
end
- local direct_yes=formatters["%-15s > %s"]
- local direct_nop=formatters["%-15s >"]
direct=function(a,b,c,...)
if c then
return direct_yes(translations[a],formatters[formats[b]](c,...))
@@ -7261,8 +7699,6 @@ if tex and (tex.jobname or tex.formatname) then
return ""
end
end
- local subreport_yes=formatters["%-15s > %s > %s\n"]
- local subreport_nop=formatters["%-15s > %s >\n"]
subreport=function(a,s,b,c,...)
if c then
write_nl(target,subreport_yes(translations[a],translations[s],formatters[formats[b]](c,...)))
@@ -7274,8 +7710,6 @@ if tex and (tex.jobname or tex.formatname) then
write_nl(target,"\n")
end
end
- local subdirect_yes=formatters["%-15s > %s > %s"]
- local subdirect_nop=formatters["%-15s > %s >"]
subdirect=function(a,s,b,c,...)
if c then
return subdirect_yes(translations[a],translations[s],formatters[formats[b]](c,...))
@@ -7287,8 +7721,6 @@ if tex and (tex.jobname or tex.formatname) then
return ""
end
end
- local status_yes=formatters["%-15s : %s\n"]
- local status_nop=formatters["%-15s :\n"]
status=function(a,b,c,...)
if c then
write_nl(target,status_yes(translations[a],formatters[formats[b]](c,...)))
@@ -7300,16 +7732,13 @@ if tex and (tex.jobname or tex.formatname) then
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
+ settarget=function(askedwhereto)
+ whereto=askedwhereto or whereto or "both"
+ target=targets[whereto]
+ if not target then
+ whereto="both"
+ target=targets[whereto]
+ end
if target=="term" or target=="term and log" then
logs.flush=io.flush
else
@@ -7338,21 +7767,74 @@ if tex and (tex.jobname or tex.formatname) then
writeline(target,f(...))
end
end
- setformatters=function(f)
- report_yes=f.report_yes or report_yes
- report_nop=f.report_nop or report_nop
- subreport_yes=f.subreport_yes or subreport_yes
- subreport_nop=f.subreport_nop or subreport_nop
- direct_yes=f.direct_yes or direct_yes
- direct_nop=f.direct_nop or direct_nop
- subdirect_yes=f.subdirect_yes or subdirect_yes
- subdirect_nop=f.subdirect_nop or subdirect_nop
- status_yes=f.status_yes or status_yes
- status_nop=f.status_nop or status_nop
- end
+ setformatters=function(specification)
+ local t=nil
+ local f=nil
+ local d=variants.default
+ if not specification then
+ elseif type(specification)=="table" then
+ t=specification.targets
+ f=specification.formats or specification
+ else
+ local v=variants[specification]
+ if v then
+ t=v.targets
+ f=v.formats
+ variant=specification
+ end
+ end
+ targets=t or d.targets
+ target=targets[whereto] or target
+ if f then
+ d=d.formats
+ else
+ f=d.formats
+ d=f
+ end
+ setmetatableindex(f,d)
+ report_yes=f.report_yes
+ report_nop=f.report_nop
+ subreport_yes=f.subreport_yes
+ subreport_nop=f.subreport_nop
+ direct_yes=f.direct_yes
+ direct_nop=f.direct_nop
+ subdirect_yes=f.subdirect_yes
+ subdirect_nop=f.subdirect_nop
+ status_yes=f.status_yes
+ status_nop=f.status_nop
+ if variant=="ansi" then
+ useluawrites()
+ end
+ settarget(whereto)
+ end
+ setformatters(variant)
setlogfile=ignore
settimedlog=ignore
else
+ local report_yes,subreport_yes,status_yes
+ local report_nop,subreport_nop,status_nop
+ local variants={
+ default={
+ formats={
+ report_yes=formatters["%-15s | %s"],
+ report_nop=formatters["%-15s |"],
+ subreport_yes=formatters["%-15s | %s | %s"],
+ subreport_nop=formatters["%-15s | %s |"],
+ status_yes=formatters["%-15s : %s\n"],
+ status_nop=formatters["%-15s :\n"],
+ },
+ },
+ ansi={
+ formats={
+ report_yes=formatters["%-15s | %s"],
+ report_nop=formatters["%-15s |"],
+ subreport_yes=formatters["%-15s | %s | %s"],
+ subreport_nop=formatters["%-15s | %s |"],
+ status_yes=formatters["%-15s : %s\n"],
+ status_nop=formatters["%-15s :\n"],
+ },
+ },
+ }
logs.flush=ignore
writer=function(s)
write_nl(s)
@@ -7360,8 +7842,6 @@ else
newline=function()
write_nl("\n")
end
- local report_yes=formatters["%-15s | %s"]
- local report_nop=formatters["%-15s |"]
report=function(a,b,c,...)
if c then
write_nl(report_yes(a,formatters[b](c,...)))
@@ -7373,8 +7853,6 @@ else
write_nl("")
end
end
- local subreport_yes=formatters["%-15s | %s | %s"]
- local subreport_nop=formatters["%-15s | %s |"]
subreport=function(a,sub,b,c,...)
if c then
write_nl(subreport_yes(a,sub,formatters[b](c,...)))
@@ -7386,8 +7864,6 @@ else
write_nl("")
end
end
- local status_yes=formatters["%-15s : %s\n"]
- local status_nop=formatters["%-15s :\n"]
status=function(a,b,c,...)
if c then
write_nl(status_yes(a,formatters[b](c,...)))
@@ -7412,14 +7888,34 @@ else
writeline(f(s))
end
end
- setformatters=function(f)
- report_yes=f.report_yes or report_yes
- report_nop=f.report_nop or report_nop
- subreport_yes=f.subreport_yes or subreport_yes
- subreport_nop=f.subreport_nop or subreport_nop
- status_yes=f.status_yes or status_yes
- status_nop=f.status_nop or status_nop
- end
+ setformatters=function(specification)
+ local f=nil
+ local d=variants.default
+ if specification then
+ if type(specification)=="table" then
+ f=specification.formats or specification
+ else
+ local v=variants[specification]
+ if v then
+ f=v.formats
+ end
+ end
+ end
+ if f then
+ d=d.formats
+ else
+ f=d.formats
+ d=f
+ end
+ setmetatableindex(f,d)
+ report_yes=f.report_yes
+ report_nop=f.report_nop
+ subreport_yes=f.subreport_yes
+ subreport_nop=f.subreport_nop
+ status_yes=f.status_yes
+ status_nop=f.status_nop
+ end
+ setformatters(variant)
setlogfile=function(name,keepopen)
if name and name~="" then
local localtime=os.localtime
@@ -7672,13 +8168,13 @@ end
local simple=logs.reporter("comment")
logs.simple=simple
logs.simpleline=simple
-function logs.setprogram () end
-function logs.extendbanner() end
-function logs.reportlines () end
-function logs.reportbanner() end
-function logs.reportline () end
-function logs.simplelines () end
-function logs.help () end
+logs.setprogram=ignore
+logs.extendbanner=ignore
+logs.reportlines=ignore
+logs.reportbanner=ignore
+logs.reportline=ignore
+logs.simplelines=ignore
+logs.help=ignore
local Carg,C,lpegmatch=lpeg.Carg,lpeg.C,lpeg.match
local p_newline=lpeg.patterns.newline
local linewise=(
@@ -7755,10 +8251,11 @@ function logs.application(t)
end
return t
end
-function logs.system(whereto,process,jobname,category,...)
- local message=formatters["%s %s => %s => %s => %s\r"](os.date("%d/%m/%y %H:%m:%S"),process,jobname,category,format(...))
+local f_syslog=formatters["%s %s => %s => %s => %s\r"]
+function logs.system(whereto,process,jobname,category,fmt,arg,...)
+ local message=f_syslog(datetime("%d/%m/%y %H:%m:%S"),process,jobname,category,arg==nil and fmt or format(fmt,arg,...))
for i=1,10 do
- local f=io.open(whereto,"a")
+ local f=openfile(whereto,"a")
if f then
f:write(message)
f:close()
@@ -7820,7 +8317,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-inf"] = package.loaded["trac-inf"] or true
--- original size: 7011, stripped down to: 5590
+-- original size: 6704, stripped down to: 5343
if not modules then modules={} end modules ['trac-inf']={
version=1.001,
@@ -7993,15 +8490,6 @@ function statistics.tracefunction(base,tag,...)
statistics.register(formatters["%s.%s"](tag,name),function() return serialize(stat,"calls") end)
end
end
-commands=commands or {}
-function commands.resettimer(name)
- resettiming(name or "whatever")
- starttiming(name or "whatever")
-end
-function commands.elapsedtime(name)
- stoptiming(name or "whatever")
- context(elapsedtime(name or "whatever"))
-end
end -- of closure
@@ -8568,7 +9056,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tpl"] = package.loaded["util-tpl"] or true
--- original size: 6251, stripped down to: 3488
+-- original size: 7100, stripped down to: 3978
if not modules then modules={} end modules ['util-tpl']={
version=1.001,
@@ -8610,7 +9098,7 @@ local sqlescape=lpeg.replacer {
{ "\r\n","\\n" },
{ "\r","\\n" },
}
-local sqlquoted=lpeg.Cs(lpeg.Cc("'")*sqlescape*lpeg.Cc("'"))
+local sqlquoted=Cs(Cc("'")*sqlescape*Cc("'"))
lpegpatterns.sqlescape=sqlescape
lpegpatterns.sqlquoted=sqlquoted
local luaescape=lpegpatterns.luaescape
@@ -8633,12 +9121,24 @@ local quotedescapers={
local luaescaper=escapers.lua
local quotedluaescaper=quotedescapers.lua
local function replacekeyunquoted(s,t,how,recurse)
- local escaper=how and escapers[how] or luaescaper
- return escaper(replacekey(s,t,how,recurse))
+ if how==false then
+ return replacekey(s,t,how,recurse)
+ else
+ local escaper=how and escapers[how] or luaescaper
+ return escaper(replacekey(s,t,how,recurse))
+ end
end
local function replacekeyquoted(s,t,how,recurse)
- local escaper=how and quotedescapers[how] or quotedluaescaper
- return escaper(replacekey(s,t,how,recurse))
+ if how==false then
+ return replacekey(s,t,how,recurse)
+ else
+ local escaper=how and quotedescapers[how] or quotedluaescaper
+ return escaper(replacekey(s,t,how,recurse))
+ end
+end
+local function replaceoptional(l,m,r,t,how,recurse)
+ local v=t[l]
+ return v and v~="" and lpegmatch(replacer,r,1,t,how or "lua",recurse or false) or ""
end
local single=P("%")
local double=P("%%")
@@ -8653,11 +9153,16 @@ local nolquoted=lquoted/''
local norquoted=rquoted/''
local nolquotedq=lquotedq/''
local norquotedq=rquotedq/''
-local key=nosingle*((C((1-nosingle )^1)*Carg(1)*Carg(2)*Carg(3))/replacekey )*nosingle
-local quoted=nolquotedq*((C((1-norquotedq)^1)*Carg(1)*Carg(2)*Carg(3))/replacekeyquoted )*norquotedq
-local unquoted=nolquoted*((C((1-norquoted )^1)*Carg(1)*Carg(2)*Carg(3))/replacekeyunquoted)*norquoted
+local noloptional=P("%?")/''
+local noroptional=P("?%")/''
+local nomoptional=P(":")/''
+local args=Carg(1)*Carg(2)*Carg(3)
+local key=nosingle*((C((1-nosingle )^1)*args)/replacekey )*nosingle
+local quoted=nolquotedq*((C((1-norquotedq )^1)*args)/replacekeyquoted )*norquotedq
+local unquoted=nolquoted*((C((1-norquoted )^1)*args)/replacekeyunquoted)*norquoted
+local optional=noloptional*((C((1-nomoptional)^1)*nomoptional*C((1-noroptional)^1)*args)/replaceoptional)*noroptional
local any=P(1)
- replacer=Cs((unquoted+quoted+escape+key+any)^0)
+ replacer=Cs((unquoted+quoted+escape+optional+key+any)^0)
local function replace(str,mapping,how,recurse)
if mapping and str then
return lpegmatch(replacer,str,1,mapping,how or "lua",recurse or false) or str
@@ -8696,7 +9201,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-env"] = package.loaded["util-env"] or true
--- original size: 8814, stripped down to: 5092
+-- original size: 8022, stripped down to: 5038
if not modules then modules={} end modules ['util-env']={
version=1.001,
@@ -8707,7 +9212,7 @@ if not modules then modules={} end modules ['util-env']={
}
local allocate,mark=utilities.storage.allocate,utilities.storage.mark
local format,sub,match,gsub,find=string.format,string.sub,string.match,string.gsub,string.find
-local unquoted,quoted=string.unquoted,string.quoted
+local unquoted,quoted,optionalquoted=string.unquoted,string.quoted,string.optionalquoted
local concat,insert,remove=table.concat,table.insert,table.remove
environment=environment or {}
local environment=environment
@@ -8820,24 +9325,14 @@ function environment.splitarguments(separator)
return before,after
end
function environment.reconstructcommandline(arg,noquote)
+ local resolveprefix=resolvers.resolve
arg=arg or environment.originalarguments
if noquote and #arg==1 then
- local a=arg[1]
- a=resolvers.resolve(a)
- a=unquoted(a)
- return a
+ return unquoted(resolveprefix and resolveprefix(arg[1]) or arg[1])
elseif #arg>0 then
local result={}
for i=1,#arg do
- local a=arg[i]
- a=resolvers.resolve(a)
- a=unquoted(a)
- a=gsub(a,'"','\\"')
- if find(a," ",1,true) then
- result[#result+1]=quoted(a)
- else
- result[#result+1]=a
- end
+ result[i]=optionalquoted(resolveprefix and resolveprefix(arg[i]) or resolveprefix)
end
return concat(result," ")
else
@@ -9046,7 +9541,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-tab"] = package.loaded["lxml-tab"] or true
--- original size: 42614, stripped down to: 26694
+-- original size: 43882, stripped down to: 26870
if not modules then modules={} end modules ['lxml-tab']={
version=1.001,
@@ -9061,10 +9556,10 @@ if lpeg.setmaxstack then lpeg.setmaxstack(1000) end
xml=xml or {}
local xml=xml
local concat,remove,insert=table.concat,table.remove,table.insert
-local type,next,setmetatable,getmetatable,tonumber=type,next,setmetatable,getmetatable,tonumber
+local type,next,setmetatable,getmetatable,tonumber,rawset=type,next,setmetatable,getmetatable,tonumber,rawset
local lower,find,match,gsub=string.lower,string.find,string.match,string.gsub
local utfchar=utf.char
-local lpegmatch=lpeg.match
+local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns
local P,S,R,C,V,C,Cs=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.V,lpeg.C,lpeg.Cs
local formatters=string.formatters
xml.xmlns=xml.xmlns or {}
@@ -9226,9 +9721,10 @@ local function fromdec(s)
return formatters["d:%s"](s),true
end
end
-local rest=(1-P(";"))^0
-local many=P(1)^0
-local parsedentity=P("&")*(P("#x")*(rest/fromhex)+P("#")*(rest/fromdec))*P(";")*P(-1)+(P("#x")*(many/fromhex)+P("#")*(many/fromdec))
+local p_rest=(1-P(";"))^0
+local p_many=P(1)^0
+local p_char=lpegpatterns.utf8character
+local parsedentity=P("&")*(P("#x")*(p_rest/fromhex)+P("#")*(p_rest/fromdec))*P(";")*P(-1)+(P("#x")*(p_many/fromhex)+P("#")*(p_many/fromdec))
local predefined_unified={
[38]="&amp;",
[42]="&quot;",
@@ -9254,7 +9750,9 @@ local privates_u={
local privates_p={}
local privates_n={
}
-local escaped=utf.remapper(privates_u)
+local escaped=utf.remapper(privates_u,"dynamic")
+local unprivatized=utf.remapper(privates_p,"dynamic")
+xml.unprivatized=unprivatized
local function unescaped(s)
local p=privates_n[s]
if not p then
@@ -9267,9 +9765,7 @@ local function unescaped(s)
end
return p
end
-local unprivatized=utf.remapper(privates_p)
xml.privatetoken=unescaped
-xml.unprivatized=unprivatized
xml.privatecodes=privates_n
local function handle_hex_entity(str)
local h=hcache[str]
@@ -9422,7 +9918,7 @@ local valid=R('az','AZ','09')+S('_-.')
local name_yes=C(valid^1)*colon*C(valid^1)
local name_nop=C(P(true))*C(valid^1)
local name=name_yes+name_nop
-local utfbom=lpeg.patterns.utfbom
+local utfbom=lpegpatterns.utfbom
local spacing=C(space^0)
local anyentitycontent=(1-open-semicolon-space-close)^0
local hexentitycontent=R("AF","af","09")^0
@@ -9590,7 +10086,7 @@ local function _xmlconvert_(data,settings)
reported_attribute_errors,mt,errorhandler=nil,nil,nil
return result
end
-function xmlconvert(data,settings)
+local function xmlconvert(data,settings)
local ok,result=pcall(function() return _xmlconvert_(data,settings) end)
if ok then
return result
@@ -9682,14 +10178,17 @@ function xml.checkbom(root)
insert(dt,2,"\n" )
end
end
-local function verbose_element(e,handlers)
+local f_attribute=formatters['%s=%q']
+local function verbose_element(e,handlers,escape)
local handle=handlers.handle
local serialize=handlers.serialize
local ens,etg,eat,edt,ern=e.ns,e.tg,e.at,e.dt,e.rn
local ats=eat and next(eat) and {}
if ats then
+ local n=0
for k,v in next,eat do
- ats[#ats+1]=formatters['%s=%q'](k,escaped(v))
+ n=n+1
+ ats[n]=f_attribute(k,escaped(v))
end
end
if ern and trace_entities and ern~=ens then
@@ -10033,7 +10532,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-lpt"] = package.loaded["lxml-lpt"] or true
--- original size: 48030, stripped down to: 30595
+-- original size: 48229, stripped down to: 30684
if not modules then modules={} end modules ['lxml-lpt']={
version=1.001,
@@ -10418,8 +10917,8 @@ 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")+S("-_:"))^1)*Cc("'])")
-lp_fastpos_p=P("+")^0*R("09")^1*P(-1)/"l==%0"
-lp_fastpos_n=P("-")*R("09")^1*P(-1)/"(%0<0 and (#list+%0==l))"
+local lp_fastpos_p=P("+")^0*R("09")^1*P(-1)/"l==%0"
+local lp_fastpos_n=P("-")*R("09")^1*P(-1)/"(%0<0 and (#list+%0==l))"
local lp_fastpos=lp_fastpos_n+lp_fastpos_p
local lp_reserved=C("and")+C("or")+C("not")+C("div")+C("mod")+C("true")+C("false")
local lp_lua_function=Cs((R("az","AZ","__")^1*(P(".")*R("az","AZ","__")^1)^1)*("("))/"%0"
@@ -10598,7 +11097,7 @@ local function nodesettostring(set,nodetest)
if not ns or ns=="" then ns="*" end
if not tg or tg=="" then tg="*" end
tg=(tg=="@rt@" and "[root]") or format("%s:%s",ns,tg)
- t[i]=(directive and tg) or format("not(%s)",tg)
+ t[#t+1]=(directive and tg) or format("not(%s)",tg)
end
if nodetest==false then
return format("not(%s)",concat(t,"|"))
@@ -10864,7 +11363,6 @@ expressions.print=function(...)
print(...)
return true
end
-expressions.contains=find
expressions.find=find
expressions.upper=upper
expressions.lower=lower
@@ -10886,6 +11384,9 @@ function expressions.contains(str,pattern)
end
return false
end
+function xml.expressions.idstring(str)
+ return type(str)=="string" and gsub(str,"^#","") or ""
+end
local function traverse(root,pattern,handle)
local collected=applylpath(root,pattern)
if collected then
@@ -11173,7 +11674,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-aux"] = package.loaded["lxml-aux"] or true
--- original size: 23804, stripped down to: 16817
+-- original size: 28225, stripped down to: 20125
if not modules then modules={} end modules ['lxml-aux']={
version=1.001,
@@ -11183,16 +11684,19 @@ if not modules then modules={} end modules ['lxml-aux']={
license="see context related readme files"
}
local trace_manipulations=false trackers.register("lxml.manipulations",function(v) trace_manipulations=v end)
+local trace_inclusions=false trackers.register("lxml.inclusions",function(v) trace_inclusions=v end)
local report_xml=logs.reporter("xml")
local xml=xml
-local xmlconvert,xmlcopy,xmlname=xml.convert,xml.copy,xml.name
+local xmlcopy,xmlname=xml.copy,xml.name
local xmlinheritedconvert=xml.inheritedconvert
local xmlapplylpath=xml.applylpath
local xmlfilter=xml.filter
-local type,setmetatable,getmetatable=type,setmetatable,getmetatable
+local type,next,setmetatable,getmetatable=type,next,setmetatable,getmetatable
local insert,remove,fastcopy,concat=table.insert,table.remove,table.fastcopy,table.concat
local gmatch,gsub,format,find,strip=string.gmatch,string.gsub,string.format,string.find,string.strip
local utfbyte=utf.byte
+local lpegmatch=lpeg.match
+local striplinepatterns=utilities.strings.striplinepatterns
local function report(what,pattern,c,e)
report_xml("%s element %a, root %a, position %a, index %a, pattern %a",what,xmlname(e),xmlname(e.__p__),c,e.ni,pattern)
end
@@ -11247,13 +11751,15 @@ end
function xml.each(root,pattern,handle,reverse)
local collected=xmlapplylpath(root,pattern)
if collected then
- if reverse then
- for c=#collected,1,-1 do
- handle(collected[c])
- end
- else
- for c=1,#collected do
- handle(collected[c])
+ if handle then
+ if reverse then
+ for c=#collected,1,-1 do
+ handle(collected[c])
+ end
+ else
+ for c=1,#collected do
+ handle(collected[c])
+ end
end
end
return collected
@@ -11309,6 +11815,7 @@ local function redo_ni(d)
end
end
end
+xml.reindex=redo_ni
local function xmltoelement(whatever,root)
if not whatever then
return nil
@@ -11360,8 +11867,16 @@ function xml.delete(root,pattern)
report('deleting',pattern,c,e)
end
local d=p.dt
- remove(d,e.ni)
- redo_ni(d)
+ local ni=e.ni
+ if ni<=#d then
+ if false then
+ p.dt[ni]=""
+ else
+ remove(d,ni)
+ redo_ni(d)
+ end
+ else
+ end
end
end
end
@@ -11481,28 +11996,40 @@ 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)
+local function include(xmldata,pattern,attribute,recursive,loaddata,level)
pattern=pattern or 'include'
loaddata=loaddata or io.loaddata
local collected=xmlapplylpath(xmldata,pattern)
if collected then
+ if not level then
+ level=1
+ end
for c=1,#collected do
local ek=collected[c]
local name=nil
local ekdt=ek.dt
local ekat=ek.at
- local epdt=ek.__p__.dt
+ local ekrt=ek.__p__
+ local epdt=ekrt.dt
if not attribute or attribute=="" then
name=(type(ekdt)=="table" and ekdt[1]) or ekdt
end
if not name then
for a in gmatch(attribute or "href","([^|]+)") do
name=ekat[a]
- if name then break end
+ if name then
+ break
+ end
+ end
+ end
+ local data=nil
+ if name and name~="" then
+ data=loaddata(name) or ""
+ if trace_inclusions then
+ report_xml("including %s bytes from %a at level %s by pattern %a and attribute %a (%srecursing)",#data,name,level,pattern,attribute or "",recursive and "" or "not ")
end
end
- local data=(name and name~="" and loaddata(name)) or ""
- if data=="" then
+ if not data or data=="" then
epdt[ek.ni]=""
elseif ekat["parse"]=="text" then
epdt[ek.ni]=xml.escaped(data)
@@ -11512,70 +12039,113 @@ local function include(xmldata,pattern,attribute,recursive,loaddata)
epdt[ek.ni]=""
else
if recursive then
- include(xi,pattern,attribute,recursive,loaddata)
+ include(xi,pattern,attribute,recursive,loaddata,level+1)
+ end
+ local child=xml.body(xi)
+ child.__p__=ekrt
+ child.__f__=name
+ epdt[ek.ni]=child
+ local inclusions=xmldata.settings.inclusions
+ if inclusions then
+ inclusions[#inclusions+1]=name
+ else
+ xmldata.settings.inclusions={ name }
end
- epdt[ek.ni]=xml.body(xi)
end
end
end
end
end
xml.include=include
+function xml.inclusion(e,default)
+ while e do
+ local f=e.__f__
+ if f then
+ return f
+ else
+ e=e.__p__
+ end
+ end
+ return default
+end
+function xml.inclusions(e,sorted)
+ while e do
+ local settings=e.settings
+ if settings then
+ local inclusions=settings.inclusions
+ if inclusions then
+ inclusions=table.unique(inclusions)
+ if sorted then
+ table.sort(inclusions)
+ end
+ return inclusions
+ else
+ e=e.__p__
+ end
+ else
+ e=e.__p__
+ end
+ end
+end
+local b_collapser=lpeg.patterns.b_collapser
+local m_collapser=lpeg.patterns.m_collapser
+local e_collapser=lpeg.patterns.e_collapser
+local b_stripper=lpeg.patterns.b_stripper
+local m_stripper=lpeg.patterns.m_stripper
+local e_stripper=lpeg.patterns.e_stripper
+local lpegmatch=lpeg.match
local function stripelement(e,nolines,anywhere)
local edt=e.dt
if edt then
- if anywhere then
- local t,n={},0
- for e=1,#edt do
+ local n=#edt
+ if n==0 then
+ return e
+ elseif anywhere then
+ local t={}
+ local m=0
+ for e=1,n do
local str=edt[e]
if type(str)~="string" then
- n=n+1
- t[n]=str
+ m=m+1
+ t[m]=str
elseif str~="" then
if nolines then
- str=gsub(str,"%s+"," ")
+ str=lpegmatch((n==1 and b_collapser) or (n==m and e_collapser) or m_collapser,str)
+ else
+ str=lpegmatch((n==1 and b_stripper) or (n==m and e_stripper) or m_stripper,str)
end
- str=gsub(str,"^%s*(.-)%s*$","%1")
if str~="" then
- n=n+1
- t[n]=str
+ m=m+1
+ t[m]=str
end
end
end
e.dt=t
else
- if #edt>0 then
- local str=edt[1]
- if type(str)~="string" then
- elseif str=="" then
+ local str=edt[1]
+ if type(str)=="string" then
+ if str~="" then
+ str=lpegmatch(nolines and b_collapser or b_stripper,str)
+ end
+ if str=="" then
remove(edt,1)
+ n=n-1
else
- if nolines then
- str=gsub(str,"%s+"," ")
- end
- str=gsub(str,"^%s+","")
- if str=="" then
- remove(edt,1)
- else
- edt[1]=str
- end
+ edt[1]=str
end
end
- local nedt=#edt
- if nedt>0 then
- local str=edt[nedt]
- if type(str)~="string" then
- elseif str=="" then
- remove(edt)
- else
- if nolines then
- str=gsub(str,"%s+"," ")
- end
- str=gsub(str,"%s+$","")
+ if n>0 then
+ str=edt[n]
+ if type(str)=="string" then
if str=="" then
remove(edt)
else
- edt[nedt]=str
+ str=lpegmatch(nolines and e_collapser or e_stripper,str)
+ if str=="" then
+ remove(edt)
+ else
+ edt[n]=str
+ end
end
end
end
@@ -11761,8 +12331,8 @@ function xml.finalizers.xml.cdata(collected)
end
return ""
end
-function xml.insertcomment(e,str,n)
- table.insert(e.dt,n or 1,{
+function xml.insertcomment(e,str,n)
+ insert(e.dt,n or 1,{
tg="@cm@",
ns="",
special=true,
@@ -11770,7 +12340,25 @@ function xml.insertcomment(e,str,n)
dt={ str },
})
end
-function xml.setcdata(e,str)
+function xml.insertcdata(e,str,n)
+ insert(e.dt,n or 1,{
+ tg="@cd@",
+ ns="",
+ special=true,
+ at={},
+ dt={ str },
+ })
+end
+function xml.setcomment(e,str,n)
+ e.dt={ {
+ tg="@cm@",
+ ns="",
+ special=true,
+ at={},
+ dt={ str },
+ } }
+end
+function xml.setcdata(e,str)
e.dt={ {
tg="@cd@",
ns="",
@@ -11840,7 +12428,7 @@ local function recurse(e,action)
for i=1,#edt do
local str=edt[i]
if type(str)~="string" then
- recurse(str,action,recursive)
+ recurse(str,action)
elseif str~="" then
edt[i]=action(str)
end
@@ -11858,6 +12446,65 @@ function helpers.recursetext(collected,action,recursive)
end
end
end
+local specials={
+ ["@rt@"]="root",
+ ["@pi@"]="instruction",
+ ["@cm@"]="comment",
+ ["@dt@"]="declaration",
+ ["@cd@"]="cdata",
+}
+local function convert(x,strip,flat)
+ local ns=x.ns
+ local tg=x.tg
+ local at=x.at
+ local dt=x.dt
+ local node=flat and {
+ [0]=(not x.special and (ns~="" and ns..":"..tg or tg)) or nil,
+ } or {
+ _namespace=ns~="" and ns or nil,
+ _tag=not x.special and tg or nil,
+ _type=specials[tg] or "_element",
+ }
+ if at then
+ for k,v in next,at do
+ node[k]=v
+ end
+ end
+ local n=0
+ for i=1,#dt do
+ local di=dt[i]
+ if type(di)=="table" then
+ if flat and di.special then
+ else
+ di=convert(di,strip,flat)
+ if di then
+ n=n+1
+ node[n]=di
+ end
+ end
+ elseif strip then
+ di=lpegmatch(strip,di)
+ if di~="" then
+ n=n+1
+ node[n]=di
+ end
+ else
+ n=n+1
+ node[n]=di
+ end
+ end
+ if next(node) then
+ return node
+ end
+end
+function xml.totable(x,strip,flat)
+ if type(x)=="table" then
+ if strip then
+ strip=striplinepatterns[strip]
+ end
+ return convert(x,strip,flat)
+ end
+end
end -- of closure
@@ -12414,7 +13061,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-ini"] = package.loaded["data-ini"] or true
--- original size: 7927, stripped down to: 5528
+-- original size: 11085, stripped down to: 7662
if not modules then modules={} end modules ['data-ini']={
version=1.001,
@@ -12423,14 +13070,15 @@ if not modules then modules={} end modules ['data-ini']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files",
}
+local next,type,getmetatable,rawset=next,type,getmetatable,rawset
local gsub,find,gmatch,char=string.gsub,string.find,string.gmatch,string.char
-local next,type=next,type
local filedirname,filebasename,filejoin=file.dirname,file.basename,file.join
+local ostype,osname,osuname,ossetenv,osgetenv=os.type,os.name,os.uname,os.setenv,os.getenv
+local P,S,R,C,Cs,Cc,lpegmatch=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local trace_detail=false trackers.register("resolvers.details",function(v) trace_detail=v end)
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
resolvers=resolvers or {}
local resolvers=resolvers
texconfig.kpse_init=false
@@ -12563,10 +13211,103 @@ if type(profiler)=="table" and not jit then
profiler.start("luatex-profile.log")
end)
end
-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
+local prefixes=utilities.storage.allocate()
+resolvers.prefixes=prefixes
+local resolved={}
+local abstract={}
+local dynamic={}
+function resolvers.resetresolve(str)
+ resolved,abstract={},{}
+end
+function resolvers.allprefixes(separator)
+ local all=table.sortedkeys(prefixes)
+ if separator then
+ for i=1,#all do
+ all[i]=all[i]..":"
+ end
+ end
+ return all
+end
+local function _resolve_(method,target)
+ local action=prefixes[method]
+ if action then
+ return action(target)
+ else
+ return method..":"..target
+ end
+end
+function resolvers.unresolve(str)
+ return abstract[str] or str
+end
+function resolvers.setdynamic(str)
+ dynamic[str]=true
+end
+local pattern=Cs((C(R("az")^2)*P(":")*C((1-S(" \"\';,"))^1)/_resolve_+P(1))^0)
+local prefix=C(R("az")^2)*P(":")
+local target=C((1-S(" \"\';,"))^1)
+local notarget=(#S(";,")+P(-1))*Cc("")
+local p_resolve=Cs(((prefix*(target+notarget))/_resolve_+P(1))^0)
+local p_simple=prefix*P(-1)
+local function resolve(str)
+ if type(str)=="table" then
+ local res={}
+ for i=1,#str do
+ res[i]=resolve(str[i])
+ end
+ return res
+ end
+ local res=resolved[str]
+ if res then
+ return res
+ end
+ local simple=lpegmatch(p_simple,str)
+ local action=prefixes[simple]
+ if action then
+ local res=action(res)
+ if not dynamic[simple] then
+ resolved[simple]=res
+ abstract[res]=simple
+ end
+ return res
+ end
+ res=lpegmatch(p_resolve,str)
+ resolved[str]=res
+ abstract[res]=str
+ return res
+end
+resolvers.resolve=resolve
+if type(osuname)=="function" then
+ for k,v in next,osuname() do
+ if not prefixes[k] then
+ prefixes[k]=function() return v end
+ end
+ end
+end
+if ostype=="unix" then
+ local pattern
+ local function makepattern(t,k,v)
+ if t then
+ rawset(t,k,v)
+ end
+ local colon=P(":")
+ for k,v in table.sortedpairs(prefixes) do
+ if p then
+ p=P(k)+p
+ else
+ p=P(k)
+ end
+ end
+ pattern=Cs((p*colon+colon/";"+P(1))^0)
+ end
+ makepattern()
+ table.setmetatablenewindex(prefixes,makepattern)
+ function resolvers.repath(str)
+ return lpegmatch(pattern,str)
+ end
+else
+ function resolvers.repath(str)
+ return str
+ end
end
@@ -12576,7 +13317,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-exp"] = package.loaded["data-exp"] or true
--- original size: 15317, stripped down to: 9723
+-- original size: 17216, stripped down to: 10657
if not modules then modules={} end modules ['data-exp']={
version=1.001,
@@ -12590,12 +13331,16 @@ local concat,sort=table.concat,table.sort
local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns
local Ct,Cs,Cc,Carg,P,C,S=lpeg.Ct,lpeg.Cs,lpeg.Cc,lpeg.Carg,lpeg.P,lpeg.C,lpeg.S
local type,next=type,next
+local isdir=lfs.isdir
local ostype=os.type
-local collapsepath=file.collapsepath
+local collapsepath,joinpath,basename=file.collapsepath,file.join,file.basename
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local trace_expansions=false trackers.register("resolvers.expansions",function(v) trace_expansions=v end)
+local trace_globbing=true trackers.register("resolvers.globbing",function(v) trace_globbing=v end)
local report_expansions=logs.reporter("resolvers","expansions")
+local report_globbing=logs.reporter("resolvers","globbing")
local resolvers=resolvers
+local resolveprefix=resolvers.resolve
local function f_both(a,b)
local t,n={},0
for sb in gmatch(b,"[^,]+") do
@@ -12685,35 +13430,27 @@ function resolvers.expandedpathfromlist(pathlist)
end
return newlist
end
-local cleanup=lpeg.replacer {
- { "!","" },
- { "\\","/" },
-}
-function resolvers.cleanpath(str)
- local doslashes=(P("\\")/"/"+1)^0
- local donegation=(P("!")/"" )^0
- local homedir=lpegmatch(Cs(donegation*doslashes),environment.homedir or "")
- if homedir=="~" or homedir=="" or not lfs.isdir(homedir) then
- if trace_expansions then
- report_expansions("no home dir set, ignoring dependent paths")
- end
- function resolvers.cleanpath(str)
- if not str or find(str,"~",1,true) then
- return ""
- else
- return lpegmatch(cleanup,str)
+local usedhomedir=nil
+local donegation=(P("!")/"" )^0
+local doslashes=(P("\\")/"/"+1)^0
+local function expandedhome()
+ if not usedhomedir then
+ usedhomedir=lpegmatch(Cs(donegation*doslashes),environment.homedir or "")
+ if usedhomedir=="~" or usedhomedir=="" or not isdir(usedhomedir) then
+ if trace_expansions then
+ report_expansions("no home dir set, ignoring dependent path using current path")
end
- end
- else
- local dohome=((P("~")+P("$HOME"))/homedir)^0
- local cleanup=Cs(donegation*dohome*doslashes)
- function resolvers.cleanpath(str)
- return str and lpegmatch(cleanup,str) or ""
+ usedhomedir="."
end
end
- return resolvers.cleanpath(str)
+ return usedhomedir
+end
+local dohome=((P("~")+P("$HOME")+P("%HOME%"))/expandedhome)^0
+local cleanup=Cs(donegation*dohome*doslashes)
+resolvers.cleanpath=function(str)
+ return str and lpegmatch(cleanup,str) or ""
end
-local expandhome=P("~")/"$HOME"
+local expandhome=P("~")/"$HOME"
local dodouble=P('"')/""*(expandhome+(1-P('"')))^0*P('"')/""
local dosingle=P("'")/""*(expandhome+(1-P("'")))^0*P("'")/""
local dostring=(expandhome+1 )^0
@@ -12765,46 +13502,67 @@ function resolvers.splitpath(str)
end
function resolvers.joinpath(str)
if type(str)=='table' then
- return file.joinpath(str)
+ return joinpath(str)
else
return str
end
end
local attributes,directory=lfs.attributes,lfs.dir
local weird=P(".")^1+lpeg.anywhere(S("~`!#$%^&*()={}[]:;\"\'||<>,?\n\r\t"))
+local lessweird=P(".")^1+lpeg.anywhere(S("~`#$%^&*:;\"\'||<>,?\n\r\t"))
local timer={}
local scanned={}
local nofscans=0
local scancache={}
-local function scan(files,spec,path,n,m,r)
- local full=(path=="" and spec) or (spec..path..'/')
+local fullcache={}
+local nofsharedscans=0
+local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant)
+ local full=path=="" and spec or (spec..path..'/')
local dirs={}
local nofdirs=0
+ local pattern=tolerant and lessweird or weird
for name in directory(full) do
- if not lpegmatch(weird,name) then
- local mode=attributes(full..name,'mode')
- if mode=='file' then
+ if not lpegmatch(pattern,name) then
+ local mode=attributes(full..name,"mode")
+ if mode=="file" then
n=n+1
- local f=files[name]
- if f then
- if type(f)=='string' then
- files[name]={ f,path }
+ local lower=lower(name)
+ local paths=files[lower]
+ if paths then
+ if onlyone then
else
- f[#f+1]=path
+ if type(paths)=="string" then
+ files[lower]={ paths,path }
+ else
+ paths[#paths+1]=path
+ end
+ if name~=lower then
+ local rl=remap[lower]
+ if not rl then
+ remap[lower]=name
+ r=r+1
+ elseif trace_globbing and rl~=name then
+ report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl)
+ end
+ end
end
else
- files[name]=path
- local lower=lower(name)
+ files[lower]=path
if name~=lower then
- files["remap:"..lower]=name
- r=r+1
+ local rl=remap[lower]
+ if not rl then
+ remap[lower]=name
+ r=r+1
+ elseif trace_globbing and rl~=name then
+ report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl)
+ end
end
end
- elseif mode=='directory' then
+ elseif mode=="directory" then
m=m+1
nofdirs=nofdirs+1
if path~="" then
- dirs[nofdirs]=path..'/'..name
+ dirs[nofdirs]=path.."/"..name
else
dirs[nofdirs]=name
end
@@ -12814,107 +13572,69 @@ local function scan(files,spec,path,n,m,r)
if nofdirs>0 then
sort(dirs)
for i=1,nofdirs do
- files,n,m,r=scan(files,spec,dirs[i],n,m,r)
+ files,remap,n,m,r=scan(files,remap,spec,dirs[i],n,m,r,onlyonce,tolerant)
end
end
scancache[sub(full,1,-2)]=files
- return files,n,m,r
+ return files,remap,n,m,r
end
-local fullcache={}
-function resolvers.scanfiles(path,branch,usecache)
- statistics.starttiming(timer)
- local realpath=resolvers.resolve(path)
+function resolvers.scanfiles(path,branch,usecache,onlyonce,tolerant)
+ local realpath=resolveprefix(path)
if usecache then
- local files=fullcache[realpath]
- if files then
+ local content=fullcache[realpath]
+ if content then
if trace_locating then
- report_expansions("using caches scan of path %a, branch %a",path,branch or path)
+ report_expansions("using cached scan of path %a, branch %a",path,branch or path)
end
- return files
+ nofsharedscans=nofsharedscans+1
+ return content
end
end
+ statistics.starttiming(timer)
if trace_locating then
report_expansions("scanning path %a, branch %a",path,branch or path)
end
- local files,n,m,r=scan({},realpath..'/',"",0,0,0)
- files.__path__=path
- 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
- if usecache then
- scanned[#scanned+1]=realpath
- fullcache[realpath]=files
- end
- nofscans=nofscans+1
- statistics.stoptiming(timer)
- return files
-end
-local function simplescan(files,spec,path)
- local full=(path=="" and spec) or (spec..path..'/')
- local dirs={}
- local nofdirs=0
- for name in directory(full) do
- if not lpegmatch(weird,name) then
- local mode=attributes(full..name,'mode')
- if mode=='file' then
- if not files[name] then
- files[name]=path
- end
- elseif mode=='directory' then
- nofdirs=nofdirs+1
- if path~="" then
- dirs[nofdirs]=path..'/'..name
- else
- dirs[nofdirs]=name
- end
- end
- end
- end
- if nofdirs>0 then
- sort(dirs)
- for i=1,nofdirs do
- files=simplescan(files,spec,dirs[i])
- end
- end
- return files
-end
-local simplecache={}
-local nofsharedscans=0
-function resolvers.simplescanfiles(path,branch,usecache)
- statistics.starttiming(timer)
- local realpath=resolvers.resolve(path)
- if usecache then
- local files=simplecache[realpath]
- if not files then
- files=scancache[realpath]
- if files then
- nofsharedscans=nofsharedscans+1
- end
+ local content
+ if isdir(realpath) then
+ local files,remap,n,m,r=scan({},{},realpath..'/',"",0,0,0,onlyonce,tolerant)
+ content={
+ metadata={
+ path=path,
+ files=n,
+ directories=m,
+ remappings=r,
+ },
+ files=files,
+ remap=remap,
+ }
+ if trace_locating then
+ report_expansions("%s files found on %s directories with %s uppercase remappings",n,m,r)
end
- if files then
- if trace_locating then
- report_expansions("using caches scan of path %a, branch %a",path,branch or path)
- end
- return files
+ else
+ content={
+ metadata={
+ path=path,
+ files=0,
+ directories=0,
+ remappings=0,
+ },
+ files={},
+ remap={},
+ }
+ if trace_locating then
+ report_expansions("invalid path %a",realpath)
end
end
- if trace_locating then
- report_expansions("scanning path %a, branch %a",path,branch or path)
- end
- local files=simplescan({},realpath..'/',"")
- if trace_locating then
- report_expansions("%s files found",table.count(files))
- end
if usecache then
scanned[#scanned+1]=realpath
- simplecache[realpath]=files
+ fullcache[realpath]=content
end
nofscans=nofscans+1
statistics.stoptiming(timer)
- return files
+ return content
+end
+function resolvers.simplescanfiles(path,branch,usecache)
+ return resolvers.scanfiles(path,branch,usecache,true,true)
end
function resolvers.scandata()
table.sort(scanned)
@@ -12925,6 +13645,52 @@ function resolvers.scandata()
paths=scanned,
}
end
+function resolvers.get_from_content(content,path,name)
+ if not content then
+ return
+ end
+ local files=content.files
+ if not files then
+ return
+ end
+ local remap=content.remap
+ if not remap then
+ return
+ end
+ if name then
+ local used=lower(name)
+ return path,remap[used] or used
+ else
+ local name=path
+ local used=lower(name)
+ local path=files[used]
+ if path then
+ return path,remap[used] or used
+ end
+ end
+end
+local nothing=function() end
+function resolvers.filtered_from_content(content,pattern)
+ if content and type(pattern)=="string" then
+ local pattern=lower(pattern)
+ local files=content.files
+ local remap=content.remap
+ if files and remap then
+ local n=next(files)
+ local function iterator()
+ while n do
+ local k=n
+ n=next(files,k)
+ if find(k,pattern) then
+ return files[k],remap and remap[k] or k
+ end
+ end
+ end
+ return iterator
+ end
+ end
+ return nothing
+end
end -- of closure
@@ -12933,7 +13699,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-env"] = package.loaded["data-env"] or true
--- original size: 8769, stripped down to: 6490
+-- original size: 9216, stripped down to: 6798
if not modules then modules={} end modules ['data-env']={
version=1.001,
@@ -12951,10 +13717,12 @@ local formats=allocate()
local suffixes=allocate()
local dangerous=allocate()
local suffixmap=allocate()
+local usertypes=allocate()
resolvers.formats=formats
resolvers.suffixes=suffixes
resolvers.dangerous=dangerous
resolvers.suffixmap=suffixmap
+resolvers.usertypes=usertypes
local luasuffixes=utilities.lua.suffixes
local relations=allocate {
core={
@@ -13022,11 +13790,13 @@ local relations=allocate {
names={ "mp" },
variable='MPINPUTS',
suffixes={ 'mp','mpvi','mpiv','mpii' },
+ usertype=true,
},
tex={
names={ "tex" },
variable='TEXINPUTS',
- suffixes={ 'tex',"mkvi","mkiv","mkii" },
+ suffixes={ "tex","mkvi","mkiv","mkii","cld","lfg","xml" },
+ usertype=true,
},
icc={
names={ "icc","icc profile","icc profiles" },
@@ -13042,6 +13812,7 @@ local relations=allocate {
names={ "lua" },
variable='LUAINPUTS',
suffixes={ luasuffixes.lua,luasuffixes.luc,luasuffixes.tma,luasuffixes.tmc },
+ usertype=true,
},
lib={
names={ "lib" },
@@ -13050,11 +13821,15 @@ local relations=allocate {
},
bib={
names={ 'bib' },
+ variable='BIBINPUTS',
suffixes={ 'bib' },
+ usertype=true,
},
bst={
names={ 'bst' },
+ variable='BSTINPUTS',
suffixes={ 'bst' },
+ usertype=true,
},
fontconfig={
names={ 'fontconfig','fontconfig file','fontconfig files' },
@@ -13136,8 +13911,9 @@ function resolvers.updaterelations()
for name,relation in next,categories do
local rn=relation.names
local rv=relation.variable
- local rs=relation.suffixes
if rn and rv then
+ local rs=relation.suffixes
+ local ru=relation.usertype
for i=1,#rn do
local rni=lower(gsub(rn[i]," ",""))
formats[rni]=rv
@@ -13149,8 +13925,9 @@ function resolvers.updaterelations()
end
end
end
- end
- if rs then
+ if ru then
+ usertypes[name]=true
+ end
end
end
end
@@ -13201,7 +13978,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tmp"] = package.loaded["data-tmp"] or true
--- original size: 15532, stripped down to: 11648
+-- original size: 15681, stripped down to: 11761
if not modules then modules={} end modules ['data-tmp']={
version=1.100,
@@ -13220,6 +13997,7 @@ local trace_cache=false trackers.register("resolvers.cache",function(v) trace_ca
local report_caches=logs.reporter("resolvers","caches")
local report_resolvers=logs.reporter("resolvers","caching")
local resolvers=resolvers
+local cleanpath=resolvers.cleanpath
local directive_cleanup=false directives.register("system.compile.cleanup",function(v) directive_cleanup=v end)
local directive_strip=false directives.register("system.compile.strip",function(v) directive_strip=v end)
local compile=utilities.lua.compile
@@ -13241,7 +14019,7 @@ caches.relocate=false
caches.defaults={ "TMPDIR","TEMPDIR","TMP","TEMP","HOME","HOMEPATH" }
local writable,readables,usedreadables=nil,{},{}
local function identify()
- local texmfcaches=resolvers.cleanpathlist("TEXMFCACHE")
+ local texmfcaches=resolvers.cleanpathlist("TEXMFCACHE")
if texmfcaches then
for k=1,#texmfcaches do
local cachepath=texmfcaches[k]
@@ -13495,10 +14273,12 @@ 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(addsuffix(name,luasuffixes.lua),"trees")
- local filename=file.join(path,name)
+function caches.loadcontent(cachename,dataname,filename)
+ if not filename then
+ local name=caches.hashed(cachename)
+ local full,path=caches.getfirstreadablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename=file.join(path,name)
+ end
local blob=loadfile(addsuffix(filename,luasuffixes.luc)) or loadfile(addsuffix(filename,luasuffixes.lua))
if blob then
local data=blob()
@@ -13530,10 +14310,12 @@ function caches.collapsecontent(content)
end
end
end
-function caches.savecontent(cachename,dataname,content)
- local name=caches.hashed(cachename)
- local full,path=caches.setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
- local filename=file.join(path,name)
+function caches.savecontent(cachename,dataname,content,filename)
+ if not filename then
+ local name=caches.hashed(cachename)
+ local full,path=caches.setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename=file.join(path,name)
+ end
local luaname=addsuffix(filename,luasuffixes.lua)
local lucname=addsuffix(filename,luasuffixes.luc)
if trace_locating then
@@ -13576,7 +14358,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-met"] = package.loaded["data-met"] or true
--- original size: 5460, stripped down to: 4014
+-- original size: 5347, stripped down to: 4015
if not modules then modules={} end modules ['data-met']={
version=1.100,
@@ -13604,7 +14386,7 @@ local function splitmethod(filename)
if type(filename)=="table" then
return filename
end
- filename=file.collapsepath(filename,".")
+ filename=file.collapsepath(filename,".")
if not find(filename,"://",1,true) then
return { scheme="file",path=filename,original=filename,filename=filename }
end
@@ -13695,7 +14477,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-res"] = package.loaded["data-res"] or true
--- original size: 62045, stripped down to: 43116
+-- original size: 67003, stripped down to: 46291
if not modules then modules={} end modules ['data-res']={
version=1.001,
@@ -13705,7 +14487,7 @@ if not modules then modules={} end modules ['data-res']={
license="see context related readme files",
}
local gsub,find,lower,upper,match,gmatch=string.gsub,string.find,string.lower,string.upper,string.match,string.gmatch
-local concat,insert,sortedkeys=table.concat,table.insert,table.sortedkeys
+local concat,insert,remove,sortedkeys,sortedhash=table.concat,table.insert,table.remove,table.sortedkeys,table.sortedhash
local next,type,rawget=next,type,rawget
local os=os
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
@@ -13714,17 +14496,23 @@ local formatters=string.formatters
local filedirname=file.dirname
local filebasename=file.basename
local suffixonly=file.suffixonly
+local addsuffix=file.addsuffix
+local removesuffix=file.removesuffix
local filejoin=file.join
local collapsepath=file.collapsepath
local joinpath=file.joinpath
+local is_qualified_path=file.is_qualified_path
local allocate=utilities.storage.allocate
local settings_to_array=utilities.parsers.settings_to_array
+local getcurrentdir=lfs.currentdir
+local isfile=lfs.isfile
+local isdir=lfs.isdir
local setmetatableindex=table.setmetatableindex
local luasuffixes=utilities.lua.suffixes
-local getcurrentdir=lfs.currentdir
local trace_locating=false trackers .register("resolvers.locating",function(v) trace_locating=v end)
local trace_detail=false trackers .register("resolvers.details",function(v) trace_detail=v end)
local trace_expansions=false trackers .register("resolvers.expansions",function(v) trace_expansions=v end)
+local trace_paths=false trackers .register("resolvers.paths",function(v) trace_paths=v end)
local resolve_otherwise=true directives.register("resolvers.otherwise",function(v) resolve_otherwise=v end)
local report_resolving=logs.reporter("resolvers","resolving")
local resolvers=resolvers
@@ -13732,10 +14520,14 @@ local expandedpathfromlist=resolvers.expandedpathfromlist
local checkedvariable=resolvers.checkedvariable
local splitconfigurationpath=resolvers.splitconfigurationpath
local methodhandler=resolvers.methodhandler
+local filtered=resolvers.filtered_from_content
+local lookup=resolvers.get_from_content
+local cleanpath=resolvers.cleanpath
+local resolveprefix=resolvers.resolve
local initializesetter=utilities.setters.initialize
local ostype,osname,osenv,ossetenv,osgetenv=os.type,os.name,os.env,os.setenv,os.getenv
-resolvers.cacheversion='1.0.1'
-resolvers.configbanner=''
+resolvers.cacheversion="1.100"
+resolvers.configbanner=""
resolvers.homedir=environment.homedir
resolvers.criticalvars=allocate { "SELFAUTOLOC","SELFAUTODIR","SELFAUTOPARENT","TEXMFCNF","TEXMF","TEXOS" }
resolvers.luacnfname="texmfcnf.lua"
@@ -13754,6 +14546,7 @@ end
local unset_variable="unset"
local formats=resolvers.formats
local suffixes=resolvers.suffixes
+local usertypes=resolvers.usertypes
local dangerous=resolvers.dangerous
local suffixmap=resolvers.suffixmap
resolvers.defaultsuffixes={ "tex" }
@@ -13762,7 +14555,7 @@ local instance=resolvers.instance or nil
function resolvers.setenv(key,value,raw)
if instance then
instance.environment[key]=value
- ossetenv(key,raw and value or resolvers.resolve(value))
+ ossetenv(key,raw and value or resolveprefix(value))
end
end
local function getenv(key)
@@ -13776,7 +14569,7 @@ local function getenv(key)
end
resolvers.getenv=getenv
resolvers.env=getenv
-local function resolve(k)
+local function resolvevariable(k)
return instance.expansions[k]
end
local dollarstripper=lpeg.stripper("$")
@@ -13785,19 +14578,19 @@ 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 variableexpander=Cs((somevariable*(somekey/resolvevariable)+somethingelse)^1 )
local cleaner=P("\\")/"/"+P(";")*S("!{}/\\")^0*P(";")^1/";"
local variablecleaner=Cs((cleaner+P(1))^0)
-local somevariable=R("az","AZ","09","__","--")^1/resolve
+local somevariable=R("az","AZ","09","__","--")^1/resolvevariable
local variable=(P("$")/"")*(somevariable+(P("{")/"")*somevariable*(P("}")/""))
local variableresolver=Cs((variable+P(1))^0)
local function expandedvariable(var)
return lpegmatch(variableexpander,var) or var
end
-function resolvers.newinstance()
- if trace_locating then
+function resolvers.newinstance()
+ if trace_locating then
report_resolving("creating instance")
- end
+ end
local environment,variables,expansions,order=allocate(),allocate(),allocate(),allocate()
local newinstance={
environment=environment,
@@ -13810,6 +14603,7 @@ function resolvers.newinstance()
foundintrees=allocate(),
hashes=allocate(),
hashed=allocate(),
+ pathlists=false,
specification=allocate(),
lists=allocate(),
data=allocate(),
@@ -13822,6 +14616,7 @@ function resolvers.newinstance()
savelists=true,
pattern=nil,
force_suffixes=true,
+ pathstack={},
}
setmetatableindex(variables,function(t,k)
local v
@@ -13871,8 +14666,13 @@ function resolvers.reset()
end
local function reset_hashes()
instance.lists={}
+ instance.pathlists=false
instance.found={}
end
+local function reset_caches()
+ instance.lists={}
+ instance.pathlists=false
+end
local slash=P("/")
local pathexpressionpattern=Cs (
Cc("^")*(
@@ -13924,13 +14724,13 @@ local function identify_configuration_files()
for i=1,#cnfpaths do
local filepath=cnfpaths[i]
local filename=collapsepath(filejoin(filepath,luacnfname))
- local realname=resolvers.resolve(filename)
+ local realname=resolveprefix(filename)
if trace_locating then
- local fullpath=gsub(resolvers.resolve(collapsepath(filepath)),"//","/")
+ local fullpath=gsub(resolveprefix(collapsepath(filepath)),"//","/")
local weirdpath=find(fullpath,"/texmf.+/texmf") or not find(fullpath,"/web2c",1,true)
report_resolving("looking for %a on %s path %a from specification %a",luacnfname,weirdpath and "weird" or "given",fullpath,filepath)
end
- if lfs.isfile(realname) then
+ if isfile(realname) then
specification[#specification+1]=filename
if trace_locating then
report_resolving("found configuration file %a",realname)
@@ -13952,7 +14752,7 @@ local function load_configuration_files()
local filename=specification[i]
local pathname=filedirname(filename)
local filename=filejoin(pathname,luacnfname)
- local realname=resolvers.resolve(filename)
+ local realname=resolveprefix(filename)
local blob=loadfile(realname)
if blob then
local setups=instance.setups
@@ -13960,7 +14760,7 @@ local function load_configuration_files()
local parent=data and data.parent
if parent then
local filename=filejoin(pathname,parent)
- local realname=resolvers.resolve(filename)
+ local realname=resolveprefix(filename)
local blob=loadfile(realname)
if blob then
local parentdata=blob()
@@ -13985,7 +14785,7 @@ local function load_configuration_files()
elseif variables[k]==nil then
if trace_locating and not warning then
report_resolving("variables like %a in configuration file %a should move to the 'variables' subtable",
- k,resolvers.resolve(filename))
+ k,resolveprefix(filename))
warning=true
end
variables[k]=v
@@ -14045,7 +14845,7 @@ local function locate_file_databases()
local stripped=lpegmatch(inhibitstripper,path)
if stripped~="" then
local runtime=stripped==path
- path=resolvers.cleanpath(path)
+ path=cleanpath(path)
local spec=resolvers.splitmethod(stripped)
if runtime and (spec.noscheme or spec.scheme=="file") then
stripped="tree:///"..stripped
@@ -14108,8 +14908,8 @@ function resolvers.renew(hashname)
report_resolving("identifying tree %a",hashname)
end
end
- local realpath=resolvers.resolve(hashname)
- if lfs.isdir(realpath) then
+ local realpath=resolveprefix(hashname)
+ if isdir(realpath) then
if trace_locating then
report_resolving("using path %a",realpath)
end
@@ -14210,19 +15010,53 @@ end
function resolvers.unexpandedpath(str)
return joinpath(resolvers.unexpandedpathlist(str))
end
+function resolvers.pushpath(name)
+ local pathstack=instance.pathstack
+ local lastpath=pathstack[#pathstack]
+ local pluspath=filedirname(name)
+ if lastpath then
+ lastpath=collapsepath(filejoin(lastpath,pluspath))
+ else
+ lastpath=collapsepath(pluspath)
+ end
+ insert(pathstack,lastpath)
+ if trace_paths then
+ report_resolving("pushing path %a",lastpath)
+ end
+end
+function resolvers.poppath()
+ local pathstack=instance.pathstack
+ if trace_paths and #pathstack>0 then
+ report_resolving("popping path %a",pathstack[#pathstack])
+ end
+ remove(pathstack)
+end
+function resolvers.stackpath()
+ local pathstack=instance.pathstack
+ local currentpath=pathstack[#pathstack]
+ return currentpath~="" and currentpath or nil
+end
local done={}
function resolvers.resetextrapath()
local ep=instance.extra_paths
if not ep then
- ep,done={},{}
- instance.extra_paths=ep
+ done={}
+ instance.extra_paths={}
elseif #ep>0 then
- instance.lists,done={},{}
+ done={}
+ reset_caches()
end
end
function resolvers.registerextrapath(paths,subpaths)
- paths=settings_to_array(paths)
- subpaths=settings_to_array(subpaths)
+ if not subpaths or subpaths=="" then
+ if not paths or path=="" then
+ return
+ elseif done[paths] then
+ return
+ end
+ end
+ local paths=settings_to_array(paths)
+ local subpaths=settings_to_array(subpaths)
local ep=instance.extra_paths or {}
local oldn=#ep
local newn=oldn
@@ -14237,7 +15071,7 @@ function resolvers.registerextrapath(paths,subpaths)
local ps=p.."/"..s
if not done[ps] then
newn=newn+1
- ep[newn]=resolvers.cleanpath(ps)
+ ep[newn]=cleanpath(ps)
done[ps]=true
end
end
@@ -14247,7 +15081,7 @@ function resolvers.registerextrapath(paths,subpaths)
local p=paths[i]
if not done[p] then
newn=newn+1
- ep[newn]=resolvers.cleanpath(p)
+ ep[newn]=cleanpath(p)
done[p]=true
end
end
@@ -14259,7 +15093,7 @@ function resolvers.registerextrapath(paths,subpaths)
local ps=ep[i].."/"..s
if not done[ps] then
newn=newn+1
- ep[newn]=resolvers.cleanpath(ps)
+ ep[newn]=cleanpath(ps)
done[ps]=true
end
end
@@ -14268,52 +15102,70 @@ function resolvers.registerextrapath(paths,subpaths)
if newn>0 then
instance.extra_paths=ep
end
- if newn>oldn then
- instance.lists={}
+ if newn~=oldn then
+ reset_caches()
end
end
-local function made_list(instance,list)
- local ep=instance.extra_paths
- if not ep or #ep==0 then
- return list
+function resolvers.pushextrapath(path)
+ local paths=settings_to_array(path)
+ if instance.extra_stack then
+ insert(instance.extra_stack,1,paths)
else
- local done,new,newn={},{},0
- for k=1,#list do
- local v=list[k]
- if not done[v] then
- if find(v,"^[%.%/]$") then
- done[v]=true
- newn=newn+1
- new[newn]=v
- else
- break
- end
- end
- end
- for k=1,#ep do
- local v=ep[k]
+ instance.extra_stack={ paths }
+ end
+ reset_caches()
+end
+function resolvers.popextrapath()
+ if instance.extra_stack then
+ reset_caches()
+ return remove(instance.extra_stack,1)
+ end
+end
+local function made_list(instance,list,extra_too)
+ local done={}
+ local new={}
+ local newn=0
+ local function add(p)
+ for k=1,#p do
+ local v=p[k]
if not done[v] then
done[v]=true
newn=newn+1
new[newn]=v
end
end
- for k=1,#list do
- local v=list[k]
- if not done[v] then
- done[v]=true
- newn=newn+1
- new[newn]=v
+ end
+ for k=1,#list do
+ local v=list[k]
+ if done[v] then
+ elseif find(v,"^[%.%/]$") then
+ done[v]=true
+ newn=newn+1
+ new[newn]=v
+ else
+ break
+ end
+ end
+ if extra_too then
+ local es=instance.extra_stack
+ if es and #es>0 then
+ for k=1,#es do
+ add(es[k])
end
end
- return new
+ local ep=instance.extra_paths
+ if ep and #ep>0 then
+ add(ep)
+ end
end
+ add(list)
+ return new
end
function resolvers.cleanpathlist(str)
local t=resolvers.expandedpathlist(str)
if t then
for i=1,#t do
- t[i]=collapsepath(resolvers.cleanpath(t[i]))
+ t[i]=collapsepath(cleanpath(t[i]))
end
end
return t
@@ -14321,22 +15173,22 @@ end
function resolvers.expandpath(str)
return joinpath(resolvers.expandedpathlist(str))
end
-function resolvers.expandedpathlist(str)
+function resolvers.expandedpathlist(str,extra_too)
if not str then
return {}
- elseif instance.savelists then
+ elseif instance.savelists then
str=lpegmatch(dollarstripper,str)
local lists=instance.lists
local lst=lists[str]
if not lst then
- local l=made_list(instance,resolvers.splitpath(resolvers.expansion(str)))
+ local l=made_list(instance,resolvers.splitpath(resolvers.expansion(str)),extra_too)
lst=expandedpathfromlist(l)
lists[str]=lst
end
return lst
else
local lst=resolvers.splitpath(resolvers.expansion(str))
- return made_list(instance,expandedpathfromlist(lst))
+ return made_list(instance,expandedpathfromlist(lst),extra_too)
end
end
function resolvers.expandedpathlistfromvariable(str)
@@ -14347,6 +15199,13 @@ end
function resolvers.expandpathfromvariable(str)
return joinpath(resolvers.expandedpathlistfromvariable(str))
end
+function resolvers.cleanedpathlist(v)
+ local t=resolvers.expandedpathlist(v)
+ for i=1,#t do
+ t[i]=resolvers.resolve(resolvers.cleanpath(t[i]))
+ end
+ return t
+end
function resolvers.expandbraces(str)
local ori=str
local pth=expandedpathfromlist(resolvers.splitpath(ori))
@@ -14363,7 +15222,7 @@ function resolvers.registerfilehash(name,content,someerror)
end
end
local function isreadable(name)
- local readable=lfs.isfile(name)
+ local readable=isfile(name)
if trace_detail then
if readable then
report_resolving("file %a is readable",name)
@@ -14373,70 +15232,57 @@ local function isreadable(name)
end
return readable
end
-local function collect_files(names)
- local filelist,noffiles={},0
+local function collect_files(names)
+ local filelist={}
+ local noffiles=0
+ local function check(hash,root,pathname,path,name)
+ if not pathname or find(path,pathname) then
+ local variant=hash.type
+ local search=filejoin(root,path,name)
+ local result=methodhandler('concatinators',variant,root,path,name)
+ if trace_detail then
+ report_resolving("match: variant %a, search %a, result %a",variant,search,result)
+ end
+ noffiles=noffiles+1
+ filelist[noffiles]={ variant,search,result }
+ end
+ end
for k=1,#names do
- local fname=names[k]
+ local filename=names[k]
if trace_detail then
- report_resolving("checking name %a",fname)
+ report_resolving("checking name %a",filename)
end
- local bname=filebasename(fname)
- local dname=filedirname(fname)
- if dname=="" or find(dname,"^%.") then
- dname=false
+ local basename=filebasename(filename)
+ local pathname=filedirname(filename)
+ if pathname=="" or find(pathname,"^%.") then
+ pathname=false
else
- dname=gsub(dname,"%*",".*")
- dname="/"..dname.."$"
+ pathname=gsub(pathname,"%*",".*")
+ pathname="/"..pathname.."$"
end
local hashes=instance.hashes
for h=1,#hashes do
local hash=hashes[h]
- local blobpath=hash.name
- local files=blobpath and instance.files[blobpath]
- if files then
+ local hashname=hash.name
+ local content=hashname and instance.files[hashname]
+ if content then
if trace_detail then
- report_resolving("deep checking %a, base %a, pattern %a",blobpath,bname,dname)
- 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
+ report_resolving("deep checking %a, base %a, pattern %a",hashname,basename,pathname)
end
- if blobfile then
- local blobroot=files.__path__ or blobpath
- if type(blobfile)=='string' then
- if not dname or find(blobfile,dname) then
- local variant=hash.type
- local search=filejoin(blobroot,blobfile,bname)
- local result=methodhandler('concatinators',hash.type,blobroot,blobfile,bname)
- if trace_detail then
- report_resolving("match: variant %a, search %a, result %a",variant,search,result)
- end
- noffiles=noffiles+1
- filelist[noffiles]={ variant,search,result }
- end
+ local path,name=lookup(content,basename)
+ if path then
+ local metadata=content.metadata
+ local realroot=metadata and metadata.path or hashname
+ if type(path)=="string" then
+ check(hash,realroot,pathname,path,name)
else
- for kk=1,#blobfile do
- local vv=blobfile[kk]
- if not dname or find(vv,dname) then
- local variant=hash.type
- local search=filejoin(blobroot,vv,bname)
- local result=methodhandler('concatinators',hash.type,blobroot,vv,bname)
- if trace_detail then
- report_resolving("match: variant %a, search %a, result %a",variant,search,result)
- end
- noffiles=noffiles+1
- filelist[noffiles]={ variant,search,result }
- end
+ for i=1,#path do
+ check(hash,realroot,pathname,path[i],name)
end
end
end
elseif trace_locating then
- report_resolving("no match in %a (%s)",blobpath,bname)
+ report_resolving("no match in %a (%s)",hashname,basename)
end
end
end
@@ -14461,7 +15307,7 @@ end
local function can_be_dir(name)
local fakepaths=instance.fakepaths
if not fakepaths[name] then
- if lfs.isdir(name) then
+ if isdir(name) then
fakepaths[name]=1
else
fakepaths[name]=2
@@ -14477,10 +15323,11 @@ local function find_analyze(filename,askedformat,allresults)
if askedformat=="" then
if ext=="" or not suffixmap[ext] then
local defaultsuffixes=resolvers.defaultsuffixes
+ local formatofsuffix=resolvers.formatofsuffix
for i=1,#defaultsuffixes do
local forcedname=filename..'.'..defaultsuffixes[i]
wantedfiles[#wantedfiles+1]=forcedname
- filetype=resolvers.formatofsuffix(forcedname)
+ filetype=formatofsuffix(forcedname)
if trace_locating then
report_resolving("forcing filetype %a",filetype)
end
@@ -14520,14 +15367,14 @@ local function find_wildcard(filename,allresults)
if trace_locating then
report_resolving("checking wildcard %a",filename)
end
- local method,result=resolvers.findwildcardfiles(filename)
+ local result=resolvers.findwildcardfiles(filename)
if result then
return "wildcard",result
end
end
end
local function find_qualified(filename,allresults,askedformat,alsostripped)
- if not file.is_qualified_path(filename) then
+ if not is_qualified_path(filename) then
return
end
if trace_locating then
@@ -14601,33 +15448,66 @@ local function check_subpath(fname)
return fname
end
end
-local function find_intree(filename,filetype,wantedfiles,allresults)
+local function makepathlist(list,filetype)
local typespec=resolvers.variableofformat(filetype)
- local pathlist=resolvers.expandedpathlist(typespec)
- local method="intree"
+ local pathlist=resolvers.expandedpathlist(typespec,filetype and usertypes[filetype])
+ local entry={}
if pathlist and #pathlist>0 then
- local filelist=collect_files(wantedfiles)
+ for k=1,#pathlist do
+ local path=pathlist[k]
+ local prescanned=find(path,'^!!')
+ local resursive=find(path,'//$')
+ local pathname=lpegmatch(inhibitstripper,path)
+ local expression=makepathexpression(pathname)
+ local barename=gsub(pathname,"/+$","")
+ barename=resolveprefix(barename)
+ local scheme=url.hasscheme(barename)
+ local schemename=gsub(barename,"%.%*$",'')
+ entry[k]={
+ path=path,
+ pathname=pathname,
+ prescanned=prescanned,
+ recursive=recursive,
+ expression=expression,
+ barename=barename,
+ scheme=scheme,
+ schemename=schemename,
+ }
+ end
+ entry.typespec=typespec
+ list[filetype]=entry
+ else
+ list[filetype]=false
+ end
+ return entry
+end
+local function find_intree(filename,filetype,wantedfiles,allresults)
+ local pathlists=instance.pathlists
+ if not pathlists then
+ pathlists=setmetatableindex(allocate(),makepathlist)
+ instance.pathlists=pathlists
+ end
+ local pathlist=pathlists[filetype]
+ if pathlist then
+ local method="intree"
+ local filelist=collect_files(wantedfiles)
local dirlist={}
+ local result={}
if filelist then
for i=1,#filelist do
dirlist[i]=filedirname(filelist[i][3]).."/"
end
end
if trace_detail then
- report_resolving("checking filename %a",filename)
+ report_resolving("checking filename %a in tree",filename)
end
- local resolve=resolvers.resolve
- local result={}
for k=1,#pathlist do
- local path=pathlist[k]
- local pathname=lpegmatch(inhibitstripper,path)
- local doscan=path==pathname
- if not find (pathname,'//$') then
- doscan=false
- end
+ local entry=pathlist[k]
+ local path=entry.path
+ local pathname=entry.pathname
local done=false
if filelist then
- local expression=makepathexpression(pathname)
+ local expression=entry.expression
if trace_detail then
report_resolving("using pattern %a for path %a",expression,pathname)
end
@@ -14635,8 +15515,8 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
local fl=filelist[k]
local f=fl[2]
local d=dirlist[k]
- if find(d,expression) or find(resolve(d),expression) then
- result[#result+1]=resolve(fl[3])
+ if find(d,expression) or find(resolveprefix(d),expression) then
+ result[#result+1]=resolveprefix(fl[3])
done=true
if allresults then
if trace_detail then
@@ -14657,56 +15537,62 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
method="database"
else
method="filesystem"
- pathname=gsub(pathname,"/+$","")
- pathname=resolve(pathname)
- local scheme=url.hasscheme(pathname)
+ local scheme=entry.scheme
if not scheme or scheme=="file" then
- local pname=gsub(pathname,"%.%*$",'')
+ local pname=entry.schemename
if not find(pname,"*",1,true) then
if can_be_dir(pname) then
- for k=1,#wantedfiles do
- local w=wantedfiles[k]
- local fname=check_subpath(filejoin(pname,w))
- if fname then
- result[#result+1]=fname
- done=true
- if not allresults then
- break
- end
+ if not done and not entry.prescanned then
+ if trace_detail then
+ report_resolving("quick root scan for %a",pname)
end
- end
- if not done and doscan then
- local files=resolvers.simplescanfiles(pname,false,true)
for k=1,#wantedfiles do
local w=wantedfiles[k]
- local subpath=files[w]
- if not subpath or subpath=="" then
- elseif type(subpath)=="string" then
- local fname=check_subpath(filejoin(pname,subpath,w))
- if fname then
- result[#result+1]=fname
- done=true
- if not allresults then
- break
- end
+ local fname=check_subpath(filejoin(pname,w))
+ if fname then
+ result[#result+1]=fname
+ done=true
+ if not allresults then
+ break
end
- else
- for i=1,#subpath do
- local sp=subpath[i]
- if sp=="" then
- else
- local fname=check_subpath(filejoin(pname,sp,w))
- if fname then
- result[#result+1]=fname
- done=true
- if not allresults then
- break
+ end
+ end
+ if not done and entry.recursive then
+ if trace_detail then
+ report_resolving("scanning filesystem for %a",pname)
+ end
+ local files=resolvers.simplescanfiles(pname,false,true)
+ for k=1,#wantedfiles do
+ local w=wantedfiles[k]
+ local subpath=files[w]
+ if not subpath or subpath=="" then
+ elseif type(subpath)=="string" then
+ local fname=check_subpath(filejoin(pname,subpath,w))
+ if fname then
+ result[#result+1]=fname
+ done=true
+ if not allresults then
+ break
+ end
+ end
+ else
+ for i=1,#subpath do
+ local sp=subpath[i]
+ if sp=="" then
+ else
+ local fname=check_subpath(filejoin(pname,sp,w))
+ if fname then
+ result[#result+1]=fname
+ done=true
+ if not allresults then
+ break
+ end
end
end
end
- end
- if done and not allresults then
- break
+ if done and not allresults then
+ break
+ end
end
end
end
@@ -14714,6 +15600,18 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
else
end
+ else
+ for k=1,#wantedfiles do
+ local pname=entry.barename
+ local fname=methodhandler('finders',pname.."/"..wantedfiles[k])
+ if fname then
+ result[#result+1]=fname
+ done=true
+ if not allresults then
+ break
+ end
+ end
+ end
end
end
if done and not allresults then
@@ -14748,10 +15646,13 @@ local function find_otherwise(filename,filetype,wantedfiles,allresults)
local filelist=collect_files(wantedfiles)
local fl=filelist and filelist[1]
if fl then
- return "otherwise",{ resolvers.resolve(fl[3]) }
+ return "otherwise",{ resolveprefix(fl[3]) }
end
end
collect_instance_files=function(filename,askedformat,allresults)
+ if not filename or filename=="" then
+ return {}
+ end
askedformat=askedformat or ""
filename=collapsepath(filename,".")
filename=gsub(filename,"^%./",getcurrentdir().."/")
@@ -14786,7 +15687,11 @@ collect_instance_files=function(filename,askedformat,allresults)
else
local method,result,stamp,filetype,wantedfiles
if instance.remember then
- stamp=formatters["%s--%s"](filename,askedformat)
+ if askedformat=="" then
+ stamp=formatters["%s::%s"](suffixonly(filename),filename)
+ else
+ stamp=formatters["%s::%s"](askedformat,filename)
+ end
result=stamp and instance.found[stamp]
if result then
if trace_locating then
@@ -14821,7 +15726,7 @@ collect_instance_files=function(filename,askedformat,allresults)
end
if stamp then
if trace_locating then
- report_resolving("remembering file %a",filename)
+ report_resolving("remembering file %a using hash %a",filename,stamp)
end
instance.found[stamp]=result
end
@@ -14829,6 +15734,9 @@ collect_instance_files=function(filename,askedformat,allresults)
end
end
local function findfiles(filename,filetype,allresults)
+ if not filename or filename=="" then
+ return {}
+ end
local result,status=collect_instance_files(filename,filetype or "",allresults)
if not result or #result==0 then
local lowered=lower(filename)
@@ -14848,39 +15756,30 @@ 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 base=filebasename(filename)
+ local result={}
local hashes=instance.hashes
- local noffound=0
+ local function okay(hash,path,name)
+ local found=methodhandler('concatinators',hash.type,hash.name,path,name)
+ if found and found~="" then
+ result[#result+1]=resolveprefix(found)
+ return not allresults
+ end
+ end
for k=1,#hashes do
local hash=hashes[k]
- local files=instance.files[hash.name] or {}
- local blist=files[bname]
- if not blist then
- local rname="remap:"..bname
- blist=files[rname]
- if blist then
- bname=files[rname]
- blist=files[bname]
- end
- end
- if blist then
- if type(blist)=='string' then
- local found=methodhandler('concatinators',hash.type,hash.name,blist,bname) or ""
- if found~="" then
- noffound=noffound+1
- result[noffound]=resolvers.resolve(found)
- if not allresults then
- break
- end
+ local content=instance.files[hash.name]
+ if content then
+ local path,name=lookup(content,base)
+ if not path then
+ elseif type(path)=="string" then
+ if okay(hash,path,name) then
+ return result
end
else
- for kk=1,#blist do
- local vv=blist[kk]
- local found=methodhandler('concatinators',hash.type,hash.name,vv,bname) or ""
- if found~="" then
- noffound=noffound+1
- result[noffound]=resolvers.resolve(found)
- if not allresults then break end
+ for i=1,#path do
+ if okay(hash,path[i],name) then
+ return result
end
end
end
@@ -14894,64 +15793,80 @@ end
function resolvers.findgivenfile(filename)
return findgivenfiles(filename,false)[1] or ""
end
-local function doit(path,blist,bname,tag,variant,result,allresults)
- local done=false
- if blist and variant then
- local resolve=resolvers.resolve
- if type(blist)=='string' then
- if find(lower(blist),path) then
- local full=methodhandler('concatinators',variant,tag,blist,bname) or ""
- result[#result+1]=resolve(full)
- done=true
- end
- else
- for kk=1,#blist do
- local vv=blist[kk]
- if find(lower(vv),path) then
- local full=methodhandler('concatinators',variant,tag,vv,bname) or ""
- result[#result+1]=resolve(full)
- done=true
- if not allresults then break end
- end
- end
- end
- end
- return done
-end
local makewildcard=Cs(
(P("^")^0*P("/")*P(-1)+P(-1))/".*"+(P("^")^0*P("/")/"")^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)
- result=result or {}
+local function findwildcardfiles(filename,allresults,result)
+ local result=result or {}
local base=filebasename(filename)
local dirn=filedirname(filename)
local path=lower(lpegmatch(makewildcard,dirn) or dirn)
local name=lower(lpegmatch(makewildcard,base) or base)
- local files,done=instance.files,false
+ local files=instance.files
if find(name,"*",1,true) then
local hashes=instance.hashes
+ local function okay(found,path,base,hashname,hashtype)
+ if find(found,path) then
+ local full=methodhandler('concatinators',hashtype,hashname,found,base)
+ if full and full~="" then
+ result[#result+1]=resolveprefix(full)
+ return not allresults
+ end
+ end
+ end
for k=1,#hashes do
local hash=hashes[k]
- local hashname,hashtype=hash.name,hash.type
- for kk,hh in next,files[hashname] do
- if not find(kk,"^remap:") then
- if find(lower(kk),name) then
- if doit(path,hh,kk,hashname,hashtype,result,allresults) then done=true end
- if done and not allresults then break end
+ local hashname=hash.name
+ local hashtype=hash.type
+ if hashname and hashtype then
+ for found,base in filtered(files[hashname],name) do
+ if type(found)=='string' then
+ if okay(found,path,base,hashname,hashtype) then
+ break
+ end
+ else
+ for i=1,#found do
+ if okay(found[i],path,base,hashname,hashtype) then
+ break
+ end
+ end
end
end
end
end
else
+ local function okayokay(found,path,base,hashname,hashtype)
+ if find(found,path) then
+ local full=methodhandler('concatinators',hashtype,hashname,found,base)
+ if full and full~="" then
+ result[#result+1]=resolveprefix(full)
+ return not allresults
+ end
+ end
+ end
local hashes=instance.hashes
for k=1,#hashes do
local hash=hashes[k]
- local hashname,hashtype=hash.name,hash.type
- if doit(path,files[hashname][base],base,hashname,hashtype,result,allresults) then done=true end
- if done and not allresults then break end
+ local hashname=hash.name
+ local hashtype=hash.type
+ if hashname and hashtype then
+ local found,base=lookup(content,base)
+ if not found then
+ elseif type(found)=='string' then
+ if okay(found,path,base,hashname,hashtype) then
+ break
+ end
+ else
+ for i=1,#found do
+ if okay(found[i],path,base,hashname,hashtype) then
+ break
+ end
+ end
+ end
+ end
end
end
return result
@@ -15024,7 +15939,7 @@ end
function resolvers.dowithpath(name,func)
local pathlist=resolvers.expandedpathlist(name)
for i=1,#pathlist do
- func("^"..resolvers.cleanpath(pathlist[i]))
+ func("^"..cleanpath(pathlist[i]))
end
end
function resolvers.dowithvariable(name,func)
@@ -15032,23 +15947,23 @@ function resolvers.dowithvariable(name,func)
end
function resolvers.locateformat(name)
local engine=environment.ownmain or "luatex"
- local barename=file.removesuffix(name)
- local fullname=file.addsuffix(barename,"fmt")
+ local barename=removesuffix(name)
+ local fullname=addsuffix(barename,"fmt")
local fmtname=caches.getfirstreadablefile(fullname,"formats",engine) or ""
if fmtname=="" then
fmtname=resolvers.findfile(fullname)
- fmtname=resolvers.cleanpath(fmtname)
+ fmtname=cleanpath(fmtname)
end
if fmtname~="" then
- local barename=file.removesuffix(fmtname)
- local luaname=file.addsuffix(barename,luasuffixes.lua)
- local lucname=file.addsuffix(barename,luasuffixes.luc)
- local luiname=file.addsuffix(barename,luasuffixes.lui)
- if lfs.isfile(luiname) then
+ local barename=removesuffix(fmtname)
+ local luaname=addsuffix(barename,luasuffixes.lua)
+ local lucname=addsuffix(barename,luasuffixes.luc)
+ local luiname=addsuffix(barename,luasuffixes.lui)
+ if isfile(luiname) then
return barename,luiname
- elseif lfs.isfile(lucname) then
+ elseif isfile(lucname) then
return barename,lucname
- elseif lfs.isfile(luaname) then
+ elseif isfile(luaname) then
return barename,luaname
end
end
@@ -15070,29 +15985,24 @@ function resolvers.dowithfilesintree(pattern,handle,before,after)
local hash=hashes[i]
local blobtype=hash.type
local blobpath=hash.name
- if blobpath then
+ if blobtype and blobpath then
+ local total=0
+ local checked=0
+ local done=0
if before then
before(blobtype,blobpath,pattern)
end
- local files=instance.files[blobpath]
- local total,checked,done=0,0,0
- if files then
- for k,v in table.sortedhash(files) do
- total=total+1
- if find(k,"^remap:") then
- elseif find(k,pattern) then
- if type(v)=="string" then
- checked=checked+1
- if handle(blobtype,blobpath,v,k) then
- done=done+1
- end
- else
- checked=checked+#v
- for i=1,#v do
- if handle(blobtype,blobpath,v[i],k) then
- done=done+1
- end
- end
+ for path,name in filtered(instance.files[blobpath],pattern) do
+ if type(path)=="string" then
+ checked=checked+1
+ if handle(blobtype,blobpath,path,name) then
+ done=done+1
+ end
+ else
+ checked=checked+#path
+ for i=1,#path do
+ if handle(blobtype,blobpath,path[i],name) then
+ done=done+1
end
end
end
@@ -15103,8 +16013,8 @@ function resolvers.dowithfilesintree(pattern,handle,before,after)
end
end
end
-resolvers.obsolete=resolvers.obsolete or {}
-local obsolete=resolvers.obsolete
+local obsolete=resolvers.obsolete or {}
+resolvers.obsolete=obsolete
resolvers.find_file=resolvers.findfile obsolete.find_file=resolvers.findfile
resolvers.find_files=resolvers.findfiles obsolete.find_files=resolvers.findfiles
@@ -15115,7 +16025,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-pre"] = package.loaded["data-pre"] or true
--- original size: 6643, stripped down to: 4401
+-- original size: 3950, stripped down to: 2935
if not modules then modules={} end modules ['data-pre']={
version=1.001,
@@ -15125,44 +16035,51 @@ if not modules then modules={} end modules ['data-pre']={
license="see context related readme files"
}
local resolvers=resolvers
-local prefixes=utilities.storage.allocate()
-resolvers.prefixes=prefixes
-local cleanpath,findgivenfile,expansion=resolvers.cleanpath,resolvers.findgivenfile,resolvers.expansion
+local prefixes=resolvers.prefixes
+local cleanpath=resolvers.cleanpath
+local findgivenfile=resolvers.findgivenfile
+local expansion=resolvers.expansion
local getenv=resolvers.getenv
-local P,S,R,C,Cs,Cc,lpegmatch=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.match
-local joinpath,basename,dirname=file.join,file.basename,file.dirname
-local getmetatable,rawset,type=getmetatable,rawset,type
+local basename=file.basename
+local dirname=file.dirname
+local joinpath=file.join
+local isfile=lfs.isfile
prefixes.environment=function(str)
return cleanpath(expansion(str))
end
-prefixes.relative=function(str,n)
- if io.exists(str) then
- elseif io.exists("./"..str) then
- str="./"..str
- else
- local p="../"
- for i=1,n or 2 do
- if io.exists(p..str) then
- str=p..str
- break
- else
- p=p.."../"
+local function relative(str,n)
+ if not isfile(str) then
+ local pstr="./"..str
+ if isfile(pstr) then
+ str=pstr
+ else
+ local p="../"
+ for i=1,n or 2 do
+ local pstr=p..str
+ if isfile(pstr) then
+ str=pstr
+ break
+ else
+ p=p.."../"
+ end
end
end
end
return cleanpath(str)
end
+local function locate(str)
+ local fullname=findgivenfile(str) or ""
+ return cleanpath(fullname~="" and fullname or str)
+end
+prefixes.relative=relative
+prefixes.locate=locate
prefixes.auto=function(str)
- local fullname=prefixes.relative(str)
- if not lfs.isfile(fullname) then
- fullname=prefixes.locate(str)
+ local fullname=relative(str)
+ if not isfile(fullname) then
+ fullname=locate(str)
end
return fullname
end
-prefixes.locate=function(str)
- local fullname=findgivenfile(str) or ""
- return cleanpath((fullname~="" and fullname) or str)
-end
prefixes.filename=function(str)
local fullname=findgivenfile(str) or ""
return cleanpath(basename((fullname~="" and fullname) or str))
@@ -15183,6 +16100,13 @@ end
prefixes.home=function(str)
return cleanpath(joinpath(getenv('HOME'),str))
end
+prefixes.env=prefixes.environment
+prefixes.rel=prefixes.relative
+prefixes.loc=prefixes.locate
+prefixes.kpse=prefixes.locate
+prefixes.full=prefixes.locate
+prefixes.file=prefixes.filename
+prefixes.path=prefixes.pathname
local function toppath()
local inputstack=resolvers.inputstack
if not inputstack then
@@ -15195,98 +16119,22 @@ local function toppath()
return pathname
end
end
-resolvers.toppath=toppath
-prefixes.toppath=function(str)
- return cleanpath(joinpath(toppath(),str))
-end
-prefixes.env=prefixes.environment
-prefixes.rel=prefixes.relative
-prefixes.loc=prefixes.locate
-prefixes.kpse=prefixes.locate
-prefixes.full=prefixes.locate
-prefixes.file=prefixes.filename
-prefixes.path=prefixes.pathname
-function resolvers.allprefixes(separator)
- local all=table.sortedkeys(prefixes)
- if separator then
- for i=1,#all do
- all[i]=all[i]..":"
- end
- end
- return all
-end
-local function _resolve_(method,target)
- local action=prefixes[method]
- if action then
- return action(target)
- else
- return method..":"..target
- end
-end
-local resolved,abstract={},{}
-function resolvers.resetresolve(str)
- resolved,abstract={},{}
-end
-local pattern=Cs((C(R("az")^2)*P(":")*C((1-S(" \"\';,"))^1)/_resolve_+P(1))^0)
-local prefix=C(R("az")^2)*P(":")
-local target=C((1-S(" \"\';,"))^1)
-local notarget=(#S(";,")+P(-1))*Cc("")
-local pattern=Cs(((prefix*(target+notarget))/_resolve_+P(1))^0)
-local function resolve(str)
- if type(str)=="table" then
- local t={}
- for i=1,#str do
- t[i]=resolve(str[i])
- end
- return t
+local function jobpath()
+ local path=resolvers.stackpath()
+ if not path or path=="" then
+ return "."
else
- local res=resolved[str]
- if not res then
- res=lpegmatch(pattern,str)
- resolved[str]=res
- abstract[res]=str
- end
- return res
- end
-end
-local function unresolve(str)
- return abstract[str] or str
-end
-resolvers.resolve=resolve
-resolvers.unresolve=unresolve
-if type(os.uname)=="function" then
- for k,v in next,os.uname() do
- if not prefixes[k] then
- prefixes[k]=function() return v end
- end
- end
-end
-if os.type=="unix" then
- local pattern
- local function makepattern(t,k,v)
- if t then
- rawset(t,k,v)
- end
- local colon=P(":")
- for k,v in table.sortedpairs(prefixes) do
- if p then
- p=P(k)+p
- else
- p=P(k)
- end
- end
- pattern=Cs((p*colon+colon/";"+P(1))^0)
- end
- makepattern()
- getmetatable(prefixes).__newindex=makepattern
- function resolvers.repath(str)
- return lpegmatch(pattern,str)
- end
-else
- function resolvers.repath(str)
- return str
+ return path
end
end
+resolvers.toppath=toppath
+resolvers.jobpath=jobpath
+prefixes.toppath=function(str) return cleanpath(joinpath(toppath(),str)) end
+prefixes.jobpath=function(str) return cleanpath(joinpath(jobpath(),str)) end
+resolvers.setdynamic("toppath")
+resolvers.setdynamic("jobpath")
+prefixes.jobfile=prefixes.jobpath
+resolvers.setdynamic("jobfile")
end -- of closure
@@ -15348,7 +16196,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-fil"] = package.loaded["data-fil"] or true
--- original size: 3801, stripped down to: 3231
+-- original size: 3863, stripped down to: 3310
if not modules then modules={} end modules ['data-fil']={
version=1.001,
@@ -15360,30 +16208,31 @@ if not modules then modules={} end modules ['data-fil']={
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 resolveprefix=resolvers.resolve
local finders,openers,loaders,savers=resolvers.finders,resolvers.openers,resolvers.loaders,resolvers.savers
local locators,hashers,generators,concatinators=resolvers.locators,resolvers.hashers,resolvers.generators,resolvers.concatinators
local checkgarbage=utilities.garbagecollector and utilities.garbagecollector.check
function locators.file(specification)
- local name=specification.filename
- local realname=resolvers.resolve(name)
+ local filename=specification.filename
+ local realname=resolveprefix(filename)
if realname and realname~='' and lfs.isdir(realname) then
if trace_locating then
- report_files("file locator %a found as %a",name,realname)
+ report_files("file locator %a found as %a",filename,realname)
end
- resolvers.appendhash('file',name,true)
+ resolvers.appendhash('file',filename,true)
elseif trace_locating then
- report_files("file locator %a not found",name)
+ report_files("file locator %a not found",filename)
end
end
function hashers.file(specification)
- local name=specification.filename
- local content=caches.loadcontent(name,'files')
- resolvers.registerfilehash(name,content,content==nil)
+ local pathname=specification.filename
+ local content=caches.loadcontent(pathname,'files')
+ resolvers.registerfilehash(pathname,content,content==nil)
end
function generators.file(specification)
- local path=specification.filename
- local content=resolvers.scanfiles(path,false,true)
- resolvers.registerfilehash(path,content,true)
+ local pathname=specification.filename
+ local content=resolvers.scanfiles(pathname,false,true)
+ resolvers.registerfilehash(pathname,content,true)
end
concatinators.file=file.join
function finders.file(specification,filetype)
@@ -15665,7 +16514,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-zip"] = package.loaded["data-zip"] or true
--- original size: 8489, stripped down to: 6757
+-- original size: 8772, stripped down to: 6841
if not modules then modules={} end modules ['data-zip']={
version=1.001,
@@ -15684,16 +16533,6 @@ zip.archives=zip.archives or {}
local archives=zip.archives
zip.registeredfiles=zip.registeredfiles or {}
local registeredfiles=zip.registeredfiles
-local limited=false
-directives.register("system.inputmode",function(v)
- if not limited then
- local i_limiter=io.i_limiter(v)
- if i_limiter then
- zip.open=i_limiter.protect(zip.open)
- limited=true
- end
- end
-end)
local function validzip(str)
if not find(str,"^zip://") then
return "zip:///"..str
@@ -15708,7 +16547,7 @@ function zip.openarchive(name)
local arch=archives[name]
if not arch then
local full=resolvers.findfile(name) or ""
- arch=(full~="" and zip.open(full)) or false
+ arch=full~="" and zip.open(full) or false
archives[name]=arch
end
return arch
@@ -15867,31 +16706,42 @@ function resolvers.usezipfile(archive)
end
end
function resolvers.registerzipfile(z,tree)
- local files,filter={},""
- if tree=="" then
- filter="^(.+)/(.-)$"
- else
- filter=format("^%s/(.+)/(.-)$",tree)
- end
+ local names={}
+ local files={}
+ local remap={}
+ local n=0
+ local filter=tree=="" and "^(.+)/(.-)$" or format("^%s/(.+)/(.-)$",tree)
+ local register=resolvers.registerfile
if trace_locating then
report_zip("registering: using filter %a",filter)
end
- local register,n=resolvers.registerfile,0
for i in z:files() do
- local path,name=match(i.filename,filter)
- if path then
- if name and name~='' then
- register(files,name,path)
- n=n+1
- else
+ local filename=i.filename
+ local path,name=match(filename,filter)
+ if not path then
+ n=n+1
+ register(names,filename,"")
+ local usedname=lower(filename)
+ files[usedname]=""
+ if usedname~=filename then
+ remap[usedname]=filename
end
- else
- register(files,i.filename,'')
+ elseif name and name~="" then
n=n+1
+ register(names,name,path)
+ local usedname=lower(name)
+ files[usedname]=path
+ if usedname~=name then
+ remap[usedname]=name
+ end
+ else
end
end
report_zip("registering: %s files registered",n)
- return files
+ return {
+ files=files,
+ remap=remap,
+ }
end
@@ -15901,7 +16751,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tre"] = package.loaded["data-tre"] or true
--- original size: 2508, stripped down to: 2074
+-- original size: 8479, stripped down to: 5580
if not modules then modules={} end modules ['data-tre']={
version=1.001,
@@ -15910,42 +16760,64 @@ if not modules then modules={} end modules ['data-tre']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local find,gsub,format=string.find,string.gsub,string.format
+local find,gsub,lower=string.find,string.gsub,string.lower
+local basename,dirname,joinname=file.basename,file.dirname,file .join
+local globdir,isdir,isfile=dir.glob,lfs.isdir,lfs.isfile
+local P,lpegmatch=lpeg.P,lpeg.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_trees=logs.reporter("resolvers","trees")
local resolvers=resolvers
-local done,found,notfound={},{},resolvers.finders.notfound
-function resolvers.finders.tree(specification)
+local resolveprefix=resolvers.resolve
+local notfound=resolvers.finders.notfound
+local lookup=resolvers.get_from_content
+local collectors={}
+local found={}
+function resolvers.finders.tree(specification)
local spec=specification.filename
- local fnd=found[spec]
- if fnd==nil then
+ local okay=found[spec]
+ if okay==nil then
if spec~="" then
- local path,name=file.dirname(spec),file.basename(spec)
- if path=="" then path="." end
- local hash=done[path]
- if not hash then
- local pattern=path.."/*"
- hash=dir.glob(pattern)
- done[path]=hash
+ local path=dirname(spec)
+ local name=basename(spec)
+ if path=="" then
+ path="."
+ end
+ local names=collectors[path]
+ if not names then
+ local pattern=find(path,"/%*+$") and path or (path.."/*")
+ names=globdir(pattern)
+ collectors[path]=names
end
local pattern="/"..gsub(name,"([%.%-%+])","%%%1").."$"
- for k=1,#hash do
- local v=hash[k]
- if find(v,pattern) then
- found[spec]=v
- return v
+ for i=1,#names do
+ local fullname=names[i]
+ if find(fullname,pattern) then
+ found[spec]=fullname
+ return fullname
+ end
+ end
+ local pattern=lower(pattern)
+ for i=1,#names do
+ local fullname=lower(names[i])
+ if find(fullname,pattern) then
+ if isfile(fullname) then
+ found[spec]=fullname
+ return fullname
+ else
+ break
+ end
end
end
end
- fnd=notfound()
- found[spec]=fnd
+ okay=notfound()
+ found[spec]=okay
end
- return fnd
+ return okay
end
function resolvers.locators.tree(specification)
local name=specification.filename
- local realname=resolvers.resolve(name)
- if realname and realname~='' and lfs.isdir(realname) then
+ local realname=resolveprefix(name)
+ if realname and realname~='' and isdir(realname) then
if trace_locating then
report_trees("locator %a found",realname)
end
@@ -15956,16 +16828,110 @@ function resolvers.locators.tree(specification)
end
function resolvers.hashers.tree(specification)
local name=specification.filename
- if trace_locating then
- report_trees("analysing %a",name)
- end
+ report_trees("analyzing %a",name)
resolvers.methodhandler("hashers",name)
resolvers.generators.file(specification)
end
-resolvers.concatinators.tree=resolvers.concatinators.file
-resolvers.generators.tree=resolvers.generators.file
-resolvers.openers.tree=resolvers.openers.file
-resolvers.loaders.tree=resolvers.loaders.file
+local collectors={}
+local splitter=lpeg.splitat("/**/")
+local stripper=lpeg.replacer { [P("/")*P("*")^1*P(-1)]="" }
+table.setmetatableindex(collectors,function(t,k)
+ local rootname=lpegmatch(stripper,k)
+ local dataname=joinname(rootname,"dirlist")
+ local content=caches.loadcontent(dataname,"files",dataname)
+ if not content then
+ content=resolvers.scanfiles(rootname,nil,nil,false,true)
+ caches.savecontent(dataname,"files",content,dataname)
+ end
+ t[k]=content
+ return content
+end)
+local function checked(root,p,n)
+ if p then
+ if type(p)=="table" then
+ for i=1,#p do
+ local fullname=joinname(root,p[i],n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ else
+ local fullname=joinname(root,p,n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ end
+ return notfound()
+end
+local function resolve(specification)
+ local filename=specification.filename
+ if filename~="" then
+ local root,rest=lpegmatch(splitter,filename)
+ if root and rest then
+ local path,name=dirname(rest),basename(rest)
+ if name~=rest then
+ local content=collectors[root]
+ local p,n=lookup(content,name)
+ if not p then
+ return notfound()
+ end
+ local pattern=".*/"..path.."$"
+ local istable=type(p)=="table"
+ if istable then
+ for i=1,#p do
+ local pi=p[i]
+ if pi==path or find(pi,pattern) then
+ local fullname=joinname(root,pi,n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ end
+ elseif p==path or find(p,pattern) then
+ local fullname=joinname(root,p,n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ local queries=specification.queries
+ if queries and queries.option=="fileonly" then
+ return checked(root,p,n)
+ else
+ return notfound()
+ end
+ end
+ end
+ local path,name=dirname(filename),basename(filename)
+ local root=lpegmatch(stripper,path)
+ local content=collectors[path]
+ local p,n=lookup(content,name)
+ if p then
+ return checked(root,p,n)
+ end
+ end
+ return notfound()
+end
+resolvers.finders .dirlist=resolve
+resolvers.locators .dirlist=resolvers.locators .tree
+resolvers.hashers .dirlist=resolvers.hashers .tree
+resolvers.generators.dirlist=resolvers.generators.file
+resolvers.openers .dirlist=resolvers.openers .file
+resolvers.loaders .dirlist=resolvers.loaders .file
+function resolvers.finders.dirfile(specification)
+ local queries=specification.queries
+ if queries then
+ queries.option="fileonly"
+ else
+ specification.queries={ option="fileonly" }
+ end
+ return resolve(specification)
+end
+resolvers.locators .dirfile=resolvers.locators .dirlist
+resolvers.hashers .dirfile=resolvers.hashers .dirlist
+resolvers.generators.dirfile=resolvers.generators.dirlist
+resolvers.openers .dirfile=resolvers.openers .dirlist
+resolvers.loaders .dirfile=resolvers.loaders .dirlist
end -- of closure
@@ -15974,7 +16940,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-sch"] = package.loaded["data-sch"] or true
--- original size: 6213, stripped down to: 5160
+-- original size: 6569, stripped down to: 5304
if not modules then modules={} end modules ['data-sch']={
version=1.001,
@@ -16000,8 +16966,13 @@ directives.register("schemes.threshold",function(v) threshold=tonumber(v) or thr
function cleaners.none(specification)
return specification.original
end
-function cleaners.strip(specification)
- return (gsub(specification.original,"[^%a%d%.]+","-"))
+function cleaners.strip(specification)
+ local path,name=file.splitbase(specification.original)
+ if path=="" then
+ return (gsub(name,"[^%a%d%.]+","-"))
+ else
+ return (gsub((gsub(path,"%.","-").."-"..name),"[^%a%d%.]+","-"))
+ end
end
function cleaners.md5(specification)
return file.addsuffix(md5.hex(specification.original),file.suffix(specification.path))
@@ -16018,7 +16989,7 @@ end
local cached,loaded,reused,thresholds,handlers={},{},{},{},{}
local function runcurl(name,cachename)
local command="curl --silent --insecure --create-dirs --output "..cachename.." "..name
- os.spawn(command)
+ os.execute(command)
end
local function fetch(specification)
local original=specification.original
@@ -16150,7 +17121,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-lua"] = package.loaded["data-lua"] or true
--- original size: 4237, stripped down to: 3177
+-- original size: 4313, stripped down to: 3227
if not modules then modules={} end modules ['data-lua']={
version=1.001,
@@ -16159,7 +17130,7 @@ if not modules then modules={} end modules ['data-lua']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local resolvers,package=resolvers,package
+local package,lpeg=package,lpeg
local gsub=string.gsub
local concat=table.concat
local addsuffix=file.addsuffix
@@ -16170,9 +17141,11 @@ local luaformats={ 'TEXINPUTS','LUAINPUTS' }
local libformats={ 'CLUAINPUTS' }
local helpers=package.helpers or {}
local methods=helpers.methods or {}
+local resolvers=resolvers
+local resolveprefix=resolvers.resolve
+helpers.report=logs.reporter("resolvers","libraries")
trackers.register("resolvers.libraries",function(v) helpers.trace=v end)
trackers.register("resolvers.locating",function(v) helpers.trace=v end)
-helpers.report=logs.reporter("resolvers","libraries")
helpers.sequence={
"already loaded",
"preload table",
@@ -16187,7 +17160,7 @@ helpers.sequence={
}
local pattern=Cs(P("!")^0/""*(P("/")*P(-1)/"/"+P("/")^1/"/"+1)^0)
function helpers.cleanpath(path)
- return resolvers.resolve(lpegmatch(pattern,path))
+ return resolveprefix(lpegmatch(pattern,path))
end
local loadedaslib=helpers.loadedaslib
local getextraluapaths=package.extraluapaths
@@ -16324,7 +17297,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tmf"] = package.loaded["data-tmf"] or true
--- original size: 2600, stripped down to: 1627
+-- original size: 2601, stripped down to: 1627
if not modules then modules={} end modules ['data-tmf']={
version=1.001,
@@ -16380,7 +17353,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-lst"] = package.loaded["data-lst"] or true
--- original size: 2654, stripped down to: 2301
+-- original size: 2734, stripped down to: 2354
if not modules then modules={} end modules ['data-lst']={
version=1.001,
@@ -16389,10 +17362,13 @@ if not modules then modules={} end modules ['data-lst']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local find,concat,upper,format=string.find,table.concat,string.upper,string.format
+local rawget,type,next=rawget,type,next
+local find,concat,upper=string.find,table.concat,string.upper
local fastcopy,sortedpairs=table.fastcopy,table.sortedpairs
-resolvers.listers=resolvers.listers or {}
local resolvers=resolvers
+local listers=resolvers.listers or {}
+resolvers.listers=listers
+local resolveprefix=resolvers.resolve
local report_lists=logs.reporter("resolvers","lists")
local function tabstr(str)
if type(str)=='table' then
@@ -16401,7 +17377,7 @@ local function tabstr(str)
return str
end
end
-function resolvers.listers.variables(pattern)
+function listers.variables(pattern)
local instance=resolvers.instance
local environment=instance.environment
local variables=instance.variables
@@ -16422,10 +17398,10 @@ function resolvers.listers.variables(pattern)
for key,value in sortedpairs(configured) do
if key~="" and (pattern=="" or find(upper(key),pattern)) then
report_lists(key)
- report_lists(" env: %s",tabstr(rawget(environment,key)) or "unset")
- report_lists(" var: %s",tabstr(configured[key]) or "unset")
- report_lists(" exp: %s",tabstr(expansions[key]) or "unset")
- report_lists(" res: %s",tabstr(resolvers.resolve(expansions[key])) or "unset")
+ report_lists(" env: %s",tabstr(rawget(environment,key)) or "unset")
+ report_lists(" var: %s",tabstr(configured[key]) or "unset")
+ report_lists(" exp: %s",tabstr(expansions[key]) or "unset")
+ report_lists(" res: %s",tabstr(resolveprefix(expansions[key])) or "unset")
end
end
instance.environment=fastcopy(env)
@@ -16433,15 +17409,15 @@ function resolvers.listers.variables(pattern)
instance.expansions=fastcopy(exp)
end
local report_resolved=logs.reporter("system","resolved")
-function resolvers.listers.configurations()
+function listers.configurations()
local configurations=resolvers.instance.specification
for i=1,#configurations do
- report_resolved("file : %s",resolvers.resolve(configurations[i]))
+ report_resolved("file : %s",resolveprefix(configurations[i]))
end
report_resolved("")
local list=resolvers.expandedpathfromlist(resolvers.splitpath(resolvers.luacnfspec))
for i=1,#list do
- local li=resolvers.resolve(list[i])
+ local li=resolveprefix(list[i])
if lfs.isdir(li) then
report_resolved("path - %s",li)
else
@@ -16746,7 +17722,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["luat-fmt"] = package.loaded["luat-fmt"] or true
--- original size: 5951, stripped down to: 4922
+-- original size: 5955, stripped down to: 4926
if not modules then modules={} end modules ['luat-fmt']={
version=1.001,
@@ -16834,7 +17810,7 @@ function environment.make_format(name)
end
local command=format("%s --ini %s --lua=%s %s %sdump",engine,primaryflags(),quoted(usedluastub),quoted(fulltexsourcename),os.platform=="unix" and "\\\\" or "\\")
report_format("running command: %s\n",command)
- os.spawn(command)
+ os.execute(command)
local pattern=file.removesuffix(file.basename(usedluastub)).."-*.mem"
local mp=dir.glob(pattern)
if mp then
@@ -16869,7 +17845,7 @@ function environment.run_format(name,data,more)
else
local command=format("%s %s --fmt=%s --lua=%s %s %s",engine,primaryflags(),quoted(barename),quoted(luaname),quoted(data),more~="" and quoted(more) or "")
report_format("running command: %s",command)
- os.spawn(command)
+ os.execute(command)
end
end
end
@@ -16880,8 +17856,8 @@ end -- of closure
-- used libraries : l-lua.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-mrg.lua util-tpl.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.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-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
-- skipped libraries : -
--- original bytes : 695180
--- stripped bytes : 246794
+-- original bytes : 739251
+-- stripped bytes : 264497
-- end library merge
@@ -17107,6 +18083,7 @@ local helpinfo = [[
<category name="basic">
<subcategory>
<flag name="script"><short>run an mtx script (lua prefered method) (<ref name="noquotes"/>), no script gives list</short></flag>
+ <flag name="evaluate"><short>run code passed on the commandline (between quotes)</short></flag>
<flag name="execute"><short>run a script or program (texmfstart method) (<ref name="noquotes"/>)</short></flag>
<flag name="resolve"><short>resolve prefixed arguments</short></flag>
<flag name="ctxlua"><short>run internally (using preloaded libs)</short></flag>
@@ -17132,6 +18109,7 @@ local helpinfo = [[
<flag name="verbose"><short>give a bit more info</short></flag>
<flag name="trackers" value="list"><short>enable given trackers</short></flag>
<flag name="progname" value="str"><short>format or backend</short></flag>
+ <flag name="systeminfo" value="str"><short>show current operating system, processor, etc</short></flag>
</subcategory>
<subcategory>
<flag name="edit"><short>launch editor with found file</short></flag>
@@ -17761,6 +18739,39 @@ function runners.associate(filename)
os.launch(filename)
end
+function runners.evaluate(code,filename) -- for Luigi
+ if code == "loop" then
+ while true do
+ io.write("> ")
+ local code = io.read()
+ if code ~= "" then
+ local temp = string.match(code,"^= (.*)$")
+ if temp then
+ code = "print("..temp..")"
+ end
+ local compiled, message = loadstring(code)
+ if type(compiled) ~= "function" then
+ io.write("! " .. (message or code).."\n")
+ else
+ io.write(compiled())
+ end
+ end
+ end
+ else
+ if type(code) ~= "string" or code == "" then
+ code = filename
+ end
+ if code ~= "" then
+ local compiled, message = loadstring(code)
+ if type(compiled) ~= "function" then
+ io.write("invalid lua code: " .. (message or code))
+ return
+ end
+ io.write(compiled())
+ end
+ end
+end
+
function runners.gethelp(filename)
local url = environment.argument("url")
if url and url ~= "" then
@@ -17772,6 +18783,15 @@ function runners.gethelp(filename)
end
end
+function runners.systeminfo()
+ report("architecture : %s",os.platform or "<unset>")
+ report("operating system : %s",os.name or "<unset>")
+ report("file architecture : %s",os.type or "<unset>")
+ report("binary path : %s",os.selfdir or "<unset>")
+ report("binary suffix : %s",os.binsuffix or "<unset>")
+ report("library suffix : %s",os.libsuffix or "<unset>")
+end
+
-- this is a bit dirty ... first we store the first filename and next we
-- split the arguments so that we only see the ones meant for this script
-- ... later we will use the second half
@@ -17887,16 +18907,7 @@ end
if e_argument("ansi") then
- local formatters = string.formatters
-
- logs.setformatters {
- report_yes = formatters["%-15s | %s"],
- report_nop = formatters["%-15s |"],
- subreport_yes = formatters["%-15s | %s | %s"],
- subreport_nop = formatters["%-15s | %s |"],
- status_yes = formatters["%-15s : %s\n"],
- status_nop = formatters["%-15s :\n"],
- }
+ logs.setformatters("ansi")
local script = e_argument("script") or e_argument("scripts")
@@ -17921,6 +18932,10 @@ if e_argument("script") or e_argument("scripts") then
ok = runners.execute_ctx_script(filename)
end
+elseif e_argument("evaluate") then
+
+ runners.evaluate(e_argument("evaluate"),filename)
+
elseif e_argument("selfmerge") then
-- embed used libraries
@@ -18213,6 +19228,10 @@ elseif e_argument("exporthelp") then
runners.loadbase()
application.export(e_argument("exporthelp"),filename)
+elseif e_argument("systeminfo") then
+
+ runners.systeminfo()
+
elseif e_argument("help") or filename=='help' or filename == "" then
application.help()
diff --git a/Master/texmf-dist/scripts/context/stubs/unix/mtxrun b/Master/texmf-dist/scripts/context/stubs/unix/mtxrun
index 5cb5c8d2416..48a9a27a250 100755
--- a/Master/texmf-dist/scripts/context/stubs/unix/mtxrun
+++ b/Master/texmf-dist/scripts/context/stubs/unix/mtxrun
@@ -56,7 +56,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lua"] = package.loaded["l-lua"] or true
--- original size: 3409, stripped down to: 1763
+-- original size: 3888, stripped down to: 2197
if not modules then modules={} end modules ['l-lua']={
version=1.001,
@@ -139,6 +139,13 @@ end
if lua then
lua.mask=load([[τεχ = 1]]) and "utf" or "ascii"
end
+local flush=io.flush
+if flush then
+ local execute=os.execute if execute then function os.execute(...) flush() return execute(...) end end
+ local exec=os.exec if exec then function os.exec (...) flush() return exec (...) end end
+ local spawn=os.spawn if spawn then function os.spawn (...) flush() return spawn (...) end end
+ local popen=io.popen if popen then function io.popen (...) flush() return popen (...) end end
+end
end -- of closure
@@ -437,7 +444,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lpeg"] = package.loaded["l-lpeg"] or true
--- original size: 29983, stripped down to: 16202
+-- original size: 36225, stripped down to: 19891
if not modules then modules={} end modules ['l-lpeg']={
version=1.001,
@@ -498,6 +505,8 @@ patterns.utfbom_16_le=utfbom_16_le
patterns.utfbom_8=utfbom_8
patterns.utf_16_be_nl=P("\000\r\000\n")+P("\000\r")+P("\000\n")
patterns.utf_16_le_nl=P("\r\000\n\000")+P("\r\000")+P("\n\000")
+patterns.utf_32_be_nl=P("\000\000\000\r\000\000\000\n")+P("\000\000\000\r")+P("\000\000\000\n")
+patterns.utf_32_le_nl=P("\r\000\000\000\n\000\000\000")+P("\r\000\000\000")+P("\n\000\000\000")
patterns.utf8one=R("\000\127")
patterns.utf8two=R("\194\223")*utf8next
patterns.utf8three=R("\224\239")*utf8next*utf8next
@@ -527,9 +536,21 @@ patterns.nonwhitespace=nonwhitespace
local stripper=spacer^0*C((spacer^0*nonspacer^1)^0)
local fullstripper=whitespace^0*C((whitespace^0*nonwhitespace^1)^0)
local collapser=Cs(spacer^0/""*nonspacer^0*((spacer^0/" "*nonspacer^1)^0))
+local b_collapser=Cs(whitespace^0/""*(nonwhitespace^1+whitespace^1/" ")^0)
+local e_collapser=Cs((whitespace^1*P(-1)/""+nonwhitespace^1+whitespace^1/" ")^0)
+local m_collapser=Cs((nonwhitespace^1+whitespace^1/" ")^0)
+local b_stripper=Cs(spacer^0/""*(nonspacer^1+spacer^1/" ")^0)
+local e_stripper=Cs((spacer^1*P(-1)/""+nonspacer^1+spacer^1/" ")^0)
+local m_stripper=Cs((nonspacer^1+spacer^1/" ")^0)
patterns.stripper=stripper
patterns.fullstripper=fullstripper
patterns.collapser=collapser
+patterns.b_collapser=b_collapser
+patterns.m_collapser=m_collapser
+patterns.e_collapser=e_collapser
+patterns.b_stripper=b_stripper
+patterns.m_stripper=m_stripper
+patterns.e_stripper=e_stripper
patterns.lowercase=lowercase
patterns.uppercase=uppercase
patterns.letter=patterns.lowercase+patterns.uppercase
@@ -566,9 +587,12 @@ patterns.integer=sign^-1*digit^1
patterns.unsigned=digit^0*period*digit^1
patterns.float=sign^-1*patterns.unsigned
patterns.cunsigned=digit^0*comma*digit^1
+patterns.cpunsigned=digit^0*(period+comma)*digit^1
patterns.cfloat=sign^-1*patterns.cunsigned
+patterns.cpfloat=sign^-1*patterns.cpunsigned
patterns.number=patterns.float+patterns.integer
patterns.cnumber=patterns.cfloat+patterns.integer
+patterns.cpnumber=patterns.cpfloat+patterns.integer
patterns.oct=zero*octdigit^1
patterns.octal=patterns.oct
patterns.HEX=zero*P("X")*(digit+uppercase)^1
@@ -985,23 +1009,40 @@ function lpeg.append(list,pp,delayed,checked)
end
return p
end
+local p_false=P(false)
+local p_true=P(true)
local function make(t)
- local p
+ local function making(t)
+ local p=p_false
+ local keys=sortedkeys(t)
+ for i=1,#keys do
+ local k=keys[i]
+ if k~="" then
+ local v=t[k]
+ if v==true then
+ p=p+P(k)*p_true
+ elseif v==false then
+ else
+ p=p+P(k)*making(v)
+ end
+ end
+ end
+ if t[""] then
+ p=p+p_true
+ end
+ return p
+ end
+ local p=p_false
local keys=sortedkeys(t)
for i=1,#keys do
local k=keys[i]
- local v=t[k]
- if not p then
- if next(v) then
- p=P(k)*make(v)
- else
- p=P(k)
- end
- else
- if next(v) then
- p=p+P(k)*make(v)
+ if k~="" then
+ local v=t[k]
+ if v==true then
+ p=p+P(k)*p_true
+ elseif v==false then
else
- p=p+P(k)
+ p=p+P(k)*making(v)
end
end
end
@@ -1009,13 +1050,73 @@ local function make(t)
end
function lpeg.utfchartabletopattern(list)
local tree={}
- for i=1,#list do
- local t=tree
- for c in gmatch(list[i],".") do
- if not t[c] then
- t[c]={}
+ local n=#list
+ if n==0 then
+ for s in next,list do
+ local t=tree
+ local p,pk
+ for c in gmatch(s,".") do
+ if t==true then
+ t={ [c]=true,[""]=true }
+ p[pk]=t
+ p=t
+ t=false
+ elseif t==false then
+ t={ [c]=false }
+ p[pk]=t
+ p=t
+ t=false
+ else
+ local tc=t[c]
+ if not tc then
+ tc=false
+ t[c]=false
+ end
+ p=t
+ t=tc
+ end
+ pk=c
+ end
+ if t==false then
+ p[pk]=true
+ elseif t==true then
+ else
+ t[""]=true
+ end
+ end
+ else
+ for i=1,n do
+ local s=list[i]
+ local t=tree
+ local p,pk
+ for c in gmatch(s,".") do
+ if t==true then
+ t={ [c]=true,[""]=true }
+ p[pk]=t
+ p=t
+ t=false
+ elseif t==false then
+ t={ [c]=false }
+ p[pk]=t
+ p=t
+ t=false
+ else
+ local tc=t[c]
+ if not tc then
+ tc=false
+ t[c]=false
+ end
+ p=t
+ t=tc
+ end
+ pk=c
+ end
+ if t==false then
+ p[pk]=true
+ elseif t==true then
+ else
+ t[""]=true
end
- t=t[c]
end
end
return make(tree)
@@ -1055,6 +1156,65 @@ local case_2=period*(digit-trailingzeros)^1*(trailingzeros/"")
local number=digit^1*(case_1+case_2)
local stripper=Cs((number+1)^0)
lpeg.patterns.stripzeros=stripper
+local byte_to_HEX={}
+local byte_to_hex={}
+local byte_to_dec={}
+local hex_to_byte={}
+for i=0,255 do
+ local H=format("%02X",i)
+ local h=format("%02x",i)
+ local d=format("%03i",i)
+ local c=char(i)
+ byte_to_HEX[c]=H
+ byte_to_hex[c]=h
+ byte_to_dec[c]=d
+ hex_to_byte[h]=c
+ hex_to_byte[H]=c
+end
+local hextobyte=P(2)/hex_to_byte
+local bytetoHEX=P(1)/byte_to_HEX
+local bytetohex=P(1)/byte_to_hex
+local bytetodec=P(1)/byte_to_dec
+local hextobytes=Cs(hextobyte^0)
+local bytestoHEX=Cs(bytetoHEX^0)
+local bytestohex=Cs(bytetohex^0)
+local bytestodec=Cs(bytetodec^0)
+patterns.hextobyte=hextobyte
+patterns.bytetoHEX=bytetoHEX
+patterns.bytetohex=bytetohex
+patterns.bytetodec=bytetodec
+patterns.hextobytes=hextobytes
+patterns.bytestoHEX=bytestoHEX
+patterns.bytestohex=bytestohex
+patterns.bytestodec=bytestodec
+function string.toHEX(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(bytestoHEX,s)
+ end
+end
+function string.tohex(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(bytestohex,s)
+ end
+end
+function string.todec(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(bytestodec,s)
+ end
+end
+function string.tobytes(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(hextobytes,s)
+ end
+end
end -- of closure
@@ -1082,7 +1242,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-string"] = package.loaded["l-string"] or true
--- original size: 5671, stripped down to: 2827
+-- original size: 5694, stripped down to: 2827
if not modules then modules={} end modules ['l-string']={
version=1.001,
@@ -1187,7 +1347,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-table"] = package.loaded["l-table"] or true
--- original size: 31860, stripped down to: 20846
+-- original size: 33830, stripped down to: 21894
if not modules then modules={} end modules ['l-table']={
version=1.001,
@@ -1230,11 +1390,12 @@ function table.keys(t)
end
end
local function compare(a,b)
- local ta,tb=type(a),type(b)
- if ta==tb then
+ local ta=type(a)
+ local tb=type(b)
+ if ta==tb and ta=="number" then
return a<b
else
- return tostring(a)<tostring(b)
+ return tostring(a)<tostring(b)
end
end
local function sortedkeys(tab)
@@ -1334,14 +1495,14 @@ local function sortedhash(t,cmp)
end
local n=0
local m=#s
- local function kv(s)
+ local function kv()
if n<m then
n=n+1
local k=s[n]
return k,t[k]
end
end
- return kv,s
+ return kv
else
return nothing
end
@@ -1506,7 +1667,7 @@ local function simple_table(t)
if tv=="number" then
nt=nt+1
if hexify then
- tt[nt]=format("0x%04X",v)
+ tt[nt]=format("0x%X",v)
else
tt[nt]=tostring(v)
end
@@ -1537,7 +1698,7 @@ local function do_serialize(root,name,depth,level,indexed)
local tn=type(name)
if tn=="number" then
if hexify then
- handle(format("%s[0x%04X]={",depth,name))
+ handle(format("%s[0x%X]={",depth,name))
else
handle(format("%s[%s]={",depth,name))
end
@@ -1554,7 +1715,7 @@ local function do_serialize(root,name,depth,level,indexed)
end
end
end
- if root and next(root) then
+ if root and next(root)~=nil then
local first,last=nil,0
if compact then
last=#root
@@ -1576,7 +1737,7 @@ local function do_serialize(root,name,depth,level,indexed)
if compact and first and tk=="number" and k>=first and k<=last then
if tv=="number" then
if hexify then
- handle(format("%s 0x%04X,",depth,v))
+ handle(format("%s 0x%X,",depth,v))
else
handle(format("%s %s,",depth,v))
end
@@ -1587,7 +1748,7 @@ local function do_serialize(root,name,depth,level,indexed)
handle(format("%s %q,",depth,v))
end
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
handle(format("%s {},",depth))
elseif inline then
local st=simple_table(v)
@@ -1617,25 +1778,25 @@ local function do_serialize(root,name,depth,level,indexed)
elseif tv=="number" then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=0x%04X,",depth,k,v))
+ handle(format("%s [0x%X]=0x%X,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
elseif tk=="boolean" then
if hexify then
- handle(format("%s [%s]=0x%04X,",depth,k and "true" or "false",v))
+ handle(format("%s [%s]=0x%X,",depth,k and "true" or "false",v))
else
handle(format("%s [%s]=%s,",depth,k and "true" or "false",v))
end
elseif noquotes and not reserved[k] and lpegmatch(propername,k) then
if hexify then
- handle(format("%s %s=0x%04X,",depth,k,v))
+ handle(format("%s %s=0x%X,",depth,k,v))
else
handle(format("%s %s=%s,",depth,k,v))
end
else
if hexify then
- handle(format("%s [%q]=0x%04X,",depth,k,v))
+ handle(format("%s [%q]=0x%X,",depth,k,v))
else
handle(format("%s [%q]=%s,",depth,k,v))
end
@@ -1644,7 +1805,7 @@ local function do_serialize(root,name,depth,level,indexed)
if reduce and tonumber(v) then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%s,",depth,k,v))
+ handle(format("%s [0x%X]=%s,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
@@ -1658,7 +1819,7 @@ local function do_serialize(root,name,depth,level,indexed)
else
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%q,",depth,k,v))
+ handle(format("%s [0x%X]=%q,",depth,k,v))
else
handle(format("%s [%s]=%q,",depth,k,v))
end
@@ -1671,10 +1832,10 @@ local function do_serialize(root,name,depth,level,indexed)
end
end
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]={},",depth,k))
+ handle(format("%s [0x%X]={},",depth,k))
else
handle(format("%s [%s]={},",depth,k))
end
@@ -1690,7 +1851,7 @@ local function do_serialize(root,name,depth,level,indexed)
if st then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]={ %s },",depth,k,concat(st,", ")))
+ handle(format("%s [0x%X]={ %s },",depth,k,concat(st,", ")))
else
handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
end
@@ -1710,7 +1871,7 @@ local function do_serialize(root,name,depth,level,indexed)
elseif tv=="boolean" then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%s,",depth,k,v and "true" or "false"))
+ handle(format("%s [0x%X]=%s,",depth,k,v and "true" or "false"))
else
handle(format("%s [%s]=%s,",depth,k,v and "true" or "false"))
end
@@ -1726,7 +1887,7 @@ local function do_serialize(root,name,depth,level,indexed)
local f=getinfo(v).what=="C" and dump(dummy) or dump(v)
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=load(%q),",depth,k,f))
+ handle(format("%s [0x%X]=load(%q),",depth,k,f))
else
handle(format("%s [%s]=load(%q),",depth,k,f))
end
@@ -1741,7 +1902,7 @@ local function do_serialize(root,name,depth,level,indexed)
else
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%q,",depth,k,tostring(v)))
+ handle(format("%s [0x%X]=%q,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%q,",depth,k,tostring(v)))
end
@@ -1795,7 +1956,7 @@ local function serialize(_handle,root,name,specification)
end
elseif tname=="number" then
if hexify then
- handle(format("[0x%04X]={",name))
+ handle(format("[0x%X]={",name))
else
handle("["..name.."]={")
end
@@ -1813,7 +1974,7 @@ local function serialize(_handle,root,name,specification)
local dummy=root._w_h_a_t_e_v_e_r_
root._w_h_a_t_e_v_e_r_=nil
end
- if next(root) then
+ if next(root)~=nil then
do_serialize(root,name,"",0)
end
end
@@ -1942,14 +2103,25 @@ local function identical(a,b)
end
table.identical=identical
table.are_equal=are_equal
-function table.compact(t)
- if t then
- for k,v in next,t do
- if not next(v) then
- t[k]=nil
+local function sparse(old,nest,keeptables)
+ local new={}
+ for k,v in next,old do
+ if not (v=="" or v==false) then
+ if nest and type(v)=="table" then
+ v=sparse(v,nest)
+ if keeptables or next(v)~=nil then
+ new[k]=v
+ end
+ else
+ new[k]=v
end
end
end
+ return new
+end
+table.sparse=sparse
+function table.compact(t)
+ return sparse(t,true,true)
end
function table.contains(t,v)
if t then
@@ -2054,10 +2226,10 @@ function table.sub(t,i,j)
return { unpack(t,i,j) }
end
function table.is_empty(t)
- return not t or not next(t)
+ return not t or next(t)==nil
end
function table.has_one_entry(t)
- return t and not next(t,next(t))
+ return t and next(t,next(t))==nil
end
function table.loweredkeys(t)
local l={}
@@ -2102,6 +2274,44 @@ function table.values(t,s)
return {}
end
end
+function table.filtered(t,pattern,sort,cmp)
+ if t and type(pattern)=="string" then
+ if sort then
+ local s
+ if cmp then
+ s=sortedhashkeys(t,function(a,b) return cmp(t,a,b) end)
+ else
+ s=sortedkeys(t)
+ end
+ local n=0
+ local m=#s
+ local function kv(s)
+ while n<m do
+ n=n+1
+ local k=s[n]
+ if find(k,pattern) then
+ return k,t[k]
+ end
+ end
+ end
+ return kv,s
+ else
+ local n=next(t)
+ local function iterator()
+ while n~=nil do
+ local k=n
+ n=next(t,k)
+ if find(k,pattern) then
+ return k,t[k]
+ end
+ end
+ end
+ return iterator,t
+ end
+ else
+ return nothing
+ end
+end
end -- of closure
@@ -2110,7 +2320,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-io"] = package.loaded["l-io"] or true
--- original size: 8824, stripped down to: 6347
+-- original size: 8643, stripped down to: 6232
if not modules then modules={} end modules ['l-io']={
version=1.001,
@@ -2417,8 +2627,6 @@ function io.readstring(f,n,m)
local str=gsub(f:read(n),"\000","")
return str
end
-if not io.i_limiter then function io.i_limiter() end end
-if not io.o_limiter then function io.o_limiter() end end
end -- of closure
@@ -2645,7 +2853,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-os"] = package.loaded["l-os"] or true
--- original size: 16093, stripped down to: 9704
+-- original size: 15761, stripped down to: 9403
if not modules then modules={} end modules ['l-os']={
version=1.001,
@@ -2719,13 +2927,10 @@ if not os.__getenv__ then
setmetatable(os.env,{ __index=__index,__newindex=__newindex } )
end
end
-local execute,spawn,exec,iopopen,ioflush=os.execute,os.spawn or os.execute,os.exec or os.execute,io.popen,io.flush
-function os.execute(...) ioflush() return execute(...) end
-function os.spawn (...) ioflush() return spawn (...) end
-function os.exec (...) ioflush() return exec (...) end
-function io.popen (...) ioflush() return iopopen(...) end
+local execute=os.execute
+local iopopen=io.popen
function os.resultof(command)
- local handle=io.popen(command,"r")
+ local handle=iopopen(command,"r")
if handle then
local result=handle:read("*all") or ""
handle:close()
@@ -2754,7 +2959,7 @@ local launchers={
unix="$BROWSER %s &> /dev/null &",
}
function os.launch(str)
- os.execute(format(launchers[os.name] or launchers.unix,str))
+ execute(format(launchers[os.name] or launchers.unix,str))
end
if not os.times then
function os.times()
@@ -3029,7 +3234,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-file"] = package.loaded["l-file"] or true
--- original size: 18308, stripped down to: 9948
+-- original size: 20949, stripped down to: 9945
if not modules then modules={} end modules ['l-file']={
version=1.001,
@@ -3043,41 +3248,28 @@ local file=file
if not lfs then
lfs=optionalrequire("lfs")
end
-if not lfs then
- lfs={
- getcurrentdir=function()
- return "."
- end,
- attributes=function()
- return nil
- end,
- isfile=function(name)
- local f=io.open(name,'rb')
- if f then
- f:close()
- return true
- end
- end,
- isdir=function(name)
- print("you need to load lfs")
- return false
- end
- }
-elseif not lfs.isfile then
- local attributes=lfs.attributes
- function lfs.isdir(name)
- return attributes(name,"mode")=="directory"
- end
- function lfs.isfile(name)
- return attributes(name,"mode")=="file"
- end
-end
local insert,concat=table.insert,table.concat
local match,find,gmatch=string.match,string.find,string.gmatch
local lpegmatch=lpeg.match
local getcurrentdir,attributes=lfs.currentdir,lfs.attributes
local checkedsplit=string.checkedsplit
local P,R,S,C,Cs,Cp,Cc,Ct=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Cs,lpeg.Cp,lpeg.Cc,lpeg.Ct
+local tricky=S("/\\")*P(-1)
+local attributes=lfs.attributes
+if sandbox then
+ sandbox.redefine(lfs.isfile,"lfs.isfile")
+ sandbox.redefine(lfs.isdir,"lfs.isdir")
+end
+function lfs.isdir(name)
+ if lpegmatch(tricky,name) then
+ return attributes(name,"mode")=="directory"
+ else
+ return attributes(name.."/.","mode")=="directory"
+ end
+end
+function lfs.isfile(name)
+ return attributes(name,"mode")=="file"
+end
local colon=P(":")
local period=P(".")
local periods=P("..")
@@ -3279,28 +3471,30 @@ local isroot=fwslash^1*-1
local hasroot=fwslash^1
local reslasher=lpeg.replacer(S("\\/"),"/")
local deslasher=lpeg.replacer(S("\\/")^1,"/")
-function file.join(...)
- local lst={... }
- local one=lst[1]
+function file.join(one,two,three,...)
+ if not two then
+ return one=="" and one or lpegmatch(stripper,one)
+ end
+ if one=="" then
+ return lpegmatch(stripper,three and concat({ two,three,... },"/") or two)
+ end
if lpegmatch(isnetwork,one) then
local one=lpegmatch(reslasher,one)
- local two=lpegmatch(deslasher,concat(lst,"/",2))
+ local two=lpegmatch(deslasher,three and concat({ two,three,... },"/") or two)
if lpegmatch(hasroot,two) then
return one..two
else
return one.."/"..two
end
elseif lpegmatch(isroot,one) then
- local two=lpegmatch(deslasher,concat(lst,"/",2))
+ local two=lpegmatch(deslasher,three and concat({ two,three,... },"/") or two)
if lpegmatch(hasroot,two) then
return two
else
return "/"..two
end
- elseif one=="" then
- return lpegmatch(stripper,concat(lst,"/",2))
else
- return lpegmatch(deslasher,concat(lst,"/"))
+ return lpegmatch(deslasher,concat({ one,two,three,... },"/"))
end
end
local drivespec=R("az","AZ")^1*colon
@@ -3474,7 +3668,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-md5"] = package.loaded["l-md5"] or true
--- original size: 3760, stripped down to: 2088
+-- original size: 3248, stripped down to: 2266
if not modules then modules={} end modules ['l-md5']={
version=1.001,
@@ -3492,14 +3686,20 @@ if not md5 then
}
end
local md5,file=md5,file
-local gsub,format,byte=string.gsub,string.format,string.byte
-local md5sum=md5.sum
-local function convert(str,fmt)
- return (gsub(md5sum(str),".",function(chr) return format(fmt,byte(chr)) end))
-end
-if not md5.HEX then function md5.HEX(str) return convert(str,"%02X") end end
-if not md5.hex then function md5.hex(str) return convert(str,"%02x") end end
-if not md5.dec then function md5.dec(str) return convert(str,"%03i") end end
+local gsub=string.gsub
+do
+ local patterns=lpeg and lpeg.patterns
+ if patterns then
+ local bytestoHEX=patterns.bytestoHEX
+ local bytestohex=patterns.bytestohex
+ local bytestodec=patterns.bytestodec
+ local lpegmatch=lpeg.match
+ local md5sum=md5.sum
+ if not md5.HEX then function md5.HEX(str) if str then return lpegmatch(bytestoHEX,md5sum(str)) end end end
+ if not md5.hex then function md5.hex(str) if str then return lpegmatch(bytestohex,md5sum(str)) end end end
+ if not md5.dec then function md5.dec(str) if str then return lpegmatch(bytestodec,md5sum(str)) end end end
+ end
+end
function file.needsupdating(oldname,newname,threshold)
local oldtime=lfs.attributes(oldname,"modification")
if oldtime then
@@ -3556,7 +3756,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-url"] = package.loaded["l-url"] or true
--- original size: 12292, stripped down to: 5585
+-- original size: 12531, stripped down to: 5721
if not modules then modules={} end modules ['l-url']={
version=1.001,
@@ -3642,19 +3842,25 @@ local splitquery=Cf (Ct("")*P { "sequence",
pair=Cg(key*equal*value),
},rawset)
local function hashed(str)
- if str=="" then
+ if not str or str=="" then
return {
scheme="invalid",
original=str,
}
end
- local s=split(str)
- local rawscheme=s[1]
- local rawquery=s[4]
- local somescheme=rawscheme~=""
- local somequery=rawquery~=""
+ local detailed=split(str)
+ local rawscheme=""
+ local rawquery=""
+ local somescheme=false
+ local somequery=false
+ if detailed then
+ rawscheme=detailed[1]
+ rawquery=detailed[4]
+ somescheme=rawscheme~=""
+ somequery=rawquery~=""
+ end
if not somescheme and not somequery then
- s={
+ return {
scheme="file",
authority="",
path=str,
@@ -3664,28 +3870,28 @@ local function hashed(str)
noscheme=true,
filename=str,
}
- else
- local authority,path,filename=s[2],s[3]
- if authority=="" then
- filename=path
- elseif path=="" then
- filename=""
- else
- filename=authority.."/"..path
- end
- s={
- scheme=rawscheme,
- authority=authority,
- path=path,
- query=lpegmatch(unescaper,rawquery),
- queries=lpegmatch(splitquery,rawquery),
- fragment=s[5],
- original=str,
- noscheme=false,
- filename=filename,
- }
end
- return s
+ local authority=detailed[2]
+ local path=detailed[3]
+ local filename=nil
+ if authority=="" then
+ filename=path
+ elseif path=="" then
+ filename=""
+ else
+ filename=authority.."/"..path
+ end
+ return {
+ scheme=rawscheme,
+ authority=authority,
+ path=path,
+ query=lpegmatch(unescaper,rawquery),
+ queries=lpegmatch(splitquery,rawquery),
+ fragment=detailed[5],
+ original=str,
+ noscheme=false,
+ filename=filename,
+ }
end
url.split=split
url.hasscheme=hasscheme
@@ -3719,7 +3925,7 @@ function url.construct(hash)
end
return lpegmatch(escaper,concat(fullurl))
end
-local pattern=Cs(noslash*R("az","AZ")*(S(":|")/":")*noslash*P(1)^0)
+local pattern=Cs(slash^-1/""*R("az","AZ")*((S(":|")/":")+P(":"))*slash*P(1)^0)
function url.filename(filename)
local spec=hashed(filename)
local path=spec.path
@@ -3767,7 +3973,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-dir"] = package.loaded["l-dir"] or true
--- original size: 14788, stripped down to: 9096
+-- original size: 16765, stripped down to: 11003
if not modules then modules={} end modules ['l-dir']={
version=1.001,
@@ -3777,7 +3983,7 @@ if not modules then modules={} end modules ['l-dir']={
license="see context related readme files"
}
local type,select=type,select
-local find,gmatch,match,gsub=string.find,string.gmatch,string.match,string.gsub
+local find,gmatch,match,gsub,sub=string.find,string.gmatch,string.match,string.gsub,string.sub
local concat,insert,remove,unpack=table.concat,table.insert,table.remove,table.unpack
local lpegmatch=lpeg.match
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
@@ -3786,53 +3992,126 @@ local dir=dir
local lfs=lfs
local attributes=lfs.attributes
local walkdir=lfs.dir
-local isdir=lfs.isdir
-local isfile=lfs.isfile
+local isdir=lfs.isdir
+local isfile=lfs.isfile
local currentdir=lfs.currentdir
local chdir=lfs.chdir
local mkdir=lfs.mkdir
local onwindows=os.type=="windows" or find(os.getenv("PATH"),";",1,true)
-if not isdir then
- function isdir(name)
- local a=attributes(name)
- return a and a.mode=="directory"
+if onwindows then
+ local tricky=S("/\\")*P(-1)
+ isdir=function(name)
+ if lpegmatch(tricky,name) then
+ return attributes(name,"mode")=="directory"
+ else
+ return attributes(name.."/.","mode")=="directory"
+ end
+ end
+ isfile=function(name)
+ return attributes(name,"mode")=="file"
end
lfs.isdir=isdir
-end
-if not isfile then
- function isfile(name)
- local a=attributes(name)
- return a and a.mode=="file"
+ lfs.isfile=isfile
+else
+ isdir=function(name)
+ return attributes(name,"mode")=="directory"
end
+ isfile=function(name)
+ return attributes(name,"mode")=="file"
+ end
+ lfs.isdir=isdir
lfs.isfile=isfile
end
function dir.current()
return (gsub(currentdir(),"\\","/"))
end
-local lfsisdir=isdir
-local function isdir(path)
- path=gsub(path,"[/\\]+$","")
- return lfsisdir(path)
+local function glob_pattern_function(path,patt,recurse,action)
+ if isdir(path) then
+ local usedpath
+ if path=="/" then
+ usedpath="/."
+ elseif not find(path,"/$") then
+ usedpath=path.."/."
+ path=path.."/"
+ else
+ usedpath=path
+ end
+ local dirs
+ for name in walkdir(usedpath) do
+ if name~="." and name~=".." then
+ local full=path..name
+ local mode=attributes(full,'mode')
+ if mode=='file' then
+ if not patt or find(full,patt) then
+ action(full)
+ end
+ elseif recurse and mode=="directory" then
+ if not dirs then
+ dirs={ full }
+ else
+ dirs[#dirs+1]=full
+ end
+ end
+ end
+ end
+ if dirs then
+ for i=1,#dirs do
+ glob_pattern_function(dirs[i],patt,recurse,action)
+ end
+ end
+ end
end
-lfs.isdir=isdir
-local function globpattern(path,patt,recurse,action)
- if path=="/" then
- path=path.."."
- elseif not find(path,"/$") then
- path=path..'/'
- end
- if isdir(path) then
- for name in walkdir(path) do
- local full=path..name
- local mode=attributes(full,'mode')
- if mode=='file' then
- if find(full,patt) then
- action(full)
+local function glob_pattern_table(path,patt,recurse,result)
+ if not result then
+ result={}
+ end
+ if isdir(path) then
+ local usedpath
+ if path=="/" then
+ usedpath="/."
+ elseif not find(path,"/$") then
+ usedpath=path.."/."
+ path=path.."/"
+ else
+ usedpath=path
+ end
+ local dirs
+ for name in walkdir(usedpath) do
+ if name~="." and name~=".." then
+ local full=path..name
+ local mode=attributes(full,'mode')
+ if mode=='file' then
+ if not patt or find(full,patt) then
+ result[#result+1]=full
+ end
+ elseif recurse and mode=="directory" then
+ if not dirs then
+ dirs={ full }
+ else
+ dirs[#dirs+1]=full
+ end
end
- elseif recurse and (mode=="directory") and (name~='.') and (name~="..") then
- globpattern(full,patt,recurse,action)
end
end
+ if dirs then
+ for i=1,#dirs do
+ glob_pattern_table(dirs[i],patt,recurse,result)
+ end
+ end
+ end
+ return result
+end
+local function globpattern(path,patt,recurse,method)
+ local kind=type(method)
+ if patt and sub(patt,1,-3)==path then
+ patt=false
+ end
+ if kind=="function" then
+ return glob_pattern_function(path,patt,recurse,method)
+ elseif kind=="table" then
+ return glob_pattern_table(path,patt,recurse,method)
+ else
+ return glob_pattern_table(path,patt,recurse,{})
end
end
dir.globpattern=globpattern
@@ -3845,34 +4124,40 @@ local function collectpattern(path,patt,recurse,result)
ok,scanner,first=xpcall(function() return walkdir(path) end,function() end)
end
if ok and type(scanner)=="function" then
- if not find(path,"/$") then path=path..'/' end
+ if not find(path,"/$") then
+ path=path..'/'
+ end
for name in scanner,first do
- local full=path..name
- local attr=attributes(full)
- local mode=attr.mode
- if mode=='file' then
- if find(full,patt) then
+ if name=="." then
+ elseif name==".." then
+ else
+ local full=path..name
+ local attr=attributes(full)
+ local mode=attr.mode
+ if mode=='file' then
+ if find(full,patt) then
+ result[name]=attr
+ end
+ elseif recurse and mode=="directory" then
+ attr.list=collectpattern(full,patt,recurse)
result[name]=attr
end
- elseif recurse and (mode=="directory") and (name~='.') and (name~="..") then
- attr.list=collectpattern(full,patt,recurse)
- result[name]=attr
end
end
end
return result
end
dir.collectpattern=collectpattern
-local separator
-if onwindows then
+local separator,pattern
+if onwindows then
local slash=S("/\\")/"/"
- pattern=Ct {
+ pattern={
[1]=(Cs(P(".")+slash^1)+Cs(R("az","AZ")*P(":")*slash^0)+Cc("./"))*V(2)*V(3),
[2]=Cs(((1-S("*?/\\"))^0*slash)^0),
[3]=Cs(P(1)^0)
}
-else
- pattern=Ct {
+else
+ pattern={
[1]=(C(P(".")+P("/")^1)+Cc("./"))*V(2)*V(3),
[2]=C(((1-S("*?/"))^0*P("/"))^0),
[3]=C(P(1)^0)
@@ -3890,9 +4175,8 @@ local function glob(str,t)
elseif 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 root,path,base=lpegmatch(pattern,str)
+ if root and path and base then
local recurse=find(base,"**",1,true)
local start=root..path
local result=lpegmatch(filter,start..base)
@@ -3914,16 +4198,12 @@ local function glob(str,t)
return { str }
end
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 root,path,base=lpegmatch(pattern,str)
+ if root and path and base then
local recurse=find(base,"**",1,true)
local start=root..path
local result=lpegmatch(filter,start..base)
- globpattern(start,result,recurse,action)
- return t
+ return globpattern(start,result,recurse,t)
else
return {}
end
@@ -4071,47 +4351,51 @@ else
end
end
dir.makedirs=dir.mkdirs
-if onwindows then
- function dir.expandname(str)
- 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()
+do
+ local chdir=sandbox and sandbox.original(chdir) or chdir
+ if onwindows then
+ local xcurrentdir=dir.current
+ function dir.expandname(str)
+ local first,nothing,last=match(str,"^(//)(//*)(.*)$")
+ if first then
+ first=xcurrentdir().."/"
+ 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=xcurrentdir()
+ end
+ chdir(d)
end
- chdir(d)
+ end
+ if not first then
+ first,last=xcurrentdir(),str
+ end
+ last=gsub(last,"//","/")
+ last=gsub(last,"/%./","/")
+ last=gsub(last,"^/*","")
+ first=gsub(first,"/*$","")
+ if last=="" or last=="." then
+ return first
+ else
+ return first.."/"..last
end
end
- if not first then
- first,last=dir.current(),str
- end
- last=gsub(last,"//","/")
- last=gsub(last,"/%./","/")
- last=gsub(last,"^/*","")
- first=gsub(first,"/*$","")
- if last=="" or last=="." then
- return first
- else
- return first.."/"..last
- end
- end
-else
- function dir.expandname(str)
- if not find(str,"^/") then
- str=currentdir().."/"..str
+ else
+ function dir.expandname(str)
+ if not find(str,"^/") then
+ str=currentdir().."/"..str
+ end
+ str=gsub(str,"//","/")
+ str=gsub(str,"/%./","/")
+ str=gsub(str,"(.)/%.$","%1")
+ return str
end
- str=gsub(str,"//","/")
- str=gsub(str,"/%./","/")
- str=gsub(str,"(.)/%.$","%1")
- return str
end
end
file.expandname=dir.expandname
@@ -4154,7 +4438,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-boolean"] = package.loaded["l-boolean"] or true
--- original size: 1809, stripped down to: 1527
+-- original size: 1850, stripped down to: 1568
if not modules then modules={} end modules ['l-boolean']={
version=1.001,
@@ -4208,11 +4492,11 @@ function string.booleanstring(str)
return str=="yes" or str=="on" or str=="t"
end
end
-function string.is_boolean(str,default)
+function string.is_boolean(str,default,strict)
if type(str)=="string" then
- if str=="true" or str=="yes" or str=="on" or str=="t" or str=="1" then
+ if str=="true" or str=="yes" or str=="on" or str=="t" or (not strict and str=="1") then
return true
- elseif str=="false" or str=="no" or str=="off" or str=="f" or str=="0" then
+ elseif str=="false" or str=="no" or str=="off" or str=="f" or (not strict and str=="0") then
return false
end
end
@@ -4226,7 +4510,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-unicode"] = package.loaded["l-unicode"] or true
--- original size: 33706, stripped down to: 14938
+-- original size: 37233, stripped down to: 15684
if not modules then modules={} end modules ['l-unicode']={
version=1.001,
@@ -4242,7 +4526,9 @@ local type=type
local char,byte,format,sub,gmatch=string.char,string.byte,string.format,string.sub,string.gmatch
local concat=table.concat
local P,C,R,Cs,Ct,Cmt,Cc,Carg,Cp=lpeg.P,lpeg.C,lpeg.R,lpeg.Cs,lpeg.Ct,lpeg.Cmt,lpeg.Cc,lpeg.Carg,lpeg.Cp
-local lpegmatch,patterns=lpeg.match,lpeg.patterns
+local lpegmatch=lpeg.match
+local patterns=lpeg.patterns
+local tabletopattern=lpeg.utfchartabletopattern
local bytepairs=string.bytepairs
local finder=lpeg.finder
local replacer=lpeg.replacer
@@ -4251,7 +4537,7 @@ local utfgmatch=utf.gmatch
local p_utftype=patterns.utftype
local p_utfstricttype=patterns.utfstricttype
local p_utfoffset=patterns.utfoffset
-local p_utf8char=patterns.utf8char
+local p_utf8char=patterns.utf8character
local p_utf8byte=patterns.utf8byte
local p_utfbom=patterns.utfbom
local p_newline=patterns.newline
@@ -4450,15 +4736,52 @@ if not utf.sub then
end
end
end
-function utf.remapper(mapping)
- local pattern=Cs((p_utf8char/mapping)^0)
- return function(str)
- if not str or str=="" then
- return ""
+function utf.remapper(mapping,option)
+ local variant=type(mapping)
+ if variant=="table" then
+ if option=="dynamic" then
+ local pattern=false
+ table.setmetatablenewindex(mapping,function(t,k,v) rawset(t,k,v) pattern=false end)
+ return function(str)
+ if not str or str=="" then
+ return ""
+ else
+ if not pattern then
+ pattern=Cs((tabletopattern(mapping)/mapping+p_utf8char)^0)
+ end
+ return lpegmatch(pattern,str)
+ end
+ end
+ elseif option=="pattern" then
+ return Cs((tabletopattern(mapping)/mapping+p_utf8char)^0)
else
- return lpegmatch(pattern,str)
+ local pattern=Cs((tabletopattern(mapping)/mapping+p_utf8char)^0)
+ return function(str)
+ if not str or str=="" then
+ return ""
+ else
+ return lpegmatch(pattern,str)
+ end
+ end,pattern
+ end
+ elseif variant=="function" then
+ if option=="pattern" then
+ return Cs((p_utf8char/mapping+p_utf8char)^0)
+ else
+ local pattern=Cs((p_utf8char/mapping+p_utf8char)^0)
+ return function(str)
+ if not str or str=="" then
+ return ""
+ else
+ return lpegmatch(pattern,str)
+ end
+ end,pattern
+ end
+ else
+ return function(str)
+ return str or ""
end
- end,pattern
+ end
end
function utf.replacer(t)
local r=replacer(t,false,false,true)
@@ -4508,190 +4831,157 @@ function utf.magic(f)
end
local utf16_to_utf8_be,utf16_to_utf8_le
local utf32_to_utf8_be,utf32_to_utf8_le
-local utf_16_be_linesplitter=patterns.utfbom_16_be^-1*lpeg.tsplitat(patterns.utf_16_be_nl)
-local utf_16_le_linesplitter=patterns.utfbom_16_le^-1*lpeg.tsplitat(patterns.utf_16_le_nl)
-if bytepairs then
- utf16_to_utf8_be=function(t)
- if type(t)=="string" then
- t=lpegmatch(utf_16_be_linesplitter,t)
- end
- local 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)
- end
- return t
+local utf_16_be_getbom=patterns.utfbom_16_be^-1
+local utf_16_le_getbom=patterns.utfbom_16_le^-1
+local utf_32_be_getbom=patterns.utfbom_32_be^-1
+local utf_32_le_getbom=patterns.utfbom_32_le^-1
+local utf_16_be_linesplitter=utf_16_be_getbom*lpeg.tsplitat(patterns.utf_16_be_nl)
+local utf_16_le_linesplitter=utf_16_le_getbom*lpeg.tsplitat(patterns.utf_16_le_nl)
+local utf_32_be_linesplitter=utf_32_be_getbom*lpeg.tsplitat(patterns.utf_32_be_nl)
+local utf_32_le_linesplitter=utf_32_le_getbom*lpeg.tsplitat(patterns.utf_32_le_nl)
+local more=0
+local p_utf16_to_utf8_be=C(1)*C(1)/function(left,right)
+ local now=256*byte(left)+byte(right)
+ if more>0 then
+ now=(more-0xD800)*0x400+(now-0xDC00)+0x10000
+ more=0
+ return utfchar(now)
+ elseif now>=0xD800 and now<=0xDBFF then
+ more=now
+ return ""
+ else
+ return utfchar(now)
+ end
+end
+local p_utf16_to_utf8_le=C(1)*C(1)/function(right,left)
+ local now=256*byte(left)+byte(right)
+ if more>0 then
+ now=(more-0xD800)*0x400+(now-0xDC00)+0x10000
+ more=0
+ return utfchar(now)
+ elseif now>=0xD800 and now<=0xDBFF then
+ more=now
+ return ""
+ else
+ return utfchar(now)
+ end
+end
+local p_utf32_to_utf8_be=C(1)*C(1)*C(1)*C(1)/function(a,b,c,d)
+ return utfchar(256*256*256*byte(a)+256*256*byte(b)+256*byte(c)+byte(d))
+end
+local p_utf32_to_utf8_le=C(1)*C(1)*C(1)*C(1)/function(a,b,c,d)
+ return utfchar(256*256*256*byte(d)+256*256*byte(c)+256*byte(b)+byte(a))
+end
+p_utf16_to_utf8_be=P(true)/function() more=0 end*utf_16_be_getbom*Cs(p_utf16_to_utf8_be^0)
+p_utf16_to_utf8_le=P(true)/function() more=0 end*utf_16_le_getbom*Cs(p_utf16_to_utf8_le^0)
+p_utf32_to_utf8_be=P(true)/function() more=0 end*utf_32_be_getbom*Cs(p_utf32_to_utf8_be^0)
+p_utf32_to_utf8_le=P(true)/function() more=0 end*utf_32_le_getbom*Cs(p_utf32_to_utf8_le^0)
+patterns.utf16_to_utf8_be=p_utf16_to_utf8_be
+patterns.utf16_to_utf8_le=p_utf16_to_utf8_le
+patterns.utf32_to_utf8_be=p_utf32_to_utf8_be
+patterns.utf32_to_utf8_le=p_utf32_to_utf8_le
+utf16_to_utf8_be=function(s)
+ if s and s~="" then
+ return lpegmatch(p_utf16_to_utf8_be,s)
+ else
+ return s
end
- utf16_to_utf8_le=function(t)
- if type(t)=="string" then
- t=lpegmatch(utf_16_le_linesplitter,t)
- end
- local 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)
- end
- return t
+end
+local utf16_to_utf8_be_t=function(t)
+ if not t then
+ return nil
+ elseif type(t)=="string" then
+ t=lpegmatch(utf_16_be_linesplitter,t)
end
- utf32_to_utf8_be=function(t)
- if type(t)=="string" then
- t=lpegmatch(utflinesplitter,t)
- end
- local result={}
- for i=1,#t do
- local r,more=0,-1
- for a,b in bytepairs(t[i]) do
- if a and b then
- if more<0 then
- more=256*256*256*a+256*256*b
- else
- r=r+1
- result[t]=utfchar(more+256*a+b)
- more=-1
- end
- else
- break
- end
- end
- t[i]=concat(result,"",1,r)
+ for i=1,#t do
+ local s=t[i]
+ if s~="" then
+ t[i]=lpegmatch(p_utf16_to_utf8_be,s)
end
- return t
end
- utf32_to_utf8_le=function(t)
- if type(t)=="string" then
- t=lpegmatch(utflinesplitter,t)
- end
- local result={}
- for i=1,#t do
- local r,more=0,-1
- for a,b in bytepairs(t[i]) do
- if a and b then
- if more<0 then
- more=256*b+a
- else
- r=r+1
- result[t]=utfchar(more+256*256*256*b+256*256*a)
- more=-1
- end
- else
- break
- end
- end
- t[i]=concat(result,"",1,r)
- end
- return t
+ return t
+end
+utf16_to_utf8_le=function(s)
+ if s and s~="" then
+ return lpegmatch(p_utf16_to_utf8_le,s)
+ else
+ return s
end
-else
- utf16_to_utf8_be=function(t)
- if type(t)=="string" then
- t=lpegmatch(utf_16_be_linesplitter,t)
- end
- local result={}
- for i=1,#t do
- local r,more=0,0
- for left,right in gmatch(t[i],"(.)(.)") do
- if left=="\000" then
- r=r+1
- result[r]=utfchar(byte(right))
- elseif right then
- local now=256*byte(left)+byte(right)
- if more>0 then
- now=(more-0xD800)*0x400+(now-0xDC00)+0x10000
- 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)
+end
+local utf16_to_utf8_le_t=function(t)
+ if not t then
+ return nil
+ elseif type(t)=="string" then
+ t=lpegmatch(utf_16_le_linesplitter,t)
+ end
+ for i=1,#t do
+ local s=t[i]
+ if s~="" then
+ t[i]=lpegmatch(p_utf16_to_utf8_le,s)
end
- return t
end
- utf16_to_utf8_le=function(t)
- if type(t)=="string" then
- t=lpegmatch(utf_16_le_linesplitter,t)
+ return t
+end
+utf32_to_utf8_be=function(s)
+ if s and s~="" then
+ return lpegmatch(p_utf32_to_utf8_be,s)
+ else
+ return s
+ end
+end
+local utf32_to_utf8_be_t=function(t)
+ if not t then
+ return nil
+ elseif type(t)=="string" then
+ t=lpegmatch(utf_32_be_linesplitter,t)
+ end
+ for i=1,#t do
+ local s=t[i]
+ if s~="" then
+ t[i]=lpegmatch(p_utf32_to_utf8_be,s)
end
- local result={}
- for i=1,#t do
- local r,more=0,0
- for left,right in gmatch(t[i],"(.)(.)") do
- if right=="\000" then
- r=r+1
- result[r]=utfchar(byte(left))
- elseif right then
- local now=256*byte(right)+byte(left)
- if more>0 then
- now=(more-0xD800)*0x400+(now-0xDC00)+0x10000
- 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)
+ end
+ return t
+end
+utf32_to_utf8_le=function(s)
+ if s and s~="" then
+ return lpegmatch(p_utf32_to_utf8_le,s)
+ else
+ return s
+ end
+end
+local utf32_to_utf8_le_t=function(t)
+ if not t then
+ return nil
+ elseif type(t)=="string" then
+ t=lpegmatch(utf_32_le_linesplitter,t)
+ end
+ for i=1,#t do
+ local s=t[i]
+ if s~="" then
+ t[i]=lpegmatch(p_utf32_to_utf8_le,s)
end
- return t
end
- utf32_to_utf8_le=function() return {} end
- utf32_to_utf8_be=function() return {} end
+ return t
end
+utf.utf16_to_utf8_le_t=utf16_to_utf8_le_t
+utf.utf16_to_utf8_be_t=utf16_to_utf8_be_t
+utf.utf32_to_utf8_le_t=utf32_to_utf8_le_t
+utf.utf32_to_utf8_be_t=utf32_to_utf8_be_t
utf.utf16_to_utf8_le=utf16_to_utf8_le
utf.utf16_to_utf8_be=utf16_to_utf8_be
utf.utf32_to_utf8_le=utf32_to_utf8_le
utf.utf32_to_utf8_be=utf32_to_utf8_be
-function utf.utf8_to_utf8(t)
+function utf.utf8_to_utf8_t(t)
return type(t)=="string" and lpegmatch(utflinesplitter,t) or t
end
-function utf.utf16_to_utf8(t,endian)
- return endian and utf16_to_utf8_be(t) or utf16_to_utf8_le(t) or t
+function utf.utf16_to_utf8_t(t,endian)
+ return endian and utf16_to_utf8_be_t(t) or utf16_to_utf8_le_t(t) or t
end
-function utf.utf32_to_utf8(t,endian)
- return endian and utf32_to_utf8_be(t) or utf32_to_utf8_le(t) or t
+function utf.utf32_to_utf8_t(t,endian)
+ return endian and utf32_to_utf8_be_t(t) or utf32_to_utf8_le_t(t) or t
end
-local function little(c)
- local b=byte(c)
+local function little(b)
if b<0x10000 then
return char(b%256,b/256)
else
@@ -4700,8 +4990,7 @@ local function little(c)
return char(b1%256,b1/256,b2%256,b2/256)
end
end
-local function big(c)
- local b=byte(c)
+local function big(b)
if b<0x10000 then
return char(b/256,b%256)
else
@@ -4710,27 +4999,29 @@ local function big(c)
return char(b1/256,b1%256,b2/256,b2%256)
end
end
-local _,l_remap=utf.remapper(little)
-local _,b_remap=utf.remapper(big)
-function utf.utf8_to_utf16_be(str,nobom)
+local l_remap=Cs((p_utf8byte/little+P(1)/"")^0)
+local b_remap=Cs((p_utf8byte/big+P(1)/"")^0)
+local function utf8_to_utf16_be(str,nobom)
if nobom then
return lpegmatch(b_remap,str)
else
return char(254,255)..lpegmatch(b_remap,str)
end
end
-function utf.utf8_to_utf16_le(str,nobom)
+local function utf8_to_utf16_le(str,nobom)
if nobom then
return lpegmatch(l_remap,str)
else
return char(255,254)..lpegmatch(l_remap,str)
end
end
+utf.utf8_to_utf16_be=utf8_to_utf16_be
+utf.utf8_to_utf16_le=utf8_to_utf16_le
function utf.utf8_to_utf16(str,littleendian,nobom)
if littleendian then
- return utf.utf8_to_utf16_le(str,nobom)
+ return utf8_to_utf16_le(str,nobom)
else
- return utf.utf8_to_utf16_be(str,nobom)
+ return utf8_to_utf16_be(str,nobom)
end
end
local pattern=Cs (
@@ -4746,16 +5037,16 @@ function utf.xstring(s)
return format("0x%05X",type(s)=="number" and s or utfbyte(s))
end
function utf.toeight(str)
- if not str then
+ if not str or str=="" then
return nil
end
local utftype=lpegmatch(p_utfstricttype,str)
if utftype=="utf-8" then
- return sub(str,4)
- elseif utftype=="utf-16-le" then
- return utf16_to_utf8_le(str)
+ return sub(str,4)
elseif utftype=="utf-16-be" then
- return utf16_to_utf8_ne(str)
+ return utf16_to_utf8_be(str)
+ elseif utftype=="utf-16-le" then
+ return utf16_to_utf8_le(str)
else
return str
end
@@ -4834,7 +5125,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-math"] = package.loaded["l-math"] or true
--- original size: 915, stripped down to: 836
+-- original size: 974, stripped down to: 890
if not modules then modules={} end modules ['l-math']={
version=1.001,
@@ -4844,6 +5135,9 @@ if not modules then modules={} end modules ['l-math']={
license="see context related readme files"
}
local floor,sin,cos,tan=math.floor,math.sin,math.cos,math.tan
+if not math.ceiling then
+ math.ceiling=math.ceil
+end
if not math.round then
function math.round(x) return floor(x+0.5) end
end
@@ -4871,7 +5165,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-str"] = package.loaded["util-str"] or true
--- original size: 33063, stripped down to: 18397
+-- original size: 34407, stripped down to: 18852
if not modules then modules={} end modules ['util-str']={
version=1.001,
@@ -5001,10 +5295,12 @@ local striplinepatterns={
["retain"]=p_retain_normal,
["retain and collapse"]=p_retain_collapse,
["retain and no empty"]=p_retain_noempty,
+ ["collapse"]=patterns.collapser,
}
+setmetatable(striplinepatterns,{ __index=function(t,k) return p_prune_collapse end })
strings.striplinepatterns=striplinepatterns
function strings.striplines(str,how)
- return str and lpegmatch(how and striplinepatterns[how] or p_prune_collapse,str) or str
+ return str and lpegmatch(striplinepatterns[how],str) or str
end
strings.striplong=strings.striplines
function strings.nice(str)
@@ -5044,10 +5340,10 @@ string.tracedchars=tracedchars
strings.tracers=tracedchars
function string.tracedchar(b)
if type(b)=="number" then
- return tracedchars[b] or (utfchar(b).." (U+"..format('%05X',b)..")")
+ return tracedchars[b] or (utfchar(b).." (U+"..format("%05X",b)..")")
else
local c=utfbyte(b)
- return tracedchars[c] or (b.." (U+"..format('%05X',c)..")")
+ return tracedchars[c] or (b.." (U+"..(c and format("%05X",c) or "?????")..")")
end
end
function number.signed(i)
@@ -5184,12 +5480,12 @@ local format_f=function(f)
n=n+1
return format("format('%%%sf',a%s)",f,n)
end
-local format_F=function(f)
+local format_F=function(f)
n=n+1
if not f or f=="" then
- return format("(((a%s > -0.0000000005 and a%s < 0.0000000005) and '0') or (a%s == 1 and '1') or format('%%.9f',a%s))",n,n,n,n)
+ return format("(((a%s > -0.0000000005 and a%s < 0.0000000005) and '0') or format((a%s %% 1 == 0) and '%%i' or '%%.9f',a%s))",n,n,n,n)
else
- return format("((a%s == 0 and '0') or (a%s == 1 and '1') or format('%%%sf',a%s))",n,n,f,n)
+ return format("format((a%s %% 1 == 0) and '%%i' or '%%%sf',a%s)",n,f,n)
end
end
local format_g=function(f)
@@ -5417,7 +5713,6 @@ local builder=Cs { "start",
+V("j")+V("J")
+V("m")+V("M")
+V("z")
-+V("*")
)+V("*")
)*(P(-1)+Carg(1))
)^0,
@@ -5461,6 +5756,7 @@ local builder=Cs { "start",
["a"]=(prefix_any*P("a"))/format_a,
["A"]=(prefix_any*P("A"))/format_A,
["*"]=Cs(((1-P("%"))^1+P("%%")/"%%")^1)/format_rest,
+ ["?"]=Cs(((1-P("%"))^1 )^1)/format_rest,
["!"]=Carg(2)*prefix_any*P("!")*C((1-P("!"))^1)*P("!")/format_extension,
}
local direct=Cs (
@@ -5535,6 +5831,15 @@ else
add(formatters,"tex",[[lpegmatch(texescape,%s)]],{ texescape=lpeg.patterns.texescape })
add(formatters,"lua",[[lpegmatch(luaescape,%s)]],{ luaescape=lpeg.patterns.luaescape })
end
+local dquote=patterns.dquote
+local equote=patterns.escaped+dquote/'\\"'+1
+local space=patterns.space
+local cquote=Cc('"')
+local pattern=Cs(dquote*(equote-P(-2))^0*dquote)
++Cs(cquote*(equote-space)^0*space*equote^0*cquote)
+function string.optionalquoted(str)
+ return lpegmatch(pattern,str) or str
+end
end -- of closure
@@ -5543,7 +5848,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tab"] = package.loaded["util-tab"] or true
--- original size: 23985, stripped down to: 16069
+-- original size: 24267, stripped down to: 16260
if not modules then modules={} end modules ['util-tab']={
version=1.001,
@@ -5633,6 +5938,15 @@ function tables.removevalue(t,value)
end
end
end
+function tables.replacevalue(t,oldvalue,newvalue)
+ if oldvalue and newvalue then
+ for i=1,#t do
+ if t[i]==oldvalue then
+ t[i]=newvalue
+ end
+ end
+ end
+end
function tables.insertbeforevalue(t,value,extra)
for i=1,#t do
if t[i]==extra then
@@ -6026,7 +6340,7 @@ function table.serialize(root,name,specification)
end
depth=depth+1
end
- if root and next(root) then
+ if root and next(root)~=nil then
local first=nil
local last=0
last=#root
@@ -6051,7 +6365,7 @@ function table.serialize(root,name,specification)
elseif tv=="string" then
n=n+1 t[n]=f_val_str(depth,v)
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
n=n+1 t[n]=f_val_not(depth)
else
local st=simple_table(v)
@@ -6081,7 +6395,7 @@ function table.serialize(root,name,specification)
n=n+1 t[n]=f_key_boo_value_str(depth,k,v)
end
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
if tk=="number" then
n=n+1 t[n]=f_key_num_value_not(depth,k,v)
elseif tk=="string" then
@@ -6139,7 +6453,7 @@ function table.serialize(root,name,specification)
local dummy=root._w_h_a_t_e_v_e_r_
root._w_h_a_t_e_v_e_r_=nil
end
- if next(root) then
+ if next(root)~=nil then
do_serialize(root,name,1,0)
end
end
@@ -6302,7 +6616,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-prs"] = package.loaded["util-prs"] or true
--- original size: 19618, stripped down to: 14012
+-- original size: 21751, stripped down to: 15108
if not modules then modules={} end modules ['util-prs']={
version=1.001,
@@ -6458,11 +6772,30 @@ function parsers.settings_to_array(str,strict)
return { str }
end
end
-local separator=space^0*comma*space^0
-local value=P(lbrace*C((nobrace+nestedbraces)^0)*rbrace)+C((nestedbraces+(1-(space^0*(comma+P(-1)))))^0)
-local withvalue=Carg(1)*value/function(f,s) return f(s) end
-local pattern_a=spaces*Ct(value*(separator*value)^0)
-local pattern_b=spaces*withvalue*(separator*withvalue)^0
+local cache_a={}
+local cache_b={}
+function parsers.groupedsplitat(symbol,withaction)
+ if not symbol then
+ symbol=","
+ end
+ local pattern=(withaction and cache_b or cache_a)[symbol]
+ if not pattern then
+ local symbols=S(symbol)
+ local separator=space^0*symbols*space^0
+ local value=P(lbrace*C((nobrace+nestedbraces)^0)*rbrace)+C((nestedbraces+(1-(space^0*(symbols+P(-1)))))^0)
+ if withaction then
+ local withvalue=Carg(1)*value/function(f,s) return f(s) end
+ pattern=spaces*withvalue*(separator*withvalue)^0
+ cache_b[symbol]=pattern
+ else
+ pattern=spaces*Ct(value*(separator*value)^0)
+ cache_a[symbol]=pattern
+ end
+ end
+ return pattern
+end
+local pattern_a=parsers.groupedsplitat(",",false)
+local pattern_b=parsers.groupedsplitat(",",true)
function parsers.stripped_settings_to_array(str)
if not str or str=="" then
return {}
@@ -6524,12 +6857,9 @@ function parsers.array_to_string(a,separator)
return ""
end
end
-function parsers.settings_to_set(str,t)
- t=t or {}
- for s in gmatch(str,"[^, ]+") do
- t[s]=true
- end
- return t
+local pattern=Cf(Ct("")*Cg(C((1-S(", "))^1)*S(", ")^0*Cc(true))^1,rawset)
+function utilities.parsers.settings_to_set(str,t)
+ return str and lpegmatch(pattern,str) or {}
end
function parsers.simple_hash_to_string(h,separator)
local t,tn={},0
@@ -6541,12 +6871,16 @@ function parsers.simple_hash_to_string(h,separator)
end
return concat(t,separator or ",")
end
-local str=C((1-whitespace-equal)^1)
+local str=Cs(lpegpatterns.unquoted)+C((1-whitespace-equal)^1)
local setting=Cf(Carg(1)*(whitespace^0*Cg(str*whitespace^0*(equal*whitespace^0*str+Cc(""))))^1,rawset)
local splitter=setting^1
function utilities.parsers.options_to_hash(str,target)
return str and lpegmatch(splitter,str,1,target or {}) or {}
end
+local splitter=lpeg.tsplitat(" ")
+function utilities.parsers.options_to_array(str)
+ return str and lpegmatch(splitter,str) or {}
+end
local value=P(lbrace*C((nobrace+nestedbraces)^0)*rbrace)+C(digit^1*lparent*(noparent+nestedparents)^1*rparent)+C((nestedbraces+(1-comma))^1)
local pattern_a=spaces*Ct(value*(separator*value)^0)
local function repeater(n,str)
@@ -6668,7 +7002,7 @@ function parsers.rfc4180splitter(specification)
local field=escaped+non_escaped+Cc("")
local record=Ct(field*(separator*field)^1)
local headerline=record*Cp()
- local wholeblob=Ct((newline^-1*record)^0)
+ local wholeblob=Ct((newline^(specification.strict and -1 or 1)*record)^0)
return function(data,getheader)
if getheader then
local header,position=lpegmatch(headerline,data)
@@ -6705,13 +7039,13 @@ function parsers.stepper(str,n,action)
lpegmatch(stepper,str,1,n,action or print)
end
end
-local pattern_math=Cs((P("%")/"\\percent "+P("^")*Cc("{")*lpegpatterns.integer*Cc("}")+P(1))^0)
-local pattern_text=Cs((P("%")/"\\percent "+(P("^")/"\\high")*Cc("{")*lpegpatterns.integer*Cc("}")+P(1))^0)
+local pattern_math=Cs((P("%")/"\\percent "+P("^")*Cc("{")*lpegpatterns.integer*Cc("}")+anything)^0)
+local pattern_text=Cs((P("%")/"\\percent "+(P("^")/"\\high")*Cc("{")*lpegpatterns.integer*Cc("}")+anything)^0)
patterns.unittotex=pattern
function parsers.unittotex(str,textmode)
return lpegmatch(textmode and pattern_text or pattern_math,str)
end
-local pattern=Cs((P("^")/"<sup>"*lpegpatterns.integer*Cc("</sup>")+P(1))^0)
+local pattern=Cs((P("^")/"<sup>"*lpegpatterns.integer*Cc("</sup>")+anything)^0)
function parsers.unittoxml(str)
return lpegmatch(pattern,str)
end
@@ -6783,6 +7117,18 @@ function utilities.parsers.runtime(time)
local seconds=mod(time,60)
return days,hours,minutes,seconds
end
+local spacing=whitespace^0
+local apply=P("->")
+local method=C((1-apply)^1)
+local token=lbrace*C((1-rbrace)^1)*rbrace+C(anything^1)
+local pattern=spacing*(method*spacing*apply+Carg(1))*spacing*token
+function utilities.parsers.splitmethod(str,default)
+ if str then
+ return lpegmatch(pattern,str,1,default or false)
+ else
+ return default or false,""
+ end
+end
end -- of closure
@@ -6872,7 +7218,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-set"] = package.loaded["trac-set"] or true
--- original size: 12365, stripped down to: 8799
+-- original size: 12482, stripped down to: 8864
if not modules then modules={} end modules ['trac-set']={
version=1.001,
@@ -6900,7 +7246,7 @@ function setters.initialize(filename,name,values)
local data=setter.data
if data then
for key,newvalue in next,values do
- local newvalue=is_boolean(newvalue,newvalue)
+ local newvalue=is_boolean(newvalue,newvalue,true)
local functions=data[key]
if functions then
local oldvalue=functions.value
@@ -6954,7 +7300,7 @@ local function set(t,what,newvalue)
elseif not value then
value=false
else
- value=is_boolean(value,value)
+ value=is_boolean(value,value,true)
end
w=topattern(w,true,true)
for name,functions in next,data do
@@ -7093,6 +7439,7 @@ function setters.new(name)
report=function(...) setters.report (setter,...) end,
enable=function(...) enable (setter,...) end,
disable=function(...) disable (setter,...) end,
+ reset=function(...) reset (setter,...) end,
register=function(...) register(setter,...) end,
list=function(...) list (setter,...) end,
show=function(...) show (setter,...) end,
@@ -7184,7 +7531,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-log"] = package.loaded["trac-log"] or true
--- original size: 25613, stripped down to: 16617
+-- original size: 29359, stripped down to: 20483
if not modules then modules={} end modules ['trac-log']={
version=1.001,
@@ -7193,15 +7540,18 @@ if not modules then modules={} end modules ['trac-log']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local next,type,select,print=next,type,select,print
local write_nl,write=texio and texio.write_nl or print,texio and texio.write or io.write
local format,gmatch,find=string.format,string.gmatch,string.find
local concat,insert,remove=table.concat,table.insert,table.remove
local topattern=string.topattern
-local next,type,select=next,type,select
local utfchar=utf.char
+local datetime=os.date
+local openfile=io.open
local setmetatableindex=table.setmetatableindex
local formatters=string.formatters
local texgetcount=tex and tex.getcount
+local variant="default"
logs=logs or {}
local logs=logs
local moreinfo=[[
@@ -7211,32 +7561,122 @@ 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
]]
-utilities.strings.formatters.add (
+formatters.add (
formatters,"unichr",
[["U+" .. format("%%05X",%s) .. " (" .. utfchar(%s) .. ")"]]
)
-utilities.strings.formatters.add (
+formatters.add (
formatters,"chruni",
[[utfchar(%s) .. " (U+" .. format("%%05X",%s) .. ")"]]
)
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,setlogfile,settimedlog,setprocessor,setformatters
+local direct,subdirect,writer,pushtarget,poptarget,setlogfile,settimedlog,setprocessor,setformatters,newline
if tex and (tex.jobname or tex.formatname) then
- local valueiskey={ __index=function(t,k) t[k]=k return k end }
- local target="term and log"
+ local function useluawrites()
+ local texio_write_nl=texio.write_nl
+ local texio_write=texio.write
+ local io_write=io.write
+ write_nl=function(target,...)
+ if not io_write then
+ io_write=io.write
+ end
+ if target=="term and log" then
+ texio_write_nl("log",...)
+ texio_write_nl("term","")
+ io_write(...)
+ elseif target=="log" then
+ texio_write_nl("log",...)
+ elseif target=="term" then
+ texio_write_nl("term","")
+ io_write(...)
+ elseif target~="none" then
+ texio_write_nl("log",target,...)
+ texio_write_nl("term","")
+ io_write(target,...)
+ end
+ end
+ write=function(target,...)
+ if not io_write then
+ io_write=io.write
+ end
+ if target=="term and log" then
+ texio_write("log",...)
+ io_write(...)
+ elseif target=="log" then
+ texio_write("log",...)
+ elseif target=="term" then
+ io_write(...)
+ elseif target~="none" then
+ texio_write("log",target,...)
+ io_write(target,...)
+ end
+ end
+ texio.write=write
+ texio.write_nl=write_nl
+ useluawrites=ignore
+ end
+ local whereto="both"
+ local target=nil
+ local targets=nil
+ local formats=table.setmetatableindex("self")
+ local translations=table.setmetatableindex("self")
+ local report_yes,subreport_yes,direct_yes,subdirect_yes,status_yes
+ local report_nop,subreport_nop,direct_nop,subdirect_nop,status_nop
+ local variants={
+ default={
+ formats={
+ report_yes=formatters["%-15s > %s\n"],
+ report_nop=formatters["%-15s >\n"],
+ direct_yes=formatters["%-15s > %s"],
+ direct_nop=formatters["%-15s >"],
+ subreport_yes=formatters["%-15s > %s > %s\n"],
+ subreport_nop=formatters["%-15s > %s >\n"],
+ subdirect_yes=formatters["%-15s > %s > %s"],
+ subdirect_nop=formatters["%-15s > %s >"],
+ status_yes=formatters["%-15s : %s\n"],
+ status_nop=formatters["%-15s :\n"],
+ },
+ targets={
+ logfile="log",
+ log="log",
+ file="log",
+ console="term",
+ terminal="term",
+ both="term and log",
+ },
+ },
+ ansi={
+ formats={
+ report_yes=formatters["%-15s > %s\n"],
+ report_nop=formatters["%-15s >\n"],
+ direct_yes=formatters["%-15s > %s"],
+ direct_nop=formatters["%-15s >"],
+ subreport_yes=formatters["%-15s > %s > %s\n"],
+ subreport_nop=formatters["%-15s > %s >\n"],
+ subdirect_yes=formatters["%-15s > %s > %s"],
+ subdirect_nop=formatters["%-15s > %s >"],
+ status_yes=formatters["%-15s : %s\n"],
+ status_nop=formatters["%-15s :\n"],
+ },
+ targets={
+ logfile="none",
+ log="none",
+ file="none",
+ console="term",
+ terminal="term",
+ both="term",
+ },
+ }
+ }
logs.flush=io.flush
- local formats={} setmetatable(formats,valueiskey)
- local translations={} setmetatable(translations,valueiskey)
writer=function(...)
write_nl(target,...)
end
newline=function()
write_nl(target,"\n")
end
- local report_yes=formatters["%-15s > %s\n"]
- local report_nop=formatters["%-15s >\n"]
report=function(a,b,c,...)
if c then
write_nl(target,report_yes(translations[a],formatters[formats[b]](c,...)))
@@ -7248,8 +7688,6 @@ if tex and (tex.jobname or tex.formatname) then
write_nl(target,"\n")
end
end
- local direct_yes=formatters["%-15s > %s"]
- local direct_nop=formatters["%-15s >"]
direct=function(a,b,c,...)
if c then
return direct_yes(translations[a],formatters[formats[b]](c,...))
@@ -7261,8 +7699,6 @@ if tex and (tex.jobname or tex.formatname) then
return ""
end
end
- local subreport_yes=formatters["%-15s > %s > %s\n"]
- local subreport_nop=formatters["%-15s > %s >\n"]
subreport=function(a,s,b,c,...)
if c then
write_nl(target,subreport_yes(translations[a],translations[s],formatters[formats[b]](c,...)))
@@ -7274,8 +7710,6 @@ if tex and (tex.jobname or tex.formatname) then
write_nl(target,"\n")
end
end
- local subdirect_yes=formatters["%-15s > %s > %s"]
- local subdirect_nop=formatters["%-15s > %s >"]
subdirect=function(a,s,b,c,...)
if c then
return subdirect_yes(translations[a],translations[s],formatters[formats[b]](c,...))
@@ -7287,8 +7721,6 @@ if tex and (tex.jobname or tex.formatname) then
return ""
end
end
- local status_yes=formatters["%-15s : %s\n"]
- local status_nop=formatters["%-15s :\n"]
status=function(a,b,c,...)
if c then
write_nl(target,status_yes(translations[a],formatters[formats[b]](c,...)))
@@ -7300,16 +7732,13 @@ if tex and (tex.jobname or tex.formatname) then
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
+ settarget=function(askedwhereto)
+ whereto=askedwhereto or whereto or "both"
+ target=targets[whereto]
+ if not target then
+ whereto="both"
+ target=targets[whereto]
+ end
if target=="term" or target=="term and log" then
logs.flush=io.flush
else
@@ -7338,21 +7767,74 @@ if tex and (tex.jobname or tex.formatname) then
writeline(target,f(...))
end
end
- setformatters=function(f)
- report_yes=f.report_yes or report_yes
- report_nop=f.report_nop or report_nop
- subreport_yes=f.subreport_yes or subreport_yes
- subreport_nop=f.subreport_nop or subreport_nop
- direct_yes=f.direct_yes or direct_yes
- direct_nop=f.direct_nop or direct_nop
- subdirect_yes=f.subdirect_yes or subdirect_yes
- subdirect_nop=f.subdirect_nop or subdirect_nop
- status_yes=f.status_yes or status_yes
- status_nop=f.status_nop or status_nop
- end
+ setformatters=function(specification)
+ local t=nil
+ local f=nil
+ local d=variants.default
+ if not specification then
+ elseif type(specification)=="table" then
+ t=specification.targets
+ f=specification.formats or specification
+ else
+ local v=variants[specification]
+ if v then
+ t=v.targets
+ f=v.formats
+ variant=specification
+ end
+ end
+ targets=t or d.targets
+ target=targets[whereto] or target
+ if f then
+ d=d.formats
+ else
+ f=d.formats
+ d=f
+ end
+ setmetatableindex(f,d)
+ report_yes=f.report_yes
+ report_nop=f.report_nop
+ subreport_yes=f.subreport_yes
+ subreport_nop=f.subreport_nop
+ direct_yes=f.direct_yes
+ direct_nop=f.direct_nop
+ subdirect_yes=f.subdirect_yes
+ subdirect_nop=f.subdirect_nop
+ status_yes=f.status_yes
+ status_nop=f.status_nop
+ if variant=="ansi" then
+ useluawrites()
+ end
+ settarget(whereto)
+ end
+ setformatters(variant)
setlogfile=ignore
settimedlog=ignore
else
+ local report_yes,subreport_yes,status_yes
+ local report_nop,subreport_nop,status_nop
+ local variants={
+ default={
+ formats={
+ report_yes=formatters["%-15s | %s"],
+ report_nop=formatters["%-15s |"],
+ subreport_yes=formatters["%-15s | %s | %s"],
+ subreport_nop=formatters["%-15s | %s |"],
+ status_yes=formatters["%-15s : %s\n"],
+ status_nop=formatters["%-15s :\n"],
+ },
+ },
+ ansi={
+ formats={
+ report_yes=formatters["%-15s | %s"],
+ report_nop=formatters["%-15s |"],
+ subreport_yes=formatters["%-15s | %s | %s"],
+ subreport_nop=formatters["%-15s | %s |"],
+ status_yes=formatters["%-15s : %s\n"],
+ status_nop=formatters["%-15s :\n"],
+ },
+ },
+ }
logs.flush=ignore
writer=function(s)
write_nl(s)
@@ -7360,8 +7842,6 @@ else
newline=function()
write_nl("\n")
end
- local report_yes=formatters["%-15s | %s"]
- local report_nop=formatters["%-15s |"]
report=function(a,b,c,...)
if c then
write_nl(report_yes(a,formatters[b](c,...)))
@@ -7373,8 +7853,6 @@ else
write_nl("")
end
end
- local subreport_yes=formatters["%-15s | %s | %s"]
- local subreport_nop=formatters["%-15s | %s |"]
subreport=function(a,sub,b,c,...)
if c then
write_nl(subreport_yes(a,sub,formatters[b](c,...)))
@@ -7386,8 +7864,6 @@ else
write_nl("")
end
end
- local status_yes=formatters["%-15s : %s\n"]
- local status_nop=formatters["%-15s :\n"]
status=function(a,b,c,...)
if c then
write_nl(status_yes(a,formatters[b](c,...)))
@@ -7412,14 +7888,34 @@ else
writeline(f(s))
end
end
- setformatters=function(f)
- report_yes=f.report_yes or report_yes
- report_nop=f.report_nop or report_nop
- subreport_yes=f.subreport_yes or subreport_yes
- subreport_nop=f.subreport_nop or subreport_nop
- status_yes=f.status_yes or status_yes
- status_nop=f.status_nop or status_nop
- end
+ setformatters=function(specification)
+ local f=nil
+ local d=variants.default
+ if specification then
+ if type(specification)=="table" then
+ f=specification.formats or specification
+ else
+ local v=variants[specification]
+ if v then
+ f=v.formats
+ end
+ end
+ end
+ if f then
+ d=d.formats
+ else
+ f=d.formats
+ d=f
+ end
+ setmetatableindex(f,d)
+ report_yes=f.report_yes
+ report_nop=f.report_nop
+ subreport_yes=f.subreport_yes
+ subreport_nop=f.subreport_nop
+ status_yes=f.status_yes
+ status_nop=f.status_nop
+ end
+ setformatters(variant)
setlogfile=function(name,keepopen)
if name and name~="" then
local localtime=os.localtime
@@ -7672,13 +8168,13 @@ end
local simple=logs.reporter("comment")
logs.simple=simple
logs.simpleline=simple
-function logs.setprogram () end
-function logs.extendbanner() end
-function logs.reportlines () end
-function logs.reportbanner() end
-function logs.reportline () end
-function logs.simplelines () end
-function logs.help () end
+logs.setprogram=ignore
+logs.extendbanner=ignore
+logs.reportlines=ignore
+logs.reportbanner=ignore
+logs.reportline=ignore
+logs.simplelines=ignore
+logs.help=ignore
local Carg,C,lpegmatch=lpeg.Carg,lpeg.C,lpeg.match
local p_newline=lpeg.patterns.newline
local linewise=(
@@ -7755,10 +8251,11 @@ function logs.application(t)
end
return t
end
-function logs.system(whereto,process,jobname,category,...)
- local message=formatters["%s %s => %s => %s => %s\r"](os.date("%d/%m/%y %H:%m:%S"),process,jobname,category,format(...))
+local f_syslog=formatters["%s %s => %s => %s => %s\r"]
+function logs.system(whereto,process,jobname,category,fmt,arg,...)
+ local message=f_syslog(datetime("%d/%m/%y %H:%m:%S"),process,jobname,category,arg==nil and fmt or format(fmt,arg,...))
for i=1,10 do
- local f=io.open(whereto,"a")
+ local f=openfile(whereto,"a")
if f then
f:write(message)
f:close()
@@ -7820,7 +8317,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-inf"] = package.loaded["trac-inf"] or true
--- original size: 7011, stripped down to: 5590
+-- original size: 6704, stripped down to: 5343
if not modules then modules={} end modules ['trac-inf']={
version=1.001,
@@ -7993,15 +8490,6 @@ function statistics.tracefunction(base,tag,...)
statistics.register(formatters["%s.%s"](tag,name),function() return serialize(stat,"calls") end)
end
end
-commands=commands or {}
-function commands.resettimer(name)
- resettiming(name or "whatever")
- starttiming(name or "whatever")
-end
-function commands.elapsedtime(name)
- stoptiming(name or "whatever")
- context(elapsedtime(name or "whatever"))
-end
end -- of closure
@@ -8568,7 +9056,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tpl"] = package.loaded["util-tpl"] or true
--- original size: 6251, stripped down to: 3488
+-- original size: 7100, stripped down to: 3978
if not modules then modules={} end modules ['util-tpl']={
version=1.001,
@@ -8610,7 +9098,7 @@ local sqlescape=lpeg.replacer {
{ "\r\n","\\n" },
{ "\r","\\n" },
}
-local sqlquoted=lpeg.Cs(lpeg.Cc("'")*sqlescape*lpeg.Cc("'"))
+local sqlquoted=Cs(Cc("'")*sqlescape*Cc("'"))
lpegpatterns.sqlescape=sqlescape
lpegpatterns.sqlquoted=sqlquoted
local luaescape=lpegpatterns.luaescape
@@ -8633,12 +9121,24 @@ local quotedescapers={
local luaescaper=escapers.lua
local quotedluaescaper=quotedescapers.lua
local function replacekeyunquoted(s,t,how,recurse)
- local escaper=how and escapers[how] or luaescaper
- return escaper(replacekey(s,t,how,recurse))
+ if how==false then
+ return replacekey(s,t,how,recurse)
+ else
+ local escaper=how and escapers[how] or luaescaper
+ return escaper(replacekey(s,t,how,recurse))
+ end
end
local function replacekeyquoted(s,t,how,recurse)
- local escaper=how and quotedescapers[how] or quotedluaescaper
- return escaper(replacekey(s,t,how,recurse))
+ if how==false then
+ return replacekey(s,t,how,recurse)
+ else
+ local escaper=how and quotedescapers[how] or quotedluaescaper
+ return escaper(replacekey(s,t,how,recurse))
+ end
+end
+local function replaceoptional(l,m,r,t,how,recurse)
+ local v=t[l]
+ return v and v~="" and lpegmatch(replacer,r,1,t,how or "lua",recurse or false) or ""
end
local single=P("%")
local double=P("%%")
@@ -8653,11 +9153,16 @@ local nolquoted=lquoted/''
local norquoted=rquoted/''
local nolquotedq=lquotedq/''
local norquotedq=rquotedq/''
-local key=nosingle*((C((1-nosingle )^1)*Carg(1)*Carg(2)*Carg(3))/replacekey )*nosingle
-local quoted=nolquotedq*((C((1-norquotedq)^1)*Carg(1)*Carg(2)*Carg(3))/replacekeyquoted )*norquotedq
-local unquoted=nolquoted*((C((1-norquoted )^1)*Carg(1)*Carg(2)*Carg(3))/replacekeyunquoted)*norquoted
+local noloptional=P("%?")/''
+local noroptional=P("?%")/''
+local nomoptional=P(":")/''
+local args=Carg(1)*Carg(2)*Carg(3)
+local key=nosingle*((C((1-nosingle )^1)*args)/replacekey )*nosingle
+local quoted=nolquotedq*((C((1-norquotedq )^1)*args)/replacekeyquoted )*norquotedq
+local unquoted=nolquoted*((C((1-norquoted )^1)*args)/replacekeyunquoted)*norquoted
+local optional=noloptional*((C((1-nomoptional)^1)*nomoptional*C((1-noroptional)^1)*args)/replaceoptional)*noroptional
local any=P(1)
- replacer=Cs((unquoted+quoted+escape+key+any)^0)
+ replacer=Cs((unquoted+quoted+escape+optional+key+any)^0)
local function replace(str,mapping,how,recurse)
if mapping and str then
return lpegmatch(replacer,str,1,mapping,how or "lua",recurse or false) or str
@@ -8696,7 +9201,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-env"] = package.loaded["util-env"] or true
--- original size: 8814, stripped down to: 5092
+-- original size: 8022, stripped down to: 5038
if not modules then modules={} end modules ['util-env']={
version=1.001,
@@ -8707,7 +9212,7 @@ if not modules then modules={} end modules ['util-env']={
}
local allocate,mark=utilities.storage.allocate,utilities.storage.mark
local format,sub,match,gsub,find=string.format,string.sub,string.match,string.gsub,string.find
-local unquoted,quoted=string.unquoted,string.quoted
+local unquoted,quoted,optionalquoted=string.unquoted,string.quoted,string.optionalquoted
local concat,insert,remove=table.concat,table.insert,table.remove
environment=environment or {}
local environment=environment
@@ -8820,24 +9325,14 @@ function environment.splitarguments(separator)
return before,after
end
function environment.reconstructcommandline(arg,noquote)
+ local resolveprefix=resolvers.resolve
arg=arg or environment.originalarguments
if noquote and #arg==1 then
- local a=arg[1]
- a=resolvers.resolve(a)
- a=unquoted(a)
- return a
+ return unquoted(resolveprefix and resolveprefix(arg[1]) or arg[1])
elseif #arg>0 then
local result={}
for i=1,#arg do
- local a=arg[i]
- a=resolvers.resolve(a)
- a=unquoted(a)
- a=gsub(a,'"','\\"')
- if find(a," ",1,true) then
- result[#result+1]=quoted(a)
- else
- result[#result+1]=a
- end
+ result[i]=optionalquoted(resolveprefix and resolveprefix(arg[i]) or resolveprefix)
end
return concat(result," ")
else
@@ -9046,7 +9541,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-tab"] = package.loaded["lxml-tab"] or true
--- original size: 42614, stripped down to: 26694
+-- original size: 43882, stripped down to: 26870
if not modules then modules={} end modules ['lxml-tab']={
version=1.001,
@@ -9061,10 +9556,10 @@ if lpeg.setmaxstack then lpeg.setmaxstack(1000) end
xml=xml or {}
local xml=xml
local concat,remove,insert=table.concat,table.remove,table.insert
-local type,next,setmetatable,getmetatable,tonumber=type,next,setmetatable,getmetatable,tonumber
+local type,next,setmetatable,getmetatable,tonumber,rawset=type,next,setmetatable,getmetatable,tonumber,rawset
local lower,find,match,gsub=string.lower,string.find,string.match,string.gsub
local utfchar=utf.char
-local lpegmatch=lpeg.match
+local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns
local P,S,R,C,V,C,Cs=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.V,lpeg.C,lpeg.Cs
local formatters=string.formatters
xml.xmlns=xml.xmlns or {}
@@ -9226,9 +9721,10 @@ local function fromdec(s)
return formatters["d:%s"](s),true
end
end
-local rest=(1-P(";"))^0
-local many=P(1)^0
-local parsedentity=P("&")*(P("#x")*(rest/fromhex)+P("#")*(rest/fromdec))*P(";")*P(-1)+(P("#x")*(many/fromhex)+P("#")*(many/fromdec))
+local p_rest=(1-P(";"))^0
+local p_many=P(1)^0
+local p_char=lpegpatterns.utf8character
+local parsedentity=P("&")*(P("#x")*(p_rest/fromhex)+P("#")*(p_rest/fromdec))*P(";")*P(-1)+(P("#x")*(p_many/fromhex)+P("#")*(p_many/fromdec))
local predefined_unified={
[38]="&amp;",
[42]="&quot;",
@@ -9254,7 +9750,9 @@ local privates_u={
local privates_p={}
local privates_n={
}
-local escaped=utf.remapper(privates_u)
+local escaped=utf.remapper(privates_u,"dynamic")
+local unprivatized=utf.remapper(privates_p,"dynamic")
+xml.unprivatized=unprivatized
local function unescaped(s)
local p=privates_n[s]
if not p then
@@ -9267,9 +9765,7 @@ local function unescaped(s)
end
return p
end
-local unprivatized=utf.remapper(privates_p)
xml.privatetoken=unescaped
-xml.unprivatized=unprivatized
xml.privatecodes=privates_n
local function handle_hex_entity(str)
local h=hcache[str]
@@ -9422,7 +9918,7 @@ local valid=R('az','AZ','09')+S('_-.')
local name_yes=C(valid^1)*colon*C(valid^1)
local name_nop=C(P(true))*C(valid^1)
local name=name_yes+name_nop
-local utfbom=lpeg.patterns.utfbom
+local utfbom=lpegpatterns.utfbom
local spacing=C(space^0)
local anyentitycontent=(1-open-semicolon-space-close)^0
local hexentitycontent=R("AF","af","09")^0
@@ -9590,7 +10086,7 @@ local function _xmlconvert_(data,settings)
reported_attribute_errors,mt,errorhandler=nil,nil,nil
return result
end
-function xmlconvert(data,settings)
+local function xmlconvert(data,settings)
local ok,result=pcall(function() return _xmlconvert_(data,settings) end)
if ok then
return result
@@ -9682,14 +10178,17 @@ function xml.checkbom(root)
insert(dt,2,"\n" )
end
end
-local function verbose_element(e,handlers)
+local f_attribute=formatters['%s=%q']
+local function verbose_element(e,handlers,escape)
local handle=handlers.handle
local serialize=handlers.serialize
local ens,etg,eat,edt,ern=e.ns,e.tg,e.at,e.dt,e.rn
local ats=eat and next(eat) and {}
if ats then
+ local n=0
for k,v in next,eat do
- ats[#ats+1]=formatters['%s=%q'](k,escaped(v))
+ n=n+1
+ ats[n]=f_attribute(k,escaped(v))
end
end
if ern and trace_entities and ern~=ens then
@@ -10033,7 +10532,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-lpt"] = package.loaded["lxml-lpt"] or true
--- original size: 48030, stripped down to: 30595
+-- original size: 48229, stripped down to: 30684
if not modules then modules={} end modules ['lxml-lpt']={
version=1.001,
@@ -10418,8 +10917,8 @@ 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")+S("-_:"))^1)*Cc("'])")
-lp_fastpos_p=P("+")^0*R("09")^1*P(-1)/"l==%0"
-lp_fastpos_n=P("-")*R("09")^1*P(-1)/"(%0<0 and (#list+%0==l))"
+local lp_fastpos_p=P("+")^0*R("09")^1*P(-1)/"l==%0"
+local lp_fastpos_n=P("-")*R("09")^1*P(-1)/"(%0<0 and (#list+%0==l))"
local lp_fastpos=lp_fastpos_n+lp_fastpos_p
local lp_reserved=C("and")+C("or")+C("not")+C("div")+C("mod")+C("true")+C("false")
local lp_lua_function=Cs((R("az","AZ","__")^1*(P(".")*R("az","AZ","__")^1)^1)*("("))/"%0"
@@ -10598,7 +11097,7 @@ local function nodesettostring(set,nodetest)
if not ns or ns=="" then ns="*" end
if not tg or tg=="" then tg="*" end
tg=(tg=="@rt@" and "[root]") or format("%s:%s",ns,tg)
- t[i]=(directive and tg) or format("not(%s)",tg)
+ t[#t+1]=(directive and tg) or format("not(%s)",tg)
end
if nodetest==false then
return format("not(%s)",concat(t,"|"))
@@ -10864,7 +11363,6 @@ expressions.print=function(...)
print(...)
return true
end
-expressions.contains=find
expressions.find=find
expressions.upper=upper
expressions.lower=lower
@@ -10886,6 +11384,9 @@ function expressions.contains(str,pattern)
end
return false
end
+function xml.expressions.idstring(str)
+ return type(str)=="string" and gsub(str,"^#","") or ""
+end
local function traverse(root,pattern,handle)
local collected=applylpath(root,pattern)
if collected then
@@ -11173,7 +11674,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-aux"] = package.loaded["lxml-aux"] or true
--- original size: 23804, stripped down to: 16817
+-- original size: 28225, stripped down to: 20125
if not modules then modules={} end modules ['lxml-aux']={
version=1.001,
@@ -11183,16 +11684,19 @@ if not modules then modules={} end modules ['lxml-aux']={
license="see context related readme files"
}
local trace_manipulations=false trackers.register("lxml.manipulations",function(v) trace_manipulations=v end)
+local trace_inclusions=false trackers.register("lxml.inclusions",function(v) trace_inclusions=v end)
local report_xml=logs.reporter("xml")
local xml=xml
-local xmlconvert,xmlcopy,xmlname=xml.convert,xml.copy,xml.name
+local xmlcopy,xmlname=xml.copy,xml.name
local xmlinheritedconvert=xml.inheritedconvert
local xmlapplylpath=xml.applylpath
local xmlfilter=xml.filter
-local type,setmetatable,getmetatable=type,setmetatable,getmetatable
+local type,next,setmetatable,getmetatable=type,next,setmetatable,getmetatable
local insert,remove,fastcopy,concat=table.insert,table.remove,table.fastcopy,table.concat
local gmatch,gsub,format,find,strip=string.gmatch,string.gsub,string.format,string.find,string.strip
local utfbyte=utf.byte
+local lpegmatch=lpeg.match
+local striplinepatterns=utilities.strings.striplinepatterns
local function report(what,pattern,c,e)
report_xml("%s element %a, root %a, position %a, index %a, pattern %a",what,xmlname(e),xmlname(e.__p__),c,e.ni,pattern)
end
@@ -11247,13 +11751,15 @@ end
function xml.each(root,pattern,handle,reverse)
local collected=xmlapplylpath(root,pattern)
if collected then
- if reverse then
- for c=#collected,1,-1 do
- handle(collected[c])
- end
- else
- for c=1,#collected do
- handle(collected[c])
+ if handle then
+ if reverse then
+ for c=#collected,1,-1 do
+ handle(collected[c])
+ end
+ else
+ for c=1,#collected do
+ handle(collected[c])
+ end
end
end
return collected
@@ -11309,6 +11815,7 @@ local function redo_ni(d)
end
end
end
+xml.reindex=redo_ni
local function xmltoelement(whatever,root)
if not whatever then
return nil
@@ -11360,8 +11867,16 @@ function xml.delete(root,pattern)
report('deleting',pattern,c,e)
end
local d=p.dt
- remove(d,e.ni)
- redo_ni(d)
+ local ni=e.ni
+ if ni<=#d then
+ if false then
+ p.dt[ni]=""
+ else
+ remove(d,ni)
+ redo_ni(d)
+ end
+ else
+ end
end
end
end
@@ -11481,28 +11996,40 @@ 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)
+local function include(xmldata,pattern,attribute,recursive,loaddata,level)
pattern=pattern or 'include'
loaddata=loaddata or io.loaddata
local collected=xmlapplylpath(xmldata,pattern)
if collected then
+ if not level then
+ level=1
+ end
for c=1,#collected do
local ek=collected[c]
local name=nil
local ekdt=ek.dt
local ekat=ek.at
- local epdt=ek.__p__.dt
+ local ekrt=ek.__p__
+ local epdt=ekrt.dt
if not attribute or attribute=="" then
name=(type(ekdt)=="table" and ekdt[1]) or ekdt
end
if not name then
for a in gmatch(attribute or "href","([^|]+)") do
name=ekat[a]
- if name then break end
+ if name then
+ break
+ end
+ end
+ end
+ local data=nil
+ if name and name~="" then
+ data=loaddata(name) or ""
+ if trace_inclusions then
+ report_xml("including %s bytes from %a at level %s by pattern %a and attribute %a (%srecursing)",#data,name,level,pattern,attribute or "",recursive and "" or "not ")
end
end
- local data=(name and name~="" and loaddata(name)) or ""
- if data=="" then
+ if not data or data=="" then
epdt[ek.ni]=""
elseif ekat["parse"]=="text" then
epdt[ek.ni]=xml.escaped(data)
@@ -11512,70 +12039,113 @@ local function include(xmldata,pattern,attribute,recursive,loaddata)
epdt[ek.ni]=""
else
if recursive then
- include(xi,pattern,attribute,recursive,loaddata)
+ include(xi,pattern,attribute,recursive,loaddata,level+1)
+ end
+ local child=xml.body(xi)
+ child.__p__=ekrt
+ child.__f__=name
+ epdt[ek.ni]=child
+ local inclusions=xmldata.settings.inclusions
+ if inclusions then
+ inclusions[#inclusions+1]=name
+ else
+ xmldata.settings.inclusions={ name }
end
- epdt[ek.ni]=xml.body(xi)
end
end
end
end
end
xml.include=include
+function xml.inclusion(e,default)
+ while e do
+ local f=e.__f__
+ if f then
+ return f
+ else
+ e=e.__p__
+ end
+ end
+ return default
+end
+function xml.inclusions(e,sorted)
+ while e do
+ local settings=e.settings
+ if settings then
+ local inclusions=settings.inclusions
+ if inclusions then
+ inclusions=table.unique(inclusions)
+ if sorted then
+ table.sort(inclusions)
+ end
+ return inclusions
+ else
+ e=e.__p__
+ end
+ else
+ e=e.__p__
+ end
+ end
+end
+local b_collapser=lpeg.patterns.b_collapser
+local m_collapser=lpeg.patterns.m_collapser
+local e_collapser=lpeg.patterns.e_collapser
+local b_stripper=lpeg.patterns.b_stripper
+local m_stripper=lpeg.patterns.m_stripper
+local e_stripper=lpeg.patterns.e_stripper
+local lpegmatch=lpeg.match
local function stripelement(e,nolines,anywhere)
local edt=e.dt
if edt then
- if anywhere then
- local t,n={},0
- for e=1,#edt do
+ local n=#edt
+ if n==0 then
+ return e
+ elseif anywhere then
+ local t={}
+ local m=0
+ for e=1,n do
local str=edt[e]
if type(str)~="string" then
- n=n+1
- t[n]=str
+ m=m+1
+ t[m]=str
elseif str~="" then
if nolines then
- str=gsub(str,"%s+"," ")
+ str=lpegmatch((n==1 and b_collapser) or (n==m and e_collapser) or m_collapser,str)
+ else
+ str=lpegmatch((n==1 and b_stripper) or (n==m and e_stripper) or m_stripper,str)
end
- str=gsub(str,"^%s*(.-)%s*$","%1")
if str~="" then
- n=n+1
- t[n]=str
+ m=m+1
+ t[m]=str
end
end
end
e.dt=t
else
- if #edt>0 then
- local str=edt[1]
- if type(str)~="string" then
- elseif str=="" then
+ local str=edt[1]
+ if type(str)=="string" then
+ if str~="" then
+ str=lpegmatch(nolines and b_collapser or b_stripper,str)
+ end
+ if str=="" then
remove(edt,1)
+ n=n-1
else
- if nolines then
- str=gsub(str,"%s+"," ")
- end
- str=gsub(str,"^%s+","")
- if str=="" then
- remove(edt,1)
- else
- edt[1]=str
- end
+ edt[1]=str
end
end
- local nedt=#edt
- if nedt>0 then
- local str=edt[nedt]
- if type(str)~="string" then
- elseif str=="" then
- remove(edt)
- else
- if nolines then
- str=gsub(str,"%s+"," ")
- end
- str=gsub(str,"%s+$","")
+ if n>0 then
+ str=edt[n]
+ if type(str)=="string" then
if str=="" then
remove(edt)
else
- edt[nedt]=str
+ str=lpegmatch(nolines and e_collapser or e_stripper,str)
+ if str=="" then
+ remove(edt)
+ else
+ edt[n]=str
+ end
end
end
end
@@ -11761,8 +12331,8 @@ function xml.finalizers.xml.cdata(collected)
end
return ""
end
-function xml.insertcomment(e,str,n)
- table.insert(e.dt,n or 1,{
+function xml.insertcomment(e,str,n)
+ insert(e.dt,n or 1,{
tg="@cm@",
ns="",
special=true,
@@ -11770,7 +12340,25 @@ function xml.insertcomment(e,str,n)
dt={ str },
})
end
-function xml.setcdata(e,str)
+function xml.insertcdata(e,str,n)
+ insert(e.dt,n or 1,{
+ tg="@cd@",
+ ns="",
+ special=true,
+ at={},
+ dt={ str },
+ })
+end
+function xml.setcomment(e,str,n)
+ e.dt={ {
+ tg="@cm@",
+ ns="",
+ special=true,
+ at={},
+ dt={ str },
+ } }
+end
+function xml.setcdata(e,str)
e.dt={ {
tg="@cd@",
ns="",
@@ -11840,7 +12428,7 @@ local function recurse(e,action)
for i=1,#edt do
local str=edt[i]
if type(str)~="string" then
- recurse(str,action,recursive)
+ recurse(str,action)
elseif str~="" then
edt[i]=action(str)
end
@@ -11858,6 +12446,65 @@ function helpers.recursetext(collected,action,recursive)
end
end
end
+local specials={
+ ["@rt@"]="root",
+ ["@pi@"]="instruction",
+ ["@cm@"]="comment",
+ ["@dt@"]="declaration",
+ ["@cd@"]="cdata",
+}
+local function convert(x,strip,flat)
+ local ns=x.ns
+ local tg=x.tg
+ local at=x.at
+ local dt=x.dt
+ local node=flat and {
+ [0]=(not x.special and (ns~="" and ns..":"..tg or tg)) or nil,
+ } or {
+ _namespace=ns~="" and ns or nil,
+ _tag=not x.special and tg or nil,
+ _type=specials[tg] or "_element",
+ }
+ if at then
+ for k,v in next,at do
+ node[k]=v
+ end
+ end
+ local n=0
+ for i=1,#dt do
+ local di=dt[i]
+ if type(di)=="table" then
+ if flat and di.special then
+ else
+ di=convert(di,strip,flat)
+ if di then
+ n=n+1
+ node[n]=di
+ end
+ end
+ elseif strip then
+ di=lpegmatch(strip,di)
+ if di~="" then
+ n=n+1
+ node[n]=di
+ end
+ else
+ n=n+1
+ node[n]=di
+ end
+ end
+ if next(node) then
+ return node
+ end
+end
+function xml.totable(x,strip,flat)
+ if type(x)=="table" then
+ if strip then
+ strip=striplinepatterns[strip]
+ end
+ return convert(x,strip,flat)
+ end
+end
end -- of closure
@@ -12414,7 +13061,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-ini"] = package.loaded["data-ini"] or true
--- original size: 7927, stripped down to: 5528
+-- original size: 11085, stripped down to: 7662
if not modules then modules={} end modules ['data-ini']={
version=1.001,
@@ -12423,14 +13070,15 @@ if not modules then modules={} end modules ['data-ini']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files",
}
+local next,type,getmetatable,rawset=next,type,getmetatable,rawset
local gsub,find,gmatch,char=string.gsub,string.find,string.gmatch,string.char
-local next,type=next,type
local filedirname,filebasename,filejoin=file.dirname,file.basename,file.join
+local ostype,osname,osuname,ossetenv,osgetenv=os.type,os.name,os.uname,os.setenv,os.getenv
+local P,S,R,C,Cs,Cc,lpegmatch=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local trace_detail=false trackers.register("resolvers.details",function(v) trace_detail=v end)
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
resolvers=resolvers or {}
local resolvers=resolvers
texconfig.kpse_init=false
@@ -12563,10 +13211,103 @@ if type(profiler)=="table" and not jit then
profiler.start("luatex-profile.log")
end)
end
-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
+local prefixes=utilities.storage.allocate()
+resolvers.prefixes=prefixes
+local resolved={}
+local abstract={}
+local dynamic={}
+function resolvers.resetresolve(str)
+ resolved,abstract={},{}
+end
+function resolvers.allprefixes(separator)
+ local all=table.sortedkeys(prefixes)
+ if separator then
+ for i=1,#all do
+ all[i]=all[i]..":"
+ end
+ end
+ return all
+end
+local function _resolve_(method,target)
+ local action=prefixes[method]
+ if action then
+ return action(target)
+ else
+ return method..":"..target
+ end
+end
+function resolvers.unresolve(str)
+ return abstract[str] or str
+end
+function resolvers.setdynamic(str)
+ dynamic[str]=true
+end
+local pattern=Cs((C(R("az")^2)*P(":")*C((1-S(" \"\';,"))^1)/_resolve_+P(1))^0)
+local prefix=C(R("az")^2)*P(":")
+local target=C((1-S(" \"\';,"))^1)
+local notarget=(#S(";,")+P(-1))*Cc("")
+local p_resolve=Cs(((prefix*(target+notarget))/_resolve_+P(1))^0)
+local p_simple=prefix*P(-1)
+local function resolve(str)
+ if type(str)=="table" then
+ local res={}
+ for i=1,#str do
+ res[i]=resolve(str[i])
+ end
+ return res
+ end
+ local res=resolved[str]
+ if res then
+ return res
+ end
+ local simple=lpegmatch(p_simple,str)
+ local action=prefixes[simple]
+ if action then
+ local res=action(res)
+ if not dynamic[simple] then
+ resolved[simple]=res
+ abstract[res]=simple
+ end
+ return res
+ end
+ res=lpegmatch(p_resolve,str)
+ resolved[str]=res
+ abstract[res]=str
+ return res
+end
+resolvers.resolve=resolve
+if type(osuname)=="function" then
+ for k,v in next,osuname() do
+ if not prefixes[k] then
+ prefixes[k]=function() return v end
+ end
+ end
+end
+if ostype=="unix" then
+ local pattern
+ local function makepattern(t,k,v)
+ if t then
+ rawset(t,k,v)
+ end
+ local colon=P(":")
+ for k,v in table.sortedpairs(prefixes) do
+ if p then
+ p=P(k)+p
+ else
+ p=P(k)
+ end
+ end
+ pattern=Cs((p*colon+colon/";"+P(1))^0)
+ end
+ makepattern()
+ table.setmetatablenewindex(prefixes,makepattern)
+ function resolvers.repath(str)
+ return lpegmatch(pattern,str)
+ end
+else
+ function resolvers.repath(str)
+ return str
+ end
end
@@ -12576,7 +13317,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-exp"] = package.loaded["data-exp"] or true
--- original size: 15317, stripped down to: 9723
+-- original size: 17216, stripped down to: 10657
if not modules then modules={} end modules ['data-exp']={
version=1.001,
@@ -12590,12 +13331,16 @@ local concat,sort=table.concat,table.sort
local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns
local Ct,Cs,Cc,Carg,P,C,S=lpeg.Ct,lpeg.Cs,lpeg.Cc,lpeg.Carg,lpeg.P,lpeg.C,lpeg.S
local type,next=type,next
+local isdir=lfs.isdir
local ostype=os.type
-local collapsepath=file.collapsepath
+local collapsepath,joinpath,basename=file.collapsepath,file.join,file.basename
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local trace_expansions=false trackers.register("resolvers.expansions",function(v) trace_expansions=v end)
+local trace_globbing=true trackers.register("resolvers.globbing",function(v) trace_globbing=v end)
local report_expansions=logs.reporter("resolvers","expansions")
+local report_globbing=logs.reporter("resolvers","globbing")
local resolvers=resolvers
+local resolveprefix=resolvers.resolve
local function f_both(a,b)
local t,n={},0
for sb in gmatch(b,"[^,]+") do
@@ -12685,35 +13430,27 @@ function resolvers.expandedpathfromlist(pathlist)
end
return newlist
end
-local cleanup=lpeg.replacer {
- { "!","" },
- { "\\","/" },
-}
-function resolvers.cleanpath(str)
- local doslashes=(P("\\")/"/"+1)^0
- local donegation=(P("!")/"" )^0
- local homedir=lpegmatch(Cs(donegation*doslashes),environment.homedir or "")
- if homedir=="~" or homedir=="" or not lfs.isdir(homedir) then
- if trace_expansions then
- report_expansions("no home dir set, ignoring dependent paths")
- end
- function resolvers.cleanpath(str)
- if not str or find(str,"~",1,true) then
- return ""
- else
- return lpegmatch(cleanup,str)
+local usedhomedir=nil
+local donegation=(P("!")/"" )^0
+local doslashes=(P("\\")/"/"+1)^0
+local function expandedhome()
+ if not usedhomedir then
+ usedhomedir=lpegmatch(Cs(donegation*doslashes),environment.homedir or "")
+ if usedhomedir=="~" or usedhomedir=="" or not isdir(usedhomedir) then
+ if trace_expansions then
+ report_expansions("no home dir set, ignoring dependent path using current path")
end
- end
- else
- local dohome=((P("~")+P("$HOME"))/homedir)^0
- local cleanup=Cs(donegation*dohome*doslashes)
- function resolvers.cleanpath(str)
- return str and lpegmatch(cleanup,str) or ""
+ usedhomedir="."
end
end
- return resolvers.cleanpath(str)
+ return usedhomedir
+end
+local dohome=((P("~")+P("$HOME")+P("%HOME%"))/expandedhome)^0
+local cleanup=Cs(donegation*dohome*doslashes)
+resolvers.cleanpath=function(str)
+ return str and lpegmatch(cleanup,str) or ""
end
-local expandhome=P("~")/"$HOME"
+local expandhome=P("~")/"$HOME"
local dodouble=P('"')/""*(expandhome+(1-P('"')))^0*P('"')/""
local dosingle=P("'")/""*(expandhome+(1-P("'")))^0*P("'")/""
local dostring=(expandhome+1 )^0
@@ -12765,46 +13502,67 @@ function resolvers.splitpath(str)
end
function resolvers.joinpath(str)
if type(str)=='table' then
- return file.joinpath(str)
+ return joinpath(str)
else
return str
end
end
local attributes,directory=lfs.attributes,lfs.dir
local weird=P(".")^1+lpeg.anywhere(S("~`!#$%^&*()={}[]:;\"\'||<>,?\n\r\t"))
+local lessweird=P(".")^1+lpeg.anywhere(S("~`#$%^&*:;\"\'||<>,?\n\r\t"))
local timer={}
local scanned={}
local nofscans=0
local scancache={}
-local function scan(files,spec,path,n,m,r)
- local full=(path=="" and spec) or (spec..path..'/')
+local fullcache={}
+local nofsharedscans=0
+local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant)
+ local full=path=="" and spec or (spec..path..'/')
local dirs={}
local nofdirs=0
+ local pattern=tolerant and lessweird or weird
for name in directory(full) do
- if not lpegmatch(weird,name) then
- local mode=attributes(full..name,'mode')
- if mode=='file' then
+ if not lpegmatch(pattern,name) then
+ local mode=attributes(full..name,"mode")
+ if mode=="file" then
n=n+1
- local f=files[name]
- if f then
- if type(f)=='string' then
- files[name]={ f,path }
+ local lower=lower(name)
+ local paths=files[lower]
+ if paths then
+ if onlyone then
else
- f[#f+1]=path
+ if type(paths)=="string" then
+ files[lower]={ paths,path }
+ else
+ paths[#paths+1]=path
+ end
+ if name~=lower then
+ local rl=remap[lower]
+ if not rl then
+ remap[lower]=name
+ r=r+1
+ elseif trace_globbing and rl~=name then
+ report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl)
+ end
+ end
end
else
- files[name]=path
- local lower=lower(name)
+ files[lower]=path
if name~=lower then
- files["remap:"..lower]=name
- r=r+1
+ local rl=remap[lower]
+ if not rl then
+ remap[lower]=name
+ r=r+1
+ elseif trace_globbing and rl~=name then
+ report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl)
+ end
end
end
- elseif mode=='directory' then
+ elseif mode=="directory" then
m=m+1
nofdirs=nofdirs+1
if path~="" then
- dirs[nofdirs]=path..'/'..name
+ dirs[nofdirs]=path.."/"..name
else
dirs[nofdirs]=name
end
@@ -12814,107 +13572,69 @@ local function scan(files,spec,path,n,m,r)
if nofdirs>0 then
sort(dirs)
for i=1,nofdirs do
- files,n,m,r=scan(files,spec,dirs[i],n,m,r)
+ files,remap,n,m,r=scan(files,remap,spec,dirs[i],n,m,r,onlyonce,tolerant)
end
end
scancache[sub(full,1,-2)]=files
- return files,n,m,r
+ return files,remap,n,m,r
end
-local fullcache={}
-function resolvers.scanfiles(path,branch,usecache)
- statistics.starttiming(timer)
- local realpath=resolvers.resolve(path)
+function resolvers.scanfiles(path,branch,usecache,onlyonce,tolerant)
+ local realpath=resolveprefix(path)
if usecache then
- local files=fullcache[realpath]
- if files then
+ local content=fullcache[realpath]
+ if content then
if trace_locating then
- report_expansions("using caches scan of path %a, branch %a",path,branch or path)
+ report_expansions("using cached scan of path %a, branch %a",path,branch or path)
end
- return files
+ nofsharedscans=nofsharedscans+1
+ return content
end
end
+ statistics.starttiming(timer)
if trace_locating then
report_expansions("scanning path %a, branch %a",path,branch or path)
end
- local files,n,m,r=scan({},realpath..'/',"",0,0,0)
- files.__path__=path
- 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
- if usecache then
- scanned[#scanned+1]=realpath
- fullcache[realpath]=files
- end
- nofscans=nofscans+1
- statistics.stoptiming(timer)
- return files
-end
-local function simplescan(files,spec,path)
- local full=(path=="" and spec) or (spec..path..'/')
- local dirs={}
- local nofdirs=0
- for name in directory(full) do
- if not lpegmatch(weird,name) then
- local mode=attributes(full..name,'mode')
- if mode=='file' then
- if not files[name] then
- files[name]=path
- end
- elseif mode=='directory' then
- nofdirs=nofdirs+1
- if path~="" then
- dirs[nofdirs]=path..'/'..name
- else
- dirs[nofdirs]=name
- end
- end
- end
- end
- if nofdirs>0 then
- sort(dirs)
- for i=1,nofdirs do
- files=simplescan(files,spec,dirs[i])
- end
- end
- return files
-end
-local simplecache={}
-local nofsharedscans=0
-function resolvers.simplescanfiles(path,branch,usecache)
- statistics.starttiming(timer)
- local realpath=resolvers.resolve(path)
- if usecache then
- local files=simplecache[realpath]
- if not files then
- files=scancache[realpath]
- if files then
- nofsharedscans=nofsharedscans+1
- end
+ local content
+ if isdir(realpath) then
+ local files,remap,n,m,r=scan({},{},realpath..'/',"",0,0,0,onlyonce,tolerant)
+ content={
+ metadata={
+ path=path,
+ files=n,
+ directories=m,
+ remappings=r,
+ },
+ files=files,
+ remap=remap,
+ }
+ if trace_locating then
+ report_expansions("%s files found on %s directories with %s uppercase remappings",n,m,r)
end
- if files then
- if trace_locating then
- report_expansions("using caches scan of path %a, branch %a",path,branch or path)
- end
- return files
+ else
+ content={
+ metadata={
+ path=path,
+ files=0,
+ directories=0,
+ remappings=0,
+ },
+ files={},
+ remap={},
+ }
+ if trace_locating then
+ report_expansions("invalid path %a",realpath)
end
end
- if trace_locating then
- report_expansions("scanning path %a, branch %a",path,branch or path)
- end
- local files=simplescan({},realpath..'/',"")
- if trace_locating then
- report_expansions("%s files found",table.count(files))
- end
if usecache then
scanned[#scanned+1]=realpath
- simplecache[realpath]=files
+ fullcache[realpath]=content
end
nofscans=nofscans+1
statistics.stoptiming(timer)
- return files
+ return content
+end
+function resolvers.simplescanfiles(path,branch,usecache)
+ return resolvers.scanfiles(path,branch,usecache,true,true)
end
function resolvers.scandata()
table.sort(scanned)
@@ -12925,6 +13645,52 @@ function resolvers.scandata()
paths=scanned,
}
end
+function resolvers.get_from_content(content,path,name)
+ if not content then
+ return
+ end
+ local files=content.files
+ if not files then
+ return
+ end
+ local remap=content.remap
+ if not remap then
+ return
+ end
+ if name then
+ local used=lower(name)
+ return path,remap[used] or used
+ else
+ local name=path
+ local used=lower(name)
+ local path=files[used]
+ if path then
+ return path,remap[used] or used
+ end
+ end
+end
+local nothing=function() end
+function resolvers.filtered_from_content(content,pattern)
+ if content and type(pattern)=="string" then
+ local pattern=lower(pattern)
+ local files=content.files
+ local remap=content.remap
+ if files and remap then
+ local n=next(files)
+ local function iterator()
+ while n do
+ local k=n
+ n=next(files,k)
+ if find(k,pattern) then
+ return files[k],remap and remap[k] or k
+ end
+ end
+ end
+ return iterator
+ end
+ end
+ return nothing
+end
end -- of closure
@@ -12933,7 +13699,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-env"] = package.loaded["data-env"] or true
--- original size: 8769, stripped down to: 6490
+-- original size: 9216, stripped down to: 6798
if not modules then modules={} end modules ['data-env']={
version=1.001,
@@ -12951,10 +13717,12 @@ local formats=allocate()
local suffixes=allocate()
local dangerous=allocate()
local suffixmap=allocate()
+local usertypes=allocate()
resolvers.formats=formats
resolvers.suffixes=suffixes
resolvers.dangerous=dangerous
resolvers.suffixmap=suffixmap
+resolvers.usertypes=usertypes
local luasuffixes=utilities.lua.suffixes
local relations=allocate {
core={
@@ -13022,11 +13790,13 @@ local relations=allocate {
names={ "mp" },
variable='MPINPUTS',
suffixes={ 'mp','mpvi','mpiv','mpii' },
+ usertype=true,
},
tex={
names={ "tex" },
variable='TEXINPUTS',
- suffixes={ 'tex',"mkvi","mkiv","mkii" },
+ suffixes={ "tex","mkvi","mkiv","mkii","cld","lfg","xml" },
+ usertype=true,
},
icc={
names={ "icc","icc profile","icc profiles" },
@@ -13042,6 +13812,7 @@ local relations=allocate {
names={ "lua" },
variable='LUAINPUTS',
suffixes={ luasuffixes.lua,luasuffixes.luc,luasuffixes.tma,luasuffixes.tmc },
+ usertype=true,
},
lib={
names={ "lib" },
@@ -13050,11 +13821,15 @@ local relations=allocate {
},
bib={
names={ 'bib' },
+ variable='BIBINPUTS',
suffixes={ 'bib' },
+ usertype=true,
},
bst={
names={ 'bst' },
+ variable='BSTINPUTS',
suffixes={ 'bst' },
+ usertype=true,
},
fontconfig={
names={ 'fontconfig','fontconfig file','fontconfig files' },
@@ -13136,8 +13911,9 @@ function resolvers.updaterelations()
for name,relation in next,categories do
local rn=relation.names
local rv=relation.variable
- local rs=relation.suffixes
if rn and rv then
+ local rs=relation.suffixes
+ local ru=relation.usertype
for i=1,#rn do
local rni=lower(gsub(rn[i]," ",""))
formats[rni]=rv
@@ -13149,8 +13925,9 @@ function resolvers.updaterelations()
end
end
end
- end
- if rs then
+ if ru then
+ usertypes[name]=true
+ end
end
end
end
@@ -13201,7 +13978,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tmp"] = package.loaded["data-tmp"] or true
--- original size: 15532, stripped down to: 11648
+-- original size: 15681, stripped down to: 11761
if not modules then modules={} end modules ['data-tmp']={
version=1.100,
@@ -13220,6 +13997,7 @@ local trace_cache=false trackers.register("resolvers.cache",function(v) trace_ca
local report_caches=logs.reporter("resolvers","caches")
local report_resolvers=logs.reporter("resolvers","caching")
local resolvers=resolvers
+local cleanpath=resolvers.cleanpath
local directive_cleanup=false directives.register("system.compile.cleanup",function(v) directive_cleanup=v end)
local directive_strip=false directives.register("system.compile.strip",function(v) directive_strip=v end)
local compile=utilities.lua.compile
@@ -13241,7 +14019,7 @@ caches.relocate=false
caches.defaults={ "TMPDIR","TEMPDIR","TMP","TEMP","HOME","HOMEPATH" }
local writable,readables,usedreadables=nil,{},{}
local function identify()
- local texmfcaches=resolvers.cleanpathlist("TEXMFCACHE")
+ local texmfcaches=resolvers.cleanpathlist("TEXMFCACHE")
if texmfcaches then
for k=1,#texmfcaches do
local cachepath=texmfcaches[k]
@@ -13495,10 +14273,12 @@ 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(addsuffix(name,luasuffixes.lua),"trees")
- local filename=file.join(path,name)
+function caches.loadcontent(cachename,dataname,filename)
+ if not filename then
+ local name=caches.hashed(cachename)
+ local full,path=caches.getfirstreadablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename=file.join(path,name)
+ end
local blob=loadfile(addsuffix(filename,luasuffixes.luc)) or loadfile(addsuffix(filename,luasuffixes.lua))
if blob then
local data=blob()
@@ -13530,10 +14310,12 @@ function caches.collapsecontent(content)
end
end
end
-function caches.savecontent(cachename,dataname,content)
- local name=caches.hashed(cachename)
- local full,path=caches.setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
- local filename=file.join(path,name)
+function caches.savecontent(cachename,dataname,content,filename)
+ if not filename then
+ local name=caches.hashed(cachename)
+ local full,path=caches.setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename=file.join(path,name)
+ end
local luaname=addsuffix(filename,luasuffixes.lua)
local lucname=addsuffix(filename,luasuffixes.luc)
if trace_locating then
@@ -13576,7 +14358,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-met"] = package.loaded["data-met"] or true
--- original size: 5460, stripped down to: 4014
+-- original size: 5347, stripped down to: 4015
if not modules then modules={} end modules ['data-met']={
version=1.100,
@@ -13604,7 +14386,7 @@ local function splitmethod(filename)
if type(filename)=="table" then
return filename
end
- filename=file.collapsepath(filename,".")
+ filename=file.collapsepath(filename,".")
if not find(filename,"://",1,true) then
return { scheme="file",path=filename,original=filename,filename=filename }
end
@@ -13695,7 +14477,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-res"] = package.loaded["data-res"] or true
--- original size: 62045, stripped down to: 43116
+-- original size: 67003, stripped down to: 46291
if not modules then modules={} end modules ['data-res']={
version=1.001,
@@ -13705,7 +14487,7 @@ if not modules then modules={} end modules ['data-res']={
license="see context related readme files",
}
local gsub,find,lower,upper,match,gmatch=string.gsub,string.find,string.lower,string.upper,string.match,string.gmatch
-local concat,insert,sortedkeys=table.concat,table.insert,table.sortedkeys
+local concat,insert,remove,sortedkeys,sortedhash=table.concat,table.insert,table.remove,table.sortedkeys,table.sortedhash
local next,type,rawget=next,type,rawget
local os=os
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
@@ -13714,17 +14496,23 @@ local formatters=string.formatters
local filedirname=file.dirname
local filebasename=file.basename
local suffixonly=file.suffixonly
+local addsuffix=file.addsuffix
+local removesuffix=file.removesuffix
local filejoin=file.join
local collapsepath=file.collapsepath
local joinpath=file.joinpath
+local is_qualified_path=file.is_qualified_path
local allocate=utilities.storage.allocate
local settings_to_array=utilities.parsers.settings_to_array
+local getcurrentdir=lfs.currentdir
+local isfile=lfs.isfile
+local isdir=lfs.isdir
local setmetatableindex=table.setmetatableindex
local luasuffixes=utilities.lua.suffixes
-local getcurrentdir=lfs.currentdir
local trace_locating=false trackers .register("resolvers.locating",function(v) trace_locating=v end)
local trace_detail=false trackers .register("resolvers.details",function(v) trace_detail=v end)
local trace_expansions=false trackers .register("resolvers.expansions",function(v) trace_expansions=v end)
+local trace_paths=false trackers .register("resolvers.paths",function(v) trace_paths=v end)
local resolve_otherwise=true directives.register("resolvers.otherwise",function(v) resolve_otherwise=v end)
local report_resolving=logs.reporter("resolvers","resolving")
local resolvers=resolvers
@@ -13732,10 +14520,14 @@ local expandedpathfromlist=resolvers.expandedpathfromlist
local checkedvariable=resolvers.checkedvariable
local splitconfigurationpath=resolvers.splitconfigurationpath
local methodhandler=resolvers.methodhandler
+local filtered=resolvers.filtered_from_content
+local lookup=resolvers.get_from_content
+local cleanpath=resolvers.cleanpath
+local resolveprefix=resolvers.resolve
local initializesetter=utilities.setters.initialize
local ostype,osname,osenv,ossetenv,osgetenv=os.type,os.name,os.env,os.setenv,os.getenv
-resolvers.cacheversion='1.0.1'
-resolvers.configbanner=''
+resolvers.cacheversion="1.100"
+resolvers.configbanner=""
resolvers.homedir=environment.homedir
resolvers.criticalvars=allocate { "SELFAUTOLOC","SELFAUTODIR","SELFAUTOPARENT","TEXMFCNF","TEXMF","TEXOS" }
resolvers.luacnfname="texmfcnf.lua"
@@ -13754,6 +14546,7 @@ end
local unset_variable="unset"
local formats=resolvers.formats
local suffixes=resolvers.suffixes
+local usertypes=resolvers.usertypes
local dangerous=resolvers.dangerous
local suffixmap=resolvers.suffixmap
resolvers.defaultsuffixes={ "tex" }
@@ -13762,7 +14555,7 @@ local instance=resolvers.instance or nil
function resolvers.setenv(key,value,raw)
if instance then
instance.environment[key]=value
- ossetenv(key,raw and value or resolvers.resolve(value))
+ ossetenv(key,raw and value or resolveprefix(value))
end
end
local function getenv(key)
@@ -13776,7 +14569,7 @@ local function getenv(key)
end
resolvers.getenv=getenv
resolvers.env=getenv
-local function resolve(k)
+local function resolvevariable(k)
return instance.expansions[k]
end
local dollarstripper=lpeg.stripper("$")
@@ -13785,19 +14578,19 @@ 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 variableexpander=Cs((somevariable*(somekey/resolvevariable)+somethingelse)^1 )
local cleaner=P("\\")/"/"+P(";")*S("!{}/\\")^0*P(";")^1/";"
local variablecleaner=Cs((cleaner+P(1))^0)
-local somevariable=R("az","AZ","09","__","--")^1/resolve
+local somevariable=R("az","AZ","09","__","--")^1/resolvevariable
local variable=(P("$")/"")*(somevariable+(P("{")/"")*somevariable*(P("}")/""))
local variableresolver=Cs((variable+P(1))^0)
local function expandedvariable(var)
return lpegmatch(variableexpander,var) or var
end
-function resolvers.newinstance()
- if trace_locating then
+function resolvers.newinstance()
+ if trace_locating then
report_resolving("creating instance")
- end
+ end
local environment,variables,expansions,order=allocate(),allocate(),allocate(),allocate()
local newinstance={
environment=environment,
@@ -13810,6 +14603,7 @@ function resolvers.newinstance()
foundintrees=allocate(),
hashes=allocate(),
hashed=allocate(),
+ pathlists=false,
specification=allocate(),
lists=allocate(),
data=allocate(),
@@ -13822,6 +14616,7 @@ function resolvers.newinstance()
savelists=true,
pattern=nil,
force_suffixes=true,
+ pathstack={},
}
setmetatableindex(variables,function(t,k)
local v
@@ -13871,8 +14666,13 @@ function resolvers.reset()
end
local function reset_hashes()
instance.lists={}
+ instance.pathlists=false
instance.found={}
end
+local function reset_caches()
+ instance.lists={}
+ instance.pathlists=false
+end
local slash=P("/")
local pathexpressionpattern=Cs (
Cc("^")*(
@@ -13924,13 +14724,13 @@ local function identify_configuration_files()
for i=1,#cnfpaths do
local filepath=cnfpaths[i]
local filename=collapsepath(filejoin(filepath,luacnfname))
- local realname=resolvers.resolve(filename)
+ local realname=resolveprefix(filename)
if trace_locating then
- local fullpath=gsub(resolvers.resolve(collapsepath(filepath)),"//","/")
+ local fullpath=gsub(resolveprefix(collapsepath(filepath)),"//","/")
local weirdpath=find(fullpath,"/texmf.+/texmf") or not find(fullpath,"/web2c",1,true)
report_resolving("looking for %a on %s path %a from specification %a",luacnfname,weirdpath and "weird" or "given",fullpath,filepath)
end
- if lfs.isfile(realname) then
+ if isfile(realname) then
specification[#specification+1]=filename
if trace_locating then
report_resolving("found configuration file %a",realname)
@@ -13952,7 +14752,7 @@ local function load_configuration_files()
local filename=specification[i]
local pathname=filedirname(filename)
local filename=filejoin(pathname,luacnfname)
- local realname=resolvers.resolve(filename)
+ local realname=resolveprefix(filename)
local blob=loadfile(realname)
if blob then
local setups=instance.setups
@@ -13960,7 +14760,7 @@ local function load_configuration_files()
local parent=data and data.parent
if parent then
local filename=filejoin(pathname,parent)
- local realname=resolvers.resolve(filename)
+ local realname=resolveprefix(filename)
local blob=loadfile(realname)
if blob then
local parentdata=blob()
@@ -13985,7 +14785,7 @@ local function load_configuration_files()
elseif variables[k]==nil then
if trace_locating and not warning then
report_resolving("variables like %a in configuration file %a should move to the 'variables' subtable",
- k,resolvers.resolve(filename))
+ k,resolveprefix(filename))
warning=true
end
variables[k]=v
@@ -14045,7 +14845,7 @@ local function locate_file_databases()
local stripped=lpegmatch(inhibitstripper,path)
if stripped~="" then
local runtime=stripped==path
- path=resolvers.cleanpath(path)
+ path=cleanpath(path)
local spec=resolvers.splitmethod(stripped)
if runtime and (spec.noscheme or spec.scheme=="file") then
stripped="tree:///"..stripped
@@ -14108,8 +14908,8 @@ function resolvers.renew(hashname)
report_resolving("identifying tree %a",hashname)
end
end
- local realpath=resolvers.resolve(hashname)
- if lfs.isdir(realpath) then
+ local realpath=resolveprefix(hashname)
+ if isdir(realpath) then
if trace_locating then
report_resolving("using path %a",realpath)
end
@@ -14210,19 +15010,53 @@ end
function resolvers.unexpandedpath(str)
return joinpath(resolvers.unexpandedpathlist(str))
end
+function resolvers.pushpath(name)
+ local pathstack=instance.pathstack
+ local lastpath=pathstack[#pathstack]
+ local pluspath=filedirname(name)
+ if lastpath then
+ lastpath=collapsepath(filejoin(lastpath,pluspath))
+ else
+ lastpath=collapsepath(pluspath)
+ end
+ insert(pathstack,lastpath)
+ if trace_paths then
+ report_resolving("pushing path %a",lastpath)
+ end
+end
+function resolvers.poppath()
+ local pathstack=instance.pathstack
+ if trace_paths and #pathstack>0 then
+ report_resolving("popping path %a",pathstack[#pathstack])
+ end
+ remove(pathstack)
+end
+function resolvers.stackpath()
+ local pathstack=instance.pathstack
+ local currentpath=pathstack[#pathstack]
+ return currentpath~="" and currentpath or nil
+end
local done={}
function resolvers.resetextrapath()
local ep=instance.extra_paths
if not ep then
- ep,done={},{}
- instance.extra_paths=ep
+ done={}
+ instance.extra_paths={}
elseif #ep>0 then
- instance.lists,done={},{}
+ done={}
+ reset_caches()
end
end
function resolvers.registerextrapath(paths,subpaths)
- paths=settings_to_array(paths)
- subpaths=settings_to_array(subpaths)
+ if not subpaths or subpaths=="" then
+ if not paths or path=="" then
+ return
+ elseif done[paths] then
+ return
+ end
+ end
+ local paths=settings_to_array(paths)
+ local subpaths=settings_to_array(subpaths)
local ep=instance.extra_paths or {}
local oldn=#ep
local newn=oldn
@@ -14237,7 +15071,7 @@ function resolvers.registerextrapath(paths,subpaths)
local ps=p.."/"..s
if not done[ps] then
newn=newn+1
- ep[newn]=resolvers.cleanpath(ps)
+ ep[newn]=cleanpath(ps)
done[ps]=true
end
end
@@ -14247,7 +15081,7 @@ function resolvers.registerextrapath(paths,subpaths)
local p=paths[i]
if not done[p] then
newn=newn+1
- ep[newn]=resolvers.cleanpath(p)
+ ep[newn]=cleanpath(p)
done[p]=true
end
end
@@ -14259,7 +15093,7 @@ function resolvers.registerextrapath(paths,subpaths)
local ps=ep[i].."/"..s
if not done[ps] then
newn=newn+1
- ep[newn]=resolvers.cleanpath(ps)
+ ep[newn]=cleanpath(ps)
done[ps]=true
end
end
@@ -14268,52 +15102,70 @@ function resolvers.registerextrapath(paths,subpaths)
if newn>0 then
instance.extra_paths=ep
end
- if newn>oldn then
- instance.lists={}
+ if newn~=oldn then
+ reset_caches()
end
end
-local function made_list(instance,list)
- local ep=instance.extra_paths
- if not ep or #ep==0 then
- return list
+function resolvers.pushextrapath(path)
+ local paths=settings_to_array(path)
+ if instance.extra_stack then
+ insert(instance.extra_stack,1,paths)
else
- local done,new,newn={},{},0
- for k=1,#list do
- local v=list[k]
- if not done[v] then
- if find(v,"^[%.%/]$") then
- done[v]=true
- newn=newn+1
- new[newn]=v
- else
- break
- end
- end
- end
- for k=1,#ep do
- local v=ep[k]
+ instance.extra_stack={ paths }
+ end
+ reset_caches()
+end
+function resolvers.popextrapath()
+ if instance.extra_stack then
+ reset_caches()
+ return remove(instance.extra_stack,1)
+ end
+end
+local function made_list(instance,list,extra_too)
+ local done={}
+ local new={}
+ local newn=0
+ local function add(p)
+ for k=1,#p do
+ local v=p[k]
if not done[v] then
done[v]=true
newn=newn+1
new[newn]=v
end
end
- for k=1,#list do
- local v=list[k]
- if not done[v] then
- done[v]=true
- newn=newn+1
- new[newn]=v
+ end
+ for k=1,#list do
+ local v=list[k]
+ if done[v] then
+ elseif find(v,"^[%.%/]$") then
+ done[v]=true
+ newn=newn+1
+ new[newn]=v
+ else
+ break
+ end
+ end
+ if extra_too then
+ local es=instance.extra_stack
+ if es and #es>0 then
+ for k=1,#es do
+ add(es[k])
end
end
- return new
+ local ep=instance.extra_paths
+ if ep and #ep>0 then
+ add(ep)
+ end
end
+ add(list)
+ return new
end
function resolvers.cleanpathlist(str)
local t=resolvers.expandedpathlist(str)
if t then
for i=1,#t do
- t[i]=collapsepath(resolvers.cleanpath(t[i]))
+ t[i]=collapsepath(cleanpath(t[i]))
end
end
return t
@@ -14321,22 +15173,22 @@ end
function resolvers.expandpath(str)
return joinpath(resolvers.expandedpathlist(str))
end
-function resolvers.expandedpathlist(str)
+function resolvers.expandedpathlist(str,extra_too)
if not str then
return {}
- elseif instance.savelists then
+ elseif instance.savelists then
str=lpegmatch(dollarstripper,str)
local lists=instance.lists
local lst=lists[str]
if not lst then
- local l=made_list(instance,resolvers.splitpath(resolvers.expansion(str)))
+ local l=made_list(instance,resolvers.splitpath(resolvers.expansion(str)),extra_too)
lst=expandedpathfromlist(l)
lists[str]=lst
end
return lst
else
local lst=resolvers.splitpath(resolvers.expansion(str))
- return made_list(instance,expandedpathfromlist(lst))
+ return made_list(instance,expandedpathfromlist(lst),extra_too)
end
end
function resolvers.expandedpathlistfromvariable(str)
@@ -14347,6 +15199,13 @@ end
function resolvers.expandpathfromvariable(str)
return joinpath(resolvers.expandedpathlistfromvariable(str))
end
+function resolvers.cleanedpathlist(v)
+ local t=resolvers.expandedpathlist(v)
+ for i=1,#t do
+ t[i]=resolvers.resolve(resolvers.cleanpath(t[i]))
+ end
+ return t
+end
function resolvers.expandbraces(str)
local ori=str
local pth=expandedpathfromlist(resolvers.splitpath(ori))
@@ -14363,7 +15222,7 @@ function resolvers.registerfilehash(name,content,someerror)
end
end
local function isreadable(name)
- local readable=lfs.isfile(name)
+ local readable=isfile(name)
if trace_detail then
if readable then
report_resolving("file %a is readable",name)
@@ -14373,70 +15232,57 @@ local function isreadable(name)
end
return readable
end
-local function collect_files(names)
- local filelist,noffiles={},0
+local function collect_files(names)
+ local filelist={}
+ local noffiles=0
+ local function check(hash,root,pathname,path,name)
+ if not pathname or find(path,pathname) then
+ local variant=hash.type
+ local search=filejoin(root,path,name)
+ local result=methodhandler('concatinators',variant,root,path,name)
+ if trace_detail then
+ report_resolving("match: variant %a, search %a, result %a",variant,search,result)
+ end
+ noffiles=noffiles+1
+ filelist[noffiles]={ variant,search,result }
+ end
+ end
for k=1,#names do
- local fname=names[k]
+ local filename=names[k]
if trace_detail then
- report_resolving("checking name %a",fname)
+ report_resolving("checking name %a",filename)
end
- local bname=filebasename(fname)
- local dname=filedirname(fname)
- if dname=="" or find(dname,"^%.") then
- dname=false
+ local basename=filebasename(filename)
+ local pathname=filedirname(filename)
+ if pathname=="" or find(pathname,"^%.") then
+ pathname=false
else
- dname=gsub(dname,"%*",".*")
- dname="/"..dname.."$"
+ pathname=gsub(pathname,"%*",".*")
+ pathname="/"..pathname.."$"
end
local hashes=instance.hashes
for h=1,#hashes do
local hash=hashes[h]
- local blobpath=hash.name
- local files=blobpath and instance.files[blobpath]
- if files then
+ local hashname=hash.name
+ local content=hashname and instance.files[hashname]
+ if content then
if trace_detail then
- report_resolving("deep checking %a, base %a, pattern %a",blobpath,bname,dname)
- 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
+ report_resolving("deep checking %a, base %a, pattern %a",hashname,basename,pathname)
end
- if blobfile then
- local blobroot=files.__path__ or blobpath
- if type(blobfile)=='string' then
- if not dname or find(blobfile,dname) then
- local variant=hash.type
- local search=filejoin(blobroot,blobfile,bname)
- local result=methodhandler('concatinators',hash.type,blobroot,blobfile,bname)
- if trace_detail then
- report_resolving("match: variant %a, search %a, result %a",variant,search,result)
- end
- noffiles=noffiles+1
- filelist[noffiles]={ variant,search,result }
- end
+ local path,name=lookup(content,basename)
+ if path then
+ local metadata=content.metadata
+ local realroot=metadata and metadata.path or hashname
+ if type(path)=="string" then
+ check(hash,realroot,pathname,path,name)
else
- for kk=1,#blobfile do
- local vv=blobfile[kk]
- if not dname or find(vv,dname) then
- local variant=hash.type
- local search=filejoin(blobroot,vv,bname)
- local result=methodhandler('concatinators',hash.type,blobroot,vv,bname)
- if trace_detail then
- report_resolving("match: variant %a, search %a, result %a",variant,search,result)
- end
- noffiles=noffiles+1
- filelist[noffiles]={ variant,search,result }
- end
+ for i=1,#path do
+ check(hash,realroot,pathname,path[i],name)
end
end
end
elseif trace_locating then
- report_resolving("no match in %a (%s)",blobpath,bname)
+ report_resolving("no match in %a (%s)",hashname,basename)
end
end
end
@@ -14461,7 +15307,7 @@ end
local function can_be_dir(name)
local fakepaths=instance.fakepaths
if not fakepaths[name] then
- if lfs.isdir(name) then
+ if isdir(name) then
fakepaths[name]=1
else
fakepaths[name]=2
@@ -14477,10 +15323,11 @@ local function find_analyze(filename,askedformat,allresults)
if askedformat=="" then
if ext=="" or not suffixmap[ext] then
local defaultsuffixes=resolvers.defaultsuffixes
+ local formatofsuffix=resolvers.formatofsuffix
for i=1,#defaultsuffixes do
local forcedname=filename..'.'..defaultsuffixes[i]
wantedfiles[#wantedfiles+1]=forcedname
- filetype=resolvers.formatofsuffix(forcedname)
+ filetype=formatofsuffix(forcedname)
if trace_locating then
report_resolving("forcing filetype %a",filetype)
end
@@ -14520,14 +15367,14 @@ local function find_wildcard(filename,allresults)
if trace_locating then
report_resolving("checking wildcard %a",filename)
end
- local method,result=resolvers.findwildcardfiles(filename)
+ local result=resolvers.findwildcardfiles(filename)
if result then
return "wildcard",result
end
end
end
local function find_qualified(filename,allresults,askedformat,alsostripped)
- if not file.is_qualified_path(filename) then
+ if not is_qualified_path(filename) then
return
end
if trace_locating then
@@ -14601,33 +15448,66 @@ local function check_subpath(fname)
return fname
end
end
-local function find_intree(filename,filetype,wantedfiles,allresults)
+local function makepathlist(list,filetype)
local typespec=resolvers.variableofformat(filetype)
- local pathlist=resolvers.expandedpathlist(typespec)
- local method="intree"
+ local pathlist=resolvers.expandedpathlist(typespec,filetype and usertypes[filetype])
+ local entry={}
if pathlist and #pathlist>0 then
- local filelist=collect_files(wantedfiles)
+ for k=1,#pathlist do
+ local path=pathlist[k]
+ local prescanned=find(path,'^!!')
+ local resursive=find(path,'//$')
+ local pathname=lpegmatch(inhibitstripper,path)
+ local expression=makepathexpression(pathname)
+ local barename=gsub(pathname,"/+$","")
+ barename=resolveprefix(barename)
+ local scheme=url.hasscheme(barename)
+ local schemename=gsub(barename,"%.%*$",'')
+ entry[k]={
+ path=path,
+ pathname=pathname,
+ prescanned=prescanned,
+ recursive=recursive,
+ expression=expression,
+ barename=barename,
+ scheme=scheme,
+ schemename=schemename,
+ }
+ end
+ entry.typespec=typespec
+ list[filetype]=entry
+ else
+ list[filetype]=false
+ end
+ return entry
+end
+local function find_intree(filename,filetype,wantedfiles,allresults)
+ local pathlists=instance.pathlists
+ if not pathlists then
+ pathlists=setmetatableindex(allocate(),makepathlist)
+ instance.pathlists=pathlists
+ end
+ local pathlist=pathlists[filetype]
+ if pathlist then
+ local method="intree"
+ local filelist=collect_files(wantedfiles)
local dirlist={}
+ local result={}
if filelist then
for i=1,#filelist do
dirlist[i]=filedirname(filelist[i][3]).."/"
end
end
if trace_detail then
- report_resolving("checking filename %a",filename)
+ report_resolving("checking filename %a in tree",filename)
end
- local resolve=resolvers.resolve
- local result={}
for k=1,#pathlist do
- local path=pathlist[k]
- local pathname=lpegmatch(inhibitstripper,path)
- local doscan=path==pathname
- if not find (pathname,'//$') then
- doscan=false
- end
+ local entry=pathlist[k]
+ local path=entry.path
+ local pathname=entry.pathname
local done=false
if filelist then
- local expression=makepathexpression(pathname)
+ local expression=entry.expression
if trace_detail then
report_resolving("using pattern %a for path %a",expression,pathname)
end
@@ -14635,8 +15515,8 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
local fl=filelist[k]
local f=fl[2]
local d=dirlist[k]
- if find(d,expression) or find(resolve(d),expression) then
- result[#result+1]=resolve(fl[3])
+ if find(d,expression) or find(resolveprefix(d),expression) then
+ result[#result+1]=resolveprefix(fl[3])
done=true
if allresults then
if trace_detail then
@@ -14657,56 +15537,62 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
method="database"
else
method="filesystem"
- pathname=gsub(pathname,"/+$","")
- pathname=resolve(pathname)
- local scheme=url.hasscheme(pathname)
+ local scheme=entry.scheme
if not scheme or scheme=="file" then
- local pname=gsub(pathname,"%.%*$",'')
+ local pname=entry.schemename
if not find(pname,"*",1,true) then
if can_be_dir(pname) then
- for k=1,#wantedfiles do
- local w=wantedfiles[k]
- local fname=check_subpath(filejoin(pname,w))
- if fname then
- result[#result+1]=fname
- done=true
- if not allresults then
- break
- end
+ if not done and not entry.prescanned then
+ if trace_detail then
+ report_resolving("quick root scan for %a",pname)
end
- end
- if not done and doscan then
- local files=resolvers.simplescanfiles(pname,false,true)
for k=1,#wantedfiles do
local w=wantedfiles[k]
- local subpath=files[w]
- if not subpath or subpath=="" then
- elseif type(subpath)=="string" then
- local fname=check_subpath(filejoin(pname,subpath,w))
- if fname then
- result[#result+1]=fname
- done=true
- if not allresults then
- break
- end
+ local fname=check_subpath(filejoin(pname,w))
+ if fname then
+ result[#result+1]=fname
+ done=true
+ if not allresults then
+ break
end
- else
- for i=1,#subpath do
- local sp=subpath[i]
- if sp=="" then
- else
- local fname=check_subpath(filejoin(pname,sp,w))
- if fname then
- result[#result+1]=fname
- done=true
- if not allresults then
- break
+ end
+ end
+ if not done and entry.recursive then
+ if trace_detail then
+ report_resolving("scanning filesystem for %a",pname)
+ end
+ local files=resolvers.simplescanfiles(pname,false,true)
+ for k=1,#wantedfiles do
+ local w=wantedfiles[k]
+ local subpath=files[w]
+ if not subpath or subpath=="" then
+ elseif type(subpath)=="string" then
+ local fname=check_subpath(filejoin(pname,subpath,w))
+ if fname then
+ result[#result+1]=fname
+ done=true
+ if not allresults then
+ break
+ end
+ end
+ else
+ for i=1,#subpath do
+ local sp=subpath[i]
+ if sp=="" then
+ else
+ local fname=check_subpath(filejoin(pname,sp,w))
+ if fname then
+ result[#result+1]=fname
+ done=true
+ if not allresults then
+ break
+ end
end
end
end
- end
- if done and not allresults then
- break
+ if done and not allresults then
+ break
+ end
end
end
end
@@ -14714,6 +15600,18 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
else
end
+ else
+ for k=1,#wantedfiles do
+ local pname=entry.barename
+ local fname=methodhandler('finders',pname.."/"..wantedfiles[k])
+ if fname then
+ result[#result+1]=fname
+ done=true
+ if not allresults then
+ break
+ end
+ end
+ end
end
end
if done and not allresults then
@@ -14748,10 +15646,13 @@ local function find_otherwise(filename,filetype,wantedfiles,allresults)
local filelist=collect_files(wantedfiles)
local fl=filelist and filelist[1]
if fl then
- return "otherwise",{ resolvers.resolve(fl[3]) }
+ return "otherwise",{ resolveprefix(fl[3]) }
end
end
collect_instance_files=function(filename,askedformat,allresults)
+ if not filename or filename=="" then
+ return {}
+ end
askedformat=askedformat or ""
filename=collapsepath(filename,".")
filename=gsub(filename,"^%./",getcurrentdir().."/")
@@ -14786,7 +15687,11 @@ collect_instance_files=function(filename,askedformat,allresults)
else
local method,result,stamp,filetype,wantedfiles
if instance.remember then
- stamp=formatters["%s--%s"](filename,askedformat)
+ if askedformat=="" then
+ stamp=formatters["%s::%s"](suffixonly(filename),filename)
+ else
+ stamp=formatters["%s::%s"](askedformat,filename)
+ end
result=stamp and instance.found[stamp]
if result then
if trace_locating then
@@ -14821,7 +15726,7 @@ collect_instance_files=function(filename,askedformat,allresults)
end
if stamp then
if trace_locating then
- report_resolving("remembering file %a",filename)
+ report_resolving("remembering file %a using hash %a",filename,stamp)
end
instance.found[stamp]=result
end
@@ -14829,6 +15734,9 @@ collect_instance_files=function(filename,askedformat,allresults)
end
end
local function findfiles(filename,filetype,allresults)
+ if not filename or filename=="" then
+ return {}
+ end
local result,status=collect_instance_files(filename,filetype or "",allresults)
if not result or #result==0 then
local lowered=lower(filename)
@@ -14848,39 +15756,30 @@ 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 base=filebasename(filename)
+ local result={}
local hashes=instance.hashes
- local noffound=0
+ local function okay(hash,path,name)
+ local found=methodhandler('concatinators',hash.type,hash.name,path,name)
+ if found and found~="" then
+ result[#result+1]=resolveprefix(found)
+ return not allresults
+ end
+ end
for k=1,#hashes do
local hash=hashes[k]
- local files=instance.files[hash.name] or {}
- local blist=files[bname]
- if not blist then
- local rname="remap:"..bname
- blist=files[rname]
- if blist then
- bname=files[rname]
- blist=files[bname]
- end
- end
- if blist then
- if type(blist)=='string' then
- local found=methodhandler('concatinators',hash.type,hash.name,blist,bname) or ""
- if found~="" then
- noffound=noffound+1
- result[noffound]=resolvers.resolve(found)
- if not allresults then
- break
- end
+ local content=instance.files[hash.name]
+ if content then
+ local path,name=lookup(content,base)
+ if not path then
+ elseif type(path)=="string" then
+ if okay(hash,path,name) then
+ return result
end
else
- for kk=1,#blist do
- local vv=blist[kk]
- local found=methodhandler('concatinators',hash.type,hash.name,vv,bname) or ""
- if found~="" then
- noffound=noffound+1
- result[noffound]=resolvers.resolve(found)
- if not allresults then break end
+ for i=1,#path do
+ if okay(hash,path[i],name) then
+ return result
end
end
end
@@ -14894,64 +15793,80 @@ end
function resolvers.findgivenfile(filename)
return findgivenfiles(filename,false)[1] or ""
end
-local function doit(path,blist,bname,tag,variant,result,allresults)
- local done=false
- if blist and variant then
- local resolve=resolvers.resolve
- if type(blist)=='string' then
- if find(lower(blist),path) then
- local full=methodhandler('concatinators',variant,tag,blist,bname) or ""
- result[#result+1]=resolve(full)
- done=true
- end
- else
- for kk=1,#blist do
- local vv=blist[kk]
- if find(lower(vv),path) then
- local full=methodhandler('concatinators',variant,tag,vv,bname) or ""
- result[#result+1]=resolve(full)
- done=true
- if not allresults then break end
- end
- end
- end
- end
- return done
-end
local makewildcard=Cs(
(P("^")^0*P("/")*P(-1)+P(-1))/".*"+(P("^")^0*P("/")/"")^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)
- result=result or {}
+local function findwildcardfiles(filename,allresults,result)
+ local result=result or {}
local base=filebasename(filename)
local dirn=filedirname(filename)
local path=lower(lpegmatch(makewildcard,dirn) or dirn)
local name=lower(lpegmatch(makewildcard,base) or base)
- local files,done=instance.files,false
+ local files=instance.files
if find(name,"*",1,true) then
local hashes=instance.hashes
+ local function okay(found,path,base,hashname,hashtype)
+ if find(found,path) then
+ local full=methodhandler('concatinators',hashtype,hashname,found,base)
+ if full and full~="" then
+ result[#result+1]=resolveprefix(full)
+ return not allresults
+ end
+ end
+ end
for k=1,#hashes do
local hash=hashes[k]
- local hashname,hashtype=hash.name,hash.type
- for kk,hh in next,files[hashname] do
- if not find(kk,"^remap:") then
- if find(lower(kk),name) then
- if doit(path,hh,kk,hashname,hashtype,result,allresults) then done=true end
- if done and not allresults then break end
+ local hashname=hash.name
+ local hashtype=hash.type
+ if hashname and hashtype then
+ for found,base in filtered(files[hashname],name) do
+ if type(found)=='string' then
+ if okay(found,path,base,hashname,hashtype) then
+ break
+ end
+ else
+ for i=1,#found do
+ if okay(found[i],path,base,hashname,hashtype) then
+ break
+ end
+ end
end
end
end
end
else
+ local function okayokay(found,path,base,hashname,hashtype)
+ if find(found,path) then
+ local full=methodhandler('concatinators',hashtype,hashname,found,base)
+ if full and full~="" then
+ result[#result+1]=resolveprefix(full)
+ return not allresults
+ end
+ end
+ end
local hashes=instance.hashes
for k=1,#hashes do
local hash=hashes[k]
- local hashname,hashtype=hash.name,hash.type
- if doit(path,files[hashname][base],base,hashname,hashtype,result,allresults) then done=true end
- if done and not allresults then break end
+ local hashname=hash.name
+ local hashtype=hash.type
+ if hashname and hashtype then
+ local found,base=lookup(content,base)
+ if not found then
+ elseif type(found)=='string' then
+ if okay(found,path,base,hashname,hashtype) then
+ break
+ end
+ else
+ for i=1,#found do
+ if okay(found[i],path,base,hashname,hashtype) then
+ break
+ end
+ end
+ end
+ end
end
end
return result
@@ -15024,7 +15939,7 @@ end
function resolvers.dowithpath(name,func)
local pathlist=resolvers.expandedpathlist(name)
for i=1,#pathlist do
- func("^"..resolvers.cleanpath(pathlist[i]))
+ func("^"..cleanpath(pathlist[i]))
end
end
function resolvers.dowithvariable(name,func)
@@ -15032,23 +15947,23 @@ function resolvers.dowithvariable(name,func)
end
function resolvers.locateformat(name)
local engine=environment.ownmain or "luatex"
- local barename=file.removesuffix(name)
- local fullname=file.addsuffix(barename,"fmt")
+ local barename=removesuffix(name)
+ local fullname=addsuffix(barename,"fmt")
local fmtname=caches.getfirstreadablefile(fullname,"formats",engine) or ""
if fmtname=="" then
fmtname=resolvers.findfile(fullname)
- fmtname=resolvers.cleanpath(fmtname)
+ fmtname=cleanpath(fmtname)
end
if fmtname~="" then
- local barename=file.removesuffix(fmtname)
- local luaname=file.addsuffix(barename,luasuffixes.lua)
- local lucname=file.addsuffix(barename,luasuffixes.luc)
- local luiname=file.addsuffix(barename,luasuffixes.lui)
- if lfs.isfile(luiname) then
+ local barename=removesuffix(fmtname)
+ local luaname=addsuffix(barename,luasuffixes.lua)
+ local lucname=addsuffix(barename,luasuffixes.luc)
+ local luiname=addsuffix(barename,luasuffixes.lui)
+ if isfile(luiname) then
return barename,luiname
- elseif lfs.isfile(lucname) then
+ elseif isfile(lucname) then
return barename,lucname
- elseif lfs.isfile(luaname) then
+ elseif isfile(luaname) then
return barename,luaname
end
end
@@ -15070,29 +15985,24 @@ function resolvers.dowithfilesintree(pattern,handle,before,after)
local hash=hashes[i]
local blobtype=hash.type
local blobpath=hash.name
- if blobpath then
+ if blobtype and blobpath then
+ local total=0
+ local checked=0
+ local done=0
if before then
before(blobtype,blobpath,pattern)
end
- local files=instance.files[blobpath]
- local total,checked,done=0,0,0
- if files then
- for k,v in table.sortedhash(files) do
- total=total+1
- if find(k,"^remap:") then
- elseif find(k,pattern) then
- if type(v)=="string" then
- checked=checked+1
- if handle(blobtype,blobpath,v,k) then
- done=done+1
- end
- else
- checked=checked+#v
- for i=1,#v do
- if handle(blobtype,blobpath,v[i],k) then
- done=done+1
- end
- end
+ for path,name in filtered(instance.files[blobpath],pattern) do
+ if type(path)=="string" then
+ checked=checked+1
+ if handle(blobtype,blobpath,path,name) then
+ done=done+1
+ end
+ else
+ checked=checked+#path
+ for i=1,#path do
+ if handle(blobtype,blobpath,path[i],name) then
+ done=done+1
end
end
end
@@ -15103,8 +16013,8 @@ function resolvers.dowithfilesintree(pattern,handle,before,after)
end
end
end
-resolvers.obsolete=resolvers.obsolete or {}
-local obsolete=resolvers.obsolete
+local obsolete=resolvers.obsolete or {}
+resolvers.obsolete=obsolete
resolvers.find_file=resolvers.findfile obsolete.find_file=resolvers.findfile
resolvers.find_files=resolvers.findfiles obsolete.find_files=resolvers.findfiles
@@ -15115,7 +16025,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-pre"] = package.loaded["data-pre"] or true
--- original size: 6643, stripped down to: 4401
+-- original size: 3950, stripped down to: 2935
if not modules then modules={} end modules ['data-pre']={
version=1.001,
@@ -15125,44 +16035,51 @@ if not modules then modules={} end modules ['data-pre']={
license="see context related readme files"
}
local resolvers=resolvers
-local prefixes=utilities.storage.allocate()
-resolvers.prefixes=prefixes
-local cleanpath,findgivenfile,expansion=resolvers.cleanpath,resolvers.findgivenfile,resolvers.expansion
+local prefixes=resolvers.prefixes
+local cleanpath=resolvers.cleanpath
+local findgivenfile=resolvers.findgivenfile
+local expansion=resolvers.expansion
local getenv=resolvers.getenv
-local P,S,R,C,Cs,Cc,lpegmatch=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.match
-local joinpath,basename,dirname=file.join,file.basename,file.dirname
-local getmetatable,rawset,type=getmetatable,rawset,type
+local basename=file.basename
+local dirname=file.dirname
+local joinpath=file.join
+local isfile=lfs.isfile
prefixes.environment=function(str)
return cleanpath(expansion(str))
end
-prefixes.relative=function(str,n)
- if io.exists(str) then
- elseif io.exists("./"..str) then
- str="./"..str
- else
- local p="../"
- for i=1,n or 2 do
- if io.exists(p..str) then
- str=p..str
- break
- else
- p=p.."../"
+local function relative(str,n)
+ if not isfile(str) then
+ local pstr="./"..str
+ if isfile(pstr) then
+ str=pstr
+ else
+ local p="../"
+ for i=1,n or 2 do
+ local pstr=p..str
+ if isfile(pstr) then
+ str=pstr
+ break
+ else
+ p=p.."../"
+ end
end
end
end
return cleanpath(str)
end
+local function locate(str)
+ local fullname=findgivenfile(str) or ""
+ return cleanpath(fullname~="" and fullname or str)
+end
+prefixes.relative=relative
+prefixes.locate=locate
prefixes.auto=function(str)
- local fullname=prefixes.relative(str)
- if not lfs.isfile(fullname) then
- fullname=prefixes.locate(str)
+ local fullname=relative(str)
+ if not isfile(fullname) then
+ fullname=locate(str)
end
return fullname
end
-prefixes.locate=function(str)
- local fullname=findgivenfile(str) or ""
- return cleanpath((fullname~="" and fullname) or str)
-end
prefixes.filename=function(str)
local fullname=findgivenfile(str) or ""
return cleanpath(basename((fullname~="" and fullname) or str))
@@ -15183,6 +16100,13 @@ end
prefixes.home=function(str)
return cleanpath(joinpath(getenv('HOME'),str))
end
+prefixes.env=prefixes.environment
+prefixes.rel=prefixes.relative
+prefixes.loc=prefixes.locate
+prefixes.kpse=prefixes.locate
+prefixes.full=prefixes.locate
+prefixes.file=prefixes.filename
+prefixes.path=prefixes.pathname
local function toppath()
local inputstack=resolvers.inputstack
if not inputstack then
@@ -15195,98 +16119,22 @@ local function toppath()
return pathname
end
end
-resolvers.toppath=toppath
-prefixes.toppath=function(str)
- return cleanpath(joinpath(toppath(),str))
-end
-prefixes.env=prefixes.environment
-prefixes.rel=prefixes.relative
-prefixes.loc=prefixes.locate
-prefixes.kpse=prefixes.locate
-prefixes.full=prefixes.locate
-prefixes.file=prefixes.filename
-prefixes.path=prefixes.pathname
-function resolvers.allprefixes(separator)
- local all=table.sortedkeys(prefixes)
- if separator then
- for i=1,#all do
- all[i]=all[i]..":"
- end
- end
- return all
-end
-local function _resolve_(method,target)
- local action=prefixes[method]
- if action then
- return action(target)
- else
- return method..":"..target
- end
-end
-local resolved,abstract={},{}
-function resolvers.resetresolve(str)
- resolved,abstract={},{}
-end
-local pattern=Cs((C(R("az")^2)*P(":")*C((1-S(" \"\';,"))^1)/_resolve_+P(1))^0)
-local prefix=C(R("az")^2)*P(":")
-local target=C((1-S(" \"\';,"))^1)
-local notarget=(#S(";,")+P(-1))*Cc("")
-local pattern=Cs(((prefix*(target+notarget))/_resolve_+P(1))^0)
-local function resolve(str)
- if type(str)=="table" then
- local t={}
- for i=1,#str do
- t[i]=resolve(str[i])
- end
- return t
+local function jobpath()
+ local path=resolvers.stackpath()
+ if not path or path=="" then
+ return "."
else
- local res=resolved[str]
- if not res then
- res=lpegmatch(pattern,str)
- resolved[str]=res
- abstract[res]=str
- end
- return res
- end
-end
-local function unresolve(str)
- return abstract[str] or str
-end
-resolvers.resolve=resolve
-resolvers.unresolve=unresolve
-if type(os.uname)=="function" then
- for k,v in next,os.uname() do
- if not prefixes[k] then
- prefixes[k]=function() return v end
- end
- end
-end
-if os.type=="unix" then
- local pattern
- local function makepattern(t,k,v)
- if t then
- rawset(t,k,v)
- end
- local colon=P(":")
- for k,v in table.sortedpairs(prefixes) do
- if p then
- p=P(k)+p
- else
- p=P(k)
- end
- end
- pattern=Cs((p*colon+colon/";"+P(1))^0)
- end
- makepattern()
- getmetatable(prefixes).__newindex=makepattern
- function resolvers.repath(str)
- return lpegmatch(pattern,str)
- end
-else
- function resolvers.repath(str)
- return str
+ return path
end
end
+resolvers.toppath=toppath
+resolvers.jobpath=jobpath
+prefixes.toppath=function(str) return cleanpath(joinpath(toppath(),str)) end
+prefixes.jobpath=function(str) return cleanpath(joinpath(jobpath(),str)) end
+resolvers.setdynamic("toppath")
+resolvers.setdynamic("jobpath")
+prefixes.jobfile=prefixes.jobpath
+resolvers.setdynamic("jobfile")
end -- of closure
@@ -15348,7 +16196,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-fil"] = package.loaded["data-fil"] or true
--- original size: 3801, stripped down to: 3231
+-- original size: 3863, stripped down to: 3310
if not modules then modules={} end modules ['data-fil']={
version=1.001,
@@ -15360,30 +16208,31 @@ if not modules then modules={} end modules ['data-fil']={
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 resolveprefix=resolvers.resolve
local finders,openers,loaders,savers=resolvers.finders,resolvers.openers,resolvers.loaders,resolvers.savers
local locators,hashers,generators,concatinators=resolvers.locators,resolvers.hashers,resolvers.generators,resolvers.concatinators
local checkgarbage=utilities.garbagecollector and utilities.garbagecollector.check
function locators.file(specification)
- local name=specification.filename
- local realname=resolvers.resolve(name)
+ local filename=specification.filename
+ local realname=resolveprefix(filename)
if realname and realname~='' and lfs.isdir(realname) then
if trace_locating then
- report_files("file locator %a found as %a",name,realname)
+ report_files("file locator %a found as %a",filename,realname)
end
- resolvers.appendhash('file',name,true)
+ resolvers.appendhash('file',filename,true)
elseif trace_locating then
- report_files("file locator %a not found",name)
+ report_files("file locator %a not found",filename)
end
end
function hashers.file(specification)
- local name=specification.filename
- local content=caches.loadcontent(name,'files')
- resolvers.registerfilehash(name,content,content==nil)
+ local pathname=specification.filename
+ local content=caches.loadcontent(pathname,'files')
+ resolvers.registerfilehash(pathname,content,content==nil)
end
function generators.file(specification)
- local path=specification.filename
- local content=resolvers.scanfiles(path,false,true)
- resolvers.registerfilehash(path,content,true)
+ local pathname=specification.filename
+ local content=resolvers.scanfiles(pathname,false,true)
+ resolvers.registerfilehash(pathname,content,true)
end
concatinators.file=file.join
function finders.file(specification,filetype)
@@ -15665,7 +16514,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-zip"] = package.loaded["data-zip"] or true
--- original size: 8489, stripped down to: 6757
+-- original size: 8772, stripped down to: 6841
if not modules then modules={} end modules ['data-zip']={
version=1.001,
@@ -15684,16 +16533,6 @@ zip.archives=zip.archives or {}
local archives=zip.archives
zip.registeredfiles=zip.registeredfiles or {}
local registeredfiles=zip.registeredfiles
-local limited=false
-directives.register("system.inputmode",function(v)
- if not limited then
- local i_limiter=io.i_limiter(v)
- if i_limiter then
- zip.open=i_limiter.protect(zip.open)
- limited=true
- end
- end
-end)
local function validzip(str)
if not find(str,"^zip://") then
return "zip:///"..str
@@ -15708,7 +16547,7 @@ function zip.openarchive(name)
local arch=archives[name]
if not arch then
local full=resolvers.findfile(name) or ""
- arch=(full~="" and zip.open(full)) or false
+ arch=full~="" and zip.open(full) or false
archives[name]=arch
end
return arch
@@ -15867,31 +16706,42 @@ function resolvers.usezipfile(archive)
end
end
function resolvers.registerzipfile(z,tree)
- local files,filter={},""
- if tree=="" then
- filter="^(.+)/(.-)$"
- else
- filter=format("^%s/(.+)/(.-)$",tree)
- end
+ local names={}
+ local files={}
+ local remap={}
+ local n=0
+ local filter=tree=="" and "^(.+)/(.-)$" or format("^%s/(.+)/(.-)$",tree)
+ local register=resolvers.registerfile
if trace_locating then
report_zip("registering: using filter %a",filter)
end
- local register,n=resolvers.registerfile,0
for i in z:files() do
- local path,name=match(i.filename,filter)
- if path then
- if name and name~='' then
- register(files,name,path)
- n=n+1
- else
+ local filename=i.filename
+ local path,name=match(filename,filter)
+ if not path then
+ n=n+1
+ register(names,filename,"")
+ local usedname=lower(filename)
+ files[usedname]=""
+ if usedname~=filename then
+ remap[usedname]=filename
end
- else
- register(files,i.filename,'')
+ elseif name and name~="" then
n=n+1
+ register(names,name,path)
+ local usedname=lower(name)
+ files[usedname]=path
+ if usedname~=name then
+ remap[usedname]=name
+ end
+ else
end
end
report_zip("registering: %s files registered",n)
- return files
+ return {
+ files=files,
+ remap=remap,
+ }
end
@@ -15901,7 +16751,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tre"] = package.loaded["data-tre"] or true
--- original size: 2508, stripped down to: 2074
+-- original size: 8479, stripped down to: 5580
if not modules then modules={} end modules ['data-tre']={
version=1.001,
@@ -15910,42 +16760,64 @@ if not modules then modules={} end modules ['data-tre']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local find,gsub,format=string.find,string.gsub,string.format
+local find,gsub,lower=string.find,string.gsub,string.lower
+local basename,dirname,joinname=file.basename,file.dirname,file .join
+local globdir,isdir,isfile=dir.glob,lfs.isdir,lfs.isfile
+local P,lpegmatch=lpeg.P,lpeg.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_trees=logs.reporter("resolvers","trees")
local resolvers=resolvers
-local done,found,notfound={},{},resolvers.finders.notfound
-function resolvers.finders.tree(specification)
+local resolveprefix=resolvers.resolve
+local notfound=resolvers.finders.notfound
+local lookup=resolvers.get_from_content
+local collectors={}
+local found={}
+function resolvers.finders.tree(specification)
local spec=specification.filename
- local fnd=found[spec]
- if fnd==nil then
+ local okay=found[spec]
+ if okay==nil then
if spec~="" then
- local path,name=file.dirname(spec),file.basename(spec)
- if path=="" then path="." end
- local hash=done[path]
- if not hash then
- local pattern=path.."/*"
- hash=dir.glob(pattern)
- done[path]=hash
+ local path=dirname(spec)
+ local name=basename(spec)
+ if path=="" then
+ path="."
+ end
+ local names=collectors[path]
+ if not names then
+ local pattern=find(path,"/%*+$") and path or (path.."/*")
+ names=globdir(pattern)
+ collectors[path]=names
end
local pattern="/"..gsub(name,"([%.%-%+])","%%%1").."$"
- for k=1,#hash do
- local v=hash[k]
- if find(v,pattern) then
- found[spec]=v
- return v
+ for i=1,#names do
+ local fullname=names[i]
+ if find(fullname,pattern) then
+ found[spec]=fullname
+ return fullname
+ end
+ end
+ local pattern=lower(pattern)
+ for i=1,#names do
+ local fullname=lower(names[i])
+ if find(fullname,pattern) then
+ if isfile(fullname) then
+ found[spec]=fullname
+ return fullname
+ else
+ break
+ end
end
end
end
- fnd=notfound()
- found[spec]=fnd
+ okay=notfound()
+ found[spec]=okay
end
- return fnd
+ return okay
end
function resolvers.locators.tree(specification)
local name=specification.filename
- local realname=resolvers.resolve(name)
- if realname and realname~='' and lfs.isdir(realname) then
+ local realname=resolveprefix(name)
+ if realname and realname~='' and isdir(realname) then
if trace_locating then
report_trees("locator %a found",realname)
end
@@ -15956,16 +16828,110 @@ function resolvers.locators.tree(specification)
end
function resolvers.hashers.tree(specification)
local name=specification.filename
- if trace_locating then
- report_trees("analysing %a",name)
- end
+ report_trees("analyzing %a",name)
resolvers.methodhandler("hashers",name)
resolvers.generators.file(specification)
end
-resolvers.concatinators.tree=resolvers.concatinators.file
-resolvers.generators.tree=resolvers.generators.file
-resolvers.openers.tree=resolvers.openers.file
-resolvers.loaders.tree=resolvers.loaders.file
+local collectors={}
+local splitter=lpeg.splitat("/**/")
+local stripper=lpeg.replacer { [P("/")*P("*")^1*P(-1)]="" }
+table.setmetatableindex(collectors,function(t,k)
+ local rootname=lpegmatch(stripper,k)
+ local dataname=joinname(rootname,"dirlist")
+ local content=caches.loadcontent(dataname,"files",dataname)
+ if not content then
+ content=resolvers.scanfiles(rootname,nil,nil,false,true)
+ caches.savecontent(dataname,"files",content,dataname)
+ end
+ t[k]=content
+ return content
+end)
+local function checked(root,p,n)
+ if p then
+ if type(p)=="table" then
+ for i=1,#p do
+ local fullname=joinname(root,p[i],n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ else
+ local fullname=joinname(root,p,n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ end
+ return notfound()
+end
+local function resolve(specification)
+ local filename=specification.filename
+ if filename~="" then
+ local root,rest=lpegmatch(splitter,filename)
+ if root and rest then
+ local path,name=dirname(rest),basename(rest)
+ if name~=rest then
+ local content=collectors[root]
+ local p,n=lookup(content,name)
+ if not p then
+ return notfound()
+ end
+ local pattern=".*/"..path.."$"
+ local istable=type(p)=="table"
+ if istable then
+ for i=1,#p do
+ local pi=p[i]
+ if pi==path or find(pi,pattern) then
+ local fullname=joinname(root,pi,n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ end
+ elseif p==path or find(p,pattern) then
+ local fullname=joinname(root,p,n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ local queries=specification.queries
+ if queries and queries.option=="fileonly" then
+ return checked(root,p,n)
+ else
+ return notfound()
+ end
+ end
+ end
+ local path,name=dirname(filename),basename(filename)
+ local root=lpegmatch(stripper,path)
+ local content=collectors[path]
+ local p,n=lookup(content,name)
+ if p then
+ return checked(root,p,n)
+ end
+ end
+ return notfound()
+end
+resolvers.finders .dirlist=resolve
+resolvers.locators .dirlist=resolvers.locators .tree
+resolvers.hashers .dirlist=resolvers.hashers .tree
+resolvers.generators.dirlist=resolvers.generators.file
+resolvers.openers .dirlist=resolvers.openers .file
+resolvers.loaders .dirlist=resolvers.loaders .file
+function resolvers.finders.dirfile(specification)
+ local queries=specification.queries
+ if queries then
+ queries.option="fileonly"
+ else
+ specification.queries={ option="fileonly" }
+ end
+ return resolve(specification)
+end
+resolvers.locators .dirfile=resolvers.locators .dirlist
+resolvers.hashers .dirfile=resolvers.hashers .dirlist
+resolvers.generators.dirfile=resolvers.generators.dirlist
+resolvers.openers .dirfile=resolvers.openers .dirlist
+resolvers.loaders .dirfile=resolvers.loaders .dirlist
end -- of closure
@@ -15974,7 +16940,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-sch"] = package.loaded["data-sch"] or true
--- original size: 6213, stripped down to: 5160
+-- original size: 6569, stripped down to: 5304
if not modules then modules={} end modules ['data-sch']={
version=1.001,
@@ -16000,8 +16966,13 @@ directives.register("schemes.threshold",function(v) threshold=tonumber(v) or thr
function cleaners.none(specification)
return specification.original
end
-function cleaners.strip(specification)
- return (gsub(specification.original,"[^%a%d%.]+","-"))
+function cleaners.strip(specification)
+ local path,name=file.splitbase(specification.original)
+ if path=="" then
+ return (gsub(name,"[^%a%d%.]+","-"))
+ else
+ return (gsub((gsub(path,"%.","-").."-"..name),"[^%a%d%.]+","-"))
+ end
end
function cleaners.md5(specification)
return file.addsuffix(md5.hex(specification.original),file.suffix(specification.path))
@@ -16018,7 +16989,7 @@ end
local cached,loaded,reused,thresholds,handlers={},{},{},{},{}
local function runcurl(name,cachename)
local command="curl --silent --insecure --create-dirs --output "..cachename.." "..name
- os.spawn(command)
+ os.execute(command)
end
local function fetch(specification)
local original=specification.original
@@ -16150,7 +17121,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-lua"] = package.loaded["data-lua"] or true
--- original size: 4237, stripped down to: 3177
+-- original size: 4313, stripped down to: 3227
if not modules then modules={} end modules ['data-lua']={
version=1.001,
@@ -16159,7 +17130,7 @@ if not modules then modules={} end modules ['data-lua']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local resolvers,package=resolvers,package
+local package,lpeg=package,lpeg
local gsub=string.gsub
local concat=table.concat
local addsuffix=file.addsuffix
@@ -16170,9 +17141,11 @@ local luaformats={ 'TEXINPUTS','LUAINPUTS' }
local libformats={ 'CLUAINPUTS' }
local helpers=package.helpers or {}
local methods=helpers.methods or {}
+local resolvers=resolvers
+local resolveprefix=resolvers.resolve
+helpers.report=logs.reporter("resolvers","libraries")
trackers.register("resolvers.libraries",function(v) helpers.trace=v end)
trackers.register("resolvers.locating",function(v) helpers.trace=v end)
-helpers.report=logs.reporter("resolvers","libraries")
helpers.sequence={
"already loaded",
"preload table",
@@ -16187,7 +17160,7 @@ helpers.sequence={
}
local pattern=Cs(P("!")^0/""*(P("/")*P(-1)/"/"+P("/")^1/"/"+1)^0)
function helpers.cleanpath(path)
- return resolvers.resolve(lpegmatch(pattern,path))
+ return resolveprefix(lpegmatch(pattern,path))
end
local loadedaslib=helpers.loadedaslib
local getextraluapaths=package.extraluapaths
@@ -16324,7 +17297,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tmf"] = package.loaded["data-tmf"] or true
--- original size: 2600, stripped down to: 1627
+-- original size: 2601, stripped down to: 1627
if not modules then modules={} end modules ['data-tmf']={
version=1.001,
@@ -16380,7 +17353,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-lst"] = package.loaded["data-lst"] or true
--- original size: 2654, stripped down to: 2301
+-- original size: 2734, stripped down to: 2354
if not modules then modules={} end modules ['data-lst']={
version=1.001,
@@ -16389,10 +17362,13 @@ if not modules then modules={} end modules ['data-lst']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local find,concat,upper,format=string.find,table.concat,string.upper,string.format
+local rawget,type,next=rawget,type,next
+local find,concat,upper=string.find,table.concat,string.upper
local fastcopy,sortedpairs=table.fastcopy,table.sortedpairs
-resolvers.listers=resolvers.listers or {}
local resolvers=resolvers
+local listers=resolvers.listers or {}
+resolvers.listers=listers
+local resolveprefix=resolvers.resolve
local report_lists=logs.reporter("resolvers","lists")
local function tabstr(str)
if type(str)=='table' then
@@ -16401,7 +17377,7 @@ local function tabstr(str)
return str
end
end
-function resolvers.listers.variables(pattern)
+function listers.variables(pattern)
local instance=resolvers.instance
local environment=instance.environment
local variables=instance.variables
@@ -16422,10 +17398,10 @@ function resolvers.listers.variables(pattern)
for key,value in sortedpairs(configured) do
if key~="" and (pattern=="" or find(upper(key),pattern)) then
report_lists(key)
- report_lists(" env: %s",tabstr(rawget(environment,key)) or "unset")
- report_lists(" var: %s",tabstr(configured[key]) or "unset")
- report_lists(" exp: %s",tabstr(expansions[key]) or "unset")
- report_lists(" res: %s",tabstr(resolvers.resolve(expansions[key])) or "unset")
+ report_lists(" env: %s",tabstr(rawget(environment,key)) or "unset")
+ report_lists(" var: %s",tabstr(configured[key]) or "unset")
+ report_lists(" exp: %s",tabstr(expansions[key]) or "unset")
+ report_lists(" res: %s",tabstr(resolveprefix(expansions[key])) or "unset")
end
end
instance.environment=fastcopy(env)
@@ -16433,15 +17409,15 @@ function resolvers.listers.variables(pattern)
instance.expansions=fastcopy(exp)
end
local report_resolved=logs.reporter("system","resolved")
-function resolvers.listers.configurations()
+function listers.configurations()
local configurations=resolvers.instance.specification
for i=1,#configurations do
- report_resolved("file : %s",resolvers.resolve(configurations[i]))
+ report_resolved("file : %s",resolveprefix(configurations[i]))
end
report_resolved("")
local list=resolvers.expandedpathfromlist(resolvers.splitpath(resolvers.luacnfspec))
for i=1,#list do
- local li=resolvers.resolve(list[i])
+ local li=resolveprefix(list[i])
if lfs.isdir(li) then
report_resolved("path - %s",li)
else
@@ -16746,7 +17722,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["luat-fmt"] = package.loaded["luat-fmt"] or true
--- original size: 5951, stripped down to: 4922
+-- original size: 5955, stripped down to: 4926
if not modules then modules={} end modules ['luat-fmt']={
version=1.001,
@@ -16834,7 +17810,7 @@ function environment.make_format(name)
end
local command=format("%s --ini %s --lua=%s %s %sdump",engine,primaryflags(),quoted(usedluastub),quoted(fulltexsourcename),os.platform=="unix" and "\\\\" or "\\")
report_format("running command: %s\n",command)
- os.spawn(command)
+ os.execute(command)
local pattern=file.removesuffix(file.basename(usedluastub)).."-*.mem"
local mp=dir.glob(pattern)
if mp then
@@ -16869,7 +17845,7 @@ function environment.run_format(name,data,more)
else
local command=format("%s %s --fmt=%s --lua=%s %s %s",engine,primaryflags(),quoted(barename),quoted(luaname),quoted(data),more~="" and quoted(more) or "")
report_format("running command: %s",command)
- os.spawn(command)
+ os.execute(command)
end
end
end
@@ -16880,8 +17856,8 @@ end -- of closure
-- used libraries : l-lua.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-mrg.lua util-tpl.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.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-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
-- skipped libraries : -
--- original bytes : 695180
--- stripped bytes : 246794
+-- original bytes : 739251
+-- stripped bytes : 264497
-- end library merge
@@ -17107,6 +18083,7 @@ local helpinfo = [[
<category name="basic">
<subcategory>
<flag name="script"><short>run an mtx script (lua prefered method) (<ref name="noquotes"/>), no script gives list</short></flag>
+ <flag name="evaluate"><short>run code passed on the commandline (between quotes)</short></flag>
<flag name="execute"><short>run a script or program (texmfstart method) (<ref name="noquotes"/>)</short></flag>
<flag name="resolve"><short>resolve prefixed arguments</short></flag>
<flag name="ctxlua"><short>run internally (using preloaded libs)</short></flag>
@@ -17132,6 +18109,7 @@ local helpinfo = [[
<flag name="verbose"><short>give a bit more info</short></flag>
<flag name="trackers" value="list"><short>enable given trackers</short></flag>
<flag name="progname" value="str"><short>format or backend</short></flag>
+ <flag name="systeminfo" value="str"><short>show current operating system, processor, etc</short></flag>
</subcategory>
<subcategory>
<flag name="edit"><short>launch editor with found file</short></flag>
@@ -17761,6 +18739,39 @@ function runners.associate(filename)
os.launch(filename)
end
+function runners.evaluate(code,filename) -- for Luigi
+ if code == "loop" then
+ while true do
+ io.write("> ")
+ local code = io.read()
+ if code ~= "" then
+ local temp = string.match(code,"^= (.*)$")
+ if temp then
+ code = "print("..temp..")"
+ end
+ local compiled, message = loadstring(code)
+ if type(compiled) ~= "function" then
+ io.write("! " .. (message or code).."\n")
+ else
+ io.write(compiled())
+ end
+ end
+ end
+ else
+ if type(code) ~= "string" or code == "" then
+ code = filename
+ end
+ if code ~= "" then
+ local compiled, message = loadstring(code)
+ if type(compiled) ~= "function" then
+ io.write("invalid lua code: " .. (message or code))
+ return
+ end
+ io.write(compiled())
+ end
+ end
+end
+
function runners.gethelp(filename)
local url = environment.argument("url")
if url and url ~= "" then
@@ -17772,6 +18783,15 @@ function runners.gethelp(filename)
end
end
+function runners.systeminfo()
+ report("architecture : %s",os.platform or "<unset>")
+ report("operating system : %s",os.name or "<unset>")
+ report("file architecture : %s",os.type or "<unset>")
+ report("binary path : %s",os.selfdir or "<unset>")
+ report("binary suffix : %s",os.binsuffix or "<unset>")
+ report("library suffix : %s",os.libsuffix or "<unset>")
+end
+
-- this is a bit dirty ... first we store the first filename and next we
-- split the arguments so that we only see the ones meant for this script
-- ... later we will use the second half
@@ -17887,16 +18907,7 @@ end
if e_argument("ansi") then
- local formatters = string.formatters
-
- logs.setformatters {
- report_yes = formatters["%-15s | %s"],
- report_nop = formatters["%-15s |"],
- subreport_yes = formatters["%-15s | %s | %s"],
- subreport_nop = formatters["%-15s | %s |"],
- status_yes = formatters["%-15s : %s\n"],
- status_nop = formatters["%-15s :\n"],
- }
+ logs.setformatters("ansi")
local script = e_argument("script") or e_argument("scripts")
@@ -17921,6 +18932,10 @@ if e_argument("script") or e_argument("scripts") then
ok = runners.execute_ctx_script(filename)
end
+elseif e_argument("evaluate") then
+
+ runners.evaluate(e_argument("evaluate"),filename)
+
elseif e_argument("selfmerge") then
-- embed used libraries
@@ -18213,6 +19228,10 @@ elseif e_argument("exporthelp") then
runners.loadbase()
application.export(e_argument("exporthelp"),filename)
+elseif e_argument("systeminfo") then
+
+ runners.systeminfo()
+
elseif e_argument("help") or filename=='help' or filename == "" then
application.help()
diff --git a/Master/texmf-dist/scripts/context/stubs/win64/mtxrun.lua b/Master/texmf-dist/scripts/context/stubs/win64/mtxrun.lua
index 5cb5c8d2416..48a9a27a250 100644
--- a/Master/texmf-dist/scripts/context/stubs/win64/mtxrun.lua
+++ b/Master/texmf-dist/scripts/context/stubs/win64/mtxrun.lua
@@ -56,7 +56,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lua"] = package.loaded["l-lua"] or true
--- original size: 3409, stripped down to: 1763
+-- original size: 3888, stripped down to: 2197
if not modules then modules={} end modules ['l-lua']={
version=1.001,
@@ -139,6 +139,13 @@ end
if lua then
lua.mask=load([[τεχ = 1]]) and "utf" or "ascii"
end
+local flush=io.flush
+if flush then
+ local execute=os.execute if execute then function os.execute(...) flush() return execute(...) end end
+ local exec=os.exec if exec then function os.exec (...) flush() return exec (...) end end
+ local spawn=os.spawn if spawn then function os.spawn (...) flush() return spawn (...) end end
+ local popen=io.popen if popen then function io.popen (...) flush() return popen (...) end end
+end
end -- of closure
@@ -437,7 +444,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lpeg"] = package.loaded["l-lpeg"] or true
--- original size: 29983, stripped down to: 16202
+-- original size: 36225, stripped down to: 19891
if not modules then modules={} end modules ['l-lpeg']={
version=1.001,
@@ -498,6 +505,8 @@ patterns.utfbom_16_le=utfbom_16_le
patterns.utfbom_8=utfbom_8
patterns.utf_16_be_nl=P("\000\r\000\n")+P("\000\r")+P("\000\n")
patterns.utf_16_le_nl=P("\r\000\n\000")+P("\r\000")+P("\n\000")
+patterns.utf_32_be_nl=P("\000\000\000\r\000\000\000\n")+P("\000\000\000\r")+P("\000\000\000\n")
+patterns.utf_32_le_nl=P("\r\000\000\000\n\000\000\000")+P("\r\000\000\000")+P("\n\000\000\000")
patterns.utf8one=R("\000\127")
patterns.utf8two=R("\194\223")*utf8next
patterns.utf8three=R("\224\239")*utf8next*utf8next
@@ -527,9 +536,21 @@ patterns.nonwhitespace=nonwhitespace
local stripper=spacer^0*C((spacer^0*nonspacer^1)^0)
local fullstripper=whitespace^0*C((whitespace^0*nonwhitespace^1)^0)
local collapser=Cs(spacer^0/""*nonspacer^0*((spacer^0/" "*nonspacer^1)^0))
+local b_collapser=Cs(whitespace^0/""*(nonwhitespace^1+whitespace^1/" ")^0)
+local e_collapser=Cs((whitespace^1*P(-1)/""+nonwhitespace^1+whitespace^1/" ")^0)
+local m_collapser=Cs((nonwhitespace^1+whitespace^1/" ")^0)
+local b_stripper=Cs(spacer^0/""*(nonspacer^1+spacer^1/" ")^0)
+local e_stripper=Cs((spacer^1*P(-1)/""+nonspacer^1+spacer^1/" ")^0)
+local m_stripper=Cs((nonspacer^1+spacer^1/" ")^0)
patterns.stripper=stripper
patterns.fullstripper=fullstripper
patterns.collapser=collapser
+patterns.b_collapser=b_collapser
+patterns.m_collapser=m_collapser
+patterns.e_collapser=e_collapser
+patterns.b_stripper=b_stripper
+patterns.m_stripper=m_stripper
+patterns.e_stripper=e_stripper
patterns.lowercase=lowercase
patterns.uppercase=uppercase
patterns.letter=patterns.lowercase+patterns.uppercase
@@ -566,9 +587,12 @@ patterns.integer=sign^-1*digit^1
patterns.unsigned=digit^0*period*digit^1
patterns.float=sign^-1*patterns.unsigned
patterns.cunsigned=digit^0*comma*digit^1
+patterns.cpunsigned=digit^0*(period+comma)*digit^1
patterns.cfloat=sign^-1*patterns.cunsigned
+patterns.cpfloat=sign^-1*patterns.cpunsigned
patterns.number=patterns.float+patterns.integer
patterns.cnumber=patterns.cfloat+patterns.integer
+patterns.cpnumber=patterns.cpfloat+patterns.integer
patterns.oct=zero*octdigit^1
patterns.octal=patterns.oct
patterns.HEX=zero*P("X")*(digit+uppercase)^1
@@ -985,23 +1009,40 @@ function lpeg.append(list,pp,delayed,checked)
end
return p
end
+local p_false=P(false)
+local p_true=P(true)
local function make(t)
- local p
+ local function making(t)
+ local p=p_false
+ local keys=sortedkeys(t)
+ for i=1,#keys do
+ local k=keys[i]
+ if k~="" then
+ local v=t[k]
+ if v==true then
+ p=p+P(k)*p_true
+ elseif v==false then
+ else
+ p=p+P(k)*making(v)
+ end
+ end
+ end
+ if t[""] then
+ p=p+p_true
+ end
+ return p
+ end
+ local p=p_false
local keys=sortedkeys(t)
for i=1,#keys do
local k=keys[i]
- local v=t[k]
- if not p then
- if next(v) then
- p=P(k)*make(v)
- else
- p=P(k)
- end
- else
- if next(v) then
- p=p+P(k)*make(v)
+ if k~="" then
+ local v=t[k]
+ if v==true then
+ p=p+P(k)*p_true
+ elseif v==false then
else
- p=p+P(k)
+ p=p+P(k)*making(v)
end
end
end
@@ -1009,13 +1050,73 @@ local function make(t)
end
function lpeg.utfchartabletopattern(list)
local tree={}
- for i=1,#list do
- local t=tree
- for c in gmatch(list[i],".") do
- if not t[c] then
- t[c]={}
+ local n=#list
+ if n==0 then
+ for s in next,list do
+ local t=tree
+ local p,pk
+ for c in gmatch(s,".") do
+ if t==true then
+ t={ [c]=true,[""]=true }
+ p[pk]=t
+ p=t
+ t=false
+ elseif t==false then
+ t={ [c]=false }
+ p[pk]=t
+ p=t
+ t=false
+ else
+ local tc=t[c]
+ if not tc then
+ tc=false
+ t[c]=false
+ end
+ p=t
+ t=tc
+ end
+ pk=c
+ end
+ if t==false then
+ p[pk]=true
+ elseif t==true then
+ else
+ t[""]=true
+ end
+ end
+ else
+ for i=1,n do
+ local s=list[i]
+ local t=tree
+ local p,pk
+ for c in gmatch(s,".") do
+ if t==true then
+ t={ [c]=true,[""]=true }
+ p[pk]=t
+ p=t
+ t=false
+ elseif t==false then
+ t={ [c]=false }
+ p[pk]=t
+ p=t
+ t=false
+ else
+ local tc=t[c]
+ if not tc then
+ tc=false
+ t[c]=false
+ end
+ p=t
+ t=tc
+ end
+ pk=c
+ end
+ if t==false then
+ p[pk]=true
+ elseif t==true then
+ else
+ t[""]=true
end
- t=t[c]
end
end
return make(tree)
@@ -1055,6 +1156,65 @@ local case_2=period*(digit-trailingzeros)^1*(trailingzeros/"")
local number=digit^1*(case_1+case_2)
local stripper=Cs((number+1)^0)
lpeg.patterns.stripzeros=stripper
+local byte_to_HEX={}
+local byte_to_hex={}
+local byte_to_dec={}
+local hex_to_byte={}
+for i=0,255 do
+ local H=format("%02X",i)
+ local h=format("%02x",i)
+ local d=format("%03i",i)
+ local c=char(i)
+ byte_to_HEX[c]=H
+ byte_to_hex[c]=h
+ byte_to_dec[c]=d
+ hex_to_byte[h]=c
+ hex_to_byte[H]=c
+end
+local hextobyte=P(2)/hex_to_byte
+local bytetoHEX=P(1)/byte_to_HEX
+local bytetohex=P(1)/byte_to_hex
+local bytetodec=P(1)/byte_to_dec
+local hextobytes=Cs(hextobyte^0)
+local bytestoHEX=Cs(bytetoHEX^0)
+local bytestohex=Cs(bytetohex^0)
+local bytestodec=Cs(bytetodec^0)
+patterns.hextobyte=hextobyte
+patterns.bytetoHEX=bytetoHEX
+patterns.bytetohex=bytetohex
+patterns.bytetodec=bytetodec
+patterns.hextobytes=hextobytes
+patterns.bytestoHEX=bytestoHEX
+patterns.bytestohex=bytestohex
+patterns.bytestodec=bytestodec
+function string.toHEX(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(bytestoHEX,s)
+ end
+end
+function string.tohex(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(bytestohex,s)
+ end
+end
+function string.todec(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(bytestodec,s)
+ end
+end
+function string.tobytes(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(hextobytes,s)
+ end
+end
end -- of closure
@@ -1082,7 +1242,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-string"] = package.loaded["l-string"] or true
--- original size: 5671, stripped down to: 2827
+-- original size: 5694, stripped down to: 2827
if not modules then modules={} end modules ['l-string']={
version=1.001,
@@ -1187,7 +1347,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-table"] = package.loaded["l-table"] or true
--- original size: 31860, stripped down to: 20846
+-- original size: 33830, stripped down to: 21894
if not modules then modules={} end modules ['l-table']={
version=1.001,
@@ -1230,11 +1390,12 @@ function table.keys(t)
end
end
local function compare(a,b)
- local ta,tb=type(a),type(b)
- if ta==tb then
+ local ta=type(a)
+ local tb=type(b)
+ if ta==tb and ta=="number" then
return a<b
else
- return tostring(a)<tostring(b)
+ return tostring(a)<tostring(b)
end
end
local function sortedkeys(tab)
@@ -1334,14 +1495,14 @@ local function sortedhash(t,cmp)
end
local n=0
local m=#s
- local function kv(s)
+ local function kv()
if n<m then
n=n+1
local k=s[n]
return k,t[k]
end
end
- return kv,s
+ return kv
else
return nothing
end
@@ -1506,7 +1667,7 @@ local function simple_table(t)
if tv=="number" then
nt=nt+1
if hexify then
- tt[nt]=format("0x%04X",v)
+ tt[nt]=format("0x%X",v)
else
tt[nt]=tostring(v)
end
@@ -1537,7 +1698,7 @@ local function do_serialize(root,name,depth,level,indexed)
local tn=type(name)
if tn=="number" then
if hexify then
- handle(format("%s[0x%04X]={",depth,name))
+ handle(format("%s[0x%X]={",depth,name))
else
handle(format("%s[%s]={",depth,name))
end
@@ -1554,7 +1715,7 @@ local function do_serialize(root,name,depth,level,indexed)
end
end
end
- if root and next(root) then
+ if root and next(root)~=nil then
local first,last=nil,0
if compact then
last=#root
@@ -1576,7 +1737,7 @@ local function do_serialize(root,name,depth,level,indexed)
if compact and first and tk=="number" and k>=first and k<=last then
if tv=="number" then
if hexify then
- handle(format("%s 0x%04X,",depth,v))
+ handle(format("%s 0x%X,",depth,v))
else
handle(format("%s %s,",depth,v))
end
@@ -1587,7 +1748,7 @@ local function do_serialize(root,name,depth,level,indexed)
handle(format("%s %q,",depth,v))
end
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
handle(format("%s {},",depth))
elseif inline then
local st=simple_table(v)
@@ -1617,25 +1778,25 @@ local function do_serialize(root,name,depth,level,indexed)
elseif tv=="number" then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=0x%04X,",depth,k,v))
+ handle(format("%s [0x%X]=0x%X,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
elseif tk=="boolean" then
if hexify then
- handle(format("%s [%s]=0x%04X,",depth,k and "true" or "false",v))
+ handle(format("%s [%s]=0x%X,",depth,k and "true" or "false",v))
else
handle(format("%s [%s]=%s,",depth,k and "true" or "false",v))
end
elseif noquotes and not reserved[k] and lpegmatch(propername,k) then
if hexify then
- handle(format("%s %s=0x%04X,",depth,k,v))
+ handle(format("%s %s=0x%X,",depth,k,v))
else
handle(format("%s %s=%s,",depth,k,v))
end
else
if hexify then
- handle(format("%s [%q]=0x%04X,",depth,k,v))
+ handle(format("%s [%q]=0x%X,",depth,k,v))
else
handle(format("%s [%q]=%s,",depth,k,v))
end
@@ -1644,7 +1805,7 @@ local function do_serialize(root,name,depth,level,indexed)
if reduce and tonumber(v) then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%s,",depth,k,v))
+ handle(format("%s [0x%X]=%s,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
@@ -1658,7 +1819,7 @@ local function do_serialize(root,name,depth,level,indexed)
else
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%q,",depth,k,v))
+ handle(format("%s [0x%X]=%q,",depth,k,v))
else
handle(format("%s [%s]=%q,",depth,k,v))
end
@@ -1671,10 +1832,10 @@ local function do_serialize(root,name,depth,level,indexed)
end
end
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]={},",depth,k))
+ handle(format("%s [0x%X]={},",depth,k))
else
handle(format("%s [%s]={},",depth,k))
end
@@ -1690,7 +1851,7 @@ local function do_serialize(root,name,depth,level,indexed)
if st then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]={ %s },",depth,k,concat(st,", ")))
+ handle(format("%s [0x%X]={ %s },",depth,k,concat(st,", ")))
else
handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
end
@@ -1710,7 +1871,7 @@ local function do_serialize(root,name,depth,level,indexed)
elseif tv=="boolean" then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%s,",depth,k,v and "true" or "false"))
+ handle(format("%s [0x%X]=%s,",depth,k,v and "true" or "false"))
else
handle(format("%s [%s]=%s,",depth,k,v and "true" or "false"))
end
@@ -1726,7 +1887,7 @@ local function do_serialize(root,name,depth,level,indexed)
local f=getinfo(v).what=="C" and dump(dummy) or dump(v)
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=load(%q),",depth,k,f))
+ handle(format("%s [0x%X]=load(%q),",depth,k,f))
else
handle(format("%s [%s]=load(%q),",depth,k,f))
end
@@ -1741,7 +1902,7 @@ local function do_serialize(root,name,depth,level,indexed)
else
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%q,",depth,k,tostring(v)))
+ handle(format("%s [0x%X]=%q,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%q,",depth,k,tostring(v)))
end
@@ -1795,7 +1956,7 @@ local function serialize(_handle,root,name,specification)
end
elseif tname=="number" then
if hexify then
- handle(format("[0x%04X]={",name))
+ handle(format("[0x%X]={",name))
else
handle("["..name.."]={")
end
@@ -1813,7 +1974,7 @@ local function serialize(_handle,root,name,specification)
local dummy=root._w_h_a_t_e_v_e_r_
root._w_h_a_t_e_v_e_r_=nil
end
- if next(root) then
+ if next(root)~=nil then
do_serialize(root,name,"",0)
end
end
@@ -1942,14 +2103,25 @@ local function identical(a,b)
end
table.identical=identical
table.are_equal=are_equal
-function table.compact(t)
- if t then
- for k,v in next,t do
- if not next(v) then
- t[k]=nil
+local function sparse(old,nest,keeptables)
+ local new={}
+ for k,v in next,old do
+ if not (v=="" or v==false) then
+ if nest and type(v)=="table" then
+ v=sparse(v,nest)
+ if keeptables or next(v)~=nil then
+ new[k]=v
+ end
+ else
+ new[k]=v
end
end
end
+ return new
+end
+table.sparse=sparse
+function table.compact(t)
+ return sparse(t,true,true)
end
function table.contains(t,v)
if t then
@@ -2054,10 +2226,10 @@ function table.sub(t,i,j)
return { unpack(t,i,j) }
end
function table.is_empty(t)
- return not t or not next(t)
+ return not t or next(t)==nil
end
function table.has_one_entry(t)
- return t and not next(t,next(t))
+ return t and next(t,next(t))==nil
end
function table.loweredkeys(t)
local l={}
@@ -2102,6 +2274,44 @@ function table.values(t,s)
return {}
end
end
+function table.filtered(t,pattern,sort,cmp)
+ if t and type(pattern)=="string" then
+ if sort then
+ local s
+ if cmp then
+ s=sortedhashkeys(t,function(a,b) return cmp(t,a,b) end)
+ else
+ s=sortedkeys(t)
+ end
+ local n=0
+ local m=#s
+ local function kv(s)
+ while n<m do
+ n=n+1
+ local k=s[n]
+ if find(k,pattern) then
+ return k,t[k]
+ end
+ end
+ end
+ return kv,s
+ else
+ local n=next(t)
+ local function iterator()
+ while n~=nil do
+ local k=n
+ n=next(t,k)
+ if find(k,pattern) then
+ return k,t[k]
+ end
+ end
+ end
+ return iterator,t
+ end
+ else
+ return nothing
+ end
+end
end -- of closure
@@ -2110,7 +2320,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-io"] = package.loaded["l-io"] or true
--- original size: 8824, stripped down to: 6347
+-- original size: 8643, stripped down to: 6232
if not modules then modules={} end modules ['l-io']={
version=1.001,
@@ -2417,8 +2627,6 @@ function io.readstring(f,n,m)
local str=gsub(f:read(n),"\000","")
return str
end
-if not io.i_limiter then function io.i_limiter() end end
-if not io.o_limiter then function io.o_limiter() end end
end -- of closure
@@ -2645,7 +2853,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-os"] = package.loaded["l-os"] or true
--- original size: 16093, stripped down to: 9704
+-- original size: 15761, stripped down to: 9403
if not modules then modules={} end modules ['l-os']={
version=1.001,
@@ -2719,13 +2927,10 @@ if not os.__getenv__ then
setmetatable(os.env,{ __index=__index,__newindex=__newindex } )
end
end
-local execute,spawn,exec,iopopen,ioflush=os.execute,os.spawn or os.execute,os.exec or os.execute,io.popen,io.flush
-function os.execute(...) ioflush() return execute(...) end
-function os.spawn (...) ioflush() return spawn (...) end
-function os.exec (...) ioflush() return exec (...) end
-function io.popen (...) ioflush() return iopopen(...) end
+local execute=os.execute
+local iopopen=io.popen
function os.resultof(command)
- local handle=io.popen(command,"r")
+ local handle=iopopen(command,"r")
if handle then
local result=handle:read("*all") or ""
handle:close()
@@ -2754,7 +2959,7 @@ local launchers={
unix="$BROWSER %s &> /dev/null &",
}
function os.launch(str)
- os.execute(format(launchers[os.name] or launchers.unix,str))
+ execute(format(launchers[os.name] or launchers.unix,str))
end
if not os.times then
function os.times()
@@ -3029,7 +3234,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-file"] = package.loaded["l-file"] or true
--- original size: 18308, stripped down to: 9948
+-- original size: 20949, stripped down to: 9945
if not modules then modules={} end modules ['l-file']={
version=1.001,
@@ -3043,41 +3248,28 @@ local file=file
if not lfs then
lfs=optionalrequire("lfs")
end
-if not lfs then
- lfs={
- getcurrentdir=function()
- return "."
- end,
- attributes=function()
- return nil
- end,
- isfile=function(name)
- local f=io.open(name,'rb')
- if f then
- f:close()
- return true
- end
- end,
- isdir=function(name)
- print("you need to load lfs")
- return false
- end
- }
-elseif not lfs.isfile then
- local attributes=lfs.attributes
- function lfs.isdir(name)
- return attributes(name,"mode")=="directory"
- end
- function lfs.isfile(name)
- return attributes(name,"mode")=="file"
- end
-end
local insert,concat=table.insert,table.concat
local match,find,gmatch=string.match,string.find,string.gmatch
local lpegmatch=lpeg.match
local getcurrentdir,attributes=lfs.currentdir,lfs.attributes
local checkedsplit=string.checkedsplit
local P,R,S,C,Cs,Cp,Cc,Ct=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Cs,lpeg.Cp,lpeg.Cc,lpeg.Ct
+local tricky=S("/\\")*P(-1)
+local attributes=lfs.attributes
+if sandbox then
+ sandbox.redefine(lfs.isfile,"lfs.isfile")
+ sandbox.redefine(lfs.isdir,"lfs.isdir")
+end
+function lfs.isdir(name)
+ if lpegmatch(tricky,name) then
+ return attributes(name,"mode")=="directory"
+ else
+ return attributes(name.."/.","mode")=="directory"
+ end
+end
+function lfs.isfile(name)
+ return attributes(name,"mode")=="file"
+end
local colon=P(":")
local period=P(".")
local periods=P("..")
@@ -3279,28 +3471,30 @@ local isroot=fwslash^1*-1
local hasroot=fwslash^1
local reslasher=lpeg.replacer(S("\\/"),"/")
local deslasher=lpeg.replacer(S("\\/")^1,"/")
-function file.join(...)
- local lst={... }
- local one=lst[1]
+function file.join(one,two,three,...)
+ if not two then
+ return one=="" and one or lpegmatch(stripper,one)
+ end
+ if one=="" then
+ return lpegmatch(stripper,three and concat({ two,three,... },"/") or two)
+ end
if lpegmatch(isnetwork,one) then
local one=lpegmatch(reslasher,one)
- local two=lpegmatch(deslasher,concat(lst,"/",2))
+ local two=lpegmatch(deslasher,three and concat({ two,three,... },"/") or two)
if lpegmatch(hasroot,two) then
return one..two
else
return one.."/"..two
end
elseif lpegmatch(isroot,one) then
- local two=lpegmatch(deslasher,concat(lst,"/",2))
+ local two=lpegmatch(deslasher,three and concat({ two,three,... },"/") or two)
if lpegmatch(hasroot,two) then
return two
else
return "/"..two
end
- elseif one=="" then
- return lpegmatch(stripper,concat(lst,"/",2))
else
- return lpegmatch(deslasher,concat(lst,"/"))
+ return lpegmatch(deslasher,concat({ one,two,three,... },"/"))
end
end
local drivespec=R("az","AZ")^1*colon
@@ -3474,7 +3668,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-md5"] = package.loaded["l-md5"] or true
--- original size: 3760, stripped down to: 2088
+-- original size: 3248, stripped down to: 2266
if not modules then modules={} end modules ['l-md5']={
version=1.001,
@@ -3492,14 +3686,20 @@ if not md5 then
}
end
local md5,file=md5,file
-local gsub,format,byte=string.gsub,string.format,string.byte
-local md5sum=md5.sum
-local function convert(str,fmt)
- return (gsub(md5sum(str),".",function(chr) return format(fmt,byte(chr)) end))
-end
-if not md5.HEX then function md5.HEX(str) return convert(str,"%02X") end end
-if not md5.hex then function md5.hex(str) return convert(str,"%02x") end end
-if not md5.dec then function md5.dec(str) return convert(str,"%03i") end end
+local gsub=string.gsub
+do
+ local patterns=lpeg and lpeg.patterns
+ if patterns then
+ local bytestoHEX=patterns.bytestoHEX
+ local bytestohex=patterns.bytestohex
+ local bytestodec=patterns.bytestodec
+ local lpegmatch=lpeg.match
+ local md5sum=md5.sum
+ if not md5.HEX then function md5.HEX(str) if str then return lpegmatch(bytestoHEX,md5sum(str)) end end end
+ if not md5.hex then function md5.hex(str) if str then return lpegmatch(bytestohex,md5sum(str)) end end end
+ if not md5.dec then function md5.dec(str) if str then return lpegmatch(bytestodec,md5sum(str)) end end end
+ end
+end
function file.needsupdating(oldname,newname,threshold)
local oldtime=lfs.attributes(oldname,"modification")
if oldtime then
@@ -3556,7 +3756,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-url"] = package.loaded["l-url"] or true
--- original size: 12292, stripped down to: 5585
+-- original size: 12531, stripped down to: 5721
if not modules then modules={} end modules ['l-url']={
version=1.001,
@@ -3642,19 +3842,25 @@ local splitquery=Cf (Ct("")*P { "sequence",
pair=Cg(key*equal*value),
},rawset)
local function hashed(str)
- if str=="" then
+ if not str or str=="" then
return {
scheme="invalid",
original=str,
}
end
- local s=split(str)
- local rawscheme=s[1]
- local rawquery=s[4]
- local somescheme=rawscheme~=""
- local somequery=rawquery~=""
+ local detailed=split(str)
+ local rawscheme=""
+ local rawquery=""
+ local somescheme=false
+ local somequery=false
+ if detailed then
+ rawscheme=detailed[1]
+ rawquery=detailed[4]
+ somescheme=rawscheme~=""
+ somequery=rawquery~=""
+ end
if not somescheme and not somequery then
- s={
+ return {
scheme="file",
authority="",
path=str,
@@ -3664,28 +3870,28 @@ local function hashed(str)
noscheme=true,
filename=str,
}
- else
- local authority,path,filename=s[2],s[3]
- if authority=="" then
- filename=path
- elseif path=="" then
- filename=""
- else
- filename=authority.."/"..path
- end
- s={
- scheme=rawscheme,
- authority=authority,
- path=path,
- query=lpegmatch(unescaper,rawquery),
- queries=lpegmatch(splitquery,rawquery),
- fragment=s[5],
- original=str,
- noscheme=false,
- filename=filename,
- }
end
- return s
+ local authority=detailed[2]
+ local path=detailed[3]
+ local filename=nil
+ if authority=="" then
+ filename=path
+ elseif path=="" then
+ filename=""
+ else
+ filename=authority.."/"..path
+ end
+ return {
+ scheme=rawscheme,
+ authority=authority,
+ path=path,
+ query=lpegmatch(unescaper,rawquery),
+ queries=lpegmatch(splitquery,rawquery),
+ fragment=detailed[5],
+ original=str,
+ noscheme=false,
+ filename=filename,
+ }
end
url.split=split
url.hasscheme=hasscheme
@@ -3719,7 +3925,7 @@ function url.construct(hash)
end
return lpegmatch(escaper,concat(fullurl))
end
-local pattern=Cs(noslash*R("az","AZ")*(S(":|")/":")*noslash*P(1)^0)
+local pattern=Cs(slash^-1/""*R("az","AZ")*((S(":|")/":")+P(":"))*slash*P(1)^0)
function url.filename(filename)
local spec=hashed(filename)
local path=spec.path
@@ -3767,7 +3973,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-dir"] = package.loaded["l-dir"] or true
--- original size: 14788, stripped down to: 9096
+-- original size: 16765, stripped down to: 11003
if not modules then modules={} end modules ['l-dir']={
version=1.001,
@@ -3777,7 +3983,7 @@ if not modules then modules={} end modules ['l-dir']={
license="see context related readme files"
}
local type,select=type,select
-local find,gmatch,match,gsub=string.find,string.gmatch,string.match,string.gsub
+local find,gmatch,match,gsub,sub=string.find,string.gmatch,string.match,string.gsub,string.sub
local concat,insert,remove,unpack=table.concat,table.insert,table.remove,table.unpack
local lpegmatch=lpeg.match
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
@@ -3786,53 +3992,126 @@ local dir=dir
local lfs=lfs
local attributes=lfs.attributes
local walkdir=lfs.dir
-local isdir=lfs.isdir
-local isfile=lfs.isfile
+local isdir=lfs.isdir
+local isfile=lfs.isfile
local currentdir=lfs.currentdir
local chdir=lfs.chdir
local mkdir=lfs.mkdir
local onwindows=os.type=="windows" or find(os.getenv("PATH"),";",1,true)
-if not isdir then
- function isdir(name)
- local a=attributes(name)
- return a and a.mode=="directory"
+if onwindows then
+ local tricky=S("/\\")*P(-1)
+ isdir=function(name)
+ if lpegmatch(tricky,name) then
+ return attributes(name,"mode")=="directory"
+ else
+ return attributes(name.."/.","mode")=="directory"
+ end
+ end
+ isfile=function(name)
+ return attributes(name,"mode")=="file"
end
lfs.isdir=isdir
-end
-if not isfile then
- function isfile(name)
- local a=attributes(name)
- return a and a.mode=="file"
+ lfs.isfile=isfile
+else
+ isdir=function(name)
+ return attributes(name,"mode")=="directory"
end
+ isfile=function(name)
+ return attributes(name,"mode")=="file"
+ end
+ lfs.isdir=isdir
lfs.isfile=isfile
end
function dir.current()
return (gsub(currentdir(),"\\","/"))
end
-local lfsisdir=isdir
-local function isdir(path)
- path=gsub(path,"[/\\]+$","")
- return lfsisdir(path)
+local function glob_pattern_function(path,patt,recurse,action)
+ if isdir(path) then
+ local usedpath
+ if path=="/" then
+ usedpath="/."
+ elseif not find(path,"/$") then
+ usedpath=path.."/."
+ path=path.."/"
+ else
+ usedpath=path
+ end
+ local dirs
+ for name in walkdir(usedpath) do
+ if name~="." and name~=".." then
+ local full=path..name
+ local mode=attributes(full,'mode')
+ if mode=='file' then
+ if not patt or find(full,patt) then
+ action(full)
+ end
+ elseif recurse and mode=="directory" then
+ if not dirs then
+ dirs={ full }
+ else
+ dirs[#dirs+1]=full
+ end
+ end
+ end
+ end
+ if dirs then
+ for i=1,#dirs do
+ glob_pattern_function(dirs[i],patt,recurse,action)
+ end
+ end
+ end
end
-lfs.isdir=isdir
-local function globpattern(path,patt,recurse,action)
- if path=="/" then
- path=path.."."
- elseif not find(path,"/$") then
- path=path..'/'
- end
- if isdir(path) then
- for name in walkdir(path) do
- local full=path..name
- local mode=attributes(full,'mode')
- if mode=='file' then
- if find(full,patt) then
- action(full)
+local function glob_pattern_table(path,patt,recurse,result)
+ if not result then
+ result={}
+ end
+ if isdir(path) then
+ local usedpath
+ if path=="/" then
+ usedpath="/."
+ elseif not find(path,"/$") then
+ usedpath=path.."/."
+ path=path.."/"
+ else
+ usedpath=path
+ end
+ local dirs
+ for name in walkdir(usedpath) do
+ if name~="." and name~=".." then
+ local full=path..name
+ local mode=attributes(full,'mode')
+ if mode=='file' then
+ if not patt or find(full,patt) then
+ result[#result+1]=full
+ end
+ elseif recurse and mode=="directory" then
+ if not dirs then
+ dirs={ full }
+ else
+ dirs[#dirs+1]=full
+ end
end
- elseif recurse and (mode=="directory") and (name~='.') and (name~="..") then
- globpattern(full,patt,recurse,action)
end
end
+ if dirs then
+ for i=1,#dirs do
+ glob_pattern_table(dirs[i],patt,recurse,result)
+ end
+ end
+ end
+ return result
+end
+local function globpattern(path,patt,recurse,method)
+ local kind=type(method)
+ if patt and sub(patt,1,-3)==path then
+ patt=false
+ end
+ if kind=="function" then
+ return glob_pattern_function(path,patt,recurse,method)
+ elseif kind=="table" then
+ return glob_pattern_table(path,patt,recurse,method)
+ else
+ return glob_pattern_table(path,patt,recurse,{})
end
end
dir.globpattern=globpattern
@@ -3845,34 +4124,40 @@ local function collectpattern(path,patt,recurse,result)
ok,scanner,first=xpcall(function() return walkdir(path) end,function() end)
end
if ok and type(scanner)=="function" then
- if not find(path,"/$") then path=path..'/' end
+ if not find(path,"/$") then
+ path=path..'/'
+ end
for name in scanner,first do
- local full=path..name
- local attr=attributes(full)
- local mode=attr.mode
- if mode=='file' then
- if find(full,patt) then
+ if name=="." then
+ elseif name==".." then
+ else
+ local full=path..name
+ local attr=attributes(full)
+ local mode=attr.mode
+ if mode=='file' then
+ if find(full,patt) then
+ result[name]=attr
+ end
+ elseif recurse and mode=="directory" then
+ attr.list=collectpattern(full,patt,recurse)
result[name]=attr
end
- elseif recurse and (mode=="directory") and (name~='.') and (name~="..") then
- attr.list=collectpattern(full,patt,recurse)
- result[name]=attr
end
end
end
return result
end
dir.collectpattern=collectpattern
-local separator
-if onwindows then
+local separator,pattern
+if onwindows then
local slash=S("/\\")/"/"
- pattern=Ct {
+ pattern={
[1]=(Cs(P(".")+slash^1)+Cs(R("az","AZ")*P(":")*slash^0)+Cc("./"))*V(2)*V(3),
[2]=Cs(((1-S("*?/\\"))^0*slash)^0),
[3]=Cs(P(1)^0)
}
-else
- pattern=Ct {
+else
+ pattern={
[1]=(C(P(".")+P("/")^1)+Cc("./"))*V(2)*V(3),
[2]=C(((1-S("*?/"))^0*P("/"))^0),
[3]=C(P(1)^0)
@@ -3890,9 +4175,8 @@ local function glob(str,t)
elseif 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 root,path,base=lpegmatch(pattern,str)
+ if root and path and base then
local recurse=find(base,"**",1,true)
local start=root..path
local result=lpegmatch(filter,start..base)
@@ -3914,16 +4198,12 @@ local function glob(str,t)
return { str }
end
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 root,path,base=lpegmatch(pattern,str)
+ if root and path and base then
local recurse=find(base,"**",1,true)
local start=root..path
local result=lpegmatch(filter,start..base)
- globpattern(start,result,recurse,action)
- return t
+ return globpattern(start,result,recurse,t)
else
return {}
end
@@ -4071,47 +4351,51 @@ else
end
end
dir.makedirs=dir.mkdirs
-if onwindows then
- function dir.expandname(str)
- 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()
+do
+ local chdir=sandbox and sandbox.original(chdir) or chdir
+ if onwindows then
+ local xcurrentdir=dir.current
+ function dir.expandname(str)
+ local first,nothing,last=match(str,"^(//)(//*)(.*)$")
+ if first then
+ first=xcurrentdir().."/"
+ 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=xcurrentdir()
+ end
+ chdir(d)
end
- chdir(d)
+ end
+ if not first then
+ first,last=xcurrentdir(),str
+ end
+ last=gsub(last,"//","/")
+ last=gsub(last,"/%./","/")
+ last=gsub(last,"^/*","")
+ first=gsub(first,"/*$","")
+ if last=="" or last=="." then
+ return first
+ else
+ return first.."/"..last
end
end
- if not first then
- first,last=dir.current(),str
- end
- last=gsub(last,"//","/")
- last=gsub(last,"/%./","/")
- last=gsub(last,"^/*","")
- first=gsub(first,"/*$","")
- if last=="" or last=="." then
- return first
- else
- return first.."/"..last
- end
- end
-else
- function dir.expandname(str)
- if not find(str,"^/") then
- str=currentdir().."/"..str
+ else
+ function dir.expandname(str)
+ if not find(str,"^/") then
+ str=currentdir().."/"..str
+ end
+ str=gsub(str,"//","/")
+ str=gsub(str,"/%./","/")
+ str=gsub(str,"(.)/%.$","%1")
+ return str
end
- str=gsub(str,"//","/")
- str=gsub(str,"/%./","/")
- str=gsub(str,"(.)/%.$","%1")
- return str
end
end
file.expandname=dir.expandname
@@ -4154,7 +4438,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-boolean"] = package.loaded["l-boolean"] or true
--- original size: 1809, stripped down to: 1527
+-- original size: 1850, stripped down to: 1568
if not modules then modules={} end modules ['l-boolean']={
version=1.001,
@@ -4208,11 +4492,11 @@ function string.booleanstring(str)
return str=="yes" or str=="on" or str=="t"
end
end
-function string.is_boolean(str,default)
+function string.is_boolean(str,default,strict)
if type(str)=="string" then
- if str=="true" or str=="yes" or str=="on" or str=="t" or str=="1" then
+ if str=="true" or str=="yes" or str=="on" or str=="t" or (not strict and str=="1") then
return true
- elseif str=="false" or str=="no" or str=="off" or str=="f" or str=="0" then
+ elseif str=="false" or str=="no" or str=="off" or str=="f" or (not strict and str=="0") then
return false
end
end
@@ -4226,7 +4510,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-unicode"] = package.loaded["l-unicode"] or true
--- original size: 33706, stripped down to: 14938
+-- original size: 37233, stripped down to: 15684
if not modules then modules={} end modules ['l-unicode']={
version=1.001,
@@ -4242,7 +4526,9 @@ local type=type
local char,byte,format,sub,gmatch=string.char,string.byte,string.format,string.sub,string.gmatch
local concat=table.concat
local P,C,R,Cs,Ct,Cmt,Cc,Carg,Cp=lpeg.P,lpeg.C,lpeg.R,lpeg.Cs,lpeg.Ct,lpeg.Cmt,lpeg.Cc,lpeg.Carg,lpeg.Cp
-local lpegmatch,patterns=lpeg.match,lpeg.patterns
+local lpegmatch=lpeg.match
+local patterns=lpeg.patterns
+local tabletopattern=lpeg.utfchartabletopattern
local bytepairs=string.bytepairs
local finder=lpeg.finder
local replacer=lpeg.replacer
@@ -4251,7 +4537,7 @@ local utfgmatch=utf.gmatch
local p_utftype=patterns.utftype
local p_utfstricttype=patterns.utfstricttype
local p_utfoffset=patterns.utfoffset
-local p_utf8char=patterns.utf8char
+local p_utf8char=patterns.utf8character
local p_utf8byte=patterns.utf8byte
local p_utfbom=patterns.utfbom
local p_newline=patterns.newline
@@ -4450,15 +4736,52 @@ if not utf.sub then
end
end
end
-function utf.remapper(mapping)
- local pattern=Cs((p_utf8char/mapping)^0)
- return function(str)
- if not str or str=="" then
- return ""
+function utf.remapper(mapping,option)
+ local variant=type(mapping)
+ if variant=="table" then
+ if option=="dynamic" then
+ local pattern=false
+ table.setmetatablenewindex(mapping,function(t,k,v) rawset(t,k,v) pattern=false end)
+ return function(str)
+ if not str or str=="" then
+ return ""
+ else
+ if not pattern then
+ pattern=Cs((tabletopattern(mapping)/mapping+p_utf8char)^0)
+ end
+ return lpegmatch(pattern,str)
+ end
+ end
+ elseif option=="pattern" then
+ return Cs((tabletopattern(mapping)/mapping+p_utf8char)^0)
else
- return lpegmatch(pattern,str)
+ local pattern=Cs((tabletopattern(mapping)/mapping+p_utf8char)^0)
+ return function(str)
+ if not str or str=="" then
+ return ""
+ else
+ return lpegmatch(pattern,str)
+ end
+ end,pattern
+ end
+ elseif variant=="function" then
+ if option=="pattern" then
+ return Cs((p_utf8char/mapping+p_utf8char)^0)
+ else
+ local pattern=Cs((p_utf8char/mapping+p_utf8char)^0)
+ return function(str)
+ if not str or str=="" then
+ return ""
+ else
+ return lpegmatch(pattern,str)
+ end
+ end,pattern
+ end
+ else
+ return function(str)
+ return str or ""
end
- end,pattern
+ end
end
function utf.replacer(t)
local r=replacer(t,false,false,true)
@@ -4508,190 +4831,157 @@ function utf.magic(f)
end
local utf16_to_utf8_be,utf16_to_utf8_le
local utf32_to_utf8_be,utf32_to_utf8_le
-local utf_16_be_linesplitter=patterns.utfbom_16_be^-1*lpeg.tsplitat(patterns.utf_16_be_nl)
-local utf_16_le_linesplitter=patterns.utfbom_16_le^-1*lpeg.tsplitat(patterns.utf_16_le_nl)
-if bytepairs then
- utf16_to_utf8_be=function(t)
- if type(t)=="string" then
- t=lpegmatch(utf_16_be_linesplitter,t)
- end
- local 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)
- end
- return t
+local utf_16_be_getbom=patterns.utfbom_16_be^-1
+local utf_16_le_getbom=patterns.utfbom_16_le^-1
+local utf_32_be_getbom=patterns.utfbom_32_be^-1
+local utf_32_le_getbom=patterns.utfbom_32_le^-1
+local utf_16_be_linesplitter=utf_16_be_getbom*lpeg.tsplitat(patterns.utf_16_be_nl)
+local utf_16_le_linesplitter=utf_16_le_getbom*lpeg.tsplitat(patterns.utf_16_le_nl)
+local utf_32_be_linesplitter=utf_32_be_getbom*lpeg.tsplitat(patterns.utf_32_be_nl)
+local utf_32_le_linesplitter=utf_32_le_getbom*lpeg.tsplitat(patterns.utf_32_le_nl)
+local more=0
+local p_utf16_to_utf8_be=C(1)*C(1)/function(left,right)
+ local now=256*byte(left)+byte(right)
+ if more>0 then
+ now=(more-0xD800)*0x400+(now-0xDC00)+0x10000
+ more=0
+ return utfchar(now)
+ elseif now>=0xD800 and now<=0xDBFF then
+ more=now
+ return ""
+ else
+ return utfchar(now)
+ end
+end
+local p_utf16_to_utf8_le=C(1)*C(1)/function(right,left)
+ local now=256*byte(left)+byte(right)
+ if more>0 then
+ now=(more-0xD800)*0x400+(now-0xDC00)+0x10000
+ more=0
+ return utfchar(now)
+ elseif now>=0xD800 and now<=0xDBFF then
+ more=now
+ return ""
+ else
+ return utfchar(now)
+ end
+end
+local p_utf32_to_utf8_be=C(1)*C(1)*C(1)*C(1)/function(a,b,c,d)
+ return utfchar(256*256*256*byte(a)+256*256*byte(b)+256*byte(c)+byte(d))
+end
+local p_utf32_to_utf8_le=C(1)*C(1)*C(1)*C(1)/function(a,b,c,d)
+ return utfchar(256*256*256*byte(d)+256*256*byte(c)+256*byte(b)+byte(a))
+end
+p_utf16_to_utf8_be=P(true)/function() more=0 end*utf_16_be_getbom*Cs(p_utf16_to_utf8_be^0)
+p_utf16_to_utf8_le=P(true)/function() more=0 end*utf_16_le_getbom*Cs(p_utf16_to_utf8_le^0)
+p_utf32_to_utf8_be=P(true)/function() more=0 end*utf_32_be_getbom*Cs(p_utf32_to_utf8_be^0)
+p_utf32_to_utf8_le=P(true)/function() more=0 end*utf_32_le_getbom*Cs(p_utf32_to_utf8_le^0)
+patterns.utf16_to_utf8_be=p_utf16_to_utf8_be
+patterns.utf16_to_utf8_le=p_utf16_to_utf8_le
+patterns.utf32_to_utf8_be=p_utf32_to_utf8_be
+patterns.utf32_to_utf8_le=p_utf32_to_utf8_le
+utf16_to_utf8_be=function(s)
+ if s and s~="" then
+ return lpegmatch(p_utf16_to_utf8_be,s)
+ else
+ return s
end
- utf16_to_utf8_le=function(t)
- if type(t)=="string" then
- t=lpegmatch(utf_16_le_linesplitter,t)
- end
- local 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)
- end
- return t
+end
+local utf16_to_utf8_be_t=function(t)
+ if not t then
+ return nil
+ elseif type(t)=="string" then
+ t=lpegmatch(utf_16_be_linesplitter,t)
end
- utf32_to_utf8_be=function(t)
- if type(t)=="string" then
- t=lpegmatch(utflinesplitter,t)
- end
- local result={}
- for i=1,#t do
- local r,more=0,-1
- for a,b in bytepairs(t[i]) do
- if a and b then
- if more<0 then
- more=256*256*256*a+256*256*b
- else
- r=r+1
- result[t]=utfchar(more+256*a+b)
- more=-1
- end
- else
- break
- end
- end
- t[i]=concat(result,"",1,r)
+ for i=1,#t do
+ local s=t[i]
+ if s~="" then
+ t[i]=lpegmatch(p_utf16_to_utf8_be,s)
end
- return t
end
- utf32_to_utf8_le=function(t)
- if type(t)=="string" then
- t=lpegmatch(utflinesplitter,t)
- end
- local result={}
- for i=1,#t do
- local r,more=0,-1
- for a,b in bytepairs(t[i]) do
- if a and b then
- if more<0 then
- more=256*b+a
- else
- r=r+1
- result[t]=utfchar(more+256*256*256*b+256*256*a)
- more=-1
- end
- else
- break
- end
- end
- t[i]=concat(result,"",1,r)
- end
- return t
+ return t
+end
+utf16_to_utf8_le=function(s)
+ if s and s~="" then
+ return lpegmatch(p_utf16_to_utf8_le,s)
+ else
+ return s
end
-else
- utf16_to_utf8_be=function(t)
- if type(t)=="string" then
- t=lpegmatch(utf_16_be_linesplitter,t)
- end
- local result={}
- for i=1,#t do
- local r,more=0,0
- for left,right in gmatch(t[i],"(.)(.)") do
- if left=="\000" then
- r=r+1
- result[r]=utfchar(byte(right))
- elseif right then
- local now=256*byte(left)+byte(right)
- if more>0 then
- now=(more-0xD800)*0x400+(now-0xDC00)+0x10000
- 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)
+end
+local utf16_to_utf8_le_t=function(t)
+ if not t then
+ return nil
+ elseif type(t)=="string" then
+ t=lpegmatch(utf_16_le_linesplitter,t)
+ end
+ for i=1,#t do
+ local s=t[i]
+ if s~="" then
+ t[i]=lpegmatch(p_utf16_to_utf8_le,s)
end
- return t
end
- utf16_to_utf8_le=function(t)
- if type(t)=="string" then
- t=lpegmatch(utf_16_le_linesplitter,t)
+ return t
+end
+utf32_to_utf8_be=function(s)
+ if s and s~="" then
+ return lpegmatch(p_utf32_to_utf8_be,s)
+ else
+ return s
+ end
+end
+local utf32_to_utf8_be_t=function(t)
+ if not t then
+ return nil
+ elseif type(t)=="string" then
+ t=lpegmatch(utf_32_be_linesplitter,t)
+ end
+ for i=1,#t do
+ local s=t[i]
+ if s~="" then
+ t[i]=lpegmatch(p_utf32_to_utf8_be,s)
end
- local result={}
- for i=1,#t do
- local r,more=0,0
- for left,right in gmatch(t[i],"(.)(.)") do
- if right=="\000" then
- r=r+1
- result[r]=utfchar(byte(left))
- elseif right then
- local now=256*byte(right)+byte(left)
- if more>0 then
- now=(more-0xD800)*0x400+(now-0xDC00)+0x10000
- 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)
+ end
+ return t
+end
+utf32_to_utf8_le=function(s)
+ if s and s~="" then
+ return lpegmatch(p_utf32_to_utf8_le,s)
+ else
+ return s
+ end
+end
+local utf32_to_utf8_le_t=function(t)
+ if not t then
+ return nil
+ elseif type(t)=="string" then
+ t=lpegmatch(utf_32_le_linesplitter,t)
+ end
+ for i=1,#t do
+ local s=t[i]
+ if s~="" then
+ t[i]=lpegmatch(p_utf32_to_utf8_le,s)
end
- return t
end
- utf32_to_utf8_le=function() return {} end
- utf32_to_utf8_be=function() return {} end
+ return t
end
+utf.utf16_to_utf8_le_t=utf16_to_utf8_le_t
+utf.utf16_to_utf8_be_t=utf16_to_utf8_be_t
+utf.utf32_to_utf8_le_t=utf32_to_utf8_le_t
+utf.utf32_to_utf8_be_t=utf32_to_utf8_be_t
utf.utf16_to_utf8_le=utf16_to_utf8_le
utf.utf16_to_utf8_be=utf16_to_utf8_be
utf.utf32_to_utf8_le=utf32_to_utf8_le
utf.utf32_to_utf8_be=utf32_to_utf8_be
-function utf.utf8_to_utf8(t)
+function utf.utf8_to_utf8_t(t)
return type(t)=="string" and lpegmatch(utflinesplitter,t) or t
end
-function utf.utf16_to_utf8(t,endian)
- return endian and utf16_to_utf8_be(t) or utf16_to_utf8_le(t) or t
+function utf.utf16_to_utf8_t(t,endian)
+ return endian and utf16_to_utf8_be_t(t) or utf16_to_utf8_le_t(t) or t
end
-function utf.utf32_to_utf8(t,endian)
- return endian and utf32_to_utf8_be(t) or utf32_to_utf8_le(t) or t
+function utf.utf32_to_utf8_t(t,endian)
+ return endian and utf32_to_utf8_be_t(t) or utf32_to_utf8_le_t(t) or t
end
-local function little(c)
- local b=byte(c)
+local function little(b)
if b<0x10000 then
return char(b%256,b/256)
else
@@ -4700,8 +4990,7 @@ local function little(c)
return char(b1%256,b1/256,b2%256,b2/256)
end
end
-local function big(c)
- local b=byte(c)
+local function big(b)
if b<0x10000 then
return char(b/256,b%256)
else
@@ -4710,27 +4999,29 @@ local function big(c)
return char(b1/256,b1%256,b2/256,b2%256)
end
end
-local _,l_remap=utf.remapper(little)
-local _,b_remap=utf.remapper(big)
-function utf.utf8_to_utf16_be(str,nobom)
+local l_remap=Cs((p_utf8byte/little+P(1)/"")^0)
+local b_remap=Cs((p_utf8byte/big+P(1)/"")^0)
+local function utf8_to_utf16_be(str,nobom)
if nobom then
return lpegmatch(b_remap,str)
else
return char(254,255)..lpegmatch(b_remap,str)
end
end
-function utf.utf8_to_utf16_le(str,nobom)
+local function utf8_to_utf16_le(str,nobom)
if nobom then
return lpegmatch(l_remap,str)
else
return char(255,254)..lpegmatch(l_remap,str)
end
end
+utf.utf8_to_utf16_be=utf8_to_utf16_be
+utf.utf8_to_utf16_le=utf8_to_utf16_le
function utf.utf8_to_utf16(str,littleendian,nobom)
if littleendian then
- return utf.utf8_to_utf16_le(str,nobom)
+ return utf8_to_utf16_le(str,nobom)
else
- return utf.utf8_to_utf16_be(str,nobom)
+ return utf8_to_utf16_be(str,nobom)
end
end
local pattern=Cs (
@@ -4746,16 +5037,16 @@ function utf.xstring(s)
return format("0x%05X",type(s)=="number" and s or utfbyte(s))
end
function utf.toeight(str)
- if not str then
+ if not str or str=="" then
return nil
end
local utftype=lpegmatch(p_utfstricttype,str)
if utftype=="utf-8" then
- return sub(str,4)
- elseif utftype=="utf-16-le" then
- return utf16_to_utf8_le(str)
+ return sub(str,4)
elseif utftype=="utf-16-be" then
- return utf16_to_utf8_ne(str)
+ return utf16_to_utf8_be(str)
+ elseif utftype=="utf-16-le" then
+ return utf16_to_utf8_le(str)
else
return str
end
@@ -4834,7 +5125,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-math"] = package.loaded["l-math"] or true
--- original size: 915, stripped down to: 836
+-- original size: 974, stripped down to: 890
if not modules then modules={} end modules ['l-math']={
version=1.001,
@@ -4844,6 +5135,9 @@ if not modules then modules={} end modules ['l-math']={
license="see context related readme files"
}
local floor,sin,cos,tan=math.floor,math.sin,math.cos,math.tan
+if not math.ceiling then
+ math.ceiling=math.ceil
+end
if not math.round then
function math.round(x) return floor(x+0.5) end
end
@@ -4871,7 +5165,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-str"] = package.loaded["util-str"] or true
--- original size: 33063, stripped down to: 18397
+-- original size: 34407, stripped down to: 18852
if not modules then modules={} end modules ['util-str']={
version=1.001,
@@ -5001,10 +5295,12 @@ local striplinepatterns={
["retain"]=p_retain_normal,
["retain and collapse"]=p_retain_collapse,
["retain and no empty"]=p_retain_noempty,
+ ["collapse"]=patterns.collapser,
}
+setmetatable(striplinepatterns,{ __index=function(t,k) return p_prune_collapse end })
strings.striplinepatterns=striplinepatterns
function strings.striplines(str,how)
- return str and lpegmatch(how and striplinepatterns[how] or p_prune_collapse,str) or str
+ return str and lpegmatch(striplinepatterns[how],str) or str
end
strings.striplong=strings.striplines
function strings.nice(str)
@@ -5044,10 +5340,10 @@ string.tracedchars=tracedchars
strings.tracers=tracedchars
function string.tracedchar(b)
if type(b)=="number" then
- return tracedchars[b] or (utfchar(b).." (U+"..format('%05X',b)..")")
+ return tracedchars[b] or (utfchar(b).." (U+"..format("%05X",b)..")")
else
local c=utfbyte(b)
- return tracedchars[c] or (b.." (U+"..format('%05X',c)..")")
+ return tracedchars[c] or (b.." (U+"..(c and format("%05X",c) or "?????")..")")
end
end
function number.signed(i)
@@ -5184,12 +5480,12 @@ local format_f=function(f)
n=n+1
return format("format('%%%sf',a%s)",f,n)
end
-local format_F=function(f)
+local format_F=function(f)
n=n+1
if not f or f=="" then
- return format("(((a%s > -0.0000000005 and a%s < 0.0000000005) and '0') or (a%s == 1 and '1') or format('%%.9f',a%s))",n,n,n,n)
+ return format("(((a%s > -0.0000000005 and a%s < 0.0000000005) and '0') or format((a%s %% 1 == 0) and '%%i' or '%%.9f',a%s))",n,n,n,n)
else
- return format("((a%s == 0 and '0') or (a%s == 1 and '1') or format('%%%sf',a%s))",n,n,f,n)
+ return format("format((a%s %% 1 == 0) and '%%i' or '%%%sf',a%s)",n,f,n)
end
end
local format_g=function(f)
@@ -5417,7 +5713,6 @@ local builder=Cs { "start",
+V("j")+V("J")
+V("m")+V("M")
+V("z")
-+V("*")
)+V("*")
)*(P(-1)+Carg(1))
)^0,
@@ -5461,6 +5756,7 @@ local builder=Cs { "start",
["a"]=(prefix_any*P("a"))/format_a,
["A"]=(prefix_any*P("A"))/format_A,
["*"]=Cs(((1-P("%"))^1+P("%%")/"%%")^1)/format_rest,
+ ["?"]=Cs(((1-P("%"))^1 )^1)/format_rest,
["!"]=Carg(2)*prefix_any*P("!")*C((1-P("!"))^1)*P("!")/format_extension,
}
local direct=Cs (
@@ -5535,6 +5831,15 @@ else
add(formatters,"tex",[[lpegmatch(texescape,%s)]],{ texescape=lpeg.patterns.texescape })
add(formatters,"lua",[[lpegmatch(luaescape,%s)]],{ luaescape=lpeg.patterns.luaescape })
end
+local dquote=patterns.dquote
+local equote=patterns.escaped+dquote/'\\"'+1
+local space=patterns.space
+local cquote=Cc('"')
+local pattern=Cs(dquote*(equote-P(-2))^0*dquote)
++Cs(cquote*(equote-space)^0*space*equote^0*cquote)
+function string.optionalquoted(str)
+ return lpegmatch(pattern,str) or str
+end
end -- of closure
@@ -5543,7 +5848,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tab"] = package.loaded["util-tab"] or true
--- original size: 23985, stripped down to: 16069
+-- original size: 24267, stripped down to: 16260
if not modules then modules={} end modules ['util-tab']={
version=1.001,
@@ -5633,6 +5938,15 @@ function tables.removevalue(t,value)
end
end
end
+function tables.replacevalue(t,oldvalue,newvalue)
+ if oldvalue and newvalue then
+ for i=1,#t do
+ if t[i]==oldvalue then
+ t[i]=newvalue
+ end
+ end
+ end
+end
function tables.insertbeforevalue(t,value,extra)
for i=1,#t do
if t[i]==extra then
@@ -6026,7 +6340,7 @@ function table.serialize(root,name,specification)
end
depth=depth+1
end
- if root and next(root) then
+ if root and next(root)~=nil then
local first=nil
local last=0
last=#root
@@ -6051,7 +6365,7 @@ function table.serialize(root,name,specification)
elseif tv=="string" then
n=n+1 t[n]=f_val_str(depth,v)
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
n=n+1 t[n]=f_val_not(depth)
else
local st=simple_table(v)
@@ -6081,7 +6395,7 @@ function table.serialize(root,name,specification)
n=n+1 t[n]=f_key_boo_value_str(depth,k,v)
end
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
if tk=="number" then
n=n+1 t[n]=f_key_num_value_not(depth,k,v)
elseif tk=="string" then
@@ -6139,7 +6453,7 @@ function table.serialize(root,name,specification)
local dummy=root._w_h_a_t_e_v_e_r_
root._w_h_a_t_e_v_e_r_=nil
end
- if next(root) then
+ if next(root)~=nil then
do_serialize(root,name,1,0)
end
end
@@ -6302,7 +6616,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-prs"] = package.loaded["util-prs"] or true
--- original size: 19618, stripped down to: 14012
+-- original size: 21751, stripped down to: 15108
if not modules then modules={} end modules ['util-prs']={
version=1.001,
@@ -6458,11 +6772,30 @@ function parsers.settings_to_array(str,strict)
return { str }
end
end
-local separator=space^0*comma*space^0
-local value=P(lbrace*C((nobrace+nestedbraces)^0)*rbrace)+C((nestedbraces+(1-(space^0*(comma+P(-1)))))^0)
-local withvalue=Carg(1)*value/function(f,s) return f(s) end
-local pattern_a=spaces*Ct(value*(separator*value)^0)
-local pattern_b=spaces*withvalue*(separator*withvalue)^0
+local cache_a={}
+local cache_b={}
+function parsers.groupedsplitat(symbol,withaction)
+ if not symbol then
+ symbol=","
+ end
+ local pattern=(withaction and cache_b or cache_a)[symbol]
+ if not pattern then
+ local symbols=S(symbol)
+ local separator=space^0*symbols*space^0
+ local value=P(lbrace*C((nobrace+nestedbraces)^0)*rbrace)+C((nestedbraces+(1-(space^0*(symbols+P(-1)))))^0)
+ if withaction then
+ local withvalue=Carg(1)*value/function(f,s) return f(s) end
+ pattern=spaces*withvalue*(separator*withvalue)^0
+ cache_b[symbol]=pattern
+ else
+ pattern=spaces*Ct(value*(separator*value)^0)
+ cache_a[symbol]=pattern
+ end
+ end
+ return pattern
+end
+local pattern_a=parsers.groupedsplitat(",",false)
+local pattern_b=parsers.groupedsplitat(",",true)
function parsers.stripped_settings_to_array(str)
if not str or str=="" then
return {}
@@ -6524,12 +6857,9 @@ function parsers.array_to_string(a,separator)
return ""
end
end
-function parsers.settings_to_set(str,t)
- t=t or {}
- for s in gmatch(str,"[^, ]+") do
- t[s]=true
- end
- return t
+local pattern=Cf(Ct("")*Cg(C((1-S(", "))^1)*S(", ")^0*Cc(true))^1,rawset)
+function utilities.parsers.settings_to_set(str,t)
+ return str and lpegmatch(pattern,str) or {}
end
function parsers.simple_hash_to_string(h,separator)
local t,tn={},0
@@ -6541,12 +6871,16 @@ function parsers.simple_hash_to_string(h,separator)
end
return concat(t,separator or ",")
end
-local str=C((1-whitespace-equal)^1)
+local str=Cs(lpegpatterns.unquoted)+C((1-whitespace-equal)^1)
local setting=Cf(Carg(1)*(whitespace^0*Cg(str*whitespace^0*(equal*whitespace^0*str+Cc(""))))^1,rawset)
local splitter=setting^1
function utilities.parsers.options_to_hash(str,target)
return str and lpegmatch(splitter,str,1,target or {}) or {}
end
+local splitter=lpeg.tsplitat(" ")
+function utilities.parsers.options_to_array(str)
+ return str and lpegmatch(splitter,str) or {}
+end
local value=P(lbrace*C((nobrace+nestedbraces)^0)*rbrace)+C(digit^1*lparent*(noparent+nestedparents)^1*rparent)+C((nestedbraces+(1-comma))^1)
local pattern_a=spaces*Ct(value*(separator*value)^0)
local function repeater(n,str)
@@ -6668,7 +7002,7 @@ function parsers.rfc4180splitter(specification)
local field=escaped+non_escaped+Cc("")
local record=Ct(field*(separator*field)^1)
local headerline=record*Cp()
- local wholeblob=Ct((newline^-1*record)^0)
+ local wholeblob=Ct((newline^(specification.strict and -1 or 1)*record)^0)
return function(data,getheader)
if getheader then
local header,position=lpegmatch(headerline,data)
@@ -6705,13 +7039,13 @@ function parsers.stepper(str,n,action)
lpegmatch(stepper,str,1,n,action or print)
end
end
-local pattern_math=Cs((P("%")/"\\percent "+P("^")*Cc("{")*lpegpatterns.integer*Cc("}")+P(1))^0)
-local pattern_text=Cs((P("%")/"\\percent "+(P("^")/"\\high")*Cc("{")*lpegpatterns.integer*Cc("}")+P(1))^0)
+local pattern_math=Cs((P("%")/"\\percent "+P("^")*Cc("{")*lpegpatterns.integer*Cc("}")+anything)^0)
+local pattern_text=Cs((P("%")/"\\percent "+(P("^")/"\\high")*Cc("{")*lpegpatterns.integer*Cc("}")+anything)^0)
patterns.unittotex=pattern
function parsers.unittotex(str,textmode)
return lpegmatch(textmode and pattern_text or pattern_math,str)
end
-local pattern=Cs((P("^")/"<sup>"*lpegpatterns.integer*Cc("</sup>")+P(1))^0)
+local pattern=Cs((P("^")/"<sup>"*lpegpatterns.integer*Cc("</sup>")+anything)^0)
function parsers.unittoxml(str)
return lpegmatch(pattern,str)
end
@@ -6783,6 +7117,18 @@ function utilities.parsers.runtime(time)
local seconds=mod(time,60)
return days,hours,minutes,seconds
end
+local spacing=whitespace^0
+local apply=P("->")
+local method=C((1-apply)^1)
+local token=lbrace*C((1-rbrace)^1)*rbrace+C(anything^1)
+local pattern=spacing*(method*spacing*apply+Carg(1))*spacing*token
+function utilities.parsers.splitmethod(str,default)
+ if str then
+ return lpegmatch(pattern,str,1,default or false)
+ else
+ return default or false,""
+ end
+end
end -- of closure
@@ -6872,7 +7218,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-set"] = package.loaded["trac-set"] or true
--- original size: 12365, stripped down to: 8799
+-- original size: 12482, stripped down to: 8864
if not modules then modules={} end modules ['trac-set']={
version=1.001,
@@ -6900,7 +7246,7 @@ function setters.initialize(filename,name,values)
local data=setter.data
if data then
for key,newvalue in next,values do
- local newvalue=is_boolean(newvalue,newvalue)
+ local newvalue=is_boolean(newvalue,newvalue,true)
local functions=data[key]
if functions then
local oldvalue=functions.value
@@ -6954,7 +7300,7 @@ local function set(t,what,newvalue)
elseif not value then
value=false
else
- value=is_boolean(value,value)
+ value=is_boolean(value,value,true)
end
w=topattern(w,true,true)
for name,functions in next,data do
@@ -7093,6 +7439,7 @@ function setters.new(name)
report=function(...) setters.report (setter,...) end,
enable=function(...) enable (setter,...) end,
disable=function(...) disable (setter,...) end,
+ reset=function(...) reset (setter,...) end,
register=function(...) register(setter,...) end,
list=function(...) list (setter,...) end,
show=function(...) show (setter,...) end,
@@ -7184,7 +7531,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-log"] = package.loaded["trac-log"] or true
--- original size: 25613, stripped down to: 16617
+-- original size: 29359, stripped down to: 20483
if not modules then modules={} end modules ['trac-log']={
version=1.001,
@@ -7193,15 +7540,18 @@ if not modules then modules={} end modules ['trac-log']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local next,type,select,print=next,type,select,print
local write_nl,write=texio and texio.write_nl or print,texio and texio.write or io.write
local format,gmatch,find=string.format,string.gmatch,string.find
local concat,insert,remove=table.concat,table.insert,table.remove
local topattern=string.topattern
-local next,type,select=next,type,select
local utfchar=utf.char
+local datetime=os.date
+local openfile=io.open
local setmetatableindex=table.setmetatableindex
local formatters=string.formatters
local texgetcount=tex and tex.getcount
+local variant="default"
logs=logs or {}
local logs=logs
local moreinfo=[[
@@ -7211,32 +7561,122 @@ 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
]]
-utilities.strings.formatters.add (
+formatters.add (
formatters,"unichr",
[["U+" .. format("%%05X",%s) .. " (" .. utfchar(%s) .. ")"]]
)
-utilities.strings.formatters.add (
+formatters.add (
formatters,"chruni",
[[utfchar(%s) .. " (U+" .. format("%%05X",%s) .. ")"]]
)
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,setlogfile,settimedlog,setprocessor,setformatters
+local direct,subdirect,writer,pushtarget,poptarget,setlogfile,settimedlog,setprocessor,setformatters,newline
if tex and (tex.jobname or tex.formatname) then
- local valueiskey={ __index=function(t,k) t[k]=k return k end }
- local target="term and log"
+ local function useluawrites()
+ local texio_write_nl=texio.write_nl
+ local texio_write=texio.write
+ local io_write=io.write
+ write_nl=function(target,...)
+ if not io_write then
+ io_write=io.write
+ end
+ if target=="term and log" then
+ texio_write_nl("log",...)
+ texio_write_nl("term","")
+ io_write(...)
+ elseif target=="log" then
+ texio_write_nl("log",...)
+ elseif target=="term" then
+ texio_write_nl("term","")
+ io_write(...)
+ elseif target~="none" then
+ texio_write_nl("log",target,...)
+ texio_write_nl("term","")
+ io_write(target,...)
+ end
+ end
+ write=function(target,...)
+ if not io_write then
+ io_write=io.write
+ end
+ if target=="term and log" then
+ texio_write("log",...)
+ io_write(...)
+ elseif target=="log" then
+ texio_write("log",...)
+ elseif target=="term" then
+ io_write(...)
+ elseif target~="none" then
+ texio_write("log",target,...)
+ io_write(target,...)
+ end
+ end
+ texio.write=write
+ texio.write_nl=write_nl
+ useluawrites=ignore
+ end
+ local whereto="both"
+ local target=nil
+ local targets=nil
+ local formats=table.setmetatableindex("self")
+ local translations=table.setmetatableindex("self")
+ local report_yes,subreport_yes,direct_yes,subdirect_yes,status_yes
+ local report_nop,subreport_nop,direct_nop,subdirect_nop,status_nop
+ local variants={
+ default={
+ formats={
+ report_yes=formatters["%-15s > %s\n"],
+ report_nop=formatters["%-15s >\n"],
+ direct_yes=formatters["%-15s > %s"],
+ direct_nop=formatters["%-15s >"],
+ subreport_yes=formatters["%-15s > %s > %s\n"],
+ subreport_nop=formatters["%-15s > %s >\n"],
+ subdirect_yes=formatters["%-15s > %s > %s"],
+ subdirect_nop=formatters["%-15s > %s >"],
+ status_yes=formatters["%-15s : %s\n"],
+ status_nop=formatters["%-15s :\n"],
+ },
+ targets={
+ logfile="log",
+ log="log",
+ file="log",
+ console="term",
+ terminal="term",
+ both="term and log",
+ },
+ },
+ ansi={
+ formats={
+ report_yes=formatters["%-15s > %s\n"],
+ report_nop=formatters["%-15s >\n"],
+ direct_yes=formatters["%-15s > %s"],
+ direct_nop=formatters["%-15s >"],
+ subreport_yes=formatters["%-15s > %s > %s\n"],
+ subreport_nop=formatters["%-15s > %s >\n"],
+ subdirect_yes=formatters["%-15s > %s > %s"],
+ subdirect_nop=formatters["%-15s > %s >"],
+ status_yes=formatters["%-15s : %s\n"],
+ status_nop=formatters["%-15s :\n"],
+ },
+ targets={
+ logfile="none",
+ log="none",
+ file="none",
+ console="term",
+ terminal="term",
+ both="term",
+ },
+ }
+ }
logs.flush=io.flush
- local formats={} setmetatable(formats,valueiskey)
- local translations={} setmetatable(translations,valueiskey)
writer=function(...)
write_nl(target,...)
end
newline=function()
write_nl(target,"\n")
end
- local report_yes=formatters["%-15s > %s\n"]
- local report_nop=formatters["%-15s >\n"]
report=function(a,b,c,...)
if c then
write_nl(target,report_yes(translations[a],formatters[formats[b]](c,...)))
@@ -7248,8 +7688,6 @@ if tex and (tex.jobname or tex.formatname) then
write_nl(target,"\n")
end
end
- local direct_yes=formatters["%-15s > %s"]
- local direct_nop=formatters["%-15s >"]
direct=function(a,b,c,...)
if c then
return direct_yes(translations[a],formatters[formats[b]](c,...))
@@ -7261,8 +7699,6 @@ if tex and (tex.jobname or tex.formatname) then
return ""
end
end
- local subreport_yes=formatters["%-15s > %s > %s\n"]
- local subreport_nop=formatters["%-15s > %s >\n"]
subreport=function(a,s,b,c,...)
if c then
write_nl(target,subreport_yes(translations[a],translations[s],formatters[formats[b]](c,...)))
@@ -7274,8 +7710,6 @@ if tex and (tex.jobname or tex.formatname) then
write_nl(target,"\n")
end
end
- local subdirect_yes=formatters["%-15s > %s > %s"]
- local subdirect_nop=formatters["%-15s > %s >"]
subdirect=function(a,s,b,c,...)
if c then
return subdirect_yes(translations[a],translations[s],formatters[formats[b]](c,...))
@@ -7287,8 +7721,6 @@ if tex and (tex.jobname or tex.formatname) then
return ""
end
end
- local status_yes=formatters["%-15s : %s\n"]
- local status_nop=formatters["%-15s :\n"]
status=function(a,b,c,...)
if c then
write_nl(target,status_yes(translations[a],formatters[formats[b]](c,...)))
@@ -7300,16 +7732,13 @@ if tex and (tex.jobname or tex.formatname) then
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
+ settarget=function(askedwhereto)
+ whereto=askedwhereto or whereto or "both"
+ target=targets[whereto]
+ if not target then
+ whereto="both"
+ target=targets[whereto]
+ end
if target=="term" or target=="term and log" then
logs.flush=io.flush
else
@@ -7338,21 +7767,74 @@ if tex and (tex.jobname or tex.formatname) then
writeline(target,f(...))
end
end
- setformatters=function(f)
- report_yes=f.report_yes or report_yes
- report_nop=f.report_nop or report_nop
- subreport_yes=f.subreport_yes or subreport_yes
- subreport_nop=f.subreport_nop or subreport_nop
- direct_yes=f.direct_yes or direct_yes
- direct_nop=f.direct_nop or direct_nop
- subdirect_yes=f.subdirect_yes or subdirect_yes
- subdirect_nop=f.subdirect_nop or subdirect_nop
- status_yes=f.status_yes or status_yes
- status_nop=f.status_nop or status_nop
- end
+ setformatters=function(specification)
+ local t=nil
+ local f=nil
+ local d=variants.default
+ if not specification then
+ elseif type(specification)=="table" then
+ t=specification.targets
+ f=specification.formats or specification
+ else
+ local v=variants[specification]
+ if v then
+ t=v.targets
+ f=v.formats
+ variant=specification
+ end
+ end
+ targets=t or d.targets
+ target=targets[whereto] or target
+ if f then
+ d=d.formats
+ else
+ f=d.formats
+ d=f
+ end
+ setmetatableindex(f,d)
+ report_yes=f.report_yes
+ report_nop=f.report_nop
+ subreport_yes=f.subreport_yes
+ subreport_nop=f.subreport_nop
+ direct_yes=f.direct_yes
+ direct_nop=f.direct_nop
+ subdirect_yes=f.subdirect_yes
+ subdirect_nop=f.subdirect_nop
+ status_yes=f.status_yes
+ status_nop=f.status_nop
+ if variant=="ansi" then
+ useluawrites()
+ end
+ settarget(whereto)
+ end
+ setformatters(variant)
setlogfile=ignore
settimedlog=ignore
else
+ local report_yes,subreport_yes,status_yes
+ local report_nop,subreport_nop,status_nop
+ local variants={
+ default={
+ formats={
+ report_yes=formatters["%-15s | %s"],
+ report_nop=formatters["%-15s |"],
+ subreport_yes=formatters["%-15s | %s | %s"],
+ subreport_nop=formatters["%-15s | %s |"],
+ status_yes=formatters["%-15s : %s\n"],
+ status_nop=formatters["%-15s :\n"],
+ },
+ },
+ ansi={
+ formats={
+ report_yes=formatters["%-15s | %s"],
+ report_nop=formatters["%-15s |"],
+ subreport_yes=formatters["%-15s | %s | %s"],
+ subreport_nop=formatters["%-15s | %s |"],
+ status_yes=formatters["%-15s : %s\n"],
+ status_nop=formatters["%-15s :\n"],
+ },
+ },
+ }
logs.flush=ignore
writer=function(s)
write_nl(s)
@@ -7360,8 +7842,6 @@ else
newline=function()
write_nl("\n")
end
- local report_yes=formatters["%-15s | %s"]
- local report_nop=formatters["%-15s |"]
report=function(a,b,c,...)
if c then
write_nl(report_yes(a,formatters[b](c,...)))
@@ -7373,8 +7853,6 @@ else
write_nl("")
end
end
- local subreport_yes=formatters["%-15s | %s | %s"]
- local subreport_nop=formatters["%-15s | %s |"]
subreport=function(a,sub,b,c,...)
if c then
write_nl(subreport_yes(a,sub,formatters[b](c,...)))
@@ -7386,8 +7864,6 @@ else
write_nl("")
end
end
- local status_yes=formatters["%-15s : %s\n"]
- local status_nop=formatters["%-15s :\n"]
status=function(a,b,c,...)
if c then
write_nl(status_yes(a,formatters[b](c,...)))
@@ -7412,14 +7888,34 @@ else
writeline(f(s))
end
end
- setformatters=function(f)
- report_yes=f.report_yes or report_yes
- report_nop=f.report_nop or report_nop
- subreport_yes=f.subreport_yes or subreport_yes
- subreport_nop=f.subreport_nop or subreport_nop
- status_yes=f.status_yes or status_yes
- status_nop=f.status_nop or status_nop
- end
+ setformatters=function(specification)
+ local f=nil
+ local d=variants.default
+ if specification then
+ if type(specification)=="table" then
+ f=specification.formats or specification
+ else
+ local v=variants[specification]
+ if v then
+ f=v.formats
+ end
+ end
+ end
+ if f then
+ d=d.formats
+ else
+ f=d.formats
+ d=f
+ end
+ setmetatableindex(f,d)
+ report_yes=f.report_yes
+ report_nop=f.report_nop
+ subreport_yes=f.subreport_yes
+ subreport_nop=f.subreport_nop
+ status_yes=f.status_yes
+ status_nop=f.status_nop
+ end
+ setformatters(variant)
setlogfile=function(name,keepopen)
if name and name~="" then
local localtime=os.localtime
@@ -7672,13 +8168,13 @@ end
local simple=logs.reporter("comment")
logs.simple=simple
logs.simpleline=simple
-function logs.setprogram () end
-function logs.extendbanner() end
-function logs.reportlines () end
-function logs.reportbanner() end
-function logs.reportline () end
-function logs.simplelines () end
-function logs.help () end
+logs.setprogram=ignore
+logs.extendbanner=ignore
+logs.reportlines=ignore
+logs.reportbanner=ignore
+logs.reportline=ignore
+logs.simplelines=ignore
+logs.help=ignore
local Carg,C,lpegmatch=lpeg.Carg,lpeg.C,lpeg.match
local p_newline=lpeg.patterns.newline
local linewise=(
@@ -7755,10 +8251,11 @@ function logs.application(t)
end
return t
end
-function logs.system(whereto,process,jobname,category,...)
- local message=formatters["%s %s => %s => %s => %s\r"](os.date("%d/%m/%y %H:%m:%S"),process,jobname,category,format(...))
+local f_syslog=formatters["%s %s => %s => %s => %s\r"]
+function logs.system(whereto,process,jobname,category,fmt,arg,...)
+ local message=f_syslog(datetime("%d/%m/%y %H:%m:%S"),process,jobname,category,arg==nil and fmt or format(fmt,arg,...))
for i=1,10 do
- local f=io.open(whereto,"a")
+ local f=openfile(whereto,"a")
if f then
f:write(message)
f:close()
@@ -7820,7 +8317,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-inf"] = package.loaded["trac-inf"] or true
--- original size: 7011, stripped down to: 5590
+-- original size: 6704, stripped down to: 5343
if not modules then modules={} end modules ['trac-inf']={
version=1.001,
@@ -7993,15 +8490,6 @@ function statistics.tracefunction(base,tag,...)
statistics.register(formatters["%s.%s"](tag,name),function() return serialize(stat,"calls") end)
end
end
-commands=commands or {}
-function commands.resettimer(name)
- resettiming(name or "whatever")
- starttiming(name or "whatever")
-end
-function commands.elapsedtime(name)
- stoptiming(name or "whatever")
- context(elapsedtime(name or "whatever"))
-end
end -- of closure
@@ -8568,7 +9056,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tpl"] = package.loaded["util-tpl"] or true
--- original size: 6251, stripped down to: 3488
+-- original size: 7100, stripped down to: 3978
if not modules then modules={} end modules ['util-tpl']={
version=1.001,
@@ -8610,7 +9098,7 @@ local sqlescape=lpeg.replacer {
{ "\r\n","\\n" },
{ "\r","\\n" },
}
-local sqlquoted=lpeg.Cs(lpeg.Cc("'")*sqlescape*lpeg.Cc("'"))
+local sqlquoted=Cs(Cc("'")*sqlescape*Cc("'"))
lpegpatterns.sqlescape=sqlescape
lpegpatterns.sqlquoted=sqlquoted
local luaescape=lpegpatterns.luaescape
@@ -8633,12 +9121,24 @@ local quotedescapers={
local luaescaper=escapers.lua
local quotedluaescaper=quotedescapers.lua
local function replacekeyunquoted(s,t,how,recurse)
- local escaper=how and escapers[how] or luaescaper
- return escaper(replacekey(s,t,how,recurse))
+ if how==false then
+ return replacekey(s,t,how,recurse)
+ else
+ local escaper=how and escapers[how] or luaescaper
+ return escaper(replacekey(s,t,how,recurse))
+ end
end
local function replacekeyquoted(s,t,how,recurse)
- local escaper=how and quotedescapers[how] or quotedluaescaper
- return escaper(replacekey(s,t,how,recurse))
+ if how==false then
+ return replacekey(s,t,how,recurse)
+ else
+ local escaper=how and quotedescapers[how] or quotedluaescaper
+ return escaper(replacekey(s,t,how,recurse))
+ end
+end
+local function replaceoptional(l,m,r,t,how,recurse)
+ local v=t[l]
+ return v and v~="" and lpegmatch(replacer,r,1,t,how or "lua",recurse or false) or ""
end
local single=P("%")
local double=P("%%")
@@ -8653,11 +9153,16 @@ local nolquoted=lquoted/''
local norquoted=rquoted/''
local nolquotedq=lquotedq/''
local norquotedq=rquotedq/''
-local key=nosingle*((C((1-nosingle )^1)*Carg(1)*Carg(2)*Carg(3))/replacekey )*nosingle
-local quoted=nolquotedq*((C((1-norquotedq)^1)*Carg(1)*Carg(2)*Carg(3))/replacekeyquoted )*norquotedq
-local unquoted=nolquoted*((C((1-norquoted )^1)*Carg(1)*Carg(2)*Carg(3))/replacekeyunquoted)*norquoted
+local noloptional=P("%?")/''
+local noroptional=P("?%")/''
+local nomoptional=P(":")/''
+local args=Carg(1)*Carg(2)*Carg(3)
+local key=nosingle*((C((1-nosingle )^1)*args)/replacekey )*nosingle
+local quoted=nolquotedq*((C((1-norquotedq )^1)*args)/replacekeyquoted )*norquotedq
+local unquoted=nolquoted*((C((1-norquoted )^1)*args)/replacekeyunquoted)*norquoted
+local optional=noloptional*((C((1-nomoptional)^1)*nomoptional*C((1-noroptional)^1)*args)/replaceoptional)*noroptional
local any=P(1)
- replacer=Cs((unquoted+quoted+escape+key+any)^0)
+ replacer=Cs((unquoted+quoted+escape+optional+key+any)^0)
local function replace(str,mapping,how,recurse)
if mapping and str then
return lpegmatch(replacer,str,1,mapping,how or "lua",recurse or false) or str
@@ -8696,7 +9201,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-env"] = package.loaded["util-env"] or true
--- original size: 8814, stripped down to: 5092
+-- original size: 8022, stripped down to: 5038
if not modules then modules={} end modules ['util-env']={
version=1.001,
@@ -8707,7 +9212,7 @@ if not modules then modules={} end modules ['util-env']={
}
local allocate,mark=utilities.storage.allocate,utilities.storage.mark
local format,sub,match,gsub,find=string.format,string.sub,string.match,string.gsub,string.find
-local unquoted,quoted=string.unquoted,string.quoted
+local unquoted,quoted,optionalquoted=string.unquoted,string.quoted,string.optionalquoted
local concat,insert,remove=table.concat,table.insert,table.remove
environment=environment or {}
local environment=environment
@@ -8820,24 +9325,14 @@ function environment.splitarguments(separator)
return before,after
end
function environment.reconstructcommandline(arg,noquote)
+ local resolveprefix=resolvers.resolve
arg=arg or environment.originalarguments
if noquote and #arg==1 then
- local a=arg[1]
- a=resolvers.resolve(a)
- a=unquoted(a)
- return a
+ return unquoted(resolveprefix and resolveprefix(arg[1]) or arg[1])
elseif #arg>0 then
local result={}
for i=1,#arg do
- local a=arg[i]
- a=resolvers.resolve(a)
- a=unquoted(a)
- a=gsub(a,'"','\\"')
- if find(a," ",1,true) then
- result[#result+1]=quoted(a)
- else
- result[#result+1]=a
- end
+ result[i]=optionalquoted(resolveprefix and resolveprefix(arg[i]) or resolveprefix)
end
return concat(result," ")
else
@@ -9046,7 +9541,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-tab"] = package.loaded["lxml-tab"] or true
--- original size: 42614, stripped down to: 26694
+-- original size: 43882, stripped down to: 26870
if not modules then modules={} end modules ['lxml-tab']={
version=1.001,
@@ -9061,10 +9556,10 @@ if lpeg.setmaxstack then lpeg.setmaxstack(1000) end
xml=xml or {}
local xml=xml
local concat,remove,insert=table.concat,table.remove,table.insert
-local type,next,setmetatable,getmetatable,tonumber=type,next,setmetatable,getmetatable,tonumber
+local type,next,setmetatable,getmetatable,tonumber,rawset=type,next,setmetatable,getmetatable,tonumber,rawset
local lower,find,match,gsub=string.lower,string.find,string.match,string.gsub
local utfchar=utf.char
-local lpegmatch=lpeg.match
+local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns
local P,S,R,C,V,C,Cs=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.V,lpeg.C,lpeg.Cs
local formatters=string.formatters
xml.xmlns=xml.xmlns or {}
@@ -9226,9 +9721,10 @@ local function fromdec(s)
return formatters["d:%s"](s),true
end
end
-local rest=(1-P(";"))^0
-local many=P(1)^0
-local parsedentity=P("&")*(P("#x")*(rest/fromhex)+P("#")*(rest/fromdec))*P(";")*P(-1)+(P("#x")*(many/fromhex)+P("#")*(many/fromdec))
+local p_rest=(1-P(";"))^0
+local p_many=P(1)^0
+local p_char=lpegpatterns.utf8character
+local parsedentity=P("&")*(P("#x")*(p_rest/fromhex)+P("#")*(p_rest/fromdec))*P(";")*P(-1)+(P("#x")*(p_many/fromhex)+P("#")*(p_many/fromdec))
local predefined_unified={
[38]="&amp;",
[42]="&quot;",
@@ -9254,7 +9750,9 @@ local privates_u={
local privates_p={}
local privates_n={
}
-local escaped=utf.remapper(privates_u)
+local escaped=utf.remapper(privates_u,"dynamic")
+local unprivatized=utf.remapper(privates_p,"dynamic")
+xml.unprivatized=unprivatized
local function unescaped(s)
local p=privates_n[s]
if not p then
@@ -9267,9 +9765,7 @@ local function unescaped(s)
end
return p
end
-local unprivatized=utf.remapper(privates_p)
xml.privatetoken=unescaped
-xml.unprivatized=unprivatized
xml.privatecodes=privates_n
local function handle_hex_entity(str)
local h=hcache[str]
@@ -9422,7 +9918,7 @@ local valid=R('az','AZ','09')+S('_-.')
local name_yes=C(valid^1)*colon*C(valid^1)
local name_nop=C(P(true))*C(valid^1)
local name=name_yes+name_nop
-local utfbom=lpeg.patterns.utfbom
+local utfbom=lpegpatterns.utfbom
local spacing=C(space^0)
local anyentitycontent=(1-open-semicolon-space-close)^0
local hexentitycontent=R("AF","af","09")^0
@@ -9590,7 +10086,7 @@ local function _xmlconvert_(data,settings)
reported_attribute_errors,mt,errorhandler=nil,nil,nil
return result
end
-function xmlconvert(data,settings)
+local function xmlconvert(data,settings)
local ok,result=pcall(function() return _xmlconvert_(data,settings) end)
if ok then
return result
@@ -9682,14 +10178,17 @@ function xml.checkbom(root)
insert(dt,2,"\n" )
end
end
-local function verbose_element(e,handlers)
+local f_attribute=formatters['%s=%q']
+local function verbose_element(e,handlers,escape)
local handle=handlers.handle
local serialize=handlers.serialize
local ens,etg,eat,edt,ern=e.ns,e.tg,e.at,e.dt,e.rn
local ats=eat and next(eat) and {}
if ats then
+ local n=0
for k,v in next,eat do
- ats[#ats+1]=formatters['%s=%q'](k,escaped(v))
+ n=n+1
+ ats[n]=f_attribute(k,escaped(v))
end
end
if ern and trace_entities and ern~=ens then
@@ -10033,7 +10532,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-lpt"] = package.loaded["lxml-lpt"] or true
--- original size: 48030, stripped down to: 30595
+-- original size: 48229, stripped down to: 30684
if not modules then modules={} end modules ['lxml-lpt']={
version=1.001,
@@ -10418,8 +10917,8 @@ 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")+S("-_:"))^1)*Cc("'])")
-lp_fastpos_p=P("+")^0*R("09")^1*P(-1)/"l==%0"
-lp_fastpos_n=P("-")*R("09")^1*P(-1)/"(%0<0 and (#list+%0==l))"
+local lp_fastpos_p=P("+")^0*R("09")^1*P(-1)/"l==%0"
+local lp_fastpos_n=P("-")*R("09")^1*P(-1)/"(%0<0 and (#list+%0==l))"
local lp_fastpos=lp_fastpos_n+lp_fastpos_p
local lp_reserved=C("and")+C("or")+C("not")+C("div")+C("mod")+C("true")+C("false")
local lp_lua_function=Cs((R("az","AZ","__")^1*(P(".")*R("az","AZ","__")^1)^1)*("("))/"%0"
@@ -10598,7 +11097,7 @@ local function nodesettostring(set,nodetest)
if not ns or ns=="" then ns="*" end
if not tg or tg=="" then tg="*" end
tg=(tg=="@rt@" and "[root]") or format("%s:%s",ns,tg)
- t[i]=(directive and tg) or format("not(%s)",tg)
+ t[#t+1]=(directive and tg) or format("not(%s)",tg)
end
if nodetest==false then
return format("not(%s)",concat(t,"|"))
@@ -10864,7 +11363,6 @@ expressions.print=function(...)
print(...)
return true
end
-expressions.contains=find
expressions.find=find
expressions.upper=upper
expressions.lower=lower
@@ -10886,6 +11384,9 @@ function expressions.contains(str,pattern)
end
return false
end
+function xml.expressions.idstring(str)
+ return type(str)=="string" and gsub(str,"^#","") or ""
+end
local function traverse(root,pattern,handle)
local collected=applylpath(root,pattern)
if collected then
@@ -11173,7 +11674,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-aux"] = package.loaded["lxml-aux"] or true
--- original size: 23804, stripped down to: 16817
+-- original size: 28225, stripped down to: 20125
if not modules then modules={} end modules ['lxml-aux']={
version=1.001,
@@ -11183,16 +11684,19 @@ if not modules then modules={} end modules ['lxml-aux']={
license="see context related readme files"
}
local trace_manipulations=false trackers.register("lxml.manipulations",function(v) trace_manipulations=v end)
+local trace_inclusions=false trackers.register("lxml.inclusions",function(v) trace_inclusions=v end)
local report_xml=logs.reporter("xml")
local xml=xml
-local xmlconvert,xmlcopy,xmlname=xml.convert,xml.copy,xml.name
+local xmlcopy,xmlname=xml.copy,xml.name
local xmlinheritedconvert=xml.inheritedconvert
local xmlapplylpath=xml.applylpath
local xmlfilter=xml.filter
-local type,setmetatable,getmetatable=type,setmetatable,getmetatable
+local type,next,setmetatable,getmetatable=type,next,setmetatable,getmetatable
local insert,remove,fastcopy,concat=table.insert,table.remove,table.fastcopy,table.concat
local gmatch,gsub,format,find,strip=string.gmatch,string.gsub,string.format,string.find,string.strip
local utfbyte=utf.byte
+local lpegmatch=lpeg.match
+local striplinepatterns=utilities.strings.striplinepatterns
local function report(what,pattern,c,e)
report_xml("%s element %a, root %a, position %a, index %a, pattern %a",what,xmlname(e),xmlname(e.__p__),c,e.ni,pattern)
end
@@ -11247,13 +11751,15 @@ end
function xml.each(root,pattern,handle,reverse)
local collected=xmlapplylpath(root,pattern)
if collected then
- if reverse then
- for c=#collected,1,-1 do
- handle(collected[c])
- end
- else
- for c=1,#collected do
- handle(collected[c])
+ if handle then
+ if reverse then
+ for c=#collected,1,-1 do
+ handle(collected[c])
+ end
+ else
+ for c=1,#collected do
+ handle(collected[c])
+ end
end
end
return collected
@@ -11309,6 +11815,7 @@ local function redo_ni(d)
end
end
end
+xml.reindex=redo_ni
local function xmltoelement(whatever,root)
if not whatever then
return nil
@@ -11360,8 +11867,16 @@ function xml.delete(root,pattern)
report('deleting',pattern,c,e)
end
local d=p.dt
- remove(d,e.ni)
- redo_ni(d)
+ local ni=e.ni
+ if ni<=#d then
+ if false then
+ p.dt[ni]=""
+ else
+ remove(d,ni)
+ redo_ni(d)
+ end
+ else
+ end
end
end
end
@@ -11481,28 +11996,40 @@ 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)
+local function include(xmldata,pattern,attribute,recursive,loaddata,level)
pattern=pattern or 'include'
loaddata=loaddata or io.loaddata
local collected=xmlapplylpath(xmldata,pattern)
if collected then
+ if not level then
+ level=1
+ end
for c=1,#collected do
local ek=collected[c]
local name=nil
local ekdt=ek.dt
local ekat=ek.at
- local epdt=ek.__p__.dt
+ local ekrt=ek.__p__
+ local epdt=ekrt.dt
if not attribute or attribute=="" then
name=(type(ekdt)=="table" and ekdt[1]) or ekdt
end
if not name then
for a in gmatch(attribute or "href","([^|]+)") do
name=ekat[a]
- if name then break end
+ if name then
+ break
+ end
+ end
+ end
+ local data=nil
+ if name and name~="" then
+ data=loaddata(name) or ""
+ if trace_inclusions then
+ report_xml("including %s bytes from %a at level %s by pattern %a and attribute %a (%srecursing)",#data,name,level,pattern,attribute or "",recursive and "" or "not ")
end
end
- local data=(name and name~="" and loaddata(name)) or ""
- if data=="" then
+ if not data or data=="" then
epdt[ek.ni]=""
elseif ekat["parse"]=="text" then
epdt[ek.ni]=xml.escaped(data)
@@ -11512,70 +12039,113 @@ local function include(xmldata,pattern,attribute,recursive,loaddata)
epdt[ek.ni]=""
else
if recursive then
- include(xi,pattern,attribute,recursive,loaddata)
+ include(xi,pattern,attribute,recursive,loaddata,level+1)
+ end
+ local child=xml.body(xi)
+ child.__p__=ekrt
+ child.__f__=name
+ epdt[ek.ni]=child
+ local inclusions=xmldata.settings.inclusions
+ if inclusions then
+ inclusions[#inclusions+1]=name
+ else
+ xmldata.settings.inclusions={ name }
end
- epdt[ek.ni]=xml.body(xi)
end
end
end
end
end
xml.include=include
+function xml.inclusion(e,default)
+ while e do
+ local f=e.__f__
+ if f then
+ return f
+ else
+ e=e.__p__
+ end
+ end
+ return default
+end
+function xml.inclusions(e,sorted)
+ while e do
+ local settings=e.settings
+ if settings then
+ local inclusions=settings.inclusions
+ if inclusions then
+ inclusions=table.unique(inclusions)
+ if sorted then
+ table.sort(inclusions)
+ end
+ return inclusions
+ else
+ e=e.__p__
+ end
+ else
+ e=e.__p__
+ end
+ end
+end
+local b_collapser=lpeg.patterns.b_collapser
+local m_collapser=lpeg.patterns.m_collapser
+local e_collapser=lpeg.patterns.e_collapser
+local b_stripper=lpeg.patterns.b_stripper
+local m_stripper=lpeg.patterns.m_stripper
+local e_stripper=lpeg.patterns.e_stripper
+local lpegmatch=lpeg.match
local function stripelement(e,nolines,anywhere)
local edt=e.dt
if edt then
- if anywhere then
- local t,n={},0
- for e=1,#edt do
+ local n=#edt
+ if n==0 then
+ return e
+ elseif anywhere then
+ local t={}
+ local m=0
+ for e=1,n do
local str=edt[e]
if type(str)~="string" then
- n=n+1
- t[n]=str
+ m=m+1
+ t[m]=str
elseif str~="" then
if nolines then
- str=gsub(str,"%s+"," ")
+ str=lpegmatch((n==1 and b_collapser) or (n==m and e_collapser) or m_collapser,str)
+ else
+ str=lpegmatch((n==1 and b_stripper) or (n==m and e_stripper) or m_stripper,str)
end
- str=gsub(str,"^%s*(.-)%s*$","%1")
if str~="" then
- n=n+1
- t[n]=str
+ m=m+1
+ t[m]=str
end
end
end
e.dt=t
else
- if #edt>0 then
- local str=edt[1]
- if type(str)~="string" then
- elseif str=="" then
+ local str=edt[1]
+ if type(str)=="string" then
+ if str~="" then
+ str=lpegmatch(nolines and b_collapser or b_stripper,str)
+ end
+ if str=="" then
remove(edt,1)
+ n=n-1
else
- if nolines then
- str=gsub(str,"%s+"," ")
- end
- str=gsub(str,"^%s+","")
- if str=="" then
- remove(edt,1)
- else
- edt[1]=str
- end
+ edt[1]=str
end
end
- local nedt=#edt
- if nedt>0 then
- local str=edt[nedt]
- if type(str)~="string" then
- elseif str=="" then
- remove(edt)
- else
- if nolines then
- str=gsub(str,"%s+"," ")
- end
- str=gsub(str,"%s+$","")
+ if n>0 then
+ str=edt[n]
+ if type(str)=="string" then
if str=="" then
remove(edt)
else
- edt[nedt]=str
+ str=lpegmatch(nolines and e_collapser or e_stripper,str)
+ if str=="" then
+ remove(edt)
+ else
+ edt[n]=str
+ end
end
end
end
@@ -11761,8 +12331,8 @@ function xml.finalizers.xml.cdata(collected)
end
return ""
end
-function xml.insertcomment(e,str,n)
- table.insert(e.dt,n or 1,{
+function xml.insertcomment(e,str,n)
+ insert(e.dt,n or 1,{
tg="@cm@",
ns="",
special=true,
@@ -11770,7 +12340,25 @@ function xml.insertcomment(e,str,n)
dt={ str },
})
end
-function xml.setcdata(e,str)
+function xml.insertcdata(e,str,n)
+ insert(e.dt,n or 1,{
+ tg="@cd@",
+ ns="",
+ special=true,
+ at={},
+ dt={ str },
+ })
+end
+function xml.setcomment(e,str,n)
+ e.dt={ {
+ tg="@cm@",
+ ns="",
+ special=true,
+ at={},
+ dt={ str },
+ } }
+end
+function xml.setcdata(e,str)
e.dt={ {
tg="@cd@",
ns="",
@@ -11840,7 +12428,7 @@ local function recurse(e,action)
for i=1,#edt do
local str=edt[i]
if type(str)~="string" then
- recurse(str,action,recursive)
+ recurse(str,action)
elseif str~="" then
edt[i]=action(str)
end
@@ -11858,6 +12446,65 @@ function helpers.recursetext(collected,action,recursive)
end
end
end
+local specials={
+ ["@rt@"]="root",
+ ["@pi@"]="instruction",
+ ["@cm@"]="comment",
+ ["@dt@"]="declaration",
+ ["@cd@"]="cdata",
+}
+local function convert(x,strip,flat)
+ local ns=x.ns
+ local tg=x.tg
+ local at=x.at
+ local dt=x.dt
+ local node=flat and {
+ [0]=(not x.special and (ns~="" and ns..":"..tg or tg)) or nil,
+ } or {
+ _namespace=ns~="" and ns or nil,
+ _tag=not x.special and tg or nil,
+ _type=specials[tg] or "_element",
+ }
+ if at then
+ for k,v in next,at do
+ node[k]=v
+ end
+ end
+ local n=0
+ for i=1,#dt do
+ local di=dt[i]
+ if type(di)=="table" then
+ if flat and di.special then
+ else
+ di=convert(di,strip,flat)
+ if di then
+ n=n+1
+ node[n]=di
+ end
+ end
+ elseif strip then
+ di=lpegmatch(strip,di)
+ if di~="" then
+ n=n+1
+ node[n]=di
+ end
+ else
+ n=n+1
+ node[n]=di
+ end
+ end
+ if next(node) then
+ return node
+ end
+end
+function xml.totable(x,strip,flat)
+ if type(x)=="table" then
+ if strip then
+ strip=striplinepatterns[strip]
+ end
+ return convert(x,strip,flat)
+ end
+end
end -- of closure
@@ -12414,7 +13061,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-ini"] = package.loaded["data-ini"] or true
--- original size: 7927, stripped down to: 5528
+-- original size: 11085, stripped down to: 7662
if not modules then modules={} end modules ['data-ini']={
version=1.001,
@@ -12423,14 +13070,15 @@ if not modules then modules={} end modules ['data-ini']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files",
}
+local next,type,getmetatable,rawset=next,type,getmetatable,rawset
local gsub,find,gmatch,char=string.gsub,string.find,string.gmatch,string.char
-local next,type=next,type
local filedirname,filebasename,filejoin=file.dirname,file.basename,file.join
+local ostype,osname,osuname,ossetenv,osgetenv=os.type,os.name,os.uname,os.setenv,os.getenv
+local P,S,R,C,Cs,Cc,lpegmatch=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local trace_detail=false trackers.register("resolvers.details",function(v) trace_detail=v end)
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
resolvers=resolvers or {}
local resolvers=resolvers
texconfig.kpse_init=false
@@ -12563,10 +13211,103 @@ if type(profiler)=="table" and not jit then
profiler.start("luatex-profile.log")
end)
end
-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
+local prefixes=utilities.storage.allocate()
+resolvers.prefixes=prefixes
+local resolved={}
+local abstract={}
+local dynamic={}
+function resolvers.resetresolve(str)
+ resolved,abstract={},{}
+end
+function resolvers.allprefixes(separator)
+ local all=table.sortedkeys(prefixes)
+ if separator then
+ for i=1,#all do
+ all[i]=all[i]..":"
+ end
+ end
+ return all
+end
+local function _resolve_(method,target)
+ local action=prefixes[method]
+ if action then
+ return action(target)
+ else
+ return method..":"..target
+ end
+end
+function resolvers.unresolve(str)
+ return abstract[str] or str
+end
+function resolvers.setdynamic(str)
+ dynamic[str]=true
+end
+local pattern=Cs((C(R("az")^2)*P(":")*C((1-S(" \"\';,"))^1)/_resolve_+P(1))^0)
+local prefix=C(R("az")^2)*P(":")
+local target=C((1-S(" \"\';,"))^1)
+local notarget=(#S(";,")+P(-1))*Cc("")
+local p_resolve=Cs(((prefix*(target+notarget))/_resolve_+P(1))^0)
+local p_simple=prefix*P(-1)
+local function resolve(str)
+ if type(str)=="table" then
+ local res={}
+ for i=1,#str do
+ res[i]=resolve(str[i])
+ end
+ return res
+ end
+ local res=resolved[str]
+ if res then
+ return res
+ end
+ local simple=lpegmatch(p_simple,str)
+ local action=prefixes[simple]
+ if action then
+ local res=action(res)
+ if not dynamic[simple] then
+ resolved[simple]=res
+ abstract[res]=simple
+ end
+ return res
+ end
+ res=lpegmatch(p_resolve,str)
+ resolved[str]=res
+ abstract[res]=str
+ return res
+end
+resolvers.resolve=resolve
+if type(osuname)=="function" then
+ for k,v in next,osuname() do
+ if not prefixes[k] then
+ prefixes[k]=function() return v end
+ end
+ end
+end
+if ostype=="unix" then
+ local pattern
+ local function makepattern(t,k,v)
+ if t then
+ rawset(t,k,v)
+ end
+ local colon=P(":")
+ for k,v in table.sortedpairs(prefixes) do
+ if p then
+ p=P(k)+p
+ else
+ p=P(k)
+ end
+ end
+ pattern=Cs((p*colon+colon/";"+P(1))^0)
+ end
+ makepattern()
+ table.setmetatablenewindex(prefixes,makepattern)
+ function resolvers.repath(str)
+ return lpegmatch(pattern,str)
+ end
+else
+ function resolvers.repath(str)
+ return str
+ end
end
@@ -12576,7 +13317,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-exp"] = package.loaded["data-exp"] or true
--- original size: 15317, stripped down to: 9723
+-- original size: 17216, stripped down to: 10657
if not modules then modules={} end modules ['data-exp']={
version=1.001,
@@ -12590,12 +13331,16 @@ local concat,sort=table.concat,table.sort
local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns
local Ct,Cs,Cc,Carg,P,C,S=lpeg.Ct,lpeg.Cs,lpeg.Cc,lpeg.Carg,lpeg.P,lpeg.C,lpeg.S
local type,next=type,next
+local isdir=lfs.isdir
local ostype=os.type
-local collapsepath=file.collapsepath
+local collapsepath,joinpath,basename=file.collapsepath,file.join,file.basename
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local trace_expansions=false trackers.register("resolvers.expansions",function(v) trace_expansions=v end)
+local trace_globbing=true trackers.register("resolvers.globbing",function(v) trace_globbing=v end)
local report_expansions=logs.reporter("resolvers","expansions")
+local report_globbing=logs.reporter("resolvers","globbing")
local resolvers=resolvers
+local resolveprefix=resolvers.resolve
local function f_both(a,b)
local t,n={},0
for sb in gmatch(b,"[^,]+") do
@@ -12685,35 +13430,27 @@ function resolvers.expandedpathfromlist(pathlist)
end
return newlist
end
-local cleanup=lpeg.replacer {
- { "!","" },
- { "\\","/" },
-}
-function resolvers.cleanpath(str)
- local doslashes=(P("\\")/"/"+1)^0
- local donegation=(P("!")/"" )^0
- local homedir=lpegmatch(Cs(donegation*doslashes),environment.homedir or "")
- if homedir=="~" or homedir=="" or not lfs.isdir(homedir) then
- if trace_expansions then
- report_expansions("no home dir set, ignoring dependent paths")
- end
- function resolvers.cleanpath(str)
- if not str or find(str,"~",1,true) then
- return ""
- else
- return lpegmatch(cleanup,str)
+local usedhomedir=nil
+local donegation=(P("!")/"" )^0
+local doslashes=(P("\\")/"/"+1)^0
+local function expandedhome()
+ if not usedhomedir then
+ usedhomedir=lpegmatch(Cs(donegation*doslashes),environment.homedir or "")
+ if usedhomedir=="~" or usedhomedir=="" or not isdir(usedhomedir) then
+ if trace_expansions then
+ report_expansions("no home dir set, ignoring dependent path using current path")
end
- end
- else
- local dohome=((P("~")+P("$HOME"))/homedir)^0
- local cleanup=Cs(donegation*dohome*doslashes)
- function resolvers.cleanpath(str)
- return str and lpegmatch(cleanup,str) or ""
+ usedhomedir="."
end
end
- return resolvers.cleanpath(str)
+ return usedhomedir
+end
+local dohome=((P("~")+P("$HOME")+P("%HOME%"))/expandedhome)^0
+local cleanup=Cs(donegation*dohome*doslashes)
+resolvers.cleanpath=function(str)
+ return str and lpegmatch(cleanup,str) or ""
end
-local expandhome=P("~")/"$HOME"
+local expandhome=P("~")/"$HOME"
local dodouble=P('"')/""*(expandhome+(1-P('"')))^0*P('"')/""
local dosingle=P("'")/""*(expandhome+(1-P("'")))^0*P("'")/""
local dostring=(expandhome+1 )^0
@@ -12765,46 +13502,67 @@ function resolvers.splitpath(str)
end
function resolvers.joinpath(str)
if type(str)=='table' then
- return file.joinpath(str)
+ return joinpath(str)
else
return str
end
end
local attributes,directory=lfs.attributes,lfs.dir
local weird=P(".")^1+lpeg.anywhere(S("~`!#$%^&*()={}[]:;\"\'||<>,?\n\r\t"))
+local lessweird=P(".")^1+lpeg.anywhere(S("~`#$%^&*:;\"\'||<>,?\n\r\t"))
local timer={}
local scanned={}
local nofscans=0
local scancache={}
-local function scan(files,spec,path,n,m,r)
- local full=(path=="" and spec) or (spec..path..'/')
+local fullcache={}
+local nofsharedscans=0
+local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant)
+ local full=path=="" and spec or (spec..path..'/')
local dirs={}
local nofdirs=0
+ local pattern=tolerant and lessweird or weird
for name in directory(full) do
- if not lpegmatch(weird,name) then
- local mode=attributes(full..name,'mode')
- if mode=='file' then
+ if not lpegmatch(pattern,name) then
+ local mode=attributes(full..name,"mode")
+ if mode=="file" then
n=n+1
- local f=files[name]
- if f then
- if type(f)=='string' then
- files[name]={ f,path }
+ local lower=lower(name)
+ local paths=files[lower]
+ if paths then
+ if onlyone then
else
- f[#f+1]=path
+ if type(paths)=="string" then
+ files[lower]={ paths,path }
+ else
+ paths[#paths+1]=path
+ end
+ if name~=lower then
+ local rl=remap[lower]
+ if not rl then
+ remap[lower]=name
+ r=r+1
+ elseif trace_globbing and rl~=name then
+ report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl)
+ end
+ end
end
else
- files[name]=path
- local lower=lower(name)
+ files[lower]=path
if name~=lower then
- files["remap:"..lower]=name
- r=r+1
+ local rl=remap[lower]
+ if not rl then
+ remap[lower]=name
+ r=r+1
+ elseif trace_globbing and rl~=name then
+ report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl)
+ end
end
end
- elseif mode=='directory' then
+ elseif mode=="directory" then
m=m+1
nofdirs=nofdirs+1
if path~="" then
- dirs[nofdirs]=path..'/'..name
+ dirs[nofdirs]=path.."/"..name
else
dirs[nofdirs]=name
end
@@ -12814,107 +13572,69 @@ local function scan(files,spec,path,n,m,r)
if nofdirs>0 then
sort(dirs)
for i=1,nofdirs do
- files,n,m,r=scan(files,spec,dirs[i],n,m,r)
+ files,remap,n,m,r=scan(files,remap,spec,dirs[i],n,m,r,onlyonce,tolerant)
end
end
scancache[sub(full,1,-2)]=files
- return files,n,m,r
+ return files,remap,n,m,r
end
-local fullcache={}
-function resolvers.scanfiles(path,branch,usecache)
- statistics.starttiming(timer)
- local realpath=resolvers.resolve(path)
+function resolvers.scanfiles(path,branch,usecache,onlyonce,tolerant)
+ local realpath=resolveprefix(path)
if usecache then
- local files=fullcache[realpath]
- if files then
+ local content=fullcache[realpath]
+ if content then
if trace_locating then
- report_expansions("using caches scan of path %a, branch %a",path,branch or path)
+ report_expansions("using cached scan of path %a, branch %a",path,branch or path)
end
- return files
+ nofsharedscans=nofsharedscans+1
+ return content
end
end
+ statistics.starttiming(timer)
if trace_locating then
report_expansions("scanning path %a, branch %a",path,branch or path)
end
- local files,n,m,r=scan({},realpath..'/',"",0,0,0)
- files.__path__=path
- 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
- if usecache then
- scanned[#scanned+1]=realpath
- fullcache[realpath]=files
- end
- nofscans=nofscans+1
- statistics.stoptiming(timer)
- return files
-end
-local function simplescan(files,spec,path)
- local full=(path=="" and spec) or (spec..path..'/')
- local dirs={}
- local nofdirs=0
- for name in directory(full) do
- if not lpegmatch(weird,name) then
- local mode=attributes(full..name,'mode')
- if mode=='file' then
- if not files[name] then
- files[name]=path
- end
- elseif mode=='directory' then
- nofdirs=nofdirs+1
- if path~="" then
- dirs[nofdirs]=path..'/'..name
- else
- dirs[nofdirs]=name
- end
- end
- end
- end
- if nofdirs>0 then
- sort(dirs)
- for i=1,nofdirs do
- files=simplescan(files,spec,dirs[i])
- end
- end
- return files
-end
-local simplecache={}
-local nofsharedscans=0
-function resolvers.simplescanfiles(path,branch,usecache)
- statistics.starttiming(timer)
- local realpath=resolvers.resolve(path)
- if usecache then
- local files=simplecache[realpath]
- if not files then
- files=scancache[realpath]
- if files then
- nofsharedscans=nofsharedscans+1
- end
+ local content
+ if isdir(realpath) then
+ local files,remap,n,m,r=scan({},{},realpath..'/',"",0,0,0,onlyonce,tolerant)
+ content={
+ metadata={
+ path=path,
+ files=n,
+ directories=m,
+ remappings=r,
+ },
+ files=files,
+ remap=remap,
+ }
+ if trace_locating then
+ report_expansions("%s files found on %s directories with %s uppercase remappings",n,m,r)
end
- if files then
- if trace_locating then
- report_expansions("using caches scan of path %a, branch %a",path,branch or path)
- end
- return files
+ else
+ content={
+ metadata={
+ path=path,
+ files=0,
+ directories=0,
+ remappings=0,
+ },
+ files={},
+ remap={},
+ }
+ if trace_locating then
+ report_expansions("invalid path %a",realpath)
end
end
- if trace_locating then
- report_expansions("scanning path %a, branch %a",path,branch or path)
- end
- local files=simplescan({},realpath..'/',"")
- if trace_locating then
- report_expansions("%s files found",table.count(files))
- end
if usecache then
scanned[#scanned+1]=realpath
- simplecache[realpath]=files
+ fullcache[realpath]=content
end
nofscans=nofscans+1
statistics.stoptiming(timer)
- return files
+ return content
+end
+function resolvers.simplescanfiles(path,branch,usecache)
+ return resolvers.scanfiles(path,branch,usecache,true,true)
end
function resolvers.scandata()
table.sort(scanned)
@@ -12925,6 +13645,52 @@ function resolvers.scandata()
paths=scanned,
}
end
+function resolvers.get_from_content(content,path,name)
+ if not content then
+ return
+ end
+ local files=content.files
+ if not files then
+ return
+ end
+ local remap=content.remap
+ if not remap then
+ return
+ end
+ if name then
+ local used=lower(name)
+ return path,remap[used] or used
+ else
+ local name=path
+ local used=lower(name)
+ local path=files[used]
+ if path then
+ return path,remap[used] or used
+ end
+ end
+end
+local nothing=function() end
+function resolvers.filtered_from_content(content,pattern)
+ if content and type(pattern)=="string" then
+ local pattern=lower(pattern)
+ local files=content.files
+ local remap=content.remap
+ if files and remap then
+ local n=next(files)
+ local function iterator()
+ while n do
+ local k=n
+ n=next(files,k)
+ if find(k,pattern) then
+ return files[k],remap and remap[k] or k
+ end
+ end
+ end
+ return iterator
+ end
+ end
+ return nothing
+end
end -- of closure
@@ -12933,7 +13699,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-env"] = package.loaded["data-env"] or true
--- original size: 8769, stripped down to: 6490
+-- original size: 9216, stripped down to: 6798
if not modules then modules={} end modules ['data-env']={
version=1.001,
@@ -12951,10 +13717,12 @@ local formats=allocate()
local suffixes=allocate()
local dangerous=allocate()
local suffixmap=allocate()
+local usertypes=allocate()
resolvers.formats=formats
resolvers.suffixes=suffixes
resolvers.dangerous=dangerous
resolvers.suffixmap=suffixmap
+resolvers.usertypes=usertypes
local luasuffixes=utilities.lua.suffixes
local relations=allocate {
core={
@@ -13022,11 +13790,13 @@ local relations=allocate {
names={ "mp" },
variable='MPINPUTS',
suffixes={ 'mp','mpvi','mpiv','mpii' },
+ usertype=true,
},
tex={
names={ "tex" },
variable='TEXINPUTS',
- suffixes={ 'tex',"mkvi","mkiv","mkii" },
+ suffixes={ "tex","mkvi","mkiv","mkii","cld","lfg","xml" },
+ usertype=true,
},
icc={
names={ "icc","icc profile","icc profiles" },
@@ -13042,6 +13812,7 @@ local relations=allocate {
names={ "lua" },
variable='LUAINPUTS',
suffixes={ luasuffixes.lua,luasuffixes.luc,luasuffixes.tma,luasuffixes.tmc },
+ usertype=true,
},
lib={
names={ "lib" },
@@ -13050,11 +13821,15 @@ local relations=allocate {
},
bib={
names={ 'bib' },
+ variable='BIBINPUTS',
suffixes={ 'bib' },
+ usertype=true,
},
bst={
names={ 'bst' },
+ variable='BSTINPUTS',
suffixes={ 'bst' },
+ usertype=true,
},
fontconfig={
names={ 'fontconfig','fontconfig file','fontconfig files' },
@@ -13136,8 +13911,9 @@ function resolvers.updaterelations()
for name,relation in next,categories do
local rn=relation.names
local rv=relation.variable
- local rs=relation.suffixes
if rn and rv then
+ local rs=relation.suffixes
+ local ru=relation.usertype
for i=1,#rn do
local rni=lower(gsub(rn[i]," ",""))
formats[rni]=rv
@@ -13149,8 +13925,9 @@ function resolvers.updaterelations()
end
end
end
- end
- if rs then
+ if ru then
+ usertypes[name]=true
+ end
end
end
end
@@ -13201,7 +13978,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tmp"] = package.loaded["data-tmp"] or true
--- original size: 15532, stripped down to: 11648
+-- original size: 15681, stripped down to: 11761
if not modules then modules={} end modules ['data-tmp']={
version=1.100,
@@ -13220,6 +13997,7 @@ local trace_cache=false trackers.register("resolvers.cache",function(v) trace_ca
local report_caches=logs.reporter("resolvers","caches")
local report_resolvers=logs.reporter("resolvers","caching")
local resolvers=resolvers
+local cleanpath=resolvers.cleanpath
local directive_cleanup=false directives.register("system.compile.cleanup",function(v) directive_cleanup=v end)
local directive_strip=false directives.register("system.compile.strip",function(v) directive_strip=v end)
local compile=utilities.lua.compile
@@ -13241,7 +14019,7 @@ caches.relocate=false
caches.defaults={ "TMPDIR","TEMPDIR","TMP","TEMP","HOME","HOMEPATH" }
local writable,readables,usedreadables=nil,{},{}
local function identify()
- local texmfcaches=resolvers.cleanpathlist("TEXMFCACHE")
+ local texmfcaches=resolvers.cleanpathlist("TEXMFCACHE")
if texmfcaches then
for k=1,#texmfcaches do
local cachepath=texmfcaches[k]
@@ -13495,10 +14273,12 @@ 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(addsuffix(name,luasuffixes.lua),"trees")
- local filename=file.join(path,name)
+function caches.loadcontent(cachename,dataname,filename)
+ if not filename then
+ local name=caches.hashed(cachename)
+ local full,path=caches.getfirstreadablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename=file.join(path,name)
+ end
local blob=loadfile(addsuffix(filename,luasuffixes.luc)) or loadfile(addsuffix(filename,luasuffixes.lua))
if blob then
local data=blob()
@@ -13530,10 +14310,12 @@ function caches.collapsecontent(content)
end
end
end
-function caches.savecontent(cachename,dataname,content)
- local name=caches.hashed(cachename)
- local full,path=caches.setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
- local filename=file.join(path,name)
+function caches.savecontent(cachename,dataname,content,filename)
+ if not filename then
+ local name=caches.hashed(cachename)
+ local full,path=caches.setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename=file.join(path,name)
+ end
local luaname=addsuffix(filename,luasuffixes.lua)
local lucname=addsuffix(filename,luasuffixes.luc)
if trace_locating then
@@ -13576,7 +14358,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-met"] = package.loaded["data-met"] or true
--- original size: 5460, stripped down to: 4014
+-- original size: 5347, stripped down to: 4015
if not modules then modules={} end modules ['data-met']={
version=1.100,
@@ -13604,7 +14386,7 @@ local function splitmethod(filename)
if type(filename)=="table" then
return filename
end
- filename=file.collapsepath(filename,".")
+ filename=file.collapsepath(filename,".")
if not find(filename,"://",1,true) then
return { scheme="file",path=filename,original=filename,filename=filename }
end
@@ -13695,7 +14477,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-res"] = package.loaded["data-res"] or true
--- original size: 62045, stripped down to: 43116
+-- original size: 67003, stripped down to: 46291
if not modules then modules={} end modules ['data-res']={
version=1.001,
@@ -13705,7 +14487,7 @@ if not modules then modules={} end modules ['data-res']={
license="see context related readme files",
}
local gsub,find,lower,upper,match,gmatch=string.gsub,string.find,string.lower,string.upper,string.match,string.gmatch
-local concat,insert,sortedkeys=table.concat,table.insert,table.sortedkeys
+local concat,insert,remove,sortedkeys,sortedhash=table.concat,table.insert,table.remove,table.sortedkeys,table.sortedhash
local next,type,rawget=next,type,rawget
local os=os
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
@@ -13714,17 +14496,23 @@ local formatters=string.formatters
local filedirname=file.dirname
local filebasename=file.basename
local suffixonly=file.suffixonly
+local addsuffix=file.addsuffix
+local removesuffix=file.removesuffix
local filejoin=file.join
local collapsepath=file.collapsepath
local joinpath=file.joinpath
+local is_qualified_path=file.is_qualified_path
local allocate=utilities.storage.allocate
local settings_to_array=utilities.parsers.settings_to_array
+local getcurrentdir=lfs.currentdir
+local isfile=lfs.isfile
+local isdir=lfs.isdir
local setmetatableindex=table.setmetatableindex
local luasuffixes=utilities.lua.suffixes
-local getcurrentdir=lfs.currentdir
local trace_locating=false trackers .register("resolvers.locating",function(v) trace_locating=v end)
local trace_detail=false trackers .register("resolvers.details",function(v) trace_detail=v end)
local trace_expansions=false trackers .register("resolvers.expansions",function(v) trace_expansions=v end)
+local trace_paths=false trackers .register("resolvers.paths",function(v) trace_paths=v end)
local resolve_otherwise=true directives.register("resolvers.otherwise",function(v) resolve_otherwise=v end)
local report_resolving=logs.reporter("resolvers","resolving")
local resolvers=resolvers
@@ -13732,10 +14520,14 @@ local expandedpathfromlist=resolvers.expandedpathfromlist
local checkedvariable=resolvers.checkedvariable
local splitconfigurationpath=resolvers.splitconfigurationpath
local methodhandler=resolvers.methodhandler
+local filtered=resolvers.filtered_from_content
+local lookup=resolvers.get_from_content
+local cleanpath=resolvers.cleanpath
+local resolveprefix=resolvers.resolve
local initializesetter=utilities.setters.initialize
local ostype,osname,osenv,ossetenv,osgetenv=os.type,os.name,os.env,os.setenv,os.getenv
-resolvers.cacheversion='1.0.1'
-resolvers.configbanner=''
+resolvers.cacheversion="1.100"
+resolvers.configbanner=""
resolvers.homedir=environment.homedir
resolvers.criticalvars=allocate { "SELFAUTOLOC","SELFAUTODIR","SELFAUTOPARENT","TEXMFCNF","TEXMF","TEXOS" }
resolvers.luacnfname="texmfcnf.lua"
@@ -13754,6 +14546,7 @@ end
local unset_variable="unset"
local formats=resolvers.formats
local suffixes=resolvers.suffixes
+local usertypes=resolvers.usertypes
local dangerous=resolvers.dangerous
local suffixmap=resolvers.suffixmap
resolvers.defaultsuffixes={ "tex" }
@@ -13762,7 +14555,7 @@ local instance=resolvers.instance or nil
function resolvers.setenv(key,value,raw)
if instance then
instance.environment[key]=value
- ossetenv(key,raw and value or resolvers.resolve(value))
+ ossetenv(key,raw and value or resolveprefix(value))
end
end
local function getenv(key)
@@ -13776,7 +14569,7 @@ local function getenv(key)
end
resolvers.getenv=getenv
resolvers.env=getenv
-local function resolve(k)
+local function resolvevariable(k)
return instance.expansions[k]
end
local dollarstripper=lpeg.stripper("$")
@@ -13785,19 +14578,19 @@ 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 variableexpander=Cs((somevariable*(somekey/resolvevariable)+somethingelse)^1 )
local cleaner=P("\\")/"/"+P(";")*S("!{}/\\")^0*P(";")^1/";"
local variablecleaner=Cs((cleaner+P(1))^0)
-local somevariable=R("az","AZ","09","__","--")^1/resolve
+local somevariable=R("az","AZ","09","__","--")^1/resolvevariable
local variable=(P("$")/"")*(somevariable+(P("{")/"")*somevariable*(P("}")/""))
local variableresolver=Cs((variable+P(1))^0)
local function expandedvariable(var)
return lpegmatch(variableexpander,var) or var
end
-function resolvers.newinstance()
- if trace_locating then
+function resolvers.newinstance()
+ if trace_locating then
report_resolving("creating instance")
- end
+ end
local environment,variables,expansions,order=allocate(),allocate(),allocate(),allocate()
local newinstance={
environment=environment,
@@ -13810,6 +14603,7 @@ function resolvers.newinstance()
foundintrees=allocate(),
hashes=allocate(),
hashed=allocate(),
+ pathlists=false,
specification=allocate(),
lists=allocate(),
data=allocate(),
@@ -13822,6 +14616,7 @@ function resolvers.newinstance()
savelists=true,
pattern=nil,
force_suffixes=true,
+ pathstack={},
}
setmetatableindex(variables,function(t,k)
local v
@@ -13871,8 +14666,13 @@ function resolvers.reset()
end
local function reset_hashes()
instance.lists={}
+ instance.pathlists=false
instance.found={}
end
+local function reset_caches()
+ instance.lists={}
+ instance.pathlists=false
+end
local slash=P("/")
local pathexpressionpattern=Cs (
Cc("^")*(
@@ -13924,13 +14724,13 @@ local function identify_configuration_files()
for i=1,#cnfpaths do
local filepath=cnfpaths[i]
local filename=collapsepath(filejoin(filepath,luacnfname))
- local realname=resolvers.resolve(filename)
+ local realname=resolveprefix(filename)
if trace_locating then
- local fullpath=gsub(resolvers.resolve(collapsepath(filepath)),"//","/")
+ local fullpath=gsub(resolveprefix(collapsepath(filepath)),"//","/")
local weirdpath=find(fullpath,"/texmf.+/texmf") or not find(fullpath,"/web2c",1,true)
report_resolving("looking for %a on %s path %a from specification %a",luacnfname,weirdpath and "weird" or "given",fullpath,filepath)
end
- if lfs.isfile(realname) then
+ if isfile(realname) then
specification[#specification+1]=filename
if trace_locating then
report_resolving("found configuration file %a",realname)
@@ -13952,7 +14752,7 @@ local function load_configuration_files()
local filename=specification[i]
local pathname=filedirname(filename)
local filename=filejoin(pathname,luacnfname)
- local realname=resolvers.resolve(filename)
+ local realname=resolveprefix(filename)
local blob=loadfile(realname)
if blob then
local setups=instance.setups
@@ -13960,7 +14760,7 @@ local function load_configuration_files()
local parent=data and data.parent
if parent then
local filename=filejoin(pathname,parent)
- local realname=resolvers.resolve(filename)
+ local realname=resolveprefix(filename)
local blob=loadfile(realname)
if blob then
local parentdata=blob()
@@ -13985,7 +14785,7 @@ local function load_configuration_files()
elseif variables[k]==nil then
if trace_locating and not warning then
report_resolving("variables like %a in configuration file %a should move to the 'variables' subtable",
- k,resolvers.resolve(filename))
+ k,resolveprefix(filename))
warning=true
end
variables[k]=v
@@ -14045,7 +14845,7 @@ local function locate_file_databases()
local stripped=lpegmatch(inhibitstripper,path)
if stripped~="" then
local runtime=stripped==path
- path=resolvers.cleanpath(path)
+ path=cleanpath(path)
local spec=resolvers.splitmethod(stripped)
if runtime and (spec.noscheme or spec.scheme=="file") then
stripped="tree:///"..stripped
@@ -14108,8 +14908,8 @@ function resolvers.renew(hashname)
report_resolving("identifying tree %a",hashname)
end
end
- local realpath=resolvers.resolve(hashname)
- if lfs.isdir(realpath) then
+ local realpath=resolveprefix(hashname)
+ if isdir(realpath) then
if trace_locating then
report_resolving("using path %a",realpath)
end
@@ -14210,19 +15010,53 @@ end
function resolvers.unexpandedpath(str)
return joinpath(resolvers.unexpandedpathlist(str))
end
+function resolvers.pushpath(name)
+ local pathstack=instance.pathstack
+ local lastpath=pathstack[#pathstack]
+ local pluspath=filedirname(name)
+ if lastpath then
+ lastpath=collapsepath(filejoin(lastpath,pluspath))
+ else
+ lastpath=collapsepath(pluspath)
+ end
+ insert(pathstack,lastpath)
+ if trace_paths then
+ report_resolving("pushing path %a",lastpath)
+ end
+end
+function resolvers.poppath()
+ local pathstack=instance.pathstack
+ if trace_paths and #pathstack>0 then
+ report_resolving("popping path %a",pathstack[#pathstack])
+ end
+ remove(pathstack)
+end
+function resolvers.stackpath()
+ local pathstack=instance.pathstack
+ local currentpath=pathstack[#pathstack]
+ return currentpath~="" and currentpath or nil
+end
local done={}
function resolvers.resetextrapath()
local ep=instance.extra_paths
if not ep then
- ep,done={},{}
- instance.extra_paths=ep
+ done={}
+ instance.extra_paths={}
elseif #ep>0 then
- instance.lists,done={},{}
+ done={}
+ reset_caches()
end
end
function resolvers.registerextrapath(paths,subpaths)
- paths=settings_to_array(paths)
- subpaths=settings_to_array(subpaths)
+ if not subpaths or subpaths=="" then
+ if not paths or path=="" then
+ return
+ elseif done[paths] then
+ return
+ end
+ end
+ local paths=settings_to_array(paths)
+ local subpaths=settings_to_array(subpaths)
local ep=instance.extra_paths or {}
local oldn=#ep
local newn=oldn
@@ -14237,7 +15071,7 @@ function resolvers.registerextrapath(paths,subpaths)
local ps=p.."/"..s
if not done[ps] then
newn=newn+1
- ep[newn]=resolvers.cleanpath(ps)
+ ep[newn]=cleanpath(ps)
done[ps]=true
end
end
@@ -14247,7 +15081,7 @@ function resolvers.registerextrapath(paths,subpaths)
local p=paths[i]
if not done[p] then
newn=newn+1
- ep[newn]=resolvers.cleanpath(p)
+ ep[newn]=cleanpath(p)
done[p]=true
end
end
@@ -14259,7 +15093,7 @@ function resolvers.registerextrapath(paths,subpaths)
local ps=ep[i].."/"..s
if not done[ps] then
newn=newn+1
- ep[newn]=resolvers.cleanpath(ps)
+ ep[newn]=cleanpath(ps)
done[ps]=true
end
end
@@ -14268,52 +15102,70 @@ function resolvers.registerextrapath(paths,subpaths)
if newn>0 then
instance.extra_paths=ep
end
- if newn>oldn then
- instance.lists={}
+ if newn~=oldn then
+ reset_caches()
end
end
-local function made_list(instance,list)
- local ep=instance.extra_paths
- if not ep or #ep==0 then
- return list
+function resolvers.pushextrapath(path)
+ local paths=settings_to_array(path)
+ if instance.extra_stack then
+ insert(instance.extra_stack,1,paths)
else
- local done,new,newn={},{},0
- for k=1,#list do
- local v=list[k]
- if not done[v] then
- if find(v,"^[%.%/]$") then
- done[v]=true
- newn=newn+1
- new[newn]=v
- else
- break
- end
- end
- end
- for k=1,#ep do
- local v=ep[k]
+ instance.extra_stack={ paths }
+ end
+ reset_caches()
+end
+function resolvers.popextrapath()
+ if instance.extra_stack then
+ reset_caches()
+ return remove(instance.extra_stack,1)
+ end
+end
+local function made_list(instance,list,extra_too)
+ local done={}
+ local new={}
+ local newn=0
+ local function add(p)
+ for k=1,#p do
+ local v=p[k]
if not done[v] then
done[v]=true
newn=newn+1
new[newn]=v
end
end
- for k=1,#list do
- local v=list[k]
- if not done[v] then
- done[v]=true
- newn=newn+1
- new[newn]=v
+ end
+ for k=1,#list do
+ local v=list[k]
+ if done[v] then
+ elseif find(v,"^[%.%/]$") then
+ done[v]=true
+ newn=newn+1
+ new[newn]=v
+ else
+ break
+ end
+ end
+ if extra_too then
+ local es=instance.extra_stack
+ if es and #es>0 then
+ for k=1,#es do
+ add(es[k])
end
end
- return new
+ local ep=instance.extra_paths
+ if ep and #ep>0 then
+ add(ep)
+ end
end
+ add(list)
+ return new
end
function resolvers.cleanpathlist(str)
local t=resolvers.expandedpathlist(str)
if t then
for i=1,#t do
- t[i]=collapsepath(resolvers.cleanpath(t[i]))
+ t[i]=collapsepath(cleanpath(t[i]))
end
end
return t
@@ -14321,22 +15173,22 @@ end
function resolvers.expandpath(str)
return joinpath(resolvers.expandedpathlist(str))
end
-function resolvers.expandedpathlist(str)
+function resolvers.expandedpathlist(str,extra_too)
if not str then
return {}
- elseif instance.savelists then
+ elseif instance.savelists then
str=lpegmatch(dollarstripper,str)
local lists=instance.lists
local lst=lists[str]
if not lst then
- local l=made_list(instance,resolvers.splitpath(resolvers.expansion(str)))
+ local l=made_list(instance,resolvers.splitpath(resolvers.expansion(str)),extra_too)
lst=expandedpathfromlist(l)
lists[str]=lst
end
return lst
else
local lst=resolvers.splitpath(resolvers.expansion(str))
- return made_list(instance,expandedpathfromlist(lst))
+ return made_list(instance,expandedpathfromlist(lst),extra_too)
end
end
function resolvers.expandedpathlistfromvariable(str)
@@ -14347,6 +15199,13 @@ end
function resolvers.expandpathfromvariable(str)
return joinpath(resolvers.expandedpathlistfromvariable(str))
end
+function resolvers.cleanedpathlist(v)
+ local t=resolvers.expandedpathlist(v)
+ for i=1,#t do
+ t[i]=resolvers.resolve(resolvers.cleanpath(t[i]))
+ end
+ return t
+end
function resolvers.expandbraces(str)
local ori=str
local pth=expandedpathfromlist(resolvers.splitpath(ori))
@@ -14363,7 +15222,7 @@ function resolvers.registerfilehash(name,content,someerror)
end
end
local function isreadable(name)
- local readable=lfs.isfile(name)
+ local readable=isfile(name)
if trace_detail then
if readable then
report_resolving("file %a is readable",name)
@@ -14373,70 +15232,57 @@ local function isreadable(name)
end
return readable
end
-local function collect_files(names)
- local filelist,noffiles={},0
+local function collect_files(names)
+ local filelist={}
+ local noffiles=0
+ local function check(hash,root,pathname,path,name)
+ if not pathname or find(path,pathname) then
+ local variant=hash.type
+ local search=filejoin(root,path,name)
+ local result=methodhandler('concatinators',variant,root,path,name)
+ if trace_detail then
+ report_resolving("match: variant %a, search %a, result %a",variant,search,result)
+ end
+ noffiles=noffiles+1
+ filelist[noffiles]={ variant,search,result }
+ end
+ end
for k=1,#names do
- local fname=names[k]
+ local filename=names[k]
if trace_detail then
- report_resolving("checking name %a",fname)
+ report_resolving("checking name %a",filename)
end
- local bname=filebasename(fname)
- local dname=filedirname(fname)
- if dname=="" or find(dname,"^%.") then
- dname=false
+ local basename=filebasename(filename)
+ local pathname=filedirname(filename)
+ if pathname=="" or find(pathname,"^%.") then
+ pathname=false
else
- dname=gsub(dname,"%*",".*")
- dname="/"..dname.."$"
+ pathname=gsub(pathname,"%*",".*")
+ pathname="/"..pathname.."$"
end
local hashes=instance.hashes
for h=1,#hashes do
local hash=hashes[h]
- local blobpath=hash.name
- local files=blobpath and instance.files[blobpath]
- if files then
+ local hashname=hash.name
+ local content=hashname and instance.files[hashname]
+ if content then
if trace_detail then
- report_resolving("deep checking %a, base %a, pattern %a",blobpath,bname,dname)
- 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
+ report_resolving("deep checking %a, base %a, pattern %a",hashname,basename,pathname)
end
- if blobfile then
- local blobroot=files.__path__ or blobpath
- if type(blobfile)=='string' then
- if not dname or find(blobfile,dname) then
- local variant=hash.type
- local search=filejoin(blobroot,blobfile,bname)
- local result=methodhandler('concatinators',hash.type,blobroot,blobfile,bname)
- if trace_detail then
- report_resolving("match: variant %a, search %a, result %a",variant,search,result)
- end
- noffiles=noffiles+1
- filelist[noffiles]={ variant,search,result }
- end
+ local path,name=lookup(content,basename)
+ if path then
+ local metadata=content.metadata
+ local realroot=metadata and metadata.path or hashname
+ if type(path)=="string" then
+ check(hash,realroot,pathname,path,name)
else
- for kk=1,#blobfile do
- local vv=blobfile[kk]
- if not dname or find(vv,dname) then
- local variant=hash.type
- local search=filejoin(blobroot,vv,bname)
- local result=methodhandler('concatinators',hash.type,blobroot,vv,bname)
- if trace_detail then
- report_resolving("match: variant %a, search %a, result %a",variant,search,result)
- end
- noffiles=noffiles+1
- filelist[noffiles]={ variant,search,result }
- end
+ for i=1,#path do
+ check(hash,realroot,pathname,path[i],name)
end
end
end
elseif trace_locating then
- report_resolving("no match in %a (%s)",blobpath,bname)
+ report_resolving("no match in %a (%s)",hashname,basename)
end
end
end
@@ -14461,7 +15307,7 @@ end
local function can_be_dir(name)
local fakepaths=instance.fakepaths
if not fakepaths[name] then
- if lfs.isdir(name) then
+ if isdir(name) then
fakepaths[name]=1
else
fakepaths[name]=2
@@ -14477,10 +15323,11 @@ local function find_analyze(filename,askedformat,allresults)
if askedformat=="" then
if ext=="" or not suffixmap[ext] then
local defaultsuffixes=resolvers.defaultsuffixes
+ local formatofsuffix=resolvers.formatofsuffix
for i=1,#defaultsuffixes do
local forcedname=filename..'.'..defaultsuffixes[i]
wantedfiles[#wantedfiles+1]=forcedname
- filetype=resolvers.formatofsuffix(forcedname)
+ filetype=formatofsuffix(forcedname)
if trace_locating then
report_resolving("forcing filetype %a",filetype)
end
@@ -14520,14 +15367,14 @@ local function find_wildcard(filename,allresults)
if trace_locating then
report_resolving("checking wildcard %a",filename)
end
- local method,result=resolvers.findwildcardfiles(filename)
+ local result=resolvers.findwildcardfiles(filename)
if result then
return "wildcard",result
end
end
end
local function find_qualified(filename,allresults,askedformat,alsostripped)
- if not file.is_qualified_path(filename) then
+ if not is_qualified_path(filename) then
return
end
if trace_locating then
@@ -14601,33 +15448,66 @@ local function check_subpath(fname)
return fname
end
end
-local function find_intree(filename,filetype,wantedfiles,allresults)
+local function makepathlist(list,filetype)
local typespec=resolvers.variableofformat(filetype)
- local pathlist=resolvers.expandedpathlist(typespec)
- local method="intree"
+ local pathlist=resolvers.expandedpathlist(typespec,filetype and usertypes[filetype])
+ local entry={}
if pathlist and #pathlist>0 then
- local filelist=collect_files(wantedfiles)
+ for k=1,#pathlist do
+ local path=pathlist[k]
+ local prescanned=find(path,'^!!')
+ local resursive=find(path,'//$')
+ local pathname=lpegmatch(inhibitstripper,path)
+ local expression=makepathexpression(pathname)
+ local barename=gsub(pathname,"/+$","")
+ barename=resolveprefix(barename)
+ local scheme=url.hasscheme(barename)
+ local schemename=gsub(barename,"%.%*$",'')
+ entry[k]={
+ path=path,
+ pathname=pathname,
+ prescanned=prescanned,
+ recursive=recursive,
+ expression=expression,
+ barename=barename,
+ scheme=scheme,
+ schemename=schemename,
+ }
+ end
+ entry.typespec=typespec
+ list[filetype]=entry
+ else
+ list[filetype]=false
+ end
+ return entry
+end
+local function find_intree(filename,filetype,wantedfiles,allresults)
+ local pathlists=instance.pathlists
+ if not pathlists then
+ pathlists=setmetatableindex(allocate(),makepathlist)
+ instance.pathlists=pathlists
+ end
+ local pathlist=pathlists[filetype]
+ if pathlist then
+ local method="intree"
+ local filelist=collect_files(wantedfiles)
local dirlist={}
+ local result={}
if filelist then
for i=1,#filelist do
dirlist[i]=filedirname(filelist[i][3]).."/"
end
end
if trace_detail then
- report_resolving("checking filename %a",filename)
+ report_resolving("checking filename %a in tree",filename)
end
- local resolve=resolvers.resolve
- local result={}
for k=1,#pathlist do
- local path=pathlist[k]
- local pathname=lpegmatch(inhibitstripper,path)
- local doscan=path==pathname
- if not find (pathname,'//$') then
- doscan=false
- end
+ local entry=pathlist[k]
+ local path=entry.path
+ local pathname=entry.pathname
local done=false
if filelist then
- local expression=makepathexpression(pathname)
+ local expression=entry.expression
if trace_detail then
report_resolving("using pattern %a for path %a",expression,pathname)
end
@@ -14635,8 +15515,8 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
local fl=filelist[k]
local f=fl[2]
local d=dirlist[k]
- if find(d,expression) or find(resolve(d),expression) then
- result[#result+1]=resolve(fl[3])
+ if find(d,expression) or find(resolveprefix(d),expression) then
+ result[#result+1]=resolveprefix(fl[3])
done=true
if allresults then
if trace_detail then
@@ -14657,56 +15537,62 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
method="database"
else
method="filesystem"
- pathname=gsub(pathname,"/+$","")
- pathname=resolve(pathname)
- local scheme=url.hasscheme(pathname)
+ local scheme=entry.scheme
if not scheme or scheme=="file" then
- local pname=gsub(pathname,"%.%*$",'')
+ local pname=entry.schemename
if not find(pname,"*",1,true) then
if can_be_dir(pname) then
- for k=1,#wantedfiles do
- local w=wantedfiles[k]
- local fname=check_subpath(filejoin(pname,w))
- if fname then
- result[#result+1]=fname
- done=true
- if not allresults then
- break
- end
+ if not done and not entry.prescanned then
+ if trace_detail then
+ report_resolving("quick root scan for %a",pname)
end
- end
- if not done and doscan then
- local files=resolvers.simplescanfiles(pname,false,true)
for k=1,#wantedfiles do
local w=wantedfiles[k]
- local subpath=files[w]
- if not subpath or subpath=="" then
- elseif type(subpath)=="string" then
- local fname=check_subpath(filejoin(pname,subpath,w))
- if fname then
- result[#result+1]=fname
- done=true
- if not allresults then
- break
- end
+ local fname=check_subpath(filejoin(pname,w))
+ if fname then
+ result[#result+1]=fname
+ done=true
+ if not allresults then
+ break
end
- else
- for i=1,#subpath do
- local sp=subpath[i]
- if sp=="" then
- else
- local fname=check_subpath(filejoin(pname,sp,w))
- if fname then
- result[#result+1]=fname
- done=true
- if not allresults then
- break
+ end
+ end
+ if not done and entry.recursive then
+ if trace_detail then
+ report_resolving("scanning filesystem for %a",pname)
+ end
+ local files=resolvers.simplescanfiles(pname,false,true)
+ for k=1,#wantedfiles do
+ local w=wantedfiles[k]
+ local subpath=files[w]
+ if not subpath or subpath=="" then
+ elseif type(subpath)=="string" then
+ local fname=check_subpath(filejoin(pname,subpath,w))
+ if fname then
+ result[#result+1]=fname
+ done=true
+ if not allresults then
+ break
+ end
+ end
+ else
+ for i=1,#subpath do
+ local sp=subpath[i]
+ if sp=="" then
+ else
+ local fname=check_subpath(filejoin(pname,sp,w))
+ if fname then
+ result[#result+1]=fname
+ done=true
+ if not allresults then
+ break
+ end
end
end
end
- end
- if done and not allresults then
- break
+ if done and not allresults then
+ break
+ end
end
end
end
@@ -14714,6 +15600,18 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
else
end
+ else
+ for k=1,#wantedfiles do
+ local pname=entry.barename
+ local fname=methodhandler('finders',pname.."/"..wantedfiles[k])
+ if fname then
+ result[#result+1]=fname
+ done=true
+ if not allresults then
+ break
+ end
+ end
+ end
end
end
if done and not allresults then
@@ -14748,10 +15646,13 @@ local function find_otherwise(filename,filetype,wantedfiles,allresults)
local filelist=collect_files(wantedfiles)
local fl=filelist and filelist[1]
if fl then
- return "otherwise",{ resolvers.resolve(fl[3]) }
+ return "otherwise",{ resolveprefix(fl[3]) }
end
end
collect_instance_files=function(filename,askedformat,allresults)
+ if not filename or filename=="" then
+ return {}
+ end
askedformat=askedformat or ""
filename=collapsepath(filename,".")
filename=gsub(filename,"^%./",getcurrentdir().."/")
@@ -14786,7 +15687,11 @@ collect_instance_files=function(filename,askedformat,allresults)
else
local method,result,stamp,filetype,wantedfiles
if instance.remember then
- stamp=formatters["%s--%s"](filename,askedformat)
+ if askedformat=="" then
+ stamp=formatters["%s::%s"](suffixonly(filename),filename)
+ else
+ stamp=formatters["%s::%s"](askedformat,filename)
+ end
result=stamp and instance.found[stamp]
if result then
if trace_locating then
@@ -14821,7 +15726,7 @@ collect_instance_files=function(filename,askedformat,allresults)
end
if stamp then
if trace_locating then
- report_resolving("remembering file %a",filename)
+ report_resolving("remembering file %a using hash %a",filename,stamp)
end
instance.found[stamp]=result
end
@@ -14829,6 +15734,9 @@ collect_instance_files=function(filename,askedformat,allresults)
end
end
local function findfiles(filename,filetype,allresults)
+ if not filename or filename=="" then
+ return {}
+ end
local result,status=collect_instance_files(filename,filetype or "",allresults)
if not result or #result==0 then
local lowered=lower(filename)
@@ -14848,39 +15756,30 @@ 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 base=filebasename(filename)
+ local result={}
local hashes=instance.hashes
- local noffound=0
+ local function okay(hash,path,name)
+ local found=methodhandler('concatinators',hash.type,hash.name,path,name)
+ if found and found~="" then
+ result[#result+1]=resolveprefix(found)
+ return not allresults
+ end
+ end
for k=1,#hashes do
local hash=hashes[k]
- local files=instance.files[hash.name] or {}
- local blist=files[bname]
- if not blist then
- local rname="remap:"..bname
- blist=files[rname]
- if blist then
- bname=files[rname]
- blist=files[bname]
- end
- end
- if blist then
- if type(blist)=='string' then
- local found=methodhandler('concatinators',hash.type,hash.name,blist,bname) or ""
- if found~="" then
- noffound=noffound+1
- result[noffound]=resolvers.resolve(found)
- if not allresults then
- break
- end
+ local content=instance.files[hash.name]
+ if content then
+ local path,name=lookup(content,base)
+ if not path then
+ elseif type(path)=="string" then
+ if okay(hash,path,name) then
+ return result
end
else
- for kk=1,#blist do
- local vv=blist[kk]
- local found=methodhandler('concatinators',hash.type,hash.name,vv,bname) or ""
- if found~="" then
- noffound=noffound+1
- result[noffound]=resolvers.resolve(found)
- if not allresults then break end
+ for i=1,#path do
+ if okay(hash,path[i],name) then
+ return result
end
end
end
@@ -14894,64 +15793,80 @@ end
function resolvers.findgivenfile(filename)
return findgivenfiles(filename,false)[1] or ""
end
-local function doit(path,blist,bname,tag,variant,result,allresults)
- local done=false
- if blist and variant then
- local resolve=resolvers.resolve
- if type(blist)=='string' then
- if find(lower(blist),path) then
- local full=methodhandler('concatinators',variant,tag,blist,bname) or ""
- result[#result+1]=resolve(full)
- done=true
- end
- else
- for kk=1,#blist do
- local vv=blist[kk]
- if find(lower(vv),path) then
- local full=methodhandler('concatinators',variant,tag,vv,bname) or ""
- result[#result+1]=resolve(full)
- done=true
- if not allresults then break end
- end
- end
- end
- end
- return done
-end
local makewildcard=Cs(
(P("^")^0*P("/")*P(-1)+P(-1))/".*"+(P("^")^0*P("/")/"")^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)
- result=result or {}
+local function findwildcardfiles(filename,allresults,result)
+ local result=result or {}
local base=filebasename(filename)
local dirn=filedirname(filename)
local path=lower(lpegmatch(makewildcard,dirn) or dirn)
local name=lower(lpegmatch(makewildcard,base) or base)
- local files,done=instance.files,false
+ local files=instance.files
if find(name,"*",1,true) then
local hashes=instance.hashes
+ local function okay(found,path,base,hashname,hashtype)
+ if find(found,path) then
+ local full=methodhandler('concatinators',hashtype,hashname,found,base)
+ if full and full~="" then
+ result[#result+1]=resolveprefix(full)
+ return not allresults
+ end
+ end
+ end
for k=1,#hashes do
local hash=hashes[k]
- local hashname,hashtype=hash.name,hash.type
- for kk,hh in next,files[hashname] do
- if not find(kk,"^remap:") then
- if find(lower(kk),name) then
- if doit(path,hh,kk,hashname,hashtype,result,allresults) then done=true end
- if done and not allresults then break end
+ local hashname=hash.name
+ local hashtype=hash.type
+ if hashname and hashtype then
+ for found,base in filtered(files[hashname],name) do
+ if type(found)=='string' then
+ if okay(found,path,base,hashname,hashtype) then
+ break
+ end
+ else
+ for i=1,#found do
+ if okay(found[i],path,base,hashname,hashtype) then
+ break
+ end
+ end
end
end
end
end
else
+ local function okayokay(found,path,base,hashname,hashtype)
+ if find(found,path) then
+ local full=methodhandler('concatinators',hashtype,hashname,found,base)
+ if full and full~="" then
+ result[#result+1]=resolveprefix(full)
+ return not allresults
+ end
+ end
+ end
local hashes=instance.hashes
for k=1,#hashes do
local hash=hashes[k]
- local hashname,hashtype=hash.name,hash.type
- if doit(path,files[hashname][base],base,hashname,hashtype,result,allresults) then done=true end
- if done and not allresults then break end
+ local hashname=hash.name
+ local hashtype=hash.type
+ if hashname and hashtype then
+ local found,base=lookup(content,base)
+ if not found then
+ elseif type(found)=='string' then
+ if okay(found,path,base,hashname,hashtype) then
+ break
+ end
+ else
+ for i=1,#found do
+ if okay(found[i],path,base,hashname,hashtype) then
+ break
+ end
+ end
+ end
+ end
end
end
return result
@@ -15024,7 +15939,7 @@ end
function resolvers.dowithpath(name,func)
local pathlist=resolvers.expandedpathlist(name)
for i=1,#pathlist do
- func("^"..resolvers.cleanpath(pathlist[i]))
+ func("^"..cleanpath(pathlist[i]))
end
end
function resolvers.dowithvariable(name,func)
@@ -15032,23 +15947,23 @@ function resolvers.dowithvariable(name,func)
end
function resolvers.locateformat(name)
local engine=environment.ownmain or "luatex"
- local barename=file.removesuffix(name)
- local fullname=file.addsuffix(barename,"fmt")
+ local barename=removesuffix(name)
+ local fullname=addsuffix(barename,"fmt")
local fmtname=caches.getfirstreadablefile(fullname,"formats",engine) or ""
if fmtname=="" then
fmtname=resolvers.findfile(fullname)
- fmtname=resolvers.cleanpath(fmtname)
+ fmtname=cleanpath(fmtname)
end
if fmtname~="" then
- local barename=file.removesuffix(fmtname)
- local luaname=file.addsuffix(barename,luasuffixes.lua)
- local lucname=file.addsuffix(barename,luasuffixes.luc)
- local luiname=file.addsuffix(barename,luasuffixes.lui)
- if lfs.isfile(luiname) then
+ local barename=removesuffix(fmtname)
+ local luaname=addsuffix(barename,luasuffixes.lua)
+ local lucname=addsuffix(barename,luasuffixes.luc)
+ local luiname=addsuffix(barename,luasuffixes.lui)
+ if isfile(luiname) then
return barename,luiname
- elseif lfs.isfile(lucname) then
+ elseif isfile(lucname) then
return barename,lucname
- elseif lfs.isfile(luaname) then
+ elseif isfile(luaname) then
return barename,luaname
end
end
@@ -15070,29 +15985,24 @@ function resolvers.dowithfilesintree(pattern,handle,before,after)
local hash=hashes[i]
local blobtype=hash.type
local blobpath=hash.name
- if blobpath then
+ if blobtype and blobpath then
+ local total=0
+ local checked=0
+ local done=0
if before then
before(blobtype,blobpath,pattern)
end
- local files=instance.files[blobpath]
- local total,checked,done=0,0,0
- if files then
- for k,v in table.sortedhash(files) do
- total=total+1
- if find(k,"^remap:") then
- elseif find(k,pattern) then
- if type(v)=="string" then
- checked=checked+1
- if handle(blobtype,blobpath,v,k) then
- done=done+1
- end
- else
- checked=checked+#v
- for i=1,#v do
- if handle(blobtype,blobpath,v[i],k) then
- done=done+1
- end
- end
+ for path,name in filtered(instance.files[blobpath],pattern) do
+ if type(path)=="string" then
+ checked=checked+1
+ if handle(blobtype,blobpath,path,name) then
+ done=done+1
+ end
+ else
+ checked=checked+#path
+ for i=1,#path do
+ if handle(blobtype,blobpath,path[i],name) then
+ done=done+1
end
end
end
@@ -15103,8 +16013,8 @@ function resolvers.dowithfilesintree(pattern,handle,before,after)
end
end
end
-resolvers.obsolete=resolvers.obsolete or {}
-local obsolete=resolvers.obsolete
+local obsolete=resolvers.obsolete or {}
+resolvers.obsolete=obsolete
resolvers.find_file=resolvers.findfile obsolete.find_file=resolvers.findfile
resolvers.find_files=resolvers.findfiles obsolete.find_files=resolvers.findfiles
@@ -15115,7 +16025,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-pre"] = package.loaded["data-pre"] or true
--- original size: 6643, stripped down to: 4401
+-- original size: 3950, stripped down to: 2935
if not modules then modules={} end modules ['data-pre']={
version=1.001,
@@ -15125,44 +16035,51 @@ if not modules then modules={} end modules ['data-pre']={
license="see context related readme files"
}
local resolvers=resolvers
-local prefixes=utilities.storage.allocate()
-resolvers.prefixes=prefixes
-local cleanpath,findgivenfile,expansion=resolvers.cleanpath,resolvers.findgivenfile,resolvers.expansion
+local prefixes=resolvers.prefixes
+local cleanpath=resolvers.cleanpath
+local findgivenfile=resolvers.findgivenfile
+local expansion=resolvers.expansion
local getenv=resolvers.getenv
-local P,S,R,C,Cs,Cc,lpegmatch=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.match
-local joinpath,basename,dirname=file.join,file.basename,file.dirname
-local getmetatable,rawset,type=getmetatable,rawset,type
+local basename=file.basename
+local dirname=file.dirname
+local joinpath=file.join
+local isfile=lfs.isfile
prefixes.environment=function(str)
return cleanpath(expansion(str))
end
-prefixes.relative=function(str,n)
- if io.exists(str) then
- elseif io.exists("./"..str) then
- str="./"..str
- else
- local p="../"
- for i=1,n or 2 do
- if io.exists(p..str) then
- str=p..str
- break
- else
- p=p.."../"
+local function relative(str,n)
+ if not isfile(str) then
+ local pstr="./"..str
+ if isfile(pstr) then
+ str=pstr
+ else
+ local p="../"
+ for i=1,n or 2 do
+ local pstr=p..str
+ if isfile(pstr) then
+ str=pstr
+ break
+ else
+ p=p.."../"
+ end
end
end
end
return cleanpath(str)
end
+local function locate(str)
+ local fullname=findgivenfile(str) or ""
+ return cleanpath(fullname~="" and fullname or str)
+end
+prefixes.relative=relative
+prefixes.locate=locate
prefixes.auto=function(str)
- local fullname=prefixes.relative(str)
- if not lfs.isfile(fullname) then
- fullname=prefixes.locate(str)
+ local fullname=relative(str)
+ if not isfile(fullname) then
+ fullname=locate(str)
end
return fullname
end
-prefixes.locate=function(str)
- local fullname=findgivenfile(str) or ""
- return cleanpath((fullname~="" and fullname) or str)
-end
prefixes.filename=function(str)
local fullname=findgivenfile(str) or ""
return cleanpath(basename((fullname~="" and fullname) or str))
@@ -15183,6 +16100,13 @@ end
prefixes.home=function(str)
return cleanpath(joinpath(getenv('HOME'),str))
end
+prefixes.env=prefixes.environment
+prefixes.rel=prefixes.relative
+prefixes.loc=prefixes.locate
+prefixes.kpse=prefixes.locate
+prefixes.full=prefixes.locate
+prefixes.file=prefixes.filename
+prefixes.path=prefixes.pathname
local function toppath()
local inputstack=resolvers.inputstack
if not inputstack then
@@ -15195,98 +16119,22 @@ local function toppath()
return pathname
end
end
-resolvers.toppath=toppath
-prefixes.toppath=function(str)
- return cleanpath(joinpath(toppath(),str))
-end
-prefixes.env=prefixes.environment
-prefixes.rel=prefixes.relative
-prefixes.loc=prefixes.locate
-prefixes.kpse=prefixes.locate
-prefixes.full=prefixes.locate
-prefixes.file=prefixes.filename
-prefixes.path=prefixes.pathname
-function resolvers.allprefixes(separator)
- local all=table.sortedkeys(prefixes)
- if separator then
- for i=1,#all do
- all[i]=all[i]..":"
- end
- end
- return all
-end
-local function _resolve_(method,target)
- local action=prefixes[method]
- if action then
- return action(target)
- else
- return method..":"..target
- end
-end
-local resolved,abstract={},{}
-function resolvers.resetresolve(str)
- resolved,abstract={},{}
-end
-local pattern=Cs((C(R("az")^2)*P(":")*C((1-S(" \"\';,"))^1)/_resolve_+P(1))^0)
-local prefix=C(R("az")^2)*P(":")
-local target=C((1-S(" \"\';,"))^1)
-local notarget=(#S(";,")+P(-1))*Cc("")
-local pattern=Cs(((prefix*(target+notarget))/_resolve_+P(1))^0)
-local function resolve(str)
- if type(str)=="table" then
- local t={}
- for i=1,#str do
- t[i]=resolve(str[i])
- end
- return t
+local function jobpath()
+ local path=resolvers.stackpath()
+ if not path or path=="" then
+ return "."
else
- local res=resolved[str]
- if not res then
- res=lpegmatch(pattern,str)
- resolved[str]=res
- abstract[res]=str
- end
- return res
- end
-end
-local function unresolve(str)
- return abstract[str] or str
-end
-resolvers.resolve=resolve
-resolvers.unresolve=unresolve
-if type(os.uname)=="function" then
- for k,v in next,os.uname() do
- if not prefixes[k] then
- prefixes[k]=function() return v end
- end
- end
-end
-if os.type=="unix" then
- local pattern
- local function makepattern(t,k,v)
- if t then
- rawset(t,k,v)
- end
- local colon=P(":")
- for k,v in table.sortedpairs(prefixes) do
- if p then
- p=P(k)+p
- else
- p=P(k)
- end
- end
- pattern=Cs((p*colon+colon/";"+P(1))^0)
- end
- makepattern()
- getmetatable(prefixes).__newindex=makepattern
- function resolvers.repath(str)
- return lpegmatch(pattern,str)
- end
-else
- function resolvers.repath(str)
- return str
+ return path
end
end
+resolvers.toppath=toppath
+resolvers.jobpath=jobpath
+prefixes.toppath=function(str) return cleanpath(joinpath(toppath(),str)) end
+prefixes.jobpath=function(str) return cleanpath(joinpath(jobpath(),str)) end
+resolvers.setdynamic("toppath")
+resolvers.setdynamic("jobpath")
+prefixes.jobfile=prefixes.jobpath
+resolvers.setdynamic("jobfile")
end -- of closure
@@ -15348,7 +16196,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-fil"] = package.loaded["data-fil"] or true
--- original size: 3801, stripped down to: 3231
+-- original size: 3863, stripped down to: 3310
if not modules then modules={} end modules ['data-fil']={
version=1.001,
@@ -15360,30 +16208,31 @@ if not modules then modules={} end modules ['data-fil']={
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 resolveprefix=resolvers.resolve
local finders,openers,loaders,savers=resolvers.finders,resolvers.openers,resolvers.loaders,resolvers.savers
local locators,hashers,generators,concatinators=resolvers.locators,resolvers.hashers,resolvers.generators,resolvers.concatinators
local checkgarbage=utilities.garbagecollector and utilities.garbagecollector.check
function locators.file(specification)
- local name=specification.filename
- local realname=resolvers.resolve(name)
+ local filename=specification.filename
+ local realname=resolveprefix(filename)
if realname and realname~='' and lfs.isdir(realname) then
if trace_locating then
- report_files("file locator %a found as %a",name,realname)
+ report_files("file locator %a found as %a",filename,realname)
end
- resolvers.appendhash('file',name,true)
+ resolvers.appendhash('file',filename,true)
elseif trace_locating then
- report_files("file locator %a not found",name)
+ report_files("file locator %a not found",filename)
end
end
function hashers.file(specification)
- local name=specification.filename
- local content=caches.loadcontent(name,'files')
- resolvers.registerfilehash(name,content,content==nil)
+ local pathname=specification.filename
+ local content=caches.loadcontent(pathname,'files')
+ resolvers.registerfilehash(pathname,content,content==nil)
end
function generators.file(specification)
- local path=specification.filename
- local content=resolvers.scanfiles(path,false,true)
- resolvers.registerfilehash(path,content,true)
+ local pathname=specification.filename
+ local content=resolvers.scanfiles(pathname,false,true)
+ resolvers.registerfilehash(pathname,content,true)
end
concatinators.file=file.join
function finders.file(specification,filetype)
@@ -15665,7 +16514,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-zip"] = package.loaded["data-zip"] or true
--- original size: 8489, stripped down to: 6757
+-- original size: 8772, stripped down to: 6841
if not modules then modules={} end modules ['data-zip']={
version=1.001,
@@ -15684,16 +16533,6 @@ zip.archives=zip.archives or {}
local archives=zip.archives
zip.registeredfiles=zip.registeredfiles or {}
local registeredfiles=zip.registeredfiles
-local limited=false
-directives.register("system.inputmode",function(v)
- if not limited then
- local i_limiter=io.i_limiter(v)
- if i_limiter then
- zip.open=i_limiter.protect(zip.open)
- limited=true
- end
- end
-end)
local function validzip(str)
if not find(str,"^zip://") then
return "zip:///"..str
@@ -15708,7 +16547,7 @@ function zip.openarchive(name)
local arch=archives[name]
if not arch then
local full=resolvers.findfile(name) or ""
- arch=(full~="" and zip.open(full)) or false
+ arch=full~="" and zip.open(full) or false
archives[name]=arch
end
return arch
@@ -15867,31 +16706,42 @@ function resolvers.usezipfile(archive)
end
end
function resolvers.registerzipfile(z,tree)
- local files,filter={},""
- if tree=="" then
- filter="^(.+)/(.-)$"
- else
- filter=format("^%s/(.+)/(.-)$",tree)
- end
+ local names={}
+ local files={}
+ local remap={}
+ local n=0
+ local filter=tree=="" and "^(.+)/(.-)$" or format("^%s/(.+)/(.-)$",tree)
+ local register=resolvers.registerfile
if trace_locating then
report_zip("registering: using filter %a",filter)
end
- local register,n=resolvers.registerfile,0
for i in z:files() do
- local path,name=match(i.filename,filter)
- if path then
- if name and name~='' then
- register(files,name,path)
- n=n+1
- else
+ local filename=i.filename
+ local path,name=match(filename,filter)
+ if not path then
+ n=n+1
+ register(names,filename,"")
+ local usedname=lower(filename)
+ files[usedname]=""
+ if usedname~=filename then
+ remap[usedname]=filename
end
- else
- register(files,i.filename,'')
+ elseif name and name~="" then
n=n+1
+ register(names,name,path)
+ local usedname=lower(name)
+ files[usedname]=path
+ if usedname~=name then
+ remap[usedname]=name
+ end
+ else
end
end
report_zip("registering: %s files registered",n)
- return files
+ return {
+ files=files,
+ remap=remap,
+ }
end
@@ -15901,7 +16751,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tre"] = package.loaded["data-tre"] or true
--- original size: 2508, stripped down to: 2074
+-- original size: 8479, stripped down to: 5580
if not modules then modules={} end modules ['data-tre']={
version=1.001,
@@ -15910,42 +16760,64 @@ if not modules then modules={} end modules ['data-tre']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local find,gsub,format=string.find,string.gsub,string.format
+local find,gsub,lower=string.find,string.gsub,string.lower
+local basename,dirname,joinname=file.basename,file.dirname,file .join
+local globdir,isdir,isfile=dir.glob,lfs.isdir,lfs.isfile
+local P,lpegmatch=lpeg.P,lpeg.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_trees=logs.reporter("resolvers","trees")
local resolvers=resolvers
-local done,found,notfound={},{},resolvers.finders.notfound
-function resolvers.finders.tree(specification)
+local resolveprefix=resolvers.resolve
+local notfound=resolvers.finders.notfound
+local lookup=resolvers.get_from_content
+local collectors={}
+local found={}
+function resolvers.finders.tree(specification)
local spec=specification.filename
- local fnd=found[spec]
- if fnd==nil then
+ local okay=found[spec]
+ if okay==nil then
if spec~="" then
- local path,name=file.dirname(spec),file.basename(spec)
- if path=="" then path="." end
- local hash=done[path]
- if not hash then
- local pattern=path.."/*"
- hash=dir.glob(pattern)
- done[path]=hash
+ local path=dirname(spec)
+ local name=basename(spec)
+ if path=="" then
+ path="."
+ end
+ local names=collectors[path]
+ if not names then
+ local pattern=find(path,"/%*+$") and path or (path.."/*")
+ names=globdir(pattern)
+ collectors[path]=names
end
local pattern="/"..gsub(name,"([%.%-%+])","%%%1").."$"
- for k=1,#hash do
- local v=hash[k]
- if find(v,pattern) then
- found[spec]=v
- return v
+ for i=1,#names do
+ local fullname=names[i]
+ if find(fullname,pattern) then
+ found[spec]=fullname
+ return fullname
+ end
+ end
+ local pattern=lower(pattern)
+ for i=1,#names do
+ local fullname=lower(names[i])
+ if find(fullname,pattern) then
+ if isfile(fullname) then
+ found[spec]=fullname
+ return fullname
+ else
+ break
+ end
end
end
end
- fnd=notfound()
- found[spec]=fnd
+ okay=notfound()
+ found[spec]=okay
end
- return fnd
+ return okay
end
function resolvers.locators.tree(specification)
local name=specification.filename
- local realname=resolvers.resolve(name)
- if realname and realname~='' and lfs.isdir(realname) then
+ local realname=resolveprefix(name)
+ if realname and realname~='' and isdir(realname) then
if trace_locating then
report_trees("locator %a found",realname)
end
@@ -15956,16 +16828,110 @@ function resolvers.locators.tree(specification)
end
function resolvers.hashers.tree(specification)
local name=specification.filename
- if trace_locating then
- report_trees("analysing %a",name)
- end
+ report_trees("analyzing %a",name)
resolvers.methodhandler("hashers",name)
resolvers.generators.file(specification)
end
-resolvers.concatinators.tree=resolvers.concatinators.file
-resolvers.generators.tree=resolvers.generators.file
-resolvers.openers.tree=resolvers.openers.file
-resolvers.loaders.tree=resolvers.loaders.file
+local collectors={}
+local splitter=lpeg.splitat("/**/")
+local stripper=lpeg.replacer { [P("/")*P("*")^1*P(-1)]="" }
+table.setmetatableindex(collectors,function(t,k)
+ local rootname=lpegmatch(stripper,k)
+ local dataname=joinname(rootname,"dirlist")
+ local content=caches.loadcontent(dataname,"files",dataname)
+ if not content then
+ content=resolvers.scanfiles(rootname,nil,nil,false,true)
+ caches.savecontent(dataname,"files",content,dataname)
+ end
+ t[k]=content
+ return content
+end)
+local function checked(root,p,n)
+ if p then
+ if type(p)=="table" then
+ for i=1,#p do
+ local fullname=joinname(root,p[i],n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ else
+ local fullname=joinname(root,p,n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ end
+ return notfound()
+end
+local function resolve(specification)
+ local filename=specification.filename
+ if filename~="" then
+ local root,rest=lpegmatch(splitter,filename)
+ if root and rest then
+ local path,name=dirname(rest),basename(rest)
+ if name~=rest then
+ local content=collectors[root]
+ local p,n=lookup(content,name)
+ if not p then
+ return notfound()
+ end
+ local pattern=".*/"..path.."$"
+ local istable=type(p)=="table"
+ if istable then
+ for i=1,#p do
+ local pi=p[i]
+ if pi==path or find(pi,pattern) then
+ local fullname=joinname(root,pi,n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ end
+ elseif p==path or find(p,pattern) then
+ local fullname=joinname(root,p,n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ local queries=specification.queries
+ if queries and queries.option=="fileonly" then
+ return checked(root,p,n)
+ else
+ return notfound()
+ end
+ end
+ end
+ local path,name=dirname(filename),basename(filename)
+ local root=lpegmatch(stripper,path)
+ local content=collectors[path]
+ local p,n=lookup(content,name)
+ if p then
+ return checked(root,p,n)
+ end
+ end
+ return notfound()
+end
+resolvers.finders .dirlist=resolve
+resolvers.locators .dirlist=resolvers.locators .tree
+resolvers.hashers .dirlist=resolvers.hashers .tree
+resolvers.generators.dirlist=resolvers.generators.file
+resolvers.openers .dirlist=resolvers.openers .file
+resolvers.loaders .dirlist=resolvers.loaders .file
+function resolvers.finders.dirfile(specification)
+ local queries=specification.queries
+ if queries then
+ queries.option="fileonly"
+ else
+ specification.queries={ option="fileonly" }
+ end
+ return resolve(specification)
+end
+resolvers.locators .dirfile=resolvers.locators .dirlist
+resolvers.hashers .dirfile=resolvers.hashers .dirlist
+resolvers.generators.dirfile=resolvers.generators.dirlist
+resolvers.openers .dirfile=resolvers.openers .dirlist
+resolvers.loaders .dirfile=resolvers.loaders .dirlist
end -- of closure
@@ -15974,7 +16940,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-sch"] = package.loaded["data-sch"] or true
--- original size: 6213, stripped down to: 5160
+-- original size: 6569, stripped down to: 5304
if not modules then modules={} end modules ['data-sch']={
version=1.001,
@@ -16000,8 +16966,13 @@ directives.register("schemes.threshold",function(v) threshold=tonumber(v) or thr
function cleaners.none(specification)
return specification.original
end
-function cleaners.strip(specification)
- return (gsub(specification.original,"[^%a%d%.]+","-"))
+function cleaners.strip(specification)
+ local path,name=file.splitbase(specification.original)
+ if path=="" then
+ return (gsub(name,"[^%a%d%.]+","-"))
+ else
+ return (gsub((gsub(path,"%.","-").."-"..name),"[^%a%d%.]+","-"))
+ end
end
function cleaners.md5(specification)
return file.addsuffix(md5.hex(specification.original),file.suffix(specification.path))
@@ -16018,7 +16989,7 @@ end
local cached,loaded,reused,thresholds,handlers={},{},{},{},{}
local function runcurl(name,cachename)
local command="curl --silent --insecure --create-dirs --output "..cachename.." "..name
- os.spawn(command)
+ os.execute(command)
end
local function fetch(specification)
local original=specification.original
@@ -16150,7 +17121,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-lua"] = package.loaded["data-lua"] or true
--- original size: 4237, stripped down to: 3177
+-- original size: 4313, stripped down to: 3227
if not modules then modules={} end modules ['data-lua']={
version=1.001,
@@ -16159,7 +17130,7 @@ if not modules then modules={} end modules ['data-lua']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local resolvers,package=resolvers,package
+local package,lpeg=package,lpeg
local gsub=string.gsub
local concat=table.concat
local addsuffix=file.addsuffix
@@ -16170,9 +17141,11 @@ local luaformats={ 'TEXINPUTS','LUAINPUTS' }
local libformats={ 'CLUAINPUTS' }
local helpers=package.helpers or {}
local methods=helpers.methods or {}
+local resolvers=resolvers
+local resolveprefix=resolvers.resolve
+helpers.report=logs.reporter("resolvers","libraries")
trackers.register("resolvers.libraries",function(v) helpers.trace=v end)
trackers.register("resolvers.locating",function(v) helpers.trace=v end)
-helpers.report=logs.reporter("resolvers","libraries")
helpers.sequence={
"already loaded",
"preload table",
@@ -16187,7 +17160,7 @@ helpers.sequence={
}
local pattern=Cs(P("!")^0/""*(P("/")*P(-1)/"/"+P("/")^1/"/"+1)^0)
function helpers.cleanpath(path)
- return resolvers.resolve(lpegmatch(pattern,path))
+ return resolveprefix(lpegmatch(pattern,path))
end
local loadedaslib=helpers.loadedaslib
local getextraluapaths=package.extraluapaths
@@ -16324,7 +17297,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tmf"] = package.loaded["data-tmf"] or true
--- original size: 2600, stripped down to: 1627
+-- original size: 2601, stripped down to: 1627
if not modules then modules={} end modules ['data-tmf']={
version=1.001,
@@ -16380,7 +17353,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-lst"] = package.loaded["data-lst"] or true
--- original size: 2654, stripped down to: 2301
+-- original size: 2734, stripped down to: 2354
if not modules then modules={} end modules ['data-lst']={
version=1.001,
@@ -16389,10 +17362,13 @@ if not modules then modules={} end modules ['data-lst']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local find,concat,upper,format=string.find,table.concat,string.upper,string.format
+local rawget,type,next=rawget,type,next
+local find,concat,upper=string.find,table.concat,string.upper
local fastcopy,sortedpairs=table.fastcopy,table.sortedpairs
-resolvers.listers=resolvers.listers or {}
local resolvers=resolvers
+local listers=resolvers.listers or {}
+resolvers.listers=listers
+local resolveprefix=resolvers.resolve
local report_lists=logs.reporter("resolvers","lists")
local function tabstr(str)
if type(str)=='table' then
@@ -16401,7 +17377,7 @@ local function tabstr(str)
return str
end
end
-function resolvers.listers.variables(pattern)
+function listers.variables(pattern)
local instance=resolvers.instance
local environment=instance.environment
local variables=instance.variables
@@ -16422,10 +17398,10 @@ function resolvers.listers.variables(pattern)
for key,value in sortedpairs(configured) do
if key~="" and (pattern=="" or find(upper(key),pattern)) then
report_lists(key)
- report_lists(" env: %s",tabstr(rawget(environment,key)) or "unset")
- report_lists(" var: %s",tabstr(configured[key]) or "unset")
- report_lists(" exp: %s",tabstr(expansions[key]) or "unset")
- report_lists(" res: %s",tabstr(resolvers.resolve(expansions[key])) or "unset")
+ report_lists(" env: %s",tabstr(rawget(environment,key)) or "unset")
+ report_lists(" var: %s",tabstr(configured[key]) or "unset")
+ report_lists(" exp: %s",tabstr(expansions[key]) or "unset")
+ report_lists(" res: %s",tabstr(resolveprefix(expansions[key])) or "unset")
end
end
instance.environment=fastcopy(env)
@@ -16433,15 +17409,15 @@ function resolvers.listers.variables(pattern)
instance.expansions=fastcopy(exp)
end
local report_resolved=logs.reporter("system","resolved")
-function resolvers.listers.configurations()
+function listers.configurations()
local configurations=resolvers.instance.specification
for i=1,#configurations do
- report_resolved("file : %s",resolvers.resolve(configurations[i]))
+ report_resolved("file : %s",resolveprefix(configurations[i]))
end
report_resolved("")
local list=resolvers.expandedpathfromlist(resolvers.splitpath(resolvers.luacnfspec))
for i=1,#list do
- local li=resolvers.resolve(list[i])
+ local li=resolveprefix(list[i])
if lfs.isdir(li) then
report_resolved("path - %s",li)
else
@@ -16746,7 +17722,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["luat-fmt"] = package.loaded["luat-fmt"] or true
--- original size: 5951, stripped down to: 4922
+-- original size: 5955, stripped down to: 4926
if not modules then modules={} end modules ['luat-fmt']={
version=1.001,
@@ -16834,7 +17810,7 @@ function environment.make_format(name)
end
local command=format("%s --ini %s --lua=%s %s %sdump",engine,primaryflags(),quoted(usedluastub),quoted(fulltexsourcename),os.platform=="unix" and "\\\\" or "\\")
report_format("running command: %s\n",command)
- os.spawn(command)
+ os.execute(command)
local pattern=file.removesuffix(file.basename(usedluastub)).."-*.mem"
local mp=dir.glob(pattern)
if mp then
@@ -16869,7 +17845,7 @@ function environment.run_format(name,data,more)
else
local command=format("%s %s --fmt=%s --lua=%s %s %s",engine,primaryflags(),quoted(barename),quoted(luaname),quoted(data),more~="" and quoted(more) or "")
report_format("running command: %s",command)
- os.spawn(command)
+ os.execute(command)
end
end
end
@@ -16880,8 +17856,8 @@ end -- of closure
-- used libraries : l-lua.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-mrg.lua util-tpl.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.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-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
-- skipped libraries : -
--- original bytes : 695180
--- stripped bytes : 246794
+-- original bytes : 739251
+-- stripped bytes : 264497
-- end library merge
@@ -17107,6 +18083,7 @@ local helpinfo = [[
<category name="basic">
<subcategory>
<flag name="script"><short>run an mtx script (lua prefered method) (<ref name="noquotes"/>), no script gives list</short></flag>
+ <flag name="evaluate"><short>run code passed on the commandline (between quotes)</short></flag>
<flag name="execute"><short>run a script or program (texmfstart method) (<ref name="noquotes"/>)</short></flag>
<flag name="resolve"><short>resolve prefixed arguments</short></flag>
<flag name="ctxlua"><short>run internally (using preloaded libs)</short></flag>
@@ -17132,6 +18109,7 @@ local helpinfo = [[
<flag name="verbose"><short>give a bit more info</short></flag>
<flag name="trackers" value="list"><short>enable given trackers</short></flag>
<flag name="progname" value="str"><short>format or backend</short></flag>
+ <flag name="systeminfo" value="str"><short>show current operating system, processor, etc</short></flag>
</subcategory>
<subcategory>
<flag name="edit"><short>launch editor with found file</short></flag>
@@ -17761,6 +18739,39 @@ function runners.associate(filename)
os.launch(filename)
end
+function runners.evaluate(code,filename) -- for Luigi
+ if code == "loop" then
+ while true do
+ io.write("> ")
+ local code = io.read()
+ if code ~= "" then
+ local temp = string.match(code,"^= (.*)$")
+ if temp then
+ code = "print("..temp..")"
+ end
+ local compiled, message = loadstring(code)
+ if type(compiled) ~= "function" then
+ io.write("! " .. (message or code).."\n")
+ else
+ io.write(compiled())
+ end
+ end
+ end
+ else
+ if type(code) ~= "string" or code == "" then
+ code = filename
+ end
+ if code ~= "" then
+ local compiled, message = loadstring(code)
+ if type(compiled) ~= "function" then
+ io.write("invalid lua code: " .. (message or code))
+ return
+ end
+ io.write(compiled())
+ end
+ end
+end
+
function runners.gethelp(filename)
local url = environment.argument("url")
if url and url ~= "" then
@@ -17772,6 +18783,15 @@ function runners.gethelp(filename)
end
end
+function runners.systeminfo()
+ report("architecture : %s",os.platform or "<unset>")
+ report("operating system : %s",os.name or "<unset>")
+ report("file architecture : %s",os.type or "<unset>")
+ report("binary path : %s",os.selfdir or "<unset>")
+ report("binary suffix : %s",os.binsuffix or "<unset>")
+ report("library suffix : %s",os.libsuffix or "<unset>")
+end
+
-- this is a bit dirty ... first we store the first filename and next we
-- split the arguments so that we only see the ones meant for this script
-- ... later we will use the second half
@@ -17887,16 +18907,7 @@ end
if e_argument("ansi") then
- local formatters = string.formatters
-
- logs.setformatters {
- report_yes = formatters["%-15s | %s"],
- report_nop = formatters["%-15s |"],
- subreport_yes = formatters["%-15s | %s | %s"],
- subreport_nop = formatters["%-15s | %s |"],
- status_yes = formatters["%-15s : %s\n"],
- status_nop = formatters["%-15s :\n"],
- }
+ logs.setformatters("ansi")
local script = e_argument("script") or e_argument("scripts")
@@ -17921,6 +18932,10 @@ if e_argument("script") or e_argument("scripts") then
ok = runners.execute_ctx_script(filename)
end
+elseif e_argument("evaluate") then
+
+ runners.evaluate(e_argument("evaluate"),filename)
+
elseif e_argument("selfmerge") then
-- embed used libraries
@@ -18213,6 +19228,10 @@ elseif e_argument("exporthelp") then
runners.loadbase()
application.export(e_argument("exporthelp"),filename)
+elseif e_argument("systeminfo") then
+
+ runners.systeminfo()
+
elseif e_argument("help") or filename=='help' or filename == "" then
application.help()
diff --git a/Master/texmf-dist/tex/context/base/anch-bar.mkiv b/Master/texmf-dist/tex/context/base/anch-bar.mkiv
index 84465515548..b5df21a0797 100644
--- a/Master/texmf-dist/tex/context/base/anch-bar.mkiv
+++ b/Master/texmf-dist/tex/context/base/anch-bar.mkiv
@@ -89,7 +89,7 @@
\advance\c_anch_sidebars_level\plusone
\global\advance\c_anch_sidebars_n\plusone
\c_anch_sidebars_current\c_anch_sidebars_n\relax % relax needed
- \doifassignmentelse{#1}
+ \doifelseassignment{#1}
{\edef\currentsidebar{\the\c_anch_sidebars_level}%
\checksidebarparent
\setupcurrentsidebar[#1]}
@@ -213,7 +213,7 @@
\ifx\m_anch_marginrules_kind\empty
\anch_sidebars_start[\v!margin][]%
\else
- \doifassignmentelse\m_anch_marginrules_kind
+ \doifelseassignment\m_anch_marginrules_kind
{\anch_sidebars_start[\v!margin][#1]}%
{\anch_marginrules_check{#1}%
\anch_sidebars_start[\v!margin:#1][\c!level=#1]}%
diff --git a/Master/texmf-dist/tex/context/base/anch-bck.mkvi b/Master/texmf-dist/tex/context/base/anch-bck.mkvi
index cccf14ee438..273cf015968 100644
--- a/Master/texmf-dist/tex/context/base/anch-bck.mkvi
+++ b/Master/texmf-dist/tex/context/base/anch-bck.mkvi
@@ -20,10 +20,6 @@
\unprotect
-% we can flush 5 in one call (saved 4 lua calls) .. brrr wself .. will change
-
-\def\MPposset#1{\ctxcommand{MPposset("#1")}} % will go
-
% This might be overloaded later on:
% \defineoverlay[\v!text-2][\positionoverlay{\v!text-2}]
@@ -50,7 +46,7 @@
% tricky: we need to catch newly set! otherwise an old run can have positions
\unexpanded\def\anch_backgrounds_text_initialize
- {\ctxcommand{doifelsepositionsused()}\enableparpositions\donothing
+ {\doifelsepositionsused\enableparpositions\donothing
\global\let\anch_backgrounds_text_initialize\relax}
\appendtoks
diff --git a/Master/texmf-dist/tex/context/base/anch-pgr.lua b/Master/texmf-dist/tex/context/base/anch-pgr.lua
index c7f56a92bf9..b5c2ae6280a 100644
--- a/Master/texmf-dist/tex/context/base/anch-pgr.lua
+++ b/Master/texmf-dist/tex/context/base/anch-pgr.lua
@@ -8,8 +8,6 @@ if not modules then modules = { } end modules ['anch-pgr'] = {
-- todo: we need to clean up lists (of previous pages)
-local commands, context = commands, context
-
local format = string.format
local abs = math.abs
local concat, sort = table.concat, table.sort
@@ -19,6 +17,11 @@ local lpegmatch = lpeg.match
local jobpositions = job.positions
local formatters = string.formatters
+local commands = commands
+local context = context
+
+local implement = interfaces.implement
+
local report_graphics = logs.reporter("graphics")
local f_b_tag = formatters["b:%s"]
@@ -59,7 +62,7 @@ local function add(t,x,y,last,direction)
if x == lx and y == ly then
-- quick skip
elseif n == 1 then
--- if abs(lx-x) <= eps or abs(ly-y) <= eps then
+ -- if abs(lx-x) <= eps or abs(ly-y) <= eps then
if abs(lx-x) > eps or abs(ly-y) > eps then
t[n+1] = { x, y }
end
@@ -67,10 +70,9 @@ local function add(t,x,y,last,direction)
local tm = t[n-1]
local px = tm[1]
local py = tm[2]
-if (direction == "down" and y > ly) or (direction == "up" and y < ly) then
- -- move back from too much hang
-else
- if abs(lx-px) <= eps and abs(lx-x) <= eps then
+ if (direction == "down" and y > ly) or (direction == "up" and y < ly) then
+ -- move back from too much hang
+ elseif abs(lx-px) <= eps and abs(lx-x) <= eps then
if abs(ly-y) > eps then
tn[2] = y
end
@@ -81,7 +83,6 @@ else
elseif not last then
t[n+1] = { x, y }
end
-end
end
end
end
@@ -430,7 +431,6 @@ local function calculatemultipar(tag,obeyhang)
end
-- Obeying intermediate changes of left/rightskip makes no sense as it will
-- look bad, so we only look at the begin situation.
- --
local bn = b.n
if bn then
local bp = collected[f_p_tag(bn)]
@@ -555,7 +555,7 @@ f_template_b = formatters[f_template_b]
f_template_c = formatters[f_template_c]
f_template_d = formatters[f_template_d]
-function backgrounds.fetchmultipar(n,anchor,page,obeyhang)
+local function fetchmultipar(n,anchor,page,obeyhang)
local data = pbg[n]
if not data then
data = calculatemultipar(n,obeyhang)
@@ -599,17 +599,25 @@ function backgrounds.fetchmultipar(n,anchor,page,obeyhang)
return f_template_a(0,"origin",0,0,0)
end
+backgrounds.fetchmultipar = fetchmultipar
+
backgrounds.point = f_point
backgrounds.pair = f_pair
backgrounds.path = f_path
-function commands.fetchmultipar(n,anchor,page)
- context(backgrounds.fetchmultipar(n,anchor,page))
-end
+-- n anchor page
-function commands.fetchmultishape(n,anchor,page)
- context(backgrounds.fetchmultipar(n,anchor,page,true))
-end
+implement {
+ name = "fetchmultipar",
+ actions = { fetchmultipar, context },
+ arguments = { "string", "string", "integer" }
+}
+
+implement {
+ name = "fetchmultishape",
+ actions = { fetchmultipar, context },
+ arguments = { "string", "string", "integer", true }
+}
local f_template_a = [[
path posboxes[], posregions[] ;
@@ -628,67 +636,62 @@ posregions[%s] := (%p,%p)--(%p,%p)--(%p,%p)--(%p,%p)--cycle ;
f_template_a = formatters[f_template_a]
f_template_b = formatters[f_template_b]
-function commands.fetchposboxes(tags,anchor,page) -- no caching (yet) / todo: anchor, page
- local collected = jobpositions.collected
- if type(tags) == "string" then
- tags = utilities.parsers.settings_to_array(tags)
- end
- local list, nofboxes = { }, 0
- for i=1,#tags do
- local tag= tags[i]
- local c = collected[tag]
- if c then
- local r = c.r
- if r then
- r = collected[r]
+implement {
+ name = "fetchposboxes",
+ arguments = { "string", "string", "integer" },
+ actions = function(tags,anchor,page) -- no caching (yet) / todo: anchor, page
+ local collected = jobpositions.collected
+ if type(tags) == "string" then
+ tags = utilities.parsers.settings_to_array(tags)
+ end
+ local list, nofboxes = { }, 0
+ for i=1,#tags do
+ local tag= tags[i]
+ local c = collected[tag]
+ if c then
+ local r = c.r
if r then
- local rx, ry, rw, rh, rd = r.x, r.y, r.w, r.h, r.d
- local cx = c.x - rx
- local cy = c.y - ry
- local cw = cx + c.w
- local ch = cy + c.h
- local cd = cy - c.d
- nofboxes = nofboxes + 1
- list[nofboxes] = f_template_b(
- nofboxes,c.p,
- nofboxes,cx,ch,cw,ch,cw,cd,cx,cd,
- nofboxes,0,rh,rw,rh,rw,rd,0,rd
- )
+ r = collected[r]
+ if r then
+ local rx, ry, rw, rh, rd = r.x, r.y, r.w, r.h, r.d
+ local cx = c.x - rx
+ local cy = c.y - ry
+ local cw = cx + c.w
+ local ch = cy + c.h
+ local cd = cy - c.d
+ nofboxes = nofboxes + 1
+ list[nofboxes] = f_template_b(
+ nofboxes,c.p,
+ nofboxes,cx,ch,cw,ch,cw,cd,cx,cd,
+ nofboxes,0,rh,rw,rh,rw,rd,0,rd
+ )
+ end
end
+ else
+ print("\n missing",tag)
end
- else
- print("\n missing",tag)
end
+ context(f_template_a(nofboxes,list))
end
- context(f_template_a(nofboxes,list))
-end
+}
local doifelse = commands.doifelse
-function commands.doifelsemultipar(n,page,obeyhang)
- local data = pbg[n]
- if not data then
- data = calculatemultipar(n,obeyhang)
- pbg[n] = data
- end
- if page then
- doifelse(data and data[page] and true)
- else
- doifelse(data and next(data) and true)
- end
-end
-
-function commands.doifelserangeonpage(first,last,page)
- local collected = jobpositions.collected
- local f = collected[first]
- if not f or f.p == true then
- doifelse(false)
- return
- end
- local l = collected[last]
- if not l or l.p == true then
- doifelse(false)
- return
+implement {
+ name = "doifelserangeonpage",
+ arguments = { "string", "string", "integer" },
+ actions = function(first,last,page)
+ local collected = jobpositions.collected
+ local f = collected[first]
+ if not f or f.p == true then
+ doifelse(false)
+ return
+ end
+ local l = collected[last]
+ if not l or l.p == true then
+ doifelse(false)
+ return
+ end
+ doifelse(page >= f.p and page <= l.p)
end
- doifelse(page >= f.p and page <= l.p)
-end
+}
diff --git a/Master/texmf-dist/tex/context/base/anch-pgr.mkiv b/Master/texmf-dist/tex/context/base/anch-pgr.mkiv
index c18a1b6699a..56ff656d96d 100644
--- a/Master/texmf-dist/tex/context/base/anch-pgr.mkiv
+++ b/Master/texmf-dist/tex/context/base/anch-pgr.mkiv
@@ -43,13 +43,15 @@
\expandafter\gobbleoneargument
\fi}
-\unexpanded\def\doifpositionactionelse#1%
+\unexpanded\def\doifelsepositionaction#1%
{\ifcsname\??positionaction#1\endcsname
\expandafter\firstoftwoarguments
\else
\expandafter\secondoftwoarguments
\fi}
+\let\doifpositionactionelse\doifelsepositionaction
+
\unexpanded\def\dopositionaction#1%
{\edef\currentpositionaction{#1}%
\ifcsname\??positionaction\currentpositionaction\endcsname
@@ -57,7 +59,7 @@
\fi}
\def\anch_positions_action_indeed
- {\doifpositionelse\currentpositionaction
+ {\doifelseposition\currentpositionaction
\anch_positions_action_indeed_yes
\anch_positions_action_indeed_nop}
@@ -127,23 +129,26 @@
%D the head and tail anchors from this one. We set these
%D anchors before and after each page.
+\newdimen\c_anch_page_width
+\newdimen\c_anch_page_height
+
\unexpanded\def\anch_positions_register_page#1% this one is flushed first ! ... can't we avoid this one
{\ifpositioning\ifcase\realpageno\or
- \ifdim\printpaperheight=\paperheight
- \ifdim\printpaperwidth=\paperwidth
- % not needed,
+ \ifdim\c_anch_page_height=\paperheight
+ \ifdim\c_anch_page_width=\paperwidth
+ % no change
\else
- \anch_positions_register_page_indeed{#1}%
+ \c_anch_page_width \paperwidth
+ \c_anch_page_height\paperheight
+ \anch_make_page_box{#1}% \ifvbox#1\setbox#1\hbox{\box#1}\fi
\fi
\else
- \anch_positions_register_page_indeed{#1}%
+ \c_anch_page_width \paperwidth
+ \c_anch_page_height\paperheight
+ \anch_make_page_box{#1}% \ifvbox#1\setbox#1\hbox{\box#1}\fi
\fi
\fi\fi}
-\def\anch_positions_register_page_indeed#1% maybe like text
- {\ifvbox#1\setbox#1\hbox{\box#1}\fi
- \anch_make_page_box{#1}}
-
\unexpanded\def\anch_positions_place_anchors
{\ifpositioning
\anch_positions_place_anchors_yes
@@ -251,17 +256,17 @@
\def\MPoverlayanchor#1{\MPpos\MPanchorid}
\def\anch_positions_overlay_compose
- {\vbox to \overlayheight
+ {\vbox to \d_overlay_height
{%\writestatus{!!!}{\currentpositionoverlay/\MPanchoridentifier/\MPanchornumber}%
\edef\MPanchorid{\currentpositionoverlay::\MPanchoridentifier:\MPanchornumber}% realpageno
% \edef\MPanchor##1{\MPpos\MPanchorid}%
\let\MPanchor\MPoverlayanchor % no need to fetch it already, seldom used
\the\everyinsertpositionaction
\copyposition{\currentpositionoverlay::\MPanchoridentifier}\MPanchorid
- \setbox\scratchbox\hbox to \overlaywidth{\dopositionaction{\currentpositionoverlay::\MPanchoridentifier}\hss}%
- \ht\scratchbox\overlayheight
+ \setbox\scratchbox\hbox to \d_overlay_width{\dopositionaction{\currentpositionoverlay::\MPanchoridentifier}\hss}%
+ \ht\scratchbox\d_overlay_height
\dp\scratchbox\zeropoint
- \ctxcommand{markregionbox(\number\scratchbox,"\MPanchorid")}% needs an hbox
+ \anch_mark_tagged_box\scratchbox\MPanchorid % needs an hbox
\box\scratchbox
\vfill}}
@@ -284,13 +289,13 @@
\endgroup}
\def\anch_positions_region_overlay_compose
- {\vbox to \overlayheight
+ {\vbox to \d_overlay_height
{\let\MPanchorid\currentpositionregion
\let\MPanchor\MPoverlayanchor % no need to fetch it already, seldom used
\the\everyinsertpositionaction
\copyposition{\currentpositionoverlay::\MPanchoridentifier}\MPanchorid
- \setbox\scratchbox\hbox to \overlaywidth{\dopositionaction{\currentpositionoverlay::\MPanchoridentifier}\hss}%
- \ht\scratchbox\overlayheight
+ \setbox\scratchbox\hbox to \d_overlay_width{\dopositionaction{\currentpositionoverlay::\MPanchoridentifier}\hss}%
+ \ht\scratchbox\d_overlay_height
\dp\scratchbox\zeropoint
\box\scratchbox
\vfill}}
@@ -475,7 +480,7 @@
{\handlepositionaction\anch_positions_meta_graphic_handle_range_indeed\with{#1}{#2}{#3}{#4}\on{#2}}
\def\anch_positions_meta_graphic_insert_range#1#2#3#4% pos pos tag setups
- {\ctxcommand{doifelserangeonpage("#1","#2",\number\realpageno)}%
+ {\clf_doifelserangeonpage{#1}{#2}\realpageno
{\def\currentposition{#1}%
\MPpositiongraphic{#3}{#4}}%
{}}
@@ -497,8 +502,8 @@
% Helpers:
-\def\MPgetposboxes #1#2{\ctxcommand{fetchposboxes("#1","#2",\the\realpageno)}}
-\def\MPgetmultipars #1#2{\ctxcommand{fetchmultipar("#1","#2",\the\realpageno)}}
-\def\MPgetmultishapes#1#2{\ctxcommand{fetchmultishape("#1","#2",\the\realpageno)}}
+\def\MPgetposboxes #1#2{\clf_fetchposboxes {#1}{#2}\realpageno}
+\def\MPgetmultipars #1#2{\clf_fetchmultipar {#1}{#2}\realpageno}
+\def\MPgetmultishapes#1#2{\clf_fetchmultishape{#1}{#2}\realpageno}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/anch-pos.lua b/Master/texmf-dist/tex/context/base/anch-pos.lua
index c2b62bae7d4..77e36e85ece 100644
--- a/Master/texmf-dist/tex/context/base/anch-pos.lua
+++ b/Master/texmf-dist/tex/context/base/anch-pos.lua
@@ -21,8 +21,6 @@ more efficient.</p>
-- maybe replace texsp by our own converter (stay at the lua end)
-- eventually mp will have large numbers so we can use sp there too
-local commands, context = commands, context
-
local tostring, next, rawget, setmetatable = tostring, next, rawget, setmetatable
local sort = table.sort
local format, gmatch, match = string.format, string.gmatch, string.match
@@ -30,12 +28,24 @@ local rawget = rawget
local lpegmatch = lpeg.match
local insert, remove = table.insert, table.remove
local allocate, mark = utilities.storage.allocate, utilities.storage.mark
-local texsp = tex.sp
------ texsp = string.todimen -- because we cache this is much faster but no rounding
+local scanners = tokens.scanners
+local scanstring = scanners.string
+local scaninteger = scanners.integer
+local scandimen = scanners.dimen
+
+local compilescanner = tokens.compile
+local scanners = interfaces.scanners
+
+local commands = commands
+local context = context
+
+local tex = tex
local texgetcount = tex.getcount
local texsetcount = tex.setcount
local texget = tex.get
+local texsp = tex.sp
+----- texsp = string.todimen -- because we cache this is much faster but no rounding
local pdf = pdf -- h and v are variables
@@ -118,11 +128,28 @@ local nofusedregions = 0
local nofmissingregions = 0
local nofregular = 0
+jobpositions.used = false
+
-- todo: register subsets and count them indepently
local function initializer()
tobesaved = jobpositions.tobesaved
collected = jobpositions.collected
+ -- add sparse regions
+ local pages = structures.pages.collected
+ if pages then
+ local last = nil
+ for p=1,#pages do
+ local region = "page:" .. p
+ local data = collected[region]
+ if data then
+ last = data
+ last.p = nil -- no need for a page
+ elseif last then
+ collected[region] = last
+ end
+ end
+ end
-- enhance regions with paragraphs
for tag, data in next, collected do
local region = data.r
@@ -162,6 +189,7 @@ local function initializer()
end
-- so, we can be sparse and don't need 'or 0' code
end
+ jobpositions.used = next(collected)
end
job.register('job.positions.collected', tobesaved, initializer)
@@ -259,9 +287,15 @@ local function enhance(data)
return data
end
-local function set(name,index,val)
+-- analyze some files (with lots if margindata) and then when one key optionally
+-- use that one instead of a table (so, a 3rd / 4th argument: key, e.g. "x")
+
+local function set(name,index,val) -- ,key
local data = enhance(val or index)
if val then
+-- if data[key] and not next(next(data)) then
+-- data = data[key]
+-- end
container = tobesaved[name]
if not container then
tobesaved[name] = {
@@ -289,7 +323,26 @@ jobpositions.setall = setall
jobpositions.set = set
jobpositions.get = get
-commands.setpos = setall
+-- scanners.setpos = setall
+
+-- trackers.enable("tokens.compi*")
+
+-- something weird: the compiler fails us here
+
+scanners.dosaveposition = compilescanner {
+ actions = setall, -- name p x y
+ arguments = { "string", "integer", "dimen", "dimen" }
+}
+
+scanners.dosavepositionwhd = compilescanner { -- somehow fails
+ actions = setall, -- name p x y w h d
+ arguments = { "string", "integer", "dimen", "dimen", "dimen", "dimen", "dimen" }
+}
+
+scanners.dosavepositionplus = compilescanner {
+ actions = setall, -- name p x y w h d extra
+ arguments = { "string", "integer", "dimen", "dimen", "dimen", "dimen", "dimen", "string" }
+}
-- will become private table (could also become attribute driven but too nasty
-- as attributes can bleed e.g. in margin stuff)
@@ -318,18 +371,26 @@ function jobpositions.e_col(tag)
column = columns[#columns]
end
-function commands.bcolumn(tag,register) -- name will change
+scanners.bposcolumn = function() -- tag
+ local tag = scanstring()
insert(columns,tag)
column = tag
- if register then
- context(new_latelua_node(f_b_column(tag)))
- end
end
-function commands.ecolumn(register) -- name will change
- if register then
- context(new_latelua_node(f_e_column()))
- end
+scanners.bposcolumnregistered = function() -- tag
+ local tag = scanstring()
+ insert(columns,tag)
+ column = tag
+ context(new_latelua_node(f_b_column(tag)))
+end
+
+scanners.eposcolumn = function()
+ remove(columns)
+ column = columns[#columns]
+end
+
+scanners.eposcolumnregistered = function()
+ context(new_latelua_node(f_e_column()))
remove(columns)
column = columns[#columns]
end
@@ -355,7 +416,7 @@ function jobpositions.e_region(correct)
region = regions[#regions]
end
-function jobpositions.markregionbox(n,tag,correct)
+local function setregionbox(n,tag)
if not tag or tag == "" then
nofregions = nofregions + 1
tag = f_region(nofregions)
@@ -372,6 +433,11 @@ function jobpositions.markregionbox(n,tag,correct)
h = h ~= 0 and h or nil,
d = d ~= 0 and d or nil,
}
+ return tag, box
+end
+
+local function markregionbox(n,tag,correct)
+ local tag, box = setregionbox(n,tag)
local push = new_latelua(f_b_region(tag))
local pop = new_latelua(f_e_region(tostring(correct))) -- todo: check if tostring is needed with formatter
-- maybe we should construct a hbox first (needs experimenting) so that we can avoid some at the tex end
@@ -389,18 +455,22 @@ function jobpositions.markregionbox(n,tag,correct)
setfield(box,"list",push)
end
+jobpositions.markregionbox = markregionbox
+jobpositions.setregionbox = setregionbox
+
function jobpositions.enhance(name)
enhance(tobesaved[name])
end
-function commands.pos(name,t)
- tobesaved[name] = t
- context(new_latelua_node(f_enhance(name)))
-end
+-- scanners.pos = function(name,t) -- name t
+-- local name = scanstring()
+-- tobesaved[name] = scanstring()
+-- context(new_latelua_node(f_enhance(name)))
+-- end
local nofparagraphs = 0
-function commands.parpos() -- todo: relate to localpar (so this is an intermediate variant)
+scanners.parpos = function() -- todo: relate to localpar (so this is an intermediate variant)
nofparagraphs = nofparagraphs + 1
texsetcount("global","c_anch_positions_paragraph",nofparagraphs)
local strutbox = getbox("strutbox")
@@ -443,7 +513,8 @@ function commands.parpos() -- todo: relate to localpar (so this is an intermedia
context(new_latelua_node(f_enhance(tag)))
end
-function commands.posxy(name) -- can node.write be used here?
+scanners.dosetposition = function() -- name
+ local name = scanstring()
tobesaved[name] = {
p = true,
c = column,
@@ -455,38 +526,58 @@ function commands.posxy(name) -- can node.write be used here?
context(new_latelua_node(f_enhance(name)))
end
-function commands.poswhd(name,w,h,d)
+scanners.dosetpositionwhd = function() -- name w h d extra
+ local name = scanstring()
tobesaved[name] = {
p = true,
c = column,
r = true,
x = true,
y = true,
- w = w,
- h = h,
- d = d,
+ w = scandimen(),
+ h = scandimen(),
+ d = scandimen(),
n = nofparagraphs > 0 and nofparagraphs or nil,
}
context(new_latelua_node(f_enhance(name)))
end
-function commands.posplus(name,w,h,d,extra)
+scanners.dosetpositionbox = function() -- name box
+ local name = scanstring()
+ local box = getbox(scaninteger())
tobesaved[name] = {
p = true,
c = column,
r = true,
x = true,
y = true,
- w = w,
- h = h,
- d = d,
+ w = getfield(box,"width"),
+ h = getfield(box,"height"),
+ d = getfield(box,"depth"),
n = nofparagraphs > 0 and nofparagraphs or nil,
- e = extra,
}
context(new_latelua_node(f_enhance(name)))
end
-function commands.posstrut(name,w,h,d)
+scanners.dosetpositionplus = function() -- name w h d extra
+ local name = scanstring()
+ tobesaved[name] = {
+ p = true,
+ c = column,
+ r = true,
+ x = true,
+ y = true,
+ w = scandimen(),
+ h = scandimen(),
+ d = scandimen(),
+ n = nofparagraphs > 0 and nofparagraphs or nil,
+ e = scanstring(),
+ }
+ context(new_latelua_node(f_enhance(name)))
+end
+
+scanners.dosetpositionstrut = function() -- name
+ local name = scanstring()
local strutbox = getbox("strutbox")
tobesaved[name] = {
p = true,
@@ -532,7 +623,17 @@ end
function jobpositions.region(id)
local jpi = collected[id]
- return jpi and jpi.r or false
+ if jpi then
+ local r = jpi.r
+ if r then
+ return r
+ end
+ local p = jpi.p
+ if p then
+ return "page:" .. p
+ end
+ end
+ return false
end
function jobpositions.column(id)
@@ -738,11 +839,23 @@ jobpositions.onsamepage = onsamepage
-- interface
-commands.replacepospxywhd = jobpositions.replace
-commands.copyposition = jobpositions.copy
+scanners.replacepospxywhd = function() -- name page x y w h d
+ collected[scanstring()] = {
+ p = scaninteger(),
+ x = scandimen(),
+ y = scandimen(),
+ w = scandimen(),
+ h = scandimen(),
+ d = scandimen(),
+ }
+end
-function commands.MPp(id)
- local jpi = collected[id]
+scanners.copyposition = function() -- target source
+ collected[scanstring()] = collected[scanstring()]
+end
+
+scanners.MPp = function() -- name
+ local jpi = collected[scanstring()]
if jpi then
local p = jpi.p
if p and p ~= true then
@@ -753,8 +866,8 @@ function commands.MPp(id)
context('0')
end
-function commands.MPx(id)
- local jpi = collected[id]
+scanners.MPx = function() -- name
+ local jpi = collected[scanstring()]
if jpi then
local x = jpi.x
if x and x ~= true and x ~= 0 then
@@ -765,8 +878,8 @@ function commands.MPx(id)
context('0pt')
end
-function commands.MPy(id)
- local jpi = collected[id]
+scanners.MPy = function() -- name
+ local jpi = collected[scanstring()]
if jpi then
local y = jpi.y
if y and y ~= true and y ~= 0 then
@@ -777,8 +890,8 @@ function commands.MPy(id)
context('0pt')
end
-function commands.MPw(id)
- local jpi = collected[id]
+scanners.MPw = function() -- name
+ local jpi = collected[scanstring()]
if jpi then
local w = jpi.w
if w and w ~= 0 then
@@ -789,8 +902,8 @@ function commands.MPw(id)
context('0pt')
end
-function commands.MPh(id)
- local jpi = collected[id]
+scanners.MPh = function() -- name
+ local jpi = collected[scanstring()]
if jpi then
local h = jpi.h
if h and h ~= 0 then
@@ -801,8 +914,8 @@ function commands.MPh(id)
context('0pt')
end
-function commands.MPd(id)
- local jpi = collected[id]
+scanners.MPd = function() -- name
+ local jpi = collected[scanstring()]
if jpi then
local d = jpi.d
if d and d ~= 0 then
@@ -813,8 +926,8 @@ function commands.MPd(id)
context('0pt')
end
-function commands.MPxy(id)
- local jpi = collected[id]
+scanners.MPxy = function() -- name
+ local jpi = collected[scanstring()]
if jpi then
context('(%.5Fpt,%.5Fpt)',
jpi.x*pt,
@@ -825,8 +938,8 @@ function commands.MPxy(id)
end
end
-function commands.MPll(id)
- local jpi = collected[id]
+scanners.MPll = function() -- name
+ local jpi = collected[scanstring()]
if jpi then
context('(%.5Fpt,%.5Fpt)',
jpi.x *pt,
@@ -837,8 +950,8 @@ function commands.MPll(id)
end
end
-function commands.MPlr(id)
- local jpi = collected[id]
+scanners.MPlr = function() -- name
+ local jpi = collected[scanstring()]
if jpi then
context('(%.5Fpt,%.5Fpt)',
(jpi.x + jpi.w)*pt,
@@ -849,8 +962,8 @@ function commands.MPlr(id)
end
end
-function commands.MPur(id)
- local jpi = collected[id]
+scanners.MPur = function() -- name
+ local jpi = collected[scanstring()]
if jpi then
context('(%.5Fpt,%.5Fpt)',
(jpi.x + jpi.w)*pt,
@@ -861,8 +974,8 @@ function commands.MPur(id)
end
end
-function commands.MPul(id)
- local jpi = collected[id]
+scanners.MPul = function() -- name
+ local jpi = collected[scanstring()]
if jpi then
context('(%.5Fpt,%.5Fpt)',
jpi.x *pt,
@@ -892,10 +1005,12 @@ local function MPpos(id)
context('0,0,0,0,0,0') -- for mp only
end
-commands.MPpos = MPpos
+scanners.MPpos = function() -- name
+ MPpos(scanstring())
+end
-function commands.MPn(id)
- local jpi = collected[id]
+scanners.MPn = function() -- name
+ local jpi = collected[scanstring()]
if jpi then
local n = jpi.n
if n then
@@ -906,25 +1021,28 @@ function commands.MPn(id)
context(0)
end
-function commands.MPc(id)
- local jpi = collected[id]
+scanners.MPc = function() -- name
+ local jpi = collected[scanstring()]
if jpi then
local c = jpi.c
- if c and p ~= true then
+ if c and c ~= true then
context(c)
return
end
end
- context(c) -- number
+ context('0') -- okay ?
end
-function commands.MPr(id)
- local jpi = collected[id]
+scanners.MPr = function() -- name
+ local jpi = collected[scanstring()]
if jpi then
local r = jpi.r
- if r and p ~= true then
+ if r and r ~= true then
context(r)
- return
+ end
+ local p = jpi.p
+ if p then
+ context("page:" .. p)
end
end
end
@@ -949,29 +1067,32 @@ local function MPpardata(n)
end
end
-commands.MPpardata = MPpardata
+scanners.MPpardata = function() -- name
+ MPpardata(scanstring())
+end
-function commands.MPposset(id) -- special helper, used in backgrounds
- local b = f_b_tag(id)
- local e = f_e_tag(id)
- local w = f_w_tag(id)
+scanners.MPposset = function() -- name (special helper, used in backgrounds)
+ local name = scanstring()
+ local b = f_b_tag(name)
+ local e = f_e_tag(name)
+ local w = f_w_tag(name)
local p = f_p_tag(jobpositions.n(b))
MPpos(b) context(",") MPpos(e) context(",") MPpos(w) context(",") MPpos(p) context(",") MPpardata(p)
end
-function commands.MPls(id)
- local t = collected[id]
- if t then
- context("%.5Fpt",t.ls*pt)
+scanners.MPls = function() -- name
+ local jpi = collected[scanstring()]
+ if jpi then
+ context("%.5Fpt",jpi.ls*pt)
else
context("0pt")
end
end
-function commands.MPrs(id)
- local t = collected[id]
- if t then
- context("%.5Fpt",t.rs*pt)
+scanners.MPrs = function() -- name
+ local jpi = collected[scanstring()]
+ if jpi then
+ context("%.5Fpt",jpi.rs*pt)
else
context("0pt")
end
@@ -979,8 +1100,10 @@ end
local splitter = lpeg.tsplitat(",")
-function commands.MPplus(id,n,default)
- local jpi = collected[id]
+scanners.MPplus = function() -- name n default
+ local jpi = collected[scanstring()]
+ local n = scaninteger()
+ local default = scanstring()
if jpi then
local e = jpi.e
if e then
@@ -996,59 +1119,79 @@ function commands.MPplus(id,n,default)
context(default)
end
-function commands.MPrest(id,default)
- local jpi = collected[id]
+scanners.MPrest = function() -- name default
+ local jpi = collected[scanstring()]
+ local default = scanstring()
context(jpi and jpi.e or default)
end
-function commands.MPxywhd(id)
- local t = collected[id]
- if t then
+scanners.MPxywhd = function() -- name
+ local jpi = collected[scanstring()]
+ if jpi then
context("%.5Fpt,%.5Fpt,%.5Fpt,%.5Fpt,%.5Fpt",
- t.x*pt,
- t.y*pt,
- t.w*pt,
- t.h*pt,
- t.d*pt
+ jpi.x*pt,
+ jpi.y*pt,
+ jpi.w*pt,
+ jpi.h*pt,
+ jpi.d*pt
)
else
context("0,0,0,0,0") -- for mp only
end
end
-local doif, doifelse = commands.doif, commands.doifelse
+local doif = commands.doif
+local doifelse = commands.doifelse
-function commands.doifpositionelse(name)
- doifelse(collected[name])
+scanners.doifelseposition = function() -- name
+ doifelse(collected[scanstring()])
end
-function commands.doifposition(name)
- doif(collected[name])
+scanners.doifposition = function() -- name
+ doif(collected[scanstring()])
end
-function commands.doifpositiononpage(name,page) -- probably always realpageno
- local c = collected[name]
- doifelse(c and c.p == page)
+scanners.doifelsepositiononpage = function() -- name page -- probably always realpageno
+ local c = collected[scanstring()]
+ local p = scaninteger()
+ doifelse(c and c.p == p)
end
-function commands.doifoverlappingelse(one,two,overlappingmargin)
- doifelse(overlapping(one,two,overlappingmargin))
+scanners.doifelseoverlapping = function() -- one two
+ doifelse(overlapping(scanstring(),scanstring()))
end
-function commands.doifpositionsonsamepageelse(list,page)
- doifelse(onsamepage(list))
+scanners.doifelsepositionsonsamepage = function() -- list
+ doifelse(onsamepage(scanstring()))
end
-function commands.doifpositionsonthispageelse(list)
- doifelse(onsamepage(list,tostring(texgetcount("realpageno"))))
+scanners.doifelsepositionsonthispage = function() -- list
+ doifelse(onsamepage(scanstring(),tostring(texgetcount("realpageno"))))
end
-function commands.doifelsepositionsused()
+scanners.doifelsepositionsused = function()
doifelse(next(collected))
end
-commands.markcolumnbox = jobpositions.markcolumnbox
-commands.markregionbox = jobpositions.markregionbox
+scanners.markregionbox = function() -- box
+ markregionbox(scaninteger())
+end
+
+scanners.setregionbox = function() -- box
+ setregionbox(scaninteger())
+end
+
+scanners.markregionboxtagged = function() -- box tag
+ markregionbox(scaninteger(),scanstring())
+end
+
+scanners.setregionboxtagged = function() -- box tag
+ setregionbox(scaninteger(),scanstring())
+end
+
+scanners.markregionboxcorrected = function() -- box tag
+ markregionbox(scaninteger(),scanstring(),true)
+end
-- statistics (at least for the moment, when testing)
diff --git a/Master/texmf-dist/tex/context/base/anch-pos.mkiv b/Master/texmf-dist/tex/context/base/anch-pos.mkiv
index 7ecaa296ed8..5d9c2fd3478 100644
--- a/Master/texmf-dist/tex/context/base/anch-pos.mkiv
+++ b/Master/texmf-dist/tex/context/base/anch-pos.mkiv
@@ -32,15 +32,15 @@
%D \dosetpositionplus {identifier} {width} {height} {depth} {list}
%D \stoptyping
-\def\dosaveposition #1#2#3#4{\ctxcommand{setpos("#1",\number#2,\number\dimexpr#3,\number\dimexpr#4)}}
-\def\dosavepositionwhd #1#2#3#4#5#6#7{\ctxcommand{setpos("#1",\number#2,\number\dimexpr#3,\number\dimexpr#4,\number\dimexpr#5,\number\dimexpr#6,\number\dimexpr#7)}}
-\def\dosavepositionplus#1#2#3#4#5#6#7#8{\ctxcommand{setpos("#1",\number#2,\number\dimexpr#3,\number\dimexpr#4,\number\dimexpr#5,\number\dimexpr#6,\number\dimexpr#7,"#8")}}
+\def\dosaveposition #1#2#3#4{\clf_dosaveposition {#1}#2 #3 #4\relax}
+\def\dosavepositionwhd #1#2#3#4#5#6#7{\clf_dosavepositionwhd {#1}#2 #3 #4 #5 #6 #7\relax}
+\def\dosavepositionplus#1#2#3#4#5#6#7#8{\clf_dosavepositionplus{#1}#2 #3 #4 #5 #6 #7{#8}}
-\def\dosetposition #1{\ctxcommand{posxy("#1")}}
-\def\dosetpositionwhd #1#2#3#4{\ctxcommand{poswhd("#1",\number\dimexpr#2,\number\dimexpr#3,\number\dimexpr#4)}}
-\def\dosetpositionplus#1#2#3#4#5{\ctxcommand{posplus("#1",\number\dimexpr#2,\number\dimexpr#3,\number\dimexpr#4,"#5")}}
-\def\dosetpositionbox #1#2{\ctxcommand{poswhd("#1",\number\wd#2,\number\ht#2,\number\dp#2)}}
-\def\dosetpositionstrut #1{\ctxcommand{posstrut("#1")}}
+\def\dosetposition #1{\clf_dosetposition {#1}} % {} expands
+\def\dosetpositionwhd #1#2#3#4{\clf_dosetpositionwhd {#1}#2 #3 #4\relax}
+\def\dosetpositionplus#1#2#3#4#5{\clf_dosetpositionplus {#1}#2 #3 #4{#5}}
+\def\dosetpositionbox #1#2{\clf_dosetpositionbox {#1}#2\relax}
+\def\dosetpositionstrut #1{\clf_dosetpositionstrut{#1}}
\newbox\b_anch_position
\newif \ifpositioning % sort of public
@@ -48,7 +48,7 @@
%D Sometimes we want to trick the position handler a bit:
\def\replacepospxywhd#1#2#3#4#5#6#7% when used we can better make a helper
- {\ctxcommand{replacepospxywhd('#1',\number#2,\number\dimexpr#3,\number\dimexpr#4,\number\dimexpr#5,\number\dimexpr#6,\number\dimexpr#7)}}
+ {\clf_replacepospxywhd{#1}#2 #3 #4 #5 #6 #7\relax}
%D \macros
%D {MPp, MPx, MPy, MPw, MPh, MPd, MPxy, MPll, MPlr, MPur, MPul, MPpos, MPanchor}
@@ -56,28 +56,35 @@
%D Access to the positional information is provided by macros with short names
%S that are clearly meant for \METAPOST\ but nowadays also used for other purposes.
-\def\MPp #1{\ctxcommand{MPp("#1")}} \let\MPpage \MPp
-\def\MPr #1{\ctxcommand{MPr("#1")}} \let\MPregion \MPr
-\def\MPc #1{\ctxcommand{MPc("#1")}} \let\MPcolumn \MPc
-\def\MPn #1{\ctxcommand{MPn("#1")}} \let\MPparagraph\MPn
-\def\MPx #1{\ctxcommand{MPx("#1")}}
-\def\MPy #1{\ctxcommand{MPy("#1")}}
-\def\MPw #1{\ctxcommand{MPw("#1")}} % first we need to replace \MPwidth etc
-\def\MPh #1{\ctxcommand{MPh("#1")}}
-\def\MPd #1{\ctxcommand{MPd("#1")}}
-\def\MPxy #1{\ctxcommand{MPxy("#1")}}
-\def\MPll #1{\ctxcommand{MPll("#1")}}
-\def\MPlr #1{\ctxcommand{MPlr("#1")}}
-\def\MPur #1{\ctxcommand{MPur("#1")}}
-\def\MPul #1{\ctxcommand{MPul("#1")}}
-\def\MPpos #1{\ctxcommand{MPpos("#1")}} \let\MPanchor\MPpos % overloaded locally when needed
-\def\MPe #1{\ctxcommand{MPe("#1")}}
-
-\def\MPls #1{\ctxcommand{MPls("#1")}} \let\MPleftskip\MPls % compatible feature
-\def\MPrs #1{\ctxcommand{MPrs("#1")}} \let\MPrightkip\MPrs % compatible feature
-
-\def\MPpardata#1{\ctxcommand{MPpardata("#1")}}
-\def\MPxywhd #1{\ctxcommand{MPxywhd("#1")}}
+\def\MPp #1{\clf_MPp {#1}}
+\def\MPr #1{\clf_MPr {#1}}
+\def\MPc #1{\clf_MPc {#1}}
+\def\MPn #1{\clf_MPn {#1}}
+\def\MPx #1{\clf_MPx {#1}}
+\def\MPy #1{\clf_MPy {#1}}
+\def\MPw #1{\clf_MPw {#1}}
+\def\MPh #1{\clf_MPh {#1}}
+\def\MPd #1{\clf_MPd {#1}}
+\def\MPxy #1{\clf_MPxy {#1}}
+\def\MPll #1{\clf_MPll {#1}}
+\def\MPlr #1{\clf_MPlr {#1}}
+\def\MPur #1{\clf_MPur {#1}}
+\def\MPul #1{\clf_MPul {#1}}
+\def\MPpos #1{\clf_MPpos {#1}}
+\def\MPls #1{\clf_MPls {#1}}
+\def\MPrs #1{\clf_MPrs {#1}}
+\def\MPpardata#1{\clf_MPpardata{#1}}
+\def\MPxywhd #1{\clf_MPxywhd {#1}}
+\def\MPposset #1{\clf_MPposset {#1}}
+
+\let\MPpage \MPp
+\let\MPregion \MPr
+\let\MPcolumn \MPc
+\let\MPparagraph\MPn
+
+\let\MPanchor \MPpos % overloaded locally when needed
+\let\MPleftskip \MPls % compatible feature
+\let\MPrightkip \MPrs % compatible feature
%D \macros
%D {MPplus, MPrest, MPv, MPvv}
@@ -98,8 +105,8 @@
%D
%D The extra parameters are not treated.
-\def\MPplus#1#2#3{\ctxcommand{MPplus("#1",#2,"#3")}} \let\MPv \MPplus
-\def\MPrest #1#2{\ctxcommand{MPrest("#1","#2")}} \let\MPvv\MPrest
+\def\MPplus#1#2#3{\clf_MPplus{#1}#2{#3}} \let\MPv \MPplus
+\def\MPrest #1#2{\clf_MPrest{#1}{#2}} \let\MPvv\MPrest
%D There are two low level positioning macros. Both store the position as well
%D as execute an action associated with that position.
@@ -248,9 +255,11 @@
\newcount\c_anch_column % will be delegated to lua
\newcount\c_anch_text % will be delegated to lua
+% beware we need to pass \somethingexpanded or { }
+
\unexpanded\def\anch_mark_column_box#1%
{\global\advance\c_anch_column\plusone
- \ctxcommand{markregionbox(\number#1,"columnarea:\the\c_anch_column")}} % extra height
+ \clf_markregionboxtagged#1{columnarea:\the\c_anch_column}} % extra height
\unexpanded\def\anch_mark_region_box
{\iftrialtypesetting
@@ -262,24 +271,27 @@
\fi\fi}
\unexpanded\def\anch_mark_region_box_indeed#1%
- {\ctxcommand{markregionbox(\number#1)}}
+ {\clf_markregionbox#1\relax}
\unexpanded\def\anch_mark_flow_box#1% will be extended / renamed
{\hbox\bgroup
\global\advance\c_anch_text\plusone
- \ctxcommand{markregionbox(\number#1,"textarea:\the\c_anch_text")}%
+ \clf_markregionboxtagged#1{textarea:\the\c_anch_text}%
\box#1%
\egroup}
+\unexpanded\def\anch_mark_tagged_box#1#2%
+ {\clf_markregionboxtagged#1{#2}}
+
\unexpanded\def\anch_mark_flow_only#1% will be extended / renamed
{\global\advance\c_anch_text\plusone
- \ctxcommand{markregionbox(\number#1,"textarea:\the\c_anch_text",true)}}
+ \clf_markregionboxcorrected#1{textarea:\the\c_anch_text}}
\unexpanded\def\anch_make_page_box#1% maybe like text
- {\ctxcommand{markregionbox(\number#1,"\pageanchor")}} % needs an hbox
+ {\clf_setregionboxtagged#1{page:\the\realpageno}}
\unexpanded\def\anch_mark_text_box#1%
- {\ctxcommand{markregionbox(\number#1,"\textanchor")}} % needs an hbox
+ {\clf_markregionboxtagged#1{text:\the\realpageno}} % needs an hbox
%D We can copy a position with:
%D
@@ -289,7 +301,8 @@
%D
%D Again, this is a global operation.
-\def\copyposition#1#2{\ctxcommand{copyposition('#1','#2')}}
+\unexpanded\def\copyposition#1#2%
+ {\clf_copyposition{#1}{#2}}
%D The fact that handling positions is a two pass operation, is one of the
%D reasons why we need to be able to test for existence, using:
@@ -298,8 +311,12 @@
%D \doifpositionelse {identifier} {found action} {not found action}
%D \stoptyping
-\def\doifpositionelse#1{\ctxcommand{doifpositionelse('#1')}}
-\def\doifposition #1{\ctxcommand{doifposition('#1')}}
+\unexpanded\def\doifposition #1{\clf_doifposition {#1}}
+\unexpanded\def\doifelseposition #1{\clf_doifelseposition {#1}}
+\unexpanded\def\doifelsepositiononpage#1#2{\clf_doifelsepositiononpage{#1}#2\relax}
+
+\let\doifpositionelse \doifelseposition
+\let\doifpositiononpageelse\doifelsepositiononpage
%D \macros
%D {xypos}
@@ -315,8 +332,8 @@
%D \NC \type {\epos} \NC e: \NC end point in a line \NC \NR
%D \stoptabulate
%D
-%D Each macro takes an identifier as argument, and the \type
-%D {\hpos} and \type {\vpos} also expect box content.
+%D Each macro takes an identifier as argument, and the \type {\hpos} and
+%D \type {\vpos} also expect box content.
\let\xypos\setpositiononly
@@ -352,7 +369,7 @@
\fi}
\def\anch_positions_register_par_options_normal
- {\dontleavehmode\ctxcommand{parpos()}}
+ {\dontleavehmode\clf_parpos}
\def\anch_positions_register_par_options_traced
{\anch_positions_register_par_options_normal
@@ -407,7 +424,9 @@
%D {action when not overlapping}
%D \stoptyping
-\def\doifoverlappingelse#1#2{\ctxcommand{doifoverlappingelse("#1","#2")}}
+\unexpanded\def\doifelseoverlapping#1#2{\clf_doifelseoverlapping{#1}{#2}}
+
+\let\doifoverlappingelse\doifelseoverlapping
%D \macros
%D {doifpositionsonsamepageelse,
@@ -425,7 +444,16 @@
%D {action when not on this page}
%D \stoptyping
-\def\doifpositionsonsamepageelse#1{\ctxcommand{doifpositionsonsamepageelse("#1")}}
-\def\doifpositionsonthispageelse#1{\ctxcommand{doifpositionsonthispageelse("#1")}}
+\unexpanded\def\doifelsepositionsonsamepage#1{\clf_doifelsepositionsonsamepage{#1}}
+\unexpanded\def\doifelsepositionsonthispage#1{\clf_doifelsepositionsonthispage{#1}}
+
+\let\doifpositionsonsamepageelse\doifelsepositionsonsamepage
+\let\doifpositionsonthispageelse\doifelsepositionsonthispage
+
+%D Moved here:
+
+\unexpanded\def\doifelsepositionsused{\clf_doifelsepositionsused}
+
+\let\doifpositionsusedelse\doifelsepositionsused
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/anch-snc.mkiv b/Master/texmf-dist/tex/context/base/anch-snc.mkiv
index 77ebc3e0e71..27769fbf935 100644
--- a/Master/texmf-dist/tex/context/base/anch-snc.mkiv
+++ b/Master/texmf-dist/tex/context/base/anch-snc.mkiv
@@ -51,6 +51,8 @@
\def\doifelselastsyncposition#1#2%
{\doifelse{\lastsyncclass\lastsyncposition}{#1#2}}
+\let\doiflastsyncpositionelse\doifelselastsyncposition
+
\def\dodosyncposition#1#2#3%
{\letgvalue{\s!reset:\s!syncpos:#1}\relax
\letgvalue{\s!preset:\s!syncpos:#1}\relax
@@ -74,7 +76,7 @@
\!!counta\zerocount
\!!countc\zerocount
\doloop
- {\doifpositionelse{\s!syncpos:#1:\recurselevel}
+ {\doifelseposition{\s!syncpos:#1:\recurselevel}
{\!!dimenb\MPy{\s!syncpos:#1:\recurselevel}\relax
\!!countb\MPp{\s!syncpos:#1:\recurselevel}\relax
\ifnum\!!countb=\!!counta % same page
diff --git a/Master/texmf-dist/tex/context/base/anch-tab.mkiv b/Master/texmf-dist/tex/context/base/anch-tab.mkiv
index a70f63e24bf..da735b49de5 100644
--- a/Master/texmf-dist/tex/context/base/anch-tab.mkiv
+++ b/Master/texmf-dist/tex/context/base/anch-tab.mkiv
@@ -43,16 +43,16 @@
\fi}
\unexpanded\def\tabl_tabulate_hook_b_first
- {\ctxcommand{bcolumn("tabulate:\the\c_anch_tabs:\the\c_tabl_tabulate_column",true)}}
+ {\clf_bposcolumnregistered{tabulate:\the\c_anch_tabs:\the\c_tabl_tabulate_column}}
\unexpanded\def\tabl_tabulate_hook_b_next
- {\ctxcommand{bcolumn("tabulate:\the\c_anch_tabs:\the\c_tabl_tabulate_column")}}
+ {\clf_bposcolumn{tabulate:\the\c_anch_tabs:\the\c_tabl_tabulate_column}}
\unexpanded\def\tabl_tabulate_hook_e_first
- {\ctxcommand{ecolumn(true)}}
+ {\clf_eposcolumnregistered}
\unexpanded\def\tabl_tabulate_hook_e_next
- {\ctxcommand{ecolumn()}}
+ {\clf_eposcolumn}
% \appendtoks \registerparoptions \to \everypar
diff --git a/Master/texmf-dist/tex/context/base/attr-col.lua b/Master/texmf-dist/tex/context/base/attr-col.lua
index 7c6b7909ba2..28eda5ca91f 100644
--- a/Master/texmf-dist/tex/context/base/attr-col.lua
+++ b/Master/texmf-dist/tex/context/base/attr-col.lua
@@ -17,9 +17,14 @@ local format = string.format
local concat = table.concat
local min, max, floor = math.min, math.max, math.floor
-local attributes, nodes, utilities, logs, backends, storage = attributes, nodes, utilities, logs, backends, storage
-local commands, context, interfaces = commands, context, interfaces
-local tex = tex
+local attributes = attributes
+local nodes = nodes
+local utilities = utilities
+local logs = logs
+local backends = backends
+local storage = storage
+local context = context
+local tex = tex
local allocate = utilities.storage.allocate
local setmetatableindex = table.setmetatableindex
@@ -43,6 +48,9 @@ local unsetvalue = attributes.unsetvalue
local registerstorage = storage.register
local formatters = string.formatters
+local interfaces = interfaces
+local implement = interfaces.implement
+
-- We can distinguish between rules and glyphs but it's not worth the trouble. A
-- first implementation did that and while it saves a bit for glyphs and rules, it
-- costs more resourses for transparencies. So why bother.
@@ -246,7 +254,11 @@ end
--~ return { 5, .5, .5, .5, .5, 0, 0, 0, .5, parent, f, d, p }
--~ end
+local p_split = lpeg.tsplitat(",")
+local lpegmatch = lpeg.match
+
function colors.spot(parent,f,d,p)
+ -- inspect(parent) inspect(f) inspect(d) inspect(p)
if type(p) == "number" then
local n = list[numbers.color][parent] -- hard coded ref to color number
if n then
@@ -261,6 +273,33 @@ function colors.spot(parent,f,d,p)
end
else
-- todo, multitone (maybe p should be a table)
+ local ps = lpegmatch(p_split,p)
+ local ds = lpegmatch(p_split,d)
+ local c, m, y, k = 0, 0, 0, 0
+ local done = false
+ for i=1,#ps do
+ local p = tonumber(ps[i])
+ local d = ds[i]
+ if p and d then
+ local n = list[numbers.color][d] -- hard coded ref to color number
+ if n then
+ local v = values[n]
+ if v then
+ c = c + p*v[6]
+ m = m + p*v[7]
+ y = y + p*v[8]
+ k = k + p*v[8]
+ done = true
+ end
+ end
+ end
+ end
+ if done then
+ local r, g, b = cmyktorgb(c,m,y,k)
+ local s = cmyktogray(c,m,y,k)
+ local f = tonumber(f)
+ return { 5, s, r, g, b, c, m, y, k, parent, f, d, p }
+ end
end
return { 5, .5, .5, .5, .5, 0, 0, 0, .5, parent, f, d, p }
end
@@ -529,10 +568,10 @@ end
-- interface
-commands.enablecolor = colors.enable
-commands.enabletransparency = transparencies.enable
-commands.enablecolorintents = colorintents.enable
+implement { name = "enablecolor", onlyonce = true, actions = colors.enable }
+implement { name = "enabletransparency", onlyonce = true, actions = transparencies.enable }
+implement { name = "enablecolorintents", onlyonce = true, actions = colorintents.enable }
-function commands.registercolor (...) context(colors .register(...)) end
-function commands.registertransparency(...) context(transparencies.register(...)) end
-function commands.registercolorintent (...) context(colorintents .register(...)) end
+--------- { name = "registercolor", actions = { colors .register, context }, arguments = "string" }
+--------- { name = "registertransparency", actions = { transparencies.register, context }, arguments = { ... } }
+implement { name = "registercolorintent", actions = { colorintents .register, context }, arguments = { ... } }
diff --git a/Master/texmf-dist/tex/context/base/attr-eff.lua b/Master/texmf-dist/tex/context/base/attr-eff.lua
index b187b64c79f..ff41e12de70 100644
--- a/Master/texmf-dist/tex/context/base/attr-eff.lua
+++ b/Master/texmf-dist/tex/context/base/attr-eff.lua
@@ -6,7 +6,6 @@ if not modules then modules = { } end modules ['attr-eff'] = {
license = "see context related readme files"
}
-local commands, interfaces = commands, interfaces
local attributes, nodes, backends, utilities = attributes, nodes, backends, utilities
local tex = tex
@@ -18,6 +17,9 @@ local allocate = utilities.storage.allocate
local setmetatableindex = table.setmetatableindex
local formatters = string.formatters
+local interfaces = interfaces
+local implement = interfaces.implement
+
local variables = interfaces.variables
local v_normal = variables.normal
@@ -91,8 +93,13 @@ local function register(specification)
return n
end
+local enabled = false
+
local function enable()
- tasks.enableaction("shipouts","attributes.effects.handler")
+ if not enabled then
+ tasks.enableaction("shipouts","attributes.effects.handler")
+ enabled = true
+ end
end
effects.register = register
@@ -100,12 +107,28 @@ effects.enable = enable
-- interface
-local enabled = false
+implement {
+ name = "seteffect",
+ actions = function(specification)
+ if not enabled then
+ enable()
+ end
+ texsetattribute(a_effect,register(specification))
+ end,
+ arguments = {
+ {
+ { "alternative", "string" },
+ { "stretch", "integer" },
+ { "rulethickness", "dimen" }
+ }
+ }
+}
-function commands.triggereffect(specification)
- if not enabled then
- enable()
- enabled = true
+implement {
+ name = "reseteffect",
+ actions = function()
+ if enabled then
+ texsetattribute(a_effect,register())
+ end
end
- texsetattribute(a_effect,register(specification))
-end
+}
diff --git a/Master/texmf-dist/tex/context/base/attr-eff.mkiv b/Master/texmf-dist/tex/context/base/attr-eff.mkiv
index 43f575a7a69..bec8687ead5 100644
--- a/Master/texmf-dist/tex/context/base/attr-eff.mkiv
+++ b/Master/texmf-dist/tex/context/base/attr-eff.mkiv
@@ -36,14 +36,14 @@
\to \everydefineeffect
\unexpanded\def\starteffect[#1]%
- {\ctxcommand{triggereffect{
- alternative = "\namedeffectparameter{#1}\c!alternative",
- stretch = \number\namedeffectparameter{#1}\c!stretch,
- rulethickness = \number\dimexpr\namedeffectparameter{#1}\c!rulethickness\relax
- }}}
+ {\clf_seteffect
+ alternative {\namedeffectparameter{#1}\c!alternative}
+ stretch \numexpr\namedeffectparameter{#1}\c!stretch\relax
+ rulethickness \dimexpr\namedeffectparameter{#1}\c!rulethickness\relax
+ \relax}
\unexpanded\def\stopeffect % can be special
- {\ctxcommand{triggereffect()}} % v!normal 0 0
+ {\clf_reseteffect} % v!normal 0 0
\unexpanded\def\effect[#1]%
{\groupedcommand{\starteffect[#1]}{\stopeffect}}
diff --git a/Master/texmf-dist/tex/context/base/attr-ini.lua b/Master/texmf-dist/tex/context/base/attr-ini.lua
index 1e518467cff..df7404d11b0 100644
--- a/Master/texmf-dist/tex/context/base/attr-ini.lua
+++ b/Master/texmf-dist/tex/context/base/attr-ini.lua
@@ -6,8 +6,6 @@ if not modules then modules = { } end modules ['attr-ini'] = {
license = "see context related readme files"
}
-local commands, context, nodes, storage = commands, context, nodes, storage
-
local next, type = next, type
--[[ldx--
@@ -15,6 +13,13 @@ local next, type = next, type
symbolic names later on.</p>
--ldx]]--
+local nodes = nodes
+local context = context
+local storage = storage
+local commands = commands
+
+local implement = interfaces.implement
+
attributes = attributes or { }
local attributes = attributes
@@ -53,13 +58,13 @@ storage.register("attributes/list", list, "attributes.list")
names[0], numbers["fontdynamic"] = "fontdynamic", 0
--[[ldx--
-<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>
+<p>private attributes are used by the system and public ones are for users. We use dedicated
+ranges of numbers for them. Of course a the <l n='context'/> end a private attribute can be
+accessible too, so a private attribute can have a public appearance.</p>
--ldx]]--
-sharedstorage.attributes_last_private = sharedstorage.attributes_last_private or 127
-sharedstorage.attributes_last_public = sharedstorage.attributes_last_public or 1024
+sharedstorage.attributes_last_private = sharedstorage.attributes_last_private or 127 -- very private (can become 15)
+sharedstorage.attributes_last_public = sharedstorage.attributes_last_public or 1024 -- less private
function attributes.private(name) -- at the lua end (hidden from user)
local number = numbers[name]
@@ -97,8 +102,8 @@ end
attributes.system = attributes.private
-function attributes.define(name,number,category)
- return (attributes[category or "public"] or attributes["public"])(name,number)
+function attributes.define(name,category)
+ return (attributes[category or "public"] or attributes["public"])(name)
end
-- tracers
@@ -126,19 +131,11 @@ function attributes.ofnode(n)
showlist(n,n.attr)
end
--- interface
-
-commands.showattributes = attributes.showcurrent
-
-function commands.defineattribute(name,category)
- context(attributes.define(name,category))
-end
-
-- rather special
local store = { }
-function commands.savecurrentattributes(name)
+function attributes.save(name)
name = name or ""
local n = node.current_attr()
n = n and n.next
@@ -153,7 +150,7 @@ function commands.savecurrentattributes(name)
}
end
-function commands.restorecurrentattributes(name)
+function attributes.restore(name)
name = name or ""
local t = store[name]
if t then
@@ -171,3 +168,28 @@ function commands.restorecurrentattributes(name)
end
-- store[name] = nil
end
+
+implement {
+ name = "defineattribute",
+ arguments = { "string", "string" },
+ actions = { attributes.define, context }
+}
+
+-- interface
+
+implement {
+ name = "showattributes",
+ actions = attributes.showcurrent
+}
+
+implement {
+ name = "savecurrentattributes",
+ arguments = "string",
+ actions = attributes.save
+}
+
+implement {
+ name = "restorecurrentattributes",
+ arguments = "string",
+ actions = attributes.restore
+}
diff --git a/Master/texmf-dist/tex/context/base/attr-ini.mkiv b/Master/texmf-dist/tex/context/base/attr-ini.mkiv
index 0c576253415..f351a6800ee 100644
--- a/Master/texmf-dist/tex/context/base/attr-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/attr-ini.mkiv
@@ -44,31 +44,6 @@
\ifdefined \s!public \else \def\s!public {public} \fi % for metatex % or hard check later
\ifdefined \s!attribute \else \def\s!attribute{attribute} \fi % for metatex % or hard check later
-% \unexpanded\def\defineattribute
-% {\dodoubleempty\attr_basics_define}
-%
-% \unexpanded\def\definesystemattribute
-% {\dodoubleempty\attr_basics_define_system}
-%
-% \def\attr_basics_define[#1]%
-% {\expandafter\newattribute\csname\??attributecount#1\endcsname
-% \expandafter\newconstant \csname\??attributeid#1\endcsname
-% \csname\??attributeid#1\endcsname\c_syst_last_allocated_attribute
-% \ctxcommand{defineattribute("#1",\number\csname\??attributeid#1\endcsname)}%
-% \attr_basics_define_properties[#1]}
-%
-% \def\attr_basics_define_system[#1]%
-% {\scratchcounter\ctxcommand{getprivateattribute("#1")}\relax
-% \expandafter\attributedef\csname\??attributecount#1\endcsname\scratchcounter
-% \expandafter\newconstant \csname\??attributeid#1\endcsname
-% \csname\??attributeid#1\endcsname\scratchcounter
-% %\writestatus\m!system{defining system attribute #1 with number \number\scratchcounter}%
-% \attr_basics_define_properties[#1]}
-%
-% \def\attr_basics_define_properties[#1][#2]%
-% {\doifnotinset\s!global{#2}{\appendetoks\csname\??attributecount#1\endcsname\attributeunsetvalue\to\attributesresetlist}%
-% \doifinset \s!public{#2}{\expandafter\let\csname#1\s!attribute\expandafter\endcsname\csname\??attributeid#1\endcsname}}
-
\unexpanded\def\defineattribute {\dodoubleempty\attr_basics_define}
\unexpanded\def\definesystemattribute{\dodoubleempty\attr_basics_define_system}
@@ -76,12 +51,14 @@
\def\attr_basics_define_system{\attr_basics_define_indeed{private}}
\def\attr_basics_define_indeed#1[#2][#3]%
- {\scratchcounter\ctxcommand{defineattribute("#2","#1")}\relax
+ {\scratchcounter\clf_defineattribute{#2}{#1}\relax
%\writestatus\m!system{defining #1 attribute #2 with number \number\scratchcounter}%
\expandafter\attributedef\csname\??attributecount#2\endcsname\scratchcounter
\expandafter\newconstant \csname\??attributeid#2\endcsname
\csname\??attributeid#2\endcsname\scratchcounter
+ % some attributes are always global
\doifnotinset\s!global{#3}{\appendetoks\csname\??attributecount#2\endcsname\attributeunsetvalue\to\attributesresetlist}%
+ % here public means 'visible' so it's not to be confused with 'public' at the lua end
\doifinset \s!public{#3}{\expandafter\let\csname#2\s!attribute\expandafter\endcsname\csname\??attributeid#2\endcsname}}
\unexpanded\def\newattribute#1{\attr_basics_define_indeed{public}[\strippedcsname#1][]}
@@ -99,8 +76,8 @@
%D Rather special.
-\unexpanded\def\savecurrentattributes #1{\ctxcommand{savecurrentattributes ("#1")}}
-\unexpanded\def\restorecurrentattributes#1{\ctxcommand{restorecurrentattributes("#1")}}
+\unexpanded\def\savecurrentattributes #1{\clf_savecurrentattributes {#1}}
+\unexpanded\def\restorecurrentattributes#1{\clf_restorecurrentattributes{#1}}
%D For the moment we put this here (later it will move to where it's used):
@@ -125,6 +102,6 @@
\definesystemattribute [checkedbreak] [public]
\definesystemattribute [vboxtohboxseparator] [public]
-\unexpanded\def\showattributes{\ctxcommand{showattributes()}}
+\unexpanded\def\showattributes{\clf_showattributes}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/attr-lay.lua b/Master/texmf-dist/tex/context/base/attr-lay.lua
index 176af1a2c0a..0d43979c813 100644
--- a/Master/texmf-dist/tex/context/base/attr-lay.lua
+++ b/Master/texmf-dist/tex/context/base/attr-lay.lua
@@ -15,9 +15,17 @@ if not modules then modules = { } end modules ['attr-lay'] = {
local type = type
local insert, remove = table.insert, table.remove
-local attributes, nodes, utilities, logs, backends = attributes, nodes, utilities, logs, backends
-local commands, context, interfaces = commands, context, interfaces
-local tex = tex
+local attributes = attributes
+local nodes = nodes
+local utilities = utilities
+local logs = logs
+local backends = backends
+
+local context = context
+local interfaces = interfaces
+local tex = tex
+
+local implement = interfaces.implement
local allocate = utilities.storage.allocate
local setmetatableindex = table.setmetatableindex
@@ -38,6 +46,8 @@ local viewerlayers = attributes.viewerlayers
local variables = interfaces.variables
local v_local = variables["local"]
local v_global = variables["global"]
+local v_start = variables["start"]
+local v_yes = variables["yes"]
local a_viewerlayer = attributes.private("viewerlayer")
@@ -80,15 +90,11 @@ local layerstacker = utilities.stacker.new("layers") -- experiment
layerstacker.mode = "stack"
layerstacker.unset = attributes.unsetvalue
+viewerlayers.resolve_reset = layerstacker.resolve_reset
viewerlayers.resolve_begin = layerstacker.resolve_begin
viewerlayers.resolve_step = layerstacker.resolve_step
viewerlayers.resolve_end = layerstacker.resolve_end
-function commands.cleanuplayers()
- layerstacker.clean()
- -- todo
-end
-
-- stacked
local function startlayer(...) startlayer = nodeinjections.startlayer return startlayer(...) end
@@ -239,15 +245,63 @@ function viewerlayers.define(settings)
end
end
-commands.defineviewerlayer = viewerlayers.define
-commands.startviewerlayer = viewerlayers.start
-commands.stopviewerlayer = viewerlayers.stop
-
-function commands.definedviewerlayer(settings)
- viewerlayers.define(settings)
- context(register(settings.tag,true)) -- true forces a use
+function viewerlayers.definedlayoutcomponent(tag)
+ viewerlayers.define {
+ tag = tag,
+ title = utilities.strings.nice(tag),
+ visible = v_start,
+ editable = v_yes,
+ printable = v_yes,
+ }
+ return register(tag,true) -- true forces a use
end
-function commands.registeredviewerlayer(name)
- context(register(name,true)) -- true forces a use
+function viewerlayers.cleanup()
+ layerstacker.clean()
+ -- todo
end
+
+implement {
+ name = "cleanuplayers",
+ actions = viewerlayers.cleanup
+}
+
+implement {
+ name = "defineviewerlayer",
+ actions = viewerlayers.define,
+ arguments = {
+ {
+ { "tag" },
+ { "title" },
+ { "visible" },
+ { "editable" },
+ { "export" },
+ { "printable" },
+ { "scope" },
+ },
+ true
+ }
+}
+
+implement {
+ name = "definedlayoutcomponent",
+ actions = { viewerlayers.definedlayoutcomponent, context },
+ arguments = "string"
+}
+
+implement {
+ name = "startviewerlayer",
+ actions = viewerlayers.start,
+ arguments = "string",
+}
+
+implement {
+ name = "stopviewerlayer",
+ actions = viewerlayers.stop
+}
+
+implement {
+ name = "registeredviewerlayer",
+ actions = { register, context },
+ arguments = { "string", true } -- true forces a use
+}
diff --git a/Master/texmf-dist/tex/context/base/attr-lay.mkiv b/Master/texmf-dist/tex/context/base/attr-lay.mkiv
index 6055c2a73d2..14ef4a6d40f 100644
--- a/Master/texmf-dist/tex/context/base/attr-lay.mkiv
+++ b/Master/texmf-dist/tex/context/base/attr-lay.mkiv
@@ -33,27 +33,31 @@
\setupviewerlayer
[\c!state=\v!start,
\c!title=,
+ \c!export=\v!yes, % exportable is ugly
\c!printable=\v!yes,
\c!scope=\v!local, % maybe global but needs checking with layout
\c!method=\v!none]
\appendtoks
- \ctxcommand{defineviewerlayer{
- tag = "\currentviewerlayer",
- title = "\viewerlayerparameter\c!title",
- visible = "\viewerlayerparameter\c!state",
- editable = "\v!yes",
- printable = "\viewerlayerparameter\c!printable",
- scope = "\viewerlayerparameter\c!scope"
- }}%
+ \clf_defineviewerlayer
+ tag {\currentviewerlayer}%
+ title {\viewerlayerparameter\c!title}%
+ visible {\viewerlayerparameter\c!state}%
+ editable {\v!yes}%
+ export {\viewerlayerparameter\c!export}%
+ printable {\viewerlayerparameter\c!printable}%
+ scope {\viewerlayerparameter\c!scope}%
+ \relax
\doif{\viewerlayerparameter\c!method}\v!command
{\setuxvalue{\e!start#1}{\startviewerlayer[\currentviewerlayer]}%
\setuxvalue{\e!stop #1}{\stopviewerlayer}}%
\to \everydefineviewerlayer
-\unexpanded\def\startviewerlayer[#1]{\ctxcommand{startviewerlayer("#1")}} % not grouped
-\unexpanded\def\stopviewerlayer {\ctxcommand{stopviewerlayer()}} % not grouped
-\unexpanded\def\viewerlayer [#1]{\groupedcommand{\startviewerlayer[#1]}{\stopviewerlayer}} % grouped
+\unexpanded\def\startviewerlayer[#1]{\clf_startviewerlayer{#1}}% not grouped
+\unexpanded\def\stopviewerlayer {\clf_stopviewerlayer} % not grouped
+\unexpanded\def\viewerlayer [#1]{\groupedcommand
+ {\clf_startviewerlayer{#1}}% grouped
+ {\clf_stopviewerlayer}} % grouped
% some day we will keep this at the lua end as the info is only needed there
@@ -70,13 +74,7 @@
\installcorenamespace{layoutcomponentattribute}
\def\attr_layoutcomponent_initialize#1%
- {\edef\layoutcomponentboxattribute{\ctxcommand{definedviewerlayer{%
- tag = "#1",
- title = utilities.strings.nice("#1"), % only here as in steps we have step:<number>
- visible = "\v!start",
- editable = "\v!yes",
- printable = "\v!yes"
- }}}%
+ {\edef\layoutcomponentboxattribute{\clf_definedlayoutcomponent{#1}}%
\edef\layoutcomponentboxattribute{attr \viewerlayerattribute \layoutcomponentboxattribute\relax}%
\expandafter\glet\csname\??layoutcomponentattribute#1\endcsname\layoutcomponentboxattribute}
@@ -98,7 +96,7 @@
\let\resetlayoutcomponentattribute\attr_layoutcomponent_reset}
\unexpanded\def\attr_layoutcomponent_cleanup
- {\ctxcommand{cleanuplayers()}}
+ {\clf_cleanuplayers}
\appendtoks
\attr_layoutcomponent_cleanup
diff --git a/Master/texmf-dist/tex/context/base/attr-neg.lua b/Master/texmf-dist/tex/context/base/attr-neg.lua
index c32cec956b2..1347c3d1ad8 100644
--- a/Master/texmf-dist/tex/context/base/attr-neg.lua
+++ b/Master/texmf-dist/tex/context/base/attr-neg.lua
@@ -18,7 +18,7 @@ local tex = tex
local states = attributes.states
local tasks = nodes.tasks
local nodeinjections = backends.nodeinjections
-local settexattribute = tex.setattribute
+local texsetattribute = tex.setattribute
local variables = interfaces.variables
local allocate = utilities.storage.allocate
local setmetatableindex = table.setmetatableindex
@@ -89,10 +89,16 @@ negatives.enable = enable
local enabled = false
-function commands.triggernegative(stamp)
+function negatives.set(stamp)
if not enabled then
enable()
enabled = true
end
- settexattribute(a_negative,register(stamp))
+ texsetattribute(a_negative,register(stamp))
end
+
+interfaces.implement {
+ name = "setnegative",
+ actions = negatives.set,
+ arguments = "string",
+}
diff --git a/Master/texmf-dist/tex/context/base/attr-neg.mkiv b/Master/texmf-dist/tex/context/base/attr-neg.mkiv
index 102b220baca..ff1f52a96b4 100644
--- a/Master/texmf-dist/tex/context/base/attr-neg.mkiv
+++ b/Master/texmf-dist/tex/context/base/attr-neg.mkiv
@@ -25,6 +25,6 @@
\unexpanded\def\startpositive{\attr_trigger_negative\v!positive}
\unexpanded\def\stoppositive {\attr_trigger_negative\v!negative}
-\def\attr_trigger_negative#1{\ctxcommand{triggernegative('#1')}}
+\def\attr_trigger_negative#1{\clf_setnegative{#1}}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/back-exp.lua b/Master/texmf-dist/tex/context/base/back-exp.lua
index 44c2cd539b2..a4127e6be67 100644
--- a/Master/texmf-dist/tex/context/base/back-exp.lua
+++ b/Master/texmf-dist/tex/context/base/back-exp.lua
@@ -6,7 +6,14 @@ if not modules then modules = { } end modules ['back-exp'] = {
license = "see context related readme files"
}
--- beware: we run out of the 200 local limit
+-- Todo: share properties more with tagged pdf (or thge reverse)
+
+-- Because we run into the 200 local limit we quite some do .. end wrappers .. not always
+-- that nice but it has to be.
+
+-- Experiments demonstrated that mapping to <div> and classes is messy because we have to
+-- package attributes (some 30) into one set of (space seperatated but prefixed classes)
+-- which only makes things worse .. so if you want something else, use xslt to get there.
-- language -> only mainlanguage, local languages should happen through start/stoplanguage
-- tocs/registers -> maybe add a stripper (i.e. just don't flush entries in final tree)
@@ -23,21 +30,29 @@ if not modules then modules = { } end modules ['back-exp'] = {
-- todo: move critital formatters out of functions
-- todo: delay loading (apart from basic tag stuff)
-local next, type = next, type
-local format, concat, sub, gsub = string.format, table.concat, string.sub, string.gsub
+-- problem : too many local variables
+
+-- check setting __i__
+
+local next, type, tonumber = next, type, tonumber
+local concat, sub, gsub = table.concat, string.sub, string.gsub
local validstring = string.valid
local lpegmatch = lpeg.match
local utfchar, utfvalues = utf.char, utf.values
local insert, remove = table.insert, table.remove
-local fromunicode16 = fonts.mappings.fromunicode16
local sortedhash = table.sortedhash
local formatters = string.formatters
+local todimen = number.todimen
+local replacetemplate = utilities.templates.replace
local trace_export = false trackers.register ("export.trace", function(v) trace_export = v end)
local trace_spacing = false trackers.register ("export.trace.spacing", function(v) trace_spacing = v end)
+
local less_state = false directives.register("export.lessstate", function(v) less_state = v end)
local show_comment = true directives.register("export.comment", function(v) show_comment = v end)
+show_comment = false -- figure out why break comment
+
-- maybe we will also support these:
--
-- local css_hyphens = false directives.register("export.css.hyphens", function(v) css_hyphens = v end)
@@ -49,7 +64,16 @@ local report_export = logs.reporter("backend","export")
local nodes = nodes
local attributes = attributes
+
local variables = interfaces.variables
+local v_yes = variables.yes
+local v_no = variables.no
+local v_normal = variables.normal
+local v_flushright = variables.flushright
+local v_middle = variables.middle
+local v_flushleft = variables.flushleft
+
+local implement = interfaces.implement
local settings_to_array = utilities.parsers.settings_to_array
@@ -85,15 +109,14 @@ local line_code = listcodes.line
local texgetcount = tex.getcount
-local a_characters = attributes.private('characters')
-local a_exportstatus = attributes.private('exportstatus')
-
-local a_tagged = attributes.private('tagged')
-local a_taggedpar = attributes.private("taggedpar")
-local a_image = attributes.private('image')
-local a_reference = attributes.private('reference')
-
-local a_textblock = attributes.private("textblock")
+local privateattribute = attributes.private
+local a_characters = privateattribute('characters')
+local a_exportstatus = privateattribute('exportstatus')
+local a_tagged = privateattribute('tagged')
+local a_taggedpar = privateattribute("taggedpar")
+local a_image = privateattribute('image')
+local a_reference = privateattribute('reference')
+local a_textblock = privateattribute("textblock")
local nuts = nodes.nuts
local tonut = nuts.tonut
@@ -115,18 +138,21 @@ local traverse_nodes = nuts.traverse
local references = structures.references
local structurestags = structures.tags
local taglist = structurestags.taglist
+local specifications = structurestags.specifications
local properties = structurestags.properties
-local userdata = structurestags.userdata -- might be combines with taglist
-local tagdata = structurestags.data
-local tagmetadata = structurestags.metadata
-local detailedtag = structurestags.detailedtag
+local locatedtag = structurestags.locatedtag
local starttiming = statistics.starttiming
local stoptiming = statistics.stoptiming
+local characterdata = characters.data
+local overloads = fonts.mappings.overloads
+
-- todo: more locals (and optimize)
-local exportversion = "0.30"
+local exportversion = "0.34"
+local mathmlns = "http://www.w3.org/1998/Math/MathML"
+local contextns = "http://www.contextgarden.net/context/export" -- whatever suits
local nofcurrentcontent = 0 -- so we don't free (less garbage collection)
local currentcontent = { }
@@ -137,14 +163,15 @@ local currentparagraph = nil
local noftextblocks = 0
-local attributehash = { } -- to be considered: set the values at the tex end
local hyphencode = 0xAD
local hyphen = utfchar(0xAD) -- todo: also emdash etc
-local colonsplitter = lpeg.splitat(":")
-local dashsplitter = lpeg.splitat("-")
+local tagsplitter = structurestags.patterns.splitter
+----- colonsplitter = lpeg.splitat(":")
+----- dashsplitter = lpeg.splitat("-")
local threshold = 65536
local indexing = false
local keephyphens = false
+local exportproperties = false
local finetuning = { }
@@ -152,6 +179,8 @@ local treestack = { }
local nesting = { }
local currentdepth = 0
+local wrapups = { }
+
local tree = { data = { }, fulltag == "root" } -- root
local treeroot = tree
local treehash = { }
@@ -167,7 +196,12 @@ local somespace = { [0x20] = true, [" "] = true } -- for testing
local entities = { ["&"] = "&amp;", [">"] = "&gt;", ["<"] = "&lt;" }
local attribentities = { ["&"] = "&amp;", [">"] = "&gt;", ["<"] = "&lt;", ['"'] = "quot;" }
-local entityremapper = utf.remapper(entities)
+local p_entity = lpeg.replacer(entities) -- was: entityremapper = utf.remapper(entities)
+local p_attribute = lpeg.replacer(attribentities)
+local p_stripper = lpeg.patterns.stripper
+local p_escaped = lpeg.patterns.xml.escaped
+
+local f_id = formatters["%s-%s"]
local alignmapping = {
flushright = "right",
@@ -175,13 +209,6 @@ local alignmapping = {
flushleft = "left",
}
-local numbertoallign = {
- [0] = "justify", ["0"] = "justify", [variables.normal ] = "justify",
- [1] = "right", ["1"] = "right", [variables.flushright] = "right",
- [2] = "center", ["2"] = "center", [variables.middle ] = "center",
- [3] = "left", ["3"] = "left", [variables.flushleft ] = "left",
-}
-
local defaultnature = "mixed" -- "inline"
setmetatableindex(used, function(t,k)
@@ -192,10 +219,14 @@ setmetatableindex(used, function(t,k)
end
end)
+local f_entity = formatters["&#x%X;"]
+local f_attribute = formatters[" %s=%q"]
+local f_property = formatters[" %s%s=%q"]
+
setmetatableindex(specialspaces, function(t,k)
local v = utfchar(k)
t[k] = v
- entities[v] = formatters["&#x%X;"](k)
+ entities[v] = f_entity(k)
somespace[k] = true
somespace[v] = true
return v
@@ -207,30 +238,35 @@ local namespaced = {
}
local namespaces = {
- msubsup = "m",
- msub = "m",
- msup = "m",
- mn = "m",
- mi = "m",
- ms = "m",
- mo = "m",
- mtext = "m",
- mrow = "m",
- mfrac = "m",
- mroot = "m",
- msqrt = "m",
- munderover = "m",
- munder = "m",
- mover = "m",
- merror = "m",
- math = "m",
- mrow = "m",
- mtable = "m",
- mtr = "m",
- mtd = "m",
- mfenced = "m",
- maction = "m",
- mspace = "m",
+ msubsup = "m",
+ msub = "m",
+ msup = "m",
+ mn = "m",
+ mi = "m",
+ ms = "m",
+ mo = "m",
+ mtext = "m",
+ mrow = "m",
+ mfrac = "m",
+ mroot = "m",
+ msqrt = "m",
+ munderover = "m",
+ munder = "m",
+ mover = "m",
+ merror = "m",
+ math = "m",
+ mrow = "m",
+ mtable = "m",
+ mtr = "m",
+ mtd = "m",
+ mfenced = "m",
+ maction = "m",
+ mspace = "m",
+ -- only when testing
+ mstacker = "m",
+ mstackertop = "m",
+ mstackermid = "m",
+ mstackerbot = "m",
}
setmetatableindex(namespaced, function(t,k)
@@ -244,171 +280,224 @@ end)
local function attribute(key,value)
if value and value ~= "" then
- return formatters[' %s="%s"'](key,gsub(value,".",attribentities))
+ return f_attribute(key,lpegmatch(p_attribute,value))
else
return ""
end
end
--- local P, C, Cc = lpeg.P, lpeg.C, lpeg.Cc
---
--- local dash, colon = P("-"), P(":")
---
--- local precolon, predash, rest = P((1-colon)^1), P((1-dash )^1), P(1)^1
---
--- local tagsplitter = C(precolon) * colon * C(predash) * dash * C(rest) +
--- C(predash) * dash * Cc(nil) * C(rest)
+local function setattribute(di,key,value,escaped)
+ if value and value ~= "" then
+ local a = di.attributes
+ if escaped then
+ value = lpegmatch(p_escaped,value)
+ end
+ if not a then
+ di.attributes = { [key] = value }
+ else
+ a[key] = value
+ end
+ end
+end
-local listdata = { }
+local listdata = { } -- this has to be done otherwise: each element can just point back to ...
-local function hashlistdata()
+function wrapups.hashlistdata()
local c = structures.lists.collected
for i=1,#c do
local ci = c[i]
local tag = ci.references.tag
if tag then
local m = ci.metadata
- listdata[m.kind .. ":" .. m.name .. "-" .. tag] = ci
+-- listdata[m.kind .. ":" .. m.name .. "-" .. tag] = ci
+ listdata[m.kind .. ">" .. tag] = ci
end
end
end
-local spaces = utilities.strings.newrepeater(" ",-1)
-
-function structurestags.setattributehash(fulltag,key,value) -- public hash
- if type(fulltag) == "number" then
- fulltag = taglist[fulltag]
- if fulltag then
- fulltag = fulltag[#fulltag]
- end
- end
- if fulltag then
- local ah = attributehash[fulltag] -- could be metatable magic
- if not ah then
- ah = { }
- attributehash[fulltag] = ah
- end
- ah[key] = value
+function structurestags.setattributehash(attr,key,value) -- public hash
+ local specification = taglist[attr]
+ if specification then
+ specification[key] = value
+ else
+ -- some kind of error
end
end
+local usedstyles = { }
--- experiment: styles and images
---
--- officially we should convert to bp but we round anyway
+local namespacetemplate = [[
+/* %what% for file %filename% */
-local usedstyles = { }
+@namespace context url('%namespace%') ;
+]]
+
+do
--- /* padding : ; */
--- /* text-justify : inter-word ; */
+ -- experiment: styles and images
+ --
+ -- officially we should convert to bp but we round anyway
+
+ -- /* padding : ; */
+ -- /* text-justify : inter-word ; */
local documenttemplate = [[
document {
- font-size : %s !important ;
- max-width : %s !important ;
- text-align : %s !important ;
- hyphens : %s !important ;
+ font-size : %size% !important ;
+ max-width : %width% !important ;
+ text-width : %align% !important ;
+ hyphens : %hyphens% !important ;
}
]]
local styletemplate = [[
-%s[detail='%s'] {
- font-style : %s ;
- font-variant : %s ;
- font-weight : %s ;
- font-family : %s ;
- color : %s ;
+%element%[detail="%detail%"], context|div.%element%.%detail% {
+ display : inline ;
+ font-style : %style% ;
+ font-variant : %variant% ;
+ font-weight : %weight% ;
+ font-family : %family% ;
+ color : %color% ;
}]]
-local function allusedstyles(xmlfile)
- local result = { format("/* styles for file %s */",xmlfile) }
- --
- local bodyfont = finetuning.bodyfont
- local width = finetuning.width
- local hyphen = finetuning.hyphen
- local align = finetuning.align
- --
- if not bodyfont or bodyfont == "" then
- bodyfont = "12pt"
- elseif type(bodyfont) == "number" then
- bodyfont = number.todimen(bodyfont,"pt","%ipt") or "12pt"
- end
- if not width or width == "" then
- width = "50em"
- elseif type(width) == "number" then
- width = number.todimen(width,"pt","%ipt") or "50em"
- end
- if hyphen == variables.yes then
- hyphen = "manual"
- else
- hyphen = "inherited"
- end
- if align then
- align = numbertoallign[align]
- end
- if not align then
- align = hyphens and "justify" or "inherited"
+ local numbertoallign = {
+ [0] = "justify", ["0"] = "justify", [v_normal ] = "justify",
+ [1] = "right", ["1"] = "right", [v_flushright] = "right",
+ [2] = "center", ["2"] = "center", [v_middle ] = "center",
+ [3] = "left", ["3"] = "left", [v_flushleft ] = "left",
+ }
+
+ function wrapups.allusedstyles(basename)
+ local result = { replacetemplate(namespacetemplate, {
+ what = "styles",
+ filename = basename,
+ namespace = contextns,
+ }) }
+ --
+ local bodyfont = finetuning.bodyfont
+ local width = finetuning.width
+ local hyphen = finetuning.hyphen
+ local align = finetuning.align
+ --
+ if type(bodyfont) == "number" then
+ bodyfont = todimen(bodyfont)
+ else
+ bodyfont = "12pt"
+ end
+ if type(width) == "number" then
+ width = todimen(width) or "50em"
+ else
+ width = "50em"
+ end
+ if hyphen == v_yes then
+ hyphen = "manual"
+ else
+ hyphen = "inherited"
+ end
+ if align then
+ align = numbertoallign[align]
+ end
+ if not align then
+ align = hyphens and "justify" or "inherited"
+ end
+ --
+ result[#result+1] = replacetemplate(documenttemplate,{
+ size = bodyfont,
+ width = width,
+ align = align,
+ hyphens = hyphen
+ })
+ --
+ local colorspecification = xml.css.colorspecification
+ local fontspecification = xml.css.fontspecification
+ for element, details in sortedhash(usedstyles) do
+ for detail, data in sortedhash(details) do
+ local s = fontspecification(data.style)
+ local c = colorspecification(data.color)
+ detail = gsub(detail,"[^A-Za-z0-9]+","-")
+ result[#result+1] = replacetemplate(styletemplate,{
+ element = element,
+ detail = detail,
+ style = s.style or "inherit",
+ variant = s.variant or "inherit",
+ weight = s.weight or "inherit",
+ family = s.family or "inherit",
+ color = c or "inherit",
+ })
+ end
+ end
+ return concat(result,"\n\n")
end
- --
- result[#result+1] = format(documenttemplate,bodyfont,width,align,hyphen)
- --
- local colorspecification = xml.css.colorspecification
- local fontspecification = xml.css.fontspecification
- for element, details in sortedhash(usedstyles) do
- for detail, data in sortedhash(details) do
- local s = fontspecification(data.style)
- local c = colorspecification(data.color)
- result[#result+1] = formatters[styletemplate](element,detail,
- s.style or "inherit",
- s.variant or "inherit",
- s.weight or "inherit",
- s.family or "inherit",
- c or "inherit")
- end
- end
- return concat(result,"\n\n")
+
end
local usedimages = { }
+do
+
local imagetemplate = [[
-%s[id="%s"] {
+%element%[id="%id%"], context|div.%element%[id="%id%"] {
display : block ;
- background-image : url(%s) ;
+ background-image : url('%url%') ;
background-size : 100%% auto ;
background-repeat : no-repeat ;
- width : %s ;
- height : %s ;
+ width : %width% ;
+ height : %height% ;
}]]
-local function allusedimages(xmlfile)
- local result = { format("/* images for file %s */",xmlfile) }
- for element, details in sortedhash(usedimages) do
- for detail, data in sortedhash(details) do
- local name = data.name
- if file.suffix(name) == "pdf" then
- -- temp hack .. we will have a remapper
- name = file.replacesuffix(name,"svg")
- end
- result[#result+1] = formatters[imagetemplate](element,detail,name,data.width,data.height)
- end
- end
- return concat(result,"\n\n")
-end
+ local f_svgname = formatters["%s.svg"]
+ local f_svgpage = formatters["%s-page-%s.svg"]
+ local collected = { }
-local function uniqueusedimages()
- local unique = { }
- for element, details in next, usedimages do
- for detail, data in next, details do
- local name = data.name
- if file.suffix(name) == "pdf" then
- unique[file.replacesuffix(name,"svg")] = name
+ local function usedname(name,page)
+ if file.suffix(name) == "pdf" then
+ -- temp hack .. we will have a remapper
+ if page and page > 1 then
+ name = f_svgpage(file.nameonly(name),page)
else
- unique[name] = name
+ name = f_svgname(file.nameonly(name))
end
end
+ local scheme = url.hasscheme(name)
+ if not scheme or scheme == "file" then
+ -- or can we just use the name ?
+ return file.join("../images",file.basename(url.filename(name)))
+ else
+ return name
+ end
+ end
+
+ function wrapups.allusedimages(basename)
+ local result = { replacetemplate(namespacetemplate, {
+ what = "images",
+ filename = basename,
+ namespace = contextns,
+ }) }
+ for element, details in sortedhash(usedimages) do
+ for detail, data in sortedhash(details) do
+ local name = data.name
+ local page = tonumber(data.page) or 1
+ local spec = {
+ element = element,
+ id = data.id,
+ name = name,
+ page = page,
+ url = usedname(name,page),
+ width = data.width,
+ height = data.height,
+ used = data.used,
+ }
+ result[#result+1] = replacetemplate(imagetemplate,spec)
+ collected[detail] = spec
+ end
+ end
+ return concat(result,"\n\n")
end
- return unique
+
+ function wrapups.uniqueusedimages() -- todo: combine these two
+ return collected
+ end
+
end
--
@@ -419,13 +508,14 @@ properties.vspace = { export = "break", nature = "display" }
local function makebreaklist(list)
nofbreaks = nofbreaks + 1
local t = { }
- if list then
+ local l = list and list.taglist
+ if l then
for i=1,#list do
- t[i] = list[i]
+ t[i] = l[i]
end
end
- t[#t+1] = "break-" .. nofbreaks -- maybe no number
- return t
+ t[#t+1] = "break>" .. nofbreaks -- maybe no number or 0
+ return { taglist = t }
end
local breakattributes = {
@@ -436,7 +526,7 @@ local function makebreaknode(attributes) -- maybe no fulltag
nofbreaks = nofbreaks + 1
return {
tg = "break",
- fulltag = "break-" .. nofbreaks,
+ fulltag = "break>" .. nofbreaks,
n = nofbreaks,
element = "break",
nature = "display",
@@ -447,1235 +537,1747 @@ local function makebreaknode(attributes) -- maybe no fulltag
}
end
-local fields = { "title", "subtitle", "author", "keywords" }
+local function ignorebreaks(di,element,n,fulltag)
+ local data = di.data
+ for i=1,#data do
+ local d = data[i]
+ if d.content == " " then
+ d.content = ""
+ end
+ end
+end
-local function checkdocument(root)
- local data = root.data
- if data then
- for i=1,#data do
- local di = data[i]
- local tg = di.tg
- if tg == "noexport" then
- local ud = userdata[di.fulltag]
- local comment = ud and ud.comment
- if comment then
- di.element = "comment"
- di.data = { { content = comment } }
- ud.comment = nil
+local function ignorespaces(di,element,n,fulltag)
+ local data = di.data
+ for i=1,#data do
+ local d = data[i]
+ local c = d.content
+ if type(c) == "string" then
+ d.content = lpegmatch(p_stripper,c)
+ end
+ end
+end
+
+do
+
+ local fields = { "title", "subtitle", "author", "keywords" }
+
+ local function checkdocument(root)
+ local data = root.data
+ if data then
+ for i=1,#data do
+ local di = data[i]
+ local tg = di.tg
+ if tg == "noexport" then
+ local s = specifications[di.fulltag]
+ local u = s and s.userdata
+ if u then
+ local comment = u.comment
+ if comment then
+ di.element = "comment"
+ di.data = { { content = comment } }
+ u.comment = nil
+ else
+ data[i] = false
+ end
+ else
+ data[i] = false
+ end
+ elseif di.content then
+ -- okay
+ elseif tg == "ignore" then
+ di.element = ""
+ checkdocument(di)
else
- data[i] = false
- -- di.element = ""
- -- di.data = nil
+ checkdocument(di) -- new, else no noexport handling
end
- elseif di.content then
- -- okay
- elseif tg == "ignore" then
- di.element = ""
- checkdocument(di)
- else
- checkdocument(di) -- new, else no noexport handling
end
end
end
-end
-function extras.document(result,element,detail,n,fulltag,di)
- result[#result+1] = format(" language=%q",languagenames[texgetcount("mainlanguagenumber")])
- if not less_state then
- result[#result+1] = format(" file=%q",tex.jobname)
- result[#result+1] = format(" date=%q",os.date())
- result[#result+1] = format(" context=%q",environment.version)
- result[#result+1] = format(" version=%q",exportversion)
- result[#result+1] = format(" xmlns:m=%q","http://www.w3.org/1998/Math/MathML")
- local identity = interactions.general.getidentity()
- for i=1,#fields do
- local key = fields[i]
- local value = identity[key]
- if value and value ~= "" then
- result[#result+1] = formatters[" %s=%q"](key,value)
+ function extras.document(di,element,n,fulltag)
+ setattribute(di,"language",languagenames[texgetcount("mainlanguagenumber")])
+ if not less_state then
+ setattribute(di,"file",tex.jobname)
+ setattribute(di,"date",os.date())
+ setattribute(di,"context",environment.version)
+ setattribute(di,"version",exportversion)
+ setattribute(di,"xmlns:m",mathmlns)
+ local identity = interactions.general.getidentity()
+ for i=1,#fields do
+ local key = fields[i]
+ local value = identity[key]
+ if value and value ~= "" then
+ setattribute(di,key,value)
+ end
end
end
+ checkdocument(di)
end
- checkdocument(di)
+
end
-local itemgroups = { }
+do
-function structurestags.setitemgroup(current,packed,symbol)
- itemgroups[detailedtag("itemgroup",current)] = {
- packed = packed,
- symbol = symbol,
- }
-end
+ local itemgroups = { }
-function extras.itemgroup(result,element,detail,n,fulltag,di)
- local hash = itemgroups[fulltag]
- if hash then
- local v = hash.packed
- if v then
- result[#result+1] = " packed='yes'"
+ function structurestags.setitemgroup(packed,level,symbol)
+ itemgroups[locatedtag("itemgroup")] = {
+ packed = packed,
+ symbol = symbol,
+ level = level,
+ }
+ end
+
+ function structurestags.setitem(kind)
+ itemgroups[locatedtag("item")] = {
+ kind = kind,
+ }
+ end
+
+ function extras.itemgroup(di,element,n,fulltag)
+ local hash = itemgroups[fulltag]
+ if hash then
+ setattribute(di,"packed",hash.packed and "yes" or nil)
+ setattribute(di,"symbol",hash.symbol)
+ setattribute(di,"level",hash.level)
end
- local v = hash.symbol
- if v then
- result[#result+1] = attribute("symbol",v)
+ end
+
+ function extras.item(di,element,n,fulltag)
+ local hash = itemgroups[fulltag]
+ if hash then
+ local kind = hash.kind
+ if kind and kind ~= "" then
+ setattribute(di,"kind",kind)
+ end
end
end
+
end
-local synonyms = { }
+do
-function structurestags.setsynonym(current,tag)
- synonyms[detailedtag("synonym",current)] = tag
-end
+ local synonyms = { }
+ local sortings = { }
-function extras.synonym(result,element,detail,n,fulltag,di)
- local tag = synonyms[fulltag]
- if tag then
- result[#result+1] = formatters[" tag='%s'"](tag)
+ function structurestags.setsynonym(tag)
+ synonyms[locatedtag("synonym")] = tag
end
-end
-local sortings = { }
+ function extras.synonym(di,element,n,fulltag)
+ local tag = synonyms[fulltag]
+ if tag then
+ setattribute(di,"tag",tag)
+ end
+ end
-function structurestags.setsorting(current,tag)
- sortings[detailedtag("sorting",current)] = tag
-end
+ function structurestags.setsorting(tag)
+ sortings[locatedtag("sorting")] = tag
+ end
-function extras.sorting(result,element,detail,n,fulltag,di)
- local tag = sortings[fulltag]
- if tag then
- result[#result+1] = formatters[" tag='%s'"](tag)
+ function extras.sorting(di,element,n,fulltag)
+ local tag = sortings[fulltag]
+ if tag then
+ setattribute(di,"tag",tag)
+ end
end
+
end
-usedstyles.highlight = { }
+do
-function structurestags.sethighlight(current,style,color) -- we assume global styles
- usedstyles.highlight[current] = {
- style = style, -- xml.css.fontspecification(style),
- color = color, -- xml.css.colorspec(color),
- }
-end
+ local highlight = { }
+ usedstyles.highlight = highlight
-local descriptions = { }
-local symbols = { }
-local linked = { }
+ local strippedtag = structurestags.strip -- we assume global styles
-function structurestags.setdescription(tag,n)
- local nd = structures.notes.get(tag,n) -- todo: use listdata instead
- if nd then
- local references = nd.references
- descriptions[references and references.internal] = detailedtag("description",tag)
+ function structurestags.sethighlight(style,color)
+ highlight[strippedtag(locatedtag("highlight"))] = {
+ style = style, -- xml.css.fontspecification(style),
+ color = color, -- xml.css.colorspec(color),
+ }
end
+
end
-function structurestags.setdescriptionsymbol(tag,n)
- local nd = structures.notes.get(tag,n) -- todo: use listdata instead
- if nd then
- local references = nd.references
- symbols[references and references.internal] = detailedtag("descriptionsymbol",tag)
+do
+
+ -- is this referencing still needed?
+
+ local descriptions = { }
+ local symbols = { }
+ local linked = { }
+
+ function structurestags.setdescription(tag,n) -- needs checking (is tag needed)
+ -- we can also use the internals hash or list
+ local nd = structures.notes.get(tag,n)
+ if nd then
+ local references = nd.references
+ descriptions[references and references.internal] = locatedtag("description")
+ end
end
-end
-function finalizers.descriptions(tree)
- local n = 0
- for id, tag in next, descriptions do
- local sym = symbols[id]
- if sym then
- n = n + 1
- linked[tag] = n
- linked[sym] = n
+ function structurestags.setdescriptionsymbol(tag,n) -- needs checking (is tag needed)
+ local nd = structures.notes.get(tag,n) -- todo: use listdata instead
+ if nd then
+ local references = nd.references
+ symbols[references and references.internal] = locatedtag("descriptionsymbol")
end
end
-end
-function extras.description(result,element,detail,n,fulltag,di)
- local id = linked[fulltag]
- if id then
- result[#result+1] = formatters[" insert='%s'"](id) -- maybe just fulltag
+ function finalizers.descriptions(tree)
+ local n = 0
+ for id, tag in next, descriptions do
+ local sym = symbols[id]
+ if sym then
+ n = n + 1
+ linked[tag] = n
+ linked[sym] = n
+ end
+ end
end
-end
-function extras.descriptionsymbol(result,element,detail,n,fulltag,di)
- local id = linked[fulltag]
- if id then
- result[#result+1] = formatters[" insert='%s'"](id)
+ function extras.description(di,element,n,fulltag)
+ local id = linked[fulltag]
+ if id then
+ setattribute(di,"insert",id)
+ end
end
-end
-usedimages.image = { }
+ function extras.descriptionsymbol(di,element,n,fulltag)
+ local id = linked[fulltag]
+ if id then
+ setattribute(di,"insert",id)
+ end
+ end
-function structurestags.setfigure(name,page,width,height)
- usedimages.image[detailedtag("image")] = {
- name = name,
- page = page,
- width = number.todimen(width, "cm","%0.3Fcm"),
- height = number.todimen(height,"cm","%0.3Fcm"),
- }
end
-function extras.image(result,element,detail,n,fulltag,di)
- local data = usedimages.image[fulltag]
- if data then
- result[#result+1] = attribute("name",data.name)
- if tonumber(data.page) > 1 then
- result[#result+1] = formatters[" page='%s'"](data.page)
+-- -- todo: ignore breaks
+--
+-- function extras.verbatimline(di,element,n,fulltag)
+-- inspect(di)
+-- end
+
+do
+
+ local image = { }
+ usedimages.image = image
+
+ function structurestags.setfigure(name,used,page,width,height)
+ local fulltag = locatedtag("image")
+ local spec = specifications[fulltag]
+ local page = tonumber(page)
+ image[fulltag] = {
+ id = f_id(spec.tagname,spec.tagindex),
+ name = name,
+ used = used,
+ page = page and page > 1 and page or nil,
+ width = todimen(width, "cm","%0.3F%s"),
+ height = todimen(height,"cm","%0.3F%s"),
+ }
+ end
+
+ function extras.image(di,element,n,fulltag)
+ local data = image[fulltag]
+ if data then
+ setattribute(di,"name",data.name)
+ setattribute(di,"page",data.page)
+ setattribute(di,"id",data.id)
+ setattribute(di,"width",data.width)
+ setattribute(di,"height",data.height)
end
- result[#result+1] = formatters[" id='%s' width='%s' height='%s'"](fulltag,data.width,data.height)
end
+
end
-local combinations = { }
+do
-function structurestags.setcombination(nx,ny)
- combinations[detailedtag("combination")] = {
- nx = nx,
- ny = ny,
- }
-end
+ local combinations = { }
+
+ function structurestags.setcombination(nx,ny)
+ combinations[locatedtag("combination")] = {
+ nx = nx,
+ ny = ny,
+ }
+ end
-function extras.combination(result,element,detail,n,fulltag,di)
- local data = combinations[fulltag]
- if data then
- result[#result+1] = formatters[" nx='%s' ny='%s'"](data.nx,data.ny)
+ function extras.combination(di,element,n,fulltag)
+ local data = combinations[fulltag]
+ if data then
+ setattribute(di,"nx",data.nx)
+ setattribute(di,"ny",data.ny)
+ end
end
+
end
-- quite some code deals with exporting references --
+-- links:
+--
+-- url :
+-- file :
+-- internal : automatic location
+-- location : named reference
+
+-- references:
+--
+-- implicit : automatic reference
+-- explicit : named reference
+
local evaluators = { }
local specials = { }
+local explicits = { }
-evaluators.inner = function(result,var)
+evaluators.inner = function(di,var)
local inner = var.inner
if inner then
- result[#result+1] = attribute("location",inner)
+ setattribute(di,"location",inner,true)
end
end
-evaluators.outer = function(result,var)
+evaluators.outer = function(di,var)
local file, url = references.checkedfileorurl(var.outer,var.outer)
if url then
- result[#result+1] = attribute("url",url)
+ setattribute(di,"url",url,true)
elseif file then
- result[#result+1] = attribute("file",file)
+ setattribute(di,"file",file,true)
end
end
-evaluators["outer with inner"] = function(result,var)
+evaluators["outer with inner"] = function(di,var)
local file = references.checkedfile(var.f)
if file then
- result[#result+1] = attribute("file",file)
+ setattribute(di,"file",file,true)
end
local inner = var.inner
if inner then
- result[#result+1] = attribute("location",inner)
+ setattribute(di,"inner",inner,true)
end
end
-evaluators.special = function(result,var)
+evaluators.special = function(di,var)
local handler = specials[var.special]
if handler then
- handler(result,var)
+ handler(di,var)
end
end
-evaluators["special outer with operation"] = evaluators.special
-evaluators["special operation"] = evaluators.special
-evaluators["special operation with arguments"] = evaluators.special
+local referencehash = { }
-function specials.url(result,var)
- local url = references.checkedurl(var.operation)
- if url then
- result[#result+1] = attribute("url",url)
- end
-end
+do
-function specials.file(result,var)
- local file = references.checkedfile(var.operation)
- if file then
- result[#result+1] = attribute("file",file)
+ evaluators["special outer with operation"] = evaluators.special
+ evaluators["special operation"] = evaluators.special
+ evaluators["special operation with arguments"] = evaluators.special
+
+ function specials.url(di,var)
+ local url = references.checkedurl(var.operation)
+ if url and url ~= "" then
+ setattribute(di,"url",url,true)
+ end
end
-end
-function specials.fileorurl(result,var)
- local file, url = references.checkedfileorurl(var.operation,var.operation)
- if url then
- result[#result+1] = attribute("url",url)
- elseif file then
- result[#result+1] = attribute("file",file)
+ function specials.file(di,var)
+ local file = references.checkedfile(var.operation)
+ if file and file ~= "" then
+ setattribute(di,"file",file,true)
+ end
end
-end
-function specials.internal(result,var)
- local internal = references.checkedurl(var.operation)
- if internal then
- result[#result+1] = formatters[" location='aut:%s'"](internal)
+ function specials.fileorurl(di,var)
+ local file, url = references.checkedfileorurl(var.operation,var.operation)
+ if url and url ~= "" then
+ setattribute(di,"url",url,true)
+ elseif file and file ~= "" then
+ setattribute(di,"file",file,true)
+ end
end
-end
-local referencehash = { }
+ function specials.internal(di,var)
+ local internal = references.checkedurl(var.operation)
+ if internal then
+ setattribute(di,"location",internal)
+ end
+ end
-local function adddestination(result,references) -- todo: specials -> exporters and then concat
- if references then
- local reference = references.reference
- if reference and reference ~= "" then
- local prefix = references.prefix
- if prefix and prefix ~= "" then
- result[#result+1] = formatters[" prefix='%s'"](prefix)
- end
- result[#result+1] = formatters[" destination='%s'"](reference)
- for i=1,#references do
- local r = references[i]
- local e = evaluators[r.kind]
- if e then
- e(result,r)
+ local function adddestination(di,references) -- todo: specials -> exporters and then concat
+ if references then
+ local reference = references.reference
+ if reference and reference ~= "" then
+ local prefix = references.prefix
+ if prefix and prefix ~= "" then
+ setattribute(di,"prefix",prefix,true)
+ end
+ setattribute(di,"destination",reference,true)
+ for i=1,#references do
+ local r = references[i]
+ local e = evaluators[r.kind]
+ if e then
+ e(di,r)
+ end
end
end
end
end
-end
-local function addreference(result,references)
- if references then
- local reference = references.reference
- if reference and reference ~= "" then
- local prefix = references.prefix
- if prefix and prefix ~= "" then
- result[#result+1] = formatters[" prefix='%s'"](prefix)
+ function extras.addimplicit(di,references)
+ if references then
+ local internal = references.internal
+ if internal then
+ setattribute(di,"implicit",internal)
end
- result[#result+1] = formatters[" reference='%s'"](reference)
end
- local internal = references.internal
- if internal and internal ~= "" then
- result[#result+1] = formatters[" location='aut:%s'"](internal)
+ end
+
+ function extras.addinternal(di,references)
+ if references then
+ local internal = references.internal
+ if internal then
+ setattribute(di,"internal",internal)
+ end
end
end
-end
-function extras.link(result,element,detail,n,fulltag,di)
- -- for instance in lists a link has nested elements and no own text
- local reference = referencehash[fulltag]
- if reference then
- adddestination(result,structures.references.get(reference))
- return true
- else
- local data = di.data
- if data then
- for i=1,#data do
- local di = data[i]
- if di then
- local fulltag = di.fulltag
- if fulltag and extras.link(result,element,detail,n,fulltag,di) then
- return true
+ local p_firstpart = lpeg.Cs((1-lpeg.P(","))^0)
+
+ local function addreference(di,references)
+ if references then
+ local reference = references.reference
+ if reference and reference ~= "" then
+ local prefix = references.prefix
+ if prefix and prefix ~= "" then
+ setattribute(di,"prefix",prefix)
+ end
+ setattribute(di,"reference",reference,true)
+ setattribute(di,"explicit",lpegmatch(p_firstpart,reference),true)
+ end
+ local internal = references.internal
+ if internal and internal ~= "" then
+ setattribute(di,"implicit",internal)
+ end
+ end
+ end
+
+ local function link(di,element,n,fulltag)
+ -- for instance in lists a link has nested elements and no own text
+ local reference = referencehash[fulltag]
+ if reference then
+ adddestination(di,structures.references.get(reference))
+ return true
+ else
+ local data = di.data
+ if data then
+ for i=1,#data do
+ local di = data[i]
+ if di then
+ local fulltag = di.fulltag
+ if fulltag and link(di,element,n,fulltag) then
+ return true
+ end
end
end
end
end
end
+
+ extras.adddestination = adddestination
+ extras.addreference = addreference
+
+ extras.link = link
+
end
-- no settings, as these are obscure ones
-local automathrows = true directives.register("backend.export.math.autorows", function(v) automathrows = v end)
-local automathapply = true directives.register("backend.export.math.autoapply", function(v) automathapply = v end)
-local automathnumber = true directives.register("backend.export.math.autonumber", function(v) automathnumber = v end)
-local automathstrip = true directives.register("backend.export.math.autostrip", function(v) automathstrip = v end)
-
-local functions = mathematics.categories.functions
-
-local function collapse(di,i,data,ndata,detail,element)
- local collapsing = di.data
- if data then
- di.element = element
- di.detail = nil
- i = i + 1
- while i <= ndata do
- local dn = data[i]
- if dn.detail == detail then
- collapsing[#collapsing+1] = dn.data[1]
- dn.skip = "ignore"
- i = i + 1
- else
- break
+do
+
+ local automathrows = true directives.register("backend.export.math.autorows", function(v) automathrows = v end)
+ local automathapply = true directives.register("backend.export.math.autoapply", function(v) automathapply = v end)
+ local automathnumber = true directives.register("backend.export.math.autonumber", function(v) automathnumber = v end)
+ local automathstrip = true directives.register("backend.export.math.autostrip", function(v) automathstrip = v end)
+
+ local functions = mathematics.categories.functions
+
+ local function collapse(di,i,data,ndata,detail,element)
+ local collapsing = di.data
+ if data then
+ di.element = element
+ di.detail = nil
+ i = i + 1
+ while i <= ndata do
+ local dn = data[i]
+ if dn.detail == detail then
+ collapsing[#collapsing+1] = dn.data[1]
+ dn.skip = "ignore"
+ i = i + 1
+ else
+ break
+ end
end
end
+ return i
end
- return i
-end
-local function collapse_mn(di,i,data,ndata)
- local collapsing = di.data
- if data then
- i = i + 1
- while i <= ndata do
- local dn = data[i]
- local tg = dn.tg
- if tg == "mn" then
- collapsing[#collapsing+1] = dn.data[1]
- dn.skip = "ignore"
- i = i + 1
- elseif tg == "mo" then
- local d = dn.data[1]
- if d == "." then
- collapsing[#collapsing+1] = d
+ local function collapse_mn(di,i,data,ndata)
+ -- this is tricky ... we need to make sure that we wrap in mrows if we want
+ -- to bypass this one
+ local collapsing = di.data
+ if data then
+ i = i + 1
+ while i <= ndata do
+ local dn = data[i]
+ local tg = dn.tg
+ if tg == "mn" then
+ collapsing[#collapsing+1] = dn.data[1]
dn.skip = "ignore"
i = i + 1
+ elseif tg == "mo" then
+ local d = dn.data[1]
+ if d == "." then
+ collapsing[#collapsing+1] = d
+ dn.skip = "ignore"
+ i = i + 1
+ else
+ break
+ end
else
break
end
- else
- break
end
end
+ return i
end
- return i
-end
--- maybe delay __i__ till we need it
+ -- maybe delay __i__ till we need it
-local apply_function = {
- {
- element = "mo",
- -- comment = "apply function",
- -- data = { utfchar(0x2061) },
- data = { "&#x2061;" },
- nature = "mixed",
+ local apply_function = {
+ {
+ element = "mo",
+ -- comment = "apply function",
+ -- data = { utfchar(0x2061) },
+ data = { "&#x2061;" },
+ nature = "mixed",
+ }
}
-}
-local functioncontent = { }
+ local functioncontent = { }
-setmetatableindex(functioncontent,function(t,k)
- local v = { { content = k } }
- t[k] = v
- return v
-end)
+ setmetatableindex(functioncontent,function(t,k)
+ local v = { { content = k } }
+ t[k] = v
+ return v
+ end)
+
+ local dummy_nucleus = {
+ element = "mtext",
+ data = { content = "" },
+ nature = "inline",
+ comment = "dummy nucleus",
+ fulltag = "mtext>0"
+ }
-local function checkmath(root) -- we can provide utf.toentities as an option
- local data = root.data
- if data then
- local ndata = #data
- local roottg = root.tg
- if roottg == "msubsup" then
- local nucleus, superscript, subscript
- for i=1,ndata do
- local di = data[i]
- if not di then
- -- weird
- elseif di.content then
- -- text
- elseif not nucleus then
- nucleus = i
- elseif not superscript then
- superscript = i
- elseif not subscript then
- subscript = i
- else
- -- error
+ local function accentchar(d)
+ for i=1,3 do
+ d = d.data
+ if not d then
+ return
+ end
+ d = d[1]
+ if not d then
+ return
+ end
+ local tg = d.tg
+ if tg == "mover" then
+ local s = specifications[d.fulltag]
+ local t = s.top
+ if t then
+ d = d.data[1]
+ local d1 = d.data[1]
+ d1.content = utfchar(t)
+ d.data = { d1 }
+ return d
+ end
+ elseif tg == "munder" then
+ local s = specifications[d.fulltag]
+ local b = s.bottom
+ if b then
+ d = d.data[1]
+ local d1 = d.data[1]
+ d1.content = utfchar(b)
+ d.data = { d1 }
+ return d
end
end
- if superscript and subscript then
- local sup, sub = data[superscript], data[subscript]
- data[superscript], data[subscript] = sub, sup
- -- sub.__o__, sup.__o__ = subscript, superscript
- sub.__i__, sup.__i__ = superscript, subscript
- end
- elseif roottg == "mfenced" then
- local new, n = { }, 0
- local attributes = { }
- root.attributes = attributes
- for i=1,ndata do
- local di = data[i]
- if not di then
- -- weird
- elseif di.content then
- n = n + 1
- new[n] = di
- else
- local tg = di.tg
- if tg == "mleft" then
- attributes.left = tostring(di.data[1].data[1].content)
- elseif tg == "mmiddle" then
- attributes.middle = tostring(di.data[1].data[1].content)
- elseif tg == "mright" then
- attributes.right = tostring(di.data[1].data[1].content)
+ end
+ end
+
+ local no_mrow = {
+ mrow = true,
+ mfenced = true,
+ mfrac = true,
+ mroot = true,
+ msqrt = true,
+ mi = true,
+ mo = true,
+ mn = true,
+ }
+
+ local function checkmath(root) -- we can provide utf.toentities as an option
+ local data = root.data
+ if data then
+ local ndata = #data
+ local roottg = root.tg
+ if roottg == "msubsup" then
+ local nucleus, superscript, subscript
+ for i=1,ndata do
+ local di = data[i]
+ if not di then
+ -- weird
+ elseif di.content then
+ -- text
+ elseif not nucleus then
+ nucleus = i
+ elseif not superscript then
+ superscript = i
+ elseif not subscript then
+ subscript = i
else
- n = n + 1
- di.__i__ = n
- new[n] = di
+ -- error
+ end
+ end
+ if superscript and subscript then
+ local sup, sub = data[superscript], data[subscript]
+ data[superscript], data[subscript] = sub, sup
+ -- sub.__o__, sup.__o__ = subscript, superscript
+ sub.__i__, sup.__i__ = superscript, subscript
+ end
+-- elseif roottg == "msup" or roottg == "msub" then
+-- -- m$^2$
+-- if ndata == 1 then
+-- local d = data[1]
+-- data[2] = d
+-- d.__i__ = 2
+-- data[1] = dummy_nucleus
+-- end
+ elseif roottg == "mfenced" then
+ local s = specifications[root.fulltag]
+ local l, m, r = s.left, s.middle, s.right
+ if l then
+ l = utfchar(l)
+ end
+ if m then
+ local t = { }
+ for i=1,#m do
+ t[i] = utfchar(m[i])
end
+ m = concat(t)
end
+ if r then
+ r = utfchar(r)
+ end
+ root.attributes = {
+ open = l,
+ separators = m,
+ close = r,
+ }
end
- root.data = new
- ndata = n
- end
- if ndata == 0 then
- return
- elseif ndata == 1 then
- local d = data[1]
- if not d then
- return
- elseif d.content then
+ if ndata == 0 then
return
- elseif #root.data == 1 then
- local tg = d.tg
- if automathrows and roottg == "mrow" then
- -- maybe just always ! check spec first
- if tg == "mrow" or tg == "mfenced" or tg == "mfrac" or tg == "mroot" or tg == "msqrt"then
- root.skip = "comment"
- elseif tg == "mo" then
- root.skip = "comment"
- end
- elseif roottg == "mo" then
- if tg == "mo" then
- root.skip = "comment"
+ elseif ndata == 1 then
+ local d = data[1]
+ if not d then
+ return
+ elseif d.content then
+ return
+ elseif #root.data == 1 then
+ local tg = d.tg
+ if automathrows and roottg == "mrow" then
+ -- maybe just always ! check spec first
+ if no_mrow[tg] then
+ root.skip = "comment"
+ end
+ elseif roottg == "mo" then
+ if tg == "mo" then
+ root.skip = "comment"
+ end
end
end
end
- end
- local i = 1
- while i <= ndata do -- -- -- TOO MUCH NESTED CHECKING -- -- --
- local di = data[i]
- if di and not di.content then
- local tg = di.tg
- local detail = di.detail
- if tg == "math" then
- -- di.element = "mrow" -- when properties
- di.skip = "comment"
- checkmath(di)
- i = i + 1
- elseif tg == "mover" or tg == "munder" or tg == "munderover" then
- if detail == "accent" then
- di.attributes = { accent = "true" }
- di.detail = nil
- end
- checkmath(di)
- i = i + 1
- elseif tg == "mroot" then
- if #di.data == 1 then
- -- else firefox complains
- di.element = "msqrt"
- end
- checkmath(di)
- i = i + 1
- elseif tg == "break" then
- di.skip = "comment"
- i = i + 1
- elseif tg == "mrow" and detail then
- di.detail = nil
- checkmath(di)
- di = {
- element = "maction",
- nature = "display",
- attributes = { actiontype = detail },
- data = { di },
- n = 0,
- }
- data[i] = di
- i = i + 1
- elseif detail then
- -- no checkmath(di) here
- local category = tonumber(detail) or 0
- if category == 1 then -- mo
- i = collapse(di,i,data,ndata,detail,"mo")
- elseif category == 2 then -- mi
- i = collapse(di,i,data,ndata,detail,"mi")
- elseif category == 3 then -- mn
- i = collapse(di,i,data,ndata,detail,"mn")
- elseif category == 4 then -- ms
- i = collapse(di,i,data,ndata,detail,"ms")
- elseif category >= 1000 then
- local apply = category >= 2000
- if apply then
- category = category - 1000
+ local i = 1
+ while i <= ndata do -- -- -- TOO MUCH NESTED CHECKING -- -- --
+ local di = data[i]
+ if di and not di.content then
+ local tg = di.tg
+ if tg == "math" then
+ -- di.element = "mrow" -- when properties
+ di.skip = "comment"
+ checkmath(di)
+ i = i + 1
+ elseif tg == "mover" then
+ local s = specifications[di.fulltag]
+ if s.accent then
+ local t = s.top
+ local d = di.data
+ -- todo: accent = "false" (for scripts like limits)
+ di.attributes = {
+ accent = "true",
+ }
+ -- todo: p.topfixed
+ if t then
+ -- mover
+ d[1].data[1].content = utfchar(t)
+ di.data = { d[2], d[1] }
+ end
+ else
+ -- can't happen
end
- if tg == "mi" then -- function
- if roottg == "mrow" then
- root.skip = "comment"
- root.element = "function"
+ checkmath(di)
+ i = i + 1
+ elseif tg == "munder" then
+ local s = specifications[di.fulltag]
+ if s.accent then
+ local b = s.bottom
+ local d = di.data
+ -- todo: accent = "false" (for scripts like limits)
+ di.attributes = {
+ accent = "true",
+ }
+ -- todo: p.bottomfixed
+ if b then
+ -- munder
+ d[2].data[1].content = utfchar(b)
end
- i = collapse(di,i,data,ndata,detail,"mi")
- local tag = functions[category]
- if tag then
- di.data = functioncontent[tag]
+ else
+ -- can't happen
+ end
+ checkmath(di)
+ i = i + 1
+ elseif tg == "munderover" then
+ local s = specifications[di.fulltag]
+ if s.accent then
+ local t = s.top
+ local b = s.bottom
+ local d = di.data
+ -- todo: accent = "false" (for scripts like limits)
+ -- todo: accentunder = "false" (for scripts like limits)
+ di.attributes = {
+ accent = "true",
+ accentunder = "true",
+ }
+ -- todo: p.topfixed
+ -- todo: p.bottomfixed
+ if t and b then
+ -- munderover
+ d[1].data[1].content = utfchar(t)
+ d[3].data[1].content = utfchar(b)
+ di.data = { d[2], d[3], d[1] }
+ else
+ -- can't happen
end
- if apply then
- di.after = apply_function
- elseif automathapply then -- make function
- local following
- if i <= ndata then
- -- normally not the case
- following = data[i]
+ else
+ -- can't happen
+ end
+ checkmath(di)
+ i = i + 1
+ elseif tg == "mstacker" then
+ local d = di.data
+ local d1 = d[1]
+ local d2 = d[2]
+ local d3 = d[3]
+ local t1 = d1 and d1.tg
+ local t2 = d2 and d2.tg
+ local t3 = d3 and d3.tg
+ local m = nil -- d1.data[1]
+ local t = nil
+ local b = nil
+ -- only accent when top / bot have stretch
+ -- normally we flush [base under over] which is better for tagged pdf
+ if t1 == "mstackermid" then
+ m = accentchar(d1) -- or m
+ if t2 == "mstackertop" then
+ if t3 == "mstackerbot" then
+ t = accentchar(d2)
+ b = accentchar(d3)
+ di.element = "munderover"
+ di.data = { m or d1.data[1], b or d3.data[1], t or d2.data[1] }
else
- local parent = di.__p__ -- == root
- if parent.tg == "mrow" then
- parent = parent.__p__
- end
- local index = parent.__i__
- following = parent.data[index+1]
+ t = accentchar(d2)
+ di.element = "mover"
+ di.data = { m or d1.data[1], t or d2.data[1] }
+ end
+ elseif t2 == "mstackerbot" then
+ if t3 == "mstackertop" then
+ b = accentchar(d2)
+ t = accentchar(d3)
+ di.element = "munderover"
+ di.data = { m or d1.data[1], t or d3.data[1], m, b or d2.data[1] }
+ else
+ b = accentchar(d2)
+ di.element = "munder"
+ di.data = { m or d1.data[1], b or d2.data[1] }
end
- if following then
- local tg = following.tg
- if tg == "mrow" or tg == "mfenced" then -- we need to figure out the right condition
+ else
+ -- can't happen
+ end
+ else
+ -- can't happen
+ end
+ if t or b then
+ di.attributes = {
+ accent = t and "true" or nil,
+ accentunder = b and "true" or nil,
+ }
+ di.detail = nil
+ end
+ checkmath(di)
+ i = i + 1
+ elseif tg == "mroot" then
+ local data = di.data
+ local size = #data
+ if size == 1 then
+ -- else firefox complains ... code in math-tag (for pdf tagging)
+ di.element = "msqrt"
+ elseif size == 2 then
+ data[1], data[2] = data[2], data[1]
+ end
+ checkmath(di)
+ i = i + 1
+ elseif tg == "break" then
+ di.skip = "comment"
+ i = i + 1
+ elseif tg == "mtext" then
+ -- this is only needed for unboxed mtexts ... all kind of special
+ -- tex border cases and optimizations ... trial and error
+ local data = di.data
+ if #data > 1 then
+ for i=1,#data do
+ local di = data[i]
+ local content = di.content
+ if content then
+ data[i] = {
+ element = "mtext",
+ nature = "inline",
+ data = { di },
+ n = 0,
+ }
+ elseif di.tg == "math" then
+ local di = di.data[1]
+ data[i] = di
+ checkmath(di)
+ end
+ end
+ di.element = "mrow"
+ -- di.tg = "mrow"
+ -- di.nature = "inline"
+ end
+ checkmath(di)
+ i = i + 1
+ elseif tg == "mrow" and detail then -- hm, falls through
+ di.detail = nil
+ checkmath(di)
+ di = {
+ element = "maction",
+ nature = "display",
+ attributes = { actiontype = detail },
+ data = { di },
+ n = 0,
+ }
+ data[i] = di
+ i = i + 1
+ else
+ local category = di.mathcategory
+ if category then
+ -- no checkmath(di) here
+ if category == 1 then -- mo
+ i = collapse(di,i,data,ndata,detail,"mo")
+ elseif category == 2 then -- mi
+ i = collapse(di,i,data,ndata,detail,"mi")
+ elseif category == 3 then -- mn
+ i = collapse(di,i,data,ndata,detail,"mn")
+ elseif category == 4 then -- ms
+ i = collapse(di,i,data,ndata,detail,"ms")
+ elseif category >= 1000 then
+ local apply = category >= 2000
+ if apply then
+ category = category - 1000
+ end
+ if tg == "mi" then -- function
+ if roottg == "mrow" then
+ root.skip = "comment"
+ root.element = "function"
+ end
+ i = collapse(di,i,data,ndata,detail,"mi")
+ local tag = functions[category]
+ if tag then
+ di.data = functioncontent[tag]
+ end
+ if apply then
di.after = apply_function
+ elseif automathapply then -- make function
+ local following
+ if i <= ndata then
+ -- normally not the case
+ following = data[i]
+ else
+ local parent = di.__p__ -- == root
+ if parent.tg == "mrow" then
+ parent = parent.__p__
+ end
+ local index = parent.__i__
+ following = parent.data[index+1]
+ end
+ if following then
+ local tg = following.tg
+ if tg == "mrow" or tg == "mfenced" then -- we need to figure out the right condition
+ di.after = apply_function
+ end
+ end
end
+ else -- some problem
+ checkmath(di)
+ i = i + 1
end
+ else
+ checkmath(di)
+ i = i + 1
end
- else -- some problem
+ elseif automathnumber and tg == "mn" then
+ checkmath(di)
+ i = collapse_mn(di,i,data,ndata)
+ else
checkmath(di)
i = i + 1
end
- else
- checkmath(di)
- i = i + 1
end
- elseif automathnumber and tg == "mn" then
- checkmath(di)
- i = collapse_mn(di,i,data,ndata)
- else
- checkmath(di)
+ else -- can be string or boolean
+ if parenttg ~= "mtext" and di == " " then
+ data[i] = false
+ end
i = i + 1
end
- else -- can be string or boolean
- if parenttg ~= "mtext" and di == " " then
- data[i] = false
- end
- i = i + 1
end
end
end
-end
-function stripmath(di)
- if not di then
- --
- elseif di.content then
- return di
- else
- local tg = di.tg
- if tg == "mtext" or tg == "ms" then
+ local function stripmath(di)
+ if not di then
+ --
+ elseif di.content then
return di
else
- local data = di.data
- local ndata = #data
- local n = 0
- for i=1,ndata do
- local di = data[i]
- if di and not di.content then
- di = stripmath(di)
- end
- if di then
- local content = di.content
- if not content then
- n = n + 1
- di.__i__ = n
- data[n] = di
- elseif content == " " or content == "" then
- -- skip
- else
- n = n + 1
- data[n] = di
+ local tg = di.tg
+ if tg == "mtext" or tg == "ms" then
+ return di
+ else
+ local data = di.data
+ local ndata = #data
+ local n = 0
+ for i=1,ndata do
+ local d = data[i]
+ if d and not d.content then
+ d = stripmath(d)
+ end
+ if d then
+ local content = d.content
+ if not content then
+ n = n + 1
+ d.__i__ = n
+ data[n] = d
+ elseif content == " " or content == "" then
+ if di.tg == "mspace" then
+ -- we append or prepend a space to a preceding or following mtext
+ local parent = di.__p__
+ local index = di.__i__ -- == i
+ local data = parent.data
+ if index > 1 then
+ local d = data[index-1]
+ if d.tg == "mtext" then
+ local dd = d.data
+ local dn = dd[#dd]
+ local dc = dn.content
+ if dc then
+ dn.content = dc .. content
+ end
+ end
+ elseif index < ndata then
+ local d = data[index+1]
+ if d.tg == "mtext" then
+ local dd = d.data
+ local dn = dd[1]
+ local dc = dn.content
+ if dc then
+ dn.content = content .. dc
+ end
+ end
+ end
+ end
+ else
+ n = n + 1
+ data[n] = d
+ end
end
end
+ for i=ndata,n+1,-1 do
+ data[i] = nil
+ end
+ if #data > 0 then
+ return di
+ end
+-- end
end
- for i=ndata,n+1,-1 do
- data[i] = nil
- end
- if #data > 0 then
- return di
- end
+ -- could be integrated but is messy then
+-- while roottg == "mrow" and #data == 1 do
+-- data = data[1]
+-- for k, v in next, data do
+-- root[k] = v
+-- end
+-- roottg = data.tg
+-- end
+ end
+ end
+
+ function checks.math(di)
+ local specification = specifications[di.fulltag]
+ local mode = specification and specification.mode == "display" and "block" or "inline"
+ di.attributes = {
+ ["display"] = mode,
+ ["xmlns:m"] = mathmlns,
+ }
+ -- can be option if needed:
+ if mode == "inline" then
+ -- di.nature = "mixed" -- else spacing problem (maybe inline)
+ di.nature = "inline" -- we need to catch x$X$x and x $X$ x
+ else
+ di.nature = "display"
end
+ if automathstrip then
+ stripmath(di)
+ end
+ checkmath(di)
end
-end
-
-function checks.math(di)
- local hash = attributehash[di.fulltag]
- local mode = (hash and hash.mode) == "display" and "block" or "inline"
- di.attributes = {
- display = mode
- }
- -- can be option if needed:
- if mode == "inline" then
- di.nature = "mixed" -- else spacing problem (maybe inline)
- else
- di.nature = "display"
- end
- if automathstrip then
- stripmath(di)
- end
- checkmath(di)
-end
-local a, z, A, Z = 0x61, 0x7A, 0x41, 0x5A
+ local a, z, A, Z = 0x61, 0x7A, 0x41, 0x5A
-function extras.mi(result,element,detail,n,fulltag,di) -- check with content
- local str = di.data[1].content
- if str and sub(str,1,1) ~= "&" then -- hack but good enough (maybe gsub op eerste)
- for v in utfvalues(str) do
- if (v >= a and v <= z) or (v >= A and v <= Z) then
- local a = di.attributes
- if a then
- a.mathvariant = "normal"
- else
- di.attributes = { mathvariant = "normal" }
+ function extras.mi(di,element,n,fulltag) -- check with content
+ local str = di.data[1].content
+ if str and sub(str,1,1) ~= "&" then -- hack but good enough (maybe gsub op eerste)
+ for v in utfvalues(str) do
+ if (v >= a and v <= z) or (v >= A and v <= Z) then
+ local a = di.attributes
+ if a then
+ a.mathvariant = "normal"
+ else
+ di.attributes = { mathvariant = "normal" }
+ end
end
end
end
end
-end
-function extras.section(result,element,detail,n,fulltag,di)
- local data = listdata[fulltag]
- if data then
- addreference(result,data.references)
- return true
- else
+ function extras.msub(di,element,n,fulltag)
+ -- m$^2$
local data = di.data
- if data then
- for i=1,#data do
- local di = data[i]
- if di then
- local ft = di.fulltag
- if ft and extras.section(result,element,detail,n,ft,di) then
- return true
- end
- end
- end
+ if #data == 1 then
+ local d = data[1]
+ data[2] = d
+ d.__i__ = 2
+ data[1] = dummy_nucleus
end
end
+
+ extras.msup = extras.msub
+
end
-function extras.float(result,element,detail,n,fulltag,di)
- local data = listdata[fulltag]
- if data then
- addreference(result,data.references)
- return true
- else
- local data = di.data
+do
+
+ local registered = structures.sections.registered
+
+ local function resolve(di,element,n,fulltag)
+ local data = listdata[fulltag]
if data then
- for i=1,#data do
- local di = data[i]
- if di and extras.section(result,element,detail,n,di.fulltag,di) then
- return true
+ extras.addreference(di,data.references)
+ return true
+ else
+ local data = di.data
+ if data then
+ for i=1,#data do
+ local di = data[i]
+ if di then
+ local ft = di.fulltag
+ if ft and resolve(di,element,n,ft) then
+ return true
+ end
+ end
end
end
end
end
-end
-
-local tabledata = { }
-
-function structurestags.settablecell(rows,columns,align)
- if align > 0 or rows > 1 or columns > 1 then
- tabledata[detailedtag("tablecell")] = {
- rows = rows,
- columns = columns,
- align = align,
- }
- end
-end
-function extras.tablecell(result,element,detail,n,fulltag,di)
- local hash = tabledata[fulltag]
- if hash then
- local v = hash.columns
- if v and v > 1 then
- result[#result+1] = formatters[" columns='%s'"](v)
- end
- local v = hash.rows
- if v and v > 1 then
- result[#result+1] = formatters[" rows='%s'"](v)
- end
- local v = hash.align
- if not v or v == 0 then
- -- normal
- elseif v == 1 then -- use numbertoalign here
- result[#result+1] = " align='flushright'"
- elseif v == 2 then
- result[#result+1] = " align='middle'"
- elseif v == 3 then
- result[#result+1] = " align='flushleft'"
+ function extras.section(di,element,n,fulltag)
+ local r = registered[specifications[fulltag].detail]
+ if r then
+ setattribute(di,"level",r.level)
end
+ resolve(di,element,n,fulltag)
end
-end
-local tabulatedata = { }
+ extras.float = resolve
-function structurestags.settabulatecell(align)
- if align > 0 then
- tabulatedata[detailedtag("tabulatecell")] = {
- align = align,
- }
+ -- todo: internal is already hashed
+
+ function structurestags.setlist(n)
+ local data = structures.lists.getresult(n)
+ if data then
+ referencehash[locatedtag("listitem")] = data
+ end
end
-end
-local function hascontent(data)
- for i=1,#data do
- local di = data[i]
- if not di then
- --
- elseif di.content then
+ function extras.listitem(di,element,n,fulltag)
+ local data = referencehash[fulltag]
+ if data then
+ extras.addinternal(di,data.references)
return true
- else
- local d = di.data
- if d and #d > 0 and hascontent(d) then
- return true
- end
end
end
+
end
-function extras.tabulate(result,element,detail,n,fulltag,di)
- local data = di.data
- for i=1,#data do
- local di = data[i]
- if di.tg == "tabulaterow" and not hascontent(di.data) then
- di.element = "" -- or simply remove
+do
+
+ -- todo: internal is already hashed
+
+ function structurestags.setregister(tag,n) -- check if tag is needed
+ local data = structures.registers.get(tag,n)
+ if data then
+ referencehash[locatedtag("registerlocation")] = data
end
end
-end
-function extras.tabulatecell(result,element,detail,n,fulltag,di)
- local hash = tabulatedata[fulltag]
- if hash then
- local v = hash.align
- if not v or v == 0 then
- -- normal
- elseif v == 1 then
- result[#result+1] = " align='flushleft'"
- elseif v == 2 then
- result[#result+1] = " align='flushright'"
- elseif v == 3 then
- result[#result+1] = " align='middle'"
+ function extras.registerlocation(di,element,n,fulltag)
+ local data = referencehash[fulltag]
+ if data then
+ extras.addinternal(di,data.references)
+ return true
end
end
-end
--- flusher
+ extras.registerpages = ignorebreaks
+ extras.registerseparator = ignorespaces
-local linedone = false -- can go ... we strip newlines anyway
-local inlinedepth = 0
+end
--- todo: #result -> nofresult
+do
-local function emptytag(result,element,nature,depth,di) -- currently only break but at some point
- local a = di.attributes -- we might add detail etc
- if a then -- happens seldom
- if linedone then
- result[#result+1] = formatters["%w<%s"](depth,namespaced[element])
- else
- result[#result+1] = formatters["\n%w<%s"](depth,namespaced[element])
- end
- for k, v in next, a do
- result[#result+1] = formatters[" %s=%q"](k,v)
- end
- result[#result+1] = "/>\n"
- else
- if linedone then
- result[#result+1] = formatters["%w<%s/>\n"](depth,namespaced[element])
- else
- result[#result+1] = formatters["\n%w<%s/>\n"](depth,namespaced[element])
+ local tabledata = { }
+
+ local function hascontent(data)
+ for i=1,#data do
+ local di = data[i]
+ if not di then
+ --
+ elseif di.content then
+ return true
+ else
+ local d = di.data
+ if d and #d > 0 and hascontent(d) then
+ return true
+ end
+ end
end
end
- linedone = false
-end
-local function begintag(result,element,nature,depth,di,skip)
- -- if needed we can use a local result with xresult
- local detail = di.detail
- local n = di.n
- local fulltag = di.fulltag
- local comment = di.comment
- if nature == "inline" then
- linedone = false
- inlinedepth = inlinedepth + 1
- if show_comment and comment then
- result[#result+1] = formatters["<!-- %s -->"](comment)
- end
- elseif nature == "mixed" then
- if inlinedepth > 0 then
- if show_comment and comment then
- result[#result+1] = formatters["<!-- %s -->"](comment)
- end
- elseif linedone then
- result[#result+1] = spaces[depth]
- if show_comment and comment then
- result[#result+1] = formatters["<!-- %s -->"](comment)
- end
- else
- result[#result+1] = formatters["\n%w"](depth)
- linedone = false
- if show_comment and comment then
- result[#result+1] = formatters["<!-- %s -->\n%w"](comment,depth)
- end
+ function structurestags.settablecell(rows,columns,align)
+ if align > 0 or rows > 1 or columns > 1 then
+ tabledata[locatedtag("tablecell")] = {
+ rows = rows,
+ columns = columns,
+ align = align,
+ }
end
- inlinedepth = inlinedepth + 1
- else
- if inlinedepth > 0 then
- if show_comment and comment then
- result[#result+1] = formatters["<!-- %s -->"](comment)
+ end
+
+ function extras.tablecell(di,element,n,fulltag)
+ local hash = tabledata[fulltag]
+ if hash then
+ local columns = hash.columns
+ if columns and columns > 1 then
+ setattribute(di,"columns",columns)
end
- elseif linedone then
- result[#result+1] = spaces[depth]
- if show_comment and comment then
- result[#result+1] = formatters["<!-- %s -->"](comment)
+ local rows = hash.rows
+ if rows and rows > 1 then
+ setattribute(di,"rows",rows)
end
- else
- result[#result+1] = formatters["\n%w"](depth) -- can introduced extra line in mixed+mixed (filtered later on)
- linedone = false
- if show_comment and comment then
- result[#result+1] = formatters["<!-- %s -->\n%w"](comment,depth)
+ local align = hash.align
+ if not align or align == 0 then
+ -- normal
+ elseif align == 1 then -- use numbertoalign here
+ setattribute(di,"align","flushright")
+ elseif align == 2 then
+ setattribute(di,"align","middle")
+ elseif align == 3 then
+ setattribute(di,"align","flushleft")
end
end
end
- if skip == "comment" then
- if show_comment then
- result[#result+1] = formatters["<!-- begin %s -->"](namespaced[element])
- end
- elseif skip then
- -- ignore
- else
- result[#result+1] = formatters["<%s"](namespaced[element])
- if detail then
- result[#result+1] = formatters[" detail=%q"](detail)
- end
- if indexing and n then
- result[#result+1] = formatters[" n=%q"](n)
- end
- local extra = extras[element]
- if extra then
- extra(result,element,detail,n,fulltag,di)
+
+ local tabulatedata = { }
+
+ function structurestags.settabulatecell(align)
+ if align > 0 then
+ tabulatedata[locatedtag("tabulatecell")] = {
+ align = align,
+ }
end
- local u = userdata[fulltag]
- if u then
- for k, v in next, u do
- result[#result+1] = formatters[" %s=%q"](k,v)
+ end
+
+ function extras.tabulate(di,element,n,fulltag)
+ local data = di.data
+ for i=1,#data do
+ local di = data[i]
+ if di.tg == "tabulaterow" and not hascontent(di.data) then
+ di.element = "" -- or simply remove
end
end
- local a = di.attributes
- if a then
- for k, v in next, a do
- result[#result+1] = formatters[" %s=%q"](k,v)
+ end
+
+ function extras.tabulatecell(di,element,n,fulltag)
+ local hash = tabulatedata[fulltag]
+ if hash then
+ local align = hash.align
+ if not align or align == 0 then
+ -- normal
+ elseif align == 1 then
+ setattribute(di,"align","flushleft")
+ elseif align == 2 then
+ setattribute(di,"align","flushright")
+ elseif align == 3 then
+ setattribute(di,"align","middle")
end
end
- result[#result+1] = ">"
- end
- if inlinedepth > 0 then
- elseif nature == "display" then
- result[#result+1] = "\n"
- linedone = true
end
- used[element][detail or ""] = nature -- for template css
- local metadata = tagmetadata[fulltag]
- if metadata then
- if not linedone then
- result[#result+1] = "\n"
- linedone = true
- end
- result[#result+1] = formatters["%w<metadata>\n"](depth)
- for k, v in table.sortedpairs(metadata) do
- v = entityremapper(v)
- result[#result+1] = formatters["%w<metavariable name=%q>%s</metavariable>\n"](depth+1,k,v)
+
+end
+
+-- flusher
+
+do
+
+ local f_detail = formatters[' detail="%s"']
+ local f_chain = formatters[' chain="%s"']
+ local f_index = formatters[' n="%s"']
+ local f_spacing = formatters['<c n="%s">%s</c>']
+
+ local f_empty_inline = formatters["<%s/>"]
+ local f_empty_mixed = formatters["%w<%s/>\n"]
+ local f_empty_display = formatters["\n%w<%s/>\n"]
+ local f_empty_inline_attr = formatters["<%s%s/>"]
+ local f_empty_mixed_attr = formatters["%w<%s%s/>"]
+ local f_empty_display_attr = formatters["\n%w<%s%s/>\n"]
+
+ local f_begin_inline = formatters["<%s>"]
+ local f_begin_mixed = formatters["%w<%s>"]
+ local f_begin_display = formatters["\n%w<%s>\n"]
+ local f_begin_inline_attr = formatters["<%s%s>"]
+ local f_begin_mixed_attr = formatters["%w<%s%s>"]
+ local f_begin_display_attr = formatters["\n%w<%s%s>\n"]
+
+ local f_end_inline = formatters["</%s>"]
+ local f_end_mixed = formatters["</%s>\n"]
+ local f_end_display = formatters["%w</%s>\n"]
+
+ local f_begin_inline_comment = formatters["<!-- %s --><%s>"]
+ local f_begin_mixed_comment = formatters["%w<!-- %s --><%s>"]
+ local f_begin_display_comment = formatters["\n%w<!-- %s -->\n%w<%s>\n"]
+ local f_begin_inline_attr_comment = formatters["<!-- %s --><%s%s>"]
+ local f_begin_mixed_attr_comment = formatters["%w<!-- %s --><%s%s>"]
+ local f_begin_display_attr_comment = formatters["\n%w<!-- %s -->\n%w<%s%s>\n"]
+
+ local f_comment_begin_inline = formatters["<!-- begin %s -->"]
+ local f_comment_begin_mixed = formatters["%w<!-- begin %s -->"]
+ local f_comment_begin_display = formatters["\n%w<!-- begin %s -->\n"]
+
+ local f_comment_end_inline = formatters["<!-- end %s -->"]
+ local f_comment_end_mixed = formatters["<!-- end %s -->\n"]
+ local f_comment_end_display = formatters["%w<!-- end %s -->\n"]
+
+ local f_metadata_begin = formatters["\n%w<metadata>\n"]
+ local f_metadata = formatters["%w<metavariable name=%q>%s</metavariable>\n"]
+ local f_metadata_end = formatters["%w</metadata>\n"]
+
+ --- we could share the r tables ... but it's fast enough anyway
+
+ local function attributes(a)
+ local r = { } -- can be shared
+ local n = 0
+ for k, v in next, a do
+ n = n + 1
+ r[n] = f_attribute(k,v) -- lpegmatch(p_escaped,v)
end
- result[#result+1] = formatters["%w</metadata>\n"](depth)
+ return concat(r,"",1,n)
end
-end
-local function endtag(result,element,nature,depth,skip)
- if nature == "display" then
- if inlinedepth == 0 then
- if not linedone then
- result[#result+1] = "\n"
- end
- if skip == "comment" then
- if show_comment then
- result[#result+1] = formatters["%w<!-- end %s -->\n"](depth,namespaced[element])
- end
- elseif skip then
- -- ignore
+ local depth = 0
+ local inline = 0
+
+ local function bpar(result)
+ result[#result+1] = "\n<p>"
+ end
+ local function epar(result)
+ result[#result+1] = "</p>\n"
+ end
+
+ local function emptytag(result,element,nature,di) -- currently only break but at some point
+ local a = di.attributes -- we might add detail etc
+ if a then -- happens seldom
+ if nature == "display" then
+ result[#result+1] = f_empty_display_attr(depth,namespaced[element],attributes(a))
+ elseif nature == "mixed" then
+ result[#result+1] = f_empty_mixed_attr(depth,namespaced[element],attributes(a))
else
- result[#result+1] = formatters["%w</%s>\n"](depth,namespaced[element])
+ result[#result+1] = f_empty_inline_attr(namespaced[element],attributes(a))
end
- linedone = true
else
- if skip == "comment" then
- if show_comment then
- result[#result+1] = formatters["<!-- end %s -->"](namespaced[element])
- end
- elseif skip then
- -- ignore
+ if nature == "display" then
+ result[#result+1] = f_empty_display(depth,namespaced[element])
+ elseif nature == "mixed" then
+ result[#result+1] = f_empty_mixed(depth,namespaced[element])
else
- result[#result+1] = formatters["</%s>"](namespaced[element])
+ result[#result+1] = f_empty_inline(namespaced[element])
end
end
- else
- inlinedepth = inlinedepth - 1
+ end
+
+ local function begintag(result,element,nature,di,skip)
+ local index = di.n
+ local fulltag = di.fulltag
+ local specification = specifications[fulltag] or { } -- we can have a dummy
+ local comment = di.comment
+ local detail = specification.detail
if skip == "comment" then
if show_comment then
- result[#result+1] = formatters["<!-- end %s -->"](namespaced[element])
+ if nature == "inline" or inline > 0 then
+ result[#result+1] = f_comment_begin_inline(namespaced[element])
+ inline = inline + 1
+ elseif nature == "mixed" then
+ result[#result+1] = f_comment_begin_mixed(depth,namespaced[element])
+ depth = depth + 1
+ inline = 1
+ else
+ result[#result+1] = f_comment_begin_display(depth,namespaced[element])
+ depth = depth + 1
+ end
end
elseif skip then
-- ignore
else
- result[#result+1] = formatters["</%s>"](namespaced[element])
- end
- linedone = false
- end
-end
-
-local function flushtree(result,data,nature,depth)
- depth = depth + 1
- local nofdata = #data
- for i=1,nofdata do
- local di = data[i]
- if not di then -- hm, di can be string
- -- whatever
- elseif di.content then
- -- already has breaks
- local content = entityremapper(di.content)
- if i == nofdata and sub(content,-1) == "\n" then -- move check
- -- can be an end of line in par but can also be the last line
- if trace_spacing then
- result[#result+1] = formatters["<c n='%s'>%s</c>"](di.parnumber or 0,sub(content,1,-2))
+ local n = 0
+ local r = { } -- delay this
+ if detail then
+ detail = gsub(detail,"[^A-Za-z0-9]+","-")
+ specification.detail = detail -- we use it later in for the div
+ n = n + 1
+ r[n] = f_detail(detail)
+ end
+ local parents = specification.parents
+ if parents then
+ parents = gsub(parents,"[^A-Za-z0-9 ]+","-")
+ specification.parents = parents -- we use it later in for the div
+ n = n + 1
+ r[n] = f_chain(parents)
+ end
+ if indexing and index then
+ n = n + 1
+ r[n] = f_index(index)
+ end
+ local extra = extras[element]
+ if extra then
+ extra(di,element,index,fulltag)
+ end
+ if exportproperties then
+ local p = specification.userdata
+ if not p then
+ -- skip
+ elseif exportproperties == v_yes then
+ for k, v in next, p do
+ n = n + 1
+ r[n] = f_attribute(k,v)
+ end
else
- result[#result+1] = sub(content,1,-2)
+ for k, v in next, p do
+ n = n + 1
+ r[n] = f_property(exportproperties,k,v)
+ end
end
- result[#result+1] = " "
- else
- if trace_spacing then
- result[#result+1] = formatters["<c n='%s'>%s</c>"](di.parnumber or 0,content)
- else
- result[#result+1] = content
+ end
+ local a = di.attributes
+ if a then
+ for k, v in next, a do
+ n = n + 1
+ r[n] = f_attribute(k,v)
end
end
- linedone = false
- elseif not di.collapsed then -- ignore collapsed data (is appended, reconstructed par)
- local element = di.element
- if not element then
- -- skip
- elseif element == "break" then -- or element == "pagebreak"
- emptytag(result,element,nature,depth,di)
- elseif element == "" or di.skip == "ignore" then
- -- skip
- else
- if di.before then
- flushtree(result,di.before,nature,depth)
+ if n == 0 then
+ if nature == "inline" or inline > 0 then
+ if show_comment and comment then
+ result[#result+1] = f_begin_inline_comment(comment,namespaced[element])
+ else
+ result[#result+1] = f_begin_inline(namespaced[element])
+ end
+ inline = inline + 1
+ elseif nature == "mixed" then
+ if show_comment and comment then
+ result[#result+1] = f_begin_mixed_comment(depth,comment,namespaced[element])
+ else
+ result[#result+1] = f_begin_mixed(depth,namespaced[element])
+ end
+ depth = depth + 1
+ inline = 1
+ else
+ if show_comment and comment then
+ result[#result+1] = f_begin_display_comment(depth,comment,depth,namespaced[element])
+ else
+ result[#result+1] = f_begin_display(depth,namespaced[element])
+ end
+ depth = depth + 1
end
- local natu = di.nature
- local skip = di.skip
- if di.breaknode then
- emptytag(result,"break","display",depth,di)
+ else
+ r = concat(r,"",1,n)
+ if nature == "inline" or inline > 0 then
+ if show_comment and comment then
+ result[#result+1] = f_begin_inline_attr_comment(comment,namespaced[element],r)
+ else
+ result[#result+1] = f_begin_inline_attr(namespaced[element],r)
+ end
+ inline = inline + 1
+ elseif nature == "mixed" then
+ if show_comment and comment then
+ result[#result+1] = f_begin_mixed_attr_comment(depth,comment,namespaced[element],r)
+ else
+ result[#result+1] = f_begin_mixed_attr(depth,namespaced[element],r)
+ end
+ depth = depth + 1
+ inline = 1
+ else
+ if show_comment and comment then
+ result[#result+1] = f_begin_display_attr_comment(depth,comment,depth,namespaced[element],r)
+ else
+ result[#result+1] = f_begin_display_attr(depth,namespaced[element],r)
+ end
+ depth = depth + 1
end
- begintag(result,element,natu,depth,di,skip)
- flushtree(result,di.data,natu,depth)
- -- if sub(result[#result],-1) == " " and natu ~= "inline" then
- -- result[#result] = sub(result[#result],1,-2)
- -- end
- endtag(result,element,natu,depth,skip)
- if di.after then
- flushtree(result,di.after,nature,depth)
+ end
+ end
+ used[element][detail or ""] = { nature, specification.parents } -- for template css
+ -- also in last else ?
+ local metadata = specification.metadata
+ if metadata then
+ result[#result+1] = f_metadata_begin(depth)
+ for k, v in table.sortedpairs(metadata) do
+ result[#result+1] = f_metadata(depth+1,k,lpegmatch(p_entity,v))
+ end
+ result[#result+1] = f_metadata_end(depth)
+ end
+ end
+
+ local function endtag(result,element,nature,di,skip)
+ if skip == "comment" then
+ if show_comment then
+ if nature == "display" and (inline == 0 or inline == 1) then
+ depth = depth - 1
+ result[#result+1] = f_comment_end_display(depth,namespaced[element])
+ inline = 0
+ elseif nature == "mixed" and (inline == 0 or inline == 1) then
+ depth = depth - 1
+ result[#result+1] = f_comment_end_mixed(namespaced[element])
+ inline = 0
+ else
+ inline = inline - 1
+ result[#result+1] = f_comment_end_inline(namespaced[element])
end
end
+ elseif skip then
+ -- ignore
+ else
+ if nature == "display" and (inline == 0 or inline == 1) then
+ depth = depth - 1
+ result[#result+1] = f_end_display(depth,namespaced[element])
+ inline = 0
+ elseif nature == "mixed" and (inline == 0 or inline == 1) then
+ depth = depth - 1
+ result[#result+1] = f_end_mixed(namespaced[element])
+ inline = 0
+ else
+ inline = inline - 1
+ result[#result+1] = f_end_inline(namespaced[element])
+ end
end
end
-end
-local function breaktree(tree,parent,parentelement) -- also removes double breaks
- local data = tree.data
- if data then
+ local function flushtree(result,data,nature)
local nofdata = #data
- local prevelement
- local prevnature
- local prevparnumber
- local newdata = { }
- local nofnewdata = 0
for i=1,nofdata do
local di = data[i]
- if not di then
- -- skip
- elseif di.content then
- local parnumber = di.parnumber
- if prevnature == "inline" and prevparnumber and prevparnumber ~= parnumber then
- nofnewdata = nofnewdata + 1
- if trace_spacing then
- newdata[nofnewdata] = makebreaknode { type = "a", p = prevparnumber, n = parnumber }
+ if not di then -- hm, di can be string
+ -- whatever
+ else
+ local content = di.content
+-- also optimize for content == "" : trace that first
+ if content then
+ -- already has breaks
+ local content = lpegmatch(p_entity,content)
+ if i == nofdata and sub(content,-1) == "\n" then -- move check
+ -- can be an end of line in par but can also be the last line
+ if trace_spacing then
+ result[#result+1] = f_spacing(di.parnumber or 0,sub(content,1,-2))
+ else
+ result[#result+1] = sub(content,1,-2)
+ end
+ result[#result+1] = " "
else
- newdata[nofnewdata] = makebreaknode()
+ if trace_spacing then
+ result[#result+1] = f_spacing(di.parnumber or 0,content)
+ else
+ result[#result+1] = content
+ end
end
- end
- prevelement = nil
- prevnature = "inline"
- prevparnumber = parnumber
- nofnewdata = nofnewdata + 1
- newdata[nofnewdata] = di
- elseif not di.collapsed then
- local element = di.element
- if element == "break" then -- or element == "pagebreak"
- if prevelement == "break" then
- di.element = ""
+ elseif not di.collapsed then -- ignore collapsed data (is appended, reconstructed par)
+ local element = di.element
+ if not element then
+ -- skip
+ elseif element == "break" then -- or element == "pagebreak"
+ emptytag(result,element,nature,di)
+ elseif element == "" or di.skip == "ignore" then
+ -- skip
+ else
+ if di.before then
+ flushtree(result,di.before,nature)
+ end
+ local natu = di.nature
+ local skip = di.skip
+ if di.breaknode then
+ emptytag(result,"break","display",di)
+ end
+ begintag(result,element,natu,di,skip)
+ flushtree(result,di.data,natu)
+ endtag(result,element,natu,di,skip)
+ if di.after then
+ flushtree(result,di.after,nature)
+ end
end
- prevelement = element
- prevnature = "display"
- elseif element == "" or di.skip == "ignore" then
+ end
+ end
+ end
+ end
+
+ local function breaktree(tree,parent,parentelement) -- also removes double breaks
+ local data = tree.data
+ if data then
+ local nofdata = #data
+ local prevelement
+ local prevnature
+ local prevparnumber
+ local newdata = { }
+ local nofnewdata = 0
+ for i=1,nofdata do
+ local di = data[i]
+ if not di then
-- skip
+ elseif di.content then
+ local parnumber = di.parnumber
+ if prevnature == "inline" and prevparnumber and prevparnumber ~= parnumber then
+ nofnewdata = nofnewdata + 1
+ if trace_spacing then
+ newdata[nofnewdata] = makebreaknode { type = "a", p = prevparnumber, n = parnumber }
+ else
+ newdata[nofnewdata] = makebreaknode()
+ end
+ end
+ prevelement = nil
+ prevnature = "inline"
+ prevparnumber = parnumber
+ nofnewdata = nofnewdata + 1
+ newdata[nofnewdata] = di
+ elseif not di.collapsed then
+ local element = di.element
+ if element == "break" then -- or element == "pagebreak"
+ if prevelement == "break" then
+ di.element = ""
+ end
+ prevelement = element
+ prevnature = "display"
+ elseif element == "" or di.skip == "ignore" then
+ -- skip
+ else
+ local nature = di.nature
+ local parnumber = di.parnumber
+ if prevnature == "inline" and nature == "inline" and prevparnumber and prevparnumber ~= parnumber then
+ nofnewdata = nofnewdata + 1
+ if trace_spacing then
+ newdata[nofnewdata] = makebreaknode { type = "b", p = prevparnumber, n = parnumber }
+ else
+ newdata[nofnewdata] = makebreaknode()
+ end
+ end
+ prevnature = nature
+ prevparnumber = parnumber
+ prevelement = element
+ breaktree(di,tree,element)
+ end
+ nofnewdata = nofnewdata + 1
+ newdata[nofnewdata] = di
else
local nature = di.nature
local parnumber = di.parnumber
if prevnature == "inline" and nature == "inline" and prevparnumber and prevparnumber ~= parnumber then
nofnewdata = nofnewdata + 1
if trace_spacing then
- newdata[nofnewdata] = makebreaknode { type = "b", p = prevparnumber, n = parnumber }
+ newdata[nofnewdata] = makebreaknode { type = "c", p = prevparnumber, n = parnumber }
else
newdata[nofnewdata] = makebreaknode()
end
end
prevnature = nature
prevparnumber = parnumber
- prevelement = element
- breaktree(di,tree,element)
- end
- nofnewdata = nofnewdata + 1
- newdata[nofnewdata] = di
- else
- local nature = di.nature
- local parnumber = di.parnumber
- if prevnature == "inline" and nature == "inline" and prevparnumber and prevparnumber ~= parnumber then
nofnewdata = nofnewdata + 1
- if trace_spacing then
- newdata[nofnewdata] = makebreaknode { type = "c", p = prevparnumber, n = parnumber }
- else
- newdata[nofnewdata] = makebreaknode()
- end
+ newdata[nofnewdata] = di
end
- prevnature = nature
- prevparnumber = parnumber
- nofnewdata = nofnewdata + 1
- newdata[nofnewdata] = di
end
- end
- tree.data = newdata
- end
-end
-
--- also tabulaterow reconstruction .. maybe better as a checker
--- i.e cell attribute
-
-local function collapsetree()
- for tag, trees in next, treehash do
- local d = trees[1].data
- if d then
- local nd = #d
- if nd > 0 then
- for i=2,#trees do
- local currenttree = trees[i]
- local currentdata = currenttree.data
- local currentpar = currenttree.parnumber
- local previouspar = trees[i-1].parnumber
- currenttree.collapsed = true
- -- is the next ok?
- if previouspar == 0 or not (di and di.content) then
- previouspar = nil -- no need anyway so no further testing needed
- end
- for j=1,#currentdata do
- local cd = currentdata[j]
- if not cd or cd == "" then
- -- skip
- elseif cd.content then
- if not currentpar then
- -- add space ?
- elseif not previouspar then
- -- add space ?
- elseif currentpar ~= previouspar then
- nd = nd + 1
- if trace_spacing then
- d[nd] = makebreaknode { type = "d", p = previouspar, n = currentpar }
- else
- d[nd] = makebreaknode()
+ tree.data = newdata
+ end
+ end
+
+ -- also tabulaterow reconstruction .. maybe better as a checker
+ -- i.e cell attribute
+
+ local function collapsetree()
+ for tag, trees in next, treehash do
+ local d = trees[1].data
+ if d then
+ local nd = #d
+ if nd > 0 then
+ for i=2,#trees do
+ local currenttree = trees[i]
+ local currentdata = currenttree.data
+ local currentpar = currenttree.parnumber
+ local previouspar = trees[i-1].parnumber
+ currenttree.collapsed = true
+ -- is the next ok?
+ if previouspar == 0 or not (di and di.content) then
+ previouspar = nil -- no need anyway so no further testing needed
+ end
+ for j=1,#currentdata do
+ local cd = currentdata[j]
+ if not cd or cd == "" then
+ -- skip
+ elseif cd.content then
+ if not currentpar then
+ -- add space ?
+ elseif not previouspar then
+ -- add space ?
+ elseif currentpar ~= previouspar then
+ nd = nd + 1
+ if trace_spacing then
+ d[nd] = makebreaknode { type = "d", p = previouspar, n = currentpar }
+ else
+ d[nd] = makebreaknode()
+ end
end
+ previouspar = currentpar
+ nd = nd + 1
+ d[nd] = cd
+ else
+ nd = nd + 1
+ d[nd] = cd
end
- previouspar = currentpar
- nd = nd + 1
- d[nd] = cd
- else
- nd = nd + 1
- d[nd] = cd
+ currentdata[j] = false
end
- currentdata[j] = false
end
end
end
end
end
-end
-local function finalizetree(tree)
- for _, finalizer in next, finalizers do
- finalizer(tree)
+ local function finalizetree(tree)
+ for _, finalizer in next, finalizers do
+ finalizer(tree)
+ end
end
-end
-local function indextree(tree)
- local data = tree.data
- if data then
- local n, new = 0, { }
- for i=1,#data do
- local d = data[i]
- if not d then
- -- skip
- elseif d.content then
- n = n + 1
- new[n] = d
- elseif not d.collapsed then
- n = n + 1
- d.__i__ = n
- d.__p__ = tree
- indextree(d)
- new[n] = d
+ local function indextree(tree)
+ local data = tree.data
+ if data then
+ local n, new = 0, { }
+ for i=1,#data do
+ local d = data[i]
+ if not d then
+ -- skip
+ elseif d.content then
+ n = n + 1
+ new[n] = d
+ elseif not d.collapsed then
+ n = n + 1
+ d.__i__ = n
+ d.__p__ = tree
+ indextree(d)
+ new[n] = d
+ end
end
+ tree.data = new
end
- tree.data = new
end
-end
-local function checktree(tree)
- local data = tree.data
- if data then
- for i=1,#data do
- local d = data[i]
- if type(d) == "table" then
- local check = checks[d.tg]
- if check then
- check(d)
+ local function checktree(tree)
+ local data = tree.data
+ if data then
+ for i=1,#data do
+ local d = data[i]
+ if type(d) == "table" then
+ local check = checks[d.tg]
+ if check then
+ check(d)
+ end
+ checktree(d)
end
- checktree(d)
end
end
end
+
+ wrapups.flushtree = flushtree
+ wrapups.breaktree = breaktree
+ wrapups.collapsetree = collapsetree
+ wrapups.finalizetree = finalizetree
+ wrapups.indextree = indextree
+ wrapups.checktree = checktree
+
end
-- collector code
local function push(fulltag,depth)
- local tag, n = lpegmatch(dashsplitter,fulltag)
- local tg, detail = lpegmatch(colonsplitter,tag)
- local element, nature
- if detail then
- local pd = properties[tag]
- local pt = properties[tg]
- element = pd and pd.export or pt and pt.export or tg
- nature = pd and pd.nature or pt and pt.nature or defaultnature
+ local tg, n, detail
+ local specification = specifications[fulltag]
+ if specification then
+ tg = specification.tagname
+ n = specification.tagindex
+ detail = specification.detail
else
- local p = properties[tg]
- element = p and p.export or tg
- nature = p and p.nature or "inline"
+ -- a break (more efficient if we don't store those in specifications)
+ tg, n = lpegmatch(tagsplitter,fulltag)
+ n = tonumber(n) -- to tonumber in tagsplitter
end
+ local p = properties[tg]
+ local element = p and p.export or tg
+ local nature = p and p.nature or "inline" -- defaultnature
local treedata = tree.data
- local t = {
+ local t = { -- maybe we can use the tag table
tg = tg,
fulltag = fulltag,
detail = detail,
- n = tonumber(n), -- more efficient
+ n = n, -- already a number
element = element,
nature = nature,
data = { },
@@ -1688,9 +2290,9 @@ local function push(fulltag,depth)
treestack[currentdepth] = tree
if trace_export then
if detail and detail ~= "" then
- report_export("%w<%s trigger=%a paragraph=%a index=%a detail=%a>",currentdepth-1,fulltag,currentattribute or 0,currentparagraph or 0,#treedata,detail)
+ report_export("%w<%s trigger=%q n=%q paragraph=%q index=%q detail=%q>",currentdepth-1,tg,n,currentattribute or 0,currentparagraph or 0,#treedata,detail)
else
- report_export("%w<%s trigger=%a paragraph=%a index=%a>",currentdepth-1,fulltag,currentattribute or 0,currentparagraph or 0,#treedata)
+ report_export("%w<%s trigger=%q n=%q paragraph=%q index=%q>",currentdepth-1,tg,n,currentattribute or 0,currentparagraph or 0,#treedata)
end
end
tree = t
@@ -1707,15 +2309,19 @@ local function push(fulltag,depth)
end
local function pop()
- local top = nesting[currentdepth]
- tree = treestack[currentdepth]
- currentdepth = currentdepth - 1
- if trace_export then
- if top then
- report_export("%w</%s>",currentdepth,top)
- else
- report_export("</%s>",top)
+ if currentdepth > 0 then
+ local top = nesting[currentdepth]
+ tree = treestack[currentdepth]
+ currentdepth = currentdepth - 1
+ if trace_export then
+ if top then
+ report_export("%w</%s>",currentdepth,top)
+ else
+ report_export("</%s>",top)
+ end
end
+ else
+ report_export("%w<!-- too many pops -->",currentdepth)
end
end
@@ -1730,58 +2336,65 @@ local function continueexport()
end
local function pushentry(current)
- if current then
- if restart then
- continueexport()
- restart = false
- end
- local newdepth = #current
- local olddepth = currentdepth
- if trace_export then
- report_export("%w<!-- moving from depth %s to %s (%s) -->",currentdepth,olddepth,newdepth,current[newdepth])
+ if not current then
+ -- bad news
+ return
+ end
+ current = current.taglist
+ if not current then
+ -- even worse news
+ return
+ end
+ if restart then
+ continueexport()
+ restart = false
+ end
+ local newdepth = #current
+ local olddepth = currentdepth
+ if trace_export then
+ report_export("%w<!-- moving from depth %s to %s (%s) -->",currentdepth,olddepth,newdepth,current[newdepth])
+ end
+ if olddepth <= 0 then
+ for i=1,newdepth do
+ push(current[i],i)
end
- if olddepth <= 0 then
- for i=1,newdepth do
- push(current[i],i)
+ else
+ local difference
+ if olddepth < newdepth then
+ for i=1,olddepth do
+ if current[i] ~= nesting[i] then
+ difference = i
+ break
+ end
end
else
- local difference
- if olddepth < newdepth then
- for i=1,olddepth do
- if current[i] ~= nesting[i] then
- difference = i
- break
- end
- end
- else
- for i=1,newdepth do
- if current[i] ~= nesting[i] then
- difference = i
- break
- end
+ for i=1,newdepth do
+ if current[i] ~= nesting[i] then
+ difference = i
+ break
end
end
- if difference then
- for i=olddepth,difference,-1 do
- pop()
- end
- for i=difference,newdepth do
- push(current[i],i)
- end
- elseif newdepth > olddepth then
- for i=olddepth+1,newdepth do
- push(current[i],i)
- end
- elseif newdepth < olddepth then
- for i=olddepth,newdepth,-1 do
- pop()
- end
- elseif trace_export then
- report_export("%w<!-- staying at depth %s (%s) -->",currentdepth,newdepth,nesting[newdepth] or "?")
+ end
+ if difference then
+ for i=olddepth,difference,-1 do
+ pop()
end
+ for i=difference,newdepth do
+ push(current[i],i)
+ end
+ elseif newdepth > olddepth then
+ for i=olddepth+1,newdepth do
+ push(current[i],i)
+ end
+ elseif newdepth < olddepth then
+ for i=olddepth,newdepth,-1 do
+ pop()
+ end
+ elseif trace_export then
+ report_export("%w<!-- staying at depth %s (%s) -->",currentdepth,newdepth,nesting[newdepth] or "?")
end
- return olddepth, newdepth
end
+ return olddepth, newdepth
end
local function pushcontent(oldparagraph,newparagraph)
@@ -1805,17 +2418,19 @@ local function pushcontent(oldparagraph,newparagraph)
if list then
olddepth, newdepth = pushentry(list)
end
- local td = tree.data
- local nd = #td
- td[nd+1] = { parnumber = oldparagraph or currentparagraph, content = content }
- if trace_export then
- report_export("%w<!-- start content with length %s -->",currentdepth,#content)
- report_export("%w%s",currentdepth,(gsub(content,"\n","\\n")))
- report_export("%w<!-- stop content -->",currentdepth)
- end
- if olddepth then
- for i=newdepth-1,olddepth,-1 do
- pop()
+ if tree then
+ local td = tree.data
+ local nd = #td
+ td[nd+1] = { parnumber = oldparagraph or currentparagraph, content = content }
+ if trace_export then
+ report_export("%w<!-- start content with length %s -->",currentdepth,#content)
+ report_export("%w%s",currentdepth,(gsub(content,"\n","\\n")))
+ report_export("%w<!-- stop content -->",currentdepth)
+ end
+ if olddepth then
+ for i=newdepth-1,olddepth,-1 do
+ pop()
+ end
end
end
end
@@ -1824,7 +2439,7 @@ local function pushcontent(oldparagraph,newparagraph)
if oldparagraph then
pushentry(makebreaklist(currentnesting))
if trace_export then
- report_export("%w<!-- break added betweep paragraph %a and %a -->",currentdepth,oldparagraph,newparagraph)
+ report_export("%w<!-- break added between paragraph %a and %a -->",currentdepth,oldparagraph,newparagraph)
end
end
end
@@ -1853,28 +2468,28 @@ end
-- whatsit_code localpar_code
-local function collectresults(head,list) -- is last used (we also have currentattribute)
+local function collectresults(head,list,pat,pap) -- is last used (we also have currentattribute)
local p
for n in traverse_nodes(head) do
local id = getid(n) -- 14: image, 8: literal (mp)
if id == glyph_code then
- local at = getattr(n,a_tagged)
+ local at = getattr(n,a_tagged) or pat
if not at then
-- we need to tag the pagebody stuff as being valid skippable
--
-- report_export("skipping character: %C (no attribute)",n.char)
else
-- we could add tonunicodes for ligatures (todo)
- local components = getfield(n,"components")
- if components then -- we loose data
- collectresults(components,nil)
+ local components = getfield(n,"components")
+ local c = getchar(n)
+ if components and (not characterdata[c] or overloads[c]) then -- we loose data
+ collectresults(components,nil,at) -- this assumes that components have the same attribute as the glyph ... we should be more tolerant (see math)
else
- local c = getchar(n)
if last ~= at then
local tl = taglist[at]
pushcontent()
currentnesting = tl
- currentparagraph = getattr(n,a_taggedpar)
+ currentparagraph = getattr(n,a_taggedpar) or pap
currentattribute = at
last = at
pushentry(currentnesting)
@@ -1885,11 +2500,15 @@ local function collectresults(head,list) -- is last used (we also have currentat
-- to a regular setter at the tex end.
local r = getattr(n,a_reference)
if r then
- referencehash[tl[#tl]] = r -- fulltag
+ local t = tl.taglist
+ referencehash[t[#t]] = r -- fulltag
end
--
elseif last then
- local ap = getattr(n,a_taggedpar)
+ -- we can consider tagging the pars (lines) in the parbuilder but then we loose some
+ -- information unless we inject a special node (but even then we can run into nesting
+ -- issues)
+ local ap = getattr(n,a_taggedpar) or pap
if ap ~= currentparagraph then
pushcontent(currentparagraph,ap)
pushentry(currentnesting)
@@ -1928,21 +2547,30 @@ local function collectresults(head,list) -- is last used (we also have currentat
if fc then
fc = fc and fc[c]
if fc then
- local u = fc.tounicode
- if u and u ~= "" then
+ local u = fc.unicode
+ if not u then
nofcurrentcontent = nofcurrentcontent + 1
- currentcontent[nofcurrentcontent] = utfchar(fromunicode16(u))
+ currentcontent[nofcurrentcontent] = utfchar(c)
+ elseif type(u) == "table" then
+ for i=1,#u do
+ nofcurrentcontent = nofcurrentcontent + 1
+ currentcontent[nofcurrentcontent] = utfchar(u[i])
+ end
else
nofcurrentcontent = nofcurrentcontent + 1
- currentcontent[nofcurrentcontent] = utfchar(c)
+ currentcontent[nofcurrentcontent] = utfchar(u)
end
- else -- weird, happens in hz (we really need to get rid of the pseudo fonts)
+ elseif c > 0 then
nofcurrentcontent = nofcurrentcontent + 1
currentcontent[nofcurrentcontent] = utfchar(c)
+ else
+ -- we can have -1 as side effect of an explicit hyphen (unless we expand)
end
- else
+ elseif c > 0 then
nofcurrentcontent = nofcurrentcontent + 1
currentcontent[nofcurrentcontent] = utfchar(c)
+ else
+ -- we can have -1 as side effect of an explicit hyphen (unless we expand)
end
end
end
@@ -1965,7 +2593,7 @@ local function collectresults(head,list) -- is last used (we also have currentat
if ca == 0 then
-- skip this one ... already converted special character (node-acc)
elseif ca then
- local a = getattr(n,a_tagged)
+ local a = getattr(n,a_tagged) or pat
if a then
local c = specialspaces[ca]
if last ~= a then
@@ -1975,13 +2603,13 @@ local function collectresults(head,list) -- is last used (we also have currentat
end
pushcontent()
currentnesting = tl
- currentparagraph = getattr(n,a_taggedpar)
+ currentparagraph = getattr(n,a_taggedpar) or pap
currentattribute = a
last = a
pushentry(currentnesting)
-- no reference check (see above)
elseif last then
- local ap = getattr(n,a_taggedpar)
+ local ap = getattr(n,a_taggedpar) or pap
if ap ~= currentparagraph then
pushcontent(currentparagraph,ap)
pushentry(currentnesting)
@@ -2004,9 +2632,10 @@ local function collectresults(head,list) -- is last used (we also have currentat
else
local subtype = getsubtype(n)
if subtype == userskip_code then
- if getfield(getfield(n,"spec"),"width") > threshold then
+ local spec = getfield(n,"spec")
+ if getfield(spec,"width") > threshold then
if last and not somespace[currentcontent[nofcurrentcontent]] then
- local a = getattr(n,a_tagged)
+ local a = getattr(n,a_tagged) or pat
if a == last then
if trace_export then
report_export("%w<!-- injecting spacing 5a -->",currentdepth)
@@ -2033,7 +2662,7 @@ local function collectresults(head,list) -- is last used (we also have currentat
end
elseif subtype == spaceskip_code or subtype == xspaceskip_code then
if not somespace[currentcontent[nofcurrentcontent]] then
- local a = getattr(n,a_tagged)
+ local a = getattr(n,a_tagged) or pat
if a == last then
if trace_export then
report_export("%w<!-- injecting spacing 7 (stay in element) -->",currentdepth)
@@ -2062,7 +2691,7 @@ local function collectresults(head,list) -- is last used (we also have currentat
nofcurrentcontent = nofcurrentcontent - 1
end
elseif not somespace[r] then
- local a = getattr(n,a_tagged)
+ local a = getattr(n,a_tagged) or pat
if a == last then
if trace_export then
report_export("%w<!-- injecting spacing 1 (end of line, stay in element) -->",currentdepth)
@@ -2092,7 +2721,7 @@ local function collectresults(head,list) -- is last used (we also have currentat
elseif id == hlist_code or id == vlist_code then
local ai = getattr(n,a_image)
if ai then
- local at = getattr(n,a_tagged)
+ local at = getattr(n,a_tagged) or pat
if nofcurrentcontent > 0 then
pushcontent()
pushentry(currentnesting) -- ??
@@ -2107,7 +2736,8 @@ local function collectresults(head,list) -- is last used (we also have currentat
-- we need to determine an end-of-line
local list = getlist(n)
if list then
- collectresults(list,n)
+ local at = getattr(n,a_tagged) or pat
+ collectresults(list,n,at)
end
end
elseif id == kern_code then
@@ -2119,7 +2749,7 @@ local function collectresults(head,list) -- is last used (we also have currentat
end
if kern > limit then
if last and not somespace[currentcontent[nofcurrentcontent]] then
- local a = getattr(n,a_tagged)
+ local a = getattr(n,a_tagged) or pat
if a == last then
if not somespace[currentcontent[nofcurrentcontent]] then
if trace_export then
@@ -2159,6 +2789,19 @@ function nodes.handlers.export(head) -- hooks into the page builder
end
-- continueexport()
restart = true
+
+-- local function f(head,depth,pat)
+-- for n in node.traverse(head) do
+-- local a = n[a_tagged] or pat
+-- local t = taglist[a]
+-- print(depth,n,a,t and table.concat(t," "))
+-- if n.id == hlist_code or n.id == vlist_code and n.list then
+-- f(n.list,depth+1,a)
+-- end
+-- end
+-- end
+-- f(head,1)
+
collectresults(tonut(head))
if trace_export then
report_export("%w<!-- stop flushing page -->",currentdepth)
@@ -2180,270 +2823,739 @@ function builders.paragraphs.tag(head)
return false
end
--- encoding='utf-8'
+do
local xmlpreamble = [[
-<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
+<?xml version="1.0" encoding="UTF-8" standalone="%standalone%" ?>
-<!-- input filename : %- 17s -->
-<!-- processing date : %- 17s -->
-<!-- context version : %- 17s -->
-<!-- exporter version : %- 17s -->
+<!--
+ input filename : %filename%
+ processing date : %date%
+ context version : %contextversion%
+ exporter version : %exportversion%
+
+-->
]]
-local function wholepreamble()
- return format(xmlpreamble,tex.jobname,os.date(),environment.version,exportversion)
-end
+ local flushtree = wrapups.flushtree
+
+ local function wholepreamble(standalone)
+ return replacetemplate(xmlpreamble, {
+ standalone = standalone and "yes" or "no",
+ filename = tex.jobname,
+ date = os.date(),
+ contextversion = environment.version,
+ exportversion = exportversion,
+ })
+ end
local csspreamble = [[
-<?xml-stylesheet type="text/css" href="%s"?>
+<?xml-stylesheet type="text/css" href="%filename%" ?>
]]
-local function allusedstylesheets(xmlfile,cssfiles,files)
- local result = { }
- for i=1,#cssfiles do
- local cssfile = cssfiles[i]
- if type(cssfile) ~= "string" or cssfile == variables.yes or cssfile == "" or cssfile == xmlfile then
- cssfile = file.replacesuffix(xmlfile,"css")
- else
- cssfile = file.addsuffix(cssfile,"css")
+local cssheadlink = [[
+<link type="text/css" rel="stylesheet" href="%filename%" />
+]]
+
+ local function allusedstylesheets(cssfiles,files,path)
+ local done = { }
+ local result = { }
+ local extras = { }
+ for i=1,#cssfiles do
+ local cssfile = cssfiles[i]
+ if type(cssfile) ~= "string" then
+ -- error
+ elseif cssfile == "export-example.css" then
+ -- ignore
+ elseif not done[cssfile] then
+ cssfile = file.join(path,cssfile)
+ report_export("adding css reference '%s'",cssfile)
+ files[#files+1] = cssfile
+ result[#result+1] = replacetemplate(csspreamble, { filename = cssfile })
+ extras[#extras+1] = replacetemplate(cssheadlink, { filename = cssfile })
+ done[cssfile] = true
+ end
end
- files[#files+1] = cssfile
- report_export("adding css reference '%s'",cssfile)
- result[#result+1] = format(csspreamble,cssfile)
+ return concat(result), concat(extras)
end
- return concat(result)
-end
-local e_template = [[
-%s {
- display: %s ;
+local elementtemplate = [[
+/* element="%element%" detail="%detail%" chain="%chain%" */
+
+%element%, context|div.%element% {
+ display: %display% ;
}]]
-local d_template = [[
-%s[detail=%s] {
- display: %s ;
+local detailtemplate = [[
+/* element="%element%" detail="%detail%" chain="%chain%" */
+
+%element%[detail=%detail%], context|div.%element%.%detail% {
+ display: %display% ;
}]]
-local displaymapping = {
- inline = "inline",
- display = "block",
- mixed = "inline",
-}
+-- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd" >
+
+local htmltemplate = [[
+%preamble%
+
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:math="http://www.w3.org/1998/Math/MathML">
+
+ <head>
+
+ <meta charset="utf-8"/>
+
+ <title>%title%</title>
-local function allusedelements(xmlfile)
- local result = { format("/* template for file %s */",xmlfile) }
- for element, details in sortedhash(used) do
- result[#result+1] = format("/* category: %s */",element)
- for detail, nature in sortedhash(details) do
- local d = displaymapping[nature or "display"] or "block"
- if detail == "" then
- result[#result+1] = formatters[e_template](element,d)
+%style%
+
+ </head>
+ <body>
+ <div xmlns="http://www.pragma-ade.com/context/export">
+
+<div class="warning">Rendering can be suboptimal because there is no default/fallback css loaded.</div>
+
+%body%
+
+ </div>
+ </body>
+</html>
+]]
+
+ local displaymapping = {
+ inline = "inline",
+ display = "block",
+ mixed = "inline",
+ }
+
+ local function allusedelements(basename)
+ local result = { replacetemplate(namespacetemplate, {
+ what = "template",
+ filename = basename,
+ namespace = contextns,
+ }) }
+ for element, details in sortedhash(used) do
+ if namespaces[element] then
+ -- skip math
else
- result[#result+1] = formatters[d_template](element,detail,d)
+ for detail, what in sortedhash(details) do
+ local nature = what[1] or "display"
+ local chain = what[2]
+ local display = displaymapping[nature] or "block"
+ if detail == "" then
+ result[#result+1] = replacetemplate(elementtemplate, {
+ element = element,
+ display = display,
+ chain = chain,
+ })
+ else
+ result[#result+1] = replacetemplate(detailtemplate, {
+ element = element,
+ display = display,
+ detail = detail,
+ chain = chain,
+ })
+ end
+ end
+ end
+ end
+ return concat(result,"\n\n")
+ end
+
+ local function allcontent(tree)
+ local result = { }
+ flushtree(result,tree.data,"display") -- we need to collect images
+ result = concat(result)
+ -- no need to lpeg .. fast enough
+ result = gsub(result,"\n *\n","\n")
+ result = gsub(result,"\n +([^< ])","\n%1")
+ return result
+ end
+
+ -- local xhtmlpreamble = [[
+ -- <!DOCTYPE html PUBLIC
+ -- "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
+ -- "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd"
+ -- >
+ -- ]]
+
+ local function cleanxhtmltree(xmltree)
+ if xmltree then
+ local implicits = { }
+ local explicits = { }
+ local overloads = { }
+ for e in xml.collected(xmltree,"*") do
+ local at = e.at
+ if at then
+ local explicit = at.explicit
+ local implicit = at.implicit
+ if explicit then
+ if not explicits[explicit] then
+ explicits[explicit] = true
+ at.id = explicit
+ if implicit then
+ overloads[implicit] = explicit
+ end
+ end
+ else
+ if implicit and not implicits[implicit] then
+ implicits[implicit] = true
+ at.id = "aut:" .. implicit
+ end
+ end
+ end
+ end
+ for e in xml.collected(xmltree,"*") do
+ local at = e.at
+ if at then
+ local internal = at.internal
+ local location = at.location
+ if internal then
+ if location then
+ local explicit = overloads[location]
+ if explicit then
+ at.href = "#" .. explicit
+ else
+ at.href = "#aut:" .. internal
+ end
+ else
+ at.href = "#aut:" .. internal
+ end
+ else
+ if location then
+ at.href = "#" .. location
+ else
+ local url = at.url
+ if url then
+ at.href = url
+ else
+ local file = at.file
+ if file then
+ at.href = file
+ end
+ end
+ end
+ end
+ end
end
+ return xmltree
+ else
+ return xml.convert('<?xml version="1.0"?>\n<error>invalid xhtml tree</error>')
end
end
- return concat(result,"\n\n")
-end
-local function allcontent(tree)
- local result = { }
- flushtree(result,tree.data,"display",0) -- we need to collect images
- result = concat(result)
- result = gsub(result,"\n *\n","\n")
- result = gsub(result,"\n +([^< ])","\n%1")
- return result
-end
+ -- maybe the reverse: be explicit about what is permitted
--- local xhtmlpreamble = [[
--- <!DOCTYPE html PUBLIC
--- "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
--- "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd"
--- >
--- ]]
-
-local function cleanxhtmltree(xmltree)
- if xmltree then
- local xmlwrap = xml.wrap
- for e in xml.collected(xmltree,"/document") do
- e.at["xmlns:xhtml"] = "http://www.w3.org/1999/xhtml"
- break
- end
- -- todo: inject xhtmlpreamble (xmlns should have be enough)
- local wrapper = { tg = "a", ns = "xhtml", at = { href = "unknown" } }
- for e in xml.collected(xmltree,"link") do
- local at = e.at
- local href
- if at.location then
- href = "#" .. gsub(at.location,":","_")
- elseif at.url then
- href = at.url
- elseif at.file then
- href = at.file
- end
- if href then
- wrapper.at.href = href
- xmlwrap(e,wrapper)
- end
- end
- local wrapper = { tg = "a", ns = "xhtml", at = { name = "unknown" } }
- for e in xml.collected(xmltree,"!link[@location]") do
- local location = e.at.location
- if location then
- wrapper.at.name = gsub(location,":","_")
- xmlwrap(e,wrapper)
- end
- end
- return xmltree
- else
- return xml.convert("<?xml version='1.0'?>\n<error>invalid xhtml tree</error>")
- end
-end
+ local private = {
+ destination = true,
+ prefix = true,
+ reference = true,
+ --
+ id = true,
+ href = true,
+ --
+ implicit = true,
+ explicit = true,
+ --
+ url = true,
+ file = true,
+ internal = true,
+ location = true,
+ --
+ name = true, -- image name
+ used = true, -- image name
+ page = true, -- image name
+ width = true,
+ height = true,
+ --
+ }
-local cssfile, xhtmlfile = nil, nil
+ local addclicks = true
+ local f_onclick = formatters[ [[location.href='%s']] ]
+ local f_onclick = formatters[ [[location.href='%s']] ]
-directives.register("backend.export.css", function(v) cssfile = v end)
-directives.register("backend.export.xhtml",function(v) xhtmlfile = v end)
+ local p_cleanid = lpeg.replacer { [":"] = "-" }
+ local p_cleanhref = lpeg.Cs(lpeg.P("#") * p_cleanid)
-local function stopexport(v)
- starttiming(treehash)
- --
- finishexport()
- --
- collapsetree(tree)
- indextree(tree)
- checktree(tree)
- breaktree(tree)
- finalizetree(tree)
- --
- hashlistdata()
- --
- if type(v) ~= "string" or v == variables.yes or v == "" then
- v = tex.jobname
- end
- local basename = file.basename(v)
- local xmlfile = file.addsuffix(basename,"export")
- --
- local imagefilename = file.addsuffix(file.removesuffix(xmlfile) .. "-images","css")
- local stylefilename = file.addsuffix(file.removesuffix(xmlfile) .. "-styles","css")
- local templatefilename = file.replacesuffix(xmlfile,"template")
- local specificationfilename = file.replacesuffix(xmlfile,"specification")
- --
- if xhtml and not cssfile then
- cssfile = true
- end
- local cssfiles = { }
- if cssfile then
- if cssfile == true then
- cssfiles = { "export-example.css" }
+ local p_splitter = lpeg.Ct ( (
+ lpeg.Carg(1) * lpeg.C((1-lpeg.P(" "))^1) / function(d,s) if not d[s] then d[s] = true return s end end
+ * lpeg.P(" ")^0 )^1 )
+
+
+ local classes = table.setmetatableindex(function(t,k)
+ local v = concat(lpegmatch(p_splitter,k,1,{})," ")
+ t[k] = v
+ return v
+ end)
+
+ local function makeclass(tg,at)
+ local detail = at.detail
+ local chain = at.chain
+ local result
+ at.detail = nil
+ at.chain = nil
+ if detail and detail ~= "" then
+ if chain and chain ~= "" then
+ if chain ~= detail then
+ result = { classes[tg .. " " .. chain .. " " .. detail] } -- we need to remove duplicates
+ elseif tg ~= detail then
+ result = { tg, detail }
+ else
+ result = { tg }
+ end
+ elseif tg ~= detail then
+ result = { tg, detail }
+ else
+ result = { tg }
+ end
+ elseif chain and chain ~= "" then
+ if tg ~= chain then
+ result = { tg, chain }
+ else
+ result = { tg }
+ end
else
- cssfiles = settings_to_array(cssfile or "")
+ result = { tg }
+ end
+ for k, v in next, at do
+ if not private[k] then
+ result[#result+1] = k .. "-" .. v
+ end
end
- insert(cssfiles,1,imagefilename)
- insert(cssfiles,1,stylefilename)
+ return concat(result, " ")
end
- cssfiles = table.unique(cssfiles)
- --
- local result = allcontent(tree) -- also does some housekeeping and data collecting
- --
- local files = {
- }
- local results = concat {
- wholepreamble(),
- allusedstylesheets(xmlfile,cssfiles,files), -- ads to files
- result,
- }
- --
- files = table.unique(files)
- --
- report_export("saving xml data in %a",xmlfile)
- io.savedata(xmlfile,results)
- --
- report_export("saving css image definitions in %a",imagefilename)
- io.savedata(imagefilename,allusedimages(xmlfile))
- --
- report_export("saving css style definitions in %a",stylefilename)
- io.savedata(stylefilename,allusedstyles(xmlfile))
- --
- report_export("saving css template in %a",templatefilename)
- io.savedata(templatefilename,allusedelements(xmlfile))
- --
- if xhtmlfile then
- if type(v) ~= "string" or xhtmlfile == true or xhtmlfile == variables.yes or xhtmlfile == "" or xhtmlfile == xmlfile then
- xhtmlfile = file.replacesuffix(xmlfile,"xhtml")
- else
- xhtmlfile = file.addsuffix(xhtmlfile,"xhtml")
+
+ local function remap(specification,source,target)
+ local comment = nil -- share comments
+ for c in xml.collected(source,"*") do
+ if not c.special then
+ local tg = c.tg
+ local ns = c.ns
+ if ns == "m" then
+ if false then -- yes or no
+ c.ns = ""
+ c.at["xmlns:m"] = nil
+ end
+ -- elseif tg == "a" then
+ -- c.ns = ""
+ else
+ -- if tg == "tabulatecell" or tg == "tablecell" then
+ local dt = c.dt
+ local nt = #dt
+ if nt == 0 or (nt == 1 and dt[1] == "") then
+ if comment then
+ c.dt = comment
+ else
+ xml.setcomment(c,"empty")
+ comment = c.dt
+ end
+ end
+ -- end
+ local at = c.at
+ local class = nil
+ if tg == "document" then
+ at.href = nil
+ at.detail = nil
+ at.chain = nil
+ else
+ class = makeclass(tg,at)
+ end
+ local id = at.id
+ local href = at.href
+ if id then
+ id = lpegmatch(p_cleanid, id) or id
+ if href then
+ href = lpegmatch(p_cleanhref,href) or href
+ c.at = {
+ class = class,
+ id = id,
+ href = href,
+ onclick = addclicks and f_onclick(href) or nil,
+ }
+ else
+ c.at = {
+ class = class,
+ id = id,
+ }
+ end
+ else
+ if href then
+ href = lpegmatch(p_cleanhref,href) or href
+ c.at = {
+ class = class,
+ href = href,
+ onclick = addclicks and f_onclick(href) or nil,
+ }
+ else
+ c.at = {
+ class = class,
+ }
+ end
+ end
+ c.tg = "div"
+ end
+ end
end
- files[#files+1] = xhtmlfile
- report_export("saving xhtml variant in %a",xhtmlfile)
+ end
+
+ -- local cssfile = nil directives.register("backend.export.css", function(v) cssfile = v end)
+
+ local addsuffix = file.addsuffix
+ local joinfile = file.join
+
+ local function stopexport(v)
+
+ starttiming(treehash)
+ --
+ finishexport()
+ --
+ report_export("")
+ report_export("exporting xml, xhtml and html files")
+ report_export("")
+ --
+ wrapups.collapsetree(tree)
+ wrapups.indextree(tree)
+ wrapups.checktree(tree)
+ wrapups.breaktree(tree)
+ wrapups.finalizetree(tree)
+ --
+ wrapups.hashlistdata()
+ --
+ if type(v) ~= "string" or v == v_yes or v == "" then
+ v = tex.jobname
+ end
+
+ -- we use a dedicated subpath:
+ --
+ -- ./jobname-export
+ -- ./jobname-export/images
+ -- ./jobname-export/styles
+ -- ./jobname-export/styles
+ -- ./jobname-export/jobname-export.xml
+ -- ./jobname-export/jobname-export.xhtml
+ -- ./jobname-export/jobname-export.html
+ -- ./jobname-export/jobname-specification.lua
+ -- ./jobname-export/styles/jobname-defaults.css
+ -- ./jobname-export/styles/jobname-styles.css
+ -- ./jobname-export/styles/jobname-images.css
+ -- ./jobname-export/styles/jobname-templates.css
+
+ local basename = file.basename(v)
+ local corename = file.removesuffix(basename)
+ local basepath = basename .. "-export"
+ local imagepath = joinfile(basepath,"images")
+ local stylepath = joinfile(basepath,"styles")
+
+ local function validpath(what,pathname)
+ if lfs.isdir(pathname) then
+ report_export("using exiting %s path %a",what,pathname)
+ return pathname
+ end
+ lfs.mkdir(pathname)
+ if lfs.isdir(pathname) then
+ report_export("using cretated %s path %a",what,basepath)
+ return pathname
+ else
+ report_export("unable to create %s path %a",what,basepath)
+ return false
+ end
+ end
+
+ if not (validpath("export",basepath) and validpath("images",imagepath) and validpath("styles",stylepath)) then
+ return
+ end
+
+ -- we're now on the dedicated export subpath so we can't clash names
+
+ local xmlfilebase = addsuffix(basename .. "-raw","xml" )
+ local xhtmlfilebase = addsuffix(basename .. "-tag","xhtml")
+ local htmlfilebase = addsuffix(basename .. "-div","xhtml")
+ local specificationfilebase = addsuffix(basename .. "-pub","lua" )
+
+ local xmlfilename = joinfile(basepath, xmlfilebase )
+ local xhtmlfilename = joinfile(basepath, xhtmlfilebase )
+ local htmlfilename = joinfile(basepath, htmlfilebase )
+ local specificationfilename = joinfile(basepath, specificationfilebase)
+ --
+ local defaultfilebase = addsuffix(basename .. "-defaults", "css")
+ local imagefilebase = addsuffix(basename .. "-images", "css")
+ local stylefilebase = addsuffix(basename .. "-styles", "css")
+ local templatefilebase = addsuffix(basename .. "-templates","css")
+ --
+ local defaultfilename = joinfile(stylepath,defaultfilebase )
+ local imagefilename = joinfile(stylepath,imagefilebase )
+ local stylefilename = joinfile(stylepath,stylefilebase )
+ local templatefilename = joinfile(stylepath,templatefilebase)
+
+ local cssfile = finetuning.cssfile
+
+ -- we keep track of all used files
+
+ local files = {
+ }
+
+ -- we always load the defaults and optionally extra css files; we also copy the example
+ -- css file so that we always have the latest version
+
+ local cssfiles = {
+ defaultfilebase,
+ imagefilebase,
+ stylefilebase,
+ }
+
+ local examplefilename = resolvers.find_file("export-example.css")
+ if examplefilename then
+ file.copy(examplefilename,defaultfilename)
+ end
+
+ if cssfile then
+ local list = table.unique(settings_to_array(cssfile))
+ for i=1,#list do
+ local source = addsuffix(list[i],"css")
+ local target = joinfile(stylepath,file.basename(source))
+ cssfiles[#cssfiles+1] = source
+ if not lfs.isfile(source) then
+ source = joinfile("../",source)
+ end
+ if lfs.isfile(source) then
+ report_export("copying %s",source)
+ file.copy(source,target)
+ end
+ end
+ end
+
+ local x_styles, h_styles = allusedstylesheets(cssfiles,files,"styles")
+
+ -- at this point we're ready for the content; the collector also does some
+ -- housekeeping and data collecting; at this point we still have an xml
+ -- representation that uses verbose element names and carries information in
+ -- attributes
+
+ local result = allcontent(tree)
+
+ local results = concat {
+ wholepreamble(true),
+ x_styles, -- adds to files
+ result,
+ }
+
+ cssfiles = table.unique(cssfiles)
+
+ -- we're now ready for saving the result in the xml file
+
+ report_export("saving xml data in %a",xmlfilename)
+ io.savedata(xmlfilename,results)
+
+ report_export("saving css image definitions in %a",imagefilename)
+ io.savedata(imagefilename,wrapups.allusedimages(basename))
+
+ report_export("saving css style definitions in %a",stylefilename)
+ io.savedata(stylefilename,wrapups.allusedstyles(basename))
+
+ report_export("saving css template in %a",templatefilename)
+ io.savedata(templatefilename,allusedelements(basename))
+
+ -- additionally we save an xhtml file; for that we load the file as xml tree
+
+ report_export("saving xhtml variant in %a",xhtmlfilename)
+
local xmltree = cleanxhtmltree(xml.convert(results))
- xml.save(xmltree,xhtmlfile)
+
+ xml.save(xmltree,xhtmlfilename)
+
+ -- now we save a specification file that can b eused for generating an epub file
+
-- looking at identity is somewhat redundant as we also inherit from interaction
-- at the tex end
+
local identity = interactions.general.getidentity()
+
local specification = {
- name = file.removesuffix(v),
- identifier = os.uuid(),
- images = uniqueusedimages(),
- root = xhtmlfile,
- files = files,
- language = languagenames[texgetcount("mainlanguagenumber")],
- title = validstring(finetuning.title) or validstring(identity.title),
- subtitle = validstring(finetuning.subtitle) or validstring(identity.subtitle),
- author = validstring(finetuning.author) or validstring(identity.author),
- firstpage = validstring(finetuning.firstpage),
- lastpage = validstring(finetuning.lastpage),
+ name = file.removesuffix(v),
+ identifier = os.uuid(),
+ images = wrapups.uniqueusedimages(),
+ imagefile = joinfile("styles",imagefilebase),
+ imagepath = "images",
+ stylepath = "styles",
+ xmlfiles = { xmlfilebase },
+ xhtmlfiles = { xhtmlfilebase },
+ htmlfiles = { htmlfilebase },
+ styles = cssfiles,
+ htmlroot = htmlfilebase,
+ language = languagenames[texgetcount("mainlanguagenumber")],
+ title = validstring(finetuning.title) or validstring(identity.title),
+ subtitle = validstring(finetuning.subtitle) or validstring(identity.subtitle),
+ author = validstring(finetuning.author) or validstring(identity.author),
+ firstpage = validstring(finetuning.firstpage),
+ lastpage = validstring(finetuning.lastpage),
}
- report_export("saving specification in %a (mtxrun --script epub --make %s)",specificationfilename,specificationfilename)
+
+ report_export("saving specification in %a",specificationfilename,specificationfilename)
+
io.savedata(specificationfilename,table.serialize(specification,true))
- end
- stoptiming(treehash)
-end
-local appendaction = nodes.tasks.appendaction
-local enableaction = nodes.tasks.enableaction
+ -- the html export for epub is different in the sense that it uses div's instead of
+ -- specific tags
-function commands.setupexport(t)
- table.merge(finetuning,t)
- keephyphens = finetuning.hyphen == variables.yes
-end
+ report_export("saving div based alternative in %a",htmlfilename)
+
+ remap(specification,xmltree)
+
+ local variables = {
+ style = h_styles,
+ body = xml.tostring(xml.first(xmltree,"/div")),
+ preamble = wholepreamble(false),
+ title = specification.title,
+ }
+
+ io.savedata(htmlfilename,replacetemplate(htmltemplate,variables,"xml"))
+
+ -- finally we report how an epub file can be made (using the specification)
-local function startexport(v)
- if v and not exporting then
- report_export("enabling export to xml")
- -- not yet known in task-ini
- appendaction("shipouts","normalizers", "nodes.handlers.export")
- -- enableaction("shipouts","nodes.handlers.export")
- enableaction("shipouts","nodes.handlers.accessibility")
- enableaction("math", "noads.handlers.tags")
- -- appendaction("finalizers","lists","builders.paragraphs.tag")
- -- enableaction("finalizers","builders.paragraphs.tag")
- luatex.registerstopactions(function() stopexport(v) end)
- exporting = true
+ report_export("")
+ report_export('create epub with: mtxrun --script epub --make "%s" [--purge --rename --svgmath]',file.nameonly(basename))
+ report_export("")
+
+ stoptiming(treehash)
end
-end
-directives.register("backend.export",startexport) -- maybe .name
+ local appendaction = nodes.tasks.appendaction
+ local enableaction = nodes.tasks.enableaction
-statistics.register("xml exporting time", function()
- if exporting then
- return format("%s seconds, version %s", statistics.elapsedtime(treehash),exportversion)
+ function structurestags.setupexport(t)
+ table.merge(finetuning,t)
+ keephyphens = finetuning.hyphen == v_yes
+ exportproperties = finetuning.properties
+ if exportproperties == v_no then
+ exportproperties = false
+ end
end
-end)
+
+
+
+ local function startexport(v)
+ if v and not exporting then
+ report_export("enabling export to xml")
+ -- not yet known in task-ini
+ appendaction("shipouts","normalizers", "nodes.handlers.export")
+ -- enableaction("shipouts","nodes.handlers.export")
+ enableaction("shipouts","nodes.handlers.accessibility")
+ enableaction("math", "noads.handlers.tags")
+ -- appendaction("finalizers","lists","builders.paragraphs.tag")
+ -- enableaction("finalizers","builders.paragraphs.tag")
+ luatex.registerstopactions(function() stopexport(v) end)
+ exporting = true
+ end
+ end
+
+ directives.register("backend.export",startexport) -- maybe .name
+
+ statistics.register("xml exporting time", function()
+ if exporting then
+ return string.format("%s seconds, version %s", statistics.elapsedtime(treehash),exportversion)
+ end
+ end)
+
+end
-- These are called at the tex end:
-commands.settagitemgroup = structurestags.setitemgroup
-commands.settagsynonym = structurestags.setsynonym
-commands.settagsorting = structurestags.setsorting
-commands.settagdescription = structurestags.setdescription
-commands.settagdescriptionsymbol = structurestags.setdescriptionsymbol
-commands.settaghighlight = structurestags.sethighlight
-commands.settagfigure = structurestags.setfigure
-commands.settagcombination = structurestags.setcombination
-commands.settagtablecell = structurestags.settablecell
-commands.settagtabulatecell = structurestags.settabulatecell
+implement {
+ name = "setupexport",
+ actions = structurestags.setupexport,
+ arguments = {
+ {
+ { "align" },
+ { "bodyfont", "dimen" },
+ { "width", "dimen" },
+ { "properties" },
+ { "hyphen" },
+ { "title" },
+ { "subtitle" },
+ { "author" },
+ { "firstpage" },
+ { "lastpage" },
+ { "svgstyle" },
+ { "cssfile" },
+ }
+ }
+}
+
+implement {
+ name = "settagitemgroup",
+ actions = structurestags.setitemgroup,
+ arguments = { "boolean", "integer", "string" }
+}
+
+implement {
+ name = "settagitem",
+ actions = structurestags.setitem,
+ arguments = "string"
+}
+
+implement {
+ name = "settagsynonym",
+ actions = structurestags.setsynonym,
+ arguments = "string"
+}
+
+implement {
+ name = "settagsorting",
+ actions = structurestags.setsorting,
+ arguments = "string"
+}
+
+implement {
+ name = "settagdescription",
+ actions = structurestags.setdescription,
+ arguments = { "string", "integer" }
+}
+
+implement {
+ name = "settagdescriptionsymbol",
+ actions = structurestags.setdescriptionsymbol,
+ arguments = { "string", "integer" }
+}
+
+implement {
+ name = "settaghighlight",
+ actions = structurestags.sethighlight,
+ arguments = { "string", "integer" }
+}
+
+implement {
+ name = "settagfigure",
+ actions = structurestags.setfigure,
+ arguments = { "string", "string", "string", "dimen", "dimen" }
+}
+
+implement {
+ name = "settagcombination",
+ actions = structurestags.setcombination,
+ arguments = { "integer", "integer" }
+}
+implement {
+ name = "settagtablecell",
+ actions = structurestags.settablecell,
+ arguments = { "integer", "integer", "integer" }
+}
+
+implement {
+ name = "settagtabulatecell",
+ actions = structurestags.settabulatecell,
+ arguments = "integer"
+}
+
+implement {
+ name = "settagregister",
+ actions = structurestags.setregister,
+ arguments = { "string", "integer" }
+}
+
+implement {
+ name = "settaglist",
+ actions = structurestags.setlist,
+ arguments = "integer"
+}
diff --git a/Master/texmf-dist/tex/context/base/back-exp.mkiv b/Master/texmf-dist/tex/context/base/back-exp.mkiv
index c7696d383a0..bddb6de4d92 100644
--- a/Master/texmf-dist/tex/context/base/back-exp.mkiv
+++ b/Master/texmf-dist/tex/context/base/back-exp.mkiv
@@ -38,8 +38,8 @@
\doubleexpandafter\back_export_set_element_tag_b
\fi\fi}
-\def\back_export_set_element_tag_a[#1][#2][#3]{\taggedctxcommand{settagproperty("#1","#2","#3")}}
-\def\back_export_set_element_tag_b[#1][#2][#3]{\taggedctxcommand{settagproperty("#1","export","#2")}}
+\def\back_export_set_element_tag_a[#1][#2][#3]{\clf_settagproperty{#1}{#2}{#3}}
+\def\back_export_set_element_tag_b[#1][#2][#3]{\clf_settagproperty{#1}{export}{#2}}
% todo: no need for calls when trialtypesetting
@@ -53,12 +53,25 @@
\newcount\tagparcounter
\let\dotagsetparcounter\relax
+\let\doresetparcounter \relax
\appendtoks
+ \doresetparcounter
+\to \everyflushatnextpar
+
+% \appendtoks
+% \dotagsetparcounter
+% \to \everypar
+
+\prependtoks
\dotagsetparcounter
\to \everypar
-\appendtoks
+% \appendtoks
+% \dotagsetparcounter
+% \to \neverypar
+
+\prependtoks
\dotagsetparcounter
\to \neverypar
@@ -67,54 +80,117 @@
\to \everytabulatepar % tricky, maybe this should be neverypar
\appendtoks
- \unexpanded\def\dotagTABLEcell {\taggedctxcommand{settagtablecell(\number\tablecellrows,\number\tablecellcolumns,\number\raggedstatus)}}%
- \unexpanded\def\dotagTABLEsignal{\char\zerocount}% brrr, we need to tag empty cells (unless we start numbering)
+ \unexpanded\def\dotagTABLEcell
+ {\iftrialtypesetting\else
+ \clf_settagtablecell
+ \numexpr\tablecellrows\relax
+ \numexpr\tablecellcolumns\relax
+ \numexpr\raggedstatus\relax
+ \fi}%
+ % brrr, we need to tag empty cells (unless we start numbering)
+ \unexpanded\def\dotagTABLEsignal
+ {\char\zerocount}%
+\to \everyenableelements
+
+\appendtoks
+ \unexpanded\def\dotagtabulatecell
+ {\iftrialtypesetting\else\clf_settagtabulatecell\c_tabl_tabulate_align\fi}%
+ \unexpanded\def\dotagtabulatesignal
+ {\dontleavehmode\char\zerocount\ignorespaces}%
\to \everyenableelements
\appendtoks
- \unexpanded\def\dotagtabulatecell {\taggedctxcommand{settagtabulatecell(\number\c_tabl_tabulate_align)}}%
- \unexpanded\def\dotagtabulatesignal{\dontleavehmode\char\zerocount\ignorespaces}%
+ \unexpanded\def\dotagsynonym
+ {\iftrialtypesetting\else\clf_settagsynonym{\currentsynonymtag}\fi}%
\to \everyenableelements
\appendtoks
- \unexpanded\def\dotagsynonym{\taggedctxcommand{settagsynonym("\currentsynonym","\currentsynonymtag")}}%
+ \unexpanded\def\dotagsorting
+ {\iftrialtypesetting\else\clf_settagsorting{\currentsortingtag}\fi}%
\to \everyenableelements
\appendtoks % frozen and assumed global per highlight class
- \unexpanded\def\dotaghighlight{\taggedctxcommand{settaghighlight("\currenthighlight",\!!bs\highlightparameter\c!style\!!es,\number\attribute\colorattribute)}}%
+ \unexpanded\def\dotaghighlight
+ {\iftrialtypesetting\else
+ \clf_settaghighlight{\highlightparameter\c!style}\attribute\colorattribute\relax
+ \fi}%
\to \everyenableelements
\appendtoks % we can have differently scaled images
- \unexpanded\def\dotagfigure{\taggedctxcommand{settagfigure("\figurefileoriginal","\figurefilepage",\number\dimexpr\figurewidth,\number\dimexpr\figureheight)}}%
+ \unexpanded\def\dotagfigure
+ {\iftrialtypesetting\else
+ \clf_settagfigure
+ {\figurefileoriginal}%
+ {\figurefullname}%
+ {\figurefilepage}%
+ \dimexpr\figurewidth\relax
+ \dimexpr\figureheight\relax
+ \fi}%
+\to \everyenableelements
+
+\appendtoks
+ \unexpanded\def\dotagcombination
+ {\iftrialtypesetting\else
+ \clf_settagcombination
+ \numexpr\combinationparameter\c!nx\relax
+ \numexpr\combinationparameter\c!ny\relax
+ \fi}%
\to \everyenableelements
\appendtoks
- \unexpanded\def\dotagcombination{\taggedctxcommand{settagcombination(\combinationparameter\c!nx,\combinationparameter\c!ny)}}%
- %\unexpanded\def\dotagcombination{\taggedctxcommand{settagcombination(\number\horcombination,\number\totcombination)}}%
+ \unexpanded\def\dotagsetparcounter
+ {\global\advance\tagparcounter\plusone\attribute\taggedparattribute\tagparcounter}%
+ \unexpanded\def\doresetparcounter
+ {\attribute\taggedparattribute\attributeunsetvalue}%
\to \everyenableelements
\appendtoks
- \unexpanded\def\dotagsorting{\taggedctxcommand{settagsorting("\currentsorting","\currentsortingtag")}}%
+ \unexpanded\def\dotagsetitemgroup
+ {\iftrialtypesetting\else
+ \clf_settagitemgroup
+ \ifconditional\c_strc_itemgroups_pack true\else false\fi\space
+ \numexpr\currentitemlevel\relax
+ {\currentitemgroupsymbol}%
+ \fi}%
+ \unexpanded\def\dotagsetitem#1%
+ {\iftrialtypesetting\else
+ \clf_settagitem{#1}%
+ \fi}%
\to \everyenableelements
\appendtoks
- \unexpanded\def\dotagsetparcounter{\global\advance\tagparcounter\plusone\attribute\taggedparattribute\tagparcounter}%
+ \unexpanded\def\dotagsetdescription
+ {\iftrialtypesetting\else
+ \clf_settagdescription{\currentdescription}\currentdescriptionnumberentry\relax
+ \fi}%
\to \everyenableelements
\appendtoks
- \unexpanded\def\dotagsetitemgroup{\taggedctxcommand{settagitemgroup("\currentitemgroup",\ifconditional\c_strc_itemgroups_pack true\else false\fi,"\currentitemgroupsymbol")}}%
+ \unexpanded\def\dotagsetnotesymbol
+ {\iftrialtypesetting\else
+ \clf_settagdescriptionsymbol{\currentnote}\currentnotenumber\relax
+ \fi}%
\to \everyenableelements
\appendtoks
- \unexpanded\def\dotagsetdescription{\taggedctxcommand{settagdescription("\currentdescription",\currentdescriptionnumberentry)}}%
+ \unexpanded\def\dotagregisterlocation
+ {\iftrialtypesetting\else
+ \clf_settagregister{\currentregister}\currentregisternumber\relax
+ \fi}%
\to \everyenableelements
\appendtoks
- \unexpanded\def\dotagsetnotesymbol{\taggedctxcommand{settagdescriptionsymbol("\currentnote",\currentnotenumber)}}%
+ \unexpanded\def\dotaglistlocation
+ {\iftrialtypesetting\else
+ \clf_settaglist\currentlistindex\relax
+ \fi}%
\to \everyenableelements
\appendtoks
- \unexpanded\def\doverbatimspace{\char32\relax}% will be done permanently
+ \let\specialfixedspace \explicitfixedspace
+ \let\specialobeyedspace \explicitobeyedspace
+ \let\specialstretchedspace\explicitstretchedspace
+ \let\specialcontrolspace \explicitcontrolspace
\to \everyenableelements
% The action: \setupbackend[export=yes] % or filename
@@ -137,21 +213,28 @@
\c!author={\directinteractionparameter\c!author},
% \c!firstpage=, % imagename
% \c!lastpage=, % imagename
- \c!hyphen=\v!no]
+ \c!alternative=, % html, div
+ \c!properties=\v!no, % no: ignore, yes: as attribute, otherwise: use as prefix
+ \c!hyphen=\v!no,
+ \c!svgstyle=,
+ \c!cssfile=]
\def\dosynchronizeexport
{\let\currentexport\empty
- \ctxcommand{setupexport{
- align = "\exportparameter\c!align",
- bodyfont = \number\dimexpr\exportparameter\c!bodyfont,
- width = \number\dimexpr\exportparameter\c!width,
- hyphen = "\exportparameter\c!hyphen",
- title = \!!bs\exportparameter\c!title\!!es,
- subtitle = \!!bs\exportparameter\c!subtitle\!!es,
- author = \!!bs\exportparameter\c!author\!!es,
- firstpage = "\exportparameter\c!firstpage",
- lastpage = "\exportparameter\c!lastpage",
- }}}
+ \clf_setupexport
+ align {\exportparameter\c!align}%
+ bodyfont \dimexpr\exportparameter\c!bodyfont\relax
+ width \dimexpr\exportparameter\c!width\relax
+ properties {\exportparameter\c!properties}%
+ hyphen {\exportparameter\c!hyphen}%
+ title {\exportparameter\c!title}%
+ subtitle {\exportparameter\c!subtitle}%
+ author {\exportparameter\c!author}%
+ firstpage {\exportparameter\c!firstpage}%
+ lastpage {\exportparameter\c!lastpage}%
+ svgstyle {\exportparameter\c!svgstyle}%
+ cssfile {\exportparameter\c!cssfile}%
+ \relax}
\appendtoks
\doifsomething{\backendparameter\c!export}\dosynchronizeexport
@@ -161,12 +244,14 @@
\doifsomething{\backendparameter\c!export}\dosynchronizeexport % in case it is done inside \starttext
\to \everysetupdocument
-\appendtoks
- \doifsomething{\backendparameter\c!xhtml}
- {\enabledirectives[backend.export.xhtml=\backendparameter\c!xhtml]}%
- \doifsomething{\backendparameter\c!css}
- {\enabledirectives[backend.export.css={\backendparameter\c!css}]}%
-\to \everysetupbackend
+% \appendtoks
+% \doifsomething{\backendparameter\c!xhtml}
+% {\enabledirectives[backend.export.xhtml=\backendparameter\c!xhtml]}%
+% \doifsomething{\backendparameter\c!css}
+% {\enabledirectives[backend.export.css={\backendparameter\c!css}]}%
+% \doifsomething{\backendparameter\c!alternative}
+% {\enabledirectives[backend.export.alternative={\backendparameter\c!alternative}]}%
+% \to \everysetupbackend
\appendtoks
\doifelsenothing{\backendparameter\c!export}
diff --git a/Master/texmf-dist/tex/context/base/back-ini.lua b/Master/texmf-dist/tex/context/base/back-ini.lua
index c1f973a0c6f..e8af4d9d9c2 100644
--- a/Master/texmf-dist/tex/context/base/back-ini.lua
+++ b/Master/texmf-dist/tex/context/base/back-ini.lua
@@ -6,6 +6,13 @@ if not modules then modules = { } end modules ['back-ini'] = {
license = "see context related readme files"
}
+-- -- how to create a shortcut:
+--
+-- local function something(...)
+-- something = backends.codeinjections.something
+-- return something(...)
+-- end
+
local next, type = next, type
local format = string.format
@@ -106,6 +113,10 @@ function codeinjections.getmatrix() return 1, 0, 0, 1, 0, 0 end
-- can best be here
-function commands.setrealspaces(v)
- nodes.tasks.setaction("shipouts","nodes.handlers.accessibility",v == interfaces.variables.yes)
-end
+interfaces.implement {
+ name = "setrealspaces",
+ arguments = "string",
+ actions = function(v)
+ nodes.tasks.setaction("shipouts","nodes.handlers.accessibility",v == interfaces.variables.yes)
+ end
+}
diff --git a/Master/texmf-dist/tex/context/base/back-ini.mkiv b/Master/texmf-dist/tex/context/base/back-ini.mkiv
index c3bc78ae660..2b0f054eea4 100644
--- a/Master/texmf-dist/tex/context/base/back-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/back-ini.mkiv
@@ -51,8 +51,6 @@
%D Not everything here makes sense and the content of this file will
%D definitely change.
-\newcount\backendtransformlevel
-
\let \dostartrotation \gobbleoneargument
\let \dostoprotation \donothing
\let \dostartscaling \gobbletwoarguments
@@ -157,7 +155,11 @@
% \setupbackend[space=yes] % replace spacing in (pdf) file
\appendtoks
- \ctxcommand{setrealspaces("\backendparameter\c!space")}%
+ \clf_setrealspaces{\backendparameter\c!space}%
\to \everysetupbackend
+%D For older styles:
+
+\let\setupoutput\gobbleoneoptional
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/back-pdf.lua b/Master/texmf-dist/tex/context/base/back-pdf.lua
index 34a28e3f79f..7f0b1acc740 100644
--- a/Master/texmf-dist/tex/context/base/back-pdf.lua
+++ b/Master/texmf-dist/tex/context/base/back-pdf.lua
@@ -6,8 +6,24 @@ if not modules then modules = { } end modules ['back-pdf'] = {
license = "see context related readme files"
}
+-- we could do \pdfmatrix sx <> sy <> etc
+
+local tonumber = tonumber
+local sind, cosd = math.sind, math.cosd
+local insert, remove = table.insert, table.remove
+
local codeinjections = backends.pdf.codeinjections
+local context = context
+
+local scanners = tokens.scanners
+local scanstring = scanners.string
+local scannumber = scanners.number
+local scaninteger = scanners.integer
+local scankeyword = scanners.keyword
+
+local scanners = interfaces.scanners
+
local outputfilename
function codeinjections.getoutputfilename()
@@ -19,15 +35,11 @@ end
backends.install("pdf")
-local context = context
-
-local sind, cosd = math.sind, math.cosd
-local insert, remove = table.insert, table.remove
+local f_matrix = string.formatters["%F %F %F %F"] -- 0.8 is default
-local f_matrix = string.formatters["%0.8F %0.8F %0.8F %0.8F"]
-
-function commands.pdfrotation(a)
+scanners.pdfrotation = function() -- a
-- todo: check for 1 and 0 and flush sparse
+ local a = scannumber()
local s, c = sind(a), cosd(a)
context(f_matrix(c,s,-s,c))
end
@@ -38,27 +50,36 @@ end
--
-- we could also do the save restore wrapping here + colorhack
+local pdfsave = nodes.pool.pdfsave
+local pdfrestore = nodes.pool.pdfrestore
local pdfsetmatrix = nodes.pool.pdfsetmatrix
-local stack = { }
-local function popmatrix()
- local top = remove(stack)
- if top then
- context(pdfsetmatrix(unpack(top)))
- end
-end
+local stack = { }
+local restore = true -- false
-function commands.pdfstartrotation(a)
+scanners.pdfstartrotation = function() -- a
+ local a = scannumber()
if a == 0 then
insert(stack,false)
else
local s, c = sind(a), cosd(a)
+ context(pdfsave())
context(pdfsetmatrix(c,s,-s,c))
- insert(stack,{ c, -s, s, c })
+ insert(stack,restore and { c, -s, s, c } or true)
end
end
-function commands.pdfstartscaling(sx,sy)
+scanners.pdfstartscaling = function() -- sx sy
+ local sx, sy = 0, 0
+ while true do
+ if scankeyword("sx") then
+ sx = scannumber()
+ elseif scankeyword("sy") then
+ sy = scannumber()
+ else
+ break
+ end
+ end
if sx == 1 and sy == 1 then
insert(stack,false)
else
@@ -68,25 +89,62 @@ function commands.pdfstartscaling(sx,sy)
if sy == 0 then
sy = 0.0001
end
+ context(pdfsave())
context(pdfsetmatrix(sx,0,0,sy))
- insert(stack,{ 1/sx, 0, 0, 1/sy })
+ insert(stack,restore and { 1/sx, 0, 0, 1/sy } or true)
end
end
-function commands.pdfstartmirroring()
- context(pdfsetmatrix(-1,0,0,1))
-end
-
-function commands.pdfstartmatrix(sx,rx,ry,sy) -- tx, ty
+scanners.pdfstartmatrix = function() -- sx rx ry sy -- tx, ty
+ local sx, rx, ry, sy = 0, 0, 0, 0
+ while true do
+ if scankeyword("sx") then
+ sx = scannumber()
+ elseif scankeyword("sy") then
+ sy = scannumber()
+ elseif scankeyword("rx") then
+ rx = scannumber()
+ elseif scankeyword("ry") then
+ ry = scannumber()
+ else
+ break
+ end
+ end
if sx == 1 and rx == 0 and ry == 0 and sy == 1 then
insert(stack,false)
else
+ context(pdfsave())
context(pdfsetmatrix(sx,rx,ry,sy))
- insert(stack,{ -sx, -rx, -ry, -sy })
+ insert(stack,store and { -sx, -rx, -ry, -sy } or true)
+ end
+end
+
+local function pdfstopsomething()
+ local top = remove(stack)
+ if top == false then
+ -- not wrapped
+ elseif top == true then
+ context(pdfrestore())
+ elseif top then
+ context(pdfsetmatrix(unpack(top)))
+ context(pdfrestore())
+ else
+ -- nesting error
end
end
-commands.pdfstoprotation = popmatrix
-commands.pdfstopscaling = popmatrix
-commands.pdfstopmirroring = commands.pdfstartmirroring
-commands.pdfstopmatrix = popmatrix
+scanners.pdfstoprotation = pdfstopsomething
+scanners.pdfstopscaling = pdfstopsomething
+scanners.pdfstopmatrix = pdfstopsomething
+
+scanners.pdfstartmirroring = function()
+ context(pdfsetmatrix(-1,0,0,1))
+end
+
+scanners.pdfstopmirroring = scanners.pdfstartmirroring
+
+scanners.registerbackendsymbol = function()
+ backends.codeinjections.registersymbol(scanstring(),scaninteger())
+end
+
+-- todo : clipping
diff --git a/Master/texmf-dist/tex/context/base/back-pdf.mkiv b/Master/texmf-dist/tex/context/base/back-pdf.mkiv
index df959450739..38de4bbfd48 100644
--- a/Master/texmf-dist/tex/context/base/back-pdf.mkiv
+++ b/Master/texmf-dist/tex/context/base/back-pdf.mkiv
@@ -41,17 +41,31 @@
%D
%D Here we initialize some internal quantities. We also protect them.
-\pdfoutput 1 \let\pdfoutput \undefined \newcount\pdfoutput \pdfoutput 1
-\pdfhorigin 1 true in \let\pdfhorigin\undefined \newdimen\pdfhorigin \pdfhorigin 1 true in
-\pdfvorigin 1 true in \let\pdfvorigin\undefined \newdimen\pdfvorigin \pdfvorigin 1 true in
+\pdfoutput \plusone \let\pdfoutput \undefined \newcount\pdfoutput \pdfoutput \plusone
-% most of these will be protected as well
+%D These are already set:
+\pdfhorigin 1 true in \let\pdfhorigin\undefined \newdimen\pdfhorigin \pdfhorigin 1 true in
+\pdfvorigin \pdfhorigin \let\pdfvorigin\undefined \newdimen\pdfvorigin \pdfvorigin \pdfhorigin
+
+%D These too and most of them will be protected as well:
+
+\pdfminorversion \plusseven
+\pdfgentounicode \plusone \let\pdfgentounicode \undefined \newcount\pdfgentounicode
+\pdfinclusioncopyfonts \plusone \let\pdfinclusioncopyfonts \undefined \newcount\pdfinclusioncopyfonts
+\pdfinclusionerrorlevel \zerocount \let\pdfinclusionerrorlevel\undefined \newcount\pdfinclusionerrorlevel
+\pdfdecimaldigits \plusten \let\pdfdecimaldigits \undefined \newcount\pdfdecimaldigits
\pdfimageresolution 300
\pdfpkresolution 600
-\pdfdecimaldigits 10
-\pdfinclusionerrorlevel 0
-\pdfminorversion 6 % use setupbackend for changes
+
+%D Let's block these (we could share a dummy:
+
+\let\pdfcatalog \relax \newtoks\pdfcatalog
+\let\pdfinfo \relax \newtoks\pdfinfo
+\let\pdfnames \relax \newtoks\pdfnames
+\let\pdfpageresources\relax \newtoks\pdfpageresources
+\let\pdfpageattr \relax \newtoks\pdfpageattr
+\let\pdfpagesattr \relax \newtoks\pdfpagesattr
%D This one can be consulted by users although the suffix is also
%D a system mode.
@@ -65,20 +79,20 @@
\appendtoks
\doifsomething{\backendparameter{xmpfile}}
- {\ctxcommand{setxmpfile("\backendparameter{xmpfile}")}}%
+ {\clf_setxmpfile{\backendparameter{xmpfile}}}%
\to \everysetupbackend
% \doifsomething{\backendparameter\c!format} .. at the lua end
\appendtoks
- \ctxcommand{setformat {
- format = "\backendparameter\c!format",
- level = "\backendparameter\c!level",
- option = "\backendparameter\c!option",
- profile = "\backendparameter\c!profile",
- intent = "\backendparameter\c!intent",
- file = "\backendparameter\c!file",
- }}%
+ \clf_setformat
+ format {\backendparameter\c!format}%
+ level {\backendparameter\c!level}%
+ option {\backendparameter\c!option}%
+ profile {\backendparameter\c!profile}%
+ intent {\backendparameter\c!intent}%
+ file {\backendparameter\c!file}%
+ \relax
\to \everysetupbackend
%D For the moment we keep these.
@@ -88,30 +102,22 @@
%D These are the only official methods to add stuff to the resources.
-\unexpanded\def\pdfbackendsetcatalog #1#2{\ctxlua{lpdf.addtocatalog ("#1",\!!bs#2\!!es)}}
-\unexpanded\def\pdfbackendsetinfo #1#2{\ctxlua{lpdf.addtoinfo ("#1",\!!bs#2\!!es)}}
-\unexpanded\def\pdfbackendsetname #1#2{\ctxlua{lpdf.addtonames ("#1",\!!bs#2\!!es)}}
+\unexpanded\def\pdfbackendsetcatalog #1#2{\clf_lpdf_addtocatalog {#1}{#2}}
+\unexpanded\def\pdfbackendsetinfo #1#2{\clf_lpdf_addtoinfo {#1}{#2}}
+\unexpanded\def\pdfbackendsetname #1#2{\clf_lpdf_addtonames {#1}{#2}}
-\unexpanded\def\pdfbackendsetpageattribute #1#2{\ctxlua{lpdf.addtopageattributes ("#1",\!!bs#2\!!es)}}
-\unexpanded\def\pdfbackendsetpagesattribute#1#2{\ctxlua{lpdf.addtopagesattributes("#1",\!!bs#2\!!es)}}
-\unexpanded\def\pdfbackendsetpageresource #1#2{\ctxlua{lpdf.addtopageresources ("#1",\!!bs#2\!!es)}}
+\unexpanded\def\pdfbackendsetpageattribute #1#2{\clf_lpdf_addtopageattributes {#1}{#2}}
+\unexpanded\def\pdfbackendsetpagesattribute#1#2{\clf_lpdf_addtopagesattributes {#1}{#2}}
+\unexpanded\def\pdfbackendsetpageresource #1#2{\clf_lpdf_addtopageresources {#1}{#2}}
-\unexpanded\def\pdfbackendsetextgstate #1#2{\ctxlua{lpdf.adddocumentextgstate ("#1",lpdf.verbose(\!!bs#2\!!es))}}
-\unexpanded\def\pdfbackendsetcolorspace #1#2{\ctxlua{lpdf.adddocumentcolorspace("#1",lpdf.verbose(\!!bs#2\!!es))}}
-\unexpanded\def\pdfbackendsetpattern #1#2{\ctxlua{lpdf.adddocumentpattern ("#1",lpdf.verbose(\!!bs#2\!!es))}}
-\unexpanded\def\pdfbackendsetshade #1#2{\ctxlua{lpdf.adddocumentshade ("#1",lpdf.verbose(\!!bs#2\!!es))}}
+\unexpanded\def\pdfbackendsetextgstate #1#2{\clf_lpdf_adddocumentextgstate {#1}{#2}}
+\unexpanded\def\pdfbackendsetcolorspace #1#2{\clf_lpdf_adddocumentcolorspace{#1}{#2}}
+\unexpanded\def\pdfbackendsetpattern #1#2{\clf_lpdf_adddocumentpattern {#1}{#2}}
+\unexpanded\def\pdfbackendsetshade #1#2{\clf_lpdf_adddocumentshade {#1}{#2}}
- \def\pdfbackendcurrentresources {\cldcontext{lpdf.collectedresources()}}
- \def\pdfcolor #1{\ctxlua{lpdf.pdfcolor(\thecolorattribute{#1})}} \let\PDFcolor\pdfcolor
-
-%D Let's block these:
-
-\let\pdfcatalog \relax \newtoks\pdfcatalog
-\let\pdfinfo \relax \newtoks\pdfinfo
-\let\pdfnames \relax \newtoks\pdfnames
-\let\pdfpageresources\relax \newtoks\pdfpageresources
-\let\pdfpageattr \relax \newtoks\pdfpageattr
-\let\pdfpagesattr \relax \newtoks\pdfpagesattr
+ \def\pdfbackendcurrentresources {\clf_lpdf_collectedresources}
+ \def\pdfcolor #1{\clf_lpdf_color\numexpr\thecolorattribute{#1}\relax}
+ \let\PDFcolor\pdfcolor
%D An example of usage is:
@@ -120,99 +126,85 @@
\pdfbackendsetinfo{ConTeXt.Time} {\number\normalyear.\twodigits\normalmonth.\twodigits\normalday\space \twodigits\currenthour:\twodigits\currentminute}%
\pdfbackendsetinfo{ConTeXt.Jobname}{\jobname}%
\pdfbackendsetinfo{ConTeXt.Url} {www.pragma-ade.com}%
+ \pdfbackendsetinfo{ConTeXt.Support}{contextgarden.net}%
\to \everylastbackendshipout
%D Transformations. Some day we will use primitives (once they're fixed).
+
% todo: inject at the lua end cq. deal with #5 and #6 too
% % % rotation % % %
-\unexpanded\def\dostartrotation#1% grouped
- {\advance\backendtransformlevel\plusone
- \forcecolorhack
- \pdfsave
- \pdfsetmatrix{\ctxcommand{pdfrotation(#1)}}}
-
-\unexpanded\def\dostoprotation
- {\pdfrestore
- \forcecolorhack
- \advance\backendtransformlevel\minusone}
-
% \unexpanded\def\dostartrotation#1% grouped
% {\forcecolorhack
-% \advance\backendtransformlevel\plusone
-% \ctxcommand{pdfstartrotation(#1)}}
+% \pdfsave
+% \pdfsetmatrix{\clf_pdfrotation#1}}
% \unexpanded\def\dostoprotation
-% {\ctxcommand{pdfstoprotation()}%
-% \advance\backendtransformlevel\minusone}
+% {\pdfrestore
+% \forcecolorhack}
-% % % scaling % % %
+\unexpanded\def\dostartrotation#1%
+ {\forcecolorhack
+ \clf_pdfstartrotation#1\relax}
-\unexpanded\def\dostartscaling#1#2% the test is needed because acrobat is bugged!
- {\advance\backendtransformlevel\plusone
- \forcecolorhack % maybe use signal instead
- \pdfsave
- \pdfsetmatrix
- {\ifdim#1\points=\zeropoint.0001\else#1\fi\space 0 0
- \ifdim#2\points=\zeropoint.0001\else#2\fi\space}}% 0 0
+\unexpanded\def\dostoprotation
+ {\clf_pdfstoprotation}
-\unexpanded\def\dostopscaling
- {\pdfrestore
- \forcecolorhack
- \advance\backendtransformlevel\minusone}
+% % % scaling % % %
% \unexpanded\def\dostartscaling#1#2% the test is needed because acrobat is bugged!
-% {\forcecolorhack
-% \advance\backendtransformlevel\plusone
-% \ctxcommand{pdfstartscaling(#1,#2)}}
+% {\forcecolorhack % maybe use signal instead
+% \pdfsave
+% \pdfsetmatrix
+% {\ifdim#1\points=\zeropoint.0001\else#1\fi\space 0 0
+% \ifdim#2\points=\zeropoint.0001\else#2\fi\space}}% 0 0
% \unexpanded\def\dostopscaling
-% {\ctxcommand{pdfstopscaling()}%
-% \advance\backendtransformlevel\minusone}
+% {\pdfrestore
+% \forcecolorhack}
-% % % mirroring % % %
+\unexpanded\def\dostartscaling#1#2%
+ {\forcecolorhack
+ \clf_pdfstartscaling sx #1 sy #2\relax}
-\unexpanded\def\dostartmirroring
- {\advance\backendtransformlevel\plusone
- \forcecolorhack
- \pdfsave
- \pdfsetmatrix{-1 0 0 1}} % 0 0
+\unexpanded\def\dostopscaling
+ {\clf_pdfstopscaling}
-\unexpanded\def\dostopmirroring
- {\pdfrestore
- \forcecolorhack
- \advance\backendtransformlevel\minusone}
+% % % mirroring % % %
% \unexpanded\def\dostartmirroring
-% {\advance\backendtransformlevel\plusone
-% \ctxcommand{pdfstartmirroring()}}
+% {\forcecolorhack
+% \pdfsave
+% \pdfsetmatrix{-1 0 0 1}} % 0 0
% \unexpanded\def\dostopmirroring
-% {\ctxcommand{pdfstopmirroring()}%
-% \advance\backendtransformlevel\minusone}
+% {\pdfrestore
+% \forcecolorhack}
+
+\unexpanded\def\dostartmirroring
+ {\clf_pdfstartmirroring}
+
+\unexpanded\def\dostopmirroring
+ {\clf_pdfstopmirroring}
% % % transform % % %
-\unexpanded\def\dotransformnextbox#1#2#3#4#5#6% sx rx ry sy tx ty (will change) / basepoints !
- {\advance\backendtransformlevel\plusone
- % fixing ht/dp/wd should happen elsewhere
- \dowithnextbox{\dodotransformnextbox{#5}{#6}{#1 #2 #3 #4}}}
-
-\unexpanded\def\dodotransformnextbox#1#2#3%
- {%\forcecolorhack
- \hbox
- {\kern#1\onebasepoint
- \raise#2\onebasepoint\hbox
- {\pdfsave
- \pdfsetmatrix{#3}% 0 0 (no #5 #6 yet)
- \box\nextbox
- \pdfrestore
- \advance\backendtransformlevel\minusone}}}
+% \unexpanded\def\dotransformnextbox#1#2#3#4#5#6% sx rx ry sy tx ty (will change) / basepoints !
+% {\dowithnextbox{\dodotransformnextbox{#5}{#6}{#1 #2 #3 #4}}}
+
+% \unexpanded\def\dodotransformnextbox#1#2#3%
+% {\hbox
+% {\kern#1\onebasepoint
+% \raise#2\onebasepoint\hbox
+% {\pdfsave
+% \pdfsetmatrix{#3}% 0 0 (no #5 #6 yet)
+% \box\nextbox
+% \pdfrestore
+% }}}
% \unexpanded\def\dotransformnextbox#1#2#3#4#5#6% sx rx ry sy tx ty (will change) / basepoints !
-% {\advance\backendtransformlevel\plusone
-% % fixing ht/dp/wd should happen elsewhere
+% {% fixing ht/dp/wd should happen elsewhere
% \dowithnextbox{\dodotransformnextbox{#1}{#2}{#3}{#4}{#5}{#6}}}
% \unexpanded\def\dodotransformnextbox#1#2#3#4#5#6%
@@ -220,17 +212,67 @@
% {\kern #5\onebasepoint
% \raise#6\onebasepoint
% \hbox
-% {\ctxcommand{pdfstartmatrix(#1,#2,#3,#4)}%
+% {\clf_pdfstartmatrix sx #1 rx #2 ry #3 sy #4\relax
% \box\nextbox
-% \ctxcommand{pdfstopmatrix()}%
-% \advance\backendtransformlevel\minusone}}}
+% \clf_pdfstopmatrix}}}
+
+\unexpanded\def\dotransformnextbox#1#2#3#4#5#6% sx rx ry sy tx ty (will change) / basepoints !
+ {\dowithnextbox{\dodotransformnextbox{#1}{#2}{#3}{#4}{#5}{#6}}}
+
+\unexpanded\def\dodotransformnextbox#1#2#3#4#5#6%
+ {\hbox
+ {\kern #5\onebasepoint
+ \raise#6\onebasepoint
+ \hbox
+ {\clf_pdfstartmatrix sx #1 rx #2 ry #3 sy #4\relax
+ \box\nextbox
+ \clf_pdfstopmatrix}}}
+
+% somehow the shift is not happening .. bug in luatex?
+%
+% \unexpanded\def\dodotransformnextbox#1#2#3#4#5#6%
+% {\ctxcommand{pdftransformbox(\number\nextbox,#1,#2,#3,#4,\number\dimexpr#5\onebasepoint,\number\dimexpr#6\onebasepoint)}%
+% \box\nextbox}
+%
+% \startluacode
+% function commands.pdftransformbox(box,sx,rx,ry,sy,tx,ty)
+% if sx == 1 and rx == 0 and ry == 0 and sy == 1 then
+% if tx == 0 and ty == 0 then
+% local b = nodes.hpack(nodes.concat {
+% nodes.pool.kern(tx),
+% nodes.takebox(box),
+% })
+% b.shift = -ty
+% tex.setbox(box,b)
+% else
+% -- no need to transform
+% end
+% else
+% local b = nodes.hpack(nodes.concat {
+% nodes.pool.kern(tx),
+% nodes.pool.pdfsave(),
+% nodes.pool.pdfsetmatrix(sx,rx,ry,sy),
+% nodes.takebox(box),
+% nodes.pool.pdfsetmatrix(-sx,-rx,-ry,-sy),
+% nodes.pool.pdfrestore(),
+% })
+% b.shift = -ty
+% tex.setbox(box,b)
+% end
+% end
+% \stopluacode
% % % clipping % % %
\unexpanded\def\dostartclipping#1#2#3% we can move this to lua and only set a box here
{\PointsToBigPoints{#2}\width
\PointsToBigPoints{#3}\height
- \meta_grab_clip_path{#1}\width\height{0 0 m \width\space 0 l \width \height l 0 \height l}%
+ \meta_grab_clip_path{#1}\width\height{%
+ 0 0 m %
+ \width\space 0 l %
+ \width\space \height\space l %
+ 0 \height\space l%
+ }%
\pdfliteral{q 0 w \MPclippath\space W n}}
\unexpanded\def\dostopclipping
@@ -270,13 +312,13 @@
{\the\pdfbackendeveryxform
\finalizeobjectbox\objectbox
\immediate\pdfxform resources {\pdfbackendcurrentresources}\objectbox
- \dosetobjectreference{#1}{#2}{\the\pdflastxform}}
+ \dosetobjectreference{#1}{#2}\pdflastxform}
\let\m_back_object_reference\empty
-\def\doinsertobject#1#2%
+\unexpanded\def\doinsertobject#1#2%
{\begingroup
- \doifobjectreferencefoundelse{#1}{#2}
+ \doifelseobjectreferencefound{#1}{#2}
{\dogetobjectreference{#1}{#2}\m_back_object_reference
\pdfrefxform\m_back_object_reference}%
\donothing
@@ -284,12 +326,12 @@
\let\lastpredefinedsymbol\empty % some day we can do more at the lua end
-\def\predefinesymbol[#1]%
+\unexpanded\def\predefinesymbol[#1]%
{\begingroup
\xdef\lastpredefinedsymbol{#1}%
\settightobject{SYM}{#1}\hbox{\symbol[#1]}% to be checked ... maybe only fitting
\dogetobjectreference{SYM}{#1}\m_back_object_reference
- \ctxlua{backends.codeinjections.registersymbol("#1",\m_back_object_reference)}%
+ \clf_registerbackendsymbol{#1}\m_back_object_reference\relax
\endgroup}
% for the moment here
@@ -527,7 +569,7 @@
\xmin \space \ymin \space \xmin \space \yymin\space y
\or % 28
\fi
- \ifnum\mode>8\space
+ \ifnum\mode>\pluseight\space
S
\else
\ifnum\dostroke=\plusone S \fi
@@ -541,13 +583,15 @@
\box\scratchbox
\egroup}
-\unexpanded\def\pdfactualtext#1#2% not interfaced
- {\pdfliteral direct{/Span <</ActualText \ctxlua{tex.write(lpdf.tosixteen("#2"))} >> BDC}%
+\unexpanded\def\pdfbackendactualtext#1#2% not interfaced
+ {\clf_startactualtext{#2}%
#1%
- \pdfliteral direct{EMC}}
+ \clf_stopactualtext}
+
+\let\pdfactualtext\pdfbackendactualtext
% \starttext
-% text \pdfactualtext{Meier}{Müller} text
+% text \pdfbackendactualtext{Meier}{Müller} text
% \stoptext
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/bibl-bib.mkiv b/Master/texmf-dist/tex/context/base/bibl-bib.mkiv
index d9010294d55..80d04099bd2 100644
--- a/Master/texmf-dist/tex/context/base/bibl-bib.mkiv
+++ b/Master/texmf-dist/tex/context/base/bibl-bib.mkiv
@@ -320,7 +320,7 @@
% [\c!sorttype=\v!cite,
% \c!sort=no]
-% \long\unexpanded\def\startpublication#1\stoppublication
+% \unexpanded\def\startpublication#1\stoppublication
% {\blank
% todo
% \blank}
@@ -628,7 +628,7 @@
\strc_lists_place_current
{\currentbibtexsession}
{\currentbibtexcriterium}
- {\namedlistparameter\currentbibtexsession\c!number}%
+ {}%
{\namedlistparameter\currentbibtexsession\c!extras}%
{\namedlistparameter\currentbibtexsession\c!order}%
\ctxlua{bibtex.hacks.flush("\bibtexpublicationsparameter\c!sorttype")}%
@@ -648,7 +648,7 @@
\fi\fi}
\def\dotypesetbibtexpublication
- {\doifbibreferencefoundelse\currentbibtexsessiontag
+ {\doifelsebibreferencefound\currentbibtexsessiontag
{\global\advance\bibtexcounter\plusone
\ctxlua{bibtex.hacks.registerplaced("\currentbibtexsessiontag")}%
\let\currentlist\currentbibtexsession
@@ -680,13 +680,13 @@
\unexpanded\def\bibtexcitation[#1]%
{\edef\currentbibtexsession{#1}%
- \strictdoifnextoptionalelse\dobibtexcitation\dobibtexref}
+ \strictdoifelsenextoptional\dobibtexcitation\dobibtexref}
\def\dobibtexref#1%
{\dodobibtexcitation[#1][]}
\def\dobibtexcitation[#1]%
- {\strictdoifnextoptionalelse{\dodobibtexcitation[#1]}{\dodobibtexcitation[#1][]}}
+ {\strictdoifelsenextoptional{\dodobibtexcitation[#1]}{\dodobibtexcitation[#1][]}}
\def\dodobibtexcitation[#1][#2]%
{\dontleavehmode
@@ -702,7 +702,7 @@
\def\dowhatevercitation#1#2%
{\processcommalist[#2]\dobibtexcitationindeed
\setupinteraction[\c!style=]% use flag instead
- \doifassignmentelse{#1}
+ \doifelseassignment{#1}
{\getparameters[\??pb\??pb][\c!alternative=,\c!extras=,#1]%
\edef\currentbibtexvariant{\@@pb@@pbalternative}%
\ifx\currentbibtexvariant\empty
@@ -808,7 +808,7 @@
% helpers
-\def\doifbibtexinteractionelse
+\unexpanded\def\doifelsebibtexinteraction
{\iflocation
\edef\temp{\bibtexcitationparameter\c!interaction}%
\ifx\temp\v!stop
@@ -820,6 +820,8 @@
\@EA\secondoftwoarguments
\fi}
+\let\doifbibtexinteractionelse\doifelsebibtexinteraction
+
% variants
% todo: lastsep here
@@ -837,23 +839,23 @@
\fi}
\def\inbibtexlink#1#2%
- {\doifreferencefoundelse{\bibtexrefprefix#1}
+ {\doifelsereferencefound{\bibtexrefprefix#1}
{\goto{#2}[\bibtexrefprefix#1]}
{!#1!}}
\def\dobibtexgotolink#1#2%
- {\doifreferencefoundelse{\bibtexrefprefix#1}
+ {\doifelsereferencefound{\bibtexrefprefix#1}
{\goto{#2}[\bibtexrefprefix#1]}
{!#1!}}
\def\dobibattexlink#1#2%
- {\doifreferencefoundelse{\bibtexrefprefix#1}
+ {\doifelsereferencefound{\bibtexrefprefix#1}
{\at{#2}[\bibtexrefprefix#1]}
{!#1!}}
\def\dobibtexurllink#1#2%
{\expanded{\useURL[bibtex:url:#1][#2]}%
- \doifbibtexinteractionelse
+ \doifelsebibtexinteraction
{\goto{\url[bibtex:url:#1]}[url(bibtex:url:#1)]}
{\url[bibtex:url:#1]}}
diff --git a/Master/texmf-dist/tex/context/base/bibl-tra.mkii b/Master/texmf-dist/tex/context/base/bibl-tra.mkii
index a9ce392a22a..868ca0fc681 100644
--- a/Master/texmf-dist/tex/context/base/bibl-tra.mkii
+++ b/Master/texmf-dist/tex/context/base/bibl-tra.mkii
@@ -642,8 +642,7 @@
%D If you want to write an extension to the styles, you might
%D as well define some of these commands yourself.
%D
-%D The argument liust has been reordered here, and the meanings
-%D are:
+%D The argument list has been reordered here, and the meanings are:
%D
%D {\obeylines\parskip0pt
%D \type{#1} firstnames
diff --git a/Master/texmf-dist/tex/context/base/bibl-tra.mkiv b/Master/texmf-dist/tex/context/base/bibl-tra.mkiv
index 06af7e11d21..4c9e83fdf9d 100644
--- a/Master/texmf-dist/tex/context/base/bibl-tra.mkiv
+++ b/Master/texmf-dist/tex/context/base/bibl-tra.mkiv
@@ -450,8 +450,8 @@
\unexpanded\def\bibinsertmonth#1#2#3%
{\bibdoifelse\@@pb@month
- {#1\doifnumberelse\@@pb@month
- {\doifconversiondefinedelse\@@pbmonthconversion
+ {#1\doifelsenumber\@@pb@month
+ {\doifelseconversiondefined\@@pbmonthconversion
{\convertnumber\@@pbmonthconversion\@@pb@month}{\@@pb@month}}%
{\@@pb@month}#2}%
{#3}}
@@ -686,10 +686,10 @@
\unexpanded\def\dostartpublication[#1]%
{\begingroup
- \doifassignmentelse{#1}%
+ \doifelseassignment{#1}%
{\getparameters[\??pb][k=\s!unknown,t=article,n=,s=,a=,y=,o=,u=,#1]}%
{\getparameters[\??pb][k=#1,t=article,n=,s=,a=,y=,o=,u=]}%
- \ctxlua{bibtex.hacks.register("\@@pbk","\@@pbs")}%
+ \ctxlua{bibtex.hacks.register(\!!bs\@@pbk\!!es,\!!bs\@@pbs\!!es)}%
\catcode\commentasciicode\othercatcode
\dodostartpublication}
@@ -717,12 +717,14 @@
\def\bibgetvaru#1{\csname pbd:#1\endcsname\pluseight}
\def\bibgetvard#1{\csname pbd:#1\endcsname\plusnine }
-\unexpanded\def\doifbibreferencefoundelse#1%
+\unexpanded\def\doifelsebibreferencefound#1%
{\preloadbiblist
- \doifdefinedelse{pbd:#1}
+ \doifelsedefined{pbd:#1}
\firstoftwoarguments
{\showmessage\m!publications{5}{#1,\the\inputlineno}\secondoftwoarguments}}
+\let\doifbibreferencefoundelse\doifelsebibreferencefound
+
%D \macros{bib@crossref}
%D
%D \type{\crossref} is used in database files to point to another
@@ -765,7 +767,7 @@
\strc_lists_place_current
{pubs}%
{\listparameter\c!criterium}%
- {\listparameter\c!number}%
+ {}%
{\listparameter\c!extras}%
{\listparameter\c!order}}%
\ctxlua{bibtex.hacks.flush("\@@pbsorttype")}%
@@ -878,7 +880,7 @@
% we'll define proper handlers later
\unexpanded\def\doplacepublicationindeed#1%
- {\doifbibreferencefoundelse{#1}
+ {\doifelsebibreferencefound{#1}
{\global\advance\bibtexcounter\plusone
\def\currentpublicationkey{#1}%
\ctxlua{bibtex.hacks.registerplaced("#1")}%
@@ -932,13 +934,13 @@
%D in included data from the \type{.bib} file).
\unexpanded\def\cite
- {\strictdoifnextoptionalelse\dodocite\dobibref}
+ {\strictdoifelsenextoptional\dodocite\dobibref}
\unexpanded\def\dobibref#1%
{\docite[#1][]}
\unexpanded\def\dodocite[#1]%
- {\strictdoifnextoptionalelse{\docite[#1]}{\docite[#1][]}}
+ {\strictdoifelsenextoptional{\docite[#1]}{\docite[#1][]}}
\unexpanded\def\docite[#1][#2]%
{\begingroup
@@ -953,7 +955,7 @@
\unexpanded\def\dowhatevercite#1#2%
{\processcommalist[#2]\docitation
\setupinteraction[\c!style=]%
- \doifassignmentelse
+ \doifelseassignment
{#1}%
{\getparameters[LO][\c!alternative=,\c!extras=,#1]%
\edef\@@currentalternative{\LOalternative}%
@@ -1007,7 +1009,7 @@
\unexpanded\def\getcitedata#1[#2]#3[#4]#5to#6%
{\bgroup
\dofetchapublication{#4}%
- \doifdefinedelse{\??pb @bib#2}%
+ \doifelsedefined{\??pb @bib#2}%
{\xdef#6{\getvalue{\??pb @bib#2}}}%
{\xdef#6{\getvalue{\??pb @#2}}}%
\egroup}
@@ -1139,7 +1141,7 @@
%D but it will do for now.
\unexpanded\def\docurrentbibauthor#1,#2%
- {\doifemptyelse{#2}
+ {\doifelseempty{#2}
{\def\currentbibauthor{#1\bibalternative{otherstext}}}
{\expandafter\ifx\csname\??pv\@@currentalternative authoretallimit\endcsname\relax
\edef\currentbibauthor{#1\bibalternative{andtext}#2}%
@@ -1154,7 +1156,7 @@
%D \type{\doglobal }
\unexpanded\def\robustaddtocommalist#1#2% {item} \cs
- {\robustdoifinsetelse{#1}#2\resetglobal
+ {\robustdoifelseinset{#1}#2\resetglobal
{\dodoglobal\xdef#2{\ifx#2\empty\else#2,\fi#1}}}
%D \macros{donormalbibauthoryear}
@@ -1165,7 +1167,7 @@
\unexpanded\def\donormalbibauthoryear#1%
{\def\myauthor{Xxxxxxxxxx}%
\def\myyear{0000}%
- \doifbibreferencefoundelse{#1}
+ \doifelsebibreferencefound{#1}
{\def\myauthor{{\bibgetvara{#1}}}%
\def\myyear {\bibgetvary{#1}}}%
{}%
@@ -1181,7 +1183,7 @@
\unexpanded\def\docompressbibauthoryear#1%
{\def\myauthor{Xxxxxxxxxx}%
\def\myyear {0000}%
- \doifbibreferencefoundelse{#1}
+ \doifelsebibreferencefound{#1}
{\xdef\myauthor{\bibgetvara{#1}}%
\xdef\myyear {\bibgetvary{#1}}}
{}%
@@ -1202,7 +1204,7 @@
%D information in the correct item of \type{\thebibyears}
\unexpanded\def\checkifmyauthoralreadyexists
- {\doifemptyelsevalue{thebibauthors}
+ {\doifelseemptyvalue{thebibauthors}
{\global\bibitemwanted \plusone
\global\bibitemcounter\plusone
\xdef\thebibauthors{{\myauthor}}}
@@ -1250,9 +1252,9 @@
%D Beware, we can have cites without reference match.
-\unexpanded\def\gotobiblink#1[#2]{\doifreferencefoundelse{\bibrefprefix#2}{\goto{#1}[\bibrefprefix#2]}{#1}}
-\unexpanded\def\atbiblink [#1]{\doifreferencefoundelse{\bibrefprefix#1}{\at [\bibrefprefix#1]}{#1}}
-\unexpanded\def\inbiblink [#1]{\doifreferencefoundelse{\bibrefprefix#1}{\expanded{\goto{\currentreferencetext}}[\bibrefprefix#1]}{#1}}
+\unexpanded\def\gotobiblink#1[#2]{\doifelsereferencefound{\bibrefprefix#2}{\goto{#1}[\bibrefprefix#2]}{#1}}
+\unexpanded\def\atbiblink [#1]{\doifelsereferencefound{\bibrefprefix#1}{\at [\bibrefprefix#1]}{#1}}
+\unexpanded\def\inbiblink [#1]{\doifelsereferencefound{\bibrefprefix#1}{\expanded{\goto{\currentreferencetext}}[\bibrefprefix#1]}{#1}}
%D \macros{bibauthoryearref,bibauthoryearsref,bibauthorref,bibyearref}
%D
@@ -1260,7 +1262,7 @@
%D \type{\ixbibauthoryearref} stores the data in the macros
%D \type{\currentbibauthor} and \type{\currentbibyear}.
-\unexpanded\def\doifbibinteractionelse
+\unexpanded\def\doifelsebibinteraction
{\iflocation
\edef\test{\bibalternative\c!interaction}%
\ifx\test\v!stop
@@ -1272,8 +1274,10 @@
\expandafter\secondoftwoarguments
\fi}
+\let\doifbibinteractionelse\doifelsebibinteraction
+
\unexpanded\def\bibmaybeinteractive#1#2%
- {\doifbibinteractionelse{\gotobiblink{#2}[#1]}{#2}}
+ {\doifelsebibinteraction{\gotobiblink{#2}[#1]}{#2}}
\unexpanded\def\bibauthoryearref[#1]%
{\ixbibauthoryear{#1}%
@@ -1338,7 +1342,7 @@
\unexpanded\def\dobibshortref#1%
{\bibinsertrefsep
- \doifbibreferencefoundelse{#1}
+ \doifelsebibreferencefound{#1}
{\gotobiblink{\bibgetvars{#1}}[#1]}
{}}
@@ -1349,7 +1353,7 @@
\unexpanded\def\dobibserialref#1%
{\bibinsertrefsep
- \doifbibreferencefoundelse{#1}
+ \doifelsebibreferencefound{#1}
{\gotobiblink{\bibgetvarn{#1}}[#1]}
{}}
@@ -1363,7 +1367,7 @@
\gotobiblink{#1}[#1]}
\unexpanded\def\bibgotoDOI#1#2%
- {\doifbibinteractionelse
+ {\doifelsebibinteraction
{\useURL[bibfooDoi#1][#2]%
\useURL[bibfoo#1][http://dx.doi.org/#2]%
\goto{\url[bibfooDoi#1]}[url(bibfoo#1)]}
@@ -1376,7 +1380,7 @@
\unexpanded\def\dobibdoiref#1%
{\bibinsertrefsep
- \doifbibreferencefoundelse{#1}
+ \doifelsebibreferencefound{#1}
{\expanded{\bibgotoDOI{#1}{\bibgetvaro{#1}}}}
{}}
@@ -1386,13 +1390,13 @@
\bibalternative\v!right}
\unexpanded\def\bibgotoURL#1#2%
- {\doifbibinteractionelse
+ {\doifelsebibinteraction
{\useURL[bibfoo#1][#2]\goto{\url[bibfoo#1]}[url(bibfoo#1)]}
{\hyphenatedurl{#2}}}
\unexpanded\def\dobiburlref#1%
{\bibinsertrefsep
- \doifbibreferencefoundelse{#1}
+ \doifelsebibreferencefound{#1}
{\expanded{\bibgotoURL{#1}{\bibgetvaru{#1}}}}
{}}
@@ -1403,7 +1407,7 @@
\unexpanded\def\dobibtyperef#1%
{\bibinsertrefsep
- \doifbibreferencefoundelse{#1}
+ \doifelsebibreferencefound{#1}
{\gotobiblink{\bibgetvart{#1}}[#1]}
{}}
@@ -1414,7 +1418,7 @@
\unexpanded\def\dobibpageref#1%
{\bibinsertrefsep
- \doifbibinteractionelse
+ \doifelsebibinteraction
{\atbiblink[#1]}
{{\referencingfalse\at[#1]}}}
@@ -1425,7 +1429,7 @@
\unexpanded\def\dobibdata#1%
{\bibinsertrefsep
- \doifbibreferencefoundelse{#1}
+ \doifelsebibreferencefound{#1}
{\dotypesetapublication{#1}}
{}}
@@ -1476,7 +1480,7 @@
\unexpanded\def\dobibauthornumref#1%
{\bibinsertrefsep
- \doifbibreferencefoundelse{#1}
+ \doifelsebibreferencefound{#1}
{\begingroup
\cite[\c!left=,\c!right=,\c!alternative=\v!author][#1]%
\bibalternative\c!inbetween
diff --git a/Master/texmf-dist/tex/context/base/blob-ini.lua b/Master/texmf-dist/tex/context/base/blob-ini.lua
index 32fac766254..b837250ce70 100644
--- a/Master/texmf-dist/tex/context/base/blob-ini.lua
+++ b/Master/texmf-dist/tex/context/base/blob-ini.lua
@@ -45,6 +45,8 @@ local tohpackfast = typesetters.tohpackfast
local tovpack = typesetters.tovpack
local tovpackfast = typesetters.tovpackfast
+local implement = interfaces.implement
+
blobs = blobs or { }
-- provide copies here (nicer for manuals)
@@ -195,18 +197,7 @@ blobs.strht = strht
blobs.strdp = strdp
blobs.strhd = strhd
-function commands.strwd(str) context(strwd(str)) end
-function commands.strht(str) context(strht(str)) end
-function commands.strdp(str) context(strdp(str)) end
-function commands.strhd(str) context(strhd(str)) end
-
--- less efficient:
---
--- function commands.widthof(str)
--- local b = blobs.new()
--- blobs.append(b,str)
--- blobs.pack(b)
--- local w = blobs.dimensions(b)
--- context(number.todimen(w))
--- blobs.dispose(b)
--- end
+implement { name = "strwd", arguments = "string", actions = { strwd, context } }
+implement { name = "strht", arguments = "string", actions = { strht, context } }
+implement { name = "strdp", arguments = "string", actions = { strdp, context } }
+implement { name = "strhd", arguments = "string", actions = { strhd, context } }
diff --git a/Master/texmf-dist/tex/context/base/blob-ini.mkiv b/Master/texmf-dist/tex/context/base/blob-ini.mkiv
index 1dfb766f459..64582c0db59 100644
--- a/Master/texmf-dist/tex/context/base/blob-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/blob-ini.mkiv
@@ -27,10 +27,10 @@
% this one takes simple (utf) strings
-\def\wdofstring#1{\dimexpr\ctxcommand{strwd(\!!bs#1\!!es)}\scaledpoint\relax}
-\def\htofstring#1{\dimexpr\ctxcommand{strht(\!!bs#1\!!es)}\scaledpoint\relax}
-\def\dpofstring#1{\dimexpr\ctxcommand{strdp(\!!bs#1\!!es)}\scaledpoint\relax}
-\def\hdofstring#1{\dimexpr\ctxcommand{strhd(\!!bs#1\!!es)}\scaledpoint\relax}
+\def\wdofstring#1{\dimexpr\clf_strwd{#1}\scaledpoint\relax}
+\def\htofstring#1{\dimexpr\clf_strht{#1}\scaledpoint\relax}
+\def\dpofstring#1{\dimexpr\clf_strdp{#1}\scaledpoint\relax}
+\def\hdofstring#1{\dimexpr\clf_strhd{#1}\scaledpoint\relax}
\def\widthofstring {\the\wdofstring}
\def\heightofstring {\the\htofstring}
diff --git a/Master/texmf-dist/tex/context/base/buff-imp-default.lua b/Master/texmf-dist/tex/context/base/buff-imp-default.lua
index 72a49d6253b..79f01c47d31 100644
--- a/Master/texmf-dist/tex/context/base/buff-imp-default.lua
+++ b/Master/texmf-dist/tex/context/base/buff-imp-default.lua
@@ -20,7 +20,7 @@ local grammar = { "visualizer",
beginline = makepattern(handler,"beginline",patterns.beginline),
newline = makepattern(handler,"newline", patterns.newline),
space = makepattern(handler,"space", patterns.space),
- default = makepattern(handler,"default", patterns.utf8char),
+ default = makepattern(handler,"default", patterns.utf8character),
content = makepattern(handler,"default", patterns.somecontent), -- not too efficient
-- handy
diff --git a/Master/texmf-dist/tex/context/base/buff-imp-lua.lua b/Master/texmf-dist/tex/context/base/buff-imp-lua.lua
index 4396c1ab8a1..e873a34d182 100644
--- a/Master/texmf-dist/tex/context/base/buff-imp-lua.lua
+++ b/Master/texmf-dist/tex/context/base/buff-imp-lua.lua
@@ -159,11 +159,11 @@ end
local grammar = visualizers.newgrammar("default", { "visualizer",
sstring =
makepattern(handler,"quote",patterns.dquote)
- * (V("whitespace") + makepattern(handler,"string",1-patterns.dquote))^0 -- patterns.nodquote
+ * (V("whitespace") + makepattern(handler,"string",(1-patterns.dquote-V("whitespace"))^1))^0 -- patterns.nodquote
* makepattern(handler,"quote",patterns.dquote),
dstring =
makepattern(handler,"quote",patterns.squote)
- * (V("whitespace") + makepattern(handler,"string",1-patterns.squote))^0 -- patterns.nosquote
+ * (V("whitespace") + makepattern(handler,"string",(1-patterns.squote-V("whitespace"))^1))^0 -- patterns.nosquote
* makepattern(handler,"quote",patterns.squote),
longstring =
longstring / long,
diff --git a/Master/texmf-dist/tex/context/base/buff-ini.lua b/Master/texmf-dist/tex/context/base/buff-ini.lua
index c4046d649ed..1ad3c905ade 100644
--- a/Master/texmf-dist/tex/context/base/buff-ini.lua
+++ b/Master/texmf-dist/tex/context/base/buff-ini.lua
@@ -11,6 +11,8 @@ local type, next, load = type, next, load
local sub, format = string.sub, string.format
local splitlines, validstring = string.splitlines, string.valid
local P, Cs, patterns, lpegmatch = lpeg.P, lpeg.Cs, lpeg.patterns, lpeg.match
+local utfchar = utf.char
+local totable = string.totable
local trace_run = false trackers.register("buffers.run", function(v) trace_run = v end)
local trace_grab = false trackers.register("buffers.grab", function(v) trace_grab = v end)
@@ -23,6 +25,21 @@ local report_grabbing = logs.reporter("buffers","grabbing")
local context = context
local commands = commands
+local implement = interfaces.implement
+
+local scanners = tokens.scanners
+local scanstring = scanners.string
+local scaninteger = scanners.integer
+local scanboolean = scanners.boolean
+local scancode = scanners.code
+local scantoken = scanners.token
+
+local getters = tokens.getters
+local gettoken = getters.token
+
+local compilescanner = tokens.compile
+local scanners = interfaces.scanners
+
local variables = interfaces.variables
local settings_to_array = utilities.parsers.settings_to_array
local formatters = string.formatters
@@ -33,6 +50,8 @@ local registertempfile = luatex.registertempfile
local v_yes = variables.yes
+local p_whitespace = patterns.whitespace
+
local catcodenumbers = catcodes.numbers
local ctxcatcodes = catcodenumbers.ctxcatcodes
@@ -165,17 +184,28 @@ buffers.loadcontent = loadcontent
-- the context interface
-commands.erasebuffer = erase
-commands.assignbuffer = assign
+implement {
+ name = "assignbuffer",
+ actions = assign,
+ arguments = { "string", "string", "integer" }
+}
+
+implement {
+ name = "erasebuffer",
+ actions = erase,
+ arguments = "string"
+}
local anything = patterns.anything
local alwaysmatched = patterns.alwaysmatched
+local utf8character = patterns.utf8character
local function countnesting(b,e)
local n
local g = P(b) / function() n = n + 1 end
+ P(e) / function() n = n - 1 end
- + anything
+ -- + anything
+ + utf8character
local p = alwaysmatched / function() n = 0 end
* g^0
* alwaysmatched / function() return n end
@@ -232,7 +262,7 @@ local continue = false
-- how about tabs
-local getmargin = (Cs(P(" ")^1)*P(-1)+1)^1
+local getmargin = (Cs(P(" ")^1)*P(-1)+1)^1 -- 1 or utf8character
local eol = patterns.eol
local whatever = (P(1)-eol)^0 * eol^1
@@ -255,51 +285,162 @@ local function undent(str) -- new version, needs testing: todo: not always neede
return lpegmatch(stripper,str) or str
end
-function commands.grabbuffer(name,begintag,endtag,bufferdata,catcodes,doundent) -- maybe move \\ to call
- local dn = getcontent(name)
- if dn == "" then
- nesting = 0
- continue = false
- end
- if trace_grab then
- if #bufferdata > 30 then
- report_grabbing("%s => |%s..%s|",name,sub(bufferdata,1,10),sub(bufferdata,-10,#bufferdata))
+buffers.undent = undent
+
+-- function commands.grabbuffer(name,begintag,endtag,bufferdata,catcodes,doundent) -- maybe move \\ to call
+-- local dn = getcontent(name)
+-- if dn == "" then
+-- nesting = 0
+-- continue = false
+-- end
+-- if trace_grab then
+-- if #bufferdata > 30 then
+-- report_grabbing("%s => |%s..%s|",name,sub(bufferdata,1,10),sub(bufferdata,-10,#bufferdata))
+-- else
+-- report_grabbing("%s => |%s|",name,bufferdata)
+-- end
+-- end
+-- local counter = counters[begintag]
+-- if not counter then
+-- counter = countnesting(begintag,endtag)
+-- counters[begintag] = counter
+-- end
+-- nesting = nesting + lpegmatch(counter,bufferdata)
+-- local more = nesting > 0
+-- if more then
+-- dn = dn .. sub(bufferdata,2,-1) .. endtag
+-- nesting = nesting - 1
+-- continue = true
+-- else
+-- if continue then
+-- dn = dn .. sub(bufferdata,2,-2) -- no \r, \n is more generic
+-- elseif dn == "" then
+-- dn = sub(bufferdata,2,-2)
+-- else
+-- dn = dn .. "\n" .. sub(bufferdata,2,-2) -- no \r, \n is more generic
+-- end
+-- local last = sub(dn,-1)
+-- if last == "\n" or last == "\r" then -- \n is unlikely as \r is the endlinechar
+-- dn = sub(dn,1,-2)
+-- end
+-- if doundent or (autoundent and doundent == nil) then
+-- dn = undent(dn)
+-- end
+-- end
+-- assign(name,dn,catcodes)
+-- commands.doifelse(more)
+-- end
+
+function tokens.pickup(start,stop)
+ local stoplist = totable(stop)
+ local stoplength = #stoplist
+ local stoplast = stoplist[stoplength]
+ local startlist = totable(start)
+ local startlength = #startlist
+ local startlast = startlist[startlength]
+ local list = { }
+ local size = 0
+ local depth = 0
+ while true do -- or use depth
+ local char = scancode()
+ if char then
+ char = utfchar(char)
+ size = size + 1
+ list[size] = char
+ if char == stoplast and size >= stoplength then
+ local done = true
+ local last = size
+ for i=stoplength,1,-1 do
+ if stoplist[i] ~= list[last] then
+ done = false
+ break
+ end
+ last = last - 1
+ end
+ if done then
+ if depth > 0 then
+ depth = depth - 1
+ else
+ break
+ end
+ char = false -- trick: let's skip the next (start) test
+ end
+ end
+ if char == startlast and size >= startlength then
+ local done = true
+ local last = size
+ for i=startlength,1,-1 do
+ if startlist[i] ~= list[last] then
+ done = false
+ break
+ end
+ last = last - 1
+ end
+ if done then
+ depth = depth + 1
+ end
+ end
else
- report_grabbing("%s => |%s|",name,bufferdata)
+ -- local t = scantoken()
+ local t = gettoken()
+ if t then
+ -- we're skipping leading stuff, like obeyedlines and relaxes
+ else
+ break
+ end
end
end
- local counter = counters[begintag]
- if not counter then
- counter = countnesting(begintag,endtag)
- counters[begintag] = counter
- end
- nesting = nesting + lpegmatch(counter,bufferdata)
- local more = nesting > 0
- if more then
- dn = dn .. sub(bufferdata,2,-1) .. endtag
- nesting = nesting - 1
- continue = true
- else
- if continue then
- dn = dn .. sub(bufferdata,2,-2) -- no \r, \n is more generic
- elseif dn == "" then
- dn = sub(bufferdata,2,-2)
+ local start = 1
+ local stop = size-stoplength-1
+ for i=start,stop do
+ if lpegmatch(p_whitespace,list[i]) then
+ start = i + 1
else
- dn = dn .. "\n" .. sub(bufferdata,2,-2) -- no \r, \n is more generic
- end
- local last = sub(dn,-1)
- if last == "\n" or last == "\r" then -- \n is unlikely as \r is the endlinechar
- dn = sub(dn,1,-2)
+ break
end
- if doundent or (autoundent and doundent == nil) then
- dn = undent(dn)
+ end
+ for i=stop,start,-1 do
+ if lpegmatch(p_whitespace,list[i]) then
+ stop = i - 1
+ else
+ break
end
end
- assign(name,dn,catcodes)
- commands.doifelse(more)
+ if start <= stop then
+ return concat(list,"",start,stop)
+ else
+ return ""
+ end
end
-function commands.savebuffer(list,name,prefix) -- name is optional
+-- function buffers.pickup(name,start,stop,finish,catcodes,doundent)
+-- local data = tokens.pickup(start,stop)
+-- if doundent or (autoundent and doundent == nil) then
+-- data = buffers.undent(data)
+-- end
+-- buffers.assign(name,data,catcodes)
+-- context(finish)
+-- end
+
+-- commands.pickupbuffer = buffers.pickup
+
+scanners.pickupbuffer = function()
+ local name = scanstring()
+ local start = scanstring()
+ local stop = scanstring()
+ local finish = scanstring()
+ local catcodes = scaninteger()
+ local doundent = scanboolean()
+ local data = tokens.pickup(start,stop)
+ if doundent or (autoundent and doundent == nil) then
+ data = buffers.undent(data)
+ end
+ buffers.assign(name,data,catcodes)
+ -- context[finish]()
+ context(finish)
+end
+
+local function savebuffer(list,name,prefix) -- name is optional
if not list or list == "" then
list = name
end
@@ -316,47 +457,18 @@ function commands.savebuffer(list,name,prefix) -- name is optional
io.savedata(name,content)
end
--- local files = { }
--- local last = 0
---
--- function commands.runbuffer(name,encapsulate) -- we used to compare the saved file with content
--- local names = getnames(name)
--- local filename = files[name]
--- local tobedone = not istypeset(names)
--- if tobedone or not filename then
--- last = last + 1
--- filename = formatters["%s-typeset-buffer-%03i"](tex.jobname,last)
--- files[name] = filename
--- end
--- if tobedone then
--- if trace_run then
--- report_typeset("changes in %a, processing forced",name)
--- end
--- local filename = addsuffix(filename,"tmp")
--- local content = collectcontent(names,nil) or ""
--- if content == "" then
--- content = "empty buffer"
--- end
--- if encapsulate then
--- content = formatters["\\starttext\n%s\n\\stoptext\n"](content)
--- end
--- io.savedata(filename,content)
--- local command = formatters["context %s %s"](jit and "--jit" or "",filename)
--- report_typeset("running: %s\n",command)
--- os.execute(command)
--- markastypeset(names)
--- elseif trace_run then
--- report_typeset("no changes in %a, not processed",name)
--- end
--- context(replacesuffix(filename,"pdf"))
--- end
+implement {
+ name = "savebuffer",
+ actions = savebuffer,
+ arguments = { "string", "string", "string" }
+}
-- we can consider adding a size to avoid unlikely clashes
local oldhashes = nil
local newhashes = nil
-function commands.runbuffer(name,encapsulate)
+local function runbuffer(name,encapsulate)
if not oldhashes then
oldhashes = job.datasets.getdata("typeset buffers","hashes") or { }
for hash, n in next, oldhashes do
@@ -402,10 +514,10 @@ function commands.runbuffer(name,encapsulate)
registertempfile(filename)
registertempfile(resultname,nil,true)
--
- context(resultname)
+ return resultname
end
-function commands.getbuffer(name)
+local function getbuffer(name)
local str = getcontent(name)
if str ~= "" then
-- characters.showstring(str)
@@ -413,11 +525,11 @@ function commands.getbuffer(name)
end
end
-function commands.getbuffermkvi(name) -- rather direct !
+local function getbuffermkvi(name) -- rather direct !
context.viafile(resolvers.macros.preprocessed(getcontent(name)),formatters["buffer.%s.mkiv"](validstring(name,"noname")))
end
-function commands.gettexbuffer(name)
+local function gettexbuffer(name)
local buffer = name and cache[name]
if buffer and buffer.data ~= "" then
context.pushcatcodetable()
@@ -432,20 +544,29 @@ function commands.gettexbuffer(name)
end
end
-commands.getbufferctxlua = loadcontent
+implement { name = "getbufferctxlua", actions = loadcontent, arguments = "string" }
+implement { name = "getbuffer", actions = getbuffer, arguments = "string" }
+implement { name = "getbuffermkvi", actions = getbuffermkvi, arguments = "string" }
+implement { name = "gettexbuffer", actions = gettexbuffer, arguments = "string" }
-function commands.doifelsebuffer(name)
- commands.doifelse(exists(name))
-end
+implement {
+ name = "runbuffer",
+ actions = { runbuffer, context },
+ arguments = { "string", true }
+}
+
+implement {
+ name = "doifelsebuffer",
+ actions = { exists, commands.doifelse },
+ arguments = "string"
+}
-- This only used for mp buffers and is a kludge. Don't change the
-- texprint into texsprint as it fails because "p<nl>enddef" becomes
-- "penddef" then.
--- function commands.feedback(names)
--- texprint(ctxcatcodes,splitlines(collectcontent(names)))
--- end
-
-function commands.feedback(names) -- bad name, maybe rename to injectbuffercontent
- context.printlines(collectcontent(names))
-end
+implement {
+ name = "feedback", -- bad name, maybe rename to injectbuffercontent
+ actions = { collectcontent, context.printlines },
+ arguments = "string"
+}
diff --git a/Master/texmf-dist/tex/context/base/buff-ini.mkiv b/Master/texmf-dist/tex/context/base/buff-ini.mkiv
index 6582e35877a..24bb729e1a4 100644
--- a/Master/texmf-dist/tex/context/base/buff-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/buff-ini.mkiv
@@ -23,13 +23,15 @@
\let\currentbuffer\empty
\def\doifelsebuffer#1%
- {\ctxcommand{doifelsebuffer("#1")}}
+ {\clf_doifelsebuffer{#1}}
+
+\let\doifbufferelse\doifelsebuffer
\unexpanded\def\resetbuffer
{\dosingleempty\buff_reset}
\def\buff_reset[#1]%
- {\ctxcommand{erasebuffer("#1")}}
+ {\clf_erasebuffer{#1}}
\setuvalue{\e!start\v!buffer}%
{\begingroup % (3)
@@ -39,7 +41,10 @@
\def\buff_start[#1][#2]%
{\buff_start_indeed{}{#1}{\e!start\v!buffer}{\e!stop\v!buffer}}
-\def\buff_start_indeed#1#2#3#4#5% \donothing needed ! #5=undent)
+% \def\buff_start_indeed#1#2#3#4#5% \donothing needed ! #5=undent)
+% {\normalexpanded{\buff_pickup{#2}{#3}{#4}{}{\buff_stop{#4}}\plusone}}
+
+\def\buff_start_indeed#1#2#3#4%
{\normalexpanded{\buff_pickup{#2}{#3}{#4}{}{\buff_stop{#4}}\plusone}}
\unexpanded\def\grabbufferdata % was: \dostartbuffer
@@ -64,35 +69,70 @@
\let\buff_finish\relax
\let\buff_gobble\relax
+% \unexpanded\def\buff_pickup#1#2#3#4#5#6% name, startsequence, stopsequence, before, after, undent
+% {\begingroup % (1)
+% #4%
+% \begingroup % (2)
+% \edef\catcodetableofbuffer{\number\catcodetable}%
+% \clf_erasebuffer{#1}%
+% \setcatcodetable\vrbcatcodes
+% \def\buff_finish
+% {\endgroup % (1)
+% \endgroup % (2)
+% #5}%
+% \def\buff_gobble##1#3% is detokenize needed? TEST
+% %{\ctxcommand{grabbuffer("#1","#2","#3",\!!bs\detokenize{##1}\!!es)} % space ?
+% {\ctxcommand{grabbuffer("#1","#2","#3",\!!bs>##1\!!es,\catcodetableofbuffer,\ifnum#6=\plusone true\else false\fi)}% space ?
+% \buff_gobble
+% \buff_finish}%
+% \buff_gobble}
+
+% % \def\startgrab
+% % {\begingroup
+% % \setcatcodetable\vrbcatcodes
+% % \ctxlua{tokens.pickup("\\startgrab","\\stopgrab") context("\\endgroup")}}
+% %
+% % \def\stopgrab
+% % {}
+
\unexpanded\def\buff_pickup#1#2#3#4#5#6% name, startsequence, stopsequence, before, after, undent
{\begingroup % (1)
#4%
\begingroup % (2)
- \edef\catcodetableofbuffer{\number\catcodetable}%
- \ctxcommand{erasebuffer("#1")}%
+ \scratchcounter\catcodetable
+ \clf_erasebuffer{#1}%
\setcatcodetable\vrbcatcodes
- \def\buff_finish
+ \unexpanded\def\dofinishpickupbuffer
{\endgroup % (1)
\endgroup % (2)
#5}%
- \def\buff_gobble##1#3% is detokenize needed? TEST
- %{\ctxcommand{grabbuffer("#1","#2","#3",\!!bs\detokenize{##1}\!!es)} % space ?
- {\ctxcommand{grabbuffer("#1","#2","#3",\!!bs>##1\!!es,\catcodetableofbuffer,\ifnum#6=\plusone true\else false\fi)}% space ?
- \buff_gobble
- \buff_finish}%
- \buff_gobble}
+ % todo: we need to skip the first lineending which is na active character
+ % but sometimes we have something different ... this is a side effect of
+ % checking for optional arguments i.e. the next token is already tokenized
+ % and for that reason we have the \relax as well as the \string
+ \clf_pickupbuffer
+ {#1}%
+ {#2}%
+ {#3}%
+ {\string\dofinishpickupbuffer}%
+ \scratchcounter
+ \ifnum#6=\plusone\s!true\else\s!false\fi
+ % \relax}
+ \expandafter\relax\string}
\unexpanded\def\buff_stop#1%
{\endgroup % (3 & 4 & 5 & 6)
\getvalue{#1}}
+% \installctxfunction\dopickupbuffer{commands.dopickupbuffer}
+
\unexpanded\def\setbuffer
{\dosingleempty\buff_set}
\let\endbuffer\relax
\def\buff_set[#1]#2\endbuffer % seldom used so we just pass #2
- {\ctxcommand{assignbuffer("#1",\!!bs\detokenize{#2}\!!es,\number\catcodetable)}}
+ {\clf_assignbuffer{#1}{\detokenize{#2}}\catcodetable\relax}
% beware, never adapt the global buffer settings, actually we might introduce
% a broken parent chain for this purpose but on the other hand it's not that
@@ -141,7 +181,7 @@
\namedbufferparameter{#1}\c!after}
\unexpanded\def\buff_get_stored_indeed#1%
- {\ctxcommand{getbuffer("#1")}}
+ {\clf_getbuffer{#1}}
\unexpanded\def\getdefinedbuffer[#1]%
{\buff_get_stored{#1}{\thedefinedbuffer{#1}}}%
@@ -155,7 +195,7 @@
{\processcommalist[#1]\buff_get_stored_inline_indeed}}
\unexpanded\def\buff_get_stored_inline_indeed#1%
- {\ignorespaces\ctxcommand{getbuffer("#1")}\removeunwantedspaces}
+ {\ignorespaces\clf_getbuffer{#1}\removeunwantedspaces}
\definebuffer
[\v!hiding]
@@ -197,10 +237,10 @@
\def\buff_save[#1][#2]%
{\begingroup
- \doifassignmentelse{#1}
+ \doifelseassignment{#1}
{\setupcurrentsavebuffer[#1]}%
{\setupcurrentsavebuffer[\c!list={#1},\c!file=#2]}%
- \ctxcommand{savebuffer("\directsavebufferparameter\c!list","\directsavebufferparameter\c!file","\directsavebufferparameter\c!prefix")}%
+ \clf_savebuffer{\directsavebufferparameter\c!list}{\directsavebufferparameter\c!file}{\directsavebufferparameter\c!prefix}%
\endgroup}
%D Experimental: no expansion of commands in buffer!
@@ -218,8 +258,8 @@
\unexpanded\def\mkvibuffer {\dosingleempty\buff_mkvi}
% what was: \mkvibufferraw
-\def\buff_ctxlua[#1]{\ctxcommand{getbufferctxlua("#1")}}
-\def\buff_mkvi [#1]{\ctxcommand{getbuffermkvi("#1")}}
+\def\buff_ctxlua[#1]{\clf_getbufferctxlua{#1}}
+\def\buff_mkvi [#1]{\clf_getbuffermkvi {#1}}
% used elsewhere
diff --git a/Master/texmf-dist/tex/context/base/buff-par.lua b/Master/texmf-dist/tex/context/base/buff-par.lua
index 2c1cd40e9d1..58ea9ab9d06 100644
--- a/Master/texmf-dist/tex/context/base/buff-par.lua
+++ b/Master/texmf-dist/tex/context/base/buff-par.lua
@@ -6,22 +6,24 @@ if not modules then modules = { } end modules ['buff-par'] = {
license = "see context related readme files"
}
-local context, commands = context, commands
-
local insert, remove, find, gmatch = table.insert, table.remove, string.find, string.gmatch
-local strip, format = string.strip, string.format
+local fullstrip, formatters = string.fullstrip, string.formatters
local trace_parallel = false trackers.register("buffers.parallel", function(v) trace_parallel = v end)
local report_parallel = logs.reporter("buffers","parallel")
local variables = interfaces.variables
+local v_all = variables.all
local parallel = buffers.parallel or { }
buffers.parallel = parallel
local settings_to_array = utilities.parsers.settings_to_array
+local context = context
+local implement = interfaces.implement
+
local data = { }
function parallel.define(category,tags)
@@ -40,7 +42,7 @@ function parallel.define(category,tags)
end
function parallel.reset(category,tags)
- if not tags or tags == "" or tags == variables.all then
+ if not tags or tags == "" or tags == v_all then
tags = table.keys(entries)
else
tags = settings_to_array(tags)
@@ -62,13 +64,18 @@ function parallel.next(category)
end
end
-function parallel.save(category,tag,content)
+function parallel.save(category,tag,content,frombuffer)
+ if frombuffer then
+ content = buffers.raw(content)
+ end
local dc = data[category]
if not dc then
+ report_parallel("unknown category %a",category)
return
end
local entries = dc.entries[tag]
if not entries then
+ report_parallel("unknown entry %a",tag)
return
end
local lines = entries.lines
@@ -93,13 +100,14 @@ function parallel.save(category,tag,content)
if trace_parallel and label ~= "" then
report_parallel("reference found of category %a, tag %a, label %a",category,tag,label)
end
+ line.content = fullstrip(content)
line.label = label
- line.content = strip(content)
end
else
- line.content = strip(content)
+ line.content = fullstrip(content)
line.label = ""
end
+ -- print("[["..line.content.."]]")
end
function parallel.hassomecontent(category,tags)
@@ -108,7 +116,7 @@ function parallel.hassomecontent(category,tags)
return false
end
local entries = dc.entries
- if not tags or tags == "" or tags == variables.all then
+ if not tags or tags == "" or tags == v_all then
tags = table.keys(entries)
else
tags = utilities.parsers.settings_to_array(tags)
@@ -126,22 +134,25 @@ function parallel.hassomecontent(category,tags)
return false
end
-local save = resolvers.savers.byscheme
+local ctx_doflushparallel = context.doflushparallel
+local f_content = formatters["\\input{%s}"]
+local save_byscheme = resolvers.savers.byscheme
function parallel.place(category,tags,options)
local dc = data[category]
if not dc then
return
end
- local entries = dc.entries
- local tags = utilities.parsers.settings_to_array(tags)
- local options = utilities.parsers.settings_to_hash(options)
- local start, n, criterium = options.start, options.n, options.criterium
- start, n = start and tonumber(start), n and tonumber(n)
- local max = 1
+ local entries = dc.entries
+ local tags = utilities.parsers.settings_to_array(tags)
+ local options = utilities.parsers.settings_to_hash(options) -- options can be hash too
+ local start = tonumber(options.start)
+ local n = tonumber(options.n)
+ local criterium = options.criterium
+ local max = 1
if n then
max = n
- elseif criterium == variables.all then
+ elseif criterium == v_all then
max = 0
for t=1,#tags do
local tag = tags[t]
@@ -156,15 +167,17 @@ function parallel.place(category,tags,options)
local tag = tags[t]
local entry = entries[tag]
if entry then
- local lines = entry.lines
- local number = entry.number + 1
- entry.number = number
- local line = remove(lines,1)
- if line and line.content then
- local content = format("\\input{%s}",save("virtual","parallel",line.content))
- context.doflushparallel(tag,1,number,line.label,content)
+ local lines = entry.lines
+ local number = entry.number + 1
+ entry.number = number
+ local line = remove(lines,1)
+ local content = line and line.content
+ local label = line and line.label or ""
+ if content then
+ local virtual = save_byscheme("virtual","parallel",content)
+ ctx_doflushparallel(tag,1,number,label,f_content(virtual))
else
- context.doflushparallel(tag,0,number,"","")
+ ctx_doflushparallel(tag,0,number,"","")
end
end
end
@@ -173,12 +186,47 @@ end
-- interface
-commands.defineparallel = parallel.define
-commands.nextparallel = parallel.next
-commands.saveparallel = parallel.save
-commands.placeparallel = parallel.place
-commands.resetparallel = parallel.reset
+implement {
+ name = "defineparallel",
+ actions = parallel.define,
+ arguments = { "string", "string" }
+}
-function commands.doifelseparallel(category,tags)
- commands.doifelse(parallel.hassomecontent(category,tags))
-end
+implement {
+ name = "nextparallel",
+ actions = parallel.next,
+ arguments = "string"
+}
+
+implement {
+ name = "saveparallel",
+ actions = parallel.save,
+ arguments = { "string", "string", "string", true },
+}
+
+implement {
+ name = "placeparallel",
+ actions = parallel.place,
+ arguments = {
+ "string",
+ "string",
+ {
+ { "start" },
+ { "n" },
+ { "criterium" },
+ { "setups" },
+ }
+ }
+}
+
+implement {
+ name = "resetparallel",
+ actions = parallel.reset,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "doifelseparallel",
+ actions = { parallel.hassomecontent, commands.doifelse } ,
+ arguments = { "string", "string" }
+}
diff --git a/Master/texmf-dist/tex/context/base/buff-par.mkvi b/Master/texmf-dist/tex/context/base/buff-par.mkvi
index 404fa8ef30e..5af04ba7c6b 100644
--- a/Master/texmf-dist/tex/context/base/buff-par.mkvi
+++ b/Master/texmf-dist/tex/context/base/buff-par.mkvi
@@ -39,6 +39,7 @@
\unprotect
\installcorenamespace{parallel}
+\installcorenamespace{parallelhandler}
\installcommandhandler \??parallel {parallel} \??parallel
@@ -46,32 +47,55 @@
[\c!setups=parallel:place:default]
\let\buff_parallel_define_saved\defineparallel
+\let\buff_parallel_setup_saved \setupparallel
-\unexpanded\def\defineparallel
- {\dodoubleargument\buff_parallel_define}
+\unexpanded\def\defineparallel{\dodoubleargument\buff_parallel_define}
+\unexpanded\def\setupparallel {\dotripleargument\buff_parallel_setup}
\def\buff_parallel_define[#name][#instances]%
- {\buff_parallel_define_saved[#name]
- \ctxcommand{defineparallel("#name","#instances")}%
- \processcommalist[#instances]\buff_parallel_define_instance
+ {\buff_parallel_define_saved[#name][\c!list={#instances}]% list is internal
+ \clf_defineparallel{#name}{#instances}%
+ \expandafter\newtoks\csname\??parallelhandler#name\endcsname
+ \processcommacommand[#instances]{\buff_parallel_define_instance{#name}}%
\setuevalue{\e!start#name}{\buff_parallel_start{#name}}%
\setuevalue{\e!stop #name}{\buff_parallel_stop}}
-\def\buff_parallel_define_instance#instance%
- {\normalexpanded{\buff_parallel_define_saved[#instance][\currentparallel]}%
+\let\buff_process_parallel_instance\relax
+
+\def\buff_process_parallel_instances
+ {\the\csname\??parallelhandler\currentparallel\endcsname}
+
+\def\buff_parallel_define_instance#name#instance%
+ {\normalexpanded{\buff_parallel_define_saved[#instance][#name]}%
\definebuffer[#instance]%
+ %\edef\t_buff_parallel{\csname\??parallelhandler#name\endcsname}%
+ \expandafter\let\expandafter\t_buff_parallel\csname\??parallelhandler#name\endcsname
+ \appendtoks
+ \edef\currentparallelinstance{#instance}%
+ \buff_process_parallel_instance\relax
+ \to \t_buff_parallel
\setuevalue{\e!stop#instance}{\buff_parallel_save{#instance}}}
+\def\buff_parallel_setup[#name][#instances][#setups]%
+ {\processcommalist[#instances]{\buff_parallel_setup_instance{#name}{#setups}}}
+
+\def\buff_parallel_setup_instance#name#setups#instance%
+ {\buff_parallel_setup_saved[#name:#instance][#setups]}
+
\unexpanded\def\buff_parallel_start#name%
{\pushmacro\currentparallel
\edef\currentparallel{#name}%
- \ctxcommand{nextparallel("\currentparallel")}}
+ \clf_nextparallel{\currentparallel}}
\unexpanded\def\buff_parallel_stop
{\popmacro\currentparallel}
\unexpanded\def\buff_parallel_save#instance% defined moet ook aan de lua kant kunnen
- {\ctxcommand{saveparallel("\currentparallel","#instance",buffers.raw("\thedefinedbuffer{#instance}"))}}
+ {\clf_saveparallel
+ {\currentparallel}%
+ {#instance},
+ {\thedefinedbuffer{#instance}}%
+ \relax}
\unexpanded\def\placeparallel
{\dotripleempty\buff_parallel_place}
@@ -79,7 +103,17 @@
\def\buff_parallel_place[#name][#instance][#settings]%
{\begingroup
\edef\currentparallel{#name}%
- \ctxcommand{placeparallel("\currentparallel","#instance","#settings")}% -- todo: pass options as k/v
+ \setupcurrentparallel[#settings]%
+ \clf_placeparallel
+ {\currentparallel}%
+ {#instance}%
+ {%
+ % setups {\parallelparameter\c!setups}%
+ start {\parallelparameter\c!start}%
+ n {\parallelparameter\c!n}%
+ criterium {\parallelparameter\c!criterium}%
+ }%
+ \relax
\endgroup}
\def\doflushparallel#instance#status#line#label#content% called at lua end
@@ -88,7 +122,7 @@
\def\currentparallelnumber {#status}%
\def\currentparallelline {#line}%
\def\currentparallellabel {#label}%
- \def\currentparallelcontent {#content}%
+ \def\currentparallelcontent {#content}% can be kep at the lua end .. no need to use a virtual file
\ifcase#status\relax
\expandafter\buff_parallel_flush_nop
\or
@@ -100,22 +134,24 @@
{}
\def\buff_parallel_flush_yes
- {\directsetup{\namedparallelparameter\currentparallelinstance\c!setups}}
+ {\directsetup{\namedparallelparameter{\currentparallel:\currentparallelinstance}\c!setups}}
\unexpanded\def\doifelseparallel#name#instance%
- {\ctxcommand{doifelseparallel("#name","#instance")}}
+ {\clf_doifelseparallel{#name}{#instance}}
+
+\let\doifparallelelse\doifelseparallel
\unexpanded\def\resetparallel
{\dodoubleempty\buff_parallel_reset}
\def\buff_parallel_reset[#name][#instance]%
- {\ctxcommand{resetparallel("#name","#instance"))}}
+ {\clf_resetparallel{#name}{#instance}}
\startsetups parallel:place:default
\hangafter\plusone
- \hangindent4em
+ \hangindent4\emwidth
\dontleavehmode
- \hbox to 3em \bgroup
+ \hbox to 3\emwidth \bgroup
\hss
\bf
\doifsomething \currentparallellabel {
diff --git a/Master/texmf-dist/tex/context/base/buff-ver.lua b/Master/texmf-dist/tex/context/base/buff-ver.lua
index 14914d42dd2..0168c551d2c 100644
--- a/Master/texmf-dist/tex/context/base/buff-ver.lua
+++ b/Master/texmf-dist/tex/context/base/buff-ver.lua
@@ -31,6 +31,7 @@ visualizers.specifications = specifications
local context = context
local commands = commands
+local implement = interfaces.implement
local tabtospace = utilities.strings.tabtospace
local variables = interfaces.variables
@@ -43,6 +44,7 @@ local v_auto = variables.auto
local v_yes = variables.yes
local v_last = variables.last
local v_all = variables.all
+local v_absolute = variables.absolute
-- beware, all macros have an argument:
@@ -319,6 +321,10 @@ function visualizers.register(name,specification)
return specification
end
+function visualizers.getspecification(name)
+ return specifications[lower(name)]
+end
+
local escapepatterns = allocate()
visualizers.escapepatterns = escapepatterns
@@ -623,14 +629,16 @@ end
local function getrange(lines,first,last,range) -- 1,3 1,+3 fromhere,tothere
local noflines = #lines
- local first, last = first or 1, last or noflines
+ local first = first or 1
+ local last = last or noflines
if last < 0 then
last = noflines + last
end
- local range = settings.range
local what = settings_to_array(range)
- local r_first, r_last = what[1], what[2]
- local f, l = tonumber(r_first), tonumber(r_last)
+ local r_first = what[1]
+ local r_last = what[2]
+ local f = tonumber(r_first)
+ local l = tonumber(r_last)
if r_first then
if f then
if f > first then
@@ -687,6 +695,7 @@ local function filter(lines,settings) -- todo: inline or display in settings
end
local line, n = 0, 0
local first, last, m = getstrip(lines)
+ local range = settings.range
if range then
first, last = getrange(lines,first,last,range)
first, last = getstrip(lines,first,last)
@@ -698,17 +707,9 @@ end
local getlines = buffers.getlines
--- interface
-
-function commands.doifelsevisualizer(name)
- commands.doifelse(specifications[lower(name)])
-end
-
-commands.loadvisualizer = visualizers.load
-
-- local decodecomment = resolvers.macros.decodecomment -- experiment
-function commands.typebuffer(settings)
+local function typebuffer(settings)
local lines = getlines(settings.name)
if lines then
ctx_displayverbatiminitialize(#lines)
@@ -721,7 +722,7 @@ function commands.typebuffer(settings)
end
end
-function commands.processbuffer(settings)
+local function processbuffer(settings)
local lines = getlines(settings.name)
if lines then
local content, m = filter(lines,settings)
@@ -738,21 +739,30 @@ end
-- match but slower when there is no match. But anyway, we need a more clever
-- parser so we use lpeg.
--
--- [[\text ]] [[\text{}]] [[\text \text ]] [[\text \\ \text ]]
+-- [[\text ]] [[\text{}]] [[\foo\bar .tex]] [[\text \text ]] [[\text \\ \text ]]
--
-- needed in e.g. tabulate (manuals)
-local compact_all = Cs((P("\\") * ((1-S("\\ "))^1) * (P(" ")/"") * (P(-1) + S("[{")) + 1)^0)
-local compact_last = Cs((P(" ")^1 * P(-1)/"" + 1)^0)
+local fences = S([[[{]])
+local symbols = S([[!#"$%&'*()+,-./:;<=>?@[]^_`{|}~]])
+local space = S([[ ]])
+local backslash = S([[\]])
+local nospace = space^1/""
+local endstring = P(-1)
+
+local compactors = {
+ [v_all] = Cs((backslash * (1-backslash-space)^1 * nospace * (endstring + fences) + 1)^0),
+ [v_absolute] = Cs((backslash * (1-symbols -space)^1 * nospace * (symbols+backslash) + 1) ^0),
+ [v_last] = Cs((space^1 * endstring/"" + 1)^0),
+}
-function commands.typestring(settings)
+local function typestring(settings)
local content = settings.data
if content and content ~= "" then
- local compact = settings.compact
- if compact == v_all then
- content = lpegmatch(compact_all,content)
- elseif compact == v_last then
- content = lpegmatch(compact_last,content)
+ local compact = settings.compact
+ local compactor = compact and compactors[compact]
+ if compactor then
+ content = lpegmatch(compactor,content)
end
-- content = decodecomment(content)
-- content = dotabs(content,settings)
@@ -760,7 +770,7 @@ function commands.typestring(settings)
end
end
-function commands.typefile(settings)
+local function typefile(settings)
local filename = settings.name
local foundname = resolvers.findtexfile(filename)
if foundname and foundname ~= "" then
@@ -782,3 +792,78 @@ function commands.typefile(settings)
end
end
end
+
+implement {
+ name = "type",
+ actions = typestring,
+ arguments = {
+ {
+ { "data" },
+ { "tab" },
+ { "method" },
+ { "compact" },
+ { "nature" },
+ { "escape" },
+ }
+ }
+}
+
+implement {
+ name = "processbuffer",
+ actions = processbuffer,
+ arguments = {
+ {
+ { "name" },
+ { "strip" },
+ { "tab" },
+ { "method" },
+ { "nature" },
+ }
+ }
+}
+
+implement {
+ name = "typebuffer",
+ actions = typebuffer,
+ arguments = {
+ {
+ { "name" },
+ { "strip" },
+ { "range" },
+ { "regime" },
+ { "tab" },
+ { "method" },
+ { "escape" },
+ { "nature" },
+ }
+ }
+}
+
+implement {
+ name = "typefile",
+ actions = typefile,
+ arguments = {
+ {
+ { "name" },
+ { "strip" },
+ { "range" },
+ { "regime" },
+ { "tab" },
+ { "method" },
+ { "escape" },
+ { "nature" },
+ }
+ }
+}
+
+implement {
+ name = "doifelsevisualizer",
+ actions = { visualizers.getspecification, commands.doifelse },
+ arguments = "string"
+}
+
+implement {
+ name = "loadvisualizer",
+ actions = visualizers.load,
+ arguments = "string"
+}
diff --git a/Master/texmf-dist/tex/context/base/buff-ver.mkiv b/Master/texmf-dist/tex/context/base/buff-ver.mkiv
index 8b9bd176421..67f861ba048 100644
--- a/Master/texmf-dist/tex/context/base/buff-ver.mkiv
+++ b/Master/texmf-dist/tex/context/base/buff-ver.mkiv
@@ -45,8 +45,6 @@
{\spaceskip\fontcharwd\font`x\relax
\xspaceskip\spaceskip}
-\unexpanded\def\specialcontrolspace{\hskip\zeropoint\fastcontrolspace\hskip\zeropoint}
-
\setvalue{\??typinglines\v!no }{\buff_verbatim_ignore_hyphens}
\setvalue{\??typinglines\v!normal }{\buff_verbatim_ignore_hyphens}
\setvalue{\??typinglines\v!yes }{\buff_verbatim_obey_breakpoints}
@@ -75,26 +73,30 @@
\unexpanded\def\buff_verbatim_ignore_hyphens
{\language\minusone} % tricky as this affects the pagebuilder
-\def\buff_verbatim_initialize_breaks % order matters
+\def\buff_verbatim_initialize_type_one
+ {\let\obeylines\ignorelines
+ \edef\p_buff_option{\typeparameter\c!option}%
+ \ifx\p_buff_option\v!none
+ \usetypestyleandcolor\c!style\c!color
+ \else\ifx\p_buff_option\empty
+ \usetypestyleandcolor\c!style\c!color
+ \else
+ \usetypestyleparameter\c!style % no color
+ \fi\fi
+ \setcatcodetable\vrbcatcodes}
+
+\def\buff_verbatim_initialize_type_two
{\spaceskip.5\emwidth\relax
\let\obeyedspace\specialobeyedspace
\let\controlspace\specialcontrolspace
\edef\p_buff_lines{\typeparameter\c!lines}%
- \ifcsname\??typinglines\p_buff_lines\endcsname % sets \obeyedspace, \controlspace,
+ \ifcsname\??typinglines\p_buff_lines\endcsname
\csname\??typinglines\p_buff_lines\endcsname
\fi
\edef\p_buff_space{\typeparameter\c!space}%
- \ifcsname\??typingspace\p_buff_space\endcsname % sets \obeyedspace
+ \ifcsname\??typingspace\p_buff_space\endcsname
\csname\??typingspace\p_buff_space\endcsname
- \fi}
-
-\def\buff_verbatim_initialize_type_one
- {\let\obeylines\ignorelines
- \usetypestyleandcolor\c!style\c!color
- \setcatcodetable\vrbcatcodes}
-
-\def\buff_verbatim_initialize_type_two
- {\buff_verbatim_initialize_breaks
+ \fi
\relax\the\everyinitializeverbatim\relax}
\unexpanded\def\doinitializeverbatim % for use elsewhere .. temp hack (see lxml-ini)
@@ -104,10 +106,11 @@
\let\buff_verbatim_set_line_margin\relax
\def\buff_verbatim_set_line_margin_indeed
- {\hskip\doifoddpageelse{\typingparameter\c!oddmargin}{\typingparameter\c!evenmargin}\relax}
+ {\hskip\doifelseoddpage{\typingparameter\c!oddmargin}{\typingparameter\c!evenmargin}\relax}
-\def\buff_verbatim_check_margins
- {\scratchskip\typingparameter\c!oddmargin\relax
+\def\buff_verbatim_initialize_typing_one
+ {\usebodyfontparameter\typingparameter
+ \scratchskip\typingparameter\c!oddmargin\relax
\ifzeropt\scratchskip \else
\let\buff_verbatim_set_line_margin\buff_verbatim_set_line_margin_indeed
\fi
@@ -117,16 +120,29 @@
\fi
\ifx\buff_verbatim_set_line_margin\relax
\doadaptleftskip{\typingparameter\c!margin}%
- \fi}
-
-\def\buff_verbatim_initialize_typing_one
- {\switchtobodyfont[\typingparameter\c!bodyfont]% can be low level call
- \buff_verbatim_check_margins
- \usetypingstyleandcolor\c!style\c!color
- \doifsomething{\typingparameter\c!align}{\setupalign[\typingparameter\c!align]}}
+ \fi
+ \edef\p_buff_option{\typingparameter\c!option}%
+ \ifx\p_buff_option\v!none
+ \usetypingstyleandcolor\c!style\c!color
+ \else\ifx\p_buff_option\empty
+ \usetypingstyleandcolor\c!style\c!color
+ \else
+ \usetypingstyleparameter\c!style % no color !
+ \fi\fi
+ \usealignparameter\typingparameter}
\def\buff_verbatim_initialize_typing_two
- {\buff_verbatim_initialize_breaks
+ {\spaceskip.5\emwidth\relax
+ \let\obeyedspace\specialobeyedspace
+ \let\controlspace\specialcontrolspace
+ \edef\p_buff_lines{\typingparameter\c!lines}%
+ \ifcsname\??typinglines\p_buff_lines\endcsname
+ \csname\??typinglines\p_buff_lines\endcsname
+ \fi
+ \edef\p_buff_space{\typingparameter\c!space}%
+ \ifcsname\??typingspace\p_buff_space\endcsname
+ \csname\??typingspace\p_buff_space\endcsname
+ \fi
\relax\the\everyinitializeverbatim\relax}
%D \macros
@@ -183,7 +199,12 @@
\to \everysetuptyping
\def\buff_verbatim_initialize_visualizer#1%
- {\ifproductionrun\ctxcommand{loadvisualizer("#1")}\fi}
+ {\ifproductionrun\clf_loadvisualizer{#1}\fi}
+
+\unexpanded\def\doifelsevisualizer#1%
+ {\clf_doifelsevisualizer{#1}}
+
+\let\doifvisualizerelse\doifelsevisualizer
%D Verbatim command are very sensitive to argument processing,
%D which is a direct result of the \CATCODES\ being fixed at
@@ -267,7 +288,7 @@
{\dontleavehmode
\bgroup
\edef\currenttype{#1}%
- \doifnextoptionalcselse\buff_verbatim_type_yes\buff_verbatim_type_nop}
+ \doifelsenextoptionalcs\buff_verbatim_type_yes\buff_verbatim_type_nop}
\def\buff_verbatim_type_yes[#1]%
{\setupcurrenttype[#1]%
@@ -283,7 +304,7 @@
\edef\currenttype{#1}%
\lettypeparameter\c!lines\v!hyphenated
\let\specialobeyedspace\specialstretchedspace
- \doifnextoptionalcselse\buff_verbatim_type_yes\buff_verbatim_type_nop}
+ \doifelsenextoptionalcs\buff_verbatim_type_yes\buff_verbatim_type_nop}
\def\buff_verbatim_type_one
{\ifx\next\bgroup
@@ -322,33 +343,47 @@
\def\buff_verbatim_type_normal#1%
{\buff_verbatim_initialize_type_two
- \dostarttagged\t!verbatim\currenttype
- \ctxcommand{typestring{
- data = \!!bs\detokenize{#1}\!!es,
- tab = "\typeparameter\c!tab",
- method = "\typeparameter\c!option",
- nature = "inline",
- compact = "\typeparameter\c!compact", % none | all | last (all needed in tabulate etc for manuals)
- }}%
+ \dostarttaggedchained\t!verbatim\currenttype\??type
+ \clf_type
+ data {\detokenize{#1}}%
+ tab {\typeparameter\c!tab}%
+ method {\p_buff_option}%
+ compact {\typeparameter\c!compact}% % none | all | last (all needed in tabulate etc for manuals)
+ escape {\typeparameter\c!escape}% % new but rather useless imo (escaping in general is not used much)
+ % nature {inline}% is default
+ \relax
\dostoptagged
\buff_verbatim_right_of_type
\egroup}
\def\buff_verbatim_type_nested#1%
{\buff_verbatim_initialize_type_two
- \dostarttagged\t!verbatim\currenttype
- \ctxcommand{typestring{
- data = \!!bs\detokenize{#1}\!!es,
- tab = "\typeparameter\c!tab",
- method = "nested", % we force a special visualizer
- option = "\typeparameter\c!option", % extra visualizer (maybe: nested,\typeparameter\c!option)
- nature = "inline",
- }}%
+ \dostarttaggedchained\t!verbatim\currenttype\??type
+ \clf_type
+ data {\detokenize{#1}}%
+ tab {\typeparameter\c!tab}%
+ method {\p_buff_option}% % extra visualizer (maybe: nested,\typeparameter\c!option)
+ escape {\typeparameter\c!escape}% % new but rather useless imo (escaping in general is not used much)
+ % nature {inline}% is default
+ method {nested}%
+ \relax
\dostoptagged
\buff_verbatim_right_of_type
\egroup
\gobbleoneargument} % grab last >
+%D The \type {compact} option can come in handy in the case of inline argument passing
+%D
+%D \starttyping
+%D \definetype[TeXcodeA][option=TEX]
+%D \definetype[TeXcodeB][option=TEX,compact=all]
+%D \definetype[TeXcodeC][option=TEX,compact=absolute]
+%D
+%D \def\argA#1{\TeXcodeA{{#1}}}
+%D \def\argB#1{\TeXcodeB{{#1}}}
+%D \def\argC#1{\TeXcodeC{{#1}}}
+%D \stoptyping
+
%D \macros
%D {obeyhyphens,obeybreakpoints}
%D
@@ -359,15 +394,24 @@
%D works all right, but a decent hyphenation support of
%D \type{\tt} text will be implemented soon.
-\unexpanded\def\specialfixedspace {\kern\interwordspace\relax}
-\unexpanded\def\specialobeyedspace {\hskip\interwordspace\relax} % better than spaceskip
-\unexpanded\def\specialstretchedspace{\hskip.5\interwordspace\s!plus.125\interwordspace\relax} % \interwordstretch can be zero
-\unexpanded\def\specialcontrolspace {\hskip\zeropoint\hbox{\normalcontrolspace}\hskip\zeropoint\relax}
+\unexpanded\def\specialfixedspace {\kern\interwordspace\relax}
+\unexpanded\def\specialobeyedspace {\hskip\interwordspace\relax} % better than spaceskip
+\unexpanded\def\specialstretchedspace {\hskip.5\interwordspace\s!plus.125\interwordspace\relax} % \interwordstretch can be zero
+\unexpanded\def\specialcontrolspace {\normalcontrolspace\allowbreak} % uses fallback
+
+\unexpanded\def\explicitfixedspace {\asciispacechar}
+\unexpanded\def\explicitobeyedspace {\asciispacechar\allowbreak}
+\unexpanded\def\explicitstretchedspace{\asciispacechar\hskip\zeropoint\s!plus.125\interwordspace\relax}%
+\unexpanded\def\explicitcontrolspace {\optionalcontrolspace\allowbreak} % uses asciispace
+
+\appendtoks
+ \unexpanded\def\obeyedspace{\hskip\zeropoint\asciispacechar\hskip\zeropoint}%
+\to \everyenableelements
\unexpanded\def\obeyhyphens
{\let\obeyedspace \specialobeyedspace % maybe \specialstretchedspace
\let\controlspace\specialcontrolspace
- \spaceskip.25em\relax} % hm a bit of stretch !
+ \spaceskip.25\emwidth\relax} % hm a bit of stretch !
\unexpanded\def\obeybreakpoints
{\ignorehyphens
@@ -420,9 +464,15 @@
\let\normaltextmat\mat
\let\normaltextdis\dis
-\unexpanded\def\astype{\bgroup\usetypestyleandcolor\c!style\c!color\let\nexttoken}
+\unexpanded\def\astype
+ {\bgroup\usetypestyleandcolor\c!style\c!color\let\nexttoken}
-\unexpanded\def\asciistr#1{\dontleavehmode{\verbatimfont\detokenize{#1}}} % use in some old styles
+\unexpanded\def\asciistr#1% used in some old styles
+ {\dontleavehmode\begingroup
+ \dostarttagged\t!verbatim\empty
+ \usetypestyleandcolor\c!style\c!color\detokenize{#1}%
+ \dostoptagged
+ \endgroup}
%D The basic display verbatim commands are defined in an indirect way. As we
%D will see, they are a specific case of a more general mechanism.
@@ -462,7 +512,7 @@
\def\buff_verbatim_typing_start_yes[#1]%
{\typingparameter\c!before
\startpacked[\v!blank]
- \doifassignmentelse{#1}
+ \doifelseassignment{#1}
{\setupcurrenttyping[#1]}
{\doifinset\v!continue{#1}{\lettypingparameter\c!continue\v!yes}}%
\buff_verbatim_setup_line_numbering
@@ -475,18 +525,18 @@
\def\buff_verbatim_type_block_verbatim_indeed#1#2%
{\buff_verbatim_initialize_typing_two
- \dostarttagged\t!verbatimblock\currenttyping
+ \dostarttaggedchained\t!verbatimblock\currenttyping\??typing
\beginofverbatimlines
\dostarttagged\t!verbatimlines\empty
- \ctxcommand{typebuffer {
- name = "_typing_",
- strip = "\typingparameter\c!strip",
- range = "\typingparameter\c!range",
- tab = "\typingparameter\c!tab",
- method = "\typingparameter\c!option",
- escape = \!!bs\typingparameter\c!escape\!!es,
- nature = "display",
- }}%
+ \clf_typebuffer
+ name {_typing_}%
+ strip {\typingparameter\c!strip}%
+ range {\typingparameter\c!range}%
+ tab {\typingparameter\c!tab}%
+ method {\p_buff_option}%
+ escape {\typingparameter\c!escape}%
+ nature {display}%
+ \relax
\dostoptagged
\endofverbatimlines
\dostoptagged
@@ -562,7 +612,7 @@
\setuptyping[#1][#2]%
\buff_verbatim_type_file_checked{#1}{#3}%
\else\iffirstargument
- \doifassignmentelse{#1}
+ \doifelseassignment{#1}
{\setuptyping[\v!file][#1]
\buff_verbatim_type_file_checked\v!file{#3}}
{\buff_verbatim_type_file_checked{#1}{#3}}%
@@ -587,6 +637,8 @@
\expandafter\firstoftwoarguments
\fi}
+\let\doiftypingfileelse\doifelsetypingfile
+
\def\buff_verbatim_type_file_indeed#1#2% category name
{\edef\currenttyping{#1}%
\typingparameter\c!before
@@ -594,18 +646,18 @@
\buff_verbatim_setup_line_numbering
\buff_verbatim_initialize_typing_one
\buff_verbatim_initialize_typing_two
- \dostarttagged\t!verbatimblock\currenttyping
+ \dostarttaggedchained\t!verbatimblock\currenttyping\??typing
\beginofverbatimlines
\dostarttagged\t!verbatimlines\empty
- \ctxcommand{typefile {
- name = "#2",
- strip = "\typingparameter\c!strip",
- range = "\typingparameter\c!range",
- regime = "\currentregime",
- tab = "\typingparameter\c!tab",
- method = "\typingparameter\c!option",
- nature = "display",
- }}%
+ \clf_typefile
+ name {#2}%
+ strip {\typingparameter\c!strip}%
+ range {\typingparameter\c!range}%
+ regime {\currentregime}%
+ tab {\typingparameter\c!tab}%
+ method {\p_buff_option}%
+ nature {display}%
+ \relax
\dostoptagged
\endofverbatimlines
\dostoptagged
@@ -743,7 +795,7 @@
\setuptyping[\v!buffer][#2]%
\processcommalist[#1]{\buff_verbatim_type_buffer_indeed\v!buffer}% [name] [settings]
\else\iffirstargument
- \doifassignmentelse{#1}
+ \doifelseassignment{#1}
{\setuptyping[\v!buffer][#1]%
\buff_verbatim_type_buffer_indeed\v!buffer\empty}% [settings]
{\processcommalist[#1]{\buff_verbatim_type_buffer_indeed\v!buffer}}% [name]
@@ -767,19 +819,19 @@
\buff_verbatim_setup_line_numbering
\buff_verbatim_initialize_typing_one
\buff_verbatim_initialize_typing_two
- \dostarttagged\t!verbatimblock{#1}%
+ \dostarttaggedchained\t!verbatimblock{#1}\??typing
\beginofverbatimlines
\dostarttagged\t!verbatimlines\empty
- \ctxcommand{typebuffer {
- name = "#2",
- strip = "\typingparameter\c!strip",
- range = "\typingparameter\c!range",
- regime = "\currentregime",
- tab = "\typingparameter\c!tab",
- method = "\typingparameter\c!option",
- escape = \!!bs\typingparameter\c!escape\!!es,
- nature = "display",
- }}%
+ \clf_typebuffer
+ name {#2}%
+ strip {\typingparameter\c!strip}%
+ range {\typingparameter\c!range}%
+ regime {\currentregime}%
+ tab {\typingparameter\c!tab}%
+ method {\p_buff_option}%
+ escape {\typingparameter\c!escape}%
+ % nature {display}%
+ \relax
\dostoptagged
\endofverbatimlines
\dostoptagged
@@ -803,7 +855,7 @@
\setuptyping[\v!buffer][#2]%
\processcommalist[#1]{\buff_verbatim_process_indeed\v!buffer}% [name] [settings]
\else\iffirstargument
- \doifassignmentelse{#1}
+ \doifelseassignment{#1}
{\setuptyping[\v!buffer][#1]%
\buff_verbatim_process_indeed\v!buffer\empty}% [settings]
{\processcommalist[#1]{\buff_verbatim_process_indeed\v!buffer}}% [name]
@@ -814,13 +866,13 @@
\def\buff_verbatim_process_indeed#1#2%
{\edef\currenttyping{#1}%
- \ctxcommand{processbuffer {
- name = "#2",
- strip = "\typingparameter\c!strip",
- tab = "\typingparameter\c!tab",
- method = "\typingparameter\c!option",
- nature = "direct",
- }}}
+ \clf_processbuffer
+ name {#2}%
+ strip {\typingparameter\c!strip}%
+ tab {\typingparameter\c!tab}%
+ % method {\p_buff_option}%
+ nature {direct}%
+ \relax}
% so far for obsolete
@@ -835,8 +887,10 @@
\fi
\noindent
\buff_verbatim_set_line_margin
- \the\everyline\strut
- \dostarttagged\t!verbatimline\empty}
+ \the\everyline % maybe also after starttagged
+ \strut % after starttagged, else break !
+ \dostarttagged\t!verbatimline\empty
+ }
\unexpanded\def\buff_verbatim_end_of_line
{\dostoptagged
@@ -861,7 +915,7 @@
\newcount \c_buff_verbatim_current
\newconditional\c_buff_optimize_linebreaks
-\def\doverbatimspace {\obeyedspace}
+ \def\doverbatimspace {\obeyedspace}
\unexpanded\def\doinlineverbatimstart {}
\unexpanded\def\doinlineverbatimstop {}
diff --git a/Master/texmf-dist/tex/context/base/bxml-apa.mkiv b/Master/texmf-dist/tex/context/base/bxml-apa.mkiv
index 7665d829c0f..6513a71c2df 100644
--- a/Master/texmf-dist/tex/context/base/bxml-apa.mkiv
+++ b/Master/texmf-dist/tex/context/base/bxml-apa.mkiv
@@ -342,7 +342,7 @@
\bibxmlsetup{bibtex:apa:common:author-editors-crossref-year}
\bibxmldoif {title} {
\bgroup\it\bibxmlflush{title}\/\egroup
- \doifmodeelse {bibtex:apa:edited-book} {
+ \doifelsemode {bibtex:apa:edited-book} {
\bibxmldoifelse {volume} {
\bibtexspace Number\nonbreakablespace\bibxmlflush{volume}
\bibxmldoifelse {series} {
@@ -396,7 +396,7 @@
\bibxmldoifelse {title} {
\bgroup\it\bibxmlflush{title}\/\egroup
} {
- \doifmodeelse {bibtex:apa:edited-book} {
+ \doifelsemode {bibtex:apa:edited-book} {
\bibxmldoifelse {volume} {
\bibtexspace number\nonbreakablespace\bibxmlflush{volume}
\bibxmldoifelse {series} {
diff --git a/Master/texmf-dist/tex/context/base/catc-act.mkiv b/Master/texmf-dist/tex/context/base/catc-act.mkiv
index df228c20322..8c7935d4d57 100644
--- a/Master/texmf-dist/tex/context/base/catc-act.mkiv
+++ b/Master/texmf-dist/tex/context/base/catc-act.mkiv
@@ -39,10 +39,10 @@
\setnewconstant\c_syst_catcodes_hack\tildeasciicode % also defined in catc-ini.mkiv
-\normalprotected\def\defineactivecharacter #1#2 #3% uses \doifnumberelse which is not yet defined
+\normalprotected\def\defineactivecharacter #1#2 #3% uses \doifelsenumber which is not yet defined
{\c_syst_catcodes_c\uccode\c_syst_catcodes_hack
- \if#1"\uccode\c_syst_catcodes_hack\expandafter\doifnumberelse\expandafter{\string#1#2}\empty #1#2\else
- \uccode\c_syst_catcodes_hack\expandafter\doifnumberelse\expandafter{\string#1#2}\empty`#1#2\fi
+ \if#1"\uccode\c_syst_catcodes_hack\expandafter\doifelsenumber\expandafter{\string#1#2}\empty #1#2\else
+ \uccode\c_syst_catcodes_hack\expandafter\doifelsenumber\expandafter{\string#1#2}\empty`#1#2\fi
\catcode\uccode\c_syst_catcodes_hack\activecatcode
\uppercase{\def\m_syst_catcodes_temp{~}}% brrr
\uccode\c_syst_catcodes_hack\c_syst_catcodes_c
diff --git a/Master/texmf-dist/tex/context/base/catc-ini.mkiv b/Master/texmf-dist/tex/context/base/catc-ini.mkiv
index d8247217c77..bb1e47faabd 100644
--- a/Master/texmf-dist/tex/context/base/catc-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/catc-ini.mkiv
@@ -54,6 +54,7 @@
\setnewconstant\ampersandasciicode 38
\setnewconstant\singlequoteasciicode 39 % '
\setnewconstant\primeasciicode 39 % '
+\setnewconstant\hyphenasciicode 45
\setnewconstant\forwardslashasciicode 47 % /
\setnewconstant\colonasciicode 58
\setnewconstant\lessthanasciicode 60 % < used as alternative verbatim {
@@ -87,16 +88,25 @@
\xdef\outputnewlinechar{^^J}%
\endgroup}
-%D We predefine some prefixes ahead of syst-aux and mult-sys. We reserve 8 slots
-%D for catcodes.
+%D We predefine some prefixes ahead of syst-aux and mult-sys.
-\def\??catcodelet {1>>} % let : \let
-\def\??catcodedef {2>>} % def : \def
-\def\??catcodeued {3>>} % ued : \unexpanded\def
-\def\??catcodeget {4>>} % \meaning
+% We reserve 8 slots for catcodes.
+%
+% \def\??catcodelet {1>>} % let : \let
+% \def\??catcodedef {2>>} % def : \def
+% \def\??catcodeued {3>>} % ued : \unexpanded\def
+% \def\??catcodeget {4>>} % \meaning
+%
+% \def\??catcodetablet{5>>}
+% \def\??catcodetablen{6>>}
+
+\installsystemnamespace {catcodelet} % let : \let
+\installsystemnamespace {catcodedef} % def : \def
+\installsystemnamespace {catcodeued} % ued : \unexpanded\def
+\installsystemnamespace {catcodeget} % \meaning
-\def\??catcodetablet{5>>}
-\def\??catcodetablen{6>>}
+\installsystemnamespace {catcodetablet}
+\installsystemnamespace {catcodetablen}
\newcount\c_syst_catcodes_n \c_syst_catcodes_n\zerocount % 0 = signal, so advance before allocate
\newcount\c_syst_catcodes_a
@@ -119,7 +129,7 @@
\catcode\commentasciicode \othercatcode
\catcode\delasciicode \othercatcode}
-\long\normalprotected\def\startcatcodetable#1#2\stopcatcodetable
+\normalprotected\def\startcatcodetable#1#2\stopcatcodetable
{\begingroup
\catcodetable\inicatcodes
\the\everysetdefaultcatcodes
@@ -129,7 +139,7 @@
\let\stopcatcodetable\relax
-\long\normalprotected\def\startextendcatcodetable#1#2\stopextendcatcodetable
+\normalprotected\def\startextendcatcodetable#1#2\stopextendcatcodetable
{\begingroup
\catcodetable#1\relax
\globaldefs\plusone
@@ -146,7 +156,7 @@
% ==
%
-% \long\normalprotected\def\startextendcatcodetable#1#2\stopextendcatcodetable
+% \normalprotected\def\startextendcatcodetable#1#2\stopextendcatcodetable
% {\bgroup
% \scratchcounter\the\catcodetable
% \catcodetable #1 #2
diff --git a/Master/texmf-dist/tex/context/base/catc-sym.mkiv b/Master/texmf-dist/tex/context/base/catc-sym.mkiv
index 425a5393c24..71e02f31dc1 100644
--- a/Master/texmf-dist/tex/context/base/catc-sym.mkiv
+++ b/Master/texmf-dist/tex/context/base/catc-sym.mkiv
@@ -177,12 +177,12 @@
%D
%D \getbuffer[c]
-\long\def\rescan#1{\scantokens{#1\ignorespaces}}
-\long\def\rescanwithsetup#1#2{\begingroup\directsetup{#1}\scantokens{#2\ignorespaces}\endgroup}
+\def\rescan #1{\scantokens{#1\ignorespaces}}
+\def\rescanwithsetup#1#2{\begingroup\directsetup{#1}\scantokens{#2\ignorespaces}\endgroup}
\ifx\scantextokens\undefined \else
- \long\def\rescan#1{\scantextokens{#1}}
- \long\def\rescanwithsetup#1#2{\begingroup\directsetup{#1}\scantextokens{#2}\endgroup}
+ \def\rescan #1{\scantextokens{#1}}
+ \def\rescanwithsetup#1#2{\begingroup\directsetup{#1}\scantextokens{#2}\endgroup}
\fi
\endinput
diff --git a/Master/texmf-dist/tex/context/base/char-act.mkiv b/Master/texmf-dist/tex/context/base/char-act.mkiv
index 011c29d07fa..7d7268c8ba6 100644
--- a/Master/texmf-dist/tex/context/base/char-act.mkiv
+++ b/Master/texmf-dist/tex/context/base/char-act.mkiv
@@ -24,6 +24,8 @@
%D \NEWLINE\ and \NEWPAGE\ active and assigning them
%D \type{\obeysomething}, but first we set some default values.
+% These are expandable!
+
\def\obeyedspace {\space}
\def\obeyedtab {\obeyedspace}
\def\obeyedline {\par}
@@ -36,7 +38,10 @@
%D spaces (control spaces) we only have to adapt the definition
%D of \type{\obeyedspace} to:
-\unexpanded\def\controlspace{\hbox{\char32}} % rather tex, we need the unicode value
+\chardef\asciispacechar\spaceasciicode % a real space character
+
+\unexpanded\def\naturalspace{\asciispacechar}
+\unexpanded\def\controlspace{\hbox{\asciispacechar}} % rather tex, we need the unicode value
\unexpanded\def\normalspaces{\catcode\spaceasciicode\spacecatcode}
\bgroup
diff --git a/Master/texmf-dist/tex/context/base/char-def.lua b/Master/texmf-dist/tex/context/base/char-def.lua
index 3e1d5600981..f6986e76d66 100644
--- a/Master/texmf-dist/tex/context/base/char-def.lua
+++ b/Master/texmf-dist/tex/context/base/char-def.lua
@@ -21,12 +21,12 @@ the trouble. Some additional data is kept in other files.
characters = characters or { }
characters.data={
- [0x0000]={
+ [0x0]={
category="cc",
description="NULL",
direction="bn",
linebreak="cm",
- unicodeslot=0x0000,
+ unicodeslot=0x0,
},
{
adobename="controlSTX",
@@ -34,7 +34,7 @@ characters.data={
description="START OF HEADING",
direction="bn",
linebreak="cm",
- unicodeslot=0x0001,
+ unicodeslot=0x1,
},
{
adobename="controlSOT",
@@ -42,7 +42,7 @@ characters.data={
description="START OF TEXT",
direction="bn",
linebreak="cm",
- unicodeslot=0x0002,
+ unicodeslot=0x2,
},
{
adobename="controlETX",
@@ -50,7 +50,7 @@ characters.data={
description="END OF TEXT",
direction="bn",
linebreak="cm",
- unicodeslot=0x0003,
+ unicodeslot=0x3,
},
{
adobename="controlEOT",
@@ -58,7 +58,7 @@ characters.data={
description="END OF TRANSMISSION",
direction="bn",
linebreak="cm",
- unicodeslot=0x0004,
+ unicodeslot=0x4,
},
{
adobename="controlENQ",
@@ -66,7 +66,7 @@ characters.data={
description="ENQUIRY",
direction="bn",
linebreak="cm",
- unicodeslot=0x0005,
+ unicodeslot=0x5,
},
{
adobename="controlACK",
@@ -74,7 +74,7 @@ characters.data={
description="ACKNOWLEDGE",
direction="bn",
linebreak="cm",
- unicodeslot=0x0006,
+ unicodeslot=0x6,
},
{
adobename="controlBEL",
@@ -82,7 +82,7 @@ characters.data={
description="BELL",
direction="bn",
linebreak="cm",
- unicodeslot=0x0007,
+ unicodeslot=0x7,
},
{
adobename="controlBS",
@@ -90,7 +90,7 @@ characters.data={
description="BACKSPACE",
direction="bn",
linebreak="cm",
- unicodeslot=0x0008,
+ unicodeslot=0x8,
},
{
adobename="controlHT",
@@ -98,7 +98,7 @@ characters.data={
description="CHARACTER TABULATION",
direction="s",
linebreak="ba",
- unicodeslot=0x0009,
+ unicodeslot=0x9,
},
{
adobename="controlLF",
@@ -106,7 +106,7 @@ characters.data={
description="LINE FEED (LF)",
direction="b",
linebreak="lf",
- unicodeslot=0x000A,
+ unicodeslot=0xA,
},
{
adobename="controlVT",
@@ -114,7 +114,7 @@ characters.data={
description="LINE TABULATION",
direction="s",
linebreak="bk",
- unicodeslot=0x000B,
+ unicodeslot=0xB,
},
{
adobename="controlFF",
@@ -122,7 +122,7 @@ characters.data={
description="FORM FEED (FF)",
direction="ws",
linebreak="bk",
- unicodeslot=0x000C,
+ unicodeslot=0xC,
},
{
adobename="controlCR",
@@ -130,7 +130,7 @@ characters.data={
description="CARRIAGE RETURN (CR)",
direction="b",
linebreak="cr",
- unicodeslot=0x000D,
+ unicodeslot=0xD,
},
{
adobename="controlSO",
@@ -138,7 +138,7 @@ characters.data={
description="SHIFT OUT",
direction="bn",
linebreak="cm",
- unicodeslot=0x000E,
+ unicodeslot=0xE,
},
{
adobename="controlSI",
@@ -146,7 +146,7 @@ characters.data={
description="SHIFT IN",
direction="bn",
linebreak="cm",
- unicodeslot=0x000F,
+ unicodeslot=0xF,
},
{
adobename="controlDLE",
@@ -154,7 +154,7 @@ characters.data={
description="DATA LINK ESCAPE",
direction="bn",
linebreak="cm",
- unicodeslot=0x0010,
+ unicodeslot=0x10,
},
{
adobename="controlDC1",
@@ -162,7 +162,7 @@ characters.data={
description="DEVICE CONTROL ONE",
direction="bn",
linebreak="cm",
- unicodeslot=0x0011,
+ unicodeslot=0x11,
},
{
adobename="controlDC2",
@@ -170,7 +170,7 @@ characters.data={
description="DEVICE CONTROL TWO",
direction="bn",
linebreak="cm",
- unicodeslot=0x0012,
+ unicodeslot=0x12,
},
{
adobename="controlDC3",
@@ -178,7 +178,7 @@ characters.data={
description="DEVICE CONTROL THREE",
direction="bn",
linebreak="cm",
- unicodeslot=0x0013,
+ unicodeslot=0x13,
},
{
adobename="controlDC4",
@@ -186,7 +186,7 @@ characters.data={
description="DEVICE CONTROL FOUR",
direction="bn",
linebreak="cm",
- unicodeslot=0x0014,
+ unicodeslot=0x14,
},
{
adobename="controlNAK",
@@ -194,7 +194,7 @@ characters.data={
description="NEGATIVE ACKNOWLEDGE",
direction="bn",
linebreak="cm",
- unicodeslot=0x0015,
+ unicodeslot=0x15,
},
{
adobename="controlSYN",
@@ -202,7 +202,7 @@ characters.data={
description="SYNCHRONOUS IDLE",
direction="bn",
linebreak="cm",
- unicodeslot=0x0016,
+ unicodeslot=0x16,
},
{
adobename="controlETB",
@@ -210,7 +210,7 @@ characters.data={
description="END OF TRANSMISSION BLOCK",
direction="bn",
linebreak="cm",
- unicodeslot=0x0017,
+ unicodeslot=0x17,
},
{
adobename="controlCAN",
@@ -218,7 +218,7 @@ characters.data={
description="CANCEL",
direction="bn",
linebreak="cm",
- unicodeslot=0x0018,
+ unicodeslot=0x18,
},
{
adobename="controlEM",
@@ -226,7 +226,7 @@ characters.data={
description="END OF MEDIUM",
direction="bn",
linebreak="cm",
- unicodeslot=0x0019,
+ unicodeslot=0x19,
},
{
adobename="controlSUB",
@@ -234,7 +234,7 @@ characters.data={
description="SUBSTITUTE",
direction="bn",
linebreak="cm",
- unicodeslot=0x001A,
+ unicodeslot=0x1A,
},
{
adobename="controlESC",
@@ -242,7 +242,7 @@ characters.data={
description="ESCAPE",
direction="bn",
linebreak="cm",
- unicodeslot=0x001B,
+ unicodeslot=0x1B,
},
{
adobename="controlFS",
@@ -250,7 +250,7 @@ characters.data={
description="INFORMATION SEPARATOR FOUR",
direction="b",
linebreak="cm",
- unicodeslot=0x001C,
+ unicodeslot=0x1C,
},
{
adobename="controlGS",
@@ -258,7 +258,7 @@ characters.data={
description="INFORMATION SEPARATOR THREE",
direction="b",
linebreak="cm",
- unicodeslot=0x001D,
+ unicodeslot=0x1D,
},
{
adobename="controlRS",
@@ -266,7 +266,7 @@ characters.data={
description="INFORMATION SEPARATOR TWO",
direction="b",
linebreak="cm",
- unicodeslot=0x001E,
+ unicodeslot=0x1E,
},
{
adobename="controlUS",
@@ -274,7 +274,7 @@ characters.data={
description="INFORMATION SEPARATOR ONE",
direction="s",
linebreak="cm",
- unicodeslot=0x001F,
+ unicodeslot=0x1F,
},
{
adobename="space",
@@ -283,7 +283,7 @@ characters.data={
description="SPACE",
direction="ws",
linebreak="sp",
- unicodeslot=0x0020,
+ unicodeslot=0x20,
},
{
adobename="exclam",
@@ -293,7 +293,7 @@ characters.data={
direction="on",
linebreak="ex",
mathclass="close",
- unicodeslot=0x0021,
+ unicodeslot=0x21,
},
{
adobename="quotedbl",
@@ -304,16 +304,19 @@ characters.data={
direction="on",
linebreak="qu",
mathclass="default",
- unicodeslot=0x0022,
+ unicodeslot=0x22,
},
{
adobename="numbersign",
category="po",
cjkwd="na",
+ contextname="texthash",
description="NUMBER SIGN",
direction="et",
linebreak="al",
- unicodeslot=0x0023,
+ mathclass="binary",
+ mathname="mathhash",
+ unicodeslot=0x23,
variants={
[0xFE0E]="text style",
[0xFE0F]="emoji style",
@@ -327,26 +330,33 @@ characters.data={
description="DOLLAR SIGN",
direction="et",
linebreak="pr",
- unicodeslot=0x0024,
+ mathclass="binary",
+ mathname="mathdollar",
+ unicodeslot=0x24,
},
{
adobename="percent",
category="po",
cjkwd="na",
- contextname="percent",
+ contextname="textpercent",
description="PERCENT SIGN",
direction="et",
linebreak="po",
- unicodeslot=0x0025,
+ mathclass="binary",
+ mathname="mathpercent",
+ unicodeslot=0x25,
},
{
adobename="ampersand",
category="po",
cjkwd="na",
+ contextname="textampersand",
description="AMPERSAND",
direction="on",
linebreak="al",
- unicodeslot=0x0026,
+ mathclass="binary",
+ mathname="mathampersand",
+ unicodeslot=0x26,
},
{
adobename="quotesingle",
@@ -357,7 +367,7 @@ characters.data={
direction="on",
linebreak="qu",
mathclass="default",
- unicodeslot=0x0027,
+ unicodeslot=0x27,
},
{
adobename="parenleft",
@@ -368,9 +378,9 @@ characters.data={
linebreak="op",
mathclass="open",
mathname="lparent",
- mirror=0x0029,
+ mirror=0x29,
textclass="open",
- unicodeslot=0x0028,
+ unicodeslot=0x28,
},
{
adobename="parenright",
@@ -381,9 +391,9 @@ characters.data={
linebreak="cp",
mathclass="close",
mathname="rparent",
- mirror=0x0028,
+ mirror=0x28,
textclass="close",
- unicodeslot=0x0029,
+ unicodeslot=0x29,
},
{
adobename="asterisk",
@@ -395,7 +405,7 @@ characters.data={
mathclass="binary",
mathname="ast",
mathsymbol=0x2217,
- unicodeslot=0x002A,
+ unicodeslot=0x2A,
},
{
adobename="plus",
@@ -405,7 +415,7 @@ characters.data={
direction="es",
linebreak="pr",
mathclass="binary",
- unicodeslot=0x002B,
+ unicodeslot=0x2B,
},
{
adobename="comma",
@@ -416,7 +426,7 @@ characters.data={
direction="cs",
linebreak="is",
mathclass="punctuation",
- unicodeslot=0x002C,
+ unicodeslot=0x2C,
},
{
adobename="hyphen",
@@ -428,7 +438,7 @@ characters.data={
mathextensible="h",
mathfiller="relfill",
mathsymbol=0x2212,
- unicodeslot=0x002D,
+ unicodeslot=0x2D,
},
{
adobename="period",
@@ -446,7 +456,7 @@ characters.data={
name="ldotp",
},
},
- unicodeslot=0x002E,
+ unicodeslot=0x2E,
},
{
adobename="slash",
@@ -459,16 +469,12 @@ characters.data={
mathspec={
{
class="middle",
- -- unicode=0x2044,
- -- unicode=0x2215,
},
{
class="ordinary",
- -- unicode=0x2044,
- -- unicode=0x2215,
},
},
- unicodeslot=0x002F,
+ unicodeslot=0x2F,
},
{
adobename="zero",
@@ -478,7 +484,7 @@ characters.data={
direction="en",
linebreak="nu",
mathclass="number",
- unicodeslot=0x0030,
+ unicodeslot=0x30,
variants={
[0xFE0E]="text style",
[0xFE0F]="emoji style",
@@ -492,7 +498,7 @@ characters.data={
direction="en",
linebreak="nu",
mathclass="number",
- unicodeslot=0x0031,
+ unicodeslot=0x31,
variants={
[0xFE0E]="text style",
[0xFE0F]="emoji style",
@@ -506,7 +512,7 @@ characters.data={
direction="en",
linebreak="nu",
mathclass="number",
- unicodeslot=0x0032,
+ unicodeslot=0x32,
variants={
[0xFE0E]="text style",
[0xFE0F]="emoji style",
@@ -520,7 +526,7 @@ characters.data={
direction="en",
linebreak="nu",
mathclass="number",
- unicodeslot=0x0033,
+ unicodeslot=0x33,
variants={
[0xFE0E]="text style",
[0xFE0F]="emoji style",
@@ -534,7 +540,7 @@ characters.data={
direction="en",
linebreak="nu",
mathclass="number",
- unicodeslot=0x0034,
+ unicodeslot=0x34,
variants={
[0xFE0E]="text style",
[0xFE0F]="emoji style",
@@ -548,7 +554,7 @@ characters.data={
direction="en",
linebreak="nu",
mathclass="number",
- unicodeslot=0x0035,
+ unicodeslot=0x35,
variants={
[0xFE0E]="text style",
[0xFE0F]="emoji style",
@@ -562,7 +568,7 @@ characters.data={
direction="en",
linebreak="nu",
mathclass="number",
- unicodeslot=0x0036,
+ unicodeslot=0x36,
variants={
[0xFE0E]="text style",
[0xFE0F]="emoji style",
@@ -576,7 +582,7 @@ characters.data={
direction="en",
linebreak="nu",
mathclass="number",
- unicodeslot=0x0037,
+ unicodeslot=0x37,
variants={
[0xFE0E]="text style",
[0xFE0F]="emoji style",
@@ -590,7 +596,7 @@ characters.data={
direction="en",
linebreak="nu",
mathclass="number",
- unicodeslot=0x0038,
+ unicodeslot=0x38,
variants={
[0xFE0E]="text style",
[0xFE0F]="emoji style",
@@ -604,7 +610,7 @@ characters.data={
direction="en",
linebreak="nu",
mathclass="number",
- unicodeslot=0x0039,
+ unicodeslot=0x39,
variants={
[0xFE0E]="text style",
[0xFE0F]="emoji style",
@@ -619,7 +625,7 @@ characters.data={
direction="cs",
linebreak="is",
mathclass="relation",
- unicodeslot=0x003A,
+ unicodeslot=0x3A,
},
{
adobename="semicolon",
@@ -629,7 +635,7 @@ characters.data={
direction="on",
linebreak="is",
mathclass="punctuation",
- unicodeslot=0x003B,
+ unicodeslot=0x3B,
},
{
adobename="less",
@@ -640,9 +646,9 @@ characters.data={
linebreak="al",
mathclass="relation",
mathname="lt",
- mirror=0x003E,
+ mirror=0x3E,
textclass="open",
- unicodeslot=0x003C,
+ unicodeslot=0x3C,
},
{
adobename="equal",
@@ -664,7 +670,7 @@ characters.data={
name="Relbar",
},
},
- unicodeslot=0x003D,
+ unicodeslot=0x3D,
},
{
adobename="greater",
@@ -675,9 +681,9 @@ characters.data={
linebreak="al",
mathclass="relation",
mathname="gt",
- mirror=0x003C,
+ mirror=0x3C,
textclass="close",
- unicodeslot=0x003E,
+ unicodeslot=0x3E,
},
{
adobename="question",
@@ -687,7 +693,7 @@ characters.data={
direction="on",
linebreak="ex",
mathclass="close",
- unicodeslot=0x003F,
+ unicodeslot=0x3F,
},
{
adobename="at",
@@ -697,7 +703,7 @@ characters.data={
description="COMMERCIAL AT",
direction="on",
linebreak="al",
- unicodeslot=0x0040,
+ unicodeslot=0x40,
},
{
adobename="A",
@@ -705,10 +711,10 @@ characters.data={
cjkwd="na",
description="LATIN CAPITAL LETTER A",
direction="l",
- lccode=0x0061,
+ lccode=0x61,
linebreak="al",
mathclass="variable",
- unicodeslot=0x0041,
+ unicodeslot=0x41,
},
{
adobename="B",
@@ -716,10 +722,10 @@ characters.data={
cjkwd="na",
description="LATIN CAPITAL LETTER B",
direction="l",
- lccode=0x0062,
+ lccode=0x62,
linebreak="al",
mathclass="variable",
- unicodeslot=0x0042,
+ unicodeslot=0x42,
},
{
adobename="C",
@@ -727,10 +733,10 @@ characters.data={
cjkwd="na",
description="LATIN CAPITAL LETTER C",
direction="l",
- lccode=0x0063,
+ lccode=0x63,
linebreak="al",
mathclass="variable",
- unicodeslot=0x0043,
+ unicodeslot=0x43,
},
{
adobename="D",
@@ -738,10 +744,10 @@ characters.data={
cjkwd="na",
description="LATIN CAPITAL LETTER D",
direction="l",
- lccode=0x0064,
+ lccode=0x64,
linebreak="al",
mathclass="variable",
- unicodeslot=0x0044,
+ unicodeslot=0x44,
},
{
adobename="E",
@@ -749,10 +755,10 @@ characters.data={
cjkwd="na",
description="LATIN CAPITAL LETTER E",
direction="l",
- lccode=0x0065,
+ lccode=0x65,
linebreak="al",
mathclass="variable",
- unicodeslot=0x0045,
+ unicodeslot=0x45,
},
{
adobename="F",
@@ -760,10 +766,10 @@ characters.data={
cjkwd="na",
description="LATIN CAPITAL LETTER F",
direction="l",
- lccode=0x0066,
+ lccode=0x66,
linebreak="al",
mathclass="variable",
- unicodeslot=0x0046,
+ unicodeslot=0x46,
},
{
adobename="G",
@@ -771,10 +777,10 @@ characters.data={
cjkwd="na",
description="LATIN CAPITAL LETTER G",
direction="l",
- lccode=0x0067,
+ lccode=0x67,
linebreak="al",
mathclass="variable",
- unicodeslot=0x0047,
+ unicodeslot=0x47,
},
{
adobename="H",
@@ -782,10 +788,10 @@ characters.data={
cjkwd="na",
description="LATIN CAPITAL LETTER H",
direction="l",
- lccode=0x0068,
+ lccode=0x68,
linebreak="al",
mathclass="variable",
- unicodeslot=0x0048,
+ unicodeslot=0x48,
},
{
adobename="I",
@@ -794,10 +800,10 @@ characters.data={
contextname="dotlessI",
description="LATIN CAPITAL LETTER I",
direction="l",
- lccode=0x0069,
+ lccode=0x69,
linebreak="al",
mathclass="variable",
- unicodeslot=0x0049,
+ unicodeslot=0x49,
},
{
adobename="J",
@@ -806,10 +812,10 @@ characters.data={
contextname="dotlessJ",
description="LATIN CAPITAL LETTER J",
direction="l",
- lccode=0x006A,
+ lccode=0x6A,
linebreak="al",
mathclass="variable",
- unicodeslot=0x004A,
+ unicodeslot=0x4A,
},
{
adobename="K",
@@ -817,10 +823,10 @@ characters.data={
cjkwd="na",
description="LATIN CAPITAL LETTER K",
direction="l",
- lccode=0x006B,
+ lccode=0x6B,
linebreak="al",
mathclass="variable",
- unicodeslot=0x004B,
+ unicodeslot=0x4B,
},
{
adobename="L",
@@ -828,10 +834,10 @@ characters.data={
cjkwd="na",
description="LATIN CAPITAL LETTER L",
direction="l",
- lccode=0x006C,
+ lccode=0x6C,
linebreak="al",
mathclass="variable",
- unicodeslot=0x004C,
+ unicodeslot=0x4C,
},
{
adobename="M",
@@ -839,10 +845,10 @@ characters.data={
cjkwd="na",
description="LATIN CAPITAL LETTER M",
direction="l",
- lccode=0x006D,
+ lccode=0x6D,
linebreak="al",
mathclass="variable",
- unicodeslot=0x004D,
+ unicodeslot=0x4D,
},
{
adobename="N",
@@ -850,10 +856,10 @@ characters.data={
cjkwd="na",
description="LATIN CAPITAL LETTER N",
direction="l",
- lccode=0x006E,
+ lccode=0x6E,
linebreak="al",
mathclass="variable",
- unicodeslot=0x004E,
+ unicodeslot=0x4E,
},
{
adobename="O",
@@ -861,10 +867,10 @@ characters.data={
cjkwd="na",
description="LATIN CAPITAL LETTER O",
direction="l",
- lccode=0x006F,
+ lccode=0x6F,
linebreak="al",
mathclass="variable",
- unicodeslot=0x004F,
+ unicodeslot=0x4F,
},
{
adobename="P",
@@ -872,10 +878,10 @@ characters.data={
cjkwd="na",
description="LATIN CAPITAL LETTER P",
direction="l",
- lccode=0x0070,
+ lccode=0x70,
linebreak="al",
mathclass="variable",
- unicodeslot=0x0050,
+ unicodeslot=0x50,
},
{
adobename="Q",
@@ -883,10 +889,10 @@ characters.data={
cjkwd="na",
description="LATIN CAPITAL LETTER Q",
direction="l",
- lccode=0x0071,
+ lccode=0x71,
linebreak="al",
mathclass="variable",
- unicodeslot=0x0051,
+ unicodeslot=0x51,
},
{
adobename="R",
@@ -894,10 +900,10 @@ characters.data={
cjkwd="na",
description="LATIN CAPITAL LETTER R",
direction="l",
- lccode=0x0072,
+ lccode=0x72,
linebreak="al",
mathclass="variable",
- unicodeslot=0x0052,
+ unicodeslot=0x52,
},
{
adobename="S",
@@ -905,10 +911,10 @@ characters.data={
cjkwd="na",
description="LATIN CAPITAL LETTER S",
direction="l",
- lccode=0x0073,
+ lccode=0x73,
linebreak="al",
mathclass="variable",
- unicodeslot=0x0053,
+ unicodeslot=0x53,
},
{
adobename="T",
@@ -916,10 +922,10 @@ characters.data={
cjkwd="na",
description="LATIN CAPITAL LETTER T",
direction="l",
- lccode=0x0074,
+ lccode=0x74,
linebreak="al",
mathclass="variable",
- unicodeslot=0x0054,
+ unicodeslot=0x54,
},
{
adobename="U",
@@ -927,10 +933,10 @@ characters.data={
cjkwd="na",
description="LATIN CAPITAL LETTER U",
direction="l",
- lccode=0x0075,
+ lccode=0x75,
linebreak="al",
mathclass="variable",
- unicodeslot=0x0055,
+ unicodeslot=0x55,
},
{
adobename="V",
@@ -938,10 +944,10 @@ characters.data={
cjkwd="na",
description="LATIN CAPITAL LETTER V",
direction="l",
- lccode=0x0076,
+ lccode=0x76,
linebreak="al",
mathclass="variable",
- unicodeslot=0x0056,
+ unicodeslot=0x56,
},
{
adobename="W",
@@ -949,10 +955,10 @@ characters.data={
cjkwd="na",
description="LATIN CAPITAL LETTER W",
direction="l",
- lccode=0x0077,
+ lccode=0x77,
linebreak="al",
mathclass="variable",
- unicodeslot=0x0057,
+ unicodeslot=0x57,
},
{
adobename="X",
@@ -960,10 +966,10 @@ characters.data={
cjkwd="na",
description="LATIN CAPITAL LETTER X",
direction="l",
- lccode=0x0078,
+ lccode=0x78,
linebreak="al",
mathclass="variable",
- unicodeslot=0x0058,
+ unicodeslot=0x58,
},
{
adobename="Y",
@@ -971,10 +977,10 @@ characters.data={
cjkwd="na",
description="LATIN CAPITAL LETTER Y",
direction="l",
- lccode=0x0079,
+ lccode=0x79,
linebreak="al",
mathclass="variable",
- unicodeslot=0x0059,
+ unicodeslot=0x59,
},
{
adobename="Z",
@@ -982,10 +988,10 @@ characters.data={
cjkwd="na",
description="LATIN CAPITAL LETTER Z",
direction="l",
- lccode=0x007A,
+ lccode=0x7A,
linebreak="al",
mathclass="variable",
- unicodeslot=0x005A,
+ unicodeslot=0x5A,
},
{
adobename="bracketleft",
@@ -996,9 +1002,9 @@ characters.data={
linebreak="op",
mathclass="open",
mathname="lbracket",
- mirror=0x005D,
+ mirror=0x5D,
textclass="open",
- unicodeslot=0x005B,
+ unicodeslot=0x5B,
},
{
adobename="backslash",
@@ -1010,7 +1016,7 @@ characters.data={
linebreak="pr",
mathclass="nothing",
mathname="backslash",
- unicodeslot=0x005C,
+ unicodeslot=0x5C,
},
{
adobename="bracketright",
@@ -1021,9 +1027,9 @@ characters.data={
linebreak="cp",
mathclass="close",
mathname="rbracket",
- mirror=0x005B,
+ mirror=0x5B,
textclass="close",
- unicodeslot=0x005D,
+ unicodeslot=0x5D,
},
{
adobename="asciicircum",
@@ -1034,7 +1040,8 @@ characters.data={
direction="on",
linebreak="al",
mathclass="topaccent",
- unicodeslot=0x005E,
+ mathname="Hat",
+ unicodeslot=0x5E,
},
{
adobename="underscore",
@@ -1044,7 +1051,7 @@ characters.data={
description="LOW LINE",
direction="on",
linebreak="al",
- unicodeslot=0x005F,
+ unicodeslot=0x5F,
},
{
adobename="grave",
@@ -1056,7 +1063,7 @@ characters.data={
linebreak="al",
mathclass="topaccent",
mathname="grave",
- unicodeslot=0x0060,
+ unicodeslot=0x60,
},
{
adobename="a",
@@ -1066,8 +1073,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x0041,
- unicodeslot=0x0061,
+ uccode=0x41,
+ unicodeslot=0x61,
},
{
adobename="b",
@@ -1077,8 +1084,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x0042,
- unicodeslot=0x0062,
+ uccode=0x42,
+ unicodeslot=0x62,
},
{
adobename="c",
@@ -1088,8 +1095,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x0043,
- unicodeslot=0x0063,
+ uccode=0x43,
+ unicodeslot=0x63,
},
{
adobename="d",
@@ -1099,8 +1106,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x0044,
- unicodeslot=0x0064,
+ uccode=0x44,
+ unicodeslot=0x64,
},
{
adobename="e",
@@ -1110,8 +1117,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x0045,
- unicodeslot=0x0065,
+ uccode=0x45,
+ unicodeslot=0x65,
},
{
adobename="f",
@@ -1121,8 +1128,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x0046,
- unicodeslot=0x0066,
+ uccode=0x46,
+ unicodeslot=0x66,
},
{
adobename="g",
@@ -1132,8 +1139,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x0047,
- unicodeslot=0x0067,
+ uccode=0x47,
+ unicodeslot=0x67,
},
{
adobename="h",
@@ -1143,8 +1150,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x0048,
- unicodeslot=0x0068,
+ uccode=0x48,
+ unicodeslot=0x68,
},
{
adobename="i",
@@ -1155,8 +1162,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x0049,
- unicodeslot=0x0069,
+ uccode=0x49,
+ unicodeslot=0x69,
},
{
adobename="j",
@@ -1166,8 +1173,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x004A,
- unicodeslot=0x006A,
+ uccode=0x4A,
+ unicodeslot=0x6A,
},
{
adobename="k",
@@ -1177,8 +1184,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x004B,
- unicodeslot=0x006B,
+ uccode=0x4B,
+ unicodeslot=0x6B,
},
{
adobename="l",
@@ -1188,8 +1195,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x004C,
- unicodeslot=0x006C,
+ uccode=0x4C,
+ unicodeslot=0x6C,
},
{
adobename="m",
@@ -1199,8 +1206,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x004D,
- unicodeslot=0x006D,
+ uccode=0x4D,
+ unicodeslot=0x6D,
},
{
adobename="n",
@@ -1210,8 +1217,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x004E,
- unicodeslot=0x006E,
+ uccode=0x4E,
+ unicodeslot=0x6E,
},
{
adobename="o",
@@ -1221,8 +1228,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x004F,
- unicodeslot=0x006F,
+ uccode=0x4F,
+ unicodeslot=0x6F,
},
{
adobename="p",
@@ -1232,8 +1239,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x0050,
- unicodeslot=0x0070,
+ uccode=0x50,
+ unicodeslot=0x70,
},
{
adobename="q",
@@ -1243,8 +1250,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x0051,
- unicodeslot=0x0071,
+ uccode=0x51,
+ unicodeslot=0x71,
},
{
adobename="r",
@@ -1254,8 +1261,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x0052,
- unicodeslot=0x0072,
+ uccode=0x52,
+ unicodeslot=0x72,
},
{
adobename="s",
@@ -1265,8 +1272,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x0053,
- unicodeslot=0x0073,
+ uccode=0x53,
+ unicodeslot=0x73,
},
{
adobename="t",
@@ -1276,8 +1283,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x0054,
- unicodeslot=0x0074,
+ uccode=0x54,
+ unicodeslot=0x74,
},
{
adobename="u",
@@ -1287,8 +1294,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x0055,
- unicodeslot=0x0075,
+ uccode=0x55,
+ unicodeslot=0x75,
},
{
adobename="v",
@@ -1298,8 +1305,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x0056,
- unicodeslot=0x0076,
+ uccode=0x56,
+ unicodeslot=0x76,
},
{
adobename="w",
@@ -1309,8 +1316,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x0057,
- unicodeslot=0x0077,
+ uccode=0x57,
+ unicodeslot=0x77,
},
{
adobename="x",
@@ -1320,8 +1327,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x0058,
- unicodeslot=0x0078,
+ uccode=0x58,
+ unicodeslot=0x78,
},
{
adobename="y",
@@ -1331,8 +1338,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x0059,
- unicodeslot=0x0079,
+ uccode=0x59,
+ unicodeslot=0x79,
},
{
adobename="z",
@@ -1342,8 +1349,8 @@ characters.data={
direction="l",
linebreak="al",
mathclass="variable",
- uccode=0x005A,
- unicodeslot=0x007A,
+ uccode=0x5A,
+ unicodeslot=0x7A,
},
{
adobename="braceleft",
@@ -1355,9 +1362,9 @@ characters.data={
linebreak="op",
mathclass="open",
mathname="lbrace",
- mirror=0x007D,
+ mirror=0x7D,
textclass="open",
- unicodeslot=0x007B,
+ unicodeslot=0x7B,
},
{
adobename="verticalbar",
@@ -1394,7 +1401,7 @@ characters.data={
name="singleverticalbar",
},
},
- unicodeslot=0x007C,
+ unicodeslot=0x7C,
},
{
adobename="braceright",
@@ -1406,9 +1413,9 @@ characters.data={
linebreak="cl",
mathclass="close",
mathname="rbrace",
- mirror=0x007B,
+ mirror=0x7B,
textclass="close",
- unicodeslot=0x007D,
+ unicodeslot=0x7D,
},
{
adobename="asciitilde",
@@ -1418,7 +1425,7 @@ characters.data={
description="TILDE",
direction="on",
linebreak="al",
- unicodeslot=0x007E,
+ unicodeslot=0x7E,
},
{
adobename="controlDEL",
@@ -1426,231 +1433,231 @@ characters.data={
description="DELETE",
direction="bn",
linebreak="cm",
- unicodeslot=0x007F,
+ unicodeslot=0x7F,
},
{
category="cc",
description="NONE",
direction="bn",
linebreak="cm",
- unicodeslot=0x0080,
+ unicodeslot=0x80,
},
{
category="cc",
description="NONE",
direction="bn",
linebreak="cm",
- unicodeslot=0x0081,
+ unicodeslot=0x81,
},
{
category="cc",
description="BREAK PERMITTED HERE",
direction="bn",
linebreak="cm",
- unicodeslot=0x0082,
+ unicodeslot=0x82,
},
{
category="cc",
description="NO BREAK HERE",
direction="bn",
linebreak="cm",
- unicodeslot=0x0083,
+ unicodeslot=0x83,
},
{
category="cc",
description="NONE",
direction="bn",
linebreak="cm",
- unicodeslot=0x0084,
+ unicodeslot=0x84,
},
{
category="cc",
description="NEXT LINE (NEL)",
direction="b",
linebreak="nl",
- unicodeslot=0x0085,
+ unicodeslot=0x85,
},
{
category="cc",
description="START OF SELECTED AREA",
direction="bn",
linebreak="cm",
- unicodeslot=0x0086,
+ unicodeslot=0x86,
},
{
category="cc",
description="END OF SELECTED AREA",
direction="bn",
linebreak="cm",
- unicodeslot=0x0087,
+ unicodeslot=0x87,
},
{
category="cc",
description="CHARACTER TABULATION SET",
direction="bn",
linebreak="cm",
- unicodeslot=0x0088,
+ unicodeslot=0x88,
},
{
category="cc",
description="CHARACTER TABULATION WITH JUSTIFICATION",
direction="bn",
linebreak="cm",
- unicodeslot=0x0089,
+ unicodeslot=0x89,
},
{
category="cc",
description="LINE TABULATION SET",
direction="bn",
linebreak="cm",
- unicodeslot=0x008A,
+ unicodeslot=0x8A,
},
{
category="cc",
description="PARTIAL LINE FORWARD",
direction="bn",
linebreak="cm",
- unicodeslot=0x008B,
+ unicodeslot=0x8B,
},
{
category="cc",
description="PARTIAL LINE BACKWARD",
direction="bn",
linebreak="cm",
- unicodeslot=0x008C,
+ unicodeslot=0x8C,
},
{
category="cc",
description="REVERSE LINE FEED",
direction="bn",
linebreak="cm",
- unicodeslot=0x008D,
+ unicodeslot=0x8D,
},
{
category="cc",
description="SINGLE SHIFT TWO",
direction="bn",
linebreak="cm",
- unicodeslot=0x008E,
+ unicodeslot=0x8E,
},
{
category="cc",
description="SINGLE SHIFT THREE",
direction="bn",
linebreak="cm",
- unicodeslot=0x008F,
+ unicodeslot=0x8F,
},
{
category="cc",
description="DEVICE CONTROL STRING",
direction="bn",
linebreak="cm",
- unicodeslot=0x0090,
+ unicodeslot=0x90,
},
{
category="cc",
description="PRIVATE USE ONE",
direction="bn",
linebreak="cm",
- unicodeslot=0x0091,
+ unicodeslot=0x91,
},
{
category="cc",
description="PRIVATE USE TWO",
direction="bn",
linebreak="cm",
- unicodeslot=0x0092,
+ unicodeslot=0x92,
},
{
category="cc",
description="SET TRANSMIT STATE",
direction="bn",
linebreak="cm",
- unicodeslot=0x0093,
+ unicodeslot=0x93,
},
{
category="cc",
description="CANCEL CHARACTER",
direction="bn",
linebreak="cm",
- unicodeslot=0x0094,
+ unicodeslot=0x94,
},
{
category="cc",
description="MESSAGE WAITING",
direction="bn",
linebreak="cm",
- unicodeslot=0x0095,
+ unicodeslot=0x95,
},
{
category="cc",
description="START OF GUARDED AREA",
direction="bn",
linebreak="cm",
- unicodeslot=0x0096,
+ unicodeslot=0x96,
},
{
category="cc",
description="END OF GUARDED AREA",
direction="bn",
linebreak="cm",
- unicodeslot=0x0097,
+ unicodeslot=0x97,
},
{
category="cc",
description="START OF STRING",
direction="bn",
linebreak="cm",
- unicodeslot=0x0098,
+ unicodeslot=0x98,
},
{
category="cc",
description="NONE",
direction="bn",
linebreak="cm",
- unicodeslot=0x0099,
+ unicodeslot=0x99,
},
{
category="cc",
description="SINGLE CHARACTER INTRODUCER",
direction="bn",
linebreak="cm",
- unicodeslot=0x009A,
+ unicodeslot=0x9A,
},
{
category="cc",
description="CONTROL SEQUENCE INTRODUCER",
direction="bn",
linebreak="cm",
- unicodeslot=0x009B,
+ unicodeslot=0x9B,
},
{
category="cc",
description="STRING TERMINATOR",
direction="bn",
linebreak="cm",
- unicodeslot=0x009C,
+ unicodeslot=0x9C,
},
{
category="cc",
description="OPERATING SYSTEM COMMAND",
direction="bn",
linebreak="cm",
- unicodeslot=0x009D,
+ unicodeslot=0x9D,
},
{
category="cc",
description="PRIVACY MESSAGE",
direction="bn",
linebreak="cm",
- unicodeslot=0x009E,
+ unicodeslot=0x9E,
},
{
category="cc",
description="APPLICATION PROGRAM COMMAND",
direction="bn",
linebreak="cm",
- unicodeslot=0x009F,
+ unicodeslot=0x9F,
},
{
adobename="nonbreakingspace",
@@ -1659,8 +1666,8 @@ characters.data={
description="NO-BREAK SPACE",
direction="cs",
linebreak="gl",
- specials={ "nobreak", 0x0020 },
- unicodeslot=0x00A0,
+ specials={ "nobreak", 0x20 },
+ unicodeslot=0xA0,
},
{
adobename="exclamdown",
@@ -1670,7 +1677,7 @@ characters.data={
description="INVERTED EXCLAMATION MARK",
direction="on",
linebreak="op",
- unicodeslot=0x00A1,
+ unicodeslot=0xA1,
},
{
adobename="cent",
@@ -1680,7 +1687,7 @@ characters.data={
description="CENT SIGN",
direction="et",
linebreak="po",
- unicodeslot=0x00A2,
+ unicodeslot=0xA2,
},
{
adobename="sterling",
@@ -1690,7 +1697,7 @@ characters.data={
description="POUND SIGN",
direction="et",
linebreak="pr",
- unicodeslot=0x00A3,
+ unicodeslot=0xA3,
},
{
adobename="currency",
@@ -1700,7 +1707,7 @@ characters.data={
description="CURRENCY SIGN",
direction="et",
linebreak="pr",
- unicodeslot=0x00A4,
+ unicodeslot=0xA4,
},
{
adobename="yen",
@@ -1712,7 +1719,7 @@ characters.data={
linebreak="pr",
mathclass="nothing",
mathname="yen",
- unicodeslot=0x00A5,
+ unicodeslot=0xA5,
},
{
adobename="brokenbar",
@@ -1722,7 +1729,7 @@ characters.data={
description="BROKEN BAR",
direction="on",
linebreak="al",
- unicodeslot=0x00A6,
+ unicodeslot=0xA6,
},
{
adobename="section",
@@ -1734,7 +1741,7 @@ characters.data={
linebreak="ai",
mathclass="box",
mathname="S",
- unicodeslot=0x00A7,
+ unicodeslot=0xA7,
},
{
adobename="dieresis",
@@ -1746,8 +1753,8 @@ characters.data={
linebreak="ai",
mathclass="topaccent",
mathname="ddot",
- specials={ "compat", 0x0020, 0x0308 },
- unicodeslot=0x00A8,
+ specials={ "compat", 0x20, 0x308 },
+ unicodeslot=0xA8,
},
{
adobename="copyright",
@@ -1756,7 +1763,7 @@ characters.data={
description="COPYRIGHT SIGN",
direction="on",
linebreak="al",
- unicodeslot=0x00A9,
+ unicodeslot=0xA9,
},
{
adobename="ordfeminine",
@@ -1766,8 +1773,8 @@ characters.data={
description="FEMININE ORDINAL INDICATOR",
direction="l",
linebreak="ai",
- specials={ "super", 0x0061 },
- unicodeslot=0x00AA,
+ specials={ "super", 0x61 },
+ unicodeslot=0xAA,
},
{
adobename="guillemotleft",
@@ -1776,9 +1783,9 @@ characters.data={
description="LEFT-POINTING DOUBLE ANGLE QUOTATION MARK",
direction="on",
linebreak="qu",
- mirror=0x00BB,
+ mirror=0xBB,
textclass="open",
- unicodeslot=0x00AB,
+ unicodeslot=0xAB,
},
{
adobename="logicalnot",
@@ -1798,7 +1805,7 @@ characters.data={
name="neg",
},
},
- unicodeslot=0x00AC,
+ unicodeslot=0xAC,
},
{
adobename="softhyphen",
@@ -1808,7 +1815,7 @@ characters.data={
description="SOFT HYPHEN",
direction="bn",
linebreak="ba",
- unicodeslot=0x00AD,
+ unicodeslot=0xAD,
},
{
adobename="registered",
@@ -1818,7 +1825,7 @@ characters.data={
description="REGISTERED SIGN",
direction="on",
linebreak="al",
- unicodeslot=0x00AE,
+ unicodeslot=0xAE,
},
{
adobename="macron",
@@ -1830,10 +1837,10 @@ characters.data={
linebreak="al",
mathclass="topaccent",
mathfiller="barfill",
- mathname="bar",
mathmleq=0x203E,
- specials={ "compat", 0x0020, 0x0304 },
- unicodeslot=0x00AF,
+ mathname="bar",
+ specials={ "compat", 0x20, 0x304 },
+ unicodeslot=0xAF,
},
{
adobename="degree",
@@ -1843,7 +1850,7 @@ characters.data={
description="DEGREE SIGN",
direction="et",
linebreak="po",
- unicodeslot=0x00B0,
+ unicodeslot=0xB0,
},
{
adobename="plusminus",
@@ -1855,7 +1862,7 @@ characters.data={
linebreak="pr",
mathclass="binary",
mathname="pm",
- unicodeslot=0x00B1,
+ unicodeslot=0xB1,
},
{
adobename="twosuperior",
@@ -1865,8 +1872,8 @@ characters.data={
description="SUPERSCRIPT TWO",
direction="en",
linebreak="ai",
- specials={ "super", 0x0032 },
- unicodeslot=0x00B2,
+ specials={ "super", 0x32 },
+ unicodeslot=0xB2,
},
{
adobename="threesuperior",
@@ -1876,8 +1883,8 @@ characters.data={
description="SUPERSCRIPT THREE",
direction="en",
linebreak="ai",
- specials={ "super", 0x0033 },
- unicodeslot=0x00B3,
+ specials={ "super", 0x33 },
+ unicodeslot=0xB3,
},
{
adobename="acute",
@@ -1889,8 +1896,8 @@ characters.data={
linebreak="bb",
mathclass="topaccent",
mathname="acute",
- specials={ "compat", 0x0020, 0x0301 },
- unicodeslot=0x00B4,
+ specials={ "compat", 0x20, 0x301 },
+ unicodeslot=0xB4,
},
{
adobename="mu1",
@@ -1899,9 +1906,9 @@ characters.data={
description="MICRO SIGN",
direction="l",
linebreak="al",
- specials={ "compat", 0x03BC },
- uccode=0x039C,
- unicodeslot=0x00B5,
+ specials={ "compat", 0x3BC },
+ uccode=0x39C,
+ unicodeslot=0xB5,
},
{
adobename="paragraph",
@@ -1913,7 +1920,7 @@ characters.data={
linebreak="ai",
mathclass="box",
mathname="P",
- unicodeslot=0x00B6,
+ unicodeslot=0xB6,
},
{
adobename="periodcentered",
@@ -1925,7 +1932,7 @@ characters.data={
linebreak="ai",
mathclass="binary",
mathname="centerdot",
- unicodeslot=0x00B7,
+ unicodeslot=0xB7,
},
{
adobename="cedilla",
@@ -1935,8 +1942,8 @@ characters.data={
description="CEDILLA",
direction="on",
linebreak="ai",
- specials={ "compat", 0x0020, 0x0327 },
- unicodeslot=0x00B8,
+ specials={ "compat", 0x20, 0x327 },
+ unicodeslot=0xB8,
},
{
adobename="onesuperior",
@@ -1946,8 +1953,8 @@ characters.data={
description="SUPERSCRIPT ONE",
direction="en",
linebreak="ai",
- specials={ "super", 0x0031 },
- unicodeslot=0x00B9,
+ specials={ "super", 0x31 },
+ unicodeslot=0xB9,
},
{
adobename="ordmasculine",
@@ -1957,8 +1964,8 @@ characters.data={
description="MASCULINE ORDINAL INDICATOR",
direction="l",
linebreak="ai",
- specials={ "super", 0x006F },
- unicodeslot=0x00BA,
+ specials={ "super", 0x6F },
+ unicodeslot=0xBA,
},
{
adobename="guillemotright",
@@ -1967,9 +1974,9 @@ characters.data={
description="RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK",
direction="on",
linebreak="qu",
- mirror=0x00AB,
+ mirror=0xAB,
textclass="close",
- unicodeslot=0x00BB,
+ unicodeslot=0xBB,
},
{
adobename="onequarter",
@@ -1979,8 +1986,8 @@ characters.data={
description="VULGAR FRACTION ONE QUARTER",
direction="on",
linebreak="ai",
- specials={ "fraction", 0x0031, 0x2044, 0x0034 },
- unicodeslot=0x00BC,
+ specials={ "fraction", 0x31, 0x2044, 0x34 },
+ unicodeslot=0xBC,
},
{
adobename="onehalf",
@@ -1990,8 +1997,8 @@ characters.data={
description="VULGAR FRACTION ONE HALF",
direction="on",
linebreak="ai",
- specials={ "fraction", 0x0031, 0x2044, 0x0032 },
- unicodeslot=0x00BD,
+ specials={ "fraction", 0x31, 0x2044, 0x32 },
+ unicodeslot=0xBD,
},
{
adobename="threequarters",
@@ -2001,8 +2008,8 @@ characters.data={
description="VULGAR FRACTION THREE QUARTERS",
direction="on",
linebreak="ai",
- specials={ "fraction", 0x0033, 0x2044, 0x0034 },
- unicodeslot=0x00BE,
+ specials={ "fraction", 0x33, 0x2044, 0x34 },
+ unicodeslot=0xBE,
},
{
adobename="questiondown",
@@ -2012,7 +2019,7 @@ characters.data={
description="INVERTED QUESTION MARK",
direction="on",
linebreak="op",
- unicodeslot=0x00BF,
+ unicodeslot=0xBF,
},
{
adobename="Agrave",
@@ -2020,11 +2027,11 @@ characters.data={
contextname="Agrave",
description="LATIN CAPITAL LETTER A WITH GRAVE",
direction="l",
- lccode=0x00E0,
+ lccode=0xE0,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x0041, 0x0300 },
- unicodeslot=0x00C0,
+ shcode=0x41,
+ specials={ "char", 0x41, 0x300 },
+ unicodeslot=0xC0,
},
{
adobename="Aacute",
@@ -2032,11 +2039,11 @@ characters.data={
contextname="Aacute",
description="LATIN CAPITAL LETTER A WITH ACUTE",
direction="l",
- lccode=0x00E1,
+ lccode=0xE1,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x0041, 0x0301 },
- unicodeslot=0x00C1,
+ shcode=0x41,
+ specials={ "char", 0x41, 0x301 },
+ unicodeslot=0xC1,
},
{
adobename="Acircumflex",
@@ -2044,11 +2051,11 @@ characters.data={
contextname="Acircumflex",
description="LATIN CAPITAL LETTER A WITH CIRCUMFLEX",
direction="l",
- lccode=0x00E2,
+ lccode=0xE2,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x0041, 0x0302 },
- unicodeslot=0x00C2,
+ shcode=0x41,
+ specials={ "char", 0x41, 0x302 },
+ unicodeslot=0xC2,
},
{
adobename="Atilde",
@@ -2056,11 +2063,11 @@ characters.data={
contextname="Atilde",
description="LATIN CAPITAL LETTER A WITH TILDE",
direction="l",
- lccode=0x00E3,
+ lccode=0xE3,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x0041, 0x0303 },
- unicodeslot=0x00C3,
+ shcode=0x41,
+ specials={ "char", 0x41, 0x303 },
+ unicodeslot=0xC3,
},
{
adobename="Adieresis",
@@ -2068,11 +2075,11 @@ characters.data={
contextname="Adiaeresis",
description="LATIN CAPITAL LETTER A WITH DIAERESIS",
direction="l",
- lccode=0x00E4,
+ lccode=0xE4,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x0041, 0x0308 },
- unicodeslot=0x00C4,
+ shcode=0x41,
+ specials={ "char", 0x41, 0x308 },
+ unicodeslot=0xC4,
},
{
adobename="Aring",
@@ -2080,11 +2087,11 @@ characters.data={
contextname="Aring",
description="LATIN CAPITAL LETTER A WITH RING ABOVE",
direction="l",
- lccode=0x00E5,
+ lccode=0xE5,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x0041, 0x030A },
- unicodeslot=0x00C5,
+ shcode=0x41,
+ specials={ "char", 0x41, 0x30A },
+ unicodeslot=0xC5,
},
{
adobename="AE",
@@ -2093,10 +2100,10 @@ characters.data={
contextname="AEligature",
description="LATIN CAPITAL LETTER AE",
direction="l",
- lccode=0x00E6,
+ lccode=0xE6,
linebreak="al",
- shcode={ 0x0041, 0x0045 },
- unicodeslot=0x00C6,
+ shcode={ 0x41, 0x45 },
+ unicodeslot=0xC6,
},
{
adobename="Ccedilla",
@@ -2104,11 +2111,11 @@ characters.data={
contextname="Ccedilla",
description="LATIN CAPITAL LETTER C WITH CEDILLA",
direction="l",
- lccode=0x00E7,
+ lccode=0xE7,
linebreak="al",
- shcode=0x0043,
- specials={ "char", 0x0043, 0x0327 },
- unicodeslot=0x00C7,
+ shcode=0x43,
+ specials={ "char", 0x43, 0x327 },
+ unicodeslot=0xC7,
},
{
adobename="Egrave",
@@ -2116,11 +2123,11 @@ characters.data={
contextname="Egrave",
description="LATIN CAPITAL LETTER E WITH GRAVE",
direction="l",
- lccode=0x00E8,
+ lccode=0xE8,
linebreak="al",
- shcode=0x0045,
- specials={ "char", 0x0045, 0x0300 },
- unicodeslot=0x00C8,
+ shcode=0x45,
+ specials={ "char", 0x45, 0x300 },
+ unicodeslot=0xC8,
},
{
adobename="Eacute",
@@ -2128,11 +2135,11 @@ characters.data={
contextname="Eacute",
description="LATIN CAPITAL LETTER E WITH ACUTE",
direction="l",
- lccode=0x00E9,
+ lccode=0xE9,
linebreak="al",
- shcode=0x0045,
- specials={ "char", 0x0045, 0x0301 },
- unicodeslot=0x00C9,
+ shcode=0x45,
+ specials={ "char", 0x45, 0x301 },
+ unicodeslot=0xC9,
},
{
adobename="Ecircumflex",
@@ -2140,11 +2147,11 @@ characters.data={
contextname="Ecircumflex",
description="LATIN CAPITAL LETTER E WITH CIRCUMFLEX",
direction="l",
- lccode=0x00EA,
+ lccode=0xEA,
linebreak="al",
- shcode=0x0045,
- specials={ "char", 0x0045, 0x0302 },
- unicodeslot=0x00CA,
+ shcode=0x45,
+ specials={ "char", 0x45, 0x302 },
+ unicodeslot=0xCA,
},
{
adobename="Edieresis",
@@ -2152,11 +2159,11 @@ characters.data={
contextname="Ediaeresis",
description="LATIN CAPITAL LETTER E WITH DIAERESIS",
direction="l",
- lccode=0x00EB,
+ lccode=0xEB,
linebreak="al",
- shcode=0x0045,
- specials={ "char", 0x0045, 0x0308 },
- unicodeslot=0x00CB,
+ shcode=0x45,
+ specials={ "char", 0x45, 0x308 },
+ unicodeslot=0xCB,
},
{
adobename="Igrave",
@@ -2164,11 +2171,11 @@ characters.data={
contextname="Igrave",
description="LATIN CAPITAL LETTER I WITH GRAVE",
direction="l",
- lccode=0x00EC,
+ lccode=0xEC,
linebreak="al",
- shcode=0x0049,
- specials={ "char", 0x0049, 0x0300 },
- unicodeslot=0x00CC,
+ shcode=0x49,
+ specials={ "char", 0x49, 0x300 },
+ unicodeslot=0xCC,
},
{
adobename="Iacute",
@@ -2176,11 +2183,11 @@ characters.data={
contextname="Iacute",
description="LATIN CAPITAL LETTER I WITH ACUTE",
direction="l",
- lccode=0x00ED,
+ lccode=0xED,
linebreak="al",
- shcode=0x0049,
- specials={ "char", 0x0049, 0x0301 },
- unicodeslot=0x00CD,
+ shcode=0x49,
+ specials={ "char", 0x49, 0x301 },
+ unicodeslot=0xCD,
},
{
adobename="Icircumflex",
@@ -2188,11 +2195,11 @@ characters.data={
contextname="Icircumflex",
description="LATIN CAPITAL LETTER I WITH CIRCUMFLEX",
direction="l",
- lccode=0x00EE,
+ lccode=0xEE,
linebreak="al",
- shcode=0x0049,
- specials={ "char", 0x0049, 0x0302 },
- unicodeslot=0x00CE,
+ shcode=0x49,
+ specials={ "char", 0x49, 0x302 },
+ unicodeslot=0xCE,
},
{
adobename="Idieresis",
@@ -2200,11 +2207,11 @@ characters.data={
contextname="Idiaeresis",
description="LATIN CAPITAL LETTER I WITH DIAERESIS",
direction="l",
- lccode=0x00EF,
+ lccode=0xEF,
linebreak="al",
- shcode=0x0049,
- specials={ "char", 0x0049, 0x0308 },
- unicodeslot=0x00CF,
+ shcode=0x49,
+ specials={ "char", 0x49, 0x308 },
+ unicodeslot=0xCF,
},
{
adobename="Eth",
@@ -2213,9 +2220,9 @@ characters.data={
contextname="Eth",
description="LATIN CAPITAL LETTER ETH",
direction="l",
- lccode=0x00F0,
+ lccode=0xF0,
linebreak="al",
- unicodeslot=0x00D0,
+ unicodeslot=0xD0,
},
{
adobename="Ntilde",
@@ -2223,11 +2230,11 @@ characters.data={
contextname="Ntilde",
description="LATIN CAPITAL LETTER N WITH TILDE",
direction="l",
- lccode=0x00F1,
+ lccode=0xF1,
linebreak="al",
- shcode=0x004E,
- specials={ "char", 0x004E, 0x0303 },
- unicodeslot=0x00D1,
+ shcode=0x4E,
+ specials={ "char", 0x4E, 0x303 },
+ unicodeslot=0xD1,
},
{
adobename="Ograve",
@@ -2235,11 +2242,11 @@ characters.data={
contextname="Ograve",
description="LATIN CAPITAL LETTER O WITH GRAVE",
direction="l",
- lccode=0x00F2,
+ lccode=0xF2,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x004F, 0x0300 },
- unicodeslot=0x00D2,
+ shcode=0x4F,
+ specials={ "char", 0x4F, 0x300 },
+ unicodeslot=0xD2,
},
{
adobename="Oacute",
@@ -2247,11 +2254,11 @@ characters.data={
contextname="Oacute",
description="LATIN CAPITAL LETTER O WITH ACUTE",
direction="l",
- lccode=0x00F3,
+ lccode=0xF3,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x004F, 0x0301 },
- unicodeslot=0x00D3,
+ shcode=0x4F,
+ specials={ "char", 0x4F, 0x301 },
+ unicodeslot=0xD3,
},
{
adobename="Ocircumflex",
@@ -2259,11 +2266,11 @@ characters.data={
contextname="Ocircumflex",
description="LATIN CAPITAL LETTER O WITH CIRCUMFLEX",
direction="l",
- lccode=0x00F4,
+ lccode=0xF4,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x004F, 0x0302 },
- unicodeslot=0x00D4,
+ shcode=0x4F,
+ specials={ "char", 0x4F, 0x302 },
+ unicodeslot=0xD4,
},
{
adobename="Otilde",
@@ -2271,11 +2278,11 @@ characters.data={
contextname="Otilde",
description="LATIN CAPITAL LETTER O WITH TILDE",
direction="l",
- lccode=0x00F5,
+ lccode=0xF5,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x004F, 0x0303 },
- unicodeslot=0x00D5,
+ shcode=0x4F,
+ specials={ "char", 0x4F, 0x303 },
+ unicodeslot=0xD5,
},
{
adobename="Odieresis",
@@ -2283,11 +2290,11 @@ characters.data={
contextname="Odiaeresis",
description="LATIN CAPITAL LETTER O WITH DIAERESIS",
direction="l",
- lccode=0x00F6,
+ lccode=0xF6,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x004F, 0x0308 },
- unicodeslot=0x00D6,
+ shcode=0x4F,
+ specials={ "char", 0x4F, 0x308 },
+ unicodeslot=0xD6,
},
{
adobename="multiply",
@@ -2299,7 +2306,7 @@ characters.data={
linebreak="ai",
mathclass="binary",
mathname="times",
- unicodeslot=0x00D7,
+ unicodeslot=0xD7,
},
{
adobename="Oslash",
@@ -2308,10 +2315,10 @@ characters.data={
contextname="Ostroke",
description="LATIN CAPITAL LETTER O WITH STROKE",
direction="l",
- lccode=0x00F8,
+ lccode=0xF8,
linebreak="al",
- shcode=0x004F,
- unicodeslot=0x00D8,
+ shcode=0x4F,
+ unicodeslot=0xD8,
},
{
adobename="Ugrave",
@@ -2319,11 +2326,11 @@ characters.data={
contextname="Ugrave",
description="LATIN CAPITAL LETTER U WITH GRAVE",
direction="l",
- lccode=0x00F9,
+ lccode=0xF9,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x0055, 0x0300 },
- unicodeslot=0x00D9,
+ shcode=0x55,
+ specials={ "char", 0x55, 0x300 },
+ unicodeslot=0xD9,
},
{
adobename="Uacute",
@@ -2331,11 +2338,11 @@ characters.data={
contextname="Uacute",
description="LATIN CAPITAL LETTER U WITH ACUTE",
direction="l",
- lccode=0x00FA,
+ lccode=0xFA,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x0055, 0x0301 },
- unicodeslot=0x00DA,
+ shcode=0x55,
+ specials={ "char", 0x55, 0x301 },
+ unicodeslot=0xDA,
},
{
adobename="Ucircumflex",
@@ -2343,11 +2350,11 @@ characters.data={
contextname="Ucircumflex",
description="LATIN CAPITAL LETTER U WITH CIRCUMFLEX",
direction="l",
- lccode=0x00FB,
+ lccode=0xFB,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x0055, 0x0302 },
- unicodeslot=0x00DB,
+ shcode=0x55,
+ specials={ "char", 0x55, 0x302 },
+ unicodeslot=0xDB,
},
{
adobename="Udieresis",
@@ -2355,11 +2362,11 @@ characters.data={
contextname="Udiaeresis",
description="LATIN CAPITAL LETTER U WITH DIAERESIS",
direction="l",
- lccode=0x00FC,
+ lccode=0xFC,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x0055, 0x0308 },
- unicodeslot=0x00DC,
+ shcode=0x55,
+ specials={ "char", 0x55, 0x308 },
+ unicodeslot=0xDC,
},
{
adobename="Yacute",
@@ -2367,11 +2374,11 @@ characters.data={
contextname="Yacute",
description="LATIN CAPITAL LETTER Y WITH ACUTE",
direction="l",
- lccode=0x00FD,
+ lccode=0xFD,
linebreak="al",
- shcode=0x0059,
- specials={ "char", 0x0059, 0x0301 },
- unicodeslot=0x00DD,
+ shcode=0x59,
+ specials={ "char", 0x59, 0x301 },
+ unicodeslot=0xDD,
},
{
adobename="Thorn",
@@ -2380,9 +2387,9 @@ characters.data={
contextname="Thorn",
description="LATIN CAPITAL LETTER THORN",
direction="l",
- lccode=0x00FE,
+ lccode=0xFE,
linebreak="al",
- unicodeslot=0x00DE,
+ unicodeslot=0xDE,
},
{
adobename="germandbls",
@@ -2392,8 +2399,9 @@ characters.data={
description="LATIN SMALL LETTER SHARP S",
direction="l",
linebreak="al",
- uccode={ 0x0053, 0x0053 },
- unicodeslot=0x00DF,
+ uccode={ 0x53, 0x53 },
+ shcode={ 0x73, 0x73 },
+ unicodeslot=0xDF,
},
{
adobename="agrave",
@@ -2403,10 +2411,10 @@ characters.data={
description="LATIN SMALL LETTER A WITH GRAVE",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x0061, 0x0300 },
- uccode=0x00C0,
- unicodeslot=0x00E0,
+ shcode=0x61,
+ specials={ "char", 0x61, 0x300 },
+ uccode=0xC0,
+ unicodeslot=0xE0,
},
{
adobename="aacute",
@@ -2416,10 +2424,10 @@ characters.data={
description="LATIN SMALL LETTER A WITH ACUTE",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x0061, 0x0301 },
- uccode=0x00C1,
- unicodeslot=0x00E1,
+ shcode=0x61,
+ specials={ "char", 0x61, 0x301 },
+ uccode=0xC1,
+ unicodeslot=0xE1,
},
{
adobename="acircumflex",
@@ -2428,10 +2436,10 @@ characters.data={
description="LATIN SMALL LETTER A WITH CIRCUMFLEX",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x0061, 0x0302 },
- uccode=0x00C2,
- unicodeslot=0x00E2,
+ shcode=0x61,
+ specials={ "char", 0x61, 0x302 },
+ uccode=0xC2,
+ unicodeslot=0xE2,
},
{
adobename="atilde",
@@ -2440,10 +2448,10 @@ characters.data={
description="LATIN SMALL LETTER A WITH TILDE",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x0061, 0x0303 },
- uccode=0x00C3,
- unicodeslot=0x00E3,
+ shcode=0x61,
+ specials={ "char", 0x61, 0x303 },
+ uccode=0xC3,
+ unicodeslot=0xE3,
},
{
adobename="adieresis",
@@ -2452,10 +2460,10 @@ characters.data={
description="LATIN SMALL LETTER A WITH DIAERESIS",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x0061, 0x0308 },
- uccode=0x00C4,
- unicodeslot=0x00E4,
+ shcode=0x61,
+ specials={ "char", 0x61, 0x308 },
+ uccode=0xC4,
+ unicodeslot=0xE4,
},
{
adobename="aring",
@@ -2464,10 +2472,10 @@ characters.data={
description="LATIN SMALL LETTER A WITH RING ABOVE",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x0061, 0x030A },
- uccode=0x00C5,
- unicodeslot=0x00E5,
+ shcode=0x61,
+ specials={ "char", 0x61, 0x30A },
+ uccode=0xC5,
+ unicodeslot=0xE5,
},
{
adobename="ae",
@@ -2477,9 +2485,9 @@ characters.data={
description="LATIN SMALL LETTER AE",
direction="l",
linebreak="al",
- shcode={ 0x0061, 0x0065 },
- uccode=0x00C6,
- unicodeslot=0x00E6,
+ shcode={ 0x61, 0x65 },
+ uccode=0xC6,
+ unicodeslot=0xE6,
},
{
adobename="ccedilla",
@@ -2488,10 +2496,10 @@ characters.data={
description="LATIN SMALL LETTER C WITH CEDILLA",
direction="l",
linebreak="al",
- shcode=0x0063,
- specials={ "char", 0x0063, 0x0327 },
- uccode=0x00C7,
- unicodeslot=0x00E7,
+ shcode=0x63,
+ specials={ "char", 0x63, 0x327 },
+ uccode=0xC7,
+ unicodeslot=0xE7,
},
{
adobename="egrave",
@@ -2501,10 +2509,10 @@ characters.data={
description="LATIN SMALL LETTER E WITH GRAVE",
direction="l",
linebreak="al",
- shcode=0x0065,
- specials={ "char", 0x0065, 0x0300 },
- uccode=0x00C8,
- unicodeslot=0x00E8,
+ shcode=0x65,
+ specials={ "char", 0x65, 0x300 },
+ uccode=0xC8,
+ unicodeslot=0xE8,
},
{
adobename="eacute",
@@ -2514,10 +2522,10 @@ characters.data={
description="LATIN SMALL LETTER E WITH ACUTE",
direction="l",
linebreak="al",
- shcode=0x0065,
- specials={ "char", 0x0065, 0x0301 },
- uccode=0x00C9,
- unicodeslot=0x00E9,
+ shcode=0x65,
+ specials={ "char", 0x65, 0x301 },
+ uccode=0xC9,
+ unicodeslot=0xE9,
},
{
adobename="ecircumflex",
@@ -2527,10 +2535,10 @@ characters.data={
description="LATIN SMALL LETTER E WITH CIRCUMFLEX",
direction="l",
linebreak="al",
- shcode=0x0065,
- specials={ "char", 0x0065, 0x0302 },
- uccode=0x00CA,
- unicodeslot=0x00EA,
+ shcode=0x65,
+ specials={ "char", 0x65, 0x302 },
+ uccode=0xCA,
+ unicodeslot=0xEA,
},
{
adobename="edieresis",
@@ -2539,10 +2547,10 @@ characters.data={
description="LATIN SMALL LETTER E WITH DIAERESIS",
direction="l",
linebreak="al",
- shcode=0x0065,
- specials={ "char", 0x0065, 0x0308 },
- uccode=0x00CB,
- unicodeslot=0x00EB,
+ shcode=0x65,
+ specials={ "char", 0x65, 0x308 },
+ uccode=0xCB,
+ unicodeslot=0xEB,
},
{
adobename="igrave",
@@ -2552,10 +2560,10 @@ characters.data={
description="LATIN SMALL LETTER I WITH GRAVE",
direction="l",
linebreak="al",
- shcode=0x0069,
- specials={ "char", 0x0069, 0x0300 },
- uccode=0x00CC,
- unicodeslot=0x00EC,
+ shcode=0x69,
+ specials={ "char", 0x69, 0x300 },
+ uccode=0xCC,
+ unicodeslot=0xEC,
},
{
adobename="iacute",
@@ -2565,10 +2573,10 @@ characters.data={
description="LATIN SMALL LETTER I WITH ACUTE",
direction="l",
linebreak="al",
- shcode=0x0069,
- specials={ "char", 0x0069, 0x0301 },
- uccode=0x00CD,
- unicodeslot=0x00ED,
+ shcode=0x69,
+ specials={ "char", 0x69, 0x301 },
+ uccode=0xCD,
+ unicodeslot=0xED,
},
{
adobename="icircumflex",
@@ -2577,10 +2585,10 @@ characters.data={
description="LATIN SMALL LETTER I WITH CIRCUMFLEX",
direction="l",
linebreak="al",
- shcode=0x0069,
- specials={ "char", 0x0069, 0x0302 },
- uccode=0x00CE,
- unicodeslot=0x00EE,
+ shcode=0x69,
+ specials={ "char", 0x69, 0x302 },
+ uccode=0xCE,
+ unicodeslot=0xEE,
},
{
adobename="idieresis",
@@ -2589,10 +2597,10 @@ characters.data={
description="LATIN SMALL LETTER I WITH DIAERESIS",
direction="l",
linebreak="al",
- shcode=0x0069,
- specials={ "char", 0x0069, 0x0308 },
- uccode=0x00CF,
- unicodeslot=0x00EF,
+ shcode=0x69,
+ specials={ "char", 0x69, 0x308 },
+ uccode=0xCF,
+ unicodeslot=0xEF,
},
{
adobename="eth",
@@ -2604,8 +2612,8 @@ characters.data={
linebreak="al",
mathclass="ordinary",
mathname="eth",
- uccode=0x00D0,
- unicodeslot=0x00F0,
+ uccode=0xD0,
+ unicodeslot=0xF0,
},
{
adobename="ntilde",
@@ -2614,10 +2622,10 @@ characters.data={
description="LATIN SMALL LETTER N WITH TILDE",
direction="l",
linebreak="al",
- shcode=0x006E,
- specials={ "char", 0x006E, 0x0303 },
- uccode=0x00D1,
- unicodeslot=0x00F1,
+ shcode=0x6E,
+ specials={ "char", 0x6E, 0x303 },
+ uccode=0xD1,
+ unicodeslot=0xF1,
},
{
adobename="ograve",
@@ -2627,10 +2635,10 @@ characters.data={
description="LATIN SMALL LETTER O WITH GRAVE",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x006F, 0x0300 },
- uccode=0x00D2,
- unicodeslot=0x00F2,
+ shcode=0x6F,
+ specials={ "char", 0x6F, 0x300 },
+ uccode=0xD2,
+ unicodeslot=0xF2,
},
{
adobename="oacute",
@@ -2640,10 +2648,10 @@ characters.data={
description="LATIN SMALL LETTER O WITH ACUTE",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x006F, 0x0301 },
- uccode=0x00D3,
- unicodeslot=0x00F3,
+ shcode=0x6F,
+ specials={ "char", 0x6F, 0x301 },
+ uccode=0xD3,
+ unicodeslot=0xF3,
},
{
adobename="ocircumflex",
@@ -2652,10 +2660,10 @@ characters.data={
description="LATIN SMALL LETTER O WITH CIRCUMFLEX",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x006F, 0x0302 },
- uccode=0x00D4,
- unicodeslot=0x00F4,
+ shcode=0x6F,
+ specials={ "char", 0x6F, 0x302 },
+ uccode=0xD4,
+ unicodeslot=0xF4,
},
{
adobename="otilde",
@@ -2664,10 +2672,10 @@ characters.data={
description="LATIN SMALL LETTER O WITH TILDE",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x006F, 0x0303 },
- uccode=0x00D5,
- unicodeslot=0x00F5,
+ shcode=0x6F,
+ specials={ "char", 0x6F, 0x303 },
+ uccode=0xD5,
+ unicodeslot=0xF5,
},
{
adobename="odieresis",
@@ -2676,10 +2684,10 @@ characters.data={
description="LATIN SMALL LETTER O WITH DIAERESIS",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x006F, 0x0308 },
- uccode=0x00D6,
- unicodeslot=0x00F6,
+ shcode=0x6F,
+ specials={ "char", 0x6F, 0x308 },
+ uccode=0xD6,
+ unicodeslot=0xF6,
},
{
adobename="divide",
@@ -2691,7 +2699,7 @@ characters.data={
linebreak="ai",
mathclass="binary",
mathname="div",
- unicodeslot=0x00F7,
+ unicodeslot=0xF7,
},
{
adobename="oslash",
@@ -2701,9 +2709,9 @@ characters.data={
description="LATIN SMALL LETTER O WITH STROKE",
direction="l",
linebreak="al",
- shcode=0x006F,
- uccode=0x00D8,
- unicodeslot=0x00F8,
+ shcode=0x6F,
+ uccode=0xD8,
+ unicodeslot=0xF8,
},
{
adobename="ugrave",
@@ -2713,10 +2721,10 @@ characters.data={
description="LATIN SMALL LETTER U WITH GRAVE",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x0075, 0x0300 },
- uccode=0x00D9,
- unicodeslot=0x00F9,
+ shcode=0x75,
+ specials={ "char", 0x75, 0x300 },
+ uccode=0xD9,
+ unicodeslot=0xF9,
},
{
adobename="uacute",
@@ -2726,10 +2734,10 @@ characters.data={
description="LATIN SMALL LETTER U WITH ACUTE",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x0075, 0x0301 },
- uccode=0x00DA,
- unicodeslot=0x00FA,
+ shcode=0x75,
+ specials={ "char", 0x75, 0x301 },
+ uccode=0xDA,
+ unicodeslot=0xFA,
},
{
adobename="ucircumflex",
@@ -2738,10 +2746,10 @@ characters.data={
description="LATIN SMALL LETTER U WITH CIRCUMFLEX",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x0075, 0x0302 },
- uccode=0x00DB,
- unicodeslot=0x00FB,
+ shcode=0x75,
+ specials={ "char", 0x75, 0x302 },
+ uccode=0xDB,
+ unicodeslot=0xFB,
},
{
adobename="udieresis",
@@ -2751,10 +2759,10 @@ characters.data={
description="LATIN SMALL LETTER U WITH DIAERESIS",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x0075, 0x0308 },
- uccode=0x00DC,
- unicodeslot=0x00FC,
+ shcode=0x75,
+ specials={ "char", 0x75, 0x308 },
+ uccode=0xDC,
+ unicodeslot=0xFC,
},
{
adobename="yacute",
@@ -2763,10 +2771,10 @@ characters.data={
description="LATIN SMALL LETTER Y WITH ACUTE",
direction="l",
linebreak="al",
- shcode=0x0079,
- specials={ "char", 0x0079, 0x0301 },
- uccode=0x00DD,
- unicodeslot=0x00FD,
+ shcode=0x79,
+ specials={ "char", 0x79, 0x301 },
+ uccode=0xDD,
+ unicodeslot=0xFD,
},
{
adobename="thorn",
@@ -2776,8 +2784,8 @@ characters.data={
description="LATIN SMALL LETTER THORN",
direction="l",
linebreak="al",
- uccode=0x00DE,
- unicodeslot=0x00FE,
+ uccode=0xDE,
+ unicodeslot=0xFE,
},
{
adobename="ydieresis",
@@ -2786,10 +2794,10 @@ characters.data={
description="LATIN SMALL LETTER Y WITH DIAERESIS",
direction="l",
linebreak="al",
- shcode=0x0079,
- specials={ "char", 0x0079, 0x0308 },
- uccode=0x0178,
- unicodeslot=0x00FF,
+ shcode=0x79,
+ specials={ "char", 0x79, 0x308 },
+ uccode=0x178,
+ unicodeslot=0xFF,
},
{
adobename="Amacron",
@@ -2797,11 +2805,11 @@ characters.data={
contextname="Amacron",
description="LATIN CAPITAL LETTER A WITH MACRON",
direction="l",
- lccode=0x0101,
+ lccode=0x101,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x0041, 0x0304 },
- unicodeslot=0x0100,
+ shcode=0x41,
+ specials={ "char", 0x41, 0x304 },
+ unicodeslot=0x100,
},
{
adobename="amacron",
@@ -2811,10 +2819,10 @@ characters.data={
description="LATIN SMALL LETTER A WITH MACRON",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x0061, 0x0304 },
- uccode=0x0100,
- unicodeslot=0x0101,
+ shcode=0x61,
+ specials={ "char", 0x61, 0x304 },
+ uccode=0x100,
+ unicodeslot=0x101,
},
{
adobename="Abreve",
@@ -2822,11 +2830,11 @@ characters.data={
contextname="Abreve",
description="LATIN CAPITAL LETTER A WITH BREVE",
direction="l",
- lccode=0x0103,
+ lccode=0x103,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x0041, 0x0306 },
- unicodeslot=0x0102,
+ shcode=0x41,
+ specials={ "char", 0x41, 0x306 },
+ unicodeslot=0x102,
},
{
adobename="abreve",
@@ -2835,10 +2843,10 @@ characters.data={
description="LATIN SMALL LETTER A WITH BREVE",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x0061, 0x0306 },
- uccode=0x0102,
- unicodeslot=0x0103,
+ shcode=0x61,
+ specials={ "char", 0x61, 0x306 },
+ uccode=0x102,
+ unicodeslot=0x103,
},
{
adobename="Aogonek",
@@ -2846,11 +2854,11 @@ characters.data={
contextname="Aogonek",
description="LATIN CAPITAL LETTER A WITH OGONEK",
direction="l",
- lccode=0x0105,
+ lccode=0x105,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x0041, 0x0328 },
- unicodeslot=0x0104,
+ shcode=0x41,
+ specials={ "char", 0x41, 0x328 },
+ unicodeslot=0x104,
},
{
adobename="aogonek",
@@ -2859,10 +2867,10 @@ characters.data={
description="LATIN SMALL LETTER A WITH OGONEK",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x0061, 0x0328 },
- uccode=0x0104,
- unicodeslot=0x0105,
+ shcode=0x61,
+ specials={ "char", 0x61, 0x328 },
+ uccode=0x104,
+ unicodeslot=0x105,
},
{
adobename="Cacute",
@@ -2870,11 +2878,11 @@ characters.data={
contextname="Cacute",
description="LATIN CAPITAL LETTER C WITH ACUTE",
direction="l",
- lccode=0x0107,
+ lccode=0x107,
linebreak="al",
- shcode=0x0043,
- specials={ "char", 0x0043, 0x0301 },
- unicodeslot=0x0106,
+ shcode=0x43,
+ specials={ "char", 0x43, 0x301 },
+ unicodeslot=0x106,
},
{
adobename="cacute",
@@ -2883,10 +2891,10 @@ characters.data={
description="LATIN SMALL LETTER C WITH ACUTE",
direction="l",
linebreak="al",
- shcode=0x0063,
- specials={ "char", 0x0063, 0x0301 },
- uccode=0x0106,
- unicodeslot=0x0107,
+ shcode=0x63,
+ specials={ "char", 0x63, 0x301 },
+ uccode=0x106,
+ unicodeslot=0x107,
},
{
adobename="Ccircumflex",
@@ -2894,11 +2902,11 @@ characters.data={
contextname="Ccircumflex",
description="LATIN CAPITAL LETTER C WITH CIRCUMFLEX",
direction="l",
- lccode=0x0109,
+ lccode=0x109,
linebreak="al",
- shcode=0x0043,
- specials={ "char", 0x0043, 0x0302 },
- unicodeslot=0x0108,
+ shcode=0x43,
+ specials={ "char", 0x43, 0x302 },
+ unicodeslot=0x108,
},
{
adobename="ccircumflex",
@@ -2907,10 +2915,10 @@ characters.data={
description="LATIN SMALL LETTER C WITH CIRCUMFLEX",
direction="l",
linebreak="al",
- shcode=0x0063,
- specials={ "char", 0x0063, 0x0302 },
- uccode=0x0108,
- unicodeslot=0x0109,
+ shcode=0x63,
+ specials={ "char", 0x63, 0x302 },
+ uccode=0x108,
+ unicodeslot=0x109,
},
{
adobename="Cdotaccent",
@@ -2918,11 +2926,11 @@ characters.data={
contextname="Cdotaccent",
description="LATIN CAPITAL LETTER C WITH DOT ABOVE",
direction="l",
- lccode=0x010B,
+ lccode=0x10B,
linebreak="al",
- shcode=0x0043,
- specials={ "char", 0x0043, 0x0307 },
- unicodeslot=0x010A,
+ shcode=0x43,
+ specials={ "char", 0x43, 0x307 },
+ unicodeslot=0x10A,
},
{
adobename="cdotaccent",
@@ -2931,10 +2939,10 @@ characters.data={
description="LATIN SMALL LETTER C WITH DOT ABOVE",
direction="l",
linebreak="al",
- shcode=0x0063,
- specials={ "char", 0x0063, 0x0307 },
- uccode=0x010A,
- unicodeslot=0x010B,
+ shcode=0x63,
+ specials={ "char", 0x63, 0x307 },
+ uccode=0x10A,
+ unicodeslot=0x10B,
},
{
adobename="Ccaron",
@@ -2942,11 +2950,11 @@ characters.data={
contextname="Ccaron",
description="LATIN CAPITAL LETTER C WITH CARON",
direction="l",
- lccode=0x010D,
+ lccode=0x10D,
linebreak="al",
- shcode=0x0043,
- specials={ "char", 0x0043, 0x030C },
- unicodeslot=0x010C,
+ shcode=0x43,
+ specials={ "char", 0x43, 0x30C },
+ unicodeslot=0x10C,
},
{
adobename="ccaron",
@@ -2955,10 +2963,10 @@ characters.data={
description="LATIN SMALL LETTER C WITH CARON",
direction="l",
linebreak="al",
- shcode=0x0063,
- specials={ "char", 0x0063, 0x030C },
- uccode=0x010C,
- unicodeslot=0x010D,
+ shcode=0x63,
+ specials={ "char", 0x63, 0x30C },
+ uccode=0x10C,
+ unicodeslot=0x10D,
},
{
adobename="Dcaron",
@@ -2966,11 +2974,11 @@ characters.data={
contextname="Dcaron",
description="LATIN CAPITAL LETTER D WITH CARON",
direction="l",
- lccode=0x010F,
+ lccode=0x10F,
linebreak="al",
- shcode=0x0044,
- specials={ "char", 0x0044, 0x030C },
- unicodeslot=0x010E,
+ shcode=0x44,
+ specials={ "char", 0x44, 0x30C },
+ unicodeslot=0x10E,
},
{
adobename="dcaron",
@@ -2979,10 +2987,10 @@ characters.data={
description="LATIN SMALL LETTER D WITH CARON",
direction="l",
linebreak="al",
- shcode=0x0064,
- specials={ "char", 0x0064, 0x030C },
- uccode=0x010E,
- unicodeslot=0x010F,
+ shcode=0x64,
+ specials={ "char", 0x64, 0x30C },
+ uccode=0x10E,
+ unicodeslot=0x10F,
},
{
adobename="Dslash",
@@ -2990,10 +2998,10 @@ characters.data={
contextname="Dstroke",
description="LATIN CAPITAL LETTER D WITH STROKE",
direction="l",
- lccode=0x0111,
+ lccode=0x111,
linebreak="al",
- shcode=0x0044,
- unicodeslot=0x0110,
+ shcode=0x44,
+ unicodeslot=0x110,
},
{
adobename="dmacron",
@@ -3003,9 +3011,9 @@ characters.data={
description="LATIN SMALL LETTER D WITH STROKE",
direction="l",
linebreak="al",
- shcode=0x0064,
- uccode=0x0110,
- unicodeslot=0x0111,
+ shcode=0x64,
+ uccode=0x110,
+ unicodeslot=0x111,
},
{
adobename="Emacron",
@@ -3013,11 +3021,11 @@ characters.data={
contextname="Emacron",
description="LATIN CAPITAL LETTER E WITH MACRON",
direction="l",
- lccode=0x0113,
+ lccode=0x113,
linebreak="al",
- shcode=0x0045,
- specials={ "char", 0x0045, 0x0304 },
- unicodeslot=0x0112,
+ shcode=0x45,
+ specials={ "char", 0x45, 0x304 },
+ unicodeslot=0x112,
},
{
adobename="emacron",
@@ -3027,10 +3035,10 @@ characters.data={
description="LATIN SMALL LETTER E WITH MACRON",
direction="l",
linebreak="al",
- shcode=0x0065,
- specials={ "char", 0x0065, 0x0304 },
- uccode=0x0112,
- unicodeslot=0x0113,
+ shcode=0x65,
+ specials={ "char", 0x65, 0x304 },
+ uccode=0x112,
+ unicodeslot=0x113,
},
{
adobename="Ebreve",
@@ -3038,11 +3046,11 @@ characters.data={
contextname="Ebreve",
description="LATIN CAPITAL LETTER E WITH BREVE",
direction="l",
- lccode=0x0115,
+ lccode=0x115,
linebreak="al",
- shcode=0x0045,
- specials={ "char", 0x0045, 0x0306 },
- unicodeslot=0x0114,
+ shcode=0x45,
+ specials={ "char", 0x45, 0x306 },
+ unicodeslot=0x114,
},
{
adobename="ebreve",
@@ -3051,10 +3059,10 @@ characters.data={
description="LATIN SMALL LETTER E WITH BREVE",
direction="l",
linebreak="al",
- shcode=0x0065,
- specials={ "char", 0x0065, 0x0306 },
- uccode=0x0114,
- unicodeslot=0x0115,
+ shcode=0x65,
+ specials={ "char", 0x65, 0x306 },
+ uccode=0x114,
+ unicodeslot=0x115,
},
{
adobename="Edotaccent",
@@ -3062,11 +3070,11 @@ characters.data={
contextname="Edotaccent",
description="LATIN CAPITAL LETTER E WITH DOT ABOVE",
direction="l",
- lccode=0x0117,
+ lccode=0x117,
linebreak="al",
- shcode=0x0045,
- specials={ "char", 0x0045, 0x0307 },
- unicodeslot=0x0116,
+ shcode=0x45,
+ specials={ "char", 0x45, 0x307 },
+ unicodeslot=0x116,
},
{
adobename="edotaccent",
@@ -3075,10 +3083,10 @@ characters.data={
description="LATIN SMALL LETTER E WITH DOT ABOVE",
direction="l",
linebreak="al",
- shcode=0x0065,
- specials={ "char", 0x0065, 0x0307 },
- uccode=0x0116,
- unicodeslot=0x0117,
+ shcode=0x65,
+ specials={ "char", 0x65, 0x307 },
+ uccode=0x116,
+ unicodeslot=0x117,
},
{
adobename="Eogonek",
@@ -3086,11 +3094,11 @@ characters.data={
contextname="Eogonek",
description="LATIN CAPITAL LETTER E WITH OGONEK",
direction="l",
- lccode=0x0119,
+ lccode=0x119,
linebreak="al",
- shcode=0x0045,
- specials={ "char", 0x0045, 0x0328 },
- unicodeslot=0x0118,
+ shcode=0x45,
+ specials={ "char", 0x45, 0x328 },
+ unicodeslot=0x118,
},
{
adobename="eogonek",
@@ -3099,10 +3107,10 @@ characters.data={
description="LATIN SMALL LETTER E WITH OGONEK",
direction="l",
linebreak="al",
- shcode=0x0065,
- specials={ "char", 0x0065, 0x0328 },
- uccode=0x0118,
- unicodeslot=0x0119,
+ shcode=0x65,
+ specials={ "char", 0x65, 0x328 },
+ uccode=0x118,
+ unicodeslot=0x119,
},
{
adobename="Ecaron",
@@ -3110,11 +3118,11 @@ characters.data={
contextname="Ecaron",
description="LATIN CAPITAL LETTER E WITH CARON",
direction="l",
- lccode=0x011B,
+ lccode=0x11B,
linebreak="al",
- shcode=0x0045,
- specials={ "char", 0x0045, 0x030C },
- unicodeslot=0x011A,
+ shcode=0x45,
+ specials={ "char", 0x45, 0x30C },
+ unicodeslot=0x11A,
},
{
adobename="ecaron",
@@ -3124,10 +3132,10 @@ characters.data={
description="LATIN SMALL LETTER E WITH CARON",
direction="l",
linebreak="al",
- shcode=0x0065,
- specials={ "char", 0x0065, 0x030C },
- uccode=0x011A,
- unicodeslot=0x011B,
+ shcode=0x65,
+ specials={ "char", 0x65, 0x30C },
+ uccode=0x11A,
+ unicodeslot=0x11B,
},
{
adobename="Gcircumflex",
@@ -3135,11 +3143,11 @@ characters.data={
contextname="Gcircumflex",
description="LATIN CAPITAL LETTER G WITH CIRCUMFLEX",
direction="l",
- lccode=0x011D,
+ lccode=0x11D,
linebreak="al",
- shcode=0x0047,
- specials={ "char", 0x0047, 0x0302 },
- unicodeslot=0x011C,
+ shcode=0x47,
+ specials={ "char", 0x47, 0x302 },
+ unicodeslot=0x11C,
},
{
adobename="gcircumflex",
@@ -3148,10 +3156,10 @@ characters.data={
description="LATIN SMALL LETTER G WITH CIRCUMFLEX",
direction="l",
linebreak="al",
- shcode=0x0067,
- specials={ "char", 0x0067, 0x0302 },
- uccode=0x011C,
- unicodeslot=0x011D,
+ shcode=0x67,
+ specials={ "char", 0x67, 0x302 },
+ uccode=0x11C,
+ unicodeslot=0x11D,
},
{
adobename="Gbreve",
@@ -3159,11 +3167,11 @@ characters.data={
contextname="Gbreve",
description="LATIN CAPITAL LETTER G WITH BREVE",
direction="l",
- lccode=0x011F,
+ lccode=0x11F,
linebreak="al",
- shcode=0x0047,
- specials={ "char", 0x0047, 0x0306 },
- unicodeslot=0x011E,
+ shcode=0x47,
+ specials={ "char", 0x47, 0x306 },
+ unicodeslot=0x11E,
},
{
adobename="gbreve",
@@ -3172,10 +3180,10 @@ characters.data={
description="LATIN SMALL LETTER G WITH BREVE",
direction="l",
linebreak="al",
- shcode=0x0067,
- specials={ "char", 0x0067, 0x0306 },
- uccode=0x011E,
- unicodeslot=0x011F,
+ shcode=0x67,
+ specials={ "char", 0x67, 0x306 },
+ uccode=0x11E,
+ unicodeslot=0x11F,
},
{
adobename="Gdotaccent",
@@ -3183,11 +3191,11 @@ characters.data={
contextname="Gdotaccent",
description="LATIN CAPITAL LETTER G WITH DOT ABOVE",
direction="l",
- lccode=0x0121,
+ lccode=0x121,
linebreak="al",
- shcode=0x0047,
- specials={ "char", 0x0047, 0x0307 },
- unicodeslot=0x0120,
+ shcode=0x47,
+ specials={ "char", 0x47, 0x307 },
+ unicodeslot=0x120,
},
{
adobename="gdotaccent",
@@ -3196,10 +3204,10 @@ characters.data={
description="LATIN SMALL LETTER G WITH DOT ABOVE",
direction="l",
linebreak="al",
- shcode=0x0067,
- specials={ "char", 0x0067, 0x0307 },
- uccode=0x0120,
- unicodeslot=0x0121,
+ shcode=0x67,
+ specials={ "char", 0x67, 0x307 },
+ uccode=0x120,
+ unicodeslot=0x121,
},
{
adobename="Gcommaaccent",
@@ -3207,11 +3215,11 @@ characters.data={
contextname="Gcommaaccent",
description="LATIN CAPITAL LETTER G WITH CEDILLA",
direction="l",
- lccode=0x0123,
+ lccode=0x123,
linebreak="al",
- shcode=0x0047,
- specials={ "char", 0x0047, 0x0327 },
- unicodeslot=0x0122,
+ shcode=0x47,
+ specials={ "char", 0x47, 0x327 },
+ unicodeslot=0x122,
},
{
adobename="gcommaaccent",
@@ -3220,10 +3228,10 @@ characters.data={
description="LATIN SMALL LETTER G WITH CEDILLA",
direction="l",
linebreak="al",
- shcode=0x0067,
- specials={ "char", 0x0067, 0x0327 },
- uccode=0x0122,
- unicodeslot=0x0123,
+ shcode=0x67,
+ specials={ "char", 0x67, 0x327 },
+ uccode=0x122,
+ unicodeslot=0x123,
},
{
adobename="Hcircumflex",
@@ -3231,11 +3239,11 @@ characters.data={
contextname="Hcircumflex",
description="LATIN CAPITAL LETTER H WITH CIRCUMFLEX",
direction="l",
- lccode=0x0125,
+ lccode=0x125,
linebreak="al",
- shcode=0x0048,
- specials={ "char", 0x0048, 0x0302 },
- unicodeslot=0x0124,
+ shcode=0x48,
+ specials={ "char", 0x48, 0x302 },
+ unicodeslot=0x124,
},
{
adobename="hcircumflex",
@@ -3244,10 +3252,10 @@ characters.data={
description="LATIN SMALL LETTER H WITH CIRCUMFLEX",
direction="l",
linebreak="al",
- shcode=0x0068,
- specials={ "char", 0x0068, 0x0302 },
- uccode=0x0124,
- unicodeslot=0x0125,
+ shcode=0x68,
+ specials={ "char", 0x68, 0x302 },
+ uccode=0x124,
+ unicodeslot=0x125,
},
{
adobename="Hbar",
@@ -3256,10 +3264,10 @@ characters.data={
contextname="Hstroke",
description="LATIN CAPITAL LETTER H WITH STROKE",
direction="l",
- lccode=0x0127,
+ lccode=0x127,
linebreak="al",
- shcode=0x0048,
- unicodeslot=0x0126,
+ shcode=0x48,
+ unicodeslot=0x126,
},
{
adobename="hbar",
@@ -3269,9 +3277,9 @@ characters.data={
description="LATIN SMALL LETTER H WITH STROKE",
direction="l",
linebreak="al",
- shcode=0x0068,
- uccode=0x0126,
- unicodeslot=0x0127,
+ shcode=0x68,
+ uccode=0x126,
+ unicodeslot=0x127,
},
{
adobename="Itilde",
@@ -3279,11 +3287,11 @@ characters.data={
contextname="Itilde",
description="LATIN CAPITAL LETTER I WITH TILDE",
direction="l",
- lccode=0x0129,
+ lccode=0x129,
linebreak="al",
- shcode=0x0049,
- specials={ "char", 0x0049, 0x0303 },
- unicodeslot=0x0128,
+ shcode=0x49,
+ specials={ "char", 0x49, 0x303 },
+ unicodeslot=0x128,
},
{
adobename="itilde",
@@ -3292,10 +3300,10 @@ characters.data={
description="LATIN SMALL LETTER I WITH TILDE",
direction="l",
linebreak="al",
- shcode=0x0069,
- specials={ "char", 0x0069, 0x0303 },
- uccode=0x0128,
- unicodeslot=0x0129,
+ shcode=0x69,
+ specials={ "char", 0x69, 0x303 },
+ uccode=0x128,
+ unicodeslot=0x129,
},
{
adobename="Imacron",
@@ -3303,11 +3311,11 @@ characters.data={
contextname="Imacron",
description="LATIN CAPITAL LETTER I WITH MACRON",
direction="l",
- lccode=0x012B,
+ lccode=0x12B,
linebreak="al",
- shcode=0x0049,
- specials={ "char", 0x0049, 0x0304 },
- unicodeslot=0x012A,
+ shcode=0x49,
+ specials={ "char", 0x49, 0x304 },
+ unicodeslot=0x12A,
},
{
adobename="imacron",
@@ -3317,10 +3325,10 @@ characters.data={
description="LATIN SMALL LETTER I WITH MACRON",
direction="l",
linebreak="al",
- shcode=0x0069,
- specials={ "char", 0x0069, 0x0304 },
- uccode=0x012A,
- unicodeslot=0x012B,
+ shcode=0x69,
+ specials={ "char", 0x69, 0x304 },
+ uccode=0x12A,
+ unicodeslot=0x12B,
},
{
adobename="Ibreve",
@@ -3328,11 +3336,11 @@ characters.data={
contextname="Ibreve",
description="LATIN CAPITAL LETTER I WITH BREVE",
direction="l",
- lccode=0x012D,
+ lccode=0x12D,
linebreak="al",
- shcode=0x0049,
- specials={ "char", 0x0049, 0x0306 },
- unicodeslot=0x012C,
+ shcode=0x49,
+ specials={ "char", 0x49, 0x306 },
+ unicodeslot=0x12C,
},
{
adobename="ibreve",
@@ -3341,10 +3349,10 @@ characters.data={
description="LATIN SMALL LETTER I WITH BREVE",
direction="l",
linebreak="al",
- shcode=0x0069,
- specials={ "char", 0x0069, 0x0306 },
- uccode=0x012C,
- unicodeslot=0x012D,
+ shcode=0x69,
+ specials={ "char", 0x69, 0x306 },
+ uccode=0x12C,
+ unicodeslot=0x12D,
},
{
adobename="Iogonek",
@@ -3352,11 +3360,11 @@ characters.data={
contextname="Iogonek",
description="LATIN CAPITAL LETTER I WITH OGONEK",
direction="l",
- lccode=0x012F,
+ lccode=0x12F,
linebreak="al",
- shcode=0x0049,
- specials={ "char", 0x0049, 0x0328 },
- unicodeslot=0x012E,
+ shcode=0x49,
+ specials={ "char", 0x49, 0x328 },
+ unicodeslot=0x12E,
},
{
adobename="iogonek",
@@ -3365,10 +3373,10 @@ characters.data={
description="LATIN SMALL LETTER I WITH OGONEK",
direction="l",
linebreak="al",
- shcode=0x0069,
- specials={ "char", 0x0069, 0x0328 },
- uccode=0x012E,
- unicodeslot=0x012F,
+ shcode=0x69,
+ specials={ "char", 0x69, 0x328 },
+ uccode=0x12E,
+ unicodeslot=0x12F,
},
{
adobename="Idotaccent",
@@ -3376,11 +3384,11 @@ characters.data={
contextname="Idotaccent",
description="LATIN CAPITAL LETTER I WITH DOT ABOVE",
direction="l",
- lccode=0x0069,
+ lccode=0x69,
linebreak="al",
- shcode=0x0049,
- specials={ "char", 0x0049, 0x0307 },
- unicodeslot=0x0130,
+ shcode=0x49,
+ specials={ "char", 0x49, 0x307 },
+ unicodeslot=0x130,
},
{
adobename="dotlessi",
@@ -3390,8 +3398,8 @@ characters.data={
description="LATIN SMALL LETTER DOTLESS I",
direction="l",
linebreak="al",
- uccode=0x0049,
- unicodeslot=0x0131,
+ uccode=0x49,
+ unicodeslot=0x131,
},
{
adobename="IJ",
@@ -3400,11 +3408,11 @@ characters.data={
contextname="IJligature",
description="LATIN CAPITAL LIGATURE IJ",
direction="l",
- lccode=0x0133,
+ lccode=0x133,
linebreak="al",
- shcode={ 0x0049, 0x004A },
- specials={ "compat", 0x0049, 0x004A },
- unicodeslot=0x0132,
+ shcode={ 0x49, 0x4A },
+ specials={ "compat", 0x49, 0x4A },
+ unicodeslot=0x132,
},
{
adobename="ij",
@@ -3414,10 +3422,10 @@ characters.data={
description="LATIN SMALL LIGATURE IJ",
direction="l",
linebreak="al",
- shcode={ 0x0069, 0x006A },
- specials={ "compat", 0x0069, 0x006A },
- uccode=0x0132,
- unicodeslot=0x0133,
+ shcode={ 0x69, 0x6A },
+ specials={ "compat", 0x69, 0x6A },
+ uccode=0x132,
+ unicodeslot=0x133,
},
{
adobename="Jcircumflex",
@@ -3425,11 +3433,11 @@ characters.data={
contextname="Jcircumflex",
description="LATIN CAPITAL LETTER J WITH CIRCUMFLEX",
direction="l",
- lccode=0x0135,
+ lccode=0x135,
linebreak="al",
- shcode=0x004A,
- specials={ "char", 0x004A, 0x0302 },
- unicodeslot=0x0134,
+ shcode=0x4A,
+ specials={ "char", 0x4A, 0x302 },
+ unicodeslot=0x134,
},
{
adobename="jcircumflex",
@@ -3438,10 +3446,10 @@ characters.data={
description="LATIN SMALL LETTER J WITH CIRCUMFLEX",
direction="l",
linebreak="al",
- shcode=0x006A,
- specials={ "char", 0x006A, 0x0302 },
- uccode=0x0134,
- unicodeslot=0x0135,
+ shcode=0x6A,
+ specials={ "char", 0x6A, 0x302 },
+ uccode=0x134,
+ unicodeslot=0x135,
},
{
adobename="Kcommaaccent",
@@ -3449,11 +3457,11 @@ characters.data={
contextname="Kcommaaccent",
description="LATIN CAPITAL LETTER K WITH CEDILLA",
direction="l",
- lccode=0x0137,
+ lccode=0x137,
linebreak="al",
- shcode=0x004B,
- specials={ "char", 0x004B, 0x0327 },
- unicodeslot=0x0136,
+ shcode=0x4B,
+ specials={ "char", 0x4B, 0x327 },
+ unicodeslot=0x136,
},
{
adobename="kcommaaccent",
@@ -3462,10 +3470,10 @@ characters.data={
description="LATIN SMALL LETTER K WITH CEDILLA",
direction="l",
linebreak="al",
- shcode=0x006B,
- specials={ "char", 0x006B, 0x0327 },
- uccode=0x0136,
- unicodeslot=0x0137,
+ shcode=0x6B,
+ specials={ "char", 0x6B, 0x327 },
+ uccode=0x136,
+ unicodeslot=0x137,
},
{
adobename="kgreenlandic",
@@ -3475,7 +3483,7 @@ characters.data={
description="LATIN SMALL LETTER KRA",
direction="l",
linebreak="al",
- unicodeslot=0x0138,
+ unicodeslot=0x138,
},
{
adobename="Lacute",
@@ -3483,11 +3491,11 @@ characters.data={
contextname="Lacute",
description="LATIN CAPITAL LETTER L WITH ACUTE",
direction="l",
- lccode=0x013A,
+ lccode=0x13A,
linebreak="al",
- shcode=0x004C,
- specials={ "char", 0x004C, 0x0301 },
- unicodeslot=0x0139,
+ shcode=0x4C,
+ specials={ "char", 0x4C, 0x301 },
+ unicodeslot=0x139,
},
{
adobename="lacute",
@@ -3496,10 +3504,10 @@ characters.data={
description="LATIN SMALL LETTER L WITH ACUTE",
direction="l",
linebreak="al",
- shcode=0x006C,
- specials={ "char", 0x006C, 0x0301 },
- uccode=0x0139,
- unicodeslot=0x013A,
+ shcode=0x6C,
+ specials={ "char", 0x6C, 0x301 },
+ uccode=0x139,
+ unicodeslot=0x13A,
},
{
adobename="Lcommaaccent",
@@ -3507,11 +3515,11 @@ characters.data={
contextname="Lcommaaccent",
description="LATIN CAPITAL LETTER L WITH CEDILLA",
direction="l",
- lccode=0x013C,
+ lccode=0x13C,
linebreak="al",
- shcode=0x004C,
- specials={ "char", 0x004C, 0x0327 },
- unicodeslot=0x013B,
+ shcode=0x4C,
+ specials={ "char", 0x4C, 0x327 },
+ unicodeslot=0x13B,
},
{
adobename="lcommaaccent",
@@ -3520,10 +3528,10 @@ characters.data={
description="LATIN SMALL LETTER L WITH CEDILLA",
direction="l",
linebreak="al",
- shcode=0x006C,
- specials={ "char", 0x006C, 0x0327 },
- uccode=0x013B,
- unicodeslot=0x013C,
+ shcode=0x6C,
+ specials={ "char", 0x6C, 0x327 },
+ uccode=0x13B,
+ unicodeslot=0x13C,
},
{
adobename="Lcaron",
@@ -3531,11 +3539,11 @@ characters.data={
contextname="Lcaron",
description="LATIN CAPITAL LETTER L WITH CARON",
direction="l",
- lccode=0x013E,
+ lccode=0x13E,
linebreak="al",
- shcode=0x004C,
- specials={ "char", 0x004C, 0x030C },
- unicodeslot=0x013D,
+ shcode=0x4C,
+ specials={ "char", 0x4C, 0x30C },
+ unicodeslot=0x13D,
},
{
adobename="lcaron",
@@ -3544,10 +3552,10 @@ characters.data={
description="LATIN SMALL LETTER L WITH CARON",
direction="l",
linebreak="al",
- shcode=0x006C,
- specials={ "char", 0x006C, 0x030C },
- uccode=0x013D,
- unicodeslot=0x013E,
+ shcode=0x6C,
+ specials={ "char", 0x6C, 0x30C },
+ uccode=0x13D,
+ unicodeslot=0x13E,
},
{
adobename="Ldotaccent",
@@ -3556,11 +3564,11 @@ characters.data={
contextname="Ldotmiddle",
description="LATIN CAPITAL LETTER L WITH MIDDLE DOT",
direction="l",
- lccode=0x0140,
+ lccode=0x140,
linebreak="al",
- shcode=0x004C,
- specials={ "compat", 0x004C, 0x00B7 },
- unicodeslot=0x013F,
+ shcode=0x4C,
+ specials={ "compat", 0x4C, 0xB7 },
+ unicodeslot=0x13F,
},
{
adobename="ldotaccent",
@@ -3570,10 +3578,10 @@ characters.data={
description="LATIN SMALL LETTER L WITH MIDDLE DOT",
direction="l",
linebreak="al",
- shcode=0x006C,
- specials={ "compat", 0x006C, 0x00B7 },
- uccode=0x013F,
- unicodeslot=0x0140,
+ shcode=0x6C,
+ specials={ "compat", 0x6C, 0xB7 },
+ uccode=0x13F,
+ unicodeslot=0x140,
},
{
adobename="Lslash",
@@ -3582,10 +3590,10 @@ characters.data={
contextname="Lstroke",
description="LATIN CAPITAL LETTER L WITH STROKE",
direction="l",
- lccode=0x0142,
+ lccode=0x142,
linebreak="al",
- shcode=0x004C,
- unicodeslot=0x0141,
+ shcode=0x4C,
+ unicodeslot=0x141,
},
{
adobename="lslash",
@@ -3595,9 +3603,9 @@ characters.data={
description="LATIN SMALL LETTER L WITH STROKE",
direction="l",
linebreak="al",
- shcode=0x006C,
- uccode=0x0141,
- unicodeslot=0x0142,
+ shcode=0x6C,
+ uccode=0x141,
+ unicodeslot=0x142,
},
{
adobename="Nacute",
@@ -3605,11 +3613,11 @@ characters.data={
contextname="Nacute",
description="LATIN CAPITAL LETTER N WITH ACUTE",
direction="l",
- lccode=0x0144,
+ lccode=0x144,
linebreak="al",
- shcode=0x004E,
- specials={ "char", 0x004E, 0x0301 },
- unicodeslot=0x0143,
+ shcode=0x4E,
+ specials={ "char", 0x4E, 0x301 },
+ unicodeslot=0x143,
},
{
adobename="nacute",
@@ -3619,10 +3627,10 @@ characters.data={
description="LATIN SMALL LETTER N WITH ACUTE",
direction="l",
linebreak="al",
- shcode=0x006E,
- specials={ "char", 0x006E, 0x0301 },
- uccode=0x0143,
- unicodeslot=0x0144,
+ shcode=0x6E,
+ specials={ "char", 0x6E, 0x301 },
+ uccode=0x143,
+ unicodeslot=0x144,
},
{
adobename="Ncommaaccent",
@@ -3630,11 +3638,11 @@ characters.data={
contextname="Ncommaaccent",
description="LATIN CAPITAL LETTER N WITH CEDILLA",
direction="l",
- lccode=0x0146,
+ lccode=0x146,
linebreak="al",
- shcode=0x004E,
- specials={ "char", 0x004E, 0x0327 },
- unicodeslot=0x0145,
+ shcode=0x4E,
+ specials={ "char", 0x4E, 0x327 },
+ unicodeslot=0x145,
},
{
adobename="ncommaaccent",
@@ -3643,10 +3651,10 @@ characters.data={
description="LATIN SMALL LETTER N WITH CEDILLA",
direction="l",
linebreak="al",
- shcode=0x006E,
- specials={ "char", 0x006E, 0x0327 },
- uccode=0x0145,
- unicodeslot=0x0146,
+ shcode=0x6E,
+ specials={ "char", 0x6E, 0x327 },
+ uccode=0x145,
+ unicodeslot=0x146,
},
{
adobename="Ncaron",
@@ -3654,11 +3662,11 @@ characters.data={
contextname="Ncaron",
description="LATIN CAPITAL LETTER N WITH CARON",
direction="l",
- lccode=0x0148,
+ lccode=0x148,
linebreak="al",
- shcode=0x004E,
- specials={ "char", 0x004E, 0x030C },
- unicodeslot=0x0147,
+ shcode=0x4E,
+ specials={ "char", 0x4E, 0x30C },
+ unicodeslot=0x147,
},
{
adobename="ncaron",
@@ -3668,10 +3676,10 @@ characters.data={
description="LATIN SMALL LETTER N WITH CARON",
direction="l",
linebreak="al",
- shcode=0x006E,
- specials={ "char", 0x006E, 0x030C },
- uccode=0x0147,
- unicodeslot=0x0148,
+ shcode=0x6E,
+ specials={ "char", 0x6E, 0x30C },
+ uccode=0x147,
+ unicodeslot=0x148,
},
{
adobename="quoterightn",
@@ -3681,8 +3689,8 @@ characters.data={
description="LATIN SMALL LETTER N PRECEDED BY APOSTROPHE",
direction="l",
linebreak="al",
- specials={ "compat", 0x02BC, 0x006E },
- unicodeslot=0x0149,
+ specials={ "compat", 0x2BC, 0x6E },
+ unicodeslot=0x149,
},
{
adobename="Eng",
@@ -3691,9 +3699,9 @@ characters.data={
contextname="Neng",
description="LATIN CAPITAL LETTER ENG",
direction="l",
- lccode=0x014B,
+ lccode=0x14B,
linebreak="al",
- unicodeslot=0x014A,
+ unicodeslot=0x14A,
},
{
adobename="eng",
@@ -3703,8 +3711,8 @@ characters.data={
description="LATIN SMALL LETTER ENG",
direction="l",
linebreak="al",
- uccode=0x014A,
- unicodeslot=0x014B,
+ uccode=0x14A,
+ unicodeslot=0x14B,
},
{
adobename="Omacron",
@@ -3712,11 +3720,11 @@ characters.data={
contextname="Omacron",
description="LATIN CAPITAL LETTER O WITH MACRON",
direction="l",
- lccode=0x014D,
+ lccode=0x14D,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x004F, 0x0304 },
- unicodeslot=0x014C,
+ shcode=0x4F,
+ specials={ "char", 0x4F, 0x304 },
+ unicodeslot=0x14C,
},
{
adobename="omacron",
@@ -3726,10 +3734,10 @@ characters.data={
description="LATIN SMALL LETTER O WITH MACRON",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x006F, 0x0304 },
- uccode=0x014C,
- unicodeslot=0x014D,
+ shcode=0x6F,
+ specials={ "char", 0x6F, 0x304 },
+ uccode=0x14C,
+ unicodeslot=0x14D,
},
{
adobename="Obreve",
@@ -3737,11 +3745,11 @@ characters.data={
contextname="Obreve",
description="LATIN CAPITAL LETTER O WITH BREVE",
direction="l",
- lccode=0x014F,
+ lccode=0x14F,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x004F, 0x0306 },
- unicodeslot=0x014E,
+ shcode=0x4F,
+ specials={ "char", 0x4F, 0x306 },
+ unicodeslot=0x14E,
},
{
adobename="obreve",
@@ -3750,10 +3758,10 @@ characters.data={
description="LATIN SMALL LETTER O WITH BREVE",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x006F, 0x0306 },
- uccode=0x014E,
- unicodeslot=0x014F,
+ shcode=0x6F,
+ specials={ "char", 0x6F, 0x306 },
+ uccode=0x14E,
+ unicodeslot=0x14F,
},
{
adobename="Ohungarumlaut",
@@ -3761,11 +3769,11 @@ characters.data={
contextname="Ohungarumlaut",
description="LATIN CAPITAL LETTER O WITH DOUBLE ACUTE",
direction="l",
- lccode=0x0151,
+ lccode=0x151,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x004F, 0x030B },
- unicodeslot=0x0150,
+ shcode=0x4F,
+ specials={ "char", 0x4F, 0x30B },
+ unicodeslot=0x150,
},
{
adobename="ohungarumlaut",
@@ -3774,10 +3782,10 @@ characters.data={
description="LATIN SMALL LETTER O WITH DOUBLE ACUTE",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x006F, 0x030B },
- uccode=0x0150,
- unicodeslot=0x0151,
+ shcode=0x6F,
+ specials={ "char", 0x6F, 0x30B },
+ uccode=0x150,
+ unicodeslot=0x151,
},
{
adobename="OE",
@@ -3786,10 +3794,10 @@ characters.data={
contextname="OEligature",
description="LATIN CAPITAL LIGATURE OE",
direction="l",
- lccode=0x0153,
+ lccode=0x153,
linebreak="al",
- shcode={ 0x004F, 0x0045 },
- unicodeslot=0x0152,
+ shcode={ 0x4F, 0x45 },
+ unicodeslot=0x152,
},
{
adobename="oe",
@@ -3799,9 +3807,9 @@ characters.data={
description="LATIN SMALL LIGATURE OE",
direction="l",
linebreak="al",
- shcode={ 0x006F, 0x0065 },
- uccode=0x0152,
- unicodeslot=0x0153,
+ shcode={ 0x6F, 0x65 },
+ uccode=0x152,
+ unicodeslot=0x153,
},
{
adobename="Racute",
@@ -3809,11 +3817,11 @@ characters.data={
contextname="Racute",
description="LATIN CAPITAL LETTER R WITH ACUTE",
direction="l",
- lccode=0x0155,
+ lccode=0x155,
linebreak="al",
- shcode=0x0052,
- specials={ "char", 0x0052, 0x0301 },
- unicodeslot=0x0154,
+ shcode=0x52,
+ specials={ "char", 0x52, 0x301 },
+ unicodeslot=0x154,
},
{
adobename="racute",
@@ -3822,10 +3830,10 @@ characters.data={
description="LATIN SMALL LETTER R WITH ACUTE",
direction="l",
linebreak="al",
- shcode=0x0072,
- specials={ "char", 0x0072, 0x0301 },
- uccode=0x0154,
- unicodeslot=0x0155,
+ shcode=0x72,
+ specials={ "char", 0x72, 0x301 },
+ uccode=0x154,
+ unicodeslot=0x155,
},
{
adobename="Rcommaaccent",
@@ -3833,11 +3841,11 @@ characters.data={
contextname="Rcommaaccent",
description="LATIN CAPITAL LETTER R WITH CEDILLA",
direction="l",
- lccode=0x0157,
+ lccode=0x157,
linebreak="al",
- shcode=0x0052,
- specials={ "char", 0x0052, 0x0327 },
- unicodeslot=0x0156,
+ shcode=0x52,
+ specials={ "char", 0x52, 0x327 },
+ unicodeslot=0x156,
},
{
adobename="rcommaaccent",
@@ -3846,10 +3854,10 @@ characters.data={
description="LATIN SMALL LETTER R WITH CEDILLA",
direction="l",
linebreak="al",
- shcode=0x0072,
- specials={ "char", 0x0072, 0x0327 },
- uccode=0x0156,
- unicodeslot=0x0157,
+ shcode=0x72,
+ specials={ "char", 0x72, 0x327 },
+ uccode=0x156,
+ unicodeslot=0x157,
},
{
adobename="Rcaron",
@@ -3857,11 +3865,11 @@ characters.data={
contextname="Rcaron",
description="LATIN CAPITAL LETTER R WITH CARON",
direction="l",
- lccode=0x0159,
+ lccode=0x159,
linebreak="al",
- shcode=0x0052,
- specials={ "char", 0x0052, 0x030C },
- unicodeslot=0x0158,
+ shcode=0x52,
+ specials={ "char", 0x52, 0x30C },
+ unicodeslot=0x158,
},
{
adobename="rcaron",
@@ -3870,10 +3878,10 @@ characters.data={
description="LATIN SMALL LETTER R WITH CARON",
direction="l",
linebreak="al",
- shcode=0x0072,
- specials={ "char", 0x0072, 0x030C },
- uccode=0x0158,
- unicodeslot=0x0159,
+ shcode=0x72,
+ specials={ "char", 0x72, 0x30C },
+ uccode=0x158,
+ unicodeslot=0x159,
},
{
adobename="Sacute",
@@ -3881,11 +3889,11 @@ characters.data={
contextname="Sacute",
description="LATIN CAPITAL LETTER S WITH ACUTE",
direction="l",
- lccode=0x015B,
+ lccode=0x15B,
linebreak="al",
- shcode=0x0053,
- specials={ "char", 0x0053, 0x0301 },
- unicodeslot=0x015A,
+ shcode=0x53,
+ specials={ "char", 0x53, 0x301 },
+ unicodeslot=0x15A,
},
{
adobename="sacute",
@@ -3894,10 +3902,10 @@ characters.data={
description="LATIN SMALL LETTER S WITH ACUTE",
direction="l",
linebreak="al",
- shcode=0x0073,
- specials={ "char", 0x0073, 0x0301 },
- uccode=0x015A,
- unicodeslot=0x015B,
+ shcode=0x73,
+ specials={ "char", 0x73, 0x301 },
+ uccode=0x15A,
+ unicodeslot=0x15B,
},
{
adobename="Scircumflex",
@@ -3905,11 +3913,11 @@ characters.data={
contextname="Scircumflex",
description="LATIN CAPITAL LETTER S WITH CIRCUMFLEX",
direction="l",
- lccode=0x015D,
+ lccode=0x15D,
linebreak="al",
- shcode=0x0053,
- specials={ "char", 0x0053, 0x0302 },
- unicodeslot=0x015C,
+ shcode=0x53,
+ specials={ "char", 0x53, 0x302 },
+ unicodeslot=0x15C,
},
{
adobename="scircumflex",
@@ -3918,10 +3926,10 @@ characters.data={
description="LATIN SMALL LETTER S WITH CIRCUMFLEX",
direction="l",
linebreak="al",
- shcode=0x0073,
- specials={ "char", 0x0073, 0x0302 },
- uccode=0x015C,
- unicodeslot=0x015D,
+ shcode=0x73,
+ specials={ "char", 0x73, 0x302 },
+ uccode=0x15C,
+ unicodeslot=0x15D,
},
{
adobename="Scedilla",
@@ -3929,11 +3937,11 @@ characters.data={
contextname="Scedilla",
description="LATIN CAPITAL LETTER S WITH CEDILLA",
direction="l",
- lccode=0x015F,
+ lccode=0x15F,
linebreak="al",
- shcode=0x0053,
- specials={ "char", 0x0053, 0x0327 },
- unicodeslot=0x015E,
+ shcode=0x53,
+ specials={ "char", 0x53, 0x327 },
+ unicodeslot=0x15E,
},
{
adobename="scedilla",
@@ -3942,10 +3950,10 @@ characters.data={
description="LATIN SMALL LETTER S WITH CEDILLA",
direction="l",
linebreak="al",
- shcode=0x0073,
- specials={ "char", 0x0073, 0x0327 },
- uccode=0x015E,
- unicodeslot=0x015F,
+ shcode=0x73,
+ specials={ "char", 0x73, 0x327 },
+ uccode=0x15E,
+ unicodeslot=0x15F,
},
{
adobename="Scaron",
@@ -3953,11 +3961,11 @@ characters.data={
contextname="Scaron",
description="LATIN CAPITAL LETTER S WITH CARON",
direction="l",
- lccode=0x0161,
+ lccode=0x161,
linebreak="al",
- shcode=0x0053,
- specials={ "char", 0x0053, 0x030C },
- unicodeslot=0x0160,
+ shcode=0x53,
+ specials={ "char", 0x53, 0x30C },
+ unicodeslot=0x160,
},
{
adobename="scaron",
@@ -3966,10 +3974,10 @@ characters.data={
description="LATIN SMALL LETTER S WITH CARON",
direction="l",
linebreak="al",
- shcode=0x0073,
- specials={ "char", 0x0073, 0x030C },
- uccode=0x0160,
- unicodeslot=0x0161,
+ shcode=0x73,
+ specials={ "char", 0x73, 0x30C },
+ uccode=0x160,
+ unicodeslot=0x161,
},
{
adobename="Tcommaaccent",
@@ -3977,11 +3985,11 @@ characters.data={
contextname="Tcedilla",
description="LATIN CAPITAL LETTER T WITH CEDILLA",
direction="l",
- lccode=0x0163,
+ lccode=0x163,
linebreak="al",
- shcode=0x0054,
- specials={ "char", 0x0054, 0x0327 },
- unicodeslot=0x0162,
+ shcode=0x54,
+ specials={ "char", 0x54, 0x327 },
+ unicodeslot=0x162,
},
{
adobename="tcommaaccent",
@@ -3990,10 +3998,10 @@ characters.data={
description="LATIN SMALL LETTER T WITH CEDILLA",
direction="l",
linebreak="al",
- shcode=0x0074,
- specials={ "char", 0x0074, 0x0327 },
- uccode=0x0162,
- unicodeslot=0x0163,
+ shcode=0x74,
+ specials={ "char", 0x74, 0x327 },
+ uccode=0x162,
+ unicodeslot=0x163,
},
{
adobename="Tcaron",
@@ -4001,11 +4009,11 @@ characters.data={
contextname="Tcaron",
description="LATIN CAPITAL LETTER T WITH CARON",
direction="l",
- lccode=0x0165,
+ lccode=0x165,
linebreak="al",
- shcode=0x0054,
- specials={ "char", 0x0054, 0x030C },
- unicodeslot=0x0164,
+ shcode=0x54,
+ specials={ "char", 0x54, 0x30C },
+ unicodeslot=0x164,
},
{
adobename="tcaron",
@@ -4014,10 +4022,10 @@ characters.data={
description="LATIN SMALL LETTER T WITH CARON",
direction="l",
linebreak="al",
- shcode=0x0074,
- specials={ "char", 0x0074, 0x030C },
- uccode=0x0164,
- unicodeslot=0x0165,
+ shcode=0x74,
+ specials={ "char", 0x74, 0x30C },
+ uccode=0x164,
+ unicodeslot=0x165,
},
{
adobename="Tbar",
@@ -4026,10 +4034,10 @@ characters.data={
contextname="Tstroke",
description="LATIN CAPITAL LETTER T WITH STROKE",
direction="l",
- lccode=0x0167,
+ lccode=0x167,
linebreak="al",
- shcode=0x0054,
- unicodeslot=0x0166,
+ shcode=0x54,
+ unicodeslot=0x166,
},
{
adobename="tbar",
@@ -4039,9 +4047,9 @@ characters.data={
description="LATIN SMALL LETTER T WITH STROKE",
direction="l",
linebreak="al",
- shcode=0x0074,
- uccode=0x0166,
- unicodeslot=0x0167,
+ shcode=0x74,
+ uccode=0x166,
+ unicodeslot=0x167,
},
{
adobename="Utilde",
@@ -4049,11 +4057,11 @@ characters.data={
contextname="Utilde",
description="LATIN CAPITAL LETTER U WITH TILDE",
direction="l",
- lccode=0x0169,
+ lccode=0x169,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x0055, 0x0303 },
- unicodeslot=0x0168,
+ shcode=0x55,
+ specials={ "char", 0x55, 0x303 },
+ unicodeslot=0x168,
},
{
adobename="utilde",
@@ -4062,10 +4070,10 @@ characters.data={
description="LATIN SMALL LETTER U WITH TILDE",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x0075, 0x0303 },
- uccode=0x0168,
- unicodeslot=0x0169,
+ shcode=0x75,
+ specials={ "char", 0x75, 0x303 },
+ uccode=0x168,
+ unicodeslot=0x169,
},
{
adobename="Umacron",
@@ -4073,11 +4081,11 @@ characters.data={
contextname="Umacron",
description="LATIN CAPITAL LETTER U WITH MACRON",
direction="l",
- lccode=0x016B,
+ lccode=0x16B,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x0055, 0x0304 },
- unicodeslot=0x016A,
+ shcode=0x55,
+ specials={ "char", 0x55, 0x304 },
+ unicodeslot=0x16A,
},
{
adobename="umacron",
@@ -4087,10 +4095,10 @@ characters.data={
description="LATIN SMALL LETTER U WITH MACRON",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x0075, 0x0304 },
- uccode=0x016A,
- unicodeslot=0x016B,
+ shcode=0x75,
+ specials={ "char", 0x75, 0x304 },
+ uccode=0x16A,
+ unicodeslot=0x16B,
},
{
adobename="Ubreve",
@@ -4098,11 +4106,11 @@ characters.data={
contextname="Ubreve",
description="LATIN CAPITAL LETTER U WITH BREVE",
direction="l",
- lccode=0x016D,
+ lccode=0x16D,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x0055, 0x0306 },
- unicodeslot=0x016C,
+ shcode=0x55,
+ specials={ "char", 0x55, 0x306 },
+ unicodeslot=0x16C,
},
{
adobename="ubreve",
@@ -4111,10 +4119,10 @@ characters.data={
description="LATIN SMALL LETTER U WITH BREVE",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x0075, 0x0306 },
- uccode=0x016C,
- unicodeslot=0x016D,
+ shcode=0x75,
+ specials={ "char", 0x75, 0x306 },
+ uccode=0x16C,
+ unicodeslot=0x16D,
},
{
adobename="Uring",
@@ -4122,11 +4130,11 @@ characters.data={
contextname="Uring",
description="LATIN CAPITAL LETTER U WITH RING ABOVE",
direction="l",
- lccode=0x016F,
+ lccode=0x16F,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x0055, 0x030A },
- unicodeslot=0x016E,
+ shcode=0x55,
+ specials={ "char", 0x55, 0x30A },
+ unicodeslot=0x16E,
},
{
adobename="uring",
@@ -4135,10 +4143,10 @@ characters.data={
description="LATIN SMALL LETTER U WITH RING ABOVE",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x0075, 0x030A },
- uccode=0x016E,
- unicodeslot=0x016F,
+ shcode=0x75,
+ specials={ "char", 0x75, 0x30A },
+ uccode=0x16E,
+ unicodeslot=0x16F,
},
{
adobename="Uhungarumlaut",
@@ -4146,11 +4154,11 @@ characters.data={
contextname="Uhungarumlaut",
description="LATIN CAPITAL LETTER U WITH DOUBLE ACUTE",
direction="l",
- lccode=0x0171,
+ lccode=0x171,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x0055, 0x030B },
- unicodeslot=0x0170,
+ shcode=0x55,
+ specials={ "char", 0x55, 0x30B },
+ unicodeslot=0x170,
},
{
adobename="uhungarumlaut",
@@ -4159,10 +4167,10 @@ characters.data={
description="LATIN SMALL LETTER U WITH DOUBLE ACUTE",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x0075, 0x030B },
- uccode=0x0170,
- unicodeslot=0x0171,
+ shcode=0x75,
+ specials={ "char", 0x75, 0x30B },
+ uccode=0x170,
+ unicodeslot=0x171,
},
{
adobename="Uogonek",
@@ -4170,11 +4178,11 @@ characters.data={
contextname="Uogonek",
description="LATIN CAPITAL LETTER U WITH OGONEK",
direction="l",
- lccode=0x0173,
+ lccode=0x173,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x0055, 0x0328 },
- unicodeslot=0x0172,
+ shcode=0x55,
+ specials={ "char", 0x55, 0x328 },
+ unicodeslot=0x172,
},
{
adobename="uogonek",
@@ -4183,10 +4191,10 @@ characters.data={
description="LATIN SMALL LETTER U WITH OGONEK",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x0075, 0x0328 },
- uccode=0x0172,
- unicodeslot=0x0173,
+ shcode=0x75,
+ specials={ "char", 0x75, 0x328 },
+ uccode=0x172,
+ unicodeslot=0x173,
},
{
adobename="Wcircumflex",
@@ -4194,11 +4202,11 @@ characters.data={
contextname="Wcircumflex",
description="LATIN CAPITAL LETTER W WITH CIRCUMFLEX",
direction="l",
- lccode=0x0175,
+ lccode=0x175,
linebreak="al",
- shcode=0x0057,
- specials={ "char", 0x0057, 0x0302 },
- unicodeslot=0x0174,
+ shcode=0x57,
+ specials={ "char", 0x57, 0x302 },
+ unicodeslot=0x174,
},
{
adobename="wcircumflex",
@@ -4207,10 +4215,10 @@ characters.data={
description="LATIN SMALL LETTER W WITH CIRCUMFLEX",
direction="l",
linebreak="al",
- shcode=0x0077,
- specials={ "char", 0x0077, 0x0302 },
- uccode=0x0174,
- unicodeslot=0x0175,
+ shcode=0x77,
+ specials={ "char", 0x77, 0x302 },
+ uccode=0x174,
+ unicodeslot=0x175,
},
{
adobename="Ycircumflex",
@@ -4218,11 +4226,11 @@ characters.data={
contextname="Ycircumflex",
description="LATIN CAPITAL LETTER Y WITH CIRCUMFLEX",
direction="l",
- lccode=0x0177,
+ lccode=0x177,
linebreak="al",
- shcode=0x0059,
- specials={ "char", 0x0059, 0x0302 },
- unicodeslot=0x0176,
+ shcode=0x59,
+ specials={ "char", 0x59, 0x302 },
+ unicodeslot=0x176,
},
{
adobename="ycircumflex",
@@ -4231,10 +4239,10 @@ characters.data={
description="LATIN SMALL LETTER Y WITH CIRCUMFLEX",
direction="l",
linebreak="al",
- shcode=0x0079,
- specials={ "char", 0x0079, 0x0302 },
- uccode=0x0176,
- unicodeslot=0x0177,
+ shcode=0x79,
+ specials={ "char", 0x79, 0x302 },
+ uccode=0x176,
+ unicodeslot=0x177,
},
{
adobename="Ydieresis",
@@ -4242,11 +4250,11 @@ characters.data={
contextname="Ydiaeresis",
description="LATIN CAPITAL LETTER Y WITH DIAERESIS",
direction="l",
- lccode=0x00FF,
+ lccode=0xFF,
linebreak="al",
- shcode=0x0059,
- specials={ "char", 0x0059, 0x0308 },
- unicodeslot=0x0178,
+ shcode=0x59,
+ specials={ "char", 0x59, 0x308 },
+ unicodeslot=0x178,
},
{
adobename="Zacute",
@@ -4254,11 +4262,11 @@ characters.data={
contextname="Zacute",
description="LATIN CAPITAL LETTER Z WITH ACUTE",
direction="l",
- lccode=0x017A,
+ lccode=0x17A,
linebreak="al",
- shcode=0x005A,
- specials={ "char", 0x005A, 0x0301 },
- unicodeslot=0x0179,
+ shcode=0x5A,
+ specials={ "char", 0x5A, 0x301 },
+ unicodeslot=0x179,
},
{
adobename="zacute",
@@ -4267,10 +4275,10 @@ characters.data={
description="LATIN SMALL LETTER Z WITH ACUTE",
direction="l",
linebreak="al",
- shcode=0x007A,
- specials={ "char", 0x007A, 0x0301 },
- uccode=0x0179,
- unicodeslot=0x017A,
+ shcode=0x7A,
+ specials={ "char", 0x7A, 0x301 },
+ uccode=0x179,
+ unicodeslot=0x17A,
},
{
adobename="Zdotaccent",
@@ -4278,11 +4286,11 @@ characters.data={
contextname="Zdotaccent",
description="LATIN CAPITAL LETTER Z WITH DOT ABOVE",
direction="l",
- lccode=0x017C,
+ lccode=0x17C,
linebreak="al",
- shcode=0x005A,
- specials={ "char", 0x005A, 0x0307 },
- unicodeslot=0x017B,
+ shcode=0x5A,
+ specials={ "char", 0x5A, 0x307 },
+ unicodeslot=0x17B,
},
{
adobename="zdotaccent",
@@ -4291,10 +4299,10 @@ characters.data={
description="LATIN SMALL LETTER Z WITH DOT ABOVE",
direction="l",
linebreak="al",
- shcode=0x007A,
- specials={ "char", 0x007A, 0x0307 },
- uccode=0x017B,
- unicodeslot=0x017C,
+ shcode=0x7A,
+ specials={ "char", 0x7A, 0x307 },
+ uccode=0x17B,
+ unicodeslot=0x17C,
},
{
adobename="Zcaron",
@@ -4302,11 +4310,11 @@ characters.data={
contextname="Zcaron",
description="LATIN CAPITAL LETTER Z WITH CARON",
direction="l",
- lccode=0x017E,
+ lccode=0x17E,
linebreak="al",
- shcode=0x005A,
- specials={ "char", 0x005A, 0x030C },
- unicodeslot=0x017D,
+ shcode=0x5A,
+ specials={ "char", 0x5A, 0x30C },
+ unicodeslot=0x17D,
},
{
adobename="zcaron",
@@ -4315,10 +4323,10 @@ characters.data={
description="LATIN SMALL LETTER Z WITH CARON",
direction="l",
linebreak="al",
- shcode=0x007A,
- specials={ "char", 0x007A, 0x030C },
- uccode=0x017D,
- unicodeslot=0x017E,
+ shcode=0x7A,
+ specials={ "char", 0x7A, 0x30C },
+ uccode=0x17D,
+ unicodeslot=0x17E,
},
{
adobename="slong",
@@ -4327,9 +4335,9 @@ characters.data={
description="LATIN SMALL LETTER LONG S",
direction="l",
linebreak="al",
- specials={ "compat", 0x0073 },
- uccode=0x0053,
- unicodeslot=0x017F,
+ specials={ "compat", 0x73 },
+ uccode=0x53,
+ unicodeslot=0x17F,
},
{
adobename="bstroke",
@@ -4338,9 +4346,9 @@ characters.data={
description="LATIN SMALL LETTER B WITH STROKE",
direction="l",
linebreak="al",
- shcode=0x0062,
- uccode=0x0243,
- unicodeslot=0x0180,
+ shcode=0x62,
+ uccode=0x243,
+ unicodeslot=0x180,
},
{
adobename="Bhook",
@@ -4348,20 +4356,20 @@ characters.data={
contextname="Bhook",
description="LATIN CAPITAL LETTER B WITH HOOK",
direction="l",
- lccode=0x0253,
+ lccode=0x253,
linebreak="al",
- shcode=0x0042,
- unicodeslot=0x0181,
+ shcode=0x42,
+ unicodeslot=0x181,
},
{
adobename="Btopbar",
category="lu",
description="LATIN CAPITAL LETTER B WITH TOPBAR",
direction="l",
- lccode=0x0183,
+ lccode=0x183,
linebreak="al",
- shcode=0x0042,
- unicodeslot=0x0182,
+ shcode=0x42,
+ unicodeslot=0x182,
},
{
adobename="btopbar",
@@ -4369,18 +4377,18 @@ characters.data={
description="LATIN SMALL LETTER B WITH TOPBAR",
direction="l",
linebreak="al",
- shcode=0x0062,
- uccode=0x0182,
- unicodeslot=0x0183,
+ shcode=0x62,
+ uccode=0x182,
+ unicodeslot=0x183,
},
{
adobename="Tonesix",
category="lu",
description="LATIN CAPITAL LETTER TONE SIX",
direction="l",
- lccode=0x0185,
+ lccode=0x185,
linebreak="al",
- unicodeslot=0x0184,
+ unicodeslot=0x184,
},
{
adobename="tonesix",
@@ -4388,17 +4396,17 @@ characters.data={
description="LATIN SMALL LETTER TONE SIX",
direction="l",
linebreak="al",
- uccode=0x0184,
- unicodeslot=0x0185,
+ uccode=0x184,
+ unicodeslot=0x185,
},
{
adobename="Oopen",
category="lu",
description="LATIN CAPITAL LETTER OPEN O",
direction="l",
- lccode=0x0254,
+ lccode=0x254,
linebreak="al",
- unicodeslot=0x0186,
+ unicodeslot=0x186,
},
{
adobename="Chook",
@@ -4406,10 +4414,10 @@ characters.data={
contextname="Chook",
description="LATIN CAPITAL LETTER C WITH HOOK",
direction="l",
- lccode=0x0188,
+ lccode=0x188,
linebreak="al",
- shcode=0x0043,
- unicodeslot=0x0187,
+ shcode=0x43,
+ unicodeslot=0x187,
},
{
adobename="chook",
@@ -4418,9 +4426,9 @@ characters.data={
description="LATIN SMALL LETTER C WITH HOOK",
direction="l",
linebreak="al",
- shcode=0x0063,
- uccode=0x0187,
- unicodeslot=0x0188,
+ shcode=0x63,
+ uccode=0x187,
+ unicodeslot=0x188,
},
{
adobename="Dafrican",
@@ -4428,9 +4436,9 @@ characters.data={
contextname="Dafrican",
description="LATIN CAPITAL LETTER AFRICAN D",
direction="l",
- lccode=0x0256,
+ lccode=0x256,
linebreak="al",
- unicodeslot=0x0189,
+ unicodeslot=0x189,
},
{
adobename="Dhook",
@@ -4438,20 +4446,20 @@ characters.data={
contextname="Dhook",
description="LATIN CAPITAL LETTER D WITH HOOK",
direction="l",
- lccode=0x0257,
+ lccode=0x257,
linebreak="al",
- shcode=0x0044,
- unicodeslot=0x018A,
+ shcode=0x44,
+ unicodeslot=0x18A,
},
{
adobename="Dtopbar",
category="lu",
description="LATIN CAPITAL LETTER D WITH TOPBAR",
direction="l",
- lccode=0x018C,
+ lccode=0x18C,
linebreak="al",
- shcode=0x0044,
- unicodeslot=0x018B,
+ shcode=0x44,
+ unicodeslot=0x18B,
},
{
adobename="dtopbar",
@@ -4459,9 +4467,9 @@ characters.data={
description="LATIN SMALL LETTER D WITH TOPBAR",
direction="l",
linebreak="al",
- shcode=0x0064,
- uccode=0x018B,
- unicodeslot=0x018C,
+ shcode=0x64,
+ uccode=0x18B,
+ unicodeslot=0x18C,
},
{
adobename="deltaturned",
@@ -4469,16 +4477,16 @@ characters.data={
description="LATIN SMALL LETTER TURNED DELTA",
direction="l",
linebreak="al",
- unicodeslot=0x018D,
+ unicodeslot=0x18D,
},
{
adobename="Ereversed",
category="lu",
description="LATIN CAPITAL LETTER REVERSED E",
direction="l",
- lccode=0x01DD,
+ lccode=0x1DD,
linebreak="al",
- unicodeslot=0x018E,
+ unicodeslot=0x18E,
},
{
adobename="Schwa",
@@ -4486,18 +4494,18 @@ characters.data={
contextname="Schwa",
description="LATIN CAPITAL LETTER SCHWA",
direction="l",
- lccode=0x0259,
+ lccode=0x259,
linebreak="al",
- unicodeslot=0x018F,
+ unicodeslot=0x18F,
},
{
adobename="Eopen",
category="lu",
description="LATIN CAPITAL LETTER OPEN E",
direction="l",
- lccode=0x025B,
+ lccode=0x25B,
linebreak="al",
- unicodeslot=0x0190,
+ unicodeslot=0x190,
},
{
adobename="Fhook",
@@ -4505,10 +4513,10 @@ characters.data={
contextname="Fhook",
description="LATIN CAPITAL LETTER F WITH HOOK",
direction="l",
- lccode=0x0192,
+ lccode=0x192,
linebreak="al",
- shcode=0x0046,
- unicodeslot=0x0191,
+ shcode=0x46,
+ unicodeslot=0x191,
},
{
adobename="florin",
@@ -4517,9 +4525,9 @@ characters.data={
description="LATIN SMALL LETTER F WITH HOOK",
direction="l",
linebreak="al",
- shcode=0x0066,
- uccode=0x0191,
- unicodeslot=0x0192,
+ shcode=0x66,
+ uccode=0x191,
+ unicodeslot=0x192,
},
{
adobename="Ghook",
@@ -4527,19 +4535,19 @@ characters.data={
contextname="Ghook",
description="LATIN CAPITAL LETTER G WITH HOOK",
direction="l",
- lccode=0x0260,
+ lccode=0x260,
linebreak="al",
- shcode=0x0047,
- unicodeslot=0x0193,
+ shcode=0x47,
+ unicodeslot=0x193,
},
{
adobename="Gammaafrican",
category="lu",
description="LATIN CAPITAL LETTER GAMMA",
direction="l",
- lccode=0x0263,
+ lccode=0x263,
linebreak="al",
- unicodeslot=0x0194,
+ unicodeslot=0x194,
},
{
adobename="hv",
@@ -4547,17 +4555,17 @@ characters.data={
description="LATIN SMALL LETTER HV",
direction="l",
linebreak="al",
- uccode=0x01F6,
- unicodeslot=0x0195,
+ uccode=0x1F6,
+ unicodeslot=0x195,
},
{
adobename="Iotaafrican",
category="lu",
description="LATIN CAPITAL LETTER IOTA",
direction="l",
- lccode=0x0269,
+ lccode=0x269,
linebreak="al",
- unicodeslot=0x0196,
+ unicodeslot=0x196,
},
{
adobename="Istroke",
@@ -4565,10 +4573,10 @@ characters.data={
contextname="Istroke",
description="LATIN CAPITAL LETTER I WITH STROKE",
direction="l",
- lccode=0x0268,
+ lccode=0x268,
linebreak="al",
- shcode=0x0049,
- unicodeslot=0x0197,
+ shcode=0x49,
+ unicodeslot=0x197,
},
{
adobename="Khook",
@@ -4576,10 +4584,10 @@ characters.data={
contextname="Khook",
description="LATIN CAPITAL LETTER K WITH HOOK",
direction="l",
- lccode=0x0199,
+ lccode=0x199,
linebreak="al",
- shcode=0x004B,
- unicodeslot=0x0198,
+ shcode=0x4B,
+ unicodeslot=0x198,
},
{
adobename="khook",
@@ -4588,9 +4596,9 @@ characters.data={
description="LATIN SMALL LETTER K WITH HOOK",
direction="l",
linebreak="al",
- shcode=0x006B,
- uccode=0x0198,
- unicodeslot=0x0199,
+ shcode=0x6B,
+ uccode=0x198,
+ unicodeslot=0x199,
},
{
adobename="lbar",
@@ -4599,9 +4607,9 @@ characters.data={
description="LATIN SMALL LETTER L WITH BAR",
direction="l",
linebreak="al",
- shcode=0x006C,
- uccode=0x023D,
- unicodeslot=0x019A,
+ shcode=0x6C,
+ uccode=0x23D,
+ unicodeslot=0x19A,
},
{
adobename="lambdastroke",
@@ -4609,26 +4617,28 @@ characters.data={
description="LATIN SMALL LETTER LAMBDA WITH STROKE",
direction="l",
linebreak="al",
- unicodeslot=0x019B,
+ mathclass="variable",
+ mathname="lambdabar",
+ unicodeslot=0x19B,
},
{
adobename="Mturned",
category="lu",
description="LATIN CAPITAL LETTER TURNED M",
direction="l",
- lccode=0x026F,
+ lccode=0x26F,
linebreak="al",
- unicodeslot=0x019C,
+ unicodeslot=0x19C,
},
{
adobename="Nhookleft",
category="lu",
description="LATIN CAPITAL LETTER N WITH LEFT HOOK",
direction="l",
- lccode=0x0272,
+ lccode=0x272,
linebreak="al",
- shcode=0x004E,
- unicodeslot=0x019D,
+ shcode=0x4E,
+ unicodeslot=0x19D,
},
{
adobename="nlegrightlong",
@@ -4636,19 +4646,19 @@ characters.data={
description="LATIN SMALL LETTER N WITH LONG RIGHT LEG",
direction="l",
linebreak="al",
- shcode=0x006E,
- uccode=0x0220,
- unicodeslot=0x019E,
+ shcode=0x6E,
+ uccode=0x220,
+ unicodeslot=0x19E,
},
{
adobename="Ocenteredtilde",
category="lu",
description="LATIN CAPITAL LETTER O WITH MIDDLE TILDE",
direction="l",
- lccode=0x0275,
+ lccode=0x275,
linebreak="al",
- shcode=0x004F,
- unicodeslot=0x019F,
+ shcode=0x4F,
+ unicodeslot=0x19F,
},
{
adobename="Ohorn",
@@ -4656,11 +4666,11 @@ characters.data={
contextname="Ohorn",
description="LATIN CAPITAL LETTER O WITH HORN",
direction="l",
- lccode=0x01A1,
+ lccode=0x1A1,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x004F, 0x031B },
- unicodeslot=0x01A0,
+ shcode=0x4F,
+ specials={ "char", 0x4F, 0x31B },
+ unicodeslot=0x1A0,
},
{
adobename="ohorn",
@@ -4669,19 +4679,19 @@ characters.data={
description="LATIN SMALL LETTER O WITH HORN",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x006F, 0x031B },
- uccode=0x01A0,
- unicodeslot=0x01A1,
+ shcode=0x6F,
+ specials={ "char", 0x6F, 0x31B },
+ uccode=0x1A0,
+ unicodeslot=0x1A1,
},
{
adobename="Oi",
category="lu",
description="LATIN CAPITAL LETTER OI",
direction="l",
- lccode=0x01A3,
+ lccode=0x1A3,
linebreak="al",
- unicodeslot=0x01A2,
+ unicodeslot=0x1A2,
},
{
adobename="oi",
@@ -4689,8 +4699,8 @@ characters.data={
description="LATIN SMALL LETTER OI",
direction="l",
linebreak="al",
- uccode=0x01A2,
- unicodeslot=0x01A3,
+ uccode=0x1A2,
+ unicodeslot=0x1A3,
},
{
adobename="Phook",
@@ -4698,10 +4708,10 @@ characters.data={
contextname="Phook",
description="LATIN CAPITAL LETTER P WITH HOOK",
direction="l",
- lccode=0x01A5,
+ lccode=0x1A5,
linebreak="al",
- shcode=0x0050,
- unicodeslot=0x01A4,
+ shcode=0x50,
+ unicodeslot=0x1A4,
},
{
adobename="phook",
@@ -4710,27 +4720,27 @@ characters.data={
description="LATIN SMALL LETTER P WITH HOOK",
direction="l",
linebreak="al",
- shcode=0x0070,
- uccode=0x01A4,
- unicodeslot=0x01A5,
+ shcode=0x70,
+ uccode=0x1A4,
+ unicodeslot=0x1A5,
},
{
adobename="yr",
category="lu",
description="LATIN LETTER YR",
direction="l",
- lccode=0x0280,
+ lccode=0x280,
linebreak="al",
- unicodeslot=0x01A6,
+ unicodeslot=0x1A6,
},
{
adobename="Tonetwo",
category="lu",
description="LATIN CAPITAL LETTER TONE TWO",
direction="l",
- lccode=0x01A8,
+ lccode=0x1A8,
linebreak="al",
- unicodeslot=0x01A7,
+ unicodeslot=0x1A7,
},
{
adobename="tonetwo",
@@ -4738,17 +4748,17 @@ characters.data={
description="LATIN SMALL LETTER TONE TWO",
direction="l",
linebreak="al",
- uccode=0x01A7,
- unicodeslot=0x01A8,
+ uccode=0x1A7,
+ unicodeslot=0x1A8,
},
{
adobename="Esh",
category="lu",
description="LATIN CAPITAL LETTER ESH",
direction="l",
- lccode=0x0283,
+ lccode=0x283,
linebreak="al",
- unicodeslot=0x01A9,
+ unicodeslot=0x1A9,
},
{
adobename="eshreversedloop",
@@ -4756,7 +4766,7 @@ characters.data={
description="LATIN LETTER REVERSED ESH LOOP",
direction="l",
linebreak="al",
- unicodeslot=0x01AA,
+ unicodeslot=0x1AA,
},
{
adobename="tpalatalhook",
@@ -4764,8 +4774,8 @@ characters.data={
description="LATIN SMALL LETTER T WITH PALATAL HOOK",
direction="l",
linebreak="al",
- shcode=0x0074,
- unicodeslot=0x01AB,
+ shcode=0x74,
+ unicodeslot=0x1AB,
},
{
adobename="Thook",
@@ -4773,10 +4783,10 @@ characters.data={
contextname="Thook",
description="LATIN CAPITAL LETTER T WITH HOOK",
direction="l",
- lccode=0x01AD,
+ lccode=0x1AD,
linebreak="al",
- shcode=0x0054,
- unicodeslot=0x01AC,
+ shcode=0x54,
+ unicodeslot=0x1AC,
},
{
adobename="thook",
@@ -4785,19 +4795,19 @@ characters.data={
description="LATIN SMALL LETTER T WITH HOOK",
direction="l",
linebreak="al",
- shcode=0x0074,
- uccode=0x01AC,
- unicodeslot=0x01AD,
+ shcode=0x74,
+ uccode=0x1AC,
+ unicodeslot=0x1AD,
},
{
adobename="Tretroflexhook",
category="lu",
description="LATIN CAPITAL LETTER T WITH RETROFLEX HOOK",
direction="l",
- lccode=0x0288,
+ lccode=0x288,
linebreak="al",
- shcode=0x0054,
- unicodeslot=0x01AE,
+ shcode=0x54,
+ unicodeslot=0x1AE,
},
{
adobename="Uhorn",
@@ -4805,11 +4815,11 @@ characters.data={
contextname="Uhorn",
description="LATIN CAPITAL LETTER U WITH HORN",
direction="l",
- lccode=0x01B0,
+ lccode=0x1B0,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x0055, 0x031B },
- unicodeslot=0x01AF,
+ shcode=0x55,
+ specials={ "char", 0x55, 0x31B },
+ unicodeslot=0x1AF,
},
{
adobename="uhorn",
@@ -4818,19 +4828,19 @@ characters.data={
description="LATIN SMALL LETTER U WITH HORN",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x0075, 0x031B },
- uccode=0x01AF,
- unicodeslot=0x01B0,
+ shcode=0x75,
+ specials={ "char", 0x75, 0x31B },
+ uccode=0x1AF,
+ unicodeslot=0x1B0,
},
{
adobename="Upsilonafrican",
category="lu",
description="LATIN CAPITAL LETTER UPSILON",
direction="l",
- lccode=0x028A,
+ lccode=0x28A,
linebreak="al",
- unicodeslot=0x01B1,
+ unicodeslot=0x1B1,
},
{
adobename="Vhook",
@@ -4838,10 +4848,10 @@ characters.data={
contextname="Uhook",
description="LATIN CAPITAL LETTER V WITH HOOK",
direction="l",
- lccode=0x028B,
+ lccode=0x28B,
linebreak="al",
- shcode=0x0056,
- unicodeslot=0x01B2,
+ shcode=0x56,
+ unicodeslot=0x1B2,
},
{
adobename="Yhook",
@@ -4849,10 +4859,10 @@ characters.data={
contextname="Yhook",
description="LATIN CAPITAL LETTER Y WITH HOOK",
direction="l",
- lccode=0x01B4,
+ lccode=0x1B4,
linebreak="al",
- shcode=0x0059,
- unicodeslot=0x01B3,
+ shcode=0x59,
+ unicodeslot=0x1B3,
},
{
adobename="yhook",
@@ -4861,9 +4871,9 @@ characters.data={
description="LATIN SMALL LETTER Y WITH HOOK",
direction="l",
linebreak="al",
- shcode=0x0079,
- uccode=0x01B3,
- unicodeslot=0x01B4,
+ shcode=0x79,
+ uccode=0x1B3,
+ unicodeslot=0x1B4,
},
{
adobename="Zstroke",
@@ -4871,10 +4881,10 @@ characters.data={
contextname="Zstroke",
description="LATIN CAPITAL LETTER Z WITH STROKE",
direction="l",
- lccode=0x01B6,
+ lccode=0x1B6,
linebreak="al",
- shcode=0x005A,
- unicodeslot=0x01B5,
+ shcode=0x5A,
+ unicodeslot=0x1B5,
},
{
adobename="zstroke",
@@ -4883,27 +4893,27 @@ characters.data={
description="LATIN SMALL LETTER Z WITH STROKE",
direction="l",
linebreak="al",
- shcode=0x007A,
- uccode=0x01B5,
- unicodeslot=0x01B6,
+ shcode=0x7A,
+ uccode=0x1B5,
+ unicodeslot=0x1B6,
},
{
adobename="Ezh",
category="lu",
description="LATIN CAPITAL LETTER EZH",
direction="l",
- lccode=0x0292,
+ lccode=0x292,
linebreak="al",
- unicodeslot=0x01B7,
+ unicodeslot=0x1B7,
},
{
adobename="Ezhreversed",
category="lu",
description="LATIN CAPITAL LETTER EZH REVERSED",
direction="l",
- lccode=0x01B9,
+ lccode=0x1B9,
linebreak="al",
- unicodeslot=0x01B8,
+ unicodeslot=0x1B8,
},
{
adobename="ezhreversed",
@@ -4911,8 +4921,8 @@ characters.data={
description="LATIN SMALL LETTER EZH REVERSED",
direction="l",
linebreak="al",
- uccode=0x01B8,
- unicodeslot=0x01B9,
+ uccode=0x1B8,
+ unicodeslot=0x1B9,
},
{
adobename="ezhtail",
@@ -4920,8 +4930,8 @@ characters.data={
description="LATIN SMALL LETTER EZH WITH TAIL",
direction="l",
linebreak="al",
- shcode=0x0292,
- unicodeslot=0x01BA,
+ shcode=0x292,
+ unicodeslot=0x1BA,
},
{
adobename="twostroke",
@@ -4929,16 +4939,16 @@ characters.data={
description="LATIN LETTER TWO WITH STROKE",
direction="l",
linebreak="al",
- unicodeslot=0x01BB,
+ unicodeslot=0x1BB,
},
{
adobename="Tonefive",
category="lu",
description="LATIN CAPITAL LETTER TONE FIVE",
direction="l",
- lccode=0x01BD,
+ lccode=0x1BD,
linebreak="al",
- unicodeslot=0x01BC,
+ unicodeslot=0x1BC,
},
{
adobename="tonefive",
@@ -4946,8 +4956,8 @@ characters.data={
description="LATIN SMALL LETTER TONE FIVE",
direction="l",
linebreak="al",
- uccode=0x01BC,
- unicodeslot=0x01BD,
+ uccode=0x1BC,
+ unicodeslot=0x1BD,
},
{
adobename="glottalinvertedstroke",
@@ -4955,7 +4965,7 @@ characters.data={
description="LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE",
direction="l",
linebreak="al",
- unicodeslot=0x01BE,
+ unicodeslot=0x1BE,
},
{
adobename="wynn",
@@ -4963,8 +4973,8 @@ characters.data={
description="LATIN LETTER WYNN",
direction="l",
linebreak="al",
- uccode=0x01F7,
- unicodeslot=0x01BF,
+ uccode=0x1F7,
+ unicodeslot=0x1BF,
},
{
adobename="clickdental",
@@ -4972,7 +4982,7 @@ characters.data={
description="LATIN LETTER DENTAL CLICK",
direction="l",
linebreak="al",
- unicodeslot=0x01C0,
+ unicodeslot=0x1C0,
},
{
adobename="clicklateral",
@@ -4980,7 +4990,7 @@ characters.data={
description="LATIN LETTER LATERAL CLICK",
direction="l",
linebreak="al",
- unicodeslot=0x01C1,
+ unicodeslot=0x1C1,
},
{
adobename="clickalveolar",
@@ -4988,7 +4998,7 @@ characters.data={
description="LATIN LETTER ALVEOLAR CLICK",
direction="l",
linebreak="al",
- unicodeslot=0x01C2,
+ unicodeslot=0x1C2,
},
{
adobename="clickretroflex",
@@ -4996,7 +5006,7 @@ characters.data={
description="LATIN LETTER RETROFLEX CLICK",
direction="l",
linebreak="al",
- unicodeslot=0x01C3,
+ unicodeslot=0x1C3,
},
{
adobename="DZcaron",
@@ -5004,12 +5014,12 @@ characters.data={
contextname="DZcaronligature",
description="LATIN CAPITAL LETTER DZ WITH CARON",
direction="l",
- lccode=0x01C6,
+ lccode=0x1C6,
linebreak="al",
- shcode=0x01F1,
- specials={ "compat", 0x0044, 0x017D },
- uccode=0x01C5,
- unicodeslot=0x01C4,
+ shcode=0x1F1,
+ specials={ "compat", 0x44, 0x17D },
+ uccode=0x1C5,
+ unicodeslot=0x1C4,
},
{
adobename="Dzcaron",
@@ -5017,12 +5027,12 @@ characters.data={
contextname="Dzcaronligature",
description="LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON",
direction="l",
- lccode=0x01C6,
+ lccode=0x1C6,
linebreak="al",
- shcode=0x01F2,
- specials={ "compat", 0x0044, 0x017E },
- uccode=0x01C4,
- unicodeslot=0x01C5,
+ shcode=0x1F2,
+ specials={ "compat", 0x44, 0x17E },
+ uccode=0x1C4,
+ unicodeslot=0x1C5,
},
{
adobename="dzcaron",
@@ -5031,10 +5041,10 @@ characters.data={
description="LATIN SMALL LETTER DZ WITH CARON",
direction="l",
linebreak="al",
- shcode=0x01F3,
- specials={ "compat", 0x0064, 0x017E },
- uccode=0x01C4,
- unicodeslot=0x01C6,
+ shcode=0x1F3,
+ specials={ "compat", 0x64, 0x17E },
+ uccode=0x1C4,
+ unicodeslot=0x1C6,
},
{
adobename="LJ",
@@ -5042,12 +5052,12 @@ characters.data={
contextname="LJligature",
description="LATIN CAPITAL LETTER LJ",
direction="l",
- lccode=0x01C9,
+ lccode=0x1C9,
linebreak="al",
- shcode={ 0x004C, 0x004A },
- specials={ "compat", 0x004C, 0x004A },
- uccode=0x01C8,
- unicodeslot=0x01C7,
+ shcode={ 0x4C, 0x4A },
+ specials={ "compat", 0x4C, 0x4A },
+ uccode=0x1C8,
+ unicodeslot=0x1C7,
},
{
adobename="Lj",
@@ -5055,12 +5065,12 @@ characters.data={
contextname="Ljligature",
description="LATIN CAPITAL LETTER L WITH SMALL LETTER J",
direction="l",
- lccode=0x01C9,
+ lccode=0x1C9,
linebreak="al",
- shcode={ 0x004C, 0x006A },
- specials={ "compat", 0x004C, 0x006A },
- uccode=0x01C7,
- unicodeslot=0x01C8,
+ shcode={ 0x4C, 0x6A },
+ specials={ "compat", 0x4C, 0x6A },
+ uccode=0x1C7,
+ unicodeslot=0x1C8,
},
{
adobename="lj",
@@ -5069,10 +5079,10 @@ characters.data={
description="LATIN SMALL LETTER LJ",
direction="l",
linebreak="al",
- shcode={ 0x006C, 0x006A },
- specials={ "compat", 0x006C, 0x006A },
- uccode=0x01C7,
- unicodeslot=0x01C9,
+ shcode={ 0x6C, 0x6A },
+ specials={ "compat", 0x6C, 0x6A },
+ uccode=0x1C7,
+ unicodeslot=0x1C9,
},
{
adobename="NJ",
@@ -5080,12 +5090,12 @@ characters.data={
contextname="NJligature",
description="LATIN CAPITAL LETTER NJ",
direction="l",
- lccode=0x01CC,
+ lccode=0x1CC,
linebreak="al",
- shcode={ 0x004E, 0x004A },
- specials={ "compat", 0x004E, 0x004A },
- uccode=0x01CB,
- unicodeslot=0x01CA,
+ shcode={ 0x4E, 0x4A },
+ specials={ "compat", 0x4E, 0x4A },
+ uccode=0x1CB,
+ unicodeslot=0x1CA,
},
{
adobename="Nj",
@@ -5093,12 +5103,12 @@ characters.data={
contextname="Njligature",
description="LATIN CAPITAL LETTER N WITH SMALL LETTER J",
direction="l",
- lccode=0x01CC,
+ lccode=0x1CC,
linebreak="al",
- shcode=0x004E,
- specials={ "compat", 0x004E, 0x006A },
- uccode=0x01CA,
- unicodeslot=0x01CB,
+ shcode=0x4E,
+ specials={ "compat", 0x4E, 0x6A },
+ uccode=0x1CA,
+ unicodeslot=0x1CB,
},
{
adobename="nj",
@@ -5107,10 +5117,10 @@ characters.data={
description="LATIN SMALL LETTER NJ",
direction="l",
linebreak="al",
- shcode={ 0x006E, 0x006A },
- specials={ "compat", 0x006E, 0x006A },
- uccode=0x01CA,
- unicodeslot=0x01CC,
+ shcode={ 0x6E, 0x6A },
+ specials={ "compat", 0x6E, 0x6A },
+ uccode=0x1CA,
+ unicodeslot=0x1CC,
},
{
adobename="Acaron",
@@ -5118,11 +5128,11 @@ characters.data={
contextname="Acaron",
description="LATIN CAPITAL LETTER A WITH CARON",
direction="l",
- lccode=0x01CE,
+ lccode=0x1CE,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x0041, 0x030C },
- unicodeslot=0x01CD,
+ shcode=0x41,
+ specials={ "char", 0x41, 0x30C },
+ unicodeslot=0x1CD,
},
{
adobename="acaron",
@@ -5132,10 +5142,10 @@ characters.data={
description="LATIN SMALL LETTER A WITH CARON",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x0061, 0x030C },
- uccode=0x01CD,
- unicodeslot=0x01CE,
+ shcode=0x61,
+ specials={ "char", 0x61, 0x30C },
+ uccode=0x1CD,
+ unicodeslot=0x1CE,
},
{
adobename="Icaron",
@@ -5143,11 +5153,11 @@ characters.data={
contextname="Icaron",
description="LATIN CAPITAL LETTER I WITH CARON",
direction="l",
- lccode=0x01D0,
+ lccode=0x1D0,
linebreak="al",
- shcode=0x0049,
- specials={ "char", 0x0049, 0x030C },
- unicodeslot=0x01CF,
+ shcode=0x49,
+ specials={ "char", 0x49, 0x30C },
+ unicodeslot=0x1CF,
},
{
adobename="icaron",
@@ -5157,10 +5167,10 @@ characters.data={
description="LATIN SMALL LETTER I WITH CARON",
direction="l",
linebreak="al",
- shcode=0x0069,
- specials={ "char", 0x0069, 0x030C },
- uccode=0x01CF,
- unicodeslot=0x01D0,
+ shcode=0x69,
+ specials={ "char", 0x69, 0x30C },
+ uccode=0x1CF,
+ unicodeslot=0x1D0,
},
{
adobename="Ocaron",
@@ -5168,11 +5178,11 @@ characters.data={
contextname="Ocaron",
description="LATIN CAPITAL LETTER O WITH CARON",
direction="l",
- lccode=0x01D2,
+ lccode=0x1D2,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x004F, 0x030C },
- unicodeslot=0x01D1,
+ shcode=0x4F,
+ specials={ "char", 0x4F, 0x30C },
+ unicodeslot=0x1D1,
},
{
adobename="ocaron",
@@ -5182,10 +5192,10 @@ characters.data={
description="LATIN SMALL LETTER O WITH CARON",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x006F, 0x030C },
- uccode=0x01D1,
- unicodeslot=0x01D2,
+ shcode=0x6F,
+ specials={ "char", 0x6F, 0x30C },
+ uccode=0x1D1,
+ unicodeslot=0x1D2,
},
{
adobename="Ucaron",
@@ -5193,11 +5203,11 @@ characters.data={
contextname="Ucaron",
description="LATIN CAPITAL LETTER U WITH CARON",
direction="l",
- lccode=0x01D4,
+ lccode=0x1D4,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x0055, 0x030C },
- unicodeslot=0x01D3,
+ shcode=0x55,
+ specials={ "char", 0x55, 0x30C },
+ unicodeslot=0x1D3,
},
{
adobename="ucaron",
@@ -5207,10 +5217,10 @@ characters.data={
description="LATIN SMALL LETTER U WITH CARON",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x0075, 0x030C },
- uccode=0x01D3,
- unicodeslot=0x01D4,
+ shcode=0x75,
+ specials={ "char", 0x75, 0x30C },
+ uccode=0x1D3,
+ unicodeslot=0x1D4,
},
{
adobename="Udieresismacron",
@@ -5218,11 +5228,11 @@ characters.data={
contextname="Udiaeresismacron",
description="LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON",
direction="l",
- lccode=0x01D6,
+ lccode=0x1D6,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x00DC, 0x0304 },
- unicodeslot=0x01D5,
+ shcode=0x55,
+ specials={ "char", 0xDC, 0x304 },
+ unicodeslot=0x1D5,
},
{
adobename="udieresismacron",
@@ -5232,10 +5242,10 @@ characters.data={
description="LATIN SMALL LETTER U WITH DIAERESIS AND MACRON",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x00FC, 0x0304 },
- uccode=0x01D5,
- unicodeslot=0x01D6,
+ shcode=0x75,
+ specials={ "char", 0xFC, 0x304 },
+ uccode=0x1D5,
+ unicodeslot=0x1D6,
},
{
adobename="Udieresisacute",
@@ -5243,11 +5253,11 @@ characters.data={
contextname="Udiaeresisacute",
description="LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE",
direction="l",
- lccode=0x01D8,
+ lccode=0x1D8,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x00DC, 0x0301 },
- unicodeslot=0x01D7,
+ shcode=0x55,
+ specials={ "char", 0xDC, 0x301 },
+ unicodeslot=0x1D7,
},
{
adobename="udieresisacute",
@@ -5257,10 +5267,10 @@ characters.data={
description="LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x00FC, 0x0301 },
- uccode=0x01D7,
- unicodeslot=0x01D8,
+ shcode=0x75,
+ specials={ "char", 0xFC, 0x301 },
+ uccode=0x1D7,
+ unicodeslot=0x1D8,
},
{
adobename="Udieresiscaron",
@@ -5268,11 +5278,11 @@ characters.data={
contextname="Udiaeresiscaron",
description="LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON",
direction="l",
- lccode=0x01DA,
+ lccode=0x1DA,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x00DC, 0x030C },
- unicodeslot=0x01D9,
+ shcode=0x55,
+ specials={ "char", 0xDC, 0x30C },
+ unicodeslot=0x1D9,
},
{
adobename="udieresiscaron",
@@ -5282,10 +5292,10 @@ characters.data={
description="LATIN SMALL LETTER U WITH DIAERESIS AND CARON",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x00FC, 0x030C },
- uccode=0x01D9,
- unicodeslot=0x01DA,
+ shcode=0x75,
+ specials={ "char", 0xFC, 0x30C },
+ uccode=0x1D9,
+ unicodeslot=0x1DA,
},
{
adobename="Udieresisgrave",
@@ -5293,11 +5303,11 @@ characters.data={
contextname="Udiaeresisgrave",
description="LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE",
direction="l",
- lccode=0x01DC,
+ lccode=0x1DC,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x00DC, 0x0300 },
- unicodeslot=0x01DB,
+ shcode=0x55,
+ specials={ "char", 0xDC, 0x300 },
+ unicodeslot=0x1DB,
},
{
adobename="udieresisgrave",
@@ -5307,10 +5317,10 @@ characters.data={
description="LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x00FC, 0x0300 },
- uccode=0x01DB,
- unicodeslot=0x01DC,
+ shcode=0x75,
+ specials={ "char", 0xFC, 0x300 },
+ uccode=0x1DB,
+ unicodeslot=0x1DC,
},
{
adobename="eturned",
@@ -5318,8 +5328,8 @@ characters.data={
description="LATIN SMALL LETTER TURNED E",
direction="l",
linebreak="al",
- uccode=0x018E,
- unicodeslot=0x01DD,
+ uccode=0x18E,
+ unicodeslot=0x1DD,
},
{
adobename="Adieresismacron",
@@ -5327,11 +5337,11 @@ characters.data={
contextname="Adiaeresismacron",
description="LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON",
direction="l",
- lccode=0x01DF,
+ lccode=0x1DF,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x00C4, 0x0304 },
- unicodeslot=0x01DE,
+ shcode=0x41,
+ specials={ "char", 0xC4, 0x304 },
+ unicodeslot=0x1DE,
},
{
adobename="adieresismacron",
@@ -5340,10 +5350,10 @@ characters.data={
description="LATIN SMALL LETTER A WITH DIAERESIS AND MACRON",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x00E4, 0x0304 },
- uccode=0x01DE,
- unicodeslot=0x01DF,
+ shcode=0x61,
+ specials={ "char", 0xE4, 0x304 },
+ uccode=0x1DE,
+ unicodeslot=0x1DF,
},
{
adobename="Adotmacron",
@@ -5351,11 +5361,11 @@ characters.data={
contextname="Adotaccentmacron",
description="LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON",
direction="l",
- lccode=0x01E1,
+ lccode=0x1E1,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x0226, 0x0304 },
- unicodeslot=0x01E0,
+ shcode=0x41,
+ specials={ "char", 0x226, 0x304 },
+ unicodeslot=0x1E0,
},
{
adobename="adotmacron",
@@ -5364,10 +5374,10 @@ characters.data={
description="LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x0227, 0x0304 },
- uccode=0x01E0,
- unicodeslot=0x01E1,
+ shcode=0x61,
+ specials={ "char", 0x227, 0x304 },
+ uccode=0x1E0,
+ unicodeslot=0x1E1,
},
{
adobename="AEmacron",
@@ -5375,11 +5385,11 @@ characters.data={
contextname="AEmacron",
description="LATIN CAPITAL LETTER AE WITH MACRON",
direction="l",
- lccode=0x01E3,
+ lccode=0x1E3,
linebreak="al",
- shcode=0x00C6,
- specials={ "char", 0x00C6, 0x0304 },
- unicodeslot=0x01E2,
+ shcode=0xC6,
+ specials={ "char", 0xC6, 0x304 },
+ unicodeslot=0x1E2,
},
{
adobename="aemacron",
@@ -5388,10 +5398,10 @@ characters.data={
description="LATIN SMALL LETTER AE WITH MACRON",
direction="l",
linebreak="al",
- shcode=0x00E6,
- specials={ "char", 0x00E6, 0x0304 },
- uccode=0x01E2,
- unicodeslot=0x01E3,
+ shcode=0xE6,
+ specials={ "char", 0xE6, 0x304 },
+ uccode=0x1E2,
+ unicodeslot=0x1E3,
},
{
adobename="Gstroke",
@@ -5399,10 +5409,10 @@ characters.data={
contextname="Gstroke",
description="LATIN CAPITAL LETTER G WITH STROKE",
direction="l",
- lccode=0x01E5,
+ lccode=0x1E5,
linebreak="al",
- shcode=0x0047,
- unicodeslot=0x01E4,
+ shcode=0x47,
+ unicodeslot=0x1E4,
},
{
adobename="gstroke",
@@ -5411,9 +5421,9 @@ characters.data={
description="LATIN SMALL LETTER G WITH STROKE",
direction="l",
linebreak="al",
- shcode=0x0067,
- uccode=0x01E4,
- unicodeslot=0x01E5,
+ shcode=0x67,
+ uccode=0x1E4,
+ unicodeslot=0x1E5,
},
{
adobename="Gcaron",
@@ -5421,11 +5431,11 @@ characters.data={
contextname="Gcaron",
description="LATIN CAPITAL LETTER G WITH CARON",
direction="l",
- lccode=0x01E7,
+ lccode=0x1E7,
linebreak="al",
- shcode=0x0047,
- specials={ "char", 0x0047, 0x030C },
- unicodeslot=0x01E6,
+ shcode=0x47,
+ specials={ "char", 0x47, 0x30C },
+ unicodeslot=0x1E6,
},
{
adobename="gcaron",
@@ -5434,10 +5444,10 @@ characters.data={
description="LATIN SMALL LETTER G WITH CARON",
direction="l",
linebreak="al",
- shcode=0x0067,
- specials={ "char", 0x0067, 0x030C },
- uccode=0x01E6,
- unicodeslot=0x01E7,
+ shcode=0x67,
+ specials={ "char", 0x67, 0x30C },
+ uccode=0x1E6,
+ unicodeslot=0x1E7,
},
{
adobename="Kcaron",
@@ -5445,11 +5455,11 @@ characters.data={
contextname="Kcaron",
description="LATIN CAPITAL LETTER K WITH CARON",
direction="l",
- lccode=0x01E9,
+ lccode=0x1E9,
linebreak="al",
- shcode=0x004B,
- specials={ "char", 0x004B, 0x030C },
- unicodeslot=0x01E8,
+ shcode=0x4B,
+ specials={ "char", 0x4B, 0x30C },
+ unicodeslot=0x1E8,
},
{
adobename="kcaron",
@@ -5458,10 +5468,10 @@ characters.data={
description="LATIN SMALL LETTER K WITH CARON",
direction="l",
linebreak="al",
- shcode=0x006B,
- specials={ "char", 0x006B, 0x030C },
- uccode=0x01E8,
- unicodeslot=0x01E9,
+ shcode=0x6B,
+ specials={ "char", 0x6B, 0x30C },
+ uccode=0x1E8,
+ unicodeslot=0x1E9,
},
{
adobename="Oogonek",
@@ -5469,11 +5479,11 @@ characters.data={
contextname="Oogonek",
description="LATIN CAPITAL LETTER O WITH OGONEK",
direction="l",
- lccode=0x01EB,
+ lccode=0x1EB,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x004F, 0x0328 },
- unicodeslot=0x01EA,
+ shcode=0x4F,
+ specials={ "char", 0x4F, 0x328 },
+ unicodeslot=0x1EA,
},
{
adobename="oogonek",
@@ -5482,10 +5492,10 @@ characters.data={
description="LATIN SMALL LETTER O WITH OGONEK",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x006F, 0x0328 },
- uccode=0x01EA,
- unicodeslot=0x01EB,
+ shcode=0x6F,
+ specials={ "char", 0x6F, 0x328 },
+ uccode=0x1EA,
+ unicodeslot=0x1EB,
},
{
adobename="Oogonekmacron",
@@ -5493,11 +5503,11 @@ characters.data={
contextname="Oogonekmacron",
description="LATIN CAPITAL LETTER O WITH OGONEK AND MACRON",
direction="l",
- lccode=0x01ED,
+ lccode=0x1ED,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x01EA, 0x0304 },
- unicodeslot=0x01EC,
+ shcode=0x4F,
+ specials={ "char", 0x1EA, 0x304 },
+ unicodeslot=0x1EC,
},
{
adobename="oogonekmacron",
@@ -5506,21 +5516,21 @@ characters.data={
description="LATIN SMALL LETTER O WITH OGONEK AND MACRON",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x01EB, 0x0304 },
- uccode=0x01EC,
- unicodeslot=0x01ED,
+ shcode=0x6F,
+ specials={ "char", 0x1EB, 0x304 },
+ uccode=0x1EC,
+ unicodeslot=0x1ED,
},
{
adobename="Ezhcaron",
category="lu",
description="LATIN CAPITAL LETTER EZH WITH CARON",
direction="l",
- lccode=0x01EF,
+ lccode=0x1EF,
linebreak="al",
- shcode=0x01B7,
- specials={ "char", 0x01B7, 0x030C },
- unicodeslot=0x01EE,
+ shcode=0x1B7,
+ specials={ "char", 0x1B7, 0x30C },
+ unicodeslot=0x1EE,
},
{
adobename="ezhcaron",
@@ -5528,10 +5538,10 @@ characters.data={
description="LATIN SMALL LETTER EZH WITH CARON",
direction="l",
linebreak="al",
- shcode=0x0292,
- specials={ "char", 0x0292, 0x030C },
- uccode=0x01EE,
- unicodeslot=0x01EF,
+ shcode=0x292,
+ specials={ "char", 0x292, 0x30C },
+ uccode=0x1EE,
+ unicodeslot=0x1EF,
},
{
adobename="jcaron",
@@ -5540,9 +5550,9 @@ characters.data={
description="LATIN SMALL LETTER J WITH CARON",
direction="l",
linebreak="al",
- shcode=0x006A,
- specials={ "char", 0x006A, 0x030C },
- unicodeslot=0x01F0,
+ shcode=0x6A,
+ specials={ "char", 0x6A, 0x30C },
+ unicodeslot=0x1F0,
},
{
adobename="DZ",
@@ -5550,11 +5560,11 @@ characters.data={
contextname="DZligature",
description="LATIN CAPITAL LETTER DZ",
direction="l",
- lccode=0x01F3,
+ lccode=0x1F3,
linebreak="al",
- specials={ "compat", 0x0044, 0x005A },
- uccode=0x01F2,
- unicodeslot=0x01F1,
+ specials={ "compat", 0x44, 0x5A },
+ uccode=0x1F2,
+ unicodeslot=0x1F1,
},
{
adobename="Dz",
@@ -5562,12 +5572,12 @@ characters.data={
contextname="Dzligature",
description="LATIN CAPITAL LETTER D WITH SMALL LETTER Z",
direction="l",
- lccode=0x01F3,
+ lccode=0x1F3,
linebreak="al",
- shcode=0x0044,
- specials={ "compat", 0x0044, 0x007A },
- uccode=0x01F1,
- unicodeslot=0x01F2,
+ shcode=0x44,
+ specials={ "compat", 0x44, 0x7A },
+ uccode=0x1F1,
+ unicodeslot=0x1F2,
},
{
adobename="dz",
@@ -5576,9 +5586,9 @@ characters.data={
description="LATIN SMALL LETTER DZ",
direction="l",
linebreak="al",
- specials={ "compat", 0x0064, 0x007A },
- uccode=0x01F1,
- unicodeslot=0x01F3,
+ specials={ "compat", 0x64, 0x7A },
+ uccode=0x1F1,
+ unicodeslot=0x1F3,
},
{
adobename="Gacute",
@@ -5586,11 +5596,11 @@ characters.data={
contextname="Gacute",
description="LATIN CAPITAL LETTER G WITH ACUTE",
direction="l",
- lccode=0x01F5,
+ lccode=0x1F5,
linebreak="al",
- shcode=0x0047,
- specials={ "char", 0x0047, 0x0301 },
- unicodeslot=0x01F4,
+ shcode=0x47,
+ specials={ "char", 0x47, 0x301 },
+ unicodeslot=0x1F4,
},
{
adobename="gacute",
@@ -5599,37 +5609,37 @@ characters.data={
description="LATIN SMALL LETTER G WITH ACUTE",
direction="l",
linebreak="al",
- shcode=0x0067,
- specials={ "char", 0x0067, 0x0301 },
- uccode=0x01F4,
- unicodeslot=0x01F5,
+ shcode=0x67,
+ specials={ "char", 0x67, 0x301 },
+ uccode=0x1F4,
+ unicodeslot=0x1F5,
},
{
category="lu",
description="LATIN CAPITAL LETTER HWAIR",
direction="l",
- lccode=0x0195,
+ lccode=0x195,
linebreak="al",
- unicodeslot=0x01F6,
+ unicodeslot=0x1F6,
},
{
category="lu",
description="LATIN CAPITAL LETTER WYNN",
direction="l",
- lccode=0x01BF,
+ lccode=0x1BF,
linebreak="al",
- unicodeslot=0x01F7,
+ unicodeslot=0x1F7,
},
{
category="lu",
contextname="Ngrave",
description="LATIN CAPITAL LETTER N WITH GRAVE",
direction="l",
- lccode=0x01F9,
+ lccode=0x1F9,
linebreak="al",
- shcode=0x004E,
- specials={ "char", 0x004E, 0x0300 },
- unicodeslot=0x01F8,
+ shcode=0x4E,
+ specials={ "char", 0x4E, 0x300 },
+ unicodeslot=0x1F8,
},
{
category="ll",
@@ -5637,10 +5647,10 @@ characters.data={
description="LATIN SMALL LETTER N WITH GRAVE",
direction="l",
linebreak="al",
- shcode=0x006E,
- specials={ "char", 0x006E, 0x0300 },
- uccode=0x01F8,
- unicodeslot=0x01F9,
+ shcode=0x6E,
+ specials={ "char", 0x6E, 0x300 },
+ uccode=0x1F8,
+ unicodeslot=0x1F9,
},
{
adobename="Aringacute",
@@ -5648,11 +5658,11 @@ characters.data={
contextname="Aringacute",
description="LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE",
direction="l",
- lccode=0x01FB,
+ lccode=0x1FB,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x00C5, 0x0301 },
- unicodeslot=0x01FA,
+ shcode=0x41,
+ specials={ "char", 0xC5, 0x301 },
+ unicodeslot=0x1FA,
},
{
adobename="aringacute",
@@ -5661,10 +5671,10 @@ characters.data={
description="LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x00E5, 0x0301 },
- uccode=0x01FA,
- unicodeslot=0x01FB,
+ shcode=0x61,
+ specials={ "char", 0xE5, 0x301 },
+ uccode=0x1FA,
+ unicodeslot=0x1FB,
},
{
adobename="AEacute",
@@ -5672,11 +5682,11 @@ characters.data={
contextname="AEacute",
description="LATIN CAPITAL LETTER AE WITH ACUTE",
direction="l",
- lccode=0x01FD,
+ lccode=0x1FD,
linebreak="al",
- shcode=0x00C6,
- specials={ "char", 0x00C6, 0x0301 },
- unicodeslot=0x01FC,
+ shcode=0xC6,
+ specials={ "char", 0xC6, 0x301 },
+ unicodeslot=0x1FC,
},
{
adobename="aeacute",
@@ -5685,10 +5695,10 @@ characters.data={
description="LATIN SMALL LETTER AE WITH ACUTE",
direction="l",
linebreak="al",
- shcode=0x00E6,
- specials={ "char", 0x00E6, 0x0301 },
- uccode=0x01FC,
- unicodeslot=0x01FD,
+ shcode=0xE6,
+ specials={ "char", 0xE6, 0x301 },
+ uccode=0x1FC,
+ unicodeslot=0x1FD,
},
{
adobename="Ostrokeacute",
@@ -5696,11 +5706,11 @@ characters.data={
contextname="Ostrokeacute",
description="LATIN CAPITAL LETTER O WITH STROKE AND ACUTE",
direction="l",
- lccode=0x01FF,
+ lccode=0x1FF,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x00D8, 0x0301 },
- unicodeslot=0x01FE,
+ shcode=0x4F,
+ specials={ "char", 0xD8, 0x301 },
+ unicodeslot=0x1FE,
},
{
adobename="ostrokeacute",
@@ -5709,10 +5719,10 @@ characters.data={
description="LATIN SMALL LETTER O WITH STROKE AND ACUTE",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x00F8, 0x0301 },
- uccode=0x01FE,
- unicodeslot=0x01FF,
+ shcode=0x6F,
+ specials={ "char", 0xF8, 0x301 },
+ uccode=0x1FE,
+ unicodeslot=0x1FF,
},
{
adobename="Adblgrave",
@@ -5720,11 +5730,11 @@ characters.data={
contextname="Adoublegrave",
description="LATIN CAPITAL LETTER A WITH DOUBLE GRAVE",
direction="l",
- lccode=0x0201,
+ lccode=0x201,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x0041, 0x030F },
- unicodeslot=0x0200,
+ shcode=0x41,
+ specials={ "char", 0x41, 0x30F },
+ unicodeslot=0x200,
},
{
adobename="adblgrave",
@@ -5733,10 +5743,10 @@ characters.data={
description="LATIN SMALL LETTER A WITH DOUBLE GRAVE",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x0061, 0x030F },
- uccode=0x0200,
- unicodeslot=0x0201,
+ shcode=0x61,
+ specials={ "char", 0x61, 0x30F },
+ uccode=0x200,
+ unicodeslot=0x201,
},
{
adobename="Ainvertedbreve",
@@ -5744,11 +5754,11 @@ characters.data={
contextname="Ainvertedbreve",
description="LATIN CAPITAL LETTER A WITH INVERTED BREVE",
direction="l",
- lccode=0x0203,
+ lccode=0x203,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x0041, 0x0311 },
- unicodeslot=0x0202,
+ shcode=0x41,
+ specials={ "char", 0x41, 0x311 },
+ unicodeslot=0x202,
},
{
adobename="ainvertedbreve",
@@ -5757,10 +5767,10 @@ characters.data={
description="LATIN SMALL LETTER A WITH INVERTED BREVE",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x0061, 0x0311 },
- uccode=0x0202,
- unicodeslot=0x0203,
+ shcode=0x61,
+ specials={ "char", 0x61, 0x311 },
+ uccode=0x202,
+ unicodeslot=0x203,
},
{
adobename="Edblgrave",
@@ -5768,11 +5778,11 @@ characters.data={
contextname="Edoublegrave",
description="LATIN CAPITAL LETTER E WITH DOUBLE GRAVE",
direction="l",
- lccode=0x0205,
+ lccode=0x205,
linebreak="al",
- shcode=0x0045,
- specials={ "char", 0x0045, 0x030F },
- unicodeslot=0x0204,
+ shcode=0x45,
+ specials={ "char", 0x45, 0x30F },
+ unicodeslot=0x204,
},
{
adobename="edblgrave",
@@ -5781,10 +5791,10 @@ characters.data={
description="LATIN SMALL LETTER E WITH DOUBLE GRAVE",
direction="l",
linebreak="al",
- shcode=0x0065,
- specials={ "char", 0x0065, 0x030F },
- uccode=0x0204,
- unicodeslot=0x0205,
+ shcode=0x65,
+ specials={ "char", 0x65, 0x30F },
+ uccode=0x204,
+ unicodeslot=0x205,
},
{
adobename="Einvertedbreve",
@@ -5792,11 +5802,11 @@ characters.data={
contextname="Einvertedbreve",
description="LATIN CAPITAL LETTER E WITH INVERTED BREVE",
direction="l",
- lccode=0x0207,
+ lccode=0x207,
linebreak="al",
- shcode=0x0045,
- specials={ "char", 0x0045, 0x0311 },
- unicodeslot=0x0206,
+ shcode=0x45,
+ specials={ "char", 0x45, 0x311 },
+ unicodeslot=0x206,
},
{
adobename="einvertedbreve",
@@ -5805,10 +5815,10 @@ characters.data={
description="LATIN SMALL LETTER E WITH INVERTED BREVE",
direction="l",
linebreak="al",
- shcode=0x0065,
- specials={ "char", 0x0065, 0x0311 },
- uccode=0x0206,
- unicodeslot=0x0207,
+ shcode=0x65,
+ specials={ "char", 0x65, 0x311 },
+ uccode=0x206,
+ unicodeslot=0x207,
},
{
adobename="Idblgrave",
@@ -5816,11 +5826,11 @@ characters.data={
contextname="Idoublegrave",
description="LATIN CAPITAL LETTER I WITH DOUBLE GRAVE",
direction="l",
- lccode=0x0209,
+ lccode=0x209,
linebreak="al",
- shcode=0x0049,
- specials={ "char", 0x0049, 0x030F },
- unicodeslot=0x0208,
+ shcode=0x49,
+ specials={ "char", 0x49, 0x30F },
+ unicodeslot=0x208,
},
{
adobename="idblgrave",
@@ -5829,10 +5839,10 @@ characters.data={
description="LATIN SMALL LETTER I WITH DOUBLE GRAVE",
direction="l",
linebreak="al",
- shcode=0x0069,
- specials={ "char", 0x0069, 0x030F },
- uccode=0x0208,
- unicodeslot=0x0209,
+ shcode=0x69,
+ specials={ "char", 0x69, 0x30F },
+ uccode=0x208,
+ unicodeslot=0x209,
},
{
adobename="Iinvertedbreve",
@@ -5840,11 +5850,11 @@ characters.data={
contextname="Iinvertedbreve",
description="LATIN CAPITAL LETTER I WITH INVERTED BREVE",
direction="l",
- lccode=0x020B,
+ lccode=0x20B,
linebreak="al",
- shcode=0x0049,
- specials={ "char", 0x0049, 0x0311 },
- unicodeslot=0x020A,
+ shcode=0x49,
+ specials={ "char", 0x49, 0x311 },
+ unicodeslot=0x20A,
},
{
adobename="iinvertedbreve",
@@ -5853,10 +5863,10 @@ characters.data={
description="LATIN SMALL LETTER I WITH INVERTED BREVE",
direction="l",
linebreak="al",
- shcode=0x0069,
- specials={ "char", 0x0069, 0x0311 },
- uccode=0x020A,
- unicodeslot=0x020B,
+ shcode=0x69,
+ specials={ "char", 0x69, 0x311 },
+ uccode=0x20A,
+ unicodeslot=0x20B,
},
{
adobename="Odblgrave",
@@ -5864,11 +5874,11 @@ characters.data={
contextname="Odoublegrave",
description="LATIN CAPITAL LETTER O WITH DOUBLE GRAVE",
direction="l",
- lccode=0x020D,
+ lccode=0x20D,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x004F, 0x030F },
- unicodeslot=0x020C,
+ shcode=0x4F,
+ specials={ "char", 0x4F, 0x30F },
+ unicodeslot=0x20C,
},
{
adobename="odblgrave",
@@ -5877,10 +5887,10 @@ characters.data={
description="LATIN SMALL LETTER O WITH DOUBLE GRAVE",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x006F, 0x030F },
- uccode=0x020C,
- unicodeslot=0x020D,
+ shcode=0x6F,
+ specials={ "char", 0x6F, 0x30F },
+ uccode=0x20C,
+ unicodeslot=0x20D,
},
{
adobename="Oinvertedbreve",
@@ -5888,11 +5898,11 @@ characters.data={
contextname="Oinvertedbreve",
description="LATIN CAPITAL LETTER O WITH INVERTED BREVE",
direction="l",
- lccode=0x020F,
+ lccode=0x20F,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x004F, 0x0311 },
- unicodeslot=0x020E,
+ shcode=0x4F,
+ specials={ "char", 0x4F, 0x311 },
+ unicodeslot=0x20E,
},
{
adobename="oinvertedbreve",
@@ -5901,10 +5911,10 @@ characters.data={
description="LATIN SMALL LETTER O WITH INVERTED BREVE",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x006F, 0x0311 },
- uccode=0x020E,
- unicodeslot=0x020F,
+ shcode=0x6F,
+ specials={ "char", 0x6F, 0x311 },
+ uccode=0x20E,
+ unicodeslot=0x20F,
},
{
adobename="Rdblgrave",
@@ -5912,11 +5922,11 @@ characters.data={
contextname="Rdoublegrave",
description="LATIN CAPITAL LETTER R WITH DOUBLE GRAVE",
direction="l",
- lccode=0x0211,
+ lccode=0x211,
linebreak="al",
- shcode=0x0052,
- specials={ "char", 0x0052, 0x030F },
- unicodeslot=0x0210,
+ shcode=0x52,
+ specials={ "char", 0x52, 0x30F },
+ unicodeslot=0x210,
},
{
adobename="rdblgrave",
@@ -5925,10 +5935,10 @@ characters.data={
description="LATIN SMALL LETTER R WITH DOUBLE GRAVE",
direction="l",
linebreak="al",
- shcode=0x0072,
- specials={ "char", 0x0072, 0x030F },
- uccode=0x0210,
- unicodeslot=0x0211,
+ shcode=0x72,
+ specials={ "char", 0x72, 0x30F },
+ uccode=0x210,
+ unicodeslot=0x211,
},
{
adobename="Rinvertedbreve",
@@ -5936,11 +5946,11 @@ characters.data={
contextname="Rinvertedbreve",
description="LATIN CAPITAL LETTER R WITH INVERTED BREVE",
direction="l",
- lccode=0x0213,
+ lccode=0x213,
linebreak="al",
- shcode=0x0052,
- specials={ "char", 0x0052, 0x0311 },
- unicodeslot=0x0212,
+ shcode=0x52,
+ specials={ "char", 0x52, 0x311 },
+ unicodeslot=0x212,
},
{
adobename="rinvertedbreve",
@@ -5949,10 +5959,10 @@ characters.data={
description="LATIN SMALL LETTER R WITH INVERTED BREVE",
direction="l",
linebreak="al",
- shcode=0x0072,
- specials={ "char", 0x0072, 0x0311 },
- uccode=0x0212,
- unicodeslot=0x0213,
+ shcode=0x72,
+ specials={ "char", 0x72, 0x311 },
+ uccode=0x212,
+ unicodeslot=0x213,
},
{
adobename="Udblgrave",
@@ -5960,11 +5970,11 @@ characters.data={
contextname="Udoublegrave",
description="LATIN CAPITAL LETTER U WITH DOUBLE GRAVE",
direction="l",
- lccode=0x0215,
+ lccode=0x215,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x0055, 0x030F },
- unicodeslot=0x0214,
+ shcode=0x55,
+ specials={ "char", 0x55, 0x30F },
+ unicodeslot=0x214,
},
{
adobename="udblgrave",
@@ -5973,10 +5983,10 @@ characters.data={
description="LATIN SMALL LETTER U WITH DOUBLE GRAVE",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x0075, 0x030F },
- uccode=0x0214,
- unicodeslot=0x0215,
+ shcode=0x75,
+ specials={ "char", 0x75, 0x30F },
+ uccode=0x214,
+ unicodeslot=0x215,
},
{
adobename="Uinvertedbreve",
@@ -5984,11 +5994,11 @@ characters.data={
contextname="Uinvertedbreve",
description="LATIN CAPITAL LETTER U WITH INVERTED BREVE",
direction="l",
- lccode=0x0217,
+ lccode=0x217,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x0055, 0x0311 },
- unicodeslot=0x0216,
+ shcode=0x55,
+ specials={ "char", 0x55, 0x311 },
+ unicodeslot=0x216,
},
{
adobename="uinvertedbreve",
@@ -5997,10 +6007,10 @@ characters.data={
description="LATIN SMALL LETTER U WITH INVERTED BREVE",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x0075, 0x0311 },
- uccode=0x0216,
- unicodeslot=0x0217,
+ shcode=0x75,
+ specials={ "char", 0x75, 0x311 },
+ uccode=0x216,
+ unicodeslot=0x217,
},
{
adobename="Scommaaccent",
@@ -6008,11 +6018,11 @@ characters.data={
contextname="Scommaaccent",
description="LATIN CAPITAL LETTER S WITH COMMA BELOW",
direction="l",
- lccode=0x0219,
+ lccode=0x219,
linebreak="al",
- shcode=0x0053,
- specials={ "char", 0x0053, 0x0326 },
- unicodeslot=0x0218,
+ shcode=0x53,
+ specials={ "char", 0x53, 0x326 },
+ unicodeslot=0x218,
},
{
adobename="scommaaccent",
@@ -6021,21 +6031,21 @@ characters.data={
description="LATIN SMALL LETTER S WITH COMMA BELOW",
direction="l",
linebreak="al",
- shcode=0x0073,
- specials={ "char", 0x0073, 0x0326 },
- uccode=0x0218,
- unicodeslot=0x0219,
+ shcode=0x73,
+ specials={ "char", 0x73, 0x326 },
+ uccode=0x218,
+ unicodeslot=0x219,
},
{
category="lu",
contextname="Tcommaaccent",
description="LATIN CAPITAL LETTER T WITH COMMA BELOW",
direction="l",
- lccode=0x021B,
+ lccode=0x21B,
linebreak="al",
- shcode=0x0054,
- specials={ "char", 0x0054, 0x0326 },
- unicodeslot=0x021A,
+ shcode=0x54,
+ specials={ "char", 0x54, 0x326 },
+ unicodeslot=0x21A,
},
{
category="ll",
@@ -6043,37 +6053,37 @@ characters.data={
description="LATIN SMALL LETTER T WITH COMMA BELOW",
direction="l",
linebreak="al",
- shcode=0x0074,
- specials={ "char", 0x0074, 0x0326 },
- uccode=0x021A,
- unicodeslot=0x021B,
+ shcode=0x74,
+ specials={ "char", 0x74, 0x326 },
+ uccode=0x21A,
+ unicodeslot=0x21B,
},
{
category="lu",
description="LATIN CAPITAL LETTER YOGH",
direction="l",
- lccode=0x021D,
+ lccode=0x21D,
linebreak="al",
- unicodeslot=0x021C,
+ unicodeslot=0x21C,
},
{
category="ll",
description="LATIN SMALL LETTER YOGH",
direction="l",
linebreak="al",
- uccode=0x021C,
- unicodeslot=0x021D,
+ uccode=0x21C,
+ unicodeslot=0x21D,
},
{
category="lu",
contextname="Hcaron",
description="LATIN CAPITAL LETTER H WITH CARON",
direction="l",
- lccode=0x021F,
+ lccode=0x21F,
linebreak="al",
- shcode=0x0048,
- specials={ "char", 0x0048, 0x030C },
- unicodeslot=0x021E,
+ shcode=0x48,
+ specials={ "char", 0x48, 0x30C },
+ unicodeslot=0x21E,
},
{
category="ll",
@@ -6081,19 +6091,19 @@ characters.data={
description="LATIN SMALL LETTER H WITH CARON",
direction="l",
linebreak="al",
- shcode=0x0068,
- specials={ "char", 0x0068, 0x030C },
- uccode=0x021E,
- unicodeslot=0x021F,
+ shcode=0x68,
+ specials={ "char", 0x68, 0x30C },
+ uccode=0x21E,
+ unicodeslot=0x21F,
},
{
category="lu",
description="LATIN CAPITAL LETTER N WITH LONG RIGHT LEG",
direction="l",
- lccode=0x019E,
+ lccode=0x19E,
linebreak="al",
- shcode=0x004E,
- unicodeslot=0x0220,
+ shcode=0x4E,
+ unicodeslot=0x220,
},
{
category="ll",
@@ -6101,34 +6111,34 @@ characters.data={
description="LATIN SMALL LETTER D WITH CURL",
direction="l",
linebreak="al",
- shcode=0x0064,
- unicodeslot=0x0221,
+ shcode=0x64,
+ unicodeslot=0x221,
},
{
category="lu",
description="LATIN CAPITAL LETTER OU",
direction="l",
- lccode=0x0223,
+ lccode=0x223,
linebreak="al",
- unicodeslot=0x0222,
+ unicodeslot=0x222,
},
{
category="ll",
description="LATIN SMALL LETTER OU",
direction="l",
linebreak="al",
- uccode=0x0222,
- unicodeslot=0x0223,
+ uccode=0x222,
+ unicodeslot=0x223,
},
{
category="lu",
contextname="Zhook",
description="LATIN CAPITAL LETTER Z WITH HOOK",
direction="l",
- lccode=0x0225,
+ lccode=0x225,
linebreak="al",
- shcode=0x005A,
- unicodeslot=0x0224,
+ shcode=0x5A,
+ unicodeslot=0x224,
},
{
category="ll",
@@ -6136,20 +6146,20 @@ characters.data={
description="LATIN SMALL LETTER Z WITH HOOK",
direction="l",
linebreak="al",
- shcode=0x007A,
- uccode=0x0224,
- unicodeslot=0x0225,
+ shcode=0x7A,
+ uccode=0x224,
+ unicodeslot=0x225,
},
{
category="lu",
contextname="Adotaccent",
description="LATIN CAPITAL LETTER A WITH DOT ABOVE",
direction="l",
- lccode=0x0227,
+ lccode=0x227,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x0041, 0x0307 },
- unicodeslot=0x0226,
+ shcode=0x41,
+ specials={ "char", 0x41, 0x307 },
+ unicodeslot=0x226,
},
{
category="ll",
@@ -6157,21 +6167,21 @@ characters.data={
description="LATIN SMALL LETTER A WITH DOT ABOVE",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x0061, 0x0307 },
- uccode=0x0226,
- unicodeslot=0x0227,
+ shcode=0x61,
+ specials={ "char", 0x61, 0x307 },
+ uccode=0x226,
+ unicodeslot=0x227,
},
{
category="lu",
contextname="Ecedilla",
description="LATIN CAPITAL LETTER E WITH CEDILLA",
direction="l",
- lccode=0x0229,
+ lccode=0x229,
linebreak="al",
- shcode=0x0045,
- specials={ "char", 0x0045, 0x0327 },
- unicodeslot=0x0228,
+ shcode=0x45,
+ specials={ "char", 0x45, 0x327 },
+ unicodeslot=0x228,
},
{
category="ll",
@@ -6179,21 +6189,21 @@ characters.data={
description="LATIN SMALL LETTER E WITH CEDILLA",
direction="l",
linebreak="al",
- shcode=0x0065,
- specials={ "char", 0x0065, 0x0327 },
- uccode=0x0228,
- unicodeslot=0x0229,
+ shcode=0x65,
+ specials={ "char", 0x65, 0x327 },
+ uccode=0x228,
+ unicodeslot=0x229,
},
{
category="lu",
contextname="Odiaeresismacron",
description="LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON",
direction="l",
- lccode=0x022B,
+ lccode=0x22B,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x00D6, 0x0304 },
- unicodeslot=0x022A,
+ shcode=0x4F,
+ specials={ "char", 0xD6, 0x304 },
+ unicodeslot=0x22A,
},
{
category="ll",
@@ -6201,21 +6211,21 @@ characters.data={
description="LATIN SMALL LETTER O WITH DIAERESIS AND MACRON",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x00F6, 0x0304 },
- uccode=0x022A,
- unicodeslot=0x022B,
+ shcode=0x6F,
+ specials={ "char", 0xF6, 0x304 },
+ uccode=0x22A,
+ unicodeslot=0x22B,
},
{
category="lu",
contextname="Otildemacron",
description="LATIN CAPITAL LETTER O WITH TILDE AND MACRON",
direction="l",
- lccode=0x022D,
+ lccode=0x22D,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x00D5, 0x0304 },
- unicodeslot=0x022C,
+ shcode=0x4F,
+ specials={ "char", 0xD5, 0x304 },
+ unicodeslot=0x22C,
},
{
category="ll",
@@ -6223,21 +6233,21 @@ characters.data={
description="LATIN SMALL LETTER O WITH TILDE AND MACRON",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x00F5, 0x0304 },
- uccode=0x022C,
- unicodeslot=0x022D,
+ shcode=0x6F,
+ specials={ "char", 0xF5, 0x304 },
+ uccode=0x22C,
+ unicodeslot=0x22D,
},
{
category="lu",
contextname="Odotaccent",
description="LATIN CAPITAL LETTER O WITH DOT ABOVE",
direction="l",
- lccode=0x022F,
+ lccode=0x22F,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x004F, 0x0307 },
- unicodeslot=0x022E,
+ shcode=0x4F,
+ specials={ "char", 0x4F, 0x307 },
+ unicodeslot=0x22E,
},
{
category="ll",
@@ -6245,21 +6255,21 @@ characters.data={
description="LATIN SMALL LETTER O WITH DOT ABOVE",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x006F, 0x0307 },
- uccode=0x022E,
- unicodeslot=0x022F,
+ shcode=0x6F,
+ specials={ "char", 0x6F, 0x307 },
+ uccode=0x22E,
+ unicodeslot=0x22F,
},
{
category="lu",
contextname="Odotaccentmacron",
description="LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON",
direction="l",
- lccode=0x0231,
+ lccode=0x231,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x022E, 0x0304 },
- unicodeslot=0x0230,
+ shcode=0x4F,
+ specials={ "char", 0x22E, 0x304 },
+ unicodeslot=0x230,
},
{
category="ll",
@@ -6267,21 +6277,21 @@ characters.data={
description="LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x022F, 0x0304 },
- uccode=0x0230,
- unicodeslot=0x0231,
+ shcode=0x6F,
+ specials={ "char", 0x22F, 0x304 },
+ uccode=0x230,
+ unicodeslot=0x231,
},
{
category="lu",
contextname="Ymacron",
description="LATIN CAPITAL LETTER Y WITH MACRON",
direction="l",
- lccode=0x0233,
+ lccode=0x233,
linebreak="al",
- shcode=0x0059,
- specials={ "char", 0x0059, 0x0304 },
- unicodeslot=0x0232,
+ shcode=0x59,
+ specials={ "char", 0x59, 0x304 },
+ unicodeslot=0x232,
},
{
category="ll",
@@ -6289,10 +6299,10 @@ characters.data={
description="LATIN SMALL LETTER Y WITH MACRON",
direction="l",
linebreak="al",
- shcode=0x0079,
- specials={ "char", 0x0079, 0x0304 },
- uccode=0x0232,
- unicodeslot=0x0233,
+ shcode=0x79,
+ specials={ "char", 0x79, 0x304 },
+ uccode=0x232,
+ unicodeslot=0x233,
},
{
category="ll",
@@ -6300,8 +6310,8 @@ characters.data={
description="LATIN SMALL LETTER L WITH CURL",
direction="l",
linebreak="al",
- shcode=0x006C,
- unicodeslot=0x0234,
+ shcode=0x6C,
+ unicodeslot=0x234,
},
{
category="ll",
@@ -6309,8 +6319,8 @@ characters.data={
description="LATIN SMALL LETTER N WITH CURL",
direction="l",
linebreak="al",
- shcode=0x006E,
- unicodeslot=0x0235,
+ shcode=0x6E,
+ unicodeslot=0x235,
},
{
category="ll",
@@ -6318,8 +6328,8 @@ characters.data={
description="LATIN SMALL LETTER T WITH CURL",
direction="l",
linebreak="al",
- shcode=0x0074,
- unicodeslot=0x0236,
+ shcode=0x74,
+ unicodeslot=0x236,
},
{
category="ll",
@@ -6327,21 +6337,21 @@ characters.data={
description="LATIN SMALL LETTER DOTLESS J",
direction="l",
linebreak="al",
- unicodeslot=0x0237,
+ unicodeslot=0x237,
},
{
category="ll",
description="LATIN SMALL LETTER DB DIGRAPH",
direction="l",
linebreak="al",
- unicodeslot=0x0238,
+ unicodeslot=0x238,
},
{
category="ll",
description="LATIN SMALL LETTER QP DIGRAPH",
direction="l",
linebreak="al",
- unicodeslot=0x0239,
+ unicodeslot=0x239,
},
{
category="lu",
@@ -6350,18 +6360,18 @@ characters.data={
direction="l",
lccode=0x2C65,
linebreak="al",
- shcode=0x0041,
- unicodeslot=0x023A,
+ shcode=0x41,
+ unicodeslot=0x23A,
},
{
category="lu",
contextname="Cstroke",
description="LATIN CAPITAL LETTER C WITH STROKE",
direction="l",
- lccode=0x023C,
+ lccode=0x23C,
linebreak="al",
- shcode=0x0043,
- unicodeslot=0x023B,
+ shcode=0x43,
+ unicodeslot=0x23B,
},
{
category="ll",
@@ -6369,19 +6379,19 @@ characters.data={
description="LATIN SMALL LETTER C WITH STROKE",
direction="l",
linebreak="al",
- shcode=0x0063,
- uccode=0x023B,
- unicodeslot=0x023C,
+ shcode=0x63,
+ uccode=0x23B,
+ unicodeslot=0x23C,
},
{
category="lu",
contextname="Lbar",
description="LATIN CAPITAL LETTER L WITH BAR",
direction="l",
- lccode=0x019A,
+ lccode=0x19A,
linebreak="al",
- shcode=0x004C,
- unicodeslot=0x023D,
+ shcode=0x4C,
+ unicodeslot=0x23D,
},
{
category="lu",
@@ -6389,154 +6399,154 @@ characters.data={
direction="l",
lccode=0x2C66,
linebreak="al",
- shcode=0x0054,
- unicodeslot=0x023E,
+ shcode=0x54,
+ unicodeslot=0x23E,
},
{
category="ll",
description="LATIN SMALL LETTER S WITH SWASH TAIL",
direction="l",
linebreak="al",
- shcode=0x0073,
- unicodeslot=0x023F,
+ shcode=0x73,
+ unicodeslot=0x23F,
},
{
category="ll",
description="LATIN SMALL LETTER Z WITH SWASH TAIL",
direction="l",
linebreak="al",
- shcode=0x007A,
- unicodeslot=0x0240,
+ shcode=0x7A,
+ unicodeslot=0x240,
},
{
category="lu",
description="LATIN CAPITAL LETTER GLOTTAL STOP",
direction="l",
- lccode=0x0242,
+ lccode=0x242,
linebreak="al",
- unicodeslot=0x0241,
+ unicodeslot=0x241,
},
{
category="ll",
description="LATIN SMALL LETTER GLOTTAL STOP",
direction="l",
linebreak="al",
- uccode=0x0241,
- unicodeslot=0x0242,
+ uccode=0x241,
+ unicodeslot=0x242,
},
{
category="lu",
description="LATIN CAPITAL LETTER B WITH STROKE",
direction="l",
- lccode=0x0180,
+ lccode=0x180,
linebreak="al",
- shcode=0x0042,
- unicodeslot=0x0243,
+ shcode=0x42,
+ unicodeslot=0x243,
},
{
category="lu",
description="LATIN CAPITAL LETTER U BAR",
direction="l",
- lccode=0x0289,
+ lccode=0x289,
linebreak="al",
- unicodeslot=0x0244,
+ unicodeslot=0x244,
},
{
category="lu",
description="LATIN CAPITAL LETTER TURNED V",
direction="l",
- lccode=0x028C,
+ lccode=0x28C,
linebreak="al",
- unicodeslot=0x0245,
+ unicodeslot=0x245,
},
{
category="lu",
description="LATIN CAPITAL LETTER E WITH STROKE",
direction="l",
- lccode=0x0247,
+ lccode=0x247,
linebreak="al",
- shcode=0x0045,
- unicodeslot=0x0246,
+ shcode=0x45,
+ unicodeslot=0x246,
},
{
category="ll",
description="LATIN SMALL LETTER E WITH STROKE",
direction="l",
linebreak="al",
- shcode=0x0065,
- uccode=0x0246,
- unicodeslot=0x0247,
+ shcode=0x65,
+ uccode=0x246,
+ unicodeslot=0x247,
},
{
category="lu",
description="LATIN CAPITAL LETTER J WITH STROKE",
direction="l",
- lccode=0x0249,
+ lccode=0x249,
linebreak="al",
- shcode=0x004A,
- unicodeslot=0x0248,
+ shcode=0x4A,
+ unicodeslot=0x248,
},
{
category="ll",
description="LATIN SMALL LETTER J WITH STROKE",
direction="l",
linebreak="al",
- shcode=0x006A,
- uccode=0x0248,
- unicodeslot=0x0249,
+ shcode=0x6A,
+ uccode=0x248,
+ unicodeslot=0x249,
},
{
category="lu",
description="LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL",
direction="l",
- lccode=0x024B,
+ lccode=0x24B,
linebreak="al",
- unicodeslot=0x024A,
+ unicodeslot=0x24A,
},
{
category="ll",
description="LATIN SMALL LETTER Q WITH HOOK TAIL",
direction="l",
linebreak="al",
- shcode=0x0071,
- uccode=0x024A,
- unicodeslot=0x024B,
+ shcode=0x71,
+ uccode=0x24A,
+ unicodeslot=0x24B,
},
{
category="lu",
description="LATIN CAPITAL LETTER R WITH STROKE",
direction="l",
- lccode=0x024D,
+ lccode=0x24D,
linebreak="al",
- shcode=0x0052,
- unicodeslot=0x024C,
+ shcode=0x52,
+ unicodeslot=0x24C,
},
{
category="ll",
description="LATIN SMALL LETTER R WITH STROKE",
direction="l",
linebreak="al",
- shcode=0x0072,
- uccode=0x024C,
- unicodeslot=0x024D,
+ shcode=0x72,
+ uccode=0x24C,
+ unicodeslot=0x24D,
},
{
category="lu",
description="LATIN CAPITAL LETTER Y WITH STROKE",
direction="l",
- lccode=0x024F,
+ lccode=0x24F,
linebreak="al",
- shcode=0x0059,
- unicodeslot=0x024E,
+ shcode=0x59,
+ unicodeslot=0x24E,
},
{
category="ll",
description="LATIN SMALL LETTER Y WITH STROKE",
direction="l",
linebreak="al",
- shcode=0x0079,
- uccode=0x024E,
- unicodeslot=0x024F,
+ shcode=0x79,
+ uccode=0x24E,
+ unicodeslot=0x24F,
},
{
adobename="aturned",
@@ -6544,7 +6554,7 @@ characters.data={
description="LATIN SMALL LETTER TURNED A",
direction="l",
linebreak="al",
- unicodeslot=0x0250,
+ unicodeslot=0x250,
},
{
adobename="ascript",
@@ -6553,7 +6563,7 @@ characters.data={
description="LATIN SMALL LETTER ALPHA",
direction="l",
linebreak="al",
- unicodeslot=0x0251,
+ unicodeslot=0x251,
},
{
adobename="ascriptturned",
@@ -6561,7 +6571,7 @@ characters.data={
description="LATIN SMALL LETTER TURNED ALPHA",
direction="l",
linebreak="al",
- unicodeslot=0x0252,
+ unicodeslot=0x252,
},
{
adobename="bhook",
@@ -6570,9 +6580,9 @@ characters.data={
description="LATIN SMALL LETTER B WITH HOOK",
direction="l",
linebreak="al",
- shcode=0x0062,
- uccode=0x0181,
- unicodeslot=0x0253,
+ shcode=0x62,
+ uccode=0x181,
+ unicodeslot=0x253,
},
{
adobename="oopen",
@@ -6580,8 +6590,8 @@ characters.data={
description="LATIN SMALL LETTER OPEN O",
direction="l",
linebreak="al",
- uccode=0x0186,
- unicodeslot=0x0254,
+ uccode=0x186,
+ unicodeslot=0x254,
},
{
adobename="ccurl",
@@ -6590,8 +6600,8 @@ characters.data={
description="LATIN SMALL LETTER C WITH CURL",
direction="l",
linebreak="al",
- shcode=0x0063,
- unicodeslot=0x0255,
+ shcode=0x63,
+ unicodeslot=0x255,
},
{
adobename="dtail",
@@ -6600,9 +6610,9 @@ characters.data={
description="LATIN SMALL LETTER D WITH TAIL",
direction="l",
linebreak="al",
- shcode=0x0064,
- uccode=0x0189,
- unicodeslot=0x0256,
+ shcode=0x64,
+ uccode=0x189,
+ unicodeslot=0x256,
},
{
adobename="dhook",
@@ -6611,9 +6621,9 @@ characters.data={
description="LATIN SMALL LETTER D WITH HOOK",
direction="l",
linebreak="al",
- shcode=0x0064,
- uccode=0x018A,
- unicodeslot=0x0257,
+ shcode=0x64,
+ uccode=0x18A,
+ unicodeslot=0x257,
},
{
adobename="ereversed",
@@ -6621,7 +6631,7 @@ characters.data={
description="LATIN SMALL LETTER REVERSED E",
direction="l",
linebreak="al",
- unicodeslot=0x0258,
+ unicodeslot=0x258,
},
{
adobename="schwa",
@@ -6630,8 +6640,8 @@ characters.data={
description="LATIN SMALL LETTER SCHWA",
direction="l",
linebreak="al",
- uccode=0x018F,
- unicodeslot=0x0259,
+ uccode=0x18F,
+ unicodeslot=0x259,
},
{
adobename="schwahook",
@@ -6640,8 +6650,8 @@ characters.data={
description="LATIN SMALL LETTER SCHWA WITH HOOK",
direction="l",
linebreak="al",
- shcode=0x0259,
- unicodeslot=0x025A,
+ shcode=0x259,
+ unicodeslot=0x25A,
},
{
adobename="eopen",
@@ -6649,8 +6659,8 @@ characters.data={
description="LATIN SMALL LETTER OPEN E",
direction="l",
linebreak="al",
- uccode=0x0190,
- unicodeslot=0x025B,
+ uccode=0x190,
+ unicodeslot=0x25B,
},
{
adobename="eopenreversed",
@@ -6658,7 +6668,7 @@ characters.data={
description="LATIN SMALL LETTER REVERSED OPEN E",
direction="l",
linebreak="al",
- unicodeslot=0x025C,
+ unicodeslot=0x25C,
},
{
adobename="eopenreversedhook",
@@ -6666,7 +6676,7 @@ characters.data={
description="LATIN SMALL LETTER REVERSED OPEN E WITH HOOK",
direction="l",
linebreak="al",
- unicodeslot=0x025D,
+ unicodeslot=0x25D,
},
{
adobename="eopenreversedclosed",
@@ -6674,7 +6684,7 @@ characters.data={
description="LATIN SMALL LETTER CLOSED REVERSED OPEN E",
direction="l",
linebreak="al",
- unicodeslot=0x025E,
+ unicodeslot=0x25E,
},
{
adobename="jdotlessstroke",
@@ -6683,7 +6693,7 @@ characters.data={
description="LATIN SMALL LETTER DOTLESS J WITH STROKE",
direction="l",
linebreak="al",
- unicodeslot=0x025F,
+ unicodeslot=0x25F,
},
{
adobename="ghook",
@@ -6691,9 +6701,9 @@ characters.data={
description="LATIN SMALL LETTER G WITH HOOK",
direction="l",
linebreak="al",
- shcode=0x0067,
- uccode=0x0193,
- unicodeslot=0x0260,
+ shcode=0x67,
+ uccode=0x193,
+ unicodeslot=0x260,
},
{
adobename="gscript",
@@ -6702,14 +6712,14 @@ characters.data={
description="LATIN SMALL LETTER SCRIPT G",
direction="l",
linebreak="al",
- unicodeslot=0x0261,
+ unicodeslot=0x261,
},
{
category="ll",
description="LATIN LETTER SMALL CAPITAL G",
direction="l",
linebreak="al",
- unicodeslot=0x0262,
+ unicodeslot=0x262,
},
{
adobename="gammalatinsmall",
@@ -6717,8 +6727,8 @@ characters.data={
description="LATIN SMALL LETTER GAMMA",
direction="l",
linebreak="al",
- uccode=0x0194,
- unicodeslot=0x0263,
+ uccode=0x194,
+ unicodeslot=0x263,
},
{
adobename="ramshorn",
@@ -6726,7 +6736,7 @@ characters.data={
description="LATIN SMALL LETTER RAMS HORN",
direction="l",
linebreak="al",
- unicodeslot=0x0264,
+ unicodeslot=0x264,
},
{
adobename="hturned",
@@ -6734,7 +6744,7 @@ characters.data={
description="LATIN SMALL LETTER TURNED H",
direction="l",
linebreak="al",
- unicodeslot=0x0265,
+ unicodeslot=0x265,
},
{
adobename="hhook",
@@ -6742,8 +6752,8 @@ characters.data={
description="LATIN SMALL LETTER H WITH HOOK",
direction="l",
linebreak="al",
- shcode=0x0068,
- unicodeslot=0x0266,
+ shcode=0x68,
+ unicodeslot=0x266,
},
{
adobename="henghook",
@@ -6751,7 +6761,7 @@ characters.data={
description="LATIN SMALL LETTER HENG WITH HOOK",
direction="l",
linebreak="al",
- unicodeslot=0x0267,
+ unicodeslot=0x267,
},
{
adobename="istroke",
@@ -6759,9 +6769,9 @@ characters.data={
description="LATIN SMALL LETTER I WITH STROKE",
direction="l",
linebreak="al",
- shcode=0x0069,
- uccode=0x0197,
- unicodeslot=0x0268,
+ shcode=0x69,
+ uccode=0x197,
+ unicodeslot=0x268,
},
{
adobename="iotalatin",
@@ -6769,15 +6779,15 @@ characters.data={
description="LATIN SMALL LETTER IOTA",
direction="l",
linebreak="al",
- uccode=0x0196,
- unicodeslot=0x0269,
+ uccode=0x196,
+ unicodeslot=0x269,
},
{
category="ll",
description="LATIN LETTER SMALL CAPITAL I",
direction="l",
linebreak="al",
- unicodeslot=0x026A,
+ unicodeslot=0x26A,
},
{
adobename="lmiddletilde",
@@ -6785,9 +6795,9 @@ characters.data={
description="LATIN SMALL LETTER L WITH MIDDLE TILDE",
direction="l",
linebreak="al",
- shcode=0x006C,
+ shcode=0x6C,
uccode=0x2C62,
- unicodeslot=0x026B,
+ unicodeslot=0x26B,
},
{
adobename="lbelt",
@@ -6795,8 +6805,8 @@ characters.data={
description="LATIN SMALL LETTER L WITH BELT",
direction="l",
linebreak="al",
- shcode=0x006C,
- unicodeslot=0x026C,
+ shcode=0x6C,
+ unicodeslot=0x26C,
},
{
adobename="lhookretroflex",
@@ -6804,8 +6814,8 @@ characters.data={
description="LATIN SMALL LETTER L WITH RETROFLEX HOOK",
direction="l",
linebreak="al",
- shcode=0x006C,
- unicodeslot=0x026D,
+ shcode=0x6C,
+ unicodeslot=0x26D,
},
{
adobename="lezh",
@@ -6813,7 +6823,7 @@ characters.data={
description="LATIN SMALL LETTER LEZH",
direction="l",
linebreak="al",
- unicodeslot=0x026E,
+ unicodeslot=0x26E,
},
{
adobename="mturned",
@@ -6821,8 +6831,8 @@ characters.data={
description="LATIN SMALL LETTER TURNED M",
direction="l",
linebreak="al",
- uccode=0x019C,
- unicodeslot=0x026F,
+ uccode=0x19C,
+ unicodeslot=0x26F,
},
{
adobename="mlonglegturned",
@@ -6830,7 +6840,7 @@ characters.data={
description="LATIN SMALL LETTER TURNED M WITH LONG LEG",
direction="l",
linebreak="al",
- unicodeslot=0x0270,
+ unicodeslot=0x270,
},
{
adobename="mhook",
@@ -6838,8 +6848,8 @@ characters.data={
description="LATIN SMALL LETTER M WITH HOOK",
direction="l",
linebreak="al",
- shcode=0x006D,
- unicodeslot=0x0271,
+ shcode=0x6D,
+ unicodeslot=0x271,
},
{
adobename="nhookleft",
@@ -6847,9 +6857,9 @@ characters.data={
description="LATIN SMALL LETTER N WITH LEFT HOOK",
direction="l",
linebreak="al",
- shcode=0x006E,
- uccode=0x019D,
- unicodeslot=0x0272,
+ shcode=0x6E,
+ uccode=0x19D,
+ unicodeslot=0x272,
},
{
adobename="nhookretroflex",
@@ -6857,15 +6867,15 @@ characters.data={
description="LATIN SMALL LETTER N WITH RETROFLEX HOOK",
direction="l",
linebreak="al",
- shcode=0x006E,
- unicodeslot=0x0273,
+ shcode=0x6E,
+ unicodeslot=0x273,
},
{
category="ll",
description="LATIN LETTER SMALL CAPITAL N",
direction="l",
linebreak="al",
- unicodeslot=0x0274,
+ unicodeslot=0x274,
},
{
adobename="obarred",
@@ -6873,15 +6883,15 @@ characters.data={
description="LATIN SMALL LETTER BARRED O",
direction="l",
linebreak="al",
- uccode=0x019F,
- unicodeslot=0x0275,
+ uccode=0x19F,
+ unicodeslot=0x275,
},
{
category="ll",
description="LATIN LETTER SMALL CAPITAL OE",
direction="l",
linebreak="al",
- unicodeslot=0x0276,
+ unicodeslot=0x276,
},
{
adobename="omegalatinclosed",
@@ -6889,7 +6899,7 @@ characters.data={
description="LATIN SMALL LETTER CLOSED OMEGA",
direction="l",
linebreak="al",
- unicodeslot=0x0277,
+ unicodeslot=0x277,
},
{
adobename="philatin",
@@ -6897,7 +6907,7 @@ characters.data={
description="LATIN SMALL LETTER PHI",
direction="l",
linebreak="al",
- unicodeslot=0x0278,
+ unicodeslot=0x278,
},
{
adobename="rturned",
@@ -6905,7 +6915,7 @@ characters.data={
description="LATIN SMALL LETTER TURNED R",
direction="l",
linebreak="al",
- unicodeslot=0x0279,
+ unicodeslot=0x279,
},
{
adobename="rlonglegturned",
@@ -6913,7 +6923,7 @@ characters.data={
description="LATIN SMALL LETTER TURNED R WITH LONG LEG",
direction="l",
linebreak="al",
- unicodeslot=0x027A,
+ unicodeslot=0x27A,
},
{
adobename="rhookturned",
@@ -6921,7 +6931,7 @@ characters.data={
description="LATIN SMALL LETTER TURNED R WITH HOOK",
direction="l",
linebreak="al",
- unicodeslot=0x027B,
+ unicodeslot=0x27B,
},
{
adobename="rlongleg",
@@ -6929,8 +6939,8 @@ characters.data={
description="LATIN SMALL LETTER R WITH LONG LEG",
direction="l",
linebreak="al",
- shcode=0x0072,
- unicodeslot=0x027C,
+ shcode=0x72,
+ unicodeslot=0x27C,
},
{
adobename="rhook",
@@ -6938,9 +6948,9 @@ characters.data={
description="LATIN SMALL LETTER R WITH TAIL",
direction="l",
linebreak="al",
- shcode=0x0072,
+ shcode=0x72,
uccode=0x2C64,
- unicodeslot=0x027D,
+ unicodeslot=0x27D,
},
{
adobename="rfishhook",
@@ -6948,8 +6958,8 @@ characters.data={
description="LATIN SMALL LETTER R WITH FISHHOOK",
direction="l",
linebreak="al",
- shcode=0x0072,
- unicodeslot=0x027E,
+ shcode=0x72,
+ unicodeslot=0x27E,
},
{
adobename="rfishhookreversed",
@@ -6957,15 +6967,15 @@ characters.data={
description="LATIN SMALL LETTER REVERSED R WITH FISHHOOK",
direction="l",
linebreak="al",
- unicodeslot=0x027F,
+ unicodeslot=0x27F,
},
{
category="ll",
description="LATIN LETTER SMALL CAPITAL R",
direction="l",
linebreak="al",
- uccode=0x01A6,
- unicodeslot=0x0280,
+ uccode=0x1A6,
+ unicodeslot=0x280,
},
{
adobename="Rsmallinverted",
@@ -6973,7 +6983,7 @@ characters.data={
description="LATIN LETTER SMALL CAPITAL INVERTED R",
direction="l",
linebreak="al",
- unicodeslot=0x0281,
+ unicodeslot=0x281,
},
{
adobename="shook",
@@ -6981,8 +6991,8 @@ characters.data={
description="LATIN SMALL LETTER S WITH HOOK",
direction="l",
linebreak="al",
- shcode=0x0073,
- unicodeslot=0x0282,
+ shcode=0x73,
+ unicodeslot=0x282,
},
{
adobename="esh",
@@ -6990,8 +7000,8 @@ characters.data={
description="LATIN SMALL LETTER ESH",
direction="l",
linebreak="al",
- uccode=0x01A9,
- unicodeslot=0x0283,
+ uccode=0x1A9,
+ unicodeslot=0x283,
},
{
adobename="dotlessjstrokehook",
@@ -6999,7 +7009,7 @@ characters.data={
description="LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK",
direction="l",
linebreak="al",
- unicodeslot=0x0284,
+ unicodeslot=0x284,
},
{
adobename="eshsquatreversed",
@@ -7007,7 +7017,7 @@ characters.data={
description="LATIN SMALL LETTER SQUAT REVERSED ESH",
direction="l",
linebreak="al",
- unicodeslot=0x0285,
+ unicodeslot=0x285,
},
{
adobename="eshcurl",
@@ -7015,8 +7025,8 @@ characters.data={
description="LATIN SMALL LETTER ESH WITH CURL",
direction="l",
linebreak="al",
- shcode=0x0283,
- unicodeslot=0x0286,
+ shcode=0x283,
+ unicodeslot=0x286,
},
{
adobename="tturned",
@@ -7024,7 +7034,7 @@ characters.data={
description="LATIN SMALL LETTER TURNED T",
direction="l",
linebreak="al",
- unicodeslot=0x0287,
+ unicodeslot=0x287,
},
{
adobename="tretroflexhook",
@@ -7032,9 +7042,9 @@ characters.data={
description="LATIN SMALL LETTER T WITH RETROFLEX HOOK",
direction="l",
linebreak="al",
- shcode=0x0074,
- uccode=0x01AE,
- unicodeslot=0x0288,
+ shcode=0x74,
+ uccode=0x1AE,
+ unicodeslot=0x288,
},
{
adobename="ubar",
@@ -7042,8 +7052,8 @@ characters.data={
description="LATIN SMALL LETTER U BAR",
direction="l",
linebreak="al",
- uccode=0x0244,
- unicodeslot=0x0289,
+ uccode=0x244,
+ unicodeslot=0x289,
},
{
adobename="upsilonlatin",
@@ -7051,8 +7061,8 @@ characters.data={
description="LATIN SMALL LETTER UPSILON",
direction="l",
linebreak="al",
- uccode=0x01B1,
- unicodeslot=0x028A,
+ uccode=0x1B1,
+ unicodeslot=0x28A,
},
{
adobename="vhook",
@@ -7060,9 +7070,9 @@ characters.data={
description="LATIN SMALL LETTER V WITH HOOK",
direction="l",
linebreak="al",
- shcode=0x0076,
- uccode=0x01B2,
- unicodeslot=0x028B,
+ shcode=0x76,
+ uccode=0x1B2,
+ unicodeslot=0x28B,
},
{
adobename="vturned",
@@ -7070,8 +7080,8 @@ characters.data={
description="LATIN SMALL LETTER TURNED V",
direction="l",
linebreak="al",
- uccode=0x0245,
- unicodeslot=0x028C,
+ uccode=0x245,
+ unicodeslot=0x28C,
},
{
adobename="wturned",
@@ -7079,7 +7089,7 @@ characters.data={
description="LATIN SMALL LETTER TURNED W",
direction="l",
linebreak="al",
- unicodeslot=0x028D,
+ unicodeslot=0x28D,
},
{
adobename="yturned",
@@ -7087,14 +7097,14 @@ characters.data={
description="LATIN SMALL LETTER TURNED Y",
direction="l",
linebreak="al",
- unicodeslot=0x028E,
+ unicodeslot=0x28E,
},
{
category="ll",
description="LATIN LETTER SMALL CAPITAL Y",
direction="l",
linebreak="al",
- unicodeslot=0x028F,
+ unicodeslot=0x28F,
},
{
adobename="zretroflexhook",
@@ -7102,8 +7112,8 @@ characters.data={
description="LATIN SMALL LETTER Z WITH RETROFLEX HOOK",
direction="l",
linebreak="al",
- shcode=0x007A,
- unicodeslot=0x0290,
+ shcode=0x7A,
+ unicodeslot=0x290,
},
{
adobename="zcurl",
@@ -7111,8 +7121,8 @@ characters.data={
description="LATIN SMALL LETTER Z WITH CURL",
direction="l",
linebreak="al",
- shcode=0x007A,
- unicodeslot=0x0291,
+ shcode=0x7A,
+ unicodeslot=0x291,
},
{
adobename="ezh",
@@ -7120,8 +7130,8 @@ characters.data={
description="LATIN SMALL LETTER EZH",
direction="l",
linebreak="al",
- uccode=0x01B7,
- unicodeslot=0x0292,
+ uccode=0x1B7,
+ unicodeslot=0x292,
},
{
adobename="ezhcurl",
@@ -7129,8 +7139,8 @@ characters.data={
description="LATIN SMALL LETTER EZH WITH CURL",
direction="l",
linebreak="al",
- shcode=0x0292,
- unicodeslot=0x0293,
+ shcode=0x292,
+ unicodeslot=0x293,
},
{
adobename="glottalstop",
@@ -7138,7 +7148,7 @@ characters.data={
description="LATIN LETTER GLOTTAL STOP",
direction="l",
linebreak="al",
- unicodeslot=0x0294,
+ unicodeslot=0x294,
},
{
adobename="glottalstopreversed",
@@ -7146,7 +7156,7 @@ characters.data={
description="LATIN LETTER PHARYNGEAL VOICED FRICATIVE",
direction="l",
linebreak="al",
- unicodeslot=0x0295,
+ unicodeslot=0x295,
},
{
adobename="glottalstopinverted",
@@ -7154,7 +7164,7 @@ characters.data={
description="LATIN LETTER INVERTED GLOTTAL STOP",
direction="l",
linebreak="al",
- unicodeslot=0x0296,
+ unicodeslot=0x296,
},
{
adobename="cstretched",
@@ -7162,7 +7172,7 @@ characters.data={
description="LATIN LETTER STRETCHED C",
direction="l",
linebreak="al",
- unicodeslot=0x0297,
+ unicodeslot=0x297,
},
{
adobename="bilabialclick",
@@ -7170,14 +7180,14 @@ characters.data={
description="LATIN LETTER BILABIAL CLICK",
direction="l",
linebreak="al",
- unicodeslot=0x0298,
+ unicodeslot=0x298,
},
{
category="ll",
description="LATIN LETTER SMALL CAPITAL B",
direction="l",
linebreak="al",
- unicodeslot=0x0299,
+ unicodeslot=0x299,
},
{
adobename="eopenclosed",
@@ -7185,7 +7195,7 @@ characters.data={
description="LATIN SMALL LETTER CLOSED OPEN E",
direction="l",
linebreak="al",
- unicodeslot=0x029A,
+ unicodeslot=0x29A,
},
{
adobename="Gsmallhook",
@@ -7193,14 +7203,14 @@ characters.data={
description="LATIN LETTER SMALL CAPITAL G WITH HOOK",
direction="l",
linebreak="al",
- unicodeslot=0x029B,
+ unicodeslot=0x29B,
},
{
category="ll",
description="LATIN LETTER SMALL CAPITAL H",
direction="l",
linebreak="al",
- unicodeslot=0x029C,
+ unicodeslot=0x29C,
},
{
adobename="jcrossedtail",
@@ -7208,8 +7218,8 @@ characters.data={
description="LATIN SMALL LETTER J WITH CROSSED-TAIL",
direction="l",
linebreak="al",
- shcode=0x006A,
- unicodeslot=0x029D,
+ shcode=0x6A,
+ unicodeslot=0x29D,
},
{
adobename="kturned",
@@ -7217,14 +7227,14 @@ characters.data={
description="LATIN SMALL LETTER TURNED K",
direction="l",
linebreak="al",
- unicodeslot=0x029E,
+ unicodeslot=0x29E,
},
{
category="ll",
description="LATIN LETTER SMALL CAPITAL L",
direction="l",
linebreak="al",
- unicodeslot=0x029F,
+ unicodeslot=0x29F,
},
{
adobename="qhook",
@@ -7232,8 +7242,8 @@ characters.data={
description="LATIN SMALL LETTER Q WITH HOOK",
direction="l",
linebreak="al",
- shcode=0x0071,
- unicodeslot=0x02A0,
+ shcode=0x71,
+ unicodeslot=0x2A0,
},
{
adobename="glottalstopstroke",
@@ -7241,7 +7251,7 @@ characters.data={
description="LATIN LETTER GLOTTAL STOP WITH STROKE",
direction="l",
linebreak="al",
- unicodeslot=0x02A1,
+ unicodeslot=0x2A1,
},
{
adobename="glottalstopstrokereversed",
@@ -7249,7 +7259,7 @@ characters.data={
description="LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE",
direction="l",
linebreak="al",
- unicodeslot=0x02A2,
+ unicodeslot=0x2A2,
},
{
adobename="dzaltone",
@@ -7257,7 +7267,7 @@ characters.data={
description="LATIN SMALL LETTER DZ DIGRAPH",
direction="l",
linebreak="al",
- unicodeslot=0x02A3,
+ unicodeslot=0x2A3,
},
{
adobename="dezh",
@@ -7265,7 +7275,7 @@ characters.data={
description="LATIN SMALL LETTER DEZH DIGRAPH",
direction="l",
linebreak="al",
- unicodeslot=0x02A4,
+ unicodeslot=0x2A4,
},
{
adobename="dzcurl",
@@ -7273,7 +7283,7 @@ characters.data={
description="LATIN SMALL LETTER DZ DIGRAPH WITH CURL",
direction="l",
linebreak="al",
- unicodeslot=0x02A5,
+ unicodeslot=0x2A5,
},
{
adobename="ts",
@@ -7281,7 +7291,7 @@ characters.data={
description="LATIN SMALL LETTER TS DIGRAPH",
direction="l",
linebreak="al",
- unicodeslot=0x02A6,
+ unicodeslot=0x2A6,
},
{
adobename="tesh",
@@ -7289,7 +7299,7 @@ characters.data={
description="LATIN SMALL LETTER TESH DIGRAPH",
direction="l",
linebreak="al",
- unicodeslot=0x02A7,
+ unicodeslot=0x2A7,
},
{
adobename="tccurl",
@@ -7297,56 +7307,56 @@ characters.data={
description="LATIN SMALL LETTER TC DIGRAPH WITH CURL",
direction="l",
linebreak="al",
- unicodeslot=0x02A8,
+ unicodeslot=0x2A8,
},
{
category="ll",
description="LATIN SMALL LETTER FENG DIGRAPH",
direction="l",
linebreak="al",
- unicodeslot=0x02A9,
+ unicodeslot=0x2A9,
},
{
category="ll",
description="LATIN SMALL LETTER LS DIGRAPH",
direction="l",
linebreak="al",
- unicodeslot=0x02AA,
+ unicodeslot=0x2AA,
},
{
category="ll",
description="LATIN SMALL LETTER LZ DIGRAPH",
direction="l",
linebreak="al",
- unicodeslot=0x02AB,
+ unicodeslot=0x2AB,
},
{
category="ll",
description="LATIN LETTER BILABIAL PERCUSSIVE",
direction="l",
linebreak="al",
- unicodeslot=0x02AC,
+ unicodeslot=0x2AC,
},
{
category="ll",
description="LATIN LETTER BIDENTAL PERCUSSIVE",
direction="l",
linebreak="al",
- unicodeslot=0x02AD,
+ unicodeslot=0x2AD,
},
{
category="ll",
description="LATIN SMALL LETTER TURNED H WITH FISHHOOK",
direction="l",
linebreak="al",
- unicodeslot=0x02AE,
+ unicodeslot=0x2AE,
},
{
category="ll",
description="LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL",
direction="l",
linebreak="al",
- unicodeslot=0x02AF,
+ unicodeslot=0x2AF,
},
{
adobename="hsuperior",
@@ -7354,8 +7364,8 @@ characters.data={
description="MODIFIER LETTER SMALL H",
direction="l",
linebreak="al",
- specials={ "super", 0x0068 },
- unicodeslot=0x02B0,
+ specials={ "super", 0x68 },
+ unicodeslot=0x2B0,
},
{
adobename="hhooksuperior",
@@ -7363,8 +7373,8 @@ characters.data={
description="MODIFIER LETTER SMALL H WITH HOOK",
direction="l",
linebreak="al",
- specials={ "super", 0x0266 },
- unicodeslot=0x02B1,
+ specials={ "super", 0x266 },
+ unicodeslot=0x2B1,
},
{
adobename="jsuperior",
@@ -7372,16 +7382,16 @@ characters.data={
description="MODIFIER LETTER SMALL J",
direction="l",
linebreak="al",
- specials={ "super", 0x006A },
- unicodeslot=0x02B2,
+ specials={ "super", 0x6A },
+ unicodeslot=0x2B2,
},
{
category="lm",
description="MODIFIER LETTER SMALL R",
direction="l",
linebreak="al",
- specials={ "super", 0x0072 },
- unicodeslot=0x02B3,
+ specials={ "super", 0x72 },
+ unicodeslot=0x2B3,
},
{
adobename="rturnedsuperior",
@@ -7389,8 +7399,8 @@ characters.data={
description="MODIFIER LETTER SMALL TURNED R",
direction="l",
linebreak="al",
- specials={ "super", 0x0279 },
- unicodeslot=0x02B4,
+ specials={ "super", 0x279 },
+ unicodeslot=0x2B4,
},
{
adobename="rhookturnedsuperior",
@@ -7398,8 +7408,8 @@ characters.data={
description="MODIFIER LETTER SMALL TURNED R WITH HOOK",
direction="l",
linebreak="al",
- specials={ "super", 0x027B },
- unicodeslot=0x02B5,
+ specials={ "super", 0x27B },
+ unicodeslot=0x2B5,
},
{
adobename="Rsmallinvertedsuperior",
@@ -7407,8 +7417,8 @@ characters.data={
description="MODIFIER LETTER SMALL CAPITAL INVERTED R",
direction="l",
linebreak="al",
- specials={ "super", 0x0281 },
- unicodeslot=0x02B6,
+ specials={ "super", 0x281 },
+ unicodeslot=0x2B6,
},
{
adobename="wsuperior",
@@ -7416,8 +7426,8 @@ characters.data={
description="MODIFIER LETTER SMALL W",
direction="l",
linebreak="al",
- specials={ "super", 0x0077 },
- unicodeslot=0x02B7,
+ specials={ "super", 0x77 },
+ unicodeslot=0x2B7,
},
{
adobename="ysuperior",
@@ -7425,8 +7435,8 @@ characters.data={
description="MODIFIER LETTER SMALL Y",
direction="l",
linebreak="al",
- specials={ "super", 0x0079 },
- unicodeslot=0x02B8,
+ specials={ "super", 0x79 },
+ unicodeslot=0x2B8,
},
{
adobename="primemod",
@@ -7434,7 +7444,7 @@ characters.data={
description="MODIFIER LETTER PRIME",
direction="on",
linebreak="al",
- unicodeslot=0x02B9,
+ unicodeslot=0x2B9,
},
{
adobename="dblprimemod",
@@ -7442,7 +7452,7 @@ characters.data={
description="MODIFIER LETTER DOUBLE PRIME",
direction="on",
linebreak="al",
- unicodeslot=0x02BA,
+ unicodeslot=0x2BA,
},
{
adobename="commaturnedmod",
@@ -7450,7 +7460,7 @@ characters.data={
description="MODIFIER LETTER TURNED COMMA",
direction="l",
linebreak="al",
- unicodeslot=0x02BB,
+ unicodeslot=0x2BB,
},
{
adobename="apostrophemod",
@@ -7458,7 +7468,7 @@ characters.data={
description="MODIFIER LETTER APOSTROPHE",
direction="l",
linebreak="al",
- unicodeslot=0x02BC,
+ unicodeslot=0x2BC,
},
{
adobename="commareversedmod",
@@ -7466,7 +7476,7 @@ characters.data={
description="MODIFIER LETTER REVERSED COMMA",
direction="l",
linebreak="al",
- unicodeslot=0x02BD,
+ unicodeslot=0x2BD,
},
{
adobename="ringhalfright",
@@ -7474,7 +7484,7 @@ characters.data={
description="MODIFIER LETTER RIGHT HALF RING",
direction="l",
linebreak="al",
- unicodeslot=0x02BE,
+ unicodeslot=0x2BE,
},
{
adobename="ringhalfleft",
@@ -7482,7 +7492,7 @@ characters.data={
description="MODIFIER LETTER LEFT HALF RING",
direction="l",
linebreak="al",
- unicodeslot=0x02BF,
+ unicodeslot=0x2BF,
},
{
adobename="glottalstopmod",
@@ -7490,7 +7500,7 @@ characters.data={
description="MODIFIER LETTER GLOTTAL STOP",
direction="l",
linebreak="al",
- unicodeslot=0x02C0,
+ unicodeslot=0x2C0,
},
{
adobename="glottalstopreversedmod",
@@ -7498,7 +7508,7 @@ characters.data={
description="MODIFIER LETTER REVERSED GLOTTAL STOP",
direction="l",
linebreak="al",
- unicodeslot=0x02C1,
+ unicodeslot=0x2C1,
},
{
adobename="arrowheadleftmod",
@@ -7506,7 +7516,7 @@ characters.data={
description="MODIFIER LETTER LEFT ARROWHEAD",
direction="on",
linebreak="al",
- unicodeslot=0x02C2,
+ unicodeslot=0x2C2,
},
{
adobename="arrowheadrightmod",
@@ -7514,7 +7524,7 @@ characters.data={
description="MODIFIER LETTER RIGHT ARROWHEAD",
direction="on",
linebreak="al",
- unicodeslot=0x02C3,
+ unicodeslot=0x2C3,
},
{
adobename="arrowheadupmod",
@@ -7523,7 +7533,7 @@ characters.data={
description="MODIFIER LETTER UP ARROWHEAD",
direction="on",
linebreak="al",
- unicodeslot=0x02C4,
+ unicodeslot=0x2C4,
},
{
adobename="arrowheaddownmod",
@@ -7531,7 +7541,7 @@ characters.data={
description="MODIFIER LETTER DOWN ARROWHEAD",
direction="on",
linebreak="al",
- unicodeslot=0x02C5,
+ unicodeslot=0x2C5,
},
{
adobename="circumflex",
@@ -7543,8 +7553,8 @@ characters.data={
linebreak="al",
mathclass="topaccent",
mathname="hat",
- specials={ "compat", 0x0020, 0x0302 },
- unicodeslot=0x02C6,
+ specials={ "compat", 0x20, 0x302 },
+ unicodeslot=0x2C6,
},
{
adobename="caron",
@@ -7557,8 +7567,8 @@ characters.data={
linebreak="ai",
mathclass="topaccent",
mathname="check",
- specials={ "compat", 0x0020, 0x030C },
- unicodeslot=0x02C7,
+ specials={ "compat", 0x20, 0x30C },
+ unicodeslot=0x2C7,
},
{
adobename="verticallinemod",
@@ -7566,7 +7576,7 @@ characters.data={
description="MODIFIER LETTER VERTICAL LINE",
direction="on",
linebreak="bb",
- unicodeslot=0x02C8,
+ unicodeslot=0x2C8,
},
{
adobename="firsttonechinese",
@@ -7575,7 +7585,7 @@ characters.data={
description="MODIFIER LETTER MACRON",
direction="on",
linebreak="ai",
- unicodeslot=0x02C9,
+ unicodeslot=0x2C9,
},
{
adobename="secondtonechinese",
@@ -7584,7 +7594,7 @@ characters.data={
description="MODIFIER LETTER ACUTE ACCENT",
direction="on",
linebreak="ai",
- unicodeslot=0x02CA,
+ unicodeslot=0x2CA,
},
{
adobename="fourthtonechinese",
@@ -7593,7 +7603,7 @@ characters.data={
description="MODIFIER LETTER GRAVE ACCENT",
direction="on",
linebreak="ai",
- unicodeslot=0x02CB,
+ unicodeslot=0x2CB,
},
{
adobename="verticallinelowmod",
@@ -7601,7 +7611,7 @@ characters.data={
description="MODIFIER LETTER LOW VERTICAL LINE",
direction="on",
linebreak="bb",
- unicodeslot=0x02CC,
+ unicodeslot=0x2CC,
},
{
adobename="macronlowmod",
@@ -7610,7 +7620,7 @@ characters.data={
description="MODIFIER LETTER LOW MACRON",
direction="on",
linebreak="ai",
- unicodeslot=0x02CD,
+ unicodeslot=0x2CD,
},
{
adobename="gravelowmod",
@@ -7618,7 +7628,7 @@ characters.data={
description="MODIFIER LETTER LOW GRAVE ACCENT",
direction="on",
linebreak="al",
- unicodeslot=0x02CE,
+ unicodeslot=0x2CE,
},
{
adobename="acutelowmod",
@@ -7626,7 +7636,7 @@ characters.data={
description="MODIFIER LETTER LOW ACUTE ACCENT",
direction="on",
linebreak="al",
- unicodeslot=0x02CF,
+ unicodeslot=0x2CF,
},
{
adobename="colontriangularmod",
@@ -7635,7 +7645,7 @@ characters.data={
description="MODIFIER LETTER TRIANGULAR COLON",
direction="l",
linebreak="ai",
- unicodeslot=0x02D0,
+ unicodeslot=0x2D0,
},
{
adobename="colontriangularhalfmod",
@@ -7643,7 +7653,7 @@ characters.data={
description="MODIFIER LETTER HALF TRIANGULAR COLON",
direction="l",
linebreak="al",
- unicodeslot=0x02D1,
+ unicodeslot=0x2D1,
},
{
adobename="ringhalfrightcentered",
@@ -7651,7 +7661,7 @@ characters.data={
description="MODIFIER LETTER CENTRED RIGHT HALF RING",
direction="on",
linebreak="al",
- unicodeslot=0x02D2,
+ unicodeslot=0x2D2,
},
{
adobename="ringhalfleftcentered",
@@ -7659,7 +7669,7 @@ characters.data={
description="MODIFIER LETTER CENTRED LEFT HALF RING",
direction="on",
linebreak="al",
- unicodeslot=0x02D3,
+ unicodeslot=0x2D3,
},
{
adobename="uptackmod",
@@ -7667,7 +7677,7 @@ characters.data={
description="MODIFIER LETTER UP TACK",
direction="on",
linebreak="al",
- unicodeslot=0x02D4,
+ unicodeslot=0x2D4,
},
{
adobename="downtackmod",
@@ -7675,7 +7685,7 @@ characters.data={
description="MODIFIER LETTER DOWN TACK",
direction="on",
linebreak="al",
- unicodeslot=0x02D5,
+ unicodeslot=0x2D5,
},
{
adobename="plusmod",
@@ -7683,7 +7693,7 @@ characters.data={
description="MODIFIER LETTER PLUS SIGN",
direction="on",
linebreak="al",
- unicodeslot=0x02D6,
+ unicodeslot=0x2D6,
},
{
adobename="minusmod",
@@ -7691,7 +7701,7 @@ characters.data={
description="MODIFIER LETTER MINUS SIGN",
direction="on",
linebreak="al",
- unicodeslot=0x02D7,
+ unicodeslot=0x2D7,
},
{
adobename="breve",
@@ -7703,8 +7713,8 @@ characters.data={
linebreak="ai",
mathclass="topaccent",
mathname="breve",
- specials={ "compat", 0x0020, 0x0306 },
- unicodeslot=0x02D8,
+ specials={ "compat", 0x20, 0x306 },
+ unicodeslot=0x2D8,
},
{
adobename="dotaccent",
@@ -7716,8 +7726,8 @@ characters.data={
linebreak="ai",
mathclass="topaccent",
mathname="dot",
- specials={ "compat", 0x0020, 0x0307 },
- unicodeslot=0x02D9,
+ specials={ "compat", 0x20, 0x307 },
+ unicodeslot=0x2D9,
},
{
adobename="ring",
@@ -7729,8 +7739,8 @@ characters.data={
linebreak="ai",
mathclass="topaccent",
mathname="mathring",
- specials={ "compat", 0x0020, 0x030A },
- unicodeslot=0x02DA,
+ specials={ "compat", 0x20, 0x30A },
+ unicodeslot=0x2DA,
},
{
adobename="ogonek",
@@ -7740,8 +7750,8 @@ characters.data={
description="OGONEK",
direction="on",
linebreak="ai",
- specials={ "compat", 0x0020, 0x0328 },
- unicodeslot=0x02DB,
+ specials={ "compat", 0x20, 0x328 },
+ unicodeslot=0x2DB,
},
{
adobename="tilde",
@@ -7752,8 +7762,8 @@ characters.data={
linebreak="al",
mathclass="topaccent",
mathname="tilde",
- specials={ "compat", 0x0020, 0x0303 },
- unicodeslot=0x02DC,
+ specials={ "compat", 0x20, 0x303 },
+ unicodeslot=0x2DC,
},
{
adobename="hungarumlaut",
@@ -7763,8 +7773,8 @@ characters.data={
description="DOUBLE ACUTE ACCENT",
direction="on",
linebreak="ai",
- specials={ "compat", 0x0020, 0x030B },
- unicodeslot=0x02DD,
+ specials={ "compat", 0x20, 0x30B },
+ unicodeslot=0x2DD,
},
{
adobename="rhotichookmod",
@@ -7772,7 +7782,7 @@ characters.data={
description="MODIFIER LETTER RHOTIC HOOK",
direction="on",
linebreak="al",
- unicodeslot=0x02DE,
+ unicodeslot=0x2DE,
},
{
category="sk",
@@ -7780,7 +7790,7 @@ characters.data={
description="MODIFIER LETTER CROSS ACCENT",
direction="on",
linebreak="bb",
- unicodeslot=0x02DF,
+ unicodeslot=0x2DF,
},
{
adobename="gammasuperior",
@@ -7788,24 +7798,24 @@ characters.data={
description="MODIFIER LETTER SMALL GAMMA",
direction="l",
linebreak="al",
- specials={ "super", 0x0263 },
- unicodeslot=0x02E0,
+ specials={ "super", 0x263 },
+ unicodeslot=0x2E0,
},
{
category="lm",
description="MODIFIER LETTER SMALL L",
direction="l",
linebreak="al",
- specials={ "super", 0x006C },
- unicodeslot=0x02E1,
+ specials={ "super", 0x6C },
+ unicodeslot=0x2E1,
},
{
category="lm",
description="MODIFIER LETTER SMALL S",
direction="l",
linebreak="al",
- specials={ "super", 0x0073 },
- unicodeslot=0x02E2,
+ specials={ "super", 0x73 },
+ unicodeslot=0x2E2,
},
{
adobename="xsuperior",
@@ -7813,8 +7823,8 @@ characters.data={
description="MODIFIER LETTER SMALL X",
direction="l",
linebreak="al",
- specials={ "super", 0x0078 },
- unicodeslot=0x02E3,
+ specials={ "super", 0x78 },
+ unicodeslot=0x2E3,
},
{
adobename="glottalstopreversedsuperior",
@@ -7822,8 +7832,8 @@ characters.data={
description="MODIFIER LETTER SMALL REVERSED GLOTTAL STOP",
direction="l",
linebreak="al",
- specials={ "super", 0x0295 },
- unicodeslot=0x02E4,
+ specials={ "super", 0x295 },
+ unicodeslot=0x2E4,
},
{
adobename="tonebarextrahighmod",
@@ -7831,7 +7841,7 @@ characters.data={
description="MODIFIER LETTER EXTRA-HIGH TONE BAR",
direction="on",
linebreak="al",
- unicodeslot=0x02E5,
+ unicodeslot=0x2E5,
},
{
adobename="tonebarhighmod",
@@ -7839,7 +7849,7 @@ characters.data={
description="MODIFIER LETTER HIGH TONE BAR",
direction="on",
linebreak="al",
- unicodeslot=0x02E6,
+ unicodeslot=0x2E6,
},
{
adobename="tonebarmidmod",
@@ -7847,7 +7857,7 @@ characters.data={
description="MODIFIER LETTER MID TONE BAR",
direction="on",
linebreak="al",
- unicodeslot=0x02E7,
+ unicodeslot=0x2E7,
},
{
adobename="tonebarlowmod",
@@ -7855,7 +7865,7 @@ characters.data={
description="MODIFIER LETTER LOW TONE BAR",
direction="on",
linebreak="al",
- unicodeslot=0x02E8,
+ unicodeslot=0x2E8,
},
{
adobename="tonebarextralowmod",
@@ -7863,877 +7873,956 @@ characters.data={
description="MODIFIER LETTER EXTRA-LOW TONE BAR",
direction="on",
linebreak="al",
- unicodeslot=0x02E9,
+ unicodeslot=0x2E9,
},
{
category="sk",
description="MODIFIER LETTER YIN DEPARTING TONE MARK",
direction="on",
linebreak="al",
- unicodeslot=0x02EA,
+ unicodeslot=0x2EA,
},
{
category="sk",
description="MODIFIER LETTER YANG DEPARTING TONE MARK",
direction="on",
linebreak="al",
- unicodeslot=0x02EB,
+ unicodeslot=0x2EB,
},
{
category="sk",
description="MODIFIER LETTER VOICING",
direction="on",
linebreak="al",
- unicodeslot=0x02EC,
+ unicodeslot=0x2EC,
},
{
category="sk",
description="MODIFIER LETTER UNASPIRATED",
direction="on",
linebreak="al",
- unicodeslot=0x02ED,
+ unicodeslot=0x2ED,
},
{
category="lm",
description="MODIFIER LETTER DOUBLE APOSTROPHE",
direction="l",
linebreak="al",
- unicodeslot=0x02EE,
+ unicodeslot=0x2EE,
},
{
category="sk",
description="MODIFIER LETTER LOW DOWN ARROWHEAD",
direction="on",
linebreak="al",
- unicodeslot=0x02EF,
+ unicodeslot=0x2EF,
},
{
category="sk",
description="MODIFIER LETTER LOW UP ARROWHEAD",
direction="on",
linebreak="al",
- unicodeslot=0x02F0,
+ unicodeslot=0x2F0,
},
{
category="sk",
description="MODIFIER LETTER LOW LEFT ARROWHEAD",
direction="on",
linebreak="al",
- unicodeslot=0x02F1,
+ unicodeslot=0x2F1,
},
{
category="sk",
description="MODIFIER LETTER LOW RIGHT ARROWHEAD",
direction="on",
linebreak="al",
- unicodeslot=0x02F2,
+ unicodeslot=0x2F2,
},
{
category="sk",
description="MODIFIER LETTER LOW RING",
direction="on",
linebreak="al",
- unicodeslot=0x02F3,
+ unicodeslot=0x2F3,
},
{
category="sk",
description="MODIFIER LETTER MIDDLE GRAVE ACCENT",
direction="on",
linebreak="al",
- unicodeslot=0x02F4,
+ unicodeslot=0x2F4,
},
{
category="sk",
description="MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT",
direction="on",
linebreak="al",
- unicodeslot=0x02F5,
+ unicodeslot=0x2F5,
},
{
category="sk",
description="MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT",
direction="on",
linebreak="al",
- unicodeslot=0x02F6,
+ unicodeslot=0x2F6,
},
{
category="sk",
description="MODIFIER LETTER LOW TILDE",
direction="on",
linebreak="al",
- unicodeslot=0x02F7,
+ unicodeslot=0x2F7,
},
{
category="sk",
description="MODIFIER LETTER RAISED COLON",
direction="on",
linebreak="al",
- unicodeslot=0x02F8,
+ unicodeslot=0x2F8,
},
{
category="sk",
description="MODIFIER LETTER BEGIN HIGH TONE",
direction="on",
linebreak="al",
- unicodeslot=0x02F9,
+ unicodeslot=0x2F9,
},
{
category="sk",
description="MODIFIER LETTER END HIGH TONE",
direction="on",
linebreak="al",
- unicodeslot=0x02FA,
+ unicodeslot=0x2FA,
},
{
category="sk",
description="MODIFIER LETTER BEGIN LOW TONE",
direction="on",
linebreak="al",
- unicodeslot=0x02FB,
+ unicodeslot=0x2FB,
},
{
category="sk",
description="MODIFIER LETTER END LOW TONE",
direction="on",
linebreak="al",
- unicodeslot=0x02FC,
+ unicodeslot=0x2FC,
},
{
category="sk",
description="MODIFIER LETTER SHELF",
direction="on",
linebreak="al",
- unicodeslot=0x02FD,
+ unicodeslot=0x2FD,
},
{
category="sk",
description="MODIFIER LETTER OPEN SHELF",
direction="on",
linebreak="al",
- unicodeslot=0x02FE,
+ unicodeslot=0x2FE,
},
{
category="sk",
description="MODIFIER LETTER LOW LEFT ARROW",
direction="on",
linebreak="al",
- unicodeslot=0x02FF,
+ unicodeslot=0x2FF,
},
{
adobename="gravecomb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING GRAVE ACCENT",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0300,
+ unicodeslot=0x300,
},
{
adobename="acutecomb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING ACUTE ACCENT",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0301,
+ unicodeslot=0x301,
},
{
adobename="circumflexcmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING CIRCUMFLEX ACCENT",
direction="nsm",
linebreak="cm",
mathclass="topaccent",
mathname="widehat",
mathstretch="h",
- unicodeslot=0x0302,
+ unicodeslot=0x302,
},
{
adobename="tildecomb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING TILDE",
direction="nsm",
linebreak="cm",
mathclass="topaccent",
mathname="widetilde",
mathstretch="h",
- unicodeslot=0x0303,
+ unicodeslot=0x303,
},
{
adobename="macroncmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING MACRON",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0304,
+ unicodeslot=0x304,
},
{
adobename="overlinecmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING OVERLINE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0305,
+ unicodeslot=0x305,
},
{
adobename="brevecmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING BREVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0306,
+ unicodeslot=0x306,
},
{
adobename="dotaccentcmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING DOT ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0307,
+ unicodeslot=0x307,
},
{
adobename="dieresiscmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING DIAERESIS",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0308,
+ unicodeslot=0x308,
},
{
adobename="hookcmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING HOOK ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0309,
+ unicodeslot=0x309,
},
{
adobename="ringcmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING RING ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x030A,
+ unicodeslot=0x30A,
},
{
adobename="hungarumlautcmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING DOUBLE ACUTE ACCENT",
direction="nsm",
linebreak="cm",
- unicodeslot=0x030B,
+ unicodeslot=0x30B,
},
{
adobename="caroncmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING CARON",
direction="nsm",
linebreak="cm",
- unicodeslot=0x030C,
+ unicodeslot=0x30C,
},
{
adobename="verticallineabovecmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING VERTICAL LINE ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x030D,
+ unicodeslot=0x30D,
},
{
adobename="dblverticallineabovecmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING DOUBLE VERTICAL LINE ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x030E,
+ unicodeslot=0x30E,
},
{
adobename="dblgravecmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING DOUBLE GRAVE ACCENT",
direction="nsm",
linebreak="cm",
- unicodeslot=0x030F,
+ unicodeslot=0x30F,
},
{
adobename="candrabinducmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING CANDRABINDU",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0310,
+ unicodeslot=0x310,
},
{
adobename="breveinvertedcmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING INVERTED BREVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0311,
+ unicodeslot=0x311,
},
{
adobename="commaturnedabovecmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING TURNED COMMA ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0312,
+ unicodeslot=0x312,
},
{
adobename="commaabovecmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING COMMA ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0313,
+ unicodeslot=0x313,
},
{
adobename="commareversedabovecmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING REVERSED COMMA ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0314,
+ unicodeslot=0x314,
},
{
adobename="commaaboverightcmb",
category="mn",
cjkwd="a",
+ combining=0xE8,
description="COMBINING COMMA ABOVE RIGHT",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0315,
+ unicodeslot=0x315,
},
{
adobename="gravebelowcmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING GRAVE ACCENT BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0316,
+ unicodeslot=0x316,
},
{
adobename="acutebelowcmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING ACUTE ACCENT BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0317,
+ unicodeslot=0x317,
},
{
adobename="lefttackbelowcmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING LEFT TACK BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0318,
+ unicodeslot=0x318,
},
{
adobename="righttackbelowcmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING RIGHT TACK BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0319,
+ unicodeslot=0x319,
},
{
adobename="leftangleabovecmb",
category="mn",
cjkwd="a",
+ combining=0xE8,
description="COMBINING LEFT ANGLE ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x031A,
+ unicodeslot=0x31A,
},
{
adobename="horncmb",
category="mn",
cjkwd="a",
+ combining=0xD8,
description="COMBINING HORN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x031B,
+ unicodeslot=0x31B,
},
{
adobename="ringhalfleftbelowcmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING LEFT HALF RING BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x031C,
+ unicodeslot=0x31C,
},
{
adobename="uptackbelowcmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING UP TACK BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x031D,
+ unicodeslot=0x31D,
},
{
adobename="downtackbelowcmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING DOWN TACK BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x031E,
+ unicodeslot=0x31E,
},
{
adobename="plusbelowcmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING PLUS SIGN BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x031F,
+ unicodeslot=0x31F,
},
{
adobename="minusbelowcmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING MINUS SIGN BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0320,
+ unicodeslot=0x320,
},
{
adobename="hookpalatalizedbelowcmb",
category="mn",
cjkwd="a",
+ combining=0xCA,
description="COMBINING PALATALIZED HOOK BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0321,
+ unicodeslot=0x321,
},
{
adobename="hookretroflexbelowcmb",
category="mn",
cjkwd="a",
+ combining=0xCA,
description="COMBINING RETROFLEX HOOK BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0322,
+ unicodeslot=0x322,
},
{
adobename="dotbelowcomb",
category="mn",
cjkwd="a",
+ combining=0xDC,
contextname="textbottomdot",
description="COMBINING DOT BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0323,
+ unicodeslot=0x323,
},
{
adobename="dieresisbelowcmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING DIAERESIS BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0324,
+ unicodeslot=0x324,
},
{
adobename="ringbelowcmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING RING BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0325,
+ unicodeslot=0x325,
},
{
category="mn",
cjkwd="a",
+ combining=0xDC,
contextname="textbottomcomma",
description="COMBINING COMMA BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0326,
+ unicodeslot=0x326,
},
{
adobename="cedillacmb",
category="mn",
cjkwd="a",
+ combining=0xCA,
description="COMBINING CEDILLA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0327,
+ unicodeslot=0x327,
},
{
adobename="ogonekcmb",
category="mn",
cjkwd="a",
+ combining=0xCA,
description="COMBINING OGONEK",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0328,
+ unicodeslot=0x328,
},
{
adobename="verticallinebelowcmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING VERTICAL LINE BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0329,
+ unicodeslot=0x329,
},
{
adobename="bridgebelowcmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING BRIDGE BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x032A,
+ unicodeslot=0x32A,
},
{
adobename="dblarchinvertedbelowcmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING INVERTED DOUBLE ARCH BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x032B,
+ unicodeslot=0x32B,
},
{
adobename="caronbelowcmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING CARON BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x032C,
+ unicodeslot=0x32C,
},
{
adobename="circumflexbelowcmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING CIRCUMFLEX ACCENT BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x032D,
+ unicodeslot=0x32D,
},
{
adobename="brevebelowcmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING BREVE BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x032E,
+ unicodeslot=0x32E,
},
{
adobename="breveinvertedbelowcmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING INVERTED BREVE BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x032F,
+ unicodeslot=0x32F,
},
{
adobename="tildebelowcmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING TILDE BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0330,
+ unicodeslot=0x330,
},
{
adobename="macronbelowcmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING MACRON BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0331,
+ unicodeslot=0x331,
},
{
adobename="lowlinecmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING LOW LINE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0332,
+ unicodeslot=0x332,
},
{
adobename="dbllowlinecmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING DOUBLE LOW LINE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0333,
+ unicodeslot=0x333,
},
{
adobename="tildeoverlaycmb",
category="mn",
cjkwd="a",
+ combining=0x1,
description="COMBINING TILDE OVERLAY",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0334,
+ unicodeslot=0x334,
},
{
adobename="strokeshortoverlaycmb",
category="mn",
cjkwd="a",
+ combining=0x1,
description="COMBINING SHORT STROKE OVERLAY",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0335,
+ unicodeslot=0x335,
},
{
adobename="strokelongoverlaycmb",
category="mn",
cjkwd="a",
+ combining=0x1,
description="COMBINING LONG STROKE OVERLAY",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0336,
+ unicodeslot=0x336,
},
{
adobename="solidusshortoverlaycmb",
category="mn",
cjkwd="a",
+ combining=0x1,
description="COMBINING SHORT SOLIDUS OVERLAY",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0337,
+ unicodeslot=0x337,
},
{
adobename="soliduslongoverlaycmb",
category="mn",
cjkwd="a",
+ combining=0x1,
description="COMBINING LONG SOLIDUS OVERLAY",
direction="nsm",
linebreak="cm",
mathclass="relation",
mathname="not",
- unicodeslot=0x0338,
+ unicodeslot=0x338,
},
{
adobename="ringhalfrightbelowcmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING RIGHT HALF RING BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0339,
+ unicodeslot=0x339,
},
{
adobename="bridgeinvertedbelowcmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING INVERTED BRIDGE BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x033A,
+ unicodeslot=0x33A,
},
{
adobename="squarebelowcmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING SQUARE BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x033B,
+ unicodeslot=0x33B,
},
{
adobename="seagullbelowcmb",
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING SEAGULL BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x033C,
+ unicodeslot=0x33C,
},
{
adobename="xabovecmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING X ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x033D,
+ unicodeslot=0x33D,
},
{
adobename="tildeverticalcmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING VERTICAL TILDE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x033E,
+ unicodeslot=0x33E,
},
{
adobename="dbloverlinecmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING DOUBLE OVERLINE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x033F,
+ unicodeslot=0x33F,
},
{
adobename="gravetonecmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING GRAVE TONE MARK",
direction="nsm",
linebreak="cm",
- specials={ "char", 0x0300 },
- unicodeslot=0x0340,
+ specials={ "char", 0x300 },
+ unicodeslot=0x340,
},
{
adobename="acutetonecmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING ACUTE TONE MARK",
direction="nsm",
linebreak="cm",
- specials={ "char", 0x0301 },
- unicodeslot=0x0341,
+ specials={ "char", 0x301 },
+ unicodeslot=0x341,
},
{
adobename="perispomenigreekcmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING GREEK PERISPOMENI",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0342,
+ unicodeslot=0x342,
},
{
adobename="koroniscmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING GREEK KORONIS",
direction="nsm",
linebreak="cm",
- specials={ "char", 0x0313 },
- unicodeslot=0x0343,
+ specials={ "char", 0x313 },
+ unicodeslot=0x343,
},
{
adobename="dialytikatonoscmb",
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING GREEK DIALYTIKA TONOS",
direction="nsm",
linebreak="cm",
- specials={ "char", 0x0308, 0x0301 },
- unicodeslot=0x0344,
+ specials={ "char", 0x308, 0x301 },
+ unicodeslot=0x344,
},
{
adobename="ypogegrammenigreekcmb",
category="mn",
cjkwd="a",
+ combining=0xF0,
description="COMBINING GREEK YPOGEGRAMMENI",
direction="nsm",
linebreak="cm",
- uccode=0x0399,
- unicodeslot=0x0345,
+ uccode=0x399,
+ unicodeslot=0x345,
},
{
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING BRIDGE ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0346,
+ unicodeslot=0x346,
},
{
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING EQUALS SIGN BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0347,
+ unicodeslot=0x347,
},
{
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING DOUBLE VERTICAL LINE BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0348,
+ unicodeslot=0x348,
},
{
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING LEFT ANGLE BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0349,
+ unicodeslot=0x349,
},
{
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING NOT TILDE ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x034A,
+ unicodeslot=0x34A,
},
{
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING HOMOTHETIC ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x034B,
+ unicodeslot=0x34B,
},
{
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING ALMOST EQUAL TO ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x034C,
+ unicodeslot=0x34C,
},
{
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING LEFT RIGHT ARROW BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x034D,
+ unicodeslot=0x34D,
},
{
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING UPWARDS ARROW BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x034E,
+ unicodeslot=0x34E,
},
{
category="mn",
@@ -8741,293 +8830,325 @@ characters.data={
description="COMBINING GRAPHEME JOINER",
direction="nsm",
linebreak="gl",
- unicodeslot=0x034F,
+ unicodeslot=0x34F,
},
{
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING RIGHT ARROWHEAD ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0350,
+ unicodeslot=0x350,
},
{
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING LEFT HALF RING ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0351,
+ unicodeslot=0x351,
},
{
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING FERMATA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0352,
+ unicodeslot=0x352,
},
{
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING X BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0353,
+ unicodeslot=0x353,
},
{
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING LEFT ARROWHEAD BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0354,
+ unicodeslot=0x354,
},
{
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING RIGHT ARROWHEAD BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0355,
+ unicodeslot=0x355,
},
{
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0356,
+ unicodeslot=0x356,
},
{
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING RIGHT HALF RING ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0357,
+ unicodeslot=0x357,
},
{
category="mn",
cjkwd="a",
+ combining=0xE8,
description="COMBINING DOT ABOVE RIGHT",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0358,
+ unicodeslot=0x358,
},
{
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING ASTERISK BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0359,
+ unicodeslot=0x359,
},
{
category="mn",
cjkwd="a",
+ combining=0xDC,
description="COMBINING DOUBLE RING BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x035A,
+ unicodeslot=0x35A,
},
{
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING ZIGZAG ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x035B,
+ unicodeslot=0x35B,
},
{
category="mn",
cjkwd="a",
+ combining=0xE9,
description="COMBINING DOUBLE BREVE BELOW",
direction="nsm",
linebreak="gl",
- unicodeslot=0x035C,
+ unicodeslot=0x35C,
},
{
category="mn",
cjkwd="a",
+ combining=0xEA,
description="COMBINING DOUBLE BREVE",
direction="nsm",
linebreak="gl",
- unicodeslot=0x035D,
+ unicodeslot=0x35D,
},
{
category="mn",
cjkwd="a",
+ combining=0xEA,
description="COMBINING DOUBLE MACRON",
direction="nsm",
linebreak="gl",
- unicodeslot=0x035E,
+ unicodeslot=0x35E,
},
{
category="mn",
cjkwd="a",
+ combining=0xE9,
description="COMBINING DOUBLE MACRON BELOW",
direction="nsm",
linebreak="gl",
- unicodeslot=0x035F,
+ unicodeslot=0x35F,
},
{
adobename="tildedoublecmb",
category="mn",
cjkwd="a",
+ combining=0xEA,
description="COMBINING DOUBLE TILDE",
direction="nsm",
linebreak="gl",
- unicodeslot=0x0360,
+ unicodeslot=0x360,
},
{
adobename="breveinverteddoublecmb",
category="mn",
cjkwd="a",
+ combining=0xEA,
description="COMBINING DOUBLE INVERTED BREVE",
direction="nsm",
linebreak="gl",
- unicodeslot=0x0361,
+ unicodeslot=0x361,
},
{
category="mn",
cjkwd="a",
+ combining=0xE9,
description="COMBINING DOUBLE RIGHTWARDS ARROW BELOW",
direction="nsm",
linebreak="gl",
- unicodeslot=0x0362,
+ unicodeslot=0x362,
},
{
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER A",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0363,
+ unicodeslot=0x363,
},
{
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER E",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0364,
+ unicodeslot=0x364,
},
{
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER I",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0365,
+ unicodeslot=0x365,
},
{
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER O",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0366,
+ unicodeslot=0x366,
},
{
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER U",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0367,
+ unicodeslot=0x367,
},
{
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER C",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0368,
+ unicodeslot=0x368,
},
{
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER D",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0369,
+ unicodeslot=0x369,
},
{
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER H",
direction="nsm",
linebreak="cm",
- unicodeslot=0x036A,
+ unicodeslot=0x36A,
},
{
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER M",
direction="nsm",
linebreak="cm",
- unicodeslot=0x036B,
+ unicodeslot=0x36B,
},
{
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER R",
direction="nsm",
linebreak="cm",
- unicodeslot=0x036C,
+ unicodeslot=0x36C,
},
{
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER T",
direction="nsm",
linebreak="cm",
- unicodeslot=0x036D,
+ unicodeslot=0x36D,
},
{
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER V",
direction="nsm",
linebreak="cm",
- unicodeslot=0x036E,
+ unicodeslot=0x36E,
},
{
category="mn",
cjkwd="a",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER X",
direction="nsm",
linebreak="cm",
- unicodeslot=0x036F,
+ unicodeslot=0x36F,
},
{
category="lu",
description="GREEK CAPITAL LETTER HETA",
direction="l",
linebreak="al",
- unicodeslot=0x0370,
+ unicodeslot=0x370,
},
{
category="ll",
description="GREEK SMALL LETTER HETA",
direction="l",
linebreak="al",
- unicodeslot=0x0371,
+ unicodeslot=0x371,
},
{
category="lu",
description="GREEK CAPITAL LETTER ARCHAIC SAMPI",
direction="l",
linebreak="al",
- unicodeslot=0x0372,
+ unicodeslot=0x372,
},
{
category="ll",
description="GREEK SMALL LETTER ARCHAIC SAMPI",
direction="l",
linebreak="al",
- unicodeslot=0x0373,
+ unicodeslot=0x373,
},
{
adobename="numeralsigngreek",
@@ -9035,8 +9156,8 @@ characters.data={
description="GREEK NUMERAL SIGN",
direction="on",
linebreak="al",
- specials={ "char", 0x02B9 },
- unicodeslot=0x0374,
+ specials={ "char", 0x2B9 },
+ unicodeslot=0x374,
},
{
adobename="numeralsignlowergreek",
@@ -9044,584 +9165,591 @@ characters.data={
description="GREEK LOWER NUMERAL SIGN",
direction="on",
linebreak="al",
- unicodeslot=0x0375,
+ unicodeslot=0x375,
},
{
category="lu",
description="GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA",
direction="l",
linebreak="al",
- unicodeslot=0x0376,
+ unicodeslot=0x376,
},
{
category="ll",
description="GREEK SMALL LETTER PAMPHYLIAN DIGAMMA",
direction="l",
linebreak="al",
- unicodeslot=0x0377,
+ unicodeslot=0x377,
},
- [0x037A]={
+ [0x37A]={
adobename="ypogegrammeni",
category="lm",
description="GREEK YPOGEGRAMMENI",
direction="l",
linebreak="al",
- specials={ "compat", 0x0020, 0x0345 },
- unicodeslot=0x037A,
+ specials={ "compat", 0x20, 0x345 },
+ unicodeslot=0x37A,
},
- [0x037B]={
+ [0x37B]={
category="ll",
description="GREEK SMALL REVERSED LUNATE SIGMA SYMBOL",
direction="l",
linebreak="al",
- uccode=0x03FD,
- unicodeslot=0x037B,
+ uccode=0x3FD,
+ unicodeslot=0x37B,
},
- [0x037C]={
+ [0x37C]={
category="ll",
description="GREEK SMALL DOTTED LUNATE SIGMA SYMBOL",
direction="l",
linebreak="al",
- uccode=0x03FE,
- unicodeslot=0x037C,
+ uccode=0x3FE,
+ unicodeslot=0x37C,
},
- [0x037D]={
+ [0x37D]={
category="ll",
description="GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL",
direction="l",
linebreak="al",
- uccode=0x03FF,
- unicodeslot=0x037D,
+ uccode=0x3FF,
+ unicodeslot=0x37D,
},
- [0x037E]={
+ [0x37E]={
adobename="questiongreek",
category="po",
description="GREEK QUESTION MARK",
direction="on",
linebreak="is",
- specials={ "char", 0x003B },
- unicodeslot=0x037E,
+ specials={ "char", 0x3B },
+ unicodeslot=0x37E,
+ },
+ [0x37F]={
+ category="lu",
+ description="GREEK CAPITAL LETTER YOT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x37F,
},
- [0x0384]={
+ [0x384]={
adobename="tonos",
category="sk",
contextname="greektonos",
description="GREEK TONOS",
direction="on",
linebreak="al",
- specials={ "compat", 0x0020, 0x0301 },
- unicodeslot=0x0384,
+ specials={ "compat", 0x20, 0x301 },
+ unicodeslot=0x384,
},
- [0x0385]={
+ [0x385]={
adobename="dieresistonos",
category="sk",
contextname="greekdialytikatonos",
description="GREEK DIALYTIKA TONOS",
direction="on",
linebreak="al",
- specials={ "char", 0x00A8, 0x0301 },
- unicodeslot=0x0385,
+ specials={ "char", 0xA8, 0x301 },
+ unicodeslot=0x385,
},
- [0x0386]={
+ [0x386]={
adobename="Alphatonos",
category="lu",
contextname="greekAlphatonos",
description="GREEK CAPITAL LETTER ALPHA WITH TONOS",
direction="l",
- lccode=0x03AC,
+ lccode=0x3AC,
linebreak="al",
- shcode=0x0391,
- specials={ "char", 0x0391, 0x0301 },
- unicodeslot=0x0386,
+ shcode=0x391,
+ specials={ "char", 0x391, 0x301 },
+ unicodeslot=0x386,
},
- [0x0387]={
+ [0x387]={
adobename="anoteleia",
category="po",
description="GREEK ANO TELEIA",
direction="on",
linebreak="al",
- specials={ "char", 0x00B7 },
- unicodeslot=0x0387,
+ specials={ "char", 0xB7 },
+ unicodeslot=0x387,
},
- [0x0388]={
+ [0x388]={
adobename="Epsilontonos",
category="lu",
contextname="greekEpsilontonos",
description="GREEK CAPITAL LETTER EPSILON WITH TONOS",
direction="l",
- lccode=0x03AD,
+ lccode=0x3AD,
linebreak="al",
- shcode=0x0395,
- specials={ "char", 0x0395, 0x0301 },
- unicodeslot=0x0388,
+ shcode=0x395,
+ specials={ "char", 0x395, 0x301 },
+ unicodeslot=0x388,
},
- [0x0389]={
+ [0x389]={
adobename="Etatonos",
category="lu",
contextname="greekEtatonos",
description="GREEK CAPITAL LETTER ETA WITH TONOS",
direction="l",
- lccode=0x03AE,
+ lccode=0x3AE,
linebreak="al",
- shcode=0x0397,
- specials={ "char", 0x0397, 0x0301 },
- unicodeslot=0x0389,
+ shcode=0x397,
+ specials={ "char", 0x397, 0x301 },
+ unicodeslot=0x389,
},
- [0x038A]={
+ [0x38A]={
adobename="Iotatonos",
category="lu",
contextname="greekIotatonos",
description="GREEK CAPITAL LETTER IOTA WITH TONOS",
direction="l",
- lccode=0x03AF,
+ lccode=0x3AF,
linebreak="al",
- shcode=0x0399,
- specials={ "char", 0x0399, 0x0301 },
- unicodeslot=0x038A,
+ shcode=0x399,
+ specials={ "char", 0x399, 0x301 },
+ unicodeslot=0x38A,
},
- [0x038C]={
+ [0x38C]={
adobename="Omicrontonos",
category="lu",
contextname="greekOmicrontonos",
description="GREEK CAPITAL LETTER OMICRON WITH TONOS",
direction="l",
- lccode=0x03CC,
+ lccode=0x3CC,
linebreak="al",
- shcode=0x039F,
- specials={ "char", 0x039F, 0x0301 },
- unicodeslot=0x038C,
+ shcode=0x39F,
+ specials={ "char", 0x39F, 0x301 },
+ unicodeslot=0x38C,
},
- [0x038E]={
+ [0x38E]={
adobename="Upsilontonos",
category="lu",
contextname="greekUpsilontonos",
description="GREEK CAPITAL LETTER UPSILON WITH TONOS",
direction="l",
- lccode=0x03CD,
+ lccode=0x3CD,
linebreak="al",
- shcode=0x03A5,
- specials={ "char", 0x03A5, 0x0301 },
- unicodeslot=0x038E,
+ shcode=0x3A5,
+ specials={ "char", 0x3A5, 0x301 },
+ unicodeslot=0x38E,
},
- [0x038F]={
+ [0x38F]={
adobename="Omegatonos",
category="lu",
contextname="greekOmegatonos",
description="GREEK CAPITAL LETTER OMEGA WITH TONOS",
direction="l",
- lccode=0x03CE,
+ lccode=0x3CE,
linebreak="al",
- shcode=0x03A9,
- specials={ "char", 0x03A9, 0x0301 },
- unicodeslot=0x038F,
+ shcode=0x3A9,
+ specials={ "char", 0x3A9, 0x301 },
+ unicodeslot=0x38F,
},
- [0x0390]={
+ [0x390]={
adobename="iotadieresistonos",
category="ll",
contextname="greekiotadialytikatonos",
description="GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS",
direction="l",
linebreak="al",
- shcode=0x03B9,
- specials={ "char", 0x03CA, 0x0301 },
- unicodeslot=0x0390,
+ shcode=0x3B9,
+ specials={ "char", 0x3CA, 0x301 },
+ unicodeslot=0x390,
},
- [0x0391]={
+ [0x391]={
adobename="Alpha",
category="lu",
cjkwd="a",
contextname="greekAlpha",
description="GREEK CAPITAL LETTER ALPHA",
direction="l",
- lccode=0x03B1,
+ lccode=0x3B1,
linebreak="al",
mathclass="variable",
mathname="Alpha",
- unicodeslot=0x0391,
+ unicodeslot=0x391,
},
- [0x0392]={
+ [0x392]={
adobename="Beta",
category="lu",
cjkwd="a",
contextname="greekBeta",
description="GREEK CAPITAL LETTER BETA",
direction="l",
- lccode=0x03B2,
+ lccode=0x3B2,
linebreak="al",
mathclass="variable",
mathname="Beta",
- unicodeslot=0x0392,
+ unicodeslot=0x392,
},
- [0x0393]={
+ [0x393]={
adobename="Gamma",
category="lu",
cjkwd="a",
contextname="greekGamma",
description="GREEK CAPITAL LETTER GAMMA",
direction="l",
- lccode=0x03B3,
+ lccode=0x3B3,
linebreak="al",
mathclass="variable",
mathname="Gamma",
- unicodeslot=0x0393,
+ unicodeslot=0x393,
},
- [0x0394]={
+ [0x394]={
adobename="Deltagreek",
category="lu",
cjkwd="a",
contextname="greekDelta",
description="GREEK CAPITAL LETTER DELTA",
direction="l",
- lccode=0x03B4,
+ lccode=0x3B4,
linebreak="al",
mathclass="variable",
mathname="Delta",
- unicodeslot=0x0394,
+ unicodeslot=0x394,
},
- [0x0395]={
+ [0x395]={
adobename="Epsilon",
category="lu",
cjkwd="a",
contextname="greekEpsilon",
description="GREEK CAPITAL LETTER EPSILON",
direction="l",
- lccode=0x03B5,
+ lccode=0x3B5,
linebreak="al",
mathclass="variable",
mathname="Epsilon",
- unicodeslot=0x0395,
+ unicodeslot=0x395,
},
- [0x0396]={
+ [0x396]={
adobename="Zeta",
category="lu",
cjkwd="a",
contextname="greekZeta",
description="GREEK CAPITAL LETTER ZETA",
direction="l",
- lccode=0x03B6,
+ lccode=0x3B6,
linebreak="al",
mathclass="variable",
mathname="Zeta",
- unicodeslot=0x0396,
+ unicodeslot=0x396,
},
- [0x0397]={
+ [0x397]={
adobename="Eta",
category="lu",
cjkwd="a",
contextname="greekEta",
description="GREEK CAPITAL LETTER ETA",
direction="l",
- lccode=0x03B7,
+ lccode=0x3B7,
linebreak="al",
mathclass="variable",
mathname="Eta",
- unicodeslot=0x0397,
+ unicodeslot=0x397,
},
- [0x0398]={
+ [0x398]={
adobename="Theta",
category="lu",
cjkwd="a",
contextname="greekTheta",
description="GREEK CAPITAL LETTER THETA",
direction="l",
- lccode=0x03B8,
+ lccode=0x3B8,
linebreak="al",
mathclass="variable",
mathname="Theta",
- unicodeslot=0x0398,
+ unicodeslot=0x398,
},
- [0x0399]={
+ [0x399]={
adobename="Iota",
category="lu",
cjkwd="a",
contextname="greekIota",
description="GREEK CAPITAL LETTER IOTA",
direction="l",
- lccode=0x03B9,
+ lccode=0x3B9,
linebreak="al",
mathclass="variable",
mathname="Iota",
- unicodeslot=0x0399,
+ unicodeslot=0x399,
},
- [0x039A]={
+ [0x39A]={
adobename="Kappa",
category="lu",
cjkwd="a",
contextname="greekKappa",
description="GREEK CAPITAL LETTER KAPPA",
direction="l",
- lccode=0x03BA,
+ lccode=0x3BA,
linebreak="al",
mathclass="variable",
mathname="Kappa",
- unicodeslot=0x039A,
+ unicodeslot=0x39A,
},
- [0x039B]={
+ [0x39B]={
adobename="Lambda",
category="lu",
cjkwd="a",
contextname="greekLambda",
description="GREEK CAPITAL LETTER LAMDA",
direction="l",
- lccode=0x03BB,
+ lccode=0x3BB,
linebreak="al",
mathclass="variable",
mathname="Lambda",
- unicodeslot=0x039B,
+ unicodeslot=0x39B,
},
- [0x039C]={
+ [0x39C]={
adobename="Mu",
category="lu",
cjkwd="a",
contextname="greekMu",
description="GREEK CAPITAL LETTER MU",
direction="l",
- lccode=0x03BC,
+ lccode=0x3BC,
linebreak="al",
mathclass="variable",
mathname="Mu",
- unicodeslot=0x039C,
+ unicodeslot=0x39C,
},
- [0x039D]={
+ [0x39D]={
adobename="Nu",
category="lu",
cjkwd="a",
contextname="greekNu",
description="GREEK CAPITAL LETTER NU",
direction="l",
- lccode=0x03BD,
+ lccode=0x3BD,
linebreak="al",
mathclass="variable",
mathname="Nu",
- unicodeslot=0x039D,
+ unicodeslot=0x39D,
},
- [0x039E]={
+ [0x39E]={
adobename="Xi",
category="lu",
cjkwd="a",
contextname="greekXi",
description="GREEK CAPITAL LETTER XI",
direction="l",
- lccode=0x03BE,
+ lccode=0x3BE,
linebreak="al",
mathclass="variable",
mathname="Xi",
- unicodeslot=0x039E,
+ unicodeslot=0x39E,
},
- [0x039F]={
+ [0x39F]={
adobename="Omicron",
category="lu",
cjkwd="a",
contextname="greekOmicron",
description="GREEK CAPITAL LETTER OMICRON",
direction="l",
- lccode=0x03BF,
+ lccode=0x3BF,
linebreak="al",
mathclass="variable",
mathname="Omicron",
- unicodeslot=0x039F,
+ unicodeslot=0x39F,
},
- [0x03A0]={
+ [0x3A0]={
adobename="Pi",
category="lu",
cjkwd="a",
contextname="greekPi",
description="GREEK CAPITAL LETTER PI",
direction="l",
- lccode=0x03C0,
+ lccode=0x3C0,
linebreak="al",
mathclass="variable",
mathname="Pi",
- unicodeslot=0x03A0,
+ unicodeslot=0x3A0,
},
- [0x03A1]={
+ [0x3A1]={
adobename="Rho",
category="lu",
cjkwd="a",
contextname="greekRho",
description="GREEK CAPITAL LETTER RHO",
direction="l",
- lccode=0x03C1,
+ lccode=0x3C1,
linebreak="al",
mathclass="variable",
mathname="Rho",
- unicodeslot=0x03A1,
+ unicodeslot=0x3A1,
},
- [0x03A3]={
+ [0x3A3]={
adobename="Sigma",
category="lu",
cjkwd="a",
contextname="greekSigma",
description="GREEK CAPITAL LETTER SIGMA",
direction="l",
- lccode=0x03C3,
+ lccode=0x3C3,
linebreak="al",
mathclass="variable",
mathname="Sigma",
- unicodeslot=0x03A3,
+ unicodeslot=0x3A3,
},
- [0x03A4]={
+ [0x3A4]={
adobename="Tau",
category="lu",
cjkwd="a",
contextname="greekTau",
description="GREEK CAPITAL LETTER TAU",
direction="l",
- lccode=0x03C4,
+ lccode=0x3C4,
linebreak="al",
mathclass="variable",
mathname="Tau",
- unicodeslot=0x03A4,
+ unicodeslot=0x3A4,
},
- [0x03A5]={
+ [0x3A5]={
adobename="Upsilon",
category="lu",
cjkwd="a",
contextname="greekUpsilon",
description="GREEK CAPITAL LETTER UPSILON",
direction="l",
- lccode=0x03C5,
+ lccode=0x3C5,
linebreak="al",
mathclass="variable",
mathname="Upsilon",
- unicodeslot=0x03A5,
+ unicodeslot=0x3A5,
},
- [0x03A6]={
+ [0x3A6]={
adobename="Phi",
category="lu",
cjkwd="a",
contextname="greekPhi",
description="GREEK CAPITAL LETTER PHI",
direction="l",
- lccode=0x03C6,
+ lccode=0x3C6,
linebreak="al",
mathclass="variable",
mathname="Phi",
- unicodeslot=0x03A6,
+ unicodeslot=0x3A6,
},
- [0x03A7]={
+ [0x3A7]={
adobename="Chi",
category="lu",
cjkwd="a",
contextname="greekChi",
description="GREEK CAPITAL LETTER CHI",
direction="l",
- lccode=0x03C7,
+ lccode=0x3C7,
linebreak="al",
mathclass="variable",
mathname="Chi",
- unicodeslot=0x03A7,
+ unicodeslot=0x3A7,
},
- [0x03A8]={
+ [0x3A8]={
adobename="Psi",
category="lu",
cjkwd="a",
contextname="greekPsi",
description="GREEK CAPITAL LETTER PSI",
direction="l",
- lccode=0x03C8,
+ lccode=0x3C8,
linebreak="al",
mathclass="variable",
mathname="Psi",
- unicodeslot=0x03A8,
+ unicodeslot=0x3A8,
},
- [0x03A9]={
+ [0x3A9]={
adobename="Omegagreek",
category="lu",
cjkwd="a",
contextname="greekOmega",
description="GREEK CAPITAL LETTER OMEGA",
direction="l",
- lccode=0x03C9,
+ lccode=0x3C9,
linebreak="al",
mathclass="variable",
mathname="Omega",
- unicodeslot=0x03A9,
+ unicodeslot=0x3A9,
},
- [0x03AA]={
+ [0x3AA]={
adobename="Iotadieresis",
category="lu",
contextname="greekIotadialytika",
description="GREEK CAPITAL LETTER IOTA WITH DIALYTIKA",
direction="l",
- lccode=0x03CA,
+ lccode=0x3CA,
linebreak="al",
- shcode=0x0399,
- specials={ "char", 0x0399, 0x0308 },
- unicodeslot=0x03AA,
+ shcode=0x399,
+ specials={ "char", 0x399, 0x308 },
+ unicodeslot=0x3AA,
},
- [0x03AB]={
+ [0x3AB]={
adobename="Upsilondieresis",
category="lu",
contextname="greekUpsilondialytika",
description="GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA",
direction="l",
- lccode=0x03CB,
+ lccode=0x3CB,
linebreak="al",
- shcode=0x03A5,
- specials={ "char", 0x03A5, 0x0308 },
- unicodeslot=0x03AB,
+ shcode=0x3A5,
+ specials={ "char", 0x3A5, 0x308 },
+ unicodeslot=0x3AB,
},
- [0x03AC]={
+ [0x3AC]={
adobename="alphatonos",
category="ll",
contextname="greekalphatonos",
description="GREEK SMALL LETTER ALPHA WITH TONOS",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x03B1, 0x0301 },
- uccode=0x0386,
- unicodeslot=0x03AC,
+ shcode=0x3B1,
+ specials={ "char", 0x3B1, 0x301 },
+ uccode=0x386,
+ unicodeslot=0x3AC,
},
- [0x03AD]={
+ [0x3AD]={
adobename="epsilontonos",
category="ll",
contextname="greekepsilontonos",
description="GREEK SMALL LETTER EPSILON WITH TONOS",
direction="l",
linebreak="al",
- shcode=0x03B5,
- specials={ "char", 0x03B5, 0x0301 },
- uccode=0x0388,
- unicodeslot=0x03AD,
+ shcode=0x3B5,
+ specials={ "char", 0x3B5, 0x301 },
+ uccode=0x388,
+ unicodeslot=0x3AD,
},
- [0x03AE]={
+ [0x3AE]={
adobename="etatonos",
category="ll",
contextname="greeketatonos",
description="GREEK SMALL LETTER ETA WITH TONOS",
direction="l",
linebreak="al",
- shcode=0x03B7,
- specials={ "char", 0x03B7, 0x0301 },
- uccode=0x0389,
- unicodeslot=0x03AE,
+ shcode=0x3B7,
+ specials={ "char", 0x3B7, 0x301 },
+ uccode=0x389,
+ unicodeslot=0x3AE,
},
- [0x03AF]={
+ [0x3AF]={
adobename="iotatonos",
category="ll",
contextname="greekiotatonos",
description="GREEK SMALL LETTER IOTA WITH TONOS",
direction="l",
linebreak="al",
- shcode=0x03B9,
- specials={ "char", 0x03B9, 0x0301 },
- uccode=0x038A,
- unicodeslot=0x03AF,
+ shcode=0x3B9,
+ specials={ "char", 0x3B9, 0x301 },
+ uccode=0x38A,
+ unicodeslot=0x3AF,
},
- [0x03B0]={
+ [0x3B0]={
adobename="upsilondieresistonos",
category="ll",
contextname="greekupsilondialytikatonos",
description="GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS",
direction="l",
linebreak="al",
- shcode=0x03C5,
- specials={ "char", 0x03CB, 0x0301 },
- unicodeslot=0x03B0,
+ shcode=0x3C5,
+ specials={ "char", 0x3CB, 0x301 },
+ unicodeslot=0x3B0,
},
- [0x03B1]={
+ [0x3B1]={
adobename="alpha",
category="ll",
cjkwd="a",
@@ -9631,10 +9759,10 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="alpha",
- uccode=0x0391,
- unicodeslot=0x03B1,
+ uccode=0x391,
+ unicodeslot=0x3B1,
},
- [0x03B2]={
+ [0x3B2]={
adobename="beta",
category="ll",
cjkwd="a",
@@ -9644,10 +9772,10 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="beta",
- uccode=0x0392,
- unicodeslot=0x03B2,
+ uccode=0x392,
+ unicodeslot=0x3B2,
},
- [0x03B3]={
+ [0x3B3]={
adobename="gamma",
category="ll",
cjkwd="a",
@@ -9657,10 +9785,10 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="gamma",
- uccode=0x0393,
- unicodeslot=0x03B3,
+ uccode=0x393,
+ unicodeslot=0x3B3,
},
- [0x03B4]={
+ [0x3B4]={
adobename="delta",
category="ll",
cjkwd="a",
@@ -9670,10 +9798,10 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="delta",
- uccode=0x0394,
- unicodeslot=0x03B4,
+ uccode=0x394,
+ unicodeslot=0x3B4,
},
- [0x03B5]={
+ [0x3B5]={
adobename="epsilon",
category="ll",
cjkwd="a",
@@ -9683,10 +9811,10 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="varepsilon",
- uccode=0x0395,
- unicodeslot=0x03B5,
+ uccode=0x395,
+ unicodeslot=0x3B5,
},
- [0x03B6]={
+ [0x3B6]={
adobename="zeta",
category="ll",
cjkwd="a",
@@ -9696,10 +9824,10 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="zeta",
- uccode=0x0396,
- unicodeslot=0x03B6,
+ uccode=0x396,
+ unicodeslot=0x3B6,
},
- [0x03B7]={
+ [0x3B7]={
adobename="eta",
category="ll",
cjkwd="a",
@@ -9709,10 +9837,10 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="eta",
- uccode=0x0397,
- unicodeslot=0x03B7,
+ uccode=0x397,
+ unicodeslot=0x3B7,
},
- [0x03B8]={
+ [0x3B8]={
adobename="theta",
category="ll",
cjkwd="a",
@@ -9722,10 +9850,10 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="theta",
- uccode=0x0398,
- unicodeslot=0x03B8,
+ uccode=0x398,
+ unicodeslot=0x3B8,
},
- [0x03B9]={
+ [0x3B9]={
adobename="iota",
category="ll",
cjkwd="a",
@@ -9735,10 +9863,10 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="iota",
- uccode=0x0399,
- unicodeslot=0x03B9,
+ uccode=0x399,
+ unicodeslot=0x3B9,
},
- [0x03BA]={
+ [0x3BA]={
adobename="kappa",
category="ll",
cjkwd="a",
@@ -9748,10 +9876,10 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="kappa",
- uccode=0x039A,
- unicodeslot=0x03BA,
+ uccode=0x39A,
+ unicodeslot=0x3BA,
},
- [0x03BB]={
+ [0x3BB]={
adobename="lambda",
category="ll",
cjkwd="a",
@@ -9761,10 +9889,10 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="lambda",
- uccode=0x039B,
- unicodeslot=0x03BB,
+ uccode=0x39B,
+ unicodeslot=0x3BB,
},
- [0x03BC]={
+ [0x3BC]={
adobename="mugreek",
category="ll",
cjkwd="a",
@@ -9774,10 +9902,10 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="mu",
- uccode=0x039C,
- unicodeslot=0x03BC,
+ uccode=0x39C,
+ unicodeslot=0x3BC,
},
- [0x03BD]={
+ [0x3BD]={
adobename="nu",
category="ll",
cjkwd="a",
@@ -9787,10 +9915,10 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="nu",
- uccode=0x039D,
- unicodeslot=0x03BD,
+ uccode=0x39D,
+ unicodeslot=0x3BD,
},
- [0x03BE]={
+ [0x3BE]={
adobename="xi",
category="ll",
cjkwd="a",
@@ -9800,10 +9928,10 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="xi",
- uccode=0x039E,
- unicodeslot=0x03BE,
+ uccode=0x39E,
+ unicodeslot=0x3BE,
},
- [0x03BF]={
+ [0x3BF]={
adobename="omicron",
category="ll",
cjkwd="a",
@@ -9813,10 +9941,10 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="omicron",
- uccode=0x039F,
- unicodeslot=0x03BF,
+ uccode=0x39F,
+ unicodeslot=0x3BF,
},
- [0x03C0]={
+ [0x3C0]={
adobename="pi",
category="ll",
cjkwd="a",
@@ -9826,10 +9954,10 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="pi",
- uccode=0x03A0,
- unicodeslot=0x03C0,
+ uccode=0x3A0,
+ unicodeslot=0x3C0,
},
- [0x03C1]={
+ [0x3C1]={
adobename="rho",
category="ll",
cjkwd="a",
@@ -9839,10 +9967,10 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="rho",
- uccode=0x03A1,
- unicodeslot=0x03C1,
+ uccode=0x3A1,
+ unicodeslot=0x3C1,
},
- [0x03C2]={
+ [0x3C2]={
adobename="sigmafinal",
category="ll",
contextname="greekfinalsigma",
@@ -9851,10 +9979,10 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="varsigma",
- uccode=0x03A3,
- unicodeslot=0x03C2,
+ uccode=0x3A3,
+ unicodeslot=0x3C2,
},
- [0x03C3]={
+ [0x3C3]={
adobename="sigma",
category="ll",
cjkwd="a",
@@ -9864,10 +9992,10 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="sigma",
- uccode=0x03A3,
- unicodeslot=0x03C3,
+ uccode=0x3A3,
+ unicodeslot=0x3C3,
},
- [0x03C4]={
+ [0x3C4]={
adobename="tau",
category="ll",
cjkwd="a",
@@ -9877,10 +10005,10 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="tau",
- uccode=0x03A4,
- unicodeslot=0x03C4,
+ uccode=0x3A4,
+ unicodeslot=0x3C4,
},
- [0x03C5]={
+ [0x3C5]={
adobename="upsilon",
category="ll",
cjkwd="a",
@@ -9890,10 +10018,10 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="upsilon",
- uccode=0x03A5,
- unicodeslot=0x03C5,
+ uccode=0x3A5,
+ unicodeslot=0x3C5,
},
- [0x03C6]={
+ [0x3C6]={
adobename="phi",
category="ll",
cjkwd="a",
@@ -9903,10 +10031,10 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="varphi",
- uccode=0x03A6,
- unicodeslot=0x03C6,
+ uccode=0x3A6,
+ unicodeslot=0x3C6,
},
- [0x03C7]={
+ [0x3C7]={
adobename="chi",
category="ll",
cjkwd="a",
@@ -9916,10 +10044,10 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="chi",
- uccode=0x03A7,
- unicodeslot=0x03C7,
+ uccode=0x3A7,
+ unicodeslot=0x3C7,
},
- [0x03C8]={
+ [0x3C8]={
adobename="psi",
category="ll",
cjkwd="a",
@@ -9929,10 +10057,10 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="psi",
- uccode=0x03A8,
- unicodeslot=0x03C8,
+ uccode=0x3A8,
+ unicodeslot=0x3C8,
},
- [0x03C9]={
+ [0x3C9]={
adobename="omega",
category="ll",
cjkwd="a",
@@ -9942,87 +10070,87 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="omega",
- uccode=0x03A9,
- unicodeslot=0x03C9,
+ uccode=0x3A9,
+ unicodeslot=0x3C9,
},
- [0x03CA]={
+ [0x3CA]={
adobename="iotadieresis",
category="ll",
contextname="greekiotadialytika",
description="GREEK SMALL LETTER IOTA WITH DIALYTIKA",
direction="l",
linebreak="al",
- shcode=0x03B9,
- specials={ "char", 0x03B9, 0x0308 },
- uccode=0x03AA,
- unicodeslot=0x03CA,
+ shcode=0x3B9,
+ specials={ "char", 0x3B9, 0x308 },
+ uccode=0x3AA,
+ unicodeslot=0x3CA,
},
- [0x03CB]={
+ [0x3CB]={
adobename="upsilondieresis",
category="ll",
contextname="greekupsilondiaeresis",
description="GREEK SMALL LETTER UPSILON WITH DIALYTIKA",
direction="l",
linebreak="al",
- shcode=0x03C5,
- specials={ "char", 0x03C5, 0x0308 },
- uccode=0x03AB,
- unicodeslot=0x03CB,
+ shcode=0x3C5,
+ specials={ "char", 0x3C5, 0x308 },
+ uccode=0x3AB,
+ unicodeslot=0x3CB,
},
- [0x03CC]={
+ [0x3CC]={
adobename="omicrontonos",
category="ll",
contextname="greekomicrontonos",
description="GREEK SMALL LETTER OMICRON WITH TONOS",
direction="l",
linebreak="al",
- shcode=0x03BF,
- specials={ "char", 0x03BF, 0x0301 },
- uccode=0x038C,
- unicodeslot=0x03CC,
+ shcode=0x3BF,
+ specials={ "char", 0x3BF, 0x301 },
+ uccode=0x38C,
+ unicodeslot=0x3CC,
},
- [0x03CD]={
+ [0x3CD]={
adobename="upsilontonos",
category="ll",
contextname="greekupsilontonos",
description="GREEK SMALL LETTER UPSILON WITH TONOS",
direction="l",
linebreak="al",
- shcode=0x03C5,
- specials={ "char", 0x03C5, 0x0301 },
- uccode=0x038E,
- unicodeslot=0x03CD,
+ shcode=0x3C5,
+ specials={ "char", 0x3C5, 0x301 },
+ uccode=0x38E,
+ unicodeslot=0x3CD,
},
- [0x03CE]={
+ [0x3CE]={
adobename="omegatonos",
category="ll",
contextname="greekomegatonos",
description="GREEK SMALL LETTER OMEGA WITH TONOS",
direction="l",
linebreak="al",
- shcode=0x03C9,
- specials={ "char", 0x03C9, 0x0301 },
- uccode=0x038F,
- unicodeslot=0x03CE,
+ shcode=0x3C9,
+ specials={ "char", 0x3C9, 0x301 },
+ uccode=0x38F,
+ unicodeslot=0x3CE,
},
- [0x03CF]={
+ [0x3CF]={
category="lu",
description="GREEK CAPITAL KAI SYMBOL",
direction="l",
linebreak="al",
- unicodeslot=0x03CF,
+ unicodeslot=0x3CF,
},
- [0x03D0]={
+ [0x3D0]={
adobename="betasymbolgreek",
category="ll",
description="GREEK BETA SYMBOL",
direction="l",
linebreak="al",
- specials={ "compat", 0x03B2 },
- uccode=0x0392,
- unicodeslot=0x03D0,
+ specials={ "compat", 0x3B2 },
+ uccode=0x392,
+ unicodeslot=0x3D0,
},
- [0x03D1]={
+ [0x3D1]={
adobename="thetasymbolgreek",
category="ll",
contextname="greekthetaalt",
@@ -10031,38 +10159,38 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="varTheta",
- specials={ "compat", 0x03B8 },
- uccode=0x0398,
- unicodeslot=0x03D1,
+ specials={ "compat", 0x3B8 },
+ uccode=0x398,
+ unicodeslot=0x3D1,
},
- [0x03D2]={
+ [0x3D2]={
adobename="Upsilonhooksymbol",
category="lu",
description="GREEK UPSILON WITH HOOK SYMBOL",
direction="l",
linebreak="al",
- specials={ "compat", 0x03A5 },
- unicodeslot=0x03D2,
+ specials={ "compat", 0x3A5 },
+ unicodeslot=0x3D2,
},
- [0x03D3]={
+ [0x3D3]={
adobename="Upsilonacutehooksymbolgreek",
category="lu",
description="GREEK UPSILON WITH ACUTE AND HOOK SYMBOL",
direction="l",
linebreak="al",
- specials={ "char", 0x03D2, 0x0301 },
- unicodeslot=0x03D3,
+ specials={ "char", 0x3D2, 0x301 },
+ unicodeslot=0x3D3,
},
- [0x03D4]={
+ [0x3D4]={
adobename="Upsilondieresishooksymbolgreek",
category="lu",
description="GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL",
direction="l",
linebreak="al",
- specials={ "char", 0x03D2, 0x0308 },
- unicodeslot=0x03D4,
+ specials={ "char", 0x3D2, 0x308 },
+ unicodeslot=0x3D4,
},
- [0x03D5]={
+ [0x3D5]={
adobename="phisymbolgreek",
category="ll",
contextname="greekphialt",
@@ -10071,11 +10199,11 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="phi",
- specials={ "compat", 0x03C6 },
- uccode=0x03A6,
- unicodeslot=0x03D5,
+ specials={ "compat", 0x3C6 },
+ uccode=0x3A6,
+ unicodeslot=0x3D5,
},
- [0x03D6]={
+ [0x3D6]={
adobename="pisymbolgreek",
category="ll",
contextname="greekpialt",
@@ -10084,235 +10212,235 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="varpi",
- specials={ "compat", 0x03C0 },
- uccode=0x03A0,
- unicodeslot=0x03D6,
+ specials={ "compat", 0x3C0 },
+ uccode=0x3A0,
+ unicodeslot=0x3D6,
},
- [0x03D7]={
+ [0x3D7]={
category="ll",
description="GREEK KAI SYMBOL",
direction="l",
linebreak="al",
- unicodeslot=0x03D7,
+ unicodeslot=0x3D7,
},
- [0x03D8]={
+ [0x3D8]={
category="lu",
description="GREEK LETTER ARCHAIC KOPPA",
direction="l",
- lccode=0x03D9,
+ lccode=0x3D9,
linebreak="al",
- unicodeslot=0x03D8,
+ unicodeslot=0x3D8,
},
- [0x03D9]={
+ [0x3D9]={
category="ll",
contextname="greekkoppa",
description="GREEK SMALL LETTER ARCHAIC KOPPA",
direction="l",
linebreak="al",
- uccode=0x03D8,
- unicodeslot=0x03D9,
+ uccode=0x3D8,
+ unicodeslot=0x3D9,
},
- [0x03DA]={
+ [0x3DA]={
adobename="Stigmagreek",
category="lu",
description="GREEK LETTER STIGMA",
direction="l",
- lccode=0x03DB,
+ lccode=0x3DB,
linebreak="al",
- unicodeslot=0x03DA,
+ unicodeslot=0x3DA,
},
- [0x03DB]={
+ [0x3DB]={
category="ll",
contextname="greekstigma",
description="GREEK SMALL LETTER STIGMA",
direction="l",
linebreak="al",
- uccode=0x03DA,
- unicodeslot=0x03DB,
+ uccode=0x3DA,
+ unicodeslot=0x3DB,
},
- [0x03DC]={
+ [0x3DC]={
adobename="Digammagreek",
category="lu",
description="GREEK LETTER DIGAMMA",
direction="l",
- lccode=0x03DD,
+ lccode=0x3DD,
linebreak="al",
mathclass="variable",
mathname="digamma",
- unicodeslot=0x03DC,
+ unicodeslot=0x3DC,
},
- [0x03DD]={
+ [0x3DD]={
category="ll",
contextname="greekdigamma",
description="GREEK SMALL LETTER DIGAMMA",
direction="l",
linebreak="al",
- uccode=0x03DC,
- unicodeslot=0x03DD,
+ uccode=0x3DC,
+ unicodeslot=0x3DD,
},
- [0x03DE]={
+ [0x3DE]={
adobename="Koppagreek",
category="lu",
description="GREEK LETTER KOPPA",
direction="l",
- lccode=0x03DF,
+ lccode=0x3DF,
linebreak="al",
- unicodeslot=0x03DE,
+ unicodeslot=0x3DE,
},
- [0x03DF]={
+ [0x3DF]={
category="ll",
contextname="greeknumkoppa",
description="GREEK SMALL LETTER KOPPA",
direction="l",
linebreak="al",
- uccode=0x03DE,
- unicodeslot=0x03DF,
+ uccode=0x3DE,
+ unicodeslot=0x3DF,
},
- [0x03E0]={
+ [0x3E0]={
adobename="Sampigreek",
category="lu",
description="GREEK LETTER SAMPI",
direction="l",
- lccode=0x03E1,
+ lccode=0x3E1,
linebreak="al",
- unicodeslot=0x03E0,
+ unicodeslot=0x3E0,
},
- [0x03E1]={
+ [0x3E1]={
category="ll",
contextname="greeksampi",
description="GREEK SMALL LETTER SAMPI",
direction="l",
linebreak="al",
- uccode=0x03E0,
- unicodeslot=0x03E1,
+ uccode=0x3E0,
+ unicodeslot=0x3E1,
},
- [0x03E2]={
+ [0x3E2]={
adobename="Sheicoptic",
category="lu",
description="COPTIC CAPITAL LETTER SHEI",
direction="l",
- lccode=0x03E3,
+ lccode=0x3E3,
linebreak="al",
- unicodeslot=0x03E2,
+ unicodeslot=0x3E2,
},
- [0x03E3]={
+ [0x3E3]={
adobename="sheicoptic",
category="ll",
description="COPTIC SMALL LETTER SHEI",
direction="l",
linebreak="al",
- uccode=0x03E2,
- unicodeslot=0x03E3,
+ uccode=0x3E2,
+ unicodeslot=0x3E3,
},
- [0x03E4]={
+ [0x3E4]={
adobename="Feicoptic",
category="lu",
description="COPTIC CAPITAL LETTER FEI",
direction="l",
- lccode=0x03E5,
+ lccode=0x3E5,
linebreak="al",
- unicodeslot=0x03E4,
+ unicodeslot=0x3E4,
},
- [0x03E5]={
+ [0x3E5]={
adobename="feicoptic",
category="ll",
description="COPTIC SMALL LETTER FEI",
direction="l",
linebreak="al",
- uccode=0x03E4,
- unicodeslot=0x03E5,
+ uccode=0x3E4,
+ unicodeslot=0x3E5,
},
- [0x03E6]={
+ [0x3E6]={
adobename="Kheicoptic",
category="lu",
description="COPTIC CAPITAL LETTER KHEI",
direction="l",
- lccode=0x03E7,
+ lccode=0x3E7,
linebreak="al",
- unicodeslot=0x03E6,
+ unicodeslot=0x3E6,
},
- [0x03E7]={
+ [0x3E7]={
adobename="kheicoptic",
category="ll",
description="COPTIC SMALL LETTER KHEI",
direction="l",
linebreak="al",
- uccode=0x03E6,
- unicodeslot=0x03E7,
+ uccode=0x3E6,
+ unicodeslot=0x3E7,
},
- [0x03E8]={
+ [0x3E8]={
adobename="Horicoptic",
category="lu",
description="COPTIC CAPITAL LETTER HORI",
direction="l",
- lccode=0x03E9,
+ lccode=0x3E9,
linebreak="al",
- unicodeslot=0x03E8,
+ unicodeslot=0x3E8,
},
- [0x03E9]={
+ [0x3E9]={
adobename="horicoptic",
category="ll",
description="COPTIC SMALL LETTER HORI",
direction="l",
linebreak="al",
- uccode=0x03E8,
- unicodeslot=0x03E9,
+ uccode=0x3E8,
+ unicodeslot=0x3E9,
},
- [0x03EA]={
+ [0x3EA]={
adobename="Gangiacoptic",
category="lu",
description="COPTIC CAPITAL LETTER GANGIA",
direction="l",
- lccode=0x03EB,
+ lccode=0x3EB,
linebreak="al",
- unicodeslot=0x03EA,
+ unicodeslot=0x3EA,
},
- [0x03EB]={
+ [0x3EB]={
adobename="gangiacoptic",
category="ll",
description="COPTIC SMALL LETTER GANGIA",
direction="l",
linebreak="al",
- uccode=0x03EA,
- unicodeslot=0x03EB,
+ uccode=0x3EA,
+ unicodeslot=0x3EB,
},
- [0x03EC]={
+ [0x3EC]={
adobename="Shimacoptic",
category="lu",
description="COPTIC CAPITAL LETTER SHIMA",
direction="l",
- lccode=0x03ED,
+ lccode=0x3ED,
linebreak="al",
- unicodeslot=0x03EC,
+ unicodeslot=0x3EC,
},
- [0x03ED]={
+ [0x3ED]={
adobename="shimacoptic",
category="ll",
description="COPTIC SMALL LETTER SHIMA",
direction="l",
linebreak="al",
- uccode=0x03EC,
- unicodeslot=0x03ED,
+ uccode=0x3EC,
+ unicodeslot=0x3ED,
},
- [0x03EE]={
+ [0x3EE]={
adobename="Deicoptic",
category="lu",
description="COPTIC CAPITAL LETTER DEI",
direction="l",
- lccode=0x03EF,
+ lccode=0x3EF,
linebreak="al",
- unicodeslot=0x03EE,
+ unicodeslot=0x3EE,
},
- [0x03EF]={
+ [0x3EF]={
adobename="deicoptic",
category="ll",
description="COPTIC SMALL LETTER DEI",
direction="l",
linebreak="al",
- uccode=0x03EE,
- unicodeslot=0x03EF,
+ uccode=0x3EE,
+ unicodeslot=0x3EF,
},
- [0x03F0]={
+ [0x3F0]={
adobename="kappasymbolgreek",
category="ll",
description="GREEK KAPPA SYMBOL",
@@ -10320,50 +10448,50 @@ characters.data={
linebreak="al",
mathclass="ordinary",
mathname="varkappa",
- specials={ "compat", 0x03BA },
- uccode=0x039A,
- unicodeslot=0x03F0,
+ specials={ "compat", 0x3BA },
+ uccode=0x39A,
+ unicodeslot=0x3F0,
},
- [0x03F1]={
+ [0x3F1]={
adobename="rhosymbolgreek",
category="ll",
contextname="greekrhoalt",
description="GREEK RHO SYMBOL",
direction="l",
linebreak="al",
- specials={ "compat", 0x03C1 },
- uccode=0x03A1,
- unicodeslot=0x03F1,
+ specials={ "compat", 0x3C1 },
+ uccode=0x3A1,
+ unicodeslot=0x3F1,
},
- [0x03F2]={
+ [0x3F2]={
adobename="sigmalunatesymbolgreek",
category="ll",
contextname="greeksigmalunate",
description="GREEK LUNATE SIGMA SYMBOL",
direction="l",
linebreak="al",
- specials={ "compat", 0x03C2 },
- uccode=0x03F9,
- unicodeslot=0x03F2,
+ specials={ "compat", 0x3C2 },
+ uccode=0x3F9,
+ unicodeslot=0x3F2,
},
- [0x03F3]={
+ [0x3F3]={
adobename="yotgreek",
category="ll",
description="GREEK LETTER YOT",
direction="l",
linebreak="al",
- unicodeslot=0x03F3,
+ unicodeslot=0x3F3,
},
- [0x03F4]={
+ [0x3F4]={
category="lu",
description="GREEK CAPITAL THETA SYMBOL",
direction="l",
- lccode=0x03B8,
+ lccode=0x3B8,
linebreak="al",
- specials={ "compat", 0x0398 },
- unicodeslot=0x03F4,
+ specials={ "compat", 0x398 },
+ unicodeslot=0x3F4,
},
- [0x03F5]={
+ [0x3F5]={
category="ll",
contextname="greekepsilonalt",
description="GREEK LUNATE EPSILON SYMBOL",
@@ -10371,614 +10499,614 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="epsilon",
- specials={ "compat", 0x03B5 },
- uccode=0x0395,
- unicodeslot=0x03F5,
+ specials={ "compat", 0x3B5 },
+ uccode=0x395,
+ unicodeslot=0x3F5,
},
- [0x03F6]={
+ [0x3F6]={
category="sm",
description="GREEK REVERSED LUNATE EPSILON SYMBOL",
direction="on",
linebreak="al",
mathclass="variable",
mathname="backepsilon",
- unicodeslot=0x03F6,
+ unicodeslot=0x3F6,
},
- [0x03F7]={
+ [0x3F7]={
category="lu",
description="GREEK CAPITAL LETTER SHO",
direction="l",
- lccode=0x03F8,
+ lccode=0x3F8,
linebreak="al",
- unicodeslot=0x03F7,
+ unicodeslot=0x3F7,
},
- [0x03F8]={
+ [0x3F8]={
category="ll",
description="GREEK SMALL LETTER SHO",
direction="l",
linebreak="al",
- uccode=0x03F7,
- unicodeslot=0x03F8,
+ uccode=0x3F7,
+ unicodeslot=0x3F8,
},
- [0x03F9]={
+ [0x3F9]={
category="lu",
contextname="greekSigmalunate",
description="GREEK CAPITAL LUNATE SIGMA SYMBOL",
direction="l",
- lccode=0x03F2,
+ lccode=0x3F2,
linebreak="al",
- specials={ "compat", 0x03A3 },
- unicodeslot=0x03F9,
+ specials={ "compat", 0x3A3 },
+ unicodeslot=0x3F9,
},
- [0x03FA]={
+ [0x3FA]={
category="lu",
description="GREEK CAPITAL LETTER SAN",
direction="l",
- lccode=0x03FB,
+ lccode=0x3FB,
linebreak="al",
- unicodeslot=0x03FA,
+ unicodeslot=0x3FA,
},
- [0x03FB]={
+ [0x3FB]={
category="ll",
description="GREEK SMALL LETTER SAN",
direction="l",
linebreak="al",
- uccode=0x03FA,
- unicodeslot=0x03FB,
+ uccode=0x3FA,
+ unicodeslot=0x3FB,
},
- [0x03FC]={
+ [0x3FC]={
category="ll",
description="GREEK RHO WITH STROKE SYMBOL",
direction="l",
linebreak="al",
- unicodeslot=0x03FC,
+ unicodeslot=0x3FC,
},
- [0x03FD]={
+ [0x3FD]={
category="lu",
description="GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL",
direction="l",
- lccode=0x037B,
+ lccode=0x37B,
linebreak="al",
- unicodeslot=0x03FD,
+ unicodeslot=0x3FD,
},
- [0x03FE]={
+ [0x3FE]={
category="lu",
description="GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL",
direction="l",
- lccode=0x037C,
+ lccode=0x37C,
linebreak="al",
- unicodeslot=0x03FE,
+ unicodeslot=0x3FE,
},
- [0x03FF]={
+ [0x3FF]={
category="lu",
description="GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL",
direction="l",
- lccode=0x037D,
+ lccode=0x37D,
linebreak="al",
- unicodeslot=0x03FF,
+ unicodeslot=0x3FF,
},
- [0x0400]={
+ [0x400]={
category="lu",
contextname="cyrillicEgrave",
description="CYRILLIC CAPITAL LETTER IE WITH GRAVE",
direction="l",
- lccode=0x0450,
+ lccode=0x450,
linebreak="al",
- shcode=0x0415,
- specials={ "char", 0x0415, 0x0300 },
- unicodeslot=0x0400,
+ shcode=0x415,
+ specials={ "char", 0x415, 0x300 },
+ unicodeslot=0x400,
},
- [0x0401]={
+ [0x401]={
adobename="afii10023",
category="lu",
cjkwd="a",
contextname="cyrillicYO",
description="CYRILLIC CAPITAL LETTER IO",
direction="l",
- lccode=0x0451,
+ lccode=0x451,
linebreak="al",
- specials={ "char", 0x0415, 0x0308 },
- unicodeslot=0x0401,
+ specials={ "char", 0x415, 0x308 },
+ unicodeslot=0x401,
},
- [0x0402]={
+ [0x402]={
adobename="afii10051",
category="lu",
contextname="cyrillicDJE",
description="CYRILLIC CAPITAL LETTER DJE",
direction="l",
- lccode=0x0452,
+ lccode=0x452,
linebreak="al",
- unicodeslot=0x0402,
+ unicodeslot=0x402,
},
- [0x0403]={
+ [0x403]={
adobename="afii10052",
category="lu",
contextname="cyrillicGJE",
description="CYRILLIC CAPITAL LETTER GJE",
direction="l",
- lccode=0x0453,
+ lccode=0x453,
linebreak="al",
- specials={ "char", 0x0413, 0x0301 },
- unicodeslot=0x0403,
+ specials={ "char", 0x413, 0x301 },
+ unicodeslot=0x403,
},
- [0x0404]={
+ [0x404]={
adobename="afii10053",
category="lu",
contextname="cyrillicIE",
description="CYRILLIC CAPITAL LETTER UKRAINIAN IE",
direction="l",
- lccode=0x0454,
+ lccode=0x454,
linebreak="al",
- unicodeslot=0x0404,
+ unicodeslot=0x404,
},
- [0x0405]={
+ [0x405]={
adobename="afii10054",
category="lu",
contextname="cyrillicDZE",
description="CYRILLIC CAPITAL LETTER DZE",
direction="l",
- lccode=0x0455,
+ lccode=0x455,
linebreak="al",
- unicodeslot=0x0405,
+ unicodeslot=0x405,
},
- [0x0406]={
+ [0x406]={
adobename="afii10055",
category="lu",
contextname="cyrillicII",
description="CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I",
direction="l",
- lccode=0x0456,
+ lccode=0x456,
linebreak="al",
- unicodeslot=0x0406,
+ unicodeslot=0x406,
},
- [0x0407]={
+ [0x407]={
adobename="afii10056",
category="lu",
contextname="cyrillicYI",
description="CYRILLIC CAPITAL LETTER YI",
direction="l",
- lccode=0x0457,
+ lccode=0x457,
linebreak="al",
- specials={ "char", 0x0406, 0x0308 },
- unicodeslot=0x0407,
+ specials={ "char", 0x406, 0x308 },
+ unicodeslot=0x407,
},
- [0x0408]={
+ [0x408]={
adobename="afii10057",
category="lu",
contextname="cyrillicJE",
description="CYRILLIC CAPITAL LETTER JE",
direction="l",
- lccode=0x0458,
+ lccode=0x458,
linebreak="al",
- unicodeslot=0x0408,
+ unicodeslot=0x408,
},
- [0x0409]={
+ [0x409]={
adobename="afii10058",
category="lu",
contextname="cyrillicLJE",
description="CYRILLIC CAPITAL LETTER LJE",
direction="l",
- lccode=0x0459,
+ lccode=0x459,
linebreak="al",
- unicodeslot=0x0409,
+ unicodeslot=0x409,
},
- [0x040A]={
+ [0x40A]={
adobename="afii10059",
category="lu",
contextname="cyrillicNJE",
description="CYRILLIC CAPITAL LETTER NJE",
direction="l",
- lccode=0x045A,
+ lccode=0x45A,
linebreak="al",
- unicodeslot=0x040A,
+ unicodeslot=0x40A,
},
- [0x040B]={
+ [0x40B]={
adobename="afii10060",
category="lu",
contextname="cyrillicTSHE",
description="CYRILLIC CAPITAL LETTER TSHE",
direction="l",
- lccode=0x045B,
+ lccode=0x45B,
linebreak="al",
- unicodeslot=0x040B,
+ unicodeslot=0x40B,
},
- [0x040C]={
+ [0x40C]={
adobename="afii10061",
category="lu",
contextname="cyrillicKJE",
description="CYRILLIC CAPITAL LETTER KJE",
direction="l",
- lccode=0x045C,
+ lccode=0x45C,
linebreak="al",
- specials={ "char", 0x041A, 0x0301 },
- unicodeslot=0x040C,
+ specials={ "char", 0x41A, 0x301 },
+ unicodeslot=0x40C,
},
- [0x040D]={
+ [0x40D]={
category="lu",
contextname="cyrillicIgrave",
description="CYRILLIC CAPITAL LETTER I WITH GRAVE",
direction="l",
- lccode=0x045D,
+ lccode=0x45D,
linebreak="al",
- shcode=0x0418,
- specials={ "char", 0x0418, 0x0300 },
- unicodeslot=0x040D,
+ shcode=0x418,
+ specials={ "char", 0x418, 0x300 },
+ unicodeslot=0x40D,
},
- [0x040E]={
+ [0x40E]={
adobename="afii10062",
category="lu",
contextname="cyrillicUSHRT",
description="CYRILLIC CAPITAL LETTER SHORT U",
direction="l",
- lccode=0x045E,
+ lccode=0x45E,
linebreak="al",
- specials={ "char", 0x0423, 0x0306 },
- unicodeslot=0x040E,
+ specials={ "char", 0x423, 0x306 },
+ unicodeslot=0x40E,
},
- [0x040F]={
+ [0x40F]={
adobename="afii10145",
category="lu",
contextname="cyrillicDZHE",
description="CYRILLIC CAPITAL LETTER DZHE",
direction="l",
- lccode=0x045F,
+ lccode=0x45F,
linebreak="al",
- unicodeslot=0x040F,
+ unicodeslot=0x40F,
},
- [0x0410]={
+ [0x410]={
adobename="afii10017",
category="lu",
cjkwd="a",
contextname="cyrillicA",
description="CYRILLIC CAPITAL LETTER A",
direction="l",
- lccode=0x0430,
+ lccode=0x430,
linebreak="al",
- unicodeslot=0x0410,
+ unicodeslot=0x410,
},
- [0x0411]={
+ [0x411]={
adobename="afii10018",
category="lu",
cjkwd="a",
contextname="cyrillicB",
description="CYRILLIC CAPITAL LETTER BE",
direction="l",
- lccode=0x0431,
+ lccode=0x431,
linebreak="al",
- unicodeslot=0x0411,
+ unicodeslot=0x411,
},
- [0x0412]={
+ [0x412]={
adobename="afii10019",
category="lu",
cjkwd="a",
contextname="cyrillicV",
description="CYRILLIC CAPITAL LETTER VE",
direction="l",
- lccode=0x0432,
+ lccode=0x432,
linebreak="al",
- unicodeslot=0x0412,
+ unicodeslot=0x412,
},
- [0x0413]={
+ [0x413]={
adobename="afii10020",
category="lu",
cjkwd="a",
contextname="cyrillicG",
description="CYRILLIC CAPITAL LETTER GHE",
direction="l",
- lccode=0x0433,
+ lccode=0x433,
linebreak="al",
- unicodeslot=0x0413,
+ unicodeslot=0x413,
},
- [0x0414]={
+ [0x414]={
adobename="afii10021",
category="lu",
cjkwd="a",
contextname="cyrillicD",
description="CYRILLIC CAPITAL LETTER DE",
direction="l",
- lccode=0x0434,
+ lccode=0x434,
linebreak="al",
- unicodeslot=0x0414,
+ unicodeslot=0x414,
},
- [0x0415]={
+ [0x415]={
adobename="afii10022",
category="lu",
cjkwd="a",
contextname="cyrillicE",
description="CYRILLIC CAPITAL LETTER IE",
direction="l",
- lccode=0x0435,
+ lccode=0x435,
linebreak="al",
- unicodeslot=0x0415,
+ unicodeslot=0x415,
},
- [0x0416]={
+ [0x416]={
adobename="afii10024",
category="lu",
cjkwd="a",
contextname="cyrillicZH",
description="CYRILLIC CAPITAL LETTER ZHE",
direction="l",
- lccode=0x0436,
+ lccode=0x436,
linebreak="al",
- unicodeslot=0x0416,
+ unicodeslot=0x416,
},
- [0x0417]={
+ [0x417]={
adobename="afii10025",
category="lu",
cjkwd="a",
contextname="cyrillicZ",
description="CYRILLIC CAPITAL LETTER ZE",
direction="l",
- lccode=0x0437,
+ lccode=0x437,
linebreak="al",
- unicodeslot=0x0417,
+ unicodeslot=0x417,
},
- [0x0418]={
+ [0x418]={
adobename="afii10026",
category="lu",
cjkwd="a",
contextname="cyrillicI",
description="CYRILLIC CAPITAL LETTER I",
direction="l",
- lccode=0x0438,
+ lccode=0x438,
linebreak="al",
- unicodeslot=0x0418,
+ unicodeslot=0x418,
},
- [0x0419]={
+ [0x419]={
adobename="afii10027",
category="lu",
cjkwd="a",
contextname="cyrillicISHRT",
description="CYRILLIC CAPITAL LETTER SHORT I",
direction="l",
- lccode=0x0439,
+ lccode=0x439,
linebreak="al",
- specials={ "char", 0x0418, 0x0306 },
- unicodeslot=0x0419,
+ specials={ "char", 0x418, 0x306 },
+ unicodeslot=0x419,
},
- [0x041A]={
+ [0x41A]={
adobename="afii10028",
category="lu",
cjkwd="a",
contextname="cyrillicK",
description="CYRILLIC CAPITAL LETTER KA",
direction="l",
- lccode=0x043A,
+ lccode=0x43A,
linebreak="al",
- unicodeslot=0x041A,
+ unicodeslot=0x41A,
},
- [0x041B]={
+ [0x41B]={
adobename="afii10029",
category="lu",
cjkwd="a",
contextname="cyrillicL",
description="CYRILLIC CAPITAL LETTER EL",
direction="l",
- lccode=0x043B,
+ lccode=0x43B,
linebreak="al",
- unicodeslot=0x041B,
+ unicodeslot=0x41B,
},
- [0x041C]={
+ [0x41C]={
adobename="afii10030",
category="lu",
cjkwd="a",
contextname="cyrillicM",
description="CYRILLIC CAPITAL LETTER EM",
direction="l",
- lccode=0x043C,
+ lccode=0x43C,
linebreak="al",
- unicodeslot=0x041C,
+ unicodeslot=0x41C,
},
- [0x041D]={
+ [0x41D]={
adobename="afii10031",
category="lu",
cjkwd="a",
contextname="cyrillicN",
description="CYRILLIC CAPITAL LETTER EN",
direction="l",
- lccode=0x043D,
+ lccode=0x43D,
linebreak="al",
- unicodeslot=0x041D,
+ unicodeslot=0x41D,
},
- [0x041E]={
+ [0x41E]={
adobename="afii10032",
category="lu",
cjkwd="a",
contextname="cyrillicO",
description="CYRILLIC CAPITAL LETTER O",
direction="l",
- lccode=0x043E,
+ lccode=0x43E,
linebreak="al",
- unicodeslot=0x041E,
+ unicodeslot=0x41E,
},
- [0x041F]={
+ [0x41F]={
adobename="afii10033",
category="lu",
cjkwd="a",
contextname="cyrillicP",
description="CYRILLIC CAPITAL LETTER PE",
direction="l",
- lccode=0x043F,
+ lccode=0x43F,
linebreak="al",
- unicodeslot=0x041F,
+ unicodeslot=0x41F,
},
- [0x0420]={
+ [0x420]={
adobename="afii10034",
category="lu",
cjkwd="a",
contextname="cyrillicR",
description="CYRILLIC CAPITAL LETTER ER",
direction="l",
- lccode=0x0440,
+ lccode=0x440,
linebreak="al",
- unicodeslot=0x0420,
+ unicodeslot=0x420,
},
- [0x0421]={
+ [0x421]={
adobename="afii10035",
category="lu",
cjkwd="a",
contextname="cyrillicS",
description="CYRILLIC CAPITAL LETTER ES",
direction="l",
- lccode=0x0441,
+ lccode=0x441,
linebreak="al",
- unicodeslot=0x0421,
+ unicodeslot=0x421,
},
- [0x0422]={
+ [0x422]={
adobename="afii10036",
category="lu",
cjkwd="a",
contextname="cyrillicT",
description="CYRILLIC CAPITAL LETTER TE",
direction="l",
- lccode=0x0442,
+ lccode=0x442,
linebreak="al",
- unicodeslot=0x0422,
+ unicodeslot=0x422,
},
- [0x0423]={
+ [0x423]={
adobename="afii10037",
category="lu",
cjkwd="a",
contextname="cyrillicU",
description="CYRILLIC CAPITAL LETTER U",
direction="l",
- lccode=0x0443,
+ lccode=0x443,
linebreak="al",
- unicodeslot=0x0423,
+ unicodeslot=0x423,
},
- [0x0424]={
+ [0x424]={
adobename="afii10038",
category="lu",
cjkwd="a",
contextname="cyrillicF",
description="CYRILLIC CAPITAL LETTER EF",
direction="l",
- lccode=0x0444,
+ lccode=0x444,
linebreak="al",
- unicodeslot=0x0424,
+ unicodeslot=0x424,
},
- [0x0425]={
+ [0x425]={
adobename="afii10039",
category="lu",
cjkwd="a",
contextname="cyrillicH",
description="CYRILLIC CAPITAL LETTER HA",
direction="l",
- lccode=0x0445,
+ lccode=0x445,
linebreak="al",
- unicodeslot=0x0425,
+ unicodeslot=0x425,
},
- [0x0426]={
+ [0x426]={
adobename="afii10040",
category="lu",
cjkwd="a",
contextname="cyrillicC",
description="CYRILLIC CAPITAL LETTER TSE",
direction="l",
- lccode=0x0446,
+ lccode=0x446,
linebreak="al",
- unicodeslot=0x0426,
+ unicodeslot=0x426,
},
- [0x0427]={
+ [0x427]={
adobename="afii10041",
category="lu",
cjkwd="a",
contextname="cyrillicCH",
description="CYRILLIC CAPITAL LETTER CHE",
direction="l",
- lccode=0x0447,
+ lccode=0x447,
linebreak="al",
- unicodeslot=0x0427,
+ unicodeslot=0x427,
},
- [0x0428]={
+ [0x428]={
adobename="afii10042",
category="lu",
cjkwd="a",
contextname="cyrillicSH",
description="CYRILLIC CAPITAL LETTER SHA",
direction="l",
- lccode=0x0448,
+ lccode=0x448,
linebreak="al",
- unicodeslot=0x0428,
+ unicodeslot=0x428,
},
- [0x0429]={
+ [0x429]={
adobename="afii10043",
category="lu",
cjkwd="a",
contextname="cyrillicSHCH",
description="CYRILLIC CAPITAL LETTER SHCHA",
direction="l",
- lccode=0x0449,
+ lccode=0x449,
linebreak="al",
- unicodeslot=0x0429,
+ unicodeslot=0x429,
},
- [0x042A]={
+ [0x42A]={
adobename="afii10044",
category="lu",
cjkwd="a",
contextname="cyrillicHRDSN",
description="CYRILLIC CAPITAL LETTER HARD SIGN",
direction="l",
- lccode=0x044A,
+ lccode=0x44A,
linebreak="al",
- unicodeslot=0x042A,
+ unicodeslot=0x42A,
},
- [0x042B]={
+ [0x42B]={
adobename="afii10045",
category="lu",
cjkwd="a",
contextname="cyrillicERY",
description="CYRILLIC CAPITAL LETTER YERU",
direction="l",
- lccode=0x044B,
+ lccode=0x44B,
linebreak="al",
- unicodeslot=0x042B,
+ unicodeslot=0x42B,
},
- [0x042C]={
+ [0x42C]={
adobename="afii10046",
category="lu",
cjkwd="a",
contextname="cyrillicSFTSN",
description="CYRILLIC CAPITAL LETTER SOFT SIGN",
direction="l",
- lccode=0x044C,
+ lccode=0x44C,
linebreak="al",
- unicodeslot=0x042C,
+ unicodeslot=0x42C,
},
- [0x042D]={
+ [0x42D]={
adobename="afii10047",
category="lu",
cjkwd="a",
contextname="cyrillicEREV",
description="CYRILLIC CAPITAL LETTER E",
direction="l",
- lccode=0x044D,
+ lccode=0x44D,
linebreak="al",
- unicodeslot=0x042D,
+ unicodeslot=0x42D,
},
- [0x042E]={
+ [0x42E]={
adobename="afii10048",
category="lu",
cjkwd="a",
contextname="cyrillicYU",
description="CYRILLIC CAPITAL LETTER YU",
direction="l",
- lccode=0x044E,
+ lccode=0x44E,
linebreak="al",
- unicodeslot=0x042E,
+ unicodeslot=0x42E,
},
- [0x042F]={
+ [0x42F]={
adobename="afii10049",
category="lu",
cjkwd="a",
contextname="cyrillicYA",
description="CYRILLIC CAPITAL LETTER YA",
direction="l",
- lccode=0x044F,
+ lccode=0x44F,
linebreak="al",
- unicodeslot=0x042F,
+ unicodeslot=0x42F,
},
- [0x0430]={
+ [0x430]={
adobename="afii10065",
category="ll",
cjkwd="a",
@@ -10986,10 +11114,10 @@ characters.data={
description="CYRILLIC SMALL LETTER A",
direction="l",
linebreak="al",
- uccode=0x0410,
- unicodeslot=0x0430,
+ uccode=0x410,
+ unicodeslot=0x430,
},
- [0x0431]={
+ [0x431]={
adobename="becyrillic",
category="ll",
cjkwd="a",
@@ -10997,10 +11125,10 @@ characters.data={
description="CYRILLIC SMALL LETTER BE",
direction="l",
linebreak="al",
- uccode=0x0411,
- unicodeslot=0x0431,
+ uccode=0x411,
+ unicodeslot=0x431,
},
- [0x0432]={
+ [0x432]={
adobename="vecyrillic",
category="ll",
cjkwd="a",
@@ -11008,10 +11136,10 @@ characters.data={
description="CYRILLIC SMALL LETTER VE",
direction="l",
linebreak="al",
- uccode=0x0412,
- unicodeslot=0x0432,
+ uccode=0x412,
+ unicodeslot=0x432,
},
- [0x0433]={
+ [0x433]={
adobename="gecyrillic",
category="ll",
cjkwd="a",
@@ -11019,10 +11147,10 @@ characters.data={
description="CYRILLIC SMALL LETTER GHE",
direction="l",
linebreak="al",
- uccode=0x0413,
- unicodeslot=0x0433,
+ uccode=0x413,
+ unicodeslot=0x433,
},
- [0x0434]={
+ [0x434]={
adobename="decyrillic",
category="ll",
cjkwd="a",
@@ -11030,10 +11158,10 @@ characters.data={
description="CYRILLIC SMALL LETTER DE",
direction="l",
linebreak="al",
- uccode=0x0414,
- unicodeslot=0x0434,
+ uccode=0x414,
+ unicodeslot=0x434,
},
- [0x0435]={
+ [0x435]={
adobename="iecyrillic",
category="ll",
cjkwd="a",
@@ -11041,10 +11169,10 @@ characters.data={
description="CYRILLIC SMALL LETTER IE",
direction="l",
linebreak="al",
- uccode=0x0415,
- unicodeslot=0x0435,
+ uccode=0x415,
+ unicodeslot=0x435,
},
- [0x0436]={
+ [0x436]={
adobename="zhecyrillic",
category="ll",
cjkwd="a",
@@ -11052,10 +11180,10 @@ characters.data={
description="CYRILLIC SMALL LETTER ZHE",
direction="l",
linebreak="al",
- uccode=0x0416,
- unicodeslot=0x0436,
+ uccode=0x416,
+ unicodeslot=0x436,
},
- [0x0437]={
+ [0x437]={
adobename="zecyrillic",
category="ll",
cjkwd="a",
@@ -11063,10 +11191,10 @@ characters.data={
description="CYRILLIC SMALL LETTER ZE",
direction="l",
linebreak="al",
- uccode=0x0417,
- unicodeslot=0x0437,
+ uccode=0x417,
+ unicodeslot=0x437,
},
- [0x0438]={
+ [0x438]={
adobename="iicyrillic",
category="ll",
cjkwd="a",
@@ -11074,10 +11202,10 @@ characters.data={
description="CYRILLIC SMALL LETTER I",
direction="l",
linebreak="al",
- uccode=0x0418,
- unicodeslot=0x0438,
+ uccode=0x418,
+ unicodeslot=0x438,
},
- [0x0439]={
+ [0x439]={
adobename="iishortcyrillic",
category="ll",
cjkwd="a",
@@ -11085,11 +11213,11 @@ characters.data={
description="CYRILLIC SMALL LETTER SHORT I",
direction="l",
linebreak="al",
- specials={ "char", 0x0438, 0x0306 },
- uccode=0x0419,
- unicodeslot=0x0439,
+ specials={ "char", 0x438, 0x306 },
+ uccode=0x419,
+ unicodeslot=0x439,
},
- [0x043A]={
+ [0x43A]={
adobename="kacyrillic",
category="ll",
cjkwd="a",
@@ -11097,10 +11225,10 @@ characters.data={
description="CYRILLIC SMALL LETTER KA",
direction="l",
linebreak="al",
- uccode=0x041A,
- unicodeslot=0x043A,
+ uccode=0x41A,
+ unicodeslot=0x43A,
},
- [0x043B]={
+ [0x43B]={
adobename="elcyrillic",
category="ll",
cjkwd="a",
@@ -11108,10 +11236,10 @@ characters.data={
description="CYRILLIC SMALL LETTER EL",
direction="l",
linebreak="al",
- uccode=0x041B,
- unicodeslot=0x043B,
+ uccode=0x41B,
+ unicodeslot=0x43B,
},
- [0x043C]={
+ [0x43C]={
adobename="emcyrillic",
category="ll",
cjkwd="a",
@@ -11119,10 +11247,10 @@ characters.data={
description="CYRILLIC SMALL LETTER EM",
direction="l",
linebreak="al",
- uccode=0x041C,
- unicodeslot=0x043C,
+ uccode=0x41C,
+ unicodeslot=0x43C,
},
- [0x043D]={
+ [0x43D]={
adobename="encyrillic",
category="ll",
cjkwd="a",
@@ -11130,10 +11258,10 @@ characters.data={
description="CYRILLIC SMALL LETTER EN",
direction="l",
linebreak="al",
- uccode=0x041D,
- unicodeslot=0x043D,
+ uccode=0x41D,
+ unicodeslot=0x43D,
},
- [0x043E]={
+ [0x43E]={
adobename="ocyrillic",
category="ll",
cjkwd="a",
@@ -11141,10 +11269,10 @@ characters.data={
description="CYRILLIC SMALL LETTER O",
direction="l",
linebreak="al",
- uccode=0x041E,
- unicodeslot=0x043E,
+ uccode=0x41E,
+ unicodeslot=0x43E,
},
- [0x043F]={
+ [0x43F]={
adobename="pecyrillic",
category="ll",
cjkwd="a",
@@ -11152,10 +11280,10 @@ characters.data={
description="CYRILLIC SMALL LETTER PE",
direction="l",
linebreak="al",
- uccode=0x041F,
- unicodeslot=0x043F,
+ uccode=0x41F,
+ unicodeslot=0x43F,
},
- [0x0440]={
+ [0x440]={
adobename="ercyrillic",
category="ll",
cjkwd="a",
@@ -11163,10 +11291,10 @@ characters.data={
description="CYRILLIC SMALL LETTER ER",
direction="l",
linebreak="al",
- uccode=0x0420,
- unicodeslot=0x0440,
+ uccode=0x420,
+ unicodeslot=0x440,
},
- [0x0441]={
+ [0x441]={
adobename="escyrillic",
category="ll",
cjkwd="a",
@@ -11174,10 +11302,10 @@ characters.data={
description="CYRILLIC SMALL LETTER ES",
direction="l",
linebreak="al",
- uccode=0x0421,
- unicodeslot=0x0441,
+ uccode=0x421,
+ unicodeslot=0x441,
},
- [0x0442]={
+ [0x442]={
adobename="tecyrillic",
category="ll",
cjkwd="a",
@@ -11185,10 +11313,10 @@ characters.data={
description="CYRILLIC SMALL LETTER TE",
direction="l",
linebreak="al",
- uccode=0x0422,
- unicodeslot=0x0442,
+ uccode=0x422,
+ unicodeslot=0x442,
},
- [0x0443]={
+ [0x443]={
adobename="ucyrillic",
category="ll",
cjkwd="a",
@@ -11196,10 +11324,10 @@ characters.data={
description="CYRILLIC SMALL LETTER U",
direction="l",
linebreak="al",
- uccode=0x0423,
- unicodeslot=0x0443,
+ uccode=0x423,
+ unicodeslot=0x443,
},
- [0x0444]={
+ [0x444]={
adobename="efcyrillic",
category="ll",
cjkwd="a",
@@ -11207,10 +11335,10 @@ characters.data={
description="CYRILLIC SMALL LETTER EF",
direction="l",
linebreak="al",
- uccode=0x0424,
- unicodeslot=0x0444,
+ uccode=0x424,
+ unicodeslot=0x444,
},
- [0x0445]={
+ [0x445]={
adobename="khacyrillic",
category="ll",
cjkwd="a",
@@ -11218,10 +11346,10 @@ characters.data={
description="CYRILLIC SMALL LETTER HA",
direction="l",
linebreak="al",
- uccode=0x0425,
- unicodeslot=0x0445,
+ uccode=0x425,
+ unicodeslot=0x445,
},
- [0x0446]={
+ [0x446]={
adobename="tsecyrillic",
category="ll",
cjkwd="a",
@@ -11229,10 +11357,10 @@ characters.data={
description="CYRILLIC SMALL LETTER TSE",
direction="l",
linebreak="al",
- uccode=0x0426,
- unicodeslot=0x0446,
+ uccode=0x426,
+ unicodeslot=0x446,
},
- [0x0447]={
+ [0x447]={
adobename="checyrillic",
category="ll",
cjkwd="a",
@@ -11240,10 +11368,10 @@ characters.data={
description="CYRILLIC SMALL LETTER CHE",
direction="l",
linebreak="al",
- uccode=0x0427,
- unicodeslot=0x0447,
+ uccode=0x427,
+ unicodeslot=0x447,
},
- [0x0448]={
+ [0x448]={
adobename="shacyrillic",
category="ll",
cjkwd="a",
@@ -11251,10 +11379,10 @@ characters.data={
description="CYRILLIC SMALL LETTER SHA",
direction="l",
linebreak="al",
- uccode=0x0428,
- unicodeslot=0x0448,
+ uccode=0x428,
+ unicodeslot=0x448,
},
- [0x0449]={
+ [0x449]={
adobename="shchacyrillic",
category="ll",
cjkwd="a",
@@ -11262,10 +11390,10 @@ characters.data={
description="CYRILLIC SMALL LETTER SHCHA",
direction="l",
linebreak="al",
- uccode=0x0429,
- unicodeslot=0x0449,
+ uccode=0x429,
+ unicodeslot=0x449,
},
- [0x044A]={
+ [0x44A]={
adobename="hardsigncyrillic",
category="ll",
cjkwd="a",
@@ -11273,10 +11401,10 @@ characters.data={
description="CYRILLIC SMALL LETTER HARD SIGN",
direction="l",
linebreak="al",
- uccode=0x042A,
- unicodeslot=0x044A,
+ uccode=0x42A,
+ unicodeslot=0x44A,
},
- [0x044B]={
+ [0x44B]={
adobename="yericyrillic",
category="ll",
cjkwd="a",
@@ -11284,10 +11412,10 @@ characters.data={
description="CYRILLIC SMALL LETTER YERU",
direction="l",
linebreak="al",
- uccode=0x042B,
- unicodeslot=0x044B,
+ uccode=0x42B,
+ unicodeslot=0x44B,
},
- [0x044C]={
+ [0x44C]={
adobename="softsigncyrillic",
category="ll",
cjkwd="a",
@@ -11295,10 +11423,10 @@ characters.data={
description="CYRILLIC SMALL LETTER SOFT SIGN",
direction="l",
linebreak="al",
- uccode=0x042C,
- unicodeslot=0x044C,
+ uccode=0x42C,
+ unicodeslot=0x44C,
},
- [0x044D]={
+ [0x44D]={
adobename="ereversedcyrillic",
category="ll",
cjkwd="a",
@@ -11306,10 +11434,10 @@ characters.data={
description="CYRILLIC SMALL LETTER E",
direction="l",
linebreak="al",
- uccode=0x042D,
- unicodeslot=0x044D,
+ uccode=0x42D,
+ unicodeslot=0x44D,
},
- [0x044E]={
+ [0x44E]={
adobename="iucyrillic",
category="ll",
cjkwd="a",
@@ -11317,10 +11445,10 @@ characters.data={
description="CYRILLIC SMALL LETTER YU",
direction="l",
linebreak="al",
- uccode=0x042E,
- unicodeslot=0x044E,
+ uccode=0x42E,
+ unicodeslot=0x44E,
},
- [0x044F]={
+ [0x44F]={
adobename="iacyrillic",
category="ll",
cjkwd="a",
@@ -11328,21 +11456,21 @@ characters.data={
description="CYRILLIC SMALL LETTER YA",
direction="l",
linebreak="al",
- uccode=0x042F,
- unicodeslot=0x044F,
+ uccode=0x42F,
+ unicodeslot=0x44F,
},
- [0x0450]={
+ [0x450]={
category="ll",
contextname="cyrillicegrave",
description="CYRILLIC SMALL LETTER IE WITH GRAVE",
direction="l",
linebreak="al",
- shcode=0x0435,
- specials={ "char", 0x0435, 0x0300 },
- uccode=0x0400,
- unicodeslot=0x0450,
+ shcode=0x435,
+ specials={ "char", 0x435, 0x300 },
+ uccode=0x400,
+ unicodeslot=0x450,
},
- [0x0451]={
+ [0x451]={
adobename="iocyrillic",
category="ll",
cjkwd="a",
@@ -11350,17808 +11478,18319 @@ characters.data={
description="CYRILLIC SMALL LETTER IO",
direction="l",
linebreak="al",
- specials={ "char", 0x0435, 0x0308 },
- uccode=0x0401,
- unicodeslot=0x0451,
+ specials={ "char", 0x435, 0x308 },
+ uccode=0x401,
+ unicodeslot=0x451,
},
- [0x0452]={
+ [0x452]={
adobename="djecyrillic",
category="ll",
contextname="cyrillicdje",
description="CYRILLIC SMALL LETTER DJE",
direction="l",
linebreak="al",
- uccode=0x0402,
- unicodeslot=0x0452,
+ uccode=0x402,
+ unicodeslot=0x452,
},
- [0x0453]={
+ [0x453]={
adobename="gjecyrillic",
category="ll",
contextname="cyrillicgje",
description="CYRILLIC SMALL LETTER GJE",
direction="l",
linebreak="al",
- specials={ "char", 0x0433, 0x0301 },
- uccode=0x0403,
- unicodeslot=0x0453,
+ specials={ "char", 0x433, 0x301 },
+ uccode=0x403,
+ unicodeslot=0x453,
},
- [0x0454]={
+ [0x454]={
adobename="ecyrillic",
category="ll",
contextname="cyrillicie",
description="CYRILLIC SMALL LETTER UKRAINIAN IE",
direction="l",
linebreak="al",
- uccode=0x0404,
- unicodeslot=0x0454,
+ uccode=0x404,
+ unicodeslot=0x454,
},
- [0x0455]={
+ [0x455]={
adobename="dzecyrillic",
category="ll",
contextname="cyrillicdze",
description="CYRILLIC SMALL LETTER DZE",
direction="l",
linebreak="al",
- uccode=0x0405,
- unicodeslot=0x0455,
+ uccode=0x405,
+ unicodeslot=0x455,
},
- [0x0456]={
+ [0x456]={
adobename="icyrillic",
category="ll",
contextname="cyrillicii",
description="CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I",
direction="l",
linebreak="al",
- uccode=0x0406,
- unicodeslot=0x0456,
+ uccode=0x406,
+ unicodeslot=0x456,
},
- [0x0457]={
+ [0x457]={
adobename="yicyrillic",
category="ll",
contextname="cyrillicyi",
description="CYRILLIC SMALL LETTER YI",
direction="l",
linebreak="al",
- specials={ "char", 0x0456, 0x0308 },
- uccode=0x0407,
- unicodeslot=0x0457,
+ specials={ "char", 0x456, 0x308 },
+ uccode=0x407,
+ unicodeslot=0x457,
},
- [0x0458]={
+ [0x458]={
adobename="jecyrillic",
category="ll",
contextname="cyrillicje",
description="CYRILLIC SMALL LETTER JE",
direction="l",
linebreak="al",
- uccode=0x0408,
- unicodeslot=0x0458,
+ uccode=0x408,
+ unicodeslot=0x458,
},
- [0x0459]={
+ [0x459]={
adobename="ljecyrillic",
category="ll",
contextname="cyrilliclje",
description="CYRILLIC SMALL LETTER LJE",
direction="l",
linebreak="al",
- uccode=0x0409,
- unicodeslot=0x0459,
+ uccode=0x409,
+ unicodeslot=0x459,
},
- [0x045A]={
+ [0x45A]={
adobename="njecyrillic",
category="ll",
contextname="cyrillicnje",
description="CYRILLIC SMALL LETTER NJE",
direction="l",
linebreak="al",
- uccode=0x040A,
- unicodeslot=0x045A,
+ uccode=0x40A,
+ unicodeslot=0x45A,
},
- [0x045B]={
+ [0x45B]={
adobename="tshecyrillic",
category="ll",
contextname="cyrillictshe",
description="CYRILLIC SMALL LETTER TSHE",
direction="l",
linebreak="al",
- uccode=0x040B,
- unicodeslot=0x045B,
+ uccode=0x40B,
+ unicodeslot=0x45B,
},
- [0x045C]={
+ [0x45C]={
adobename="kjecyrillic",
category="ll",
contextname="cyrillickje",
description="CYRILLIC SMALL LETTER KJE",
direction="l",
linebreak="al",
- specials={ "char", 0x043A, 0x0301 },
- uccode=0x040C,
- unicodeslot=0x045C,
+ specials={ "char", 0x43A, 0x301 },
+ uccode=0x40C,
+ unicodeslot=0x45C,
},
- [0x045D]={
+ [0x45D]={
category="ll",
contextname="cyrillicigrave",
description="CYRILLIC SMALL LETTER I WITH GRAVE",
direction="l",
linebreak="al",
- shcode=0x0438,
- specials={ "char", 0x0438, 0x0300 },
- uccode=0x040D,
- unicodeslot=0x045D,
+ shcode=0x438,
+ specials={ "char", 0x438, 0x300 },
+ uccode=0x40D,
+ unicodeslot=0x45D,
},
- [0x045E]={
+ [0x45E]={
adobename="ushortcyrillic",
category="ll",
contextname="cyrillicushrt",
description="CYRILLIC SMALL LETTER SHORT U",
direction="l",
linebreak="al",
- specials={ "char", 0x0443, 0x0306 },
- uccode=0x040E,
- unicodeslot=0x045E,
+ specials={ "char", 0x443, 0x306 },
+ uccode=0x40E,
+ unicodeslot=0x45E,
},
- [0x045F]={
+ [0x45F]={
adobename="dzhecyrillic",
category="ll",
contextname="cyrillicdzhe",
description="CYRILLIC SMALL LETTER DZHE",
direction="l",
linebreak="al",
- uccode=0x040F,
- unicodeslot=0x045F,
+ uccode=0x40F,
+ unicodeslot=0x45F,
},
- [0x0460]={
+ [0x460]={
adobename="Omegacyrillic",
category="lu",
contextname="cyrillicOMEGA",
description="CYRILLIC CAPITAL LETTER OMEGA",
direction="l",
- lccode=0x0461,
+ lccode=0x461,
linebreak="al",
- unicodeslot=0x0460,
+ unicodeslot=0x460,
},
- [0x0461]={
+ [0x461]={
adobename="omegacyrillic",
category="ll",
contextname="cyrillicomega",
description="CYRILLIC SMALL LETTER OMEGA",
direction="l",
linebreak="al",
- uccode=0x0460,
- unicodeslot=0x0461,
+ uccode=0x460,
+ unicodeslot=0x461,
},
- [0x0462]={
+ [0x462]={
adobename="afii10146",
category="lu",
contextname="cyrillicYAT",
description="CYRILLIC CAPITAL LETTER YAT",
direction="l",
- lccode=0x0463,
+ lccode=0x463,
linebreak="al",
- unicodeslot=0x0462,
+ unicodeslot=0x462,
},
- [0x0463]={
+ [0x463]={
adobename="yatcyrillic",
category="ll",
contextname="cyrillicyat",
description="CYRILLIC SMALL LETTER YAT",
direction="l",
linebreak="al",
- uccode=0x0462,
- unicodeslot=0x0463,
+ uccode=0x462,
+ unicodeslot=0x463,
},
- [0x0464]={
+ [0x464]={
adobename="Eiotifiedcyrillic",
category="lu",
contextname="cyrillicEiotified",
description="CYRILLIC CAPITAL LETTER IOTIFIED E",
direction="l",
- lccode=0x0465,
+ lccode=0x465,
linebreak="al",
- unicodeslot=0x0464,
+ unicodeslot=0x464,
},
- [0x0465]={
+ [0x465]={
adobename="eiotifiedcyrillic",
category="ll",
contextname="cyrilliceiotified",
description="CYRILLIC SMALL LETTER IOTIFIED E",
direction="l",
linebreak="al",
- uccode=0x0464,
- unicodeslot=0x0465,
+ uccode=0x464,
+ unicodeslot=0x465,
},
- [0x0466]={
+ [0x466]={
adobename="Yuslittlecyrillic",
category="lu",
contextname="cyrillicLITTLEYUS",
description="CYRILLIC CAPITAL LETTER LITTLE YUS",
direction="l",
- lccode=0x0467,
+ lccode=0x467,
linebreak="al",
- unicodeslot=0x0466,
+ unicodeslot=0x466,
},
- [0x0467]={
+ [0x467]={
adobename="yuslittlecyrillic",
category="ll",
contextname="cyrilliclittleyus",
description="CYRILLIC SMALL LETTER LITTLE YUS",
direction="l",
linebreak="al",
- uccode=0x0466,
- unicodeslot=0x0467,
+ uccode=0x466,
+ unicodeslot=0x467,
},
- [0x0468]={
+ [0x468]={
adobename="Yuslittleiotifiedcyrillic",
category="lu",
contextname="cyrillicLITTLEYUSiotified",
description="CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS",
direction="l",
- lccode=0x0469,
+ lccode=0x469,
linebreak="al",
- unicodeslot=0x0468,
+ unicodeslot=0x468,
},
- [0x0469]={
+ [0x469]={
adobename="yuslittleiotifiedcyrillic",
category="ll",
contextname="cyrilliclittleyusiotified",
description="CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS",
direction="l",
linebreak="al",
- uccode=0x0468,
- unicodeslot=0x0469,
+ uccode=0x468,
+ unicodeslot=0x469,
},
- [0x046A]={
+ [0x46A]={
adobename="Yusbigcyrillic",
category="lu",
contextname="cyrillicBIGYUS",
description="CYRILLIC CAPITAL LETTER BIG YUS",
direction="l",
- lccode=0x046B,
+ lccode=0x46B,
linebreak="al",
- unicodeslot=0x046A,
+ unicodeslot=0x46A,
},
- [0x046B]={
+ [0x46B]={
adobename="yusbigcyrillic",
category="ll",
contextname="cyrillicbigyus",
description="CYRILLIC SMALL LETTER BIG YUS",
direction="l",
linebreak="al",
- uccode=0x046A,
- unicodeslot=0x046B,
+ uccode=0x46A,
+ unicodeslot=0x46B,
},
- [0x046C]={
+ [0x46C]={
adobename="Yusbigiotifiedcyrillic",
category="lu",
contextname="cyrillicBIGYUSiotified",
description="CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS",
direction="l",
- lccode=0x046D,
+ lccode=0x46D,
linebreak="al",
- unicodeslot=0x046C,
+ unicodeslot=0x46C,
},
- [0x046D]={
+ [0x46D]={
adobename="yusbigiotifiedcyrillic",
category="ll",
contextname="cyrillicbigyusiotified",
description="CYRILLIC SMALL LETTER IOTIFIED BIG YUS",
direction="l",
linebreak="al",
- uccode=0x046C,
- unicodeslot=0x046D,
+ uccode=0x46C,
+ unicodeslot=0x46D,
},
- [0x046E]={
+ [0x46E]={
adobename="Ksicyrillic",
category="lu",
contextname="cyrillicKSI",
description="CYRILLIC CAPITAL LETTER KSI",
direction="l",
- lccode=0x046F,
+ lccode=0x46F,
linebreak="al",
- unicodeslot=0x046E,
+ unicodeslot=0x46E,
},
- [0x046F]={
+ [0x46F]={
adobename="ksicyrillic",
category="ll",
contextname="cyrillicksi",
description="CYRILLIC SMALL LETTER KSI",
direction="l",
linebreak="al",
- uccode=0x046E,
- unicodeslot=0x046F,
+ uccode=0x46E,
+ unicodeslot=0x46F,
},
- [0x0470]={
+ [0x470]={
adobename="Psicyrillic",
category="lu",
contextname="cyrillicPSI",
description="CYRILLIC CAPITAL LETTER PSI",
direction="l",
- lccode=0x0471,
+ lccode=0x471,
linebreak="al",
- unicodeslot=0x0470,
+ unicodeslot=0x470,
},
- [0x0471]={
+ [0x471]={
adobename="psicyrillic",
category="ll",
contextname="cyrillicpsi",
description="CYRILLIC SMALL LETTER PSI",
direction="l",
linebreak="al",
- uccode=0x0470,
- unicodeslot=0x0471,
+ uccode=0x470,
+ unicodeslot=0x471,
},
- [0x0472]={
+ [0x472]={
adobename="afii10147",
category="lu",
contextname="cyrillicFITA",
description="CYRILLIC CAPITAL LETTER FITA",
direction="l",
- lccode=0x0473,
+ lccode=0x473,
linebreak="al",
- unicodeslot=0x0472,
+ unicodeslot=0x472,
},
- [0x0473]={
+ [0x473]={
adobename="fitacyrillic",
category="ll",
contextname="cyrillicfita",
description="CYRILLIC SMALL LETTER FITA",
direction="l",
linebreak="al",
- uccode=0x0472,
- unicodeslot=0x0473,
+ uccode=0x472,
+ unicodeslot=0x473,
},
- [0x0474]={
+ [0x474]={
adobename="afii10148",
category="lu",
contextname="cyrillicIZHITSA",
description="CYRILLIC CAPITAL LETTER IZHITSA",
direction="l",
- lccode=0x0475,
+ lccode=0x475,
linebreak="al",
- unicodeslot=0x0474,
+ unicodeslot=0x474,
},
- [0x0475]={
+ [0x475]={
adobename="izhitsacyrillic",
category="ll",
contextname="cyrillicizhitsa",
description="CYRILLIC SMALL LETTER IZHITSA",
direction="l",
linebreak="al",
- uccode=0x0474,
- unicodeslot=0x0475,
+ uccode=0x474,
+ unicodeslot=0x475,
},
- [0x0476]={
+ [0x476]={
adobename="Izhitsadblgravecyrillic",
category="lu",
contextname="cyrillicIZHITSAdoublegrave",
description="CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT",
direction="l",
- lccode=0x0477,
+ lccode=0x477,
linebreak="al",
- shcode=0x0474,
- specials={ "char", 0x0474, 0x030F },
- unicodeslot=0x0476,
+ shcode=0x474,
+ specials={ "char", 0x474, 0x30F },
+ unicodeslot=0x476,
},
- [0x0477]={
+ [0x477]={
adobename="izhitsadblgravecyrillic",
category="ll",
contextname="cyrillicizhitsadoublegrave",
description="CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT",
direction="l",
linebreak="al",
- shcode=0x0475,
- specials={ "char", 0x0475, 0x030F },
- uccode=0x0476,
- unicodeslot=0x0477,
+ shcode=0x475,
+ specials={ "char", 0x475, 0x30F },
+ uccode=0x476,
+ unicodeslot=0x477,
},
- [0x0478]={
+ [0x478]={
adobename="Ukcyrillic",
category="lu",
contextname="cyrillicUK",
description="CYRILLIC CAPITAL LETTER UK",
direction="l",
- lccode=0x0479,
+ lccode=0x479,
linebreak="al",
- unicodeslot=0x0478,
+ unicodeslot=0x478,
},
- [0x0479]={
+ [0x479]={
adobename="ukcyrillic",
category="ll",
contextname="cyrillicuk",
description="CYRILLIC SMALL LETTER UK",
direction="l",
linebreak="al",
- uccode=0x0478,
- unicodeslot=0x0479,
+ uccode=0x478,
+ unicodeslot=0x479,
},
- [0x047A]={
+ [0x47A]={
adobename="Omegaroundcyrillic",
category="lu",
contextname="cyrillicOMEGAround",
description="CYRILLIC CAPITAL LETTER ROUND OMEGA",
direction="l",
- lccode=0x047B,
+ lccode=0x47B,
linebreak="al",
- unicodeslot=0x047A,
+ unicodeslot=0x47A,
},
- [0x047B]={
+ [0x47B]={
adobename="omegaroundcyrillic",
category="ll",
contextname="cyrillicomegaround",
description="CYRILLIC SMALL LETTER ROUND OMEGA",
direction="l",
linebreak="al",
- uccode=0x047A,
- unicodeslot=0x047B,
+ uccode=0x47A,
+ unicodeslot=0x47B,
},
- [0x047C]={
+ [0x47C]={
adobename="Omegatitlocyrillic",
category="lu",
contextname="cyrillicOMEGAtitlo",
description="CYRILLIC CAPITAL LETTER OMEGA WITH TITLO",
direction="l",
- lccode=0x047D,
+ lccode=0x47D,
linebreak="al",
- shcode=0x0460,
- unicodeslot=0x047C,
+ shcode=0x460,
+ unicodeslot=0x47C,
},
- [0x047D]={
+ [0x47D]={
adobename="omegatitlocyrillic",
category="ll",
contextname="cyrillicomegatitlo",
description="CYRILLIC SMALL LETTER OMEGA WITH TITLO",
direction="l",
linebreak="al",
- shcode=0x0461,
- uccode=0x047C,
- unicodeslot=0x047D,
+ shcode=0x461,
+ uccode=0x47C,
+ unicodeslot=0x47D,
},
- [0x047E]={
+ [0x47E]={
adobename="Otcyrillic",
category="lu",
contextname="cyrillicOT",
description="CYRILLIC CAPITAL LETTER OT",
direction="l",
- lccode=0x047F,
+ lccode=0x47F,
linebreak="al",
- unicodeslot=0x047E,
+ unicodeslot=0x47E,
},
- [0x047F]={
+ [0x47F]={
adobename="otcyrillic",
category="ll",
contextname="cyrillicot",
description="CYRILLIC SMALL LETTER OT",
direction="l",
linebreak="al",
- uccode=0x047E,
- unicodeslot=0x047F,
+ uccode=0x47E,
+ unicodeslot=0x47F,
},
- [0x0480]={
+ [0x480]={
adobename="Koppacyrillic",
category="lu",
contextname="cyrillicKOPPA",
description="CYRILLIC CAPITAL LETTER KOPPA",
direction="l",
- lccode=0x0481,
+ lccode=0x481,
linebreak="al",
- unicodeslot=0x0480,
+ unicodeslot=0x480,
},
- [0x0481]={
+ [0x481]={
adobename="koppacyrillic",
category="ll",
contextname="cyrillickoppa",
description="CYRILLIC SMALL LETTER KOPPA",
direction="l",
linebreak="al",
- uccode=0x0480,
- unicodeslot=0x0481,
+ uccode=0x480,
+ unicodeslot=0x481,
},
- [0x0482]={
+ [0x482]={
adobename="thousandcyrillic",
category="so",
description="CYRILLIC THOUSANDS SIGN",
direction="l",
linebreak="al",
- unicodeslot=0x0482,
+ unicodeslot=0x482,
},
- [0x0483]={
+ [0x483]={
adobename="titlocyrilliccmb",
category="mn",
+ combining=0xE6,
contextname="cyrillicTITLO",
description="COMBINING CYRILLIC TITLO",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0483,
+ unicodeslot=0x483,
},
- [0x0484]={
+ [0x484]={
adobename="palatalizationcyrilliccmb",
category="mn",
+ combining=0xE6,
contextname="cyrillicPALATALIZATION",
description="COMBINING CYRILLIC PALATALIZATION",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0484,
+ unicodeslot=0x484,
},
- [0x0485]={
+ [0x485]={
adobename="dasiapneumatacyrilliccmb",
category="mn",
+ combining=0xE6,
contextname="cyrillicDASIAPNEUMATA",
description="COMBINING CYRILLIC DASIA PNEUMATA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0485,
+ unicodeslot=0x485,
},
- [0x0486]={
+ [0x486]={
adobename="psilipneumatacyrilliccmb",
category="mn",
+ combining=0xE6,
contextname="cyrillicPSILIPNEUMATA",
description="COMBINING CYRILLIC PSILI PNEUMATA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0486,
+ unicodeslot=0x486,
},
- [0x0487]={
+ [0x487]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC POKRYTIE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0487,
+ unicodeslot=0x487,
},
- [0x0488]={
+ [0x488]={
category="me",
description="COMBINING CYRILLIC HUNDRED THOUSANDS SIGN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0488,
+ unicodeslot=0x488,
},
- [0x0489]={
+ [0x489]={
category="me",
description="COMBINING CYRILLIC MILLIONS SIGN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0489,
+ unicodeslot=0x489,
},
- [0x048A]={
+ [0x48A]={
category="lu",
contextname="cyrillicISHRTtail",
description="CYRILLIC CAPITAL LETTER SHORT I WITH TAIL",
direction="l",
- lccode=0x048B,
+ lccode=0x48B,
linebreak="al",
- unicodeslot=0x048A,
+ unicodeslot=0x48A,
},
- [0x048B]={
+ [0x48B]={
category="ll",
contextname="cyrillicishrttail",
description="CYRILLIC SMALL LETTER SHORT I WITH TAIL",
direction="l",
linebreak="al",
- uccode=0x048A,
- unicodeslot=0x048B,
+ uccode=0x48A,
+ unicodeslot=0x48B,
},
- [0x048C]={
+ [0x48C]={
category="lu",
contextname="cyrillicSEMISOFT",
description="CYRILLIC CAPITAL LETTER SEMISOFT SIGN",
direction="l",
- lccode=0x048D,
+ lccode=0x48D,
linebreak="al",
- unicodeslot=0x048C,
+ unicodeslot=0x48C,
},
- [0x048D]={
+ [0x48D]={
category="ll",
contextname="cyrillicsemisoft",
description="CYRILLIC SMALL LETTER SEMISOFT SIGN",
direction="l",
linebreak="al",
- uccode=0x048C,
- unicodeslot=0x048D,
+ uccode=0x48C,
+ unicodeslot=0x48D,
},
- [0x048E]={
+ [0x48E]={
category="lu",
contextname="cyrillicERtick",
description="CYRILLIC CAPITAL LETTER ER WITH TICK",
direction="l",
- lccode=0x048F,
+ lccode=0x48F,
linebreak="al",
- shcode=0x0420,
- unicodeslot=0x048E,
+ shcode=0x420,
+ unicodeslot=0x48E,
},
- [0x048F]={
+ [0x48F]={
category="ll",
contextname="cyrillicertick",
description="CYRILLIC SMALL LETTER ER WITH TICK",
direction="l",
linebreak="al",
- shcode=0x0440,
- uccode=0x048E,
- unicodeslot=0x048F,
+ shcode=0x440,
+ uccode=0x48E,
+ unicodeslot=0x48F,
},
- [0x0490]={
+ [0x490]={
adobename="afii10050",
category="lu",
contextname="cyrillicGHEupturn",
description="CYRILLIC CAPITAL LETTER GHE WITH UPTURN",
direction="l",
- lccode=0x0491,
+ lccode=0x491,
linebreak="al",
- shcode=0x0413,
- unicodeslot=0x0490,
+ shcode=0x413,
+ unicodeslot=0x490,
},
- [0x0491]={
+ [0x491]={
adobename="gheupturncyrillic",
category="ll",
contextname="cyrillicgheupturn",
description="CYRILLIC SMALL LETTER GHE WITH UPTURN",
direction="l",
linebreak="al",
- shcode=0x0433,
- uccode=0x0490,
- unicodeslot=0x0491,
+ shcode=0x433,
+ uccode=0x490,
+ unicodeslot=0x491,
},
- [0x0492]={
+ [0x492]={
adobename="Ghestrokecyrillic",
category="lu",
contextname="cyrillicGHEstroke",
description="CYRILLIC CAPITAL LETTER GHE WITH STROKE",
direction="l",
- lccode=0x0493,
+ lccode=0x493,
linebreak="al",
- shcode=0x0413,
- unicodeslot=0x0492,
+ shcode=0x413,
+ unicodeslot=0x492,
},
- [0x0493]={
+ [0x493]={
adobename="ghestrokecyrillic",
category="ll",
contextname="cyrillicghestroke",
description="CYRILLIC SMALL LETTER GHE WITH STROKE",
direction="l",
linebreak="al",
- shcode=0x0433,
- uccode=0x0492,
- unicodeslot=0x0493,
+ shcode=0x433,
+ uccode=0x492,
+ unicodeslot=0x493,
},
- [0x0494]={
+ [0x494]={
adobename="Ghemiddlehookcyrillic",
category="lu",
contextname="cyrillicGHEmidhook",
description="CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK",
direction="l",
- lccode=0x0495,
+ lccode=0x495,
linebreak="al",
- shcode=0x0413,
- unicodeslot=0x0494,
+ shcode=0x413,
+ unicodeslot=0x494,
},
- [0x0495]={
+ [0x495]={
adobename="ghemiddlehookcyrillic",
category="ll",
contextname="cyrillicghemidhook",
description="CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK",
direction="l",
linebreak="al",
- shcode=0x0433,
- uccode=0x0494,
- unicodeslot=0x0495,
+ shcode=0x433,
+ uccode=0x494,
+ unicodeslot=0x495,
},
- [0x0496]={
+ [0x496]={
adobename="Zhedescendercyrillic",
category="lu",
contextname="cyrillicZHEdescender",
description="CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER",
direction="l",
- lccode=0x0497,
+ lccode=0x497,
linebreak="al",
- shcode=0x0416,
- unicodeslot=0x0496,
+ shcode=0x416,
+ unicodeslot=0x496,
},
- [0x0497]={
+ [0x497]={
adobename="zhedescendercyrillic",
category="ll",
contextname="cyrilliczhedescender",
description="CYRILLIC SMALL LETTER ZHE WITH DESCENDER",
direction="l",
linebreak="al",
- shcode=0x0436,
- uccode=0x0496,
- unicodeslot=0x0497,
+ shcode=0x436,
+ uccode=0x496,
+ unicodeslot=0x497,
},
- [0x0498]={
+ [0x498]={
adobename="Zedescendercyrillic",
category="lu",
contextname="cyrillicZDSC",
description="CYRILLIC CAPITAL LETTER ZE WITH DESCENDER",
direction="l",
- lccode=0x0499,
+ lccode=0x499,
linebreak="al",
- shcode=0x0417,
- unicodeslot=0x0498,
+ shcode=0x417,
+ unicodeslot=0x498,
},
- [0x0499]={
+ [0x499]={
adobename="zedescendercyrillic",
category="ll",
contextname="cyrilliczdsc",
description="CYRILLIC SMALL LETTER ZE WITH DESCENDER",
direction="l",
linebreak="al",
- shcode=0x0437,
- uccode=0x0498,
- unicodeslot=0x0499,
+ shcode=0x437,
+ uccode=0x498,
+ unicodeslot=0x499,
},
- [0x049A]={
+ [0x49A]={
adobename="Kadescendercyrillic",
category="lu",
contextname="cyrillicKADC",
description="CYRILLIC CAPITAL LETTER KA WITH DESCENDER",
direction="l",
- lccode=0x049B,
+ lccode=0x49B,
linebreak="al",
- shcode=0x041A,
- unicodeslot=0x049A,
+ shcode=0x41A,
+ unicodeslot=0x49A,
},
- [0x049B]={
+ [0x49B]={
adobename="kadescendercyrillic",
category="ll",
contextname="cyrillickadc",
description="CYRILLIC SMALL LETTER KA WITH DESCENDER",
direction="l",
linebreak="al",
- shcode=0x043A,
- uccode=0x049A,
- unicodeslot=0x049B,
+ shcode=0x43A,
+ uccode=0x49A,
+ unicodeslot=0x49B,
},
- [0x049C]={
+ [0x49C]={
adobename="Kaverticalstrokecyrillic",
category="lu",
contextname="cyrillicKAvertstroke",
description="CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE",
direction="l",
- lccode=0x049D,
+ lccode=0x49D,
linebreak="al",
- shcode=0x041A,
- unicodeslot=0x049C,
+ shcode=0x41A,
+ unicodeslot=0x49C,
},
- [0x049D]={
+ [0x49D]={
adobename="kaverticalstrokecyrillic",
category="ll",
contextname="cyrillickavertstroke",
description="CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE",
direction="l",
linebreak="al",
- shcode=0x043A,
- uccode=0x049C,
- unicodeslot=0x049D,
+ shcode=0x43A,
+ uccode=0x49C,
+ unicodeslot=0x49D,
},
- [0x049E]={
+ [0x49E]={
adobename="Kastrokecyrillic",
category="lu",
contextname="cyrillicKAstroke",
description="CYRILLIC CAPITAL LETTER KA WITH STROKE",
direction="l",
- lccode=0x049F,
+ lccode=0x49F,
linebreak="al",
- shcode=0x041A,
- unicodeslot=0x049E,
+ shcode=0x41A,
+ unicodeslot=0x49E,
},
- [0x049F]={
+ [0x49F]={
adobename="kastrokecyrillic",
category="ll",
contextname="cyrillickastroke",
description="CYRILLIC SMALL LETTER KA WITH STROKE",
direction="l",
linebreak="al",
- shcode=0x043A,
- uccode=0x049E,
- unicodeslot=0x049F,
+ shcode=0x43A,
+ uccode=0x49E,
+ unicodeslot=0x49F,
},
- [0x04A0]={
+ [0x4A0]={
adobename="Kabashkircyrillic",
category="lu",
contextname="cyrillicKAbashkir",
description="CYRILLIC CAPITAL LETTER BASHKIR KA",
direction="l",
- lccode=0x04A1,
+ lccode=0x4A1,
linebreak="al",
- unicodeslot=0x04A0,
+ unicodeslot=0x4A0,
},
- [0x04A1]={
+ [0x4A1]={
adobename="kabashkircyrillic",
category="ll",
contextname="cyrillickabashkir",
description="CYRILLIC SMALL LETTER BASHKIR KA",
direction="l",
linebreak="al",
- uccode=0x04A0,
- unicodeslot=0x04A1,
+ uccode=0x4A0,
+ unicodeslot=0x4A1,
},
- [0x04A2]={
+ [0x4A2]={
adobename="Endescendercyrillic",
category="lu",
contextname="cyrillicENDC",
description="CYRILLIC CAPITAL LETTER EN WITH DESCENDER",
direction="l",
- lccode=0x04A3,
+ lccode=0x4A3,
linebreak="al",
- shcode=0x041D,
- unicodeslot=0x04A2,
+ shcode=0x41D,
+ unicodeslot=0x4A2,
},
- [0x04A3]={
+ [0x4A3]={
adobename="endescendercyrillic",
category="ll",
contextname="cyrillicendc",
description="CYRILLIC SMALL LETTER EN WITH DESCENDER",
direction="l",
linebreak="al",
- shcode=0x043D,
- uccode=0x04A2,
- unicodeslot=0x04A3,
+ shcode=0x43D,
+ uccode=0x4A2,
+ unicodeslot=0x4A3,
},
- [0x04A4]={
+ [0x4A4]={
adobename="Enghecyrillic",
category="lu",
contextname="cyrillicENGHE",
description="CYRILLIC CAPITAL LIGATURE EN GHE",
direction="l",
- lccode=0x04A5,
+ lccode=0x4A5,
linebreak="al",
- unicodeslot=0x04A4,
+ unicodeslot=0x4A4,
},
- [0x04A5]={
+ [0x4A5]={
adobename="enghecyrillic",
category="ll",
contextname="cyrillicenghe",
description="CYRILLIC SMALL LIGATURE EN GHE",
direction="l",
linebreak="al",
- uccode=0x04A4,
- unicodeslot=0x04A5,
+ uccode=0x4A4,
+ unicodeslot=0x4A5,
},
- [0x04A6]={
+ [0x4A6]={
adobename="Pemiddlehookcyrillic",
category="lu",
contextname="cyrillicPEmidhook",
description="CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK",
direction="l",
- lccode=0x04A7,
+ lccode=0x4A7,
linebreak="al",
- shcode=0x041F,
- unicodeslot=0x04A6,
+ shcode=0x41F,
+ unicodeslot=0x4A6,
},
- [0x04A7]={
+ [0x4A7]={
adobename="pemiddlehookcyrillic",
category="ll",
contextname="cyrillicpemidhook",
description="CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK",
direction="l",
linebreak="al",
- shcode=0x043F,
- uccode=0x04A6,
- unicodeslot=0x04A7,
+ shcode=0x43F,
+ uccode=0x4A6,
+ unicodeslot=0x4A7,
},
- [0x04A8]={
+ [0x4A8]={
adobename="Haabkhasiancyrillic",
category="lu",
contextname="cyrillicHA",
description="CYRILLIC CAPITAL LETTER ABKHASIAN HA",
direction="l",
- lccode=0x04A9,
+ lccode=0x4A9,
linebreak="al",
- unicodeslot=0x04A8,
+ unicodeslot=0x4A8,
},
- [0x04A9]={
+ [0x4A9]={
adobename="haabkhasiancyrillic",
category="ll",
contextname="cyrillicha",
description="CYRILLIC SMALL LETTER ABKHASIAN HA",
direction="l",
linebreak="al",
- uccode=0x04A8,
- unicodeslot=0x04A9,
+ uccode=0x4A8,
+ unicodeslot=0x4A9,
},
- [0x04AA]={
+ [0x4AA]={
adobename="Esdescendercyrillic",
category="lu",
contextname="cyrillicSDSC",
description="CYRILLIC CAPITAL LETTER ES WITH DESCENDER",
direction="l",
- lccode=0x04AB,
+ lccode=0x4AB,
linebreak="al",
- shcode=0x0421,
- unicodeslot=0x04AA,
+ shcode=0x421,
+ unicodeslot=0x4AA,
},
- [0x04AB]={
+ [0x4AB]={
adobename="esdescendercyrillic",
category="ll",
contextname="cyrillicsdsc",
description="CYRILLIC SMALL LETTER ES WITH DESCENDER",
direction="l",
linebreak="al",
- shcode=0x0441,
- uccode=0x04AA,
- unicodeslot=0x04AB,
+ shcode=0x441,
+ uccode=0x4AA,
+ unicodeslot=0x4AB,
},
- [0x04AC]={
+ [0x4AC]={
adobename="Tedescendercyrillic",
category="lu",
contextname="cyrillicTEDC",
description="CYRILLIC CAPITAL LETTER TE WITH DESCENDER",
direction="l",
- lccode=0x04AD,
+ lccode=0x4AD,
linebreak="al",
- shcode=0x0422,
- unicodeslot=0x04AC,
+ shcode=0x422,
+ unicodeslot=0x4AC,
},
- [0x04AD]={
+ [0x4AD]={
adobename="tedescendercyrillic",
category="ll",
contextname="cyrillictedc",
description="CYRILLIC SMALL LETTER TE WITH DESCENDER",
direction="l",
linebreak="al",
- shcode=0x0442,
- uccode=0x04AC,
- unicodeslot=0x04AD,
+ shcode=0x442,
+ uccode=0x4AC,
+ unicodeslot=0x4AD,
},
- [0x04AE]={
+ [0x4AE]={
adobename="Ustraightcyrillic",
category="lu",
contextname="cyrillicYstr",
description="CYRILLIC CAPITAL LETTER STRAIGHT U",
direction="l",
- lccode=0x04AF,
+ lccode=0x4AF,
linebreak="al",
- unicodeslot=0x04AE,
+ unicodeslot=0x4AE,
},
- [0x04AF]={
+ [0x4AF]={
adobename="ustraightcyrillic",
category="ll",
contextname="cyrillicystr",
description="CYRILLIC SMALL LETTER STRAIGHT U",
direction="l",
linebreak="al",
- uccode=0x04AE,
- unicodeslot=0x04AF,
+ uccode=0x4AE,
+ unicodeslot=0x4AF,
},
- [0x04B0]={
+ [0x4B0]={
adobename="Ustraightstrokecyrillic",
category="lu",
contextname="cyrillicYstrstroke",
description="CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE",
direction="l",
- lccode=0x04B1,
+ lccode=0x4B1,
linebreak="al",
- unicodeslot=0x04B0,
+ unicodeslot=0x4B0,
},
- [0x04B1]={
+ [0x4B1]={
adobename="ustraightstrokecyrillic",
category="ll",
contextname="cyrillicystrstroke",
description="CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE",
direction="l",
linebreak="al",
- uccode=0x04B0,
- unicodeslot=0x04B1,
+ uccode=0x4B0,
+ unicodeslot=0x4B1,
},
- [0x04B2]={
+ [0x4B2]={
adobename="Hadescendercyrillic",
category="lu",
contextname="cyrillicHADC",
description="CYRILLIC CAPITAL LETTER HA WITH DESCENDER",
direction="l",
- lccode=0x04B3,
+ lccode=0x4B3,
linebreak="al",
- shcode=0x0425,
- unicodeslot=0x04B2,
+ shcode=0x425,
+ unicodeslot=0x4B2,
},
- [0x04B3]={
+ [0x4B3]={
adobename="hadescendercyrillic",
category="ll",
contextname="cyrillichadc",
description="CYRILLIC SMALL LETTER HA WITH DESCENDER",
direction="l",
linebreak="al",
- shcode=0x0445,
- uccode=0x04B2,
- unicodeslot=0x04B3,
+ shcode=0x445,
+ uccode=0x4B2,
+ unicodeslot=0x4B3,
},
- [0x04B4]={
+ [0x4B4]={
adobename="Tetsecyrillic",
category="lu",
contextname="cyrillicTETSE",
description="CYRILLIC CAPITAL LIGATURE TE TSE",
direction="l",
- lccode=0x04B5,
+ lccode=0x4B5,
linebreak="al",
- unicodeslot=0x04B4,
+ unicodeslot=0x4B4,
},
- [0x04B5]={
+ [0x4B5]={
adobename="tetsecyrillic",
category="ll",
contextname="cyrillictetse",
description="CYRILLIC SMALL LIGATURE TE TSE",
direction="l",
linebreak="al",
- uccode=0x04B4,
- unicodeslot=0x04B5,
+ uccode=0x4B4,
+ unicodeslot=0x4B5,
},
- [0x04B6]={
+ [0x4B6]={
adobename="Chedescendercyrillic",
category="lu",
contextname="cyrillicCHEDC",
description="CYRILLIC CAPITAL LETTER CHE WITH DESCENDER",
direction="l",
- lccode=0x04B7,
+ lccode=0x4B7,
linebreak="al",
- shcode=0x0427,
- unicodeslot=0x04B6,
+ shcode=0x427,
+ unicodeslot=0x4B6,
},
- [0x04B7]={
+ [0x4B7]={
adobename="chedescendercyrillic",
category="ll",
contextname="cyrillicchedc",
description="CYRILLIC SMALL LETTER CHE WITH DESCENDER",
direction="l",
linebreak="al",
- shcode=0x0447,
- uccode=0x04B6,
- unicodeslot=0x04B7,
+ shcode=0x447,
+ uccode=0x4B6,
+ unicodeslot=0x4B7,
},
- [0x04B8]={
+ [0x4B8]={
adobename="Cheverticalstrokecyrillic",
category="lu",
contextname="cyrillicCHEvertstroke",
description="CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE",
direction="l",
- lccode=0x04B9,
+ lccode=0x4B9,
linebreak="al",
- shcode=0x0427,
- unicodeslot=0x04B8,
+ shcode=0x427,
+ unicodeslot=0x4B8,
},
- [0x04B9]={
+ [0x4B9]={
adobename="cheverticalstrokecyrillic",
category="ll",
contextname="cyrillicchevertstroke",
description="CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE",
direction="l",
linebreak="al",
- shcode=0x0447,
- uccode=0x04B8,
- unicodeslot=0x04B9,
+ shcode=0x447,
+ uccode=0x4B8,
+ unicodeslot=0x4B9,
},
- [0x04BA]={
+ [0x4BA]={
adobename="Shhacyrillic",
category="lu",
contextname="cyrillicSHHA",
description="CYRILLIC CAPITAL LETTER SHHA",
direction="l",
- lccode=0x04BB,
+ lccode=0x4BB,
linebreak="al",
- unicodeslot=0x04BA,
+ unicodeslot=0x4BA,
},
- [0x04BB]={
+ [0x4BB]={
adobename="shhacyrillic",
category="ll",
contextname="cyrillicshha",
description="CYRILLIC SMALL LETTER SHHA",
direction="l",
linebreak="al",
- uccode=0x04BA,
- unicodeslot=0x04BB,
+ uccode=0x4BA,
+ unicodeslot=0x4BB,
},
- [0x04BC]={
+ [0x4BC]={
adobename="Cheabkhasiancyrillic",
category="lu",
contextname="cyrillicCHEabkhasian",
description="CYRILLIC CAPITAL LETTER ABKHASIAN CHE",
direction="l",
- lccode=0x04BD,
+ lccode=0x4BD,
linebreak="al",
- unicodeslot=0x04BC,
+ unicodeslot=0x4BC,
},
- [0x04BD]={
+ [0x4BD]={
adobename="cheabkhasiancyrillic",
category="ll",
contextname="cyrilliccheabkhasian",
description="CYRILLIC SMALL LETTER ABKHASIAN CHE",
direction="l",
linebreak="al",
- uccode=0x04BC,
- unicodeslot=0x04BD,
+ uccode=0x4BC,
+ unicodeslot=0x4BD,
},
- [0x04BE]={
+ [0x4BE]={
adobename="Chedescenderabkhasiancyrillic",
category="lu",
contextname="cyrillicCHEDCabkhasian",
description="CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER",
direction="l",
- lccode=0x04BF,
+ lccode=0x4BF,
linebreak="al",
- unicodeslot=0x04BE,
+ unicodeslot=0x4BE,
},
- [0x04BF]={
+ [0x4BF]={
adobename="chedescenderabkhasiancyrillic",
category="ll",
contextname="cyrillicchedcabkhasian",
description="CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER",
direction="l",
linebreak="al",
- uccode=0x04BE,
- unicodeslot=0x04BF,
+ uccode=0x4BE,
+ unicodeslot=0x4BF,
},
- [0x04C0]={
+ [0x4C0]={
adobename="palochkacyrillic",
category="lu",
contextname="cyrillicPALOCHKA",
description="CYRILLIC LETTER PALOCHKA",
direction="l",
- lccode=0x04CF,
+ lccode=0x4CF,
linebreak="al",
- unicodeslot=0x04C0,
+ unicodeslot=0x4C0,
},
- [0x04C1]={
+ [0x4C1]={
adobename="Zhebrevecyrillic",
category="lu",
contextname="cyrillicZHEbreve",
description="CYRILLIC CAPITAL LETTER ZHE WITH BREVE",
direction="l",
- lccode=0x04C2,
+ lccode=0x4C2,
linebreak="al",
- shcode=0x0416,
- specials={ "char", 0x0416, 0x0306 },
- unicodeslot=0x04C1,
+ shcode=0x416,
+ specials={ "char", 0x416, 0x306 },
+ unicodeslot=0x4C1,
},
- [0x04C2]={
+ [0x4C2]={
adobename="zhebrevecyrillic",
category="ll",
contextname="cyrilliczhebreve",
description="CYRILLIC SMALL LETTER ZHE WITH BREVE",
direction="l",
linebreak="al",
- shcode=0x0436,
- specials={ "char", 0x0436, 0x0306 },
- uccode=0x04C1,
- unicodeslot=0x04C2,
+ shcode=0x436,
+ specials={ "char", 0x436, 0x306 },
+ uccode=0x4C1,
+ unicodeslot=0x4C2,
},
- [0x04C3]={
+ [0x4C3]={
adobename="Kahookcyrillic",
category="lu",
contextname="cyrillicKAhook",
description="CYRILLIC CAPITAL LETTER KA WITH HOOK",
direction="l",
- lccode=0x04C4,
+ lccode=0x4C4,
linebreak="al",
- shcode=0x041A,
- unicodeslot=0x04C3,
+ shcode=0x41A,
+ unicodeslot=0x4C3,
},
- [0x04C4]={
+ [0x4C4]={
adobename="kahookcyrillic",
category="ll",
contextname="cyrillickahook",
description="CYRILLIC SMALL LETTER KA WITH HOOK",
direction="l",
linebreak="al",
- shcode=0x043A,
- uccode=0x04C3,
- unicodeslot=0x04C4,
+ shcode=0x43A,
+ uccode=0x4C3,
+ unicodeslot=0x4C4,
},
- [0x04C5]={
+ [0x4C5]={
category="lu",
contextname="cyrillicELtail",
description="CYRILLIC CAPITAL LETTER EL WITH TAIL",
direction="l",
- lccode=0x04C6,
+ lccode=0x4C6,
linebreak="al",
- shcode=0x041B,
- unicodeslot=0x04C5,
+ shcode=0x41B,
+ unicodeslot=0x4C5,
},
- [0x04C6]={
+ [0x4C6]={
category="ll",
contextname="cyrilliceltail",
description="CYRILLIC SMALL LETTER EL WITH TAIL",
direction="l",
linebreak="al",
- shcode=0x043B,
- uccode=0x04C5,
- unicodeslot=0x04C6,
+ shcode=0x43B,
+ uccode=0x4C5,
+ unicodeslot=0x4C6,
},
- [0x04C7]={
+ [0x4C7]={
adobename="Enhookcyrillic",
category="lu",
contextname="cyrillicENhook",
description="CYRILLIC CAPITAL LETTER EN WITH HOOK",
direction="l",
- lccode=0x04C8,
+ lccode=0x4C8,
linebreak="al",
- shcode=0x041D,
- unicodeslot=0x04C7,
+ shcode=0x41D,
+ unicodeslot=0x4C7,
},
- [0x04C8]={
+ [0x4C8]={
adobename="enhookcyrillic",
category="ll",
contextname="cyrillicenhook",
description="CYRILLIC SMALL LETTER EN WITH HOOK",
direction="l",
linebreak="al",
- shcode=0x043D,
- uccode=0x04C7,
- unicodeslot=0x04C8,
+ shcode=0x43D,
+ uccode=0x4C7,
+ unicodeslot=0x4C8,
},
- [0x04C9]={
+ [0x4C9]={
category="lu",
contextname="cyrillicENtail",
description="CYRILLIC CAPITAL LETTER EN WITH TAIL",
direction="l",
- lccode=0x04CA,
+ lccode=0x4CA,
linebreak="al",
- shcode=0x041D,
- unicodeslot=0x04C9,
+ shcode=0x41D,
+ unicodeslot=0x4C9,
},
- [0x04CA]={
+ [0x4CA]={
category="ll",
contextname="cyrillicentail",
description="CYRILLIC SMALL LETTER EN WITH TAIL",
direction="l",
linebreak="al",
- shcode=0x043D,
- uccode=0x04C9,
- unicodeslot=0x04CA,
+ shcode=0x43D,
+ uccode=0x4C9,
+ unicodeslot=0x4CA,
},
- [0x04CB]={
+ [0x4CB]={
adobename="Chekhakassiancyrillic",
category="lu",
contextname="cyrillicCHEkhakassian",
description="CYRILLIC CAPITAL LETTER KHAKASSIAN CHE",
direction="l",
- lccode=0x04CC,
+ lccode=0x4CC,
linebreak="al",
- unicodeslot=0x04CB,
+ unicodeslot=0x4CB,
},
- [0x04CC]={
+ [0x4CC]={
adobename="chekhakassiancyrillic",
category="ll",
contextname="cyrillicchekhakassian",
description="CYRILLIC SMALL LETTER KHAKASSIAN CHE",
direction="l",
linebreak="al",
- uccode=0x04CB,
- unicodeslot=0x04CC,
+ uccode=0x4CB,
+ unicodeslot=0x4CC,
},
- [0x04CD]={
+ [0x4CD]={
category="lu",
contextname="cyrillicEMtail",
description="CYRILLIC CAPITAL LETTER EM WITH TAIL",
direction="l",
- lccode=0x04CE,
+ lccode=0x4CE,
linebreak="al",
- shcode=0x041C,
- unicodeslot=0x04CD,
+ shcode=0x41C,
+ unicodeslot=0x4CD,
},
- [0x04CE]={
+ [0x4CE]={
category="ll",
contextname="cyrillicemtail",
description="CYRILLIC SMALL LETTER EM WITH TAIL",
direction="l",
linebreak="al",
- shcode=0x043C,
- uccode=0x04CD,
- unicodeslot=0x04CE,
+ shcode=0x43C,
+ uccode=0x4CD,
+ unicodeslot=0x4CE,
},
- [0x04CF]={
+ [0x4CF]={
category="ll",
description="CYRILLIC SMALL LETTER PALOCHKA",
direction="l",
linebreak="al",
- uccode=0x04C0,
- unicodeslot=0x04CF,
+ uccode=0x4C0,
+ unicodeslot=0x4CF,
},
- [0x04D0]={
+ [0x4D0]={
adobename="Abrevecyrillic",
category="lu",
contextname="cyrillicAbreve",
description="CYRILLIC CAPITAL LETTER A WITH BREVE",
direction="l",
- lccode=0x04D1,
+ lccode=0x4D1,
linebreak="al",
- shcode=0x0410,
- specials={ "char", 0x0410, 0x0306 },
- unicodeslot=0x04D0,
+ shcode=0x410,
+ specials={ "char", 0x410, 0x306 },
+ unicodeslot=0x4D0,
},
- [0x04D1]={
+ [0x4D1]={
adobename="abrevecyrillic",
category="ll",
contextname="cyrillicabreve",
description="CYRILLIC SMALL LETTER A WITH BREVE",
direction="l",
linebreak="al",
- shcode=0x0430,
- specials={ "char", 0x0430, 0x0306 },
- uccode=0x04D0,
- unicodeslot=0x04D1,
+ shcode=0x430,
+ specials={ "char", 0x430, 0x306 },
+ uccode=0x4D0,
+ unicodeslot=0x4D1,
},
- [0x04D2]={
+ [0x4D2]={
adobename="Adieresiscyrillic",
category="lu",
contextname="cyrillicAdiaeresis",
description="CYRILLIC CAPITAL LETTER A WITH DIAERESIS",
direction="l",
- lccode=0x04D3,
+ lccode=0x4D3,
linebreak="al",
- shcode=0x0410,
- specials={ "char", 0x0410, 0x0308 },
- unicodeslot=0x04D2,
+ shcode=0x410,
+ specials={ "char", 0x410, 0x308 },
+ unicodeslot=0x4D2,
},
- [0x04D3]={
+ [0x4D3]={
adobename="adieresiscyrillic",
category="ll",
contextname="cyrillicadiaeresis",
description="CYRILLIC SMALL LETTER A WITH DIAERESIS",
direction="l",
linebreak="al",
- shcode=0x0430,
- specials={ "char", 0x0430, 0x0308 },
- uccode=0x04D2,
- unicodeslot=0x04D3,
+ shcode=0x430,
+ specials={ "char", 0x430, 0x308 },
+ uccode=0x4D2,
+ unicodeslot=0x4D3,
},
- [0x04D4]={
+ [0x4D4]={
adobename="Aiecyrillic",
category="lu",
contextname="cyrillicAE",
description="CYRILLIC CAPITAL LIGATURE A IE",
direction="l",
- lccode=0x04D5,
+ lccode=0x4D5,
linebreak="al",
- unicodeslot=0x04D4,
+ unicodeslot=0x4D4,
},
- [0x04D5]={
+ [0x4D5]={
adobename="aiecyrillic",
category="ll",
contextname="cyrillicae",
description="CYRILLIC SMALL LIGATURE A IE",
direction="l",
linebreak="al",
- uccode=0x04D4,
- unicodeslot=0x04D5,
+ uccode=0x4D4,
+ unicodeslot=0x4D5,
},
- [0x04D6]={
+ [0x4D6]={
adobename="Iebrevecyrillic",
category="lu",
contextname="cyrillicEbreve",
description="CYRILLIC CAPITAL LETTER IE WITH BREVE",
direction="l",
- lccode=0x04D7,
+ lccode=0x4D7,
linebreak="al",
- shcode=0x0415,
- specials={ "char", 0x0415, 0x0306 },
- unicodeslot=0x04D6,
+ shcode=0x415,
+ specials={ "char", 0x415, 0x306 },
+ unicodeslot=0x4D6,
},
- [0x04D7]={
+ [0x4D7]={
adobename="iebrevecyrillic",
category="ll",
contextname="cyrillicebreve",
description="CYRILLIC SMALL LETTER IE WITH BREVE",
direction="l",
linebreak="al",
- shcode=0x0435,
- specials={ "char", 0x0435, 0x0306 },
- uccode=0x04D6,
- unicodeslot=0x04D7,
+ shcode=0x435,
+ specials={ "char", 0x435, 0x306 },
+ uccode=0x4D6,
+ unicodeslot=0x4D7,
},
- [0x04D8]={
+ [0x4D8]={
adobename="Schwacyrillic",
category="lu",
contextname="cyrillicSCHWA",
description="CYRILLIC CAPITAL LETTER SCHWA",
direction="l",
- lccode=0x04D9,
+ lccode=0x4D9,
linebreak="al",
- unicodeslot=0x04D8,
+ unicodeslot=0x4D8,
},
- [0x04D9]={
+ [0x4D9]={
adobename="schwacyrillic",
category="ll",
contextname="cyrillicschwa",
description="CYRILLIC SMALL LETTER SCHWA",
direction="l",
linebreak="al",
- uccode=0x04D8,
- unicodeslot=0x04D9,
+ uccode=0x4D8,
+ unicodeslot=0x4D9,
},
- [0x04DA]={
+ [0x4DA]={
adobename="Schwadieresiscyrillic",
category="lu",
contextname="cyrillicSCHWAdiaeresis",
description="CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS",
direction="l",
- lccode=0x04DB,
+ lccode=0x4DB,
linebreak="al",
- shcode=0x04D8,
- specials={ "char", 0x04D8, 0x0308 },
- unicodeslot=0x04DA,
+ shcode=0x4D8,
+ specials={ "char", 0x4D8, 0x308 },
+ unicodeslot=0x4DA,
},
- [0x04DB]={
+ [0x4DB]={
adobename="schwadieresiscyrillic",
category="ll",
contextname="cyrillicschwadiaeresis",
description="CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS",
direction="l",
linebreak="al",
- shcode=0x04D9,
- specials={ "char", 0x04D9, 0x0308 },
- uccode=0x04DA,
- unicodeslot=0x04DB,
+ shcode=0x4D9,
+ specials={ "char", 0x4D9, 0x308 },
+ uccode=0x4DA,
+ unicodeslot=0x4DB,
},
- [0x04DC]={
+ [0x4DC]={
adobename="Zhedieresiscyrillic",
category="lu",
contextname="cyrillicZHEdiaeresis",
description="CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS",
direction="l",
- lccode=0x04DD,
+ lccode=0x4DD,
linebreak="al",
- shcode=0x0416,
- specials={ "char", 0x0416, 0x0308 },
- unicodeslot=0x04DC,
+ shcode=0x416,
+ specials={ "char", 0x416, 0x308 },
+ unicodeslot=0x4DC,
},
- [0x04DD]={
+ [0x4DD]={
adobename="zhedieresiscyrillic",
category="ll",
contextname="cyrilliczhediaeresis",
description="CYRILLIC SMALL LETTER ZHE WITH DIAERESIS",
direction="l",
linebreak="al",
- shcode=0x0436,
- specials={ "char", 0x0436, 0x0308 },
- uccode=0x04DC,
- unicodeslot=0x04DD,
+ shcode=0x436,
+ specials={ "char", 0x436, 0x308 },
+ uccode=0x4DC,
+ unicodeslot=0x4DD,
},
- [0x04DE]={
+ [0x4DE]={
adobename="Zedieresiscyrillic",
category="lu",
contextname="cyrillicZEdiaeresis",
description="CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS",
direction="l",
- lccode=0x04DF,
+ lccode=0x4DF,
linebreak="al",
- shcode=0x0417,
- specials={ "char", 0x0417, 0x0308 },
- unicodeslot=0x04DE,
+ shcode=0x417,
+ specials={ "char", 0x417, 0x308 },
+ unicodeslot=0x4DE,
},
- [0x04DF]={
+ [0x4DF]={
adobename="zedieresiscyrillic",
category="ll",
contextname="cyrilliczediaeresis",
description="CYRILLIC SMALL LETTER ZE WITH DIAERESIS",
direction="l",
linebreak="al",
- shcode=0x0437,
- specials={ "char", 0x0437, 0x0308 },
- uccode=0x04DE,
- unicodeslot=0x04DF,
+ shcode=0x437,
+ specials={ "char", 0x437, 0x308 },
+ uccode=0x4DE,
+ unicodeslot=0x4DF,
},
- [0x04E0]={
+ [0x4E0]={
adobename="Dzeabkhasiancyrillic",
category="lu",
contextname="cyrillicDZEabkhasian",
description="CYRILLIC CAPITAL LETTER ABKHASIAN DZE",
direction="l",
- lccode=0x04E1,
+ lccode=0x4E1,
linebreak="al",
- unicodeslot=0x04E0,
+ unicodeslot=0x4E0,
},
- [0x04E1]={
+ [0x4E1]={
adobename="dzeabkhasiancyrillic",
category="ll",
contextname="cyrillicdzeabkhasian",
description="CYRILLIC SMALL LETTER ABKHASIAN DZE",
direction="l",
linebreak="al",
- uccode=0x04E0,
- unicodeslot=0x04E1,
+ uccode=0x4E0,
+ unicodeslot=0x4E1,
},
- [0x04E2]={
+ [0x4E2]={
adobename="Imacroncyrillic",
category="lu",
contextname="cyrillicImacron",
description="CYRILLIC CAPITAL LETTER I WITH MACRON",
direction="l",
- lccode=0x04E3,
+ lccode=0x4E3,
linebreak="al",
- shcode=0x0418,
- specials={ "char", 0x0418, 0x0304 },
- unicodeslot=0x04E2,
+ shcode=0x418,
+ specials={ "char", 0x418, 0x304 },
+ unicodeslot=0x4E2,
},
- [0x04E3]={
+ [0x4E3]={
adobename="imacroncyrillic",
category="ll",
contextname="cyrillicimacron",
description="CYRILLIC SMALL LETTER I WITH MACRON",
direction="l",
linebreak="al",
- shcode=0x0438,
- specials={ "char", 0x0438, 0x0304 },
- uccode=0x04E2,
- unicodeslot=0x04E3,
+ shcode=0x438,
+ specials={ "char", 0x438, 0x304 },
+ uccode=0x4E2,
+ unicodeslot=0x4E3,
},
- [0x04E4]={
+ [0x4E4]={
adobename="Idieresiscyrillic",
category="lu",
contextname="cyrillicIdiaeresis",
description="CYRILLIC CAPITAL LETTER I WITH DIAERESIS",
direction="l",
- lccode=0x04E5,
+ lccode=0x4E5,
linebreak="al",
- shcode=0x0418,
- specials={ "char", 0x0418, 0x0308 },
- unicodeslot=0x04E4,
+ shcode=0x418,
+ specials={ "char", 0x418, 0x308 },
+ unicodeslot=0x4E4,
},
- [0x04E5]={
+ [0x4E5]={
adobename="idieresiscyrillic",
category="ll",
contextname="cyrillicidiaeresis",
description="CYRILLIC SMALL LETTER I WITH DIAERESIS",
direction="l",
linebreak="al",
- shcode=0x0438,
- specials={ "char", 0x0438, 0x0308 },
- uccode=0x04E4,
- unicodeslot=0x04E5,
+ shcode=0x438,
+ specials={ "char", 0x438, 0x308 },
+ uccode=0x4E4,
+ unicodeslot=0x4E5,
},
- [0x04E6]={
+ [0x4E6]={
adobename="Odieresiscyrillic",
category="lu",
contextname="cyrillicOdiaeresis",
description="CYRILLIC CAPITAL LETTER O WITH DIAERESIS",
direction="l",
- lccode=0x04E7,
+ lccode=0x4E7,
linebreak="al",
- shcode=0x041E,
- specials={ "char", 0x041E, 0x0308 },
- unicodeslot=0x04E6,
+ shcode=0x41E,
+ specials={ "char", 0x41E, 0x308 },
+ unicodeslot=0x4E6,
},
- [0x04E7]={
+ [0x4E7]={
adobename="odieresiscyrillic",
category="ll",
contextname="cyrillicodiaeresis",
description="CYRILLIC SMALL LETTER O WITH DIAERESIS",
direction="l",
linebreak="al",
- shcode=0x043E,
- specials={ "char", 0x043E, 0x0308 },
- uccode=0x04E6,
- unicodeslot=0x04E7,
+ shcode=0x43E,
+ specials={ "char", 0x43E, 0x308 },
+ uccode=0x4E6,
+ unicodeslot=0x4E7,
},
- [0x04E8]={
+ [0x4E8]={
adobename="Obarredcyrillic",
category="lu",
contextname="cyrillicObarred",
description="CYRILLIC CAPITAL LETTER BARRED O",
direction="l",
- lccode=0x04E9,
+ lccode=0x4E9,
linebreak="al",
- unicodeslot=0x04E8,
+ unicodeslot=0x4E8,
},
- [0x04E9]={
+ [0x4E9]={
adobename="obarredcyrillic",
category="ll",
contextname="cyrillicobarred",
description="CYRILLIC SMALL LETTER BARRED O",
direction="l",
linebreak="al",
- uccode=0x04E8,
- unicodeslot=0x04E9,
+ uccode=0x4E8,
+ unicodeslot=0x4E9,
},
- [0x04EA]={
+ [0x4EA]={
adobename="Obarreddieresiscyrillic",
category="lu",
contextname="cyrillicObarreddiaeresis",
description="CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS",
direction="l",
- lccode=0x04EB,
+ lccode=0x4EB,
linebreak="al",
- specials={ "char", 0x04E8, 0x0308 },
- unicodeslot=0x04EA,
+ specials={ "char", 0x4E8, 0x308 },
+ unicodeslot=0x4EA,
},
- [0x04EB]={
+ [0x4EB]={
adobename="obarreddieresiscyrillic",
category="ll",
contextname="cyrillicobarreddiaeresis",
description="CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS",
direction="l",
linebreak="al",
- specials={ "char", 0x04E9, 0x0308 },
- uccode=0x04EA,
- unicodeslot=0x04EB,
+ specials={ "char", 0x4E9, 0x308 },
+ uccode=0x4EA,
+ unicodeslot=0x4EB,
},
- [0x04EC]={
+ [0x4EC]={
category="lu",
contextname="cyrillicEdiaeresis",
description="CYRILLIC CAPITAL LETTER E WITH DIAERESIS",
direction="l",
- lccode=0x04ED,
+ lccode=0x4ED,
linebreak="al",
- shcode=0x042D,
- specials={ "char", 0x042D, 0x0308 },
- unicodeslot=0x04EC,
+ shcode=0x42D,
+ specials={ "char", 0x42D, 0x308 },
+ unicodeslot=0x4EC,
},
- [0x04ED]={
+ [0x4ED]={
category="ll",
contextname="cyrillicediaeresis",
description="CYRILLIC SMALL LETTER E WITH DIAERESIS",
direction="l",
linebreak="al",
- shcode=0x044D,
- specials={ "char", 0x044D, 0x0308 },
- uccode=0x04EC,
- unicodeslot=0x04ED,
+ shcode=0x44D,
+ specials={ "char", 0x44D, 0x308 },
+ uccode=0x4EC,
+ unicodeslot=0x4ED,
},
- [0x04EE]={
+ [0x4EE]={
adobename="Umacroncyrillic",
category="lu",
contextname="cyrillicUmacron",
description="CYRILLIC CAPITAL LETTER U WITH MACRON",
direction="l",
- lccode=0x04EF,
+ lccode=0x4EF,
linebreak="al",
- shcode=0x0423,
- specials={ "char", 0x0423, 0x0304 },
- unicodeslot=0x04EE,
+ shcode=0x423,
+ specials={ "char", 0x423, 0x304 },
+ unicodeslot=0x4EE,
},
- [0x04EF]={
+ [0x4EF]={
adobename="umacroncyrillic",
category="ll",
contextname="cyrillicumacron",
description="CYRILLIC SMALL LETTER U WITH MACRON",
direction="l",
linebreak="al",
- shcode=0x0443,
- specials={ "char", 0x0443, 0x0304 },
- uccode=0x04EE,
- unicodeslot=0x04EF,
+ shcode=0x443,
+ specials={ "char", 0x443, 0x304 },
+ uccode=0x4EE,
+ unicodeslot=0x4EF,
},
- [0x04F0]={
+ [0x4F0]={
adobename="Udieresiscyrillic",
category="lu",
contextname="cyrillicUdiaeresis",
description="CYRILLIC CAPITAL LETTER U WITH DIAERESIS",
direction="l",
- lccode=0x04F1,
+ lccode=0x4F1,
linebreak="al",
- shcode=0x0423,
- specials={ "char", 0x0423, 0x0308 },
- unicodeslot=0x04F0,
+ shcode=0x423,
+ specials={ "char", 0x423, 0x308 },
+ unicodeslot=0x4F0,
},
- [0x04F1]={
+ [0x4F1]={
adobename="udieresiscyrillic",
category="ll",
contextname="cyrillicudiaeresis",
description="CYRILLIC SMALL LETTER U WITH DIAERESIS",
direction="l",
linebreak="al",
- shcode=0x0443,
- specials={ "char", 0x0443, 0x0308 },
- uccode=0x04F0,
- unicodeslot=0x04F1,
+ shcode=0x443,
+ specials={ "char", 0x443, 0x308 },
+ uccode=0x4F0,
+ unicodeslot=0x4F1,
},
- [0x04F2]={
+ [0x4F2]={
adobename="Uhungarumlautcyrillic",
category="lu",
contextname="cyrillicUdoubleacute",
description="CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE",
direction="l",
- lccode=0x04F3,
+ lccode=0x4F3,
linebreak="al",
- shcode=0x0423,
- specials={ "char", 0x0423, 0x030B },
- unicodeslot=0x04F2,
+ shcode=0x423,
+ specials={ "char", 0x423, 0x30B },
+ unicodeslot=0x4F2,
},
- [0x04F3]={
+ [0x4F3]={
adobename="uhungarumlautcyrillic",
category="ll",
contextname="cyrillicudoubleacute",
description="CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE",
direction="l",
linebreak="al",
- shcode=0x0443,
- specials={ "char", 0x0443, 0x030B },
- uccode=0x04F2,
- unicodeslot=0x04F3,
+ shcode=0x443,
+ specials={ "char", 0x443, 0x30B },
+ uccode=0x4F2,
+ unicodeslot=0x4F3,
},
- [0x04F4]={
+ [0x4F4]={
adobename="Chedieresiscyrillic",
category="lu",
contextname="cyrillicCHEdiaeresis",
description="CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS",
direction="l",
- lccode=0x04F5,
+ lccode=0x4F5,
linebreak="al",
- shcode=0x0427,
- specials={ "char", 0x0427, 0x0308 },
- unicodeslot=0x04F4,
+ shcode=0x427,
+ specials={ "char", 0x427, 0x308 },
+ unicodeslot=0x4F4,
},
- [0x04F5]={
+ [0x4F5]={
adobename="chedieresiscyrillic",
category="ll",
contextname="cyrillicchediaeresis",
description="CYRILLIC SMALL LETTER CHE WITH DIAERESIS",
direction="l",
linebreak="al",
- shcode=0x0447,
- specials={ "char", 0x0447, 0x0308 },
- uccode=0x04F4,
- unicodeslot=0x04F5,
+ shcode=0x447,
+ specials={ "char", 0x447, 0x308 },
+ uccode=0x4F4,
+ unicodeslot=0x4F5,
},
- [0x04F6]={
+ [0x4F6]={
category="lu",
description="CYRILLIC CAPITAL LETTER GHE WITH DESCENDER",
direction="l",
- lccode=0x04F7,
+ lccode=0x4F7,
linebreak="al",
- shcode=0x0413,
- unicodeslot=0x04F6,
+ shcode=0x413,
+ unicodeslot=0x4F6,
},
- [0x04F7]={
+ [0x4F7]={
category="ll",
description="CYRILLIC SMALL LETTER GHE WITH DESCENDER",
direction="l",
linebreak="al",
- shcode=0x0433,
- uccode=0x04F6,
- unicodeslot=0x04F7,
+ shcode=0x433,
+ uccode=0x4F6,
+ unicodeslot=0x4F7,
},
- [0x04F8]={
+ [0x4F8]={
adobename="Yerudieresiscyrillic",
category="lu",
contextname="cyrillicYERUdiaeresis",
description="CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS",
direction="l",
- lccode=0x04F9,
+ lccode=0x4F9,
linebreak="al",
- shcode=0x042B,
- specials={ "char", 0x042B, 0x0308 },
- unicodeslot=0x04F8,
+ shcode=0x42B,
+ specials={ "char", 0x42B, 0x308 },
+ unicodeslot=0x4F8,
},
- [0x04F9]={
+ [0x4F9]={
adobename="yerudieresiscyrillic",
category="ll",
contextname="cyrillicyerudiaeresis",
description="CYRILLIC SMALL LETTER YERU WITH DIAERESIS",
direction="l",
linebreak="al",
- shcode=0x044B,
- specials={ "char", 0x044B, 0x0308 },
- uccode=0x04F8,
- unicodeslot=0x04F9,
+ shcode=0x44B,
+ specials={ "char", 0x44B, 0x308 },
+ uccode=0x4F8,
+ unicodeslot=0x4F9,
},
- [0x04FA]={
+ [0x4FA]={
category="lu",
description="CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK",
direction="l",
- lccode=0x04FB,
+ lccode=0x4FB,
linebreak="al",
- shcode=0x0413,
- unicodeslot=0x04FA,
+ shcode=0x413,
+ unicodeslot=0x4FA,
},
- [0x04FB]={
+ [0x4FB]={
category="ll",
description="CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK",
direction="l",
linebreak="al",
- shcode=0x0433,
- uccode=0x04FA,
- unicodeslot=0x04FB,
+ shcode=0x433,
+ uccode=0x4FA,
+ unicodeslot=0x4FB,
},
- [0x04FC]={
+ [0x4FC]={
category="lu",
description="CYRILLIC CAPITAL LETTER HA WITH HOOK",
direction="l",
- lccode=0x04FD,
+ lccode=0x4FD,
linebreak="al",
- shcode=0x0425,
- unicodeslot=0x04FC,
+ shcode=0x425,
+ unicodeslot=0x4FC,
},
- [0x04FD]={
+ [0x4FD]={
category="ll",
description="CYRILLIC SMALL LETTER HA WITH HOOK",
direction="l",
linebreak="al",
- shcode=0x0445,
- uccode=0x04FC,
- unicodeslot=0x04FD,
+ shcode=0x445,
+ uccode=0x4FC,
+ unicodeslot=0x4FD,
},
- [0x04FE]={
+ [0x4FE]={
category="lu",
description="CYRILLIC CAPITAL LETTER HA WITH STROKE",
direction="l",
- lccode=0x04FF,
+ lccode=0x4FF,
linebreak="al",
- shcode=0x0425,
- unicodeslot=0x04FE,
+ shcode=0x425,
+ unicodeslot=0x4FE,
},
- [0x04FF]={
+ [0x4FF]={
category="ll",
description="CYRILLIC SMALL LETTER HA WITH STROKE",
direction="l",
linebreak="al",
- shcode=0x0445,
- uccode=0x04FE,
- unicodeslot=0x04FF,
+ shcode=0x445,
+ uccode=0x4FE,
+ unicodeslot=0x4FF,
},
- [0x0500]={
+ [0x500]={
category="lu",
description="CYRILLIC CAPITAL LETTER KOMI DE",
direction="l",
- lccode=0x0501,
+ lccode=0x501,
linebreak="al",
- unicodeslot=0x0500,
+ unicodeslot=0x500,
},
- [0x0501]={
+ [0x501]={
category="ll",
description="CYRILLIC SMALL LETTER KOMI DE",
direction="l",
linebreak="al",
- uccode=0x0500,
- unicodeslot=0x0501,
+ uccode=0x500,
+ unicodeslot=0x501,
},
- [0x0502]={
+ [0x502]={
category="lu",
description="CYRILLIC CAPITAL LETTER KOMI DJE",
direction="l",
- lccode=0x0503,
+ lccode=0x503,
linebreak="al",
- unicodeslot=0x0502,
+ unicodeslot=0x502,
},
- [0x0503]={
+ [0x503]={
category="ll",
description="CYRILLIC SMALL LETTER KOMI DJE",
direction="l",
linebreak="al",
- uccode=0x0502,
- unicodeslot=0x0503,
+ uccode=0x502,
+ unicodeslot=0x503,
},
- [0x0504]={
+ [0x504]={
category="lu",
description="CYRILLIC CAPITAL LETTER KOMI ZJE",
direction="l",
- lccode=0x0505,
+ lccode=0x505,
linebreak="al",
- unicodeslot=0x0504,
+ unicodeslot=0x504,
},
- [0x0505]={
+ [0x505]={
category="ll",
description="CYRILLIC SMALL LETTER KOMI ZJE",
direction="l",
linebreak="al",
- uccode=0x0504,
- unicodeslot=0x0505,
+ uccode=0x504,
+ unicodeslot=0x505,
},
- [0x0506]={
+ [0x506]={
category="lu",
description="CYRILLIC CAPITAL LETTER KOMI DZJE",
direction="l",
- lccode=0x0507,
+ lccode=0x507,
linebreak="al",
- unicodeslot=0x0506,
+ unicodeslot=0x506,
},
- [0x0507]={
+ [0x507]={
category="ll",
description="CYRILLIC SMALL LETTER KOMI DZJE",
direction="l",
linebreak="al",
- uccode=0x0506,
- unicodeslot=0x0507,
+ uccode=0x506,
+ unicodeslot=0x507,
},
- [0x0508]={
+ [0x508]={
category="lu",
description="CYRILLIC CAPITAL LETTER KOMI LJE",
direction="l",
- lccode=0x0509,
+ lccode=0x509,
linebreak="al",
- unicodeslot=0x0508,
+ unicodeslot=0x508,
},
- [0x0509]={
+ [0x509]={
category="ll",
description="CYRILLIC SMALL LETTER KOMI LJE",
direction="l",
linebreak="al",
- uccode=0x0508,
- unicodeslot=0x0509,
+ uccode=0x508,
+ unicodeslot=0x509,
},
- [0x050A]={
+ [0x50A]={
category="lu",
description="CYRILLIC CAPITAL LETTER KOMI NJE",
direction="l",
- lccode=0x050B,
+ lccode=0x50B,
linebreak="al",
- unicodeslot=0x050A,
+ unicodeslot=0x50A,
},
- [0x050B]={
+ [0x50B]={
category="ll",
description="CYRILLIC SMALL LETTER KOMI NJE",
direction="l",
linebreak="al",
- uccode=0x050A,
- unicodeslot=0x050B,
+ uccode=0x50A,
+ unicodeslot=0x50B,
},
- [0x050C]={
+ [0x50C]={
category="lu",
description="CYRILLIC CAPITAL LETTER KOMI SJE",
direction="l",
- lccode=0x050D,
+ lccode=0x50D,
linebreak="al",
- unicodeslot=0x050C,
+ unicodeslot=0x50C,
},
- [0x050D]={
+ [0x50D]={
category="ll",
description="CYRILLIC SMALL LETTER KOMI SJE",
direction="l",
linebreak="al",
- uccode=0x050C,
- unicodeslot=0x050D,
+ uccode=0x50C,
+ unicodeslot=0x50D,
},
- [0x050E]={
+ [0x50E]={
category="lu",
description="CYRILLIC CAPITAL LETTER KOMI TJE",
direction="l",
- lccode=0x050F,
+ lccode=0x50F,
linebreak="al",
- unicodeslot=0x050E,
+ unicodeslot=0x50E,
},
- [0x050F]={
+ [0x50F]={
category="ll",
description="CYRILLIC SMALL LETTER KOMI TJE",
direction="l",
linebreak="al",
- uccode=0x050E,
- unicodeslot=0x050F,
+ uccode=0x50E,
+ unicodeslot=0x50F,
},
- [0x0510]={
+ [0x510]={
category="lu",
description="CYRILLIC CAPITAL LETTER REVERSED ZE",
direction="l",
- lccode=0x0511,
+ lccode=0x511,
linebreak="al",
- unicodeslot=0x0510,
+ unicodeslot=0x510,
},
- [0x0511]={
+ [0x511]={
category="ll",
description="CYRILLIC SMALL LETTER REVERSED ZE",
direction="l",
linebreak="al",
- uccode=0x0510,
- unicodeslot=0x0511,
+ uccode=0x510,
+ unicodeslot=0x511,
},
- [0x0512]={
+ [0x512]={
category="lu",
description="CYRILLIC CAPITAL LETTER EL WITH HOOK",
direction="l",
- lccode=0x0513,
+ lccode=0x513,
linebreak="al",
- shcode=0x041B,
- unicodeslot=0x0512,
+ shcode=0x41B,
+ unicodeslot=0x512,
},
- [0x0513]={
+ [0x513]={
category="ll",
description="CYRILLIC SMALL LETTER EL WITH HOOK",
direction="l",
linebreak="al",
- shcode=0x043B,
- uccode=0x0512,
- unicodeslot=0x0513,
+ shcode=0x43B,
+ uccode=0x512,
+ unicodeslot=0x513,
},
- [0x0514]={
+ [0x514]={
category="lu",
description="CYRILLIC CAPITAL LETTER LHA",
direction="l",
linebreak="al",
- unicodeslot=0x0514,
+ unicodeslot=0x514,
},
- [0x0515]={
+ [0x515]={
category="ll",
description="CYRILLIC SMALL LETTER LHA",
direction="l",
linebreak="al",
- unicodeslot=0x0515,
+ unicodeslot=0x515,
},
- [0x0516]={
+ [0x516]={
category="lu",
description="CYRILLIC CAPITAL LETTER RHA",
direction="l",
linebreak="al",
- unicodeslot=0x0516,
+ unicodeslot=0x516,
},
- [0x0517]={
+ [0x517]={
category="ll",
description="CYRILLIC SMALL LETTER RHA",
direction="l",
linebreak="al",
- unicodeslot=0x0517,
+ unicodeslot=0x517,
},
- [0x0518]={
+ [0x518]={
category="lu",
description="CYRILLIC CAPITAL LETTER YAE",
direction="l",
linebreak="al",
- unicodeslot=0x0518,
+ unicodeslot=0x518,
},
- [0x0519]={
+ [0x519]={
category="ll",
description="CYRILLIC SMALL LETTER YAE",
direction="l",
linebreak="al",
- unicodeslot=0x0519,
+ unicodeslot=0x519,
},
- [0x051A]={
+ [0x51A]={
category="lu",
description="CYRILLIC CAPITAL LETTER QA",
direction="l",
linebreak="al",
- unicodeslot=0x051A,
+ unicodeslot=0x51A,
},
- [0x051B]={
+ [0x51B]={
category="ll",
description="CYRILLIC SMALL LETTER QA",
direction="l",
linebreak="al",
- unicodeslot=0x051B,
+ unicodeslot=0x51B,
},
- [0x051C]={
+ [0x51C]={
category="lu",
description="CYRILLIC CAPITAL LETTER WE",
direction="l",
linebreak="al",
- unicodeslot=0x051C,
+ unicodeslot=0x51C,
},
- [0x051D]={
+ [0x51D]={
category="ll",
description="CYRILLIC SMALL LETTER WE",
direction="l",
linebreak="al",
- unicodeslot=0x051D,
+ unicodeslot=0x51D,
},
- [0x051E]={
+ [0x51E]={
category="lu",
description="CYRILLIC CAPITAL LETTER ALEUT KA",
direction="l",
linebreak="al",
- unicodeslot=0x051E,
+ unicodeslot=0x51E,
},
- [0x051F]={
+ [0x51F]={
category="ll",
description="CYRILLIC SMALL LETTER ALEUT KA",
direction="l",
linebreak="al",
- unicodeslot=0x051F,
+ unicodeslot=0x51F,
},
- [0x0520]={
+ [0x520]={
category="lu",
description="CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK",
direction="l",
linebreak="al",
- unicodeslot=0x0520,
+ unicodeslot=0x520,
},
- [0x0521]={
+ [0x521]={
category="ll",
description="CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK",
direction="l",
linebreak="al",
- unicodeslot=0x0521,
+ unicodeslot=0x521,
},
- [0x0522]={
+ [0x522]={
category="lu",
description="CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK",
direction="l",
linebreak="al",
- unicodeslot=0x0522,
+ unicodeslot=0x522,
},
- [0x0523]={
+ [0x523]={
category="ll",
description="CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK",
direction="l",
linebreak="al",
- unicodeslot=0x0523,
+ unicodeslot=0x523,
},
- [0x0524]={
+ [0x524]={
category="lu",
description="CYRILLIC CAPITAL LETTER PE WITH DESCENDER",
direction="l",
linebreak="al",
- unicodeslot=0x0524,
+ unicodeslot=0x524,
},
- [0x0525]={
+ [0x525]={
category="ll",
description="CYRILLIC SMALL LETTER PE WITH DESCENDER",
direction="l",
linebreak="al",
- unicodeslot=0x0525,
+ unicodeslot=0x525,
},
- [0x0526]={
+ [0x526]={
category="lu",
description="CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER",
direction="l",
linebreak="al",
- unicodeslot=0x0526,
+ unicodeslot=0x526,
},
- [0x0527]={
+ [0x527]={
category="ll",
description="CYRILLIC SMALL LETTER SHHA WITH DESCENDER",
direction="l",
linebreak="al",
- unicodeslot=0x0527,
+ unicodeslot=0x527,
+ },
+ [0x528]={
+ category="lu",
+ description="CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x528,
+ },
+ [0x529]={
+ category="ll",
+ description="CYRILLIC SMALL LETTER EN WITH LEFT HOOK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x529,
+ },
+ [0x52A]={
+ category="lu",
+ description="CYRILLIC CAPITAL LETTER DZZHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x52A,
},
- [0x0531]={
+ [0x52B]={
+ category="ll",
+ description="CYRILLIC SMALL LETTER DZZHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x52B,
+ },
+ [0x52C]={
+ category="lu",
+ description="CYRILLIC CAPITAL LETTER DCHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x52C,
+ },
+ [0x52D]={
+ category="ll",
+ description="CYRILLIC SMALL LETTER DCHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x52D,
+ },
+ [0x52E]={
+ category="lu",
+ description="CYRILLIC CAPITAL LETTER EL WITH DESCENDER",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x52E,
+ },
+ [0x52F]={
+ category="ll",
+ description="CYRILLIC SMALL LETTER EL WITH DESCENDER",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x52F,
+ },
+ [0x531]={
adobename="Aybarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER AYB",
direction="l",
- lccode=0x0561,
+ lccode=0x561,
linebreak="al",
- unicodeslot=0x0531,
+ unicodeslot=0x531,
},
- [0x0532]={
+ [0x532]={
adobename="Benarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER BEN",
direction="l",
- lccode=0x0562,
+ lccode=0x562,
linebreak="al",
- unicodeslot=0x0532,
+ unicodeslot=0x532,
},
- [0x0533]={
+ [0x533]={
adobename="Gimarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER GIM",
direction="l",
- lccode=0x0563,
+ lccode=0x563,
linebreak="al",
- unicodeslot=0x0533,
+ unicodeslot=0x533,
},
- [0x0534]={
+ [0x534]={
adobename="Daarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER DA",
direction="l",
- lccode=0x0564,
+ lccode=0x564,
linebreak="al",
- unicodeslot=0x0534,
+ unicodeslot=0x534,
},
- [0x0535]={
+ [0x535]={
adobename="Echarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER ECH",
direction="l",
- lccode=0x0565,
+ lccode=0x565,
linebreak="al",
- unicodeslot=0x0535,
+ unicodeslot=0x535,
},
- [0x0536]={
+ [0x536]={
adobename="Zaarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER ZA",
direction="l",
- lccode=0x0566,
+ lccode=0x566,
linebreak="al",
- unicodeslot=0x0536,
+ unicodeslot=0x536,
},
- [0x0537]={
+ [0x537]={
adobename="Eharmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER EH",
direction="l",
- lccode=0x0567,
+ lccode=0x567,
linebreak="al",
- unicodeslot=0x0537,
+ unicodeslot=0x537,
},
- [0x0538]={
+ [0x538]={
adobename="Etarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER ET",
direction="l",
- lccode=0x0568,
+ lccode=0x568,
linebreak="al",
- unicodeslot=0x0538,
+ unicodeslot=0x538,
},
- [0x0539]={
+ [0x539]={
adobename="Toarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER TO",
direction="l",
- lccode=0x0569,
+ lccode=0x569,
linebreak="al",
- unicodeslot=0x0539,
+ unicodeslot=0x539,
},
- [0x053A]={
+ [0x53A]={
adobename="Zhearmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER ZHE",
direction="l",
- lccode=0x056A,
+ lccode=0x56A,
linebreak="al",
- unicodeslot=0x053A,
+ unicodeslot=0x53A,
},
- [0x053B]={
+ [0x53B]={
adobename="Iniarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER INI",
direction="l",
- lccode=0x056B,
+ lccode=0x56B,
linebreak="al",
- unicodeslot=0x053B,
+ unicodeslot=0x53B,
},
- [0x053C]={
+ [0x53C]={
adobename="Liwnarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER LIWN",
direction="l",
- lccode=0x056C,
+ lccode=0x56C,
linebreak="al",
- unicodeslot=0x053C,
+ unicodeslot=0x53C,
},
- [0x053D]={
+ [0x53D]={
adobename="Xeharmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER XEH",
direction="l",
- lccode=0x056D,
+ lccode=0x56D,
linebreak="al",
- unicodeslot=0x053D,
+ unicodeslot=0x53D,
},
- [0x053E]={
+ [0x53E]={
adobename="Caarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER CA",
direction="l",
- lccode=0x056E,
+ lccode=0x56E,
linebreak="al",
- unicodeslot=0x053E,
+ unicodeslot=0x53E,
},
- [0x053F]={
+ [0x53F]={
adobename="Kenarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER KEN",
direction="l",
- lccode=0x056F,
+ lccode=0x56F,
linebreak="al",
- unicodeslot=0x053F,
+ unicodeslot=0x53F,
},
- [0x0540]={
+ [0x540]={
adobename="Hoarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER HO",
direction="l",
- lccode=0x0570,
+ lccode=0x570,
linebreak="al",
- unicodeslot=0x0540,
+ unicodeslot=0x540,
},
- [0x0541]={
+ [0x541]={
adobename="Jaarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER JA",
direction="l",
- lccode=0x0571,
+ lccode=0x571,
linebreak="al",
- unicodeslot=0x0541,
+ unicodeslot=0x541,
},
- [0x0542]={
+ [0x542]={
adobename="Ghadarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER GHAD",
direction="l",
- lccode=0x0572,
+ lccode=0x572,
linebreak="al",
- unicodeslot=0x0542,
+ unicodeslot=0x542,
},
- [0x0543]={
+ [0x543]={
adobename="Cheharmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER CHEH",
direction="l",
- lccode=0x0573,
+ lccode=0x573,
linebreak="al",
- unicodeslot=0x0543,
+ unicodeslot=0x543,
},
- [0x0544]={
+ [0x544]={
adobename="Menarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER MEN",
direction="l",
- lccode=0x0574,
+ lccode=0x574,
linebreak="al",
- unicodeslot=0x0544,
+ unicodeslot=0x544,
},
- [0x0545]={
+ [0x545]={
adobename="Yiarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER YI",
direction="l",
- lccode=0x0575,
+ lccode=0x575,
linebreak="al",
- unicodeslot=0x0545,
+ unicodeslot=0x545,
},
- [0x0546]={
+ [0x546]={
adobename="Nowarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER NOW",
direction="l",
- lccode=0x0576,
+ lccode=0x576,
linebreak="al",
- unicodeslot=0x0546,
+ unicodeslot=0x546,
},
- [0x0547]={
+ [0x547]={
adobename="Shaarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER SHA",
direction="l",
- lccode=0x0577,
+ lccode=0x577,
linebreak="al",
- unicodeslot=0x0547,
+ unicodeslot=0x547,
},
- [0x0548]={
+ [0x548]={
adobename="Voarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER VO",
direction="l",
- lccode=0x0578,
+ lccode=0x578,
linebreak="al",
- unicodeslot=0x0548,
+ unicodeslot=0x548,
},
- [0x0549]={
+ [0x549]={
adobename="Chaarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER CHA",
direction="l",
- lccode=0x0579,
+ lccode=0x579,
linebreak="al",
- unicodeslot=0x0549,
+ unicodeslot=0x549,
},
- [0x054A]={
+ [0x54A]={
adobename="Peharmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER PEH",
direction="l",
- lccode=0x057A,
+ lccode=0x57A,
linebreak="al",
- unicodeslot=0x054A,
+ unicodeslot=0x54A,
},
- [0x054B]={
+ [0x54B]={
adobename="Jheharmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER JHEH",
direction="l",
- lccode=0x057B,
+ lccode=0x57B,
linebreak="al",
- unicodeslot=0x054B,
+ unicodeslot=0x54B,
},
- [0x054C]={
+ [0x54C]={
adobename="Raarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER RA",
direction="l",
- lccode=0x057C,
+ lccode=0x57C,
linebreak="al",
- unicodeslot=0x054C,
+ unicodeslot=0x54C,
},
- [0x054D]={
+ [0x54D]={
adobename="Seharmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER SEH",
direction="l",
- lccode=0x057D,
+ lccode=0x57D,
linebreak="al",
- unicodeslot=0x054D,
+ unicodeslot=0x54D,
},
- [0x054E]={
+ [0x54E]={
adobename="Vewarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER VEW",
direction="l",
- lccode=0x057E,
+ lccode=0x57E,
linebreak="al",
- unicodeslot=0x054E,
+ unicodeslot=0x54E,
},
- [0x054F]={
+ [0x54F]={
adobename="Tiwnarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER TIWN",
direction="l",
- lccode=0x057F,
+ lccode=0x57F,
linebreak="al",
- unicodeslot=0x054F,
+ unicodeslot=0x54F,
},
- [0x0550]={
+ [0x550]={
adobename="Reharmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER REH",
direction="l",
- lccode=0x0580,
+ lccode=0x580,
linebreak="al",
- unicodeslot=0x0550,
+ unicodeslot=0x550,
},
- [0x0551]={
+ [0x551]={
adobename="Coarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER CO",
direction="l",
- lccode=0x0581,
+ lccode=0x581,
linebreak="al",
- unicodeslot=0x0551,
+ unicodeslot=0x551,
},
- [0x0552]={
+ [0x552]={
adobename="Yiwnarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER YIWN",
direction="l",
- lccode=0x0582,
+ lccode=0x582,
linebreak="al",
- unicodeslot=0x0552,
+ unicodeslot=0x552,
},
- [0x0553]={
+ [0x553]={
adobename="Piwrarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER PIWR",
direction="l",
- lccode=0x0583,
+ lccode=0x583,
linebreak="al",
- unicodeslot=0x0553,
+ unicodeslot=0x553,
},
- [0x0554]={
+ [0x554]={
adobename="Keharmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER KEH",
direction="l",
- lccode=0x0584,
+ lccode=0x584,
linebreak="al",
- unicodeslot=0x0554,
+ unicodeslot=0x554,
},
- [0x0555]={
+ [0x555]={
adobename="Oharmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER OH",
direction="l",
- lccode=0x0585,
+ lccode=0x585,
linebreak="al",
- unicodeslot=0x0555,
+ unicodeslot=0x555,
},
- [0x0556]={
+ [0x556]={
adobename="Feharmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER FEH",
direction="l",
- lccode=0x0586,
+ lccode=0x586,
linebreak="al",
- unicodeslot=0x0556,
+ unicodeslot=0x556,
},
- [0x0559]={
+ [0x559]={
adobename="ringhalfleftarmenian",
category="lm",
description="ARMENIAN MODIFIER LETTER LEFT HALF RING",
direction="l",
linebreak="al",
- unicodeslot=0x0559,
+ unicodeslot=0x559,
},
- [0x055A]={
+ [0x55A]={
adobename="apostrophearmenian",
category="po",
description="ARMENIAN APOSTROPHE",
direction="l",
linebreak="al",
- unicodeslot=0x055A,
+ unicodeslot=0x55A,
},
- [0x055B]={
+ [0x55B]={
adobename="emphasismarkarmenian",
category="po",
description="ARMENIAN EMPHASIS MARK",
direction="l",
linebreak="al",
- unicodeslot=0x055B,
+ unicodeslot=0x55B,
},
- [0x055C]={
+ [0x55C]={
adobename="exclamarmenian",
category="po",
description="ARMENIAN EXCLAMATION MARK",
direction="l",
linebreak="al",
- unicodeslot=0x055C,
+ unicodeslot=0x55C,
},
- [0x055D]={
+ [0x55D]={
adobename="commaarmenian",
category="po",
description="ARMENIAN COMMA",
direction="l",
linebreak="al",
- unicodeslot=0x055D,
+ unicodeslot=0x55D,
},
- [0x055E]={
+ [0x55E]={
adobename="questionarmenian",
category="po",
description="ARMENIAN QUESTION MARK",
direction="l",
linebreak="al",
- unicodeslot=0x055E,
+ unicodeslot=0x55E,
},
- [0x055F]={
+ [0x55F]={
adobename="abbreviationmarkarmenian",
category="po",
description="ARMENIAN ABBREVIATION MARK",
direction="l",
linebreak="al",
- unicodeslot=0x055F,
+ unicodeslot=0x55F,
},
- [0x0561]={
+ [0x561]={
adobename="aybarmenian",
category="ll",
description="ARMENIAN SMALL LETTER AYB",
direction="l",
linebreak="al",
- uccode=0x0531,
- unicodeslot=0x0561,
+ uccode=0x531,
+ unicodeslot=0x561,
},
- [0x0562]={
+ [0x562]={
adobename="benarmenian",
category="ll",
description="ARMENIAN SMALL LETTER BEN",
direction="l",
linebreak="al",
- uccode=0x0532,
- unicodeslot=0x0562,
+ uccode=0x532,
+ unicodeslot=0x562,
},
- [0x0563]={
+ [0x563]={
adobename="gimarmenian",
category="ll",
description="ARMENIAN SMALL LETTER GIM",
direction="l",
linebreak="al",
- uccode=0x0533,
- unicodeslot=0x0563,
+ uccode=0x533,
+ unicodeslot=0x563,
},
- [0x0564]={
+ [0x564]={
adobename="daarmenian",
category="ll",
description="ARMENIAN SMALL LETTER DA",
direction="l",
linebreak="al",
- uccode=0x0534,
- unicodeslot=0x0564,
+ uccode=0x534,
+ unicodeslot=0x564,
},
- [0x0565]={
+ [0x565]={
adobename="echarmenian",
category="ll",
description="ARMENIAN SMALL LETTER ECH",
direction="l",
linebreak="al",
- uccode=0x0535,
- unicodeslot=0x0565,
+ uccode=0x535,
+ unicodeslot=0x565,
},
- [0x0566]={
+ [0x566]={
adobename="zaarmenian",
category="ll",
description="ARMENIAN SMALL LETTER ZA",
direction="l",
linebreak="al",
- uccode=0x0536,
- unicodeslot=0x0566,
+ uccode=0x536,
+ unicodeslot=0x566,
},
- [0x0567]={
+ [0x567]={
adobename="eharmenian",
category="ll",
description="ARMENIAN SMALL LETTER EH",
direction="l",
linebreak="al",
- uccode=0x0537,
- unicodeslot=0x0567,
+ uccode=0x537,
+ unicodeslot=0x567,
},
- [0x0568]={
+ [0x568]={
adobename="etarmenian",
category="ll",
description="ARMENIAN SMALL LETTER ET",
direction="l",
linebreak="al",
- uccode=0x0538,
- unicodeslot=0x0568,
+ uccode=0x538,
+ unicodeslot=0x568,
},
- [0x0569]={
+ [0x569]={
adobename="toarmenian",
category="ll",
description="ARMENIAN SMALL LETTER TO",
direction="l",
linebreak="al",
- uccode=0x0539,
- unicodeslot=0x0569,
+ uccode=0x539,
+ unicodeslot=0x569,
},
- [0x056A]={
+ [0x56A]={
adobename="zhearmenian",
category="ll",
description="ARMENIAN SMALL LETTER ZHE",
direction="l",
linebreak="al",
- uccode=0x053A,
- unicodeslot=0x056A,
+ uccode=0x53A,
+ unicodeslot=0x56A,
},
- [0x056B]={
+ [0x56B]={
adobename="iniarmenian",
category="ll",
description="ARMENIAN SMALL LETTER INI",
direction="l",
linebreak="al",
- uccode=0x053B,
- unicodeslot=0x056B,
+ uccode=0x53B,
+ unicodeslot=0x56B,
},
- [0x056C]={
+ [0x56C]={
adobename="liwnarmenian",
category="ll",
description="ARMENIAN SMALL LETTER LIWN",
direction="l",
linebreak="al",
- uccode=0x053C,
- unicodeslot=0x056C,
+ uccode=0x53C,
+ unicodeslot=0x56C,
},
- [0x056D]={
+ [0x56D]={
adobename="xeharmenian",
category="ll",
description="ARMENIAN SMALL LETTER XEH",
direction="l",
linebreak="al",
- uccode=0x053D,
- unicodeslot=0x056D,
+ uccode=0x53D,
+ unicodeslot=0x56D,
},
- [0x056E]={
+ [0x56E]={
adobename="caarmenian",
category="ll",
description="ARMENIAN SMALL LETTER CA",
direction="l",
linebreak="al",
- uccode=0x053E,
- unicodeslot=0x056E,
+ uccode=0x53E,
+ unicodeslot=0x56E,
},
- [0x056F]={
+ [0x56F]={
adobename="kenarmenian",
category="ll",
description="ARMENIAN SMALL LETTER KEN",
direction="l",
linebreak="al",
- uccode=0x053F,
- unicodeslot=0x056F,
+ uccode=0x53F,
+ unicodeslot=0x56F,
},
- [0x0570]={
+ [0x570]={
adobename="hoarmenian",
category="ll",
description="ARMENIAN SMALL LETTER HO",
direction="l",
linebreak="al",
- uccode=0x0540,
- unicodeslot=0x0570,
+ uccode=0x540,
+ unicodeslot=0x570,
},
- [0x0571]={
+ [0x571]={
adobename="jaarmenian",
category="ll",
description="ARMENIAN SMALL LETTER JA",
direction="l",
linebreak="al",
- uccode=0x0541,
- unicodeslot=0x0571,
+ uccode=0x541,
+ unicodeslot=0x571,
},
- [0x0572]={
+ [0x572]={
adobename="ghadarmenian",
category="ll",
description="ARMENIAN SMALL LETTER GHAD",
direction="l",
linebreak="al",
- uccode=0x0542,
- unicodeslot=0x0572,
+ uccode=0x542,
+ unicodeslot=0x572,
},
- [0x0573]={
+ [0x573]={
adobename="cheharmenian",
category="ll",
description="ARMENIAN SMALL LETTER CHEH",
direction="l",
linebreak="al",
- uccode=0x0543,
- unicodeslot=0x0573,
+ uccode=0x543,
+ unicodeslot=0x573,
},
- [0x0574]={
+ [0x574]={
adobename="menarmenian",
category="ll",
description="ARMENIAN SMALL LETTER MEN",
direction="l",
linebreak="al",
- uccode=0x0544,
- unicodeslot=0x0574,
+ uccode=0x544,
+ unicodeslot=0x574,
},
- [0x0575]={
+ [0x575]={
adobename="yiarmenian",
category="ll",
description="ARMENIAN SMALL LETTER YI",
direction="l",
linebreak="al",
- uccode=0x0545,
- unicodeslot=0x0575,
+ uccode=0x545,
+ unicodeslot=0x575,
},
- [0x0576]={
+ [0x576]={
adobename="nowarmenian",
category="ll",
description="ARMENIAN SMALL LETTER NOW",
direction="l",
linebreak="al",
- uccode=0x0546,
- unicodeslot=0x0576,
+ uccode=0x546,
+ unicodeslot=0x576,
},
- [0x0577]={
+ [0x577]={
adobename="shaarmenian",
category="ll",
description="ARMENIAN SMALL LETTER SHA",
direction="l",
linebreak="al",
- uccode=0x0547,
- unicodeslot=0x0577,
+ uccode=0x547,
+ unicodeslot=0x577,
},
- [0x0578]={
+ [0x578]={
adobename="voarmenian",
category="ll",
description="ARMENIAN SMALL LETTER VO",
direction="l",
linebreak="al",
- uccode=0x0548,
- unicodeslot=0x0578,
+ uccode=0x548,
+ unicodeslot=0x578,
},
- [0x0579]={
+ [0x579]={
adobename="chaarmenian",
category="ll",
description="ARMENIAN SMALL LETTER CHA",
direction="l",
linebreak="al",
- uccode=0x0549,
- unicodeslot=0x0579,
+ uccode=0x549,
+ unicodeslot=0x579,
},
- [0x057A]={
+ [0x57A]={
adobename="peharmenian",
category="ll",
description="ARMENIAN SMALL LETTER PEH",
direction="l",
linebreak="al",
- uccode=0x054A,
- unicodeslot=0x057A,
+ uccode=0x54A,
+ unicodeslot=0x57A,
},
- [0x057B]={
+ [0x57B]={
adobename="jheharmenian",
category="ll",
description="ARMENIAN SMALL LETTER JHEH",
direction="l",
linebreak="al",
- uccode=0x054B,
- unicodeslot=0x057B,
+ uccode=0x54B,
+ unicodeslot=0x57B,
},
- [0x057C]={
+ [0x57C]={
adobename="raarmenian",
category="ll",
description="ARMENIAN SMALL LETTER RA",
direction="l",
linebreak="al",
- uccode=0x054C,
- unicodeslot=0x057C,
+ uccode=0x54C,
+ unicodeslot=0x57C,
},
- [0x057D]={
+ [0x57D]={
adobename="seharmenian",
category="ll",
description="ARMENIAN SMALL LETTER SEH",
direction="l",
linebreak="al",
- uccode=0x054D,
- unicodeslot=0x057D,
+ uccode=0x54D,
+ unicodeslot=0x57D,
},
- [0x057E]={
+ [0x57E]={
adobename="vewarmenian",
category="ll",
description="ARMENIAN SMALL LETTER VEW",
direction="l",
linebreak="al",
- uccode=0x054E,
- unicodeslot=0x057E,
+ uccode=0x54E,
+ unicodeslot=0x57E,
},
- [0x057F]={
+ [0x57F]={
adobename="tiwnarmenian",
category="ll",
description="ARMENIAN SMALL LETTER TIWN",
direction="l",
linebreak="al",
- uccode=0x054F,
- unicodeslot=0x057F,
+ uccode=0x54F,
+ unicodeslot=0x57F,
},
- [0x0580]={
+ [0x580]={
adobename="reharmenian",
category="ll",
description="ARMENIAN SMALL LETTER REH",
direction="l",
linebreak="al",
- uccode=0x0550,
- unicodeslot=0x0580,
+ uccode=0x550,
+ unicodeslot=0x580,
},
- [0x0581]={
+ [0x581]={
adobename="coarmenian",
category="ll",
description="ARMENIAN SMALL LETTER CO",
direction="l",
linebreak="al",
- uccode=0x0551,
- unicodeslot=0x0581,
+ uccode=0x551,
+ unicodeslot=0x581,
},
- [0x0582]={
+ [0x582]={
adobename="yiwnarmenian",
category="ll",
description="ARMENIAN SMALL LETTER YIWN",
direction="l",
linebreak="al",
- uccode=0x0552,
- unicodeslot=0x0582,
+ uccode=0x552,
+ unicodeslot=0x582,
},
- [0x0583]={
+ [0x583]={
adobename="piwrarmenian",
category="ll",
description="ARMENIAN SMALL LETTER PIWR",
direction="l",
linebreak="al",
- uccode=0x0553,
- unicodeslot=0x0583,
+ uccode=0x553,
+ unicodeslot=0x583,
},
- [0x0584]={
+ [0x584]={
adobename="keharmenian",
category="ll",
description="ARMENIAN SMALL LETTER KEH",
direction="l",
linebreak="al",
- uccode=0x0554,
- unicodeslot=0x0584,
+ uccode=0x554,
+ unicodeslot=0x584,
},
- [0x0585]={
+ [0x585]={
adobename="oharmenian",
category="ll",
description="ARMENIAN SMALL LETTER OH",
direction="l",
linebreak="al",
- uccode=0x0555,
- unicodeslot=0x0585,
+ uccode=0x555,
+ unicodeslot=0x585,
},
- [0x0586]={
+ [0x586]={
adobename="feharmenian",
category="ll",
description="ARMENIAN SMALL LETTER FEH",
direction="l",
linebreak="al",
- uccode=0x0556,
- unicodeslot=0x0586,
+ uccode=0x556,
+ unicodeslot=0x586,
},
- [0x0587]={
+ [0x587]={
adobename="echyiwnarmenian",
category="ll",
description="ARMENIAN SMALL LIGATURE ECH YIWN",
direction="l",
linebreak="al",
- specials={ "compat", 0x0565, 0x0582 },
- unicodeslot=0x0587,
+ specials={ "compat", 0x565, 0x582 },
+ unicodeslot=0x587,
},
- [0x0589]={
+ [0x589]={
adobename="periodarmenian",
category="po",
description="ARMENIAN FULL STOP",
direction="l",
linebreak="is",
- unicodeslot=0x0589,
+ unicodeslot=0x589,
},
- [0x058A]={
+ [0x58A]={
category="pd",
description="ARMENIAN HYPHEN",
direction="on",
linebreak="ba",
- unicodeslot=0x058A,
+ unicodeslot=0x58A,
+ },
+ [0x58D]={
+ category="so",
+ description="RIGHT-FACING ARMENIAN ETERNITY SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x58D,
+ },
+ [0x58E]={
+ category="so",
+ description="LEFT-FACING ARMENIAN ETERNITY SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x58E,
},
- [0x058F]={
+ [0x58F]={
category="sc",
description="ARMENIAN DRAM SIGN",
direction="et",
linebreak="pr",
- unicodeslot=0x058F,
+ unicodeslot=0x58F,
},
- [0x0591]={
+ [0x591]={
adobename="etnahtalefthebrew",
category="mn",
+ combining=0xDC,
description="HEBREW ACCENT ETNAHTA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0591,
+ unicodeslot=0x591,
},
- [0x0592]={
+ [0x592]={
adobename="segoltahebrew",
category="mn",
+ combining=0xE6,
description="HEBREW ACCENT SEGOL",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0592,
+ unicodeslot=0x592,
},
- [0x0593]={
+ [0x593]={
adobename="shalshelethebrew",
category="mn",
+ combining=0xE6,
description="HEBREW ACCENT SHALSHELET",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0593,
+ unicodeslot=0x593,
},
- [0x0594]={
+ [0x594]={
adobename="zaqefqatanhebrew",
category="mn",
+ combining=0xE6,
description="HEBREW ACCENT ZAQEF QATAN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0594,
+ unicodeslot=0x594,
},
- [0x0595]={
+ [0x595]={
adobename="zaqefgadolhebrew",
category="mn",
+ combining=0xE6,
description="HEBREW ACCENT ZAQEF GADOL",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0595,
+ unicodeslot=0x595,
},
- [0x0596]={
+ [0x596]={
adobename="tipehalefthebrew",
category="mn",
+ combining=0xDC,
description="HEBREW ACCENT TIPEHA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0596,
+ unicodeslot=0x596,
},
- [0x0597]={
+ [0x597]={
adobename="reviamugrashhebrew",
category="mn",
+ combining=0xE6,
description="HEBREW ACCENT REVIA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0597,
+ unicodeslot=0x597,
},
- [0x0598]={
+ [0x598]={
adobename="zarqahebrew",
category="mn",
+ combining=0xE6,
description="HEBREW ACCENT ZARQA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0598,
+ unicodeslot=0x598,
},
- [0x0599]={
+ [0x599]={
adobename="pashtahebrew",
category="mn",
+ combining=0xE6,
description="HEBREW ACCENT PASHTA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0599,
+ unicodeslot=0x599,
},
- [0x059A]={
+ [0x59A]={
adobename="yetivhebrew",
category="mn",
+ combining=0xDE,
description="HEBREW ACCENT YETIV",
direction="nsm",
linebreak="cm",
- unicodeslot=0x059A,
+ unicodeslot=0x59A,
},
- [0x059B]={
+ [0x59B]={
adobename="tevirlefthebrew",
category="mn",
+ combining=0xDC,
description="HEBREW ACCENT TEVIR",
direction="nsm",
linebreak="cm",
- unicodeslot=0x059B,
+ unicodeslot=0x59B,
},
- [0x059C]={
+ [0x59C]={
adobename="gereshaccenthebrew",
category="mn",
+ combining=0xE6,
description="HEBREW ACCENT GERESH",
direction="nsm",
linebreak="cm",
- unicodeslot=0x059C,
+ unicodeslot=0x59C,
},
- [0x059D]={
+ [0x59D]={
adobename="gereshmuqdamhebrew",
category="mn",
+ combining=0xE6,
description="HEBREW ACCENT GERESH MUQDAM",
direction="nsm",
linebreak="cm",
- unicodeslot=0x059D,
+ unicodeslot=0x59D,
},
- [0x059E]={
+ [0x59E]={
adobename="gershayimaccenthebrew",
category="mn",
+ combining=0xE6,
description="HEBREW ACCENT GERSHAYIM",
direction="nsm",
linebreak="cm",
- unicodeslot=0x059E,
+ unicodeslot=0x59E,
},
- [0x059F]={
+ [0x59F]={
adobename="qarneyparahebrew",
category="mn",
+ combining=0xE6,
description="HEBREW ACCENT QARNEY PARA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x059F,
+ unicodeslot=0x59F,
},
- [0x05A0]={
+ [0x5A0]={
adobename="telishagedolahebrew",
category="mn",
+ combining=0xE6,
description="HEBREW ACCENT TELISHA GEDOLA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05A0,
+ unicodeslot=0x5A0,
},
- [0x05A1]={
+ [0x5A1]={
adobename="pazerhebrew",
category="mn",
+ combining=0xE6,
description="HEBREW ACCENT PAZER",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05A1,
+ unicodeslot=0x5A1,
},
- [0x05A2]={
+ [0x5A2]={
category="mn",
+ combining=0xDC,
description="HEBREW ACCENT ATNAH HAFUKH",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05A2,
+ unicodeslot=0x5A2,
},
- [0x05A3]={
+ [0x5A3]={
adobename="munahlefthebrew",
category="mn",
+ combining=0xDC,
description="HEBREW ACCENT MUNAH",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05A3,
+ unicodeslot=0x5A3,
},
- [0x05A4]={
+ [0x5A4]={
adobename="mahapakhlefthebrew",
category="mn",
+ combining=0xDC,
description="HEBREW ACCENT MAHAPAKH",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05A4,
+ unicodeslot=0x5A4,
},
- [0x05A5]={
+ [0x5A5]={
adobename="merkhalefthebrew",
category="mn",
+ combining=0xDC,
description="HEBREW ACCENT MERKHA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05A5,
+ unicodeslot=0x5A5,
},
- [0x05A6]={
+ [0x5A6]={
adobename="merkhakefulalefthebrew",
category="mn",
+ combining=0xDC,
description="HEBREW ACCENT MERKHA KEFULA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05A6,
+ unicodeslot=0x5A6,
},
- [0x05A7]={
+ [0x5A7]={
adobename="dargalefthebrew",
category="mn",
+ combining=0xDC,
description="HEBREW ACCENT DARGA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05A7,
+ unicodeslot=0x5A7,
},
- [0x05A8]={
+ [0x5A8]={
adobename="qadmahebrew",
category="mn",
+ combining=0xE6,
description="HEBREW ACCENT QADMA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05A8,
+ unicodeslot=0x5A8,
},
- [0x05A9]={
+ [0x5A9]={
adobename="telishaqetanahebrew",
category="mn",
+ combining=0xE6,
description="HEBREW ACCENT TELISHA QETANA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05A9,
+ unicodeslot=0x5A9,
},
- [0x05AA]={
+ [0x5AA]={
adobename="yerahbenyomolefthebrew",
category="mn",
+ combining=0xDC,
description="HEBREW ACCENT YERAH BEN YOMO",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05AA,
+ unicodeslot=0x5AA,
},
- [0x05AB]={
+ [0x5AB]={
adobename="olehebrew",
category="mn",
+ combining=0xE6,
description="HEBREW ACCENT OLE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05AB,
+ unicodeslot=0x5AB,
},
- [0x05AC]={
+ [0x5AC]={
adobename="iluyhebrew",
category="mn",
+ combining=0xE6,
description="HEBREW ACCENT ILUY",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05AC,
+ unicodeslot=0x5AC,
},
- [0x05AD]={
+ [0x5AD]={
adobename="dehihebrew",
category="mn",
+ combining=0xDE,
description="HEBREW ACCENT DEHI",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05AD,
+ unicodeslot=0x5AD,
},
- [0x05AE]={
+ [0x5AE]={
adobename="zinorhebrew",
category="mn",
+ combining=0xE4,
description="HEBREW ACCENT ZINOR",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05AE,
+ unicodeslot=0x5AE,
},
- [0x05AF]={
+ [0x5AF]={
adobename="masoracirclehebrew",
category="mn",
+ combining=0xE6,
description="HEBREW MARK MASORA CIRCLE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05AF,
+ unicodeslot=0x5AF,
},
- [0x05B0]={
+ [0x5B0]={
adobename="shevawidehebrew",
category="mn",
+ combining=0xA,
description="HEBREW POINT SHEVA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05B0,
+ unicodeslot=0x5B0,
},
- [0x05B1]={
+ [0x5B1]={
adobename="hatafsegolwidehebrew",
category="mn",
+ combining=0xB,
description="HEBREW POINT HATAF SEGOL",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05B1,
+ unicodeslot=0x5B1,
},
- [0x05B2]={
+ [0x5B2]={
adobename="hatafpatahwidehebrew",
category="mn",
+ combining=0xC,
description="HEBREW POINT HATAF PATAH",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05B2,
+ unicodeslot=0x5B2,
},
- [0x05B3]={
+ [0x5B3]={
adobename="hatafqamatswidehebrew",
category="mn",
+ combining=0xD,
description="HEBREW POINT HATAF QAMATS",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05B3,
+ unicodeslot=0x5B3,
},
- [0x05B4]={
+ [0x5B4]={
adobename="hiriqwidehebrew",
category="mn",
+ combining=0xE,
description="HEBREW POINT HIRIQ",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05B4,
+ unicodeslot=0x5B4,
},
- [0x05B5]={
+ [0x5B5]={
adobename="tserewidehebrew",
category="mn",
+ combining=0xF,
description="HEBREW POINT TSERE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05B5,
+ unicodeslot=0x5B5,
},
- [0x05B6]={
+ [0x5B6]={
adobename="segolwidehebrew",
category="mn",
+ combining=0x10,
description="HEBREW POINT SEGOL",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05B6,
+ unicodeslot=0x5B6,
},
- [0x05B7]={
+ [0x5B7]={
adobename="patahwidehebrew",
category="mn",
+ combining=0x11,
description="HEBREW POINT PATAH",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05B7,
+ unicodeslot=0x5B7,
},
- [0x05B8]={
+ [0x5B8]={
adobename="qamatswidehebrew",
category="mn",
+ combining=0x12,
description="HEBREW POINT QAMATS",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05B8,
+ unicodeslot=0x5B8,
},
- [0x05B9]={
+ [0x5B9]={
adobename="holamwidehebrew",
category="mn",
+ combining=0x13,
description="HEBREW POINT HOLAM",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05B9,
+ unicodeslot=0x5B9,
},
- [0x05BA]={
+ [0x5BA]={
category="mn",
+ combining=0x13,
description="HEBREW POINT HOLAM HASER FOR VAV",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05BA,
+ unicodeslot=0x5BA,
},
- [0x05BB]={
+ [0x5BB]={
adobename="qubutswidehebrew",
category="mn",
+ combining=0x14,
description="HEBREW POINT QUBUTS",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05BB,
+ unicodeslot=0x5BB,
},
- [0x05BC]={
+ [0x5BC]={
adobename="dageshhebrew",
category="mn",
+ combining=0x15,
description="HEBREW POINT DAGESH OR MAPIQ",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05BC,
+ unicodeslot=0x5BC,
},
- [0x05BD]={
+ [0x5BD]={
adobename="siluqlefthebrew",
category="mn",
+ combining=0x16,
description="HEBREW POINT METEG",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05BD,
+ unicodeslot=0x5BD,
},
- [0x05BE]={
+ [0x5BE]={
adobename="maqafhebrew",
category="po",
description="HEBREW PUNCTUATION MAQAF",
direction="r",
linebreak="ba",
- unicodeslot=0x05BE,
+ unicodeslot=0x5BE,
},
- [0x05BF]={
+ [0x5BF]={
adobename="rafehebrew",
category="mn",
+ combining=0x17,
description="HEBREW POINT RAFE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05BF,
+ unicodeslot=0x5BF,
},
- [0x05C0]={
+ [0x5C0]={
adobename="paseqhebrew",
category="po",
description="HEBREW PUNCTUATION PASEQ",
direction="r",
linebreak="al",
- unicodeslot=0x05C0,
+ unicodeslot=0x5C0,
},
- [0x05C1]={
+ [0x5C1]={
adobename="shindothebrew",
category="mn",
+ combining=0x18,
description="HEBREW POINT SHIN DOT",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05C1,
+ unicodeslot=0x5C1,
},
- [0x05C2]={
+ [0x5C2]={
adobename="sindothebrew",
category="mn",
+ combining=0x19,
description="HEBREW POINT SIN DOT",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05C2,
+ unicodeslot=0x5C2,
},
- [0x05C3]={
+ [0x5C3]={
adobename="sofpasuqhebrew",
category="po",
description="HEBREW PUNCTUATION SOF PASUQ",
direction="r",
linebreak="al",
- unicodeslot=0x05C3,
+ unicodeslot=0x5C3,
},
- [0x05C4]={
+ [0x5C4]={
adobename="upperdothebrew",
category="mn",
+ combining=0xE6,
description="HEBREW MARK UPPER DOT",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05C4,
+ unicodeslot=0x5C4,
},
- [0x05C5]={
+ [0x5C5]={
category="mn",
+ combining=0xDC,
description="HEBREW MARK LOWER DOT",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05C5,
+ unicodeslot=0x5C5,
},
- [0x05C6]={
+ [0x5C6]={
category="po",
description="HEBREW PUNCTUATION NUN HAFUKHA",
direction="r",
linebreak="ex",
- unicodeslot=0x05C6,
+ unicodeslot=0x5C6,
},
- [0x05C7]={
+ [0x5C7]={
category="mn",
+ combining=0x12,
description="HEBREW POINT QAMATS QATAN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x05C7,
+ unicodeslot=0x5C7,
},
- [0x05D0]={
+ [0x5D0]={
adobename="alefhebrew",
category="lo",
contextname="hebrewAlef",
description="HEBREW LETTER ALEF",
direction="r",
linebreak="hl",
- unicodeslot=0x05D0,
+ unicodeslot=0x5D0,
},
- [0x05D1]={
+ [0x5D1]={
adobename="bethebrew",
category="lo",
contextname="hebrewBet",
description="HEBREW LETTER BET",
direction="r",
linebreak="hl",
- unicodeslot=0x05D1,
+ unicodeslot=0x5D1,
},
- [0x05D2]={
+ [0x5D2]={
adobename="gimelhebrew",
category="lo",
contextname="hebrewGimel",
description="HEBREW LETTER GIMEL",
direction="r",
linebreak="hl",
- unicodeslot=0x05D2,
+ unicodeslot=0x5D2,
},
- [0x05D3]={
+ [0x5D3]={
adobename="dalettserehebrew",
category="lo",
contextname="hebrewDalet",
description="HEBREW LETTER DALET",
direction="r",
linebreak="hl",
- unicodeslot=0x05D3,
+ unicodeslot=0x5D3,
},
- [0x05D4]={
+ [0x5D4]={
adobename="hehebrew",
category="lo",
contextname="hebrewHe",
description="HEBREW LETTER HE",
direction="r",
linebreak="hl",
- unicodeslot=0x05D4,
+ unicodeslot=0x5D4,
},
- [0x05D5]={
+ [0x5D5]={
adobename="vavhebrew",
category="lo",
contextname="hebrewVav",
description="HEBREW LETTER VAV",
direction="r",
linebreak="hl",
- unicodeslot=0x05D5,
+ unicodeslot=0x5D5,
},
- [0x05D6]={
+ [0x5D6]={
adobename="zayinhebrew",
category="lo",
contextname="hebrewZayin",
description="HEBREW LETTER ZAYIN",
direction="r",
linebreak="hl",
- unicodeslot=0x05D6,
+ unicodeslot=0x5D6,
},
- [0x05D7]={
+ [0x5D7]={
adobename="hethebrew",
category="lo",
contextname="hebrewHet",
description="HEBREW LETTER HET",
direction="r",
linebreak="hl",
- unicodeslot=0x05D7,
+ unicodeslot=0x5D7,
},
- [0x05D8]={
+ [0x5D8]={
adobename="tethebrew",
category="lo",
contextname="hebrewTet",
description="HEBREW LETTER TET",
direction="r",
linebreak="hl",
- unicodeslot=0x05D8,
+ unicodeslot=0x5D8,
},
- [0x05D9]={
+ [0x5D9]={
adobename="yodhebrew",
category="lo",
contextname="hebrewYod",
description="HEBREW LETTER YOD",
direction="r",
linebreak="hl",
- unicodeslot=0x05D9,
+ unicodeslot=0x5D9,
},
- [0x05DA]={
+ [0x5DA]={
adobename="finalkafshevahebrew",
category="lo",
contextname="hebrewKaffinal",
description="HEBREW LETTER FINAL KAF",
direction="r",
linebreak="hl",
- unicodeslot=0x05DA,
+ unicodeslot=0x5DA,
},
- [0x05DB]={
+ [0x5DB]={
adobename="kafhebrew",
category="lo",
contextname="hebrewKaf",
description="HEBREW LETTER KAF",
direction="r",
linebreak="hl",
- unicodeslot=0x05DB,
+ unicodeslot=0x5DB,
},
- [0x05DC]={
+ [0x5DC]={
adobename="lamedholamhebrew",
category="lo",
contextname="hebrewLamed",
description="HEBREW LETTER LAMED",
direction="r",
linebreak="hl",
- unicodeslot=0x05DC,
+ unicodeslot=0x5DC,
},
- [0x05DD]={
+ [0x5DD]={
adobename="finalmemhebrew",
category="lo",
contextname="hebrewMemfinal",
description="HEBREW LETTER FINAL MEM",
direction="r",
linebreak="hl",
- unicodeslot=0x05DD,
+ unicodeslot=0x5DD,
},
- [0x05DE]={
+ [0x5DE]={
adobename="memhebrew",
category="lo",
contextname="hebrewMem",
description="HEBREW LETTER MEM",
direction="r",
linebreak="hl",
- unicodeslot=0x05DE,
+ unicodeslot=0x5DE,
},
- [0x05DF]={
+ [0x5DF]={
adobename="finalnunhebrew",
category="lo",
contextname="hebrewNunfinal",
description="HEBREW LETTER FINAL NUN",
direction="r",
linebreak="hl",
- unicodeslot=0x05DF,
+ unicodeslot=0x5DF,
},
- [0x05E0]={
+ [0x5E0]={
adobename="nunhebrew",
category="lo",
contextname="hebrewNun",
description="HEBREW LETTER NUN",
direction="r",
linebreak="hl",
- unicodeslot=0x05E0,
+ unicodeslot=0x5E0,
},
- [0x05E1]={
+ [0x5E1]={
adobename="samekhhebrew",
category="lo",
contextname="hebrewSamekh",
description="HEBREW LETTER SAMEKH",
direction="r",
linebreak="hl",
- unicodeslot=0x05E1,
+ unicodeslot=0x5E1,
},
- [0x05E2]={
+ [0x5E2]={
adobename="ayinhebrew",
category="lo",
contextname="hebrewAyin",
description="HEBREW LETTER AYIN",
direction="r",
linebreak="hl",
- unicodeslot=0x05E2,
+ unicodeslot=0x5E2,
},
- [0x05E3]={
+ [0x5E3]={
adobename="finalpehebrew",
category="lo",
contextname="hebrewPefinal",
description="HEBREW LETTER FINAL PE",
direction="r",
linebreak="hl",
- unicodeslot=0x05E3,
+ unicodeslot=0x5E3,
},
- [0x05E4]={
+ [0x5E4]={
adobename="pehebrew",
category="lo",
contextname="hebrewPe",
description="HEBREW LETTER PE",
direction="r",
linebreak="hl",
- unicodeslot=0x05E4,
+ unicodeslot=0x5E4,
},
- [0x05E5]={
+ [0x5E5]={
adobename="finaltsadihebrew",
category="lo",
contextname="hebrewTsadifinal",
description="HEBREW LETTER FINAL TSADI",
direction="r",
linebreak="hl",
- unicodeslot=0x05E5,
+ unicodeslot=0x5E5,
},
- [0x05E6]={
+ [0x5E6]={
adobename="tsadihebrew",
category="lo",
contextname="hebrewTsadi",
description="HEBREW LETTER TSADI",
direction="r",
linebreak="hl",
- unicodeslot=0x05E6,
+ unicodeslot=0x5E6,
},
- [0x05E7]={
+ [0x5E7]={
adobename="qoftserehebrew",
category="lo",
contextname="hebrewQof",
description="HEBREW LETTER QOF",
direction="r",
linebreak="hl",
- unicodeslot=0x05E7,
+ unicodeslot=0x5E7,
},
- [0x05E8]={
+ [0x5E8]={
adobename="reshtserehebrew",
category="lo",
contextname="hebrewResh",
description="HEBREW LETTER RESH",
direction="r",
linebreak="hl",
- unicodeslot=0x05E8,
+ unicodeslot=0x5E8,
},
- [0x05E9]={
+ [0x5E9]={
adobename="shinhebrew",
category="lo",
contextname="hebrewShin",
description="HEBREW LETTER SHIN",
direction="r",
linebreak="hl",
- unicodeslot=0x05E9,
+ unicodeslot=0x5E9,
},
- [0x05EA]={
+ [0x5EA]={
adobename="tavhebrew",
category="lo",
contextname="hebrewTav",
description="HEBREW LETTER TAV",
direction="r",
linebreak="hl",
- unicodeslot=0x05EA,
+ unicodeslot=0x5EA,
},
- [0x05F0]={
+ [0x5F0]={
adobename="vavvavhebrew",
category="lo",
description="HEBREW LIGATURE YIDDISH DOUBLE VAV",
direction="r",
linebreak="hl",
- unicodeslot=0x05F0,
+ unicodeslot=0x5F0,
},
- [0x05F1]={
+ [0x5F1]={
adobename="vavyodhebrew",
category="lo",
description="HEBREW LIGATURE YIDDISH VAV YOD",
direction="r",
linebreak="hl",
- unicodeslot=0x05F1,
+ unicodeslot=0x5F1,
},
- [0x05F2]={
+ [0x5F2]={
adobename="yodyodhebrew",
category="lo",
description="HEBREW LIGATURE YIDDISH DOUBLE YOD",
direction="r",
linebreak="hl",
- unicodeslot=0x05F2,
+ unicodeslot=0x5F2,
},
- [0x05F3]={
+ [0x5F3]={
adobename="gereshhebrew",
category="po",
description="HEBREW PUNCTUATION GERESH",
direction="r",
linebreak="al",
- unicodeslot=0x05F3,
+ unicodeslot=0x5F3,
},
- [0x05F4]={
+ [0x5F4]={
adobename="gershayimhebrew",
category="po",
description="HEBREW PUNCTUATION GERSHAYIM",
direction="r",
linebreak="al",
- unicodeslot=0x05F4,
+ unicodeslot=0x5F4,
},
- [0x0600]={
+ [0x600]={
arabic="u",
category="cf",
description="ARABIC NUMBER SIGN",
direction="an",
linebreak="al",
- unicodeslot=0x0600,
+ unicodeslot=0x600,
visible="yes",
},
- [0x0601]={
+ [0x601]={
arabic="u",
category="cf",
description="ARABIC SIGN SANAH",
direction="an",
linebreak="al",
- unicodeslot=0x0601,
+ unicodeslot=0x601,
visible="yes",
},
- [0x0602]={
+ [0x602]={
arabic="u",
category="cf",
description="ARABIC FOOTNOTE MARKER",
direction="an",
linebreak="al",
- unicodeslot=0x0602,
+ unicodeslot=0x602,
visible="yes",
},
- [0x0603]={
+ [0x603]={
arabic="u",
category="cf",
description="ARABIC SIGN SAFHA",
direction="an",
linebreak="al",
- unicodeslot=0x0603,
+ unicodeslot=0x603,
visible="yes",
},
- [0x0604]={
+ [0x604]={
arabic="u",
category="cf",
description="ARABIC SIGN SAMVAT",
direction="an",
linebreak="al",
- unicodeslot=0x0604,
+ unicodeslot=0x604,
+ },
+ [0x605]={
+ arabic="u",
+ category="cf",
+ description="ARABIC NUMBER MARK ABOVE",
+ direction="an",
+ linebreak="al",
+ unicodeslot=0x605,
},
- [0x0606]={
+ [0x606]={
category="sm",
description="ARABIC-INDIC CUBE ROOT",
direction="on",
linebreak="al",
- unicodeslot=0x0606,
+ unicodeslot=0x606,
},
- [0x0607]={
+ [0x607]={
category="sm",
description="ARABIC-INDIC FOURTH ROOT",
direction="on",
linebreak="al",
- unicodeslot=0x0607,
+ unicodeslot=0x607,
},
- [0x0608]={
+ [0x608]={
arabic="u",
category="sm",
description="ARABIC RAY",
direction="al",
linebreak="al",
- unicodeslot=0x0608,
+ unicodeslot=0x608,
},
- [0x0609]={
+ [0x609]={
category="po",
description="ARABIC-INDIC PER MILLE SIGN",
direction="et",
linebreak="po",
- unicodeslot=0x0609,
+ unicodeslot=0x609,
},
- [0x060A]={
+ [0x60A]={
category="po",
description="ARABIC-INDIC PER TEN THOUSAND SIGN",
direction="et",
linebreak="po",
- unicodeslot=0x060A,
+ unicodeslot=0x60A,
},
- [0x060B]={
+ [0x60B]={
arabic="u",
category="sc",
description="AFGHANI SIGN",
direction="al",
linebreak="po",
- unicodeslot=0x060B,
+ unicodeslot=0x60B,
},
- [0x060C]={
+ [0x60C]={
adobename="commaarabic",
category="po",
description="ARABIC COMMA",
direction="cs",
linebreak="is",
- unicodeslot=0x060C,
+ unicodeslot=0x60C,
},
- [0x060D]={
+ [0x60D]={
category="po",
description="ARABIC DATE SEPARATOR",
direction="al",
linebreak="is",
- unicodeslot=0x060D,
+ unicodeslot=0x60D,
},
- [0x060E]={
+ [0x60E]={
category="so",
description="ARABIC POETIC VERSE SIGN",
direction="on",
linebreak="al",
- unicodeslot=0x060E,
+ unicodeslot=0x60E,
},
- [0x060F]={
+ [0x60F]={
category="so",
description="ARABIC SIGN MISRA",
direction="on",
linebreak="al",
- unicodeslot=0x060F,
+ unicodeslot=0x60F,
},
- [0x0610]={
+ [0x610]={
category="mn",
+ combining=0xE6,
description="ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0610,
+ unicodeslot=0x610,
},
- [0x0611]={
+ [0x611]={
category="mn",
+ combining=0xE6,
description="ARABIC SIGN ALAYHE ASSALLAM",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0611,
+ unicodeslot=0x611,
},
- [0x0612]={
+ [0x612]={
category="mn",
+ combining=0xE6,
description="ARABIC SIGN RAHMATULLAH ALAYHE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0612,
+ unicodeslot=0x612,
},
- [0x0613]={
+ [0x613]={
category="mn",
+ combining=0xE6,
description="ARABIC SIGN RADI ALLAHOU ANHU",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0613,
+ unicodeslot=0x613,
},
- [0x0614]={
+ [0x614]={
category="mn",
+ combining=0xE6,
description="ARABIC SIGN TAKHALLUS",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0614,
+ unicodeslot=0x614,
},
- [0x0615]={
+ [0x615]={
category="mn",
+ combining=0xE6,
description="ARABIC SMALL HIGH TAH",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0615,
+ unicodeslot=0x615,
},
- [0x0616]={
+ [0x616]={
category="mn",
+ combining=0xE6,
description="ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0616,
+ unicodeslot=0x616,
},
- [0x0617]={
+ [0x617]={
category="mn",
+ combining=0xE6,
description="ARABIC SMALL HIGH ZAIN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0617,
+ unicodeslot=0x617,
},
- [0x0618]={
+ [0x618]={
category="mn",
+ combining=0x1E,
description="ARABIC SMALL FATHA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0618,
+ unicodeslot=0x618,
},
- [0x0619]={
+ [0x619]={
category="mn",
+ combining=0x1F,
description="ARABIC SMALL DAMMA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0619,
+ unicodeslot=0x619,
},
- [0x061A]={
+ [0x61A]={
category="mn",
+ combining=0x20,
description="ARABIC SMALL KASRA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x061A,
+ unicodeslot=0x61A,
},
- [0x061B]={
+ [0x61B]={
adobename="semicolonarabic",
category="po",
description="ARABIC SEMICOLON",
direction="al",
linebreak="ex",
- unicodeslot=0x061B,
+ unicodeslot=0x61B,
},
- [0x061E]={
+ [0x61C]={
+ category="cf",
+ description="ARABIC LETTER MARK",
+ direction="al",
+ linebreak="cm",
+ unicodeslot=0x61C,
+ },
+ [0x61E]={
category="po",
description="ARABIC TRIPLE DOT PUNCTUATION MARK",
direction="al",
linebreak="ex",
- unicodeslot=0x061E,
+ unicodeslot=0x61E,
},
- [0x061F]={
+ [0x61F]={
adobename="questionarabic",
category="po",
description="ARABIC QUESTION MARK",
direction="al",
linebreak="ex",
- unicodeslot=0x061F,
+ unicodeslot=0x61F,
},
- [0x0620]={
+ [0x620]={
arabic="d",
category="lo",
description="ARABIC LETTER KASHMIRI YEH",
direction="al",
linebreak="al",
- unicodeslot=0x0620,
+ unicodeslot=0x620,
},
- [0x0621]={
+ [0x621]={
adobename="hamzasukunarabic",
arabic="u",
category="lo",
description="ARABIC LETTER HAMZA",
direction="al",
linebreak="al",
- unicodeslot=0x0621,
+ unicodeslot=0x621,
},
- [0x0622]={
+ [0x622]={
adobename="alefmaddaabovearabic",
arabic="r",
category="lo",
description="ARABIC LETTER ALEF WITH MADDA ABOVE",
direction="al",
linebreak="al",
- shcode=0x0627,
- specials={ "char", 0x0627, 0x0653 },
- unicodeslot=0x0622,
+ shcode=0x627,
+ specials={ "char", 0x627, 0x653 },
+ unicodeslot=0x622,
},
- [0x0623]={
+ [0x623]={
adobename="alefhamzaabovearabic",
arabic="r",
category="lo",
description="ARABIC LETTER ALEF WITH HAMZA ABOVE",
direction="al",
linebreak="al",
- shcode=0x0627,
- specials={ "char", 0x0627, 0x0654 },
- unicodeslot=0x0623,
+ shcode=0x627,
+ specials={ "char", 0x627, 0x654 },
+ unicodeslot=0x623,
},
- [0x0624]={
+ [0x624]={
adobename="wawhamzaabovearabic",
arabic="r",
category="lo",
description="ARABIC LETTER WAW WITH HAMZA ABOVE",
direction="al",
linebreak="al",
- shcode=0x0648,
- specials={ "char", 0x0648, 0x0654 },
- unicodeslot=0x0624,
+ shcode=0x648,
+ specials={ "char", 0x648, 0x654 },
+ unicodeslot=0x624,
},
- [0x0625]={
+ [0x625]={
adobename="alefhamzabelowarabic",
arabic="r",
category="lo",
description="ARABIC LETTER ALEF WITH HAMZA BELOW",
direction="al",
linebreak="al",
- shcode=0x0627,
- specials={ "char", 0x0627, 0x0655 },
- unicodeslot=0x0625,
+ shcode=0x627,
+ specials={ "char", 0x627, 0x655 },
+ unicodeslot=0x625,
},
- [0x0626]={
+ [0x626]={
adobename="yehhamzaabovearabic",
arabic="d",
category="lo",
description="ARABIC LETTER YEH WITH HAMZA ABOVE",
direction="al",
linebreak="al",
- shcode=0x064A,
- specials={ "char", 0x064A, 0x0654 },
- unicodeslot=0x0626,
+ shcode=0x64A,
+ specials={ "char", 0x64A, 0x654 },
+ unicodeslot=0x626,
},
- [0x0627]={
+ [0x627]={
adobename="alefarabic",
arabic="r",
category="lo",
description="ARABIC LETTER ALEF",
direction="al",
linebreak="al",
- unicodeslot=0x0627,
+ unicodeslot=0x627,
},
- [0x0628]={
+ [0x628]={
adobename="beharabic",
arabic="d",
category="lo",
description="ARABIC LETTER BEH",
direction="al",
linebreak="al",
- unicodeslot=0x0628,
+ unicodeslot=0x628,
},
- [0x0629]={
+ [0x629]={
adobename="tehmarbutaarabic",
arabic="r",
category="lo",
description="ARABIC LETTER TEH MARBUTA",
direction="al",
linebreak="al",
- unicodeslot=0x0629,
+ unicodeslot=0x629,
},
- [0x062A]={
+ [0x62A]={
adobename="teharabic",
arabic="d",
category="lo",
description="ARABIC LETTER TEH",
direction="al",
linebreak="al",
- unicodeslot=0x062A,
+ unicodeslot=0x62A,
},
- [0x062B]={
+ [0x62B]={
adobename="theharabic",
arabic="d",
category="lo",
description="ARABIC LETTER THEH",
direction="al",
linebreak="al",
- unicodeslot=0x062B,
+ unicodeslot=0x62B,
},
- [0x062C]={
+ [0x62C]={
adobename="jeemarabic",
arabic="d",
category="lo",
description="ARABIC LETTER JEEM",
direction="al",
linebreak="al",
- unicodeslot=0x062C,
+ unicodeslot=0x62C,
},
- [0x062D]={
+ [0x62D]={
adobename="haharabic",
arabic="d",
category="lo",
description="ARABIC LETTER HAH",
direction="al",
linebreak="al",
- unicodeslot=0x062D,
+ unicodeslot=0x62D,
},
- [0x062E]={
+ [0x62E]={
adobename="khaharabic",
arabic="d",
category="lo",
description="ARABIC LETTER KHAH",
direction="al",
linebreak="al",
- unicodeslot=0x062E,
+ unicodeslot=0x62E,
},
- [0x062F]={
+ [0x62F]={
adobename="dalarabic",
arabic="r",
category="lo",
description="ARABIC LETTER DAL",
direction="al",
linebreak="al",
- unicodeslot=0x062F,
+ unicodeslot=0x62F,
},
- [0x0630]={
+ [0x630]={
adobename="thalarabic",
arabic="r",
category="lo",
description="ARABIC LETTER THAL",
direction="al",
linebreak="al",
- unicodeslot=0x0630,
+ unicodeslot=0x630,
},
- [0x0631]={
+ [0x631]={
adobename="rehyehaleflamarabic",
arabic="r",
category="lo",
description="ARABIC LETTER REH",
direction="al",
linebreak="al",
- unicodeslot=0x0631,
+ unicodeslot=0x631,
},
- [0x0632]={
+ [0x632]={
adobename="zainarabic",
arabic="r",
category="lo",
description="ARABIC LETTER ZAIN",
direction="al",
linebreak="al",
- unicodeslot=0x0632,
+ unicodeslot=0x632,
},
- [0x0633]={
+ [0x633]={
adobename="seenarabic",
arabic="d",
category="lo",
description="ARABIC LETTER SEEN",
direction="al",
linebreak="al",
- unicodeslot=0x0633,
+ unicodeslot=0x633,
},
- [0x0634]={
+ [0x634]={
adobename="sheenarabic",
arabic="d",
category="lo",
description="ARABIC LETTER SHEEN",
direction="al",
linebreak="al",
- unicodeslot=0x0634,
+ unicodeslot=0x634,
},
- [0x0635]={
+ [0x635]={
adobename="sadarabic",
arabic="d",
category="lo",
description="ARABIC LETTER SAD",
direction="al",
linebreak="al",
- unicodeslot=0x0635,
+ unicodeslot=0x635,
},
- [0x0636]={
+ [0x636]={
adobename="dadarabic",
arabic="d",
category="lo",
description="ARABIC LETTER DAD",
direction="al",
linebreak="al",
- unicodeslot=0x0636,
+ unicodeslot=0x636,
},
- [0x0637]={
+ [0x637]={
adobename="taharabic",
arabic="d",
category="lo",
description="ARABIC LETTER TAH",
direction="al",
linebreak="al",
- unicodeslot=0x0637,
+ unicodeslot=0x637,
},
- [0x0638]={
+ [0x638]={
adobename="zaharabic",
arabic="d",
category="lo",
description="ARABIC LETTER ZAH",
direction="al",
linebreak="al",
- unicodeslot=0x0638,
+ unicodeslot=0x638,
},
- [0x0639]={
+ [0x639]={
adobename="ainarabic",
arabic="d",
category="lo",
description="ARABIC LETTER AIN",
direction="al",
linebreak="al",
- unicodeslot=0x0639,
+ unicodeslot=0x639,
},
- [0x063A]={
+ [0x63A]={
adobename="ghainarabic",
arabic="d",
category="lo",
description="ARABIC LETTER GHAIN",
direction="al",
linebreak="al",
- unicodeslot=0x063A,
+ unicodeslot=0x63A,
},
- [0x063B]={
+ [0x63B]={
arabic="d",
category="lo",
description="ARABIC LETTER KEHEH WITH TWO DOTS ABOVE",
direction="al",
linebreak="al",
- unicodeslot=0x063B,
+ unicodeslot=0x63B,
},
- [0x063C]={
+ [0x63C]={
arabic="d",
category="lo",
description="ARABIC LETTER KEHEH WITH THREE DOTS BELOW",
direction="al",
linebreak="al",
- unicodeslot=0x063C,
+ unicodeslot=0x63C,
},
- [0x063D]={
+ [0x63D]={
arabic="d",
category="lo",
description="ARABIC LETTER FARSI YEH WITH INVERTED V",
direction="al",
linebreak="al",
- unicodeslot=0x063D,
+ unicodeslot=0x63D,
},
- [0x063E]={
+ [0x63E]={
arabic="d",
category="lo",
description="ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE",
direction="al",
linebreak="al",
- unicodeslot=0x063E,
+ unicodeslot=0x63E,
},
- [0x063F]={
+ [0x63F]={
arabic="d",
category="lo",
description="ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE",
direction="al",
linebreak="al",
- unicodeslot=0x063F,
+ unicodeslot=0x63F,
},
- [0x0640]={
+ [0x640]={
adobename="tatweelarabic",
arabic="c",
category="lm",
description="ARABIC TATWEEL",
direction="al",
linebreak="al",
- unicodeslot=0x0640,
+ unicodeslot=0x640,
},
- [0x0641]={
+ [0x641]={
adobename="feharabic",
arabic="d",
category="lo",
description="ARABIC LETTER FEH",
direction="al",
linebreak="al",
- unicodeslot=0x0641,
+ unicodeslot=0x641,
},
- [0x0642]={
+ [0x642]={
adobename="qafarabic",
arabic="d",
category="lo",
description="ARABIC LETTER QAF",
direction="al",
linebreak="al",
- unicodeslot=0x0642,
+ unicodeslot=0x642,
},
- [0x0643]={
+ [0x643]={
adobename="kafarabic",
arabic="d",
category="lo",
description="ARABIC LETTER KAF",
direction="al",
linebreak="al",
- unicodeslot=0x0643,
+ unicodeslot=0x643,
},
- [0x0644]={
+ [0x644]={
adobename="lamarabic",
arabic="d",
category="lo",
description="ARABIC LETTER LAM",
direction="al",
linebreak="al",
- unicodeslot=0x0644,
+ unicodeslot=0x644,
},
- [0x0645]={
+ [0x645]={
adobename="meemarabic",
arabic="d",
category="lo",
description="ARABIC LETTER MEEM",
direction="al",
linebreak="al",
- unicodeslot=0x0645,
+ unicodeslot=0x645,
},
- [0x0646]={
+ [0x646]={
adobename="noonarabic",
arabic="d",
category="lo",
description="ARABIC LETTER NOON",
direction="al",
linebreak="al",
- unicodeslot=0x0646,
+ unicodeslot=0x646,
},
- [0x0647]={
+ [0x647]={
adobename="heharabic",
arabic="d",
category="lo",
description="ARABIC LETTER HEH",
direction="al",
linebreak="al",
- unicodeslot=0x0647,
+ unicodeslot=0x647,
},
- [0x0648]={
+ [0x648]={
adobename="wawarabic",
arabic="r",
category="lo",
description="ARABIC LETTER WAW",
direction="al",
linebreak="al",
- unicodeslot=0x0648,
+ unicodeslot=0x648,
},
- [0x0649]={
+ [0x649]={
adobename="alefmaksuraarabic",
arabic="d",
category="lo",
description="ARABIC LETTER ALEF MAKSURA",
direction="al",
linebreak="al",
- unicodeslot=0x0649,
+ unicodeslot=0x649,
},
- [0x064A]={
+ [0x64A]={
adobename="yeharabic",
arabic="d",
category="lo",
description="ARABIC LETTER YEH",
direction="al",
linebreak="al",
- unicodeslot=0x064A,
+ unicodeslot=0x64A,
},
- [0x064B]={
+ [0x64B]={
adobename="fathatanarabic",
category="mn",
+ combining=0x1B,
description="ARABIC FATHATAN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x064B,
+ unicodeslot=0x64B,
},
- [0x064C]={
+ [0x64C]={
adobename="dammatanarabic",
category="mn",
+ combining=0x1C,
description="ARABIC DAMMATAN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x064C,
+ unicodeslot=0x64C,
},
- [0x064D]={
+ [0x64D]={
adobename="kasratanarabic",
category="mn",
+ combining=0x1D,
description="ARABIC KASRATAN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x064D,
+ unicodeslot=0x64D,
},
- [0x064E]={
+ [0x64E]={
adobename="fathalowarabic",
category="mn",
+ combining=0x1E,
description="ARABIC FATHA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x064E,
+ unicodeslot=0x64E,
},
- [0x064F]={
+ [0x64F]={
adobename="dammalowarabic",
category="mn",
+ combining=0x1F,
description="ARABIC DAMMA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x064F,
+ unicodeslot=0x64F,
},
- [0x0650]={
+ [0x650]={
adobename="kasraarabic",
category="mn",
+ combining=0x20,
description="ARABIC KASRA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0650,
+ unicodeslot=0x650,
},
- [0x0651]={
+ [0x651]={
adobename="shaddafathatanarabic",
category="mn",
+ combining=0x21,
description="ARABIC SHADDA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0651,
+ unicodeslot=0x651,
},
- [0x0652]={
+ [0x652]={
adobename="sukunarabic",
category="mn",
+ combining=0x22,
description="ARABIC SUKUN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0652,
+ unicodeslot=0x652,
},
- [0x0653]={
+ [0x653]={
category="mn",
+ combining=0xE6,
description="ARABIC MADDAH ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0653,
+ unicodeslot=0x653,
},
- [0x0654]={
+ [0x654]={
category="mn",
+ combining=0xE6,
description="ARABIC HAMZA ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0654,
+ unicodeslot=0x654,
},
- [0x0655]={
+ [0x655]={
category="mn",
+ combining=0xDC,
description="ARABIC HAMZA BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0655,
+ unicodeslot=0x655,
},
- [0x0656]={
+ [0x656]={
category="mn",
+ combining=0xDC,
description="ARABIC SUBSCRIPT ALEF",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0656,
+ unicodeslot=0x656,
},
- [0x0657]={
+ [0x657]={
category="mn",
+ combining=0xE6,
description="ARABIC INVERTED DAMMA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0657,
+ unicodeslot=0x657,
},
- [0x0658]={
+ [0x658]={
category="mn",
+ combining=0xE6,
description="ARABIC MARK NOON GHUNNA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0658,
+ unicodeslot=0x658,
},
- [0x0659]={
+ [0x659]={
category="mn",
+ combining=0xE6,
description="ARABIC ZWARAKAY",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0659,
+ unicodeslot=0x659,
},
- [0x065A]={
+ [0x65A]={
category="mn",
+ combining=0xE6,
description="ARABIC VOWEL SIGN SMALL V ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x065A,
+ unicodeslot=0x65A,
},
- [0x065B]={
+ [0x65B]={
category="mn",
+ combining=0xE6,
description="ARABIC VOWEL SIGN INVERTED SMALL V ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x065B,
+ unicodeslot=0x65B,
},
- [0x065C]={
+ [0x65C]={
category="mn",
+ combining=0xDC,
description="ARABIC VOWEL SIGN DOT BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x065C,
+ unicodeslot=0x65C,
},
- [0x065D]={
+ [0x65D]={
category="mn",
+ combining=0xE6,
description="ARABIC REVERSED DAMMA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x065D,
+ unicodeslot=0x65D,
},
- [0x065E]={
+ [0x65E]={
category="mn",
+ combining=0xE6,
description="ARABIC FATHA WITH TWO DOTS",
direction="nsm",
linebreak="cm",
- unicodeslot=0x065E,
+ unicodeslot=0x65E,
},
- [0x065F]={
+ [0x65F]={
category="mn",
+ combining=0xDC,
description="ARABIC WAVY HAMZA BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x065F,
+ unicodeslot=0x65F,
},
- [0x0660]={
+ [0x660]={
adobename="zerohackarabic",
category="nd",
description="ARABIC-INDIC DIGIT ZERO",
direction="an",
linebreak="nu",
- unicodeslot=0x0660,
+ unicodeslot=0x660,
},
- [0x0661]={
+ [0x661]={
adobename="onehackarabic",
category="nd",
description="ARABIC-INDIC DIGIT ONE",
direction="an",
linebreak="nu",
- unicodeslot=0x0661,
+ unicodeslot=0x661,
},
- [0x0662]={
+ [0x662]={
adobename="twohackarabic",
category="nd",
description="ARABIC-INDIC DIGIT TWO",
direction="an",
linebreak="nu",
- unicodeslot=0x0662,
+ unicodeslot=0x662,
},
- [0x0663]={
+ [0x663]={
adobename="threehackarabic",
category="nd",
description="ARABIC-INDIC DIGIT THREE",
direction="an",
linebreak="nu",
- unicodeslot=0x0663,
+ unicodeslot=0x663,
},
- [0x0664]={
+ [0x664]={
adobename="fourhackarabic",
category="nd",
description="ARABIC-INDIC DIGIT FOUR",
direction="an",
linebreak="nu",
- unicodeslot=0x0664,
+ unicodeslot=0x664,
},
- [0x0665]={
+ [0x665]={
adobename="fivehackarabic",
category="nd",
description="ARABIC-INDIC DIGIT FIVE",
direction="an",
linebreak="nu",
- unicodeslot=0x0665,
+ unicodeslot=0x665,
},
- [0x0666]={
+ [0x666]={
adobename="sixhackarabic",
category="nd",
description="ARABIC-INDIC DIGIT SIX",
direction="an",
linebreak="nu",
- unicodeslot=0x0666,
+ unicodeslot=0x666,
},
- [0x0667]={
+ [0x667]={
adobename="sevenhackarabic",
category="nd",
description="ARABIC-INDIC DIGIT SEVEN",
direction="an",
linebreak="nu",
- unicodeslot=0x0667,
+ unicodeslot=0x667,
},
- [0x0668]={
+ [0x668]={
adobename="eighthackarabic",
category="nd",
description="ARABIC-INDIC DIGIT EIGHT",
direction="an",
linebreak="nu",
- unicodeslot=0x0668,
+ unicodeslot=0x668,
},
- [0x0669]={
+ [0x669]={
adobename="ninehackarabic",
category="nd",
description="ARABIC-INDIC DIGIT NINE",
direction="an",
linebreak="nu",
- unicodeslot=0x0669,
+ unicodeslot=0x669,
},
- [0x066A]={
+ [0x66A]={
adobename="percentarabic",
category="po",
description="ARABIC PERCENT SIGN",
direction="et",
linebreak="po",
- unicodeslot=0x066A,
+ unicodeslot=0x66A,
},
- [0x066B]={
+ [0x66B]={
adobename="decimalseparatorpersian",
category="po",
description="ARABIC DECIMAL SEPARATOR",
direction="an",
linebreak="nu",
- unicodeslot=0x066B,
+ unicodeslot=0x66B,
},
- [0x066C]={
+ [0x66C]={
adobename="thousandsseparatorpersian",
category="po",
description="ARABIC THOUSANDS SEPARATOR",
direction="an",
linebreak="nu",
- unicodeslot=0x066C,
+ unicodeslot=0x66C,
},
- [0x066D]={
+ [0x66D]={
adobename="asteriskarabic",
category="po",
description="ARABIC FIVE POINTED STAR",
direction="al",
linebreak="al",
- unicodeslot=0x066D,
+ unicodeslot=0x66D,
},
- [0x066E]={
+ [0x66E]={
arabic="d",
category="lo",
description="ARABIC LETTER DOTLESS BEH",
direction="al",
linebreak="al",
- unicodeslot=0x066E,
+ unicodeslot=0x66E,
},
- [0x066F]={
+ [0x66F]={
arabic="d",
category="lo",
description="ARABIC LETTER DOTLESS QAF",
direction="al",
linebreak="al",
- unicodeslot=0x066F,
+ unicodeslot=0x66F,
},
- [0x0670]={
+ [0x670]={
category="mn",
+ combining=0x23,
description="ARABIC LETTER SUPERSCRIPT ALEF",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0670,
+ unicodeslot=0x670,
},
- [0x0671]={
+ [0x671]={
arabic="r",
category="lo",
description="ARABIC LETTER ALEF WASLA",
direction="al",
linebreak="al",
- unicodeslot=0x0671,
+ unicodeslot=0x671,
},
- [0x0672]={
+ [0x672]={
arabic="r",
category="lo",
description="ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE",
direction="al",
linebreak="al",
- shcode=0x0627,
- unicodeslot=0x0672,
+ shcode=0x627,
+ unicodeslot=0x672,
},
- [0x0673]={
+ [0x673]={
arabic="r",
category="lo",
description="ARABIC LETTER ALEF WITH WAVY HAMZA BELOW",
direction="al",
linebreak="al",
- shcode=0x0627,
- unicodeslot=0x0673,
+ shcode=0x627,
+ unicodeslot=0x673,
},
- [0x0674]={
+ [0x674]={
arabic="u",
category="lo",
description="ARABIC LETTER HIGH HAMZA",
direction="al",
linebreak="al",
- unicodeslot=0x0674,
+ unicodeslot=0x674,
},
- [0x0675]={
+ [0x675]={
arabic="r",
category="lo",
description="ARABIC LETTER HIGH HAMZA ALEF",
direction="al",
linebreak="al",
- specials={ "compat", 0x0627, 0x0674 },
- unicodeslot=0x0675,
+ specials={ "compat", 0x627, 0x674 },
+ unicodeslot=0x675,
},
- [0x0676]={
+ [0x676]={
arabic="r",
category="lo",
description="ARABIC LETTER HIGH HAMZA WAW",
direction="al",
linebreak="al",
- specials={ "compat", 0x0648, 0x0674 },
- unicodeslot=0x0676,
+ specials={ "compat", 0x648, 0x674 },
+ unicodeslot=0x676,
},
- [0x0677]={
+ [0x677]={
arabic="r",
category="lo",
description="ARABIC LETTER U WITH HAMZA ABOVE",
direction="al",
linebreak="al",
- shcode=0x06C7,
- specials={ "compat", 0x06C7, 0x0674 },
- unicodeslot=0x0677,
+ shcode=0x6C7,
+ specials={ "compat", 0x6C7, 0x674 },
+ unicodeslot=0x677,
},
- [0x0678]={
+ [0x678]={
arabic="d",
category="lo",
description="ARABIC LETTER HIGH HAMZA YEH",
direction="al",
linebreak="al",
- specials={ "compat", 0x064A, 0x0674 },
- unicodeslot=0x0678,
+ specials={ "compat", 0x64A, 0x674 },
+ unicodeslot=0x678,
},
- [0x0679]={
+ [0x679]={
adobename="tteharabic",
arabic="d",
category="lo",
description="ARABIC LETTER TTEH",
direction="al",
linebreak="al",
- unicodeslot=0x0679,
+ unicodeslot=0x679,
},
- [0x067A]={
+ [0x67A]={
arabic="d",
category="lo",
description="ARABIC LETTER TTEHEH",
direction="al",
linebreak="al",
- unicodeslot=0x067A,
+ unicodeslot=0x67A,
},
- [0x067B]={
+ [0x67B]={
arabic="d",
category="lo",
description="ARABIC LETTER BEEH",
direction="al",
linebreak="al",
- unicodeslot=0x067B,
+ unicodeslot=0x67B,
},
- [0x067C]={
+ [0x67C]={
arabic="d",
category="lo",
description="ARABIC LETTER TEH WITH RING",
direction="al",
linebreak="al",
- shcode=0x062A,
- unicodeslot=0x067C,
+ shcode=0x62A,
+ unicodeslot=0x67C,
},
- [0x067D]={
+ [0x67D]={
arabic="d",
category="lo",
description="ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS",
direction="al",
linebreak="al",
- shcode=0x062A,
- unicodeslot=0x067D,
+ shcode=0x62A,
+ unicodeslot=0x67D,
},
- [0x067E]={
+ [0x67E]={
adobename="peharabic",
arabic="d",
category="lo",
description="ARABIC LETTER PEH",
direction="al",
linebreak="al",
- unicodeslot=0x067E,
+ unicodeslot=0x67E,
},
- [0x067F]={
+ [0x67F]={
arabic="d",
category="lo",
description="ARABIC LETTER TEHEH",
direction="al",
linebreak="al",
- unicodeslot=0x067F,
+ unicodeslot=0x67F,
},
- [0x0680]={
+ [0x680]={
arabic="d",
category="lo",
description="ARABIC LETTER BEHEH",
direction="al",
linebreak="al",
- unicodeslot=0x0680,
+ unicodeslot=0x680,
},
- [0x0681]={
+ [0x681]={
arabic="d",
category="lo",
description="ARABIC LETTER HAH WITH HAMZA ABOVE",
direction="al",
linebreak="al",
- shcode=0x062D,
- unicodeslot=0x0681,
+ shcode=0x62D,
+ unicodeslot=0x681,
},
- [0x0682]={
+ [0x682]={
arabic="d",
category="lo",
description="ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE",
direction="al",
linebreak="al",
- shcode=0x062D,
- unicodeslot=0x0682,
+ shcode=0x62D,
+ unicodeslot=0x682,
},
- [0x0683]={
+ [0x683]={
arabic="d",
category="lo",
description="ARABIC LETTER NYEH",
direction="al",
linebreak="al",
- unicodeslot=0x0683,
+ unicodeslot=0x683,
},
- [0x0684]={
+ [0x684]={
arabic="d",
category="lo",
description="ARABIC LETTER DYEH",
direction="al",
linebreak="al",
- unicodeslot=0x0684,
+ unicodeslot=0x684,
},
- [0x0685]={
+ [0x685]={
arabic="d",
category="lo",
description="ARABIC LETTER HAH WITH THREE DOTS ABOVE",
direction="al",
linebreak="al",
- shcode=0x062D,
- unicodeslot=0x0685,
+ shcode=0x62D,
+ unicodeslot=0x685,
},
- [0x0686]={
+ [0x686]={
adobename="tcheharabic",
arabic="d",
category="lo",
description="ARABIC LETTER TCHEH",
direction="al",
linebreak="al",
- unicodeslot=0x0686,
+ unicodeslot=0x686,
},
- [0x0687]={
+ [0x687]={
arabic="d",
category="lo",
description="ARABIC LETTER TCHEHEH",
direction="al",
linebreak="al",
- unicodeslot=0x0687,
+ unicodeslot=0x687,
},
- [0x0688]={
+ [0x688]={
adobename="ddalarabic",
arabic="r",
category="lo",
description="ARABIC LETTER DDAL",
direction="al",
linebreak="al",
- unicodeslot=0x0688,
+ unicodeslot=0x688,
},
- [0x0689]={
+ [0x689]={
arabic="r",
category="lo",
description="ARABIC LETTER DAL WITH RING",
direction="al",
linebreak="al",
- shcode=0x062F,
- unicodeslot=0x0689,
+ shcode=0x62F,
+ unicodeslot=0x689,
},
- [0x068A]={
+ [0x68A]={
arabic="r",
category="lo",
description="ARABIC LETTER DAL WITH DOT BELOW",
direction="al",
linebreak="al",
- shcode=0x062F,
- unicodeslot=0x068A,
+ shcode=0x62F,
+ unicodeslot=0x68A,
},
- [0x068B]={
+ [0x68B]={
arabic="r",
category="lo",
description="ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH",
direction="al",
linebreak="al",
- shcode=0x062F,
- unicodeslot=0x068B,
+ shcode=0x62F,
+ unicodeslot=0x68B,
},
- [0x068C]={
+ [0x68C]={
arabic="r",
category="lo",
description="ARABIC LETTER DAHAL",
direction="al",
linebreak="al",
- unicodeslot=0x068C,
+ unicodeslot=0x68C,
},
- [0x068D]={
+ [0x68D]={
arabic="r",
category="lo",
description="ARABIC LETTER DDAHAL",
direction="al",
linebreak="al",
- unicodeslot=0x068D,
+ unicodeslot=0x68D,
},
- [0x068E]={
+ [0x68E]={
arabic="r",
category="lo",
description="ARABIC LETTER DUL",
direction="al",
linebreak="al",
- unicodeslot=0x068E,
+ unicodeslot=0x68E,
},
- [0x068F]={
+ [0x68F]={
arabic="r",
category="lo",
description="ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS",
direction="al",
linebreak="al",
- shcode=0x062F,
- unicodeslot=0x068F,
+ shcode=0x62F,
+ unicodeslot=0x68F,
},
- [0x0690]={
+ [0x690]={
arabic="r",
category="lo",
description="ARABIC LETTER DAL WITH FOUR DOTS ABOVE",
direction="al",
linebreak="al",
- shcode=0x062F,
- unicodeslot=0x0690,
+ shcode=0x62F,
+ unicodeslot=0x690,
},
- [0x0691]={
+ [0x691]={
adobename="rreharabic",
arabic="r",
category="lo",
description="ARABIC LETTER RREH",
direction="al",
linebreak="al",
- unicodeslot=0x0691,
+ unicodeslot=0x691,
},
- [0x0692]={
+ [0x692]={
arabic="r",
category="lo",
description="ARABIC LETTER REH WITH SMALL V",
direction="al",
linebreak="al",
- shcode=0x0631,
- unicodeslot=0x0692,
+ shcode=0x631,
+ unicodeslot=0x692,
},
- [0x0693]={
+ [0x693]={
arabic="r",
category="lo",
description="ARABIC LETTER REH WITH RING",
direction="al",
linebreak="al",
- shcode=0x0631,
- unicodeslot=0x0693,
+ shcode=0x631,
+ unicodeslot=0x693,
},
- [0x0694]={
+ [0x694]={
arabic="r",
category="lo",
description="ARABIC LETTER REH WITH DOT BELOW",
direction="al",
linebreak="al",
- shcode=0x0631,
- unicodeslot=0x0694,
+ shcode=0x631,
+ unicodeslot=0x694,
},
- [0x0695]={
+ [0x695]={
arabic="r",
category="lo",
description="ARABIC LETTER REH WITH SMALL V BELOW",
direction="al",
linebreak="al",
- shcode=0x0631,
- unicodeslot=0x0695,
+ shcode=0x631,
+ unicodeslot=0x695,
},
- [0x0696]={
+ [0x696]={
arabic="r",
category="lo",
description="ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE",
direction="al",
linebreak="al",
- shcode=0x0631,
- unicodeslot=0x0696,
+ shcode=0x631,
+ unicodeslot=0x696,
},
- [0x0697]={
+ [0x697]={
arabic="r",
category="lo",
description="ARABIC LETTER REH WITH TWO DOTS ABOVE",
direction="al",
linebreak="al",
- shcode=0x0631,
- unicodeslot=0x0697,
+ shcode=0x631,
+ unicodeslot=0x697,
},
- [0x0698]={
+ [0x698]={
adobename="jeharabic",
arabic="r",
category="lo",
description="ARABIC LETTER JEH",
direction="al",
linebreak="al",
- unicodeslot=0x0698,
+ unicodeslot=0x698,
},
- [0x0699]={
+ [0x699]={
arabic="r",
category="lo",
description="ARABIC LETTER REH WITH FOUR DOTS ABOVE",
direction="al",
linebreak="al",
- shcode=0x0631,
- unicodeslot=0x0699,
+ shcode=0x631,
+ unicodeslot=0x699,
},
- [0x069A]={
+ [0x69A]={
arabic="d",
category="lo",
description="ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE",
direction="al",
linebreak="al",
- shcode=0x0633,
- unicodeslot=0x069A,
+ shcode=0x633,
+ unicodeslot=0x69A,
},
- [0x069B]={
+ [0x69B]={
arabic="d",
category="lo",
description="ARABIC LETTER SEEN WITH THREE DOTS BELOW",
direction="al",
linebreak="al",
- shcode=0x0633,
- unicodeslot=0x069B,
+ shcode=0x633,
+ unicodeslot=0x69B,
},
- [0x069C]={
+ [0x69C]={
arabic="d",
category="lo",
description="ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE",
direction="al",
linebreak="al",
- shcode=0x0633,
- unicodeslot=0x069C,
+ shcode=0x633,
+ unicodeslot=0x69C,
},
- [0x069D]={
+ [0x69D]={
arabic="d",
category="lo",
description="ARABIC LETTER SAD WITH TWO DOTS BELOW",
direction="al",
linebreak="al",
- shcode=0x0635,
- unicodeslot=0x069D,
+ shcode=0x635,
+ unicodeslot=0x69D,
},
- [0x069E]={
+ [0x69E]={
arabic="d",
category="lo",
description="ARABIC LETTER SAD WITH THREE DOTS ABOVE",
direction="al",
linebreak="al",
- shcode=0x0635,
- unicodeslot=0x069E,
+ shcode=0x635,
+ unicodeslot=0x69E,
},
- [0x069F]={
+ [0x69F]={
arabic="d",
category="lo",
description="ARABIC LETTER TAH WITH THREE DOTS ABOVE",
direction="al",
linebreak="al",
- shcode=0x0637,
- unicodeslot=0x069F,
+ shcode=0x637,
+ unicodeslot=0x69F,
},
- [0x06A0]={
+ [0x6A0]={
arabic="d",
category="lo",
description="ARABIC LETTER AIN WITH THREE DOTS ABOVE",
direction="al",
linebreak="al",
- shcode=0x0639,
- unicodeslot=0x06A0,
+ shcode=0x639,
+ unicodeslot=0x6A0,
},
- [0x06A1]={
+ [0x6A1]={
arabic="d",
category="lo",
description="ARABIC LETTER DOTLESS FEH",
direction="al",
linebreak="al",
- unicodeslot=0x06A1,
+ unicodeslot=0x6A1,
},
- [0x06A2]={
+ [0x6A2]={
arabic="d",
category="lo",
description="ARABIC LETTER FEH WITH DOT MOVED BELOW",
direction="al",
linebreak="al",
- shcode=0x0641,
- unicodeslot=0x06A2,
+ shcode=0x641,
+ unicodeslot=0x6A2,
},
- [0x06A3]={
+ [0x6A3]={
arabic="d",
category="lo",
description="ARABIC LETTER FEH WITH DOT BELOW",
direction="al",
linebreak="al",
- shcode=0x0641,
- unicodeslot=0x06A3,
+ shcode=0x641,
+ unicodeslot=0x6A3,
},
- [0x06A4]={
+ [0x6A4]={
adobename="veharabic",
arabic="d",
category="lo",
description="ARABIC LETTER VEH",
direction="al",
linebreak="al",
- unicodeslot=0x06A4,
+ unicodeslot=0x6A4,
},
- [0x06A5]={
+ [0x6A5]={
arabic="d",
category="lo",
description="ARABIC LETTER FEH WITH THREE DOTS BELOW",
direction="al",
linebreak="al",
- shcode=0x0641,
- unicodeslot=0x06A5,
+ shcode=0x641,
+ unicodeslot=0x6A5,
},
- [0x06A6]={
+ [0x6A6]={
arabic="d",
category="lo",
description="ARABIC LETTER PEHEH",
direction="al",
linebreak="al",
- unicodeslot=0x06A6,
+ unicodeslot=0x6A6,
},
- [0x06A7]={
+ [0x6A7]={
arabic="d",
category="lo",
description="ARABIC LETTER QAF WITH DOT ABOVE",
direction="al",
linebreak="al",
- shcode=0x0642,
- unicodeslot=0x06A7,
+ shcode=0x642,
+ unicodeslot=0x6A7,
},
- [0x06A8]={
+ [0x6A8]={
arabic="d",
category="lo",
description="ARABIC LETTER QAF WITH THREE DOTS ABOVE",
direction="al",
linebreak="al",
- shcode=0x0642,
- unicodeslot=0x06A8,
+ shcode=0x642,
+ unicodeslot=0x6A8,
},
- [0x06A9]={
+ [0x6A9]={
arabic="d",
category="lo",
description="ARABIC LETTER KEHEH",
direction="al",
linebreak="al",
- unicodeslot=0x06A9,
+ unicodeslot=0x6A9,
},
- [0x06AA]={
+ [0x6AA]={
arabic="d",
category="lo",
description="ARABIC LETTER SWASH KAF",
direction="al",
linebreak="al",
- unicodeslot=0x06AA,
+ unicodeslot=0x6AA,
},
- [0x06AB]={
+ [0x6AB]={
arabic="d",
category="lo",
description="ARABIC LETTER KAF WITH RING",
direction="al",
linebreak="al",
- shcode=0x0643,
- unicodeslot=0x06AB,
+ shcode=0x643,
+ unicodeslot=0x6AB,
},
- [0x06AC]={
+ [0x6AC]={
arabic="d",
category="lo",
description="ARABIC LETTER KAF WITH DOT ABOVE",
direction="al",
linebreak="al",
- shcode=0x0643,
- unicodeslot=0x06AC,
+ shcode=0x643,
+ unicodeslot=0x6AC,
},
- [0x06AD]={
+ [0x6AD]={
arabic="d",
category="lo",
description="ARABIC LETTER NG",
direction="al",
linebreak="al",
- unicodeslot=0x06AD,
+ unicodeslot=0x6AD,
},
- [0x06AE]={
+ [0x6AE]={
arabic="d",
category="lo",
description="ARABIC LETTER KAF WITH THREE DOTS BELOW",
direction="al",
linebreak="al",
- shcode=0x0643,
- unicodeslot=0x06AE,
+ shcode=0x643,
+ unicodeslot=0x6AE,
},
- [0x06AF]={
+ [0x6AF]={
adobename="gafarabic",
arabic="d",
category="lo",
description="ARABIC LETTER GAF",
direction="al",
linebreak="al",
- unicodeslot=0x06AF,
+ unicodeslot=0x6AF,
},
- [0x06B0]={
+ [0x6B0]={
arabic="d",
category="lo",
description="ARABIC LETTER GAF WITH RING",
direction="al",
linebreak="al",
- shcode=0x06AF,
- unicodeslot=0x06B0,
+ shcode=0x6AF,
+ unicodeslot=0x6B0,
},
- [0x06B1]={
+ [0x6B1]={
arabic="d",
category="lo",
description="ARABIC LETTER NGOEH",
direction="al",
linebreak="al",
- unicodeslot=0x06B1,
+ unicodeslot=0x6B1,
},
- [0x06B2]={
+ [0x6B2]={
arabic="d",
category="lo",
description="ARABIC LETTER GAF WITH TWO DOTS BELOW",
direction="al",
linebreak="al",
- shcode=0x06AF,
- unicodeslot=0x06B2,
+ shcode=0x6AF,
+ unicodeslot=0x6B2,
},
- [0x06B3]={
+ [0x6B3]={
arabic="d",
category="lo",
description="ARABIC LETTER GUEH",
direction="al",
linebreak="al",
- unicodeslot=0x06B3,
+ unicodeslot=0x6B3,
},
- [0x06B4]={
+ [0x6B4]={
arabic="d",
category="lo",
description="ARABIC LETTER GAF WITH THREE DOTS ABOVE",
direction="al",
linebreak="al",
- shcode=0x06AF,
- unicodeslot=0x06B4,
+ shcode=0x6AF,
+ unicodeslot=0x6B4,
},
- [0x06B5]={
+ [0x6B5]={
arabic="d",
category="lo",
description="ARABIC LETTER LAM WITH SMALL V",
direction="al",
linebreak="al",
- shcode=0x0644,
- unicodeslot=0x06B5,
+ shcode=0x644,
+ unicodeslot=0x6B5,
},
- [0x06B6]={
+ [0x6B6]={
arabic="d",
category="lo",
description="ARABIC LETTER LAM WITH DOT ABOVE",
direction="al",
linebreak="al",
- shcode=0x0644,
- unicodeslot=0x06B6,
+ shcode=0x644,
+ unicodeslot=0x6B6,
},
- [0x06B7]={
+ [0x6B7]={
arabic="d",
category="lo",
description="ARABIC LETTER LAM WITH THREE DOTS ABOVE",
direction="al",
linebreak="al",
- shcode=0x0644,
- unicodeslot=0x06B7,
+ shcode=0x644,
+ unicodeslot=0x6B7,
},
- [0x06B8]={
+ [0x6B8]={
arabic="d",
category="lo",
description="ARABIC LETTER LAM WITH THREE DOTS BELOW",
direction="al",
linebreak="al",
- shcode=0x0644,
- unicodeslot=0x06B8,
+ shcode=0x644,
+ unicodeslot=0x6B8,
},
- [0x06B9]={
+ [0x6B9]={
arabic="d",
category="lo",
description="ARABIC LETTER NOON WITH DOT BELOW",
direction="al",
linebreak="al",
- shcode=0x0646,
- unicodeslot=0x06B9,
+ shcode=0x646,
+ unicodeslot=0x6B9,
},
- [0x06BA]={
+ [0x6BA]={
adobename="noonghunnaarabic",
arabic="d",
category="lo",
description="ARABIC LETTER NOON GHUNNA",
direction="al",
linebreak="al",
- unicodeslot=0x06BA,
+ unicodeslot=0x6BA,
},
- [0x06BB]={
+ [0x6BB]={
arabic="d",
category="lo",
description="ARABIC LETTER RNOON",
direction="al",
linebreak="al",
- unicodeslot=0x06BB,
+ unicodeslot=0x6BB,
},
- [0x06BC]={
+ [0x6BC]={
arabic="d",
category="lo",
description="ARABIC LETTER NOON WITH RING",
direction="al",
linebreak="al",
- shcode=0x0646,
- unicodeslot=0x06BC,
+ shcode=0x646,
+ unicodeslot=0x6BC,
},
- [0x06BD]={
+ [0x6BD]={
arabic="d",
category="lo",
description="ARABIC LETTER NOON WITH THREE DOTS ABOVE",
direction="al",
linebreak="al",
- shcode=0x0646,
- unicodeslot=0x06BD,
+ shcode=0x646,
+ unicodeslot=0x6BD,
},
- [0x06BE]={
+ [0x6BE]={
arabic="d",
category="lo",
description="ARABIC LETTER HEH DOACHASHMEE",
direction="al",
linebreak="al",
- unicodeslot=0x06BE,
+ unicodeslot=0x6BE,
},
- [0x06BF]={
+ [0x6BF]={
arabic="d",
category="lo",
description="ARABIC LETTER TCHEH WITH DOT ABOVE",
direction="al",
linebreak="al",
- shcode=0x0686,
- unicodeslot=0x06BF,
+ shcode=0x686,
+ unicodeslot=0x6BF,
},
- [0x06C0]={
+ [0x6C0]={
arabic="r",
category="lo",
description="ARABIC LETTER HEH WITH YEH ABOVE",
direction="al",
linebreak="al",
- shcode=0x0647,
- specials={ "char", 0x06D5, 0x0654 },
- unicodeslot=0x06C0,
+ shcode=0x647,
+ specials={ "char", 0x6D5, 0x654 },
+ unicodeslot=0x6C0,
},
- [0x06C1]={
+ [0x6C1]={
adobename="hehaltonearabic",
arabic="d",
category="lo",
description="ARABIC LETTER HEH GOAL",
direction="al",
linebreak="al",
- unicodeslot=0x06C1,
+ unicodeslot=0x6C1,
},
- [0x06C2]={
+ [0x6C2]={
arabic="d",
category="lo",
description="ARABIC LETTER HEH GOAL WITH HAMZA ABOVE",
direction="al",
linebreak="al",
- specials={ "char", 0x06C1, 0x0654 },
- unicodeslot=0x06C2,
+ specials={ "char", 0x6C1, 0x654 },
+ unicodeslot=0x6C2,
},
- [0x06C3]={
+ [0x6C3]={
arabic="r",
category="lo",
description="ARABIC LETTER TEH MARBUTA GOAL",
direction="al",
linebreak="al",
- unicodeslot=0x06C3,
+ unicodeslot=0x6C3,
},
- [0x06C4]={
+ [0x6C4]={
arabic="r",
category="lo",
description="ARABIC LETTER WAW WITH RING",
direction="al",
linebreak="al",
- shcode=0x0648,
- unicodeslot=0x06C4,
+ shcode=0x648,
+ unicodeslot=0x6C4,
},
- [0x06C5]={
+ [0x6C5]={
arabic="r",
category="lo",
description="ARABIC LETTER KIRGHIZ OE",
direction="al",
linebreak="al",
- unicodeslot=0x06C5,
+ unicodeslot=0x6C5,
},
- [0x06C6]={
+ [0x6C6]={
arabic="r",
category="lo",
description="ARABIC LETTER OE",
direction="al",
linebreak="al",
- unicodeslot=0x06C6,
+ unicodeslot=0x6C6,
},
- [0x06C7]={
+ [0x6C7]={
arabic="r",
category="lo",
description="ARABIC LETTER U",
direction="al",
linebreak="al",
- unicodeslot=0x06C7,
+ unicodeslot=0x6C7,
},
- [0x06C8]={
+ [0x6C8]={
arabic="r",
category="lo",
description="ARABIC LETTER YU",
direction="al",
linebreak="al",
- unicodeslot=0x06C8,
+ unicodeslot=0x6C8,
},
- [0x06C9]={
+ [0x6C9]={
arabic="r",
category="lo",
description="ARABIC LETTER KIRGHIZ YU",
direction="al",
linebreak="al",
- unicodeslot=0x06C9,
+ unicodeslot=0x6C9,
},
- [0x06CA]={
+ [0x6CA]={
arabic="r",
category="lo",
description="ARABIC LETTER WAW WITH TWO DOTS ABOVE",
direction="al",
linebreak="al",
- shcode=0x0648,
- unicodeslot=0x06CA,
+ shcode=0x648,
+ unicodeslot=0x6CA,
},
- [0x06CB]={
+ [0x6CB]={
arabic="r",
category="lo",
description="ARABIC LETTER VE",
direction="al",
linebreak="al",
- unicodeslot=0x06CB,
+ unicodeslot=0x6CB,
},
- [0x06CC]={
+ [0x6CC]={
arabic="d",
category="lo",
description="ARABIC LETTER FARSI YEH",
direction="al",
linebreak="al",
- unicodeslot=0x06CC,
+ unicodeslot=0x6CC,
},
- [0x06CD]={
+ [0x6CD]={
arabic="r",
category="lo",
description="ARABIC LETTER YEH WITH TAIL",
direction="al",
linebreak="al",
- shcode=0x064A,
- unicodeslot=0x06CD,
+ shcode=0x64A,
+ unicodeslot=0x6CD,
},
- [0x06CE]={
+ [0x6CE]={
arabic="d",
category="lo",
description="ARABIC LETTER YEH WITH SMALL V",
direction="al",
linebreak="al",
- shcode=0x064A,
- unicodeslot=0x06CE,
+ shcode=0x64A,
+ unicodeslot=0x6CE,
},
- [0x06CF]={
+ [0x6CF]={
arabic="r",
category="lo",
description="ARABIC LETTER WAW WITH DOT ABOVE",
direction="al",
linebreak="al",
- shcode=0x0648,
- unicodeslot=0x06CF,
+ shcode=0x648,
+ unicodeslot=0x6CF,
},
- [0x06D0]={
+ [0x6D0]={
arabic="d",
category="lo",
description="ARABIC LETTER E",
direction="al",
linebreak="al",
- unicodeslot=0x06D0,
+ unicodeslot=0x6D0,
},
- [0x06D1]={
+ [0x6D1]={
adobename="yehthreedotsbelowarabic",
arabic="d",
category="lo",
description="ARABIC LETTER YEH WITH THREE DOTS BELOW",
direction="al",
linebreak="al",
- shcode=0x064A,
- unicodeslot=0x06D1,
+ shcode=0x64A,
+ unicodeslot=0x6D1,
},
- [0x06D2]={
+ [0x6D2]={
adobename="yehbarreearabic",
arabic="r",
category="lo",
description="ARABIC LETTER YEH BARREE",
direction="al",
linebreak="al",
- unicodeslot=0x06D2,
+ unicodeslot=0x6D2,
},
- [0x06D3]={
+ [0x6D3]={
arabic="r",
category="lo",
description="ARABIC LETTER YEH BARREE WITH HAMZA ABOVE",
direction="al",
linebreak="al",
- specials={ "char", 0x06D2, 0x0654 },
- unicodeslot=0x06D3,
+ specials={ "char", 0x6D2, 0x654 },
+ unicodeslot=0x6D3,
},
- [0x06D4]={
+ [0x6D4]={
category="po",
description="ARABIC FULL STOP",
direction="al",
linebreak="ex",
- unicodeslot=0x06D4,
+ unicodeslot=0x6D4,
},
- [0x06D5]={
+ [0x6D5]={
adobename="afii57534",
arabic="r",
category="lo",
description="ARABIC LETTER AE",
direction="al",
linebreak="al",
- unicodeslot=0x06D5,
+ unicodeslot=0x6D5,
},
- [0x06D6]={
+ [0x6D6]={
category="mn",
+ combining=0xE6,
description="ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x06D6,
+ unicodeslot=0x6D6,
},
- [0x06D7]={
+ [0x6D7]={
category="mn",
+ combining=0xE6,
description="ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x06D7,
+ unicodeslot=0x6D7,
},
- [0x06D8]={
+ [0x6D8]={
category="mn",
+ combining=0xE6,
description="ARABIC SMALL HIGH MEEM INITIAL FORM",
direction="nsm",
linebreak="cm",
- unicodeslot=0x06D8,
+ unicodeslot=0x6D8,
},
- [0x06D9]={
+ [0x6D9]={
category="mn",
+ combining=0xE6,
description="ARABIC SMALL HIGH LAM ALEF",
direction="nsm",
linebreak="cm",
- unicodeslot=0x06D9,
+ unicodeslot=0x6D9,
},
- [0x06DA]={
+ [0x6DA]={
category="mn",
+ combining=0xE6,
description="ARABIC SMALL HIGH JEEM",
direction="nsm",
linebreak="cm",
- unicodeslot=0x06DA,
+ unicodeslot=0x6DA,
},
- [0x06DB]={
+ [0x6DB]={
category="mn",
+ combining=0xE6,
description="ARABIC SMALL HIGH THREE DOTS",
direction="nsm",
linebreak="cm",
- unicodeslot=0x06DB,
+ unicodeslot=0x6DB,
},
- [0x06DC]={
+ [0x6DC]={
category="mn",
+ combining=0xE6,
description="ARABIC SMALL HIGH SEEN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x06DC,
+ unicodeslot=0x6DC,
},
- [0x06DD]={
+ [0x6DD]={
arabic="u",
category="cf",
description="ARABIC END OF AYAH",
direction="an",
linebreak="al",
- unicodeslot=0x06DD,
+ unicodeslot=0x6DD,
visible="yes",
},
- [0x06DE]={
+ [0x6DE]={
category="me",
description="ARABIC START OF RUB EL HIZB",
direction="on",
linebreak="al",
- unicodeslot=0x06DE,
+ unicodeslot=0x6DE,
},
- [0x06DF]={
+ [0x6DF]={
category="mn",
+ combining=0xE6,
description="ARABIC SMALL HIGH ROUNDED ZERO",
direction="nsm",
linebreak="cm",
- unicodeslot=0x06DF,
+ unicodeslot=0x6DF,
},
- [0x06E0]={
+ [0x6E0]={
category="mn",
+ combining=0xE6,
description="ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO",
direction="nsm",
linebreak="cm",
- unicodeslot=0x06E0,
+ unicodeslot=0x6E0,
},
- [0x06E1]={
+ [0x6E1]={
category="mn",
+ combining=0xE6,
description="ARABIC SMALL HIGH DOTLESS HEAD OF KHAH",
direction="nsm",
linebreak="cm",
- unicodeslot=0x06E1,
+ unicodeslot=0x6E1,
},
- [0x06E2]={
+ [0x6E2]={
category="mn",
+ combining=0xE6,
description="ARABIC SMALL HIGH MEEM ISOLATED FORM",
direction="nsm",
linebreak="cm",
- unicodeslot=0x06E2,
+ unicodeslot=0x6E2,
},
- [0x06E3]={
+ [0x6E3]={
category="mn",
+ combining=0xDC,
description="ARABIC SMALL LOW SEEN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x06E3,
+ unicodeslot=0x6E3,
},
- [0x06E4]={
+ [0x6E4]={
category="mn",
+ combining=0xE6,
description="ARABIC SMALL HIGH MADDA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x06E4,
+ unicodeslot=0x6E4,
},
- [0x06E5]={
+ [0x6E5]={
category="lm",
description="ARABIC SMALL WAW",
direction="al",
linebreak="al",
- unicodeslot=0x06E5,
+ unicodeslot=0x6E5,
},
- [0x06E6]={
+ [0x6E6]={
category="lm",
description="ARABIC SMALL YEH",
direction="al",
linebreak="al",
- unicodeslot=0x06E6,
+ unicodeslot=0x6E6,
},
- [0x06E7]={
+ [0x6E7]={
category="mn",
+ combining=0xE6,
description="ARABIC SMALL HIGH YEH",
direction="nsm",
linebreak="cm",
- unicodeslot=0x06E7,
+ unicodeslot=0x6E7,
},
- [0x06E8]={
+ [0x6E8]={
category="mn",
+ combining=0xE6,
description="ARABIC SMALL HIGH NOON",
direction="nsm",
linebreak="cm",
- unicodeslot=0x06E8,
+ unicodeslot=0x6E8,
},
- [0x06E9]={
+ [0x6E9]={
category="so",
description="ARABIC PLACE OF SAJDAH",
direction="on",
linebreak="al",
- unicodeslot=0x06E9,
+ unicodeslot=0x6E9,
},
- [0x06EA]={
+ [0x6EA]={
category="mn",
+ combining=0xDC,
description="ARABIC EMPTY CENTRE LOW STOP",
direction="nsm",
linebreak="cm",
- unicodeslot=0x06EA,
+ unicodeslot=0x6EA,
},
- [0x06EB]={
+ [0x6EB]={
category="mn",
+ combining=0xE6,
description="ARABIC EMPTY CENTRE HIGH STOP",
direction="nsm",
linebreak="cm",
- unicodeslot=0x06EB,
+ unicodeslot=0x6EB,
},
- [0x06EC]={
+ [0x6EC]={
category="mn",
+ combining=0xE6,
description="ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x06EC,
+ unicodeslot=0x6EC,
},
- [0x06ED]={
+ [0x6ED]={
category="mn",
+ combining=0xDC,
description="ARABIC SMALL LOW MEEM",
direction="nsm",
linebreak="cm",
- unicodeslot=0x06ED,
+ unicodeslot=0x6ED,
},
- [0x06EE]={
+ [0x6EE]={
arabic="r",
category="lo",
description="ARABIC LETTER DAL WITH INVERTED V",
direction="al",
linebreak="al",
- shcode=0x062F,
- unicodeslot=0x06EE,
+ shcode=0x62F,
+ unicodeslot=0x6EE,
},
- [0x06EF]={
+ [0x6EF]={
arabic="r",
category="lo",
description="ARABIC LETTER REH WITH INVERTED V",
direction="al",
linebreak="al",
- shcode=0x0631,
- unicodeslot=0x06EF,
+ shcode=0x631,
+ unicodeslot=0x6EF,
},
- [0x06F0]={
+ [0x6F0]={
adobename="zeropersian",
category="nd",
description="EXTENDED ARABIC-INDIC DIGIT ZERO",
direction="en",
linebreak="nu",
- unicodeslot=0x06F0,
+ unicodeslot=0x6F0,
},
- [0x06F1]={
+ [0x6F1]={
adobename="onepersian",
category="nd",
description="EXTENDED ARABIC-INDIC DIGIT ONE",
direction="en",
linebreak="nu",
- unicodeslot=0x06F1,
+ unicodeslot=0x6F1,
},
- [0x06F2]={
+ [0x6F2]={
adobename="twopersian",
category="nd",
description="EXTENDED ARABIC-INDIC DIGIT TWO",
direction="en",
linebreak="nu",
- unicodeslot=0x06F2,
+ unicodeslot=0x6F2,
},
- [0x06F3]={
+ [0x6F3]={
adobename="threepersian",
category="nd",
description="EXTENDED ARABIC-INDIC DIGIT THREE",
direction="en",
linebreak="nu",
- unicodeslot=0x06F3,
+ unicodeslot=0x6F3,
},
- [0x06F4]={
+ [0x6F4]={
adobename="fourpersian",
category="nd",
description="EXTENDED ARABIC-INDIC DIGIT FOUR",
direction="en",
linebreak="nu",
- unicodeslot=0x06F4,
+ unicodeslot=0x6F4,
},
- [0x06F5]={
+ [0x6F5]={
adobename="fivepersian",
category="nd",
description="EXTENDED ARABIC-INDIC DIGIT FIVE",
direction="en",
linebreak="nu",
- unicodeslot=0x06F5,
+ unicodeslot=0x6F5,
},
- [0x06F6]={
+ [0x6F6]={
adobename="sixpersian",
category="nd",
description="EXTENDED ARABIC-INDIC DIGIT SIX",
direction="en",
linebreak="nu",
- unicodeslot=0x06F6,
+ unicodeslot=0x6F6,
},
- [0x06F7]={
+ [0x6F7]={
adobename="sevenpersian",
category="nd",
description="EXTENDED ARABIC-INDIC DIGIT SEVEN",
direction="en",
linebreak="nu",
- unicodeslot=0x06F7,
+ unicodeslot=0x6F7,
},
- [0x06F8]={
+ [0x6F8]={
adobename="eightpersian",
category="nd",
description="EXTENDED ARABIC-INDIC DIGIT EIGHT",
direction="en",
linebreak="nu",
- unicodeslot=0x06F8,
+ unicodeslot=0x6F8,
},
- [0x06F9]={
+ [0x6F9]={
adobename="ninepersian",
category="nd",
description="EXTENDED ARABIC-INDIC DIGIT NINE",
direction="en",
linebreak="nu",
- unicodeslot=0x06F9,
+ unicodeslot=0x6F9,
},
- [0x06FA]={
+ [0x6FA]={
arabic="d",
category="lo",
description="ARABIC LETTER SHEEN WITH DOT BELOW",
direction="al",
linebreak="al",
- shcode=0x0634,
- unicodeslot=0x06FA,
+ shcode=0x634,
+ unicodeslot=0x6FA,
},
- [0x06FB]={
+ [0x6FB]={
arabic="d",
category="lo",
description="ARABIC LETTER DAD WITH DOT BELOW",
direction="al",
linebreak="al",
- shcode=0x0636,
- unicodeslot=0x06FB,
+ shcode=0x636,
+ unicodeslot=0x6FB,
},
- [0x06FC]={
+ [0x6FC]={
arabic="d",
category="lo",
description="ARABIC LETTER GHAIN WITH DOT BELOW",
direction="al",
linebreak="al",
- shcode=0x063A,
- unicodeslot=0x06FC,
+ shcode=0x63A,
+ unicodeslot=0x6FC,
},
- [0x06FD]={
+ [0x6FD]={
category="so",
description="ARABIC SIGN SINDHI AMPERSAND",
direction="al",
linebreak="al",
- unicodeslot=0x06FD,
+ unicodeslot=0x6FD,
},
- [0x06FE]={
+ [0x6FE]={
category="so",
description="ARABIC SIGN SINDHI POSTPOSITION MEN",
direction="al",
linebreak="al",
- unicodeslot=0x06FE,
+ unicodeslot=0x6FE,
},
- [0x06FF]={
+ [0x6FF]={
arabic="d",
category="lo",
description="ARABIC LETTER HEH WITH INVERTED V",
direction="al",
linebreak="al",
- shcode=0x0647,
- unicodeslot=0x06FF,
+ shcode=0x647,
+ unicodeslot=0x6FF,
},
- [0x0700]={
+ [0x700]={
category="po",
description="SYRIAC END OF PARAGRAPH",
direction="al",
linebreak="al",
- unicodeslot=0x0700,
+ unicodeslot=0x700,
},
- [0x0701]={
+ [0x701]={
category="po",
description="SYRIAC SUPRALINEAR FULL STOP",
direction="al",
linebreak="al",
- unicodeslot=0x0701,
+ unicodeslot=0x701,
},
- [0x0702]={
+ [0x702]={
category="po",
description="SYRIAC SUBLINEAR FULL STOP",
direction="al",
linebreak="al",
- unicodeslot=0x0702,
+ unicodeslot=0x702,
},
- [0x0703]={
+ [0x703]={
category="po",
description="SYRIAC SUPRALINEAR COLON",
direction="al",
linebreak="al",
- unicodeslot=0x0703,
+ unicodeslot=0x703,
},
- [0x0704]={
+ [0x704]={
category="po",
description="SYRIAC SUBLINEAR COLON",
direction="al",
linebreak="al",
- unicodeslot=0x0704,
+ unicodeslot=0x704,
},
- [0x0705]={
+ [0x705]={
category="po",
description="SYRIAC HORIZONTAL COLON",
direction="al",
linebreak="al",
- unicodeslot=0x0705,
+ unicodeslot=0x705,
},
- [0x0706]={
+ [0x706]={
category="po",
description="SYRIAC COLON SKEWED LEFT",
direction="al",
linebreak="al",
- unicodeslot=0x0706,
+ unicodeslot=0x706,
},
- [0x0707]={
+ [0x707]={
category="po",
description="SYRIAC COLON SKEWED RIGHT",
direction="al",
linebreak="al",
- unicodeslot=0x0707,
+ unicodeslot=0x707,
},
- [0x0708]={
+ [0x708]={
category="po",
description="SYRIAC SUPRALINEAR COLON SKEWED LEFT",
direction="al",
linebreak="al",
- unicodeslot=0x0708,
+ unicodeslot=0x708,
},
- [0x0709]={
+ [0x709]={
category="po",
description="SYRIAC SUBLINEAR COLON SKEWED RIGHT",
direction="al",
linebreak="al",
- unicodeslot=0x0709,
+ unicodeslot=0x709,
},
- [0x070A]={
+ [0x70A]={
category="po",
description="SYRIAC CONTRACTION",
direction="al",
linebreak="al",
- unicodeslot=0x070A,
+ unicodeslot=0x70A,
},
- [0x070B]={
+ [0x70B]={
category="po",
description="SYRIAC HARKLEAN OBELUS",
direction="al",
linebreak="al",
- unicodeslot=0x070B,
+ unicodeslot=0x70B,
},
- [0x070C]={
+ [0x70C]={
category="po",
description="SYRIAC HARKLEAN METOBELUS",
direction="al",
linebreak="al",
- unicodeslot=0x070C,
+ unicodeslot=0x70C,
},
- [0x070D]={
+ [0x70D]={
category="po",
description="SYRIAC HARKLEAN ASTERISCUS",
direction="al",
linebreak="al",
- unicodeslot=0x070D,
+ unicodeslot=0x70D,
},
- [0x070F]={
+ [0x70F]={
category="cf",
description="SYRIAC ABBREVIATION MARK",
direction="al",
linebreak="al",
- unicodeslot=0x070F,
+ unicodeslot=0x70F,
visible="yes",
},
- [0x0710]={
+ [0x710]={
arabic="r",
category="lo",
description="SYRIAC LETTER ALAPH",
direction="al",
linebreak="al",
- unicodeslot=0x0710,
+ unicodeslot=0x710,
},
- [0x0711]={
+ [0x711]={
category="mn",
+ combining=0x24,
description="SYRIAC LETTER SUPERSCRIPT ALAPH",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0711,
+ unicodeslot=0x711,
},
- [0x0712]={
+ [0x712]={
arabic="d",
category="lo",
description="SYRIAC LETTER BETH",
direction="al",
linebreak="al",
- unicodeslot=0x0712,
+ unicodeslot=0x712,
},
- [0x0713]={
+ [0x713]={
arabic="d",
category="lo",
description="SYRIAC LETTER GAMAL",
direction="al",
linebreak="al",
- unicodeslot=0x0713,
+ unicodeslot=0x713,
},
- [0x0714]={
+ [0x714]={
arabic="d",
category="lo",
description="SYRIAC LETTER GAMAL GARSHUNI",
direction="al",
linebreak="al",
- unicodeslot=0x0714,
+ unicodeslot=0x714,
},
- [0x0715]={
+ [0x715]={
arabic="r",
category="lo",
description="SYRIAC LETTER DALATH",
direction="al",
linebreak="al",
- unicodeslot=0x0715,
+ unicodeslot=0x715,
},
- [0x0716]={
+ [0x716]={
arabic="r",
category="lo",
description="SYRIAC LETTER DOTLESS DALATH RISH",
direction="al",
linebreak="al",
- unicodeslot=0x0716,
+ unicodeslot=0x716,
},
- [0x0717]={
+ [0x717]={
arabic="r",
category="lo",
description="SYRIAC LETTER HE",
direction="al",
linebreak="al",
- unicodeslot=0x0717,
+ unicodeslot=0x717,
},
- [0x0718]={
+ [0x718]={
arabic="r",
category="lo",
description="SYRIAC LETTER WAW",
direction="al",
linebreak="al",
- unicodeslot=0x0718,
+ unicodeslot=0x718,
},
- [0x0719]={
+ [0x719]={
arabic="r",
category="lo",
description="SYRIAC LETTER ZAIN",
direction="al",
linebreak="al",
- unicodeslot=0x0719,
+ unicodeslot=0x719,
},
- [0x071A]={
+ [0x71A]={
arabic="d",
category="lo",
description="SYRIAC LETTER HETH",
direction="al",
linebreak="al",
- unicodeslot=0x071A,
+ unicodeslot=0x71A,
},
- [0x071B]={
+ [0x71B]={
arabic="d",
category="lo",
description="SYRIAC LETTER TETH",
direction="al",
linebreak="al",
- unicodeslot=0x071B,
+ unicodeslot=0x71B,
},
- [0x071C]={
+ [0x71C]={
arabic="d",
category="lo",
description="SYRIAC LETTER TETH GARSHUNI",
direction="al",
linebreak="al",
- unicodeslot=0x071C,
+ unicodeslot=0x71C,
},
- [0x071D]={
+ [0x71D]={
arabic="d",
category="lo",
description="SYRIAC LETTER YUDH",
direction="al",
linebreak="al",
- unicodeslot=0x071D,
+ unicodeslot=0x71D,
},
- [0x071E]={
+ [0x71E]={
arabic="r",
category="lo",
description="SYRIAC LETTER YUDH HE",
direction="al",
linebreak="al",
- unicodeslot=0x071E,
+ unicodeslot=0x71E,
},
- [0x071F]={
+ [0x71F]={
arabic="d",
category="lo",
description="SYRIAC LETTER KAPH",
direction="al",
linebreak="al",
- unicodeslot=0x071F,
+ unicodeslot=0x71F,
},
- [0x0720]={
+ [0x720]={
arabic="d",
category="lo",
description="SYRIAC LETTER LAMADH",
direction="al",
linebreak="al",
- unicodeslot=0x0720,
+ unicodeslot=0x720,
},
- [0x0721]={
+ [0x721]={
arabic="d",
category="lo",
description="SYRIAC LETTER MIM",
direction="al",
linebreak="al",
- unicodeslot=0x0721,
+ unicodeslot=0x721,
},
- [0x0722]={
+ [0x722]={
arabic="d",
category="lo",
description="SYRIAC LETTER NUN",
direction="al",
linebreak="al",
- unicodeslot=0x0722,
+ unicodeslot=0x722,
},
- [0x0723]={
+ [0x723]={
arabic="d",
category="lo",
description="SYRIAC LETTER SEMKATH",
direction="al",
linebreak="al",
- unicodeslot=0x0723,
+ unicodeslot=0x723,
},
- [0x0724]={
+ [0x724]={
arabic="d",
category="lo",
description="SYRIAC LETTER FINAL SEMKATH",
direction="al",
linebreak="al",
- unicodeslot=0x0724,
+ unicodeslot=0x724,
},
- [0x0725]={
+ [0x725]={
arabic="d",
category="lo",
description="SYRIAC LETTER E",
direction="al",
linebreak="al",
- unicodeslot=0x0725,
+ unicodeslot=0x725,
},
- [0x0726]={
+ [0x726]={
arabic="d",
category="lo",
description="SYRIAC LETTER PE",
direction="al",
linebreak="al",
- unicodeslot=0x0726,
+ unicodeslot=0x726,
},
- [0x0727]={
+ [0x727]={
arabic="d",
category="lo",
description="SYRIAC LETTER REVERSED PE",
direction="al",
linebreak="al",
- unicodeslot=0x0727,
+ unicodeslot=0x727,
},
- [0x0728]={
+ [0x728]={
arabic="r",
category="lo",
description="SYRIAC LETTER SADHE",
direction="al",
linebreak="al",
- unicodeslot=0x0728,
+ unicodeslot=0x728,
},
- [0x0729]={
+ [0x729]={
arabic="d",
category="lo",
description="SYRIAC LETTER QAPH",
direction="al",
linebreak="al",
- unicodeslot=0x0729,
+ unicodeslot=0x729,
},
- [0x072A]={
+ [0x72A]={
arabic="r",
category="lo",
description="SYRIAC LETTER RISH",
direction="al",
linebreak="al",
- unicodeslot=0x072A,
+ unicodeslot=0x72A,
},
- [0x072B]={
+ [0x72B]={
arabic="d",
category="lo",
description="SYRIAC LETTER SHIN",
direction="al",
linebreak="al",
- unicodeslot=0x072B,
+ unicodeslot=0x72B,
},
- [0x072C]={
+ [0x72C]={
arabic="r",
category="lo",
description="SYRIAC LETTER TAW",
direction="al",
linebreak="al",
- unicodeslot=0x072C,
+ unicodeslot=0x72C,
},
- [0x072D]={
+ [0x72D]={
arabic="d",
category="lo",
description="SYRIAC LETTER PERSIAN BHETH",
direction="al",
linebreak="al",
- unicodeslot=0x072D,
+ unicodeslot=0x72D,
},
- [0x072E]={
+ [0x72E]={
arabic="d",
category="lo",
description="SYRIAC LETTER PERSIAN GHAMAL",
direction="al",
linebreak="al",
- unicodeslot=0x072E,
+ unicodeslot=0x72E,
},
- [0x072F]={
+ [0x72F]={
arabic="r",
category="lo",
description="SYRIAC LETTER PERSIAN DHALATH",
direction="al",
linebreak="al",
- unicodeslot=0x072F,
+ unicodeslot=0x72F,
},
- [0x0730]={
+ [0x730]={
category="mn",
+ combining=0xE6,
description="SYRIAC PTHAHA ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0730,
+ unicodeslot=0x730,
},
- [0x0731]={
+ [0x731]={
category="mn",
+ combining=0xDC,
description="SYRIAC PTHAHA BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0731,
+ unicodeslot=0x731,
},
- [0x0732]={
+ [0x732]={
category="mn",
+ combining=0xE6,
description="SYRIAC PTHAHA DOTTED",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0732,
+ unicodeslot=0x732,
},
- [0x0733]={
+ [0x733]={
category="mn",
+ combining=0xE6,
description="SYRIAC ZQAPHA ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0733,
+ unicodeslot=0x733,
},
- [0x0734]={
+ [0x734]={
category="mn",
+ combining=0xDC,
description="SYRIAC ZQAPHA BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0734,
+ unicodeslot=0x734,
},
- [0x0735]={
+ [0x735]={
category="mn",
+ combining=0xE6,
description="SYRIAC ZQAPHA DOTTED",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0735,
+ unicodeslot=0x735,
},
- [0x0736]={
+ [0x736]={
category="mn",
+ combining=0xE6,
description="SYRIAC RBASA ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0736,
+ unicodeslot=0x736,
},
- [0x0737]={
+ [0x737]={
category="mn",
+ combining=0xDC,
description="SYRIAC RBASA BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0737,
+ unicodeslot=0x737,
},
- [0x0738]={
+ [0x738]={
category="mn",
+ combining=0xDC,
description="SYRIAC DOTTED ZLAMA HORIZONTAL",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0738,
+ unicodeslot=0x738,
},
- [0x0739]={
+ [0x739]={
category="mn",
+ combining=0xDC,
description="SYRIAC DOTTED ZLAMA ANGULAR",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0739,
+ unicodeslot=0x739,
},
- [0x073A]={
+ [0x73A]={
category="mn",
+ combining=0xE6,
description="SYRIAC HBASA ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x073A,
+ unicodeslot=0x73A,
},
- [0x073B]={
+ [0x73B]={
category="mn",
+ combining=0xDC,
description="SYRIAC HBASA BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x073B,
+ unicodeslot=0x73B,
},
- [0x073C]={
+ [0x73C]={
category="mn",
+ combining=0xDC,
description="SYRIAC HBASA-ESASA DOTTED",
direction="nsm",
linebreak="cm",
- unicodeslot=0x073C,
+ unicodeslot=0x73C,
},
- [0x073D]={
+ [0x73D]={
category="mn",
+ combining=0xE6,
description="SYRIAC ESASA ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x073D,
+ unicodeslot=0x73D,
},
- [0x073E]={
+ [0x73E]={
category="mn",
+ combining=0xDC,
description="SYRIAC ESASA BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x073E,
+ unicodeslot=0x73E,
},
- [0x073F]={
+ [0x73F]={
category="mn",
+ combining=0xE6,
description="SYRIAC RWAHA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x073F,
+ unicodeslot=0x73F,
},
- [0x0740]={
+ [0x740]={
category="mn",
+ combining=0xE6,
description="SYRIAC FEMININE DOT",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0740,
+ unicodeslot=0x740,
},
- [0x0741]={
+ [0x741]={
category="mn",
+ combining=0xE6,
description="SYRIAC QUSHSHAYA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0741,
+ unicodeslot=0x741,
},
- [0x0742]={
+ [0x742]={
category="mn",
+ combining=0xDC,
description="SYRIAC RUKKAKHA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0742,
+ unicodeslot=0x742,
},
- [0x0743]={
+ [0x743]={
category="mn",
+ combining=0xE6,
description="SYRIAC TWO VERTICAL DOTS ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0743,
+ unicodeslot=0x743,
},
- [0x0744]={
+ [0x744]={
category="mn",
+ combining=0xDC,
description="SYRIAC TWO VERTICAL DOTS BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0744,
+ unicodeslot=0x744,
},
- [0x0745]={
+ [0x745]={
category="mn",
+ combining=0xE6,
description="SYRIAC THREE DOTS ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0745,
+ unicodeslot=0x745,
},
- [0x0746]={
+ [0x746]={
category="mn",
+ combining=0xDC,
description="SYRIAC THREE DOTS BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0746,
+ unicodeslot=0x746,
},
- [0x0747]={
+ [0x747]={
category="mn",
+ combining=0xE6,
description="SYRIAC OBLIQUE LINE ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0747,
+ unicodeslot=0x747,
},
- [0x0748]={
+ [0x748]={
category="mn",
+ combining=0xDC,
description="SYRIAC OBLIQUE LINE BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0748,
+ unicodeslot=0x748,
},
- [0x0749]={
+ [0x749]={
category="mn",
+ combining=0xE6,
description="SYRIAC MUSIC",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0749,
+ unicodeslot=0x749,
},
- [0x074A]={
+ [0x74A]={
category="mn",
+ combining=0xE6,
description="SYRIAC BARREKH",
direction="nsm",
linebreak="cm",
- unicodeslot=0x074A,
+ unicodeslot=0x74A,
},
- [0x074D]={
+ [0x74D]={
arabic="r",
category="lo",
description="SYRIAC LETTER SOGDIAN ZHAIN",
direction="al",
linebreak="al",
- unicodeslot=0x074D,
+ unicodeslot=0x74D,
},
- [0x074E]={
+ [0x74E]={
arabic="d",
category="lo",
description="SYRIAC LETTER SOGDIAN KHAPH",
direction="al",
linebreak="al",
- unicodeslot=0x074E,
+ unicodeslot=0x74E,
},
- [0x074F]={
+ [0x74F]={
arabic="d",
category="lo",
description="SYRIAC LETTER SOGDIAN FE",
direction="al",
linebreak="al",
- unicodeslot=0x074F,
+ unicodeslot=0x74F,
},
- [0x0750]={
+ [0x750]={
arabic="d",
category="lo",
description="ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW",
direction="al",
linebreak="al",
- shcode=0x0628,
- unicodeslot=0x0750,
+ shcode=0x628,
+ unicodeslot=0x750,
},
- [0x0751]={
+ [0x751]={
arabic="d",
category="lo",
description="ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE",
direction="al",
linebreak="al",
- shcode=0x0628,
- unicodeslot=0x0751,
+ shcode=0x628,
+ unicodeslot=0x751,
},
- [0x0752]={
+ [0x752]={
arabic="d",
category="lo",
description="ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW",
direction="al",
linebreak="al",
- shcode=0x0628,
- unicodeslot=0x0752,
+ shcode=0x628,
+ unicodeslot=0x752,
},
- [0x0753]={
+ [0x753]={
arabic="d",
category="lo",
description="ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE",
direction="al",
linebreak="al",
- shcode=0x0628,
- unicodeslot=0x0753,
+ shcode=0x628,
+ unicodeslot=0x753,
},
- [0x0754]={
+ [0x754]={
arabic="d",
category="lo",
description="ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE",
direction="al",
linebreak="al",
- shcode=0x0628,
- unicodeslot=0x0754,
+ shcode=0x628,
+ unicodeslot=0x754,
},
- [0x0755]={
+ [0x755]={
arabic="d",
category="lo",
description="ARABIC LETTER BEH WITH INVERTED SMALL V BELOW",
direction="al",
linebreak="al",
- shcode=0x0628,
- unicodeslot=0x0755,
+ shcode=0x628,
+ unicodeslot=0x755,
},
- [0x0756]={
+ [0x756]={
arabic="d",
category="lo",
description="ARABIC LETTER BEH WITH SMALL V",
direction="al",
linebreak="al",
- shcode=0x0628,
- unicodeslot=0x0756,
+ shcode=0x628,
+ unicodeslot=0x756,
},
- [0x0757]={
+ [0x757]={
arabic="d",
category="lo",
description="ARABIC LETTER HAH WITH TWO DOTS ABOVE",
direction="al",
linebreak="al",
- shcode=0x062D,
- unicodeslot=0x0757,
+ shcode=0x62D,
+ unicodeslot=0x757,
},
- [0x0758]={
+ [0x758]={
arabic="d",
category="lo",
description="ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW",
direction="al",
linebreak="al",
- shcode=0x062D,
- unicodeslot=0x0758,
+ shcode=0x62D,
+ unicodeslot=0x758,
},
- [0x0759]={
+ [0x759]={
arabic="r",
category="lo",
description="ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH",
direction="al",
linebreak="al",
- shcode=0x062F,
- unicodeslot=0x0759,
+ shcode=0x62F,
+ unicodeslot=0x759,
},
- [0x075A]={
+ [0x75A]={
arabic="r",
category="lo",
description="ARABIC LETTER DAL WITH INVERTED SMALL V BELOW",
direction="al",
linebreak="al",
- shcode=0x062F,
- unicodeslot=0x075A,
+ shcode=0x62F,
+ unicodeslot=0x75A,
},
- [0x075B]={
+ [0x75B]={
arabic="r",
category="lo",
description="ARABIC LETTER REH WITH STROKE",
direction="al",
linebreak="al",
- shcode=0x0631,
- unicodeslot=0x075B,
+ shcode=0x631,
+ unicodeslot=0x75B,
},
- [0x075C]={
+ [0x75C]={
arabic="d",
category="lo",
description="ARABIC LETTER SEEN WITH FOUR DOTS ABOVE",
direction="al",
linebreak="al",
- shcode=0x0633,
- unicodeslot=0x075C,
+ shcode=0x633,
+ unicodeslot=0x75C,
},
- [0x075D]={
+ [0x75D]={
arabic="d",
category="lo",
description="ARABIC LETTER AIN WITH TWO DOTS ABOVE",
direction="al",
linebreak="al",
- shcode=0x0639,
- unicodeslot=0x075D,
+ shcode=0x639,
+ unicodeslot=0x75D,
},
- [0x075E]={
+ [0x75E]={
arabic="d",
category="lo",
description="ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE",
direction="al",
linebreak="al",
- shcode=0x0639,
- unicodeslot=0x075E,
+ shcode=0x639,
+ unicodeslot=0x75E,
},
- [0x075F]={
+ [0x75F]={
arabic="d",
category="lo",
description="ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE",
direction="al",
linebreak="al",
- shcode=0x0639,
- unicodeslot=0x075F,
+ shcode=0x639,
+ unicodeslot=0x75F,
},
- [0x0760]={
+ [0x760]={
arabic="d",
category="lo",
description="ARABIC LETTER FEH WITH TWO DOTS BELOW",
direction="al",
linebreak="al",
- shcode=0x0641,
- unicodeslot=0x0760,
+ shcode=0x641,
+ unicodeslot=0x760,
},
- [0x0761]={
+ [0x761]={
arabic="d",
category="lo",
description="ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW",
direction="al",
linebreak="al",
- shcode=0x0641,
- unicodeslot=0x0761,
+ shcode=0x641,
+ unicodeslot=0x761,
},
- [0x0762]={
+ [0x762]={
arabic="d",
category="lo",
description="ARABIC LETTER KEHEH WITH DOT ABOVE",
direction="al",
linebreak="al",
- shcode=0x06A9,
- unicodeslot=0x0762,
+ shcode=0x6A9,
+ unicodeslot=0x762,
},
- [0x0763]={
+ [0x763]={
arabic="d",
category="lo",
description="ARABIC LETTER KEHEH WITH THREE DOTS ABOVE",
direction="al",
linebreak="al",
- shcode=0x06A9,
- unicodeslot=0x0763,
+ shcode=0x6A9,
+ unicodeslot=0x763,
},
- [0x0764]={
+ [0x764]={
arabic="d",
category="lo",
description="ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW",
direction="al",
linebreak="al",
- shcode=0x06A9,
- unicodeslot=0x0764,
+ shcode=0x6A9,
+ unicodeslot=0x764,
},
- [0x0765]={
+ [0x765]={
arabic="d",
category="lo",
description="ARABIC LETTER MEEM WITH DOT ABOVE",
direction="al",
linebreak="al",
- shcode=0x0645,
- unicodeslot=0x0765,
+ shcode=0x645,
+ unicodeslot=0x765,
},
- [0x0766]={
+ [0x766]={
arabic="d",
category="lo",
description="ARABIC LETTER MEEM WITH DOT BELOW",
direction="al",
linebreak="al",
- shcode=0x0645,
- unicodeslot=0x0766,
+ shcode=0x645,
+ unicodeslot=0x766,
},
- [0x0767]={
+ [0x767]={
arabic="d",
category="lo",
description="ARABIC LETTER NOON WITH TWO DOTS BELOW",
direction="al",
linebreak="al",
- shcode=0x0646,
- unicodeslot=0x0767,
+ shcode=0x646,
+ unicodeslot=0x767,
},
- [0x0768]={
+ [0x768]={
arabic="d",
category="lo",
description="ARABIC LETTER NOON WITH SMALL TAH",
direction="al",
linebreak="al",
- shcode=0x0646,
- unicodeslot=0x0768,
+ shcode=0x646,
+ unicodeslot=0x768,
},
- [0x0769]={
+ [0x769]={
arabic="d",
category="lo",
description="ARABIC LETTER NOON WITH SMALL V",
direction="al",
linebreak="al",
- shcode=0x0646,
- unicodeslot=0x0769,
+ shcode=0x646,
+ unicodeslot=0x769,
},
- [0x076A]={
+ [0x76A]={
arabic="d",
category="lo",
description="ARABIC LETTER LAM WITH BAR",
direction="al",
linebreak="al",
- shcode=0x0644,
- unicodeslot=0x076A,
+ shcode=0x644,
+ unicodeslot=0x76A,
},
- [0x076B]={
+ [0x76B]={
arabic="r",
category="lo",
description="ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE",
direction="al",
linebreak="al",
- shcode=0x0631,
- unicodeslot=0x076B,
+ shcode=0x631,
+ unicodeslot=0x76B,
},
- [0x076C]={
+ [0x76C]={
arabic="r",
category="lo",
description="ARABIC LETTER REH WITH HAMZA ABOVE",
direction="al",
linebreak="al",
- shcode=0x0631,
- unicodeslot=0x076C,
+ shcode=0x631,
+ unicodeslot=0x76C,
},
- [0x076D]={
+ [0x76D]={
arabic="d",
category="lo",
description="ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE",
direction="al",
linebreak="al",
- shcode=0x0633,
- unicodeslot=0x076D,
+ shcode=0x633,
+ unicodeslot=0x76D,
},
- [0x076E]={
+ [0x76E]={
arabic="d",
category="lo",
description="ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW",
direction="al",
linebreak="al",
- unicodeslot=0x076E,
+ unicodeslot=0x76E,
},
- [0x076F]={
+ [0x76F]={
arabic="d",
category="lo",
description="ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS",
direction="al",
linebreak="al",
- unicodeslot=0x076F,
+ unicodeslot=0x76F,
},
- [0x0770]={
+ [0x770]={
arabic="d",
category="lo",
description="ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS",
direction="al",
linebreak="al",
- unicodeslot=0x0770,
+ unicodeslot=0x770,
},
- [0x0771]={
+ [0x771]={
arabic="r",
category="lo",
description="ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS",
direction="al",
linebreak="al",
- unicodeslot=0x0771,
+ unicodeslot=0x771,
},
- [0x0772]={
+ [0x772]={
arabic="d",
category="lo",
description="ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE",
direction="al",
linebreak="al",
- unicodeslot=0x0772,
+ unicodeslot=0x772,
},
- [0x0773]={
+ [0x773]={
arabic="r",
category="lo",
description="ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE",
direction="al",
linebreak="al",
- unicodeslot=0x0773,
+ unicodeslot=0x773,
},
- [0x0774]={
+ [0x774]={
arabic="r",
category="lo",
description="ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE",
direction="al",
linebreak="al",
- unicodeslot=0x0774,
+ unicodeslot=0x774,
},
- [0x0775]={
+ [0x775]={
arabic="d",
category="lo",
description="ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE",
direction="al",
linebreak="al",
- unicodeslot=0x0775,
+ unicodeslot=0x775,
},
- [0x0776]={
+ [0x776]={
arabic="d",
category="lo",
description="ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE",
direction="al",
linebreak="al",
- unicodeslot=0x0776,
+ unicodeslot=0x776,
},
- [0x0777]={
+ [0x777]={
arabic="d",
category="lo",
description="ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW",
direction="al",
linebreak="al",
- unicodeslot=0x0777,
+ unicodeslot=0x777,
},
- [0x0778]={
+ [0x778]={
arabic="r",
category="lo",
description="ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE",
direction="al",
linebreak="al",
- unicodeslot=0x0778,
+ unicodeslot=0x778,
},
- [0x0779]={
+ [0x779]={
arabic="r",
category="lo",
description="ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE",
direction="al",
linebreak="al",
- unicodeslot=0x0779,
+ unicodeslot=0x779,
},
- [0x077A]={
+ [0x77A]={
arabic="d",
category="lo",
description="ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE",
direction="al",
linebreak="al",
- unicodeslot=0x077A,
+ unicodeslot=0x77A,
},
- [0x077B]={
+ [0x77B]={
arabic="d",
category="lo",
description="ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE",
direction="al",
linebreak="al",
- unicodeslot=0x077B,
+ unicodeslot=0x77B,
},
- [0x077C]={
+ [0x77C]={
arabic="d",
category="lo",
description="ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW",
direction="al",
linebreak="al",
- unicodeslot=0x077C,
+ unicodeslot=0x77C,
},
- [0x077D]={
+ [0x77D]={
arabic="d",
category="lo",
description="ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE",
direction="al",
linebreak="al",
- unicodeslot=0x077D,
+ unicodeslot=0x77D,
},
- [0x077E]={
+ [0x77E]={
arabic="d",
category="lo",
description="ARABIC LETTER SEEN WITH INVERTED V",
direction="al",
linebreak="al",
- unicodeslot=0x077E,
+ unicodeslot=0x77E,
},
- [0x077F]={
+ [0x77F]={
arabic="d",
category="lo",
description="ARABIC LETTER KAF WITH TWO DOTS ABOVE",
direction="al",
linebreak="al",
- unicodeslot=0x077F,
+ unicodeslot=0x77F,
},
- [0x0780]={
+ [0x780]={
category="lo",
description="THAANA LETTER HAA",
direction="al",
linebreak="al",
- unicodeslot=0x0780,
+ unicodeslot=0x780,
},
- [0x0781]={
+ [0x781]={
category="lo",
description="THAANA LETTER SHAVIYANI",
direction="al",
linebreak="al",
- unicodeslot=0x0781,
+ unicodeslot=0x781,
},
- [0x0782]={
+ [0x782]={
category="lo",
description="THAANA LETTER NOONU",
direction="al",
linebreak="al",
- unicodeslot=0x0782,
+ unicodeslot=0x782,
},
- [0x0783]={
+ [0x783]={
category="lo",
description="THAANA LETTER RAA",
direction="al",
linebreak="al",
- unicodeslot=0x0783,
+ unicodeslot=0x783,
},
- [0x0784]={
+ [0x784]={
category="lo",
description="THAANA LETTER BAA",
direction="al",
linebreak="al",
- unicodeslot=0x0784,
+ unicodeslot=0x784,
},
- [0x0785]={
+ [0x785]={
category="lo",
description="THAANA LETTER LHAVIYANI",
direction="al",
linebreak="al",
- unicodeslot=0x0785,
+ unicodeslot=0x785,
},
- [0x0786]={
+ [0x786]={
category="lo",
description="THAANA LETTER KAAFU",
direction="al",
linebreak="al",
- unicodeslot=0x0786,
+ unicodeslot=0x786,
},
- [0x0787]={
+ [0x787]={
category="lo",
description="THAANA LETTER ALIFU",
direction="al",
linebreak="al",
- unicodeslot=0x0787,
+ unicodeslot=0x787,
},
- [0x0788]={
+ [0x788]={
category="lo",
description="THAANA LETTER VAAVU",
direction="al",
linebreak="al",
- unicodeslot=0x0788,
+ unicodeslot=0x788,
},
- [0x0789]={
+ [0x789]={
category="lo",
description="THAANA LETTER MEEMU",
direction="al",
linebreak="al",
- unicodeslot=0x0789,
+ unicodeslot=0x789,
},
- [0x078A]={
+ [0x78A]={
category="lo",
description="THAANA LETTER FAAFU",
direction="al",
linebreak="al",
- unicodeslot=0x078A,
+ unicodeslot=0x78A,
},
- [0x078B]={
+ [0x78B]={
category="lo",
description="THAANA LETTER DHAALU",
direction="al",
linebreak="al",
- unicodeslot=0x078B,
+ unicodeslot=0x78B,
},
- [0x078C]={
+ [0x78C]={
category="lo",
description="THAANA LETTER THAA",
direction="al",
linebreak="al",
- unicodeslot=0x078C,
+ unicodeslot=0x78C,
},
- [0x078D]={
+ [0x78D]={
category="lo",
description="THAANA LETTER LAAMU",
direction="al",
linebreak="al",
- unicodeslot=0x078D,
+ unicodeslot=0x78D,
},
- [0x078E]={
+ [0x78E]={
category="lo",
description="THAANA LETTER GAAFU",
direction="al",
linebreak="al",
- unicodeslot=0x078E,
+ unicodeslot=0x78E,
},
- [0x078F]={
+ [0x78F]={
category="lo",
description="THAANA LETTER GNAVIYANI",
direction="al",
linebreak="al",
- unicodeslot=0x078F,
+ unicodeslot=0x78F,
},
- [0x0790]={
+ [0x790]={
category="lo",
description="THAANA LETTER SEENU",
direction="al",
linebreak="al",
- unicodeslot=0x0790,
+ unicodeslot=0x790,
},
- [0x0791]={
+ [0x791]={
category="lo",
description="THAANA LETTER DAVIYANI",
direction="al",
linebreak="al",
- unicodeslot=0x0791,
+ unicodeslot=0x791,
},
- [0x0792]={
+ [0x792]={
category="lo",
description="THAANA LETTER ZAVIYANI",
direction="al",
linebreak="al",
- unicodeslot=0x0792,
+ unicodeslot=0x792,
},
- [0x0793]={
+ [0x793]={
category="lo",
description="THAANA LETTER TAVIYANI",
direction="al",
linebreak="al",
- unicodeslot=0x0793,
+ unicodeslot=0x793,
},
- [0x0794]={
+ [0x794]={
category="lo",
description="THAANA LETTER YAA",
direction="al",
linebreak="al",
- unicodeslot=0x0794,
+ unicodeslot=0x794,
},
- [0x0795]={
+ [0x795]={
category="lo",
description="THAANA LETTER PAVIYANI",
direction="al",
linebreak="al",
- unicodeslot=0x0795,
+ unicodeslot=0x795,
},
- [0x0796]={
+ [0x796]={
category="lo",
description="THAANA LETTER JAVIYANI",
direction="al",
linebreak="al",
- unicodeslot=0x0796,
+ unicodeslot=0x796,
},
- [0x0797]={
+ [0x797]={
category="lo",
description="THAANA LETTER CHAVIYANI",
direction="al",
linebreak="al",
- unicodeslot=0x0797,
+ unicodeslot=0x797,
},
- [0x0798]={
+ [0x798]={
category="lo",
description="THAANA LETTER TTAA",
direction="al",
linebreak="al",
- unicodeslot=0x0798,
+ unicodeslot=0x798,
},
- [0x0799]={
+ [0x799]={
category="lo",
description="THAANA LETTER HHAA",
direction="al",
linebreak="al",
- unicodeslot=0x0799,
+ unicodeslot=0x799,
},
- [0x079A]={
+ [0x79A]={
category="lo",
description="THAANA LETTER KHAA",
direction="al",
linebreak="al",
- unicodeslot=0x079A,
+ unicodeslot=0x79A,
},
- [0x079B]={
+ [0x79B]={
category="lo",
description="THAANA LETTER THAALU",
direction="al",
linebreak="al",
- unicodeslot=0x079B,
+ unicodeslot=0x79B,
},
- [0x079C]={
+ [0x79C]={
category="lo",
description="THAANA LETTER ZAA",
direction="al",
linebreak="al",
- unicodeslot=0x079C,
+ unicodeslot=0x79C,
},
- [0x079D]={
+ [0x79D]={
category="lo",
description="THAANA LETTER SHEENU",
direction="al",
linebreak="al",
- unicodeslot=0x079D,
+ unicodeslot=0x79D,
},
- [0x079E]={
+ [0x79E]={
category="lo",
description="THAANA LETTER SAADHU",
direction="al",
linebreak="al",
- unicodeslot=0x079E,
+ unicodeslot=0x79E,
},
- [0x079F]={
+ [0x79F]={
category="lo",
description="THAANA LETTER DAADHU",
direction="al",
linebreak="al",
- unicodeslot=0x079F,
+ unicodeslot=0x79F,
},
- [0x07A0]={
+ [0x7A0]={
category="lo",
description="THAANA LETTER TO",
direction="al",
linebreak="al",
- unicodeslot=0x07A0,
+ unicodeslot=0x7A0,
},
- [0x07A1]={
+ [0x7A1]={
category="lo",
description="THAANA LETTER ZO",
direction="al",
linebreak="al",
- unicodeslot=0x07A1,
+ unicodeslot=0x7A1,
},
- [0x07A2]={
+ [0x7A2]={
category="lo",
description="THAANA LETTER AINU",
direction="al",
linebreak="al",
- unicodeslot=0x07A2,
+ unicodeslot=0x7A2,
},
- [0x07A3]={
+ [0x7A3]={
category="lo",
description="THAANA LETTER GHAINU",
direction="al",
linebreak="al",
- unicodeslot=0x07A3,
+ unicodeslot=0x7A3,
},
- [0x07A4]={
+ [0x7A4]={
category="lo",
description="THAANA LETTER QAAFU",
direction="al",
linebreak="al",
- unicodeslot=0x07A4,
+ unicodeslot=0x7A4,
},
- [0x07A5]={
+ [0x7A5]={
category="lo",
description="THAANA LETTER WAAVU",
direction="al",
linebreak="al",
- unicodeslot=0x07A5,
+ unicodeslot=0x7A5,
},
- [0x07A6]={
+ [0x7A6]={
category="mn",
description="THAANA ABAFILI",
direction="nsm",
linebreak="cm",
- unicodeslot=0x07A6,
+ unicodeslot=0x7A6,
},
- [0x07A7]={
+ [0x7A7]={
category="mn",
description="THAANA AABAAFILI",
direction="nsm",
linebreak="cm",
- unicodeslot=0x07A7,
+ unicodeslot=0x7A7,
},
- [0x07A8]={
+ [0x7A8]={
category="mn",
description="THAANA IBIFILI",
direction="nsm",
linebreak="cm",
- unicodeslot=0x07A8,
+ unicodeslot=0x7A8,
},
- [0x07A9]={
+ [0x7A9]={
category="mn",
description="THAANA EEBEEFILI",
direction="nsm",
linebreak="cm",
- unicodeslot=0x07A9,
+ unicodeslot=0x7A9,
},
- [0x07AA]={
+ [0x7AA]={
category="mn",
description="THAANA UBUFILI",
direction="nsm",
linebreak="cm",
- unicodeslot=0x07AA,
+ unicodeslot=0x7AA,
},
- [0x07AB]={
+ [0x7AB]={
category="mn",
description="THAANA OOBOOFILI",
direction="nsm",
linebreak="cm",
- unicodeslot=0x07AB,
+ unicodeslot=0x7AB,
},
- [0x07AC]={
+ [0x7AC]={
category="mn",
description="THAANA EBEFILI",
direction="nsm",
linebreak="cm",
- unicodeslot=0x07AC,
+ unicodeslot=0x7AC,
},
- [0x07AD]={
+ [0x7AD]={
category="mn",
description="THAANA EYBEYFILI",
direction="nsm",
linebreak="cm",
- unicodeslot=0x07AD,
+ unicodeslot=0x7AD,
},
- [0x07AE]={
+ [0x7AE]={
category="mn",
description="THAANA OBOFILI",
direction="nsm",
linebreak="cm",
- unicodeslot=0x07AE,
+ unicodeslot=0x7AE,
},
- [0x07AF]={
+ [0x7AF]={
category="mn",
description="THAANA OABOAFILI",
direction="nsm",
linebreak="cm",
- unicodeslot=0x07AF,
+ unicodeslot=0x7AF,
},
- [0x07B0]={
+ [0x7B0]={
category="mn",
description="THAANA SUKUN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x07B0,
+ unicodeslot=0x7B0,
},
- [0x07B1]={
+ [0x7B1]={
category="lo",
description="THAANA LETTER NAA",
direction="al",
linebreak="al",
- unicodeslot=0x07B1,
+ unicodeslot=0x7B1,
},
- [0x07C0]={
+ [0x7C0]={
category="nd",
description="NKO DIGIT ZERO",
direction="r",
linebreak="nu",
- unicodeslot=0x07C0,
+ unicodeslot=0x7C0,
},
- [0x07C1]={
+ [0x7C1]={
category="nd",
description="NKO DIGIT ONE",
direction="r",
linebreak="nu",
- unicodeslot=0x07C1,
+ unicodeslot=0x7C1,
},
- [0x07C2]={
+ [0x7C2]={
category="nd",
description="NKO DIGIT TWO",
direction="r",
linebreak="nu",
- unicodeslot=0x07C2,
+ unicodeslot=0x7C2,
},
- [0x07C3]={
+ [0x7C3]={
category="nd",
description="NKO DIGIT THREE",
direction="r",
linebreak="nu",
- unicodeslot=0x07C3,
+ unicodeslot=0x7C3,
},
- [0x07C4]={
+ [0x7C4]={
category="nd",
description="NKO DIGIT FOUR",
direction="r",
linebreak="nu",
- unicodeslot=0x07C4,
+ unicodeslot=0x7C4,
},
- [0x07C5]={
+ [0x7C5]={
category="nd",
description="NKO DIGIT FIVE",
direction="r",
linebreak="nu",
- unicodeslot=0x07C5,
+ unicodeslot=0x7C5,
},
- [0x07C6]={
+ [0x7C6]={
category="nd",
description="NKO DIGIT SIX",
direction="r",
linebreak="nu",
- unicodeslot=0x07C6,
+ unicodeslot=0x7C6,
},
- [0x07C7]={
+ [0x7C7]={
category="nd",
description="NKO DIGIT SEVEN",
direction="r",
linebreak="nu",
- unicodeslot=0x07C7,
+ unicodeslot=0x7C7,
},
- [0x07C8]={
+ [0x7C8]={
category="nd",
description="NKO DIGIT EIGHT",
direction="r",
linebreak="nu",
- unicodeslot=0x07C8,
+ unicodeslot=0x7C8,
},
- [0x07C9]={
+ [0x7C9]={
category="nd",
description="NKO DIGIT NINE",
direction="r",
linebreak="nu",
- unicodeslot=0x07C9,
+ unicodeslot=0x7C9,
},
- [0x07CA]={
+ [0x7CA]={
arabic="d",
category="lo",
description="NKO LETTER A",
direction="r",
linebreak="al",
- unicodeslot=0x07CA,
+ unicodeslot=0x7CA,
},
- [0x07CB]={
+ [0x7CB]={
arabic="d",
category="lo",
description="NKO LETTER EE",
direction="r",
linebreak="al",
- unicodeslot=0x07CB,
+ unicodeslot=0x7CB,
},
- [0x07CC]={
+ [0x7CC]={
arabic="d",
category="lo",
description="NKO LETTER I",
direction="r",
linebreak="al",
- unicodeslot=0x07CC,
+ unicodeslot=0x7CC,
},
- [0x07CD]={
+ [0x7CD]={
arabic="d",
category="lo",
description="NKO LETTER E",
direction="r",
linebreak="al",
- unicodeslot=0x07CD,
+ unicodeslot=0x7CD,
},
- [0x07CE]={
+ [0x7CE]={
arabic="d",
category="lo",
description="NKO LETTER U",
direction="r",
linebreak="al",
- unicodeslot=0x07CE,
+ unicodeslot=0x7CE,
},
- [0x07CF]={
+ [0x7CF]={
arabic="d",
category="lo",
description="NKO LETTER OO",
direction="r",
linebreak="al",
- unicodeslot=0x07CF,
+ unicodeslot=0x7CF,
},
- [0x07D0]={
+ [0x7D0]={
arabic="d",
category="lo",
description="NKO LETTER O",
direction="r",
linebreak="al",
- unicodeslot=0x07D0,
+ unicodeslot=0x7D0,
},
- [0x07D1]={
+ [0x7D1]={
arabic="d",
category="lo",
description="NKO LETTER DAGBASINNA",
direction="r",
linebreak="al",
- unicodeslot=0x07D1,
+ unicodeslot=0x7D1,
},
- [0x07D2]={
+ [0x7D2]={
arabic="d",
category="lo",
description="NKO LETTER N",
direction="r",
linebreak="al",
- unicodeslot=0x07D2,
+ unicodeslot=0x7D2,
},
- [0x07D3]={
+ [0x7D3]={
arabic="d",
category="lo",
description="NKO LETTER BA",
direction="r",
linebreak="al",
- unicodeslot=0x07D3,
+ unicodeslot=0x7D3,
},
- [0x07D4]={
+ [0x7D4]={
arabic="d",
category="lo",
description="NKO LETTER PA",
direction="r",
linebreak="al",
- unicodeslot=0x07D4,
+ unicodeslot=0x7D4,
},
- [0x07D5]={
+ [0x7D5]={
arabic="d",
category="lo",
description="NKO LETTER TA",
direction="r",
linebreak="al",
- unicodeslot=0x07D5,
+ unicodeslot=0x7D5,
},
- [0x07D6]={
+ [0x7D6]={
arabic="d",
category="lo",
description="NKO LETTER JA",
direction="r",
linebreak="al",
- unicodeslot=0x07D6,
+ unicodeslot=0x7D6,
},
- [0x07D7]={
+ [0x7D7]={
arabic="d",
category="lo",
description="NKO LETTER CHA",
direction="r",
linebreak="al",
- unicodeslot=0x07D7,
+ unicodeslot=0x7D7,
},
- [0x07D8]={
+ [0x7D8]={
arabic="d",
category="lo",
description="NKO LETTER DA",
direction="r",
linebreak="al",
- unicodeslot=0x07D8,
+ unicodeslot=0x7D8,
},
- [0x07D9]={
+ [0x7D9]={
arabic="d",
category="lo",
description="NKO LETTER RA",
direction="r",
linebreak="al",
- unicodeslot=0x07D9,
+ unicodeslot=0x7D9,
},
- [0x07DA]={
+ [0x7DA]={
arabic="d",
category="lo",
description="NKO LETTER RRA",
direction="r",
linebreak="al",
- unicodeslot=0x07DA,
+ unicodeslot=0x7DA,
},
- [0x07DB]={
+ [0x7DB]={
arabic="d",
category="lo",
description="NKO LETTER SA",
direction="r",
linebreak="al",
- unicodeslot=0x07DB,
+ unicodeslot=0x7DB,
},
- [0x07DC]={
+ [0x7DC]={
arabic="d",
category="lo",
description="NKO LETTER GBA",
direction="r",
linebreak="al",
- unicodeslot=0x07DC,
+ unicodeslot=0x7DC,
},
- [0x07DD]={
+ [0x7DD]={
arabic="d",
category="lo",
description="NKO LETTER FA",
direction="r",
linebreak="al",
- unicodeslot=0x07DD,
+ unicodeslot=0x7DD,
},
- [0x07DE]={
+ [0x7DE]={
arabic="d",
category="lo",
description="NKO LETTER KA",
direction="r",
linebreak="al",
- unicodeslot=0x07DE,
+ unicodeslot=0x7DE,
},
- [0x07DF]={
+ [0x7DF]={
arabic="d",
category="lo",
description="NKO LETTER LA",
direction="r",
linebreak="al",
- unicodeslot=0x07DF,
+ unicodeslot=0x7DF,
},
- [0x07E0]={
+ [0x7E0]={
arabic="d",
category="lo",
description="NKO LETTER NA WOLOSO",
direction="r",
linebreak="al",
- unicodeslot=0x07E0,
+ unicodeslot=0x7E0,
},
- [0x07E1]={
+ [0x7E1]={
arabic="d",
category="lo",
description="NKO LETTER MA",
direction="r",
linebreak="al",
- unicodeslot=0x07E1,
+ unicodeslot=0x7E1,
},
- [0x07E2]={
+ [0x7E2]={
arabic="d",
category="lo",
description="NKO LETTER NYA",
direction="r",
linebreak="al",
- unicodeslot=0x07E2,
+ unicodeslot=0x7E2,
},
- [0x07E3]={
+ [0x7E3]={
arabic="d",
category="lo",
description="NKO LETTER NA",
direction="r",
linebreak="al",
- unicodeslot=0x07E3,
+ unicodeslot=0x7E3,
},
- [0x07E4]={
+ [0x7E4]={
arabic="d",
category="lo",
description="NKO LETTER HA",
direction="r",
linebreak="al",
- unicodeslot=0x07E4,
+ unicodeslot=0x7E4,
},
- [0x07E5]={
+ [0x7E5]={
arabic="d",
category="lo",
description="NKO LETTER WA",
direction="r",
linebreak="al",
- unicodeslot=0x07E5,
+ unicodeslot=0x7E5,
},
- [0x07E6]={
+ [0x7E6]={
arabic="d",
category="lo",
description="NKO LETTER YA",
direction="r",
linebreak="al",
- unicodeslot=0x07E6,
+ unicodeslot=0x7E6,
},
- [0x07E7]={
+ [0x7E7]={
arabic="d",
category="lo",
description="NKO LETTER NYA WOLOSO",
direction="r",
linebreak="al",
- unicodeslot=0x07E7,
+ unicodeslot=0x7E7,
},
- [0x07E8]={
+ [0x7E8]={
arabic="d",
category="lo",
description="NKO LETTER JONA JA",
direction="r",
linebreak="al",
- unicodeslot=0x07E8,
+ unicodeslot=0x7E8,
},
- [0x07E9]={
+ [0x7E9]={
arabic="d",
category="lo",
description="NKO LETTER JONA CHA",
direction="r",
linebreak="al",
- unicodeslot=0x07E9,
+ unicodeslot=0x7E9,
},
- [0x07EA]={
+ [0x7EA]={
arabic="d",
category="lo",
description="NKO LETTER JONA RA",
direction="r",
linebreak="al",
- unicodeslot=0x07EA,
+ unicodeslot=0x7EA,
},
- [0x07EB]={
+ [0x7EB]={
category="mn",
+ combining=0xE6,
description="NKO COMBINING SHORT HIGH TONE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x07EB,
+ unicodeslot=0x7EB,
},
- [0x07EC]={
+ [0x7EC]={
category="mn",
+ combining=0xE6,
description="NKO COMBINING SHORT LOW TONE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x07EC,
+ unicodeslot=0x7EC,
},
- [0x07ED]={
+ [0x7ED]={
category="mn",
+ combining=0xE6,
description="NKO COMBINING SHORT RISING TONE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x07ED,
+ unicodeslot=0x7ED,
},
- [0x07EE]={
+ [0x7EE]={
category="mn",
+ combining=0xE6,
description="NKO COMBINING LONG DESCENDING TONE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x07EE,
+ unicodeslot=0x7EE,
},
- [0x07EF]={
+ [0x7EF]={
category="mn",
+ combining=0xE6,
description="NKO COMBINING LONG HIGH TONE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x07EF,
+ unicodeslot=0x7EF,
},
- [0x07F0]={
+ [0x7F0]={
category="mn",
+ combining=0xE6,
description="NKO COMBINING LONG LOW TONE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x07F0,
+ unicodeslot=0x7F0,
},
- [0x07F1]={
+ [0x7F1]={
category="mn",
+ combining=0xE6,
description="NKO COMBINING LONG RISING TONE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x07F1,
+ unicodeslot=0x7F1,
},
- [0x07F2]={
+ [0x7F2]={
category="mn",
+ combining=0xDC,
description="NKO COMBINING NASALIZATION MARK",
direction="nsm",
linebreak="cm",
- unicodeslot=0x07F2,
+ unicodeslot=0x7F2,
},
- [0x07F3]={
+ [0x7F3]={
category="mn",
+ combining=0xE6,
description="NKO COMBINING DOUBLE DOT ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x07F3,
+ unicodeslot=0x7F3,
},
- [0x07F4]={
+ [0x7F4]={
category="lm",
description="NKO HIGH TONE APOSTROPHE",
direction="r",
linebreak="al",
- unicodeslot=0x07F4,
+ unicodeslot=0x7F4,
},
- [0x07F5]={
+ [0x7F5]={
category="lm",
description="NKO LOW TONE APOSTROPHE",
direction="r",
linebreak="al",
- unicodeslot=0x07F5,
+ unicodeslot=0x7F5,
},
- [0x07F6]={
+ [0x7F6]={
category="so",
description="NKO SYMBOL OO DENNEN",
direction="on",
linebreak="al",
- unicodeslot=0x07F6,
+ unicodeslot=0x7F6,
},
- [0x07F7]={
+ [0x7F7]={
category="po",
description="NKO SYMBOL GBAKURUNEN",
direction="on",
linebreak="al",
- unicodeslot=0x07F7,
+ unicodeslot=0x7F7,
},
- [0x07F8]={
+ [0x7F8]={
category="po",
description="NKO COMMA",
direction="on",
linebreak="is",
- unicodeslot=0x07F8,
+ unicodeslot=0x7F8,
},
- [0x07F9]={
+ [0x7F9]={
category="po",
description="NKO EXCLAMATION MARK",
direction="on",
linebreak="ex",
- unicodeslot=0x07F9,
+ unicodeslot=0x7F9,
},
- [0x07FA]={
+ [0x7FA]={
arabic="c",
category="lm",
description="NKO LAJANYALAN",
direction="r",
linebreak="al",
- unicodeslot=0x07FA,
+ unicodeslot=0x7FA,
},
- [0x0800]={
+ [0x800]={
category="lo",
description="SAMARITAN LETTER ALAF",
direction="r",
linebreak="al",
- unicodeslot=0x0800,
+ unicodeslot=0x800,
},
- [0x0801]={
+ [0x801]={
category="lo",
description="SAMARITAN LETTER BIT",
direction="r",
linebreak="al",
- unicodeslot=0x0801,
+ unicodeslot=0x801,
},
- [0x0802]={
+ [0x802]={
category="lo",
description="SAMARITAN LETTER GAMAN",
direction="r",
linebreak="al",
- unicodeslot=0x0802,
+ unicodeslot=0x802,
},
- [0x0803]={
+ [0x803]={
category="lo",
description="SAMARITAN LETTER DALAT",
direction="r",
linebreak="al",
- unicodeslot=0x0803,
+ unicodeslot=0x803,
},
- [0x0804]={
+ [0x804]={
category="lo",
description="SAMARITAN LETTER IY",
direction="r",
linebreak="al",
- unicodeslot=0x0804,
+ unicodeslot=0x804,
},
- [0x0805]={
+ [0x805]={
category="lo",
description="SAMARITAN LETTER BAA",
direction="r",
linebreak="al",
- unicodeslot=0x0805,
+ unicodeslot=0x805,
},
- [0x0806]={
+ [0x806]={
category="lo",
description="SAMARITAN LETTER ZEN",
direction="r",
linebreak="al",
- unicodeslot=0x0806,
+ unicodeslot=0x806,
},
- [0x0807]={
+ [0x807]={
category="lo",
description="SAMARITAN LETTER IT",
direction="r",
linebreak="al",
- unicodeslot=0x0807,
+ unicodeslot=0x807,
},
- [0x0808]={
+ [0x808]={
category="lo",
description="SAMARITAN LETTER TIT",
direction="r",
linebreak="al",
- unicodeslot=0x0808,
+ unicodeslot=0x808,
},
- [0x0809]={
+ [0x809]={
category="lo",
description="SAMARITAN LETTER YUT",
direction="r",
linebreak="al",
- unicodeslot=0x0809,
+ unicodeslot=0x809,
},
- [0x080A]={
+ [0x80A]={
category="lo",
description="SAMARITAN LETTER KAAF",
direction="r",
linebreak="al",
- unicodeslot=0x080A,
+ unicodeslot=0x80A,
},
- [0x080B]={
+ [0x80B]={
category="lo",
description="SAMARITAN LETTER LABAT",
direction="r",
linebreak="al",
- unicodeslot=0x080B,
+ unicodeslot=0x80B,
},
- [0x080C]={
+ [0x80C]={
category="lo",
description="SAMARITAN LETTER MIM",
direction="r",
linebreak="al",
- unicodeslot=0x080C,
+ unicodeslot=0x80C,
},
- [0x080D]={
+ [0x80D]={
category="lo",
description="SAMARITAN LETTER NUN",
direction="r",
linebreak="al",
- unicodeslot=0x080D,
+ unicodeslot=0x80D,
},
- [0x080E]={
+ [0x80E]={
category="lo",
description="SAMARITAN LETTER SINGAAT",
direction="r",
linebreak="al",
- unicodeslot=0x080E,
+ unicodeslot=0x80E,
},
- [0x080F]={
+ [0x80F]={
category="lo",
description="SAMARITAN LETTER IN",
direction="r",
linebreak="al",
- unicodeslot=0x080F,
+ unicodeslot=0x80F,
},
- [0x0810]={
+ [0x810]={
category="lo",
description="SAMARITAN LETTER FI",
direction="r",
linebreak="al",
- unicodeslot=0x0810,
+ unicodeslot=0x810,
},
- [0x0811]={
+ [0x811]={
category="lo",
description="SAMARITAN LETTER TSAADIY",
direction="r",
linebreak="al",
- unicodeslot=0x0811,
+ unicodeslot=0x811,
},
- [0x0812]={
+ [0x812]={
category="lo",
description="SAMARITAN LETTER QUF",
direction="r",
linebreak="al",
- unicodeslot=0x0812,
+ unicodeslot=0x812,
},
- [0x0813]={
+ [0x813]={
category="lo",
description="SAMARITAN LETTER RISH",
direction="r",
linebreak="al",
- unicodeslot=0x0813,
+ unicodeslot=0x813,
},
- [0x0814]={
+ [0x814]={
category="lo",
description="SAMARITAN LETTER SHAN",
direction="r",
linebreak="al",
- unicodeslot=0x0814,
+ unicodeslot=0x814,
},
- [0x0815]={
+ [0x815]={
category="lo",
description="SAMARITAN LETTER TAAF",
direction="r",
linebreak="al",
- unicodeslot=0x0815,
+ unicodeslot=0x815,
},
- [0x0816]={
+ [0x816]={
category="mn",
+ combining=0xE6,
description="SAMARITAN MARK IN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0816,
+ unicodeslot=0x816,
},
- [0x0817]={
+ [0x817]={
category="mn",
+ combining=0xE6,
description="SAMARITAN MARK IN-ALAF",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0817,
+ unicodeslot=0x817,
},
- [0x0818]={
+ [0x818]={
category="mn",
+ combining=0xE6,
description="SAMARITAN MARK OCCLUSION",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0818,
+ unicodeslot=0x818,
},
- [0x0819]={
+ [0x819]={
category="mn",
+ combining=0xE6,
description="SAMARITAN MARK DAGESH",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0819,
+ unicodeslot=0x819,
},
- [0x081A]={
+ [0x81A]={
category="lm",
description="SAMARITAN MODIFIER LETTER EPENTHETIC YUT",
direction="r",
linebreak="al",
- unicodeslot=0x081A,
+ unicodeslot=0x81A,
},
- [0x081B]={
+ [0x81B]={
category="mn",
+ combining=0xE6,
description="SAMARITAN MARK EPENTHETIC YUT",
direction="nsm",
linebreak="cm",
- unicodeslot=0x081B,
+ unicodeslot=0x81B,
},
- [0x081C]={
+ [0x81C]={
category="mn",
+ combining=0xE6,
description="SAMARITAN VOWEL SIGN LONG E",
direction="nsm",
linebreak="cm",
- unicodeslot=0x081C,
+ unicodeslot=0x81C,
},
- [0x081D]={
+ [0x81D]={
category="mn",
+ combining=0xE6,
description="SAMARITAN VOWEL SIGN E",
direction="nsm",
linebreak="cm",
- unicodeslot=0x081D,
+ unicodeslot=0x81D,
},
- [0x081E]={
+ [0x81E]={
category="mn",
+ combining=0xE6,
description="SAMARITAN VOWEL SIGN OVERLONG AA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x081E,
+ unicodeslot=0x81E,
},
- [0x081F]={
+ [0x81F]={
category="mn",
+ combining=0xE6,
description="SAMARITAN VOWEL SIGN LONG AA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x081F,
+ unicodeslot=0x81F,
},
- [0x0820]={
+ [0x820]={
category="mn",
+ combining=0xE6,
description="SAMARITAN VOWEL SIGN AA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0820,
+ unicodeslot=0x820,
},
- [0x0821]={
+ [0x821]={
category="mn",
+ combining=0xE6,
description="SAMARITAN VOWEL SIGN OVERLONG A",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0821,
+ unicodeslot=0x821,
},
- [0x0822]={
+ [0x822]={
category="mn",
+ combining=0xE6,
description="SAMARITAN VOWEL SIGN LONG A",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0822,
+ unicodeslot=0x822,
},
- [0x0823]={
+ [0x823]={
category="mn",
+ combining=0xE6,
description="SAMARITAN VOWEL SIGN A",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0823,
+ unicodeslot=0x823,
},
- [0x0824]={
+ [0x824]={
category="lm",
description="SAMARITAN MODIFIER LETTER SHORT A",
direction="r",
linebreak="al",
- unicodeslot=0x0824,
+ unicodeslot=0x824,
},
- [0x0825]={
+ [0x825]={
category="mn",
+ combining=0xE6,
description="SAMARITAN VOWEL SIGN SHORT A",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0825,
+ unicodeslot=0x825,
},
- [0x0826]={
+ [0x826]={
category="mn",
+ combining=0xE6,
description="SAMARITAN VOWEL SIGN LONG U",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0826,
+ unicodeslot=0x826,
},
- [0x0827]={
+ [0x827]={
category="mn",
+ combining=0xE6,
description="SAMARITAN VOWEL SIGN U",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0827,
+ unicodeslot=0x827,
},
- [0x0828]={
+ [0x828]={
category="lm",
description="SAMARITAN MODIFIER LETTER I",
direction="r",
linebreak="al",
- unicodeslot=0x0828,
+ unicodeslot=0x828,
},
- [0x0829]={
+ [0x829]={
category="mn",
+ combining=0xE6,
description="SAMARITAN VOWEL SIGN LONG I",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0829,
+ unicodeslot=0x829,
},
- [0x082A]={
+ [0x82A]={
category="mn",
+ combining=0xE6,
description="SAMARITAN VOWEL SIGN I",
direction="nsm",
linebreak="cm",
- unicodeslot=0x082A,
+ unicodeslot=0x82A,
},
- [0x082B]={
+ [0x82B]={
category="mn",
+ combining=0xE6,
description="SAMARITAN VOWEL SIGN O",
direction="nsm",
linebreak="cm",
- unicodeslot=0x082B,
+ unicodeslot=0x82B,
},
- [0x082C]={
+ [0x82C]={
category="mn",
+ combining=0xE6,
description="SAMARITAN VOWEL SIGN SUKUN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x082C,
+ unicodeslot=0x82C,
},
- [0x082D]={
+ [0x82D]={
category="mn",
+ combining=0xE6,
description="SAMARITAN MARK NEQUDAA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x082D,
+ unicodeslot=0x82D,
},
- [0x0830]={
+ [0x830]={
category="po",
description="SAMARITAN PUNCTUATION NEQUDAA",
direction="r",
linebreak="al",
- unicodeslot=0x0830,
+ unicodeslot=0x830,
},
- [0x0831]={
+ [0x831]={
category="po",
description="SAMARITAN PUNCTUATION AFSAAQ",
direction="r",
linebreak="al",
- unicodeslot=0x0831,
+ unicodeslot=0x831,
},
- [0x0832]={
+ [0x832]={
category="po",
description="SAMARITAN PUNCTUATION ANGED",
direction="r",
linebreak="al",
- unicodeslot=0x0832,
+ unicodeslot=0x832,
},
- [0x0833]={
+ [0x833]={
category="po",
description="SAMARITAN PUNCTUATION BAU",
direction="r",
linebreak="al",
- unicodeslot=0x0833,
+ unicodeslot=0x833,
},
- [0x0834]={
+ [0x834]={
category="po",
description="SAMARITAN PUNCTUATION ATMAAU",
direction="r",
linebreak="al",
- unicodeslot=0x0834,
+ unicodeslot=0x834,
},
- [0x0835]={
+ [0x835]={
category="po",
description="SAMARITAN PUNCTUATION SHIYYAALAA",
direction="r",
linebreak="al",
- unicodeslot=0x0835,
+ unicodeslot=0x835,
},
- [0x0836]={
+ [0x836]={
category="po",
description="SAMARITAN ABBREVIATION MARK",
direction="r",
linebreak="al",
- unicodeslot=0x0836,
+ unicodeslot=0x836,
},
- [0x0837]={
+ [0x837]={
category="po",
description="SAMARITAN PUNCTUATION MELODIC QITSA",
direction="r",
linebreak="al",
- unicodeslot=0x0837,
+ unicodeslot=0x837,
},
- [0x0838]={
+ [0x838]={
category="po",
description="SAMARITAN PUNCTUATION ZIQAA",
direction="r",
linebreak="al",
- unicodeslot=0x0838,
+ unicodeslot=0x838,
},
- [0x0839]={
+ [0x839]={
category="po",
description="SAMARITAN PUNCTUATION QITSA",
direction="r",
linebreak="al",
- unicodeslot=0x0839,
+ unicodeslot=0x839,
},
- [0x083A]={
+ [0x83A]={
category="po",
description="SAMARITAN PUNCTUATION ZAEF",
direction="r",
linebreak="al",
- unicodeslot=0x083A,
+ unicodeslot=0x83A,
},
- [0x083B]={
+ [0x83B]={
category="po",
description="SAMARITAN PUNCTUATION TURU",
direction="r",
linebreak="al",
- unicodeslot=0x083B,
+ unicodeslot=0x83B,
},
- [0x083C]={
+ [0x83C]={
category="po",
description="SAMARITAN PUNCTUATION ARKAANU",
direction="r",
linebreak="al",
- unicodeslot=0x083C,
+ unicodeslot=0x83C,
},
- [0x083D]={
+ [0x83D]={
category="po",
description="SAMARITAN PUNCTUATION SOF MASHFAAT",
direction="r",
linebreak="al",
- unicodeslot=0x083D,
+ unicodeslot=0x83D,
},
- [0x083E]={
+ [0x83E]={
category="po",
description="SAMARITAN PUNCTUATION ANNAAU",
direction="r",
linebreak="al",
- unicodeslot=0x083E,
+ unicodeslot=0x83E,
},
- [0x0840]={
+ [0x840]={
arabic="r",
category="lo",
description="MANDAIC LETTER HALQA",
direction="r",
linebreak="al",
- unicodeslot=0x0840,
+ unicodeslot=0x840,
},
- [0x0841]={
+ [0x841]={
arabic="d",
category="lo",
description="MANDAIC LETTER AB",
direction="r",
linebreak="al",
- unicodeslot=0x0841,
+ unicodeslot=0x841,
},
- [0x0842]={
+ [0x842]={
arabic="d",
category="lo",
description="MANDAIC LETTER AG",
direction="r",
linebreak="al",
- unicodeslot=0x0842,
+ unicodeslot=0x842,
},
- [0x0843]={
+ [0x843]={
arabic="d",
category="lo",
description="MANDAIC LETTER AD",
direction="r",
linebreak="al",
- unicodeslot=0x0843,
+ unicodeslot=0x843,
},
- [0x0844]={
+ [0x844]={
arabic="d",
category="lo",
description="MANDAIC LETTER AH",
direction="r",
linebreak="al",
- unicodeslot=0x0844,
+ unicodeslot=0x844,
},
- [0x0845]={
+ [0x845]={
arabic="d",
category="lo",
description="MANDAIC LETTER USHENNA",
direction="r",
linebreak="al",
- unicodeslot=0x0845,
+ unicodeslot=0x845,
},
- [0x0846]={
+ [0x846]={
arabic="r",
category="lo",
description="MANDAIC LETTER AZ",
direction="r",
linebreak="al",
- unicodeslot=0x0846,
+ unicodeslot=0x846,
},
- [0x0847]={
+ [0x847]={
arabic="d",
category="lo",
description="MANDAIC LETTER IT",
direction="r",
linebreak="al",
- unicodeslot=0x0847,
+ unicodeslot=0x847,
},
- [0x0848]={
+ [0x848]={
arabic="d",
category="lo",
description="MANDAIC LETTER ATT",
direction="r",
linebreak="al",
- unicodeslot=0x0848,
+ unicodeslot=0x848,
},
- [0x0849]={
+ [0x849]={
arabic="r",
category="lo",
description="MANDAIC LETTER AKSA",
direction="r",
linebreak="al",
- unicodeslot=0x0849,
+ unicodeslot=0x849,
},
- [0x084A]={
+ [0x84A]={
arabic="d",
category="lo",
description="MANDAIC LETTER AK",
direction="r",
linebreak="al",
- unicodeslot=0x084A,
+ unicodeslot=0x84A,
},
- [0x084B]={
+ [0x84B]={
arabic="d",
category="lo",
description="MANDAIC LETTER AL",
direction="r",
linebreak="al",
- unicodeslot=0x084B,
+ unicodeslot=0x84B,
},
- [0x084C]={
+ [0x84C]={
arabic="d",
category="lo",
description="MANDAIC LETTER AM",
direction="r",
linebreak="al",
- unicodeslot=0x084C,
+ unicodeslot=0x84C,
},
- [0x084D]={
+ [0x84D]={
arabic="d",
category="lo",
description="MANDAIC LETTER AN",
direction="r",
linebreak="al",
- unicodeslot=0x084D,
+ unicodeslot=0x84D,
},
- [0x084E]={
+ [0x84E]={
arabic="d",
category="lo",
description="MANDAIC LETTER AS",
direction="r",
linebreak="al",
- unicodeslot=0x084E,
+ unicodeslot=0x84E,
},
- [0x084F]={
+ [0x84F]={
arabic="r",
category="lo",
description="MANDAIC LETTER IN",
direction="r",
linebreak="al",
- unicodeslot=0x084F,
+ unicodeslot=0x84F,
},
- [0x0850]={
+ [0x850]={
arabic="d",
category="lo",
description="MANDAIC LETTER AP",
direction="r",
linebreak="al",
- unicodeslot=0x0850,
+ unicodeslot=0x850,
},
- [0x0851]={
+ [0x851]={
arabic="d",
category="lo",
description="MANDAIC LETTER ASZ",
direction="r",
linebreak="al",
- unicodeslot=0x0851,
+ unicodeslot=0x851,
},
- [0x0852]={
+ [0x852]={
arabic="d",
category="lo",
description="MANDAIC LETTER AQ",
direction="r",
linebreak="al",
- unicodeslot=0x0852,
+ unicodeslot=0x852,
},
- [0x0853]={
+ [0x853]={
arabic="d",
category="lo",
description="MANDAIC LETTER AR",
direction="r",
linebreak="al",
- unicodeslot=0x0853,
+ unicodeslot=0x853,
},
- [0x0854]={
+ [0x854]={
arabic="r",
category="lo",
description="MANDAIC LETTER ASH",
direction="r",
linebreak="al",
- unicodeslot=0x0854,
+ unicodeslot=0x854,
},
- [0x0855]={
+ [0x855]={
arabic="d",
category="lo",
description="MANDAIC LETTER AT",
direction="r",
linebreak="al",
- unicodeslot=0x0855,
+ unicodeslot=0x855,
},
- [0x0856]={
+ [0x856]={
arabic="u",
category="lo",
description="MANDAIC LETTER DUSHENNA",
direction="r",
linebreak="al",
- unicodeslot=0x0856,
+ unicodeslot=0x856,
},
- [0x0857]={
+ [0x857]={
arabic="u",
category="lo",
description="MANDAIC LETTER KAD",
direction="r",
linebreak="al",
- unicodeslot=0x0857,
+ unicodeslot=0x857,
},
- [0x0858]={
+ [0x858]={
arabic="u",
category="lo",
description="MANDAIC LETTER AIN",
direction="r",
linebreak="al",
- unicodeslot=0x0858,
+ unicodeslot=0x858,
},
- [0x0859]={
+ [0x859]={
category="mn",
+ combining=0xDC,
description="MANDAIC AFFRICATION MARK",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0859,
+ unicodeslot=0x859,
},
- [0x085A]={
+ [0x85A]={
category="mn",
+ combining=0xDC,
description="MANDAIC VOCALIZATION MARK",
direction="nsm",
linebreak="cm",
- unicodeslot=0x085A,
+ unicodeslot=0x85A,
},
- [0x085B]={
+ [0x85B]={
category="mn",
+ combining=0xDC,
description="MANDAIC GEMINATION MARK",
direction="nsm",
linebreak="cm",
- unicodeslot=0x085B,
+ unicodeslot=0x85B,
},
- [0x085E]={
+ [0x85E]={
category="po",
description="MANDAIC PUNCTUATION",
direction="r",
linebreak="al",
- unicodeslot=0x085E,
+ unicodeslot=0x85E,
},
- [0x08A0]={
+ [0x8A0]={
arabic="d",
category="lo",
description="ARABIC LETTER BEH WITH SMALL V BELOW",
direction="al",
linebreak="al",
- unicodeslot=0x08A0,
+ unicodeslot=0x8A0,
},
- [0x08A2]={
+ [0x8A1]={
+ arabic="d",
+ category="lo",
+ description="ARABIC LETTER BEH WITH HAMZA ABOVE",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x8A1,
+ },
+ [0x8A2]={
arabic="d",
category="lo",
description="ARABIC LETTER JEEM WITH TWO DOTS ABOVE",
direction="al",
linebreak="al",
- unicodeslot=0x08A2,
+ unicodeslot=0x8A2,
},
- [0x08A3]={
+ [0x8A3]={
arabic="d",
category="lo",
description="ARABIC LETTER TAH WITH TWO DOTS ABOVE",
direction="al",
linebreak="al",
- unicodeslot=0x08A3,
+ unicodeslot=0x8A3,
},
- [0x08A4]={
+ [0x8A4]={
arabic="d",
category="lo",
description="ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE",
direction="al",
linebreak="al",
- unicodeslot=0x08A4,
+ unicodeslot=0x8A4,
},
- [0x08A5]={
+ [0x8A5]={
arabic="d",
category="lo",
description="ARABIC LETTER QAF WITH DOT BELOW",
direction="al",
linebreak="al",
- unicodeslot=0x08A5,
+ unicodeslot=0x8A5,
},
- [0x08A6]={
+ [0x8A6]={
arabic="d",
category="lo",
description="ARABIC LETTER LAM WITH DOUBLE BAR",
direction="al",
linebreak="al",
- unicodeslot=0x08A6,
+ unicodeslot=0x8A6,
},
- [0x08A7]={
+ [0x8A7]={
arabic="d",
category="lo",
description="ARABIC LETTER MEEM WITH THREE DOTS ABOVE",
direction="al",
linebreak="al",
- unicodeslot=0x08A7,
+ unicodeslot=0x8A7,
},
- [0x08A8]={
+ [0x8A8]={
arabic="d",
category="lo",
description="ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE",
direction="al",
linebreak="al",
- unicodeslot=0x08A8,
+ unicodeslot=0x8A8,
},
- [0x08A9]={
+ [0x8A9]={
arabic="d",
category="lo",
description="ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE",
direction="al",
linebreak="al",
- unicodeslot=0x08A9,
+ unicodeslot=0x8A9,
},
- [0x08AA]={
+ [0x8AA]={
arabic="r",
category="lo",
description="ARABIC LETTER REH WITH LOOP",
direction="al",
linebreak="al",
- unicodeslot=0x08AA,
+ unicodeslot=0x8AA,
},
- [0x08AB]={
+ [0x8AB]={
arabic="r",
category="lo",
description="ARABIC LETTER WAW WITH DOT WITHIN",
direction="al",
linebreak="al",
- unicodeslot=0x08AB,
+ unicodeslot=0x8AB,
},
- [0x08AC]={
+ [0x8AC]={
arabic="r",
category="lo",
description="ARABIC LETTER ROHINGYA YEH",
direction="al",
linebreak="al",
- unicodeslot=0x08AC,
+ unicodeslot=0x8AC,
+ },
+ [0x8AD]={
+ arabic="u",
+ category="lo",
+ description="ARABIC LETTER LOW ALEF",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x8AD,
+ },
+ [0x8AE]={
+ arabic="r",
+ category="lo",
+ description="ARABIC LETTER DAL WITH THREE DOTS BELOW",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x8AE,
},
- [0x08E4]={
+ [0x8AF]={
+ arabic="d",
+ category="lo",
+ description="ARABIC LETTER SAD WITH THREE DOTS BELOW",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x8AF,
+ },
+ [0x8B0]={
+ arabic="d",
+ category="lo",
+ description="ARABIC LETTER GAF WITH INVERTED STROKE",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x8B0,
+ },
+ [0x8B1]={
+ arabic="r",
+ category="lo",
+ description="ARABIC LETTER STRAIGHT WAW",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x8B1,
+ },
+ [0x8B2]={
+ arabic="r",
+ category="lo",
+ description="ARABIC LETTER ZAIN WITH INVERTED V ABOVE",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x8B2,
+ },
+ [0x8E4]={
category="mn",
+ combining=0xE6,
description="ARABIC CURLY FATHA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08E4,
+ unicodeslot=0x8E4,
},
- [0x08E5]={
+ [0x8E5]={
category="mn",
+ combining=0xE6,
description="ARABIC CURLY DAMMA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08E5,
+ unicodeslot=0x8E5,
},
- [0x08E6]={
+ [0x8E6]={
category="mn",
+ combining=0xDC,
description="ARABIC CURLY KASRA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08E6,
+ unicodeslot=0x8E6,
},
- [0x08E7]={
+ [0x8E7]={
category="mn",
+ combining=0xE6,
description="ARABIC CURLY FATHATAN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08E7,
+ unicodeslot=0x8E7,
},
- [0x08E8]={
+ [0x8E8]={
category="mn",
+ combining=0xE6,
description="ARABIC CURLY DAMMATAN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08E8,
+ unicodeslot=0x8E8,
},
- [0x08E9]={
+ [0x8E9]={
category="mn",
+ combining=0xDC,
description="ARABIC CURLY KASRATAN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08E9,
+ unicodeslot=0x8E9,
},
- [0x08EA]={
+ [0x8EA]={
category="mn",
+ combining=0xE6,
description="ARABIC TONE ONE DOT ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08EA,
+ unicodeslot=0x8EA,
},
- [0x08EB]={
+ [0x8EB]={
category="mn",
+ combining=0xE6,
description="ARABIC TONE TWO DOTS ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08EB,
+ unicodeslot=0x8EB,
},
- [0x08EC]={
+ [0x8EC]={
category="mn",
+ combining=0xE6,
description="ARABIC TONE LOOP ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08EC,
+ unicodeslot=0x8EC,
},
- [0x08ED]={
+ [0x8ED]={
category="mn",
+ combining=0xDC,
description="ARABIC TONE ONE DOT BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08ED,
+ unicodeslot=0x8ED,
},
- [0x08EE]={
+ [0x8EE]={
category="mn",
+ combining=0xDC,
description="ARABIC TONE TWO DOTS BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08EE,
+ unicodeslot=0x8EE,
},
- [0x08EF]={
+ [0x8EF]={
category="mn",
+ combining=0xDC,
description="ARABIC TONE LOOP BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08EF,
+ unicodeslot=0x8EF,
},
- [0x08F0]={
+ [0x8F0]={
category="mn",
+ combining=0x1B,
description="ARABIC OPEN FATHATAN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08F0,
+ unicodeslot=0x8F0,
},
- [0x08F1]={
+ [0x8F1]={
category="mn",
+ combining=0x1C,
description="ARABIC OPEN DAMMATAN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08F1,
+ unicodeslot=0x8F1,
},
- [0x08F2]={
+ [0x8F2]={
category="mn",
+ combining=0x1D,
description="ARABIC OPEN KASRATAN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08F2,
+ unicodeslot=0x8F2,
},
- [0x08F3]={
+ [0x8F3]={
category="mn",
+ combining=0xE6,
description="ARABIC SMALL HIGH WAW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08F3,
+ unicodeslot=0x8F3,
},
- [0x08F4]={
+ [0x8F4]={
category="mn",
+ combining=0xE6,
description="ARABIC FATHA WITH RING",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08F4,
+ unicodeslot=0x8F4,
},
- [0x08F5]={
+ [0x8F5]={
category="mn",
+ combining=0xE6,
description="ARABIC FATHA WITH DOT ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08F5,
+ unicodeslot=0x8F5,
},
- [0x08F6]={
+ [0x8F6]={
category="mn",
+ combining=0xDC,
description="ARABIC KASRA WITH DOT BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08F6,
+ unicodeslot=0x8F6,
},
- [0x08F7]={
+ [0x8F7]={
category="mn",
+ combining=0xE6,
description="ARABIC LEFT ARROWHEAD ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08F7,
+ unicodeslot=0x8F7,
},
- [0x08F8]={
+ [0x8F8]={
category="mn",
+ combining=0xE6,
description="ARABIC RIGHT ARROWHEAD ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08F8,
+ unicodeslot=0x8F8,
},
- [0x08F9]={
+ [0x8F9]={
category="mn",
+ combining=0xDC,
description="ARABIC LEFT ARROWHEAD BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08F9,
+ unicodeslot=0x8F9,
},
- [0x08FA]={
+ [0x8FA]={
category="mn",
+ combining=0xDC,
description="ARABIC RIGHT ARROWHEAD BELOW",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08FA,
+ unicodeslot=0x8FA,
},
- [0x08FB]={
+ [0x8FB]={
category="mn",
+ combining=0xE6,
description="ARABIC DOUBLE RIGHT ARROWHEAD ABOVE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08FB,
+ unicodeslot=0x8FB,
},
- [0x08FC]={
+ [0x8FC]={
category="mn",
+ combining=0xE6,
description="ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08FC,
+ unicodeslot=0x8FC,
},
- [0x08FD]={
+ [0x8FD]={
category="mn",
+ combining=0xE6,
description="ARABIC RIGHT ARROWHEAD ABOVE WITH DOT",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08FD,
+ unicodeslot=0x8FD,
},
- [0x08FE]={
+ [0x8FE]={
category="mn",
+ combining=0xE6,
description="ARABIC DAMMA WITH DOT",
direction="nsm",
linebreak="cm",
- unicodeslot=0x08FE,
+ unicodeslot=0x8FE,
+ },
+ [0x8FF]={
+ category="mn",
+ combining=0xE6,
+ description="ARABIC MARK SIDEWAYS NOON GHUNNA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x8FF,
},
- [0x0900]={
+ [0x900]={
category="mn",
description="DEVANAGARI SIGN INVERTED CANDRABINDU",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0900,
+ unicodeslot=0x900,
},
- [0x0901]={
+ [0x901]={
adobename="candrabindudeva",
category="mn",
description="DEVANAGARI SIGN CANDRABINDU",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0901,
+ unicodeslot=0x901,
},
- [0x0902]={
+ [0x902]={
adobename="anusvaradeva",
category="mn",
description="DEVANAGARI SIGN ANUSVARA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0902,
+ unicodeslot=0x902,
},
- [0x0903]={
+ [0x903]={
adobename="visargadeva",
category="mc",
description="DEVANAGARI SIGN VISARGA",
direction="l",
linebreak="cm",
- unicodeslot=0x0903,
+ unicodeslot=0x903,
},
- [0x0904]={
+ [0x904]={
category="lo",
description="DEVANAGARI LETTER SHORT A",
direction="l",
linebreak="al",
- unicodeslot=0x0904,
+ unicodeslot=0x904,
},
- [0x0905]={
+ [0x905]={
adobename="adeva",
category="lo",
description="DEVANAGARI LETTER A",
direction="l",
linebreak="al",
- unicodeslot=0x0905,
+ unicodeslot=0x905,
},
- [0x0906]={
+ [0x906]={
adobename="aadeva",
category="lo",
description="DEVANAGARI LETTER AA",
direction="l",
linebreak="al",
- unicodeslot=0x0906,
+ unicodeslot=0x906,
},
- [0x0907]={
+ [0x907]={
adobename="ideva",
category="lo",
description="DEVANAGARI LETTER I",
direction="l",
linebreak="al",
- unicodeslot=0x0907,
+ unicodeslot=0x907,
},
- [0x0908]={
+ [0x908]={
adobename="iideva",
category="lo",
description="DEVANAGARI LETTER II",
direction="l",
linebreak="al",
- unicodeslot=0x0908,
+ unicodeslot=0x908,
},
- [0x0909]={
+ [0x909]={
adobename="udeva",
category="lo",
description="DEVANAGARI LETTER U",
direction="l",
linebreak="al",
- unicodeslot=0x0909,
+ unicodeslot=0x909,
},
- [0x090A]={
+ [0x90A]={
adobename="uudeva",
category="lo",
description="DEVANAGARI LETTER UU",
direction="l",
linebreak="al",
- unicodeslot=0x090A,
+ unicodeslot=0x90A,
},
- [0x090B]={
+ [0x90B]={
adobename="rvocalicdeva",
category="lo",
description="DEVANAGARI LETTER VOCALIC R",
direction="l",
linebreak="al",
- unicodeslot=0x090B,
+ unicodeslot=0x90B,
},
- [0x090C]={
+ [0x90C]={
adobename="lvocalicdeva",
category="lo",
description="DEVANAGARI LETTER VOCALIC L",
direction="l",
linebreak="al",
- unicodeslot=0x090C,
+ unicodeslot=0x90C,
},
- [0x090D]={
+ [0x90D]={
adobename="ecandradeva",
category="lo",
description="DEVANAGARI LETTER CANDRA E",
direction="l",
linebreak="al",
- unicodeslot=0x090D,
+ unicodeslot=0x90D,
},
- [0x090E]={
+ [0x90E]={
adobename="eshortdeva",
category="lo",
description="DEVANAGARI LETTER SHORT E",
direction="l",
linebreak="al",
- unicodeslot=0x090E,
+ unicodeslot=0x90E,
},
- [0x090F]={
+ [0x90F]={
adobename="edeva",
category="lo",
description="DEVANAGARI LETTER E",
direction="l",
linebreak="al",
- unicodeslot=0x090F,
+ unicodeslot=0x90F,
},
- [0x0910]={
+ [0x910]={
adobename="aideva",
category="lo",
description="DEVANAGARI LETTER AI",
direction="l",
linebreak="al",
- unicodeslot=0x0910,
+ unicodeslot=0x910,
},
- [0x0911]={
+ [0x911]={
adobename="ocandradeva",
category="lo",
description="DEVANAGARI LETTER CANDRA O",
direction="l",
linebreak="al",
- unicodeslot=0x0911,
+ unicodeslot=0x911,
},
- [0x0912]={
+ [0x912]={
adobename="oshortdeva",
category="lo",
description="DEVANAGARI LETTER SHORT O",
direction="l",
linebreak="al",
- unicodeslot=0x0912,
+ unicodeslot=0x912,
},
- [0x0913]={
+ [0x913]={
adobename="odeva",
category="lo",
description="DEVANAGARI LETTER O",
direction="l",
linebreak="al",
- unicodeslot=0x0913,
+ unicodeslot=0x913,
},
- [0x0914]={
+ [0x914]={
adobename="audeva",
category="lo",
description="DEVANAGARI LETTER AU",
direction="l",
linebreak="al",
- unicodeslot=0x0914,
+ unicodeslot=0x914,
},
- [0x0915]={
+ [0x915]={
adobename="kadeva",
category="lo",
description="DEVANAGARI LETTER KA",
direction="l",
linebreak="al",
- unicodeslot=0x0915,
+ unicodeslot=0x915,
},
- [0x0916]={
+ [0x916]={
adobename="khadeva",
category="lo",
description="DEVANAGARI LETTER KHA",
direction="l",
linebreak="al",
- unicodeslot=0x0916,
+ unicodeslot=0x916,
},
- [0x0917]={
+ [0x917]={
adobename="gadeva",
category="lo",
description="DEVANAGARI LETTER GA",
direction="l",
linebreak="al",
- unicodeslot=0x0917,
+ unicodeslot=0x917,
},
- [0x0918]={
+ [0x918]={
adobename="ghadeva",
category="lo",
description="DEVANAGARI LETTER GHA",
direction="l",
linebreak="al",
- unicodeslot=0x0918,
+ unicodeslot=0x918,
},
- [0x0919]={
+ [0x919]={
adobename="ngadeva",
category="lo",
description="DEVANAGARI LETTER NGA",
direction="l",
linebreak="al",
- unicodeslot=0x0919,
+ unicodeslot=0x919,
},
- [0x091A]={
+ [0x91A]={
adobename="cadeva",
category="lo",
description="DEVANAGARI LETTER CA",
direction="l",
linebreak="al",
- unicodeslot=0x091A,
+ unicodeslot=0x91A,
},
- [0x091B]={
+ [0x91B]={
adobename="chadeva",
category="lo",
description="DEVANAGARI LETTER CHA",
direction="l",
linebreak="al",
- unicodeslot=0x091B,
+ unicodeslot=0x91B,
},
- [0x091C]={
+ [0x91C]={
adobename="jadeva",
category="lo",
description="DEVANAGARI LETTER JA",
direction="l",
linebreak="al",
- unicodeslot=0x091C,
+ unicodeslot=0x91C,
},
- [0x091D]={
+ [0x91D]={
adobename="jhadeva",
category="lo",
description="DEVANAGARI LETTER JHA",
direction="l",
linebreak="al",
- unicodeslot=0x091D,
+ unicodeslot=0x91D,
},
- [0x091E]={
+ [0x91E]={
adobename="nyadeva",
category="lo",
description="DEVANAGARI LETTER NYA",
direction="l",
linebreak="al",
- unicodeslot=0x091E,
+ unicodeslot=0x91E,
},
- [0x091F]={
+ [0x91F]={
adobename="ttadeva",
category="lo",
description="DEVANAGARI LETTER TTA",
direction="l",
linebreak="al",
- unicodeslot=0x091F,
+ unicodeslot=0x91F,
},
- [0x0920]={
+ [0x920]={
adobename="tthadeva",
category="lo",
description="DEVANAGARI LETTER TTHA",
direction="l",
linebreak="al",
- unicodeslot=0x0920,
+ unicodeslot=0x920,
},
- [0x0921]={
+ [0x921]={
adobename="ddadeva",
category="lo",
description="DEVANAGARI LETTER DDA",
direction="l",
linebreak="al",
- unicodeslot=0x0921,
+ unicodeslot=0x921,
},
- [0x0922]={
+ [0x922]={
adobename="ddhadeva",
category="lo",
description="DEVANAGARI LETTER DDHA",
direction="l",
linebreak="al",
- unicodeslot=0x0922,
+ unicodeslot=0x922,
},
- [0x0923]={
+ [0x923]={
adobename="nnadeva",
category="lo",
description="DEVANAGARI LETTER NNA",
direction="l",
linebreak="al",
- unicodeslot=0x0923,
+ unicodeslot=0x923,
},
- [0x0924]={
+ [0x924]={
adobename="tadeva",
category="lo",
description="DEVANAGARI LETTER TA",
direction="l",
linebreak="al",
- unicodeslot=0x0924,
+ unicodeslot=0x924,
},
- [0x0925]={
+ [0x925]={
adobename="thadeva",
category="lo",
description="DEVANAGARI LETTER THA",
direction="l",
linebreak="al",
- unicodeslot=0x0925,
+ unicodeslot=0x925,
},
- [0x0926]={
+ [0x926]={
adobename="dadeva",
category="lo",
description="DEVANAGARI LETTER DA",
direction="l",
linebreak="al",
- unicodeslot=0x0926,
+ unicodeslot=0x926,
},
- [0x0927]={
+ [0x927]={
adobename="dhadeva",
category="lo",
description="DEVANAGARI LETTER DHA",
direction="l",
linebreak="al",
- unicodeslot=0x0927,
+ unicodeslot=0x927,
},
- [0x0928]={
+ [0x928]={
adobename="nadeva",
category="lo",
description="DEVANAGARI LETTER NA",
direction="l",
linebreak="al",
- unicodeslot=0x0928,
+ unicodeslot=0x928,
},
- [0x0929]={
+ [0x929]={
adobename="nnnadeva",
category="lo",
description="DEVANAGARI LETTER NNNA",
direction="l",
linebreak="al",
- specials={ "char", 0x0928, 0x093C },
- unicodeslot=0x0929,
+ specials={ "char", 0x928, 0x93C },
+ unicodeslot=0x929,
},
- [0x092A]={
+ [0x92A]={
adobename="padeva",
category="lo",
description="DEVANAGARI LETTER PA",
direction="l",
linebreak="al",
- unicodeslot=0x092A,
+ unicodeslot=0x92A,
},
- [0x092B]={
+ [0x92B]={
adobename="phadeva",
category="lo",
description="DEVANAGARI LETTER PHA",
direction="l",
linebreak="al",
- unicodeslot=0x092B,
+ unicodeslot=0x92B,
},
- [0x092C]={
+ [0x92C]={
adobename="badeva",
category="lo",
description="DEVANAGARI LETTER BA",
direction="l",
linebreak="al",
- unicodeslot=0x092C,
+ unicodeslot=0x92C,
},
- [0x092D]={
+ [0x92D]={
adobename="bhadeva",
category="lo",
description="DEVANAGARI LETTER BHA",
direction="l",
linebreak="al",
- unicodeslot=0x092D,
+ unicodeslot=0x92D,
},
- [0x092E]={
+ [0x92E]={
adobename="madeva",
category="lo",
description="DEVANAGARI LETTER MA",
direction="l",
linebreak="al",
- unicodeslot=0x092E,
+ unicodeslot=0x92E,
},
- [0x092F]={
+ [0x92F]={
adobename="yadeva",
category="lo",
description="DEVANAGARI LETTER YA",
direction="l",
linebreak="al",
- unicodeslot=0x092F,
+ unicodeslot=0x92F,
},
- [0x0930]={
+ [0x930]={
adobename="radeva",
category="lo",
description="DEVANAGARI LETTER RA",
direction="l",
linebreak="al",
- unicodeslot=0x0930,
+ unicodeslot=0x930,
},
- [0x0931]={
+ [0x931]={
adobename="rradeva",
category="lo",
description="DEVANAGARI LETTER RRA",
direction="l",
linebreak="al",
- specials={ "char", 0x0930, 0x093C },
- unicodeslot=0x0931,
+ specials={ "char", 0x930, 0x93C },
+ unicodeslot=0x931,
},
- [0x0932]={
+ [0x932]={
adobename="ladeva",
category="lo",
description="DEVANAGARI LETTER LA",
direction="l",
linebreak="al",
- unicodeslot=0x0932,
+ unicodeslot=0x932,
},
- [0x0933]={
+ [0x933]={
adobename="lladeva",
category="lo",
description="DEVANAGARI LETTER LLA",
direction="l",
linebreak="al",
- unicodeslot=0x0933,
+ unicodeslot=0x933,
},
- [0x0934]={
+ [0x934]={
adobename="llladeva",
category="lo",
description="DEVANAGARI LETTER LLLA",
direction="l",
linebreak="al",
- specials={ "char", 0x0933, 0x093C },
- unicodeslot=0x0934,
+ specials={ "char", 0x933, 0x93C },
+ unicodeslot=0x934,
},
- [0x0935]={
+ [0x935]={
adobename="vadeva",
category="lo",
description="DEVANAGARI LETTER VA",
direction="l",
linebreak="al",
- unicodeslot=0x0935,
+ unicodeslot=0x935,
},
- [0x0936]={
+ [0x936]={
adobename="shadeva",
category="lo",
description="DEVANAGARI LETTER SHA",
direction="l",
linebreak="al",
- unicodeslot=0x0936,
+ unicodeslot=0x936,
},
- [0x0937]={
+ [0x937]={
adobename="ssadeva",
category="lo",
description="DEVANAGARI LETTER SSA",
direction="l",
linebreak="al",
- unicodeslot=0x0937,
+ unicodeslot=0x937,
},
- [0x0938]={
+ [0x938]={
adobename="sadeva",
category="lo",
description="DEVANAGARI LETTER SA",
direction="l",
linebreak="al",
- unicodeslot=0x0938,
+ unicodeslot=0x938,
},
- [0x0939]={
+ [0x939]={
adobename="hadeva",
category="lo",
description="DEVANAGARI LETTER HA",
direction="l",
linebreak="al",
- unicodeslot=0x0939,
+ unicodeslot=0x939,
},
- [0x093A]={
+ [0x93A]={
category="mn",
description="DEVANAGARI VOWEL SIGN OE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x093A,
+ unicodeslot=0x93A,
},
- [0x093B]={
+ [0x93B]={
category="mc",
description="DEVANAGARI VOWEL SIGN OOE",
direction="l",
linebreak="cm",
- unicodeslot=0x093B,
+ unicodeslot=0x93B,
},
- [0x093C]={
+ [0x93C]={
adobename="nuktadeva",
category="mn",
+ combining=0x7,
description="DEVANAGARI SIGN NUKTA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x093C,
+ unicodeslot=0x93C,
},
- [0x093D]={
+ [0x93D]={
adobename="avagrahadeva",
category="lo",
description="DEVANAGARI SIGN AVAGRAHA",
direction="l",
linebreak="al",
- unicodeslot=0x093D,
+ unicodeslot=0x93D,
},
- [0x093E]={
+ [0x93E]={
adobename="aavowelsigndeva",
category="mc",
description="DEVANAGARI VOWEL SIGN AA",
direction="l",
linebreak="cm",
- unicodeslot=0x093E,
+ unicodeslot=0x93E,
},
- [0x093F]={
+ [0x93F]={
adobename="ivowelsigndeva",
category="mc",
description="DEVANAGARI VOWEL SIGN I",
direction="l",
linebreak="cm",
- unicodeslot=0x093F,
+ unicodeslot=0x93F,
},
- [0x0940]={
+ [0x940]={
adobename="iivowelsigndeva",
category="mc",
description="DEVANAGARI VOWEL SIGN II",
direction="l",
linebreak="cm",
- unicodeslot=0x0940,
+ unicodeslot=0x940,
},
- [0x0941]={
+ [0x941]={
adobename="uvowelsigndeva",
category="mn",
description="DEVANAGARI VOWEL SIGN U",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0941,
+ unicodeslot=0x941,
},
- [0x0942]={
+ [0x942]={
adobename="uuvowelsigndeva",
category="mn",
description="DEVANAGARI VOWEL SIGN UU",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0942,
+ unicodeslot=0x942,
},
- [0x0943]={
+ [0x943]={
adobename="rvocalicvowelsigndeva",
category="mn",
description="DEVANAGARI VOWEL SIGN VOCALIC R",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0943,
+ unicodeslot=0x943,
},
- [0x0944]={
+ [0x944]={
adobename="rrvocalicvowelsigndeva",
category="mn",
description="DEVANAGARI VOWEL SIGN VOCALIC RR",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0944,
+ unicodeslot=0x944,
},
- [0x0945]={
+ [0x945]={
adobename="ecandravowelsigndeva",
category="mn",
description="DEVANAGARI VOWEL SIGN CANDRA E",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0945,
+ unicodeslot=0x945,
},
- [0x0946]={
+ [0x946]={
adobename="eshortvowelsigndeva",
category="mn",
description="DEVANAGARI VOWEL SIGN SHORT E",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0946,
+ unicodeslot=0x946,
},
- [0x0947]={
+ [0x947]={
adobename="evowelsigndeva",
category="mn",
description="DEVANAGARI VOWEL SIGN E",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0947,
+ unicodeslot=0x947,
},
- [0x0948]={
+ [0x948]={
adobename="aivowelsigndeva",
category="mn",
description="DEVANAGARI VOWEL SIGN AI",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0948,
+ unicodeslot=0x948,
},
- [0x0949]={
+ [0x949]={
adobename="ocandravowelsigndeva",
category="mc",
description="DEVANAGARI VOWEL SIGN CANDRA O",
direction="l",
linebreak="cm",
- unicodeslot=0x0949,
+ unicodeslot=0x949,
},
- [0x094A]={
+ [0x94A]={
adobename="oshortvowelsigndeva",
category="mc",
description="DEVANAGARI VOWEL SIGN SHORT O",
direction="l",
linebreak="cm",
- unicodeslot=0x094A,
+ unicodeslot=0x94A,
},
- [0x094B]={
+ [0x94B]={
adobename="ovowelsigndeva",
category="mc",
description="DEVANAGARI VOWEL SIGN O",
direction="l",
linebreak="cm",
- unicodeslot=0x094B,
+ unicodeslot=0x94B,
},
- [0x094C]={
+ [0x94C]={
adobename="auvowelsigndeva",
category="mc",
description="DEVANAGARI VOWEL SIGN AU",
direction="l",
linebreak="cm",
- unicodeslot=0x094C,
+ unicodeslot=0x94C,
},
- [0x094D]={
+ [0x94D]={
adobename="viramadeva",
category="mn",
+ combining=0x9,
description="DEVANAGARI SIGN VIRAMA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x094D,
+ unicodeslot=0x94D,
},
- [0x094E]={
+ [0x94E]={
category="mc",
description="DEVANAGARI VOWEL SIGN PRISHTHAMATRA E",
direction="l",
linebreak="cm",
- unicodeslot=0x094E,
+ unicodeslot=0x94E,
},
- [0x094F]={
+ [0x94F]={
category="mc",
description="DEVANAGARI VOWEL SIGN AW",
direction="l",
linebreak="cm",
- unicodeslot=0x094F,
+ unicodeslot=0x94F,
},
- [0x0950]={
+ [0x950]={
adobename="omdeva",
category="lo",
description="DEVANAGARI OM",
direction="l",
linebreak="al",
- unicodeslot=0x0950,
+ unicodeslot=0x950,
},
- [0x0951]={
+ [0x951]={
adobename="udattadeva",
category="mn",
+ combining=0xE6,
description="DEVANAGARI STRESS SIGN UDATTA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0951,
+ unicodeslot=0x951,
},
- [0x0952]={
+ [0x952]={
adobename="anudattadeva",
category="mn",
+ combining=0xDC,
description="DEVANAGARI STRESS SIGN ANUDATTA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0952,
+ unicodeslot=0x952,
},
- [0x0953]={
+ [0x953]={
adobename="gravedeva",
category="mn",
+ combining=0xE6,
description="DEVANAGARI GRAVE ACCENT",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0953,
+ unicodeslot=0x953,
},
- [0x0954]={
+ [0x954]={
adobename="acutedeva",
category="mn",
+ combining=0xE6,
description="DEVANAGARI ACUTE ACCENT",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0954,
+ unicodeslot=0x954,
},
- [0x0955]={
+ [0x955]={
category="mn",
description="DEVANAGARI VOWEL SIGN CANDRA LONG E",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0955,
+ unicodeslot=0x955,
},
- [0x0956]={
+ [0x956]={
category="mn",
description="DEVANAGARI VOWEL SIGN UE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0956,
+ unicodeslot=0x956,
},
- [0x0957]={
+ [0x957]={
category="mn",
description="DEVANAGARI VOWEL SIGN UUE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0957,
+ unicodeslot=0x957,
},
- [0x0958]={
+ [0x958]={
adobename="qadeva",
category="lo",
description="DEVANAGARI LETTER QA",
direction="l",
linebreak="al",
- specials={ "char", 0x0915, 0x093C },
- unicodeslot=0x0958,
+ specials={ "char", 0x915, 0x93C },
+ unicodeslot=0x958,
},
- [0x0959]={
+ [0x959]={
adobename="khhadeva",
category="lo",
description="DEVANAGARI LETTER KHHA",
direction="l",
linebreak="al",
- specials={ "char", 0x0916, 0x093C },
- unicodeslot=0x0959,
+ specials={ "char", 0x916, 0x93C },
+ unicodeslot=0x959,
},
- [0x095A]={
+ [0x95A]={
adobename="ghhadeva",
category="lo",
description="DEVANAGARI LETTER GHHA",
direction="l",
linebreak="al",
- specials={ "char", 0x0917, 0x093C },
- unicodeslot=0x095A,
+ specials={ "char", 0x917, 0x93C },
+ unicodeslot=0x95A,
},
- [0x095B]={
+ [0x95B]={
adobename="zadeva",
category="lo",
description="DEVANAGARI LETTER ZA",
direction="l",
linebreak="al",
- specials={ "char", 0x091C, 0x093C },
- unicodeslot=0x095B,
+ specials={ "char", 0x91C, 0x93C },
+ unicodeslot=0x95B,
},
- [0x095C]={
+ [0x95C]={
adobename="dddhadeva",
category="lo",
description="DEVANAGARI LETTER DDDHA",
direction="l",
linebreak="al",
- specials={ "char", 0x0921, 0x093C },
- unicodeslot=0x095C,
+ specials={ "char", 0x921, 0x93C },
+ unicodeslot=0x95C,
},
- [0x095D]={
+ [0x95D]={
adobename="rhadeva",
category="lo",
description="DEVANAGARI LETTER RHA",
direction="l",
linebreak="al",
- specials={ "char", 0x0922, 0x093C },
- unicodeslot=0x095D,
+ specials={ "char", 0x922, 0x93C },
+ unicodeslot=0x95D,
},
- [0x095E]={
+ [0x95E]={
adobename="fadeva",
category="lo",
description="DEVANAGARI LETTER FA",
direction="l",
linebreak="al",
- specials={ "char", 0x092B, 0x093C },
- unicodeslot=0x095E,
+ specials={ "char", 0x92B, 0x93C },
+ unicodeslot=0x95E,
},
- [0x095F]={
+ [0x95F]={
adobename="yyadeva",
category="lo",
description="DEVANAGARI LETTER YYA",
direction="l",
linebreak="al",
- specials={ "char", 0x092F, 0x093C },
- unicodeslot=0x095F,
+ specials={ "char", 0x92F, 0x93C },
+ unicodeslot=0x95F,
},
- [0x0960]={
+ [0x960]={
adobename="rrvocalicdeva",
category="lo",
description="DEVANAGARI LETTER VOCALIC RR",
direction="l",
linebreak="al",
- unicodeslot=0x0960,
+ unicodeslot=0x960,
},
- [0x0961]={
+ [0x961]={
adobename="llvocalicdeva",
category="lo",
description="DEVANAGARI LETTER VOCALIC LL",
direction="l",
linebreak="al",
- unicodeslot=0x0961,
+ unicodeslot=0x961,
},
- [0x0962]={
+ [0x962]={
adobename="lvocalicvowelsigndeva",
category="mn",
description="DEVANAGARI VOWEL SIGN VOCALIC L",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0962,
+ unicodeslot=0x962,
},
- [0x0963]={
+ [0x963]={
adobename="llvocalicvowelsigndeva",
category="mn",
description="DEVANAGARI VOWEL SIGN VOCALIC LL",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0963,
+ unicodeslot=0x963,
},
- [0x0964]={
+ [0x964]={
adobename="danda",
category="po",
description="DEVANAGARI DANDA",
direction="l",
linebreak="ba",
- unicodeslot=0x0964,
+ unicodeslot=0x964,
},
- [0x0965]={
+ [0x965]={
adobename="dbldanda",
category="po",
description="DEVANAGARI DOUBLE DANDA",
direction="l",
linebreak="ba",
- unicodeslot=0x0965,
+ unicodeslot=0x965,
},
- [0x0966]={
+ [0x966]={
adobename="zerodeva",
category="nd",
description="DEVANAGARI DIGIT ZERO",
direction="l",
linebreak="nu",
- unicodeslot=0x0966,
+ unicodeslot=0x966,
},
- [0x0967]={
+ [0x967]={
adobename="onedeva",
category="nd",
description="DEVANAGARI DIGIT ONE",
direction="l",
linebreak="nu",
- unicodeslot=0x0967,
+ unicodeslot=0x967,
},
- [0x0968]={
+ [0x968]={
adobename="twodeva",
category="nd",
description="DEVANAGARI DIGIT TWO",
direction="l",
linebreak="nu",
- unicodeslot=0x0968,
+ unicodeslot=0x968,
},
- [0x0969]={
+ [0x969]={
adobename="threedeva",
category="nd",
description="DEVANAGARI DIGIT THREE",
direction="l",
linebreak="nu",
- unicodeslot=0x0969,
+ unicodeslot=0x969,
},
- [0x096A]={
+ [0x96A]={
adobename="fourdeva",
category="nd",
description="DEVANAGARI DIGIT FOUR",
direction="l",
linebreak="nu",
- unicodeslot=0x096A,
+ unicodeslot=0x96A,
},
- [0x096B]={
+ [0x96B]={
adobename="fivedeva",
category="nd",
description="DEVANAGARI DIGIT FIVE",
direction="l",
linebreak="nu",
- unicodeslot=0x096B,
+ unicodeslot=0x96B,
},
- [0x096C]={
+ [0x96C]={
adobename="sixdeva",
category="nd",
description="DEVANAGARI DIGIT SIX",
direction="l",
linebreak="nu",
- unicodeslot=0x096C,
+ unicodeslot=0x96C,
},
- [0x096D]={
+ [0x96D]={
adobename="sevendeva",
category="nd",
description="DEVANAGARI DIGIT SEVEN",
direction="l",
linebreak="nu",
- unicodeslot=0x096D,
+ unicodeslot=0x96D,
},
- [0x096E]={
+ [0x96E]={
adobename="eightdeva",
category="nd",
description="DEVANAGARI DIGIT EIGHT",
direction="l",
linebreak="nu",
- unicodeslot=0x096E,
+ unicodeslot=0x96E,
},
- [0x096F]={
+ [0x96F]={
adobename="ninedeva",
category="nd",
description="DEVANAGARI DIGIT NINE",
direction="l",
linebreak="nu",
- unicodeslot=0x096F,
+ unicodeslot=0x96F,
},
- [0x0970]={
+ [0x970]={
adobename="abbreviationsigndeva",
category="po",
description="DEVANAGARI ABBREVIATION SIGN",
direction="l",
linebreak="al",
- unicodeslot=0x0970,
+ unicodeslot=0x970,
},
- [0x0971]={
+ [0x971]={
category="lm",
description="DEVANAGARI SIGN HIGH SPACING DOT",
direction="l",
linebreak="al",
- unicodeslot=0x0971,
+ unicodeslot=0x971,
},
- [0x0972]={
+ [0x972]={
category="lo",
description="DEVANAGARI LETTER CANDRA A",
direction="l",
linebreak="al",
- unicodeslot=0x0972,
+ unicodeslot=0x972,
},
- [0x0973]={
+ [0x973]={
category="lo",
description="DEVANAGARI LETTER OE",
direction="l",
linebreak="al",
- unicodeslot=0x0973,
+ unicodeslot=0x973,
},
- [0x0974]={
+ [0x974]={
category="lo",
description="DEVANAGARI LETTER OOE",
direction="l",
linebreak="al",
- unicodeslot=0x0974,
+ unicodeslot=0x974,
},
- [0x0975]={
+ [0x975]={
category="lo",
description="DEVANAGARI LETTER AW",
direction="l",
linebreak="al",
- unicodeslot=0x0975,
+ unicodeslot=0x975,
},
- [0x0976]={
+ [0x976]={
category="lo",
description="DEVANAGARI LETTER UE",
direction="l",
linebreak="al",
- unicodeslot=0x0976,
+ unicodeslot=0x976,
},
- [0x0977]={
+ [0x977]={
category="lo",
description="DEVANAGARI LETTER UUE",
direction="l",
linebreak="al",
- unicodeslot=0x0977,
+ unicodeslot=0x977,
+ },
+ [0x978]={
+ category="lo",
+ description="DEVANAGARI LETTER MARWARI DDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x978,
},
- [0x0979]={
+ [0x979]={
category="lo",
description="DEVANAGARI LETTER ZHA",
direction="l",
linebreak="al",
- unicodeslot=0x0979,
+ unicodeslot=0x979,
},
- [0x097A]={
+ [0x97A]={
category="lo",
description="DEVANAGARI LETTER HEAVY YA",
direction="l",
linebreak="al",
- unicodeslot=0x097A,
+ unicodeslot=0x97A,
},
- [0x097B]={
+ [0x97B]={
category="lo",
description="DEVANAGARI LETTER GGA",
direction="l",
linebreak="al",
- unicodeslot=0x097B,
+ unicodeslot=0x97B,
},
- [0x097C]={
+ [0x97C]={
category="lo",
description="DEVANAGARI LETTER JJA",
direction="l",
linebreak="al",
- unicodeslot=0x097C,
+ unicodeslot=0x97C,
},
- [0x097D]={
+ [0x97D]={
category="lo",
description="DEVANAGARI LETTER GLOTTAL STOP",
direction="l",
linebreak="al",
- unicodeslot=0x097D,
+ unicodeslot=0x97D,
},
- [0x097E]={
+ [0x97E]={
category="lo",
description="DEVANAGARI LETTER DDDA",
direction="l",
linebreak="al",
- unicodeslot=0x097E,
+ unicodeslot=0x97E,
},
- [0x097F]={
+ [0x97F]={
category="lo",
description="DEVANAGARI LETTER BBA",
direction="l",
linebreak="al",
- unicodeslot=0x097F,
+ unicodeslot=0x97F,
},
- [0x0981]={
+ [0x980]={
+ category="lo",
+ description="BENGALI ANJI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x980,
+ },
+ [0x981]={
adobename="candrabindubengali",
category="mn",
description="BENGALI SIGN CANDRABINDU",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0981,
+ unicodeslot=0x981,
},
- [0x0982]={
+ [0x982]={
adobename="anusvarabengali",
category="mc",
description="BENGALI SIGN ANUSVARA",
direction="l",
linebreak="cm",
- unicodeslot=0x0982,
+ unicodeslot=0x982,
},
- [0x0983]={
+ [0x983]={
adobename="visargabengali",
category="mc",
description="BENGALI SIGN VISARGA",
direction="l",
linebreak="cm",
- unicodeslot=0x0983,
+ unicodeslot=0x983,
},
- [0x0985]={
+ [0x985]={
adobename="abengali",
category="lo",
description="BENGALI LETTER A",
direction="l",
linebreak="al",
- unicodeslot=0x0985,
+ unicodeslot=0x985,
},
- [0x0986]={
+ [0x986]={
adobename="aabengali",
category="lo",
description="BENGALI LETTER AA",
direction="l",
linebreak="al",
- unicodeslot=0x0986,
+ unicodeslot=0x986,
},
- [0x0987]={
+ [0x987]={
adobename="ibengali",
category="lo",
description="BENGALI LETTER I",
direction="l",
linebreak="al",
- unicodeslot=0x0987,
+ unicodeslot=0x987,
},
- [0x0988]={
+ [0x988]={
adobename="iibengali",
category="lo",
description="BENGALI LETTER II",
direction="l",
linebreak="al",
- unicodeslot=0x0988,
+ unicodeslot=0x988,
},
- [0x0989]={
+ [0x989]={
adobename="ubengali",
category="lo",
description="BENGALI LETTER U",
direction="l",
linebreak="al",
- unicodeslot=0x0989,
+ unicodeslot=0x989,
},
- [0x098A]={
+ [0x98A]={
adobename="uubengali",
category="lo",
description="BENGALI LETTER UU",
direction="l",
linebreak="al",
- unicodeslot=0x098A,
+ unicodeslot=0x98A,
},
- [0x098B]={
+ [0x98B]={
adobename="rvocalicbengali",
category="lo",
description="BENGALI LETTER VOCALIC R",
direction="l",
linebreak="al",
- unicodeslot=0x098B,
+ unicodeslot=0x98B,
},
- [0x098C]={
+ [0x98C]={
adobename="lvocalicbengali",
category="lo",
description="BENGALI LETTER VOCALIC L",
direction="l",
linebreak="al",
- unicodeslot=0x098C,
+ unicodeslot=0x98C,
},
- [0x098F]={
+ [0x98F]={
adobename="ebengali",
category="lo",
description="BENGALI LETTER E",
direction="l",
linebreak="al",
- unicodeslot=0x098F,
+ unicodeslot=0x98F,
},
- [0x0990]={
+ [0x990]={
adobename="aibengali",
category="lo",
description="BENGALI LETTER AI",
direction="l",
linebreak="al",
- unicodeslot=0x0990,
+ unicodeslot=0x990,
},
- [0x0993]={
+ [0x993]={
adobename="obengali",
category="lo",
description="BENGALI LETTER O",
direction="l",
linebreak="al",
- unicodeslot=0x0993,
+ unicodeslot=0x993,
},
- [0x0994]={
+ [0x994]={
adobename="aubengali",
category="lo",
description="BENGALI LETTER AU",
direction="l",
linebreak="al",
- unicodeslot=0x0994,
+ unicodeslot=0x994,
},
- [0x0995]={
+ [0x995]={
adobename="kabengali",
category="lo",
description="BENGALI LETTER KA",
direction="l",
linebreak="al",
- unicodeslot=0x0995,
+ unicodeslot=0x995,
},
- [0x0996]={
+ [0x996]={
adobename="khabengali",
category="lo",
description="BENGALI LETTER KHA",
direction="l",
linebreak="al",
- unicodeslot=0x0996,
+ unicodeslot=0x996,
},
- [0x0997]={
+ [0x997]={
adobename="gabengali",
category="lo",
description="BENGALI LETTER GA",
direction="l",
linebreak="al",
- unicodeslot=0x0997,
+ unicodeslot=0x997,
},
- [0x0998]={
+ [0x998]={
adobename="ghabengali",
category="lo",
description="BENGALI LETTER GHA",
direction="l",
linebreak="al",
- unicodeslot=0x0998,
+ unicodeslot=0x998,
},
- [0x0999]={
+ [0x999]={
adobename="ngabengali",
category="lo",
description="BENGALI LETTER NGA",
direction="l",
linebreak="al",
- unicodeslot=0x0999,
+ unicodeslot=0x999,
},
- [0x099A]={
+ [0x99A]={
adobename="cabengali",
category="lo",
description="BENGALI LETTER CA",
direction="l",
linebreak="al",
- unicodeslot=0x099A,
+ unicodeslot=0x99A,
},
- [0x099B]={
+ [0x99B]={
adobename="chabengali",
category="lo",
description="BENGALI LETTER CHA",
direction="l",
linebreak="al",
- unicodeslot=0x099B,
+ unicodeslot=0x99B,
},
- [0x099C]={
+ [0x99C]={
adobename="jabengali",
category="lo",
description="BENGALI LETTER JA",
direction="l",
linebreak="al",
- unicodeslot=0x099C,
+ unicodeslot=0x99C,
},
- [0x099D]={
+ [0x99D]={
adobename="jhabengali",
category="lo",
description="BENGALI LETTER JHA",
direction="l",
linebreak="al",
- unicodeslot=0x099D,
+ unicodeslot=0x99D,
},
- [0x099E]={
+ [0x99E]={
adobename="nyabengali",
category="lo",
description="BENGALI LETTER NYA",
direction="l",
linebreak="al",
- unicodeslot=0x099E,
+ unicodeslot=0x99E,
},
- [0x099F]={
+ [0x99F]={
adobename="ttabengali",
category="lo",
description="BENGALI LETTER TTA",
direction="l",
linebreak="al",
- unicodeslot=0x099F,
+ unicodeslot=0x99F,
},
- [0x09A0]={
+ [0x9A0]={
adobename="tthabengali",
category="lo",
description="BENGALI LETTER TTHA",
direction="l",
linebreak="al",
- unicodeslot=0x09A0,
+ unicodeslot=0x9A0,
},
- [0x09A1]={
+ [0x9A1]={
adobename="ddabengali",
category="lo",
description="BENGALI LETTER DDA",
direction="l",
linebreak="al",
- unicodeslot=0x09A1,
+ unicodeslot=0x9A1,
},
- [0x09A2]={
+ [0x9A2]={
adobename="ddhabengali",
category="lo",
description="BENGALI LETTER DDHA",
direction="l",
linebreak="al",
- unicodeslot=0x09A2,
+ unicodeslot=0x9A2,
},
- [0x09A3]={
+ [0x9A3]={
adobename="nnabengali",
category="lo",
description="BENGALI LETTER NNA",
direction="l",
linebreak="al",
- unicodeslot=0x09A3,
+ unicodeslot=0x9A3,
},
- [0x09A4]={
+ [0x9A4]={
adobename="tabengali",
category="lo",
description="BENGALI LETTER TA",
direction="l",
linebreak="al",
- unicodeslot=0x09A4,
+ unicodeslot=0x9A4,
},
- [0x09A5]={
+ [0x9A5]={
adobename="thabengali",
category="lo",
description="BENGALI LETTER THA",
direction="l",
linebreak="al",
- unicodeslot=0x09A5,
+ unicodeslot=0x9A5,
},
- [0x09A6]={
+ [0x9A6]={
adobename="dabengali",
category="lo",
description="BENGALI LETTER DA",
direction="l",
linebreak="al",
- unicodeslot=0x09A6,
+ unicodeslot=0x9A6,
},
- [0x09A7]={
+ [0x9A7]={
adobename="dhabengali",
category="lo",
description="BENGALI LETTER DHA",
direction="l",
linebreak="al",
- unicodeslot=0x09A7,
+ unicodeslot=0x9A7,
},
- [0x09A8]={
+ [0x9A8]={
adobename="nabengali",
category="lo",
description="BENGALI LETTER NA",
direction="l",
linebreak="al",
- unicodeslot=0x09A8,
+ unicodeslot=0x9A8,
},
- [0x09AA]={
+ [0x9AA]={
adobename="pabengali",
category="lo",
description="BENGALI LETTER PA",
direction="l",
linebreak="al",
- unicodeslot=0x09AA,
+ unicodeslot=0x9AA,
},
- [0x09AB]={
+ [0x9AB]={
adobename="phabengali",
category="lo",
description="BENGALI LETTER PHA",
direction="l",
linebreak="al",
- unicodeslot=0x09AB,
+ unicodeslot=0x9AB,
},
- [0x09AC]={
+ [0x9AC]={
adobename="babengali",
category="lo",
description="BENGALI LETTER BA",
direction="l",
linebreak="al",
- unicodeslot=0x09AC,
+ unicodeslot=0x9AC,
},
- [0x09AD]={
+ [0x9AD]={
adobename="bhabengali",
category="lo",
description="BENGALI LETTER BHA",
direction="l",
linebreak="al",
- unicodeslot=0x09AD,
+ unicodeslot=0x9AD,
},
- [0x09AE]={
+ [0x9AE]={
adobename="mabengali",
category="lo",
description="BENGALI LETTER MA",
direction="l",
linebreak="al",
- unicodeslot=0x09AE,
+ unicodeslot=0x9AE,
},
- [0x09AF]={
+ [0x9AF]={
adobename="yabengali",
category="lo",
description="BENGALI LETTER YA",
direction="l",
linebreak="al",
- unicodeslot=0x09AF,
+ unicodeslot=0x9AF,
},
- [0x09B0]={
+ [0x9B0]={
adobename="rabengali",
category="lo",
description="BENGALI LETTER RA",
direction="l",
linebreak="al",
- unicodeslot=0x09B0,
+ unicodeslot=0x9B0,
},
- [0x09B2]={
+ [0x9B2]={
adobename="labengali",
category="lo",
description="BENGALI LETTER LA",
direction="l",
linebreak="al",
- unicodeslot=0x09B2,
+ unicodeslot=0x9B2,
},
- [0x09B6]={
+ [0x9B6]={
adobename="shabengali",
category="lo",
description="BENGALI LETTER SHA",
direction="l",
linebreak="al",
- unicodeslot=0x09B6,
+ unicodeslot=0x9B6,
},
- [0x09B7]={
+ [0x9B7]={
adobename="ssabengali",
category="lo",
description="BENGALI LETTER SSA",
direction="l",
linebreak="al",
- unicodeslot=0x09B7,
+ unicodeslot=0x9B7,
},
- [0x09B8]={
+ [0x9B8]={
adobename="sabengali",
category="lo",
description="BENGALI LETTER SA",
direction="l",
linebreak="al",
- unicodeslot=0x09B8,
+ unicodeslot=0x9B8,
},
- [0x09B9]={
+ [0x9B9]={
adobename="habengali",
category="lo",
description="BENGALI LETTER HA",
direction="l",
linebreak="al",
- unicodeslot=0x09B9,
+ unicodeslot=0x9B9,
},
- [0x09BC]={
+ [0x9BC]={
adobename="nuktabengali",
category="mn",
+ combining=0x7,
description="BENGALI SIGN NUKTA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x09BC,
+ unicodeslot=0x9BC,
},
- [0x09BD]={
+ [0x9BD]={
category="lo",
description="BENGALI SIGN AVAGRAHA",
direction="l",
linebreak="al",
- unicodeslot=0x09BD,
+ unicodeslot=0x9BD,
},
- [0x09BE]={
+ [0x9BE]={
adobename="aavowelsignbengali",
category="mc",
description="BENGALI VOWEL SIGN AA",
direction="l",
linebreak="cm",
- unicodeslot=0x09BE,
+ unicodeslot=0x9BE,
},
- [0x09BF]={
+ [0x9BF]={
adobename="ivowelsignbengali",
category="mc",
description="BENGALI VOWEL SIGN I",
direction="l",
linebreak="cm",
- unicodeslot=0x09BF,
+ unicodeslot=0x9BF,
},
- [0x09C0]={
+ [0x9C0]={
adobename="iivowelsignbengali",
category="mc",
description="BENGALI VOWEL SIGN II",
direction="l",
linebreak="cm",
- unicodeslot=0x09C0,
+ unicodeslot=0x9C0,
},
- [0x09C1]={
+ [0x9C1]={
adobename="uvowelsignbengali",
category="mn",
description="BENGALI VOWEL SIGN U",
direction="nsm",
linebreak="cm",
- unicodeslot=0x09C1,
+ unicodeslot=0x9C1,
},
- [0x09C2]={
+ [0x9C2]={
adobename="uuvowelsignbengali",
category="mn",
description="BENGALI VOWEL SIGN UU",
direction="nsm",
linebreak="cm",
- unicodeslot=0x09C2,
+ unicodeslot=0x9C2,
},
- [0x09C3]={
+ [0x9C3]={
adobename="rvocalicvowelsignbengali",
category="mn",
description="BENGALI VOWEL SIGN VOCALIC R",
direction="nsm",
linebreak="cm",
- unicodeslot=0x09C3,
+ unicodeslot=0x9C3,
},
- [0x09C4]={
+ [0x9C4]={
adobename="rrvocalicvowelsignbengali",
category="mn",
description="BENGALI VOWEL SIGN VOCALIC RR",
direction="nsm",
linebreak="cm",
- unicodeslot=0x09C4,
+ unicodeslot=0x9C4,
},
- [0x09C7]={
+ [0x9C7]={
adobename="evowelsignbengali",
category="mc",
description="BENGALI VOWEL SIGN E",
direction="l",
linebreak="cm",
- unicodeslot=0x09C7,
+ unicodeslot=0x9C7,
},
- [0x09C8]={
+ [0x9C8]={
adobename="aivowelsignbengali",
category="mc",
description="BENGALI VOWEL SIGN AI",
direction="l",
linebreak="cm",
- unicodeslot=0x09C8,
+ unicodeslot=0x9C8,
},
- [0x09CB]={
+ [0x9CB]={
adobename="ovowelsignbengali",
category="mc",
description="BENGALI VOWEL SIGN O",
direction="l",
linebreak="cm",
- specials={ "char", 0x09C7, 0x09BE },
- unicodeslot=0x09CB,
+ specials={ "char", 0x9C7, 0x9BE },
+ unicodeslot=0x9CB,
},
- [0x09CC]={
+ [0x9CC]={
adobename="auvowelsignbengali",
category="mc",
description="BENGALI VOWEL SIGN AU",
direction="l",
linebreak="cm",
- specials={ "char", 0x09C7, 0x09D7 },
- unicodeslot=0x09CC,
+ specials={ "char", 0x9C7, 0x9D7 },
+ unicodeslot=0x9CC,
},
- [0x09CD]={
+ [0x9CD]={
adobename="viramabengali",
category="mn",
+ combining=0x9,
description="BENGALI SIGN VIRAMA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x09CD,
+ unicodeslot=0x9CD,
},
- [0x09CE]={
+ [0x9CE]={
category="lo",
description="BENGALI LETTER KHANDA TA",
direction="l",
linebreak="al",
- unicodeslot=0x09CE,
+ unicodeslot=0x9CE,
},
- [0x09D7]={
+ [0x9D7]={
adobename="aulengthmarkbengali",
category="mc",
description="BENGALI AU LENGTH MARK",
direction="l",
linebreak="cm",
- unicodeslot=0x09D7,
+ unicodeslot=0x9D7,
},
- [0x09DC]={
+ [0x9DC]={
adobename="rrabengali",
category="lo",
description="BENGALI LETTER RRA",
direction="l",
linebreak="al",
- specials={ "char", 0x09A1, 0x09BC },
- unicodeslot=0x09DC,
+ specials={ "char", 0x9A1, 0x9BC },
+ unicodeslot=0x9DC,
},
- [0x09DD]={
+ [0x9DD]={
adobename="rhabengali",
category="lo",
description="BENGALI LETTER RHA",
direction="l",
linebreak="al",
- specials={ "char", 0x09A2, 0x09BC },
- unicodeslot=0x09DD,
+ specials={ "char", 0x9A2, 0x9BC },
+ unicodeslot=0x9DD,
},
- [0x09DF]={
+ [0x9DF]={
adobename="yyabengali",
category="lo",
description="BENGALI LETTER YYA",
direction="l",
linebreak="al",
- specials={ "char", 0x09AF, 0x09BC },
- unicodeslot=0x09DF,
+ specials={ "char", 0x9AF, 0x9BC },
+ unicodeslot=0x9DF,
},
- [0x09E0]={
+ [0x9E0]={
adobename="rrvocalicbengali",
category="lo",
description="BENGALI LETTER VOCALIC RR",
direction="l",
linebreak="al",
- unicodeslot=0x09E0,
+ unicodeslot=0x9E0,
},
- [0x09E1]={
+ [0x9E1]={
adobename="llvocalicbengali",
category="lo",
description="BENGALI LETTER VOCALIC LL",
direction="l",
linebreak="al",
- unicodeslot=0x09E1,
+ unicodeslot=0x9E1,
},
- [0x09E2]={
+ [0x9E2]={
adobename="lvocalicvowelsignbengali",
category="mn",
description="BENGALI VOWEL SIGN VOCALIC L",
direction="nsm",
linebreak="cm",
- unicodeslot=0x09E2,
+ unicodeslot=0x9E2,
},
- [0x09E3]={
+ [0x9E3]={
adobename="llvocalicvowelsignbengali",
category="mn",
description="BENGALI VOWEL SIGN VOCALIC LL",
direction="nsm",
linebreak="cm",
- unicodeslot=0x09E3,
+ unicodeslot=0x9E3,
},
- [0x09E6]={
+ [0x9E6]={
adobename="zerobengali",
category="nd",
description="BENGALI DIGIT ZERO",
direction="l",
linebreak="nu",
- unicodeslot=0x09E6,
+ unicodeslot=0x9E6,
},
- [0x09E7]={
+ [0x9E7]={
adobename="onebengali",
category="nd",
description="BENGALI DIGIT ONE",
direction="l",
linebreak="nu",
- unicodeslot=0x09E7,
+ unicodeslot=0x9E7,
},
- [0x09E8]={
+ [0x9E8]={
adobename="twobengali",
category="nd",
description="BENGALI DIGIT TWO",
direction="l",
linebreak="nu",
- unicodeslot=0x09E8,
+ unicodeslot=0x9E8,
},
- [0x09E9]={
+ [0x9E9]={
adobename="threebengali",
category="nd",
description="BENGALI DIGIT THREE",
direction="l",
linebreak="nu",
- unicodeslot=0x09E9,
+ unicodeslot=0x9E9,
},
- [0x09EA]={
+ [0x9EA]={
adobename="fourbengali",
category="nd",
description="BENGALI DIGIT FOUR",
direction="l",
linebreak="nu",
- unicodeslot=0x09EA,
+ unicodeslot=0x9EA,
},
- [0x09EB]={
+ [0x9EB]={
adobename="fivebengali",
category="nd",
description="BENGALI DIGIT FIVE",
direction="l",
linebreak="nu",
- unicodeslot=0x09EB,
+ unicodeslot=0x9EB,
},
- [0x09EC]={
+ [0x9EC]={
adobename="sixbengali",
category="nd",
description="BENGALI DIGIT SIX",
direction="l",
linebreak="nu",
- unicodeslot=0x09EC,
+ unicodeslot=0x9EC,
},
- [0x09ED]={
+ [0x9ED]={
adobename="sevenbengali",
category="nd",
description="BENGALI DIGIT SEVEN",
direction="l",
linebreak="nu",
- unicodeslot=0x09ED,
+ unicodeslot=0x9ED,
},
- [0x09EE]={
+ [0x9EE]={
adobename="eightbengali",
category="nd",
description="BENGALI DIGIT EIGHT",
direction="l",
linebreak="nu",
- unicodeslot=0x09EE,
+ unicodeslot=0x9EE,
},
- [0x09EF]={
+ [0x9EF]={
adobename="ninebengali",
category="nd",
description="BENGALI DIGIT NINE",
direction="l",
linebreak="nu",
- unicodeslot=0x09EF,
+ unicodeslot=0x9EF,
},
- [0x09F0]={
+ [0x9F0]={
adobename="ramiddlediagonalbengali",
category="lo",
description="BENGALI LETTER RA WITH MIDDLE DIAGONAL",
direction="l",
linebreak="al",
- shcode=0x09B0,
- unicodeslot=0x09F0,
+ shcode=0x9B0,
+ unicodeslot=0x9F0,
},
- [0x09F1]={
+ [0x9F1]={
adobename="ralowerdiagonalbengali",
category="lo",
description="BENGALI LETTER RA WITH LOWER DIAGONAL",
direction="l",
linebreak="al",
- shcode=0x09B0,
- unicodeslot=0x09F1,
+ shcode=0x9B0,
+ unicodeslot=0x9F1,
},
- [0x09F2]={
+ [0x9F2]={
adobename="rupeemarkbengali",
category="sc",
description="BENGALI RUPEE MARK",
direction="et",
linebreak="po",
- unicodeslot=0x09F2,
+ unicodeslot=0x9F2,
},
- [0x09F3]={
+ [0x9F3]={
adobename="rupeesignbengali",
category="sc",
description="BENGALI RUPEE SIGN",
direction="et",
linebreak="po",
- unicodeslot=0x09F3,
+ unicodeslot=0x9F3,
},
- [0x09F4]={
+ [0x9F4]={
adobename="onenumeratorbengali",
category="no",
description="BENGALI CURRENCY NUMERATOR ONE",
direction="l",
linebreak="al",
- unicodeslot=0x09F4,
+ unicodeslot=0x9F4,
},
- [0x09F5]={
+ [0x9F5]={
adobename="twonumeratorbengali",
category="no",
description="BENGALI CURRENCY NUMERATOR TWO",
direction="l",
linebreak="al",
- unicodeslot=0x09F5,
+ unicodeslot=0x9F5,
},
- [0x09F6]={
+ [0x9F6]={
adobename="threenumeratorbengali",
category="no",
description="BENGALI CURRENCY NUMERATOR THREE",
direction="l",
linebreak="al",
- unicodeslot=0x09F6,
+ unicodeslot=0x9F6,
},
- [0x09F7]={
+ [0x9F7]={
adobename="fournumeratorbengali",
category="no",
description="BENGALI CURRENCY NUMERATOR FOUR",
direction="l",
linebreak="al",
- unicodeslot=0x09F7,
+ unicodeslot=0x9F7,
},
- [0x09F8]={
+ [0x9F8]={
adobename="denominatorminusonenumeratorbengali",
category="no",
description="BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR",
direction="l",
linebreak="al",
- unicodeslot=0x09F8,
+ unicodeslot=0x9F8,
},
- [0x09F9]={
+ [0x9F9]={
adobename="sixteencurrencydenominatorbengali",
category="no",
description="BENGALI CURRENCY DENOMINATOR SIXTEEN",
direction="l",
linebreak="po",
- unicodeslot=0x09F9,
+ unicodeslot=0x9F9,
},
- [0x09FA]={
+ [0x9FA]={
adobename="issharbengali",
category="so",
description="BENGALI ISSHAR",
direction="l",
linebreak="al",
- unicodeslot=0x09FA,
+ unicodeslot=0x9FA,
},
- [0x09FB]={
+ [0x9FB]={
category="sc",
description="BENGALI GANDA MARK",
direction="et",
linebreak="pr",
- unicodeslot=0x09FB,
+ unicodeslot=0x9FB,
},
- [0x0A01]={
+ [0xA01]={
category="mn",
description="GURMUKHI SIGN ADAK BINDI",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0A01,
+ unicodeslot=0xA01,
},
- [0x0A02]={
+ [0xA02]={
adobename="bindigurmukhi",
category="mn",
description="GURMUKHI SIGN BINDI",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0A02,
+ unicodeslot=0xA02,
},
- [0x0A03]={
+ [0xA03]={
category="mc",
description="GURMUKHI SIGN VISARGA",
direction="l",
linebreak="cm",
- unicodeslot=0x0A03,
+ unicodeslot=0xA03,
},
- [0x0A05]={
+ [0xA05]={
adobename="agurmukhi",
category="lo",
description="GURMUKHI LETTER A",
direction="l",
linebreak="al",
- unicodeslot=0x0A05,
+ unicodeslot=0xA05,
},
- [0x0A06]={
+ [0xA06]={
adobename="aagurmukhi",
category="lo",
description="GURMUKHI LETTER AA",
direction="l",
linebreak="al",
- unicodeslot=0x0A06,
+ unicodeslot=0xA06,
},
- [0x0A07]={
+ [0xA07]={
adobename="igurmukhi",
category="lo",
description="GURMUKHI LETTER I",
direction="l",
linebreak="al",
- unicodeslot=0x0A07,
+ unicodeslot=0xA07,
},
- [0x0A08]={
+ [0xA08]={
adobename="iigurmukhi",
category="lo",
description="GURMUKHI LETTER II",
direction="l",
linebreak="al",
- unicodeslot=0x0A08,
+ unicodeslot=0xA08,
},
- [0x0A09]={
+ [0xA09]={
adobename="ugurmukhi",
category="lo",
description="GURMUKHI LETTER U",
direction="l",
linebreak="al",
- unicodeslot=0x0A09,
+ unicodeslot=0xA09,
},
- [0x0A0A]={
+ [0xA0A]={
adobename="uugurmukhi",
category="lo",
description="GURMUKHI LETTER UU",
direction="l",
linebreak="al",
- unicodeslot=0x0A0A,
+ unicodeslot=0xA0A,
},
- [0x0A0F]={
+ [0xA0F]={
adobename="eegurmukhi",
category="lo",
description="GURMUKHI LETTER EE",
direction="l",
linebreak="al",
- unicodeslot=0x0A0F,
+ unicodeslot=0xA0F,
},
- [0x0A10]={
+ [0xA10]={
adobename="aigurmukhi",
category="lo",
description="GURMUKHI LETTER AI",
direction="l",
linebreak="al",
- unicodeslot=0x0A10,
+ unicodeslot=0xA10,
},
- [0x0A13]={
+ [0xA13]={
adobename="oogurmukhi",
category="lo",
description="GURMUKHI LETTER OO",
direction="l",
linebreak="al",
- unicodeslot=0x0A13,
+ unicodeslot=0xA13,
},
- [0x0A14]={
+ [0xA14]={
adobename="augurmukhi",
category="lo",
description="GURMUKHI LETTER AU",
direction="l",
linebreak="al",
- unicodeslot=0x0A14,
+ unicodeslot=0xA14,
},
- [0x0A15]={
+ [0xA15]={
adobename="kagurmukhi",
category="lo",
description="GURMUKHI LETTER KA",
direction="l",
linebreak="al",
- unicodeslot=0x0A15,
+ unicodeslot=0xA15,
},
- [0x0A16]={
+ [0xA16]={
adobename="khagurmukhi",
category="lo",
description="GURMUKHI LETTER KHA",
direction="l",
linebreak="al",
- unicodeslot=0x0A16,
+ unicodeslot=0xA16,
},
- [0x0A17]={
+ [0xA17]={
adobename="gagurmukhi",
category="lo",
description="GURMUKHI LETTER GA",
direction="l",
linebreak="al",
- unicodeslot=0x0A17,
+ unicodeslot=0xA17,
},
- [0x0A18]={
+ [0xA18]={
adobename="ghagurmukhi",
category="lo",
description="GURMUKHI LETTER GHA",
direction="l",
linebreak="al",
- unicodeslot=0x0A18,
+ unicodeslot=0xA18,
},
- [0x0A19]={
+ [0xA19]={
adobename="ngagurmukhi",
category="lo",
description="GURMUKHI LETTER NGA",
direction="l",
linebreak="al",
- unicodeslot=0x0A19,
+ unicodeslot=0xA19,
},
- [0x0A1A]={
+ [0xA1A]={
adobename="cagurmukhi",
category="lo",
description="GURMUKHI LETTER CA",
direction="l",
linebreak="al",
- unicodeslot=0x0A1A,
+ unicodeslot=0xA1A,
},
- [0x0A1B]={
+ [0xA1B]={
adobename="chagurmukhi",
category="lo",
description="GURMUKHI LETTER CHA",
direction="l",
linebreak="al",
- unicodeslot=0x0A1B,
+ unicodeslot=0xA1B,
},
- [0x0A1C]={
+ [0xA1C]={
adobename="jagurmukhi",
category="lo",
description="GURMUKHI LETTER JA",
direction="l",
linebreak="al",
- unicodeslot=0x0A1C,
+ unicodeslot=0xA1C,
},
- [0x0A1D]={
+ [0xA1D]={
adobename="jhagurmukhi",
category="lo",
description="GURMUKHI LETTER JHA",
direction="l",
linebreak="al",
- unicodeslot=0x0A1D,
+ unicodeslot=0xA1D,
},
- [0x0A1E]={
+ [0xA1E]={
adobename="nyagurmukhi",
category="lo",
description="GURMUKHI LETTER NYA",
direction="l",
linebreak="al",
- unicodeslot=0x0A1E,
+ unicodeslot=0xA1E,
},
- [0x0A1F]={
+ [0xA1F]={
adobename="ttagurmukhi",
category="lo",
description="GURMUKHI LETTER TTA",
direction="l",
linebreak="al",
- unicodeslot=0x0A1F,
+ unicodeslot=0xA1F,
},
- [0x0A20]={
+ [0xA20]={
adobename="tthagurmukhi",
category="lo",
description="GURMUKHI LETTER TTHA",
direction="l",
linebreak="al",
- unicodeslot=0x0A20,
+ unicodeslot=0xA20,
},
- [0x0A21]={
+ [0xA21]={
adobename="ddagurmukhi",
category="lo",
description="GURMUKHI LETTER DDA",
direction="l",
linebreak="al",
- unicodeslot=0x0A21,
+ unicodeslot=0xA21,
},
- [0x0A22]={
+ [0xA22]={
adobename="ddhagurmukhi",
category="lo",
description="GURMUKHI LETTER DDHA",
direction="l",
linebreak="al",
- unicodeslot=0x0A22,
+ unicodeslot=0xA22,
},
- [0x0A23]={
+ [0xA23]={
adobename="nnagurmukhi",
category="lo",
description="GURMUKHI LETTER NNA",
direction="l",
linebreak="al",
- unicodeslot=0x0A23,
+ unicodeslot=0xA23,
},
- [0x0A24]={
+ [0xA24]={
adobename="tagurmukhi",
category="lo",
description="GURMUKHI LETTER TA",
direction="l",
linebreak="al",
- unicodeslot=0x0A24,
+ unicodeslot=0xA24,
},
- [0x0A25]={
+ [0xA25]={
adobename="thagurmukhi",
category="lo",
description="GURMUKHI LETTER THA",
direction="l",
linebreak="al",
- unicodeslot=0x0A25,
+ unicodeslot=0xA25,
},
- [0x0A26]={
+ [0xA26]={
adobename="dagurmukhi",
category="lo",
description="GURMUKHI LETTER DA",
direction="l",
linebreak="al",
- unicodeslot=0x0A26,
+ unicodeslot=0xA26,
},
- [0x0A27]={
+ [0xA27]={
adobename="dhagurmukhi",
category="lo",
description="GURMUKHI LETTER DHA",
direction="l",
linebreak="al",
- unicodeslot=0x0A27,
+ unicodeslot=0xA27,
},
- [0x0A28]={
+ [0xA28]={
adobename="nagurmukhi",
category="lo",
description="GURMUKHI LETTER NA",
direction="l",
linebreak="al",
- unicodeslot=0x0A28,
+ unicodeslot=0xA28,
},
- [0x0A2A]={
+ [0xA2A]={
adobename="pagurmukhi",
category="lo",
description="GURMUKHI LETTER PA",
direction="l",
linebreak="al",
- unicodeslot=0x0A2A,
+ unicodeslot=0xA2A,
},
- [0x0A2B]={
+ [0xA2B]={
adobename="phagurmukhi",
category="lo",
description="GURMUKHI LETTER PHA",
direction="l",
linebreak="al",
- unicodeslot=0x0A2B,
+ unicodeslot=0xA2B,
},
- [0x0A2C]={
+ [0xA2C]={
adobename="bagurmukhi",
category="lo",
description="GURMUKHI LETTER BA",
direction="l",
linebreak="al",
- unicodeslot=0x0A2C,
+ unicodeslot=0xA2C,
},
- [0x0A2D]={
+ [0xA2D]={
adobename="bhagurmukhi",
category="lo",
description="GURMUKHI LETTER BHA",
direction="l",
linebreak="al",
- unicodeslot=0x0A2D,
+ unicodeslot=0xA2D,
},
- [0x0A2E]={
+ [0xA2E]={
adobename="magurmukhi",
category="lo",
description="GURMUKHI LETTER MA",
direction="l",
linebreak="al",
- unicodeslot=0x0A2E,
+ unicodeslot=0xA2E,
},
- [0x0A2F]={
+ [0xA2F]={
adobename="yagurmukhi",
category="lo",
description="GURMUKHI LETTER YA",
direction="l",
linebreak="al",
- unicodeslot=0x0A2F,
+ unicodeslot=0xA2F,
},
- [0x0A30]={
+ [0xA30]={
adobename="ragurmukhi",
category="lo",
description="GURMUKHI LETTER RA",
direction="l",
linebreak="al",
- unicodeslot=0x0A30,
+ unicodeslot=0xA30,
},
- [0x0A32]={
+ [0xA32]={
adobename="lagurmukhi",
category="lo",
description="GURMUKHI LETTER LA",
direction="l",
linebreak="al",
- unicodeslot=0x0A32,
+ unicodeslot=0xA32,
},
- [0x0A33]={
+ [0xA33]={
category="lo",
description="GURMUKHI LETTER LLA",
direction="l",
linebreak="al",
- specials={ "char", 0x0A32, 0x0A3C },
- unicodeslot=0x0A33,
+ specials={ "char", 0xA32, 0xA3C },
+ unicodeslot=0xA33,
},
- [0x0A35]={
+ [0xA35]={
adobename="vagurmukhi",
category="lo",
description="GURMUKHI LETTER VA",
direction="l",
linebreak="al",
- unicodeslot=0x0A35,
+ unicodeslot=0xA35,
},
- [0x0A36]={
+ [0xA36]={
adobename="shagurmukhi",
category="lo",
description="GURMUKHI LETTER SHA",
direction="l",
linebreak="al",
- specials={ "char", 0x0A38, 0x0A3C },
- unicodeslot=0x0A36,
+ specials={ "char", 0xA38, 0xA3C },
+ unicodeslot=0xA36,
},
- [0x0A38]={
+ [0xA38]={
adobename="sagurmukhi",
category="lo",
description="GURMUKHI LETTER SA",
direction="l",
linebreak="al",
- unicodeslot=0x0A38,
+ unicodeslot=0xA38,
},
- [0x0A39]={
+ [0xA39]={
adobename="hagurmukhi",
category="lo",
description="GURMUKHI LETTER HA",
direction="l",
linebreak="al",
- unicodeslot=0x0A39,
+ unicodeslot=0xA39,
},
- [0x0A3C]={
+ [0xA3C]={
adobename="nuktagurmukhi",
category="mn",
+ combining=0x7,
description="GURMUKHI SIGN NUKTA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0A3C,
+ unicodeslot=0xA3C,
},
- [0x0A3E]={
+ [0xA3E]={
adobename="aamatragurmukhi",
category="mc",
description="GURMUKHI VOWEL SIGN AA",
direction="l",
linebreak="cm",
- unicodeslot=0x0A3E,
+ unicodeslot=0xA3E,
},
- [0x0A3F]={
+ [0xA3F]={
adobename="imatragurmukhi",
category="mc",
description="GURMUKHI VOWEL SIGN I",
direction="l",
linebreak="cm",
- unicodeslot=0x0A3F,
+ unicodeslot=0xA3F,
},
- [0x0A40]={
+ [0xA40]={
adobename="iimatragurmukhi",
category="mc",
description="GURMUKHI VOWEL SIGN II",
direction="l",
linebreak="cm",
- unicodeslot=0x0A40,
+ unicodeslot=0xA40,
},
- [0x0A41]={
+ [0xA41]={
adobename="umatragurmukhi",
category="mn",
description="GURMUKHI VOWEL SIGN U",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0A41,
+ unicodeslot=0xA41,
},
- [0x0A42]={
+ [0xA42]={
adobename="uumatragurmukhi",
category="mn",
description="GURMUKHI VOWEL SIGN UU",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0A42,
+ unicodeslot=0xA42,
},
- [0x0A47]={
+ [0xA47]={
adobename="eematragurmukhi",
category="mn",
description="GURMUKHI VOWEL SIGN EE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0A47,
+ unicodeslot=0xA47,
},
- [0x0A48]={
+ [0xA48]={
adobename="aimatragurmukhi",
category="mn",
description="GURMUKHI VOWEL SIGN AI",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0A48,
+ unicodeslot=0xA48,
},
- [0x0A4B]={
+ [0xA4B]={
adobename="oomatragurmukhi",
category="mn",
description="GURMUKHI VOWEL SIGN OO",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0A4B,
+ unicodeslot=0xA4B,
},
- [0x0A4C]={
+ [0xA4C]={
adobename="aumatragurmukhi",
category="mn",
description="GURMUKHI VOWEL SIGN AU",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0A4C,
+ unicodeslot=0xA4C,
},
- [0x0A4D]={
+ [0xA4D]={
adobename="halantgurmukhi",
category="mn",
+ combining=0x9,
description="GURMUKHI SIGN VIRAMA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0A4D,
+ unicodeslot=0xA4D,
},
- [0x0A51]={
+ [0xA51]={
category="mn",
description="GURMUKHI SIGN UDAAT",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0A51,
+ unicodeslot=0xA51,
},
- [0x0A59]={
+ [0xA59]={
adobename="khhagurmukhi",
category="lo",
description="GURMUKHI LETTER KHHA",
direction="l",
linebreak="al",
- specials={ "char", 0x0A16, 0x0A3C },
- unicodeslot=0x0A59,
+ specials={ "char", 0xA16, 0xA3C },
+ unicodeslot=0xA59,
},
- [0x0A5A]={
+ [0xA5A]={
adobename="ghhagurmukhi",
category="lo",
description="GURMUKHI LETTER GHHA",
direction="l",
linebreak="al",
- specials={ "char", 0x0A17, 0x0A3C },
- unicodeslot=0x0A5A,
+ specials={ "char", 0xA17, 0xA3C },
+ unicodeslot=0xA5A,
},
- [0x0A5B]={
+ [0xA5B]={
adobename="zagurmukhi",
category="lo",
description="GURMUKHI LETTER ZA",
direction="l",
linebreak="al",
- specials={ "char", 0x0A1C, 0x0A3C },
- unicodeslot=0x0A5B,
+ specials={ "char", 0xA1C, 0xA3C },
+ unicodeslot=0xA5B,
},
- [0x0A5C]={
+ [0xA5C]={
adobename="rragurmukhi",
category="lo",
description="GURMUKHI LETTER RRA",
direction="l",
linebreak="al",
- unicodeslot=0x0A5C,
+ unicodeslot=0xA5C,
},
- [0x0A5E]={
+ [0xA5E]={
adobename="fagurmukhi",
category="lo",
description="GURMUKHI LETTER FA",
direction="l",
linebreak="al",
- specials={ "char", 0x0A2B, 0x0A3C },
- unicodeslot=0x0A5E,
+ specials={ "char", 0xA2B, 0xA3C },
+ unicodeslot=0xA5E,
},
- [0x0A66]={
+ [0xA66]={
adobename="zerogurmukhi",
category="nd",
description="GURMUKHI DIGIT ZERO",
direction="l",
linebreak="nu",
- unicodeslot=0x0A66,
+ unicodeslot=0xA66,
},
- [0x0A67]={
+ [0xA67]={
adobename="onegurmukhi",
category="nd",
description="GURMUKHI DIGIT ONE",
direction="l",
linebreak="nu",
- unicodeslot=0x0A67,
+ unicodeslot=0xA67,
},
- [0x0A68]={
+ [0xA68]={
adobename="twogurmukhi",
category="nd",
description="GURMUKHI DIGIT TWO",
direction="l",
linebreak="nu",
- unicodeslot=0x0A68,
+ unicodeslot=0xA68,
},
- [0x0A69]={
+ [0xA69]={
adobename="threegurmukhi",
category="nd",
description="GURMUKHI DIGIT THREE",
direction="l",
linebreak="nu",
- unicodeslot=0x0A69,
+ unicodeslot=0xA69,
},
- [0x0A6A]={
+ [0xA6A]={
adobename="fourgurmukhi",
category="nd",
description="GURMUKHI DIGIT FOUR",
direction="l",
linebreak="nu",
- unicodeslot=0x0A6A,
+ unicodeslot=0xA6A,
},
- [0x0A6B]={
+ [0xA6B]={
adobename="fivegurmukhi",
category="nd",
description="GURMUKHI DIGIT FIVE",
direction="l",
linebreak="nu",
- unicodeslot=0x0A6B,
+ unicodeslot=0xA6B,
},
- [0x0A6C]={
+ [0xA6C]={
adobename="sixgurmukhi",
category="nd",
description="GURMUKHI DIGIT SIX",
direction="l",
linebreak="nu",
- unicodeslot=0x0A6C,
+ unicodeslot=0xA6C,
},
- [0x0A6D]={
+ [0xA6D]={
adobename="sevengurmukhi",
category="nd",
description="GURMUKHI DIGIT SEVEN",
direction="l",
linebreak="nu",
- unicodeslot=0x0A6D,
+ unicodeslot=0xA6D,
},
- [0x0A6E]={
+ [0xA6E]={
adobename="eightgurmukhi",
category="nd",
description="GURMUKHI DIGIT EIGHT",
direction="l",
linebreak="nu",
- unicodeslot=0x0A6E,
+ unicodeslot=0xA6E,
},
- [0x0A6F]={
+ [0xA6F]={
adobename="ninegurmukhi",
category="nd",
description="GURMUKHI DIGIT NINE",
direction="l",
linebreak="nu",
- unicodeslot=0x0A6F,
+ unicodeslot=0xA6F,
},
- [0x0A70]={
+ [0xA70]={
adobename="tippigurmukhi",
category="mn",
description="GURMUKHI TIPPI",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0A70,
+ unicodeslot=0xA70,
},
- [0x0A71]={
+ [0xA71]={
adobename="addakgurmukhi",
category="mn",
description="GURMUKHI ADDAK",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0A71,
+ unicodeslot=0xA71,
},
- [0x0A72]={
+ [0xA72]={
adobename="irigurmukhi",
category="lo",
description="GURMUKHI IRI",
direction="l",
linebreak="al",
- unicodeslot=0x0A72,
+ unicodeslot=0xA72,
},
- [0x0A73]={
+ [0xA73]={
adobename="uragurmukhi",
category="lo",
description="GURMUKHI URA",
direction="l",
linebreak="al",
- unicodeslot=0x0A73,
+ unicodeslot=0xA73,
},
- [0x0A74]={
+ [0xA74]={
adobename="ekonkargurmukhi",
category="lo",
description="GURMUKHI EK ONKAR",
direction="l",
linebreak="al",
- unicodeslot=0x0A74,
+ unicodeslot=0xA74,
},
- [0x0A75]={
+ [0xA75]={
category="mn",
description="GURMUKHI SIGN YAKASH",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0A75,
+ unicodeslot=0xA75,
},
- [0x0A81]={
+ [0xA81]={
adobename="candrabindugujarati",
category="mn",
description="GUJARATI SIGN CANDRABINDU",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0A81,
+ unicodeslot=0xA81,
},
- [0x0A82]={
+ [0xA82]={
adobename="anusvaragujarati",
category="mn",
description="GUJARATI SIGN ANUSVARA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0A82,
+ unicodeslot=0xA82,
},
- [0x0A83]={
+ [0xA83]={
adobename="visargagujarati",
category="mc",
description="GUJARATI SIGN VISARGA",
direction="l",
linebreak="cm",
- unicodeslot=0x0A83,
+ unicodeslot=0xA83,
},
- [0x0A85]={
+ [0xA85]={
adobename="agujarati",
category="lo",
description="GUJARATI LETTER A",
direction="l",
linebreak="al",
- unicodeslot=0x0A85,
+ unicodeslot=0xA85,
},
- [0x0A86]={
+ [0xA86]={
adobename="aagujarati",
category="lo",
description="GUJARATI LETTER AA",
direction="l",
linebreak="al",
- unicodeslot=0x0A86,
+ unicodeslot=0xA86,
},
- [0x0A87]={
+ [0xA87]={
adobename="igujarati",
category="lo",
description="GUJARATI LETTER I",
direction="l",
linebreak="al",
- unicodeslot=0x0A87,
+ unicodeslot=0xA87,
},
- [0x0A88]={
+ [0xA88]={
adobename="iigujarati",
category="lo",
description="GUJARATI LETTER II",
direction="l",
linebreak="al",
- unicodeslot=0x0A88,
+ unicodeslot=0xA88,
},
- [0x0A89]={
+ [0xA89]={
adobename="ugujarati",
category="lo",
description="GUJARATI LETTER U",
direction="l",
linebreak="al",
- unicodeslot=0x0A89,
+ unicodeslot=0xA89,
},
- [0x0A8A]={
+ [0xA8A]={
adobename="uugujarati",
category="lo",
description="GUJARATI LETTER UU",
direction="l",
linebreak="al",
- unicodeslot=0x0A8A,
+ unicodeslot=0xA8A,
},
- [0x0A8B]={
+ [0xA8B]={
adobename="rvocalicgujarati",
category="lo",
description="GUJARATI LETTER VOCALIC R",
direction="l",
linebreak="al",
- unicodeslot=0x0A8B,
+ unicodeslot=0xA8B,
},
- [0x0A8C]={
+ [0xA8C]={
category="lo",
description="GUJARATI LETTER VOCALIC L",
direction="l",
linebreak="al",
- unicodeslot=0x0A8C,
+ unicodeslot=0xA8C,
},
- [0x0A8D]={
+ [0xA8D]={
adobename="ecandragujarati",
category="lo",
description="GUJARATI VOWEL CANDRA E",
direction="l",
linebreak="al",
- unicodeslot=0x0A8D,
+ unicodeslot=0xA8D,
},
- [0x0A8F]={
+ [0xA8F]={
adobename="egujarati",
category="lo",
description="GUJARATI LETTER E",
direction="l",
linebreak="al",
- unicodeslot=0x0A8F,
+ unicodeslot=0xA8F,
},
- [0x0A90]={
+ [0xA90]={
adobename="aigujarati",
category="lo",
description="GUJARATI LETTER AI",
direction="l",
linebreak="al",
- unicodeslot=0x0A90,
+ unicodeslot=0xA90,
},
- [0x0A91]={
+ [0xA91]={
adobename="ocandragujarati",
category="lo",
description="GUJARATI VOWEL CANDRA O",
direction="l",
linebreak="al",
- unicodeslot=0x0A91,
+ unicodeslot=0xA91,
},
- [0x0A93]={
+ [0xA93]={
adobename="ogujarati",
category="lo",
description="GUJARATI LETTER O",
direction="l",
linebreak="al",
- unicodeslot=0x0A93,
+ unicodeslot=0xA93,
},
- [0x0A94]={
+ [0xA94]={
adobename="augujarati",
category="lo",
description="GUJARATI LETTER AU",
direction="l",
linebreak="al",
- unicodeslot=0x0A94,
+ unicodeslot=0xA94,
},
- [0x0A95]={
+ [0xA95]={
adobename="kagujarati",
category="lo",
description="GUJARATI LETTER KA",
direction="l",
linebreak="al",
- unicodeslot=0x0A95,
+ unicodeslot=0xA95,
},
- [0x0A96]={
+ [0xA96]={
adobename="khagujarati",
category="lo",
description="GUJARATI LETTER KHA",
direction="l",
linebreak="al",
- unicodeslot=0x0A96,
+ unicodeslot=0xA96,
},
- [0x0A97]={
+ [0xA97]={
adobename="gagujarati",
category="lo",
description="GUJARATI LETTER GA",
direction="l",
linebreak="al",
- unicodeslot=0x0A97,
+ unicodeslot=0xA97,
},
- [0x0A98]={
+ [0xA98]={
adobename="ghagujarati",
category="lo",
description="GUJARATI LETTER GHA",
direction="l",
linebreak="al",
- unicodeslot=0x0A98,
+ unicodeslot=0xA98,
},
- [0x0A99]={
+ [0xA99]={
adobename="ngagujarati",
category="lo",
description="GUJARATI LETTER NGA",
direction="l",
linebreak="al",
- unicodeslot=0x0A99,
+ unicodeslot=0xA99,
},
- [0x0A9A]={
+ [0xA9A]={
adobename="cagujarati",
category="lo",
description="GUJARATI LETTER CA",
direction="l",
linebreak="al",
- unicodeslot=0x0A9A,
+ unicodeslot=0xA9A,
},
- [0x0A9B]={
+ [0xA9B]={
adobename="chagujarati",
category="lo",
description="GUJARATI LETTER CHA",
direction="l",
linebreak="al",
- unicodeslot=0x0A9B,
+ unicodeslot=0xA9B,
},
- [0x0A9C]={
+ [0xA9C]={
adobename="jagujarati",
category="lo",
description="GUJARATI LETTER JA",
direction="l",
linebreak="al",
- unicodeslot=0x0A9C,
+ unicodeslot=0xA9C,
},
- [0x0A9D]={
+ [0xA9D]={
adobename="jhagujarati",
category="lo",
description="GUJARATI LETTER JHA",
direction="l",
linebreak="al",
- unicodeslot=0x0A9D,
+ unicodeslot=0xA9D,
},
- [0x0A9E]={
+ [0xA9E]={
adobename="nyagujarati",
category="lo",
description="GUJARATI LETTER NYA",
direction="l",
linebreak="al",
- unicodeslot=0x0A9E,
+ unicodeslot=0xA9E,
},
- [0x0A9F]={
+ [0xA9F]={
adobename="ttagujarati",
category="lo",
description="GUJARATI LETTER TTA",
direction="l",
linebreak="al",
- unicodeslot=0x0A9F,
+ unicodeslot=0xA9F,
},
- [0x0AA0]={
+ [0xAA0]={
adobename="tthagujarati",
category="lo",
description="GUJARATI LETTER TTHA",
direction="l",
linebreak="al",
- unicodeslot=0x0AA0,
+ unicodeslot=0xAA0,
},
- [0x0AA1]={
+ [0xAA1]={
adobename="ddagujarati",
category="lo",
description="GUJARATI LETTER DDA",
direction="l",
linebreak="al",
- unicodeslot=0x0AA1,
+ unicodeslot=0xAA1,
},
- [0x0AA2]={
+ [0xAA2]={
adobename="ddhagujarati",
category="lo",
description="GUJARATI LETTER DDHA",
direction="l",
linebreak="al",
- unicodeslot=0x0AA2,
+ unicodeslot=0xAA2,
},
- [0x0AA3]={
+ [0xAA3]={
adobename="nnagujarati",
category="lo",
description="GUJARATI LETTER NNA",
direction="l",
linebreak="al",
- unicodeslot=0x0AA3,
+ unicodeslot=0xAA3,
},
- [0x0AA4]={
+ [0xAA4]={
adobename="tagujarati",
category="lo",
description="GUJARATI LETTER TA",
direction="l",
linebreak="al",
- unicodeslot=0x0AA4,
+ unicodeslot=0xAA4,
},
- [0x0AA5]={
+ [0xAA5]={
adobename="thagujarati",
category="lo",
description="GUJARATI LETTER THA",
direction="l",
linebreak="al",
- unicodeslot=0x0AA5,
+ unicodeslot=0xAA5,
},
- [0x0AA6]={
+ [0xAA6]={
adobename="dagujarati",
category="lo",
description="GUJARATI LETTER DA",
direction="l",
linebreak="al",
- unicodeslot=0x0AA6,
+ unicodeslot=0xAA6,
},
- [0x0AA7]={
+ [0xAA7]={
adobename="dhagujarati",
category="lo",
description="GUJARATI LETTER DHA",
direction="l",
linebreak="al",
- unicodeslot=0x0AA7,
+ unicodeslot=0xAA7,
},
- [0x0AA8]={
+ [0xAA8]={
adobename="nagujarati",
category="lo",
description="GUJARATI LETTER NA",
direction="l",
linebreak="al",
- unicodeslot=0x0AA8,
+ unicodeslot=0xAA8,
},
- [0x0AAA]={
+ [0xAAA]={
adobename="pagujarati",
category="lo",
description="GUJARATI LETTER PA",
direction="l",
linebreak="al",
- unicodeslot=0x0AAA,
+ unicodeslot=0xAAA,
},
- [0x0AAB]={
+ [0xAAB]={
adobename="phagujarati",
category="lo",
description="GUJARATI LETTER PHA",
direction="l",
linebreak="al",
- unicodeslot=0x0AAB,
+ unicodeslot=0xAAB,
},
- [0x0AAC]={
+ [0xAAC]={
adobename="bagujarati",
category="lo",
description="GUJARATI LETTER BA",
direction="l",
linebreak="al",
- unicodeslot=0x0AAC,
+ unicodeslot=0xAAC,
},
- [0x0AAD]={
+ [0xAAD]={
adobename="bhagujarati",
category="lo",
description="GUJARATI LETTER BHA",
direction="l",
linebreak="al",
- unicodeslot=0x0AAD,
+ unicodeslot=0xAAD,
},
- [0x0AAE]={
+ [0xAAE]={
adobename="magujarati",
category="lo",
description="GUJARATI LETTER MA",
direction="l",
linebreak="al",
- unicodeslot=0x0AAE,
+ unicodeslot=0xAAE,
},
- [0x0AAF]={
+ [0xAAF]={
adobename="yagujarati",
category="lo",
description="GUJARATI LETTER YA",
direction="l",
linebreak="al",
- unicodeslot=0x0AAF,
+ unicodeslot=0xAAF,
},
- [0x0AB0]={
+ [0xAB0]={
adobename="ragujarati",
category="lo",
description="GUJARATI LETTER RA",
direction="l",
linebreak="al",
- unicodeslot=0x0AB0,
+ unicodeslot=0xAB0,
},
- [0x0AB2]={
+ [0xAB2]={
adobename="lagujarati",
category="lo",
description="GUJARATI LETTER LA",
direction="l",
linebreak="al",
- unicodeslot=0x0AB2,
+ unicodeslot=0xAB2,
},
- [0x0AB3]={
+ [0xAB3]={
adobename="llagujarati",
category="lo",
description="GUJARATI LETTER LLA",
direction="l",
linebreak="al",
- unicodeslot=0x0AB3,
+ unicodeslot=0xAB3,
},
- [0x0AB5]={
+ [0xAB5]={
adobename="vagujarati",
category="lo",
description="GUJARATI LETTER VA",
direction="l",
linebreak="al",
- unicodeslot=0x0AB5,
+ unicodeslot=0xAB5,
},
- [0x0AB6]={
+ [0xAB6]={
adobename="shagujarati",
category="lo",
description="GUJARATI LETTER SHA",
direction="l",
linebreak="al",
- unicodeslot=0x0AB6,
+ unicodeslot=0xAB6,
},
- [0x0AB7]={
+ [0xAB7]={
adobename="ssagujarati",
category="lo",
description="GUJARATI LETTER SSA",
direction="l",
linebreak="al",
- unicodeslot=0x0AB7,
+ unicodeslot=0xAB7,
},
- [0x0AB8]={
+ [0xAB8]={
adobename="sagujarati",
category="lo",
description="GUJARATI LETTER SA",
direction="l",
linebreak="al",
- unicodeslot=0x0AB8,
+ unicodeslot=0xAB8,
},
- [0x0AB9]={
+ [0xAB9]={
adobename="hagujarati",
category="lo",
description="GUJARATI LETTER HA",
direction="l",
linebreak="al",
- unicodeslot=0x0AB9,
+ unicodeslot=0xAB9,
},
- [0x0ABC]={
+ [0xABC]={
adobename="nuktagujarati",
category="mn",
+ combining=0x7,
description="GUJARATI SIGN NUKTA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0ABC,
+ unicodeslot=0xABC,
},
- [0x0ABD]={
+ [0xABD]={
category="lo",
description="GUJARATI SIGN AVAGRAHA",
direction="l",
linebreak="al",
- unicodeslot=0x0ABD,
+ unicodeslot=0xABD,
},
- [0x0ABE]={
+ [0xABE]={
adobename="aavowelsigngujarati",
category="mc",
description="GUJARATI VOWEL SIGN AA",
direction="l",
linebreak="cm",
- unicodeslot=0x0ABE,
+ unicodeslot=0xABE,
},
- [0x0ABF]={
+ [0xABF]={
adobename="ivowelsigngujarati",
category="mc",
description="GUJARATI VOWEL SIGN I",
direction="l",
linebreak="cm",
- unicodeslot=0x0ABF,
+ unicodeslot=0xABF,
},
- [0x0AC0]={
+ [0xAC0]={
adobename="iivowelsigngujarati",
category="mc",
description="GUJARATI VOWEL SIGN II",
direction="l",
linebreak="cm",
- unicodeslot=0x0AC0,
+ unicodeslot=0xAC0,
},
- [0x0AC1]={
+ [0xAC1]={
adobename="uvowelsigngujarati",
category="mn",
description="GUJARATI VOWEL SIGN U",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0AC1,
+ unicodeslot=0xAC1,
},
- [0x0AC2]={
+ [0xAC2]={
adobename="uuvowelsigngujarati",
category="mn",
description="GUJARATI VOWEL SIGN UU",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0AC2,
+ unicodeslot=0xAC2,
},
- [0x0AC3]={
+ [0xAC3]={
adobename="rvocalicvowelsigngujarati",
category="mn",
description="GUJARATI VOWEL SIGN VOCALIC R",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0AC3,
+ unicodeslot=0xAC3,
},
- [0x0AC4]={
+ [0xAC4]={
adobename="rrvocalicvowelsigngujarati",
category="mn",
description="GUJARATI VOWEL SIGN VOCALIC RR",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0AC4,
+ unicodeslot=0xAC4,
},
- [0x0AC5]={
+ [0xAC5]={
adobename="ecandravowelsigngujarati",
category="mn",
description="GUJARATI VOWEL SIGN CANDRA E",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0AC5,
+ unicodeslot=0xAC5,
},
- [0x0AC7]={
+ [0xAC7]={
adobename="evowelsigngujarati",
category="mn",
description="GUJARATI VOWEL SIGN E",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0AC7,
+ unicodeslot=0xAC7,
},
- [0x0AC8]={
+ [0xAC8]={
adobename="aivowelsigngujarati",
category="mn",
description="GUJARATI VOWEL SIGN AI",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0AC8,
+ unicodeslot=0xAC8,
},
- [0x0AC9]={
+ [0xAC9]={
adobename="ocandravowelsigngujarati",
category="mc",
description="GUJARATI VOWEL SIGN CANDRA O",
direction="l",
linebreak="cm",
- unicodeslot=0x0AC9,
+ unicodeslot=0xAC9,
},
- [0x0ACB]={
+ [0xACB]={
adobename="ovowelsigngujarati",
category="mc",
description="GUJARATI VOWEL SIGN O",
direction="l",
linebreak="cm",
- unicodeslot=0x0ACB,
+ unicodeslot=0xACB,
},
- [0x0ACC]={
+ [0xACC]={
adobename="auvowelsigngujarati",
category="mc",
description="GUJARATI VOWEL SIGN AU",
direction="l",
linebreak="cm",
- unicodeslot=0x0ACC,
+ unicodeslot=0xACC,
},
- [0x0ACD]={
+ [0xACD]={
adobename="viramagujarati",
category="mn",
+ combining=0x9,
description="GUJARATI SIGN VIRAMA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0ACD,
+ unicodeslot=0xACD,
},
- [0x0AD0]={
+ [0xAD0]={
adobename="omgujarati",
category="lo",
description="GUJARATI OM",
direction="l",
linebreak="al",
- unicodeslot=0x0AD0,
+ unicodeslot=0xAD0,
},
- [0x0AE0]={
+ [0xAE0]={
adobename="rrvocalicgujarati",
category="lo",
description="GUJARATI LETTER VOCALIC RR",
direction="l",
linebreak="al",
- unicodeslot=0x0AE0,
+ unicodeslot=0xAE0,
},
- [0x0AE1]={
+ [0xAE1]={
category="lo",
description="GUJARATI LETTER VOCALIC LL",
direction="l",
linebreak="al",
- unicodeslot=0x0AE1,
+ unicodeslot=0xAE1,
},
- [0x0AE2]={
+ [0xAE2]={
category="mn",
description="GUJARATI VOWEL SIGN VOCALIC L",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0AE2,
+ unicodeslot=0xAE2,
},
- [0x0AE3]={
+ [0xAE3]={
category="mn",
description="GUJARATI VOWEL SIGN VOCALIC LL",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0AE3,
+ unicodeslot=0xAE3,
},
- [0x0AE6]={
+ [0xAE6]={
adobename="zerogujarati",
category="nd",
description="GUJARATI DIGIT ZERO",
direction="l",
linebreak="nu",
- unicodeslot=0x0AE6,
+ unicodeslot=0xAE6,
},
- [0x0AE7]={
+ [0xAE7]={
adobename="onegujarati",
category="nd",
description="GUJARATI DIGIT ONE",
direction="l",
linebreak="nu",
- unicodeslot=0x0AE7,
+ unicodeslot=0xAE7,
},
- [0x0AE8]={
+ [0xAE8]={
adobename="twogujarati",
category="nd",
description="GUJARATI DIGIT TWO",
direction="l",
linebreak="nu",
- unicodeslot=0x0AE8,
+ unicodeslot=0xAE8,
},
- [0x0AE9]={
+ [0xAE9]={
adobename="threegujarati",
category="nd",
description="GUJARATI DIGIT THREE",
direction="l",
linebreak="nu",
- unicodeslot=0x0AE9,
+ unicodeslot=0xAE9,
},
- [0x0AEA]={
+ [0xAEA]={
adobename="fourgujarati",
category="nd",
description="GUJARATI DIGIT FOUR",
direction="l",
linebreak="nu",
- unicodeslot=0x0AEA,
+ unicodeslot=0xAEA,
},
- [0x0AEB]={
+ [0xAEB]={
adobename="fivegujarati",
category="nd",
description="GUJARATI DIGIT FIVE",
direction="l",
linebreak="nu",
- unicodeslot=0x0AEB,
+ unicodeslot=0xAEB,
},
- [0x0AEC]={
+ [0xAEC]={
adobename="sixgujarati",
category="nd",
description="GUJARATI DIGIT SIX",
direction="l",
linebreak="nu",
- unicodeslot=0x0AEC,
+ unicodeslot=0xAEC,
},
- [0x0AED]={
+ [0xAED]={
adobename="sevengujarati",
category="nd",
description="GUJARATI DIGIT SEVEN",
direction="l",
linebreak="nu",
- unicodeslot=0x0AED,
+ unicodeslot=0xAED,
},
- [0x0AEE]={
+ [0xAEE]={
adobename="eightgujarati",
category="nd",
description="GUJARATI DIGIT EIGHT",
direction="l",
linebreak="nu",
- unicodeslot=0x0AEE,
+ unicodeslot=0xAEE,
},
- [0x0AEF]={
+ [0xAEF]={
adobename="ninegujarati",
category="nd",
description="GUJARATI DIGIT NINE",
direction="l",
linebreak="nu",
- unicodeslot=0x0AEF,
+ unicodeslot=0xAEF,
},
- [0x0AF0]={
+ [0xAF0]={
category="po",
description="GUJARATI ABBREVIATION SIGN",
direction="l",
linebreak="al",
- unicodeslot=0x0AF0,
+ unicodeslot=0xAF0,
},
- [0x0AF1]={
+ [0xAF1]={
category="sc",
description="GUJARATI RUPEE SIGN",
direction="et",
linebreak="pr",
- unicodeslot=0x0AF1,
+ unicodeslot=0xAF1,
},
- [0x0B01]={
+ [0xB01]={
category="mn",
description="ORIYA SIGN CANDRABINDU",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0B01,
+ unicodeslot=0xB01,
},
- [0x0B02]={
+ [0xB02]={
category="mc",
description="ORIYA SIGN ANUSVARA",
direction="l",
linebreak="cm",
- unicodeslot=0x0B02,
+ unicodeslot=0xB02,
},
- [0x0B03]={
+ [0xB03]={
category="mc",
description="ORIYA SIGN VISARGA",
direction="l",
linebreak="cm",
- unicodeslot=0x0B03,
+ unicodeslot=0xB03,
},
- [0x0B05]={
+ [0xB05]={
category="lo",
description="ORIYA LETTER A",
direction="l",
linebreak="al",
- unicodeslot=0x0B05,
+ unicodeslot=0xB05,
},
- [0x0B06]={
+ [0xB06]={
category="lo",
description="ORIYA LETTER AA",
direction="l",
linebreak="al",
- unicodeslot=0x0B06,
+ unicodeslot=0xB06,
},
- [0x0B07]={
+ [0xB07]={
category="lo",
description="ORIYA LETTER I",
direction="l",
linebreak="al",
- unicodeslot=0x0B07,
+ unicodeslot=0xB07,
},
- [0x0B08]={
+ [0xB08]={
category="lo",
description="ORIYA LETTER II",
direction="l",
linebreak="al",
- unicodeslot=0x0B08,
+ unicodeslot=0xB08,
},
- [0x0B09]={
+ [0xB09]={
category="lo",
description="ORIYA LETTER U",
direction="l",
linebreak="al",
- unicodeslot=0x0B09,
+ unicodeslot=0xB09,
},
- [0x0B0A]={
+ [0xB0A]={
category="lo",
description="ORIYA LETTER UU",
direction="l",
linebreak="al",
- unicodeslot=0x0B0A,
+ unicodeslot=0xB0A,
},
- [0x0B0B]={
+ [0xB0B]={
category="lo",
description="ORIYA LETTER VOCALIC R",
direction="l",
linebreak="al",
- unicodeslot=0x0B0B,
+ unicodeslot=0xB0B,
},
- [0x0B0C]={
+ [0xB0C]={
category="lo",
description="ORIYA LETTER VOCALIC L",
direction="l",
linebreak="al",
- unicodeslot=0x0B0C,
+ unicodeslot=0xB0C,
},
- [0x0B0F]={
+ [0xB0F]={
category="lo",
description="ORIYA LETTER E",
direction="l",
linebreak="al",
- unicodeslot=0x0B0F,
+ unicodeslot=0xB0F,
},
- [0x0B10]={
+ [0xB10]={
category="lo",
description="ORIYA LETTER AI",
direction="l",
linebreak="al",
- unicodeslot=0x0B10,
+ unicodeslot=0xB10,
},
- [0x0B13]={
+ [0xB13]={
category="lo",
description="ORIYA LETTER O",
direction="l",
linebreak="al",
- unicodeslot=0x0B13,
+ unicodeslot=0xB13,
},
- [0x0B14]={
+ [0xB14]={
category="lo",
description="ORIYA LETTER AU",
direction="l",
linebreak="al",
- unicodeslot=0x0B14,
+ unicodeslot=0xB14,
},
- [0x0B15]={
+ [0xB15]={
category="lo",
description="ORIYA LETTER KA",
direction="l",
linebreak="al",
- unicodeslot=0x0B15,
+ unicodeslot=0xB15,
},
- [0x0B16]={
+ [0xB16]={
category="lo",
description="ORIYA LETTER KHA",
direction="l",
linebreak="al",
- unicodeslot=0x0B16,
+ unicodeslot=0xB16,
},
- [0x0B17]={
+ [0xB17]={
category="lo",
description="ORIYA LETTER GA",
direction="l",
linebreak="al",
- unicodeslot=0x0B17,
+ unicodeslot=0xB17,
},
- [0x0B18]={
+ [0xB18]={
category="lo",
description="ORIYA LETTER GHA",
direction="l",
linebreak="al",
- unicodeslot=0x0B18,
+ unicodeslot=0xB18,
},
- [0x0B19]={
+ [0xB19]={
category="lo",
description="ORIYA LETTER NGA",
direction="l",
linebreak="al",
- unicodeslot=0x0B19,
+ unicodeslot=0xB19,
},
- [0x0B1A]={
+ [0xB1A]={
category="lo",
description="ORIYA LETTER CA",
direction="l",
linebreak="al",
- unicodeslot=0x0B1A,
+ unicodeslot=0xB1A,
},
- [0x0B1B]={
+ [0xB1B]={
category="lo",
description="ORIYA LETTER CHA",
direction="l",
linebreak="al",
- unicodeslot=0x0B1B,
+ unicodeslot=0xB1B,
},
- [0x0B1C]={
+ [0xB1C]={
category="lo",
description="ORIYA LETTER JA",
direction="l",
linebreak="al",
- unicodeslot=0x0B1C,
+ unicodeslot=0xB1C,
},
- [0x0B1D]={
+ [0xB1D]={
category="lo",
description="ORIYA LETTER JHA",
direction="l",
linebreak="al",
- unicodeslot=0x0B1D,
+ unicodeslot=0xB1D,
},
- [0x0B1E]={
+ [0xB1E]={
category="lo",
description="ORIYA LETTER NYA",
direction="l",
linebreak="al",
- unicodeslot=0x0B1E,
+ unicodeslot=0xB1E,
},
- [0x0B1F]={
+ [0xB1F]={
category="lo",
description="ORIYA LETTER TTA",
direction="l",
linebreak="al",
- unicodeslot=0x0B1F,
+ unicodeslot=0xB1F,
},
- [0x0B20]={
+ [0xB20]={
category="lo",
description="ORIYA LETTER TTHA",
direction="l",
linebreak="al",
- unicodeslot=0x0B20,
+ unicodeslot=0xB20,
},
- [0x0B21]={
+ [0xB21]={
category="lo",
description="ORIYA LETTER DDA",
direction="l",
linebreak="al",
- unicodeslot=0x0B21,
+ unicodeslot=0xB21,
},
- [0x0B22]={
+ [0xB22]={
category="lo",
description="ORIYA LETTER DDHA",
direction="l",
linebreak="al",
- unicodeslot=0x0B22,
+ unicodeslot=0xB22,
},
- [0x0B23]={
+ [0xB23]={
category="lo",
description="ORIYA LETTER NNA",
direction="l",
linebreak="al",
- unicodeslot=0x0B23,
+ unicodeslot=0xB23,
},
- [0x0B24]={
+ [0xB24]={
category="lo",
description="ORIYA LETTER TA",
direction="l",
linebreak="al",
- unicodeslot=0x0B24,
+ unicodeslot=0xB24,
},
- [0x0B25]={
+ [0xB25]={
category="lo",
description="ORIYA LETTER THA",
direction="l",
linebreak="al",
- unicodeslot=0x0B25,
+ unicodeslot=0xB25,
},
- [0x0B26]={
+ [0xB26]={
category="lo",
description="ORIYA LETTER DA",
direction="l",
linebreak="al",
- unicodeslot=0x0B26,
+ unicodeslot=0xB26,
},
- [0x0B27]={
+ [0xB27]={
category="lo",
description="ORIYA LETTER DHA",
direction="l",
linebreak="al",
- unicodeslot=0x0B27,
+ unicodeslot=0xB27,
},
- [0x0B28]={
+ [0xB28]={
category="lo",
description="ORIYA LETTER NA",
direction="l",
linebreak="al",
- unicodeslot=0x0B28,
+ unicodeslot=0xB28,
},
- [0x0B2A]={
+ [0xB2A]={
category="lo",
description="ORIYA LETTER PA",
direction="l",
linebreak="al",
- unicodeslot=0x0B2A,
+ unicodeslot=0xB2A,
},
- [0x0B2B]={
+ [0xB2B]={
category="lo",
description="ORIYA LETTER PHA",
direction="l",
linebreak="al",
- unicodeslot=0x0B2B,
+ unicodeslot=0xB2B,
},
- [0x0B2C]={
+ [0xB2C]={
category="lo",
description="ORIYA LETTER BA",
direction="l",
linebreak="al",
- unicodeslot=0x0B2C,
+ unicodeslot=0xB2C,
},
- [0x0B2D]={
+ [0xB2D]={
category="lo",
description="ORIYA LETTER BHA",
direction="l",
linebreak="al",
- unicodeslot=0x0B2D,
+ unicodeslot=0xB2D,
},
- [0x0B2E]={
+ [0xB2E]={
category="lo",
description="ORIYA LETTER MA",
direction="l",
linebreak="al",
- unicodeslot=0x0B2E,
+ unicodeslot=0xB2E,
},
- [0x0B2F]={
+ [0xB2F]={
category="lo",
description="ORIYA LETTER YA",
direction="l",
linebreak="al",
- unicodeslot=0x0B2F,
+ unicodeslot=0xB2F,
},
- [0x0B30]={
+ [0xB30]={
category="lo",
description="ORIYA LETTER RA",
direction="l",
linebreak="al",
- unicodeslot=0x0B30,
+ unicodeslot=0xB30,
},
- [0x0B32]={
+ [0xB32]={
category="lo",
description="ORIYA LETTER LA",
direction="l",
linebreak="al",
- unicodeslot=0x0B32,
+ unicodeslot=0xB32,
},
- [0x0B33]={
+ [0xB33]={
category="lo",
description="ORIYA LETTER LLA",
direction="l",
linebreak="al",
- unicodeslot=0x0B33,
+ unicodeslot=0xB33,
},
- [0x0B35]={
+ [0xB35]={
category="lo",
description="ORIYA LETTER VA",
direction="l",
linebreak="al",
- unicodeslot=0x0B35,
+ unicodeslot=0xB35,
},
- [0x0B36]={
+ [0xB36]={
category="lo",
description="ORIYA LETTER SHA",
direction="l",
linebreak="al",
- unicodeslot=0x0B36,
+ unicodeslot=0xB36,
},
- [0x0B37]={
+ [0xB37]={
category="lo",
description="ORIYA LETTER SSA",
direction="l",
linebreak="al",
- unicodeslot=0x0B37,
+ unicodeslot=0xB37,
},
- [0x0B38]={
+ [0xB38]={
category="lo",
description="ORIYA LETTER SA",
direction="l",
linebreak="al",
- unicodeslot=0x0B38,
+ unicodeslot=0xB38,
},
- [0x0B39]={
+ [0xB39]={
category="lo",
description="ORIYA LETTER HA",
direction="l",
linebreak="al",
- unicodeslot=0x0B39,
+ unicodeslot=0xB39,
},
- [0x0B3C]={
+ [0xB3C]={
category="mn",
+ combining=0x7,
description="ORIYA SIGN NUKTA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0B3C,
+ unicodeslot=0xB3C,
},
- [0x0B3D]={
+ [0xB3D]={
category="lo",
description="ORIYA SIGN AVAGRAHA",
direction="l",
linebreak="al",
- unicodeslot=0x0B3D,
+ unicodeslot=0xB3D,
},
- [0x0B3E]={
+ [0xB3E]={
category="mc",
description="ORIYA VOWEL SIGN AA",
direction="l",
linebreak="cm",
- unicodeslot=0x0B3E,
+ unicodeslot=0xB3E,
},
- [0x0B3F]={
+ [0xB3F]={
category="mn",
description="ORIYA VOWEL SIGN I",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0B3F,
+ unicodeslot=0xB3F,
},
- [0x0B40]={
+ [0xB40]={
category="mc",
description="ORIYA VOWEL SIGN II",
direction="l",
linebreak="cm",
- unicodeslot=0x0B40,
+ unicodeslot=0xB40,
},
- [0x0B41]={
+ [0xB41]={
category="mn",
description="ORIYA VOWEL SIGN U",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0B41,
+ unicodeslot=0xB41,
},
- [0x0B42]={
+ [0xB42]={
category="mn",
description="ORIYA VOWEL SIGN UU",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0B42,
+ unicodeslot=0xB42,
},
- [0x0B43]={
+ [0xB43]={
category="mn",
description="ORIYA VOWEL SIGN VOCALIC R",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0B43,
+ unicodeslot=0xB43,
},
- [0x0B44]={
+ [0xB44]={
category="mn",
description="ORIYA VOWEL SIGN VOCALIC RR",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0B44,
+ unicodeslot=0xB44,
},
- [0x0B47]={
+ [0xB47]={
category="mc",
description="ORIYA VOWEL SIGN E",
direction="l",
linebreak="cm",
- unicodeslot=0x0B47,
+ unicodeslot=0xB47,
},
- [0x0B48]={
+ [0xB48]={
category="mc",
description="ORIYA VOWEL SIGN AI",
direction="l",
linebreak="cm",
- specials={ "char", 0x0B47, 0x0B56 },
- unicodeslot=0x0B48,
+ specials={ "char", 0xB47, 0xB56 },
+ unicodeslot=0xB48,
},
- [0x0B4B]={
+ [0xB4B]={
category="mc",
description="ORIYA VOWEL SIGN O",
direction="l",
linebreak="cm",
- specials={ "char", 0x0B47, 0x0B3E },
- unicodeslot=0x0B4B,
+ specials={ "char", 0xB47, 0xB3E },
+ unicodeslot=0xB4B,
},
- [0x0B4C]={
+ [0xB4C]={
category="mc",
description="ORIYA VOWEL SIGN AU",
direction="l",
linebreak="cm",
- specials={ "char", 0x0B47, 0x0B57 },
- unicodeslot=0x0B4C,
+ specials={ "char", 0xB47, 0xB57 },
+ unicodeslot=0xB4C,
},
- [0x0B4D]={
+ [0xB4D]={
category="mn",
+ combining=0x9,
description="ORIYA SIGN VIRAMA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0B4D,
+ unicodeslot=0xB4D,
},
- [0x0B56]={
+ [0xB56]={
category="mn",
description="ORIYA AI LENGTH MARK",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0B56,
+ unicodeslot=0xB56,
},
- [0x0B57]={
+ [0xB57]={
category="mc",
description="ORIYA AU LENGTH MARK",
direction="l",
linebreak="cm",
- unicodeslot=0x0B57,
+ unicodeslot=0xB57,
},
- [0x0B5C]={
+ [0xB5C]={
category="lo",
description="ORIYA LETTER RRA",
direction="l",
linebreak="al",
- specials={ "char", 0x0B21, 0x0B3C },
- unicodeslot=0x0B5C,
+ specials={ "char", 0xB21, 0xB3C },
+ unicodeslot=0xB5C,
},
- [0x0B5D]={
+ [0xB5D]={
category="lo",
description="ORIYA LETTER RHA",
direction="l",
linebreak="al",
- specials={ "char", 0x0B22, 0x0B3C },
- unicodeslot=0x0B5D,
+ specials={ "char", 0xB22, 0xB3C },
+ unicodeslot=0xB5D,
},
- [0x0B5F]={
+ [0xB5F]={
category="lo",
description="ORIYA LETTER YYA",
direction="l",
linebreak="al",
- unicodeslot=0x0B5F,
+ unicodeslot=0xB5F,
},
- [0x0B60]={
+ [0xB60]={
category="lo",
description="ORIYA LETTER VOCALIC RR",
direction="l",
linebreak="al",
- unicodeslot=0x0B60,
+ unicodeslot=0xB60,
},
- [0x0B61]={
+ [0xB61]={
category="lo",
description="ORIYA LETTER VOCALIC LL",
direction="l",
linebreak="al",
- unicodeslot=0x0B61,
+ unicodeslot=0xB61,
},
- [0x0B62]={
+ [0xB62]={
category="mn",
description="ORIYA VOWEL SIGN VOCALIC L",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0B62,
+ unicodeslot=0xB62,
},
- [0x0B63]={
+ [0xB63]={
category="mn",
description="ORIYA VOWEL SIGN VOCALIC LL",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0B63,
+ unicodeslot=0xB63,
},
- [0x0B66]={
+ [0xB66]={
category="nd",
description="ORIYA DIGIT ZERO",
direction="l",
linebreak="nu",
- unicodeslot=0x0B66,
+ unicodeslot=0xB66,
},
- [0x0B67]={
+ [0xB67]={
category="nd",
description="ORIYA DIGIT ONE",
direction="l",
linebreak="nu",
- unicodeslot=0x0B67,
+ unicodeslot=0xB67,
},
- [0x0B68]={
+ [0xB68]={
category="nd",
description="ORIYA DIGIT TWO",
direction="l",
linebreak="nu",
- unicodeslot=0x0B68,
+ unicodeslot=0xB68,
},
- [0x0B69]={
+ [0xB69]={
category="nd",
description="ORIYA DIGIT THREE",
direction="l",
linebreak="nu",
- unicodeslot=0x0B69,
+ unicodeslot=0xB69,
},
- [0x0B6A]={
+ [0xB6A]={
category="nd",
description="ORIYA DIGIT FOUR",
direction="l",
linebreak="nu",
- unicodeslot=0x0B6A,
+ unicodeslot=0xB6A,
},
- [0x0B6B]={
+ [0xB6B]={
category="nd",
description="ORIYA DIGIT FIVE",
direction="l",
linebreak="nu",
- unicodeslot=0x0B6B,
+ unicodeslot=0xB6B,
},
- [0x0B6C]={
+ [0xB6C]={
category="nd",
description="ORIYA DIGIT SIX",
direction="l",
linebreak="nu",
- unicodeslot=0x0B6C,
+ unicodeslot=0xB6C,
},
- [0x0B6D]={
+ [0xB6D]={
category="nd",
description="ORIYA DIGIT SEVEN",
direction="l",
linebreak="nu",
- unicodeslot=0x0B6D,
+ unicodeslot=0xB6D,
},
- [0x0B6E]={
+ [0xB6E]={
category="nd",
description="ORIYA DIGIT EIGHT",
direction="l",
linebreak="nu",
- unicodeslot=0x0B6E,
+ unicodeslot=0xB6E,
},
- [0x0B6F]={
+ [0xB6F]={
category="nd",
description="ORIYA DIGIT NINE",
direction="l",
linebreak="nu",
- unicodeslot=0x0B6F,
+ unicodeslot=0xB6F,
},
- [0x0B70]={
+ [0xB70]={
category="so",
description="ORIYA ISSHAR",
direction="l",
linebreak="al",
- unicodeslot=0x0B70,
+ unicodeslot=0xB70,
},
- [0x0B71]={
+ [0xB71]={
category="lo",
description="ORIYA LETTER WA",
direction="l",
linebreak="al",
- unicodeslot=0x0B71,
+ unicodeslot=0xB71,
},
- [0x0B72]={
+ [0xB72]={
category="no",
description="ORIYA FRACTION ONE QUARTER",
direction="l",
linebreak="al",
- unicodeslot=0x0B72,
+ unicodeslot=0xB72,
},
- [0x0B73]={
+ [0xB73]={
category="no",
description="ORIYA FRACTION ONE HALF",
direction="l",
linebreak="al",
- unicodeslot=0x0B73,
+ unicodeslot=0xB73,
},
- [0x0B74]={
+ [0xB74]={
category="no",
description="ORIYA FRACTION THREE QUARTERS",
direction="l",
linebreak="al",
- unicodeslot=0x0B74,
+ unicodeslot=0xB74,
},
- [0x0B75]={
+ [0xB75]={
category="no",
description="ORIYA FRACTION ONE SIXTEENTH",
direction="l",
linebreak="al",
- unicodeslot=0x0B75,
+ unicodeslot=0xB75,
},
- [0x0B76]={
+ [0xB76]={
category="no",
description="ORIYA FRACTION ONE EIGHTH",
direction="l",
linebreak="al",
- unicodeslot=0x0B76,
+ unicodeslot=0xB76,
},
- [0x0B77]={
+ [0xB77]={
category="no",
description="ORIYA FRACTION THREE SIXTEENTHS",
direction="l",
linebreak="al",
- unicodeslot=0x0B77,
+ unicodeslot=0xB77,
},
- [0x0B82]={
+ [0xB82]={
category="mn",
description="TAMIL SIGN ANUSVARA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0B82,
+ unicodeslot=0xB82,
},
- [0x0B83]={
+ [0xB83]={
category="lo",
description="TAMIL SIGN VISARGA",
direction="l",
linebreak="al",
- unicodeslot=0x0B83,
+ unicodeslot=0xB83,
},
- [0x0B85]={
+ [0xB85]={
category="lo",
description="TAMIL LETTER A",
direction="l",
linebreak="al",
- unicodeslot=0x0B85,
+ unicodeslot=0xB85,
},
- [0x0B86]={
+ [0xB86]={
category="lo",
description="TAMIL LETTER AA",
direction="l",
linebreak="al",
- unicodeslot=0x0B86,
+ unicodeslot=0xB86,
},
- [0x0B87]={
+ [0xB87]={
category="lo",
description="TAMIL LETTER I",
direction="l",
linebreak="al",
- unicodeslot=0x0B87,
+ unicodeslot=0xB87,
},
- [0x0B88]={
+ [0xB88]={
category="lo",
description="TAMIL LETTER II",
direction="l",
linebreak="al",
- unicodeslot=0x0B88,
+ unicodeslot=0xB88,
},
- [0x0B89]={
+ [0xB89]={
category="lo",
description="TAMIL LETTER U",
direction="l",
linebreak="al",
- unicodeslot=0x0B89,
+ unicodeslot=0xB89,
},
- [0x0B8A]={
+ [0xB8A]={
category="lo",
description="TAMIL LETTER UU",
direction="l",
linebreak="al",
- unicodeslot=0x0B8A,
+ unicodeslot=0xB8A,
},
- [0x0B8E]={
+ [0xB8E]={
category="lo",
description="TAMIL LETTER E",
direction="l",
linebreak="al",
- unicodeslot=0x0B8E,
+ unicodeslot=0xB8E,
},
- [0x0B8F]={
+ [0xB8F]={
category="lo",
description="TAMIL LETTER EE",
direction="l",
linebreak="al",
- unicodeslot=0x0B8F,
+ unicodeslot=0xB8F,
},
- [0x0B90]={
+ [0xB90]={
category="lo",
description="TAMIL LETTER AI",
direction="l",
linebreak="al",
- unicodeslot=0x0B90,
+ unicodeslot=0xB90,
},
- [0x0B92]={
+ [0xB92]={
category="lo",
description="TAMIL LETTER O",
direction="l",
linebreak="al",
- unicodeslot=0x0B92,
+ unicodeslot=0xB92,
},
- [0x0B93]={
+ [0xB93]={
category="lo",
description="TAMIL LETTER OO",
direction="l",
linebreak="al",
- unicodeslot=0x0B93,
+ unicodeslot=0xB93,
},
- [0x0B94]={
+ [0xB94]={
category="lo",
description="TAMIL LETTER AU",
direction="l",
linebreak="al",
- specials={ "char", 0x0B92, 0x0BD7 },
- unicodeslot=0x0B94,
+ specials={ "char", 0xB92, 0xBD7 },
+ unicodeslot=0xB94,
},
- [0x0B95]={
+ [0xB95]={
category="lo",
description="TAMIL LETTER KA",
direction="l",
linebreak="al",
- unicodeslot=0x0B95,
+ unicodeslot=0xB95,
},
- [0x0B99]={
+ [0xB99]={
category="lo",
description="TAMIL LETTER NGA",
direction="l",
linebreak="al",
- unicodeslot=0x0B99,
+ unicodeslot=0xB99,
},
- [0x0B9A]={
+ [0xB9A]={
category="lo",
description="TAMIL LETTER CA",
direction="l",
linebreak="al",
- unicodeslot=0x0B9A,
+ unicodeslot=0xB9A,
},
- [0x0B9C]={
+ [0xB9C]={
category="lo",
description="TAMIL LETTER JA",
direction="l",
linebreak="al",
- unicodeslot=0x0B9C,
+ unicodeslot=0xB9C,
},
- [0x0B9E]={
+ [0xB9E]={
category="lo",
description="TAMIL LETTER NYA",
direction="l",
linebreak="al",
- unicodeslot=0x0B9E,
+ unicodeslot=0xB9E,
},
- [0x0B9F]={
+ [0xB9F]={
category="lo",
description="TAMIL LETTER TTA",
direction="l",
linebreak="al",
- unicodeslot=0x0B9F,
+ unicodeslot=0xB9F,
},
- [0x0BA3]={
+ [0xBA3]={
category="lo",
description="TAMIL LETTER NNA",
direction="l",
linebreak="al",
- unicodeslot=0x0BA3,
+ unicodeslot=0xBA3,
},
- [0x0BA4]={
+ [0xBA4]={
category="lo",
description="TAMIL LETTER TA",
direction="l",
linebreak="al",
- unicodeslot=0x0BA4,
+ unicodeslot=0xBA4,
},
- [0x0BA8]={
+ [0xBA8]={
category="lo",
description="TAMIL LETTER NA",
direction="l",
linebreak="al",
- unicodeslot=0x0BA8,
+ unicodeslot=0xBA8,
},
- [0x0BA9]={
+ [0xBA9]={
category="lo",
description="TAMIL LETTER NNNA",
direction="l",
linebreak="al",
- unicodeslot=0x0BA9,
+ unicodeslot=0xBA9,
},
- [0x0BAA]={
+ [0xBAA]={
category="lo",
description="TAMIL LETTER PA",
direction="l",
linebreak="al",
- unicodeslot=0x0BAA,
+ unicodeslot=0xBAA,
},
- [0x0BAE]={
+ [0xBAE]={
category="lo",
description="TAMIL LETTER MA",
direction="l",
linebreak="al",
- unicodeslot=0x0BAE,
+ unicodeslot=0xBAE,
},
- [0x0BAF]={
+ [0xBAF]={
category="lo",
description="TAMIL LETTER YA",
direction="l",
linebreak="al",
- unicodeslot=0x0BAF,
+ unicodeslot=0xBAF,
},
- [0x0BB0]={
+ [0xBB0]={
category="lo",
description="TAMIL LETTER RA",
direction="l",
linebreak="al",
- unicodeslot=0x0BB0,
+ unicodeslot=0xBB0,
},
- [0x0BB1]={
+ [0xBB1]={
category="lo",
description="TAMIL LETTER RRA",
direction="l",
linebreak="al",
- unicodeslot=0x0BB1,
+ unicodeslot=0xBB1,
},
- [0x0BB2]={
+ [0xBB2]={
category="lo",
description="TAMIL LETTER LA",
direction="l",
linebreak="al",
- unicodeslot=0x0BB2,
+ unicodeslot=0xBB2,
},
- [0x0BB3]={
+ [0xBB3]={
category="lo",
description="TAMIL LETTER LLA",
direction="l",
linebreak="al",
- unicodeslot=0x0BB3,
+ unicodeslot=0xBB3,
},
- [0x0BB4]={
+ [0xBB4]={
category="lo",
description="TAMIL LETTER LLLA",
direction="l",
linebreak="al",
- unicodeslot=0x0BB4,
+ unicodeslot=0xBB4,
},
- [0x0BB5]={
+ [0xBB5]={
category="lo",
description="TAMIL LETTER VA",
direction="l",
linebreak="al",
- unicodeslot=0x0BB5,
+ unicodeslot=0xBB5,
},
- [0x0BB6]={
+ [0xBB6]={
category="lo",
description="TAMIL LETTER SHA",
direction="l",
linebreak="al",
- unicodeslot=0x0BB6,
+ unicodeslot=0xBB6,
},
- [0x0BB7]={
+ [0xBB7]={
category="lo",
description="TAMIL LETTER SSA",
direction="l",
linebreak="al",
- unicodeslot=0x0BB7,
+ unicodeslot=0xBB7,
},
- [0x0BB8]={
+ [0xBB8]={
category="lo",
description="TAMIL LETTER SA",
direction="l",
linebreak="al",
- unicodeslot=0x0BB8,
+ unicodeslot=0xBB8,
},
- [0x0BB9]={
+ [0xBB9]={
category="lo",
description="TAMIL LETTER HA",
direction="l",
linebreak="al",
- unicodeslot=0x0BB9,
+ unicodeslot=0xBB9,
},
- [0x0BBE]={
+ [0xBBE]={
category="mc",
description="TAMIL VOWEL SIGN AA",
direction="l",
linebreak="cm",
- unicodeslot=0x0BBE,
+ unicodeslot=0xBBE,
},
- [0x0BBF]={
+ [0xBBF]={
category="mc",
description="TAMIL VOWEL SIGN I",
direction="l",
linebreak="cm",
- unicodeslot=0x0BBF,
+ unicodeslot=0xBBF,
},
- [0x0BC0]={
+ [0xBC0]={
category="mn",
description="TAMIL VOWEL SIGN II",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0BC0,
+ unicodeslot=0xBC0,
},
- [0x0BC1]={
+ [0xBC1]={
category="mc",
description="TAMIL VOWEL SIGN U",
direction="l",
linebreak="cm",
- unicodeslot=0x0BC1,
+ unicodeslot=0xBC1,
},
- [0x0BC2]={
+ [0xBC2]={
category="mc",
description="TAMIL VOWEL SIGN UU",
direction="l",
linebreak="cm",
- unicodeslot=0x0BC2,
+ unicodeslot=0xBC2,
},
- [0x0BC6]={
+ [0xBC6]={
category="mc",
description="TAMIL VOWEL SIGN E",
direction="l",
linebreak="cm",
- unicodeslot=0x0BC6,
+ unicodeslot=0xBC6,
},
- [0x0BC7]={
+ [0xBC7]={
category="mc",
description="TAMIL VOWEL SIGN EE",
direction="l",
linebreak="cm",
- unicodeslot=0x0BC7,
+ unicodeslot=0xBC7,
},
- [0x0BC8]={
+ [0xBC8]={
category="mc",
description="TAMIL VOWEL SIGN AI",
direction="l",
linebreak="cm",
- unicodeslot=0x0BC8,
+ unicodeslot=0xBC8,
},
- [0x0BCA]={
+ [0xBCA]={
category="mc",
description="TAMIL VOWEL SIGN O",
direction="l",
linebreak="cm",
- specials={ "char", 0x0BC6, 0x0BBE },
- unicodeslot=0x0BCA,
+ specials={ "char", 0xBC6, 0xBBE },
+ unicodeslot=0xBCA,
},
- [0x0BCB]={
+ [0xBCB]={
category="mc",
description="TAMIL VOWEL SIGN OO",
direction="l",
linebreak="cm",
- specials={ "char", 0x0BC7, 0x0BBE },
- unicodeslot=0x0BCB,
+ specials={ "char", 0xBC7, 0xBBE },
+ unicodeslot=0xBCB,
},
- [0x0BCC]={
+ [0xBCC]={
category="mc",
description="TAMIL VOWEL SIGN AU",
direction="l",
linebreak="cm",
- specials={ "char", 0x0BC6, 0x0BD7 },
- unicodeslot=0x0BCC,
+ specials={ "char", 0xBC6, 0xBD7 },
+ unicodeslot=0xBCC,
},
- [0x0BCD]={
+ [0xBCD]={
category="mn",
+ combining=0x9,
description="TAMIL SIGN VIRAMA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0BCD,
+ unicodeslot=0xBCD,
},
- [0x0BD0]={
+ [0xBD0]={
category="lo",
description="TAMIL OM",
direction="l",
linebreak="al",
- unicodeslot=0x0BD0,
+ unicodeslot=0xBD0,
},
- [0x0BD7]={
+ [0xBD7]={
category="mc",
description="TAMIL AU LENGTH MARK",
direction="l",
linebreak="cm",
- unicodeslot=0x0BD7,
+ unicodeslot=0xBD7,
},
- [0x0BE6]={
+ [0xBE6]={
category="nd",
description="TAMIL DIGIT ZERO",
direction="l",
linebreak="nu",
- unicodeslot=0x0BE6,
+ unicodeslot=0xBE6,
},
- [0x0BE7]={
+ [0xBE7]={
category="nd",
description="TAMIL DIGIT ONE",
direction="l",
linebreak="nu",
- unicodeslot=0x0BE7,
+ unicodeslot=0xBE7,
},
- [0x0BE8]={
+ [0xBE8]={
category="nd",
description="TAMIL DIGIT TWO",
direction="l",
linebreak="nu",
- unicodeslot=0x0BE8,
+ unicodeslot=0xBE8,
},
- [0x0BE9]={
+ [0xBE9]={
category="nd",
description="TAMIL DIGIT THREE",
direction="l",
linebreak="nu",
- unicodeslot=0x0BE9,
+ unicodeslot=0xBE9,
},
- [0x0BEA]={
+ [0xBEA]={
category="nd",
description="TAMIL DIGIT FOUR",
direction="l",
linebreak="nu",
- unicodeslot=0x0BEA,
+ unicodeslot=0xBEA,
},
- [0x0BEB]={
+ [0xBEB]={
category="nd",
description="TAMIL DIGIT FIVE",
direction="l",
linebreak="nu",
- unicodeslot=0x0BEB,
+ unicodeslot=0xBEB,
},
- [0x0BEC]={
+ [0xBEC]={
category="nd",
description="TAMIL DIGIT SIX",
direction="l",
linebreak="nu",
- unicodeslot=0x0BEC,
+ unicodeslot=0xBEC,
},
- [0x0BED]={
+ [0xBED]={
category="nd",
description="TAMIL DIGIT SEVEN",
direction="l",
linebreak="nu",
- unicodeslot=0x0BED,
+ unicodeslot=0xBED,
},
- [0x0BEE]={
+ [0xBEE]={
category="nd",
description="TAMIL DIGIT EIGHT",
direction="l",
linebreak="nu",
- unicodeslot=0x0BEE,
+ unicodeslot=0xBEE,
},
- [0x0BEF]={
+ [0xBEF]={
category="nd",
description="TAMIL DIGIT NINE",
direction="l",
linebreak="nu",
- unicodeslot=0x0BEF,
+ unicodeslot=0xBEF,
},
- [0x0BF0]={
+ [0xBF0]={
category="no",
description="TAMIL NUMBER TEN",
direction="l",
linebreak="al",
- unicodeslot=0x0BF0,
+ unicodeslot=0xBF0,
},
- [0x0BF1]={
+ [0xBF1]={
category="no",
description="TAMIL NUMBER ONE HUNDRED",
direction="l",
linebreak="al",
- unicodeslot=0x0BF1,
+ unicodeslot=0xBF1,
},
- [0x0BF2]={
+ [0xBF2]={
category="no",
description="TAMIL NUMBER ONE THOUSAND",
direction="l",
linebreak="al",
- unicodeslot=0x0BF2,
+ unicodeslot=0xBF2,
},
- [0x0BF3]={
+ [0xBF3]={
category="so",
description="TAMIL DAY SIGN",
direction="on",
linebreak="al",
- unicodeslot=0x0BF3,
+ unicodeslot=0xBF3,
},
- [0x0BF4]={
+ [0xBF4]={
category="so",
description="TAMIL MONTH SIGN",
direction="on",
linebreak="al",
- unicodeslot=0x0BF4,
+ unicodeslot=0xBF4,
},
- [0x0BF5]={
+ [0xBF5]={
category="so",
description="TAMIL YEAR SIGN",
direction="on",
linebreak="al",
- unicodeslot=0x0BF5,
+ unicodeslot=0xBF5,
},
- [0x0BF6]={
+ [0xBF6]={
category="so",
description="TAMIL DEBIT SIGN",
direction="on",
linebreak="al",
- unicodeslot=0x0BF6,
+ unicodeslot=0xBF6,
},
- [0x0BF7]={
+ [0xBF7]={
category="so",
description="TAMIL CREDIT SIGN",
direction="on",
linebreak="al",
- unicodeslot=0x0BF7,
+ unicodeslot=0xBF7,
},
- [0x0BF8]={
+ [0xBF8]={
category="so",
description="TAMIL AS ABOVE SIGN",
direction="on",
linebreak="al",
- unicodeslot=0x0BF8,
+ unicodeslot=0xBF8,
},
- [0x0BF9]={
+ [0xBF9]={
category="sc",
description="TAMIL RUPEE SIGN",
direction="et",
linebreak="pr",
- unicodeslot=0x0BF9,
+ unicodeslot=0xBF9,
},
- [0x0BFA]={
+ [0xBFA]={
category="so",
description="TAMIL NUMBER SIGN",
direction="on",
linebreak="al",
- unicodeslot=0x0BFA,
+ unicodeslot=0xBFA,
},
- [0x0C01]={
+ [0xC00]={
+ category="mn",
+ description="TELUGU SIGN COMBINING CANDRABINDU ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xC00,
+ },
+ [0xC01]={
category="mc",
description="TELUGU SIGN CANDRABINDU",
direction="l",
linebreak="cm",
- unicodeslot=0x0C01,
+ unicodeslot=0xC01,
},
- [0x0C02]={
+ [0xC02]={
category="mc",
description="TELUGU SIGN ANUSVARA",
direction="l",
linebreak="cm",
- unicodeslot=0x0C02,
+ unicodeslot=0xC02,
},
- [0x0C03]={
+ [0xC03]={
category="mc",
description="TELUGU SIGN VISARGA",
direction="l",
linebreak="cm",
- unicodeslot=0x0C03,
+ unicodeslot=0xC03,
},
- [0x0C05]={
+ [0xC05]={
category="lo",
description="TELUGU LETTER A",
direction="l",
linebreak="al",
- unicodeslot=0x0C05,
+ unicodeslot=0xC05,
},
- [0x0C06]={
+ [0xC06]={
category="lo",
description="TELUGU LETTER AA",
direction="l",
linebreak="al",
- unicodeslot=0x0C06,
+ unicodeslot=0xC06,
},
- [0x0C07]={
+ [0xC07]={
category="lo",
description="TELUGU LETTER I",
direction="l",
linebreak="al",
- unicodeslot=0x0C07,
+ unicodeslot=0xC07,
},
- [0x0C08]={
+ [0xC08]={
category="lo",
description="TELUGU LETTER II",
direction="l",
linebreak="al",
- unicodeslot=0x0C08,
+ unicodeslot=0xC08,
},
- [0x0C09]={
+ [0xC09]={
category="lo",
description="TELUGU LETTER U",
direction="l",
linebreak="al",
- unicodeslot=0x0C09,
+ unicodeslot=0xC09,
},
- [0x0C0A]={
+ [0xC0A]={
category="lo",
description="TELUGU LETTER UU",
direction="l",
linebreak="al",
- unicodeslot=0x0C0A,
+ unicodeslot=0xC0A,
},
- [0x0C0B]={
+ [0xC0B]={
category="lo",
description="TELUGU LETTER VOCALIC R",
direction="l",
linebreak="al",
- unicodeslot=0x0C0B,
+ unicodeslot=0xC0B,
},
- [0x0C0C]={
+ [0xC0C]={
category="lo",
description="TELUGU LETTER VOCALIC L",
direction="l",
linebreak="al",
- unicodeslot=0x0C0C,
+ unicodeslot=0xC0C,
},
- [0x0C0E]={
+ [0xC0E]={
category="lo",
description="TELUGU LETTER E",
direction="l",
linebreak="al",
- unicodeslot=0x0C0E,
+ unicodeslot=0xC0E,
},
- [0x0C0F]={
+ [0xC0F]={
category="lo",
description="TELUGU LETTER EE",
direction="l",
linebreak="al",
- unicodeslot=0x0C0F,
+ unicodeslot=0xC0F,
},
- [0x0C10]={
+ [0xC10]={
category="lo",
description="TELUGU LETTER AI",
direction="l",
linebreak="al",
- unicodeslot=0x0C10,
+ unicodeslot=0xC10,
},
- [0x0C12]={
+ [0xC12]={
category="lo",
description="TELUGU LETTER O",
direction="l",
linebreak="al",
- unicodeslot=0x0C12,
+ unicodeslot=0xC12,
},
- [0x0C13]={
+ [0xC13]={
category="lo",
description="TELUGU LETTER OO",
direction="l",
linebreak="al",
- unicodeslot=0x0C13,
+ unicodeslot=0xC13,
},
- [0x0C14]={
+ [0xC14]={
category="lo",
description="TELUGU LETTER AU",
direction="l",
linebreak="al",
- unicodeslot=0x0C14,
+ unicodeslot=0xC14,
},
- [0x0C15]={
+ [0xC15]={
category="lo",
description="TELUGU LETTER KA",
direction="l",
linebreak="al",
- unicodeslot=0x0C15,
+ unicodeslot=0xC15,
},
- [0x0C16]={
+ [0xC16]={
category="lo",
description="TELUGU LETTER KHA",
direction="l",
linebreak="al",
- unicodeslot=0x0C16,
+ unicodeslot=0xC16,
},
- [0x0C17]={
+ [0xC17]={
category="lo",
description="TELUGU LETTER GA",
direction="l",
linebreak="al",
- unicodeslot=0x0C17,
+ unicodeslot=0xC17,
},
- [0x0C18]={
+ [0xC18]={
category="lo",
description="TELUGU LETTER GHA",
direction="l",
linebreak="al",
- unicodeslot=0x0C18,
+ unicodeslot=0xC18,
},
- [0x0C19]={
+ [0xC19]={
category="lo",
description="TELUGU LETTER NGA",
direction="l",
linebreak="al",
- unicodeslot=0x0C19,
+ unicodeslot=0xC19,
},
- [0x0C1A]={
+ [0xC1A]={
category="lo",
description="TELUGU LETTER CA",
direction="l",
linebreak="al",
- unicodeslot=0x0C1A,
+ unicodeslot=0xC1A,
},
- [0x0C1B]={
+ [0xC1B]={
category="lo",
description="TELUGU LETTER CHA",
direction="l",
linebreak="al",
- unicodeslot=0x0C1B,
+ unicodeslot=0xC1B,
},
- [0x0C1C]={
+ [0xC1C]={
category="lo",
description="TELUGU LETTER JA",
direction="l",
linebreak="al",
- unicodeslot=0x0C1C,
+ unicodeslot=0xC1C,
},
- [0x0C1D]={
+ [0xC1D]={
category="lo",
description="TELUGU LETTER JHA",
direction="l",
linebreak="al",
- unicodeslot=0x0C1D,
+ unicodeslot=0xC1D,
},
- [0x0C1E]={
+ [0xC1E]={
category="lo",
description="TELUGU LETTER NYA",
direction="l",
linebreak="al",
- unicodeslot=0x0C1E,
+ unicodeslot=0xC1E,
},
- [0x0C1F]={
+ [0xC1F]={
category="lo",
description="TELUGU LETTER TTA",
direction="l",
linebreak="al",
- unicodeslot=0x0C1F,
+ unicodeslot=0xC1F,
},
- [0x0C20]={
+ [0xC20]={
category="lo",
description="TELUGU LETTER TTHA",
direction="l",
linebreak="al",
- unicodeslot=0x0C20,
+ unicodeslot=0xC20,
},
- [0x0C21]={
+ [0xC21]={
category="lo",
description="TELUGU LETTER DDA",
direction="l",
linebreak="al",
- unicodeslot=0x0C21,
+ unicodeslot=0xC21,
},
- [0x0C22]={
+ [0xC22]={
category="lo",
description="TELUGU LETTER DDHA",
direction="l",
linebreak="al",
- unicodeslot=0x0C22,
+ unicodeslot=0xC22,
},
- [0x0C23]={
+ [0xC23]={
category="lo",
description="TELUGU LETTER NNA",
direction="l",
linebreak="al",
- unicodeslot=0x0C23,
+ unicodeslot=0xC23,
},
- [0x0C24]={
+ [0xC24]={
category="lo",
description="TELUGU LETTER TA",
direction="l",
linebreak="al",
- unicodeslot=0x0C24,
+ unicodeslot=0xC24,
},
- [0x0C25]={
+ [0xC25]={
category="lo",
description="TELUGU LETTER THA",
direction="l",
linebreak="al",
- unicodeslot=0x0C25,
+ unicodeslot=0xC25,
},
- [0x0C26]={
+ [0xC26]={
category="lo",
description="TELUGU LETTER DA",
direction="l",
linebreak="al",
- unicodeslot=0x0C26,
+ unicodeslot=0xC26,
},
- [0x0C27]={
+ [0xC27]={
category="lo",
description="TELUGU LETTER DHA",
direction="l",
linebreak="al",
- unicodeslot=0x0C27,
+ unicodeslot=0xC27,
},
- [0x0C28]={
+ [0xC28]={
category="lo",
description="TELUGU LETTER NA",
direction="l",
linebreak="al",
- unicodeslot=0x0C28,
+ unicodeslot=0xC28,
},
- [0x0C2A]={
+ [0xC2A]={
category="lo",
description="TELUGU LETTER PA",
direction="l",
linebreak="al",
- unicodeslot=0x0C2A,
+ unicodeslot=0xC2A,
},
- [0x0C2B]={
+ [0xC2B]={
category="lo",
description="TELUGU LETTER PHA",
direction="l",
linebreak="al",
- unicodeslot=0x0C2B,
+ unicodeslot=0xC2B,
},
- [0x0C2C]={
+ [0xC2C]={
category="lo",
description="TELUGU LETTER BA",
direction="l",
linebreak="al",
- unicodeslot=0x0C2C,
+ unicodeslot=0xC2C,
},
- [0x0C2D]={
+ [0xC2D]={
category="lo",
description="TELUGU LETTER BHA",
direction="l",
linebreak="al",
- unicodeslot=0x0C2D,
+ unicodeslot=0xC2D,
},
- [0x0C2E]={
+ [0xC2E]={
category="lo",
description="TELUGU LETTER MA",
direction="l",
linebreak="al",
- unicodeslot=0x0C2E,
+ unicodeslot=0xC2E,
},
- [0x0C2F]={
+ [0xC2F]={
category="lo",
description="TELUGU LETTER YA",
direction="l",
linebreak="al",
- unicodeslot=0x0C2F,
+ unicodeslot=0xC2F,
},
- [0x0C30]={
+ [0xC30]={
category="lo",
description="TELUGU LETTER RA",
direction="l",
linebreak="al",
- unicodeslot=0x0C30,
+ unicodeslot=0xC30,
},
- [0x0C31]={
+ [0xC31]={
category="lo",
description="TELUGU LETTER RRA",
direction="l",
linebreak="al",
- unicodeslot=0x0C31,
+ unicodeslot=0xC31,
},
- [0x0C32]={
+ [0xC32]={
category="lo",
description="TELUGU LETTER LA",
direction="l",
linebreak="al",
- unicodeslot=0x0C32,
+ unicodeslot=0xC32,
},
- [0x0C33]={
+ [0xC33]={
category="lo",
description="TELUGU LETTER LLA",
direction="l",
linebreak="al",
- unicodeslot=0x0C33,
+ unicodeslot=0xC33,
+ },
+ [0xC34]={
+ category="lo",
+ description="TELUGU LETTER LLLA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xC34,
},
- [0x0C35]={
+ [0xC35]={
category="lo",
description="TELUGU LETTER VA",
direction="l",
linebreak="al",
- unicodeslot=0x0C35,
+ unicodeslot=0xC35,
},
- [0x0C36]={
+ [0xC36]={
category="lo",
description="TELUGU LETTER SHA",
direction="l",
linebreak="al",
- unicodeslot=0x0C36,
+ unicodeslot=0xC36,
},
- [0x0C37]={
+ [0xC37]={
category="lo",
description="TELUGU LETTER SSA",
direction="l",
linebreak="al",
- unicodeslot=0x0C37,
+ unicodeslot=0xC37,
},
- [0x0C38]={
+ [0xC38]={
category="lo",
description="TELUGU LETTER SA",
direction="l",
linebreak="al",
- unicodeslot=0x0C38,
+ unicodeslot=0xC38,
},
- [0x0C39]={
+ [0xC39]={
category="lo",
description="TELUGU LETTER HA",
direction="l",
linebreak="al",
- unicodeslot=0x0C39,
+ unicodeslot=0xC39,
},
- [0x0C3D]={
+ [0xC3D]={
category="lo",
description="TELUGU SIGN AVAGRAHA",
direction="l",
linebreak="al",
- unicodeslot=0x0C3D,
+ unicodeslot=0xC3D,
},
- [0x0C3E]={
+ [0xC3E]={
category="mn",
description="TELUGU VOWEL SIGN AA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0C3E,
+ unicodeslot=0xC3E,
},
- [0x0C3F]={
+ [0xC3F]={
category="mn",
description="TELUGU VOWEL SIGN I",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0C3F,
+ unicodeslot=0xC3F,
},
- [0x0C40]={
+ [0xC40]={
category="mn",
description="TELUGU VOWEL SIGN II",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0C40,
+ unicodeslot=0xC40,
},
- [0x0C41]={
+ [0xC41]={
category="mc",
description="TELUGU VOWEL SIGN U",
direction="l",
linebreak="cm",
- unicodeslot=0x0C41,
+ unicodeslot=0xC41,
},
- [0x0C42]={
+ [0xC42]={
category="mc",
description="TELUGU VOWEL SIGN UU",
direction="l",
linebreak="cm",
- unicodeslot=0x0C42,
+ unicodeslot=0xC42,
},
- [0x0C43]={
+ [0xC43]={
category="mc",
description="TELUGU VOWEL SIGN VOCALIC R",
direction="l",
linebreak="cm",
- unicodeslot=0x0C43,
+ unicodeslot=0xC43,
},
- [0x0C44]={
+ [0xC44]={
category="mc",
description="TELUGU VOWEL SIGN VOCALIC RR",
direction="l",
linebreak="cm",
- unicodeslot=0x0C44,
+ unicodeslot=0xC44,
},
- [0x0C46]={
+ [0xC46]={
category="mn",
description="TELUGU VOWEL SIGN E",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0C46,
+ unicodeslot=0xC46,
},
- [0x0C47]={
+ [0xC47]={
category="mn",
description="TELUGU VOWEL SIGN EE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0C47,
+ unicodeslot=0xC47,
},
- [0x0C48]={
+ [0xC48]={
category="mn",
description="TELUGU VOWEL SIGN AI",
direction="nsm",
linebreak="cm",
- specials={ "char", 0x0C46, 0x0C56 },
- unicodeslot=0x0C48,
+ specials={ "char", 0xC46, 0xC56 },
+ unicodeslot=0xC48,
},
- [0x0C4A]={
+ [0xC4A]={
category="mn",
description="TELUGU VOWEL SIGN O",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0C4A,
+ unicodeslot=0xC4A,
},
- [0x0C4B]={
+ [0xC4B]={
category="mn",
description="TELUGU VOWEL SIGN OO",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0C4B,
+ unicodeslot=0xC4B,
},
- [0x0C4C]={
+ [0xC4C]={
category="mn",
description="TELUGU VOWEL SIGN AU",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0C4C,
+ unicodeslot=0xC4C,
},
- [0x0C4D]={
+ [0xC4D]={
category="mn",
+ combining=0x9,
description="TELUGU SIGN VIRAMA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0C4D,
+ unicodeslot=0xC4D,
},
- [0x0C55]={
+ [0xC55]={
category="mn",
+ combining=0x54,
description="TELUGU LENGTH MARK",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0C55,
+ unicodeslot=0xC55,
},
- [0x0C56]={
+ [0xC56]={
category="mn",
+ combining=0x5B,
description="TELUGU AI LENGTH MARK",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0C56,
+ unicodeslot=0xC56,
},
- [0x0C58]={
+ [0xC58]={
category="lo",
description="TELUGU LETTER TSA",
direction="l",
linebreak="al",
- unicodeslot=0x0C58,
+ unicodeslot=0xC58,
},
- [0x0C59]={
+ [0xC59]={
category="lo",
description="TELUGU LETTER DZA",
direction="l",
linebreak="al",
- unicodeslot=0x0C59,
+ unicodeslot=0xC59,
},
- [0x0C60]={
+ [0xC60]={
category="lo",
description="TELUGU LETTER VOCALIC RR",
direction="l",
linebreak="al",
- unicodeslot=0x0C60,
+ unicodeslot=0xC60,
},
- [0x0C61]={
+ [0xC61]={
category="lo",
description="TELUGU LETTER VOCALIC LL",
direction="l",
linebreak="al",
- unicodeslot=0x0C61,
+ unicodeslot=0xC61,
},
- [0x0C62]={
+ [0xC62]={
category="mn",
description="TELUGU VOWEL SIGN VOCALIC L",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0C62,
+ unicodeslot=0xC62,
},
- [0x0C63]={
+ [0xC63]={
category="mn",
description="TELUGU VOWEL SIGN VOCALIC LL",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0C63,
+ unicodeslot=0xC63,
},
- [0x0C66]={
+ [0xC66]={
category="nd",
description="TELUGU DIGIT ZERO",
direction="l",
linebreak="nu",
- unicodeslot=0x0C66,
+ unicodeslot=0xC66,
},
- [0x0C67]={
+ [0xC67]={
category="nd",
description="TELUGU DIGIT ONE",
direction="l",
linebreak="nu",
- unicodeslot=0x0C67,
+ unicodeslot=0xC67,
},
- [0x0C68]={
+ [0xC68]={
category="nd",
description="TELUGU DIGIT TWO",
direction="l",
linebreak="nu",
- unicodeslot=0x0C68,
+ unicodeslot=0xC68,
},
- [0x0C69]={
+ [0xC69]={
category="nd",
description="TELUGU DIGIT THREE",
direction="l",
linebreak="nu",
- unicodeslot=0x0C69,
+ unicodeslot=0xC69,
},
- [0x0C6A]={
+ [0xC6A]={
category="nd",
description="TELUGU DIGIT FOUR",
direction="l",
linebreak="nu",
- unicodeslot=0x0C6A,
+ unicodeslot=0xC6A,
},
- [0x0C6B]={
+ [0xC6B]={
category="nd",
description="TELUGU DIGIT FIVE",
direction="l",
linebreak="nu",
- unicodeslot=0x0C6B,
+ unicodeslot=0xC6B,
},
- [0x0C6C]={
+ [0xC6C]={
category="nd",
description="TELUGU DIGIT SIX",
direction="l",
linebreak="nu",
- unicodeslot=0x0C6C,
+ unicodeslot=0xC6C,
},
- [0x0C6D]={
+ [0xC6D]={
category="nd",
description="TELUGU DIGIT SEVEN",
direction="l",
linebreak="nu",
- unicodeslot=0x0C6D,
+ unicodeslot=0xC6D,
},
- [0x0C6E]={
+ [0xC6E]={
category="nd",
description="TELUGU DIGIT EIGHT",
direction="l",
linebreak="nu",
- unicodeslot=0x0C6E,
+ unicodeslot=0xC6E,
},
- [0x0C6F]={
+ [0xC6F]={
category="nd",
description="TELUGU DIGIT NINE",
direction="l",
linebreak="nu",
- unicodeslot=0x0C6F,
+ unicodeslot=0xC6F,
},
- [0x0C78]={
+ [0xC78]={
category="no",
description="TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR",
direction="on",
linebreak="al",
- unicodeslot=0x0C78,
+ unicodeslot=0xC78,
},
- [0x0C79]={
+ [0xC79]={
category="no",
description="TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR",
direction="on",
linebreak="al",
- unicodeslot=0x0C79,
+ unicodeslot=0xC79,
},
- [0x0C7A]={
+ [0xC7A]={
category="no",
description="TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR",
direction="on",
linebreak="al",
- unicodeslot=0x0C7A,
+ unicodeslot=0xC7A,
},
- [0x0C7B]={
+ [0xC7B]={
category="no",
description="TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR",
direction="on",
linebreak="al",
- unicodeslot=0x0C7B,
+ unicodeslot=0xC7B,
},
- [0x0C7C]={
+ [0xC7C]={
category="no",
description="TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR",
direction="on",
linebreak="al",
- unicodeslot=0x0C7C,
+ unicodeslot=0xC7C,
},
- [0x0C7D]={
+ [0xC7D]={
category="no",
description="TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR",
direction="on",
linebreak="al",
- unicodeslot=0x0C7D,
+ unicodeslot=0xC7D,
},
- [0x0C7E]={
+ [0xC7E]={
category="no",
description="TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR",
direction="on",
linebreak="al",
- unicodeslot=0x0C7E,
+ unicodeslot=0xC7E,
},
- [0x0C7F]={
+ [0xC7F]={
category="so",
description="TELUGU SIGN TUUMU",
direction="l",
linebreak="al",
- unicodeslot=0x0C7F,
+ unicodeslot=0xC7F,
},
- [0x0C82]={
+ [0xC81]={
+ category="mn",
+ description="KANNADA SIGN CANDRABINDU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xC81,
+ },
+ [0xC82]={
category="mc",
description="KANNADA SIGN ANUSVARA",
direction="l",
linebreak="cm",
- unicodeslot=0x0C82,
+ unicodeslot=0xC82,
},
- [0x0C83]={
+ [0xC83]={
category="mc",
description="KANNADA SIGN VISARGA",
direction="l",
linebreak="cm",
- unicodeslot=0x0C83,
+ unicodeslot=0xC83,
},
- [0x0C85]={
+ [0xC85]={
category="lo",
description="KANNADA LETTER A",
direction="l",
linebreak="al",
- unicodeslot=0x0C85,
+ unicodeslot=0xC85,
},
- [0x0C86]={
+ [0xC86]={
category="lo",
description="KANNADA LETTER AA",
direction="l",
linebreak="al",
- unicodeslot=0x0C86,
+ unicodeslot=0xC86,
},
- [0x0C87]={
+ [0xC87]={
category="lo",
description="KANNADA LETTER I",
direction="l",
linebreak="al",
- unicodeslot=0x0C87,
+ unicodeslot=0xC87,
},
- [0x0C88]={
+ [0xC88]={
category="lo",
description="KANNADA LETTER II",
direction="l",
linebreak="al",
- unicodeslot=0x0C88,
+ unicodeslot=0xC88,
},
- [0x0C89]={
+ [0xC89]={
category="lo",
description="KANNADA LETTER U",
direction="l",
linebreak="al",
- unicodeslot=0x0C89,
+ unicodeslot=0xC89,
},
- [0x0C8A]={
+ [0xC8A]={
category="lo",
description="KANNADA LETTER UU",
direction="l",
linebreak="al",
- unicodeslot=0x0C8A,
+ unicodeslot=0xC8A,
},
- [0x0C8B]={
+ [0xC8B]={
category="lo",
description="KANNADA LETTER VOCALIC R",
direction="l",
linebreak="al",
- unicodeslot=0x0C8B,
+ unicodeslot=0xC8B,
},
- [0x0C8C]={
+ [0xC8C]={
category="lo",
description="KANNADA LETTER VOCALIC L",
direction="l",
linebreak="al",
- unicodeslot=0x0C8C,
+ unicodeslot=0xC8C,
},
- [0x0C8E]={
+ [0xC8E]={
category="lo",
description="KANNADA LETTER E",
direction="l",
linebreak="al",
- unicodeslot=0x0C8E,
+ unicodeslot=0xC8E,
},
- [0x0C8F]={
+ [0xC8F]={
category="lo",
description="KANNADA LETTER EE",
direction="l",
linebreak="al",
- unicodeslot=0x0C8F,
+ unicodeslot=0xC8F,
},
- [0x0C90]={
+ [0xC90]={
category="lo",
description="KANNADA LETTER AI",
direction="l",
linebreak="al",
- unicodeslot=0x0C90,
+ unicodeslot=0xC90,
},
- [0x0C92]={
+ [0xC92]={
category="lo",
description="KANNADA LETTER O",
direction="l",
linebreak="al",
- unicodeslot=0x0C92,
+ unicodeslot=0xC92,
},
- [0x0C93]={
+ [0xC93]={
category="lo",
description="KANNADA LETTER OO",
direction="l",
linebreak="al",
- unicodeslot=0x0C93,
+ unicodeslot=0xC93,
},
- [0x0C94]={
+ [0xC94]={
category="lo",
description="KANNADA LETTER AU",
direction="l",
linebreak="al",
- unicodeslot=0x0C94,
+ unicodeslot=0xC94,
},
- [0x0C95]={
+ [0xC95]={
category="lo",
description="KANNADA LETTER KA",
direction="l",
linebreak="al",
- unicodeslot=0x0C95,
+ unicodeslot=0xC95,
},
- [0x0C96]={
+ [0xC96]={
category="lo",
description="KANNADA LETTER KHA",
direction="l",
linebreak="al",
- unicodeslot=0x0C96,
+ unicodeslot=0xC96,
},
- [0x0C97]={
+ [0xC97]={
category="lo",
description="KANNADA LETTER GA",
direction="l",
linebreak="al",
- unicodeslot=0x0C97,
+ unicodeslot=0xC97,
},
- [0x0C98]={
+ [0xC98]={
category="lo",
description="KANNADA LETTER GHA",
direction="l",
linebreak="al",
- unicodeslot=0x0C98,
+ unicodeslot=0xC98,
},
- [0x0C99]={
+ [0xC99]={
category="lo",
description="KANNADA LETTER NGA",
direction="l",
linebreak="al",
- unicodeslot=0x0C99,
+ unicodeslot=0xC99,
},
- [0x0C9A]={
+ [0xC9A]={
category="lo",
description="KANNADA LETTER CA",
direction="l",
linebreak="al",
- unicodeslot=0x0C9A,
+ unicodeslot=0xC9A,
},
- [0x0C9B]={
+ [0xC9B]={
category="lo",
description="KANNADA LETTER CHA",
direction="l",
linebreak="al",
- unicodeslot=0x0C9B,
+ unicodeslot=0xC9B,
},
- [0x0C9C]={
+ [0xC9C]={
category="lo",
description="KANNADA LETTER JA",
direction="l",
linebreak="al",
- unicodeslot=0x0C9C,
+ unicodeslot=0xC9C,
},
- [0x0C9D]={
+ [0xC9D]={
category="lo",
description="KANNADA LETTER JHA",
direction="l",
linebreak="al",
- unicodeslot=0x0C9D,
+ unicodeslot=0xC9D,
},
- [0x0C9E]={
+ [0xC9E]={
category="lo",
description="KANNADA LETTER NYA",
direction="l",
linebreak="al",
- unicodeslot=0x0C9E,
+ unicodeslot=0xC9E,
},
- [0x0C9F]={
+ [0xC9F]={
category="lo",
description="KANNADA LETTER TTA",
direction="l",
linebreak="al",
- unicodeslot=0x0C9F,
+ unicodeslot=0xC9F,
},
- [0x0CA0]={
+ [0xCA0]={
category="lo",
description="KANNADA LETTER TTHA",
direction="l",
linebreak="al",
- unicodeslot=0x0CA0,
+ unicodeslot=0xCA0,
},
- [0x0CA1]={
+ [0xCA1]={
category="lo",
description="KANNADA LETTER DDA",
direction="l",
linebreak="al",
- unicodeslot=0x0CA1,
+ unicodeslot=0xCA1,
},
- [0x0CA2]={
+ [0xCA2]={
category="lo",
description="KANNADA LETTER DDHA",
direction="l",
linebreak="al",
- unicodeslot=0x0CA2,
+ unicodeslot=0xCA2,
},
- [0x0CA3]={
+ [0xCA3]={
category="lo",
description="KANNADA LETTER NNA",
direction="l",
linebreak="al",
- unicodeslot=0x0CA3,
+ unicodeslot=0xCA3,
},
- [0x0CA4]={
+ [0xCA4]={
category="lo",
description="KANNADA LETTER TA",
direction="l",
linebreak="al",
- unicodeslot=0x0CA4,
+ unicodeslot=0xCA4,
},
- [0x0CA5]={
+ [0xCA5]={
category="lo",
description="KANNADA LETTER THA",
direction="l",
linebreak="al",
- unicodeslot=0x0CA5,
+ unicodeslot=0xCA5,
},
- [0x0CA6]={
+ [0xCA6]={
category="lo",
description="KANNADA LETTER DA",
direction="l",
linebreak="al",
- unicodeslot=0x0CA6,
+ unicodeslot=0xCA6,
},
- [0x0CA7]={
+ [0xCA7]={
category="lo",
description="KANNADA LETTER DHA",
direction="l",
linebreak="al",
- unicodeslot=0x0CA7,
+ unicodeslot=0xCA7,
},
- [0x0CA8]={
+ [0xCA8]={
category="lo",
description="KANNADA LETTER NA",
direction="l",
linebreak="al",
- unicodeslot=0x0CA8,
+ unicodeslot=0xCA8,
},
- [0x0CAA]={
+ [0xCAA]={
category="lo",
description="KANNADA LETTER PA",
direction="l",
linebreak="al",
- unicodeslot=0x0CAA,
+ unicodeslot=0xCAA,
},
- [0x0CAB]={
+ [0xCAB]={
category="lo",
description="KANNADA LETTER PHA",
direction="l",
linebreak="al",
- unicodeslot=0x0CAB,
+ unicodeslot=0xCAB,
},
- [0x0CAC]={
+ [0xCAC]={
category="lo",
description="KANNADA LETTER BA",
direction="l",
linebreak="al",
- unicodeslot=0x0CAC,
+ unicodeslot=0xCAC,
},
- [0x0CAD]={
+ [0xCAD]={
category="lo",
description="KANNADA LETTER BHA",
direction="l",
linebreak="al",
- unicodeslot=0x0CAD,
+ unicodeslot=0xCAD,
},
- [0x0CAE]={
+ [0xCAE]={
category="lo",
description="KANNADA LETTER MA",
direction="l",
linebreak="al",
- unicodeslot=0x0CAE,
+ unicodeslot=0xCAE,
},
- [0x0CAF]={
+ [0xCAF]={
category="lo",
description="KANNADA LETTER YA",
direction="l",
linebreak="al",
- unicodeslot=0x0CAF,
+ unicodeslot=0xCAF,
},
- [0x0CB0]={
+ [0xCB0]={
category="lo",
description="KANNADA LETTER RA",
direction="l",
linebreak="al",
- unicodeslot=0x0CB0,
+ unicodeslot=0xCB0,
},
- [0x0CB1]={
+ [0xCB1]={
category="lo",
description="KANNADA LETTER RRA",
direction="l",
linebreak="al",
- unicodeslot=0x0CB1,
+ unicodeslot=0xCB1,
},
- [0x0CB2]={
+ [0xCB2]={
category="lo",
description="KANNADA LETTER LA",
direction="l",
linebreak="al",
- unicodeslot=0x0CB2,
+ unicodeslot=0xCB2,
},
- [0x0CB3]={
+ [0xCB3]={
category="lo",
description="KANNADA LETTER LLA",
direction="l",
linebreak="al",
- unicodeslot=0x0CB3,
+ unicodeslot=0xCB3,
},
- [0x0CB5]={
+ [0xCB5]={
category="lo",
description="KANNADA LETTER VA",
direction="l",
linebreak="al",
- unicodeslot=0x0CB5,
+ unicodeslot=0xCB5,
},
- [0x0CB6]={
+ [0xCB6]={
category="lo",
description="KANNADA LETTER SHA",
direction="l",
linebreak="al",
- unicodeslot=0x0CB6,
+ unicodeslot=0xCB6,
},
- [0x0CB7]={
+ [0xCB7]={
category="lo",
description="KANNADA LETTER SSA",
direction="l",
linebreak="al",
- unicodeslot=0x0CB7,
+ unicodeslot=0xCB7,
},
- [0x0CB8]={
+ [0xCB8]={
category="lo",
description="KANNADA LETTER SA",
direction="l",
linebreak="al",
- unicodeslot=0x0CB8,
+ unicodeslot=0xCB8,
},
- [0x0CB9]={
+ [0xCB9]={
category="lo",
description="KANNADA LETTER HA",
direction="l",
linebreak="al",
- unicodeslot=0x0CB9,
+ unicodeslot=0xCB9,
},
- [0x0CBC]={
+ [0xCBC]={
category="mn",
+ combining=0x7,
description="KANNADA SIGN NUKTA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0CBC,
+ unicodeslot=0xCBC,
},
- [0x0CBD]={
+ [0xCBD]={
category="lo",
description="KANNADA SIGN AVAGRAHA",
direction="l",
linebreak="al",
- unicodeslot=0x0CBD,
+ unicodeslot=0xCBD,
},
- [0x0CBE]={
+ [0xCBE]={
category="mc",
description="KANNADA VOWEL SIGN AA",
direction="l",
linebreak="cm",
- unicodeslot=0x0CBE,
+ unicodeslot=0xCBE,
},
- [0x0CBF]={
+ [0xCBF]={
category="mn",
description="KANNADA VOWEL SIGN I",
direction="l",
linebreak="cm",
- unicodeslot=0x0CBF,
+ unicodeslot=0xCBF,
},
- [0x0CC0]={
+ [0xCC0]={
category="mc",
description="KANNADA VOWEL SIGN II",
direction="l",
linebreak="cm",
- specials={ "char", 0x0CBF, 0x0CD5 },
- unicodeslot=0x0CC0,
+ specials={ "char", 0xCBF, 0xCD5 },
+ unicodeslot=0xCC0,
},
- [0x0CC1]={
+ [0xCC1]={
category="mc",
description="KANNADA VOWEL SIGN U",
direction="l",
linebreak="cm",
- unicodeslot=0x0CC1,
+ unicodeslot=0xCC1,
},
- [0x0CC2]={
+ [0xCC2]={
category="mc",
description="KANNADA VOWEL SIGN UU",
direction="l",
linebreak="cm",
- unicodeslot=0x0CC2,
+ unicodeslot=0xCC2,
},
- [0x0CC3]={
+ [0xCC3]={
category="mc",
description="KANNADA VOWEL SIGN VOCALIC R",
direction="l",
linebreak="cm",
- unicodeslot=0x0CC3,
+ unicodeslot=0xCC3,
},
- [0x0CC4]={
+ [0xCC4]={
category="mc",
description="KANNADA VOWEL SIGN VOCALIC RR",
direction="l",
linebreak="cm",
- unicodeslot=0x0CC4,
+ unicodeslot=0xCC4,
},
- [0x0CC6]={
+ [0xCC6]={
category="mn",
description="KANNADA VOWEL SIGN E",
direction="l",
linebreak="cm",
- unicodeslot=0x0CC6,
+ unicodeslot=0xCC6,
},
- [0x0CC7]={
+ [0xCC7]={
category="mc",
description="KANNADA VOWEL SIGN EE",
direction="l",
linebreak="cm",
- specials={ "char", 0x0CC6, 0x0CD5 },
- unicodeslot=0x0CC7,
+ specials={ "char", 0xCC6, 0xCD5 },
+ unicodeslot=0xCC7,
},
- [0x0CC8]={
+ [0xCC8]={
category="mc",
description="KANNADA VOWEL SIGN AI",
direction="l",
linebreak="cm",
- specials={ "char", 0x0CC6, 0x0CD6 },
- unicodeslot=0x0CC8,
+ specials={ "char", 0xCC6, 0xCD6 },
+ unicodeslot=0xCC8,
},
- [0x0CCA]={
+ [0xCCA]={
category="mc",
description="KANNADA VOWEL SIGN O",
direction="l",
linebreak="cm",
- specials={ "char", 0x0CC6, 0x0CC2 },
- unicodeslot=0x0CCA,
+ specials={ "char", 0xCC6, 0xCC2 },
+ unicodeslot=0xCCA,
},
- [0x0CCB]={
+ [0xCCB]={
category="mc",
description="KANNADA VOWEL SIGN OO",
direction="l",
linebreak="cm",
- specials={ "char", 0x0CCA, 0x0CD5 },
- unicodeslot=0x0CCB,
+ specials={ "char", 0xCCA, 0xCD5 },
+ unicodeslot=0xCCB,
},
- [0x0CCC]={
+ [0xCCC]={
category="mn",
description="KANNADA VOWEL SIGN AU",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0CCC,
+ unicodeslot=0xCCC,
},
- [0x0CCD]={
+ [0xCCD]={
category="mn",
+ combining=0x9,
description="KANNADA SIGN VIRAMA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0CCD,
+ unicodeslot=0xCCD,
},
- [0x0CD5]={
+ [0xCD5]={
category="mc",
description="KANNADA LENGTH MARK",
direction="l",
linebreak="cm",
- unicodeslot=0x0CD5,
+ unicodeslot=0xCD5,
},
- [0x0CD6]={
+ [0xCD6]={
category="mc",
description="KANNADA AI LENGTH MARK",
direction="l",
linebreak="cm",
- unicodeslot=0x0CD6,
+ unicodeslot=0xCD6,
},
- [0x0CDE]={
+ [0xCDE]={
category="lo",
description="KANNADA LETTER FA",
direction="l",
linebreak="al",
- unicodeslot=0x0CDE,
+ unicodeslot=0xCDE,
},
- [0x0CE0]={
+ [0xCE0]={
category="lo",
description="KANNADA LETTER VOCALIC RR",
direction="l",
linebreak="al",
- unicodeslot=0x0CE0,
+ unicodeslot=0xCE0,
},
- [0x0CE1]={
+ [0xCE1]={
category="lo",
description="KANNADA LETTER VOCALIC LL",
direction="l",
linebreak="al",
- unicodeslot=0x0CE1,
+ unicodeslot=0xCE1,
},
- [0x0CE2]={
+ [0xCE2]={
category="mn",
description="KANNADA VOWEL SIGN VOCALIC L",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0CE2,
+ unicodeslot=0xCE2,
},
- [0x0CE3]={
+ [0xCE3]={
category="mn",
description="KANNADA VOWEL SIGN VOCALIC LL",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0CE3,
+ unicodeslot=0xCE3,
},
- [0x0CE6]={
+ [0xCE6]={
category="nd",
description="KANNADA DIGIT ZERO",
direction="l",
linebreak="nu",
- unicodeslot=0x0CE6,
+ unicodeslot=0xCE6,
},
- [0x0CE7]={
+ [0xCE7]={
category="nd",
description="KANNADA DIGIT ONE",
direction="l",
linebreak="nu",
- unicodeslot=0x0CE7,
+ unicodeslot=0xCE7,
},
- [0x0CE8]={
+ [0xCE8]={
category="nd",
description="KANNADA DIGIT TWO",
direction="l",
linebreak="nu",
- unicodeslot=0x0CE8,
+ unicodeslot=0xCE8,
},
- [0x0CE9]={
+ [0xCE9]={
category="nd",
description="KANNADA DIGIT THREE",
direction="l",
linebreak="nu",
- unicodeslot=0x0CE9,
+ unicodeslot=0xCE9,
},
- [0x0CEA]={
+ [0xCEA]={
category="nd",
description="KANNADA DIGIT FOUR",
direction="l",
linebreak="nu",
- unicodeslot=0x0CEA,
+ unicodeslot=0xCEA,
},
- [0x0CEB]={
+ [0xCEB]={
category="nd",
description="KANNADA DIGIT FIVE",
direction="l",
linebreak="nu",
- unicodeslot=0x0CEB,
+ unicodeslot=0xCEB,
},
- [0x0CEC]={
+ [0xCEC]={
category="nd",
description="KANNADA DIGIT SIX",
direction="l",
linebreak="nu",
- unicodeslot=0x0CEC,
+ unicodeslot=0xCEC,
},
- [0x0CED]={
+ [0xCED]={
category="nd",
description="KANNADA DIGIT SEVEN",
direction="l",
linebreak="nu",
- unicodeslot=0x0CED,
+ unicodeslot=0xCED,
},
- [0x0CEE]={
+ [0xCEE]={
category="nd",
description="KANNADA DIGIT EIGHT",
direction="l",
linebreak="nu",
- unicodeslot=0x0CEE,
+ unicodeslot=0xCEE,
},
- [0x0CEF]={
+ [0xCEF]={
category="nd",
description="KANNADA DIGIT NINE",
direction="l",
linebreak="nu",
- unicodeslot=0x0CEF,
+ unicodeslot=0xCEF,
},
- [0x0CF1]={
+ [0xCF1]={
category="so",
description="KANNADA SIGN JIHVAMULIYA",
direction="l",
linebreak="al",
- unicodeslot=0x0CF1,
+ unicodeslot=0xCF1,
},
- [0x0CF2]={
+ [0xCF2]={
category="so",
description="KANNADA SIGN UPADHMANIYA",
direction="l",
linebreak="al",
- unicodeslot=0x0CF2,
+ unicodeslot=0xCF2,
+ },
+ [0xD01]={
+ category="mn",
+ description="MALAYALAM SIGN CANDRABINDU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xD01,
},
- [0x0D02]={
+ [0xD02]={
category="mc",
description="MALAYALAM SIGN ANUSVARA",
direction="l",
linebreak="cm",
- unicodeslot=0x0D02,
+ unicodeslot=0xD02,
},
- [0x0D03]={
+ [0xD03]={
category="mc",
description="MALAYALAM SIGN VISARGA",
direction="l",
linebreak="cm",
- unicodeslot=0x0D03,
+ unicodeslot=0xD03,
},
- [0x0D05]={
+ [0xD05]={
category="lo",
description="MALAYALAM LETTER A",
direction="l",
linebreak="al",
- unicodeslot=0x0D05,
+ unicodeslot=0xD05,
},
- [0x0D06]={
+ [0xD06]={
category="lo",
description="MALAYALAM LETTER AA",
direction="l",
linebreak="al",
- unicodeslot=0x0D06,
+ unicodeslot=0xD06,
},
- [0x0D07]={
+ [0xD07]={
category="lo",
description="MALAYALAM LETTER I",
direction="l",
linebreak="al",
- unicodeslot=0x0D07,
+ unicodeslot=0xD07,
},
- [0x0D08]={
+ [0xD08]={
category="lo",
description="MALAYALAM LETTER II",
direction="l",
linebreak="al",
- unicodeslot=0x0D08,
+ unicodeslot=0xD08,
},
- [0x0D09]={
+ [0xD09]={
category="lo",
description="MALAYALAM LETTER U",
direction="l",
linebreak="al",
- unicodeslot=0x0D09,
+ unicodeslot=0xD09,
},
- [0x0D0A]={
+ [0xD0A]={
category="lo",
description="MALAYALAM LETTER UU",
direction="l",
linebreak="al",
- unicodeslot=0x0D0A,
+ unicodeslot=0xD0A,
},
- [0x0D0B]={
+ [0xD0B]={
category="lo",
description="MALAYALAM LETTER VOCALIC R",
direction="l",
linebreak="al",
- unicodeslot=0x0D0B,
+ unicodeslot=0xD0B,
},
- [0x0D0C]={
+ [0xD0C]={
category="lo",
description="MALAYALAM LETTER VOCALIC L",
direction="l",
linebreak="al",
- unicodeslot=0x0D0C,
+ unicodeslot=0xD0C,
},
- [0x0D0E]={
+ [0xD0E]={
category="lo",
description="MALAYALAM LETTER E",
direction="l",
linebreak="al",
- unicodeslot=0x0D0E,
+ unicodeslot=0xD0E,
},
- [0x0D0F]={
+ [0xD0F]={
category="lo",
description="MALAYALAM LETTER EE",
direction="l",
linebreak="al",
- unicodeslot=0x0D0F,
+ unicodeslot=0xD0F,
},
- [0x0D10]={
+ [0xD10]={
category="lo",
description="MALAYALAM LETTER AI",
direction="l",
linebreak="al",
- unicodeslot=0x0D10,
+ unicodeslot=0xD10,
},
- [0x0D12]={
+ [0xD12]={
category="lo",
description="MALAYALAM LETTER O",
direction="l",
linebreak="al",
- unicodeslot=0x0D12,
+ unicodeslot=0xD12,
},
- [0x0D13]={
+ [0xD13]={
category="lo",
description="MALAYALAM LETTER OO",
direction="l",
linebreak="al",
- unicodeslot=0x0D13,
+ unicodeslot=0xD13,
},
- [0x0D14]={
+ [0xD14]={
category="lo",
description="MALAYALAM LETTER AU",
direction="l",
linebreak="al",
- unicodeslot=0x0D14,
+ unicodeslot=0xD14,
},
- [0x0D15]={
+ [0xD15]={
category="lo",
description="MALAYALAM LETTER KA",
direction="l",
linebreak="al",
- unicodeslot=0x0D15,
+ unicodeslot=0xD15,
},
- [0x0D16]={
+ [0xD16]={
category="lo",
description="MALAYALAM LETTER KHA",
direction="l",
linebreak="al",
- unicodeslot=0x0D16,
+ unicodeslot=0xD16,
},
- [0x0D17]={
+ [0xD17]={
category="lo",
description="MALAYALAM LETTER GA",
direction="l",
linebreak="al",
- unicodeslot=0x0D17,
+ unicodeslot=0xD17,
},
- [0x0D18]={
+ [0xD18]={
category="lo",
description="MALAYALAM LETTER GHA",
direction="l",
linebreak="al",
- unicodeslot=0x0D18,
+ unicodeslot=0xD18,
},
- [0x0D19]={
+ [0xD19]={
category="lo",
description="MALAYALAM LETTER NGA",
direction="l",
linebreak="al",
- unicodeslot=0x0D19,
+ unicodeslot=0xD19,
},
- [0x0D1A]={
+ [0xD1A]={
category="lo",
description="MALAYALAM LETTER CA",
direction="l",
linebreak="al",
- unicodeslot=0x0D1A,
+ unicodeslot=0xD1A,
},
- [0x0D1B]={
+ [0xD1B]={
category="lo",
description="MALAYALAM LETTER CHA",
direction="l",
linebreak="al",
- unicodeslot=0x0D1B,
+ unicodeslot=0xD1B,
},
- [0x0D1C]={
+ [0xD1C]={
category="lo",
description="MALAYALAM LETTER JA",
direction="l",
linebreak="al",
- unicodeslot=0x0D1C,
+ unicodeslot=0xD1C,
},
- [0x0D1D]={
+ [0xD1D]={
category="lo",
description="MALAYALAM LETTER JHA",
direction="l",
linebreak="al",
- unicodeslot=0x0D1D,
+ unicodeslot=0xD1D,
},
- [0x0D1E]={
+ [0xD1E]={
category="lo",
description="MALAYALAM LETTER NYA",
direction="l",
linebreak="al",
- unicodeslot=0x0D1E,
+ unicodeslot=0xD1E,
},
- [0x0D1F]={
+ [0xD1F]={
category="lo",
description="MALAYALAM LETTER TTA",
direction="l",
linebreak="al",
- unicodeslot=0x0D1F,
+ unicodeslot=0xD1F,
},
- [0x0D20]={
+ [0xD20]={
category="lo",
description="MALAYALAM LETTER TTHA",
direction="l",
linebreak="al",
- unicodeslot=0x0D20,
+ unicodeslot=0xD20,
},
- [0x0D21]={
+ [0xD21]={
category="lo",
description="MALAYALAM LETTER DDA",
direction="l",
linebreak="al",
- unicodeslot=0x0D21,
+ unicodeslot=0xD21,
},
- [0x0D22]={
+ [0xD22]={
category="lo",
description="MALAYALAM LETTER DDHA",
direction="l",
linebreak="al",
- unicodeslot=0x0D22,
+ unicodeslot=0xD22,
},
- [0x0D23]={
+ [0xD23]={
category="lo",
description="MALAYALAM LETTER NNA",
direction="l",
linebreak="al",
- unicodeslot=0x0D23,
+ unicodeslot=0xD23,
},
- [0x0D24]={
+ [0xD24]={
category="lo",
description="MALAYALAM LETTER TA",
direction="l",
linebreak="al",
- unicodeslot=0x0D24,
+ unicodeslot=0xD24,
},
- [0x0D25]={
+ [0xD25]={
category="lo",
description="MALAYALAM LETTER THA",
direction="l",
linebreak="al",
- unicodeslot=0x0D25,
+ unicodeslot=0xD25,
},
- [0x0D26]={
+ [0xD26]={
category="lo",
description="MALAYALAM LETTER DA",
direction="l",
linebreak="al",
- unicodeslot=0x0D26,
+ unicodeslot=0xD26,
},
- [0x0D27]={
+ [0xD27]={
category="lo",
description="MALAYALAM LETTER DHA",
direction="l",
linebreak="al",
- unicodeslot=0x0D27,
+ unicodeslot=0xD27,
},
- [0x0D28]={
+ [0xD28]={
category="lo",
description="MALAYALAM LETTER NA",
direction="l",
linebreak="al",
- unicodeslot=0x0D28,
+ unicodeslot=0xD28,
},
- [0x0D29]={
+ [0xD29]={
category="lo",
description="MALAYALAM LETTER NNNA",
direction="l",
linebreak="al",
- unicodeslot=0x0D29,
+ unicodeslot=0xD29,
},
- [0x0D2A]={
+ [0xD2A]={
category="lo",
description="MALAYALAM LETTER PA",
direction="l",
linebreak="al",
- unicodeslot=0x0D2A,
+ unicodeslot=0xD2A,
},
- [0x0D2B]={
+ [0xD2B]={
category="lo",
description="MALAYALAM LETTER PHA",
direction="l",
linebreak="al",
- unicodeslot=0x0D2B,
+ unicodeslot=0xD2B,
},
- [0x0D2C]={
+ [0xD2C]={
category="lo",
description="MALAYALAM LETTER BA",
direction="l",
linebreak="al",
- unicodeslot=0x0D2C,
+ unicodeslot=0xD2C,
},
- [0x0D2D]={
+ [0xD2D]={
category="lo",
description="MALAYALAM LETTER BHA",
direction="l",
linebreak="al",
- unicodeslot=0x0D2D,
+ unicodeslot=0xD2D,
},
- [0x0D2E]={
+ [0xD2E]={
category="lo",
description="MALAYALAM LETTER MA",
direction="l",
linebreak="al",
- unicodeslot=0x0D2E,
+ unicodeslot=0xD2E,
},
- [0x0D2F]={
+ [0xD2F]={
category="lo",
description="MALAYALAM LETTER YA",
direction="l",
linebreak="al",
- unicodeslot=0x0D2F,
+ unicodeslot=0xD2F,
},
- [0x0D30]={
+ [0xD30]={
category="lo",
description="MALAYALAM LETTER RA",
direction="l",
linebreak="al",
- unicodeslot=0x0D30,
+ unicodeslot=0xD30,
},
- [0x0D31]={
+ [0xD31]={
category="lo",
description="MALAYALAM LETTER RRA",
direction="l",
linebreak="al",
- unicodeslot=0x0D31,
+ unicodeslot=0xD31,
},
- [0x0D32]={
+ [0xD32]={
category="lo",
description="MALAYALAM LETTER LA",
direction="l",
linebreak="al",
- unicodeslot=0x0D32,
+ unicodeslot=0xD32,
},
- [0x0D33]={
+ [0xD33]={
category="lo",
description="MALAYALAM LETTER LLA",
direction="l",
linebreak="al",
- unicodeslot=0x0D33,
+ unicodeslot=0xD33,
},
- [0x0D34]={
+ [0xD34]={
category="lo",
description="MALAYALAM LETTER LLLA",
direction="l",
linebreak="al",
- unicodeslot=0x0D34,
+ unicodeslot=0xD34,
},
- [0x0D35]={
+ [0xD35]={
category="lo",
description="MALAYALAM LETTER VA",
direction="l",
linebreak="al",
- unicodeslot=0x0D35,
+ unicodeslot=0xD35,
},
- [0x0D36]={
+ [0xD36]={
category="lo",
description="MALAYALAM LETTER SHA",
direction="l",
linebreak="al",
- unicodeslot=0x0D36,
+ unicodeslot=0xD36,
},
- [0x0D37]={
+ [0xD37]={
category="lo",
description="MALAYALAM LETTER SSA",
direction="l",
linebreak="al",
- unicodeslot=0x0D37,
+ unicodeslot=0xD37,
},
- [0x0D38]={
+ [0xD38]={
category="lo",
description="MALAYALAM LETTER SA",
direction="l",
linebreak="al",
- unicodeslot=0x0D38,
+ unicodeslot=0xD38,
},
- [0x0D39]={
+ [0xD39]={
category="lo",
description="MALAYALAM LETTER HA",
direction="l",
linebreak="al",
- unicodeslot=0x0D39,
+ unicodeslot=0xD39,
},
- [0x0D3A]={
+ [0xD3A]={
category="lo",
description="MALAYALAM LETTER TTTA",
direction="l",
linebreak="al",
- unicodeslot=0x0D3A,
+ unicodeslot=0xD3A,
},
- [0x0D3D]={
+ [0xD3D]={
category="lo",
description="MALAYALAM SIGN AVAGRAHA",
direction="l",
linebreak="al",
- unicodeslot=0x0D3D,
+ unicodeslot=0xD3D,
},
- [0x0D3E]={
+ [0xD3E]={
category="mc",
description="MALAYALAM VOWEL SIGN AA",
direction="l",
linebreak="cm",
- unicodeslot=0x0D3E,
+ unicodeslot=0xD3E,
},
- [0x0D3F]={
+ [0xD3F]={
category="mc",
description="MALAYALAM VOWEL SIGN I",
direction="l",
linebreak="cm",
- unicodeslot=0x0D3F,
+ unicodeslot=0xD3F,
},
- [0x0D40]={
+ [0xD40]={
category="mc",
description="MALAYALAM VOWEL SIGN II",
direction="l",
linebreak="cm",
- unicodeslot=0x0D40,
+ unicodeslot=0xD40,
},
- [0x0D41]={
+ [0xD41]={
category="mn",
description="MALAYALAM VOWEL SIGN U",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0D41,
+ unicodeslot=0xD41,
},
- [0x0D42]={
+ [0xD42]={
category="mn",
description="MALAYALAM VOWEL SIGN UU",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0D42,
+ unicodeslot=0xD42,
},
- [0x0D43]={
+ [0xD43]={
category="mn",
description="MALAYALAM VOWEL SIGN VOCALIC R",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0D43,
+ unicodeslot=0xD43,
},
- [0x0D44]={
+ [0xD44]={
category="mn",
description="MALAYALAM VOWEL SIGN VOCALIC RR",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0D44,
+ unicodeslot=0xD44,
},
- [0x0D46]={
+ [0xD46]={
category="mc",
description="MALAYALAM VOWEL SIGN E",
direction="l",
linebreak="cm",
- unicodeslot=0x0D46,
+ unicodeslot=0xD46,
},
- [0x0D47]={
+ [0xD47]={
category="mc",
description="MALAYALAM VOWEL SIGN EE",
direction="l",
linebreak="cm",
- unicodeslot=0x0D47,
+ unicodeslot=0xD47,
},
- [0x0D48]={
+ [0xD48]={
category="mc",
description="MALAYALAM VOWEL SIGN AI",
direction="l",
linebreak="cm",
- unicodeslot=0x0D48,
+ unicodeslot=0xD48,
},
- [0x0D4A]={
+ [0xD4A]={
category="mc",
description="MALAYALAM VOWEL SIGN O",
direction="l",
linebreak="cm",
- specials={ "char", 0x0D46, 0x0D3E },
- unicodeslot=0x0D4A,
+ specials={ "char", 0xD46, 0xD3E },
+ unicodeslot=0xD4A,
},
- [0x0D4B]={
+ [0xD4B]={
category="mc",
description="MALAYALAM VOWEL SIGN OO",
direction="l",
linebreak="cm",
- specials={ "char", 0x0D47, 0x0D3E },
- unicodeslot=0x0D4B,
+ specials={ "char", 0xD47, 0xD3E },
+ unicodeslot=0xD4B,
},
- [0x0D4C]={
+ [0xD4C]={
category="mc",
description="MALAYALAM VOWEL SIGN AU",
direction="l",
linebreak="cm",
- specials={ "char", 0x0D46, 0x0D57 },
- unicodeslot=0x0D4C,
+ specials={ "char", 0xD46, 0xD57 },
+ unicodeslot=0xD4C,
},
- [0x0D4D]={
+ [0xD4D]={
category="mn",
+ combining=0x9,
description="MALAYALAM SIGN VIRAMA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0D4D,
+ unicodeslot=0xD4D,
},
- [0x0D4E]={
+ [0xD4E]={
category="lo",
description="MALAYALAM LETTER DOT REPH",
direction="l",
linebreak="al",
- unicodeslot=0x0D4E,
+ unicodeslot=0xD4E,
},
- [0x0D57]={
+ [0xD57]={
category="mc",
description="MALAYALAM AU LENGTH MARK",
direction="l",
linebreak="cm",
- unicodeslot=0x0D57,
+ unicodeslot=0xD57,
},
- [0x0D60]={
+ [0xD60]={
category="lo",
description="MALAYALAM LETTER VOCALIC RR",
direction="l",
linebreak="al",
- unicodeslot=0x0D60,
+ unicodeslot=0xD60,
},
- [0x0D61]={
+ [0xD61]={
category="lo",
description="MALAYALAM LETTER VOCALIC LL",
direction="l",
linebreak="al",
- unicodeslot=0x0D61,
+ unicodeslot=0xD61,
},
- [0x0D62]={
+ [0xD62]={
category="mn",
description="MALAYALAM VOWEL SIGN VOCALIC L",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0D62,
+ unicodeslot=0xD62,
},
- [0x0D63]={
+ [0xD63]={
category="mn",
description="MALAYALAM VOWEL SIGN VOCALIC LL",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0D63,
+ unicodeslot=0xD63,
},
- [0x0D66]={
+ [0xD66]={
category="nd",
description="MALAYALAM DIGIT ZERO",
direction="l",
linebreak="nu",
- unicodeslot=0x0D66,
+ unicodeslot=0xD66,
},
- [0x0D67]={
+ [0xD67]={
category="nd",
description="MALAYALAM DIGIT ONE",
direction="l",
linebreak="nu",
- unicodeslot=0x0D67,
+ unicodeslot=0xD67,
},
- [0x0D68]={
+ [0xD68]={
category="nd",
description="MALAYALAM DIGIT TWO",
direction="l",
linebreak="nu",
- unicodeslot=0x0D68,
+ unicodeslot=0xD68,
},
- [0x0D69]={
+ [0xD69]={
category="nd",
description="MALAYALAM DIGIT THREE",
direction="l",
linebreak="nu",
- unicodeslot=0x0D69,
+ unicodeslot=0xD69,
},
- [0x0D6A]={
+ [0xD6A]={
category="nd",
description="MALAYALAM DIGIT FOUR",
direction="l",
linebreak="nu",
- unicodeslot=0x0D6A,
+ unicodeslot=0xD6A,
},
- [0x0D6B]={
+ [0xD6B]={
category="nd",
description="MALAYALAM DIGIT FIVE",
direction="l",
linebreak="nu",
- unicodeslot=0x0D6B,
+ unicodeslot=0xD6B,
},
- [0x0D6C]={
+ [0xD6C]={
category="nd",
description="MALAYALAM DIGIT SIX",
direction="l",
linebreak="nu",
- unicodeslot=0x0D6C,
+ unicodeslot=0xD6C,
},
- [0x0D6D]={
+ [0xD6D]={
category="nd",
description="MALAYALAM DIGIT SEVEN",
direction="l",
linebreak="nu",
- unicodeslot=0x0D6D,
+ unicodeslot=0xD6D,
},
- [0x0D6E]={
+ [0xD6E]={
category="nd",
description="MALAYALAM DIGIT EIGHT",
direction="l",
linebreak="nu",
- unicodeslot=0x0D6E,
+ unicodeslot=0xD6E,
},
- [0x0D6F]={
+ [0xD6F]={
category="nd",
description="MALAYALAM DIGIT NINE",
direction="l",
linebreak="nu",
- unicodeslot=0x0D6F,
+ unicodeslot=0xD6F,
},
- [0x0D70]={
+ [0xD70]={
category="no",
description="MALAYALAM NUMBER TEN",
direction="l",
linebreak="al",
- unicodeslot=0x0D70,
+ unicodeslot=0xD70,
},
- [0x0D71]={
+ [0xD71]={
category="no",
description="MALAYALAM NUMBER ONE HUNDRED",
direction="l",
linebreak="al",
- unicodeslot=0x0D71,
+ unicodeslot=0xD71,
},
- [0x0D72]={
+ [0xD72]={
category="no",
description="MALAYALAM NUMBER ONE THOUSAND",
direction="l",
linebreak="al",
- unicodeslot=0x0D72,
+ unicodeslot=0xD72,
},
- [0x0D73]={
+ [0xD73]={
category="no",
description="MALAYALAM FRACTION ONE QUARTER",
direction="l",
linebreak="al",
- unicodeslot=0x0D73,
+ unicodeslot=0xD73,
},
- [0x0D74]={
+ [0xD74]={
category="no",
description="MALAYALAM FRACTION ONE HALF",
direction="l",
linebreak="al",
- unicodeslot=0x0D74,
+ unicodeslot=0xD74,
},
- [0x0D75]={
+ [0xD75]={
category="no",
description="MALAYALAM FRACTION THREE QUARTERS",
direction="l",
linebreak="al",
- unicodeslot=0x0D75,
+ unicodeslot=0xD75,
},
- [0x0D79]={
+ [0xD79]={
category="so",
description="MALAYALAM DATE MARK",
direction="l",
linebreak="po",
- unicodeslot=0x0D79,
+ unicodeslot=0xD79,
},
- [0x0D7A]={
+ [0xD7A]={
category="lo",
description="MALAYALAM LETTER CHILLU NN",
direction="l",
linebreak="al",
- unicodeslot=0x0D7A,
+ unicodeslot=0xD7A,
},
- [0x0D7B]={
+ [0xD7B]={
category="lo",
description="MALAYALAM LETTER CHILLU N",
direction="l",
linebreak="al",
- unicodeslot=0x0D7B,
+ unicodeslot=0xD7B,
},
- [0x0D7C]={
+ [0xD7C]={
category="lo",
description="MALAYALAM LETTER CHILLU RR",
direction="l",
linebreak="al",
- unicodeslot=0x0D7C,
+ unicodeslot=0xD7C,
},
- [0x0D7D]={
+ [0xD7D]={
category="lo",
description="MALAYALAM LETTER CHILLU L",
direction="l",
linebreak="al",
- unicodeslot=0x0D7D,
+ unicodeslot=0xD7D,
},
- [0x0D7E]={
+ [0xD7E]={
category="lo",
description="MALAYALAM LETTER CHILLU LL",
direction="l",
linebreak="al",
- unicodeslot=0x0D7E,
+ unicodeslot=0xD7E,
},
- [0x0D7F]={
+ [0xD7F]={
category="lo",
description="MALAYALAM LETTER CHILLU K",
direction="l",
linebreak="al",
- unicodeslot=0x0D7F,
+ unicodeslot=0xD7F,
},
- [0x0D82]={
+ [0xD82]={
category="mc",
description="SINHALA SIGN ANUSVARAYA",
direction="l",
linebreak="cm",
- unicodeslot=0x0D82,
+ unicodeslot=0xD82,
},
- [0x0D83]={
+ [0xD83]={
category="mc",
description="SINHALA SIGN VISARGAYA",
direction="l",
linebreak="cm",
- unicodeslot=0x0D83,
+ unicodeslot=0xD83,
},
- [0x0D85]={
+ [0xD85]={
category="lo",
description="SINHALA LETTER AYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0D85,
+ unicodeslot=0xD85,
},
- [0x0D86]={
+ [0xD86]={
category="lo",
description="SINHALA LETTER AAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0D86,
+ unicodeslot=0xD86,
},
- [0x0D87]={
+ [0xD87]={
category="lo",
description="SINHALA LETTER AEYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0D87,
+ unicodeslot=0xD87,
},
- [0x0D88]={
+ [0xD88]={
category="lo",
description="SINHALA LETTER AEEYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0D88,
+ unicodeslot=0xD88,
},
- [0x0D89]={
+ [0xD89]={
category="lo",
description="SINHALA LETTER IYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0D89,
+ unicodeslot=0xD89,
},
- [0x0D8A]={
+ [0xD8A]={
category="lo",
description="SINHALA LETTER IIYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0D8A,
+ unicodeslot=0xD8A,
},
- [0x0D8B]={
+ [0xD8B]={
category="lo",
description="SINHALA LETTER UYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0D8B,
+ unicodeslot=0xD8B,
},
- [0x0D8C]={
+ [0xD8C]={
category="lo",
description="SINHALA LETTER UUYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0D8C,
+ unicodeslot=0xD8C,
},
- [0x0D8D]={
+ [0xD8D]={
category="lo",
description="SINHALA LETTER IRUYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0D8D,
+ unicodeslot=0xD8D,
},
- [0x0D8E]={
+ [0xD8E]={
category="lo",
description="SINHALA LETTER IRUUYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0D8E,
+ unicodeslot=0xD8E,
},
- [0x0D8F]={
+ [0xD8F]={
category="lo",
description="SINHALA LETTER ILUYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0D8F,
+ unicodeslot=0xD8F,
},
- [0x0D90]={
+ [0xD90]={
category="lo",
description="SINHALA LETTER ILUUYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0D90,
+ unicodeslot=0xD90,
},
- [0x0D91]={
+ [0xD91]={
category="lo",
description="SINHALA LETTER EYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0D91,
+ unicodeslot=0xD91,
},
- [0x0D92]={
+ [0xD92]={
category="lo",
description="SINHALA LETTER EEYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0D92,
+ unicodeslot=0xD92,
},
- [0x0D93]={
+ [0xD93]={
category="lo",
description="SINHALA LETTER AIYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0D93,
+ unicodeslot=0xD93,
},
- [0x0D94]={
+ [0xD94]={
category="lo",
description="SINHALA LETTER OYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0D94,
+ unicodeslot=0xD94,
},
- [0x0D95]={
+ [0xD95]={
category="lo",
description="SINHALA LETTER OOYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0D95,
+ unicodeslot=0xD95,
},
- [0x0D96]={
+ [0xD96]={
category="lo",
description="SINHALA LETTER AUYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0D96,
+ unicodeslot=0xD96,
},
- [0x0D9A]={
+ [0xD9A]={
category="lo",
description="SINHALA LETTER ALPAPRAANA KAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0D9A,
+ unicodeslot=0xD9A,
},
- [0x0D9B]={
+ [0xD9B]={
category="lo",
description="SINHALA LETTER MAHAAPRAANA KAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0D9B,
+ unicodeslot=0xD9B,
},
- [0x0D9C]={
+ [0xD9C]={
category="lo",
description="SINHALA LETTER ALPAPRAANA GAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0D9C,
+ unicodeslot=0xD9C,
},
- [0x0D9D]={
+ [0xD9D]={
category="lo",
description="SINHALA LETTER MAHAAPRAANA GAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0D9D,
+ unicodeslot=0xD9D,
},
- [0x0D9E]={
+ [0xD9E]={
category="lo",
description="SINHALA LETTER KANTAJA NAASIKYAYA",
direction="l",
linebreak="al",
- unicodeslot=0x0D9E,
+ unicodeslot=0xD9E,
},
- [0x0D9F]={
+ [0xD9F]={
category="lo",
description="SINHALA LETTER SANYAKA GAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0D9F,
+ unicodeslot=0xD9F,
},
- [0x0DA0]={
+ [0xDA0]={
category="lo",
description="SINHALA LETTER ALPAPRAANA CAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DA0,
+ unicodeslot=0xDA0,
},
- [0x0DA1]={
+ [0xDA1]={
category="lo",
description="SINHALA LETTER MAHAAPRAANA CAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DA1,
+ unicodeslot=0xDA1,
},
- [0x0DA2]={
+ [0xDA2]={
category="lo",
description="SINHALA LETTER ALPAPRAANA JAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DA2,
+ unicodeslot=0xDA2,
},
- [0x0DA3]={
+ [0xDA3]={
category="lo",
description="SINHALA LETTER MAHAAPRAANA JAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DA3,
+ unicodeslot=0xDA3,
},
- [0x0DA4]={
+ [0xDA4]={
category="lo",
description="SINHALA LETTER TAALUJA NAASIKYAYA",
direction="l",
linebreak="al",
- unicodeslot=0x0DA4,
+ unicodeslot=0xDA4,
},
- [0x0DA5]={
+ [0xDA5]={
category="lo",
description="SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA",
direction="l",
linebreak="al",
- unicodeslot=0x0DA5,
+ unicodeslot=0xDA5,
},
- [0x0DA6]={
+ [0xDA6]={
category="lo",
description="SINHALA LETTER SANYAKA JAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DA6,
+ unicodeslot=0xDA6,
},
- [0x0DA7]={
+ [0xDA7]={
category="lo",
description="SINHALA LETTER ALPAPRAANA TTAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DA7,
+ unicodeslot=0xDA7,
},
- [0x0DA8]={
+ [0xDA8]={
category="lo",
description="SINHALA LETTER MAHAAPRAANA TTAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DA8,
+ unicodeslot=0xDA8,
},
- [0x0DA9]={
+ [0xDA9]={
category="lo",
description="SINHALA LETTER ALPAPRAANA DDAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DA9,
+ unicodeslot=0xDA9,
},
- [0x0DAA]={
+ [0xDAA]={
category="lo",
description="SINHALA LETTER MAHAAPRAANA DDAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DAA,
+ unicodeslot=0xDAA,
},
- [0x0DAB]={
+ [0xDAB]={
category="lo",
description="SINHALA LETTER MUURDHAJA NAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DAB,
+ unicodeslot=0xDAB,
},
- [0x0DAC]={
+ [0xDAC]={
category="lo",
description="SINHALA LETTER SANYAKA DDAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DAC,
+ unicodeslot=0xDAC,
},
- [0x0DAD]={
+ [0xDAD]={
category="lo",
description="SINHALA LETTER ALPAPRAANA TAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DAD,
+ unicodeslot=0xDAD,
},
- [0x0DAE]={
+ [0xDAE]={
category="lo",
description="SINHALA LETTER MAHAAPRAANA TAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DAE,
+ unicodeslot=0xDAE,
},
- [0x0DAF]={
+ [0xDAF]={
category="lo",
description="SINHALA LETTER ALPAPRAANA DAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DAF,
+ unicodeslot=0xDAF,
},
- [0x0DB0]={
+ [0xDB0]={
category="lo",
description="SINHALA LETTER MAHAAPRAANA DAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DB0,
+ unicodeslot=0xDB0,
},
- [0x0DB1]={
+ [0xDB1]={
category="lo",
description="SINHALA LETTER DANTAJA NAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DB1,
+ unicodeslot=0xDB1,
},
- [0x0DB3]={
+ [0xDB3]={
category="lo",
description="SINHALA LETTER SANYAKA DAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DB3,
+ unicodeslot=0xDB3,
},
- [0x0DB4]={
+ [0xDB4]={
category="lo",
description="SINHALA LETTER ALPAPRAANA PAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DB4,
+ unicodeslot=0xDB4,
},
- [0x0DB5]={
+ [0xDB5]={
category="lo",
description="SINHALA LETTER MAHAAPRAANA PAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DB5,
+ unicodeslot=0xDB5,
},
- [0x0DB6]={
+ [0xDB6]={
category="lo",
description="SINHALA LETTER ALPAPRAANA BAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DB6,
+ unicodeslot=0xDB6,
},
- [0x0DB7]={
+ [0xDB7]={
category="lo",
description="SINHALA LETTER MAHAAPRAANA BAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DB7,
+ unicodeslot=0xDB7,
},
- [0x0DB8]={
+ [0xDB8]={
category="lo",
description="SINHALA LETTER MAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DB8,
+ unicodeslot=0xDB8,
},
- [0x0DB9]={
+ [0xDB9]={
category="lo",
description="SINHALA LETTER AMBA BAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DB9,
+ unicodeslot=0xDB9,
},
- [0x0DBA]={
+ [0xDBA]={
category="lo",
description="SINHALA LETTER YAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DBA,
+ unicodeslot=0xDBA,
},
- [0x0DBB]={
+ [0xDBB]={
category="lo",
description="SINHALA LETTER RAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DBB,
+ unicodeslot=0xDBB,
},
- [0x0DBD]={
+ [0xDBD]={
category="lo",
description="SINHALA LETTER DANTAJA LAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DBD,
+ unicodeslot=0xDBD,
},
- [0x0DC0]={
+ [0xDC0]={
category="lo",
description="SINHALA LETTER VAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DC0,
+ unicodeslot=0xDC0,
},
- [0x0DC1]={
+ [0xDC1]={
category="lo",
description="SINHALA LETTER TAALUJA SAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DC1,
+ unicodeslot=0xDC1,
},
- [0x0DC2]={
+ [0xDC2]={
category="lo",
description="SINHALA LETTER MUURDHAJA SAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DC2,
+ unicodeslot=0xDC2,
},
- [0x0DC3]={
+ [0xDC3]={
category="lo",
description="SINHALA LETTER DANTAJA SAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DC3,
+ unicodeslot=0xDC3,
},
- [0x0DC4]={
+ [0xDC4]={
category="lo",
description="SINHALA LETTER HAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DC4,
+ unicodeslot=0xDC4,
},
- [0x0DC5]={
+ [0xDC5]={
category="lo",
description="SINHALA LETTER MUURDHAJA LAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DC5,
+ unicodeslot=0xDC5,
},
- [0x0DC6]={
+ [0xDC6]={
category="lo",
description="SINHALA LETTER FAYANNA",
direction="l",
linebreak="al",
- unicodeslot=0x0DC6,
+ unicodeslot=0xDC6,
},
- [0x0DCA]={
+ [0xDCA]={
category="mn",
+ combining=0x9,
description="SINHALA SIGN AL-LAKUNA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0DCA,
+ unicodeslot=0xDCA,
},
- [0x0DCF]={
+ [0xDCF]={
category="mc",
description="SINHALA VOWEL SIGN AELA-PILLA",
direction="l",
linebreak="cm",
- unicodeslot=0x0DCF,
+ unicodeslot=0xDCF,
},
- [0x0DD0]={
+ [0xDD0]={
category="mc",
description="SINHALA VOWEL SIGN KETTI AEDA-PILLA",
direction="l",
linebreak="cm",
- unicodeslot=0x0DD0,
+ unicodeslot=0xDD0,
},
- [0x0DD1]={
+ [0xDD1]={
category="mc",
description="SINHALA VOWEL SIGN DIGA AEDA-PILLA",
direction="l",
linebreak="cm",
- unicodeslot=0x0DD1,
+ unicodeslot=0xDD1,
},
- [0x0DD2]={
+ [0xDD2]={
category="mn",
description="SINHALA VOWEL SIGN KETTI IS-PILLA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0DD2,
+ unicodeslot=0xDD2,
},
- [0x0DD3]={
+ [0xDD3]={
category="mn",
description="SINHALA VOWEL SIGN DIGA IS-PILLA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0DD3,
+ unicodeslot=0xDD3,
},
- [0x0DD4]={
+ [0xDD4]={
category="mn",
description="SINHALA VOWEL SIGN KETTI PAA-PILLA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0DD4,
+ unicodeslot=0xDD4,
},
- [0x0DD6]={
+ [0xDD6]={
category="mn",
description="SINHALA VOWEL SIGN DIGA PAA-PILLA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0DD6,
+ unicodeslot=0xDD6,
},
- [0x0DD8]={
+ [0xDD8]={
category="mc",
description="SINHALA VOWEL SIGN GAETTA-PILLA",
direction="l",
linebreak="cm",
- unicodeslot=0x0DD8,
+ unicodeslot=0xDD8,
},
- [0x0DD9]={
+ [0xDD9]={
category="mc",
description="SINHALA VOWEL SIGN KOMBUVA",
direction="l",
linebreak="cm",
- unicodeslot=0x0DD9,
+ unicodeslot=0xDD9,
},
- [0x0DDA]={
+ [0xDDA]={
category="mc",
description="SINHALA VOWEL SIGN DIGA KOMBUVA",
direction="l",
linebreak="cm",
- specials={ "char", 0x0DD9, 0x0DCA },
- unicodeslot=0x0DDA,
+ specials={ "char", 0xDD9, 0xDCA },
+ unicodeslot=0xDDA,
},
- [0x0DDB]={
+ [0xDDB]={
category="mc",
description="SINHALA VOWEL SIGN KOMBU DEKA",
direction="l",
linebreak="cm",
- unicodeslot=0x0DDB,
+ unicodeslot=0xDDB,
},
- [0x0DDC]={
+ [0xDDC]={
category="mc",
description="SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA",
direction="l",
linebreak="cm",
- specials={ "char", 0x0DD9, 0x0DCF },
- unicodeslot=0x0DDC,
+ specials={ "char", 0xDD9, 0xDCF },
+ unicodeslot=0xDDC,
},
- [0x0DDD]={
+ [0xDDD]={
category="mc",
description="SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA",
direction="l",
linebreak="cm",
- specials={ "char", 0x0DDC, 0x0DCA },
- unicodeslot=0x0DDD,
+ specials={ "char", 0xDDC, 0xDCA },
+ unicodeslot=0xDDD,
},
- [0x0DDE]={
+ [0xDDE]={
category="mc",
description="SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA",
direction="l",
linebreak="cm",
- specials={ "char", 0x0DD9, 0x0DDF },
- unicodeslot=0x0DDE,
+ specials={ "char", 0xDD9, 0xDDF },
+ unicodeslot=0xDDE,
},
- [0x0DDF]={
+ [0xDDF]={
category="mc",
description="SINHALA VOWEL SIGN GAYANUKITTA",
direction="l",
linebreak="cm",
- unicodeslot=0x0DDF,
+ unicodeslot=0xDDF,
+ },
+ [0xDE6]={
+ category="nd",
+ description="SINHALA LITH DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0xDE6,
},
- [0x0DF2]={
+ [0xDE7]={
+ category="nd",
+ description="SINHALA LITH DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0xDE7,
+ },
+ [0xDE8]={
+ category="nd",
+ description="SINHALA LITH DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0xDE8,
+ },
+ [0xDE9]={
+ category="nd",
+ description="SINHALA LITH DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0xDE9,
+ },
+ [0xDEA]={
+ category="nd",
+ description="SINHALA LITH DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0xDEA,
+ },
+ [0xDEB]={
+ category="nd",
+ description="SINHALA LITH DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0xDEB,
+ },
+ [0xDEC]={
+ category="nd",
+ description="SINHALA LITH DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0xDEC,
+ },
+ [0xDED]={
+ category="nd",
+ description="SINHALA LITH DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0xDED,
+ },
+ [0xDEE]={
+ category="nd",
+ description="SINHALA LITH DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0xDEE,
+ },
+ [0xDEF]={
+ category="nd",
+ description="SINHALA LITH DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0xDEF,
+ },
+ [0xDF2]={
category="mc",
description="SINHALA VOWEL SIGN DIGA GAETTA-PILLA",
direction="l",
linebreak="cm",
- unicodeslot=0x0DF2,
+ unicodeslot=0xDF2,
},
- [0x0DF3]={
+ [0xDF3]={
category="mc",
description="SINHALA VOWEL SIGN DIGA GAYANUKITTA",
direction="l",
linebreak="cm",
- unicodeslot=0x0DF3,
+ unicodeslot=0xDF3,
},
- [0x0DF4]={
+ [0xDF4]={
category="po",
description="SINHALA PUNCTUATION KUNDDALIYA",
direction="l",
linebreak="al",
- unicodeslot=0x0DF4,
+ unicodeslot=0xDF4,
},
- [0x0E01]={
+ [0xE01]={
adobename="kokaithai",
category="lo",
description="THAI CHARACTER KO KAI",
direction="l",
linebreak="sa",
- unicodeslot=0x0E01,
+ unicodeslot=0xE01,
},
- [0x0E02]={
+ [0xE02]={
adobename="khokhaithai",
category="lo",
description="THAI CHARACTER KHO KHAI",
direction="l",
linebreak="sa",
- unicodeslot=0x0E02,
+ unicodeslot=0xE02,
},
- [0x0E03]={
+ [0xE03]={
adobename="khokhuatthai",
category="lo",
description="THAI CHARACTER KHO KHUAT",
direction="l",
linebreak="sa",
- unicodeslot=0x0E03,
+ unicodeslot=0xE03,
},
- [0x0E04]={
+ [0xE04]={
adobename="khokhwaithai",
category="lo",
description="THAI CHARACTER KHO KHWAI",
direction="l",
linebreak="sa",
- unicodeslot=0x0E04,
+ unicodeslot=0xE04,
},
- [0x0E05]={
+ [0xE05]={
adobename="khokhonthai",
category="lo",
description="THAI CHARACTER KHO KHON",
direction="l",
linebreak="sa",
- unicodeslot=0x0E05,
+ unicodeslot=0xE05,
},
- [0x0E06]={
+ [0xE06]={
adobename="khorakhangthai",
category="lo",
description="THAI CHARACTER KHO RAKHANG",
direction="l",
linebreak="sa",
- unicodeslot=0x0E06,
+ unicodeslot=0xE06,
},
- [0x0E07]={
+ [0xE07]={
adobename="ngonguthai",
category="lo",
description="THAI CHARACTER NGO NGU",
direction="l",
linebreak="sa",
- unicodeslot=0x0E07,
+ unicodeslot=0xE07,
},
- [0x0E08]={
+ [0xE08]={
adobename="chochanthai",
category="lo",
description="THAI CHARACTER CHO CHAN",
direction="l",
linebreak="sa",
- unicodeslot=0x0E08,
+ unicodeslot=0xE08,
},
- [0x0E09]={
+ [0xE09]={
adobename="chochingthai",
category="lo",
description="THAI CHARACTER CHO CHING",
direction="l",
linebreak="sa",
- unicodeslot=0x0E09,
+ unicodeslot=0xE09,
},
- [0x0E0A]={
+ [0xE0A]={
adobename="chochangthai",
category="lo",
description="THAI CHARACTER CHO CHANG",
direction="l",
linebreak="sa",
- unicodeslot=0x0E0A,
+ unicodeslot=0xE0A,
},
- [0x0E0B]={
+ [0xE0B]={
adobename="sosothai",
category="lo",
description="THAI CHARACTER SO SO",
direction="l",
linebreak="sa",
- unicodeslot=0x0E0B,
+ unicodeslot=0xE0B,
},
- [0x0E0C]={
+ [0xE0C]={
adobename="chochoethai",
category="lo",
description="THAI CHARACTER CHO CHOE",
direction="l",
linebreak="sa",
- unicodeslot=0x0E0C,
+ unicodeslot=0xE0C,
},
- [0x0E0D]={
+ [0xE0D]={
adobename="yoyingthai",
category="lo",
description="THAI CHARACTER YO YING",
direction="l",
linebreak="sa",
- unicodeslot=0x0E0D,
+ unicodeslot=0xE0D,
},
- [0x0E0E]={
+ [0xE0E]={
adobename="dochadathai",
category="lo",
description="THAI CHARACTER DO CHADA",
direction="l",
linebreak="sa",
- unicodeslot=0x0E0E,
+ unicodeslot=0xE0E,
},
- [0x0E0F]={
+ [0xE0F]={
adobename="topatakthai",
category="lo",
description="THAI CHARACTER TO PATAK",
direction="l",
linebreak="sa",
- unicodeslot=0x0E0F,
+ unicodeslot=0xE0F,
},
- [0x0E10]={
+ [0xE10]={
adobename="thothanthai",
category="lo",
description="THAI CHARACTER THO THAN",
direction="l",
linebreak="sa",
- unicodeslot=0x0E10,
+ unicodeslot=0xE10,
},
- [0x0E11]={
+ [0xE11]={
adobename="thonangmonthothai",
category="lo",
description="THAI CHARACTER THO NANGMONTHO",
direction="l",
linebreak="sa",
- unicodeslot=0x0E11,
+ unicodeslot=0xE11,
},
- [0x0E12]={
+ [0xE12]={
adobename="thophuthaothai",
category="lo",
description="THAI CHARACTER THO PHUTHAO",
direction="l",
linebreak="sa",
- unicodeslot=0x0E12,
+ unicodeslot=0xE12,
},
- [0x0E13]={
+ [0xE13]={
adobename="nonenthai",
category="lo",
description="THAI CHARACTER NO NEN",
direction="l",
linebreak="sa",
- unicodeslot=0x0E13,
+ unicodeslot=0xE13,
},
- [0x0E14]={
+ [0xE14]={
adobename="dodekthai",
category="lo",
description="THAI CHARACTER DO DEK",
direction="l",
linebreak="sa",
- unicodeslot=0x0E14,
+ unicodeslot=0xE14,
},
- [0x0E15]={
+ [0xE15]={
adobename="totaothai",
category="lo",
description="THAI CHARACTER TO TAO",
direction="l",
linebreak="sa",
- unicodeslot=0x0E15,
+ unicodeslot=0xE15,
},
- [0x0E16]={
+ [0xE16]={
adobename="thothungthai",
category="lo",
description="THAI CHARACTER THO THUNG",
direction="l",
linebreak="sa",
- unicodeslot=0x0E16,
+ unicodeslot=0xE16,
},
- [0x0E17]={
+ [0xE17]={
adobename="thothahanthai",
category="lo",
description="THAI CHARACTER THO THAHAN",
direction="l",
linebreak="sa",
- unicodeslot=0x0E17,
+ unicodeslot=0xE17,
},
- [0x0E18]={
+ [0xE18]={
adobename="thothongthai",
category="lo",
description="THAI CHARACTER THO THONG",
direction="l",
linebreak="sa",
- unicodeslot=0x0E18,
+ unicodeslot=0xE18,
},
- [0x0E19]={
+ [0xE19]={
adobename="nonuthai",
category="lo",
description="THAI CHARACTER NO NU",
direction="l",
linebreak="sa",
- unicodeslot=0x0E19,
+ unicodeslot=0xE19,
},
- [0x0E1A]={
+ [0xE1A]={
adobename="bobaimaithai",
category="lo",
description="THAI CHARACTER BO BAIMAI",
direction="l",
linebreak="sa",
- unicodeslot=0x0E1A,
+ unicodeslot=0xE1A,
},
- [0x0E1B]={
+ [0xE1B]={
adobename="poplathai",
category="lo",
description="THAI CHARACTER PO PLA",
direction="l",
linebreak="sa",
- unicodeslot=0x0E1B,
+ unicodeslot=0xE1B,
},
- [0x0E1C]={
+ [0xE1C]={
adobename="phophungthai",
category="lo",
description="THAI CHARACTER PHO PHUNG",
direction="l",
linebreak="sa",
- unicodeslot=0x0E1C,
+ unicodeslot=0xE1C,
},
- [0x0E1D]={
+ [0xE1D]={
adobename="fofathai",
category="lo",
description="THAI CHARACTER FO FA",
direction="l",
linebreak="sa",
- unicodeslot=0x0E1D,
+ unicodeslot=0xE1D,
},
- [0x0E1E]={
+ [0xE1E]={
adobename="phophanthai",
category="lo",
description="THAI CHARACTER PHO PHAN",
direction="l",
linebreak="sa",
- unicodeslot=0x0E1E,
+ unicodeslot=0xE1E,
},
- [0x0E1F]={
+ [0xE1F]={
adobename="fofanthai",
category="lo",
description="THAI CHARACTER FO FAN",
direction="l",
linebreak="sa",
- unicodeslot=0x0E1F,
+ unicodeslot=0xE1F,
},
- [0x0E20]={
+ [0xE20]={
adobename="phosamphaothai",
category="lo",
description="THAI CHARACTER PHO SAMPHAO",
direction="l",
linebreak="sa",
- unicodeslot=0x0E20,
+ unicodeslot=0xE20,
},
- [0x0E21]={
+ [0xE21]={
adobename="momathai",
category="lo",
description="THAI CHARACTER MO MA",
direction="l",
linebreak="sa",
- unicodeslot=0x0E21,
+ unicodeslot=0xE21,
},
- [0x0E22]={
+ [0xE22]={
adobename="yoyakthai",
category="lo",
description="THAI CHARACTER YO YAK",
direction="l",
linebreak="sa",
- unicodeslot=0x0E22,
+ unicodeslot=0xE22,
},
- [0x0E23]={
+ [0xE23]={
adobename="roruathai",
category="lo",
description="THAI CHARACTER RO RUA",
direction="l",
linebreak="sa",
- unicodeslot=0x0E23,
+ unicodeslot=0xE23,
},
- [0x0E24]={
+ [0xE24]={
adobename="ruthai",
category="lo",
description="THAI CHARACTER RU",
direction="l",
linebreak="sa",
- unicodeslot=0x0E24,
+ unicodeslot=0xE24,
},
- [0x0E25]={
+ [0xE25]={
adobename="lolingthai",
category="lo",
description="THAI CHARACTER LO LING",
direction="l",
linebreak="sa",
- unicodeslot=0x0E25,
+ unicodeslot=0xE25,
},
- [0x0E26]={
+ [0xE26]={
adobename="luthai",
category="lo",
description="THAI CHARACTER LU",
direction="l",
linebreak="sa",
- unicodeslot=0x0E26,
+ unicodeslot=0xE26,
},
- [0x0E27]={
+ [0xE27]={
adobename="wowaenthai",
category="lo",
description="THAI CHARACTER WO WAEN",
direction="l",
linebreak="sa",
- unicodeslot=0x0E27,
+ unicodeslot=0xE27,
},
- [0x0E28]={
+ [0xE28]={
adobename="sosalathai",
category="lo",
description="THAI CHARACTER SO SALA",
direction="l",
linebreak="sa",
- unicodeslot=0x0E28,
+ unicodeslot=0xE28,
},
- [0x0E29]={
+ [0xE29]={
adobename="sorusithai",
category="lo",
description="THAI CHARACTER SO RUSI",
direction="l",
linebreak="sa",
- unicodeslot=0x0E29,
+ unicodeslot=0xE29,
},
- [0x0E2A]={
+ [0xE2A]={
adobename="sosuathai",
category="lo",
description="THAI CHARACTER SO SUA",
direction="l",
linebreak="sa",
- unicodeslot=0x0E2A,
+ unicodeslot=0xE2A,
},
- [0x0E2B]={
+ [0xE2B]={
adobename="hohipthai",
category="lo",
description="THAI CHARACTER HO HIP",
direction="l",
linebreak="sa",
- unicodeslot=0x0E2B,
+ unicodeslot=0xE2B,
},
- [0x0E2C]={
+ [0xE2C]={
adobename="lochulathai",
category="lo",
description="THAI CHARACTER LO CHULA",
direction="l",
linebreak="sa",
- unicodeslot=0x0E2C,
+ unicodeslot=0xE2C,
},
- [0x0E2D]={
+ [0xE2D]={
adobename="oangthai",
category="lo",
description="THAI CHARACTER O ANG",
direction="l",
linebreak="sa",
- unicodeslot=0x0E2D,
+ unicodeslot=0xE2D,
},
- [0x0E2E]={
+ [0xE2E]={
adobename="honokhukthai",
category="lo",
description="THAI CHARACTER HO NOKHUK",
direction="l",
linebreak="sa",
- unicodeslot=0x0E2E,
+ unicodeslot=0xE2E,
},
- [0x0E2F]={
+ [0xE2F]={
adobename="paiyannoithai",
category="lo",
description="THAI CHARACTER PAIYANNOI",
direction="l",
linebreak="sa",
- unicodeslot=0x0E2F,
+ unicodeslot=0xE2F,
},
- [0x0E30]={
+ [0xE30]={
adobename="saraathai",
category="lo",
description="THAI CHARACTER SARA A",
direction="l",
linebreak="sa",
- unicodeslot=0x0E30,
+ unicodeslot=0xE30,
},
- [0x0E31]={
+ [0xE31]={
adobename="maihanakatthai",
category="mn",
description="THAI CHARACTER MAI HAN-AKAT",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0E31,
+ unicodeslot=0xE31,
},
- [0x0E32]={
+ [0xE32]={
adobename="saraaathai",
category="lo",
description="THAI CHARACTER SARA AA",
direction="l",
linebreak="sa",
- unicodeslot=0x0E32,
+ unicodeslot=0xE32,
},
- [0x0E33]={
+ [0xE33]={
adobename="saraamthai",
category="lo",
description="THAI CHARACTER SARA AM",
direction="l",
linebreak="sa",
- specials={ "compat", 0x0E4D, 0x0E32 },
- unicodeslot=0x0E33,
+ specials={ "compat", 0xE4D, 0xE32 },
+ unicodeslot=0xE33,
},
- [0x0E34]={
+ [0xE34]={
adobename="saraithai",
category="mn",
description="THAI CHARACTER SARA I",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0E34,
+ unicodeslot=0xE34,
},
- [0x0E35]={
+ [0xE35]={
adobename="saraiithai",
category="mn",
description="THAI CHARACTER SARA II",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0E35,
+ unicodeslot=0xE35,
},
- [0x0E36]={
+ [0xE36]={
adobename="sarauethai",
category="mn",
description="THAI CHARACTER SARA UE",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0E36,
+ unicodeslot=0xE36,
},
- [0x0E37]={
+ [0xE37]={
adobename="saraueethai",
category="mn",
description="THAI CHARACTER SARA UEE",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0E37,
+ unicodeslot=0xE37,
},
- [0x0E38]={
+ [0xE38]={
adobename="sarauthai",
category="mn",
+ combining=0x67,
description="THAI CHARACTER SARA U",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0E38,
+ unicodeslot=0xE38,
},
- [0x0E39]={
+ [0xE39]={
adobename="sarauuthai",
category="mn",
+ combining=0x67,
description="THAI CHARACTER SARA UU",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0E39,
+ unicodeslot=0xE39,
},
- [0x0E3A]={
+ [0xE3A]={
adobename="phinthuthai",
category="mn",
+ combining=0x9,
description="THAI CHARACTER PHINTHU",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0E3A,
+ unicodeslot=0xE3A,
},
- [0x0E3F]={
+ [0xE3F]={
adobename="bahtthai",
category="sc",
description="THAI CURRENCY SYMBOL BAHT",
direction="et",
linebreak="pr",
- unicodeslot=0x0E3F,
+ unicodeslot=0xE3F,
},
- [0x0E40]={
+ [0xE40]={
adobename="saraethai",
category="lo",
description="THAI CHARACTER SARA E",
direction="l",
linebreak="sa",
- unicodeslot=0x0E40,
+ unicodeslot=0xE40,
},
- [0x0E41]={
+ [0xE41]={
adobename="saraaethai",
category="lo",
description="THAI CHARACTER SARA AE",
direction="l",
linebreak="sa",
- unicodeslot=0x0E41,
+ unicodeslot=0xE41,
},
- [0x0E42]={
+ [0xE42]={
adobename="saraothai",
category="lo",
description="THAI CHARACTER SARA O",
direction="l",
linebreak="sa",
- unicodeslot=0x0E42,
+ unicodeslot=0xE42,
},
- [0x0E43]={
+ [0xE43]={
adobename="saraaimaimuanthai",
category="lo",
description="THAI CHARACTER SARA AI MAIMUAN",
direction="l",
linebreak="sa",
- unicodeslot=0x0E43,
+ unicodeslot=0xE43,
},
- [0x0E44]={
+ [0xE44]={
adobename="saraaimaimalaithai",
category="lo",
description="THAI CHARACTER SARA AI MAIMALAI",
direction="l",
linebreak="sa",
- unicodeslot=0x0E44,
+ unicodeslot=0xE44,
},
- [0x0E45]={
+ [0xE45]={
adobename="lakkhangyaothai",
category="lo",
description="THAI CHARACTER LAKKHANGYAO",
direction="l",
linebreak="sa",
- unicodeslot=0x0E45,
+ unicodeslot=0xE45,
},
- [0x0E46]={
+ [0xE46]={
adobename="maiyamokthai",
category="lm",
description="THAI CHARACTER MAIYAMOK",
direction="l",
linebreak="sa",
- unicodeslot=0x0E46,
+ unicodeslot=0xE46,
},
- [0x0E47]={
+ [0xE47]={
adobename="maitaikhuthai",
category="mn",
description="THAI CHARACTER MAITAIKHU",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0E47,
+ unicodeslot=0xE47,
},
- [0x0E48]={
+ [0xE48]={
adobename="maiekthai",
category="mn",
+ combining=0x6B,
description="THAI CHARACTER MAI EK",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0E48,
+ unicodeslot=0xE48,
},
- [0x0E49]={
+ [0xE49]={
adobename="maithothai",
category="mn",
+ combining=0x6B,
description="THAI CHARACTER MAI THO",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0E49,
+ unicodeslot=0xE49,
},
- [0x0E4A]={
+ [0xE4A]={
adobename="maitrithai",
category="mn",
+ combining=0x6B,
description="THAI CHARACTER MAI TRI",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0E4A,
+ unicodeslot=0xE4A,
},
- [0x0E4B]={
+ [0xE4B]={
adobename="maichattawathai",
category="mn",
+ combining=0x6B,
description="THAI CHARACTER MAI CHATTAWA",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0E4B,
+ unicodeslot=0xE4B,
},
- [0x0E4C]={
+ [0xE4C]={
adobename="thanthakhatthai",
category="mn",
description="THAI CHARACTER THANTHAKHAT",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0E4C,
+ unicodeslot=0xE4C,
},
- [0x0E4D]={
+ [0xE4D]={
adobename="nikhahitthai",
category="mn",
description="THAI CHARACTER NIKHAHIT",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0E4D,
+ unicodeslot=0xE4D,
},
- [0x0E4E]={
+ [0xE4E]={
adobename="yamakkanthai",
category="mn",
description="THAI CHARACTER YAMAKKAN",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0E4E,
+ unicodeslot=0xE4E,
},
- [0x0E4F]={
+ [0xE4F]={
adobename="fongmanthai",
category="po",
description="THAI CHARACTER FONGMAN",
direction="l",
linebreak="al",
- unicodeslot=0x0E4F,
+ unicodeslot=0xE4F,
},
- [0x0E50]={
+ [0xE50]={
adobename="zerothai",
category="nd",
description="THAI DIGIT ZERO",
direction="l",
linebreak="nu",
- unicodeslot=0x0E50,
+ unicodeslot=0xE50,
},
- [0x0E51]={
+ [0xE51]={
adobename="onethai",
category="nd",
description="THAI DIGIT ONE",
direction="l",
linebreak="nu",
- unicodeslot=0x0E51,
+ unicodeslot=0xE51,
},
- [0x0E52]={
+ [0xE52]={
adobename="twothai",
category="nd",
description="THAI DIGIT TWO",
direction="l",
linebreak="nu",
- unicodeslot=0x0E52,
+ unicodeslot=0xE52,
},
- [0x0E53]={
+ [0xE53]={
adobename="threethai",
category="nd",
description="THAI DIGIT THREE",
direction="l",
linebreak="nu",
- unicodeslot=0x0E53,
+ unicodeslot=0xE53,
},
- [0x0E54]={
+ [0xE54]={
adobename="fourthai",
category="nd",
description="THAI DIGIT FOUR",
direction="l",
linebreak="nu",
- unicodeslot=0x0E54,
+ unicodeslot=0xE54,
},
- [0x0E55]={
+ [0xE55]={
adobename="fivethai",
category="nd",
description="THAI DIGIT FIVE",
direction="l",
linebreak="nu",
- unicodeslot=0x0E55,
+ unicodeslot=0xE55,
},
- [0x0E56]={
+ [0xE56]={
adobename="sixthai",
category="nd",
description="THAI DIGIT SIX",
direction="l",
linebreak="nu",
- unicodeslot=0x0E56,
+ unicodeslot=0xE56,
},
- [0x0E57]={
+ [0xE57]={
adobename="seventhai",
category="nd",
description="THAI DIGIT SEVEN",
direction="l",
linebreak="nu",
- unicodeslot=0x0E57,
+ unicodeslot=0xE57,
},
- [0x0E58]={
+ [0xE58]={
adobename="eightthai",
category="nd",
description="THAI DIGIT EIGHT",
direction="l",
linebreak="nu",
- unicodeslot=0x0E58,
+ unicodeslot=0xE58,
},
- [0x0E59]={
+ [0xE59]={
adobename="ninethai",
category="nd",
description="THAI DIGIT NINE",
direction="l",
linebreak="nu",
- unicodeslot=0x0E59,
+ unicodeslot=0xE59,
},
- [0x0E5A]={
+ [0xE5A]={
adobename="angkhankhuthai",
category="po",
description="THAI CHARACTER ANGKHANKHU",
direction="l",
linebreak="ba",
- unicodeslot=0x0E5A,
+ unicodeslot=0xE5A,
},
- [0x0E5B]={
+ [0xE5B]={
adobename="khomutthai",
category="po",
description="THAI CHARACTER KHOMUT",
direction="l",
linebreak="ba",
- unicodeslot=0x0E5B,
+ unicodeslot=0xE5B,
},
- [0x0E81]={
+ [0xE81]={
category="lo",
description="LAO LETTER KO",
direction="l",
linebreak="sa",
- unicodeslot=0x0E81,
+ unicodeslot=0xE81,
},
- [0x0E82]={
+ [0xE82]={
category="lo",
description="LAO LETTER KHO SUNG",
direction="l",
linebreak="sa",
- unicodeslot=0x0E82,
+ unicodeslot=0xE82,
},
- [0x0E84]={
+ [0xE84]={
category="lo",
description="LAO LETTER KHO TAM",
direction="l",
linebreak="sa",
- unicodeslot=0x0E84,
+ unicodeslot=0xE84,
},
- [0x0E87]={
+ [0xE87]={
category="lo",
description="LAO LETTER NGO",
direction="l",
linebreak="sa",
- unicodeslot=0x0E87,
+ unicodeslot=0xE87,
},
- [0x0E88]={
+ [0xE88]={
category="lo",
description="LAO LETTER CO",
direction="l",
linebreak="sa",
- unicodeslot=0x0E88,
+ unicodeslot=0xE88,
},
- [0x0E8A]={
+ [0xE8A]={
category="lo",
description="LAO LETTER SO TAM",
direction="l",
linebreak="sa",
- unicodeslot=0x0E8A,
+ unicodeslot=0xE8A,
},
- [0x0E8D]={
+ [0xE8D]={
category="lo",
description="LAO LETTER NYO",
direction="l",
linebreak="sa",
- unicodeslot=0x0E8D,
+ unicodeslot=0xE8D,
},
- [0x0E94]={
+ [0xE94]={
category="lo",
description="LAO LETTER DO",
direction="l",
linebreak="sa",
- unicodeslot=0x0E94,
+ unicodeslot=0xE94,
},
- [0x0E95]={
+ [0xE95]={
category="lo",
description="LAO LETTER TO",
direction="l",
linebreak="sa",
- unicodeslot=0x0E95,
+ unicodeslot=0xE95,
},
- [0x0E96]={
+ [0xE96]={
category="lo",
description="LAO LETTER THO SUNG",
direction="l",
linebreak="sa",
- unicodeslot=0x0E96,
+ unicodeslot=0xE96,
},
- [0x0E97]={
+ [0xE97]={
category="lo",
description="LAO LETTER THO TAM",
direction="l",
linebreak="sa",
- unicodeslot=0x0E97,
+ unicodeslot=0xE97,
},
- [0x0E99]={
+ [0xE99]={
category="lo",
description="LAO LETTER NO",
direction="l",
linebreak="sa",
- unicodeslot=0x0E99,
+ unicodeslot=0xE99,
},
- [0x0E9A]={
+ [0xE9A]={
category="lo",
description="LAO LETTER BO",
direction="l",
linebreak="sa",
- unicodeslot=0x0E9A,
+ unicodeslot=0xE9A,
},
- [0x0E9B]={
+ [0xE9B]={
category="lo",
description="LAO LETTER PO",
direction="l",
linebreak="sa",
- unicodeslot=0x0E9B,
+ unicodeslot=0xE9B,
},
- [0x0E9C]={
+ [0xE9C]={
category="lo",
description="LAO LETTER PHO SUNG",
direction="l",
linebreak="sa",
- unicodeslot=0x0E9C,
+ unicodeslot=0xE9C,
},
- [0x0E9D]={
+ [0xE9D]={
category="lo",
description="LAO LETTER FO TAM",
direction="l",
linebreak="sa",
- unicodeslot=0x0E9D,
+ unicodeslot=0xE9D,
},
- [0x0E9E]={
+ [0xE9E]={
category="lo",
description="LAO LETTER PHO TAM",
direction="l",
linebreak="sa",
- unicodeslot=0x0E9E,
+ unicodeslot=0xE9E,
},
- [0x0E9F]={
+ [0xE9F]={
category="lo",
description="LAO LETTER FO SUNG",
direction="l",
linebreak="sa",
- unicodeslot=0x0E9F,
+ unicodeslot=0xE9F,
},
- [0x0EA1]={
+ [0xEA1]={
category="lo",
description="LAO LETTER MO",
direction="l",
linebreak="sa",
- unicodeslot=0x0EA1,
+ unicodeslot=0xEA1,
},
- [0x0EA2]={
+ [0xEA2]={
category="lo",
description="LAO LETTER YO",
direction="l",
linebreak="sa",
- unicodeslot=0x0EA2,
+ unicodeslot=0xEA2,
},
- [0x0EA3]={
+ [0xEA3]={
category="lo",
description="LAO LETTER LO LING",
direction="l",
linebreak="sa",
- unicodeslot=0x0EA3,
+ unicodeslot=0xEA3,
},
- [0x0EA5]={
+ [0xEA5]={
category="lo",
description="LAO LETTER LO LOOT",
direction="l",
linebreak="sa",
- unicodeslot=0x0EA5,
+ unicodeslot=0xEA5,
},
- [0x0EA7]={
+ [0xEA7]={
category="lo",
description="LAO LETTER WO",
direction="l",
linebreak="sa",
- unicodeslot=0x0EA7,
+ unicodeslot=0xEA7,
},
- [0x0EAA]={
+ [0xEAA]={
category="lo",
description="LAO LETTER SO SUNG",
direction="l",
linebreak="sa",
- unicodeslot=0x0EAA,
+ unicodeslot=0xEAA,
},
- [0x0EAB]={
+ [0xEAB]={
category="lo",
description="LAO LETTER HO SUNG",
direction="l",
linebreak="sa",
- unicodeslot=0x0EAB,
+ unicodeslot=0xEAB,
},
- [0x0EAD]={
+ [0xEAD]={
category="lo",
description="LAO LETTER O",
direction="l",
linebreak="sa",
- unicodeslot=0x0EAD,
+ unicodeslot=0xEAD,
},
- [0x0EAE]={
+ [0xEAE]={
category="lo",
description="LAO LETTER HO TAM",
direction="l",
linebreak="sa",
- unicodeslot=0x0EAE,
+ unicodeslot=0xEAE,
},
- [0x0EAF]={
+ [0xEAF]={
category="lo",
description="LAO ELLIPSIS",
direction="l",
linebreak="sa",
- unicodeslot=0x0EAF,
+ unicodeslot=0xEAF,
},
- [0x0EB0]={
+ [0xEB0]={
category="lo",
description="LAO VOWEL SIGN A",
direction="l",
linebreak="sa",
- unicodeslot=0x0EB0,
+ unicodeslot=0xEB0,
},
- [0x0EB1]={
+ [0xEB1]={
category="mn",
description="LAO VOWEL SIGN MAI KAN",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0EB1,
+ unicodeslot=0xEB1,
},
- [0x0EB2]={
+ [0xEB2]={
category="lo",
description="LAO VOWEL SIGN AA",
direction="l",
linebreak="sa",
- unicodeslot=0x0EB2,
+ unicodeslot=0xEB2,
},
- [0x0EB3]={
+ [0xEB3]={
category="lo",
description="LAO VOWEL SIGN AM",
direction="l",
linebreak="sa",
- specials={ "compat", 0x0ECD, 0x0EB2 },
- unicodeslot=0x0EB3,
+ specials={ "compat", 0xECD, 0xEB2 },
+ unicodeslot=0xEB3,
},
- [0x0EB4]={
+ [0xEB4]={
category="mn",
description="LAO VOWEL SIGN I",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0EB4,
+ unicodeslot=0xEB4,
},
- [0x0EB5]={
+ [0xEB5]={
category="mn",
description="LAO VOWEL SIGN II",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0EB5,
+ unicodeslot=0xEB5,
},
- [0x0EB6]={
+ [0xEB6]={
category="mn",
description="LAO VOWEL SIGN Y",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0EB6,
+ unicodeslot=0xEB6,
},
- [0x0EB7]={
+ [0xEB7]={
category="mn",
description="LAO VOWEL SIGN YY",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0EB7,
+ unicodeslot=0xEB7,
},
- [0x0EB8]={
+ [0xEB8]={
category="mn",
+ combining=0x76,
description="LAO VOWEL SIGN U",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0EB8,
+ unicodeslot=0xEB8,
},
- [0x0EB9]={
+ [0xEB9]={
category="mn",
+ combining=0x76,
description="LAO VOWEL SIGN UU",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0EB9,
+ unicodeslot=0xEB9,
},
- [0x0EBB]={
+ [0xEBB]={
category="mn",
description="LAO VOWEL SIGN MAI KON",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0EBB,
+ unicodeslot=0xEBB,
},
- [0x0EBC]={
+ [0xEBC]={
category="mn",
description="LAO SEMIVOWEL SIGN LO",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0EBC,
+ unicodeslot=0xEBC,
},
- [0x0EBD]={
+ [0xEBD]={
category="lo",
description="LAO SEMIVOWEL SIGN NYO",
direction="l",
linebreak="sa",
- unicodeslot=0x0EBD,
+ unicodeslot=0xEBD,
},
- [0x0EC0]={
+ [0xEC0]={
category="lo",
description="LAO VOWEL SIGN E",
direction="l",
linebreak="sa",
- unicodeslot=0x0EC0,
+ unicodeslot=0xEC0,
},
- [0x0EC1]={
+ [0xEC1]={
category="lo",
description="LAO VOWEL SIGN EI",
direction="l",
linebreak="sa",
- unicodeslot=0x0EC1,
+ unicodeslot=0xEC1,
},
- [0x0EC2]={
+ [0xEC2]={
category="lo",
description="LAO VOWEL SIGN O",
direction="l",
linebreak="sa",
- unicodeslot=0x0EC2,
+ unicodeslot=0xEC2,
},
- [0x0EC3]={
+ [0xEC3]={
category="lo",
description="LAO VOWEL SIGN AY",
direction="l",
linebreak="sa",
- unicodeslot=0x0EC3,
+ unicodeslot=0xEC3,
},
- [0x0EC4]={
+ [0xEC4]={
category="lo",
description="LAO VOWEL SIGN AI",
direction="l",
linebreak="sa",
- unicodeslot=0x0EC4,
+ unicodeslot=0xEC4,
},
- [0x0EC6]={
+ [0xEC6]={
category="lm",
description="LAO KO LA",
direction="l",
linebreak="sa",
- unicodeslot=0x0EC6,
+ unicodeslot=0xEC6,
},
- [0x0EC8]={
+ [0xEC8]={
category="mn",
+ combining=0x7A,
description="LAO TONE MAI EK",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0EC8,
+ unicodeslot=0xEC8,
},
- [0x0EC9]={
+ [0xEC9]={
category="mn",
+ combining=0x7A,
description="LAO TONE MAI THO",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0EC9,
+ unicodeslot=0xEC9,
},
- [0x0ECA]={
+ [0xECA]={
category="mn",
+ combining=0x7A,
description="LAO TONE MAI TI",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0ECA,
+ unicodeslot=0xECA,
},
- [0x0ECB]={
+ [0xECB]={
category="mn",
+ combining=0x7A,
description="LAO TONE MAI CATAWA",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0ECB,
+ unicodeslot=0xECB,
},
- [0x0ECC]={
+ [0xECC]={
category="mn",
description="LAO CANCELLATION MARK",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0ECC,
+ unicodeslot=0xECC,
},
- [0x0ECD]={
+ [0xECD]={
category="mn",
description="LAO NIGGAHITA",
direction="nsm",
linebreak="sa",
- unicodeslot=0x0ECD,
+ unicodeslot=0xECD,
},
- [0x0ED0]={
+ [0xED0]={
category="nd",
description="LAO DIGIT ZERO",
direction="l",
linebreak="nu",
- unicodeslot=0x0ED0,
+ unicodeslot=0xED0,
},
- [0x0ED1]={
+ [0xED1]={
category="nd",
description="LAO DIGIT ONE",
direction="l",
linebreak="nu",
- unicodeslot=0x0ED1,
+ unicodeslot=0xED1,
},
- [0x0ED2]={
+ [0xED2]={
category="nd",
description="LAO DIGIT TWO",
direction="l",
linebreak="nu",
- unicodeslot=0x0ED2,
+ unicodeslot=0xED2,
},
- [0x0ED3]={
+ [0xED3]={
category="nd",
description="LAO DIGIT THREE",
direction="l",
linebreak="nu",
- unicodeslot=0x0ED3,
+ unicodeslot=0xED3,
},
- [0x0ED4]={
+ [0xED4]={
category="nd",
description="LAO DIGIT FOUR",
direction="l",
linebreak="nu",
- unicodeslot=0x0ED4,
+ unicodeslot=0xED4,
},
- [0x0ED5]={
+ [0xED5]={
category="nd",
description="LAO DIGIT FIVE",
direction="l",
linebreak="nu",
- unicodeslot=0x0ED5,
+ unicodeslot=0xED5,
},
- [0x0ED6]={
+ [0xED6]={
category="nd",
description="LAO DIGIT SIX",
direction="l",
linebreak="nu",
- unicodeslot=0x0ED6,
+ unicodeslot=0xED6,
},
- [0x0ED7]={
+ [0xED7]={
category="nd",
description="LAO DIGIT SEVEN",
direction="l",
linebreak="nu",
- unicodeslot=0x0ED7,
+ unicodeslot=0xED7,
},
- [0x0ED8]={
+ [0xED8]={
category="nd",
description="LAO DIGIT EIGHT",
direction="l",
linebreak="nu",
- unicodeslot=0x0ED8,
+ unicodeslot=0xED8,
},
- [0x0ED9]={
+ [0xED9]={
category="nd",
description="LAO DIGIT NINE",
direction="l",
linebreak="nu",
- unicodeslot=0x0ED9,
+ unicodeslot=0xED9,
},
- [0x0EDC]={
+ [0xEDC]={
category="lo",
description="LAO HO NO",
direction="l",
linebreak="sa",
- specials={ "compat", 0x0EAB, 0x0E99 },
- unicodeslot=0x0EDC,
+ specials={ "compat", 0xEAB, 0xE99 },
+ unicodeslot=0xEDC,
},
- [0x0EDD]={
+ [0xEDD]={
category="lo",
description="LAO HO MO",
direction="l",
linebreak="sa",
- specials={ "compat", 0x0EAB, 0x0EA1 },
- unicodeslot=0x0EDD,
+ specials={ "compat", 0xEAB, 0xEA1 },
+ unicodeslot=0xEDD,
},
- [0x0EDE]={
+ [0xEDE]={
category="lo",
description="LAO LETTER KHMU GO",
direction="l",
linebreak="sa",
- unicodeslot=0x0EDE,
+ unicodeslot=0xEDE,
},
- [0x0EDF]={
+ [0xEDF]={
category="lo",
description="LAO LETTER KHMU NYO",
direction="l",
linebreak="sa",
- unicodeslot=0x0EDF,
+ unicodeslot=0xEDF,
},
- [0x0F00]={
+ [0xF00]={
category="lo",
description="TIBETAN SYLLABLE OM",
direction="l",
linebreak="al",
- unicodeslot=0x0F00,
+ unicodeslot=0xF00,
},
- [0x0F01]={
+ [0xF01]={
category="so",
description="TIBETAN MARK GTER YIG MGO TRUNCATED A",
direction="l",
linebreak="bb",
- unicodeslot=0x0F01,
+ unicodeslot=0xF01,
},
- [0x0F02]={
+ [0xF02]={
category="so",
description="TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA",
direction="l",
linebreak="bb",
- unicodeslot=0x0F02,
+ unicodeslot=0xF02,
},
- [0x0F03]={
+ [0xF03]={
category="so",
description="TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA",
direction="l",
linebreak="bb",
- unicodeslot=0x0F03,
+ unicodeslot=0xF03,
},
- [0x0F04]={
+ [0xF04]={
category="po",
description="TIBETAN MARK INITIAL YIG MGO MDUN MA",
direction="l",
linebreak="bb",
- unicodeslot=0x0F04,
+ unicodeslot=0xF04,
},
- [0x0F05]={
+ [0xF05]={
category="po",
description="TIBETAN MARK CLOSING YIG MGO SGAB MA",
direction="l",
linebreak="al",
- unicodeslot=0x0F05,
+ unicodeslot=0xF05,
},
- [0x0F06]={
+ [0xF06]={
category="po",
description="TIBETAN MARK CARET YIG MGO PHUR SHAD MA",
direction="l",
linebreak="bb",
- unicodeslot=0x0F06,
+ unicodeslot=0xF06,
},
- [0x0F07]={
+ [0xF07]={
category="po",
description="TIBETAN MARK YIG MGO TSHEG SHAD MA",
direction="l",
linebreak="bb",
- unicodeslot=0x0F07,
+ unicodeslot=0xF07,
},
- [0x0F08]={
+ [0xF08]={
category="po",
description="TIBETAN MARK SBRUL SHAD",
direction="l",
linebreak="gl",
- unicodeslot=0x0F08,
+ unicodeslot=0xF08,
},
- [0x0F09]={
+ [0xF09]={
category="po",
description="TIBETAN MARK BSKUR YIG MGO",
direction="l",
linebreak="bb",
- unicodeslot=0x0F09,
+ unicodeslot=0xF09,
},
- [0x0F0A]={
+ [0xF0A]={
category="po",
description="TIBETAN MARK BKA- SHOG YIG MGO",
direction="l",
linebreak="bb",
- unicodeslot=0x0F0A,
+ unicodeslot=0xF0A,
},
- [0x0F0B]={
+ [0xF0B]={
category="po",
description="TIBETAN MARK INTERSYLLABIC TSHEG",
direction="l",
linebreak="ba",
- unicodeslot=0x0F0B,
+ unicodeslot=0xF0B,
},
- [0x0F0C]={
+ [0xF0C]={
category="po",
description="TIBETAN MARK DELIMITER TSHEG BSTAR",
direction="l",
linebreak="gl",
- specials={ "nobreak", 0x0F0B },
- unicodeslot=0x0F0C,
+ specials={ "nobreak", 0xF0B },
+ unicodeslot=0xF0C,
},
- [0x0F0D]={
+ [0xF0D]={
category="po",
description="TIBETAN MARK SHAD",
direction="l",
linebreak="ex",
- unicodeslot=0x0F0D,
+ unicodeslot=0xF0D,
},
- [0x0F0E]={
+ [0xF0E]={
category="po",
description="TIBETAN MARK NYIS SHAD",
direction="l",
linebreak="ex",
- unicodeslot=0x0F0E,
+ unicodeslot=0xF0E,
},
- [0x0F0F]={
+ [0xF0F]={
category="po",
description="TIBETAN MARK TSHEG SHAD",
direction="l",
linebreak="ex",
- unicodeslot=0x0F0F,
+ unicodeslot=0xF0F,
},
- [0x0F10]={
+ [0xF10]={
category="po",
description="TIBETAN MARK NYIS TSHEG SHAD",
direction="l",
linebreak="ex",
- unicodeslot=0x0F10,
+ unicodeslot=0xF10,
},
- [0x0F11]={
+ [0xF11]={
category="po",
description="TIBETAN MARK RIN CHEN SPUNGS SHAD",
direction="l",
linebreak="ex",
- unicodeslot=0x0F11,
+ unicodeslot=0xF11,
},
- [0x0F12]={
+ [0xF12]={
category="po",
description="TIBETAN MARK RGYA GRAM SHAD",
direction="l",
linebreak="gl",
- unicodeslot=0x0F12,
+ unicodeslot=0xF12,
},
- [0x0F13]={
+ [0xF13]={
category="so",
description="TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN",
direction="l",
linebreak="al",
- unicodeslot=0x0F13,
+ unicodeslot=0xF13,
},
- [0x0F14]={
+ [0xF14]={
category="so",
description="TIBETAN MARK GTER TSHEG",
direction="l",
linebreak="ex",
- unicodeslot=0x0F14,
+ unicodeslot=0xF14,
},
- [0x0F15]={
+ [0xF15]={
category="so",
description="TIBETAN LOGOTYPE SIGN CHAD RTAGS",
direction="l",
linebreak="al",
- unicodeslot=0x0F15,
+ unicodeslot=0xF15,
},
- [0x0F16]={
+ [0xF16]={
category="so",
description="TIBETAN LOGOTYPE SIGN LHAG RTAGS",
direction="l",
linebreak="al",
- unicodeslot=0x0F16,
+ unicodeslot=0xF16,
},
- [0x0F17]={
+ [0xF17]={
category="so",
description="TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS",
direction="l",
linebreak="al",
- unicodeslot=0x0F17,
+ unicodeslot=0xF17,
},
- [0x0F18]={
+ [0xF18]={
category="mn",
+ combining=0xDC,
description="TIBETAN ASTROLOGICAL SIGN -KHYUD PA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F18,
+ unicodeslot=0xF18,
},
- [0x0F19]={
+ [0xF19]={
category="mn",
+ combining=0xDC,
description="TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F19,
+ unicodeslot=0xF19,
},
- [0x0F1A]={
+ [0xF1A]={
category="so",
description="TIBETAN SIGN RDEL DKAR GCIG",
direction="l",
linebreak="al",
- unicodeslot=0x0F1A,
+ unicodeslot=0xF1A,
},
- [0x0F1B]={
+ [0xF1B]={
category="so",
description="TIBETAN SIGN RDEL DKAR GNYIS",
direction="l",
linebreak="al",
- unicodeslot=0x0F1B,
+ unicodeslot=0xF1B,
},
- [0x0F1C]={
+ [0xF1C]={
category="so",
description="TIBETAN SIGN RDEL DKAR GSUM",
direction="l",
linebreak="al",
- unicodeslot=0x0F1C,
+ unicodeslot=0xF1C,
},
- [0x0F1D]={
+ [0xF1D]={
category="so",
description="TIBETAN SIGN RDEL NAG GCIG",
direction="l",
linebreak="al",
- unicodeslot=0x0F1D,
+ unicodeslot=0xF1D,
},
- [0x0F1E]={
+ [0xF1E]={
category="so",
description="TIBETAN SIGN RDEL NAG GNYIS",
direction="l",
linebreak="al",
- unicodeslot=0x0F1E,
+ unicodeslot=0xF1E,
},
- [0x0F1F]={
+ [0xF1F]={
category="so",
description="TIBETAN SIGN RDEL DKAR RDEL NAG",
direction="l",
linebreak="al",
- unicodeslot=0x0F1F,
+ unicodeslot=0xF1F,
},
- [0x0F20]={
+ [0xF20]={
category="nd",
description="TIBETAN DIGIT ZERO",
direction="l",
linebreak="nu",
- unicodeslot=0x0F20,
+ unicodeslot=0xF20,
},
- [0x0F21]={
+ [0xF21]={
category="nd",
description="TIBETAN DIGIT ONE",
direction="l",
linebreak="nu",
- unicodeslot=0x0F21,
+ unicodeslot=0xF21,
},
- [0x0F22]={
+ [0xF22]={
category="nd",
description="TIBETAN DIGIT TWO",
direction="l",
linebreak="nu",
- unicodeslot=0x0F22,
+ unicodeslot=0xF22,
},
- [0x0F23]={
+ [0xF23]={
category="nd",
description="TIBETAN DIGIT THREE",
direction="l",
linebreak="nu",
- unicodeslot=0x0F23,
+ unicodeslot=0xF23,
},
- [0x0F24]={
+ [0xF24]={
category="nd",
description="TIBETAN DIGIT FOUR",
direction="l",
linebreak="nu",
- unicodeslot=0x0F24,
+ unicodeslot=0xF24,
},
- [0x0F25]={
+ [0xF25]={
category="nd",
description="TIBETAN DIGIT FIVE",
direction="l",
linebreak="nu",
- unicodeslot=0x0F25,
+ unicodeslot=0xF25,
},
- [0x0F26]={
+ [0xF26]={
category="nd",
description="TIBETAN DIGIT SIX",
direction="l",
linebreak="nu",
- unicodeslot=0x0F26,
+ unicodeslot=0xF26,
},
- [0x0F27]={
+ [0xF27]={
category="nd",
description="TIBETAN DIGIT SEVEN",
direction="l",
linebreak="nu",
- unicodeslot=0x0F27,
+ unicodeslot=0xF27,
},
- [0x0F28]={
+ [0xF28]={
category="nd",
description="TIBETAN DIGIT EIGHT",
direction="l",
linebreak="nu",
- unicodeslot=0x0F28,
+ unicodeslot=0xF28,
},
- [0x0F29]={
+ [0xF29]={
category="nd",
description="TIBETAN DIGIT NINE",
direction="l",
linebreak="nu",
- unicodeslot=0x0F29,
+ unicodeslot=0xF29,
},
- [0x0F2A]={
+ [0xF2A]={
category="no",
description="TIBETAN DIGIT HALF ONE",
direction="l",
linebreak="al",
- unicodeslot=0x0F2A,
+ unicodeslot=0xF2A,
},
- [0x0F2B]={
+ [0xF2B]={
category="no",
description="TIBETAN DIGIT HALF TWO",
direction="l",
linebreak="al",
- unicodeslot=0x0F2B,
+ unicodeslot=0xF2B,
},
- [0x0F2C]={
+ [0xF2C]={
category="no",
description="TIBETAN DIGIT HALF THREE",
direction="l",
linebreak="al",
- unicodeslot=0x0F2C,
+ unicodeslot=0xF2C,
},
- [0x0F2D]={
+ [0xF2D]={
category="no",
description="TIBETAN DIGIT HALF FOUR",
direction="l",
linebreak="al",
- unicodeslot=0x0F2D,
+ unicodeslot=0xF2D,
},
- [0x0F2E]={
+ [0xF2E]={
category="no",
description="TIBETAN DIGIT HALF FIVE",
direction="l",
linebreak="al",
- unicodeslot=0x0F2E,
+ unicodeslot=0xF2E,
},
- [0x0F2F]={
+ [0xF2F]={
category="no",
description="TIBETAN DIGIT HALF SIX",
direction="l",
linebreak="al",
- unicodeslot=0x0F2F,
+ unicodeslot=0xF2F,
},
- [0x0F30]={
+ [0xF30]={
category="no",
description="TIBETAN DIGIT HALF SEVEN",
direction="l",
linebreak="al",
- unicodeslot=0x0F30,
+ unicodeslot=0xF30,
},
- [0x0F31]={
+ [0xF31]={
category="no",
description="TIBETAN DIGIT HALF EIGHT",
direction="l",
linebreak="al",
- unicodeslot=0x0F31,
+ unicodeslot=0xF31,
},
- [0x0F32]={
+ [0xF32]={
category="no",
description="TIBETAN DIGIT HALF NINE",
direction="l",
linebreak="al",
- unicodeslot=0x0F32,
+ unicodeslot=0xF32,
},
- [0x0F33]={
+ [0xF33]={
category="no",
description="TIBETAN DIGIT HALF ZERO",
direction="l",
linebreak="al",
- unicodeslot=0x0F33,
+ unicodeslot=0xF33,
},
- [0x0F34]={
+ [0xF34]={
category="so",
description="TIBETAN MARK BSDUS RTAGS",
direction="l",
linebreak="ba",
- unicodeslot=0x0F34,
+ unicodeslot=0xF34,
},
- [0x0F35]={
+ [0xF35]={
category="mn",
+ combining=0xDC,
description="TIBETAN MARK NGAS BZUNG NYI ZLA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F35,
+ unicodeslot=0xF35,
},
- [0x0F36]={
+ [0xF36]={
category="so",
description="TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN",
direction="l",
linebreak="al",
- unicodeslot=0x0F36,
+ unicodeslot=0xF36,
},
- [0x0F37]={
+ [0xF37]={
category="mn",
+ combining=0xDC,
description="TIBETAN MARK NGAS BZUNG SGOR RTAGS",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F37,
+ unicodeslot=0xF37,
},
- [0x0F38]={
+ [0xF38]={
category="so",
description="TIBETAN MARK CHE MGO",
direction="l",
linebreak="al",
- unicodeslot=0x0F38,
+ unicodeslot=0xF38,
},
- [0x0F39]={
+ [0xF39]={
category="mn",
+ combining=0xD8,
description="TIBETAN MARK TSA -PHRU",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F39,
+ unicodeslot=0xF39,
},
- [0x0F3A]={
+ [0xF3A]={
category="ps",
description="TIBETAN MARK GUG RTAGS GYON",
direction="on",
linebreak="op",
- mirror=0x0F3B,
- unicodeslot=0x0F3A,
+ mirror=0xF3B,
+ unicodeslot=0xF3A,
},
- [0x0F3B]={
+ [0xF3B]={
category="pe",
description="TIBETAN MARK GUG RTAGS GYAS",
direction="on",
linebreak="cl",
- mirror=0x0F3A,
- unicodeslot=0x0F3B,
+ mirror=0xF3A,
+ unicodeslot=0xF3B,
},
- [0x0F3C]={
+ [0xF3C]={
category="ps",
description="TIBETAN MARK ANG KHANG GYON",
direction="on",
linebreak="op",
- mirror=0x0F3D,
- unicodeslot=0x0F3C,
+ mirror=0xF3D,
+ unicodeslot=0xF3C,
},
- [0x0F3D]={
+ [0xF3D]={
category="pe",
description="TIBETAN MARK ANG KHANG GYAS",
direction="on",
linebreak="cl",
- mirror=0x0F3C,
- unicodeslot=0x0F3D,
+ mirror=0xF3C,
+ unicodeslot=0xF3D,
},
- [0x0F3E]={
+ [0xF3E]={
category="mc",
description="TIBETAN SIGN YAR TSHES",
direction="l",
linebreak="cm",
- unicodeslot=0x0F3E,
+ unicodeslot=0xF3E,
},
- [0x0F3F]={
+ [0xF3F]={
category="mc",
description="TIBETAN SIGN MAR TSHES",
direction="l",
linebreak="cm",
- unicodeslot=0x0F3F,
+ unicodeslot=0xF3F,
},
- [0x0F40]={
+ [0xF40]={
category="lo",
description="TIBETAN LETTER KA",
direction="l",
linebreak="al",
- unicodeslot=0x0F40,
+ unicodeslot=0xF40,
},
- [0x0F41]={
+ [0xF41]={
category="lo",
description="TIBETAN LETTER KHA",
direction="l",
linebreak="al",
- unicodeslot=0x0F41,
+ unicodeslot=0xF41,
},
- [0x0F42]={
+ [0xF42]={
category="lo",
description="TIBETAN LETTER GA",
direction="l",
linebreak="al",
- unicodeslot=0x0F42,
+ unicodeslot=0xF42,
},
- [0x0F43]={
+ [0xF43]={
category="lo",
description="TIBETAN LETTER GHA",
direction="l",
linebreak="al",
- specials={ "char", 0x0F42, 0x0FB7 },
- unicodeslot=0x0F43,
+ specials={ "char", 0xF42, 0xFB7 },
+ unicodeslot=0xF43,
},
- [0x0F44]={
+ [0xF44]={
category="lo",
description="TIBETAN LETTER NGA",
direction="l",
linebreak="al",
- unicodeslot=0x0F44,
+ unicodeslot=0xF44,
},
- [0x0F45]={
+ [0xF45]={
category="lo",
description="TIBETAN LETTER CA",
direction="l",
linebreak="al",
- unicodeslot=0x0F45,
+ unicodeslot=0xF45,
},
- [0x0F46]={
+ [0xF46]={
category="lo",
description="TIBETAN LETTER CHA",
direction="l",
linebreak="al",
- unicodeslot=0x0F46,
+ unicodeslot=0xF46,
},
- [0x0F47]={
+ [0xF47]={
category="lo",
description="TIBETAN LETTER JA",
direction="l",
linebreak="al",
- unicodeslot=0x0F47,
+ unicodeslot=0xF47,
},
- [0x0F49]={
+ [0xF49]={
category="lo",
description="TIBETAN LETTER NYA",
direction="l",
linebreak="al",
- unicodeslot=0x0F49,
+ unicodeslot=0xF49,
},
- [0x0F4A]={
+ [0xF4A]={
category="lo",
description="TIBETAN LETTER TTA",
direction="l",
linebreak="al",
- unicodeslot=0x0F4A,
+ unicodeslot=0xF4A,
},
- [0x0F4B]={
+ [0xF4B]={
category="lo",
description="TIBETAN LETTER TTHA",
direction="l",
linebreak="al",
- unicodeslot=0x0F4B,
+ unicodeslot=0xF4B,
},
- [0x0F4C]={
+ [0xF4C]={
category="lo",
description="TIBETAN LETTER DDA",
direction="l",
linebreak="al",
- unicodeslot=0x0F4C,
+ unicodeslot=0xF4C,
},
- [0x0F4D]={
+ [0xF4D]={
category="lo",
description="TIBETAN LETTER DDHA",
direction="l",
linebreak="al",
- specials={ "char", 0x0F4C, 0x0FB7 },
- unicodeslot=0x0F4D,
+ specials={ "char", 0xF4C, 0xFB7 },
+ unicodeslot=0xF4D,
},
- [0x0F4E]={
+ [0xF4E]={
category="lo",
description="TIBETAN LETTER NNA",
direction="l",
linebreak="al",
- unicodeslot=0x0F4E,
+ unicodeslot=0xF4E,
},
- [0x0F4F]={
+ [0xF4F]={
category="lo",
description="TIBETAN LETTER TA",
direction="l",
linebreak="al",
- unicodeslot=0x0F4F,
+ unicodeslot=0xF4F,
},
- [0x0F50]={
+ [0xF50]={
category="lo",
description="TIBETAN LETTER THA",
direction="l",
linebreak="al",
- unicodeslot=0x0F50,
+ unicodeslot=0xF50,
},
- [0x0F51]={
+ [0xF51]={
category="lo",
description="TIBETAN LETTER DA",
direction="l",
linebreak="al",
- unicodeslot=0x0F51,
+ unicodeslot=0xF51,
},
- [0x0F52]={
+ [0xF52]={
category="lo",
description="TIBETAN LETTER DHA",
direction="l",
linebreak="al",
- specials={ "char", 0x0F51, 0x0FB7 },
- unicodeslot=0x0F52,
+ specials={ "char", 0xF51, 0xFB7 },
+ unicodeslot=0xF52,
},
- [0x0F53]={
+ [0xF53]={
category="lo",
description="TIBETAN LETTER NA",
direction="l",
linebreak="al",
- unicodeslot=0x0F53,
+ unicodeslot=0xF53,
},
- [0x0F54]={
+ [0xF54]={
category="lo",
description="TIBETAN LETTER PA",
direction="l",
linebreak="al",
- unicodeslot=0x0F54,
+ unicodeslot=0xF54,
},
- [0x0F55]={
+ [0xF55]={
category="lo",
description="TIBETAN LETTER PHA",
direction="l",
linebreak="al",
- unicodeslot=0x0F55,
+ unicodeslot=0xF55,
},
- [0x0F56]={
+ [0xF56]={
category="lo",
description="TIBETAN LETTER BA",
direction="l",
linebreak="al",
- unicodeslot=0x0F56,
+ unicodeslot=0xF56,
},
- [0x0F57]={
+ [0xF57]={
category="lo",
description="TIBETAN LETTER BHA",
direction="l",
linebreak="al",
- specials={ "char", 0x0F56, 0x0FB7 },
- unicodeslot=0x0F57,
+ specials={ "char", 0xF56, 0xFB7 },
+ unicodeslot=0xF57,
},
- [0x0F58]={
+ [0xF58]={
category="lo",
description="TIBETAN LETTER MA",
direction="l",
linebreak="al",
- unicodeslot=0x0F58,
+ unicodeslot=0xF58,
},
- [0x0F59]={
+ [0xF59]={
category="lo",
description="TIBETAN LETTER TSA",
direction="l",
linebreak="al",
- unicodeslot=0x0F59,
+ unicodeslot=0xF59,
},
- [0x0F5A]={
+ [0xF5A]={
category="lo",
description="TIBETAN LETTER TSHA",
direction="l",
linebreak="al",
- unicodeslot=0x0F5A,
+ unicodeslot=0xF5A,
},
- [0x0F5B]={
+ [0xF5B]={
category="lo",
description="TIBETAN LETTER DZA",
direction="l",
linebreak="al",
- unicodeslot=0x0F5B,
+ unicodeslot=0xF5B,
},
- [0x0F5C]={
+ [0xF5C]={
category="lo",
description="TIBETAN LETTER DZHA",
direction="l",
linebreak="al",
- specials={ "char", 0x0F5B, 0x0FB7 },
- unicodeslot=0x0F5C,
+ specials={ "char", 0xF5B, 0xFB7 },
+ unicodeslot=0xF5C,
},
- [0x0F5D]={
+ [0xF5D]={
category="lo",
description="TIBETAN LETTER WA",
direction="l",
linebreak="al",
- unicodeslot=0x0F5D,
+ unicodeslot=0xF5D,
},
- [0x0F5E]={
+ [0xF5E]={
category="lo",
description="TIBETAN LETTER ZHA",
direction="l",
linebreak="al",
- unicodeslot=0x0F5E,
+ unicodeslot=0xF5E,
},
- [0x0F5F]={
+ [0xF5F]={
category="lo",
description="TIBETAN LETTER ZA",
direction="l",
linebreak="al",
- unicodeslot=0x0F5F,
+ unicodeslot=0xF5F,
},
- [0x0F60]={
+ [0xF60]={
category="lo",
description="TIBETAN LETTER -A",
direction="l",
linebreak="al",
- unicodeslot=0x0F60,
+ unicodeslot=0xF60,
},
- [0x0F61]={
+ [0xF61]={
category="lo",
description="TIBETAN LETTER YA",
direction="l",
linebreak="al",
- unicodeslot=0x0F61,
+ unicodeslot=0xF61,
},
- [0x0F62]={
+ [0xF62]={
category="lo",
description="TIBETAN LETTER RA",
direction="l",
linebreak="al",
- unicodeslot=0x0F62,
+ unicodeslot=0xF62,
},
- [0x0F63]={
+ [0xF63]={
category="lo",
description="TIBETAN LETTER LA",
direction="l",
linebreak="al",
- unicodeslot=0x0F63,
+ unicodeslot=0xF63,
},
- [0x0F64]={
+ [0xF64]={
category="lo",
description="TIBETAN LETTER SHA",
direction="l",
linebreak="al",
- unicodeslot=0x0F64,
+ unicodeslot=0xF64,
},
- [0x0F65]={
+ [0xF65]={
category="lo",
description="TIBETAN LETTER SSA",
direction="l",
linebreak="al",
- unicodeslot=0x0F65,
+ unicodeslot=0xF65,
},
- [0x0F66]={
+ [0xF66]={
category="lo",
description="TIBETAN LETTER SA",
direction="l",
linebreak="al",
- unicodeslot=0x0F66,
+ unicodeslot=0xF66,
},
- [0x0F67]={
+ [0xF67]={
category="lo",
description="TIBETAN LETTER HA",
direction="l",
linebreak="al",
- unicodeslot=0x0F67,
+ unicodeslot=0xF67,
},
- [0x0F68]={
+ [0xF68]={
category="lo",
description="TIBETAN LETTER A",
direction="l",
linebreak="al",
- unicodeslot=0x0F68,
+ unicodeslot=0xF68,
},
- [0x0F69]={
+ [0xF69]={
category="lo",
description="TIBETAN LETTER KSSA",
direction="l",
linebreak="al",
- specials={ "char", 0x0F40, 0x0FB5 },
- unicodeslot=0x0F69,
+ specials={ "char", 0xF40, 0xFB5 },
+ unicodeslot=0xF69,
},
- [0x0F6A]={
+ [0xF6A]={
category="lo",
description="TIBETAN LETTER FIXED-FORM RA",
direction="l",
linebreak="al",
- unicodeslot=0x0F6A,
+ unicodeslot=0xF6A,
},
- [0x0F6B]={
+ [0xF6B]={
category="lo",
description="TIBETAN LETTER KKA",
direction="l",
linebreak="al",
- unicodeslot=0x0F6B,
+ unicodeslot=0xF6B,
},
- [0x0F6C]={
+ [0xF6C]={
category="lo",
description="TIBETAN LETTER RRA",
direction="l",
linebreak="al",
- unicodeslot=0x0F6C,
+ unicodeslot=0xF6C,
},
- [0x0F71]={
+ [0xF71]={
category="mn",
+ combining=0x81,
description="TIBETAN VOWEL SIGN AA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F71,
+ unicodeslot=0xF71,
},
- [0x0F72]={
+ [0xF72]={
category="mn",
+ combining=0x82,
description="TIBETAN VOWEL SIGN I",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F72,
+ unicodeslot=0xF72,
},
- [0x0F73]={
+ [0xF73]={
category="mn",
description="TIBETAN VOWEL SIGN II",
direction="nsm",
linebreak="cm",
- specials={ "char", 0x0F71, 0x0F72 },
- unicodeslot=0x0F73,
+ specials={ "char", 0xF71, 0xF72 },
+ unicodeslot=0xF73,
},
- [0x0F74]={
+ [0xF74]={
category="mn",
+ combining=0x84,
description="TIBETAN VOWEL SIGN U",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F74,
+ unicodeslot=0xF74,
},
- [0x0F75]={
+ [0xF75]={
category="mn",
description="TIBETAN VOWEL SIGN UU",
direction="nsm",
linebreak="cm",
- specials={ "char", 0x0F71, 0x0F74 },
- unicodeslot=0x0F75,
+ specials={ "char", 0xF71, 0xF74 },
+ unicodeslot=0xF75,
},
- [0x0F76]={
+ [0xF76]={
category="mn",
description="TIBETAN VOWEL SIGN VOCALIC R",
direction="nsm",
linebreak="cm",
- specials={ "char", 0x0FB2, 0x0F80 },
- unicodeslot=0x0F76,
+ specials={ "char", 0xFB2, 0xF80 },
+ unicodeslot=0xF76,
},
- [0x0F77]={
+ [0xF77]={
category="mn",
description="TIBETAN VOWEL SIGN VOCALIC RR",
direction="nsm",
linebreak="cm",
- specials={ "compat", 0x0FB2, 0x0F81 },
- unicodeslot=0x0F77,
+ specials={ "compat", 0xFB2, 0xF81 },
+ unicodeslot=0xF77,
},
- [0x0F78]={
+ [0xF78]={
category="mn",
description="TIBETAN VOWEL SIGN VOCALIC L",
direction="nsm",
linebreak="cm",
- specials={ "char", 0x0FB3, 0x0F80 },
- unicodeslot=0x0F78,
+ specials={ "char", 0xFB3, 0xF80 },
+ unicodeslot=0xF78,
},
- [0x0F79]={
+ [0xF79]={
category="mn",
description="TIBETAN VOWEL SIGN VOCALIC LL",
direction="nsm",
linebreak="cm",
- specials={ "compat", 0x0FB3, 0x0F81 },
- unicodeslot=0x0F79,
+ specials={ "compat", 0xFB3, 0xF81 },
+ unicodeslot=0xF79,
},
- [0x0F7A]={
+ [0xF7A]={
category="mn",
+ combining=0x82,
description="TIBETAN VOWEL SIGN E",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F7A,
+ unicodeslot=0xF7A,
},
- [0x0F7B]={
+ [0xF7B]={
category="mn",
+ combining=0x82,
description="TIBETAN VOWEL SIGN EE",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F7B,
+ unicodeslot=0xF7B,
},
- [0x0F7C]={
+ [0xF7C]={
category="mn",
+ combining=0x82,
description="TIBETAN VOWEL SIGN O",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F7C,
+ unicodeslot=0xF7C,
},
- [0x0F7D]={
+ [0xF7D]={
category="mn",
+ combining=0x82,
description="TIBETAN VOWEL SIGN OO",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F7D,
+ unicodeslot=0xF7D,
},
- [0x0F7E]={
+ [0xF7E]={
category="mn",
description="TIBETAN SIGN RJES SU NGA RO",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F7E,
+ unicodeslot=0xF7E,
},
- [0x0F7F]={
+ [0xF7F]={
category="mc",
description="TIBETAN SIGN RNAM BCAD",
direction="l",
linebreak="ba",
- unicodeslot=0x0F7F,
+ unicodeslot=0xF7F,
},
- [0x0F80]={
+ [0xF80]={
category="mn",
+ combining=0x82,
description="TIBETAN VOWEL SIGN REVERSED I",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F80,
+ unicodeslot=0xF80,
},
- [0x0F81]={
+ [0xF81]={
category="mn",
description="TIBETAN VOWEL SIGN REVERSED II",
direction="nsm",
linebreak="cm",
- specials={ "char", 0x0F71, 0x0F80 },
- unicodeslot=0x0F81,
+ specials={ "char", 0xF71, 0xF80 },
+ unicodeslot=0xF81,
},
- [0x0F82]={
+ [0xF82]={
category="mn",
+ combining=0xE6,
description="TIBETAN SIGN NYI ZLA NAA DA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F82,
+ unicodeslot=0xF82,
},
- [0x0F83]={
+ [0xF83]={
category="mn",
+ combining=0xE6,
description="TIBETAN SIGN SNA LDAN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F83,
+ unicodeslot=0xF83,
},
- [0x0F84]={
+ [0xF84]={
category="mn",
+ combining=0x9,
description="TIBETAN MARK HALANTA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F84,
+ unicodeslot=0xF84,
},
- [0x0F85]={
+ [0xF85]={
category="po",
description="TIBETAN MARK PALUTA",
direction="l",
linebreak="ba",
- unicodeslot=0x0F85,
+ unicodeslot=0xF85,
},
- [0x0F86]={
+ [0xF86]={
category="mn",
+ combining=0xE6,
description="TIBETAN SIGN LCI RTAGS",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F86,
+ unicodeslot=0xF86,
},
- [0x0F87]={
+ [0xF87]={
category="mn",
+ combining=0xE6,
description="TIBETAN SIGN YANG RTAGS",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F87,
+ unicodeslot=0xF87,
},
- [0x0F88]={
+ [0xF88]={
category="lo",
description="TIBETAN SIGN LCE TSA CAN",
direction="l",
linebreak="al",
- unicodeslot=0x0F88,
+ unicodeslot=0xF88,
},
- [0x0F89]={
+ [0xF89]={
category="lo",
description="TIBETAN SIGN MCHU CAN",
direction="l",
linebreak="al",
- unicodeslot=0x0F89,
+ unicodeslot=0xF89,
},
- [0x0F8A]={
+ [0xF8A]={
category="lo",
description="TIBETAN SIGN GRU CAN RGYINGS",
direction="l",
linebreak="al",
- unicodeslot=0x0F8A,
+ unicodeslot=0xF8A,
},
- [0x0F8B]={
+ [0xF8B]={
category="lo",
description="TIBETAN SIGN GRU MED RGYINGS",
direction="l",
linebreak="al",
- unicodeslot=0x0F8B,
+ unicodeslot=0xF8B,
},
- [0x0F8C]={
+ [0xF8C]={
category="lo",
description="TIBETAN SIGN INVERTED MCHU CAN",
direction="l",
linebreak="al",
- unicodeslot=0x0F8C,
+ unicodeslot=0xF8C,
},
- [0x0F8D]={
+ [0xF8D]={
category="mn",
description="TIBETAN SUBJOINED SIGN LCE TSA CAN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F8D,
+ unicodeslot=0xF8D,
},
- [0x0F8E]={
+ [0xF8E]={
category="mn",
description="TIBETAN SUBJOINED SIGN MCHU CAN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F8E,
+ unicodeslot=0xF8E,
},
- [0x0F8F]={
+ [0xF8F]={
category="mn",
description="TIBETAN SUBJOINED SIGN INVERTED MCHU CAN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F8F,
+ unicodeslot=0xF8F,
},
- [0x0F90]={
+ [0xF90]={
category="mn",
description="TIBETAN SUBJOINED LETTER KA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F90,
+ unicodeslot=0xF90,
},
- [0x0F91]={
+ [0xF91]={
category="mn",
description="TIBETAN SUBJOINED LETTER KHA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F91,
+ unicodeslot=0xF91,
},
- [0x0F92]={
+ [0xF92]={
category="mn",
description="TIBETAN SUBJOINED LETTER GA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F92,
+ unicodeslot=0xF92,
},
- [0x0F93]={
+ [0xF93]={
category="mn",
description="TIBETAN SUBJOINED LETTER GHA",
direction="nsm",
linebreak="cm",
- specials={ "char", 0x0F92, 0x0FB7 },
- unicodeslot=0x0F93,
+ specials={ "char", 0xF92, 0xFB7 },
+ unicodeslot=0xF93,
},
- [0x0F94]={
+ [0xF94]={
category="mn",
description="TIBETAN SUBJOINED LETTER NGA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F94,
+ unicodeslot=0xF94,
},
- [0x0F95]={
+ [0xF95]={
category="mn",
description="TIBETAN SUBJOINED LETTER CA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F95,
+ unicodeslot=0xF95,
},
- [0x0F96]={
+ [0xF96]={
category="mn",
description="TIBETAN SUBJOINED LETTER CHA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F96,
+ unicodeslot=0xF96,
},
- [0x0F97]={
+ [0xF97]={
category="mn",
description="TIBETAN SUBJOINED LETTER JA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F97,
+ unicodeslot=0xF97,
},
- [0x0F99]={
+ [0xF99]={
category="mn",
description="TIBETAN SUBJOINED LETTER NYA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F99,
+ unicodeslot=0xF99,
},
- [0x0F9A]={
+ [0xF9A]={
category="mn",
description="TIBETAN SUBJOINED LETTER TTA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F9A,
+ unicodeslot=0xF9A,
},
- [0x0F9B]={
+ [0xF9B]={
category="mn",
description="TIBETAN SUBJOINED LETTER TTHA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F9B,
+ unicodeslot=0xF9B,
},
- [0x0F9C]={
+ [0xF9C]={
category="mn",
description="TIBETAN SUBJOINED LETTER DDA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F9C,
+ unicodeslot=0xF9C,
},
- [0x0F9D]={
+ [0xF9D]={
category="mn",
description="TIBETAN SUBJOINED LETTER DDHA",
direction="nsm",
linebreak="cm",
- specials={ "char", 0x0F9C, 0x0FB7 },
- unicodeslot=0x0F9D,
+ specials={ "char", 0xF9C, 0xFB7 },
+ unicodeslot=0xF9D,
},
- [0x0F9E]={
+ [0xF9E]={
category="mn",
description="TIBETAN SUBJOINED LETTER NNA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F9E,
+ unicodeslot=0xF9E,
},
- [0x0F9F]={
+ [0xF9F]={
category="mn",
description="TIBETAN SUBJOINED LETTER TA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0F9F,
+ unicodeslot=0xF9F,
},
- [0x0FA0]={
+ [0xFA0]={
category="mn",
description="TIBETAN SUBJOINED LETTER THA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FA0,
+ unicodeslot=0xFA0,
},
- [0x0FA1]={
+ [0xFA1]={
category="mn",
description="TIBETAN SUBJOINED LETTER DA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FA1,
+ unicodeslot=0xFA1,
},
- [0x0FA2]={
+ [0xFA2]={
category="mn",
description="TIBETAN SUBJOINED LETTER DHA",
direction="nsm",
linebreak="cm",
- specials={ "char", 0x0FA1, 0x0FB7 },
- unicodeslot=0x0FA2,
+ specials={ "char", 0xFA1, 0xFB7 },
+ unicodeslot=0xFA2,
},
- [0x0FA3]={
+ [0xFA3]={
category="mn",
description="TIBETAN SUBJOINED LETTER NA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FA3,
+ unicodeslot=0xFA3,
},
- [0x0FA4]={
+ [0xFA4]={
category="mn",
description="TIBETAN SUBJOINED LETTER PA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FA4,
+ unicodeslot=0xFA4,
},
- [0x0FA5]={
+ [0xFA5]={
category="mn",
description="TIBETAN SUBJOINED LETTER PHA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FA5,
+ unicodeslot=0xFA5,
},
- [0x0FA6]={
+ [0xFA6]={
category="mn",
description="TIBETAN SUBJOINED LETTER BA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FA6,
+ unicodeslot=0xFA6,
},
- [0x0FA7]={
+ [0xFA7]={
category="mn",
description="TIBETAN SUBJOINED LETTER BHA",
direction="nsm",
linebreak="cm",
- specials={ "char", 0x0FA6, 0x0FB7 },
- unicodeslot=0x0FA7,
+ specials={ "char", 0xFA6, 0xFB7 },
+ unicodeslot=0xFA7,
},
- [0x0FA8]={
+ [0xFA8]={
category="mn",
description="TIBETAN SUBJOINED LETTER MA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FA8,
+ unicodeslot=0xFA8,
},
- [0x0FA9]={
+ [0xFA9]={
category="mn",
description="TIBETAN SUBJOINED LETTER TSA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FA9,
+ unicodeslot=0xFA9,
},
- [0x0FAA]={
+ [0xFAA]={
category="mn",
description="TIBETAN SUBJOINED LETTER TSHA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FAA,
+ unicodeslot=0xFAA,
},
- [0x0FAB]={
+ [0xFAB]={
category="mn",
description="TIBETAN SUBJOINED LETTER DZA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FAB,
+ unicodeslot=0xFAB,
},
- [0x0FAC]={
+ [0xFAC]={
category="mn",
description="TIBETAN SUBJOINED LETTER DZHA",
direction="nsm",
linebreak="cm",
- specials={ "char", 0x0FAB, 0x0FB7 },
- unicodeslot=0x0FAC,
+ specials={ "char", 0xFAB, 0xFB7 },
+ unicodeslot=0xFAC,
},
- [0x0FAD]={
+ [0xFAD]={
category="mn",
description="TIBETAN SUBJOINED LETTER WA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FAD,
+ unicodeslot=0xFAD,
},
- [0x0FAE]={
+ [0xFAE]={
category="mn",
description="TIBETAN SUBJOINED LETTER ZHA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FAE,
+ unicodeslot=0xFAE,
},
- [0x0FAF]={
+ [0xFAF]={
category="mn",
description="TIBETAN SUBJOINED LETTER ZA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FAF,
+ unicodeslot=0xFAF,
},
- [0x0FB0]={
+ [0xFB0]={
category="mn",
description="TIBETAN SUBJOINED LETTER -A",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FB0,
+ unicodeslot=0xFB0,
},
- [0x0FB1]={
+ [0xFB1]={
category="mn",
description="TIBETAN SUBJOINED LETTER YA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FB1,
+ unicodeslot=0xFB1,
},
- [0x0FB2]={
+ [0xFB2]={
category="mn",
description="TIBETAN SUBJOINED LETTER RA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FB2,
+ unicodeslot=0xFB2,
},
- [0x0FB3]={
+ [0xFB3]={
category="mn",
description="TIBETAN SUBJOINED LETTER LA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FB3,
+ unicodeslot=0xFB3,
},
- [0x0FB4]={
+ [0xFB4]={
category="mn",
description="TIBETAN SUBJOINED LETTER SHA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FB4,
+ unicodeslot=0xFB4,
},
- [0x0FB5]={
+ [0xFB5]={
category="mn",
description="TIBETAN SUBJOINED LETTER SSA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FB5,
+ unicodeslot=0xFB5,
},
- [0x0FB6]={
+ [0xFB6]={
category="mn",
description="TIBETAN SUBJOINED LETTER SA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FB6,
+ unicodeslot=0xFB6,
},
- [0x0FB7]={
+ [0xFB7]={
category="mn",
description="TIBETAN SUBJOINED LETTER HA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FB7,
+ unicodeslot=0xFB7,
},
- [0x0FB8]={
+ [0xFB8]={
category="mn",
description="TIBETAN SUBJOINED LETTER A",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FB8,
+ unicodeslot=0xFB8,
},
- [0x0FB9]={
+ [0xFB9]={
category="mn",
description="TIBETAN SUBJOINED LETTER KSSA",
direction="nsm",
linebreak="cm",
- specials={ "char", 0x0F90, 0x0FB5 },
- unicodeslot=0x0FB9,
+ specials={ "char", 0xF90, 0xFB5 },
+ unicodeslot=0xFB9,
},
- [0x0FBA]={
+ [0xFBA]={
category="mn",
description="TIBETAN SUBJOINED LETTER FIXED-FORM WA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FBA,
+ unicodeslot=0xFBA,
},
- [0x0FBB]={
+ [0xFBB]={
category="mn",
description="TIBETAN SUBJOINED LETTER FIXED-FORM YA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FBB,
+ unicodeslot=0xFBB,
},
- [0x0FBC]={
+ [0xFBC]={
category="mn",
description="TIBETAN SUBJOINED LETTER FIXED-FORM RA",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FBC,
+ unicodeslot=0xFBC,
},
- [0x0FBE]={
+ [0xFBE]={
category="so",
description="TIBETAN KU RU KHA",
direction="l",
linebreak="ba",
- unicodeslot=0x0FBE,
+ unicodeslot=0xFBE,
},
- [0x0FBF]={
+ [0xFBF]={
category="so",
description="TIBETAN KU RU KHA BZHI MIG CAN",
direction="l",
linebreak="ba",
- unicodeslot=0x0FBF,
+ unicodeslot=0xFBF,
},
- [0x0FC0]={
+ [0xFC0]={
category="so",
description="TIBETAN CANTILLATION SIGN HEAVY BEAT",
direction="l",
linebreak="al",
- unicodeslot=0x0FC0,
+ unicodeslot=0xFC0,
},
- [0x0FC1]={
+ [0xFC1]={
category="so",
description="TIBETAN CANTILLATION SIGN LIGHT BEAT",
direction="l",
linebreak="al",
- unicodeslot=0x0FC1,
+ unicodeslot=0xFC1,
},
- [0x0FC2]={
+ [0xFC2]={
category="so",
description="TIBETAN CANTILLATION SIGN CANG TE-U",
direction="l",
linebreak="al",
- unicodeslot=0x0FC2,
+ unicodeslot=0xFC2,
},
- [0x0FC3]={
+ [0xFC3]={
category="so",
description="TIBETAN CANTILLATION SIGN SBUB -CHAL",
direction="l",
linebreak="al",
- unicodeslot=0x0FC3,
+ unicodeslot=0xFC3,
},
- [0x0FC4]={
+ [0xFC4]={
category="so",
description="TIBETAN SYMBOL DRIL BU",
direction="l",
linebreak="al",
- unicodeslot=0x0FC4,
+ unicodeslot=0xFC4,
},
- [0x0FC5]={
+ [0xFC5]={
category="so",
description="TIBETAN SYMBOL RDO RJE",
direction="l",
linebreak="al",
- unicodeslot=0x0FC5,
+ unicodeslot=0xFC5,
},
- [0x0FC6]={
+ [0xFC6]={
category="mn",
+ combining=0xDC,
description="TIBETAN SYMBOL PADMA GDAN",
direction="nsm",
linebreak="cm",
- unicodeslot=0x0FC6,
+ unicodeslot=0xFC6,
},
- [0x0FC7]={
+ [0xFC7]={
category="so",
description="TIBETAN SYMBOL RDO RJE RGYA GRAM",
direction="l",
linebreak="al",
- unicodeslot=0x0FC7,
+ unicodeslot=0xFC7,
},
- [0x0FC8]={
+ [0xFC8]={
category="so",
description="TIBETAN SYMBOL PHUR PA",
direction="l",
linebreak="al",
- unicodeslot=0x0FC8,
+ unicodeslot=0xFC8,
},
- [0x0FC9]={
+ [0xFC9]={
category="so",
description="TIBETAN SYMBOL NOR BU",
direction="l",
linebreak="al",
- unicodeslot=0x0FC9,
+ unicodeslot=0xFC9,
},
- [0x0FCA]={
+ [0xFCA]={
category="so",
description="TIBETAN SYMBOL NOR BU NYIS -KHYIL",
direction="l",
linebreak="al",
- unicodeslot=0x0FCA,
+ unicodeslot=0xFCA,
},
- [0x0FCB]={
+ [0xFCB]={
category="so",
description="TIBETAN SYMBOL NOR BU GSUM -KHYIL",
direction="l",
linebreak="al",
- unicodeslot=0x0FCB,
+ unicodeslot=0xFCB,
},
- [0x0FCC]={
+ [0xFCC]={
category="so",
description="TIBETAN SYMBOL NOR BU BZHI -KHYIL",
direction="l",
linebreak="al",
- unicodeslot=0x0FCC,
+ unicodeslot=0xFCC,
},
- [0x0FCE]={
+ [0xFCE]={
category="so",
description="TIBETAN SIGN RDEL NAG RDEL DKAR",
direction="l",
linebreak="al",
- unicodeslot=0x0FCE,
+ unicodeslot=0xFCE,
},
- [0x0FCF]={
+ [0xFCF]={
category="so",
description="TIBETAN SIGN RDEL NAG GSUM",
direction="l",
linebreak="al",
- unicodeslot=0x0FCF,
+ unicodeslot=0xFCF,
},
- [0x0FD0]={
+ [0xFD0]={
category="po",
description="TIBETAN MARK BSKA- SHOG GI MGO RGYAN",
direction="l",
linebreak="bb",
- unicodeslot=0x0FD0,
+ unicodeslot=0xFD0,
},
- [0x0FD1]={
+ [0xFD1]={
category="po",
description="TIBETAN MARK MNYAM YIG GI MGO RGYAN",
direction="l",
linebreak="bb",
- unicodeslot=0x0FD1,
+ unicodeslot=0xFD1,
},
- [0x0FD2]={
+ [0xFD2]={
category="po",
description="TIBETAN MARK NYIS TSHEG",
direction="l",
linebreak="ba",
- unicodeslot=0x0FD2,
+ unicodeslot=0xFD2,
},
- [0x0FD3]={
+ [0xFD3]={
category="po",
description="TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA",
direction="l",
linebreak="bb",
- unicodeslot=0x0FD3,
+ unicodeslot=0xFD3,
},
- [0x0FD4]={
+ [0xFD4]={
category="po",
description="TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA",
direction="l",
linebreak="al",
- unicodeslot=0x0FD4,
+ unicodeslot=0xFD4,
},
- [0x0FD5]={
+ [0xFD5]={
category="so",
description="RIGHT-FACING SVASTI SIGN",
direction="l",
linebreak="al",
- unicodeslot=0x0FD5,
+ unicodeslot=0xFD5,
},
- [0x0FD6]={
+ [0xFD6]={
category="so",
description="LEFT-FACING SVASTI SIGN",
direction="l",
linebreak="al",
- unicodeslot=0x0FD6,
+ unicodeslot=0xFD6,
},
- [0x0FD7]={
+ [0xFD7]={
category="so",
description="RIGHT-FACING SVASTI SIGN WITH DOTS",
direction="l",
linebreak="al",
- unicodeslot=0x0FD7,
+ unicodeslot=0xFD7,
},
- [0x0FD8]={
+ [0xFD8]={
category="so",
description="LEFT-FACING SVASTI SIGN WITH DOTS",
direction="l",
linebreak="al",
- unicodeslot=0x0FD8,
+ unicodeslot=0xFD8,
},
- [0x0FD9]={
+ [0xFD9]={
category="po",
description="TIBETAN MARK LEADING MCHAN RTAGS",
direction="l",
linebreak="gl",
- unicodeslot=0x0FD9,
+ unicodeslot=0xFD9,
},
- [0x0FDA]={
+ [0xFDA]={
category="po",
description="TIBETAN MARK TRAILING MCHAN RTAGS",
direction="l",
linebreak="gl",
- unicodeslot=0x0FDA,
+ unicodeslot=0xFDA,
},
[0x1000]={
category="lo",
@@ -29541,6 +30180,7 @@ characters.data={
},
[0x1037]={
category="mn",
+ combining=0x7,
description="MYANMAR SIGN DOT BELOW",
direction="nsm",
linebreak="sa",
@@ -29555,6 +30195,7 @@ characters.data={
},
[0x1039]={
category="mn",
+ combining=0x9,
description="MYANMAR SIGN VIRAMA",
direction="nsm",
linebreak="sa",
@@ -29562,6 +30203,7 @@ characters.data={
},
[0x103A]={
category="mn",
+ combining=0x9,
description="MYANMAR SIGN ASAT",
direction="nsm",
linebreak="sa",
@@ -30143,6 +30785,7 @@ characters.data={
},
[0x108D]={
category="mn",
+ combining=0xDC,
description="MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE",
direction="nsm",
linebreak="sa",
@@ -35101,6 +35744,7 @@ characters.data={
},
[0x135D]={
category="mn",
+ combining=0xE6,
description="ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK",
direction="nsm",
linebreak="cm",
@@ -35108,6 +35752,7 @@ characters.data={
},
[0x135E]={
category="mn",
+ combining=0xE6,
description="ETHIOPIC COMBINING VOWEL LENGTH MARK",
direction="nsm",
linebreak="cm",
@@ -35115,6 +35760,7 @@ characters.data={
},
[0x135F]={
category="mn",
+ combining=0xE6,
description="ETHIOPIC COMBINING GEMINATION MARK",
direction="nsm",
linebreak="cm",
@@ -41352,6 +41998,62 @@ characters.data={
linebreak="al",
unicodeslot=0x16F0,
},
+ [0x16F1]={
+ category="lo",
+ description="RUNIC LETTER K",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16F1,
+ },
+ [0x16F2]={
+ category="lo",
+ description="RUNIC LETTER SH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16F2,
+ },
+ [0x16F3]={
+ category="lo",
+ description="RUNIC LETTER OO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16F3,
+ },
+ [0x16F4]={
+ category="lo",
+ description="RUNIC LETTER FRANKS CASKET OS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16F4,
+ },
+ [0x16F5]={
+ category="lo",
+ description="RUNIC LETTER FRANKS CASKET IS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16F5,
+ },
+ [0x16F6]={
+ category="lo",
+ description="RUNIC LETTER FRANKS CASKET EH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16F6,
+ },
+ [0x16F7]={
+ category="lo",
+ description="RUNIC LETTER FRANKS CASKET AC",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16F7,
+ },
+ [0x16F8]={
+ category="lo",
+ description="RUNIC LETTER FRANKS CASKET AESC",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16F8,
+ },
[0x1700]={
category="lo",
description="TAGALOG LETTER A",
@@ -41487,6 +42189,7 @@ characters.data={
},
[0x1714]={
category="mn",
+ combining=0x9,
description="TAGALOG SIGN VIRAMA",
direction="nsm",
linebreak="cm",
@@ -41634,6 +42337,7 @@ characters.data={
},
[0x1734]={
category="mn",
+ combining=0x9,
description="HANUNOO SIGN PAMUDPOD",
direction="nsm",
linebreak="cm",
@@ -42495,6 +43199,7 @@ characters.data={
},
[0x17D2]={
category="mn",
+ combining=0x9,
description="KHMER SIGN COENG",
direction="nsm",
linebreak="sa",
@@ -42572,6 +43277,7 @@ characters.data={
},
[0x17DD]={
category="mn",
+ combining=0xE6,
description="KHMER SIGN ATTHACAN",
direction="nsm",
linebreak="sa",
@@ -42760,6 +43466,7 @@ characters.data={
unicodeslot=0x1805,
},
[0x1806]={
+ arabic="u",
category="pd",
description="MONGOLIAN TODO SOFT HYPHEN",
direction="on",
@@ -42767,6 +43474,7 @@ characters.data={
unicodeslot=0x1806,
},
[0x1807]={
+ arabic="d",
category="po",
description="MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER",
direction="on",
@@ -42788,6 +43496,7 @@ characters.data={
unicodeslot=0x1809,
},
[0x180A]={
+ arabic="c",
category="po",
description="MONGOLIAN NIRUGU",
direction="on",
@@ -42816,9 +43525,10 @@ characters.data={
unicodeslot=0x180D,
},
[0x180E]={
+ arabic="u",
category="zs",
description="MONGOLIAN VOWEL SEPARATOR",
- direction="ws",
+ direction="bn",
linebreak="gl",
unicodeslot=0x180E,
},
@@ -42893,6 +43603,7 @@ characters.data={
unicodeslot=0x1819,
},
[0x1820]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER A",
direction="l",
@@ -42904,6 +43615,7 @@ characters.data={
},
},
[0x1821]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER E",
direction="l",
@@ -42914,6 +43626,7 @@ characters.data={
},
},
[0x1822]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER I",
direction="l",
@@ -42924,6 +43637,7 @@ characters.data={
},
},
[0x1823]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER O",
direction="l",
@@ -42934,6 +43648,7 @@ characters.data={
},
},
[0x1824]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER U",
direction="l",
@@ -42944,6 +43659,7 @@ characters.data={
},
},
[0x1825]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER OE",
direction="l",
@@ -42955,6 +43671,7 @@ characters.data={
},
},
[0x1826]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER UE",
direction="l",
@@ -42966,6 +43683,7 @@ characters.data={
},
},
[0x1827]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER EE",
direction="l",
@@ -42973,6 +43691,7 @@ characters.data={
unicodeslot=0x1827,
},
[0x1828]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER NA",
direction="l",
@@ -42985,6 +43704,7 @@ characters.data={
},
},
[0x1829]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER ANG",
direction="l",
@@ -42992,6 +43712,7 @@ characters.data={
unicodeslot=0x1829,
},
[0x182A]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER BA",
direction="l",
@@ -43002,6 +43723,7 @@ characters.data={
},
},
[0x182B]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER PA",
direction="l",
@@ -43009,6 +43731,7 @@ characters.data={
unicodeslot=0x182B,
},
[0x182C]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER QA",
direction="l",
@@ -43021,6 +43744,7 @@ characters.data={
},
},
[0x182D]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER GA",
direction="l",
@@ -43033,6 +43757,7 @@ characters.data={
},
},
[0x182E]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER MA",
direction="l",
@@ -43040,6 +43765,7 @@ characters.data={
unicodeslot=0x182E,
},
[0x182F]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER LA",
direction="l",
@@ -43047,6 +43773,7 @@ characters.data={
unicodeslot=0x182F,
},
[0x1830]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER SA",
direction="l",
@@ -43058,6 +43785,7 @@ characters.data={
},
},
[0x1831]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER SHA",
direction="l",
@@ -43065,6 +43793,7 @@ characters.data={
unicodeslot=0x1831,
},
[0x1832]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TA",
direction="l",
@@ -43075,6 +43804,7 @@ characters.data={
},
},
[0x1833]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER DA",
direction="l",
@@ -43085,6 +43815,7 @@ characters.data={
},
},
[0x1834]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER CHA",
direction="l",
@@ -43092,6 +43823,7 @@ characters.data={
unicodeslot=0x1834,
},
[0x1835]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER JA",
direction="l",
@@ -43102,6 +43834,7 @@ characters.data={
},
},
[0x1836]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER YA",
direction="l",
@@ -43113,6 +43846,7 @@ characters.data={
},
},
[0x1837]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER RA",
direction="l",
@@ -43120,6 +43854,7 @@ characters.data={
unicodeslot=0x1837,
},
[0x1838]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER WA",
direction="l",
@@ -43130,6 +43865,7 @@ characters.data={
},
},
[0x1839]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER FA",
direction="l",
@@ -43137,6 +43873,7 @@ characters.data={
unicodeslot=0x1839,
},
[0x183A]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER KA",
direction="l",
@@ -43144,6 +43881,7 @@ characters.data={
unicodeslot=0x183A,
},
[0x183B]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER KHA",
direction="l",
@@ -43151,6 +43889,7 @@ characters.data={
unicodeslot=0x183B,
},
[0x183C]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TSA",
direction="l",
@@ -43158,6 +43897,7 @@ characters.data={
unicodeslot=0x183C,
},
[0x183D]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER ZA",
direction="l",
@@ -43165,6 +43905,7 @@ characters.data={
unicodeslot=0x183D,
},
[0x183E]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER HAA",
direction="l",
@@ -43172,6 +43913,7 @@ characters.data={
unicodeslot=0x183E,
},
[0x183F]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER ZRA",
direction="l",
@@ -43179,6 +43921,7 @@ characters.data={
unicodeslot=0x183F,
},
[0x1840]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER LHA",
direction="l",
@@ -43186,6 +43929,7 @@ characters.data={
unicodeslot=0x1840,
},
[0x1841]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER ZHI",
direction="l",
@@ -43193,6 +43937,7 @@ characters.data={
unicodeslot=0x1841,
},
[0x1842]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER CHI",
direction="l",
@@ -43200,6 +43945,7 @@ characters.data={
unicodeslot=0x1842,
},
[0x1843]={
+ arabic="d",
category="lm",
description="MONGOLIAN LETTER TODO LONG VOWEL SIGN",
direction="l",
@@ -43207,6 +43953,7 @@ characters.data={
unicodeslot=0x1843,
},
[0x1844]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO E",
direction="l",
@@ -43217,6 +43964,7 @@ characters.data={
},
},
[0x1845]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO I",
direction="l",
@@ -43227,6 +43975,7 @@ characters.data={
},
},
[0x1846]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO O",
direction="l",
@@ -43237,6 +43986,7 @@ characters.data={
},
},
[0x1847]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO U",
direction="l",
@@ -43248,6 +43998,7 @@ characters.data={
},
},
[0x1848]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO OE",
direction="l",
@@ -43258,6 +44009,7 @@ characters.data={
},
},
[0x1849]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO UE",
direction="l",
@@ -43268,6 +44020,7 @@ characters.data={
},
},
[0x184A]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO ANG",
direction="l",
@@ -43275,6 +44028,7 @@ characters.data={
unicodeslot=0x184A,
},
[0x184B]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO BA",
direction="l",
@@ -43282,6 +44036,7 @@ characters.data={
unicodeslot=0x184B,
},
[0x184C]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO PA",
direction="l",
@@ -43289,6 +44044,7 @@ characters.data={
unicodeslot=0x184C,
},
[0x184D]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO QA",
direction="l",
@@ -43299,6 +44055,7 @@ characters.data={
},
},
[0x184E]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO GA",
direction="l",
@@ -43309,6 +44066,7 @@ characters.data={
},
},
[0x184F]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO MA",
direction="l",
@@ -43316,6 +44074,7 @@ characters.data={
unicodeslot=0x184F,
},
[0x1850]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO TA",
direction="l",
@@ -43323,6 +44082,7 @@ characters.data={
unicodeslot=0x1850,
},
[0x1851]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO DA",
direction="l",
@@ -43330,6 +44090,7 @@ characters.data={
unicodeslot=0x1851,
},
[0x1852]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO CHA",
direction="l",
@@ -43337,6 +44098,7 @@ characters.data={
unicodeslot=0x1852,
},
[0x1853]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO JA",
direction="l",
@@ -43344,6 +44106,7 @@ characters.data={
unicodeslot=0x1853,
},
[0x1854]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO TSA",
direction="l",
@@ -43351,6 +44114,7 @@ characters.data={
unicodeslot=0x1854,
},
[0x1855]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO YA",
direction="l",
@@ -43358,6 +44122,7 @@ characters.data={
unicodeslot=0x1855,
},
[0x1856]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO WA",
direction="l",
@@ -43365,6 +44130,7 @@ characters.data={
unicodeslot=0x1856,
},
[0x1857]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO KA",
direction="l",
@@ -43372,6 +44138,7 @@ characters.data={
unicodeslot=0x1857,
},
[0x1858]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO GAA",
direction="l",
@@ -43379,6 +44146,7 @@ characters.data={
unicodeslot=0x1858,
},
[0x1859]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO HAA",
direction="l",
@@ -43386,6 +44154,7 @@ characters.data={
unicodeslot=0x1859,
},
[0x185A]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO JIA",
direction="l",
@@ -43393,6 +44162,7 @@ characters.data={
unicodeslot=0x185A,
},
[0x185B]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO NIA",
direction="l",
@@ -43400,6 +44170,7 @@ characters.data={
unicodeslot=0x185B,
},
[0x185C]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO DZA",
direction="l",
@@ -43407,6 +44178,7 @@ characters.data={
unicodeslot=0x185C,
},
[0x185D]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER SIBE E",
direction="l",
@@ -43417,6 +44189,7 @@ characters.data={
},
},
[0x185E]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER SIBE I",
direction="l",
@@ -43428,6 +44201,7 @@ characters.data={
},
},
[0x185F]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER SIBE IY",
direction="l",
@@ -43435,6 +44209,7 @@ characters.data={
unicodeslot=0x185F,
},
[0x1860]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER SIBE UE",
direction="l",
@@ -43445,6 +44220,7 @@ characters.data={
},
},
[0x1861]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER SIBE U",
direction="l",
@@ -43452,6 +44228,7 @@ characters.data={
unicodeslot=0x1861,
},
[0x1862]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER SIBE ANG",
direction="l",
@@ -43459,6 +44236,7 @@ characters.data={
unicodeslot=0x1862,
},
[0x1863]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER SIBE KA",
direction="l",
@@ -43469,6 +44247,7 @@ characters.data={
},
},
[0x1864]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER SIBE GA",
direction="l",
@@ -43476,6 +44255,7 @@ characters.data={
unicodeslot=0x1864,
},
[0x1865]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER SIBE HA",
direction="l",
@@ -43483,6 +44263,7 @@ characters.data={
unicodeslot=0x1865,
},
[0x1866]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER SIBE PA",
direction="l",
@@ -43490,6 +44271,7 @@ characters.data={
unicodeslot=0x1866,
},
[0x1867]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER SIBE SHA",
direction="l",
@@ -43497,6 +44279,7 @@ characters.data={
unicodeslot=0x1867,
},
[0x1868]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER SIBE TA",
direction="l",
@@ -43508,6 +44291,7 @@ characters.data={
},
},
[0x1869]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER SIBE DA",
direction="l",
@@ -43518,6 +44302,7 @@ characters.data={
},
},
[0x186A]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER SIBE JA",
direction="l",
@@ -43525,6 +44310,7 @@ characters.data={
unicodeslot=0x186A,
},
[0x186B]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER SIBE FA",
direction="l",
@@ -43532,6 +44318,7 @@ characters.data={
unicodeslot=0x186B,
},
[0x186C]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER SIBE GAA",
direction="l",
@@ -43539,6 +44326,7 @@ characters.data={
unicodeslot=0x186C,
},
[0x186D]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER SIBE HAA",
direction="l",
@@ -43546,6 +44334,7 @@ characters.data={
unicodeslot=0x186D,
},
[0x186E]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER SIBE TSA",
direction="l",
@@ -43553,6 +44342,7 @@ characters.data={
unicodeslot=0x186E,
},
[0x186F]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER SIBE ZA",
direction="l",
@@ -43563,6 +44353,7 @@ characters.data={
},
},
[0x1870]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER SIBE RAA",
direction="l",
@@ -43570,6 +44361,7 @@ characters.data={
unicodeslot=0x1870,
},
[0x1871]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER SIBE CHA",
direction="l",
@@ -43577,6 +44369,7 @@ characters.data={
unicodeslot=0x1871,
},
[0x1872]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER SIBE ZHA",
direction="l",
@@ -43584,6 +44377,7 @@ characters.data={
unicodeslot=0x1872,
},
[0x1873]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER MANCHU I",
direction="l",
@@ -43596,6 +44390,7 @@ characters.data={
},
},
[0x1874]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER MANCHU KA",
direction="l",
@@ -43608,6 +44403,7 @@ characters.data={
},
},
[0x1875]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER MANCHU RA",
direction="l",
@@ -43615,6 +44411,7 @@ characters.data={
unicodeslot=0x1875,
},
[0x1876]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER MANCHU FA",
direction="l",
@@ -43625,6 +44422,7 @@ characters.data={
},
},
[0x1877]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER MANCHU ZHA",
direction="l",
@@ -43632,6 +44430,7 @@ characters.data={
unicodeslot=0x1877,
},
[0x1880]={
+ arabic="u",
category="lo",
description="MONGOLIAN LETTER ALI GALI ANUSVARA ONE",
direction="l",
@@ -43642,6 +44441,7 @@ characters.data={
},
},
[0x1881]={
+ arabic="u",
category="lo",
description="MONGOLIAN LETTER ALI GALI VISARGA ONE",
direction="l",
@@ -43652,6 +44452,7 @@ characters.data={
},
},
[0x1882]={
+ arabic="u",
category="lo",
description="MONGOLIAN LETTER ALI GALI DAMARU",
direction="l",
@@ -43659,6 +44460,7 @@ characters.data={
unicodeslot=0x1882,
},
[0x1883]={
+ arabic="u",
category="lo",
description="MONGOLIAN LETTER ALI GALI UBADAMA",
direction="l",
@@ -43666,6 +44468,7 @@ characters.data={
unicodeslot=0x1883,
},
[0x1884]={
+ arabic="u",
category="lo",
description="MONGOLIAN LETTER ALI GALI INVERTED UBADAMA",
direction="l",
@@ -43673,6 +44476,7 @@ characters.data={
unicodeslot=0x1884,
},
[0x1885]={
+ arabic="u",
category="lo",
description="MONGOLIAN LETTER ALI GALI BALUDA",
direction="l",
@@ -43680,6 +44484,7 @@ characters.data={
unicodeslot=0x1885,
},
[0x1886]={
+ arabic="u",
category="lo",
description="MONGOLIAN LETTER ALI GALI THREE BALUDA",
direction="l",
@@ -43687,6 +44492,7 @@ characters.data={
unicodeslot=0x1886,
},
[0x1887]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER ALI GALI A",
direction="l",
@@ -43699,6 +44505,7 @@ characters.data={
},
},
[0x1888]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER ALI GALI I",
direction="l",
@@ -43709,6 +44516,7 @@ characters.data={
},
},
[0x1889]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER ALI GALI KA",
direction="l",
@@ -43716,6 +44524,7 @@ characters.data={
unicodeslot=0x1889,
},
[0x188A]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER ALI GALI NGA",
direction="l",
@@ -43726,6 +44535,7 @@ characters.data={
},
},
[0x188B]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER ALI GALI CA",
direction="l",
@@ -43733,6 +44543,7 @@ characters.data={
unicodeslot=0x188B,
},
[0x188C]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER ALI GALI TTA",
direction="l",
@@ -43740,6 +44551,7 @@ characters.data={
unicodeslot=0x188C,
},
[0x188D]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER ALI GALI TTHA",
direction="l",
@@ -43747,6 +44559,7 @@ characters.data={
unicodeslot=0x188D,
},
[0x188E]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER ALI GALI DDA",
direction="l",
@@ -43754,6 +44567,7 @@ characters.data={
unicodeslot=0x188E,
},
[0x188F]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER ALI GALI NNA",
direction="l",
@@ -43761,6 +44575,7 @@ characters.data={
unicodeslot=0x188F,
},
[0x1890]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER ALI GALI TA",
direction="l",
@@ -43768,6 +44583,7 @@ characters.data={
unicodeslot=0x1890,
},
[0x1891]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER ALI GALI DA",
direction="l",
@@ -43775,6 +44591,7 @@ characters.data={
unicodeslot=0x1891,
},
[0x1892]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER ALI GALI PA",
direction="l",
@@ -43782,6 +44599,7 @@ characters.data={
unicodeslot=0x1892,
},
[0x1893]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER ALI GALI PHA",
direction="l",
@@ -43789,6 +44607,7 @@ characters.data={
unicodeslot=0x1893,
},
[0x1894]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER ALI GALI SSA",
direction="l",
@@ -43796,6 +44615,7 @@ characters.data={
unicodeslot=0x1894,
},
[0x1895]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER ALI GALI ZHA",
direction="l",
@@ -43803,6 +44623,7 @@ characters.data={
unicodeslot=0x1895,
},
[0x1896]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER ALI GALI ZA",
direction="l",
@@ -43810,6 +44631,7 @@ characters.data={
unicodeslot=0x1896,
},
[0x1897]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER ALI GALI AH",
direction="l",
@@ -43817,6 +44639,7 @@ characters.data={
unicodeslot=0x1897,
},
[0x1898]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO ALI GALI TA",
direction="l",
@@ -43824,6 +44647,7 @@ characters.data={
unicodeslot=0x1898,
},
[0x1899]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER TODO ALI GALI ZHA",
direction="l",
@@ -43831,6 +44655,7 @@ characters.data={
unicodeslot=0x1899,
},
[0x189A]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER MANCHU ALI GALI GHA",
direction="l",
@@ -43838,6 +44663,7 @@ characters.data={
unicodeslot=0x189A,
},
[0x189B]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER MANCHU ALI GALI NGA",
direction="l",
@@ -43845,6 +44671,7 @@ characters.data={
unicodeslot=0x189B,
},
[0x189C]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER MANCHU ALI GALI CA",
direction="l",
@@ -43852,6 +44679,7 @@ characters.data={
unicodeslot=0x189C,
},
[0x189D]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER MANCHU ALI GALI JHA",
direction="l",
@@ -43859,6 +44687,7 @@ characters.data={
unicodeslot=0x189D,
},
[0x189E]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER MANCHU ALI GALI TTA",
direction="l",
@@ -43866,6 +44695,7 @@ characters.data={
unicodeslot=0x189E,
},
[0x189F]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER MANCHU ALI GALI DDHA",
direction="l",
@@ -43873,6 +44703,7 @@ characters.data={
unicodeslot=0x189F,
},
[0x18A0]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER MANCHU ALI GALI TA",
direction="l",
@@ -43880,6 +44711,7 @@ characters.data={
unicodeslot=0x18A0,
},
[0x18A1]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER MANCHU ALI GALI DHA",
direction="l",
@@ -43887,6 +44719,7 @@ characters.data={
unicodeslot=0x18A1,
},
[0x18A2]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER MANCHU ALI GALI SSA",
direction="l",
@@ -43894,6 +44727,7 @@ characters.data={
unicodeslot=0x18A2,
},
[0x18A3]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER MANCHU ALI GALI CYA",
direction="l",
@@ -43901,6 +44735,7 @@ characters.data={
unicodeslot=0x18A3,
},
[0x18A4]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER MANCHU ALI GALI ZHA",
direction="l",
@@ -43908,6 +44743,7 @@ characters.data={
unicodeslot=0x18A4,
},
[0x18A5]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER MANCHU ALI GALI ZA",
direction="l",
@@ -43915,6 +44751,7 @@ characters.data={
unicodeslot=0x18A5,
},
[0x18A6]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER ALI GALI HALF U",
direction="l",
@@ -43922,6 +44759,7 @@ characters.data={
unicodeslot=0x18A6,
},
[0x18A7]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER ALI GALI HALF YA",
direction="l",
@@ -43929,6 +44767,7 @@ characters.data={
unicodeslot=0x18A7,
},
[0x18A8]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER MANCHU ALI GALI BHA",
direction="l",
@@ -43937,12 +44776,14 @@ characters.data={
},
[0x18A9]={
category="mn",
+ combining=0xE4,
description="MONGOLIAN LETTER ALI GALI DAGALGA",
direction="nsm",
linebreak="cm",
unicodeslot=0x18A9,
},
[0x18AA]={
+ arabic="d",
category="lo",
description="MONGOLIAN LETTER MANCHU ALI GALI LHA",
direction="l",
@@ -44642,6 +45483,20 @@ characters.data={
linebreak="al",
unicodeslot=0x191C,
},
+ [0x191D]={
+ category="lo",
+ description="LIMBU LETTER GYAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x191D,
+ },
+ [0x191E]={
+ category="lo",
+ description="LIMBU LETTER TRA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x191E,
+ },
[0x1920]={
category="mn",
description="LIMBU VOWEL SIGN A",
@@ -44791,6 +45646,7 @@ characters.data={
},
[0x1939]={
category="mn",
+ combining=0xDE,
description="LIMBU SIGN MUKPHRENG",
direction="nsm",
linebreak="cm",
@@ -44798,6 +45654,7 @@ characters.data={
},
[0x193A]={
category="mn",
+ combining=0xE6,
description="LIMBU SIGN KEMPHRENG",
direction="nsm",
linebreak="cm",
@@ -44805,6 +45662,7 @@ characters.data={
},
[0x193B]={
category="mn",
+ combining=0xDC,
description="LIMBU SIGN SA-I",
direction="nsm",
linebreak="cm",
@@ -46114,6 +46972,7 @@ characters.data={
},
[0x1A17]={
category="mn",
+ combining=0xE6,
description="BUGINESE VOWEL SIGN I",
direction="nsm",
linebreak="cm",
@@ -46121,6 +46980,7 @@ characters.data={
},
[0x1A18]={
category="mn",
+ combining=0xDC,
description="BUGINESE VOWEL SIGN U",
direction="nsm",
linebreak="cm",
@@ -46143,7 +47003,7 @@ characters.data={
[0x1A1B]={
category="mc",
description="BUGINESE VOWEL SIGN AE",
- direction="l",
+ direction="nsm",
linebreak="cm",
unicodeslot=0x1A1B,
},
@@ -46604,6 +47464,7 @@ characters.data={
},
[0x1A60]={
category="mn",
+ combining=0x9,
description="TAI THAM SIGN SAKOT",
direction="nsm",
linebreak="sa",
@@ -46751,6 +47612,7 @@ characters.data={
},
[0x1A75]={
category="mn",
+ combining=0xE6,
description="TAI THAM SIGN TONE-1",
direction="nsm",
linebreak="sa",
@@ -46758,6 +47620,7 @@ characters.data={
},
[0x1A76]={
category="mn",
+ combining=0xE6,
description="TAI THAM SIGN TONE-2",
direction="nsm",
linebreak="sa",
@@ -46765,6 +47628,7 @@ characters.data={
},
[0x1A77]={
category="mn",
+ combining=0xE6,
description="TAI THAM SIGN KHUEN TONE-3",
direction="nsm",
linebreak="sa",
@@ -46772,6 +47636,7 @@ characters.data={
},
[0x1A78]={
category="mn",
+ combining=0xE6,
description="TAI THAM SIGN KHUEN TONE-4",
direction="nsm",
linebreak="sa",
@@ -46779,6 +47644,7 @@ characters.data={
},
[0x1A79]={
category="mn",
+ combining=0xE6,
description="TAI THAM SIGN KHUEN TONE-5",
direction="nsm",
linebreak="sa",
@@ -46786,6 +47652,7 @@ characters.data={
},
[0x1A7A]={
category="mn",
+ combining=0xE6,
description="TAI THAM SIGN RA HAAM",
direction="nsm",
linebreak="sa",
@@ -46793,6 +47660,7 @@ characters.data={
},
[0x1A7B]={
category="mn",
+ combining=0xE6,
description="TAI THAM SIGN MAI SAM",
direction="nsm",
linebreak="sa",
@@ -46800,6 +47668,7 @@ characters.data={
},
[0x1A7C]={
category="mn",
+ combining=0xE6,
description="TAI THAM SIGN KHUEN-LUE KARAN",
direction="nsm",
linebreak="sa",
@@ -46807,6 +47676,7 @@ characters.data={
},
[0x1A7F]={
category="mn",
+ combining=0xDC,
description="TAI THAM COMBINING CRYPTOGRAMMIC DOT",
direction="nsm",
linebreak="cm",
@@ -47050,6 +47920,125 @@ characters.data={
linebreak="sa",
unicodeslot=0x1AAD,
},
+ [0x1AB0]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING DOUBLED CIRCUMFLEX ACCENT",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1AB0,
+ },
+ [0x1AB1]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING DIAERESIS-RING",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1AB1,
+ },
+ [0x1AB2]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING INFINITY",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1AB2,
+ },
+ [0x1AB3]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING DOWNWARDS ARROW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1AB3,
+ },
+ [0x1AB4]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING TRIPLE DOT",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1AB4,
+ },
+ [0x1AB5]={
+ category="mn",
+ combining=0xDC,
+ description="COMBINING X-X BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1AB5,
+ },
+ [0x1AB6]={
+ category="mn",
+ combining=0xDC,
+ description="COMBINING WIGGLY LINE BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1AB6,
+ },
+ [0x1AB7]={
+ category="mn",
+ combining=0xDC,
+ description="COMBINING OPEN MARK BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1AB7,
+ },
+ [0x1AB8]={
+ category="mn",
+ combining=0xDC,
+ description="COMBINING DOUBLE OPEN MARK BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1AB8,
+ },
+ [0x1AB9]={
+ category="mn",
+ combining=0xDC,
+ description="COMBINING LIGHT CENTRALIZATION STROKE BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1AB9,
+ },
+ [0x1ABA]={
+ category="mn",
+ combining=0xDC,
+ description="COMBINING STRONG CENTRALIZATION STROKE BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1ABA,
+ },
+ [0x1ABB]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING PARENTHESES ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1ABB,
+ },
+ [0x1ABC]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING DOUBLE PARENTHESES ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1ABC,
+ },
+ [0x1ABD]={
+ category="mn",
+ combining=0xDC,
+ description="COMBINING PARENTHESES BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1ABD,
+ },
+ [0x1ABE]={
+ category="me",
+ description="COMBINING PARENTHESES OVERLAY",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1ABE,
+ },
[0x1B00]={
category="mn",
description="BALINESE SIGN ULU RICEM",
@@ -47422,6 +48411,7 @@ characters.data={
},
[0x1B34]={
category="mn",
+ combining=0x7,
description="BALINESE SIGN REREKAN",
direction="nsm",
linebreak="cm",
@@ -47539,6 +48529,7 @@ characters.data={
},
[0x1B44]={
category="mc",
+ combining=0x9,
description="BALINESE ADEG ADEG",
direction="l",
linebreak="cm",
@@ -47784,6 +48775,7 @@ characters.data={
},
[0x1B6B]={
category="mn",
+ combining=0xE6,
description="BALINESE MUSICAL SYMBOL COMBINING TEGEH",
direction="nsm",
linebreak="cm",
@@ -47791,6 +48783,7 @@ characters.data={
},
[0x1B6C]={
category="mn",
+ combining=0xDC,
description="BALINESE MUSICAL SYMBOL COMBINING ENDEP",
direction="nsm",
linebreak="cm",
@@ -47798,6 +48791,7 @@ characters.data={
},
[0x1B6D]={
category="mn",
+ combining=0xE6,
description="BALINESE MUSICAL SYMBOL COMBINING KEMPUL",
direction="nsm",
linebreak="cm",
@@ -47805,6 +48799,7 @@ characters.data={
},
[0x1B6E]={
category="mn",
+ combining=0xE6,
description="BALINESE MUSICAL SYMBOL COMBINING KEMPLI",
direction="nsm",
linebreak="cm",
@@ -47812,6 +48807,7 @@ characters.data={
},
[0x1B6F]={
category="mn",
+ combining=0xE6,
description="BALINESE MUSICAL SYMBOL COMBINING JEGOGAN",
direction="nsm",
linebreak="cm",
@@ -47819,6 +48815,7 @@ characters.data={
},
[0x1B70]={
category="mn",
+ combining=0xE6,
description="BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN",
direction="nsm",
linebreak="cm",
@@ -47826,6 +48823,7 @@ characters.data={
},
[0x1B71]={
category="mn",
+ combining=0xE6,
description="BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN",
direction="nsm",
linebreak="cm",
@@ -47833,6 +48831,7 @@ characters.data={
},
[0x1B72]={
category="mn",
+ combining=0xE6,
description="BALINESE MUSICAL SYMBOL COMBINING BENDE",
direction="nsm",
linebreak="cm",
@@ -47840,6 +48839,7 @@ characters.data={
},
[0x1B73]={
category="mn",
+ combining=0xE6,
description="BALINESE MUSICAL SYMBOL COMBINING GONG",
direction="nsm",
linebreak="cm",
@@ -48204,6 +49204,7 @@ characters.data={
},
[0x1BAA]={
category="mc",
+ combining=0x9,
description="SUNDANESE SIGN PAMAAEH",
direction="l",
linebreak="cm",
@@ -48211,6 +49212,7 @@ characters.data={
},
[0x1BAB]={
category="mn",
+ combining=0x9,
description="SUNDANESE SIGN VIRAMA",
direction="nsm",
linebreak="cm",
@@ -48219,14 +49221,14 @@ characters.data={
[0x1BAC]={
category="mc",
description="SUNDANESE CONSONANT SIGN PASANGAN MA",
- direction="l",
+ direction="nsm",
linebreak="cm",
unicodeslot=0x1BAC,
},
[0x1BAD]={
category="mc",
description="SUNDANESE CONSONANT SIGN PASANGAN WA",
- direction="l",
+ direction="nsm",
linebreak="cm",
unicodeslot=0x1BAD,
},
@@ -48624,6 +49626,7 @@ characters.data={
},
[0x1BE6]={
category="mn",
+ combining=0x7,
description="BATAK SIGN TOMPI",
direction="nsm",
linebreak="cm",
@@ -48708,6 +49711,7 @@ characters.data={
},
[0x1BF2]={
category="mc",
+ combining=0x9,
description="BATAK PANGOLAT",
direction="l",
linebreak="cm",
@@ -48715,6 +49719,7 @@ characters.data={
},
[0x1BF3]={
category="mc",
+ combining=0x9,
description="BATAK PANONGONAN",
direction="l",
linebreak="cm",
@@ -49135,6 +50140,7 @@ characters.data={
},
[0x1C37]={
category="mn",
+ combining=0x7,
description="LEPCHA SIGN NUKTA",
direction="nsm",
linebreak="cm",
@@ -49660,6 +50666,7 @@ characters.data={
},
[0x1CD0]={
category="mn",
+ combining=0xE6,
description="VEDIC TONE KARSHANA",
direction="nsm",
linebreak="cm",
@@ -49667,6 +50674,7 @@ characters.data={
},
[0x1CD1]={
category="mn",
+ combining=0xE6,
description="VEDIC TONE SHARA",
direction="nsm",
linebreak="cm",
@@ -49674,6 +50682,7 @@ characters.data={
},
[0x1CD2]={
category="mn",
+ combining=0xE6,
description="VEDIC TONE PRENKHA",
direction="nsm",
linebreak="cm",
@@ -49688,6 +50697,7 @@ characters.data={
},
[0x1CD4]={
category="mn",
+ combining=0x1,
description="VEDIC SIGN YAJURVEDIC MIDLINE SVARITA",
direction="nsm",
linebreak="cm",
@@ -49695,6 +50705,7 @@ characters.data={
},
[0x1CD5]={
category="mn",
+ combining=0xDC,
description="VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA",
direction="nsm",
linebreak="cm",
@@ -49702,6 +50713,7 @@ characters.data={
},
[0x1CD6]={
category="mn",
+ combining=0xDC,
description="VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA",
direction="nsm",
linebreak="cm",
@@ -49709,6 +50721,7 @@ characters.data={
},
[0x1CD7]={
category="mn",
+ combining=0xDC,
description="VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA",
direction="nsm",
linebreak="cm",
@@ -49716,6 +50729,7 @@ characters.data={
},
[0x1CD8]={
category="mn",
+ combining=0xDC,
description="VEDIC TONE CANDRA BELOW",
direction="nsm",
linebreak="cm",
@@ -49723,6 +50737,7 @@ characters.data={
},
[0x1CD9]={
category="mn",
+ combining=0xDC,
description="VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER",
direction="nsm",
linebreak="cm",
@@ -49730,6 +50745,7 @@ characters.data={
},
[0x1CDA]={
category="mn",
+ combining=0xE6,
description="VEDIC TONE DOUBLE SVARITA",
direction="nsm",
linebreak="cm",
@@ -49737,6 +50753,7 @@ characters.data={
},
[0x1CDB]={
category="mn",
+ combining=0xE6,
description="VEDIC TONE TRIPLE SVARITA",
direction="nsm",
linebreak="cm",
@@ -49744,6 +50761,7 @@ characters.data={
},
[0x1CDC]={
category="mn",
+ combining=0xDC,
description="VEDIC TONE KATHAKA ANUDATTA",
direction="nsm",
linebreak="cm",
@@ -49751,6 +50769,7 @@ characters.data={
},
[0x1CDD]={
category="mn",
+ combining=0xDC,
description="VEDIC TONE DOT BELOW",
direction="nsm",
linebreak="cm",
@@ -49758,6 +50777,7 @@ characters.data={
},
[0x1CDE]={
category="mn",
+ combining=0xDC,
description="VEDIC TONE TWO DOTS BELOW",
direction="nsm",
linebreak="cm",
@@ -49765,6 +50785,7 @@ characters.data={
},
[0x1CDF]={
category="mn",
+ combining=0xDC,
description="VEDIC TONE THREE DOTS BELOW",
direction="nsm",
linebreak="cm",
@@ -49772,6 +50793,7 @@ characters.data={
},
[0x1CE0]={
category="mn",
+ combining=0xE6,
description="VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA",
direction="nsm",
linebreak="cm",
@@ -49786,6 +50808,7 @@ characters.data={
},
[0x1CE2]={
category="mn",
+ combining=0x1,
description="VEDIC SIGN VISARGA SVARITA",
direction="nsm",
linebreak="cm",
@@ -49793,6 +50816,7 @@ characters.data={
},
[0x1CE3]={
category="mn",
+ combining=0x1,
description="VEDIC SIGN VISARGA UDATTA",
direction="nsm",
linebreak="cm",
@@ -49800,6 +50824,7 @@ characters.data={
},
[0x1CE4]={
category="mn",
+ combining=0x1,
description="VEDIC SIGN REVERSED VISARGA UDATTA",
direction="nsm",
linebreak="cm",
@@ -49807,6 +50832,7 @@ characters.data={
},
[0x1CE5]={
category="mn",
+ combining=0x1,
description="VEDIC SIGN VISARGA ANUDATTA",
direction="nsm",
linebreak="cm",
@@ -49814,6 +50840,7 @@ characters.data={
},
[0x1CE6]={
category="mn",
+ combining=0x1,
description="VEDIC SIGN REVERSED VISARGA ANUDATTA",
direction="nsm",
linebreak="cm",
@@ -49821,6 +50848,7 @@ characters.data={
},
[0x1CE7]={
category="mn",
+ combining=0x1,
description="VEDIC SIGN VISARGA UDATTA WITH TAIL",
direction="nsm",
linebreak="cm",
@@ -49828,6 +50856,7 @@ characters.data={
},
[0x1CE8]={
category="mn",
+ combining=0x1,
description="VEDIC SIGN VISARGA ANUDATTA WITH TAIL",
direction="nsm",
linebreak="cm",
@@ -49863,6 +50892,7 @@ characters.data={
},
[0x1CED]={
category="mn",
+ combining=0xDC,
description="VEDIC SIGN TIRYAK",
direction="nsm",
linebreak="cm",
@@ -49912,6 +50942,7 @@ characters.data={
},
[0x1CF4]={
category="mn",
+ combining=0xE6,
description="VEDIC TONE CANDRA ABOVE",
direction="nsm",
linebreak="cm",
@@ -49931,6 +50962,22 @@ characters.data={
linebreak="al",
unicodeslot=0x1CF6,
},
+ [0x1CF8]={
+ category="mn",
+ combining=0xE6,
+ description="VEDIC TONE RING ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1CF8,
+ },
+ [0x1CF9]={
+ category="mn",
+ combining=0xE6,
+ description="VEDIC TONE DOUBLE RING ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1CF9,
+ },
[0x1D00]={
category="ll",
description="LATIN LETTER SMALL CAPITAL A",
@@ -50244,7 +51291,7 @@ characters.data={
description="MODIFIER LETTER CAPITAL A",
direction="l",
linebreak="al",
- specials={ "super", 0x0041 },
+ specials={ "super", 0x41 },
unicodeslot=0x1D2C,
},
[0x1D2D]={
@@ -50252,7 +51299,7 @@ characters.data={
description="MODIFIER LETTER CAPITAL AE",
direction="l",
linebreak="al",
- specials={ "super", 0x00C6 },
+ specials={ "super", 0xC6 },
unicodeslot=0x1D2D,
},
[0x1D2E]={
@@ -50260,7 +51307,7 @@ characters.data={
description="MODIFIER LETTER CAPITAL B",
direction="l",
linebreak="al",
- specials={ "super", 0x0042 },
+ specials={ "super", 0x42 },
unicodeslot=0x1D2E,
},
[0x1D2F]={
@@ -50275,7 +51322,7 @@ characters.data={
description="MODIFIER LETTER CAPITAL D",
direction="l",
linebreak="al",
- specials={ "super", 0x0044 },
+ specials={ "super", 0x44 },
unicodeslot=0x1D30,
},
[0x1D31]={
@@ -50283,7 +51330,7 @@ characters.data={
description="MODIFIER LETTER CAPITAL E",
direction="l",
linebreak="al",
- specials={ "super", 0x0045 },
+ specials={ "super", 0x45 },
unicodeslot=0x1D31,
},
[0x1D32]={
@@ -50291,7 +51338,7 @@ characters.data={
description="MODIFIER LETTER CAPITAL REVERSED E",
direction="l",
linebreak="al",
- specials={ "super", 0x018E },
+ specials={ "super", 0x18E },
unicodeslot=0x1D32,
},
[0x1D33]={
@@ -50299,7 +51346,7 @@ characters.data={
description="MODIFIER LETTER CAPITAL G",
direction="l",
linebreak="al",
- specials={ "super", 0x0047 },
+ specials={ "super", 0x47 },
unicodeslot=0x1D33,
},
[0x1D34]={
@@ -50307,7 +51354,7 @@ characters.data={
description="MODIFIER LETTER CAPITAL H",
direction="l",
linebreak="al",
- specials={ "super", 0x0048 },
+ specials={ "super", 0x48 },
unicodeslot=0x1D34,
},
[0x1D35]={
@@ -50315,7 +51362,7 @@ characters.data={
description="MODIFIER LETTER CAPITAL I",
direction="l",
linebreak="al",
- specials={ "super", 0x0049 },
+ specials={ "super", 0x49 },
unicodeslot=0x1D35,
},
[0x1D36]={
@@ -50323,7 +51370,7 @@ characters.data={
description="MODIFIER LETTER CAPITAL J",
direction="l",
linebreak="al",
- specials={ "super", 0x004A },
+ specials={ "super", 0x4A },
unicodeslot=0x1D36,
},
[0x1D37]={
@@ -50331,7 +51378,7 @@ characters.data={
description="MODIFIER LETTER CAPITAL K",
direction="l",
linebreak="al",
- specials={ "super", 0x004B },
+ specials={ "super", 0x4B },
unicodeslot=0x1D37,
},
[0x1D38]={
@@ -50339,7 +51386,7 @@ characters.data={
description="MODIFIER LETTER CAPITAL L",
direction="l",
linebreak="al",
- specials={ "super", 0x004C },
+ specials={ "super", 0x4C },
unicodeslot=0x1D38,
},
[0x1D39]={
@@ -50347,7 +51394,7 @@ characters.data={
description="MODIFIER LETTER CAPITAL M",
direction="l",
linebreak="al",
- specials={ "super", 0x004D },
+ specials={ "super", 0x4D },
unicodeslot=0x1D39,
},
[0x1D3A]={
@@ -50355,7 +51402,7 @@ characters.data={
description="MODIFIER LETTER CAPITAL N",
direction="l",
linebreak="al",
- specials={ "super", 0x004E },
+ specials={ "super", 0x4E },
unicodeslot=0x1D3A,
},
[0x1D3B]={
@@ -50370,7 +51417,7 @@ characters.data={
description="MODIFIER LETTER CAPITAL O",
direction="l",
linebreak="al",
- specials={ "super", 0x004F },
+ specials={ "super", 0x4F },
unicodeslot=0x1D3C,
},
[0x1D3D]={
@@ -50378,7 +51425,7 @@ characters.data={
description="MODIFIER LETTER CAPITAL OU",
direction="l",
linebreak="al",
- specials={ "super", 0x0222 },
+ specials={ "super", 0x222 },
unicodeslot=0x1D3D,
},
[0x1D3E]={
@@ -50386,7 +51433,7 @@ characters.data={
description="MODIFIER LETTER CAPITAL P",
direction="l",
linebreak="al",
- specials={ "super", 0x0050 },
+ specials={ "super", 0x50 },
unicodeslot=0x1D3E,
},
[0x1D3F]={
@@ -50394,7 +51441,7 @@ characters.data={
description="MODIFIER LETTER CAPITAL R",
direction="l",
linebreak="al",
- specials={ "super", 0x0052 },
+ specials={ "super", 0x52 },
unicodeslot=0x1D3F,
},
[0x1D40]={
@@ -50402,7 +51449,7 @@ characters.data={
description="MODIFIER LETTER CAPITAL T",
direction="l",
linebreak="al",
- specials={ "super", 0x0054 },
+ specials={ "super", 0x54 },
unicodeslot=0x1D40,
},
[0x1D41]={
@@ -50410,7 +51457,7 @@ characters.data={
description="MODIFIER LETTER CAPITAL U",
direction="l",
linebreak="al",
- specials={ "super", 0x0055 },
+ specials={ "super", 0x55 },
unicodeslot=0x1D41,
},
[0x1D42]={
@@ -50418,7 +51465,7 @@ characters.data={
description="MODIFIER LETTER CAPITAL W",
direction="l",
linebreak="al",
- specials={ "super", 0x0057 },
+ specials={ "super", 0x57 },
unicodeslot=0x1D42,
},
[0x1D43]={
@@ -50426,7 +51473,7 @@ characters.data={
description="MODIFIER LETTER SMALL A",
direction="l",
linebreak="al",
- specials={ "super", 0x0061 },
+ specials={ "super", 0x61 },
unicodeslot=0x1D43,
},
[0x1D44]={
@@ -50434,7 +51481,7 @@ characters.data={
description="MODIFIER LETTER SMALL TURNED A",
direction="l",
linebreak="al",
- specials={ "super", 0x0250 },
+ specials={ "super", 0x250 },
unicodeslot=0x1D44,
},
[0x1D45]={
@@ -50442,7 +51489,7 @@ characters.data={
description="MODIFIER LETTER SMALL ALPHA",
direction="l",
linebreak="al",
- specials={ "super", 0x0251 },
+ specials={ "super", 0x251 },
unicodeslot=0x1D45,
},
[0x1D46]={
@@ -50458,7 +51505,7 @@ characters.data={
description="MODIFIER LETTER SMALL B",
direction="l",
linebreak="al",
- specials={ "super", 0x0062 },
+ specials={ "super", 0x62 },
unicodeslot=0x1D47,
},
[0x1D48]={
@@ -50466,7 +51513,7 @@ characters.data={
description="MODIFIER LETTER SMALL D",
direction="l",
linebreak="al",
- specials={ "super", 0x0064 },
+ specials={ "super", 0x64 },
unicodeslot=0x1D48,
},
[0x1D49]={
@@ -50474,7 +51521,7 @@ characters.data={
description="MODIFIER LETTER SMALL E",
direction="l",
linebreak="al",
- specials={ "super", 0x0065 },
+ specials={ "super", 0x65 },
unicodeslot=0x1D49,
},
[0x1D4A]={
@@ -50482,7 +51529,7 @@ characters.data={
description="MODIFIER LETTER SMALL SCHWA",
direction="l",
linebreak="al",
- specials={ "super", 0x0259 },
+ specials={ "super", 0x259 },
unicodeslot=0x1D4A,
},
[0x1D4B]={
@@ -50490,7 +51537,7 @@ characters.data={
description="MODIFIER LETTER SMALL OPEN E",
direction="l",
linebreak="al",
- specials={ "super", 0x025B },
+ specials={ "super", 0x25B },
unicodeslot=0x1D4B,
},
[0x1D4C]={
@@ -50498,7 +51545,7 @@ characters.data={
description="MODIFIER LETTER SMALL TURNED OPEN E",
direction="l",
linebreak="al",
- specials={ "super", 0x025C },
+ specials={ "super", 0x25C },
unicodeslot=0x1D4C,
},
[0x1D4D]={
@@ -50506,7 +51553,7 @@ characters.data={
description="MODIFIER LETTER SMALL G",
direction="l",
linebreak="al",
- specials={ "super", 0x0067 },
+ specials={ "super", 0x67 },
unicodeslot=0x1D4D,
},
[0x1D4E]={
@@ -50521,7 +51568,7 @@ characters.data={
description="MODIFIER LETTER SMALL K",
direction="l",
linebreak="al",
- specials={ "super", 0x006B },
+ specials={ "super", 0x6B },
unicodeslot=0x1D4F,
},
[0x1D50]={
@@ -50529,7 +51576,7 @@ characters.data={
description="MODIFIER LETTER SMALL M",
direction="l",
linebreak="al",
- specials={ "super", 0x006D },
+ specials={ "super", 0x6D },
unicodeslot=0x1D50,
},
[0x1D51]={
@@ -50537,7 +51584,7 @@ characters.data={
description="MODIFIER LETTER SMALL ENG",
direction="l",
linebreak="al",
- specials={ "super", 0x014B },
+ specials={ "super", 0x14B },
unicodeslot=0x1D51,
},
[0x1D52]={
@@ -50545,7 +51592,7 @@ characters.data={
description="MODIFIER LETTER SMALL O",
direction="l",
linebreak="al",
- specials={ "super", 0x006F },
+ specials={ "super", 0x6F },
unicodeslot=0x1D52,
},
[0x1D53]={
@@ -50553,7 +51600,7 @@ characters.data={
description="MODIFIER LETTER SMALL OPEN O",
direction="l",
linebreak="al",
- specials={ "super", 0x0254 },
+ specials={ "super", 0x254 },
unicodeslot=0x1D53,
},
[0x1D54]={
@@ -50577,7 +51624,7 @@ characters.data={
description="MODIFIER LETTER SMALL P",
direction="l",
linebreak="al",
- specials={ "super", 0x0070 },
+ specials={ "super", 0x70 },
unicodeslot=0x1D56,
},
[0x1D57]={
@@ -50585,7 +51632,7 @@ characters.data={
description="MODIFIER LETTER SMALL T",
direction="l",
linebreak="al",
- specials={ "super", 0x0074 },
+ specials={ "super", 0x74 },
unicodeslot=0x1D57,
},
[0x1D58]={
@@ -50593,7 +51640,7 @@ characters.data={
description="MODIFIER LETTER SMALL U",
direction="l",
linebreak="al",
- specials={ "super", 0x0075 },
+ specials={ "super", 0x75 },
unicodeslot=0x1D58,
},
[0x1D59]={
@@ -50609,7 +51656,7 @@ characters.data={
description="MODIFIER LETTER SMALL TURNED M",
direction="l",
linebreak="al",
- specials={ "super", 0x026F },
+ specials={ "super", 0x26F },
unicodeslot=0x1D5A,
},
[0x1D5B]={
@@ -50617,7 +51664,7 @@ characters.data={
description="MODIFIER LETTER SMALL V",
direction="l",
linebreak="al",
- specials={ "super", 0x0076 },
+ specials={ "super", 0x76 },
unicodeslot=0x1D5B,
},
[0x1D5C]={
@@ -50633,7 +51680,7 @@ characters.data={
description="MODIFIER LETTER SMALL BETA",
direction="l",
linebreak="al",
- specials={ "super", 0x03B2 },
+ specials={ "super", 0x3B2 },
unicodeslot=0x1D5D,
},
[0x1D5E]={
@@ -50641,7 +51688,7 @@ characters.data={
description="MODIFIER LETTER SMALL GREEK GAMMA",
direction="l",
linebreak="al",
- specials={ "super", 0x03B3 },
+ specials={ "super", 0x3B3 },
unicodeslot=0x1D5E,
},
[0x1D5F]={
@@ -50649,7 +51696,7 @@ characters.data={
description="MODIFIER LETTER SMALL DELTA",
direction="l",
linebreak="al",
- specials={ "super", 0x03B4 },
+ specials={ "super", 0x3B4 },
unicodeslot=0x1D5F,
},
[0x1D60]={
@@ -50657,7 +51704,7 @@ characters.data={
description="MODIFIER LETTER SMALL GREEK PHI",
direction="l",
linebreak="al",
- specials={ "super", 0x03C6 },
+ specials={ "super", 0x3C6 },
unicodeslot=0x1D60,
},
[0x1D61]={
@@ -50665,7 +51712,7 @@ characters.data={
description="MODIFIER LETTER SMALL CHI",
direction="l",
linebreak="al",
- specials={ "super", 0x03C7 },
+ specials={ "super", 0x3C7 },
unicodeslot=0x1D61,
},
[0x1D62]={
@@ -50673,7 +51720,7 @@ characters.data={
description="LATIN SUBSCRIPT SMALL LETTER I",
direction="l",
linebreak="al",
- specials={ "sub", 0x0069 },
+ specials={ "sub", 0x69 },
unicodeslot=0x1D62,
},
[0x1D63]={
@@ -50681,7 +51728,7 @@ characters.data={
description="LATIN SUBSCRIPT SMALL LETTER R",
direction="l",
linebreak="al",
- specials={ "sub", 0x0072 },
+ specials={ "sub", 0x72 },
unicodeslot=0x1D63,
},
[0x1D64]={
@@ -50689,7 +51736,7 @@ characters.data={
description="LATIN SUBSCRIPT SMALL LETTER U",
direction="l",
linebreak="al",
- specials={ "sub", 0x0075 },
+ specials={ "sub", 0x75 },
unicodeslot=0x1D64,
},
[0x1D65]={
@@ -50697,7 +51744,7 @@ characters.data={
description="LATIN SUBSCRIPT SMALL LETTER V",
direction="l",
linebreak="al",
- specials={ "sub", 0x0076 },
+ specials={ "sub", 0x76 },
unicodeslot=0x1D65,
},
[0x1D66]={
@@ -50705,7 +51752,7 @@ characters.data={
description="GREEK SUBSCRIPT SMALL LETTER BETA",
direction="l",
linebreak="al",
- specials={ "sub", 0x03B2 },
+ specials={ "sub", 0x3B2 },
unicodeslot=0x1D66,
},
[0x1D67]={
@@ -50713,7 +51760,7 @@ characters.data={
description="GREEK SUBSCRIPT SMALL LETTER GAMMA",
direction="l",
linebreak="al",
- specials={ "sub", 0x03B3 },
+ specials={ "sub", 0x3B3 },
unicodeslot=0x1D67,
},
[0x1D68]={
@@ -50721,7 +51768,7 @@ characters.data={
description="GREEK SUBSCRIPT SMALL LETTER RHO",
direction="l",
linebreak="al",
- specials={ "sub", 0x03C1 },
+ specials={ "sub", 0x3C1 },
unicodeslot=0x1D68,
},
[0x1D69]={
@@ -50729,7 +51776,7 @@ characters.data={
description="GREEK SUBSCRIPT SMALL LETTER PHI",
direction="l",
linebreak="al",
- specials={ "sub", 0x03C6 },
+ specials={ "sub", 0x3C6 },
unicodeslot=0x1D69,
},
[0x1D6A]={
@@ -50737,7 +51784,7 @@ characters.data={
description="GREEK SUBSCRIPT SMALL LETTER CHI",
direction="l",
linebreak="al",
- specials={ "sub", 0x03C7 },
+ specials={ "sub", 0x3C7 },
unicodeslot=0x1D6A,
},
[0x1D6B]={
@@ -50752,7 +51799,7 @@ characters.data={
description="LATIN SMALL LETTER B WITH MIDDLE TILDE",
direction="l",
linebreak="al",
- shcode=0x0062,
+ shcode=0x62,
unicodeslot=0x1D6C,
},
[0x1D6D]={
@@ -50760,7 +51807,7 @@ characters.data={
description="LATIN SMALL LETTER D WITH MIDDLE TILDE",
direction="l",
linebreak="al",
- shcode=0x0064,
+ shcode=0x64,
unicodeslot=0x1D6D,
},
[0x1D6E]={
@@ -50768,7 +51815,7 @@ characters.data={
description="LATIN SMALL LETTER F WITH MIDDLE TILDE",
direction="l",
linebreak="al",
- shcode=0x0066,
+ shcode=0x66,
unicodeslot=0x1D6E,
},
[0x1D6F]={
@@ -50776,7 +51823,7 @@ characters.data={
description="LATIN SMALL LETTER M WITH MIDDLE TILDE",
direction="l",
linebreak="al",
- shcode=0x006D,
+ shcode=0x6D,
unicodeslot=0x1D6F,
},
[0x1D70]={
@@ -50784,7 +51831,7 @@ characters.data={
description="LATIN SMALL LETTER N WITH MIDDLE TILDE",
direction="l",
linebreak="al",
- shcode=0x006E,
+ shcode=0x6E,
unicodeslot=0x1D70,
},
[0x1D71]={
@@ -50792,7 +51839,7 @@ characters.data={
description="LATIN SMALL LETTER P WITH MIDDLE TILDE",
direction="l",
linebreak="al",
- shcode=0x0070,
+ shcode=0x70,
unicodeslot=0x1D71,
},
[0x1D72]={
@@ -50800,7 +51847,7 @@ characters.data={
description="LATIN SMALL LETTER R WITH MIDDLE TILDE",
direction="l",
linebreak="al",
- shcode=0x0072,
+ shcode=0x72,
unicodeslot=0x1D72,
},
[0x1D73]={
@@ -50808,7 +51855,7 @@ characters.data={
description="LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE",
direction="l",
linebreak="al",
- shcode=0x0072,
+ shcode=0x72,
unicodeslot=0x1D73,
},
[0x1D74]={
@@ -50816,7 +51863,7 @@ characters.data={
description="LATIN SMALL LETTER S WITH MIDDLE TILDE",
direction="l",
linebreak="al",
- shcode=0x0073,
+ shcode=0x73,
unicodeslot=0x1D74,
},
[0x1D75]={
@@ -50824,7 +51871,7 @@ characters.data={
description="LATIN SMALL LETTER T WITH MIDDLE TILDE",
direction="l",
linebreak="al",
- shcode=0x0074,
+ shcode=0x74,
unicodeslot=0x1D75,
},
[0x1D76]={
@@ -50832,7 +51879,7 @@ characters.data={
description="LATIN SMALL LETTER Z WITH MIDDLE TILDE",
direction="l",
linebreak="al",
- shcode=0x007A,
+ shcode=0x7A,
unicodeslot=0x1D76,
},
[0x1D77]={
@@ -50847,7 +51894,7 @@ characters.data={
description="MODIFIER LETTER CYRILLIC EN",
direction="l",
linebreak="al",
- specials={ "super", 0x043D },
+ specials={ "super", 0x43D },
unicodeslot=0x1D78,
},
[0x1D79]={
@@ -50876,7 +51923,7 @@ characters.data={
description="LATIN SMALL LETTER IOTA WITH STROKE",
direction="l",
linebreak="al",
- shcode=0x0269,
+ shcode=0x269,
unicodeslot=0x1D7C,
},
[0x1D7D]={
@@ -50884,7 +51931,7 @@ characters.data={
description="LATIN SMALL LETTER P WITH STROKE",
direction="l",
linebreak="al",
- shcode=0x0070,
+ shcode=0x70,
uccode=0x2C63,
unicodeslot=0x1D7D,
},
@@ -50900,7 +51947,7 @@ characters.data={
description="LATIN SMALL LETTER UPSILON WITH STROKE",
direction="l",
linebreak="al",
- shcode=0x028A,
+ shcode=0x28A,
unicodeslot=0x1D7F,
},
[0x1D80]={
@@ -50908,7 +51955,7 @@ characters.data={
description="LATIN SMALL LETTER B WITH PALATAL HOOK",
direction="l",
linebreak="al",
- shcode=0x0062,
+ shcode=0x62,
unicodeslot=0x1D80,
},
[0x1D81]={
@@ -50916,7 +51963,7 @@ characters.data={
description="LATIN SMALL LETTER D WITH PALATAL HOOK",
direction="l",
linebreak="al",
- shcode=0x0064,
+ shcode=0x64,
unicodeslot=0x1D81,
},
[0x1D82]={
@@ -50924,7 +51971,7 @@ characters.data={
description="LATIN SMALL LETTER F WITH PALATAL HOOK",
direction="l",
linebreak="al",
- shcode=0x0066,
+ shcode=0x66,
unicodeslot=0x1D82,
},
[0x1D83]={
@@ -50932,7 +51979,7 @@ characters.data={
description="LATIN SMALL LETTER G WITH PALATAL HOOK",
direction="l",
linebreak="al",
- shcode=0x0067,
+ shcode=0x67,
unicodeslot=0x1D83,
},
[0x1D84]={
@@ -50940,7 +51987,7 @@ characters.data={
description="LATIN SMALL LETTER K WITH PALATAL HOOK",
direction="l",
linebreak="al",
- shcode=0x006B,
+ shcode=0x6B,
unicodeslot=0x1D84,
},
[0x1D85]={
@@ -50948,7 +51995,7 @@ characters.data={
description="LATIN SMALL LETTER L WITH PALATAL HOOK",
direction="l",
linebreak="al",
- shcode=0x006C,
+ shcode=0x6C,
unicodeslot=0x1D85,
},
[0x1D86]={
@@ -50956,7 +52003,7 @@ characters.data={
description="LATIN SMALL LETTER M WITH PALATAL HOOK",
direction="l",
linebreak="al",
- shcode=0x006D,
+ shcode=0x6D,
unicodeslot=0x1D86,
},
[0x1D87]={
@@ -50964,7 +52011,7 @@ characters.data={
description="LATIN SMALL LETTER N WITH PALATAL HOOK",
direction="l",
linebreak="al",
- shcode=0x006E,
+ shcode=0x6E,
unicodeslot=0x1D87,
},
[0x1D88]={
@@ -50972,7 +52019,7 @@ characters.data={
description="LATIN SMALL LETTER P WITH PALATAL HOOK",
direction="l",
linebreak="al",
- shcode=0x0070,
+ shcode=0x70,
unicodeslot=0x1D88,
},
[0x1D89]={
@@ -50980,7 +52027,7 @@ characters.data={
description="LATIN SMALL LETTER R WITH PALATAL HOOK",
direction="l",
linebreak="al",
- shcode=0x0072,
+ shcode=0x72,
unicodeslot=0x1D89,
},
[0x1D8A]={
@@ -50988,7 +52035,7 @@ characters.data={
description="LATIN SMALL LETTER S WITH PALATAL HOOK",
direction="l",
linebreak="al",
- shcode=0x0073,
+ shcode=0x73,
unicodeslot=0x1D8A,
},
[0x1D8B]={
@@ -50996,7 +52043,7 @@ characters.data={
description="LATIN SMALL LETTER ESH WITH PALATAL HOOK",
direction="l",
linebreak="al",
- shcode=0x0283,
+ shcode=0x283,
unicodeslot=0x1D8B,
},
[0x1D8C]={
@@ -51004,7 +52051,7 @@ characters.data={
description="LATIN SMALL LETTER V WITH PALATAL HOOK",
direction="l",
linebreak="al",
- shcode=0x0076,
+ shcode=0x76,
unicodeslot=0x1D8C,
},
[0x1D8D]={
@@ -51012,7 +52059,7 @@ characters.data={
description="LATIN SMALL LETTER X WITH PALATAL HOOK",
direction="l",
linebreak="al",
- shcode=0x0078,
+ shcode=0x78,
unicodeslot=0x1D8D,
},
[0x1D8E]={
@@ -51020,7 +52067,7 @@ characters.data={
description="LATIN SMALL LETTER Z WITH PALATAL HOOK",
direction="l",
linebreak="al",
- shcode=0x007A,
+ shcode=0x7A,
unicodeslot=0x1D8E,
},
[0x1D8F]={
@@ -51028,7 +52075,7 @@ characters.data={
description="LATIN SMALL LETTER A WITH RETROFLEX HOOK",
direction="l",
linebreak="al",
- shcode=0x0061,
+ shcode=0x61,
unicodeslot=0x1D8F,
},
[0x1D90]={
@@ -51036,7 +52083,7 @@ characters.data={
description="LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK",
direction="l",
linebreak="al",
- shcode=0x0251,
+ shcode=0x251,
unicodeslot=0x1D90,
},
[0x1D91]={
@@ -51044,7 +52091,7 @@ characters.data={
description="LATIN SMALL LETTER D WITH HOOK AND TAIL",
direction="l",
linebreak="al",
- shcode=0x0064,
+ shcode=0x64,
unicodeslot=0x1D91,
},
[0x1D92]={
@@ -51052,7 +52099,7 @@ characters.data={
description="LATIN SMALL LETTER E WITH RETROFLEX HOOK",
direction="l",
linebreak="al",
- shcode=0x0065,
+ shcode=0x65,
unicodeslot=0x1D92,
},
[0x1D93]={
@@ -51074,7 +52121,7 @@ characters.data={
description="LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK",
direction="l",
linebreak="al",
- shcode=0x0259,
+ shcode=0x259,
unicodeslot=0x1D95,
},
[0x1D96]={
@@ -51082,7 +52129,7 @@ characters.data={
description="LATIN SMALL LETTER I WITH RETROFLEX HOOK",
direction="l",
linebreak="al",
- shcode=0x0069,
+ shcode=0x69,
unicodeslot=0x1D96,
},
[0x1D97]={
@@ -51097,7 +52144,7 @@ characters.data={
description="LATIN SMALL LETTER ESH WITH RETROFLEX HOOK",
direction="l",
linebreak="al",
- shcode=0x0283,
+ shcode=0x283,
unicodeslot=0x1D98,
},
[0x1D99]={
@@ -51105,7 +52152,7 @@ characters.data={
description="LATIN SMALL LETTER U WITH RETROFLEX HOOK",
direction="l",
linebreak="al",
- shcode=0x0075,
+ shcode=0x75,
unicodeslot=0x1D99,
},
[0x1D9A]={
@@ -51113,7 +52160,7 @@ characters.data={
description="LATIN SMALL LETTER EZH WITH RETROFLEX HOOK",
direction="l",
linebreak="al",
- shcode=0x0292,
+ shcode=0x292,
unicodeslot=0x1D9A,
},
[0x1D9B]={
@@ -51121,7 +52168,7 @@ characters.data={
description="MODIFIER LETTER SMALL TURNED ALPHA",
direction="l",
linebreak="al",
- specials={ "super", 0x0252 },
+ specials={ "super", 0x252 },
unicodeslot=0x1D9B,
},
[0x1D9C]={
@@ -51129,7 +52176,7 @@ characters.data={
description="MODIFIER LETTER SMALL C",
direction="l",
linebreak="al",
- specials={ "super", 0x0063 },
+ specials={ "super", 0x63 },
unicodeslot=0x1D9C,
},
[0x1D9D]={
@@ -51137,7 +52184,7 @@ characters.data={
description="MODIFIER LETTER SMALL C WITH CURL",
direction="l",
linebreak="al",
- specials={ "super", 0x0255 },
+ specials={ "super", 0x255 },
unicodeslot=0x1D9D,
},
[0x1D9E]={
@@ -51145,7 +52192,7 @@ characters.data={
description="MODIFIER LETTER SMALL ETH",
direction="l",
linebreak="al",
- specials={ "super", 0x00F0 },
+ specials={ "super", 0xF0 },
unicodeslot=0x1D9E,
},
[0x1D9F]={
@@ -51153,7 +52200,7 @@ characters.data={
description="MODIFIER LETTER SMALL REVERSED OPEN E",
direction="l",
linebreak="al",
- specials={ "super", 0x025C },
+ specials={ "super", 0x25C },
unicodeslot=0x1D9F,
},
[0x1DA0]={
@@ -51161,7 +52208,7 @@ characters.data={
description="MODIFIER LETTER SMALL F",
direction="l",
linebreak="al",
- specials={ "super", 0x0066 },
+ specials={ "super", 0x66 },
unicodeslot=0x1DA0,
},
[0x1DA1]={
@@ -51169,7 +52216,7 @@ characters.data={
description="MODIFIER LETTER SMALL DOTLESS J WITH STROKE",
direction="l",
linebreak="al",
- specials={ "super", 0x025F },
+ specials={ "super", 0x25F },
unicodeslot=0x1DA1,
},
[0x1DA2]={
@@ -51177,7 +52224,7 @@ characters.data={
description="MODIFIER LETTER SMALL SCRIPT G",
direction="l",
linebreak="al",
- specials={ "super", 0x0261 },
+ specials={ "super", 0x261 },
unicodeslot=0x1DA2,
},
[0x1DA3]={
@@ -51185,7 +52232,7 @@ characters.data={
description="MODIFIER LETTER SMALL TURNED H",
direction="l",
linebreak="al",
- specials={ "super", 0x0265 },
+ specials={ "super", 0x265 },
unicodeslot=0x1DA3,
},
[0x1DA4]={
@@ -51193,7 +52240,7 @@ characters.data={
description="MODIFIER LETTER SMALL I WITH STROKE",
direction="l",
linebreak="al",
- specials={ "super", 0x0268 },
+ specials={ "super", 0x268 },
unicodeslot=0x1DA4,
},
[0x1DA5]={
@@ -51201,7 +52248,7 @@ characters.data={
description="MODIFIER LETTER SMALL IOTA",
direction="l",
linebreak="al",
- specials={ "super", 0x0269 },
+ specials={ "super", 0x269 },
unicodeslot=0x1DA5,
},
[0x1DA6]={
@@ -51209,7 +52256,7 @@ characters.data={
description="MODIFIER LETTER SMALL CAPITAL I",
direction="l",
linebreak="al",
- specials={ "super", 0x026A },
+ specials={ "super", 0x26A },
unicodeslot=0x1DA6,
},
[0x1DA7]={
@@ -51225,7 +52272,7 @@ characters.data={
description="MODIFIER LETTER SMALL J WITH CROSSED-TAIL",
direction="l",
linebreak="al",
- specials={ "super", 0x029D },
+ specials={ "super", 0x29D },
unicodeslot=0x1DA8,
},
[0x1DA9]={
@@ -51233,7 +52280,7 @@ characters.data={
description="MODIFIER LETTER SMALL L WITH RETROFLEX HOOK",
direction="l",
linebreak="al",
- specials={ "super", 0x026D },
+ specials={ "super", 0x26D },
unicodeslot=0x1DA9,
},
[0x1DAA]={
@@ -51249,7 +52296,7 @@ characters.data={
description="MODIFIER LETTER SMALL CAPITAL L",
direction="l",
linebreak="al",
- specials={ "super", 0x029F },
+ specials={ "super", 0x29F },
unicodeslot=0x1DAB,
},
[0x1DAC]={
@@ -51257,7 +52304,7 @@ characters.data={
description="MODIFIER LETTER SMALL M WITH HOOK",
direction="l",
linebreak="al",
- specials={ "super", 0x0271 },
+ specials={ "super", 0x271 },
unicodeslot=0x1DAC,
},
[0x1DAD]={
@@ -51265,7 +52312,7 @@ characters.data={
description="MODIFIER LETTER SMALL TURNED M WITH LONG LEG",
direction="l",
linebreak="al",
- specials={ "super", 0x0270 },
+ specials={ "super", 0x270 },
unicodeslot=0x1DAD,
},
[0x1DAE]={
@@ -51273,7 +52320,7 @@ characters.data={
description="MODIFIER LETTER SMALL N WITH LEFT HOOK",
direction="l",
linebreak="al",
- specials={ "super", 0x0272 },
+ specials={ "super", 0x272 },
unicodeslot=0x1DAE,
},
[0x1DAF]={
@@ -51281,7 +52328,7 @@ characters.data={
description="MODIFIER LETTER SMALL N WITH RETROFLEX HOOK",
direction="l",
linebreak="al",
- specials={ "super", 0x0273 },
+ specials={ "super", 0x273 },
unicodeslot=0x1DAF,
},
[0x1DB0]={
@@ -51289,7 +52336,7 @@ characters.data={
description="MODIFIER LETTER SMALL CAPITAL N",
direction="l",
linebreak="al",
- specials={ "super", 0x0274 },
+ specials={ "super", 0x274 },
unicodeslot=0x1DB0,
},
[0x1DB1]={
@@ -51297,7 +52344,7 @@ characters.data={
description="MODIFIER LETTER SMALL BARRED O",
direction="l",
linebreak="al",
- specials={ "super", 0x0275 },
+ specials={ "super", 0x275 },
unicodeslot=0x1DB1,
},
[0x1DB2]={
@@ -51305,7 +52352,7 @@ characters.data={
description="MODIFIER LETTER SMALL PHI",
direction="l",
linebreak="al",
- specials={ "super", 0x0278 },
+ specials={ "super", 0x278 },
unicodeslot=0x1DB2,
},
[0x1DB3]={
@@ -51313,7 +52360,7 @@ characters.data={
description="MODIFIER LETTER SMALL S WITH HOOK",
direction="l",
linebreak="al",
- specials={ "super", 0x0282 },
+ specials={ "super", 0x282 },
unicodeslot=0x1DB3,
},
[0x1DB4]={
@@ -51321,7 +52368,7 @@ characters.data={
description="MODIFIER LETTER SMALL ESH",
direction="l",
linebreak="al",
- specials={ "super", 0x0283 },
+ specials={ "super", 0x283 },
unicodeslot=0x1DB4,
},
[0x1DB5]={
@@ -51329,7 +52376,7 @@ characters.data={
description="MODIFIER LETTER SMALL T WITH PALATAL HOOK",
direction="l",
linebreak="al",
- specials={ "super", 0x01AB },
+ specials={ "super", 0x1AB },
unicodeslot=0x1DB5,
},
[0x1DB6]={
@@ -51337,7 +52384,7 @@ characters.data={
description="MODIFIER LETTER SMALL U BAR",
direction="l",
linebreak="al",
- specials={ "super", 0x0289 },
+ specials={ "super", 0x289 },
unicodeslot=0x1DB6,
},
[0x1DB7]={
@@ -51345,7 +52392,7 @@ characters.data={
description="MODIFIER LETTER SMALL UPSILON",
direction="l",
linebreak="al",
- specials={ "super", 0x028A },
+ specials={ "super", 0x28A },
unicodeslot=0x1DB7,
},
[0x1DB8]={
@@ -51361,7 +52408,7 @@ characters.data={
description="MODIFIER LETTER SMALL V WITH HOOK",
direction="l",
linebreak="al",
- specials={ "super", 0x028B },
+ specials={ "super", 0x28B },
unicodeslot=0x1DB9,
},
[0x1DBA]={
@@ -51369,7 +52416,7 @@ characters.data={
description="MODIFIER LETTER SMALL TURNED V",
direction="l",
linebreak="al",
- specials={ "super", 0x028C },
+ specials={ "super", 0x28C },
unicodeslot=0x1DBA,
},
[0x1DBB]={
@@ -51377,7 +52424,7 @@ characters.data={
description="MODIFIER LETTER SMALL Z",
direction="l",
linebreak="al",
- specials={ "super", 0x007A },
+ specials={ "super", 0x7A },
unicodeslot=0x1DBB,
},
[0x1DBC]={
@@ -51385,7 +52432,7 @@ characters.data={
description="MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK",
direction="l",
linebreak="al",
- specials={ "super", 0x0290 },
+ specials={ "super", 0x290 },
unicodeslot=0x1DBC,
},
[0x1DBD]={
@@ -51393,7 +52440,7 @@ characters.data={
description="MODIFIER LETTER SMALL Z WITH CURL",
direction="l",
linebreak="al",
- specials={ "super", 0x0291 },
+ specials={ "super", 0x291 },
unicodeslot=0x1DBD,
},
[0x1DBE]={
@@ -51401,7 +52448,7 @@ characters.data={
description="MODIFIER LETTER SMALL EZH",
direction="l",
linebreak="al",
- specials={ "super", 0x0292 },
+ specials={ "super", 0x292 },
unicodeslot=0x1DBE,
},
[0x1DBF]={
@@ -51409,11 +52456,12 @@ characters.data={
description="MODIFIER LETTER SMALL THETA",
direction="l",
linebreak="al",
- specials={ "super", 0x03B8 },
+ specials={ "super", 0x3B8 },
unicodeslot=0x1DBF,
},
[0x1DC0]={
category="mn",
+ combining=0xE6,
description="COMBINING DOTTED GRAVE ACCENT",
direction="nsm",
linebreak="cm",
@@ -51421,6 +52469,7 @@ characters.data={
},
[0x1DC1]={
category="mn",
+ combining=0xE6,
description="COMBINING DOTTED ACUTE ACCENT",
direction="nsm",
linebreak="cm",
@@ -51428,6 +52477,7 @@ characters.data={
},
[0x1DC2]={
category="mn",
+ combining=0xDC,
description="COMBINING SNAKE BELOW",
direction="nsm",
linebreak="cm",
@@ -51435,6 +52485,7 @@ characters.data={
},
[0x1DC3]={
category="mn",
+ combining=0xE6,
description="COMBINING SUSPENSION MARK",
direction="nsm",
linebreak="cm",
@@ -51442,6 +52493,7 @@ characters.data={
},
[0x1DC4]={
category="mn",
+ combining=0xE6,
description="COMBINING MACRON-ACUTE",
direction="nsm",
linebreak="cm",
@@ -51449,6 +52501,7 @@ characters.data={
},
[0x1DC5]={
category="mn",
+ combining=0xE6,
description="COMBINING GRAVE-MACRON",
direction="nsm",
linebreak="cm",
@@ -51456,6 +52509,7 @@ characters.data={
},
[0x1DC6]={
category="mn",
+ combining=0xE6,
description="COMBINING MACRON-GRAVE",
direction="nsm",
linebreak="cm",
@@ -51463,6 +52517,7 @@ characters.data={
},
[0x1DC7]={
category="mn",
+ combining=0xE6,
description="COMBINING ACUTE-MACRON",
direction="nsm",
linebreak="cm",
@@ -51470,6 +52525,7 @@ characters.data={
},
[0x1DC8]={
category="mn",
+ combining=0xE6,
description="COMBINING GRAVE-ACUTE-GRAVE",
direction="nsm",
linebreak="cm",
@@ -51477,6 +52533,7 @@ characters.data={
},
[0x1DC9]={
category="mn",
+ combining=0xE6,
description="COMBINING ACUTE-GRAVE-ACUTE",
direction="nsm",
linebreak="cm",
@@ -51484,6 +52541,7 @@ characters.data={
},
[0x1DCA]={
category="mn",
+ combining=0xDC,
description="COMBINING LATIN SMALL LETTER R BELOW",
direction="nsm",
linebreak="cm",
@@ -51491,6 +52549,7 @@ characters.data={
},
[0x1DCB]={
category="mn",
+ combining=0xE6,
description="COMBINING BREVE-MACRON",
direction="nsm",
linebreak="cm",
@@ -51498,6 +52557,7 @@ characters.data={
},
[0x1DCC]={
category="mn",
+ combining=0xE6,
description="COMBINING MACRON-BREVE",
direction="nsm",
linebreak="cm",
@@ -51505,6 +52565,7 @@ characters.data={
},
[0x1DCD]={
category="mn",
+ combining=0xEA,
description="COMBINING DOUBLE CIRCUMFLEX ABOVE",
direction="nsm",
linebreak="cm",
@@ -51512,6 +52573,7 @@ characters.data={
},
[0x1DCE]={
category="mn",
+ combining=0xD6,
description="COMBINING OGONEK ABOVE",
direction="nsm",
linebreak="cm",
@@ -51519,6 +52581,7 @@ characters.data={
},
[0x1DCF]={
category="mn",
+ combining=0xDC,
description="COMBINING ZIGZAG BELOW",
direction="nsm",
linebreak="cm",
@@ -51526,6 +52589,7 @@ characters.data={
},
[0x1DD0]={
category="mn",
+ combining=0xCA,
description="COMBINING IS BELOW",
direction="nsm",
linebreak="cm",
@@ -51533,6 +52597,7 @@ characters.data={
},
[0x1DD1]={
category="mn",
+ combining=0xE6,
description="COMBINING UR ABOVE",
direction="nsm",
linebreak="cm",
@@ -51540,6 +52605,7 @@ characters.data={
},
[0x1DD2]={
category="mn",
+ combining=0xE6,
description="COMBINING US ABOVE",
direction="nsm",
linebreak="cm",
@@ -51547,6 +52613,7 @@ characters.data={
},
[0x1DD3]={
category="mn",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE",
direction="nsm",
linebreak="cm",
@@ -51554,6 +52621,7 @@ characters.data={
},
[0x1DD4]={
category="mn",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER AE",
direction="nsm",
linebreak="cm",
@@ -51561,6 +52629,7 @@ characters.data={
},
[0x1DD5]={
category="mn",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER AO",
direction="nsm",
linebreak="cm",
@@ -51568,6 +52637,7 @@ characters.data={
},
[0x1DD6]={
category="mn",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER AV",
direction="nsm",
linebreak="cm",
@@ -51575,6 +52645,7 @@ characters.data={
},
[0x1DD7]={
category="mn",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER C CEDILLA",
direction="nsm",
linebreak="cm",
@@ -51582,6 +52653,7 @@ characters.data={
},
[0x1DD8]={
category="mn",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER INSULAR D",
direction="nsm",
linebreak="cm",
@@ -51589,6 +52661,7 @@ characters.data={
},
[0x1DD9]={
category="mn",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER ETH",
direction="nsm",
linebreak="cm",
@@ -51596,6 +52669,7 @@ characters.data={
},
[0x1DDA]={
category="mn",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER G",
direction="nsm",
linebreak="cm",
@@ -51603,6 +52677,7 @@ characters.data={
},
[0x1DDB]={
category="mn",
+ combining=0xE6,
description="COMBINING LATIN LETTER SMALL CAPITAL G",
direction="nsm",
linebreak="cm",
@@ -51610,6 +52685,7 @@ characters.data={
},
[0x1DDC]={
category="mn",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER K",
direction="nsm",
linebreak="cm",
@@ -51617,6 +52693,7 @@ characters.data={
},
[0x1DDD]={
category="mn",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER L",
direction="nsm",
linebreak="cm",
@@ -51624,6 +52701,7 @@ characters.data={
},
[0x1DDE]={
category="mn",
+ combining=0xE6,
description="COMBINING LATIN LETTER SMALL CAPITAL L",
direction="nsm",
linebreak="cm",
@@ -51631,6 +52709,7 @@ characters.data={
},
[0x1DDF]={
category="mn",
+ combining=0xE6,
description="COMBINING LATIN LETTER SMALL CAPITAL M",
direction="nsm",
linebreak="cm",
@@ -51638,6 +52717,7 @@ characters.data={
},
[0x1DE0]={
category="mn",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER N",
direction="nsm",
linebreak="cm",
@@ -51645,6 +52725,7 @@ characters.data={
},
[0x1DE1]={
category="mn",
+ combining=0xE6,
description="COMBINING LATIN LETTER SMALL CAPITAL N",
direction="nsm",
linebreak="cm",
@@ -51652,6 +52733,7 @@ characters.data={
},
[0x1DE2]={
category="mn",
+ combining=0xE6,
description="COMBINING LATIN LETTER SMALL CAPITAL R",
direction="nsm",
linebreak="cm",
@@ -51659,6 +52741,7 @@ characters.data={
},
[0x1DE3]={
category="mn",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER R ROTUNDA",
direction="nsm",
linebreak="cm",
@@ -51666,6 +52749,7 @@ characters.data={
},
[0x1DE4]={
category="mn",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER S",
direction="nsm",
linebreak="cm",
@@ -51673,6 +52757,7 @@ characters.data={
},
[0x1DE5]={
category="mn",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER LONG S",
direction="nsm",
linebreak="cm",
@@ -51680,13 +52765,135 @@ characters.data={
},
[0x1DE6]={
category="mn",
+ combining=0xE6,
description="COMBINING LATIN SMALL LETTER Z",
direction="nsm",
linebreak="cm",
unicodeslot=0x1DE6,
},
+ [0x1DE7]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING LATIN SMALL LETTER ALPHA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DE7,
+ },
+ [0x1DE8]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING LATIN SMALL LETTER B",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DE8,
+ },
+ [0x1DE9]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING LATIN SMALL LETTER BETA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DE9,
+ },
+ [0x1DEA]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING LATIN SMALL LETTER SCHWA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DEA,
+ },
+ [0x1DEB]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING LATIN SMALL LETTER F",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DEB,
+ },
+ [0x1DEC]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DEC,
+ },
+ [0x1DED]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DED,
+ },
+ [0x1DEE]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING LATIN SMALL LETTER P",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DEE,
+ },
+ [0x1DEF]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING LATIN SMALL LETTER ESH",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DEF,
+ },
+ [0x1DF0]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DF0,
+ },
+ [0x1DF1]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING LATIN SMALL LETTER W",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DF1,
+ },
+ [0x1DF2]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING LATIN SMALL LETTER A WITH DIAERESIS",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DF2,
+ },
+ [0x1DF3]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING LATIN SMALL LETTER O WITH DIAERESIS",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DF3,
+ },
+ [0x1DF4]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING LATIN SMALL LETTER U WITH DIAERESIS",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DF4,
+ },
+ [0x1DF5]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING UP TACK ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DF5,
+ },
[0x1DFC]={
category="mn",
+ combining=0xE9,
description="COMBINING DOUBLE INVERTED BREVE BELOW",
direction="nsm",
linebreak="cm",
@@ -51694,6 +52901,7 @@ characters.data={
},
[0x1DFD]={
category="mn",
+ combining=0xDC,
description="COMBINING ALMOST EQUAL TO BELOW",
direction="nsm",
linebreak="cm",
@@ -51701,6 +52909,7 @@ characters.data={
},
[0x1DFE]={
category="mn",
+ combining=0xE6,
description="COMBINING LEFT ARROWHEAD ABOVE",
direction="nsm",
linebreak="cm",
@@ -51708,6 +52917,7 @@ characters.data={
},
[0x1DFF]={
category="mn",
+ combining=0xDC,
description="COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW",
direction="nsm",
linebreak="cm",
@@ -51720,8 +52930,8 @@ characters.data={
direction="l",
lccode=0x1E01,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x0041, 0x0325 },
+ shcode=0x41,
+ specials={ "char", 0x41, 0x325 },
unicodeslot=0x1E00,
},
[0x1E01]={
@@ -51730,8 +52940,8 @@ characters.data={
description="LATIN SMALL LETTER A WITH RING BELOW",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x0061, 0x0325 },
+ shcode=0x61,
+ specials={ "char", 0x61, 0x325 },
uccode=0x1E00,
unicodeslot=0x1E01,
},
@@ -51742,8 +52952,8 @@ characters.data={
direction="l",
lccode=0x1E03,
linebreak="al",
- shcode=0x0042,
- specials={ "char", 0x0042, 0x0307 },
+ shcode=0x42,
+ specials={ "char", 0x42, 0x307 },
unicodeslot=0x1E02,
},
[0x1E03]={
@@ -51752,8 +52962,8 @@ characters.data={
description="LATIN SMALL LETTER B WITH DOT ABOVE",
direction="l",
linebreak="al",
- shcode=0x0062,
- specials={ "char", 0x0062, 0x0307 },
+ shcode=0x62,
+ specials={ "char", 0x62, 0x307 },
uccode=0x1E02,
unicodeslot=0x1E03,
},
@@ -51764,8 +52974,8 @@ characters.data={
direction="l",
lccode=0x1E05,
linebreak="al",
- shcode=0x0042,
- specials={ "char", 0x0042, 0x0323 },
+ shcode=0x42,
+ specials={ "char", 0x42, 0x323 },
unicodeslot=0x1E04,
},
[0x1E05]={
@@ -51774,8 +52984,8 @@ characters.data={
description="LATIN SMALL LETTER B WITH DOT BELOW",
direction="l",
linebreak="al",
- shcode=0x0062,
- specials={ "char", 0x0062, 0x0323 },
+ shcode=0x62,
+ specials={ "char", 0x62, 0x323 },
uccode=0x1E04,
unicodeslot=0x1E05,
},
@@ -51786,8 +52996,8 @@ characters.data={
direction="l",
lccode=0x1E07,
linebreak="al",
- shcode=0x0042,
- specials={ "char", 0x0042, 0x0331 },
+ shcode=0x42,
+ specials={ "char", 0x42, 0x331 },
unicodeslot=0x1E06,
},
[0x1E07]={
@@ -51796,8 +53006,8 @@ characters.data={
description="LATIN SMALL LETTER B WITH LINE BELOW",
direction="l",
linebreak="al",
- shcode=0x0062,
- specials={ "char", 0x0062, 0x0331 },
+ shcode=0x62,
+ specials={ "char", 0x62, 0x331 },
uccode=0x1E06,
unicodeslot=0x1E07,
},
@@ -51808,8 +53018,8 @@ characters.data={
direction="l",
lccode=0x1E09,
linebreak="al",
- shcode=0x0043,
- specials={ "char", 0x00C7, 0x0301 },
+ shcode=0x43,
+ specials={ "char", 0xC7, 0x301 },
unicodeslot=0x1E08,
},
[0x1E09]={
@@ -51818,8 +53028,8 @@ characters.data={
description="LATIN SMALL LETTER C WITH CEDILLA AND ACUTE",
direction="l",
linebreak="al",
- shcode=0x0063,
- specials={ "char", 0x00E7, 0x0301 },
+ shcode=0x63,
+ specials={ "char", 0xE7, 0x301 },
uccode=0x1E08,
unicodeslot=0x1E09,
},
@@ -51830,8 +53040,8 @@ characters.data={
direction="l",
lccode=0x1E0B,
linebreak="al",
- shcode=0x0044,
- specials={ "char", 0x0044, 0x0307 },
+ shcode=0x44,
+ specials={ "char", 0x44, 0x307 },
unicodeslot=0x1E0A,
},
[0x1E0B]={
@@ -51840,8 +53050,8 @@ characters.data={
description="LATIN SMALL LETTER D WITH DOT ABOVE",
direction="l",
linebreak="al",
- shcode=0x0064,
- specials={ "char", 0x0064, 0x0307 },
+ shcode=0x64,
+ specials={ "char", 0x64, 0x307 },
uccode=0x1E0A,
unicodeslot=0x1E0B,
},
@@ -51852,8 +53062,8 @@ characters.data={
direction="l",
lccode=0x1E0D,
linebreak="al",
- shcode=0x0044,
- specials={ "char", 0x0044, 0x0323 },
+ shcode=0x44,
+ specials={ "char", 0x44, 0x323 },
unicodeslot=0x1E0C,
},
[0x1E0D]={
@@ -51862,8 +53072,8 @@ characters.data={
description="LATIN SMALL LETTER D WITH DOT BELOW",
direction="l",
linebreak="al",
- shcode=0x0064,
- specials={ "char", 0x0064, 0x0323 },
+ shcode=0x64,
+ specials={ "char", 0x64, 0x323 },
uccode=0x1E0C,
unicodeslot=0x1E0D,
},
@@ -51874,8 +53084,8 @@ characters.data={
direction="l",
lccode=0x1E0F,
linebreak="al",
- shcode=0x0044,
- specials={ "char", 0x0044, 0x0331 },
+ shcode=0x44,
+ specials={ "char", 0x44, 0x331 },
unicodeslot=0x1E0E,
},
[0x1E0F]={
@@ -51884,8 +53094,8 @@ characters.data={
description="LATIN SMALL LETTER D WITH LINE BELOW",
direction="l",
linebreak="al",
- shcode=0x0064,
- specials={ "char", 0x0064, 0x0331 },
+ shcode=0x64,
+ specials={ "char", 0x64, 0x331 },
uccode=0x1E0E,
unicodeslot=0x1E0F,
},
@@ -51896,8 +53106,8 @@ characters.data={
direction="l",
lccode=0x1E11,
linebreak="al",
- shcode=0x0044,
- specials={ "char", 0x0044, 0x0327 },
+ shcode=0x44,
+ specials={ "char", 0x44, 0x327 },
unicodeslot=0x1E10,
},
[0x1E11]={
@@ -51906,8 +53116,8 @@ characters.data={
description="LATIN SMALL LETTER D WITH CEDILLA",
direction="l",
linebreak="al",
- shcode=0x0064,
- specials={ "char", 0x0064, 0x0327 },
+ shcode=0x64,
+ specials={ "char", 0x64, 0x327 },
uccode=0x1E10,
unicodeslot=0x1E11,
},
@@ -51918,8 +53128,8 @@ characters.data={
direction="l",
lccode=0x1E13,
linebreak="al",
- shcode=0x0044,
- specials={ "char", 0x0044, 0x032D },
+ shcode=0x44,
+ specials={ "char", 0x44, 0x32D },
unicodeslot=0x1E12,
},
[0x1E13]={
@@ -51928,8 +53138,8 @@ characters.data={
description="LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW",
direction="l",
linebreak="al",
- shcode=0x0064,
- specials={ "char", 0x0064, 0x032D },
+ shcode=0x64,
+ specials={ "char", 0x64, 0x32D },
uccode=0x1E12,
unicodeslot=0x1E13,
},
@@ -51940,8 +53150,8 @@ characters.data={
direction="l",
lccode=0x1E15,
linebreak="al",
- shcode=0x0045,
- specials={ "char", 0x0112, 0x0300 },
+ shcode=0x45,
+ specials={ "char", 0x112, 0x300 },
unicodeslot=0x1E14,
},
[0x1E15]={
@@ -51950,8 +53160,8 @@ characters.data={
description="LATIN SMALL LETTER E WITH MACRON AND GRAVE",
direction="l",
linebreak="al",
- shcode=0x0065,
- specials={ "char", 0x0113, 0x0300 },
+ shcode=0x65,
+ specials={ "char", 0x113, 0x300 },
uccode=0x1E14,
unicodeslot=0x1E15,
},
@@ -51962,8 +53172,8 @@ characters.data={
direction="l",
lccode=0x1E17,
linebreak="al",
- shcode=0x0045,
- specials={ "char", 0x0112, 0x0301 },
+ shcode=0x45,
+ specials={ "char", 0x112, 0x301 },
unicodeslot=0x1E16,
},
[0x1E17]={
@@ -51972,8 +53182,8 @@ characters.data={
description="LATIN SMALL LETTER E WITH MACRON AND ACUTE",
direction="l",
linebreak="al",
- shcode=0x0065,
- specials={ "char", 0x0113, 0x0301 },
+ shcode=0x65,
+ specials={ "char", 0x113, 0x301 },
uccode=0x1E16,
unicodeslot=0x1E17,
},
@@ -51984,8 +53194,8 @@ characters.data={
direction="l",
lccode=0x1E19,
linebreak="al",
- shcode=0x0045,
- specials={ "char", 0x0045, 0x032D },
+ shcode=0x45,
+ specials={ "char", 0x45, 0x32D },
unicodeslot=0x1E18,
},
[0x1E19]={
@@ -51994,8 +53204,8 @@ characters.data={
description="LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW",
direction="l",
linebreak="al",
- shcode=0x0065,
- specials={ "char", 0x0065, 0x032D },
+ shcode=0x65,
+ specials={ "char", 0x65, 0x32D },
uccode=0x1E18,
unicodeslot=0x1E19,
},
@@ -52006,8 +53216,8 @@ characters.data={
direction="l",
lccode=0x1E1B,
linebreak="al",
- shcode=0x0045,
- specials={ "char", 0x0045, 0x0330 },
+ shcode=0x45,
+ specials={ "char", 0x45, 0x330 },
unicodeslot=0x1E1A,
},
[0x1E1B]={
@@ -52016,8 +53226,8 @@ characters.data={
description="LATIN SMALL LETTER E WITH TILDE BELOW",
direction="l",
linebreak="al",
- shcode=0x0065,
- specials={ "char", 0x0065, 0x0330 },
+ shcode=0x65,
+ specials={ "char", 0x65, 0x330 },
uccode=0x1E1A,
unicodeslot=0x1E1B,
},
@@ -52028,8 +53238,8 @@ characters.data={
direction="l",
lccode=0x1E1D,
linebreak="al",
- shcode=0x0045,
- specials={ "char", 0x0228, 0x0306 },
+ shcode=0x45,
+ specials={ "char", 0x228, 0x306 },
unicodeslot=0x1E1C,
},
[0x1E1D]={
@@ -52038,8 +53248,8 @@ characters.data={
description="LATIN SMALL LETTER E WITH CEDILLA AND BREVE",
direction="l",
linebreak="al",
- shcode=0x0065,
- specials={ "char", 0x0229, 0x0306 },
+ shcode=0x65,
+ specials={ "char", 0x229, 0x306 },
uccode=0x1E1C,
unicodeslot=0x1E1D,
},
@@ -52050,8 +53260,8 @@ characters.data={
direction="l",
lccode=0x1E1F,
linebreak="al",
- shcode=0x0046,
- specials={ "char", 0x0046, 0x0307 },
+ shcode=0x46,
+ specials={ "char", 0x46, 0x307 },
unicodeslot=0x1E1E,
},
[0x1E1F]={
@@ -52060,8 +53270,8 @@ characters.data={
description="LATIN SMALL LETTER F WITH DOT ABOVE",
direction="l",
linebreak="al",
- shcode=0x0066,
- specials={ "char", 0x0066, 0x0307 },
+ shcode=0x66,
+ specials={ "char", 0x66, 0x307 },
uccode=0x1E1E,
unicodeslot=0x1E1F,
},
@@ -52072,8 +53282,8 @@ characters.data={
direction="l",
lccode=0x1E21,
linebreak="al",
- shcode=0x0047,
- specials={ "char", 0x0047, 0x0304 },
+ shcode=0x47,
+ specials={ "char", 0x47, 0x304 },
unicodeslot=0x1E20,
},
[0x1E21]={
@@ -52082,8 +53292,8 @@ characters.data={
description="LATIN SMALL LETTER G WITH MACRON",
direction="l",
linebreak="al",
- shcode=0x0067,
- specials={ "char", 0x0067, 0x0304 },
+ shcode=0x67,
+ specials={ "char", 0x67, 0x304 },
uccode=0x1E20,
unicodeslot=0x1E21,
},
@@ -52094,8 +53304,8 @@ characters.data={
direction="l",
lccode=0x1E23,
linebreak="al",
- shcode=0x0048,
- specials={ "char", 0x0048, 0x0307 },
+ shcode=0x48,
+ specials={ "char", 0x48, 0x307 },
unicodeslot=0x1E22,
},
[0x1E23]={
@@ -52104,8 +53314,8 @@ characters.data={
description="LATIN SMALL LETTER H WITH DOT ABOVE",
direction="l",
linebreak="al",
- shcode=0x0068,
- specials={ "char", 0x0068, 0x0307 },
+ shcode=0x68,
+ specials={ "char", 0x68, 0x307 },
uccode=0x1E22,
unicodeslot=0x1E23,
},
@@ -52116,8 +53326,8 @@ characters.data={
direction="l",
lccode=0x1E25,
linebreak="al",
- shcode=0x0048,
- specials={ "char", 0x0048, 0x0323 },
+ shcode=0x48,
+ specials={ "char", 0x48, 0x323 },
unicodeslot=0x1E24,
},
[0x1E25]={
@@ -52126,8 +53336,8 @@ characters.data={
description="LATIN SMALL LETTER H WITH DOT BELOW",
direction="l",
linebreak="al",
- shcode=0x0068,
- specials={ "char", 0x0068, 0x0323 },
+ shcode=0x68,
+ specials={ "char", 0x68, 0x323 },
uccode=0x1E24,
unicodeslot=0x1E25,
},
@@ -52138,8 +53348,8 @@ characters.data={
direction="l",
lccode=0x1E27,
linebreak="al",
- shcode=0x0048,
- specials={ "char", 0x0048, 0x0308 },
+ shcode=0x48,
+ specials={ "char", 0x48, 0x308 },
unicodeslot=0x1E26,
},
[0x1E27]={
@@ -52148,8 +53358,8 @@ characters.data={
description="LATIN SMALL LETTER H WITH DIAERESIS",
direction="l",
linebreak="al",
- shcode=0x0068,
- specials={ "char", 0x0068, 0x0308 },
+ shcode=0x68,
+ specials={ "char", 0x68, 0x308 },
uccode=0x1E26,
unicodeslot=0x1E27,
},
@@ -52160,8 +53370,8 @@ characters.data={
direction="l",
lccode=0x1E29,
linebreak="al",
- shcode=0x0048,
- specials={ "char", 0x0048, 0x0327 },
+ shcode=0x48,
+ specials={ "char", 0x48, 0x327 },
unicodeslot=0x1E28,
},
[0x1E29]={
@@ -52170,8 +53380,8 @@ characters.data={
description="LATIN SMALL LETTER H WITH CEDILLA",
direction="l",
linebreak="al",
- shcode=0x0068,
- specials={ "char", 0x0068, 0x0327 },
+ shcode=0x68,
+ specials={ "char", 0x68, 0x327 },
uccode=0x1E28,
unicodeslot=0x1E29,
},
@@ -52182,8 +53392,8 @@ characters.data={
direction="l",
lccode=0x1E2B,
linebreak="al",
- shcode=0x0048,
- specials={ "char", 0x0048, 0x032E },
+ shcode=0x48,
+ specials={ "char", 0x48, 0x32E },
unicodeslot=0x1E2A,
},
[0x1E2B]={
@@ -52192,8 +53402,8 @@ characters.data={
description="LATIN SMALL LETTER H WITH BREVE BELOW",
direction="l",
linebreak="al",
- shcode=0x0068,
- specials={ "char", 0x0068, 0x032E },
+ shcode=0x68,
+ specials={ "char", 0x68, 0x32E },
uccode=0x1E2A,
unicodeslot=0x1E2B,
},
@@ -52204,8 +53414,8 @@ characters.data={
direction="l",
lccode=0x1E2D,
linebreak="al",
- shcode=0x0049,
- specials={ "char", 0x0049, 0x0330 },
+ shcode=0x49,
+ specials={ "char", 0x49, 0x330 },
unicodeslot=0x1E2C,
},
[0x1E2D]={
@@ -52214,8 +53424,8 @@ characters.data={
description="LATIN SMALL LETTER I WITH TILDE BELOW",
direction="l",
linebreak="al",
- shcode=0x0069,
- specials={ "char", 0x0069, 0x0330 },
+ shcode=0x69,
+ specials={ "char", 0x69, 0x330 },
uccode=0x1E2C,
unicodeslot=0x1E2D,
},
@@ -52226,8 +53436,8 @@ characters.data={
direction="l",
lccode=0x1E2F,
linebreak="al",
- shcode=0x0049,
- specials={ "char", 0x00CF, 0x0301 },
+ shcode=0x49,
+ specials={ "char", 0xCF, 0x301 },
unicodeslot=0x1E2E,
},
[0x1E2F]={
@@ -52236,8 +53446,8 @@ characters.data={
description="LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE",
direction="l",
linebreak="al",
- shcode=0x0069,
- specials={ "char", 0x00EF, 0x0301 },
+ shcode=0x69,
+ specials={ "char", 0xEF, 0x301 },
uccode=0x1E2E,
unicodeslot=0x1E2F,
},
@@ -52248,8 +53458,8 @@ characters.data={
direction="l",
lccode=0x1E31,
linebreak="al",
- shcode=0x004B,
- specials={ "char", 0x004B, 0x0301 },
+ shcode=0x4B,
+ specials={ "char", 0x4B, 0x301 },
unicodeslot=0x1E30,
},
[0x1E31]={
@@ -52258,8 +53468,8 @@ characters.data={
description="LATIN SMALL LETTER K WITH ACUTE",
direction="l",
linebreak="al",
- shcode=0x006B,
- specials={ "char", 0x006B, 0x0301 },
+ shcode=0x6B,
+ specials={ "char", 0x6B, 0x301 },
uccode=0x1E30,
unicodeslot=0x1E31,
},
@@ -52270,8 +53480,8 @@ characters.data={
direction="l",
lccode=0x1E33,
linebreak="al",
- shcode=0x004B,
- specials={ "char", 0x004B, 0x0323 },
+ shcode=0x4B,
+ specials={ "char", 0x4B, 0x323 },
unicodeslot=0x1E32,
},
[0x1E33]={
@@ -52280,8 +53490,8 @@ characters.data={
description="LATIN SMALL LETTER K WITH DOT BELOW",
direction="l",
linebreak="al",
- shcode=0x006B,
- specials={ "char", 0x006B, 0x0323 },
+ shcode=0x6B,
+ specials={ "char", 0x6B, 0x323 },
uccode=0x1E32,
unicodeslot=0x1E33,
},
@@ -52292,8 +53502,8 @@ characters.data={
direction="l",
lccode=0x1E35,
linebreak="al",
- shcode=0x004B,
- specials={ "char", 0x004B, 0x0331 },
+ shcode=0x4B,
+ specials={ "char", 0x4B, 0x331 },
unicodeslot=0x1E34,
},
[0x1E35]={
@@ -52302,8 +53512,8 @@ characters.data={
description="LATIN SMALL LETTER K WITH LINE BELOW",
direction="l",
linebreak="al",
- shcode=0x006B,
- specials={ "char", 0x006B, 0x0331 },
+ shcode=0x6B,
+ specials={ "char", 0x6B, 0x331 },
uccode=0x1E34,
unicodeslot=0x1E35,
},
@@ -52314,8 +53524,8 @@ characters.data={
direction="l",
lccode=0x1E37,
linebreak="al",
- shcode=0x004C,
- specials={ "char", 0x004C, 0x0323 },
+ shcode=0x4C,
+ specials={ "char", 0x4C, 0x323 },
unicodeslot=0x1E36,
},
[0x1E37]={
@@ -52324,8 +53534,8 @@ characters.data={
description="LATIN SMALL LETTER L WITH DOT BELOW",
direction="l",
linebreak="al",
- shcode=0x006C,
- specials={ "char", 0x006C, 0x0323 },
+ shcode=0x6C,
+ specials={ "char", 0x6C, 0x323 },
uccode=0x1E36,
unicodeslot=0x1E37,
},
@@ -52336,8 +53546,8 @@ characters.data={
direction="l",
lccode=0x1E39,
linebreak="al",
- shcode=0x004C,
- specials={ "char", 0x1E36, 0x0304 },
+ shcode=0x4C,
+ specials={ "char", 0x1E36, 0x304 },
unicodeslot=0x1E38,
},
[0x1E39]={
@@ -52346,8 +53556,8 @@ characters.data={
description="LATIN SMALL LETTER L WITH DOT BELOW AND MACRON",
direction="l",
linebreak="al",
- shcode=0x006C,
- specials={ "char", 0x1E37, 0x0304 },
+ shcode=0x6C,
+ specials={ "char", 0x1E37, 0x304 },
uccode=0x1E38,
unicodeslot=0x1E39,
},
@@ -52358,8 +53568,8 @@ characters.data={
direction="l",
lccode=0x1E3B,
linebreak="al",
- shcode=0x004C,
- specials={ "char", 0x004C, 0x0331 },
+ shcode=0x4C,
+ specials={ "char", 0x4C, 0x331 },
unicodeslot=0x1E3A,
},
[0x1E3B]={
@@ -52368,8 +53578,8 @@ characters.data={
description="LATIN SMALL LETTER L WITH LINE BELOW",
direction="l",
linebreak="al",
- shcode=0x006C,
- specials={ "char", 0x006C, 0x0331 },
+ shcode=0x6C,
+ specials={ "char", 0x6C, 0x331 },
uccode=0x1E3A,
unicodeslot=0x1E3B,
},
@@ -52380,8 +53590,8 @@ characters.data={
direction="l",
lccode=0x1E3D,
linebreak="al",
- shcode=0x004C,
- specials={ "char", 0x004C, 0x032D },
+ shcode=0x4C,
+ specials={ "char", 0x4C, 0x32D },
unicodeslot=0x1E3C,
},
[0x1E3D]={
@@ -52390,8 +53600,8 @@ characters.data={
description="LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW",
direction="l",
linebreak="al",
- shcode=0x006C,
- specials={ "char", 0x006C, 0x032D },
+ shcode=0x6C,
+ specials={ "char", 0x6C, 0x32D },
uccode=0x1E3C,
unicodeslot=0x1E3D,
},
@@ -52402,8 +53612,8 @@ characters.data={
direction="l",
lccode=0x1E3F,
linebreak="al",
- shcode=0x004D,
- specials={ "char", 0x004D, 0x0301 },
+ shcode=0x4D,
+ specials={ "char", 0x4D, 0x301 },
unicodeslot=0x1E3E,
},
[0x1E3F]={
@@ -52412,8 +53622,8 @@ characters.data={
description="LATIN SMALL LETTER M WITH ACUTE",
direction="l",
linebreak="al",
- shcode=0x006D,
- specials={ "char", 0x006D, 0x0301 },
+ shcode=0x6D,
+ specials={ "char", 0x6D, 0x301 },
uccode=0x1E3E,
unicodeslot=0x1E3F,
},
@@ -52424,8 +53634,8 @@ characters.data={
direction="l",
lccode=0x1E41,
linebreak="al",
- shcode=0x004D,
- specials={ "char", 0x004D, 0x0307 },
+ shcode=0x4D,
+ specials={ "char", 0x4D, 0x307 },
unicodeslot=0x1E40,
},
[0x1E41]={
@@ -52434,8 +53644,8 @@ characters.data={
description="LATIN SMALL LETTER M WITH DOT ABOVE",
direction="l",
linebreak="al",
- shcode=0x006D,
- specials={ "char", 0x006D, 0x0307 },
+ shcode=0x6D,
+ specials={ "char", 0x6D, 0x307 },
uccode=0x1E40,
unicodeslot=0x1E41,
},
@@ -52446,8 +53656,8 @@ characters.data={
direction="l",
lccode=0x1E43,
linebreak="al",
- shcode=0x004D,
- specials={ "char", 0x004D, 0x0323 },
+ shcode=0x4D,
+ specials={ "char", 0x4D, 0x323 },
unicodeslot=0x1E42,
},
[0x1E43]={
@@ -52456,8 +53666,8 @@ characters.data={
description="LATIN SMALL LETTER M WITH DOT BELOW",
direction="l",
linebreak="al",
- shcode=0x006D,
- specials={ "char", 0x006D, 0x0323 },
+ shcode=0x6D,
+ specials={ "char", 0x6D, 0x323 },
uccode=0x1E42,
unicodeslot=0x1E43,
},
@@ -52468,8 +53678,8 @@ characters.data={
direction="l",
lccode=0x1E45,
linebreak="al",
- shcode=0x004E,
- specials={ "char", 0x004E, 0x0307 },
+ shcode=0x4E,
+ specials={ "char", 0x4E, 0x307 },
unicodeslot=0x1E44,
},
[0x1E45]={
@@ -52478,8 +53688,8 @@ characters.data={
description="LATIN SMALL LETTER N WITH DOT ABOVE",
direction="l",
linebreak="al",
- shcode=0x006E,
- specials={ "char", 0x006E, 0x0307 },
+ shcode=0x6E,
+ specials={ "char", 0x6E, 0x307 },
uccode=0x1E44,
unicodeslot=0x1E45,
},
@@ -52490,8 +53700,8 @@ characters.data={
direction="l",
lccode=0x1E47,
linebreak="al",
- shcode=0x004E,
- specials={ "char", 0x004E, 0x0323 },
+ shcode=0x4E,
+ specials={ "char", 0x4E, 0x323 },
unicodeslot=0x1E46,
},
[0x1E47]={
@@ -52500,8 +53710,8 @@ characters.data={
description="LATIN SMALL LETTER N WITH DOT BELOW",
direction="l",
linebreak="al",
- shcode=0x006E,
- specials={ "char", 0x006E, 0x0323 },
+ shcode=0x6E,
+ specials={ "char", 0x6E, 0x323 },
uccode=0x1E46,
unicodeslot=0x1E47,
},
@@ -52512,8 +53722,8 @@ characters.data={
direction="l",
lccode=0x1E49,
linebreak="al",
- shcode=0x004E,
- specials={ "char", 0x004E, 0x0331 },
+ shcode=0x4E,
+ specials={ "char", 0x4E, 0x331 },
unicodeslot=0x1E48,
},
[0x1E49]={
@@ -52522,8 +53732,8 @@ characters.data={
description="LATIN SMALL LETTER N WITH LINE BELOW",
direction="l",
linebreak="al",
- shcode=0x006E,
- specials={ "char", 0x006E, 0x0331 },
+ shcode=0x6E,
+ specials={ "char", 0x6E, 0x331 },
uccode=0x1E48,
unicodeslot=0x1E49,
},
@@ -52534,8 +53744,8 @@ characters.data={
direction="l",
lccode=0x1E4B,
linebreak="al",
- shcode=0x004E,
- specials={ "char", 0x004E, 0x032D },
+ shcode=0x4E,
+ specials={ "char", 0x4E, 0x32D },
unicodeslot=0x1E4A,
},
[0x1E4B]={
@@ -52544,8 +53754,8 @@ characters.data={
description="LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW",
direction="l",
linebreak="al",
- shcode=0x006E,
- specials={ "char", 0x006E, 0x032D },
+ shcode=0x6E,
+ specials={ "char", 0x6E, 0x32D },
uccode=0x1E4A,
unicodeslot=0x1E4B,
},
@@ -52556,8 +53766,8 @@ characters.data={
direction="l",
lccode=0x1E4D,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x00D5, 0x0301 },
+ shcode=0x4F,
+ specials={ "char", 0xD5, 0x301 },
unicodeslot=0x1E4C,
},
[0x1E4D]={
@@ -52566,8 +53776,8 @@ characters.data={
description="LATIN SMALL LETTER O WITH TILDE AND ACUTE",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x00F5, 0x0301 },
+ shcode=0x6F,
+ specials={ "char", 0xF5, 0x301 },
uccode=0x1E4C,
unicodeslot=0x1E4D,
},
@@ -52578,8 +53788,8 @@ characters.data={
direction="l",
lccode=0x1E4F,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x00D5, 0x0308 },
+ shcode=0x4F,
+ specials={ "char", 0xD5, 0x308 },
unicodeslot=0x1E4E,
},
[0x1E4F]={
@@ -52588,8 +53798,8 @@ characters.data={
description="LATIN SMALL LETTER O WITH TILDE AND DIAERESIS",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x00F5, 0x0308 },
+ shcode=0x6F,
+ specials={ "char", 0xF5, 0x308 },
uccode=0x1E4E,
unicodeslot=0x1E4F,
},
@@ -52600,8 +53810,8 @@ characters.data={
direction="l",
lccode=0x1E51,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x014C, 0x0300 },
+ shcode=0x4F,
+ specials={ "char", 0x14C, 0x300 },
unicodeslot=0x1E50,
},
[0x1E51]={
@@ -52610,8 +53820,8 @@ characters.data={
description="LATIN SMALL LETTER O WITH MACRON AND GRAVE",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x014D, 0x0300 },
+ shcode=0x6F,
+ specials={ "char", 0x14D, 0x300 },
uccode=0x1E50,
unicodeslot=0x1E51,
},
@@ -52622,8 +53832,8 @@ characters.data={
direction="l",
lccode=0x1E53,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x014C, 0x0301 },
+ shcode=0x4F,
+ specials={ "char", 0x14C, 0x301 },
unicodeslot=0x1E52,
},
[0x1E53]={
@@ -52632,8 +53842,8 @@ characters.data={
description="LATIN SMALL LETTER O WITH MACRON AND ACUTE",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x014D, 0x0301 },
+ shcode=0x6F,
+ specials={ "char", 0x14D, 0x301 },
uccode=0x1E52,
unicodeslot=0x1E53,
},
@@ -52644,8 +53854,8 @@ characters.data={
direction="l",
lccode=0x1E55,
linebreak="al",
- shcode=0x0050,
- specials={ "char", 0x0050, 0x0301 },
+ shcode=0x50,
+ specials={ "char", 0x50, 0x301 },
unicodeslot=0x1E54,
},
[0x1E55]={
@@ -52654,8 +53864,8 @@ characters.data={
description="LATIN SMALL LETTER P WITH ACUTE",
direction="l",
linebreak="al",
- shcode=0x0070,
- specials={ "char", 0x0070, 0x0301 },
+ shcode=0x70,
+ specials={ "char", 0x70, 0x301 },
uccode=0x1E54,
unicodeslot=0x1E55,
},
@@ -52666,8 +53876,8 @@ characters.data={
direction="l",
lccode=0x1E57,
linebreak="al",
- shcode=0x0050,
- specials={ "char", 0x0050, 0x0307 },
+ shcode=0x50,
+ specials={ "char", 0x50, 0x307 },
unicodeslot=0x1E56,
},
[0x1E57]={
@@ -52676,8 +53886,8 @@ characters.data={
description="LATIN SMALL LETTER P WITH DOT ABOVE",
direction="l",
linebreak="al",
- shcode=0x0070,
- specials={ "char", 0x0070, 0x0307 },
+ shcode=0x70,
+ specials={ "char", 0x70, 0x307 },
uccode=0x1E56,
unicodeslot=0x1E57,
},
@@ -52688,8 +53898,8 @@ characters.data={
direction="l",
lccode=0x1E59,
linebreak="al",
- shcode=0x0052,
- specials={ "char", 0x0052, 0x0307 },
+ shcode=0x52,
+ specials={ "char", 0x52, 0x307 },
unicodeslot=0x1E58,
},
[0x1E59]={
@@ -52698,8 +53908,8 @@ characters.data={
description="LATIN SMALL LETTER R WITH DOT ABOVE",
direction="l",
linebreak="al",
- shcode=0x0072,
- specials={ "char", 0x0072, 0x0307 },
+ shcode=0x72,
+ specials={ "char", 0x72, 0x307 },
uccode=0x1E58,
unicodeslot=0x1E59,
},
@@ -52710,8 +53920,8 @@ characters.data={
direction="l",
lccode=0x1E5B,
linebreak="al",
- shcode=0x0052,
- specials={ "char", 0x0052, 0x0323 },
+ shcode=0x52,
+ specials={ "char", 0x52, 0x323 },
unicodeslot=0x1E5A,
},
[0x1E5B]={
@@ -52720,8 +53930,8 @@ characters.data={
description="LATIN SMALL LETTER R WITH DOT BELOW",
direction="l",
linebreak="al",
- shcode=0x0072,
- specials={ "char", 0x0072, 0x0323 },
+ shcode=0x72,
+ specials={ "char", 0x72, 0x323 },
uccode=0x1E5A,
unicodeslot=0x1E5B,
},
@@ -52732,8 +53942,8 @@ characters.data={
direction="l",
lccode=0x1E5D,
linebreak="al",
- shcode=0x0052,
- specials={ "char", 0x1E5A, 0x0304 },
+ shcode=0x52,
+ specials={ "char", 0x1E5A, 0x304 },
unicodeslot=0x1E5C,
},
[0x1E5D]={
@@ -52742,8 +53952,8 @@ characters.data={
description="LATIN SMALL LETTER R WITH DOT BELOW AND MACRON",
direction="l",
linebreak="al",
- shcode=0x0072,
- specials={ "char", 0x1E5B, 0x0304 },
+ shcode=0x72,
+ specials={ "char", 0x1E5B, 0x304 },
uccode=0x1E5C,
unicodeslot=0x1E5D,
},
@@ -52754,8 +53964,8 @@ characters.data={
direction="l",
lccode=0x1E5F,
linebreak="al",
- shcode=0x0052,
- specials={ "char", 0x0052, 0x0331 },
+ shcode=0x52,
+ specials={ "char", 0x52, 0x331 },
unicodeslot=0x1E5E,
},
[0x1E5F]={
@@ -52764,8 +53974,8 @@ characters.data={
description="LATIN SMALL LETTER R WITH LINE BELOW",
direction="l",
linebreak="al",
- shcode=0x0072,
- specials={ "char", 0x0072, 0x0331 },
+ shcode=0x72,
+ specials={ "char", 0x72, 0x331 },
uccode=0x1E5E,
unicodeslot=0x1E5F,
},
@@ -52776,8 +53986,8 @@ characters.data={
direction="l",
lccode=0x1E61,
linebreak="al",
- shcode=0x0053,
- specials={ "char", 0x0053, 0x0307 },
+ shcode=0x53,
+ specials={ "char", 0x53, 0x307 },
unicodeslot=0x1E60,
},
[0x1E61]={
@@ -52786,8 +53996,8 @@ characters.data={
description="LATIN SMALL LETTER S WITH DOT ABOVE",
direction="l",
linebreak="al",
- shcode=0x0073,
- specials={ "char", 0x0073, 0x0307 },
+ shcode=0x73,
+ specials={ "char", 0x73, 0x307 },
uccode=0x1E60,
unicodeslot=0x1E61,
},
@@ -52798,8 +54008,8 @@ characters.data={
direction="l",
lccode=0x1E63,
linebreak="al",
- shcode=0x0053,
- specials={ "char", 0x0053, 0x0323 },
+ shcode=0x53,
+ specials={ "char", 0x53, 0x323 },
unicodeslot=0x1E62,
},
[0x1E63]={
@@ -52808,8 +54018,8 @@ characters.data={
description="LATIN SMALL LETTER S WITH DOT BELOW",
direction="l",
linebreak="al",
- shcode=0x0073,
- specials={ "char", 0x0073, 0x0323 },
+ shcode=0x73,
+ specials={ "char", 0x73, 0x323 },
uccode=0x1E62,
unicodeslot=0x1E63,
},
@@ -52820,8 +54030,8 @@ characters.data={
direction="l",
lccode=0x1E65,
linebreak="al",
- shcode=0x0053,
- specials={ "char", 0x015A, 0x0307 },
+ shcode=0x53,
+ specials={ "char", 0x15A, 0x307 },
unicodeslot=0x1E64,
},
[0x1E65]={
@@ -52830,8 +54040,8 @@ characters.data={
description="LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE",
direction="l",
linebreak="al",
- shcode=0x0073,
- specials={ "char", 0x015B, 0x0307 },
+ shcode=0x73,
+ specials={ "char", 0x15B, 0x307 },
uccode=0x1E64,
unicodeslot=0x1E65,
},
@@ -52842,8 +54052,8 @@ characters.data={
direction="l",
lccode=0x1E67,
linebreak="al",
- shcode=0x0053,
- specials={ "char", 0x0160, 0x0307 },
+ shcode=0x53,
+ specials={ "char", 0x160, 0x307 },
unicodeslot=0x1E66,
},
[0x1E67]={
@@ -52852,8 +54062,8 @@ characters.data={
description="LATIN SMALL LETTER S WITH CARON AND DOT ABOVE",
direction="l",
linebreak="al",
- shcode=0x0073,
- specials={ "char", 0x0161, 0x0307 },
+ shcode=0x73,
+ specials={ "char", 0x161, 0x307 },
uccode=0x1E66,
unicodeslot=0x1E67,
},
@@ -52864,8 +54074,8 @@ characters.data={
direction="l",
lccode=0x1E69,
linebreak="al",
- shcode=0x0053,
- specials={ "char", 0x1E62, 0x0307 },
+ shcode=0x53,
+ specials={ "char", 0x1E62, 0x307 },
unicodeslot=0x1E68,
},
[0x1E69]={
@@ -52874,8 +54084,8 @@ characters.data={
description="LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE",
direction="l",
linebreak="al",
- shcode=0x0073,
- specials={ "char", 0x1E63, 0x0307 },
+ shcode=0x73,
+ specials={ "char", 0x1E63, 0x307 },
uccode=0x1E68,
unicodeslot=0x1E69,
},
@@ -52886,8 +54096,8 @@ characters.data={
direction="l",
lccode=0x1E6B,
linebreak="al",
- shcode=0x0054,
- specials={ "char", 0x0054, 0x0307 },
+ shcode=0x54,
+ specials={ "char", 0x54, 0x307 },
unicodeslot=0x1E6A,
},
[0x1E6B]={
@@ -52896,8 +54106,8 @@ characters.data={
description="LATIN SMALL LETTER T WITH DOT ABOVE",
direction="l",
linebreak="al",
- shcode=0x0074,
- specials={ "char", 0x0074, 0x0307 },
+ shcode=0x74,
+ specials={ "char", 0x74, 0x307 },
uccode=0x1E6A,
unicodeslot=0x1E6B,
},
@@ -52908,8 +54118,8 @@ characters.data={
direction="l",
lccode=0x1E6D,
linebreak="al",
- shcode=0x0054,
- specials={ "char", 0x0054, 0x0323 },
+ shcode=0x54,
+ specials={ "char", 0x54, 0x323 },
unicodeslot=0x1E6C,
},
[0x1E6D]={
@@ -52918,8 +54128,8 @@ characters.data={
description="LATIN SMALL LETTER T WITH DOT BELOW",
direction="l",
linebreak="al",
- shcode=0x0074,
- specials={ "char", 0x0074, 0x0323 },
+ shcode=0x74,
+ specials={ "char", 0x74, 0x323 },
uccode=0x1E6C,
unicodeslot=0x1E6D,
},
@@ -52930,8 +54140,8 @@ characters.data={
direction="l",
lccode=0x1E6F,
linebreak="al",
- shcode=0x0054,
- specials={ "char", 0x0054, 0x0331 },
+ shcode=0x54,
+ specials={ "char", 0x54, 0x331 },
unicodeslot=0x1E6E,
},
[0x1E6F]={
@@ -52940,8 +54150,8 @@ characters.data={
description="LATIN SMALL LETTER T WITH LINE BELOW",
direction="l",
linebreak="al",
- shcode=0x0074,
- specials={ "char", 0x0074, 0x0331 },
+ shcode=0x74,
+ specials={ "char", 0x74, 0x331 },
uccode=0x1E6E,
unicodeslot=0x1E6F,
},
@@ -52952,8 +54162,8 @@ characters.data={
direction="l",
lccode=0x1E71,
linebreak="al",
- shcode=0x0054,
- specials={ "char", 0x0054, 0x032D },
+ shcode=0x54,
+ specials={ "char", 0x54, 0x32D },
unicodeslot=0x1E70,
},
[0x1E71]={
@@ -52962,8 +54172,8 @@ characters.data={
description="LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW",
direction="l",
linebreak="al",
- shcode=0x0074,
- specials={ "char", 0x0074, 0x032D },
+ shcode=0x74,
+ specials={ "char", 0x74, 0x32D },
uccode=0x1E70,
unicodeslot=0x1E71,
},
@@ -52974,8 +54184,8 @@ characters.data={
direction="l",
lccode=0x1E73,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x0055, 0x0324 },
+ shcode=0x55,
+ specials={ "char", 0x55, 0x324 },
unicodeslot=0x1E72,
},
[0x1E73]={
@@ -52984,8 +54194,8 @@ characters.data={
description="LATIN SMALL LETTER U WITH DIAERESIS BELOW",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x0075, 0x0324 },
+ shcode=0x75,
+ specials={ "char", 0x75, 0x324 },
uccode=0x1E72,
unicodeslot=0x1E73,
},
@@ -52996,8 +54206,8 @@ characters.data={
direction="l",
lccode=0x1E75,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x0055, 0x0330 },
+ shcode=0x55,
+ specials={ "char", 0x55, 0x330 },
unicodeslot=0x1E74,
},
[0x1E75]={
@@ -53006,8 +54216,8 @@ characters.data={
description="LATIN SMALL LETTER U WITH TILDE BELOW",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x0075, 0x0330 },
+ shcode=0x75,
+ specials={ "char", 0x75, 0x330 },
uccode=0x1E74,
unicodeslot=0x1E75,
},
@@ -53018,8 +54228,8 @@ characters.data={
direction="l",
lccode=0x1E77,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x0055, 0x032D },
+ shcode=0x55,
+ specials={ "char", 0x55, 0x32D },
unicodeslot=0x1E76,
},
[0x1E77]={
@@ -53028,8 +54238,8 @@ characters.data={
description="LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x0075, 0x032D },
+ shcode=0x75,
+ specials={ "char", 0x75, 0x32D },
uccode=0x1E76,
unicodeslot=0x1E77,
},
@@ -53040,8 +54250,8 @@ characters.data={
direction="l",
lccode=0x1E79,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x0168, 0x0301 },
+ shcode=0x55,
+ specials={ "char", 0x168, 0x301 },
unicodeslot=0x1E78,
},
[0x1E79]={
@@ -53050,8 +54260,8 @@ characters.data={
description="LATIN SMALL LETTER U WITH TILDE AND ACUTE",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x0169, 0x0301 },
+ shcode=0x75,
+ specials={ "char", 0x169, 0x301 },
uccode=0x1E78,
unicodeslot=0x1E79,
},
@@ -53062,8 +54272,8 @@ characters.data={
direction="l",
lccode=0x1E7B,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x016A, 0x0308 },
+ shcode=0x55,
+ specials={ "char", 0x16A, 0x308 },
unicodeslot=0x1E7A,
},
[0x1E7B]={
@@ -53072,8 +54282,8 @@ characters.data={
description="LATIN SMALL LETTER U WITH MACRON AND DIAERESIS",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x016B, 0x0308 },
+ shcode=0x75,
+ specials={ "char", 0x16B, 0x308 },
uccode=0x1E7A,
unicodeslot=0x1E7B,
},
@@ -53084,8 +54294,8 @@ characters.data={
direction="l",
lccode=0x1E7D,
linebreak="al",
- shcode=0x0056,
- specials={ "char", 0x0056, 0x0303 },
+ shcode=0x56,
+ specials={ "char", 0x56, 0x303 },
unicodeslot=0x1E7C,
},
[0x1E7D]={
@@ -53094,8 +54304,8 @@ characters.data={
description="LATIN SMALL LETTER V WITH TILDE",
direction="l",
linebreak="al",
- shcode=0x0076,
- specials={ "char", 0x0076, 0x0303 },
+ shcode=0x76,
+ specials={ "char", 0x76, 0x303 },
uccode=0x1E7C,
unicodeslot=0x1E7D,
},
@@ -53106,8 +54316,8 @@ characters.data={
direction="l",
lccode=0x1E7F,
linebreak="al",
- shcode=0x0056,
- specials={ "char", 0x0056, 0x0323 },
+ shcode=0x56,
+ specials={ "char", 0x56, 0x323 },
unicodeslot=0x1E7E,
},
[0x1E7F]={
@@ -53116,8 +54326,8 @@ characters.data={
description="LATIN SMALL LETTER V WITH DOT BELOW",
direction="l",
linebreak="al",
- shcode=0x0076,
- specials={ "char", 0x0076, 0x0323 },
+ shcode=0x76,
+ specials={ "char", 0x76, 0x323 },
uccode=0x1E7E,
unicodeslot=0x1E7F,
},
@@ -53128,8 +54338,8 @@ characters.data={
direction="l",
lccode=0x1E81,
linebreak="al",
- shcode=0x0057,
- specials={ "char", 0x0057, 0x0300 },
+ shcode=0x57,
+ specials={ "char", 0x57, 0x300 },
unicodeslot=0x1E80,
},
[0x1E81]={
@@ -53138,8 +54348,8 @@ characters.data={
description="LATIN SMALL LETTER W WITH GRAVE",
direction="l",
linebreak="al",
- shcode=0x0077,
- specials={ "char", 0x0077, 0x0300 },
+ shcode=0x77,
+ specials={ "char", 0x77, 0x300 },
uccode=0x1E80,
unicodeslot=0x1E81,
},
@@ -53150,8 +54360,8 @@ characters.data={
direction="l",
lccode=0x1E83,
linebreak="al",
- shcode=0x0057,
- specials={ "char", 0x0057, 0x0301 },
+ shcode=0x57,
+ specials={ "char", 0x57, 0x301 },
unicodeslot=0x1E82,
},
[0x1E83]={
@@ -53160,8 +54370,8 @@ characters.data={
description="LATIN SMALL LETTER W WITH ACUTE",
direction="l",
linebreak="al",
- shcode=0x0077,
- specials={ "char", 0x0077, 0x0301 },
+ shcode=0x77,
+ specials={ "char", 0x77, 0x301 },
uccode=0x1E82,
unicodeslot=0x1E83,
},
@@ -53172,8 +54382,8 @@ characters.data={
direction="l",
lccode=0x1E85,
linebreak="al",
- shcode=0x0057,
- specials={ "char", 0x0057, 0x0308 },
+ shcode=0x57,
+ specials={ "char", 0x57, 0x308 },
unicodeslot=0x1E84,
},
[0x1E85]={
@@ -53182,8 +54392,8 @@ characters.data={
description="LATIN SMALL LETTER W WITH DIAERESIS",
direction="l",
linebreak="al",
- shcode=0x0077,
- specials={ "char", 0x0077, 0x0308 },
+ shcode=0x77,
+ specials={ "char", 0x77, 0x308 },
uccode=0x1E84,
unicodeslot=0x1E85,
},
@@ -53194,8 +54404,8 @@ characters.data={
direction="l",
lccode=0x1E87,
linebreak="al",
- shcode=0x0057,
- specials={ "char", 0x0057, 0x0307 },
+ shcode=0x57,
+ specials={ "char", 0x57, 0x307 },
unicodeslot=0x1E86,
},
[0x1E87]={
@@ -53204,8 +54414,8 @@ characters.data={
description="LATIN SMALL LETTER W WITH DOT ABOVE",
direction="l",
linebreak="al",
- shcode=0x0077,
- specials={ "char", 0x0077, 0x0307 },
+ shcode=0x77,
+ specials={ "char", 0x77, 0x307 },
uccode=0x1E86,
unicodeslot=0x1E87,
},
@@ -53216,8 +54426,8 @@ characters.data={
direction="l",
lccode=0x1E89,
linebreak="al",
- shcode=0x0057,
- specials={ "char", 0x0057, 0x0323 },
+ shcode=0x57,
+ specials={ "char", 0x57, 0x323 },
unicodeslot=0x1E88,
},
[0x1E89]={
@@ -53226,8 +54436,8 @@ characters.data={
description="LATIN SMALL LETTER W WITH DOT BELOW",
direction="l",
linebreak="al",
- shcode=0x0077,
- specials={ "char", 0x0077, 0x0323 },
+ shcode=0x77,
+ specials={ "char", 0x77, 0x323 },
uccode=0x1E88,
unicodeslot=0x1E89,
},
@@ -53238,8 +54448,8 @@ characters.data={
direction="l",
lccode=0x1E8B,
linebreak="al",
- shcode=0x0058,
- specials={ "char", 0x0058, 0x0307 },
+ shcode=0x58,
+ specials={ "char", 0x58, 0x307 },
unicodeslot=0x1E8A,
},
[0x1E8B]={
@@ -53248,8 +54458,8 @@ characters.data={
description="LATIN SMALL LETTER X WITH DOT ABOVE",
direction="l",
linebreak="al",
- shcode=0x0078,
- specials={ "char", 0x0078, 0x0307 },
+ shcode=0x78,
+ specials={ "char", 0x78, 0x307 },
uccode=0x1E8A,
unicodeslot=0x1E8B,
},
@@ -53260,8 +54470,8 @@ characters.data={
direction="l",
lccode=0x1E8D,
linebreak="al",
- shcode=0x0058,
- specials={ "char", 0x0058, 0x0308 },
+ shcode=0x58,
+ specials={ "char", 0x58, 0x308 },
unicodeslot=0x1E8C,
},
[0x1E8D]={
@@ -53270,8 +54480,8 @@ characters.data={
description="LATIN SMALL LETTER X WITH DIAERESIS",
direction="l",
linebreak="al",
- shcode=0x0078,
- specials={ "char", 0x0078, 0x0308 },
+ shcode=0x78,
+ specials={ "char", 0x78, 0x308 },
uccode=0x1E8C,
unicodeslot=0x1E8D,
},
@@ -53282,8 +54492,8 @@ characters.data={
direction="l",
lccode=0x1E8F,
linebreak="al",
- shcode=0x0059,
- specials={ "char", 0x0059, 0x0307 },
+ shcode=0x59,
+ specials={ "char", 0x59, 0x307 },
unicodeslot=0x1E8E,
},
[0x1E8F]={
@@ -53292,8 +54502,8 @@ characters.data={
description="LATIN SMALL LETTER Y WITH DOT ABOVE",
direction="l",
linebreak="al",
- shcode=0x0079,
- specials={ "char", 0x0079, 0x0307 },
+ shcode=0x79,
+ specials={ "char", 0x79, 0x307 },
uccode=0x1E8E,
unicodeslot=0x1E8F,
},
@@ -53304,8 +54514,8 @@ characters.data={
direction="l",
lccode=0x1E91,
linebreak="al",
- shcode=0x005A,
- specials={ "char", 0x005A, 0x0302 },
+ shcode=0x5A,
+ specials={ "char", 0x5A, 0x302 },
unicodeslot=0x1E90,
},
[0x1E91]={
@@ -53314,8 +54524,8 @@ characters.data={
description="LATIN SMALL LETTER Z WITH CIRCUMFLEX",
direction="l",
linebreak="al",
- shcode=0x007A,
- specials={ "char", 0x007A, 0x0302 },
+ shcode=0x7A,
+ specials={ "char", 0x7A, 0x302 },
uccode=0x1E90,
unicodeslot=0x1E91,
},
@@ -53326,8 +54536,8 @@ characters.data={
direction="l",
lccode=0x1E93,
linebreak="al",
- shcode=0x005A,
- specials={ "char", 0x005A, 0x0323 },
+ shcode=0x5A,
+ specials={ "char", 0x5A, 0x323 },
unicodeslot=0x1E92,
},
[0x1E93]={
@@ -53336,8 +54546,8 @@ characters.data={
description="LATIN SMALL LETTER Z WITH DOT BELOW",
direction="l",
linebreak="al",
- shcode=0x007A,
- specials={ "char", 0x007A, 0x0323 },
+ shcode=0x7A,
+ specials={ "char", 0x7A, 0x323 },
uccode=0x1E92,
unicodeslot=0x1E93,
},
@@ -53348,8 +54558,8 @@ characters.data={
direction="l",
lccode=0x1E95,
linebreak="al",
- shcode=0x005A,
- specials={ "char", 0x005A, 0x0331 },
+ shcode=0x5A,
+ specials={ "char", 0x5A, 0x331 },
unicodeslot=0x1E94,
},
[0x1E95]={
@@ -53358,8 +54568,8 @@ characters.data={
description="LATIN SMALL LETTER Z WITH LINE BELOW",
direction="l",
linebreak="al",
- shcode=0x007A,
- specials={ "char", 0x007A, 0x0331 },
+ shcode=0x7A,
+ specials={ "char", 0x7A, 0x331 },
uccode=0x1E94,
unicodeslot=0x1E95,
},
@@ -53369,8 +54579,8 @@ characters.data={
description="LATIN SMALL LETTER H WITH LINE BELOW",
direction="l",
linebreak="al",
- shcode=0x0068,
- specials={ "char", 0x0068, 0x0331 },
+ shcode=0x68,
+ specials={ "char", 0x68, 0x331 },
unicodeslot=0x1E96,
},
[0x1E97]={
@@ -53379,8 +54589,8 @@ characters.data={
description="LATIN SMALL LETTER T WITH DIAERESIS",
direction="l",
linebreak="al",
- shcode=0x0074,
- specials={ "char", 0x0074, 0x0308 },
+ shcode=0x74,
+ specials={ "char", 0x74, 0x308 },
unicodeslot=0x1E97,
},
[0x1E98]={
@@ -53389,8 +54599,8 @@ characters.data={
description="LATIN SMALL LETTER W WITH RING ABOVE",
direction="l",
linebreak="al",
- shcode=0x0077,
- specials={ "char", 0x0077, 0x030A },
+ shcode=0x77,
+ specials={ "char", 0x77, 0x30A },
unicodeslot=0x1E98,
},
[0x1E99]={
@@ -53399,8 +54609,8 @@ characters.data={
description="LATIN SMALL LETTER Y WITH RING ABOVE",
direction="l",
linebreak="al",
- shcode=0x0079,
- specials={ "char", 0x0079, 0x030A },
+ shcode=0x79,
+ specials={ "char", 0x79, 0x30A },
unicodeslot=0x1E99,
},
[0x1E9A]={
@@ -53409,8 +54619,8 @@ characters.data={
description="LATIN SMALL LETTER A WITH RIGHT HALF RING",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "compat", 0x0061, 0x02BE },
+ shcode=0x61,
+ specials={ "compat", 0x61, 0x2BE },
unicodeslot=0x1E9A,
},
[0x1E9B]={
@@ -53419,7 +54629,7 @@ characters.data={
description="LATIN SMALL LETTER LONG S WITH DOT ABOVE",
direction="l",
linebreak="al",
- specials={ "char", 0x017F, 0x0307 },
+ specials={ "char", 0x17F, 0x307 },
uccode=0x1E60,
unicodeslot=0x1E9B,
},
@@ -53459,8 +54669,8 @@ characters.data={
direction="l",
lccode=0x1EA1,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x0041, 0x0323 },
+ shcode=0x41,
+ specials={ "char", 0x41, 0x323 },
unicodeslot=0x1EA0,
},
[0x1EA1]={
@@ -53470,8 +54680,8 @@ characters.data={
description="LATIN SMALL LETTER A WITH DOT BELOW",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x0061, 0x0323 },
+ shcode=0x61,
+ specials={ "char", 0x61, 0x323 },
uccode=0x1EA0,
unicodeslot=0x1EA1,
},
@@ -53483,8 +54693,8 @@ characters.data={
direction="l",
lccode=0x1EA3,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x0041, 0x0309 },
+ shcode=0x41,
+ specials={ "char", 0x41, 0x309 },
unicodeslot=0x1EA2,
},
[0x1EA3]={
@@ -53494,8 +54704,8 @@ characters.data={
description="LATIN SMALL LETTER A WITH HOOK ABOVE",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x0061, 0x0309 },
+ shcode=0x61,
+ specials={ "char", 0x61, 0x309 },
uccode=0x1EA2,
unicodeslot=0x1EA3,
},
@@ -53507,8 +54717,8 @@ characters.data={
direction="l",
lccode=0x1EA5,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x00C2, 0x0301 },
+ shcode=0x41,
+ specials={ "char", 0xC2, 0x301 },
unicodeslot=0x1EA4,
},
[0x1EA5]={
@@ -53518,8 +54728,8 @@ characters.data={
description="LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x00E2, 0x0301 },
+ shcode=0x61,
+ specials={ "char", 0xE2, 0x301 },
uccode=0x1EA4,
unicodeslot=0x1EA5,
},
@@ -53531,8 +54741,8 @@ characters.data={
direction="l",
lccode=0x1EA7,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x00C2, 0x0300 },
+ shcode=0x41,
+ specials={ "char", 0xC2, 0x300 },
unicodeslot=0x1EA6,
},
[0x1EA7]={
@@ -53542,8 +54752,8 @@ characters.data={
description="LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x00E2, 0x0300 },
+ shcode=0x61,
+ specials={ "char", 0xE2, 0x300 },
uccode=0x1EA6,
unicodeslot=0x1EA7,
},
@@ -53555,8 +54765,8 @@ characters.data={
direction="l",
lccode=0x1EA9,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x00C2, 0x0309 },
+ shcode=0x41,
+ specials={ "char", 0xC2, 0x309 },
unicodeslot=0x1EA8,
},
[0x1EA9]={
@@ -53566,8 +54776,8 @@ characters.data={
description="LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x00E2, 0x0309 },
+ shcode=0x61,
+ specials={ "char", 0xE2, 0x309 },
uccode=0x1EA8,
unicodeslot=0x1EA9,
},
@@ -53579,8 +54789,8 @@ characters.data={
direction="l",
lccode=0x1EAB,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x00C2, 0x0303 },
+ shcode=0x41,
+ specials={ "char", 0xC2, 0x303 },
unicodeslot=0x1EAA,
},
[0x1EAB]={
@@ -53590,8 +54800,8 @@ characters.data={
description="LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x00E2, 0x0303 },
+ shcode=0x61,
+ specials={ "char", 0xE2, 0x303 },
uccode=0x1EAA,
unicodeslot=0x1EAB,
},
@@ -53603,8 +54813,8 @@ characters.data={
direction="l",
lccode=0x1EAD,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x1EA0, 0x0302 },
+ shcode=0x41,
+ specials={ "char", 0x1EA0, 0x302 },
unicodeslot=0x1EAC,
},
[0x1EAD]={
@@ -53614,8 +54824,8 @@ characters.data={
description="LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x1EA1, 0x0302 },
+ shcode=0x61,
+ specials={ "char", 0x1EA1, 0x302 },
uccode=0x1EAC,
unicodeslot=0x1EAD,
},
@@ -53627,8 +54837,8 @@ characters.data={
direction="l",
lccode=0x1EAF,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x0102, 0x0301 },
+ shcode=0x41,
+ specials={ "char", 0x102, 0x301 },
unicodeslot=0x1EAE,
},
[0x1EAF]={
@@ -53638,8 +54848,8 @@ characters.data={
description="LATIN SMALL LETTER A WITH BREVE AND ACUTE",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x0103, 0x0301 },
+ shcode=0x61,
+ specials={ "char", 0x103, 0x301 },
uccode=0x1EAE,
unicodeslot=0x1EAF,
},
@@ -53651,8 +54861,8 @@ characters.data={
direction="l",
lccode=0x1EB1,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x0102, 0x0300 },
+ shcode=0x41,
+ specials={ "char", 0x102, 0x300 },
unicodeslot=0x1EB0,
},
[0x1EB1]={
@@ -53662,8 +54872,8 @@ characters.data={
description="LATIN SMALL LETTER A WITH BREVE AND GRAVE",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x0103, 0x0300 },
+ shcode=0x61,
+ specials={ "char", 0x103, 0x300 },
uccode=0x1EB0,
unicodeslot=0x1EB1,
},
@@ -53675,8 +54885,8 @@ characters.data={
direction="l",
lccode=0x1EB3,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x0102, 0x0309 },
+ shcode=0x41,
+ specials={ "char", 0x102, 0x309 },
unicodeslot=0x1EB2,
},
[0x1EB3]={
@@ -53686,8 +54896,8 @@ characters.data={
description="LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x0103, 0x0309 },
+ shcode=0x61,
+ specials={ "char", 0x103, 0x309 },
uccode=0x1EB2,
unicodeslot=0x1EB3,
},
@@ -53699,8 +54909,8 @@ characters.data={
direction="l",
lccode=0x1EB5,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x0102, 0x0303 },
+ shcode=0x41,
+ specials={ "char", 0x102, 0x303 },
unicodeslot=0x1EB4,
},
[0x1EB5]={
@@ -53710,8 +54920,8 @@ characters.data={
description="LATIN SMALL LETTER A WITH BREVE AND TILDE",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x0103, 0x0303 },
+ shcode=0x61,
+ specials={ "char", 0x103, 0x303 },
uccode=0x1EB4,
unicodeslot=0x1EB5,
},
@@ -53723,8 +54933,8 @@ characters.data={
direction="l",
lccode=0x1EB7,
linebreak="al",
- shcode=0x0041,
- specials={ "char", 0x1EA0, 0x0306 },
+ shcode=0x41,
+ specials={ "char", 0x1EA0, 0x306 },
unicodeslot=0x1EB6,
},
[0x1EB7]={
@@ -53734,8 +54944,8 @@ characters.data={
description="LATIN SMALL LETTER A WITH BREVE AND DOT BELOW",
direction="l",
linebreak="al",
- shcode=0x0061,
- specials={ "char", 0x1EA1, 0x0306 },
+ shcode=0x61,
+ specials={ "char", 0x1EA1, 0x306 },
uccode=0x1EB6,
unicodeslot=0x1EB7,
},
@@ -53747,8 +54957,8 @@ characters.data={
direction="l",
lccode=0x1EB9,
linebreak="al",
- shcode=0x0045,
- specials={ "char", 0x0045, 0x0323 },
+ shcode=0x45,
+ specials={ "char", 0x45, 0x323 },
unicodeslot=0x1EB8,
},
[0x1EB9]={
@@ -53758,8 +54968,8 @@ characters.data={
description="LATIN SMALL LETTER E WITH DOT BELOW",
direction="l",
linebreak="al",
- shcode=0x0065,
- specials={ "char", 0x0065, 0x0323 },
+ shcode=0x65,
+ specials={ "char", 0x65, 0x323 },
uccode=0x1EB8,
unicodeslot=0x1EB9,
},
@@ -53771,8 +54981,8 @@ characters.data={
direction="l",
lccode=0x1EBB,
linebreak="al",
- shcode=0x0045,
- specials={ "char", 0x0045, 0x0309 },
+ shcode=0x45,
+ specials={ "char", 0x45, 0x309 },
unicodeslot=0x1EBA,
},
[0x1EBB]={
@@ -53782,8 +54992,8 @@ characters.data={
description="LATIN SMALL LETTER E WITH HOOK ABOVE",
direction="l",
linebreak="al",
- shcode=0x0065,
- specials={ "char", 0x0065, 0x0309 },
+ shcode=0x65,
+ specials={ "char", 0x65, 0x309 },
uccode=0x1EBA,
unicodeslot=0x1EBB,
},
@@ -53795,8 +55005,8 @@ characters.data={
direction="l",
lccode=0x1EBD,
linebreak="al",
- shcode=0x0045,
- specials={ "char", 0x0045, 0x0303 },
+ shcode=0x45,
+ specials={ "char", 0x45, 0x303 },
unicodeslot=0x1EBC,
},
[0x1EBD]={
@@ -53806,8 +55016,8 @@ characters.data={
description="LATIN SMALL LETTER E WITH TILDE",
direction="l",
linebreak="al",
- shcode=0x0065,
- specials={ "char", 0x0065, 0x0303 },
+ shcode=0x65,
+ specials={ "char", 0x65, 0x303 },
uccode=0x1EBC,
unicodeslot=0x1EBD,
},
@@ -53819,8 +55029,8 @@ characters.data={
direction="l",
lccode=0x1EBF,
linebreak="al",
- shcode=0x0045,
- specials={ "char", 0x00CA, 0x0301 },
+ shcode=0x45,
+ specials={ "char", 0xCA, 0x301 },
unicodeslot=0x1EBE,
},
[0x1EBF]={
@@ -53830,8 +55040,8 @@ characters.data={
description="LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE",
direction="l",
linebreak="al",
- shcode=0x0065,
- specials={ "char", 0x00EA, 0x0301 },
+ shcode=0x65,
+ specials={ "char", 0xEA, 0x301 },
uccode=0x1EBE,
unicodeslot=0x1EBF,
},
@@ -53843,8 +55053,8 @@ characters.data={
direction="l",
lccode=0x1EC1,
linebreak="al",
- shcode=0x0045,
- specials={ "char", 0x00CA, 0x0300 },
+ shcode=0x45,
+ specials={ "char", 0xCA, 0x300 },
unicodeslot=0x1EC0,
},
[0x1EC1]={
@@ -53854,8 +55064,8 @@ characters.data={
description="LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE",
direction="l",
linebreak="al",
- shcode=0x0065,
- specials={ "char", 0x00EA, 0x0300 },
+ shcode=0x65,
+ specials={ "char", 0xEA, 0x300 },
uccode=0x1EC0,
unicodeslot=0x1EC1,
},
@@ -53867,8 +55077,8 @@ characters.data={
direction="l",
lccode=0x1EC3,
linebreak="al",
- shcode=0x0045,
- specials={ "char", 0x00CA, 0x0309 },
+ shcode=0x45,
+ specials={ "char", 0xCA, 0x309 },
unicodeslot=0x1EC2,
},
[0x1EC3]={
@@ -53878,8 +55088,8 @@ characters.data={
description="LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE",
direction="l",
linebreak="al",
- shcode=0x0065,
- specials={ "char", 0x00EA, 0x0309 },
+ shcode=0x65,
+ specials={ "char", 0xEA, 0x309 },
uccode=0x1EC2,
unicodeslot=0x1EC3,
},
@@ -53891,8 +55101,8 @@ characters.data={
direction="l",
lccode=0x1EC5,
linebreak="al",
- shcode=0x0045,
- specials={ "char", 0x00CA, 0x0303 },
+ shcode=0x45,
+ specials={ "char", 0xCA, 0x303 },
unicodeslot=0x1EC4,
},
[0x1EC5]={
@@ -53902,8 +55112,8 @@ characters.data={
description="LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE",
direction="l",
linebreak="al",
- shcode=0x0065,
- specials={ "char", 0x00EA, 0x0303 },
+ shcode=0x65,
+ specials={ "char", 0xEA, 0x303 },
uccode=0x1EC4,
unicodeslot=0x1EC5,
},
@@ -53915,8 +55125,8 @@ characters.data={
direction="l",
lccode=0x1EC7,
linebreak="al",
- shcode=0x0045,
- specials={ "char", 0x1EB8, 0x0302 },
+ shcode=0x45,
+ specials={ "char", 0x1EB8, 0x302 },
unicodeslot=0x1EC6,
},
[0x1EC7]={
@@ -53926,8 +55136,8 @@ characters.data={
description="LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW",
direction="l",
linebreak="al",
- shcode=0x0065,
- specials={ "char", 0x1EB9, 0x0302 },
+ shcode=0x65,
+ specials={ "char", 0x1EB9, 0x302 },
uccode=0x1EC6,
unicodeslot=0x1EC7,
},
@@ -53939,8 +55149,8 @@ characters.data={
direction="l",
lccode=0x1EC9,
linebreak="al",
- shcode=0x0049,
- specials={ "char", 0x0049, 0x0309 },
+ shcode=0x49,
+ specials={ "char", 0x49, 0x309 },
unicodeslot=0x1EC8,
},
[0x1EC9]={
@@ -53950,8 +55160,8 @@ characters.data={
description="LATIN SMALL LETTER I WITH HOOK ABOVE",
direction="l",
linebreak="al",
- shcode=0x0069,
- specials={ "char", 0x0069, 0x0309 },
+ shcode=0x69,
+ specials={ "char", 0x69, 0x309 },
uccode=0x1EC8,
unicodeslot=0x1EC9,
},
@@ -53963,8 +55173,8 @@ characters.data={
direction="l",
lccode=0x1ECB,
linebreak="al",
- shcode=0x0049,
- specials={ "char", 0x0049, 0x0323 },
+ shcode=0x49,
+ specials={ "char", 0x49, 0x323 },
unicodeslot=0x1ECA,
},
[0x1ECB]={
@@ -53974,8 +55184,8 @@ characters.data={
description="LATIN SMALL LETTER I WITH DOT BELOW",
direction="l",
linebreak="al",
- shcode=0x0069,
- specials={ "char", 0x0069, 0x0323 },
+ shcode=0x69,
+ specials={ "char", 0x69, 0x323 },
uccode=0x1ECA,
unicodeslot=0x1ECB,
},
@@ -53987,8 +55197,8 @@ characters.data={
direction="l",
lccode=0x1ECD,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x004F, 0x0323 },
+ shcode=0x4F,
+ specials={ "char", 0x4F, 0x323 },
unicodeslot=0x1ECC,
},
[0x1ECD]={
@@ -53998,8 +55208,8 @@ characters.data={
description="LATIN SMALL LETTER O WITH DOT BELOW",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x006F, 0x0323 },
+ shcode=0x6F,
+ specials={ "char", 0x6F, 0x323 },
uccode=0x1ECC,
unicodeslot=0x1ECD,
},
@@ -54011,8 +55221,8 @@ characters.data={
direction="l",
lccode=0x1ECF,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x004F, 0x0309 },
+ shcode=0x4F,
+ specials={ "char", 0x4F, 0x309 },
unicodeslot=0x1ECE,
},
[0x1ECF]={
@@ -54022,8 +55232,8 @@ characters.data={
description="LATIN SMALL LETTER O WITH HOOK ABOVE",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x006F, 0x0309 },
+ shcode=0x6F,
+ specials={ "char", 0x6F, 0x309 },
uccode=0x1ECE,
unicodeslot=0x1ECF,
},
@@ -54035,8 +55245,8 @@ characters.data={
direction="l",
lccode=0x1ED1,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x00D4, 0x0301 },
+ shcode=0x4F,
+ specials={ "char", 0xD4, 0x301 },
unicodeslot=0x1ED0,
},
[0x1ED1]={
@@ -54046,8 +55256,8 @@ characters.data={
description="LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x00F4, 0x0301 },
+ shcode=0x6F,
+ specials={ "char", 0xF4, 0x301 },
uccode=0x1ED0,
unicodeslot=0x1ED1,
},
@@ -54059,8 +55269,8 @@ characters.data={
direction="l",
lccode=0x1ED3,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x00D4, 0x0300 },
+ shcode=0x4F,
+ specials={ "char", 0xD4, 0x300 },
unicodeslot=0x1ED2,
},
[0x1ED3]={
@@ -54070,8 +55280,8 @@ characters.data={
description="LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x00F4, 0x0300 },
+ shcode=0x6F,
+ specials={ "char", 0xF4, 0x300 },
uccode=0x1ED2,
unicodeslot=0x1ED3,
},
@@ -54083,8 +55293,8 @@ characters.data={
direction="l",
lccode=0x1ED5,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x00D4, 0x0309 },
+ shcode=0x4F,
+ specials={ "char", 0xD4, 0x309 },
unicodeslot=0x1ED4,
},
[0x1ED5]={
@@ -54094,8 +55304,8 @@ characters.data={
description="LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x00F4, 0x0309 },
+ shcode=0x6F,
+ specials={ "char", 0xF4, 0x309 },
uccode=0x1ED4,
unicodeslot=0x1ED5,
},
@@ -54107,8 +55317,8 @@ characters.data={
direction="l",
lccode=0x1ED7,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x00D4, 0x0303 },
+ shcode=0x4F,
+ specials={ "char", 0xD4, 0x303 },
unicodeslot=0x1ED6,
},
[0x1ED7]={
@@ -54118,8 +55328,8 @@ characters.data={
description="LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x00F4, 0x0303 },
+ shcode=0x6F,
+ specials={ "char", 0xF4, 0x303 },
uccode=0x1ED6,
unicodeslot=0x1ED7,
},
@@ -54131,8 +55341,8 @@ characters.data={
direction="l",
lccode=0x1ED9,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x1ECC, 0x0302 },
+ shcode=0x4F,
+ specials={ "char", 0x1ECC, 0x302 },
unicodeslot=0x1ED8,
},
[0x1ED9]={
@@ -54142,8 +55352,8 @@ characters.data={
description="LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x1ECD, 0x0302 },
+ shcode=0x6F,
+ specials={ "char", 0x1ECD, 0x302 },
uccode=0x1ED8,
unicodeslot=0x1ED9,
},
@@ -54155,8 +55365,8 @@ characters.data={
direction="l",
lccode=0x1EDB,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x01A0, 0x0301 },
+ shcode=0x4F,
+ specials={ "char", 0x1A0, 0x301 },
unicodeslot=0x1EDA,
},
[0x1EDB]={
@@ -54166,8 +55376,8 @@ characters.data={
description="LATIN SMALL LETTER O WITH HORN AND ACUTE",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x01A1, 0x0301 },
+ shcode=0x6F,
+ specials={ "char", 0x1A1, 0x301 },
uccode=0x1EDA,
unicodeslot=0x1EDB,
},
@@ -54179,8 +55389,8 @@ characters.data={
direction="l",
lccode=0x1EDD,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x01A0, 0x0300 },
+ shcode=0x4F,
+ specials={ "char", 0x1A0, 0x300 },
unicodeslot=0x1EDC,
},
[0x1EDD]={
@@ -54190,8 +55400,8 @@ characters.data={
description="LATIN SMALL LETTER O WITH HORN AND GRAVE",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x01A1, 0x0300 },
+ shcode=0x6F,
+ specials={ "char", 0x1A1, 0x300 },
uccode=0x1EDC,
unicodeslot=0x1EDD,
},
@@ -54203,8 +55413,8 @@ characters.data={
direction="l",
lccode=0x1EDF,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x01A0, 0x0309 },
+ shcode=0x4F,
+ specials={ "char", 0x1A0, 0x309 },
unicodeslot=0x1EDE,
},
[0x1EDF]={
@@ -54214,8 +55424,8 @@ characters.data={
description="LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x01A1, 0x0309 },
+ shcode=0x6F,
+ specials={ "char", 0x1A1, 0x309 },
uccode=0x1EDE,
unicodeslot=0x1EDF,
},
@@ -54227,8 +55437,8 @@ characters.data={
direction="l",
lccode=0x1EE1,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x01A0, 0x0303 },
+ shcode=0x4F,
+ specials={ "char", 0x1A0, 0x303 },
unicodeslot=0x1EE0,
},
[0x1EE1]={
@@ -54238,8 +55448,8 @@ characters.data={
description="LATIN SMALL LETTER O WITH HORN AND TILDE",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x01A1, 0x0303 },
+ shcode=0x6F,
+ specials={ "char", 0x1A1, 0x303 },
uccode=0x1EE0,
unicodeslot=0x1EE1,
},
@@ -54251,8 +55461,8 @@ characters.data={
direction="l",
lccode=0x1EE3,
linebreak="al",
- shcode=0x004F,
- specials={ "char", 0x01A0, 0x0323 },
+ shcode=0x4F,
+ specials={ "char", 0x1A0, 0x323 },
unicodeslot=0x1EE2,
},
[0x1EE3]={
@@ -54262,8 +55472,8 @@ characters.data={
description="LATIN SMALL LETTER O WITH HORN AND DOT BELOW",
direction="l",
linebreak="al",
- shcode=0x006F,
- specials={ "char", 0x01A1, 0x0323 },
+ shcode=0x6F,
+ specials={ "char", 0x1A1, 0x323 },
uccode=0x1EE2,
unicodeslot=0x1EE3,
},
@@ -54275,8 +55485,8 @@ characters.data={
direction="l",
lccode=0x1EE5,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x0055, 0x0323 },
+ shcode=0x55,
+ specials={ "char", 0x55, 0x323 },
unicodeslot=0x1EE4,
},
[0x1EE5]={
@@ -54286,8 +55496,8 @@ characters.data={
description="LATIN SMALL LETTER U WITH DOT BELOW",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x0075, 0x0323 },
+ shcode=0x75,
+ specials={ "char", 0x75, 0x323 },
uccode=0x1EE4,
unicodeslot=0x1EE5,
},
@@ -54299,8 +55509,8 @@ characters.data={
direction="l",
lccode=0x1EE7,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x0055, 0x0309 },
+ shcode=0x55,
+ specials={ "char", 0x55, 0x309 },
unicodeslot=0x1EE6,
},
[0x1EE7]={
@@ -54310,8 +55520,8 @@ characters.data={
description="LATIN SMALL LETTER U WITH HOOK ABOVE",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x0075, 0x0309 },
+ shcode=0x75,
+ specials={ "char", 0x75, 0x309 },
uccode=0x1EE6,
unicodeslot=0x1EE7,
},
@@ -54323,8 +55533,8 @@ characters.data={
direction="l",
lccode=0x1EE9,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x01AF, 0x0301 },
+ shcode=0x55,
+ specials={ "char", 0x1AF, 0x301 },
unicodeslot=0x1EE8,
},
[0x1EE9]={
@@ -54334,8 +55544,8 @@ characters.data={
description="LATIN SMALL LETTER U WITH HORN AND ACUTE",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x01B0, 0x0301 },
+ shcode=0x75,
+ specials={ "char", 0x1B0, 0x301 },
uccode=0x1EE8,
unicodeslot=0x1EE9,
},
@@ -54347,8 +55557,8 @@ characters.data={
direction="l",
lccode=0x1EEB,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x01AF, 0x0300 },
+ shcode=0x55,
+ specials={ "char", 0x1AF, 0x300 },
unicodeslot=0x1EEA,
},
[0x1EEB]={
@@ -54358,8 +55568,8 @@ characters.data={
description="LATIN SMALL LETTER U WITH HORN AND GRAVE",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x01B0, 0x0300 },
+ shcode=0x75,
+ specials={ "char", 0x1B0, 0x300 },
uccode=0x1EEA,
unicodeslot=0x1EEB,
},
@@ -54371,8 +55581,8 @@ characters.data={
direction="l",
lccode=0x1EED,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x01AF, 0x0309 },
+ shcode=0x55,
+ specials={ "char", 0x1AF, 0x309 },
unicodeslot=0x1EEC,
},
[0x1EED]={
@@ -54382,8 +55592,8 @@ characters.data={
description="LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x01B0, 0x0309 },
+ shcode=0x75,
+ specials={ "char", 0x1B0, 0x309 },
uccode=0x1EEC,
unicodeslot=0x1EED,
},
@@ -54395,8 +55605,8 @@ characters.data={
direction="l",
lccode=0x1EEF,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x01AF, 0x0303 },
+ shcode=0x55,
+ specials={ "char", 0x1AF, 0x303 },
unicodeslot=0x1EEE,
},
[0x1EEF]={
@@ -54406,8 +55616,8 @@ characters.data={
description="LATIN SMALL LETTER U WITH HORN AND TILDE",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x01B0, 0x0303 },
+ shcode=0x75,
+ specials={ "char", 0x1B0, 0x303 },
uccode=0x1EEE,
unicodeslot=0x1EEF,
},
@@ -54419,8 +55629,8 @@ characters.data={
direction="l",
lccode=0x1EF1,
linebreak="al",
- shcode=0x0055,
- specials={ "char", 0x01AF, 0x0323 },
+ shcode=0x55,
+ specials={ "char", 0x1AF, 0x323 },
unicodeslot=0x1EF0,
},
[0x1EF1]={
@@ -54430,8 +55640,8 @@ characters.data={
description="LATIN SMALL LETTER U WITH HORN AND DOT BELOW",
direction="l",
linebreak="al",
- shcode=0x0075,
- specials={ "char", 0x01B0, 0x0323 },
+ shcode=0x75,
+ specials={ "char", 0x1B0, 0x323 },
uccode=0x1EF0,
unicodeslot=0x1EF1,
},
@@ -54443,8 +55653,8 @@ characters.data={
direction="l",
lccode=0x1EF3,
linebreak="al",
- shcode=0x0059,
- specials={ "char", 0x0059, 0x0300 },
+ shcode=0x59,
+ specials={ "char", 0x59, 0x300 },
unicodeslot=0x1EF2,
},
[0x1EF3]={
@@ -54454,8 +55664,8 @@ characters.data={
description="LATIN SMALL LETTER Y WITH GRAVE",
direction="l",
linebreak="al",
- shcode=0x0079,
- specials={ "char", 0x0079, 0x0300 },
+ shcode=0x79,
+ specials={ "char", 0x79, 0x300 },
uccode=0x1EF2,
unicodeslot=0x1EF3,
},
@@ -54467,8 +55677,8 @@ characters.data={
direction="l",
lccode=0x1EF5,
linebreak="al",
- shcode=0x0059,
- specials={ "char", 0x0059, 0x0323 },
+ shcode=0x59,
+ specials={ "char", 0x59, 0x323 },
unicodeslot=0x1EF4,
},
[0x1EF5]={
@@ -54478,8 +55688,8 @@ characters.data={
description="LATIN SMALL LETTER Y WITH DOT BELOW",
direction="l",
linebreak="al",
- shcode=0x0079,
- specials={ "char", 0x0079, 0x0323 },
+ shcode=0x79,
+ specials={ "char", 0x79, 0x323 },
uccode=0x1EF4,
unicodeslot=0x1EF5,
},
@@ -54491,8 +55701,8 @@ characters.data={
direction="l",
lccode=0x1EF7,
linebreak="al",
- shcode=0x0059,
- specials={ "char", 0x0059, 0x0309 },
+ shcode=0x59,
+ specials={ "char", 0x59, 0x309 },
unicodeslot=0x1EF6,
},
[0x1EF7]={
@@ -54502,8 +55712,8 @@ characters.data={
description="LATIN SMALL LETTER Y WITH HOOK ABOVE",
direction="l",
linebreak="al",
- shcode=0x0079,
- specials={ "char", 0x0079, 0x0309 },
+ shcode=0x79,
+ specials={ "char", 0x79, 0x309 },
uccode=0x1EF6,
unicodeslot=0x1EF7,
},
@@ -54515,8 +55725,8 @@ characters.data={
direction="l",
lccode=0x1EF9,
linebreak="al",
- shcode=0x0059,
- specials={ "char", 0x0059, 0x0303 },
+ shcode=0x59,
+ specials={ "char", 0x59, 0x303 },
unicodeslot=0x1EF8,
},
[0x1EF9]={
@@ -54526,8 +55736,8 @@ characters.data={
description="LATIN SMALL LETTER Y WITH TILDE",
direction="l",
linebreak="al",
- shcode=0x0079,
- specials={ "char", 0x0079, 0x0303 },
+ shcode=0x79,
+ specials={ "char", 0x79, 0x303 },
uccode=0x1EF8,
unicodeslot=0x1EF9,
},
@@ -54579,8 +55789,8 @@ characters.data={
description="GREEK SMALL LETTER ALPHA WITH PSILI",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x03B1, 0x0313 },
+ shcode=0x3B1,
+ specials={ "char", 0x3B1, 0x313 },
uccode=0x1F08,
unicodeslot=0x1F00,
},
@@ -54590,8 +55800,8 @@ characters.data={
description="GREEK SMALL LETTER ALPHA WITH DASIA",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x03B1, 0x0314 },
+ shcode=0x3B1,
+ specials={ "char", 0x3B1, 0x314 },
uccode=0x1F09,
unicodeslot=0x1F01,
},
@@ -54601,8 +55811,8 @@ characters.data={
description="GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x1F00, 0x0300 },
+ shcode=0x3B1,
+ specials={ "char", 0x1F00, 0x300 },
uccode=0x1F0A,
unicodeslot=0x1F02,
},
@@ -54612,8 +55822,8 @@ characters.data={
description="GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x1F01, 0x0300 },
+ shcode=0x3B1,
+ specials={ "char", 0x1F01, 0x300 },
uccode=0x1F0B,
unicodeslot=0x1F03,
},
@@ -54623,8 +55833,8 @@ characters.data={
description="GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x1F00, 0x0301 },
+ shcode=0x3B1,
+ specials={ "char", 0x1F00, 0x301 },
uccode=0x1F0C,
unicodeslot=0x1F04,
},
@@ -54634,8 +55844,8 @@ characters.data={
description="GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x1F01, 0x0301 },
+ shcode=0x3B1,
+ specials={ "char", 0x1F01, 0x301 },
uccode=0x1F0D,
unicodeslot=0x1F05,
},
@@ -54645,8 +55855,8 @@ characters.data={
description="GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x1F00, 0x0342 },
+ shcode=0x3B1,
+ specials={ "char", 0x1F00, 0x342 },
uccode=0x1F0E,
unicodeslot=0x1F06,
},
@@ -54656,8 +55866,8 @@ characters.data={
description="GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x1F01, 0x0342 },
+ shcode=0x3B1,
+ specials={ "char", 0x1F01, 0x342 },
uccode=0x1F0F,
unicodeslot=0x1F07,
},
@@ -54668,8 +55878,8 @@ characters.data={
direction="l",
lccode=0x1F00,
linebreak="al",
- shcode=0x0391,
- specials={ "char", 0x0391, 0x0313 },
+ shcode=0x391,
+ specials={ "char", 0x391, 0x313 },
unicodeslot=0x1F08,
},
[0x1F09]={
@@ -54679,8 +55889,8 @@ characters.data={
direction="l",
lccode=0x1F01,
linebreak="al",
- shcode=0x0391,
- specials={ "char", 0x0391, 0x0314 },
+ shcode=0x391,
+ specials={ "char", 0x391, 0x314 },
unicodeslot=0x1F09,
},
[0x1F0A]={
@@ -54690,8 +55900,8 @@ characters.data={
direction="l",
lccode=0x1F02,
linebreak="al",
- shcode=0x0391,
- specials={ "char", 0x1F08, 0x0300 },
+ shcode=0x391,
+ specials={ "char", 0x1F08, 0x300 },
unicodeslot=0x1F0A,
},
[0x1F0B]={
@@ -54701,8 +55911,8 @@ characters.data={
direction="l",
lccode=0x1F03,
linebreak="al",
- shcode=0x0391,
- specials={ "char", 0x1F09, 0x0300 },
+ shcode=0x391,
+ specials={ "char", 0x1F09, 0x300 },
unicodeslot=0x1F0B,
},
[0x1F0C]={
@@ -54712,8 +55922,8 @@ characters.data={
direction="l",
lccode=0x1F04,
linebreak="al",
- shcode=0x0391,
- specials={ "char", 0x1F08, 0x0301 },
+ shcode=0x391,
+ specials={ "char", 0x1F08, 0x301 },
unicodeslot=0x1F0C,
},
[0x1F0D]={
@@ -54723,8 +55933,8 @@ characters.data={
direction="l",
lccode=0x1F05,
linebreak="al",
- shcode=0x0391,
- specials={ "char", 0x1F09, 0x0301 },
+ shcode=0x391,
+ specials={ "char", 0x1F09, 0x301 },
unicodeslot=0x1F0D,
},
[0x1F0E]={
@@ -54734,8 +55944,8 @@ characters.data={
direction="l",
lccode=0x1F06,
linebreak="al",
- shcode=0x0391,
- specials={ "char", 0x1F08, 0x0342 },
+ shcode=0x391,
+ specials={ "char", 0x1F08, 0x342 },
unicodeslot=0x1F0E,
},
[0x1F0F]={
@@ -54745,8 +55955,8 @@ characters.data={
direction="l",
lccode=0x1F07,
linebreak="al",
- shcode=0x0391,
- specials={ "char", 0x1F09, 0x0342 },
+ shcode=0x391,
+ specials={ "char", 0x1F09, 0x342 },
unicodeslot=0x1F0F,
},
[0x1F10]={
@@ -54755,8 +55965,8 @@ characters.data={
description="GREEK SMALL LETTER EPSILON WITH PSILI",
direction="l",
linebreak="al",
- shcode=0x03B5,
- specials={ "char", 0x03B5, 0x0313 },
+ shcode=0x3B5,
+ specials={ "char", 0x3B5, 0x313 },
uccode=0x1F18,
unicodeslot=0x1F10,
},
@@ -54766,8 +55976,8 @@ characters.data={
description="GREEK SMALL LETTER EPSILON WITH DASIA",
direction="l",
linebreak="al",
- shcode=0x03B5,
- specials={ "char", 0x03B5, 0x0314 },
+ shcode=0x3B5,
+ specials={ "char", 0x3B5, 0x314 },
uccode=0x1F19,
unicodeslot=0x1F11,
},
@@ -54777,8 +55987,8 @@ characters.data={
description="GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA",
direction="l",
linebreak="al",
- shcode=0x03B5,
- specials={ "char", 0x1F10, 0x0300 },
+ shcode=0x3B5,
+ specials={ "char", 0x1F10, 0x300 },
uccode=0x1F1A,
unicodeslot=0x1F12,
},
@@ -54788,8 +55998,8 @@ characters.data={
description="GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA",
direction="l",
linebreak="al",
- shcode=0x03B5,
- specials={ "char", 0x1F11, 0x0300 },
+ shcode=0x3B5,
+ specials={ "char", 0x1F11, 0x300 },
uccode=0x1F1B,
unicodeslot=0x1F13,
},
@@ -54799,8 +56009,8 @@ characters.data={
description="GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA",
direction="l",
linebreak="al",
- shcode=0x03B5,
- specials={ "char", 0x1F10, 0x0301 },
+ shcode=0x3B5,
+ specials={ "char", 0x1F10, 0x301 },
uccode=0x1F1C,
unicodeslot=0x1F14,
},
@@ -54810,8 +56020,8 @@ characters.data={
description="GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA",
direction="l",
linebreak="al",
- shcode=0x03B5,
- specials={ "char", 0x1F11, 0x0301 },
+ shcode=0x3B5,
+ specials={ "char", 0x1F11, 0x301 },
uccode=0x1F1D,
unicodeslot=0x1F15,
},
@@ -54822,8 +56032,8 @@ characters.data={
direction="l",
lccode=0x1F10,
linebreak="al",
- shcode=0x0395,
- specials={ "char", 0x0395, 0x0313 },
+ shcode=0x395,
+ specials={ "char", 0x395, 0x313 },
unicodeslot=0x1F18,
},
[0x1F19]={
@@ -54833,8 +56043,8 @@ characters.data={
direction="l",
lccode=0x1F11,
linebreak="al",
- shcode=0x0395,
- specials={ "char", 0x0395, 0x0314 },
+ shcode=0x395,
+ specials={ "char", 0x395, 0x314 },
unicodeslot=0x1F19,
},
[0x1F1A]={
@@ -54844,8 +56054,8 @@ characters.data={
direction="l",
lccode=0x1F12,
linebreak="al",
- shcode=0x0395,
- specials={ "char", 0x1F18, 0x0300 },
+ shcode=0x395,
+ specials={ "char", 0x1F18, 0x300 },
unicodeslot=0x1F1A,
},
[0x1F1B]={
@@ -54855,8 +56065,8 @@ characters.data={
direction="l",
lccode=0x1F13,
linebreak="al",
- shcode=0x0395,
- specials={ "char", 0x1F19, 0x0300 },
+ shcode=0x395,
+ specials={ "char", 0x1F19, 0x300 },
unicodeslot=0x1F1B,
},
[0x1F1C]={
@@ -54866,8 +56076,8 @@ characters.data={
direction="l",
lccode=0x1F14,
linebreak="al",
- shcode=0x0395,
- specials={ "char", 0x1F18, 0x0301 },
+ shcode=0x395,
+ specials={ "char", 0x1F18, 0x301 },
unicodeslot=0x1F1C,
},
[0x1F1D]={
@@ -54877,8 +56087,8 @@ characters.data={
direction="l",
lccode=0x1F15,
linebreak="al",
- shcode=0x0395,
- specials={ "char", 0x1F19, 0x0301 },
+ shcode=0x395,
+ specials={ "char", 0x1F19, 0x301 },
unicodeslot=0x1F1D,
},
[0x1F20]={
@@ -54887,8 +56097,8 @@ characters.data={
description="GREEK SMALL LETTER ETA WITH PSILI",
direction="l",
linebreak="al",
- shcode=0x03B7,
- specials={ "char", 0x03B7, 0x0313 },
+ shcode=0x3B7,
+ specials={ "char", 0x3B7, 0x313 },
uccode=0x1F28,
unicodeslot=0x1F20,
},
@@ -54898,8 +56108,8 @@ characters.data={
description="GREEK SMALL LETTER ETA WITH DASIA",
direction="l",
linebreak="al",
- shcode=0x03B7,
- specials={ "char", 0x03B7, 0x0314 },
+ shcode=0x3B7,
+ specials={ "char", 0x3B7, 0x314 },
uccode=0x1F29,
unicodeslot=0x1F21,
},
@@ -54909,8 +56119,8 @@ characters.data={
description="GREEK SMALL LETTER ETA WITH PSILI AND VARIA",
direction="l",
linebreak="al",
- shcode=0x03B7,
- specials={ "char", 0x1F20, 0x0300 },
+ shcode=0x3B7,
+ specials={ "char", 0x1F20, 0x300 },
uccode=0x1F2A,
unicodeslot=0x1F22,
},
@@ -54920,8 +56130,8 @@ characters.data={
description="GREEK SMALL LETTER ETA WITH DASIA AND VARIA",
direction="l",
linebreak="al",
- shcode=0x03B7,
- specials={ "char", 0x1F21, 0x0300 },
+ shcode=0x3B7,
+ specials={ "char", 0x1F21, 0x300 },
uccode=0x1F2B,
unicodeslot=0x1F23,
},
@@ -54931,8 +56141,8 @@ characters.data={
description="GREEK SMALL LETTER ETA WITH PSILI AND OXIA",
direction="l",
linebreak="al",
- shcode=0x03B7,
- specials={ "char", 0x1F20, 0x0301 },
+ shcode=0x3B7,
+ specials={ "char", 0x1F20, 0x301 },
uccode=0x1F2C,
unicodeslot=0x1F24,
},
@@ -54942,8 +56152,8 @@ characters.data={
description="GREEK SMALL LETTER ETA WITH DASIA AND OXIA",
direction="l",
linebreak="al",
- shcode=0x03B7,
- specials={ "char", 0x1F21, 0x0301 },
+ shcode=0x3B7,
+ specials={ "char", 0x1F21, 0x301 },
uccode=0x1F2D,
unicodeslot=0x1F25,
},
@@ -54953,8 +56163,8 @@ characters.data={
description="GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI",
direction="l",
linebreak="al",
- shcode=0x03B7,
- specials={ "char", 0x1F20, 0x0342 },
+ shcode=0x3B7,
+ specials={ "char", 0x1F20, 0x342 },
uccode=0x1F2E,
unicodeslot=0x1F26,
},
@@ -54964,8 +56174,8 @@ characters.data={
description="GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI",
direction="l",
linebreak="al",
- shcode=0x03B7,
- specials={ "char", 0x1F21, 0x0342 },
+ shcode=0x3B7,
+ specials={ "char", 0x1F21, 0x342 },
uccode=0x1F2F,
unicodeslot=0x1F27,
},
@@ -54976,8 +56186,8 @@ characters.data={
direction="l",
lccode=0x1F20,
linebreak="al",
- shcode=0x0397,
- specials={ "char", 0x0397, 0x0313 },
+ shcode=0x397,
+ specials={ "char", 0x397, 0x313 },
unicodeslot=0x1F28,
},
[0x1F29]={
@@ -54987,8 +56197,8 @@ characters.data={
direction="l",
lccode=0x1F21,
linebreak="al",
- shcode=0x0397,
- specials={ "char", 0x0397, 0x0314 },
+ shcode=0x397,
+ specials={ "char", 0x397, 0x314 },
unicodeslot=0x1F29,
},
[0x1F2A]={
@@ -54998,8 +56208,8 @@ characters.data={
direction="l",
lccode=0x1F22,
linebreak="al",
- shcode=0x0397,
- specials={ "char", 0x1F28, 0x0300 },
+ shcode=0x397,
+ specials={ "char", 0x1F28, 0x300 },
unicodeslot=0x1F2A,
},
[0x1F2B]={
@@ -55009,8 +56219,8 @@ characters.data={
direction="l",
lccode=0x1F23,
linebreak="al",
- shcode=0x0397,
- specials={ "char", 0x1F29, 0x0300 },
+ shcode=0x397,
+ specials={ "char", 0x1F29, 0x300 },
unicodeslot=0x1F2B,
},
[0x1F2C]={
@@ -55020,8 +56230,8 @@ characters.data={
direction="l",
lccode=0x1F24,
linebreak="al",
- shcode=0x0397,
- specials={ "char", 0x1F28, 0x0301 },
+ shcode=0x397,
+ specials={ "char", 0x1F28, 0x301 },
unicodeslot=0x1F2C,
},
[0x1F2D]={
@@ -55031,8 +56241,8 @@ characters.data={
direction="l",
lccode=0x1F25,
linebreak="al",
- shcode=0x0397,
- specials={ "char", 0x1F29, 0x0301 },
+ shcode=0x397,
+ specials={ "char", 0x1F29, 0x301 },
unicodeslot=0x1F2D,
},
[0x1F2E]={
@@ -55042,8 +56252,8 @@ characters.data={
direction="l",
lccode=0x1F26,
linebreak="al",
- shcode=0x0397,
- specials={ "char", 0x1F28, 0x0342 },
+ shcode=0x397,
+ specials={ "char", 0x1F28, 0x342 },
unicodeslot=0x1F2E,
},
[0x1F2F]={
@@ -55053,8 +56263,8 @@ characters.data={
direction="l",
lccode=0x1F27,
linebreak="al",
- shcode=0x0397,
- specials={ "char", 0x1F29, 0x0342 },
+ shcode=0x397,
+ specials={ "char", 0x1F29, 0x342 },
unicodeslot=0x1F2F,
},
[0x1F30]={
@@ -55063,8 +56273,8 @@ characters.data={
description="GREEK SMALL LETTER IOTA WITH PSILI",
direction="l",
linebreak="al",
- shcode=0x03B9,
- specials={ "char", 0x03B9, 0x0313 },
+ shcode=0x3B9,
+ specials={ "char", 0x3B9, 0x313 },
uccode=0x1F38,
unicodeslot=0x1F30,
},
@@ -55074,8 +56284,8 @@ characters.data={
description="GREEK SMALL LETTER IOTA WITH DASIA",
direction="l",
linebreak="al",
- shcode=0x03B9,
- specials={ "char", 0x03B9, 0x0314 },
+ shcode=0x3B9,
+ specials={ "char", 0x3B9, 0x314 },
uccode=0x1F39,
unicodeslot=0x1F31,
},
@@ -55085,8 +56295,8 @@ characters.data={
description="GREEK SMALL LETTER IOTA WITH PSILI AND VARIA",
direction="l",
linebreak="al",
- shcode=0x03B9,
- specials={ "char", 0x1F30, 0x0300 },
+ shcode=0x3B9,
+ specials={ "char", 0x1F30, 0x300 },
uccode=0x1F3A,
unicodeslot=0x1F32,
},
@@ -55096,8 +56306,8 @@ characters.data={
description="GREEK SMALL LETTER IOTA WITH DASIA AND VARIA",
direction="l",
linebreak="al",
- shcode=0x03B9,
- specials={ "char", 0x1F31, 0x0300 },
+ shcode=0x3B9,
+ specials={ "char", 0x1F31, 0x300 },
uccode=0x1F3B,
unicodeslot=0x1F33,
},
@@ -55107,8 +56317,8 @@ characters.data={
description="GREEK SMALL LETTER IOTA WITH PSILI AND OXIA",
direction="l",
linebreak="al",
- shcode=0x03B9,
- specials={ "char", 0x1F30, 0x0301 },
+ shcode=0x3B9,
+ specials={ "char", 0x1F30, 0x301 },
uccode=0x1F3C,
unicodeslot=0x1F34,
},
@@ -55118,8 +56328,8 @@ characters.data={
description="GREEK SMALL LETTER IOTA WITH DASIA AND OXIA",
direction="l",
linebreak="al",
- shcode=0x03B9,
- specials={ "char", 0x1F31, 0x0301 },
+ shcode=0x3B9,
+ specials={ "char", 0x1F31, 0x301 },
uccode=0x1F3D,
unicodeslot=0x1F35,
},
@@ -55129,8 +56339,8 @@ characters.data={
description="GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI",
direction="l",
linebreak="al",
- shcode=0x03B9,
- specials={ "char", 0x1F30, 0x0342 },
+ shcode=0x3B9,
+ specials={ "char", 0x1F30, 0x342 },
uccode=0x1F3E,
unicodeslot=0x1F36,
},
@@ -55140,8 +56350,8 @@ characters.data={
description="GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI",
direction="l",
linebreak="al",
- shcode=0x03B9,
- specials={ "char", 0x1F31, 0x0342 },
+ shcode=0x3B9,
+ specials={ "char", 0x1F31, 0x342 },
uccode=0x1F3F,
unicodeslot=0x1F37,
},
@@ -55152,8 +56362,8 @@ characters.data={
direction="l",
lccode=0x1F30,
linebreak="al",
- shcode=0x0399,
- specials={ "char", 0x0399, 0x0313 },
+ shcode=0x399,
+ specials={ "char", 0x399, 0x313 },
unicodeslot=0x1F38,
},
[0x1F39]={
@@ -55163,8 +56373,8 @@ characters.data={
direction="l",
lccode=0x1F31,
linebreak="al",
- shcode=0x0399,
- specials={ "char", 0x0399, 0x0314 },
+ shcode=0x399,
+ specials={ "char", 0x399, 0x314 },
unicodeslot=0x1F39,
},
[0x1F3A]={
@@ -55174,8 +56384,8 @@ characters.data={
direction="l",
lccode=0x1F32,
linebreak="al",
- shcode=0x0399,
- specials={ "char", 0x1F38, 0x0300 },
+ shcode=0x399,
+ specials={ "char", 0x1F38, 0x300 },
unicodeslot=0x1F3A,
},
[0x1F3B]={
@@ -55185,8 +56395,8 @@ characters.data={
direction="l",
lccode=0x1F33,
linebreak="al",
- shcode=0x0399,
- specials={ "char", 0x1F39, 0x0300 },
+ shcode=0x399,
+ specials={ "char", 0x1F39, 0x300 },
unicodeslot=0x1F3B,
},
[0x1F3C]={
@@ -55196,8 +56406,8 @@ characters.data={
direction="l",
lccode=0x1F34,
linebreak="al",
- shcode=0x0399,
- specials={ "char", 0x1F38, 0x0301 },
+ shcode=0x399,
+ specials={ "char", 0x1F38, 0x301 },
unicodeslot=0x1F3C,
},
[0x1F3D]={
@@ -55207,8 +56417,8 @@ characters.data={
direction="l",
lccode=0x1F35,
linebreak="al",
- shcode=0x0399,
- specials={ "char", 0x1F39, 0x0301 },
+ shcode=0x399,
+ specials={ "char", 0x1F39, 0x301 },
unicodeslot=0x1F3D,
},
[0x1F3E]={
@@ -55218,8 +56428,8 @@ characters.data={
direction="l",
lccode=0x1F36,
linebreak="al",
- shcode=0x0399,
- specials={ "char", 0x1F38, 0x0342 },
+ shcode=0x399,
+ specials={ "char", 0x1F38, 0x342 },
unicodeslot=0x1F3E,
},
[0x1F3F]={
@@ -55229,8 +56439,8 @@ characters.data={
direction="l",
lccode=0x1F37,
linebreak="al",
- shcode=0x0399,
- specials={ "char", 0x1F39, 0x0342 },
+ shcode=0x399,
+ specials={ "char", 0x1F39, 0x342 },
unicodeslot=0x1F3F,
},
[0x1F40]={
@@ -55239,8 +56449,8 @@ characters.data={
description="GREEK SMALL LETTER OMICRON WITH PSILI",
direction="l",
linebreak="al",
- shcode=0x03BF,
- specials={ "char", 0x03BF, 0x0313 },
+ shcode=0x3BF,
+ specials={ "char", 0x3BF, 0x313 },
uccode=0x1F48,
unicodeslot=0x1F40,
},
@@ -55250,8 +56460,8 @@ characters.data={
description="GREEK SMALL LETTER OMICRON WITH DASIA",
direction="l",
linebreak="al",
- shcode=0x03BF,
- specials={ "char", 0x03BF, 0x0314 },
+ shcode=0x3BF,
+ specials={ "char", 0x3BF, 0x314 },
uccode=0x1F49,
unicodeslot=0x1F41,
},
@@ -55261,8 +56471,8 @@ characters.data={
description="GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA",
direction="l",
linebreak="al",
- shcode=0x03BF,
- specials={ "char", 0x1F40, 0x0300 },
+ shcode=0x3BF,
+ specials={ "char", 0x1F40, 0x300 },
uccode=0x1F4A,
unicodeslot=0x1F42,
},
@@ -55272,8 +56482,8 @@ characters.data={
description="GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA",
direction="l",
linebreak="al",
- shcode=0x03BF,
- specials={ "char", 0x1F41, 0x0300 },
+ shcode=0x3BF,
+ specials={ "char", 0x1F41, 0x300 },
uccode=0x1F4B,
unicodeslot=0x1F43,
},
@@ -55283,8 +56493,8 @@ characters.data={
description="GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA",
direction="l",
linebreak="al",
- shcode=0x03BF,
- specials={ "char", 0x1F40, 0x0301 },
+ shcode=0x3BF,
+ specials={ "char", 0x1F40, 0x301 },
uccode=0x1F4C,
unicodeslot=0x1F44,
},
@@ -55294,8 +56504,8 @@ characters.data={
description="GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA",
direction="l",
linebreak="al",
- shcode=0x03BF,
- specials={ "char", 0x1F41, 0x0301 },
+ shcode=0x3BF,
+ specials={ "char", 0x1F41, 0x301 },
uccode=0x1F4D,
unicodeslot=0x1F45,
},
@@ -55306,8 +56516,8 @@ characters.data={
direction="l",
lccode=0x1F40,
linebreak="al",
- shcode=0x039F,
- specials={ "char", 0x039F, 0x0313 },
+ shcode=0x39F,
+ specials={ "char", 0x39F, 0x313 },
unicodeslot=0x1F48,
},
[0x1F49]={
@@ -55317,8 +56527,8 @@ characters.data={
direction="l",
lccode=0x1F41,
linebreak="al",
- shcode=0x039F,
- specials={ "char", 0x039F, 0x0314 },
+ shcode=0x39F,
+ specials={ "char", 0x39F, 0x314 },
unicodeslot=0x1F49,
},
[0x1F4A]={
@@ -55328,8 +56538,8 @@ characters.data={
direction="l",
lccode=0x1F42,
linebreak="al",
- shcode=0x039F,
- specials={ "char", 0x1F48, 0x0300 },
+ shcode=0x39F,
+ specials={ "char", 0x1F48, 0x300 },
unicodeslot=0x1F4A,
},
[0x1F4B]={
@@ -55339,8 +56549,8 @@ characters.data={
direction="l",
lccode=0x1F43,
linebreak="al",
- shcode=0x039F,
- specials={ "char", 0x1F49, 0x0300 },
+ shcode=0x39F,
+ specials={ "char", 0x1F49, 0x300 },
unicodeslot=0x1F4B,
},
[0x1F4C]={
@@ -55350,8 +56560,8 @@ characters.data={
direction="l",
lccode=0x1F44,
linebreak="al",
- shcode=0x039F,
- specials={ "char", 0x1F48, 0x0301 },
+ shcode=0x39F,
+ specials={ "char", 0x1F48, 0x301 },
unicodeslot=0x1F4C,
},
[0x1F4D]={
@@ -55361,8 +56571,8 @@ characters.data={
direction="l",
lccode=0x1F45,
linebreak="al",
- shcode=0x039F,
- specials={ "char", 0x1F49, 0x0301 },
+ shcode=0x39F,
+ specials={ "char", 0x1F49, 0x301 },
unicodeslot=0x1F4D,
},
[0x1F50]={
@@ -55371,8 +56581,8 @@ characters.data={
description="GREEK SMALL LETTER UPSILON WITH PSILI",
direction="l",
linebreak="al",
- shcode=0x03C5,
- specials={ "char", 0x03C5, 0x0313 },
+ shcode=0x3C5,
+ specials={ "char", 0x3C5, 0x313 },
unicodeslot=0x1F50,
},
[0x1F51]={
@@ -55381,8 +56591,8 @@ characters.data={
description="GREEK SMALL LETTER UPSILON WITH DASIA",
direction="l",
linebreak="al",
- shcode=0x03C5,
- specials={ "char", 0x03C5, 0x0314 },
+ shcode=0x3C5,
+ specials={ "char", 0x3C5, 0x314 },
uccode=0x1F59,
unicodeslot=0x1F51,
},
@@ -55392,8 +56602,8 @@ characters.data={
description="GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA",
direction="l",
linebreak="al",
- shcode=0x03C5,
- specials={ "char", 0x1F50, 0x0300 },
+ shcode=0x3C5,
+ specials={ "char", 0x1F50, 0x300 },
unicodeslot=0x1F52,
},
[0x1F53]={
@@ -55402,8 +56612,8 @@ characters.data={
description="GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA",
direction="l",
linebreak="al",
- shcode=0x03C5,
- specials={ "char", 0x1F51, 0x0300 },
+ shcode=0x3C5,
+ specials={ "char", 0x1F51, 0x300 },
uccode=0x1F5B,
unicodeslot=0x1F53,
},
@@ -55413,8 +56623,8 @@ characters.data={
description="GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA",
direction="l",
linebreak="al",
- shcode=0x03C5,
- specials={ "char", 0x1F50, 0x0301 },
+ shcode=0x3C5,
+ specials={ "char", 0x1F50, 0x301 },
unicodeslot=0x1F54,
},
[0x1F55]={
@@ -55423,8 +56633,8 @@ characters.data={
description="GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA",
direction="l",
linebreak="al",
- shcode=0x03C5,
- specials={ "char", 0x1F51, 0x0301 },
+ shcode=0x3C5,
+ specials={ "char", 0x1F51, 0x301 },
uccode=0x1F5D,
unicodeslot=0x1F55,
},
@@ -55434,8 +56644,8 @@ characters.data={
description="GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI",
direction="l",
linebreak="al",
- shcode=0x03C5,
- specials={ "char", 0x1F50, 0x0342 },
+ shcode=0x3C5,
+ specials={ "char", 0x1F50, 0x342 },
unicodeslot=0x1F56,
},
[0x1F57]={
@@ -55444,8 +56654,8 @@ characters.data={
description="GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI",
direction="l",
linebreak="al",
- shcode=0x03C5,
- specials={ "char", 0x1F51, 0x0342 },
+ shcode=0x3C5,
+ specials={ "char", 0x1F51, 0x342 },
uccode=0x1F5F,
unicodeslot=0x1F57,
},
@@ -55456,8 +56666,8 @@ characters.data={
direction="l",
lccode=0x1F51,
linebreak="al",
- shcode=0x03A5,
- specials={ "char", 0x03A5, 0x0314 },
+ shcode=0x3A5,
+ specials={ "char", 0x3A5, 0x314 },
unicodeslot=0x1F59,
},
[0x1F5B]={
@@ -55467,8 +56677,8 @@ characters.data={
direction="l",
lccode=0x1F53,
linebreak="al",
- shcode=0x03A5,
- specials={ "char", 0x1F59, 0x0300 },
+ shcode=0x3A5,
+ specials={ "char", 0x1F59, 0x300 },
unicodeslot=0x1F5B,
},
[0x1F5D]={
@@ -55478,8 +56688,8 @@ characters.data={
direction="l",
lccode=0x1F55,
linebreak="al",
- shcode=0x03A5,
- specials={ "char", 0x1F59, 0x0301 },
+ shcode=0x3A5,
+ specials={ "char", 0x1F59, 0x301 },
unicodeslot=0x1F5D,
},
[0x1F5F]={
@@ -55489,8 +56699,8 @@ characters.data={
direction="l",
lccode=0x1F57,
linebreak="al",
- shcode=0x03A5,
- specials={ "char", 0x1F59, 0x0342 },
+ shcode=0x3A5,
+ specials={ "char", 0x1F59, 0x342 },
unicodeslot=0x1F5F,
},
[0x1F60]={
@@ -55499,8 +56709,8 @@ characters.data={
description="GREEK SMALL LETTER OMEGA WITH PSILI",
direction="l",
linebreak="al",
- shcode=0x03C9,
- specials={ "char", 0x03C9, 0x0313 },
+ shcode=0x3C9,
+ specials={ "char", 0x3C9, 0x313 },
uccode=0x1F68,
unicodeslot=0x1F60,
},
@@ -55510,8 +56720,8 @@ characters.data={
description="GREEK SMALL LETTER OMEGA WITH DASIA",
direction="l",
linebreak="al",
- shcode=0x03C9,
- specials={ "char", 0x03C9, 0x0314 },
+ shcode=0x3C9,
+ specials={ "char", 0x3C9, 0x314 },
uccode=0x1F69,
unicodeslot=0x1F61,
},
@@ -55521,8 +56731,8 @@ characters.data={
description="GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA",
direction="l",
linebreak="al",
- shcode=0x03C9,
- specials={ "char", 0x1F60, 0x0300 },
+ shcode=0x3C9,
+ specials={ "char", 0x1F60, 0x300 },
uccode=0x1F6A,
unicodeslot=0x1F62,
},
@@ -55532,8 +56742,8 @@ characters.data={
description="GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA",
direction="l",
linebreak="al",
- shcode=0x03C9,
- specials={ "char", 0x1F61, 0x0300 },
+ shcode=0x3C9,
+ specials={ "char", 0x1F61, 0x300 },
uccode=0x1F6B,
unicodeslot=0x1F63,
},
@@ -55543,8 +56753,8 @@ characters.data={
description="GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA",
direction="l",
linebreak="al",
- shcode=0x03C9,
- specials={ "char", 0x1F60, 0x0301 },
+ shcode=0x3C9,
+ specials={ "char", 0x1F60, 0x301 },
uccode=0x1F6C,
unicodeslot=0x1F64,
},
@@ -55554,8 +56764,8 @@ characters.data={
description="GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA",
direction="l",
linebreak="al",
- shcode=0x03C9,
- specials={ "char", 0x1F61, 0x0301 },
+ shcode=0x3C9,
+ specials={ "char", 0x1F61, 0x301 },
uccode=0x1F6D,
unicodeslot=0x1F65,
},
@@ -55565,8 +56775,8 @@ characters.data={
description="GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI",
direction="l",
linebreak="al",
- shcode=0x03C9,
- specials={ "char", 0x1F60, 0x0342 },
+ shcode=0x3C9,
+ specials={ "char", 0x1F60, 0x342 },
uccode=0x1F6E,
unicodeslot=0x1F66,
},
@@ -55576,8 +56786,8 @@ characters.data={
description="GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI",
direction="l",
linebreak="al",
- shcode=0x03C9,
- specials={ "char", 0x1F61, 0x0342 },
+ shcode=0x3C9,
+ specials={ "char", 0x1F61, 0x342 },
uccode=0x1F6F,
unicodeslot=0x1F67,
},
@@ -55588,8 +56798,8 @@ characters.data={
direction="l",
lccode=0x1F60,
linebreak="al",
- shcode=0x03A9,
- specials={ "char", 0x03A9, 0x0313 },
+ shcode=0x3A9,
+ specials={ "char", 0x3A9, 0x313 },
unicodeslot=0x1F68,
},
[0x1F69]={
@@ -55599,8 +56809,8 @@ characters.data={
direction="l",
lccode=0x1F61,
linebreak="al",
- shcode=0x03A9,
- specials={ "char", 0x03A9, 0x0314 },
+ shcode=0x3A9,
+ specials={ "char", 0x3A9, 0x314 },
unicodeslot=0x1F69,
},
[0x1F6A]={
@@ -55610,8 +56820,8 @@ characters.data={
direction="l",
lccode=0x1F62,
linebreak="al",
- shcode=0x03A9,
- specials={ "char", 0x1F68, 0x0300 },
+ shcode=0x3A9,
+ specials={ "char", 0x1F68, 0x300 },
unicodeslot=0x1F6A,
},
[0x1F6B]={
@@ -55621,8 +56831,8 @@ characters.data={
direction="l",
lccode=0x1F63,
linebreak="al",
- shcode=0x03A9,
- specials={ "char", 0x1F69, 0x0300 },
+ shcode=0x3A9,
+ specials={ "char", 0x1F69, 0x300 },
unicodeslot=0x1F6B,
},
[0x1F6C]={
@@ -55632,8 +56842,8 @@ characters.data={
direction="l",
lccode=0x1F64,
linebreak="al",
- shcode=0x03A9,
- specials={ "char", 0x1F68, 0x0301 },
+ shcode=0x3A9,
+ specials={ "char", 0x1F68, 0x301 },
unicodeslot=0x1F6C,
},
[0x1F6D]={
@@ -55643,8 +56853,8 @@ characters.data={
direction="l",
lccode=0x1F65,
linebreak="al",
- shcode=0x03A9,
- specials={ "char", 0x1F69, 0x0301 },
+ shcode=0x3A9,
+ specials={ "char", 0x1F69, 0x301 },
unicodeslot=0x1F6D,
},
[0x1F6E]={
@@ -55654,8 +56864,8 @@ characters.data={
direction="l",
lccode=0x1F66,
linebreak="al",
- shcode=0x03A9,
- specials={ "char", 0x1F68, 0x0342 },
+ shcode=0x3A9,
+ specials={ "char", 0x1F68, 0x342 },
unicodeslot=0x1F6E,
},
[0x1F6F]={
@@ -55665,8 +56875,8 @@ characters.data={
direction="l",
lccode=0x1F67,
linebreak="al",
- shcode=0x03A9,
- specials={ "char", 0x1F69, 0x0342 },
+ shcode=0x3A9,
+ specials={ "char", 0x1F69, 0x342 },
unicodeslot=0x1F6F,
},
[0x1F70]={
@@ -55675,8 +56885,8 @@ characters.data={
description="GREEK SMALL LETTER ALPHA WITH VARIA",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x03B1, 0x0300 },
+ shcode=0x3B1,
+ specials={ "char", 0x3B1, 0x300 },
uccode=0x1FBA,
unicodeslot=0x1F70,
},
@@ -55686,8 +56896,8 @@ characters.data={
description="GREEK SMALL LETTER ALPHA WITH OXIA",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x03AC },
+ shcode=0x3B1,
+ specials={ "char", 0x3AC },
uccode=0x1FBB,
unicodeslot=0x1F71,
},
@@ -55697,8 +56907,8 @@ characters.data={
description="GREEK SMALL LETTER EPSILON WITH VARIA",
direction="l",
linebreak="al",
- shcode=0x03B5,
- specials={ "char", 0x03B5, 0x0300 },
+ shcode=0x3B5,
+ specials={ "char", 0x3B5, 0x300 },
uccode=0x1FC8,
unicodeslot=0x1F72,
},
@@ -55708,8 +56918,8 @@ characters.data={
description="GREEK SMALL LETTER EPSILON WITH OXIA",
direction="l",
linebreak="al",
- shcode=0x03B5,
- specials={ "char", 0x03AD },
+ shcode=0x3B5,
+ specials={ "char", 0x3AD },
uccode=0x1FC9,
unicodeslot=0x1F73,
},
@@ -55719,8 +56929,8 @@ characters.data={
description="GREEK SMALL LETTER ETA WITH VARIA",
direction="l",
linebreak="al",
- shcode=0x03B7,
- specials={ "char", 0x03B7, 0x0300 },
+ shcode=0x3B7,
+ specials={ "char", 0x3B7, 0x300 },
uccode=0x1FCA,
unicodeslot=0x1F74,
},
@@ -55730,8 +56940,8 @@ characters.data={
description="GREEK SMALL LETTER ETA WITH OXIA",
direction="l",
linebreak="al",
- shcode=0x03B7,
- specials={ "char", 0x03AE },
+ shcode=0x3B7,
+ specials={ "char", 0x3AE },
uccode=0x1FCB,
unicodeslot=0x1F75,
},
@@ -55741,8 +56951,8 @@ characters.data={
description="GREEK SMALL LETTER IOTA WITH VARIA",
direction="l",
linebreak="al",
- shcode=0x03B9,
- specials={ "char", 0x03B9, 0x0300 },
+ shcode=0x3B9,
+ specials={ "char", 0x3B9, 0x300 },
uccode=0x1FDA,
unicodeslot=0x1F76,
},
@@ -55752,8 +56962,8 @@ characters.data={
description="GREEK SMALL LETTER IOTA WITH OXIA",
direction="l",
linebreak="al",
- shcode=0x03B9,
- specials={ "char", 0x03AF },
+ shcode=0x3B9,
+ specials={ "char", 0x3AF },
uccode=0x1FDB,
unicodeslot=0x1F77,
},
@@ -55763,8 +56973,8 @@ characters.data={
description="GREEK SMALL LETTER OMICRON WITH VARIA",
direction="l",
linebreak="al",
- shcode=0x03BF,
- specials={ "char", 0x03BF, 0x0300 },
+ shcode=0x3BF,
+ specials={ "char", 0x3BF, 0x300 },
uccode=0x1FF8,
unicodeslot=0x1F78,
},
@@ -55774,8 +56984,8 @@ characters.data={
description="GREEK SMALL LETTER OMICRON WITH OXIA",
direction="l",
linebreak="al",
- shcode=0x03BF,
- specials={ "char", 0x03CC },
+ shcode=0x3BF,
+ specials={ "char", 0x3CC },
uccode=0x1FF9,
unicodeslot=0x1F79,
},
@@ -55785,8 +56995,8 @@ characters.data={
description="GREEK SMALL LETTER UPSILON WITH VARIA",
direction="l",
linebreak="al",
- shcode=0x03C5,
- specials={ "char", 0x03C5, 0x0300 },
+ shcode=0x3C5,
+ specials={ "char", 0x3C5, 0x300 },
uccode=0x1FEA,
unicodeslot=0x1F7A,
},
@@ -55796,8 +57006,8 @@ characters.data={
description="GREEK SMALL LETTER UPSILON WITH OXIA",
direction="l",
linebreak="al",
- shcode=0x03C5,
- specials={ "char", 0x03CD },
+ shcode=0x3C5,
+ specials={ "char", 0x3CD },
uccode=0x1FEB,
unicodeslot=0x1F7B,
},
@@ -55807,8 +57017,8 @@ characters.data={
description="GREEK SMALL LETTER OMEGA WITH VARIA",
direction="l",
linebreak="al",
- shcode=0x03C9,
- specials={ "char", 0x03C9, 0x0300 },
+ shcode=0x3C9,
+ specials={ "char", 0x3C9, 0x300 },
uccode=0x1FFA,
unicodeslot=0x1F7C,
},
@@ -55818,8 +57028,8 @@ characters.data={
description="GREEK SMALL LETTER OMEGA WITH OXIA",
direction="l",
linebreak="al",
- shcode=0x03C9,
- specials={ "char", 0x03CE },
+ shcode=0x3C9,
+ specials={ "char", 0x3CE },
uccode=0x1FFB,
unicodeslot=0x1F7D,
},
@@ -55829,8 +57039,8 @@ characters.data={
description="GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x1F00, 0x0345 },
+ shcode=0x3B1,
+ specials={ "char", 0x1F00, 0x345 },
uccode=0x1F88,
unicodeslot=0x1F80,
},
@@ -55840,8 +57050,8 @@ characters.data={
description="GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x1F01, 0x0345 },
+ shcode=0x3B1,
+ specials={ "char", 0x1F01, 0x345 },
uccode=0x1F89,
unicodeslot=0x1F81,
},
@@ -55851,8 +57061,8 @@ characters.data={
description="GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x1F02, 0x0345 },
+ shcode=0x3B1,
+ specials={ "char", 0x1F02, 0x345 },
uccode=0x1F8A,
unicodeslot=0x1F82,
},
@@ -55862,8 +57072,8 @@ characters.data={
description="GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x1F03, 0x0345 },
+ shcode=0x3B1,
+ specials={ "char", 0x1F03, 0x345 },
uccode=0x1F8B,
unicodeslot=0x1F83,
},
@@ -55873,8 +57083,8 @@ characters.data={
description="GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x1F04, 0x0345 },
+ shcode=0x3B1,
+ specials={ "char", 0x1F04, 0x345 },
uccode=0x1F8C,
unicodeslot=0x1F84,
},
@@ -55884,8 +57094,8 @@ characters.data={
description="GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x1F05, 0x0345 },
+ shcode=0x3B1,
+ specials={ "char", 0x1F05, 0x345 },
uccode=0x1F8D,
unicodeslot=0x1F85,
},
@@ -55895,8 +57105,8 @@ characters.data={
description="GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x1F06, 0x0345 },
+ shcode=0x3B1,
+ specials={ "char", 0x1F06, 0x345 },
uccode=0x1F8E,
unicodeslot=0x1F86,
},
@@ -55906,8 +57116,8 @@ characters.data={
description="GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x1F07, 0x0345 },
+ shcode=0x3B1,
+ specials={ "char", 0x1F07, 0x345 },
uccode=0x1F8F,
unicodeslot=0x1F87,
},
@@ -55918,8 +57128,8 @@ characters.data={
direction="l",
lccode=0x1F80,
linebreak="al",
- shcode=0x0391,
- specials={ "char", 0x1F08, 0x0345 },
+ shcode=0x391,
+ specials={ "char", 0x1F08, 0x345 },
unicodeslot=0x1F88,
},
[0x1F89]={
@@ -55929,8 +57139,8 @@ characters.data={
direction="l",
lccode=0x1F81,
linebreak="al",
- shcode=0x0391,
- specials={ "char", 0x1F09, 0x0345 },
+ shcode=0x391,
+ specials={ "char", 0x1F09, 0x345 },
unicodeslot=0x1F89,
},
[0x1F8A]={
@@ -55940,8 +57150,8 @@ characters.data={
direction="l",
lccode=0x1F82,
linebreak="al",
- shcode=0x0391,
- specials={ "char", 0x1F0A, 0x0345 },
+ shcode=0x391,
+ specials={ "char", 0x1F0A, 0x345 },
unicodeslot=0x1F8A,
},
[0x1F8B]={
@@ -55951,8 +57161,8 @@ characters.data={
direction="l",
lccode=0x1F83,
linebreak="al",
- shcode=0x0391,
- specials={ "char", 0x1F0B, 0x0345 },
+ shcode=0x391,
+ specials={ "char", 0x1F0B, 0x345 },
unicodeslot=0x1F8B,
},
[0x1F8C]={
@@ -55962,8 +57172,8 @@ characters.data={
direction="l",
lccode=0x1F84,
linebreak="al",
- shcode=0x0391,
- specials={ "char", 0x1F0C, 0x0345 },
+ shcode=0x391,
+ specials={ "char", 0x1F0C, 0x345 },
unicodeslot=0x1F8C,
},
[0x1F8D]={
@@ -55973,8 +57183,8 @@ characters.data={
direction="l",
lccode=0x1F85,
linebreak="al",
- shcode=0x0391,
- specials={ "char", 0x1F0D, 0x0345 },
+ shcode=0x391,
+ specials={ "char", 0x1F0D, 0x345 },
unicodeslot=0x1F8D,
},
[0x1F8E]={
@@ -55984,8 +57194,8 @@ characters.data={
direction="l",
lccode=0x1F86,
linebreak="al",
- shcode=0x0391,
- specials={ "char", 0x1F0E, 0x0345 },
+ shcode=0x391,
+ specials={ "char", 0x1F0E, 0x345 },
unicodeslot=0x1F8E,
},
[0x1F8F]={
@@ -55995,8 +57205,8 @@ characters.data={
direction="l",
lccode=0x1F87,
linebreak="al",
- shcode=0x0391,
- specials={ "char", 0x1F0F, 0x0345 },
+ shcode=0x391,
+ specials={ "char", 0x1F0F, 0x345 },
unicodeslot=0x1F8F,
},
[0x1F90]={
@@ -56005,8 +57215,8 @@ characters.data={
description="GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03B7,
- specials={ "char", 0x1F20, 0x0345 },
+ shcode=0x3B7,
+ specials={ "char", 0x1F20, 0x345 },
uccode=0x1F98,
unicodeslot=0x1F90,
},
@@ -56016,8 +57226,8 @@ characters.data={
description="GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03B7,
- specials={ "char", 0x1F21, 0x0345 },
+ shcode=0x3B7,
+ specials={ "char", 0x1F21, 0x345 },
uccode=0x1F99,
unicodeslot=0x1F91,
},
@@ -56027,8 +57237,8 @@ characters.data={
description="GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03B7,
- specials={ "char", 0x1F22, 0x0345 },
+ shcode=0x3B7,
+ specials={ "char", 0x1F22, 0x345 },
uccode=0x1F9A,
unicodeslot=0x1F92,
},
@@ -56038,8 +57248,8 @@ characters.data={
description="GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03B7,
- specials={ "char", 0x1F23, 0x0345 },
+ shcode=0x3B7,
+ specials={ "char", 0x1F23, 0x345 },
uccode=0x1F9B,
unicodeslot=0x1F93,
},
@@ -56049,8 +57259,8 @@ characters.data={
description="GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03B7,
- specials={ "char", 0x1F24, 0x0345 },
+ shcode=0x3B7,
+ specials={ "char", 0x1F24, 0x345 },
uccode=0x1F9C,
unicodeslot=0x1F94,
},
@@ -56060,8 +57270,8 @@ characters.data={
description="GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03B7,
- specials={ "char", 0x1F25, 0x0345 },
+ shcode=0x3B7,
+ specials={ "char", 0x1F25, 0x345 },
uccode=0x1F9D,
unicodeslot=0x1F95,
},
@@ -56071,8 +57281,8 @@ characters.data={
description="GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03B7,
- specials={ "char", 0x1F26, 0x0345 },
+ shcode=0x3B7,
+ specials={ "char", 0x1F26, 0x345 },
uccode=0x1F9E,
unicodeslot=0x1F96,
},
@@ -56082,8 +57292,8 @@ characters.data={
description="GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03B7,
- specials={ "char", 0x1F27, 0x0345 },
+ shcode=0x3B7,
+ specials={ "char", 0x1F27, 0x345 },
uccode=0x1F9F,
unicodeslot=0x1F97,
},
@@ -56094,8 +57304,8 @@ characters.data={
direction="l",
lccode=0x1F90,
linebreak="al",
- shcode=0x0397,
- specials={ "char", 0x1F28, 0x0345 },
+ shcode=0x397,
+ specials={ "char", 0x1F28, 0x345 },
unicodeslot=0x1F98,
},
[0x1F99]={
@@ -56105,8 +57315,8 @@ characters.data={
direction="l",
lccode=0x1F91,
linebreak="al",
- shcode=0x0397,
- specials={ "char", 0x1F29, 0x0345 },
+ shcode=0x397,
+ specials={ "char", 0x1F29, 0x345 },
unicodeslot=0x1F99,
},
[0x1F9A]={
@@ -56116,8 +57326,8 @@ characters.data={
direction="l",
lccode=0x1F92,
linebreak="al",
- shcode=0x0397,
- specials={ "char", 0x1F2A, 0x0345 },
+ shcode=0x397,
+ specials={ "char", 0x1F2A, 0x345 },
unicodeslot=0x1F9A,
},
[0x1F9B]={
@@ -56127,8 +57337,8 @@ characters.data={
direction="l",
lccode=0x1F93,
linebreak="al",
- shcode=0x0397,
- specials={ "char", 0x1F2B, 0x0345 },
+ shcode=0x397,
+ specials={ "char", 0x1F2B, 0x345 },
unicodeslot=0x1F9B,
},
[0x1F9C]={
@@ -56138,8 +57348,8 @@ characters.data={
direction="l",
lccode=0x1F94,
linebreak="al",
- shcode=0x0397,
- specials={ "char", 0x1F2C, 0x0345 },
+ shcode=0x397,
+ specials={ "char", 0x1F2C, 0x345 },
unicodeslot=0x1F9C,
},
[0x1F9D]={
@@ -56149,8 +57359,8 @@ characters.data={
direction="l",
lccode=0x1F95,
linebreak="al",
- shcode=0x0397,
- specials={ "char", 0x1F2D, 0x0345 },
+ shcode=0x397,
+ specials={ "char", 0x1F2D, 0x345 },
unicodeslot=0x1F9D,
},
[0x1F9E]={
@@ -56160,8 +57370,8 @@ characters.data={
direction="l",
lccode=0x1F96,
linebreak="al",
- shcode=0x0397,
- specials={ "char", 0x1F2E, 0x0345 },
+ shcode=0x397,
+ specials={ "char", 0x1F2E, 0x345 },
unicodeslot=0x1F9E,
},
[0x1F9F]={
@@ -56171,8 +57381,8 @@ characters.data={
direction="l",
lccode=0x1F97,
linebreak="al",
- shcode=0x0397,
- specials={ "char", 0x1F2F, 0x0345 },
+ shcode=0x397,
+ specials={ "char", 0x1F2F, 0x345 },
unicodeslot=0x1F9F,
},
[0x1FA0]={
@@ -56181,8 +57391,8 @@ characters.data={
description="GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03C9,
- specials={ "char", 0x1F60, 0x0345 },
+ shcode=0x3C9,
+ specials={ "char", 0x1F60, 0x345 },
uccode=0x1FA8,
unicodeslot=0x1FA0,
},
@@ -56192,8 +57402,8 @@ characters.data={
description="GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03C9,
- specials={ "char", 0x1F61, 0x0345 },
+ shcode=0x3C9,
+ specials={ "char", 0x1F61, 0x345 },
uccode=0x1FA9,
unicodeslot=0x1FA1,
},
@@ -56203,8 +57413,8 @@ characters.data={
description="GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03C9,
- specials={ "char", 0x1F62, 0x0345 },
+ shcode=0x3C9,
+ specials={ "char", 0x1F62, 0x345 },
uccode=0x1FAA,
unicodeslot=0x1FA2,
},
@@ -56214,8 +57424,8 @@ characters.data={
description="GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03C9,
- specials={ "char", 0x1F63, 0x0345 },
+ shcode=0x3C9,
+ specials={ "char", 0x1F63, 0x345 },
uccode=0x1FAB,
unicodeslot=0x1FA3,
},
@@ -56225,8 +57435,8 @@ characters.data={
description="GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03C9,
- specials={ "char", 0x1F64, 0x0345 },
+ shcode=0x3C9,
+ specials={ "char", 0x1F64, 0x345 },
uccode=0x1FAC,
unicodeslot=0x1FA4,
},
@@ -56236,8 +57446,8 @@ characters.data={
description="GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03C9,
- specials={ "char", 0x1F65, 0x0345 },
+ shcode=0x3C9,
+ specials={ "char", 0x1F65, 0x345 },
uccode=0x1FAD,
unicodeslot=0x1FA5,
},
@@ -56247,8 +57457,8 @@ characters.data={
description="GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03C9,
- specials={ "char", 0x1F66, 0x0345 },
+ shcode=0x3C9,
+ specials={ "char", 0x1F66, 0x345 },
uccode=0x1FAE,
unicodeslot=0x1FA6,
},
@@ -56258,8 +57468,8 @@ characters.data={
description="GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03C9,
- specials={ "char", 0x1F67, 0x0345 },
+ shcode=0x3C9,
+ specials={ "char", 0x1F67, 0x345 },
uccode=0x1FAF,
unicodeslot=0x1FA7,
},
@@ -56270,8 +57480,8 @@ characters.data={
direction="l",
lccode=0x1FA0,
linebreak="al",
- shcode=0x03A9,
- specials={ "char", 0x1F68, 0x0345 },
+ shcode=0x3A9,
+ specials={ "char", 0x1F68, 0x345 },
unicodeslot=0x1FA8,
},
[0x1FA9]={
@@ -56281,8 +57491,8 @@ characters.data={
direction="l",
lccode=0x1FA1,
linebreak="al",
- shcode=0x03A9,
- specials={ "char", 0x1F69, 0x0345 },
+ shcode=0x3A9,
+ specials={ "char", 0x1F69, 0x345 },
unicodeslot=0x1FA9,
},
[0x1FAA]={
@@ -56292,8 +57502,8 @@ characters.data={
direction="l",
lccode=0x1FA2,
linebreak="al",
- shcode=0x03A9,
- specials={ "char", 0x1F6A, 0x0345 },
+ shcode=0x3A9,
+ specials={ "char", 0x1F6A, 0x345 },
unicodeslot=0x1FAA,
},
[0x1FAB]={
@@ -56303,8 +57513,8 @@ characters.data={
direction="l",
lccode=0x1FA3,
linebreak="al",
- shcode=0x03A9,
- specials={ "char", 0x1F6B, 0x0345 },
+ shcode=0x3A9,
+ specials={ "char", 0x1F6B, 0x345 },
unicodeslot=0x1FAB,
},
[0x1FAC]={
@@ -56314,8 +57524,8 @@ characters.data={
direction="l",
lccode=0x1FA4,
linebreak="al",
- shcode=0x03A9,
- specials={ "char", 0x1F6C, 0x0345 },
+ shcode=0x3A9,
+ specials={ "char", 0x1F6C, 0x345 },
unicodeslot=0x1FAC,
},
[0x1FAD]={
@@ -56325,8 +57535,8 @@ characters.data={
direction="l",
lccode=0x1FA5,
linebreak="al",
- shcode=0x03A9,
- specials={ "char", 0x1F6D, 0x0345 },
+ shcode=0x3A9,
+ specials={ "char", 0x1F6D, 0x345 },
unicodeslot=0x1FAD,
},
[0x1FAE]={
@@ -56336,8 +57546,8 @@ characters.data={
direction="l",
lccode=0x1FA6,
linebreak="al",
- shcode=0x03A9,
- specials={ "char", 0x1F6E, 0x0345 },
+ shcode=0x3A9,
+ specials={ "char", 0x1F6E, 0x345 },
unicodeslot=0x1FAE,
},
[0x1FAF]={
@@ -56347,8 +57557,8 @@ characters.data={
direction="l",
lccode=0x1FA7,
linebreak="al",
- shcode=0x03A9,
- specials={ "char", 0x1F6F, 0x0345 },
+ shcode=0x3A9,
+ specials={ "char", 0x1F6F, 0x345 },
unicodeslot=0x1FAF,
},
[0x1FB0]={
@@ -56357,8 +57567,8 @@ characters.data={
description="GREEK SMALL LETTER ALPHA WITH VRACHY",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x03B1, 0x0306 },
+ shcode=0x3B1,
+ specials={ "char", 0x3B1, 0x306 },
uccode=0x1FB8,
unicodeslot=0x1FB0,
},
@@ -56368,8 +57578,8 @@ characters.data={
description="GREEK SMALL LETTER ALPHA WITH MACRON",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x03B1, 0x0304 },
+ shcode=0x3B1,
+ specials={ "char", 0x3B1, 0x304 },
uccode=0x1FB9,
unicodeslot=0x1FB1,
},
@@ -56379,8 +57589,8 @@ characters.data={
description="GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x1F70, 0x0345 },
+ shcode=0x3B1,
+ specials={ "char", 0x1F70, 0x345 },
unicodeslot=0x1FB2,
},
[0x1FB3]={
@@ -56389,8 +57599,8 @@ characters.data={
description="GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x03B1, 0x0345 },
+ shcode=0x3B1,
+ specials={ "char", 0x3B1, 0x345 },
uccode=0x1FBC,
unicodeslot=0x1FB3,
},
@@ -56400,8 +57610,8 @@ characters.data={
description="GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x03AC, 0x0345 },
+ shcode=0x3B1,
+ specials={ "char", 0x3AC, 0x345 },
unicodeslot=0x1FB4,
},
[0x1FB6]={
@@ -56410,8 +57620,8 @@ characters.data={
description="GREEK SMALL LETTER ALPHA WITH PERISPOMENI",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x03B1, 0x0342 },
+ shcode=0x3B1,
+ specials={ "char", 0x3B1, 0x342 },
unicodeslot=0x1FB6,
},
[0x1FB7]={
@@ -56420,8 +57630,8 @@ characters.data={
description="GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03B1,
- specials={ "char", 0x1FB6, 0x0345 },
+ shcode=0x3B1,
+ specials={ "char", 0x1FB6, 0x345 },
unicodeslot=0x1FB7,
},
[0x1FB8]={
@@ -56431,8 +57641,8 @@ characters.data={
direction="l",
lccode=0x1FB0,
linebreak="al",
- shcode=0x0391,
- specials={ "char", 0x0391, 0x0306 },
+ shcode=0x391,
+ specials={ "char", 0x391, 0x306 },
unicodeslot=0x1FB8,
},
[0x1FB9]={
@@ -56442,8 +57652,8 @@ characters.data={
direction="l",
lccode=0x1FB1,
linebreak="al",
- shcode=0x0391,
- specials={ "char", 0x0391, 0x0304 },
+ shcode=0x391,
+ specials={ "char", 0x391, 0x304 },
unicodeslot=0x1FB9,
},
[0x1FBA]={
@@ -56453,8 +57663,8 @@ characters.data={
direction="l",
lccode=0x1F70,
linebreak="al",
- shcode=0x0391,
- specials={ "char", 0x0391, 0x0300 },
+ shcode=0x391,
+ specials={ "char", 0x391, 0x300 },
unicodeslot=0x1FBA,
},
[0x1FBB]={
@@ -56464,8 +57674,8 @@ characters.data={
direction="l",
lccode=0x1F71,
linebreak="al",
- shcode=0x0391,
- specials={ "char", 0x0386 },
+ shcode=0x391,
+ specials={ "char", 0x386 },
unicodeslot=0x1FBB,
},
[0x1FBC]={
@@ -56475,8 +57685,8 @@ characters.data={
direction="l",
lccode=0x1FB3,
linebreak="al",
- shcode=0x0391,
- specials={ "char", 0x0391, 0x0345 },
+ shcode=0x391,
+ specials={ "char", 0x391, 0x345 },
unicodeslot=0x1FBC,
},
[0x1FBD]={
@@ -56485,7 +57695,7 @@ characters.data={
description="GREEK KORONIS",
direction="on",
linebreak="al",
- specials={ "compat", 0x0020, 0x0313 },
+ specials={ "compat", 0x20, 0x313 },
unicodeslot=0x1FBD,
},
[0x1FBE]={
@@ -56494,8 +57704,8 @@ characters.data={
description="GREEK PROSGEGRAMMENI",
direction="l",
linebreak="al",
- specials={ "char", 0x03B9 },
- uccode=0x0399,
+ specials={ "char", 0x3B9 },
+ uccode=0x399,
unicodeslot=0x1FBE,
},
[0x1FBF]={
@@ -56504,7 +57714,7 @@ characters.data={
description="GREEK PSILI",
direction="on",
linebreak="al",
- specials={ "compat", 0x0020, 0x0313 },
+ specials={ "compat", 0x20, 0x313 },
unicodeslot=0x1FBF,
},
[0x1FC0]={
@@ -56513,7 +57723,7 @@ characters.data={
description="GREEK PERISPOMENI",
direction="on",
linebreak="al",
- specials={ "compat", 0x0020, 0x0342 },
+ specials={ "compat", 0x20, 0x342 },
unicodeslot=0x1FC0,
},
[0x1FC1]={
@@ -56522,7 +57732,7 @@ characters.data={
description="GREEK DIALYTIKA AND PERISPOMENI",
direction="on",
linebreak="al",
- specials={ "char", 0x00A8, 0x0342 },
+ specials={ "char", 0xA8, 0x342 },
unicodeslot=0x1FC1,
},
[0x1FC2]={
@@ -56531,8 +57741,8 @@ characters.data={
description="GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03B7,
- specials={ "char", 0x1F74, 0x0345 },
+ shcode=0x3B7,
+ specials={ "char", 0x1F74, 0x345 },
unicodeslot=0x1FC2,
},
[0x1FC3]={
@@ -56541,8 +57751,8 @@ characters.data={
description="GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03B7,
- specials={ "char", 0x03B7, 0x0345 },
+ shcode=0x3B7,
+ specials={ "char", 0x3B7, 0x345 },
uccode=0x1FCC,
unicodeslot=0x1FC3,
},
@@ -56552,8 +57762,8 @@ characters.data={
description="GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03B7,
- specials={ "char", 0x03AE, 0x0345 },
+ shcode=0x3B7,
+ specials={ "char", 0x3AE, 0x345 },
unicodeslot=0x1FC4,
},
[0x1FC6]={
@@ -56562,8 +57772,8 @@ characters.data={
description="GREEK SMALL LETTER ETA WITH PERISPOMENI",
direction="l",
linebreak="al",
- shcode=0x03B7,
- specials={ "char", 0x03B7, 0x0342 },
+ shcode=0x3B7,
+ specials={ "char", 0x3B7, 0x342 },
unicodeslot=0x1FC6,
},
[0x1FC7]={
@@ -56572,8 +57782,8 @@ characters.data={
description="GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03B7,
- specials={ "char", 0x1FC6, 0x0345 },
+ shcode=0x3B7,
+ specials={ "char", 0x1FC6, 0x345 },
unicodeslot=0x1FC7,
},
[0x1FC8]={
@@ -56583,8 +57793,8 @@ characters.data={
direction="l",
lccode=0x1F72,
linebreak="al",
- shcode=0x0395,
- specials={ "char", 0x0395, 0x0300 },
+ shcode=0x395,
+ specials={ "char", 0x395, 0x300 },
unicodeslot=0x1FC8,
},
[0x1FC9]={
@@ -56594,8 +57804,8 @@ characters.data={
direction="l",
lccode=0x1F73,
linebreak="al",
- shcode=0x0395,
- specials={ "char", 0x0388 },
+ shcode=0x395,
+ specials={ "char", 0x388 },
unicodeslot=0x1FC9,
},
[0x1FCA]={
@@ -56605,8 +57815,8 @@ characters.data={
direction="l",
lccode=0x1F74,
linebreak="al",
- shcode=0x0397,
- specials={ "char", 0x0397, 0x0300 },
+ shcode=0x397,
+ specials={ "char", 0x397, 0x300 },
unicodeslot=0x1FCA,
},
[0x1FCB]={
@@ -56616,8 +57826,8 @@ characters.data={
direction="l",
lccode=0x1F75,
linebreak="al",
- shcode=0x0397,
- specials={ "char", 0x0389 },
+ shcode=0x397,
+ specials={ "char", 0x389 },
unicodeslot=0x1FCB,
},
[0x1FCC]={
@@ -56627,8 +57837,8 @@ characters.data={
direction="l",
lccode=0x1FC3,
linebreak="al",
- shcode=0x0397,
- specials={ "char", 0x0397, 0x0345 },
+ shcode=0x397,
+ specials={ "char", 0x397, 0x345 },
unicodeslot=0x1FCC,
},
[0x1FCD]={
@@ -56637,7 +57847,7 @@ characters.data={
description="GREEK PSILI AND VARIA",
direction="on",
linebreak="al",
- specials={ "char", 0x1FBF, 0x0300 },
+ specials={ "char", 0x1FBF, 0x300 },
unicodeslot=0x1FCD,
},
[0x1FCE]={
@@ -56646,7 +57856,7 @@ characters.data={
description="GREEK PSILI AND OXIA",
direction="on",
linebreak="al",
- specials={ "char", 0x1FBF, 0x0301 },
+ specials={ "char", 0x1FBF, 0x301 },
unicodeslot=0x1FCE,
},
[0x1FCF]={
@@ -56655,7 +57865,7 @@ characters.data={
description="GREEK PSILI AND PERISPOMENI",
direction="on",
linebreak="al",
- specials={ "char", 0x1FBF, 0x0342 },
+ specials={ "char", 0x1FBF, 0x342 },
unicodeslot=0x1FCF,
},
[0x1FD0]={
@@ -56664,8 +57874,8 @@ characters.data={
description="GREEK SMALL LETTER IOTA WITH VRACHY",
direction="l",
linebreak="al",
- shcode=0x03B9,
- specials={ "char", 0x03B9, 0x0306 },
+ shcode=0x3B9,
+ specials={ "char", 0x3B9, 0x306 },
uccode=0x1FD8,
unicodeslot=0x1FD0,
},
@@ -56675,8 +57885,8 @@ characters.data={
description="GREEK SMALL LETTER IOTA WITH MACRON",
direction="l",
linebreak="al",
- shcode=0x03B9,
- specials={ "char", 0x03B9, 0x0304 },
+ shcode=0x3B9,
+ specials={ "char", 0x3B9, 0x304 },
uccode=0x1FD9,
unicodeslot=0x1FD1,
},
@@ -56686,8 +57896,8 @@ characters.data={
description="GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA",
direction="l",
linebreak="al",
- shcode=0x03B9,
- specials={ "char", 0x03CA, 0x0300 },
+ shcode=0x3B9,
+ specials={ "char", 0x3CA, 0x300 },
unicodeslot=0x1FD2,
},
[0x1FD3]={
@@ -56696,8 +57906,8 @@ characters.data={
description="GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA",
direction="l",
linebreak="al",
- shcode=0x03B9,
- specials={ "char", 0x0390 },
+ shcode=0x3B9,
+ specials={ "char", 0x390 },
unicodeslot=0x1FD3,
},
[0x1FD6]={
@@ -56706,8 +57916,8 @@ characters.data={
description="GREEK SMALL LETTER IOTA WITH PERISPOMENI",
direction="l",
linebreak="al",
- shcode=0x03B9,
- specials={ "char", 0x03B9, 0x0342 },
+ shcode=0x3B9,
+ specials={ "char", 0x3B9, 0x342 },
unicodeslot=0x1FD6,
},
[0x1FD7]={
@@ -56716,8 +57926,8 @@ characters.data={
description="GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI",
direction="l",
linebreak="al",
- shcode=0x03B9,
- specials={ "char", 0x03CA, 0x0342 },
+ shcode=0x3B9,
+ specials={ "char", 0x3CA, 0x342 },
unicodeslot=0x1FD7,
},
[0x1FD8]={
@@ -56727,8 +57937,8 @@ characters.data={
direction="l",
lccode=0x1FD0,
linebreak="al",
- shcode=0x0399,
- specials={ "char", 0x0399, 0x0306 },
+ shcode=0x399,
+ specials={ "char", 0x399, 0x306 },
unicodeslot=0x1FD8,
},
[0x1FD9]={
@@ -56738,8 +57948,8 @@ characters.data={
direction="l",
lccode=0x1FD1,
linebreak="al",
- shcode=0x0399,
- specials={ "char", 0x0399, 0x0304 },
+ shcode=0x399,
+ specials={ "char", 0x399, 0x304 },
unicodeslot=0x1FD9,
},
[0x1FDA]={
@@ -56749,8 +57959,8 @@ characters.data={
direction="l",
lccode=0x1F76,
linebreak="al",
- shcode=0x0399,
- specials={ "char", 0x0399, 0x0300 },
+ shcode=0x399,
+ specials={ "char", 0x399, 0x300 },
unicodeslot=0x1FDA,
},
[0x1FDB]={
@@ -56760,8 +57970,8 @@ characters.data={
direction="l",
lccode=0x1F77,
linebreak="al",
- shcode=0x0399,
- specials={ "char", 0x038A },
+ shcode=0x399,
+ specials={ "char", 0x38A },
unicodeslot=0x1FDB,
},
[0x1FDD]={
@@ -56770,7 +57980,7 @@ characters.data={
description="GREEK DASIA AND VARIA",
direction="on",
linebreak="al",
- specials={ "char", 0x1FFE, 0x0300 },
+ specials={ "char", 0x1FFE, 0x300 },
unicodeslot=0x1FDD,
},
[0x1FDE]={
@@ -56779,7 +57989,7 @@ characters.data={
description="GREEK DASIA AND OXIA",
direction="on",
linebreak="al",
- specials={ "char", 0x1FFE, 0x0301 },
+ specials={ "char", 0x1FFE, 0x301 },
unicodeslot=0x1FDE,
},
[0x1FDF]={
@@ -56788,7 +57998,7 @@ characters.data={
description="GREEK DASIA AND PERISPOMENI",
direction="on",
linebreak="al",
- specials={ "char", 0x1FFE, 0x0342 },
+ specials={ "char", 0x1FFE, 0x342 },
unicodeslot=0x1FDF,
},
[0x1FE0]={
@@ -56797,8 +58007,8 @@ characters.data={
description="GREEK SMALL LETTER UPSILON WITH VRACHY",
direction="l",
linebreak="al",
- shcode=0x03C5,
- specials={ "char", 0x03C5, 0x0306 },
+ shcode=0x3C5,
+ specials={ "char", 0x3C5, 0x306 },
uccode=0x1FE8,
unicodeslot=0x1FE0,
},
@@ -56808,8 +58018,8 @@ characters.data={
description="GREEK SMALL LETTER UPSILON WITH MACRON",
direction="l",
linebreak="al",
- shcode=0x03C5,
- specials={ "char", 0x03C5, 0x0304 },
+ shcode=0x3C5,
+ specials={ "char", 0x3C5, 0x304 },
uccode=0x1FE9,
unicodeslot=0x1FE1,
},
@@ -56819,8 +58029,8 @@ characters.data={
description="GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA",
direction="l",
linebreak="al",
- shcode=0x03C5,
- specials={ "char", 0x03CB, 0x0300 },
+ shcode=0x3C5,
+ specials={ "char", 0x3CB, 0x300 },
unicodeslot=0x1FE2,
},
[0x1FE3]={
@@ -56829,8 +58039,8 @@ characters.data={
description="GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA",
direction="l",
linebreak="al",
- shcode=0x03C5,
- specials={ "char", 0x03B0 },
+ shcode=0x3C5,
+ specials={ "char", 0x3B0 },
unicodeslot=0x1FE3,
},
[0x1FE4]={
@@ -56839,8 +58049,8 @@ characters.data={
description="GREEK SMALL LETTER RHO WITH PSILI",
direction="l",
linebreak="al",
- shcode=0x03C1,
- specials={ "char", 0x03C1, 0x0313 },
+ shcode=0x3C1,
+ specials={ "char", 0x3C1, 0x313 },
unicodeslot=0x1FE4,
},
[0x1FE5]={
@@ -56849,8 +58059,8 @@ characters.data={
description="GREEK SMALL LETTER RHO WITH DASIA",
direction="l",
linebreak="al",
- shcode=0x03C1,
- specials={ "char", 0x03C1, 0x0314 },
+ shcode=0x3C1,
+ specials={ "char", 0x3C1, 0x314 },
uccode=0x1FEC,
unicodeslot=0x1FE5,
},
@@ -56860,8 +58070,8 @@ characters.data={
description="GREEK SMALL LETTER UPSILON WITH PERISPOMENI",
direction="l",
linebreak="al",
- shcode=0x03C5,
- specials={ "char", 0x03C5, 0x0342 },
+ shcode=0x3C5,
+ specials={ "char", 0x3C5, 0x342 },
unicodeslot=0x1FE6,
},
[0x1FE7]={
@@ -56870,8 +58080,8 @@ characters.data={
description="GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI",
direction="l",
linebreak="al",
- shcode=0x03C5,
- specials={ "char", 0x03CB, 0x0342 },
+ shcode=0x3C5,
+ specials={ "char", 0x3CB, 0x342 },
unicodeslot=0x1FE7,
},
[0x1FE8]={
@@ -56881,8 +58091,8 @@ characters.data={
direction="l",
lccode=0x1FE0,
linebreak="al",
- shcode=0x03A5,
- specials={ "char", 0x03A5, 0x0306 },
+ shcode=0x3A5,
+ specials={ "char", 0x3A5, 0x306 },
unicodeslot=0x1FE8,
},
[0x1FE9]={
@@ -56892,8 +58102,8 @@ characters.data={
direction="l",
lccode=0x1FE1,
linebreak="al",
- shcode=0x03A5,
- specials={ "char", 0x03A5, 0x0304 },
+ shcode=0x3A5,
+ specials={ "char", 0x3A5, 0x304 },
unicodeslot=0x1FE9,
},
[0x1FEA]={
@@ -56903,8 +58113,8 @@ characters.data={
direction="l",
lccode=0x1F7A,
linebreak="al",
- shcode=0x03A5,
- specials={ "char", 0x03A5, 0x0300 },
+ shcode=0x3A5,
+ specials={ "char", 0x3A5, 0x300 },
unicodeslot=0x1FEA,
},
[0x1FEB]={
@@ -56914,8 +58124,8 @@ characters.data={
direction="l",
lccode=0x1F7B,
linebreak="al",
- shcode=0x03A5,
- specials={ "char", 0x038E },
+ shcode=0x3A5,
+ specials={ "char", 0x38E },
unicodeslot=0x1FEB,
},
[0x1FEC]={
@@ -56925,8 +58135,8 @@ characters.data={
direction="l",
lccode=0x1FE5,
linebreak="al",
- shcode=0x03A1,
- specials={ "char", 0x03A1, 0x0314 },
+ shcode=0x3A1,
+ specials={ "char", 0x3A1, 0x314 },
unicodeslot=0x1FEC,
},
[0x1FED]={
@@ -56935,7 +58145,7 @@ characters.data={
description="GREEK DIALYTIKA AND VARIA",
direction="on",
linebreak="al",
- specials={ "char", 0x00A8, 0x0300 },
+ specials={ "char", 0xA8, 0x300 },
unicodeslot=0x1FED,
},
[0x1FEE]={
@@ -56944,7 +58154,7 @@ characters.data={
description="GREEK DIALYTIKA AND OXIA",
direction="on",
linebreak="al",
- specials={ "char", 0x0385 },
+ specials={ "char", 0x385 },
unicodeslot=0x1FEE,
},
[0x1FEF]={
@@ -56953,7 +58163,7 @@ characters.data={
description="GREEK VARIA",
direction="on",
linebreak="al",
- specials={ "char", 0x0060 },
+ specials={ "char", 0x60 },
unicodeslot=0x1FEF,
},
[0x1FF2]={
@@ -56962,8 +58172,8 @@ characters.data={
description="GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03C9,
- specials={ "char", 0x1F7C, 0x0345 },
+ shcode=0x3C9,
+ specials={ "char", 0x1F7C, 0x345 },
unicodeslot=0x1FF2,
},
[0x1FF3]={
@@ -56972,8 +58182,8 @@ characters.data={
description="GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03C9,
- specials={ "char", 0x03C9, 0x0345 },
+ shcode=0x3C9,
+ specials={ "char", 0x3C9, 0x345 },
uccode=0x1FFC,
unicodeslot=0x1FF3,
},
@@ -56983,8 +58193,8 @@ characters.data={
description="GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03C9,
- specials={ "char", 0x03CE, 0x0345 },
+ shcode=0x3C9,
+ specials={ "char", 0x3CE, 0x345 },
unicodeslot=0x1FF4,
},
[0x1FF6]={
@@ -56993,8 +58203,8 @@ characters.data={
description="GREEK SMALL LETTER OMEGA WITH PERISPOMENI",
direction="l",
linebreak="al",
- shcode=0x03C9,
- specials={ "char", 0x03C9, 0x0342 },
+ shcode=0x3C9,
+ specials={ "char", 0x3C9, 0x342 },
unicodeslot=0x1FF6,
},
[0x1FF7]={
@@ -57003,8 +58213,8 @@ characters.data={
description="GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI",
direction="l",
linebreak="al",
- shcode=0x03C9,
- specials={ "char", 0x1FF6, 0x0345 },
+ shcode=0x3C9,
+ specials={ "char", 0x1FF6, 0x345 },
unicodeslot=0x1FF7,
},
[0x1FF8]={
@@ -57014,8 +58224,8 @@ characters.data={
direction="l",
lccode=0x1F78,
linebreak="al",
- shcode=0x039F,
- specials={ "char", 0x039F, 0x0300 },
+ shcode=0x39F,
+ specials={ "char", 0x39F, 0x300 },
unicodeslot=0x1FF8,
},
[0x1FF9]={
@@ -57025,8 +58235,8 @@ characters.data={
direction="l",
lccode=0x1F79,
linebreak="al",
- shcode=0x039F,
- specials={ "char", 0x038C },
+ shcode=0x39F,
+ specials={ "char", 0x38C },
unicodeslot=0x1FF9,
},
[0x1FFA]={
@@ -57036,8 +58246,8 @@ characters.data={
direction="l",
lccode=0x1F7C,
linebreak="al",
- shcode=0x03A9,
- specials={ "char", 0x03A9, 0x0300 },
+ shcode=0x3A9,
+ specials={ "char", 0x3A9, 0x300 },
unicodeslot=0x1FFA,
},
[0x1FFB]={
@@ -57047,8 +58257,8 @@ characters.data={
direction="l",
lccode=0x1F7D,
linebreak="al",
- shcode=0x03A9,
- specials={ "char", 0x038F },
+ shcode=0x3A9,
+ specials={ "char", 0x38F },
unicodeslot=0x1FFB,
},
[0x1FFC]={
@@ -57058,8 +58268,8 @@ characters.data={
direction="l",
lccode=0x1FF3,
linebreak="al",
- shcode=0x03A9,
- specials={ "char", 0x03A9, 0x0345 },
+ shcode=0x3A9,
+ specials={ "char", 0x3A9, 0x345 },
unicodeslot=0x1FFC,
},
[0x1FFD]={
@@ -57068,7 +58278,7 @@ characters.data={
description="GREEK OXIA",
direction="on",
linebreak="bb",
- specials={ "char", 0x00B4 },
+ specials={ "char", 0xB4 },
unicodeslot=0x1FFD,
},
[0x1FFE]={
@@ -57077,7 +58287,7 @@ characters.data={
description="GREEK DASIA",
direction="on",
linebreak="al",
- specials={ "compat", 0x0020, 0x0314 },
+ specials={ "compat", 0x20, 0x314 },
unicodeslot=0x1FFE,
},
[0x2000]={
@@ -57103,7 +58313,7 @@ characters.data={
description="EN SPACE",
direction="ws",
linebreak="ba",
- specials={ "compat", 0x0020 },
+ specials={ "compat", 0x20 },
unicodeslot=0x2002,
},
[0x2003]={
@@ -57112,7 +58322,7 @@ characters.data={
description="EM SPACE",
direction="ws",
linebreak="ba",
- specials={ "compat", 0x0020 },
+ specials={ "compat", 0x20 },
unicodeslot=0x2003,
},
[0x2004]={
@@ -57121,7 +58331,7 @@ characters.data={
description="THREE-PER-EM SPACE",
direction="ws",
linebreak="ba",
- specials={ "compat", 0x0020 },
+ specials={ "compat", 0x20 },
unicodeslot=0x2004,
},
[0x2005]={
@@ -57130,7 +58340,7 @@ characters.data={
description="FOUR-PER-EM SPACE",
direction="ws",
linebreak="ba",
- specials={ "compat", 0x0020 },
+ specials={ "compat", 0x20 },
unicodeslot=0x2005,
},
[0x2006]={
@@ -57139,7 +58349,7 @@ characters.data={
description="SIX-PER-EM SPACE",
direction="ws",
linebreak="ba",
- specials={ "compat", 0x0020 },
+ specials={ "compat", 0x20 },
unicodeslot=0x2006,
},
[0x2007]={
@@ -57148,7 +58358,7 @@ characters.data={
description="FIGURE SPACE",
direction="ws",
linebreak="gl",
- specials={ "nobreak", 0x0020 },
+ specials={ "nobreak", 0x20 },
unicodeslot=0x2007,
},
[0x2008]={
@@ -57157,7 +58367,7 @@ characters.data={
description="PUNCTUATION SPACE",
direction="ws",
linebreak="ba",
- specials={ "compat", 0x0020 },
+ specials={ "compat", 0x20 },
unicodeslot=0x2008,
},
[0x2009]={
@@ -57166,7 +58376,7 @@ characters.data={
description="THIN SPACE",
direction="ws",
linebreak="ba",
- specials={ "compat", 0x0020 },
+ specials={ "compat", 0x20 },
unicodeslot=0x2009,
},
[0x200A]={
@@ -57175,7 +58385,7 @@ characters.data={
description="HAIR SPACE",
direction="ws",
linebreak="ba",
- specials={ "compat", 0x0020 },
+ specials={ "compat", 0x20 },
unicodeslot=0x200A,
},
[0x200B]={
@@ -57316,7 +58526,7 @@ characters.data={
description="DOUBLE LOW LINE",
direction="on",
linebreak="al",
- specials={ "compat", 0x0020, 0x0333 },
+ specials={ "compat", 0x20, 0x333 },
unicodeslot=0x2017,
},
[0x2018]={
@@ -57458,7 +58668,7 @@ characters.data={
description="ONE DOT LEADER",
direction="on",
linebreak="in",
- specials={ "compat", 0x002E },
+ specials={ "compat", 0x2E },
unicodeslot=0x2024,
},
[0x2025]={
@@ -57468,7 +58678,7 @@ characters.data={
description="TWO DOT LEADER",
direction="on",
linebreak="in",
- specials={ "compat", 0x002E, 0x002E },
+ specials={ "compat", 0x2E, 0x2E },
unicodeslot=0x2025,
},
[0x2026]={
@@ -57489,7 +58699,7 @@ characters.data={
name="dots",
},
},
- specials={ "compat", 0x002E, 0x002E, 0x002E },
+ specials={ "compat", 0x2E, 0x2E, 0x2E },
unicodeslot=0x2026,
},
[0x2027]={
@@ -57558,7 +58768,7 @@ characters.data={
description="NARROW NO-BREAK SPACE",
direction="cs",
linebreak="gl",
- specials={ "nobreak", 0x0020 },
+ specials={ "nobreak", 0x20 },
unicodeslot=0x202F,
},
[0x2030]={
@@ -57686,7 +58896,7 @@ characters.data={
description="DOUBLE EXCLAMATION MARK",
direction="on",
linebreak="ns",
- specials={ "compat", 0x0021, 0x0021 },
+ specials={ "compat", 0x21, 0x21 },
unicodeslot=0x203C,
variants={
[0xFE0E]="text style",
@@ -57704,7 +58914,7 @@ characters.data={
adobename="overline",
category="po",
cjkwd="a",
- comment=[[mathspec={ { class="topaccent", name="overbar" }, { class="botaccent", name="underbar" } }"]],
+ comment="mathspec={ { class=\"topaccent\", name=\"overbar\" }, { class=\"botaccent\", name=\"underbar\" } }\"",
description="OVERLINE",
direction="on",
linebreak="al",
@@ -57721,7 +58931,7 @@ characters.data={
},
},
mathstretch="h",
- specials={ "compat", 0x0020, 0x0305 },
+ specials={ "compat", 0x20, 0x305 },
unicodeslot=0x203E,
},
[0x203F]={
@@ -57800,7 +59010,7 @@ characters.data={
description="DOUBLE QUESTION MARK",
direction="on",
linebreak="ns",
- specials={ "compat", 0x003F, 0x003F },
+ specials={ "compat", 0x3F, 0x3F },
unicodeslot=0x2047,
},
[0x2048]={
@@ -57808,7 +59018,7 @@ characters.data={
description="QUESTION EXCLAMATION MARK",
direction="on",
linebreak="ns",
- specials={ "compat", 0x003F, 0x0021 },
+ specials={ "compat", 0x3F, 0x21 },
unicodeslot=0x2048,
},
[0x2049]={
@@ -57816,7 +59026,7 @@ characters.data={
description="EXCLAMATION QUESTION MARK",
direction="on",
linebreak="ns",
- specials={ "compat", 0x0021, 0x003F },
+ specials={ "compat", 0x21, 0x3F },
unicodeslot=0x2049,
variants={
[0xFE0E]="text style",
@@ -57979,7 +59189,7 @@ characters.data={
description="MEDIUM MATHEMATICAL SPACE",
direction="ws",
linebreak="ba",
- specials={ "compat", 0x0020 },
+ specials={ "compat", 0x20 },
unicodeslot=0x205F,
},
[0x2060]={
@@ -58019,6 +59229,38 @@ characters.data={
linebreak="al",
unicodeslot=0x2064,
},
+ [0x2066]={
+ arabic="u",
+ category="cf",
+ description="LEFT-TO-RIGHT ISOLATE",
+ direction="lri",
+ linebreak="cm",
+ unicodeslot=0x2066,
+ },
+ [0x2067]={
+ arabic="u",
+ category="cf",
+ description="RIGHT-TO-LEFT ISOLATE",
+ direction="rli",
+ linebreak="cm",
+ unicodeslot=0x2067,
+ },
+ [0x2068]={
+ arabic="u",
+ category="cf",
+ description="FIRST STRONG ISOLATE",
+ direction="fsi",
+ linebreak="cm",
+ unicodeslot=0x2068,
+ },
+ [0x2069]={
+ arabic="u",
+ category="cf",
+ description="POP DIRECTIONAL ISOLATE",
+ direction="pdi",
+ linebreak="cm",
+ unicodeslot=0x2069,
+ },
[0x206A]={
category="cf",
description="INHIBIT SYMMETRIC SWAPPING",
@@ -58067,7 +59309,7 @@ characters.data={
description="SUPERSCRIPT ZERO",
direction="en",
linebreak="al",
- specials={ "super", 0x0030 },
+ specials={ "super", 0x30 },
unicodeslot=0x2070,
},
[0x2071]={
@@ -58075,7 +59317,7 @@ characters.data={
description="SUPERSCRIPT LATIN SMALL LETTER I",
direction="l",
linebreak="al",
- specials={ "super", 0x0069 },
+ specials={ "super", 0x69 },
unicodeslot=0x2071,
},
[0x2074]={
@@ -58085,7 +59327,7 @@ characters.data={
description="SUPERSCRIPT FOUR",
direction="en",
linebreak="ai",
- specials={ "super", 0x0034 },
+ specials={ "super", 0x34 },
unicodeslot=0x2074,
},
[0x2075]={
@@ -58094,7 +59336,7 @@ characters.data={
description="SUPERSCRIPT FIVE",
direction="en",
linebreak="al",
- specials={ "super", 0x0035 },
+ specials={ "super", 0x35 },
unicodeslot=0x2075,
},
[0x2076]={
@@ -58103,7 +59345,7 @@ characters.data={
description="SUPERSCRIPT SIX",
direction="en",
linebreak="al",
- specials={ "super", 0x0036 },
+ specials={ "super", 0x36 },
unicodeslot=0x2076,
},
[0x2077]={
@@ -58112,7 +59354,7 @@ characters.data={
description="SUPERSCRIPT SEVEN",
direction="en",
linebreak="al",
- specials={ "super", 0x0037 },
+ specials={ "super", 0x37 },
unicodeslot=0x2077,
},
[0x2078]={
@@ -58121,7 +59363,7 @@ characters.data={
description="SUPERSCRIPT EIGHT",
direction="en",
linebreak="al",
- specials={ "super", 0x0038 },
+ specials={ "super", 0x38 },
unicodeslot=0x2078,
},
[0x2079]={
@@ -58130,7 +59372,7 @@ characters.data={
description="SUPERSCRIPT NINE",
direction="en",
linebreak="al",
- specials={ "super", 0x0039 },
+ specials={ "super", 0x39 },
unicodeslot=0x2079,
},
[0x207A]={
@@ -58141,7 +59383,7 @@ characters.data={
linebreak="al",
mathclass="binary",
mathname="positivesign",
- specials={ "super", 0x002B },
+ specials={ "super", 0x2B },
unicodeslot=0x207A,
},
[0x207B]={
@@ -58160,7 +59402,7 @@ characters.data={
description="SUPERSCRIPT EQUALS SIGN",
direction="on",
linebreak="al",
- specials={ "super", 0x003D },
+ specials={ "super", 0x3D },
unicodeslot=0x207C,
},
[0x207D]={
@@ -58170,8 +59412,8 @@ characters.data={
direction="on",
linebreak="op",
mirror=0x207E,
+ specials={ "super", 0x28 },
textclass="open",
- specials={ "super", 0x0028 },
unicodeslot=0x207D,
},
[0x207E]={
@@ -58181,8 +59423,8 @@ characters.data={
direction="on",
linebreak="cl",
mirror=0x207D,
+ specials={ "super", 0x29 },
textclass="close",
- specials={ "super", 0x0029 },
unicodeslot=0x207E,
},
[0x207F]={
@@ -58192,7 +59434,7 @@ characters.data={
description="SUPERSCRIPT LATIN SMALL LETTER N",
direction="l",
linebreak="ai",
- specials={ "super", 0x006E },
+ specials={ "super", 0x6E },
unicodeslot=0x207F,
},
[0x2080]={
@@ -58201,7 +59443,7 @@ characters.data={
description="SUBSCRIPT ZERO",
direction="en",
linebreak="al",
- specials={ "sub", 0x0030 },
+ specials={ "sub", 0x30 },
unicodeslot=0x2080,
},
[0x2081]={
@@ -58211,7 +59453,7 @@ characters.data={
description="SUBSCRIPT ONE",
direction="en",
linebreak="ai",
- specials={ "sub", 0x0031 },
+ specials={ "sub", 0x31 },
unicodeslot=0x2081,
},
[0x2082]={
@@ -58221,7 +59463,7 @@ characters.data={
description="SUBSCRIPT TWO",
direction="en",
linebreak="ai",
- specials={ "sub", 0x0032 },
+ specials={ "sub", 0x32 },
unicodeslot=0x2082,
},
[0x2083]={
@@ -58231,7 +59473,7 @@ characters.data={
description="SUBSCRIPT THREE",
direction="en",
linebreak="ai",
- specials={ "sub", 0x0033 },
+ specials={ "sub", 0x33 },
unicodeslot=0x2083,
},
[0x2084]={
@@ -58241,7 +59483,7 @@ characters.data={
description="SUBSCRIPT FOUR",
direction="en",
linebreak="ai",
- specials={ "sub", 0x0034 },
+ specials={ "sub", 0x34 },
unicodeslot=0x2084,
},
[0x2085]={
@@ -58250,7 +59492,7 @@ characters.data={
description="SUBSCRIPT FIVE",
direction="en",
linebreak="al",
- specials={ "sub", 0x0035 },
+ specials={ "sub", 0x35 },
unicodeslot=0x2085,
},
[0x2086]={
@@ -58259,7 +59501,7 @@ characters.data={
description="SUBSCRIPT SIX",
direction="en",
linebreak="al",
- specials={ "sub", 0x0036 },
+ specials={ "sub", 0x36 },
unicodeslot=0x2086,
},
[0x2087]={
@@ -58268,7 +59510,7 @@ characters.data={
description="SUBSCRIPT SEVEN",
direction="en",
linebreak="al",
- specials={ "sub", 0x0037 },
+ specials={ "sub", 0x37 },
unicodeslot=0x2087,
},
[0x2088]={
@@ -58277,7 +59519,7 @@ characters.data={
description="SUBSCRIPT EIGHT",
direction="en",
linebreak="al",
- specials={ "sub", 0x0038 },
+ specials={ "sub", 0x38 },
unicodeslot=0x2088,
},
[0x2089]={
@@ -58286,7 +59528,7 @@ characters.data={
description="SUBSCRIPT NINE",
direction="en",
linebreak="al",
- specials={ "sub", 0x0039 },
+ specials={ "sub", 0x39 },
unicodeslot=0x2089,
},
[0x208A]={
@@ -58294,7 +59536,7 @@ characters.data={
description="SUBSCRIPT PLUS SIGN",
direction="es",
linebreak="al",
- specials={ "sub", 0x002B },
+ specials={ "sub", 0x2B },
unicodeslot=0x208A,
},
[0x208B]={
@@ -58310,7 +59552,7 @@ characters.data={
description="SUBSCRIPT EQUALS SIGN",
direction="on",
linebreak="al",
- specials={ "sub", 0x003D },
+ specials={ "sub", 0x3D },
unicodeslot=0x208C,
},
[0x208D]={
@@ -58320,8 +59562,8 @@ characters.data={
direction="on",
linebreak="op",
mirror=0x208E,
+ specials={ "sub", 0x28 },
textclass="open",
- specials={ "sub", 0x0028 },
unicodeslot=0x208D,
},
[0x208E]={
@@ -58331,8 +59573,8 @@ characters.data={
direction="on",
linebreak="cl",
mirror=0x208D,
+ specials={ "sub", 0x29 },
textclass="close",
- specials={ "sub", 0x0029 },
unicodeslot=0x208E,
},
[0x2090]={
@@ -58340,7 +59582,7 @@ characters.data={
description="LATIN SUBSCRIPT SMALL LETTER A",
direction="l",
linebreak="al",
- specials={ "sub", 0x0061 },
+ specials={ "sub", 0x61 },
unicodeslot=0x2090,
},
[0x2091]={
@@ -58348,7 +59590,7 @@ characters.data={
description="LATIN SUBSCRIPT SMALL LETTER E",
direction="l",
linebreak="al",
- specials={ "sub", 0x0065 },
+ specials={ "sub", 0x65 },
unicodeslot=0x2091,
},
[0x2092]={
@@ -58356,7 +59598,7 @@ characters.data={
description="LATIN SUBSCRIPT SMALL LETTER O",
direction="l",
linebreak="al",
- specials={ "sub", 0x006F },
+ specials={ "sub", 0x6F },
unicodeslot=0x2092,
},
[0x2093]={
@@ -58364,7 +59606,7 @@ characters.data={
description="LATIN SUBSCRIPT SMALL LETTER X",
direction="l",
linebreak="al",
- specials={ "sub", 0x0078 },
+ specials={ "sub", 0x78 },
unicodeslot=0x2093,
},
[0x2094]={
@@ -58372,7 +59614,7 @@ characters.data={
description="LATIN SUBSCRIPT SMALL LETTER SCHWA",
direction="l",
linebreak="al",
- specials={ "sub", 0x0259 },
+ specials={ "sub", 0x259 },
unicodeslot=0x2094,
},
[0x2095]={
@@ -58380,7 +59622,7 @@ characters.data={
description="LATIN SUBSCRIPT SMALL LETTER H",
direction="l",
linebreak="al",
- specials={ "sub", 0x0068 },
+ specials={ "sub", 0x68 },
unicodeslot=0x2095,
},
[0x2096]={
@@ -58388,7 +59630,7 @@ characters.data={
description="LATIN SUBSCRIPT SMALL LETTER K",
direction="l",
linebreak="al",
- specials={ "sub", 0x006B },
+ specials={ "sub", 0x6B },
unicodeslot=0x2096,
},
[0x2097]={
@@ -58396,7 +59638,7 @@ characters.data={
description="LATIN SUBSCRIPT SMALL LETTER L",
direction="l",
linebreak="al",
- specials={ "sub", 0x006C },
+ specials={ "sub", 0x6C },
unicodeslot=0x2097,
},
[0x2098]={
@@ -58404,7 +59646,7 @@ characters.data={
description="LATIN SUBSCRIPT SMALL LETTER M",
direction="l",
linebreak="al",
- specials={ "sub", 0x006D },
+ specials={ "sub", 0x6D },
unicodeslot=0x2098,
},
[0x2099]={
@@ -58412,7 +59654,7 @@ characters.data={
description="LATIN SUBSCRIPT SMALL LETTER N",
direction="l",
linebreak="al",
- specials={ "sub", 0x006E },
+ specials={ "sub", 0x6E },
unicodeslot=0x2099,
},
[0x209A]={
@@ -58420,7 +59662,7 @@ characters.data={
description="LATIN SUBSCRIPT SMALL LETTER P",
direction="l",
linebreak="al",
- specials={ "sub", 0x0070 },
+ specials={ "sub", 0x70 },
unicodeslot=0x209A,
},
[0x209B]={
@@ -58428,7 +59670,7 @@ characters.data={
description="LATIN SUBSCRIPT SMALL LETTER S",
direction="l",
linebreak="al",
- specials={ "sub", 0x0073 },
+ specials={ "sub", 0x73 },
unicodeslot=0x209B,
},
[0x209C]={
@@ -58436,7 +59678,7 @@ characters.data={
description="LATIN SUBSCRIPT SMALL LETTER T",
direction="l",
linebreak="al",
- specials={ "sub", 0x0074 },
+ specials={ "sub", 0x74 },
unicodeslot=0x209C,
},
[0x20A0]={
@@ -58505,7 +59747,7 @@ characters.data={
description="RUPEE SIGN",
direction="et",
linebreak="pr",
- specials={ "compat", 0x0052, 0x0073 },
+ specials={ "compat", 0x52, 0x73 },
unicodeslot=0x20A8,
},
[0x20A9]={
@@ -58642,8 +59884,30 @@ characters.data={
linebreak="pr",
unicodeslot=0x20BA,
},
+ [0x20BB]={
+ category="sc",
+ description="NORDIC MARK SIGN",
+ direction="et",
+ linebreak="po",
+ unicodeslot=0x20BB,
+ },
+ [0x20BC]={
+ category="sc",
+ description="MANAT SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x20BC,
+ },
+ [0x20BD]={
+ category="sc",
+ description="RUBLE SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x20BD,
+ },
[0x20D0]={
category="mn",
+ combining=0xE6,
description="COMBINING LEFT HARPOON ABOVE",
direction="nsm",
linebreak="cm",
@@ -58651,6 +59915,7 @@ characters.data={
},
[0x20D1]={
category="mn",
+ combining=0xE6,
description="COMBINING RIGHT HARPOON ABOVE",
direction="nsm",
linebreak="cm",
@@ -58658,6 +59923,7 @@ characters.data={
},
[0x20D2]={
category="mn",
+ combining=0x1,
description="COMBINING LONG VERTICAL LINE OVERLAY",
direction="nsm",
linebreak="cm",
@@ -58665,6 +59931,7 @@ characters.data={
},
[0x20D3]={
category="mn",
+ combining=0x1,
description="COMBINING SHORT VERTICAL LINE OVERLAY",
direction="nsm",
linebreak="cm",
@@ -58672,6 +59939,7 @@ characters.data={
},
[0x20D4]={
category="mn",
+ combining=0xE6,
description="COMBINING ANTICLOCKWISE ARROW ABOVE",
direction="nsm",
linebreak="cm",
@@ -58679,6 +59947,7 @@ characters.data={
},
[0x20D5]={
category="mn",
+ combining=0xE6,
description="COMBINING CLOCKWISE ARROW ABOVE",
direction="nsm",
linebreak="cm",
@@ -58686,6 +59955,7 @@ characters.data={
},
[0x20D6]={
category="mn",
+ combining=0xE6,
description="COMBINING LEFT ARROW ABOVE",
direction="nsm",
linebreak="cm",
@@ -58693,6 +59963,7 @@ characters.data={
},
[0x20D7]={
category="mn",
+ combining=0xE6,
description="COMBINING RIGHT ARROW ABOVE",
direction="nsm",
linebreak="cm",
@@ -58702,6 +59973,7 @@ characters.data={
},
[0x20D8]={
category="mn",
+ combining=0x1,
description="COMBINING RING OVERLAY",
direction="nsm",
linebreak="cm",
@@ -58709,6 +59981,7 @@ characters.data={
},
[0x20D9]={
category="mn",
+ combining=0x1,
description="COMBINING CLOCKWISE RING OVERLAY",
direction="nsm",
linebreak="cm",
@@ -58716,6 +59989,7 @@ characters.data={
},
[0x20DA]={
category="mn",
+ combining=0x1,
description="COMBINING ANTICLOCKWISE RING OVERLAY",
direction="nsm",
linebreak="cm",
@@ -58723,6 +59997,7 @@ characters.data={
},
[0x20DB]={
category="mn",
+ combining=0xE6,
description="COMBINING THREE DOTS ABOVE",
direction="nsm",
linebreak="cm",
@@ -58732,6 +60007,7 @@ characters.data={
},
[0x20DC]={
category="mn",
+ combining=0xE6,
description="COMBINING FOUR DOTS ABOVE",
direction="nsm",
linebreak="cm",
@@ -58781,6 +60057,7 @@ characters.data={
},
[0x20E1]={
category="mn",
+ combining=0xE6,
description="COMBINING LEFT RIGHT ARROW ABOVE",
direction="nsm",
linebreak="cm",
@@ -58809,6 +60086,7 @@ characters.data={
},
[0x20E5]={
category="mn",
+ combining=0x1,
description="COMBINING REVERSE SOLIDUS OVERLAY",
direction="nsm",
linebreak="cm",
@@ -58816,6 +60094,7 @@ characters.data={
},
[0x20E6]={
category="mn",
+ combining=0x1,
description="COMBINING DOUBLE VERTICAL STROKE OVERLAY",
direction="nsm",
linebreak="cm",
@@ -58823,15 +60102,17 @@ characters.data={
},
[0x20E7]={
category="mn",
+ combining=0xE6,
description="COMBINING ANNUITY SYMBOL",
direction="nsm",
+ linebreak="cm",
mathclass="topaccent",
mathname="actuarial",
- linebreak="cm",
unicodeslot=0x20E7,
},
[0x20E8]={
category="mn",
+ combining=0xDC,
description="COMBINING TRIPLE UNDERDOT",
direction="nsm",
linebreak="cm",
@@ -58839,6 +60120,7 @@ characters.data={
},
[0x20E9]={
category="mn",
+ combining=0xE6,
description="COMBINING WIDE BRIDGE ABOVE",
direction="nsm",
linebreak="cm",
@@ -58847,6 +60129,7 @@ characters.data={
},
[0x20EA]={
category="mn",
+ combining=0x1,
description="COMBINING LEFTWARDS ARROW OVERLAY",
direction="nsm",
linebreak="cm",
@@ -58854,6 +60137,7 @@ characters.data={
},
[0x20EB]={
category="mn",
+ combining=0x1,
description="COMBINING LONG DOUBLE SOLIDUS OVERLAY",
direction="nsm",
linebreak="cm",
@@ -58861,6 +60145,7 @@ characters.data={
},
[0x20EC]={
category="mn",
+ combining=0xDC,
description="COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS",
direction="nsm",
linebreak="cm",
@@ -58868,6 +60153,7 @@ characters.data={
},
[0x20ED]={
category="mn",
+ combining=0xDC,
description="COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS",
direction="nsm",
linebreak="cm",
@@ -58875,6 +60161,7 @@ characters.data={
},
[0x20EE]={
category="mn",
+ combining=0xDC,
description="COMBINING LEFT ARROW BELOW",
direction="nsm",
linebreak="cm",
@@ -58882,6 +60169,7 @@ characters.data={
},
[0x20EF]={
category="mn",
+ combining=0xDC,
description="COMBINING RIGHT ARROW BELOW",
direction="nsm",
linebreak="cm",
@@ -58889,6 +60177,7 @@ characters.data={
},
[0x20F0]={
category="mn",
+ combining=0xE6,
description="COMBINING ASTERISK ABOVE",
direction="nsm",
linebreak="cm",
@@ -58899,7 +60188,7 @@ characters.data={
description="ACCOUNT OF",
direction="on",
linebreak="al",
- specials={ "compat", 0x0061, 0x002F, 0x0063 },
+ specials={ "compat", 0x61, 0x2F, 0x63 },
unicodeslot=0x2100,
},
[0x2101]={
@@ -58907,7 +60196,7 @@ characters.data={
description="ADDRESSED TO THE SUBJECT",
direction="on",
linebreak="al",
- specials={ "compat", 0x0061, 0x002F, 0x0073 },
+ specials={ "compat", 0x61, 0x2F, 0x73 },
unicodeslot=0x2101,
},
[0x2102]={
@@ -58917,7 +60206,7 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="complexes",
- specials={ "font", 0x0043 },
+ specials={ "font", 0x43 },
unicodeslot=0x2102,
},
[0x2103]={
@@ -58928,7 +60217,7 @@ characters.data={
description="DEGREE CELSIUS",
direction="on",
linebreak="po",
- specials={ "compat", 0x00B0, 0x0043 },
+ specials={ "compat", 0xB0, 0x43 },
unicodeslot=0x2103,
},
[0x2104]={
@@ -58945,7 +60234,7 @@ characters.data={
description="CARE OF",
direction="on",
linebreak="ai",
- specials={ "compat", 0x0063, 0x002F, 0x006F },
+ specials={ "compat", 0x63, 0x2F, 0x6F },
unicodeslot=0x2105,
},
[0x2106]={
@@ -58953,7 +60242,7 @@ characters.data={
description="CADA UNA",
direction="on",
linebreak="al",
- specials={ "compat", 0x0063, 0x002F, 0x0075 },
+ specials={ "compat", 0x63, 0x2F, 0x75 },
unicodeslot=0x2106,
},
[0x2107]={
@@ -58963,7 +60252,7 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="Eulerconst",
- specials={ "compat", 0x0190 },
+ specials={ "compat", 0x190 },
unicodeslot=0x2107,
},
[0x2108]={
@@ -58980,7 +60269,7 @@ characters.data={
description="DEGREE FAHRENHEIT",
direction="on",
linebreak="po",
- specials={ "compat", 0x00B0, 0x0046 },
+ specials={ "compat", 0xB0, 0x46 },
unicodeslot=0x2109,
},
[0x210A]={
@@ -58988,7 +60277,7 @@ characters.data={
description="SCRIPT SMALL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0067 },
+ specials={ "font", 0x67 },
unicodeslot=0x210A,
},
[0x210B]={
@@ -58996,7 +60285,7 @@ characters.data={
description="SCRIPT CAPITAL H",
direction="l",
linebreak="al",
- specials={ "font", 0x0048 },
+ specials={ "font", 0x48 },
unicodeslot=0x210B,
},
[0x210C]={
@@ -59004,7 +60293,7 @@ characters.data={
description="BLACK-LETTER CAPITAL H",
direction="l",
linebreak="al",
- specials={ "font", 0x0048 },
+ specials={ "font", 0x48 },
unicodeslot=0x210C,
},
[0x210D]={
@@ -59012,7 +60301,7 @@ characters.data={
description="DOUBLE-STRUCK CAPITAL H",
direction="l",
linebreak="al",
- specials={ "font", 0x0048 },
+ specials={ "font", 0x48 },
unicodeslot=0x210D,
},
[0x210E]={
@@ -59022,7 +60311,7 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="Plankconst",
- specials={ "font", 0x0068 },
+ specials={ "font", 0x68 },
unicodeslot=0x210E,
},
[0x210F]={
@@ -59040,7 +60329,7 @@ characters.data={
name="hbar",
},
},
- specials={ "font", 0x0127 },
+ specials={ "font", 0x127 },
unicodeslot=0x210F,
},
[0x2110]={
@@ -59048,7 +60337,7 @@ characters.data={
description="SCRIPT CAPITAL I",
direction="l",
linebreak="al",
- specials={ "font", 0x0049 },
+ specials={ "font", 0x49 },
unicodeslot=0x2110,
},
[0x2111]={
@@ -59059,7 +60348,7 @@ characters.data={
linebreak="al",
mathclass="default",
mathname="Im",
- specials={ "font", 0x0049 },
+ specials={ "font", 0x49 },
unicodeslot=0x2111,
},
[0x2112]={
@@ -59067,7 +60356,7 @@ characters.data={
description="SCRIPT CAPITAL L",
direction="l",
linebreak="al",
- specials={ "font", 0x004C },
+ specials={ "font", 0x4C },
unicodeslot=0x2112,
},
[0x2113]={
@@ -59079,7 +60368,7 @@ characters.data={
linebreak="ai",
mathclass="default",
mathname="ell",
- specials={ "font", 0x006C },
+ specials={ "font", 0x6C },
unicodeslot=0x2113,
},
[0x2114]={
@@ -59096,7 +60385,7 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="naturalnumbers",
- specials={ "font", 0x004E },
+ specials={ "font", 0x4E },
unicodeslot=0x2115,
},
[0x2116]={
@@ -59107,7 +60396,7 @@ characters.data={
description="NUMERO SIGN",
direction="on",
linebreak="pr",
- specials={ "compat", 0x004E, 0x006F },
+ specials={ "compat", 0x4E, 0x6F },
unicodeslot=0x2116,
},
[0x2117]={
@@ -59135,7 +60424,7 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="primes",
- specials={ "font", 0x0050 },
+ specials={ "font", 0x50 },
unicodeslot=0x2119,
},
[0x211A]={
@@ -59145,7 +60434,7 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="rationals",
- specials={ "font", 0x0051 },
+ specials={ "font", 0x51 },
unicodeslot=0x211A,
},
[0x211B]={
@@ -59153,7 +60442,7 @@ characters.data={
description="SCRIPT CAPITAL R",
direction="l",
linebreak="al",
- specials={ "font", 0x0052 },
+ specials={ "font", 0x52 },
unicodeslot=0x211B,
},
[0x211C]={
@@ -59164,7 +60453,7 @@ characters.data={
linebreak="al",
mathclass="default",
mathname="Re",
- specials={ "font", 0x0052 },
+ specials={ "font", 0x52 },
unicodeslot=0x211C,
},
[0x211D]={
@@ -59174,7 +60463,7 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="reals",
- specials={ "font", 0x0052 },
+ specials={ "font", 0x52 },
unicodeslot=0x211D,
},
[0x211E]={
@@ -59197,7 +60486,7 @@ characters.data={
description="SERVICE MARK",
direction="on",
linebreak="al",
- specials={ "super", 0x0053, 0x004D },
+ specials={ "super", 0x53, 0x4D },
unicodeslot=0x2120,
},
[0x2121]={
@@ -59207,7 +60496,7 @@ characters.data={
description="TELEPHONE SIGN",
direction="on",
linebreak="ai",
- specials={ "compat", 0x0054, 0x0045, 0x004C },
+ specials={ "compat", 0x54, 0x45, 0x4C },
unicodeslot=0x2121,
},
[0x2122]={
@@ -59218,7 +60507,7 @@ characters.data={
description="TRADE MARK SIGN",
direction="on",
linebreak="ai",
- specials={ "super", 0x0054, 0x004D },
+ specials={ "super", 0x54, 0x4D },
unicodeslot=0x2122,
},
[0x2123]={
@@ -59235,7 +60524,7 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="integers",
- specials={ "font", 0x005A },
+ specials={ "font", 0x5A },
unicodeslot=0x2124,
},
[0x2125]={
@@ -59253,11 +60542,11 @@ characters.data={
contextname="textohm",
description="OHM SIGN",
direction="l",
- lccode=0x03C9,
+ lccode=0x3C9,
linebreak="al",
mathclass="variable",
mathname="ohm",
- specials={ "char", 0x03A9 },
+ specials={ "char", 0x3A9 },
unicodeslot=0x2126,
},
[0x2127]={
@@ -59275,7 +60564,7 @@ characters.data={
description="BLACK-LETTER CAPITAL Z",
direction="l",
linebreak="al",
- specials={ "font", 0x005A },
+ specials={ "font", 0x5A },
unicodeslot=0x2128,
},
[0x2129]={
@@ -59292,9 +60581,9 @@ characters.data={
contextname="textkelvin",
description="KELVIN SIGN",
direction="l",
- lccode=0x006B,
+ lccode=0x6B,
linebreak="al",
- specials={ "char", 0x004B },
+ specials={ "char", 0x4B },
unicodeslot=0x212A,
},
[0x212B]={
@@ -59304,11 +60593,11 @@ characters.data={
contextname="textAngstrom",
description="ANGSTROM SIGN",
direction="l",
- lccode=0x00E5,
+ lccode=0xE5,
linebreak="ai",
mathclass="variable",
mathname="Angstrom",
- specials={ "char", 0x00C5 },
+ specials={ "char", 0xC5 },
unicodeslot=0x212B,
},
[0x212C]={
@@ -59316,7 +60605,7 @@ characters.data={
description="SCRIPT CAPITAL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0042 },
+ specials={ "font", 0x42 },
unicodeslot=0x212C,
},
[0x212D]={
@@ -59324,7 +60613,7 @@ characters.data={
description="BLACK-LETTER CAPITAL C",
direction="l",
linebreak="al",
- specials={ "font", 0x0043 },
+ specials={ "font", 0x43 },
unicodeslot=0x212D,
},
[0x212E]={
@@ -59340,7 +60629,7 @@ characters.data={
description="SCRIPT SMALL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0065 },
+ specials={ "font", 0x65 },
unicodeslot=0x212F,
},
[0x2130]={
@@ -59348,7 +60637,7 @@ characters.data={
description="SCRIPT CAPITAL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0045 },
+ specials={ "font", 0x45 },
unicodeslot=0x2130,
},
[0x2131]={
@@ -59356,7 +60645,7 @@ characters.data={
description="SCRIPT CAPITAL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0046 },
+ specials={ "font", 0x46 },
unicodeslot=0x2131,
},
[0x2132]={
@@ -59374,7 +60663,7 @@ characters.data={
description="SCRIPT CAPITAL M",
direction="l",
linebreak="al",
- specials={ "font", 0x004D },
+ specials={ "font", 0x4D },
unicodeslot=0x2133,
},
[0x2134]={
@@ -59382,7 +60671,7 @@ characters.data={
description="SCRIPT SMALL O",
direction="l",
linebreak="al",
- specials={ "font", 0x006F },
+ specials={ "font", 0x6F },
unicodeslot=0x2134,
},
[0x2135]={
@@ -59393,7 +60682,7 @@ characters.data={
linebreak="al",
mathclass="default",
mathname="aleph",
- specials={ "compat", 0x05D0 },
+ specials={ "compat", 0x5D0 },
unicodeslot=0x2135,
},
[0x2136]={
@@ -59403,7 +60692,7 @@ characters.data={
linebreak="al",
mathclass="default",
mathname="beth",
- specials={ "compat", 0x05D1 },
+ specials={ "compat", 0x5D1 },
unicodeslot=0x2136,
},
[0x2137]={
@@ -59413,7 +60702,7 @@ characters.data={
linebreak="al",
mathclass="default",
mathname="gimel",
- specials={ "compat", 0x05D2 },
+ specials={ "compat", 0x5D2 },
unicodeslot=0x2137,
},
[0x2138]={
@@ -59423,7 +60712,7 @@ characters.data={
linebreak="al",
mathclass="default",
mathname="daleth",
- specials={ "compat", 0x05D3 },
+ specials={ "compat", 0x5D3 },
unicodeslot=0x2138,
},
[0x2139]={
@@ -59431,7 +60720,7 @@ characters.data={
description="INFORMATION SOURCE",
direction="l",
linebreak="al",
- specials={ "font", 0x0069 },
+ specials={ "font", 0x69 },
unicodeslot=0x2139,
variants={
[0xFE0E]="text style",
@@ -59450,7 +60739,7 @@ characters.data={
description="FACSIMILE SIGN",
direction="on",
linebreak="al",
- specials={ "compat", 0x0046, 0x0041, 0x0058 },
+ specials={ "compat", 0x46, 0x41, 0x58 },
unicodeslot=0x213B,
},
[0x213C]={
@@ -59458,7 +60747,7 @@ characters.data={
description="DOUBLE-STRUCK SMALL PI",
direction="l",
linebreak="al",
- specials={ "font", 0x03C0 },
+ specials={ "font", 0x3C0 },
unicodeslot=0x213C,
},
[0x213D]={
@@ -59466,7 +60755,7 @@ characters.data={
description="DOUBLE-STRUCK SMALL GAMMA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B3 },
+ specials={ "font", 0x3B3 },
unicodeslot=0x213D,
},
[0x213E]={
@@ -59474,7 +60763,7 @@ characters.data={
description="DOUBLE-STRUCK CAPITAL GAMMA",
direction="l",
linebreak="al",
- specials={ "font", 0x0393 },
+ specials={ "font", 0x393 },
unicodeslot=0x213E,
},
[0x213F]={
@@ -59482,7 +60771,7 @@ characters.data={
description="DOUBLE-STRUCK CAPITAL PI",
direction="l",
linebreak="al",
- specials={ "font", 0x03A0 },
+ specials={ "font", 0x3A0 },
unicodeslot=0x213F,
},
[0x2140]={
@@ -59536,7 +60825,7 @@ characters.data={
linebreak="al",
mathclass="nothing",
mathname="differentialD",
- specials={ "font", 0x0044 },
+ specials={ "font", 0x44 },
unicodeslot=0x2145,
},
[0x2146]={
@@ -59546,7 +60835,7 @@ characters.data={
linebreak="al",
mathclass="nothing",
mathname="differentiald",
- specials={ "font", 0x0064 },
+ specials={ "font", 0x64 },
unicodeslot=0x2146,
},
[0x2147]={
@@ -59556,7 +60845,7 @@ characters.data={
linebreak="al",
mathclass="nothing",
mathname="exponentiale",
- specials={ "font", 0x0065 },
+ specials={ "font", 0x65 },
unicodeslot=0x2147,
},
[0x2148]={
@@ -59566,7 +60855,7 @@ characters.data={
linebreak="al",
mathclass="nothing",
mathname="imaginaryi",
- specials={ "font", 0x0069 },
+ specials={ "font", 0x69 },
unicodeslot=0x2148,
},
[0x2149]={
@@ -59576,7 +60865,7 @@ characters.data={
linebreak="al",
mathclass="nothing",
mathname="imaginaryj",
- specials={ "font", 0x006A },
+ specials={ "font", 0x6A },
unicodeslot=0x2149,
},
[0x214A]={
@@ -59631,7 +60920,7 @@ characters.data={
description="VULGAR FRACTION ONE SEVENTH",
direction="on",
linebreak="al",
- specials={ "fraction", 0x0031, 0x2044, 0x0037 },
+ specials={ "fraction", 0x31, 0x2044, 0x37 },
unicodeslot=0x2150,
},
[0x2151]={
@@ -59639,7 +60928,7 @@ characters.data={
description="VULGAR FRACTION ONE NINTH",
direction="on",
linebreak="al",
- specials={ "fraction", 0x0031, 0x2044, 0x0039 },
+ specials={ "fraction", 0x31, 0x2044, 0x39 },
unicodeslot=0x2151,
},
[0x2152]={
@@ -59647,7 +60936,7 @@ characters.data={
description="VULGAR FRACTION ONE TENTH",
direction="on",
linebreak="al",
- specials={ "fraction", 0x0031, 0x2044, 0x0031, 0x0030 },
+ specials={ "fraction", 0x31, 0x2044, 0x31, 0x30 },
unicodeslot=0x2152,
},
[0x2153]={
@@ -59658,7 +60947,7 @@ characters.data={
description="VULGAR FRACTION ONE THIRD",
direction="on",
linebreak="al",
- specials={ "fraction", 0x0031, 0x2044, 0x0033 },
+ specials={ "fraction", 0x31, 0x2044, 0x33 },
unicodeslot=0x2153,
},
[0x2154]={
@@ -59669,7 +60958,7 @@ characters.data={
description="VULGAR FRACTION TWO THIRDS",
direction="on",
linebreak="ai",
- specials={ "fraction", 0x0032, 0x2044, 0x0033 },
+ specials={ "fraction", 0x32, 0x2044, 0x33 },
unicodeslot=0x2154,
},
[0x2155]={
@@ -59678,7 +60967,7 @@ characters.data={
description="VULGAR FRACTION ONE FIFTH",
direction="on",
linebreak="ai",
- specials={ "fraction", 0x0031, 0x2044, 0x0035 },
+ specials={ "fraction", 0x31, 0x2044, 0x35 },
unicodeslot=0x2155,
},
[0x2156]={
@@ -59687,7 +60976,7 @@ characters.data={
description="VULGAR FRACTION TWO FIFTHS",
direction="on",
linebreak="al",
- specials={ "fraction", 0x0032, 0x2044, 0x0035 },
+ specials={ "fraction", 0x32, 0x2044, 0x35 },
unicodeslot=0x2156,
},
[0x2157]={
@@ -59696,7 +60985,7 @@ characters.data={
description="VULGAR FRACTION THREE FIFTHS",
direction="on",
linebreak="al",
- specials={ "fraction", 0x0033, 0x2044, 0x0035 },
+ specials={ "fraction", 0x33, 0x2044, 0x35 },
unicodeslot=0x2157,
},
[0x2158]={
@@ -59705,7 +60994,7 @@ characters.data={
description="VULGAR FRACTION FOUR FIFTHS",
direction="on",
linebreak="al",
- specials={ "fraction", 0x0034, 0x2044, 0x0035 },
+ specials={ "fraction", 0x34, 0x2044, 0x35 },
unicodeslot=0x2158,
},
[0x2159]={
@@ -59714,7 +61003,7 @@ characters.data={
description="VULGAR FRACTION ONE SIXTH",
direction="on",
linebreak="al",
- specials={ "fraction", 0x0031, 0x2044, 0x0036 },
+ specials={ "fraction", 0x31, 0x2044, 0x36 },
unicodeslot=0x2159,
},
[0x215A]={
@@ -59723,7 +61012,7 @@ characters.data={
description="VULGAR FRACTION FIVE SIXTHS",
direction="on",
linebreak="al",
- specials={ "fraction", 0x0035, 0x2044, 0x0036 },
+ specials={ "fraction", 0x35, 0x2044, 0x36 },
unicodeslot=0x215A,
},
[0x215B]={
@@ -59734,7 +61023,7 @@ characters.data={
description="VULGAR FRACTION ONE EIGHTH",
direction="on",
linebreak="ai",
- specials={ "fraction", 0x0031, 0x2044, 0x0038 },
+ specials={ "fraction", 0x31, 0x2044, 0x38 },
unicodeslot=0x215B,
},
[0x215C]={
@@ -59745,7 +61034,7 @@ characters.data={
description="VULGAR FRACTION THREE EIGHTHS",
direction="on",
linebreak="al",
- specials={ "fraction", 0x0033, 0x2044, 0x0038 },
+ specials={ "fraction", 0x33, 0x2044, 0x38 },
unicodeslot=0x215C,
},
[0x215D]={
@@ -59756,7 +61045,7 @@ characters.data={
description="VULGAR FRACTION FIVE EIGHTHS",
direction="on",
linebreak="al",
- specials={ "fraction", 0x0035, 0x2044, 0x0038 },
+ specials={ "fraction", 0x35, 0x2044, 0x38 },
unicodeslot=0x215D,
},
[0x215E]={
@@ -59767,7 +61056,7 @@ characters.data={
description="VULGAR FRACTION SEVEN EIGHTHS",
direction="on",
linebreak="ai",
- specials={ "fraction", 0x0037, 0x2044, 0x0038 },
+ specials={ "fraction", 0x37, 0x2044, 0x38 },
unicodeslot=0x215E,
},
[0x215F]={
@@ -59775,7 +61064,7 @@ characters.data={
description="FRACTION NUMERATOR ONE",
direction="on",
linebreak="al",
- specials={ "fraction", 0x0031, 0x2044 },
+ specials={ "fraction", 0x31, 0x2044 },
unicodeslot=0x215F,
},
[0x2160]={
@@ -59787,7 +61076,7 @@ characters.data={
direction="l",
lccode=0x2170,
linebreak="ai",
- specials={ "compat", 0x0049 },
+ specials={ "compat", 0x49 },
unicodeslot=0x2160,
},
[0x2161]={
@@ -59799,7 +61088,7 @@ characters.data={
direction="l",
lccode=0x2171,
linebreak="ai",
- specials={ "compat", 0x0049, 0x0049 },
+ specials={ "compat", 0x49, 0x49 },
unicodeslot=0x2161,
},
[0x2162]={
@@ -59811,7 +61100,7 @@ characters.data={
direction="l",
lccode=0x2172,
linebreak="ai",
- specials={ "compat", 0x0049, 0x0049, 0x0049 },
+ specials={ "compat", 0x49, 0x49, 0x49 },
unicodeslot=0x2162,
},
[0x2163]={
@@ -59823,7 +61112,7 @@ characters.data={
direction="l",
lccode=0x2173,
linebreak="ai",
- specials={ "compat", 0x0049, 0x0056 },
+ specials={ "compat", 0x49, 0x56 },
unicodeslot=0x2163,
},
[0x2164]={
@@ -59835,7 +61124,7 @@ characters.data={
direction="l",
lccode=0x2174,
linebreak="ai",
- specials={ "compat", 0x0056 },
+ specials={ "compat", 0x56 },
unicodeslot=0x2164,
},
[0x2165]={
@@ -59847,7 +61136,7 @@ characters.data={
direction="l",
lccode=0x2175,
linebreak="ai",
- specials={ "compat", 0x0056, 0x0049 },
+ specials={ "compat", 0x56, 0x49 },
unicodeslot=0x2165,
},
[0x2166]={
@@ -59859,7 +61148,7 @@ characters.data={
direction="l",
lccode=0x2176,
linebreak="ai",
- specials={ "compat", 0x0056, 0x0049, 0x0049 },
+ specials={ "compat", 0x56, 0x49, 0x49 },
unicodeslot=0x2166,
},
[0x2167]={
@@ -59871,7 +61160,7 @@ characters.data={
direction="l",
lccode=0x2177,
linebreak="ai",
- specials={ "compat", 0x0056, 0x0049, 0x0049, 0x0049 },
+ specials={ "compat", 0x56, 0x49, 0x49, 0x49 },
unicodeslot=0x2167,
},
[0x2168]={
@@ -59883,7 +61172,7 @@ characters.data={
direction="l",
lccode=0x2178,
linebreak="ai",
- specials={ "compat", 0x0049, 0x0058 },
+ specials={ "compat", 0x49, 0x58 },
unicodeslot=0x2168,
},
[0x2169]={
@@ -59895,7 +61184,7 @@ characters.data={
direction="l",
lccode=0x2179,
linebreak="ai",
- specials={ "compat", 0x0058 },
+ specials={ "compat", 0x58 },
unicodeslot=0x2169,
},
[0x216A]={
@@ -59907,7 +61196,7 @@ characters.data={
direction="l",
lccode=0x217A,
linebreak="ai",
- specials={ "compat", 0x0058, 0x0049 },
+ specials={ "compat", 0x58, 0x49 },
unicodeslot=0x216A,
},
[0x216B]={
@@ -59919,7 +61208,7 @@ characters.data={
direction="l",
lccode=0x217B,
linebreak="ai",
- specials={ "compat", 0x0058, 0x0049, 0x0049 },
+ specials={ "compat", 0x58, 0x49, 0x49 },
unicodeslot=0x216B,
},
[0x216C]={
@@ -59929,7 +61218,7 @@ characters.data={
direction="l",
lccode=0x217C,
linebreak="al",
- specials={ "compat", 0x004C },
+ specials={ "compat", 0x4C },
unicodeslot=0x216C,
},
[0x216D]={
@@ -59939,7 +61228,7 @@ characters.data={
direction="l",
lccode=0x217D,
linebreak="al",
- specials={ "compat", 0x0043 },
+ specials={ "compat", 0x43 },
unicodeslot=0x216D,
},
[0x216E]={
@@ -59949,7 +61238,7 @@ characters.data={
direction="l",
lccode=0x217E,
linebreak="al",
- specials={ "compat", 0x0044 },
+ specials={ "compat", 0x44 },
unicodeslot=0x216E,
},
[0x216F]={
@@ -59959,7 +61248,7 @@ characters.data={
direction="l",
lccode=0x217F,
linebreak="al",
- specials={ "compat", 0x004D },
+ specials={ "compat", 0x4D },
unicodeslot=0x216F,
},
[0x2170]={
@@ -59970,7 +61259,7 @@ characters.data={
description="SMALL ROMAN NUMERAL ONE",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0069 },
+ specials={ "compat", 0x69 },
uccode=0x2160,
unicodeslot=0x2170,
},
@@ -59982,7 +61271,7 @@ characters.data={
description="SMALL ROMAN NUMERAL TWO",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0069, 0x0069 },
+ specials={ "compat", 0x69, 0x69 },
uccode=0x2161,
unicodeslot=0x2171,
},
@@ -59994,7 +61283,7 @@ characters.data={
description="SMALL ROMAN NUMERAL THREE",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0069, 0x0069, 0x0069 },
+ specials={ "compat", 0x69, 0x69, 0x69 },
uccode=0x2162,
unicodeslot=0x2172,
},
@@ -60006,7 +61295,7 @@ characters.data={
description="SMALL ROMAN NUMERAL FOUR",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0069, 0x0076 },
+ specials={ "compat", 0x69, 0x76 },
uccode=0x2163,
unicodeslot=0x2173,
},
@@ -60018,7 +61307,7 @@ characters.data={
description="SMALL ROMAN NUMERAL FIVE",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0076 },
+ specials={ "compat", 0x76 },
uccode=0x2164,
unicodeslot=0x2174,
},
@@ -60030,7 +61319,7 @@ characters.data={
description="SMALL ROMAN NUMERAL SIX",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0076, 0x0069 },
+ specials={ "compat", 0x76, 0x69 },
uccode=0x2165,
unicodeslot=0x2175,
},
@@ -60042,7 +61331,7 @@ characters.data={
description="SMALL ROMAN NUMERAL SEVEN",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0076, 0x0069, 0x0069 },
+ specials={ "compat", 0x76, 0x69, 0x69 },
uccode=0x2166,
unicodeslot=0x2176,
},
@@ -60054,7 +61343,7 @@ characters.data={
description="SMALL ROMAN NUMERAL EIGHT",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0076, 0x0069, 0x0069, 0x0069 },
+ specials={ "compat", 0x76, 0x69, 0x69, 0x69 },
uccode=0x2167,
unicodeslot=0x2177,
},
@@ -60066,7 +61355,7 @@ characters.data={
description="SMALL ROMAN NUMERAL NINE",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0069, 0x0078 },
+ specials={ "compat", 0x69, 0x78 },
uccode=0x2168,
unicodeslot=0x2178,
},
@@ -60078,7 +61367,7 @@ characters.data={
description="SMALL ROMAN NUMERAL TEN",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0078 },
+ specials={ "compat", 0x78 },
uccode=0x2169,
unicodeslot=0x2179,
},
@@ -60089,7 +61378,7 @@ characters.data={
description="SMALL ROMAN NUMERAL ELEVEN",
direction="l",
linebreak="al",
- specials={ "compat", 0x0078, 0x0069 },
+ specials={ "compat", 0x78, 0x69 },
uccode=0x216A,
unicodeslot=0x217A,
},
@@ -60100,7 +61389,7 @@ characters.data={
description="SMALL ROMAN NUMERAL TWELVE",
direction="l",
linebreak="al",
- specials={ "compat", 0x0078, 0x0069, 0x0069 },
+ specials={ "compat", 0x78, 0x69, 0x69 },
uccode=0x216B,
unicodeslot=0x217B,
},
@@ -60110,7 +61399,7 @@ characters.data={
description="SMALL ROMAN NUMERAL FIFTY",
direction="l",
linebreak="al",
- specials={ "compat", 0x006C },
+ specials={ "compat", 0x6C },
uccode=0x216C,
unicodeslot=0x217C,
},
@@ -60120,7 +61409,7 @@ characters.data={
description="SMALL ROMAN NUMERAL ONE HUNDRED",
direction="l",
linebreak="al",
- specials={ "compat", 0x0063 },
+ specials={ "compat", 0x63 },
uccode=0x216D,
unicodeslot=0x217D,
},
@@ -60130,7 +61419,7 @@ characters.data={
description="SMALL ROMAN NUMERAL FIVE HUNDRED",
direction="l",
linebreak="al",
- specials={ "compat", 0x0064 },
+ specials={ "compat", 0x64 },
uccode=0x216E,
unicodeslot=0x217E,
},
@@ -60140,7 +61429,7 @@ characters.data={
description="SMALL ROMAN NUMERAL ONE THOUSAND",
direction="l",
linebreak="al",
- specials={ "compat", 0x006D },
+ specials={ "compat", 0x6D },
uccode=0x216F,
unicodeslot=0x217F,
},
@@ -60215,7 +61504,7 @@ characters.data={
description="VULGAR FRACTION ZERO THIRDS",
direction="on",
linebreak="ai",
- specials={ "fraction", 0x0030, 0x2044, 0x0033 },
+ specials={ "fraction", 0x30, 0x2044, 0x33 },
unicodeslot=0x2189,
},
[0x2190]={
@@ -60402,7 +61691,7 @@ characters.data={
mathclass="relation",
mathextensible="l",
mathname="nleftarrow",
- specials={ "char", 0x2190, 0x0338 },
+ specials={ "char", 0x2190, 0x338 },
unicodeslot=0x219A,
},
[0x219B]={
@@ -60413,7 +61702,7 @@ characters.data={
mathclass="relation",
mathextensible="r",
mathname="nrightarrow",
- specials={ "char", 0x2192, 0x0338 },
+ specials={ "char", 0x2192, 0x338 },
unicodeslot=0x219B,
},
[0x219C]={
@@ -60618,7 +61907,7 @@ characters.data={
mathclass="relation",
mathextensible="h",
mathname="nleftrightarrow",
- specials={ "char", 0x2194, 0x0338 },
+ specials={ "char", 0x2194, 0x338 },
unicodeslot=0x21AE,
},
[0x21AF]={
@@ -60962,7 +62251,7 @@ characters.data={
mathclass="relation",
mathextensible="l",
mathname="nLeftarrow",
- specials={ "char", 0x21D0, 0x0338 },
+ specials={ "char", 0x21D0, 0x338 },
unicodeslot=0x21CD,
},
[0x21CE]={
@@ -60973,7 +62262,7 @@ characters.data={
mathclass="relation",
mathextensible="h",
mathname="nLeftrightarrow",
- specials={ "char", 0x21D4, 0x0338 },
+ specials={ "char", 0x21D4, 0x338 },
unicodeslot=0x21CE,
},
[0x21CF]={
@@ -60985,7 +62274,7 @@ characters.data={
mathclass="relation",
mathextensible="r",
mathname="nRightarrow",
- specials={ "char", 0x21D2, 0x0338 },
+ specials={ "char", 0x21D2, 0x338 },
unicodeslot=0x21CF,
},
[0x21D0]={
@@ -61529,7 +62818,7 @@ characters.data={
linebreak="al",
mathclass="ordinary",
mathname="nexists",
- specials={ "char", 0x2203, 0x0338 },
+ specials={ "char", 0x2203, 0x338 },
unicodeslot=0x2204,
},
[0x2205]={
@@ -61590,7 +62879,7 @@ characters.data={
},
},
mirror=0x220C,
- specials={ "char", 0x2208, 0x0338 },
+ specials={ "char", 0x2208, 0x338 },
unicodeslot=0x2209,
},
[0x220A]={
@@ -61638,7 +62927,7 @@ characters.data={
},
},
mirror=0x2209,
- specials={ "char", 0x220B, 0x0338 },
+ specials={ "char", 0x220B, 0x338 },
unicodeslot=0x220C,
},
[0x220D]={
@@ -61903,7 +63192,7 @@ characters.data={
name="nmid",
},
},
- specials={ "char", 0x2223, 0x0338 },
+ specials={ "char", 0x2223, 0x338 },
unicodeslot=0x2224,
},
[0x2225]={
@@ -61929,7 +63218,7 @@ characters.data={
linebreak="al",
mathclass="relation",
mathname="nparallel",
- specials={ "char", 0x2225, 0x0338 },
+ specials={ "char", 0x2225, 0x338 },
unicodeslot=0x2226,
},
[0x2227]={
@@ -62246,7 +63535,7 @@ characters.data={
linebreak="al",
mathclass="relation",
mathname="nsim",
- specials={ "char", 0x223C, 0x0338 },
+ specials={ "char", 0x223C, 0x338 },
unicodeslot=0x2241,
},
[0x2242]={
@@ -62276,7 +63565,7 @@ characters.data={
linebreak="al",
mathclass="relation",
mathname="nsimeq",
- specials={ "char", 0x2243, 0x0338 },
+ specials={ "char", 0x2243, 0x338 },
unicodeslot=0x2244,
},
[0x2245]={
@@ -62321,7 +63610,7 @@ characters.data={
linebreak="al",
mathclass="relation",
mathname="approxnEq",
- specials={ "char", 0x2245, 0x0338 },
+ specials={ "char", 0x2245, 0x338 },
unicodeslot=0x2247,
},
[0x2248]={
@@ -62342,7 +63631,7 @@ characters.data={
linebreak="al",
mathclass="relation",
mathname="napprox",
- specials={ "char", 0x2248, 0x0338 },
+ specials={ "char", 0x2248, 0x338 },
unicodeslot=0x2249,
},
[0x224A]={
@@ -62572,7 +63861,7 @@ characters.data={
name="ne",
},
},
- specials={ "char", 0x003D, 0x0338 },
+ specials={ "char", 0x3D, 0x338 },
unicodeslot=0x2260,
},
[0x2261]={
@@ -62597,7 +63886,7 @@ characters.data={
mathextensible="h",
mathfiller="triplerelfill",
mathname="nequiv",
- specials={ "char", 0x2261, 0x0338 },
+ specials={ "char", 0x2261, 0x338 },
unicodeslot=0x2262,
},
[0x2263]={
@@ -62739,7 +64028,7 @@ characters.data={
linebreak="al",
mathclass="relation",
mathname="nasymp",
- specials={ "char", 0x224D, 0x0338 },
+ specials={ "char", 0x224D, 0x338 },
unicodeslot=0x226D,
},
[0x226E]={
@@ -62752,7 +64041,7 @@ characters.data={
mathclass="relation",
mathname="nless",
mirror=0x226F,
- specials={ "char", 0x003C, 0x0338 },
+ specials={ "char", 0x3C, 0x338 },
unicodeslot=0x226E,
},
[0x226F]={
@@ -62765,7 +64054,7 @@ characters.data={
mathclass="relation",
mathname="ngtr",
mirror=0x226E,
- specials={ "char", 0x003E, 0x0338 },
+ specials={ "char", 0x3E, 0x338 },
unicodeslot=0x226F,
},
[0x2270]={
@@ -62777,7 +64066,7 @@ characters.data={
mathclass="relation",
mathname="nleq",
mirror=0x2271,
- specials={ "char", 0x2264, 0x0338 },
+ specials={ "char", 0x2264, 0x338 },
unicodeslot=0x2270,
},
[0x2271]={
@@ -62789,7 +64078,7 @@ characters.data={
mathclass="relation",
mathname="ngeq",
mirror=0x2270,
- specials={ "char", 0x2265, 0x0338 },
+ specials={ "char", 0x2265, 0x338 },
unicodeslot=0x2271,
},
[0x2272]={
@@ -62828,7 +64117,7 @@ characters.data={
mathclass="relation",
mathname="nlesssim",
mirror=0x2275,
- specials={ "char", 0x2272, 0x0338 },
+ specials={ "char", 0x2272, 0x338 },
unicodeslot=0x2274,
},
[0x2275]={
@@ -62839,7 +64128,7 @@ characters.data={
mathclass="relation",
mathname="ngtrsim",
mirror=0x2274,
- specials={ "char", 0x2273, 0x0338 },
+ specials={ "char", 0x2273, 0x338 },
unicodeslot=0x2275,
},
[0x2276]={
@@ -62872,7 +64161,7 @@ characters.data={
mathclass="relation",
mathname="nlessgtr",
mirror=0x2279,
- specials={ "char", 0x2276, 0x0338 },
+ specials={ "char", 0x2276, 0x338 },
unicodeslot=0x2278,
},
[0x2279]={
@@ -62884,7 +64173,7 @@ characters.data={
mathclass="relation",
mathname="ngtrless",
mirror=0x2278,
- specials={ "char", 0x2277, 0x0338 },
+ specials={ "char", 0x2277, 0x338 },
unicodeslot=0x2279,
},
[0x227A]={
@@ -62958,7 +64247,7 @@ characters.data={
mathclass="relation",
mathname="nprec",
mirror=0x2281,
- specials={ "char", 0x227A, 0x0338 },
+ specials={ "char", 0x227A, 0x338 },
unicodeslot=0x2280,
},
[0x2281]={
@@ -62970,7 +64259,7 @@ characters.data={
mathclass="relation",
mathname="nsucc",
mirror=0x2280,
- specials={ "char", 0x227B, 0x0338 },
+ specials={ "char", 0x227B, 0x338 },
unicodeslot=0x2281,
},
[0x2282]={
@@ -63006,7 +64295,7 @@ characters.data={
mathclass="relation",
mathname="nsubset",
mirror=0x2285,
- specials={ "char", 0x2282, 0x0338 },
+ specials={ "char", 0x2282, 0x338 },
unicodeslot=0x2284,
},
[0x2285]={
@@ -63018,7 +64307,7 @@ characters.data={
mathclass="relation",
mathname="nsupset",
mirror=0x2284,
- specials={ "char", 0x2283, 0x0338 },
+ specials={ "char", 0x2283, 0x338 },
unicodeslot=0x2285,
},
[0x2286]={
@@ -63053,7 +64342,7 @@ characters.data={
mathclass="relation",
mathname="nsubseteq",
mirror=0x2289,
- specials={ "char", 0x2286, 0x0338 },
+ specials={ "char", 0x2286, 0x338 },
unicodeslot=0x2288,
},
[0x2289]={
@@ -63064,7 +64353,7 @@ characters.data={
mathclass="relation",
mathname="nsupseteq",
mirror=0x2288,
- specials={ "char", 0x2287, 0x0338 },
+ specials={ "char", 0x2287, 0x338 },
unicodeslot=0x2289,
},
[0x228A]={
@@ -63428,7 +64717,7 @@ characters.data={
linebreak="al",
mathclass="relation",
mathname="nvdash",
- specials={ "char", 0x22A2, 0x0338 },
+ specials={ "char", 0x22A2, 0x338 },
unicodeslot=0x22AC,
},
[0x22AD]={
@@ -63438,7 +64727,7 @@ characters.data={
linebreak="al",
mathclass="relation",
mathname="nvDash",
- specials={ "char", 0x22A8, 0x0338 },
+ specials={ "char", 0x22A8, 0x338 },
unicodeslot=0x22AD,
},
[0x22AE]={
@@ -63448,7 +64737,7 @@ characters.data={
linebreak="al",
mathclass="relation",
mathname="nVdash",
- specials={ "char", 0x22A9, 0x0338 },
+ specials={ "char", 0x22A9, 0x338 },
unicodeslot=0x22AE,
},
[0x22AF]={
@@ -63458,7 +64747,7 @@ characters.data={
linebreak="al",
mathclass="relation",
mathname="nVDash",
- specials={ "char", 0x22AB, 0x0338 },
+ specials={ "char", 0x22AB, 0x338 },
unicodeslot=0x22AF,
},
[0x22B0]={
@@ -63963,7 +65252,7 @@ characters.data={
mathclass="relation",
mathname="npreccurlyeq",
mirror=0x22E1,
- specials={ "char", 0x227C, 0x0338 },
+ specials={ "char", 0x227C, 0x338 },
unicodeslot=0x22E0,
},
[0x22E1]={
@@ -63974,7 +65263,7 @@ characters.data={
mathclass="relation",
mathname="nsucccurlyeq",
mirror=0x22E0,
- specials={ "char", 0x227D, 0x0338 },
+ specials={ "char", 0x227D, 0x338 },
unicodeslot=0x22E1,
},
[0x22E2]={
@@ -63985,7 +65274,7 @@ characters.data={
mathclass="relation",
mathname="nsqsubseteq",
mirror=0x22E3,
- specials={ "char", 0x2291, 0x0338 },
+ specials={ "char", 0x2291, 0x338 },
unicodeslot=0x22E2,
},
[0x22E3]={
@@ -63996,7 +65285,7 @@ characters.data={
mathclass="relation",
mathname="nsqsupseteq",
mirror=0x22E2,
- specials={ "char", 0x2292, 0x0338 },
+ specials={ "char", 0x2292, 0x338 },
unicodeslot=0x22E3,
},
[0x22E4]={
@@ -64067,7 +65356,7 @@ characters.data={
mathclass="relation",
mathname="ntriangleright",
mirror=0x22EB,
- specials={ "char", 0x22B2, 0x0338 },
+ specials={ "char", 0x22B2, 0x338 },
unicodeslot=0x22EA,
},
[0x22EB]={
@@ -64078,7 +65367,7 @@ characters.data={
mathclass="relation",
mathname="ntriangleleft",
mirror=0x22EA,
- specials={ "char", 0x22B3, 0x0338 },
+ specials={ "char", 0x22B3, 0x338 },
unicodeslot=0x22EB,
},
[0x22EC]={
@@ -64089,7 +65378,7 @@ characters.data={
mathclass="relation",
mathname="ntrianglelefteq",
mirror=0x22ED,
- specials={ "char", 0x22B4, 0x0338 },
+ specials={ "char", 0x22B4, 0x338 },
unicodeslot=0x22EC,
},
[0x22ED]={
@@ -64100,7 +65389,7 @@ characters.data={
mathclass="relation",
mathname="ntrianglerighteq",
mirror=0x22EC,
- specials={ "char", 0x22B5, 0x0338 },
+ specials={ "char", 0x22B5, 0x338 },
unicodeslot=0x22ED,
},
[0x22EE]={
@@ -64256,8 +65545,14 @@ characters.data={
direction="on",
linebreak="al",
mathspec={
- { class="ord", name="varnothing" },
- { class="ord", name="diameter" },
+ {
+ class="ord",
+ name="varnothing",
+ },
+ {
+ class="ord",
+ name="diameter",
+ },
},
unicodeslot=0x2300,
},
@@ -64317,7 +65612,7 @@ characters.data={
category="sm",
description="LEFT CEILING",
direction="on",
- linebreak="al",
+ linebreak="op",
mathspec={
{
class="open",
@@ -64335,7 +65630,7 @@ characters.data={
category="sm",
description="RIGHT CEILING",
direction="on",
- linebreak="al",
+ linebreak="cl",
mathspec={
{
class="close",
@@ -64353,7 +65648,7 @@ characters.data={
category="sm",
description="LEFT FLOOR",
direction="on",
- linebreak="al",
+ linebreak="op",
mathclass="open",
mathname="lfloor",
mirror=0x230B,
@@ -64363,7 +65658,7 @@ characters.data={
category="sm",
description="RIGHT FLOOR",
direction="on",
- linebreak="al",
+ linebreak="cl",
mathclass="close",
mathname="rfloor",
mirror=0x230A,
@@ -65594,6 +66889,8 @@ characters.data={
linebreak="al",
mathclass="topaccent",
mathname="overbracket",
+ mathextensible="h",
+ mathfiller="overbracketfill",
unicodeslot=0x23B4,
},
[0x23B5]={
@@ -65603,6 +66900,8 @@ characters.data={
linebreak="al",
mathclass="botaccent",
mathname="underbracket",
+ mathextensible="h",
+ mathfiller="underbracketfill",
unicodeslot=0x23B5,
},
[0x23B6]={
@@ -65878,6 +67177,8 @@ characters.data={
linebreak="al",
mathclass="topaccent",
mathname="overparent",
+ mathextensible="h",
+ mathfiller="overparentfill",
unicodeslot=0x23DC,
},
[0x23DD]={
@@ -65887,6 +67188,8 @@ characters.data={
linebreak="al",
mathclass="botaccent",
mathname="underparent",
+ mathextensible="h",
+ mathfiller="underparentfill",
unicodeslot=0x23DD,
},
[0x23DE]={
@@ -65896,6 +67199,8 @@ characters.data={
linebreak="al",
mathclass="topaccent",
mathname="overbrace",
+ mathextensible="h",
+ mathfiller="overbracefill",
unicodeslot=0x23DE,
},
[0x23DF]={
@@ -65905,6 +67210,8 @@ characters.data={
linebreak="al",
mathclass="botaccent",
mathname="underbrace",
+ mathextensible="h",
+ mathfiller="underbracefill",
unicodeslot=0x23DF,
},
[0x23E0]={
@@ -66049,6 +67356,55 @@ characters.data={
linebreak="id",
unicodeslot=0x23F3,
},
+ [0x23F4]={
+ category="so",
+ description="BLACK MEDIUM LEFT-POINTING TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23F4,
+ },
+ [0x23F5]={
+ category="so",
+ description="BLACK MEDIUM RIGHT-POINTING TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23F5,
+ },
+ [0x23F6]={
+ category="so",
+ description="BLACK MEDIUM UP-POINTING TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23F6,
+ },
+ [0x23F7]={
+ category="so",
+ description="BLACK MEDIUM DOWN-POINTING TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23F7,
+ },
+ [0x23F8]={
+ category="so",
+ description="DOUBLE VERTICAL BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23F8,
+ },
+ [0x23F9]={
+ category="so",
+ description="BLACK SQUARE FOR STOP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23F9,
+ },
+ [0x23FA]={
+ category="so",
+ description="BLACK CIRCLE FOR RECORD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23FA,
+ },
[0x2400]={
category="so",
description="SYMBOL FOR NULL",
@@ -66407,7 +67763,7 @@ characters.data={
description="CIRCLED DIGIT ONE",
direction="on",
linebreak="ai",
- specials={ "circle", 0x0031 },
+ specials={ "circle", 0x31 },
unicodeslot=0x2460,
},
[0x2461]={
@@ -66417,7 +67773,7 @@ characters.data={
description="CIRCLED DIGIT TWO",
direction="on",
linebreak="ai",
- specials={ "circle", 0x0032 },
+ specials={ "circle", 0x32 },
unicodeslot=0x2461,
},
[0x2462]={
@@ -66427,7 +67783,7 @@ characters.data={
description="CIRCLED DIGIT THREE",
direction="on",
linebreak="ai",
- specials={ "circle", 0x0033 },
+ specials={ "circle", 0x33 },
unicodeslot=0x2462,
},
[0x2463]={
@@ -66437,7 +67793,7 @@ characters.data={
description="CIRCLED DIGIT FOUR",
direction="on",
linebreak="ai",
- specials={ "circle", 0x0034 },
+ specials={ "circle", 0x34 },
unicodeslot=0x2463,
},
[0x2464]={
@@ -66447,7 +67803,7 @@ characters.data={
description="CIRCLED DIGIT FIVE",
direction="on",
linebreak="ai",
- specials={ "circle", 0x0035 },
+ specials={ "circle", 0x35 },
unicodeslot=0x2464,
},
[0x2465]={
@@ -66457,7 +67813,7 @@ characters.data={
description="CIRCLED DIGIT SIX",
direction="on",
linebreak="ai",
- specials={ "circle", 0x0036 },
+ specials={ "circle", 0x36 },
unicodeslot=0x2465,
},
[0x2466]={
@@ -66467,7 +67823,7 @@ characters.data={
description="CIRCLED DIGIT SEVEN",
direction="on",
linebreak="ai",
- specials={ "circle", 0x0037 },
+ specials={ "circle", 0x37 },
unicodeslot=0x2466,
},
[0x2467]={
@@ -66477,7 +67833,7 @@ characters.data={
description="CIRCLED DIGIT EIGHT",
direction="on",
linebreak="ai",
- specials={ "circle", 0x0038 },
+ specials={ "circle", 0x38 },
unicodeslot=0x2467,
},
[0x2468]={
@@ -66487,7 +67843,7 @@ characters.data={
description="CIRCLED DIGIT NINE",
direction="on",
linebreak="ai",
- specials={ "circle", 0x0039 },
+ specials={ "circle", 0x39 },
unicodeslot=0x2468,
},
[0x2469]={
@@ -66497,7 +67853,7 @@ characters.data={
description="CIRCLED NUMBER TEN",
direction="on",
linebreak="ai",
- specials={ "circle", 0x0031, 0x0030 },
+ specials={ "circle", 0x31, 0x30 },
unicodeslot=0x2469,
},
[0x246A]={
@@ -66507,7 +67863,7 @@ characters.data={
description="CIRCLED NUMBER ELEVEN",
direction="on",
linebreak="ai",
- specials={ "circle", 0x0031, 0x0031 },
+ specials={ "circle", 0x31, 0x31 },
unicodeslot=0x246A,
},
[0x246B]={
@@ -66517,7 +67873,7 @@ characters.data={
description="CIRCLED NUMBER TWELVE",
direction="on",
linebreak="ai",
- specials={ "circle", 0x0031, 0x0032 },
+ specials={ "circle", 0x31, 0x32 },
unicodeslot=0x246B,
},
[0x246C]={
@@ -66527,7 +67883,7 @@ characters.data={
description="CIRCLED NUMBER THIRTEEN",
direction="on",
linebreak="ai",
- specials={ "circle", 0x0031, 0x0033 },
+ specials={ "circle", 0x31, 0x33 },
unicodeslot=0x246C,
},
[0x246D]={
@@ -66537,7 +67893,7 @@ characters.data={
description="CIRCLED NUMBER FOURTEEN",
direction="on",
linebreak="ai",
- specials={ "circle", 0x0031, 0x0034 },
+ specials={ "circle", 0x31, 0x34 },
unicodeslot=0x246D,
},
[0x246E]={
@@ -66547,7 +67903,7 @@ characters.data={
description="CIRCLED NUMBER FIFTEEN",
direction="on",
linebreak="ai",
- specials={ "circle", 0x0031, 0x0035 },
+ specials={ "circle", 0x31, 0x35 },
unicodeslot=0x246E,
},
[0x246F]={
@@ -66557,7 +67913,7 @@ characters.data={
description="CIRCLED NUMBER SIXTEEN",
direction="on",
linebreak="ai",
- specials={ "circle", 0x0031, 0x0036 },
+ specials={ "circle", 0x31, 0x36 },
unicodeslot=0x246F,
},
[0x2470]={
@@ -66567,7 +67923,7 @@ characters.data={
description="CIRCLED NUMBER SEVENTEEN",
direction="on",
linebreak="ai",
- specials={ "circle", 0x0031, 0x0037 },
+ specials={ "circle", 0x31, 0x37 },
unicodeslot=0x2470,
},
[0x2471]={
@@ -66577,7 +67933,7 @@ characters.data={
description="CIRCLED NUMBER EIGHTEEN",
direction="on",
linebreak="ai",
- specials={ "circle", 0x0031, 0x0038 },
+ specials={ "circle", 0x31, 0x38 },
unicodeslot=0x2471,
},
[0x2472]={
@@ -66587,7 +67943,7 @@ characters.data={
description="CIRCLED NUMBER NINETEEN",
direction="on",
linebreak="ai",
- specials={ "circle", 0x0031, 0x0039 },
+ specials={ "circle", 0x31, 0x39 },
unicodeslot=0x2472,
},
[0x2473]={
@@ -66597,7 +67953,7 @@ characters.data={
description="CIRCLED NUMBER TWENTY",
direction="on",
linebreak="ai",
- specials={ "circle", 0x0032, 0x0030 },
+ specials={ "circle", 0x32, 0x30 },
unicodeslot=0x2473,
},
[0x2474]={
@@ -66607,7 +67963,7 @@ characters.data={
description="PARENTHESIZED DIGIT ONE",
direction="on",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0031, 0x0029 },
+ specials={ "compat", 0x28, 0x31, 0x29 },
unicodeslot=0x2474,
},
[0x2475]={
@@ -66617,7 +67973,7 @@ characters.data={
description="PARENTHESIZED DIGIT TWO",
direction="on",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0032, 0x0029 },
+ specials={ "compat", 0x28, 0x32, 0x29 },
unicodeslot=0x2475,
},
[0x2476]={
@@ -66627,7 +67983,7 @@ characters.data={
description="PARENTHESIZED DIGIT THREE",
direction="on",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0033, 0x0029 },
+ specials={ "compat", 0x28, 0x33, 0x29 },
unicodeslot=0x2476,
},
[0x2477]={
@@ -66637,7 +67993,7 @@ characters.data={
description="PARENTHESIZED DIGIT FOUR",
direction="on",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0034, 0x0029 },
+ specials={ "compat", 0x28, 0x34, 0x29 },
unicodeslot=0x2477,
},
[0x2478]={
@@ -66647,7 +68003,7 @@ characters.data={
description="PARENTHESIZED DIGIT FIVE",
direction="on",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0035, 0x0029 },
+ specials={ "compat", 0x28, 0x35, 0x29 },
unicodeslot=0x2478,
},
[0x2479]={
@@ -66657,7 +68013,7 @@ characters.data={
description="PARENTHESIZED DIGIT SIX",
direction="on",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0036, 0x0029 },
+ specials={ "compat", 0x28, 0x36, 0x29 },
unicodeslot=0x2479,
},
[0x247A]={
@@ -66667,7 +68023,7 @@ characters.data={
description="PARENTHESIZED DIGIT SEVEN",
direction="on",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0037, 0x0029 },
+ specials={ "compat", 0x28, 0x37, 0x29 },
unicodeslot=0x247A,
},
[0x247B]={
@@ -66677,7 +68033,7 @@ characters.data={
description="PARENTHESIZED DIGIT EIGHT",
direction="on",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0038, 0x0029 },
+ specials={ "compat", 0x28, 0x38, 0x29 },
unicodeslot=0x247B,
},
[0x247C]={
@@ -66687,7 +68043,7 @@ characters.data={
description="PARENTHESIZED DIGIT NINE",
direction="on",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0039, 0x0029 },
+ specials={ "compat", 0x28, 0x39, 0x29 },
unicodeslot=0x247C,
},
[0x247D]={
@@ -66697,7 +68053,7 @@ characters.data={
description="PARENTHESIZED NUMBER TEN",
direction="on",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0031, 0x0030, 0x0029 },
+ specials={ "compat", 0x28, 0x31, 0x30, 0x29 },
unicodeslot=0x247D,
},
[0x247E]={
@@ -66707,7 +68063,7 @@ characters.data={
description="PARENTHESIZED NUMBER ELEVEN",
direction="on",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0031, 0x0031, 0x0029 },
+ specials={ "compat", 0x28, 0x31, 0x31, 0x29 },
unicodeslot=0x247E,
},
[0x247F]={
@@ -66717,7 +68073,7 @@ characters.data={
description="PARENTHESIZED NUMBER TWELVE",
direction="on",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0031, 0x0032, 0x0029 },
+ specials={ "compat", 0x28, 0x31, 0x32, 0x29 },
unicodeslot=0x247F,
},
[0x2480]={
@@ -66727,7 +68083,7 @@ characters.data={
description="PARENTHESIZED NUMBER THIRTEEN",
direction="on",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0031, 0x0033, 0x0029 },
+ specials={ "compat", 0x28, 0x31, 0x33, 0x29 },
unicodeslot=0x2480,
},
[0x2481]={
@@ -66737,7 +68093,7 @@ characters.data={
description="PARENTHESIZED NUMBER FOURTEEN",
direction="on",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0031, 0x0034, 0x0029 },
+ specials={ "compat", 0x28, 0x31, 0x34, 0x29 },
unicodeslot=0x2481,
},
[0x2482]={
@@ -66747,7 +68103,7 @@ characters.data={
description="PARENTHESIZED NUMBER FIFTEEN",
direction="on",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0031, 0x0035, 0x0029 },
+ specials={ "compat", 0x28, 0x31, 0x35, 0x29 },
unicodeslot=0x2482,
},
[0x2483]={
@@ -66757,7 +68113,7 @@ characters.data={
description="PARENTHESIZED NUMBER SIXTEEN",
direction="on",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0031, 0x0036, 0x0029 },
+ specials={ "compat", 0x28, 0x31, 0x36, 0x29 },
unicodeslot=0x2483,
},
[0x2484]={
@@ -66767,7 +68123,7 @@ characters.data={
description="PARENTHESIZED NUMBER SEVENTEEN",
direction="on",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0031, 0x0037, 0x0029 },
+ specials={ "compat", 0x28, 0x31, 0x37, 0x29 },
unicodeslot=0x2484,
},
[0x2485]={
@@ -66777,7 +68133,7 @@ characters.data={
description="PARENTHESIZED NUMBER EIGHTEEN",
direction="on",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0031, 0x0038, 0x0029 },
+ specials={ "compat", 0x28, 0x31, 0x38, 0x29 },
unicodeslot=0x2485,
},
[0x2486]={
@@ -66787,7 +68143,7 @@ characters.data={
description="PARENTHESIZED NUMBER NINETEEN",
direction="on",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0031, 0x0039, 0x0029 },
+ specials={ "compat", 0x28, 0x31, 0x39, 0x29 },
unicodeslot=0x2486,
},
[0x2487]={
@@ -66797,7 +68153,7 @@ characters.data={
description="PARENTHESIZED NUMBER TWENTY",
direction="on",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0032, 0x0030, 0x0029 },
+ specials={ "compat", 0x28, 0x32, 0x30, 0x29 },
unicodeslot=0x2487,
},
[0x2488]={
@@ -66807,7 +68163,7 @@ characters.data={
description="DIGIT ONE FULL STOP",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0031, 0x002E },
+ specials={ "compat", 0x31, 0x2E },
unicodeslot=0x2488,
},
[0x2489]={
@@ -66817,7 +68173,7 @@ characters.data={
description="DIGIT TWO FULL STOP",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0032, 0x002E },
+ specials={ "compat", 0x32, 0x2E },
unicodeslot=0x2489,
},
[0x248A]={
@@ -66827,7 +68183,7 @@ characters.data={
description="DIGIT THREE FULL STOP",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0033, 0x002E },
+ specials={ "compat", 0x33, 0x2E },
unicodeslot=0x248A,
},
[0x248B]={
@@ -66837,7 +68193,7 @@ characters.data={
description="DIGIT FOUR FULL STOP",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0034, 0x002E },
+ specials={ "compat", 0x34, 0x2E },
unicodeslot=0x248B,
},
[0x248C]={
@@ -66847,7 +68203,7 @@ characters.data={
description="DIGIT FIVE FULL STOP",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0035, 0x002E },
+ specials={ "compat", 0x35, 0x2E },
unicodeslot=0x248C,
},
[0x248D]={
@@ -66857,7 +68213,7 @@ characters.data={
description="DIGIT SIX FULL STOP",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0036, 0x002E },
+ specials={ "compat", 0x36, 0x2E },
unicodeslot=0x248D,
},
[0x248E]={
@@ -66867,7 +68223,7 @@ characters.data={
description="DIGIT SEVEN FULL STOP",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0037, 0x002E },
+ specials={ "compat", 0x37, 0x2E },
unicodeslot=0x248E,
},
[0x248F]={
@@ -66877,7 +68233,7 @@ characters.data={
description="DIGIT EIGHT FULL STOP",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0038, 0x002E },
+ specials={ "compat", 0x38, 0x2E },
unicodeslot=0x248F,
},
[0x2490]={
@@ -66887,7 +68243,7 @@ characters.data={
description="DIGIT NINE FULL STOP",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0039, 0x002E },
+ specials={ "compat", 0x39, 0x2E },
unicodeslot=0x2490,
},
[0x2491]={
@@ -66897,7 +68253,7 @@ characters.data={
description="NUMBER TEN FULL STOP",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0031, 0x0030, 0x002E },
+ specials={ "compat", 0x31, 0x30, 0x2E },
unicodeslot=0x2491,
},
[0x2492]={
@@ -66907,7 +68263,7 @@ characters.data={
description="NUMBER ELEVEN FULL STOP",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0031, 0x0031, 0x002E },
+ specials={ "compat", 0x31, 0x31, 0x2E },
unicodeslot=0x2492,
},
[0x2493]={
@@ -66917,7 +68273,7 @@ characters.data={
description="NUMBER TWELVE FULL STOP",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0031, 0x0032, 0x002E },
+ specials={ "compat", 0x31, 0x32, 0x2E },
unicodeslot=0x2493,
},
[0x2494]={
@@ -66927,7 +68283,7 @@ characters.data={
description="NUMBER THIRTEEN FULL STOP",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0031, 0x0033, 0x002E },
+ specials={ "compat", 0x31, 0x33, 0x2E },
unicodeslot=0x2494,
},
[0x2495]={
@@ -66937,7 +68293,7 @@ characters.data={
description="NUMBER FOURTEEN FULL STOP",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0031, 0x0034, 0x002E },
+ specials={ "compat", 0x31, 0x34, 0x2E },
unicodeslot=0x2495,
},
[0x2496]={
@@ -66947,7 +68303,7 @@ characters.data={
description="NUMBER FIFTEEN FULL STOP",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0031, 0x0035, 0x002E },
+ specials={ "compat", 0x31, 0x35, 0x2E },
unicodeslot=0x2496,
},
[0x2497]={
@@ -66957,7 +68313,7 @@ characters.data={
description="NUMBER SIXTEEN FULL STOP",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0031, 0x0036, 0x002E },
+ specials={ "compat", 0x31, 0x36, 0x2E },
unicodeslot=0x2497,
},
[0x2498]={
@@ -66967,7 +68323,7 @@ characters.data={
description="NUMBER SEVENTEEN FULL STOP",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0031, 0x0037, 0x002E },
+ specials={ "compat", 0x31, 0x37, 0x2E },
unicodeslot=0x2498,
},
[0x2499]={
@@ -66977,7 +68333,7 @@ characters.data={
description="NUMBER EIGHTEEN FULL STOP",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0031, 0x0038, 0x002E },
+ specials={ "compat", 0x31, 0x38, 0x2E },
unicodeslot=0x2499,
},
[0x249A]={
@@ -66987,7 +68343,7 @@ characters.data={
description="NUMBER NINETEEN FULL STOP",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0031, 0x0039, 0x002E },
+ specials={ "compat", 0x31, 0x39, 0x2E },
unicodeslot=0x249A,
},
[0x249B]={
@@ -66997,7 +68353,7 @@ characters.data={
description="NUMBER TWENTY FULL STOP",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0032, 0x0030, 0x002E },
+ specials={ "compat", 0x32, 0x30, 0x2E },
unicodeslot=0x249B,
},
[0x249C]={
@@ -67007,7 +68363,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER A",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0061, 0x0029 },
+ specials={ "compat", 0x28, 0x61, 0x29 },
unicodeslot=0x249C,
},
[0x249D]={
@@ -67017,7 +68373,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER B",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0062, 0x0029 },
+ specials={ "compat", 0x28, 0x62, 0x29 },
unicodeslot=0x249D,
},
[0x249E]={
@@ -67027,7 +68383,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER C",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0063, 0x0029 },
+ specials={ "compat", 0x28, 0x63, 0x29 },
unicodeslot=0x249E,
},
[0x249F]={
@@ -67037,7 +68393,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER D",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0064, 0x0029 },
+ specials={ "compat", 0x28, 0x64, 0x29 },
unicodeslot=0x249F,
},
[0x24A0]={
@@ -67047,7 +68403,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER E",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0065, 0x0029 },
+ specials={ "compat", 0x28, 0x65, 0x29 },
unicodeslot=0x24A0,
},
[0x24A1]={
@@ -67057,7 +68413,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER F",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0066, 0x0029 },
+ specials={ "compat", 0x28, 0x66, 0x29 },
unicodeslot=0x24A1,
},
[0x24A2]={
@@ -67067,7 +68423,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER G",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0067, 0x0029 },
+ specials={ "compat", 0x28, 0x67, 0x29 },
unicodeslot=0x24A2,
},
[0x24A3]={
@@ -67077,7 +68433,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER H",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0068, 0x0029 },
+ specials={ "compat", 0x28, 0x68, 0x29 },
unicodeslot=0x24A3,
},
[0x24A4]={
@@ -67087,7 +68443,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER I",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0069, 0x0029 },
+ specials={ "compat", 0x28, 0x69, 0x29 },
unicodeslot=0x24A4,
},
[0x24A5]={
@@ -67097,7 +68453,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER J",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x006A, 0x0029 },
+ specials={ "compat", 0x28, 0x6A, 0x29 },
unicodeslot=0x24A5,
},
[0x24A6]={
@@ -67107,7 +68463,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER K",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x006B, 0x0029 },
+ specials={ "compat", 0x28, 0x6B, 0x29 },
unicodeslot=0x24A6,
},
[0x24A7]={
@@ -67117,7 +68473,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER L",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x006C, 0x0029 },
+ specials={ "compat", 0x28, 0x6C, 0x29 },
unicodeslot=0x24A7,
},
[0x24A8]={
@@ -67127,7 +68483,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER M",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x006D, 0x0029 },
+ specials={ "compat", 0x28, 0x6D, 0x29 },
unicodeslot=0x24A8,
},
[0x24A9]={
@@ -67137,7 +68493,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER N",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x006E, 0x0029 },
+ specials={ "compat", 0x28, 0x6E, 0x29 },
unicodeslot=0x24A9,
},
[0x24AA]={
@@ -67147,7 +68503,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER O",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x006F, 0x0029 },
+ specials={ "compat", 0x28, 0x6F, 0x29 },
unicodeslot=0x24AA,
},
[0x24AB]={
@@ -67157,7 +68513,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER P",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0070, 0x0029 },
+ specials={ "compat", 0x28, 0x70, 0x29 },
unicodeslot=0x24AB,
},
[0x24AC]={
@@ -67167,7 +68523,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER Q",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0071, 0x0029 },
+ specials={ "compat", 0x28, 0x71, 0x29 },
unicodeslot=0x24AC,
},
[0x24AD]={
@@ -67177,7 +68533,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER R",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0072, 0x0029 },
+ specials={ "compat", 0x28, 0x72, 0x29 },
unicodeslot=0x24AD,
},
[0x24AE]={
@@ -67187,7 +68543,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER S",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0073, 0x0029 },
+ specials={ "compat", 0x28, 0x73, 0x29 },
unicodeslot=0x24AE,
},
[0x24AF]={
@@ -67197,7 +68553,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER T",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0074, 0x0029 },
+ specials={ "compat", 0x28, 0x74, 0x29 },
unicodeslot=0x24AF,
},
[0x24B0]={
@@ -67207,7 +68563,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER U",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0075, 0x0029 },
+ specials={ "compat", 0x28, 0x75, 0x29 },
unicodeslot=0x24B0,
},
[0x24B1]={
@@ -67217,7 +68573,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER V",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0076, 0x0029 },
+ specials={ "compat", 0x28, 0x76, 0x29 },
unicodeslot=0x24B1,
},
[0x24B2]={
@@ -67227,7 +68583,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER W",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0077, 0x0029 },
+ specials={ "compat", 0x28, 0x77, 0x29 },
unicodeslot=0x24B2,
},
[0x24B3]={
@@ -67237,7 +68593,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER X",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0078, 0x0029 },
+ specials={ "compat", 0x28, 0x78, 0x29 },
unicodeslot=0x24B3,
},
[0x24B4]={
@@ -67247,7 +68603,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER Y",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0079, 0x0029 },
+ specials={ "compat", 0x28, 0x79, 0x29 },
unicodeslot=0x24B4,
},
[0x24B5]={
@@ -67257,7 +68613,7 @@ characters.data={
description="PARENTHESIZED LATIN SMALL LETTER Z",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x007A, 0x0029 },
+ specials={ "compat", 0x28, 0x7A, 0x29 },
unicodeslot=0x24B5,
},
[0x24B6]={
@@ -67268,7 +68624,7 @@ characters.data={
direction="l",
lccode=0x24D0,
linebreak="ai",
- specials={ "circle", 0x0041 },
+ specials={ "circle", 0x41 },
unicodeslot=0x24B6,
},
[0x24B7]={
@@ -67279,7 +68635,7 @@ characters.data={
direction="l",
lccode=0x24D1,
linebreak="ai",
- specials={ "circle", 0x0042 },
+ specials={ "circle", 0x42 },
unicodeslot=0x24B7,
},
[0x24B8]={
@@ -67290,7 +68646,7 @@ characters.data={
direction="l",
lccode=0x24D2,
linebreak="ai",
- specials={ "circle", 0x0043 },
+ specials={ "circle", 0x43 },
unicodeslot=0x24B8,
},
[0x24B9]={
@@ -67301,7 +68657,7 @@ characters.data={
direction="l",
lccode=0x24D3,
linebreak="ai",
- specials={ "circle", 0x0044 },
+ specials={ "circle", 0x44 },
unicodeslot=0x24B9,
},
[0x24BA]={
@@ -67312,7 +68668,7 @@ characters.data={
direction="l",
lccode=0x24D4,
linebreak="ai",
- specials={ "circle", 0x0045 },
+ specials={ "circle", 0x45 },
unicodeslot=0x24BA,
},
[0x24BB]={
@@ -67323,7 +68679,7 @@ characters.data={
direction="l",
lccode=0x24D5,
linebreak="ai",
- specials={ "circle", 0x0046 },
+ specials={ "circle", 0x46 },
unicodeslot=0x24BB,
},
[0x24BC]={
@@ -67334,7 +68690,7 @@ characters.data={
direction="l",
lccode=0x24D6,
linebreak="ai",
- specials={ "circle", 0x0047 },
+ specials={ "circle", 0x47 },
unicodeslot=0x24BC,
},
[0x24BD]={
@@ -67345,7 +68701,7 @@ characters.data={
direction="l",
lccode=0x24D7,
linebreak="ai",
- specials={ "circle", 0x0048 },
+ specials={ "circle", 0x48 },
unicodeslot=0x24BD,
},
[0x24BE]={
@@ -67356,7 +68712,7 @@ characters.data={
direction="l",
lccode=0x24D8,
linebreak="ai",
- specials={ "circle", 0x0049 },
+ specials={ "circle", 0x49 },
unicodeslot=0x24BE,
},
[0x24BF]={
@@ -67367,7 +68723,7 @@ characters.data={
direction="l",
lccode=0x24D9,
linebreak="ai",
- specials={ "circle", 0x004A },
+ specials={ "circle", 0x4A },
unicodeslot=0x24BF,
},
[0x24C0]={
@@ -67378,7 +68734,7 @@ characters.data={
direction="l",
lccode=0x24DA,
linebreak="ai",
- specials={ "circle", 0x004B },
+ specials={ "circle", 0x4B },
unicodeslot=0x24C0,
},
[0x24C1]={
@@ -67389,7 +68745,7 @@ characters.data={
direction="l",
lccode=0x24DB,
linebreak="ai",
- specials={ "circle", 0x004C },
+ specials={ "circle", 0x4C },
unicodeslot=0x24C1,
},
[0x24C2]={
@@ -67400,7 +68756,7 @@ characters.data={
direction="l",
lccode=0x24DC,
linebreak="ai",
- specials={ "circle", 0x004D },
+ specials={ "circle", 0x4D },
unicodeslot=0x24C2,
variants={
[0xFE0E]="text style",
@@ -67415,7 +68771,7 @@ characters.data={
direction="l",
lccode=0x24DD,
linebreak="ai",
- specials={ "circle", 0x004E },
+ specials={ "circle", 0x4E },
unicodeslot=0x24C3,
},
[0x24C4]={
@@ -67426,7 +68782,7 @@ characters.data={
direction="l",
lccode=0x24DE,
linebreak="ai",
- specials={ "circle", 0x004F },
+ specials={ "circle", 0x4F },
unicodeslot=0x24C4,
},
[0x24C5]={
@@ -67437,7 +68793,7 @@ characters.data={
direction="l",
lccode=0x24DF,
linebreak="ai",
- specials={ "circle", 0x0050 },
+ specials={ "circle", 0x50 },
unicodeslot=0x24C5,
},
[0x24C6]={
@@ -67448,7 +68804,7 @@ characters.data={
direction="l",
lccode=0x24E0,
linebreak="ai",
- specials={ "circle", 0x0051 },
+ specials={ "circle", 0x51 },
unicodeslot=0x24C6,
},
[0x24C7]={
@@ -67461,7 +68817,7 @@ characters.data={
linebreak="ai",
mathclass="ordinary",
mathname="circledR",
- specials={ "circle", 0x0052 },
+ specials={ "circle", 0x52 },
unicodeslot=0x24C7,
},
[0x24C8]={
@@ -67474,7 +68830,7 @@ characters.data={
linebreak="ai",
mathclass="ordinary",
mathname="circledS",
- specials={ "circle", 0x0053 },
+ specials={ "circle", 0x53 },
unicodeslot=0x24C8,
},
[0x24C9]={
@@ -67485,7 +68841,7 @@ characters.data={
direction="l",
lccode=0x24E3,
linebreak="ai",
- specials={ "circle", 0x0054 },
+ specials={ "circle", 0x54 },
unicodeslot=0x24C9,
},
[0x24CA]={
@@ -67496,7 +68852,7 @@ characters.data={
direction="l",
lccode=0x24E4,
linebreak="ai",
- specials={ "circle", 0x0055 },
+ specials={ "circle", 0x55 },
unicodeslot=0x24CA,
},
[0x24CB]={
@@ -67507,7 +68863,7 @@ characters.data={
direction="l",
lccode=0x24E5,
linebreak="ai",
- specials={ "circle", 0x0056 },
+ specials={ "circle", 0x56 },
unicodeslot=0x24CB,
},
[0x24CC]={
@@ -67518,7 +68874,7 @@ characters.data={
direction="l",
lccode=0x24E6,
linebreak="ai",
- specials={ "circle", 0x0057 },
+ specials={ "circle", 0x57 },
unicodeslot=0x24CC,
},
[0x24CD]={
@@ -67529,7 +68885,7 @@ characters.data={
direction="l",
lccode=0x24E7,
linebreak="ai",
- specials={ "circle", 0x0058 },
+ specials={ "circle", 0x58 },
unicodeslot=0x24CD,
},
[0x24CE]={
@@ -67540,7 +68896,7 @@ characters.data={
direction="l",
lccode=0x24E8,
linebreak="ai",
- specials={ "circle", 0x0059 },
+ specials={ "circle", 0x59 },
unicodeslot=0x24CE,
},
[0x24CF]={
@@ -67551,7 +68907,7 @@ characters.data={
direction="l",
lccode=0x24E9,
linebreak="ai",
- specials={ "circle", 0x005A },
+ specials={ "circle", 0x5A },
unicodeslot=0x24CF,
},
[0x24D0]={
@@ -67561,7 +68917,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER A",
direction="l",
linebreak="ai",
- specials={ "circle", 0x0061 },
+ specials={ "circle", 0x61 },
uccode=0x24B6,
unicodeslot=0x24D0,
},
@@ -67572,7 +68928,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER B",
direction="l",
linebreak="ai",
- specials={ "circle", 0x0062 },
+ specials={ "circle", 0x62 },
uccode=0x24B7,
unicodeslot=0x24D1,
},
@@ -67583,7 +68939,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER C",
direction="l",
linebreak="ai",
- specials={ "circle", 0x0063 },
+ specials={ "circle", 0x63 },
uccode=0x24B8,
unicodeslot=0x24D2,
},
@@ -67594,7 +68950,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER D",
direction="l",
linebreak="ai",
- specials={ "circle", 0x0064 },
+ specials={ "circle", 0x64 },
uccode=0x24B9,
unicodeslot=0x24D3,
},
@@ -67605,7 +68961,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER E",
direction="l",
linebreak="ai",
- specials={ "circle", 0x0065 },
+ specials={ "circle", 0x65 },
uccode=0x24BA,
unicodeslot=0x24D4,
},
@@ -67616,7 +68972,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER F",
direction="l",
linebreak="ai",
- specials={ "circle", 0x0066 },
+ specials={ "circle", 0x66 },
uccode=0x24BB,
unicodeslot=0x24D5,
},
@@ -67627,7 +68983,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER G",
direction="l",
linebreak="ai",
- specials={ "circle", 0x0067 },
+ specials={ "circle", 0x67 },
uccode=0x24BC,
unicodeslot=0x24D6,
},
@@ -67638,7 +68994,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER H",
direction="l",
linebreak="ai",
- specials={ "circle", 0x0068 },
+ specials={ "circle", 0x68 },
uccode=0x24BD,
unicodeslot=0x24D7,
},
@@ -67649,7 +69005,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER I",
direction="l",
linebreak="ai",
- specials={ "circle", 0x0069 },
+ specials={ "circle", 0x69 },
uccode=0x24BE,
unicodeslot=0x24D8,
},
@@ -67660,7 +69016,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER J",
direction="l",
linebreak="ai",
- specials={ "circle", 0x006A },
+ specials={ "circle", 0x6A },
uccode=0x24BF,
unicodeslot=0x24D9,
},
@@ -67671,7 +69027,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER K",
direction="l",
linebreak="ai",
- specials={ "circle", 0x006B },
+ specials={ "circle", 0x6B },
uccode=0x24C0,
unicodeslot=0x24DA,
},
@@ -67682,7 +69038,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER L",
direction="l",
linebreak="ai",
- specials={ "circle", 0x006C },
+ specials={ "circle", 0x6C },
uccode=0x24C1,
unicodeslot=0x24DB,
},
@@ -67693,7 +69049,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER M",
direction="l",
linebreak="ai",
- specials={ "circle", 0x006D },
+ specials={ "circle", 0x6D },
uccode=0x24C2,
unicodeslot=0x24DC,
},
@@ -67704,7 +69060,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER N",
direction="l",
linebreak="ai",
- specials={ "circle", 0x006E },
+ specials={ "circle", 0x6E },
uccode=0x24C3,
unicodeslot=0x24DD,
},
@@ -67715,7 +69071,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER O",
direction="l",
linebreak="ai",
- specials={ "circle", 0x006F },
+ specials={ "circle", 0x6F },
uccode=0x24C4,
unicodeslot=0x24DE,
},
@@ -67726,7 +69082,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER P",
direction="l",
linebreak="ai",
- specials={ "circle", 0x0070 },
+ specials={ "circle", 0x70 },
uccode=0x24C5,
unicodeslot=0x24DF,
},
@@ -67737,7 +69093,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER Q",
direction="l",
linebreak="ai",
- specials={ "circle", 0x0071 },
+ specials={ "circle", 0x71 },
uccode=0x24C6,
unicodeslot=0x24E0,
},
@@ -67748,7 +69104,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER R",
direction="l",
linebreak="ai",
- specials={ "circle", 0x0072 },
+ specials={ "circle", 0x72 },
uccode=0x24C7,
unicodeslot=0x24E1,
},
@@ -67759,7 +69115,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER S",
direction="l",
linebreak="ai",
- specials={ "circle", 0x0073 },
+ specials={ "circle", 0x73 },
uccode=0x24C8,
unicodeslot=0x24E2,
},
@@ -67770,7 +69126,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER T",
direction="l",
linebreak="ai",
- specials={ "circle", 0x0074 },
+ specials={ "circle", 0x74 },
uccode=0x24C9,
unicodeslot=0x24E3,
},
@@ -67781,7 +69137,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER U",
direction="l",
linebreak="ai",
- specials={ "circle", 0x0075 },
+ specials={ "circle", 0x75 },
uccode=0x24CA,
unicodeslot=0x24E4,
},
@@ -67792,7 +69148,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER V",
direction="l",
linebreak="ai",
- specials={ "circle", 0x0076 },
+ specials={ "circle", 0x76 },
uccode=0x24CB,
unicodeslot=0x24E5,
},
@@ -67803,7 +69159,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER W",
direction="l",
linebreak="ai",
- specials={ "circle", 0x0077 },
+ specials={ "circle", 0x77 },
uccode=0x24CC,
unicodeslot=0x24E6,
},
@@ -67814,7 +69170,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER X",
direction="l",
linebreak="ai",
- specials={ "circle", 0x0078 },
+ specials={ "circle", 0x78 },
uccode=0x24CD,
unicodeslot=0x24E7,
},
@@ -67825,7 +69181,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER Y",
direction="l",
linebreak="ai",
- specials={ "circle", 0x0079 },
+ specials={ "circle", 0x79 },
uccode=0x24CE,
unicodeslot=0x24E8,
},
@@ -67836,7 +69192,7 @@ characters.data={
description="CIRCLED LATIN SMALL LETTER Z",
direction="l",
linebreak="ai",
- specials={ "circle", 0x007A },
+ specials={ "circle", 0x7A },
uccode=0x24CF,
unicodeslot=0x24E9,
},
@@ -67845,7 +69201,7 @@ characters.data={
description="CIRCLED DIGIT ZERO",
direction="on",
linebreak="ai",
- specials={ "circle", 0x0030 },
+ specials={ "circle", 0x30 },
unicodeslot=0x24EA,
},
[0x24EB]={
@@ -72238,6 +73594,13 @@ characters.data={
linebreak="id",
unicodeslot=0x26FF,
},
+ [0x2700]={
+ category="so",
+ description="BLACK SAFETY SCISSORS",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2700,
+ },
[0x2701]={
category="so",
description="UPPER BLADE SCISSORS",
@@ -72959,14 +74322,14 @@ characters.data={
category="so",
description="HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT",
direction="on",
- linebreak="al",
+ linebreak="qu",
unicodeslot=0x275F,
},
[0x2760]={
category="so",
description="HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT",
direction="on",
- linebreak="al",
+ linebreak="qu",
unicodeslot=0x2760,
},
[0x2761]={
@@ -78796,7 +80159,7 @@ characters.data={
linebreak="al",
mathclass="relation",
mathname="coloncolonequals",
- specials={ "compat", 0x003A, 0x003A, 0x003D },
+ specials={ "compat", 0x3A, 0x3A, 0x3D },
unicodeslot=0x2A74,
},
[0x2A75]={
@@ -78804,7 +80167,7 @@ characters.data={
description="TWO CONSECUTIVE EQUALS SIGNS",
direction="on",
linebreak="al",
- specials={ "compat", 0x003D, 0x003D },
+ specials={ "compat", 0x3D, 0x3D },
unicodeslot=0x2A75,
},
[0x2A76]={
@@ -78812,7 +80175,7 @@ characters.data={
description="THREE CONSECUTIVE EQUALS SIGNS",
direction="on",
linebreak="al",
- specials={ "compat", 0x003D, 0x003D, 0x003D },
+ specials={ "compat", 0x3D, 0x3D, 0x3D },
unicodeslot=0x2A76,
},
[0x2A77]={
@@ -79661,7 +81024,7 @@ characters.data={
description="FORKING",
direction="on",
linebreak="al",
- specials={ "char", 0x2ADD, 0x0338 },
+ specials={ "char", 0x2ADD, 0x338 },
unicodeslot=0x2ADC,
},
[0x2ADD]={
@@ -80493,6 +81856,27 @@ characters.data={
linebreak="al",
unicodeslot=0x2B4C,
},
+ [0x2B4D]={
+ category="so",
+ description="DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B4D,
+ },
+ [0x2B4E]={
+ category="so",
+ description="SHORT SLANTED NORTH ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B4E,
+ },
+ [0x2B4F]={
+ category="so",
+ description="SHORT BACKSLANTED SOUTH ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B4F,
+ },
[0x2B50]={
category="so",
description="WHITE MEDIUM STAR",
@@ -80576,6 +81960,790 @@ characters.data={
linebreak="ai",
unicodeslot=0x2B59,
},
+ [0x2B5A]={
+ category="so",
+ description="SLANTED NORTH ARROW WITH HOOKED HEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B5A,
+ },
+ [0x2B5B]={
+ category="so",
+ description="BACKSLANTED SOUTH ARROW WITH HOOKED TAIL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B5B,
+ },
+ [0x2B5C]={
+ category="so",
+ description="SLANTED NORTH ARROW WITH HORIZONTAL TAIL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B5C,
+ },
+ [0x2B5D]={
+ category="so",
+ description="BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B5D,
+ },
+ [0x2B5E]={
+ category="so",
+ description="BENT ARROW POINTING DOWNWARDS THEN NORTH EAST",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B5E,
+ },
+ [0x2B5F]={
+ category="so",
+ description="SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B5F,
+ },
+ [0x2B60]={
+ category="so",
+ description="LEFTWARDS TRIANGLE-HEADED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B60,
+ },
+ [0x2B61]={
+ category="so",
+ description="UPWARDS TRIANGLE-HEADED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B61,
+ },
+ [0x2B62]={
+ category="so",
+ description="RIGHTWARDS TRIANGLE-HEADED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B62,
+ },
+ [0x2B63]={
+ category="so",
+ description="DOWNWARDS TRIANGLE-HEADED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B63,
+ },
+ [0x2B64]={
+ category="so",
+ description="LEFT RIGHT TRIANGLE-HEADED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B64,
+ },
+ [0x2B65]={
+ category="so",
+ description="UP DOWN TRIANGLE-HEADED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B65,
+ },
+ [0x2B66]={
+ category="so",
+ description="NORTH WEST TRIANGLE-HEADED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B66,
+ },
+ [0x2B67]={
+ category="so",
+ description="NORTH EAST TRIANGLE-HEADED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B67,
+ },
+ [0x2B68]={
+ category="so",
+ description="SOUTH EAST TRIANGLE-HEADED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B68,
+ },
+ [0x2B69]={
+ category="so",
+ description="SOUTH WEST TRIANGLE-HEADED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B69,
+ },
+ [0x2B6A]={
+ category="so",
+ description="LEFTWARDS TRIANGLE-HEADED DASHED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B6A,
+ },
+ [0x2B6B]={
+ category="so",
+ description="UPWARDS TRIANGLE-HEADED DASHED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B6B,
+ },
+ [0x2B6C]={
+ category="so",
+ description="RIGHTWARDS TRIANGLE-HEADED DASHED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B6C,
+ },
+ [0x2B6D]={
+ category="so",
+ description="DOWNWARDS TRIANGLE-HEADED DASHED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B6D,
+ },
+ [0x2B6E]={
+ category="so",
+ description="CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B6E,
+ },
+ [0x2B6F]={
+ category="so",
+ description="ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B6F,
+ },
+ [0x2B70]={
+ category="so",
+ description="LEFTWARDS TRIANGLE-HEADED ARROW TO BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B70,
+ },
+ [0x2B71]={
+ category="so",
+ description="UPWARDS TRIANGLE-HEADED ARROW TO BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B71,
+ },
+ [0x2B72]={
+ category="so",
+ description="RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B72,
+ },
+ [0x2B73]={
+ category="so",
+ description="DOWNWARDS TRIANGLE-HEADED ARROW TO BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B73,
+ },
+ [0x2B76]={
+ category="so",
+ description="NORTH WEST TRIANGLE-HEADED ARROW TO BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B76,
+ },
+ [0x2B77]={
+ category="so",
+ description="NORTH EAST TRIANGLE-HEADED ARROW TO BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B77,
+ },
+ [0x2B78]={
+ category="so",
+ description="SOUTH EAST TRIANGLE-HEADED ARROW TO BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B78,
+ },
+ [0x2B79]={
+ category="so",
+ description="SOUTH WEST TRIANGLE-HEADED ARROW TO BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B79,
+ },
+ [0x2B7A]={
+ category="so",
+ description="LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B7A,
+ },
+ [0x2B7B]={
+ category="so",
+ description="UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B7B,
+ },
+ [0x2B7C]={
+ category="so",
+ description="RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B7C,
+ },
+ [0x2B7D]={
+ category="so",
+ description="DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B7D,
+ },
+ [0x2B7E]={
+ category="so",
+ description="HORIZONTAL TAB KEY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B7E,
+ },
+ [0x2B7F]={
+ category="so",
+ description="VERTICAL TAB KEY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B7F,
+ },
+ [0x2B80]={
+ category="so",
+ description="LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B80,
+ },
+ [0x2B81]={
+ category="so",
+ description="UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B81,
+ },
+ [0x2B82]={
+ category="so",
+ description="RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B82,
+ },
+ [0x2B83]={
+ category="so",
+ description="DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B83,
+ },
+ [0x2B84]={
+ category="so",
+ description="LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B84,
+ },
+ [0x2B85]={
+ category="so",
+ description="UPWARDS TRIANGLE-HEADED PAIRED ARROWS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B85,
+ },
+ [0x2B86]={
+ category="so",
+ description="RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B86,
+ },
+ [0x2B87]={
+ category="so",
+ description="DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B87,
+ },
+ [0x2B88]={
+ category="so",
+ description="LEFTWARDS BLACK CIRCLED WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B88,
+ },
+ [0x2B89]={
+ category="so",
+ description="UPWARDS BLACK CIRCLED WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B89,
+ },
+ [0x2B8A]={
+ category="so",
+ description="RIGHTWARDS BLACK CIRCLED WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B8A,
+ },
+ [0x2B8B]={
+ category="so",
+ description="DOWNWARDS BLACK CIRCLED WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B8B,
+ },
+ [0x2B8C]={
+ category="so",
+ description="ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B8C,
+ },
+ [0x2B8D]={
+ category="so",
+ description="ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B8D,
+ },
+ [0x2B8E]={
+ category="so",
+ description="ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B8E,
+ },
+ [0x2B8F]={
+ category="so",
+ description="ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B8F,
+ },
+ [0x2B90]={
+ category="so",
+ description="RETURN LEFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B90,
+ },
+ [0x2B91]={
+ category="so",
+ description="RETURN RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B91,
+ },
+ [0x2B92]={
+ category="so",
+ description="NEWLINE LEFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B92,
+ },
+ [0x2B93]={
+ category="so",
+ description="NEWLINE RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B93,
+ },
+ [0x2B94]={
+ category="so",
+ description="FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B94,
+ },
+ [0x2B95]={
+ category="so",
+ description="RIGHTWARDS BLACK ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B95,
+ },
+ [0x2B98]={
+ category="so",
+ description="THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B98,
+ },
+ [0x2B99]={
+ category="so",
+ description="THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B99,
+ },
+ [0x2B9A]={
+ category="so",
+ description="THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B9A,
+ },
+ [0x2B9B]={
+ category="so",
+ description="THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B9B,
+ },
+ [0x2B9C]={
+ category="so",
+ description="BLACK LEFTWARDS EQUILATERAL ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B9C,
+ },
+ [0x2B9D]={
+ category="so",
+ description="BLACK UPWARDS EQUILATERAL ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B9D,
+ },
+ [0x2B9E]={
+ category="so",
+ description="BLACK RIGHTWARDS EQUILATERAL ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B9E,
+ },
+ [0x2B9F]={
+ category="so",
+ description="BLACK DOWNWARDS EQUILATERAL ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B9F,
+ },
+ [0x2BA0]={
+ category="so",
+ description="DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BA0,
+ },
+ [0x2BA1]={
+ category="so",
+ description="DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BA1,
+ },
+ [0x2BA2]={
+ category="so",
+ description="UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BA2,
+ },
+ [0x2BA3]={
+ category="so",
+ description="UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BA3,
+ },
+ [0x2BA4]={
+ category="so",
+ description="LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BA4,
+ },
+ [0x2BA5]={
+ category="so",
+ description="RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BA5,
+ },
+ [0x2BA6]={
+ category="so",
+ description="LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BA6,
+ },
+ [0x2BA7]={
+ category="so",
+ description="RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BA7,
+ },
+ [0x2BA8]={
+ category="so",
+ description="BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BA8,
+ },
+ [0x2BA9]={
+ category="so",
+ description="BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BA9,
+ },
+ [0x2BAA]={
+ category="so",
+ description="BLACK CURVED UPWARDS AND LEFTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BAA,
+ },
+ [0x2BAB]={
+ category="so",
+ description="BLACK CURVED UPWARDS AND RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BAB,
+ },
+ [0x2BAC]={
+ category="so",
+ description="BLACK CURVED LEFTWARDS AND UPWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BAC,
+ },
+ [0x2BAD]={
+ category="so",
+ description="BLACK CURVED RIGHTWARDS AND UPWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BAD,
+ },
+ [0x2BAE]={
+ category="so",
+ description="BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BAE,
+ },
+ [0x2BAF]={
+ category="so",
+ description="BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BAF,
+ },
+ [0x2BB0]={
+ category="so",
+ description="RIBBON ARROW DOWN LEFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BB0,
+ },
+ [0x2BB1]={
+ category="so",
+ description="RIBBON ARROW DOWN RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BB1,
+ },
+ [0x2BB2]={
+ category="so",
+ description="RIBBON ARROW UP LEFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BB2,
+ },
+ [0x2BB3]={
+ category="so",
+ description="RIBBON ARROW UP RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BB3,
+ },
+ [0x2BB4]={
+ category="so",
+ description="RIBBON ARROW LEFT UP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BB4,
+ },
+ [0x2BB5]={
+ category="so",
+ description="RIBBON ARROW RIGHT UP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BB5,
+ },
+ [0x2BB6]={
+ category="so",
+ description="RIBBON ARROW LEFT DOWN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BB6,
+ },
+ [0x2BB7]={
+ category="so",
+ description="RIBBON ARROW RIGHT DOWN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BB7,
+ },
+ [0x2BB8]={
+ category="so",
+ description="UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BB8,
+ },
+ [0x2BB9]={
+ category="so",
+ description="UP ARROWHEAD IN A RECTANGLE BOX",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BB9,
+ },
+ [0x2BBD]={
+ category="so",
+ description="BALLOT BOX WITH LIGHT X",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BBD,
+ },
+ [0x2BBE]={
+ category="so",
+ description="CIRCLED X",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BBE,
+ },
+ [0x2BBF]={
+ category="so",
+ description="CIRCLED BOLD X",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BBF,
+ },
+ [0x2BC0]={
+ category="so",
+ description="BLACK SQUARE CENTRED",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BC0,
+ },
+ [0x2BC1]={
+ category="so",
+ description="BLACK DIAMOND CENTRED",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BC1,
+ },
+ [0x2BC2]={
+ category="so",
+ description="TURNED BLACK PENTAGON",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BC2,
+ },
+ [0x2BC3]={
+ category="so",
+ description="HORIZONTAL BLACK OCTAGON",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BC3,
+ },
+ [0x2BC4]={
+ category="so",
+ description="BLACK OCTAGON",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BC4,
+ },
+ [0x2BC5]={
+ category="so",
+ description="BLACK MEDIUM UP-POINTING TRIANGLE CENTRED",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BC5,
+ },
+ [0x2BC6]={
+ category="so",
+ description="BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BC6,
+ },
+ [0x2BC7]={
+ category="so",
+ description="BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BC7,
+ },
+ [0x2BC8]={
+ category="so",
+ description="BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BC8,
+ },
+ [0x2BCA]={
+ category="so",
+ description="TOP HALF BLACK CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BCA,
+ },
+ [0x2BCB]={
+ category="so",
+ description="BOTTOM HALF BLACK CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BCB,
+ },
+ [0x2BCC]={
+ category="so",
+ description="LIGHT FOUR POINTED BLACK CUSP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BCC,
+ },
+ [0x2BCD]={
+ category="so",
+ description="ROTATED LIGHT FOUR POINTED BLACK CUSP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BCD,
+ },
+ [0x2BCE]={
+ category="so",
+ description="WHITE FOUR POINTED CUSP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BCE,
+ },
+ [0x2BCF]={
+ category="so",
+ description="ROTATED WHITE FOUR POINTED CUSP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BCF,
+ },
+ [0x2BD0]={
+ category="so",
+ description="SQUARE POSITION INDICATOR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BD0,
+ },
+ [0x2BD1]={
+ category="so",
+ description="UNCERTAINTY SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BD1,
+ },
[0x2C00]={
category="lu",
description="GLAGOLITIC CAPITAL LETTER AZU",
@@ -81334,7 +83502,7 @@ characters.data={
direction="l",
lccode=0x2C61,
linebreak="al",
- shcode=0x004C,
+ shcode=0x4C,
unicodeslot=0x2C60,
},
[0x2C61]={
@@ -81342,7 +83510,7 @@ characters.data={
description="LATIN SMALL LETTER L WITH DOUBLE BAR",
direction="l",
linebreak="al",
- shcode=0x006C,
+ shcode=0x6C,
uccode=0x2C60,
unicodeslot=0x2C61,
},
@@ -81350,9 +83518,9 @@ characters.data={
category="lu",
description="LATIN CAPITAL LETTER L WITH MIDDLE TILDE",
direction="l",
- lccode=0x026B,
+ lccode=0x26B,
linebreak="al",
- shcode=0x004C,
+ shcode=0x4C,
unicodeslot=0x2C62,
},
[0x2C63]={
@@ -81361,16 +83529,16 @@ characters.data={
direction="l",
lccode=0x1D7D,
linebreak="al",
- shcode=0x0050,
+ shcode=0x50,
unicodeslot=0x2C63,
},
[0x2C64]={
category="lu",
description="LATIN CAPITAL LETTER R WITH TAIL",
direction="l",
- lccode=0x027D,
+ lccode=0x27D,
linebreak="al",
- shcode=0x0052,
+ shcode=0x52,
unicodeslot=0x2C64,
},
[0x2C65]={
@@ -81378,8 +83546,8 @@ characters.data={
description="LATIN SMALL LETTER A WITH STROKE",
direction="l",
linebreak="al",
- shcode=0x0061,
- uccode=0x023A,
+ shcode=0x61,
+ uccode=0x23A,
unicodeslot=0x2C65,
},
[0x2C66]={
@@ -81387,8 +83555,8 @@ characters.data={
description="LATIN SMALL LETTER T WITH DIAGONAL STROKE",
direction="l",
linebreak="al",
- shcode=0x0074,
- uccode=0x023E,
+ shcode=0x74,
+ uccode=0x23E,
unicodeslot=0x2C66,
},
[0x2C67]={
@@ -81397,7 +83565,7 @@ characters.data={
direction="l",
lccode=0x2C68,
linebreak="al",
- shcode=0x0048,
+ shcode=0x48,
unicodeslot=0x2C67,
},
[0x2C68]={
@@ -81405,7 +83573,7 @@ characters.data={
description="LATIN SMALL LETTER H WITH DESCENDER",
direction="l",
linebreak="al",
- shcode=0x0068,
+ shcode=0x68,
uccode=0x2C67,
unicodeslot=0x2C68,
},
@@ -81415,7 +83583,7 @@ characters.data={
direction="l",
lccode=0x2C6A,
linebreak="al",
- shcode=0x004B,
+ shcode=0x4B,
unicodeslot=0x2C69,
},
[0x2C6A]={
@@ -81423,7 +83591,7 @@ characters.data={
description="LATIN SMALL LETTER K WITH DESCENDER",
direction="l",
linebreak="al",
- shcode=0x006B,
+ shcode=0x6B,
uccode=0x2C69,
unicodeslot=0x2C6A,
},
@@ -81433,7 +83601,7 @@ characters.data={
direction="l",
lccode=0x2C6C,
linebreak="al",
- shcode=0x005A,
+ shcode=0x5A,
unicodeslot=0x2C6B,
},
[0x2C6C]={
@@ -81441,7 +83609,7 @@ characters.data={
description="LATIN SMALL LETTER Z WITH DESCENDER",
direction="l",
linebreak="al",
- shcode=0x007A,
+ shcode=0x7A,
uccode=0x2C6B,
unicodeslot=0x2C6C,
},
@@ -81499,7 +83667,7 @@ characters.data={
description="LATIN SMALL LETTER V WITH CURL",
direction="l",
linebreak="al",
- shcode=0x0076,
+ shcode=0x76,
unicodeslot=0x2C74,
},
[0x2C75]={
@@ -81558,7 +83726,7 @@ characters.data={
description="LATIN SUBSCRIPT SMALL LETTER J",
direction="l",
linebreak="al",
- specials={ "sub", 0x006A },
+ specials={ "sub", 0x6A },
unicodeslot=0x2C7C,
},
[0x2C7D]={
@@ -81566,7 +83734,7 @@ characters.data={
description="MODIFIER LETTER CAPITAL V",
direction="l",
linebreak="al",
- specials={ "super", 0x0056 },
+ specials={ "super", 0x56 },
unicodeslot=0x2C7D,
},
[0x2C7E]={
@@ -82462,6 +84630,7 @@ characters.data={
},
[0x2CEF]={
category="mn",
+ combining=0xE6,
description="COPTIC COMBINING NI ABOVE",
direction="nsm",
linebreak="cm",
@@ -82469,6 +84638,7 @@ characters.data={
},
[0x2CF0]={
category="mn",
+ combining=0xE6,
description="COPTIC COMBINING SPIRITUS ASPER",
direction="nsm",
linebreak="cm",
@@ -82476,6 +84646,7 @@ characters.data={
},
[0x2CF1]={
category="mn",
+ combining=0xE6,
description="COPTIC COMBINING SPIRITUS LENIS",
direction="nsm",
linebreak="cm",
@@ -83271,6 +85442,7 @@ characters.data={
},
[0x2D7F]={
category="mn",
+ combining=0x9,
description="TIFINAGH CONSONANT JOINER",
direction="nsm",
linebreak="cm",
@@ -83565,7 +85737,6 @@ characters.data={
},
[0x2DB4]={
category="lo",
- cjkwd="w",
description="ETHIOPIC SYLLABLE ZZEE",
direction="l",
linebreak="al",
@@ -83573,7 +85744,6 @@ characters.data={
},
[0x2DB5]={
category="lo",
- cjkwd="w",
description="ETHIOPIC SYLLABLE ZZE",
direction="l",
linebreak="al",
@@ -83611,14 +85781,14 @@ characters.data={
category="lo",
description="ETHIOPIC SYLLABLE CCHAA",
direction="l",
- linebreak="id",
+ linebreak="al",
unicodeslot=0x2DBB,
},
[0x2DBC]={
category="lo",
description="ETHIOPIC SYLLABLE CCHEE",
direction="l",
- linebreak="id",
+ linebreak="al",
unicodeslot=0x2DBC,
},
[0x2DBD]={
@@ -83833,6 +86003,7 @@ characters.data={
},
[0x2DE0]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER BE",
direction="nsm",
linebreak="cm",
@@ -83840,6 +86011,7 @@ characters.data={
},
[0x2DE1]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER VE",
direction="nsm",
linebreak="cm",
@@ -83847,6 +86019,7 @@ characters.data={
},
[0x2DE2]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER GHE",
direction="nsm",
linebreak="cm",
@@ -83854,6 +86027,7 @@ characters.data={
},
[0x2DE3]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER DE",
direction="nsm",
linebreak="cm",
@@ -83861,6 +86035,7 @@ characters.data={
},
[0x2DE4]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER ZHE",
direction="nsm",
linebreak="cm",
@@ -83868,6 +86043,7 @@ characters.data={
},
[0x2DE5]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER ZE",
direction="nsm",
linebreak="cm",
@@ -83875,6 +86051,7 @@ characters.data={
},
[0x2DE6]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER KA",
direction="nsm",
linebreak="cm",
@@ -83882,6 +86059,7 @@ characters.data={
},
[0x2DE7]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER EL",
direction="nsm",
linebreak="cm",
@@ -83889,6 +86067,7 @@ characters.data={
},
[0x2DE8]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER EM",
direction="nsm",
linebreak="cm",
@@ -83896,6 +86075,7 @@ characters.data={
},
[0x2DE9]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER EN",
direction="nsm",
linebreak="cm",
@@ -83903,6 +86083,7 @@ characters.data={
},
[0x2DEA]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER O",
direction="nsm",
linebreak="cm",
@@ -83910,6 +86091,7 @@ characters.data={
},
[0x2DEB]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER PE",
direction="nsm",
linebreak="cm",
@@ -83917,6 +86099,7 @@ characters.data={
},
[0x2DEC]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER ER",
direction="nsm",
linebreak="cm",
@@ -83924,6 +86107,7 @@ characters.data={
},
[0x2DED]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER ES",
direction="nsm",
linebreak="cm",
@@ -83931,6 +86115,7 @@ characters.data={
},
[0x2DEE]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER TE",
direction="nsm",
linebreak="cm",
@@ -83938,6 +86123,7 @@ characters.data={
},
[0x2DEF]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER HA",
direction="nsm",
linebreak="cm",
@@ -83945,6 +86131,7 @@ characters.data={
},
[0x2DF0]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER TSE",
direction="nsm",
linebreak="cm",
@@ -83952,6 +86139,7 @@ characters.data={
},
[0x2DF1]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER CHE",
direction="nsm",
linebreak="cm",
@@ -83959,6 +86147,7 @@ characters.data={
},
[0x2DF2]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER SHA",
direction="nsm",
linebreak="cm",
@@ -83966,6 +86155,7 @@ characters.data={
},
[0x2DF3]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER SHCHA",
direction="nsm",
linebreak="cm",
@@ -83973,6 +86163,7 @@ characters.data={
},
[0x2DF4]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER FITA",
direction="nsm",
linebreak="cm",
@@ -83980,6 +86171,7 @@ characters.data={
},
[0x2DF5]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER ES-TE",
direction="nsm",
linebreak="cm",
@@ -83987,7 +86179,7 @@ characters.data={
},
[0x2DF6]={
category="mn",
- cjkwd="w",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER A",
direction="nsm",
linebreak="cm",
@@ -83995,7 +86187,7 @@ characters.data={
},
[0x2DF7]={
category="mn",
- cjkwd="w",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER IE",
direction="nsm",
linebreak="cm",
@@ -84003,6 +86195,7 @@ characters.data={
},
[0x2DF8]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER DJERV",
direction="nsm",
linebreak="cm",
@@ -84010,6 +86203,7 @@ characters.data={
},
[0x2DF9]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER MONOGRAPH UK",
direction="nsm",
linebreak="cm",
@@ -84017,6 +86211,7 @@ characters.data={
},
[0x2DFA]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER YAT",
direction="nsm",
linebreak="cm",
@@ -84024,6 +86219,7 @@ characters.data={
},
[0x2DFB]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER YU",
direction="nsm",
linebreak="cm",
@@ -84031,6 +86227,7 @@ characters.data={
},
[0x2DFC]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER IOTIFIED A",
direction="nsm",
linebreak="cm",
@@ -84038,20 +86235,23 @@ characters.data={
},
[0x2DFD]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER LITTLE YUS",
direction="nsm",
- linebreak="id",
+ linebreak="cm",
unicodeslot=0x2DFD,
},
[0x2DFE]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER BIG YUS",
direction="nsm",
- linebreak="id",
+ linebreak="cm",
unicodeslot=0x2DFE,
},
[0x2DFF]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER IOTIFIED BIG YUS",
direction="nsm",
linebreak="cm",
@@ -84497,6 +86697,55 @@ characters.data={
linebreak="b2",
unicodeslot=0x2E3B,
},
+ [0x2E3C]={
+ category="po",
+ description="STENOGRAPHIC FULL STOP",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2E3C,
+ },
+ [0x2E3D]={
+ category="po",
+ description="VERTICAL SIX DOTS",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2E3D,
+ },
+ [0x2E3E]={
+ category="po",
+ description="WIGGLY VERTICAL LINE",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2E3E,
+ },
+ [0x2E3F]={
+ category="po",
+ description="CAPITULUM",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2E3F,
+ },
+ [0x2E40]={
+ category="pd",
+ description="DOUBLE HYPHEN",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2E40,
+ },
+ [0x2E41]={
+ category="po",
+ description="REVERSED COMMA",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2E41,
+ },
+ [0x2E42]={
+ category="ps",
+ description="DOUBLE LOW-REVERSED-9 QUOTATION MARK",
+ direction="on",
+ linebreak="op",
+ unicodeslot=0x2E42,
+ },
[0x2E80]={
category="so",
cjkwd="w",
@@ -87448,8 +89697,8 @@ characters.data={
contextname="ideographicspace",
description="IDEOGRAPHIC SPACE",
direction="ws",
- linebreak="id",
- specials={ "wide", 0x0020 },
+ linebreak="ba",
+ specials={ "wide", 0x20 },
unicodeslot=0x3000,
},
[0x3001]={
@@ -87839,6 +90088,7 @@ characters.data={
[0x302A]={
category="mn",
cjkwd="w",
+ combining=0xDA,
description="IDEOGRAPHIC LEVEL TONE MARK",
direction="nsm",
linebreak="cm",
@@ -87847,6 +90097,7 @@ characters.data={
[0x302B]={
category="mn",
cjkwd="w",
+ combining=0xE4,
description="IDEOGRAPHIC RISING TONE MARK",
direction="nsm",
linebreak="cm",
@@ -87855,6 +90106,7 @@ characters.data={
[0x302C]={
category="mn",
cjkwd="w",
+ combining=0xE8,
description="IDEOGRAPHIC DEPARTING TONE MARK",
direction="nsm",
linebreak="cm",
@@ -87863,6 +90115,7 @@ characters.data={
[0x302D]={
category="mn",
cjkwd="w",
+ combining=0xDE,
description="IDEOGRAPHIC ENTERING TONE MARK",
direction="nsm",
linebreak="cm",
@@ -87871,6 +90124,7 @@ characters.data={
[0x302E]={
category="mn",
cjkwd="w",
+ combining=0xE0,
description="HANGUL SINGLE DOT TONE MARK",
direction="l",
linebreak="cm",
@@ -87879,6 +90133,7 @@ characters.data={
[0x302F]={
category="mn",
cjkwd="w",
+ combining=0xE0,
description="HANGUL DOUBLE DOT TONE MARK",
direction="l",
linebreak="cm",
@@ -87929,7 +90184,7 @@ characters.data={
cjkwd="w",
description="VERTICAL KANA REPEAT MARK LOWER HALF",
direction="l",
- linebreak="id",
+ linebreak="cm",
unicodeslot=0x3035,
},
[0x3036]={
@@ -88822,6 +91077,7 @@ characters.data={
[0x3099]={
category="mn",
cjkwd="w",
+ combining=0x8,
description="COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK",
direction="nsm",
linebreak="cm",
@@ -88830,6 +91086,7 @@ characters.data={
[0x309A]={
category="mn",
cjkwd="w",
+ combining=0x8,
description="COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK",
direction="nsm",
linebreak="cm",
@@ -88842,7 +91099,7 @@ characters.data={
description="KATAKANA-HIRAGANA VOICED SOUND MARK",
direction="on",
linebreak="ns",
- specials={ "compat", 0x0020, 0x3099 },
+ specials={ "compat", 0x20, 0x3099 },
unicodeslot=0x309B,
},
[0x309C]={
@@ -88852,7 +91109,7 @@ characters.data={
description="KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK",
direction="on",
linebreak="ns",
- specials={ "compat", 0x0020, 0x309A },
+ specials={ "compat", 0x20, 0x309A },
unicodeslot=0x309C,
},
[0x309D]={
@@ -91863,7 +94120,7 @@ characters.data={
description="PARENTHESIZED HANGUL KIYEOK",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x1100, 0x0029 },
+ specials={ "compat", 0x28, 0x1100, 0x29 },
unicodeslot=0x3200,
},
[0x3201]={
@@ -91873,7 +94130,7 @@ characters.data={
description="PARENTHESIZED HANGUL NIEUN",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x1102, 0x0029 },
+ specials={ "compat", 0x28, 0x1102, 0x29 },
unicodeslot=0x3201,
},
[0x3202]={
@@ -91883,7 +94140,7 @@ characters.data={
description="PARENTHESIZED HANGUL TIKEUT",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x1103, 0x0029 },
+ specials={ "compat", 0x28, 0x1103, 0x29 },
unicodeslot=0x3202,
},
[0x3203]={
@@ -91893,7 +94150,7 @@ characters.data={
description="PARENTHESIZED HANGUL RIEUL",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x1105, 0x0029 },
+ specials={ "compat", 0x28, 0x1105, 0x29 },
unicodeslot=0x3203,
},
[0x3204]={
@@ -91903,7 +94160,7 @@ characters.data={
description="PARENTHESIZED HANGUL MIEUM",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x1106, 0x0029 },
+ specials={ "compat", 0x28, 0x1106, 0x29 },
unicodeslot=0x3204,
},
[0x3205]={
@@ -91913,7 +94170,7 @@ characters.data={
description="PARENTHESIZED HANGUL PIEUP",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x1107, 0x0029 },
+ specials={ "compat", 0x28, 0x1107, 0x29 },
unicodeslot=0x3205,
},
[0x3206]={
@@ -91923,7 +94180,7 @@ characters.data={
description="PARENTHESIZED HANGUL SIOS",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x1109, 0x0029 },
+ specials={ "compat", 0x28, 0x1109, 0x29 },
unicodeslot=0x3206,
},
[0x3207]={
@@ -91933,7 +94190,7 @@ characters.data={
description="PARENTHESIZED HANGUL IEUNG",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x110B, 0x0029 },
+ specials={ "compat", 0x28, 0x110B, 0x29 },
unicodeslot=0x3207,
},
[0x3208]={
@@ -91943,7 +94200,7 @@ characters.data={
description="PARENTHESIZED HANGUL CIEUC",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x110C, 0x0029 },
+ specials={ "compat", 0x28, 0x110C, 0x29 },
unicodeslot=0x3208,
},
[0x3209]={
@@ -91953,7 +94210,7 @@ characters.data={
description="PARENTHESIZED HANGUL CHIEUCH",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x110E, 0x0029 },
+ specials={ "compat", 0x28, 0x110E, 0x29 },
unicodeslot=0x3209,
},
[0x320A]={
@@ -91963,7 +94220,7 @@ characters.data={
description="PARENTHESIZED HANGUL KHIEUKH",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x110F, 0x0029 },
+ specials={ "compat", 0x28, 0x110F, 0x29 },
unicodeslot=0x320A,
},
[0x320B]={
@@ -91973,7 +94230,7 @@ characters.data={
description="PARENTHESIZED HANGUL THIEUTH",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x1110, 0x0029 },
+ specials={ "compat", 0x28, 0x1110, 0x29 },
unicodeslot=0x320B,
},
[0x320C]={
@@ -91983,7 +94240,7 @@ characters.data={
description="PARENTHESIZED HANGUL PHIEUPH",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x1111, 0x0029 },
+ specials={ "compat", 0x28, 0x1111, 0x29 },
unicodeslot=0x320C,
},
[0x320D]={
@@ -91993,7 +94250,7 @@ characters.data={
description="PARENTHESIZED HANGUL HIEUH",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x1112, 0x0029 },
+ specials={ "compat", 0x28, 0x1112, 0x29 },
unicodeslot=0x320D,
},
[0x320E]={
@@ -92003,7 +94260,7 @@ characters.data={
description="PARENTHESIZED HANGUL KIYEOK A",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x1100, 0x1161, 0x0029 },
+ specials={ "compat", 0x28, 0x1100, 0x1161, 0x29 },
unicodeslot=0x320E,
},
[0x320F]={
@@ -92013,7 +94270,7 @@ characters.data={
description="PARENTHESIZED HANGUL NIEUN A",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x1102, 0x1161, 0x0029 },
+ specials={ "compat", 0x28, 0x1102, 0x1161, 0x29 },
unicodeslot=0x320F,
},
[0x3210]={
@@ -92023,7 +94280,7 @@ characters.data={
description="PARENTHESIZED HANGUL TIKEUT A",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x1103, 0x1161, 0x0029 },
+ specials={ "compat", 0x28, 0x1103, 0x1161, 0x29 },
unicodeslot=0x3210,
},
[0x3211]={
@@ -92033,7 +94290,7 @@ characters.data={
description="PARENTHESIZED HANGUL RIEUL A",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x1105, 0x1161, 0x0029 },
+ specials={ "compat", 0x28, 0x1105, 0x1161, 0x29 },
unicodeslot=0x3211,
},
[0x3212]={
@@ -92043,7 +94300,7 @@ characters.data={
description="PARENTHESIZED HANGUL MIEUM A",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x1106, 0x1161, 0x0029 },
+ specials={ "compat", 0x28, 0x1106, 0x1161, 0x29 },
unicodeslot=0x3212,
},
[0x3213]={
@@ -92053,7 +94310,7 @@ characters.data={
description="PARENTHESIZED HANGUL PIEUP A",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x1107, 0x1161, 0x0029 },
+ specials={ "compat", 0x28, 0x1107, 0x1161, 0x29 },
unicodeslot=0x3213,
},
[0x3214]={
@@ -92063,7 +94320,7 @@ characters.data={
description="PARENTHESIZED HANGUL SIOS A",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x1109, 0x1161, 0x0029 },
+ specials={ "compat", 0x28, 0x1109, 0x1161, 0x29 },
unicodeslot=0x3214,
},
[0x3215]={
@@ -92073,7 +94330,7 @@ characters.data={
description="PARENTHESIZED HANGUL IEUNG A",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x110B, 0x1161, 0x0029 },
+ specials={ "compat", 0x28, 0x110B, 0x1161, 0x29 },
unicodeslot=0x3215,
},
[0x3216]={
@@ -92083,7 +94340,7 @@ characters.data={
description="PARENTHESIZED HANGUL CIEUC A",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x110C, 0x1161, 0x0029 },
+ specials={ "compat", 0x28, 0x110C, 0x1161, 0x29 },
unicodeslot=0x3216,
},
[0x3217]={
@@ -92093,7 +94350,7 @@ characters.data={
description="PARENTHESIZED HANGUL CHIEUCH A",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x110E, 0x1161, 0x0029 },
+ specials={ "compat", 0x28, 0x110E, 0x1161, 0x29 },
unicodeslot=0x3217,
},
[0x3218]={
@@ -92103,7 +94360,7 @@ characters.data={
description="PARENTHESIZED HANGUL KHIEUKH A",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x110F, 0x1161, 0x0029 },
+ specials={ "compat", 0x28, 0x110F, 0x1161, 0x29 },
unicodeslot=0x3218,
},
[0x3219]={
@@ -92113,7 +94370,7 @@ characters.data={
description="PARENTHESIZED HANGUL THIEUTH A",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x1110, 0x1161, 0x0029 },
+ specials={ "compat", 0x28, 0x1110, 0x1161, 0x29 },
unicodeslot=0x3219,
},
[0x321A]={
@@ -92123,7 +94380,7 @@ characters.data={
description="PARENTHESIZED HANGUL PHIEUPH A",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x1111, 0x1161, 0x0029 },
+ specials={ "compat", 0x28, 0x1111, 0x1161, 0x29 },
unicodeslot=0x321A,
},
[0x321B]={
@@ -92133,7 +94390,7 @@ characters.data={
description="PARENTHESIZED HANGUL HIEUH A",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x1112, 0x1161, 0x0029 },
+ specials={ "compat", 0x28, 0x1112, 0x1161, 0x29 },
unicodeslot=0x321B,
},
[0x321C]={
@@ -92143,7 +94400,7 @@ characters.data={
description="PARENTHESIZED HANGUL CIEUC U",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x110C, 0x116E, 0x0029 },
+ specials={ "compat", 0x28, 0x110C, 0x116E, 0x29 },
unicodeslot=0x321C,
},
[0x321D]={
@@ -92152,7 +94409,7 @@ characters.data={
description="PARENTHESIZED KOREAN CHARACTER OJEON",
direction="on",
linebreak="id",
- specials={ "compat", 0x0028, 0x110B, 0x1169, 0x110C, 0x1165, 0x11AB, 0x0029 },
+ specials={ "compat", 0x28, 0x110B, 0x1169, 0x110C, 0x1165, 0x11AB, 0x29 },
unicodeslot=0x321D,
},
[0x321E]={
@@ -92161,7 +94418,7 @@ characters.data={
description="PARENTHESIZED KOREAN CHARACTER O HU",
direction="on",
linebreak="id",
- specials={ "compat", 0x0028, 0x110B, 0x1169, 0x1112, 0x116E, 0x0029 },
+ specials={ "compat", 0x28, 0x110B, 0x1169, 0x1112, 0x116E, 0x29 },
unicodeslot=0x321E,
},
[0x3220]={
@@ -92171,7 +94428,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH ONE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x4E00, 0x0029 },
+ specials={ "compat", 0x28, 0x4E00, 0x29 },
unicodeslot=0x3220,
},
[0x3221]={
@@ -92181,7 +94438,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH TWO",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x4E8C, 0x0029 },
+ specials={ "compat", 0x28, 0x4E8C, 0x29 },
unicodeslot=0x3221,
},
[0x3222]={
@@ -92191,7 +94448,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH THREE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x4E09, 0x0029 },
+ specials={ "compat", 0x28, 0x4E09, 0x29 },
unicodeslot=0x3222,
},
[0x3223]={
@@ -92201,7 +94458,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH FOUR",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x56DB, 0x0029 },
+ specials={ "compat", 0x28, 0x56DB, 0x29 },
unicodeslot=0x3223,
},
[0x3224]={
@@ -92211,7 +94468,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH FIVE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x4E94, 0x0029 },
+ specials={ "compat", 0x28, 0x4E94, 0x29 },
unicodeslot=0x3224,
},
[0x3225]={
@@ -92221,7 +94478,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH SIX",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x516D, 0x0029 },
+ specials={ "compat", 0x28, 0x516D, 0x29 },
unicodeslot=0x3225,
},
[0x3226]={
@@ -92231,7 +94488,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH SEVEN",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x4E03, 0x0029 },
+ specials={ "compat", 0x28, 0x4E03, 0x29 },
unicodeslot=0x3226,
},
[0x3227]={
@@ -92241,7 +94498,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH EIGHT",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x516B, 0x0029 },
+ specials={ "compat", 0x28, 0x516B, 0x29 },
unicodeslot=0x3227,
},
[0x3228]={
@@ -92251,7 +94508,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH NINE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x4E5D, 0x0029 },
+ specials={ "compat", 0x28, 0x4E5D, 0x29 },
unicodeslot=0x3228,
},
[0x3229]={
@@ -92261,7 +94518,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH TEN",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x5341, 0x0029 },
+ specials={ "compat", 0x28, 0x5341, 0x29 },
unicodeslot=0x3229,
},
[0x322A]={
@@ -92271,7 +94528,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH MOON",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x6708, 0x0029 },
+ specials={ "compat", 0x28, 0x6708, 0x29 },
unicodeslot=0x322A,
},
[0x322B]={
@@ -92281,7 +94538,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH FIRE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x706B, 0x0029 },
+ specials={ "compat", 0x28, 0x706B, 0x29 },
unicodeslot=0x322B,
},
[0x322C]={
@@ -92291,7 +94548,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH WATER",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x6C34, 0x0029 },
+ specials={ "compat", 0x28, 0x6C34, 0x29 },
unicodeslot=0x322C,
},
[0x322D]={
@@ -92301,7 +94558,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH WOOD",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x6728, 0x0029 },
+ specials={ "compat", 0x28, 0x6728, 0x29 },
unicodeslot=0x322D,
},
[0x322E]={
@@ -92311,7 +94568,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH METAL",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x91D1, 0x0029 },
+ specials={ "compat", 0x28, 0x91D1, 0x29 },
unicodeslot=0x322E,
},
[0x322F]={
@@ -92321,7 +94578,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH EARTH",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x571F, 0x0029 },
+ specials={ "compat", 0x28, 0x571F, 0x29 },
unicodeslot=0x322F,
},
[0x3230]={
@@ -92331,7 +94588,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH SUN",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x65E5, 0x0029 },
+ specials={ "compat", 0x28, 0x65E5, 0x29 },
unicodeslot=0x3230,
},
[0x3231]={
@@ -92341,7 +94598,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH STOCK",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x682A, 0x0029 },
+ specials={ "compat", 0x28, 0x682A, 0x29 },
unicodeslot=0x3231,
},
[0x3232]={
@@ -92351,7 +94608,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH HAVE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x6709, 0x0029 },
+ specials={ "compat", 0x28, 0x6709, 0x29 },
unicodeslot=0x3232,
},
[0x3233]={
@@ -92361,7 +94618,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH SOCIETY",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x793E, 0x0029 },
+ specials={ "compat", 0x28, 0x793E, 0x29 },
unicodeslot=0x3233,
},
[0x3234]={
@@ -92371,7 +94628,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH NAME",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x540D, 0x0029 },
+ specials={ "compat", 0x28, 0x540D, 0x29 },
unicodeslot=0x3234,
},
[0x3235]={
@@ -92381,7 +94638,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH SPECIAL",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x7279, 0x0029 },
+ specials={ "compat", 0x28, 0x7279, 0x29 },
unicodeslot=0x3235,
},
[0x3236]={
@@ -92391,7 +94648,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH FINANCIAL",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x8CA1, 0x0029 },
+ specials={ "compat", 0x28, 0x8CA1, 0x29 },
unicodeslot=0x3236,
},
[0x3237]={
@@ -92401,7 +94658,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH CONGRATULATION",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x795D, 0x0029 },
+ specials={ "compat", 0x28, 0x795D, 0x29 },
unicodeslot=0x3237,
},
[0x3238]={
@@ -92411,7 +94668,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH LABOR",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x52B4, 0x0029 },
+ specials={ "compat", 0x28, 0x52B4, 0x29 },
unicodeslot=0x3238,
},
[0x3239]={
@@ -92421,7 +94678,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH REPRESENT",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x4EE3, 0x0029 },
+ specials={ "compat", 0x28, 0x4EE3, 0x29 },
unicodeslot=0x3239,
},
[0x323A]={
@@ -92431,7 +94688,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH CALL",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x547C, 0x0029 },
+ specials={ "compat", 0x28, 0x547C, 0x29 },
unicodeslot=0x323A,
},
[0x323B]={
@@ -92441,7 +94698,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH STUDY",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x5B66, 0x0029 },
+ specials={ "compat", 0x28, 0x5B66, 0x29 },
unicodeslot=0x323B,
},
[0x323C]={
@@ -92451,7 +94708,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH SUPERVISE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x76E3, 0x0029 },
+ specials={ "compat", 0x28, 0x76E3, 0x29 },
unicodeslot=0x323C,
},
[0x323D]={
@@ -92461,7 +94718,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH ENTERPRISE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x4F01, 0x0029 },
+ specials={ "compat", 0x28, 0x4F01, 0x29 },
unicodeslot=0x323D,
},
[0x323E]={
@@ -92471,7 +94728,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH RESOURCE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x8CC7, 0x0029 },
+ specials={ "compat", 0x28, 0x8CC7, 0x29 },
unicodeslot=0x323E,
},
[0x323F]={
@@ -92481,7 +94738,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH ALLIANCE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x5354, 0x0029 },
+ specials={ "compat", 0x28, 0x5354, 0x29 },
unicodeslot=0x323F,
},
[0x3240]={
@@ -92491,7 +94748,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH FESTIVAL",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x796D, 0x0029 },
+ specials={ "compat", 0x28, 0x796D, 0x29 },
unicodeslot=0x3240,
},
[0x3241]={
@@ -92500,7 +94757,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH REST",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x4F11, 0x0029 },
+ specials={ "compat", 0x28, 0x4F11, 0x29 },
unicodeslot=0x3241,
},
[0x3242]={
@@ -92510,7 +94767,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH SELF",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x81EA, 0x0029 },
+ specials={ "compat", 0x28, 0x81EA, 0x29 },
unicodeslot=0x3242,
},
[0x3243]={
@@ -92520,7 +94777,7 @@ characters.data={
description="PARENTHESIZED IDEOGRAPH REACH",
direction="l",
linebreak="id",
- specials={ "compat", 0x0028, 0x81F3, 0x0029 },
+ specials={ "compat", 0x28, 0x81F3, 0x29 },
unicodeslot=0x3243,
},
[0x3244]={
@@ -92629,7 +94886,7 @@ characters.data={
description="PARTNERSHIP SIGN",
direction="on",
linebreak="id",
- specials={ "square", 0x0050, 0x0054, 0x0045 },
+ specials={ "square", 0x50, 0x54, 0x45 },
unicodeslot=0x3250,
},
[0x3251]={
@@ -92638,7 +94895,7 @@ characters.data={
description="CIRCLED NUMBER TWENTY ONE",
direction="on",
linebreak="id",
- specials={ "circle", 0x0032, 0x0031 },
+ specials={ "circle", 0x32, 0x31 },
unicodeslot=0x3251,
},
[0x3252]={
@@ -92647,7 +94904,7 @@ characters.data={
description="CIRCLED NUMBER TWENTY TWO",
direction="on",
linebreak="id",
- specials={ "circle", 0x0032, 0x0032 },
+ specials={ "circle", 0x32, 0x32 },
unicodeslot=0x3252,
},
[0x3253]={
@@ -92656,7 +94913,7 @@ characters.data={
description="CIRCLED NUMBER TWENTY THREE",
direction="on",
linebreak="id",
- specials={ "circle", 0x0032, 0x0033 },
+ specials={ "circle", 0x32, 0x33 },
unicodeslot=0x3253,
},
[0x3254]={
@@ -92665,7 +94922,7 @@ characters.data={
description="CIRCLED NUMBER TWENTY FOUR",
direction="on",
linebreak="id",
- specials={ "circle", 0x0032, 0x0034 },
+ specials={ "circle", 0x32, 0x34 },
unicodeslot=0x3254,
},
[0x3255]={
@@ -92674,7 +94931,7 @@ characters.data={
description="CIRCLED NUMBER TWENTY FIVE",
direction="on",
linebreak="id",
- specials={ "circle", 0x0032, 0x0035 },
+ specials={ "circle", 0x32, 0x35 },
unicodeslot=0x3255,
},
[0x3256]={
@@ -92683,7 +94940,7 @@ characters.data={
description="CIRCLED NUMBER TWENTY SIX",
direction="on",
linebreak="id",
- specials={ "circle", 0x0032, 0x0036 },
+ specials={ "circle", 0x32, 0x36 },
unicodeslot=0x3256,
},
[0x3257]={
@@ -92692,7 +94949,7 @@ characters.data={
description="CIRCLED NUMBER TWENTY SEVEN",
direction="on",
linebreak="id",
- specials={ "circle", 0x0032, 0x0037 },
+ specials={ "circle", 0x32, 0x37 },
unicodeslot=0x3257,
},
[0x3258]={
@@ -92701,7 +94958,7 @@ characters.data={
description="CIRCLED NUMBER TWENTY EIGHT",
direction="on",
linebreak="id",
- specials={ "circle", 0x0032, 0x0038 },
+ specials={ "circle", 0x32, 0x38 },
unicodeslot=0x3258,
},
[0x3259]={
@@ -92710,7 +94967,7 @@ characters.data={
description="CIRCLED NUMBER TWENTY NINE",
direction="on",
linebreak="id",
- specials={ "circle", 0x0032, 0x0039 },
+ specials={ "circle", 0x32, 0x39 },
unicodeslot=0x3259,
},
[0x325A]={
@@ -92719,7 +94976,7 @@ characters.data={
description="CIRCLED NUMBER THIRTY",
direction="on",
linebreak="id",
- specials={ "circle", 0x0033, 0x0030 },
+ specials={ "circle", 0x33, 0x30 },
unicodeslot=0x325A,
},
[0x325B]={
@@ -92728,7 +94985,7 @@ characters.data={
description="CIRCLED NUMBER THIRTY ONE",
direction="on",
linebreak="id",
- specials={ "circle", 0x0033, 0x0031 },
+ specials={ "circle", 0x33, 0x31 },
unicodeslot=0x325B,
},
[0x325C]={
@@ -92737,7 +94994,7 @@ characters.data={
description="CIRCLED NUMBER THIRTY TWO",
direction="on",
linebreak="id",
- specials={ "circle", 0x0033, 0x0032 },
+ specials={ "circle", 0x33, 0x32 },
unicodeslot=0x325C,
},
[0x325D]={
@@ -92746,7 +95003,7 @@ characters.data={
description="CIRCLED NUMBER THIRTY THREE",
direction="on",
linebreak="id",
- specials={ "circle", 0x0033, 0x0033 },
+ specials={ "circle", 0x33, 0x33 },
unicodeslot=0x325D,
},
[0x325E]={
@@ -92755,7 +95012,7 @@ characters.data={
description="CIRCLED NUMBER THIRTY FOUR",
direction="on",
linebreak="id",
- specials={ "circle", 0x0033, 0x0034 },
+ specials={ "circle", 0x33, 0x34 },
unicodeslot=0x325E,
},
[0x325F]={
@@ -92764,7 +95021,7 @@ characters.data={
description="CIRCLED NUMBER THIRTY FIVE",
direction="on",
linebreak="id",
- specials={ "circle", 0x0033, 0x0035 },
+ specials={ "circle", 0x33, 0x35 },
unicodeslot=0x325F,
},
[0x3260]={
@@ -93558,7 +95815,7 @@ characters.data={
description="CIRCLED NUMBER THIRTY SIX",
direction="on",
linebreak="id",
- specials={ "circle", 0x0033, 0x0036 },
+ specials={ "circle", 0x33, 0x36 },
unicodeslot=0x32B1,
},
[0x32B2]={
@@ -93567,7 +95824,7 @@ characters.data={
description="CIRCLED NUMBER THIRTY SEVEN",
direction="on",
linebreak="id",
- specials={ "circle", 0x0033, 0x0037 },
+ specials={ "circle", 0x33, 0x37 },
unicodeslot=0x32B2,
},
[0x32B3]={
@@ -93576,7 +95833,7 @@ characters.data={
description="CIRCLED NUMBER THIRTY EIGHT",
direction="on",
linebreak="id",
- specials={ "circle", 0x0033, 0x0038 },
+ specials={ "circle", 0x33, 0x38 },
unicodeslot=0x32B3,
},
[0x32B4]={
@@ -93585,7 +95842,7 @@ characters.data={
description="CIRCLED NUMBER THIRTY NINE",
direction="on",
linebreak="id",
- specials={ "circle", 0x0033, 0x0039 },
+ specials={ "circle", 0x33, 0x39 },
unicodeslot=0x32B4,
},
[0x32B5]={
@@ -93594,7 +95851,7 @@ characters.data={
description="CIRCLED NUMBER FORTY",
direction="on",
linebreak="id",
- specials={ "circle", 0x0034, 0x0030 },
+ specials={ "circle", 0x34, 0x30 },
unicodeslot=0x32B5,
},
[0x32B6]={
@@ -93603,7 +95860,7 @@ characters.data={
description="CIRCLED NUMBER FORTY ONE",
direction="on",
linebreak="id",
- specials={ "circle", 0x0034, 0x0031 },
+ specials={ "circle", 0x34, 0x31 },
unicodeslot=0x32B6,
},
[0x32B7]={
@@ -93612,7 +95869,7 @@ characters.data={
description="CIRCLED NUMBER FORTY TWO",
direction="on",
linebreak="id",
- specials={ "circle", 0x0034, 0x0032 },
+ specials={ "circle", 0x34, 0x32 },
unicodeslot=0x32B7,
},
[0x32B8]={
@@ -93621,7 +95878,7 @@ characters.data={
description="CIRCLED NUMBER FORTY THREE",
direction="on",
linebreak="id",
- specials={ "circle", 0x0034, 0x0033 },
+ specials={ "circle", 0x34, 0x33 },
unicodeslot=0x32B8,
},
[0x32B9]={
@@ -93630,7 +95887,7 @@ characters.data={
description="CIRCLED NUMBER FORTY FOUR",
direction="on",
linebreak="id",
- specials={ "circle", 0x0034, 0x0034 },
+ specials={ "circle", 0x34, 0x34 },
unicodeslot=0x32B9,
},
[0x32BA]={
@@ -93639,7 +95896,7 @@ characters.data={
description="CIRCLED NUMBER FORTY FIVE",
direction="on",
linebreak="id",
- specials={ "circle", 0x0034, 0x0035 },
+ specials={ "circle", 0x34, 0x35 },
unicodeslot=0x32BA,
},
[0x32BB]={
@@ -93648,7 +95905,7 @@ characters.data={
description="CIRCLED NUMBER FORTY SIX",
direction="on",
linebreak="id",
- specials={ "circle", 0x0034, 0x0036 },
+ specials={ "circle", 0x34, 0x36 },
unicodeslot=0x32BB,
},
[0x32BC]={
@@ -93657,7 +95914,7 @@ characters.data={
description="CIRCLED NUMBER FORTY SEVEN",
direction="on",
linebreak="id",
- specials={ "circle", 0x0034, 0x0037 },
+ specials={ "circle", 0x34, 0x37 },
unicodeslot=0x32BC,
},
[0x32BD]={
@@ -93666,7 +95923,7 @@ characters.data={
description="CIRCLED NUMBER FORTY EIGHT",
direction="on",
linebreak="id",
- specials={ "circle", 0x0034, 0x0038 },
+ specials={ "circle", 0x34, 0x38 },
unicodeslot=0x32BD,
},
[0x32BE]={
@@ -93675,7 +95932,7 @@ characters.data={
description="CIRCLED NUMBER FORTY NINE",
direction="on",
linebreak="id",
- specials={ "circle", 0x0034, 0x0039 },
+ specials={ "circle", 0x34, 0x39 },
unicodeslot=0x32BE,
},
[0x32BF]={
@@ -93684,7 +95941,7 @@ characters.data={
description="CIRCLED NUMBER FIFTY",
direction="on",
linebreak="id",
- specials={ "circle", 0x0035, 0x0030 },
+ specials={ "circle", 0x35, 0x30 },
unicodeslot=0x32BF,
},
[0x32C0]={
@@ -93693,7 +95950,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x6708 },
+ specials={ "compat", 0x31, 0x6708 },
unicodeslot=0x32C0,
},
[0x32C1]={
@@ -93702,7 +95959,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY",
direction="l",
linebreak="id",
- specials={ "compat", 0x0032, 0x6708 },
+ specials={ "compat", 0x32, 0x6708 },
unicodeslot=0x32C1,
},
[0x32C2]={
@@ -93711,7 +95968,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH",
direction="l",
linebreak="id",
- specials={ "compat", 0x0033, 0x6708 },
+ specials={ "compat", 0x33, 0x6708 },
unicodeslot=0x32C2,
},
[0x32C3]={
@@ -93720,7 +95977,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL",
direction="l",
linebreak="id",
- specials={ "compat", 0x0034, 0x6708 },
+ specials={ "compat", 0x34, 0x6708 },
unicodeslot=0x32C3,
},
[0x32C4]={
@@ -93729,7 +95986,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY",
direction="l",
linebreak="id",
- specials={ "compat", 0x0035, 0x6708 },
+ specials={ "compat", 0x35, 0x6708 },
unicodeslot=0x32C4,
},
[0x32C5]={
@@ -93738,7 +95995,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0036, 0x6708 },
+ specials={ "compat", 0x36, 0x6708 },
unicodeslot=0x32C5,
},
[0x32C6]={
@@ -93747,7 +96004,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY",
direction="l",
linebreak="id",
- specials={ "compat", 0x0037, 0x6708 },
+ specials={ "compat", 0x37, 0x6708 },
unicodeslot=0x32C6,
},
[0x32C7]={
@@ -93756,7 +96013,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST",
direction="l",
linebreak="id",
- specials={ "compat", 0x0038, 0x6708 },
+ specials={ "compat", 0x38, 0x6708 },
unicodeslot=0x32C7,
},
[0x32C8]={
@@ -93765,7 +96022,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER",
direction="l",
linebreak="id",
- specials={ "compat", 0x0039, 0x6708 },
+ specials={ "compat", 0x39, 0x6708 },
unicodeslot=0x32C8,
},
[0x32C9]={
@@ -93774,7 +96031,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x0030, 0x6708 },
+ specials={ "compat", 0x31, 0x30, 0x6708 },
unicodeslot=0x32C9,
},
[0x32CA]={
@@ -93783,7 +96040,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x0031, 0x6708 },
+ specials={ "compat", 0x31, 0x31, 0x6708 },
unicodeslot=0x32CA,
},
[0x32CB]={
@@ -93792,7 +96049,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x0032, 0x6708 },
+ specials={ "compat", 0x31, 0x32, 0x6708 },
unicodeslot=0x32CB,
},
[0x32CC]={
@@ -93801,7 +96058,7 @@ characters.data={
description="SQUARE HG",
direction="on",
linebreak="id",
- specials={ "square", 0x0048, 0x0067 },
+ specials={ "square", 0x48, 0x67 },
unicodeslot=0x32CC,
},
[0x32CD]={
@@ -93810,7 +96067,7 @@ characters.data={
description="SQUARE ERG",
direction="on",
linebreak="id",
- specials={ "square", 0x0065, 0x0072, 0x0067 },
+ specials={ "square", 0x65, 0x72, 0x67 },
unicodeslot=0x32CD,
},
[0x32CE]={
@@ -93819,7 +96076,7 @@ characters.data={
description="SQUARE EV",
direction="on",
linebreak="id",
- specials={ "square", 0x0065, 0x0056 },
+ specials={ "square", 0x65, 0x56 },
unicodeslot=0x32CE,
},
[0x32CF]={
@@ -93828,7 +96085,7 @@ characters.data={
description="LIMITED LIABILITY SIGN",
direction="on",
linebreak="id",
- specials={ "square", 0x004C, 0x0054, 0x0044 },
+ specials={ "square", 0x4C, 0x54, 0x44 },
unicodeslot=0x32CF,
},
[0x32D0]={
@@ -95080,7 +97337,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO",
direction="l",
linebreak="id",
- specials={ "compat", 0x0030, 0x70B9 },
+ specials={ "compat", 0x30, 0x70B9 },
unicodeslot=0x3358,
},
[0x3359]={
@@ -95089,7 +97346,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x70B9 },
+ specials={ "compat", 0x31, 0x70B9 },
unicodeslot=0x3359,
},
[0x335A]={
@@ -95098,7 +97355,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO",
direction="l",
linebreak="id",
- specials={ "compat", 0x0032, 0x70B9 },
+ specials={ "compat", 0x32, 0x70B9 },
unicodeslot=0x335A,
},
[0x335B]={
@@ -95107,7 +97364,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0033, 0x70B9 },
+ specials={ "compat", 0x33, 0x70B9 },
unicodeslot=0x335B,
},
[0x335C]={
@@ -95116,7 +97373,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR",
direction="l",
linebreak="id",
- specials={ "compat", 0x0034, 0x70B9 },
+ specials={ "compat", 0x34, 0x70B9 },
unicodeslot=0x335C,
},
[0x335D]={
@@ -95125,7 +97382,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0035, 0x70B9 },
+ specials={ "compat", 0x35, 0x70B9 },
unicodeslot=0x335D,
},
[0x335E]={
@@ -95134,7 +97391,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX",
direction="l",
linebreak="id",
- specials={ "compat", 0x0036, 0x70B9 },
+ specials={ "compat", 0x36, 0x70B9 },
unicodeslot=0x335E,
},
[0x335F]={
@@ -95143,7 +97400,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN",
direction="l",
linebreak="id",
- specials={ "compat", 0x0037, 0x70B9 },
+ specials={ "compat", 0x37, 0x70B9 },
unicodeslot=0x335F,
},
[0x3360]={
@@ -95152,7 +97409,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT",
direction="l",
linebreak="id",
- specials={ "compat", 0x0038, 0x70B9 },
+ specials={ "compat", 0x38, 0x70B9 },
unicodeslot=0x3360,
},
[0x3361]={
@@ -95161,7 +97418,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0039, 0x70B9 },
+ specials={ "compat", 0x39, 0x70B9 },
unicodeslot=0x3361,
},
[0x3362]={
@@ -95170,7 +97427,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x0030, 0x70B9 },
+ specials={ "compat", 0x31, 0x30, 0x70B9 },
unicodeslot=0x3362,
},
[0x3363]={
@@ -95179,7 +97436,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x0031, 0x70B9 },
+ specials={ "compat", 0x31, 0x31, 0x70B9 },
unicodeslot=0x3363,
},
[0x3364]={
@@ -95188,7 +97445,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x0032, 0x70B9 },
+ specials={ "compat", 0x31, 0x32, 0x70B9 },
unicodeslot=0x3364,
},
[0x3365]={
@@ -95197,7 +97454,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x0033, 0x70B9 },
+ specials={ "compat", 0x31, 0x33, 0x70B9 },
unicodeslot=0x3365,
},
[0x3366]={
@@ -95206,7 +97463,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x0034, 0x70B9 },
+ specials={ "compat", 0x31, 0x34, 0x70B9 },
unicodeslot=0x3366,
},
[0x3367]={
@@ -95215,7 +97472,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x0035, 0x70B9 },
+ specials={ "compat", 0x31, 0x35, 0x70B9 },
unicodeslot=0x3367,
},
[0x3368]={
@@ -95224,7 +97481,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x0036, 0x70B9 },
+ specials={ "compat", 0x31, 0x36, 0x70B9 },
unicodeslot=0x3368,
},
[0x3369]={
@@ -95233,7 +97490,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x0037, 0x70B9 },
+ specials={ "compat", 0x31, 0x37, 0x70B9 },
unicodeslot=0x3369,
},
[0x336A]={
@@ -95242,7 +97499,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x0038, 0x70B9 },
+ specials={ "compat", 0x31, 0x38, 0x70B9 },
unicodeslot=0x336A,
},
[0x336B]={
@@ -95251,7 +97508,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x0039, 0x70B9 },
+ specials={ "compat", 0x31, 0x39, 0x70B9 },
unicodeslot=0x336B,
},
[0x336C]={
@@ -95260,7 +97517,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY",
direction="l",
linebreak="id",
- specials={ "compat", 0x0032, 0x0030, 0x70B9 },
+ specials={ "compat", 0x32, 0x30, 0x70B9 },
unicodeslot=0x336C,
},
[0x336D]={
@@ -95269,7 +97526,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0032, 0x0031, 0x70B9 },
+ specials={ "compat", 0x32, 0x31, 0x70B9 },
unicodeslot=0x336D,
},
[0x336E]={
@@ -95278,7 +97535,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO",
direction="l",
linebreak="id",
- specials={ "compat", 0x0032, 0x0032, 0x70B9 },
+ specials={ "compat", 0x32, 0x32, 0x70B9 },
unicodeslot=0x336E,
},
[0x336F]={
@@ -95287,7 +97544,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0032, 0x0033, 0x70B9 },
+ specials={ "compat", 0x32, 0x33, 0x70B9 },
unicodeslot=0x336F,
},
[0x3370]={
@@ -95296,7 +97553,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR",
direction="l",
linebreak="id",
- specials={ "compat", 0x0032, 0x0034, 0x70B9 },
+ specials={ "compat", 0x32, 0x34, 0x70B9 },
unicodeslot=0x3370,
},
[0x3371]={
@@ -95305,7 +97562,7 @@ characters.data={
description="SQUARE HPA",
direction="l",
linebreak="id",
- specials={ "square", 0x0068, 0x0050, 0x0061 },
+ specials={ "square", 0x68, 0x50, 0x61 },
unicodeslot=0x3371,
},
[0x3372]={
@@ -95314,7 +97571,7 @@ characters.data={
description="SQUARE DA",
direction="l",
linebreak="id",
- specials={ "square", 0x0064, 0x0061 },
+ specials={ "square", 0x64, 0x61 },
unicodeslot=0x3372,
},
[0x3373]={
@@ -95323,7 +97580,7 @@ characters.data={
description="SQUARE AU",
direction="l",
linebreak="id",
- specials={ "square", 0x0041, 0x0055 },
+ specials={ "square", 0x41, 0x55 },
unicodeslot=0x3373,
},
[0x3374]={
@@ -95332,7 +97589,7 @@ characters.data={
description="SQUARE BAR",
direction="l",
linebreak="id",
- specials={ "square", 0x0062, 0x0061, 0x0072 },
+ specials={ "square", 0x62, 0x61, 0x72 },
unicodeslot=0x3374,
},
[0x3375]={
@@ -95341,7 +97598,7 @@ characters.data={
description="SQUARE OV",
direction="l",
linebreak="id",
- specials={ "square", 0x006F, 0x0056 },
+ specials={ "square", 0x6F, 0x56 },
unicodeslot=0x3375,
},
[0x3376]={
@@ -95350,7 +97607,7 @@ characters.data={
description="SQUARE PC",
direction="l",
linebreak="id",
- specials={ "square", 0x0070, 0x0063 },
+ specials={ "square", 0x70, 0x63 },
unicodeslot=0x3376,
},
[0x3377]={
@@ -95359,7 +97616,7 @@ characters.data={
description="SQUARE DM",
direction="on",
linebreak="id",
- specials={ "square", 0x0064, 0x006D },
+ specials={ "square", 0x64, 0x6D },
unicodeslot=0x3377,
},
[0x3378]={
@@ -95368,7 +97625,7 @@ characters.data={
description="SQUARE DM SQUARED",
direction="on",
linebreak="id",
- specials={ "square", 0x0064, 0x006D, 0x00B2 },
+ specials={ "square", 0x64, 0x6D, 0xB2 },
unicodeslot=0x3378,
},
[0x3379]={
@@ -95377,7 +97634,7 @@ characters.data={
description="SQUARE DM CUBED",
direction="on",
linebreak="id",
- specials={ "square", 0x0064, 0x006D, 0x00B3 },
+ specials={ "square", 0x64, 0x6D, 0xB3 },
unicodeslot=0x3379,
},
[0x337A]={
@@ -95386,7 +97643,7 @@ characters.data={
description="SQUARE IU",
direction="on",
linebreak="id",
- specials={ "square", 0x0049, 0x0055 },
+ specials={ "square", 0x49, 0x55 },
unicodeslot=0x337A,
},
[0x337B]={
@@ -95446,7 +97703,7 @@ characters.data={
description="SQUARE PA AMPS",
direction="l",
linebreak="id",
- specials={ "square", 0x0070, 0x0041 },
+ specials={ "square", 0x70, 0x41 },
unicodeslot=0x3380,
},
[0x3381]={
@@ -95456,7 +97713,7 @@ characters.data={
description="SQUARE NA",
direction="l",
linebreak="id",
- specials={ "square", 0x006E, 0x0041 },
+ specials={ "square", 0x6E, 0x41 },
unicodeslot=0x3381,
},
[0x3382]={
@@ -95466,7 +97723,7 @@ characters.data={
description="SQUARE MU A",
direction="l",
linebreak="id",
- specials={ "square", 0x03BC, 0x0041 },
+ specials={ "square", 0x3BC, 0x41 },
unicodeslot=0x3382,
},
[0x3383]={
@@ -95476,7 +97733,7 @@ characters.data={
description="SQUARE MA",
direction="l",
linebreak="id",
- specials={ "square", 0x006D, 0x0041 },
+ specials={ "square", 0x6D, 0x41 },
unicodeslot=0x3383,
},
[0x3384]={
@@ -95486,7 +97743,7 @@ characters.data={
description="SQUARE KA",
direction="l",
linebreak="id",
- specials={ "square", 0x006B, 0x0041 },
+ specials={ "square", 0x6B, 0x41 },
unicodeslot=0x3384,
},
[0x3385]={
@@ -95496,7 +97753,7 @@ characters.data={
description="SQUARE KB",
direction="l",
linebreak="id",
- specials={ "square", 0x004B, 0x0042 },
+ specials={ "square", 0x4B, 0x42 },
unicodeslot=0x3385,
},
[0x3386]={
@@ -95506,7 +97763,7 @@ characters.data={
description="SQUARE MB",
direction="l",
linebreak="id",
- specials={ "square", 0x004D, 0x0042 },
+ specials={ "square", 0x4D, 0x42 },
unicodeslot=0x3386,
},
[0x3387]={
@@ -95516,7 +97773,7 @@ characters.data={
description="SQUARE GB",
direction="l",
linebreak="id",
- specials={ "square", 0x0047, 0x0042 },
+ specials={ "square", 0x47, 0x42 },
unicodeslot=0x3387,
},
[0x3388]={
@@ -95526,7 +97783,7 @@ characters.data={
description="SQUARE CAL",
direction="l",
linebreak="id",
- specials={ "square", 0x0063, 0x0061, 0x006C },
+ specials={ "square", 0x63, 0x61, 0x6C },
unicodeslot=0x3388,
},
[0x3389]={
@@ -95536,7 +97793,7 @@ characters.data={
description="SQUARE KCAL",
direction="l",
linebreak="id",
- specials={ "square", 0x006B, 0x0063, 0x0061, 0x006C },
+ specials={ "square", 0x6B, 0x63, 0x61, 0x6C },
unicodeslot=0x3389,
},
[0x338A]={
@@ -95546,7 +97803,7 @@ characters.data={
description="SQUARE PF",
direction="l",
linebreak="id",
- specials={ "square", 0x0070, 0x0046 },
+ specials={ "square", 0x70, 0x46 },
unicodeslot=0x338A,
},
[0x338B]={
@@ -95556,7 +97813,7 @@ characters.data={
description="SQUARE NF",
direction="l",
linebreak="id",
- specials={ "square", 0x006E, 0x0046 },
+ specials={ "square", 0x6E, 0x46 },
unicodeslot=0x338B,
},
[0x338C]={
@@ -95566,7 +97823,7 @@ characters.data={
description="SQUARE MU F",
direction="l",
linebreak="id",
- specials={ "square", 0x03BC, 0x0046 },
+ specials={ "square", 0x3BC, 0x46 },
unicodeslot=0x338C,
},
[0x338D]={
@@ -95576,7 +97833,7 @@ characters.data={
description="SQUARE MU G",
direction="l",
linebreak="id",
- specials={ "square", 0x03BC, 0x0067 },
+ specials={ "square", 0x3BC, 0x67 },
unicodeslot=0x338D,
},
[0x338E]={
@@ -95586,7 +97843,7 @@ characters.data={
description="SQUARE MG",
direction="l",
linebreak="id",
- specials={ "square", 0x006D, 0x0067 },
+ specials={ "square", 0x6D, 0x67 },
unicodeslot=0x338E,
},
[0x338F]={
@@ -95596,7 +97853,7 @@ characters.data={
description="SQUARE KG",
direction="l",
linebreak="id",
- specials={ "square", 0x006B, 0x0067 },
+ specials={ "square", 0x6B, 0x67 },
unicodeslot=0x338F,
},
[0x3390]={
@@ -95606,7 +97863,7 @@ characters.data={
description="SQUARE HZ",
direction="l",
linebreak="id",
- specials={ "square", 0x0048, 0x007A },
+ specials={ "square", 0x48, 0x7A },
unicodeslot=0x3390,
},
[0x3391]={
@@ -95616,7 +97873,7 @@ characters.data={
description="SQUARE KHZ",
direction="l",
linebreak="id",
- specials={ "square", 0x006B, 0x0048, 0x007A },
+ specials={ "square", 0x6B, 0x48, 0x7A },
unicodeslot=0x3391,
},
[0x3392]={
@@ -95626,7 +97883,7 @@ characters.data={
description="SQUARE MHZ",
direction="l",
linebreak="id",
- specials={ "square", 0x004D, 0x0048, 0x007A },
+ specials={ "square", 0x4D, 0x48, 0x7A },
unicodeslot=0x3392,
},
[0x3393]={
@@ -95636,7 +97893,7 @@ characters.data={
description="SQUARE GHZ",
direction="l",
linebreak="id",
- specials={ "square", 0x0047, 0x0048, 0x007A },
+ specials={ "square", 0x47, 0x48, 0x7A },
unicodeslot=0x3393,
},
[0x3394]={
@@ -95646,7 +97903,7 @@ characters.data={
description="SQUARE THZ",
direction="l",
linebreak="id",
- specials={ "square", 0x0054, 0x0048, 0x007A },
+ specials={ "square", 0x54, 0x48, 0x7A },
unicodeslot=0x3394,
},
[0x3395]={
@@ -95656,7 +97913,7 @@ characters.data={
description="SQUARE MU L",
direction="l",
linebreak="id",
- specials={ "square", 0x03BC, 0x2113 },
+ specials={ "square", 0x3BC, 0x2113 },
unicodeslot=0x3395,
},
[0x3396]={
@@ -95666,7 +97923,7 @@ characters.data={
description="SQUARE ML",
direction="l",
linebreak="id",
- specials={ "square", 0x006D, 0x2113 },
+ specials={ "square", 0x6D, 0x2113 },
unicodeslot=0x3396,
},
[0x3397]={
@@ -95676,7 +97933,7 @@ characters.data={
description="SQUARE DL",
direction="l",
linebreak="id",
- specials={ "square", 0x0064, 0x2113 },
+ specials={ "square", 0x64, 0x2113 },
unicodeslot=0x3397,
},
[0x3398]={
@@ -95686,7 +97943,7 @@ characters.data={
description="SQUARE KL",
direction="l",
linebreak="id",
- specials={ "square", 0x006B, 0x2113 },
+ specials={ "square", 0x6B, 0x2113 },
unicodeslot=0x3398,
},
[0x3399]={
@@ -95696,7 +97953,7 @@ characters.data={
description="SQUARE FM",
direction="l",
linebreak="id",
- specials={ "square", 0x0066, 0x006D },
+ specials={ "square", 0x66, 0x6D },
unicodeslot=0x3399,
},
[0x339A]={
@@ -95706,7 +97963,7 @@ characters.data={
description="SQUARE NM",
direction="l",
linebreak="id",
- specials={ "square", 0x006E, 0x006D },
+ specials={ "square", 0x6E, 0x6D },
unicodeslot=0x339A,
},
[0x339B]={
@@ -95716,7 +97973,7 @@ characters.data={
description="SQUARE MU M",
direction="l",
linebreak="id",
- specials={ "square", 0x03BC, 0x006D },
+ specials={ "square", 0x3BC, 0x6D },
unicodeslot=0x339B,
},
[0x339C]={
@@ -95726,7 +97983,7 @@ characters.data={
description="SQUARE MM",
direction="l",
linebreak="id",
- specials={ "square", 0x006D, 0x006D },
+ specials={ "square", 0x6D, 0x6D },
unicodeslot=0x339C,
},
[0x339D]={
@@ -95736,7 +97993,7 @@ characters.data={
description="SQUARE CM",
direction="l",
linebreak="id",
- specials={ "square", 0x0063, 0x006D },
+ specials={ "square", 0x63, 0x6D },
unicodeslot=0x339D,
},
[0x339E]={
@@ -95746,7 +98003,7 @@ characters.data={
description="SQUARE KM",
direction="l",
linebreak="id",
- specials={ "square", 0x006B, 0x006D },
+ specials={ "square", 0x6B, 0x6D },
unicodeslot=0x339E,
},
[0x339F]={
@@ -95756,7 +98013,7 @@ characters.data={
description="SQUARE MM SQUARED",
direction="l",
linebreak="id",
- specials={ "square", 0x006D, 0x006D, 0x00B2 },
+ specials={ "square", 0x6D, 0x6D, 0xB2 },
unicodeslot=0x339F,
},
[0x33A0]={
@@ -95766,7 +98023,7 @@ characters.data={
description="SQUARE CM SQUARED",
direction="l",
linebreak="id",
- specials={ "square", 0x0063, 0x006D, 0x00B2 },
+ specials={ "square", 0x63, 0x6D, 0xB2 },
unicodeslot=0x33A0,
},
[0x33A1]={
@@ -95776,7 +98033,7 @@ characters.data={
description="SQUARE M SQUARED",
direction="l",
linebreak="id",
- specials={ "square", 0x006D, 0x00B2 },
+ specials={ "square", 0x6D, 0xB2 },
unicodeslot=0x33A1,
},
[0x33A2]={
@@ -95786,7 +98043,7 @@ characters.data={
description="SQUARE KM SQUARED",
direction="l",
linebreak="id",
- specials={ "square", 0x006B, 0x006D, 0x00B2 },
+ specials={ "square", 0x6B, 0x6D, 0xB2 },
unicodeslot=0x33A2,
},
[0x33A3]={
@@ -95796,7 +98053,7 @@ characters.data={
description="SQUARE MM CUBED",
direction="l",
linebreak="id",
- specials={ "square", 0x006D, 0x006D, 0x00B3 },
+ specials={ "square", 0x6D, 0x6D, 0xB3 },
unicodeslot=0x33A3,
},
[0x33A4]={
@@ -95806,7 +98063,7 @@ characters.data={
description="SQUARE CM CUBED",
direction="l",
linebreak="id",
- specials={ "square", 0x0063, 0x006D, 0x00B3 },
+ specials={ "square", 0x63, 0x6D, 0xB3 },
unicodeslot=0x33A4,
},
[0x33A5]={
@@ -95816,7 +98073,7 @@ characters.data={
description="SQUARE M CUBED",
direction="l",
linebreak="id",
- specials={ "square", 0x006D, 0x00B3 },
+ specials={ "square", 0x6D, 0xB3 },
unicodeslot=0x33A5,
},
[0x33A6]={
@@ -95826,7 +98083,7 @@ characters.data={
description="SQUARE KM CUBED",
direction="l",
linebreak="id",
- specials={ "square", 0x006B, 0x006D, 0x00B3 },
+ specials={ "square", 0x6B, 0x6D, 0xB3 },
unicodeslot=0x33A6,
},
[0x33A7]={
@@ -95836,7 +98093,7 @@ characters.data={
description="SQUARE M OVER S",
direction="l",
linebreak="id",
- specials={ "square", 0x006D, 0x2215, 0x0073 },
+ specials={ "square", 0x6D, 0x2215, 0x73 },
unicodeslot=0x33A7,
},
[0x33A8]={
@@ -95846,7 +98103,7 @@ characters.data={
description="SQUARE M OVER S SQUARED",
direction="l",
linebreak="id",
- specials={ "square", 0x006D, 0x2215, 0x0073, 0x00B2 },
+ specials={ "square", 0x6D, 0x2215, 0x73, 0xB2 },
unicodeslot=0x33A8,
},
[0x33A9]={
@@ -95856,7 +98113,7 @@ characters.data={
description="SQUARE PA",
direction="l",
linebreak="id",
- specials={ "square", 0x0050, 0x0061 },
+ specials={ "square", 0x50, 0x61 },
unicodeslot=0x33A9,
},
[0x33AA]={
@@ -95866,7 +98123,7 @@ characters.data={
description="SQUARE KPA",
direction="l",
linebreak="id",
- specials={ "square", 0x006B, 0x0050, 0x0061 },
+ specials={ "square", 0x6B, 0x50, 0x61 },
unicodeslot=0x33AA,
},
[0x33AB]={
@@ -95876,7 +98133,7 @@ characters.data={
description="SQUARE MPA",
direction="l",
linebreak="id",
- specials={ "square", 0x004D, 0x0050, 0x0061 },
+ specials={ "square", 0x4D, 0x50, 0x61 },
unicodeslot=0x33AB,
},
[0x33AC]={
@@ -95886,7 +98143,7 @@ characters.data={
description="SQUARE GPA",
direction="l",
linebreak="id",
- specials={ "square", 0x0047, 0x0050, 0x0061 },
+ specials={ "square", 0x47, 0x50, 0x61 },
unicodeslot=0x33AC,
},
[0x33AD]={
@@ -95896,7 +98153,7 @@ characters.data={
description="SQUARE RAD",
direction="l",
linebreak="id",
- specials={ "square", 0x0072, 0x0061, 0x0064 },
+ specials={ "square", 0x72, 0x61, 0x64 },
unicodeslot=0x33AD,
},
[0x33AE]={
@@ -95906,7 +98163,7 @@ characters.data={
description="SQUARE RAD OVER S",
direction="l",
linebreak="id",
- specials={ "square", 0x0072, 0x0061, 0x0064, 0x2215, 0x0073 },
+ specials={ "square", 0x72, 0x61, 0x64, 0x2215, 0x73 },
unicodeslot=0x33AE,
},
[0x33AF]={
@@ -95916,7 +98173,7 @@ characters.data={
description="SQUARE RAD OVER S SQUARED",
direction="l",
linebreak="id",
- specials={ "square", 0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0x00B2 },
+ specials={ "square", 0x72, 0x61, 0x64, 0x2215, 0x73, 0xB2 },
unicodeslot=0x33AF,
},
[0x33B0]={
@@ -95926,7 +98183,7 @@ characters.data={
description="SQUARE PS",
direction="l",
linebreak="id",
- specials={ "square", 0x0070, 0x0073 },
+ specials={ "square", 0x70, 0x73 },
unicodeslot=0x33B0,
},
[0x33B1]={
@@ -95936,7 +98193,7 @@ characters.data={
description="SQUARE NS",
direction="l",
linebreak="id",
- specials={ "square", 0x006E, 0x0073 },
+ specials={ "square", 0x6E, 0x73 },
unicodeslot=0x33B1,
},
[0x33B2]={
@@ -95946,7 +98203,7 @@ characters.data={
description="SQUARE MU S",
direction="l",
linebreak="id",
- specials={ "square", 0x03BC, 0x0073 },
+ specials={ "square", 0x3BC, 0x73 },
unicodeslot=0x33B2,
},
[0x33B3]={
@@ -95956,7 +98213,7 @@ characters.data={
description="SQUARE MS",
direction="l",
linebreak="id",
- specials={ "square", 0x006D, 0x0073 },
+ specials={ "square", 0x6D, 0x73 },
unicodeslot=0x33B3,
},
[0x33B4]={
@@ -95966,7 +98223,7 @@ characters.data={
description="SQUARE PV",
direction="l",
linebreak="id",
- specials={ "square", 0x0070, 0x0056 },
+ specials={ "square", 0x70, 0x56 },
unicodeslot=0x33B4,
},
[0x33B5]={
@@ -95976,7 +98233,7 @@ characters.data={
description="SQUARE NV",
direction="l",
linebreak="id",
- specials={ "square", 0x006E, 0x0056 },
+ specials={ "square", 0x6E, 0x56 },
unicodeslot=0x33B5,
},
[0x33B6]={
@@ -95986,7 +98243,7 @@ characters.data={
description="SQUARE MU V",
direction="l",
linebreak="id",
- specials={ "square", 0x03BC, 0x0056 },
+ specials={ "square", 0x3BC, 0x56 },
unicodeslot=0x33B6,
},
[0x33B7]={
@@ -95996,7 +98253,7 @@ characters.data={
description="SQUARE MV",
direction="l",
linebreak="id",
- specials={ "square", 0x006D, 0x0056 },
+ specials={ "square", 0x6D, 0x56 },
unicodeslot=0x33B7,
},
[0x33B8]={
@@ -96006,7 +98263,7 @@ characters.data={
description="SQUARE KV",
direction="l",
linebreak="id",
- specials={ "square", 0x006B, 0x0056 },
+ specials={ "square", 0x6B, 0x56 },
unicodeslot=0x33B8,
},
[0x33B9]={
@@ -96016,7 +98273,7 @@ characters.data={
description="SQUARE MV MEGA",
direction="l",
linebreak="id",
- specials={ "square", 0x004D, 0x0056 },
+ specials={ "square", 0x4D, 0x56 },
unicodeslot=0x33B9,
},
[0x33BA]={
@@ -96026,7 +98283,7 @@ characters.data={
description="SQUARE PW",
direction="l",
linebreak="id",
- specials={ "square", 0x0070, 0x0057 },
+ specials={ "square", 0x70, 0x57 },
unicodeslot=0x33BA,
},
[0x33BB]={
@@ -96036,7 +98293,7 @@ characters.data={
description="SQUARE NW",
direction="l",
linebreak="id",
- specials={ "square", 0x006E, 0x0057 },
+ specials={ "square", 0x6E, 0x57 },
unicodeslot=0x33BB,
},
[0x33BC]={
@@ -96046,7 +98303,7 @@ characters.data={
description="SQUARE MU W",
direction="l",
linebreak="id",
- specials={ "square", 0x03BC, 0x0057 },
+ specials={ "square", 0x3BC, 0x57 },
unicodeslot=0x33BC,
},
[0x33BD]={
@@ -96056,7 +98313,7 @@ characters.data={
description="SQUARE MW",
direction="l",
linebreak="id",
- specials={ "square", 0x006D, 0x0057 },
+ specials={ "square", 0x6D, 0x57 },
unicodeslot=0x33BD,
},
[0x33BE]={
@@ -96066,7 +98323,7 @@ characters.data={
description="SQUARE KW",
direction="l",
linebreak="id",
- specials={ "square", 0x006B, 0x0057 },
+ specials={ "square", 0x6B, 0x57 },
unicodeslot=0x33BE,
},
[0x33BF]={
@@ -96076,7 +98333,7 @@ characters.data={
description="SQUARE MW MEGA",
direction="l",
linebreak="id",
- specials={ "square", 0x004D, 0x0057 },
+ specials={ "square", 0x4D, 0x57 },
unicodeslot=0x33BF,
},
[0x33C0]={
@@ -96086,7 +98343,7 @@ characters.data={
description="SQUARE K OHM",
direction="l",
linebreak="id",
- specials={ "square", 0x006B, 0x03A9 },
+ specials={ "square", 0x6B, 0x3A9 },
unicodeslot=0x33C0,
},
[0x33C1]={
@@ -96096,7 +98353,7 @@ characters.data={
description="SQUARE M OHM",
direction="l",
linebreak="id",
- specials={ "square", 0x004D, 0x03A9 },
+ specials={ "square", 0x4D, 0x3A9 },
unicodeslot=0x33C1,
},
[0x33C2]={
@@ -96106,7 +98363,7 @@ characters.data={
description="SQUARE AM",
direction="l",
linebreak="id",
- specials={ "square", 0x0061, 0x002E, 0x006D, 0x002E },
+ specials={ "square", 0x61, 0x2E, 0x6D, 0x2E },
unicodeslot=0x33C2,
},
[0x33C3]={
@@ -96116,7 +98373,7 @@ characters.data={
description="SQUARE BQ",
direction="l",
linebreak="id",
- specials={ "square", 0x0042, 0x0071 },
+ specials={ "square", 0x42, 0x71 },
unicodeslot=0x33C3,
},
[0x33C4]={
@@ -96126,7 +98383,7 @@ characters.data={
description="SQUARE CC",
direction="l",
linebreak="id",
- specials={ "square", 0x0063, 0x0063 },
+ specials={ "square", 0x63, 0x63 },
unicodeslot=0x33C4,
},
[0x33C5]={
@@ -96136,7 +98393,7 @@ characters.data={
description="SQUARE CD",
direction="l",
linebreak="id",
- specials={ "square", 0x0063, 0x0064 },
+ specials={ "square", 0x63, 0x64 },
unicodeslot=0x33C5,
},
[0x33C6]={
@@ -96146,7 +98403,7 @@ characters.data={
description="SQUARE C OVER KG",
direction="l",
linebreak="id",
- specials={ "square", 0x0043, 0x2215, 0x006B, 0x0067 },
+ specials={ "square", 0x43, 0x2215, 0x6B, 0x67 },
unicodeslot=0x33C6,
},
[0x33C7]={
@@ -96156,7 +98413,7 @@ characters.data={
description="SQUARE CO",
direction="l",
linebreak="id",
- specials={ "square", 0x0043, 0x006F, 0x002E },
+ specials={ "square", 0x43, 0x6F, 0x2E },
unicodeslot=0x33C7,
},
[0x33C8]={
@@ -96166,7 +98423,7 @@ characters.data={
description="SQUARE DB",
direction="l",
linebreak="id",
- specials={ "square", 0x0064, 0x0042 },
+ specials={ "square", 0x64, 0x42 },
unicodeslot=0x33C8,
},
[0x33C9]={
@@ -96176,7 +98433,7 @@ characters.data={
description="SQUARE GY",
direction="l",
linebreak="id",
- specials={ "square", 0x0047, 0x0079 },
+ specials={ "square", 0x47, 0x79 },
unicodeslot=0x33C9,
},
[0x33CA]={
@@ -96186,7 +98443,7 @@ characters.data={
description="SQUARE HA",
direction="l",
linebreak="id",
- specials={ "square", 0x0068, 0x0061 },
+ specials={ "square", 0x68, 0x61 },
unicodeslot=0x33CA,
},
[0x33CB]={
@@ -96196,7 +98453,7 @@ characters.data={
description="SQUARE HP",
direction="l",
linebreak="id",
- specials={ "square", 0x0048, 0x0050 },
+ specials={ "square", 0x48, 0x50 },
unicodeslot=0x33CB,
},
[0x33CC]={
@@ -96205,7 +98462,7 @@ characters.data={
description="SQUARE IN",
direction="l",
linebreak="id",
- specials={ "square", 0x0069, 0x006E },
+ specials={ "square", 0x69, 0x6E },
unicodeslot=0x33CC,
},
[0x33CD]={
@@ -96215,7 +98472,7 @@ characters.data={
description="SQUARE KK",
direction="l",
linebreak="id",
- specials={ "square", 0x004B, 0x004B },
+ specials={ "square", 0x4B, 0x4B },
unicodeslot=0x33CD,
},
[0x33CE]={
@@ -96225,7 +98482,7 @@ characters.data={
description="SQUARE KM CAPITAL",
direction="l",
linebreak="id",
- specials={ "square", 0x004B, 0x004D },
+ specials={ "square", 0x4B, 0x4D },
unicodeslot=0x33CE,
},
[0x33CF]={
@@ -96235,7 +98492,7 @@ characters.data={
description="SQUARE KT",
direction="l",
linebreak="id",
- specials={ "square", 0x006B, 0x0074 },
+ specials={ "square", 0x6B, 0x74 },
unicodeslot=0x33CF,
},
[0x33D0]={
@@ -96245,7 +98502,7 @@ characters.data={
description="SQUARE LM",
direction="l",
linebreak="id",
- specials={ "square", 0x006C, 0x006D },
+ specials={ "square", 0x6C, 0x6D },
unicodeslot=0x33D0,
},
[0x33D1]={
@@ -96255,7 +98512,7 @@ characters.data={
description="SQUARE LN",
direction="l",
linebreak="id",
- specials={ "square", 0x006C, 0x006E },
+ specials={ "square", 0x6C, 0x6E },
unicodeslot=0x33D1,
},
[0x33D2]={
@@ -96265,7 +98522,7 @@ characters.data={
description="SQUARE LOG",
direction="l",
linebreak="id",
- specials={ "square", 0x006C, 0x006F, 0x0067 },
+ specials={ "square", 0x6C, 0x6F, 0x67 },
unicodeslot=0x33D2,
},
[0x33D3]={
@@ -96275,7 +98532,7 @@ characters.data={
description="SQUARE LX",
direction="l",
linebreak="id",
- specials={ "square", 0x006C, 0x0078 },
+ specials={ "square", 0x6C, 0x78 },
unicodeslot=0x33D3,
},
[0x33D4]={
@@ -96285,7 +98542,7 @@ characters.data={
description="SQUARE MB SMALL",
direction="l",
linebreak="id",
- specials={ "square", 0x006D, 0x0062 },
+ specials={ "square", 0x6D, 0x62 },
unicodeslot=0x33D4,
},
[0x33D5]={
@@ -96295,7 +98552,7 @@ characters.data={
description="SQUARE MIL",
direction="l",
linebreak="id",
- specials={ "square", 0x006D, 0x0069, 0x006C },
+ specials={ "square", 0x6D, 0x69, 0x6C },
unicodeslot=0x33D5,
},
[0x33D6]={
@@ -96305,7 +98562,7 @@ characters.data={
description="SQUARE MOL",
direction="l",
linebreak="id",
- specials={ "square", 0x006D, 0x006F, 0x006C },
+ specials={ "square", 0x6D, 0x6F, 0x6C },
unicodeslot=0x33D6,
},
[0x33D7]={
@@ -96314,7 +98571,7 @@ characters.data={
description="SQUARE PH",
direction="l",
linebreak="id",
- specials={ "square", 0x0050, 0x0048 },
+ specials={ "square", 0x50, 0x48 },
unicodeslot=0x33D7,
},
[0x33D8]={
@@ -96324,7 +98581,7 @@ characters.data={
description="SQUARE PM",
direction="l",
linebreak="id",
- specials={ "square", 0x0070, 0x002E, 0x006D, 0x002E },
+ specials={ "square", 0x70, 0x2E, 0x6D, 0x2E },
unicodeslot=0x33D8,
},
[0x33D9]={
@@ -96333,7 +98590,7 @@ characters.data={
description="SQUARE PPM",
direction="l",
linebreak="id",
- specials={ "square", 0x0050, 0x0050, 0x004D },
+ specials={ "square", 0x50, 0x50, 0x4D },
unicodeslot=0x33D9,
},
[0x33DA]={
@@ -96342,7 +98599,7 @@ characters.data={
description="SQUARE PR",
direction="l",
linebreak="id",
- specials={ "square", 0x0050, 0x0052 },
+ specials={ "square", 0x50, 0x52 },
unicodeslot=0x33DA,
},
[0x33DB]={
@@ -96352,7 +98609,7 @@ characters.data={
description="SQUARE SR",
direction="l",
linebreak="id",
- specials={ "square", 0x0073, 0x0072 },
+ specials={ "square", 0x73, 0x72 },
unicodeslot=0x33DB,
},
[0x33DC]={
@@ -96362,7 +98619,7 @@ characters.data={
description="SQUARE SV",
direction="l",
linebreak="id",
- specials={ "square", 0x0053, 0x0076 },
+ specials={ "square", 0x53, 0x76 },
unicodeslot=0x33DC,
},
[0x33DD]={
@@ -96372,7 +98629,7 @@ characters.data={
description="SQUARE WB",
direction="l",
linebreak="id",
- specials={ "square", 0x0057, 0x0062 },
+ specials={ "square", 0x57, 0x62 },
unicodeslot=0x33DD,
},
[0x33DE]={
@@ -96381,7 +98638,7 @@ characters.data={
description="SQUARE V OVER M",
direction="on",
linebreak="id",
- specials={ "square", 0x0056, 0x2215, 0x006D },
+ specials={ "square", 0x56, 0x2215, 0x6D },
unicodeslot=0x33DE,
},
[0x33DF]={
@@ -96390,7 +98647,7 @@ characters.data={
description="SQUARE A OVER M",
direction="on",
linebreak="id",
- specials={ "square", 0x0041, 0x2215, 0x006D },
+ specials={ "square", 0x41, 0x2215, 0x6D },
unicodeslot=0x33DF,
},
[0x33E0]={
@@ -96399,7 +98656,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x65E5 },
+ specials={ "compat", 0x31, 0x65E5 },
unicodeslot=0x33E0,
},
[0x33E1]={
@@ -96408,7 +98665,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO",
direction="l",
linebreak="id",
- specials={ "compat", 0x0032, 0x65E5 },
+ specials={ "compat", 0x32, 0x65E5 },
unicodeslot=0x33E1,
},
[0x33E2]={
@@ -96417,7 +98674,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0033, 0x65E5 },
+ specials={ "compat", 0x33, 0x65E5 },
unicodeslot=0x33E2,
},
[0x33E3]={
@@ -96426,7 +98683,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR",
direction="l",
linebreak="id",
- specials={ "compat", 0x0034, 0x65E5 },
+ specials={ "compat", 0x34, 0x65E5 },
unicodeslot=0x33E3,
},
[0x33E4]={
@@ -96435,7 +98692,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0035, 0x65E5 },
+ specials={ "compat", 0x35, 0x65E5 },
unicodeslot=0x33E4,
},
[0x33E5]={
@@ -96444,7 +98701,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX",
direction="l",
linebreak="id",
- specials={ "compat", 0x0036, 0x65E5 },
+ specials={ "compat", 0x36, 0x65E5 },
unicodeslot=0x33E5,
},
[0x33E6]={
@@ -96453,7 +98710,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN",
direction="l",
linebreak="id",
- specials={ "compat", 0x0037, 0x65E5 },
+ specials={ "compat", 0x37, 0x65E5 },
unicodeslot=0x33E6,
},
[0x33E7]={
@@ -96462,7 +98719,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT",
direction="l",
linebreak="id",
- specials={ "compat", 0x0038, 0x65E5 },
+ specials={ "compat", 0x38, 0x65E5 },
unicodeslot=0x33E7,
},
[0x33E8]={
@@ -96471,7 +98728,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0039, 0x65E5 },
+ specials={ "compat", 0x39, 0x65E5 },
unicodeslot=0x33E8,
},
[0x33E9]={
@@ -96480,7 +98737,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x0030, 0x65E5 },
+ specials={ "compat", 0x31, 0x30, 0x65E5 },
unicodeslot=0x33E9,
},
[0x33EA]={
@@ -96489,7 +98746,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x0031, 0x65E5 },
+ specials={ "compat", 0x31, 0x31, 0x65E5 },
unicodeslot=0x33EA,
},
[0x33EB]={
@@ -96498,7 +98755,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x0032, 0x65E5 },
+ specials={ "compat", 0x31, 0x32, 0x65E5 },
unicodeslot=0x33EB,
},
[0x33EC]={
@@ -96507,7 +98764,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x0033, 0x65E5 },
+ specials={ "compat", 0x31, 0x33, 0x65E5 },
unicodeslot=0x33EC,
},
[0x33ED]={
@@ -96516,7 +98773,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x0034, 0x65E5 },
+ specials={ "compat", 0x31, 0x34, 0x65E5 },
unicodeslot=0x33ED,
},
[0x33EE]={
@@ -96525,7 +98782,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x0035, 0x65E5 },
+ specials={ "compat", 0x31, 0x35, 0x65E5 },
unicodeslot=0x33EE,
},
[0x33EF]={
@@ -96534,7 +98791,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x0036, 0x65E5 },
+ specials={ "compat", 0x31, 0x36, 0x65E5 },
unicodeslot=0x33EF,
},
[0x33F0]={
@@ -96543,7 +98800,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x0037, 0x65E5 },
+ specials={ "compat", 0x31, 0x37, 0x65E5 },
unicodeslot=0x33F0,
},
[0x33F1]={
@@ -96552,7 +98809,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x0038, 0x65E5 },
+ specials={ "compat", 0x31, 0x38, 0x65E5 },
unicodeslot=0x33F1,
},
[0x33F2]={
@@ -96561,7 +98818,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN",
direction="l",
linebreak="id",
- specials={ "compat", 0x0031, 0x0039, 0x65E5 },
+ specials={ "compat", 0x31, 0x39, 0x65E5 },
unicodeslot=0x33F2,
},
[0x33F3]={
@@ -96570,7 +98827,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY",
direction="l",
linebreak="id",
- specials={ "compat", 0x0032, 0x0030, 0x65E5 },
+ specials={ "compat", 0x32, 0x30, 0x65E5 },
unicodeslot=0x33F3,
},
[0x33F4]={
@@ -96579,7 +98836,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0032, 0x0031, 0x65E5 },
+ specials={ "compat", 0x32, 0x31, 0x65E5 },
unicodeslot=0x33F4,
},
[0x33F5]={
@@ -96588,7 +98845,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO",
direction="l",
linebreak="id",
- specials={ "compat", 0x0032, 0x0032, 0x65E5 },
+ specials={ "compat", 0x32, 0x32, 0x65E5 },
unicodeslot=0x33F5,
},
[0x33F6]={
@@ -96597,7 +98854,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0032, 0x0033, 0x65E5 },
+ specials={ "compat", 0x32, 0x33, 0x65E5 },
unicodeslot=0x33F6,
},
[0x33F7]={
@@ -96606,7 +98863,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR",
direction="l",
linebreak="id",
- specials={ "compat", 0x0032, 0x0034, 0x65E5 },
+ specials={ "compat", 0x32, 0x34, 0x65E5 },
unicodeslot=0x33F7,
},
[0x33F8]={
@@ -96615,7 +98872,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0032, 0x0035, 0x65E5 },
+ specials={ "compat", 0x32, 0x35, 0x65E5 },
unicodeslot=0x33F8,
},
[0x33F9]={
@@ -96624,7 +98881,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX",
direction="l",
linebreak="id",
- specials={ "compat", 0x0032, 0x0036, 0x65E5 },
+ specials={ "compat", 0x32, 0x36, 0x65E5 },
unicodeslot=0x33F9,
},
[0x33FA]={
@@ -96633,7 +98890,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN",
direction="l",
linebreak="id",
- specials={ "compat", 0x0032, 0x0037, 0x65E5 },
+ specials={ "compat", 0x32, 0x37, 0x65E5 },
unicodeslot=0x33FA,
},
[0x33FB]={
@@ -96642,7 +98899,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT",
direction="l",
linebreak="id",
- specials={ "compat", 0x0032, 0x0038, 0x65E5 },
+ specials={ "compat", 0x32, 0x38, 0x65E5 },
unicodeslot=0x33FB,
},
[0x33FC]={
@@ -96651,7 +98908,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0032, 0x0039, 0x65E5 },
+ specials={ "compat", 0x32, 0x39, 0x65E5 },
unicodeslot=0x33FC,
},
[0x33FD]={
@@ -96660,7 +98917,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY",
direction="l",
linebreak="id",
- specials={ "compat", 0x0033, 0x0030, 0x65E5 },
+ specials={ "compat", 0x33, 0x30, 0x65E5 },
unicodeslot=0x33FD,
},
[0x33FE]={
@@ -96669,7 +98926,7 @@ characters.data={
description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE",
direction="l",
linebreak="id",
- specials={ "compat", 0x0033, 0x0031, 0x65E5 },
+ specials={ "compat", 0x33, 0x31, 0x65E5 },
unicodeslot=0x33FE,
},
[0x33FF]={
@@ -96678,7 +98935,7 @@ characters.data={
description="SQUARE GAL",
direction="on",
linebreak="id",
- specials={ "square", 0x0067, 0x0061, 0x006C },
+ specials={ "square", 0x67, 0x61, 0x6C },
unicodeslot=0x33FF,
},
[0x4DC0]={
@@ -109656,6 +111913,7 @@ characters.data={
},
[0xA66F]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC VZMET",
direction="nsm",
linebreak="cm",
@@ -109691,6 +111949,7 @@ characters.data={
},
[0xA674]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER UKRAINIAN IE",
direction="nsm",
linebreak="cm",
@@ -109698,6 +111957,7 @@ characters.data={
},
[0xA675]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER I",
direction="nsm",
linebreak="cm",
@@ -109705,6 +111965,7 @@ characters.data={
},
[0xA676]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER YI",
direction="nsm",
linebreak="cm",
@@ -109712,6 +111973,7 @@ characters.data={
},
[0xA677]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER U",
direction="nsm",
linebreak="cm",
@@ -109719,6 +111981,7 @@ characters.data={
},
[0xA678]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER HARD SIGN",
direction="nsm",
linebreak="cm",
@@ -109726,6 +111989,7 @@ characters.data={
},
[0xA679]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER YERU",
direction="nsm",
linebreak="cm",
@@ -109733,6 +111997,7 @@ characters.data={
},
[0xA67A]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER SOFT SIGN",
direction="nsm",
linebreak="cm",
@@ -109740,6 +112005,7 @@ characters.data={
},
[0xA67B]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER OMEGA",
direction="nsm",
linebreak="cm",
@@ -109747,6 +112013,7 @@ characters.data={
},
[0xA67C]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC KAVYKA",
direction="nsm",
linebreak="cm",
@@ -109754,6 +112021,7 @@ characters.data={
},
[0xA67D]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC PAYEROK",
direction="nsm",
linebreak="cm",
@@ -109941,8 +112209,53 @@ characters.data={
linebreak="al",
unicodeslot=0xA697,
},
+ [0xA698]={
+ category="lu",
+ description="CYRILLIC CAPITAL LETTER DOUBLE O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA698,
+ },
+ [0xA699]={
+ category="ll",
+ description="CYRILLIC SMALL LETTER DOUBLE O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA699,
+ },
+ [0xA69A]={
+ category="lu",
+ description="CYRILLIC CAPITAL LETTER CROSSED O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA69A,
+ },
+ [0xA69B]={
+ category="ll",
+ description="CYRILLIC SMALL LETTER CROSSED O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA69B,
+ },
+ [0xA69C]={
+ category="lm",
+ description="MODIFIER LETTER CYRILLIC HARD SIGN",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x44A },
+ unicodeslot=0xA69C,
+ },
+ [0xA69D]={
+ category="lm",
+ description="MODIFIER LETTER CYRILLIC SOFT SIGN",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x44C },
+ unicodeslot=0xA69D,
+ },
[0xA69F]={
category="mn",
+ combining=0xE6,
description="COMBINING CYRILLIC LETTER IOTIFIED E",
direction="nsm",
linebreak="cm",
@@ -110510,6 +112823,7 @@ characters.data={
},
[0xA6F0]={
category="mn",
+ combining=0xE6,
description="BAMUM COMBINING MARK KOQNDON",
direction="nsm",
linebreak="cm",
@@ -110517,6 +112831,7 @@ characters.data={
},
[0xA6F1]={
category="mn",
+ combining=0xE6,
description="BAMUM COMBINING MARK TUKWENTIS",
direction="nsm",
linebreak="cm",
@@ -111594,6 +113909,90 @@ characters.data={
linebreak="al",
unicodeslot=0xA793,
},
+ [0xA794]={
+ category="ll",
+ description="LATIN SMALL LETTER C WITH PALATAL HOOK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA794,
+ },
+ [0xA795]={
+ category="ll",
+ description="LATIN SMALL LETTER H WITH PALATAL HOOK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA795,
+ },
+ [0xA796]={
+ category="lu",
+ description="LATIN CAPITAL LETTER B WITH FLOURISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA796,
+ },
+ [0xA797]={
+ category="ll",
+ description="LATIN SMALL LETTER B WITH FLOURISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA797,
+ },
+ [0xA798]={
+ category="lu",
+ description="LATIN CAPITAL LETTER F WITH STROKE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA798,
+ },
+ [0xA799]={
+ category="ll",
+ description="LATIN SMALL LETTER F WITH STROKE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA799,
+ },
+ [0xA79A]={
+ category="lu",
+ description="LATIN CAPITAL LETTER VOLAPUK AE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA79A,
+ },
+ [0xA79B]={
+ category="ll",
+ description="LATIN SMALL LETTER VOLAPUK AE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA79B,
+ },
+ [0xA79C]={
+ category="lu",
+ description="LATIN CAPITAL LETTER VOLAPUK OE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA79C,
+ },
+ [0xA79D]={
+ category="ll",
+ description="LATIN SMALL LETTER VOLAPUK OE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA79D,
+ },
+ [0xA79E]={
+ category="lu",
+ description="LATIN CAPITAL LETTER VOLAPUK UE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA79E,
+ },
+ [0xA79F]={
+ category="ll",
+ description="LATIN SMALL LETTER VOLAPUK UE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA79F,
+ },
[0xA7A0]={
category="lu",
description="LATIN CAPITAL LETTER G WITH OBLIQUE STROKE",
@@ -111671,12 +114070,54 @@ characters.data={
linebreak="al",
unicodeslot=0xA7AA,
},
+ [0xA7AB]={
+ category="lu",
+ description="LATIN CAPITAL LETTER REVERSED OPEN E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA7AB,
+ },
+ [0xA7AC]={
+ category="lu",
+ description="LATIN CAPITAL LETTER SCRIPT G",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA7AC,
+ },
+ [0xA7AD]={
+ category="lu",
+ description="LATIN CAPITAL LETTER L WITH BELT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA7AD,
+ },
+ [0xA7B0]={
+ category="lu",
+ description="LATIN CAPITAL LETTER TURNED K",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA7B0,
+ },
+ [0xA7B1]={
+ category="lu",
+ description="LATIN CAPITAL LETTER TURNED T",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA7B1,
+ },
+ [0xA7F7]={
+ category="lo",
+ description="LATIN EPIGRAPHIC LETTER SIDEWAYS I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA7F7,
+ },
[0xA7F8]={
category="lm",
description="MODIFIER LETTER CAPITAL H WITH STROKE",
direction="l",
linebreak="al",
- specials={ "super", 0x0126 },
+ specials={ "super", 0x126 },
unicodeslot=0xA7F8,
},
[0xA7F9]={
@@ -111684,7 +114125,7 @@ characters.data={
description="MODIFIER LETTER SMALL LIGATURE OE",
direction="l",
linebreak="al",
- specials={ "super", 0x0153 },
+ specials={ "super", 0x153 },
unicodeslot=0xA7F9,
},
[0xA7FA]={
@@ -111773,6 +114214,7 @@ characters.data={
},
[0xA806]={
category="mn",
+ combining=0x9,
description="SYLOTI NAGRI SIGN HASANTA",
direction="nsm",
linebreak="cm",
@@ -112108,6 +114550,7 @@ characters.data={
unicodeslot=0xA839,
},
[0xA840]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER KA",
direction="l",
@@ -112115,6 +114558,7 @@ characters.data={
unicodeslot=0xA840,
},
[0xA841]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER KHA",
direction="l",
@@ -112122,6 +114566,7 @@ characters.data={
unicodeslot=0xA841,
},
[0xA842]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER GA",
direction="l",
@@ -112129,6 +114574,7 @@ characters.data={
unicodeslot=0xA842,
},
[0xA843]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER NGA",
direction="l",
@@ -112136,6 +114582,7 @@ characters.data={
unicodeslot=0xA843,
},
[0xA844]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER CA",
direction="l",
@@ -112143,6 +114590,7 @@ characters.data={
unicodeslot=0xA844,
},
[0xA845]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER CHA",
direction="l",
@@ -112150,6 +114598,7 @@ characters.data={
unicodeslot=0xA845,
},
[0xA846]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER JA",
direction="l",
@@ -112157,6 +114606,7 @@ characters.data={
unicodeslot=0xA846,
},
[0xA847]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER NYA",
direction="l",
@@ -112164,6 +114614,7 @@ characters.data={
unicodeslot=0xA847,
},
[0xA848]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER TA",
direction="l",
@@ -112171,6 +114622,7 @@ characters.data={
unicodeslot=0xA848,
},
[0xA849]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER THA",
direction="l",
@@ -112178,6 +114630,7 @@ characters.data={
unicodeslot=0xA849,
},
[0xA84A]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER DA",
direction="l",
@@ -112185,6 +114638,7 @@ characters.data={
unicodeslot=0xA84A,
},
[0xA84B]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER NA",
direction="l",
@@ -112192,6 +114646,7 @@ characters.data={
unicodeslot=0xA84B,
},
[0xA84C]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER PA",
direction="l",
@@ -112199,6 +114654,7 @@ characters.data={
unicodeslot=0xA84C,
},
[0xA84D]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER PHA",
direction="l",
@@ -112206,6 +114662,7 @@ characters.data={
unicodeslot=0xA84D,
},
[0xA84E]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER BA",
direction="l",
@@ -112213,6 +114670,7 @@ characters.data={
unicodeslot=0xA84E,
},
[0xA84F]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER MA",
direction="l",
@@ -112220,6 +114678,7 @@ characters.data={
unicodeslot=0xA84F,
},
[0xA850]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER TSA",
direction="l",
@@ -112227,6 +114686,7 @@ characters.data={
unicodeslot=0xA850,
},
[0xA851]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER TSHA",
direction="l",
@@ -112234,6 +114694,7 @@ characters.data={
unicodeslot=0xA851,
},
[0xA852]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER DZA",
direction="l",
@@ -112241,6 +114702,7 @@ characters.data={
unicodeslot=0xA852,
},
[0xA853]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER WA",
direction="l",
@@ -112248,6 +114710,7 @@ characters.data={
unicodeslot=0xA853,
},
[0xA854]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER ZHA",
direction="l",
@@ -112255,6 +114718,7 @@ characters.data={
unicodeslot=0xA854,
},
[0xA855]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER ZA",
direction="l",
@@ -112262,6 +114726,7 @@ characters.data={
unicodeslot=0xA855,
},
[0xA856]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER SMALL A",
direction="l",
@@ -112272,6 +114737,7 @@ characters.data={
},
},
[0xA857]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER YA",
direction="l",
@@ -112279,6 +114745,7 @@ characters.data={
unicodeslot=0xA857,
},
[0xA858]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER RA",
direction="l",
@@ -112286,6 +114753,7 @@ characters.data={
unicodeslot=0xA858,
},
[0xA859]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER LA",
direction="l",
@@ -112293,6 +114761,7 @@ characters.data={
unicodeslot=0xA859,
},
[0xA85A]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER SHA",
direction="l",
@@ -112300,6 +114769,7 @@ characters.data={
unicodeslot=0xA85A,
},
[0xA85B]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER SA",
direction="l",
@@ -112307,6 +114777,7 @@ characters.data={
unicodeslot=0xA85B,
},
[0xA85C]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER HA",
direction="l",
@@ -112317,6 +114788,7 @@ characters.data={
},
},
[0xA85D]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER A",
direction="l",
@@ -112324,6 +114796,7 @@ characters.data={
unicodeslot=0xA85D,
},
[0xA85E]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER I",
direction="l",
@@ -112334,6 +114807,7 @@ characters.data={
},
},
[0xA85F]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER U",
direction="l",
@@ -112344,6 +114818,7 @@ characters.data={
},
},
[0xA860]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER E",
direction="l",
@@ -112354,6 +114829,7 @@ characters.data={
},
},
[0xA861]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER O",
direction="l",
@@ -112361,6 +114837,7 @@ characters.data={
unicodeslot=0xA861,
},
[0xA862]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER QA",
direction="l",
@@ -112368,6 +114845,7 @@ characters.data={
unicodeslot=0xA862,
},
[0xA863]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER XA",
direction="l",
@@ -112375,6 +114853,7 @@ characters.data={
unicodeslot=0xA863,
},
[0xA864]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER FA",
direction="l",
@@ -112382,6 +114861,7 @@ characters.data={
unicodeslot=0xA864,
},
[0xA865]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER GGA",
direction="l",
@@ -112389,6 +114869,7 @@ characters.data={
unicodeslot=0xA865,
},
[0xA866]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER EE",
direction="l",
@@ -112396,6 +114877,7 @@ characters.data={
unicodeslot=0xA866,
},
[0xA867]={
+ arabic="d",
category="lo",
description="PHAGS-PA SUBJOINED LETTER WA",
direction="l",
@@ -112403,6 +114885,7 @@ characters.data={
unicodeslot=0xA867,
},
[0xA868]={
+ arabic="d",
category="lo",
description="PHAGS-PA SUBJOINED LETTER YA",
direction="l",
@@ -112413,6 +114896,7 @@ characters.data={
},
},
[0xA869]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER TTA",
direction="l",
@@ -112420,6 +114904,7 @@ characters.data={
unicodeslot=0xA869,
},
[0xA86A]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER TTHA",
direction="l",
@@ -112427,6 +114912,7 @@ characters.data={
unicodeslot=0xA86A,
},
[0xA86B]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER DDA",
direction="l",
@@ -112434,6 +114920,7 @@ characters.data={
unicodeslot=0xA86B,
},
[0xA86C]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER NNA",
direction="l",
@@ -112441,6 +114928,7 @@ characters.data={
unicodeslot=0xA86C,
},
[0xA86D]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER ALTERNATE YA",
direction="l",
@@ -112448,6 +114936,7 @@ characters.data={
unicodeslot=0xA86D,
},
[0xA86E]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER VOICELESS SHA",
direction="l",
@@ -112455,6 +114944,7 @@ characters.data={
unicodeslot=0xA86E,
},
[0xA86F]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER VOICED HA",
direction="l",
@@ -112462,6 +114952,7 @@ characters.data={
unicodeslot=0xA86F,
},
[0xA870]={
+ arabic="d",
category="lo",
description="PHAGS-PA LETTER ASPIRATED FA",
direction="l",
@@ -112469,6 +114960,7 @@ characters.data={
unicodeslot=0xA870,
},
[0xA871]={
+ arabic="d",
category="lo",
description="PHAGS-PA SUBJOINED LETTER RA",
direction="l",
@@ -112476,6 +114968,7 @@ characters.data={
unicodeslot=0xA871,
},
[0xA872]={
+ arabic="l",
category="lo",
description="PHAGS-PA SUPERFIXED LETTER RA",
direction="l",
@@ -112483,6 +114976,7 @@ characters.data={
unicodeslot=0xA872,
},
[0xA873]={
+ arabic="u",
category="lo",
description="PHAGS-PA LETTER CANDRABINDU",
direction="l",
@@ -112995,6 +115489,7 @@ characters.data={
},
[0xA8C4]={
category="mn",
+ combining=0x9,
description="SAURASHTRA SIGN VIRAMA",
direction="nsm",
linebreak="cm",
@@ -113086,6 +115581,7 @@ characters.data={
},
[0xA8E0]={
category="mn",
+ combining=0xE6,
description="COMBINING DEVANAGARI DIGIT ZERO",
direction="nsm",
linebreak="cm",
@@ -113093,6 +115589,7 @@ characters.data={
},
[0xA8E1]={
category="mn",
+ combining=0xE6,
description="COMBINING DEVANAGARI DIGIT ONE",
direction="nsm",
linebreak="cm",
@@ -113100,6 +115597,7 @@ characters.data={
},
[0xA8E2]={
category="mn",
+ combining=0xE6,
description="COMBINING DEVANAGARI DIGIT TWO",
direction="nsm",
linebreak="cm",
@@ -113107,6 +115605,7 @@ characters.data={
},
[0xA8E3]={
category="mn",
+ combining=0xE6,
description="COMBINING DEVANAGARI DIGIT THREE",
direction="nsm",
linebreak="cm",
@@ -113114,6 +115613,7 @@ characters.data={
},
[0xA8E4]={
category="mn",
+ combining=0xE6,
description="COMBINING DEVANAGARI DIGIT FOUR",
direction="nsm",
linebreak="cm",
@@ -113121,6 +115621,7 @@ characters.data={
},
[0xA8E5]={
category="mn",
+ combining=0xE6,
description="COMBINING DEVANAGARI DIGIT FIVE",
direction="nsm",
linebreak="cm",
@@ -113128,6 +115629,7 @@ characters.data={
},
[0xA8E6]={
category="mn",
+ combining=0xE6,
description="COMBINING DEVANAGARI DIGIT SIX",
direction="nsm",
linebreak="cm",
@@ -113135,6 +115637,7 @@ characters.data={
},
[0xA8E7]={
category="mn",
+ combining=0xE6,
description="COMBINING DEVANAGARI DIGIT SEVEN",
direction="nsm",
linebreak="cm",
@@ -113142,6 +115645,7 @@ characters.data={
},
[0xA8E8]={
category="mn",
+ combining=0xE6,
description="COMBINING DEVANAGARI DIGIT EIGHT",
direction="nsm",
linebreak="cm",
@@ -113149,6 +115653,7 @@ characters.data={
},
[0xA8E9]={
category="mn",
+ combining=0xE6,
description="COMBINING DEVANAGARI DIGIT NINE",
direction="nsm",
linebreak="cm",
@@ -113156,6 +115661,7 @@ characters.data={
},
[0xA8EA]={
category="mn",
+ combining=0xE6,
description="COMBINING DEVANAGARI LETTER A",
direction="nsm",
linebreak="cm",
@@ -113163,6 +115669,7 @@ characters.data={
},
[0xA8EB]={
category="mn",
+ combining=0xE6,
description="COMBINING DEVANAGARI LETTER U",
direction="nsm",
linebreak="cm",
@@ -113170,6 +115677,7 @@ characters.data={
},
[0xA8EC]={
category="mn",
+ combining=0xE6,
description="COMBINING DEVANAGARI LETTER KA",
direction="nsm",
linebreak="cm",
@@ -113177,6 +115685,7 @@ characters.data={
},
[0xA8ED]={
category="mn",
+ combining=0xE6,
description="COMBINING DEVANAGARI LETTER NA",
direction="nsm",
linebreak="cm",
@@ -113184,6 +115693,7 @@ characters.data={
},
[0xA8EE]={
category="mn",
+ combining=0xE6,
description="COMBINING DEVANAGARI LETTER PA",
direction="nsm",
linebreak="cm",
@@ -113191,6 +115701,7 @@ characters.data={
},
[0xA8EF]={
category="mn",
+ combining=0xE6,
description="COMBINING DEVANAGARI LETTER RA",
direction="nsm",
linebreak="cm",
@@ -113198,6 +115709,7 @@ characters.data={
},
[0xA8F0]={
category="mn",
+ combining=0xE6,
description="COMBINING DEVANAGARI LETTER VI",
direction="nsm",
linebreak="cm",
@@ -113205,6 +115717,7 @@ characters.data={
},
[0xA8F1]={
category="mn",
+ combining=0xE6,
description="COMBINING DEVANAGARI SIGN AVAGRAHA",
direction="nsm",
linebreak="cm",
@@ -113583,6 +116096,7 @@ characters.data={
},
[0xA92B]={
category="mn",
+ combining=0xDC,
description="KAYAH LI TONE PLOPHU",
direction="nsm",
linebreak="cm",
@@ -113590,6 +116104,7 @@ characters.data={
},
[0xA92C]={
category="mn",
+ combining=0xDC,
description="KAYAH LI TONE CALYA",
direction="nsm",
linebreak="cm",
@@ -113597,6 +116112,7 @@ characters.data={
},
[0xA92D]={
category="mn",
+ combining=0xDC,
description="KAYAH LI TONE CALYA PLOPHU",
direction="nsm",
linebreak="cm",
@@ -113863,6 +116379,7 @@ characters.data={
},
[0xA953]={
category="mc",
+ combining=0x9,
description="REJANG VIRAMA",
direction="l",
linebreak="cm",
@@ -114466,6 +116983,7 @@ characters.data={
},
[0xA9B3]={
category="mn",
+ combining=0x7,
description="JAVANESE SIGN CECAK TELU",
direction="nsm",
linebreak="cm",
@@ -114557,6 +117075,7 @@ characters.data={
},
[0xA9C0]={
category="mc",
+ combining=0x9,
description="JAVANESE PANGKON",
direction="l",
linebreak="cm",
@@ -114744,6 +117263,223 @@ characters.data={
linebreak="al",
unicodeslot=0xA9DF,
},
+ [0xA9E0]={
+ category="lo",
+ description="MYANMAR LETTER SHAN GHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xA9E0,
+ },
+ [0xA9E1]={
+ category="lo",
+ description="MYANMAR LETTER SHAN CHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xA9E1,
+ },
+ [0xA9E2]={
+ category="lo",
+ description="MYANMAR LETTER SHAN JHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xA9E2,
+ },
+ [0xA9E3]={
+ category="lo",
+ description="MYANMAR LETTER SHAN NNA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xA9E3,
+ },
+ [0xA9E4]={
+ category="lo",
+ description="MYANMAR LETTER SHAN BHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xA9E4,
+ },
+ [0xA9E5]={
+ category="mn",
+ description="MYANMAR SIGN SHAN SAW",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0xA9E5,
+ },
+ [0xA9E6]={
+ category="lm",
+ description="MYANMAR MODIFIER LETTER SHAN REDUPLICATION",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xA9E6,
+ },
+ [0xA9E7]={
+ category="lo",
+ description="MYANMAR LETTER TAI LAING NYA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xA9E7,
+ },
+ [0xA9E8]={
+ category="lo",
+ description="MYANMAR LETTER TAI LAING FA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xA9E8,
+ },
+ [0xA9E9]={
+ category="lo",
+ description="MYANMAR LETTER TAI LAING GA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xA9E9,
+ },
+ [0xA9EA]={
+ category="lo",
+ description="MYANMAR LETTER TAI LAING GHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xA9EA,
+ },
+ [0xA9EB]={
+ category="lo",
+ description="MYANMAR LETTER TAI LAING JA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xA9EB,
+ },
+ [0xA9EC]={
+ category="lo",
+ description="MYANMAR LETTER TAI LAING JHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xA9EC,
+ },
+ [0xA9ED]={
+ category="lo",
+ description="MYANMAR LETTER TAI LAING DDA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xA9ED,
+ },
+ [0xA9EE]={
+ category="lo",
+ description="MYANMAR LETTER TAI LAING DDHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xA9EE,
+ },
+ [0xA9EF]={
+ category="lo",
+ description="MYANMAR LETTER TAI LAING NNA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xA9EF,
+ },
+ [0xA9F0]={
+ category="nd",
+ description="MYANMAR TAI LAING DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0xA9F0,
+ },
+ [0xA9F1]={
+ category="nd",
+ description="MYANMAR TAI LAING DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0xA9F1,
+ },
+ [0xA9F2]={
+ category="nd",
+ description="MYANMAR TAI LAING DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0xA9F2,
+ },
+ [0xA9F3]={
+ category="nd",
+ description="MYANMAR TAI LAING DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0xA9F3,
+ },
+ [0xA9F4]={
+ category="nd",
+ description="MYANMAR TAI LAING DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0xA9F4,
+ },
+ [0xA9F5]={
+ category="nd",
+ description="MYANMAR TAI LAING DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0xA9F5,
+ },
+ [0xA9F6]={
+ category="nd",
+ description="MYANMAR TAI LAING DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0xA9F6,
+ },
+ [0xA9F7]={
+ category="nd",
+ description="MYANMAR TAI LAING DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0xA9F7,
+ },
+ [0xA9F8]={
+ category="nd",
+ description="MYANMAR TAI LAING DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0xA9F8,
+ },
+ [0xA9F9]={
+ category="nd",
+ description="MYANMAR TAI LAING DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0xA9F9,
+ },
+ [0xA9FA]={
+ category="lo",
+ description="MYANMAR LETTER TAI LAING LLA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xA9FA,
+ },
+ [0xA9FB]={
+ category="lo",
+ description="MYANMAR LETTER TAI LAING DA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xA9FB,
+ },
+ [0xA9FC]={
+ category="lo",
+ description="MYANMAR LETTER TAI LAING DHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xA9FC,
+ },
+ [0xA9FD]={
+ category="lo",
+ description="MYANMAR LETTER TAI LAING BA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xA9FD,
+ },
+ [0xA9FE]={
+ category="lo",
+ description="MYANMAR LETTER TAI LAING BHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xA9FE,
+ },
[0xAA00]={
category="lo",
description="CHAM LETTER A",
@@ -115521,6 +118257,34 @@ characters.data={
linebreak="sa",
unicodeslot=0xAA7B,
},
+ [0xAA7C]={
+ category="mn",
+ description="MYANMAR SIGN TAI LAING TONE-2",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0xAA7C,
+ },
+ [0xAA7D]={
+ category="mc",
+ description="MYANMAR SIGN TAI LAING TONE-5",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xAA7D,
+ },
+ [0xAA7E]={
+ category="lo",
+ description="MYANMAR LETTER SHWE PALAUNG CHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xAA7E,
+ },
+ [0xAA7F]={
+ category="lo",
+ description="MYANMAR LETTER SHWE PALAUNG SHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xAA7F,
+ },
[0xAA80]={
category="lo",
description="TAI VIET LETTER LOW KO",
@@ -115859,6 +118623,7 @@ characters.data={
},
[0xAAB0]={
category="mn",
+ combining=0xE6,
description="TAI VIET MAI KANG",
direction="nsm",
linebreak="sa",
@@ -115873,6 +118638,7 @@ characters.data={
},
[0xAAB2]={
category="mn",
+ combining=0xE6,
description="TAI VIET VOWEL I",
direction="nsm",
linebreak="sa",
@@ -115880,6 +118646,7 @@ characters.data={
},
[0xAAB3]={
category="mn",
+ combining=0xE6,
description="TAI VIET VOWEL UE",
direction="nsm",
linebreak="sa",
@@ -115887,6 +118654,7 @@ characters.data={
},
[0xAAB4]={
category="mn",
+ combining=0xDC,
description="TAI VIET VOWEL U",
direction="nsm",
linebreak="sa",
@@ -115908,6 +118676,7 @@ characters.data={
},
[0xAAB7]={
category="mn",
+ combining=0xE6,
description="TAI VIET MAI KHIT",
direction="nsm",
linebreak="sa",
@@ -115915,6 +118684,7 @@ characters.data={
},
[0xAAB8]={
category="mn",
+ combining=0xE6,
description="TAI VIET VOWEL IA",
direction="nsm",
linebreak="sa",
@@ -115957,6 +118727,7 @@ characters.data={
},
[0xAABE]={
category="mn",
+ combining=0xE6,
description="TAI VIET VOWEL AM",
direction="nsm",
linebreak="sa",
@@ -115964,6 +118735,7 @@ characters.data={
},
[0xAABF]={
category="mn",
+ combining=0xE6,
description="TAI VIET TONE MAI EK",
direction="nsm",
linebreak="sa",
@@ -115978,6 +118750,7 @@ characters.data={
},
[0xAAC1]={
category="mn",
+ combining=0xE6,
description="TAI VIET TONE MAI THO",
direction="nsm",
linebreak="sa",
@@ -116181,6 +118954,7 @@ characters.data={
},
[0xAAF6]={
category="mn",
+ combining=0x9,
description="MEETEI MAYEK VIRAMA",
direction="nsm",
linebreak="cm",
@@ -116410,6 +119184,360 @@ characters.data={
linebreak="al",
unicodeslot=0xAB2E,
},
+ [0xAB30]={
+ category="ll",
+ description="LATIN SMALL LETTER BARRED ALPHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB30,
+ },
+ [0xAB31]={
+ category="ll",
+ description="LATIN SMALL LETTER A REVERSED-SCHWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB31,
+ },
+ [0xAB32]={
+ category="ll",
+ description="LATIN SMALL LETTER BLACKLETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB32,
+ },
+ [0xAB33]={
+ category="ll",
+ description="LATIN SMALL LETTER BARRED E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB33,
+ },
+ [0xAB34]={
+ category="ll",
+ description="LATIN SMALL LETTER E WITH FLOURISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB34,
+ },
+ [0xAB35]={
+ category="ll",
+ description="LATIN SMALL LETTER LENIS F",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB35,
+ },
+ [0xAB36]={
+ category="ll",
+ description="LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB36,
+ },
+ [0xAB37]={
+ category="ll",
+ description="LATIN SMALL LETTER L WITH INVERTED LAZY S",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB37,
+ },
+ [0xAB38]={
+ category="ll",
+ description="LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB38,
+ },
+ [0xAB39]={
+ category="ll",
+ description="LATIN SMALL LETTER L WITH MIDDLE RING",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB39,
+ },
+ [0xAB3A]={
+ category="ll",
+ description="LATIN SMALL LETTER M WITH CROSSED-TAIL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB3A,
+ },
+ [0xAB3B]={
+ category="ll",
+ description="LATIN SMALL LETTER N WITH CROSSED-TAIL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB3B,
+ },
+ [0xAB3C]={
+ category="ll",
+ description="LATIN SMALL LETTER ENG WITH CROSSED-TAIL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB3C,
+ },
+ [0xAB3D]={
+ category="ll",
+ description="LATIN SMALL LETTER BLACKLETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB3D,
+ },
+ [0xAB3E]={
+ category="ll",
+ description="LATIN SMALL LETTER BLACKLETTER O WITH STROKE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB3E,
+ },
+ [0xAB3F]={
+ category="ll",
+ description="LATIN SMALL LETTER OPEN O WITH STROKE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB3F,
+ },
+ [0xAB40]={
+ category="ll",
+ description="LATIN SMALL LETTER INVERTED OE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB40,
+ },
+ [0xAB41]={
+ category="ll",
+ description="LATIN SMALL LETTER TURNED OE WITH STROKE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB41,
+ },
+ [0xAB42]={
+ category="ll",
+ description="LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB42,
+ },
+ [0xAB43]={
+ category="ll",
+ description="LATIN SMALL LETTER TURNED O OPEN-O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB43,
+ },
+ [0xAB44]={
+ category="ll",
+ description="LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB44,
+ },
+ [0xAB45]={
+ category="ll",
+ description="LATIN SMALL LETTER STIRRUP R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB45,
+ },
+ [0xAB46]={
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB46,
+ },
+ [0xAB47]={
+ category="ll",
+ description="LATIN SMALL LETTER R WITHOUT HANDLE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB47,
+ },
+ [0xAB48]={
+ category="ll",
+ description="LATIN SMALL LETTER DOUBLE R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB48,
+ },
+ [0xAB49]={
+ category="ll",
+ description="LATIN SMALL LETTER R WITH CROSSED-TAIL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB49,
+ },
+ [0xAB4A]={
+ category="ll",
+ description="LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB4A,
+ },
+ [0xAB4B]={
+ category="ll",
+ description="LATIN SMALL LETTER SCRIPT R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB4B,
+ },
+ [0xAB4C]={
+ category="ll",
+ description="LATIN SMALL LETTER SCRIPT R WITH RING",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB4C,
+ },
+ [0xAB4D]={
+ category="ll",
+ description="LATIN SMALL LETTER BASELINE ESH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB4D,
+ },
+ [0xAB4E]={
+ category="ll",
+ description="LATIN SMALL LETTER U WITH SHORT RIGHT LEG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB4E,
+ },
+ [0xAB4F]={
+ category="ll",
+ description="LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB4F,
+ },
+ [0xAB50]={
+ category="ll",
+ description="LATIN SMALL LETTER UI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB50,
+ },
+ [0xAB51]={
+ category="ll",
+ description="LATIN SMALL LETTER TURNED UI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB51,
+ },
+ [0xAB52]={
+ category="ll",
+ description="LATIN SMALL LETTER U WITH LEFT HOOK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB52,
+ },
+ [0xAB53]={
+ category="ll",
+ description="LATIN SMALL LETTER CHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB53,
+ },
+ [0xAB54]={
+ category="ll",
+ description="LATIN SMALL LETTER CHI WITH LOW RIGHT RING",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB54,
+ },
+ [0xAB55]={
+ category="ll",
+ description="LATIN SMALL LETTER CHI WITH LOW LEFT SERIF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB55,
+ },
+ [0xAB56]={
+ category="ll",
+ description="LATIN SMALL LETTER X WITH LOW RIGHT RING",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB56,
+ },
+ [0xAB57]={
+ category="ll",
+ description="LATIN SMALL LETTER X WITH LONG LEFT LEG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB57,
+ },
+ [0xAB58]={
+ category="ll",
+ description="LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB58,
+ },
+ [0xAB59]={
+ category="ll",
+ description="LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB59,
+ },
+ [0xAB5A]={
+ category="ll",
+ description="LATIN SMALL LETTER Y WITH SHORT RIGHT LEG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB5A,
+ },
+ [0xAB5B]={
+ category="sk",
+ description="MODIFIER BREVE WITH INVERTED BREVE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB5B,
+ },
+ [0xAB5C]={
+ category="lm",
+ description="MODIFIER LETTER SMALL HENG",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0xA727 },
+ unicodeslot=0xAB5C,
+ },
+ [0xAB5D]={
+ category="lm",
+ description="MODIFIER LETTER SMALL L WITH INVERTED LAZY S",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0xAB37 },
+ unicodeslot=0xAB5D,
+ },
+ [0xAB5E]={
+ category="lm",
+ description="MODIFIER LETTER SMALL L WITH MIDDLE TILDE",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x26B },
+ unicodeslot=0xAB5E,
+ },
+ [0xAB5F]={
+ category="lm",
+ description="MODIFIER LETTER SMALL U WITH LEFT HOOK",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0xAB52 },
+ unicodeslot=0xAB5F,
+ },
+ [0xAB64]={
+ category="ll",
+ description="LATIN SMALL LETTER INVERTED ALPHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB64,
+ },
+ [0xAB65]={
+ category="ll",
+ description="GREEK LETTER SMALL CAPITAL OMEGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB65,
+ },
[0xABC0]={
category="lo",
description="MEETEI MAYEK LETTER KOK",
@@ -116727,6 +119855,7 @@ characters.data={
},
[0xABED]={
category="mn",
+ combining=0x9,
description="MEETEI MAYEK APUN IYEK",
direction="nsm",
linebreak="cm",
@@ -121606,7 +124735,7 @@ characters.data={
description="LATIN SMALL LIGATURE FF",
direction="l",
linebreak="al",
- specials={ "compat", 0x0066, 0x0066 },
+ specials={ "compat", 0x66, 0x66 },
unicodeslot=0xFB00,
},
[0xFB01]={
@@ -121616,8 +124745,8 @@ characters.data={
description="LATIN SMALL LIGATURE FI",
direction="l",
linebreak="al",
- shcode={ 0x0066, 0x0069 },
- specials={ "compat", 0x0066, 0x0069 },
+ shcode={ 0x66, 0x69 },
+ specials={ "compat", 0x66, 0x69 },
unicodeslot=0xFB01,
},
[0xFB02]={
@@ -121627,8 +124756,8 @@ characters.data={
description="LATIN SMALL LIGATURE FL",
direction="l",
linebreak="al",
- shcode={ 0x0066, 0x006C },
- specials={ "compat", 0x0066, 0x006C },
+ shcode={ 0x66, 0x6C },
+ specials={ "compat", 0x66, 0x6C },
unicodeslot=0xFB02,
},
[0xFB03]={
@@ -121638,8 +124767,8 @@ characters.data={
description="LATIN SMALL LIGATURE FFI",
direction="l",
linebreak="al",
- shcode={ 0x0066, 0x0069 },
- specials={ "compat", 0x0066, 0x0066, 0x0069 },
+ shcode={ 0x66, 0x69 },
+ specials={ "compat", 0x66, 0x66, 0x69 },
unicodeslot=0xFB03,
},
[0xFB04]={
@@ -121649,8 +124778,8 @@ characters.data={
description="LATIN SMALL LIGATURE FFL",
direction="l",
linebreak="al",
- shcode={ 0x0066, 0x006C },
- specials={ "compat", 0x0066, 0x0066, 0x006C },
+ shcode={ 0x66, 0x6C },
+ specials={ "compat", 0x66, 0x66, 0x6C },
unicodeslot=0xFB04,
},
[0xFB05]={
@@ -121658,7 +124787,7 @@ characters.data={
description="LATIN SMALL LIGATURE LONG S T",
direction="l",
linebreak="al",
- specials={ "compat", 0x017F, 0x0074 },
+ specials={ "compat", 0x17F, 0x74 },
unicodeslot=0xFB05,
},
[0xFB06]={
@@ -121667,8 +124796,8 @@ characters.data={
description="LATIN SMALL LIGATURE ST",
direction="l",
linebreak="al",
- shcode={ 0x0073, 0x0074 },
- specials={ "compat", 0x0073, 0x0074 },
+ shcode={ 0x73, 0x74 },
+ specials={ "compat", 0x73, 0x74 },
unicodeslot=0xFB06,
},
[0xFB13]={
@@ -121676,7 +124805,7 @@ characters.data={
description="ARMENIAN SMALL LIGATURE MEN NOW",
direction="l",
linebreak="al",
- specials={ "compat", 0x0574, 0x0576 },
+ specials={ "compat", 0x574, 0x576 },
unicodeslot=0xFB13,
},
[0xFB14]={
@@ -121684,7 +124813,7 @@ characters.data={
description="ARMENIAN SMALL LIGATURE MEN ECH",
direction="l",
linebreak="al",
- specials={ "compat", 0x0574, 0x0565 },
+ specials={ "compat", 0x574, 0x565 },
unicodeslot=0xFB14,
},
[0xFB15]={
@@ -121692,7 +124821,7 @@ characters.data={
description="ARMENIAN SMALL LIGATURE MEN INI",
direction="l",
linebreak="al",
- specials={ "compat", 0x0574, 0x056B },
+ specials={ "compat", 0x574, 0x56B },
unicodeslot=0xFB15,
},
[0xFB16]={
@@ -121700,7 +124829,7 @@ characters.data={
description="ARMENIAN SMALL LIGATURE VEW NOW",
direction="l",
linebreak="al",
- specials={ "compat", 0x057E, 0x0576 },
+ specials={ "compat", 0x57E, 0x576 },
unicodeslot=0xFB16,
},
[0xFB17]={
@@ -121708,7 +124837,7 @@ characters.data={
description="ARMENIAN SMALL LIGATURE MEN XEH",
direction="l",
linebreak="al",
- specials={ "compat", 0x0574, 0x056D },
+ specials={ "compat", 0x574, 0x56D },
unicodeslot=0xFB17,
},
[0xFB1D]={
@@ -121716,12 +124845,13 @@ characters.data={
description="HEBREW LETTER YOD WITH HIRIQ",
direction="r",
linebreak="hl",
- shcode=0x05D9,
- specials={ "char", 0x05D9, 0x05B4 },
+ shcode=0x5D9,
+ specials={ "char", 0x5D9, 0x5B4 },
unicodeslot=0xFB1D,
},
[0xFB1E]={
category="mn",
+ combining=0x1A,
description="HEBREW POINT JUDEO-SPANISH VARIKA",
direction="nsm",
linebreak="cm",
@@ -121733,7 +124863,7 @@ characters.data={
description="HEBREW LIGATURE YIDDISH YOD YOD PATAH",
direction="r",
linebreak="hl",
- specials={ "char", 0x05F2, 0x05B7 },
+ specials={ "char", 0x5F2, 0x5B7 },
unicodeslot=0xFB1F,
},
[0xFB20]={
@@ -121742,7 +124872,7 @@ characters.data={
description="HEBREW LETTER ALTERNATIVE AYIN",
direction="r",
linebreak="hl",
- specials={ "font", 0x05E2 },
+ specials={ "font", 0x5E2 },
unicodeslot=0xFB20,
},
[0xFB21]={
@@ -121750,7 +124880,7 @@ characters.data={
description="HEBREW LETTER WIDE ALEF",
direction="r",
linebreak="hl",
- specials={ "font", 0x05D0 },
+ specials={ "font", 0x5D0 },
unicodeslot=0xFB21,
},
[0xFB22]={
@@ -121758,7 +124888,7 @@ characters.data={
description="HEBREW LETTER WIDE DALET",
direction="r",
linebreak="hl",
- specials={ "font", 0x05D3 },
+ specials={ "font", 0x5D3 },
unicodeslot=0xFB22,
},
[0xFB23]={
@@ -121766,7 +124896,7 @@ characters.data={
description="HEBREW LETTER WIDE HE",
direction="r",
linebreak="hl",
- specials={ "font", 0x05D4 },
+ specials={ "font", 0x5D4 },
unicodeslot=0xFB23,
},
[0xFB24]={
@@ -121774,7 +124904,7 @@ characters.data={
description="HEBREW LETTER WIDE KAF",
direction="r",
linebreak="hl",
- specials={ "font", 0x05DB },
+ specials={ "font", 0x5DB },
unicodeslot=0xFB24,
},
[0xFB25]={
@@ -121782,7 +124912,7 @@ characters.data={
description="HEBREW LETTER WIDE LAMED",
direction="r",
linebreak="hl",
- specials={ "font", 0x05DC },
+ specials={ "font", 0x5DC },
unicodeslot=0xFB25,
},
[0xFB26]={
@@ -121790,7 +124920,7 @@ characters.data={
description="HEBREW LETTER WIDE FINAL MEM",
direction="r",
linebreak="hl",
- specials={ "font", 0x05DD },
+ specials={ "font", 0x5DD },
unicodeslot=0xFB26,
},
[0xFB27]={
@@ -121798,7 +124928,7 @@ characters.data={
description="HEBREW LETTER WIDE RESH",
direction="r",
linebreak="hl",
- specials={ "font", 0x05E8 },
+ specials={ "font", 0x5E8 },
unicodeslot=0xFB27,
},
[0xFB28]={
@@ -121806,7 +124936,7 @@ characters.data={
description="HEBREW LETTER WIDE TAV",
direction="r",
linebreak="hl",
- specials={ "font", 0x05EA },
+ specials={ "font", 0x5EA },
unicodeslot=0xFB28,
},
[0xFB29]={
@@ -121814,7 +124944,7 @@ characters.data={
description="HEBREW LETTER ALTERNATIVE PLUS SIGN",
direction="es",
linebreak="al",
- specials={ "font", 0x002B },
+ specials={ "font", 0x2B },
unicodeslot=0xFB29,
},
[0xFB2A]={
@@ -121823,8 +124953,8 @@ characters.data={
description="HEBREW LETTER SHIN WITH SHIN DOT",
direction="r",
linebreak="hl",
- shcode=0x05E9,
- specials={ "char", 0x05E9, 0x05C1 },
+ shcode=0x5E9,
+ specials={ "char", 0x5E9, 0x5C1 },
unicodeslot=0xFB2A,
},
[0xFB2B]={
@@ -121833,8 +124963,8 @@ characters.data={
description="HEBREW LETTER SHIN WITH SIN DOT",
direction="r",
linebreak="hl",
- shcode=0x05E9,
- specials={ "char", 0x05E9, 0x05C2 },
+ shcode=0x5E9,
+ specials={ "char", 0x5E9, 0x5C2 },
unicodeslot=0xFB2B,
},
[0xFB2C]={
@@ -121843,8 +124973,8 @@ characters.data={
description="HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT",
direction="r",
linebreak="hl",
- shcode=0x05E9,
- specials={ "char", 0xFB49, 0x05C1 },
+ shcode=0x5E9,
+ specials={ "char", 0xFB49, 0x5C1 },
unicodeslot=0xFB2C,
},
[0xFB2D]={
@@ -121853,8 +124983,8 @@ characters.data={
description="HEBREW LETTER SHIN WITH DAGESH AND SIN DOT",
direction="r",
linebreak="hl",
- shcode=0x05E9,
- specials={ "char", 0xFB49, 0x05C2 },
+ shcode=0x5E9,
+ specials={ "char", 0xFB49, 0x5C2 },
unicodeslot=0xFB2D,
},
[0xFB2E]={
@@ -121863,8 +124993,8 @@ characters.data={
description="HEBREW LETTER ALEF WITH PATAH",
direction="r",
linebreak="hl",
- shcode=0x05D0,
- specials={ "char", 0x05D0, 0x05B7 },
+ shcode=0x5D0,
+ specials={ "char", 0x5D0, 0x5B7 },
unicodeslot=0xFB2E,
},
[0xFB2F]={
@@ -121873,8 +125003,8 @@ characters.data={
description="HEBREW LETTER ALEF WITH QAMATS",
direction="r",
linebreak="hl",
- shcode=0x05D0,
- specials={ "char", 0x05D0, 0x05B8 },
+ shcode=0x5D0,
+ specials={ "char", 0x5D0, 0x5B8 },
unicodeslot=0xFB2F,
},
[0xFB30]={
@@ -121883,8 +125013,8 @@ characters.data={
description="HEBREW LETTER ALEF WITH MAPIQ",
direction="r",
linebreak="hl",
- shcode=0x05D0,
- specials={ "char", 0x05D0, 0x05BC },
+ shcode=0x5D0,
+ specials={ "char", 0x5D0, 0x5BC },
unicodeslot=0xFB30,
},
[0xFB31]={
@@ -121893,8 +125023,8 @@ characters.data={
description="HEBREW LETTER BET WITH DAGESH",
direction="r",
linebreak="hl",
- shcode=0x05D1,
- specials={ "char", 0x05D1, 0x05BC },
+ shcode=0x5D1,
+ specials={ "char", 0x5D1, 0x5BC },
unicodeslot=0xFB31,
},
[0xFB32]={
@@ -121903,8 +125033,8 @@ characters.data={
description="HEBREW LETTER GIMEL WITH DAGESH",
direction="r",
linebreak="hl",
- shcode=0x05D2,
- specials={ "char", 0x05D2, 0x05BC },
+ shcode=0x5D2,
+ specials={ "char", 0x5D2, 0x5BC },
unicodeslot=0xFB32,
},
[0xFB33]={
@@ -121913,8 +125043,8 @@ characters.data={
description="HEBREW LETTER DALET WITH DAGESH",
direction="r",
linebreak="hl",
- shcode=0x05D3,
- specials={ "char", 0x05D3, 0x05BC },
+ shcode=0x5D3,
+ specials={ "char", 0x5D3, 0x5BC },
unicodeslot=0xFB33,
},
[0xFB34]={
@@ -121923,8 +125053,8 @@ characters.data={
description="HEBREW LETTER HE WITH MAPIQ",
direction="r",
linebreak="hl",
- shcode=0x05D4,
- specials={ "char", 0x05D4, 0x05BC },
+ shcode=0x5D4,
+ specials={ "char", 0x5D4, 0x5BC },
unicodeslot=0xFB34,
},
[0xFB35]={
@@ -121933,8 +125063,8 @@ characters.data={
description="HEBREW LETTER VAV WITH DAGESH",
direction="r",
linebreak="hl",
- shcode=0x05D5,
- specials={ "char", 0x05D5, 0x05BC },
+ shcode=0x5D5,
+ specials={ "char", 0x5D5, 0x5BC },
unicodeslot=0xFB35,
},
[0xFB36]={
@@ -121943,8 +125073,8 @@ characters.data={
description="HEBREW LETTER ZAYIN WITH DAGESH",
direction="r",
linebreak="hl",
- shcode=0x05D6,
- specials={ "char", 0x05D6, 0x05BC },
+ shcode=0x5D6,
+ specials={ "char", 0x5D6, 0x5BC },
unicodeslot=0xFB36,
},
[0xFB38]={
@@ -121953,8 +125083,8 @@ characters.data={
description="HEBREW LETTER TET WITH DAGESH",
direction="r",
linebreak="hl",
- shcode=0x05D8,
- specials={ "char", 0x05D8, 0x05BC },
+ shcode=0x5D8,
+ specials={ "char", 0x5D8, 0x5BC },
unicodeslot=0xFB38,
},
[0xFB39]={
@@ -121963,8 +125093,8 @@ characters.data={
description="HEBREW LETTER YOD WITH DAGESH",
direction="r",
linebreak="hl",
- shcode=0x05D9,
- specials={ "char", 0x05D9, 0x05BC },
+ shcode=0x5D9,
+ specials={ "char", 0x5D9, 0x5BC },
unicodeslot=0xFB39,
},
[0xFB3A]={
@@ -121973,7 +125103,7 @@ characters.data={
description="HEBREW LETTER FINAL KAF WITH DAGESH",
direction="r",
linebreak="hl",
- specials={ "char", 0x05DA, 0x05BC },
+ specials={ "char", 0x5DA, 0x5BC },
unicodeslot=0xFB3A,
},
[0xFB3B]={
@@ -121982,8 +125112,8 @@ characters.data={
description="HEBREW LETTER KAF WITH DAGESH",
direction="r",
linebreak="hl",
- shcode=0x05DB,
- specials={ "char", 0x05DB, 0x05BC },
+ shcode=0x5DB,
+ specials={ "char", 0x5DB, 0x5BC },
unicodeslot=0xFB3B,
},
[0xFB3C]={
@@ -121992,8 +125122,8 @@ characters.data={
description="HEBREW LETTER LAMED WITH DAGESH",
direction="r",
linebreak="hl",
- shcode=0x05DC,
- specials={ "char", 0x05DC, 0x05BC },
+ shcode=0x5DC,
+ specials={ "char", 0x5DC, 0x5BC },
unicodeslot=0xFB3C,
},
[0xFB3E]={
@@ -122002,8 +125132,8 @@ characters.data={
description="HEBREW LETTER MEM WITH DAGESH",
direction="r",
linebreak="hl",
- shcode=0x05DE,
- specials={ "char", 0x05DE, 0x05BC },
+ shcode=0x5DE,
+ specials={ "char", 0x5DE, 0x5BC },
unicodeslot=0xFB3E,
},
[0xFB40]={
@@ -122012,8 +125142,8 @@ characters.data={
description="HEBREW LETTER NUN WITH DAGESH",
direction="r",
linebreak="hl",
- shcode=0x05E0,
- specials={ "char", 0x05E0, 0x05BC },
+ shcode=0x5E0,
+ specials={ "char", 0x5E0, 0x5BC },
unicodeslot=0xFB40,
},
[0xFB41]={
@@ -122022,8 +125152,8 @@ characters.data={
description="HEBREW LETTER SAMEKH WITH DAGESH",
direction="r",
linebreak="hl",
- shcode=0x05E1,
- specials={ "char", 0x05E1, 0x05BC },
+ shcode=0x5E1,
+ specials={ "char", 0x5E1, 0x5BC },
unicodeslot=0xFB41,
},
[0xFB43]={
@@ -122032,7 +125162,7 @@ characters.data={
description="HEBREW LETTER FINAL PE WITH DAGESH",
direction="r",
linebreak="hl",
- specials={ "char", 0x05E3, 0x05BC },
+ specials={ "char", 0x5E3, 0x5BC },
unicodeslot=0xFB43,
},
[0xFB44]={
@@ -122041,8 +125171,8 @@ characters.data={
description="HEBREW LETTER PE WITH DAGESH",
direction="r",
linebreak="hl",
- shcode=0x05E4,
- specials={ "char", 0x05E4, 0x05BC },
+ shcode=0x5E4,
+ specials={ "char", 0x5E4, 0x5BC },
unicodeslot=0xFB44,
},
[0xFB46]={
@@ -122051,8 +125181,8 @@ characters.data={
description="HEBREW LETTER TSADI WITH DAGESH",
direction="r",
linebreak="hl",
- shcode=0x05E6,
- specials={ "char", 0x05E6, 0x05BC },
+ shcode=0x5E6,
+ specials={ "char", 0x5E6, 0x5BC },
unicodeslot=0xFB46,
},
[0xFB47]={
@@ -122061,8 +125191,8 @@ characters.data={
description="HEBREW LETTER QOF WITH DAGESH",
direction="r",
linebreak="hl",
- shcode=0x05E7,
- specials={ "char", 0x05E7, 0x05BC },
+ shcode=0x5E7,
+ specials={ "char", 0x5E7, 0x5BC },
unicodeslot=0xFB47,
},
[0xFB48]={
@@ -122071,8 +125201,8 @@ characters.data={
description="HEBREW LETTER RESH WITH DAGESH",
direction="r",
linebreak="hl",
- shcode=0x05E8,
- specials={ "char", 0x05E8, 0x05BC },
+ shcode=0x5E8,
+ specials={ "char", 0x5E8, 0x5BC },
unicodeslot=0xFB48,
},
[0xFB49]={
@@ -122081,8 +125211,8 @@ characters.data={
description="HEBREW LETTER SHIN WITH DAGESH",
direction="r",
linebreak="hl",
- shcode=0x05E9,
- specials={ "char", 0x05E9, 0x05BC },
+ shcode=0x5E9,
+ specials={ "char", 0x5E9, 0x5BC },
unicodeslot=0xFB49,
},
[0xFB4A]={
@@ -122091,8 +125221,8 @@ characters.data={
description="HEBREW LETTER TAV WITH DAGESH",
direction="r",
linebreak="hl",
- shcode=0x05EA,
- specials={ "char", 0x05EA, 0x05BC },
+ shcode=0x5EA,
+ specials={ "char", 0x5EA, 0x5BC },
unicodeslot=0xFB4A,
},
[0xFB4B]={
@@ -122101,8 +125231,8 @@ characters.data={
description="HEBREW LETTER VAV WITH HOLAM",
direction="r",
linebreak="hl",
- shcode=0x05D5,
- specials={ "char", 0x05D5, 0x05B9 },
+ shcode=0x5D5,
+ specials={ "char", 0x5D5, 0x5B9 },
unicodeslot=0xFB4B,
},
[0xFB4C]={
@@ -122111,8 +125241,8 @@ characters.data={
description="HEBREW LETTER BET WITH RAFE",
direction="r",
linebreak="hl",
- shcode=0x05D1,
- specials={ "char", 0x05D1, 0x05BF },
+ shcode=0x5D1,
+ specials={ "char", 0x5D1, 0x5BF },
unicodeslot=0xFB4C,
},
[0xFB4D]={
@@ -122121,8 +125251,8 @@ characters.data={
description="HEBREW LETTER KAF WITH RAFE",
direction="r",
linebreak="hl",
- shcode=0x05DB,
- specials={ "char", 0x05DB, 0x05BF },
+ shcode=0x5DB,
+ specials={ "char", 0x5DB, 0x5BF },
unicodeslot=0xFB4D,
},
[0xFB4E]={
@@ -122131,8 +125261,8 @@ characters.data={
description="HEBREW LETTER PE WITH RAFE",
direction="r",
linebreak="hl",
- shcode=0x05E4,
- specials={ "char", 0x05E4, 0x05BF },
+ shcode=0x5E4,
+ specials={ "char", 0x5E4, 0x5BF },
unicodeslot=0xFB4E,
},
[0xFB4F]={
@@ -122141,7 +125271,7 @@ characters.data={
description="HEBREW LIGATURE ALEF LAMED",
direction="r",
linebreak="hl",
- specials={ "compat", 0x05D0, 0x05DC },
+ specials={ "compat", 0x5D0, 0x5DC },
unicodeslot=0xFB4F,
},
[0xFB50]={
@@ -122149,7 +125279,7 @@ characters.data={
description="ARABIC LETTER ALEF WASLA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0671 },
+ specials={ "isolated", 0x671 },
unicodeslot=0xFB50,
},
[0xFB51]={
@@ -122157,7 +125287,7 @@ characters.data={
description="ARABIC LETTER ALEF WASLA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0671 },
+ specials={ "final", 0x671 },
unicodeslot=0xFB51,
},
[0xFB52]={
@@ -122165,7 +125295,7 @@ characters.data={
description="ARABIC LETTER BEEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x067B },
+ specials={ "isolated", 0x67B },
unicodeslot=0xFB52,
},
[0xFB53]={
@@ -122173,7 +125303,7 @@ characters.data={
description="ARABIC LETTER BEEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x067B },
+ specials={ "final", 0x67B },
unicodeslot=0xFB53,
},
[0xFB54]={
@@ -122181,7 +125311,7 @@ characters.data={
description="ARABIC LETTER BEEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x067B },
+ specials={ "initial", 0x67B },
unicodeslot=0xFB54,
},
[0xFB55]={
@@ -122189,7 +125319,7 @@ characters.data={
description="ARABIC LETTER BEEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x067B },
+ specials={ "medial", 0x67B },
unicodeslot=0xFB55,
},
[0xFB56]={
@@ -122197,7 +125327,7 @@ characters.data={
description="ARABIC LETTER PEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x067E },
+ specials={ "isolated", 0x67E },
unicodeslot=0xFB56,
},
[0xFB57]={
@@ -122206,7 +125336,7 @@ characters.data={
description="ARABIC LETTER PEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x067E },
+ specials={ "final", 0x67E },
unicodeslot=0xFB57,
},
[0xFB58]={
@@ -122215,7 +125345,7 @@ characters.data={
description="ARABIC LETTER PEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x067E },
+ specials={ "initial", 0x67E },
unicodeslot=0xFB58,
},
[0xFB59]={
@@ -122224,7 +125354,7 @@ characters.data={
description="ARABIC LETTER PEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x067E },
+ specials={ "medial", 0x67E },
unicodeslot=0xFB59,
},
[0xFB5A]={
@@ -122232,7 +125362,7 @@ characters.data={
description="ARABIC LETTER BEHEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0680 },
+ specials={ "isolated", 0x680 },
unicodeslot=0xFB5A,
},
[0xFB5B]={
@@ -122240,7 +125370,7 @@ characters.data={
description="ARABIC LETTER BEHEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0680 },
+ specials={ "final", 0x680 },
unicodeslot=0xFB5B,
},
[0xFB5C]={
@@ -122248,7 +125378,7 @@ characters.data={
description="ARABIC LETTER BEHEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0680 },
+ specials={ "initial", 0x680 },
unicodeslot=0xFB5C,
},
[0xFB5D]={
@@ -122256,7 +125386,7 @@ characters.data={
description="ARABIC LETTER BEHEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0680 },
+ specials={ "medial", 0x680 },
unicodeslot=0xFB5D,
},
[0xFB5E]={
@@ -122264,7 +125394,7 @@ characters.data={
description="ARABIC LETTER TTEHEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x067A },
+ specials={ "isolated", 0x67A },
unicodeslot=0xFB5E,
},
[0xFB5F]={
@@ -122272,7 +125402,7 @@ characters.data={
description="ARABIC LETTER TTEHEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x067A },
+ specials={ "final", 0x67A },
unicodeslot=0xFB5F,
},
[0xFB60]={
@@ -122280,7 +125410,7 @@ characters.data={
description="ARABIC LETTER TTEHEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x067A },
+ specials={ "initial", 0x67A },
unicodeslot=0xFB60,
},
[0xFB61]={
@@ -122288,7 +125418,7 @@ characters.data={
description="ARABIC LETTER TTEHEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x067A },
+ specials={ "medial", 0x67A },
unicodeslot=0xFB61,
},
[0xFB62]={
@@ -122296,7 +125426,7 @@ characters.data={
description="ARABIC LETTER TEHEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x067F },
+ specials={ "isolated", 0x67F },
unicodeslot=0xFB62,
},
[0xFB63]={
@@ -122304,7 +125434,7 @@ characters.data={
description="ARABIC LETTER TEHEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x067F },
+ specials={ "final", 0x67F },
unicodeslot=0xFB63,
},
[0xFB64]={
@@ -122312,7 +125442,7 @@ characters.data={
description="ARABIC LETTER TEHEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x067F },
+ specials={ "initial", 0x67F },
unicodeslot=0xFB64,
},
[0xFB65]={
@@ -122320,7 +125450,7 @@ characters.data={
description="ARABIC LETTER TEHEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x067F },
+ specials={ "medial", 0x67F },
unicodeslot=0xFB65,
},
[0xFB66]={
@@ -122328,7 +125458,7 @@ characters.data={
description="ARABIC LETTER TTEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0679 },
+ specials={ "isolated", 0x679 },
unicodeslot=0xFB66,
},
[0xFB67]={
@@ -122337,7 +125467,7 @@ characters.data={
description="ARABIC LETTER TTEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0679 },
+ specials={ "final", 0x679 },
unicodeslot=0xFB67,
},
[0xFB68]={
@@ -122346,7 +125476,7 @@ characters.data={
description="ARABIC LETTER TTEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0679 },
+ specials={ "initial", 0x679 },
unicodeslot=0xFB68,
},
[0xFB69]={
@@ -122355,7 +125485,7 @@ characters.data={
description="ARABIC LETTER TTEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0679 },
+ specials={ "medial", 0x679 },
unicodeslot=0xFB69,
},
[0xFB6A]={
@@ -122363,7 +125493,7 @@ characters.data={
description="ARABIC LETTER VEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x06A4 },
+ specials={ "isolated", 0x6A4 },
unicodeslot=0xFB6A,
},
[0xFB6B]={
@@ -122372,7 +125502,7 @@ characters.data={
description="ARABIC LETTER VEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x06A4 },
+ specials={ "final", 0x6A4 },
unicodeslot=0xFB6B,
},
[0xFB6C]={
@@ -122381,7 +125511,7 @@ characters.data={
description="ARABIC LETTER VEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x06A4 },
+ specials={ "initial", 0x6A4 },
unicodeslot=0xFB6C,
},
[0xFB6D]={
@@ -122390,7 +125520,7 @@ characters.data={
description="ARABIC LETTER VEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x06A4 },
+ specials={ "medial", 0x6A4 },
unicodeslot=0xFB6D,
},
[0xFB6E]={
@@ -122398,7 +125528,7 @@ characters.data={
description="ARABIC LETTER PEHEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x06A6 },
+ specials={ "isolated", 0x6A6 },
unicodeslot=0xFB6E,
},
[0xFB6F]={
@@ -122406,7 +125536,7 @@ characters.data={
description="ARABIC LETTER PEHEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x06A6 },
+ specials={ "final", 0x6A6 },
unicodeslot=0xFB6F,
},
[0xFB70]={
@@ -122414,7 +125544,7 @@ characters.data={
description="ARABIC LETTER PEHEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x06A6 },
+ specials={ "initial", 0x6A6 },
unicodeslot=0xFB70,
},
[0xFB71]={
@@ -122422,7 +125552,7 @@ characters.data={
description="ARABIC LETTER PEHEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x06A6 },
+ specials={ "medial", 0x6A6 },
unicodeslot=0xFB71,
},
[0xFB72]={
@@ -122430,7 +125560,7 @@ characters.data={
description="ARABIC LETTER DYEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0684 },
+ specials={ "isolated", 0x684 },
unicodeslot=0xFB72,
},
[0xFB73]={
@@ -122438,7 +125568,7 @@ characters.data={
description="ARABIC LETTER DYEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0684 },
+ specials={ "final", 0x684 },
unicodeslot=0xFB73,
},
[0xFB74]={
@@ -122446,7 +125576,7 @@ characters.data={
description="ARABIC LETTER DYEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0684 },
+ specials={ "initial", 0x684 },
unicodeslot=0xFB74,
},
[0xFB75]={
@@ -122454,7 +125584,7 @@ characters.data={
description="ARABIC LETTER DYEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0684 },
+ specials={ "medial", 0x684 },
unicodeslot=0xFB75,
},
[0xFB76]={
@@ -122462,7 +125592,7 @@ characters.data={
description="ARABIC LETTER NYEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0683 },
+ specials={ "isolated", 0x683 },
unicodeslot=0xFB76,
},
[0xFB77]={
@@ -122470,7 +125600,7 @@ characters.data={
description="ARABIC LETTER NYEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0683 },
+ specials={ "final", 0x683 },
unicodeslot=0xFB77,
},
[0xFB78]={
@@ -122478,7 +125608,7 @@ characters.data={
description="ARABIC LETTER NYEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0683 },
+ specials={ "initial", 0x683 },
unicodeslot=0xFB78,
},
[0xFB79]={
@@ -122486,7 +125616,7 @@ characters.data={
description="ARABIC LETTER NYEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0683 },
+ specials={ "medial", 0x683 },
unicodeslot=0xFB79,
},
[0xFB7A]={
@@ -122494,7 +125624,7 @@ characters.data={
description="ARABIC LETTER TCHEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0686 },
+ specials={ "isolated", 0x686 },
unicodeslot=0xFB7A,
},
[0xFB7B]={
@@ -122503,7 +125633,7 @@ characters.data={
description="ARABIC LETTER TCHEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0686 },
+ specials={ "final", 0x686 },
unicodeslot=0xFB7B,
},
[0xFB7C]={
@@ -122512,7 +125642,7 @@ characters.data={
description="ARABIC LETTER TCHEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0686 },
+ specials={ "initial", 0x686 },
unicodeslot=0xFB7C,
},
[0xFB7D]={
@@ -122521,7 +125651,7 @@ characters.data={
description="ARABIC LETTER TCHEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0686 },
+ specials={ "medial", 0x686 },
unicodeslot=0xFB7D,
},
[0xFB7E]={
@@ -122529,7 +125659,7 @@ characters.data={
description="ARABIC LETTER TCHEHEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0687 },
+ specials={ "isolated", 0x687 },
unicodeslot=0xFB7E,
},
[0xFB7F]={
@@ -122537,7 +125667,7 @@ characters.data={
description="ARABIC LETTER TCHEHEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0687 },
+ specials={ "final", 0x687 },
unicodeslot=0xFB7F,
},
[0xFB80]={
@@ -122545,7 +125675,7 @@ characters.data={
description="ARABIC LETTER TCHEHEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0687 },
+ specials={ "initial", 0x687 },
unicodeslot=0xFB80,
},
[0xFB81]={
@@ -122553,7 +125683,7 @@ characters.data={
description="ARABIC LETTER TCHEHEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0687 },
+ specials={ "medial", 0x687 },
unicodeslot=0xFB81,
},
[0xFB82]={
@@ -122561,7 +125691,7 @@ characters.data={
description="ARABIC LETTER DDAHAL ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x068D },
+ specials={ "isolated", 0x68D },
unicodeslot=0xFB82,
},
[0xFB83]={
@@ -122569,7 +125699,7 @@ characters.data={
description="ARABIC LETTER DDAHAL FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x068D },
+ specials={ "final", 0x68D },
unicodeslot=0xFB83,
},
[0xFB84]={
@@ -122577,7 +125707,7 @@ characters.data={
description="ARABIC LETTER DAHAL ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x068C },
+ specials={ "isolated", 0x68C },
unicodeslot=0xFB84,
},
[0xFB85]={
@@ -122585,7 +125715,7 @@ characters.data={
description="ARABIC LETTER DAHAL FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x068C },
+ specials={ "final", 0x68C },
unicodeslot=0xFB85,
},
[0xFB86]={
@@ -122593,7 +125723,7 @@ characters.data={
description="ARABIC LETTER DUL ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x068E },
+ specials={ "isolated", 0x68E },
unicodeslot=0xFB86,
},
[0xFB87]={
@@ -122601,7 +125731,7 @@ characters.data={
description="ARABIC LETTER DUL FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x068E },
+ specials={ "final", 0x68E },
unicodeslot=0xFB87,
},
[0xFB88]={
@@ -122609,7 +125739,7 @@ characters.data={
description="ARABIC LETTER DDAL ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0688 },
+ specials={ "isolated", 0x688 },
unicodeslot=0xFB88,
},
[0xFB89]={
@@ -122618,7 +125748,7 @@ characters.data={
description="ARABIC LETTER DDAL FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0688 },
+ specials={ "final", 0x688 },
unicodeslot=0xFB89,
},
[0xFB8A]={
@@ -122626,7 +125756,7 @@ characters.data={
description="ARABIC LETTER JEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0698 },
+ specials={ "isolated", 0x698 },
unicodeslot=0xFB8A,
},
[0xFB8B]={
@@ -122635,7 +125765,7 @@ characters.data={
description="ARABIC LETTER JEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0698 },
+ specials={ "final", 0x698 },
unicodeslot=0xFB8B,
},
[0xFB8C]={
@@ -122643,7 +125773,7 @@ characters.data={
description="ARABIC LETTER RREH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0691 },
+ specials={ "isolated", 0x691 },
unicodeslot=0xFB8C,
},
[0xFB8D]={
@@ -122652,7 +125782,7 @@ characters.data={
description="ARABIC LETTER RREH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0691 },
+ specials={ "final", 0x691 },
unicodeslot=0xFB8D,
},
[0xFB8E]={
@@ -122660,7 +125790,7 @@ characters.data={
description="ARABIC LETTER KEHEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x06A9 },
+ specials={ "isolated", 0x6A9 },
unicodeslot=0xFB8E,
},
[0xFB8F]={
@@ -122668,7 +125798,7 @@ characters.data={
description="ARABIC LETTER KEHEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x06A9 },
+ specials={ "final", 0x6A9 },
unicodeslot=0xFB8F,
},
[0xFB90]={
@@ -122676,7 +125806,7 @@ characters.data={
description="ARABIC LETTER KEHEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x06A9 },
+ specials={ "initial", 0x6A9 },
unicodeslot=0xFB90,
},
[0xFB91]={
@@ -122684,7 +125814,7 @@ characters.data={
description="ARABIC LETTER KEHEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x06A9 },
+ specials={ "medial", 0x6A9 },
unicodeslot=0xFB91,
},
[0xFB92]={
@@ -122692,7 +125822,7 @@ characters.data={
description="ARABIC LETTER GAF ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x06AF },
+ specials={ "isolated", 0x6AF },
unicodeslot=0xFB92,
},
[0xFB93]={
@@ -122701,7 +125831,7 @@ characters.data={
description="ARABIC LETTER GAF FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x06AF },
+ specials={ "final", 0x6AF },
unicodeslot=0xFB93,
},
[0xFB94]={
@@ -122710,7 +125840,7 @@ characters.data={
description="ARABIC LETTER GAF INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x06AF },
+ specials={ "initial", 0x6AF },
unicodeslot=0xFB94,
},
[0xFB95]={
@@ -122719,7 +125849,7 @@ characters.data={
description="ARABIC LETTER GAF MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x06AF },
+ specials={ "medial", 0x6AF },
unicodeslot=0xFB95,
},
[0xFB96]={
@@ -122727,7 +125857,7 @@ characters.data={
description="ARABIC LETTER GUEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x06B3 },
+ specials={ "isolated", 0x6B3 },
unicodeslot=0xFB96,
},
[0xFB97]={
@@ -122735,7 +125865,7 @@ characters.data={
description="ARABIC LETTER GUEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x06B3 },
+ specials={ "final", 0x6B3 },
unicodeslot=0xFB97,
},
[0xFB98]={
@@ -122743,7 +125873,7 @@ characters.data={
description="ARABIC LETTER GUEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x06B3 },
+ specials={ "initial", 0x6B3 },
unicodeslot=0xFB98,
},
[0xFB99]={
@@ -122751,7 +125881,7 @@ characters.data={
description="ARABIC LETTER GUEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x06B3 },
+ specials={ "medial", 0x6B3 },
unicodeslot=0xFB99,
},
[0xFB9A]={
@@ -122759,7 +125889,7 @@ characters.data={
description="ARABIC LETTER NGOEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x06B1 },
+ specials={ "isolated", 0x6B1 },
unicodeslot=0xFB9A,
},
[0xFB9B]={
@@ -122767,7 +125897,7 @@ characters.data={
description="ARABIC LETTER NGOEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x06B1 },
+ specials={ "final", 0x6B1 },
unicodeslot=0xFB9B,
},
[0xFB9C]={
@@ -122775,7 +125905,7 @@ characters.data={
description="ARABIC LETTER NGOEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x06B1 },
+ specials={ "initial", 0x6B1 },
unicodeslot=0xFB9C,
},
[0xFB9D]={
@@ -122783,7 +125913,7 @@ characters.data={
description="ARABIC LETTER NGOEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x06B1 },
+ specials={ "medial", 0x6B1 },
unicodeslot=0xFB9D,
},
[0xFB9E]={
@@ -122791,7 +125921,7 @@ characters.data={
description="ARABIC LETTER NOON GHUNNA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x06BA },
+ specials={ "isolated", 0x6BA },
unicodeslot=0xFB9E,
},
[0xFB9F]={
@@ -122800,7 +125930,7 @@ characters.data={
description="ARABIC LETTER NOON GHUNNA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x06BA },
+ specials={ "final", 0x6BA },
unicodeslot=0xFB9F,
},
[0xFBA0]={
@@ -122808,7 +125938,7 @@ characters.data={
description="ARABIC LETTER RNOON ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x06BB },
+ specials={ "isolated", 0x6BB },
unicodeslot=0xFBA0,
},
[0xFBA1]={
@@ -122816,7 +125946,7 @@ characters.data={
description="ARABIC LETTER RNOON FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x06BB },
+ specials={ "final", 0x6BB },
unicodeslot=0xFBA1,
},
[0xFBA2]={
@@ -122824,7 +125954,7 @@ characters.data={
description="ARABIC LETTER RNOON INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x06BB },
+ specials={ "initial", 0x6BB },
unicodeslot=0xFBA2,
},
[0xFBA3]={
@@ -122832,7 +125962,7 @@ characters.data={
description="ARABIC LETTER RNOON MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x06BB },
+ specials={ "medial", 0x6BB },
unicodeslot=0xFBA3,
},
[0xFBA4]={
@@ -122841,8 +125971,8 @@ characters.data={
description="ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM",
direction="al",
linebreak="al",
- shcode=0x0647,
- specials={ "isolated", 0x06C0 },
+ shcode=0x647,
+ specials={ "isolated", 0x6C0 },
unicodeslot=0xFBA4,
},
[0xFBA5]={
@@ -122851,8 +125981,8 @@ characters.data={
description="ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM",
direction="al",
linebreak="al",
- shcode=0x0647,
- specials={ "final", 0x06C0 },
+ shcode=0x647,
+ specials={ "final", 0x6C0 },
unicodeslot=0xFBA5,
},
[0xFBA6]={
@@ -122860,7 +125990,7 @@ characters.data={
description="ARABIC LETTER HEH GOAL ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x06C1 },
+ specials={ "isolated", 0x6C1 },
unicodeslot=0xFBA6,
},
[0xFBA7]={
@@ -122869,7 +125999,7 @@ characters.data={
description="ARABIC LETTER HEH GOAL FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x06C1 },
+ specials={ "final", 0x6C1 },
unicodeslot=0xFBA7,
},
[0xFBA8]={
@@ -122878,7 +126008,7 @@ characters.data={
description="ARABIC LETTER HEH GOAL INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x06C1 },
+ specials={ "initial", 0x6C1 },
unicodeslot=0xFBA8,
},
[0xFBA9]={
@@ -122887,7 +126017,7 @@ characters.data={
description="ARABIC LETTER HEH GOAL MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x06C1 },
+ specials={ "medial", 0x6C1 },
unicodeslot=0xFBA9,
},
[0xFBAA]={
@@ -122895,7 +126025,7 @@ characters.data={
description="ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x06BE },
+ specials={ "isolated", 0x6BE },
unicodeslot=0xFBAA,
},
[0xFBAB]={
@@ -122903,7 +126033,7 @@ characters.data={
description="ARABIC LETTER HEH DOACHASHMEE FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x06BE },
+ specials={ "final", 0x6BE },
unicodeslot=0xFBAB,
},
[0xFBAC]={
@@ -122911,7 +126041,7 @@ characters.data={
description="ARABIC LETTER HEH DOACHASHMEE INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x06BE },
+ specials={ "initial", 0x6BE },
unicodeslot=0xFBAC,
},
[0xFBAD]={
@@ -122919,7 +126049,7 @@ characters.data={
description="ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x06BE },
+ specials={ "medial", 0x6BE },
unicodeslot=0xFBAD,
},
[0xFBAE]={
@@ -122927,7 +126057,7 @@ characters.data={
description="ARABIC LETTER YEH BARREE ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x06D2 },
+ specials={ "isolated", 0x6D2 },
unicodeslot=0xFBAE,
},
[0xFBAF]={
@@ -122936,7 +126066,7 @@ characters.data={
description="ARABIC LETTER YEH BARREE FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x06D2 },
+ specials={ "final", 0x6D2 },
unicodeslot=0xFBAF,
},
[0xFBB0]={
@@ -122944,7 +126074,7 @@ characters.data={
description="ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x06D3 },
+ specials={ "isolated", 0x6D3 },
unicodeslot=0xFBB0,
},
[0xFBB1]={
@@ -122952,7 +126082,7 @@ characters.data={
description="ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x06D3 },
+ specials={ "final", 0x6D3 },
unicodeslot=0xFBB1,
},
[0xFBB2]={
@@ -123072,7 +126202,7 @@ characters.data={
description="ARABIC LETTER NG ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x06AD },
+ specials={ "isolated", 0x6AD },
unicodeslot=0xFBD3,
},
[0xFBD4]={
@@ -123080,7 +126210,7 @@ characters.data={
description="ARABIC LETTER NG FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x06AD },
+ specials={ "final", 0x6AD },
unicodeslot=0xFBD4,
},
[0xFBD5]={
@@ -123088,7 +126218,7 @@ characters.data={
description="ARABIC LETTER NG INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x06AD },
+ specials={ "initial", 0x6AD },
unicodeslot=0xFBD5,
},
[0xFBD6]={
@@ -123096,7 +126226,7 @@ characters.data={
description="ARABIC LETTER NG MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x06AD },
+ specials={ "medial", 0x6AD },
unicodeslot=0xFBD6,
},
[0xFBD7]={
@@ -123104,7 +126234,7 @@ characters.data={
description="ARABIC LETTER U ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x06C7 },
+ specials={ "isolated", 0x6C7 },
unicodeslot=0xFBD7,
},
[0xFBD8]={
@@ -123112,7 +126242,7 @@ characters.data={
description="ARABIC LETTER U FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x06C7 },
+ specials={ "final", 0x6C7 },
unicodeslot=0xFBD8,
},
[0xFBD9]={
@@ -123120,7 +126250,7 @@ characters.data={
description="ARABIC LETTER OE ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x06C6 },
+ specials={ "isolated", 0x6C6 },
unicodeslot=0xFBD9,
},
[0xFBDA]={
@@ -123128,7 +126258,7 @@ characters.data={
description="ARABIC LETTER OE FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x06C6 },
+ specials={ "final", 0x6C6 },
unicodeslot=0xFBDA,
},
[0xFBDB]={
@@ -123136,7 +126266,7 @@ characters.data={
description="ARABIC LETTER YU ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x06C8 },
+ specials={ "isolated", 0x6C8 },
unicodeslot=0xFBDB,
},
[0xFBDC]={
@@ -123144,7 +126274,7 @@ characters.data={
description="ARABIC LETTER YU FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x06C8 },
+ specials={ "final", 0x6C8 },
unicodeslot=0xFBDC,
},
[0xFBDD]={
@@ -123152,8 +126282,8 @@ characters.data={
description="ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM",
direction="al",
linebreak="al",
- shcode=0x06C7,
- specials={ "isolated", 0x0677 },
+ shcode=0x6C7,
+ specials={ "isolated", 0x677 },
unicodeslot=0xFBDD,
},
[0xFBDE]={
@@ -123161,7 +126291,7 @@ characters.data={
description="ARABIC LETTER VE ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x06CB },
+ specials={ "isolated", 0x6CB },
unicodeslot=0xFBDE,
},
[0xFBDF]={
@@ -123169,7 +126299,7 @@ characters.data={
description="ARABIC LETTER VE FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x06CB },
+ specials={ "final", 0x6CB },
unicodeslot=0xFBDF,
},
[0xFBE0]={
@@ -123177,7 +126307,7 @@ characters.data={
description="ARABIC LETTER KIRGHIZ OE ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x06C5 },
+ specials={ "isolated", 0x6C5 },
unicodeslot=0xFBE0,
},
[0xFBE1]={
@@ -123185,7 +126315,7 @@ characters.data={
description="ARABIC LETTER KIRGHIZ OE FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x06C5 },
+ specials={ "final", 0x6C5 },
unicodeslot=0xFBE1,
},
[0xFBE2]={
@@ -123193,7 +126323,7 @@ characters.data={
description="ARABIC LETTER KIRGHIZ YU ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x06C9 },
+ specials={ "isolated", 0x6C9 },
unicodeslot=0xFBE2,
},
[0xFBE3]={
@@ -123201,7 +126331,7 @@ characters.data={
description="ARABIC LETTER KIRGHIZ YU FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x06C9 },
+ specials={ "final", 0x6C9 },
unicodeslot=0xFBE3,
},
[0xFBE4]={
@@ -123209,7 +126339,7 @@ characters.data={
description="ARABIC LETTER E ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x06D0 },
+ specials={ "isolated", 0x6D0 },
unicodeslot=0xFBE4,
},
[0xFBE5]={
@@ -123217,7 +126347,7 @@ characters.data={
description="ARABIC LETTER E FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x06D0 },
+ specials={ "final", 0x6D0 },
unicodeslot=0xFBE5,
},
[0xFBE6]={
@@ -123225,7 +126355,7 @@ characters.data={
description="ARABIC LETTER E INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x06D0 },
+ specials={ "initial", 0x6D0 },
unicodeslot=0xFBE6,
},
[0xFBE7]={
@@ -123233,7 +126363,7 @@ characters.data={
description="ARABIC LETTER E MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x06D0 },
+ specials={ "medial", 0x6D0 },
unicodeslot=0xFBE7,
},
[0xFBE8]={
@@ -123241,7 +126371,7 @@ characters.data={
description="ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0649 },
+ specials={ "initial", 0x649 },
unicodeslot=0xFBE8,
},
[0xFBE9]={
@@ -123249,7 +126379,7 @@ characters.data={
description="ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0649 },
+ specials={ "medial", 0x649 },
unicodeslot=0xFBE9,
},
[0xFBEA]={
@@ -123257,7 +126387,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0626, 0x0627 },
+ specials={ "isolated", 0x626, 0x627 },
unicodeslot=0xFBEA,
},
[0xFBEB]={
@@ -123265,7 +126395,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0626, 0x0627 },
+ specials={ "final", 0x626, 0x627 },
unicodeslot=0xFBEB,
},
[0xFBEC]={
@@ -123273,7 +126403,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0626, 0x06D5 },
+ specials={ "isolated", 0x626, 0x6D5 },
unicodeslot=0xFBEC,
},
[0xFBED]={
@@ -123281,7 +126411,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0626, 0x06D5 },
+ specials={ "final", 0x626, 0x6D5 },
unicodeslot=0xFBED,
},
[0xFBEE]={
@@ -123289,7 +126419,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0626, 0x0648 },
+ specials={ "isolated", 0x626, 0x648 },
unicodeslot=0xFBEE,
},
[0xFBEF]={
@@ -123297,7 +126427,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0626, 0x0648 },
+ specials={ "final", 0x626, 0x648 },
unicodeslot=0xFBEF,
},
[0xFBF0]={
@@ -123305,7 +126435,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0626, 0x06C7 },
+ specials={ "isolated", 0x626, 0x6C7 },
unicodeslot=0xFBF0,
},
[0xFBF1]={
@@ -123313,7 +126443,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0626, 0x06C7 },
+ specials={ "final", 0x626, 0x6C7 },
unicodeslot=0xFBF1,
},
[0xFBF2]={
@@ -123321,7 +126451,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0626, 0x06C6 },
+ specials={ "isolated", 0x626, 0x6C6 },
unicodeslot=0xFBF2,
},
[0xFBF3]={
@@ -123329,7 +126459,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0626, 0x06C6 },
+ specials={ "final", 0x626, 0x6C6 },
unicodeslot=0xFBF3,
},
[0xFBF4]={
@@ -123337,7 +126467,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0626, 0x06C8 },
+ specials={ "isolated", 0x626, 0x6C8 },
unicodeslot=0xFBF4,
},
[0xFBF5]={
@@ -123345,7 +126475,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0626, 0x06C8 },
+ specials={ "final", 0x626, 0x6C8 },
unicodeslot=0xFBF5,
},
[0xFBF6]={
@@ -123353,7 +126483,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0626, 0x06D0 },
+ specials={ "isolated", 0x626, 0x6D0 },
unicodeslot=0xFBF6,
},
[0xFBF7]={
@@ -123361,7 +126491,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0626, 0x06D0 },
+ specials={ "final", 0x626, 0x6D0 },
unicodeslot=0xFBF7,
},
[0xFBF8]={
@@ -123369,7 +126499,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0626, 0x06D0 },
+ specials={ "initial", 0x626, 0x6D0 },
unicodeslot=0xFBF8,
},
[0xFBF9]={
@@ -123377,7 +126507,7 @@ characters.data={
description="ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0626, 0x0649 },
+ specials={ "isolated", 0x626, 0x649 },
unicodeslot=0xFBF9,
},
[0xFBFA]={
@@ -123385,7 +126515,7 @@ characters.data={
description="ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0626, 0x0649 },
+ specials={ "final", 0x626, 0x649 },
unicodeslot=0xFBFA,
},
[0xFBFB]={
@@ -123393,7 +126523,7 @@ characters.data={
description="ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0626, 0x0649 },
+ specials={ "initial", 0x626, 0x649 },
unicodeslot=0xFBFB,
},
[0xFBFC]={
@@ -123401,7 +126531,7 @@ characters.data={
description="ARABIC LETTER FARSI YEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x06CC },
+ specials={ "isolated", 0x6CC },
unicodeslot=0xFBFC,
},
[0xFBFD]={
@@ -123409,7 +126539,7 @@ characters.data={
description="ARABIC LETTER FARSI YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x06CC },
+ specials={ "final", 0x6CC },
unicodeslot=0xFBFD,
},
[0xFBFE]={
@@ -123417,7 +126547,7 @@ characters.data={
description="ARABIC LETTER FARSI YEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x06CC },
+ specials={ "initial", 0x6CC },
unicodeslot=0xFBFE,
},
[0xFBFF]={
@@ -123425,7 +126555,7 @@ characters.data={
description="ARABIC LETTER FARSI YEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x06CC },
+ specials={ "medial", 0x6CC },
unicodeslot=0xFBFF,
},
[0xFC00]={
@@ -123433,7 +126563,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0626, 0x062C },
+ specials={ "isolated", 0x626, 0x62C },
unicodeslot=0xFC00,
},
[0xFC01]={
@@ -123441,7 +126571,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0626, 0x062D },
+ specials={ "isolated", 0x626, 0x62D },
unicodeslot=0xFC01,
},
[0xFC02]={
@@ -123449,7 +126579,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0626, 0x0645 },
+ specials={ "isolated", 0x626, 0x645 },
unicodeslot=0xFC02,
},
[0xFC03]={
@@ -123457,7 +126587,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0626, 0x0649 },
+ specials={ "isolated", 0x626, 0x649 },
unicodeslot=0xFC03,
},
[0xFC04]={
@@ -123465,7 +126595,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0626, 0x064A },
+ specials={ "isolated", 0x626, 0x64A },
unicodeslot=0xFC04,
},
[0xFC05]={
@@ -123473,7 +126603,7 @@ characters.data={
description="ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0628, 0x062C },
+ specials={ "isolated", 0x628, 0x62C },
unicodeslot=0xFC05,
},
[0xFC06]={
@@ -123481,7 +126611,7 @@ characters.data={
description="ARABIC LIGATURE BEH WITH HAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0628, 0x062D },
+ specials={ "isolated", 0x628, 0x62D },
unicodeslot=0xFC06,
},
[0xFC07]={
@@ -123489,7 +126619,7 @@ characters.data={
description="ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0628, 0x062E },
+ specials={ "isolated", 0x628, 0x62E },
unicodeslot=0xFC07,
},
[0xFC08]={
@@ -123498,7 +126628,7 @@ characters.data={
description="ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0628, 0x0645 },
+ specials={ "isolated", 0x628, 0x645 },
unicodeslot=0xFC08,
},
[0xFC09]={
@@ -123506,7 +126636,7 @@ characters.data={
description="ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0628, 0x0649 },
+ specials={ "isolated", 0x628, 0x649 },
unicodeslot=0xFC09,
},
[0xFC0A]={
@@ -123514,7 +126644,7 @@ characters.data={
description="ARABIC LIGATURE BEH WITH YEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0628, 0x064A },
+ specials={ "isolated", 0x628, 0x64A },
unicodeslot=0xFC0A,
},
[0xFC0B]={
@@ -123523,7 +126653,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062A, 0x062C },
+ specials={ "isolated", 0x62A, 0x62C },
unicodeslot=0xFC0B,
},
[0xFC0C]={
@@ -123532,7 +126662,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH HAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062A, 0x062D },
+ specials={ "isolated", 0x62A, 0x62D },
unicodeslot=0xFC0C,
},
[0xFC0D]={
@@ -123540,7 +126670,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062A, 0x062E },
+ specials={ "isolated", 0x62A, 0x62E },
unicodeslot=0xFC0D,
},
[0xFC0E]={
@@ -123549,7 +126679,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062A, 0x0645 },
+ specials={ "isolated", 0x62A, 0x645 },
unicodeslot=0xFC0E,
},
[0xFC0F]={
@@ -123557,7 +126687,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062A, 0x0649 },
+ specials={ "isolated", 0x62A, 0x649 },
unicodeslot=0xFC0F,
},
[0xFC10]={
@@ -123565,7 +126695,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH YEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062A, 0x064A },
+ specials={ "isolated", 0x62A, 0x64A },
unicodeslot=0xFC10,
},
[0xFC11]={
@@ -123573,7 +126703,7 @@ characters.data={
description="ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062B, 0x062C },
+ specials={ "isolated", 0x62B, 0x62C },
unicodeslot=0xFC11,
},
[0xFC12]={
@@ -123581,7 +126711,7 @@ characters.data={
description="ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062B, 0x0645 },
+ specials={ "isolated", 0x62B, 0x645 },
unicodeslot=0xFC12,
},
[0xFC13]={
@@ -123589,7 +126719,7 @@ characters.data={
description="ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062B, 0x0649 },
+ specials={ "isolated", 0x62B, 0x649 },
unicodeslot=0xFC13,
},
[0xFC14]={
@@ -123597,7 +126727,7 @@ characters.data={
description="ARABIC LIGATURE THEH WITH YEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062B, 0x064A },
+ specials={ "isolated", 0x62B, 0x64A },
unicodeslot=0xFC14,
},
[0xFC15]={
@@ -123605,7 +126735,7 @@ characters.data={
description="ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062C, 0x062D },
+ specials={ "isolated", 0x62C, 0x62D },
unicodeslot=0xFC15,
},
[0xFC16]={
@@ -123613,7 +126743,7 @@ characters.data={
description="ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062C, 0x0645 },
+ specials={ "isolated", 0x62C, 0x645 },
unicodeslot=0xFC16,
},
[0xFC17]={
@@ -123621,7 +126751,7 @@ characters.data={
description="ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062D, 0x062C },
+ specials={ "isolated", 0x62D, 0x62C },
unicodeslot=0xFC17,
},
[0xFC18]={
@@ -123629,7 +126759,7 @@ characters.data={
description="ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062D, 0x0645 },
+ specials={ "isolated", 0x62D, 0x645 },
unicodeslot=0xFC18,
},
[0xFC19]={
@@ -123637,7 +126767,7 @@ characters.data={
description="ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062E, 0x062C },
+ specials={ "isolated", 0x62E, 0x62C },
unicodeslot=0xFC19,
},
[0xFC1A]={
@@ -123645,7 +126775,7 @@ characters.data={
description="ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062E, 0x062D },
+ specials={ "isolated", 0x62E, 0x62D },
unicodeslot=0xFC1A,
},
[0xFC1B]={
@@ -123653,7 +126783,7 @@ characters.data={
description="ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062E, 0x0645 },
+ specials={ "isolated", 0x62E, 0x645 },
unicodeslot=0xFC1B,
},
[0xFC1C]={
@@ -123661,7 +126791,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0633, 0x062C },
+ specials={ "isolated", 0x633, 0x62C },
unicodeslot=0xFC1C,
},
[0xFC1D]={
@@ -123669,7 +126799,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0633, 0x062D },
+ specials={ "isolated", 0x633, 0x62D },
unicodeslot=0xFC1D,
},
[0xFC1E]={
@@ -123677,7 +126807,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0633, 0x062E },
+ specials={ "isolated", 0x633, 0x62E },
unicodeslot=0xFC1E,
},
[0xFC1F]={
@@ -123685,7 +126815,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0633, 0x0645 },
+ specials={ "isolated", 0x633, 0x645 },
unicodeslot=0xFC1F,
},
[0xFC20]={
@@ -123693,7 +126823,7 @@ characters.data={
description="ARABIC LIGATURE SAD WITH HAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0635, 0x062D },
+ specials={ "isolated", 0x635, 0x62D },
unicodeslot=0xFC20,
},
[0xFC21]={
@@ -123701,7 +126831,7 @@ characters.data={
description="ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0635, 0x0645 },
+ specials={ "isolated", 0x635, 0x645 },
unicodeslot=0xFC21,
},
[0xFC22]={
@@ -123709,7 +126839,7 @@ characters.data={
description="ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0636, 0x062C },
+ specials={ "isolated", 0x636, 0x62C },
unicodeslot=0xFC22,
},
[0xFC23]={
@@ -123717,7 +126847,7 @@ characters.data={
description="ARABIC LIGATURE DAD WITH HAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0636, 0x062D },
+ specials={ "isolated", 0x636, 0x62D },
unicodeslot=0xFC23,
},
[0xFC24]={
@@ -123725,7 +126855,7 @@ characters.data={
description="ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0636, 0x062E },
+ specials={ "isolated", 0x636, 0x62E },
unicodeslot=0xFC24,
},
[0xFC25]={
@@ -123733,7 +126863,7 @@ characters.data={
description="ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0636, 0x0645 },
+ specials={ "isolated", 0x636, 0x645 },
unicodeslot=0xFC25,
},
[0xFC26]={
@@ -123741,7 +126871,7 @@ characters.data={
description="ARABIC LIGATURE TAH WITH HAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0637, 0x062D },
+ specials={ "isolated", 0x637, 0x62D },
unicodeslot=0xFC26,
},
[0xFC27]={
@@ -123749,7 +126879,7 @@ characters.data={
description="ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0637, 0x0645 },
+ specials={ "isolated", 0x637, 0x645 },
unicodeslot=0xFC27,
},
[0xFC28]={
@@ -123757,7 +126887,7 @@ characters.data={
description="ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0638, 0x0645 },
+ specials={ "isolated", 0x638, 0x645 },
unicodeslot=0xFC28,
},
[0xFC29]={
@@ -123765,7 +126895,7 @@ characters.data={
description="ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0639, 0x062C },
+ specials={ "isolated", 0x639, 0x62C },
unicodeslot=0xFC29,
},
[0xFC2A]={
@@ -123773,7 +126903,7 @@ characters.data={
description="ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0639, 0x0645 },
+ specials={ "isolated", 0x639, 0x645 },
unicodeslot=0xFC2A,
},
[0xFC2B]={
@@ -123781,7 +126911,7 @@ characters.data={
description="ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x063A, 0x062C },
+ specials={ "isolated", 0x63A, 0x62C },
unicodeslot=0xFC2B,
},
[0xFC2C]={
@@ -123789,7 +126919,7 @@ characters.data={
description="ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x063A, 0x0645 },
+ specials={ "isolated", 0x63A, 0x645 },
unicodeslot=0xFC2C,
},
[0xFC2D]={
@@ -123797,7 +126927,7 @@ characters.data={
description="ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0641, 0x062C },
+ specials={ "isolated", 0x641, 0x62C },
unicodeslot=0xFC2D,
},
[0xFC2E]={
@@ -123805,7 +126935,7 @@ characters.data={
description="ARABIC LIGATURE FEH WITH HAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0641, 0x062D },
+ specials={ "isolated", 0x641, 0x62D },
unicodeslot=0xFC2E,
},
[0xFC2F]={
@@ -123813,7 +126943,7 @@ characters.data={
description="ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0641, 0x062E },
+ specials={ "isolated", 0x641, 0x62E },
unicodeslot=0xFC2F,
},
[0xFC30]={
@@ -123821,7 +126951,7 @@ characters.data={
description="ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0641, 0x0645 },
+ specials={ "isolated", 0x641, 0x645 },
unicodeslot=0xFC30,
},
[0xFC31]={
@@ -123829,7 +126959,7 @@ characters.data={
description="ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0641, 0x0649 },
+ specials={ "isolated", 0x641, 0x649 },
unicodeslot=0xFC31,
},
[0xFC32]={
@@ -123837,7 +126967,7 @@ characters.data={
description="ARABIC LIGATURE FEH WITH YEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0641, 0x064A },
+ specials={ "isolated", 0x641, 0x64A },
unicodeslot=0xFC32,
},
[0xFC33]={
@@ -123845,7 +126975,7 @@ characters.data={
description="ARABIC LIGATURE QAF WITH HAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0642, 0x062D },
+ specials={ "isolated", 0x642, 0x62D },
unicodeslot=0xFC33,
},
[0xFC34]={
@@ -123853,7 +126983,7 @@ characters.data={
description="ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0642, 0x0645 },
+ specials={ "isolated", 0x642, 0x645 },
unicodeslot=0xFC34,
},
[0xFC35]={
@@ -123861,7 +126991,7 @@ characters.data={
description="ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0642, 0x0649 },
+ specials={ "isolated", 0x642, 0x649 },
unicodeslot=0xFC35,
},
[0xFC36]={
@@ -123869,7 +126999,7 @@ characters.data={
description="ARABIC LIGATURE QAF WITH YEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0642, 0x064A },
+ specials={ "isolated", 0x642, 0x64A },
unicodeslot=0xFC36,
},
[0xFC37]={
@@ -123877,7 +127007,7 @@ characters.data={
description="ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0643, 0x0627 },
+ specials={ "isolated", 0x643, 0x627 },
unicodeslot=0xFC37,
},
[0xFC38]={
@@ -123885,7 +127015,7 @@ characters.data={
description="ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0643, 0x062C },
+ specials={ "isolated", 0x643, 0x62C },
unicodeslot=0xFC38,
},
[0xFC39]={
@@ -123893,7 +127023,7 @@ characters.data={
description="ARABIC LIGATURE KAF WITH HAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0643, 0x062D },
+ specials={ "isolated", 0x643, 0x62D },
unicodeslot=0xFC39,
},
[0xFC3A]={
@@ -123901,7 +127031,7 @@ characters.data={
description="ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0643, 0x062E },
+ specials={ "isolated", 0x643, 0x62E },
unicodeslot=0xFC3A,
},
[0xFC3B]={
@@ -123909,7 +127039,7 @@ characters.data={
description="ARABIC LIGATURE KAF WITH LAM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0643, 0x0644 },
+ specials={ "isolated", 0x643, 0x644 },
unicodeslot=0xFC3B,
},
[0xFC3C]={
@@ -123917,7 +127047,7 @@ characters.data={
description="ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0643, 0x0645 },
+ specials={ "isolated", 0x643, 0x645 },
unicodeslot=0xFC3C,
},
[0xFC3D]={
@@ -123925,7 +127055,7 @@ characters.data={
description="ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0643, 0x0649 },
+ specials={ "isolated", 0x643, 0x649 },
unicodeslot=0xFC3D,
},
[0xFC3E]={
@@ -123933,7 +127063,7 @@ characters.data={
description="ARABIC LIGATURE KAF WITH YEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0643, 0x064A },
+ specials={ "isolated", 0x643, 0x64A },
unicodeslot=0xFC3E,
},
[0xFC3F]={
@@ -123941,7 +127071,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0644, 0x062C },
+ specials={ "isolated", 0x644, 0x62C },
unicodeslot=0xFC3F,
},
[0xFC40]={
@@ -123949,7 +127079,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH HAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0644, 0x062D },
+ specials={ "isolated", 0x644, 0x62D },
unicodeslot=0xFC40,
},
[0xFC41]={
@@ -123957,7 +127087,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0644, 0x062E },
+ specials={ "isolated", 0x644, 0x62E },
unicodeslot=0xFC41,
},
[0xFC42]={
@@ -123965,7 +127095,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0644, 0x0645 },
+ specials={ "isolated", 0x644, 0x645 },
unicodeslot=0xFC42,
},
[0xFC43]={
@@ -123973,7 +127103,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0644, 0x0649 },
+ specials={ "isolated", 0x644, 0x649 },
unicodeslot=0xFC43,
},
[0xFC44]={
@@ -123981,7 +127111,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH YEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0644, 0x064A },
+ specials={ "isolated", 0x644, 0x64A },
unicodeslot=0xFC44,
},
[0xFC45]={
@@ -123989,7 +127119,7 @@ characters.data={
description="ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0645, 0x062C },
+ specials={ "isolated", 0x645, 0x62C },
unicodeslot=0xFC45,
},
[0xFC46]={
@@ -123997,7 +127127,7 @@ characters.data={
description="ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0645, 0x062D },
+ specials={ "isolated", 0x645, 0x62D },
unicodeslot=0xFC46,
},
[0xFC47]={
@@ -124005,7 +127135,7 @@ characters.data={
description="ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0645, 0x062E },
+ specials={ "isolated", 0x645, 0x62E },
unicodeslot=0xFC47,
},
[0xFC48]={
@@ -124014,7 +127144,7 @@ characters.data={
description="ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0645, 0x0645 },
+ specials={ "isolated", 0x645, 0x645 },
unicodeslot=0xFC48,
},
[0xFC49]={
@@ -124022,7 +127152,7 @@ characters.data={
description="ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0645, 0x0649 },
+ specials={ "isolated", 0x645, 0x649 },
unicodeslot=0xFC49,
},
[0xFC4A]={
@@ -124030,7 +127160,7 @@ characters.data={
description="ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0645, 0x064A },
+ specials={ "isolated", 0x645, 0x64A },
unicodeslot=0xFC4A,
},
[0xFC4B]={
@@ -124039,7 +127169,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0646, 0x062C },
+ specials={ "isolated", 0x646, 0x62C },
unicodeslot=0xFC4B,
},
[0xFC4C]={
@@ -124047,7 +127177,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH HAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0646, 0x062D },
+ specials={ "isolated", 0x646, 0x62D },
unicodeslot=0xFC4C,
},
[0xFC4D]={
@@ -124055,7 +127185,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0646, 0x062E },
+ specials={ "isolated", 0x646, 0x62E },
unicodeslot=0xFC4D,
},
[0xFC4E]={
@@ -124064,7 +127194,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0646, 0x0645 },
+ specials={ "isolated", 0x646, 0x645 },
unicodeslot=0xFC4E,
},
[0xFC4F]={
@@ -124072,7 +127202,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0646, 0x0649 },
+ specials={ "isolated", 0x646, 0x649 },
unicodeslot=0xFC4F,
},
[0xFC50]={
@@ -124080,7 +127210,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH YEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0646, 0x064A },
+ specials={ "isolated", 0x646, 0x64A },
unicodeslot=0xFC50,
},
[0xFC51]={
@@ -124088,7 +127218,7 @@ characters.data={
description="ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0647, 0x062C },
+ specials={ "isolated", 0x647, 0x62C },
unicodeslot=0xFC51,
},
[0xFC52]={
@@ -124096,7 +127226,7 @@ characters.data={
description="ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0647, 0x0645 },
+ specials={ "isolated", 0x647, 0x645 },
unicodeslot=0xFC52,
},
[0xFC53]={
@@ -124104,7 +127234,7 @@ characters.data={
description="ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0647, 0x0649 },
+ specials={ "isolated", 0x647, 0x649 },
unicodeslot=0xFC53,
},
[0xFC54]={
@@ -124112,7 +127242,7 @@ characters.data={
description="ARABIC LIGATURE HEH WITH YEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0647, 0x064A },
+ specials={ "isolated", 0x647, 0x64A },
unicodeslot=0xFC54,
},
[0xFC55]={
@@ -124120,7 +127250,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x064A, 0x062C },
+ specials={ "isolated", 0x64A, 0x62C },
unicodeslot=0xFC55,
},
[0xFC56]={
@@ -124128,7 +127258,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x064A, 0x062D },
+ specials={ "isolated", 0x64A, 0x62D },
unicodeslot=0xFC56,
},
[0xFC57]={
@@ -124136,7 +127266,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x064A, 0x062E },
+ specials={ "isolated", 0x64A, 0x62E },
unicodeslot=0xFC57,
},
[0xFC58]={
@@ -124145,7 +127275,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x064A, 0x0645 },
+ specials={ "isolated", 0x64A, 0x645 },
unicodeslot=0xFC58,
},
[0xFC59]={
@@ -124153,7 +127283,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x064A, 0x0649 },
+ specials={ "isolated", 0x64A, 0x649 },
unicodeslot=0xFC59,
},
[0xFC5A]={
@@ -124161,7 +127291,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH YEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x064A, 0x064A },
+ specials={ "isolated", 0x64A, 0x64A },
unicodeslot=0xFC5A,
},
[0xFC5B]={
@@ -124169,7 +127299,7 @@ characters.data={
description="ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0630, 0x0670 },
+ specials={ "isolated", 0x630, 0x670 },
unicodeslot=0xFC5B,
},
[0xFC5C]={
@@ -124177,7 +127307,7 @@ characters.data={
description="ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0631, 0x0670 },
+ specials={ "isolated", 0x631, 0x670 },
unicodeslot=0xFC5C,
},
[0xFC5D]={
@@ -124185,7 +127315,7 @@ characters.data={
description="ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0649, 0x0670 },
+ specials={ "isolated", 0x649, 0x670 },
unicodeslot=0xFC5D,
},
[0xFC5E]={
@@ -124194,7 +127324,7 @@ characters.data={
description="ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0020, 0x064C, 0x0651 },
+ specials={ "isolated", 0x20, 0x64C, 0x651 },
unicodeslot=0xFC5E,
},
[0xFC5F]={
@@ -124203,7 +127333,7 @@ characters.data={
description="ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0020, 0x064D, 0x0651 },
+ specials={ "isolated", 0x20, 0x64D, 0x651 },
unicodeslot=0xFC5F,
},
[0xFC60]={
@@ -124212,7 +127342,7 @@ characters.data={
description="ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0020, 0x064E, 0x0651 },
+ specials={ "isolated", 0x20, 0x64E, 0x651 },
unicodeslot=0xFC60,
},
[0xFC61]={
@@ -124221,7 +127351,7 @@ characters.data={
description="ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0020, 0x064F, 0x0651 },
+ specials={ "isolated", 0x20, 0x64F, 0x651 },
unicodeslot=0xFC61,
},
[0xFC62]={
@@ -124230,7 +127360,7 @@ characters.data={
description="ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0020, 0x0650, 0x0651 },
+ specials={ "isolated", 0x20, 0x650, 0x651 },
unicodeslot=0xFC62,
},
[0xFC63]={
@@ -124238,7 +127368,7 @@ characters.data={
description="ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0020, 0x0651, 0x0670 },
+ specials={ "isolated", 0x20, 0x651, 0x670 },
unicodeslot=0xFC63,
},
[0xFC64]={
@@ -124246,7 +127376,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0626, 0x0631 },
+ specials={ "final", 0x626, 0x631 },
unicodeslot=0xFC64,
},
[0xFC65]={
@@ -124254,7 +127384,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0626, 0x0632 },
+ specials={ "final", 0x626, 0x632 },
unicodeslot=0xFC65,
},
[0xFC66]={
@@ -124262,7 +127392,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0626, 0x0645 },
+ specials={ "final", 0x626, 0x645 },
unicodeslot=0xFC66,
},
[0xFC67]={
@@ -124270,7 +127400,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0626, 0x0646 },
+ specials={ "final", 0x626, 0x646 },
unicodeslot=0xFC67,
},
[0xFC68]={
@@ -124278,7 +127408,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0626, 0x0649 },
+ specials={ "final", 0x626, 0x649 },
unicodeslot=0xFC68,
},
[0xFC69]={
@@ -124286,7 +127416,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0626, 0x064A },
+ specials={ "final", 0x626, 0x64A },
unicodeslot=0xFC69,
},
[0xFC6A]={
@@ -124294,7 +127424,7 @@ characters.data={
description="ARABIC LIGATURE BEH WITH REH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0628, 0x0631 },
+ specials={ "final", 0x628, 0x631 },
unicodeslot=0xFC6A,
},
[0xFC6B]={
@@ -124302,7 +127432,7 @@ characters.data={
description="ARABIC LIGATURE BEH WITH ZAIN FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0628, 0x0632 },
+ specials={ "final", 0x628, 0x632 },
unicodeslot=0xFC6B,
},
[0xFC6C]={
@@ -124310,7 +127440,7 @@ characters.data={
description="ARABIC LIGATURE BEH WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0628, 0x0645 },
+ specials={ "final", 0x628, 0x645 },
unicodeslot=0xFC6C,
},
[0xFC6D]={
@@ -124319,7 +127449,7 @@ characters.data={
description="ARABIC LIGATURE BEH WITH NOON FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0628, 0x0646 },
+ specials={ "final", 0x628, 0x646 },
unicodeslot=0xFC6D,
},
[0xFC6E]={
@@ -124327,7 +127457,7 @@ characters.data={
description="ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0628, 0x0649 },
+ specials={ "final", 0x628, 0x649 },
unicodeslot=0xFC6E,
},
[0xFC6F]={
@@ -124335,7 +127465,7 @@ characters.data={
description="ARABIC LIGATURE BEH WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0628, 0x064A },
+ specials={ "final", 0x628, 0x64A },
unicodeslot=0xFC6F,
},
[0xFC70]={
@@ -124343,7 +127473,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH REH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062A, 0x0631 },
+ specials={ "final", 0x62A, 0x631 },
unicodeslot=0xFC70,
},
[0xFC71]={
@@ -124351,7 +127481,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH ZAIN FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062A, 0x0632 },
+ specials={ "final", 0x62A, 0x632 },
unicodeslot=0xFC71,
},
[0xFC72]={
@@ -124359,7 +127489,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062A, 0x0645 },
+ specials={ "final", 0x62A, 0x645 },
unicodeslot=0xFC72,
},
[0xFC73]={
@@ -124368,7 +127498,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH NOON FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062A, 0x0646 },
+ specials={ "final", 0x62A, 0x646 },
unicodeslot=0xFC73,
},
[0xFC74]={
@@ -124376,7 +127506,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062A, 0x0649 },
+ specials={ "final", 0x62A, 0x649 },
unicodeslot=0xFC74,
},
[0xFC75]={
@@ -124384,7 +127514,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062A, 0x064A },
+ specials={ "final", 0x62A, 0x64A },
unicodeslot=0xFC75,
},
[0xFC76]={
@@ -124392,7 +127522,7 @@ characters.data={
description="ARABIC LIGATURE THEH WITH REH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062B, 0x0631 },
+ specials={ "final", 0x62B, 0x631 },
unicodeslot=0xFC76,
},
[0xFC77]={
@@ -124400,7 +127530,7 @@ characters.data={
description="ARABIC LIGATURE THEH WITH ZAIN FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062B, 0x0632 },
+ specials={ "final", 0x62B, 0x632 },
unicodeslot=0xFC77,
},
[0xFC78]={
@@ -124408,7 +127538,7 @@ characters.data={
description="ARABIC LIGATURE THEH WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062B, 0x0645 },
+ specials={ "final", 0x62B, 0x645 },
unicodeslot=0xFC78,
},
[0xFC79]={
@@ -124416,7 +127546,7 @@ characters.data={
description="ARABIC LIGATURE THEH WITH NOON FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062B, 0x0646 },
+ specials={ "final", 0x62B, 0x646 },
unicodeslot=0xFC79,
},
[0xFC7A]={
@@ -124424,7 +127554,7 @@ characters.data={
description="ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062B, 0x0649 },
+ specials={ "final", 0x62B, 0x649 },
unicodeslot=0xFC7A,
},
[0xFC7B]={
@@ -124432,7 +127562,7 @@ characters.data={
description="ARABIC LIGATURE THEH WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062B, 0x064A },
+ specials={ "final", 0x62B, 0x64A },
unicodeslot=0xFC7B,
},
[0xFC7C]={
@@ -124440,7 +127570,7 @@ characters.data={
description="ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0641, 0x0649 },
+ specials={ "final", 0x641, 0x649 },
unicodeslot=0xFC7C,
},
[0xFC7D]={
@@ -124448,7 +127578,7 @@ characters.data={
description="ARABIC LIGATURE FEH WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0641, 0x064A },
+ specials={ "final", 0x641, 0x64A },
unicodeslot=0xFC7D,
},
[0xFC7E]={
@@ -124456,7 +127586,7 @@ characters.data={
description="ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0642, 0x0649 },
+ specials={ "final", 0x642, 0x649 },
unicodeslot=0xFC7E,
},
[0xFC7F]={
@@ -124464,7 +127594,7 @@ characters.data={
description="ARABIC LIGATURE QAF WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0642, 0x064A },
+ specials={ "final", 0x642, 0x64A },
unicodeslot=0xFC7F,
},
[0xFC80]={
@@ -124472,7 +127602,7 @@ characters.data={
description="ARABIC LIGATURE KAF WITH ALEF FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0643, 0x0627 },
+ specials={ "final", 0x643, 0x627 },
unicodeslot=0xFC80,
},
[0xFC81]={
@@ -124480,7 +127610,7 @@ characters.data={
description="ARABIC LIGATURE KAF WITH LAM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0643, 0x0644 },
+ specials={ "final", 0x643, 0x644 },
unicodeslot=0xFC81,
},
[0xFC82]={
@@ -124488,7 +127618,7 @@ characters.data={
description="ARABIC LIGATURE KAF WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0643, 0x0645 },
+ specials={ "final", 0x643, 0x645 },
unicodeslot=0xFC82,
},
[0xFC83]={
@@ -124496,7 +127626,7 @@ characters.data={
description="ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0643, 0x0649 },
+ specials={ "final", 0x643, 0x649 },
unicodeslot=0xFC83,
},
[0xFC84]={
@@ -124504,7 +127634,7 @@ characters.data={
description="ARABIC LIGATURE KAF WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0643, 0x064A },
+ specials={ "final", 0x643, 0x64A },
unicodeslot=0xFC84,
},
[0xFC85]={
@@ -124512,7 +127642,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0644, 0x0645 },
+ specials={ "final", 0x644, 0x645 },
unicodeslot=0xFC85,
},
[0xFC86]={
@@ -124520,7 +127650,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0644, 0x0649 },
+ specials={ "final", 0x644, 0x649 },
unicodeslot=0xFC86,
},
[0xFC87]={
@@ -124528,7 +127658,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0644, 0x064A },
+ specials={ "final", 0x644, 0x64A },
unicodeslot=0xFC87,
},
[0xFC88]={
@@ -124536,7 +127666,7 @@ characters.data={
description="ARABIC LIGATURE MEEM WITH ALEF FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0645, 0x0627 },
+ specials={ "final", 0x645, 0x627 },
unicodeslot=0xFC88,
},
[0xFC89]={
@@ -124544,7 +127674,7 @@ characters.data={
description="ARABIC LIGATURE MEEM WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0645, 0x0645 },
+ specials={ "final", 0x645, 0x645 },
unicodeslot=0xFC89,
},
[0xFC8A]={
@@ -124552,7 +127682,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH REH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0646, 0x0631 },
+ specials={ "final", 0x646, 0x631 },
unicodeslot=0xFC8A,
},
[0xFC8B]={
@@ -124560,7 +127690,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH ZAIN FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0646, 0x0632 },
+ specials={ "final", 0x646, 0x632 },
unicodeslot=0xFC8B,
},
[0xFC8C]={
@@ -124568,7 +127698,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0646, 0x0645 },
+ specials={ "final", 0x646, 0x645 },
unicodeslot=0xFC8C,
},
[0xFC8D]={
@@ -124577,7 +127707,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH NOON FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0646, 0x0646 },
+ specials={ "final", 0x646, 0x646 },
unicodeslot=0xFC8D,
},
[0xFC8E]={
@@ -124585,7 +127715,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0646, 0x0649 },
+ specials={ "final", 0x646, 0x649 },
unicodeslot=0xFC8E,
},
[0xFC8F]={
@@ -124593,7 +127723,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0646, 0x064A },
+ specials={ "final", 0x646, 0x64A },
unicodeslot=0xFC8F,
},
[0xFC90]={
@@ -124601,7 +127731,7 @@ characters.data={
description="ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0649, 0x0670 },
+ specials={ "final", 0x649, 0x670 },
unicodeslot=0xFC90,
},
[0xFC91]={
@@ -124609,7 +127739,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH REH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x064A, 0x0631 },
+ specials={ "final", 0x64A, 0x631 },
unicodeslot=0xFC91,
},
[0xFC92]={
@@ -124617,7 +127747,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH ZAIN FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x064A, 0x0632 },
+ specials={ "final", 0x64A, 0x632 },
unicodeslot=0xFC92,
},
[0xFC93]={
@@ -124625,7 +127755,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x064A, 0x0645 },
+ specials={ "final", 0x64A, 0x645 },
unicodeslot=0xFC93,
},
[0xFC94]={
@@ -124634,7 +127764,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH NOON FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x064A, 0x0646 },
+ specials={ "final", 0x64A, 0x646 },
unicodeslot=0xFC94,
},
[0xFC95]={
@@ -124642,7 +127772,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x064A, 0x0649 },
+ specials={ "final", 0x64A, 0x649 },
unicodeslot=0xFC95,
},
[0xFC96]={
@@ -124650,7 +127780,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x064A, 0x064A },
+ specials={ "final", 0x64A, 0x64A },
unicodeslot=0xFC96,
},
[0xFC97]={
@@ -124658,7 +127788,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0626, 0x062C },
+ specials={ "initial", 0x626, 0x62C },
unicodeslot=0xFC97,
},
[0xFC98]={
@@ -124666,7 +127796,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0626, 0x062D },
+ specials={ "initial", 0x626, 0x62D },
unicodeslot=0xFC98,
},
[0xFC99]={
@@ -124674,7 +127804,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0626, 0x062E },
+ specials={ "initial", 0x626, 0x62E },
unicodeslot=0xFC99,
},
[0xFC9A]={
@@ -124682,7 +127812,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0626, 0x0645 },
+ specials={ "initial", 0x626, 0x645 },
unicodeslot=0xFC9A,
},
[0xFC9B]={
@@ -124690,7 +127820,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0626, 0x0647 },
+ specials={ "initial", 0x626, 0x647 },
unicodeslot=0xFC9B,
},
[0xFC9C]={
@@ -124698,7 +127828,7 @@ characters.data={
description="ARABIC LIGATURE BEH WITH JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0628, 0x062C },
+ specials={ "initial", 0x628, 0x62C },
unicodeslot=0xFC9C,
},
[0xFC9D]={
@@ -124706,7 +127836,7 @@ characters.data={
description="ARABIC LIGATURE BEH WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0628, 0x062D },
+ specials={ "initial", 0x628, 0x62D },
unicodeslot=0xFC9D,
},
[0xFC9E]={
@@ -124714,7 +127844,7 @@ characters.data={
description="ARABIC LIGATURE BEH WITH KHAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0628, 0x062E },
+ specials={ "initial", 0x628, 0x62E },
unicodeslot=0xFC9E,
},
[0xFC9F]={
@@ -124723,7 +127853,7 @@ characters.data={
description="ARABIC LIGATURE BEH WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0628, 0x0645 },
+ specials={ "initial", 0x628, 0x645 },
unicodeslot=0xFC9F,
},
[0xFCA0]={
@@ -124731,7 +127861,7 @@ characters.data={
description="ARABIC LIGATURE BEH WITH HEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0628, 0x0647 },
+ specials={ "initial", 0x628, 0x647 },
unicodeslot=0xFCA0,
},
[0xFCA1]={
@@ -124740,7 +127870,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x062A, 0x062C },
+ specials={ "initial", 0x62A, 0x62C },
unicodeslot=0xFCA1,
},
[0xFCA2]={
@@ -124749,7 +127879,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x062A, 0x062D },
+ specials={ "initial", 0x62A, 0x62D },
unicodeslot=0xFCA2,
},
[0xFCA3]={
@@ -124757,7 +127887,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH KHAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x062A, 0x062E },
+ specials={ "initial", 0x62A, 0x62E },
unicodeslot=0xFCA3,
},
[0xFCA4]={
@@ -124766,7 +127896,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x062A, 0x0645 },
+ specials={ "initial", 0x62A, 0x645 },
unicodeslot=0xFCA4,
},
[0xFCA5]={
@@ -124774,7 +127904,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH HEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x062A, 0x0647 },
+ specials={ "initial", 0x62A, 0x647 },
unicodeslot=0xFCA5,
},
[0xFCA6]={
@@ -124782,7 +127912,7 @@ characters.data={
description="ARABIC LIGATURE THEH WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x062B, 0x0645 },
+ specials={ "initial", 0x62B, 0x645 },
unicodeslot=0xFCA6,
},
[0xFCA7]={
@@ -124790,7 +127920,7 @@ characters.data={
description="ARABIC LIGATURE JEEM WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x062C, 0x062D },
+ specials={ "initial", 0x62C, 0x62D },
unicodeslot=0xFCA7,
},
[0xFCA8]={
@@ -124798,7 +127928,7 @@ characters.data={
description="ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x062C, 0x0645 },
+ specials={ "initial", 0x62C, 0x645 },
unicodeslot=0xFCA8,
},
[0xFCA9]={
@@ -124806,7 +127936,7 @@ characters.data={
description="ARABIC LIGATURE HAH WITH JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x062D, 0x062C },
+ specials={ "initial", 0x62D, 0x62C },
unicodeslot=0xFCA9,
},
[0xFCAA]={
@@ -124814,7 +127944,7 @@ characters.data={
description="ARABIC LIGATURE HAH WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x062D, 0x0645 },
+ specials={ "initial", 0x62D, 0x645 },
unicodeslot=0xFCAA,
},
[0xFCAB]={
@@ -124822,7 +127952,7 @@ characters.data={
description="ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x062E, 0x062C },
+ specials={ "initial", 0x62E, 0x62C },
unicodeslot=0xFCAB,
},
[0xFCAC]={
@@ -124830,7 +127960,7 @@ characters.data={
description="ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x062E, 0x0645 },
+ specials={ "initial", 0x62E, 0x645 },
unicodeslot=0xFCAC,
},
[0xFCAD]={
@@ -124838,7 +127968,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0633, 0x062C },
+ specials={ "initial", 0x633, 0x62C },
unicodeslot=0xFCAD,
},
[0xFCAE]={
@@ -124846,7 +127976,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0633, 0x062D },
+ specials={ "initial", 0x633, 0x62D },
unicodeslot=0xFCAE,
},
[0xFCAF]={
@@ -124854,7 +127984,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0633, 0x062E },
+ specials={ "initial", 0x633, 0x62E },
unicodeslot=0xFCAF,
},
[0xFCB0]={
@@ -124862,7 +127992,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0633, 0x0645 },
+ specials={ "initial", 0x633, 0x645 },
unicodeslot=0xFCB0,
},
[0xFCB1]={
@@ -124870,7 +128000,7 @@ characters.data={
description="ARABIC LIGATURE SAD WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0635, 0x062D },
+ specials={ "initial", 0x635, 0x62D },
unicodeslot=0xFCB1,
},
[0xFCB2]={
@@ -124878,7 +128008,7 @@ characters.data={
description="ARABIC LIGATURE SAD WITH KHAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0635, 0x062E },
+ specials={ "initial", 0x635, 0x62E },
unicodeslot=0xFCB2,
},
[0xFCB3]={
@@ -124886,7 +128016,7 @@ characters.data={
description="ARABIC LIGATURE SAD WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0635, 0x0645 },
+ specials={ "initial", 0x635, 0x645 },
unicodeslot=0xFCB3,
},
[0xFCB4]={
@@ -124894,7 +128024,7 @@ characters.data={
description="ARABIC LIGATURE DAD WITH JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0636, 0x062C },
+ specials={ "initial", 0x636, 0x62C },
unicodeslot=0xFCB4,
},
[0xFCB5]={
@@ -124902,7 +128032,7 @@ characters.data={
description="ARABIC LIGATURE DAD WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0636, 0x062D },
+ specials={ "initial", 0x636, 0x62D },
unicodeslot=0xFCB5,
},
[0xFCB6]={
@@ -124910,7 +128040,7 @@ characters.data={
description="ARABIC LIGATURE DAD WITH KHAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0636, 0x062E },
+ specials={ "initial", 0x636, 0x62E },
unicodeslot=0xFCB6,
},
[0xFCB7]={
@@ -124918,7 +128048,7 @@ characters.data={
description="ARABIC LIGATURE DAD WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0636, 0x0645 },
+ specials={ "initial", 0x636, 0x645 },
unicodeslot=0xFCB7,
},
[0xFCB8]={
@@ -124926,7 +128056,7 @@ characters.data={
description="ARABIC LIGATURE TAH WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0637, 0x062D },
+ specials={ "initial", 0x637, 0x62D },
unicodeslot=0xFCB8,
},
[0xFCB9]={
@@ -124934,7 +128064,7 @@ characters.data={
description="ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0638, 0x0645 },
+ specials={ "initial", 0x638, 0x645 },
unicodeslot=0xFCB9,
},
[0xFCBA]={
@@ -124942,7 +128072,7 @@ characters.data={
description="ARABIC LIGATURE AIN WITH JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0639, 0x062C },
+ specials={ "initial", 0x639, 0x62C },
unicodeslot=0xFCBA,
},
[0xFCBB]={
@@ -124950,7 +128080,7 @@ characters.data={
description="ARABIC LIGATURE AIN WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0639, 0x0645 },
+ specials={ "initial", 0x639, 0x645 },
unicodeslot=0xFCBB,
},
[0xFCBC]={
@@ -124958,7 +128088,7 @@ characters.data={
description="ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x063A, 0x062C },
+ specials={ "initial", 0x63A, 0x62C },
unicodeslot=0xFCBC,
},
[0xFCBD]={
@@ -124966,7 +128096,7 @@ characters.data={
description="ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x063A, 0x0645 },
+ specials={ "initial", 0x63A, 0x645 },
unicodeslot=0xFCBD,
},
[0xFCBE]={
@@ -124974,7 +128104,7 @@ characters.data={
description="ARABIC LIGATURE FEH WITH JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0641, 0x062C },
+ specials={ "initial", 0x641, 0x62C },
unicodeslot=0xFCBE,
},
[0xFCBF]={
@@ -124982,7 +128112,7 @@ characters.data={
description="ARABIC LIGATURE FEH WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0641, 0x062D },
+ specials={ "initial", 0x641, 0x62D },
unicodeslot=0xFCBF,
},
[0xFCC0]={
@@ -124990,7 +128120,7 @@ characters.data={
description="ARABIC LIGATURE FEH WITH KHAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0641, 0x062E },
+ specials={ "initial", 0x641, 0x62E },
unicodeslot=0xFCC0,
},
[0xFCC1]={
@@ -124998,7 +128128,7 @@ characters.data={
description="ARABIC LIGATURE FEH WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0641, 0x0645 },
+ specials={ "initial", 0x641, 0x645 },
unicodeslot=0xFCC1,
},
[0xFCC2]={
@@ -125006,7 +128136,7 @@ characters.data={
description="ARABIC LIGATURE QAF WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0642, 0x062D },
+ specials={ "initial", 0x642, 0x62D },
unicodeslot=0xFCC2,
},
[0xFCC3]={
@@ -125014,7 +128144,7 @@ characters.data={
description="ARABIC LIGATURE QAF WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0642, 0x0645 },
+ specials={ "initial", 0x642, 0x645 },
unicodeslot=0xFCC3,
},
[0xFCC4]={
@@ -125022,7 +128152,7 @@ characters.data={
description="ARABIC LIGATURE KAF WITH JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0643, 0x062C },
+ specials={ "initial", 0x643, 0x62C },
unicodeslot=0xFCC4,
},
[0xFCC5]={
@@ -125030,7 +128160,7 @@ characters.data={
description="ARABIC LIGATURE KAF WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0643, 0x062D },
+ specials={ "initial", 0x643, 0x62D },
unicodeslot=0xFCC5,
},
[0xFCC6]={
@@ -125038,7 +128168,7 @@ characters.data={
description="ARABIC LIGATURE KAF WITH KHAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0643, 0x062E },
+ specials={ "initial", 0x643, 0x62E },
unicodeslot=0xFCC6,
},
[0xFCC7]={
@@ -125046,7 +128176,7 @@ characters.data={
description="ARABIC LIGATURE KAF WITH LAM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0643, 0x0644 },
+ specials={ "initial", 0x643, 0x644 },
unicodeslot=0xFCC7,
},
[0xFCC8]={
@@ -125054,7 +128184,7 @@ characters.data={
description="ARABIC LIGATURE KAF WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0643, 0x0645 },
+ specials={ "initial", 0x643, 0x645 },
unicodeslot=0xFCC8,
},
[0xFCC9]={
@@ -125063,7 +128193,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0644, 0x062C },
+ specials={ "initial", 0x644, 0x62C },
unicodeslot=0xFCC9,
},
[0xFCCA]={
@@ -125072,7 +128202,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0644, 0x062D },
+ specials={ "initial", 0x644, 0x62D },
unicodeslot=0xFCCA,
},
[0xFCCB]={
@@ -125081,7 +128211,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH KHAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0644, 0x062E },
+ specials={ "initial", 0x644, 0x62E },
unicodeslot=0xFCCB,
},
[0xFCCC]={
@@ -125090,7 +128220,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0644, 0x0645 },
+ specials={ "initial", 0x644, 0x645 },
unicodeslot=0xFCCC,
},
[0xFCCD]={
@@ -125098,7 +128228,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH HEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0644, 0x0647 },
+ specials={ "initial", 0x644, 0x647 },
unicodeslot=0xFCCD,
},
[0xFCCE]={
@@ -125106,7 +128236,7 @@ characters.data={
description="ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0645, 0x062C },
+ specials={ "initial", 0x645, 0x62C },
unicodeslot=0xFCCE,
},
[0xFCCF]={
@@ -125114,7 +128244,7 @@ characters.data={
description="ARABIC LIGATURE MEEM WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0645, 0x062D },
+ specials={ "initial", 0x645, 0x62D },
unicodeslot=0xFCCF,
},
[0xFCD0]={
@@ -125122,7 +128252,7 @@ characters.data={
description="ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0645, 0x062E },
+ specials={ "initial", 0x645, 0x62E },
unicodeslot=0xFCD0,
},
[0xFCD1]={
@@ -125131,7 +128261,7 @@ characters.data={
description="ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0645, 0x0645 },
+ specials={ "initial", 0x645, 0x645 },
unicodeslot=0xFCD1,
},
[0xFCD2]={
@@ -125140,7 +128270,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0646, 0x062C },
+ specials={ "initial", 0x646, 0x62C },
unicodeslot=0xFCD2,
},
[0xFCD3]={
@@ -125148,7 +128278,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0646, 0x062D },
+ specials={ "initial", 0x646, 0x62D },
unicodeslot=0xFCD3,
},
[0xFCD4]={
@@ -125156,7 +128286,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH KHAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0646, 0x062E },
+ specials={ "initial", 0x646, 0x62E },
unicodeslot=0xFCD4,
},
[0xFCD5]={
@@ -125165,7 +128295,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0646, 0x0645 },
+ specials={ "initial", 0x646, 0x645 },
unicodeslot=0xFCD5,
},
[0xFCD6]={
@@ -125173,7 +128303,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH HEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0646, 0x0647 },
+ specials={ "initial", 0x646, 0x647 },
unicodeslot=0xFCD6,
},
[0xFCD7]={
@@ -125181,7 +128311,7 @@ characters.data={
description="ARABIC LIGATURE HEH WITH JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0647, 0x062C },
+ specials={ "initial", 0x647, 0x62C },
unicodeslot=0xFCD7,
},
[0xFCD8]={
@@ -125189,7 +128319,7 @@ characters.data={
description="ARABIC LIGATURE HEH WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0647, 0x0645 },
+ specials={ "initial", 0x647, 0x645 },
unicodeslot=0xFCD8,
},
[0xFCD9]={
@@ -125197,7 +128327,7 @@ characters.data={
description="ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0647, 0x0670 },
+ specials={ "initial", 0x647, 0x670 },
unicodeslot=0xFCD9,
},
[0xFCDA]={
@@ -125205,7 +128335,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x064A, 0x062C },
+ specials={ "initial", 0x64A, 0x62C },
unicodeslot=0xFCDA,
},
[0xFCDB]={
@@ -125213,7 +128343,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x064A, 0x062D },
+ specials={ "initial", 0x64A, 0x62D },
unicodeslot=0xFCDB,
},
[0xFCDC]={
@@ -125221,7 +128351,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH KHAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x064A, 0x062E },
+ specials={ "initial", 0x64A, 0x62E },
unicodeslot=0xFCDC,
},
[0xFCDD]={
@@ -125230,7 +128360,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x064A, 0x0645 },
+ specials={ "initial", 0x64A, 0x645 },
unicodeslot=0xFCDD,
},
[0xFCDE]={
@@ -125238,7 +128368,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x064A, 0x0647 },
+ specials={ "initial", 0x64A, 0x647 },
unicodeslot=0xFCDE,
},
[0xFCDF]={
@@ -125246,7 +128376,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0626, 0x0645 },
+ specials={ "medial", 0x626, 0x645 },
unicodeslot=0xFCDF,
},
[0xFCE0]={
@@ -125254,7 +128384,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0626, 0x0647 },
+ specials={ "medial", 0x626, 0x647 },
unicodeslot=0xFCE0,
},
[0xFCE1]={
@@ -125262,7 +128392,7 @@ characters.data={
description="ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0628, 0x0645 },
+ specials={ "medial", 0x628, 0x645 },
unicodeslot=0xFCE1,
},
[0xFCE2]={
@@ -125270,7 +128400,7 @@ characters.data={
description="ARABIC LIGATURE BEH WITH HEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0628, 0x0647 },
+ specials={ "medial", 0x628, 0x647 },
unicodeslot=0xFCE2,
},
[0xFCE3]={
@@ -125278,7 +128408,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x062A, 0x0645 },
+ specials={ "medial", 0x62A, 0x645 },
unicodeslot=0xFCE3,
},
[0xFCE4]={
@@ -125286,7 +128416,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH HEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x062A, 0x0647 },
+ specials={ "medial", 0x62A, 0x647 },
unicodeslot=0xFCE4,
},
[0xFCE5]={
@@ -125294,7 +128424,7 @@ characters.data={
description="ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x062B, 0x0645 },
+ specials={ "medial", 0x62B, 0x645 },
unicodeslot=0xFCE5,
},
[0xFCE6]={
@@ -125302,7 +128432,7 @@ characters.data={
description="ARABIC LIGATURE THEH WITH HEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x062B, 0x0647 },
+ specials={ "medial", 0x62B, 0x647 },
unicodeslot=0xFCE6,
},
[0xFCE7]={
@@ -125310,7 +128440,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0633, 0x0645 },
+ specials={ "medial", 0x633, 0x645 },
unicodeslot=0xFCE7,
},
[0xFCE8]={
@@ -125318,7 +128448,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0633, 0x0647 },
+ specials={ "medial", 0x633, 0x647 },
unicodeslot=0xFCE8,
},
[0xFCE9]={
@@ -125326,7 +128456,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0634, 0x0645 },
+ specials={ "medial", 0x634, 0x645 },
unicodeslot=0xFCE9,
},
[0xFCEA]={
@@ -125334,7 +128464,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0634, 0x0647 },
+ specials={ "medial", 0x634, 0x647 },
unicodeslot=0xFCEA,
},
[0xFCEB]={
@@ -125342,7 +128472,7 @@ characters.data={
description="ARABIC LIGATURE KAF WITH LAM MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0643, 0x0644 },
+ specials={ "medial", 0x643, 0x644 },
unicodeslot=0xFCEB,
},
[0xFCEC]={
@@ -125350,7 +128480,7 @@ characters.data={
description="ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0643, 0x0645 },
+ specials={ "medial", 0x643, 0x645 },
unicodeslot=0xFCEC,
},
[0xFCED]={
@@ -125358,7 +128488,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0644, 0x0645 },
+ specials={ "medial", 0x644, 0x645 },
unicodeslot=0xFCED,
},
[0xFCEE]={
@@ -125366,7 +128496,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0646, 0x0645 },
+ specials={ "medial", 0x646, 0x645 },
unicodeslot=0xFCEE,
},
[0xFCEF]={
@@ -125374,7 +128504,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH HEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0646, 0x0647 },
+ specials={ "medial", 0x646, 0x647 },
unicodeslot=0xFCEF,
},
[0xFCF0]={
@@ -125382,7 +128512,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x064A, 0x0645 },
+ specials={ "medial", 0x64A, 0x645 },
unicodeslot=0xFCF0,
},
[0xFCF1]={
@@ -125390,7 +128520,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x064A, 0x0647 },
+ specials={ "medial", 0x64A, 0x647 },
unicodeslot=0xFCF1,
},
[0xFCF2]={
@@ -125398,7 +128528,7 @@ characters.data={
description="ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0640, 0x064E, 0x0651 },
+ specials={ "medial", 0x640, 0x64E, 0x651 },
unicodeslot=0xFCF2,
},
[0xFCF3]={
@@ -125406,7 +128536,7 @@ characters.data={
description="ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0640, 0x064F, 0x0651 },
+ specials={ "medial", 0x640, 0x64F, 0x651 },
unicodeslot=0xFCF3,
},
[0xFCF4]={
@@ -125414,7 +128544,7 @@ characters.data={
description="ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0640, 0x0650, 0x0651 },
+ specials={ "medial", 0x640, 0x650, 0x651 },
unicodeslot=0xFCF4,
},
[0xFCF5]={
@@ -125422,7 +128552,7 @@ characters.data={
description="ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0637, 0x0649 },
+ specials={ "isolated", 0x637, 0x649 },
unicodeslot=0xFCF5,
},
[0xFCF6]={
@@ -125430,7 +128560,7 @@ characters.data={
description="ARABIC LIGATURE TAH WITH YEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0637, 0x064A },
+ specials={ "isolated", 0x637, 0x64A },
unicodeslot=0xFCF6,
},
[0xFCF7]={
@@ -125438,7 +128568,7 @@ characters.data={
description="ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0639, 0x0649 },
+ specials={ "isolated", 0x639, 0x649 },
unicodeslot=0xFCF7,
},
[0xFCF8]={
@@ -125446,7 +128576,7 @@ characters.data={
description="ARABIC LIGATURE AIN WITH YEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0639, 0x064A },
+ specials={ "isolated", 0x639, 0x64A },
unicodeslot=0xFCF8,
},
[0xFCF9]={
@@ -125454,7 +128584,7 @@ characters.data={
description="ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x063A, 0x0649 },
+ specials={ "isolated", 0x63A, 0x649 },
unicodeslot=0xFCF9,
},
[0xFCFA]={
@@ -125462,7 +128592,7 @@ characters.data={
description="ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x063A, 0x064A },
+ specials={ "isolated", 0x63A, 0x64A },
unicodeslot=0xFCFA,
},
[0xFCFB]={
@@ -125470,7 +128600,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0633, 0x0649 },
+ specials={ "isolated", 0x633, 0x649 },
unicodeslot=0xFCFB,
},
[0xFCFC]={
@@ -125478,7 +128608,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0633, 0x064A },
+ specials={ "isolated", 0x633, 0x64A },
unicodeslot=0xFCFC,
},
[0xFCFD]={
@@ -125486,7 +128616,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0634, 0x0649 },
+ specials={ "isolated", 0x634, 0x649 },
unicodeslot=0xFCFD,
},
[0xFCFE]={
@@ -125494,7 +128624,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0634, 0x064A },
+ specials={ "isolated", 0x634, 0x64A },
unicodeslot=0xFCFE,
},
[0xFCFF]={
@@ -125502,7 +128632,7 @@ characters.data={
description="ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062D, 0x0649 },
+ specials={ "isolated", 0x62D, 0x649 },
unicodeslot=0xFCFF,
},
[0xFD00]={
@@ -125510,7 +128640,7 @@ characters.data={
description="ARABIC LIGATURE HAH WITH YEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062D, 0x064A },
+ specials={ "isolated", 0x62D, 0x64A },
unicodeslot=0xFD00,
},
[0xFD01]={
@@ -125518,7 +128648,7 @@ characters.data={
description="ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062C, 0x0649 },
+ specials={ "isolated", 0x62C, 0x649 },
unicodeslot=0xFD01,
},
[0xFD02]={
@@ -125526,7 +128656,7 @@ characters.data={
description="ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062C, 0x064A },
+ specials={ "isolated", 0x62C, 0x64A },
unicodeslot=0xFD02,
},
[0xFD03]={
@@ -125534,7 +128664,7 @@ characters.data={
description="ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062E, 0x0649 },
+ specials={ "isolated", 0x62E, 0x649 },
unicodeslot=0xFD03,
},
[0xFD04]={
@@ -125542,7 +128672,7 @@ characters.data={
description="ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062E, 0x064A },
+ specials={ "isolated", 0x62E, 0x64A },
unicodeslot=0xFD04,
},
[0xFD05]={
@@ -125550,7 +128680,7 @@ characters.data={
description="ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0635, 0x0649 },
+ specials={ "isolated", 0x635, 0x649 },
unicodeslot=0xFD05,
},
[0xFD06]={
@@ -125558,7 +128688,7 @@ characters.data={
description="ARABIC LIGATURE SAD WITH YEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0635, 0x064A },
+ specials={ "isolated", 0x635, 0x64A },
unicodeslot=0xFD06,
},
[0xFD07]={
@@ -125566,7 +128696,7 @@ characters.data={
description="ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0636, 0x0649 },
+ specials={ "isolated", 0x636, 0x649 },
unicodeslot=0xFD07,
},
[0xFD08]={
@@ -125574,7 +128704,7 @@ characters.data={
description="ARABIC LIGATURE DAD WITH YEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0636, 0x064A },
+ specials={ "isolated", 0x636, 0x64A },
unicodeslot=0xFD08,
},
[0xFD09]={
@@ -125582,7 +128712,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0634, 0x062C },
+ specials={ "isolated", 0x634, 0x62C },
unicodeslot=0xFD09,
},
[0xFD0A]={
@@ -125590,7 +128720,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0634, 0x062D },
+ specials={ "isolated", 0x634, 0x62D },
unicodeslot=0xFD0A,
},
[0xFD0B]={
@@ -125598,7 +128728,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0634, 0x062E },
+ specials={ "isolated", 0x634, 0x62E },
unicodeslot=0xFD0B,
},
[0xFD0C]={
@@ -125606,7 +128736,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0634, 0x0645 },
+ specials={ "isolated", 0x634, 0x645 },
unicodeslot=0xFD0C,
},
[0xFD0D]={
@@ -125614,7 +128744,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0634, 0x0631 },
+ specials={ "isolated", 0x634, 0x631 },
unicodeslot=0xFD0D,
},
[0xFD0E]={
@@ -125622,7 +128752,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH REH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0633, 0x0631 },
+ specials={ "isolated", 0x633, 0x631 },
unicodeslot=0xFD0E,
},
[0xFD0F]={
@@ -125630,7 +128760,7 @@ characters.data={
description="ARABIC LIGATURE SAD WITH REH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0635, 0x0631 },
+ specials={ "isolated", 0x635, 0x631 },
unicodeslot=0xFD0F,
},
[0xFD10]={
@@ -125638,7 +128768,7 @@ characters.data={
description="ARABIC LIGATURE DAD WITH REH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0636, 0x0631 },
+ specials={ "isolated", 0x636, 0x631 },
unicodeslot=0xFD10,
},
[0xFD11]={
@@ -125646,7 +128776,7 @@ characters.data={
description="ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0637, 0x0649 },
+ specials={ "final", 0x637, 0x649 },
unicodeslot=0xFD11,
},
[0xFD12]={
@@ -125654,7 +128784,7 @@ characters.data={
description="ARABIC LIGATURE TAH WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0637, 0x064A },
+ specials={ "final", 0x637, 0x64A },
unicodeslot=0xFD12,
},
[0xFD13]={
@@ -125662,7 +128792,7 @@ characters.data={
description="ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0639, 0x0649 },
+ specials={ "final", 0x639, 0x649 },
unicodeslot=0xFD13,
},
[0xFD14]={
@@ -125670,7 +128800,7 @@ characters.data={
description="ARABIC LIGATURE AIN WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0639, 0x064A },
+ specials={ "final", 0x639, 0x64A },
unicodeslot=0xFD14,
},
[0xFD15]={
@@ -125678,7 +128808,7 @@ characters.data={
description="ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x063A, 0x0649 },
+ specials={ "final", 0x63A, 0x649 },
unicodeslot=0xFD15,
},
[0xFD16]={
@@ -125686,7 +128816,7 @@ characters.data={
description="ARABIC LIGATURE GHAIN WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x063A, 0x064A },
+ specials={ "final", 0x63A, 0x64A },
unicodeslot=0xFD16,
},
[0xFD17]={
@@ -125694,7 +128824,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0633, 0x0649 },
+ specials={ "final", 0x633, 0x649 },
unicodeslot=0xFD17,
},
[0xFD18]={
@@ -125702,7 +128832,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0633, 0x064A },
+ specials={ "final", 0x633, 0x64A },
unicodeslot=0xFD18,
},
[0xFD19]={
@@ -125710,7 +128840,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0634, 0x0649 },
+ specials={ "final", 0x634, 0x649 },
unicodeslot=0xFD19,
},
[0xFD1A]={
@@ -125718,7 +128848,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0634, 0x064A },
+ specials={ "final", 0x634, 0x64A },
unicodeslot=0xFD1A,
},
[0xFD1B]={
@@ -125726,7 +128856,7 @@ characters.data={
description="ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062D, 0x0649 },
+ specials={ "final", 0x62D, 0x649 },
unicodeslot=0xFD1B,
},
[0xFD1C]={
@@ -125734,7 +128864,7 @@ characters.data={
description="ARABIC LIGATURE HAH WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062D, 0x064A },
+ specials={ "final", 0x62D, 0x64A },
unicodeslot=0xFD1C,
},
[0xFD1D]={
@@ -125742,7 +128872,7 @@ characters.data={
description="ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062C, 0x0649 },
+ specials={ "final", 0x62C, 0x649 },
unicodeslot=0xFD1D,
},
[0xFD1E]={
@@ -125750,7 +128880,7 @@ characters.data={
description="ARABIC LIGATURE JEEM WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062C, 0x064A },
+ specials={ "final", 0x62C, 0x64A },
unicodeslot=0xFD1E,
},
[0xFD1F]={
@@ -125758,7 +128888,7 @@ characters.data={
description="ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062E, 0x0649 },
+ specials={ "final", 0x62E, 0x649 },
unicodeslot=0xFD1F,
},
[0xFD20]={
@@ -125766,7 +128896,7 @@ characters.data={
description="ARABIC LIGATURE KHAH WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062E, 0x064A },
+ specials={ "final", 0x62E, 0x64A },
unicodeslot=0xFD20,
},
[0xFD21]={
@@ -125774,7 +128904,7 @@ characters.data={
description="ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0635, 0x0649 },
+ specials={ "final", 0x635, 0x649 },
unicodeslot=0xFD21,
},
[0xFD22]={
@@ -125782,7 +128912,7 @@ characters.data={
description="ARABIC LIGATURE SAD WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0635, 0x064A },
+ specials={ "final", 0x635, 0x64A },
unicodeslot=0xFD22,
},
[0xFD23]={
@@ -125790,7 +128920,7 @@ characters.data={
description="ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0636, 0x0649 },
+ specials={ "final", 0x636, 0x649 },
unicodeslot=0xFD23,
},
[0xFD24]={
@@ -125798,7 +128928,7 @@ characters.data={
description="ARABIC LIGATURE DAD WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0636, 0x064A },
+ specials={ "final", 0x636, 0x64A },
unicodeslot=0xFD24,
},
[0xFD25]={
@@ -125806,7 +128936,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0634, 0x062C },
+ specials={ "final", 0x634, 0x62C },
unicodeslot=0xFD25,
},
[0xFD26]={
@@ -125814,7 +128944,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH HAH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0634, 0x062D },
+ specials={ "final", 0x634, 0x62D },
unicodeslot=0xFD26,
},
[0xFD27]={
@@ -125822,7 +128952,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0634, 0x062E },
+ specials={ "final", 0x634, 0x62E },
unicodeslot=0xFD27,
},
[0xFD28]={
@@ -125830,7 +128960,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0634, 0x0645 },
+ specials={ "final", 0x634, 0x645 },
unicodeslot=0xFD28,
},
[0xFD29]={
@@ -125838,7 +128968,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH REH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0634, 0x0631 },
+ specials={ "final", 0x634, 0x631 },
unicodeslot=0xFD29,
},
[0xFD2A]={
@@ -125846,7 +128976,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH REH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0633, 0x0631 },
+ specials={ "final", 0x633, 0x631 },
unicodeslot=0xFD2A,
},
[0xFD2B]={
@@ -125854,7 +128984,7 @@ characters.data={
description="ARABIC LIGATURE SAD WITH REH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0635, 0x0631 },
+ specials={ "final", 0x635, 0x631 },
unicodeslot=0xFD2B,
},
[0xFD2C]={
@@ -125862,7 +128992,7 @@ characters.data={
description="ARABIC LIGATURE DAD WITH REH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0636, 0x0631 },
+ specials={ "final", 0x636, 0x631 },
unicodeslot=0xFD2C,
},
[0xFD2D]={
@@ -125870,7 +129000,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0634, 0x062C },
+ specials={ "initial", 0x634, 0x62C },
unicodeslot=0xFD2D,
},
[0xFD2E]={
@@ -125878,7 +129008,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0634, 0x062D },
+ specials={ "initial", 0x634, 0x62D },
unicodeslot=0xFD2E,
},
[0xFD2F]={
@@ -125886,7 +129016,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0634, 0x062E },
+ specials={ "initial", 0x634, 0x62E },
unicodeslot=0xFD2F,
},
[0xFD30]={
@@ -125894,7 +129024,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0634, 0x0645 },
+ specials={ "initial", 0x634, 0x645 },
unicodeslot=0xFD30,
},
[0xFD31]={
@@ -125902,7 +129032,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH HEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0633, 0x0647 },
+ specials={ "initial", 0x633, 0x647 },
unicodeslot=0xFD31,
},
[0xFD32]={
@@ -125910,7 +129040,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0634, 0x0647 },
+ specials={ "initial", 0x634, 0x647 },
unicodeslot=0xFD32,
},
[0xFD33]={
@@ -125918,7 +129048,7 @@ characters.data={
description="ARABIC LIGATURE TAH WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0637, 0x0645 },
+ specials={ "initial", 0x637, 0x645 },
unicodeslot=0xFD33,
},
[0xFD34]={
@@ -125926,7 +129056,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0633, 0x062C },
+ specials={ "medial", 0x633, 0x62C },
unicodeslot=0xFD34,
},
[0xFD35]={
@@ -125934,7 +129064,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0633, 0x062D },
+ specials={ "medial", 0x633, 0x62D },
unicodeslot=0xFD35,
},
[0xFD36]={
@@ -125942,7 +129072,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0633, 0x062E },
+ specials={ "medial", 0x633, 0x62E },
unicodeslot=0xFD36,
},
[0xFD37]={
@@ -125950,7 +129080,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0634, 0x062C },
+ specials={ "medial", 0x634, 0x62C },
unicodeslot=0xFD37,
},
[0xFD38]={
@@ -125958,7 +129088,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0634, 0x062D },
+ specials={ "medial", 0x634, 0x62D },
unicodeslot=0xFD38,
},
[0xFD39]={
@@ -125966,7 +129096,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0634, 0x062E },
+ specials={ "medial", 0x634, 0x62E },
unicodeslot=0xFD39,
},
[0xFD3A]={
@@ -125974,7 +129104,7 @@ characters.data={
description="ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0637, 0x0645 },
+ specials={ "medial", 0x637, 0x645 },
unicodeslot=0xFD3A,
},
[0xFD3B]={
@@ -125982,7 +129112,7 @@ characters.data={
description="ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0638, 0x0645 },
+ specials={ "medial", 0x638, 0x645 },
unicodeslot=0xFD3B,
},
[0xFD3C]={
@@ -125990,7 +129120,7 @@ characters.data={
description="ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0627, 0x064B },
+ specials={ "final", 0x627, 0x64B },
unicodeslot=0xFD3C,
},
[0xFD3D]={
@@ -125998,7 +129128,7 @@ characters.data={
description="ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0627, 0x064B },
+ specials={ "isolated", 0x627, 0x64B },
unicodeslot=0xFD3D,
},
[0xFD3E]={
@@ -126006,7 +129136,7 @@ characters.data={
category="ps",
description="ORNATE LEFT PARENTHESIS",
direction="on",
- linebreak="op",
+ linebreak="cl",
unicodeslot=0xFD3E,
},
[0xFD3F]={
@@ -126014,7 +129144,7 @@ characters.data={
category="pe",
description="ORNATE RIGHT PARENTHESIS",
direction="on",
- linebreak="cl",
+ linebreak="op",
unicodeslot=0xFD3F,
},
[0xFD50]={
@@ -126022,7 +129152,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x062A, 0x062C, 0x0645 },
+ specials={ "initial", 0x62A, 0x62C, 0x645 },
unicodeslot=0xFD50,
},
[0xFD51]={
@@ -126030,7 +129160,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062A, 0x062D, 0x062C },
+ specials={ "final", 0x62A, 0x62D, 0x62C },
unicodeslot=0xFD51,
},
[0xFD52]={
@@ -126038,7 +129168,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x062A, 0x062D, 0x062C },
+ specials={ "initial", 0x62A, 0x62D, 0x62C },
unicodeslot=0xFD52,
},
[0xFD53]={
@@ -126046,7 +129176,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x062A, 0x062D, 0x0645 },
+ specials={ "initial", 0x62A, 0x62D, 0x645 },
unicodeslot=0xFD53,
},
[0xFD54]={
@@ -126054,7 +129184,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x062A, 0x062E, 0x0645 },
+ specials={ "initial", 0x62A, 0x62E, 0x645 },
unicodeslot=0xFD54,
},
[0xFD55]={
@@ -126062,7 +129192,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x062A, 0x0645, 0x062C },
+ specials={ "initial", 0x62A, 0x645, 0x62C },
unicodeslot=0xFD55,
},
[0xFD56]={
@@ -126070,7 +129200,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x062A, 0x0645, 0x062D },
+ specials={ "initial", 0x62A, 0x645, 0x62D },
unicodeslot=0xFD56,
},
[0xFD57]={
@@ -126078,7 +129208,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x062A, 0x0645, 0x062E },
+ specials={ "initial", 0x62A, 0x645, 0x62E },
unicodeslot=0xFD57,
},
[0xFD58]={
@@ -126086,7 +129216,7 @@ characters.data={
description="ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062C, 0x0645, 0x062D },
+ specials={ "final", 0x62C, 0x645, 0x62D },
unicodeslot=0xFD58,
},
[0xFD59]={
@@ -126094,7 +129224,7 @@ characters.data={
description="ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x062C, 0x0645, 0x062D },
+ specials={ "initial", 0x62C, 0x645, 0x62D },
unicodeslot=0xFD59,
},
[0xFD5A]={
@@ -126102,7 +129232,7 @@ characters.data={
description="ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062D, 0x0645, 0x064A },
+ specials={ "final", 0x62D, 0x645, 0x64A },
unicodeslot=0xFD5A,
},
[0xFD5B]={
@@ -126110,7 +129240,7 @@ characters.data={
description="ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062D, 0x0645, 0x0649 },
+ specials={ "final", 0x62D, 0x645, 0x649 },
unicodeslot=0xFD5B,
},
[0xFD5C]={
@@ -126118,7 +129248,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0633, 0x062D, 0x062C },
+ specials={ "initial", 0x633, 0x62D, 0x62C },
unicodeslot=0xFD5C,
},
[0xFD5D]={
@@ -126126,7 +129256,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0633, 0x062C, 0x062D },
+ specials={ "initial", 0x633, 0x62C, 0x62D },
unicodeslot=0xFD5D,
},
[0xFD5E]={
@@ -126134,7 +129264,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0633, 0x062C, 0x0649 },
+ specials={ "final", 0x633, 0x62C, 0x649 },
unicodeslot=0xFD5E,
},
[0xFD5F]={
@@ -126142,7 +129272,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0633, 0x0645, 0x062D },
+ specials={ "final", 0x633, 0x645, 0x62D },
unicodeslot=0xFD5F,
},
[0xFD60]={
@@ -126150,7 +129280,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0633, 0x0645, 0x062D },
+ specials={ "initial", 0x633, 0x645, 0x62D },
unicodeslot=0xFD60,
},
[0xFD61]={
@@ -126158,7 +129288,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0633, 0x0645, 0x062C },
+ specials={ "initial", 0x633, 0x645, 0x62C },
unicodeslot=0xFD61,
},
[0xFD62]={
@@ -126166,7 +129296,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0633, 0x0645, 0x0645 },
+ specials={ "final", 0x633, 0x645, 0x645 },
unicodeslot=0xFD62,
},
[0xFD63]={
@@ -126174,7 +129304,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0633, 0x0645, 0x0645 },
+ specials={ "initial", 0x633, 0x645, 0x645 },
unicodeslot=0xFD63,
},
[0xFD64]={
@@ -126182,7 +129312,7 @@ characters.data={
description="ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0635, 0x062D, 0x062D },
+ specials={ "final", 0x635, 0x62D, 0x62D },
unicodeslot=0xFD64,
},
[0xFD65]={
@@ -126190,7 +129320,7 @@ characters.data={
description="ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0635, 0x062D, 0x062D },
+ specials={ "initial", 0x635, 0x62D, 0x62D },
unicodeslot=0xFD65,
},
[0xFD66]={
@@ -126198,7 +129328,7 @@ characters.data={
description="ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0635, 0x0645, 0x0645 },
+ specials={ "final", 0x635, 0x645, 0x645 },
unicodeslot=0xFD66,
},
[0xFD67]={
@@ -126206,7 +129336,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0634, 0x062D, 0x0645 },
+ specials={ "final", 0x634, 0x62D, 0x645 },
unicodeslot=0xFD67,
},
[0xFD68]={
@@ -126214,7 +129344,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0634, 0x062D, 0x0645 },
+ specials={ "initial", 0x634, 0x62D, 0x645 },
unicodeslot=0xFD68,
},
[0xFD69]={
@@ -126222,7 +129352,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0634, 0x062C, 0x064A },
+ specials={ "final", 0x634, 0x62C, 0x64A },
unicodeslot=0xFD69,
},
[0xFD6A]={
@@ -126230,7 +129360,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0634, 0x0645, 0x062E },
+ specials={ "final", 0x634, 0x645, 0x62E },
unicodeslot=0xFD6A,
},
[0xFD6B]={
@@ -126238,7 +129368,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0634, 0x0645, 0x062E },
+ specials={ "initial", 0x634, 0x645, 0x62E },
unicodeslot=0xFD6B,
},
[0xFD6C]={
@@ -126246,7 +129376,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0634, 0x0645, 0x0645 },
+ specials={ "final", 0x634, 0x645, 0x645 },
unicodeslot=0xFD6C,
},
[0xFD6D]={
@@ -126254,7 +129384,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0634, 0x0645, 0x0645 },
+ specials={ "initial", 0x634, 0x645, 0x645 },
unicodeslot=0xFD6D,
},
[0xFD6E]={
@@ -126262,7 +129392,7 @@ characters.data={
description="ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0636, 0x062D, 0x0649 },
+ specials={ "final", 0x636, 0x62D, 0x649 },
unicodeslot=0xFD6E,
},
[0xFD6F]={
@@ -126270,7 +129400,7 @@ characters.data={
description="ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0636, 0x062E, 0x0645 },
+ specials={ "final", 0x636, 0x62E, 0x645 },
unicodeslot=0xFD6F,
},
[0xFD70]={
@@ -126278,7 +129408,7 @@ characters.data={
description="ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0636, 0x062E, 0x0645 },
+ specials={ "initial", 0x636, 0x62E, 0x645 },
unicodeslot=0xFD70,
},
[0xFD71]={
@@ -126286,7 +129416,7 @@ characters.data={
description="ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0637, 0x0645, 0x062D },
+ specials={ "final", 0x637, 0x645, 0x62D },
unicodeslot=0xFD71,
},
[0xFD72]={
@@ -126294,7 +129424,7 @@ characters.data={
description="ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0637, 0x0645, 0x062D },
+ specials={ "initial", 0x637, 0x645, 0x62D },
unicodeslot=0xFD72,
},
[0xFD73]={
@@ -126302,7 +129432,7 @@ characters.data={
description="ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0637, 0x0645, 0x0645 },
+ specials={ "initial", 0x637, 0x645, 0x645 },
unicodeslot=0xFD73,
},
[0xFD74]={
@@ -126310,7 +129440,7 @@ characters.data={
description="ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0637, 0x0645, 0x064A },
+ specials={ "final", 0x637, 0x645, 0x64A },
unicodeslot=0xFD74,
},
[0xFD75]={
@@ -126318,7 +129448,7 @@ characters.data={
description="ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0639, 0x062C, 0x0645 },
+ specials={ "final", 0x639, 0x62C, 0x645 },
unicodeslot=0xFD75,
},
[0xFD76]={
@@ -126326,7 +129456,7 @@ characters.data={
description="ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0639, 0x0645, 0x0645 },
+ specials={ "final", 0x639, 0x645, 0x645 },
unicodeslot=0xFD76,
},
[0xFD77]={
@@ -126334,7 +129464,7 @@ characters.data={
description="ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0639, 0x0645, 0x0645 },
+ specials={ "initial", 0x639, 0x645, 0x645 },
unicodeslot=0xFD77,
},
[0xFD78]={
@@ -126342,7 +129472,7 @@ characters.data={
description="ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0639, 0x0645, 0x0649 },
+ specials={ "final", 0x639, 0x645, 0x649 },
unicodeslot=0xFD78,
},
[0xFD79]={
@@ -126350,7 +129480,7 @@ characters.data={
description="ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x063A, 0x0645, 0x0645 },
+ specials={ "final", 0x63A, 0x645, 0x645 },
unicodeslot=0xFD79,
},
[0xFD7A]={
@@ -126358,7 +129488,7 @@ characters.data={
description="ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x063A, 0x0645, 0x064A },
+ specials={ "final", 0x63A, 0x645, 0x64A },
unicodeslot=0xFD7A,
},
[0xFD7B]={
@@ -126366,7 +129496,7 @@ characters.data={
description="ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x063A, 0x0645, 0x0649 },
+ specials={ "final", 0x63A, 0x645, 0x649 },
unicodeslot=0xFD7B,
},
[0xFD7C]={
@@ -126374,7 +129504,7 @@ characters.data={
description="ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0641, 0x062E, 0x0645 },
+ specials={ "final", 0x641, 0x62E, 0x645 },
unicodeslot=0xFD7C,
},
[0xFD7D]={
@@ -126382,7 +129512,7 @@ characters.data={
description="ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0641, 0x062E, 0x0645 },
+ specials={ "initial", 0x641, 0x62E, 0x645 },
unicodeslot=0xFD7D,
},
[0xFD7E]={
@@ -126390,7 +129520,7 @@ characters.data={
description="ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0642, 0x0645, 0x062D },
+ specials={ "final", 0x642, 0x645, 0x62D },
unicodeslot=0xFD7E,
},
[0xFD7F]={
@@ -126398,7 +129528,7 @@ characters.data={
description="ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0642, 0x0645, 0x0645 },
+ specials={ "final", 0x642, 0x645, 0x645 },
unicodeslot=0xFD7F,
},
[0xFD80]={
@@ -126406,7 +129536,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0644, 0x062D, 0x0645 },
+ specials={ "final", 0x644, 0x62D, 0x645 },
unicodeslot=0xFD80,
},
[0xFD81]={
@@ -126414,7 +129544,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0644, 0x062D, 0x064A },
+ specials={ "final", 0x644, 0x62D, 0x64A },
unicodeslot=0xFD81,
},
[0xFD82]={
@@ -126422,7 +129552,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0644, 0x062D, 0x0649 },
+ specials={ "final", 0x644, 0x62D, 0x649 },
unicodeslot=0xFD82,
},
[0xFD83]={
@@ -126430,7 +129560,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0644, 0x062C, 0x062C },
+ specials={ "initial", 0x644, 0x62C, 0x62C },
unicodeslot=0xFD83,
},
[0xFD84]={
@@ -126438,7 +129568,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0644, 0x062C, 0x062C },
+ specials={ "final", 0x644, 0x62C, 0x62C },
unicodeslot=0xFD84,
},
[0xFD85]={
@@ -126446,7 +129576,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0644, 0x062E, 0x0645 },
+ specials={ "final", 0x644, 0x62E, 0x645 },
unicodeslot=0xFD85,
},
[0xFD86]={
@@ -126454,7 +129584,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0644, 0x062E, 0x0645 },
+ specials={ "initial", 0x644, 0x62E, 0x645 },
unicodeslot=0xFD86,
},
[0xFD87]={
@@ -126462,7 +129592,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0644, 0x0645, 0x062D },
+ specials={ "final", 0x644, 0x645, 0x62D },
unicodeslot=0xFD87,
},
[0xFD88]={
@@ -126471,7 +129601,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0644, 0x0645, 0x062D },
+ specials={ "initial", 0x644, 0x645, 0x62D },
unicodeslot=0xFD88,
},
[0xFD89]={
@@ -126479,7 +129609,7 @@ characters.data={
description="ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0645, 0x062D, 0x062C },
+ specials={ "initial", 0x645, 0x62D, 0x62C },
unicodeslot=0xFD89,
},
[0xFD8A]={
@@ -126487,7 +129617,7 @@ characters.data={
description="ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0645, 0x062D, 0x0645 },
+ specials={ "initial", 0x645, 0x62D, 0x645 },
unicodeslot=0xFD8A,
},
[0xFD8B]={
@@ -126495,7 +129625,7 @@ characters.data={
description="ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0645, 0x062D, 0x064A },
+ specials={ "final", 0x645, 0x62D, 0x64A },
unicodeslot=0xFD8B,
},
[0xFD8C]={
@@ -126503,7 +129633,7 @@ characters.data={
description="ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0645, 0x062C, 0x062D },
+ specials={ "initial", 0x645, 0x62C, 0x62D },
unicodeslot=0xFD8C,
},
[0xFD8D]={
@@ -126511,7 +129641,7 @@ characters.data={
description="ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0645, 0x062C, 0x0645 },
+ specials={ "initial", 0x645, 0x62C, 0x645 },
unicodeslot=0xFD8D,
},
[0xFD8E]={
@@ -126519,7 +129649,7 @@ characters.data={
description="ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0645, 0x062E, 0x062C },
+ specials={ "initial", 0x645, 0x62E, 0x62C },
unicodeslot=0xFD8E,
},
[0xFD8F]={
@@ -126527,7 +129657,7 @@ characters.data={
description="ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0645, 0x062E, 0x0645 },
+ specials={ "initial", 0x645, 0x62E, 0x645 },
unicodeslot=0xFD8F,
},
[0xFD92]={
@@ -126535,7 +129665,7 @@ characters.data={
description="ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0645, 0x062C, 0x062E },
+ specials={ "initial", 0x645, 0x62C, 0x62E },
unicodeslot=0xFD92,
},
[0xFD93]={
@@ -126543,7 +129673,7 @@ characters.data={
description="ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0647, 0x0645, 0x062C },
+ specials={ "initial", 0x647, 0x645, 0x62C },
unicodeslot=0xFD93,
},
[0xFD94]={
@@ -126551,7 +129681,7 @@ characters.data={
description="ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0647, 0x0645, 0x0645 },
+ specials={ "initial", 0x647, 0x645, 0x645 },
unicodeslot=0xFD94,
},
[0xFD95]={
@@ -126559,7 +129689,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0646, 0x062D, 0x0645 },
+ specials={ "initial", 0x646, 0x62D, 0x645 },
unicodeslot=0xFD95,
},
[0xFD96]={
@@ -126567,7 +129697,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0646, 0x062D, 0x0649 },
+ specials={ "final", 0x646, 0x62D, 0x649 },
unicodeslot=0xFD96,
},
[0xFD97]={
@@ -126575,7 +129705,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0646, 0x062C, 0x0645 },
+ specials={ "final", 0x646, 0x62C, 0x645 },
unicodeslot=0xFD97,
},
[0xFD98]={
@@ -126583,7 +129713,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0646, 0x062C, 0x0645 },
+ specials={ "initial", 0x646, 0x62C, 0x645 },
unicodeslot=0xFD98,
},
[0xFD99]={
@@ -126591,7 +129721,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0646, 0x062C, 0x0649 },
+ specials={ "final", 0x646, 0x62C, 0x649 },
unicodeslot=0xFD99,
},
[0xFD9A]={
@@ -126599,7 +129729,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0646, 0x0645, 0x064A },
+ specials={ "final", 0x646, 0x645, 0x64A },
unicodeslot=0xFD9A,
},
[0xFD9B]={
@@ -126607,7 +129737,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0646, 0x0645, 0x0649 },
+ specials={ "final", 0x646, 0x645, 0x649 },
unicodeslot=0xFD9B,
},
[0xFD9C]={
@@ -126615,7 +129745,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x064A, 0x0645, 0x0645 },
+ specials={ "final", 0x64A, 0x645, 0x645 },
unicodeslot=0xFD9C,
},
[0xFD9D]={
@@ -126623,7 +129753,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x064A, 0x0645, 0x0645 },
+ specials={ "initial", 0x64A, 0x645, 0x645 },
unicodeslot=0xFD9D,
},
[0xFD9E]={
@@ -126631,7 +129761,7 @@ characters.data={
description="ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0628, 0x062E, 0x064A },
+ specials={ "final", 0x628, 0x62E, 0x64A },
unicodeslot=0xFD9E,
},
[0xFD9F]={
@@ -126639,7 +129769,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062A, 0x062C, 0x064A },
+ specials={ "final", 0x62A, 0x62C, 0x64A },
unicodeslot=0xFD9F,
},
[0xFDA0]={
@@ -126647,7 +129777,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062A, 0x062C, 0x0649 },
+ specials={ "final", 0x62A, 0x62C, 0x649 },
unicodeslot=0xFDA0,
},
[0xFDA1]={
@@ -126655,7 +129785,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062A, 0x062E, 0x064A },
+ specials={ "final", 0x62A, 0x62E, 0x64A },
unicodeslot=0xFDA1,
},
[0xFDA2]={
@@ -126663,7 +129793,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062A, 0x062E, 0x0649 },
+ specials={ "final", 0x62A, 0x62E, 0x649 },
unicodeslot=0xFDA2,
},
[0xFDA3]={
@@ -126671,7 +129801,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062A, 0x0645, 0x064A },
+ specials={ "final", 0x62A, 0x645, 0x64A },
unicodeslot=0xFDA3,
},
[0xFDA4]={
@@ -126679,7 +129809,7 @@ characters.data={
description="ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062A, 0x0645, 0x0649 },
+ specials={ "final", 0x62A, 0x645, 0x649 },
unicodeslot=0xFDA4,
},
[0xFDA5]={
@@ -126687,7 +129817,7 @@ characters.data={
description="ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062C, 0x0645, 0x064A },
+ specials={ "final", 0x62C, 0x645, 0x64A },
unicodeslot=0xFDA5,
},
[0xFDA6]={
@@ -126695,7 +129825,7 @@ characters.data={
description="ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062C, 0x062D, 0x0649 },
+ specials={ "final", 0x62C, 0x62D, 0x649 },
unicodeslot=0xFDA6,
},
[0xFDA7]={
@@ -126703,7 +129833,7 @@ characters.data={
description="ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062C, 0x0645, 0x0649 },
+ specials={ "final", 0x62C, 0x645, 0x649 },
unicodeslot=0xFDA7,
},
[0xFDA8]={
@@ -126711,7 +129841,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0633, 0x062E, 0x0649 },
+ specials={ "final", 0x633, 0x62E, 0x649 },
unicodeslot=0xFDA8,
},
[0xFDA9]={
@@ -126719,7 +129849,7 @@ characters.data={
description="ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0635, 0x062D, 0x064A },
+ specials={ "final", 0x635, 0x62D, 0x64A },
unicodeslot=0xFDA9,
},
[0xFDAA]={
@@ -126727,7 +129857,7 @@ characters.data={
description="ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0634, 0x062D, 0x064A },
+ specials={ "final", 0x634, 0x62D, 0x64A },
unicodeslot=0xFDAA,
},
[0xFDAB]={
@@ -126735,7 +129865,7 @@ characters.data={
description="ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0636, 0x062D, 0x064A },
+ specials={ "final", 0x636, 0x62D, 0x64A },
unicodeslot=0xFDAB,
},
[0xFDAC]={
@@ -126743,7 +129873,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0644, 0x062C, 0x064A },
+ specials={ "final", 0x644, 0x62C, 0x64A },
unicodeslot=0xFDAC,
},
[0xFDAD]={
@@ -126751,7 +129881,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0644, 0x0645, 0x064A },
+ specials={ "final", 0x644, 0x645, 0x64A },
unicodeslot=0xFDAD,
},
[0xFDAE]={
@@ -126759,7 +129889,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x064A, 0x062D, 0x064A },
+ specials={ "final", 0x64A, 0x62D, 0x64A },
unicodeslot=0xFDAE,
},
[0xFDAF]={
@@ -126767,7 +129897,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x064A, 0x062C, 0x064A },
+ specials={ "final", 0x64A, 0x62C, 0x64A },
unicodeslot=0xFDAF,
},
[0xFDB0]={
@@ -126775,7 +129905,7 @@ characters.data={
description="ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x064A, 0x0645, 0x064A },
+ specials={ "final", 0x64A, 0x645, 0x64A },
unicodeslot=0xFDB0,
},
[0xFDB1]={
@@ -126783,7 +129913,7 @@ characters.data={
description="ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0645, 0x0645, 0x064A },
+ specials={ "final", 0x645, 0x645, 0x64A },
unicodeslot=0xFDB1,
},
[0xFDB2]={
@@ -126791,7 +129921,7 @@ characters.data={
description="ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0642, 0x0645, 0x064A },
+ specials={ "final", 0x642, 0x645, 0x64A },
unicodeslot=0xFDB2,
},
[0xFDB3]={
@@ -126799,7 +129929,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0646, 0x062D, 0x064A },
+ specials={ "final", 0x646, 0x62D, 0x64A },
unicodeslot=0xFDB3,
},
[0xFDB4]={
@@ -126807,7 +129937,7 @@ characters.data={
description="ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0642, 0x0645, 0x062D },
+ specials={ "initial", 0x642, 0x645, 0x62D },
unicodeslot=0xFDB4,
},
[0xFDB5]={
@@ -126815,7 +129945,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0644, 0x062D, 0x0645 },
+ specials={ "initial", 0x644, 0x62D, 0x645 },
unicodeslot=0xFDB5,
},
[0xFDB6]={
@@ -126823,7 +129953,7 @@ characters.data={
description="ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0639, 0x0645, 0x064A },
+ specials={ "final", 0x639, 0x645, 0x64A },
unicodeslot=0xFDB6,
},
[0xFDB7]={
@@ -126831,7 +129961,7 @@ characters.data={
description="ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0643, 0x0645, 0x064A },
+ specials={ "final", 0x643, 0x645, 0x64A },
unicodeslot=0xFDB7,
},
[0xFDB8]={
@@ -126839,7 +129969,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0646, 0x062C, 0x062D },
+ specials={ "initial", 0x646, 0x62C, 0x62D },
unicodeslot=0xFDB8,
},
[0xFDB9]={
@@ -126847,7 +129977,7 @@ characters.data={
description="ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0645, 0x062E, 0x064A },
+ specials={ "final", 0x645, 0x62E, 0x64A },
unicodeslot=0xFDB9,
},
[0xFDBA]={
@@ -126855,7 +129985,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0644, 0x062C, 0x0645 },
+ specials={ "initial", 0x644, 0x62C, 0x645 },
unicodeslot=0xFDBA,
},
[0xFDBB]={
@@ -126863,7 +129993,7 @@ characters.data={
description="ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0643, 0x0645, 0x0645 },
+ specials={ "final", 0x643, 0x645, 0x645 },
unicodeslot=0xFDBB,
},
[0xFDBC]={
@@ -126871,7 +130001,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0644, 0x062C, 0x0645 },
+ specials={ "final", 0x644, 0x62C, 0x645 },
unicodeslot=0xFDBC,
},
[0xFDBD]={
@@ -126879,7 +130009,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0646, 0x062C, 0x062D },
+ specials={ "final", 0x646, 0x62C, 0x62D },
unicodeslot=0xFDBD,
},
[0xFDBE]={
@@ -126887,7 +130017,7 @@ characters.data={
description="ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062C, 0x062D, 0x064A },
+ specials={ "final", 0x62C, 0x62D, 0x64A },
unicodeslot=0xFDBE,
},
[0xFDBF]={
@@ -126895,7 +130025,7 @@ characters.data={
description="ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062D, 0x062C, 0x064A },
+ specials={ "final", 0x62D, 0x62C, 0x64A },
unicodeslot=0xFDBF,
},
[0xFDC0]={
@@ -126903,7 +130033,7 @@ characters.data={
description="ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0645, 0x062C, 0x064A },
+ specials={ "final", 0x645, 0x62C, 0x64A },
unicodeslot=0xFDC0,
},
[0xFDC1]={
@@ -126911,7 +130041,7 @@ characters.data={
description="ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0641, 0x0645, 0x064A },
+ specials={ "final", 0x641, 0x645, 0x64A },
unicodeslot=0xFDC1,
},
[0xFDC2]={
@@ -126919,7 +130049,7 @@ characters.data={
description="ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0628, 0x062D, 0x064A },
+ specials={ "final", 0x628, 0x62D, 0x64A },
unicodeslot=0xFDC2,
},
[0xFDC3]={
@@ -126927,7 +130057,7 @@ characters.data={
description="ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0643, 0x0645, 0x0645 },
+ specials={ "initial", 0x643, 0x645, 0x645 },
unicodeslot=0xFDC3,
},
[0xFDC4]={
@@ -126935,7 +130065,7 @@ characters.data={
description="ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0639, 0x062C, 0x0645 },
+ specials={ "initial", 0x639, 0x62C, 0x645 },
unicodeslot=0xFDC4,
},
[0xFDC5]={
@@ -126943,7 +130073,7 @@ characters.data={
description="ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0635, 0x0645, 0x0645 },
+ specials={ "initial", 0x635, 0x645, 0x645 },
unicodeslot=0xFDC5,
},
[0xFDC6]={
@@ -126951,7 +130081,7 @@ characters.data={
description="ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0633, 0x062E, 0x064A },
+ specials={ "final", 0x633, 0x62E, 0x64A },
unicodeslot=0xFDC6,
},
[0xFDC7]={
@@ -126959,7 +130089,7 @@ characters.data={
description="ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0646, 0x062C, 0x064A },
+ specials={ "final", 0x646, 0x62C, 0x64A },
unicodeslot=0xFDC7,
},
[0xFDF0]={
@@ -126967,7 +130097,7 @@ characters.data={
description="ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0635, 0x0644, 0x06D2 },
+ specials={ "isolated", 0x635, 0x644, 0x6D2 },
unicodeslot=0xFDF0,
},
[0xFDF1]={
@@ -126975,7 +130105,7 @@ characters.data={
description="ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0642, 0x0644, 0x06D2 },
+ specials={ "isolated", 0x642, 0x644, 0x6D2 },
unicodeslot=0xFDF1,
},
[0xFDF2]={
@@ -126984,7 +130114,7 @@ characters.data={
description="ARABIC LIGATURE ALLAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0627, 0x0644, 0x0644, 0x0647 },
+ specials={ "isolated", 0x627, 0x644, 0x644, 0x647 },
unicodeslot=0xFDF2,
},
[0xFDF3]={
@@ -126992,7 +130122,7 @@ characters.data={
description="ARABIC LIGATURE AKBAR ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0627, 0x0643, 0x0628, 0x0631 },
+ specials={ "isolated", 0x627, 0x643, 0x628, 0x631 },
unicodeslot=0xFDF3,
},
[0xFDF4]={
@@ -127000,7 +130130,7 @@ characters.data={
description="ARABIC LIGATURE MOHAMMAD ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0645, 0x062D, 0x0645, 0x062F },
+ specials={ "isolated", 0x645, 0x62D, 0x645, 0x62F },
unicodeslot=0xFDF4,
},
[0xFDF5]={
@@ -127008,7 +130138,7 @@ characters.data={
description="ARABIC LIGATURE SALAM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0635, 0x0644, 0x0639, 0x0645 },
+ specials={ "isolated", 0x635, 0x644, 0x639, 0x645 },
unicodeslot=0xFDF5,
},
[0xFDF6]={
@@ -127016,7 +130146,7 @@ characters.data={
description="ARABIC LIGATURE RASOUL ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0631, 0x0633, 0x0648, 0x0644 },
+ specials={ "isolated", 0x631, 0x633, 0x648, 0x644 },
unicodeslot=0xFDF6,
},
[0xFDF7]={
@@ -127024,7 +130154,7 @@ characters.data={
description="ARABIC LIGATURE ALAYHE ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0639, 0x0644, 0x064A, 0x0647 },
+ specials={ "isolated", 0x639, 0x644, 0x64A, 0x647 },
unicodeslot=0xFDF7,
},
[0xFDF8]={
@@ -127032,7 +130162,7 @@ characters.data={
description="ARABIC LIGATURE WASALLAM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0648, 0x0633, 0x0644, 0x0645 },
+ specials={ "isolated", 0x648, 0x633, 0x644, 0x645 },
unicodeslot=0xFDF8,
},
[0xFDF9]={
@@ -127040,7 +130170,7 @@ characters.data={
description="ARABIC LIGATURE SALLA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0635, 0x0644, 0x0649 },
+ specials={ "isolated", 0x635, 0x644, 0x649 },
unicodeslot=0xFDF9,
},
[0xFDFA]={
@@ -127049,7 +130179,7 @@ characters.data={
description="ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0635, 0x0644, 0x0649, 0x0020, 0x0627, 0x0644, 0x0644, 0x0647, 0x0020, 0x0639, 0x0644, 0x064A, 0x0647, 0x0020, 0x0648, 0x0633, 0x0644, 0x0645 },
+ specials={ "isolated", 0x635, 0x644, 0x649, 0x20, 0x627, 0x644, 0x644, 0x647, 0x20, 0x639, 0x644, 0x64A, 0x647, 0x20, 0x648, 0x633, 0x644, 0x645 },
unicodeslot=0xFDFA,
},
[0xFDFB]={
@@ -127057,7 +130187,7 @@ characters.data={
description="ARABIC LIGATURE JALLAJALALOUHOU",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062C, 0x0644, 0x0020, 0x062C, 0x0644, 0x0627, 0x0644, 0x0647 },
+ specials={ "isolated", 0x62C, 0x644, 0x20, 0x62C, 0x644, 0x627, 0x644, 0x647 },
unicodeslot=0xFDFB,
},
[0xFDFC]={
@@ -127065,7 +130195,7 @@ characters.data={
description="RIAL SIGN",
direction="al",
linebreak="po",
- specials={ "isolated", 0x0631, 0x06CC, 0x0627, 0x0644 },
+ specials={ "isolated", 0x631, 0x6CC, 0x627, 0x644 },
unicodeslot=0xFDFC,
},
[0xFDFD]={
@@ -127209,7 +130339,7 @@ characters.data={
description="PRESENTATION FORM FOR VERTICAL COMMA",
direction="on",
linebreak="is",
- specials={ "vertical", 0x002C },
+ specials={ "vertical", 0x2C },
unicodeslot=0xFE10,
},
[0xFE11]={
@@ -127236,7 +130366,7 @@ characters.data={
description="PRESENTATION FORM FOR VERTICAL COLON",
direction="on",
linebreak="is",
- specials={ "vertical", 0x003A },
+ specials={ "vertical", 0x3A },
unicodeslot=0xFE13,
},
[0xFE14]={
@@ -127245,7 +130375,7 @@ characters.data={
description="PRESENTATION FORM FOR VERTICAL SEMICOLON",
direction="on",
linebreak="is",
- specials={ "vertical", 0x003B },
+ specials={ "vertical", 0x3B },
unicodeslot=0xFE14,
},
[0xFE15]={
@@ -127254,7 +130384,7 @@ characters.data={
description="PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK",
direction="on",
linebreak="ex",
- specials={ "vertical", 0x0021 },
+ specials={ "vertical", 0x21 },
unicodeslot=0xFE15,
},
[0xFE16]={
@@ -127263,7 +130393,7 @@ characters.data={
description="PRESENTATION FORM FOR VERTICAL QUESTION MARK",
direction="on",
linebreak="ex",
- specials={ "vertical", 0x003F },
+ specials={ "vertical", 0x3F },
unicodeslot=0xFE16,
},
[0xFE17]={
@@ -127296,6 +130426,7 @@ characters.data={
},
[0xFE20]={
category="mn",
+ combining=0xE6,
description="COMBINING LIGATURE LEFT HALF",
direction="nsm",
linebreak="cm",
@@ -127303,6 +130434,7 @@ characters.data={
},
[0xFE21]={
category="mn",
+ combining=0xE6,
description="COMBINING LIGATURE RIGHT HALF",
direction="nsm",
linebreak="cm",
@@ -127310,6 +130442,7 @@ characters.data={
},
[0xFE22]={
category="mn",
+ combining=0xE6,
description="COMBINING DOUBLE TILDE LEFT HALF",
direction="nsm",
linebreak="cm",
@@ -127317,6 +130450,7 @@ characters.data={
},
[0xFE23]={
category="mn",
+ combining=0xE6,
description="COMBINING DOUBLE TILDE RIGHT HALF",
direction="nsm",
linebreak="cm",
@@ -127324,6 +130458,7 @@ characters.data={
},
[0xFE24]={
category="mn",
+ combining=0xE6,
description="COMBINING MACRON LEFT HALF",
direction="nsm",
linebreak="cm",
@@ -127331,6 +130466,7 @@ characters.data={
},
[0xFE25]={
category="mn",
+ combining=0xE6,
description="COMBINING MACRON RIGHT HALF",
direction="nsm",
linebreak="cm",
@@ -127338,11 +130474,68 @@ characters.data={
},
[0xFE26]={
category="mn",
+ combining=0xE6,
description="COMBINING CONJOINING MACRON",
direction="nsm",
linebreak="cm",
unicodeslot=0xFE26,
},
+ [0xFE27]={
+ category="mn",
+ combining=0xDC,
+ description="COMBINING LIGATURE LEFT HALF BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE27,
+ },
+ [0xFE28]={
+ category="mn",
+ combining=0xDC,
+ description="COMBINING LIGATURE RIGHT HALF BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE28,
+ },
+ [0xFE29]={
+ category="mn",
+ combining=0xDC,
+ description="COMBINING TILDE LEFT HALF BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE29,
+ },
+ [0xFE2A]={
+ category="mn",
+ combining=0xDC,
+ description="COMBINING TILDE RIGHT HALF BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE2A,
+ },
+ [0xFE2B]={
+ category="mn",
+ combining=0xDC,
+ description="COMBINING MACRON LEFT HALF BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE2B,
+ },
+ [0xFE2C]={
+ category="mn",
+ combining=0xDC,
+ description="COMBINING MACRON RIGHT HALF BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE2C,
+ },
+ [0xFE2D]={
+ category="mn",
+ combining=0xDC,
+ description="COMBINING CONJOINING MACRON BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE2D,
+ },
[0xFE30]={
adobename="twodotleadervertical",
category="po",
@@ -127380,7 +130573,7 @@ characters.data={
description="PRESENTATION FORM FOR VERTICAL LOW LINE",
direction="on",
linebreak="id",
- specials={ "vertical", 0x005F },
+ specials={ "vertical", 0x5F },
unicodeslot=0xFE33,
},
[0xFE34]={
@@ -127390,7 +130583,7 @@ characters.data={
description="PRESENTATION FORM FOR VERTICAL WAVY LOW LINE",
direction="on",
linebreak="id",
- specials={ "vertical", 0x005F },
+ specials={ "vertical", 0x5F },
unicodeslot=0xFE34,
},
[0xFE35]={
@@ -127400,7 +130593,7 @@ characters.data={
description="PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS",
direction="on",
linebreak="op",
- specials={ "vertical", 0x0028 },
+ specials={ "vertical", 0x28 },
unicodeslot=0xFE35,
},
[0xFE36]={
@@ -127410,7 +130603,7 @@ characters.data={
description="PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS",
direction="on",
linebreak="cl",
- specials={ "vertical", 0x0029 },
+ specials={ "vertical", 0x29 },
unicodeslot=0xFE36,
},
[0xFE37]={
@@ -127422,7 +130615,7 @@ characters.data={
direction="on",
linebreak="op",
mathfiller="downbracefill",
- specials={ "vertical", 0x007B },
+ specials={ "vertical", 0x7B },
unicodeslot=0xFE37,
},
[0xFE38]={
@@ -127434,7 +130627,7 @@ characters.data={
direction="on",
linebreak="cl",
mathfiller="upbracefill",
- specials={ "vertical", 0x007D },
+ specials={ "vertical", 0x7D },
unicodeslot=0xFE38,
},
[0xFE39]={
@@ -127579,7 +130772,7 @@ characters.data={
description="PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET",
direction="on",
linebreak="op",
- specials={ "vertical", 0x005B },
+ specials={ "vertical", 0x5B },
unicodeslot=0xFE47,
},
[0xFE48]={
@@ -127588,7 +130781,7 @@ characters.data={
description="PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET",
direction="on",
linebreak="cl",
- specials={ "vertical", 0x005D },
+ specials={ "vertical", 0x5D },
unicodeslot=0xFE48,
},
[0xFE49]={
@@ -127638,7 +130831,7 @@ characters.data={
description="DASHED LOW LINE",
direction="on",
linebreak="id",
- specials={ "compat", 0x005F },
+ specials={ "compat", 0x5F },
unicodeslot=0xFE4D,
},
[0xFE4E]={
@@ -127648,7 +130841,7 @@ characters.data={
description="CENTRELINE LOW LINE",
direction="on",
linebreak="id",
- specials={ "compat", 0x005F },
+ specials={ "compat", 0x5F },
unicodeslot=0xFE4E,
},
[0xFE4F]={
@@ -127658,7 +130851,7 @@ characters.data={
description="WAVY LOW LINE",
direction="on",
linebreak="id",
- specials={ "compat", 0x005F },
+ specials={ "compat", 0x5F },
unicodeslot=0xFE4F,
},
[0xFE50]={
@@ -127668,7 +130861,7 @@ characters.data={
description="SMALL COMMA",
direction="cs",
linebreak="cl",
- specials={ "small", 0x002C },
+ specials={ "small", 0x2C },
unicodeslot=0xFE50,
},
[0xFE51]={
@@ -127687,7 +130880,7 @@ characters.data={
description="SMALL FULL STOP",
direction="cs",
linebreak="cl",
- specials={ "small", 0x002E },
+ specials={ "small", 0x2E },
unicodeslot=0xFE52,
},
[0xFE54]={
@@ -127697,7 +130890,7 @@ characters.data={
description="SMALL SEMICOLON",
direction="on",
linebreak="ns",
- specials={ "small", 0x003B },
+ specials={ "small", 0x3B },
unicodeslot=0xFE54,
},
[0xFE55]={
@@ -127707,7 +130900,7 @@ characters.data={
description="SMALL COLON",
direction="cs",
linebreak="ns",
- specials={ "small", 0x003A },
+ specials={ "small", 0x3A },
unicodeslot=0xFE55,
},
[0xFE56]={
@@ -127716,7 +130909,7 @@ characters.data={
description="SMALL QUESTION MARK",
direction="on",
linebreak="ex",
- specials={ "small", 0x003F },
+ specials={ "small", 0x3F },
unicodeslot=0xFE56,
},
[0xFE57]={
@@ -127725,7 +130918,7 @@ characters.data={
description="SMALL EXCLAMATION MARK",
direction="on",
linebreak="ex",
- specials={ "small", 0x0021 },
+ specials={ "small", 0x21 },
unicodeslot=0xFE57,
},
[0xFE58]={
@@ -127745,8 +130938,8 @@ characters.data={
direction="on",
linebreak="op",
mirror=0xFE5A,
+ specials={ "small", 0x28 },
textclass="open",
- specials={ "small", 0x0028 },
unicodeslot=0xFE59,
},
[0xFE5A]={
@@ -127757,8 +130950,8 @@ characters.data={
direction="on",
linebreak="cl",
mirror=0xFE59,
+ specials={ "small", 0x29 },
textclass="close",
- specials={ "small", 0x0029 },
unicodeslot=0xFE5A,
},
[0xFE5B]={
@@ -127769,8 +130962,8 @@ characters.data={
direction="on",
linebreak="op",
mirror=0xFE5C,
+ specials={ "small", 0x7B },
textclass="open",
- specials={ "small", 0x007B },
unicodeslot=0xFE5B,
},
[0xFE5C]={
@@ -127781,8 +130974,8 @@ characters.data={
direction="on",
linebreak="cl",
mirror=0xFE5B,
+ specials={ "small", 0x7D },
textclass="close",
- specials={ "small", 0x007D },
unicodeslot=0xFE5C,
},
[0xFE5D]={
@@ -127793,8 +130986,8 @@ characters.data={
direction="on",
linebreak="op",
mirror=0xFE5E,
- textclass="open",
specials={ "small", 0x3014 },
+ textclass="open",
unicodeslot=0xFE5D,
},
[0xFE5E]={
@@ -127805,8 +130998,8 @@ characters.data={
direction="on",
linebreak="cl",
mirror=0xFE5D,
- textclass="close",
specials={ "small", 0x3015 },
+ textclass="close",
unicodeslot=0xFE5E,
},
[0xFE5F]={
@@ -127816,7 +131009,7 @@ characters.data={
description="SMALL NUMBER SIGN",
direction="et",
linebreak="id",
- specials={ "small", 0x0023 },
+ specials={ "small", 0x23 },
unicodeslot=0xFE5F,
},
[0xFE60]={
@@ -127825,7 +131018,7 @@ characters.data={
description="SMALL AMPERSAND",
direction="on",
linebreak="id",
- specials={ "small", 0x0026 },
+ specials={ "small", 0x26 },
unicodeslot=0xFE60,
},
[0xFE61]={
@@ -127835,7 +131028,7 @@ characters.data={
description="SMALL ASTERISK",
direction="on",
linebreak="id",
- specials={ "small", 0x002A },
+ specials={ "small", 0x2A },
unicodeslot=0xFE61,
},
[0xFE62]={
@@ -127845,7 +131038,7 @@ characters.data={
description="SMALL PLUS SIGN",
direction="es",
linebreak="id",
- specials={ "small", 0x002B },
+ specials={ "small", 0x2B },
unicodeslot=0xFE62,
},
[0xFE63]={
@@ -127855,7 +131048,7 @@ characters.data={
description="SMALL HYPHEN-MINUS",
direction="es",
linebreak="id",
- specials={ "small", 0x002D },
+ specials={ "small", 0x2D },
unicodeslot=0xFE63,
},
[0xFE64]={
@@ -127866,8 +131059,8 @@ characters.data={
direction="on",
linebreak="id",
mirror=0xFE65,
+ specials={ "small", 0x3C },
textclass="open",
- specials={ "small", 0x003C },
unicodeslot=0xFE64,
},
[0xFE65]={
@@ -127878,8 +131071,8 @@ characters.data={
direction="on",
linebreak="id",
mirror=0xFE64,
+ specials={ "small", 0x3E },
textclass="close",
- specials={ "small", 0x003E },
unicodeslot=0xFE65,
},
[0xFE66]={
@@ -127889,7 +131082,7 @@ characters.data={
description="SMALL EQUALS SIGN",
direction="on",
linebreak="id",
- specials={ "small", 0x003D },
+ specials={ "small", 0x3D },
unicodeslot=0xFE66,
},
[0xFE68]={
@@ -127898,7 +131091,7 @@ characters.data={
description="SMALL REVERSE SOLIDUS",
direction="on",
linebreak="id",
- specials={ "small", 0x005C },
+ specials={ "small", 0x5C },
unicodeslot=0xFE68,
},
[0xFE69]={
@@ -127908,7 +131101,7 @@ characters.data={
description="SMALL DOLLAR SIGN",
direction="et",
linebreak="pr",
- specials={ "small", 0x0024 },
+ specials={ "small", 0x24 },
unicodeslot=0xFE69,
},
[0xFE6A]={
@@ -127918,7 +131111,7 @@ characters.data={
description="SMALL PERCENT SIGN",
direction="et",
linebreak="po",
- specials={ "small", 0x0025 },
+ specials={ "small", 0x25 },
unicodeslot=0xFE6A,
},
[0xFE6B]={
@@ -127928,7 +131121,7 @@ characters.data={
description="SMALL COMMERCIAL AT",
direction="on",
linebreak="id",
- specials={ "small", 0x0040 },
+ specials={ "small", 0x40 },
unicodeslot=0xFE6B,
},
[0xFE70]={
@@ -127936,7 +131129,7 @@ characters.data={
description="ARABIC FATHATAN ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0020, 0x064B },
+ specials={ "isolated", 0x20, 0x64B },
unicodeslot=0xFE70,
},
[0xFE71]={
@@ -127944,7 +131137,7 @@ characters.data={
description="ARABIC TATWEEL WITH FATHATAN ABOVE",
direction="al",
linebreak="al",
- specials={ "medial", 0x0640, 0x064B },
+ specials={ "medial", 0x640, 0x64B },
unicodeslot=0xFE71,
},
[0xFE72]={
@@ -127952,7 +131145,7 @@ characters.data={
description="ARABIC DAMMATAN ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0020, 0x064C },
+ specials={ "isolated", 0x20, 0x64C },
unicodeslot=0xFE72,
},
[0xFE73]={
@@ -127967,7 +131160,7 @@ characters.data={
description="ARABIC KASRATAN ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0020, 0x064D },
+ specials={ "isolated", 0x20, 0x64D },
unicodeslot=0xFE74,
},
[0xFE76]={
@@ -127975,7 +131168,7 @@ characters.data={
description="ARABIC FATHA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0020, 0x064E },
+ specials={ "isolated", 0x20, 0x64E },
unicodeslot=0xFE76,
},
[0xFE77]={
@@ -127983,7 +131176,7 @@ characters.data={
description="ARABIC FATHA MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0640, 0x064E },
+ specials={ "medial", 0x640, 0x64E },
unicodeslot=0xFE77,
},
[0xFE78]={
@@ -127991,7 +131184,7 @@ characters.data={
description="ARABIC DAMMA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0020, 0x064F },
+ specials={ "isolated", 0x20, 0x64F },
unicodeslot=0xFE78,
},
[0xFE79]={
@@ -127999,7 +131192,7 @@ characters.data={
description="ARABIC DAMMA MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0640, 0x064F },
+ specials={ "medial", 0x640, 0x64F },
unicodeslot=0xFE79,
},
[0xFE7A]={
@@ -128007,7 +131200,7 @@ characters.data={
description="ARABIC KASRA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0020, 0x0650 },
+ specials={ "isolated", 0x20, 0x650 },
unicodeslot=0xFE7A,
},
[0xFE7B]={
@@ -128015,7 +131208,7 @@ characters.data={
description="ARABIC KASRA MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0640, 0x0650 },
+ specials={ "medial", 0x640, 0x650 },
unicodeslot=0xFE7B,
},
[0xFE7C]={
@@ -128023,7 +131216,7 @@ characters.data={
description="ARABIC SHADDA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0020, 0x0651 },
+ specials={ "isolated", 0x20, 0x651 },
unicodeslot=0xFE7C,
},
[0xFE7D]={
@@ -128031,7 +131224,7 @@ characters.data={
description="ARABIC SHADDA MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0640, 0x0651 },
+ specials={ "medial", 0x640, 0x651 },
unicodeslot=0xFE7D,
},
[0xFE7E]={
@@ -128039,7 +131232,7 @@ characters.data={
description="ARABIC SUKUN ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0020, 0x0652 },
+ specials={ "isolated", 0x20, 0x652 },
unicodeslot=0xFE7E,
},
[0xFE7F]={
@@ -128047,7 +131240,7 @@ characters.data={
description="ARABIC SUKUN MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0640, 0x0652 },
+ specials={ "medial", 0x640, 0x652 },
unicodeslot=0xFE7F,
},
[0xFE80]={
@@ -128055,7 +131248,7 @@ characters.data={
description="ARABIC LETTER HAMZA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0621 },
+ specials={ "isolated", 0x621 },
unicodeslot=0xFE80,
},
[0xFE81]={
@@ -128063,8 +131256,8 @@ characters.data={
description="ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM",
direction="al",
linebreak="al",
- shcode=0x0627,
- specials={ "isolated", 0x0622 },
+ shcode=0x627,
+ specials={ "isolated", 0x622 },
unicodeslot=0xFE81,
},
[0xFE82]={
@@ -128073,8 +131266,8 @@ characters.data={
description="ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM",
direction="al",
linebreak="al",
- shcode=0x0627,
- specials={ "final", 0x0622 },
+ shcode=0x627,
+ specials={ "final", 0x622 },
unicodeslot=0xFE82,
},
[0xFE83]={
@@ -128082,8 +131275,8 @@ characters.data={
description="ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM",
direction="al",
linebreak="al",
- shcode=0x0627,
- specials={ "isolated", 0x0623 },
+ shcode=0x627,
+ specials={ "isolated", 0x623 },
unicodeslot=0xFE83,
},
[0xFE84]={
@@ -128092,8 +131285,8 @@ characters.data={
description="ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM",
direction="al",
linebreak="al",
- shcode=0x0627,
- specials={ "final", 0x0623 },
+ shcode=0x627,
+ specials={ "final", 0x623 },
unicodeslot=0xFE84,
},
[0xFE85]={
@@ -128101,8 +131294,8 @@ characters.data={
description="ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM",
direction="al",
linebreak="al",
- shcode=0x0648,
- specials={ "isolated", 0x0624 },
+ shcode=0x648,
+ specials={ "isolated", 0x624 },
unicodeslot=0xFE85,
},
[0xFE86]={
@@ -128111,8 +131304,8 @@ characters.data={
description="ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM",
direction="al",
linebreak="al",
- shcode=0x0648,
- specials={ "final", 0x0624 },
+ shcode=0x648,
+ specials={ "final", 0x624 },
unicodeslot=0xFE86,
},
[0xFE87]={
@@ -128120,8 +131313,8 @@ characters.data={
description="ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM",
direction="al",
linebreak="al",
- shcode=0x0627,
- specials={ "isolated", 0x0625 },
+ shcode=0x627,
+ specials={ "isolated", 0x625 },
unicodeslot=0xFE87,
},
[0xFE88]={
@@ -128130,8 +131323,8 @@ characters.data={
description="ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM",
direction="al",
linebreak="al",
- shcode=0x0627,
- specials={ "final", 0x0625 },
+ shcode=0x627,
+ specials={ "final", 0x625 },
unicodeslot=0xFE88,
},
[0xFE89]={
@@ -128139,8 +131332,8 @@ characters.data={
description="ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM",
direction="al",
linebreak="al",
- shcode=0x064A,
- specials={ "isolated", 0x0626 },
+ shcode=0x64A,
+ specials={ "isolated", 0x626 },
unicodeslot=0xFE89,
},
[0xFE8A]={
@@ -128149,8 +131342,8 @@ characters.data={
description="ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM",
direction="al",
linebreak="al",
- shcode=0x064A,
- specials={ "final", 0x0626 },
+ shcode=0x64A,
+ specials={ "final", 0x626 },
unicodeslot=0xFE8A,
},
[0xFE8B]={
@@ -128159,8 +131352,8 @@ characters.data={
description="ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM",
direction="al",
linebreak="al",
- shcode=0x064A,
- specials={ "initial", 0x0626 },
+ shcode=0x64A,
+ specials={ "initial", 0x626 },
unicodeslot=0xFE8B,
},
[0xFE8C]={
@@ -128169,8 +131362,8 @@ characters.data={
description="ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM",
direction="al",
linebreak="al",
- shcode=0x064A,
- specials={ "medial", 0x0626 },
+ shcode=0x64A,
+ specials={ "medial", 0x626 },
unicodeslot=0xFE8C,
},
[0xFE8D]={
@@ -128178,7 +131371,7 @@ characters.data={
description="ARABIC LETTER ALEF ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0627 },
+ specials={ "isolated", 0x627 },
unicodeslot=0xFE8D,
},
[0xFE8E]={
@@ -128187,7 +131380,7 @@ characters.data={
description="ARABIC LETTER ALEF FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0627 },
+ specials={ "final", 0x627 },
unicodeslot=0xFE8E,
},
[0xFE8F]={
@@ -128195,7 +131388,7 @@ characters.data={
description="ARABIC LETTER BEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0628 },
+ specials={ "isolated", 0x628 },
unicodeslot=0xFE8F,
},
[0xFE90]={
@@ -128204,7 +131397,7 @@ characters.data={
description="ARABIC LETTER BEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0628 },
+ specials={ "final", 0x628 },
unicodeslot=0xFE90,
},
[0xFE91]={
@@ -128213,7 +131406,7 @@ characters.data={
description="ARABIC LETTER BEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0628 },
+ specials={ "initial", 0x628 },
unicodeslot=0xFE91,
},
[0xFE92]={
@@ -128222,7 +131415,7 @@ characters.data={
description="ARABIC LETTER BEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0628 },
+ specials={ "medial", 0x628 },
unicodeslot=0xFE92,
},
[0xFE93]={
@@ -128230,7 +131423,7 @@ characters.data={
description="ARABIC LETTER TEH MARBUTA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0629 },
+ specials={ "isolated", 0x629 },
unicodeslot=0xFE93,
},
[0xFE94]={
@@ -128239,7 +131432,7 @@ characters.data={
description="ARABIC LETTER TEH MARBUTA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0629 },
+ specials={ "final", 0x629 },
unicodeslot=0xFE94,
},
[0xFE95]={
@@ -128247,7 +131440,7 @@ characters.data={
description="ARABIC LETTER TEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062A },
+ specials={ "isolated", 0x62A },
unicodeslot=0xFE95,
},
[0xFE96]={
@@ -128256,7 +131449,7 @@ characters.data={
description="ARABIC LETTER TEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062A },
+ specials={ "final", 0x62A },
unicodeslot=0xFE96,
},
[0xFE97]={
@@ -128265,7 +131458,7 @@ characters.data={
description="ARABIC LETTER TEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x062A },
+ specials={ "initial", 0x62A },
unicodeslot=0xFE97,
},
[0xFE98]={
@@ -128274,7 +131467,7 @@ characters.data={
description="ARABIC LETTER TEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x062A },
+ specials={ "medial", 0x62A },
unicodeslot=0xFE98,
},
[0xFE99]={
@@ -128282,7 +131475,7 @@ characters.data={
description="ARABIC LETTER THEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062B },
+ specials={ "isolated", 0x62B },
unicodeslot=0xFE99,
},
[0xFE9A]={
@@ -128291,7 +131484,7 @@ characters.data={
description="ARABIC LETTER THEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062B },
+ specials={ "final", 0x62B },
unicodeslot=0xFE9A,
},
[0xFE9B]={
@@ -128300,7 +131493,7 @@ characters.data={
description="ARABIC LETTER THEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x062B },
+ specials={ "initial", 0x62B },
unicodeslot=0xFE9B,
},
[0xFE9C]={
@@ -128309,7 +131502,7 @@ characters.data={
description="ARABIC LETTER THEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x062B },
+ specials={ "medial", 0x62B },
unicodeslot=0xFE9C,
},
[0xFE9D]={
@@ -128317,7 +131510,7 @@ characters.data={
description="ARABIC LETTER JEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062C },
+ specials={ "isolated", 0x62C },
unicodeslot=0xFE9D,
},
[0xFE9E]={
@@ -128326,7 +131519,7 @@ characters.data={
description="ARABIC LETTER JEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062C },
+ specials={ "final", 0x62C },
unicodeslot=0xFE9E,
},
[0xFE9F]={
@@ -128335,7 +131528,7 @@ characters.data={
description="ARABIC LETTER JEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x062C },
+ specials={ "initial", 0x62C },
unicodeslot=0xFE9F,
},
[0xFEA0]={
@@ -128344,7 +131537,7 @@ characters.data={
description="ARABIC LETTER JEEM MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x062C },
+ specials={ "medial", 0x62C },
unicodeslot=0xFEA0,
},
[0xFEA1]={
@@ -128352,7 +131545,7 @@ characters.data={
description="ARABIC LETTER HAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062D },
+ specials={ "isolated", 0x62D },
unicodeslot=0xFEA1,
},
[0xFEA2]={
@@ -128361,7 +131554,7 @@ characters.data={
description="ARABIC LETTER HAH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062D },
+ specials={ "final", 0x62D },
unicodeslot=0xFEA2,
},
[0xFEA3]={
@@ -128370,7 +131563,7 @@ characters.data={
description="ARABIC LETTER HAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x062D },
+ specials={ "initial", 0x62D },
unicodeslot=0xFEA3,
},
[0xFEA4]={
@@ -128379,7 +131572,7 @@ characters.data={
description="ARABIC LETTER HAH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x062D },
+ specials={ "medial", 0x62D },
unicodeslot=0xFEA4,
},
[0xFEA5]={
@@ -128387,7 +131580,7 @@ characters.data={
description="ARABIC LETTER KHAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062E },
+ specials={ "isolated", 0x62E },
unicodeslot=0xFEA5,
},
[0xFEA6]={
@@ -128396,7 +131589,7 @@ characters.data={
description="ARABIC LETTER KHAH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062E },
+ specials={ "final", 0x62E },
unicodeslot=0xFEA6,
},
[0xFEA7]={
@@ -128405,7 +131598,7 @@ characters.data={
description="ARABIC LETTER KHAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x062E },
+ specials={ "initial", 0x62E },
unicodeslot=0xFEA7,
},
[0xFEA8]={
@@ -128414,7 +131607,7 @@ characters.data={
description="ARABIC LETTER KHAH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x062E },
+ specials={ "medial", 0x62E },
unicodeslot=0xFEA8,
},
[0xFEA9]={
@@ -128422,7 +131615,7 @@ characters.data={
description="ARABIC LETTER DAL ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x062F },
+ specials={ "isolated", 0x62F },
unicodeslot=0xFEA9,
},
[0xFEAA]={
@@ -128431,7 +131624,7 @@ characters.data={
description="ARABIC LETTER DAL FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x062F },
+ specials={ "final", 0x62F },
unicodeslot=0xFEAA,
},
[0xFEAB]={
@@ -128439,7 +131632,7 @@ characters.data={
description="ARABIC LETTER THAL ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0630 },
+ specials={ "isolated", 0x630 },
unicodeslot=0xFEAB,
},
[0xFEAC]={
@@ -128448,7 +131641,7 @@ characters.data={
description="ARABIC LETTER THAL FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0630 },
+ specials={ "final", 0x630 },
unicodeslot=0xFEAC,
},
[0xFEAD]={
@@ -128456,7 +131649,7 @@ characters.data={
description="ARABIC LETTER REH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0631 },
+ specials={ "isolated", 0x631 },
unicodeslot=0xFEAD,
},
[0xFEAE]={
@@ -128465,7 +131658,7 @@ characters.data={
description="ARABIC LETTER REH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0631 },
+ specials={ "final", 0x631 },
unicodeslot=0xFEAE,
},
[0xFEAF]={
@@ -128473,7 +131666,7 @@ characters.data={
description="ARABIC LETTER ZAIN ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0632 },
+ specials={ "isolated", 0x632 },
unicodeslot=0xFEAF,
},
[0xFEB0]={
@@ -128482,7 +131675,7 @@ characters.data={
description="ARABIC LETTER ZAIN FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0632 },
+ specials={ "final", 0x632 },
unicodeslot=0xFEB0,
},
[0xFEB1]={
@@ -128490,7 +131683,7 @@ characters.data={
description="ARABIC LETTER SEEN ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0633 },
+ specials={ "isolated", 0x633 },
unicodeslot=0xFEB1,
},
[0xFEB2]={
@@ -128499,7 +131692,7 @@ characters.data={
description="ARABIC LETTER SEEN FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0633 },
+ specials={ "final", 0x633 },
unicodeslot=0xFEB2,
},
[0xFEB3]={
@@ -128508,7 +131701,7 @@ characters.data={
description="ARABIC LETTER SEEN INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0633 },
+ specials={ "initial", 0x633 },
unicodeslot=0xFEB3,
},
[0xFEB4]={
@@ -128517,7 +131710,7 @@ characters.data={
description="ARABIC LETTER SEEN MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0633 },
+ specials={ "medial", 0x633 },
unicodeslot=0xFEB4,
},
[0xFEB5]={
@@ -128525,7 +131718,7 @@ characters.data={
description="ARABIC LETTER SHEEN ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0634 },
+ specials={ "isolated", 0x634 },
unicodeslot=0xFEB5,
},
[0xFEB6]={
@@ -128534,7 +131727,7 @@ characters.data={
description="ARABIC LETTER SHEEN FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0634 },
+ specials={ "final", 0x634 },
unicodeslot=0xFEB6,
},
[0xFEB7]={
@@ -128543,7 +131736,7 @@ characters.data={
description="ARABIC LETTER SHEEN INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0634 },
+ specials={ "initial", 0x634 },
unicodeslot=0xFEB7,
},
[0xFEB8]={
@@ -128552,7 +131745,7 @@ characters.data={
description="ARABIC LETTER SHEEN MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0634 },
+ specials={ "medial", 0x634 },
unicodeslot=0xFEB8,
},
[0xFEB9]={
@@ -128560,7 +131753,7 @@ characters.data={
description="ARABIC LETTER SAD ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0635 },
+ specials={ "isolated", 0x635 },
unicodeslot=0xFEB9,
},
[0xFEBA]={
@@ -128569,7 +131762,7 @@ characters.data={
description="ARABIC LETTER SAD FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0635 },
+ specials={ "final", 0x635 },
unicodeslot=0xFEBA,
},
[0xFEBB]={
@@ -128578,7 +131771,7 @@ characters.data={
description="ARABIC LETTER SAD INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0635 },
+ specials={ "initial", 0x635 },
unicodeslot=0xFEBB,
},
[0xFEBC]={
@@ -128587,7 +131780,7 @@ characters.data={
description="ARABIC LETTER SAD MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0635 },
+ specials={ "medial", 0x635 },
unicodeslot=0xFEBC,
},
[0xFEBD]={
@@ -128595,7 +131788,7 @@ characters.data={
description="ARABIC LETTER DAD ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0636 },
+ specials={ "isolated", 0x636 },
unicodeslot=0xFEBD,
},
[0xFEBE]={
@@ -128604,7 +131797,7 @@ characters.data={
description="ARABIC LETTER DAD FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0636 },
+ specials={ "final", 0x636 },
unicodeslot=0xFEBE,
},
[0xFEBF]={
@@ -128613,7 +131806,7 @@ characters.data={
description="ARABIC LETTER DAD INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0636 },
+ specials={ "initial", 0x636 },
unicodeslot=0xFEBF,
},
[0xFEC0]={
@@ -128622,7 +131815,7 @@ characters.data={
description="ARABIC LETTER DAD MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0636 },
+ specials={ "medial", 0x636 },
unicodeslot=0xFEC0,
},
[0xFEC1]={
@@ -128630,7 +131823,7 @@ characters.data={
description="ARABIC LETTER TAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0637 },
+ specials={ "isolated", 0x637 },
unicodeslot=0xFEC1,
},
[0xFEC2]={
@@ -128639,7 +131832,7 @@ characters.data={
description="ARABIC LETTER TAH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0637 },
+ specials={ "final", 0x637 },
unicodeslot=0xFEC2,
},
[0xFEC3]={
@@ -128648,7 +131841,7 @@ characters.data={
description="ARABIC LETTER TAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0637 },
+ specials={ "initial", 0x637 },
unicodeslot=0xFEC3,
},
[0xFEC4]={
@@ -128657,7 +131850,7 @@ characters.data={
description="ARABIC LETTER TAH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0637 },
+ specials={ "medial", 0x637 },
unicodeslot=0xFEC4,
},
[0xFEC5]={
@@ -128665,7 +131858,7 @@ characters.data={
description="ARABIC LETTER ZAH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0638 },
+ specials={ "isolated", 0x638 },
unicodeslot=0xFEC5,
},
[0xFEC6]={
@@ -128674,7 +131867,7 @@ characters.data={
description="ARABIC LETTER ZAH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0638 },
+ specials={ "final", 0x638 },
unicodeslot=0xFEC6,
},
[0xFEC7]={
@@ -128683,7 +131876,7 @@ characters.data={
description="ARABIC LETTER ZAH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0638 },
+ specials={ "initial", 0x638 },
unicodeslot=0xFEC7,
},
[0xFEC8]={
@@ -128692,7 +131885,7 @@ characters.data={
description="ARABIC LETTER ZAH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0638 },
+ specials={ "medial", 0x638 },
unicodeslot=0xFEC8,
},
[0xFEC9]={
@@ -128700,7 +131893,7 @@ characters.data={
description="ARABIC LETTER AIN ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0639 },
+ specials={ "isolated", 0x639 },
unicodeslot=0xFEC9,
},
[0xFECA]={
@@ -128709,7 +131902,7 @@ characters.data={
description="ARABIC LETTER AIN FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0639 },
+ specials={ "final", 0x639 },
unicodeslot=0xFECA,
},
[0xFECB]={
@@ -128718,7 +131911,7 @@ characters.data={
description="ARABIC LETTER AIN INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0639 },
+ specials={ "initial", 0x639 },
unicodeslot=0xFECB,
},
[0xFECC]={
@@ -128727,7 +131920,7 @@ characters.data={
description="ARABIC LETTER AIN MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0639 },
+ specials={ "medial", 0x639 },
unicodeslot=0xFECC,
},
[0xFECD]={
@@ -128735,7 +131928,7 @@ characters.data={
description="ARABIC LETTER GHAIN ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x063A },
+ specials={ "isolated", 0x63A },
unicodeslot=0xFECD,
},
[0xFECE]={
@@ -128744,7 +131937,7 @@ characters.data={
description="ARABIC LETTER GHAIN FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x063A },
+ specials={ "final", 0x63A },
unicodeslot=0xFECE,
},
[0xFECF]={
@@ -128753,7 +131946,7 @@ characters.data={
description="ARABIC LETTER GHAIN INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x063A },
+ specials={ "initial", 0x63A },
unicodeslot=0xFECF,
},
[0xFED0]={
@@ -128762,7 +131955,7 @@ characters.data={
description="ARABIC LETTER GHAIN MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x063A },
+ specials={ "medial", 0x63A },
unicodeslot=0xFED0,
},
[0xFED1]={
@@ -128770,7 +131963,7 @@ characters.data={
description="ARABIC LETTER FEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0641 },
+ specials={ "isolated", 0x641 },
unicodeslot=0xFED1,
},
[0xFED2]={
@@ -128779,7 +131972,7 @@ characters.data={
description="ARABIC LETTER FEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0641 },
+ specials={ "final", 0x641 },
unicodeslot=0xFED2,
},
[0xFED3]={
@@ -128788,7 +131981,7 @@ characters.data={
description="ARABIC LETTER FEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0641 },
+ specials={ "initial", 0x641 },
unicodeslot=0xFED3,
},
[0xFED4]={
@@ -128797,7 +131990,7 @@ characters.data={
description="ARABIC LETTER FEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0641 },
+ specials={ "medial", 0x641 },
unicodeslot=0xFED4,
},
[0xFED5]={
@@ -128805,7 +131998,7 @@ characters.data={
description="ARABIC LETTER QAF ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0642 },
+ specials={ "isolated", 0x642 },
unicodeslot=0xFED5,
},
[0xFED6]={
@@ -128814,7 +132007,7 @@ characters.data={
description="ARABIC LETTER QAF FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0642 },
+ specials={ "final", 0x642 },
unicodeslot=0xFED6,
},
[0xFED7]={
@@ -128823,7 +132016,7 @@ characters.data={
description="ARABIC LETTER QAF INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0642 },
+ specials={ "initial", 0x642 },
unicodeslot=0xFED7,
},
[0xFED8]={
@@ -128832,7 +132025,7 @@ characters.data={
description="ARABIC LETTER QAF MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0642 },
+ specials={ "medial", 0x642 },
unicodeslot=0xFED8,
},
[0xFED9]={
@@ -128840,7 +132033,7 @@ characters.data={
description="ARABIC LETTER KAF ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0643 },
+ specials={ "isolated", 0x643 },
unicodeslot=0xFED9,
},
[0xFEDA]={
@@ -128849,7 +132042,7 @@ characters.data={
description="ARABIC LETTER KAF FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0643 },
+ specials={ "final", 0x643 },
unicodeslot=0xFEDA,
},
[0xFEDB]={
@@ -128858,7 +132051,7 @@ characters.data={
description="ARABIC LETTER KAF INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0643 },
+ specials={ "initial", 0x643 },
unicodeslot=0xFEDB,
},
[0xFEDC]={
@@ -128867,7 +132060,7 @@ characters.data={
description="ARABIC LETTER KAF MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0643 },
+ specials={ "medial", 0x643 },
unicodeslot=0xFEDC,
},
[0xFEDD]={
@@ -128875,7 +132068,7 @@ characters.data={
description="ARABIC LETTER LAM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0644 },
+ specials={ "isolated", 0x644 },
unicodeslot=0xFEDD,
},
[0xFEDE]={
@@ -128884,7 +132077,7 @@ characters.data={
description="ARABIC LETTER LAM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0644 },
+ specials={ "final", 0x644 },
unicodeslot=0xFEDE,
},
[0xFEDF]={
@@ -128893,7 +132086,7 @@ characters.data={
description="ARABIC LETTER LAM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0644 },
+ specials={ "initial", 0x644 },
unicodeslot=0xFEDF,
},
[0xFEE0]={
@@ -128902,7 +132095,7 @@ characters.data={
description="ARABIC LETTER LAM MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0644 },
+ specials={ "medial", 0x644 },
unicodeslot=0xFEE0,
},
[0xFEE1]={
@@ -128910,7 +132103,7 @@ characters.data={
description="ARABIC LETTER MEEM ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0645 },
+ specials={ "isolated", 0x645 },
unicodeslot=0xFEE1,
},
[0xFEE2]={
@@ -128919,7 +132112,7 @@ characters.data={
description="ARABIC LETTER MEEM FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0645 },
+ specials={ "final", 0x645 },
unicodeslot=0xFEE2,
},
[0xFEE3]={
@@ -128928,7 +132121,7 @@ characters.data={
description="ARABIC LETTER MEEM INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0645 },
+ specials={ "initial", 0x645 },
unicodeslot=0xFEE3,
},
[0xFEE4]={
@@ -128937,7 +132130,7 @@ characters.data={
description="ARABIC LETTER MEEM MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0645 },
+ specials={ "medial", 0x645 },
unicodeslot=0xFEE4,
},
[0xFEE5]={
@@ -128945,7 +132138,7 @@ characters.data={
description="ARABIC LETTER NOON ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0646 },
+ specials={ "isolated", 0x646 },
unicodeslot=0xFEE5,
},
[0xFEE6]={
@@ -128954,7 +132147,7 @@ characters.data={
description="ARABIC LETTER NOON FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0646 },
+ specials={ "final", 0x646 },
unicodeslot=0xFEE6,
},
[0xFEE7]={
@@ -128963,7 +132156,7 @@ characters.data={
description="ARABIC LETTER NOON INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0646 },
+ specials={ "initial", 0x646 },
unicodeslot=0xFEE7,
},
[0xFEE8]={
@@ -128972,7 +132165,7 @@ characters.data={
description="ARABIC LETTER NOON MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0646 },
+ specials={ "medial", 0x646 },
unicodeslot=0xFEE8,
},
[0xFEE9]={
@@ -128980,7 +132173,7 @@ characters.data={
description="ARABIC LETTER HEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0647 },
+ specials={ "isolated", 0x647 },
unicodeslot=0xFEE9,
},
[0xFEEA]={
@@ -128989,7 +132182,7 @@ characters.data={
description="ARABIC LETTER HEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0647 },
+ specials={ "final", 0x647 },
unicodeslot=0xFEEA,
},
[0xFEEB]={
@@ -128998,7 +132191,7 @@ characters.data={
description="ARABIC LETTER HEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x0647 },
+ specials={ "initial", 0x647 },
unicodeslot=0xFEEB,
},
[0xFEEC]={
@@ -129007,7 +132200,7 @@ characters.data={
description="ARABIC LETTER HEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x0647 },
+ specials={ "medial", 0x647 },
unicodeslot=0xFEEC,
},
[0xFEED]={
@@ -129015,7 +132208,7 @@ characters.data={
description="ARABIC LETTER WAW ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0648 },
+ specials={ "isolated", 0x648 },
unicodeslot=0xFEED,
},
[0xFEEE]={
@@ -129024,7 +132217,7 @@ characters.data={
description="ARABIC LETTER WAW FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0648 },
+ specials={ "final", 0x648 },
unicodeslot=0xFEEE,
},
[0xFEEF]={
@@ -129032,7 +132225,7 @@ characters.data={
description="ARABIC LETTER ALEF MAKSURA ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0649 },
+ specials={ "isolated", 0x649 },
unicodeslot=0xFEEF,
},
[0xFEF0]={
@@ -129041,7 +132234,7 @@ characters.data={
description="ARABIC LETTER ALEF MAKSURA FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0649 },
+ specials={ "final", 0x649 },
unicodeslot=0xFEF0,
},
[0xFEF1]={
@@ -129049,7 +132242,7 @@ characters.data={
description="ARABIC LETTER YEH ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x064A },
+ specials={ "isolated", 0x64A },
unicodeslot=0xFEF1,
},
[0xFEF2]={
@@ -129058,7 +132251,7 @@ characters.data={
description="ARABIC LETTER YEH FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x064A },
+ specials={ "final", 0x64A },
unicodeslot=0xFEF2,
},
[0xFEF3]={
@@ -129067,7 +132260,7 @@ characters.data={
description="ARABIC LETTER YEH INITIAL FORM",
direction="al",
linebreak="al",
- specials={ "initial", 0x064A },
+ specials={ "initial", 0x64A },
unicodeslot=0xFEF3,
},
[0xFEF4]={
@@ -129076,7 +132269,7 @@ characters.data={
description="ARABIC LETTER YEH MEDIAL FORM",
direction="al",
linebreak="al",
- specials={ "medial", 0x064A },
+ specials={ "medial", 0x64A },
unicodeslot=0xFEF4,
},
[0xFEF5]={
@@ -129085,7 +132278,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0644, 0x0622 },
+ specials={ "isolated", 0x644, 0x622 },
unicodeslot=0xFEF5,
},
[0xFEF6]={
@@ -129094,7 +132287,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0644, 0x0622 },
+ specials={ "final", 0x644, 0x622 },
unicodeslot=0xFEF6,
},
[0xFEF7]={
@@ -129103,7 +132296,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0644, 0x0623 },
+ specials={ "isolated", 0x644, 0x623 },
unicodeslot=0xFEF7,
},
[0xFEF8]={
@@ -129112,7 +132305,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0644, 0x0623 },
+ specials={ "final", 0x644, 0x623 },
unicodeslot=0xFEF8,
},
[0xFEF9]={
@@ -129121,7 +132314,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0644, 0x0625 },
+ specials={ "isolated", 0x644, 0x625 },
unicodeslot=0xFEF9,
},
[0xFEFA]={
@@ -129130,7 +132323,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0644, 0x0625 },
+ specials={ "final", 0x644, 0x625 },
unicodeslot=0xFEFA,
},
[0xFEFB]={
@@ -129139,7 +132332,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM",
direction="al",
linebreak="al",
- specials={ "isolated", 0x0644, 0x0627 },
+ specials={ "isolated", 0x644, 0x627 },
unicodeslot=0xFEFB,
},
[0xFEFC]={
@@ -129148,7 +132341,7 @@ characters.data={
description="ARABIC LIGATURE LAM WITH ALEF FINAL FORM",
direction="al",
linebreak="al",
- specials={ "final", 0x0644, 0x0627 },
+ specials={ "final", 0x644, 0x627 },
unicodeslot=0xFEFC,
},
[0xFEFF]={
@@ -129167,7 +132360,7 @@ characters.data={
description="FULLWIDTH EXCLAMATION MARK",
direction="on",
linebreak="ex",
- specials={ "wide", 0x0021 },
+ specials={ "wide", 0x21 },
unicodeslot=0xFF01,
},
[0xFF02]={
@@ -129177,7 +132370,7 @@ characters.data={
description="FULLWIDTH QUOTATION MARK",
direction="on",
linebreak="id",
- specials={ "wide", 0x0022 },
+ specials={ "wide", 0x22 },
unicodeslot=0xFF02,
},
[0xFF03]={
@@ -129187,7 +132380,7 @@ characters.data={
description="FULLWIDTH NUMBER SIGN",
direction="et",
linebreak="id",
- specials={ "wide", 0x0023 },
+ specials={ "wide", 0x23 },
unicodeslot=0xFF03,
},
[0xFF04]={
@@ -129197,7 +132390,7 @@ characters.data={
description="FULLWIDTH DOLLAR SIGN",
direction="et",
linebreak="pr",
- specials={ "wide", 0x0024 },
+ specials={ "wide", 0x24 },
unicodeslot=0xFF04,
},
[0xFF05]={
@@ -129207,7 +132400,7 @@ characters.data={
description="FULLWIDTH PERCENT SIGN",
direction="et",
linebreak="po",
- specials={ "wide", 0x0025 },
+ specials={ "wide", 0x25 },
unicodeslot=0xFF05,
},
[0xFF06]={
@@ -129217,7 +132410,7 @@ characters.data={
description="FULLWIDTH AMPERSAND",
direction="on",
linebreak="id",
- specials={ "wide", 0x0026 },
+ specials={ "wide", 0x26 },
unicodeslot=0xFF06,
},
[0xFF07]={
@@ -129227,7 +132420,7 @@ characters.data={
description="FULLWIDTH APOSTROPHE",
direction="on",
linebreak="id",
- specials={ "wide", 0x0027 },
+ specials={ "wide", 0x27 },
unicodeslot=0xFF07,
},
[0xFF08]={
@@ -129238,8 +132431,8 @@ characters.data={
direction="on",
linebreak="op",
mirror=0xFF09,
+ specials={ "wide", 0x28 },
textclass="open",
- specials={ "wide", 0x0028 },
unicodeslot=0xFF08,
},
[0xFF09]={
@@ -129250,8 +132443,8 @@ characters.data={
direction="on",
linebreak="cl",
mirror=0xFF08,
+ specials={ "wide", 0x29 },
textclass="close",
- specials={ "wide", 0x0029 },
unicodeslot=0xFF09,
},
[0xFF0A]={
@@ -129261,7 +132454,7 @@ characters.data={
description="FULLWIDTH ASTERISK",
direction="on",
linebreak="id",
- specials={ "wide", 0x002A },
+ specials={ "wide", 0x2A },
unicodeslot=0xFF0A,
},
[0xFF0B]={
@@ -129271,7 +132464,7 @@ characters.data={
description="FULLWIDTH PLUS SIGN",
direction="es",
linebreak="id",
- specials={ "wide", 0x002B },
+ specials={ "wide", 0x2B },
unicodeslot=0xFF0B,
},
[0xFF0C]={
@@ -129281,7 +132474,7 @@ characters.data={
description="FULLWIDTH COMMA",
direction="cs",
linebreak="cl",
- specials={ "wide", 0x002C },
+ specials={ "wide", 0x2C },
unicodeslot=0xFF0C,
},
[0xFF0D]={
@@ -129291,7 +132484,7 @@ characters.data={
description="FULLWIDTH HYPHEN-MINUS",
direction="es",
linebreak="id",
- specials={ "wide", 0x002D },
+ specials={ "wide", 0x2D },
unicodeslot=0xFF0D,
},
[0xFF0E]={
@@ -129301,7 +132494,7 @@ characters.data={
description="FULLWIDTH FULL STOP",
direction="cs",
linebreak="cl",
- specials={ "wide", 0x002E },
+ specials={ "wide", 0x2E },
unicodeslot=0xFF0E,
},
[0xFF0F]={
@@ -129311,7 +132504,7 @@ characters.data={
description="FULLWIDTH SOLIDUS",
direction="cs",
linebreak="id",
- specials={ "wide", 0x002F },
+ specials={ "wide", 0x2F },
unicodeslot=0xFF0F,
},
[0xFF10]={
@@ -129321,7 +132514,7 @@ characters.data={
description="FULLWIDTH DIGIT ZERO",
direction="en",
linebreak="id",
- specials={ "wide", 0x0030 },
+ specials={ "wide", 0x30 },
unicodeslot=0xFF10,
},
[0xFF11]={
@@ -129331,7 +132524,7 @@ characters.data={
description="FULLWIDTH DIGIT ONE",
direction="en",
linebreak="id",
- specials={ "wide", 0x0031 },
+ specials={ "wide", 0x31 },
unicodeslot=0xFF11,
},
[0xFF12]={
@@ -129341,7 +132534,7 @@ characters.data={
description="FULLWIDTH DIGIT TWO",
direction="en",
linebreak="id",
- specials={ "wide", 0x0032 },
+ specials={ "wide", 0x32 },
unicodeslot=0xFF12,
},
[0xFF13]={
@@ -129351,7 +132544,7 @@ characters.data={
description="FULLWIDTH DIGIT THREE",
direction="en",
linebreak="id",
- specials={ "wide", 0x0033 },
+ specials={ "wide", 0x33 },
unicodeslot=0xFF13,
},
[0xFF14]={
@@ -129361,7 +132554,7 @@ characters.data={
description="FULLWIDTH DIGIT FOUR",
direction="en",
linebreak="id",
- specials={ "wide", 0x0034 },
+ specials={ "wide", 0x34 },
unicodeslot=0xFF14,
},
[0xFF15]={
@@ -129371,7 +132564,7 @@ characters.data={
description="FULLWIDTH DIGIT FIVE",
direction="en",
linebreak="id",
- specials={ "wide", 0x0035 },
+ specials={ "wide", 0x35 },
unicodeslot=0xFF15,
},
[0xFF16]={
@@ -129381,7 +132574,7 @@ characters.data={
description="FULLWIDTH DIGIT SIX",
direction="en",
linebreak="id",
- specials={ "wide", 0x0036 },
+ specials={ "wide", 0x36 },
unicodeslot=0xFF16,
},
[0xFF17]={
@@ -129391,7 +132584,7 @@ characters.data={
description="FULLWIDTH DIGIT SEVEN",
direction="en",
linebreak="id",
- specials={ "wide", 0x0037 },
+ specials={ "wide", 0x37 },
unicodeslot=0xFF17,
},
[0xFF18]={
@@ -129401,7 +132594,7 @@ characters.data={
description="FULLWIDTH DIGIT EIGHT",
direction="en",
linebreak="id",
- specials={ "wide", 0x0038 },
+ specials={ "wide", 0x38 },
unicodeslot=0xFF18,
},
[0xFF19]={
@@ -129411,7 +132604,7 @@ characters.data={
description="FULLWIDTH DIGIT NINE",
direction="en",
linebreak="id",
- specials={ "wide", 0x0039 },
+ specials={ "wide", 0x39 },
unicodeslot=0xFF19,
},
[0xFF1A]={
@@ -129421,7 +132614,7 @@ characters.data={
description="FULLWIDTH COLON",
direction="cs",
linebreak="ns",
- specials={ "wide", 0x003A },
+ specials={ "wide", 0x3A },
unicodeslot=0xFF1A,
},
[0xFF1B]={
@@ -129431,7 +132624,7 @@ characters.data={
description="FULLWIDTH SEMICOLON",
direction="on",
linebreak="ns",
- specials={ "wide", 0x003B },
+ specials={ "wide", 0x3B },
unicodeslot=0xFF1B,
},
[0xFF1C]={
@@ -129442,8 +132635,8 @@ characters.data={
direction="on",
linebreak="id",
mirror=0xFF1E,
+ specials={ "wide", 0x3C },
textclass="open",
- specials={ "wide", 0x003C },
unicodeslot=0xFF1C,
},
[0xFF1D]={
@@ -129453,7 +132646,7 @@ characters.data={
description="FULLWIDTH EQUALS SIGN",
direction="on",
linebreak="id",
- specials={ "wide", 0x003D },
+ specials={ "wide", 0x3D },
unicodeslot=0xFF1D,
},
[0xFF1E]={
@@ -129464,8 +132657,8 @@ characters.data={
direction="on",
linebreak="id",
mirror=0xFF1C,
+ specials={ "wide", 0x3E },
textclass="close",
- specials={ "wide", 0x003E },
unicodeslot=0xFF1E,
},
[0xFF1F]={
@@ -129475,7 +132668,7 @@ characters.data={
description="FULLWIDTH QUESTION MARK",
direction="on",
linebreak="ex",
- specials={ "wide", 0x003F },
+ specials={ "wide", 0x3F },
unicodeslot=0xFF1F,
},
[0xFF20]={
@@ -129485,7 +132678,7 @@ characters.data={
description="FULLWIDTH COMMERCIAL AT",
direction="on",
linebreak="id",
- specials={ "wide", 0x0040 },
+ specials={ "wide", 0x40 },
unicodeslot=0xFF20,
},
[0xFF21]={
@@ -129496,7 +132689,7 @@ characters.data={
direction="l",
lccode=0xFF41,
linebreak="id",
- specials={ "wide", 0x0041 },
+ specials={ "wide", 0x41 },
unicodeslot=0xFF21,
},
[0xFF22]={
@@ -129507,7 +132700,7 @@ characters.data={
direction="l",
lccode=0xFF42,
linebreak="id",
- specials={ "wide", 0x0042 },
+ specials={ "wide", 0x42 },
unicodeslot=0xFF22,
},
[0xFF23]={
@@ -129518,7 +132711,7 @@ characters.data={
direction="l",
lccode=0xFF43,
linebreak="id",
- specials={ "wide", 0x0043 },
+ specials={ "wide", 0x43 },
unicodeslot=0xFF23,
},
[0xFF24]={
@@ -129529,7 +132722,7 @@ characters.data={
direction="l",
lccode=0xFF44,
linebreak="id",
- specials={ "wide", 0x0044 },
+ specials={ "wide", 0x44 },
unicodeslot=0xFF24,
},
[0xFF25]={
@@ -129540,7 +132733,7 @@ characters.data={
direction="l",
lccode=0xFF45,
linebreak="id",
- specials={ "wide", 0x0045 },
+ specials={ "wide", 0x45 },
unicodeslot=0xFF25,
},
[0xFF26]={
@@ -129551,7 +132744,7 @@ characters.data={
direction="l",
lccode=0xFF46,
linebreak="id",
- specials={ "wide", 0x0046 },
+ specials={ "wide", 0x46 },
unicodeslot=0xFF26,
},
[0xFF27]={
@@ -129562,7 +132755,7 @@ characters.data={
direction="l",
lccode=0xFF47,
linebreak="id",
- specials={ "wide", 0x0047 },
+ specials={ "wide", 0x47 },
unicodeslot=0xFF27,
},
[0xFF28]={
@@ -129573,7 +132766,7 @@ characters.data={
direction="l",
lccode=0xFF48,
linebreak="id",
- specials={ "wide", 0x0048 },
+ specials={ "wide", 0x48 },
unicodeslot=0xFF28,
},
[0xFF29]={
@@ -129584,7 +132777,7 @@ characters.data={
direction="l",
lccode=0xFF49,
linebreak="id",
- specials={ "wide", 0x0049 },
+ specials={ "wide", 0x49 },
unicodeslot=0xFF29,
},
[0xFF2A]={
@@ -129595,7 +132788,7 @@ characters.data={
direction="l",
lccode=0xFF4A,
linebreak="id",
- specials={ "wide", 0x004A },
+ specials={ "wide", 0x4A },
unicodeslot=0xFF2A,
},
[0xFF2B]={
@@ -129606,7 +132799,7 @@ characters.data={
direction="l",
lccode=0xFF4B,
linebreak="id",
- specials={ "wide", 0x004B },
+ specials={ "wide", 0x4B },
unicodeslot=0xFF2B,
},
[0xFF2C]={
@@ -129617,7 +132810,7 @@ characters.data={
direction="l",
lccode=0xFF4C,
linebreak="id",
- specials={ "wide", 0x004C },
+ specials={ "wide", 0x4C },
unicodeslot=0xFF2C,
},
[0xFF2D]={
@@ -129628,7 +132821,7 @@ characters.data={
direction="l",
lccode=0xFF4D,
linebreak="id",
- specials={ "wide", 0x004D },
+ specials={ "wide", 0x4D },
unicodeslot=0xFF2D,
},
[0xFF2E]={
@@ -129639,7 +132832,7 @@ characters.data={
direction="l",
lccode=0xFF4E,
linebreak="id",
- specials={ "wide", 0x004E },
+ specials={ "wide", 0x4E },
unicodeslot=0xFF2E,
},
[0xFF2F]={
@@ -129650,7 +132843,7 @@ characters.data={
direction="l",
lccode=0xFF4F,
linebreak="id",
- specials={ "wide", 0x004F },
+ specials={ "wide", 0x4F },
unicodeslot=0xFF2F,
},
[0xFF30]={
@@ -129661,7 +132854,7 @@ characters.data={
direction="l",
lccode=0xFF50,
linebreak="id",
- specials={ "wide", 0x0050 },
+ specials={ "wide", 0x50 },
unicodeslot=0xFF30,
},
[0xFF31]={
@@ -129672,7 +132865,7 @@ characters.data={
direction="l",
lccode=0xFF51,
linebreak="id",
- specials={ "wide", 0x0051 },
+ specials={ "wide", 0x51 },
unicodeslot=0xFF31,
},
[0xFF32]={
@@ -129683,7 +132876,7 @@ characters.data={
direction="l",
lccode=0xFF52,
linebreak="id",
- specials={ "wide", 0x0052 },
+ specials={ "wide", 0x52 },
unicodeslot=0xFF32,
},
[0xFF33]={
@@ -129694,7 +132887,7 @@ characters.data={
direction="l",
lccode=0xFF53,
linebreak="id",
- specials={ "wide", 0x0053 },
+ specials={ "wide", 0x53 },
unicodeslot=0xFF33,
},
[0xFF34]={
@@ -129705,7 +132898,7 @@ characters.data={
direction="l",
lccode=0xFF54,
linebreak="id",
- specials={ "wide", 0x0054 },
+ specials={ "wide", 0x54 },
unicodeslot=0xFF34,
},
[0xFF35]={
@@ -129716,7 +132909,7 @@ characters.data={
direction="l",
lccode=0xFF55,
linebreak="id",
- specials={ "wide", 0x0055 },
+ specials={ "wide", 0x55 },
unicodeslot=0xFF35,
},
[0xFF36]={
@@ -129727,7 +132920,7 @@ characters.data={
direction="l",
lccode=0xFF56,
linebreak="id",
- specials={ "wide", 0x0056 },
+ specials={ "wide", 0x56 },
unicodeslot=0xFF36,
},
[0xFF37]={
@@ -129738,7 +132931,7 @@ characters.data={
direction="l",
lccode=0xFF57,
linebreak="id",
- specials={ "wide", 0x0057 },
+ specials={ "wide", 0x57 },
unicodeslot=0xFF37,
},
[0xFF38]={
@@ -129749,7 +132942,7 @@ characters.data={
direction="l",
lccode=0xFF58,
linebreak="id",
- specials={ "wide", 0x0058 },
+ specials={ "wide", 0x58 },
unicodeslot=0xFF38,
},
[0xFF39]={
@@ -129760,7 +132953,7 @@ characters.data={
direction="l",
lccode=0xFF59,
linebreak="id",
- specials={ "wide", 0x0059 },
+ specials={ "wide", 0x59 },
unicodeslot=0xFF39,
},
[0xFF3A]={
@@ -129771,7 +132964,7 @@ characters.data={
direction="l",
lccode=0xFF5A,
linebreak="id",
- specials={ "wide", 0x005A },
+ specials={ "wide", 0x5A },
unicodeslot=0xFF3A,
},
[0xFF3B]={
@@ -129782,8 +132975,8 @@ characters.data={
direction="on",
linebreak="op",
mirror=0xFF3D,
+ specials={ "wide", 0x5B },
textclass="open",
- specials={ "wide", 0x005B },
unicodeslot=0xFF3B,
},
[0xFF3C]={
@@ -129793,7 +132986,7 @@ characters.data={
description="FULLWIDTH REVERSE SOLIDUS",
direction="on",
linebreak="id",
- specials={ "wide", 0x005C },
+ specials={ "wide", 0x5C },
unicodeslot=0xFF3C,
},
[0xFF3D]={
@@ -129804,8 +132997,8 @@ characters.data={
direction="on",
linebreak="cl",
mirror=0xFF3B,
+ specials={ "wide", 0x5D },
textclass="close",
- specials={ "wide", 0x005D },
unicodeslot=0xFF3D,
},
[0xFF3E]={
@@ -129815,7 +133008,7 @@ characters.data={
description="FULLWIDTH CIRCUMFLEX ACCENT",
direction="on",
linebreak="id",
- specials={ "wide", 0x005E },
+ specials={ "wide", 0x5E },
unicodeslot=0xFF3E,
},
[0xFF3F]={
@@ -129825,7 +133018,7 @@ characters.data={
description="FULLWIDTH LOW LINE",
direction="on",
linebreak="id",
- specials={ "wide", 0x005F },
+ specials={ "wide", 0x5F },
unicodeslot=0xFF3F,
},
[0xFF40]={
@@ -129835,7 +133028,7 @@ characters.data={
description="FULLWIDTH GRAVE ACCENT",
direction="on",
linebreak="id",
- specials={ "wide", 0x0060 },
+ specials={ "wide", 0x60 },
unicodeslot=0xFF40,
},
[0xFF41]={
@@ -129845,7 +133038,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER A",
direction="l",
linebreak="id",
- specials={ "wide", 0x0061 },
+ specials={ "wide", 0x61 },
uccode=0xFF21,
unicodeslot=0xFF41,
},
@@ -129856,7 +133049,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER B",
direction="l",
linebreak="id",
- specials={ "wide", 0x0062 },
+ specials={ "wide", 0x62 },
uccode=0xFF22,
unicodeslot=0xFF42,
},
@@ -129867,7 +133060,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER C",
direction="l",
linebreak="id",
- specials={ "wide", 0x0063 },
+ specials={ "wide", 0x63 },
uccode=0xFF23,
unicodeslot=0xFF43,
},
@@ -129878,7 +133071,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER D",
direction="l",
linebreak="id",
- specials={ "wide", 0x0064 },
+ specials={ "wide", 0x64 },
uccode=0xFF24,
unicodeslot=0xFF44,
},
@@ -129889,7 +133082,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER E",
direction="l",
linebreak="id",
- specials={ "wide", 0x0065 },
+ specials={ "wide", 0x65 },
uccode=0xFF25,
unicodeslot=0xFF45,
},
@@ -129900,7 +133093,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER F",
direction="l",
linebreak="id",
- specials={ "wide", 0x0066 },
+ specials={ "wide", 0x66 },
uccode=0xFF26,
unicodeslot=0xFF46,
},
@@ -129911,7 +133104,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER G",
direction="l",
linebreak="id",
- specials={ "wide", 0x0067 },
+ specials={ "wide", 0x67 },
uccode=0xFF27,
unicodeslot=0xFF47,
},
@@ -129922,7 +133115,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER H",
direction="l",
linebreak="id",
- specials={ "wide", 0x0068 },
+ specials={ "wide", 0x68 },
uccode=0xFF28,
unicodeslot=0xFF48,
},
@@ -129933,7 +133126,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER I",
direction="l",
linebreak="id",
- specials={ "wide", 0x0069 },
+ specials={ "wide", 0x69 },
uccode=0xFF29,
unicodeslot=0xFF49,
},
@@ -129944,7 +133137,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER J",
direction="l",
linebreak="id",
- specials={ "wide", 0x006A },
+ specials={ "wide", 0x6A },
uccode=0xFF2A,
unicodeslot=0xFF4A,
},
@@ -129955,7 +133148,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER K",
direction="l",
linebreak="id",
- specials={ "wide", 0x006B },
+ specials={ "wide", 0x6B },
uccode=0xFF2B,
unicodeslot=0xFF4B,
},
@@ -129966,7 +133159,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER L",
direction="l",
linebreak="id",
- specials={ "wide", 0x006C },
+ specials={ "wide", 0x6C },
uccode=0xFF2C,
unicodeslot=0xFF4C,
},
@@ -129977,7 +133170,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER M",
direction="l",
linebreak="id",
- specials={ "wide", 0x006D },
+ specials={ "wide", 0x6D },
uccode=0xFF2D,
unicodeslot=0xFF4D,
},
@@ -129988,7 +133181,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER N",
direction="l",
linebreak="id",
- specials={ "wide", 0x006E },
+ specials={ "wide", 0x6E },
uccode=0xFF2E,
unicodeslot=0xFF4E,
},
@@ -129999,7 +133192,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER O",
direction="l",
linebreak="id",
- specials={ "wide", 0x006F },
+ specials={ "wide", 0x6F },
uccode=0xFF2F,
unicodeslot=0xFF4F,
},
@@ -130010,7 +133203,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER P",
direction="l",
linebreak="id",
- specials={ "wide", 0x0070 },
+ specials={ "wide", 0x70 },
uccode=0xFF30,
unicodeslot=0xFF50,
},
@@ -130021,7 +133214,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER Q",
direction="l",
linebreak="id",
- specials={ "wide", 0x0071 },
+ specials={ "wide", 0x71 },
uccode=0xFF31,
unicodeslot=0xFF51,
},
@@ -130032,7 +133225,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER R",
direction="l",
linebreak="id",
- specials={ "wide", 0x0072 },
+ specials={ "wide", 0x72 },
uccode=0xFF32,
unicodeslot=0xFF52,
},
@@ -130043,7 +133236,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER S",
direction="l",
linebreak="id",
- specials={ "wide", 0x0073 },
+ specials={ "wide", 0x73 },
uccode=0xFF33,
unicodeslot=0xFF53,
},
@@ -130054,7 +133247,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER T",
direction="l",
linebreak="id",
- specials={ "wide", 0x0074 },
+ specials={ "wide", 0x74 },
uccode=0xFF34,
unicodeslot=0xFF54,
},
@@ -130065,7 +133258,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER U",
direction="l",
linebreak="id",
- specials={ "wide", 0x0075 },
+ specials={ "wide", 0x75 },
uccode=0xFF35,
unicodeslot=0xFF55,
},
@@ -130076,7 +133269,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER V",
direction="l",
linebreak="id",
- specials={ "wide", 0x0076 },
+ specials={ "wide", 0x76 },
uccode=0xFF36,
unicodeslot=0xFF56,
},
@@ -130087,7 +133280,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER W",
direction="l",
linebreak="id",
- specials={ "wide", 0x0077 },
+ specials={ "wide", 0x77 },
uccode=0xFF37,
unicodeslot=0xFF57,
},
@@ -130098,7 +133291,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER X",
direction="l",
linebreak="id",
- specials={ "wide", 0x0078 },
+ specials={ "wide", 0x78 },
uccode=0xFF38,
unicodeslot=0xFF58,
},
@@ -130109,7 +133302,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER Y",
direction="l",
linebreak="id",
- specials={ "wide", 0x0079 },
+ specials={ "wide", 0x79 },
uccode=0xFF39,
unicodeslot=0xFF59,
},
@@ -130120,7 +133313,7 @@ characters.data={
description="FULLWIDTH LATIN SMALL LETTER Z",
direction="l",
linebreak="id",
- specials={ "wide", 0x007A },
+ specials={ "wide", 0x7A },
uccode=0xFF3A,
unicodeslot=0xFF5A,
},
@@ -130132,8 +133325,8 @@ characters.data={
direction="on",
linebreak="op",
mirror=0xFF5D,
+ specials={ "wide", 0x7B },
textclass="open",
- specials={ "wide", 0x007B },
unicodeslot=0xFF5B,
},
[0xFF5C]={
@@ -130143,7 +133336,7 @@ characters.data={
description="FULLWIDTH VERTICAL LINE",
direction="on",
linebreak="id",
- specials={ "wide", 0x007C },
+ specials={ "wide", 0x7C },
unicodeslot=0xFF5C,
},
[0xFF5D]={
@@ -130154,8 +133347,8 @@ characters.data={
direction="on",
linebreak="cl",
mirror=0xFF5B,
+ specials={ "wide", 0x7D },
textclass="close",
- specials={ "wide", 0x007D },
unicodeslot=0xFF5D,
},
[0xFF5E]={
@@ -130165,7 +133358,7 @@ characters.data={
description="FULLWIDTH TILDE",
direction="on",
linebreak="id",
- specials={ "wide", 0x007E },
+ specials={ "wide", 0x7E },
unicodeslot=0xFF5E,
},
[0xFF5F]={
@@ -130175,8 +133368,8 @@ characters.data={
direction="on",
linebreak="op",
mirror=0xFF60,
- textclass="open",
specials={ "wide", 0x2985 },
+ textclass="open",
unicodeslot=0xFF5F,
},
[0xFF60]={
@@ -130186,8 +133379,8 @@ characters.data={
direction="on",
linebreak="cl",
mirror=0xFF5F,
- textclass="close",
specials={ "wide", 0x2986 },
+ textclass="close",
unicodeslot=0xFF60,
},
[0xFF61]={
@@ -130208,8 +133401,8 @@ characters.data={
direction="on",
linebreak="op",
mirror=0xFF63,
- textclass="open",
specials={ "narrow", 0x300C },
+ textclass="open",
unicodeslot=0xFF62,
},
[0xFF63]={
@@ -130220,8 +133413,8 @@ characters.data={
direction="on",
linebreak="cl",
mirror=0xFF62,
- textclass="close",
specials={ "narrow", 0x300D },
+ textclass="close",
unicodeslot=0xFF63,
},
[0xFF64]={
@@ -131299,7 +134492,7 @@ characters.data={
description="FULLWIDTH CENT SIGN",
direction="et",
linebreak="po",
- specials={ "wide", 0x00A2 },
+ specials={ "wide", 0xA2 },
unicodeslot=0xFFE0,
},
[0xFFE1]={
@@ -131309,7 +134502,7 @@ characters.data={
description="FULLWIDTH POUND SIGN",
direction="et",
linebreak="pr",
- specials={ "wide", 0x00A3 },
+ specials={ "wide", 0xA3 },
unicodeslot=0xFFE1,
},
[0xFFE2]={
@@ -131318,7 +134511,7 @@ characters.data={
description="FULLWIDTH NOT SIGN",
direction="on",
linebreak="id",
- specials={ "wide", 0x00AC },
+ specials={ "wide", 0xAC },
unicodeslot=0xFFE2,
},
[0xFFE3]={
@@ -131328,7 +134521,7 @@ characters.data={
description="FULLWIDTH MACRON",
direction="on",
linebreak="id",
- specials={ "wide", 0x00AF },
+ specials={ "wide", 0xAF },
unicodeslot=0xFFE3,
},
[0xFFE4]={
@@ -131337,7 +134530,7 @@ characters.data={
description="FULLWIDTH BROKEN BAR",
direction="on",
linebreak="id",
- specials={ "wide", 0x00A6 },
+ specials={ "wide", 0xA6 },
unicodeslot=0xFFE4,
},
[0xFFE5]={
@@ -131347,7 +134540,7 @@ characters.data={
description="FULLWIDTH YEN SIGN",
direction="et",
linebreak="pr",
- specials={ "wide", 0x00A5 },
+ specials={ "wide", 0xA5 },
unicodeslot=0xFFE5,
},
[0xFFE6]={
@@ -133863,6 +137056,20 @@ characters.data={
linebreak="al",
unicodeslot=0x1018A,
},
+ [0x1018B]={
+ category="no",
+ description="GREEK ONE QUARTER SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1018B,
+ },
+ [0x1018C]={
+ category="so",
+ description="GREEK SINUSOID SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1018C,
+ },
[0x10190]={
category="so",
description="ROMAN SEXTANS SIGN",
@@ -133947,6 +137154,13 @@ characters.data={
linebreak="al",
unicodeslot=0x1019B,
},
+ [0x101A0]={
+ category="so",
+ description="GREEK SYMBOL TAU RHO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x101A0,
+ },
[0x101D0]={
category="so",
description="PHAISTOS DISC SIGN PEDESTRIAN",
@@ -134264,6 +137478,7 @@ characters.data={
},
[0x101FD]={
category="mn",
+ combining=0xDC,
description="PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE",
direction="nsm",
linebreak="cm",
@@ -134815,6 +138030,203 @@ characters.data={
linebreak="al",
unicodeslot=0x102D0,
},
+ [0x102E0]={
+ category="mn",
+ combining=0xDC,
+ description="COPTIC EPACT THOUSANDS MARK",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x102E0,
+ },
+ [0x102E1]={
+ category="no",
+ description="COPTIC EPACT DIGIT ONE",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102E1,
+ },
+ [0x102E2]={
+ category="no",
+ description="COPTIC EPACT DIGIT TWO",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102E2,
+ },
+ [0x102E3]={
+ category="no",
+ description="COPTIC EPACT DIGIT THREE",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102E3,
+ },
+ [0x102E4]={
+ category="no",
+ description="COPTIC EPACT DIGIT FOUR",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102E4,
+ },
+ [0x102E5]={
+ category="no",
+ description="COPTIC EPACT DIGIT FIVE",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102E5,
+ },
+ [0x102E6]={
+ category="no",
+ description="COPTIC EPACT DIGIT SIX",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102E6,
+ },
+ [0x102E7]={
+ category="no",
+ description="COPTIC EPACT DIGIT SEVEN",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102E7,
+ },
+ [0x102E8]={
+ category="no",
+ description="COPTIC EPACT DIGIT EIGHT",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102E8,
+ },
+ [0x102E9]={
+ category="no",
+ description="COPTIC EPACT DIGIT NINE",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102E9,
+ },
+ [0x102EA]={
+ category="no",
+ description="COPTIC EPACT NUMBER TEN",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102EA,
+ },
+ [0x102EB]={
+ category="no",
+ description="COPTIC EPACT NUMBER TWENTY",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102EB,
+ },
+ [0x102EC]={
+ category="no",
+ description="COPTIC EPACT NUMBER THIRTY",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102EC,
+ },
+ [0x102ED]={
+ category="no",
+ description="COPTIC EPACT NUMBER FORTY",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102ED,
+ },
+ [0x102EE]={
+ category="no",
+ description="COPTIC EPACT NUMBER FIFTY",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102EE,
+ },
+ [0x102EF]={
+ category="no",
+ description="COPTIC EPACT NUMBER SIXTY",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102EF,
+ },
+ [0x102F0]={
+ category="no",
+ description="COPTIC EPACT NUMBER SEVENTY",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102F0,
+ },
+ [0x102F1]={
+ category="no",
+ description="COPTIC EPACT NUMBER EIGHTY",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102F1,
+ },
+ [0x102F2]={
+ category="no",
+ description="COPTIC EPACT NUMBER NINETY",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102F2,
+ },
+ [0x102F3]={
+ category="no",
+ description="COPTIC EPACT NUMBER ONE HUNDRED",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102F3,
+ },
+ [0x102F4]={
+ category="no",
+ description="COPTIC EPACT NUMBER TWO HUNDRED",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102F4,
+ },
+ [0x102F5]={
+ category="no",
+ description="COPTIC EPACT NUMBER THREE HUNDRED",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102F5,
+ },
+ [0x102F6]={
+ category="no",
+ description="COPTIC EPACT NUMBER FOUR HUNDRED",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102F6,
+ },
+ [0x102F7]={
+ category="no",
+ description="COPTIC EPACT NUMBER FIVE HUNDRED",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102F7,
+ },
+ [0x102F8]={
+ category="no",
+ description="COPTIC EPACT NUMBER SIX HUNDRED",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102F8,
+ },
+ [0x102F9]={
+ category="no",
+ description="COPTIC EPACT NUMBER SEVEN HUNDRED",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102F9,
+ },
+ [0x102FA]={
+ category="no",
+ description="COPTIC EPACT NUMBER EIGHT HUNDRED",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102FA,
+ },
+ [0x102FB]={
+ category="no",
+ description="COPTIC EPACT NUMBER NINE HUNDRED",
+ direction="en",
+ linebreak="al",
+ unicodeslot=0x102FB,
+ },
[0x10300]={
category="lo",
description="OLD ITALIC LETTER A",
@@ -135032,6 +138444,13 @@ characters.data={
linebreak="al",
unicodeslot=0x1031E,
},
+ [0x1031F]={
+ category="lo",
+ description="OLD ITALIC LETTER ESS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1031F,
+ },
[0x10320]={
category="no",
description="OLD ITALIC NUMERAL ONE",
@@ -135249,6 +138668,312 @@ characters.data={
linebreak="al",
unicodeslot=0x1034A,
},
+ [0x10350]={
+ category="lo",
+ description="OLD PERMIC LETTER AN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10350,
+ },
+ [0x10351]={
+ category="lo",
+ description="OLD PERMIC LETTER BUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10351,
+ },
+ [0x10352]={
+ category="lo",
+ description="OLD PERMIC LETTER GAI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10352,
+ },
+ [0x10353]={
+ category="lo",
+ description="OLD PERMIC LETTER DOI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10353,
+ },
+ [0x10354]={
+ category="lo",
+ description="OLD PERMIC LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10354,
+ },
+ [0x10355]={
+ category="lo",
+ description="OLD PERMIC LETTER ZHOI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10355,
+ },
+ [0x10356]={
+ category="lo",
+ description="OLD PERMIC LETTER DZHOI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10356,
+ },
+ [0x10357]={
+ category="lo",
+ description="OLD PERMIC LETTER ZATA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10357,
+ },
+ [0x10358]={
+ category="lo",
+ description="OLD PERMIC LETTER DZITA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10358,
+ },
+ [0x10359]={
+ category="lo",
+ description="OLD PERMIC LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10359,
+ },
+ [0x1035A]={
+ category="lo",
+ description="OLD PERMIC LETTER KOKE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1035A,
+ },
+ [0x1035B]={
+ category="lo",
+ description="OLD PERMIC LETTER LEI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1035B,
+ },
+ [0x1035C]={
+ category="lo",
+ description="OLD PERMIC LETTER MENOE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1035C,
+ },
+ [0x1035D]={
+ category="lo",
+ description="OLD PERMIC LETTER NENOE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1035D,
+ },
+ [0x1035E]={
+ category="lo",
+ description="OLD PERMIC LETTER VOOI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1035E,
+ },
+ [0x1035F]={
+ category="lo",
+ description="OLD PERMIC LETTER PEEI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1035F,
+ },
+ [0x10360]={
+ category="lo",
+ description="OLD PERMIC LETTER REI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10360,
+ },
+ [0x10361]={
+ category="lo",
+ description="OLD PERMIC LETTER SII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10361,
+ },
+ [0x10362]={
+ category="lo",
+ description="OLD PERMIC LETTER TAI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10362,
+ },
+ [0x10363]={
+ category="lo",
+ description="OLD PERMIC LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10363,
+ },
+ [0x10364]={
+ category="lo",
+ description="OLD PERMIC LETTER CHERY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10364,
+ },
+ [0x10365]={
+ category="lo",
+ description="OLD PERMIC LETTER SHOOI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10365,
+ },
+ [0x10366]={
+ category="lo",
+ description="OLD PERMIC LETTER SHCHOOI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10366,
+ },
+ [0x10367]={
+ category="lo",
+ description="OLD PERMIC LETTER YRY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10367,
+ },
+ [0x10368]={
+ category="lo",
+ description="OLD PERMIC LETTER YERU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10368,
+ },
+ [0x10369]={
+ category="lo",
+ description="OLD PERMIC LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10369,
+ },
+ [0x1036A]={
+ category="lo",
+ description="OLD PERMIC LETTER OO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1036A,
+ },
+ [0x1036B]={
+ category="lo",
+ description="OLD PERMIC LETTER EF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1036B,
+ },
+ [0x1036C]={
+ category="lo",
+ description="OLD PERMIC LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1036C,
+ },
+ [0x1036D]={
+ category="lo",
+ description="OLD PERMIC LETTER TSIU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1036D,
+ },
+ [0x1036E]={
+ category="lo",
+ description="OLD PERMIC LETTER VER",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1036E,
+ },
+ [0x1036F]={
+ category="lo",
+ description="OLD PERMIC LETTER YER",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1036F,
+ },
+ [0x10370]={
+ category="lo",
+ description="OLD PERMIC LETTER YERI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10370,
+ },
+ [0x10371]={
+ category="lo",
+ description="OLD PERMIC LETTER YAT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10371,
+ },
+ [0x10372]={
+ category="lo",
+ description="OLD PERMIC LETTER IE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10372,
+ },
+ [0x10373]={
+ category="lo",
+ description="OLD PERMIC LETTER YU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10373,
+ },
+ [0x10374]={
+ category="lo",
+ description="OLD PERMIC LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10374,
+ },
+ [0x10375]={
+ category="lo",
+ description="OLD PERMIC LETTER IA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10375,
+ },
+ [0x10376]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING OLD PERMIC LETTER AN",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x10376,
+ },
+ [0x10377]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING OLD PERMIC LETTER DOI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x10377,
+ },
+ [0x10378]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING OLD PERMIC LETTER ZATA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x10378,
+ },
+ [0x10379]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING OLD PERMIC LETTER NENOE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x10379,
+ },
+ [0x1037A]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING OLD PERMIC LETTER SII",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1037A,
+ },
[0x10380]={
category="lo",
description="UGARITIC LETTER ALPA",
@@ -137072,6 +140797,3044 @@ characters.data={
linebreak="nu",
unicodeslot=0x104A9,
},
+ [0x10500]={
+ category="lo",
+ description="ELBASAN LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10500,
+ },
+ [0x10501]={
+ category="lo",
+ description="ELBASAN LETTER BE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10501,
+ },
+ [0x10502]={
+ category="lo",
+ description="ELBASAN LETTER CE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10502,
+ },
+ [0x10503]={
+ category="lo",
+ description="ELBASAN LETTER CHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10503,
+ },
+ [0x10504]={
+ category="lo",
+ description="ELBASAN LETTER DE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10504,
+ },
+ [0x10505]={
+ category="lo",
+ description="ELBASAN LETTER NDE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10505,
+ },
+ [0x10506]={
+ category="lo",
+ description="ELBASAN LETTER DHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10506,
+ },
+ [0x10507]={
+ category="lo",
+ description="ELBASAN LETTER EI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10507,
+ },
+ [0x10508]={
+ category="lo",
+ description="ELBASAN LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10508,
+ },
+ [0x10509]={
+ category="lo",
+ description="ELBASAN LETTER FE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10509,
+ },
+ [0x1050A]={
+ category="lo",
+ description="ELBASAN LETTER GE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1050A,
+ },
+ [0x1050B]={
+ category="lo",
+ description="ELBASAN LETTER GJE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1050B,
+ },
+ [0x1050C]={
+ category="lo",
+ description="ELBASAN LETTER HE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1050C,
+ },
+ [0x1050D]={
+ category="lo",
+ description="ELBASAN LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1050D,
+ },
+ [0x1050E]={
+ category="lo",
+ description="ELBASAN LETTER JE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1050E,
+ },
+ [0x1050F]={
+ category="lo",
+ description="ELBASAN LETTER KE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1050F,
+ },
+ [0x10510]={
+ category="lo",
+ description="ELBASAN LETTER LE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10510,
+ },
+ [0x10511]={
+ category="lo",
+ description="ELBASAN LETTER LLE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10511,
+ },
+ [0x10512]={
+ category="lo",
+ description="ELBASAN LETTER ME",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10512,
+ },
+ [0x10513]={
+ category="lo",
+ description="ELBASAN LETTER NE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10513,
+ },
+ [0x10514]={
+ category="lo",
+ description="ELBASAN LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10514,
+ },
+ [0x10515]={
+ category="lo",
+ description="ELBASAN LETTER NJE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10515,
+ },
+ [0x10516]={
+ category="lo",
+ description="ELBASAN LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10516,
+ },
+ [0x10517]={
+ category="lo",
+ description="ELBASAN LETTER PE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10517,
+ },
+ [0x10518]={
+ category="lo",
+ description="ELBASAN LETTER QE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10518,
+ },
+ [0x10519]={
+ category="lo",
+ description="ELBASAN LETTER RE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10519,
+ },
+ [0x1051A]={
+ category="lo",
+ description="ELBASAN LETTER RRE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1051A,
+ },
+ [0x1051B]={
+ category="lo",
+ description="ELBASAN LETTER SE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1051B,
+ },
+ [0x1051C]={
+ category="lo",
+ description="ELBASAN LETTER SHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1051C,
+ },
+ [0x1051D]={
+ category="lo",
+ description="ELBASAN LETTER TE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1051D,
+ },
+ [0x1051E]={
+ category="lo",
+ description="ELBASAN LETTER THE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1051E,
+ },
+ [0x1051F]={
+ category="lo",
+ description="ELBASAN LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1051F,
+ },
+ [0x10520]={
+ category="lo",
+ description="ELBASAN LETTER VE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10520,
+ },
+ [0x10521]={
+ category="lo",
+ description="ELBASAN LETTER XE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10521,
+ },
+ [0x10522]={
+ category="lo",
+ description="ELBASAN LETTER Y",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10522,
+ },
+ [0x10523]={
+ category="lo",
+ description="ELBASAN LETTER ZE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10523,
+ },
+ [0x10524]={
+ category="lo",
+ description="ELBASAN LETTER ZHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10524,
+ },
+ [0x10525]={
+ category="lo",
+ description="ELBASAN LETTER GHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10525,
+ },
+ [0x10526]={
+ category="lo",
+ description="ELBASAN LETTER GHAMMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10526,
+ },
+ [0x10527]={
+ category="lo",
+ description="ELBASAN LETTER KHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10527,
+ },
+ [0x10530]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER ALT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10530,
+ },
+ [0x10531]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER BET",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10531,
+ },
+ [0x10532]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER GIM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10532,
+ },
+ [0x10533]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER DAT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10533,
+ },
+ [0x10534]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER EB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10534,
+ },
+ [0x10535]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER ZARL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10535,
+ },
+ [0x10536]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER EYN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10536,
+ },
+ [0x10537]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER ZHIL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10537,
+ },
+ [0x10538]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER TAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10538,
+ },
+ [0x10539]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10539,
+ },
+ [0x1053A]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER YOWD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1053A,
+ },
+ [0x1053B]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER ZHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1053B,
+ },
+ [0x1053C]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER IRB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1053C,
+ },
+ [0x1053D]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1053D,
+ },
+ [0x1053E]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER LAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1053E,
+ },
+ [0x1053F]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER INYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1053F,
+ },
+ [0x10540]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER XEYN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10540,
+ },
+ [0x10541]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER DYAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10541,
+ },
+ [0x10542]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER CAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10542,
+ },
+ [0x10543]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER JHOX",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10543,
+ },
+ [0x10544]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER KAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10544,
+ },
+ [0x10545]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER LYIT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10545,
+ },
+ [0x10546]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER HEYT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10546,
+ },
+ [0x10547]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER QAY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10547,
+ },
+ [0x10548]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER AOR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10548,
+ },
+ [0x10549]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER CHOY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10549,
+ },
+ [0x1054A]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER CHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1054A,
+ },
+ [0x1054B]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER CYAY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1054B,
+ },
+ [0x1054C]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER MAQ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1054C,
+ },
+ [0x1054D]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER QAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1054D,
+ },
+ [0x1054E]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER NOWC",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1054E,
+ },
+ [0x1054F]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER DZYAY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1054F,
+ },
+ [0x10550]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER SHAK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10550,
+ },
+ [0x10551]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER JAYN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10551,
+ },
+ [0x10552]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER ON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10552,
+ },
+ [0x10553]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER TYAY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10553,
+ },
+ [0x10554]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER FAM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10554,
+ },
+ [0x10555]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER DZAY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10555,
+ },
+ [0x10556]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER CHAT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10556,
+ },
+ [0x10557]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER PEN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10557,
+ },
+ [0x10558]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER GHEYS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10558,
+ },
+ [0x10559]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER RAT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10559,
+ },
+ [0x1055A]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER SEYK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1055A,
+ },
+ [0x1055B]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER VEYZ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1055B,
+ },
+ [0x1055C]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER TIWR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1055C,
+ },
+ [0x1055D]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER SHOY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1055D,
+ },
+ [0x1055E]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER IWN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1055E,
+ },
+ [0x1055F]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER CYAW",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1055F,
+ },
+ [0x10560]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER CAYN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10560,
+ },
+ [0x10561]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER YAYD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10561,
+ },
+ [0x10562]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER PIWR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10562,
+ },
+ [0x10563]={
+ category="lo",
+ description="CAUCASIAN ALBANIAN LETTER KIW",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10563,
+ },
+ [0x1056F]={
+ category="po",
+ description="CAUCASIAN ALBANIAN CITATION MARK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1056F,
+ },
+ [0x10600]={
+ category="lo",
+ description="LINEAR A SIGN AB001",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10600,
+ },
+ [0x10601]={
+ category="lo",
+ description="LINEAR A SIGN AB002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10601,
+ },
+ [0x10602]={
+ category="lo",
+ description="LINEAR A SIGN AB003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10602,
+ },
+ [0x10603]={
+ category="lo",
+ description="LINEAR A SIGN AB004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10603,
+ },
+ [0x10604]={
+ category="lo",
+ description="LINEAR A SIGN AB005",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10604,
+ },
+ [0x10605]={
+ category="lo",
+ description="LINEAR A SIGN AB006",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10605,
+ },
+ [0x10606]={
+ category="lo",
+ description="LINEAR A SIGN AB007",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10606,
+ },
+ [0x10607]={
+ category="lo",
+ description="LINEAR A SIGN AB008",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10607,
+ },
+ [0x10608]={
+ category="lo",
+ description="LINEAR A SIGN AB009",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10608,
+ },
+ [0x10609]={
+ category="lo",
+ description="LINEAR A SIGN AB010",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10609,
+ },
+ [0x1060A]={
+ category="lo",
+ description="LINEAR A SIGN AB011",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1060A,
+ },
+ [0x1060B]={
+ category="lo",
+ description="LINEAR A SIGN AB013",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1060B,
+ },
+ [0x1060C]={
+ category="lo",
+ description="LINEAR A SIGN AB016",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1060C,
+ },
+ [0x1060D]={
+ category="lo",
+ description="LINEAR A SIGN AB017",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1060D,
+ },
+ [0x1060E]={
+ category="lo",
+ description="LINEAR A SIGN AB020",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1060E,
+ },
+ [0x1060F]={
+ category="lo",
+ description="LINEAR A SIGN AB021",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1060F,
+ },
+ [0x10610]={
+ category="lo",
+ description="LINEAR A SIGN AB021F",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10610,
+ },
+ [0x10611]={
+ category="lo",
+ description="LINEAR A SIGN AB021M",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10611,
+ },
+ [0x10612]={
+ category="lo",
+ description="LINEAR A SIGN AB022",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10612,
+ },
+ [0x10613]={
+ category="lo",
+ description="LINEAR A SIGN AB022F",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10613,
+ },
+ [0x10614]={
+ category="lo",
+ description="LINEAR A SIGN AB022M",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10614,
+ },
+ [0x10615]={
+ category="lo",
+ description="LINEAR A SIGN AB023",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10615,
+ },
+ [0x10616]={
+ category="lo",
+ description="LINEAR A SIGN AB023M",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10616,
+ },
+ [0x10617]={
+ category="lo",
+ description="LINEAR A SIGN AB024",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10617,
+ },
+ [0x10618]={
+ category="lo",
+ description="LINEAR A SIGN AB026",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10618,
+ },
+ [0x10619]={
+ category="lo",
+ description="LINEAR A SIGN AB027",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10619,
+ },
+ [0x1061A]={
+ category="lo",
+ description="LINEAR A SIGN AB028",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1061A,
+ },
+ [0x1061B]={
+ category="lo",
+ description="LINEAR A SIGN A028B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1061B,
+ },
+ [0x1061C]={
+ category="lo",
+ description="LINEAR A SIGN AB029",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1061C,
+ },
+ [0x1061D]={
+ category="lo",
+ description="LINEAR A SIGN AB030",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1061D,
+ },
+ [0x1061E]={
+ category="lo",
+ description="LINEAR A SIGN AB031",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1061E,
+ },
+ [0x1061F]={
+ category="lo",
+ description="LINEAR A SIGN AB034",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1061F,
+ },
+ [0x10620]={
+ category="lo",
+ description="LINEAR A SIGN AB037",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10620,
+ },
+ [0x10621]={
+ category="lo",
+ description="LINEAR A SIGN AB038",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10621,
+ },
+ [0x10622]={
+ category="lo",
+ description="LINEAR A SIGN AB039",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10622,
+ },
+ [0x10623]={
+ category="lo",
+ description="LINEAR A SIGN AB040",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10623,
+ },
+ [0x10624]={
+ category="lo",
+ description="LINEAR A SIGN AB041",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10624,
+ },
+ [0x10625]={
+ category="lo",
+ description="LINEAR A SIGN AB044",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10625,
+ },
+ [0x10626]={
+ category="lo",
+ description="LINEAR A SIGN AB045",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10626,
+ },
+ [0x10627]={
+ category="lo",
+ description="LINEAR A SIGN AB046",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10627,
+ },
+ [0x10628]={
+ category="lo",
+ description="LINEAR A SIGN AB047",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10628,
+ },
+ [0x10629]={
+ category="lo",
+ description="LINEAR A SIGN AB048",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10629,
+ },
+ [0x1062A]={
+ category="lo",
+ description="LINEAR A SIGN AB049",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1062A,
+ },
+ [0x1062B]={
+ category="lo",
+ description="LINEAR A SIGN AB050",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1062B,
+ },
+ [0x1062C]={
+ category="lo",
+ description="LINEAR A SIGN AB051",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1062C,
+ },
+ [0x1062D]={
+ category="lo",
+ description="LINEAR A SIGN AB053",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1062D,
+ },
+ [0x1062E]={
+ category="lo",
+ description="LINEAR A SIGN AB054",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1062E,
+ },
+ [0x1062F]={
+ category="lo",
+ description="LINEAR A SIGN AB055",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1062F,
+ },
+ [0x10630]={
+ category="lo",
+ description="LINEAR A SIGN AB056",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10630,
+ },
+ [0x10631]={
+ category="lo",
+ description="LINEAR A SIGN AB057",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10631,
+ },
+ [0x10632]={
+ category="lo",
+ description="LINEAR A SIGN AB058",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10632,
+ },
+ [0x10633]={
+ category="lo",
+ description="LINEAR A SIGN AB059",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10633,
+ },
+ [0x10634]={
+ category="lo",
+ description="LINEAR A SIGN AB060",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10634,
+ },
+ [0x10635]={
+ category="lo",
+ description="LINEAR A SIGN AB061",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10635,
+ },
+ [0x10636]={
+ category="lo",
+ description="LINEAR A SIGN AB065",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10636,
+ },
+ [0x10637]={
+ category="lo",
+ description="LINEAR A SIGN AB066",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10637,
+ },
+ [0x10638]={
+ category="lo",
+ description="LINEAR A SIGN AB067",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10638,
+ },
+ [0x10639]={
+ category="lo",
+ description="LINEAR A SIGN AB069",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10639,
+ },
+ [0x1063A]={
+ category="lo",
+ description="LINEAR A SIGN AB070",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1063A,
+ },
+ [0x1063B]={
+ category="lo",
+ description="LINEAR A SIGN AB073",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1063B,
+ },
+ [0x1063C]={
+ category="lo",
+ description="LINEAR A SIGN AB074",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1063C,
+ },
+ [0x1063D]={
+ category="lo",
+ description="LINEAR A SIGN AB076",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1063D,
+ },
+ [0x1063E]={
+ category="lo",
+ description="LINEAR A SIGN AB077",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1063E,
+ },
+ [0x1063F]={
+ category="lo",
+ description="LINEAR A SIGN AB078",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1063F,
+ },
+ [0x10640]={
+ category="lo",
+ description="LINEAR A SIGN AB079",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10640,
+ },
+ [0x10641]={
+ category="lo",
+ description="LINEAR A SIGN AB080",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10641,
+ },
+ [0x10642]={
+ category="lo",
+ description="LINEAR A SIGN AB081",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10642,
+ },
+ [0x10643]={
+ category="lo",
+ description="LINEAR A SIGN AB082",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10643,
+ },
+ [0x10644]={
+ category="lo",
+ description="LINEAR A SIGN AB085",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10644,
+ },
+ [0x10645]={
+ category="lo",
+ description="LINEAR A SIGN AB086",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10645,
+ },
+ [0x10646]={
+ category="lo",
+ description="LINEAR A SIGN AB087",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10646,
+ },
+ [0x10647]={
+ category="lo",
+ description="LINEAR A SIGN A100-102",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10647,
+ },
+ [0x10648]={
+ category="lo",
+ description="LINEAR A SIGN AB118",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10648,
+ },
+ [0x10649]={
+ category="lo",
+ description="LINEAR A SIGN AB120",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10649,
+ },
+ [0x1064A]={
+ category="lo",
+ description="LINEAR A SIGN A120B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1064A,
+ },
+ [0x1064B]={
+ category="lo",
+ description="LINEAR A SIGN AB122",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1064B,
+ },
+ [0x1064C]={
+ category="lo",
+ description="LINEAR A SIGN AB123",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1064C,
+ },
+ [0x1064D]={
+ category="lo",
+ description="LINEAR A SIGN AB131A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1064D,
+ },
+ [0x1064E]={
+ category="lo",
+ description="LINEAR A SIGN AB131B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1064E,
+ },
+ [0x1064F]={
+ category="lo",
+ description="LINEAR A SIGN A131C",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1064F,
+ },
+ [0x10650]={
+ category="lo",
+ description="LINEAR A SIGN AB164",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10650,
+ },
+ [0x10651]={
+ category="lo",
+ description="LINEAR A SIGN AB171",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10651,
+ },
+ [0x10652]={
+ category="lo",
+ description="LINEAR A SIGN AB180",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10652,
+ },
+ [0x10653]={
+ category="lo",
+ description="LINEAR A SIGN AB188",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10653,
+ },
+ [0x10654]={
+ category="lo",
+ description="LINEAR A SIGN AB191",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10654,
+ },
+ [0x10655]={
+ category="lo",
+ description="LINEAR A SIGN A301",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10655,
+ },
+ [0x10656]={
+ category="lo",
+ description="LINEAR A SIGN A302",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10656,
+ },
+ [0x10657]={
+ category="lo",
+ description="LINEAR A SIGN A303",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10657,
+ },
+ [0x10658]={
+ category="lo",
+ description="LINEAR A SIGN A304",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10658,
+ },
+ [0x10659]={
+ category="lo",
+ description="LINEAR A SIGN A305",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10659,
+ },
+ [0x1065A]={
+ category="lo",
+ description="LINEAR A SIGN A306",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1065A,
+ },
+ [0x1065B]={
+ category="lo",
+ description="LINEAR A SIGN A307",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1065B,
+ },
+ [0x1065C]={
+ category="lo",
+ description="LINEAR A SIGN A308",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1065C,
+ },
+ [0x1065D]={
+ category="lo",
+ description="LINEAR A SIGN A309A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1065D,
+ },
+ [0x1065E]={
+ category="lo",
+ description="LINEAR A SIGN A309B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1065E,
+ },
+ [0x1065F]={
+ category="lo",
+ description="LINEAR A SIGN A309C",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1065F,
+ },
+ [0x10660]={
+ category="lo",
+ description="LINEAR A SIGN A310",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10660,
+ },
+ [0x10661]={
+ category="lo",
+ description="LINEAR A SIGN A311",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10661,
+ },
+ [0x10662]={
+ category="lo",
+ description="LINEAR A SIGN A312",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10662,
+ },
+ [0x10663]={
+ category="lo",
+ description="LINEAR A SIGN A313A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10663,
+ },
+ [0x10664]={
+ category="lo",
+ description="LINEAR A SIGN A313B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10664,
+ },
+ [0x10665]={
+ category="lo",
+ description="LINEAR A SIGN A313C",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10665,
+ },
+ [0x10666]={
+ category="lo",
+ description="LINEAR A SIGN A314",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10666,
+ },
+ [0x10667]={
+ category="lo",
+ description="LINEAR A SIGN A315",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10667,
+ },
+ [0x10668]={
+ category="lo",
+ description="LINEAR A SIGN A316",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10668,
+ },
+ [0x10669]={
+ category="lo",
+ description="LINEAR A SIGN A317",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10669,
+ },
+ [0x1066A]={
+ category="lo",
+ description="LINEAR A SIGN A318",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1066A,
+ },
+ [0x1066B]={
+ category="lo",
+ description="LINEAR A SIGN A319",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1066B,
+ },
+ [0x1066C]={
+ category="lo",
+ description="LINEAR A SIGN A320",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1066C,
+ },
+ [0x1066D]={
+ category="lo",
+ description="LINEAR A SIGN A321",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1066D,
+ },
+ [0x1066E]={
+ category="lo",
+ description="LINEAR A SIGN A322",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1066E,
+ },
+ [0x1066F]={
+ category="lo",
+ description="LINEAR A SIGN A323",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1066F,
+ },
+ [0x10670]={
+ category="lo",
+ description="LINEAR A SIGN A324",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10670,
+ },
+ [0x10671]={
+ category="lo",
+ description="LINEAR A SIGN A325",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10671,
+ },
+ [0x10672]={
+ category="lo",
+ description="LINEAR A SIGN A326",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10672,
+ },
+ [0x10673]={
+ category="lo",
+ description="LINEAR A SIGN A327",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10673,
+ },
+ [0x10674]={
+ category="lo",
+ description="LINEAR A SIGN A328",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10674,
+ },
+ [0x10675]={
+ category="lo",
+ description="LINEAR A SIGN A329",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10675,
+ },
+ [0x10676]={
+ category="lo",
+ description="LINEAR A SIGN A330",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10676,
+ },
+ [0x10677]={
+ category="lo",
+ description="LINEAR A SIGN A331",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10677,
+ },
+ [0x10678]={
+ category="lo",
+ description="LINEAR A SIGN A332",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10678,
+ },
+ [0x10679]={
+ category="lo",
+ description="LINEAR A SIGN A333",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10679,
+ },
+ [0x1067A]={
+ category="lo",
+ description="LINEAR A SIGN A334",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1067A,
+ },
+ [0x1067B]={
+ category="lo",
+ description="LINEAR A SIGN A335",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1067B,
+ },
+ [0x1067C]={
+ category="lo",
+ description="LINEAR A SIGN A336",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1067C,
+ },
+ [0x1067D]={
+ category="lo",
+ description="LINEAR A SIGN A337",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1067D,
+ },
+ [0x1067E]={
+ category="lo",
+ description="LINEAR A SIGN A338",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1067E,
+ },
+ [0x1067F]={
+ category="lo",
+ description="LINEAR A SIGN A339",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1067F,
+ },
+ [0x10680]={
+ category="lo",
+ description="LINEAR A SIGN A340",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10680,
+ },
+ [0x10681]={
+ category="lo",
+ description="LINEAR A SIGN A341",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10681,
+ },
+ [0x10682]={
+ category="lo",
+ description="LINEAR A SIGN A342",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10682,
+ },
+ [0x10683]={
+ category="lo",
+ description="LINEAR A SIGN A343",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10683,
+ },
+ [0x10684]={
+ category="lo",
+ description="LINEAR A SIGN A344",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10684,
+ },
+ [0x10685]={
+ category="lo",
+ description="LINEAR A SIGN A345",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10685,
+ },
+ [0x10686]={
+ category="lo",
+ description="LINEAR A SIGN A346",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10686,
+ },
+ [0x10687]={
+ category="lo",
+ description="LINEAR A SIGN A347",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10687,
+ },
+ [0x10688]={
+ category="lo",
+ description="LINEAR A SIGN A348",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10688,
+ },
+ [0x10689]={
+ category="lo",
+ description="LINEAR A SIGN A349",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10689,
+ },
+ [0x1068A]={
+ category="lo",
+ description="LINEAR A SIGN A350",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1068A,
+ },
+ [0x1068B]={
+ category="lo",
+ description="LINEAR A SIGN A351",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1068B,
+ },
+ [0x1068C]={
+ category="lo",
+ description="LINEAR A SIGN A352",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1068C,
+ },
+ [0x1068D]={
+ category="lo",
+ description="LINEAR A SIGN A353",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1068D,
+ },
+ [0x1068E]={
+ category="lo",
+ description="LINEAR A SIGN A354",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1068E,
+ },
+ [0x1068F]={
+ category="lo",
+ description="LINEAR A SIGN A355",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1068F,
+ },
+ [0x10690]={
+ category="lo",
+ description="LINEAR A SIGN A356",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10690,
+ },
+ [0x10691]={
+ category="lo",
+ description="LINEAR A SIGN A357",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10691,
+ },
+ [0x10692]={
+ category="lo",
+ description="LINEAR A SIGN A358",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10692,
+ },
+ [0x10693]={
+ category="lo",
+ description="LINEAR A SIGN A359",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10693,
+ },
+ [0x10694]={
+ category="lo",
+ description="LINEAR A SIGN A360",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10694,
+ },
+ [0x10695]={
+ category="lo",
+ description="LINEAR A SIGN A361",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10695,
+ },
+ [0x10696]={
+ category="lo",
+ description="LINEAR A SIGN A362",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10696,
+ },
+ [0x10697]={
+ category="lo",
+ description="LINEAR A SIGN A363",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10697,
+ },
+ [0x10698]={
+ category="lo",
+ description="LINEAR A SIGN A364",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10698,
+ },
+ [0x10699]={
+ category="lo",
+ description="LINEAR A SIGN A365",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10699,
+ },
+ [0x1069A]={
+ category="lo",
+ description="LINEAR A SIGN A366",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1069A,
+ },
+ [0x1069B]={
+ category="lo",
+ description="LINEAR A SIGN A367",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1069B,
+ },
+ [0x1069C]={
+ category="lo",
+ description="LINEAR A SIGN A368",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1069C,
+ },
+ [0x1069D]={
+ category="lo",
+ description="LINEAR A SIGN A369",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1069D,
+ },
+ [0x1069E]={
+ category="lo",
+ description="LINEAR A SIGN A370",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1069E,
+ },
+ [0x1069F]={
+ category="lo",
+ description="LINEAR A SIGN A371",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1069F,
+ },
+ [0x106A0]={
+ category="lo",
+ description="LINEAR A SIGN A400-VAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106A0,
+ },
+ [0x106A1]={
+ category="lo",
+ description="LINEAR A SIGN A401-VAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106A1,
+ },
+ [0x106A2]={
+ category="lo",
+ description="LINEAR A SIGN A402-VAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106A2,
+ },
+ [0x106A3]={
+ category="lo",
+ description="LINEAR A SIGN A403-VAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106A3,
+ },
+ [0x106A4]={
+ category="lo",
+ description="LINEAR A SIGN A404-VAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106A4,
+ },
+ [0x106A5]={
+ category="lo",
+ description="LINEAR A SIGN A405-VAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106A5,
+ },
+ [0x106A6]={
+ category="lo",
+ description="LINEAR A SIGN A406-VAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106A6,
+ },
+ [0x106A7]={
+ category="lo",
+ description="LINEAR A SIGN A407-VAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106A7,
+ },
+ [0x106A8]={
+ category="lo",
+ description="LINEAR A SIGN A408-VAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106A8,
+ },
+ [0x106A9]={
+ category="lo",
+ description="LINEAR A SIGN A409-VAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106A9,
+ },
+ [0x106AA]={
+ category="lo",
+ description="LINEAR A SIGN A410-VAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106AA,
+ },
+ [0x106AB]={
+ category="lo",
+ description="LINEAR A SIGN A411-VAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106AB,
+ },
+ [0x106AC]={
+ category="lo",
+ description="LINEAR A SIGN A412-VAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106AC,
+ },
+ [0x106AD]={
+ category="lo",
+ description="LINEAR A SIGN A413-VAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106AD,
+ },
+ [0x106AE]={
+ category="lo",
+ description="LINEAR A SIGN A414-VAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106AE,
+ },
+ [0x106AF]={
+ category="lo",
+ description="LINEAR A SIGN A415-VAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106AF,
+ },
+ [0x106B0]={
+ category="lo",
+ description="LINEAR A SIGN A416-VAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106B0,
+ },
+ [0x106B1]={
+ category="lo",
+ description="LINEAR A SIGN A417-VAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106B1,
+ },
+ [0x106B2]={
+ category="lo",
+ description="LINEAR A SIGN A418-VAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106B2,
+ },
+ [0x106B3]={
+ category="lo",
+ description="LINEAR A SIGN A501",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106B3,
+ },
+ [0x106B4]={
+ category="lo",
+ description="LINEAR A SIGN A502",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106B4,
+ },
+ [0x106B5]={
+ category="lo",
+ description="LINEAR A SIGN A503",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106B5,
+ },
+ [0x106B6]={
+ category="lo",
+ description="LINEAR A SIGN A504",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106B6,
+ },
+ [0x106B7]={
+ category="lo",
+ description="LINEAR A SIGN A505",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106B7,
+ },
+ [0x106B8]={
+ category="lo",
+ description="LINEAR A SIGN A506",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106B8,
+ },
+ [0x106B9]={
+ category="lo",
+ description="LINEAR A SIGN A508",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106B9,
+ },
+ [0x106BA]={
+ category="lo",
+ description="LINEAR A SIGN A509",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106BA,
+ },
+ [0x106BB]={
+ category="lo",
+ description="LINEAR A SIGN A510",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106BB,
+ },
+ [0x106BC]={
+ category="lo",
+ description="LINEAR A SIGN A511",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106BC,
+ },
+ [0x106BD]={
+ category="lo",
+ description="LINEAR A SIGN A512",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106BD,
+ },
+ [0x106BE]={
+ category="lo",
+ description="LINEAR A SIGN A513",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106BE,
+ },
+ [0x106BF]={
+ category="lo",
+ description="LINEAR A SIGN A515",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106BF,
+ },
+ [0x106C0]={
+ category="lo",
+ description="LINEAR A SIGN A516",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106C0,
+ },
+ [0x106C1]={
+ category="lo",
+ description="LINEAR A SIGN A520",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106C1,
+ },
+ [0x106C2]={
+ category="lo",
+ description="LINEAR A SIGN A521",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106C2,
+ },
+ [0x106C3]={
+ category="lo",
+ description="LINEAR A SIGN A523",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106C3,
+ },
+ [0x106C4]={
+ category="lo",
+ description="LINEAR A SIGN A524",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106C4,
+ },
+ [0x106C5]={
+ category="lo",
+ description="LINEAR A SIGN A525",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106C5,
+ },
+ [0x106C6]={
+ category="lo",
+ description="LINEAR A SIGN A526",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106C6,
+ },
+ [0x106C7]={
+ category="lo",
+ description="LINEAR A SIGN A527",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106C7,
+ },
+ [0x106C8]={
+ category="lo",
+ description="LINEAR A SIGN A528",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106C8,
+ },
+ [0x106C9]={
+ category="lo",
+ description="LINEAR A SIGN A529",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106C9,
+ },
+ [0x106CA]={
+ category="lo",
+ description="LINEAR A SIGN A530",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106CA,
+ },
+ [0x106CB]={
+ category="lo",
+ description="LINEAR A SIGN A531",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106CB,
+ },
+ [0x106CC]={
+ category="lo",
+ description="LINEAR A SIGN A532",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106CC,
+ },
+ [0x106CD]={
+ category="lo",
+ description="LINEAR A SIGN A534",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106CD,
+ },
+ [0x106CE]={
+ category="lo",
+ description="LINEAR A SIGN A535",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106CE,
+ },
+ [0x106CF]={
+ category="lo",
+ description="LINEAR A SIGN A536",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106CF,
+ },
+ [0x106D0]={
+ category="lo",
+ description="LINEAR A SIGN A537",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106D0,
+ },
+ [0x106D1]={
+ category="lo",
+ description="LINEAR A SIGN A538",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106D1,
+ },
+ [0x106D2]={
+ category="lo",
+ description="LINEAR A SIGN A539",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106D2,
+ },
+ [0x106D3]={
+ category="lo",
+ description="LINEAR A SIGN A540",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106D3,
+ },
+ [0x106D4]={
+ category="lo",
+ description="LINEAR A SIGN A541",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106D4,
+ },
+ [0x106D5]={
+ category="lo",
+ description="LINEAR A SIGN A542",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106D5,
+ },
+ [0x106D6]={
+ category="lo",
+ description="LINEAR A SIGN A545",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106D6,
+ },
+ [0x106D7]={
+ category="lo",
+ description="LINEAR A SIGN A547",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106D7,
+ },
+ [0x106D8]={
+ category="lo",
+ description="LINEAR A SIGN A548",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106D8,
+ },
+ [0x106D9]={
+ category="lo",
+ description="LINEAR A SIGN A549",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106D9,
+ },
+ [0x106DA]={
+ category="lo",
+ description="LINEAR A SIGN A550",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106DA,
+ },
+ [0x106DB]={
+ category="lo",
+ description="LINEAR A SIGN A551",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106DB,
+ },
+ [0x106DC]={
+ category="lo",
+ description="LINEAR A SIGN A552",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106DC,
+ },
+ [0x106DD]={
+ category="lo",
+ description="LINEAR A SIGN A553",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106DD,
+ },
+ [0x106DE]={
+ category="lo",
+ description="LINEAR A SIGN A554",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106DE,
+ },
+ [0x106DF]={
+ category="lo",
+ description="LINEAR A SIGN A555",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106DF,
+ },
+ [0x106E0]={
+ category="lo",
+ description="LINEAR A SIGN A556",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106E0,
+ },
+ [0x106E1]={
+ category="lo",
+ description="LINEAR A SIGN A557",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106E1,
+ },
+ [0x106E2]={
+ category="lo",
+ description="LINEAR A SIGN A559",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106E2,
+ },
+ [0x106E3]={
+ category="lo",
+ description="LINEAR A SIGN A563",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106E3,
+ },
+ [0x106E4]={
+ category="lo",
+ description="LINEAR A SIGN A564",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106E4,
+ },
+ [0x106E5]={
+ category="lo",
+ description="LINEAR A SIGN A565",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106E5,
+ },
+ [0x106E6]={
+ category="lo",
+ description="LINEAR A SIGN A566",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106E6,
+ },
+ [0x106E7]={
+ category="lo",
+ description="LINEAR A SIGN A568",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106E7,
+ },
+ [0x106E8]={
+ category="lo",
+ description="LINEAR A SIGN A569",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106E8,
+ },
+ [0x106E9]={
+ category="lo",
+ description="LINEAR A SIGN A570",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106E9,
+ },
+ [0x106EA]={
+ category="lo",
+ description="LINEAR A SIGN A571",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106EA,
+ },
+ [0x106EB]={
+ category="lo",
+ description="LINEAR A SIGN A572",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106EB,
+ },
+ [0x106EC]={
+ category="lo",
+ description="LINEAR A SIGN A573",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106EC,
+ },
+ [0x106ED]={
+ category="lo",
+ description="LINEAR A SIGN A574",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106ED,
+ },
+ [0x106EE]={
+ category="lo",
+ description="LINEAR A SIGN A575",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106EE,
+ },
+ [0x106EF]={
+ category="lo",
+ description="LINEAR A SIGN A576",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106EF,
+ },
+ [0x106F0]={
+ category="lo",
+ description="LINEAR A SIGN A577",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106F0,
+ },
+ [0x106F1]={
+ category="lo",
+ description="LINEAR A SIGN A578",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106F1,
+ },
+ [0x106F2]={
+ category="lo",
+ description="LINEAR A SIGN A579",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106F2,
+ },
+ [0x106F3]={
+ category="lo",
+ description="LINEAR A SIGN A580",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106F3,
+ },
+ [0x106F4]={
+ category="lo",
+ description="LINEAR A SIGN A581",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106F4,
+ },
+ [0x106F5]={
+ category="lo",
+ description="LINEAR A SIGN A582",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106F5,
+ },
+ [0x106F6]={
+ category="lo",
+ description="LINEAR A SIGN A583",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106F6,
+ },
+ [0x106F7]={
+ category="lo",
+ description="LINEAR A SIGN A584",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106F7,
+ },
+ [0x106F8]={
+ category="lo",
+ description="LINEAR A SIGN A585",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106F8,
+ },
+ [0x106F9]={
+ category="lo",
+ description="LINEAR A SIGN A586",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106F9,
+ },
+ [0x106FA]={
+ category="lo",
+ description="LINEAR A SIGN A587",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106FA,
+ },
+ [0x106FB]={
+ category="lo",
+ description="LINEAR A SIGN A588",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106FB,
+ },
+ [0x106FC]={
+ category="lo",
+ description="LINEAR A SIGN A589",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106FC,
+ },
+ [0x106FD]={
+ category="lo",
+ description="LINEAR A SIGN A591",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106FD,
+ },
+ [0x106FE]={
+ category="lo",
+ description="LINEAR A SIGN A592",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106FE,
+ },
+ [0x106FF]={
+ category="lo",
+ description="LINEAR A SIGN A594",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x106FF,
+ },
+ [0x10700]={
+ category="lo",
+ description="LINEAR A SIGN A595",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10700,
+ },
+ [0x10701]={
+ category="lo",
+ description="LINEAR A SIGN A596",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10701,
+ },
+ [0x10702]={
+ category="lo",
+ description="LINEAR A SIGN A598",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10702,
+ },
+ [0x10703]={
+ category="lo",
+ description="LINEAR A SIGN A600",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10703,
+ },
+ [0x10704]={
+ category="lo",
+ description="LINEAR A SIGN A601",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10704,
+ },
+ [0x10705]={
+ category="lo",
+ description="LINEAR A SIGN A602",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10705,
+ },
+ [0x10706]={
+ category="lo",
+ description="LINEAR A SIGN A603",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10706,
+ },
+ [0x10707]={
+ category="lo",
+ description="LINEAR A SIGN A604",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10707,
+ },
+ [0x10708]={
+ category="lo",
+ description="LINEAR A SIGN A606",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10708,
+ },
+ [0x10709]={
+ category="lo",
+ description="LINEAR A SIGN A608",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10709,
+ },
+ [0x1070A]={
+ category="lo",
+ description="LINEAR A SIGN A609",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1070A,
+ },
+ [0x1070B]={
+ category="lo",
+ description="LINEAR A SIGN A610",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1070B,
+ },
+ [0x1070C]={
+ category="lo",
+ description="LINEAR A SIGN A611",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1070C,
+ },
+ [0x1070D]={
+ category="lo",
+ description="LINEAR A SIGN A612",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1070D,
+ },
+ [0x1070E]={
+ category="lo",
+ description="LINEAR A SIGN A613",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1070E,
+ },
+ [0x1070F]={
+ category="lo",
+ description="LINEAR A SIGN A614",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1070F,
+ },
+ [0x10710]={
+ category="lo",
+ description="LINEAR A SIGN A615",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10710,
+ },
+ [0x10711]={
+ category="lo",
+ description="LINEAR A SIGN A616",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10711,
+ },
+ [0x10712]={
+ category="lo",
+ description="LINEAR A SIGN A617",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10712,
+ },
+ [0x10713]={
+ category="lo",
+ description="LINEAR A SIGN A618",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10713,
+ },
+ [0x10714]={
+ category="lo",
+ description="LINEAR A SIGN A619",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10714,
+ },
+ [0x10715]={
+ category="lo",
+ description="LINEAR A SIGN A620",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10715,
+ },
+ [0x10716]={
+ category="lo",
+ description="LINEAR A SIGN A621",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10716,
+ },
+ [0x10717]={
+ category="lo",
+ description="LINEAR A SIGN A622",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10717,
+ },
+ [0x10718]={
+ category="lo",
+ description="LINEAR A SIGN A623",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10718,
+ },
+ [0x10719]={
+ category="lo",
+ description="LINEAR A SIGN A624",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10719,
+ },
+ [0x1071A]={
+ category="lo",
+ description="LINEAR A SIGN A626",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1071A,
+ },
+ [0x1071B]={
+ category="lo",
+ description="LINEAR A SIGN A627",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1071B,
+ },
+ [0x1071C]={
+ category="lo",
+ description="LINEAR A SIGN A628",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1071C,
+ },
+ [0x1071D]={
+ category="lo",
+ description="LINEAR A SIGN A629",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1071D,
+ },
+ [0x1071E]={
+ category="lo",
+ description="LINEAR A SIGN A634",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1071E,
+ },
+ [0x1071F]={
+ category="lo",
+ description="LINEAR A SIGN A637",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1071F,
+ },
+ [0x10720]={
+ category="lo",
+ description="LINEAR A SIGN A638",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10720,
+ },
+ [0x10721]={
+ category="lo",
+ description="LINEAR A SIGN A640",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10721,
+ },
+ [0x10722]={
+ category="lo",
+ description="LINEAR A SIGN A642",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10722,
+ },
+ [0x10723]={
+ category="lo",
+ description="LINEAR A SIGN A643",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10723,
+ },
+ [0x10724]={
+ category="lo",
+ description="LINEAR A SIGN A644",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10724,
+ },
+ [0x10725]={
+ category="lo",
+ description="LINEAR A SIGN A645",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10725,
+ },
+ [0x10726]={
+ category="lo",
+ description="LINEAR A SIGN A646",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10726,
+ },
+ [0x10727]={
+ category="lo",
+ description="LINEAR A SIGN A648",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10727,
+ },
+ [0x10728]={
+ category="lo",
+ description="LINEAR A SIGN A649",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10728,
+ },
+ [0x10729]={
+ category="lo",
+ description="LINEAR A SIGN A651",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10729,
+ },
+ [0x1072A]={
+ category="lo",
+ description="LINEAR A SIGN A652",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1072A,
+ },
+ [0x1072B]={
+ category="lo",
+ description="LINEAR A SIGN A653",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1072B,
+ },
+ [0x1072C]={
+ category="lo",
+ description="LINEAR A SIGN A654",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1072C,
+ },
+ [0x1072D]={
+ category="lo",
+ description="LINEAR A SIGN A655",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1072D,
+ },
+ [0x1072E]={
+ category="lo",
+ description="LINEAR A SIGN A656",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1072E,
+ },
+ [0x1072F]={
+ category="lo",
+ description="LINEAR A SIGN A657",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1072F,
+ },
+ [0x10730]={
+ category="lo",
+ description="LINEAR A SIGN A658",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10730,
+ },
+ [0x10731]={
+ category="lo",
+ description="LINEAR A SIGN A659",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10731,
+ },
+ [0x10732]={
+ category="lo",
+ description="LINEAR A SIGN A660",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10732,
+ },
+ [0x10733]={
+ category="lo",
+ description="LINEAR A SIGN A661",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10733,
+ },
+ [0x10734]={
+ category="lo",
+ description="LINEAR A SIGN A662",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10734,
+ },
+ [0x10735]={
+ category="lo",
+ description="LINEAR A SIGN A663",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10735,
+ },
+ [0x10736]={
+ category="lo",
+ description="LINEAR A SIGN A664",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10736,
+ },
+ [0x10740]={
+ category="lo",
+ description="LINEAR A SIGN A701 A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10740,
+ },
+ [0x10741]={
+ category="lo",
+ description="LINEAR A SIGN A702 B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10741,
+ },
+ [0x10742]={
+ category="lo",
+ description="LINEAR A SIGN A703 D",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10742,
+ },
+ [0x10743]={
+ category="lo",
+ description="LINEAR A SIGN A704 E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10743,
+ },
+ [0x10744]={
+ category="lo",
+ description="LINEAR A SIGN A705 F",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10744,
+ },
+ [0x10745]={
+ category="lo",
+ description="LINEAR A SIGN A706 H",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10745,
+ },
+ [0x10746]={
+ category="lo",
+ description="LINEAR A SIGN A707 J",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10746,
+ },
+ [0x10747]={
+ category="lo",
+ description="LINEAR A SIGN A708 K",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10747,
+ },
+ [0x10748]={
+ category="lo",
+ description="LINEAR A SIGN A709 L",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10748,
+ },
+ [0x10749]={
+ category="lo",
+ description="LINEAR A SIGN A709-2 L2",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10749,
+ },
+ [0x1074A]={
+ category="lo",
+ description="LINEAR A SIGN A709-3 L3",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1074A,
+ },
+ [0x1074B]={
+ category="lo",
+ description="LINEAR A SIGN A709-4 L4",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1074B,
+ },
+ [0x1074C]={
+ category="lo",
+ description="LINEAR A SIGN A709-6 L6",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1074C,
+ },
+ [0x1074D]={
+ category="lo",
+ description="LINEAR A SIGN A710 W",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1074D,
+ },
+ [0x1074E]={
+ category="lo",
+ description="LINEAR A SIGN A711 X",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1074E,
+ },
+ [0x1074F]={
+ category="lo",
+ description="LINEAR A SIGN A712 Y",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1074F,
+ },
+ [0x10750]={
+ category="lo",
+ description="LINEAR A SIGN A713 OMEGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10750,
+ },
+ [0x10751]={
+ category="lo",
+ description="LINEAR A SIGN A714 ABB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10751,
+ },
+ [0x10752]={
+ category="lo",
+ description="LINEAR A SIGN A715 BB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10752,
+ },
+ [0x10753]={
+ category="lo",
+ description="LINEAR A SIGN A717 DD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10753,
+ },
+ [0x10754]={
+ category="lo",
+ description="LINEAR A SIGN A726 EYYY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10754,
+ },
+ [0x10755]={
+ category="lo",
+ description="LINEAR A SIGN A732 JE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10755,
+ },
+ [0x10760]={
+ category="lo",
+ description="LINEAR A SIGN A800",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10760,
+ },
+ [0x10761]={
+ category="lo",
+ description="LINEAR A SIGN A801",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10761,
+ },
+ [0x10762]={
+ category="lo",
+ description="LINEAR A SIGN A802",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10762,
+ },
+ [0x10763]={
+ category="lo",
+ description="LINEAR A SIGN A803",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10763,
+ },
+ [0x10764]={
+ category="lo",
+ description="LINEAR A SIGN A804",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10764,
+ },
+ [0x10765]={
+ category="lo",
+ description="LINEAR A SIGN A805",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10765,
+ },
+ [0x10766]={
+ category="lo",
+ description="LINEAR A SIGN A806",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10766,
+ },
+ [0x10767]={
+ category="lo",
+ description="LINEAR A SIGN A807",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10767,
+ },
[0x10800]={
category="lo",
description="CYPRIOT SYLLABLE A",
@@ -137674,6 +144437,510 @@ characters.data={
linebreak="al",
unicodeslot=0x1085F,
},
+ [0x10860]={
+ category="lo",
+ description="PALMYRENE LETTER ALEPH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10860,
+ },
+ [0x10861]={
+ category="lo",
+ description="PALMYRENE LETTER BETH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10861,
+ },
+ [0x10862]={
+ category="lo",
+ description="PALMYRENE LETTER GIMEL",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10862,
+ },
+ [0x10863]={
+ category="lo",
+ description="PALMYRENE LETTER DALETH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10863,
+ },
+ [0x10864]={
+ category="lo",
+ description="PALMYRENE LETTER HE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10864,
+ },
+ [0x10865]={
+ category="lo",
+ description="PALMYRENE LETTER WAW",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10865,
+ },
+ [0x10866]={
+ category="lo",
+ description="PALMYRENE LETTER ZAYIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10866,
+ },
+ [0x10867]={
+ category="lo",
+ description="PALMYRENE LETTER HETH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10867,
+ },
+ [0x10868]={
+ category="lo",
+ description="PALMYRENE LETTER TETH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10868,
+ },
+ [0x10869]={
+ category="lo",
+ description="PALMYRENE LETTER YODH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10869,
+ },
+ [0x1086A]={
+ category="lo",
+ description="PALMYRENE LETTER KAPH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1086A,
+ },
+ [0x1086B]={
+ category="lo",
+ description="PALMYRENE LETTER LAMEDH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1086B,
+ },
+ [0x1086C]={
+ category="lo",
+ description="PALMYRENE LETTER MEM",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1086C,
+ },
+ [0x1086D]={
+ category="lo",
+ description="PALMYRENE LETTER FINAL NUN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1086D,
+ },
+ [0x1086E]={
+ category="lo",
+ description="PALMYRENE LETTER NUN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1086E,
+ },
+ [0x1086F]={
+ category="lo",
+ description="PALMYRENE LETTER SAMEKH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1086F,
+ },
+ [0x10870]={
+ category="lo",
+ description="PALMYRENE LETTER AYIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10870,
+ },
+ [0x10871]={
+ category="lo",
+ description="PALMYRENE LETTER PE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10871,
+ },
+ [0x10872]={
+ category="lo",
+ description="PALMYRENE LETTER SADHE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10872,
+ },
+ [0x10873]={
+ category="lo",
+ description="PALMYRENE LETTER QOPH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10873,
+ },
+ [0x10874]={
+ category="lo",
+ description="PALMYRENE LETTER RESH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10874,
+ },
+ [0x10875]={
+ category="lo",
+ description="PALMYRENE LETTER SHIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10875,
+ },
+ [0x10876]={
+ category="lo",
+ description="PALMYRENE LETTER TAW",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10876,
+ },
+ [0x10877]={
+ category="so",
+ description="PALMYRENE LEFT-POINTING FLEURON",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10877,
+ },
+ [0x10878]={
+ category="so",
+ description="PALMYRENE RIGHT-POINTING FLEURON",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10878,
+ },
+ [0x10879]={
+ category="no",
+ description="PALMYRENE NUMBER ONE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10879,
+ },
+ [0x1087A]={
+ category="no",
+ description="PALMYRENE NUMBER TWO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1087A,
+ },
+ [0x1087B]={
+ category="no",
+ description="PALMYRENE NUMBER THREE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1087B,
+ },
+ [0x1087C]={
+ category="no",
+ description="PALMYRENE NUMBER FOUR",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1087C,
+ },
+ [0x1087D]={
+ category="no",
+ description="PALMYRENE NUMBER FIVE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1087D,
+ },
+ [0x1087E]={
+ category="no",
+ description="PALMYRENE NUMBER TEN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1087E,
+ },
+ [0x1087F]={
+ category="no",
+ description="PALMYRENE NUMBER TWENTY",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1087F,
+ },
+ [0x10880]={
+ category="lo",
+ description="NABATAEAN LETTER FINAL ALEPH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10880,
+ },
+ [0x10881]={
+ category="lo",
+ description="NABATAEAN LETTER ALEPH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10881,
+ },
+ [0x10882]={
+ category="lo",
+ description="NABATAEAN LETTER FINAL BETH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10882,
+ },
+ [0x10883]={
+ category="lo",
+ description="NABATAEAN LETTER BETH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10883,
+ },
+ [0x10884]={
+ category="lo",
+ description="NABATAEAN LETTER GIMEL",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10884,
+ },
+ [0x10885]={
+ category="lo",
+ description="NABATAEAN LETTER DALETH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10885,
+ },
+ [0x10886]={
+ category="lo",
+ description="NABATAEAN LETTER FINAL HE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10886,
+ },
+ [0x10887]={
+ category="lo",
+ description="NABATAEAN LETTER HE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10887,
+ },
+ [0x10888]={
+ category="lo",
+ description="NABATAEAN LETTER WAW",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10888,
+ },
+ [0x10889]={
+ category="lo",
+ description="NABATAEAN LETTER ZAYIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10889,
+ },
+ [0x1088A]={
+ category="lo",
+ description="NABATAEAN LETTER HETH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1088A,
+ },
+ [0x1088B]={
+ category="lo",
+ description="NABATAEAN LETTER TETH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1088B,
+ },
+ [0x1088C]={
+ category="lo",
+ description="NABATAEAN LETTER FINAL YODH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1088C,
+ },
+ [0x1088D]={
+ category="lo",
+ description="NABATAEAN LETTER YODH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1088D,
+ },
+ [0x1088E]={
+ category="lo",
+ description="NABATAEAN LETTER FINAL KAPH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1088E,
+ },
+ [0x1088F]={
+ category="lo",
+ description="NABATAEAN LETTER KAPH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1088F,
+ },
+ [0x10890]={
+ category="lo",
+ description="NABATAEAN LETTER FINAL LAMEDH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10890,
+ },
+ [0x10891]={
+ category="lo",
+ description="NABATAEAN LETTER LAMEDH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10891,
+ },
+ [0x10892]={
+ category="lo",
+ description="NABATAEAN LETTER FINAL MEM",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10892,
+ },
+ [0x10893]={
+ category="lo",
+ description="NABATAEAN LETTER MEM",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10893,
+ },
+ [0x10894]={
+ category="lo",
+ description="NABATAEAN LETTER FINAL NUN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10894,
+ },
+ [0x10895]={
+ category="lo",
+ description="NABATAEAN LETTER NUN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10895,
+ },
+ [0x10896]={
+ category="lo",
+ description="NABATAEAN LETTER SAMEKH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10896,
+ },
+ [0x10897]={
+ category="lo",
+ description="NABATAEAN LETTER AYIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10897,
+ },
+ [0x10898]={
+ category="lo",
+ description="NABATAEAN LETTER PE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10898,
+ },
+ [0x10899]={
+ category="lo",
+ description="NABATAEAN LETTER SADHE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10899,
+ },
+ [0x1089A]={
+ category="lo",
+ description="NABATAEAN LETTER QOPH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1089A,
+ },
+ [0x1089B]={
+ category="lo",
+ description="NABATAEAN LETTER RESH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1089B,
+ },
+ [0x1089C]={
+ category="lo",
+ description="NABATAEAN LETTER FINAL SHIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1089C,
+ },
+ [0x1089D]={
+ category="lo",
+ description="NABATAEAN LETTER SHIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1089D,
+ },
+ [0x1089E]={
+ category="lo",
+ description="NABATAEAN LETTER TAW",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1089E,
+ },
+ [0x108A7]={
+ category="no",
+ description="NABATAEAN NUMBER ONE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x108A7,
+ },
+ [0x108A8]={
+ category="no",
+ description="NABATAEAN NUMBER TWO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x108A8,
+ },
+ [0x108A9]={
+ category="no",
+ description="NABATAEAN NUMBER THREE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x108A9,
+ },
+ [0x108AA]={
+ category="no",
+ description="NABATAEAN NUMBER FOUR",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x108AA,
+ },
+ [0x108AB]={
+ category="no",
+ description="NABATAEAN CRUCIFORM NUMBER FOUR",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x108AB,
+ },
+ [0x108AC]={
+ category="no",
+ description="NABATAEAN NUMBER FIVE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x108AC,
+ },
+ [0x108AD]={
+ category="no",
+ description="NABATAEAN NUMBER TEN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x108AD,
+ },
+ [0x108AE]={
+ category="no",
+ description="NABATAEAN NUMBER TWENTY",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x108AE,
+ },
+ [0x108AF]={
+ category="no",
+ description="NABATAEAN NUMBER ONE HUNDRED",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x108AF,
+ },
[0x10900]={
category="lo",
description="PHOENICIAN LETTER ALF",
@@ -138523,6 +145790,7 @@ characters.data={
},
[0x10A0D]={
category="mn",
+ combining=0xDC,
description="KHAROSHTHI SIGN DOUBLE RING BELOW",
direction="nsm",
linebreak="cm",
@@ -138537,6 +145805,7 @@ characters.data={
},
[0x10A0F]={
category="mn",
+ combining=0xE6,
description="KHAROSHTHI SIGN VISARGA",
direction="nsm",
linebreak="cm",
@@ -138782,6 +146051,7 @@ characters.data={
},
[0x10A38]={
category="mn",
+ combining=0xE6,
description="KHAROSHTHI SIGN BAR ABOVE",
direction="nsm",
linebreak="cm",
@@ -138789,6 +146059,7 @@ characters.data={
},
[0x10A39]={
category="mn",
+ combining=0x1,
description="KHAROSHTHI SIGN CAUDA",
direction="nsm",
linebreak="cm",
@@ -138796,6 +146067,7 @@ characters.data={
},
[0x10A3A]={
category="mn",
+ combining=0xDC,
description="KHAROSHTHI SIGN DOT BELOW",
direction="nsm",
linebreak="cm",
@@ -138803,6 +146075,7 @@ characters.data={
},
[0x10A3F]={
category="mn",
+ combining=0x9,
description="KHAROSHTHI VIRAMA",
direction="nsm",
linebreak="cm",
@@ -139151,6 +146424,631 @@ characters.data={
linebreak="al",
unicodeslot=0x10A7F,
},
+ [0x10A80]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER HEH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A80,
+ },
+ [0x10A81]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER LAM",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A81,
+ },
+ [0x10A82]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER HAH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A82,
+ },
+ [0x10A83]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER MEEM",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A83,
+ },
+ [0x10A84]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER QAF",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A84,
+ },
+ [0x10A85]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER WAW",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A85,
+ },
+ [0x10A86]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER ES-2",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A86,
+ },
+ [0x10A87]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER REH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A87,
+ },
+ [0x10A88]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER BEH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A88,
+ },
+ [0x10A89]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER TEH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A89,
+ },
+ [0x10A8A]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER ES-1",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A8A,
+ },
+ [0x10A8B]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER KAF",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A8B,
+ },
+ [0x10A8C]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER NOON",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A8C,
+ },
+ [0x10A8D]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER KHAH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A8D,
+ },
+ [0x10A8E]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER SAD",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A8E,
+ },
+ [0x10A8F]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER ES-3",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A8F,
+ },
+ [0x10A90]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER FEH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A90,
+ },
+ [0x10A91]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER ALEF",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A91,
+ },
+ [0x10A92]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER AIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A92,
+ },
+ [0x10A93]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER DAD",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A93,
+ },
+ [0x10A94]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER GEEM",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A94,
+ },
+ [0x10A95]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER DAL",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A95,
+ },
+ [0x10A96]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER GHAIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A96,
+ },
+ [0x10A97]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER TAH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A97,
+ },
+ [0x10A98]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER ZAIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A98,
+ },
+ [0x10A99]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER THAL",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A99,
+ },
+ [0x10A9A]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER YEH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A9A,
+ },
+ [0x10A9B]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER THEH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A9B,
+ },
+ [0x10A9C]={
+ category="lo",
+ description="OLD NORTH ARABIAN LETTER ZAH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A9C,
+ },
+ [0x10A9D]={
+ category="no",
+ description="OLD NORTH ARABIAN NUMBER ONE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A9D,
+ },
+ [0x10A9E]={
+ category="no",
+ description="OLD NORTH ARABIAN NUMBER TEN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A9E,
+ },
+ [0x10A9F]={
+ category="no",
+ description="OLD NORTH ARABIAN NUMBER TWENTY",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A9F,
+ },
+ [0x10AC0]={
+ arabic="d",
+ category="lo",
+ description="MANICHAEAN LETTER ALEPH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AC0,
+ },
+ [0x10AC1]={
+ arabic="d",
+ category="lo",
+ description="MANICHAEAN LETTER BETH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AC1,
+ },
+ [0x10AC2]={
+ arabic="d",
+ category="lo",
+ description="MANICHAEAN LETTER BHETH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AC2,
+ },
+ [0x10AC3]={
+ arabic="d",
+ category="lo",
+ description="MANICHAEAN LETTER GIMEL",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AC3,
+ },
+ [0x10AC4]={
+ arabic="d",
+ category="lo",
+ description="MANICHAEAN LETTER GHIMEL",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AC4,
+ },
+ [0x10AC5]={
+ arabic="r",
+ category="lo",
+ description="MANICHAEAN LETTER DALETH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AC5,
+ },
+ [0x10AC6]={
+ arabic="u",
+ category="lo",
+ description="MANICHAEAN LETTER HE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AC6,
+ },
+ [0x10AC7]={
+ arabic="r",
+ category="lo",
+ description="MANICHAEAN LETTER WAW",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AC7,
+ },
+ [0x10AC8]={
+ arabic="u",
+ category="so",
+ description="MANICHAEAN SIGN UD",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AC8,
+ },
+ [0x10AC9]={
+ arabic="r",
+ category="lo",
+ description="MANICHAEAN LETTER ZAYIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AC9,
+ },
+ [0x10ACA]={
+ arabic="r",
+ category="lo",
+ description="MANICHAEAN LETTER ZHAYIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10ACA,
+ },
+ [0x10ACB]={
+ arabic="u",
+ category="lo",
+ description="MANICHAEAN LETTER JAYIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10ACB,
+ },
+ [0x10ACC]={
+ arabic="u",
+ category="lo",
+ description="MANICHAEAN LETTER JHAYIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10ACC,
+ },
+ [0x10ACD]={
+ arabic="l",
+ category="lo",
+ description="MANICHAEAN LETTER HETH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10ACD,
+ },
+ [0x10ACE]={
+ arabic="r",
+ category="lo",
+ description="MANICHAEAN LETTER TETH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10ACE,
+ },
+ [0x10ACF]={
+ arabic="r",
+ category="lo",
+ description="MANICHAEAN LETTER YODH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10ACF,
+ },
+ [0x10AD0]={
+ arabic="r",
+ category="lo",
+ description="MANICHAEAN LETTER KAPH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AD0,
+ },
+ [0x10AD1]={
+ arabic="r",
+ category="lo",
+ description="MANICHAEAN LETTER XAPH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AD1,
+ },
+ [0x10AD2]={
+ arabic="r",
+ category="lo",
+ description="MANICHAEAN LETTER KHAPH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AD2,
+ },
+ [0x10AD3]={
+ arabic="d",
+ category="lo",
+ description="MANICHAEAN LETTER LAMEDH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AD3,
+ },
+ [0x10AD4]={
+ arabic="d",
+ category="lo",
+ description="MANICHAEAN LETTER DHAMEDH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AD4,
+ },
+ [0x10AD5]={
+ arabic="d",
+ category="lo",
+ description="MANICHAEAN LETTER THAMEDH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AD5,
+ },
+ [0x10AD6]={
+ arabic="d",
+ category="lo",
+ description="MANICHAEAN LETTER MEM",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AD6,
+ },
+ [0x10AD7]={
+ arabic="l",
+ category="lo",
+ description="MANICHAEAN LETTER NUN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AD7,
+ },
+ [0x10AD8]={
+ arabic="d",
+ category="lo",
+ description="MANICHAEAN LETTER SAMEKH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AD8,
+ },
+ [0x10AD9]={
+ arabic="d",
+ category="lo",
+ description="MANICHAEAN LETTER AYIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AD9,
+ },
+ [0x10ADA]={
+ arabic="d",
+ category="lo",
+ description="MANICHAEAN LETTER AAYIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10ADA,
+ },
+ [0x10ADB]={
+ arabic="d",
+ category="lo",
+ description="MANICHAEAN LETTER PE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10ADB,
+ },
+ [0x10ADC]={
+ arabic="d",
+ category="lo",
+ description="MANICHAEAN LETTER FE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10ADC,
+ },
+ [0x10ADD]={
+ arabic="r",
+ category="lo",
+ description="MANICHAEAN LETTER SADHE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10ADD,
+ },
+ [0x10ADE]={
+ arabic="d",
+ category="lo",
+ description="MANICHAEAN LETTER QOPH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10ADE,
+ },
+ [0x10ADF]={
+ arabic="d",
+ category="lo",
+ description="MANICHAEAN LETTER XOPH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10ADF,
+ },
+ [0x10AE0]={
+ arabic="d",
+ category="lo",
+ description="MANICHAEAN LETTER QHOPH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AE0,
+ },
+ [0x10AE1]={
+ arabic="r",
+ category="lo",
+ description="MANICHAEAN LETTER RESH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AE1,
+ },
+ [0x10AE2]={
+ arabic="u",
+ category="lo",
+ description="MANICHAEAN LETTER SHIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AE2,
+ },
+ [0x10AE3]={
+ arabic="u",
+ category="lo",
+ description="MANICHAEAN LETTER SSHIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AE3,
+ },
+ [0x10AE4]={
+ arabic="r",
+ category="lo",
+ description="MANICHAEAN LETTER TAW",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AE4,
+ },
+ [0x10AE5]={
+ category="mn",
+ combining=0xE6,
+ description="MANICHAEAN ABBREVIATION MARK ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x10AE5,
+ },
+ [0x10AE6]={
+ category="mn",
+ combining=0xDC,
+ description="MANICHAEAN ABBREVIATION MARK BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x10AE6,
+ },
+ [0x10AEB]={
+ arabic="d",
+ category="no",
+ description="MANICHAEAN NUMBER ONE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AEB,
+ },
+ [0x10AEC]={
+ arabic="d",
+ category="no",
+ description="MANICHAEAN NUMBER FIVE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AEC,
+ },
+ [0x10AED]={
+ arabic="d",
+ category="no",
+ description="MANICHAEAN NUMBER TEN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AED,
+ },
+ [0x10AEE]={
+ arabic="d",
+ category="no",
+ description="MANICHAEAN NUMBER TWENTY",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AEE,
+ },
+ [0x10AEF]={
+ arabic="r",
+ category="no",
+ description="MANICHAEAN NUMBER ONE HUNDRED",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10AEF,
+ },
+ [0x10AF0]={
+ category="po",
+ description="MANICHAEAN PUNCTUATION STAR",
+ direction="r",
+ linebreak="ba",
+ unicodeslot=0x10AF0,
+ },
+ [0x10AF1]={
+ category="po",
+ description="MANICHAEAN PUNCTUATION FLEURON",
+ direction="r",
+ linebreak="ba",
+ unicodeslot=0x10AF1,
+ },
+ [0x10AF2]={
+ category="po",
+ description="MANICHAEAN PUNCTUATION DOUBLE DOT WITHIN DOT",
+ direction="r",
+ linebreak="ba",
+ unicodeslot=0x10AF2,
+ },
+ [0x10AF3]={
+ category="po",
+ description="MANICHAEAN PUNCTUATION DOT WITHIN DOT",
+ direction="r",
+ linebreak="ba",
+ unicodeslot=0x10AF3,
+ },
+ [0x10AF4]={
+ category="po",
+ description="MANICHAEAN PUNCTUATION DOT",
+ direction="r",
+ linebreak="ba",
+ unicodeslot=0x10AF4,
+ },
+ [0x10AF5]={
+ category="po",
+ description="MANICHAEAN PUNCTUATION TWO DOTS",
+ direction="r",
+ linebreak="ba",
+ unicodeslot=0x10AF5,
+ },
+ [0x10AF6]={
+ category="po",
+ description="MANICHAEAN PUNCTUATION LINE FILLER",
+ direction="r",
+ linebreak="in",
+ unicodeslot=0x10AF6,
+ },
[0x10B00]={
category="lo",
description="AVESTAN LETTER A",
@@ -139977,6 +147875,234 @@ characters.data={
linebreak="al",
unicodeslot=0x10B7F,
},
+ [0x10B80]={
+ arabic="d",
+ category="lo",
+ description="PSALTER PAHLAVI LETTER ALEPH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10B80,
+ },
+ [0x10B81]={
+ arabic="r",
+ category="lo",
+ description="PSALTER PAHLAVI LETTER BETH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10B81,
+ },
+ [0x10B82]={
+ arabic="d",
+ category="lo",
+ description="PSALTER PAHLAVI LETTER GIMEL",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10B82,
+ },
+ [0x10B83]={
+ arabic="r",
+ category="lo",
+ description="PSALTER PAHLAVI LETTER DALETH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10B83,
+ },
+ [0x10B84]={
+ arabic="r",
+ category="lo",
+ description="PSALTER PAHLAVI LETTER HE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10B84,
+ },
+ [0x10B85]={
+ arabic="r",
+ category="lo",
+ description="PSALTER PAHLAVI LETTER WAW-AYIN-RESH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10B85,
+ },
+ [0x10B86]={
+ arabic="d",
+ category="lo",
+ description="PSALTER PAHLAVI LETTER ZAYIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10B86,
+ },
+ [0x10B87]={
+ arabic="d",
+ category="lo",
+ description="PSALTER PAHLAVI LETTER HETH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10B87,
+ },
+ [0x10B88]={
+ arabic="d",
+ category="lo",
+ description="PSALTER PAHLAVI LETTER YODH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10B88,
+ },
+ [0x10B89]={
+ arabic="r",
+ category="lo",
+ description="PSALTER PAHLAVI LETTER KAPH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10B89,
+ },
+ [0x10B8A]={
+ arabic="d",
+ category="lo",
+ description="PSALTER PAHLAVI LETTER LAMEDH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10B8A,
+ },
+ [0x10B8B]={
+ arabic="d",
+ category="lo",
+ description="PSALTER PAHLAVI LETTER MEM-QOPH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10B8B,
+ },
+ [0x10B8C]={
+ arabic="r",
+ category="lo",
+ description="PSALTER PAHLAVI LETTER NUN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10B8C,
+ },
+ [0x10B8D]={
+ arabic="d",
+ category="lo",
+ description="PSALTER PAHLAVI LETTER SAMEKH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10B8D,
+ },
+ [0x10B8E]={
+ arabic="r",
+ category="lo",
+ description="PSALTER PAHLAVI LETTER PE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10B8E,
+ },
+ [0x10B8F]={
+ arabic="r",
+ category="lo",
+ description="PSALTER PAHLAVI LETTER SADHE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10B8F,
+ },
+ [0x10B90]={
+ arabic="d",
+ category="lo",
+ description="PSALTER PAHLAVI LETTER SHIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10B90,
+ },
+ [0x10B91]={
+ arabic="r",
+ category="lo",
+ description="PSALTER PAHLAVI LETTER TAW",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10B91,
+ },
+ [0x10B99]={
+ category="po",
+ description="PSALTER PAHLAVI SECTION MARK",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10B99,
+ },
+ [0x10B9A]={
+ category="po",
+ description="PSALTER PAHLAVI TURNED SECTION MARK",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10B9A,
+ },
+ [0x10B9B]={
+ category="po",
+ description="PSALTER PAHLAVI FOUR DOTS WITH CROSS",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10B9B,
+ },
+ [0x10B9C]={
+ category="po",
+ description="PSALTER PAHLAVI FOUR DOTS WITH DOT",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10B9C,
+ },
+ [0x10BA9]={
+ arabic="r",
+ category="no",
+ description="PSALTER PAHLAVI NUMBER ONE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10BA9,
+ },
+ [0x10BAA]={
+ arabic="r",
+ category="no",
+ description="PSALTER PAHLAVI NUMBER TWO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10BAA,
+ },
+ [0x10BAB]={
+ arabic="r",
+ category="no",
+ description="PSALTER PAHLAVI NUMBER THREE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10BAB,
+ },
+ [0x10BAC]={
+ arabic="r",
+ category="no",
+ description="PSALTER PAHLAVI NUMBER FOUR",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10BAC,
+ },
+ [0x10BAD]={
+ arabic="d",
+ category="no",
+ description="PSALTER PAHLAVI NUMBER TEN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10BAD,
+ },
+ [0x10BAE]={
+ arabic="d",
+ category="no",
+ description="PSALTER PAHLAVI NUMBER TWENTY",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10BAE,
+ },
+ [0x10BAF]={
+ arabic="u",
+ category="no",
+ description="PSALTER PAHLAVI NUMBER ONE HUNDRED",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10BAF,
+ },
[0x10C00]={
category="lo",
description="OLD TURKIC LETTER ORKHON A",
@@ -141197,6 +149323,7 @@ characters.data={
},
[0x11046]={
category="mn",
+ combining=0x9,
description="BRAHMI VIRAMA",
direction="nsm",
linebreak="cm",
@@ -141461,6 +149588,14 @@ characters.data={
linebreak="nu",
unicodeslot=0x1106F,
},
+ [0x1107F]={
+ category="mn",
+ combining=0x9,
+ description="BRAHMI NUMBER JOINER",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1107F,
+ },
[0x11080]={
category="mn",
description="KAITHI SIGN CANDRABINDU",
@@ -141865,6 +150000,7 @@ characters.data={
},
[0x110B9]={
category="mn",
+ combining=0x9,
description="KAITHI SIGN VIRAMA",
direction="nsm",
linebreak="cm",
@@ -141872,6 +150008,7 @@ characters.data={
},
[0x110BA]={
category="mn",
+ combining=0x7,
description="KAITHI SIGN NUKTA",
direction="nsm",
linebreak="cm",
@@ -142173,6 +150310,7 @@ characters.data={
},
[0x11100]={
category="mn",
+ combining=0xE6,
description="CHAKMA SIGN CANDRABINDU",
direction="nsm",
linebreak="cm",
@@ -142180,6 +150318,7 @@ characters.data={
},
[0x11101]={
category="mn",
+ combining=0xE6,
description="CHAKMA SIGN ANUSVARA",
direction="nsm",
linebreak="cm",
@@ -142187,6 +150326,7 @@ characters.data={
},
[0x11102]={
category="mn",
+ combining=0xE6,
description="CHAKMA SIGN VISARGA",
direction="nsm",
linebreak="cm",
@@ -142532,6 +150672,7 @@ characters.data={
},
[0x11133]={
category="mn",
+ combining=0x9,
description="CHAKMA VIRAMA",
direction="nsm",
linebreak="cm",
@@ -142539,6 +150680,7 @@ characters.data={
},
[0x11134]={
category="mn",
+ combining=0x9,
description="CHAKMA MAAYYAA",
direction="nsm",
linebreak="cm",
@@ -142642,6 +150784,280 @@ characters.data={
linebreak="ba",
unicodeslot=0x11143,
},
+ [0x11150]={
+ category="lo",
+ description="MAHAJANI LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11150,
+ },
+ [0x11151]={
+ category="lo",
+ description="MAHAJANI LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11151,
+ },
+ [0x11152]={
+ category="lo",
+ description="MAHAJANI LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11152,
+ },
+ [0x11153]={
+ category="lo",
+ description="MAHAJANI LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11153,
+ },
+ [0x11154]={
+ category="lo",
+ description="MAHAJANI LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11154,
+ },
+ [0x11155]={
+ category="lo",
+ description="MAHAJANI LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11155,
+ },
+ [0x11156]={
+ category="lo",
+ description="MAHAJANI LETTER KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11156,
+ },
+ [0x11157]={
+ category="lo",
+ description="MAHAJANI LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11157,
+ },
+ [0x11158]={
+ category="lo",
+ description="MAHAJANI LETTER GHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11158,
+ },
+ [0x11159]={
+ category="lo",
+ description="MAHAJANI LETTER CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11159,
+ },
+ [0x1115A]={
+ category="lo",
+ description="MAHAJANI LETTER CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1115A,
+ },
+ [0x1115B]={
+ category="lo",
+ description="MAHAJANI LETTER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1115B,
+ },
+ [0x1115C]={
+ category="lo",
+ description="MAHAJANI LETTER JHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1115C,
+ },
+ [0x1115D]={
+ category="lo",
+ description="MAHAJANI LETTER NYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1115D,
+ },
+ [0x1115E]={
+ category="lo",
+ description="MAHAJANI LETTER TTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1115E,
+ },
+ [0x1115F]={
+ category="lo",
+ description="MAHAJANI LETTER TTHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1115F,
+ },
+ [0x11160]={
+ category="lo",
+ description="MAHAJANI LETTER DDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11160,
+ },
+ [0x11161]={
+ category="lo",
+ description="MAHAJANI LETTER DDHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11161,
+ },
+ [0x11162]={
+ category="lo",
+ description="MAHAJANI LETTER NNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11162,
+ },
+ [0x11163]={
+ category="lo",
+ description="MAHAJANI LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11163,
+ },
+ [0x11164]={
+ category="lo",
+ description="MAHAJANI LETTER THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11164,
+ },
+ [0x11165]={
+ category="lo",
+ description="MAHAJANI LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11165,
+ },
+ [0x11166]={
+ category="lo",
+ description="MAHAJANI LETTER DHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11166,
+ },
+ [0x11167]={
+ category="lo",
+ description="MAHAJANI LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11167,
+ },
+ [0x11168]={
+ category="lo",
+ description="MAHAJANI LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11168,
+ },
+ [0x11169]={
+ category="lo",
+ description="MAHAJANI LETTER PHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11169,
+ },
+ [0x1116A]={
+ category="lo",
+ description="MAHAJANI LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1116A,
+ },
+ [0x1116B]={
+ category="lo",
+ description="MAHAJANI LETTER BHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1116B,
+ },
+ [0x1116C]={
+ category="lo",
+ description="MAHAJANI LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1116C,
+ },
+ [0x1116D]={
+ category="lo",
+ description="MAHAJANI LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1116D,
+ },
+ [0x1116E]={
+ category="lo",
+ description="MAHAJANI LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1116E,
+ },
+ [0x1116F]={
+ category="lo",
+ description="MAHAJANI LETTER VA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1116F,
+ },
+ [0x11170]={
+ category="lo",
+ description="MAHAJANI LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11170,
+ },
+ [0x11171]={
+ category="lo",
+ description="MAHAJANI LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11171,
+ },
+ [0x11172]={
+ category="lo",
+ description="MAHAJANI LETTER RRA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11172,
+ },
+ [0x11173]={
+ category="mn",
+ combining=0x7,
+ description="MAHAJANI SIGN NUKTA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11173,
+ },
+ [0x11174]={
+ category="po",
+ description="MAHAJANI ABBREVIATION SIGN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11174,
+ },
+ [0x11175]={
+ category="po",
+ description="MAHAJANI SECTION MARK",
+ direction="l",
+ linebreak="bb",
+ unicodeslot=0x11175,
+ },
+ [0x11176]={
+ category="lo",
+ description="MAHAJANI LIGATURE SHRI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11176,
+ },
[0x11180]={
category="mn",
description="SHARADA SIGN CANDRABINDU",
@@ -143092,6 +151508,7 @@ characters.data={
},
[0x111C0]={
category="mc",
+ combining=0x9,
description="SHARADA SIGN VIRAMA",
direction="l",
linebreak="cm",
@@ -143153,6 +151570,13 @@ characters.data={
linebreak="ba",
unicodeslot=0x111C8,
},
+ [0x111CD]={
+ category="po",
+ description="SHARADA SUTRA MARK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x111CD,
+ },
[0x111D0]={
category="nd",
description="SHARADA DIGIT ZERO",
@@ -143223,6 +151647,3305 @@ characters.data={
linebreak="nu",
unicodeslot=0x111D9,
},
+ [0x111DA]={
+ category="lo",
+ description="SHARADA EKAM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x111DA,
+ },
+ [0x111E1]={
+ category="no",
+ description="SINHALA ARCHAIC DIGIT ONE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x111E1,
+ },
+ [0x111E2]={
+ category="no",
+ description="SINHALA ARCHAIC DIGIT TWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x111E2,
+ },
+ [0x111E3]={
+ category="no",
+ description="SINHALA ARCHAIC DIGIT THREE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x111E3,
+ },
+ [0x111E4]={
+ category="no",
+ description="SINHALA ARCHAIC DIGIT FOUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x111E4,
+ },
+ [0x111E5]={
+ category="no",
+ description="SINHALA ARCHAIC DIGIT FIVE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x111E5,
+ },
+ [0x111E6]={
+ category="no",
+ description="SINHALA ARCHAIC DIGIT SIX",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x111E6,
+ },
+ [0x111E7]={
+ category="no",
+ description="SINHALA ARCHAIC DIGIT SEVEN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x111E7,
+ },
+ [0x111E8]={
+ category="no",
+ description="SINHALA ARCHAIC DIGIT EIGHT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x111E8,
+ },
+ [0x111E9]={
+ category="no",
+ description="SINHALA ARCHAIC DIGIT NINE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x111E9,
+ },
+ [0x111EA]={
+ category="no",
+ description="SINHALA ARCHAIC NUMBER TEN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x111EA,
+ },
+ [0x111EB]={
+ category="no",
+ description="SINHALA ARCHAIC NUMBER TWENTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x111EB,
+ },
+ [0x111EC]={
+ category="no",
+ description="SINHALA ARCHAIC NUMBER THIRTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x111EC,
+ },
+ [0x111ED]={
+ category="no",
+ description="SINHALA ARCHAIC NUMBER FORTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x111ED,
+ },
+ [0x111EE]={
+ category="no",
+ description="SINHALA ARCHAIC NUMBER FIFTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x111EE,
+ },
+ [0x111EF]={
+ category="no",
+ description="SINHALA ARCHAIC NUMBER SIXTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x111EF,
+ },
+ [0x111F0]={
+ category="no",
+ description="SINHALA ARCHAIC NUMBER SEVENTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x111F0,
+ },
+ [0x111F1]={
+ category="no",
+ description="SINHALA ARCHAIC NUMBER EIGHTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x111F1,
+ },
+ [0x111F2]={
+ category="no",
+ description="SINHALA ARCHAIC NUMBER NINETY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x111F2,
+ },
+ [0x111F3]={
+ category="no",
+ description="SINHALA ARCHAIC NUMBER ONE HUNDRED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x111F3,
+ },
+ [0x111F4]={
+ category="no",
+ description="SINHALA ARCHAIC NUMBER ONE THOUSAND",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x111F4,
+ },
+ [0x11200]={
+ category="lo",
+ description="KHOJKI LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11200,
+ },
+ [0x11201]={
+ category="lo",
+ description="KHOJKI LETTER AA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11201,
+ },
+ [0x11202]={
+ category="lo",
+ description="KHOJKI LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11202,
+ },
+ [0x11203]={
+ category="lo",
+ description="KHOJKI LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11203,
+ },
+ [0x11204]={
+ category="lo",
+ description="KHOJKI LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11204,
+ },
+ [0x11205]={
+ category="lo",
+ description="KHOJKI LETTER AI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11205,
+ },
+ [0x11206]={
+ category="lo",
+ description="KHOJKI LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11206,
+ },
+ [0x11207]={
+ category="lo",
+ description="KHOJKI LETTER AU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11207,
+ },
+ [0x11208]={
+ category="lo",
+ description="KHOJKI LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11208,
+ },
+ [0x11209]={
+ category="lo",
+ description="KHOJKI LETTER KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11209,
+ },
+ [0x1120A]={
+ category="lo",
+ description="KHOJKI LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1120A,
+ },
+ [0x1120B]={
+ category="lo",
+ description="KHOJKI LETTER GGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1120B,
+ },
+ [0x1120C]={
+ category="lo",
+ description="KHOJKI LETTER GHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1120C,
+ },
+ [0x1120D]={
+ category="lo",
+ description="KHOJKI LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1120D,
+ },
+ [0x1120E]={
+ category="lo",
+ description="KHOJKI LETTER CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1120E,
+ },
+ [0x1120F]={
+ category="lo",
+ description="KHOJKI LETTER CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1120F,
+ },
+ [0x11210]={
+ category="lo",
+ description="KHOJKI LETTER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11210,
+ },
+ [0x11211]={
+ category="lo",
+ description="KHOJKI LETTER JJA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11211,
+ },
+ [0x11213]={
+ category="lo",
+ description="KHOJKI LETTER NYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11213,
+ },
+ [0x11214]={
+ category="lo",
+ description="KHOJKI LETTER TTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11214,
+ },
+ [0x11215]={
+ category="lo",
+ description="KHOJKI LETTER TTHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11215,
+ },
+ [0x11216]={
+ category="lo",
+ description="KHOJKI LETTER DDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11216,
+ },
+ [0x11217]={
+ category="lo",
+ description="KHOJKI LETTER DDHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11217,
+ },
+ [0x11218]={
+ category="lo",
+ description="KHOJKI LETTER NNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11218,
+ },
+ [0x11219]={
+ category="lo",
+ description="KHOJKI LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11219,
+ },
+ [0x1121A]={
+ category="lo",
+ description="KHOJKI LETTER THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1121A,
+ },
+ [0x1121B]={
+ category="lo",
+ description="KHOJKI LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1121B,
+ },
+ [0x1121C]={
+ category="lo",
+ description="KHOJKI LETTER DDDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1121C,
+ },
+ [0x1121D]={
+ category="lo",
+ description="KHOJKI LETTER DHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1121D,
+ },
+ [0x1121E]={
+ category="lo",
+ description="KHOJKI LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1121E,
+ },
+ [0x1121F]={
+ category="lo",
+ description="KHOJKI LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1121F,
+ },
+ [0x11220]={
+ category="lo",
+ description="KHOJKI LETTER PHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11220,
+ },
+ [0x11221]={
+ category="lo",
+ description="KHOJKI LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11221,
+ },
+ [0x11222]={
+ category="lo",
+ description="KHOJKI LETTER BBA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11222,
+ },
+ [0x11223]={
+ category="lo",
+ description="KHOJKI LETTER BHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11223,
+ },
+ [0x11224]={
+ category="lo",
+ description="KHOJKI LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11224,
+ },
+ [0x11225]={
+ category="lo",
+ description="KHOJKI LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11225,
+ },
+ [0x11226]={
+ category="lo",
+ description="KHOJKI LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11226,
+ },
+ [0x11227]={
+ category="lo",
+ description="KHOJKI LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11227,
+ },
+ [0x11228]={
+ category="lo",
+ description="KHOJKI LETTER VA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11228,
+ },
+ [0x11229]={
+ category="lo",
+ description="KHOJKI LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11229,
+ },
+ [0x1122A]={
+ category="lo",
+ description="KHOJKI LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1122A,
+ },
+ [0x1122B]={
+ category="lo",
+ description="KHOJKI LETTER LLA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1122B,
+ },
+ [0x1122C]={
+ category="mc",
+ description="KHOJKI VOWEL SIGN AA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1122C,
+ },
+ [0x1122D]={
+ category="mc",
+ description="KHOJKI VOWEL SIGN I",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1122D,
+ },
+ [0x1122E]={
+ category="mc",
+ description="KHOJKI VOWEL SIGN II",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1122E,
+ },
+ [0x1122F]={
+ category="mn",
+ description="KHOJKI VOWEL SIGN U",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1122F,
+ },
+ [0x11230]={
+ category="mn",
+ description="KHOJKI VOWEL SIGN E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11230,
+ },
+ [0x11231]={
+ category="mn",
+ description="KHOJKI VOWEL SIGN AI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11231,
+ },
+ [0x11232]={
+ category="mc",
+ description="KHOJKI VOWEL SIGN O",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11232,
+ },
+ [0x11233]={
+ category="mc",
+ description="KHOJKI VOWEL SIGN AU",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11233,
+ },
+ [0x11234]={
+ category="mn",
+ description="KHOJKI SIGN ANUSVARA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11234,
+ },
+ [0x11235]={
+ category="mc",
+ combining=0x9,
+ description="KHOJKI SIGN VIRAMA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11235,
+ },
+ [0x11236]={
+ category="mn",
+ combining=0x7,
+ description="KHOJKI SIGN NUKTA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11236,
+ },
+ [0x11237]={
+ category="mn",
+ description="KHOJKI SIGN SHADDA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11237,
+ },
+ [0x11238]={
+ category="po",
+ description="KHOJKI DANDA",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x11238,
+ },
+ [0x11239]={
+ category="po",
+ description="KHOJKI DOUBLE DANDA",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x11239,
+ },
+ [0x1123A]={
+ category="po",
+ description="KHOJKI WORD SEPARATOR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1123A,
+ },
+ [0x1123B]={
+ category="po",
+ description="KHOJKI SECTION MARK",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x1123B,
+ },
+ [0x1123C]={
+ category="po",
+ description="KHOJKI DOUBLE SECTION MARK",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x1123C,
+ },
+ [0x1123D]={
+ category="po",
+ description="KHOJKI ABBREVIATION SIGN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1123D,
+ },
+ [0x112B0]={
+ category="lo",
+ description="KHUDAWADI LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112B0,
+ },
+ [0x112B1]={
+ category="lo",
+ description="KHUDAWADI LETTER AA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112B1,
+ },
+ [0x112B2]={
+ category="lo",
+ description="KHUDAWADI LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112B2,
+ },
+ [0x112B3]={
+ category="lo",
+ description="KHUDAWADI LETTER II",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112B3,
+ },
+ [0x112B4]={
+ category="lo",
+ description="KHUDAWADI LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112B4,
+ },
+ [0x112B5]={
+ category="lo",
+ description="KHUDAWADI LETTER UU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112B5,
+ },
+ [0x112B6]={
+ category="lo",
+ description="KHUDAWADI LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112B6,
+ },
+ [0x112B7]={
+ category="lo",
+ description="KHUDAWADI LETTER AI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112B7,
+ },
+ [0x112B8]={
+ category="lo",
+ description="KHUDAWADI LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112B8,
+ },
+ [0x112B9]={
+ category="lo",
+ description="KHUDAWADI LETTER AU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112B9,
+ },
+ [0x112BA]={
+ category="lo",
+ description="KHUDAWADI LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112BA,
+ },
+ [0x112BB]={
+ category="lo",
+ description="KHUDAWADI LETTER KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112BB,
+ },
+ [0x112BC]={
+ category="lo",
+ description="KHUDAWADI LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112BC,
+ },
+ [0x112BD]={
+ category="lo",
+ description="KHUDAWADI LETTER GGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112BD,
+ },
+ [0x112BE]={
+ category="lo",
+ description="KHUDAWADI LETTER GHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112BE,
+ },
+ [0x112BF]={
+ category="lo",
+ description="KHUDAWADI LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112BF,
+ },
+ [0x112C0]={
+ category="lo",
+ description="KHUDAWADI LETTER CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112C0,
+ },
+ [0x112C1]={
+ category="lo",
+ description="KHUDAWADI LETTER CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112C1,
+ },
+ [0x112C2]={
+ category="lo",
+ description="KHUDAWADI LETTER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112C2,
+ },
+ [0x112C3]={
+ category="lo",
+ description="KHUDAWADI LETTER JJA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112C3,
+ },
+ [0x112C4]={
+ category="lo",
+ description="KHUDAWADI LETTER JHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112C4,
+ },
+ [0x112C5]={
+ category="lo",
+ description="KHUDAWADI LETTER NYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112C5,
+ },
+ [0x112C6]={
+ category="lo",
+ description="KHUDAWADI LETTER TTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112C6,
+ },
+ [0x112C7]={
+ category="lo",
+ description="KHUDAWADI LETTER TTHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112C7,
+ },
+ [0x112C8]={
+ category="lo",
+ description="KHUDAWADI LETTER DDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112C8,
+ },
+ [0x112C9]={
+ category="lo",
+ description="KHUDAWADI LETTER DDDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112C9,
+ },
+ [0x112CA]={
+ category="lo",
+ description="KHUDAWADI LETTER RRA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112CA,
+ },
+ [0x112CB]={
+ category="lo",
+ description="KHUDAWADI LETTER DDHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112CB,
+ },
+ [0x112CC]={
+ category="lo",
+ description="KHUDAWADI LETTER NNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112CC,
+ },
+ [0x112CD]={
+ category="lo",
+ description="KHUDAWADI LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112CD,
+ },
+ [0x112CE]={
+ category="lo",
+ description="KHUDAWADI LETTER THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112CE,
+ },
+ [0x112CF]={
+ category="lo",
+ description="KHUDAWADI LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112CF,
+ },
+ [0x112D0]={
+ category="lo",
+ description="KHUDAWADI LETTER DHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112D0,
+ },
+ [0x112D1]={
+ category="lo",
+ description="KHUDAWADI LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112D1,
+ },
+ [0x112D2]={
+ category="lo",
+ description="KHUDAWADI LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112D2,
+ },
+ [0x112D3]={
+ category="lo",
+ description="KHUDAWADI LETTER PHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112D3,
+ },
+ [0x112D4]={
+ category="lo",
+ description="KHUDAWADI LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112D4,
+ },
+ [0x112D5]={
+ category="lo",
+ description="KHUDAWADI LETTER BBA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112D5,
+ },
+ [0x112D6]={
+ category="lo",
+ description="KHUDAWADI LETTER BHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112D6,
+ },
+ [0x112D7]={
+ category="lo",
+ description="KHUDAWADI LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112D7,
+ },
+ [0x112D8]={
+ category="lo",
+ description="KHUDAWADI LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112D8,
+ },
+ [0x112D9]={
+ category="lo",
+ description="KHUDAWADI LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112D9,
+ },
+ [0x112DA]={
+ category="lo",
+ description="KHUDAWADI LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112DA,
+ },
+ [0x112DB]={
+ category="lo",
+ description="KHUDAWADI LETTER VA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112DB,
+ },
+ [0x112DC]={
+ category="lo",
+ description="KHUDAWADI LETTER SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112DC,
+ },
+ [0x112DD]={
+ category="lo",
+ description="KHUDAWADI LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112DD,
+ },
+ [0x112DE]={
+ category="lo",
+ description="KHUDAWADI LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x112DE,
+ },
+ [0x112DF]={
+ category="mn",
+ description="KHUDAWADI SIGN ANUSVARA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x112DF,
+ },
+ [0x112E0]={
+ category="mc",
+ description="KHUDAWADI VOWEL SIGN AA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x112E0,
+ },
+ [0x112E1]={
+ category="mc",
+ description="KHUDAWADI VOWEL SIGN I",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x112E1,
+ },
+ [0x112E2]={
+ category="mc",
+ description="KHUDAWADI VOWEL SIGN II",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x112E2,
+ },
+ [0x112E3]={
+ category="mn",
+ description="KHUDAWADI VOWEL SIGN U",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x112E3,
+ },
+ [0x112E4]={
+ category="mn",
+ description="KHUDAWADI VOWEL SIGN UU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x112E4,
+ },
+ [0x112E5]={
+ category="mn",
+ description="KHUDAWADI VOWEL SIGN E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x112E5,
+ },
+ [0x112E6]={
+ category="mn",
+ description="KHUDAWADI VOWEL SIGN AI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x112E6,
+ },
+ [0x112E7]={
+ category="mn",
+ description="KHUDAWADI VOWEL SIGN O",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x112E7,
+ },
+ [0x112E8]={
+ category="mn",
+ description="KHUDAWADI VOWEL SIGN AU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x112E8,
+ },
+ [0x112E9]={
+ category="mn",
+ combining=0x7,
+ description="KHUDAWADI SIGN NUKTA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x112E9,
+ },
+ [0x112EA]={
+ category="mn",
+ combining=0x9,
+ description="KHUDAWADI SIGN VIRAMA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x112EA,
+ },
+ [0x112F0]={
+ category="nd",
+ description="KHUDAWADI DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x112F0,
+ },
+ [0x112F1]={
+ category="nd",
+ description="KHUDAWADI DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x112F1,
+ },
+ [0x112F2]={
+ category="nd",
+ description="KHUDAWADI DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x112F2,
+ },
+ [0x112F3]={
+ category="nd",
+ description="KHUDAWADI DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x112F3,
+ },
+ [0x112F4]={
+ category="nd",
+ description="KHUDAWADI DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x112F4,
+ },
+ [0x112F5]={
+ category="nd",
+ description="KHUDAWADI DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x112F5,
+ },
+ [0x112F6]={
+ category="nd",
+ description="KHUDAWADI DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x112F6,
+ },
+ [0x112F7]={
+ category="nd",
+ description="KHUDAWADI DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x112F7,
+ },
+ [0x112F8]={
+ category="nd",
+ description="KHUDAWADI DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x112F8,
+ },
+ [0x112F9]={
+ category="nd",
+ description="KHUDAWADI DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x112F9,
+ },
+ [0x11301]={
+ category="mn",
+ description="GRANTHA SIGN CANDRABINDU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11301,
+ },
+ [0x11302]={
+ category="mc",
+ description="GRANTHA SIGN ANUSVARA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11302,
+ },
+ [0x11303]={
+ category="mc",
+ description="GRANTHA SIGN VISARGA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11303,
+ },
+ [0x11305]={
+ category="lo",
+ description="GRANTHA LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11305,
+ },
+ [0x11306]={
+ category="lo",
+ description="GRANTHA LETTER AA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11306,
+ },
+ [0x11307]={
+ category="lo",
+ description="GRANTHA LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11307,
+ },
+ [0x11308]={
+ category="lo",
+ description="GRANTHA LETTER II",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11308,
+ },
+ [0x11309]={
+ category="lo",
+ description="GRANTHA LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11309,
+ },
+ [0x1130A]={
+ category="lo",
+ description="GRANTHA LETTER UU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1130A,
+ },
+ [0x1130B]={
+ category="lo",
+ description="GRANTHA LETTER VOCALIC R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1130B,
+ },
+ [0x1130C]={
+ category="lo",
+ description="GRANTHA LETTER VOCALIC L",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1130C,
+ },
+ [0x1130F]={
+ category="lo",
+ description="GRANTHA LETTER EE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1130F,
+ },
+ [0x11310]={
+ category="lo",
+ description="GRANTHA LETTER AI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11310,
+ },
+ [0x11313]={
+ category="lo",
+ description="GRANTHA LETTER OO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11313,
+ },
+ [0x11314]={
+ category="lo",
+ description="GRANTHA LETTER AU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11314,
+ },
+ [0x11315]={
+ category="lo",
+ description="GRANTHA LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11315,
+ },
+ [0x11316]={
+ category="lo",
+ description="GRANTHA LETTER KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11316,
+ },
+ [0x11317]={
+ category="lo",
+ description="GRANTHA LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11317,
+ },
+ [0x11318]={
+ category="lo",
+ description="GRANTHA LETTER GHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11318,
+ },
+ [0x11319]={
+ category="lo",
+ description="GRANTHA LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11319,
+ },
+ [0x1131A]={
+ category="lo",
+ description="GRANTHA LETTER CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1131A,
+ },
+ [0x1131B]={
+ category="lo",
+ description="GRANTHA LETTER CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1131B,
+ },
+ [0x1131C]={
+ category="lo",
+ description="GRANTHA LETTER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1131C,
+ },
+ [0x1131D]={
+ category="lo",
+ description="GRANTHA LETTER JHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1131D,
+ },
+ [0x1131E]={
+ category="lo",
+ description="GRANTHA LETTER NYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1131E,
+ },
+ [0x1131F]={
+ category="lo",
+ description="GRANTHA LETTER TTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1131F,
+ },
+ [0x11320]={
+ category="lo",
+ description="GRANTHA LETTER TTHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11320,
+ },
+ [0x11321]={
+ category="lo",
+ description="GRANTHA LETTER DDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11321,
+ },
+ [0x11322]={
+ category="lo",
+ description="GRANTHA LETTER DDHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11322,
+ },
+ [0x11323]={
+ category="lo",
+ description="GRANTHA LETTER NNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11323,
+ },
+ [0x11324]={
+ category="lo",
+ description="GRANTHA LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11324,
+ },
+ [0x11325]={
+ category="lo",
+ description="GRANTHA LETTER THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11325,
+ },
+ [0x11326]={
+ category="lo",
+ description="GRANTHA LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11326,
+ },
+ [0x11327]={
+ category="lo",
+ description="GRANTHA LETTER DHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11327,
+ },
+ [0x11328]={
+ category="lo",
+ description="GRANTHA LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11328,
+ },
+ [0x1132A]={
+ category="lo",
+ description="GRANTHA LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1132A,
+ },
+ [0x1132B]={
+ category="lo",
+ description="GRANTHA LETTER PHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1132B,
+ },
+ [0x1132C]={
+ category="lo",
+ description="GRANTHA LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1132C,
+ },
+ [0x1132D]={
+ category="lo",
+ description="GRANTHA LETTER BHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1132D,
+ },
+ [0x1132E]={
+ category="lo",
+ description="GRANTHA LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1132E,
+ },
+ [0x1132F]={
+ category="lo",
+ description="GRANTHA LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1132F,
+ },
+ [0x11330]={
+ category="lo",
+ description="GRANTHA LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11330,
+ },
+ [0x11332]={
+ category="lo",
+ description="GRANTHA LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11332,
+ },
+ [0x11333]={
+ category="lo",
+ description="GRANTHA LETTER LLA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11333,
+ },
+ [0x11335]={
+ category="lo",
+ description="GRANTHA LETTER VA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11335,
+ },
+ [0x11336]={
+ category="lo",
+ description="GRANTHA LETTER SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11336,
+ },
+ [0x11337]={
+ category="lo",
+ description="GRANTHA LETTER SSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11337,
+ },
+ [0x11338]={
+ category="lo",
+ description="GRANTHA LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11338,
+ },
+ [0x11339]={
+ category="lo",
+ description="GRANTHA LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11339,
+ },
+ [0x1133C]={
+ category="mn",
+ combining=0x7,
+ description="GRANTHA SIGN NUKTA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1133C,
+ },
+ [0x1133D]={
+ category="lo",
+ description="GRANTHA SIGN AVAGRAHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1133D,
+ },
+ [0x1133E]={
+ category="mc",
+ description="GRANTHA VOWEL SIGN AA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1133E,
+ },
+ [0x1133F]={
+ category="mc",
+ description="GRANTHA VOWEL SIGN I",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1133F,
+ },
+ [0x11340]={
+ category="mn",
+ description="GRANTHA VOWEL SIGN II",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11340,
+ },
+ [0x11341]={
+ category="mc",
+ description="GRANTHA VOWEL SIGN U",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11341,
+ },
+ [0x11342]={
+ category="mc",
+ description="GRANTHA VOWEL SIGN UU",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11342,
+ },
+ [0x11343]={
+ category="mc",
+ description="GRANTHA VOWEL SIGN VOCALIC R",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11343,
+ },
+ [0x11344]={
+ category="mc",
+ description="GRANTHA VOWEL SIGN VOCALIC RR",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11344,
+ },
+ [0x11347]={
+ category="mc",
+ description="GRANTHA VOWEL SIGN EE",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11347,
+ },
+ [0x11348]={
+ category="mc",
+ description="GRANTHA VOWEL SIGN AI",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11348,
+ },
+ [0x1134B]={
+ category="mc",
+ description="GRANTHA VOWEL SIGN OO",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x11347, 0x1133E },
+ unicodeslot=0x1134B,
+ },
+ [0x1134C]={
+ category="mc",
+ description="GRANTHA VOWEL SIGN AU",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x11347, 0x11357 },
+ unicodeslot=0x1134C,
+ },
+ [0x1134D]={
+ category="mc",
+ combining=0x9,
+ description="GRANTHA SIGN VIRAMA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1134D,
+ },
+ [0x11357]={
+ category="mc",
+ description="GRANTHA AU LENGTH MARK",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11357,
+ },
+ [0x1135D]={
+ category="lo",
+ description="GRANTHA SIGN PLUTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1135D,
+ },
+ [0x1135E]={
+ category="lo",
+ description="GRANTHA LETTER VEDIC ANUSVARA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1135E,
+ },
+ [0x1135F]={
+ category="lo",
+ description="GRANTHA LETTER VEDIC DOUBLE ANUSVARA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1135F,
+ },
+ [0x11360]={
+ category="lo",
+ description="GRANTHA LETTER VOCALIC RR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11360,
+ },
+ [0x11361]={
+ category="lo",
+ description="GRANTHA LETTER VOCALIC LL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11361,
+ },
+ [0x11362]={
+ category="mc",
+ description="GRANTHA VOWEL SIGN VOCALIC L",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11362,
+ },
+ [0x11363]={
+ category="mc",
+ description="GRANTHA VOWEL SIGN VOCALIC LL",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11363,
+ },
+ [0x11366]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING GRANTHA DIGIT ZERO",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11366,
+ },
+ [0x11367]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING GRANTHA DIGIT ONE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11367,
+ },
+ [0x11368]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING GRANTHA DIGIT TWO",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11368,
+ },
+ [0x11369]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING GRANTHA DIGIT THREE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11369,
+ },
+ [0x1136A]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING GRANTHA DIGIT FOUR",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1136A,
+ },
+ [0x1136B]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING GRANTHA DIGIT FIVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1136B,
+ },
+ [0x1136C]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING GRANTHA DIGIT SIX",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1136C,
+ },
+ [0x11370]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING GRANTHA LETTER A",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11370,
+ },
+ [0x11371]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING GRANTHA LETTER KA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11371,
+ },
+ [0x11372]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING GRANTHA LETTER NA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11372,
+ },
+ [0x11373]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING GRANTHA LETTER VI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11373,
+ },
+ [0x11374]={
+ category="mn",
+ combining=0xE6,
+ description="COMBINING GRANTHA LETTER PA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11374,
+ },
+ [0x11480]={
+ category="lo",
+ description="TIRHUTA ANJI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11480,
+ },
+ [0x11481]={
+ category="lo",
+ description="TIRHUTA LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11481,
+ },
+ [0x11482]={
+ category="lo",
+ description="TIRHUTA LETTER AA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11482,
+ },
+ [0x11483]={
+ category="lo",
+ description="TIRHUTA LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11483,
+ },
+ [0x11484]={
+ category="lo",
+ description="TIRHUTA LETTER II",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11484,
+ },
+ [0x11485]={
+ category="lo",
+ description="TIRHUTA LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11485,
+ },
+ [0x11486]={
+ category="lo",
+ description="TIRHUTA LETTER UU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11486,
+ },
+ [0x11487]={
+ category="lo",
+ description="TIRHUTA LETTER VOCALIC R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11487,
+ },
+ [0x11488]={
+ category="lo",
+ description="TIRHUTA LETTER VOCALIC RR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11488,
+ },
+ [0x11489]={
+ category="lo",
+ description="TIRHUTA LETTER VOCALIC L",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11489,
+ },
+ [0x1148A]={
+ category="lo",
+ description="TIRHUTA LETTER VOCALIC LL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1148A,
+ },
+ [0x1148B]={
+ category="lo",
+ description="TIRHUTA LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1148B,
+ },
+ [0x1148C]={
+ category="lo",
+ description="TIRHUTA LETTER AI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1148C,
+ },
+ [0x1148D]={
+ category="lo",
+ description="TIRHUTA LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1148D,
+ },
+ [0x1148E]={
+ category="lo",
+ description="TIRHUTA LETTER AU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1148E,
+ },
+ [0x1148F]={
+ category="lo",
+ description="TIRHUTA LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1148F,
+ },
+ [0x11490]={
+ category="lo",
+ description="TIRHUTA LETTER KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11490,
+ },
+ [0x11491]={
+ category="lo",
+ description="TIRHUTA LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11491,
+ },
+ [0x11492]={
+ category="lo",
+ description="TIRHUTA LETTER GHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11492,
+ },
+ [0x11493]={
+ category="lo",
+ description="TIRHUTA LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11493,
+ },
+ [0x11494]={
+ category="lo",
+ description="TIRHUTA LETTER CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11494,
+ },
+ [0x11495]={
+ category="lo",
+ description="TIRHUTA LETTER CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11495,
+ },
+ [0x11496]={
+ category="lo",
+ description="TIRHUTA LETTER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11496,
+ },
+ [0x11497]={
+ category="lo",
+ description="TIRHUTA LETTER JHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11497,
+ },
+ [0x11498]={
+ category="lo",
+ description="TIRHUTA LETTER NYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11498,
+ },
+ [0x11499]={
+ category="lo",
+ description="TIRHUTA LETTER TTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11499,
+ },
+ [0x1149A]={
+ category="lo",
+ description="TIRHUTA LETTER TTHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1149A,
+ },
+ [0x1149B]={
+ category="lo",
+ description="TIRHUTA LETTER DDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1149B,
+ },
+ [0x1149C]={
+ category="lo",
+ description="TIRHUTA LETTER DDHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1149C,
+ },
+ [0x1149D]={
+ category="lo",
+ description="TIRHUTA LETTER NNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1149D,
+ },
+ [0x1149E]={
+ category="lo",
+ description="TIRHUTA LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1149E,
+ },
+ [0x1149F]={
+ category="lo",
+ description="TIRHUTA LETTER THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1149F,
+ },
+ [0x114A0]={
+ category="lo",
+ description="TIRHUTA LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x114A0,
+ },
+ [0x114A1]={
+ category="lo",
+ description="TIRHUTA LETTER DHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x114A1,
+ },
+ [0x114A2]={
+ category="lo",
+ description="TIRHUTA LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x114A2,
+ },
+ [0x114A3]={
+ category="lo",
+ description="TIRHUTA LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x114A3,
+ },
+ [0x114A4]={
+ category="lo",
+ description="TIRHUTA LETTER PHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x114A4,
+ },
+ [0x114A5]={
+ category="lo",
+ description="TIRHUTA LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x114A5,
+ },
+ [0x114A6]={
+ category="lo",
+ description="TIRHUTA LETTER BHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x114A6,
+ },
+ [0x114A7]={
+ category="lo",
+ description="TIRHUTA LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x114A7,
+ },
+ [0x114A8]={
+ category="lo",
+ description="TIRHUTA LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x114A8,
+ },
+ [0x114A9]={
+ category="lo",
+ description="TIRHUTA LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x114A9,
+ },
+ [0x114AA]={
+ category="lo",
+ description="TIRHUTA LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x114AA,
+ },
+ [0x114AB]={
+ category="lo",
+ description="TIRHUTA LETTER VA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x114AB,
+ },
+ [0x114AC]={
+ category="lo",
+ description="TIRHUTA LETTER SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x114AC,
+ },
+ [0x114AD]={
+ category="lo",
+ description="TIRHUTA LETTER SSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x114AD,
+ },
+ [0x114AE]={
+ category="lo",
+ description="TIRHUTA LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x114AE,
+ },
+ [0x114AF]={
+ category="lo",
+ description="TIRHUTA LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x114AF,
+ },
+ [0x114B0]={
+ category="mc",
+ description="TIRHUTA VOWEL SIGN AA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x114B0,
+ },
+ [0x114B1]={
+ category="mc",
+ description="TIRHUTA VOWEL SIGN I",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x114B1,
+ },
+ [0x114B2]={
+ category="mc",
+ description="TIRHUTA VOWEL SIGN II",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x114B2,
+ },
+ [0x114B3]={
+ category="mn",
+ description="TIRHUTA VOWEL SIGN U",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x114B3,
+ },
+ [0x114B4]={
+ category="mn",
+ description="TIRHUTA VOWEL SIGN UU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x114B4,
+ },
+ [0x114B5]={
+ category="mn",
+ description="TIRHUTA VOWEL SIGN VOCALIC R",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x114B5,
+ },
+ [0x114B6]={
+ category="mn",
+ description="TIRHUTA VOWEL SIGN VOCALIC RR",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x114B6,
+ },
+ [0x114B7]={
+ category="mn",
+ description="TIRHUTA VOWEL SIGN VOCALIC L",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x114B7,
+ },
+ [0x114B8]={
+ category="mn",
+ description="TIRHUTA VOWEL SIGN VOCALIC LL",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x114B8,
+ },
+ [0x114B9]={
+ category="mc",
+ description="TIRHUTA VOWEL SIGN E",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x114B9,
+ },
+ [0x114BA]={
+ category="mn",
+ description="TIRHUTA VOWEL SIGN SHORT E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x114BA,
+ },
+ [0x114BB]={
+ category="mc",
+ description="TIRHUTA VOWEL SIGN AI",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x114B9, 0x114BA },
+ unicodeslot=0x114BB,
+ },
+ [0x114BC]={
+ category="mc",
+ description="TIRHUTA VOWEL SIGN O",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x114B9, 0x114B0 },
+ unicodeslot=0x114BC,
+ },
+ [0x114BD]={
+ category="mc",
+ description="TIRHUTA VOWEL SIGN SHORT O",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x114BD,
+ },
+ [0x114BE]={
+ category="mc",
+ description="TIRHUTA VOWEL SIGN AU",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x114B9, 0x114BD },
+ unicodeslot=0x114BE,
+ },
+ [0x114BF]={
+ category="mn",
+ description="TIRHUTA SIGN CANDRABINDU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x114BF,
+ },
+ [0x114C0]={
+ category="mn",
+ description="TIRHUTA SIGN ANUSVARA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x114C0,
+ },
+ [0x114C1]={
+ category="mc",
+ description="TIRHUTA SIGN VISARGA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x114C1,
+ },
+ [0x114C2]={
+ category="mn",
+ combining=0x9,
+ description="TIRHUTA SIGN VIRAMA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x114C2,
+ },
+ [0x114C3]={
+ category="mn",
+ combining=0x7,
+ description="TIRHUTA SIGN NUKTA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x114C3,
+ },
+ [0x114C4]={
+ category="lo",
+ description="TIRHUTA SIGN AVAGRAHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x114C4,
+ },
+ [0x114C5]={
+ category="lo",
+ description="TIRHUTA GVANG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x114C5,
+ },
+ [0x114C6]={
+ category="po",
+ description="TIRHUTA ABBREVIATION SIGN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x114C6,
+ },
+ [0x114C7]={
+ category="lo",
+ description="TIRHUTA OM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x114C7,
+ },
+ [0x114D0]={
+ category="nd",
+ description="TIRHUTA DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x114D0,
+ },
+ [0x114D1]={
+ category="nd",
+ description="TIRHUTA DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x114D1,
+ },
+ [0x114D2]={
+ category="nd",
+ description="TIRHUTA DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x114D2,
+ },
+ [0x114D3]={
+ category="nd",
+ description="TIRHUTA DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x114D3,
+ },
+ [0x114D4]={
+ category="nd",
+ description="TIRHUTA DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x114D4,
+ },
+ [0x114D5]={
+ category="nd",
+ description="TIRHUTA DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x114D5,
+ },
+ [0x114D6]={
+ category="nd",
+ description="TIRHUTA DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x114D6,
+ },
+ [0x114D7]={
+ category="nd",
+ description="TIRHUTA DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x114D7,
+ },
+ [0x114D8]={
+ category="nd",
+ description="TIRHUTA DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x114D8,
+ },
+ [0x114D9]={
+ category="nd",
+ description="TIRHUTA DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x114D9,
+ },
+ [0x11580]={
+ category="lo",
+ description="SIDDHAM LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11580,
+ },
+ [0x11581]={
+ category="lo",
+ description="SIDDHAM LETTER AA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11581,
+ },
+ [0x11582]={
+ category="lo",
+ description="SIDDHAM LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11582,
+ },
+ [0x11583]={
+ category="lo",
+ description="SIDDHAM LETTER II",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11583,
+ },
+ [0x11584]={
+ category="lo",
+ description="SIDDHAM LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11584,
+ },
+ [0x11585]={
+ category="lo",
+ description="SIDDHAM LETTER UU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11585,
+ },
+ [0x11586]={
+ category="lo",
+ description="SIDDHAM LETTER VOCALIC R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11586,
+ },
+ [0x11587]={
+ category="lo",
+ description="SIDDHAM LETTER VOCALIC RR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11587,
+ },
+ [0x11588]={
+ category="lo",
+ description="SIDDHAM LETTER VOCALIC L",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11588,
+ },
+ [0x11589]={
+ category="lo",
+ description="SIDDHAM LETTER VOCALIC LL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11589,
+ },
+ [0x1158A]={
+ category="lo",
+ description="SIDDHAM LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1158A,
+ },
+ [0x1158B]={
+ category="lo",
+ description="SIDDHAM LETTER AI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1158B,
+ },
+ [0x1158C]={
+ category="lo",
+ description="SIDDHAM LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1158C,
+ },
+ [0x1158D]={
+ category="lo",
+ description="SIDDHAM LETTER AU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1158D,
+ },
+ [0x1158E]={
+ category="lo",
+ description="SIDDHAM LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1158E,
+ },
+ [0x1158F]={
+ category="lo",
+ description="SIDDHAM LETTER KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1158F,
+ },
+ [0x11590]={
+ category="lo",
+ description="SIDDHAM LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11590,
+ },
+ [0x11591]={
+ category="lo",
+ description="SIDDHAM LETTER GHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11591,
+ },
+ [0x11592]={
+ category="lo",
+ description="SIDDHAM LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11592,
+ },
+ [0x11593]={
+ category="lo",
+ description="SIDDHAM LETTER CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11593,
+ },
+ [0x11594]={
+ category="lo",
+ description="SIDDHAM LETTER CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11594,
+ },
+ [0x11595]={
+ category="lo",
+ description="SIDDHAM LETTER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11595,
+ },
+ [0x11596]={
+ category="lo",
+ description="SIDDHAM LETTER JHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11596,
+ },
+ [0x11597]={
+ category="lo",
+ description="SIDDHAM LETTER NYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11597,
+ },
+ [0x11598]={
+ category="lo",
+ description="SIDDHAM LETTER TTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11598,
+ },
+ [0x11599]={
+ category="lo",
+ description="SIDDHAM LETTER TTHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11599,
+ },
+ [0x1159A]={
+ category="lo",
+ description="SIDDHAM LETTER DDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1159A,
+ },
+ [0x1159B]={
+ category="lo",
+ description="SIDDHAM LETTER DDHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1159B,
+ },
+ [0x1159C]={
+ category="lo",
+ description="SIDDHAM LETTER NNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1159C,
+ },
+ [0x1159D]={
+ category="lo",
+ description="SIDDHAM LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1159D,
+ },
+ [0x1159E]={
+ category="lo",
+ description="SIDDHAM LETTER THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1159E,
+ },
+ [0x1159F]={
+ category="lo",
+ description="SIDDHAM LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1159F,
+ },
+ [0x115A0]={
+ category="lo",
+ description="SIDDHAM LETTER DHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x115A0,
+ },
+ [0x115A1]={
+ category="lo",
+ description="SIDDHAM LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x115A1,
+ },
+ [0x115A2]={
+ category="lo",
+ description="SIDDHAM LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x115A2,
+ },
+ [0x115A3]={
+ category="lo",
+ description="SIDDHAM LETTER PHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x115A3,
+ },
+ [0x115A4]={
+ category="lo",
+ description="SIDDHAM LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x115A4,
+ },
+ [0x115A5]={
+ category="lo",
+ description="SIDDHAM LETTER BHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x115A5,
+ },
+ [0x115A6]={
+ category="lo",
+ description="SIDDHAM LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x115A6,
+ },
+ [0x115A7]={
+ category="lo",
+ description="SIDDHAM LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x115A7,
+ },
+ [0x115A8]={
+ category="lo",
+ description="SIDDHAM LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x115A8,
+ },
+ [0x115A9]={
+ category="lo",
+ description="SIDDHAM LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x115A9,
+ },
+ [0x115AA]={
+ category="lo",
+ description="SIDDHAM LETTER VA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x115AA,
+ },
+ [0x115AB]={
+ category="lo",
+ description="SIDDHAM LETTER SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x115AB,
+ },
+ [0x115AC]={
+ category="lo",
+ description="SIDDHAM LETTER SSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x115AC,
+ },
+ [0x115AD]={
+ category="lo",
+ description="SIDDHAM LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x115AD,
+ },
+ [0x115AE]={
+ category="lo",
+ description="SIDDHAM LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x115AE,
+ },
+ [0x115AF]={
+ category="mc",
+ description="SIDDHAM VOWEL SIGN AA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x115AF,
+ },
+ [0x115B0]={
+ category="mc",
+ description="SIDDHAM VOWEL SIGN I",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x115B0,
+ },
+ [0x115B1]={
+ category="mc",
+ description="SIDDHAM VOWEL SIGN II",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x115B1,
+ },
+ [0x115B2]={
+ category="mn",
+ description="SIDDHAM VOWEL SIGN U",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x115B2,
+ },
+ [0x115B3]={
+ category="mn",
+ description="SIDDHAM VOWEL SIGN UU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x115B3,
+ },
+ [0x115B4]={
+ category="mn",
+ description="SIDDHAM VOWEL SIGN VOCALIC R",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x115B4,
+ },
+ [0x115B5]={
+ category="mn",
+ description="SIDDHAM VOWEL SIGN VOCALIC RR",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x115B5,
+ },
+ [0x115B8]={
+ category="mc",
+ description="SIDDHAM VOWEL SIGN E",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x115B8,
+ },
+ [0x115B9]={
+ category="mc",
+ description="SIDDHAM VOWEL SIGN AI",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x115B9,
+ },
+ [0x115BA]={
+ category="mc",
+ description="SIDDHAM VOWEL SIGN O",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x115B8, 0x115AF },
+ unicodeslot=0x115BA,
+ },
+ [0x115BB]={
+ category="mc",
+ description="SIDDHAM VOWEL SIGN AU",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x115B9, 0x115AF },
+ unicodeslot=0x115BB,
+ },
+ [0x115BC]={
+ category="mn",
+ description="SIDDHAM SIGN CANDRABINDU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x115BC,
+ },
+ [0x115BD]={
+ category="mn",
+ description="SIDDHAM SIGN ANUSVARA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x115BD,
+ },
+ [0x115BE]={
+ category="mc",
+ description="SIDDHAM SIGN VISARGA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x115BE,
+ },
+ [0x115BF]={
+ category="mn",
+ combining=0x9,
+ description="SIDDHAM SIGN VIRAMA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x115BF,
+ },
+ [0x115C0]={
+ category="mn",
+ combining=0x7,
+ description="SIDDHAM SIGN NUKTA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x115C0,
+ },
+ [0x115C1]={
+ category="po",
+ description="SIDDHAM SIGN SIDDHAM",
+ direction="l",
+ linebreak="bb",
+ unicodeslot=0x115C1,
+ },
+ [0x115C2]={
+ category="po",
+ description="SIDDHAM DANDA",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x115C2,
+ },
+ [0x115C3]={
+ category="po",
+ description="SIDDHAM DOUBLE DANDA",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x115C3,
+ },
+ [0x115C4]={
+ category="po",
+ description="SIDDHAM SEPARATOR DOT",
+ direction="l",
+ linebreak="ex",
+ unicodeslot=0x115C4,
+ },
+ [0x115C5]={
+ category="po",
+ description="SIDDHAM SEPARATOR BAR",
+ direction="l",
+ linebreak="ex",
+ unicodeslot=0x115C5,
+ },
+ [0x115C6]={
+ category="po",
+ description="SIDDHAM REPETITION MARK-1",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x115C6,
+ },
+ [0x115C7]={
+ category="po",
+ description="SIDDHAM REPETITION MARK-2",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x115C7,
+ },
+ [0x115C8]={
+ category="po",
+ description="SIDDHAM REPETITION MARK-3",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x115C8,
+ },
+ [0x115C9]={
+ category="po",
+ description="SIDDHAM END OF TEXT MARK",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x115C9,
+ },
+ [0x11600]={
+ category="lo",
+ description="MODI LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11600,
+ },
+ [0x11601]={
+ category="lo",
+ description="MODI LETTER AA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11601,
+ },
+ [0x11602]={
+ category="lo",
+ description="MODI LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11602,
+ },
+ [0x11603]={
+ category="lo",
+ description="MODI LETTER II",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11603,
+ },
+ [0x11604]={
+ category="lo",
+ description="MODI LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11604,
+ },
+ [0x11605]={
+ category="lo",
+ description="MODI LETTER UU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11605,
+ },
+ [0x11606]={
+ category="lo",
+ description="MODI LETTER VOCALIC R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11606,
+ },
+ [0x11607]={
+ category="lo",
+ description="MODI LETTER VOCALIC RR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11607,
+ },
+ [0x11608]={
+ category="lo",
+ description="MODI LETTER VOCALIC L",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11608,
+ },
+ [0x11609]={
+ category="lo",
+ description="MODI LETTER VOCALIC LL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11609,
+ },
+ [0x1160A]={
+ category="lo",
+ description="MODI LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1160A,
+ },
+ [0x1160B]={
+ category="lo",
+ description="MODI LETTER AI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1160B,
+ },
+ [0x1160C]={
+ category="lo",
+ description="MODI LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1160C,
+ },
+ [0x1160D]={
+ category="lo",
+ description="MODI LETTER AU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1160D,
+ },
+ [0x1160E]={
+ category="lo",
+ description="MODI LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1160E,
+ },
+ [0x1160F]={
+ category="lo",
+ description="MODI LETTER KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1160F,
+ },
+ [0x11610]={
+ category="lo",
+ description="MODI LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11610,
+ },
+ [0x11611]={
+ category="lo",
+ description="MODI LETTER GHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11611,
+ },
+ [0x11612]={
+ category="lo",
+ description="MODI LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11612,
+ },
+ [0x11613]={
+ category="lo",
+ description="MODI LETTER CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11613,
+ },
+ [0x11614]={
+ category="lo",
+ description="MODI LETTER CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11614,
+ },
+ [0x11615]={
+ category="lo",
+ description="MODI LETTER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11615,
+ },
+ [0x11616]={
+ category="lo",
+ description="MODI LETTER JHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11616,
+ },
+ [0x11617]={
+ category="lo",
+ description="MODI LETTER NYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11617,
+ },
+ [0x11618]={
+ category="lo",
+ description="MODI LETTER TTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11618,
+ },
+ [0x11619]={
+ category="lo",
+ description="MODI LETTER TTHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11619,
+ },
+ [0x1161A]={
+ category="lo",
+ description="MODI LETTER DDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1161A,
+ },
+ [0x1161B]={
+ category="lo",
+ description="MODI LETTER DDHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1161B,
+ },
+ [0x1161C]={
+ category="lo",
+ description="MODI LETTER NNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1161C,
+ },
+ [0x1161D]={
+ category="lo",
+ description="MODI LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1161D,
+ },
+ [0x1161E]={
+ category="lo",
+ description="MODI LETTER THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1161E,
+ },
+ [0x1161F]={
+ category="lo",
+ description="MODI LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1161F,
+ },
+ [0x11620]={
+ category="lo",
+ description="MODI LETTER DHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11620,
+ },
+ [0x11621]={
+ category="lo",
+ description="MODI LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11621,
+ },
+ [0x11622]={
+ category="lo",
+ description="MODI LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11622,
+ },
+ [0x11623]={
+ category="lo",
+ description="MODI LETTER PHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11623,
+ },
+ [0x11624]={
+ category="lo",
+ description="MODI LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11624,
+ },
+ [0x11625]={
+ category="lo",
+ description="MODI LETTER BHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11625,
+ },
+ [0x11626]={
+ category="lo",
+ description="MODI LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11626,
+ },
+ [0x11627]={
+ category="lo",
+ description="MODI LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11627,
+ },
+ [0x11628]={
+ category="lo",
+ description="MODI LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11628,
+ },
+ [0x11629]={
+ category="lo",
+ description="MODI LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11629,
+ },
+ [0x1162A]={
+ category="lo",
+ description="MODI LETTER VA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1162A,
+ },
+ [0x1162B]={
+ category="lo",
+ description="MODI LETTER SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1162B,
+ },
+ [0x1162C]={
+ category="lo",
+ description="MODI LETTER SSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1162C,
+ },
+ [0x1162D]={
+ category="lo",
+ description="MODI LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1162D,
+ },
+ [0x1162E]={
+ category="lo",
+ description="MODI LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1162E,
+ },
+ [0x1162F]={
+ category="lo",
+ description="MODI LETTER LLA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1162F,
+ },
+ [0x11630]={
+ category="mc",
+ description="MODI VOWEL SIGN AA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11630,
+ },
+ [0x11631]={
+ category="mc",
+ description="MODI VOWEL SIGN I",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11631,
+ },
+ [0x11632]={
+ category="mc",
+ description="MODI VOWEL SIGN II",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11632,
+ },
+ [0x11633]={
+ category="mn",
+ description="MODI VOWEL SIGN U",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11633,
+ },
+ [0x11634]={
+ category="mn",
+ description="MODI VOWEL SIGN UU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11634,
+ },
+ [0x11635]={
+ category="mn",
+ description="MODI VOWEL SIGN VOCALIC R",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11635,
+ },
+ [0x11636]={
+ category="mn",
+ description="MODI VOWEL SIGN VOCALIC RR",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11636,
+ },
+ [0x11637]={
+ category="mn",
+ description="MODI VOWEL SIGN VOCALIC L",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11637,
+ },
+ [0x11638]={
+ category="mn",
+ description="MODI VOWEL SIGN VOCALIC LL",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11638,
+ },
+ [0x11639]={
+ category="mn",
+ description="MODI VOWEL SIGN E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11639,
+ },
+ [0x1163A]={
+ category="mn",
+ description="MODI VOWEL SIGN AI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1163A,
+ },
+ [0x1163B]={
+ category="mc",
+ description="MODI VOWEL SIGN O",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1163B,
+ },
+ [0x1163C]={
+ category="mc",
+ description="MODI VOWEL SIGN AU",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1163C,
+ },
+ [0x1163D]={
+ category="mn",
+ description="MODI SIGN ANUSVARA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1163D,
+ },
+ [0x1163E]={
+ category="mc",
+ description="MODI SIGN VISARGA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1163E,
+ },
+ [0x1163F]={
+ category="mn",
+ combining=0x9,
+ description="MODI SIGN VIRAMA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1163F,
+ },
+ [0x11640]={
+ category="mn",
+ description="MODI SIGN ARDHACANDRA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11640,
+ },
+ [0x11641]={
+ category="po",
+ description="MODI DANDA",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x11641,
+ },
+ [0x11642]={
+ category="po",
+ description="MODI DOUBLE DANDA",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x11642,
+ },
+ [0x11643]={
+ category="po",
+ description="MODI ABBREVIATION SIGN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11643,
+ },
+ [0x11644]={
+ category="lo",
+ description="MODI SIGN HUVA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11644,
+ },
+ [0x11650]={
+ category="nd",
+ description="MODI DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x11650,
+ },
+ [0x11651]={
+ category="nd",
+ description="MODI DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x11651,
+ },
+ [0x11652]={
+ category="nd",
+ description="MODI DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x11652,
+ },
+ [0x11653]={
+ category="nd",
+ description="MODI DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x11653,
+ },
+ [0x11654]={
+ category="nd",
+ description="MODI DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x11654,
+ },
+ [0x11655]={
+ category="nd",
+ description="MODI DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x11655,
+ },
+ [0x11656]={
+ category="nd",
+ description="MODI DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x11656,
+ },
+ [0x11657]={
+ category="nd",
+ description="MODI DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x11657,
+ },
+ [0x11658]={
+ category="nd",
+ description="MODI DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x11658,
+ },
+ [0x11659]={
+ category="nd",
+ description="MODI DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x11659,
+ },
[0x11680]={
category="lo",
description="TAKRI LETTER A",
@@ -143603,6 +155326,7 @@ characters.data={
},
[0x116B6]={
category="mc",
+ combining=0x9,
description="TAKRI SIGN VIRAMA",
direction="l",
linebreak="cm",
@@ -143610,6 +155334,7 @@ characters.data={
},
[0x116B7]={
category="mn",
+ combining=0x7,
description="TAKRI SIGN NUKTA",
direction="nsm",
linebreak="cm",
@@ -143685,6 +155410,993 @@ characters.data={
linebreak="nu",
unicodeslot=0x116C9,
},
+ [0x118A0]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER NGAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118A0,
+ },
+ [0x118A1]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118A1,
+ },
+ [0x118A2]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER WI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118A2,
+ },
+ [0x118A3]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER YU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118A3,
+ },
+ [0x118A4]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118A4,
+ },
+ [0x118A5]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER YO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118A5,
+ },
+ [0x118A6]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER II",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118A6,
+ },
+ [0x118A7]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER UU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118A7,
+ },
+ [0x118A8]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118A8,
+ },
+ [0x118A9]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118A9,
+ },
+ [0x118AA]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER ANG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118AA,
+ },
+ [0x118AB]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118AB,
+ },
+ [0x118AC]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER KO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118AC,
+ },
+ [0x118AD]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER ENY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118AD,
+ },
+ [0x118AE]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER YUJ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118AE,
+ },
+ [0x118AF]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER UC",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118AF,
+ },
+ [0x118B0]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER ENN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118B0,
+ },
+ [0x118B1]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER ODD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118B1,
+ },
+ [0x118B2]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER TTE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118B2,
+ },
+ [0x118B3]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER NUNG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118B3,
+ },
+ [0x118B4]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118B4,
+ },
+ [0x118B5]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER AT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118B5,
+ },
+ [0x118B6]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER AM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118B6,
+ },
+ [0x118B7]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER BU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118B7,
+ },
+ [0x118B8]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER PU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118B8,
+ },
+ [0x118B9]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER HIYO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118B9,
+ },
+ [0x118BA]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER HOLO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118BA,
+ },
+ [0x118BB]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER HORR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118BB,
+ },
+ [0x118BC]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER HAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118BC,
+ },
+ [0x118BD]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER SSUU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118BD,
+ },
+ [0x118BE]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER SII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118BE,
+ },
+ [0x118BF]={
+ category="lu",
+ description="WARANG CITI CAPITAL LETTER VIYO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118BF,
+ },
+ [0x118C0]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER NGAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118C0,
+ },
+ [0x118C1]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118C1,
+ },
+ [0x118C2]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER WI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118C2,
+ },
+ [0x118C3]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER YU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118C3,
+ },
+ [0x118C4]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118C4,
+ },
+ [0x118C5]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER YO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118C5,
+ },
+ [0x118C6]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER II",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118C6,
+ },
+ [0x118C7]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER UU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118C7,
+ },
+ [0x118C8]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118C8,
+ },
+ [0x118C9]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118C9,
+ },
+ [0x118CA]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER ANG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118CA,
+ },
+ [0x118CB]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118CB,
+ },
+ [0x118CC]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER KO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118CC,
+ },
+ [0x118CD]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER ENY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118CD,
+ },
+ [0x118CE]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER YUJ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118CE,
+ },
+ [0x118CF]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER UC",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118CF,
+ },
+ [0x118D0]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER ENN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118D0,
+ },
+ [0x118D1]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER ODD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118D1,
+ },
+ [0x118D2]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER TTE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118D2,
+ },
+ [0x118D3]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER NUNG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118D3,
+ },
+ [0x118D4]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118D4,
+ },
+ [0x118D5]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER AT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118D5,
+ },
+ [0x118D6]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER AM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118D6,
+ },
+ [0x118D7]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER BU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118D7,
+ },
+ [0x118D8]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER PU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118D8,
+ },
+ [0x118D9]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER HIYO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118D9,
+ },
+ [0x118DA]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER HOLO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118DA,
+ },
+ [0x118DB]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER HORR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118DB,
+ },
+ [0x118DC]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER HAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118DC,
+ },
+ [0x118DD]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER SSUU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118DD,
+ },
+ [0x118DE]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER SII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118DE,
+ },
+ [0x118DF]={
+ category="ll",
+ description="WARANG CITI SMALL LETTER VIYO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118DF,
+ },
+ [0x118E0]={
+ category="nd",
+ description="WARANG CITI DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x118E0,
+ },
+ [0x118E1]={
+ category="nd",
+ description="WARANG CITI DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x118E1,
+ },
+ [0x118E2]={
+ category="nd",
+ description="WARANG CITI DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x118E2,
+ },
+ [0x118E3]={
+ category="nd",
+ description="WARANG CITI DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x118E3,
+ },
+ [0x118E4]={
+ category="nd",
+ description="WARANG CITI DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x118E4,
+ },
+ [0x118E5]={
+ category="nd",
+ description="WARANG CITI DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x118E5,
+ },
+ [0x118E6]={
+ category="nd",
+ description="WARANG CITI DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x118E6,
+ },
+ [0x118E7]={
+ category="nd",
+ description="WARANG CITI DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x118E7,
+ },
+ [0x118E8]={
+ category="nd",
+ description="WARANG CITI DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x118E8,
+ },
+ [0x118E9]={
+ category="nd",
+ description="WARANG CITI DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x118E9,
+ },
+ [0x118EA]={
+ category="no",
+ description="WARANG CITI NUMBER TEN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118EA,
+ },
+ [0x118EB]={
+ category="no",
+ description="WARANG CITI NUMBER TWENTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118EB,
+ },
+ [0x118EC]={
+ category="no",
+ description="WARANG CITI NUMBER THIRTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118EC,
+ },
+ [0x118ED]={
+ category="no",
+ description="WARANG CITI NUMBER FORTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118ED,
+ },
+ [0x118EE]={
+ category="no",
+ description="WARANG CITI NUMBER FIFTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118EE,
+ },
+ [0x118EF]={
+ category="no",
+ description="WARANG CITI NUMBER SIXTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118EF,
+ },
+ [0x118F0]={
+ category="no",
+ description="WARANG CITI NUMBER SEVENTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118F0,
+ },
+ [0x118F1]={
+ category="no",
+ description="WARANG CITI NUMBER EIGHTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118F1,
+ },
+ [0x118F2]={
+ category="no",
+ description="WARANG CITI NUMBER NINETY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118F2,
+ },
+ [0x118FF]={
+ category="lo",
+ description="WARANG CITI OM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x118FF,
+ },
+ [0x11AC0]={
+ category="lo",
+ description="PAU CIN HAU LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AC0,
+ },
+ [0x11AC1]={
+ category="lo",
+ description="PAU CIN HAU LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AC1,
+ },
+ [0x11AC2]={
+ category="lo",
+ description="PAU CIN HAU LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AC2,
+ },
+ [0x11AC3]={
+ category="lo",
+ description="PAU CIN HAU LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AC3,
+ },
+ [0x11AC4]={
+ category="lo",
+ description="PAU CIN HAU LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AC4,
+ },
+ [0x11AC5]={
+ category="lo",
+ description="PAU CIN HAU LETTER ZA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AC5,
+ },
+ [0x11AC6]={
+ category="lo",
+ description="PAU CIN HAU LETTER VA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AC6,
+ },
+ [0x11AC7]={
+ category="lo",
+ description="PAU CIN HAU LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AC7,
+ },
+ [0x11AC8]={
+ category="lo",
+ description="PAU CIN HAU LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AC8,
+ },
+ [0x11AC9]={
+ category="lo",
+ description="PAU CIN HAU LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AC9,
+ },
+ [0x11ACA]={
+ category="lo",
+ description="PAU CIN HAU LETTER KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11ACA,
+ },
+ [0x11ACB]={
+ category="lo",
+ description="PAU CIN HAU LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11ACB,
+ },
+ [0x11ACC]={
+ category="lo",
+ description="PAU CIN HAU LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11ACC,
+ },
+ [0x11ACD]={
+ category="lo",
+ description="PAU CIN HAU LETTER CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11ACD,
+ },
+ [0x11ACE]={
+ category="lo",
+ description="PAU CIN HAU LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11ACE,
+ },
+ [0x11ACF]={
+ category="lo",
+ description="PAU CIN HAU LETTER THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11ACF,
+ },
+ [0x11AD0]={
+ category="lo",
+ description="PAU CIN HAU LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AD0,
+ },
+ [0x11AD1]={
+ category="lo",
+ description="PAU CIN HAU LETTER PHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AD1,
+ },
+ [0x11AD2]={
+ category="lo",
+ description="PAU CIN HAU LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AD2,
+ },
+ [0x11AD3]={
+ category="lo",
+ description="PAU CIN HAU LETTER FA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AD3,
+ },
+ [0x11AD4]={
+ category="lo",
+ description="PAU CIN HAU LETTER CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AD4,
+ },
+ [0x11AD5]={
+ category="lo",
+ description="PAU CIN HAU LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AD5,
+ },
+ [0x11AD6]={
+ category="lo",
+ description="PAU CIN HAU LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AD6,
+ },
+ [0x11AD7]={
+ category="lo",
+ description="PAU CIN HAU LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AD7,
+ },
+ [0x11AD8]={
+ category="lo",
+ description="PAU CIN HAU LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AD8,
+ },
+ [0x11AD9]={
+ category="lo",
+ description="PAU CIN HAU LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AD9,
+ },
+ [0x11ADA]={
+ category="lo",
+ description="PAU CIN HAU LETTER UA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11ADA,
+ },
+ [0x11ADB]={
+ category="lo",
+ description="PAU CIN HAU LETTER IA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11ADB,
+ },
+ [0x11ADC]={
+ category="lo",
+ description="PAU CIN HAU LETTER FINAL P",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11ADC,
+ },
+ [0x11ADD]={
+ category="lo",
+ description="PAU CIN HAU LETTER FINAL K",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11ADD,
+ },
+ [0x11ADE]={
+ category="lo",
+ description="PAU CIN HAU LETTER FINAL T",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11ADE,
+ },
+ [0x11ADF]={
+ category="lo",
+ description="PAU CIN HAU LETTER FINAL M",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11ADF,
+ },
+ [0x11AE0]={
+ category="lo",
+ description="PAU CIN HAU LETTER FINAL N",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AE0,
+ },
+ [0x11AE1]={
+ category="lo",
+ description="PAU CIN HAU LETTER FINAL L",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AE1,
+ },
+ [0x11AE2]={
+ category="lo",
+ description="PAU CIN HAU LETTER FINAL W",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AE2,
+ },
+ [0x11AE3]={
+ category="lo",
+ description="PAU CIN HAU LETTER FINAL NG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AE3,
+ },
+ [0x11AE4]={
+ category="lo",
+ description="PAU CIN HAU LETTER FINAL Y",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AE4,
+ },
+ [0x11AE5]={
+ category="lo",
+ description="PAU CIN HAU RISING TONE LONG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AE5,
+ },
+ [0x11AE6]={
+ category="lo",
+ description="PAU CIN HAU RISING TONE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AE6,
+ },
+ [0x11AE7]={
+ category="lo",
+ description="PAU CIN HAU SANDHI GLOTTAL STOP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AE7,
+ },
+ [0x11AE8]={
+ category="lo",
+ description="PAU CIN HAU RISING TONE LONG FINAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AE8,
+ },
+ [0x11AE9]={
+ category="lo",
+ description="PAU CIN HAU RISING TONE FINAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AE9,
+ },
+ [0x11AEA]={
+ category="lo",
+ description="PAU CIN HAU SANDHI GLOTTAL STOP FINAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AEA,
+ },
+ [0x11AEB]={
+ category="lo",
+ description="PAU CIN HAU SANDHI TONE LONG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AEB,
+ },
+ [0x11AEC]={
+ category="lo",
+ description="PAU CIN HAU SANDHI TONE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AEC,
+ },
+ [0x11AED]={
+ category="lo",
+ description="PAU CIN HAU SANDHI TONE LONG FINAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AED,
+ },
+ [0x11AEE]={
+ category="lo",
+ description="PAU CIN HAU SANDHI TONE FINAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AEE,
+ },
+ [0x11AEF]={
+ category="lo",
+ description="PAU CIN HAU MID-LEVEL TONE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AEF,
+ },
+ [0x11AF0]={
+ category="lo",
+ description="PAU CIN HAU GLOTTAL STOP VARIANT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AF0,
+ },
+ [0x11AF1]={
+ category="lo",
+ description="PAU CIN HAU MID-LEVEL TONE LONG FINAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AF1,
+ },
+ [0x11AF2]={
+ category="lo",
+ description="PAU CIN HAU MID-LEVEL TONE FINAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AF2,
+ },
+ [0x11AF3]={
+ category="lo",
+ description="PAU CIN HAU LOW-FALLING TONE LONG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AF3,
+ },
+ [0x11AF4]={
+ category="lo",
+ description="PAU CIN HAU LOW-FALLING TONE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AF4,
+ },
+ [0x11AF5]={
+ category="lo",
+ description="PAU CIN HAU GLOTTAL STOP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AF5,
+ },
+ [0x11AF6]={
+ category="lo",
+ description="PAU CIN HAU LOW-FALLING TONE LONG FINAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AF6,
+ },
+ [0x11AF7]={
+ category="lo",
+ description="PAU CIN HAU LOW-FALLING TONE FINAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AF7,
+ },
+ [0x11AF8]={
+ category="lo",
+ description="PAU CIN HAU GLOTTAL STOP FINAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11AF8,
+ },
[0x12000]={
category="lo",
description="CUNEIFORM SIGN A",
@@ -149840,6 +162552,300 @@ characters.data={
linebreak="al",
unicodeslot=0x1236E,
},
+ [0x1236F]={
+ category="lo",
+ description="CUNEIFORM SIGN KAP ELAMITE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1236F,
+ },
+ [0x12370]={
+ category="lo",
+ description="CUNEIFORM SIGN AB TIMES NUN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12370,
+ },
+ [0x12371]={
+ category="lo",
+ description="CUNEIFORM SIGN AB2 TIMES A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12371,
+ },
+ [0x12372]={
+ category="lo",
+ description="CUNEIFORM SIGN AMAR TIMES KUG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12372,
+ },
+ [0x12373]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS MASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12373,
+ },
+ [0x12374]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG3",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12374,
+ },
+ [0x12375]={
+ category="lo",
+ description="CUNEIFORM SIGN DISH PLUS SHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12375,
+ },
+ [0x12376]={
+ category="lo",
+ description="CUNEIFORM SIGN DUB TIMES SHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12376,
+ },
+ [0x12377]={
+ category="lo",
+ description="CUNEIFORM SIGN EZEN TIMES GUD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12377,
+ },
+ [0x12378]={
+ category="lo",
+ description="CUNEIFORM SIGN EZEN TIMES SHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12378,
+ },
+ [0x12379]={
+ category="lo",
+ description="CUNEIFORM SIGN GA2 TIMES AN PLUS KAK PLUS A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12379,
+ },
+ [0x1237A]={
+ category="lo",
+ description="CUNEIFORM SIGN GA2 TIMES ASH2",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1237A,
+ },
+ [0x1237B]={
+ category="lo",
+ description="CUNEIFORM SIGN GE22",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1237B,
+ },
+ [0x1237C]={
+ category="lo",
+ description="CUNEIFORM SIGN GIG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1237C,
+ },
+ [0x1237D]={
+ category="lo",
+ description="CUNEIFORM SIGN HUSH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1237D,
+ },
+ [0x1237E]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES ANSHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1237E,
+ },
+ [0x1237F]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES ASH3",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1237F,
+ },
+ [0x12380]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES GISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12380,
+ },
+ [0x12381]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES GUD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12381,
+ },
+ [0x12382]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES HI TIMES ASH2",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12382,
+ },
+ [0x12383]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES LUM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12383,
+ },
+ [0x12384]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12384,
+ },
+ [0x12385]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES SHUL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12385,
+ },
+ [0x12386]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES TU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12386,
+ },
+ [0x12387]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES UR2",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12387,
+ },
+ [0x12388]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES GI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12388,
+ },
+ [0x12389]={
+ category="lo",
+ description="CUNEIFORM SIGN LU2 SHESHIG TIMES BAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12389,
+ },
+ [0x1238A]={
+ category="lo",
+ description="CUNEIFORM SIGN LU2 TIMES ESH2 PLUS LAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1238A,
+ },
+ [0x1238B]={
+ category="lo",
+ description="CUNEIFORM SIGN LU2 TIMES SHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1238B,
+ },
+ [0x1238C]={
+ category="lo",
+ description="CUNEIFORM SIGN MESH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1238C,
+ },
+ [0x1238D]={
+ category="lo",
+ description="CUNEIFORM SIGN MUSH3 TIMES ZA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1238D,
+ },
+ [0x1238E]={
+ category="lo",
+ description="CUNEIFORM SIGN NA4",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1238E,
+ },
+ [0x1238F]={
+ category="lo",
+ description="CUNEIFORM SIGN NIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1238F,
+ },
+ [0x12390]={
+ category="lo",
+ description="CUNEIFORM SIGN NIN9",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12390,
+ },
+ [0x12391]={
+ category="lo",
+ description="CUNEIFORM SIGN NINDA2 TIMES BAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12391,
+ },
+ [0x12392]={
+ category="lo",
+ description="CUNEIFORM SIGN NINDA2 TIMES GI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12392,
+ },
+ [0x12393]={
+ category="lo",
+ description="CUNEIFORM SIGN NU11 ROTATED NINETY DEGREES",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12393,
+ },
+ [0x12394]={
+ category="lo",
+ description="CUNEIFORM SIGN PESH2 ASTERISK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12394,
+ },
+ [0x12395]={
+ category="lo",
+ description="CUNEIFORM SIGN PIR2",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12395,
+ },
+ [0x12396]={
+ category="lo",
+ description="CUNEIFORM SIGN SAG TIMES IGI GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12396,
+ },
+ [0x12397]={
+ category="lo",
+ description="CUNEIFORM SIGN TI2",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12397,
+ },
+ [0x12398]={
+ category="lo",
+ description="CUNEIFORM SIGN UM TIMES ME",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12398,
+ },
[0x12400]={
category="nl",
description="CUNEIFORM NUMERIC SIGN TWO ASH",
@@ -150533,6 +163539,90 @@ characters.data={
linebreak="al",
unicodeslot=0x12462,
},
+ [0x12463]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN ONE QUARTER GUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12463,
+ },
+ [0x12464]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN ONE HALF GUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12464,
+ },
+ [0x12465]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN ELAMITE ONE THIRD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12465,
+ },
+ [0x12466]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN ELAMITE TWO THIRDS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12466,
+ },
+ [0x12467]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN ELAMITE FORTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12467,
+ },
+ [0x12468]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN ELAMITE FIFTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12468,
+ },
+ [0x12469]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FOUR U VARIANT FORM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12469,
+ },
+ [0x1246A]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FIVE U VARIANT FORM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1246A,
+ },
+ [0x1246B]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN SIX U VARIANT FORM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1246B,
+ },
+ [0x1246C]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN SEVEN U VARIANT FORM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1246C,
+ },
+ [0x1246D]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN EIGHT U VARIANT FORM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1246D,
+ },
+ [0x1246E]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1246E,
+ },
[0x12470]={
category="po",
description="CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER",
@@ -150561,6 +163651,13 @@ characters.data={
linebreak="ba",
unicodeslot=0x12473,
},
+ [0x12474]={
+ category="po",
+ description="CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x12474,
+ },
[0x13000]={
category="lo",
description="EGYPTIAN HIEROGLYPH A001",
@@ -162041,6 +175138,1460 @@ characters.data={
linebreak="al",
unicodeslot=0x16A38,
},
+ [0x16A40]={
+ category="lo",
+ description="MRO LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A40,
+ },
+ [0x16A41]={
+ category="lo",
+ description="MRO LETTER NGI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A41,
+ },
+ [0x16A42]={
+ category="lo",
+ description="MRO LETTER YO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A42,
+ },
+ [0x16A43]={
+ category="lo",
+ description="MRO LETTER MIM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A43,
+ },
+ [0x16A44]={
+ category="lo",
+ description="MRO LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A44,
+ },
+ [0x16A45]={
+ category="lo",
+ description="MRO LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A45,
+ },
+ [0x16A46]={
+ category="lo",
+ description="MRO LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A46,
+ },
+ [0x16A47]={
+ category="lo",
+ description="MRO LETTER PHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A47,
+ },
+ [0x16A48]={
+ category="lo",
+ description="MRO LETTER KHAI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A48,
+ },
+ [0x16A49]={
+ category="lo",
+ description="MRO LETTER HAO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A49,
+ },
+ [0x16A4A]={
+ category="lo",
+ description="MRO LETTER DAI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A4A,
+ },
+ [0x16A4B]={
+ category="lo",
+ description="MRO LETTER CHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A4B,
+ },
+ [0x16A4C]={
+ category="lo",
+ description="MRO LETTER KEAAE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A4C,
+ },
+ [0x16A4D]={
+ category="lo",
+ description="MRO LETTER OL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A4D,
+ },
+ [0x16A4E]={
+ category="lo",
+ description="MRO LETTER MAEM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A4E,
+ },
+ [0x16A4F]={
+ category="lo",
+ description="MRO LETTER NIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A4F,
+ },
+ [0x16A50]={
+ category="lo",
+ description="MRO LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A50,
+ },
+ [0x16A51]={
+ category="lo",
+ description="MRO LETTER OO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A51,
+ },
+ [0x16A52]={
+ category="lo",
+ description="MRO LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A52,
+ },
+ [0x16A53]={
+ category="lo",
+ description="MRO LETTER RO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A53,
+ },
+ [0x16A54]={
+ category="lo",
+ description="MRO LETTER SHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A54,
+ },
+ [0x16A55]={
+ category="lo",
+ description="MRO LETTER THEA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A55,
+ },
+ [0x16A56]={
+ category="lo",
+ description="MRO LETTER EA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A56,
+ },
+ [0x16A57]={
+ category="lo",
+ description="MRO LETTER WA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A57,
+ },
+ [0x16A58]={
+ category="lo",
+ description="MRO LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A58,
+ },
+ [0x16A59]={
+ category="lo",
+ description="MRO LETTER KO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A59,
+ },
+ [0x16A5A]={
+ category="lo",
+ description="MRO LETTER LAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A5A,
+ },
+ [0x16A5B]={
+ category="lo",
+ description="MRO LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A5B,
+ },
+ [0x16A5C]={
+ category="lo",
+ description="MRO LETTER HAI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A5C,
+ },
+ [0x16A5D]={
+ category="lo",
+ description="MRO LETTER RI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A5D,
+ },
+ [0x16A5E]={
+ category="lo",
+ description="MRO LETTER TEK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A5E,
+ },
+ [0x16A60]={
+ category="nd",
+ description="MRO DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x16A60,
+ },
+ [0x16A61]={
+ category="nd",
+ description="MRO DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x16A61,
+ },
+ [0x16A62]={
+ category="nd",
+ description="MRO DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x16A62,
+ },
+ [0x16A63]={
+ category="nd",
+ description="MRO DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x16A63,
+ },
+ [0x16A64]={
+ category="nd",
+ description="MRO DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x16A64,
+ },
+ [0x16A65]={
+ category="nd",
+ description="MRO DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x16A65,
+ },
+ [0x16A66]={
+ category="nd",
+ description="MRO DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x16A66,
+ },
+ [0x16A67]={
+ category="nd",
+ description="MRO DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x16A67,
+ },
+ [0x16A68]={
+ category="nd",
+ description="MRO DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x16A68,
+ },
+ [0x16A69]={
+ category="nd",
+ description="MRO DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x16A69,
+ },
+ [0x16A6E]={
+ category="po",
+ description="MRO DANDA",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x16A6E,
+ },
+ [0x16A6F]={
+ category="po",
+ description="MRO DOUBLE DANDA",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x16A6F,
+ },
+ [0x16AD0]={
+ category="lo",
+ description="BASSA VAH LETTER ENNI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AD0,
+ },
+ [0x16AD1]={
+ category="lo",
+ description="BASSA VAH LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AD1,
+ },
+ [0x16AD2]={
+ category="lo",
+ description="BASSA VAH LETTER SE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AD2,
+ },
+ [0x16AD3]={
+ category="lo",
+ description="BASSA VAH LETTER FA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AD3,
+ },
+ [0x16AD4]={
+ category="lo",
+ description="BASSA VAH LETTER MBE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AD4,
+ },
+ [0x16AD5]={
+ category="lo",
+ description="BASSA VAH LETTER YIE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AD5,
+ },
+ [0x16AD6]={
+ category="lo",
+ description="BASSA VAH LETTER GAH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AD6,
+ },
+ [0x16AD7]={
+ category="lo",
+ description="BASSA VAH LETTER DHII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AD7,
+ },
+ [0x16AD8]={
+ category="lo",
+ description="BASSA VAH LETTER KPAH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AD8,
+ },
+ [0x16AD9]={
+ category="lo",
+ description="BASSA VAH LETTER JO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AD9,
+ },
+ [0x16ADA]={
+ category="lo",
+ description="BASSA VAH LETTER HWAH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16ADA,
+ },
+ [0x16ADB]={
+ category="lo",
+ description="BASSA VAH LETTER WA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16ADB,
+ },
+ [0x16ADC]={
+ category="lo",
+ description="BASSA VAH LETTER ZO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16ADC,
+ },
+ [0x16ADD]={
+ category="lo",
+ description="BASSA VAH LETTER GBU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16ADD,
+ },
+ [0x16ADE]={
+ category="lo",
+ description="BASSA VAH LETTER DO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16ADE,
+ },
+ [0x16ADF]={
+ category="lo",
+ description="BASSA VAH LETTER CE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16ADF,
+ },
+ [0x16AE0]={
+ category="lo",
+ description="BASSA VAH LETTER UWU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AE0,
+ },
+ [0x16AE1]={
+ category="lo",
+ description="BASSA VAH LETTER TO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AE1,
+ },
+ [0x16AE2]={
+ category="lo",
+ description="BASSA VAH LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AE2,
+ },
+ [0x16AE3]={
+ category="lo",
+ description="BASSA VAH LETTER VU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AE3,
+ },
+ [0x16AE4]={
+ category="lo",
+ description="BASSA VAH LETTER YEIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AE4,
+ },
+ [0x16AE5]={
+ category="lo",
+ description="BASSA VAH LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AE5,
+ },
+ [0x16AE6]={
+ category="lo",
+ description="BASSA VAH LETTER WADDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AE6,
+ },
+ [0x16AE7]={
+ category="lo",
+ description="BASSA VAH LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AE7,
+ },
+ [0x16AE8]={
+ category="lo",
+ description="BASSA VAH LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AE8,
+ },
+ [0x16AE9]={
+ category="lo",
+ description="BASSA VAH LETTER OO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AE9,
+ },
+ [0x16AEA]={
+ category="lo",
+ description="BASSA VAH LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AEA,
+ },
+ [0x16AEB]={
+ category="lo",
+ description="BASSA VAH LETTER EE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AEB,
+ },
+ [0x16AEC]={
+ category="lo",
+ description="BASSA VAH LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AEC,
+ },
+ [0x16AED]={
+ category="lo",
+ description="BASSA VAH LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AED,
+ },
+ [0x16AF0]={
+ category="mn",
+ combining=0x1,
+ description="BASSA VAH COMBINING HIGH TONE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x16AF0,
+ },
+ [0x16AF1]={
+ category="mn",
+ combining=0x1,
+ description="BASSA VAH COMBINING LOW TONE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x16AF1,
+ },
+ [0x16AF2]={
+ category="mn",
+ combining=0x1,
+ description="BASSA VAH COMBINING MID TONE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x16AF2,
+ },
+ [0x16AF3]={
+ category="mn",
+ combining=0x1,
+ description="BASSA VAH COMBINING LOW-MID TONE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x16AF3,
+ },
+ [0x16AF4]={
+ category="mn",
+ combining=0x1,
+ description="BASSA VAH COMBINING HIGH-LOW TONE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x16AF4,
+ },
+ [0x16AF5]={
+ category="po",
+ description="BASSA VAH FULL STOP",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x16AF5,
+ },
+ [0x16B00]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KEEB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B00,
+ },
+ [0x16B01]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KEEV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B01,
+ },
+ [0x16B02]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KIB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B02,
+ },
+ [0x16B03]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KIV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B03,
+ },
+ [0x16B04]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KAUB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B04,
+ },
+ [0x16B05]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KAUV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B05,
+ },
+ [0x16B06]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KUB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B06,
+ },
+ [0x16B07]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KUV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B07,
+ },
+ [0x16B08]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KEB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B08,
+ },
+ [0x16B09]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KEV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B09,
+ },
+ [0x16B0A]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KAIB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B0A,
+ },
+ [0x16B0B]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KAIV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B0B,
+ },
+ [0x16B0C]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KOOB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B0C,
+ },
+ [0x16B0D]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KOOV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B0D,
+ },
+ [0x16B0E]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KAWB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B0E,
+ },
+ [0x16B0F]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KAWV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B0F,
+ },
+ [0x16B10]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KUAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B10,
+ },
+ [0x16B11]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KUAV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B11,
+ },
+ [0x16B12]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KOB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B12,
+ },
+ [0x16B13]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KOV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B13,
+ },
+ [0x16B14]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KIAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B14,
+ },
+ [0x16B15]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KIAV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B15,
+ },
+ [0x16B16]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B16,
+ },
+ [0x16B17]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KAV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B17,
+ },
+ [0x16B18]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KWB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B18,
+ },
+ [0x16B19]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KWV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B19,
+ },
+ [0x16B1A]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KAAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B1A,
+ },
+ [0x16B1B]={
+ category="lo",
+ description="PAHAWH HMONG VOWEL KAAV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B1B,
+ },
+ [0x16B1C]={
+ category="lo",
+ description="PAHAWH HMONG CONSONANT VAU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B1C,
+ },
+ [0x16B1D]={
+ category="lo",
+ description="PAHAWH HMONG CONSONANT NTSAU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B1D,
+ },
+ [0x16B1E]={
+ category="lo",
+ description="PAHAWH HMONG CONSONANT LAU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B1E,
+ },
+ [0x16B1F]={
+ category="lo",
+ description="PAHAWH HMONG CONSONANT HAU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B1F,
+ },
+ [0x16B20]={
+ category="lo",
+ description="PAHAWH HMONG CONSONANT NLAU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B20,
+ },
+ [0x16B21]={
+ category="lo",
+ description="PAHAWH HMONG CONSONANT RAU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B21,
+ },
+ [0x16B22]={
+ category="lo",
+ description="PAHAWH HMONG CONSONANT NKAU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B22,
+ },
+ [0x16B23]={
+ category="lo",
+ description="PAHAWH HMONG CONSONANT QHAU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B23,
+ },
+ [0x16B24]={
+ category="lo",
+ description="PAHAWH HMONG CONSONANT YAU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B24,
+ },
+ [0x16B25]={
+ category="lo",
+ description="PAHAWH HMONG CONSONANT HLAU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B25,
+ },
+ [0x16B26]={
+ category="lo",
+ description="PAHAWH HMONG CONSONANT MAU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B26,
+ },
+ [0x16B27]={
+ category="lo",
+ description="PAHAWH HMONG CONSONANT CHAU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B27,
+ },
+ [0x16B28]={
+ category="lo",
+ description="PAHAWH HMONG CONSONANT NCHAU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B28,
+ },
+ [0x16B29]={
+ category="lo",
+ description="PAHAWH HMONG CONSONANT HNAU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B29,
+ },
+ [0x16B2A]={
+ category="lo",
+ description="PAHAWH HMONG CONSONANT PLHAU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B2A,
+ },
+ [0x16B2B]={
+ category="lo",
+ description="PAHAWH HMONG CONSONANT NTHAU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B2B,
+ },
+ [0x16B2C]={
+ category="lo",
+ description="PAHAWH HMONG CONSONANT NAU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B2C,
+ },
+ [0x16B2D]={
+ category="lo",
+ description="PAHAWH HMONG CONSONANT AU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B2D,
+ },
+ [0x16B2E]={
+ category="lo",
+ description="PAHAWH HMONG CONSONANT XAU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B2E,
+ },
+ [0x16B2F]={
+ category="lo",
+ description="PAHAWH HMONG CONSONANT CAU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B2F,
+ },
+ [0x16B30]={
+ category="mn",
+ combining=0xE6,
+ description="PAHAWH HMONG MARK CIM TUB",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x16B30,
+ },
+ [0x16B31]={
+ category="mn",
+ combining=0xE6,
+ description="PAHAWH HMONG MARK CIM SO",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x16B31,
+ },
+ [0x16B32]={
+ category="mn",
+ combining=0xE6,
+ description="PAHAWH HMONG MARK CIM KES",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x16B32,
+ },
+ [0x16B33]={
+ category="mn",
+ combining=0xE6,
+ description="PAHAWH HMONG MARK CIM KHAV",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x16B33,
+ },
+ [0x16B34]={
+ category="mn",
+ combining=0xE6,
+ description="PAHAWH HMONG MARK CIM SUAM",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x16B34,
+ },
+ [0x16B35]={
+ category="mn",
+ combining=0xE6,
+ description="PAHAWH HMONG MARK CIM HOM",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x16B35,
+ },
+ [0x16B36]={
+ category="mn",
+ combining=0xE6,
+ description="PAHAWH HMONG MARK CIM TAUM",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x16B36,
+ },
+ [0x16B37]={
+ category="po",
+ description="PAHAWH HMONG SIGN VOS THOM",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x16B37,
+ },
+ [0x16B38]={
+ category="po",
+ description="PAHAWH HMONG SIGN VOS TSHAB CEEB",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x16B38,
+ },
+ [0x16B39]={
+ category="po",
+ description="PAHAWH HMONG SIGN CIM CHEEM",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x16B39,
+ },
+ [0x16B3A]={
+ category="po",
+ description="PAHAWH HMONG SIGN VOS THIAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B3A,
+ },
+ [0x16B3B]={
+ category="po",
+ description="PAHAWH HMONG SIGN VOS FEEM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B3B,
+ },
+ [0x16B3C]={
+ category="so",
+ description="PAHAWH HMONG SIGN XYEEM NTXIV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B3C,
+ },
+ [0x16B3D]={
+ category="so",
+ description="PAHAWH HMONG SIGN XYEEM RHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B3D,
+ },
+ [0x16B3E]={
+ category="so",
+ description="PAHAWH HMONG SIGN XYEEM TOV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B3E,
+ },
+ [0x16B3F]={
+ category="so",
+ description="PAHAWH HMONG SIGN XYEEM FAIB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B3F,
+ },
+ [0x16B40]={
+ category="lm",
+ description="PAHAWH HMONG SIGN VOS SEEV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B40,
+ },
+ [0x16B41]={
+ category="lm",
+ description="PAHAWH HMONG SIGN MEEJ SUAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B41,
+ },
+ [0x16B42]={
+ category="lm",
+ description="PAHAWH HMONG SIGN VOS NRUA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B42,
+ },
+ [0x16B43]={
+ category="lm",
+ description="PAHAWH HMONG SIGN IB YAM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B43,
+ },
+ [0x16B44]={
+ category="po",
+ description="PAHAWH HMONG SIGN XAUS",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x16B44,
+ },
+ [0x16B45]={
+ category="so",
+ description="PAHAWH HMONG SIGN CIM TSOV ROG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B45,
+ },
+ [0x16B50]={
+ category="nd",
+ description="PAHAWH HMONG DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x16B50,
+ },
+ [0x16B51]={
+ category="nd",
+ description="PAHAWH HMONG DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x16B51,
+ },
+ [0x16B52]={
+ category="nd",
+ description="PAHAWH HMONG DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x16B52,
+ },
+ [0x16B53]={
+ category="nd",
+ description="PAHAWH HMONG DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x16B53,
+ },
+ [0x16B54]={
+ category="nd",
+ description="PAHAWH HMONG DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x16B54,
+ },
+ [0x16B55]={
+ category="nd",
+ description="PAHAWH HMONG DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x16B55,
+ },
+ [0x16B56]={
+ category="nd",
+ description="PAHAWH HMONG DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x16B56,
+ },
+ [0x16B57]={
+ category="nd",
+ description="PAHAWH HMONG DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x16B57,
+ },
+ [0x16B58]={
+ category="nd",
+ description="PAHAWH HMONG DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x16B58,
+ },
+ [0x16B59]={
+ category="nd",
+ description="PAHAWH HMONG DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x16B59,
+ },
+ [0x16B5B]={
+ category="no",
+ description="PAHAWH HMONG NUMBER TENS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B5B,
+ },
+ [0x16B5C]={
+ category="no",
+ description="PAHAWH HMONG NUMBER HUNDREDS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B5C,
+ },
+ [0x16B5D]={
+ category="no",
+ description="PAHAWH HMONG NUMBER TEN THOUSANDS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B5D,
+ },
+ [0x16B5E]={
+ category="no",
+ description="PAHAWH HMONG NUMBER MILLIONS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B5E,
+ },
+ [0x16B5F]={
+ category="no",
+ description="PAHAWH HMONG NUMBER HUNDRED MILLIONS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B5F,
+ },
+ [0x16B60]={
+ category="no",
+ description="PAHAWH HMONG NUMBER TEN BILLIONS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B60,
+ },
+ [0x16B61]={
+ category="no",
+ description="PAHAWH HMONG NUMBER TRILLIONS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B61,
+ },
+ [0x16B63]={
+ category="lo",
+ description="PAHAWH HMONG SIGN VOS LUB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B63,
+ },
+ [0x16B64]={
+ category="lo",
+ description="PAHAWH HMONG SIGN XYOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B64,
+ },
+ [0x16B65]={
+ category="lo",
+ description="PAHAWH HMONG SIGN HLI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B65,
+ },
+ [0x16B66]={
+ category="lo",
+ description="PAHAWH HMONG SIGN THIRD-STAGE HLI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B66,
+ },
+ [0x16B67]={
+ category="lo",
+ description="PAHAWH HMONG SIGN ZWJ THAJ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B67,
+ },
+ [0x16B68]={
+ category="lo",
+ description="PAHAWH HMONG SIGN HNUB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B68,
+ },
+ [0x16B69]={
+ category="lo",
+ description="PAHAWH HMONG SIGN NQIG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B69,
+ },
+ [0x16B6A]={
+ category="lo",
+ description="PAHAWH HMONG SIGN XIAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B6A,
+ },
+ [0x16B6B]={
+ category="lo",
+ description="PAHAWH HMONG SIGN NTUJ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B6B,
+ },
+ [0x16B6C]={
+ category="lo",
+ description="PAHAWH HMONG SIGN AV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B6C,
+ },
+ [0x16B6D]={
+ category="lo",
+ description="PAHAWH HMONG SIGN TXHEEJ CEEV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B6D,
+ },
+ [0x16B6E]={
+ category="lo",
+ description="PAHAWH HMONG SIGN MEEJ TSEEB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B6E,
+ },
+ [0x16B6F]={
+ category="lo",
+ description="PAHAWH HMONG SIGN TAU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B6F,
+ },
+ [0x16B70]={
+ category="lo",
+ description="PAHAWH HMONG SIGN LOS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B70,
+ },
+ [0x16B71]={
+ category="lo",
+ description="PAHAWH HMONG SIGN MUS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B71,
+ },
+ [0x16B72]={
+ category="lo",
+ description="PAHAWH HMONG SIGN CIM HAIS LUS NTOG NTOG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B72,
+ },
+ [0x16B73]={
+ category="lo",
+ description="PAHAWH HMONG SIGN CIM CUAM TSHOOJ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B73,
+ },
+ [0x16B74]={
+ category="lo",
+ description="PAHAWH HMONG SIGN CIM TXWV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B74,
+ },
+ [0x16B75]={
+ category="lo",
+ description="PAHAWH HMONG SIGN CIM TXWV CHWV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B75,
+ },
+ [0x16B76]={
+ category="lo",
+ description="PAHAWH HMONG SIGN CIM PUB DAWB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B76,
+ },
+ [0x16B77]={
+ category="lo",
+ description="PAHAWH HMONG SIGN CIM NRES TOS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B77,
+ },
+ [0x16B7D]={
+ category="lo",
+ description="PAHAWH HMONG CLAN SIGN TSHEEJ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B7D,
+ },
+ [0x16B7E]={
+ category="lo",
+ description="PAHAWH HMONG CLAN SIGN YEEG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B7E,
+ },
+ [0x16B7F]={
+ category="lo",
+ description="PAHAWH HMONG CLAN SIGN LIS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B7F,
+ },
+ [0x16B80]={
+ category="lo",
+ description="PAHAWH HMONG CLAN SIGN LAUJ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B80,
+ },
+ [0x16B81]={
+ category="lo",
+ description="PAHAWH HMONG CLAN SIGN XYOOJ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B81,
+ },
+ [0x16B82]={
+ category="lo",
+ description="PAHAWH HMONG CLAN SIGN KOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B82,
+ },
+ [0x16B83]={
+ category="lo",
+ description="PAHAWH HMONG CLAN SIGN HAWJ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B83,
+ },
+ [0x16B84]={
+ category="lo",
+ description="PAHAWH HMONG CLAN SIGN MUAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B84,
+ },
+ [0x16B85]={
+ category="lo",
+ description="PAHAWH HMONG CLAN SIGN THOJ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B85,
+ },
+ [0x16B86]={
+ category="lo",
+ description="PAHAWH HMONG CLAN SIGN TSAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B86,
+ },
+ [0x16B87]={
+ category="lo",
+ description="PAHAWH HMONG CLAN SIGN PHAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B87,
+ },
+ [0x16B88]={
+ category="lo",
+ description="PAHAWH HMONG CLAN SIGN KHAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B88,
+ },
+ [0x16B89]={
+ category="lo",
+ description="PAHAWH HMONG CLAN SIGN HAM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B89,
+ },
+ [0x16B8A]={
+ category="lo",
+ description="PAHAWH HMONG CLAN SIGN VAJ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B8A,
+ },
+ [0x16B8B]={
+ category="lo",
+ description="PAHAWH HMONG CLAN SIGN FAJ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B8B,
+ },
+ [0x16B8C]={
+ category="lo",
+ description="PAHAWH HMONG CLAN SIGN YAJ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B8C,
+ },
+ [0x16B8D]={
+ category="lo",
+ description="PAHAWH HMONG CLAN SIGN TSWB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B8D,
+ },
+ [0x16B8E]={
+ category="lo",
+ description="PAHAWH HMONG CLAN SIGN KWM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B8E,
+ },
+ [0x16B8F]={
+ category="lo",
+ description="PAHAWH HMONG CLAN SIGN VWJ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B8F,
+ },
[0x16F00]={
category="lo",
description="MIAO LETTER PA",
@@ -162988,6 +177539,1036 @@ characters.data={
linebreak="id",
unicodeslot=0x1B001,
},
+ [0x1BC00]={
+ category="lo",
+ description="DUPLOYAN LETTER H",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC00,
+ },
+ [0x1BC01]={
+ category="lo",
+ description="DUPLOYAN LETTER X",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC01,
+ },
+ [0x1BC02]={
+ category="lo",
+ description="DUPLOYAN LETTER P",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC02,
+ },
+ [0x1BC03]={
+ category="lo",
+ description="DUPLOYAN LETTER T",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC03,
+ },
+ [0x1BC04]={
+ category="lo",
+ description="DUPLOYAN LETTER F",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC04,
+ },
+ [0x1BC05]={
+ category="lo",
+ description="DUPLOYAN LETTER K",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC05,
+ },
+ [0x1BC06]={
+ category="lo",
+ description="DUPLOYAN LETTER L",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC06,
+ },
+ [0x1BC07]={
+ category="lo",
+ description="DUPLOYAN LETTER B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC07,
+ },
+ [0x1BC08]={
+ category="lo",
+ description="DUPLOYAN LETTER D",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC08,
+ },
+ [0x1BC09]={
+ category="lo",
+ description="DUPLOYAN LETTER V",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC09,
+ },
+ [0x1BC0A]={
+ category="lo",
+ description="DUPLOYAN LETTER G",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC0A,
+ },
+ [0x1BC0B]={
+ category="lo",
+ description="DUPLOYAN LETTER R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC0B,
+ },
+ [0x1BC0C]={
+ category="lo",
+ description="DUPLOYAN LETTER P N",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC0C,
+ },
+ [0x1BC0D]={
+ category="lo",
+ description="DUPLOYAN LETTER D S",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC0D,
+ },
+ [0x1BC0E]={
+ category="lo",
+ description="DUPLOYAN LETTER F N",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC0E,
+ },
+ [0x1BC0F]={
+ category="lo",
+ description="DUPLOYAN LETTER K M",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC0F,
+ },
+ [0x1BC10]={
+ category="lo",
+ description="DUPLOYAN LETTER R S",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC10,
+ },
+ [0x1BC11]={
+ category="lo",
+ description="DUPLOYAN LETTER TH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC11,
+ },
+ [0x1BC12]={
+ category="lo",
+ description="DUPLOYAN LETTER SLOAN DH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC12,
+ },
+ [0x1BC13]={
+ category="lo",
+ description="DUPLOYAN LETTER DH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC13,
+ },
+ [0x1BC14]={
+ category="lo",
+ description="DUPLOYAN LETTER KK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC14,
+ },
+ [0x1BC15]={
+ category="lo",
+ description="DUPLOYAN LETTER SLOAN J",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC15,
+ },
+ [0x1BC16]={
+ category="lo",
+ description="DUPLOYAN LETTER HL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC16,
+ },
+ [0x1BC17]={
+ category="lo",
+ description="DUPLOYAN LETTER LH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC17,
+ },
+ [0x1BC18]={
+ category="lo",
+ description="DUPLOYAN LETTER RH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC18,
+ },
+ [0x1BC19]={
+ category="lo",
+ description="DUPLOYAN LETTER M",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC19,
+ },
+ [0x1BC1A]={
+ category="lo",
+ description="DUPLOYAN LETTER N",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC1A,
+ },
+ [0x1BC1B]={
+ category="lo",
+ description="DUPLOYAN LETTER J",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC1B,
+ },
+ [0x1BC1C]={
+ category="lo",
+ description="DUPLOYAN LETTER S",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC1C,
+ },
+ [0x1BC1D]={
+ category="lo",
+ description="DUPLOYAN LETTER M N",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC1D,
+ },
+ [0x1BC1E]={
+ category="lo",
+ description="DUPLOYAN LETTER N M",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC1E,
+ },
+ [0x1BC1F]={
+ category="lo",
+ description="DUPLOYAN LETTER J M",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC1F,
+ },
+ [0x1BC20]={
+ category="lo",
+ description="DUPLOYAN LETTER S J",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC20,
+ },
+ [0x1BC21]={
+ category="lo",
+ description="DUPLOYAN LETTER M WITH DOT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC21,
+ },
+ [0x1BC22]={
+ category="lo",
+ description="DUPLOYAN LETTER N WITH DOT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC22,
+ },
+ [0x1BC23]={
+ category="lo",
+ description="DUPLOYAN LETTER J WITH DOT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC23,
+ },
+ [0x1BC24]={
+ category="lo",
+ description="DUPLOYAN LETTER J WITH DOTS INSIDE AND ABOVE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC24,
+ },
+ [0x1BC25]={
+ category="lo",
+ description="DUPLOYAN LETTER S WITH DOT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC25,
+ },
+ [0x1BC26]={
+ category="lo",
+ description="DUPLOYAN LETTER S WITH DOT BELOW",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC26,
+ },
+ [0x1BC27]={
+ category="lo",
+ description="DUPLOYAN LETTER M S",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC27,
+ },
+ [0x1BC28]={
+ category="lo",
+ description="DUPLOYAN LETTER N S",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC28,
+ },
+ [0x1BC29]={
+ category="lo",
+ description="DUPLOYAN LETTER J S",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC29,
+ },
+ [0x1BC2A]={
+ category="lo",
+ description="DUPLOYAN LETTER S S",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC2A,
+ },
+ [0x1BC2B]={
+ category="lo",
+ description="DUPLOYAN LETTER M N S",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC2B,
+ },
+ [0x1BC2C]={
+ category="lo",
+ description="DUPLOYAN LETTER N M S",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC2C,
+ },
+ [0x1BC2D]={
+ category="lo",
+ description="DUPLOYAN LETTER J M S",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC2D,
+ },
+ [0x1BC2E]={
+ category="lo",
+ description="DUPLOYAN LETTER S J S",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC2E,
+ },
+ [0x1BC2F]={
+ category="lo",
+ description="DUPLOYAN LETTER J S WITH DOT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC2F,
+ },
+ [0x1BC30]={
+ category="lo",
+ description="DUPLOYAN LETTER J N",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC30,
+ },
+ [0x1BC31]={
+ category="lo",
+ description="DUPLOYAN LETTER J N S",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC31,
+ },
+ [0x1BC32]={
+ category="lo",
+ description="DUPLOYAN LETTER S T",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC32,
+ },
+ [0x1BC33]={
+ category="lo",
+ description="DUPLOYAN LETTER S T R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC33,
+ },
+ [0x1BC34]={
+ category="lo",
+ description="DUPLOYAN LETTER S P",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC34,
+ },
+ [0x1BC35]={
+ category="lo",
+ description="DUPLOYAN LETTER S P R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC35,
+ },
+ [0x1BC36]={
+ category="lo",
+ description="DUPLOYAN LETTER T S",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC36,
+ },
+ [0x1BC37]={
+ category="lo",
+ description="DUPLOYAN LETTER T R S",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC37,
+ },
+ [0x1BC38]={
+ category="lo",
+ description="DUPLOYAN LETTER W",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC38,
+ },
+ [0x1BC39]={
+ category="lo",
+ description="DUPLOYAN LETTER WH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC39,
+ },
+ [0x1BC3A]={
+ category="lo",
+ description="DUPLOYAN LETTER W R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC3A,
+ },
+ [0x1BC3B]={
+ category="lo",
+ description="DUPLOYAN LETTER S N",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC3B,
+ },
+ [0x1BC3C]={
+ category="lo",
+ description="DUPLOYAN LETTER S M",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC3C,
+ },
+ [0x1BC3D]={
+ category="lo",
+ description="DUPLOYAN LETTER K R S",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC3D,
+ },
+ [0x1BC3E]={
+ category="lo",
+ description="DUPLOYAN LETTER G R S",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC3E,
+ },
+ [0x1BC3F]={
+ category="lo",
+ description="DUPLOYAN LETTER S K",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC3F,
+ },
+ [0x1BC40]={
+ category="lo",
+ description="DUPLOYAN LETTER S K R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC40,
+ },
+ [0x1BC41]={
+ category="lo",
+ description="DUPLOYAN LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC41,
+ },
+ [0x1BC42]={
+ category="lo",
+ description="DUPLOYAN LETTER SLOAN OW",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC42,
+ },
+ [0x1BC43]={
+ category="lo",
+ description="DUPLOYAN LETTER OA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC43,
+ },
+ [0x1BC44]={
+ category="lo",
+ description="DUPLOYAN LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC44,
+ },
+ [0x1BC45]={
+ category="lo",
+ description="DUPLOYAN LETTER AOU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC45,
+ },
+ [0x1BC46]={
+ category="lo",
+ description="DUPLOYAN LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC46,
+ },
+ [0x1BC47]={
+ category="lo",
+ description="DUPLOYAN LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC47,
+ },
+ [0x1BC48]={
+ category="lo",
+ description="DUPLOYAN LETTER IE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC48,
+ },
+ [0x1BC49]={
+ category="lo",
+ description="DUPLOYAN LETTER SHORT I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC49,
+ },
+ [0x1BC4A]={
+ category="lo",
+ description="DUPLOYAN LETTER UI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC4A,
+ },
+ [0x1BC4B]={
+ category="lo",
+ description="DUPLOYAN LETTER EE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC4B,
+ },
+ [0x1BC4C]={
+ category="lo",
+ description="DUPLOYAN LETTER SLOAN EH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC4C,
+ },
+ [0x1BC4D]={
+ category="lo",
+ description="DUPLOYAN LETTER ROMANIAN I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC4D,
+ },
+ [0x1BC4E]={
+ category="lo",
+ description="DUPLOYAN LETTER SLOAN EE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC4E,
+ },
+ [0x1BC4F]={
+ category="lo",
+ description="DUPLOYAN LETTER LONG I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC4F,
+ },
+ [0x1BC50]={
+ category="lo",
+ description="DUPLOYAN LETTER YE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC50,
+ },
+ [0x1BC51]={
+ category="lo",
+ description="DUPLOYAN LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC51,
+ },
+ [0x1BC52]={
+ category="lo",
+ description="DUPLOYAN LETTER EU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC52,
+ },
+ [0x1BC53]={
+ category="lo",
+ description="DUPLOYAN LETTER XW",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC53,
+ },
+ [0x1BC54]={
+ category="lo",
+ description="DUPLOYAN LETTER U N",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC54,
+ },
+ [0x1BC55]={
+ category="lo",
+ description="DUPLOYAN LETTER LONG U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC55,
+ },
+ [0x1BC56]={
+ category="lo",
+ description="DUPLOYAN LETTER ROMANIAN U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC56,
+ },
+ [0x1BC57]={
+ category="lo",
+ description="DUPLOYAN LETTER UH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC57,
+ },
+ [0x1BC58]={
+ category="lo",
+ description="DUPLOYAN LETTER SLOAN U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC58,
+ },
+ [0x1BC59]={
+ category="lo",
+ description="DUPLOYAN LETTER OOH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC59,
+ },
+ [0x1BC5A]={
+ category="lo",
+ description="DUPLOYAN LETTER OW",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC5A,
+ },
+ [0x1BC5B]={
+ category="lo",
+ description="DUPLOYAN LETTER OU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC5B,
+ },
+ [0x1BC5C]={
+ category="lo",
+ description="DUPLOYAN LETTER WA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC5C,
+ },
+ [0x1BC5D]={
+ category="lo",
+ description="DUPLOYAN LETTER WO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC5D,
+ },
+ [0x1BC5E]={
+ category="lo",
+ description="DUPLOYAN LETTER WI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC5E,
+ },
+ [0x1BC5F]={
+ category="lo",
+ description="DUPLOYAN LETTER WEI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC5F,
+ },
+ [0x1BC60]={
+ category="lo",
+ description="DUPLOYAN LETTER WOW",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC60,
+ },
+ [0x1BC61]={
+ category="lo",
+ description="DUPLOYAN LETTER NASAL U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC61,
+ },
+ [0x1BC62]={
+ category="lo",
+ description="DUPLOYAN LETTER NASAL O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC62,
+ },
+ [0x1BC63]={
+ category="lo",
+ description="DUPLOYAN LETTER NASAL I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC63,
+ },
+ [0x1BC64]={
+ category="lo",
+ description="DUPLOYAN LETTER NASAL A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC64,
+ },
+ [0x1BC65]={
+ category="lo",
+ description="DUPLOYAN LETTER PERNIN AN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC65,
+ },
+ [0x1BC66]={
+ category="lo",
+ description="DUPLOYAN LETTER PERNIN AM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC66,
+ },
+ [0x1BC67]={
+ category="lo",
+ description="DUPLOYAN LETTER SLOAN EN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC67,
+ },
+ [0x1BC68]={
+ category="lo",
+ description="DUPLOYAN LETTER SLOAN AN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC68,
+ },
+ [0x1BC69]={
+ category="lo",
+ description="DUPLOYAN LETTER SLOAN ON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC69,
+ },
+ [0x1BC6A]={
+ category="lo",
+ description="DUPLOYAN LETTER VOCALIC M",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC6A,
+ },
+ [0x1BC70]={
+ category="lo",
+ description="DUPLOYAN AFFIX LEFT HORIZONTAL SECANT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC70,
+ },
+ [0x1BC71]={
+ category="lo",
+ description="DUPLOYAN AFFIX MID HORIZONTAL SECANT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC71,
+ },
+ [0x1BC72]={
+ category="lo",
+ description="DUPLOYAN AFFIX RIGHT HORIZONTAL SECANT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC72,
+ },
+ [0x1BC73]={
+ category="lo",
+ description="DUPLOYAN AFFIX LOW VERTICAL SECANT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC73,
+ },
+ [0x1BC74]={
+ category="lo",
+ description="DUPLOYAN AFFIX MID VERTICAL SECANT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC74,
+ },
+ [0x1BC75]={
+ category="lo",
+ description="DUPLOYAN AFFIX HIGH VERTICAL SECANT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC75,
+ },
+ [0x1BC76]={
+ category="lo",
+ description="DUPLOYAN AFFIX ATTACHED SECANT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC76,
+ },
+ [0x1BC77]={
+ category="lo",
+ description="DUPLOYAN AFFIX ATTACHED LEFT-TO-RIGHT SECANT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC77,
+ },
+ [0x1BC78]={
+ category="lo",
+ description="DUPLOYAN AFFIX ATTACHED TANGENT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC78,
+ },
+ [0x1BC79]={
+ category="lo",
+ description="DUPLOYAN AFFIX ATTACHED TAIL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC79,
+ },
+ [0x1BC7A]={
+ category="lo",
+ description="DUPLOYAN AFFIX ATTACHED E HOOK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC7A,
+ },
+ [0x1BC7B]={
+ category="lo",
+ description="DUPLOYAN AFFIX ATTACHED I HOOK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC7B,
+ },
+ [0x1BC7C]={
+ category="lo",
+ description="DUPLOYAN AFFIX ATTACHED TANGENT HOOK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC7C,
+ },
+ [0x1BC80]={
+ category="lo",
+ description="DUPLOYAN AFFIX HIGH ACUTE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC80,
+ },
+ [0x1BC81]={
+ category="lo",
+ description="DUPLOYAN AFFIX HIGH TIGHT ACUTE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC81,
+ },
+ [0x1BC82]={
+ category="lo",
+ description="DUPLOYAN AFFIX HIGH GRAVE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC82,
+ },
+ [0x1BC83]={
+ category="lo",
+ description="DUPLOYAN AFFIX HIGH LONG GRAVE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC83,
+ },
+ [0x1BC84]={
+ category="lo",
+ description="DUPLOYAN AFFIX HIGH DOT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC84,
+ },
+ [0x1BC85]={
+ category="lo",
+ description="DUPLOYAN AFFIX HIGH CIRCLE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC85,
+ },
+ [0x1BC86]={
+ category="lo",
+ description="DUPLOYAN AFFIX HIGH LINE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC86,
+ },
+ [0x1BC87]={
+ category="lo",
+ description="DUPLOYAN AFFIX HIGH WAVE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC87,
+ },
+ [0x1BC88]={
+ category="lo",
+ description="DUPLOYAN AFFIX HIGH VERTICAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC88,
+ },
+ [0x1BC90]={
+ category="lo",
+ description="DUPLOYAN AFFIX LOW ACUTE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC90,
+ },
+ [0x1BC91]={
+ category="lo",
+ description="DUPLOYAN AFFIX LOW TIGHT ACUTE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC91,
+ },
+ [0x1BC92]={
+ category="lo",
+ description="DUPLOYAN AFFIX LOW GRAVE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC92,
+ },
+ [0x1BC93]={
+ category="lo",
+ description="DUPLOYAN AFFIX LOW LONG GRAVE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC93,
+ },
+ [0x1BC94]={
+ category="lo",
+ description="DUPLOYAN AFFIX LOW DOT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC94,
+ },
+ [0x1BC95]={
+ category="lo",
+ description="DUPLOYAN AFFIX LOW CIRCLE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC95,
+ },
+ [0x1BC96]={
+ category="lo",
+ description="DUPLOYAN AFFIX LOW LINE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC96,
+ },
+ [0x1BC97]={
+ category="lo",
+ description="DUPLOYAN AFFIX LOW WAVE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC97,
+ },
+ [0x1BC98]={
+ category="lo",
+ description="DUPLOYAN AFFIX LOW VERTICAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC98,
+ },
+ [0x1BC99]={
+ category="lo",
+ description="DUPLOYAN AFFIX LOW ARROW",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC99,
+ },
+ [0x1BC9C]={
+ category="so",
+ description="DUPLOYAN SIGN O WITH CROSS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1BC9C,
+ },
+ [0x1BC9D]={
+ category="mn",
+ description="DUPLOYAN THICK LETTER SELECTOR",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1BC9D,
+ },
+ [0x1BC9E]={
+ category="mn",
+ combining=0x1,
+ description="DUPLOYAN DOUBLE MARK",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1BC9E,
+ },
+ [0x1BC9F]={
+ category="po",
+ description="DUPLOYAN PUNCTUATION CHINOOK FULL STOP",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x1BC9F,
+ },
+ [0x1BCA0]={
+ category="cf",
+ description="SHORTHAND FORMAT LETTER OVERLAP",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x1BCA0,
+ },
+ [0x1BCA1]={
+ category="cf",
+ description="SHORTHAND FORMAT CONTINUING OVERLAP",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x1BCA1,
+ },
+ [0x1BCA2]={
+ category="cf",
+ description="SHORTHAND FORMAT DOWN STEP",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x1BCA2,
+ },
+ [0x1BCA3]={
+ category="cf",
+ description="SHORTHAND FORMAT UP STEP",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x1BCA3,
+ },
[0x1D000]={
category="so",
description="BYZANTINE MUSICAL SYMBOL PSILI",
@@ -165412,6 +180993,7 @@ characters.data={
},
[0x1D165]={
category="mc",
+ combining=0xD8,
description="MUSICAL SYMBOL COMBINING STEM",
direction="l",
linebreak="cm",
@@ -165419,6 +181001,7 @@ characters.data={
},
[0x1D166]={
category="mc",
+ combining=0xD8,
description="MUSICAL SYMBOL COMBINING SPRECHGESANG STEM",
direction="l",
linebreak="cm",
@@ -165426,6 +181009,7 @@ characters.data={
},
[0x1D167]={
category="mn",
+ combining=0x1,
description="MUSICAL SYMBOL COMBINING TREMOLO-0x0001",
direction="nsm",
linebreak="cm",
@@ -165433,6 +181017,7 @@ characters.data={
},
[0x1D168]={
category="mn",
+ combining=0x1,
description="MUSICAL SYMBOL COMBINING TREMOLO-0x0002",
direction="nsm",
linebreak="cm",
@@ -165440,6 +181025,7 @@ characters.data={
},
[0x1D169]={
category="mn",
+ combining=0x1,
description="MUSICAL SYMBOL COMBINING TREMOLO-0x0003",
direction="nsm",
linebreak="cm",
@@ -165468,6 +181054,7 @@ characters.data={
},
[0x1D16D]={
category="mc",
+ combining=0xE2,
description="MUSICAL SYMBOL COMBINING AUGMENTATION DOT",
direction="l",
linebreak="cm",
@@ -165475,6 +181062,7 @@ characters.data={
},
[0x1D16E]={
category="mc",
+ combining=0xD8,
description="MUSICAL SYMBOL COMBINING FLAG-0x0001",
direction="l",
linebreak="cm",
@@ -165482,6 +181070,7 @@ characters.data={
},
[0x1D16F]={
category="mc",
+ combining=0xD8,
description="MUSICAL SYMBOL COMBINING FLAG-0x0002",
direction="l",
linebreak="cm",
@@ -165489,6 +181078,7 @@ characters.data={
},
[0x1D170]={
category="mc",
+ combining=0xD8,
description="MUSICAL SYMBOL COMBINING FLAG-0x0003",
direction="l",
linebreak="cm",
@@ -165496,6 +181086,7 @@ characters.data={
},
[0x1D171]={
category="mc",
+ combining=0xD8,
description="MUSICAL SYMBOL COMBINING FLAG-0x0004",
direction="l",
linebreak="cm",
@@ -165503,6 +181094,7 @@ characters.data={
},
[0x1D172]={
category="mc",
+ combining=0xD8,
description="MUSICAL SYMBOL COMBINING FLAG-0x0005",
direction="l",
linebreak="cm",
@@ -165566,6 +181158,7 @@ characters.data={
},
[0x1D17B]={
category="mn",
+ combining=0xDC,
description="MUSICAL SYMBOL COMBINING ACCENT",
direction="nsm",
linebreak="cm",
@@ -165573,6 +181166,7 @@ characters.data={
},
[0x1D17C]={
category="mn",
+ combining=0xDC,
description="MUSICAL SYMBOL COMBINING STACCATO",
direction="nsm",
linebreak="cm",
@@ -165580,6 +181174,7 @@ characters.data={
},
[0x1D17D]={
category="mn",
+ combining=0xDC,
description="MUSICAL SYMBOL COMBINING TENUTO",
direction="nsm",
linebreak="cm",
@@ -165587,6 +181182,7 @@ characters.data={
},
[0x1D17E]={
category="mn",
+ combining=0xDC,
description="MUSICAL SYMBOL COMBINING STACCATISSIMO",
direction="nsm",
linebreak="cm",
@@ -165594,6 +181190,7 @@ characters.data={
},
[0x1D17F]={
category="mn",
+ combining=0xDC,
description="MUSICAL SYMBOL COMBINING MARCATO",
direction="nsm",
linebreak="cm",
@@ -165601,6 +181198,7 @@ characters.data={
},
[0x1D180]={
category="mn",
+ combining=0xDC,
description="MUSICAL SYMBOL COMBINING MARCATO-STACCATO",
direction="nsm",
linebreak="cm",
@@ -165608,6 +181206,7 @@ characters.data={
},
[0x1D181]={
category="mn",
+ combining=0xDC,
description="MUSICAL SYMBOL COMBINING ACCENT-STACCATO",
direction="nsm",
linebreak="cm",
@@ -165615,6 +181214,7 @@ characters.data={
},
[0x1D182]={
category="mn",
+ combining=0xDC,
description="MUSICAL SYMBOL COMBINING LOURE",
direction="nsm",
linebreak="cm",
@@ -165636,6 +181236,7 @@ characters.data={
},
[0x1D185]={
category="mn",
+ combining=0xE6,
description="MUSICAL SYMBOL COMBINING DOIT",
direction="nsm",
linebreak="cm",
@@ -165643,6 +181244,7 @@ characters.data={
},
[0x1D186]={
category="mn",
+ combining=0xE6,
description="MUSICAL SYMBOL COMBINING RIP",
direction="nsm",
linebreak="cm",
@@ -165650,6 +181252,7 @@ characters.data={
},
[0x1D187]={
category="mn",
+ combining=0xE6,
description="MUSICAL SYMBOL COMBINING FLIP",
direction="nsm",
linebreak="cm",
@@ -165657,6 +181260,7 @@ characters.data={
},
[0x1D188]={
category="mn",
+ combining=0xE6,
description="MUSICAL SYMBOL COMBINING SMEAR",
direction="nsm",
linebreak="cm",
@@ -165664,6 +181268,7 @@ characters.data={
},
[0x1D189]={
category="mn",
+ combining=0xE6,
description="MUSICAL SYMBOL COMBINING BEND",
direction="nsm",
linebreak="cm",
@@ -165671,6 +181276,7 @@ characters.data={
},
[0x1D18A]={
category="mn",
+ combining=0xDC,
description="MUSICAL SYMBOL COMBINING DOUBLE TONGUE",
direction="nsm",
linebreak="cm",
@@ -165678,6 +181284,7 @@ characters.data={
},
[0x1D18B]={
category="mn",
+ combining=0xDC,
description="MUSICAL SYMBOL COMBINING TRIPLE TONGUE",
direction="nsm",
linebreak="cm",
@@ -165895,6 +181502,7 @@ characters.data={
},
[0x1D1AA]={
category="mn",
+ combining=0xE6,
description="MUSICAL SYMBOL COMBINING DOWN BOW",
direction="nsm",
linebreak="cm",
@@ -165902,6 +181510,7 @@ characters.data={
},
[0x1D1AB]={
category="mn",
+ combining=0xE6,
description="MUSICAL SYMBOL COMBINING UP BOW",
direction="nsm",
linebreak="cm",
@@ -165909,6 +181518,7 @@ characters.data={
},
[0x1D1AC]={
category="mn",
+ combining=0xE6,
description="MUSICAL SYMBOL COMBINING HARMONIC",
direction="nsm",
linebreak="cm",
@@ -165916,6 +181526,7 @@ characters.data={
},
[0x1D1AD]={
category="mn",
+ combining=0xE6,
description="MUSICAL SYMBOL COMBINING SNAP PIZZICATO",
direction="nsm",
linebreak="cm",
@@ -166727,6 +182338,7 @@ characters.data={
},
[0x1D242]={
category="mn",
+ combining=0xE6,
description="COMBINING GREEK MUSICAL TRISEME",
direction="nsm",
linebreak="cm",
@@ -166734,6 +182346,7 @@ characters.data={
},
[0x1D243]={
category="mn",
+ combining=0xE6,
description="COMBINING GREEK MUSICAL TETRASEME",
direction="nsm",
linebreak="cm",
@@ -166741,6 +182354,7 @@ characters.data={
},
[0x1D244]={
category="mn",
+ combining=0xE6,
description="COMBINING GREEK MUSICAL PENTASEME",
direction="nsm",
linebreak="cm",
@@ -167493,7 +183107,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0041 },
+ specials={ "font", 0x41 },
unicodeslot=0x1D400,
visual="bf",
},
@@ -167502,7 +183116,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0042 },
+ specials={ "font", 0x42 },
unicodeslot=0x1D401,
visual="bf",
},
@@ -167511,7 +183125,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL C",
direction="l",
linebreak="al",
- specials={ "font", 0x0043 },
+ specials={ "font", 0x43 },
unicodeslot=0x1D402,
visual="bf",
},
@@ -167520,7 +183134,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0044 },
+ specials={ "font", 0x44 },
unicodeslot=0x1D403,
visual="bf",
},
@@ -167529,7 +183143,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0045 },
+ specials={ "font", 0x45 },
unicodeslot=0x1D404,
visual="bf",
},
@@ -167538,7 +183152,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0046 },
+ specials={ "font", 0x46 },
unicodeslot=0x1D405,
visual="bf",
},
@@ -167547,7 +183161,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0047 },
+ specials={ "font", 0x47 },
unicodeslot=0x1D406,
visual="bf",
},
@@ -167556,7 +183170,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL H",
direction="l",
linebreak="al",
- specials={ "font", 0x0048 },
+ specials={ "font", 0x48 },
unicodeslot=0x1D407,
visual="bf",
},
@@ -167565,7 +183179,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL I",
direction="l",
linebreak="al",
- specials={ "font", 0x0049 },
+ specials={ "font", 0x49 },
unicodeslot=0x1D408,
visual="bf",
},
@@ -167574,7 +183188,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL J",
direction="l",
linebreak="al",
- specials={ "font", 0x004A },
+ specials={ "font", 0x4A },
unicodeslot=0x1D409,
visual="bf",
},
@@ -167583,7 +183197,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL K",
direction="l",
linebreak="al",
- specials={ "font", 0x004B },
+ specials={ "font", 0x4B },
unicodeslot=0x1D40A,
visual="bf",
},
@@ -167592,7 +183206,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL L",
direction="l",
linebreak="al",
- specials={ "font", 0x004C },
+ specials={ "font", 0x4C },
unicodeslot=0x1D40B,
visual="bf",
},
@@ -167601,7 +183215,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL M",
direction="l",
linebreak="al",
- specials={ "font", 0x004D },
+ specials={ "font", 0x4D },
unicodeslot=0x1D40C,
visual="bf",
},
@@ -167610,7 +183224,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL N",
direction="l",
linebreak="al",
- specials={ "font", 0x004E },
+ specials={ "font", 0x4E },
unicodeslot=0x1D40D,
visual="bf",
},
@@ -167619,7 +183233,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL O",
direction="l",
linebreak="al",
- specials={ "font", 0x004F },
+ specials={ "font", 0x4F },
unicodeslot=0x1D40E,
visual="bf",
},
@@ -167628,7 +183242,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL P",
direction="l",
linebreak="al",
- specials={ "font", 0x0050 },
+ specials={ "font", 0x50 },
unicodeslot=0x1D40F,
visual="bf",
},
@@ -167637,7 +183251,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL Q",
direction="l",
linebreak="al",
- specials={ "font", 0x0051 },
+ specials={ "font", 0x51 },
unicodeslot=0x1D410,
visual="bf",
},
@@ -167646,7 +183260,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL R",
direction="l",
linebreak="al",
- specials={ "font", 0x0052 },
+ specials={ "font", 0x52 },
unicodeslot=0x1D411,
visual="bf",
},
@@ -167655,7 +183269,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0053 },
+ specials={ "font", 0x53 },
unicodeslot=0x1D412,
visual="bf",
},
@@ -167664,7 +183278,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0054 },
+ specials={ "font", 0x54 },
unicodeslot=0x1D413,
visual="bf",
},
@@ -167673,7 +183287,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0055 },
+ specials={ "font", 0x55 },
unicodeslot=0x1D414,
visual="bf",
},
@@ -167682,7 +183296,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0056 },
+ specials={ "font", 0x56 },
unicodeslot=0x1D415,
visual="bf",
},
@@ -167691,7 +183305,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0057 },
+ specials={ "font", 0x57 },
unicodeslot=0x1D416,
visual="bf",
},
@@ -167700,7 +183314,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0058 },
+ specials={ "font", 0x58 },
unicodeslot=0x1D417,
visual="bf",
},
@@ -167709,7 +183323,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0059 },
+ specials={ "font", 0x59 },
unicodeslot=0x1D418,
visual="bf",
},
@@ -167718,7 +183332,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL Z",
direction="l",
linebreak="al",
- specials={ "font", 0x005A },
+ specials={ "font", 0x5A },
unicodeslot=0x1D419,
visual="bf",
},
@@ -167727,7 +183341,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0061 },
+ specials={ "font", 0x61 },
unicodeslot=0x1D41A,
visual="bf",
},
@@ -167736,7 +183350,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0062 },
+ specials={ "font", 0x62 },
unicodeslot=0x1D41B,
visual="bf",
},
@@ -167745,7 +183359,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL C",
direction="l",
linebreak="al",
- specials={ "font", 0x0063 },
+ specials={ "font", 0x63 },
unicodeslot=0x1D41C,
visual="bf",
},
@@ -167754,7 +183368,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0064 },
+ specials={ "font", 0x64 },
unicodeslot=0x1D41D,
visual="bf",
},
@@ -167763,7 +183377,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0065 },
+ specials={ "font", 0x65 },
unicodeslot=0x1D41E,
visual="bf",
},
@@ -167772,7 +183386,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0066 },
+ specials={ "font", 0x66 },
unicodeslot=0x1D41F,
visual="bf",
},
@@ -167781,7 +183395,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0067 },
+ specials={ "font", 0x67 },
unicodeslot=0x1D420,
visual="bf",
},
@@ -167790,7 +183404,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL H",
direction="l",
linebreak="al",
- specials={ "font", 0x0068 },
+ specials={ "font", 0x68 },
unicodeslot=0x1D421,
visual="bf",
},
@@ -167799,7 +183413,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL I",
direction="l",
linebreak="al",
- specials={ "font", 0x0069 },
+ specials={ "font", 0x69 },
unicodeslot=0x1D422,
visual="bf",
},
@@ -167808,7 +183422,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL J",
direction="l",
linebreak="al",
- specials={ "font", 0x006A },
+ specials={ "font", 0x6A },
unicodeslot=0x1D423,
visual="bf",
},
@@ -167817,7 +183431,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL K",
direction="l",
linebreak="al",
- specials={ "font", 0x006B },
+ specials={ "font", 0x6B },
unicodeslot=0x1D424,
visual="bf",
},
@@ -167826,7 +183440,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL L",
direction="l",
linebreak="al",
- specials={ "font", 0x006C },
+ specials={ "font", 0x6C },
unicodeslot=0x1D425,
visual="bf",
},
@@ -167835,7 +183449,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL M",
direction="l",
linebreak="al",
- specials={ "font", 0x006D },
+ specials={ "font", 0x6D },
unicodeslot=0x1D426,
visual="bf",
},
@@ -167844,7 +183458,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL N",
direction="l",
linebreak="al",
- specials={ "font", 0x006E },
+ specials={ "font", 0x6E },
unicodeslot=0x1D427,
visual="bf",
},
@@ -167853,7 +183467,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL O",
direction="l",
linebreak="al",
- specials={ "font", 0x006F },
+ specials={ "font", 0x6F },
unicodeslot=0x1D428,
visual="bf",
},
@@ -167862,7 +183476,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL P",
direction="l",
linebreak="al",
- specials={ "font", 0x0070 },
+ specials={ "font", 0x70 },
unicodeslot=0x1D429,
visual="bf",
},
@@ -167871,7 +183485,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL Q",
direction="l",
linebreak="al",
- specials={ "font", 0x0071 },
+ specials={ "font", 0x71 },
unicodeslot=0x1D42A,
visual="bf",
},
@@ -167880,7 +183494,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL R",
direction="l",
linebreak="al",
- specials={ "font", 0x0072 },
+ specials={ "font", 0x72 },
unicodeslot=0x1D42B,
visual="bf",
},
@@ -167889,7 +183503,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0073 },
+ specials={ "font", 0x73 },
unicodeslot=0x1D42C,
visual="bf",
},
@@ -167898,7 +183512,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0074 },
+ specials={ "font", 0x74 },
unicodeslot=0x1D42D,
visual="bf",
},
@@ -167907,7 +183521,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0075 },
+ specials={ "font", 0x75 },
unicodeslot=0x1D42E,
visual="bf",
},
@@ -167916,7 +183530,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0076 },
+ specials={ "font", 0x76 },
unicodeslot=0x1D42F,
visual="bf",
},
@@ -167925,7 +183539,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0077 },
+ specials={ "font", 0x77 },
unicodeslot=0x1D430,
visual="bf",
},
@@ -167934,7 +183548,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0078 },
+ specials={ "font", 0x78 },
unicodeslot=0x1D431,
visual="bf",
},
@@ -167943,7 +183557,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0079 },
+ specials={ "font", 0x79 },
unicodeslot=0x1D432,
visual="bf",
},
@@ -167952,7 +183566,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL Z",
direction="l",
linebreak="al",
- specials={ "font", 0x007A },
+ specials={ "font", 0x7A },
unicodeslot=0x1D433,
visual="bf",
},
@@ -167961,7 +183575,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0041 },
+ specials={ "font", 0x41 },
unicodeslot=0x1D434,
visual="it",
},
@@ -167970,7 +183584,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0042 },
+ specials={ "font", 0x42 },
unicodeslot=0x1D435,
visual="it",
},
@@ -167979,7 +183593,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL C",
direction="l",
linebreak="al",
- specials={ "font", 0x0043 },
+ specials={ "font", 0x43 },
unicodeslot=0x1D436,
visual="it",
},
@@ -167988,7 +183602,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0044 },
+ specials={ "font", 0x44 },
unicodeslot=0x1D437,
visual="it",
},
@@ -167997,7 +183611,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0045 },
+ specials={ "font", 0x45 },
unicodeslot=0x1D438,
visual="it",
},
@@ -168006,7 +183620,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0046 },
+ specials={ "font", 0x46 },
unicodeslot=0x1D439,
visual="it",
},
@@ -168015,7 +183629,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0047 },
+ specials={ "font", 0x47 },
unicodeslot=0x1D43A,
visual="it",
},
@@ -168024,7 +183638,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL H",
direction="l",
linebreak="al",
- specials={ "font", 0x0048 },
+ specials={ "font", 0x48 },
unicodeslot=0x1D43B,
visual="it",
},
@@ -168033,7 +183647,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL I",
direction="l",
linebreak="al",
- specials={ "font", 0x0049 },
+ specials={ "font", 0x49 },
unicodeslot=0x1D43C,
visual="it",
},
@@ -168042,7 +183656,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL J",
direction="l",
linebreak="al",
- specials={ "font", 0x004A },
+ specials={ "font", 0x4A },
unicodeslot=0x1D43D,
visual="it",
},
@@ -168051,7 +183665,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL K",
direction="l",
linebreak="al",
- specials={ "font", 0x004B },
+ specials={ "font", 0x4B },
unicodeslot=0x1D43E,
visual="it",
},
@@ -168060,7 +183674,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL L",
direction="l",
linebreak="al",
- specials={ "font", 0x004C },
+ specials={ "font", 0x4C },
unicodeslot=0x1D43F,
visual="it",
},
@@ -168069,7 +183683,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL M",
direction="l",
linebreak="al",
- specials={ "font", 0x004D },
+ specials={ "font", 0x4D },
unicodeslot=0x1D440,
visual="it",
},
@@ -168078,7 +183692,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL N",
direction="l",
linebreak="al",
- specials={ "font", 0x004E },
+ specials={ "font", 0x4E },
unicodeslot=0x1D441,
visual="it",
},
@@ -168087,7 +183701,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL O",
direction="l",
linebreak="al",
- specials={ "font", 0x004F },
+ specials={ "font", 0x4F },
unicodeslot=0x1D442,
visual="it",
},
@@ -168096,7 +183710,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL P",
direction="l",
linebreak="al",
- specials={ "font", 0x0050 },
+ specials={ "font", 0x50 },
unicodeslot=0x1D443,
visual="it",
},
@@ -168105,7 +183719,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL Q",
direction="l",
linebreak="al",
- specials={ "font", 0x0051 },
+ specials={ "font", 0x51 },
unicodeslot=0x1D444,
visual="it",
},
@@ -168114,7 +183728,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL R",
direction="l",
linebreak="al",
- specials={ "font", 0x0052 },
+ specials={ "font", 0x52 },
unicodeslot=0x1D445,
visual="it",
},
@@ -168123,7 +183737,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0053 },
+ specials={ "font", 0x53 },
unicodeslot=0x1D446,
visual="it",
},
@@ -168132,7 +183746,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0054 },
+ specials={ "font", 0x54 },
unicodeslot=0x1D447,
visual="it",
},
@@ -168141,7 +183755,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0055 },
+ specials={ "font", 0x55 },
unicodeslot=0x1D448,
visual="it",
},
@@ -168150,7 +183764,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0056 },
+ specials={ "font", 0x56 },
unicodeslot=0x1D449,
visual="it",
},
@@ -168159,7 +183773,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0057 },
+ specials={ "font", 0x57 },
unicodeslot=0x1D44A,
visual="it",
},
@@ -168168,7 +183782,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0058 },
+ specials={ "font", 0x58 },
unicodeslot=0x1D44B,
visual="it",
},
@@ -168177,7 +183791,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0059 },
+ specials={ "font", 0x59 },
unicodeslot=0x1D44C,
visual="it",
},
@@ -168186,7 +183800,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL Z",
direction="l",
linebreak="al",
- specials={ "font", 0x005A },
+ specials={ "font", 0x5A },
unicodeslot=0x1D44D,
visual="it",
},
@@ -168195,7 +183809,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0061 },
+ specials={ "font", 0x61 },
unicodeslot=0x1D44E,
visual="it",
},
@@ -168204,7 +183818,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0062 },
+ specials={ "font", 0x62 },
unicodeslot=0x1D44F,
visual="it",
},
@@ -168213,7 +183827,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL C",
direction="l",
linebreak="al",
- specials={ "font", 0x0063 },
+ specials={ "font", 0x63 },
unicodeslot=0x1D450,
visual="it",
},
@@ -168222,7 +183836,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0064 },
+ specials={ "font", 0x64 },
unicodeslot=0x1D451,
visual="it",
},
@@ -168231,7 +183845,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0065 },
+ specials={ "font", 0x65 },
unicodeslot=0x1D452,
visual="it",
},
@@ -168240,7 +183854,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0066 },
+ specials={ "font", 0x66 },
unicodeslot=0x1D453,
visual="it",
},
@@ -168249,7 +183863,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0067 },
+ specials={ "font", 0x67 },
unicodeslot=0x1D454,
visual="it",
},
@@ -168258,7 +183872,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL I",
direction="l",
linebreak="al",
- specials={ "font", 0x0069 },
+ specials={ "font", 0x69 },
unicodeslot=0x1D456,
visual="it",
},
@@ -168267,7 +183881,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL J",
direction="l",
linebreak="al",
- specials={ "font", 0x006A },
+ specials={ "font", 0x6A },
unicodeslot=0x1D457,
visual="it",
},
@@ -168276,7 +183890,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL K",
direction="l",
linebreak="al",
- specials={ "font", 0x006B },
+ specials={ "font", 0x6B },
unicodeslot=0x1D458,
visual="it",
},
@@ -168285,7 +183899,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL L",
direction="l",
linebreak="al",
- specials={ "font", 0x006C },
+ specials={ "font", 0x6C },
unicodeslot=0x1D459,
visual="it",
},
@@ -168294,7 +183908,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL M",
direction="l",
linebreak="al",
- specials={ "font", 0x006D },
+ specials={ "font", 0x6D },
unicodeslot=0x1D45A,
visual="it",
},
@@ -168303,7 +183917,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL N",
direction="l",
linebreak="al",
- specials={ "font", 0x006E },
+ specials={ "font", 0x6E },
unicodeslot=0x1D45B,
visual="it",
},
@@ -168312,7 +183926,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL O",
direction="l",
linebreak="al",
- specials={ "font", 0x006F },
+ specials={ "font", 0x6F },
unicodeslot=0x1D45C,
visual="it",
},
@@ -168321,7 +183935,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL P",
direction="l",
linebreak="al",
- specials={ "font", 0x0070 },
+ specials={ "font", 0x70 },
unicodeslot=0x1D45D,
visual="it",
},
@@ -168330,7 +183944,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL Q",
direction="l",
linebreak="al",
- specials={ "font", 0x0071 },
+ specials={ "font", 0x71 },
unicodeslot=0x1D45E,
visual="it",
},
@@ -168339,7 +183953,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL R",
direction="l",
linebreak="al",
- specials={ "font", 0x0072 },
+ specials={ "font", 0x72 },
unicodeslot=0x1D45F,
visual="it",
},
@@ -168348,7 +183962,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0073 },
+ specials={ "font", 0x73 },
unicodeslot=0x1D460,
visual="it",
},
@@ -168357,7 +183971,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0074 },
+ specials={ "font", 0x74 },
unicodeslot=0x1D461,
visual="it",
},
@@ -168366,7 +183980,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0075 },
+ specials={ "font", 0x75 },
unicodeslot=0x1D462,
visual="it",
},
@@ -168375,7 +183989,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0076 },
+ specials={ "font", 0x76 },
unicodeslot=0x1D463,
visual="it",
},
@@ -168384,7 +183998,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0077 },
+ specials={ "font", 0x77 },
unicodeslot=0x1D464,
visual="it",
},
@@ -168393,7 +184007,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0078 },
+ specials={ "font", 0x78 },
unicodeslot=0x1D465,
visual="it",
},
@@ -168402,7 +184016,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0079 },
+ specials={ "font", 0x79 },
unicodeslot=0x1D466,
visual="it",
},
@@ -168411,7 +184025,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL Z",
direction="l",
linebreak="al",
- specials={ "font", 0x007A },
+ specials={ "font", 0x7A },
unicodeslot=0x1D467,
visual="it",
},
@@ -168420,7 +184034,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0041 },
+ specials={ "font", 0x41 },
unicodeslot=0x1D468,
visual="bi",
},
@@ -168429,7 +184043,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0042 },
+ specials={ "font", 0x42 },
unicodeslot=0x1D469,
visual="bi",
},
@@ -168438,7 +184052,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL C",
direction="l",
linebreak="al",
- specials={ "font", 0x0043 },
+ specials={ "font", 0x43 },
unicodeslot=0x1D46A,
visual="bi",
},
@@ -168447,7 +184061,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0044 },
+ specials={ "font", 0x44 },
unicodeslot=0x1D46B,
visual="bi",
},
@@ -168456,7 +184070,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0045 },
+ specials={ "font", 0x45 },
unicodeslot=0x1D46C,
visual="bi",
},
@@ -168465,7 +184079,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0046 },
+ specials={ "font", 0x46 },
unicodeslot=0x1D46D,
visual="bi",
},
@@ -168474,7 +184088,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0047 },
+ specials={ "font", 0x47 },
unicodeslot=0x1D46E,
visual="bi",
},
@@ -168483,7 +184097,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL H",
direction="l",
linebreak="al",
- specials={ "font", 0x0048 },
+ specials={ "font", 0x48 },
unicodeslot=0x1D46F,
visual="bi",
},
@@ -168492,7 +184106,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL I",
direction="l",
linebreak="al",
- specials={ "font", 0x0049 },
+ specials={ "font", 0x49 },
unicodeslot=0x1D470,
visual="bi",
},
@@ -168501,7 +184115,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL J",
direction="l",
linebreak="al",
- specials={ "font", 0x004A },
+ specials={ "font", 0x4A },
unicodeslot=0x1D471,
visual="bi",
},
@@ -168510,7 +184124,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL K",
direction="l",
linebreak="al",
- specials={ "font", 0x004B },
+ specials={ "font", 0x4B },
unicodeslot=0x1D472,
visual="bi",
},
@@ -168519,7 +184133,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL L",
direction="l",
linebreak="al",
- specials={ "font", 0x004C },
+ specials={ "font", 0x4C },
unicodeslot=0x1D473,
visual="bi",
},
@@ -168528,7 +184142,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL M",
direction="l",
linebreak="al",
- specials={ "font", 0x004D },
+ specials={ "font", 0x4D },
unicodeslot=0x1D474,
visual="bi",
},
@@ -168537,7 +184151,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL N",
direction="l",
linebreak="al",
- specials={ "font", 0x004E },
+ specials={ "font", 0x4E },
unicodeslot=0x1D475,
visual="bi",
},
@@ -168546,7 +184160,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL O",
direction="l",
linebreak="al",
- specials={ "font", 0x004F },
+ specials={ "font", 0x4F },
unicodeslot=0x1D476,
visual="bi",
},
@@ -168555,7 +184169,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL P",
direction="l",
linebreak="al",
- specials={ "font", 0x0050 },
+ specials={ "font", 0x50 },
unicodeslot=0x1D477,
visual="bi",
},
@@ -168564,7 +184178,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL Q",
direction="l",
linebreak="al",
- specials={ "font", 0x0051 },
+ specials={ "font", 0x51 },
unicodeslot=0x1D478,
visual="bi",
},
@@ -168573,7 +184187,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL R",
direction="l",
linebreak="al",
- specials={ "font", 0x0052 },
+ specials={ "font", 0x52 },
unicodeslot=0x1D479,
visual="bi",
},
@@ -168582,7 +184196,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0053 },
+ specials={ "font", 0x53 },
unicodeslot=0x1D47A,
visual="bi",
},
@@ -168591,7 +184205,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0054 },
+ specials={ "font", 0x54 },
unicodeslot=0x1D47B,
visual="bi",
},
@@ -168600,7 +184214,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0055 },
+ specials={ "font", 0x55 },
unicodeslot=0x1D47C,
visual="bi",
},
@@ -168609,7 +184223,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0056 },
+ specials={ "font", 0x56 },
unicodeslot=0x1D47D,
visual="bi",
},
@@ -168618,7 +184232,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0057 },
+ specials={ "font", 0x57 },
unicodeslot=0x1D47E,
visual="bi",
},
@@ -168627,7 +184241,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0058 },
+ specials={ "font", 0x58 },
unicodeslot=0x1D47F,
visual="bi",
},
@@ -168636,7 +184250,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0059 },
+ specials={ "font", 0x59 },
unicodeslot=0x1D480,
visual="bi",
},
@@ -168645,7 +184259,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL Z",
direction="l",
linebreak="al",
- specials={ "font", 0x005A },
+ specials={ "font", 0x5A },
unicodeslot=0x1D481,
visual="bi",
},
@@ -168654,7 +184268,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0061 },
+ specials={ "font", 0x61 },
unicodeslot=0x1D482,
visual="bi",
},
@@ -168663,7 +184277,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0062 },
+ specials={ "font", 0x62 },
unicodeslot=0x1D483,
visual="bi",
},
@@ -168672,7 +184286,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL C",
direction="l",
linebreak="al",
- specials={ "font", 0x0063 },
+ specials={ "font", 0x63 },
unicodeslot=0x1D484,
visual="bi",
},
@@ -168681,7 +184295,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0064 },
+ specials={ "font", 0x64 },
unicodeslot=0x1D485,
visual="bi",
},
@@ -168690,7 +184304,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0065 },
+ specials={ "font", 0x65 },
unicodeslot=0x1D486,
visual="bi",
},
@@ -168699,7 +184313,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0066 },
+ specials={ "font", 0x66 },
unicodeslot=0x1D487,
visual="bi",
},
@@ -168708,7 +184322,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0067 },
+ specials={ "font", 0x67 },
unicodeslot=0x1D488,
visual="bi",
},
@@ -168717,7 +184331,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL H",
direction="l",
linebreak="al",
- specials={ "font", 0x0068 },
+ specials={ "font", 0x68 },
unicodeslot=0x1D489,
visual="bi",
},
@@ -168726,7 +184340,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL I",
direction="l",
linebreak="al",
- specials={ "font", 0x0069 },
+ specials={ "font", 0x69 },
unicodeslot=0x1D48A,
visual="bi",
},
@@ -168735,7 +184349,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL J",
direction="l",
linebreak="al",
- specials={ "font", 0x006A },
+ specials={ "font", 0x6A },
unicodeslot=0x1D48B,
visual="bi",
},
@@ -168744,7 +184358,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL K",
direction="l",
linebreak="al",
- specials={ "font", 0x006B },
+ specials={ "font", 0x6B },
unicodeslot=0x1D48C,
visual="bi",
},
@@ -168753,7 +184367,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL L",
direction="l",
linebreak="al",
- specials={ "font", 0x006C },
+ specials={ "font", 0x6C },
unicodeslot=0x1D48D,
visual="bi",
},
@@ -168762,7 +184376,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL M",
direction="l",
linebreak="al",
- specials={ "font", 0x006D },
+ specials={ "font", 0x6D },
unicodeslot=0x1D48E,
visual="bi",
},
@@ -168771,7 +184385,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL N",
direction="l",
linebreak="al",
- specials={ "font", 0x006E },
+ specials={ "font", 0x6E },
unicodeslot=0x1D48F,
visual="bi",
},
@@ -168780,7 +184394,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL O",
direction="l",
linebreak="al",
- specials={ "font", 0x006F },
+ specials={ "font", 0x6F },
unicodeslot=0x1D490,
visual="bi",
},
@@ -168789,7 +184403,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL P",
direction="l",
linebreak="al",
- specials={ "font", 0x0070 },
+ specials={ "font", 0x70 },
unicodeslot=0x1D491,
visual="bi",
},
@@ -168798,7 +184412,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL Q",
direction="l",
linebreak="al",
- specials={ "font", 0x0071 },
+ specials={ "font", 0x71 },
unicodeslot=0x1D492,
visual="bi",
},
@@ -168807,7 +184421,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL R",
direction="l",
linebreak="al",
- specials={ "font", 0x0072 },
+ specials={ "font", 0x72 },
unicodeslot=0x1D493,
visual="bi",
},
@@ -168816,7 +184430,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0073 },
+ specials={ "font", 0x73 },
unicodeslot=0x1D494,
visual="bi",
},
@@ -168825,7 +184439,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0074 },
+ specials={ "font", 0x74 },
unicodeslot=0x1D495,
visual="bi",
},
@@ -168834,7 +184448,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0075 },
+ specials={ "font", 0x75 },
unicodeslot=0x1D496,
visual="bi",
},
@@ -168843,7 +184457,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0076 },
+ specials={ "font", 0x76 },
unicodeslot=0x1D497,
visual="bi",
},
@@ -168852,7 +184466,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0077 },
+ specials={ "font", 0x77 },
unicodeslot=0x1D498,
visual="bi",
},
@@ -168861,7 +184475,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0078 },
+ specials={ "font", 0x78 },
unicodeslot=0x1D499,
visual="bi",
},
@@ -168870,7 +184484,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0079 },
+ specials={ "font", 0x79 },
unicodeslot=0x1D49A,
visual="bi",
},
@@ -168879,7 +184493,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL Z",
direction="l",
linebreak="al",
- specials={ "font", 0x007A },
+ specials={ "font", 0x7A },
unicodeslot=0x1D49B,
visual="bi",
},
@@ -168888,7 +184502,7 @@ characters.data={
description="MATHEMATICAL SCRIPT CAPITAL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0041 },
+ specials={ "font", 0x41 },
unicodeslot=0x1D49C,
},
[0x1D49E]={
@@ -168896,7 +184510,7 @@ characters.data={
description="MATHEMATICAL SCRIPT CAPITAL C",
direction="l",
linebreak="al",
- specials={ "font", 0x0043 },
+ specials={ "font", 0x43 },
unicodeslot=0x1D49E,
},
[0x1D49F]={
@@ -168904,7 +184518,7 @@ characters.data={
description="MATHEMATICAL SCRIPT CAPITAL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0044 },
+ specials={ "font", 0x44 },
unicodeslot=0x1D49F,
},
[0x1D4A2]={
@@ -168912,7 +184526,7 @@ characters.data={
description="MATHEMATICAL SCRIPT CAPITAL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0047 },
+ specials={ "font", 0x47 },
unicodeslot=0x1D4A2,
},
[0x1D4A5]={
@@ -168920,7 +184534,7 @@ characters.data={
description="MATHEMATICAL SCRIPT CAPITAL J",
direction="l",
linebreak="al",
- specials={ "font", 0x004A },
+ specials={ "font", 0x4A },
unicodeslot=0x1D4A5,
},
[0x1D4A6]={
@@ -168928,7 +184542,7 @@ characters.data={
description="MATHEMATICAL SCRIPT CAPITAL K",
direction="l",
linebreak="al",
- specials={ "font", 0x004B },
+ specials={ "font", 0x4B },
unicodeslot=0x1D4A6,
},
[0x1D4A9]={
@@ -168936,7 +184550,7 @@ characters.data={
description="MATHEMATICAL SCRIPT CAPITAL N",
direction="l",
linebreak="al",
- specials={ "font", 0x004E },
+ specials={ "font", 0x4E },
unicodeslot=0x1D4A9,
},
[0x1D4AA]={
@@ -168944,7 +184558,7 @@ characters.data={
description="MATHEMATICAL SCRIPT CAPITAL O",
direction="l",
linebreak="al",
- specials={ "font", 0x004F },
+ specials={ "font", 0x4F },
unicodeslot=0x1D4AA,
},
[0x1D4AB]={
@@ -168952,7 +184566,7 @@ characters.data={
description="MATHEMATICAL SCRIPT CAPITAL P",
direction="l",
linebreak="al",
- specials={ "font", 0x0050 },
+ specials={ "font", 0x50 },
unicodeslot=0x1D4AB,
},
[0x1D4AC]={
@@ -168960,7 +184574,7 @@ characters.data={
description="MATHEMATICAL SCRIPT CAPITAL Q",
direction="l",
linebreak="al",
- specials={ "font", 0x0051 },
+ specials={ "font", 0x51 },
unicodeslot=0x1D4AC,
},
[0x1D4AE]={
@@ -168968,7 +184582,7 @@ characters.data={
description="MATHEMATICAL SCRIPT CAPITAL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0053 },
+ specials={ "font", 0x53 },
unicodeslot=0x1D4AE,
},
[0x1D4AF]={
@@ -168976,7 +184590,7 @@ characters.data={
description="MATHEMATICAL SCRIPT CAPITAL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0054 },
+ specials={ "font", 0x54 },
unicodeslot=0x1D4AF,
},
[0x1D4B0]={
@@ -168984,7 +184598,7 @@ characters.data={
description="MATHEMATICAL SCRIPT CAPITAL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0055 },
+ specials={ "font", 0x55 },
unicodeslot=0x1D4B0,
},
[0x1D4B1]={
@@ -168992,7 +184606,7 @@ characters.data={
description="MATHEMATICAL SCRIPT CAPITAL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0056 },
+ specials={ "font", 0x56 },
unicodeslot=0x1D4B1,
},
[0x1D4B2]={
@@ -169000,7 +184614,7 @@ characters.data={
description="MATHEMATICAL SCRIPT CAPITAL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0057 },
+ specials={ "font", 0x57 },
unicodeslot=0x1D4B2,
},
[0x1D4B3]={
@@ -169008,7 +184622,7 @@ characters.data={
description="MATHEMATICAL SCRIPT CAPITAL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0058 },
+ specials={ "font", 0x58 },
unicodeslot=0x1D4B3,
},
[0x1D4B4]={
@@ -169016,7 +184630,7 @@ characters.data={
description="MATHEMATICAL SCRIPT CAPITAL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0059 },
+ specials={ "font", 0x59 },
unicodeslot=0x1D4B4,
},
[0x1D4B5]={
@@ -169024,7 +184638,7 @@ characters.data={
description="MATHEMATICAL SCRIPT CAPITAL Z",
direction="l",
linebreak="al",
- specials={ "font", 0x005A },
+ specials={ "font", 0x5A },
unicodeslot=0x1D4B5,
},
[0x1D4B6]={
@@ -169032,7 +184646,7 @@ characters.data={
description="MATHEMATICAL SCRIPT SMALL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0061 },
+ specials={ "font", 0x61 },
unicodeslot=0x1D4B6,
},
[0x1D4B7]={
@@ -169040,7 +184654,7 @@ characters.data={
description="MATHEMATICAL SCRIPT SMALL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0062 },
+ specials={ "font", 0x62 },
unicodeslot=0x1D4B7,
},
[0x1D4B8]={
@@ -169048,7 +184662,7 @@ characters.data={
description="MATHEMATICAL SCRIPT SMALL C",
direction="l",
linebreak="al",
- specials={ "font", 0x0063 },
+ specials={ "font", 0x63 },
unicodeslot=0x1D4B8,
},
[0x1D4B9]={
@@ -169056,7 +184670,7 @@ characters.data={
description="MATHEMATICAL SCRIPT SMALL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0064 },
+ specials={ "font", 0x64 },
unicodeslot=0x1D4B9,
},
[0x1D4BB]={
@@ -169064,7 +184678,7 @@ characters.data={
description="MATHEMATICAL SCRIPT SMALL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0066 },
+ specials={ "font", 0x66 },
unicodeslot=0x1D4BB,
},
[0x1D4BD]={
@@ -169072,7 +184686,7 @@ characters.data={
description="MATHEMATICAL SCRIPT SMALL H",
direction="l",
linebreak="al",
- specials={ "font", 0x0068 },
+ specials={ "font", 0x68 },
unicodeslot=0x1D4BD,
},
[0x1D4BE]={
@@ -169080,7 +184694,7 @@ characters.data={
description="MATHEMATICAL SCRIPT SMALL I",
direction="l",
linebreak="al",
- specials={ "font", 0x0069 },
+ specials={ "font", 0x69 },
unicodeslot=0x1D4BE,
},
[0x1D4BF]={
@@ -169088,7 +184702,7 @@ characters.data={
description="MATHEMATICAL SCRIPT SMALL J",
direction="l",
linebreak="al",
- specials={ "font", 0x006A },
+ specials={ "font", 0x6A },
unicodeslot=0x1D4BF,
},
[0x1D4C0]={
@@ -169096,7 +184710,7 @@ characters.data={
description="MATHEMATICAL SCRIPT SMALL K",
direction="l",
linebreak="al",
- specials={ "font", 0x006B },
+ specials={ "font", 0x6B },
unicodeslot=0x1D4C0,
},
[0x1D4C1]={
@@ -169104,7 +184718,7 @@ characters.data={
description="MATHEMATICAL SCRIPT SMALL L",
direction="l",
linebreak="al",
- specials={ "font", 0x006C },
+ specials={ "font", 0x6C },
unicodeslot=0x1D4C1,
},
[0x1D4C2]={
@@ -169112,7 +184726,7 @@ characters.data={
description="MATHEMATICAL SCRIPT SMALL M",
direction="l",
linebreak="al",
- specials={ "font", 0x006D },
+ specials={ "font", 0x6D },
unicodeslot=0x1D4C2,
},
[0x1D4C3]={
@@ -169120,7 +184734,7 @@ characters.data={
description="MATHEMATICAL SCRIPT SMALL N",
direction="l",
linebreak="al",
- specials={ "font", 0x006E },
+ specials={ "font", 0x6E },
unicodeslot=0x1D4C3,
},
[0x1D4C5]={
@@ -169128,7 +184742,7 @@ characters.data={
description="MATHEMATICAL SCRIPT SMALL P",
direction="l",
linebreak="al",
- specials={ "font", 0x0070 },
+ specials={ "font", 0x70 },
unicodeslot=0x1D4C5,
},
[0x1D4C6]={
@@ -169136,7 +184750,7 @@ characters.data={
description="MATHEMATICAL SCRIPT SMALL Q",
direction="l",
linebreak="al",
- specials={ "font", 0x0071 },
+ specials={ "font", 0x71 },
unicodeslot=0x1D4C6,
},
[0x1D4C7]={
@@ -169144,7 +184758,7 @@ characters.data={
description="MATHEMATICAL SCRIPT SMALL R",
direction="l",
linebreak="al",
- specials={ "font", 0x0072 },
+ specials={ "font", 0x72 },
unicodeslot=0x1D4C7,
},
[0x1D4C8]={
@@ -169152,7 +184766,7 @@ characters.data={
description="MATHEMATICAL SCRIPT SMALL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0073 },
+ specials={ "font", 0x73 },
unicodeslot=0x1D4C8,
},
[0x1D4C9]={
@@ -169160,7 +184774,7 @@ characters.data={
description="MATHEMATICAL SCRIPT SMALL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0074 },
+ specials={ "font", 0x74 },
unicodeslot=0x1D4C9,
},
[0x1D4CA]={
@@ -169168,7 +184782,7 @@ characters.data={
description="MATHEMATICAL SCRIPT SMALL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0075 },
+ specials={ "font", 0x75 },
unicodeslot=0x1D4CA,
},
[0x1D4CB]={
@@ -169176,7 +184790,7 @@ characters.data={
description="MATHEMATICAL SCRIPT SMALL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0076 },
+ specials={ "font", 0x76 },
unicodeslot=0x1D4CB,
},
[0x1D4CC]={
@@ -169184,7 +184798,7 @@ characters.data={
description="MATHEMATICAL SCRIPT SMALL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0077 },
+ specials={ "font", 0x77 },
unicodeslot=0x1D4CC,
},
[0x1D4CD]={
@@ -169192,7 +184806,7 @@ characters.data={
description="MATHEMATICAL SCRIPT SMALL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0078 },
+ specials={ "font", 0x78 },
unicodeslot=0x1D4CD,
},
[0x1D4CE]={
@@ -169200,7 +184814,7 @@ characters.data={
description="MATHEMATICAL SCRIPT SMALL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0079 },
+ specials={ "font", 0x79 },
unicodeslot=0x1D4CE,
},
[0x1D4CF]={
@@ -169208,7 +184822,7 @@ characters.data={
description="MATHEMATICAL SCRIPT SMALL Z",
direction="l",
linebreak="al",
- specials={ "font", 0x007A },
+ specials={ "font", 0x7A },
unicodeslot=0x1D4CF,
},
[0x1D4D0]={
@@ -169216,7 +184830,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0041 },
+ specials={ "font", 0x41 },
unicodeslot=0x1D4D0,
visual="bf",
},
@@ -169225,7 +184839,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0042 },
+ specials={ "font", 0x42 },
unicodeslot=0x1D4D1,
visual="bf",
},
@@ -169234,7 +184848,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL C",
direction="l",
linebreak="al",
- specials={ "font", 0x0043 },
+ specials={ "font", 0x43 },
unicodeslot=0x1D4D2,
visual="bf",
},
@@ -169243,7 +184857,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0044 },
+ specials={ "font", 0x44 },
unicodeslot=0x1D4D3,
visual="bf",
},
@@ -169252,7 +184866,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0045 },
+ specials={ "font", 0x45 },
unicodeslot=0x1D4D4,
visual="bf",
},
@@ -169261,7 +184875,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0046 },
+ specials={ "font", 0x46 },
unicodeslot=0x1D4D5,
visual="bf",
},
@@ -169270,7 +184884,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0047 },
+ specials={ "font", 0x47 },
unicodeslot=0x1D4D6,
visual="bf",
},
@@ -169279,7 +184893,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL H",
direction="l",
linebreak="al",
- specials={ "font", 0x0048 },
+ specials={ "font", 0x48 },
unicodeslot=0x1D4D7,
visual="bf",
},
@@ -169288,7 +184902,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL I",
direction="l",
linebreak="al",
- specials={ "font", 0x0049 },
+ specials={ "font", 0x49 },
unicodeslot=0x1D4D8,
visual="bf",
},
@@ -169297,7 +184911,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL J",
direction="l",
linebreak="al",
- specials={ "font", 0x004A },
+ specials={ "font", 0x4A },
unicodeslot=0x1D4D9,
visual="bf",
},
@@ -169306,7 +184920,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL K",
direction="l",
linebreak="al",
- specials={ "font", 0x004B },
+ specials={ "font", 0x4B },
unicodeslot=0x1D4DA,
visual="bf",
},
@@ -169315,7 +184929,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL L",
direction="l",
linebreak="al",
- specials={ "font", 0x004C },
+ specials={ "font", 0x4C },
unicodeslot=0x1D4DB,
visual="bf",
},
@@ -169324,7 +184938,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL M",
direction="l",
linebreak="al",
- specials={ "font", 0x004D },
+ specials={ "font", 0x4D },
unicodeslot=0x1D4DC,
visual="bf",
},
@@ -169333,7 +184947,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL N",
direction="l",
linebreak="al",
- specials={ "font", 0x004E },
+ specials={ "font", 0x4E },
unicodeslot=0x1D4DD,
visual="bf",
},
@@ -169342,7 +184956,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL O",
direction="l",
linebreak="al",
- specials={ "font", 0x004F },
+ specials={ "font", 0x4F },
unicodeslot=0x1D4DE,
visual="bf",
},
@@ -169351,7 +184965,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL P",
direction="l",
linebreak="al",
- specials={ "font", 0x0050 },
+ specials={ "font", 0x50 },
unicodeslot=0x1D4DF,
visual="bf",
},
@@ -169360,7 +184974,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL Q",
direction="l",
linebreak="al",
- specials={ "font", 0x0051 },
+ specials={ "font", 0x51 },
unicodeslot=0x1D4E0,
visual="bf",
},
@@ -169369,7 +184983,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL R",
direction="l",
linebreak="al",
- specials={ "font", 0x0052 },
+ specials={ "font", 0x52 },
unicodeslot=0x1D4E1,
visual="bf",
},
@@ -169378,7 +184992,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0053 },
+ specials={ "font", 0x53 },
unicodeslot=0x1D4E2,
visual="bf",
},
@@ -169387,7 +185001,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0054 },
+ specials={ "font", 0x54 },
unicodeslot=0x1D4E3,
visual="bf",
},
@@ -169396,7 +185010,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0055 },
+ specials={ "font", 0x55 },
unicodeslot=0x1D4E4,
visual="bf",
},
@@ -169405,7 +185019,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0056 },
+ specials={ "font", 0x56 },
unicodeslot=0x1D4E5,
visual="bf",
},
@@ -169414,7 +185028,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0057 },
+ specials={ "font", 0x57 },
unicodeslot=0x1D4E6,
visual="bf",
},
@@ -169423,7 +185037,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0058 },
+ specials={ "font", 0x58 },
unicodeslot=0x1D4E7,
visual="bf",
},
@@ -169432,7 +185046,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0059 },
+ specials={ "font", 0x59 },
unicodeslot=0x1D4E8,
visual="bf",
},
@@ -169441,7 +185055,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT CAPITAL Z",
direction="l",
linebreak="al",
- specials={ "font", 0x005A },
+ specials={ "font", 0x5A },
unicodeslot=0x1D4E9,
visual="bf",
},
@@ -169450,7 +185064,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0061 },
+ specials={ "font", 0x61 },
unicodeslot=0x1D4EA,
visual="bf",
},
@@ -169459,7 +185073,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0062 },
+ specials={ "font", 0x62 },
unicodeslot=0x1D4EB,
visual="bf",
},
@@ -169468,7 +185082,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL C",
direction="l",
linebreak="al",
- specials={ "font", 0x0063 },
+ specials={ "font", 0x63 },
unicodeslot=0x1D4EC,
visual="bf",
},
@@ -169477,7 +185091,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0064 },
+ specials={ "font", 0x64 },
unicodeslot=0x1D4ED,
visual="bf",
},
@@ -169486,7 +185100,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0065 },
+ specials={ "font", 0x65 },
unicodeslot=0x1D4EE,
visual="bf",
},
@@ -169495,7 +185109,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0066 },
+ specials={ "font", 0x66 },
unicodeslot=0x1D4EF,
visual="bf",
},
@@ -169504,7 +185118,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0067 },
+ specials={ "font", 0x67 },
unicodeslot=0x1D4F0,
visual="bf",
},
@@ -169513,7 +185127,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL H",
direction="l",
linebreak="al",
- specials={ "font", 0x0068 },
+ specials={ "font", 0x68 },
unicodeslot=0x1D4F1,
visual="bf",
},
@@ -169522,7 +185136,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL I",
direction="l",
linebreak="al",
- specials={ "font", 0x0069 },
+ specials={ "font", 0x69 },
unicodeslot=0x1D4F2,
visual="bf",
},
@@ -169531,7 +185145,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL J",
direction="l",
linebreak="al",
- specials={ "font", 0x006A },
+ specials={ "font", 0x6A },
unicodeslot=0x1D4F3,
visual="bf",
},
@@ -169540,7 +185154,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL K",
direction="l",
linebreak="al",
- specials={ "font", 0x006B },
+ specials={ "font", 0x6B },
unicodeslot=0x1D4F4,
visual="bf",
},
@@ -169549,7 +185163,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL L",
direction="l",
linebreak="al",
- specials={ "font", 0x006C },
+ specials={ "font", 0x6C },
unicodeslot=0x1D4F5,
visual="bf",
},
@@ -169558,7 +185172,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL M",
direction="l",
linebreak="al",
- specials={ "font", 0x006D },
+ specials={ "font", 0x6D },
unicodeslot=0x1D4F6,
visual="bf",
},
@@ -169567,7 +185181,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL N",
direction="l",
linebreak="al",
- specials={ "font", 0x006E },
+ specials={ "font", 0x6E },
unicodeslot=0x1D4F7,
visual="bf",
},
@@ -169576,7 +185190,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL O",
direction="l",
linebreak="al",
- specials={ "font", 0x006F },
+ specials={ "font", 0x6F },
unicodeslot=0x1D4F8,
visual="bf",
},
@@ -169585,7 +185199,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL P",
direction="l",
linebreak="al",
- specials={ "font", 0x0070 },
+ specials={ "font", 0x70 },
unicodeslot=0x1D4F9,
visual="bf",
},
@@ -169594,7 +185208,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL Q",
direction="l",
linebreak="al",
- specials={ "font", 0x0071 },
+ specials={ "font", 0x71 },
unicodeslot=0x1D4FA,
visual="bf",
},
@@ -169603,7 +185217,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL R",
direction="l",
linebreak="al",
- specials={ "font", 0x0072 },
+ specials={ "font", 0x72 },
unicodeslot=0x1D4FB,
visual="bf",
},
@@ -169612,7 +185226,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0073 },
+ specials={ "font", 0x73 },
unicodeslot=0x1D4FC,
visual="bf",
},
@@ -169621,7 +185235,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0074 },
+ specials={ "font", 0x74 },
unicodeslot=0x1D4FD,
visual="bf",
},
@@ -169630,7 +185244,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0075 },
+ specials={ "font", 0x75 },
unicodeslot=0x1D4FE,
visual="bf",
},
@@ -169639,7 +185253,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0076 },
+ specials={ "font", 0x76 },
unicodeslot=0x1D4FF,
visual="bf",
},
@@ -169648,7 +185262,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0077 },
+ specials={ "font", 0x77 },
unicodeslot=0x1D500,
visual="bf",
},
@@ -169657,7 +185271,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0078 },
+ specials={ "font", 0x78 },
unicodeslot=0x1D501,
visual="bf",
},
@@ -169666,7 +185280,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0079 },
+ specials={ "font", 0x79 },
unicodeslot=0x1D502,
visual="bf",
},
@@ -169675,7 +185289,7 @@ characters.data={
description="MATHEMATICAL BOLD SCRIPT SMALL Z",
direction="l",
linebreak="al",
- specials={ "font", 0x007A },
+ specials={ "font", 0x7A },
unicodeslot=0x1D503,
visual="bf",
},
@@ -169684,7 +185298,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR CAPITAL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0041 },
+ specials={ "font", 0x41 },
unicodeslot=0x1D504,
},
[0x1D505]={
@@ -169692,7 +185306,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR CAPITAL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0042 },
+ specials={ "font", 0x42 },
unicodeslot=0x1D505,
},
[0x1D507]={
@@ -169700,7 +185314,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR CAPITAL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0044 },
+ specials={ "font", 0x44 },
unicodeslot=0x1D507,
},
[0x1D508]={
@@ -169708,7 +185322,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR CAPITAL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0045 },
+ specials={ "font", 0x45 },
unicodeslot=0x1D508,
},
[0x1D509]={
@@ -169716,7 +185330,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR CAPITAL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0046 },
+ specials={ "font", 0x46 },
unicodeslot=0x1D509,
},
[0x1D50A]={
@@ -169724,7 +185338,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR CAPITAL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0047 },
+ specials={ "font", 0x47 },
unicodeslot=0x1D50A,
},
[0x1D50D]={
@@ -169732,7 +185346,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR CAPITAL J",
direction="l",
linebreak="al",
- specials={ "font", 0x004A },
+ specials={ "font", 0x4A },
unicodeslot=0x1D50D,
},
[0x1D50E]={
@@ -169740,7 +185354,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR CAPITAL K",
direction="l",
linebreak="al",
- specials={ "font", 0x004B },
+ specials={ "font", 0x4B },
unicodeslot=0x1D50E,
},
[0x1D50F]={
@@ -169748,7 +185362,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR CAPITAL L",
direction="l",
linebreak="al",
- specials={ "font", 0x004C },
+ specials={ "font", 0x4C },
unicodeslot=0x1D50F,
},
[0x1D510]={
@@ -169756,7 +185370,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR CAPITAL M",
direction="l",
linebreak="al",
- specials={ "font", 0x004D },
+ specials={ "font", 0x4D },
unicodeslot=0x1D510,
},
[0x1D511]={
@@ -169764,7 +185378,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR CAPITAL N",
direction="l",
linebreak="al",
- specials={ "font", 0x004E },
+ specials={ "font", 0x4E },
unicodeslot=0x1D511,
},
[0x1D512]={
@@ -169772,7 +185386,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR CAPITAL O",
direction="l",
linebreak="al",
- specials={ "font", 0x004F },
+ specials={ "font", 0x4F },
unicodeslot=0x1D512,
},
[0x1D513]={
@@ -169780,7 +185394,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR CAPITAL P",
direction="l",
linebreak="al",
- specials={ "font", 0x0050 },
+ specials={ "font", 0x50 },
unicodeslot=0x1D513,
},
[0x1D514]={
@@ -169788,7 +185402,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR CAPITAL Q",
direction="l",
linebreak="al",
- specials={ "font", 0x0051 },
+ specials={ "font", 0x51 },
unicodeslot=0x1D514,
},
[0x1D516]={
@@ -169796,7 +185410,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR CAPITAL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0053 },
+ specials={ "font", 0x53 },
unicodeslot=0x1D516,
},
[0x1D517]={
@@ -169804,7 +185418,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR CAPITAL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0054 },
+ specials={ "font", 0x54 },
unicodeslot=0x1D517,
},
[0x1D518]={
@@ -169812,7 +185426,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR CAPITAL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0055 },
+ specials={ "font", 0x55 },
unicodeslot=0x1D518,
},
[0x1D519]={
@@ -169820,7 +185434,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR CAPITAL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0056 },
+ specials={ "font", 0x56 },
unicodeslot=0x1D519,
},
[0x1D51A]={
@@ -169828,7 +185442,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR CAPITAL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0057 },
+ specials={ "font", 0x57 },
unicodeslot=0x1D51A,
},
[0x1D51B]={
@@ -169836,7 +185450,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR CAPITAL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0058 },
+ specials={ "font", 0x58 },
unicodeslot=0x1D51B,
},
[0x1D51C]={
@@ -169844,7 +185458,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR CAPITAL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0059 },
+ specials={ "font", 0x59 },
unicodeslot=0x1D51C,
},
[0x1D51E]={
@@ -169852,7 +185466,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0061 },
+ specials={ "font", 0x61 },
unicodeslot=0x1D51E,
},
[0x1D51F]={
@@ -169860,7 +185474,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0062 },
+ specials={ "font", 0x62 },
unicodeslot=0x1D51F,
},
[0x1D520]={
@@ -169868,7 +185482,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL C",
direction="l",
linebreak="al",
- specials={ "font", 0x0063 },
+ specials={ "font", 0x63 },
unicodeslot=0x1D520,
},
[0x1D521]={
@@ -169876,7 +185490,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0064 },
+ specials={ "font", 0x64 },
unicodeslot=0x1D521,
},
[0x1D522]={
@@ -169884,7 +185498,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0065 },
+ specials={ "font", 0x65 },
unicodeslot=0x1D522,
},
[0x1D523]={
@@ -169892,7 +185506,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0066 },
+ specials={ "font", 0x66 },
unicodeslot=0x1D523,
},
[0x1D524]={
@@ -169900,7 +185514,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0067 },
+ specials={ "font", 0x67 },
unicodeslot=0x1D524,
},
[0x1D525]={
@@ -169908,7 +185522,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL H",
direction="l",
linebreak="al",
- specials={ "font", 0x0068 },
+ specials={ "font", 0x68 },
unicodeslot=0x1D525,
},
[0x1D526]={
@@ -169916,7 +185530,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL I",
direction="l",
linebreak="al",
- specials={ "font", 0x0069 },
+ specials={ "font", 0x69 },
unicodeslot=0x1D526,
},
[0x1D527]={
@@ -169924,7 +185538,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL J",
direction="l",
linebreak="al",
- specials={ "font", 0x006A },
+ specials={ "font", 0x6A },
unicodeslot=0x1D527,
},
[0x1D528]={
@@ -169932,7 +185546,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL K",
direction="l",
linebreak="al",
- specials={ "font", 0x006B },
+ specials={ "font", 0x6B },
unicodeslot=0x1D528,
},
[0x1D529]={
@@ -169940,7 +185554,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL L",
direction="l",
linebreak="al",
- specials={ "font", 0x006C },
+ specials={ "font", 0x6C },
unicodeslot=0x1D529,
},
[0x1D52A]={
@@ -169948,7 +185562,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL M",
direction="l",
linebreak="al",
- specials={ "font", 0x006D },
+ specials={ "font", 0x6D },
unicodeslot=0x1D52A,
},
[0x1D52B]={
@@ -169956,7 +185570,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL N",
direction="l",
linebreak="al",
- specials={ "font", 0x006E },
+ specials={ "font", 0x6E },
unicodeslot=0x1D52B,
},
[0x1D52C]={
@@ -169964,7 +185578,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL O",
direction="l",
linebreak="al",
- specials={ "font", 0x006F },
+ specials={ "font", 0x6F },
unicodeslot=0x1D52C,
},
[0x1D52D]={
@@ -169972,7 +185586,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL P",
direction="l",
linebreak="al",
- specials={ "font", 0x0070 },
+ specials={ "font", 0x70 },
unicodeslot=0x1D52D,
},
[0x1D52E]={
@@ -169980,7 +185594,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL Q",
direction="l",
linebreak="al",
- specials={ "font", 0x0071 },
+ specials={ "font", 0x71 },
unicodeslot=0x1D52E,
},
[0x1D52F]={
@@ -169988,7 +185602,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL R",
direction="l",
linebreak="al",
- specials={ "font", 0x0072 },
+ specials={ "font", 0x72 },
unicodeslot=0x1D52F,
},
[0x1D530]={
@@ -169996,7 +185610,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0073 },
+ specials={ "font", 0x73 },
unicodeslot=0x1D530,
},
[0x1D531]={
@@ -170004,7 +185618,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0074 },
+ specials={ "font", 0x74 },
unicodeslot=0x1D531,
},
[0x1D532]={
@@ -170012,7 +185626,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0075 },
+ specials={ "font", 0x75 },
unicodeslot=0x1D532,
},
[0x1D533]={
@@ -170020,7 +185634,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0076 },
+ specials={ "font", 0x76 },
unicodeslot=0x1D533,
},
[0x1D534]={
@@ -170028,7 +185642,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0077 },
+ specials={ "font", 0x77 },
unicodeslot=0x1D534,
},
[0x1D535]={
@@ -170036,7 +185650,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0078 },
+ specials={ "font", 0x78 },
unicodeslot=0x1D535,
},
[0x1D536]={
@@ -170044,7 +185658,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0079 },
+ specials={ "font", 0x79 },
unicodeslot=0x1D536,
},
[0x1D537]={
@@ -170052,7 +185666,7 @@ characters.data={
description="MATHEMATICAL FRAKTUR SMALL Z",
direction="l",
linebreak="al",
- specials={ "font", 0x007A },
+ specials={ "font", 0x7A },
unicodeslot=0x1D537,
},
[0x1D538]={
@@ -170060,7 +185674,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK CAPITAL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0041 },
+ specials={ "font", 0x41 },
unicodeslot=0x1D538,
},
[0x1D539]={
@@ -170068,7 +185682,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK CAPITAL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0042 },
+ specials={ "font", 0x42 },
unicodeslot=0x1D539,
},
[0x1D53B]={
@@ -170076,7 +185690,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK CAPITAL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0044 },
+ specials={ "font", 0x44 },
unicodeslot=0x1D53B,
},
[0x1D53C]={
@@ -170084,7 +185698,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK CAPITAL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0045 },
+ specials={ "font", 0x45 },
unicodeslot=0x1D53C,
},
[0x1D53D]={
@@ -170092,7 +185706,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK CAPITAL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0046 },
+ specials={ "font", 0x46 },
unicodeslot=0x1D53D,
},
[0x1D53E]={
@@ -170100,7 +185714,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK CAPITAL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0047 },
+ specials={ "font", 0x47 },
unicodeslot=0x1D53E,
},
[0x1D540]={
@@ -170108,7 +185722,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK CAPITAL I",
direction="l",
linebreak="al",
- specials={ "font", 0x0049 },
+ specials={ "font", 0x49 },
unicodeslot=0x1D540,
},
[0x1D541]={
@@ -170116,7 +185730,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK CAPITAL J",
direction="l",
linebreak="al",
- specials={ "font", 0x004A },
+ specials={ "font", 0x4A },
unicodeslot=0x1D541,
},
[0x1D542]={
@@ -170124,7 +185738,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK CAPITAL K",
direction="l",
linebreak="al",
- specials={ "font", 0x004B },
+ specials={ "font", 0x4B },
unicodeslot=0x1D542,
},
[0x1D543]={
@@ -170132,7 +185746,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK CAPITAL L",
direction="l",
linebreak="al",
- specials={ "font", 0x004C },
+ specials={ "font", 0x4C },
unicodeslot=0x1D543,
},
[0x1D544]={
@@ -170140,7 +185754,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK CAPITAL M",
direction="l",
linebreak="al",
- specials={ "font", 0x004D },
+ specials={ "font", 0x4D },
unicodeslot=0x1D544,
},
[0x1D546]={
@@ -170148,7 +185762,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK CAPITAL O",
direction="l",
linebreak="al",
- specials={ "font", 0x004F },
+ specials={ "font", 0x4F },
unicodeslot=0x1D546,
},
[0x1D54A]={
@@ -170156,7 +185770,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK CAPITAL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0053 },
+ specials={ "font", 0x53 },
unicodeslot=0x1D54A,
},
[0x1D54B]={
@@ -170164,7 +185778,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK CAPITAL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0054 },
+ specials={ "font", 0x54 },
unicodeslot=0x1D54B,
},
[0x1D54C]={
@@ -170172,7 +185786,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK CAPITAL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0055 },
+ specials={ "font", 0x55 },
unicodeslot=0x1D54C,
},
[0x1D54D]={
@@ -170180,7 +185794,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK CAPITAL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0056 },
+ specials={ "font", 0x56 },
unicodeslot=0x1D54D,
},
[0x1D54E]={
@@ -170188,7 +185802,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK CAPITAL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0057 },
+ specials={ "font", 0x57 },
unicodeslot=0x1D54E,
},
[0x1D54F]={
@@ -170196,7 +185810,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK CAPITAL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0058 },
+ specials={ "font", 0x58 },
unicodeslot=0x1D54F,
},
[0x1D550]={
@@ -170204,7 +185818,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK CAPITAL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0059 },
+ specials={ "font", 0x59 },
unicodeslot=0x1D550,
},
[0x1D552]={
@@ -170212,7 +185826,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0061 },
+ specials={ "font", 0x61 },
unicodeslot=0x1D552,
},
[0x1D553]={
@@ -170220,7 +185834,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0062 },
+ specials={ "font", 0x62 },
unicodeslot=0x1D553,
},
[0x1D554]={
@@ -170228,7 +185842,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL C",
direction="l",
linebreak="al",
- specials={ "font", 0x0063 },
+ specials={ "font", 0x63 },
unicodeslot=0x1D554,
},
[0x1D555]={
@@ -170236,7 +185850,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0064 },
+ specials={ "font", 0x64 },
unicodeslot=0x1D555,
},
[0x1D556]={
@@ -170244,7 +185858,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0065 },
+ specials={ "font", 0x65 },
unicodeslot=0x1D556,
},
[0x1D557]={
@@ -170252,7 +185866,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0066 },
+ specials={ "font", 0x66 },
unicodeslot=0x1D557,
},
[0x1D558]={
@@ -170260,7 +185874,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0067 },
+ specials={ "font", 0x67 },
unicodeslot=0x1D558,
},
[0x1D559]={
@@ -170268,7 +185882,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL H",
direction="l",
linebreak="al",
- specials={ "font", 0x0068 },
+ specials={ "font", 0x68 },
unicodeslot=0x1D559,
},
[0x1D55A]={
@@ -170276,7 +185890,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL I",
direction="l",
linebreak="al",
- specials={ "font", 0x0069 },
+ specials={ "font", 0x69 },
unicodeslot=0x1D55A,
},
[0x1D55B]={
@@ -170284,7 +185898,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL J",
direction="l",
linebreak="al",
- specials={ "font", 0x006A },
+ specials={ "font", 0x6A },
unicodeslot=0x1D55B,
},
[0x1D55C]={
@@ -170292,7 +185906,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL K",
direction="l",
linebreak="al",
- specials={ "font", 0x006B },
+ specials={ "font", 0x6B },
unicodeslot=0x1D55C,
},
[0x1D55D]={
@@ -170300,7 +185914,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL L",
direction="l",
linebreak="al",
- specials={ "font", 0x006C },
+ specials={ "font", 0x6C },
unicodeslot=0x1D55D,
},
[0x1D55E]={
@@ -170308,7 +185922,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL M",
direction="l",
linebreak="al",
- specials={ "font", 0x006D },
+ specials={ "font", 0x6D },
unicodeslot=0x1D55E,
},
[0x1D55F]={
@@ -170316,7 +185930,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL N",
direction="l",
linebreak="al",
- specials={ "font", 0x006E },
+ specials={ "font", 0x6E },
unicodeslot=0x1D55F,
},
[0x1D560]={
@@ -170324,7 +185938,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL O",
direction="l",
linebreak="al",
- specials={ "font", 0x006F },
+ specials={ "font", 0x6F },
unicodeslot=0x1D560,
},
[0x1D561]={
@@ -170332,7 +185946,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL P",
direction="l",
linebreak="al",
- specials={ "font", 0x0070 },
+ specials={ "font", 0x70 },
unicodeslot=0x1D561,
},
[0x1D562]={
@@ -170340,7 +185954,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL Q",
direction="l",
linebreak="al",
- specials={ "font", 0x0071 },
+ specials={ "font", 0x71 },
unicodeslot=0x1D562,
},
[0x1D563]={
@@ -170348,7 +185962,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL R",
direction="l",
linebreak="al",
- specials={ "font", 0x0072 },
+ specials={ "font", 0x72 },
unicodeslot=0x1D563,
},
[0x1D564]={
@@ -170356,7 +185970,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0073 },
+ specials={ "font", 0x73 },
unicodeslot=0x1D564,
},
[0x1D565]={
@@ -170364,7 +185978,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0074 },
+ specials={ "font", 0x74 },
unicodeslot=0x1D565,
},
[0x1D566]={
@@ -170372,7 +185986,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0075 },
+ specials={ "font", 0x75 },
unicodeslot=0x1D566,
},
[0x1D567]={
@@ -170380,7 +185994,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0076 },
+ specials={ "font", 0x76 },
unicodeslot=0x1D567,
},
[0x1D568]={
@@ -170388,7 +186002,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0077 },
+ specials={ "font", 0x77 },
unicodeslot=0x1D568,
},
[0x1D569]={
@@ -170396,7 +186010,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0078 },
+ specials={ "font", 0x78 },
unicodeslot=0x1D569,
},
[0x1D56A]={
@@ -170404,7 +186018,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0079 },
+ specials={ "font", 0x79 },
unicodeslot=0x1D56A,
},
[0x1D56B]={
@@ -170412,7 +186026,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK SMALL Z",
direction="l",
linebreak="al",
- specials={ "font", 0x007A },
+ specials={ "font", 0x7A },
unicodeslot=0x1D56B,
},
[0x1D56C]={
@@ -170420,7 +186034,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0041 },
+ specials={ "font", 0x41 },
unicodeslot=0x1D56C,
visual="bf",
},
@@ -170429,7 +186043,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0042 },
+ specials={ "font", 0x42 },
unicodeslot=0x1D56D,
visual="bf",
},
@@ -170438,7 +186052,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL C",
direction="l",
linebreak="al",
- specials={ "font", 0x0043 },
+ specials={ "font", 0x43 },
unicodeslot=0x1D56E,
visual="bf",
},
@@ -170447,7 +186061,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0044 },
+ specials={ "font", 0x44 },
unicodeslot=0x1D56F,
visual="bf",
},
@@ -170456,7 +186070,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0045 },
+ specials={ "font", 0x45 },
unicodeslot=0x1D570,
visual="bf",
},
@@ -170465,7 +186079,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0046 },
+ specials={ "font", 0x46 },
unicodeslot=0x1D571,
visual="bf",
},
@@ -170474,7 +186088,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0047 },
+ specials={ "font", 0x47 },
unicodeslot=0x1D572,
visual="bf",
},
@@ -170483,7 +186097,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL H",
direction="l",
linebreak="al",
- specials={ "font", 0x0048 },
+ specials={ "font", 0x48 },
unicodeslot=0x1D573,
visual="bf",
},
@@ -170492,7 +186106,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL I",
direction="l",
linebreak="al",
- specials={ "font", 0x0049 },
+ specials={ "font", 0x49 },
unicodeslot=0x1D574,
visual="bf",
},
@@ -170501,7 +186115,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL J",
direction="l",
linebreak="al",
- specials={ "font", 0x004A },
+ specials={ "font", 0x4A },
unicodeslot=0x1D575,
visual="bf",
},
@@ -170510,7 +186124,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL K",
direction="l",
linebreak="al",
- specials={ "font", 0x004B },
+ specials={ "font", 0x4B },
unicodeslot=0x1D576,
visual="bf",
},
@@ -170519,7 +186133,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL L",
direction="l",
linebreak="al",
- specials={ "font", 0x004C },
+ specials={ "font", 0x4C },
unicodeslot=0x1D577,
visual="bf",
},
@@ -170528,7 +186142,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL M",
direction="l",
linebreak="al",
- specials={ "font", 0x004D },
+ specials={ "font", 0x4D },
unicodeslot=0x1D578,
visual="bf",
},
@@ -170537,7 +186151,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL N",
direction="l",
linebreak="al",
- specials={ "font", 0x004E },
+ specials={ "font", 0x4E },
unicodeslot=0x1D579,
visual="bf",
},
@@ -170546,7 +186160,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL O",
direction="l",
linebreak="al",
- specials={ "font", 0x004F },
+ specials={ "font", 0x4F },
unicodeslot=0x1D57A,
visual="bf",
},
@@ -170555,7 +186169,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL P",
direction="l",
linebreak="al",
- specials={ "font", 0x0050 },
+ specials={ "font", 0x50 },
unicodeslot=0x1D57B,
visual="bf",
},
@@ -170564,7 +186178,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL Q",
direction="l",
linebreak="al",
- specials={ "font", 0x0051 },
+ specials={ "font", 0x51 },
unicodeslot=0x1D57C,
visual="bf",
},
@@ -170573,7 +186187,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL R",
direction="l",
linebreak="al",
- specials={ "font", 0x0052 },
+ specials={ "font", 0x52 },
unicodeslot=0x1D57D,
visual="bf",
},
@@ -170582,7 +186196,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0053 },
+ specials={ "font", 0x53 },
unicodeslot=0x1D57E,
visual="bf",
},
@@ -170591,7 +186205,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0054 },
+ specials={ "font", 0x54 },
unicodeslot=0x1D57F,
visual="bf",
},
@@ -170600,7 +186214,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0055 },
+ specials={ "font", 0x55 },
unicodeslot=0x1D580,
visual="bf",
},
@@ -170609,7 +186223,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0056 },
+ specials={ "font", 0x56 },
unicodeslot=0x1D581,
visual="bf",
},
@@ -170618,7 +186232,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0057 },
+ specials={ "font", 0x57 },
unicodeslot=0x1D582,
visual="bf",
},
@@ -170627,7 +186241,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0058 },
+ specials={ "font", 0x58 },
unicodeslot=0x1D583,
visual="bf",
},
@@ -170636,7 +186250,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0059 },
+ specials={ "font", 0x59 },
unicodeslot=0x1D584,
visual="bf",
},
@@ -170645,7 +186259,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR CAPITAL Z",
direction="l",
linebreak="al",
- specials={ "font", 0x005A },
+ specials={ "font", 0x5A },
unicodeslot=0x1D585,
visual="bf",
},
@@ -170654,7 +186268,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0061 },
+ specials={ "font", 0x61 },
unicodeslot=0x1D586,
visual="bf",
},
@@ -170663,7 +186277,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0062 },
+ specials={ "font", 0x62 },
unicodeslot=0x1D587,
visual="bf",
},
@@ -170672,7 +186286,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL C",
direction="l",
linebreak="al",
- specials={ "font", 0x0063 },
+ specials={ "font", 0x63 },
unicodeslot=0x1D588,
visual="bf",
},
@@ -170681,7 +186295,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0064 },
+ specials={ "font", 0x64 },
unicodeslot=0x1D589,
visual="bf",
},
@@ -170690,7 +186304,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0065 },
+ specials={ "font", 0x65 },
unicodeslot=0x1D58A,
visual="bf",
},
@@ -170699,7 +186313,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0066 },
+ specials={ "font", 0x66 },
unicodeslot=0x1D58B,
visual="bf",
},
@@ -170708,7 +186322,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0067 },
+ specials={ "font", 0x67 },
unicodeslot=0x1D58C,
visual="bf",
},
@@ -170717,7 +186331,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL H",
direction="l",
linebreak="al",
- specials={ "font", 0x0068 },
+ specials={ "font", 0x68 },
unicodeslot=0x1D58D,
visual="bf",
},
@@ -170726,7 +186340,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL I",
direction="l",
linebreak="al",
- specials={ "font", 0x0069 },
+ specials={ "font", 0x69 },
unicodeslot=0x1D58E,
visual="bf",
},
@@ -170735,7 +186349,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL J",
direction="l",
linebreak="al",
- specials={ "font", 0x006A },
+ specials={ "font", 0x6A },
unicodeslot=0x1D58F,
visual="bf",
},
@@ -170744,7 +186358,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL K",
direction="l",
linebreak="al",
- specials={ "font", 0x006B },
+ specials={ "font", 0x6B },
unicodeslot=0x1D590,
visual="bf",
},
@@ -170753,7 +186367,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL L",
direction="l",
linebreak="al",
- specials={ "font", 0x006C },
+ specials={ "font", 0x6C },
unicodeslot=0x1D591,
visual="bf",
},
@@ -170762,7 +186376,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL M",
direction="l",
linebreak="al",
- specials={ "font", 0x006D },
+ specials={ "font", 0x6D },
unicodeslot=0x1D592,
visual="bf",
},
@@ -170771,7 +186385,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL N",
direction="l",
linebreak="al",
- specials={ "font", 0x006E },
+ specials={ "font", 0x6E },
unicodeslot=0x1D593,
visual="bf",
},
@@ -170780,7 +186394,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL O",
direction="l",
linebreak="al",
- specials={ "font", 0x006F },
+ specials={ "font", 0x6F },
unicodeslot=0x1D594,
visual="bf",
},
@@ -170789,7 +186403,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL P",
direction="l",
linebreak="al",
- specials={ "font", 0x0070 },
+ specials={ "font", 0x70 },
unicodeslot=0x1D595,
visual="bf",
},
@@ -170798,7 +186412,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL Q",
direction="l",
linebreak="al",
- specials={ "font", 0x0071 },
+ specials={ "font", 0x71 },
unicodeslot=0x1D596,
visual="bf",
},
@@ -170807,7 +186421,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL R",
direction="l",
linebreak="al",
- specials={ "font", 0x0072 },
+ specials={ "font", 0x72 },
unicodeslot=0x1D597,
visual="bf",
},
@@ -170816,7 +186430,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0073 },
+ specials={ "font", 0x73 },
unicodeslot=0x1D598,
visual="bf",
},
@@ -170825,7 +186439,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0074 },
+ specials={ "font", 0x74 },
unicodeslot=0x1D599,
visual="bf",
},
@@ -170834,7 +186448,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0075 },
+ specials={ "font", 0x75 },
unicodeslot=0x1D59A,
visual="bf",
},
@@ -170843,7 +186457,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0076 },
+ specials={ "font", 0x76 },
unicodeslot=0x1D59B,
visual="bf",
},
@@ -170852,7 +186466,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0077 },
+ specials={ "font", 0x77 },
unicodeslot=0x1D59C,
visual="bf",
},
@@ -170861,7 +186475,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0078 },
+ specials={ "font", 0x78 },
unicodeslot=0x1D59D,
visual="bf",
},
@@ -170870,7 +186484,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0079 },
+ specials={ "font", 0x79 },
unicodeslot=0x1D59E,
visual="bf",
},
@@ -170879,7 +186493,7 @@ characters.data={
description="MATHEMATICAL BOLD FRAKTUR SMALL Z",
direction="l",
linebreak="al",
- specials={ "font", 0x007A },
+ specials={ "font", 0x7A },
unicodeslot=0x1D59F,
visual="bf",
},
@@ -170888,7 +186502,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0041 },
+ specials={ "font", 0x41 },
unicodeslot=0x1D5A0,
},
[0x1D5A1]={
@@ -170896,7 +186510,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0042 },
+ specials={ "font", 0x42 },
unicodeslot=0x1D5A1,
},
[0x1D5A2]={
@@ -170904,7 +186518,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL C",
direction="l",
linebreak="al",
- specials={ "font", 0x0043 },
+ specials={ "font", 0x43 },
unicodeslot=0x1D5A2,
},
[0x1D5A3]={
@@ -170912,7 +186526,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0044 },
+ specials={ "font", 0x44 },
unicodeslot=0x1D5A3,
},
[0x1D5A4]={
@@ -170920,7 +186534,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0045 },
+ specials={ "font", 0x45 },
unicodeslot=0x1D5A4,
},
[0x1D5A5]={
@@ -170928,7 +186542,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0046 },
+ specials={ "font", 0x46 },
unicodeslot=0x1D5A5,
},
[0x1D5A6]={
@@ -170936,7 +186550,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0047 },
+ specials={ "font", 0x47 },
unicodeslot=0x1D5A6,
},
[0x1D5A7]={
@@ -170944,7 +186558,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL H",
direction="l",
linebreak="al",
- specials={ "font", 0x0048 },
+ specials={ "font", 0x48 },
unicodeslot=0x1D5A7,
},
[0x1D5A8]={
@@ -170952,7 +186566,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL I",
direction="l",
linebreak="al",
- specials={ "font", 0x0049 },
+ specials={ "font", 0x49 },
unicodeslot=0x1D5A8,
},
[0x1D5A9]={
@@ -170960,7 +186574,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL J",
direction="l",
linebreak="al",
- specials={ "font", 0x004A },
+ specials={ "font", 0x4A },
unicodeslot=0x1D5A9,
},
[0x1D5AA]={
@@ -170968,7 +186582,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL K",
direction="l",
linebreak="al",
- specials={ "font", 0x004B },
+ specials={ "font", 0x4B },
unicodeslot=0x1D5AA,
},
[0x1D5AB]={
@@ -170976,7 +186590,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL L",
direction="l",
linebreak="al",
- specials={ "font", 0x004C },
+ specials={ "font", 0x4C },
unicodeslot=0x1D5AB,
},
[0x1D5AC]={
@@ -170984,7 +186598,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL M",
direction="l",
linebreak="al",
- specials={ "font", 0x004D },
+ specials={ "font", 0x4D },
unicodeslot=0x1D5AC,
},
[0x1D5AD]={
@@ -170992,7 +186606,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL N",
direction="l",
linebreak="al",
- specials={ "font", 0x004E },
+ specials={ "font", 0x4E },
unicodeslot=0x1D5AD,
},
[0x1D5AE]={
@@ -171000,7 +186614,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL O",
direction="l",
linebreak="al",
- specials={ "font", 0x004F },
+ specials={ "font", 0x4F },
unicodeslot=0x1D5AE,
},
[0x1D5AF]={
@@ -171008,7 +186622,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL P",
direction="l",
linebreak="al",
- specials={ "font", 0x0050 },
+ specials={ "font", 0x50 },
unicodeslot=0x1D5AF,
},
[0x1D5B0]={
@@ -171016,7 +186630,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL Q",
direction="l",
linebreak="al",
- specials={ "font", 0x0051 },
+ specials={ "font", 0x51 },
unicodeslot=0x1D5B0,
},
[0x1D5B1]={
@@ -171024,7 +186638,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL R",
direction="l",
linebreak="al",
- specials={ "font", 0x0052 },
+ specials={ "font", 0x52 },
unicodeslot=0x1D5B1,
},
[0x1D5B2]={
@@ -171032,7 +186646,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0053 },
+ specials={ "font", 0x53 },
unicodeslot=0x1D5B2,
},
[0x1D5B3]={
@@ -171040,7 +186654,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0054 },
+ specials={ "font", 0x54 },
unicodeslot=0x1D5B3,
},
[0x1D5B4]={
@@ -171048,7 +186662,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0055 },
+ specials={ "font", 0x55 },
unicodeslot=0x1D5B4,
},
[0x1D5B5]={
@@ -171056,7 +186670,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0056 },
+ specials={ "font", 0x56 },
unicodeslot=0x1D5B5,
},
[0x1D5B6]={
@@ -171064,7 +186678,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0057 },
+ specials={ "font", 0x57 },
unicodeslot=0x1D5B6,
},
[0x1D5B7]={
@@ -171072,7 +186686,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0058 },
+ specials={ "font", 0x58 },
unicodeslot=0x1D5B7,
},
[0x1D5B8]={
@@ -171080,7 +186694,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0059 },
+ specials={ "font", 0x59 },
unicodeslot=0x1D5B8,
},
[0x1D5B9]={
@@ -171088,7 +186702,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF CAPITAL Z",
direction="l",
linebreak="al",
- specials={ "font", 0x005A },
+ specials={ "font", 0x5A },
unicodeslot=0x1D5B9,
},
[0x1D5BA]={
@@ -171096,7 +186710,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0061 },
+ specials={ "font", 0x61 },
unicodeslot=0x1D5BA,
},
[0x1D5BB]={
@@ -171104,7 +186718,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0062 },
+ specials={ "font", 0x62 },
unicodeslot=0x1D5BB,
},
[0x1D5BC]={
@@ -171112,7 +186726,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL C",
direction="l",
linebreak="al",
- specials={ "font", 0x0063 },
+ specials={ "font", 0x63 },
unicodeslot=0x1D5BC,
},
[0x1D5BD]={
@@ -171120,7 +186734,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0064 },
+ specials={ "font", 0x64 },
unicodeslot=0x1D5BD,
},
[0x1D5BE]={
@@ -171128,7 +186742,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0065 },
+ specials={ "font", 0x65 },
unicodeslot=0x1D5BE,
},
[0x1D5BF]={
@@ -171136,7 +186750,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0066 },
+ specials={ "font", 0x66 },
unicodeslot=0x1D5BF,
},
[0x1D5C0]={
@@ -171144,7 +186758,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0067 },
+ specials={ "font", 0x67 },
unicodeslot=0x1D5C0,
},
[0x1D5C1]={
@@ -171152,7 +186766,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL H",
direction="l",
linebreak="al",
- specials={ "font", 0x0068 },
+ specials={ "font", 0x68 },
unicodeslot=0x1D5C1,
},
[0x1D5C2]={
@@ -171160,7 +186774,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL I",
direction="l",
linebreak="al",
- specials={ "font", 0x0069 },
+ specials={ "font", 0x69 },
unicodeslot=0x1D5C2,
},
[0x1D5C3]={
@@ -171168,7 +186782,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL J",
direction="l",
linebreak="al",
- specials={ "font", 0x006A },
+ specials={ "font", 0x6A },
unicodeslot=0x1D5C3,
},
[0x1D5C4]={
@@ -171176,7 +186790,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL K",
direction="l",
linebreak="al",
- specials={ "font", 0x006B },
+ specials={ "font", 0x6B },
unicodeslot=0x1D5C4,
},
[0x1D5C5]={
@@ -171184,7 +186798,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL L",
direction="l",
linebreak="al",
- specials={ "font", 0x006C },
+ specials={ "font", 0x6C },
unicodeslot=0x1D5C5,
},
[0x1D5C6]={
@@ -171192,7 +186806,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL M",
direction="l",
linebreak="al",
- specials={ "font", 0x006D },
+ specials={ "font", 0x6D },
unicodeslot=0x1D5C6,
},
[0x1D5C7]={
@@ -171200,7 +186814,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL N",
direction="l",
linebreak="al",
- specials={ "font", 0x006E },
+ specials={ "font", 0x6E },
unicodeslot=0x1D5C7,
},
[0x1D5C8]={
@@ -171208,7 +186822,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL O",
direction="l",
linebreak="al",
- specials={ "font", 0x006F },
+ specials={ "font", 0x6F },
unicodeslot=0x1D5C8,
},
[0x1D5C9]={
@@ -171216,7 +186830,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL P",
direction="l",
linebreak="al",
- specials={ "font", 0x0070 },
+ specials={ "font", 0x70 },
unicodeslot=0x1D5C9,
},
[0x1D5CA]={
@@ -171224,7 +186838,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL Q",
direction="l",
linebreak="al",
- specials={ "font", 0x0071 },
+ specials={ "font", 0x71 },
unicodeslot=0x1D5CA,
},
[0x1D5CB]={
@@ -171232,7 +186846,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL R",
direction="l",
linebreak="al",
- specials={ "font", 0x0072 },
+ specials={ "font", 0x72 },
unicodeslot=0x1D5CB,
},
[0x1D5CC]={
@@ -171240,7 +186854,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0073 },
+ specials={ "font", 0x73 },
unicodeslot=0x1D5CC,
},
[0x1D5CD]={
@@ -171248,7 +186862,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0074 },
+ specials={ "font", 0x74 },
unicodeslot=0x1D5CD,
},
[0x1D5CE]={
@@ -171256,7 +186870,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0075 },
+ specials={ "font", 0x75 },
unicodeslot=0x1D5CE,
},
[0x1D5CF]={
@@ -171264,7 +186878,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0076 },
+ specials={ "font", 0x76 },
unicodeslot=0x1D5CF,
},
[0x1D5D0]={
@@ -171272,7 +186886,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0077 },
+ specials={ "font", 0x77 },
unicodeslot=0x1D5D0,
},
[0x1D5D1]={
@@ -171280,7 +186894,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0078 },
+ specials={ "font", 0x78 },
unicodeslot=0x1D5D1,
},
[0x1D5D2]={
@@ -171288,7 +186902,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0079 },
+ specials={ "font", 0x79 },
unicodeslot=0x1D5D2,
},
[0x1D5D3]={
@@ -171296,7 +186910,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF SMALL Z",
direction="l",
linebreak="al",
- specials={ "font", 0x007A },
+ specials={ "font", 0x7A },
unicodeslot=0x1D5D3,
},
[0x1D5D4]={
@@ -171304,7 +186918,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0041 },
+ specials={ "font", 0x41 },
unicodeslot=0x1D5D4,
visual="bf",
},
@@ -171313,7 +186927,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0042 },
+ specials={ "font", 0x42 },
unicodeslot=0x1D5D5,
visual="bf",
},
@@ -171322,7 +186936,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL C",
direction="l",
linebreak="al",
- specials={ "font", 0x0043 },
+ specials={ "font", 0x43 },
unicodeslot=0x1D5D6,
visual="bf",
},
@@ -171331,7 +186945,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0044 },
+ specials={ "font", 0x44 },
unicodeslot=0x1D5D7,
visual="bf",
},
@@ -171340,7 +186954,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0045 },
+ specials={ "font", 0x45 },
unicodeslot=0x1D5D8,
visual="bf",
},
@@ -171349,7 +186963,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0046 },
+ specials={ "font", 0x46 },
unicodeslot=0x1D5D9,
visual="bf",
},
@@ -171358,7 +186972,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0047 },
+ specials={ "font", 0x47 },
unicodeslot=0x1D5DA,
visual="bf",
},
@@ -171367,7 +186981,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL H",
direction="l",
linebreak="al",
- specials={ "font", 0x0048 },
+ specials={ "font", 0x48 },
unicodeslot=0x1D5DB,
visual="bf",
},
@@ -171376,7 +186990,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL I",
direction="l",
linebreak="al",
- specials={ "font", 0x0049 },
+ specials={ "font", 0x49 },
unicodeslot=0x1D5DC,
visual="bf",
},
@@ -171385,7 +186999,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL J",
direction="l",
linebreak="al",
- specials={ "font", 0x004A },
+ specials={ "font", 0x4A },
unicodeslot=0x1D5DD,
visual="bf",
},
@@ -171394,7 +187008,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL K",
direction="l",
linebreak="al",
- specials={ "font", 0x004B },
+ specials={ "font", 0x4B },
unicodeslot=0x1D5DE,
visual="bf",
},
@@ -171403,7 +187017,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL L",
direction="l",
linebreak="al",
- specials={ "font", 0x004C },
+ specials={ "font", 0x4C },
unicodeslot=0x1D5DF,
visual="bf",
},
@@ -171412,7 +187026,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL M",
direction="l",
linebreak="al",
- specials={ "font", 0x004D },
+ specials={ "font", 0x4D },
unicodeslot=0x1D5E0,
visual="bf",
},
@@ -171421,7 +187035,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL N",
direction="l",
linebreak="al",
- specials={ "font", 0x004E },
+ specials={ "font", 0x4E },
unicodeslot=0x1D5E1,
visual="bf",
},
@@ -171430,7 +187044,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL O",
direction="l",
linebreak="al",
- specials={ "font", 0x004F },
+ specials={ "font", 0x4F },
unicodeslot=0x1D5E2,
visual="bf",
},
@@ -171439,7 +187053,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL P",
direction="l",
linebreak="al",
- specials={ "font", 0x0050 },
+ specials={ "font", 0x50 },
unicodeslot=0x1D5E3,
visual="bf",
},
@@ -171448,7 +187062,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL Q",
direction="l",
linebreak="al",
- specials={ "font", 0x0051 },
+ specials={ "font", 0x51 },
unicodeslot=0x1D5E4,
visual="bf",
},
@@ -171457,7 +187071,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL R",
direction="l",
linebreak="al",
- specials={ "font", 0x0052 },
+ specials={ "font", 0x52 },
unicodeslot=0x1D5E5,
visual="bf",
},
@@ -171466,7 +187080,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0053 },
+ specials={ "font", 0x53 },
unicodeslot=0x1D5E6,
visual="bf",
},
@@ -171475,7 +187089,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0054 },
+ specials={ "font", 0x54 },
unicodeslot=0x1D5E7,
visual="bf",
},
@@ -171484,7 +187098,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0055 },
+ specials={ "font", 0x55 },
unicodeslot=0x1D5E8,
visual="bf",
},
@@ -171493,7 +187107,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0056 },
+ specials={ "font", 0x56 },
unicodeslot=0x1D5E9,
visual="bf",
},
@@ -171502,7 +187116,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0057 },
+ specials={ "font", 0x57 },
unicodeslot=0x1D5EA,
visual="bf",
},
@@ -171511,7 +187125,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0058 },
+ specials={ "font", 0x58 },
unicodeslot=0x1D5EB,
visual="bf",
},
@@ -171520,7 +187134,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0059 },
+ specials={ "font", 0x59 },
unicodeslot=0x1D5EC,
visual="bf",
},
@@ -171529,7 +187143,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL Z",
direction="l",
linebreak="al",
- specials={ "font", 0x005A },
+ specials={ "font", 0x5A },
unicodeslot=0x1D5ED,
visual="bf",
},
@@ -171538,7 +187152,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0061 },
+ specials={ "font", 0x61 },
unicodeslot=0x1D5EE,
visual="bf",
},
@@ -171547,7 +187161,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0062 },
+ specials={ "font", 0x62 },
unicodeslot=0x1D5EF,
visual="bf",
},
@@ -171556,7 +187170,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL C",
direction="l",
linebreak="al",
- specials={ "font", 0x0063 },
+ specials={ "font", 0x63 },
unicodeslot=0x1D5F0,
visual="bf",
},
@@ -171565,7 +187179,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0064 },
+ specials={ "font", 0x64 },
unicodeslot=0x1D5F1,
visual="bf",
},
@@ -171574,7 +187188,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0065 },
+ specials={ "font", 0x65 },
unicodeslot=0x1D5F2,
visual="bf",
},
@@ -171583,7 +187197,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0066 },
+ specials={ "font", 0x66 },
unicodeslot=0x1D5F3,
visual="bf",
},
@@ -171592,7 +187206,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0067 },
+ specials={ "font", 0x67 },
unicodeslot=0x1D5F4,
visual="bf",
},
@@ -171601,7 +187215,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL H",
direction="l",
linebreak="al",
- specials={ "font", 0x0068 },
+ specials={ "font", 0x68 },
unicodeslot=0x1D5F5,
visual="bf",
},
@@ -171610,7 +187224,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL I",
direction="l",
linebreak="al",
- specials={ "font", 0x0069 },
+ specials={ "font", 0x69 },
unicodeslot=0x1D5F6,
visual="bf",
},
@@ -171619,7 +187233,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL J",
direction="l",
linebreak="al",
- specials={ "font", 0x006A },
+ specials={ "font", 0x6A },
unicodeslot=0x1D5F7,
visual="bf",
},
@@ -171628,7 +187242,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL K",
direction="l",
linebreak="al",
- specials={ "font", 0x006B },
+ specials={ "font", 0x6B },
unicodeslot=0x1D5F8,
visual="bf",
},
@@ -171637,7 +187251,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL L",
direction="l",
linebreak="al",
- specials={ "font", 0x006C },
+ specials={ "font", 0x6C },
unicodeslot=0x1D5F9,
visual="bf",
},
@@ -171646,7 +187260,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL M",
direction="l",
linebreak="al",
- specials={ "font", 0x006D },
+ specials={ "font", 0x6D },
unicodeslot=0x1D5FA,
visual="bf",
},
@@ -171655,7 +187269,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL N",
direction="l",
linebreak="al",
- specials={ "font", 0x006E },
+ specials={ "font", 0x6E },
unicodeslot=0x1D5FB,
visual="bf",
},
@@ -171664,7 +187278,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL O",
direction="l",
linebreak="al",
- specials={ "font", 0x006F },
+ specials={ "font", 0x6F },
unicodeslot=0x1D5FC,
visual="bf",
},
@@ -171673,7 +187287,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL P",
direction="l",
linebreak="al",
- specials={ "font", 0x0070 },
+ specials={ "font", 0x70 },
unicodeslot=0x1D5FD,
visual="bf",
},
@@ -171682,7 +187296,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL Q",
direction="l",
linebreak="al",
- specials={ "font", 0x0071 },
+ specials={ "font", 0x71 },
unicodeslot=0x1D5FE,
visual="bf",
},
@@ -171691,7 +187305,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL R",
direction="l",
linebreak="al",
- specials={ "font", 0x0072 },
+ specials={ "font", 0x72 },
unicodeslot=0x1D5FF,
visual="bf",
},
@@ -171700,7 +187314,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0073 },
+ specials={ "font", 0x73 },
unicodeslot=0x1D600,
visual="bf",
},
@@ -171709,7 +187323,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0074 },
+ specials={ "font", 0x74 },
unicodeslot=0x1D601,
visual="bf",
},
@@ -171718,7 +187332,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0075 },
+ specials={ "font", 0x75 },
unicodeslot=0x1D602,
visual="bf",
},
@@ -171727,7 +187341,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0076 },
+ specials={ "font", 0x76 },
unicodeslot=0x1D603,
visual="bf",
},
@@ -171736,7 +187350,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0077 },
+ specials={ "font", 0x77 },
unicodeslot=0x1D604,
visual="bf",
},
@@ -171745,7 +187359,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0078 },
+ specials={ "font", 0x78 },
unicodeslot=0x1D605,
visual="bf",
},
@@ -171754,7 +187368,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0079 },
+ specials={ "font", 0x79 },
unicodeslot=0x1D606,
visual="bf",
},
@@ -171763,7 +187377,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL Z",
direction="l",
linebreak="al",
- specials={ "font", 0x007A },
+ specials={ "font", 0x7A },
unicodeslot=0x1D607,
visual="bf",
},
@@ -171772,7 +187386,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0041 },
+ specials={ "font", 0x41 },
unicodeslot=0x1D608,
visual="it",
},
@@ -171781,7 +187395,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0042 },
+ specials={ "font", 0x42 },
unicodeslot=0x1D609,
visual="it",
},
@@ -171790,7 +187404,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL C",
direction="l",
linebreak="al",
- specials={ "font", 0x0043 },
+ specials={ "font", 0x43 },
unicodeslot=0x1D60A,
visual="it",
},
@@ -171799,7 +187413,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0044 },
+ specials={ "font", 0x44 },
unicodeslot=0x1D60B,
visual="it",
},
@@ -171808,7 +187422,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0045 },
+ specials={ "font", 0x45 },
unicodeslot=0x1D60C,
visual="it",
},
@@ -171817,7 +187431,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0046 },
+ specials={ "font", 0x46 },
unicodeslot=0x1D60D,
visual="it",
},
@@ -171826,7 +187440,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0047 },
+ specials={ "font", 0x47 },
unicodeslot=0x1D60E,
visual="it",
},
@@ -171835,7 +187449,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL H",
direction="l",
linebreak="al",
- specials={ "font", 0x0048 },
+ specials={ "font", 0x48 },
unicodeslot=0x1D60F,
visual="it",
},
@@ -171844,7 +187458,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL I",
direction="l",
linebreak="al",
- specials={ "font", 0x0049 },
+ specials={ "font", 0x49 },
unicodeslot=0x1D610,
visual="it",
},
@@ -171853,7 +187467,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL J",
direction="l",
linebreak="al",
- specials={ "font", 0x004A },
+ specials={ "font", 0x4A },
unicodeslot=0x1D611,
visual="it",
},
@@ -171862,7 +187476,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL K",
direction="l",
linebreak="al",
- specials={ "font", 0x004B },
+ specials={ "font", 0x4B },
unicodeslot=0x1D612,
visual="it",
},
@@ -171871,7 +187485,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL L",
direction="l",
linebreak="al",
- specials={ "font", 0x004C },
+ specials={ "font", 0x4C },
unicodeslot=0x1D613,
visual="it",
},
@@ -171880,7 +187494,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL M",
direction="l",
linebreak="al",
- specials={ "font", 0x004D },
+ specials={ "font", 0x4D },
unicodeslot=0x1D614,
visual="it",
},
@@ -171889,7 +187503,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL N",
direction="l",
linebreak="al",
- specials={ "font", 0x004E },
+ specials={ "font", 0x4E },
unicodeslot=0x1D615,
visual="it",
},
@@ -171898,7 +187512,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL O",
direction="l",
linebreak="al",
- specials={ "font", 0x004F },
+ specials={ "font", 0x4F },
unicodeslot=0x1D616,
visual="it",
},
@@ -171907,7 +187521,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL P",
direction="l",
linebreak="al",
- specials={ "font", 0x0050 },
+ specials={ "font", 0x50 },
unicodeslot=0x1D617,
visual="it",
},
@@ -171916,7 +187530,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q",
direction="l",
linebreak="al",
- specials={ "font", 0x0051 },
+ specials={ "font", 0x51 },
unicodeslot=0x1D618,
visual="it",
},
@@ -171925,7 +187539,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL R",
direction="l",
linebreak="al",
- specials={ "font", 0x0052 },
+ specials={ "font", 0x52 },
unicodeslot=0x1D619,
visual="it",
},
@@ -171934,7 +187548,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0053 },
+ specials={ "font", 0x53 },
unicodeslot=0x1D61A,
visual="it",
},
@@ -171943,7 +187557,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0054 },
+ specials={ "font", 0x54 },
unicodeslot=0x1D61B,
visual="it",
},
@@ -171952,7 +187566,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0055 },
+ specials={ "font", 0x55 },
unicodeslot=0x1D61C,
visual="it",
},
@@ -171961,7 +187575,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0056 },
+ specials={ "font", 0x56 },
unicodeslot=0x1D61D,
visual="it",
},
@@ -171970,7 +187584,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0057 },
+ specials={ "font", 0x57 },
unicodeslot=0x1D61E,
visual="it",
},
@@ -171979,7 +187593,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0058 },
+ specials={ "font", 0x58 },
unicodeslot=0x1D61F,
visual="it",
},
@@ -171988,7 +187602,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0059 },
+ specials={ "font", 0x59 },
unicodeslot=0x1D620,
visual="it",
},
@@ -171997,7 +187611,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z",
direction="l",
linebreak="al",
- specials={ "font", 0x005A },
+ specials={ "font", 0x5A },
unicodeslot=0x1D621,
visual="it",
},
@@ -172006,7 +187620,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0061 },
+ specials={ "font", 0x61 },
unicodeslot=0x1D622,
visual="it",
},
@@ -172015,7 +187629,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0062 },
+ specials={ "font", 0x62 },
unicodeslot=0x1D623,
visual="it",
},
@@ -172024,7 +187638,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL C",
direction="l",
linebreak="al",
- specials={ "font", 0x0063 },
+ specials={ "font", 0x63 },
unicodeslot=0x1D624,
visual="it",
},
@@ -172033,7 +187647,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0064 },
+ specials={ "font", 0x64 },
unicodeslot=0x1D625,
visual="it",
},
@@ -172042,7 +187656,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0065 },
+ specials={ "font", 0x65 },
unicodeslot=0x1D626,
visual="it",
},
@@ -172051,7 +187665,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0066 },
+ specials={ "font", 0x66 },
unicodeslot=0x1D627,
visual="it",
},
@@ -172060,7 +187674,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0067 },
+ specials={ "font", 0x67 },
unicodeslot=0x1D628,
visual="it",
},
@@ -172069,7 +187683,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL H",
direction="l",
linebreak="al",
- specials={ "font", 0x0068 },
+ specials={ "font", 0x68 },
unicodeslot=0x1D629,
visual="it",
},
@@ -172078,7 +187692,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL I",
direction="l",
linebreak="al",
- specials={ "font", 0x0069 },
+ specials={ "font", 0x69 },
unicodeslot=0x1D62A,
visual="it",
},
@@ -172087,7 +187701,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL J",
direction="l",
linebreak="al",
- specials={ "font", 0x006A },
+ specials={ "font", 0x6A },
unicodeslot=0x1D62B,
visual="it",
},
@@ -172096,7 +187710,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL K",
direction="l",
linebreak="al",
- specials={ "font", 0x006B },
+ specials={ "font", 0x6B },
unicodeslot=0x1D62C,
visual="it",
},
@@ -172105,7 +187719,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL L",
direction="l",
linebreak="al",
- specials={ "font", 0x006C },
+ specials={ "font", 0x6C },
unicodeslot=0x1D62D,
visual="it",
},
@@ -172114,7 +187728,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL M",
direction="l",
linebreak="al",
- specials={ "font", 0x006D },
+ specials={ "font", 0x6D },
unicodeslot=0x1D62E,
visual="it",
},
@@ -172123,7 +187737,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL N",
direction="l",
linebreak="al",
- specials={ "font", 0x006E },
+ specials={ "font", 0x6E },
unicodeslot=0x1D62F,
visual="it",
},
@@ -172132,7 +187746,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL O",
direction="l",
linebreak="al",
- specials={ "font", 0x006F },
+ specials={ "font", 0x6F },
unicodeslot=0x1D630,
visual="it",
},
@@ -172141,7 +187755,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL P",
direction="l",
linebreak="al",
- specials={ "font", 0x0070 },
+ specials={ "font", 0x70 },
unicodeslot=0x1D631,
visual="it",
},
@@ -172150,7 +187764,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL Q",
direction="l",
linebreak="al",
- specials={ "font", 0x0071 },
+ specials={ "font", 0x71 },
unicodeslot=0x1D632,
visual="it",
},
@@ -172159,7 +187773,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL R",
direction="l",
linebreak="al",
- specials={ "font", 0x0072 },
+ specials={ "font", 0x72 },
unicodeslot=0x1D633,
visual="it",
},
@@ -172168,7 +187782,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0073 },
+ specials={ "font", 0x73 },
unicodeslot=0x1D634,
visual="it",
},
@@ -172177,7 +187791,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0074 },
+ specials={ "font", 0x74 },
unicodeslot=0x1D635,
visual="it",
},
@@ -172186,7 +187800,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0075 },
+ specials={ "font", 0x75 },
unicodeslot=0x1D636,
visual="it",
},
@@ -172195,7 +187809,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0076 },
+ specials={ "font", 0x76 },
unicodeslot=0x1D637,
visual="it",
},
@@ -172204,7 +187818,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0077 },
+ specials={ "font", 0x77 },
unicodeslot=0x1D638,
visual="it",
},
@@ -172213,7 +187827,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0078 },
+ specials={ "font", 0x78 },
unicodeslot=0x1D639,
visual="it",
},
@@ -172222,7 +187836,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0079 },
+ specials={ "font", 0x79 },
unicodeslot=0x1D63A,
visual="it",
},
@@ -172231,7 +187845,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF ITALIC SMALL Z",
direction="l",
linebreak="al",
- specials={ "font", 0x007A },
+ specials={ "font", 0x7A },
unicodeslot=0x1D63B,
visual="it",
},
@@ -172240,7 +187854,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0041 },
+ specials={ "font", 0x41 },
unicodeslot=0x1D63C,
visual="bi",
},
@@ -172249,7 +187863,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0042 },
+ specials={ "font", 0x42 },
unicodeslot=0x1D63D,
visual="bi",
},
@@ -172258,7 +187872,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C",
direction="l",
linebreak="al",
- specials={ "font", 0x0043 },
+ specials={ "font", 0x43 },
unicodeslot=0x1D63E,
visual="bi",
},
@@ -172267,7 +187881,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0044 },
+ specials={ "font", 0x44 },
unicodeslot=0x1D63F,
visual="bi",
},
@@ -172276,7 +187890,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0045 },
+ specials={ "font", 0x45 },
unicodeslot=0x1D640,
visual="bi",
},
@@ -172285,7 +187899,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0046 },
+ specials={ "font", 0x46 },
unicodeslot=0x1D641,
visual="bi",
},
@@ -172294,7 +187908,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0047 },
+ specials={ "font", 0x47 },
unicodeslot=0x1D642,
visual="bi",
},
@@ -172303,7 +187917,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H",
direction="l",
linebreak="al",
- specials={ "font", 0x0048 },
+ specials={ "font", 0x48 },
unicodeslot=0x1D643,
visual="bi",
},
@@ -172312,7 +187926,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I",
direction="l",
linebreak="al",
- specials={ "font", 0x0049 },
+ specials={ "font", 0x49 },
unicodeslot=0x1D644,
visual="bi",
},
@@ -172321,7 +187935,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J",
direction="l",
linebreak="al",
- specials={ "font", 0x004A },
+ specials={ "font", 0x4A },
unicodeslot=0x1D645,
visual="bi",
},
@@ -172330,7 +187944,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K",
direction="l",
linebreak="al",
- specials={ "font", 0x004B },
+ specials={ "font", 0x4B },
unicodeslot=0x1D646,
visual="bi",
},
@@ -172339,7 +187953,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L",
direction="l",
linebreak="al",
- specials={ "font", 0x004C },
+ specials={ "font", 0x4C },
unicodeslot=0x1D647,
visual="bi",
},
@@ -172348,7 +187962,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M",
direction="l",
linebreak="al",
- specials={ "font", 0x004D },
+ specials={ "font", 0x4D },
unicodeslot=0x1D648,
visual="bi",
},
@@ -172357,7 +187971,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N",
direction="l",
linebreak="al",
- specials={ "font", 0x004E },
+ specials={ "font", 0x4E },
unicodeslot=0x1D649,
visual="bi",
},
@@ -172366,7 +187980,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O",
direction="l",
linebreak="al",
- specials={ "font", 0x004F },
+ specials={ "font", 0x4F },
unicodeslot=0x1D64A,
visual="bi",
},
@@ -172375,7 +187989,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P",
direction="l",
linebreak="al",
- specials={ "font", 0x0050 },
+ specials={ "font", 0x50 },
unicodeslot=0x1D64B,
visual="bi",
},
@@ -172384,7 +187998,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q",
direction="l",
linebreak="al",
- specials={ "font", 0x0051 },
+ specials={ "font", 0x51 },
unicodeslot=0x1D64C,
visual="bi",
},
@@ -172393,7 +188007,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R",
direction="l",
linebreak="al",
- specials={ "font", 0x0052 },
+ specials={ "font", 0x52 },
unicodeslot=0x1D64D,
visual="bi",
},
@@ -172402,7 +188016,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0053 },
+ specials={ "font", 0x53 },
unicodeslot=0x1D64E,
visual="bi",
},
@@ -172411,7 +188025,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0054 },
+ specials={ "font", 0x54 },
unicodeslot=0x1D64F,
visual="bi",
},
@@ -172420,7 +188034,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0055 },
+ specials={ "font", 0x55 },
unicodeslot=0x1D650,
visual="bi",
},
@@ -172429,7 +188043,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0056 },
+ specials={ "font", 0x56 },
unicodeslot=0x1D651,
visual="bi",
},
@@ -172438,7 +188052,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0057 },
+ specials={ "font", 0x57 },
unicodeslot=0x1D652,
visual="bi",
},
@@ -172447,7 +188061,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0058 },
+ specials={ "font", 0x58 },
unicodeslot=0x1D653,
visual="bi",
},
@@ -172456,7 +188070,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0059 },
+ specials={ "font", 0x59 },
unicodeslot=0x1D654,
visual="bi",
},
@@ -172465,7 +188079,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z",
direction="l",
linebreak="al",
- specials={ "font", 0x005A },
+ specials={ "font", 0x5A },
unicodeslot=0x1D655,
visual="bi",
},
@@ -172474,7 +188088,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0061 },
+ specials={ "font", 0x61 },
unicodeslot=0x1D656,
visual="bi",
},
@@ -172483,7 +188097,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0062 },
+ specials={ "font", 0x62 },
unicodeslot=0x1D657,
visual="bi",
},
@@ -172492,7 +188106,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C",
direction="l",
linebreak="al",
- specials={ "font", 0x0063 },
+ specials={ "font", 0x63 },
unicodeslot=0x1D658,
visual="bi",
},
@@ -172501,7 +188115,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0064 },
+ specials={ "font", 0x64 },
unicodeslot=0x1D659,
visual="bi",
},
@@ -172510,7 +188124,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0065 },
+ specials={ "font", 0x65 },
unicodeslot=0x1D65A,
visual="bi",
},
@@ -172519,7 +188133,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0066 },
+ specials={ "font", 0x66 },
unicodeslot=0x1D65B,
visual="bi",
},
@@ -172528,7 +188142,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0067 },
+ specials={ "font", 0x67 },
unicodeslot=0x1D65C,
visual="bi",
},
@@ -172537,7 +188151,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H",
direction="l",
linebreak="al",
- specials={ "font", 0x0068 },
+ specials={ "font", 0x68 },
unicodeslot=0x1D65D,
visual="bi",
},
@@ -172546,7 +188160,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I",
direction="l",
linebreak="al",
- specials={ "font", 0x0069 },
+ specials={ "font", 0x69 },
unicodeslot=0x1D65E,
visual="bi",
},
@@ -172555,7 +188169,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J",
direction="l",
linebreak="al",
- specials={ "font", 0x006A },
+ specials={ "font", 0x6A },
unicodeslot=0x1D65F,
visual="bi",
},
@@ -172564,7 +188178,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K",
direction="l",
linebreak="al",
- specials={ "font", 0x006B },
+ specials={ "font", 0x6B },
unicodeslot=0x1D660,
visual="bi",
},
@@ -172573,7 +188187,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L",
direction="l",
linebreak="al",
- specials={ "font", 0x006C },
+ specials={ "font", 0x6C },
unicodeslot=0x1D661,
visual="bi",
},
@@ -172582,7 +188196,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M",
direction="l",
linebreak="al",
- specials={ "font", 0x006D },
+ specials={ "font", 0x6D },
unicodeslot=0x1D662,
visual="bi",
},
@@ -172591,7 +188205,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N",
direction="l",
linebreak="al",
- specials={ "font", 0x006E },
+ specials={ "font", 0x6E },
unicodeslot=0x1D663,
visual="bi",
},
@@ -172600,7 +188214,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O",
direction="l",
linebreak="al",
- specials={ "font", 0x006F },
+ specials={ "font", 0x6F },
unicodeslot=0x1D664,
visual="bi",
},
@@ -172609,7 +188223,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P",
direction="l",
linebreak="al",
- specials={ "font", 0x0070 },
+ specials={ "font", 0x70 },
unicodeslot=0x1D665,
visual="bi",
},
@@ -172618,7 +188232,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q",
direction="l",
linebreak="al",
- specials={ "font", 0x0071 },
+ specials={ "font", 0x71 },
unicodeslot=0x1D666,
visual="bi",
},
@@ -172627,7 +188241,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R",
direction="l",
linebreak="al",
- specials={ "font", 0x0072 },
+ specials={ "font", 0x72 },
unicodeslot=0x1D667,
visual="bi",
},
@@ -172636,7 +188250,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0073 },
+ specials={ "font", 0x73 },
unicodeslot=0x1D668,
visual="bi",
},
@@ -172645,7 +188259,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0074 },
+ specials={ "font", 0x74 },
unicodeslot=0x1D669,
visual="bi",
},
@@ -172654,7 +188268,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0075 },
+ specials={ "font", 0x75 },
unicodeslot=0x1D66A,
visual="bi",
},
@@ -172663,7 +188277,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0076 },
+ specials={ "font", 0x76 },
unicodeslot=0x1D66B,
visual="bi",
},
@@ -172672,7 +188286,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0077 },
+ specials={ "font", 0x77 },
unicodeslot=0x1D66C,
visual="bi",
},
@@ -172681,7 +188295,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0078 },
+ specials={ "font", 0x78 },
unicodeslot=0x1D66D,
visual="bi",
},
@@ -172690,7 +188304,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0079 },
+ specials={ "font", 0x79 },
unicodeslot=0x1D66E,
visual="bi",
},
@@ -172699,7 +188313,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z",
direction="l",
linebreak="al",
- specials={ "font", 0x007A },
+ specials={ "font", 0x7A },
unicodeslot=0x1D66F,
visual="bi",
},
@@ -172708,7 +188322,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0041 },
+ specials={ "font", 0x41 },
unicodeslot=0x1D670,
},
[0x1D671]={
@@ -172716,7 +188330,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0042 },
+ specials={ "font", 0x42 },
unicodeslot=0x1D671,
},
[0x1D672]={
@@ -172724,7 +188338,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL C",
direction="l",
linebreak="al",
- specials={ "font", 0x0043 },
+ specials={ "font", 0x43 },
unicodeslot=0x1D672,
},
[0x1D673]={
@@ -172732,7 +188346,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0044 },
+ specials={ "font", 0x44 },
unicodeslot=0x1D673,
},
[0x1D674]={
@@ -172740,7 +188354,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0045 },
+ specials={ "font", 0x45 },
unicodeslot=0x1D674,
},
[0x1D675]={
@@ -172748,7 +188362,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0046 },
+ specials={ "font", 0x46 },
unicodeslot=0x1D675,
},
[0x1D676]={
@@ -172756,7 +188370,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0047 },
+ specials={ "font", 0x47 },
unicodeslot=0x1D676,
},
[0x1D677]={
@@ -172764,7 +188378,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL H",
direction="l",
linebreak="al",
- specials={ "font", 0x0048 },
+ specials={ "font", 0x48 },
unicodeslot=0x1D677,
},
[0x1D678]={
@@ -172772,7 +188386,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL I",
direction="l",
linebreak="al",
- specials={ "font", 0x0049 },
+ specials={ "font", 0x49 },
unicodeslot=0x1D678,
},
[0x1D679]={
@@ -172780,7 +188394,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL J",
direction="l",
linebreak="al",
- specials={ "font", 0x004A },
+ specials={ "font", 0x4A },
unicodeslot=0x1D679,
},
[0x1D67A]={
@@ -172788,7 +188402,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL K",
direction="l",
linebreak="al",
- specials={ "font", 0x004B },
+ specials={ "font", 0x4B },
unicodeslot=0x1D67A,
},
[0x1D67B]={
@@ -172796,7 +188410,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL L",
direction="l",
linebreak="al",
- specials={ "font", 0x004C },
+ specials={ "font", 0x4C },
unicodeslot=0x1D67B,
},
[0x1D67C]={
@@ -172804,7 +188418,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL M",
direction="l",
linebreak="al",
- specials={ "font", 0x004D },
+ specials={ "font", 0x4D },
unicodeslot=0x1D67C,
},
[0x1D67D]={
@@ -172812,7 +188426,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL N",
direction="l",
linebreak="al",
- specials={ "font", 0x004E },
+ specials={ "font", 0x4E },
unicodeslot=0x1D67D,
},
[0x1D67E]={
@@ -172820,7 +188434,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL O",
direction="l",
linebreak="al",
- specials={ "font", 0x004F },
+ specials={ "font", 0x4F },
unicodeslot=0x1D67E,
},
[0x1D67F]={
@@ -172828,7 +188442,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL P",
direction="l",
linebreak="al",
- specials={ "font", 0x0050 },
+ specials={ "font", 0x50 },
unicodeslot=0x1D67F,
},
[0x1D680]={
@@ -172836,7 +188450,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL Q",
direction="l",
linebreak="al",
- specials={ "font", 0x0051 },
+ specials={ "font", 0x51 },
unicodeslot=0x1D680,
},
[0x1D681]={
@@ -172844,7 +188458,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL R",
direction="l",
linebreak="al",
- specials={ "font", 0x0052 },
+ specials={ "font", 0x52 },
unicodeslot=0x1D681,
},
[0x1D682]={
@@ -172852,7 +188466,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0053 },
+ specials={ "font", 0x53 },
unicodeslot=0x1D682,
},
[0x1D683]={
@@ -172860,7 +188474,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0054 },
+ specials={ "font", 0x54 },
unicodeslot=0x1D683,
},
[0x1D684]={
@@ -172868,7 +188482,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0055 },
+ specials={ "font", 0x55 },
unicodeslot=0x1D684,
},
[0x1D685]={
@@ -172876,7 +188490,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0056 },
+ specials={ "font", 0x56 },
unicodeslot=0x1D685,
},
[0x1D686]={
@@ -172884,7 +188498,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0057 },
+ specials={ "font", 0x57 },
unicodeslot=0x1D686,
},
[0x1D687]={
@@ -172892,7 +188506,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0058 },
+ specials={ "font", 0x58 },
unicodeslot=0x1D687,
},
[0x1D688]={
@@ -172900,7 +188514,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0059 },
+ specials={ "font", 0x59 },
unicodeslot=0x1D688,
},
[0x1D689]={
@@ -172908,7 +188522,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE CAPITAL Z",
direction="l",
linebreak="al",
- specials={ "font", 0x005A },
+ specials={ "font", 0x5A },
unicodeslot=0x1D689,
},
[0x1D68A]={
@@ -172916,7 +188530,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL A",
direction="l",
linebreak="al",
- specials={ "font", 0x0061 },
+ specials={ "font", 0x61 },
unicodeslot=0x1D68A,
},
[0x1D68B]={
@@ -172924,7 +188538,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL B",
direction="l",
linebreak="al",
- specials={ "font", 0x0062 },
+ specials={ "font", 0x62 },
unicodeslot=0x1D68B,
},
[0x1D68C]={
@@ -172932,7 +188546,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL C",
direction="l",
linebreak="al",
- specials={ "font", 0x0063 },
+ specials={ "font", 0x63 },
unicodeslot=0x1D68C,
},
[0x1D68D]={
@@ -172940,7 +188554,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL D",
direction="l",
linebreak="al",
- specials={ "font", 0x0064 },
+ specials={ "font", 0x64 },
unicodeslot=0x1D68D,
},
[0x1D68E]={
@@ -172948,7 +188562,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL E",
direction="l",
linebreak="al",
- specials={ "font", 0x0065 },
+ specials={ "font", 0x65 },
unicodeslot=0x1D68E,
},
[0x1D68F]={
@@ -172956,7 +188570,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL F",
direction="l",
linebreak="al",
- specials={ "font", 0x0066 },
+ specials={ "font", 0x66 },
unicodeslot=0x1D68F,
},
[0x1D690]={
@@ -172964,7 +188578,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL G",
direction="l",
linebreak="al",
- specials={ "font", 0x0067 },
+ specials={ "font", 0x67 },
unicodeslot=0x1D690,
},
[0x1D691]={
@@ -172972,7 +188586,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL H",
direction="l",
linebreak="al",
- specials={ "font", 0x0068 },
+ specials={ "font", 0x68 },
unicodeslot=0x1D691,
},
[0x1D692]={
@@ -172980,7 +188594,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL I",
direction="l",
linebreak="al",
- specials={ "font", 0x0069 },
+ specials={ "font", 0x69 },
unicodeslot=0x1D692,
},
[0x1D693]={
@@ -172988,7 +188602,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL J",
direction="l",
linebreak="al",
- specials={ "font", 0x006A },
+ specials={ "font", 0x6A },
unicodeslot=0x1D693,
},
[0x1D694]={
@@ -172996,7 +188610,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL K",
direction="l",
linebreak="al",
- specials={ "font", 0x006B },
+ specials={ "font", 0x6B },
unicodeslot=0x1D694,
},
[0x1D695]={
@@ -173004,7 +188618,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL L",
direction="l",
linebreak="al",
- specials={ "font", 0x006C },
+ specials={ "font", 0x6C },
unicodeslot=0x1D695,
},
[0x1D696]={
@@ -173012,7 +188626,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL M",
direction="l",
linebreak="al",
- specials={ "font", 0x006D },
+ specials={ "font", 0x6D },
unicodeslot=0x1D696,
},
[0x1D697]={
@@ -173020,7 +188634,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL N",
direction="l",
linebreak="al",
- specials={ "font", 0x006E },
+ specials={ "font", 0x6E },
unicodeslot=0x1D697,
},
[0x1D698]={
@@ -173028,7 +188642,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL O",
direction="l",
linebreak="al",
- specials={ "font", 0x006F },
+ specials={ "font", 0x6F },
unicodeslot=0x1D698,
},
[0x1D699]={
@@ -173036,7 +188650,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL P",
direction="l",
linebreak="al",
- specials={ "font", 0x0070 },
+ specials={ "font", 0x70 },
unicodeslot=0x1D699,
},
[0x1D69A]={
@@ -173044,7 +188658,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL Q",
direction="l",
linebreak="al",
- specials={ "font", 0x0071 },
+ specials={ "font", 0x71 },
unicodeslot=0x1D69A,
},
[0x1D69B]={
@@ -173052,7 +188666,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL R",
direction="l",
linebreak="al",
- specials={ "font", 0x0072 },
+ specials={ "font", 0x72 },
unicodeslot=0x1D69B,
},
[0x1D69C]={
@@ -173060,7 +188674,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL S",
direction="l",
linebreak="al",
- specials={ "font", 0x0073 },
+ specials={ "font", 0x73 },
unicodeslot=0x1D69C,
},
[0x1D69D]={
@@ -173068,7 +188682,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL T",
direction="l",
linebreak="al",
- specials={ "font", 0x0074 },
+ specials={ "font", 0x74 },
unicodeslot=0x1D69D,
},
[0x1D69E]={
@@ -173076,7 +188690,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL U",
direction="l",
linebreak="al",
- specials={ "font", 0x0075 },
+ specials={ "font", 0x75 },
unicodeslot=0x1D69E,
},
[0x1D69F]={
@@ -173084,7 +188698,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL V",
direction="l",
linebreak="al",
- specials={ "font", 0x0076 },
+ specials={ "font", 0x76 },
unicodeslot=0x1D69F,
},
[0x1D6A0]={
@@ -173092,7 +188706,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL W",
direction="l",
linebreak="al",
- specials={ "font", 0x0077 },
+ specials={ "font", 0x77 },
unicodeslot=0x1D6A0,
},
[0x1D6A1]={
@@ -173100,7 +188714,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL X",
direction="l",
linebreak="al",
- specials={ "font", 0x0078 },
+ specials={ "font", 0x78 },
unicodeslot=0x1D6A1,
},
[0x1D6A2]={
@@ -173108,7 +188722,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL Y",
direction="l",
linebreak="al",
- specials={ "font", 0x0079 },
+ specials={ "font", 0x79 },
unicodeslot=0x1D6A2,
},
[0x1D6A3]={
@@ -173116,7 +188730,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE SMALL Z",
direction="l",
linebreak="al",
- specials={ "font", 0x007A },
+ specials={ "font", 0x7A },
unicodeslot=0x1D6A3,
},
[0x1D6A4]={
@@ -173126,7 +188740,7 @@ characters.data={
linebreak="al",
mathclass="default",
mathname="imath",
- specials={ "font", 0x0131 },
+ specials={ "font", 0x131 },
unicodeslot=0x1D6A4,
visual="it",
},
@@ -173137,7 +188751,7 @@ characters.data={
linebreak="al",
mathclass="default",
mathname="jmath",
- specials={ "font", 0x0237 },
+ specials={ "font", 0x237 },
unicodeslot=0x1D6A5,
visual="it",
},
@@ -173146,7 +188760,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL ALPHA",
direction="l",
linebreak="al",
- specials={ "font", 0x0391 },
+ specials={ "font", 0x391 },
unicodeslot=0x1D6A8,
visual="bf",
},
@@ -173155,7 +188769,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL BETA",
direction="l",
linebreak="al",
- specials={ "font", 0x0392 },
+ specials={ "font", 0x392 },
unicodeslot=0x1D6A9,
visual="bf",
},
@@ -173164,7 +188778,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL GAMMA",
direction="l",
linebreak="al",
- specials={ "font", 0x0393 },
+ specials={ "font", 0x393 },
unicodeslot=0x1D6AA,
visual="bf",
},
@@ -173173,7 +188787,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL DELTA",
direction="l",
linebreak="al",
- specials={ "font", 0x0394 },
+ specials={ "font", 0x394 },
unicodeslot=0x1D6AB,
visual="bf",
},
@@ -173182,7 +188796,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL EPSILON",
direction="l",
linebreak="al",
- specials={ "font", 0x0395 },
+ specials={ "font", 0x395 },
unicodeslot=0x1D6AC,
visual="bf",
},
@@ -173191,7 +188805,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL ZETA",
direction="l",
linebreak="al",
- specials={ "font", 0x0396 },
+ specials={ "font", 0x396 },
unicodeslot=0x1D6AD,
visual="bf",
},
@@ -173200,7 +188814,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL ETA",
direction="l",
linebreak="al",
- specials={ "font", 0x0397 },
+ specials={ "font", 0x397 },
unicodeslot=0x1D6AE,
visual="bf",
},
@@ -173209,7 +188823,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL THETA",
direction="l",
linebreak="al",
- specials={ "font", 0x0398 },
+ specials={ "font", 0x398 },
unicodeslot=0x1D6AF,
visual="bf",
},
@@ -173218,7 +188832,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL IOTA",
direction="l",
linebreak="al",
- specials={ "font", 0x0399 },
+ specials={ "font", 0x399 },
unicodeslot=0x1D6B0,
visual="bf",
},
@@ -173227,7 +188841,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL KAPPA",
direction="l",
linebreak="al",
- specials={ "font", 0x039A },
+ specials={ "font", 0x39A },
unicodeslot=0x1D6B1,
visual="bf",
},
@@ -173236,7 +188850,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL LAMDA",
direction="l",
linebreak="al",
- specials={ "font", 0x039B },
+ specials={ "font", 0x39B },
unicodeslot=0x1D6B2,
visual="bf",
},
@@ -173245,7 +188859,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL MU",
direction="l",
linebreak="al",
- specials={ "font", 0x039C },
+ specials={ "font", 0x39C },
unicodeslot=0x1D6B3,
visual="bf",
},
@@ -173254,7 +188868,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL NU",
direction="l",
linebreak="al",
- specials={ "font", 0x039D },
+ specials={ "font", 0x39D },
unicodeslot=0x1D6B4,
visual="bf",
},
@@ -173263,7 +188877,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL XI",
direction="l",
linebreak="al",
- specials={ "font", 0x039E },
+ specials={ "font", 0x39E },
unicodeslot=0x1D6B5,
visual="bf",
},
@@ -173272,7 +188886,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL OMICRON",
direction="l",
linebreak="al",
- specials={ "font", 0x039F },
+ specials={ "font", 0x39F },
unicodeslot=0x1D6B6,
visual="bf",
},
@@ -173281,7 +188895,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL PI",
direction="l",
linebreak="al",
- specials={ "font", 0x03A0 },
+ specials={ "font", 0x3A0 },
unicodeslot=0x1D6B7,
visual="bf",
},
@@ -173290,7 +188904,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL RHO",
direction="l",
linebreak="al",
- specials={ "font", 0x03A1 },
+ specials={ "font", 0x3A1 },
unicodeslot=0x1D6B8,
visual="bf",
},
@@ -173299,7 +188913,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL THETA SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03F4 },
+ specials={ "font", 0x3F4 },
unicodeslot=0x1D6B9,
visual="bf",
},
@@ -173308,7 +188922,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL SIGMA",
direction="l",
linebreak="al",
- specials={ "font", 0x03A3 },
+ specials={ "font", 0x3A3 },
unicodeslot=0x1D6BA,
visual="bf",
},
@@ -173317,7 +188931,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL TAU",
direction="l",
linebreak="al",
- specials={ "font", 0x03A4 },
+ specials={ "font", 0x3A4 },
unicodeslot=0x1D6BB,
visual="bf",
},
@@ -173326,7 +188940,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL UPSILON",
direction="l",
linebreak="al",
- specials={ "font", 0x03A5 },
+ specials={ "font", 0x3A5 },
unicodeslot=0x1D6BC,
visual="bf",
},
@@ -173335,7 +188949,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL PHI",
direction="l",
linebreak="al",
- specials={ "font", 0x03A6 },
+ specials={ "font", 0x3A6 },
unicodeslot=0x1D6BD,
visual="bf",
},
@@ -173344,7 +188958,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL CHI",
direction="l",
linebreak="al",
- specials={ "font", 0x03A7 },
+ specials={ "font", 0x3A7 },
unicodeslot=0x1D6BE,
visual="bf",
},
@@ -173353,7 +188967,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL PSI",
direction="l",
linebreak="al",
- specials={ "font", 0x03A8 },
+ specials={ "font", 0x3A8 },
unicodeslot=0x1D6BF,
visual="bf",
},
@@ -173362,7 +188976,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL OMEGA",
direction="l",
linebreak="al",
- specials={ "font", 0x03A9 },
+ specials={ "font", 0x3A9 },
unicodeslot=0x1D6C0,
visual="bf",
},
@@ -173380,7 +188994,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL ALPHA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B1 },
+ specials={ "font", 0x3B1 },
unicodeslot=0x1D6C2,
visual="bf",
},
@@ -173389,7 +189003,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL BETA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B2 },
+ specials={ "font", 0x3B2 },
unicodeslot=0x1D6C3,
visual="bf",
},
@@ -173398,7 +189012,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL GAMMA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B3 },
+ specials={ "font", 0x3B3 },
unicodeslot=0x1D6C4,
visual="bf",
},
@@ -173407,7 +189021,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL DELTA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B4 },
+ specials={ "font", 0x3B4 },
unicodeslot=0x1D6C5,
visual="bf",
},
@@ -173416,7 +189030,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL EPSILON",
direction="l",
linebreak="al",
- specials={ "font", 0x03B5 },
+ specials={ "font", 0x3B5 },
unicodeslot=0x1D6C6,
visual="bf",
},
@@ -173425,7 +189039,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL ZETA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B6 },
+ specials={ "font", 0x3B6 },
unicodeslot=0x1D6C7,
visual="bf",
},
@@ -173434,7 +189048,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL ETA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B7 },
+ specials={ "font", 0x3B7 },
unicodeslot=0x1D6C8,
visual="bf",
},
@@ -173443,7 +189057,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL THETA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B8 },
+ specials={ "font", 0x3B8 },
unicodeslot=0x1D6C9,
visual="bf",
},
@@ -173452,7 +189066,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL IOTA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B9 },
+ specials={ "font", 0x3B9 },
unicodeslot=0x1D6CA,
visual="bf",
},
@@ -173461,7 +189075,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL KAPPA",
direction="l",
linebreak="al",
- specials={ "font", 0x03BA },
+ specials={ "font", 0x3BA },
unicodeslot=0x1D6CB,
visual="bf",
},
@@ -173470,7 +189084,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL LAMDA",
direction="l",
linebreak="al",
- specials={ "font", 0x03BB },
+ specials={ "font", 0x3BB },
unicodeslot=0x1D6CC,
visual="bf",
},
@@ -173479,7 +189093,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL MU",
direction="l",
linebreak="al",
- specials={ "font", 0x03BC },
+ specials={ "font", 0x3BC },
unicodeslot=0x1D6CD,
visual="bf",
},
@@ -173488,7 +189102,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL NU",
direction="l",
linebreak="al",
- specials={ "font", 0x03BD },
+ specials={ "font", 0x3BD },
unicodeslot=0x1D6CE,
visual="bf",
},
@@ -173497,7 +189111,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL XI",
direction="l",
linebreak="al",
- specials={ "font", 0x03BE },
+ specials={ "font", 0x3BE },
unicodeslot=0x1D6CF,
visual="bf",
},
@@ -173506,7 +189120,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL OMICRON",
direction="l",
linebreak="al",
- specials={ "font", 0x03BF },
+ specials={ "font", 0x3BF },
unicodeslot=0x1D6D0,
visual="bf",
},
@@ -173515,7 +189129,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL PI",
direction="l",
linebreak="al",
- specials={ "font", 0x03C0 },
+ specials={ "font", 0x3C0 },
unicodeslot=0x1D6D1,
visual="bf",
},
@@ -173524,7 +189138,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL RHO",
direction="l",
linebreak="al",
- specials={ "font", 0x03C1 },
+ specials={ "font", 0x3C1 },
unicodeslot=0x1D6D2,
visual="bf",
},
@@ -173533,7 +189147,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL FINAL SIGMA",
direction="l",
linebreak="al",
- specials={ "font", 0x03C2 },
+ specials={ "font", 0x3C2 },
unicodeslot=0x1D6D3,
visual="bf",
},
@@ -173542,7 +189156,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL SIGMA",
direction="l",
linebreak="al",
- specials={ "font", 0x03C3 },
+ specials={ "font", 0x3C3 },
unicodeslot=0x1D6D4,
visual="bf",
},
@@ -173551,7 +189165,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL TAU",
direction="l",
linebreak="al",
- specials={ "font", 0x03C4 },
+ specials={ "font", 0x3C4 },
unicodeslot=0x1D6D5,
visual="bf",
},
@@ -173560,7 +189174,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL UPSILON",
direction="l",
linebreak="al",
- specials={ "font", 0x03C5 },
+ specials={ "font", 0x3C5 },
unicodeslot=0x1D6D6,
visual="bf",
},
@@ -173569,7 +189183,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL PHI",
direction="l",
linebreak="al",
- specials={ "font", 0x03C6 },
+ specials={ "font", 0x3C6 },
unicodeslot=0x1D6D7,
visual="bf",
},
@@ -173578,7 +189192,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL CHI",
direction="l",
linebreak="al",
- specials={ "font", 0x03C7 },
+ specials={ "font", 0x3C7 },
unicodeslot=0x1D6D8,
visual="bf",
},
@@ -173587,7 +189201,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL PSI",
direction="l",
linebreak="al",
- specials={ "font", 0x03C8 },
+ specials={ "font", 0x3C8 },
unicodeslot=0x1D6D9,
visual="bf",
},
@@ -173596,7 +189210,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL OMEGA",
direction="l",
linebreak="al",
- specials={ "font", 0x03C9 },
+ specials={ "font", 0x3C9 },
unicodeslot=0x1D6DA,
visual="bf",
},
@@ -173614,7 +189228,7 @@ characters.data={
description="MATHEMATICAL BOLD EPSILON SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03F5 },
+ specials={ "font", 0x3F5 },
unicodeslot=0x1D6DC,
visual="bf",
},
@@ -173623,7 +189237,7 @@ characters.data={
description="MATHEMATICAL BOLD THETA SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03D1 },
+ specials={ "font", 0x3D1 },
unicodeslot=0x1D6DD,
visual="bf",
},
@@ -173632,7 +189246,7 @@ characters.data={
description="MATHEMATICAL BOLD KAPPA SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03F0 },
+ specials={ "font", 0x3F0 },
unicodeslot=0x1D6DE,
visual="bf",
},
@@ -173641,7 +189255,7 @@ characters.data={
description="MATHEMATICAL BOLD PHI SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03D5 },
+ specials={ "font", 0x3D5 },
unicodeslot=0x1D6DF,
visual="bf",
},
@@ -173650,7 +189264,7 @@ characters.data={
description="MATHEMATICAL BOLD RHO SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03F1 },
+ specials={ "font", 0x3F1 },
unicodeslot=0x1D6E0,
visual="bf",
},
@@ -173659,7 +189273,7 @@ characters.data={
description="MATHEMATICAL BOLD PI SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03D6 },
+ specials={ "font", 0x3D6 },
unicodeslot=0x1D6E1,
visual="bf",
},
@@ -173668,7 +189282,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL ALPHA",
direction="l",
linebreak="al",
- specials={ "font", 0x0391 },
+ specials={ "font", 0x391 },
unicodeslot=0x1D6E2,
visual="it",
},
@@ -173677,7 +189291,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL BETA",
direction="l",
linebreak="al",
- specials={ "font", 0x0392 },
+ specials={ "font", 0x392 },
unicodeslot=0x1D6E3,
visual="it",
},
@@ -173686,7 +189300,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL GAMMA",
direction="l",
linebreak="al",
- specials={ "font", 0x0393 },
+ specials={ "font", 0x393 },
unicodeslot=0x1D6E4,
visual="it",
},
@@ -173695,7 +189309,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL DELTA",
direction="l",
linebreak="al",
- specials={ "font", 0x0394 },
+ specials={ "font", 0x394 },
unicodeslot=0x1D6E5,
visual="it",
},
@@ -173704,7 +189318,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL EPSILON",
direction="l",
linebreak="al",
- specials={ "font", 0x0395 },
+ specials={ "font", 0x395 },
unicodeslot=0x1D6E6,
visual="it",
},
@@ -173713,7 +189327,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL ZETA",
direction="l",
linebreak="al",
- specials={ "font", 0x0396 },
+ specials={ "font", 0x396 },
unicodeslot=0x1D6E7,
visual="it",
},
@@ -173722,7 +189336,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL ETA",
direction="l",
linebreak="al",
- specials={ "font", 0x0397 },
+ specials={ "font", 0x397 },
unicodeslot=0x1D6E8,
visual="it",
},
@@ -173731,7 +189345,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL THETA",
direction="l",
linebreak="al",
- specials={ "font", 0x0398 },
+ specials={ "font", 0x398 },
unicodeslot=0x1D6E9,
visual="it",
},
@@ -173740,7 +189354,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL IOTA",
direction="l",
linebreak="al",
- specials={ "font", 0x0399 },
+ specials={ "font", 0x399 },
unicodeslot=0x1D6EA,
visual="it",
},
@@ -173749,7 +189363,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL KAPPA",
direction="l",
linebreak="al",
- specials={ "font", 0x039A },
+ specials={ "font", 0x39A },
unicodeslot=0x1D6EB,
visual="it",
},
@@ -173758,7 +189372,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL LAMDA",
direction="l",
linebreak="al",
- specials={ "font", 0x039B },
+ specials={ "font", 0x39B },
unicodeslot=0x1D6EC,
visual="it",
},
@@ -173767,7 +189381,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL MU",
direction="l",
linebreak="al",
- specials={ "font", 0x039C },
+ specials={ "font", 0x39C },
unicodeslot=0x1D6ED,
visual="it",
},
@@ -173776,7 +189390,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL NU",
direction="l",
linebreak="al",
- specials={ "font", 0x039D },
+ specials={ "font", 0x39D },
unicodeslot=0x1D6EE,
visual="it",
},
@@ -173785,7 +189399,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL XI",
direction="l",
linebreak="al",
- specials={ "font", 0x039E },
+ specials={ "font", 0x39E },
unicodeslot=0x1D6EF,
visual="it",
},
@@ -173794,7 +189408,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL OMICRON",
direction="l",
linebreak="al",
- specials={ "font", 0x039F },
+ specials={ "font", 0x39F },
unicodeslot=0x1D6F0,
visual="it",
},
@@ -173803,7 +189417,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL PI",
direction="l",
linebreak="al",
- specials={ "font", 0x03A0 },
+ specials={ "font", 0x3A0 },
unicodeslot=0x1D6F1,
visual="it",
},
@@ -173812,7 +189426,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL RHO",
direction="l",
linebreak="al",
- specials={ "font", 0x03A1 },
+ specials={ "font", 0x3A1 },
unicodeslot=0x1D6F2,
visual="it",
},
@@ -173821,7 +189435,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL THETA SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03F4 },
+ specials={ "font", 0x3F4 },
unicodeslot=0x1D6F3,
visual="it",
},
@@ -173830,7 +189444,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL SIGMA",
direction="l",
linebreak="al",
- specials={ "font", 0x03A3 },
+ specials={ "font", 0x3A3 },
unicodeslot=0x1D6F4,
visual="it",
},
@@ -173839,7 +189453,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL TAU",
direction="l",
linebreak="al",
- specials={ "font", 0x03A4 },
+ specials={ "font", 0x3A4 },
unicodeslot=0x1D6F5,
visual="it",
},
@@ -173848,7 +189462,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL UPSILON",
direction="l",
linebreak="al",
- specials={ "font", 0x03A5 },
+ specials={ "font", 0x3A5 },
unicodeslot=0x1D6F6,
visual="it",
},
@@ -173857,7 +189471,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL PHI",
direction="l",
linebreak="al",
- specials={ "font", 0x03A6 },
+ specials={ "font", 0x3A6 },
unicodeslot=0x1D6F7,
visual="it",
},
@@ -173866,7 +189480,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL CHI",
direction="l",
linebreak="al",
- specials={ "font", 0x03A7 },
+ specials={ "font", 0x3A7 },
unicodeslot=0x1D6F8,
visual="it",
},
@@ -173875,7 +189489,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL PSI",
direction="l",
linebreak="al",
- specials={ "font", 0x03A8 },
+ specials={ "font", 0x3A8 },
unicodeslot=0x1D6F9,
visual="it",
},
@@ -173884,7 +189498,7 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL OMEGA",
direction="l",
linebreak="al",
- specials={ "font", 0x03A9 },
+ specials={ "font", 0x3A9 },
unicodeslot=0x1D6FA,
visual="it",
},
@@ -173903,7 +189517,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL ALPHA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B1 },
+ specials={ "font", 0x3B1 },
unicodeslot=0x1D6FC,
visual="it",
},
@@ -173912,7 +189526,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL BETA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B2 },
+ specials={ "font", 0x3B2 },
unicodeslot=0x1D6FD,
visual="it",
},
@@ -173921,7 +189535,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL GAMMA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B3 },
+ specials={ "font", 0x3B3 },
unicodeslot=0x1D6FE,
visual="it",
},
@@ -173930,7 +189544,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL DELTA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B4 },
+ specials={ "font", 0x3B4 },
unicodeslot=0x1D6FF,
visual="it",
},
@@ -173939,7 +189553,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL EPSILON",
direction="l",
linebreak="al",
- specials={ "font", 0x03B5 },
+ specials={ "font", 0x3B5 },
unicodeslot=0x1D700,
visual="it",
},
@@ -173948,7 +189562,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL ZETA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B6 },
+ specials={ "font", 0x3B6 },
unicodeslot=0x1D701,
visual="it",
},
@@ -173957,7 +189571,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL ETA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B7 },
+ specials={ "font", 0x3B7 },
unicodeslot=0x1D702,
visual="it",
},
@@ -173966,7 +189580,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL THETA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B8 },
+ specials={ "font", 0x3B8 },
unicodeslot=0x1D703,
visual="it",
},
@@ -173975,7 +189589,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL IOTA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B9 },
+ specials={ "font", 0x3B9 },
unicodeslot=0x1D704,
visual="it",
},
@@ -173984,7 +189598,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL KAPPA",
direction="l",
linebreak="al",
- specials={ "font", 0x03BA },
+ specials={ "font", 0x3BA },
unicodeslot=0x1D705,
visual="it",
},
@@ -173993,7 +189607,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL LAMDA",
direction="l",
linebreak="al",
- specials={ "font", 0x03BB },
+ specials={ "font", 0x3BB },
unicodeslot=0x1D706,
visual="it",
},
@@ -174002,7 +189616,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL MU",
direction="l",
linebreak="al",
- specials={ "font", 0x03BC },
+ specials={ "font", 0x3BC },
unicodeslot=0x1D707,
visual="it",
},
@@ -174011,7 +189625,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL NU",
direction="l",
linebreak="al",
- specials={ "font", 0x03BD },
+ specials={ "font", 0x3BD },
unicodeslot=0x1D708,
visual="it",
},
@@ -174020,7 +189634,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL XI",
direction="l",
linebreak="al",
- specials={ "font", 0x03BE },
+ specials={ "font", 0x3BE },
unicodeslot=0x1D709,
visual="it",
},
@@ -174029,7 +189643,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL OMICRON",
direction="l",
linebreak="al",
- specials={ "font", 0x03BF },
+ specials={ "font", 0x3BF },
unicodeslot=0x1D70A,
visual="it",
},
@@ -174038,7 +189652,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL PI",
direction="l",
linebreak="al",
- specials={ "font", 0x03C0 },
+ specials={ "font", 0x3C0 },
unicodeslot=0x1D70B,
visual="it",
},
@@ -174047,7 +189661,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL RHO",
direction="l",
linebreak="al",
- specials={ "font", 0x03C1 },
+ specials={ "font", 0x3C1 },
unicodeslot=0x1D70C,
visual="it",
},
@@ -174056,7 +189670,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL FINAL SIGMA",
direction="l",
linebreak="al",
- specials={ "font", 0x03C2 },
+ specials={ "font", 0x3C2 },
unicodeslot=0x1D70D,
visual="it",
},
@@ -174065,7 +189679,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL SIGMA",
direction="l",
linebreak="al",
- specials={ "font", 0x03C3 },
+ specials={ "font", 0x3C3 },
unicodeslot=0x1D70E,
visual="it",
},
@@ -174074,7 +189688,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL TAU",
direction="l",
linebreak="al",
- specials={ "font", 0x03C4 },
+ specials={ "font", 0x3C4 },
unicodeslot=0x1D70F,
visual="it",
},
@@ -174083,7 +189697,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL UPSILON",
direction="l",
linebreak="al",
- specials={ "font", 0x03C5 },
+ specials={ "font", 0x3C5 },
unicodeslot=0x1D710,
visual="it",
},
@@ -174092,7 +189706,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL PHI",
direction="l",
linebreak="al",
- specials={ "font", 0x03C6 },
+ specials={ "font", 0x3C6 },
unicodeslot=0x1D711,
visual="it",
},
@@ -174101,7 +189715,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL CHI",
direction="l",
linebreak="al",
- specials={ "font", 0x03C7 },
+ specials={ "font", 0x3C7 },
unicodeslot=0x1D712,
visual="it",
},
@@ -174110,7 +189724,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL PSI",
direction="l",
linebreak="al",
- specials={ "font", 0x03C8 },
+ specials={ "font", 0x3C8 },
unicodeslot=0x1D713,
visual="it",
},
@@ -174119,7 +189733,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL OMEGA",
direction="l",
linebreak="al",
- specials={ "font", 0x03C9 },
+ specials={ "font", 0x3C9 },
unicodeslot=0x1D714,
visual="it",
},
@@ -174137,7 +189751,7 @@ characters.data={
description="MATHEMATICAL ITALIC EPSILON SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03F5 },
+ specials={ "font", 0x3F5 },
unicodeslot=0x1D716,
visual="it",
},
@@ -174148,7 +189762,7 @@ characters.data={
linebreak="al",
mathclass="default",
mathname="vartheta",
- specials={ "font", 0x03D1 },
+ specials={ "font", 0x3D1 },
unicodeslot=0x1D717,
visual="it",
},
@@ -174159,7 +189773,7 @@ characters.data={
linebreak="al",
mathclass="default",
mathname="varkappa",
- specials={ "font", 0x03F0 },
+ specials={ "font", 0x3F0 },
unicodeslot=0x1D718,
visual="it",
},
@@ -174168,7 +189782,7 @@ characters.data={
description="MATHEMATICAL ITALIC PHI SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03D5 },
+ specials={ "font", 0x3D5 },
unicodeslot=0x1D719,
visual="it",
},
@@ -174179,7 +189793,7 @@ characters.data={
linebreak="al",
mathclass="variable",
mathname="varrho",
- specials={ "font", 0x03F1 },
+ specials={ "font", 0x3F1 },
unicodeslot=0x1D71A,
visual="it",
},
@@ -174188,7 +189802,7 @@ characters.data={
description="MATHEMATICAL ITALIC PI SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03D6 },
+ specials={ "font", 0x3D6 },
unicodeslot=0x1D71B,
visual="it",
},
@@ -174197,7 +189811,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL ALPHA",
direction="l",
linebreak="al",
- specials={ "font", 0x0391 },
+ specials={ "font", 0x391 },
unicodeslot=0x1D71C,
visual="bi",
},
@@ -174206,7 +189820,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL BETA",
direction="l",
linebreak="al",
- specials={ "font", 0x0392 },
+ specials={ "font", 0x392 },
unicodeslot=0x1D71D,
visual="bi",
},
@@ -174215,7 +189829,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL GAMMA",
direction="l",
linebreak="al",
- specials={ "font", 0x0393 },
+ specials={ "font", 0x393 },
unicodeslot=0x1D71E,
visual="bi",
},
@@ -174224,7 +189838,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL DELTA",
direction="l",
linebreak="al",
- specials={ "font", 0x0394 },
+ specials={ "font", 0x394 },
unicodeslot=0x1D71F,
visual="bi",
},
@@ -174233,7 +189847,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL EPSILON",
direction="l",
linebreak="al",
- specials={ "font", 0x0395 },
+ specials={ "font", 0x395 },
unicodeslot=0x1D720,
visual="bi",
},
@@ -174242,7 +189856,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL ZETA",
direction="l",
linebreak="al",
- specials={ "font", 0x0396 },
+ specials={ "font", 0x396 },
unicodeslot=0x1D721,
visual="bi",
},
@@ -174251,7 +189865,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL ETA",
direction="l",
linebreak="al",
- specials={ "font", 0x0397 },
+ specials={ "font", 0x397 },
unicodeslot=0x1D722,
visual="bi",
},
@@ -174260,7 +189874,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL THETA",
direction="l",
linebreak="al",
- specials={ "font", 0x0398 },
+ specials={ "font", 0x398 },
unicodeslot=0x1D723,
visual="bi",
},
@@ -174269,7 +189883,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL IOTA",
direction="l",
linebreak="al",
- specials={ "font", 0x0399 },
+ specials={ "font", 0x399 },
unicodeslot=0x1D724,
visual="bi",
},
@@ -174278,7 +189892,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL KAPPA",
direction="l",
linebreak="al",
- specials={ "font", 0x039A },
+ specials={ "font", 0x39A },
unicodeslot=0x1D725,
visual="bi",
},
@@ -174287,7 +189901,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL LAMDA",
direction="l",
linebreak="al",
- specials={ "font", 0x039B },
+ specials={ "font", 0x39B },
unicodeslot=0x1D726,
visual="bi",
},
@@ -174296,7 +189910,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL MU",
direction="l",
linebreak="al",
- specials={ "font", 0x039C },
+ specials={ "font", 0x39C },
unicodeslot=0x1D727,
visual="bi",
},
@@ -174305,7 +189919,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL NU",
direction="l",
linebreak="al",
- specials={ "font", 0x039D },
+ specials={ "font", 0x39D },
unicodeslot=0x1D728,
visual="bi",
},
@@ -174314,7 +189928,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL XI",
direction="l",
linebreak="al",
- specials={ "font", 0x039E },
+ specials={ "font", 0x39E },
unicodeslot=0x1D729,
visual="bi",
},
@@ -174323,7 +189937,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL OMICRON",
direction="l",
linebreak="al",
- specials={ "font", 0x039F },
+ specials={ "font", 0x39F },
unicodeslot=0x1D72A,
visual="bi",
},
@@ -174332,7 +189946,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL PI",
direction="l",
linebreak="al",
- specials={ "font", 0x03A0 },
+ specials={ "font", 0x3A0 },
unicodeslot=0x1D72B,
visual="bi",
},
@@ -174341,7 +189955,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL RHO",
direction="l",
linebreak="al",
- specials={ "font", 0x03A1 },
+ specials={ "font", 0x3A1 },
unicodeslot=0x1D72C,
visual="bi",
},
@@ -174350,7 +189964,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03F4 },
+ specials={ "font", 0x3F4 },
unicodeslot=0x1D72D,
visual="bi",
},
@@ -174359,7 +189973,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL SIGMA",
direction="l",
linebreak="al",
- specials={ "font", 0x03A3 },
+ specials={ "font", 0x3A3 },
unicodeslot=0x1D72E,
visual="bi",
},
@@ -174368,7 +189982,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL TAU",
direction="l",
linebreak="al",
- specials={ "font", 0x03A4 },
+ specials={ "font", 0x3A4 },
unicodeslot=0x1D72F,
visual="bi",
},
@@ -174377,7 +189991,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL UPSILON",
direction="l",
linebreak="al",
- specials={ "font", 0x03A5 },
+ specials={ "font", 0x3A5 },
unicodeslot=0x1D730,
visual="bi",
},
@@ -174386,7 +190000,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL PHI",
direction="l",
linebreak="al",
- specials={ "font", 0x03A6 },
+ specials={ "font", 0x3A6 },
unicodeslot=0x1D731,
visual="bi",
},
@@ -174395,7 +190009,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL CHI",
direction="l",
linebreak="al",
- specials={ "font", 0x03A7 },
+ specials={ "font", 0x3A7 },
unicodeslot=0x1D732,
visual="bi",
},
@@ -174404,7 +190018,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL PSI",
direction="l",
linebreak="al",
- specials={ "font", 0x03A8 },
+ specials={ "font", 0x3A8 },
unicodeslot=0x1D733,
visual="bi",
},
@@ -174413,7 +190027,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC CAPITAL OMEGA",
direction="l",
linebreak="al",
- specials={ "font", 0x03A9 },
+ specials={ "font", 0x3A9 },
unicodeslot=0x1D734,
visual="bi",
},
@@ -174431,7 +190045,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL ALPHA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B1 },
+ specials={ "font", 0x3B1 },
unicodeslot=0x1D736,
visual="bi",
},
@@ -174440,7 +190054,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL BETA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B2 },
+ specials={ "font", 0x3B2 },
unicodeslot=0x1D737,
visual="bi",
},
@@ -174449,7 +190063,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL GAMMA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B3 },
+ specials={ "font", 0x3B3 },
unicodeslot=0x1D738,
visual="bi",
},
@@ -174458,7 +190072,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL DELTA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B4 },
+ specials={ "font", 0x3B4 },
unicodeslot=0x1D739,
visual="bi",
},
@@ -174467,7 +190081,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL EPSILON",
direction="l",
linebreak="al",
- specials={ "font", 0x03B5 },
+ specials={ "font", 0x3B5 },
unicodeslot=0x1D73A,
visual="bi",
},
@@ -174476,7 +190090,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL ZETA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B6 },
+ specials={ "font", 0x3B6 },
unicodeslot=0x1D73B,
visual="bi",
},
@@ -174485,7 +190099,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL ETA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B7 },
+ specials={ "font", 0x3B7 },
unicodeslot=0x1D73C,
visual="bi",
},
@@ -174494,7 +190108,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL THETA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B8 },
+ specials={ "font", 0x3B8 },
unicodeslot=0x1D73D,
visual="bi",
},
@@ -174503,7 +190117,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL IOTA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B9 },
+ specials={ "font", 0x3B9 },
unicodeslot=0x1D73E,
visual="bi",
},
@@ -174512,7 +190126,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL KAPPA",
direction="l",
linebreak="al",
- specials={ "font", 0x03BA },
+ specials={ "font", 0x3BA },
unicodeslot=0x1D73F,
visual="bi",
},
@@ -174521,7 +190135,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL LAMDA",
direction="l",
linebreak="al",
- specials={ "font", 0x03BB },
+ specials={ "font", 0x3BB },
unicodeslot=0x1D740,
visual="bi",
},
@@ -174530,7 +190144,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL MU",
direction="l",
linebreak="al",
- specials={ "font", 0x03BC },
+ specials={ "font", 0x3BC },
unicodeslot=0x1D741,
visual="bi",
},
@@ -174539,7 +190153,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL NU",
direction="l",
linebreak="al",
- specials={ "font", 0x03BD },
+ specials={ "font", 0x3BD },
unicodeslot=0x1D742,
visual="bi",
},
@@ -174548,7 +190162,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL XI",
direction="l",
linebreak="al",
- specials={ "font", 0x03BE },
+ specials={ "font", 0x3BE },
unicodeslot=0x1D743,
visual="bi",
},
@@ -174557,7 +190171,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL OMICRON",
direction="l",
linebreak="al",
- specials={ "font", 0x03BF },
+ specials={ "font", 0x3BF },
unicodeslot=0x1D744,
visual="bi",
},
@@ -174566,7 +190180,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL PI",
direction="l",
linebreak="al",
- specials={ "font", 0x03C0 },
+ specials={ "font", 0x3C0 },
unicodeslot=0x1D745,
visual="bi",
},
@@ -174575,7 +190189,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL RHO",
direction="l",
linebreak="al",
- specials={ "font", 0x03C1 },
+ specials={ "font", 0x3C1 },
unicodeslot=0x1D746,
visual="bi",
},
@@ -174584,7 +190198,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA",
direction="l",
linebreak="al",
- specials={ "font", 0x03C2 },
+ specials={ "font", 0x3C2 },
unicodeslot=0x1D747,
visual="bi",
},
@@ -174593,7 +190207,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL SIGMA",
direction="l",
linebreak="al",
- specials={ "font", 0x03C3 },
+ specials={ "font", 0x3C3 },
unicodeslot=0x1D748,
visual="bi",
},
@@ -174602,7 +190216,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL TAU",
direction="l",
linebreak="al",
- specials={ "font", 0x03C4 },
+ specials={ "font", 0x3C4 },
unicodeslot=0x1D749,
visual="bi",
},
@@ -174611,7 +190225,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL UPSILON",
direction="l",
linebreak="al",
- specials={ "font", 0x03C5 },
+ specials={ "font", 0x3C5 },
unicodeslot=0x1D74A,
visual="bi",
},
@@ -174620,7 +190234,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL PHI",
direction="l",
linebreak="al",
- specials={ "font", 0x03C6 },
+ specials={ "font", 0x3C6 },
unicodeslot=0x1D74B,
visual="bi",
},
@@ -174629,7 +190243,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL CHI",
direction="l",
linebreak="al",
- specials={ "font", 0x03C7 },
+ specials={ "font", 0x3C7 },
unicodeslot=0x1D74C,
visual="bi",
},
@@ -174638,7 +190252,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL PSI",
direction="l",
linebreak="al",
- specials={ "font", 0x03C8 },
+ specials={ "font", 0x3C8 },
unicodeslot=0x1D74D,
visual="bi",
},
@@ -174647,7 +190261,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC SMALL OMEGA",
direction="l",
linebreak="al",
- specials={ "font", 0x03C9 },
+ specials={ "font", 0x3C9 },
unicodeslot=0x1D74E,
visual="bi",
},
@@ -174665,7 +190279,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC EPSILON SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03F5 },
+ specials={ "font", 0x3F5 },
unicodeslot=0x1D750,
visual="bi",
},
@@ -174674,7 +190288,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC THETA SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03D1 },
+ specials={ "font", 0x3D1 },
unicodeslot=0x1D751,
visual="bi",
},
@@ -174683,7 +190297,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC KAPPA SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03F0 },
+ specials={ "font", 0x3F0 },
unicodeslot=0x1D752,
visual="bi",
},
@@ -174692,7 +190306,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC PHI SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03D5 },
+ specials={ "font", 0x3D5 },
unicodeslot=0x1D753,
visual="bi",
},
@@ -174701,7 +190315,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC RHO SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03F1 },
+ specials={ "font", 0x3F1 },
unicodeslot=0x1D754,
visual="bi",
},
@@ -174710,7 +190324,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC PI SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03D6 },
+ specials={ "font", 0x3D6 },
unicodeslot=0x1D755,
visual="bi",
},
@@ -174719,7 +190333,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA",
direction="l",
linebreak="al",
- specials={ "font", 0x0391 },
+ specials={ "font", 0x391 },
unicodeslot=0x1D756,
visual="bf",
},
@@ -174728,7 +190342,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA",
direction="l",
linebreak="al",
- specials={ "font", 0x0392 },
+ specials={ "font", 0x392 },
unicodeslot=0x1D757,
visual="bf",
},
@@ -174737,7 +190351,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA",
direction="l",
linebreak="al",
- specials={ "font", 0x0393 },
+ specials={ "font", 0x393 },
unicodeslot=0x1D758,
visual="bf",
},
@@ -174746,7 +190360,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA",
direction="l",
linebreak="al",
- specials={ "font", 0x0394 },
+ specials={ "font", 0x394 },
unicodeslot=0x1D759,
visual="bf",
},
@@ -174755,7 +190369,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON",
direction="l",
linebreak="al",
- specials={ "font", 0x0395 },
+ specials={ "font", 0x395 },
unicodeslot=0x1D75A,
visual="bf",
},
@@ -174764,7 +190378,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA",
direction="l",
linebreak="al",
- specials={ "font", 0x0396 },
+ specials={ "font", 0x396 },
unicodeslot=0x1D75B,
visual="bf",
},
@@ -174773,7 +190387,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA",
direction="l",
linebreak="al",
- specials={ "font", 0x0397 },
+ specials={ "font", 0x397 },
unicodeslot=0x1D75C,
visual="bf",
},
@@ -174782,7 +190396,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA",
direction="l",
linebreak="al",
- specials={ "font", 0x0398 },
+ specials={ "font", 0x398 },
unicodeslot=0x1D75D,
visual="bf",
},
@@ -174791,7 +190405,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA",
direction="l",
linebreak="al",
- specials={ "font", 0x0399 },
+ specials={ "font", 0x399 },
unicodeslot=0x1D75E,
visual="bf",
},
@@ -174800,7 +190414,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA",
direction="l",
linebreak="al",
- specials={ "font", 0x039A },
+ specials={ "font", 0x39A },
unicodeslot=0x1D75F,
visual="bf",
},
@@ -174809,7 +190423,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA",
direction="l",
linebreak="al",
- specials={ "font", 0x039B },
+ specials={ "font", 0x39B },
unicodeslot=0x1D760,
visual="bf",
},
@@ -174818,7 +190432,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL MU",
direction="l",
linebreak="al",
- specials={ "font", 0x039C },
+ specials={ "font", 0x39C },
unicodeslot=0x1D761,
visual="bf",
},
@@ -174827,7 +190441,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL NU",
direction="l",
linebreak="al",
- specials={ "font", 0x039D },
+ specials={ "font", 0x39D },
unicodeslot=0x1D762,
visual="bf",
},
@@ -174836,7 +190450,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL XI",
direction="l",
linebreak="al",
- specials={ "font", 0x039E },
+ specials={ "font", 0x39E },
unicodeslot=0x1D763,
visual="bf",
},
@@ -174845,7 +190459,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON",
direction="l",
linebreak="al",
- specials={ "font", 0x039F },
+ specials={ "font", 0x39F },
unicodeslot=0x1D764,
visual="bf",
},
@@ -174854,7 +190468,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL PI",
direction="l",
linebreak="al",
- specials={ "font", 0x03A0 },
+ specials={ "font", 0x3A0 },
unicodeslot=0x1D765,
visual="bf",
},
@@ -174863,7 +190477,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO",
direction="l",
linebreak="al",
- specials={ "font", 0x03A1 },
+ specials={ "font", 0x3A1 },
unicodeslot=0x1D766,
visual="bf",
},
@@ -174872,7 +190486,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03F4 },
+ specials={ "font", 0x3F4 },
unicodeslot=0x1D767,
visual="bf",
},
@@ -174881,7 +190495,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA",
direction="l",
linebreak="al",
- specials={ "font", 0x03A3 },
+ specials={ "font", 0x3A3 },
unicodeslot=0x1D768,
visual="bf",
},
@@ -174890,7 +190504,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU",
direction="l",
linebreak="al",
- specials={ "font", 0x03A4 },
+ specials={ "font", 0x3A4 },
unicodeslot=0x1D769,
visual="bf",
},
@@ -174899,7 +190513,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON",
direction="l",
linebreak="al",
- specials={ "font", 0x03A5 },
+ specials={ "font", 0x3A5 },
unicodeslot=0x1D76A,
visual="bf",
},
@@ -174908,7 +190522,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI",
direction="l",
linebreak="al",
- specials={ "font", 0x03A6 },
+ specials={ "font", 0x3A6 },
unicodeslot=0x1D76B,
visual="bf",
},
@@ -174917,7 +190531,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI",
direction="l",
linebreak="al",
- specials={ "font", 0x03A7 },
+ specials={ "font", 0x3A7 },
unicodeslot=0x1D76C,
visual="bf",
},
@@ -174926,7 +190540,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI",
direction="l",
linebreak="al",
- specials={ "font", 0x03A8 },
+ specials={ "font", 0x3A8 },
unicodeslot=0x1D76D,
visual="bf",
},
@@ -174935,7 +190549,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA",
direction="l",
linebreak="al",
- specials={ "font", 0x03A9 },
+ specials={ "font", 0x3A9 },
unicodeslot=0x1D76E,
visual="bf",
},
@@ -174953,7 +190567,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B1 },
+ specials={ "font", 0x3B1 },
unicodeslot=0x1D770,
visual="bf",
},
@@ -174962,7 +190576,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL BETA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B2 },
+ specials={ "font", 0x3B2 },
unicodeslot=0x1D771,
visual="bf",
},
@@ -174971,7 +190585,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B3 },
+ specials={ "font", 0x3B3 },
unicodeslot=0x1D772,
visual="bf",
},
@@ -174980,7 +190594,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL DELTA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B4 },
+ specials={ "font", 0x3B4 },
unicodeslot=0x1D773,
visual="bf",
},
@@ -174989,7 +190603,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON",
direction="l",
linebreak="al",
- specials={ "font", 0x03B5 },
+ specials={ "font", 0x3B5 },
unicodeslot=0x1D774,
visual="bf",
},
@@ -174998,7 +190612,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL ZETA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B6 },
+ specials={ "font", 0x3B6 },
unicodeslot=0x1D775,
visual="bf",
},
@@ -175007,7 +190621,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL ETA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B7 },
+ specials={ "font", 0x3B7 },
unicodeslot=0x1D776,
visual="bf",
},
@@ -175016,7 +190630,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL THETA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B8 },
+ specials={ "font", 0x3B8 },
unicodeslot=0x1D777,
visual="bf",
},
@@ -175025,7 +190639,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL IOTA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B9 },
+ specials={ "font", 0x3B9 },
unicodeslot=0x1D778,
visual="bf",
},
@@ -175034,7 +190648,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA",
direction="l",
linebreak="al",
- specials={ "font", 0x03BA },
+ specials={ "font", 0x3BA },
unicodeslot=0x1D779,
visual="bf",
},
@@ -175043,7 +190657,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA",
direction="l",
linebreak="al",
- specials={ "font", 0x03BB },
+ specials={ "font", 0x3BB },
unicodeslot=0x1D77A,
visual="bf",
},
@@ -175052,7 +190666,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL MU",
direction="l",
linebreak="al",
- specials={ "font", 0x03BC },
+ specials={ "font", 0x3BC },
unicodeslot=0x1D77B,
visual="bf",
},
@@ -175061,7 +190675,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL NU",
direction="l",
linebreak="al",
- specials={ "font", 0x03BD },
+ specials={ "font", 0x3BD },
unicodeslot=0x1D77C,
visual="bf",
},
@@ -175070,7 +190684,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL XI",
direction="l",
linebreak="al",
- specials={ "font", 0x03BE },
+ specials={ "font", 0x3BE },
unicodeslot=0x1D77D,
visual="bf",
},
@@ -175079,7 +190693,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON",
direction="l",
linebreak="al",
- specials={ "font", 0x03BF },
+ specials={ "font", 0x3BF },
unicodeslot=0x1D77E,
visual="bf",
},
@@ -175088,7 +190702,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL PI",
direction="l",
linebreak="al",
- specials={ "font", 0x03C0 },
+ specials={ "font", 0x3C0 },
unicodeslot=0x1D77F,
visual="bf",
},
@@ -175097,7 +190711,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL RHO",
direction="l",
linebreak="al",
- specials={ "font", 0x03C1 },
+ specials={ "font", 0x3C1 },
unicodeslot=0x1D780,
visual="bf",
},
@@ -175106,7 +190720,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA",
direction="l",
linebreak="al",
- specials={ "font", 0x03C2 },
+ specials={ "font", 0x3C2 },
unicodeslot=0x1D781,
visual="bf",
},
@@ -175115,7 +190729,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA",
direction="l",
linebreak="al",
- specials={ "font", 0x03C3 },
+ specials={ "font", 0x3C3 },
unicodeslot=0x1D782,
visual="bf",
},
@@ -175124,7 +190738,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL TAU",
direction="l",
linebreak="al",
- specials={ "font", 0x03C4 },
+ specials={ "font", 0x3C4 },
unicodeslot=0x1D783,
visual="bf",
},
@@ -175133,7 +190747,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON",
direction="l",
linebreak="al",
- specials={ "font", 0x03C5 },
+ specials={ "font", 0x3C5 },
unicodeslot=0x1D784,
visual="bf",
},
@@ -175142,7 +190756,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL PHI",
direction="l",
linebreak="al",
- specials={ "font", 0x03C6 },
+ specials={ "font", 0x3C6 },
unicodeslot=0x1D785,
visual="bf",
},
@@ -175151,7 +190765,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL CHI",
direction="l",
linebreak="al",
- specials={ "font", 0x03C7 },
+ specials={ "font", 0x3C7 },
unicodeslot=0x1D786,
visual="bf",
},
@@ -175160,7 +190774,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL PSI",
direction="l",
linebreak="al",
- specials={ "font", 0x03C8 },
+ specials={ "font", 0x3C8 },
unicodeslot=0x1D787,
visual="bf",
},
@@ -175169,7 +190783,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA",
direction="l",
linebreak="al",
- specials={ "font", 0x03C9 },
+ specials={ "font", 0x3C9 },
unicodeslot=0x1D788,
visual="bf",
},
@@ -175187,7 +190801,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03F5 },
+ specials={ "font", 0x3F5 },
unicodeslot=0x1D78A,
visual="bf",
},
@@ -175196,7 +190810,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03D1 },
+ specials={ "font", 0x3D1 },
unicodeslot=0x1D78B,
visual="bf",
},
@@ -175205,7 +190819,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03F0 },
+ specials={ "font", 0x3F0 },
unicodeslot=0x1D78C,
visual="bf",
},
@@ -175214,7 +190828,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03D5 },
+ specials={ "font", 0x3D5 },
unicodeslot=0x1D78D,
visual="bf",
},
@@ -175223,7 +190837,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03F1 },
+ specials={ "font", 0x3F1 },
unicodeslot=0x1D78E,
visual="bf",
},
@@ -175232,7 +190846,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD PI SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03D6 },
+ specials={ "font", 0x3D6 },
unicodeslot=0x1D78F,
visual="bf",
},
@@ -175241,7 +190855,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA",
direction="l",
linebreak="al",
- specials={ "font", 0x0391 },
+ specials={ "font", 0x391 },
unicodeslot=0x1D790,
visual="bi",
},
@@ -175250,7 +190864,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA",
direction="l",
linebreak="al",
- specials={ "font", 0x0392 },
+ specials={ "font", 0x392 },
unicodeslot=0x1D791,
visual="bi",
},
@@ -175259,7 +190873,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA",
direction="l",
linebreak="al",
- specials={ "font", 0x0393 },
+ specials={ "font", 0x393 },
unicodeslot=0x1D792,
visual="bi",
},
@@ -175268,7 +190882,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA",
direction="l",
linebreak="al",
- specials={ "font", 0x0394 },
+ specials={ "font", 0x394 },
unicodeslot=0x1D793,
visual="bi",
},
@@ -175277,7 +190891,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON",
direction="l",
linebreak="al",
- specials={ "font", 0x0395 },
+ specials={ "font", 0x395 },
unicodeslot=0x1D794,
visual="bi",
},
@@ -175286,7 +190900,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA",
direction="l",
linebreak="al",
- specials={ "font", 0x0396 },
+ specials={ "font", 0x396 },
unicodeslot=0x1D795,
visual="bi",
},
@@ -175295,7 +190909,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA",
direction="l",
linebreak="al",
- specials={ "font", 0x0397 },
+ specials={ "font", 0x397 },
unicodeslot=0x1D796,
visual="bi",
},
@@ -175304,7 +190918,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA",
direction="l",
linebreak="al",
- specials={ "font", 0x0398 },
+ specials={ "font", 0x398 },
unicodeslot=0x1D797,
visual="bi",
},
@@ -175313,7 +190927,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA",
direction="l",
linebreak="al",
- specials={ "font", 0x0399 },
+ specials={ "font", 0x399 },
unicodeslot=0x1D798,
visual="bi",
},
@@ -175322,7 +190936,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA",
direction="l",
linebreak="al",
- specials={ "font", 0x039A },
+ specials={ "font", 0x39A },
unicodeslot=0x1D799,
visual="bi",
},
@@ -175331,7 +190945,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA",
direction="l",
linebreak="al",
- specials={ "font", 0x039B },
+ specials={ "font", 0x39B },
unicodeslot=0x1D79A,
visual="bi",
},
@@ -175340,7 +190954,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU",
direction="l",
linebreak="al",
- specials={ "font", 0x039C },
+ specials={ "font", 0x39C },
unicodeslot=0x1D79B,
visual="bi",
},
@@ -175349,7 +190963,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU",
direction="l",
linebreak="al",
- specials={ "font", 0x039D },
+ specials={ "font", 0x39D },
unicodeslot=0x1D79C,
visual="bi",
},
@@ -175358,7 +190972,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI",
direction="l",
linebreak="al",
- specials={ "font", 0x039E },
+ specials={ "font", 0x39E },
unicodeslot=0x1D79D,
visual="bi",
},
@@ -175367,7 +190981,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON",
direction="l",
linebreak="al",
- specials={ "font", 0x039F },
+ specials={ "font", 0x39F },
unicodeslot=0x1D79E,
visual="bi",
},
@@ -175376,7 +190990,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI",
direction="l",
linebreak="al",
- specials={ "font", 0x03A0 },
+ specials={ "font", 0x3A0 },
unicodeslot=0x1D79F,
visual="bi",
},
@@ -175385,7 +190999,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO",
direction="l",
linebreak="al",
- specials={ "font", 0x03A1 },
+ specials={ "font", 0x3A1 },
unicodeslot=0x1D7A0,
visual="bi",
},
@@ -175394,7 +191008,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03F4 },
+ specials={ "font", 0x3F4 },
unicodeslot=0x1D7A1,
visual="bi",
},
@@ -175403,7 +191017,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA",
direction="l",
linebreak="al",
- specials={ "font", 0x03A3 },
+ specials={ "font", 0x3A3 },
unicodeslot=0x1D7A2,
visual="bi",
},
@@ -175412,7 +191026,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU",
direction="l",
linebreak="al",
- specials={ "font", 0x03A4 },
+ specials={ "font", 0x3A4 },
unicodeslot=0x1D7A3,
visual="bi",
},
@@ -175421,7 +191035,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON",
direction="l",
linebreak="al",
- specials={ "font", 0x03A5 },
+ specials={ "font", 0x3A5 },
unicodeslot=0x1D7A4,
visual="bi",
},
@@ -175430,7 +191044,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI",
direction="l",
linebreak="al",
- specials={ "font", 0x03A6 },
+ specials={ "font", 0x3A6 },
unicodeslot=0x1D7A5,
visual="bi",
},
@@ -175439,7 +191053,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI",
direction="l",
linebreak="al",
- specials={ "font", 0x03A7 },
+ specials={ "font", 0x3A7 },
unicodeslot=0x1D7A6,
visual="bi",
},
@@ -175448,7 +191062,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI",
direction="l",
linebreak="al",
- specials={ "font", 0x03A8 },
+ specials={ "font", 0x3A8 },
unicodeslot=0x1D7A7,
visual="bi",
},
@@ -175457,7 +191071,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA",
direction="l",
linebreak="al",
- specials={ "font", 0x03A9 },
+ specials={ "font", 0x3A9 },
unicodeslot=0x1D7A8,
visual="bi",
},
@@ -175475,7 +191089,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B1 },
+ specials={ "font", 0x3B1 },
unicodeslot=0x1D7AA,
visual="bi",
},
@@ -175484,7 +191098,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B2 },
+ specials={ "font", 0x3B2 },
unicodeslot=0x1D7AB,
visual="bi",
},
@@ -175493,7 +191107,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B3 },
+ specials={ "font", 0x3B3 },
unicodeslot=0x1D7AC,
visual="bi",
},
@@ -175502,7 +191116,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B4 },
+ specials={ "font", 0x3B4 },
unicodeslot=0x1D7AD,
visual="bi",
},
@@ -175511,7 +191125,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON",
direction="l",
linebreak="al",
- specials={ "font", 0x03B5 },
+ specials={ "font", 0x3B5 },
unicodeslot=0x1D7AE,
visual="bi",
},
@@ -175520,7 +191134,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B6 },
+ specials={ "font", 0x3B6 },
unicodeslot=0x1D7AF,
visual="bi",
},
@@ -175529,7 +191143,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B7 },
+ specials={ "font", 0x3B7 },
unicodeslot=0x1D7B0,
visual="bi",
},
@@ -175538,7 +191152,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B8 },
+ specials={ "font", 0x3B8 },
unicodeslot=0x1D7B1,
visual="bi",
},
@@ -175547,7 +191161,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA",
direction="l",
linebreak="al",
- specials={ "font", 0x03B9 },
+ specials={ "font", 0x3B9 },
unicodeslot=0x1D7B2,
visual="bi",
},
@@ -175556,7 +191170,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA",
direction="l",
linebreak="al",
- specials={ "font", 0x03BA },
+ specials={ "font", 0x3BA },
unicodeslot=0x1D7B3,
visual="bi",
},
@@ -175565,7 +191179,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA",
direction="l",
linebreak="al",
- specials={ "font", 0x03BB },
+ specials={ "font", 0x3BB },
unicodeslot=0x1D7B4,
visual="bi",
},
@@ -175574,7 +191188,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU",
direction="l",
linebreak="al",
- specials={ "font", 0x03BC },
+ specials={ "font", 0x3BC },
unicodeslot=0x1D7B5,
visual="bi",
},
@@ -175583,7 +191197,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU",
direction="l",
linebreak="al",
- specials={ "font", 0x03BD },
+ specials={ "font", 0x3BD },
unicodeslot=0x1D7B6,
visual="bi",
},
@@ -175592,7 +191206,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI",
direction="l",
linebreak="al",
- specials={ "font", 0x03BE },
+ specials={ "font", 0x3BE },
unicodeslot=0x1D7B7,
visual="bi",
},
@@ -175601,7 +191215,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON",
direction="l",
linebreak="al",
- specials={ "font", 0x03BF },
+ specials={ "font", 0x3BF },
unicodeslot=0x1D7B8,
visual="bi",
},
@@ -175610,7 +191224,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI",
direction="l",
linebreak="al",
- specials={ "font", 0x03C0 },
+ specials={ "font", 0x3C0 },
unicodeslot=0x1D7B9,
visual="bi",
},
@@ -175619,7 +191233,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO",
direction="l",
linebreak="al",
- specials={ "font", 0x03C1 },
+ specials={ "font", 0x3C1 },
unicodeslot=0x1D7BA,
visual="bi",
},
@@ -175628,7 +191242,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA",
direction="l",
linebreak="al",
- specials={ "font", 0x03C2 },
+ specials={ "font", 0x3C2 },
unicodeslot=0x1D7BB,
visual="bi",
},
@@ -175637,7 +191251,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA",
direction="l",
linebreak="al",
- specials={ "font", 0x03C3 },
+ specials={ "font", 0x3C3 },
unicodeslot=0x1D7BC,
visual="bi",
},
@@ -175646,7 +191260,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU",
direction="l",
linebreak="al",
- specials={ "font", 0x03C4 },
+ specials={ "font", 0x3C4 },
unicodeslot=0x1D7BD,
visual="bi",
},
@@ -175655,7 +191269,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON",
direction="l",
linebreak="al",
- specials={ "font", 0x03C5 },
+ specials={ "font", 0x3C5 },
unicodeslot=0x1D7BE,
visual="bi",
},
@@ -175664,7 +191278,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI",
direction="l",
linebreak="al",
- specials={ "font", 0x03C6 },
+ specials={ "font", 0x3C6 },
unicodeslot=0x1D7BF,
visual="bi",
},
@@ -175673,7 +191287,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI",
direction="l",
linebreak="al",
- specials={ "font", 0x03C7 },
+ specials={ "font", 0x3C7 },
unicodeslot=0x1D7C0,
visual="bi",
},
@@ -175682,7 +191296,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI",
direction="l",
linebreak="al",
- specials={ "font", 0x03C8 },
+ specials={ "font", 0x3C8 },
unicodeslot=0x1D7C1,
visual="bi",
},
@@ -175691,7 +191305,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA",
direction="l",
linebreak="al",
- specials={ "font", 0x03C9 },
+ specials={ "font", 0x3C9 },
unicodeslot=0x1D7C2,
visual="bi",
},
@@ -175709,7 +191323,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03F5 },
+ specials={ "font", 0x3F5 },
unicodeslot=0x1D7C4,
visual="bi",
},
@@ -175718,7 +191332,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03D1 },
+ specials={ "font", 0x3D1 },
unicodeslot=0x1D7C5,
visual="bi",
},
@@ -175727,7 +191341,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03F0 },
+ specials={ "font", 0x3F0 },
unicodeslot=0x1D7C6,
visual="bi",
},
@@ -175736,7 +191350,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03D5 },
+ specials={ "font", 0x3D5 },
unicodeslot=0x1D7C7,
visual="bi",
},
@@ -175745,7 +191359,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03F1 },
+ specials={ "font", 0x3F1 },
unicodeslot=0x1D7C8,
visual="bi",
},
@@ -175754,7 +191368,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL",
direction="l",
linebreak="al",
- specials={ "font", 0x03D6 },
+ specials={ "font", 0x3D6 },
unicodeslot=0x1D7C9,
visual="bi",
},
@@ -175763,7 +191377,7 @@ characters.data={
description="MATHEMATICAL BOLD CAPITAL DIGAMMA",
direction="l",
linebreak="al",
- specials={ "font", 0x03DC },
+ specials={ "font", 0x3DC },
unicodeslot=0x1D7CA,
visual="bf",
},
@@ -175772,7 +191386,7 @@ characters.data={
description="MATHEMATICAL BOLD SMALL DIGAMMA",
direction="l",
linebreak="al",
- specials={ "font", 0x03DD },
+ specials={ "font", 0x3DD },
unicodeslot=0x1D7CB,
visual="bf",
},
@@ -175781,7 +191395,7 @@ characters.data={
description="MATHEMATICAL BOLD DIGIT ZERO",
direction="en",
linebreak="nu",
- specials={ "font", 0x0030 },
+ specials={ "font", 0x30 },
unicodeslot=0x1D7CE,
visual="bf",
},
@@ -175790,7 +191404,7 @@ characters.data={
description="MATHEMATICAL BOLD DIGIT ONE",
direction="en",
linebreak="nu",
- specials={ "font", 0x0031 },
+ specials={ "font", 0x31 },
unicodeslot=0x1D7CF,
visual="bf",
},
@@ -175799,7 +191413,7 @@ characters.data={
description="MATHEMATICAL BOLD DIGIT TWO",
direction="en",
linebreak="nu",
- specials={ "font", 0x0032 },
+ specials={ "font", 0x32 },
unicodeslot=0x1D7D0,
visual="bf",
},
@@ -175808,7 +191422,7 @@ characters.data={
description="MATHEMATICAL BOLD DIGIT THREE",
direction="en",
linebreak="nu",
- specials={ "font", 0x0033 },
+ specials={ "font", 0x33 },
unicodeslot=0x1D7D1,
visual="bf",
},
@@ -175817,7 +191431,7 @@ characters.data={
description="MATHEMATICAL BOLD DIGIT FOUR",
direction="en",
linebreak="nu",
- specials={ "font", 0x0034 },
+ specials={ "font", 0x34 },
unicodeslot=0x1D7D2,
visual="bf",
},
@@ -175826,7 +191440,7 @@ characters.data={
description="MATHEMATICAL BOLD DIGIT FIVE",
direction="en",
linebreak="nu",
- specials={ "font", 0x0035 },
+ specials={ "font", 0x35 },
unicodeslot=0x1D7D3,
visual="bf",
},
@@ -175835,7 +191449,7 @@ characters.data={
description="MATHEMATICAL BOLD DIGIT SIX",
direction="en",
linebreak="nu",
- specials={ "font", 0x0036 },
+ specials={ "font", 0x36 },
unicodeslot=0x1D7D4,
visual="bf",
},
@@ -175844,7 +191458,7 @@ characters.data={
description="MATHEMATICAL BOLD DIGIT SEVEN",
direction="en",
linebreak="nu",
- specials={ "font", 0x0037 },
+ specials={ "font", 0x37 },
unicodeslot=0x1D7D5,
visual="bf",
},
@@ -175853,7 +191467,7 @@ characters.data={
description="MATHEMATICAL BOLD DIGIT EIGHT",
direction="en",
linebreak="nu",
- specials={ "font", 0x0038 },
+ specials={ "font", 0x38 },
unicodeslot=0x1D7D6,
visual="bf",
},
@@ -175862,7 +191476,7 @@ characters.data={
description="MATHEMATICAL BOLD DIGIT NINE",
direction="en",
linebreak="nu",
- specials={ "font", 0x0039 },
+ specials={ "font", 0x39 },
unicodeslot=0x1D7D7,
visual="bf",
},
@@ -175871,7 +191485,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO",
direction="en",
linebreak="nu",
- specials={ "font", 0x0030 },
+ specials={ "font", 0x30 },
unicodeslot=0x1D7D8,
},
[0x1D7D9]={
@@ -175879,7 +191493,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK DIGIT ONE",
direction="en",
linebreak="nu",
- specials={ "font", 0x0031 },
+ specials={ "font", 0x31 },
unicodeslot=0x1D7D9,
},
[0x1D7DA]={
@@ -175887,7 +191501,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK DIGIT TWO",
direction="en",
linebreak="nu",
- specials={ "font", 0x0032 },
+ specials={ "font", 0x32 },
unicodeslot=0x1D7DA,
},
[0x1D7DB]={
@@ -175895,7 +191509,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK DIGIT THREE",
direction="en",
linebreak="nu",
- specials={ "font", 0x0033 },
+ specials={ "font", 0x33 },
unicodeslot=0x1D7DB,
},
[0x1D7DC]={
@@ -175903,7 +191517,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR",
direction="en",
linebreak="nu",
- specials={ "font", 0x0034 },
+ specials={ "font", 0x34 },
unicodeslot=0x1D7DC,
},
[0x1D7DD]={
@@ -175911,7 +191525,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE",
direction="en",
linebreak="nu",
- specials={ "font", 0x0035 },
+ specials={ "font", 0x35 },
unicodeslot=0x1D7DD,
},
[0x1D7DE]={
@@ -175919,7 +191533,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK DIGIT SIX",
direction="en",
linebreak="nu",
- specials={ "font", 0x0036 },
+ specials={ "font", 0x36 },
unicodeslot=0x1D7DE,
},
[0x1D7DF]={
@@ -175927,7 +191541,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN",
direction="en",
linebreak="nu",
- specials={ "font", 0x0037 },
+ specials={ "font", 0x37 },
unicodeslot=0x1D7DF,
},
[0x1D7E0]={
@@ -175935,7 +191549,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT",
direction="en",
linebreak="nu",
- specials={ "font", 0x0038 },
+ specials={ "font", 0x38 },
unicodeslot=0x1D7E0,
},
[0x1D7E1]={
@@ -175943,7 +191557,7 @@ characters.data={
description="MATHEMATICAL DOUBLE-STRUCK DIGIT NINE",
direction="en",
linebreak="nu",
- specials={ "font", 0x0039 },
+ specials={ "font", 0x39 },
unicodeslot=0x1D7E1,
},
[0x1D7E2]={
@@ -175951,7 +191565,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF DIGIT ZERO",
direction="en",
linebreak="nu",
- specials={ "font", 0x0030 },
+ specials={ "font", 0x30 },
unicodeslot=0x1D7E2,
},
[0x1D7E3]={
@@ -175959,7 +191573,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF DIGIT ONE",
direction="en",
linebreak="nu",
- specials={ "font", 0x0031 },
+ specials={ "font", 0x31 },
unicodeslot=0x1D7E3,
},
[0x1D7E4]={
@@ -175967,7 +191581,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF DIGIT TWO",
direction="en",
linebreak="nu",
- specials={ "font", 0x0032 },
+ specials={ "font", 0x32 },
unicodeslot=0x1D7E4,
},
[0x1D7E5]={
@@ -175975,7 +191589,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF DIGIT THREE",
direction="en",
linebreak="nu",
- specials={ "font", 0x0033 },
+ specials={ "font", 0x33 },
unicodeslot=0x1D7E5,
},
[0x1D7E6]={
@@ -175983,7 +191597,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF DIGIT FOUR",
direction="en",
linebreak="nu",
- specials={ "font", 0x0034 },
+ specials={ "font", 0x34 },
unicodeslot=0x1D7E6,
},
[0x1D7E7]={
@@ -175991,7 +191605,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF DIGIT FIVE",
direction="en",
linebreak="nu",
- specials={ "font", 0x0035 },
+ specials={ "font", 0x35 },
unicodeslot=0x1D7E7,
},
[0x1D7E8]={
@@ -175999,7 +191613,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF DIGIT SIX",
direction="en",
linebreak="nu",
- specials={ "font", 0x0036 },
+ specials={ "font", 0x36 },
unicodeslot=0x1D7E8,
},
[0x1D7E9]={
@@ -176007,7 +191621,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF DIGIT SEVEN",
direction="en",
linebreak="nu",
- specials={ "font", 0x0037 },
+ specials={ "font", 0x37 },
unicodeslot=0x1D7E9,
},
[0x1D7EA]={
@@ -176015,7 +191629,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF DIGIT EIGHT",
direction="en",
linebreak="nu",
- specials={ "font", 0x0038 },
+ specials={ "font", 0x38 },
unicodeslot=0x1D7EA,
},
[0x1D7EB]={
@@ -176023,7 +191637,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF DIGIT NINE",
direction="en",
linebreak="nu",
- specials={ "font", 0x0039 },
+ specials={ "font", 0x39 },
unicodeslot=0x1D7EB,
},
[0x1D7EC]={
@@ -176031,7 +191645,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO",
direction="en",
linebreak="nu",
- specials={ "font", 0x0030 },
+ specials={ "font", 0x30 },
unicodeslot=0x1D7EC,
visual="bf",
},
@@ -176040,7 +191654,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD DIGIT ONE",
direction="en",
linebreak="nu",
- specials={ "font", 0x0031 },
+ specials={ "font", 0x31 },
unicodeslot=0x1D7ED,
visual="bf",
},
@@ -176049,7 +191663,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD DIGIT TWO",
direction="en",
linebreak="nu",
- specials={ "font", 0x0032 },
+ specials={ "font", 0x32 },
unicodeslot=0x1D7EE,
visual="bf",
},
@@ -176058,7 +191672,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD DIGIT THREE",
direction="en",
linebreak="nu",
- specials={ "font", 0x0033 },
+ specials={ "font", 0x33 },
unicodeslot=0x1D7EF,
visual="bf",
},
@@ -176067,7 +191681,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR",
direction="en",
linebreak="nu",
- specials={ "font", 0x0034 },
+ specials={ "font", 0x34 },
unicodeslot=0x1D7F0,
visual="bf",
},
@@ -176076,7 +191690,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE",
direction="en",
linebreak="nu",
- specials={ "font", 0x0035 },
+ specials={ "font", 0x35 },
unicodeslot=0x1D7F1,
visual="bf",
},
@@ -176085,7 +191699,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD DIGIT SIX",
direction="en",
linebreak="nu",
- specials={ "font", 0x0036 },
+ specials={ "font", 0x36 },
unicodeslot=0x1D7F2,
visual="bf",
},
@@ -176094,7 +191708,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN",
direction="en",
linebreak="nu",
- specials={ "font", 0x0037 },
+ specials={ "font", 0x37 },
unicodeslot=0x1D7F3,
visual="bf",
},
@@ -176103,7 +191717,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT",
direction="en",
linebreak="nu",
- specials={ "font", 0x0038 },
+ specials={ "font", 0x38 },
unicodeslot=0x1D7F4,
visual="bf",
},
@@ -176112,7 +191726,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD DIGIT NINE",
direction="en",
linebreak="nu",
- specials={ "font", 0x0039 },
+ specials={ "font", 0x39 },
unicodeslot=0x1D7F5,
visual="bf",
},
@@ -176121,7 +191735,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE DIGIT ZERO",
direction="en",
linebreak="nu",
- specials={ "font", 0x0030 },
+ specials={ "font", 0x30 },
unicodeslot=0x1D7F6,
},
[0x1D7F7]={
@@ -176129,7 +191743,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE DIGIT ONE",
direction="en",
linebreak="nu",
- specials={ "font", 0x0031 },
+ specials={ "font", 0x31 },
unicodeslot=0x1D7F7,
},
[0x1D7F8]={
@@ -176137,7 +191751,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE DIGIT TWO",
direction="en",
linebreak="nu",
- specials={ "font", 0x0032 },
+ specials={ "font", 0x32 },
unicodeslot=0x1D7F8,
},
[0x1D7F9]={
@@ -176145,7 +191759,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE DIGIT THREE",
direction="en",
linebreak="nu",
- specials={ "font", 0x0033 },
+ specials={ "font", 0x33 },
unicodeslot=0x1D7F9,
},
[0x1D7FA]={
@@ -176153,7 +191767,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE DIGIT FOUR",
direction="en",
linebreak="nu",
- specials={ "font", 0x0034 },
+ specials={ "font", 0x34 },
unicodeslot=0x1D7FA,
},
[0x1D7FB]={
@@ -176161,7 +191775,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE DIGIT FIVE",
direction="en",
linebreak="nu",
- specials={ "font", 0x0035 },
+ specials={ "font", 0x35 },
unicodeslot=0x1D7FB,
},
[0x1D7FC]={
@@ -176169,7 +191783,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE DIGIT SIX",
direction="en",
linebreak="nu",
- specials={ "font", 0x0036 },
+ specials={ "font", 0x36 },
unicodeslot=0x1D7FC,
},
[0x1D7FD]={
@@ -176177,7 +191791,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE DIGIT SEVEN",
direction="en",
linebreak="nu",
- specials={ "font", 0x0037 },
+ specials={ "font", 0x37 },
unicodeslot=0x1D7FD,
},
[0x1D7FE]={
@@ -176185,7 +191799,7 @@ characters.data={
description="MATHEMATICAL MONOSPACE DIGIT EIGHT",
direction="en",
linebreak="nu",
- specials={ "font", 0x0038 },
+ specials={ "font", 0x38 },
unicodeslot=0x1D7FE,
},
[0x1D7FF]={
@@ -176193,16 +191807,1514 @@ characters.data={
description="MATHEMATICAL MONOSPACE DIGIT NINE",
direction="en",
linebreak="nu",
- specials={ "font", 0x0039 },
+ specials={ "font", 0x39 },
unicodeslot=0x1D7FF,
},
+ [0x1E800]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M001 KI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E800,
+ },
+ [0x1E801]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M002 KA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E801,
+ },
+ [0x1E802]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M003 KU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E802,
+ },
+ [0x1E803]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M065 KEE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E803,
+ },
+ [0x1E804]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M095 KE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E804,
+ },
+ [0x1E805]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M076 KOO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E805,
+ },
+ [0x1E806]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M048 KO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E806,
+ },
+ [0x1E807]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M179 KUA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E807,
+ },
+ [0x1E808]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M004 WI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E808,
+ },
+ [0x1E809]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M005 WA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E809,
+ },
+ [0x1E80A]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M006 WU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E80A,
+ },
+ [0x1E80B]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M126 WEE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E80B,
+ },
+ [0x1E80C]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M118 WE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E80C,
+ },
+ [0x1E80D]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M114 WOO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E80D,
+ },
+ [0x1E80E]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M045 WO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E80E,
+ },
+ [0x1E80F]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M194 WUI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E80F,
+ },
+ [0x1E810]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M143 WEI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E810,
+ },
+ [0x1E811]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M061 WVI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E811,
+ },
+ [0x1E812]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M049 WVA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E812,
+ },
+ [0x1E813]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M139 WVE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E813,
+ },
+ [0x1E814]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M007 MIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E814,
+ },
+ [0x1E815]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M008 MAN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E815,
+ },
+ [0x1E816]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M009 MUN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E816,
+ },
+ [0x1E817]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M059 MEN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E817,
+ },
+ [0x1E818]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M094 MON",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E818,
+ },
+ [0x1E819]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M154 MUAN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E819,
+ },
+ [0x1E81A]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M189 MUEN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E81A,
+ },
+ [0x1E81B]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M010 BI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E81B,
+ },
+ [0x1E81C]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M011 BA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E81C,
+ },
+ [0x1E81D]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M012 BU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E81D,
+ },
+ [0x1E81E]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M150 BEE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E81E,
+ },
+ [0x1E81F]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M097 BE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E81F,
+ },
+ [0x1E820]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M103 BOO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E820,
+ },
+ [0x1E821]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M138 BO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E821,
+ },
+ [0x1E822]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M013 I",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E822,
+ },
+ [0x1E823]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M014 A",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E823,
+ },
+ [0x1E824]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M015 U",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E824,
+ },
+ [0x1E825]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M163 EE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E825,
+ },
+ [0x1E826]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M100 E",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E826,
+ },
+ [0x1E827]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M165 OO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E827,
+ },
+ [0x1E828]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M147 O",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E828,
+ },
+ [0x1E829]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M137 EI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E829,
+ },
+ [0x1E82A]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M131 IN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E82A,
+ },
+ [0x1E82B]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M135 IN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E82B,
+ },
+ [0x1E82C]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M195 AN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E82C,
+ },
+ [0x1E82D]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M178 EN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E82D,
+ },
+ [0x1E82E]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M019 SI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E82E,
+ },
+ [0x1E82F]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M020 SA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E82F,
+ },
+ [0x1E830]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M021 SU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E830,
+ },
+ [0x1E831]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M162 SEE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E831,
+ },
+ [0x1E832]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M116 SE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E832,
+ },
+ [0x1E833]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M136 SOO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E833,
+ },
+ [0x1E834]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M079 SO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E834,
+ },
+ [0x1E835]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M196 SIA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E835,
+ },
+ [0x1E836]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M025 LI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E836,
+ },
+ [0x1E837]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M026 LA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E837,
+ },
+ [0x1E838]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M027 LU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E838,
+ },
+ [0x1E839]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M084 LEE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E839,
+ },
+ [0x1E83A]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M073 LE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E83A,
+ },
+ [0x1E83B]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M054 LOO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E83B,
+ },
+ [0x1E83C]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M153 LO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E83C,
+ },
+ [0x1E83D]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M110 LONG LE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E83D,
+ },
+ [0x1E83E]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M016 DI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E83E,
+ },
+ [0x1E83F]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M017 DA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E83F,
+ },
+ [0x1E840]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M018 DU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E840,
+ },
+ [0x1E841]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M089 DEE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E841,
+ },
+ [0x1E842]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M180 DOO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E842,
+ },
+ [0x1E843]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M181 DO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E843,
+ },
+ [0x1E844]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M022 TI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E844,
+ },
+ [0x1E845]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M023 TA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E845,
+ },
+ [0x1E846]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M024 TU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E846,
+ },
+ [0x1E847]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M091 TEE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E847,
+ },
+ [0x1E848]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M055 TE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E848,
+ },
+ [0x1E849]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M104 TOO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E849,
+ },
+ [0x1E84A]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M069 TO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E84A,
+ },
+ [0x1E84B]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M028 JI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E84B,
+ },
+ [0x1E84C]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M029 JA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E84C,
+ },
+ [0x1E84D]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M030 JU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E84D,
+ },
+ [0x1E84E]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M157 JEE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E84E,
+ },
+ [0x1E84F]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M113 JE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E84F,
+ },
+ [0x1E850]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M160 JOO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E850,
+ },
+ [0x1E851]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M063 JO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E851,
+ },
+ [0x1E852]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M175 LONG JO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E852,
+ },
+ [0x1E853]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M031 YI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E853,
+ },
+ [0x1E854]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M032 YA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E854,
+ },
+ [0x1E855]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M033 YU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E855,
+ },
+ [0x1E856]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M109 YEE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E856,
+ },
+ [0x1E857]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M080 YE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E857,
+ },
+ [0x1E858]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M141 YOO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E858,
+ },
+ [0x1E859]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M121 YO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E859,
+ },
+ [0x1E85A]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M034 FI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E85A,
+ },
+ [0x1E85B]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M035 FA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E85B,
+ },
+ [0x1E85C]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M036 FU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E85C,
+ },
+ [0x1E85D]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M078 FEE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E85D,
+ },
+ [0x1E85E]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M075 FE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E85E,
+ },
+ [0x1E85F]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M133 FOO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E85F,
+ },
+ [0x1E860]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M088 FO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E860,
+ },
+ [0x1E861]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M197 FUA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E861,
+ },
+ [0x1E862]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M101 FAN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E862,
+ },
+ [0x1E863]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M037 NIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E863,
+ },
+ [0x1E864]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M038 NAN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E864,
+ },
+ [0x1E865]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M039 NUN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E865,
+ },
+ [0x1E866]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M117 NEN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E866,
+ },
+ [0x1E867]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M169 NON",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E867,
+ },
+ [0x1E868]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M176 HI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E868,
+ },
+ [0x1E869]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M041 HA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E869,
+ },
+ [0x1E86A]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M186 HU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E86A,
+ },
+ [0x1E86B]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M040 HEE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E86B,
+ },
+ [0x1E86C]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M096 HE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E86C,
+ },
+ [0x1E86D]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M042 HOO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E86D,
+ },
+ [0x1E86E]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M140 HO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E86E,
+ },
+ [0x1E86F]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M083 HEEI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E86F,
+ },
+ [0x1E870]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M128 HOOU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E870,
+ },
+ [0x1E871]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M053 HIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E871,
+ },
+ [0x1E872]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M130 HAN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E872,
+ },
+ [0x1E873]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M087 HUN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E873,
+ },
+ [0x1E874]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M052 HEN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E874,
+ },
+ [0x1E875]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M193 HON",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E875,
+ },
+ [0x1E876]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M046 HUAN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E876,
+ },
+ [0x1E877]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M090 NGGI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E877,
+ },
+ [0x1E878]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M043 NGGA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E878,
+ },
+ [0x1E879]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M082 NGGU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E879,
+ },
+ [0x1E87A]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M115 NGGEE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E87A,
+ },
+ [0x1E87B]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M146 NGGE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E87B,
+ },
+ [0x1E87C]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M156 NGGOO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E87C,
+ },
+ [0x1E87D]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M120 NGGO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E87D,
+ },
+ [0x1E87E]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M159 NGGAA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E87E,
+ },
+ [0x1E87F]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M127 NGGUA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E87F,
+ },
+ [0x1E880]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M086 LONG NGGE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E880,
+ },
+ [0x1E881]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M106 LONG NGGOO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E881,
+ },
+ [0x1E882]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M183 LONG NGGO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E882,
+ },
+ [0x1E883]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M155 GI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E883,
+ },
+ [0x1E884]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M111 GA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E884,
+ },
+ [0x1E885]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M168 GU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E885,
+ },
+ [0x1E886]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M190 GEE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E886,
+ },
+ [0x1E887]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M166 GUEI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E887,
+ },
+ [0x1E888]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M167 GUAN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E888,
+ },
+ [0x1E889]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M184 NGEN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E889,
+ },
+ [0x1E88A]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M057 NGON",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E88A,
+ },
+ [0x1E88B]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M177 NGUAN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E88B,
+ },
+ [0x1E88C]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M068 PI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E88C,
+ },
+ [0x1E88D]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M099 PA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E88D,
+ },
+ [0x1E88E]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M050 PU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E88E,
+ },
+ [0x1E88F]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M081 PEE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E88F,
+ },
+ [0x1E890]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M051 PE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E890,
+ },
+ [0x1E891]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M102 POO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E891,
+ },
+ [0x1E892]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M066 PO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E892,
+ },
+ [0x1E893]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M145 MBI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E893,
+ },
+ [0x1E894]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M062 MBA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E894,
+ },
+ [0x1E895]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M122 MBU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E895,
+ },
+ [0x1E896]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M047 MBEE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E896,
+ },
+ [0x1E897]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M188 MBEE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E897,
+ },
+ [0x1E898]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M072 MBE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E898,
+ },
+ [0x1E899]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M172 MBOO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E899,
+ },
+ [0x1E89A]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M174 MBO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E89A,
+ },
+ [0x1E89B]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M187 MBUU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E89B,
+ },
+ [0x1E89C]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M161 LONG MBE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E89C,
+ },
+ [0x1E89D]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M105 LONG MBOO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E89D,
+ },
+ [0x1E89E]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M142 LONG MBO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E89E,
+ },
+ [0x1E89F]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M132 KPI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E89F,
+ },
+ [0x1E8A0]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M092 KPA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8A0,
+ },
+ [0x1E8A1]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M074 KPU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8A1,
+ },
+ [0x1E8A2]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M044 KPEE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8A2,
+ },
+ [0x1E8A3]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M108 KPE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8A3,
+ },
+ [0x1E8A4]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M112 KPOO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8A4,
+ },
+ [0x1E8A5]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M158 KPO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8A5,
+ },
+ [0x1E8A6]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M124 GBI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8A6,
+ },
+ [0x1E8A7]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M056 GBA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8A7,
+ },
+ [0x1E8A8]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M148 GBU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8A8,
+ },
+ [0x1E8A9]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M093 GBEE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8A9,
+ },
+ [0x1E8AA]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M107 GBE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8AA,
+ },
+ [0x1E8AB]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M071 GBOO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8AB,
+ },
+ [0x1E8AC]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M070 GBO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8AC,
+ },
+ [0x1E8AD]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M171 RA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8AD,
+ },
+ [0x1E8AE]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M123 NDI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8AE,
+ },
+ [0x1E8AF]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M129 NDA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8AF,
+ },
+ [0x1E8B0]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M125 NDU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8B0,
+ },
+ [0x1E8B1]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M191 NDEE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8B1,
+ },
+ [0x1E8B2]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M119 NDE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8B2,
+ },
+ [0x1E8B3]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M067 NDOO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8B3,
+ },
+ [0x1E8B4]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M064 NDO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8B4,
+ },
+ [0x1E8B5]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M152 NJA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8B5,
+ },
+ [0x1E8B6]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M192 NJU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8B6,
+ },
+ [0x1E8B7]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M149 NJEE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8B7,
+ },
+ [0x1E8B8]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M134 NJOO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8B8,
+ },
+ [0x1E8B9]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M182 VI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8B9,
+ },
+ [0x1E8BA]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M185 VA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8BA,
+ },
+ [0x1E8BB]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M151 VU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8BB,
+ },
+ [0x1E8BC]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M173 VEE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8BC,
+ },
+ [0x1E8BD]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M085 VE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8BD,
+ },
+ [0x1E8BE]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M144 VOO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8BE,
+ },
+ [0x1E8BF]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M077 VO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8BF,
+ },
+ [0x1E8C0]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M164 NYIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8C0,
+ },
+ [0x1E8C1]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M058 NYAN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8C1,
+ },
+ [0x1E8C2]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M170 NYUN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8C2,
+ },
+ [0x1E8C3]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M098 NYEN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8C3,
+ },
+ [0x1E8C4]={
+ category="lo",
+ description="MENDE KIKAKUI SYLLABLE M060 NYON",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8C4,
+ },
+ [0x1E8C7]={
+ category="no",
+ description="MENDE KIKAKUI DIGIT ONE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8C7,
+ },
+ [0x1E8C8]={
+ category="no",
+ description="MENDE KIKAKUI DIGIT TWO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8C8,
+ },
+ [0x1E8C9]={
+ category="no",
+ description="MENDE KIKAKUI DIGIT THREE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8C9,
+ },
+ [0x1E8CA]={
+ category="no",
+ description="MENDE KIKAKUI DIGIT FOUR",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8CA,
+ },
+ [0x1E8CB]={
+ category="no",
+ description="MENDE KIKAKUI DIGIT FIVE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8CB,
+ },
+ [0x1E8CC]={
+ category="no",
+ description="MENDE KIKAKUI DIGIT SIX",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8CC,
+ },
+ [0x1E8CD]={
+ category="no",
+ description="MENDE KIKAKUI DIGIT SEVEN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8CD,
+ },
+ [0x1E8CE]={
+ category="no",
+ description="MENDE KIKAKUI DIGIT EIGHT",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8CE,
+ },
+ [0x1E8CF]={
+ category="no",
+ description="MENDE KIKAKUI DIGIT NINE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8CF,
+ },
+ [0x1E8D0]={
+ category="mn",
+ combining=0xDC,
+ description="MENDE KIKAKUI COMBINING NUMBER TEENS",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E8D0,
+ },
+ [0x1E8D1]={
+ category="mn",
+ combining=0xDC,
+ description="MENDE KIKAKUI COMBINING NUMBER TENS",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E8D1,
+ },
+ [0x1E8D2]={
+ category="mn",
+ combining=0xDC,
+ description="MENDE KIKAKUI COMBINING NUMBER HUNDREDS",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E8D2,
+ },
+ [0x1E8D3]={
+ category="mn",
+ combining=0xDC,
+ description="MENDE KIKAKUI COMBINING NUMBER THOUSANDS",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E8D3,
+ },
+ [0x1E8D4]={
+ category="mn",
+ combining=0xDC,
+ description="MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E8D4,
+ },
+ [0x1E8D5]={
+ category="mn",
+ combining=0xDC,
+ description="MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E8D5,
+ },
+ [0x1E8D6]={
+ category="mn",
+ combining=0xDC,
+ description="MENDE KIKAKUI COMBINING NUMBER MILLIONS",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E8D6,
+ },
[0x1EE00]={
category="lo",
comment="check math properties",
description="ARABIC MATHEMATICAL ALEF",
direction="al",
linebreak="al",
- specials={ "font", 0x0627 },
+ specials={ "font", 0x627 },
unicodeslot=0x1EE00,
},
[0x1EE01]={
@@ -176211,7 +193323,7 @@ characters.data={
description="ARABIC MATHEMATICAL BEH",
direction="al",
linebreak="al",
- specials={ "font", 0x0628 },
+ specials={ "font", 0x628 },
unicodeslot=0x1EE01,
},
[0x1EE02]={
@@ -176220,7 +193332,7 @@ characters.data={
description="ARABIC MATHEMATICAL JEEM",
direction="al",
linebreak="al",
- specials={ "font", 0x062C },
+ specials={ "font", 0x62C },
unicodeslot=0x1EE02,
},
[0x1EE03]={
@@ -176229,7 +193341,7 @@ characters.data={
description="ARABIC MATHEMATICAL DAL",
direction="al",
linebreak="al",
- specials={ "font", 0x062F },
+ specials={ "font", 0x62F },
unicodeslot=0x1EE03,
},
[0x1EE05]={
@@ -176238,7 +193350,7 @@ characters.data={
description="ARABIC MATHEMATICAL WAW",
direction="al",
linebreak="al",
- specials={ "font", 0x0648 },
+ specials={ "font", 0x648 },
unicodeslot=0x1EE05,
},
[0x1EE06]={
@@ -176247,7 +193359,7 @@ characters.data={
description="ARABIC MATHEMATICAL ZAIN",
direction="al",
linebreak="al",
- specials={ "font", 0x0632 },
+ specials={ "font", 0x632 },
unicodeslot=0x1EE06,
},
[0x1EE07]={
@@ -176256,7 +193368,7 @@ characters.data={
description="ARABIC MATHEMATICAL HAH",
direction="al",
linebreak="al",
- specials={ "font", 0x062D },
+ specials={ "font", 0x62D },
unicodeslot=0x1EE07,
},
[0x1EE08]={
@@ -176265,7 +193377,7 @@ characters.data={
description="ARABIC MATHEMATICAL TAH",
direction="al",
linebreak="al",
- specials={ "font", 0x0637 },
+ specials={ "font", 0x637 },
unicodeslot=0x1EE08,
},
[0x1EE09]={
@@ -176274,7 +193386,7 @@ characters.data={
description="ARABIC MATHEMATICAL YEH",
direction="al",
linebreak="al",
- specials={ "font", 0x064A },
+ specials={ "font", 0x64A },
unicodeslot=0x1EE09,
},
[0x1EE0A]={
@@ -176283,7 +193395,7 @@ characters.data={
description="ARABIC MATHEMATICAL KAF",
direction="al",
linebreak="al",
- specials={ "font", 0x0643 },
+ specials={ "font", 0x643 },
unicodeslot=0x1EE0A,
},
[0x1EE0B]={
@@ -176292,7 +193404,7 @@ characters.data={
description="ARABIC MATHEMATICAL LAM",
direction="al",
linebreak="al",
- specials={ "font", 0x0644 },
+ specials={ "font", 0x644 },
unicodeslot=0x1EE0B,
},
[0x1EE0C]={
@@ -176301,7 +193413,7 @@ characters.data={
description="ARABIC MATHEMATICAL MEEM",
direction="al",
linebreak="al",
- specials={ "font", 0x0645 },
+ specials={ "font", 0x645 },
unicodeslot=0x1EE0C,
},
[0x1EE0D]={
@@ -176310,7 +193422,7 @@ characters.data={
description="ARABIC MATHEMATICAL NOON",
direction="al",
linebreak="al",
- specials={ "font", 0x0646 },
+ specials={ "font", 0x646 },
unicodeslot=0x1EE0D,
},
[0x1EE0E]={
@@ -176319,7 +193431,7 @@ characters.data={
description="ARABIC MATHEMATICAL SEEN",
direction="al",
linebreak="al",
- specials={ "font", 0x0633 },
+ specials={ "font", 0x633 },
unicodeslot=0x1EE0E,
},
[0x1EE0F]={
@@ -176328,7 +193440,7 @@ characters.data={
description="ARABIC MATHEMATICAL AIN",
direction="al",
linebreak="al",
- specials={ "font", 0x0639 },
+ specials={ "font", 0x639 },
unicodeslot=0x1EE0F,
},
[0x1EE10]={
@@ -176337,7 +193449,7 @@ characters.data={
description="ARABIC MATHEMATICAL FEH",
direction="al",
linebreak="al",
- specials={ "font", 0x0641 },
+ specials={ "font", 0x641 },
unicodeslot=0x1EE10,
},
[0x1EE11]={
@@ -176346,7 +193458,7 @@ characters.data={
description="ARABIC MATHEMATICAL SAD",
direction="al",
linebreak="al",
- specials={ "font", 0x0635 },
+ specials={ "font", 0x635 },
unicodeslot=0x1EE11,
},
[0x1EE12]={
@@ -176355,7 +193467,7 @@ characters.data={
description="ARABIC MATHEMATICAL QAF",
direction="al",
linebreak="al",
- specials={ "font", 0x0642 },
+ specials={ "font", 0x642 },
unicodeslot=0x1EE12,
},
[0x1EE13]={
@@ -176364,7 +193476,7 @@ characters.data={
description="ARABIC MATHEMATICAL REH",
direction="al",
linebreak="al",
- specials={ "font", 0x0631 },
+ specials={ "font", 0x631 },
unicodeslot=0x1EE13,
},
[0x1EE14]={
@@ -176373,7 +193485,7 @@ characters.data={
description="ARABIC MATHEMATICAL SHEEN",
direction="al",
linebreak="al",
- specials={ "font", 0x0634 },
+ specials={ "font", 0x634 },
unicodeslot=0x1EE14,
},
[0x1EE15]={
@@ -176382,7 +193494,7 @@ characters.data={
description="ARABIC MATHEMATICAL TEH",
direction="al",
linebreak="al",
- specials={ "font", 0x062A },
+ specials={ "font", 0x62A },
unicodeslot=0x1EE15,
},
[0x1EE16]={
@@ -176391,7 +193503,7 @@ characters.data={
description="ARABIC MATHEMATICAL THEH",
direction="al",
linebreak="al",
- specials={ "font", 0x062B },
+ specials={ "font", 0x62B },
unicodeslot=0x1EE16,
},
[0x1EE17]={
@@ -176400,7 +193512,7 @@ characters.data={
description="ARABIC MATHEMATICAL KHAH",
direction="al",
linebreak="al",
- specials={ "font", 0x062E },
+ specials={ "font", 0x62E },
unicodeslot=0x1EE17,
},
[0x1EE18]={
@@ -176409,7 +193521,7 @@ characters.data={
description="ARABIC MATHEMATICAL THAL",
direction="al",
linebreak="al",
- specials={ "font", 0x0630 },
+ specials={ "font", 0x630 },
unicodeslot=0x1EE18,
},
[0x1EE19]={
@@ -176418,7 +193530,7 @@ characters.data={
description="ARABIC MATHEMATICAL DAD",
direction="al",
linebreak="al",
- specials={ "font", 0x0636 },
+ specials={ "font", 0x636 },
unicodeslot=0x1EE19,
},
[0x1EE1A]={
@@ -176427,7 +193539,7 @@ characters.data={
description="ARABIC MATHEMATICAL ZAH",
direction="al",
linebreak="al",
- specials={ "font", 0x0638 },
+ specials={ "font", 0x638 },
unicodeslot=0x1EE1A,
},
[0x1EE1B]={
@@ -176436,7 +193548,7 @@ characters.data={
description="ARABIC MATHEMATICAL GHAIN",
direction="al",
linebreak="al",
- specials={ "font", 0x063A },
+ specials={ "font", 0x63A },
unicodeslot=0x1EE1B,
},
[0x1EE1C]={
@@ -176445,7 +193557,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOTLESS BEH",
direction="al",
linebreak="al",
- specials={ "font", 0x066E },
+ specials={ "font", 0x66E },
unicodeslot=0x1EE1C,
},
[0x1EE1D]={
@@ -176454,7 +193566,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOTLESS NOON",
direction="al",
linebreak="al",
- specials={ "font", 0x06BA },
+ specials={ "font", 0x6BA },
unicodeslot=0x1EE1D,
},
[0x1EE1E]={
@@ -176463,7 +193575,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOTLESS FEH",
direction="al",
linebreak="al",
- specials={ "font", 0x06A1 },
+ specials={ "font", 0x6A1 },
unicodeslot=0x1EE1E,
},
[0x1EE1F]={
@@ -176472,7 +193584,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOTLESS QAF",
direction="al",
linebreak="al",
- specials={ "font", 0x066F },
+ specials={ "font", 0x66F },
unicodeslot=0x1EE1F,
},
[0x1EE21]={
@@ -176481,7 +193593,7 @@ characters.data={
description="ARABIC MATHEMATICAL INITIAL BEH",
direction="al",
linebreak="al",
- specials={ "font", 0x0628 },
+ specials={ "font", 0x628 },
unicodeslot=0x1EE21,
},
[0x1EE22]={
@@ -176490,7 +193602,7 @@ characters.data={
description="ARABIC MATHEMATICAL INITIAL JEEM",
direction="al",
linebreak="al",
- specials={ "font", 0x062C },
+ specials={ "font", 0x62C },
unicodeslot=0x1EE22,
},
[0x1EE24]={
@@ -176499,7 +193611,7 @@ characters.data={
description="ARABIC MATHEMATICAL INITIAL HEH",
direction="al",
linebreak="al",
- specials={ "font", 0x0647 },
+ specials={ "font", 0x647 },
unicodeslot=0x1EE24,
},
[0x1EE27]={
@@ -176508,7 +193620,7 @@ characters.data={
description="ARABIC MATHEMATICAL INITIAL HAH",
direction="al",
linebreak="al",
- specials={ "font", 0x062D },
+ specials={ "font", 0x62D },
unicodeslot=0x1EE27,
},
[0x1EE29]={
@@ -176517,7 +193629,7 @@ characters.data={
description="ARABIC MATHEMATICAL INITIAL YEH",
direction="al",
linebreak="al",
- specials={ "font", 0x064A },
+ specials={ "font", 0x64A },
unicodeslot=0x1EE29,
},
[0x1EE2A]={
@@ -176526,7 +193638,7 @@ characters.data={
description="ARABIC MATHEMATICAL INITIAL KAF",
direction="al",
linebreak="al",
- specials={ "font", 0x0643 },
+ specials={ "font", 0x643 },
unicodeslot=0x1EE2A,
},
[0x1EE2B]={
@@ -176535,7 +193647,7 @@ characters.data={
description="ARABIC MATHEMATICAL INITIAL LAM",
direction="al",
linebreak="al",
- specials={ "font", 0x0644 },
+ specials={ "font", 0x644 },
unicodeslot=0x1EE2B,
},
[0x1EE2C]={
@@ -176544,7 +193656,7 @@ characters.data={
description="ARABIC MATHEMATICAL INITIAL MEEM",
direction="al",
linebreak="al",
- specials={ "font", 0x0645 },
+ specials={ "font", 0x645 },
unicodeslot=0x1EE2C,
},
[0x1EE2D]={
@@ -176553,7 +193665,7 @@ characters.data={
description="ARABIC MATHEMATICAL INITIAL NOON",
direction="al",
linebreak="al",
- specials={ "font", 0x0646 },
+ specials={ "font", 0x646 },
unicodeslot=0x1EE2D,
},
[0x1EE2E]={
@@ -176562,7 +193674,7 @@ characters.data={
description="ARABIC MATHEMATICAL INITIAL SEEN",
direction="al",
linebreak="al",
- specials={ "font", 0x0633 },
+ specials={ "font", 0x633 },
unicodeslot=0x1EE2E,
},
[0x1EE2F]={
@@ -176571,7 +193683,7 @@ characters.data={
description="ARABIC MATHEMATICAL INITIAL AIN",
direction="al",
linebreak="al",
- specials={ "font", 0x0639 },
+ specials={ "font", 0x639 },
unicodeslot=0x1EE2F,
},
[0x1EE30]={
@@ -176580,7 +193692,7 @@ characters.data={
description="ARABIC MATHEMATICAL INITIAL FEH",
direction="al",
linebreak="al",
- specials={ "font", 0x0641 },
+ specials={ "font", 0x641 },
unicodeslot=0x1EE30,
},
[0x1EE31]={
@@ -176589,7 +193701,7 @@ characters.data={
description="ARABIC MATHEMATICAL INITIAL SAD",
direction="al",
linebreak="al",
- specials={ "font", 0x0635 },
+ specials={ "font", 0x635 },
unicodeslot=0x1EE31,
},
[0x1EE32]={
@@ -176598,7 +193710,7 @@ characters.data={
description="ARABIC MATHEMATICAL INITIAL QAF",
direction="al",
linebreak="al",
- specials={ "font", 0x0642 },
+ specials={ "font", 0x642 },
unicodeslot=0x1EE32,
},
[0x1EE34]={
@@ -176607,7 +193719,7 @@ characters.data={
description="ARABIC MATHEMATICAL INITIAL SHEEN",
direction="al",
linebreak="al",
- specials={ "font", 0x0634 },
+ specials={ "font", 0x634 },
unicodeslot=0x1EE34,
},
[0x1EE35]={
@@ -176616,7 +193728,7 @@ characters.data={
description="ARABIC MATHEMATICAL INITIAL TEH",
direction="al",
linebreak="al",
- specials={ "font", 0x062A },
+ specials={ "font", 0x62A },
unicodeslot=0x1EE35,
},
[0x1EE36]={
@@ -176625,7 +193737,7 @@ characters.data={
description="ARABIC MATHEMATICAL INITIAL THEH",
direction="al",
linebreak="al",
- specials={ "font", 0x062B },
+ specials={ "font", 0x62B },
unicodeslot=0x1EE36,
},
[0x1EE37]={
@@ -176634,7 +193746,7 @@ characters.data={
description="ARABIC MATHEMATICAL INITIAL KHAH",
direction="al",
linebreak="al",
- specials={ "font", 0x062E },
+ specials={ "font", 0x62E },
unicodeslot=0x1EE37,
},
[0x1EE39]={
@@ -176643,7 +193755,7 @@ characters.data={
description="ARABIC MATHEMATICAL INITIAL DAD",
direction="al",
linebreak="al",
- specials={ "font", 0x0636 },
+ specials={ "font", 0x636 },
unicodeslot=0x1EE39,
},
[0x1EE3B]={
@@ -176652,7 +193764,7 @@ characters.data={
description="ARABIC MATHEMATICAL INITIAL GHAIN",
direction="al",
linebreak="al",
- specials={ "font", 0x063A },
+ specials={ "font", 0x63A },
unicodeslot=0x1EE3B,
},
[0x1EE42]={
@@ -176661,7 +193773,7 @@ characters.data={
description="ARABIC MATHEMATICAL TAILED JEEM",
direction="al",
linebreak="al",
- specials={ "font", 0x062C },
+ specials={ "font", 0x62C },
unicodeslot=0x1EE42,
},
[0x1EE47]={
@@ -176670,7 +193782,7 @@ characters.data={
description="ARABIC MATHEMATICAL TAILED HAH",
direction="al",
linebreak="al",
- specials={ "font", 0x062D },
+ specials={ "font", 0x62D },
unicodeslot=0x1EE47,
},
[0x1EE49]={
@@ -176679,7 +193791,7 @@ characters.data={
description="ARABIC MATHEMATICAL TAILED YEH",
direction="al",
linebreak="al",
- specials={ "font", 0x064A },
+ specials={ "font", 0x64A },
unicodeslot=0x1EE49,
},
[0x1EE4B]={
@@ -176688,7 +193800,7 @@ characters.data={
description="ARABIC MATHEMATICAL TAILED LAM",
direction="al",
linebreak="al",
- specials={ "font", 0x0644 },
+ specials={ "font", 0x644 },
unicodeslot=0x1EE4B,
},
[0x1EE4D]={
@@ -176697,7 +193809,7 @@ characters.data={
description="ARABIC MATHEMATICAL TAILED NOON",
direction="al",
linebreak="al",
- specials={ "font", 0x0646 },
+ specials={ "font", 0x646 },
unicodeslot=0x1EE4D,
},
[0x1EE4E]={
@@ -176706,7 +193818,7 @@ characters.data={
description="ARABIC MATHEMATICAL TAILED SEEN",
direction="al",
linebreak="al",
- specials={ "font", 0x0633 },
+ specials={ "font", 0x633 },
unicodeslot=0x1EE4E,
},
[0x1EE4F]={
@@ -176715,7 +193827,7 @@ characters.data={
description="ARABIC MATHEMATICAL TAILED AIN",
direction="al",
linebreak="al",
- specials={ "font", 0x0639 },
+ specials={ "font", 0x639 },
unicodeslot=0x1EE4F,
},
[0x1EE51]={
@@ -176724,7 +193836,7 @@ characters.data={
description="ARABIC MATHEMATICAL TAILED SAD",
direction="al",
linebreak="al",
- specials={ "font", 0x0635 },
+ specials={ "font", 0x635 },
unicodeslot=0x1EE51,
},
[0x1EE52]={
@@ -176733,7 +193845,7 @@ characters.data={
description="ARABIC MATHEMATICAL TAILED QAF",
direction="al",
linebreak="al",
- specials={ "font", 0x0642 },
+ specials={ "font", 0x642 },
unicodeslot=0x1EE52,
},
[0x1EE54]={
@@ -176742,7 +193854,7 @@ characters.data={
description="ARABIC MATHEMATICAL TAILED SHEEN",
direction="al",
linebreak="al",
- specials={ "font", 0x0634 },
+ specials={ "font", 0x634 },
unicodeslot=0x1EE54,
},
[0x1EE57]={
@@ -176751,7 +193863,7 @@ characters.data={
description="ARABIC MATHEMATICAL TAILED KHAH",
direction="al",
linebreak="al",
- specials={ "font", 0x062E },
+ specials={ "font", 0x62E },
unicodeslot=0x1EE57,
},
[0x1EE59]={
@@ -176760,7 +193872,7 @@ characters.data={
description="ARABIC MATHEMATICAL TAILED DAD",
direction="al",
linebreak="al",
- specials={ "font", 0x0636 },
+ specials={ "font", 0x636 },
unicodeslot=0x1EE59,
},
[0x1EE5B]={
@@ -176769,7 +193881,7 @@ characters.data={
description="ARABIC MATHEMATICAL TAILED GHAIN",
direction="al",
linebreak="al",
- specials={ "font", 0x063A },
+ specials={ "font", 0x63A },
unicodeslot=0x1EE5B,
},
[0x1EE5D]={
@@ -176778,7 +193890,7 @@ characters.data={
description="ARABIC MATHEMATICAL TAILED DOTLESS NOON",
direction="al",
linebreak="al",
- specials={ "font", 0x06BA },
+ specials={ "font", 0x6BA },
unicodeslot=0x1EE5D,
},
[0x1EE5F]={
@@ -176787,7 +193899,7 @@ characters.data={
description="ARABIC MATHEMATICAL TAILED DOTLESS QAF",
direction="al",
linebreak="al",
- specials={ "font", 0x066F },
+ specials={ "font", 0x66F },
unicodeslot=0x1EE5F,
},
[0x1EE61]={
@@ -176796,7 +193908,7 @@ characters.data={
description="ARABIC MATHEMATICAL STRETCHED BEH",
direction="al",
linebreak="al",
- specials={ "font", 0x0628 },
+ specials={ "font", 0x628 },
unicodeslot=0x1EE61,
},
[0x1EE62]={
@@ -176805,7 +193917,7 @@ characters.data={
description="ARABIC MATHEMATICAL STRETCHED JEEM",
direction="al",
linebreak="al",
- specials={ "font", 0x062C },
+ specials={ "font", 0x62C },
unicodeslot=0x1EE62,
},
[0x1EE64]={
@@ -176814,7 +193926,7 @@ characters.data={
description="ARABIC MATHEMATICAL STRETCHED HEH",
direction="al",
linebreak="al",
- specials={ "font", 0x0647 },
+ specials={ "font", 0x647 },
unicodeslot=0x1EE64,
},
[0x1EE67]={
@@ -176823,7 +193935,7 @@ characters.data={
description="ARABIC MATHEMATICAL STRETCHED HAH",
direction="al",
linebreak="al",
- specials={ "font", 0x062D },
+ specials={ "font", 0x62D },
unicodeslot=0x1EE67,
},
[0x1EE68]={
@@ -176832,7 +193944,7 @@ characters.data={
description="ARABIC MATHEMATICAL STRETCHED TAH",
direction="al",
linebreak="al",
- specials={ "font", 0x0637 },
+ specials={ "font", 0x637 },
unicodeslot=0x1EE68,
},
[0x1EE69]={
@@ -176841,7 +193953,7 @@ characters.data={
description="ARABIC MATHEMATICAL STRETCHED YEH",
direction="al",
linebreak="al",
- specials={ "font", 0x064A },
+ specials={ "font", 0x64A },
unicodeslot=0x1EE69,
},
[0x1EE6A]={
@@ -176850,7 +193962,7 @@ characters.data={
description="ARABIC MATHEMATICAL STRETCHED KAF",
direction="al",
linebreak="al",
- specials={ "font", 0x0643 },
+ specials={ "font", 0x643 },
unicodeslot=0x1EE6A,
},
[0x1EE6C]={
@@ -176859,7 +193971,7 @@ characters.data={
description="ARABIC MATHEMATICAL STRETCHED MEEM",
direction="al",
linebreak="al",
- specials={ "font", 0x0645 },
+ specials={ "font", 0x645 },
unicodeslot=0x1EE6C,
},
[0x1EE6D]={
@@ -176868,7 +193980,7 @@ characters.data={
description="ARABIC MATHEMATICAL STRETCHED NOON",
direction="al",
linebreak="al",
- specials={ "font", 0x0646 },
+ specials={ "font", 0x646 },
unicodeslot=0x1EE6D,
},
[0x1EE6E]={
@@ -176877,7 +193989,7 @@ characters.data={
description="ARABIC MATHEMATICAL STRETCHED SEEN",
direction="al",
linebreak="al",
- specials={ "font", 0x0633 },
+ specials={ "font", 0x633 },
unicodeslot=0x1EE6E,
},
[0x1EE6F]={
@@ -176886,7 +193998,7 @@ characters.data={
description="ARABIC MATHEMATICAL STRETCHED AIN",
direction="al",
linebreak="al",
- specials={ "font", 0x0639 },
+ specials={ "font", 0x639 },
unicodeslot=0x1EE6F,
},
[0x1EE70]={
@@ -176895,7 +194007,7 @@ characters.data={
description="ARABIC MATHEMATICAL STRETCHED FEH",
direction="al",
linebreak="al",
- specials={ "font", 0x0641 },
+ specials={ "font", 0x641 },
unicodeslot=0x1EE70,
},
[0x1EE71]={
@@ -176904,7 +194016,7 @@ characters.data={
description="ARABIC MATHEMATICAL STRETCHED SAD",
direction="al",
linebreak="al",
- specials={ "font", 0x0635 },
+ specials={ "font", 0x635 },
unicodeslot=0x1EE71,
},
[0x1EE72]={
@@ -176913,7 +194025,7 @@ characters.data={
description="ARABIC MATHEMATICAL STRETCHED QAF",
direction="al",
linebreak="al",
- specials={ "font", 0x0642 },
+ specials={ "font", 0x642 },
unicodeslot=0x1EE72,
},
[0x1EE74]={
@@ -176922,7 +194034,7 @@ characters.data={
description="ARABIC MATHEMATICAL STRETCHED SHEEN",
direction="al",
linebreak="al",
- specials={ "font", 0x0634 },
+ specials={ "font", 0x634 },
unicodeslot=0x1EE74,
},
[0x1EE75]={
@@ -176931,7 +194043,7 @@ characters.data={
description="ARABIC MATHEMATICAL STRETCHED TEH",
direction="al",
linebreak="al",
- specials={ "font", 0x062A },
+ specials={ "font", 0x62A },
unicodeslot=0x1EE75,
},
[0x1EE76]={
@@ -176940,7 +194052,7 @@ characters.data={
description="ARABIC MATHEMATICAL STRETCHED THEH",
direction="al",
linebreak="al",
- specials={ "font", 0x062B },
+ specials={ "font", 0x62B },
unicodeslot=0x1EE76,
},
[0x1EE77]={
@@ -176949,7 +194061,7 @@ characters.data={
description="ARABIC MATHEMATICAL STRETCHED KHAH",
direction="al",
linebreak="al",
- specials={ "font", 0x062E },
+ specials={ "font", 0x62E },
unicodeslot=0x1EE77,
},
[0x1EE79]={
@@ -176958,7 +194070,7 @@ characters.data={
description="ARABIC MATHEMATICAL STRETCHED DAD",
direction="al",
linebreak="al",
- specials={ "font", 0x0636 },
+ specials={ "font", 0x636 },
unicodeslot=0x1EE79,
},
[0x1EE7A]={
@@ -176967,7 +194079,7 @@ characters.data={
description="ARABIC MATHEMATICAL STRETCHED ZAH",
direction="al",
linebreak="al",
- specials={ "font", 0x0638 },
+ specials={ "font", 0x638 },
unicodeslot=0x1EE7A,
},
[0x1EE7B]={
@@ -176976,7 +194088,7 @@ characters.data={
description="ARABIC MATHEMATICAL STRETCHED GHAIN",
direction="al",
linebreak="al",
- specials={ "font", 0x063A },
+ specials={ "font", 0x63A },
unicodeslot=0x1EE7B,
},
[0x1EE7C]={
@@ -176985,7 +194097,7 @@ characters.data={
description="ARABIC MATHEMATICAL STRETCHED DOTLESS BEH",
direction="al",
linebreak="al",
- specials={ "font", 0x066E },
+ specials={ "font", 0x66E },
unicodeslot=0x1EE7C,
},
[0x1EE7E]={
@@ -176994,7 +194106,7 @@ characters.data={
description="ARABIC MATHEMATICAL STRETCHED DOTLESS FEH",
direction="al",
linebreak="al",
- specials={ "font", 0x06A1 },
+ specials={ "font", 0x6A1 },
unicodeslot=0x1EE7E,
},
[0x1EE80]={
@@ -177003,7 +194115,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED ALEF",
direction="al",
linebreak="al",
- specials={ "font", 0x0627 },
+ specials={ "font", 0x627 },
unicodeslot=0x1EE80,
},
[0x1EE81]={
@@ -177012,7 +194124,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED BEH",
direction="al",
linebreak="al",
- specials={ "font", 0x0628 },
+ specials={ "font", 0x628 },
unicodeslot=0x1EE81,
},
[0x1EE82]={
@@ -177021,7 +194133,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED JEEM",
direction="al",
linebreak="al",
- specials={ "font", 0x062C },
+ specials={ "font", 0x62C },
unicodeslot=0x1EE82,
},
[0x1EE83]={
@@ -177030,7 +194142,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED DAL",
direction="al",
linebreak="al",
- specials={ "font", 0x062F },
+ specials={ "font", 0x62F },
unicodeslot=0x1EE83,
},
[0x1EE84]={
@@ -177039,7 +194151,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED HEH",
direction="al",
linebreak="al",
- specials={ "font", 0x0647 },
+ specials={ "font", 0x647 },
unicodeslot=0x1EE84,
},
[0x1EE85]={
@@ -177048,7 +194160,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED WAW",
direction="al",
linebreak="al",
- specials={ "font", 0x0648 },
+ specials={ "font", 0x648 },
unicodeslot=0x1EE85,
},
[0x1EE86]={
@@ -177057,7 +194169,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED ZAIN",
direction="al",
linebreak="al",
- specials={ "font", 0x0632 },
+ specials={ "font", 0x632 },
unicodeslot=0x1EE86,
},
[0x1EE87]={
@@ -177066,7 +194178,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED HAH",
direction="al",
linebreak="al",
- specials={ "font", 0x062D },
+ specials={ "font", 0x62D },
unicodeslot=0x1EE87,
},
[0x1EE88]={
@@ -177075,7 +194187,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED TAH",
direction="al",
linebreak="al",
- specials={ "font", 0x0637 },
+ specials={ "font", 0x637 },
unicodeslot=0x1EE88,
},
[0x1EE89]={
@@ -177084,7 +194196,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED YEH",
direction="al",
linebreak="al",
- specials={ "font", 0x064A },
+ specials={ "font", 0x64A },
unicodeslot=0x1EE89,
},
[0x1EE8B]={
@@ -177093,7 +194205,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED LAM",
direction="al",
linebreak="al",
- specials={ "font", 0x0644 },
+ specials={ "font", 0x644 },
unicodeslot=0x1EE8B,
},
[0x1EE8C]={
@@ -177102,7 +194214,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED MEEM",
direction="al",
linebreak="al",
- specials={ "font", 0x0645 },
+ specials={ "font", 0x645 },
unicodeslot=0x1EE8C,
},
[0x1EE8D]={
@@ -177111,7 +194223,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED NOON",
direction="al",
linebreak="al",
- specials={ "font", 0x0646 },
+ specials={ "font", 0x646 },
unicodeslot=0x1EE8D,
},
[0x1EE8E]={
@@ -177120,7 +194232,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED SEEN",
direction="al",
linebreak="al",
- specials={ "font", 0x0633 },
+ specials={ "font", 0x633 },
unicodeslot=0x1EE8E,
},
[0x1EE8F]={
@@ -177129,7 +194241,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED AIN",
direction="al",
linebreak="al",
- specials={ "font", 0x0639 },
+ specials={ "font", 0x639 },
unicodeslot=0x1EE8F,
},
[0x1EE90]={
@@ -177138,7 +194250,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED FEH",
direction="al",
linebreak="al",
- specials={ "font", 0x0641 },
+ specials={ "font", 0x641 },
unicodeslot=0x1EE90,
},
[0x1EE91]={
@@ -177147,7 +194259,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED SAD",
direction="al",
linebreak="al",
- specials={ "font", 0x0635 },
+ specials={ "font", 0x635 },
unicodeslot=0x1EE91,
},
[0x1EE92]={
@@ -177156,7 +194268,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED QAF",
direction="al",
linebreak="al",
- specials={ "font", 0x0642 },
+ specials={ "font", 0x642 },
unicodeslot=0x1EE92,
},
[0x1EE93]={
@@ -177165,7 +194277,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED REH",
direction="al",
linebreak="al",
- specials={ "font", 0x0631 },
+ specials={ "font", 0x631 },
unicodeslot=0x1EE93,
},
[0x1EE94]={
@@ -177174,7 +194286,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED SHEEN",
direction="al",
linebreak="al",
- specials={ "font", 0x0634 },
+ specials={ "font", 0x634 },
unicodeslot=0x1EE94,
},
[0x1EE95]={
@@ -177183,7 +194295,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED TEH",
direction="al",
linebreak="al",
- specials={ "font", 0x062A },
+ specials={ "font", 0x62A },
unicodeslot=0x1EE95,
},
[0x1EE96]={
@@ -177192,7 +194304,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED THEH",
direction="al",
linebreak="al",
- specials={ "font", 0x062B },
+ specials={ "font", 0x62B },
unicodeslot=0x1EE96,
},
[0x1EE97]={
@@ -177201,7 +194313,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED KHAH",
direction="al",
linebreak="al",
- specials={ "font", 0x062E },
+ specials={ "font", 0x62E },
unicodeslot=0x1EE97,
},
[0x1EE98]={
@@ -177210,7 +194322,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED THAL",
direction="al",
linebreak="al",
- specials={ "font", 0x0630 },
+ specials={ "font", 0x630 },
unicodeslot=0x1EE98,
},
[0x1EE99]={
@@ -177219,7 +194331,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED DAD",
direction="al",
linebreak="al",
- specials={ "font", 0x0636 },
+ specials={ "font", 0x636 },
unicodeslot=0x1EE99,
},
[0x1EE9A]={
@@ -177228,7 +194340,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED ZAH",
direction="al",
linebreak="al",
- specials={ "font", 0x0638 },
+ specials={ "font", 0x638 },
unicodeslot=0x1EE9A,
},
[0x1EE9B]={
@@ -177237,7 +194349,7 @@ characters.data={
description="ARABIC MATHEMATICAL LOOPED GHAIN",
direction="al",
linebreak="al",
- specials={ "font", 0x063A },
+ specials={ "font", 0x63A },
unicodeslot=0x1EE9B,
},
[0x1EEA1]={
@@ -177246,7 +194358,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOUBLE-STRUCK BEH",
direction="al",
linebreak="al",
- specials={ "font", 0x0628 },
+ specials={ "font", 0x628 },
unicodeslot=0x1EEA1,
},
[0x1EEA2]={
@@ -177255,7 +194367,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM",
direction="al",
linebreak="al",
- specials={ "font", 0x062C },
+ specials={ "font", 0x62C },
unicodeslot=0x1EEA2,
},
[0x1EEA3]={
@@ -177264,7 +194376,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOUBLE-STRUCK DAL",
direction="al",
linebreak="al",
- specials={ "font", 0x062F },
+ specials={ "font", 0x62F },
unicodeslot=0x1EEA3,
},
[0x1EEA5]={
@@ -177273,7 +194385,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOUBLE-STRUCK WAW",
direction="al",
linebreak="al",
- specials={ "font", 0x0648 },
+ specials={ "font", 0x648 },
unicodeslot=0x1EEA5,
},
[0x1EEA6]={
@@ -177282,7 +194394,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN",
direction="al",
linebreak="al",
- specials={ "font", 0x0632 },
+ specials={ "font", 0x632 },
unicodeslot=0x1EEA6,
},
[0x1EEA7]={
@@ -177291,7 +194403,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOUBLE-STRUCK HAH",
direction="al",
linebreak="al",
- specials={ "font", 0x062D },
+ specials={ "font", 0x62D },
unicodeslot=0x1EEA7,
},
[0x1EEA8]={
@@ -177300,7 +194412,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOUBLE-STRUCK TAH",
direction="al",
linebreak="al",
- specials={ "font", 0x0637 },
+ specials={ "font", 0x637 },
unicodeslot=0x1EEA8,
},
[0x1EEA9]={
@@ -177309,7 +194421,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOUBLE-STRUCK YEH",
direction="al",
linebreak="al",
- specials={ "font", 0x064A },
+ specials={ "font", 0x64A },
unicodeslot=0x1EEA9,
},
[0x1EEAB]={
@@ -177318,7 +194430,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOUBLE-STRUCK LAM",
direction="al",
linebreak="al",
- specials={ "font", 0x0644 },
+ specials={ "font", 0x644 },
unicodeslot=0x1EEAB,
},
[0x1EEAC]={
@@ -177327,7 +194439,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM",
direction="al",
linebreak="al",
- specials={ "font", 0x0645 },
+ specials={ "font", 0x645 },
unicodeslot=0x1EEAC,
},
[0x1EEAD]={
@@ -177336,7 +194448,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOUBLE-STRUCK NOON",
direction="al",
linebreak="al",
- specials={ "font", 0x0646 },
+ specials={ "font", 0x646 },
unicodeslot=0x1EEAD,
},
[0x1EEAE]={
@@ -177345,7 +194457,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN",
direction="al",
linebreak="al",
- specials={ "font", 0x0633 },
+ specials={ "font", 0x633 },
unicodeslot=0x1EEAE,
},
[0x1EEAF]={
@@ -177354,7 +194466,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOUBLE-STRUCK AIN",
direction="al",
linebreak="al",
- specials={ "font", 0x0639 },
+ specials={ "font", 0x639 },
unicodeslot=0x1EEAF,
},
[0x1EEB0]={
@@ -177363,7 +194475,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOUBLE-STRUCK FEH",
direction="al",
linebreak="al",
- specials={ "font", 0x0641 },
+ specials={ "font", 0x641 },
unicodeslot=0x1EEB0,
},
[0x1EEB1]={
@@ -177372,7 +194484,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOUBLE-STRUCK SAD",
direction="al",
linebreak="al",
- specials={ "font", 0x0635 },
+ specials={ "font", 0x635 },
unicodeslot=0x1EEB1,
},
[0x1EEB2]={
@@ -177381,7 +194493,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOUBLE-STRUCK QAF",
direction="al",
linebreak="al",
- specials={ "font", 0x0642 },
+ specials={ "font", 0x642 },
unicodeslot=0x1EEB2,
},
[0x1EEB3]={
@@ -177390,7 +194502,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOUBLE-STRUCK REH",
direction="al",
linebreak="al",
- specials={ "font", 0x0631 },
+ specials={ "font", 0x631 },
unicodeslot=0x1EEB3,
},
[0x1EEB4]={
@@ -177399,7 +194511,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN",
direction="al",
linebreak="al",
- specials={ "font", 0x0634 },
+ specials={ "font", 0x634 },
unicodeslot=0x1EEB4,
},
[0x1EEB5]={
@@ -177408,7 +194520,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOUBLE-STRUCK TEH",
direction="al",
linebreak="al",
- specials={ "font", 0x062A },
+ specials={ "font", 0x62A },
unicodeslot=0x1EEB5,
},
[0x1EEB6]={
@@ -177417,7 +194529,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOUBLE-STRUCK THEH",
direction="al",
linebreak="al",
- specials={ "font", 0x062B },
+ specials={ "font", 0x62B },
unicodeslot=0x1EEB6,
},
[0x1EEB7]={
@@ -177426,7 +194538,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH",
direction="al",
linebreak="al",
- specials={ "font", 0x062E },
+ specials={ "font", 0x62E },
unicodeslot=0x1EEB7,
},
[0x1EEB8]={
@@ -177435,7 +194547,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOUBLE-STRUCK THAL",
direction="al",
linebreak="al",
- specials={ "font", 0x0630 },
+ specials={ "font", 0x630 },
unicodeslot=0x1EEB8,
},
[0x1EEB9]={
@@ -177444,7 +194556,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOUBLE-STRUCK DAD",
direction="al",
linebreak="al",
- specials={ "font", 0x0636 },
+ specials={ "font", 0x636 },
unicodeslot=0x1EEB9,
},
[0x1EEBA]={
@@ -177453,7 +194565,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH",
direction="al",
linebreak="al",
- specials={ "font", 0x0638 },
+ specials={ "font", 0x638 },
unicodeslot=0x1EEBA,
},
[0x1EEBB]={
@@ -177462,7 +194574,7 @@ characters.data={
description="ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN",
direction="al",
linebreak="al",
- specials={ "font", 0x063A },
+ specials={ "font", 0x63A },
unicodeslot=0x1EEBB,
},
[0x1EEF0]={
@@ -178696,6 +195808,13 @@ characters.data={
linebreak="id",
unicodeslot=0x1F0BE,
},
+ [0x1F0BF]={
+ category="so",
+ description="PLAYING CARD RED JOKER",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0BF,
+ },
[0x1F0C1]={
category="so",
description="PLAYING CARD ACE OF DIAMONDS",
@@ -178906,13 +196025,167 @@ characters.data={
linebreak="id",
unicodeslot=0x1F0DF,
},
+ [0x1F0E0]={
+ category="so",
+ description="PLAYING CARD FOOL",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0E0,
+ },
+ [0x1F0E1]={
+ category="so",
+ description="PLAYING CARD TRUMP-1",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0E1,
+ },
+ [0x1F0E2]={
+ category="so",
+ description="PLAYING CARD TRUMP-2",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0E2,
+ },
+ [0x1F0E3]={
+ category="so",
+ description="PLAYING CARD TRUMP-3",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0E3,
+ },
+ [0x1F0E4]={
+ category="so",
+ description="PLAYING CARD TRUMP-4",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0E4,
+ },
+ [0x1F0E5]={
+ category="so",
+ description="PLAYING CARD TRUMP-5",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0E5,
+ },
+ [0x1F0E6]={
+ category="so",
+ description="PLAYING CARD TRUMP-6",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0E6,
+ },
+ [0x1F0E7]={
+ category="so",
+ description="PLAYING CARD TRUMP-7",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0E7,
+ },
+ [0x1F0E8]={
+ category="so",
+ description="PLAYING CARD TRUMP-8",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0E8,
+ },
+ [0x1F0E9]={
+ category="so",
+ description="PLAYING CARD TRUMP-9",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0E9,
+ },
+ [0x1F0EA]={
+ category="so",
+ description="PLAYING CARD TRUMP-10",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0EA,
+ },
+ [0x1F0EB]={
+ category="so",
+ description="PLAYING CARD TRUMP-11",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0EB,
+ },
+ [0x1F0EC]={
+ category="so",
+ description="PLAYING CARD TRUMP-12",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0EC,
+ },
+ [0x1F0ED]={
+ category="so",
+ description="PLAYING CARD TRUMP-13",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0ED,
+ },
+ [0x1F0EE]={
+ category="so",
+ description="PLAYING CARD TRUMP-14",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0EE,
+ },
+ [0x1F0EF]={
+ category="so",
+ description="PLAYING CARD TRUMP-15",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0EF,
+ },
+ [0x1F0F0]={
+ category="so",
+ description="PLAYING CARD TRUMP-16",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0F0,
+ },
+ [0x1F0F1]={
+ category="so",
+ description="PLAYING CARD TRUMP-17",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0F1,
+ },
+ [0x1F0F2]={
+ category="so",
+ description="PLAYING CARD TRUMP-18",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0F2,
+ },
+ [0x1F0F3]={
+ category="so",
+ description="PLAYING CARD TRUMP-19",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0F3,
+ },
+ [0x1F0F4]={
+ category="so",
+ description="PLAYING CARD TRUMP-20",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0F4,
+ },
+ [0x1F0F5]={
+ category="so",
+ description="PLAYING CARD TRUMP-21",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0F5,
+ },
[0x1F100]={
category="no",
cjkwd="a",
description="DIGIT ZERO FULL STOP",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0030, 0x002E },
+ specials={ "compat", 0x30, 0x2E },
unicodeslot=0x1F100,
},
[0x1F101]={
@@ -178921,7 +196194,7 @@ characters.data={
description="DIGIT ZERO COMMA",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0030, 0x002C },
+ specials={ "compat", 0x30, 0x2C },
unicodeslot=0x1F101,
},
[0x1F102]={
@@ -178930,7 +196203,7 @@ characters.data={
description="DIGIT ONE COMMA",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0031, 0x002C },
+ specials={ "compat", 0x31, 0x2C },
unicodeslot=0x1F102,
},
[0x1F103]={
@@ -178939,7 +196212,7 @@ characters.data={
description="DIGIT TWO COMMA",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0032, 0x002C },
+ specials={ "compat", 0x32, 0x2C },
unicodeslot=0x1F103,
},
[0x1F104]={
@@ -178948,7 +196221,7 @@ characters.data={
description="DIGIT THREE COMMA",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0033, 0x002C },
+ specials={ "compat", 0x33, 0x2C },
unicodeslot=0x1F104,
},
[0x1F105]={
@@ -178957,7 +196230,7 @@ characters.data={
description="DIGIT FOUR COMMA",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0034, 0x002C },
+ specials={ "compat", 0x34, 0x2C },
unicodeslot=0x1F105,
},
[0x1F106]={
@@ -178966,7 +196239,7 @@ characters.data={
description="DIGIT FIVE COMMA",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0035, 0x002C },
+ specials={ "compat", 0x35, 0x2C },
unicodeslot=0x1F106,
},
[0x1F107]={
@@ -178975,7 +196248,7 @@ characters.data={
description="DIGIT SIX COMMA",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0036, 0x002C },
+ specials={ "compat", 0x36, 0x2C },
unicodeslot=0x1F107,
},
[0x1F108]={
@@ -178984,7 +196257,7 @@ characters.data={
description="DIGIT SEVEN COMMA",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0037, 0x002C },
+ specials={ "compat", 0x37, 0x2C },
unicodeslot=0x1F108,
},
[0x1F109]={
@@ -178993,7 +196266,7 @@ characters.data={
description="DIGIT EIGHT COMMA",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0038, 0x002C },
+ specials={ "compat", 0x38, 0x2C },
unicodeslot=0x1F109,
},
[0x1F10A]={
@@ -179002,16 +196275,30 @@ characters.data={
description="DIGIT NINE COMMA",
direction="en",
linebreak="ai",
- specials={ "compat", 0x0039, 0x002C },
+ specials={ "compat", 0x39, 0x2C },
unicodeslot=0x1F10A,
},
+ [0x1F10B]={
+ category="no",
+ description="DINGBAT CIRCLED SANS-SERIF DIGIT ZERO",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x1F10B,
+ },
+ [0x1F10C]={
+ category="no",
+ description="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x1F10C,
+ },
[0x1F110]={
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN CAPITAL LETTER A",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0041, 0x0029 },
+ specials={ "compat", 0x28, 0x41, 0x29 },
unicodeslot=0x1F110,
},
[0x1F111]={
@@ -179020,7 +196307,7 @@ characters.data={
description="PARENTHESIZED LATIN CAPITAL LETTER B",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0042, 0x0029 },
+ specials={ "compat", 0x28, 0x42, 0x29 },
unicodeslot=0x1F111,
},
[0x1F112]={
@@ -179029,7 +196316,7 @@ characters.data={
description="PARENTHESIZED LATIN CAPITAL LETTER C",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0043, 0x0029 },
+ specials={ "compat", 0x28, 0x43, 0x29 },
unicodeslot=0x1F112,
},
[0x1F113]={
@@ -179038,7 +196325,7 @@ characters.data={
description="PARENTHESIZED LATIN CAPITAL LETTER D",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0044, 0x0029 },
+ specials={ "compat", 0x28, 0x44, 0x29 },
unicodeslot=0x1F113,
},
[0x1F114]={
@@ -179047,7 +196334,7 @@ characters.data={
description="PARENTHESIZED LATIN CAPITAL LETTER E",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0045, 0x0029 },
+ specials={ "compat", 0x28, 0x45, 0x29 },
unicodeslot=0x1F114,
},
[0x1F115]={
@@ -179056,7 +196343,7 @@ characters.data={
description="PARENTHESIZED LATIN CAPITAL LETTER F",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0046, 0x0029 },
+ specials={ "compat", 0x28, 0x46, 0x29 },
unicodeslot=0x1F115,
},
[0x1F116]={
@@ -179065,7 +196352,7 @@ characters.data={
description="PARENTHESIZED LATIN CAPITAL LETTER G",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0047, 0x0029 },
+ specials={ "compat", 0x28, 0x47, 0x29 },
unicodeslot=0x1F116,
},
[0x1F117]={
@@ -179074,7 +196361,7 @@ characters.data={
description="PARENTHESIZED LATIN CAPITAL LETTER H",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0048, 0x0029 },
+ specials={ "compat", 0x28, 0x48, 0x29 },
unicodeslot=0x1F117,
},
[0x1F118]={
@@ -179083,7 +196370,7 @@ characters.data={
description="PARENTHESIZED LATIN CAPITAL LETTER I",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0049, 0x0029 },
+ specials={ "compat", 0x28, 0x49, 0x29 },
unicodeslot=0x1F118,
},
[0x1F119]={
@@ -179092,7 +196379,7 @@ characters.data={
description="PARENTHESIZED LATIN CAPITAL LETTER J",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x004A, 0x0029 },
+ specials={ "compat", 0x28, 0x4A, 0x29 },
unicodeslot=0x1F119,
},
[0x1F11A]={
@@ -179101,7 +196388,7 @@ characters.data={
description="PARENTHESIZED LATIN CAPITAL LETTER K",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x004B, 0x0029 },
+ specials={ "compat", 0x28, 0x4B, 0x29 },
unicodeslot=0x1F11A,
},
[0x1F11B]={
@@ -179110,7 +196397,7 @@ characters.data={
description="PARENTHESIZED LATIN CAPITAL LETTER L",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x004C, 0x0029 },
+ specials={ "compat", 0x28, 0x4C, 0x29 },
unicodeslot=0x1F11B,
},
[0x1F11C]={
@@ -179119,7 +196406,7 @@ characters.data={
description="PARENTHESIZED LATIN CAPITAL LETTER M",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x004D, 0x0029 },
+ specials={ "compat", 0x28, 0x4D, 0x29 },
unicodeslot=0x1F11C,
},
[0x1F11D]={
@@ -179128,7 +196415,7 @@ characters.data={
description="PARENTHESIZED LATIN CAPITAL LETTER N",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x004E, 0x0029 },
+ specials={ "compat", 0x28, 0x4E, 0x29 },
unicodeslot=0x1F11D,
},
[0x1F11E]={
@@ -179137,7 +196424,7 @@ characters.data={
description="PARENTHESIZED LATIN CAPITAL LETTER O",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x004F, 0x0029 },
+ specials={ "compat", 0x28, 0x4F, 0x29 },
unicodeslot=0x1F11E,
},
[0x1F11F]={
@@ -179146,7 +196433,7 @@ characters.data={
description="PARENTHESIZED LATIN CAPITAL LETTER P",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0050, 0x0029 },
+ specials={ "compat", 0x28, 0x50, 0x29 },
unicodeslot=0x1F11F,
},
[0x1F120]={
@@ -179155,7 +196442,7 @@ characters.data={
description="PARENTHESIZED LATIN CAPITAL LETTER Q",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0051, 0x0029 },
+ specials={ "compat", 0x28, 0x51, 0x29 },
unicodeslot=0x1F120,
},
[0x1F121]={
@@ -179164,7 +196451,7 @@ characters.data={
description="PARENTHESIZED LATIN CAPITAL LETTER R",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0052, 0x0029 },
+ specials={ "compat", 0x28, 0x52, 0x29 },
unicodeslot=0x1F121,
},
[0x1F122]={
@@ -179173,7 +196460,7 @@ characters.data={
description="PARENTHESIZED LATIN CAPITAL LETTER S",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0053, 0x0029 },
+ specials={ "compat", 0x28, 0x53, 0x29 },
unicodeslot=0x1F122,
},
[0x1F123]={
@@ -179182,7 +196469,7 @@ characters.data={
description="PARENTHESIZED LATIN CAPITAL LETTER T",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0054, 0x0029 },
+ specials={ "compat", 0x28, 0x54, 0x29 },
unicodeslot=0x1F123,
},
[0x1F124]={
@@ -179191,7 +196478,7 @@ characters.data={
description="PARENTHESIZED LATIN CAPITAL LETTER U",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0055, 0x0029 },
+ specials={ "compat", 0x28, 0x55, 0x29 },
unicodeslot=0x1F124,
},
[0x1F125]={
@@ -179200,7 +196487,7 @@ characters.data={
description="PARENTHESIZED LATIN CAPITAL LETTER V",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0056, 0x0029 },
+ specials={ "compat", 0x28, 0x56, 0x29 },
unicodeslot=0x1F125,
},
[0x1F126]={
@@ -179209,7 +196496,7 @@ characters.data={
description="PARENTHESIZED LATIN CAPITAL LETTER W",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0057, 0x0029 },
+ specials={ "compat", 0x28, 0x57, 0x29 },
unicodeslot=0x1F126,
},
[0x1F127]={
@@ -179218,7 +196505,7 @@ characters.data={
description="PARENTHESIZED LATIN CAPITAL LETTER X",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0058, 0x0029 },
+ specials={ "compat", 0x28, 0x58, 0x29 },
unicodeslot=0x1F127,
},
[0x1F128]={
@@ -179227,7 +196514,7 @@ characters.data={
description="PARENTHESIZED LATIN CAPITAL LETTER Y",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x0059, 0x0029 },
+ specials={ "compat", 0x28, 0x59, 0x29 },
unicodeslot=0x1F128,
},
[0x1F129]={
@@ -179236,7 +196523,7 @@ characters.data={
description="PARENTHESIZED LATIN CAPITAL LETTER Z",
direction="l",
linebreak="ai",
- specials={ "compat", 0x0028, 0x005A, 0x0029 },
+ specials={ "compat", 0x28, 0x5A, 0x29 },
unicodeslot=0x1F129,
},
[0x1F12A]={
@@ -179245,7 +196532,7 @@ characters.data={
description="TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S",
direction="l",
linebreak="ai",
- specials={ "compat", 0x3014, 0x0053, 0x3015 },
+ specials={ "compat", 0x3014, 0x53, 0x3015 },
unicodeslot=0x1F12A,
},
[0x1F12B]={
@@ -179254,7 +196541,7 @@ characters.data={
description="CIRCLED ITALIC LATIN CAPITAL LETTER C",
direction="l",
linebreak="ai",
- specials={ "circle", 0x0043 },
+ specials={ "circle", 0x43 },
unicodeslot=0x1F12B,
},
[0x1F12C]={
@@ -179263,7 +196550,7 @@ characters.data={
description="CIRCLED ITALIC LATIN CAPITAL LETTER R",
direction="l",
linebreak="ai",
- specials={ "circle", 0x0052 },
+ specials={ "circle", 0x52 },
unicodeslot=0x1F12C,
},
[0x1F12D]={
@@ -179272,7 +196559,7 @@ characters.data={
description="CIRCLED CD",
direction="l",
linebreak="ai",
- specials={ "circle", 0x0043, 0x0044 },
+ specials={ "circle", 0x43, 0x44 },
unicodeslot=0x1F12D,
},
[0x1F12E]={
@@ -179280,7 +196567,7 @@ characters.data={
description="CIRCLED WZ",
direction="l",
linebreak="al",
- specials={ "circle", 0x0057, 0x005A },
+ specials={ "circle", 0x57, 0x5A },
unicodeslot=0x1F12E,
},
[0x1F130]={
@@ -179289,7 +196576,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER A",
direction="l",
linebreak="ai",
- specials={ "square", 0x0041 },
+ specials={ "square", 0x41 },
unicodeslot=0x1F130,
},
[0x1F131]={
@@ -179298,7 +196585,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER B",
direction="l",
linebreak="ai",
- specials={ "square", 0x0042 },
+ specials={ "square", 0x42 },
unicodeslot=0x1F131,
},
[0x1F132]={
@@ -179307,7 +196594,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER C",
direction="l",
linebreak="ai",
- specials={ "square", 0x0043 },
+ specials={ "square", 0x43 },
unicodeslot=0x1F132,
},
[0x1F133]={
@@ -179316,7 +196603,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER D",
direction="l",
linebreak="ai",
- specials={ "square", 0x0044 },
+ specials={ "square", 0x44 },
unicodeslot=0x1F133,
},
[0x1F134]={
@@ -179325,7 +196612,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER E",
direction="l",
linebreak="ai",
- specials={ "square", 0x0045 },
+ specials={ "square", 0x45 },
unicodeslot=0x1F134,
},
[0x1F135]={
@@ -179334,7 +196621,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER F",
direction="l",
linebreak="ai",
- specials={ "square", 0x0046 },
+ specials={ "square", 0x46 },
unicodeslot=0x1F135,
},
[0x1F136]={
@@ -179343,7 +196630,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER G",
direction="l",
linebreak="ai",
- specials={ "square", 0x0047 },
+ specials={ "square", 0x47 },
unicodeslot=0x1F136,
},
[0x1F137]={
@@ -179352,7 +196639,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER H",
direction="l",
linebreak="ai",
- specials={ "square", 0x0048 },
+ specials={ "square", 0x48 },
unicodeslot=0x1F137,
},
[0x1F138]={
@@ -179361,7 +196648,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER I",
direction="l",
linebreak="ai",
- specials={ "square", 0x0049 },
+ specials={ "square", 0x49 },
unicodeslot=0x1F138,
},
[0x1F139]={
@@ -179370,7 +196657,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER J",
direction="l",
linebreak="ai",
- specials={ "square", 0x004A },
+ specials={ "square", 0x4A },
unicodeslot=0x1F139,
},
[0x1F13A]={
@@ -179379,7 +196666,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER K",
direction="l",
linebreak="ai",
- specials={ "square", 0x004B },
+ specials={ "square", 0x4B },
unicodeslot=0x1F13A,
},
[0x1F13B]={
@@ -179388,7 +196675,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER L",
direction="l",
linebreak="ai",
- specials={ "square", 0x004C },
+ specials={ "square", 0x4C },
unicodeslot=0x1F13B,
},
[0x1F13C]={
@@ -179397,7 +196684,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER M",
direction="l",
linebreak="ai",
- specials={ "square", 0x004D },
+ specials={ "square", 0x4D },
unicodeslot=0x1F13C,
},
[0x1F13D]={
@@ -179406,7 +196693,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER N",
direction="l",
linebreak="ai",
- specials={ "square", 0x004E },
+ specials={ "square", 0x4E },
unicodeslot=0x1F13D,
},
[0x1F13E]={
@@ -179415,7 +196702,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER O",
direction="l",
linebreak="ai",
- specials={ "square", 0x004F },
+ specials={ "square", 0x4F },
unicodeslot=0x1F13E,
},
[0x1F13F]={
@@ -179424,7 +196711,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER P",
direction="l",
linebreak="ai",
- specials={ "square", 0x0050 },
+ specials={ "square", 0x50 },
unicodeslot=0x1F13F,
},
[0x1F140]={
@@ -179433,7 +196720,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER Q",
direction="l",
linebreak="ai",
- specials={ "square", 0x0051 },
+ specials={ "square", 0x51 },
unicodeslot=0x1F140,
},
[0x1F141]={
@@ -179442,7 +196729,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER R",
direction="l",
linebreak="ai",
- specials={ "square", 0x0052 },
+ specials={ "square", 0x52 },
unicodeslot=0x1F141,
},
[0x1F142]={
@@ -179451,7 +196738,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER S",
direction="l",
linebreak="ai",
- specials={ "square", 0x0053 },
+ specials={ "square", 0x53 },
unicodeslot=0x1F142,
},
[0x1F143]={
@@ -179460,7 +196747,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER T",
direction="l",
linebreak="ai",
- specials={ "square", 0x0054 },
+ specials={ "square", 0x54 },
unicodeslot=0x1F143,
},
[0x1F144]={
@@ -179469,7 +196756,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER U",
direction="l",
linebreak="ai",
- specials={ "square", 0x0055 },
+ specials={ "square", 0x55 },
unicodeslot=0x1F144,
},
[0x1F145]={
@@ -179478,7 +196765,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER V",
direction="l",
linebreak="ai",
- specials={ "square", 0x0056 },
+ specials={ "square", 0x56 },
unicodeslot=0x1F145,
},
[0x1F146]={
@@ -179487,7 +196774,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER W",
direction="l",
linebreak="ai",
- specials={ "square", 0x0057 },
+ specials={ "square", 0x57 },
unicodeslot=0x1F146,
},
[0x1F147]={
@@ -179496,7 +196783,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER X",
direction="l",
linebreak="ai",
- specials={ "square", 0x0058 },
+ specials={ "square", 0x58 },
unicodeslot=0x1F147,
},
[0x1F148]={
@@ -179505,7 +196792,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER Y",
direction="l",
linebreak="ai",
- specials={ "square", 0x0059 },
+ specials={ "square", 0x59 },
unicodeslot=0x1F148,
},
[0x1F149]={
@@ -179514,7 +196801,7 @@ characters.data={
description="SQUARED LATIN CAPITAL LETTER Z",
direction="l",
linebreak="ai",
- specials={ "square", 0x005A },
+ specials={ "square", 0x5A },
unicodeslot=0x1F149,
},
[0x1F14A]={
@@ -179523,7 +196810,7 @@ characters.data={
description="SQUARED HV",
direction="l",
linebreak="ai",
- specials={ "square", 0x0048, 0x0056 },
+ specials={ "square", 0x48, 0x56 },
unicodeslot=0x1F14A,
},
[0x1F14B]={
@@ -179532,7 +196819,7 @@ characters.data={
description="SQUARED MV",
direction="l",
linebreak="ai",
- specials={ "square", 0x004D, 0x0056 },
+ specials={ "square", 0x4D, 0x56 },
unicodeslot=0x1F14B,
},
[0x1F14C]={
@@ -179541,7 +196828,7 @@ characters.data={
description="SQUARED SD",
direction="l",
linebreak="ai",
- specials={ "square", 0x0053, 0x0044 },
+ specials={ "square", 0x53, 0x44 },
unicodeslot=0x1F14C,
},
[0x1F14D]={
@@ -179550,7 +196837,7 @@ characters.data={
description="SQUARED SS",
direction="l",
linebreak="ai",
- specials={ "square", 0x0053, 0x0053 },
+ specials={ "square", 0x53, 0x53 },
unicodeslot=0x1F14D,
},
[0x1F14E]={
@@ -179559,7 +196846,7 @@ characters.data={
description="SQUARED PPV",
direction="l",
linebreak="ai",
- specials={ "square", 0x0050, 0x0050, 0x0056 },
+ specials={ "square", 0x50, 0x50, 0x56 },
unicodeslot=0x1F14E,
},
[0x1F14F]={
@@ -179568,7 +196855,7 @@ characters.data={
description="SQUARED WC",
direction="l",
linebreak="ai",
- specials={ "square", 0x0057, 0x0043 },
+ specials={ "square", 0x57, 0x43 },
unicodeslot=0x1F14F,
},
[0x1F150]={
@@ -179784,7 +197071,7 @@ characters.data={
description="RAISED MC SIGN",
direction="on",
linebreak="al",
- specials={ "super", 0x004D, 0x0043 },
+ specials={ "super", 0x4D, 0x43 },
unicodeslot=0x1F16A,
},
[0x1F16B]={
@@ -179792,7 +197079,7 @@ characters.data={
description="RAISED MD SIGN",
direction="on",
linebreak="al",
- specials={ "super", 0x004D, 0x0044 },
+ specials={ "super", 0x4D, 0x44 },
unicodeslot=0x1F16B,
},
[0x1F170]={
@@ -180061,7 +197348,7 @@ characters.data={
description="SQUARE DJ",
direction="l",
linebreak="ai",
- specials={ "square", 0x0044, 0x004A },
+ specials={ "square", 0x44, 0x4A },
unicodeslot=0x1F190,
},
[0x1F191]={
@@ -181078,6 +198365,90 @@ characters.data={
linebreak="id",
unicodeslot=0x1F320,
},
+ [0x1F321]={
+ category="so",
+ description="THERMOMETER",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F321,
+ },
+ [0x1F322]={
+ category="so",
+ description="BLACK DROPLET",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F322,
+ },
+ [0x1F323]={
+ category="so",
+ description="WHITE SUN",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F323,
+ },
+ [0x1F324]={
+ category="so",
+ description="WHITE SUN WITH SMALL CLOUD",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F324,
+ },
+ [0x1F325]={
+ category="so",
+ description="WHITE SUN BEHIND CLOUD",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F325,
+ },
+ [0x1F326]={
+ category="so",
+ description="WHITE SUN BEHIND CLOUD WITH RAIN",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F326,
+ },
+ [0x1F327]={
+ category="so",
+ description="CLOUD WITH RAIN",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F327,
+ },
+ [0x1F328]={
+ category="so",
+ description="CLOUD WITH SNOW",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F328,
+ },
+ [0x1F329]={
+ category="so",
+ description="CLOUD WITH LIGHTNING",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F329,
+ },
+ [0x1F32A]={
+ category="so",
+ description="CLOUD WITH TORNADO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F32A,
+ },
+ [0x1F32B]={
+ category="so",
+ description="FOG",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F32B,
+ },
+ [0x1F32C]={
+ category="so",
+ description="WIND BLOWING FACE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F32C,
+ },
[0x1F330]={
category="so",
description="CHESTNUT",
@@ -181120,6 +198491,13 @@ characters.data={
linebreak="id",
unicodeslot=0x1F335,
},
+ [0x1F336]={
+ category="so",
+ description="HOT PEPPER",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F336,
+ },
[0x1F337]={
category="so",
description="TULIP",
@@ -181610,6 +198988,13 @@ characters.data={
linebreak="id",
unicodeslot=0x1F37C,
},
+ [0x1F37D]={
+ category="so",
+ description="FORK AND KNIFE WITH PLATE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F37D,
+ },
[0x1F380]={
category="so",
description="RIBBON",
@@ -181750,6 +199135,90 @@ characters.data={
linebreak="id",
unicodeslot=0x1F393,
},
+ [0x1F394]={
+ category="so",
+ description="HEART WITH TIP ON THE LEFT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F394,
+ },
+ [0x1F395]={
+ category="so",
+ description="BOUQUET OF FLOWERS",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F395,
+ },
+ [0x1F396]={
+ category="so",
+ description="MILITARY MEDAL",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F396,
+ },
+ [0x1F397]={
+ category="so",
+ description="REMINDER RIBBON",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F397,
+ },
+ [0x1F398]={
+ category="so",
+ description="MUSICAL KEYBOARD WITH JACKS",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F398,
+ },
+ [0x1F399]={
+ category="so",
+ description="STUDIO MICROPHONE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F399,
+ },
+ [0x1F39A]={
+ category="so",
+ description="LEVEL SLIDER",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F39A,
+ },
+ [0x1F39B]={
+ category="so",
+ description="CONTROL KNOBS",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F39B,
+ },
+ [0x1F39C]={
+ category="so",
+ description="BEAMED ASCENDING MUSICAL NOTES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F39C,
+ },
+ [0x1F39D]={
+ category="so",
+ description="BEAMED DESCENDING MUSICAL NOTES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F39D,
+ },
+ [0x1F39E]={
+ category="so",
+ description="FILM FRAMES",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F39E,
+ },
+ [0x1F39F]={
+ category="so",
+ description="ADMISSION TICKETS",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F39F,
+ },
[0x1F3A0]={
category="so",
description="CAROUSEL HORSE",
@@ -182009,6 +199478,13 @@ characters.data={
linebreak="id",
unicodeslot=0x1F3C4,
},
+ [0x1F3C5]={
+ category="so",
+ description="SPORTS MEDAL",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3C5,
+ },
[0x1F3C6]={
category="so",
description="TROPHY",
@@ -182044,6 +199520,118 @@ characters.data={
linebreak="id",
unicodeslot=0x1F3CA,
},
+ [0x1F3CB]={
+ category="so",
+ description="WEIGHT LIFTER",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3CB,
+ },
+ [0x1F3CC]={
+ category="so",
+ description="GOLFER",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3CC,
+ },
+ [0x1F3CD]={
+ category="so",
+ description="RACING MOTORCYCLE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3CD,
+ },
+ [0x1F3CE]={
+ category="so",
+ description="RACING CAR",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3CE,
+ },
+ [0x1F3D4]={
+ category="so",
+ description="SNOW CAPPED MOUNTAIN",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3D4,
+ },
+ [0x1F3D5]={
+ category="so",
+ description="CAMPING",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3D5,
+ },
+ [0x1F3D6]={
+ category="so",
+ description="BEACH WITH UMBRELLA",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3D6,
+ },
+ [0x1F3D7]={
+ category="so",
+ description="BUILDING CONSTRUCTION",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3D7,
+ },
+ [0x1F3D8]={
+ category="so",
+ description="HOUSE BUILDINGS",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3D8,
+ },
+ [0x1F3D9]={
+ category="so",
+ description="CITYSCAPE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3D9,
+ },
+ [0x1F3DA]={
+ category="so",
+ description="DERELICT HOUSE BUILDING",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3DA,
+ },
+ [0x1F3DB]={
+ category="so",
+ description="CLASSICAL BUILDING",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3DB,
+ },
+ [0x1F3DC]={
+ category="so",
+ description="DESERT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3DC,
+ },
+ [0x1F3DD]={
+ category="so",
+ description="DESERT ISLAND",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3DD,
+ },
+ [0x1F3DE]={
+ category="so",
+ description="NATIONAL PARK",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3DE,
+ },
+ [0x1F3DF]={
+ category="so",
+ description="STADIUM",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3DF,
+ },
[0x1F3E0]={
category="so",
description="HOUSE BUILDING",
@@ -182163,6 +199751,55 @@ characters.data={
linebreak="id",
unicodeslot=0x1F3F0,
},
+ [0x1F3F1]={
+ category="so",
+ description="WHITE PENNANT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3F1,
+ },
+ [0x1F3F2]={
+ category="so",
+ description="BLACK PENNANT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3F2,
+ },
+ [0x1F3F3]={
+ category="so",
+ description="WAVING WHITE FLAG",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3F3,
+ },
+ [0x1F3F4]={
+ category="so",
+ description="WAVING BLACK FLAG",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3F4,
+ },
+ [0x1F3F5]={
+ category="so",
+ description="ROSETTE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3F5,
+ },
+ [0x1F3F6]={
+ category="so",
+ description="BLACK ROSETTE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3F6,
+ },
+ [0x1F3F7]={
+ category="so",
+ description="LABEL",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3F7,
+ },
[0x1F400]={
category="so",
description="RAT",
@@ -182604,6 +200241,13 @@ characters.data={
linebreak="id",
unicodeslot=0x1F43E,
},
+ [0x1F43F]={
+ category="so",
+ description="CHIPMUNK",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F43F,
+ },
[0x1F440]={
category="so",
description="EYES",
@@ -182611,6 +200255,13 @@ characters.data={
linebreak="id",
unicodeslot=0x1F440,
},
+ [0x1F441]={
+ category="so",
+ description="EYE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F441,
+ },
[0x1F442]={
category="so",
description="EAR",
@@ -183885,6 +201536,13 @@ characters.data={
linebreak="id",
unicodeslot=0x1F4F7,
},
+ [0x1F4F8]={
+ category="so",
+ description="CAMERA WITH FLASH",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F4F8,
+ },
[0x1F4F9]={
category="so",
description="VIDEO CAMERA",
@@ -183913,6 +201571,20 @@ characters.data={
linebreak="id",
unicodeslot=0x1F4FC,
},
+ [0x1F4FD]={
+ category="so",
+ description="FILM PROJECTOR",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F4FD,
+ },
+ [0x1F4FE]={
+ category="so",
+ description="PORTABLE STEREO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F4FE,
+ },
[0x1F500]={
category="so",
description="TWISTED RIGHTWARDS ARROWS",
@@ -184347,6 +202019,20 @@ characters.data={
linebreak="al",
unicodeslot=0x1F53D,
},
+ [0x1F53E]={
+ category="so",
+ description="LOWER RIGHT SHADOWED WHITE CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F53E,
+ },
+ [0x1F53F]={
+ category="so",
+ description="UPPER RIGHT SHADOWED WHITE CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F53F,
+ },
[0x1F540]={
category="so",
description="CIRCLED CROSS POMMEE",
@@ -184375,6 +202061,55 @@ characters.data={
linebreak="al",
unicodeslot=0x1F543,
},
+ [0x1F544]={
+ category="so",
+ description="NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F544,
+ },
+ [0x1F545]={
+ category="so",
+ description="SYMBOL FOR MARKS CHAPTER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F545,
+ },
+ [0x1F546]={
+ category="so",
+ description="WHITE LATIN CROSS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F546,
+ },
+ [0x1F547]={
+ category="so",
+ description="HEAVY LATIN CROSS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F547,
+ },
+ [0x1F548]={
+ category="so",
+ description="CELTIC CROSS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F548,
+ },
+ [0x1F549]={
+ category="so",
+ description="OM SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F549,
+ },
+ [0x1F54A]={
+ category="so",
+ description="DOVE OF PEACE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F54A,
+ },
[0x1F550]={
category="so",
description="CLOCK FACE ONE OCLOCK",
@@ -184543,6 +202278,1021 @@ characters.data={
linebreak="id",
unicodeslot=0x1F567,
},
+ [0x1F568]={
+ category="so",
+ description="RIGHT SPEAKER",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F568,
+ },
+ [0x1F569]={
+ category="so",
+ description="RIGHT SPEAKER WITH ONE SOUND WAVE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F569,
+ },
+ [0x1F56A]={
+ category="so",
+ description="RIGHT SPEAKER WITH THREE SOUND WAVES",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F56A,
+ },
+ [0x1F56B]={
+ category="so",
+ description="BULLHORN",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F56B,
+ },
+ [0x1F56C]={
+ category="so",
+ description="BULLHORN WITH SOUND WAVES",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F56C,
+ },
+ [0x1F56D]={
+ category="so",
+ description="RINGING BELL",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F56D,
+ },
+ [0x1F56E]={
+ category="so",
+ description="BOOK",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F56E,
+ },
+ [0x1F56F]={
+ category="so",
+ description="CANDLE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F56F,
+ },
+ [0x1F570]={
+ category="so",
+ description="MANTELPIECE CLOCK",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F570,
+ },
+ [0x1F571]={
+ category="so",
+ description="BLACK SKULL AND CROSSBONES",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F571,
+ },
+ [0x1F572]={
+ category="so",
+ description="NO PIRACY",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F572,
+ },
+ [0x1F573]={
+ category="so",
+ description="HOLE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F573,
+ },
+ [0x1F574]={
+ category="so",
+ description="MAN IN BUSINESS SUIT LEVITATING",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F574,
+ },
+ [0x1F575]={
+ category="so",
+ description="SLEUTH OR SPY",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F575,
+ },
+ [0x1F576]={
+ category="so",
+ description="DARK SUNGLASSES",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F576,
+ },
+ [0x1F577]={
+ category="so",
+ description="SPIDER",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F577,
+ },
+ [0x1F578]={
+ category="so",
+ description="SPIDER WEB",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F578,
+ },
+ [0x1F579]={
+ category="so",
+ description="JOYSTICK",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F579,
+ },
+ [0x1F57B]={
+ category="so",
+ description="LEFT HAND TELEPHONE RECEIVER",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F57B,
+ },
+ [0x1F57C]={
+ category="so",
+ description="TELEPHONE RECEIVER WITH PAGE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F57C,
+ },
+ [0x1F57D]={
+ category="so",
+ description="RIGHT HAND TELEPHONE RECEIVER",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F57D,
+ },
+ [0x1F57E]={
+ category="so",
+ description="WHITE TOUCHTONE TELEPHONE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F57E,
+ },
+ [0x1F57F]={
+ category="so",
+ description="BLACK TOUCHTONE TELEPHONE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F57F,
+ },
+ [0x1F580]={
+ category="so",
+ description="TELEPHONE ON TOP OF MODEM",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F580,
+ },
+ [0x1F581]={
+ category="so",
+ description="CLAMSHELL MOBILE PHONE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F581,
+ },
+ [0x1F582]={
+ category="so",
+ description="BACK OF ENVELOPE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F582,
+ },
+ [0x1F583]={
+ category="so",
+ description="STAMPED ENVELOPE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F583,
+ },
+ [0x1F584]={
+ category="so",
+ description="ENVELOPE WITH LIGHTNING",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F584,
+ },
+ [0x1F585]={
+ category="so",
+ description="FLYING ENVELOPE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F585,
+ },
+ [0x1F586]={
+ category="so",
+ description="PEN OVER STAMPED ENVELOPE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F586,
+ },
+ [0x1F587]={
+ category="so",
+ description="LINKED PAPERCLIPS",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F587,
+ },
+ [0x1F588]={
+ category="so",
+ description="BLACK PUSHPIN",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F588,
+ },
+ [0x1F589]={
+ category="so",
+ description="LOWER LEFT PENCIL",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F589,
+ },
+ [0x1F58A]={
+ category="so",
+ description="LOWER LEFT BALLPOINT PEN",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F58A,
+ },
+ [0x1F58B]={
+ category="so",
+ description="LOWER LEFT FOUNTAIN PEN",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F58B,
+ },
+ [0x1F58C]={
+ category="so",
+ description="LOWER LEFT PAINTBRUSH",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F58C,
+ },
+ [0x1F58D]={
+ category="so",
+ description="LOWER LEFT CRAYON",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F58D,
+ },
+ [0x1F58E]={
+ category="so",
+ description="LEFT WRITING HAND",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F58E,
+ },
+ [0x1F58F]={
+ category="so",
+ description="TURNED OK HAND SIGN",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F58F,
+ },
+ [0x1F590]={
+ category="so",
+ description="RAISED HAND WITH FINGERS SPLAYED",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F590,
+ },
+ [0x1F591]={
+ category="so",
+ description="REVERSED RAISED HAND WITH FINGERS SPLAYED",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F591,
+ },
+ [0x1F592]={
+ category="so",
+ description="REVERSED THUMBS UP SIGN",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F592,
+ },
+ [0x1F593]={
+ category="so",
+ description="REVERSED THUMBS DOWN SIGN",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F593,
+ },
+ [0x1F594]={
+ category="so",
+ description="REVERSED VICTORY HAND",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F594,
+ },
+ [0x1F595]={
+ category="so",
+ description="REVERSED HAND WITH MIDDLE FINGER EXTENDED",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F595,
+ },
+ [0x1F596]={
+ category="so",
+ description="RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F596,
+ },
+ [0x1F597]={
+ category="so",
+ description="WHITE DOWN POINTING LEFT HAND INDEX",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F597,
+ },
+ [0x1F598]={
+ category="so",
+ description="SIDEWAYS WHITE LEFT POINTING INDEX",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F598,
+ },
+ [0x1F599]={
+ category="so",
+ description="SIDEWAYS WHITE RIGHT POINTING INDEX",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F599,
+ },
+ [0x1F59A]={
+ category="so",
+ description="SIDEWAYS BLACK LEFT POINTING INDEX",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F59A,
+ },
+ [0x1F59B]={
+ category="so",
+ description="SIDEWAYS BLACK RIGHT POINTING INDEX",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F59B,
+ },
+ [0x1F59C]={
+ category="so",
+ description="BLACK LEFT POINTING BACKHAND INDEX",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F59C,
+ },
+ [0x1F59D]={
+ category="so",
+ description="BLACK RIGHT POINTING BACKHAND INDEX",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F59D,
+ },
+ [0x1F59E]={
+ category="so",
+ description="SIDEWAYS WHITE UP POINTING INDEX",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F59E,
+ },
+ [0x1F59F]={
+ category="so",
+ description="SIDEWAYS WHITE DOWN POINTING INDEX",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F59F,
+ },
+ [0x1F5A0]={
+ category="so",
+ description="SIDEWAYS BLACK UP POINTING INDEX",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5A0,
+ },
+ [0x1F5A1]={
+ category="so",
+ description="SIDEWAYS BLACK DOWN POINTING INDEX",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5A1,
+ },
+ [0x1F5A2]={
+ category="so",
+ description="BLACK UP POINTING BACKHAND INDEX",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5A2,
+ },
+ [0x1F5A3]={
+ category="so",
+ description="BLACK DOWN POINTING BACKHAND INDEX",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5A3,
+ },
+ [0x1F5A5]={
+ category="so",
+ description="DESKTOP COMPUTER",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5A5,
+ },
+ [0x1F5A6]={
+ category="so",
+ description="KEYBOARD AND MOUSE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5A6,
+ },
+ [0x1F5A7]={
+ category="so",
+ description="THREE NETWORKED COMPUTERS",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5A7,
+ },
+ [0x1F5A8]={
+ category="so",
+ description="PRINTER",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5A8,
+ },
+ [0x1F5A9]={
+ category="so",
+ description="POCKET CALCULATOR",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5A9,
+ },
+ [0x1F5AA]={
+ category="so",
+ description="BLACK HARD SHELL FLOPPY DISK",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5AA,
+ },
+ [0x1F5AB]={
+ category="so",
+ description="WHITE HARD SHELL FLOPPY DISK",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5AB,
+ },
+ [0x1F5AC]={
+ category="so",
+ description="SOFT SHELL FLOPPY DISK",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5AC,
+ },
+ [0x1F5AD]={
+ category="so",
+ description="TAPE CARTRIDGE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5AD,
+ },
+ [0x1F5AE]={
+ category="so",
+ description="WIRED KEYBOARD",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5AE,
+ },
+ [0x1F5AF]={
+ category="so",
+ description="ONE BUTTON MOUSE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5AF,
+ },
+ [0x1F5B0]={
+ category="so",
+ description="TWO BUTTON MOUSE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5B0,
+ },
+ [0x1F5B1]={
+ category="so",
+ description="THREE BUTTON MOUSE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5B1,
+ },
+ [0x1F5B2]={
+ category="so",
+ description="TRACKBALL",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5B2,
+ },
+ [0x1F5B3]={
+ category="so",
+ description="OLD PERSONAL COMPUTER",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5B3,
+ },
+ [0x1F5B4]={
+ category="so",
+ description="HARD DISK",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5B4,
+ },
+ [0x1F5B5]={
+ category="so",
+ description="SCREEN",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5B5,
+ },
+ [0x1F5B6]={
+ category="so",
+ description="PRINTER ICON",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5B6,
+ },
+ [0x1F5B7]={
+ category="so",
+ description="FAX ICON",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5B7,
+ },
+ [0x1F5B8]={
+ category="so",
+ description="OPTICAL DISC ICON",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5B8,
+ },
+ [0x1F5B9]={
+ category="so",
+ description="DOCUMENT WITH TEXT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5B9,
+ },
+ [0x1F5BA]={
+ category="so",
+ description="DOCUMENT WITH TEXT AND PICTURE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5BA,
+ },
+ [0x1F5BB]={
+ category="so",
+ description="DOCUMENT WITH PICTURE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5BB,
+ },
+ [0x1F5BC]={
+ category="so",
+ description="FRAME WITH PICTURE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5BC,
+ },
+ [0x1F5BD]={
+ category="so",
+ description="FRAME WITH TILES",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5BD,
+ },
+ [0x1F5BE]={
+ category="so",
+ description="FRAME WITH AN X",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5BE,
+ },
+ [0x1F5BF]={
+ category="so",
+ description="BLACK FOLDER",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5BF,
+ },
+ [0x1F5C0]={
+ category="so",
+ description="FOLDER",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5C0,
+ },
+ [0x1F5C1]={
+ category="so",
+ description="OPEN FOLDER",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5C1,
+ },
+ [0x1F5C2]={
+ category="so",
+ description="CARD INDEX DIVIDERS",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5C2,
+ },
+ [0x1F5C3]={
+ category="so",
+ description="CARD FILE BOX",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5C3,
+ },
+ [0x1F5C4]={
+ category="so",
+ description="FILE CABINET",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5C4,
+ },
+ [0x1F5C5]={
+ category="so",
+ description="EMPTY NOTE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5C5,
+ },
+ [0x1F5C6]={
+ category="so",
+ description="EMPTY NOTE PAGE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5C6,
+ },
+ [0x1F5C7]={
+ category="so",
+ description="EMPTY NOTE PAD",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5C7,
+ },
+ [0x1F5C8]={
+ category="so",
+ description="NOTE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5C8,
+ },
+ [0x1F5C9]={
+ category="so",
+ description="NOTE PAGE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5C9,
+ },
+ [0x1F5CA]={
+ category="so",
+ description="NOTE PAD",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5CA,
+ },
+ [0x1F5CB]={
+ category="so",
+ description="EMPTY DOCUMENT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5CB,
+ },
+ [0x1F5CC]={
+ category="so",
+ description="EMPTY PAGE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5CC,
+ },
+ [0x1F5CD]={
+ category="so",
+ description="EMPTY PAGES",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5CD,
+ },
+ [0x1F5CE]={
+ category="so",
+ description="DOCUMENT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5CE,
+ },
+ [0x1F5CF]={
+ category="so",
+ description="PAGE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5CF,
+ },
+ [0x1F5D0]={
+ category="so",
+ description="PAGES",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5D0,
+ },
+ [0x1F5D1]={
+ category="so",
+ description="WASTEBASKET",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5D1,
+ },
+ [0x1F5D2]={
+ category="so",
+ description="SPIRAL NOTE PAD",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5D2,
+ },
+ [0x1F5D3]={
+ category="so",
+ description="SPIRAL CALENDAR PAD",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5D3,
+ },
+ [0x1F5D4]={
+ category="so",
+ description="DESKTOP WINDOW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F5D4,
+ },
+ [0x1F5D5]={
+ category="so",
+ description="MINIMIZE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F5D5,
+ },
+ [0x1F5D6]={
+ category="so",
+ description="MAXIMIZE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F5D6,
+ },
+ [0x1F5D7]={
+ category="so",
+ description="OVERLAP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F5D7,
+ },
+ [0x1F5D8]={
+ category="so",
+ description="CLOCKWISE RIGHT AND LEFT SEMICIRCLE ARROWS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F5D8,
+ },
+ [0x1F5D9]={
+ category="so",
+ description="CANCELLATION X",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F5D9,
+ },
+ [0x1F5DA]={
+ category="so",
+ description="INCREASE FONT SIZE SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F5DA,
+ },
+ [0x1F5DB]={
+ category="so",
+ description="DECREASE FONT SIZE SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F5DB,
+ },
+ [0x1F5DC]={
+ category="so",
+ description="COMPRESSION",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5DC,
+ },
+ [0x1F5DD]={
+ category="so",
+ description="OLD KEY",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5DD,
+ },
+ [0x1F5DE]={
+ category="so",
+ description="ROLLED-UP NEWSPAPER",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5DE,
+ },
+ [0x1F5DF]={
+ category="so",
+ description="PAGE WITH CIRCLED TEXT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5DF,
+ },
+ [0x1F5E0]={
+ category="so",
+ description="STOCK CHART",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5E0,
+ },
+ [0x1F5E1]={
+ category="so",
+ description="DAGGER KNIFE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5E1,
+ },
+ [0x1F5E2]={
+ category="so",
+ description="LIPS",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5E2,
+ },
+ [0x1F5E3]={
+ category="so",
+ description="SPEAKING HEAD IN SILHOUETTE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5E3,
+ },
+ [0x1F5E4]={
+ category="so",
+ description="THREE RAYS ABOVE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5E4,
+ },
+ [0x1F5E5]={
+ category="so",
+ description="THREE RAYS BELOW",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5E5,
+ },
+ [0x1F5E6]={
+ category="so",
+ description="THREE RAYS LEFT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5E6,
+ },
+ [0x1F5E7]={
+ category="so",
+ description="THREE RAYS RIGHT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5E7,
+ },
+ [0x1F5E8]={
+ category="so",
+ description="LEFT SPEECH BUBBLE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5E8,
+ },
+ [0x1F5E9]={
+ category="so",
+ description="RIGHT SPEECH BUBBLE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5E9,
+ },
+ [0x1F5EA]={
+ category="so",
+ description="TWO SPEECH BUBBLES",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5EA,
+ },
+ [0x1F5EB]={
+ category="so",
+ description="THREE SPEECH BUBBLES",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5EB,
+ },
+ [0x1F5EC]={
+ category="so",
+ description="LEFT THOUGHT BUBBLE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5EC,
+ },
+ [0x1F5ED]={
+ category="so",
+ description="RIGHT THOUGHT BUBBLE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5ED,
+ },
+ [0x1F5EE]={
+ category="so",
+ description="LEFT ANGER BUBBLE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5EE,
+ },
+ [0x1F5EF]={
+ category="so",
+ description="RIGHT ANGER BUBBLE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5EF,
+ },
+ [0x1F5F0]={
+ category="so",
+ description="MOOD BUBBLE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5F0,
+ },
+ [0x1F5F1]={
+ category="so",
+ description="LIGHTNING MOOD BUBBLE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5F1,
+ },
+ [0x1F5F2]={
+ category="so",
+ description="LIGHTNING MOOD",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5F2,
+ },
+ [0x1F5F3]={
+ category="so",
+ description="BALLOT BOX WITH BALLOT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5F3,
+ },
+ [0x1F5F4]={
+ category="so",
+ description="BALLOT SCRIPT X",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F5F4,
+ },
+ [0x1F5F5]={
+ category="so",
+ description="BALLOT BOX WITH SCRIPT X",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F5F5,
+ },
+ [0x1F5F6]={
+ category="so",
+ description="BALLOT BOLD SCRIPT X",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F5F6,
+ },
+ [0x1F5F7]={
+ category="so",
+ description="BALLOT BOX WITH BOLD SCRIPT X",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F5F7,
+ },
+ [0x1F5F8]={
+ category="so",
+ description="LIGHT CHECK MARK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F5F8,
+ },
+ [0x1F5F9]={
+ category="so",
+ description="BALLOT BOX WITH BOLD CHECK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F5F9,
+ },
+ [0x1F5FA]={
+ category="so",
+ description="WORLD MAP",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F5FA,
+ },
[0x1F5FB]={
category="so",
description="MOUNT FUJI",
@@ -185033,6 +203783,20 @@ characters.data={
linebreak="id",
unicodeslot=0x1F640,
},
+ [0x1F641]={
+ category="so",
+ description="SLIGHTLY FROWNING FACE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F641,
+ },
+ [0x1F642]={
+ category="so",
+ description="SLIGHTLY SMILING FACE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F642,
+ },
[0x1F645]={
category="so",
description="FACE WITH NO GOOD GESTURE",
@@ -185110,6 +203874,342 @@ characters.data={
linebreak="id",
unicodeslot=0x1F64F,
},
+ [0x1F650]={
+ category="so",
+ description="NORTH WEST POINTING LEAF",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F650,
+ },
+ [0x1F651]={
+ category="so",
+ description="SOUTH WEST POINTING LEAF",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F651,
+ },
+ [0x1F652]={
+ category="so",
+ description="NORTH EAST POINTING LEAF",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F652,
+ },
+ [0x1F653]={
+ category="so",
+ description="SOUTH EAST POINTING LEAF",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F653,
+ },
+ [0x1F654]={
+ category="so",
+ description="TURNED NORTH WEST POINTING LEAF",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F654,
+ },
+ [0x1F655]={
+ category="so",
+ description="TURNED SOUTH WEST POINTING LEAF",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F655,
+ },
+ [0x1F656]={
+ category="so",
+ description="TURNED NORTH EAST POINTING LEAF",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F656,
+ },
+ [0x1F657]={
+ category="so",
+ description="TURNED SOUTH EAST POINTING LEAF",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F657,
+ },
+ [0x1F658]={
+ category="so",
+ description="NORTH WEST POINTING VINE LEAF",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F658,
+ },
+ [0x1F659]={
+ category="so",
+ description="SOUTH WEST POINTING VINE LEAF",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F659,
+ },
+ [0x1F65A]={
+ category="so",
+ description="NORTH EAST POINTING VINE LEAF",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F65A,
+ },
+ [0x1F65B]={
+ category="so",
+ description="SOUTH EAST POINTING VINE LEAF",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F65B,
+ },
+ [0x1F65C]={
+ category="so",
+ description="HEAVY NORTH WEST POINTING VINE LEAF",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F65C,
+ },
+ [0x1F65D]={
+ category="so",
+ description="HEAVY SOUTH WEST POINTING VINE LEAF",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F65D,
+ },
+ [0x1F65E]={
+ category="so",
+ description="HEAVY NORTH EAST POINTING VINE LEAF",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F65E,
+ },
+ [0x1F65F]={
+ category="so",
+ description="HEAVY SOUTH EAST POINTING VINE LEAF",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F65F,
+ },
+ [0x1F660]={
+ category="so",
+ description="NORTH WEST POINTING BUD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F660,
+ },
+ [0x1F661]={
+ category="so",
+ description="SOUTH WEST POINTING BUD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F661,
+ },
+ [0x1F662]={
+ category="so",
+ description="NORTH EAST POINTING BUD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F662,
+ },
+ [0x1F663]={
+ category="so",
+ description="SOUTH EAST POINTING BUD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F663,
+ },
+ [0x1F664]={
+ category="so",
+ description="HEAVY NORTH WEST POINTING BUD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F664,
+ },
+ [0x1F665]={
+ category="so",
+ description="HEAVY SOUTH WEST POINTING BUD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F665,
+ },
+ [0x1F666]={
+ category="so",
+ description="HEAVY NORTH EAST POINTING BUD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F666,
+ },
+ [0x1F667]={
+ category="so",
+ description="HEAVY SOUTH EAST POINTING BUD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F667,
+ },
+ [0x1F668]={
+ category="so",
+ description="HOLLOW QUILT SQUARE ORNAMENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F668,
+ },
+ [0x1F669]={
+ category="so",
+ description="HOLLOW QUILT SQUARE ORNAMENT IN BLACK SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F669,
+ },
+ [0x1F66A]={
+ category="so",
+ description="SOLID QUILT SQUARE ORNAMENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F66A,
+ },
+ [0x1F66B]={
+ category="so",
+ description="SOLID QUILT SQUARE ORNAMENT IN BLACK SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F66B,
+ },
+ [0x1F66C]={
+ category="so",
+ description="LEFTWARDS ROCKET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F66C,
+ },
+ [0x1F66D]={
+ category="so",
+ description="UPWARDS ROCKET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F66D,
+ },
+ [0x1F66E]={
+ category="so",
+ description="RIGHTWARDS ROCKET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F66E,
+ },
+ [0x1F66F]={
+ category="so",
+ description="DOWNWARDS ROCKET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F66F,
+ },
+ [0x1F670]={
+ category="so",
+ description="SCRIPT LIGATURE ET ORNAMENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F670,
+ },
+ [0x1F671]={
+ category="so",
+ description="HEAVY SCRIPT LIGATURE ET ORNAMENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F671,
+ },
+ [0x1F672]={
+ category="so",
+ description="LIGATURE OPEN ET ORNAMENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F672,
+ },
+ [0x1F673]={
+ category="so",
+ description="HEAVY LIGATURE OPEN ET ORNAMENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F673,
+ },
+ [0x1F674]={
+ category="so",
+ description="HEAVY AMPERSAND ORNAMENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F674,
+ },
+ [0x1F675]={
+ category="so",
+ description="SWASH AMPERSAND ORNAMENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F675,
+ },
+ [0x1F676]={
+ category="so",
+ description="SANS-SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT",
+ direction="on",
+ linebreak="qu",
+ unicodeslot=0x1F676,
+ },
+ [0x1F677]={
+ category="so",
+ description="SANS-SERIF HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT",
+ direction="on",
+ linebreak="qu",
+ unicodeslot=0x1F677,
+ },
+ [0x1F678]={
+ category="so",
+ description="SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT",
+ direction="on",
+ linebreak="qu",
+ unicodeslot=0x1F678,
+ },
+ [0x1F679]={
+ category="so",
+ description="HEAVY INTERROBANG ORNAMENT",
+ direction="on",
+ linebreak="ns",
+ unicodeslot=0x1F679,
+ },
+ [0x1F67A]={
+ category="so",
+ description="SANS-SERIF INTERROBANG ORNAMENT",
+ direction="on",
+ linebreak="ns",
+ unicodeslot=0x1F67A,
+ },
+ [0x1F67B]={
+ category="so",
+ description="HEAVY SANS-SERIF INTERROBANG ORNAMENT",
+ direction="on",
+ linebreak="ns",
+ unicodeslot=0x1F67B,
+ },
+ [0x1F67C]={
+ category="so",
+ description="VERY HEAVY SOLIDUS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F67C,
+ },
+ [0x1F67D]={
+ category="so",
+ description="VERY HEAVY REVERSE SOLIDUS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F67D,
+ },
+ [0x1F67E]={
+ category="so",
+ description="CHECKER BOARD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F67E,
+ },
+ [0x1F67F]={
+ category="so",
+ description="REVERSE CHECKER BOARD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F67F,
+ },
[0x1F680]={
category="so",
description="ROCKET",
@@ -185600,6 +204700,195 @@ characters.data={
linebreak="id",
unicodeslot=0x1F6C5,
},
+ [0x1F6C6]={
+ category="so",
+ description="TRIANGLE WITH ROUNDED CORNERS",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6C6,
+ },
+ [0x1F6C7]={
+ category="so",
+ description="PROHIBITED SIGN",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6C7,
+ },
+ [0x1F6C8]={
+ category="so",
+ description="CIRCLED INFORMATION SOURCE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6C8,
+ },
+ [0x1F6C9]={
+ category="so",
+ description="BOYS SYMBOL",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6C9,
+ },
+ [0x1F6CA]={
+ category="so",
+ description="GIRLS SYMBOL",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6CA,
+ },
+ [0x1F6CB]={
+ category="so",
+ description="COUCH AND LAMP",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6CB,
+ },
+ [0x1F6CC]={
+ category="so",
+ description="SLEEPING ACCOMMODATION",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6CC,
+ },
+ [0x1F6CD]={
+ category="so",
+ description="SHOPPING BAGS",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6CD,
+ },
+ [0x1F6CE]={
+ category="so",
+ description="BELLHOP BELL",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6CE,
+ },
+ [0x1F6CF]={
+ category="so",
+ description="BED",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6CF,
+ },
+ [0x1F6E0]={
+ category="so",
+ description="HAMMER AND WRENCH",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6E0,
+ },
+ [0x1F6E1]={
+ category="so",
+ description="SHIELD",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6E1,
+ },
+ [0x1F6E2]={
+ category="so",
+ description="OIL DRUM",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6E2,
+ },
+ [0x1F6E3]={
+ category="so",
+ description="MOTORWAY",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6E3,
+ },
+ [0x1F6E4]={
+ category="so",
+ description="RAILWAY TRACK",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6E4,
+ },
+ [0x1F6E5]={
+ category="so",
+ description="MOTOR BOAT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6E5,
+ },
+ [0x1F6E6]={
+ category="so",
+ description="UP-POINTING MILITARY AIRPLANE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6E6,
+ },
+ [0x1F6E7]={
+ category="so",
+ description="UP-POINTING AIRPLANE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6E7,
+ },
+ [0x1F6E8]={
+ category="so",
+ description="UP-POINTING SMALL AIRPLANE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6E8,
+ },
+ [0x1F6E9]={
+ category="so",
+ description="SMALL AIRPLANE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6E9,
+ },
+ [0x1F6EA]={
+ category="so",
+ description="NORTHEAST-POINTING AIRPLANE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6EA,
+ },
+ [0x1F6EB]={
+ category="so",
+ description="AIRPLANE DEPARTURE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6EB,
+ },
+ [0x1F6EC]={
+ category="so",
+ description="AIRPLANE ARRIVING",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6EC,
+ },
+ [0x1F6F0]={
+ category="so",
+ description="SATELLITE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6F0,
+ },
+ [0x1F6F1]={
+ category="so",
+ description="ONCOMING FIRE ENGINE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6F1,
+ },
+ [0x1F6F2]={
+ category="so",
+ description="DIESEL LOCOMOTIVE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6F2,
+ },
+ [0x1F6F3]={
+ category="so",
+ description="PASSENGER SHIP",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6F3,
+ },
[0x1F700]={
category="so",
description="ALCHEMICAL SYMBOL FOR QUINTESSENCE",
@@ -186412,6 +205701,1637 @@ characters.data={
linebreak="al",
unicodeslot=0x1F773,
},
+ [0x1F780]={
+ category="so",
+ description="BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F780,
+ },
+ [0x1F781]={
+ category="so",
+ description="BLACK UP-POINTING ISOSCELES RIGHT TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F781,
+ },
+ [0x1F782]={
+ category="so",
+ description="BLACK RIGHT-POINTING ISOSCELES RIGHT TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F782,
+ },
+ [0x1F783]={
+ category="so",
+ description="BLACK DOWN-POINTING ISOSCELES RIGHT TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F783,
+ },
+ [0x1F784]={
+ category="so",
+ description="BLACK SLIGHTLY SMALL CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F784,
+ },
+ [0x1F785]={
+ category="so",
+ description="MEDIUM BOLD WHITE CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F785,
+ },
+ [0x1F786]={
+ category="so",
+ description="BOLD WHITE CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F786,
+ },
+ [0x1F787]={
+ category="so",
+ description="HEAVY WHITE CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F787,
+ },
+ [0x1F788]={
+ category="so",
+ description="VERY HEAVY WHITE CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F788,
+ },
+ [0x1F789]={
+ category="so",
+ description="EXTREMELY HEAVY WHITE CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F789,
+ },
+ [0x1F78A]={
+ category="so",
+ description="WHITE CIRCLE CONTAINING BLACK SMALL CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F78A,
+ },
+ [0x1F78B]={
+ category="so",
+ description="ROUND TARGET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F78B,
+ },
+ [0x1F78C]={
+ category="so",
+ description="BLACK TINY SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F78C,
+ },
+ [0x1F78D]={
+ category="so",
+ description="BLACK SLIGHTLY SMALL SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F78D,
+ },
+ [0x1F78E]={
+ category="so",
+ description="LIGHT WHITE SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F78E,
+ },
+ [0x1F78F]={
+ category="so",
+ description="MEDIUM WHITE SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F78F,
+ },
+ [0x1F790]={
+ category="so",
+ description="BOLD WHITE SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F790,
+ },
+ [0x1F791]={
+ category="so",
+ description="HEAVY WHITE SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F791,
+ },
+ [0x1F792]={
+ category="so",
+ description="VERY HEAVY WHITE SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F792,
+ },
+ [0x1F793]={
+ category="so",
+ description="EXTREMELY HEAVY WHITE SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F793,
+ },
+ [0x1F794]={
+ category="so",
+ description="WHITE SQUARE CONTAINING BLACK VERY SMALL SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F794,
+ },
+ [0x1F795]={
+ category="so",
+ description="WHITE SQUARE CONTAINING BLACK MEDIUM SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F795,
+ },
+ [0x1F796]={
+ category="so",
+ description="SQUARE TARGET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F796,
+ },
+ [0x1F797]={
+ category="so",
+ description="BLACK TINY DIAMOND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F797,
+ },
+ [0x1F798]={
+ category="so",
+ description="BLACK VERY SMALL DIAMOND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F798,
+ },
+ [0x1F799]={
+ category="so",
+ description="BLACK MEDIUM SMALL DIAMOND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F799,
+ },
+ [0x1F79A]={
+ category="so",
+ description="WHITE DIAMOND CONTAINING BLACK VERY SMALL DIAMOND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F79A,
+ },
+ [0x1F79B]={
+ category="so",
+ description="WHITE DIAMOND CONTAINING BLACK MEDIUM DIAMOND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F79B,
+ },
+ [0x1F79C]={
+ category="so",
+ description="DIAMOND TARGET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F79C,
+ },
+ [0x1F79D]={
+ category="so",
+ description="BLACK TINY LOZENGE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F79D,
+ },
+ [0x1F79E]={
+ category="so",
+ description="BLACK VERY SMALL LOZENGE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F79E,
+ },
+ [0x1F79F]={
+ category="so",
+ description="BLACK MEDIUM SMALL LOZENGE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F79F,
+ },
+ [0x1F7A0]={
+ category="so",
+ description="WHITE LOZENGE CONTAINING BLACK SMALL LOZENGE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7A0,
+ },
+ [0x1F7A1]={
+ category="so",
+ description="THIN GREEK CROSS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7A1,
+ },
+ [0x1F7A2]={
+ category="so",
+ description="LIGHT GREEK CROSS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7A2,
+ },
+ [0x1F7A3]={
+ category="so",
+ description="MEDIUM GREEK CROSS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7A3,
+ },
+ [0x1F7A4]={
+ category="so",
+ description="BOLD GREEK CROSS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7A4,
+ },
+ [0x1F7A5]={
+ category="so",
+ description="VERY BOLD GREEK CROSS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7A5,
+ },
+ [0x1F7A6]={
+ category="so",
+ description="VERY HEAVY GREEK CROSS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7A6,
+ },
+ [0x1F7A7]={
+ category="so",
+ description="EXTREMELY HEAVY GREEK CROSS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7A7,
+ },
+ [0x1F7A8]={
+ category="so",
+ description="THIN SALTIRE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7A8,
+ },
+ [0x1F7A9]={
+ category="so",
+ description="LIGHT SALTIRE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7A9,
+ },
+ [0x1F7AA]={
+ category="so",
+ description="MEDIUM SALTIRE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7AA,
+ },
+ [0x1F7AB]={
+ category="so",
+ description="BOLD SALTIRE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7AB,
+ },
+ [0x1F7AC]={
+ category="so",
+ description="HEAVY SALTIRE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7AC,
+ },
+ [0x1F7AD]={
+ category="so",
+ description="VERY HEAVY SALTIRE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7AD,
+ },
+ [0x1F7AE]={
+ category="so",
+ description="EXTREMELY HEAVY SALTIRE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7AE,
+ },
+ [0x1F7AF]={
+ category="so",
+ description="LIGHT FIVE SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7AF,
+ },
+ [0x1F7B0]={
+ category="so",
+ description="MEDIUM FIVE SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7B0,
+ },
+ [0x1F7B1]={
+ category="so",
+ description="BOLD FIVE SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7B1,
+ },
+ [0x1F7B2]={
+ category="so",
+ description="HEAVY FIVE SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7B2,
+ },
+ [0x1F7B3]={
+ category="so",
+ description="VERY HEAVY FIVE SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7B3,
+ },
+ [0x1F7B4]={
+ category="so",
+ description="EXTREMELY HEAVY FIVE SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7B4,
+ },
+ [0x1F7B5]={
+ category="so",
+ description="LIGHT SIX SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7B5,
+ },
+ [0x1F7B6]={
+ category="so",
+ description="MEDIUM SIX SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7B6,
+ },
+ [0x1F7B7]={
+ category="so",
+ description="BOLD SIX SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7B7,
+ },
+ [0x1F7B8]={
+ category="so",
+ description="HEAVY SIX SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7B8,
+ },
+ [0x1F7B9]={
+ category="so",
+ description="VERY HEAVY SIX SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7B9,
+ },
+ [0x1F7BA]={
+ category="so",
+ description="EXTREMELY HEAVY SIX SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7BA,
+ },
+ [0x1F7BB]={
+ category="so",
+ description="LIGHT EIGHT SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7BB,
+ },
+ [0x1F7BC]={
+ category="so",
+ description="MEDIUM EIGHT SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7BC,
+ },
+ [0x1F7BD]={
+ category="so",
+ description="BOLD EIGHT SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7BD,
+ },
+ [0x1F7BE]={
+ category="so",
+ description="HEAVY EIGHT SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7BE,
+ },
+ [0x1F7BF]={
+ category="so",
+ description="VERY HEAVY EIGHT SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7BF,
+ },
+ [0x1F7C0]={
+ category="so",
+ description="LIGHT THREE POINTED BLACK STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7C0,
+ },
+ [0x1F7C1]={
+ category="so",
+ description="MEDIUM THREE POINTED BLACK STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7C1,
+ },
+ [0x1F7C2]={
+ category="so",
+ description="THREE POINTED BLACK STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7C2,
+ },
+ [0x1F7C3]={
+ category="so",
+ description="MEDIUM THREE POINTED PINWHEEL STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7C3,
+ },
+ [0x1F7C4]={
+ category="so",
+ description="LIGHT FOUR POINTED BLACK STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7C4,
+ },
+ [0x1F7C5]={
+ category="so",
+ description="MEDIUM FOUR POINTED BLACK STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7C5,
+ },
+ [0x1F7C6]={
+ category="so",
+ description="FOUR POINTED BLACK STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7C6,
+ },
+ [0x1F7C7]={
+ category="so",
+ description="MEDIUM FOUR POINTED PINWHEEL STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7C7,
+ },
+ [0x1F7C8]={
+ category="so",
+ description="REVERSE LIGHT FOUR POINTED PINWHEEL STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7C8,
+ },
+ [0x1F7C9]={
+ category="so",
+ description="LIGHT FIVE POINTED BLACK STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7C9,
+ },
+ [0x1F7CA]={
+ category="so",
+ description="HEAVY FIVE POINTED BLACK STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7CA,
+ },
+ [0x1F7CB]={
+ category="so",
+ description="MEDIUM SIX POINTED BLACK STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7CB,
+ },
+ [0x1F7CC]={
+ category="so",
+ description="HEAVY SIX POINTED BLACK STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7CC,
+ },
+ [0x1F7CD]={
+ category="so",
+ description="SIX POINTED PINWHEEL STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7CD,
+ },
+ [0x1F7CE]={
+ category="so",
+ description="MEDIUM EIGHT POINTED BLACK STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7CE,
+ },
+ [0x1F7CF]={
+ category="so",
+ description="HEAVY EIGHT POINTED BLACK STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7CF,
+ },
+ [0x1F7D0]={
+ category="so",
+ description="VERY HEAVY EIGHT POINTED BLACK STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7D0,
+ },
+ [0x1F7D1]={
+ category="so",
+ description="HEAVY EIGHT POINTED PINWHEEL STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7D1,
+ },
+ [0x1F7D2]={
+ category="so",
+ description="LIGHT TWELVE POINTED BLACK STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7D2,
+ },
+ [0x1F7D3]={
+ category="so",
+ description="HEAVY TWELVE POINTED BLACK STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7D3,
+ },
+ [0x1F7D4]={
+ category="so",
+ description="HEAVY TWELVE POINTED PINWHEEL STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F7D4,
+ },
+ [0x1F800]={
+ category="so",
+ description="LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F800,
+ },
+ [0x1F801]={
+ category="so",
+ description="UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F801,
+ },
+ [0x1F802]={
+ category="so",
+ description="RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F802,
+ },
+ [0x1F803]={
+ category="so",
+ description="DOWNWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F803,
+ },
+ [0x1F804]={
+ category="so",
+ description="LEFTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F804,
+ },
+ [0x1F805]={
+ category="so",
+ description="UPWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F805,
+ },
+ [0x1F806]={
+ category="so",
+ description="RIGHTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F806,
+ },
+ [0x1F807]={
+ category="so",
+ description="DOWNWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F807,
+ },
+ [0x1F808]={
+ category="so",
+ description="LEFTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F808,
+ },
+ [0x1F809]={
+ category="so",
+ description="UPWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F809,
+ },
+ [0x1F80A]={
+ category="so",
+ description="RIGHTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F80A,
+ },
+ [0x1F80B]={
+ category="so",
+ description="DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F80B,
+ },
+ [0x1F810]={
+ category="so",
+ description="LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F810,
+ },
+ [0x1F811]={
+ category="so",
+ description="UPWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F811,
+ },
+ [0x1F812]={
+ category="so",
+ description="RIGHTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F812,
+ },
+ [0x1F813]={
+ category="so",
+ description="DOWNWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F813,
+ },
+ [0x1F814]={
+ category="so",
+ description="LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F814,
+ },
+ [0x1F815]={
+ category="so",
+ description="UPWARDS ARROW WITH EQUILATERAL ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F815,
+ },
+ [0x1F816]={
+ category="so",
+ description="RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F816,
+ },
+ [0x1F817]={
+ category="so",
+ description="DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F817,
+ },
+ [0x1F818]={
+ category="so",
+ description="HEAVY LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F818,
+ },
+ [0x1F819]={
+ category="so",
+ description="HEAVY UPWARDS ARROW WITH EQUILATERAL ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F819,
+ },
+ [0x1F81A]={
+ category="so",
+ description="HEAVY RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F81A,
+ },
+ [0x1F81B]={
+ category="so",
+ description="HEAVY DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F81B,
+ },
+ [0x1F81C]={
+ category="so",
+ description="HEAVY LEFTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F81C,
+ },
+ [0x1F81D]={
+ category="so",
+ description="HEAVY UPWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F81D,
+ },
+ [0x1F81E]={
+ category="so",
+ description="HEAVY RIGHTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F81E,
+ },
+ [0x1F81F]={
+ category="so",
+ description="HEAVY DOWNWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F81F,
+ },
+ [0x1F820]={
+ category="so",
+ description="LEFTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F820,
+ },
+ [0x1F821]={
+ category="so",
+ description="UPWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F821,
+ },
+ [0x1F822]={
+ category="so",
+ description="RIGHTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F822,
+ },
+ [0x1F823]={
+ category="so",
+ description="DOWNWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F823,
+ },
+ [0x1F824]={
+ category="so",
+ description="LEFTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F824,
+ },
+ [0x1F825]={
+ category="so",
+ description="UPWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F825,
+ },
+ [0x1F826]={
+ category="so",
+ description="RIGHTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F826,
+ },
+ [0x1F827]={
+ category="so",
+ description="DOWNWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F827,
+ },
+ [0x1F828]={
+ category="so",
+ description="LEFTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F828,
+ },
+ [0x1F829]={
+ category="so",
+ description="UPWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F829,
+ },
+ [0x1F82A]={
+ category="so",
+ description="RIGHTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F82A,
+ },
+ [0x1F82B]={
+ category="so",
+ description="DOWNWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F82B,
+ },
+ [0x1F82C]={
+ category="so",
+ description="LEFTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F82C,
+ },
+ [0x1F82D]={
+ category="so",
+ description="UPWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F82D,
+ },
+ [0x1F82E]={
+ category="so",
+ description="RIGHTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F82E,
+ },
+ [0x1F82F]={
+ category="so",
+ description="DOWNWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F82F,
+ },
+ [0x1F830]={
+ category="so",
+ description="LEFTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F830,
+ },
+ [0x1F831]={
+ category="so",
+ description="UPWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F831,
+ },
+ [0x1F832]={
+ category="so",
+ description="RIGHTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F832,
+ },
+ [0x1F833]={
+ category="so",
+ description="DOWNWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F833,
+ },
+ [0x1F834]={
+ category="so",
+ description="LEFTWARDS FINGER-POST ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F834,
+ },
+ [0x1F835]={
+ category="so",
+ description="UPWARDS FINGER-POST ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F835,
+ },
+ [0x1F836]={
+ category="so",
+ description="RIGHTWARDS FINGER-POST ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F836,
+ },
+ [0x1F837]={
+ category="so",
+ description="DOWNWARDS FINGER-POST ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F837,
+ },
+ [0x1F838]={
+ category="so",
+ description="LEFTWARDS SQUARED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F838,
+ },
+ [0x1F839]={
+ category="so",
+ description="UPWARDS SQUARED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F839,
+ },
+ [0x1F83A]={
+ category="so",
+ description="RIGHTWARDS SQUARED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F83A,
+ },
+ [0x1F83B]={
+ category="so",
+ description="DOWNWARDS SQUARED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F83B,
+ },
+ [0x1F83C]={
+ category="so",
+ description="LEFTWARDS COMPRESSED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F83C,
+ },
+ [0x1F83D]={
+ category="so",
+ description="UPWARDS COMPRESSED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F83D,
+ },
+ [0x1F83E]={
+ category="so",
+ description="RIGHTWARDS COMPRESSED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F83E,
+ },
+ [0x1F83F]={
+ category="so",
+ description="DOWNWARDS COMPRESSED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F83F,
+ },
+ [0x1F840]={
+ category="so",
+ description="LEFTWARDS HEAVY COMPRESSED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F840,
+ },
+ [0x1F841]={
+ category="so",
+ description="UPWARDS HEAVY COMPRESSED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F841,
+ },
+ [0x1F842]={
+ category="so",
+ description="RIGHTWARDS HEAVY COMPRESSED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F842,
+ },
+ [0x1F843]={
+ category="so",
+ description="DOWNWARDS HEAVY COMPRESSED ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F843,
+ },
+ [0x1F844]={
+ category="so",
+ description="LEFTWARDS HEAVY ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F844,
+ },
+ [0x1F845]={
+ category="so",
+ description="UPWARDS HEAVY ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F845,
+ },
+ [0x1F846]={
+ category="so",
+ description="RIGHTWARDS HEAVY ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F846,
+ },
+ [0x1F847]={
+ category="so",
+ description="DOWNWARDS HEAVY ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F847,
+ },
+ [0x1F850]={
+ category="so",
+ description="LEFTWARDS SANS-SERIF ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F850,
+ },
+ [0x1F851]={
+ category="so",
+ description="UPWARDS SANS-SERIF ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F851,
+ },
+ [0x1F852]={
+ category="so",
+ description="RIGHTWARDS SANS-SERIF ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F852,
+ },
+ [0x1F853]={
+ category="so",
+ description="DOWNWARDS SANS-SERIF ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F853,
+ },
+ [0x1F854]={
+ category="so",
+ description="NORTH WEST SANS-SERIF ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F854,
+ },
+ [0x1F855]={
+ category="so",
+ description="NORTH EAST SANS-SERIF ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F855,
+ },
+ [0x1F856]={
+ category="so",
+ description="SOUTH EAST SANS-SERIF ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F856,
+ },
+ [0x1F857]={
+ category="so",
+ description="SOUTH WEST SANS-SERIF ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F857,
+ },
+ [0x1F858]={
+ category="so",
+ description="LEFT RIGHT SANS-SERIF ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F858,
+ },
+ [0x1F859]={
+ category="so",
+ description="UP DOWN SANS-SERIF ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F859,
+ },
+ [0x1F860]={
+ category="so",
+ description="WIDE-HEADED LEFTWARDS LIGHT BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F860,
+ },
+ [0x1F861]={
+ category="so",
+ description="WIDE-HEADED UPWARDS LIGHT BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F861,
+ },
+ [0x1F862]={
+ category="so",
+ description="WIDE-HEADED RIGHTWARDS LIGHT BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F862,
+ },
+ [0x1F863]={
+ category="so",
+ description="WIDE-HEADED DOWNWARDS LIGHT BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F863,
+ },
+ [0x1F864]={
+ category="so",
+ description="WIDE-HEADED NORTH WEST LIGHT BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F864,
+ },
+ [0x1F865]={
+ category="so",
+ description="WIDE-HEADED NORTH EAST LIGHT BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F865,
+ },
+ [0x1F866]={
+ category="so",
+ description="WIDE-HEADED SOUTH EAST LIGHT BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F866,
+ },
+ [0x1F867]={
+ category="so",
+ description="WIDE-HEADED SOUTH WEST LIGHT BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F867,
+ },
+ [0x1F868]={
+ category="so",
+ description="WIDE-HEADED LEFTWARDS BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F868,
+ },
+ [0x1F869]={
+ category="so",
+ description="WIDE-HEADED UPWARDS BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F869,
+ },
+ [0x1F86A]={
+ category="so",
+ description="WIDE-HEADED RIGHTWARDS BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F86A,
+ },
+ [0x1F86B]={
+ category="so",
+ description="WIDE-HEADED DOWNWARDS BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F86B,
+ },
+ [0x1F86C]={
+ category="so",
+ description="WIDE-HEADED NORTH WEST BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F86C,
+ },
+ [0x1F86D]={
+ category="so",
+ description="WIDE-HEADED NORTH EAST BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F86D,
+ },
+ [0x1F86E]={
+ category="so",
+ description="WIDE-HEADED SOUTH EAST BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F86E,
+ },
+ [0x1F86F]={
+ category="so",
+ description="WIDE-HEADED SOUTH WEST BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F86F,
+ },
+ [0x1F870]={
+ category="so",
+ description="WIDE-HEADED LEFTWARDS MEDIUM BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F870,
+ },
+ [0x1F871]={
+ category="so",
+ description="WIDE-HEADED UPWARDS MEDIUM BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F871,
+ },
+ [0x1F872]={
+ category="so",
+ description="WIDE-HEADED RIGHTWARDS MEDIUM BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F872,
+ },
+ [0x1F873]={
+ category="so",
+ description="WIDE-HEADED DOWNWARDS MEDIUM BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F873,
+ },
+ [0x1F874]={
+ category="so",
+ description="WIDE-HEADED NORTH WEST MEDIUM BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F874,
+ },
+ [0x1F875]={
+ category="so",
+ description="WIDE-HEADED NORTH EAST MEDIUM BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F875,
+ },
+ [0x1F876]={
+ category="so",
+ description="WIDE-HEADED SOUTH EAST MEDIUM BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F876,
+ },
+ [0x1F877]={
+ category="so",
+ description="WIDE-HEADED SOUTH WEST MEDIUM BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F877,
+ },
+ [0x1F878]={
+ category="so",
+ description="WIDE-HEADED LEFTWARDS HEAVY BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F878,
+ },
+ [0x1F879]={
+ category="so",
+ description="WIDE-HEADED UPWARDS HEAVY BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F879,
+ },
+ [0x1F87A]={
+ category="so",
+ description="WIDE-HEADED RIGHTWARDS HEAVY BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F87A,
+ },
+ [0x1F87B]={
+ category="so",
+ description="WIDE-HEADED DOWNWARDS HEAVY BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F87B,
+ },
+ [0x1F87C]={
+ category="so",
+ description="WIDE-HEADED NORTH WEST HEAVY BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F87C,
+ },
+ [0x1F87D]={
+ category="so",
+ description="WIDE-HEADED NORTH EAST HEAVY BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F87D,
+ },
+ [0x1F87E]={
+ category="so",
+ description="WIDE-HEADED SOUTH EAST HEAVY BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F87E,
+ },
+ [0x1F87F]={
+ category="so",
+ description="WIDE-HEADED SOUTH WEST HEAVY BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F87F,
+ },
+ [0x1F880]={
+ category="so",
+ description="WIDE-HEADED LEFTWARDS VERY HEAVY BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F880,
+ },
+ [0x1F881]={
+ category="so",
+ description="WIDE-HEADED UPWARDS VERY HEAVY BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F881,
+ },
+ [0x1F882]={
+ category="so",
+ description="WIDE-HEADED RIGHTWARDS VERY HEAVY BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F882,
+ },
+ [0x1F883]={
+ category="so",
+ description="WIDE-HEADED DOWNWARDS VERY HEAVY BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F883,
+ },
+ [0x1F884]={
+ category="so",
+ description="WIDE-HEADED NORTH WEST VERY HEAVY BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F884,
+ },
+ [0x1F885]={
+ category="so",
+ description="WIDE-HEADED NORTH EAST VERY HEAVY BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F885,
+ },
+ [0x1F886]={
+ category="so",
+ description="WIDE-HEADED SOUTH EAST VERY HEAVY BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F886,
+ },
+ [0x1F887]={
+ category="so",
+ description="WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F887,
+ },
+ [0x1F890]={
+ category="so",
+ description="LEFTWARDS TRIANGLE ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F890,
+ },
+ [0x1F891]={
+ category="so",
+ description="UPWARDS TRIANGLE ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F891,
+ },
+ [0x1F892]={
+ category="so",
+ description="RIGHTWARDS TRIANGLE ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F892,
+ },
+ [0x1F893]={
+ category="so",
+ description="DOWNWARDS TRIANGLE ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F893,
+ },
+ [0x1F894]={
+ category="so",
+ description="LEFTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F894,
+ },
+ [0x1F895]={
+ category="so",
+ description="UPWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F895,
+ },
+ [0x1F896]={
+ category="so",
+ description="RIGHTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F896,
+ },
+ [0x1F897]={
+ category="so",
+ description="DOWNWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F897,
+ },
+ [0x1F898]={
+ category="so",
+ description="LEFTWARDS ARROW WITH NOTCHED TAIL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F898,
+ },
+ [0x1F899]={
+ category="so",
+ description="UPWARDS ARROW WITH NOTCHED TAIL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F899,
+ },
+ [0x1F89A]={
+ category="so",
+ description="RIGHTWARDS ARROW WITH NOTCHED TAIL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F89A,
+ },
+ [0x1F89B]={
+ category="so",
+ description="DOWNWARDS ARROW WITH NOTCHED TAIL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F89B,
+ },
+ [0x1F89C]={
+ category="so",
+ description="HEAVY ARROW SHAFT WIDTH ONE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F89C,
+ },
+ [0x1F89D]={
+ category="so",
+ description="HEAVY ARROW SHAFT WIDTH TWO THIRDS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F89D,
+ },
+ [0x1F89E]={
+ category="so",
+ description="HEAVY ARROW SHAFT WIDTH ONE HALF",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F89E,
+ },
+ [0x1F89F]={
+ category="so",
+ description="HEAVY ARROW SHAFT WIDTH ONE THIRD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F89F,
+ },
+ [0x1F8A0]={
+ category="so",
+ description="LEFTWARDS BOTTOM-SHADED WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F8A0,
+ },
+ [0x1F8A1]={
+ category="so",
+ description="RIGHTWARDS BOTTOM SHADED WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F8A1,
+ },
+ [0x1F8A2]={
+ category="so",
+ description="LEFTWARDS TOP SHADED WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F8A2,
+ },
+ [0x1F8A3]={
+ category="so",
+ description="RIGHTWARDS TOP SHADED WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F8A3,
+ },
+ [0x1F8A4]={
+ category="so",
+ description="LEFTWARDS LEFT-SHADED WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F8A4,
+ },
+ [0x1F8A5]={
+ category="so",
+ description="RIGHTWARDS RIGHT-SHADED WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F8A5,
+ },
+ [0x1F8A6]={
+ category="so",
+ description="LEFTWARDS RIGHT-SHADED WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F8A6,
+ },
+ [0x1F8A7]={
+ category="so",
+ description="RIGHTWARDS LEFT-SHADED WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F8A7,
+ },
+ [0x1F8A8]={
+ category="so",
+ description="LEFTWARDS BACK-TILTED SHADOWED WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F8A8,
+ },
+ [0x1F8A9]={
+ category="so",
+ description="RIGHTWARDS BACK-TILTED SHADOWED WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F8A9,
+ },
+ [0x1F8AA]={
+ category="so",
+ description="LEFTWARDS FRONT-TILTED SHADOWED WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F8AA,
+ },
+ [0x1F8AB]={
+ category="so",
+ description="RIGHTWARDS FRONT-TILTED SHADOWED WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F8AB,
+ },
+ [0x1F8AC]={
+ category="so",
+ description="WHITE ARROW SHAFT WIDTH ONE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F8AC,
+ },
+ [0x1F8AD]={
+ category="so",
+ description="WHITE ARROW SHAFT WIDTH TWO THIRDS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F8AD,
+ },
[0x2F800]={
category="lo",
cjkwd="w",
diff --git a/Master/texmf-dist/tex/context/base/char-enc.lua b/Master/texmf-dist/tex/context/base/char-enc.lua
index 048837eec18..c2061891ad4 100644
--- a/Master/texmf-dist/tex/context/base/char-enc.lua
+++ b/Master/texmf-dist/tex/context/base/char-enc.lua
@@ -9,6 +9,8 @@ if not modules then modules = { } end modules ['char-enc'] = {
-- Thanks to tex4ht for these mappings.
+local next = next
+
local allocate, setinitializer = utilities.storage.allocate, utilities.storage.setinitializer
characters = characters or { }
@@ -169,7 +171,10 @@ characters.synonyms = allocate { -- afm mess
-- that table.print would not work on this file unless it is accessed once. This
-- why the serializer does a dummy access.
-local enccodes = allocate() characters.enccodes = enccodes
+local enccodes = allocate()
+characters.enccodes = enccodes
+
+ -- maybe omit context name -> then same as encodings.make_unicode_vector
local function initialize()
for unicode, data in next, characters.data do
@@ -179,7 +184,9 @@ local function initialize()
end
end
for name, unicode in next, characters.synonyms do
- if not enccodes[name] then enccodes[name] = unicode end
+ if not enccodes[name] then
+ enccodes[name] = unicode
+ end
end
end
diff --git a/Master/texmf-dist/tex/context/base/char-ent.lua b/Master/texmf-dist/tex/context/base/char-ent.lua
index 58ee9472ca3..e48856a8440 100644
--- a/Master/texmf-dist/tex/context/base/char-ent.lua
+++ b/Master/texmf-dist/tex/context/base/char-ent.lua
@@ -332,7 +332,7 @@ local entities = utilities.storage.allocate {
["NestedLessLess"] = "≪", -- U+0226A
["Nfr"] = "𝔑", -- U+1D511
["Ngr"] = "Ν", -- U+0039D
- ["NoBreak"] = "⁠", -- U+02060
+ ["NoBreak"] = "⁠", -- U+02060
["NonBreakingSpace"] = " ", -- U+000A0
["Nopf"] = "ℕ", -- U+02115
["Not"] = "⫬", -- U+02AEC
@@ -2252,6 +2252,8 @@ local entities = utilities.storage.allocate {
characters = characters or { }
characters.entities = entities
-entities.plusminus = "±" -- 0x000B1
-entities.minusplus = "∓" -- 0x02213
-entities.cdots = utf.char(0x02026) -- U+02026
+entities.plusminus = "±" -- U+000B1
+entities.minusplus = "∓" -- U+02213
+entities.Hat = "ˆ" -- U+002C6 -- better as this will stretch
+entities.cdots = "⋯" -- U+022EF
+entities.dots = "…" -- U+02026
diff --git a/Master/texmf-dist/tex/context/base/char-fio.lua b/Master/texmf-dist/tex/context/base/char-fio.lua
new file mode 100644
index 00000000000..ab255593575
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/char-fio.lua
@@ -0,0 +1,94 @@
+if not modules then modules = { } end modules ['char-fio'] = {
+ version = 1.001,
+ comment = "companion to char-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- % directives="filters.utf.reorder=false"
+
+
+local next = next
+
+-- --
+
+local sequencers = utilities.sequencers
+local appendaction = sequencers.appendaction
+local enableaction = sequencers.enableaction
+local disableaction = sequencers.disableaction
+
+local utffilters = characters.filters.utf
+
+local textfileactions = resolvers.openers.helpers.textfileactions
+local textlineactions = resolvers.openers.helpers.textlineactions
+
+appendaction (textfileactions,"system","characters.filters.utf.reorder")
+disableaction(textfileactions, "characters.filters.utf.reorder")
+
+appendaction (textlineactions,"system","characters.filters.utf.reorder")
+disableaction(textlineactions, "characters.filters.utf.reorder")
+
+appendaction (textfileactions,"system","characters.filters.utf.collapse")
+disableaction(textfileactions, "characters.filters.utf.collapse")
+
+appendaction (textfileactions,"system","characters.filters.utf.decompose")
+disableaction(textfileactions, "characters.filters.utf.decompose")
+
+local report = logs.reporter("unicode filter")
+local reporting = "no"
+
+-- this is messy as for performance reasons i don't want this to happen
+-- per line by default
+
+local enforced = {
+ ["characters.filters.utf.reorder"] = true,
+ ["characters.filters.utf.collapse"] = true,
+ ["characters.filters.utf.decompose"] = true,
+}
+
+function utffilters.enable()
+ for k, v in next, enforced do
+ if v then
+ if reporting == "yes" then
+ report("%a enabled",k)
+ end
+ enableaction(textfileactions,v)
+ else
+ if reporting == "yes" then
+ report("%a not enabled",k)
+ end
+ end
+ end
+ reporting = "never"
+end
+
+local function configure(what,v)
+ if v == "line" then
+ disableaction(textfileactions,what)
+ enableaction (textlineactions,what)
+ elseif not toboolean(v) then
+ if reporting ~= "never" then
+ report("%a disabled",k)
+ reporting = "yes"
+ end
+ enforced[what] = false
+ disableaction(textfileactions,what)
+ disableaction(textlineactions,what)
+ else -- true or text
+ enableaction (textfileactions,what)
+ disableaction(textlineactions,what)
+ end
+end
+
+directives.register("filters.utf.reorder", function(v) configure("characters.filters.utf.reorder", v) end)
+directives.register("filters.utf.collapse", function(v) configure("characters.filters.utf.collapse", v) end)
+directives.register("filters.utf.decompose", function(v) configure("characters.filters.utf.decompose",v) end)
+
+utffilters.setskippable { "mkiv", "mkvi", "mkix", "mkxi" }
+
+interfaces.implement {
+ name = "enableutf",
+ onlyonce = true,
+ actions = utffilters.enable
+}
diff --git a/Master/texmf-dist/tex/context/base/char-ini.lua b/Master/texmf-dist/tex/context/base/char-ini.lua
index 7dc381031fc..a1dd911f214 100644
--- a/Master/texmf-dist/tex/context/base/char-ini.lua
+++ b/Master/texmf-dist/tex/context/base/char-ini.lua
@@ -7,26 +7,33 @@ if not modules then modules = { } end modules ['char-ini'] = {
}
-- todo: make two files, one for format generation, one for format use
+-- todo: move some to char-utf
-- we can remove the tag range starting at 0xE0000 (special applications)
local utfchar, utfbyte, utfvalues, ustring, utotable = utf.char, utf.byte, utf.values, utf.ustring, utf.totable
local concat, unpack, tohash = table.concat, table.unpack, table.tohash
local next, tonumber, type, rawget, rawset = next, tonumber, type, rawget, rawset
-local format, lower, gsub, match, gmatch = string.format, string.lower, string.gsub, string.match, string.match, string.gmatch
-local P, R, Cs, lpegmatch, patterns = lpeg.P, lpeg.R, lpeg.Cs, lpeg.match, lpeg.patterns
+local format, lower, gsub = string.format, string.lower, string.gsub
+local P, R, S, Cs = lpeg.P, lpeg.R, lpeg.S, lpeg.Cs
-local utf8byte = patterns.utf8byte
-local utf8char = patterns.utf8char
+if not characters then require("char-def") end
-local allocate = utilities.storage.allocate
-local mark = utilities.storage.mark
+local lpegpatterns = lpeg.patterns
+local lpegmatch = lpeg.match
+local utf8byte = lpegpatterns.utf8byte
+local utf8character = lpegpatterns.utf8character
-local setmetatableindex = table.setmetatableindex
+local utfchartabletopattern = lpeg.utfchartabletopattern
-local trace_defining = false trackers.register("characters.defining", function(v) characters_defining = v end)
+local allocate = utilities.storage.allocate
+local mark = utilities.storage.mark
-local report_defining = logs.reporter("characters")
+local setmetatableindex = table.setmetatableindex
+
+local trace_defining = false trackers.register("characters.defining", function(v) characters_defining = v end)
+
+local report_defining = logs.reporter("characters")
--[[ldx--
<p>This module implements some methods and creates additional datastructured
@@ -37,6 +44,12 @@ from the big character table that we use for all kind of purposes:
loaded!</p>
--ldx]]--
+-- todo: in 'char-def.lua' assume defaults:
+--
+-- directtions = l
+-- cjkwd = a
+-- linebreak = al
+
characters = characters or { }
local characters = characters
local data = characters.data
@@ -54,7 +67,7 @@ end
local pattern = (P("0x") + P("U+")) * ((R("09","AF")^1 * P(-1)) / function(s) return tonumber(s,16) end)
-patterns.chartonumber = pattern
+lpegpatterns.chartonumber = pattern
local function chartonumber(k)
if type(k) == "string" then
@@ -145,6 +158,7 @@ local blocks = allocate {
["bamum"] = { first = 0x0A6A0, last = 0x0A6FF, description = "Bamum" },
["bamumsupplement"] = { first = 0x16800, last = 0x16A3F, description = "Bamum Supplement" },
["basiclatin"] = { first = 0x00000, last = 0x0007F, otf="latn", description = "Basic Latin" },
+ ["bassavah"] = { first = 0x16AD0, last = 0x16AFF, description = "Bassa Vah" },
["batak"] = { first = 0x01BC0, last = 0x01BFF, description = "Batak" },
["bengali"] = { first = 0x00980, last = 0x009FF, otf="beng", description = "Bengali" },
["blockelements"] = { first = 0x02580, last = 0x0259F, otf="bopo", description = "Block Elements" },
@@ -156,8 +170,9 @@ local blocks = allocate {
["buginese"] = { first = 0x01A00, last = 0x01A1F, otf="bugi", description = "Buginese" },
["buhid"] = { first = 0x01740, last = 0x0175F, otf="buhd", description = "Buhid" },
["byzantinemusicalsymbols"] = { first = 0x1D000, last = 0x1D0FF, otf="byzm", description = "Byzantine Musical Symbols" },
- ["commonindicnumberforms"] = { first = 0x0A830, last = 0x0A83F, description = "Common Indic Number Forms" },
["carian"] = { first = 0x102A0, last = 0x102DF, description = "Carian" },
+ ["caucasianalbanian"] = { first = 0x10530, last = 0x1056F, description = "Caucasian Albanian" },
+ ["chakma"] = { first = 0x11100, last = 0x1114F, description = "Chakma" },
["cham"] = { first = 0x0AA00, last = 0x0AA5F, description = "Cham" },
["cherokee"] = { first = 0x013A0, last = 0x013FF, otf="cher", description = "Cherokee" },
["cjkcompatibility"] = { first = 0x03300, last = 0x033FF, otf="hang", description = "CJK Compatibility" },
@@ -170,12 +185,17 @@ local blocks = allocate {
["cjkunifiedideographs"] = { first = 0x04E00, last = 0x09FFF, otf="hang", description = "CJK Unified Ideographs", catcode = "letter" },
["cjkunifiedideographsextensiona"] = { first = 0x03400, last = 0x04DBF, otf="hang", description = "CJK Unified Ideographs Extension A" },
["cjkunifiedideographsextensionb"] = { first = 0x20000, last = 0x2A6DF, otf="hang", description = "CJK Unified Ideographs Extension B" },
+ ["cjkunifiedideographsextensionc"] = { first = 0x2A700, last = 0x2B73F, description = "CJK Unified Ideographs Extension C" },
+ ["cjkunifiedideographsextensiond"] = { first = 0x2B740, last = 0x2B81F, description = "CJK Unified Ideographs Extension D" },
["combiningdiacriticalmarks"] = { first = 0x00300, last = 0x0036F, description = "Combining Diacritical Marks" },
+ ["combiningdiacriticalmarksextended"] = { first = 0x01AB0, last = 0x01AFF, description = "Combining Diacritical Marks Extended" },
["combiningdiacriticalmarksforsymbols"] = { first = 0x020D0, last = 0x020FF, description = "Combining Diacritical Marks for Symbols" },
["combiningdiacriticalmarkssupplement"] = { first = 0x01DC0, last = 0x01DFF, description = "Combining Diacritical Marks Supplement" },
["combininghalfmarks"] = { first = 0x0FE20, last = 0x0FE2F, description = "Combining Half Marks" },
+ ["commonindicnumberforms"] = { first = 0x0A830, last = 0x0A83F, description = "Common Indic Number Forms" },
["controlpictures"] = { first = 0x02400, last = 0x0243F, description = "Control Pictures" },
["coptic"] = { first = 0x02C80, last = 0x02CFF, otf="copt", description = "Coptic" },
+ ["copticepactnumbers"] = { first = 0x102E0, last = 0x102FF, description = "Coptic Epact Numbers" },
["countingrodnumerals"] = { first = 0x1D360, last = 0x1D37F, description = "Counting Rod Numerals" },
["cuneiform"] = { first = 0x12000, last = 0x123FF, otf="xsux", description = "Cuneiform" },
["cuneiformnumbersandpunctuation"] = { first = 0x12400, last = 0x1247F, otf="xsux", description = "Cuneiform Numbers and Punctuation" },
@@ -188,161 +208,256 @@ local blocks = allocate {
["deseret"] = { first = 0x10400, last = 0x1044F, otf="dsrt", description = "Deseret" },
["devanagari"] = { first = 0x00900, last = 0x0097F, otf="deva", description = "Devanagari" },
["devanagariextended"] = { first = 0x0A8E0, last = 0x0A8FF, description = "Devanagari Extended" },
- ["dingbats"] = { first = 0x02700, last = 0x027BF, description = "Dingbats" },
- ["dominotiles"] = { first = 0x1F030, last = 0x1F09F, description = "Domino Tiles" },
- ["egyptianhieroglyphs"] = { first = 0x13000, last = 0x1342F, description = "Egyptian Hieroglyphs" },
- ["emoticons"] = { first = 0x1F600, last = 0x1F64F, description = "Emoticons" },
- ["enclosedalphanumericsupplement"] = { first = 0x1F100, last = 0x1F1FF, description = "Enclosed Alphanumeric Supplement" },
- ["enclosedalphanumerics"] = { first = 0x02460, last = 0x024FF, description = "Enclosed Alphanumerics" },
- ["enclosedcjklettersandmonths"] = { first = 0x03200, last = 0x032FF, description = "Enclosed CJK Letters and Months" },
- ["enclosedideographicsupplement"] = { first = 0x1F200, last = 0x1F2FF, description = "Enclosed Ideographic Supplement" },
- ["ethiopic"] = { first = 0x01200, last = 0x0137F, otf="ethi", description = "Ethiopic" },
- ["ethiopicextended"] = { first = 0x02D80, last = 0x02DDF, otf="ethi", description = "Ethiopic Extended" },
- ["ethiopicextendeda"] = { first = 0x0AB00, last = 0x0AB2F, description = "Ethiopic Extended-A" },
- ["ethiopicsupplement"] = { first = 0x01380, last = 0x0139F, otf="ethi", description = "Ethiopic Supplement" },
- ["generalpunctuation"] = { first = 0x02000, last = 0x0206F, description = "General Punctuation" },
- ["geometricshapes"] = { first = 0x025A0, last = 0x025FF, description = "Geometric Shapes" },
- ["georgian"] = { first = 0x010A0, last = 0x010FF, otf="geor", description = "Georgian" },
- ["georgiansupplement"] = { first = 0x02D00, last = 0x02D2F, otf="geor", description = "Georgian Supplement" },
- ["glagolitic"] = { first = 0x02C00, last = 0x02C5F, otf="glag", description = "Glagolitic" },
- ["gothic"] = { first = 0x10330, last = 0x1034F, otf="goth", description = "Gothic" },
- ["greekandcoptic"] = { first = 0x00370, last = 0x003FF, otf="grek", description = "Greek and Coptic" },
- ["greekextended"] = { first = 0x01F00, last = 0x01FFF, otf="grek", description = "Greek Extended" },
- ["gujarati"] = { first = 0x00A80, last = 0x00AFF, otf="gujr", description = "Gujarati" },
- ["gurmukhi"] = { first = 0x00A00, last = 0x00A7F, otf="guru", description = "Gurmukhi" },
- ["halfwidthandfullwidthforms"] = { first = 0x0FF00, last = 0x0FFEF, description = "Halfwidth and Fullwidth Forms" },
- ["hangulcompatibilityjamo"] = { first = 0x03130, last = 0x0318F, otf="jamo", description = "Hangul Compatibility Jamo" },
- ["hanguljamo"] = { first = 0x01100, last = 0x011FF, otf="jamo", description = "Hangul Jamo" },
- ["hanguljamoextendeda"] = { first = 0x0A960, last = 0x0A97F, description = "Hangul Jamo Extended-A" },
- ["hanguljamoextendedb"] = { first = 0x0D7B0, last = 0x0D7FF, description = "Hangul Jamo Extended-B" },
- ["hangulsyllables"] = { first = 0x0AC00, last = 0x0D7AF, otf="hang", description = "Hangul Syllables" },
- ["hanunoo"] = { first = 0x01720, last = 0x0173F, otf="hano", description = "Hanunoo" },
- ["hebrew"] = { first = 0x00590, last = 0x005FF, otf="hebr", description = "Hebrew" },
- ["highprivateusesurrogates"] = { first = 0x0DB80, last = 0x0DBFF, description = "High Private Use Surrogates" },
- ["highsurrogates"] = { first = 0x0D800, last = 0x0DB7F, description = "High Surrogates" },
- ["hiragana"] = { first = 0x03040, last = 0x0309F, otf="kana", description = "Hiragana" },
- ["ideographicdescriptioncharacters"] = { first = 0x02FF0, last = 0x02FFF, description = "Ideographic Description Characters" },
- ["imperialaramaic"] = { first = 0x10840, last = 0x1085F, description = "Imperial Aramaic" },
- ["inscriptionalpahlavi"] = { first = 0x10B60, last = 0x10B7F, description = "Inscriptional Pahlavi" },
- ["inscriptionalparthian"] = { first = 0x10B40, last = 0x10B5F, description = "Inscriptional Parthian" },
- ["ipaextensions"] = { first = 0x00250, last = 0x002AF, description = "IPA Extensions" },
- ["javanese"] = { first = 0x0A980, last = 0x0A9DF, description = "Javanese" },
- ["kaithi"] = { first = 0x11080, last = 0x110CF, description = "Kaithi" },
- ["kanasupplement"] = { first = 0x1B000, last = 0x1B0FF, description = "Kana Supplement" },
- ["kanbun"] = { first = 0x03190, last = 0x0319F, description = "Kanbun" },
- ["kangxiradicals"] = { first = 0x02F00, last = 0x02FDF, description = "Kangxi Radicals" },
- ["kannada"] = { first = 0x00C80, last = 0x00CFF, otf="knda", description = "Kannada" },
- ["katakana"] = { first = 0x030A0, last = 0x030FF, otf="kana", description = "Katakana" },
- ["katakanaphoneticextensions"] = { first = 0x031F0, last = 0x031FF, otf="kana", description = "Katakana Phonetic Extensions" },
- ["kayahli"] = { first = 0x0A900, last = 0x0A92F, description = "Kayah Li" },
- ["kharoshthi"] = { first = 0x10A00, last = 0x10A5F, otf="khar", description = "Kharoshthi" },
- ["khmer"] = { first = 0x01780, last = 0x017FF, otf="khmr", description = "Khmer" },
- ["khmersymbols"] = { first = 0x019E0, last = 0x019FF, otf="khmr", description = "Khmer Symbols" },
- ["lao"] = { first = 0x00E80, last = 0x00EFF, otf="lao", description = "Lao" },
- ["latinextendeda"] = { first = 0x00100, last = 0x0017F, otf="latn", description = "Latin Extended-A" },
- ["latinextendedadditional"] = { first = 0x01E00, last = 0x01EFF, otf="latn", description = "Latin Extended Additional" },
- ["latinextendedb"] = { first = 0x00180, last = 0x0024F, otf="latn", description = "Latin Extended-B" },
- ["latinextendedc"] = { first = 0x02C60, last = 0x02C7F, otf="latn", description = "Latin Extended-C" },
- ["latinextendedd"] = { first = 0x0A720, last = 0x0A7FF, otf="latn", description = "Latin Extended-D" },
- ["latinsupplement"] = { first = 0x00080, last = 0x000FF, otf="latn", description = "Latin-1 Supplement" },
- ["lepcha"] = { first = 0x01C00, last = 0x01C4F, description = "Lepcha" },
- ["letterlikesymbols"] = { first = 0x02100, last = 0x0214F, description = "Letterlike Symbols" },
- ["limbu"] = { first = 0x01900, last = 0x0194F, otf="limb", description = "Limbu" },
- ["linearbideograms"] = { first = 0x10080, last = 0x100FF, otf="linb", description = "Linear B Ideograms" },
- ["linearbsyllabary"] = { first = 0x10000, last = 0x1007F, otf="linb", description = "Linear B Syllabary" },
- ["lisu"] = { first = 0x0A4D0, last = 0x0A4FF, description = "Lisu" },
- ["lowsurrogates"] = { first = 0x0DC00, last = 0x0DFFF, description = "Low Surrogates" },
- ["lycian"] = { first = 0x10280, last = 0x1029F, description = "Lycian" },
- ["lydian"] = { first = 0x10920, last = 0x1093F, description = "Lydian" },
- ["mahjongtiles"] = { first = 0x1F000, last = 0x1F02F, description = "Mahjong Tiles" },
- ["malayalam"] = { first = 0x00D00, last = 0x00D7F, otf="mlym", description = "Malayalam" },
- ["mandiac"] = { first = 0x00840, last = 0x0085F, otf="mand", description = "Mandaic" },
- ["mathematicalalphanumericsymbols"] = { first = 0x1D400, last = 0x1D7FF, description = "Mathematical Alphanumeric Symbols" },
- ["mathematicaloperators"] = { first = 0x02200, last = 0x022FF, description = "Mathematical Operators" },
- ["meeteimayek"] = { first = 0x0ABC0, last = 0x0ABFF, description = "Meetei Mayek" },
- ["meeteimayekextensions"] = { first = 0x0AAE0, last = 0x0AAFF, description = "Meetei Mayek Extensions" },
- ["meroiticcursive"] = { first = 0x109A0, last = 0x109FF, description = "Meroitic Cursive" },
- ["meroitichieroglyphs"] = { first = 0x10980, last = 0x1099F, description = "Meroitic Hieroglyphs" },
- ["miao"] = { first = 0x16F00, last = 0x16F9F, description = "Miao" },
- ["miscellaneousmathematicalsymbolsa"] = { first = 0x027C0, last = 0x027EF, description = "Miscellaneous Mathematical Symbols-A" },
- ["miscellaneousmathematicalsymbolsb"] = { first = 0x02980, last = 0x029FF, description = "Miscellaneous Mathematical Symbols-B" },
- ["miscellaneoussymbols"] = { first = 0x02600, last = 0x026FF, description = "Miscellaneous Symbols" },
- ["miscellaneoussymbolsandarrows"] = { first = 0x02B00, last = 0x02BFF, description = "Miscellaneous Symbols and Arrows" },
- ["miscellaneoussymbolsandpictographs"] = { first = 0x1F300, last = 0x1F5FF, description = "Miscellaneous Symbols And Pictographs" },
- ["miscellaneoustechnical"] = { first = 0x02300, last = 0x023FF, description = "Miscellaneous Technical" },
- ["modifiertoneletters"] = { first = 0x0A700, last = 0x0A71F, description = "Modifier Tone Letters" },
- ["mongolian"] = { first = 0x01800, last = 0x018AF, otf="mong", description = "Mongolian" },
- ["musicalsymbols"] = { first = 0x1D100, last = 0x1D1FF, otf="musc", description = "Musical Symbols" },
- ["myanmar"] = { first = 0x01000, last = 0x0109F, otf="mymr", description = "Myanmar" },
- ["myanmarextendeda"] = { first = 0x0AA60, last = 0x0AA7F, description = "Myanmar Extended-A" },
- ["newtailue"] = { first = 0x01980, last = 0x019DF, description = "New Tai Lue" },
- ["nko"] = { first = 0x007C0, last = 0x007FF, otf="nko", description = "NKo" },
- ["numberforms"] = { first = 0x02150, last = 0x0218F, description = "Number Forms" },
- ["ogham"] = { first = 0x01680, last = 0x0169F, otf="ogam", description = "Ogham" },
- ["olchiki"] = { first = 0x01C50, last = 0x01C7F, description = "Ol Chiki" },
- ["olditalic"] = { first = 0x10300, last = 0x1032F, otf="ital", description = "Old Italic" },
- ["oldpersian"] = { first = 0x103A0, last = 0x103DF, otf="xpeo", description = "Old Persian" },
- ["oldsoutharabian"] = { first = 0x10A60, last = 0x10A7F, description = "Old South Arabian" },
- ["odlturkic"] = { first = 0x10C00, last = 0x10C4F, description = "Old Turkic" },
- ["opticalcharacterrecognition"] = { first = 0x02440, last = 0x0245F, description = "Optical Character Recognition" },
- ["oriya"] = { first = 0x00B00, last = 0x00B7F, otf="orya", description = "Oriya" },
- ["osmanya"] = { first = 0x10480, last = 0x104AF, otf="osma", description = "Osmanya" },
- ["phagspa"] = { first = 0x0A840, last = 0x0A87F, otf="phag", description = "Phags-pa" },
- ["phaistosdisc"] = { first = 0x101D0, last = 0x101FF, description = "Phaistos Disc" },
- ["phoenician"] = { first = 0x10900, last = 0x1091F, otf="phnx", description = "Phoenician" },
- ["phoneticextensions"] = { first = 0x01D00, last = 0x01D7F, description = "Phonetic Extensions" },
- ["phoneticextensionssupplement"] = { first = 0x01D80, last = 0x01DBF, description = "Phonetic Extensions Supplement" },
- ["playingcards"] = { first = 0x1F0A0, last = 0x1F0FF, description = "Playing Cards" },
- ["privateusearea"] = { first = 0x0E000, last = 0x0F8FF, description = "Private Use Area" },
- ["rejang"] = { first = 0x0A930, last = 0x0A95F, description = "Rejang" },
- ["ruminumeralsymbols"] = { first = 0x10E60, last = 0x10E7F, description = "Rumi Numeral Symbols" },
- ["runic"] = { first = 0x016A0, last = 0x016FF, otf="runr", description = "Runic" },
- ["samaritan"] = { first = 0x00800, last = 0x0083F, description = "Samaritan" },
- ["saurashtra"] = { first = 0x0A880, last = 0x0A8DF, description = "Saurashtra" },
- ["sharada"] = { first = 0x11180, last = 0x111DF, description = "Sharada" },
- ["shavian"] = { first = 0x10450, last = 0x1047F, otf="shaw", description = "Shavian" },
- ["sinhala"] = { first = 0x00D80, last = 0x00DFF, otf="sinh", description = "Sinhala" },
- ["smallformvariants"] = { first = 0x0FE50, last = 0x0FE6F, description = "Small Form Variants" },
- ["sorasompeng"] = { first = 0x110D0, last = 0x110FF, description = "Sora Sompeng" },
- ["spacingmodifierletters"] = { first = 0x002B0, last = 0x002FF, description = "Spacing Modifier Letters" },
- ["specials"] = { first = 0x0FFF0, last = 0x0FFFF, description = "Specials" },
- ["sundanese"] = { first = 0x01B80, last = 0x01BBF, description = "Sundanese" },
- ["sundanesesupplement"] = { first = 0x01CC0, last = 0x01CCF, description = "Sundanese Supplement" },
- ["superscriptsandsubscripts"] = { first = 0x02070, last = 0x0209F, description = "Superscripts and Subscripts" },
- ["supplementalarrowsa"] = { first = 0x027F0, last = 0x027FF, description = "Supplemental Arrows-A" },
- ["supplementalarrowsb"] = { first = 0x02900, last = 0x0297F, description = "Supplemental Arrows-B" },
- ["supplementalmathematicaloperators"] = { first = 0x02A00, last = 0x02AFF, description = "Supplemental Mathematical Operators" },
- ["supplementalpunctuation"] = { first = 0x02E00, last = 0x02E7F, description = "Supplemental Punctuation" },
- ["supplementaryprivateuseareaa"] = { first = 0xF0000, last = 0xFFFFF, description = "Supplementary Private Use Area-A" },
- ["supplementaryprivateuseareab"] = { first = 0x100000,last = 0x10FFFF, description = "Supplementary Private Use Area-B" },
- ["sylotinagri"] = { first = 0x0A800, last = 0x0A82F, otf="sylo", description = "Syloti Nagri" },
- ["syriac"] = { first = 0x00700, last = 0x0074F, otf="syrc", description = "Syriac" },
- ["tagalog"] = { first = 0x01700, last = 0x0171F, otf="tglg", description = "Tagalog" },
- ["tagbanwa"] = { first = 0x01760, last = 0x0177F, otf="tagb", description = "Tagbanwa" },
- ["tags"] = { first = 0xE0000, last = 0xE007F, description = "Tags" },
- ["taile"] = { first = 0x01950, last = 0x0197F, otf="tale", description = "Tai Le" },
- ["taitham"] = { first = 0x01A20, last = 0x01AAF, description = "Tai Tham" },
- ["taiviet"] = { first = 0x0AA80, last = 0x0AADF, description = "Tai Viet" },
- ["taixuanjingsymbols"] = { first = 0x1D300, last = 0x1D35F, description = "Tai Xuan Jing Symbols" },
- ["takri"] = { first = 0x11680, last = 0x116CF, description = "Takri" },
- ["tamil"] = { first = 0x00B80, last = 0x00BFF, otf="taml", description = "Tamil" },
- ["telugu"] = { first = 0x00C00, last = 0x00C7F, otf="telu", description = "Telugu" },
- ["thaana"] = { first = 0x00780, last = 0x007BF, otf="thaa", description = "Thaana" },
- ["thai"] = { first = 0x00E00, last = 0x00E7F, otf="thai", description = "Thai" },
- ["tibetan"] = { first = 0x00F00, last = 0x00FFF, otf="tibt", description = "Tibetan" },
- ["tifinagh"] = { first = 0x02D30, last = 0x02D7F, otf="tfng", description = "Tifinagh" },
- ["transportandmapsymbols"] = { first = 0x1F680, last = 0x1F6FF, description = "Transport And Map Symbols" },
- ["ugaritic"] = { first = 0x10380, last = 0x1039F, otf="ugar", description = "Ugaritic" },
- ["unifiedcanadianaboriginalsyllabics"] = { first = 0x01400, last = 0x0167F, otf="cans", description = "Unified Canadian Aboriginal Syllabics" },
- ["unifiedcanadianaboriginalsyllabicsextended"] = { first = 0x018B0, last = 0x018FF, description = "Unified Canadian Aboriginal Syllabics Extended" },
- ["vai"] = { first = 0x0A500, last = 0x0A63F, description = "Vai" },
- ["variationselectors"] = { first = 0x0FE00, last = 0x0FE0F, description = "Variation Selectors" },
- ["variationselectorssupplement"] = { first = 0xE0100, last = 0xE01EF, description = "Variation Selectors Supplement" },
- ["vedicextensions"] = { first = 0x01CD0, last = 0x01CFF, description = "Vedic Extensions" },
- ["verticalforms"] = { first = 0x0FE10, last = 0x0FE1F, description = "Vertical Forms" },
- ["yijinghexagramsymbols"] = { first = 0x04DC0, last = 0x04DFF, otf="yi", description = "Yijing Hexagram Symbols" },
- ["yiradicals"] = { first = 0x0A490, last = 0x0A4CF, otf="yi", description = "Yi Radicals" },
- ["yisyllables"] = { first = 0x0A000, last = 0x0A48F, otf="yi", description = "Yi Syllables" },
+ ["digitsarabicindic"] = { first = 0x00660, last = 0x00669, math = true },
+ -- ["digitsbengali"] = { first = 0x009E6, last = 0x009EF, math = true },
+ ["digitsbold"] = { first = 0x1D7CE, last = 0x1D7D8, math = true },
+ -- ["digitsdevanagari"] = { first = 0x00966, last = 0x0096F, math = true },
+ ["digitsdoublestruck"] = { first = 0x1D7D8, last = 0x1D7E2, math = true },
+ -- ["digitsethiopic"] = { first = 0x01369, last = 0x01371, math = true },
+ ["digitsextendedarabicindic"] = { first = 0x006F0, last = 0x006F9, math = true },
+ -- ["digitsgujarati"] = { first = 0x00AE6, last = 0x00AEF, math = true },
+ -- ["digitsgurmukhi"] = { first = 0x00A66, last = 0x00A6F, math = true },
+ -- ["digitskannada"] = { first = 0x00CE6, last = 0x00CEF, math = true },
+ -- ["digitskhmer"] = { first = 0x017E0, last = 0x017E9, math = true },
+ -- ["digitslao"] = { first = 0x00ED0, last = 0x00ED9, math = true },
+ ["digitslatin"] = { first = 0x00030, last = 0x00039, math = true },
+ -- ["digitsmalayalam"] = { first = 0x00D66, last = 0x00D6F, math = true },
+ -- ["digitsmongolian"] = { first = 0x01810, last = 0x01809, math = true },
+ ["digitsmonospace"] = { first = 0x1D7F6, last = 0x1D80F, math = true },
+ -- ["digitsmyanmar"] = { first = 0x01040, last = 0x01049, math = true },
+ ["digitsnormal"] = { first = 0x00030, last = 0x00039, math = true },
+ -- ["digitsoriya"] = { first = 0x00B66, last = 0x00B6F, math = true },
+ ["digitssansserifbold"] = { first = 0x1D7EC, last = 0x1D805, math = true },
+ ["digitssansserifnormal"] = { first = 0x1D7E2, last = 0x1D7EC, math = true },
+ -- ["digitstamil"] = { first = 0x00030, last = 0x00039, math = true }, -- no zero
+ -- ["digitstelugu"] = { first = 0x00C66, last = 0x00C6F, math = true },
+ -- ["digitsthai"] = { first = 0x00E50, last = 0x00E59, math = true },
+ -- ["digitstibetan"] = { first = 0x00F20, last = 0x00F29, math = true },
+ ["dingbats"] = { first = 0x02700, last = 0x027BF, description = "Dingbats" },
+ ["dominotiles"] = { first = 0x1F030, last = 0x1F09F, description = "Domino Tiles" },
+ ["duployan"] = { first = 0x1BC00, last = 0x1BC9F, description = "Duployan" },
+ ["egyptianhieroglyphs"] = { first = 0x13000, last = 0x1342F, description = "Egyptian Hieroglyphs" },
+ ["elbasan"] = { first = 0x10500, last = 0x1052F, description = "Elbasan" },
+ ["emoticons"] = { first = 0x1F600, last = 0x1F64F, description = "Emoticons" },
+ ["enclosedalphanumerics"] = { first = 0x02460, last = 0x024FF, description = "Enclosed Alphanumerics" },
+ ["enclosedalphanumericsupplement"] = { first = 0x1F100, last = 0x1F1FF, description = "Enclosed Alphanumeric Supplement" },
+ ["enclosedcjklettersandmonths"] = { first = 0x03200, last = 0x032FF, description = "Enclosed CJK Letters and Months" },
+ ["enclosedideographicsupplement"] = { first = 0x1F200, last = 0x1F2FF, description = "Enclosed Ideographic Supplement" },
+ ["ethiopic"] = { first = 0x01200, last = 0x0137F, otf="ethi", description = "Ethiopic" },
+ ["ethiopicextended"] = { first = 0x02D80, last = 0x02DDF, otf="ethi", description = "Ethiopic Extended" },
+ ["ethiopicextendeda"] = { first = 0x0AB00, last = 0x0AB2F, description = "Ethiopic Extended-A" },
+ ["ethiopicsupplement"] = { first = 0x01380, last = 0x0139F, otf="ethi", description = "Ethiopic Supplement" },
+ ["generalpunctuation"] = { first = 0x02000, last = 0x0206F, description = "General Punctuation" },
+ ["geometricshapes"] = { first = 0x025A0, last = 0x025FF, description = "Geometric Shapes" },
+ ["geometricshapes"] = { first = 0x025A0, last = 0x025FF, math = true },
+ ["geometricshapesextended"] = { first = 0x1F780, last = 0x1F7FF, description = "Geometric Shapes Extended" },
+ ["georgian"] = { first = 0x010A0, last = 0x010FF, otf="geor", description = "Georgian" },
+ ["georgiansupplement"] = { first = 0x02D00, last = 0x02D2F, otf="geor", description = "Georgian Supplement" },
+ ["glagolitic"] = { first = 0x02C00, last = 0x02C5F, otf="glag", description = "Glagolitic" },
+ ["gothic"] = { first = 0x10330, last = 0x1034F, otf="goth", description = "Gothic" },
+ ["grantha"] = { first = 0x11300, last = 0x1137F, description = "Grantha" },
+ ["greekandcoptic"] = { first = 0x00370, last = 0x003FF, otf="grek", description = "Greek and Coptic" },
+ ["greekextended"] = { first = 0x01F00, last = 0x01FFF, otf="grek", description = "Greek Extended" },
+ ["gujarati"] = { first = 0x00A80, last = 0x00AFF, otf="gujr", description = "Gujarati" },
+ ["gurmukhi"] = { first = 0x00A00, last = 0x00A7F, otf="guru", description = "Gurmukhi" },
+ ["halfwidthandfullwidthforms"] = { first = 0x0FF00, last = 0x0FFEF, description = "Halfwidth and Fullwidth Forms" },
+ ["hangulcompatibilityjamo"] = { first = 0x03130, last = 0x0318F, otf="jamo", description = "Hangul Compatibility Jamo" },
+ ["hanguljamo"] = { first = 0x01100, last = 0x011FF, otf="jamo", description = "Hangul Jamo" },
+ ["hanguljamoextendeda"] = { first = 0x0A960, last = 0x0A97F, description = "Hangul Jamo Extended-A" },
+ ["hanguljamoextendedb"] = { first = 0x0D7B0, last = 0x0D7FF, description = "Hangul Jamo Extended-B" },
+ ["hangulsyllables"] = { first = 0x0AC00, last = 0x0D7AF, otf="hang", description = "Hangul Syllables" },
+ ["hanunoo"] = { first = 0x01720, last = 0x0173F, otf="hano", description = "Hanunoo" },
+ ["hebrew"] = { first = 0x00590, last = 0x005FF, otf="hebr", description = "Hebrew" },
+ ["highprivateusesurrogates"] = { first = 0x0DB80, last = 0x0DBFF, description = "High Private Use Surrogates" },
+ ["highsurrogates"] = { first = 0x0D800, last = 0x0DB7F, description = "High Surrogates" },
+ ["hiragana"] = { first = 0x03040, last = 0x0309F, otf="kana", description = "Hiragana" },
+ ["ideographicdescriptioncharacters"] = { first = 0x02FF0, last = 0x02FFF, description = "Ideographic Description Characters" },
+ ["imperialaramaic"] = { first = 0x10840, last = 0x1085F, description = "Imperial Aramaic" },
+ ["inscriptionalpahlavi"] = { first = 0x10B60, last = 0x10B7F, description = "Inscriptional Pahlavi" },
+ ["inscriptionalparthian"] = { first = 0x10B40, last = 0x10B5F, description = "Inscriptional Parthian" },
+ ["ipaextensions"] = { first = 0x00250, last = 0x002AF, description = "IPA Extensions" },
+ ["javanese"] = { first = 0x0A980, last = 0x0A9DF, description = "Javanese" },
+ ["kaithi"] = { first = 0x11080, last = 0x110CF, description = "Kaithi" },
+ ["kanasupplement"] = { first = 0x1B000, last = 0x1B0FF, description = "Kana Supplement" },
+ ["kanbun"] = { first = 0x03190, last = 0x0319F, description = "Kanbun" },
+ ["kangxiradicals"] = { first = 0x02F00, last = 0x02FDF, description = "Kangxi Radicals" },
+ ["kannada"] = { first = 0x00C80, last = 0x00CFF, otf="knda", description = "Kannada" },
+ ["katakana"] = { first = 0x030A0, last = 0x030FF, otf="kana", description = "Katakana" },
+ ["katakanaphoneticextensions"] = { first = 0x031F0, last = 0x031FF, otf="kana", description = "Katakana Phonetic Extensions" },
+ ["kayahli"] = { first = 0x0A900, last = 0x0A92F, description = "Kayah Li" },
+ ["kharoshthi"] = { first = 0x10A00, last = 0x10A5F, otf="khar", description = "Kharoshthi" },
+ ["khmer"] = { first = 0x01780, last = 0x017FF, otf="khmr", description = "Khmer" },
+ ["khmersymbols"] = { first = 0x019E0, last = 0x019FF, otf="khmr", description = "Khmer Symbols" },
+ ["khojki"] = { first = 0x11200, last = 0x1124F, description = "Khojki" },
+ ["khudawadi"] = { first = 0x112B0, last = 0x112FF, description = "Khudawadi" },
+ ["lao"] = { first = 0x00E80, last = 0x00EFF, otf="lao", description = "Lao" },
+ ["latinextendeda"] = { first = 0x00100, last = 0x0017F, otf="latn", description = "Latin Extended-A" },
+ ["latinextendedadditional"] = { first = 0x01E00, last = 0x01EFF, otf="latn", description = "Latin Extended Additional" },
+ ["latinextendedb"] = { first = 0x00180, last = 0x0024F, otf="latn", description = "Latin Extended-B" },
+ ["latinextendedc"] = { first = 0x02C60, last = 0x02C7F, otf="latn", description = "Latin Extended-C" },
+ ["latinextendedd"] = { first = 0x0A720, last = 0x0A7FF, otf="latn", description = "Latin Extended-D" },
+ ["latinextendede"] = { first = 0x0AB30, last = 0x0AB6F, description = "Latin Extended-E" },
+ ["latinsupplement"] = { first = 0x00080, last = 0x000FF, otf="latn", description = "Latin-1 Supplement" },
+ ["lepcha"] = { first = 0x01C00, last = 0x01C4F, description = "Lepcha" },
+ ["letterlikesymbols"] = { first = 0x02100, last = 0x0214F, description = "Letterlike Symbols" },
+ ["letterlikesymbols"] = { first = 0x02100, last = 0x0214F, math = true },
+ ["limbu"] = { first = 0x01900, last = 0x0194F, otf="limb", description = "Limbu" },
+ ["lineara"] = { first = 0x10600, last = 0x1077F, description = "Linear A" },
+ ["linearbideograms"] = { first = 0x10080, last = 0x100FF, otf="linb", description = "Linear B Ideograms" },
+ ["linearbsyllabary"] = { first = 0x10000, last = 0x1007F, otf="linb", description = "Linear B Syllabary" },
+ ["lisu"] = { first = 0x0A4D0, last = 0x0A4FF, description = "Lisu" },
+ ["lowercasebold"] = { first = 0x1D41A, last = 0x1D433, math = true },
+ ["lowercaseboldfraktur"] = { first = 0x1D586, last = 0x1D59F, math = true },
+ ["lowercasebolditalic"] = { first = 0x1D482, last = 0x1D49B, math = true },
+ ["lowercaseboldscript"] = { first = 0x1D4EA, last = 0x1D503, math = true },
+ ["lowercasedoublestruck"] = { first = 0x1D552, last = 0x1D56B, math = true },
+ ["lowercasefraktur"] = { first = 0x1D51E, last = 0x1D537, math = true },
+ ["lowercasegreekbold"] = { first = 0x1D6C2, last = 0x1D6DB, math = true },
+ ["lowercasegreekbolditalic"] = { first = 0x1D736, last = 0x1D74F, math = true },
+ ["lowercasegreekitalic"] = { first = 0x1D6FC, last = 0x1D715, math = true },
+ ["lowercasegreeknormal"] = { first = 0x003B1, last = 0x003CA, math = true },
+ ["lowercasegreeksansserifbold"] = { first = 0x1D770, last = 0x1D789, math = true },
+ ["lowercasegreeksansserifbolditalic"] = { first = 0x1D7AA, last = 0x1D7C3, math = true },
+ ["lowercaseitalic"] = { first = 0x1D44E, last = 0x1D467, math = true },
+ ["lowercasemonospace"] = { first = 0x1D68A, last = 0x1D6A3, math = true },
+ ["lowercasenormal"] = { first = 0x00061, last = 0x0007A, math = true },
+ ["lowercasesansserifbold"] = { first = 0x1D5EE, last = 0x1D607, math = true },
+ ["lowercasesansserifbolditalic"] = { first = 0x1D656, last = 0x1D66F, math = true },
+ ["lowercasesansserifitalic"] = { first = 0x1D622, last = 0x1D63B, math = true },
+ ["lowercasesansserifnormal"] = { first = 0x1D5BA, last = 0x1D5D3, math = true },
+ ["lowercasescript"] = { first = 0x1D4B6, last = 0x1D4CF, math = true },
+ ["lowsurrogates"] = { first = 0x0DC00, last = 0x0DFFF, description = "Low Surrogates" },
+ ["lycian"] = { first = 0x10280, last = 0x1029F, description = "Lycian" },
+ ["lydian"] = { first = 0x10920, last = 0x1093F, description = "Lydian" },
+ ["mahajani"] = { first = 0x11150, last = 0x1117F, description = "Mahajani" },
+ ["mahjongtiles"] = { first = 0x1F000, last = 0x1F02F, description = "Mahjong Tiles" },
+ ["malayalam"] = { first = 0x00D00, last = 0x00D7F, otf="mlym", description = "Malayalam" },
+ ["mandaic"] = { first = 0x00840, last = 0x0085F, otf="mand", description = "Mandaic" },
+ ["manichaean"] = { first = 0x10AC0, last = 0x10AFF, description = "Manichaean" },
+ ["mathematicalalphanumericsymbols"] = { first = 0x1D400, last = 0x1D7FF, math = true, description = "Mathematical Alphanumeric Symbols" },
+ ["mathematicaloperators"] = { first = 0x02200, last = 0x022FF, math = true, description = "Mathematical Operators" },
+ ["meeteimayek"] = { first = 0x0ABC0, last = 0x0ABFF, description = "Meetei Mayek" },
+ ["meeteimayekextensions"] = { first = 0x0AAE0, last = 0x0AAFF, description = "Meetei Mayek Extensions" },
+ ["mendekikakui"] = { first = 0x1E800, last = 0x1E8DF, description = "Mende Kikakui" },
+ ["meroiticcursive"] = { first = 0x109A0, last = 0x109FF, description = "Meroitic Cursive" },
+ ["meroitichieroglyphs"] = { first = 0x10980, last = 0x1099F, description = "Meroitic Hieroglyphs" },
+ ["miao"] = { first = 0x16F00, last = 0x16F9F, description = "Miao" },
+ ["miscellaneousmathematicalsymbolsa"] = { first = 0x027C0, last = 0x027EF, math = true, description = "Miscellaneous Mathematical Symbols-A" },
+ ["miscellaneousmathematicalsymbolsb"] = { first = 0x02980, last = 0x029FF, math = true, description = "Miscellaneous Mathematical Symbols-B" },
+ ["miscellaneoussymbols"] = { first = 0x02600, last = 0x026FF, math = true, description = "Miscellaneous Symbols" },
+ ["miscellaneoussymbolsandarrows"] = { first = 0x02B00, last = 0x02BFF, math = true, description = "Miscellaneous Symbols and Arrows" },
+ ["miscellaneoussymbolsandpictographs"] = { first = 0x1F300, last = 0x1F5FF, description = "Miscellaneous Symbols and Pictographs" },
+ ["miscellaneoustechnical"] = { first = 0x02300, last = 0x023FF, math = true, description = "Miscellaneous Technical" },
+ ["modi"] = { first = 0x11600, last = 0x1165F, description = "Modi" },
+ ["modifiertoneletters"] = { first = 0x0A700, last = 0x0A71F, description = "Modifier Tone Letters" },
+ ["mongolian"] = { first = 0x01800, last = 0x018AF, otf="mong", description = "Mongolian" },
+ ["mro"] = { first = 0x16A40, last = 0x16A6F, description = "Mro" },
+ ["musicalsymbols"] = { first = 0x1D100, last = 0x1D1FF, otf="musc", description = "Musical Symbols" },
+ ["myanmar"] = { first = 0x01000, last = 0x0109F, otf="mymr", description = "Myanmar" },
+ ["myanmarextendeda"] = { first = 0x0AA60, last = 0x0AA7F, description = "Myanmar Extended-A" },
+ ["myanmarextendedb"] = { first = 0x0A9E0, last = 0x0A9FF, description = "Myanmar Extended-B" },
+ ["nabataean"] = { first = 0x10880, last = 0x108AF, description = "Nabataean" },
+ ["newtailue"] = { first = 0x01980, last = 0x019DF, description = "New Tai Lue" },
+ ["nko"] = { first = 0x007C0, last = 0x007FF, otf="nko", description = "NKo" },
+ ["numberforms"] = { first = 0x02150, last = 0x0218F, description = "Number Forms" },
+ ["ogham"] = { first = 0x01680, last = 0x0169F, otf="ogam", description = "Ogham" },
+ ["olchiki"] = { first = 0x01C50, last = 0x01C7F, description = "Ol Chiki" },
+ ["olditalic"] = { first = 0x10300, last = 0x1032F, otf="ital", description = "Old Italic" },
+ ["oldnortharabian"] = { first = 0x10A80, last = 0x10A9F, description = "Old North Arabian" },
+ ["oldpermic"] = { first = 0x10350, last = 0x1037F, description = "Old Permic" },
+ ["oldpersian"] = { first = 0x103A0, last = 0x103DF, otf="xpeo", description = "Old Persian" },
+ ["oldsoutharabian"] = { first = 0x10A60, last = 0x10A7F, description = "Old South Arabian" },
+ ["oldturkic"] = { first = 0x10C00, last = 0x10C4F, description = "Old Turkic" },
+ ["opticalcharacterrecognition"] = { first = 0x02440, last = 0x0245F, description = "Optical Character Recognition" },
+ ["oriya"] = { first = 0x00B00, last = 0x00B7F, otf="orya", description = "Oriya" },
+ ["ornamentaldingbats"] = { first = 0x1F650, last = 0x1F67F, description = "Ornamental Dingbats" },
+ ["osmanya"] = { first = 0x10480, last = 0x104AF, otf="osma", description = "Osmanya" },
+ ["pahawhhmong"] = { first = 0x16B00, last = 0x16B8F, description = "Pahawh Hmong" },
+ ["palmyrene"] = { first = 0x10860, last = 0x1087F, description = "Palmyrene" },
+ ["paucinhau"] = { first = 0x11AC0, last = 0x11AFF, description = "Pau Cin Hau" },
+ ["phagspa"] = { first = 0x0A840, last = 0x0A87F, otf="phag", description = "Phags-pa" },
+ ["phaistosdisc"] = { first = 0x101D0, last = 0x101FF, description = "Phaistos Disc" },
+ ["phoenician"] = { first = 0x10900, last = 0x1091F, otf="phnx", description = "Phoenician" },
+ ["phoneticextensions"] = { first = 0x01D00, last = 0x01D7F, description = "Phonetic Extensions" },
+ ["phoneticextensionssupplement"] = { first = 0x01D80, last = 0x01DBF, description = "Phonetic Extensions Supplement" },
+ ["playingcards"] = { first = 0x1F0A0, last = 0x1F0FF, description = "Playing Cards" },
+ ["privateusearea"] = { first = 0x0E000, last = 0x0F8FF, description = "Private Use Area" },
+ ["psalterpahlavi"] = { first = 0x10B80, last = 0x10BAF, description = "Psalter Pahlavi" },
+ ["rejang"] = { first = 0x0A930, last = 0x0A95F, description = "Rejang" },
+ ["ruminumeralsymbols"] = { first = 0x10E60, last = 0x10E7F, description = "Rumi Numeral Symbols" },
+ ["runic"] = { first = 0x016A0, last = 0x016FF, otf="runr", description = "Runic" },
+ ["samaritan"] = { first = 0x00800, last = 0x0083F, description = "Samaritan" },
+ ["saurashtra"] = { first = 0x0A880, last = 0x0A8DF, description = "Saurashtra" },
+ ["sharada"] = { first = 0x11180, last = 0x111DF, description = "Sharada" },
+ ["shavian"] = { first = 0x10450, last = 0x1047F, otf="shaw", description = "Shavian" },
+ ["shorthandformatcontrols"] = { first = 0x1BCA0, last = 0x1BCAF, description = "Shorthand Format Controls" },
+ ["siddham"] = { first = 0x11580, last = 0x115FF, description = "Siddham" },
+ ["sinhala"] = { first = 0x00D80, last = 0x00DFF, otf="sinh", description = "Sinhala" },
+ ["sinhalaarchaicnumbers"] = { first = 0x111E0, last = 0x111FF, description = "Sinhala Archaic Numbers" },
+ ["smallformvariants"] = { first = 0x0FE50, last = 0x0FE6F, description = "Small Form Variants" },
+ ["sorasompeng"] = { first = 0x110D0, last = 0x110FF, description = "Sora Sompeng" },
+ ["spacingmodifierletters"] = { first = 0x002B0, last = 0x002FF, description = "Spacing Modifier Letters" },
+ ["specials"] = { first = 0x0FFF0, last = 0x0FFFF, description = "Specials" },
+ ["sundanese"] = { first = 0x01B80, last = 0x01BBF, description = "Sundanese" },
+ ["sundanesesupplement"] = { first = 0x01CC0, last = 0x01CCF, description = "Sundanese Supplement" },
+ ["superscriptsandsubscripts"] = { first = 0x02070, last = 0x0209F, description = "Superscripts and Subscripts" },
+ ["supplementalarrowsa"] = { first = 0x027F0, last = 0x027FF, math = true, description = "Supplemental Arrows-A" },
+ ["supplementalarrowsb"] = { first = 0x02900, last = 0x0297F, math = true, description = "Supplemental Arrows-B" },
+ ["supplementalarrowsc"] = { first = 0x1F800, last = 0x1F8FF, math = true, description = "Supplemental Arrows-C" },
+ ["supplementalmathematicaloperators"] = { first = 0x02A00, last = 0x02AFF, math = true, description = "Supplemental Mathematical Operators" },
+ ["supplementalpunctuation"] = { first = 0x02E00, last = 0x02E7F, description = "Supplemental Punctuation" },
+ ["supplementaryprivateuseareaa"] = { first = 0xF0000, last = 0xFFFFF, description = "Supplementary Private Use Area-A" },
+ ["supplementaryprivateuseareab"] = { first = 0x100000,last = 0x10FFFF, description = "Supplementary Private Use Area-B" },
+ ["sylotinagri"] = { first = 0x0A800, last = 0x0A82F, otf="sylo", description = "Syloti Nagri" },
+ ["syriac"] = { first = 0x00700, last = 0x0074F, otf="syrc", description = "Syriac" },
+ ["tagalog"] = { first = 0x01700, last = 0x0171F, otf="tglg", description = "Tagalog" },
+ ["tagbanwa"] = { first = 0x01760, last = 0x0177F, otf="tagb", description = "Tagbanwa" },
+ ["tags"] = { first = 0xE0000, last = 0xE007F, description = "Tags" },
+ ["taile"] = { first = 0x01950, last = 0x0197F, otf="tale", description = "Tai Le" },
+ ["taitham"] = { first = 0x01A20, last = 0x01AAF, description = "Tai Tham" },
+ ["taiviet"] = { first = 0x0AA80, last = 0x0AADF, description = "Tai Viet" },
+ ["taixuanjingsymbols"] = { first = 0x1D300, last = 0x1D35F, description = "Tai Xuan Jing Symbols" },
+ ["takri"] = { first = 0x11680, last = 0x116CF, description = "Takri" },
+ ["tamil"] = { first = 0x00B80, last = 0x00BFF, otf="taml", description = "Tamil" },
+ ["telugu"] = { first = 0x00C00, last = 0x00C7F, otf="telu", description = "Telugu" },
+ ["thaana"] = { first = 0x00780, last = 0x007BF, otf="thaa", description = "Thaana" },
+ ["thai"] = { first = 0x00E00, last = 0x00E7F, otf="thai", description = "Thai" },
+ ["tibetan"] = { first = 0x00F00, last = 0x00FFF, otf="tibt", description = "Tibetan" },
+ ["tifinagh"] = { first = 0x02D30, last = 0x02D7F, otf="tfng", description = "Tifinagh" },
+ ["tirhuta"] = { first = 0x11480, last = 0x114DF, description = "Tirhuta" },
+ ["transportandmapsymbols"] = { first = 0x1F680, last = 0x1F6FF, description = "Transport and Map Symbols" },
+ ["ugaritic"] = { first = 0x10380, last = 0x1039F, otf="ugar", description = "Ugaritic" },
+ ["unifiedcanadianaboriginalsyllabics"] = { first = 0x01400, last = 0x0167F, otf="cans", description = "Unified Canadian Aboriginal Syllabics" },
+ ["unifiedcanadianaboriginalsyllabicsextended"] = { first = 0x018B0, last = 0x018FF, description = "Unified Canadian Aboriginal Syllabics Extended" },
+ ["uppercasebold"] = { first = 0x1D400, last = 0x1D419, math = true },
+ ["uppercaseboldfraktur"] = { first = 0x1D56C, last = 0x1D585, math = true },
+ ["uppercasebolditalic"] = { first = 0x1D468, last = 0x1D481, math = true },
+ ["uppercaseboldscript"] = { first = 0x1D4D0, last = 0x1D4E9, math = true },
+ ["uppercasedoublestruck"] = { first = 0x1D538, last = 0x1D551, math = true },
+ ["uppercasefraktur"] = { first = 0x1D504, last = 0x1D51D, math = true },
+ ["uppercasegreekbold"] = { first = 0x1D6A8, last = 0x1D6C1, math = true },
+ ["uppercasegreekbolditalic"] = { first = 0x1D71C, last = 0x1D735, math = true },
+ ["uppercasegreekitalic"] = { first = 0x1D6E2, last = 0x1D6FB, math = true },
+ ["uppercasegreeknormal"] = { first = 0x00391, last = 0x003AA, math = true },
+ ["uppercasegreeksansserifbold"] = { first = 0x1D756, last = 0x1D76F, math = true },
+ ["uppercasegreeksansserifbolditalic"] = { first = 0x1D790, last = 0x1D7A9, math = true },
+ ["uppercaseitalic"] = { first = 0x1D434, last = 0x1D44D, math = true },
+ ["uppercasemonospace"] = { first = 0x1D670, last = 0x1D689, math = true },
+ ["uppercasenormal"] = { first = 0x00041, last = 0x0005A, math = true },
+ ["uppercasesansserifbold"] = { first = 0x1D5D4, last = 0x1D5ED, math = true },
+ ["uppercasesansserifbolditalic"] = { first = 0x1D63C, last = 0x1D655, math = true },
+ ["uppercasesansserifitalic"] = { first = 0x1D608, last = 0x1D621, math = true },
+ ["uppercasesansserifnormal"] = { first = 0x1D5A0, last = 0x1D5B9, math = true },
+ ["uppercasescript"] = { first = 0x1D49C, last = 0x1D4B5, math = true },
+ ["vai"] = { first = 0x0A500, last = 0x0A63F, description = "Vai" },
+ ["variationselectors"] = { first = 0x0FE00, last = 0x0FE0F, description = "Variation Selectors" },
+ ["variationselectorssupplement"] = { first = 0xE0100, last = 0xE01EF, description = "Variation Selectors Supplement" },
+ ["vedicextensions"] = { first = 0x01CD0, last = 0x01CFF, description = "Vedic Extensions" },
+ ["verticalforms"] = { first = 0x0FE10, last = 0x0FE1F, description = "Vertical Forms" },
+ ["warangciti"] = { first = 0x118A0, last = 0x118FF, description = "Warang Citi" },
+ ["yijinghexagramsymbols"] = { first = 0x04DC0, last = 0x04DFF, otf="yi", description = "Yijing Hexagram Symbols" },
+ ["yiradicals"] = { first = 0x0A490, last = 0x0A4CF, otf="yi", description = "Yi Radicals" },
+ ["yisyllables"] = { first = 0x0A000, last = 0x0A48F, otf="yi", description = "Yi Syllables" },
}
characters.blocks = blocks
@@ -379,13 +494,15 @@ setmetatableindex(otfscripts,function(t,unicode)
return "dflt"
end)
+local splitter = lpeg.splitat(S(":-"))
+
function characters.getrange(name) -- used in font fallback definitions (name or range)
local range = blocks[name]
if range then
return range.first, range.last, range.description, range.gaps
end
name = gsub(name,'"',"0x") -- goodie: tex hex notation
- local start, stop = match(name,"^(.-)[%-%:](.-)$")
+ local start, stop = lpegmatch(splitter,name)
if start and stop then
start, stop = tonumber(start,16) or tonumber(start), tonumber(stop,16) or tonumber(stop)
if start and stop then
@@ -492,7 +609,68 @@ setmetatableindex(characters.is_punctuation,mti)
-- linebreak: todo: hash
--
-- normative : BK CR LF CM SG GL CB SP ZW NL WJ JL JV JT H2 H3
--- informative : XX OP CL QU NS EX SY IS PR PO NU AL ID IN HY BB BA SA AI B2 new:CP
+-- informative : XX OP CL CP QU NS EX SY IS PR PO NU AL ID IN HY BB BA SA AI B2 HL CJ RI
+--
+-- comments taken from standard:
+
+characters.linebreaks = {
+
+ -- non-tailorable line breaking classes
+
+ ["bk"] = "mandatory break", -- nl, ps : cause a line break (after)
+ ["cr"] = "carriage return", -- cr : cause a line break (after), except between cr and lf
+ ["lf"] = "line feed", -- lf : cause a line break (after)
+ ["cm"] = "combining mark", -- combining marks, control codes : prohibit a line break between the character and the preceding character
+ ["nl"] = "next line", -- nel : cause a line break (after)
+ ["sg"] = "surrogate", -- surrogates :do not occur in well-formed text
+ ["wj"] = "word joiner", -- wj : prohibit line breaks before and after
+ ["zw"] = "zero width space", -- zwsp : provide a break opportunity
+ ["gl"] = "non-breaking (glue)", -- cgj, nbsp, zwnbsp : prohibit line breaks before and after
+ ["sp"] = "space", -- space : enable indirect line breaks
+
+ -- break opportunities
+
+ ["b2"] = "break opportunity before and after", -- em dash : provide a line break opportunity before and after the character
+ ["ba"] = "break after", -- spaces, hyphens : generally provide a line break opportunity after the character
+ ["bb"] = "break before", -- punctuation used in dictionaries : generally provide a line break opportunity before the character
+ ["hy"] = "hyphen", -- hyphen-minus : provide a line break opportunity after the character, except in numeric context
+ ["cb"] = "contingent break opportunity", -- inline objects : provide a line break opportunity contingent on additional information
+
+ -- characters prohibiting certain breaks
+
+ ["cl"] = "close punctuation", -- “}”, “❳”, “⟫” etc. : prohibit line breaks before
+ ["cp"] = "close parenthesis", -- “)”, “]” : prohibit line breaks before
+ ["ex"] = "exclamation/interrogation", -- “!”, “?”, etc. : prohibit line breaks before
+ ["in"] = "inseparable", -- leaders : allow only indirect line breaks between pairs
+ ["ns"] = "nonstarter", -- “‼”, “‽”, “⁇”, “⁉”, etc. : allow only indirect line breaks before
+ ["op"] = "open punctuation", -- “(“, “[“, “{“, etc. : prohibit line breaks after
+ ["qu"] = "quotation", -- quotation marks : act like they are both opening and closing
+
+ -- numeric context
+
+ ["is"] = "infix numeric separator", -- . , : prevent breaks after any and before numeric
+ ["nu"] = "numeric", -- digits : form numeric expressions for line breaking purposes
+ ["po"] = "postfix numeric", -- %, ¢ : do not break following a numeric expression
+ ["pr"] = "prefix numeric", -- $, £, ¥, etc. : do not break in front of a numeric expression
+ ["sy"] = "symbols allowing break after", -- / : prevent a break before, and allow a break after
+
+ -- other characters
+
+ ["ai"] = "ambiguous (alphabetic or ideographic)", -- characters with ambiguous east asian width : act like al when the resolved eaw is n; otherwise, act as id
+ ["al"] = "alphabetic", -- alphabets and regular symbols : are alphabetic characters or symbols that are used with alphabetic characters
+ ["cj"] = "conditional japanese starter", -- small kana : treat as ns or id for strict or normal breaking.
+ ["h2"] = "hangul lv syllable", -- hangul : form korean syllable blocks
+ ["h3"] = "hangul lvt syllable", -- hangul : form korean syllable blocks
+ ["hl"] = "hebrew letter", -- hebrew : do not break around a following hyphen; otherwise act as alphabetic
+ ["id"] = "ideographic", -- ideographs : break before or after, except in some numeric context
+ ["jl"] = "hangul l jamo", -- conjoining jamo : form korean syllable blocks
+ ["jv"] = "hangul v jamo", -- conjoining jamo : form korean syllable blocks
+ ["jt"] = "hangul t jamo", -- conjoining jamo : form korean syllable blocks
+ ["ri"] = "regional indicator", -- regional indicator symbol letter a .. z : keep together, break before and after from others
+ ["sa"] = "complex context dependent (south east asian)", -- south east asian: thai, lao, khmer : provide a line break opportunity contingent on additional, language-specific context analysis
+ ["xx"] = "unknown", -- most unassigned, private-use : have as yet unknown line breaking behavior or unassigned code positions
+
+}
-- east asian width:
--
@@ -600,10 +778,10 @@ of the official <l n='api'/>.</p>
-- we could make them virtual: characters.contextnames[n]
-function characters.contextname(n) return data[n].contextname or "" end
-function characters.adobename (n) return data[n].adobename or "" end
-function characters.description(n) return data[n].description or "" end
--------- characters.category (n) return data[n].category or "" end
+function characters.contextname(n) return data[n] and data[n].contextname or "" end
+function characters.adobename (n) return data[n] and data[n].adobename or "" end
+function characters.description(n) return data[n] and data[n].description or "" end
+-------- characters.category (n) return data[n] and data[n].category or "" end
function characters.category(n,verbose)
local c = data[n].category
@@ -768,17 +946,159 @@ end
----- toupper = Cs((utf8byte/ucchars)^0)
----- toshape = Cs((utf8byte/shchars)^0)
-local tolower = Cs((utf8char/lcchars)^0)
-local toupper = Cs((utf8char/ucchars)^0)
-local toshape = Cs((utf8char/shchars)^0)
+local tolower = Cs((utf8character/lcchars)^0) -- no need to check spacing
+local toupper = Cs((utf8character/ucchars)^0) -- no need to check spacing
+local toshape = Cs((utf8character/shchars)^0) -- no need to check spacing
+
+lpegpatterns.tolower = tolower -- old ones ... will be overloaded
+lpegpatterns.toupper = toupper -- old ones ... will be overloaded
+lpegpatterns.toshape = toshape -- old ones ... will be overloaded
+
+-- function characters.lower (str) return lpegmatch(tolower,str) end
+-- function characters.upper (str) return lpegmatch(toupper,str) end
+-- function characters.shaped(str) return lpegmatch(toshape,str) end
+
+-- local superscripts = allocate() characters.superscripts = superscripts
+-- local subscripts = allocate() characters.subscripts = subscripts
+
+-- if storage then
+-- storage.register("characters/superscripts", superscripts, "characters.superscripts")
+-- storage.register("characters/subscripts", subscripts, "characters.subscripts")
+-- end
+
+-- end
+
+if not characters.splits then
+
+ local char = allocate()
+ local compat = allocate()
-patterns.tolower = tolower
-patterns.toupper = toupper
-patterns.toshape = toshape
+ local splits = {
+ char = char,
+ compat = compat,
+ }
-function characters.lower (str) return lpegmatch(tolower,str) end
-function characters.upper (str) return lpegmatch(toupper,str) end
-function characters.shaped(str) return lpegmatch(toshape,str) end
+ characters.splits = splits
+
+ -- [0x013F] = { 0x004C, 0x00B7 }
+ -- [0x0140] = { 0x006C, 0x00B7 }
+
+ for unicode, data in next, characters.data do
+ local specials = data.specials
+ if specials and #specials > 2 then
+ local kind = specials[1]
+ if kind == "compat" then
+ compat[unicode] = { unpack(specials,2) }
+ elseif kind == "char" then
+ char [unicode] = { unpack(specials,2) }
+ end
+ end
+ end
+
+ if storage then
+ storage.register("characters/splits", splits, "characters.splits")
+ end
+
+end
+
+if not characters.lhash then
+
+ local lhash = allocate() characters.lhash = lhash -- nil if no conversion
+ local uhash = allocate() characters.uhash = uhash -- nil if no conversion
+ local shash = allocate() characters.shash = shash -- nil if no conversion
+
+ for k, v in next, characters.data do
+ -- if k < 0x11000 then
+ local l = v.lccode
+ if l then
+ -- we have an uppercase
+ if type(l) == "number" then
+ lhash[utfchar(k)] = utfchar(l)
+ elseif #l == 2 then
+ lhash[utfchar(k)] = utfchar(l[1]) .. utfchar(l[2])
+ else
+ inspect(v)
+ end
+ else
+ local u = v.uccode
+ if u then
+ -- we have an lowercase
+ if type(u) == "number" then
+ uhash[utfchar(k)] = utfchar(u)
+ elseif #u == 2 then
+ uhash[utfchar(k)] = utfchar(u[1]) .. utfchar(u[2])
+ else
+ inspect(v)
+ end
+ end
+ end
+ local s = v.shcode
+ if s then
+ if type(s) == "number" then
+ shash[utfchar(k)] = utfchar(s)
+ elseif #s == 2 then
+ shash[utfchar(k)] = utfchar(s[1]) .. utfchar(s[2])
+ else
+ inspect(v)
+ end
+ end
+ -- end
+ end
+
+ if storage then
+ storage.register("characters/lhash", lhash, "characters.lhash")
+ storage.register("characters/uhash", uhash, "characters.uhash")
+ storage.register("characters/shash", shash, "characters.shash")
+ end
+
+end
+
+local lhash = characters.lhash mark(lhash)
+local uhash = characters.uhash mark(uhash)
+local shash = characters.shash mark(shash)
+
+local utf8lowercharacter = utfchartabletopattern(lhash) / lhash
+local utf8uppercharacter = utfchartabletopattern(uhash) / uhash
+local utf8shapecharacter = utfchartabletopattern(shash) / shash
+
+local utf8lower = Cs((utf8lowercharacter + utf8character)^0)
+local utf8upper = Cs((utf8uppercharacter + utf8character)^0)
+local utf8shape = Cs((utf8shapecharacter + utf8character)^0)
+
+lpegpatterns.utf8lowercharacter = utf8lowercharacter -- one character
+lpegpatterns.utf8uppercharacter = utf8uppercharacter -- one character
+lpegpatterns.utf8shapecharacter = utf8shapecharacter -- one character
+
+lpegpatterns.utf8lower = utf8lower -- string
+lpegpatterns.utf8upper = utf8upper -- string
+lpegpatterns.utf8shape = utf8shape -- string
+
+function characters.lower (str) return lpegmatch(utf8lower,str) end
+function characters.upper (str) return lpegmatch(utf8upper,str) end
+function characters.shaped(str) return lpegmatch(utf8shape,str) end
+
+-- local str = [[
+-- ÀÁÂÃÄÅàáâãäå àáâãäåàáâãäå ÀÁÂÃÄÅÀÁÂÃÄÅ AAAAAAaaaaaa
+-- ÆÇæç æçæç ÆÇÆÇ AECaec
+-- ÈÉÊËèéêë èéêëèéêë ÈÉÊËÈÉÊË EEEEeeee
+-- ÌÍÎÏÞìíîïþ ìíîïþìíîïþ ÌÍÎÏÞÌÍÎÏÞ IIIIÞiiiiþ
+-- Ðð ðð ÐÐ Ðð
+-- Ññ ññ ÑÑ Nn
+-- ÒÓÔÕÖòóôõö òóôõöòóôõö ÒÓÔÕÖÒÓÔÕÖ OOOOOooooo
+-- Øø øø ØØ Oo
+-- ÙÚÛÜùúûü ùúûüùúûü ÙÚÛÜÙÚÛÜ UUUUuuuu
+-- Ýýÿ ýýÿ ÝÝŸ Yyy
+-- ß ß SS ss
+-- Ţţ ţţ ŢŢ Tt
+-- ]]
+--
+-- local lower = characters.lower print(lower(str))
+-- local upper = characters.upper print(upper(str))
+-- local shaped = characters.shaped print(shaped(str))
+--
+-- local c, n = os.clock(), 10000
+-- for i=1,n do lower(str) upper(str) shaped(str) end -- 2.08 => 0.77
+-- print(os.clock()-c,n*#str*3)
-- maybe: (twice as fast when much ascii)
--
@@ -827,15 +1147,6 @@ end
function characters.uccode(n) return uccodes[n] end -- obsolete
function characters.lccode(n) return lccodes[n] end -- obsolete
-function characters.safechar(n)
- local c = data[n]
- if c and c.contextname then
- return "\\" .. c.contextname
- else
- return utfchar(n)
- end
-end
-
function characters.shape(n)
local shcode = shcodes[n]
if not shcode then
@@ -890,41 +1201,42 @@ end
-- groupdata[group] = gdata
-- end
---~ characters.data, characters.groups = chardata, groupdata
-
---~ [0xF0000]={
---~ category="co",
---~ cjkwd="a",
---~ description="<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,
---~ },
+-- 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
+ local fractions = allocate() characters.fractions = fractions
-- skipping U+02120 (service mark) U+02122 (trademark)
@@ -944,16 +1256,24 @@ if not characters.superscripts then
elseif trace_defining then
report_defining("ignoring %s %a, char %c, description %a","subscript",ustring(k),k,v.description)
end
+ elseif what == "fraction" then
+ if #specials > 1 then
+ fractions[k] = { unpack(specials,2) }
+ elseif trace_defining then
+ report_defining("ignoring %s %a, char %c, description %a","fraction",ustring(k),k,v.description)
+ end
end
end
end
-- print(table.serialize(superscripts, "superscripts", { hexify = true }))
-- print(table.serialize(subscripts, "subscripts", { hexify = true }))
+ -- print(table.serialize(fractions, "fractions", { hexify = true }))
if storage then
storage.register("characters/superscripts", superscripts, "characters.superscripts")
storage.register("characters/subscripts", subscripts, "characters.subscripts")
+ storage.register("characters/fractions", fractions, "characters.fractions")
end
end
@@ -976,259 +1296,6 @@ function characters.showstring(str)
end
end
--- the following code will move to char-tex.lua
-
--- tex
-
-if not tex or not context or not commands then return characters end
-
-local tex = tex
-local texsetlccode = tex.setlccode
-local texsetuccode = tex.setuccode
-local texsetsfcode = tex.setsfcode
-local texsetcatcode = tex.setcatcode
-
-local contextsprint = context.sprint
-local ctxcatcodes = catcodes.numbers.ctxcatcodes
-
---[[ldx--
-<p>Instead of using a <l n='tex'/> file to define the named glyphs, we
-use the table. After all, we have this information available anyway.</p>
---ldx]]--
-
-function commands.makeactive(n,name) --
- contextsprint(ctxcatcodes,format("\\catcode%s=13\\unexpanded\\def %s{\\%s}",n,utfchar(n),name))
- -- context("\\catcode%s=13\\unexpanded\\def %s{\\%s}",n,utfchar(n),name)
-end
-
-function commands.utfchar(c,n)
- if n then
- -- contextsprint(c,charfromnumber(n))
- contextsprint(c,utfchar(n))
- else
- -- contextsprint(charfromnumber(c))
- contextsprint(utfchar(c))
- end
-end
-
-function commands.safechar(n)
- local c = data[n]
- if c and c.contextname then
- contextsprint("\\" .. c.contextname) -- context[c.contextname]()
- else
- contextsprint(utfchar(n))
- end
-end
-
-tex.uprint = commands.utfchar
-
-local forbidden = tohash { -- at least now
- 0x00A0,
- 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x200B, 0x200C, 0x200D,
- 0x202F,
- 0x205F,
- -- 0xFEFF,
-}
-
-function characters.define(tobelettered, tobeactivated) -- catcodetables
-
- if trace_defining then
- report_defining("defining active character commands")
- end
-
- local activated, a = { }, 0
-
- for u, chr in next, data do -- these will be commands
- local fallback = chr.fallback
- if fallback then
- contextsprint("{\\catcode",u,"=13\\unexpanded\\gdef ",utfchar(u),"{\\checkedchar{",u,"}{",fallback,"}}}")
- a = a + 1
- activated[a] = u
- else
- local contextname = chr.contextname
- if contextname then
- local category = chr.category
- if is_character[category] then
- if chr.unicodeslot < 128 then
- if is_letter[category] then
- contextsprint(ctxcatcodes,format("\\def\\%s{%s}",contextname,utfchar(u))) -- has no s
- else
- contextsprint(ctxcatcodes,format("\\chardef\\%s=%s",contextname,u)) -- has no s
- end
- else
- contextsprint(ctxcatcodes,format("\\def\\%s{%s}",contextname,utfchar(u))) -- has no s
- end
- elseif is_command[category] and not forbidden[u] then
- contextsprint("{\\catcode",u,"=13\\unexpanded\\gdef ",utfchar(u),"{\\"..contextname,"}}")
- a = a + 1
- activated[a] = u
- end
- end
- end
- end
-
- if tobelettered then -- shared
- local saved = tex.catcodetable
- for i=1,#tobelettered do
- tex.catcodetable = tobelettered[i]
- if trace_defining then
- report_defining("defining letters (global, shared)")
- end
- for u, chr in next, data do
- if not chr.fallback and is_letter[chr.category] and u >= 128 and u <= 65536 then
- texsetcatcode(u,11)
- end
- local range = chr.range
- if range then
- for i=1,range.first,range.last do -- tricky as not all are letters
- texsetcatcode(i,11)
- end
- end
- end
- texsetcatcode(0x200C,11) -- non-joiner
- texsetcatcode(0x200D,11) -- joiner
- for k, v in next, blocks do
- if v.catcode == "letter" then
- for i=v.first,v.last do
- texsetcatcode(i,11)
- end
- end
- end
- end
- tex.catcodetable = saved
- end
-
- local nofactivated = #tobeactivated
- if tobeactivated and nofactivated > 0 then
- for i=1,nofactivated do
- local u = activated[i]
- if u then
- report_defining("character %U is active in set %a, containing %a",u,data[u].description,tobeactivated)
- end
- end
- local saved = tex.catcodetable
- for i=1,#tobeactivated do
- local vector = tobeactivated[i]
- if trace_defining then
- report_defining("defining %a active characters in vector %a",nofactivated,vector)
- end
- tex.catcodetable = vector
- for i=1,nofactivated do
- local u = activated[i]
- if u then
- texsetcatcode(u,13)
- end
- end
- end
- tex.catcodetable = saved
- end
-
-end
-
---[[ldx--
-<p>Setting the lccodes is also done in a loop over the data table.</p>
---ldx]]--
-
-local sfmode = "unset" -- unset, traditional, normal
-
-function characters.setcodes()
- if trace_defining then
- report_defining("defining lc and uc codes")
- end
- local traditional = sfstate == "traditional" or sfstate == "unset"
- for code, chr in next, data do
- local cc = chr.category
- if is_letter[cc] then
- local range = chr.range
- if range then
- for i=range.first,range.last do
- texsetcatcode(i,11) -- letter
- texsetlccode(i,i,i) -- self self
- end
- else
- local lc, uc = chr.lccode, chr.uccode
- if not lc then
- chr.lccode, lc = code, code
- elseif type(lc) == "table" then
- lc = code
- end
- if not uc then
- chr.uccode, uc = code, code
- elseif type(uc) == "table" then
- uc = code
- end
- texsetcatcode(code,11) -- letter
- texsetlccode(code,lc,uc)
- if traditional and cc == "lu" then
- texsetsfcode(code,999)
- end
- end
- elseif is_mark[cc] then
- texsetlccode(code,code,code) -- for hyphenation
- end
- end
- if traditional then
- sfstate = "traditional"
- end
-end
-
--- If this is something that is not documentwide and used a lot, then we
--- need a more clever approach (trivial but not now).
-
-local function setuppersfcodes(v,n)
- if sfstate ~= "unset" then
- report_defining("setting uppercase sf codes to %a",n)
- for code, chr in next, data do
- if chr.category == "lu" then
- texsetsfcode(code,n)
- end
- end
- end
- sfstate = v
-end
-
-directives.register("characters.spaceafteruppercase",function(v)
- if v == "traditional" then
- setuppersfcodes(v,999)
- elseif v == "normal" then
- setuppersfcodes(v,1000)
- end
-end)
-
--- tex
-
-function commands.chardescription(slot)
- local d = data[slot]
- if d then
- context(d.description)
- end
-end
-
--- xml
-
-characters.activeoffset = 0x10000 -- there will be remapped in that byte range
-
-function commands.remapentity(chr,slot)
- contextsprint(format("{\\catcode%s=13\\xdef%s{\\string%s}}",slot,utfchar(slot),chr))
-end
-
--- xml.entities = xml.entities or { }
---
--- storage.register("xml/entities",xml.entities,"xml.entities") -- this will move to lxml
---
--- function characters.setmkiventities()
--- local entities = xml.entities
--- entities.lt = "<"
--- entities.amp = "&"
--- entities.gt = ">"
--- end
---
--- function characters.setmkiientities()
--- local entities = xml.entities
--- entities.lt = utfchar(characters.activeoffset + utfbyte("<"))
--- entities.amp = utfchar(characters.activeoffset + utfbyte("&"))
--- entities.gt = utfchar(characters.activeoffset + utfbyte(">"))
--- end
+-- code moved to char-tex.lua
-commands.definecatcodetable = characters.define
-commands.setcharactercodes = characters.setcodes
+return characters
diff --git a/Master/texmf-dist/tex/context/base/char-ini.mkiv b/Master/texmf-dist/tex/context/base/char-ini.mkiv
index db52ae7239f..bb4483b7527 100644
--- a/Master/texmf-dist/tex/context/base/char-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/char-ini.mkiv
@@ -13,11 +13,10 @@
\writestatus{loading}{ConTeXt Character Support / Initialization}
-\registerctxluafile{char-def}{1.001} % let's load this one first
-\registerctxluafile{char-ini}{1.001}
-\registerctxluafile{char-cjk}{1.001}
+\registerctxluafile{char-fio}{1.001}
\registerctxluafile{char-map}{1.001} % maybe we will load this someplace else
\registerctxluafile{char-tex}{1.001}
+\registerctxluafile{char-ent}{1.001}
\unprotect
@@ -43,7 +42,8 @@
% use \normalUchar when possible .. the next one is nice for documents and it also accepts
% 0x prefixed numbers
-\def\utfchar#1{\ctxcommand{utfchar(\number#1)}}
+\def\utfchar #1{\clf_utfchar \numexpr#1\relax}
+\def\safechar#1{\clf_safechar\numexpr#1\relax}
\def\checkedchar {\relax\ifmmode\expandafter\checkedmathchar\else\expandafter\checkedtextchar\fi} % #1#2
\def\checkedmathchar#1#2{#2}
@@ -65,30 +65,26 @@
% \def\setcclcuc#1#2#3{\global\catcode#1=\lettercatcode\global\lccode#1=#2\global\uccode#1=#3\relax}
% \def\setcclcucself#1{\global\catcode#1=\lettercatcode\global\lccode#1=#1\global\uccode#1=#1\relax }
-\ctxcommand{setcharactercodes()}
-
% Is setting up vrb tpa and tpb needed?
-\ctxcommand{definecatcodetable(
- { % letter catcodes
- \number\texcatcodes,
- \number\ctxcatcodes,
- \number\notcatcodes,
- %number\mthcatcodes,
- \number\vrbcatcodes,
- \number\prtcatcodes,
- \number\tpacatcodes,
- \number\tpbcatcodes,
- \number\txtcatcodes,
- },
- { % activate catcodes
- \number\ctxcatcodes,
- \number\notcatcodes,
- \number\prtcatcodes, % new
- }
-)}
-
-\def\chardescription#1%
- {\ctxcommand{chardescription(\number#1)}}
+% move to lua side
+
+%clf_setcharactercodes
+
+\clf_setlettercatcodes\texcatcodes
+\clf_setlettercatcodes\ctxcatcodes
+\clf_setlettercatcodes\notcatcodes
+%clf_setlettercatcodes\mthcatcodes
+\clf_setlettercatcodes\vrbcatcodes
+\clf_setlettercatcodes\prtcatcodes
+\clf_setlettercatcodes\tpacatcodes
+\clf_setlettercatcodes\tpbcatcodes
+\clf_setlettercatcodes\txtcatcodes
+
+\clf_setactivecatcodes\ctxcatcodes
+\clf_setactivecatcodes\notcatcodes
+\clf_setactivecatcodes\prtcatcodes
+
+\def\chardescription#1{\clf_chardescription#1\relax}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/char-tex.lua b/Master/texmf-dist/tex/context/base/char-tex.lua
index 472cae930c3..48dccfe7915 100644
--- a/Master/texmf-dist/tex/context/base/char-tex.lua
+++ b/Master/texmf-dist/tex/context/base/char-tex.lua
@@ -6,17 +6,118 @@ if not modules then modules = { } end modules ['char-tex'] = {
license = "see context related readme files"
}
-local lpeg = lpeg
-local find = string.find
+local lpeg = lpeg
+local next, type = next, type
+local format, find, gmatch = string.format, string.find, string.gmatch
+local utfchar, utfbyte = utf.char, utf.byte
+local concat, tohash = table.concat, table.tohash
local P, C, R, S, V, Cs, Cc = lpeg.P, lpeg.C, lpeg.R, lpeg.S, lpeg.V, lpeg.Cs, lpeg.Cc
-local U, lpegmatch = lpeg.patterns.utf8, lpeg.match
-local allocate, mark = utilities.storage.allocate, utilities.storage.mark
+local lpegpatterns = lpeg.patterns
+local lpegmatch = lpeg.match
+local utfchartabletopattern = lpeg.utfchartabletopattern
+
+local allocate = utilities.storage.allocate
+local mark = utilities.storage.mark
+
+local context = context
+local commands = commands
+local implement = interfaces.implement
+
+local characters = characters
+local texcharacters = { }
+characters.tex = texcharacters
+local utffilters = characters.filters.utf
+
+local is_character = characters.is_character
+local is_letter = characters.is_letter
+local is_command = characters.is_command
+local is_spacing = characters.is_spacing
+local is_mark = characters.is_mark
+local is_punctuation = characters.is_punctuation
+
+local data = characters.data if not data then return end
+local blocks = characters.blocks
+
+local trace_defining = false trackers.register("characters.defining", function(v) characters_defining = v end)
+
+local report_defining = logs.reporter("characters")
+
+--[[ldx--
+<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 <l n='luatex'/> engine itself.</p>
+
+<p>This leaves us problems with characters that are specific to <l n='tex'/> like
+<type>{}</type>, <type>$</type> and alike. We can remap some chars that tex input files
+are sensitive for to a private area (while writing to a utility file) and revert then
+to their original slot when we read in such a file. Instead of reverting, we can (when
+we resolve characters to glyphs) map them to their right glyph there. For this purpose
+we can use the private planes 0x0F0000 and 0x100000.</p>
+--ldx]]--
+
+local low = allocate()
+local high = allocate()
+local escapes = allocate()
+local special = "~#$%^&_{}\\|" -- "~#$%{}\\|"
+
+local private = {
+ low = low,
+ high = high,
+ escapes = escapes,
+}
+
+utffilters.private = private
+
+for ch in gmatch(special,".") do
+ local cb
+ if type(ch) == "number" then
+ cb, ch = ch, utfchar(ch)
+ else
+ cb = utfbyte(ch)
+ end
+ if cb < 256 then
+ escapes[ch] = "\\" .. ch
+ low[ch] = utfchar(0x0F0000 + cb)
+ if ch == "%" then
+ ch = "%%" -- nasty, but we need this as in replacements (also in lpeg) % is interpreted
+ end
+ high[utfchar(0x0F0000 + cb)] = ch
+ end
+end
+
+local tohigh = lpeg.replacer(low) -- frozen, only for basic tex
+local tolow = lpeg.replacer(high) -- frozen, only for basic tex
+
+lpegpatterns.utftohigh = tohigh
+lpegpatterns.utftolow = tolow
+
+function utffilters.harden(str)
+ return lpegmatch(tohigh,str)
+end
+
+function utffilters.soften(str)
+ return lpegmatch(tolow,str)
+end
+
+private.escape = utf.remapper(escapes) -- maybe: ,"dynamic"
+private.replace = utf.remapper(low) -- maybe: ,"dynamic"
+private.revert = utf.remapper(high) -- maybe: ,"dynamic"
+
+--[[ldx--
+<p>We get a more efficient variant of this when we integrate
+replacements in collapser. This more or less renders the previous
+private code redundant. The following code is equivalent but the
+first snippet uses the relocated dollars.</p>
-characters = characters or { }
-local characters = characters
-characters.tex = characters.tex or { }
+<typing>
+[󰀤x󰀤] [$x$]
+</typing>
+--ldx]]--
+
+-- using the tree-lpeg-mapper would be nice but we also need to deal with end-of-string
+-- cases: "\"\i" and don't want "\relax" to be seen as \r e lax" (for which we need to mess
+-- with spaces
local accentmapping = allocate {
['"'] = { [""] = "¨",
@@ -128,7 +229,7 @@ local accentmapping = allocate {
},
}
-characters.tex.accentmapping = accentmapping
+texcharacters.accentmapping = accentmapping
local accent_map = allocate { -- incomplete
['~'] = "̃" , -- ̃ Ẽ
@@ -150,7 +251,7 @@ local accent_map = allocate { -- incomplete
-- ̰ Ḛ
}
--- local accents = table.concat(table.keys(accentmapping)) -- was _map
+-- local accents = concat(table.keys(accentmapping)) -- was _map
local function remap_accent(a,c,braced)
local m = accentmapping[a]
@@ -171,86 +272,495 @@ local function remap_accent(a,c,braced)
end
end
-local command_map = allocate {
- ["i"] = "ı",
- ["l"] = "ł",
- ["ss"] = "ß",
- ["ae"] = "æ",
- ["AE"] = "Æ",
- ["oe"] = "œ",
- ["OE"] = "Œ",
- ["o"] = "ø",
- ["O"] = "Ø",
- ["aa"] = "å",
- ["AA"] = "Å",
+local commandmapping = allocate {
+ ["aa"] = "å", ["AA"] = "Å",
+ ["ae"] = "æ", ["AE"] = "Æ",
+ ["cc"] = "ç", ["CC"] = "Ç",
+ ["i"] = "ı", ["j"] = "ȷ",
+ ["ij"] = "ij", ["IJ"] = "IJ",
+ ["l"] = "ł", ["L"] = "Ł",
+ ["o"] = "ø", ["O"] = "Ø",
+ ["oe"] = "œ", ["OE"] = "Œ",
+ ["sz"] = "ß", ["SZ"] = "SZ", ["SS"] = "ß",
}
--- no need for U here
-
-local achar = R("az","AZ") + P("ı") + P("\\i")
+texcharacters.commandmapping = commandmapping
-local spaces = P(" ")^0
-local no_l = P("{") / ""
-local no_r = P("}") / ""
-local no_b = P('\\') / ""
+-- local achar = R("az","AZ") + P("ı") + P("\\i")
+--
+-- local spaces = P(" ")^0
+-- local no_l = P("{") / ""
+-- local no_r = P("}") / ""
+-- local no_b = P('\\') / ""
+--
+-- local lUr = P("{") * C(achar) * P("}")
+--
+-- local accents_1 = [["'.=^`~]]
+-- local accents_2 = [[Hckruv]]
+--
+-- local accent = P('\\') * (
+-- C(S(accents_1)) * (lUr * Cc(true) + C(achar) * Cc(false)) + -- we need achar for ı etc, could be sped up
+-- C(S(accents_2)) * lUr * Cc(true)
+-- ) / remap_accent
+--
+-- local csname = P('\\') * C(R("az","AZ")^1)
+--
+-- local command = (
+-- csname +
+-- P("{") * csname * spaces * P("}")
+-- ) / commandmapping -- remap_commands
+--
+-- local both_1 = Cs { "run",
+-- accent = accent,
+-- command = command,
+-- run = (V("accent") + no_l * V("accent") * no_r + V("command") + P(1))^0,
+-- }
+--
+-- local both_2 = Cs { "run",
+-- accent = accent,
+-- command = command,
+-- run = (V("accent") + V("command") + no_l * ( V("accent") + V("command") ) * no_r + P(1))^0,
+-- }
+--
+-- function texcharacters.toutf(str,strip)
+-- if not find(str,"\\") then
+-- return str
+-- elseif strip then
+-- return lpegmatch(both_1,str)
+-- else
+-- return lpegmatch(both_2,str)
+-- end
+-- end
-local lUr = P("{") * C(achar) * P("}")
+local untex
-local accents_1 = [["'.=^`~]]
-local accents_2 = [[Hckruv]]
+local function toutfpattern()
+ if not untex then
+ local hash = { }
+ for k, v in next, accentmapping do
+ for kk, vv in next, v do
+ if (k >= "a" and k <= "z") or (k >= "A" and k <= "Z") then
+ hash[ "\\"..k.." "..kk ] = vv
+ hash["{\\"..k.." "..kk.."}"] = vv
+ else
+ hash["\\" ..k ..kk ] = vv
+ hash["{\\"..k ..kk.."}"] = vv
+ end
+ hash["\\" ..k.."{"..kk.."}" ] = vv
+ hash["{\\"..k.."{"..kk.."}}"] = vv
+ end
+ end
+ for k, v in next, commandmapping do
+ hash["\\"..k.." "] = v
+ hash["{\\"..k.."}"] = v
+ hash["{\\"..k.." }"] = v
+ end
+ untex = utfchartabletopattern(hash) / hash
+ end
+ return untex
+end
-local accent = P('\\') * (
- C(S(accents_1)) * (lUr * Cc(true) + C(achar) * Cc(false)) + -- we need achar for ı etc, could be sped up
- C(S(accents_2)) * lUr * Cc(true)
-) / remap_accent
+texcharacters.toutfpattern = toutfpattern
-local csname = P('\\') * C(R("az","AZ")^1)
+local pattern = nil
-local command = (
- csname +
- P("{") * csname * spaces * P("}")
-) / command_map -- remap_commands
+local function prepare()
+ pattern = Cs((toutfpattern() + P(1))^0)
+ return pattern
+end
-local both_1 = Cs { "run",
- accent = accent,
- command = command,
- run = (V("accent") + no_l * V("accent") * no_r + V("command") + P(1))^0,
-}
+function texcharacters.toutf(str,strip)
+ if str == "" then
+ return str
+ elseif not find(str,"\\") then
+ return str
+ -- elseif strip then
+ else
+ return lpegmatch(pattern or prepare(),str)
+ end
+end
-local both_2 = Cs { "run",
- accent = accent,
- command = command,
- run = (V("accent") + V("command") + no_l * ( V("accent") + V("command") ) * no_r + P(1))^0,
-}
+-- print(texcharacters.toutf([[\~{Z}]],true))
+-- print(texcharacters.toutf([[\'\i]],true))
+-- print(texcharacters.toutf([[\'{\i}]],true))
+-- print(texcharacters.toutf([[\"{e}]],true))
+-- print(texcharacters.toutf([[\" {e}]],true))
+-- print(texcharacters.toutf([[{\"{e}}]],true))
+-- print(texcharacters.toutf([[{\" {e}}]],true))
+-- print(texcharacters.toutf([[{\l}]],true))
+-- print(texcharacters.toutf([[{\l }]],true))
+-- print(texcharacters.toutf([[\v{r}]],true))
+-- print(texcharacters.toutf([[fo{\"o}{\ss}ar]],true))
+-- print(texcharacters.toutf([[H{\'a}n Th\^e\llap{\raise 0.5ex\hbox{\'{\relax}}} Th{\'a}nh]],true))
-function characters.tex.toutf(str,strip)
- if not find(str,"\\") then
- return str
- elseif strip then
- return lpegmatch(both_1,str)
+function texcharacters.safechar(n) -- was characters.safechar
+ local c = data[n]
+ if c and c.contextname then
+ return "\\" .. c.contextname
else
- return lpegmatch(both_2,str)
+ return utfchar(n)
end
end
--- print(characters.tex.toutf([[\~{Z}]],true))
--- print(characters.tex.toutf([[\'\i]],true))
--- print(characters.tex.toutf([[\'{\i}]],true))
--- print(characters.tex.toutf([[\"{e}]],true))
--- print(characters.tex.toutf([[\" {e}]],true))
--- print(characters.tex.toutf([[{\"{e}}]],true))
--- print(characters.tex.toutf([[{\" {e}}]],true))
--- print(characters.tex.toutf([[{\l}]],true))
--- print(characters.tex.toutf([[{\l }]],true))
--- print(characters.tex.toutf([[\v{r}]],true))
--- print(characters.tex.toutf([[fo{\"o}{\ss}ar]],true))
--- print(characters.tex.toutf([[H{\'a}n Th\^e\llap{\raise 0.5ex\hbox{\'{\relax}}} Th{\'a}nh]],true))
-
-function characters.tex.defineaccents()
+if not context or not commands then
+ -- used in e.g. mtx-bibtex
+ return
+end
+
+-- all kind of initializations
+
+local tex = tex
+local texsetlccode = tex.setlccode
+local texsetuccode = tex.setuccode
+local texsetsfcode = tex.setsfcode
+local texsetcatcode = tex.setcatcode
+
+local contextsprint = context.sprint
+local ctxcatcodes = catcodes.numbers.ctxcatcodes
+
+function texcharacters.defineaccents()
+ local ctx_dodefineaccentcommand = context.dodefineaccentcommand
+ local ctx_dodefineaccent = context.dodefineaccent
+ local ctx_dodefinecommand = context.dodefinecommand
for accent, group in next, accentmapping do
- context.dodefineaccentcommand(accent)
+ ctx_dodefineaccentcommand(accent)
for character, mapping in next, group do
- context.dodefineaccent(accent,character,mapping)
+ ctx_dodefineaccent(accent,character,mapping)
+ end
+ end
+ for command, mapping in next, commandmapping do
+ ctx_dodefinecommand(command,mapping)
+ end
+end
+
+implement { -- a waste of scanner but consistent
+ name = "defineaccents",
+ actions = texcharacters.defineaccents
+}
+
+--[[ldx--
+<p>Instead of using a <l n='tex'/> file to define the named glyphs, we
+use the table. After all, we have this information available anyway.</p>
+--ldx]]--
+
+function commands.makeactive(n,name) -- not used
+ contextsprint(ctxcatcodes,format("\\catcode%s=13\\unexpanded\\def %s{\\%s}",n,utfchar(n),name))
+ -- context("\\catcode%s=13\\unexpanded\\def %s{\\%s}",n,utfchar(n),name)
+end
+
+implement {
+ name = "utfchar",
+ actions = { utfchar, contextsprint },
+ arguments = "integer"
+}
+
+implement {
+ name = "safechar",
+ actions = { texcharacters.safechar, contextsprint },
+ arguments = "integer"
+}
+
+implement {
+ name = "uchar",
+ arguments = { "integer", "integer" },
+ actions = function(h,l)
+ context(utfchar(h*256+l))
+ end
+}
+
+tex.uprint = commands.utfchar
+
+-- in contect we don't use lc and uc codes (in fact in luatex we should have a hf code)
+-- so at some point we might drop this
+
+local forbidden = tohash { -- at least now
+ 0x00A0,
+ 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x200B, 0x200C, 0x200D,
+ 0x202F,
+ 0x205F,
+ -- 0xFEFF,
+}
+
+local csletters = characters.csletters -- also a signal that we have initialized
+local activated = { }
+local sfmode = "unset" -- unset, traditional, normal
+local block_too = false
+
+directives.register("characters.blockstoo",function(v) block_too = v end)
+
+-- If this is something that is not documentwide and used a lot, then we
+-- need a more clever approach (trivial but not now).
+
+local function setuppersfcodes(v,n)
+ if sfstate ~= "unset" then
+ report_defining("setting uppercase sf codes to %a",n)
+ for u, chr in next, data do
+ if chr.category == "lu" then
+ texsetsfcode(u,n)
+ end
end
end
+ sfstate = v
end
+
+directives.register("characters.spaceafteruppercase",function(v)
+ if v == "traditional" then
+ setuppersfcodes(v,999)
+ elseif v == "normal" then
+ setuppersfcodes(v,1000)
+ end
+end)
+
+if not csletters then
+
+ csletters = allocate()
+ characters.csletters = csletters
+
+ report_defining("setting up character related codes and commands")
+
+ if sfstate == "unset" then
+ sfstate = "traditional"
+ end
+
+ local traditional = sfstate == "traditional"
+
+ for u, chr in next, data do -- will move up
+ local fallback = chr.fallback
+ if fallback then
+ contextsprint("{\\catcode",u,"=13\\unexpanded\\gdef ",utfchar(u),"{\\checkedchar{",u,"}{",fallback,"}}}")
+ activated[#activated+1] = u
+ else
+ local contextname = chr.contextname
+ local category = chr.category
+ local isletter = is_letter[category]
+ if contextname then
+ if is_character[category] then
+ if chr.unicodeslot < 128 then
+ if isletter then
+ -- setmacro
+ local c = utfchar(u)
+ contextsprint(ctxcatcodes,format("\\def\\%s{%s}",contextname,c)) -- has no s
+ csletters[c] = u
+ else
+ -- setchar
+ contextsprint(ctxcatcodes,format("\\chardef\\%s=%s",contextname,u)) -- has no s
+ end
+ else
+ -- setmacro
+ local c = utfchar(u)
+ contextsprint(ctxcatcodes,format("\\def\\%s{%s}",contextname,c)) -- has no s
+ if isletter and u >= 32 and u <= 65536 then
+ csletters[c] = u
+ end
+ end
+ --
+ if isletter then
+ local lc, uc = chr.lccode, chr.uccode
+ if not lc then
+ chr.lccode, lc = u, u
+ elseif type(lc) == "table" then
+ lc = u
+ end
+ if not uc then
+ chr.uccode, uc = u, u
+ elseif type(uc) == "table" then
+ uc = u
+ end
+ texsetlccode(u,lc,uc)
+ if traditional and category == "lu" then
+ texsetsfcode(code,999)
+ end
+ end
+ --
+ elseif is_command[category] and not forbidden[u] then
+ -- set
+ contextsprint("{\\catcode",u,"=13\\unexpanded\\gdef ",utfchar(u),"{\\"..contextname,"}}")
+ activated[#activated+1] = u
+ elseif is_mark[category] then
+ texsetlccode(u,u,u) -- for hyphenation
+ end
+ elseif isletter and u >= 32 and u <= 65536 then
+ csletters[utfchar(u)] = u
+ --
+ local lc, uc = chr.lccode, chr.uccode
+ if not lc then
+ chr.lccode, lc = u, u
+ elseif type(lc) == "table" then
+ lc = u
+ end
+ if not uc then
+ chr.uccode, uc = u, u
+ elseif type(uc) == "table" then
+ uc = u
+ end
+ texsetlccode(u,lc,uc)
+ if traditional and category == "lu" then
+ texsetsfcode(code,999)
+ end
+ --
+ elseif is_mark[category] then
+ --
+ texsetlccode(u,u,u) -- for hyphenation
+ --
+ end
+ end
+ end
+
+ if blocks_too then
+ -- this slows down format generation by over 10 percent
+ for k, v in next, blocks do
+ if v.catcode == "letter" then
+ for u=v.first,v.last do
+ csletters[utfchar(u)] = u
+ --
+ -- texsetlccode(u,u,u) -- self self
+ --
+ end
+ end
+ end
+ end
+
+ if storage then
+ storage.register("characters/csletters", csletters, "characters.csletters")
+ end
+
+else
+ mark(csletters)
+
+end
+
+lpegpatterns.csletter = utfchartabletopattern(csletters)
+
+-- todo: get rid of activated
+-- todo: move first loop out ,merge with above
+
+function characters.setlettercatcodes(cct)
+ if trace_defining then
+ report_defining("assigning letter catcodes to catcode table %a",cct)
+ end
+ local saved = tex.catcodetable
+ tex.catcodetable = cct
+ texsetcatcode(0x200C,11) -- non-joiner
+ texsetcatcode(0x200D,11) -- joiner
+ for c, u in next, csletters do
+ texsetcatcode(u,11)
+ end
+ -- for u, chr in next, data do
+ -- if not chr.fallback and is_letter[chr.category] and u >= 32 and u <= 65536 then
+ -- texsetcatcode(u,11)
+ -- end
+ -- local range = chr.range
+ -- if range then
+ -- for i=1,range.first,range.last do -- tricky as not all are letters
+ -- texsetcatcode(i,11)
+ -- end
+ -- end
+ -- end
+ -- for k, v in next, blocks do
+ -- if v.catcode == "letter" then
+ -- for u=v.first,v.last do
+ -- texsetcatcode(u,11)
+ -- end
+ -- end
+ -- end
+ tex.catcodetable = saved
+end
+
+function characters.setactivecatcodes(cct)
+ local saved = tex.catcodetable
+ tex.catcodetable = cct
+ for i=1,#activated do
+ local u = activated[i]
+ texsetcatcode(u,13)
+ if trace_defining then
+ report_defining("character %U (%s) is active in set %a",u,data[u].description,cct)
+ end
+ end
+ tex.catcodetable = saved
+end
+
+--[[ldx--
+<p>Setting the lccodes is also done in a loop over the data table.</p>
+--ldx]]--
+
+-- function characters.setcodes() -- we could loop over csletters
+-- if trace_defining then
+-- report_defining("defining lc and uc codes")
+-- end
+-- local traditional = sfstate == "traditional" or sfstate == "unset"
+-- for code, chr in next, data do
+-- local cc = chr.category
+-- if is_letter[cc] then
+-- local range = chr.range
+-- if range then
+-- for i=range.first,range.last do
+-- texsetlccode(i,i,i) -- self self
+-- end
+-- else
+-- local lc, uc = chr.lccode, chr.uccode
+-- if not lc then
+-- chr.lccode, lc = code, code
+-- elseif type(lc) == "table" then
+-- lc = code
+-- end
+-- if not uc then
+-- chr.uccode, uc = code, code
+-- elseif type(uc) == "table" then
+-- uc = code
+-- end
+-- texsetlccode(code,lc,uc)
+-- if traditional and cc == "lu" then
+-- texsetsfcode(code,999)
+-- end
+-- end
+-- elseif is_mark[cc] then
+-- texsetlccode(code,code,code) -- for hyphenation
+-- end
+-- end
+-- if traditional then
+-- sfstate = "traditional"
+-- end
+-- end
+
+-- tex
+
+implement {
+ name = "chardescription",
+ arguments = "integer",
+ actions = function(slot)
+ local d = data[slot]
+ if d then
+ context(d.description)
+ end
+ end,
+}
+
+-- xml
+
+characters.activeoffset = 0x10000 -- there will be remapped in that byte range
+
+function commands.remapentity(chr,slot) -- not used
+ contextsprint(format("{\\catcode%s=13\\xdef%s{\\string%s}}",slot,utfchar(slot),chr))
+end
+
+-- xml.entities = xml.entities or { }
+--
+-- storage.register("xml/entities",xml.entities,"xml.entities") -- this will move to lxml
+--
+-- function characters.setmkiventities()
+-- local entities = xml.entities
+-- entities.lt = "<"
+-- entities.amp = "&"
+-- entities.gt = ">"
+-- end
+--
+-- function characters.setmkiientities()
+-- local entities = xml.entities
+-- entities.lt = utfchar(characters.activeoffset + utfbyte("<"))
+-- entities.amp = utfchar(characters.activeoffset + utfbyte("&"))
+-- entities.gt = utfchar(characters.activeoffset + utfbyte(">"))
+-- end
+
+implement { name = "setlettercatcodes", scope = "private", actions = characters.setlettercatcodes, arguments = "integer" }
+implement { name = "setactivecatcodes", scope = "private", actions = characters.setactivecatcodes, arguments = "integer" }
+--------- { name = "setcharactercodes", scope = "private", actions = characters.setcodes }
diff --git a/Master/texmf-dist/tex/context/base/char-utf.lua b/Master/texmf-dist/tex/context/base/char-utf.lua
index d406b8bfefe..9ed861be097 100644
--- a/Master/texmf-dist/tex/context/base/char-utf.lua
+++ b/Master/texmf-dist/tex/context/base/char-utf.lua
@@ -6,11 +6,6 @@ if not modules then modules = { } end modules ['char-utf'] = {
license = "see context related readme files"
}
--- todo: trackers
--- todo: no longer special characters (high) here, only needed in special cases and
--- these don't go through this file anyway
--- graphemes: basic symbols
-
--[[ldx--
<p>When a sequence of <l n='utf'/> characters enters the application, it may be
neccessary to collapse subsequences into their composed variant.</p>
@@ -24,33 +19,51 @@ of output (for instance <l n='pdf'/>).</p>
over a string.</p>
--ldx]]--
-local concat, gmatch, gsub, find = table.concat, string.gmatch, string.gsub, string.find
+local gsub, find = string.gsub, string.find
+local concat, sortedhash, keys, sort = table.concat, table.sortedhash, table.keys, table.sort
local utfchar, utfbyte, utfcharacters, utfvalues = utf.char, utf.byte, utf.characters, utf.values
-local allocate = utilities.storage.allocate
-local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+local P, Cs, Cmt, Ct = lpeg.P, lpeg.Cs, lpeg.Cmt, lpeg.Ct
+
+if not characters then require("char-def") end
+if not characters.blocks then require("char-ini") end
+
+local lpegmatch = lpeg.match
+local lpegpatterns = lpeg.patterns
+local p_utf8character = lpegpatterns.utf8character
+local p_utf8byte = lpegpatterns.utf8byte
+local utfchartabletopattern = lpeg.utfchartabletopattern
+
+local formatters = string.formatters
+
+local allocate = utilities.storage.allocate or function() return { } end
+
+local charfromnumber = characters.fromnumber
-local charfromnumber = characters.fromnumber
+characters = characters or { }
+local characters = characters
-characters = characters or { }
-local characters = characters
+local graphemes = allocate()
+characters.graphemes = graphemes
-characters.graphemes = allocate()
-local graphemes = characters.graphemes
+local collapsed = allocate()
+characters.collapsed = collapsed
-characters.combined = allocate()
-local combined = characters.combined
+local combined = allocate()
+characters.combined = combined
-characters.decomposed = allocate()
-local decomposed = characters.decomposed
+local decomposed = allocate()
+characters.decomposed = decomposed
-characters.mathpairs = allocate()
-local mathpairs = characters.mathpairs
+local mathpairs = allocate()
+characters.mathpairs = mathpairs
-characters.filters = allocate()
-local filters = characters.filters
+local filters = allocate()
+characters.filters = filters
-filters.utf = filters.utf or { }
-local utffilters = characters.filters.utf
+local utffilters = { }
+characters.filters.utf = utffilters
+
+local data = characters.data
-- is characters.combined cached?
@@ -59,7 +72,9 @@ local utffilters = characters.filters.utf
to depend on collapsing.</p>
--ldx]]--
--- for the moment, will be entries in char-def.lua
+-- for the moment, will be entries in char-def.lua .. this is just a subset that for
+-- typographic (font) reasons we want to have split ... if we decompose all, we get
+-- problems with fonts
local decomposed = allocate {
["IJ"] = "IJ",
@@ -81,24 +96,97 @@ local decomposed = allocate {
characters.decomposed = decomposed
-local function initialize() -- maybe only 'mn'
+-- local function initialize() -- maybe only 'mn'
+-- local data = characters.data
+-- for unicode, v in next, data do
+-- -- using vs and first testing for length is faster (.02->.01 s)
+-- local vs = v.specials
+-- if vs and #vs == 3 then
+-- local vc = vs[1]
+-- if vc == "char" then
+-- local one, two = vs[2], vs[3]
+-- if data[two].category == "mn" then
+-- local cgf = combined[one]
+-- if not cgf then
+-- cgf = { [two] = unicode }
+-- combined[one] = cgf
+-- else
+-- cgf[two] = unicode
+-- end
+-- end
+-- local first, second, combination = utfchar(one), utfchar(two), utfchar(unicode)
+-- local cgf = graphemes[first]
+-- if not cgf then
+-- cgf = { [second] = combination }
+-- graphemes[first] = cgf
+-- else
+-- cgf[second] = combination
+-- end
+-- if v.mathclass or v.mathspec then
+-- local mps = mathpairs[two]
+-- if not mps then
+-- mps = { [one] = unicode }
+-- mathpairs[two] = mps
+-- else
+-- mps[one] = unicode -- here unicode
+-- end
+-- local mps = mathpairs[second]
+-- if not mps then
+-- mps = { [first] = combination }
+-- mathpairs[second] = mps
+-- else
+-- mps[first] = combination
+-- end
+-- end
+-- -- elseif vc == "compat" then
+-- -- else
+-- -- local description = v.description
+-- -- if find(description,"LIGATURE") then
+-- -- if vs then
+-- -- local t = { }
+-- -- for i=2,#vs do
+-- -- t[#t+1] = utfchar(vs[i])
+-- -- end
+-- -- decomposed[utfchar(unicode)] = concat(t)
+-- -- else
+-- -- local vs = v.shcode
+-- -- if vs then
+-- -- local t = { }
+-- -- for i=1,#vs do
+-- -- t[i] = utfchar(vs[i])
+-- -- end
+-- -- decomposed[utfchar(unicode)] = concat(t)
+-- -- end
+-- -- end
+-- -- end
+-- end
+-- end
+-- end
+-- initialize = false
+-- characters.initialize = function() end -- when used outside tex
+-- end
+
+local function initialize()
local data = characters.data
+ local function backtrack(v,last,target)
+ local vs = v.specials
+ if vs and #vs == 3 and vs[1] == "char" then
+ local one, two = vs[2], vs[3]
+ local first, second = utfchar(one), utfchar(two) .. last
+ collapsed[first..second] = target
+ backtrack(data[one],second,target)
+ end
+ end
for unicode, v in next, data do
- -- using vs and first testing for length is faster (.02->.01 s)
local vs = v.specials
- local vc = vs and #vs == 3 and vs[1]
- if vc == "char" then
+ if vs and #vs == 3 and vs[1] == "char" then
+ --
local one, two = vs[2], vs[3]
- if data[two].category == "mn" then
- local cgf = combined[one]
- if not cgf then
- cgf = { [two] = unicode }
- combined[one] = cgf
- else
- cgf[two] = unicode
- end
- end
local first, second, combination = utfchar(one), utfchar(two), utfchar(unicode)
+ --
+ collapsed[first..second] = combination
+ backtrack(data[one],second,combination)
+ -- sort of obsolete:
local cgf = graphemes[first]
if not cgf then
cgf = { [second] = combination }
@@ -106,6 +194,7 @@ local function initialize() -- maybe only 'mn'
else
cgf[second] = combination
end
+ --
if v.mathclass or v.mathspec then
local mps = mathpairs[two]
if not mps then
@@ -122,239 +211,165 @@ local function initialize() -- maybe only 'mn'
mps[first] = combination
end
end
- -- elseif vc == "compat" then
- -- else
- -- local description = v.description
- -- if find(description,"LIGATURE") then
- -- if vs then
- -- local t = { }
- -- for i=2,#vs do
- -- t[#t+1] = utfchar(vs[i])
- -- end
- -- decomposed[utfchar(unicode)] = concat(t)
- -- else
- -- local vs = v.shcode
- -- if vs then
- -- local t = { }
- -- for i=1,#vs do
- -- t[i] = utfchar(vs[i])
- -- end
- -- decomposed[utfchar(unicode)] = concat(t)
- -- end
- -- end
- -- end
end
end
initialize = false
- characters.initialize = function() end -- when used outside tex
+ characters.initialize = function() end
end
characters.initialize = initialize
--- utffilters.addgrapheme(utfchar(318),'l','\string~')
--- utffilters.addgrapheme('c','a','b')
-
-function utffilters.addgrapheme(result,first,second) -- can be U+ 0x string or utf or number
- local result = charfromnumber(result)
- local first = charfromnumber(first)
- local second = charfromnumber(second)
- if not graphemes[first] then
- graphemes[first] = { [second] = result }
- else
- graphemes[first][second] = result
- end
-end
-
--[[ldx--
-<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 <l n='luatex'/> engine itself.</p>
-
-<p>This leaves us problems with characters that are specific to <l n='tex'/> like
-<type>{}</type>, <type>$</type> and alike. We can remap some chars that tex input files
-are sensitive for to a private area (while writing to a utility file) and revert then
-to their original slot when we read in such a file. Instead of reverting, we can (when
-we resolve characters to glyphs) map them to their right glyph there. For this purpose
-we can use the private planes 0x0F0000 and 0x100000.</p>
+<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 graphemes and
+not collecting tokens is not only faster but also saves garbage collecting.
+</p>
--ldx]]--
-local low = allocate()
-local high = allocate()
-local escapes = allocate()
-local special = "~#$%^&_{}\\|" -- "~#$%{}\\|"
-
-local private = {
- low = low,
- high = high,
- escapes = escapes,
-}
-
-utffilters.private = private
-
-local tohigh = lpeg.replacer(low) -- frozen, only for basic tex
-local tolow = lpeg.replacer(high) -- frozen, only for basic tex
-
-lpegpatterns.utftohigh = tohigh
-lpegpatterns.utftolow = tolow
-
-function utffilters.harden(str)
- return lpegmatch(tohigh,str)
-end
-
-function utffilters.soften(str)
- return lpegmatch(tolow,str)
-end
+local skippable = { }
+local filesuffix = file.suffix
-local function set(ch)
- local cb
- if type(ch) == "number" then
- cb, ch = ch, utfchar(ch)
- else
- cb = utfbyte(ch)
+function utffilters.setskippable(suffix,value)
+ if value == nil then
+ value = true
end
- if cb < 256 then
- escapes[ch] = "\\" .. ch
- low[ch] = utfchar(0x0F0000 + cb)
- if ch == "%" then
- ch = "%%" -- nasty, but we need this as in replacements (also in lpeg) % is interpreted
+ if type(suffix) == "table" then
+ for i=1,#suffix do
+ skippable[suffix[i]] = value
end
- high[utfchar(0x0F0000 + cb)] = ch
+ else
+ skippable[suffix] = value
end
end
-private.set = set
-
--- function private.escape (str) return gsub(str,"(.)", escapes) end
--- function private.replace(str) return utfgsub(str,"(.)", low ) end
--- function private.revert (str) return utfgsub(str,"(.)", high ) end
-
-private.escape = utf.remapper(escapes)
-private.replace = utf.remapper(low)
-private.revert = utf.remapper(high)
-
-for ch in gmatch(special,".") do set(ch) end
-
---[[ldx--
-<p>We get a more efficient variant of this when we integrate
-replacements in collapser. This more or less renders the previous
-private code redundant. The following code is equivalent but the
-first snippet uses the relocated dollars.</p>
+-- function utffilters.collapse(str,filename) -- we can make high a seperate pass (never needed with collapse)
+-- if skippable[filesuffix(filename)] then
+-- return str
+-- -- elseif find(filename,"^virtual://") then
+-- -- return str
+-- -- else
+-- -- -- print("\n"..filename)
+-- end
+-- if str and str ~= "" then
+-- local nstr = #str
+-- if nstr > 1 then
+-- if initialize then -- saves a call
+-- initialize()
+-- end
+-- local tokens, t, first, done, n = { }, 0, false, false, 0
+-- for second in utfcharacters(str) do
+-- if done then
+-- if first then
+-- if second == " " then
+-- t = t + 1
+-- tokens[t] = first
+-- first = second
+-- else
+-- -- local crs = high[second]
+-- -- if crs then
+-- -- t = t + 1
+-- -- tokens[t] = first
+-- -- first = crs
+-- -- else
+-- local cgf = graphemes[first]
+-- if cgf and cgf[second] then
+-- first = cgf[second]
+-- else
+-- t = t + 1
+-- tokens[t] = first
+-- first = second
+-- end
+-- -- end
+-- end
+-- elseif second == " " then
+-- first = second
+-- else
+-- -- local crs = high[second]
+-- -- if crs then
+-- -- first = crs
+-- -- else
+-- first = second
+-- -- end
+-- end
+-- elseif second == " " then
+-- first = nil
+-- n = n + 1
+-- else
+-- -- local crs = high[second]
+-- -- if crs then
+-- -- for s in utfcharacters(str) do
+-- -- if n == 1 then
+-- -- break
+-- -- else
+-- -- t = t + 1
+-- -- tokens[t] = s
+-- -- n = n - 1
+-- -- end
+-- -- end
+-- -- if first then
+-- -- t = t + 1
+-- -- tokens[t] = first
+-- -- end
+-- -- first = crs
+-- -- done = true
+-- -- else
+-- local cgf = graphemes[first]
+-- if cgf and cgf[second] then
+-- for s in utfcharacters(str) do
+-- if n == 1 then
+-- break
+-- else
+-- t = t + 1
+-- tokens[t] = s
+-- n = n - 1
+-- end
+-- end
+-- first = cgf[second]
+-- done = true
+-- else
+-- first = second
+-- n = n + 1
+-- end
+-- -- end
+-- end
+-- end
+-- if done then
+-- if first then
+-- t = t + 1
+-- tokens[t] = first
+-- end
+-- return concat(tokens) -- seldom called
+-- end
+-- elseif nstr > 0 then
+-- return high[str] or str -- this will go from here
+-- end
+-- end
+-- return str
+-- end
-<typing>
-[󰀤x󰀤] [$x$]
-</typing>
+-- this is about twice as fast
-<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 graphemes and
-not collecting tokens is not only faster but also saves garbage collecting.
-</p>
---ldx]]--
+local p_collapse = nil -- so we can reset if needed
-local skippable = table.tohash { "mkiv", "mkvi" }
-local filesuffix = file.suffix
+local function prepare()
+ if initialize then
+ initialize()
+ end
+ local tree = utfchartabletopattern(collapsed)
+ p_collapse = Cs((tree/collapsed + p_utf8character)^0 * P(-1)) -- the P(1) is needed in order to accept non utf
+end
-function utffilters.collapse(str,filename) -- we can make high a seperate pass (never needed with collapse)
- if skippable[filesuffix(filename)] then
- return str
- -- elseif find(filename,"^virtual://") then
- -- return str
- -- else
- -- -- print("\n"..filename)
+function utffilters.collapse(str,filename)
+ if not p_collapse then
+ prepare()
end
- if str and str ~= "" then
- local nstr = #str
- if nstr > 1 then
- if initialize then -- saves a call
- initialize()
- end
- local tokens, t, first, done, n = { }, 0, false, false, 0
- for second in utfcharacters(str) do
- if done then
- if first then
- if second == " " then
- t = t + 1
- tokens[t] = first
- first = second
- else
- -- local crs = high[second]
- -- if crs then
- -- t = t + 1
- -- tokens[t] = first
- -- first = crs
- -- else
- local cgf = graphemes[first]
- if cgf and cgf[second] then
- first = cgf[second]
- else
- t = t + 1
- tokens[t] = first
- first = second
- end
- -- end
- end
- elseif second == " " then
- first = second
- else
- -- local crs = high[second]
- -- if crs then
- -- first = crs
- -- else
- first = second
- -- end
- end
- elseif second == " " then
- first = nil
- n = n + 1
- else
- -- local crs = high[second]
- -- if crs then
- -- for s in utfcharacters(str) do
- -- if n == 1 then
- -- break
- -- else
- -- t = t + 1
- -- tokens[t] = s
- -- n = n - 1
- -- end
- -- end
- -- if first then
- -- t = t + 1
- -- tokens[t] = first
- -- end
- -- first = crs
- -- done = true
- -- else
- local cgf = graphemes[first]
- if cgf and cgf[second] then
- for s in utfcharacters(str) do
- if n == 1 then
- break
- else
- t = t + 1
- tokens[t] = s
- n = n - 1
- end
- end
- first = cgf[second]
- done = true
- else
- first = second
- n = n + 1
- end
- -- end
- end
- end
- if done then
- if first then
- t = t + 1
- tokens[t] = first
- end
- return concat(tokens) -- seldom called
- end
- elseif nstr > 0 then
- return high[str] or str
- end
+ if not str or #str == "" or #str == 1 then
+ return str
+ elseif filename and skippable[filesuffix(filename)] then -- we could hash the collapsables or do a quicker test
+ return str
+ else
+ return lpegmatch(p_collapse,str) or str
end
- return str
end
-- function utffilters.decompose(str)
@@ -399,40 +414,231 @@ end
-- return str
-- end
-local tree = lpeg.utfchartabletopattern(table.keys(decomposed))
-local finder = lpeg.finder(tree,false,true)
-local replacer = lpeg.replacer(tree,decomposed,false,true)
+-- local replacer = nil
+-- local finder = nil
+--
+-- function utffilters.decompose(str) -- 3 to 4 times faster than the above
+-- if not replacer then
+-- if initialize then
+-- initialize()
+-- end
+-- local tree = utfchartabletopattern(decomposed)
+-- finder = lpeg.finder(tree,false,true)
+-- replacer = lpeg.replacer(tree,decomposed,false,true)
+-- end
+-- if str and str ~= "" and #str > 1 and lpegmatch(finder,str) then
+-- return lpegmatch(replacer,str)
+-- end
+-- return str
+-- end
+
+local p_decompose = nil
+
+local function prepare()
+ if initialize then
+ initialize()
+ end
+ local tree = utfchartabletopattern(decomposed)
+ p_decompose = Cs((tree/decomposed + p_utf8character)^0 * P(-1))
+end
-function utffilters.decompose(str) -- 3 to 4 times faster than the above
- if str and str ~= "" and #str > 1 and lpegmatch(finder,str) then
- return lpegmatch(replacer,str)
+function utffilters.decompose(str,filename) -- 3 to 4 times faster than the above
+ if not p_decompose then
+ prepare()
+ end
+ if str and str ~= "" and #str > 1 then
+ return lpegmatch(p_decompose,str)
+ end
+ if not str or #str == "" or #str < 2 then
+ return str
+ elseif filename and skippable[filesuffix(filename)] then
+ return str
+ else
+ return lpegmatch(p_decompose,str) or str
end
return str
end
-local sequencers = utilities.sequencers
+-- utffilters.addgrapheme(utfchar(318),'l','\string~')
+-- utffilters.addgrapheme('c','a','b')
+
+function utffilters.addgrapheme(result,first,second) -- can be U+ 0x string or utf or number
+ local result = charfromnumber(result)
+ local first = charfromnumber(first)
+ local second = charfromnumber(second)
+ if not graphemes[first] then
+ graphemes[first] = { [second] = result }
+ else
+ graphemes[first][second] = result
+ end
+ local pair = first .. second
+ if not composed[pair] then
+ composed[pair] = result
+ p_composed = nil
+ end
+end
+
+interfaces.implement {
+ name = "addgrapheme",
+ actions = utffilters.addgrapheme,
+ arguments = { "string", "string", "string" }
+}
+
+-- --
+
+local p_reorder = nil
+
+-- local sorter = function(a,b) return b[2] < a[2] end
+--
+-- local function swapper(s,p,t)
+-- local old = { }
+-- for i=1,#t do
+-- old[i] = t[i][1]
+-- end
+-- old = concat(old)
+-- sort(t,sorter)
+-- for i=1,#t do
+-- t[i] = t[i][1]
+-- end
+-- local new = concat(t)
+-- if old ~= new then
+-- print("reordered",old,"->",new)
+-- end
+-- return p, new
+-- end
+
+-- -- the next one isnto stable for similar weights
+
+local sorter = function(a,b)
+ return b[2] < a[2]
+end
+
+local function swapper(s,p,t)
+ sort(t,sorter)
+ for i=1,#t do
+ t[i] = t[i][1]
+ end
+ return p, concat(t)
+end
-if sequencers then
+-- -- the next one keeps similar weights in the original order
+--
+-- local sorter = function(a,b)
+-- local b2, a2 = b[2], a[2]
+-- if a2 == b2 then
+-- return b[3] > a[3]
+-- else
+-- return b2 < a2
+-- end
+-- end
+--
+-- local function swapper(s,p,t)
+-- for i=1,#t do
+-- t[i][3] = i
+-- end
+-- sort(t,sorter)
+-- for i=1,#t do
+-- t[i] = t[i][1]
+-- end
+-- return p, concat(t)
+-- end
- local textfileactions = resolvers.openers.helpers.textfileactions
+-- at some point exceptions will become an option, for now it's an experiment
+-- to overcome bugs (that have become features) in unicode .. or we might decide
+-- for an extra ordering key in char-def that takes precedence over combining
- sequencers.appendaction (textfileactions,"system","characters.filters.utf.collapse")
- sequencers.disableaction(textfileactions,"characters.filters.utf.collapse")
+local exceptions = {
+ -- frozen unicode bug
+ ["َّ"] = "َّ", -- U+64E .. U+651 => U+651 .. U+64E
+}
- sequencers.appendaction (textfileactions,"system","characters.filters.utf.decompose")
- sequencers.disableaction(textfileactions,"characters.filters.utf.decompose")
+local function prepare()
+ local hash = { }
+ for k, v in sortedhash(characters.data) do
+ local combining = v.combining -- v.ordering or v.combining
+ if combining then
+ hash[utfchar(k)] = { utfchar(k), combining, 0 } -- slot 3 can be used in sort
+ end
+ end
+ local e = utfchartabletopattern(exceptions)
+ local p = utfchartabletopattern(hash)
+ p_reorder = Cs((e/exceptions + Cmt(Ct((p/hash)^2),swapper) + p_utf8character)^0) * P(-1)
+end
- function characters.filters.utf.enable()
- sequencers.enableaction(textfileactions,"characters.filters.utf.collapse")
- sequencers.enableaction(textfileactions,"characters.filters.utf.decompose")
+function utffilters.reorder(str,filename)
+ if not p_reorder then
+ prepare()
+ end
+ if not str or #str == "" or #str < 2 then
+ return str
+ elseif filename and skippable[filesuffix(filename)] then
+ return str
+ else
+ return lpegmatch(p_reorder,str) or str
end
+ return str
+end
- directives.register("filters.utf.collapse", function(v)
- sequencers[v and "enableaction" or "disableaction"](textfileactions,"characters.filters.utf.collapse")
- end)
+-- local collapse = utffilters.collapse
+-- local decompose = utffilters.decompose
+-- local preprocess = utffilters.preprocess
+--
+-- local c1, c2, c3 = "a", "̂", "̃"
+-- local r2, r3 = "â", "ẫ"
+-- local l1 = "ffl"
+--
+-- local str = c1..c2..c3 .. " " .. c1..c2 .. " " .. l1
+-- local res = r3 .. " " .. r2 .. " " .. "ffl"
+--
+-- local text = io.loaddata("t:/sources/tufte.tex")
+--
+-- local function test(n)
+-- local data = text .. string.rep(str,100) .. text
+-- local okay = text .. string.rep(res,100) .. text
+-- local t = os.clock()
+-- for i=1,10000 do
+-- collapse(data)
+-- decompose(data)
+-- -- preprocess(data)
+-- end
+-- print(os.clock()-t,decompose(collapse(data))==okay,decompose(collapse(str)))
+-- end
+--
+-- test(050)
+-- test(150)
+--
+-- local old = "foo" .. string.char(0xE1) .. "bar"
+-- local new = collapse(old)
+-- print(old,new)
+
+-- local one_old = "فَأَصَّدَّقَ دَّ" local one_new = utffilters.reorder(one_old)
+-- local two_old = "فَأَصَّدَّقَ دَّ" local two_new = utffilters.reorder(two_old)
+--
+-- print(one_old,two_old,one_old==two_old,false)
+-- print(one_new,two_new,one_new==two_new,true)
+--
+-- local test = "foo" .. utf.reverse("ؚ" .. "ً" .. "ٌ" .. "ٍ" .. "َ" .. "ُ" .. "ِ" .. "ّ" .. "ْ" ) .. "bar"
+-- local done = utffilters.reorder(test)
+--
+-- print(test,done,test==done,false)
+
+local f_default = formatters["[%U] "]
+local f_description = formatters["[%s] "]
+
+local function convert(n)
+ local d = data[n]
+ d = d and d.description
+ if d then
+ return f_description(d)
+ else
+ return f_default(n)
+ end
+end
- directives.register("filters.utf.decompose", function(v)
- sequencers[v and "enableaction" or "disableaction"](textfileactions,"characters.filters.utf.decompose")
- end)
+local pattern = Cs((p_utf8byte / convert)^1)
+function utffilters.verbose(data)
+ return data and lpegmatch(pattern,data) or ""
end
+
+return characters
diff --git a/Master/texmf-dist/tex/context/base/char-utf.mkiv b/Master/texmf-dist/tex/context/base/char-utf.mkiv
index 280e7ef6daf..fe9f402ef23 100644
--- a/Master/texmf-dist/tex/context/base/char-utf.mkiv
+++ b/Master/texmf-dist/tex/context/base/char-utf.mkiv
@@ -22,24 +22,17 @@
\unprotect
+\registerctxluafile{char-def}{1.001}
+\registerctxluafile{char-ini}{1.001}
\registerctxluafile{char-utf}{1.001}
+\registerctxluafile{char-cjk}{1.001}
%D We enable collapsing (combining characters) by default, but
%D since the source files are rather simple, we postpone the
%D initialization till runtime.
-% resolvers.filters.install('utf',characters.filters.utf.collapse)
-
-% \appendtoks
-% \ctxlua{
-% local textfileactions = resolvers.openers.helpers.textfileactions
-% utilities.sequencers.enableaction(textfileactions,"characters.filters.utf.collapse")
-% utilities.sequencers.enableaction(textfileactions,"characters.filters.utf.decompose")
-% }%
-% \to \everyjob
-
\appendtoks
- \ctxlua{characters.filters.utf.enable()}%
+ \clf_enableutf % not needed when we create a format so we do it now
\to \everyjob
%D The next one influences input parsing.
@@ -49,6 +42,6 @@
%D \stoptyping
\unexpanded\def\definecomposedutf#1 #2 #3 %
- {\ctxlua{characters.filters.utf.addgrapheme("#1","#2","#3")}}
+ {\clf_addgrapheme{#1}{#2}{#3}}
\protect
diff --git a/Master/texmf-dist/tex/context/base/chem-ini.lua b/Master/texmf-dist/tex/context/base/chem-ini.lua
index 10db1a1e44e..f7d10ffa272 100644
--- a/Master/texmf-dist/tex/context/base/chem-ini.lua
+++ b/Master/texmf-dist/tex/context/base/chem-ini.lua
@@ -32,12 +32,31 @@ function chemistry.molecule(str)
return lpegmatch(moleculeparser,str)
end
-function commands.molecule(str)
- if trace_molecules then
- local rep = lpegmatch(moleculeparser,str)
- report_chemistry("molecule %a becomes %a",str,rep)
- context(rep)
- else
- context(lpegmatch(moleculeparser,str))
- end
-end
+interfaces.implement {
+ name = "molecule",
+ arguments = "string",
+ actions = function(str)
+ if trace_molecules then
+ local rep = lpegmatch(moleculeparser,str)
+ report_chemistry("molecule %a becomes %a",str,rep)
+ context(rep)
+ else
+ context(lpegmatch(moleculeparser,str))
+ end
+ end,
+}
+
+-- interfaces.implement {
+-- name = "molecule",
+-- scope = "private",
+-- action = function()
+-- local str = scanstring()
+-- if trace_molecules then
+-- local rep = lpegmatch(moleculeparser,str)
+-- report_chemistry("molecule %a becomes %a",str,rep)
+-- context(rep)
+-- else
+-- context(lpegmatch(moleculeparser,str))
+-- end
+-- end,
+-- }
diff --git a/Master/texmf-dist/tex/context/base/chem-ini.mkiv b/Master/texmf-dist/tex/context/base/chem-ini.mkiv
index 357bceefa66..9a44b4f1aee 100644
--- a/Master/texmf-dist/tex/context/base/chem-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/chem-ini.mkiv
@@ -37,7 +37,7 @@
%D \typebuffer \getbuffer
\unexpanded\def\molecule#1%
- {\ctxcommand{molecule(\!!bs#1\!!es)}}
+ {\clf_molecule{#1}}
%D For old times sake:
diff --git a/Master/texmf-dist/tex/context/base/chem-str.lua b/Master/texmf-dist/tex/context/base/chem-str.lua
index cd7a2db0690..d724394bb1d 100644
--- a/Master/texmf-dist/tex/context/base/chem-str.lua
+++ b/Master/texmf-dist/tex/context/base/chem-str.lua
@@ -44,6 +44,8 @@ local P, R, S, C, Cs, Ct, Cc, Cmt = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpe
local variables = interfaces and interfaces.variables
local commands = commands
local context = context
+local implement = interfaces.implement
+
local formatters = string.formatters
local texgetcount = tex.getcount
@@ -60,11 +62,14 @@ local mpnamedcolor = attributes.colors.mpnamedcolor
local topoints = number.topoints
local todimen = string.todimen
+local trialtypesetting = context.trialtypesetting
+
chemistry = chemistry or { }
local chemistry = chemistry
chemistry.instance = "chemistry"
chemistry.format = "metafun"
+chemistry.method = "double"
chemistry.structures = 0
local common_keys = {
@@ -422,7 +427,11 @@ local function process(level,spec,text,n,rulethickness,rulecolor,offset,default_
insert(sstack,variant)
m = m + 1 ; metacode[m] = syntax.save.direct
elseif operation == "restore" then
- variant = remove(sstack)
+ if #sstack > 0 then
+ variant = remove(sstack)
+ else
+ report_chemistry("restore without save")
+ end
local ss = syntax[variant]
keys, max = ss.keys, ss.max
m = m + 1 ; metacode[m] = syntax.restore.direct
@@ -721,7 +730,7 @@ function chemistry.start(settings)
width, left, right, sp_width = calculated(width, left, right,bondlength,unit,scale)
height, bottom, top, sp_height = calculated(height,bottom,top, bondlength,unit,scale)
--
- if width ~= "true" and height ~= "true" and texgetcount("@@trialtypesetting") ~= 0 then
+ if width ~= "true" and height ~= "true" and trialtypesetting() then
if trace_structure then
report_chemistry("skipping trial run")
end
@@ -762,6 +771,7 @@ function chemistry.stop()
metapost.graphic {
instance = chemistry.instance,
format = chemistry.format,
+ method = chemistry.method,
data = mpcode,
definitions = f_initialize,
}
@@ -770,14 +780,12 @@ function chemistry.stop()
end
end
-function chemistry.component(spec,text,settings)
+function chemistry.component(spec,text,rulethickness,rulecolor)
if metacode then
- rulethickness, rulecolor, offset = settings.rulethickness, settings.rulecolor
local spec = settings_to_array_with_repeat(spec,true) -- no lower?
local text = settings_to_array_with_repeat(text,true)
- -- inspect(spec)
metacode[#metacode+1] = f_start_component
- process(1,spec,text,1,rulethickness,rulecolor) -- offset?
+ process(1,spec,text,1,rulethickness,rulecolor)
metacode[#metacode+1] = f_stop_component
end
end
@@ -790,11 +798,52 @@ end)
-- interfaces
-commands.undefinechemical = chemistry.undefine
-commands.definechemical = chemistry.define
-commands.startchemical = chemistry.start
-commands.stopchemical = chemistry.stop
-commands.chemicalcomponent = chemistry.component
+implement {
+ name = "undefinechemical",
+ actions = chemistry.undefine,
+ arguments = "string"
+}
+
+implement {
+ name = "definechemical",
+ actions = chemistry.define,
+ arguments = { "string", "string", "string" }
+}
+
+implement {
+ name = "startchemical",
+ actions = chemistry.start,
+ arguments = {
+ {
+ { "width" },
+ { "height" },
+ { "left" },
+ { "right" },
+ { "top" },
+ { "bottom" },
+ { "scale" },
+ { "rotation" },
+ { "symalign" },
+ { "axis" },
+ { "framecolor" },
+ { "rulethickness" },
+ { "offset" },
+ { "unit" },
+ { "factor" }
+ }
+ }
+}
+
+implement {
+ name = "stopchemical",
+ actions = chemistry.stop,
+}
+
+implement {
+ name = "chemicalcomponent",
+ actions = chemistry.component,
+ arguments = { "string", "string", "string", "string" }
+}
-- todo: top / bottom
-- maybe add "=" for double and "≡" for triple?
@@ -811,7 +860,9 @@ local inline = {
["space"] = "\\chemicalspace",
}
-function commands.inlinechemical(spec)
+local ctx_chemicalinline = context.chemicalinline
+
+function chemistry.inlinechemical(spec)
local spec = settings_to_array_with_repeat(spec,true)
for i=1,#spec do
local s = spec[i]
@@ -819,7 +870,13 @@ function commands.inlinechemical(spec)
if inl then
context(inl) -- could be a fast context.sprint
else
- context.chemicalinline(molecule(s))
+ ctx_chemicalinline(molecule(s))
end
end
end
+
+implement {
+ name = "inlinechemical",
+ actions = chemistry.inlinechemical,
+ arguments = "string"
+}
diff --git a/Master/texmf-dist/tex/context/base/chem-str.mkiv b/Master/texmf-dist/tex/context/base/chem-str.mkiv
index 6aec16f9e09..f18b422f266 100644
--- a/Master/texmf-dist/tex/context/base/chem-str.mkiv
+++ b/Master/texmf-dist/tex/context/base/chem-str.mkiv
@@ -62,12 +62,12 @@
%D a historical and practical reason (like shared keys with different meaning
%D that could clash, e.g.\ align).
-\defineMPinstance
+\defineMPinstance % not really needed as we set in lua
[chemistry]
[\s!format=metafun,
%\s!extensions=\v!yes, % Should we add extensions and initializations?
%\s!initializations=\v!yes, % Would this give EmWidth, etc.?
- ]
+ \c!method=\s!double]
\startMPdefinitions{chemistry}
input mp-chem.mpiv ;
@@ -88,7 +88,7 @@
{\startnointerference
\edef\currentdefinedchemical{#1}%
\let\chemical\chem_chemical_nested
- \ctxcommand{undefinechemical("#1")}%
+ \clf_undefinechemical{#1}%
#2% flush
\stopnointerference}
@@ -96,7 +96,7 @@
{\dodoubleempty\chem_chemical_nested_indeed}
\def\chem_chemical_nested_indeed[#1][#2]%
- {\ctxcommand{definechemical("\currentdefinedchemical",\!!bs#1\!!es,\!!bs\detokenize{#2}\!!es)}}
+ {\clf_definechemical{\currentdefinedchemical}{#1}{\detokenize{#2}}}
% chemical symbols
@@ -149,39 +149,39 @@
\settrue\indisplaychemical
\forgetall
\ifsecondargument
- \doifassignmentelse{#1}
+ \doifelseassignment{#1}
{\setupcurrentchemical[#1]}% same as \currentchemical
{\edef\currentchemical{#1}%
\setupcurrentchemical[#2]}%
\else\iffirstargument
- \doifassignmentelse{#1}
+ \doifelseassignment{#1}
{\setupcurrentchemical[#1]}% same as \currentchemical
{\edef\currentchemical{#1}}%
\fi\fi
\the\everystructurechemical
\setbox\b_chem_result\hbox\bgroup
- \ctxcommand{startchemical {
- width = "\chemicalparameter\c!width",
- height = "\chemicalparameter\c!height",
- left = "\chemicalparameter\c!left",
- right = "\chemicalparameter\c!right",
- top = "\chemicalparameter\c!top",
- bottom = "\chemicalparameter\c!bottom",
- scale = "\chemicalparameter\c!scale",
- rotation = "\chemicalparameter\c!rotation",
- symalign = "\chemicalparameter\c!symalign",
- axis = "\chemicalparameter\c!axis",
- framecolor = "\MPcolor{\chemicalparameter\c!framecolor}",
- rulethickness = \number\dimexpr\chemicalparameter\c!rulethickness\relax,
- offset = \number\dimexpr\chemicalparameter\c!offset\relax,
- unit = \number\dimexpr\chemicalparameter\c!unit\relax,
- factor = \number\chemicalparameter\c!factor,
- } }%
+ \clf_startchemical
+ width {\chemicalparameter\c!width}%
+ height {\chemicalparameter\c!height}%
+ left {\chemicalparameter\c!left}%
+ right {\chemicalparameter\c!right}%
+ top {\chemicalparameter\c!top}%
+ bottom {\chemicalparameter\c!bottom}%
+ scale {\chemicalparameter\c!scale}%
+ rotation {\chemicalparameter\c!rotation}%
+ symalign {\chemicalparameter\c!symalign}%
+ axis {\chemicalparameter\c!axis}%
+ framecolor {\MPcolor{\chemicalparameter\c!framecolor}}%
+ rulethickness {\number\dimexpr\chemicalparameter\c!rulethickness}%
+ offset {\number\dimexpr\chemicalparameter\c!offset}%
+ unit {\number\dimexpr\chemicalparameter\c!unit}%
+ factor {\number\chemicalparameter\c!factor}%
+ \relax
\startnointerference}
\unexpanded\def\stopchemical
{\stopnointerference
- \ctxcommand{stopchemical()}%
+ \clf_stopchemical
\egroup
\d_chem_width \wd\b_chem_result
\d_chem_height\ht\b_chem_result
@@ -222,17 +222,21 @@
\def\strc_chem_indeed_three[#1][#2][#3]%
{\writestatus\m!chemicals{hyperlinked chemicals not yet supported}% todo reference, for the moment ignored
- \ctxcommand{chemicalcomponent(\!!bs#2\!!es, \!!bs\detokenize{#3}\!!es, { % maybe also pass first two args this way
- rulethickness = "\the\dimexpr\chemicalparameter\c!rulethickness\relax", % todo: scaled points
- rulecolor = "\MPcolor{\chemicalparameter\c!rulecolor}" % we can precalculate this for speedup
- } ) }%
+ \clf_chemicalcomponent
+ {#2}%
+ {\detokenize{#3}}%
+ {\the\dimexpr\chemicalparameter\c!rulethickness}% todo: scaled points
+ {\MPcolor{\chemicalparameter\c!rulecolor}}% % we can precalculate this for speedup
+ \relax
\ignorespaces}
\def\strc_chem_indeed_two[#1][#2]%
- {\ctxcommand{chemicalcomponent(\!!bs#1\!!es,\!!bs\detokenize{#2}\!!es, { % maybe also pass first two args this way
- rulethickness = "\the\dimexpr\chemicalparameter\c!rulethickness\relax", % todo: scaled points
- rulecolor = "\MPcolor{\chemicalparameter\c!rulecolor}" % we can precalculate this for speedup
- } ) }%
+ {\clf_chemicalcomponent
+ {#1}%
+ {\detokenize{#2}}%
+ {\the\dimexpr\chemicalparameter\c!rulethickness}% todo: scaled points
+ {\MPcolor{\chemicalparameter\c!rulecolor}}% % we can precalculate this for speedup
+ \relax
\ignorespaces}
\appendtoks
@@ -311,8 +315,8 @@
\def\chem_arrow_construct#1#2#3%
{\enspace
\mathematics{#1%
- {\strut\hbox \s!spread 2\emwidth{\hss\ctxcommand{inlinechemical(\!!bs#3\!!es)}\hss}}% {\strut\hbox \s!spread 2em{\hss#3\hss}}}%
- {\strut\hbox \s!spread 2\emwidth{\hss\ctxcommand{inlinechemical(\!!bs#2\!!es)}\hss}}}% {\strut\hbox \s!spread 2em{\hss#2\hss}}%
+ {\strut\hbox \s!spread 2\emwidth{\hss\clf_inlinechemical{#3}\hss}}% {\strut\hbox \s!spread 2em{\hss#3\hss}}}%
+ {\strut\hbox \s!spread 2\emwidth{\hss\clf_inlinechemical{#2}\hss}}}% {\strut\hbox \s!spread 2em{\hss#2\hss}}%
\enspace}
% special macros (probably needs some more work)
@@ -505,7 +509,7 @@
\begingroup
\scratchcounter\normalmathstyle
\usechemicalstyleandcolor\c!style\c!color
- \hbox{\mathematics{\tf\triggermathstyle\scratchcounter\ctxcommand{inlinechemical(\!!bs#1\!!es)}}}%
+ \hbox{\mathematics{\tf\triggermathstyle\scratchcounter\clf_inlinechemical{#1}}}%
\endgroup}
\unexpanded\def\displaychemical
@@ -531,7 +535,7 @@
\unexpanded\def\inlinechemical#1%
{\dontleavehmode
- \hbox{\usechemicalstyleandcolor\c!style\c!color\ctxcommand{inlinechemical(\!!bs#1\!!es)}}}
+ \hbox{\usechemicalstyleandcolor\c!style\c!color\clf_inlinechemical{#1}}}
\unexpanded\def\chemicalbondrule
{\hbox{\vrule\s!height.75\exheight\s!depth-\dimexpr.75\exheight-\linewidth\relax\s!width\emwidth\relax}}
@@ -720,7 +724,7 @@
\c!rotation=0, % unitless number (interpreted as degrees)
\c!symalign=\v!auto,
\c!location=, % not yet used (was interaction related in mkii)
- \c!offset=.25em,
+ \c!offset=.25\emwidth,
\c!unit=\emwidth,
\c!factor=3,
\c!color=,
diff --git a/Master/texmf-dist/tex/context/base/cldf-bas.lua b/Master/texmf-dist/tex/context/base/cldf-bas.lua
index b982fc364e0..1067a17d57e 100644
--- a/Master/texmf-dist/tex/context/base/cldf-bas.lua
+++ b/Master/texmf-dist/tex/context/base/cldf-bas.lua
@@ -24,10 +24,10 @@ if not modules then modules = { } end modules ['cldf-bas'] = {
-- maybe use context.generics
-local type = type
-local format = string.format
-local utfchar = utf.char
-local concat = table.concat
+local type = type
+local format = string.format
+local utfchar = utf.char
+local concat = table.concat
local context = context
local generics = context.generics
@@ -49,13 +49,23 @@ function context.char(k) -- used as escape too, so don't change to utf
elseif n > 0 then
context([[\char%s\relax]],concat(k,[[\relax\char]]))
end
- elseif k then
- context([[\char%s\relax]],k)
+ else
+ if type(k) == "string" then
+ k = tonumber(k)
+ end
+ if type(k) == "number" then
+ context([[\char%s\relax]],k)
+ end
end
end
function context.utfchar(k)
- context(utfchar(k))
+ if type(k) == "string" then
+ k = tonumber(k)
+ end
+ if type(k) == "number" then
+ context(utfchar(k))
+ end
end
-- plain variants
diff --git a/Master/texmf-dist/tex/context/base/cldf-ini.lua b/Master/texmf-dist/tex/context/base/cldf-ini.lua
index 0a0f71266b7..da284ba5ead 100644
--- a/Master/texmf-dist/tex/context/base/cldf-ini.lua
+++ b/Master/texmf-dist/tex/context/base/cldf-ini.lua
@@ -28,19 +28,27 @@ if not modules then modules = { } end modules ['cldf-ini'] = {
-- the the differences between the lua and luajit hashers can lead to quite a slowdown
-- in some cases.
-local tex = tex
+-- context(lpeg.match(lpeg.patterns.texescape,"${}"))
+-- context(string.formatters["%!tex!"]("${}"))
+-- context("%!tex!","${}")
-context = context or { }
-local context = context
-
-local format, gsub, validstring, stripstring = string.format, string.gsub, string.valid, string.strip
-local next, type, tostring, tonumber, setmetatable, unpack, select = next, type, tostring, tonumber, setmetatable, unpack, select
+local format, validstring, stripstring = string.format, string.valid, string.strip
+local next, type, tostring, tonumber, setmetatable, unpack, select, rawset = next, type, tostring, tonumber, setmetatable, unpack, select, rawset
local insert, remove, concat = table.insert, table.remove, table.concat
local lpegmatch, lpegC, lpegS, lpegP, lpegV, lpegCc, lpegCs, patterns = lpeg.match, lpeg.C, lpeg.S, lpeg.P, lpeg.V, lpeg.Cc, lpeg.Cs, lpeg.patterns
-local formatters = string.formatters -- using formatteds is slower in this case
+local formatters = string.formatters -- using formatters is slower in this case
+
+context = context or { }
+commands = commands or { }
+interfaces = interfaces or { }
+
+local context = context
+local commands = commands
+local interfaces = interfaces
local loaddata = io.loaddata
+local tex = tex
local texsprint = tex.sprint
local texprint = tex.print
local texwrite = tex.write
@@ -83,7 +91,7 @@ local storefunction, flushfunction
local storenode, flushnode
local registerfunction, unregisterfunction, reservefunction, knownfunctions, callfunctiononce
-if luafunctions then
+-- if luafunctions then
local freed, nofused, noffreed = { }, 0, 0 -- maybe use the number of @@trialtypesetting
@@ -144,26 +152,123 @@ if luafunctions then
end
end
- registerfunction = function(f)
- if type(f) == "string" then
- f = loadstring(f)
+ -- registerfunction = function(f)
+ -- if type(f) == "string" then
+ -- f = loadstring(f)
+ -- end
+ -- if type(f) ~= "function" then
+ -- f = function() report_cld("invalid function %A",f) end
+ -- end
+ -- if noffreed > 0 then
+ -- local n = freed[noffreed]
+ -- freed[noffreed] = nil
+ -- noffreed = noffreed - 1
+ -- luafunctions[n] = f
+ -- return n
+ -- else
+ -- nofused = nofused + 1
+ -- luafunctions[nofused] = f
+ -- return nofused
+ -- end
+ -- end
+
+ storage.storedfunctions = storage.storedfunctions or { }
+ local storedfunctions = storage.storedfunctions
+ local initex = environment.initex
+
+ storage.register("storage/storedfunctions", storedfunctions, "storage.storedfunctions")
+
+ local f_resolve = nil
+ local p_resolve = ((1-lpegP("."))^1 / function(s) f_resolve = f_resolve[s] end * lpegP(".")^0)^1
+
+ function resolvestoredfunction(str)
+ f_resolve = global
+ lpegmatch(p_resolve,str)
+ return f_resolve
+ end
+
+ local function expose(slot,f,...) -- so we can register yet undefined functions
+ local func = resolvestoredfunction(f)
+ if not func then
+ func = function() report_cld("beware: unknown function %i called: %s",slot,f) end
end
- if type(f) ~= "function" then
- f = function() report_cld("invalid function %A",f) end
+ luafunctions[slot] = func
+ return func(...)
+ end
+
+ if initex then
+ -- todo: log stored functions
+ else
+ local slots = table.sortedkeys(storedfunctions)
+ local last = #slots
+ if last > 0 then
+ -- we restore the references
+ for i=1,last do
+ local slot = slots[i]
+ local data = storedfunctions[slot]
+ luafunctions[slot] = function(...)
+ return expose(slot,data,...)
+ end
+ end
+ -- we now know how many are defined
+ nofused = slots[last]
+ -- normally there are no holes in the list yet
+ for i=1,nofused do
+ if not luafunctions[i] then
+ noffreed = noffreed + 1
+ freed[noffreed] = i
+ end
+ end
+ -- report_cld("%s registered functions, %s freed slots",last,noffreed)
end
+ end
+
+ registerfunction = function(f,direct) -- either f=code or f=namespace,direct=name
+ local slot, func
if noffreed > 0 then
- local n = freed[noffreed]
+ slot = freed[noffreed]
freed[noffreed] = nil
noffreed = noffreed - 1
- luafunctions[n] = f
- return n
else
nofused = nofused + 1
- luafunctions[nofused] = f
- return nofused
+ slot = nofused
+ end
+ if direct then
+ if initex then
+ func = function(...)
+ expose(slot,f,...)
+ end
+ if initex then
+ storedfunctions[slot] = f
+ end
+ else
+ func = resolvestoredfunction(f)
+ end
+ if type(func) ~= "function" then
+ func = function() report_cld("invalid resolve %A",f) end
+ end
+ elseif type(f) == "string" then
+ func = loadstring(f)
+ if type(func) ~= "function" then
+ func = function() report_cld("invalid code %A",f) end
+ end
+ elseif type(f) == "function" then
+ func = f
+ else
+ func = function() report_cld("invalid function %A",f) end
end
+ luafunctions[slot] = func
+ return slot
end
+ -- do
+ -- commands.test = function(str) report_cld("test function: %s", str) end
+ -- if initex then
+ -- registerfunction("commands.test") -- number 1
+ -- end
+ -- luafunctions[1]("okay")
+ -- end
+
unregisterfunction = function(slot)
if luafunctions[slot] then
noffreed = noffreed + 1
@@ -197,92 +302,121 @@ if luafunctions then
knownfunctions = luafunctions
-else
+ -- The next hack is a convenient way to define scanners at the Lua end and
+ -- get them available at the TeX end. There is some dirty magic needed to
+ -- prevent overload during format loading.
- local luafunctions, noffunctions = { }, 0
- local luanodes, nofnodes = { }, 0
+ -- interfaces.scanners.foo = function() context("[%s]",tokens.scanners.string()) end : \scan_foo
- usedstack = function()
- return noffunctions + nofnodes, 0
- end
+ interfaces.storedscanners = interfaces.storedscanners or { }
+ local storedscanners = interfaces.storedscanners
- flushfunction = function(n)
- local sn = luafunctions[n]
- if not sn then
- report_cld("data with id %a cannot be found on stack",n)
- elseif not sn() and texgetcount("@@trialtypesetting") == 0 then -- @@trialtypesetting is private!
- luafunctions[n] = nil
- end
- end
-
- storefunction = function(ti)
- noffunctions = noffunctions + 1
- luafunctions[noffunctions] = ti
- return noffunctions
- end
- -- freefunction = function(n)
- -- luafunctions[n] = nil
- -- end
+ storage.register("interfaces/storedscanners", storedscanners, "interfaces.storedscanners")
- flushnode = function(n)
- local sn = luanodes[n]
- if not sn then
- report_cld("data with id %a cannot be found on stack",n)
- elseif texgetcount("@@trialtypesetting") == 0 then -- @@trialtypesetting is private!
- writenode(sn)
- luanodes[n] = nil
+ local interfacescanners = table.setmetatablenewindex(function(t,k,v)
+ if storedscanners[k] then
+ -- report_cld("warning: scanner %a is already set",k)
+ -- os.exit()
+ -- \scan_<k> is already in the format
+ -- report_cld("using interface scanner: %s",k)
else
- writenode(copynodelist(sn))
+ -- todo: allocate slot here and pass it
+ storedscanners[k] = true
+ -- report_cld("installing interface scanner: %s",k)
+ context("\\installctxscanner{clf_%s}{interfaces.scanners.%s}",k,k)
end
- end
+ rawset(t,k,v)
+ end)
- storenode = function(ti)
- nofnodes = nofnodes + 1
- luanodes[nofnodes] = ti
- return nofnodes
- end
-
- _cldf_ = flushfunction -- global
- _cldn_ = flushnode -- global
- -- _cldl_ = function(n) return luafunctions[n]() end -- luafunctions(n)
- _cldl_ = luafunctions
-
- registerfunction = function(f)
- if type(f) == "string" then
- f = loadstring(f)
- end
- if type(f) ~= "function" then
- f = function() report_cld("invalid function %A",f) end
- end
- noffunctions = noffunctions + 1
- luafunctions[noffunctions] = f
- return noffunctions
- end
+ interfaces.scanners = interfacescanners
- unregisterfunction = function(slot)
- if luafunctions[slot] then
- luafunctions[slot] = nil
- else
- report_cld("invalid function slot %A",slot)
- end
- end
-
- reservefunction = function()
- noffunctions = noffunctions + 1
- return noffunctions
- end
-
- callfunctiononce = function(slot)
- luafunctions[slot](slot)
- luafunctions[slot] = nil
- end
-
- table.setmetatablecall(luafunctions,function(t,n) return luafunctions[n](n) end)
-
- knownfunctions = luafunctions
-
-end
+-- else -- by now this is obsolete
+--
+-- local luafunctions, noffunctions = { }, 0
+-- local luanodes, nofnodes = { }, 0
+--
+-- usedstack = function()
+-- return noffunctions + nofnodes, 0
+-- end
+--
+-- flushfunction = function(n)
+-- local sn = luafunctions[n]
+-- if not sn then
+-- report_cld("data with id %a cannot be found on stack",n)
+-- elseif not sn() and texgetcount("@@trialtypesetting") == 0 then -- @@trialtypesetting is private!
+-- luafunctions[n] = nil
+-- end
+-- end
+--
+-- storefunction = function(ti)
+-- noffunctions = noffunctions + 1
+-- luafunctions[noffunctions] = ti
+-- return noffunctions
+-- end
+--
+-- -- freefunction = function(n)
+-- -- luafunctions[n] = nil
+-- -- end
+--
+-- flushnode = function(n)
+-- local sn = luanodes[n]
+-- if not sn then
+-- report_cld("data with id %a cannot be found on stack",n)
+-- elseif texgetcount("@@trialtypesetting") == 0 then -- @@trialtypesetting is private!
+-- writenode(sn)
+-- luanodes[n] = nil
+-- else
+-- writenode(copynodelist(sn))
+-- end
+-- end
+--
+-- storenode = function(ti)
+-- nofnodes = nofnodes + 1
+-- luanodes[nofnodes] = ti
+-- return nofnodes
+-- end
+--
+-- _cldf_ = flushfunction -- global
+-- _cldn_ = flushnode -- global
+-- -- _cldl_ = function(n) return luafunctions[n]() end -- luafunctions(n)
+-- _cldl_ = luafunctions
+--
+-- registerfunction = function(f)
+-- if type(f) == "string" then
+-- f = loadstring(f)
+-- end
+-- if type(f) ~= "function" then
+-- f = function() report_cld("invalid function %A",f) end
+-- end
+-- noffunctions = noffunctions + 1
+-- luafunctions[noffunctions] = f
+-- return noffunctions
+-- end
+--
+-- unregisterfunction = function(slot)
+-- if luafunctions[slot] then
+-- luafunctions[slot] = nil
+-- else
+-- report_cld("invalid function slot %A",slot)
+-- end
+-- end
+--
+-- reservefunction = function()
+-- noffunctions = noffunctions + 1
+-- return noffunctions
+-- end
+--
+-- callfunctiononce = function(slot)
+-- luafunctions[slot](slot)
+-- luafunctions[slot] = nil
+-- end
+--
+-- table.setmetatablecall(luafunctions,function(t,n) return luafunctions[n](n) end)
+--
+-- knownfunctions = luafunctions
+--
+-- end
context.registerfunction = registerfunction
context.unregisterfunction = unregisterfunction
@@ -291,8 +425,31 @@ context.knownfunctions = knownfunctions
context.callfunctiononce = callfunctiononce _cldo_ = callfunctiononce
context.storenode = storenode -- private helper
-function commands.ctxfunction(code)
- context(registerfunction(code))
+function commands.ctxfunction(code,namespace)
+ context(registerfunction(code,namespace))
+end
+
+function commands.ctxscanner(name,code,namespace)
+ local n = registerfunction(code,namespace)
+ if storedscanners[name] then
+ storedscanners[name] = n
+ end
+ context(n)
+end
+
+local function dummy() end
+
+function commands.ctxresetter(name)
+ return function()
+ if storedscanners[name] then
+ rawset(interfacescanners,name,dummy)
+ context.resetctxscanner("clf_" .. name)
+ end
+ end
+end
+
+function context.trialtypesetting()
+ return texgetcount("@@trialtypesetting") ~= 0
end
-- local f_cldo = formatters["_cldo_(%i)"]
diff --git a/Master/texmf-dist/tex/context/base/cldf-prs.lua b/Master/texmf-dist/tex/context/base/cldf-prs.lua
index 1554b5e57f9..3c3836a3ee8 100644
--- a/Master/texmf-dist/tex/context/base/cldf-prs.lua
+++ b/Master/texmf-dist/tex/context/base/cldf-prs.lua
@@ -12,58 +12,54 @@ local lpegmatch, patterns = lpeg.match, lpeg.patterns
local P, R, V, Cc, Cs = lpeg.P, lpeg.R, lpeg.V, lpeg.Cc, lpeg.Cs
local format = string.format
-local cpatterns = patterns.context or { }
-patterns.context = cpatterns
+local cpatterns = patterns.context or { }
+patterns.context = cpatterns
-local utf8char = patterns.utf8char
-local cardinal = patterns.cardinal
+local utf8character = patterns.utf8character
+local cardinal = patterns.cardinal
-local leftbrace = P("{")
-local rightbrace = P("}")
-local backslash = P("\\")
-local csname = backslash * P(1) * (1-backslash-leftbrace)^0 * P(" ")^0
-local sign = P("+") / "\\textplus "
- + P("-") / "\\textminus "
-local nested = P { leftbrace * (V(1) + (1-rightbrace))^0 * rightbrace }
-local subscript = P("_")
-local superscript = P("^")
+local leftbrace = P("{")
+local rightbrace = P("}")
+local backslash = P("\\")
+local csname = backslash * P(1) * (1-backslash-leftbrace)^0 * P(" ")^0
+local sign = P("+") / "\\textplus "
+ + P("-") / "\\textminus "
+local nested = P { leftbrace * (V(1) + (1-rightbrace))^0 * rightbrace }
+local subscript = P("_")
+local superscript = P("^")
--- local scripts = P { "start",
--- start = V("csname") + V("lowfirst") + V("highfirst"),
--- csname = csname,
--- content = Cs(V("csname") + nested + sign^-1 * (cardinal + utf8char)),
--- lowfirst = subscript * ( Cc("\\lohi{%s}{%s}") * V("content") * superscript + Cc("\\low{%s}" ) ) * V("content") / format,
--- highfirst = superscript * ( Cc("\\hilo{%s}{%s}") * V("content") * subscript + Cc("\\high{%s}") ) * V("content") / format,
--- }
+-- local scripts = P { "start",
+-- start = V("csname") + V("lowfirst") + V("highfirst"),
+-- csname = csname,
+-- content = Cs(V("csname") + nested + sign^-1 * (cardinal + utf8character)),
+-- lowfirst = subscript * ( Cc("\\lohi{%s}{%s}") * V("content") * superscript + Cc("\\low{%s}" ) ) * V("content") / format,
+-- highfirst = superscript * ( Cc("\\hilo{%s}{%s}") * V("content") * subscript + Cc("\\high{%s}") ) * V("content") / format,
+-- }
--- local scripts = P { "start",
--- start = (V("csname") + V("lowfirst") + V("highfirst"))^1,
--- csname = csname,
--- content = Cs(V("csname") + nested + sign^-1 * (cardinal + utf8char)),
--- lowfirst = (subscript /"") * ( Cc("\\lohi{") * V("content") * Cc("}{") * (superscript/"") + Cc("\\low{" ) ) * V("content") * Cc("}"),
--- highfirst = (superscript/"") * ( Cc("\\hilo{") * V("content") * Cc("}{") * (subscript /"") + Cc("\\high{") ) * V("content") * Cc("}"),
--- }
+-- local scripts = P { "start",
+-- start = (V("csname") + V("lowfirst") + V("highfirst"))^1,
+-- csname = csname,
+-- content = Cs(V("csname") + nested + sign^-1 * (cardinal + utf8character)),
+-- lowfirst = (subscript /"") * ( Cc("\\lohi{") * V("content") * Cc("}{") * (superscript/"") + Cc("\\low{" ) ) * V("content") * Cc("}"),
+-- highfirst = (superscript/"") * ( Cc("\\hilo{") * V("content") * Cc("}{") * (subscript /"") + Cc("\\high{") ) * V("content") * Cc("}"),
+-- }
-local scripted = Cs { "start",
- start = (V("csname") + V("nested") + V("lowfirst") + V("highfirst") + V("utf8char"))^1,
- rest = V("csname") + V("nested") + V("lowfirst") + V("highfirst"),
- csname = csname,
- utf8char = utf8char,
- -- nested = leftbrace * (V("rest") + (V("utf8char")-rightbrace))^0 * rightbrace,
- nested = leftbrace * (V("start") -rightbrace)^0 * rightbrace,
- content = Cs(V("nested") + sign^-1 * (cardinal + V("utf8char"))),
- content = V("nested") + sign^-1 * (cardinal + V("utf8char")),
- lowfirst = (subscript /"") * ( Cc("\\lohi{") * V("content") * Cc("}{") * (superscript/"") + Cc("\\low{" ) ) * V("content") * Cc("}"),
- highfirst = (superscript/"") * ( Cc("\\hilo{") * V("content") * Cc("}{") * (subscript /"") + Cc("\\high{") ) * V("content") * Cc("}"),
- }
+local scripted = Cs { "start",
+ start = (V("csname") + V("nested") + V("lowfirst") + V("highfirst") + V("character"))^1,
+ rest = V("csname") + V("nested") + V("lowfirst") + V("highfirst"),
+ csname = csname,
+ character = utf8character,
+ -- nested = leftbrace * (V("rest") + (V("character")-rightbrace))^0 * rightbrace,
+ nested = leftbrace * (V("start") -rightbrace)^0 * rightbrace,
+ -- content = Cs(V("nested") + sign^-1 * (cardinal + V("character"))),
+ content = V("nested") + sign^-1 * (cardinal + V("character")) + sign,
+ lowfirst = (subscript /"") * ( Cc("\\lohi{") * V("content") * Cc("}{") * (superscript/"") + Cc("\\low{" ) ) * V("content") * Cc("}"),
+ highfirst = (superscript/"") * ( Cc("\\hilo{") * V("content") * Cc("}{") * (subscript /"") + Cc("\\high{") ) * V("content") * Cc("}"),
+ }
-
--- local scripted = Cs((scripts))
-
--- cpatterns.scripts = scripts
-cpatterns.csname = csname
-cpatterns.scripted = scripted
-cpatterns.nested = nested
+cpatterns.csname = csname
+cpatterns.scripted = scripted
+cpatterns.nested = nested
-- print(lpegmatch(scripted,"10^-3_x"))
-- print(lpegmatch(scripted,"\\L {C_5}"))
diff --git a/Master/texmf-dist/tex/context/base/cldf-scn.lua b/Master/texmf-dist/tex/context/base/cldf-scn.lua
new file mode 100644
index 00000000000..5f7e0c74bbd
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cldf-scn.lua
@@ -0,0 +1,163 @@
+if not modules then modules = { } end modules ['cldf-scn'] = {
+ version = 1.001,
+ comment = "companion to cldf-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local load, type = load, type
+
+local formatters = string.formatters
+local char = string.char
+local concat = table.concat
+
+local lpegmatch = lpeg.match
+local p_unquoted = lpeg.Cs(lpeg.patterns.unquoted)
+
+local f_action_f = formatters["action%s(%s)"]
+local f_action_s = formatters["local action%s = action[%s]"]
+local f_command = formatters["local action = tokens._action\n%\nt\nreturn function(%s) return %s end"]
+
+local interfaces = interfaces
+local commands = commands
+local scanners = interfaces.scanners
+
+local compile = tokens.compile or function() end
+
+local dummy = function() end
+
+local report = logs.reporter("interfaces","implementor")
+
+function interfaces.implement(specification)
+ local actions = specification.actions
+ local name = specification.name
+ local arguments = specification.arguments
+ local private = specification.scope == "private"
+ local onlyonce = specification.onlyonce
+ if not actions then
+ if name then
+ report("error: no actions for %a",name)
+ else
+ report("error: no actions and no name")
+ end
+ return
+ end
+ if name == "" then
+ name = nil
+ end
+ local scanner
+ local resetter = onlyonce and name and commands.ctxresetter(name)
+ if resetter then
+ local scan = compile(specification)
+ if private then
+ scanner = function()
+ resetter()
+ return scan()
+ end
+ else
+ scanner = function()
+ commands[name] = dummy
+ resetter()
+ return scan()
+ end
+ end
+ else
+ scanner = compile(specification)
+ end
+ if not name then
+ return scanner
+ end
+ if scanners[name] and not specification.overload then
+ report("warning: 'scanners.%s' is redefined",name)
+ end
+ scanners[name] = scanner
+ if private then
+ return
+ end
+ local command
+ if onlyonce then
+ if type(actions) == "function" then
+ actions = { actions }
+ elseif #actions == 1 then
+ actions = { actions[1] }
+ end
+ end
+ if type(actions) == "function" then
+ command = actions
+ elseif #actions == 1 then
+ command = actions[1]
+ else
+ -- this one is not yet complete .. compare tokens
+ tokens._action = actions
+ local f = { }
+ local args
+ if not arguments then
+ args = ""
+ elseif type(arguments) == "table" then
+ local a = { }
+ for i=1,#arguments do
+ local v = arguments[i]
+ local t = type(v)
+ if t == "boolean" then
+ a[i] = tostring(v)
+ elseif t == "number" then
+ a[i] = tostring(v)
+ elseif t == "string" then
+ local s = lpegmatch(p_unquoted,v)
+ if s and v ~= s then
+ a[i] = v -- a string, given as "'foo'" or '"foo"'
+ else
+ a[i] = char(96+i)
+ end
+ else
+ -- nothing special for tables
+ a[i] = char(96+i)
+ end
+ end
+ args = concat(a,",")
+ else
+ args = "a"
+ end
+ command = args
+ for i=1,#actions do
+ command = f_action_f(i,command)
+ f[#f+1] = f_action_s(i,i)
+ end
+ command = f_command(f,args,command)
+ command = load(command)
+ if command then
+ if resetter then
+ local cmd = command()
+ command = function()
+ commands[name] = dummy
+ resetter()
+ cmd()
+ end
+ else
+ command = command()
+ end
+ end
+ tokens._action = nil
+ end
+ if commands[name] and not specification.overload then
+ report("warning: 'commands.%s' is redefined",name)
+ end
+ commands[name] = command
+ -- return scanner, command
+end
+
+-- it's convenient to have copies here:
+
+interfaces.setmacro = tokens.setters.macro
+interfaces.setcount = tokens.setters.count
+interfaces.setdimen = tokens.setters.dimen
+
+interfaces.strings = table.setmetatableindex(function(t,k)
+ local v = { }
+ for i=1,k do
+ v[i] = "string"
+ end
+ t[k] = v
+ return v
+end)
diff --git a/Master/texmf-dist/tex/context/base/colo-ext.mkiv b/Master/texmf-dist/tex/context/base/colo-ext.mkiv
index 8878da48522..c076fda9e5a 100644
--- a/Master/texmf-dist/tex/context/base/colo-ext.mkiv
+++ b/Master/texmf-dist/tex/context/base/colo-ext.mkiv
@@ -29,13 +29,13 @@
%D
%D will negate the colors in box zero.
-\unexpanded\def\negatecolorbox#1%
- {\setbox#1\hbox
- {\startnegative % might change
- % \startcolor[\s!white]\vrule\s!height\ht#1\s!depth\dp#1\s!width\wd#1\stopcolor
- \blackrule[\c!color=\s!white,\c!height=\ht#1,\c!depth=\dp#1,\c!width=\wd#1]%
- \hskip-\wd#1%
- \box#1%
+\unexpanded\def\negatecolorbox#1% or just set attr of #1
+ {\setbox#1\hbox to \wd#1%
+ {\scratchdimen\wd#1\relax
+ \startnegative % might change
+ \blackrule[\c!color=\s!white,\c!height=\ht#1,\c!depth=\dp#1,\c!width=\scratchdimen]%
+ \hskip-\scratchdimen
+ \leaders\box#1\hfill% this triggers application to the box .. a real dirty hack!
\stopnegative}}
%D There are in principle two ways to handle overprint: bound to colors
@@ -47,10 +47,10 @@
\installcorenamespace{colorintent}
\unexpanded\def\registercolorintent#1#2%
- {\setevalue{\??colorintent#1}{\attribute\colorintentattribute\ctxcommand{registercolorintent('#2')} }}
+ {\setevalue{\??colorintent#1}{\attribute\colorintentattribute\clf_registercolorintent{#2}}}
\unexpanded\def\colo_intents_set
- {\ctxcommand{enablecolorintents()}%
+ {\clf_enablecolorintents
\unexpanded\gdef\colo_intents_set##1{\csname\??colorintent##1\endcsname}%
\colo_intents_set}
diff --git a/Master/texmf-dist/tex/context/base/colo-grp.mkiv b/Master/texmf-dist/tex/context/base/colo-grp.mkiv
index 11b759062dc..e296bbc33d9 100644
--- a/Master/texmf-dist/tex/context/base/colo-grp.mkiv
+++ b/Master/texmf-dist/tex/context/base/colo-grp.mkiv
@@ -65,7 +65,7 @@
\processcommalist[#3]{\colo_groups_define_entry{#1}{#2}}}
\def\colo_groups_define_checked[#1][#2][#3]%
- {\doifinstringelse{:}{#2}
+ {\doifelseinstring{:}{#2}
{\colo_groups_define_normal[#1][\v!rgb][#2]}
{\doloop % inherited
{\ifcsname\??colorgroup#2:\recurselevel\endcsname
diff --git a/Master/texmf-dist/tex/context/base/colo-imp-rgb.mkiv b/Master/texmf-dist/tex/context/base/colo-imp-rgb.mkiv
index 9bc6befbaa9..dd14cc7d21d 100644
--- a/Master/texmf-dist/tex/context/base/colo-imp-rgb.mkiv
+++ b/Master/texmf-dist/tex/context/base/colo-imp-rgb.mkiv
@@ -53,8 +53,8 @@
\definecolor [darkmagenta] [r=.4, g=0, b=.4]
\definecolor [darkyellow] [r=.4, g=.4, b=0]
-\definecolor [darkgray] [s=.60]
-\definecolor [middlegray] [s=.725]
+\definecolor [darkgray] [s=.40]
+\definecolor [middlegray] [s=.625]
\definecolor [lightgray] [s=.85]
%D These colors are mapped to interface dependant colornames.
diff --git a/Master/texmf-dist/tex/context/base/colo-ini.lua b/Master/texmf-dist/tex/context/base/colo-ini.lua
index 94e9e6615ef..1065aadc064 100644
--- a/Master/texmf-dist/tex/context/base/colo-ini.lua
+++ b/Master/texmf-dist/tex/context/base/colo-ini.lua
@@ -14,11 +14,18 @@ local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
local formatters = string.formatters
local trace_define = false trackers.register("colors.define",function(v) trace_define = v end)
+local trace_pgf = false trackers.register("colors.pgf", function(v) trace_pgf = v end)
local report_colors = logs.reporter("colors","defining")
+local report_pgf = logs.reporter("colors","pgf")
-local attributes, backends, storage = attributes, backends, storage
-local context, commands = context, commands
+local attributes = attributes
+local backends = backends
+local storage = storage
+local context = context
+local commands = commands
+
+local implement = interfaces.implement
local settings_to_hash_strict = utilities.parsers.settings_to_hash_strict
@@ -26,8 +33,8 @@ local colors = attributes.colors
local transparencies = attributes.transparencies
local colorintents = attributes.colorintents
local registrations = backends.registrations
-local settexattribute = tex.setattribute
-local gettexattribute = tex.getattribute
+local texsetattribute = tex.setattribute
+local texgetattribute = tex.getattribute
local a_color = attributes.private('color')
local a_transparency = attributes.private('transparency')
@@ -48,7 +55,7 @@ storage.register("attributes/colors/sets",colorsets,"attributes.colors.sets")
local stack = { }
-function colors.pushset(name)
+local function pushset(name)
insert(stack,colorset)
colorset = colorsets[name]
if not colorset then
@@ -57,14 +64,18 @@ function colors.pushset(name)
end
end
-function colors.popset(name)
+local function popset()
colorset = remove(stack)
end
-function colors.setlist(name)
+local function setlist(name)
return table.sortedkeys(name and name ~= "" and colorsets[name] or colorsets.default or {})
end
+colors.pushset = pushset
+colors.popset = popset
+colors.setlist = setlist
+
local context_colordefagc = context.colordefagc
local context_colordefagt = context.colordefagt
local context_colordefalc = context.colordefalc
@@ -242,18 +253,22 @@ colors.forcedmodel = forcedmodel
colors.couple = true
-function colors.definetransparency(name,n)
+local function definetransparency(name,n)
transparent[name] = n
end
+colors.definetransparency = definetransparency
+
local registered = { }
-local function do_registerspotcolor(parent,name,parentnumber,e,f,d,p)
+local function do_registerspotcolor(parent,parentnumber,e,f,d,p)
if not registered[parent] then
local v = colorvalues[parentnumber]
if v then
local model = colors.default -- else problems with shading etc
- if model == 1 then model = v[1] end
+ if model == 1 then
+ model = v[1]
+ end
if e and e ~= "" then
registrations.spotcolorname(parent,e) -- before registration of the color
end
@@ -269,23 +284,25 @@ local function do_registerspotcolor(parent,name,parentnumber,e,f,d,p)
end
end
-local function do_registermultitonecolor(parent,name,parentnumber,e,f,d,p) -- same as spot but different template
- if not registered[parent] then
- local v = colorvalues[parentnumber]
- if v then
- local model = colors.default -- else problems with shading etc
- if model == 1 then model = v[1] end
- if model == 2 then
- registrations.grayindexcolor(parent,f,d,p,v[2])
- elseif model == 3 then
- registrations.rgbindexcolor (parent,f,d,p,v[3],v[4],v[5])
- elseif model == 4 then
- registrations.cmykindexcolor(parent,f,d,p,v[6],v[7],v[8],v[9])
- end
- end
- registered[parent] = true
- end
-end
+-- local function do_registermultitonecolor(parent,name,parentnumber,e,f,d,p) -- same as spot but different template
+-- if not registered[parent] then
+-- local v = colorvalues[parentnumber]
+-- if v then
+-- local model = colors.default -- else problems with shading etc
+-- if model == 1 then
+-- model = v[1]
+-- end
+-- if model == 2 then
+-- registrations.grayindexcolor(parent,f,d,p,v[2])
+-- elseif model == 3 then
+-- registrations.rgbindexcolor (parent,f,d,p,v[3],v[4],v[5])
+-- elseif model == 4 then
+-- registrations.cmykindexcolor(parent,f,d,p,v[6],v[7],v[8],v[9])
+-- end
+-- end
+-- registered[parent] = true
+-- end
+-- end
function colors.definesimplegray(name,s)
return register_color(name,'gray',s) -- we still need to get rid of 'color'
@@ -323,17 +340,19 @@ directives.register("colors.pgf",function(v)
end
end)
-function colors.defineprocesscolor(name,str,global,freeze) -- still inconsistent color vs transparent
+local defineintermediatecolor
+
+local function defineprocesscolor(name,str,global,freeze) -- still inconsistent color vs transparent
local what, one, two, three = lpegmatch(specialcolor,str)
if what == "H" then
-- for old times sake (if we need to feed from xml or so)
definecolor(name, register_color(name,'rgb',one,two,three),global)
elseif what == "M" then
-- intermediate
- return colors.defineintermediatecolor(name,one,l_color[two],l_color[three],l_transparency[two],l_transparency[three],"",global,freeze)
+ return defineintermediatecolor(name,one,l_color[two],l_color[three],l_transparency[two],l_transparency[three],"",global,freeze)
elseif what == "P" then
-- pgf for tikz
- return colors.defineintermediatecolor(name,two,l_color[one],l_color[three],l_transparency[one],l_transparency[three],"",global,freeze)
+ return defineintermediatecolor(name,two,l_color[one],l_color[three],l_transparency[one],l_transparency[three],"",global,freeze)
else
local settings = settings_to_hash_strict(str)
if settings then
@@ -389,23 +408,25 @@ function colors.defineprocesscolor(name,str,global,freeze) -- still inconsistent
colorset[name] = true-- maybe we can store more
end
-function colors.isblack(ca) -- maybe commands
+local function isblack(ca) -- maybe commands
local cv = ca > 0 and colorvalues[ca]
return (cv and cv[2] == 0) or false
end
-function colors.definespotcolor(name,parent,str,global)
+colors.isblack = isblack
+
+local function definespotcolor(name,parent,str,global)
if parent == "" or find(parent,"=",1,true) then
- colors.registerspotcolor(name, parent)
+ colors.registerspotcolor(name, parent) -- does that work? no attr
elseif name ~= parent then
local cp = attributes_list[a_color][parent]
if cp then
local t = settings_to_hash_strict(str)
if t then
local tp = tonumber(t.p) or 1
- do_registerspotcolor(parent, name, cp, t.e, 1, "", tp) -- p not really needed, only diagnostics
+ do_registerspotcolor(parent,cp,t.e,1,"",tp) -- p not really needed, only diagnostics
if name and name ~= "" then
- definecolor(name, register_color(name,'spot', parent, 1, "", tp), true)
+ definecolor(name,register_color(name,'spot',parent,1,"",tp),true)
local ta, tt = t.a, t.t
if ta and tt then
definetransparent(name, transparencies.register(name,transparent[ta] or tonumber(ta) or 1,tonumber(tt) or 1), global)
@@ -428,13 +449,56 @@ function colors.registerspotcolor(parent, str)
local t = settings_to_hash_strict(str)
e = (t and t.e) or ""
end
- do_registerspotcolor(parent, "dummy", cp, e, 1, "", 1) -- p not really needed, only diagnostics
+ do_registerspotcolor(parent, cp, e, 1, "", 1) -- p not really needed, only diagnostics
+ end
+end
+
+local function f(i,colors,fraction)
+ local otf = 0
+ for c=1,#colors do
+ otf = otf + (tonumber(fraction[c]) or 1) * colors[c][i]
+ end
+ if otf > 1 then
+ otf = 1
+ end
+ return otf
+end
+
+local function definemixcolor(makename,name,fractions,cs,global,freeze)
+ local values = { }
+ for i=1,#cs do -- do fraction in here
+ local v = colorvalues[cs[i]]
+ if not v then
+ return
+ end
+ values[i] = v
+ end
+ if #values > 0 then
+ csone = values[1][1]
+ local ca
+ if csone == 2 then
+ ca = register_color(name,'gray',f(2,values,fractions))
+ elseif csone == 3 then
+ ca = register_color(name,'rgb', f(3,values,fractions),
+ f(4,values,fractions),
+ f(5,values,fractions))
+ elseif csone == 4 then
+ ca = register_color(name,'cmyk',f(6,values,fractions),
+ f(7,values,fractions),
+ f(8,values,fractions),
+ f(9,values,fractions))
+ else
+ ca = register_color(name,'gray',f(2,values,fractions))
+ end
+ definecolor(name,ca,global,freeze)
+ else
+ report_colors("invalid specification of components for color %a",makename)
end
end
-function colors.definemultitonecolor(name,multispec,colorspec,selfspec)
+local function definemultitonecolor(name,multispec,colorspec,selfspec)
local dd, pp, nn, max = { }, { }, { }, 0
- for k,v in gmatch(multispec,"(%a+)=([^%,]*)") do -- use settings_to_array
+ for k,v in gmatch(multispec,"([^=,]+)=([^%,]*)") do -- use settings_to_array
max = max + 1
dd[max] = k
pp[max] = v
@@ -445,17 +509,17 @@ function colors.definemultitonecolor(name,multispec,colorspec,selfspec)
local parent = gsub(lower(nn),"[^%d%a%.]+","_")
if not colorspec or colorspec == "" then
local cc = { } for i=1,max do cc[i] = l_color[dd[i]] end
- colors.definemixcolor(parent,pp,cc,global,freeze) -- can become local
+ definemixcolor(name,parent,pp,cc,global,freeze) -- can become local
else
if selfspec ~= "" then
colorspec = colorspec .. "," .. selfspec
end
- colors.defineprocesscolor(parent,colorspec,true,true)
+ defineprocesscolor(parent,colorspec,true,true)
end
local cp = attributes_list[a_color][parent]
dd, pp = concat(dd,','), concat(pp,',')
if cp then
- do_registerspotcolor(parent, name, cp, "", max, dd, pp)
+ do_registerspotcolor(parent, cp, "", max, dd, pp)
definecolor(name, register_color(name, 'spot', parent, max, dd, pp), true)
local t = settings_to_hash_strict(selfspec)
if t and t.a and t.t then
@@ -469,8 +533,13 @@ function colors.definemultitonecolor(name,multispec,colorspec,selfspec)
colorset[name] = true-- maybe we can store more
end
--- will move to mlib-col as colors in m,p are somewhat messy due to the fact
--- that we cannot cast
+colors.defineprocesscolor = defineprocesscolor
+colors.definespotcolor = definespotcolor
+colors.definemultitonecolor = definemultitonecolor
+
+-- will move to mlib-col as colors in mp are somewhat messy due to the fact
+-- that we cannot cast .. so we really need to use (s,s,s) for gray in order
+-- to be able to map onto 'color'
local function mpcolor(model,ca,ta,default)
local cv = colorvalues[ca]
@@ -488,7 +557,8 @@ local function mpcolor(model,ca,ta,default)
elseif model == 4 then
return formatters["transparent(%s,%s,cmyk(%s,%s,%s,%s))"](tv[1],tv[2],cv[6],cv[7],cv[8],cv[9])
elseif model == 5 then
- return formatters['transparent(%s,%s,multitonecolor("%s",%s,"%s","%s"))'](tv[1],tv[2],cv[10],cv[11],cv[12],cv[13])
+ -- return formatters['transparent(%s,%s,multitonecolor("%s",%s,"%s","%s"))'](tv[1],tv[2],cv[10],cv[11],cv[12],cv[13])
+ return formatters['transparent(%s,%s,namedcolor("%s"))'](tv[1],tv[2],cv[10])
else -- see ** in meta-ini.mkiv: return formatters["transparent(%s,%s,(%s))"](tv[1],tv[2],cv[2])
return formatters["transparent(%s,%s,(%s,%s,%s))"](tv[1],tv[2],cv[3],cv[4],cv[5])
end
@@ -500,7 +570,8 @@ local function mpcolor(model,ca,ta,default)
elseif model == 4 then
return formatters["cmyk(%s,%s,%s,%s)"](cv[6],cv[7],cv[8],cv[9])
elseif model == 5 then
- return formatters['multitonecolor("%s",%s,"%s","%s")'](cv[10],cv[11],cv[12],cv[13])
+ -- return formatters['multitonecolor("%s",%s,"%s","%s")'](cv[10],cv[11],cv[12],cv[13])
+ return formatters['namedcolor("%s")'](cv[10])
else -- see ** in meta-ini.mkiv: return formatters["%s"]((cv[2]))
return formatters["(%s,%s,%s)"](cv[3],cv[4],cv[5])
end
@@ -512,7 +583,7 @@ local function mpcolor(model,ca,ta,default)
end
local function mpnamedcolor(name)
- return mpcolor(gettexattribute(a_colorspace),l_color[name] or l_color.black)
+ return mpcolor(texgetattribute(a_colorspace),l_color[name] or l_color.black)
end
local function mpoptions(model,ca,ta,default) -- will move to mlib-col
@@ -682,7 +753,7 @@ local function complement(one,fraction,i)
return otf
end
-function colors.defineintermediatecolor(name,fraction,c_one,c_two,a_one,a_two,specs,global,freeze)
+defineintermediatecolor = function(name,fraction,c_one,c_two,a_one,a_two,specs,global,freeze)
fraction = tonumber(fraction) or 1
local one, two = colorvalues[c_one], colorvalues[c_two]
if one then
@@ -738,48 +809,17 @@ function colors.defineintermediatecolor(name,fraction,c_one,c_two,a_one,a_two,sp
end
end
-local function f(i,colors,fraction)
- local otf = 0
- for c=1,#colors do
- otf = otf + (tonumber(fraction[c]) or 1) * colors[c][i]
- end
- if otf > 1 then
- otf = 1
- end
- return otf
-end
-
-function colors.definemixcolor(name,fractions,cs,global,freeze)
- local values = { }
- for i=1,#cs do -- do fraction in here
- local v = colorvalues[cs[i]]
- if not v then
- return
- end
- values[i] = v
- end
- local csone = values[1][1]
- local ca
- if csone == 2 then
- ca = register_color(name,'gray',f(2,values,fractions))
- elseif csone == 3 then
- ca = register_color(name,'rgb', f(3,values,fractions),
- f(4,values,fractions),
- f(5,values,fractions))
- elseif csone == 4 then
- ca = register_color(name,'cmyk',f(6,values,fractions),
- f(7,values,fractions),
- f(8,values,fractions),
- f(9,values,fractions))
- else
- ca = register_color(name,'gray',f(2,values,fractions))
- end
- definecolor(name,ca,global,freeze)
-end
+colors.defineintermediatecolor = defineintermediatecolor
-- for the moment downward compatible
-local patterns = { "colo-imp-%s.mkiv", "colo-imp-%s.tex", "colo-%s.mkiv", "colo-%s.tex" }
+local patterns = {
+ "colo-imp-%s.mkiv",
+ "colo-imp-%s.tex",
+ -- obsolete:
+ "colo-%s.mkiv",
+ "colo-%s.tex"
+}
local function action(name,foundname)
-- could be one command
@@ -796,7 +836,7 @@ local function failure(name)
report_colors("unknown library %a",name)
end
-function colors.usecolors(name)
+local function usecolors(name)
commands.uselibrary {
category = "color definition",
name = name,
@@ -807,52 +847,121 @@ function colors.usecolors(name)
}
end
--- interface (todo: use locals)
+colors.usecolors = usecolors
-local setcolormodel = colors.setmodel
+-- backend magic
-function commands.setcolormodel(model,weight)
- settexattribute(a_colorspace,setcolormodel(model,weight))
-end
+local currentpagecolormodel
--- function commands.setrastercolor(name,s)
--- settexattribute(a_color,colors.definesimplegray(name,s))
--- end
+function colors.setpagecolormodel(model)
+ currentpagecolormodel = model
+end
-function commands.registermaintextcolor(a)
- colors.main = a
+function colors.getpagecolormodel()
+ return currentpagecolormodel
end
-commands.defineprocesscolor = colors.defineprocesscolor
-commands.definespotcolor = colors.definespotcolor
-commands.definemultitonecolor = colors.definemultitonecolor
-commands.definetransparency = colors.definetransparency
-commands.defineintermediatecolor = colors.defineintermediatecolor
+-- interface
-function commands.spotcolorname (a) context(spotcolorname (a)) end
-function commands.spotcolorparent (a) context(spotcolorparent (a)) end
-function commands.spotcolorvalue (a) context(spotcolorvalue (a)) end
-function commands.colorcomponents (a,s) context(colorcomponents (a,s)) end
-function commands.transparencycomponents(a,s) context(transparencycomponents(a,s)) end
-function commands.processcolorcomponents(a,s) context(processcolorcomponents(a,s)) end
-function commands.formatcolor (...) context(formatcolor (...)) end
-function commands.formatgray (...) context(formatgray (...)) end
+local setcolormodel = colors.setmodel
-function commands.mpcolor(model,ca,ta,default)
- context(mpcolor(model,ca,ta,default))
-end
+implement {
+ name = "setcolormodel",
+ arguments = { "string", "boolean" },
+ actions = function(model,weight)
+ texsetattribute(a_colorspace,setcolormodel(model,weight))
+ end
+}
-function commands.mpoptions(model,ca,ta,default)
- context(mpoptions(model,ca,ta,default))
-end
+implement {
+ name = "setpagecolormodel",
+ actions = colors.setpagecolormodel,
+ arguments = { "string" },
+}
-function commands.doifblackelse(a)
- commands.doifelse(colors.isblack(a))
-end
+implement {
+ name = "defineprocesscolorlocal",
+ actions = defineprocesscolor,
+ arguments = { "string", "string", false, "boolean" }
+}
-function commands.doifdrawingblackelse()
- commands.doifelse(colors.isblack(gettexattribute(a_color)))
-end
+implement {
+ name = "defineprocesscolorglobal",
+ actions = defineprocesscolor,
+ arguments = { "string", "string", true, "boolean" }
+}
+
+implement {
+ name = "defineprocesscolordummy",
+ actions = defineprocesscolor,
+ arguments = { "'d_u_m_m_y'", "string", false, false }
+}
+
+implement {
+ name = "definespotcolorglobal",
+ actions = definespotcolor,
+ arguments = { "string", "string", "string", true }
+}
+
+implement {
+ name = "definemultitonecolorglobal",
+ actions = definemultitonecolor,
+ arguments = { "string", "string", "string", "string", true }
+}
+
+implement {
+ name = "registermaintextcolor",
+ actions = function(main)
+ colors.main = main
+ end,
+ arguments = { "integer" }
+}
+
+implement {
+ name = "definetransparency",
+ actions = definetransparency,
+ arguments = { "string", "integer" }
+}
+
+implement {
+ name = "defineintermediatecolor",
+ actions = defineintermediatecolor,
+ arguments = { "string", "string", "integer", "integer", "integer", "integer", "string", false, "boolean" }
+}
+
+implement { name = "spotcolorname", actions = { spotcolorname, context }, arguments = "integer" }
+implement { name = "spotcolorparent", actions = { spotcolorparent, context }, arguments = "integer" }
+implement { name = "spotcolorvalue", actions = { spotcolorvalue, context }, arguments = "integer" }
+implement { name = "colorcomponents", actions = { colorcomponents, context }, arguments = "integer" }
+implement { name = "transparencycomponents", actions = { transparencycomponents, context }, arguments = "integer" }
+implement { name = "processcolorcomponents", actions = { processcolorcomponents, context }, arguments = "integer" }
+implement { name = "formatcolor", actions = { formatcolor, context }, arguments = { "integer", "string" } }
+implement { name = "formatgray", actions = { formatgray, context }, arguments = { "integer", "string" } }
+
+implement {
+ name = "mpcolor",
+ actions = { mpcolor, context },
+ arguments = { "integer", "integer", "integer" }
+}
+
+implement {
+ name = "mpoptions",
+ actions = { mpoptions, context },
+ arguments = { "integer", "integer", "integer" }
+}
+
+local ctx_doifelse = commands.doifelse
+
+implement {
+ name = "doifelsedrawingblack",
+ actions = function() ctx_doifelse(isblack(texgetattribute(a_color))) end
+}
+
+implement {
+ name = "doifelseblack",
+ actions = { isblack, ctx_doifelse },
+ arguments = "integer"
+}
-- function commands.withcolorsinset(name,command)
-- local set
@@ -872,51 +981,67 @@ end
-- end
-- end
-commands.startcolorset = colors.pushset
-commands.stopcolorset = colors.popset
-
-commands.usecolors = colors.usecolors
+implement { name = "startcolorset", actions = pushset, arguments = "string" }
+implement { name = "stopcolorset", actions = popset }
+implement { name = "usecolors", actions = usecolors, arguments = "string" }
-- bonus
-function commands.pgfxcolorspec(ca) -- {}{}{colorspace}{list}
- -- local cv = attributes.colors.values[ca]
- local cv = colorvalues[ca]
- if cv then
- local model = cv[1]
- if model == 2 then
- context("{gray}{%1.3f}",cv[2])
- elseif model == 3 then
- context("{rgb}{%1.3f,%1.3f,%1.3f}",cv[3],cv[4],cv[5])
- elseif model == 4 then
- context("{cmyk}{%1.3f,%1.3f,%1.3f,%1.3f}",cv[6],cv[7],cv[8],cv[9])
+do
+
+ local function pgfxcolorspec(model,ca) -- {}{}{colorspace}{list}
+ -- local cv = attributes.colors.values[ca]
+ local cv = colorvalues[ca]
+ local str
+ if cv then
+ if model and model ~= 0 then
+ model = model
+ else
+ model = forcedmodel(cv[1])
+ end
+ if model == 3 then
+ str = formatters["{rgb}{%1.3f,%1.3f,%1.3f}"](cv[3],cv[4],cv[5])
+ elseif model == 4 then
+ str = formatters["{cmyk}{%1.3f,%1.3f,%1.3f,%1.3f}"](cv[6],cv[7],cv[8],cv[9])
+ else -- there is no real gray
+ str = formatters["{rgb}{%1.3f,%1.3f,%1.3f}"](cv[2],cv[2],cv[2])
+ end
else
- context("{gray}{%1.3f}",cv[2])
+ str = "{rgb}{0,0,0}"
end
- else
- context("{gray}{0}")
+ if trace_pgf then
+ report_pgf("model %a, string %a",model,str)
+ end
+ return str
end
-end
--- function commands.pgfregistercolor(name,attribute)
--- local cv = colorvalues[ca]
--- context.pushcatcodes('prt')
--- if cv then
--- local model = forcedmodel(cv[1])
--- if model == 2 then
--- context["pgfutil@definecolor"]("{%s}{gray}{%1.3f}",name,cv[2])
--- elseif model == 3 then
--- context["pgfutil@definecolor"]("{%s}{rgb}{%1.3f,%1.3f,%1.3f}",name,cv[3],cv[4],cv[5])
--- elseif model == 4 then
--- context["pgfutil@definecolor"]("{%s}{cmyk}{%1.3f,%1.3f,%1.3f,%1.3f}",name,cv[6],cv[7],cv[8],cv[9])
--- else
--- context["pgfutil@definecolor"]("{%s}{gray}{0}",name)
--- end
--- else
--- context["pgfutil@definecolor"]("{%s}{gray}{0}",name)
--- end
--- context.popcatcodes()
--- end
+ implement {
+ name = "pgfxcolorspec",
+ actions = { pgfxcolorspec, context },
+ arguments = { "integer", "integer" }
+ }
+
+ -- function commands.pgfregistercolor(name,attribute)
+ -- local cv = colorvalues[ca]
+ -- context.pushcatcodes('prt')
+ -- if cv then
+ -- local model = forcedmodel(cv[1])
+ -- if model == 2 then
+ -- context["pgfutil@definecolor"]("{%s}{gray}{%1.3f}",name,cv[2])
+ -- elseif model == 3 then
+ -- context["pgfutil@definecolor"]("{%s}{rgb}{%1.3f,%1.3f,%1.3f}",name,cv[3],cv[4],cv[5])
+ -- elseif model == 4 then
+ -- context["pgfutil@definecolor"]("{%s}{cmyk}{%1.3f,%1.3f,%1.3f,%1.3f}",name,cv[6],cv[7],cv[8],cv[9])
+ -- else
+ -- context["pgfutil@definecolor"]("{%s}{gray}{0}",name)
+ -- end
+ -- else
+ -- context["pgfutil@definecolor"]("{%s}{gray}{0}",name)
+ -- end
+ -- context.popcatcodes()
+ -- end
+
+end
-- handy
diff --git a/Master/texmf-dist/tex/context/base/colo-ini.mkiv b/Master/texmf-dist/tex/context/base/colo-ini.mkiv
index 6aa51b218e9..1eb3d8d7e6e 100644
--- a/Master/texmf-dist/tex/context/base/colo-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/colo-ini.mkiv
@@ -203,9 +203,9 @@
%D \usecolors[dem]
%D \stoptyping
-\unexpanded\def\startcolorset[#1]{\ctxcommand{startcolorset("#1")}}
-\unexpanded\def\stopcolorset {\ctxcommand{stopcolorset()}}
-\unexpanded\def\usecolors [#1]{\ctxcommand{usecolors("#1")}}
+\unexpanded\def\startcolorset[#1]{\clf_startcolorset{#1}}
+\unexpanded\def\stopcolorset {\clf_stopcolorset}
+\unexpanded\def\usecolors [#1]{\clf_usecolors{#1}}
\let\setupcolor\usecolors
@@ -255,14 +255,14 @@
\colo_helpers_set_current_model
\ifproductionrun
\edef\p_pagecolormodel{\directcolorsparameter\c!pagecolormodel}%
- \ctxcommand{synchronizecolormodel("\ifx\p_pagecolormodel\v!auto \currentcolormodel \else \p_pagecolormodel \fi")}%
+ \clf_setpagecolormodel{\ifx\p_pagecolormodel\v!auto\currentcolormodel\else\p_pagecolormodel\fi}%
\fi
\to \everysetupcolors
\appendtoks
\setupcolors[\c!state=\v!start]%
- \ctxcommand{enablecolor()}% % this can as well happen when
- \ctxcommand{enabletransparency()}% % the handler is defined in lua
+ \clf_enablecolor % this can as well happen when
+ \clf_enabletransparency % the handler is defined in lua
\let\colo_helpers_show_message\showmessage
\to \everyjob
@@ -367,7 +367,7 @@
{\dodoubleargument\colo_palets_define}
\unexpanded\def\colo_palets_define[#1][#2]% todo
- {\doifassignmentelse{#2}
+ {\doifelseassignment{#2}
{%\colo_helpers_show_message\m!colors6{#1}%
\let\m_colo_palets_tmp\empty
\setevalue{\??colorpaletspecification#1}{#2}%
@@ -382,7 +382,7 @@
% {\colo_palets_define_two{#1}[#2]}%
\def\colo_palets_define_one#1#2% get rid of { }
- {\doifassignmentelse{#2} % catch empty entries
+ {\doifelseassignment{#2} % catch empty entries
{\colo_palets_define_two{#1}[#2]}
{\colo_palets_define_three{#1}{#2}}}
@@ -563,7 +563,7 @@
\def\colo_helpers_set_model#1% direct
{\edef\currentcolormodel{#1}%
- \ctxcommand{setcolormodel('\currentcolormodel',\v_colo_weight_state)}} % sets attribute at lua end
+ \clf_setcolormodel{\currentcolormodel}\v_colo_weight_state\relax} % sets attribute at lua end
\colo_helpers_set_model\s!all
@@ -688,24 +688,42 @@
\attribute\colorattribute\attributeunsetvalue
\attribute\transparencyattribute\attributeunsetvalue}
+% todo: check if color is overloading a non-color command
+
+\newcount\c_colo_protection
+
+\unexpanded\def\startprotectedcolors
+ {\advance\c_colo_protection\plusone}
+
+\unexpanded\def\stopprotectedcolors
+ {\advance\c_colo_protection\minusone}
+
\def\colo_basics_define[#1][#2]%
- {\ctxcommand{defineprocesscolor("#1","#2",false,\v_colo_freeze_state)}%
- \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}}
+ {\clf_defineprocesscolorlocal{#1}{#2}\v_colo_freeze_state\relax
+ \ifcase\c_colo_protection
+ \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}%
+ \fi}
\def\colo_basics_define_global[#1][#2]%
- {\ctxcommand{defineprocesscolor("#1","#2",true,\v_colo_freeze_state)}%
- \unexpanded\setgvalue{#1}{\colo_helpers_activate{#1}}}
+ {\clf_defineprocesscolorglobal{#1}{#2}\v_colo_freeze_state\relax
+ \ifcase\c_colo_protection
+ \unexpanded\setgvalue{#1}{\colo_helpers_activate{#1}}%
+ \fi}
\def\colo_basics_define_named[#1][#2]% currently same as define
- {\ctxcommand{defineprocesscolor("#1","#2",false,\v_colo_freeze_state)}%
- \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}}
+ {\clf_defineprocesscolorlocal{#1}{#2}\v_colo_freeze_state\relax
+ \ifcase\c_colo_protection
+ \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}%
+ \fi}
\def\dodefinefastcolor[#1][#2]% still not fast but ok (might change)
- {\ctxcommand{defineprocesscolor("#1","#2",false,\v_colo_freeze_state)}%
- \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}}
+ {\clf_defineprocesscolorlocal{#1}{#2}\v_colo_freeze_state\relax
+ \ifcase\c_colo_protection
+ \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}%
+ \fi}
\def\colo_basics_defined_and_activated#1%
- {\ctxcommand{defineprocesscolor("\v_colo_dummy_name","#1",false,false)}%
+ {\clf_defineprocesscolordummy{#1}%
\colo_helpers_activate_dummy}
\def\colo_basics_define_process
@@ -716,12 +734,16 @@
\fi}
\def\colo_basics_define_process_yes[#1][#2][#3]%
- {\ctxcommand{defineprocesscolor("#1","\processcolorcomponents{#2},#3",false,\v_colo_freeze_state)}%
- \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}}
+ {\clf_defineprocesscolorlocal{#1}{\processcolorcomponents{#2},#3}\v_colo_freeze_state\relax
+ \ifcase\c_colo_protection
+ \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}%
+ \fi}
\def\colo_basics_define_process_nop[#1][#2][#3]%
- {\ctxcommand{defineprocesscolor("#1","#2",false,\v_colo_freeze_state)}%
- \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}}
+ {\clf_defineprocesscolorlocal{#1}{#2}\v_colo_freeze_state\relax
+ \ifcase\c_colo_protection
+ \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}%
+ \fi}
% Spotcolors used setxvalue but that messes up currentcolor
% and probably no global is needed either but they are global
@@ -729,17 +751,21 @@
% spot colors often are a document wide property
\def\colo_basics_define_spot[#1][#2][#3]%
- {\ctxcommand{definespotcolor("#1","#2","#3",true)}%
- \unexpanded\setgvalue{#1}{\colo_helpers_activate{#1}}}
+ {\clf_definespotcolorglobal{#1}{#2}{#3}%
+ \ifcase\c_colo_protection
+ \unexpanded\setgvalue{#1}{\colo_helpers_activate{#1}}%
+ \fi}
\def\colo_basics_define_multitone[#1][#2][#3][#4]%
- {\ctxcommand{definemultitonecolor("#1","#2","#3","#4",true)}%
- \unexpanded\setgvalue{#1}{\colo_helpers_activate{#1}}}
+ {\clf_definemultitonecolorglobal{#1}{#2}{#3}{#4}%
+ \ifcase\c_colo_protection
+ \unexpanded\setgvalue{#1}{\colo_helpers_activate{#1}}%
+ \fi}
%D Transparencies (only):
\def\colo_basics_define_transpancy[#1][#2]%
- {\ctxcommand{definetransparency("#1",#2)}}
+ {\clf_definetransparency{#1}#2\relax}
% A goodie that replaces the startMPcolor hackery
@@ -791,10 +817,15 @@
{\colo_basics_define_intermediate_indeed[#1][#2][#3]}
\def\colo_basics_define_intermediate_indeed[#1][#2,#3,#4][#5]%
- {\ctxcommand{defineintermediatecolor("#1","#2",
- \thecolorattribute{#3},\thecolorattribute{#4},
- \thetransparencyattribute{#3},\thetransparencyattribute{#4},
- "#5",false,\v_colo_freeze_state)}% not global
+ {\clf_defineintermediatecolor % not global
+ {#1}{#2}%
+ \thecolorattribute{#3} %
+ \thecolorattribute{#4} %
+ \thetransparencyattribute{#3} %
+ \thetransparencyattribute{#4} %
+ {#5}%
+ \v_colo_freeze_state
+ \relax
\unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}}
%D Here is a more efficient helper for pgf:
@@ -833,8 +864,10 @@
%D
%D \stopmode
-\def\pgf@context@registercolor#1% bonus macro
- {\setevalue{\string\color@#1}{\noexpand\xcolor@{}{}\ctxcommand{pgfxcolorspec(\thecolorattribute{#1})}}}
+\def\pgf@context@registercolor#1{\setevalue{\string\color@#1}{\noexpand\xcolor@{}{}\clf_pgfxcolorspec\zerocount\thecolorattribute{#1}}}
+\def\pgf@context@registergray #1{\setevalue{\string\color@#1}{\noexpand\xcolor@{}{}\clf_pgfxcolorspec\plustwo \thecolorattribute{#1}}}
+\def\pgf@context@registerrgb #1{\setevalue{\string\color@#1}{\noexpand\xcolor@{}{}\clf_pgfxcolorspec\plusthree\thecolorattribute{#1}}}
+\def\pgf@context@registercmyk #1{\setevalue{\string\color@#1}{\noexpand\xcolor@{}{}\clf_pgfxcolorspec\plusfour \thecolorattribute{#1}}}
%D \starttyping
%D \ifdefined\pgf@context@registercolor
@@ -849,7 +882,7 @@
%D command. Later on we will explain the use of palets. We
%D define ourselves a color conditional first.
-\def\doifcolorelse#1%
+\def\doifelsecolor#1%
{\ifcsname\??colorattribute\currentcolorprefix#1\endcsname
\expandafter\firstoftwoarguments
\else\ifcsname\??colorattribute#1\endcsname
@@ -858,6 +891,8 @@
\doubleexpandafter\secondoftwoarguments
\fi\fi}
+\let\doifcolorelse\doifelsecolor
+
\def\doifcolor#1%
{\ifcsname\??colorattribute\currentcolorprefix#1\endcsname
\expandafter\firstofoneargument
@@ -916,7 +951,7 @@
{\let\maintextcolor\s!themaintextcolor
\definecolor[\maintextcolor][#1]% can be fast one
\colo_helpers_activate\maintextcolor
- \ctxcommand{registermaintextcolor(\thecolorattribute\maintextcolor)}}
+ \clf_registermaintextcolor\thecolorattribute\maintextcolor\relax}
\unexpanded\def\starttextcolor[#1]%
{\doifsomething{#1}
@@ -958,7 +993,7 @@
\to \everysetupcolors
\def\colo_palets_define_set#1#2#3%
- {\doifassignmentelse{#3}% \definepalet[test][xx={y=.4}]
+ {\doifelseassignment{#3}% \definepalet[test][xx={y=.4}]
{\definecolor[\??colorpalet#1:#2][#3]%
\colo_helpers_set_value{\??colorsetter #1:#2}{\colo_helpers_inherited_palet_ca{#1}{#2}}%
\colo_helpers_set_value{\??colorattribute #1:#2}{\colo_helpers_inherited_palet_cs{#1}{#2}}%
@@ -1029,27 +1064,43 @@
\let\colorformatseparator\space
-\def\MPcolor #1{\ctxcommand{mpcolor(\number\attribute\colormodelattribute,\number\colo_helpers_inherited_current_ca{#1},\number\colo_helpers_inherited_current_ta{#1})}}
-\def\MPoptions #1{\ctxcommand{mpoptions(\number\attribute\colormodelattribute,\number\colo_helpers_inherited_current_ca{#1},\number\colo_helpers_inherited_current_ta{#1})}}
+\def\MPcolor#1%
+ {\clf_mpcolor
+ \attribute\colormodelattribute
+ \colo_helpers_inherited_current_ca{#1} %
+ \colo_helpers_inherited_current_ta{#1} }
+
+
+\def\MPoptions#1%
+ {\clf_mpoptions
+ \attribute\colormodelattribute
+ \colo_helpers_inherited_current_ca{#1} %
+ \colo_helpers_inherited_current_ta{#1} }
+
\def\thecolorattribute #1{\number\csname\??colorattribute \ifcsname\??colorattribute \currentcolorprefix#1\endcsname\currentcolorprefix#1\else\ifcsname\??colorattribute #1\endcsname#1\fi\fi\endcsname}
\def\thetransparencyattribute#1{\number\csname\??transparencyattribute\ifcsname\??transparencyattribute\currentcolorprefix#1\endcsname\currentcolorprefix#1\else\ifcsname\??transparencyattribute#1\endcsname#1\fi\fi\endcsname}
-
\def\thecolormodelattribute {\the\attribute\colormodelattribute}
-\def\internalspotcolorname #1{\ctxcommand{spotcolorname(\thecolorattribute{#1})}}
-\def\internalspotcolorparent #1{\ctxcommand{spotcolorparent(\thecolorattribute{#1})}}
-\def\internalspotcolorsize #1{\ctxcommand{spotcolorvalue(\thecolorattribute{#1})}}
+\def\internalspotcolorname #1{\clf_spotcolorname \thecolorattribute{#1} }
+\def\internalspotcolorparent #1{\clf_spotcolorparent\thecolorattribute{#1} }
+\def\internalspotcolorsize #1{\clf_spotcolorvalue \thecolorattribute{#1} }
+
+\def\colorcomponents #1{\clf_colorcomponents \thecolorattribute {#1} }
+\def\transparencycomponents #1{\clf_transparencycomponents\thetransparencyattribute{#1} }
+\def\processcolorcomponents #1{\clf_processcolorcomponents\thecolorattribute {#1} }
+
+\def\colorvalue #1{\clf_formatcolor\thecolorattribute{#1}{\colorformatseparator}}
+\def\grayvalue #1{\clf_formatgray \thecolorattribute{#1}{\colorformatseparator}}
-\def\colorcomponents #1{\ctxcommand{colorcomponents(\thecolorattribute{#1})}}
-\def\transparencycomponents #1{\ctxcommand{transparencycomponents(\thetransparencyattribute{#1})}}
-\def\processcolorcomponents #1{\ctxcommand{processcolorcomponents(\thecolorattribute{#1},",")}}
+\def\doifelseblack #1{\clf_doifelseblack\thecolorattribute{#1} }
+\def\doifelsedrawingblack {\clf_doifelsedrawingblack}
-\def\colorvalue #1{\ctxcommand{formatcolor(\thecolorattribute{#1},"\colorformatseparator")}}
-\def\grayvalue #1{\ctxcommand{formatgray (\thecolorattribute{#1},"\colorformatseparator")}}
+\let\doifblackelse \doifelseblack
+\let\doifdrawingblackelse \doifelsedrawingblack
-\def\doifblackelse #1{\ctxcommand{doifblackelse(\thecolorattribute{#1})}}
-\def\doifdrawingblackelse {\ctxcommand{doifdrawingblackelse()}}
+\let\doifblackelse \doifelseblack
+\let\doifdrawingblackelse\doifelsedrawingblack
%D \macros
%D {forcecolorhack}
@@ -1071,7 +1122,7 @@
% \normal added else fails in metafun manual (leaders do a hard scan)
-\unexpanded\def\forcecolorhack{\leaders\hrule\hskip\zeropoint}
+\unexpanded\def\forcecolorhack{\leaders\hrule\hskip\zeropoint\relax} % relax is needed !
%D We default to the colors defined in \type {colo-imp-rgb} and
%D support both \RGB\ and \CMYK\ output. Transparencies are defined
diff --git a/Master/texmf-dist/tex/context/base/colo-run.mkiv b/Master/texmf-dist/tex/context/base/colo-run.mkiv
index 5084fdd351e..16f54c3b5fb 100644
--- a/Master/texmf-dist/tex/context/base/colo-run.mkiv
+++ b/Master/texmf-dist/tex/context/base/colo-run.mkiv
@@ -46,7 +46,7 @@
\gdef\colo_show_palet[#1][#2]%
{\ifcsname\??colorpalet#1\endcsname
- \doifinsetelse\v!vertical{#2} \colo_palets_show_vertical \colo_palets_show_horizontal [#1][#2]%
+ \doifelseinset\v!vertical{#2} \colo_palets_show_vertical \colo_palets_show_horizontal [#1][#2]%
\fi}
\gdef\colo_palets_show_vertical[#1][#2]%
@@ -58,7 +58,7 @@
\setuppalet[#1]
\tabskip\zeropoint
\def\colo_palets_show_palet##1%
- {\doifinsetelse\v!number{#2}{##1\hskip.5em}{}&
+ {\doifelseinset\v!number{#2}{##1\hskip.5em}{}&
\color[##1]{\vrule\s!width3em\s!height\strutht\s!depth\strutdp}%
\graycolor[##1]{\vrule\s!width3em\s!height\strutht\s!depth\strutdp}&
\doifinset\v!value{#2}{\hskip.5em\colorvalue{##1}}\crcr}
@@ -155,7 +155,7 @@
\gdef\colo_groups_show[#1][#2]%
{\doifcolor{#1:1}
- {\doifinsetelse\v!vertical{#2} \colo_groups_show_vertical \colo_groups_show_horizontal [#1][#2]}}
+ {\doifelseinset\v!vertical{#2} \colo_groups_show_vertical \colo_groups_show_horizontal [#1][#2]}}
\gdef\colo_groups_show_horizontal[#1][#2]%
{\vbox
@@ -177,7 +177,7 @@
\hbox
{\doifinset\v!name{#2}
{\strut
- \doifinsetelse\v!value{#2}
+ \doifelseinset\v!value{#2}
{\raise3\lineheight\hbox{#1\hskip.5em}}
{#1}%
\hskip.5em}%
diff --git a/Master/texmf-dist/tex/context/base/colo-xwi.mkii b/Master/texmf-dist/tex/context/base/colo-xwi.mkii
index 557e9c57c54..13d04759e77 100644
--- a/Master/texmf-dist/tex/context/base/colo-xwi.mkii
+++ b/Master/texmf-dist/tex/context/base/colo-xwi.mkii
@@ -8,11 +8,12 @@
%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
%D I've forgotten where I got these definitions from, but maybe
-%D they can be of use.
+%D they can be of use. Watch out, these colors are in the rgb
+%D color space, so cyan is not defined in cmyk!
\definecolor [aliceblue] [r=0.94,g=0.97,b=1.00]
\definecolor [antiquewhite] [r=0.98,g=0.92,b=0.84]
diff --git a/Master/texmf-dist/tex/context/base/cont-fil.mkii b/Master/texmf-dist/tex/context/base/cont-fil.mkii
index e05d8eac46d..604ea233d06 100644
--- a/Master/texmf-dist/tex/context/base/cont-fil.mkii
+++ b/Master/texmf-dist/tex/context/base/cont-fil.mkii
@@ -124,4 +124,6 @@
\definefilesynonym [letter] [cor-01]
\definefilesynonym [memo] [cor-02]
+\definefilesynonym [syn-01] [syntax]
+
\endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-fil.mkiv b/Master/texmf-dist/tex/context/base/cont-fil.mkiv
index 8e9be155bfe..a1159b7f54f 100644
--- a/Master/texmf-dist/tex/context/base/cont-fil.mkiv
+++ b/Master/texmf-dist/tex/context/base/cont-fil.mkiv
@@ -116,5 +116,6 @@
\definefilesynonym [mat-11] [math-characters]
\definefilesynonym [fnt-11] [fonts-system]
\definefilesynonym [fnt-23] [fonts-shapes]
+\definefilesynonym [syn-01] [syntax]
\endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-log.mkiv b/Master/texmf-dist/tex/context/base/cont-log.mkiv
index 99e08450bae..598140d3268 100644
--- a/Master/texmf-dist/tex/context/base/cont-log.mkiv
+++ b/Master/texmf-dist/tex/context/base/cont-log.mkiv
@@ -13,10 +13,9 @@
\writestatus{loading}{ConTeXt TeX Logos}
-%D The system that is used to typeset this text is called \TEX,
-%D typeset with an lowered~E. From te beginning of \TEX,
-%D authors of macro packages adapted this raising and lowering
-%D style. In this module we define some of those logos.
+%D The system that is used to typeset this text is called \TEX, typeset with an
+%D lowered~E. From te beginning of \TEX, authors of macro packages adapted this
+%D raising and lowering style. In this module we define some of those logos.
\unprotect
@@ -26,7 +25,7 @@
\setbox\scratchbox\hbox{M}%
T%
\kern-.1667\wd\scratchbox
- \lower.5ex\hbox{E}%
+ \lower.5\exheight\hbox{E}%
\kern-.125\wd\scratchbox
X%
\endgroup}
@@ -48,40 +47,40 @@
\unexpanded\def\TaBlE
{T%
- \kern-.27em\lower.5ex\hbox{A}%
- \kern-.18emB%
- \kern-.1em\lower.5ex\hbox{L}%
- \kern-.075emE}
+ \kern-.27\emwidth\lower.5\exheight\hbox{A}%
+ \kern-.18\emwidth B%
+ \kern-.1\emwidth\lower.5\exheight\hbox{L}%
+ \kern-.075\emwidth E}
\unexpanded\def\PiCTeX
{P%
- \kern-.12em\lower.5ex\hbox{I}%
- \kern-.075em C%
- \kern-.11em\TeX}
+ \kern-.12\emwidth\lower.5\exheight\hbox{I}%
+ \kern-.075\emwidth C%
+ \kern-.11\emwidth\TeX}
\def\syst_logos_ams_script#1%
- {$\cal\ifdim\bodyfontsize>1.1em\scriptstyle\fi#1$}
+ {$\cal\ifdim\bodyfontsize>1.1\emwidth\scriptstyle\fi#1$}
\unexpanded\def\AmSTeX
{\dontleavehmode
\syst_logos_ams_script A%
- \kern-.1667em\lower.5ex\hbox{\syst_logos_ams_script M}%
- \kern-.125em\syst_logos_ams_script S%
+ \kern-.1667\emwidth\lower.5\exheight\hbox{\syst_logos_ams_script M}%
+ \kern-.125\emwidth\syst_logos_ams_script S%
-\TeX}
\unexpanded\def\LamSTeX
{L%
- \kern-.4em\raise.3ex\hbox{\syst_logos_ams_script A}%
- \kern-.25em\lower.4ex\hbox{\syst_logos_ams_script M}%
- \kern-.1em{\syst_logos_ams_script S}%
+ \kern-.4\emwidth\raise.3\exheight\hbox{\syst_logos_ams_script A}%
+ \kern-.25\emwidth\lower.4\exheight\hbox{\syst_logos_ams_script M}%
+ \kern-.1\emwidth{\syst_logos_ams_script S}%
-\TeX}
-\unexpanded\def\AmSLaTeX
- {\dontleavehmode
- \syst_logos_ams_script A%
- \kern-.1667em\lower.5ex\hbox{\syst_logos_ams_script M}%
- \kern-.125em\AMSswitch S%
- -\LaTeX}
+% \unexpanded\def\AmSLaTeX
+% {\dontleavehmode
+% \syst_logos_ams_script A%
+% \kern-.1667\emwidth\lower.5\exheight\hbox{\syst_logos_ams_script M}%
+% \kern-.125\emwidth{\syst_logos_ams_script S}%
+% -\LaTeX}
%D Alternative \CONTEXT\ logo, first Idris S.~Hamid's version:
%D
@@ -94,31 +93,31 @@
\unexpanded\def\Context % wrong usage of \getscaledglyph
{\dontleavehmode
\begingroup
- C\kern -.0667em\getscaledglyph{.8}\empty{O\kern -.0667emN\kern
- -.0549emT\doifitalicelse{\kern-.1em}{\kern-.1667em}\lower.5ex\hbox
- {E}\doifitalicelse\empty{\kern-.11em}X\kern-.055emT}%
+ C\kern -.0667\emwidth\getscaledglyph{.8}\empty{O\kern -.0667\emwidth N\kern
+ -.0549\emwidth T\doifelseitalic{\kern-.1\emwidth}{\kern-.1667\emwidth}\lower.5\exheight\hbox
+ {E}\doifelseitalic\empty{\kern-.11em}X\kern-.055\emwidth T}%
\endgroup}
-%D The \METAFONT\ and \METAPOST\ logos adapt themselves to the
-%D current fontsize, an ugly but usefull hack.
+%D The \METAFONT\ and \METAPOST\ logos adapt themselves to the current fontsize, an
+%D ugly but usefull hack.
\let\logofont\nullfont
-\loadmapfile[original-base.map] % stil needed?
+\loadmapfile[original-base.map] % stil needed? not if we assume afm
\unexpanded\def\setMFPfont% more sensitive for low level changes
{\font\logofont=logo%
- \ifx\fontalternative\s!bf\else
- \ifx\fontalternative\s!it\else
- \ifx\fontalternative\s!sl\else
- \ifx\fontalternative\s!bi\else
- \ifx\fontalternative\s!bs\else
+ \ifx\fontalternative\s!bf\s!bf\else
+ \ifx\fontalternative\s!it\s!sl\else
+ \ifx\fontalternative\s!sl\s!sl\else
+ \ifx\fontalternative\s!bi\s!bf\else
+ \ifx\fontalternative\s!bs\s!bf\else
\fi\fi\fi\fi\fi
10 at \currentfontscale\bodyfontsize % there is no afm in the minimals yet
\logofont}
\def\syst_logos_meta_hyphen % there is no hyphenchar in this font
- {\discretionary{\vrule\s!height.33em\s!depth-.27em\s!width.33em}{}{}}
+ {\discretionary{\vrule\s!height.33\emwidth\s!depth-.27\emwidth\s!width.33\emwidth}{}{}}
\unexpanded\def\MetaFont
{\dontleavehmode
@@ -146,9 +145,8 @@
%D CONTEXT, PPCHTEX,
%D AMSTEX, LATEX, LAMSTEX}
%D
-%D We define the funny written ones as well as the less
-%D error prone upper case names (in \CONTEXT\ we tend to
-%D write all user defined commands, like abbreviations, in
+%D We define the funny written ones as well as the less error prone upper case names
+%D (in \CONTEXT\ we tend to write all user defined commands, like abbreviations, in
%D uppercase.)
\unexpanded\def\METAFONT {\MetaFont}
@@ -165,18 +163,18 @@
\unexpanded\def\LAMSTEX {\LamSTeX}
\unexpanded\def\INRSTEX {inrs\TeX}
-%D And this is how they show up: \TeX, \MetaFont, \MetaPost,
-%D \PiCTeX, \TaBlE, \ConTeXt, \PPCHTeX, \AmSTeX, \LaTeX,
-%D \LamSTeX.
+%D And this is how they show up: \TeX, \MetaFont, \MetaPost, \PiCTeX, \TaBlE, \ConTeXt,
+%D \PPCHTeX, \AmSTeX, \LaTeX, \LamSTeX.
%D Some placeholders:
-\unexpanded\def\eTeX {\mathematics{\varepsilon}-\TeX}
-\unexpanded\def\pdfTeX {pdf\TeX}
-\unexpanded\def\pdfeTeX{pdfe-\TeX}
-\unexpanded\def\luaTeX {lua\TeX}
-\unexpanded\def\metaTeX{meta\TeX}
-\unexpanded\def\XeTeX {X\lower.5ex\hbox{\kern-.15em\mirror{E}}\kern-.1667em\TeX}
+\unexpanded\def\eTeX {\mathematics{\varepsilon}-\TeX}
+\unexpanded\def\pdfTeX {pdf\TeX}
+\unexpanded\def\pdfeTeX {pdfe-\TeX}
+\unexpanded\def\luaTeX {lua\TeX}
+\unexpanded\def\luajitTeX{luajit\TeX}
+\unexpanded\def\metaTeX {meta\TeX}
+\unexpanded\def\XeTeX {X\lower.5\exheight\hbox{\kern-.15\emwidth\mirror{E}}\kern-.1667\emwidth\TeX}
% Adapted from a patch by Mojca:
@@ -185,9 +183,9 @@
\raise\dimexpr\ht\scratchbox+\dp\scratchbox\relax\hbox{\rotate[\c!rotation=180]{\box\scratchbox}}}
\unexpanded\def\XeTeX
- {X\lower.5ex
+ {X\lower.5\exheight
\hbox
- {\kern-.15em
+ {\kern-.15\emwidth
\iffontchar\font"018E\relax
\char"018E%
\else
@@ -198,14 +196,15 @@
\ifx\fontalternative\s!bs\syst_logos_xetex_e\else
\mirror{E}\fi\fi\fi\fi\fi
\fi}%
- \kern-.1667em\TeX}
+ \kern-.1667\emwidth\TeX}
-\let\ETEX \eTeX
-\let\PDFTEX \pdfTeX
-\let\PDFETEX\pdfeTeX
-\let\LUATEX \luaTeX
-\let\LuaTeX \luaTeX
-\let\XETEX \XeTeX
+\let\ETEX \eTeX
+\let\PDFTEX \pdfTeX
+\let\PDFETEX \pdfeTeX
+\let\LUATEX \luaTeX
+\let\LUAJITTEX\luajitTeX
+\let\LuaTeX \luaTeX
+\let\XETEX \XeTeX
% \unexpanded\def\MkApproved % joke, not used so it might move
% {\dontleavehmode\rotate
@@ -265,22 +264,36 @@
\TeX
\endgroup}
-\let\luaTeX \LuaTeX
-\let\LUATEX \LuaTeX
+\unexpanded\def\LuajitTeX
+ {\dontleavehmode
+ \begingroup
+ % at this moment there is no real need for kerning tT
+ Luajit\kern\zeropoint\TeX
+ \endgroup}
+
+\let\luaTeX \LuaTeX
+\let\luajitTeX\LuajitTeX
+\let\LUATEX \LuaTeX
+\let\LUAJITTEX\LuajitTeX
\unexpanded\def\MKII{MkII}
\unexpanded\def\MKIV{MkIV}
\unexpanded\def\MKVI{MkVI}
+\unexpanded\def\MKIX{MkIX}
+\unexpanded\def\MKXI{MkXI}
\unexpanded\def\MPII{MpII}
\unexpanded\def\MPIV{MpIV}
+\unexpanded\def\MPVI{MpVI}
\appendtoks
- \def\ConTeXt {ConTeXt}%
- \def\MetaPost{MetaPost}%
- \def\MetaFont{MetaFont}%
- \def\MetaFun {MetaFun}%
- \def\TeX {TeX}%
+ \def\ConTeXt {ConTeXt}%
+ \def\MetaPost {MetaPost}%
+ \def\MetaFont {MetaFont}%
+ \def\MetaFun {MetaFun}%
+ \def\TeX {TeX}%
+ \def\LuaTeX {LuaTeX}%
+ \def\LuajitTeX{LuajitTeX}%
\to \everysimplifycommands
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-new.mkiv b/Master/texmf-dist/tex/context/base/cont-new.mkiv
index af32e8f35c9..2b7028e336b 100644
--- a/Master/texmf-dist/tex/context/base/cont-new.mkiv
+++ b/Master/texmf-dist/tex/context/base/cont-new.mkiv
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\newcontextversion{2014.05.21 22:04}
+\newcontextversion{2015.04.18 14:41}
%D This file is loaded at runtime, thereby providing an excellent place for
%D hacks, patches, extensions and new features.
@@ -32,6 +32,61 @@
% \inheritmaintextcolor
% \to \everymargindatacontent
+% This is experimental; if this changes we need to adapt the mb-mp style too. It's
+% not in the core yet.
+%
+% \def\ActionY{\blank\inleftmargin{\shownofparlines}}
+% \def\ActionN{\inleftmargin{\shownofparlines}}
+%
+% \saveparnumber
+% ...
+% \checknofparlines
+% \ifnum\nofparlines<2
+% \ActionY
+% \else
+% \ActionN
+% \fi
+% ...
+
+\newcount\c_typo_par_current
+\newcount\c_typo_par_saved
+\newcount\c_typo_par_lines
+\newcount\c_typo_par_temp
+
+\appendtoks
+ \advance\c_typo_par_current\plusone % local
+ %\llap{\infofont[\the\c_typo_par_saved:\the\c_typo_par_current]\quad}%
+\to \everypar
+
+\unexpanded\def\saveparnumber % the upcoming number
+ {\c_typo_par_saved\c_typo_par_current} % local
+
+\def\savedparnumber {\number\c_typo_par_saved}
+\def\currentparnumber{\number\c_typo_par_current}
+\def\nofparlines {\number\c_typo_par_lines}
+\let\savedparstate \empty
+
+\unexpanded\def\shownofparlines
+ {\dontleavehmode\hbox\bgroup
+ \infofont[\savedparstate]%
+ \egroup}
+
+\unexpanded\def\checknofparlines
+ {\c_typo_par_temp\numexpr\c_typo_par_saved+\plusone\relax
+ \ifhmode
+ \c_typo_par_lines\zerocount
+ \edef\savedparstate{\number\c_typo_par_temp:\number\c_typo_par_current\space-}%
+ \else\ifnum\c_typo_par_current=\c_typo_par_temp
+ \c_typo_par_lines\prevgraf
+ \edef\savedparstate{\number\c_typo_par_temp:\number\c_typo_par_current\space\number\prevgraf}%
+ \else\ifnum\c_typo_par_temp>\c_typo_par_current
+ \c_typo_par_lines\zerocount
+ \edef\savedparstate{\number\c_typo_par_temp:\number\c_typo_par_current\space-}%
+ \else
+ \c_typo_par_lines\maxdimen
+ \edef\savedparstate{\number\c_typo_par_temp:\number\c_typo_par_current\space+}%
+ \fi\fi\fi}
+
%D Maybe:
\unexpanded\def\tightvbox{\dowithnextbox{\dp\nextbox\zeropoint\box\nextbox}\vbox}
diff --git a/Master/texmf-dist/tex/context/base/cont-run.lua b/Master/texmf-dist/tex/context/base/cont-run.lua
new file mode 100644
index 00000000000..08bbe5c3c25
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cont-run.lua
@@ -0,0 +1,252 @@
+if not modules then modules = { } end modules ['cont-run'] = {
+ version = 1.001,
+ comment = "companion to cont-yes.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- When a style is loaded there is a good change that we never enter
+-- this code.
+
+local report = logs.reporter("system")
+
+local type, tostring = type, tostring
+
+local report = logs.reporter("sandbox","call")
+local fastserialize = table.fastserialize
+local quoted = string.quoted
+local possiblepath = sandbox.possiblepath
+
+local context = context
+local implement = interfaces.implement
+
+local qualified = { }
+local writeable = { }
+local readable = { }
+local blocked = { }
+local trace_files = false
+local trace_calls = false
+local nofcalls = 0
+local nofrejected = 0
+local logfilename = "sandbox.log"
+
+local function registerstats()
+ statistics.register("sandboxing", function()
+ if trace_files then
+ return string.format("%s calls, %s rejected, logdata in '%s'",nofcalls,nofrejected,logfilename)
+ else
+ return string.format("%s calls, %s rejected",nofcalls,nofrejected)
+ end
+ end)
+ registerstats = false
+end
+
+local function logsandbox(details)
+ local comment = details.comment
+ local result = details.result
+ local arguments = details.arguments
+ for i=1,#arguments do
+ local argument = arguments[i]
+ local t = type(argument)
+ if t == "string" then
+ arguments[i] = quoted(argument)
+ if trace_files and possiblepath(argument) then
+ local q = qualified[argument]
+ if q then
+ local c = q[comment]
+ if c then
+ local r = c[result]
+ if r then
+ c[result] = r + 1
+ else
+ c[result] = r
+ end
+ else
+ q[comment] = {
+ [result] = 1
+ }
+ end
+ else
+ qualified[argument] = {
+ [comment] = {
+ [result] = 1
+ }
+ }
+ end
+ end
+ elseif t == "table" then
+ arguments[i] = fastserialize(argument)
+ else
+ arguments[i] = tostring(argument)
+ end
+ end
+ if trace_calls then
+ report("%s(%,t) => %l",details.comment,arguments,result)
+ end
+ nofcalls = nofcalls + 1
+ if not result then
+ nofrejected = nofrejected + 1
+ end
+end
+
+local ioopen = sandbox.original(io.open)
+
+local function logsandboxfiles(name,what,asked,okay)
+ -- we're only interested in permitted access
+ if not okay then
+ blocked [asked] = blocked [asked] or 0 + 1
+ elseif what == "*" or what == "w" then
+ writeable[asked] = writeable[asked] or 0 + 1
+ else
+ readable [asked] = readable [asked] or 0 + 1
+ end
+end
+
+function sandbox.logcalls()
+ if not trace_calls then
+ trace_calls = true
+ sandbox.setlogger(logsandbox)
+ if registerstats then
+ registerstats()
+ end
+ end
+end
+
+function sandbox.logfiles()
+ if not trace_files then
+ trace_files = true
+ sandbox.setlogger(logsandbox)
+ sandbox.setfilenamelogger(logsandboxfiles)
+ luatex.registerstopactions(function()
+ table.save(logfilename,{
+ calls = {
+ nofcalls = nofcalls,
+ nofrejected = nofrejected,
+ filenames = qualified,
+ },
+ checkednames = {
+ readable = readable,
+ writeable = writeable,
+ blocked = blocked,
+ },
+ })
+ end)
+ if registerstats then
+ registerstats()
+ end
+ end
+end
+
+trackers.register("sandbox.tracecalls",sandbox.logcalls)
+trackers.register("sandbox.tracefiles",sandbox.logfiles)
+
+local sandboxing = environment.arguments.sandbox
+
+if sandboxing then
+
+ report("enabling sandbox")
+
+ sandbox.enable()
+
+ if type(sandboxing) == "string" then
+ sandboxing = utilities.parsers.settings_to_hash(sandboxing)
+ if sandboxing.calls then
+ sandbox.logcalls()
+ end
+ if sandboxing.files then
+ sandbox.logfiles()
+ end
+ end
+
+ -- Nicer would be if we could just disable write 18 and keep os.execute
+ -- which in fact we can do by defining write18 as macro instead of
+ -- primitive ... todo.
+
+ -- We block some potential escapes from protection.
+
+ context [[
+ \let\primitive \relax
+ \let\normalprimitive\relax
+ \let\normalwrite \relax
+ ]]
+
+end
+
+local function processjob()
+
+ environment.initializefilenames() -- todo: check if we really need to pre-prep the filename
+
+ local arguments = environment.arguments
+ local suffix = environment.suffix
+ local filename = environment.filename -- hm, not inputfilename !
+
+ if not filename or filename == "" then
+ -- skip
+ elseif suffix == "xml" or arguments.forcexml then
+
+ -- Maybe we should move the preamble parsing here as it
+ -- can be part of (any) loaded (sub) file. The \starttext
+ -- wrapping might go away.
+
+ report("processing as xml: %s",filename)
+
+ context.starttext()
+ context.xmlprocess("main",filename,"")
+ context.stoptext()
+
+ elseif suffix == "cld" or arguments.forcecld then
+
+ report("processing as cld: %s",filename)
+
+ context.runfile(filename)
+
+ elseif suffix == "lua" or arguments.forcelua then
+
+ -- The wrapping might go away. Why is is it there in the
+ -- first place.
+
+ report("processing as lua: %s",filename)
+
+ context.starttext()
+ context.ctxlua(string.format('dofile("%s")',filename))
+ context.stoptext()
+
+ elseif suffix == "mp" or arguments.forcemp then
+
+ report("processing as metapost: %s",filename)
+
+ context.starttext()
+ context.processMPfigurefile(filename)
+ context.stoptext()
+
+ -- elseif suffix == "prep" then
+ --
+ -- -- Why do we wrap here. Because it can be xml? Let's get rid
+ -- -- of prepping in general.
+ --
+ -- context.starttext()
+ -- context.input(filename)
+ -- context.stoptext()
+
+ else
+
+ -- \writestatus{system}{processing as tex}
+ -- We have a regular tex file so no \starttext yet as we can
+ -- load fonts.
+
+ -- context.enabletrackers { "resolvers.*" }
+ context.input(filename)
+ -- context.disabletrackers { "resolvers.*" }
+
+ end
+
+ context.finishjob()
+
+end
+
+implement {
+ name = "processjob",
+ onlyonce = true,
+ actions = processjob,
+}
diff --git a/Master/texmf-dist/tex/context/base/cont-run.mkiv b/Master/texmf-dist/tex/context/base/cont-run.mkiv
new file mode 100644
index 00000000000..fcca7b58133
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cont-run.mkiv
@@ -0,0 +1,20 @@
+%D \module
+%D [ file=cont-run,
+%D version=2014.12.26,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Runner,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Core Macros / Runner}
+
+\unprotect
+
+\registerctxluafile{cont-run}{1.001}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-yes.mkiv b/Master/texmf-dist/tex/context/base/cont-yes.mkiv
index 1a10fc30ec4..0b7f3231baf 100644
--- a/Master/texmf-dist/tex/context/base/cont-yes.mkiv
+++ b/Master/texmf-dist/tex/context/base/cont-yes.mkiv
@@ -15,79 +15,85 @@
% wraping as we can assume proper styling. It's a left-over from
% mkii that we need to get rid of.
-\startluacode
-
- -- When a style is loaded there is a good change that we never enter
- -- this code.
-
- local report = logs.reporter("system")
-
- environment.initializefilenames() -- todo: check if we really need to pre-prep the filename
-
- local arguments = environment.arguments
- local suffix = environment.suffix
- local filename = environment.filename -- hm, not inputfilename !
-
- if suffix == "xml" or arguments.forcexml then
-
- -- Maybe we should move the preamble parsing here as it
- -- can be part of (any) loaded (sub) file. The \starttext
- -- wrapping might go away.
-
- report("processing as xml: %s",filename)
-
- context.starttext()
- context.xmlprocess("main",filename,"")
- context.stoptext()
-
- elseif suffix == "cld" or arguments.forcecld then
-
- report("processing as cld: %s",filename)
-
- context.runfile(filename)
-
- elseif suffix == "lua" or arguments.forcelua then
-
- -- The wrapping might go away. Why is is it there in the
- -- first place.
-
- report("processing as lua: %s",filename)
-
- context.starttext()
- context.ctxlua(string.format('dofile("%s")',filename))
- context.stoptext()
-
- elseif suffix == "mp" or arguments.forcemp then
-
- report("processing as metapost: %s",filename)
-
- context.starttext()
- context.processMPfigurefile(filename)
- context.stoptext()
-
- -- elseif suffix == "prep" then
- --
- -- -- Why do we wrap here. Because it can be xml? Let's get rid
- -- -- of prepping in general.
- --
- -- context.starttext()
- -- context.input(filename)
- -- context.stoptext()
-
- else
-
- -- \writestatus{system}{processing as tex}
- -- We have a regular tex file so no \starttext yet as we can
- -- load fonts.
-
- -- context.enabletrackers { "resolvers.*" }
- context.input(filename)
- -- context.disabletrackers { "resolvers.*" }
-
- end
-
- context.finishjob()
-
-\stopluacode
+% now moved to cont-run.lua
+%
+% \startluacode
+%
+% -- When a style is loaded there is a good change that we never enter
+% -- this code.
+%
+% local report = logs.reporter("system")
+%
+% environment.initializefilenames() -- todo: check if we really need to pre-prep the filename
+%
+% local arguments = environment.arguments
+% local suffix = environment.suffix
+% local filename = environment.filename -- hm, not inputfilename !
+%
+% if suffix == "xml" or arguments.forcexml then
+%
+% -- Maybe we should move the preamble parsing here as it
+% -- can be part of (any) loaded (sub) file. The \starttext
+% -- wrapping might go away.
+%
+% report("processing as xml: %s",filename)
+%
+% context.starttext()
+% context.xmlprocess("main",filename,"")
+% context.stoptext()
+%
+% elseif suffix == "cld" or arguments.forcecld then
+%
+% report("processing as cld: %s",filename)
+%
+% context.runfile(filename)
+%
+% elseif suffix == "lua" or arguments.forcelua then
+%
+% -- The wrapping might go away. Why is is it there in the
+% -- first place.
+%
+% report("processing as lua: %s",filename)
+%
+% context.starttext()
+% context.ctxlua(string.format('dofile("%s")',filename))
+% context.stoptext()
+%
+% elseif suffix == "mp" or arguments.forcemp then
+%
+% report("processing as metapost: %s",filename)
+%
+% context.starttext()
+% context.processMPfigurefile(filename)
+% context.stoptext()
+%
+% -- elseif suffix == "prep" then
+% --
+% -- -- Why do we wrap here. Because it can be xml? Let's get rid
+% -- -- of prepping in general.
+% --
+% -- context.starttext()
+% -- context.input(filename)
+% -- context.stoptext()
+%
+% else
+%
+% -- \writestatus{system}{processing as tex}
+% -- We have a regular tex file so no \starttext yet as we can
+% -- load fonts.
+%
+% -- context.enabletrackers { "resolvers.*" }
+% context.input(filename)
+% -- context.disabletrackers { "resolvers.*" }
+%
+% end
+%
+% context.finishjob()
+%
+% \stopluacode
+
+% We don't want to be in protected mode!
+
+\getvalue{clf_processjob} % from cont-run.lua
\endinput
diff --git a/Master/texmf-dist/tex/context/base/context-version.pdf b/Master/texmf-dist/tex/context/base/context-version.pdf
index cf428c00ec4..9aee6f9bfda 100644
--- a/Master/texmf-dist/tex/context/base/context-version.pdf
+++ b/Master/texmf-dist/tex/context/base/context-version.pdf
Binary files differ
diff --git a/Master/texmf-dist/tex/context/base/context.mkiv b/Master/texmf-dist/tex/context/base/context.mkiv
index 9774f645ff1..034b403c409 100644
--- a/Master/texmf-dist/tex/context/base/context.mkiv
+++ b/Master/texmf-dist/tex/context/base/context.mkiv
@@ -11,6 +11,17 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+% Here is some timing (2015-04-01) luajittex format generation:
+%
+% 2.6 sec : normal make
+% 2.0 sec : with terminal output piped to file
+% 0.2 sec : format dumped
+% 0.2 sec : char-def/char-ini (no bytecode)
+%
+% So a format still saves some 1.5 seconds (with luajjitex) startup and
+% on network shares cq. when no files are cached by the os it's of course
+% much worse. A zero run is .27 sec with luajittex.
+
% Welcome to context, pronounced as kontekst (rather dutch) and not as
% conτεχt.
@@ -28,7 +39,7 @@
%D up and the dependencies are more consistent.
\edef\contextformat {\jobname}
-\edef\contextversion{2014.05.21 22:04}
+\edef\contextversion{2015.04.18 14:41}
\edef\contextkind {beta}
%D For those who want to use this:
@@ -99,6 +110,9 @@
% From here on we have \unexpanded being \normalprotected, as we already had
% \unexpanded long before etex came around.
+\loadmarkfile{luat-ini}
+\loadmarkfile{toks-ini}
+
\loadmarkfile{syst-aux}
\loadmarkfile{syst-lua}
\loadmarkfile{syst-con}
@@ -106,15 +120,20 @@
\loadmarkfile{syst-fnt}
\loadmarkfile{syst-rtp}
+\loadmarkfile{luat-usr}
+
+% \loadmarkfile{luat-ini} % moved up
+% \loadmarkfile{toks-ini} % moved up
+
\loadmkvifile{file-ini}
\loadmkvifile{file-res}
\loadmkvifile{file-lib}
\loadmarkfile{supp-dir}
-\loadmarkfile{char-ini}
-\loadmarkfile{char-utf}
-\loadmarkfile{char-act}
+\loadmarkfile{char-utf} % generic code (i.e. not much tex) ... could become unic-ini
+\loadmarkfile{char-ini} % tex / context specific
+\loadmarkfile{char-act} % even more specific
\loadmarkfile{mult-ini}
\loadmarkfile{mult-sys}
@@ -126,9 +145,10 @@
\loadmarkfile{cldf-int} % interface
-\loadmarkfile{luat-ini}
+% \loadmarkfile{luat-ini}
-\loadmarkfile{toks-ini}
+\loadmarkfile{toks-tra}
+%loadmarkfile{toks-map} % obsolete, never used
\loadmarkfile{attr-ini}
@@ -172,6 +192,8 @@
\loadmarkfile{typo-ini}
\loadmarkfile{typo-bld} % par builders
+\loadmarkfile{typo-inj}
+
\loadmkvifile{file-syn}
\loadmkvifile{file-mod}
@@ -184,6 +206,7 @@
\loadmarkfile{hand-ini}
\loadmarkfile{lang-ini}
+\loadmarkfile{lang-hyp}
\loadmarkfile{lang-lab}
\loadmarkfile{unic-ini}
@@ -221,6 +244,8 @@
\loadmkvifile{typo-prc}
+\loadmarkfile{anch-pos}
+
\loadmkvifile{strc-ini}
\loadmarkfile{strc-tag}
\loadmarkfile{strc-doc}
@@ -248,7 +273,7 @@
\loadmarkfile{spac-def}
\loadmarkfile{spac-grd}
-\loadmarkfile{anch-pos}
+%loadmarkfile{anch-pos}
\loadmkvifile{scrn-ini}
\loadmkvifile{scrn-ref}
@@ -386,6 +411,7 @@
\loadmarkfile{trac-jus}
\loadmarkfile{typo-cln}
+\loadmarkfile{typo-wrp}
\loadmarkfile{typo-spa}
\loadmarkfile{typo-krn}
\loadmkvifile{typo-itc}
@@ -397,6 +423,9 @@
\loadmkvifile{typo-txt}
\loadmarkfile{typo-drp}
\loadmarkfile{typo-fln}
+\loadmarkfile{typo-sus}
+\loadmarkfile{typo-lig}
+\loadmarkfile{typo-chr}
\loadmkvifile{type-ini}
\loadmarkfile{type-set}
@@ -408,7 +437,7 @@
\loadmarkfile{prop-ini} % only for downward compatibility
-\loadmarkfile{mlib-ctx}
+\loadmarkfile{mlib-ctx} % messy order
\loadmarkfile{meta-ini}
\loadmarkfile{meta-tex}
@@ -520,6 +549,8 @@
\loadmarkfile{back-exp}
+\loadmarkfile{cont-run} % the main runner (used in cont-yes.mkiv)
+
\setupcurrentlanguage[\defaultlanguagetag]
\prependtoks
diff --git a/Master/texmf-dist/tex/context/base/core-con.lua b/Master/texmf-dist/tex/context/base/core-con.lua
index 3ccfb3e23f3..be462e1d2f2 100644
--- a/Master/texmf-dist/tex/context/base/core-con.lua
+++ b/Master/texmf-dist/tex/context/base/core-con.lua
@@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['core-con'] = {
license = "see context related readme files"
}
+-- todo: split into char-lan.lua and core-con.lua
+
--[[ldx--
<p>This module implements a bunch of conversions. Some are more
efficient than their <l n='tex'/> counterpart, some are even
@@ -22,6 +24,7 @@ local P, C, Cs, lpegmatch = lpeg.P, lpeg.C, lpeg.Cs, lpeg.match
local context = context
local commands = commands
+local implement = interfaces.implement
local settings_to_array = utilities.parsers.settings_to_array
local allocate = utilities.storage.allocate
@@ -37,8 +40,8 @@ local languages = languages
converters.number = tonumber
converters.numbers = tonumber
-commands.number = context
-commands.numbers = context
+implement { name = "number", actions = context }
+implement { name = "numbers", actions = context }
-- to be reconsidered ... languages namespace here, might become local plus a register command
@@ -58,6 +61,14 @@ local counters = allocate {
0x006F, 0x0070, 0x0072, 0x0073, 0x0161,
0x0074, 0x0075, 0x0076, 0x007A, 0x017E
},
+ ['spanish'] = {
+ 0x0061, 0x0062, 0x0063, 0x0064, 0x0065,
+ 0x0066, 0x0067, 0x0068, 0x0069, 0x006A,
+ 0x006B, 0x006C, 0x006D, 0x006E, 0x00F1,
+ 0x006F, 0x0070, 0x0071, 0x0072, 0x0073,
+ 0x0074, 0x0075, 0x0076, 0x0077, 0x0078,
+ 0x0079, 0x007A
+ },
['greek'] = { -- this should be the lowercase table
-- 0x0391, 0x0392, 0x0393, 0x0394, 0x0395,
-- 0x0396, 0x0397, 0x0398, 0x0399, 0x039A,
@@ -129,6 +140,7 @@ counters['ar'] = counters['arabic']
counters['gr'] = counters['greek']
counters['g'] = counters['greek']
counters['sl'] = counters['slovenian']
+counters['es'] = counters['spanish']
counters['kr'] = counters['korean']
counters['kr-p'] = counters['korean-parent']
counters['kr-c'] = counters['korean-circle']
@@ -146,6 +158,9 @@ counters['koreannumerals'] = counters['korean']
counters['koreanparentnumerals'] = counters['korean-parent']
counters['koreancirclenumerals'] = counters['korean-circle']
+counters['sloveniannumerals'] = counters['slovenian']
+counters['spanishnumerals'] = counters['spanish']
+
local fallback = utfbyte('0')
local function chr(n,m)
@@ -189,6 +204,8 @@ converters.maxchrs = maxchrs
local lowercharacter = characters.lcchars
local uppercharacter = characters.ucchars
+local defaultcounter = counters.default
+
local function do_alphabetic(n,mapping,mapper,t) -- todo: make zero based variant (initial n + 1)
if not t then
t = { }
@@ -205,14 +222,17 @@ local function do_alphabetic(n,mapping,mapper,t) -- todo: make zero based varian
end
end
-function converters.alphabetic(n,code)
- return do_alphabetic(n,counters[code] or counters.default,lowercharacter)
+local function alphabetic(n,code)
+ return do_alphabetic(n,code and code ~= "" and counters[code] or defaultcounter,lowercharacter)
end
-function converters.Alphabetic(n,code)
- return do_alphabetic(n,counters[code] or counters.default,uppercharacter)
+local function Alphabetic(n,code)
+ return do_alphabetic(n,code and code ~= "" and counters[code] or defaultcounter,uppercharacter)
end
+converters.alphabetic = alphabetic
+converters.Alphabetic = Alphabetic
+
local lower_offset = 96
local upper_offset = 64
@@ -226,12 +246,13 @@ converters['A'] = converters.Characters
converters['AK'] = converters.Characters
converters['KA'] = converters.Characters
-function commands.alphabetic(n,c) context(do_alphabetic(n,counters[c],lowercharacter)) end
-function commands.Alphabetic(n,c) context(do_alphabetic(n,counters[c],uppercharacter)) end
-function commands.character (n) context(chr (n,lower_offset)) end
-function commands.Character (n) context(chr (n,upper_offset)) end
-function commands.characters(n) context(chrs(n,lower_offset)) end
-function commands.Characters(n) context(chrs(n,upper_offset)) end
+implement { name = "alphabetic", actions = { alphabetic, context }, arguments = { "integer", "string" } }
+implement { name = "Alphabetic", actions = { Alphabetic, context }, arguments = { "integer", "string" } }
+
+implement { name = "character", actions = { chr, context }, arguments = { "integer", lower_offset } }
+implement { name = "Character", actions = { chr, context }, arguments = { "integer", upper_offset } }
+implement { name = "characters", actions = { chrs, context }, arguments = { "integer", lower_offset } }
+implement { name = "Characters", actions = { chrs, context }, arguments = { "integer", upper_offset } }
local weekday = os.weekday -- moved to l-os
local isleapyear = os.isleapyear -- moved to l-os
@@ -257,20 +278,22 @@ converters.leapyear = leapyear
converters.nofdays = nofdays
converters.textime = textime
-function commands.weekday (day,month,year) context(weekday (day,month,year)) end
-function commands.leapyear(year) context(leapyear(year)) end -- rather useless, only for ifcase
-function commands.nofdays (year,month) context(nofdays (year,month)) end
-
-function commands.year () context(date("%Y")) end
-function commands.month () context(date("%m")) end
-function commands.hour () context(date("%H")) end
-function commands.minute () context(date("%M")) end
-function commands.second () context(date("%S")) end
-function commands.textime() context(textime()) end
-
-function commands.doifleapyearelse(year)
- commands.doifelse(isleapyear(year))
-end
+implement { name = "weekday", actions = { weekday, context }, arguments = { "integer", "integer", "integer" } }
+implement { name = "leapyear", actions = { leapyear, context }, arguments = { "integer" } }
+implement { name = "nofdays", actions = { nofdays, context }, arguments = { "integer", "integer" } }
+
+implement { name = "year", actions = { date, context }, arguments = "'%Y'" }
+implement { name = "month", actions = { date, context }, arguments = "'%m'" }
+implement { name = "hour", actions = { date, context }, arguments = "'%H'" }
+implement { name = "minute", actions = { date, context }, arguments = "'%M'" }
+implement { name = "second", actions = { date, context }, arguments = "'%S'" }
+implement { name = "textime", actions = { textime, context } }
+
+implement {
+ name = "doifelseleapyear",
+ actions = { isleapyear, commands.doifelse },
+ arguments = "integer"
+}
local roman = {
{ [0] = '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX' },
@@ -297,8 +320,17 @@ converters['R'] = converters.Romannumerals
converters['KR'] = converters.Romannumerals
converters['RK'] = converters.Romannumerals
-function commands.romannumerals(n) context(lower(toroman(n))) end
-function commands.Romannumerals(n) context( toroman(n)) end
+implement {
+ name = "romannumerals",
+ actions = { toroman, lower, context },
+ arguments = "integer",
+}
+
+implement {
+ name = "Romannumerals",
+ actions = { toroman, context },
+ arguments = "integer",
+}
--~ local small = {
--~ 0x0627, 0x066E, 0x062D, 0x062F, 0x0647, 0x0648, 0x0631
@@ -351,8 +383,17 @@ converters.toabjad = toabjad
function converters.abjadnumerals (n) return toabjad(n,false) end
function converters.abjadnodotnumerals(n) return toabjad(n,true ) end
-function commands.abjadnumerals (n) context(toabjad(n,false)) end
-function commands.abjadnodotnumerals(n) context(toabjad(n,true )) end
+implement {
+ name = "abjadnumerals",
+ actions = { toabjad, context },
+ arguments = { "integer", false }
+}
+
+implement {
+ name = "abjadnodotnumerals",
+ actions = { toabjad, context },
+ arguments = { "integer", true }
+}
local vector = {
normal = {
@@ -494,36 +535,59 @@ end
converters.tochinese = tochinese
-function converters.chinesenumerals (n) return tochinese(n,"normal") end
-function converters.chinesecapnumerals(n) return tochinese(n,"cap" ) end
-function converters.chineseallnumerals(n) return tochinese(n,"all" ) end
+function converters.chinesenumerals (n,how) return tochinese(n,how or "normal") end
+function converters.chinesecapnumerals(n) return tochinese(n,"cap") end
+function converters.chineseallnumerals(n) return tochinese(n,"all") end
converters['cn'] = converters.chinesenumerals
converters['cn-c'] = converters.chinesecapnumerals
converters['cn-a'] = converters.chineseallnumerals
-function commands.chinesenumerals (n) context(tochinese(n,"normal")) end
-function commands.chinesecapnumerals(n) context(tochinese(n,"cap" )) end
-function commands.chineseallnumerals(n) context(tochinese(n,"all" )) end
+implement {
+ name = "chinesenumerals",
+ actions = { tochinese, context },
+ arguments = { "integer", "string" }
+}
+
+-- this is a temporary solution: we need a better solution when we have
+-- more languages
+
+function converters.spanishnumerals(n) return alphabetic(n,"es") end
+function converters.Spanishnumerals(n) return Alphabetic(n,"es") end
+function converters.sloviannumerals(n) return alphabetic(n,"sl") end
+function converters.Sloviannumerals(n) return Alphabetic(n,"sl") end
+
+converters['characters:es'] = converters.spanishnumerals
+converters['characters:sl'] = converters.sloveniannumerals
+
+converters['Characters:es'] = converters.Spanishnumerals
+converters['Characters:sl'] = converters.Sloveniannumerals
converters.sequences = converters.sequences or { }
local sequences = converters.sequences
storage.register("converters/sequences", sequences, "converters.sequences")
-function converters.define(name,set)
+function converters.define(name,set) -- ,language)
+ -- if language then
+ -- name = name .. ":" .. language
+ -- end
sequences[name] = settings_to_array(set)
end
-commands.defineconversion = converters.define
+implement {
+ name = "defineconversion",
+ actions = converters.define,
+ arguments = { "string", "string" }
+}
-local function convert(method,n) -- todo: language
- local converter = converters[method]
+local function convert(method,n,language)
+ local converter = language and converters[method..":"..language] or converters[method]
if converter then
return converter(n)
else
local lowermethod = lower(method)
- local linguistic = counters[lowermethod]
+ local linguistic = counters[lowermethod]
if linguistic then
return do_alphabetic(n,linguistic,lowermethod == method and lowercharacter or uppercharacter)
end
@@ -535,18 +599,29 @@ local function convert(method,n) -- todo: language
else
return sequence[n]
end
- else
- return n
end
+ return n
end
end
converters.convert = convert
-function commands.checkedconversion(method,n)
- context(convert(method,n))
+local function valid(method,language)
+ return converters[method..":"..language] or converters[method] or sequences[method]
end
+implement {
+ name = "doifelseconverter",
+ actions = { valid, commands.doifelse },
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "checkedconversion",
+ actions = { convert, context },
+ arguments = { "string", "integer" }
+}
+
-- Well, since the one asking for this didn't test it the following code is not
-- enabled.
--
@@ -720,7 +795,7 @@ function converters.ordinal(n,language)
return t and t(n)
end
-function commands.ordinal(n,language)
+local function ctxordinal(n,language)
local t = language and ordinals[language]
local o = t and t(n)
context(n)
@@ -729,6 +804,12 @@ function commands.ordinal(n,language)
end
end
+implement {
+ name = "ordinal",
+ actions = ctxordinal,
+ arguments = { "string", "string" }
+}
+
-- verbose numbers
local data = allocate()
@@ -891,7 +972,7 @@ local words = {
[900] = "novecientos",
[1000] = "mil",
[1000^2] = "millón",
- [1000^3] = "mil millónes",
+ [1000^3] = "mil millones",
[1000^4] = "billón",
}
@@ -971,24 +1052,42 @@ function converters.verbose.translate(n,language)
return t and t.translate(n) or n
end
-function commands.verbose(n,language)
+local function verbose(n,language)
local t = language and data[language]
context(t and t.translate(n) or n)
end
+implement {
+ name = "verbose",
+ actions = verbose,
+ arguments = { "integer", "string" }
+}
+
-- These are just helpers but not really for the tex end. Do we have to
-- use translate here?
local whitespace = lpeg.patterns.whitespace
-local word = (1-whitespace) / characters.upper * (1-whitespace)^1
-local spacing = whitespace^1
-local pattern_one = Cs(word * P(1)^1)
-local pattern_all = Cs((word + spacing)^1)
+local word = lpeg.patterns.utf8uppercharacter^-1 * (1-whitespace)^1
+local pattern_one = Cs( whitespace^0 * word^-1 * P(1)^0)
+local pattern_all = Cs((whitespace^1 + word)^1)
+
+function converters.word (s) return s end -- dummies for typos
+function converters.words(s) return s end -- dummies for typos
+function converters.Word (s) return lpegmatch(pattern_one,s) or s end
+function converters.Words(s) return lpegmatch(pattern_all,s) or s end
+
+converters.upper = characters.upper
+converters.lower = characters.lower
-function converters.word (s) return s end
-function converters.words(s) return s end
-function converters.Word (s) return lpegmatch(pattern_one,s) end
-function converters.Words(s) return lpegmatch(pattern_all,s) end
+-- print(converters.Word("foo bar"))
+-- print(converters.Word(" foo bar"))
+-- print(converters.Word("123 foo bar"))
+-- print(converters.Word(" 123 foo bar"))
+
+-- print(converters.Words("foo bar"))
+-- print(converters.Words(" foo bar"))
+-- print(converters.Words("123 foo bar"))
+-- print(converters.Words(" 123 foo bar"))
-- --
@@ -1026,33 +1125,60 @@ local months = { -- not variables.january
"december",
}
-function commands.dayname(n)
- context.labeltext(days[n] or "unknown")
+local function dayname(n)
+ return days[n] or "unknown"
end
-function commands.weekdayname(day,month,year)
- context.labeltext(days[weekday(day,month,year)] or "unknown")
+local function weekdayname(day,month,year)
+ return days[weekday(day,month,year)] or "unknown"
end
-function commands.monthname(n)
- context.labeltext(months[n] or "unknown")
+local function monthname(n)
+ return months[n] or "unknown"
end
-function commands.monthmnem(n)
+local function monthmnem(n)
local m = months[n]
- context.labeltext(m and (m ..":mnem") or "unknown")
+ return m and (m ..":mnem") or "unknown"
end
+implement {
+ name = "dayname",
+ actions = { dayname, context.labeltext },
+ arguments = "integer",
+}
+
+implement {
+ name = "weekdayname",
+ actions = { weekdayname, context.labeltext },
+ arguments = { "integer", "integer", "integer" }
+}
+
+implement {
+ name = "monthname",
+ actions = { monthname, context.labeltext },
+ arguments = { "integer" }
+}
+
+implement {
+ name = "monthmnem",
+ actions = { monthmnem, context.labeltext },
+ arguments = { "integer" }
+}
+
-- a prelude to a function that we can use at the lua end
-- day:ord month:mmem
-- j and jj obsolete
-function commands.currentdate(str,currentlanguage) -- second argument false : no label
+local function currentdate(str,currentlanguage) -- second argument false : no label
local list = utilities.parsers.settings_to_array(str)
local splitlabel = languages.labels.split or string.itself -- we need to get the loading order right
local year, month, day = tex.year, tex.month, tex.day
local auto = true
+ if currentlanguage == "" then
+ currentlanguage = false
+ end
for i=1,#list do
local entry = list[i]
local tag, plus = splitlabel(entry)
@@ -1078,9 +1204,9 @@ function commands.currentdate(str,currentlanguage) -- second argument false : no
if currentlanguage == false then
context(months[month] or "unknown")
elseif mnemonic then
- commands.monthmnem(month)
+ context.labeltext(monthmnem(month))
else
- commands.monthname(month)
+ context.labeltext(monthname(month))
end
elseif tag == "mm" then
context("%02i",month)
@@ -1090,7 +1216,7 @@ function commands.currentdate(str,currentlanguage) -- second argument false : no
if currentlanguage == false then
context(days[day] or "unknown")
else
- context.convertnumber(v_day,day)
+ context.convertnumber(v_day,day) -- why not direct
end
whatordinal = day
elseif tag == "dd" then
@@ -1104,7 +1230,7 @@ function commands.currentdate(str,currentlanguage) -- second argument false : no
if currentlanguage == false then
context(days[wd] or "unknown")
else
- commands.dayname(wd)
+ context.labeltext(days[wd] or "unknown")
end
elseif tag == "W" then
context(weekday(day,month,year))
@@ -1127,6 +1253,20 @@ function commands.currentdate(str,currentlanguage) -- second argument false : no
end
end
-function commands.rawdate(str)
- commands.currentdate(str,false)
-end
+implement {
+ name = "currentdate",
+ actions = currentdate,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "rawdate",
+ actions = currentdate,
+ arguments = { "string", false }
+}
+
+implement {
+ name = "unihex",
+ actions = { formatters["U+%05X"], context },
+ arguments = "integer"
+}
diff --git a/Master/texmf-dist/tex/context/base/core-con.mkiv b/Master/texmf-dist/tex/context/base/core-con.mkiv
index 47c7c88d590..f7d718f4482 100644
--- a/Master/texmf-dist/tex/context/base/core-con.mkiv
+++ b/Master/texmf-dist/tex/context/base/core-con.mkiv
@@ -67,44 +67,43 @@
%D \showsetup{romannumerals}
%D \showsetup{Romannumerals}
-\def\romannumerals#1{\ctxcommand{romannumerals(\number#1)}}
-\def\Romannumerals#1{\ctxcommand{Romannumerals(\number#1)}}
+\def\romannumerals#1{\clf_romannumerals\numexpr#1\relax}
+\def\Romannumerals#1{\clf_Romannumerals\numexpr#1\relax}
%D Arabic etc:
-\def\abjadnumerals #1{\ctxcommand{abjadnumerals (\number#1)}}
-\def\abjadnodotnumerals#1{\ctxcommand{abjadnodotnumerals(\number#1)}}
-\def\abjadnaivenumerals#1{\ctxcommand{arabicnumerals (\number#1)}}
+\def\abjadnumerals #1{\clf_abjadnumerals \numexpr#1\relax}
+\def\abjadnodotnumerals#1{\clf_abjadnodotnumerals\numexpr#1\relax}
+\def\abjadnaivenumerals#1{\clf_alphabetic \numexpr#1\relax{arabic}} % okay?
-\def\languagecharacters#1{\ctxcommand{alphabetic(\number#1,"\currentlanguage")}} % new
-\def\languageCharacters#1{\ctxcommand{Alphabetic(\number#1,"\currentlanguage")}} % new
+\def\languagecharacters#1{\clf_alphabetic\numexpr#1\relax{\currentlanguage}} % new
+\def\languageCharacters#1{\clf_Alphabetic\numexpr#1\relax{\currentlanguage}} % new
-% we could use an auxiliary macro to save some bytes in the format
-%
-% \def\dolanguagecharacters#1#2{\ctxcommand{alphabetic(\number#2,"#1")}}
-
-\def\thainumerals #1{\ctxcommand{alphabetic(\number#1,"thai")}}
-\def\devanagarinumerals#1{\ctxcommand{alphabetic(\number#1,"devanagari")}}
-\def\gurmurkhinumerals #1{\ctxcommand{alphabetic(\number#1,"gurmurkhi")}}
-\def\gujaratinumerals #1{\ctxcommand{alphabetic(\number#1,"gujarati")}}
-\def\tibetannumerals #1{\ctxcommand{alphabetic(\number#1,"tibetan")}}
-\def\greeknumerals #1{\ctxcommand{alphabetic(\number#1,"greek")}}
-\def\Greeknumerals #1{\ctxcommand{Alphabetic(\number#1,"greek")}}
-\def\arabicnumerals #1{\ctxcommand{alphabetic(\number#1,"arabic")}}
-\def\persiannumerals #1{\ctxcommand{alphabetic(\number#1,"persian")}}
+\def\alphabeticnumerals#1{\clf_alphabetic\numexpr#1\relax{}}
+\def\Alphabeticnumerals#1{\clf_Alphabetic\numexpr#1\relax{}}
+
+\def\thainumerals #1{\clf_alphabetic\numexpr#1\relax{thai}}
+\def\devanagarinumerals#1{\clf_alphabetic\numexpr#1\relax{devanagari}}
+\def\gurmurkhinumerals #1{\clf_alphabetic\numexpr#1\relax{gurmurkhi}}
+\def\gujaratinumerals #1{\clf_alphabetic\numexpr#1\relax{gujarati}}
+\def\tibetannumerals #1{\clf_alphabetic\numexpr#1\relax{tibetan}}
+\def\greeknumerals #1{\clf_alphabetic\numexpr#1\relax{greek}}
+\def\Greeknumerals #1{\clf_Alphabetic\numexpr#1\relax{greek}}
+\def\arabicnumerals #1{\clf_alphabetic\numexpr#1\relax{arabic}}
+\def\persiannumerals #1{\clf_alphabetic\numexpr#1\relax{persian}}
\let\arabicexnumerals \persiannumerals
-\def\koreannumerals #1{\ctxcommand{alphabetic(\number#1,"korean")}}
-\def\koreannumeralsp #1{\ctxcommand{alphabetic(\number#1,"korean-parent")}}
-\def\koreannumeralsc #1{\ctxcommand{alphabetic(\number#1,"korean-circle")}}
+\def\koreannumerals #1{\clf_alphabetic\numexpr#1\relax{korean}}
+\def\koreannumeralsp #1{\clf_alphabetic\numexpr#1\relax{korean-parent}}
+\def\koreannumeralsc #1{\clf_alphabetic\numexpr#1\relax{korean-circle}}
\let\koreanparentnumerals\koreannumeralsp
\let\koreancirclenumerals\koreannumeralsc
-\def\chinesenumerals #1{\ctxcommand{chinesenumerals (\number#1)}}
-\def\chinesecapnumerals#1{\ctxcommand{chinesecapnumerals(\number#1,"cap")}}
-\def\chineseallnumerals#1{\ctxcommand{chineseallnumerals(\number#1,"all")}}
+\def\chinesenumerals #1{\clf_chinesenumerals\numexpr#1\relax{normal}}
+\def\chinesecapnumerals#1{\clf_chinesenumerals\numexpr#1\relax{cap}}
+\def\chineseallnumerals#1{\clf_chinesenumerals\numexpr#1\relax{all}}
%D \macros
%D {character,Character}
@@ -124,8 +123,8 @@
\def\unknowncharacter{-} % else in lists \relax
-\def\character#1{\ctxcommand{character(\number#1)}}
-\def\Character#1{\ctxcommand{Character(\number#1)}}
+\def\character#1{\clf_character\numexpr#1\relax}
+\def\Character#1{\clf_Character\numexpr#1\relax}
%D \macros
%D {characters,Characters}
@@ -136,8 +135,8 @@
%D \showsetup{characters}
%D \showsetup{Characters}
-\def\characters#1{\ctxcommand{characters(\number#1)}}
-\def\Characters#1{\ctxcommand{Characters(\number#1)}}
+\def\characters#1{\clf_characters\numexpr#1\relax}
+\def\Characters#1{\clf_Characters\numexpr#1\relax}
%D \macros
%D {greeknumerals,Greeknumerals}
@@ -206,8 +205,8 @@
%D
%D Anyhow, the conversion looks like:
-\unexpanded\def\monthlong #1{\ctxcommand{monthname(#1)}}
-\unexpanded\def\monthshort#1{\ctxcommand{monthmnem(#1)}}
+\unexpanded\def\monthlong #1{\clf_monthname\numexpr#1\relax}
+\unexpanded\def\monthshort#1{\clf_monthmnem\numexpr#1\relax}
\let\convertmonth\monthlong % for old times sake
@@ -240,16 +239,16 @@
%D \showsetup{weekday}
%D \showsetup{WEEKDAY}
-\unexpanded\def\weekday#1{\ctxcommand{day(#1)}}
-\unexpanded\def\WEEKDAY#1{\WORD{\weekday{#1}}}
+\unexpanded\def\weekday#1{\clf_day\numexpr#1\relax}
+\unexpanded\def\WEEKDAY#1{\WORD{\clf_day\numexpr#1\relax}}
%D \macros
%D {getdayoftheweek, dayoftheweek}
\newcount\normalweekday
- \def\dayoftheweek #1#2#3{\ctxcommand{weekdayname(\number#1,\number#2,\number#3)}} % name
-\unexpanded\def\getdayoftheweek#1#2#3{\normalweekday\ctxcommand{weekday(\number#1,\number#2,\number#3)}\relax} % number
+ \def\dayoftheweek #1#2#3{\clf_weekdayname\numexpr#1\relax\numexpr#2\relax,\numexpr#3\relax} % name
+\unexpanded\def\getdayoftheweek#1#2#3{\normalweekday\clf_weekday\numexpr#1\relax\numexpr#2\relax,\numexpr#3\relax\relax} % number
%D Using this macro in
%D
@@ -294,14 +293,16 @@
%D
%D The number of days is available in the macro \type {\numberofdays}.
-\def\doifleapyearelse#1%
- {\ctxcommand{doifleapyearelse(\number#1)}}
+\def\doifelseleapyear#1%
+ {\clf_doifelseleapyear\numexpr#1\relax}
+
+\let\doifleapyearelse\doifelseleapyear
\unexpanded\def\getdayspermonth#1#2%
- {\edef\numberofdays{\ctxcommand{nofdays(\number#1,\number#2)}}}
+ {\edef\numberofdays{\clf_nofdays\numexpr#1\relax\numexpr#2\relax}}
\def\dayspermonth#1#2%
- {\ctxcommand{nofdays(\number#1,\number#2)}}
+ {\clf_nofdays\numexpr#1\relax\numexpr#2\relax}
% \dayoftheweek{2006}{9}{15}
% \doifleapyearelse{2000}{OK}{NOT OK}
@@ -413,7 +414,7 @@
{\begingroup
\the\everycurrentdate
\doifsomething{#1}{\edef\currentdatespecification{#1}}%
- \ctxcommand{currentdate(\!!bs\currentdatespecification\!!es,"\labellanguage")}%
+ \clf_currentdate{\currentdatespecification}{\labellanguage}%
\endgroup}
\unexpanded\def\date
@@ -434,7 +435,7 @@
\endgroup}
\def\rawdate[#1]% expandable and no labels
- {\ctxcommand{rawdate(\!!bs\currentdatespecification\!!es)}}
+ {\clf_rawdate{\currentdatespecification}}
%D \macros
%D {currenttime}
@@ -443,9 +444,9 @@
%D to the previous date macro using the keys \type {h}, \type {m} and a separator.
\unexpanded\def\calculatecurrenttime
- {\edef\currenthour {\ctxcommand{hour ()}}%
- \edef\currentminute{\ctxcommand{minute()}}%
- \edef\currentsecond{\ctxcommand{second()}}}
+ {\edef\currenthour {\clf_hour }%
+ \edef\currentminute{\clf_minute}%
+ \edef\currentsecond{\clf_second}}
\let\currenthour \!!plusone
\let\currentminute\!!plusone
@@ -454,7 +455,7 @@
\def\currenttimespecification{h,:,m}
\unexpanded\def\currenttime
- {\doifnextoptionalelse\syst_converters_current_time_yes\syst_converters_current_time_nop}
+ {\doifelsenextoptional\syst_converters_current_time_yes\syst_converters_current_time_nop}
\unexpanded\def\syst_converters_current_time_yes[#1]%
{\calculatecurrenttime
@@ -520,6 +521,13 @@
\installcorenamespace {conversionarguments}
\installcorenamespace {conversionwords}
+%D It might be better to move more to lua as we also need conversion there
+%D and doublicating logic doesn't make things cleaner. It means that all
+%D conversions will get a language argument too. However, we permit definitions
+%D at the \TEX\ end so we have to provide some hybrid method.
+
+% checkedconversion(method,n,language)
+
\unexpanded\def\defineconversion
{\dotripleempty\syst_converters_define_conversion}
@@ -531,13 +539,13 @@
\fi}
\def\syst_converters_define_conversion_indeed#1#2#3%
- {\doifinstringelse{,}{\detokenize{#3}}
- {\ctxcommand{defineconversion("#2",\!!bs\detokenize{#3}\!!es)}%
+ {\doifelseinstring{,}{\detokenize{#3}}
+ {\clf_defineconversion{#2}{\detokenize{#3}}% a set e.g. of symbols
\setgvalue{\??conversion#1}{\syst_converters_checked_conversion{#2}}}
{\setgvalue{\??conversion#1}{#3}}}
\def\syst_converters_checked_conversion#1#2%
- {\ctxcommand{checkedconversion("#1",#2)}}
+ {\clf_checkedconversion{#1}\numexpr#2\relax}
%D If a conversion is just a font switch then we need to make sure that the
%D number is indeed ends up as number in the input, so we need to handle the
@@ -557,7 +565,11 @@
\setvalue{\??conversionarguments2}#1{\csname\??conversion #1\endcsname}
\letvalue{\??conversionarguments3}\syst_converters_checked_conversion
-\def\doifconversiondefinedelse#1%
+% we can also add a \ctxcommand{doifelseconversion("#1","\currentlanguage")} to check
+% if we have definitions that are not matched at the lua end .. eventually we might do
+% that when more shows up
+
+\def\doifelseconversiondefined#1%
{\ifcsname\??conversion\currentlanguage#1\endcsname
\expandafter\firstoftwoarguments
\else\ifcsname\??conversion#1\endcsname
@@ -573,6 +585,9 @@
\expandafter\secondoftwoarguments
\fi}
+\let\doifconversiondefinedelse\doifelseconversiondefined
+\let\doifconversionnumberelse \doifelseconversionnumber
+
%D Handy.
\setvalue{\??conversionwords\v!one }{1}
@@ -595,10 +610,10 @@
\def\highordinalstr #1{\high{\notsmallcapped{#1}}}
\def\ordinalstr #1{\notsmallcapped{#1}}
-\def\ordinaldaynumber #1{\ctxcommand{ordinal(#1,"\currentlanguage")}}
+\def\ordinaldaynumber #1{\clf_ordinal\numexpr#1\relax{\currentlanguage}}
-\def\verbosenumber #1{\ctxcommand{verbose(#1,"\currentlanguage")}}
-\def\VerboseNumber #1{\Words{\ctxcommand{verbose(#1,"\currentlanguage")}}}
+\def\verbosenumber #1{\clf_verbose\numexpr#1\relax{\currentlanguage}}
+\def\VerboseNumber #1{\Words{\clf_verbose\numexpr#1\relax{\currentlanguage}}}
%D As longs as symbols are linked to levels or numbers, we can also use the
%D conversion mechanism, but in for instance the itemization macros, we prefer
@@ -627,6 +642,9 @@
\defineconversion [AK] [\smallcappedcharacters]
\defineconversion [KA] [\smallcappedcharacters]
+\defineconversion [\v!alphabetic] [\alphabeticnumerals]
+\defineconversion [\v!Alphabetic] [\Alphabeticnumerals]
+
\defineconversion [\v!number] [\numbers]
\defineconversion [\v!numbers] [\numbers]
\defineconversion [\v!Numbers] [\Numbers]
@@ -662,6 +680,9 @@
\defineconversion [g] [\greeknumerals]
\defineconversion [G] [\Greeknumerals]
+%defineconversion [ñ] [\spanishnumerals]
+%defineconversion [Ñ] [\Spanishnumerals]
+
\defineconversion [abjadnumerals] [\abjadnumerals]
\defineconversion [abjadnodotnumerals] [\adjadnodotnumerals]
\defineconversion [abjadnaivenumerals] [\adjadnaivenumerals]
@@ -693,6 +714,46 @@
\defineconversion [cn-c] [\chinesecapnumerals]
\defineconversion [cn-a] [\chineseallnumerals]
+%D Moved from lang-def.mkiv:
+%D
+%D Define these as the general character enumeration when language is Slovenian. If
+%D you feel uncomfortable with this, mail Mojca, since she promised to to take the
+%D heat. Pablo was next to request this. We changed characters to numerals for this
+%D feature. We do need these definitions for mechanisms like itemize that check
+%D for converters.
+
+\def\sloveniannumerals#1{\clf_alphabetic\numexpr#1\relax{sl}}
+\def\slovenianNumerals#1{\clf_Alphabetic\numexpr#1\relax{sl}}
+
+\def\spanishnumerals #1{\clf_alphabetic\numexpr#1\relax{es}}
+\def\spanishNumerals #1{\clf_Alphabetic\numexpr#1\relax{es}}
+
+\defineconversion [\s!sl] [character] [\sloveniannumerals]
+\defineconversion [\s!sl] [Character] [\slovenianNumerals]
+\defineconversion [\s!sl] [characters] [\sloveniannumerals]
+\defineconversion [\s!sl] [Characters] [\slovenianNumerals]
+
+\defineconversion [\s!sl] [a] [\sloveniannumerals]
+\defineconversion [\s!sl] [A] [\slovenianNumerals]
+\defineconversion [\s!sl] [AK] [\smallcapped\sloveniannumerals]
+\defineconversion [\s!sl] [KA] [\smallcapped\sloveniannumerals]
+
+\defineconversion [\s!es] [character] [\spanishnumerals]
+\defineconversion [\s!es] [Character] [\spanishNumerals]
+\defineconversion [\s!es] [characters] [\spanishnumerals]
+\defineconversion [\s!es] [Characters] [\spanishNumerals]
+
+\defineconversion [\s!es] [a] [\spanishnumerals]
+\defineconversion [\s!es] [A] [\spanishNumerals]
+\defineconversion [\s!es] [AK] [\smallcapped\spanishnumerals]
+\defineconversion [\s!es] [KA] [\smallcapped\spanishnumerals]
+
+\defineconversion [sloveniannumerals] [\sloveniannumerals]
+\defineconversion [slovenianNumerals] [\slovenianNumerals]
+
+\defineconversion [spanishnumerals] [\spanishnumerals]
+\defineconversion [spanishNumerals] [\spanishNumerals]
+
%D In case a font has no greek (WS):
\defineconversion [mathgreek]
@@ -701,6 +762,10 @@
\m{ν},\m{ξ},\m{ο},\m{π},\m{ρ},\m{σ},
\m{τ},\m{υ},\m{φ},\m{χ},\m{ψ},\m{ω}]
+%D Handy too (expanded!):
+
+\def\unihex#1{\clf_unihex\numexpr#1\relax}
+
%D Symbol sets:
\ifdefined\symbol \else \def\symbol[#1]{#1} \fi % todo
diff --git a/Master/texmf-dist/tex/context/base/core-ctx.lua b/Master/texmf-dist/tex/context/base/core-ctx.lua
index 18978a53021..c20691cd7be 100644
--- a/Master/texmf-dist/tex/context/base/core-ctx.lua
+++ b/Master/texmf-dist/tex/context/base/core-ctx.lua
@@ -39,12 +39,12 @@ local xmltext = xml.text
local report_prepfiles = logs.reporter("system","prepfiles")
-commands = commands or { }
-local commands = commands
+local commands = commands
+local implement = interfaces.implement
-ctxrunner = ctxrunner or { }
+ctxrunner = ctxrunner or { }
-ctxrunner.prepfiles = utilities.storage.allocate()
+ctxrunner.prepfiles = utilities.storage.allocate()
local function dontpreparefile(t,k)
return k -- we only store when we have a prepper
@@ -254,7 +254,7 @@ function ctxrunner.load(ctxname)
for i=1,#runners do
local command = runners[i]
report_prepfiles("command: %s",command)
- local result = os.spawn(command) or 0
+ local result = os.execute(command) or 0
-- if result > 0 then
-- report_prepfiles("error, return code: %s",result)
-- end
@@ -301,35 +301,55 @@ local function resolve(name) -- used a few times later on
return ctxrunner.prepfiles[file.collapsepath(name)] or false
end
-local processfile = commands.processfile
-local doifinputfileelse = commands.doifinputfileelse
-
-function commands.processfile(name,maxreadlevel) -- overloaded
- local prepname = resolve(name)
- if prepname then
- return processfile(prepname,0)
- end
- return processfile(name,maxreadlevel)
+function ctxrunner.preparedfile(name)
+ return resolve(name) or name
end
-function commands.doifinputfileelse(name,depth)
- local prepname = resolve(name)
- if prepname then
- return doifinputfileelse(prepname,0)
+local processfile = commands.processfile
+local doifelseinputfile = commands.doifelseinputfile
+
+implement {
+ name = "processfile",
+ overload = true,
+ arguments = { "string", "integer" },
+ actions = function(name,maxreadlevel) -- overloaded
+ local prepname = resolve(name)
+ if prepname then
+ return processfile(prepname,0)
+ end
+ return processfile(name,maxreadlevel)
end
- return doifinputfileelse(name,depth)
-end
+}
-function commands.preparedfile(name)
- return resolve(name) or name
-end
+implement {
+ name = "doifelseinputfile",
+ overload = true,
+ arguments = { "string", "integer" },
+ actions = function(name,depth)
+ local prepname = resolve(name)
+ if prepname then
+ return doifelseinputfile(prepname,0)
+ end
+ return doifelseinputfile(name,depth)
+ end
+}
-function commands.getctxfile()
- local ctxfile = document.arguments.ctx or ""
- if ctxfile ~= "" then
- ctxrunner.load(ctxfile) -- do we need to locate it?
+-- implement {
+-- name = "preparedfile", -- not used
+-- arguments = "string",
+-- actions = { ctxrunner.preparedfile, context }
+-- }
+
+implement {
+ name = "setdocumentctxfile",
+ onlyonce = true,
+ actions = function()
+ local ctxfile = document.arguments.ctx or ""
+ if ctxfile ~= "" then
+ ctxrunner.load(ctxfile) -- do we need to locate it?
+ end
end
-end
+}
function ctxrunner.resolve(name) -- used a few times later on
local collapsedname = file.collapsepath(name,".")
diff --git a/Master/texmf-dist/tex/context/base/core-ctx.mkiv b/Master/texmf-dist/tex/context/base/core-ctx.mkiv
index 59115621aa7..e6372d0996a 100644
--- a/Master/texmf-dist/tex/context/base/core-ctx.mkiv
+++ b/Master/texmf-dist/tex/context/base/core-ctx.mkiv
@@ -17,11 +17,13 @@
\unprotect
-\unexpanded\def\job_options_get_commandline {\ctxcommand{getcommandline()}}
-\unexpanded\def\job_options_get_ctxfile {\ctxcommand{getctxfile()}}
-\unexpanded\def\job_options_set_modes {\ctxcommand{setdocumentmodes()}}
-\unexpanded\def\job_options_set_modules {\ctxcommand{setdocumentmodules()}}
-\unexpanded\def\job_options_set_environments{\ctxcommand{setdocumentenvironments()}}
-\unexpanded\def\job_options_set_filenames {\ctxcommand{setdocumentfilenames()}}
+% called directly in core-def.mkiv
+%
+% \unexpanded\def\job_options_get_commandline {\clf_setdocumentcommandline}
+% \unexpanded\def\job_options_get_ctxfile {\clf_setdocumentctxfile}
+% \unexpanded\def\job_options_set_modes {\clf_setdocumentmodes}
+% \unexpanded\def\job_options_set_modules {\clf_setdocumentmodules}
+% \unexpanded\def\job_options_set_environments{\clf_setdocumentenvironments}
+% \unexpanded\def\job_options_set_filenames {\clf_setdocumentfilenames}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/core-dat.lua b/Master/texmf-dist/tex/context/base/core-dat.lua
index 242d362d0f6..ca6ec43730c 100644
--- a/Master/texmf-dist/tex/context/base/core-dat.lua
+++ b/Master/texmf-dist/tex/context/base/core-dat.lua
@@ -13,7 +13,8 @@ replaces the twopass data mechanism.</p>
local tonumber, tostring, type = tonumber, tostring, type
-local context, commands = context, commands
+local context = context
+local commands = commands
local trace_datasets = false trackers.register("job.datasets" , function(v) trace_datasets = v end)
local trace_pagestates = false trackers.register("job.pagestates", function(v) trace_pagestates = v end)
@@ -33,6 +34,8 @@ local v_yes = interfaces.variables.yes
local new_latelua = nodes.pool.latelua
+local implement = interfaces.implement
+
local collected = allocate()
local tobesaved = allocate()
@@ -138,7 +141,7 @@ function datasets.getdata(name,tag,key,default)
return default
end
-function commands.setdataset(settings)
+local function setdataset(settings)
settings.convert = true
local name, tag = setdata(settings)
if settings.delay ~= v_yes then
@@ -150,7 +153,7 @@ function commands.setdataset(settings)
end
end
-function commands.datasetvariable(name,tag,key)
+local function datasetvariable(name,tag,key)
local t = collected[name]
if t == nil then
if trace_datasets then
@@ -175,6 +178,25 @@ function commands.datasetvariable(name,tag,key)
end
end
+implement {
+ name = "setdataset",
+ actions = setdataset,
+ arguments = {
+ {
+ { "name" },
+ { "tag" },
+ { "delay" },
+ { "data" },
+ }
+ }
+}
+
+implement {
+ name = "datasetvariable",
+ actions = datasetvariable,
+ arguments = { "string", "string", "string" }
+}
+
--[[ldx--
<p>We also provide an efficient variant for page states.</p>
--ldx]]--
@@ -245,7 +267,7 @@ function pagestates.realpage(name,tag,default)
return default
end
-function commands.setpagestate(settings)
+local function setpagestate(settings)
local name, tag, data = setstate(settings)
if type(tag) == "number" then
context(new_latelua(formatters["job.pagestates.extend(%q,%i)"](name,tag)))
@@ -254,7 +276,7 @@ function commands.setpagestate(settings)
end
end
-function commands.pagestaterealpage(name,tag)
+local function pagestaterealpage(name,tag)
local t = collected[name]
t = t and (t[tag] or t[tonumber(tag)])
if t then
@@ -262,8 +284,32 @@ function commands.pagestaterealpage(name,tag)
end
end
-function commands.setpagestaterealpageno(name,tag)
+local function setpagestaterealpageno(name,tag)
local t = collected[name]
t = t and (t[tag] or t[tonumber(tag)])
texsetcount("realpagestateno",t or texgetcount("realpageno"))
end
+
+implement {
+ name = "setpagestate",
+ actions = setpagestate,
+ arguments = {
+ {
+ { "name" },
+ { "tag" },
+ { "delay" },
+ }
+ }
+}
+
+implement {
+ name = "pagestaterealpage",
+ actions = pagestaterealpage,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "setpagestaterealpageno",
+ actions = setpagestaterealpageno,
+ arguments = { "string", "string" }
+}
diff --git a/Master/texmf-dist/tex/context/base/core-dat.mkiv b/Master/texmf-dist/tex/context/base/core-dat.mkiv
index 5aef39d691a..26b1f14b5c0 100644
--- a/Master/texmf-dist/tex/context/base/core-dat.mkiv
+++ b/Master/texmf-dist/tex/context/base/core-dat.mkiv
@@ -51,26 +51,26 @@
\def\syst_datasets_set_named[#1][#2][#3]%
{\begingroup
\edef\currentdataset{#1}%
- \ctxcommand{setdataset{
- name = "\currentdataset",
- tag = \!!bs#2\!!es,
- delay = "\datasetparameter\c!delay",
- data = \!!bs#3\!!es
- }}%
+ \clf_setdataset
+ name {\currentdataset}%
+ tag {#2}%
+ delay {\datasetparameter\c!delay}%
+ data {#3}%
+ \relax
\endgroup}
\def\syst_datasets_set_indexed[#1][#2][#3]%
{\begingroup
\edef\currentdataset{#1}%
- \ctxcommand{setdataset{
- name = "\currentdataset",
- delay = "\datasetparameter\c!delay",
- data = \!!bs#2\!!es
- }}%
+ \clf_setdataset
+ name {\currentdataset}%
+ delay {\datasetparameter\c!delay}%
+ data {#2}%
+ \relax
\endgroup}
\def\datasetvariable#1#2#3%
- {\ctxcommand{datasetvariable("#1","#2","#3")}}
+ {\clf_datasetvariable{#1}{#2}{#3}}
\installcorenamespace{pagestate}
@@ -85,17 +85,17 @@
\def\syst_pagestates_set[#1][#2]%
{\begingroup
\edef\currentpagestate{#1}%
- \ctxcommand{setpagestate{
- name = "\currentpagestate",
- tag = \!!bs#2\!!es,
- delay = "\pagestateparameter\c!delay",
- }}%
+ \clf_setpagestate
+ name {\currentpagestate}%
+ tag {#2}%
+ delay {\pagestateparameter\c!delay}%
+ \relax
\endgroup}
\def\pagestaterealpage#1#2%
- {\ctxcommand{pagestaterealpage("#1","#2")}}
+ {\clf_pagestaterealpage{#1}{#2}}
\def\setpagestaterealpageno#1#2%
- {\ctxcommand{setpagestaterealpageno("#1","#2")}}
+ {\clf_setpagestaterealpageno{#1}{#2}}
\protect
diff --git a/Master/texmf-dist/tex/context/base/core-def.mkiv b/Master/texmf-dist/tex/context/base/core-def.mkiv
index 99bed6d34d6..acd411faccb 100644
--- a/Master/texmf-dist/tex/context/base/core-def.mkiv
+++ b/Master/texmf-dist/tex/context/base/core-def.mkiv
@@ -107,17 +107,17 @@
\initializenewlinechar
\calculatecurrenttime
\syst_files_load
- \job_options_get_commandline % expands some commands
- \job_options_get_ctxfile % might expand some commands
- \job_options_set_filenames
+ \clf_setdocumentcommandline
+ \clf_setdocumentctxfile
+ \clf_setdocumentfilenames
\font_preloads_at_every_job
\settopskip % brrr
\initializemainlanguage
\initializepagebackgrounds
\initializepagecounters
- \job_options_set_modes
- \job_options_set_modules
- \job_options_set_environments
+ \clf_setdocumentmodes
+ \clf_setdocumentmodules
+ \clf_setdocumentenvironments
\to \everyjob
\appendtoks
diff --git a/Master/texmf-dist/tex/context/base/core-env.lua b/Master/texmf-dist/tex/context/base/core-env.lua
index 2cc84299bce..a3a87b7f78e 100644
--- a/Master/texmf-dist/tex/context/base/core-env.lua
+++ b/Master/texmf-dist/tex/context/base/core-env.lua
@@ -13,19 +13,15 @@ if not modules then modules = { } end modules ['core-env'] = {
local P, C, S, Cc, lpegmatch, patterns = lpeg.P, lpeg.C, lpeg.S, lpeg.Cc, lpeg.match, lpeg.patterns
-local csname_id = token.csname_id
-local create = token.create
local texgetcount = tex.getcount
local texsetcount = tex.setcount
local allocate = utilities.storage.allocate
local setmetatableindex = table.setmetatableindex
+local setmetatablecall = table.setmetatablecall
local context = context
-local undefined = csname_id("*undefined*crap*")
-local iftrue = create("iftrue")[2] -- inefficient hack
-
tex.modes = allocate { }
tex.systemmodes = allocate { }
tex.constants = allocate { }
@@ -36,52 +32,204 @@ tex.isdefined = allocate { }
local modes = { }
local systemmodes = { }
-setmetatableindex(tex.modes, function(t,k)
- local m = modes[k]
- if m then
- return m()
- else
- local n = "mode>" .. k
- if csname_id(n) == undefined then
- return false
+-- if newtoken then -- we keep the old code for historic reasons
+
+ -- undefined: mode == 0 or cmdname = "undefined_cs"
+
+ local create = newtoken.create
+
+ local cache = table.setmetatableindex(function(t,k)
+ local v = create(k)
+ t[k] = v
+ return v
+ end)
+
+ -- we can have a modes cache too
+
+ local iftrue = cache["iftrue"].mode
+ local undefined = cache["*undefined*crap*"].mode -- is this ok?
+
+ setmetatableindex(tex.modes, function(t,k)
+ local m = modes[k]
+ if m then
+ return m()
else
- modes[k] = function() return texgetcount(n) >= 1 end
- return texgetcount(n) >= 1
+ local n = "mode>" .. k
+ if cache[n].mode == 0 then
+ return false
+ else
+ modes[k] = function() return texgetcount(n) == 1 end
+ return texgetcount(n) == 1 -- 2 is prevented
+ end
end
- end
-end)
+ end)
-setmetatableindex(tex.systemmodes, function(t,k)
- local m = systemmodes[k]
- if m then
- return m()
- else
- local n = "mode>*" .. k
- if csname_id(n) == undefined then
- return false
+ setmetatableindex(tex.systemmodes, function(t,k)
+ local m = systemmodes[k]
+ if m then
+ return m()
else
- systemmodes[k] = function() return texgetcount(n) >= 1 end
- return texgetcount(n) >= 1
+ local n = "mode>*" .. k
+ if cache[n].mode == 0 then
+ return false
+ else
+ systemmodes[k] = function() return texgetcount(n) == 1 end
+ return texgetcount(n) == 1 -- 2 is prevented
+ end
end
+ end)
+
+ setmetatableindex(tex.constants, function(t,k)
+ return cache[k].mode ~= 0 and texgetcount(k) or 0
+ end)
+
+ setmetatableindex(tex.conditionals, function(t,k) -- 0 == true
+ return cache[k].mode ~= 0 and texgetcount(k) == 0
+ end)
+
+ table.setmetatableindex(tex.ifs, function(t,k)
+ -- local mode = cache[k].mode
+ -- if mode == 0 then
+ -- return nil
+ -- else
+ -- return mode == iftrue
+ -- end
+ return cache[k].mode == iftrue
+ end)
+
+ setmetatableindex(tex.isdefined, function(t,k)
+ return k and cache[k].mode ~= 0
+ end)
+
+ setmetatablecall(tex.isdefined, function(t,k)
+ return k and cache[k].mode ~= 0
+ end)
+
+ local dimencode = cache["scratchdimen" ].command
+ local countcode = cache["scratchcounter"].command
+ local tokencode = cache["scratchtoken" ].command
+ local skipcode = cache["scratchskip" ].command
+
+ local types = {
+ [dimencode] = "dimen",
+ [countcode] = "count",
+ [tokencode] = "token",
+ [skipcode ] = "skip",
+ }
+
+ function tex.isdimen(name)
+ return cache[name].command == dimencode
+ end
+
+ function tex.iscount(name)
+ return cache[name].command == countcode
end
-end)
-setmetatableindex(tex.constants, function(t,k)
- return csname_id(k) ~= undefined and texgetcount(k) or 0
-end)
+ function tex.istoken(name)
+ return cache[name].command == tokencode
+ end
-setmetatableindex(tex.conditionals, function(t,k) -- 0 == true
- return csname_id(k) ~= undefined and texgetcount(k) == 0
-end)
+ function tex.isskip(name)
+ return cache[name].command == skipcode
+ end
-setmetatableindex(tex.ifs, function(t,k)
- -- k = "if" .. k -- better not
- return csname_id(k) ~= undefined and create(k)[2] == iftrue -- inefficient, this create, we need a helper
-end)
+ function tex.type(name)
+ return types[cache[name].command] or "macro"
+ end
-setmetatableindex(tex.isdefined, function(t,k)
- return csname_id(k) ~= undefined
-end)
+-- else
+--
+-- local csname_id = token.csname_id
+-- local create = token.create
+--
+-- local undefined = csname_id("*undefined*crap*")
+-- local iftrue = create("iftrue")[2] -- inefficient hack
+--
+-- setmetatableindex(tex.modes, function(t,k)
+-- local m = modes[k]
+-- if m then
+-- return m()
+-- else
+-- local n = "mode>" .. k
+-- if csname_id(n) == undefined then
+-- return false
+-- else
+-- modes[k] = function() return texgetcount(n) == 1 end
+-- return texgetcount(n) == 1 -- 2 is prevented
+-- end
+-- end
+-- end)
+--
+-- setmetatableindex(tex.systemmodes, function(t,k)
+-- local m = systemmodes[k]
+-- if m then
+-- return m()
+-- else
+-- local n = "mode>*" .. k
+-- if csname_id(n) == undefined then
+-- return false
+-- else
+-- systemmodes[k] = function() return texgetcount(n) == 1 end
+-- return texgetcount(n) == 1 -- 2 is prevented
+-- end
+-- end
+-- end)
+--
+-- setmetatableindex(tex.constants, function(t,k)
+-- return csname_id(k) ~= undefined and texgetcount(k) or 0
+-- end)
+--
+-- setmetatableindex(tex.conditionals, function(t,k) -- 0 == true
+-- return csname_id(k) ~= undefined and texgetcount(k) == 0
+-- end)
+--
+-- setmetatableindex(tex.ifs, function(t,k)
+-- -- k = "if" .. k -- better not
+-- return csname_id(k) ~= undefined and create(k)[2] == iftrue -- inefficient, this create, we need a helper
+-- end)
+--
+-- setmetatableindex(tex.isdefined, function(t,k)
+-- return k and csname_id(k) ~= undefined
+-- end)
+-- setmetatablecall(tex.isdefined, function(t,k)
+-- return k and csname_id(k) ~= undefined
+-- end)
+--
+-- local lookuptoken = token.lookup
+--
+-- local dimencode = lookuptoken("scratchdimen" )[1]
+-- local countcode = lookuptoken("scratchcounter")[1]
+-- local tokencode = lookuptoken("scratchtoken" )[1]
+-- local skipcode = lookuptoken("scratchskip" )[1]
+--
+-- local types = {
+-- [dimencode] = "dimen",
+-- [countcode] = "count",
+-- [tokencode] = "token",
+-- [skipcode ] = "skip",
+-- }
+--
+-- function tex.isdimen(name)
+-- return lookuptoken(name)[1] == dimencode
+-- end
+--
+-- function tex.iscount(name)
+-- return lookuptoken(name)[1] == countcode
+-- end
+--
+-- function tex.istoken(name)
+-- return lookuptoken(name)[1] == tokencode
+-- end
+--
+-- function tex.isskip(name)
+-- return lookuptoken(name)[1] == skipcode
+-- end
+--
+-- function tex.type(name)
+-- return types[lookuptoken(name)[1]] or "macro"
+-- end
+--
+-- end
function context.setconditional(name,value)
if value then
@@ -91,27 +239,6 @@ function context.setconditional(name,value)
end
end
-
--- todo : global
-
--- not possible as we let at the tex end to zerocount and plusone
---
--- function tex.settrue(name,glob)
--- if glob then
--- texsetcount("global",name,0)
--- else
--- texsetcount(name,0)
--- end
--- end
---
--- function tex.setfalse(name,glob)
--- if glob then
--- texsetcount("global",name,1)
--- else
--- texsetcount(name,1)
--- end
--- end
-
---- arg = P("{") * C(patterns.nested) * P("}") + Cc("")
local sep = S("), ")
@@ -126,45 +253,9 @@ local pattern = (
+ sep^1
)^1
-function commands.autosetups(str)
- lpegmatch(pattern,str)
-end
-
--- new (inefficient)
-
-local lookuptoken = token.lookup
-
-local dimencode = lookuptoken("scratchdimen" )[1]
-local countcode = lookuptoken("scratchcounter")[1]
-local tokencode = lookuptoken("scratchtoken" )[1]
-local skipcode = lookuptoken("scratchskip" )[1]
-
-local types = {
- [dimencode] = "dimen",
- [countcode] = "count",
- [tokencode] = "token",
- [skipcode ] = "skip",
+interfaces.implement {
+ name = "autosetups",
+ actions = function(str) lpegmatch(pattern,str) end,
+ arguments = "string"
}
-function tex.isdimen(name)
- return lookuptoken(name)[1] == dimencode
-end
-
-function tex.iscount(name)
- return lookuptoken(name)[1] == countcode
-end
-
-function tex.istoken(name)
- return lookuptoken(name)[1] == tokencode
-end
-
-function tex.isskip(name)
- return lookuptoken(name)[1] == skipcode
-end
-
-function tex.type(name)
- return types[lookuptoken(name)[1]] or "macro"
-end
-
--- inspect(tex.isdimen("xxxxxxxxxxxxxxx"))
--- inspect(tex.isdimen("textwidth"))
diff --git a/Master/texmf-dist/tex/context/base/core-env.mkiv b/Master/texmf-dist/tex/context/base/core-env.mkiv
index 75b65418f50..bebc1bef08c 100644
--- a/Master/texmf-dist/tex/context/base/core-env.mkiv
+++ b/Master/texmf-dist/tex/context/base/core-env.mkiv
@@ -46,8 +46,6 @@
\installcorenamespace{modestack}
-% todo: check prevent mode, also at the lua end
-
\setnewconstant\disabledmode \zerocount
\setnewconstant\enabledmode \plusone
\setnewconstant\preventedmode\plustwo
@@ -59,7 +57,7 @@
\def\syst_modes_new#1%
{\expandafter\newcount\csname\??mode#1\endcsname}
-\unexpanded\def\newmode#1%
+\unexpanded\def\newmode#1% so, no change of already set modes !
{\ifcsname\??mode#1\endcsname\else\syst_modes_new{#1}\fi}
\unexpanded\def\setmode#1%
@@ -113,8 +111,6 @@
\unexpanded\def\globalenablemode {\let\syst_mode_prefix\global\unprotect\syst_modes_enable }
\unexpanded\def\globaldisablemode{\let\syst_mode_prefix\global\unprotect\syst_modes_disable}
-\let\definemode\disablemode % nicer
-
\def\syst_modes_prevent[#1]{\protect\rawprocesscommacommand[#1]\syst_modes_prevent_indeed\let\syst_mode_prefix\relax}
\def\syst_modes_enable [#1]{\protect\rawprocesscommacommand[#1]\syst_modes_enable_indeed \let\syst_mode_prefix\relax}
\def\syst_modes_disable[#1]{\protect\rawprocesscommacommand[#1]\syst_modes_disable_indeed\let\syst_mode_prefix\relax}
@@ -135,10 +131,47 @@
\syst_mode_prefix\csname\??mode#1\endcsname\disabledmode
\fi}
+%D If you do a lot of mode testing, it makes sense to define modes (or disable them
+%D explicitly if unset. This makes testing twice as fast. Often one enables modes
+%D beforehand, in which case \type {\definemode} would reset the mode. The optional
+%D second argument \type {keep} will prevent changing the already set mode but defines
+%D it when undefined.
+
+\unexpanded\def\definemode
+ {\unprotect
+ \dodoubleempty\syst_modes_define}
+
+\def\syst_modes_define[#1][#2]%
+ {\protect
+ \edef\m_modes_asked{#2}%
+ \rawprocesscommacommand[#1]\syst_modes_define_indeed}
+
+\def\syst_modes_define_indeed#1%
+ {\ifcsname\??mode#1\endcsname
+ % already set
+ \else
+ \syst_modes_new{#1}
+ \fi
+ \ifx\m_modes_asked\v!keep
+ % not changes, disabled when undefined
+ \else
+ \csname\??mode#1\endcsname\ifx\m_modes_asked\v!yes\enabledmode\else\disabledmode\fi
+ \fi}
+
% handy for mp
\def\booleanmodevalue#1%
- {\ifcsname\??mode#1\endcsname\ifcase\csname\??mode#1\endcsname\s!false\else\s!true\fi\else\s!false\fi}
+ {\ifcsname\??mode#1\endcsname
+ \ifcase\csname\??mode#1\endcsname
+ \s!false
+ \or
+ \s!true
+ \else
+ \s!false
+ \fi
+ \else
+ \s!false
+ \fi}
% check macros
@@ -148,6 +181,27 @@
\newconditional\c_checked_mode
+% one
+
+% \def\syst_modes_check_indeed#1%
+% {\ifcsname\??mode#1\endcsname
+% \ifcase\csname\??mode#1\endcsname\else
+% \let\syst_modes_check_step\gobbleoneargument
+% \fi
+% \fi}
+%
+% \def\syst_modes_check#1#2#3%
+% {\let\syst_modes_check_step\syst_modes_check_indeed
+% \rawprocesscommacommand[#3]\syst_modes_check_step
+% \ifx\syst_modes_check_step\gobbleoneargument
+% \expandafter#1%
+% \else
+% \expandafter#2%
+% \fi}
+
+% modes .. twice as fast on defined modes .. we could use definers and make it even faster
+% if needed
+
\def\syst_modes_check_indeed#1%
{\ifcsname\??mode#1\endcsname
\ifcase\csname\??mode#1\endcsname\else
@@ -155,7 +209,7 @@
\fi
\fi}
-\def\syst_modes_check#1#2#3%
+\def\syst_modes_check_nop#1#2#3%
{\let\syst_modes_check_step\syst_modes_check_indeed
\rawprocesscommacommand[#3]\syst_modes_check_step
\ifx\syst_modes_check_step\gobbleoneargument
@@ -164,10 +218,32 @@
\expandafter#2%
\fi}
+\def\syst_modes_check_yes#1#2#3%
+ {\ifcase\csname\??mode#3\endcsname
+ \expandafter#2%
+ \or
+ \expandafter#1%
+ \else
+ \expandafter#2%
+ \fi}
+
+\def\syst_modes_check#1#2#3%
+ {\ifcsname\??mode#3\endcsname
+ \expandafter\syst_modes_check_yes
+ \else
+ \expandafter\syst_modes_check_nop
+ \fi#1#2{#3}}
+
+% all
+
\def\syst_modes_check_all_indeed#1%
{\ifcsname\??mode#1\endcsname
\ifcase\csname\??mode#1\endcsname
\let\syst_modes_check_all_step\gobbleoneargument
+ \or
+ % enabled
+ \else
+ \let\syst_modes_check_all_step\gobbleoneargument
\fi
\else
\let\syst_modes_check_all_step\gobbleoneargument
@@ -182,17 +258,20 @@
\expandafter#1%
\fi}
-\unexpanded\def\doifmodeelse {\syst_modes_check\firstoftwoarguments\secondoftwoarguments}
+\unexpanded\def\doifelsemode {\syst_modes_check\firstoftwoarguments\secondoftwoarguments}
\unexpanded\def\doifmode {\syst_modes_check\firstofoneargument\gobbleoneargument}
\unexpanded\def\doifnotmode {\syst_modes_check\gobbleoneargument\firstofoneargument}
\unexpanded\def\startmode [#1]{\syst_modes_check\donothing\syst_modes_stop_yes{#1}}
\unexpanded\def\startnotmode [#1]{\syst_modes_check\syst_modes_stop_nop\donothing{#1}}
-\unexpanded\def\doifallmodeselse {\syst_modes_check_all\firstoftwoarguments\secondoftwoarguments}
+\unexpanded\def\doifelseallmodes {\syst_modes_check_all\firstoftwoarguments\secondoftwoarguments}
\unexpanded\def\doifallmodes {\syst_modes_check_all\firstofoneargument\gobbleoneargument}
\unexpanded\def\doifnotallmodes {\syst_modes_check_all\gobbleoneargument\firstofoneargument}
\unexpanded\def\startallmodes [#1]{\syst_modes_check_all\donothing\syst_modes_stop_all_yes{#1}}
\unexpanded\def\startnotallmodes[#1]{\syst_modes_check_all\syst_modes_stop_all_nop\donothing{#1}}
+\let\doifmodeelse \doifelsemode
+\let\doifallmodeselse \doifelseallmodes
+
\unexpanded\def\stopmode {} % no relax
\unexpanded\def\stopnotmode {} % no relax
\unexpanded\def\stopallmodes {} % no relax
@@ -272,8 +351,8 @@
\unexpanded\def\startmodeset
{\pushmacro\c_syst_modes_set_done
- \setfalse\conditionalfalse
- \doifnextoptionalcselse\syst_modes_set_start\syst_modes_set_quit}
+ \setfalse\c_syst_modes_set_done
+ \doifelsenextoptionalcs\syst_modes_set_start\syst_modes_set_quit}
\def\syst_modes_set_start[#1]%
{\edef\m_mode_case{#1}%
@@ -293,10 +372,10 @@
\def\syst_modes_set_yes#1%
{\settrue\c_syst_modes_set_done
#1%
- \doifnextoptionalcselse\syst_modes_set_start\syst_modes_set_quit}
+ \doifelsenextoptionalcs\syst_modes_set_start\syst_modes_set_quit}
\def\syst_modes_set_nop#1%
- {\doifnextoptionalcselse\syst_modes_set_start\syst_modes_set_quit}
+ {\doifelsenextoptionalcs\syst_modes_set_start\syst_modes_set_quit}
\def\syst_modes_set_quit#1\stopmodeset
{\popmacro\c_syst_modes_set_done}
@@ -314,16 +393,16 @@
\unexpanded\def\startsetups{} % to please dep checker
\unexpanded\def\stopsetups {} % to please dep checker
-\expanded % will become obsolete
- {\def\expandafter\noexpand\csname\e!start\v!setups\endcsname
- {\begingroup\noexpand\doifnextoptionalcselse
- {\noexpand\dostartsetupsA\expandafter\noexpand\csname\e!stop\v!setups\endcsname}
- {\noexpand\dostartsetupsB\expandafter\noexpand\csname\e!stop\v!setups\endcsname}}}
-
-\letvalue{\e!stop\v!setups}\relax
+% \expanded % will become obsolete
+% {\def\expandafter\noexpand\csname\e!start\v!setups\endcsname
+% {\begingroup\noexpand\doifnextoptionalcselse
+% {\noexpand\dostartsetupsA\expandafter\noexpand\csname\e!stop\v!setups\endcsname}
+% {\noexpand\dostartsetupsB\expandafter\noexpand\csname\e!stop\v!setups\endcsname}}}
+%
+% \letvalue{\e!stop\v!setups}\relax
-\unexpanded\def\setups{\doifnextbgroupelse\syst_setups_a\syst_setups_b} % {..} or [..]
-\unexpanded\def\setup {\doifnextbgroupelse\syst_setups \syst_setups_c} % {..} or [..]
+\unexpanded\def\setups{\doifelsenextbgroup\syst_setups_a\syst_setups_b} % {..} or [..]
+\unexpanded\def\setup {\doifelsenextbgroup\syst_setups \syst_setups_c} % {..} or [..]
\def\syst_setups_a #1{\processcommacommand[#1]\syst_setups} % {..}
\def\syst_setups_b[#1]{\processcommacommand[#1]\syst_setups} % [..]
@@ -359,6 +438,28 @@
%
% \def\syst_setups_normal#1%
% {:\ifcsname\??setup:#1\endcsname#1\else\letterpercent\fi\endcsname\empty} % takes one argument
+%
+% only makes sense with many setups
+%
+% \def\syst_setups% the grid option will be extended to other main modes
+% {\ifgridsnapping
+% \expandafter\syst_setups_grid
+% \else
+% \expandafter\syst_setups_normal
+% \fi}
+%
+% \def\syst_setups_normal#1% the grid option will be extended to other main modes
+% {\csname\??setup
+% :\ifcsname\??setup:#1\endcsname#1\else\letterpercent\fi
+% \endcsname\empty} % takes one argument
+%
+% \def\syst_setups_grid#1% the grid option will be extended to other main modes
+% {\csname\??setup
+% \ifcsname\??setup\v!grid:#1\endcsname\v!grid:#1\else:\ifcsname\??setup:#1\endcsname#1\else\letterpercent\fi\fi
+% \endcsname\empty} % takes one argument
+%
+% \let\directsetup\syst_setups
+% \let\texsetup \syst_setups % nicer than \directsetup and more en par with xmlsetup and luasetup
% We can consider:
%
@@ -369,6 +470,12 @@
% but it won't work out well with multiple setups (intercepted at the
% lua end) that then get only one argument.
+% no checking and we assume it being defined:
+
+\def\fastsetup #1{\csname\??setup:#1\endcsname\empty}
+\def\fastsetupwithargument #1#2{\csname\??setup:#2\endcsname{#1}}
+\def\fastsetupwithargumentswapped #1{\csname\??setup:#1\endcsname}
+
% the next one is meant for \c!setups situations, hence the check for
% a shortcut
@@ -395,11 +502,11 @@
% setups={S1,lua(S2),xml(test{123}),S3}
\def\syst_setups_process_local
- {\ctxcommand{autosetups("\m_syst_setups_asked")}%
+ {\clf_autosetups{\m_syst_setups_asked}%
\relax} % let's prevent lookahead
\def\autosetups#1%
- {\ctxcommand{autosetups("#1")}}
+ {\clf_autosetups{#1}}
\edef\setupwithargument#1% saves a few expansions
{\noexpand\csname\??setup:\noexpand\ifcsname\??setup:#1\endcsname#1\noexpand\else\letterpercent\noexpand\fi\endcsname}
@@ -410,13 +517,15 @@
\let\directsetup\syst_setups
\let\texsetup \syst_setups % nicer than \directsetup and more en par with xmlsetup and luasetup
-\unexpanded\def\doifsetupselse#1% to be done: grid
+\unexpanded\def\doifelsesetups#1% to be done: grid
{\ifcsname\??setup:#1\endcsname
\expandafter\firstoftwoarguments
\else
\expandafter\secondoftwoarguments
\fi}
+\let\doifsetupselse\doifelsesetups
+
\unexpanded\def\doifsetups#1% to be done: grid
{\ifcsname\??setup:#1\endcsname
\expandafter\firstofoneargument
@@ -487,11 +596,11 @@
% Is doglobal still relevant? Maybe always global? Or never? Anyway, it will become obsolete.
-\unexpanded\def\startluasetups {\begingroup\doifnextoptionalcselse\syst_setups_start_lua_a\syst_setups_start_lua_b} \let\stopluasetups \relax
-\unexpanded\def\startxmlsetups {\begingroup\doifnextoptionalcselse\syst_setups_start_xml_a\syst_setups_start_xml_b} \let\stopxmlsetups \relax
-\unexpanded\def\startrawsetups {\begingroup\doifnextoptionalcselse\syst_setups_start_raw_a\syst_setups_start_raw_b} \let\stoprawsetups \relax
-\unexpanded\def\startlocalsetups{\begingroup\doifnextoptionalcselse\syst_setups_start_loc_a\syst_setups_start_loc_b} \let\stoplocalsetups \relax
-\unexpanded\def\startsetups {\begingroup\doifnextoptionalcselse\syst_setups_start_tex_a\syst_setups_start_tex_b} \let\stopsetups \relax
+\unexpanded\def\startluasetups {\begingroup\doifelsenextoptionalcs\syst_setups_start_lua_a\syst_setups_start_lua_b} \let\stopluasetups \relax
+\unexpanded\def\startxmlsetups {\begingroup\doifelsenextoptionalcs\syst_setups_start_xml_a\syst_setups_start_xml_b} \let\stopxmlsetups \relax
+\unexpanded\def\startrawsetups {\begingroup\doifelsenextoptionalcs\syst_setups_start_raw_a\syst_setups_start_raw_b} \let\stoprawsetups \relax
+\unexpanded\def\startlocalsetups{\begingroup\doifelsenextoptionalcs\syst_setups_start_loc_a\syst_setups_start_loc_b} \let\stoplocalsetups \relax
+\unexpanded\def\startsetups {\begingroup\doifelsenextoptionalcs\syst_setups_start_tex_a\syst_setups_start_tex_b} \let\stopsetups \relax
\def\syst_setups_start_lua_indeed#1#2#3\stopluasetups {\endgroup\dodoglobal\expandafter\def\csname\??setup#1:#2\expandafter\endcsname\expandafter##\expandafter1\expandafter{#3}}
\def\syst_setups_start_xml_indeed#1#2#3\stopxmlsetups {\endgroup\dodoglobal\expandafter\def\csname\??setup#1:#2\expandafter\endcsname\expandafter##\expandafter1\expandafter{#3}}
@@ -539,14 +648,14 @@
\def\systemsetups#1{\syst_setups{\systemsetupsprefix#1}}
-\def\resetsetups[#1]% see x-fo for usage
+\unexpanded\def\resetsetups[#1]% see x-fo for usage
{\ifcsname\??setup\ifgridsnapping\v!grid\fi:#1\endcsname
\dodoglobal\letbeundefined{\??setup\ifgridsnapping\v!grid\fi:#1}%
\else
\dodoglobal\letbeundefined{\??setup:#1}%
\fi}
-\def\showsetupsdefinition[#1]%
+\unexpanded\def\showsetupsdefinition[#1]%
{\showvalue{\??setup:#1}} % temp hack for debugging
%D \macros
@@ -633,6 +742,8 @@
\expandafter\secondoftwoarguments
\fi}
+\let\doifvariableelse\doifelsevariable
+
\unexpanded\def\doifvariable#1#2%
{\ifcsname\??variables#1:#2\endcsname
\expandafter\firstofoneargument
@@ -647,18 +758,52 @@
\expandafter\firstofoneargument
\fi}
+%D A few more (we could use a public test variable so that we only need
+%D to expand once, assuming expandable variables):
+
+\letvalue{\??variables:}\empty
+
+\unexpanded\def\doifelseemptyvariable#1#2%
+ {\edef\m_syst_string_one{\csname\??variables\ifcsname\??variables#1:#2\endcsname#1:#2\else:\fi\endcsname}%
+ \ifx\m_syst_string_one\empty
+ \expandafter\firstoffourarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\let\doifemptyvariableelse\doifelseemptyvariable
+
+\unexpanded\def\doifemptyvariable#1#2%
+ {\edef\m_syst_string_one{\csname\??variables\ifcsname\??variables#1:#2\endcsname#1:#2\else:\fi\endcsname}%
+ \ifx\m_syst_string_one\empty
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\unexpanded\def\doifnotemptyvariable#1#2%
+ {\edef\m_syst_string_one{\csname\??variables\ifcsname\??variables#1:#2\endcsname#1:#2\else:\fi\endcsname}%
+ \ifx\m_syst_string_one\empty
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+
\def\getvariabledefault#1#2% #3% can be command, so no ifcsname here
{\executeifdefined{\??variables#1:#2}}% {#3}
\unexpanded\def\setupenv
{\dotripleargument\syst_variables_set[\getrawparameters][\s!environment]}
-\unexpanded\def\doifenvelse{\doifelsevariable \s!environment}
+\unexpanded\def\doifelseenv{\doifelsevariable \s!environment}
\unexpanded\def\doifenv {\doifvariable \s!environment}
\unexpanded\def\doifnotenv {\doifnotvariable \s!environment}
\def\env {\getvariable \s!environment}
\def\envvar {\getvariabledefault\s!environment}
+\let\doifenvelse\doifelseenv
+
%D \macros
%D {defineselector,setupselector,select,directselect}
%D
diff --git a/Master/texmf-dist/tex/context/base/core-ini.mkiv b/Master/texmf-dist/tex/context/base/core-ini.mkiv
index 711c43f9465..c338f6f814e 100644
--- a/Master/texmf-dist/tex/context/base/core-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/core-ini.mkiv
@@ -172,6 +172,9 @@
\newif \ifdoingblocks
\newif \ifgridsnapping
+\newconstant\pageduplexmode % 0 single 1 double 2 mix
+\newconstant\pagebodymode % 0 not 1 normal pagebody 2 spread
+
%D \macros
%D {ifproductionrun}
%D
diff --git a/Master/texmf-dist/tex/context/base/core-sys.lua b/Master/texmf-dist/tex/context/base/core-sys.lua
index 22b0e457c7b..cf74d68f461 100644
--- a/Master/texmf-dist/tex/context/base/core-sys.lua
+++ b/Master/texmf-dist/tex/context/base/core-sys.lua
@@ -9,46 +9,13 @@ if not modules then modules = { } end modules ['core-sys'] = {
local lower, format, gsub = string.lower, string.format, string.gsub
local suffixonly, basename, removesuffix = file.suffix, file.basename, file.removesuffix
-local environment = environment
+local environment = environment
+local context = context
+local implement = interfaces.implement
local report_files = logs.reporter("system","files")
--- function commands.updatefilenames(jobname,fulljobname,inputfilename,outputfilename)
--- --
--- environment.jobname = jobname
--- --
--- local jobfilename = gsub(fulljobname or jobname or inputfilename or tex.jobname or "","%./","")
--- --
--- environment.jobfilename = jobfilename
--- environment.jobfilesuffix = lower(suffixonly(environment.jobfilename))
--- --
--- local inputfilename = gsub(inputfilename or "","%./","")
--- environment.inputfilename = inputfilename
--- environment.inputfilebarename = removesuffix(basename(inputfilename))
--- --
--- local inputfilerealsuffix = suffixonly(inputfilename)
--- environment.inputfilerealsuffix = inputfilerealsuffix
--- --
--- local inputfilesuffix = inputfilerealsuffix == "" and "tex" or lower(inputfilerealsuffix)
--- environment.inputfilesuffix = inputfilesuffix
--- --
--- local outputfilename = outputfilename or environment.inputfilebarename or ""
--- environment.outputfilename = outputfilename
--- --
--- local runpath = resolvers.cleanpath(lfs.currentdir())
--- environment.runpath = runpath
--- --
--- statistics.register("running on path", function()
--- return environment.runpath
--- end)
--- --
--- statistics.register("job file properties", function()
--- return format("jobname %a, input %a, suffix %a",jobfilename,inputfilename,inputfilesuffix)
--- end)
--- --
--- end
-
-function environment.initializefilenames() -- commands.updatefilenames(jobname,fulljobname,input,result)
+function environment.initializefilenames()
local arguments = environment.arguments
@@ -90,6 +57,17 @@ function environment.initializefilenames() -- commands.updatefilenames(jobname,f
function environment.initializefilenames() end
end
+-- we could set a macro (but will that work when we're expanding? needs testing!)
+
+implement { name = "operatingsystem", actions = function() context(os.platform) end }
+implement { name = "jobfilename", actions = function() context(environment.jobfilename) end }
+implement { name = "jobfilesuffix", actions = function() context(environment.jobfilesuffix) end }
+implement { name = "inputfilebarename", actions = function() context(environment.inputfilebarename) end }
+implement { name = "inputfilerealsuffix", actions = function() context(environment.inputfilerealsuffix) end }
+implement { name = "inputfilesuffix", actions = function() context(environment.inputfilesuffix) end }
+implement { name = "inputfilename", actions = function() context(environment.inputfilename) end }
+implement { name = "outputfilename", actions = function() context(environment.outputfilename) end }
+
statistics.register("result saved in file", function()
-- suffix will be fetched from backend
local outputfilename = environment.outputfilename or environment.jobname or tex.jobname or "<unset>"
@@ -99,3 +77,11 @@ statistics.register("result saved in file", function()
return format("%s.%s",outputfilename,"dvi") -- hard to imagine
end
end)
+
+implement {
+ name = "systemlog",
+ arguments = { "string", "string", "string" },
+ actions = function(whereto,category,text)
+ logs.system(whereto,"context",tex.jobname,category,text)
+ end,
+}
diff --git a/Master/texmf-dist/tex/context/base/core-sys.mkiv b/Master/texmf-dist/tex/context/base/core-sys.mkiv
index c07722f56ee..27bbec0b103 100644
--- a/Master/texmf-dist/tex/context/base/core-sys.mkiv
+++ b/Master/texmf-dist/tex/context/base/core-sys.mkiv
@@ -35,24 +35,24 @@
%D End of lines to the output. \TEX\ will map this onto the platform specific
%D line ending. I hate this mess.
-\edef\operatingsystem {\cldcontext{os.platform}}
+\let\operatingsystem\clf_operatingsystem
%D The jobname is what gets loaded by the cont-yes stub file. This name
%D also determines the name of tuc etc files.
-\def \jobfilename {\cldcontext{environment.jobfilename or ""}}
-\def \jobfilesuffix {\cldcontext{environment.jobfilesuffix or ""}}
+\let\jobfilename \clf_jobfilename
+\let\jobfilesuffix\clf_jobfilesuffix
%D However, that one can itself load another file.
-\def \inputfilebarename {\cldcontext{environment.inputfilebarename or ""}}
-\def \inputfilerealsuffix{\cldcontext{environment.inputfilerealsuffix or ""}}
-\def \inputfilesuffix {\cldcontext{environment.inputfilesuffix or ""}}
-\def \inputfilename {\cldcontext{environment.inputfilename or ""}}
+\let\inputfilebarename \clf_inputfilebarename
+\let\inputfilerealsuffix\clf_inputfilerealsuffix
+\let\inputfilesuffix \clf_inputfilesuffix
+\let\inputfilename \clf_inputfilename
%D The output name is only used for some checking.
-\def \outputfilename {\cldcontext{environment.outputfilename or ""}}
+\let\outputfilename\clf_outputfilename
\installcorenamespace{system}
@@ -230,6 +230,8 @@
\dostoptagged
\startstopparameter\c!inbetween}}
+% \definestartstop[tracing][\c!style=\tt]
+
% \unexpanded\def\ignorestartstop[#1]%
% {\unexpanded\expandafter\def\csname\e!start#1\expandafter\endcsname\expandafter
% {\expandafter\gobbleuntil\csname\e!stop#1\endcsname}}
@@ -240,8 +242,14 @@
\installcommandhandler \??highlight {highlight} \??highlight % we could do with less
+\setuphighlight
+ [\c!command=\v!yes]
+
\appendtoks
- \setuevalue\currenthighlight{\typo_highlights_indeed{\currenthighlight}}%
+ \edef\p_command{\highlightparameter\c!command}%
+ \ifx\p_command\v!yes
+ \setuevalue\currenthighlight{\typo_highlights_indeed{\currenthighlight}}%
+ \fi
\to \everydefinehighlight
\ifdefined\dotaghighlight \else \let\dotaghighlight\relax \fi
@@ -254,13 +262,29 @@
\dotaghighlight}
{\dostoptagged}}
+\unexpanded\def\highlight[#1]%
+ {\typo_highlights_indeed{#1}}
+
+\unexpanded\def\starthighlight[#1]%
+ {\begingroup
+ \def\currenthighlight{#1}%
+ \dostarttagged\t!highlight\currenthighlight
+ \usehighlightstyleandcolor\c!style\c!color
+ \dotaghighlight}
+
+\unexpanded\def\stophighlight
+ {\dostoptagged
+ \endgroup}
+
+\let\directhighlight\typo_highlights_indeed
+
\unexpanded\def\defineexpandable
- {\doifnextoptionalelse
+ {\doifelsenextoptional
{\syst_basics_define_yes\def}%
{\syst_basics_define_nop\def}}
\unexpanded\def\define
- {\doifnextoptionalelse
+ {\doifelsenextoptional
{\syst_basics_define_yes{\unexpanded\def}}%
{\syst_basics_define_nop{\unexpanded\def}}}
@@ -399,5 +423,31 @@
% \processcommalist[#1]\docommand
% \endgroup}
+\unexpanded\def\syst_log_indeed#1#2#3%
+ {\ctxcommand{systemlog("#1","#2",\!!bs#3\!!es)}}
+
+\let\systemlog\syst_log_indeed
+
+\unexpanded\def\systemlogfirst
+ {\ifcase\directsystemparameter\c!n\relax
+ \expandafter\syst_log_indeed
+ \or
+ \expandafter\syst_log_indeed
+ \else
+ \expandafter\gobblethreearguments
+ \fi}
+
+\unexpanded\def\systemloglast
+ {\ifcase\directsystemparameter\c!n\relax
+ \expandafter\syst_log_indeed
+ \or
+ \expandafter\gobblethreearguments
+ \or
+ \expandafter\gobblethreearguments
+ \or
+ \expandafter\gobblethreearguments
+ \or
+ \expandafter\syst_log_indeed
+ \fi}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/core-two.lua b/Master/texmf-dist/tex/context/base/core-two.lua
index 1f2bc7c6cf8..bb1afa7db2f 100644
--- a/Master/texmf-dist/tex/context/base/core-two.lua
+++ b/Master/texmf-dist/tex/context/base/core-two.lua
@@ -42,9 +42,13 @@ end
jobpasses.define = allocate
-function jobpasses.save(id,str)
+function jobpasses.save(id,str,index)
local jti = allocate(id)
- jti[#jti+1] = str
+ if index then
+ jti[index] = str
+ else
+ jti[#jti+1] = str
+ end
end
function jobpasses.savetagged(id,tag,str)
@@ -140,18 +144,36 @@ jobpasses.inlist = inlist
-- interface
-function commands.gettwopassdata (id) local r = get (id) if r then context(r) end end
-function commands.getfirsttwopassdata(id) local r = first(id) if r then context(r) end end
-function commands.getlasttwopassdata (id) local r = last (id) if r then context(r) end end
-function commands.findtwopassdata (id,n) local r = find (id,n) if r then context(r) end end
-function commands.gettwopassdatalist (id) local r = list (id) if r then context(r) end end
-function commands.counttwopassdata (id) local r = count(id) if r then context(r) end end
-function commands.checktwopassdata (id) local r = check(id) if r then context(r) end end
+local implement = interfaces.implement
-commands.definetwopasslist = jobpasses.define
-commands.savetwopassdata = jobpasses.save
-commands.savetaggedtwopassdata = jobpasses.savetagged
+implement { name = "gettwopassdata", actions = { get , context }, arguments = "string" }
+implement { name = "getfirsttwopassdata",actions = { first, context }, arguments = "string" }
+implement { name = "getlasttwopassdata", actions = { last , context }, arguments = "string" }
+implement { name = "findtwopassdata", actions = { find , context }, arguments = { "string", "string" } }
+implement { name = "gettwopassdatalist", actions = { list , context }, arguments = "string" }
+implement { name = "counttwopassdata", actions = { count, context }, arguments = "string" }
+implement { name = "checktwopassdata", actions = { check, context }, arguments = "string" }
-function commands.doifelseintwopassdata(id,str)
- commands.doifelse(inlist(id,str))
-end
+implement {
+ name = "definetwopasslist",
+ actions = jobpasses.define,
+ arguments = "string"
+}
+
+implement {
+ name = "savetwopassdata",
+ actions = jobpasses.save,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "savetaggedtwopassdata",
+ actions = jobpasses.savetagged,
+ arguments = { "string", "string", "string" }
+}
+
+implement {
+ name = "doifelseintwopassdata",
+ actions = { inlist, commands.doifelse },
+ arguments = { "string", "string" }
+}
diff --git a/Master/texmf-dist/tex/context/base/core-two.mkiv b/Master/texmf-dist/tex/context/base/core-two.mkiv
index b08914ef407..5a791dea2f7 100644
--- a/Master/texmf-dist/tex/context/base/core-two.mkiv
+++ b/Master/texmf-dist/tex/context/base/core-two.mkiv
@@ -73,10 +73,10 @@
\registerctxluafile{core-two}{1.001}
-\def\immediatesavetwopassdata #1#2#3{\normalexpanded{\noexpand\ctxcommand {savetwopassdata('#1',"#3")}}}
+\def\immediatesavetwopassdata #1#2#3{\normalexpanded{\noexpand\clf_savetwopassdata{#1}{#3}}}
\def\savetwopassdata #1#2#3{\normalexpanded{\noexpand\ctxlatecommand{savetwopassdata('#1',"#3")}}}
\def\lazysavetwopassdata #1#2#3{\normalexpanded{\noexpand\ctxlatecommand{savetwopassdata('#1',"#3")}}}
-\def\savetaggedtwopassdata #1#2#3#4{\normalexpanded{\noexpand\ctxcommand {savetaggedtwopassdata('#1','#3',"#4")}}}
+\def\savetaggedtwopassdata #1#2#3#4{\normalexpanded{\noexpand\clf_savetaggedtwopassdata{#1}{#3}{#4}}}
\def\lazysavetaggedtwopassdata#1#2#3#4{\normalexpanded{\noexpand\ctxlatecommand{savetaggedtwopassdata('#1','#3',"#4")}}}
% temp hack: needs a proper \starteverytimeluacode
@@ -87,7 +87,7 @@
\newif \iftwopassdatafound % obsolete, will go
-\def\syst_twopass_check
+\def\syst_twopass_check % can be delegated to lua once obsolete is gone
{\ifx\twopassdata\empty
\twopassdatafoundfalse % obsolete
\setfalse\twopassdatafound
@@ -104,18 +104,19 @@
{\twopassdatafoundtrue % obsolete
\settrue\twopassdatafound}
-\unexpanded\def\definetwopasslist #1{\ctxcommand{definetwopasslist('#1')}}
-\unexpanded\def\gettwopassdata #1{\edef\twopassdata {\ctxcommand{gettwopassdata ("#1")}}\syst_twopass_check}
-\unexpanded\def\checktwopassdata #1{\edef\twopassdata {\ctxcommand{checktwopassdata ("#1")}}\syst_twopass_check}
-\unexpanded\def\findtwopassdata #1#2{\edef\twopassdata {\ctxcommand{findtwopassdata("#1","#2")}}\syst_twopass_check}
-\unexpanded\def\getfirsttwopassdata #1{\edef\twopassdata {\ctxcommand{getfirsttwopassdata ("#1")}}\syst_twopass_check}
-\unexpanded\def\getlasttwopassdata #1{\edef\twopassdata {\ctxcommand{getlasttwopassdata ("#1")}}%
- \edef\noftwopassitems{\ctxcommand{counttwopassdata ("#1")}}\syst_twopass_check}
-\unexpanded\def\getnamedtwopassdatalist#1#2{\edef #1{\ctxcommand{gettwopassdatalist ("#2")}}}
-\unexpanded\def\gettwopassdatalist #1{\edef\twopassdatalist{\ctxcommand{gettwopassdatalist ("#1")}}}
+\unexpanded\def\definetwopasslist #1{\clf_definetwopasslist{#1}}
+\unexpanded\def\gettwopassdata #1{\edef\twopassdata {\clf_gettwopassdata {#1}}\syst_twopass_check}
+\unexpanded\def\checktwopassdata #1{\edef\twopassdata {\clf_checktwopassdata {#1}}\syst_twopass_check}
+\unexpanded\def\findtwopassdata #1#2{\edef\twopassdata {\clf_findtwopassdata {#1}{#2}}\syst_twopass_check}
+\unexpanded\def\getfirsttwopassdata #1{\edef\twopassdata {\clf_getfirsttwopassdata {#1}}\syst_twopass_check}
+\unexpanded\def\getlasttwopassdata #1{\edef\twopassdata {\clf_getlasttwopassdata {#1}}%
+ \edef\noftwopassitems{\clf_counttwopassdata {#1}}\syst_twopass_check}
+\unexpanded\def\getnamedtwopassdatalist#1#2{\edef #1{\clf_gettwopassdatalist {#2}}}
+\unexpanded\def\gettwopassdatalist #1{\edef\twopassdatalist{\clf_gettwopassdatalist {#1}}}
-\unexpanded\def\doifelseintwopassdata #1#2{\ctxcommand{doifelseintwopassdata("#1","#2")}}
+\unexpanded\def\doifelseintwopassdata #1#2{\clf_doifelseintwopassdata{#1}{#2}}
+ \let\doifintwopassdataelse \doifelseintwopassdata
\let\getfromtwopassdata \findtwopassdata
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/core-uti.lua b/Master/texmf-dist/tex/context/base/core-uti.lua
index 1903ad8236b..346dec89e9e 100644
--- a/Master/texmf-dist/tex/context/base/core-uti.lua
+++ b/Master/texmf-dist/tex/context/base/core-uti.lua
@@ -29,6 +29,8 @@ local packers = utilities.packers
local allocate = utilities.storage.allocate
local mark = utilities.storage.mark
+local implement = interfaces.implement
+
local texgetcount = tex.getcount
local report_passes = logs.reporter("job","passes")
@@ -36,7 +38,7 @@ local report_passes = logs.reporter("job","passes")
job = job or { }
local job = job
-job.version = 1.25
+job.version = 1.29
job.packversion = 1.02
-- some day we will implement loading of other jobs and then we need
@@ -62,21 +64,35 @@ end
job.comment("version",job.version)
-local enabled = true
+local enabled = true
+local initialized = false
directives.register("job.save",function(v) enabled = v end)
+----------.register("job.keep",function(v) kept = v end)
function job.disablesave() -- can be command
enabled = false
end
function job.initialize(loadname,savename)
- job.load(loadname) -- has to come after structure is defined !
- luatex.registerstopactions(function()
- if enabled and not status.lasterrorstring or status.lasterrorstring == "" then
- job.save(savename)
+ if not initialized then
+ if not loadname or loadname == "" then
+ loadname = tex.jobname .. ".tuc"
+ end
+ if not savename or savename == "" then
+ savename = tex.jobname .. ".tua"
end
- end)
+ job.load(loadname) -- has to come after structure is defined !
+ luatex.registerstopactions(function()
+ if enabled and not status.lasterrorstring or status.lasterrorstring == "" then
+ -- if kept then
+ -- job.keep(loadname) -- could move to mtx-context instead
+ -- end
+ job.save(savename)
+ end
+ end)
+ initialized = true
+ end
end
function job.register(collected, tobesaved, initializer, finalizer, serializer)
@@ -283,6 +299,28 @@ function job.loadother(filename)
statistics.stoptiming(_load_)
end
+-- function job.keep(filename)
+-- local suffix = file.suffix(filename)
+-- local base = file.removesuffix(filename)
+-- if suffix == "" then
+-- suffix = "tuc"
+-- end
+-- for i=1,10 do
+-- local tmpname = format("%s-%s-%02d.tmp",base,suffix,i)
+-- if lfs.isfile(tmpname) then
+-- os.remove(tmpname)
+-- report_passes("removing %a",tmpname)
+-- end
+-- end
+-- if lfs.isfile(filename) then
+-- local tmpname = format("%s-%s-%02d.tmp",base,suffix,environment.currentrun or 1)
+-- report_passes("copying %a into %a",filename,tmpname)
+-- file.copy(filename,tmpname)
+-- else
+-- report_passes("no file %a, nothing kept",filename)
+-- end
+-- end
+
-- eventually this will end up in strc-ini
statistics.register("startup time", function()
@@ -352,6 +390,24 @@ function statistics.formatruntime(runtime)
end
end
+implement {
+ name = "savevariable",
+ actions = job.variables.save,
+ arguments = { "string", "string" }
+}
-commands.savevariable = job.variables.save
-commands.setjobcomment = job.comment
+implement {
+ name = "setjobcomment",
+ actions = job.comment,
+ arguments = { { "*" } }
+}
+
+implement {
+ name = "initializejob",
+ actions = job.initialize
+}
+
+implement {
+ name = "disablejobsave",
+ actions = job.disablesave
+}
diff --git a/Master/texmf-dist/tex/context/base/core-uti.mkiv b/Master/texmf-dist/tex/context/base/core-uti.mkiv
index 5937240b9c6..cdd8958ff62 100644
--- a/Master/texmf-dist/tex/context/base/core-uti.mkiv
+++ b/Master/texmf-dist/tex/context/base/core-uti.mkiv
@@ -18,21 +18,19 @@
\registerctxluafile{core-uti}{1.001}
\def\savecurrentvalue#1#2% immediate, so not \unexpanded
- {\ctxcommand{savevariable("\strippedcsname#1","#2")}}
+ {\clf_savevariable{\strippedcsname#1}{#2}}
\appendtoks
- \ctxlua{job.comment{
- file = tex.jobname,
- format = "\contextformat",
- stamp = "\contextversion",
- escape = "\!!bs\space...\space\!!es"
- }}%
+ \clf_setjobcomment
+ file {tex.jobname}%
+ format {\contextformat}%
+ stamp {\contextversion}%
+ escape {\!!bs\space...\space\!!es}%
+ \relax
\to \everystarttext
\appendtoks
- \ctxlua {
- job.initialize(tex.jobname .. ".tuc",tex.jobname .. ".tua")
- }%
+ \clf_initializejob
\to \everyjob
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/data-crl.lua b/Master/texmf-dist/tex/context/base/data-crl.lua
index 445bd5b0a70..fba5a62305b 100644
--- a/Master/texmf-dist/tex/context/base/data-crl.lua
+++ b/Master/texmf-dist/tex/context/base/data-crl.lua
@@ -28,7 +28,7 @@ local function runcurl(specification)
if not io.exists(cachename) then
cached[original] = cachename
local command = "curl --silent --create-dirs --output " .. cachename .. " " .. original
- os.spawn(command)
+ os.execute(command)
end
if io.exists(cachename) then
cached[original] = cachename
diff --git a/Master/texmf-dist/tex/context/base/data-env.lua b/Master/texmf-dist/tex/context/base/data-env.lua
index 58a081506b0..1d7728c22c9 100644
--- a/Master/texmf-dist/tex/context/base/data-env.lua
+++ b/Master/texmf-dist/tex/context/base/data-env.lua
@@ -18,11 +18,13 @@ local formats = allocate()
local suffixes = allocate()
local dangerous = allocate()
local suffixmap = allocate()
+local usertypes = allocate()
resolvers.formats = formats
resolvers.suffixes = suffixes
resolvers.dangerous = dangerous
resolvers.suffixmap = suffixmap
+resolvers.usertypes = usertypes
local luasuffixes = utilities.lua.suffixes
@@ -92,11 +94,13 @@ local relations = allocate { -- todo: handlers also here
names = { "mp" },
variable = 'MPINPUTS',
suffixes = { 'mp', 'mpvi', 'mpiv', 'mpii' },
+ usertype = true,
},
tex = {
names = { "tex" },
variable = 'TEXINPUTS',
- suffixes = { 'tex', "mkvi", "mkiv", "mkii" },
+ suffixes = { "tex", "mkvi", "mkiv", "mkii", "cld", "lfg", "xml" }, -- known suffixes have less lookups
+ usertype = true,
},
icc = {
names = { "icc", "icc profile", "icc profiles" },
@@ -112,6 +116,7 @@ local relations = allocate { -- todo: handlers also here
names = { "lua" },
variable = 'LUAINPUTS',
suffixes = { luasuffixes.lua, luasuffixes.luc, luasuffixes.tma, luasuffixes.tmc },
+ usertype = true,
},
lib = {
names = { "lib" },
@@ -120,11 +125,15 @@ local relations = allocate { -- todo: handlers also here
},
bib = {
names = { 'bib' },
+ variable = 'BIBINPUTS',
suffixes = { 'bib' },
+ usertype = true,
},
bst = {
names = { 'bst' },
+ variable = 'BSTINPUTS',
suffixes = { 'bst' },
+ usertype = true,
},
fontconfig = {
names = { 'fontconfig', 'fontconfig file', 'fontconfig files' },
@@ -210,8 +219,9 @@ function resolvers.updaterelations()
for name, relation in next, categories do
local rn = relation.names
local rv = relation.variable
- local rs = relation.suffixes
if rn and rv then
+ local rs = relation.suffixes
+ local ru = relation.usertype
for i=1,#rn do
local rni = lower(gsub(rn[i]," ",""))
formats[rni] = rv
@@ -223,8 +233,9 @@ function resolvers.updaterelations()
end
end
end
- end
- if rs then
+ if ru then
+ usertypes[name] = true
+ end
end
end
end
diff --git a/Master/texmf-dist/tex/context/base/data-exp.lua b/Master/texmf-dist/tex/context/base/data-exp.lua
index 9534e73a092..0a739617101 100644
--- a/Master/texmf-dist/tex/context/base/data-exp.lua
+++ b/Master/texmf-dist/tex/context/base/data-exp.lua
@@ -11,16 +11,20 @@ local concat, sort = table.concat, table.sort
local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
local Ct, Cs, Cc, Carg, P, C, S = lpeg.Ct, lpeg.Cs, lpeg.Cc, lpeg.Carg, lpeg.P, lpeg.C, lpeg.S
local type, next = type, next
+local isdir = lfs.isdir
local ostype = os.type
-local collapsepath = file.collapsepath
+local collapsepath, joinpath, basename = file.collapsepath, file.join, file.basename
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
local trace_expansions = false trackers.register("resolvers.expansions", function(v) trace_expansions = v end)
+local trace_globbing = true trackers.register("resolvers.globbing", function(v) trace_globbing = v end)
local report_expansions = logs.reporter("resolvers","expansions")
+local report_globbing = logs.reporter("resolvers","globbing")
-local resolvers = resolvers
+local resolvers = resolvers
+local resolveprefix = resolvers.resolve
-- As this bit of code is somewhat special it gets its own module. After
-- all, when working on the main resolver code, I don't want to scroll
@@ -177,34 +181,28 @@ end
-- {a,b,c/{p,q/{x,y,z},w}v,d/{p,q,r}}
-- {$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,.local,}/web2c}
-local cleanup = lpeg.replacer {
- { "!" , "" },
- { "\\" , "/" },
-}
+local usedhomedir = nil
+local donegation = (P("!") /"" )^0
+local doslashes = (P("\\")/"/" + 1)^0
-function resolvers.cleanpath(str) -- tricky, maybe only simple paths
- local doslashes = (P("\\")/"/" + 1)^0
- local donegation = (P("!") /"" )^0
- local homedir = lpegmatch(Cs(donegation * doslashes),environment.homedir or "")
- if homedir == "~" or homedir == "" or not lfs.isdir(homedir) then
- if trace_expansions then
- report_expansions("no home dir set, ignoring dependent paths")
- end
- function resolvers.cleanpath(str)
- if not str or find(str,"~",1,true) then
- return "" -- special case
- else
- return lpegmatch(cleanup,str)
+local function expandedhome()
+ if not usedhomedir then
+ usedhomedir = lpegmatch(Cs(donegation * doslashes),environment.homedir or "")
+ if usedhomedir == "~" or usedhomedir == "" or not isdir(usedhomedir) then
+ if trace_expansions then
+ report_expansions("no home dir set, ignoring dependent path using current path")
end
- end
- else
- local dohome = ((P("~")+P("$HOME"))/homedir)^0
- local cleanup = Cs(donegation * dohome * doslashes)
- function resolvers.cleanpath(str)
- return str and lpegmatch(cleanup,str) or ""
+ usedhomedir = "."
end
end
- return resolvers.cleanpath(str)
+ return usedhomedir
+end
+
+local dohome = ((P("~")+P("$HOME")+P("%HOME%"))/expandedhome)^0
+local cleanup = Cs(donegation * dohome * doslashes)
+
+resolvers.cleanpath = function(str)
+ return str and lpegmatch(cleanup,str) or ""
end
-- print(resolvers.cleanpath(""))
@@ -216,11 +214,18 @@ end
-- This one strips quotes and funny tokens.
-local expandhome = P("~") / "$HOME" -- environment.homedir or "home:"
+-- we have several options here:
+--
+-- expandhome = P("~") / "$HOME" : relocateble
+-- expandhome = P("~") / "home:" : relocateble
+-- expandhome = P("~") / environment.homedir : frozen but unexpanded
+-- expandhome = P("~") = dohome : frozen and expanded
-local dodouble = P('"')/"" * (expandhome + (1 - P('"')))^0 * P('"')/""
-local dosingle = P("'")/"" * (expandhome + (1 - P("'")))^0 * P("'")/""
-local dostring = (expandhome + 1 )^0
+local expandhome = P("~") / "$HOME"
+
+local dodouble = P('"') / "" * (expandhome + (1 - P('"')))^0 * P('"') / ""
+local dosingle = P("'") / "" * (expandhome + (1 - P("'")))^0 * P("'") / ""
+local dostring = (expandhome + 1 )^0
local stripper = Cs(
lpegpatterns.unspacer * (dosingle + dodouble + dostring) * lpegpatterns.unspacer
@@ -285,7 +290,7 @@ end
function resolvers.joinpath(str)
if type(str) == 'table' then
- return file.joinpath(str)
+ return joinpath(str)
else
return str
end
@@ -293,25 +298,25 @@ end
-- The next function scans directories and returns a hash where the
-- entries are either strings or tables.
-
+--
-- starting with . or .. etc or funny char
-
---~ local l_forbidden = S("~`!#$%^&*()={}[]:;\"\'||\\/<>,?\n\r\t")
---~ local l_confusing = P(" ")
---~ local l_character = lpegpatterns.utf8
---~ local l_dangerous = P(".")
-
---~ local l_normal = (l_character - l_forbidden - l_confusing - l_dangerous) * (l_character - l_forbidden - l_confusing^2)^0 * P(-1)
---~ ----- l_normal = l_normal * Cc(true) + Cc(false)
-
---~ local function test(str)
---~ print(str,lpegmatch(l_normal,str))
---~ end
---~ test("ヒラギノ明朝 Pro W3")
---~ test("..ヒラギノ明朝 Pro W3")
---~ test(":ヒラギノ明朝 Pro W3;")
---~ test("ヒラギノ明朝 /Pro W3;")
---~ test("ヒラギノ明朝 Pro W3")
+--
+-- local l_forbidden = S("~`!#$%^&*()={}[]:;\"\'||\\/<>,?\n\r\t")
+-- local l_confusing = P(" ")
+-- local l_character = lpegpatterns.utf8
+-- local l_dangerous = P(".")
+--
+-- local l_normal = (l_character - l_forbidden - l_confusing - l_dangerous) * (l_character - l_forbidden - l_confusing^2)^0 * P(-1)
+-- ----- l_normal = l_normal * Cc(true) + Cc(false)
+--
+-- local function test(str)
+-- print(str,lpegmatch(l_normal,str))
+-- end
+-- test("ヒラギノ明朝 Pro W3")
+-- test("..ヒラギノ明朝 Pro W3")
+-- test(":ヒラギノ明朝 Pro W3;")
+-- test("ヒラギノ明朝 /Pro W3;")
+-- test("ヒラギノ明朝 Pro W3")
-- a lot of this caching can be stripped away when we have ssd's everywhere
--
@@ -319,41 +324,67 @@ end
local attributes, directory = lfs.attributes, lfs.dir
-local weird = P(".")^1 + lpeg.anywhere(S("~`!#$%^&*()={}[]:;\"\'||<>,?\n\r\t"))
-local timer = { }
-local scanned = { }
-local nofscans = 0
-local scancache = { }
+local weird = P(".")^1 + lpeg.anywhere(S("~`!#$%^&*()={}[]:;\"\'||<>,?\n\r\t"))
+local lessweird = P(".")^1 + lpeg.anywhere(S("~`#$%^&*:;\"\'||<>,?\n\r\t"))
+local timer = { }
+local scanned = { }
+local nofscans = 0
+local scancache = { }
+local fullcache = { }
+----- simplecache = { }
+local nofsharedscans = 0
+
+-- So, we assume either a lowercase name or a mixed case one but only one such case
+-- as having Foo fOo foo FoO FOo etc on the system is braindead in any sane project.
-local function scan(files,spec,path,n,m,r)
- local full = (path == "" and spec) or (spec .. path .. '/')
+local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant)
+ local full = path == "" and spec or (spec .. path .. '/')
local dirs = { }
local nofdirs = 0
+ local pattern = tolerant and lessweird or weird
for name in directory(full) do
- if not lpegmatch(weird,name) then
- local mode = attributes(full..name,'mode')
- if mode == 'file' then
+ if not lpegmatch(pattern,name) then
+ local mode = attributes(full..name,"mode")
+ if mode == "file" then
n = n + 1
- local f = files[name]
- if f then
- if type(f) == 'string' then
- files[name] = { f, path }
+ local lower = lower(name)
+ local paths = files[lower]
+ if paths then
+ if onlyone then
+ -- forget about it
else
- f[#f+1] = path
+ if type(paths) == "string" then
+ files[lower] = { paths, path }
+ else
+ paths[#paths+1] = path
+ end
+ if name ~= lower then
+ local rl = remap[lower]
+ if not rl then
+ remap[lower] = name
+ r = r + 1
+ elseif trace_globbing and rl ~= name then
+ report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl)
+ end
+ end
end
else -- probably unique anyway
- files[name] = path
- local lower = lower(name)
+ files[lower] = path
if name ~= lower then
- files["remap:"..lower] = name
- r = r + 1
+ local rl = remap[lower]
+ if not rl then
+ remap[lower] = name
+ r = r + 1
+ elseif trace_globbing and rl ~= name then
+ report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl)
+ end
end
end
- elseif mode == 'directory' then
+ elseif mode == "directory" then
m = m + 1
nofdirs = nofdirs + 1
if path ~= "" then
- dirs[nofdirs] = path..'/'..name
+ dirs[nofdirs] = path .. "/" .. name
else
dirs[nofdirs] = name
end
@@ -363,113 +394,72 @@ local function scan(files,spec,path,n,m,r)
if nofdirs > 0 then
sort(dirs)
for i=1,nofdirs do
- files, n, m, r = scan(files,spec,dirs[i],n,m,r)
+ files, remap, n, m, r = scan(files,remap,spec,dirs[i],n,m,r,onlyonce,tolerant)
end
end
scancache[sub(full,1,-2)] = files
- return files, n, m, r
+ return files, remap, n, m, r
end
-local fullcache = { }
-
-function resolvers.scanfiles(path,branch,usecache)
- statistics.starttiming(timer)
- local realpath = resolvers.resolve(path) -- no shortcut
+function resolvers.scanfiles(path,branch,usecache,onlyonce,tolerant)
+ local realpath = resolveprefix(path)
if usecache then
- local files = fullcache[realpath]
- if files then
+ local content = fullcache[realpath]
+ if content then
if trace_locating then
- report_expansions("using caches scan of path %a, branch %a",path,branch or path)
+ report_expansions("using cached scan of path %a, branch %a",path,branch or path)
end
- return files
+ nofsharedscans = nofsharedscans + 1
+ return content
end
end
+ --
+ statistics.starttiming(timer)
if trace_locating then
report_expansions("scanning path %a, branch %a",path,branch or path)
end
- local files, n, m, r = scan({ },realpath .. '/',"",0,0,0)
- files.__path__ = path -- can be selfautoparent:texmf-whatever
- files.__files__ = n
- files.__directories__ = m
- files.__remappings__ = r
- if trace_locating then
- report_expansions("%s files found on %s directories with %s uppercase remappings",n,m,r)
+ local content
+ if isdir(realpath) then
+ local files, remap, n, m, r = scan({ },{ },realpath .. '/',"",0,0,0,onlyonce,tolerant)
+ content = {
+ metadata = {
+ path = path, -- can be selfautoparent:texmf-whatever
+ files = n,
+ directories = m,
+ remappings = r,
+ },
+ files = files,
+ remap = remap,
+ }
+ if trace_locating then
+ report_expansions("%s files found on %s directories with %s uppercase remappings",n,m,r)
+ end
+ else
+ content = {
+ metadata = {
+ path = path, -- can be selfautoparent:texmf-whatever
+ files = 0,
+ directories = 0,
+ remappings = 0,
+ },
+ files = { },
+ remap = { },
+ }
+ if trace_locating then
+ report_expansions("invalid path %a",realpath)
+ end
end
if usecache then
scanned[#scanned+1] = realpath
- fullcache[realpath] = files
+ fullcache[realpath] = content
end
nofscans = nofscans + 1
statistics.stoptiming(timer)
- return files
+ return content
end
-local function simplescan(files,spec,path) -- first match only, no map and such
- local full = (path == "" and spec) or (spec .. path .. '/')
- local dirs = { }
- local nofdirs = 0
- for name in directory(full) do
- if not lpegmatch(weird,name) then
- local mode = attributes(full..name,'mode')
- if mode == 'file' then
- if not files[name] then
- -- only first match
- files[name] = path
- end
- elseif mode == 'directory' then
- nofdirs = nofdirs + 1
- if path ~= "" then
- dirs[nofdirs] = path..'/'..name
- else
- dirs[nofdirs] = name
- end
- end
- end
- end
- if nofdirs > 0 then
- sort(dirs)
- for i=1,nofdirs do
- files = simplescan(files,spec,dirs[i])
- end
- end
- return files
-end
-
-local simplecache = { }
-local nofsharedscans = 0
-
function resolvers.simplescanfiles(path,branch,usecache)
- statistics.starttiming(timer)
- local realpath = resolvers.resolve(path) -- no shortcut
- if usecache then
- local files = simplecache[realpath]
- if not files then
- files = scancache[realpath]
- if files then
- nofsharedscans = nofsharedscans + 1
- end
- end
- if files then
- if trace_locating then
- report_expansions("using caches scan of path %a, branch %a",path,branch or path)
- end
- return files
- end
- end
- if trace_locating then
- report_expansions("scanning path %a, branch %a",path,branch or path)
- end
- local files = simplescan({ },realpath .. '/',"")
- if trace_locating then
- report_expansions("%s files found",table.count(files))
- end
- if usecache then
- scanned[#scanned+1] = realpath
- simplecache[realpath] = files
- end
- nofscans = nofscans + 1
- statistics.stoptiming(timer)
- return files
+ return resolvers.scanfiles(path,branch,usecache,true,true) -- onlyonce
end
function resolvers.scandata()
@@ -482,4 +472,57 @@ function resolvers.scandata()
}
end
---~ print(table.serialize(resolvers.scanfiles("t:/sources")))
+function resolvers.get_from_content(content,path,name) -- or (content,name)
+ if not content then
+ return
+ end
+ local files = content.files
+ if not files then
+ return
+ end
+ local remap = content.remap
+ if not remap then
+ return
+ end
+ if name then
+ -- this one resolves a remapped name
+ local used = lower(name)
+ return path, remap[used] or used
+ else
+ -- this one does a lookup and resolves a remapped name
+ local name = path
+ local used = lower(name)
+ local path = files[used]
+ if path then
+ return path, remap[used] or used
+ end
+ end
+end
+
+local nothing = function() end
+
+function resolvers.filtered_from_content(content,pattern)
+ if content and type(pattern) == "string" then
+ local pattern = lower(pattern)
+ local files = content.files
+ local remap = content.remap
+ if files and remap then
+ local n = next(files)
+ local function iterator()
+ while n do
+ local k = n
+ n = next(files,k)
+ if find(k,pattern) then
+ return files[k], remap and remap[k] or k
+ end
+ end
+ end
+ return iterator
+ end
+ end
+ return nothing
+end
+
+
+-- inspect(resolvers.simplescanfiles("e:/temporary/mb-mp"))
+-- inspect(resolvers.scanfiles("e:/temporary/mb-mp"))
diff --git a/Master/texmf-dist/tex/context/base/data-fil.lua b/Master/texmf-dist/tex/context/base/data-fil.lua
index 09129e03ce8..b699fc9e38f 100644
--- a/Master/texmf-dist/tex/context/base/data-fil.lua
+++ b/Master/texmf-dist/tex/context/base/data-fil.lua
@@ -10,7 +10,8 @@ local trace_locating = false trackers.register("resolvers.locating", function(v
local report_files = logs.reporter("resolvers","files")
-local resolvers = resolvers
+local resolvers = resolvers
+local resolveprefix = resolvers.resolve
local finders, openers, loaders, savers = resolvers.finders, resolvers.openers, resolvers.loaders, resolvers.savers
local locators, hashers, generators, concatinators = resolvers.locators, resolvers.hashers, resolvers.generators, resolvers.concatinators
@@ -18,35 +19,34 @@ local locators, hashers, generators, concatinators = resolvers.locators, resolve
local checkgarbage = utilities.garbagecollector and utilities.garbagecollector.check
function locators.file(specification)
- local name = specification.filename
- local realname = resolvers.resolve(name) -- no shortcut
+ local filename = specification.filename
+ local realname = resolveprefix(filename) -- no shortcut
if realname and realname ~= '' and lfs.isdir(realname) then
if trace_locating then
- report_files("file locator %a found as %a",name,realname)
+ report_files("file locator %a found as %a",filename,realname)
end
- resolvers.appendhash('file',name,true) -- cache
+ resolvers.appendhash('file',filename,true) -- cache
elseif trace_locating then
- report_files("file locator %a not found",name)
+ report_files("file locator %a not found",filename)
end
end
function hashers.file(specification)
- local name = specification.filename
- local content = caches.loadcontent(name,'files')
- resolvers.registerfilehash(name,content,content==nil)
+ local pathname = specification.filename
+ local content = caches.loadcontent(pathname,'files')
+ resolvers.registerfilehash(pathname,content,content==nil)
end
function generators.file(specification)
- local path = specification.filename
- local content = resolvers.scanfiles(path,false,true) -- scan once
---~ inspect(content)
- resolvers.registerfilehash(path,content,true)
+ local pathname = specification.filename
+ local content = resolvers.scanfiles(pathname,false,true) -- scan once
+ resolvers.registerfilehash(pathname,content,true)
end
concatinators.file = file.join
function finders.file(specification,filetype)
- local filename = specification.filename
+ local filename = specification.filename
local foundname = resolvers.findfile(filename,filetype)
if foundname and foundname ~= "" then
if trace_locating then
diff --git a/Master/texmf-dist/tex/context/base/data-ini.lua b/Master/texmf-dist/tex/context/base/data-ini.lua
index bbd233ae7f7..c74ff2e04b2 100644
--- a/Master/texmf-dist/tex/context/base/data-ini.lua
+++ b/Master/texmf-dist/tex/context/base/data-ini.lua
@@ -6,10 +6,12 @@ if not modules then modules = { } end modules ['data-ini'] = {
license = "see context related readme files",
}
+local next, type, getmetatable, rawset = next, type, getmetatable, rawset
local gsub, find, gmatch, char = string.gsub, string.find, string.gmatch, string.char
-local next, type = next, type
-
local filedirname, filebasename, filejoin = file.dirname, file.basename, file.join
+local ostype, osname, osuname, ossetenv, osgetenv = os.type, os.name, os.uname, os.setenv, os.getenv
+
+local P, S, R, C, Cs, Cc, lpegmatch = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.match
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
local trace_detail = false trackers.register("resolvers.details", function(v) trace_detail = v end)
@@ -17,11 +19,9 @@ local trace_expansions = false trackers.register("resolvers.expansions", functi
local report_initialization = logs.reporter("resolvers","initialization")
-local ostype, osname, ossetenv, osgetenv = os.type, os.name, os.setenv, os.getenv
-
--- The code here used to be part of a data-res but for convenience
--- we now split it over multiple files. As this file is now the
--- starting point we introduce resolvers here.
+-- The code here used to be part of a data-res but for convenience we now split it over multiple
+-- files. As this file is now the starting point we introduce resolvers here. We also put some
+-- helpers here that later can be reimplemented of extended.
resolvers = resolvers or { }
local resolvers = resolvers
@@ -225,8 +225,136 @@ end
-- a forward definition
-if not resolvers.resolve then
- function resolvers.resolve (s) return s end
- function resolvers.unresolve(s) return s end
- function resolvers.repath (s) return s end
+-- Because we use resolvers.resolve a lot later on, we will implement the basics here and
+-- add more later.
+
+local prefixes = utilities.storage.allocate()
+resolvers.prefixes = prefixes
+
+local resolved = { }
+local abstract = { }
+local dynamic = { }
+
+function resolvers.resetresolve(str)
+ resolved, abstract = { }, { }
+end
+
+function resolvers.allprefixes(separator)
+ local all = table.sortedkeys(prefixes)
+ if separator then
+ for i=1,#all do
+ all[i] = all[i] .. ":"
+ end
+ end
+ return all
+end
+
+local function _resolve_(method,target)
+ local action = prefixes[method]
+ if action then
+ return action(target)
+ else
+ return method .. ":" .. target
+ end
+end
+
+function resolvers.unresolve(str)
+ return abstract[str] or str
+end
+
+function resolvers.setdynamic(str)
+ dynamic[str] = true
+end
+
+-- home:xx;selfautoparent:xx;
+
+local pattern = Cs((C(R("az")^2) * P(":") * C((1-S(" \"\';,"))^1) / _resolve_ + P(1))^0)
+
+local prefix = C(R("az")^2) * P(":")
+local target = C((1-S(" \"\';,"))^1)
+local notarget = (#S(";,") + P(-1)) * Cc("")
+
+local p_resolve = Cs(((prefix * (target + notarget)) / _resolve_ + P(1))^0)
+local p_simple = prefix * P(-1)
+
+local function resolve(str) -- use schemes, this one is then for the commandline only
+ if type(str) == "table" then
+ local res = { }
+ for i=1,#str do
+ res[i] = resolve(str[i])
+ end
+ return res
+ end
+ -- already resolved
+ local res = resolved[str]
+ if res then
+ return res
+ end
+ -- simple resolving of (dynamic) methods
+ local simple = lpegmatch(p_simple,str)
+ local action = prefixes[simple]
+ if action then
+ local res = action(res)
+ if not dynamic[simple] then
+ resolved[simple] = res
+ abstract[res] = simple
+ end
+ return res
+ end
+ -- more extensive resolving (multiple too)
+ res = lpegmatch(p_resolve,str)
+ resolved[str] = res
+ abstract[res] = str
+ return res
+end
+
+resolvers.resolve = resolve
+
+if type(osuname) == "function" then
+
+ for k, v in next, osuname() do
+ if not prefixes[k] then
+ prefixes[k] = function() return v end
+ end
+ end
+
+end
+
+if ostype == "unix" then
+
+ -- We need to distringuish between a prefix and something else : so we
+ -- have a special repath variant for linux. Also, when a new prefix is
+ -- defined, we need to remake the matcher.
+
+ local pattern
+
+ local function makepattern(t,k,v)
+ if t then
+ rawset(t,k,v)
+ end
+ local colon = P(":")
+ for k, v in table.sortedpairs(prefixes) do
+ if p then
+ p = P(k) + p
+ else
+ p = P(k)
+ end
+ end
+ pattern = Cs((p * colon + colon/";" + P(1))^0)
+ end
+
+ makepattern()
+
+ table.setmetatablenewindex(prefixes,makepattern)
+
+ function resolvers.repath(str)
+ return lpegmatch(pattern,str)
+ end
+
+else -- already the default:
+
+ function resolvers.repath(str)
+ return str
+ end
+
end
diff --git a/Master/texmf-dist/tex/context/base/data-lst.lua b/Master/texmf-dist/tex/context/base/data-lst.lua
index 8996fa251ed..e4621a6e16d 100644
--- a/Master/texmf-dist/tex/context/base/data-lst.lua
+++ b/Master/texmf-dist/tex/context/base/data-lst.lua
@@ -8,12 +8,16 @@ if not modules then modules = { } end modules ['data-lst'] = {
-- used in mtxrun, can be loaded later .. todo
-local find, concat, upper, format = string.find, table.concat, string.upper, string.format
+local rawget, type, next = rawget, type, next
+
+local find, concat, upper = string.find, table.concat, string.upper
local fastcopy, sortedpairs = table.fastcopy, table.sortedpairs
-resolvers.listers = resolvers.listers or { }
+local resolvers = resolvers
+local listers = resolvers.listers or { }
+resolvers.listers = listers
-local resolvers = resolvers
+local resolveprefix = resolvers.resolve
local report_lists = logs.reporter("resolvers","lists")
@@ -25,7 +29,7 @@ local function tabstr(str)
end
end
-function resolvers.listers.variables(pattern)
+function listers.variables(pattern)
local instance = resolvers.instance
local environment = instance.environment
local variables = instance.variables
@@ -46,10 +50,10 @@ function resolvers.listers.variables(pattern)
for key, value in sortedpairs(configured) do
if key ~= "" and (pattern == "" or find(upper(key),pattern)) then
report_lists(key)
- report_lists(" env: %s",tabstr(rawget(environment,key)) or "unset")
- report_lists(" var: %s",tabstr(configured[key]) or "unset")
- report_lists(" exp: %s",tabstr(expansions[key]) or "unset")
- report_lists(" res: %s",tabstr(resolvers.resolve(expansions[key])) or "unset")
+ report_lists(" env: %s",tabstr(rawget(environment,key)) or "unset")
+ report_lists(" var: %s",tabstr(configured[key]) or "unset")
+ report_lists(" exp: %s",tabstr(expansions[key]) or "unset")
+ report_lists(" res: %s",tabstr(resolveprefix(expansions[key])) or "unset")
end
end
instance.environment = fastcopy(env)
@@ -59,15 +63,15 @@ end
local report_resolved = logs.reporter("system","resolved")
-function resolvers.listers.configurations()
+function listers.configurations()
local configurations = resolvers.instance.specification
for i=1,#configurations do
- report_resolved("file : %s",resolvers.resolve(configurations[i]))
+ report_resolved("file : %s",resolveprefix(configurations[i]))
end
report_resolved("")
local list = resolvers.expandedpathfromlist(resolvers.splitpath(resolvers.luacnfspec))
for i=1,#list do
- local li = resolvers.resolve(list[i])
+ local li = resolveprefix(list[i])
if lfs.isdir(li) then
report_resolved("path - %s",li)
else
diff --git a/Master/texmf-dist/tex/context/base/data-lua.lua b/Master/texmf-dist/tex/context/base/data-lua.lua
index 0e7c81181bb..7c12a5940f5 100644
--- a/Master/texmf-dist/tex/context/base/data-lua.lua
+++ b/Master/texmf-dist/tex/context/base/data-lua.lua
@@ -8,7 +8,7 @@ if not modules then modules = { } end modules ['data-lua'] = {
-- This is now a plug in into l-lua (as we also use the extra paths elsewhere).
-local resolvers, package = resolvers, package
+local package, lpeg = package, lpeg
local gsub = string.gsub
local concat = table.concat
@@ -16,18 +16,21 @@ local addsuffix = file.addsuffix
local P, S, Cs, lpegmatch = lpeg.P, lpeg.S, lpeg.Cs, lpeg.match
-local luasuffixes = { 'tex', 'lua' }
-local libsuffixes = { 'lib' }
-local luaformats = { 'TEXINPUTS', 'LUAINPUTS' }
-local libformats = { 'CLUAINPUTS' }
-local helpers = package.helpers or { }
-local methods = helpers.methods or { }
+local luasuffixes = { 'tex', 'lua' }
+local libsuffixes = { 'lib' }
+local luaformats = { 'TEXINPUTS', 'LUAINPUTS' }
+local libformats = { 'CLUAINPUTS' }
+local helpers = package.helpers or { }
+local methods = helpers.methods or { }
+
+local resolvers = resolvers
+local resolveprefix = resolvers.resolve
+
+helpers.report = logs.reporter("resolvers","libraries")
trackers.register("resolvers.libraries", function(v) helpers.trace = v end)
trackers.register("resolvers.locating", function(v) helpers.trace = v end)
-helpers.report = logs.reporter("resolvers","libraries")
-
helpers.sequence = {
"already loaded",
"preload table",
@@ -44,7 +47,7 @@ helpers.sequence = {
local pattern = Cs(P("!")^0 / "" * (P("/") * P(-1) / "/" + P("/")^1 / "/" + 1)^0)
function helpers.cleanpath(path) -- hm, don't we have a helper for this?
- return resolvers.resolve(lpegmatch(pattern,path))
+ return resolveprefix(lpegmatch(pattern,path))
end
local loadedaslib = helpers.loadedaslib
diff --git a/Master/texmf-dist/tex/context/base/data-met.lua b/Master/texmf-dist/tex/context/base/data-met.lua
index 67b9eb22b27..4e8a48f50e1 100644
--- a/Master/texmf-dist/tex/context/base/data-met.lua
+++ b/Master/texmf-dist/tex/context/base/data-met.lua
@@ -36,8 +36,6 @@ local function splitmethod(filename) -- todo: filetype in specification
end
filename = file.collapsepath(filename,".") -- hm, we should keep ./ in some cases
- -- filename = gsub(filename,"^%./",getcurrentdir().."/") -- we will merge dir.expandname and collapse some day
-
if not find(filename,"://",1,true) then
return { scheme = "file", path = filename, original = filename, filename = filename }
end
diff --git a/Master/texmf-dist/tex/context/base/data-pre.lua b/Master/texmf-dist/tex/context/base/data-pre.lua
index f2f5bddc44c..1c5016f8644 100644
--- a/Master/texmf-dist/tex/context/base/data-pre.lua
+++ b/Master/texmf-dist/tex/context/base/data-pre.lua
@@ -6,63 +6,61 @@ if not modules then modules = { } end modules ['data-pre'] = {
license = "see context related readme files"
}
--- It could be interesting to hook the resolver in the file
--- opener so that unresolved prefixes travel around and we
--- get more abstraction.
+local resolvers = resolvers
+local prefixes = resolvers.prefixes
--- As we use this beforehand we will move this up in the chain
--- of loading.
+local cleanpath = resolvers.cleanpath
+local findgivenfile = resolvers.findgivenfile
+local expansion = resolvers.expansion
+local getenv = resolvers.getenv -- we can probably also use resolvers.expansion
---~ print(resolvers.resolve("abc env:tmp file:cont-en.tex path:cont-en.tex full:cont-en.tex rel:zapf/one/p-chars.tex"))
+local basename = file.basename
+local dirname = file.dirname
+local joinpath = file.join
-local resolvers = resolvers
-local prefixes = utilities.storage.allocate()
-resolvers.prefixes = prefixes
-
-local cleanpath, findgivenfile, expansion = resolvers.cleanpath, resolvers.findgivenfile, resolvers.expansion
-local getenv = resolvers.getenv -- we can probably also use resolvers.expansion
-local P, S, R, C, Cs, Cc, lpegmatch = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.match
-local joinpath, basename, dirname = file.join, file.basename, file.dirname
-local getmetatable, rawset, type = getmetatable, rawset, type
-
--- getenv = function(...) return resolvers.getenv(...) end -- needs checking (definitions changes later on)
+local isfile = lfs.isfile
prefixes.environment = function(str)
return cleanpath(expansion(str))
end
-prefixes.relative = function(str,n) -- lfs.isfile
- if io.exists(str) then
- -- nothing
- elseif io.exists("./" .. str) then
- str = "./" .. str
- else
- local p = "../"
- for i=1,n or 2 do
- if io.exists(p .. str) then
- str = p .. str
- break
- else
- p = p .. "../"
+local function relative(str,n)
+ if not isfile(str) then
+ local pstr = "./" .. str
+ if isfile(pstr) then
+ str = pstr
+ else
+ local p = "../"
+ for i=1,n or 2 do
+ local pstr = p .. str
+ if isfile(pstr) then
+ str = pstr
+ break
+ else
+ p = p .. "../"
+ end
end
end
end
return cleanpath(str)
end
+local function locate(str)
+ local fullname = findgivenfile(str) or ""
+ return cleanpath(fullname ~= "" and fullname or str)
+end
+
+prefixes.relative = relative
+prefixes.locate = locate
+
prefixes.auto = function(str)
- local fullname = prefixes.relative(str)
- if not lfs.isfile(fullname) then
- fullname = prefixes.locate(str)
+ local fullname = relative(str)
+ if not isfile(fullname) then
+ fullname = locate(str)
end
return fullname
end
-prefixes.locate = function(str)
- local fullname = findgivenfile(str) or ""
- return cleanpath((fullname ~= "" and fullname) or str)
-end
-
prefixes.filename = function(str)
local fullname = findgivenfile(str) or ""
return cleanpath(basename((fullname ~= "" and fullname) or str)) -- no cleanpath needed here
@@ -89,25 +87,6 @@ prefixes.home = function(str)
return cleanpath(joinpath(getenv('HOME'),str))
end
-local function toppath()
- local inputstack = resolvers.inputstack -- dependency, actually the code should move but it's
- if not inputstack then -- more convenient to keep it here
- return "."
- end
- local pathname = dirname(inputstack[#inputstack] or "")
- if pathname == "" then
- return "."
- else
- return pathname
- end
-end
-
-resolvers.toppath = toppath
-
-prefixes.toppath = function(str)
- return cleanpath(joinpath(toppath(),str))
-end
-
prefixes.env = prefixes.environment
prefixes.rel = prefixes.relative
prefixes.loc = prefixes.locate
@@ -116,131 +95,48 @@ prefixes.full = prefixes.locate
prefixes.file = prefixes.filename
prefixes.path = prefixes.pathname
-function resolvers.allprefixes(separator)
- local all = table.sortedkeys(prefixes)
- if separator then
- for i=1,#all do
- all[i] = all[i] .. ":"
- end
- end
- return all
-end
+-- This one assumes that inputstack is set (used in the tex loader). It is a momentary resolve
+-- as the top of the input stack changes.
-local function _resolve_(method,target)
- local action = prefixes[method]
- if action then
- return action(target)
- else
- return method .. ":" .. target
+local function toppath()
+ local inputstack = resolvers.inputstack -- dependency, actually the code should move but it's
+ if not inputstack then -- more convenient to keep it here
+ return "."
end
-end
-
-local resolved, abstract = { }, { }
-
-function resolvers.resetresolve(str)
- resolved, abstract = { }, { }
-end
-
--- todo: use an lpeg (see data-lua for !! / stripper)
-
--- local function resolve(str) -- use schemes, this one is then for the commandline only
--- if type(str) == "table" then
--- local t = { }
--- for i=1,#str do
--- t[i] = resolve(str[i])
--- end
--- return t
--- else
--- local res = resolved[str]
--- if not res then
--- res = gsub(str,"([a-z][a-z]+):([^ \"\';,]*)",_resolve_) -- home:xx;selfautoparent:xx; etc (comma added)
--- resolved[str] = res
--- abstract[res] = str
--- end
--- return res
--- end
--- end
-
--- home:xx;selfautoparent:xx;
-
-local pattern = Cs((C(R("az")^2) * P(":") * C((1-S(" \"\';,"))^1) / _resolve_ + P(1))^0)
-
-local prefix = C(R("az")^2) * P(":")
-local target = C((1-S(" \"\';,"))^1)
-local notarget = (#S(";,") + P(-1)) * Cc("")
-
-local pattern = Cs(((prefix * (target + notarget)) / _resolve_ + P(1))^0)
-
-local function resolve(str) -- use schemes, this one is then for the commandline only
- if type(str) == "table" then
- local t = { }
- for i=1,#str do
- t[i] = resolve(str[i])
- end
- return t
+ local pathname = dirname(inputstack[#inputstack] or "")
+ if pathname == "" then
+ return "."
else
- local res = resolved[str]
- if not res then
- res = lpegmatch(pattern,str)
- resolved[str] = res
- abstract[res] = str
- end
- return res
+ return pathname
end
end
-local function unresolve(str)
- return abstract[str] or str
-end
-
-resolvers.resolve = resolve
-resolvers.unresolve = unresolve
+-- The next variant is similar but bound to explicitly registered paths. Practice should
+-- show if that gives the same results as the previous one. It is meant for a project
+-- stucture.
-if type(os.uname) == "function" then
-
- for k, v in next, os.uname() do
- if not prefixes[k] then
- prefixes[k] = function() return v end
- end
+local function jobpath()
+ local path = resolvers.stackpath()
+ if not path or path == "" then
+ return "."
+ else
+ return path
end
-
end
-if os.type == "unix" then
-
- -- We need to distringuish between a prefix and something else : so we
- -- have a special repath variant for linux. Also, when a new prefix is
- -- defined, we need to remake the matcher.
-
- local pattern
-
- local function makepattern(t,k,v)
- if t then
- rawset(t,k,v)
- end
- local colon = P(":")
- for k, v in table.sortedpairs(prefixes) do
- if p then
- p = P(k) + p
- else
- p = P(k)
- end
- end
- pattern = Cs((p * colon + colon/";" + P(1))^0)
- end
+resolvers.toppath = toppath
+resolvers.jobpath = jobpath
- makepattern()
+-- This hook sit into the resolver:
- getmetatable(prefixes).__newindex = makepattern
+prefixes.toppath = function(str) return cleanpath(joinpath(toppath(),str)) end -- str can be nil or empty
+prefixes.jobpath = function(str) return cleanpath(joinpath(jobpath(),str)) end -- str can be nil or empty
- function resolvers.repath(str)
- return lpegmatch(pattern,str)
- end
+resolvers.setdynamic("toppath")
+resolvers.setdynamic("jobpath")
-else -- already the default:
+-- for a while (obsolete):
- function resolvers.repath(str)
- return str
- end
+prefixes.jobfile = prefixes.jobpath
-end
+resolvers.setdynamic("jobfile")
diff --git a/Master/texmf-dist/tex/context/base/data-res.lua b/Master/texmf-dist/tex/context/base/data-res.lua
index d79d78a728b..cbda21ce212 100644
--- a/Master/texmf-dist/tex/context/base/data-res.lua
+++ b/Master/texmf-dist/tex/context/base/data-res.lua
@@ -18,7 +18,7 @@ if not modules then modules = { } end modules ['data-res'] = {
-- todo: cache:/// home:/// selfautoparent:/// (sometime end 2012)
local gsub, find, lower, upper, match, gmatch = string.gsub, string.find, string.lower, string.upper, string.match, string.gmatch
-local concat, insert, sortedkeys = table.concat, table.insert, table.sortedkeys
+local concat, insert, remove, sortedkeys, sortedhash = table.concat, table.insert, table.remove, table.sortedkeys, table.sortedhash
local next, type, rawget = next, type, rawget
local os = os
@@ -29,35 +29,48 @@ local formatters = string.formatters
local filedirname = file.dirname
local filebasename = file.basename
local suffixonly = file.suffixonly
+local addsuffix = file.addsuffix
+local removesuffix = file.removesuffix
local filejoin = file.join
local collapsepath = file.collapsepath
local joinpath = file.joinpath
+local is_qualified_path = file.is_qualified_path
+
local allocate = utilities.storage.allocate
local settings_to_array = utilities.parsers.settings_to_array
+
+local getcurrentdir = lfs.currentdir
+local isfile = lfs.isfile
+local isdir = lfs.isdir
+
local setmetatableindex = table.setmetatableindex
local luasuffixes = utilities.lua.suffixes
-local getcurrentdir = lfs.currentdir
local trace_locating = false trackers .register("resolvers.locating", function(v) trace_locating = v end)
local trace_detail = false trackers .register("resolvers.details", function(v) trace_detail = v end)
local trace_expansions = false trackers .register("resolvers.expansions", function(v) trace_expansions = v end)
+local trace_paths = false trackers .register("resolvers.paths", function(v) trace_paths = v end)
local resolve_otherwise = true directives.register("resolvers.otherwise", function(v) resolve_otherwise = v end)
local report_resolving = logs.reporter("resolvers","resolving")
-local resolvers = resolvers
+local resolvers = resolvers
local expandedpathfromlist = resolvers.expandedpathfromlist
local checkedvariable = resolvers.checkedvariable
local splitconfigurationpath = resolvers.splitconfigurationpath
local methodhandler = resolvers.methodhandler
+local filtered = resolvers.filtered_from_content
+local lookup = resolvers.get_from_content
+local cleanpath = resolvers.cleanpath
+local resolveprefix = resolvers.resolve
-local initializesetter = utilities.setters.initialize
+local initializesetter = utilities.setters.initialize
local ostype, osname, osenv, ossetenv, osgetenv = os.type, os.name, os.env, os.setenv, os.getenv
-resolvers.cacheversion = '1.0.1'
-resolvers.configbanner = ''
+resolvers.cacheversion = "1.100"
+resolvers.configbanner = ""
resolvers.homedir = environment.homedir
resolvers.criticalvars = allocate { "SELFAUTOLOC", "SELFAUTODIR", "SELFAUTOPARENT", "TEXMFCNF", "TEXMF", "TEXOS" }
resolvers.luacnfname = "texmfcnf.lua"
@@ -134,6 +147,7 @@ local unset_variable = "unset"
local formats = resolvers.formats
local suffixes = resolvers.suffixes
+local usertypes = resolvers.usertypes
local dangerous = resolvers.dangerous
local suffixmap = resolvers.suffixmap
@@ -155,7 +169,7 @@ function resolvers.setenv(key,value,raw)
-- we feed back into the environment, and as this is used
-- by other applications (via os.execute) we need to make
-- sure that prefixes are resolve
- ossetenv(key,raw and value or resolvers.resolve(value))
+ ossetenv(key,raw and value or resolveprefix(value))
end
end
@@ -178,7 +192,7 @@ resolvers.env = getenv
-- We are going to use some metatable trickery where we backtrack from
-- expansion to variable to environment.
-local function resolve(k)
+local function resolvevariable(k)
return instance.expansions[k]
end
@@ -191,12 +205,12 @@ local somekey = C(R("az","AZ","09","__","--")^1)
local somethingelse = P(";") * ((1-S("!{}/\\"))^1 * P(";") / "")
+ P(";") * (P(";") / "")
+ P(1)
-local variableexpander = Cs( (somevariable * (somekey/resolve) + somethingelse)^1 )
+local variableexpander = Cs( (somevariable * (somekey/resolvevariable) + somethingelse)^1 )
local cleaner = P("\\") / "/" + P(";") * S("!{}/\\")^0 * P(";")^1 / ";"
local variablecleaner = Cs((cleaner + P(1))^0)
-local somevariable = R("az","AZ","09","__","--")^1 / resolve
+local somevariable = R("az","AZ","09","__","--")^1 / resolvevariable
local variable = (P("$")/"") * (somevariable + (P("{")/"") * somevariable * (P("}")/""))
local variableresolver = Cs((variable + P(1))^0)
@@ -206,9 +220,12 @@ end
function resolvers.newinstance() -- todo: all vars will become lowercase and alphanum only
- if trace_locating then
+ -- normally we only need one instance but for special cases we can (re)load one so
+ -- we stick to this model.
+
+ if trace_locating then
report_resolving("creating instance")
- end
+ end
local environment, variables, expansions, order = allocate(), allocate(), allocate(), allocate()
@@ -223,6 +240,7 @@ function resolvers.newinstance() -- todo: all vars will become lowercase and alp
foundintrees = allocate(),
hashes = allocate(),
hashed = allocate(),
+ pathlists = false,-- delayed
specification = allocate(),
lists = allocate(),
data = allocate(), -- only for loading
@@ -235,6 +253,7 @@ function resolvers.newinstance() -- todo: all vars will become lowercase and alp
savelists = true,
pattern = nil, -- lists
force_suffixes = true,
+ pathstack = { },
}
setmetatableindex(variables,function(t,k)
@@ -291,8 +310,14 @@ function resolvers.reset()
end
local function reset_hashes()
- instance.lists = { }
- instance.found = { }
+ instance.lists = { }
+ instance.pathlists = false
+ instance.found = { }
+end
+
+local function reset_caches()
+ instance.lists = { }
+ instance.pathlists = false
end
local slash = P("/")
@@ -356,14 +381,14 @@ local function identify_configuration_files()
for i=1,#cnfpaths do
local filepath = cnfpaths[i]
local filename = collapsepath(filejoin(filepath,luacnfname))
- local realname = resolvers.resolve(filename) -- can still have "//" ... needs checking
+ local realname = resolveprefix(filename) -- can still have "//" ... needs checking
-- todo: environment.skipweirdcnfpaths directive
if trace_locating then
- local fullpath = gsub(resolvers.resolve(collapsepath(filepath)),"//","/")
+ local fullpath = gsub(resolveprefix(collapsepath(filepath)),"//","/")
local weirdpath = find(fullpath,"/texmf.+/texmf") or not find(fullpath,"/web2c",1,true)
report_resolving("looking for %a on %s path %a from specification %a",luacnfname,weirdpath and "weird" or "given",fullpath,filepath)
end
- if lfs.isfile(realname) then
+ if isfile(realname) then
specification[#specification+1] = filename -- unresolved as we use it in matching, relocatable
if trace_locating then
report_resolving("found configuration file %a",realname)
@@ -386,7 +411,7 @@ local function load_configuration_files()
local filename = specification[i]
local pathname = filedirname(filename)
local filename = filejoin(pathname,luacnfname)
- local realname = resolvers.resolve(filename) -- no shortcut
+ local realname = resolveprefix(filename) -- no shortcut
local blob = loadfile(realname)
if blob then
local setups = instance.setups
@@ -394,7 +419,7 @@ local function load_configuration_files()
local parent = data and data.parent
if parent then
local filename = filejoin(pathname,parent)
- local realname = resolvers.resolve(filename) -- no shortcut
+ local realname = resolveprefix(filename) -- no shortcut
local blob = loadfile(realname)
if blob then
local parentdata = blob()
@@ -419,7 +444,7 @@ local function load_configuration_files()
elseif variables[k] == nil then
if trace_locating and not warning then
report_resolving("variables like %a in configuration file %a should move to the 'variables' subtable",
- k,resolvers.resolve(filename))
+ k,resolveprefix(filename))
warning = true
end
variables[k] = v
@@ -492,7 +517,7 @@ local function locate_file_databases()
local stripped = lpegmatch(inhibitstripper,path) -- the !! thing
if stripped ~= "" then
local runtime = stripped == path
- path = resolvers.cleanpath(path)
+ path = cleanpath(path)
local spec = resolvers.splitmethod(stripped)
if runtime and (spec.noscheme or spec.scheme == "file") then
stripped = "tree:///" .. stripped
@@ -558,8 +583,8 @@ function resolvers.renew(hashname)
report_resolving("identifying tree %a",hashname)
end
end
- local realpath = resolvers.resolve(hashname)
- if lfs.isdir(realpath) then
+ local realpath = resolveprefix(hashname)
+ if isdir(realpath) then
if trace_locating then
report_resolving("using path %a",realpath)
end
@@ -681,25 +706,62 @@ function resolvers.unexpandedpath(str)
return joinpath(resolvers.unexpandedpathlist(str))
end
+function resolvers.pushpath(name)
+ local pathstack = instance.pathstack
+ local lastpath = pathstack[#pathstack]
+ local pluspath = filedirname(name)
+ if lastpath then
+ lastpath = collapsepath(filejoin(lastpath,pluspath))
+ else
+ lastpath = collapsepath(pluspath)
+ end
+ insert(pathstack,lastpath)
+ if trace_paths then
+ report_resolving("pushing path %a",lastpath)
+ end
+end
+
+function resolvers.poppath()
+ local pathstack = instance.pathstack
+ if trace_paths and #pathstack > 0 then
+ report_resolving("popping path %a",pathstack[#pathstack])
+ end
+ remove(pathstack)
+end
+
+function resolvers.stackpath()
+ local pathstack = instance.pathstack
+ local currentpath = pathstack[#pathstack]
+ return currentpath ~= "" and currentpath or nil
+end
+
local done = { }
function resolvers.resetextrapath()
local ep = instance.extra_paths
if not ep then
- ep, done = { }, { }
- instance.extra_paths = ep
+ done = { }
+ instance.extra_paths = { }
elseif #ep > 0 then
- instance.lists, done = { }, { }
+ done = { }
+ reset_caches()
end
end
function resolvers.registerextrapath(paths,subpaths)
- paths = settings_to_array(paths)
- subpaths = settings_to_array(subpaths)
- local ep = instance.extra_paths or { }
- local oldn = #ep
- local newn = oldn
- local nofpaths = #paths
+ if not subpaths or subpaths == "" then
+ if not paths or path == "" then
+ return -- invalid spec
+ elseif done[paths] then
+ return -- already done
+ end
+ end
+ local paths = settings_to_array(paths)
+ local subpaths = settings_to_array(subpaths)
+ local ep = instance.extra_paths or { }
+ local oldn = #ep
+ local newn = oldn
+ local nofpaths = #paths
local nofsubpaths = #subpaths
if nofpaths > 0 then
if nofsubpaths > 0 then
@@ -710,7 +772,7 @@ function resolvers.registerextrapath(paths,subpaths)
local ps = p .. "/" .. s
if not done[ps] then
newn = newn + 1
- ep[newn] = resolvers.cleanpath(ps)
+ ep[newn] = cleanpath(ps)
done[ps] = true
end
end
@@ -720,7 +782,7 @@ function resolvers.registerextrapath(paths,subpaths)
local p = paths[i]
if not done[p] then
newn = newn + 1
- ep[newn] = resolvers.cleanpath(p)
+ ep[newn] = cleanpath(p)
done[p] = true
end
end
@@ -732,7 +794,7 @@ function resolvers.registerextrapath(paths,subpaths)
local ps = ep[i] .. "/" .. s
if not done[ps] then
newn = newn + 1
- ep[newn] = resolvers.cleanpath(ps)
+ ep[newn] = cleanpath(ps)
done[ps] = true
end
end
@@ -741,57 +803,80 @@ function resolvers.registerextrapath(paths,subpaths)
if newn > 0 then
instance.extra_paths = ep -- register paths
end
- if newn > oldn then
- instance.lists = { } -- erase the cache
+ if newn ~= oldn then
+ reset_caches()
end
end
-local function made_list(instance,list)
- local ep = instance.extra_paths
- if not ep or #ep == 0 then
- return list
+function resolvers.pushextrapath(path)
+ local paths = settings_to_array(path)
+ if instance.extra_stack then
+ insert(instance.extra_stack,1,paths)
else
- local done, new, newn = { }, { }, 0
- -- honour . .. ../.. but only when at the start
- for k=1,#list do
- local v = list[k]
- if not done[v] then
- if find(v,"^[%.%/]$") then
- done[v] = true
- newn = newn + 1
- new[newn] = v
- else
- break
- end
- end
- end
- -- first the extra paths
- for k=1,#ep do
- local v = ep[k]
+ instance.extra_stack = { paths }
+ end
+ reset_caches()
+end
+
+function resolvers.popextrapath()
+ if instance.extra_stack then
+ reset_caches()
+ return remove(instance.extra_stack,1)
+ end
+end
+
+local function made_list(instance,list,extra_too)
+ local done = { }
+ local new = { }
+ local newn = 0
+ -- a helper
+ local function add(p)
+ for k=1,#p do
+ local v = p[k]
if not done[v] then
done[v] = true
newn = newn + 1
new[newn] = v
end
end
- -- next the formal paths
- for k=1,#list do
- local v = list[k]
- if not done[v] then
- done[v] = true
- newn = newn + 1
- new[newn] = v
+ end
+ -- honour . .. ../.. but only when at the start
+ for k=1,#list do
+ local v = list[k]
+ if done[v] then
+ -- skip
+ elseif find(v,"^[%.%/]$") then
+ done[v] = true
+ newn = newn + 1
+ new[newn] = v
+ else
+ break
+ end
+ end
+ if extra_too then
+ -- first the stacked paths
+ local es = instance.extra_stack
+ if es and #es > 0 then
+ for k=1,#es do
+ add(es[k])
end
end
- return new
+ -- then the extra paths
+ local ep = instance.extra_paths
+ if ep and #ep > 0 then
+ add(ep)
+ end
end
+ -- last the formal paths
+ add(list)
+ return new
end
function resolvers.cleanpathlist(str)
local t = resolvers.expandedpathlist(str)
if t then
for i=1,#t do
- t[i] = collapsepath(resolvers.cleanpath(t[i]))
+ t[i] = collapsepath(cleanpath(t[i]))
end
end
return t
@@ -801,22 +886,22 @@ function resolvers.expandpath(str)
return joinpath(resolvers.expandedpathlist(str))
end
-function resolvers.expandedpathlist(str)
+function resolvers.expandedpathlist(str,extra_too)
if not str then
return { }
- elseif instance.savelists then
+ elseif instance.savelists then -- hm, what if two cases, with and without extra_too
str = lpegmatch(dollarstripper,str)
local lists = instance.lists
local lst = lists[str]
if not lst then
- local l = made_list(instance,resolvers.splitpath(resolvers.expansion(str)))
+ local l = made_list(instance,resolvers.splitpath(resolvers.expansion(str)),extra_too)
lst = expandedpathfromlist(l)
lists[str] = lst
end
return lst
else
local lst = resolvers.splitpath(resolvers.expansion(str))
- return made_list(instance,expandedpathfromlist(lst))
+ return made_list(instance,expandedpathfromlist(lst),extra_too)
end
end
@@ -830,6 +915,14 @@ function resolvers.expandpathfromvariable(str)
return joinpath(resolvers.expandedpathlistfromvariable(str))
end
+function resolvers.cleanedpathlist(v) -- can be cached if needed
+ local t = resolvers.expandedpathlist(v)
+ for i=1,#t do
+ t[i] = resolvers.resolve(resolvers.cleanpath(t[i]))
+ end
+ return t
+end
+
function resolvers.expandbraces(str) -- output variable and brace expansion of STRING
-- local ori = resolvers.variable(str)
-- if ori == "" then
@@ -851,7 +944,7 @@ function resolvers.registerfilehash(name,content,someerror)
end
local function isreadable(name)
- local readable = lfs.isfile(name) -- not file.is_readable(name) asit can be a dir
+ local readable = isfile(name) -- not file.is_readable(name) asit can be a dir
if trace_detail then
if readable then
report_resolving("file %a is readable",name)
@@ -862,75 +955,59 @@ local function isreadable(name)
return readable
end
--- name
--- name/name
+-- name | name/name
-local function collect_files(names)
- local filelist, noffiles = { }, 0
+local function collect_files(names) -- potential files .. sort of too much when asking for just one file
+ local filelist = { } -- but we need it for pattern matching later on
+ local noffiles = 0
+ local function check(hash,root,pathname,path,name)
+ if not pathname or find(path,pathname) then
+ local variant = hash.type
+ local search = filejoin(root,path,name) -- funny no concatinator
+ local result = methodhandler('concatinators',variant,root,path,name)
+ if trace_detail then
+ report_resolving("match: variant %a, search %a, result %a",variant,search,result)
+ end
+ noffiles = noffiles + 1
+ filelist[noffiles] = { variant, search, result }
+ end
+ end
for k=1,#names do
- local fname = names[k]
+ local filename = names[k]
if trace_detail then
- report_resolving("checking name %a",fname)
+ report_resolving("checking name %a",filename)
end
- local bname = filebasename(fname)
- local dname = filedirname(fname)
- if dname == "" or find(dname,"^%.") then
- dname = false
+ local basename = filebasename(filename)
+ local pathname = filedirname(filename)
+ if pathname == "" or find(pathname,"^%.") then
+ pathname = false
else
- dname = gsub(dname,"%*",".*")
- dname = "/" .. dname .. "$"
+ pathname = gsub(pathname,"%*",".*")
+ pathname = "/" .. pathname .. "$"
end
local hashes = instance.hashes
for h=1,#hashes do
- local hash = hashes[h]
- local blobpath = hash.name
- local files = blobpath and instance.files[blobpath]
- if files then
+ local hash = hashes[h]
+ local hashname = hash.name
+ local content = hashname and instance.files[hashname]
+ if content then
if trace_detail then
- report_resolving("deep checking %a, base %a, pattern %a",blobpath,bname,dname)
+ report_resolving("deep checking %a, base %a, pattern %a",hashname,basename,pathname)
end
- local blobfile = files[bname]
- if not blobfile then
- local rname = "remap:"..bname
- blobfile = files[rname]
- if blobfile then
- bname = files[rname]
- blobfile = files[bname]
- end
- end
- if blobfile then
- local blobroot = files.__path__ or blobpath
- if type(blobfile) == 'string' then
- if not dname or find(blobfile,dname) then
- local variant = hash.type
- -- local search = filejoin(blobpath,blobfile,bname)
- local search = filejoin(blobroot,blobfile,bname)
- local result = methodhandler('concatinators',hash.type,blobroot,blobfile,bname)
- if trace_detail then
- report_resolving("match: variant %a, search %a, result %a",variant,search,result)
- end
- noffiles = noffiles + 1
- filelist[noffiles] = { variant, search, result }
- end
+ local path, name = lookup(content,basename)
+ if path then
+ local metadata = content.metadata
+ local realroot = metadata and metadata.path or hashname
+ if type(path) == "string" then
+ check(hash,realroot,pathname,path,name)
else
- for kk=1,#blobfile do
- local vv = blobfile[kk]
- if not dname or find(vv,dname) then
- local variant = hash.type
- -- local search = filejoin(blobpath,vv,bname)
- local search = filejoin(blobroot,vv,bname)
- local result = methodhandler('concatinators',hash.type,blobroot,vv,bname)
- if trace_detail then
- report_resolving("match: variant %a, search %a, result %a",variant,search,result)
- end
- noffiles = noffiles + 1
- filelist[noffiles] = { variant, search, result }
- end
+ for i=1,#path do
+ check(hash,realroot,pathname,path[i],name)
end
end
end
elseif trace_locating then
- report_resolving("no match in %a (%s)",blobpath,bname)
+ report_resolving("no match in %a (%s)",hashname,basename)
end
end
end
@@ -961,7 +1038,7 @@ end
local function can_be_dir(name) -- can become local
local fakepaths = instance.fakepaths
if not fakepaths[name] then
- if lfs.isdir(name) then
+ if isdir(name) then
fakepaths[name] = 1 -- directory
else
fakepaths[name] = 2 -- no directory
@@ -987,10 +1064,11 @@ local function find_analyze(filename,askedformat,allresults)
if askedformat == "" then
if ext == "" or not suffixmap[ext] then
local defaultsuffixes = resolvers.defaultsuffixes
+ local formatofsuffix = resolvers.formatofsuffix
for i=1,#defaultsuffixes do
local forcedname = filename .. '.' .. defaultsuffixes[i]
wantedfiles[#wantedfiles+1] = forcedname
- filetype = resolvers.formatofsuffix(forcedname)
+ filetype = formatofsuffix(forcedname)
if trace_locating then
report_resolving("forcing filetype %a",filetype)
end
@@ -1032,7 +1110,7 @@ local function find_wildcard(filename,allresults)
if trace_locating then
report_resolving("checking wildcard %a", filename)
end
- local method, result = resolvers.findwildcardfiles(filename)
+ local result = resolvers.findwildcardfiles(filename)
if result then
return "wildcard", result
end
@@ -1040,7 +1118,7 @@ local function find_wildcard(filename,allresults)
end
local function find_qualified(filename,allresults,askedformat,alsostripped) -- this one will be split too
- if not file.is_qualified_path(filename) then
+ if not is_qualified_path(filename) then
return
end
if trace_locating then
@@ -1136,50 +1214,91 @@ local function check_subpath(fname)
end
end
-local function find_intree(filename,filetype,wantedfiles,allresults)
+-- this caching is not really needed (seldom accessed) but more readable
+-- we could probably move some to a higher level but then we need to adapt
+-- more code ... maybe some day
+
+local function makepathlist(list,filetype)
local typespec = resolvers.variableofformat(filetype)
- local pathlist = resolvers.expandedpathlist(typespec)
- local method = "intree"
+ local pathlist = resolvers.expandedpathlist(typespec,filetype and usertypes[filetype]) -- only extra path with user files
+ local entry = { }
if pathlist and #pathlist > 0 then
+ for k=1,#pathlist do
+ local path = pathlist[k]
+ local prescanned = find(path,'^!!')
+ local resursive = find(path,'//$')
+ local pathname = lpegmatch(inhibitstripper,path)
+ local expression = makepathexpression(pathname)
+ local barename = gsub(pathname,"/+$","")
+ barename = resolveprefix(barename)
+ local scheme = url.hasscheme(barename)
+ local schemename = gsub(barename,"%.%*$",'') -- after scheme
+ -- local prescanned = path ~= pathname -- ^!!
+ -- local resursive = find(pathname,'//$')
+ entry[k] = {
+ path = path,
+ pathname = pathname,
+ prescanned = prescanned,
+ recursive = recursive,
+ expression = expression,
+ barename = barename,
+ scheme = scheme,
+ schemename = schemename,
+ }
+ end
+ entry.typespec = typespec
+ list[filetype] = entry
+ else
+ list[filetype] = false
+ end
+ return entry
+end
+
+-- pathlist : resolved
+-- dirlist : unresolved or resolved
+-- filelist : unresolved
+
+local function find_intree(filename,filetype,wantedfiles,allresults)
+ local pathlists = instance.pathlists
+ if not pathlists then
+ pathlists = setmetatableindex(allocate(),makepathlist)
+ instance.pathlists = pathlists
+ end
+ local pathlist = pathlists[filetype]
+ if pathlist then
-- list search
- local filelist = collect_files(wantedfiles)
- local dirlist = { }
+ local method = "intree"
+ local filelist = collect_files(wantedfiles) -- okay, a bit over the top when we just look relative to the current path
+ local dirlist = { }
+ local result = { }
if filelist then
for i=1,#filelist do
dirlist[i] = filedirname(filelist[i][3]) .. "/" -- was [2] .. gamble
end
end
if trace_detail then
- report_resolving("checking filename %a",filename)
+ report_resolving("checking filename %a in tree",filename)
end
- local resolve = resolvers.resolve
- local result = { }
- -- pathlist : resolved
- -- dirlist : unresolved or resolved
- -- filelist : unresolved
for k=1,#pathlist do
- local path = pathlist[k]
- local pathname = lpegmatch(inhibitstripper,path)
- local doscan = path == pathname -- no ^!!
- if not find (pathname,'//$') then
- doscan = false -- we check directly on the path
- end
- local done = false
+ local entry = pathlist[k]
+ local path = entry.path
+ local pathname = entry.pathname
+ local done = false
-- using file list
if filelist then -- database
-- compare list entries with permitted pattern -- /xx /xx//
- local expression = makepathexpression(pathname)
+ local expression = entry.expression
if trace_detail then
report_resolving("using pattern %a for path %a",expression,pathname)
end
for k=1,#filelist do
local fl = filelist[k]
- local f = fl[2]
- local d = dirlist[k]
+ local f = fl[2]
+ local d = dirlist[k]
-- resolve is new:
- if find(d,expression) or find(resolve(d),expression) then
+ if find(d,expression) or find(resolveprefix(d),expression) then
-- todo, test for readable
- result[#result+1] = resolve(fl[3]) -- no shortcut
+ result[#result+1] = resolveprefix(fl[3]) -- no shortcut
done = true
if allresults then
if trace_detail then
@@ -1199,61 +1318,74 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
if done then
method = "database"
else
- method = "filesystem" -- bonus, even when !! is specified
- pathname = gsub(pathname,"/+$","")
- pathname = resolve(pathname)
- local scheme = url.hasscheme(pathname)
+ -- beware: we don't honor allresults here in a next attempt (done false)
+ -- but that is kind of special anyway
+ method = "filesystem" -- bonus, even when !! is specified
+ local scheme = entry.scheme
if not scheme or scheme == "file" then
- local pname = gsub(pathname,"%.%*$",'')
+ local pname = entry.schemename
if not find(pname,"*",1,true) then
if can_be_dir(pname) then
- -- quick root scan first
- for k=1,#wantedfiles do
- local w = wantedfiles[k]
- local fname = check_subpath(filejoin(pname,w))
- if fname then
- result[#result+1] = fname
- done = true
- if not allresults then
- break
- end
+ -- hm, rather useless as we don't go deeper and if we would we could also
+ -- auto generate the file database .. however, we need this for extra paths
+ -- that are not hashed (like sources on my machine) .. so, this is slightly
+ -- out of order but at least fast (and we seldom end up here, only when a file
+ -- is not already found
+-- inspect(entry)
+ if not done and not entry.prescanned then
+ if trace_detail then
+ report_resolving("quick root scan for %a",pname)
end
- end
- if not done and doscan then
- -- collect files in path (and cache the result)
- local files = resolvers.simplescanfiles(pname,false,true)
for k=1,#wantedfiles do
local w = wantedfiles[k]
- local subpath = files[w]
- if not subpath or subpath == "" then
- -- rootscan already done
- elseif type(subpath) == "string" then
- local fname = check_subpath(filejoin(pname,subpath,w))
- if fname then
- result[#result+1] = fname
- done = true
- if not allresults then
- break
- end
+ local fname = check_subpath(filejoin(pname,w))
+ if fname then
+ result[#result+1] = fname
+ done = true
+ if not allresults then
+ break
end
- else
- for i=1,#subpath do
- local sp = subpath[i]
- if sp == "" then
- -- roottest already done
- else
- local fname = check_subpath(filejoin(pname,sp,w))
- if fname then
- result[#result+1] = fname
- done = true
- if not allresults then
- break
+ end
+ end
+ if not done and entry.recursive then -- maybe also when allresults
+ -- collect files in path (and cache the result)
+ if trace_detail then
+ report_resolving("scanning filesystem for %a",pname)
+ end
+ local files = resolvers.simplescanfiles(pname,false,true)
+ for k=1,#wantedfiles do
+ local w = wantedfiles[k]
+ local subpath = files[w]
+ if not subpath or subpath == "" then
+ -- rootscan already done
+ elseif type(subpath) == "string" then
+ local fname = check_subpath(filejoin(pname,subpath,w))
+ if fname then
+ result[#result+1] = fname
+ done = true
+ if not allresults then
+ break
+ end
+ end
+ else
+ for i=1,#subpath do
+ local sp = subpath[i]
+ if sp == "" then
+ -- roottest already done
+ else
+ local fname = check_subpath(filejoin(pname,sp,w))
+ if fname then
+ result[#result+1] = fname
+ done = true
+ if not allresults then
+ break
+ end
end
end
end
- end
- if done and not allresults then
- break
+ if done and not allresults then
+ break
+ end
end
end
end
@@ -1262,6 +1394,20 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
else
-- no access needed for non existing path, speedup (esp in large tree with lots of fake)
end
+ else
+ -- we can have extra_paths that are urls
+ for k=1,#wantedfiles do
+ -- independent url scanner
+ local pname = entry.barename
+ local fname = methodhandler('finders',pname .. "/" .. wantedfiles[k])
+ if fname then
+ result[#result+1] = fname
+ done = true
+ if not allresults then
+ break
+ end
+ end
+ end
end
end
-- todo recursive scanning
@@ -1299,7 +1445,7 @@ local function find_otherwise(filename,filetype,wantedfiles,allresults) -- other
local filelist = collect_files(wantedfiles)
local fl = filelist and filelist[1]
if fl then
- return "otherwise", { resolvers.resolve(fl[3]) } -- filename
+ return "otherwise", { resolveprefix(fl[3]) } -- filename
end
end
@@ -1307,6 +1453,9 @@ end
-- always analyze .. todo: use url split
collect_instance_files = function(filename,askedformat,allresults) -- uses nested
+ if not filename or filename == "" then
+ return { }
+ end
askedformat = askedformat or ""
filename = collapsepath(filename,".")
@@ -1344,7 +1493,11 @@ collect_instance_files = function(filename,askedformat,allresults) -- uses neste
else
local method, result, stamp, filetype, wantedfiles
if instance.remember then
- stamp = formatters["%s--%s"](filename,askedformat)
+ if askedformat == "" then
+ stamp = formatters["%s::%s"](suffixonly(filename),filename)
+ else
+ stamp = formatters["%s::%s"](askedformat,filename)
+ end
result = stamp and instance.found[stamp]
if result then
if trace_locating then
@@ -1380,7 +1533,7 @@ collect_instance_files = function(filename,askedformat,allresults) -- uses neste
end
if stamp then
if trace_locating then
- report_resolving("remembering file %a",filename)
+ report_resolving("remembering file %a using hash %a",filename,stamp)
end
instance.found[stamp] = result
end
@@ -1391,6 +1544,9 @@ end
-- -- -- end of main file search routing -- -- --
local function findfiles(filename,filetype,allresults)
+ if not filename or filename == "" then
+ return { }
+ end
local result, status = collect_instance_files(filename,filetype or "",allresults)
if not result or #result == 0 then
local lowered = lower(filename)
@@ -1414,44 +1570,39 @@ function resolvers.findpath(filename,filetype)
end
local function findgivenfiles(filename,allresults)
- local bname, result = filebasename(filename), { }
- local hashes = instance.hashes
- local noffound = 0
- for k=1,#hashes do
- local hash = hashes[k]
- local files = instance.files[hash.name] or { }
- local blist = files[bname]
- if not blist then
- local rname = "remap:"..bname
- blist = files[rname]
- if blist then
- bname = files[rname]
- blist = files[bname]
- end
+ local base = filebasename(filename)
+ local result = { }
+ local hashes = instance.hashes
+ --
+ local function okay(hash,path,name)
+ local found = methodhandler('concatinators',hash.type,hash.name,path,name)
+ if found and found ~= "" then
+ result[#result+1] = resolveprefix(found)
+ return not allresults
end
- if blist then
- if type(blist) == 'string' then
- local found = methodhandler('concatinators',hash.type,hash.name,blist,bname) or ""
- if found ~= "" then
- noffound = noffound + 1
- result[noffound] = resolvers.resolve(found)
- if not allresults then
- break
- end
+ end
+ --
+ for k=1,#hashes do
+ local hash = hashes[k]
+ local content = instance.files[hash.name]
+ if content then
+ local path, name = lookup(content,base)
+ if not path then
+ -- no match
+ elseif type(path) == "string" then
+ if okay(hash,path,name) then
+ return result
end
else
- for kk=1,#blist do
- local vv = blist[kk]
- local found = methodhandler('concatinators',hash.type,hash.name,vv,bname) or ""
- if found ~= "" then
- noffound = noffound + 1
- result[noffound] = resolvers.resolve(found)
- if not allresults then break end
+ for i=1,#path do
+ if okay(hash,path[i],name) then
+ return result
end
end
end
end
end
+ --
return result
end
@@ -1463,37 +1614,6 @@ function resolvers.findgivenfile(filename)
return findgivenfiles(filename,false)[1] or ""
end
-local function doit(path,blist,bname,tag,variant,result,allresults)
- local done = false
- if blist and variant then
- local resolve = resolvers.resolve -- added
- if type(blist) == 'string' then
- -- make function and share code
- if find(lower(blist),path) then
- local full = methodhandler('concatinators',variant,tag,blist,bname) or ""
- result[#result+1] = resolve(full)
- done = true
- end
- else
- for kk=1,#blist do
- local vv = blist[kk]
- if find(lower(vv),path) then
- local full = methodhandler('concatinators',variant,tag,vv,bname) or ""
- result[#result+1] = resolve(full)
- done = true
- if not allresults then break end
- end
- end
- end
- end
- return done
-end
-
---~ local makewildcard = Cs(
---~ (P("^")^0 * P("/") * P(-1) + P(-1)) /".*"
---~ + (P("^")^0 * P("/") / "") * (P("*")/".*" + P("-")/"%%-" + P("?")/"."+ P("\\")/"/" + P(1))^0
---~ )
-
local makewildcard = Cs(
(P("^")^0 * P("/") * P(-1) + P(-1)) /".*"
+ (P("^")^0 * P("/") / "")^0 * (P("*")/".*" + P("-")/"%%-" + P(".")/"%%." + P("?")/"."+ P("\\")/"/" + P(1))^0
@@ -1503,37 +1623,80 @@ function resolvers.wildcardpattern(pattern)
return lpegmatch(makewildcard,pattern) or pattern
end
-local function findwildcardfiles(filename,allresults,result) -- todo: remap: and lpeg
- result = result or { }
---~ local path = lower(lpegmatch(makewildcard,filedirname (filename)))
---~ local name = lower(lpegmatch(makewildcard,filebasename(filename)))
- local base = filebasename(filename)
- local dirn = filedirname(filename)
- local path = lower(lpegmatch(makewildcard,dirn) or dirn)
- local name = lower(lpegmatch(makewildcard,base) or base)
- local files, done = instance.files, false
+-- we use more function calls than before but we also have smaller trees so
+-- why bother
+
+local function findwildcardfiles(filename,allresults,result)
+ local result = result or { }
+ local base = filebasename(filename)
+ local dirn = filedirname(filename)
+ local path = lower(lpegmatch(makewildcard,dirn) or dirn)
+ local name = lower(lpegmatch(makewildcard,base) or base)
+ local files = instance.files
+ --
if find(name,"*",1,true) then
local hashes = instance.hashes
+ local function okay(found,path,base,hashname,hashtype)
+ if find(found,path) then
+ local full = methodhandler('concatinators',hashtype,hashname,found,base)
+ if full and full ~= "" then
+ result[#result+1] = resolveprefix(full)
+ return not allresults
+ end
+ end
+ end
for k=1,#hashes do
- local hash = hashes[k]
- local hashname, hashtype = hash.name, hash.type
- for kk, hh in next, files[hashname] do
- if not find(kk,"^remap:") then
- if find(lower(kk),name) then
- if doit(path,hh,kk,hashname,hashtype,result,allresults) then done = true end
- if done and not allresults then break end
+ local hash = hashes[k]
+ local hashname = hash.name
+ local hashtype = hash.type
+ if hashname and hashtype then
+ for found, base in filtered(files[hashname],name) do
+ if type(found) == 'string' then
+ if okay(found,path,base,hashname,hashtype) then
+ break
+ end
+ else
+ for i=1,#found do
+ if okay(found[i],path,base,hashname,hashtype) then
+ break
+ end
+ end
end
end
end
end
else
+ local function okayokay(found,path,base,hashname,hashtype)
+ if find(found,path) then
+ local full = methodhandler('concatinators',hashtype,hashname,found,base)
+ if full and full ~= "" then
+ result[#result+1] = resolveprefix(full)
+ return not allresults
+ end
+ end
+ end
+ --
local hashes = instance.hashes
--- inspect(hashes)
for k=1,#hashes do
- local hash = hashes[k]
- local hashname, hashtype = hash.name, hash.type
- if doit(path,files[hashname][base],base,hashname,hashtype,result,allresults) then done = true end
- if done and not allresults then break end
+ local hash = hashes[k]
+ local hashname = hash.name
+ local hashtype = hash.type
+ if hashname and hashtype then
+ local found, base = lookup(content,base)
+ if not found then
+ -- nothing
+ elseif type(found) == 'string' then
+ if okay(found,path,base,hashname,hashtype) then
+ break
+ end
+ else
+ for i=1,#found do
+ if okay(found[i],path,base,hashname,hashtype) then
+ break
+ end
+ end
+ end
+ end
end
end
-- we can consider also searching the paths not in the database, but then
@@ -1626,7 +1789,7 @@ end
function resolvers.dowithpath(name,func)
local pathlist = resolvers.expandedpathlist(name)
for i=1,#pathlist do
- func("^"..resolvers.cleanpath(pathlist[i]))
+ func("^"..cleanpath(pathlist[i]))
end
end
@@ -1636,23 +1799,23 @@ end
function resolvers.locateformat(name)
local engine = environment.ownmain or "luatex"
- local barename = file.removesuffix(name)
- local fullname = file.addsuffix(barename,"fmt")
+ local barename = removesuffix(name)
+ local fullname = addsuffix(barename,"fmt")
local fmtname = caches.getfirstreadablefile(fullname,"formats",engine) or ""
if fmtname == "" then
fmtname = resolvers.findfile(fullname)
- fmtname = resolvers.cleanpath(fmtname)
+ fmtname = cleanpath(fmtname)
end
if fmtname ~= "" then
- local barename = file.removesuffix(fmtname)
- local luaname = file.addsuffix(barename,luasuffixes.lua)
- local lucname = file.addsuffix(barename,luasuffixes.luc)
- local luiname = file.addsuffix(barename,luasuffixes.lui)
- if lfs.isfile(luiname) then
+ local barename = removesuffix(fmtname)
+ local luaname = addsuffix(barename,luasuffixes.lua)
+ local lucname = addsuffix(barename,luasuffixes.luc)
+ local luiname = addsuffix(barename,luasuffixes.lui)
+ if isfile(luiname) then
return barename, luiname
- elseif lfs.isfile(lucname) then
+ elseif isfile(lucname) then
return barename, lucname
- elseif lfs.isfile(luaname) then
+ elseif isfile(luaname) then
return barename, luaname
end
end
@@ -1671,35 +1834,29 @@ end
function resolvers.dowithfilesintree(pattern,handle,before,after) -- will move, can be a nice iterator instead
local instance = resolvers.instance
- local hashes = instance.hashes
+ local hashes = instance.hashes
for i=1,#hashes do
- local hash = hashes[i]
+ local hash = hashes[i]
local blobtype = hash.type
local blobpath = hash.name
- if blobpath then
+ if blobtype and blobpath then
+ local total = 0
+ local checked = 0
+ local done = 0
if before then
before(blobtype,blobpath,pattern)
end
- local files = instance.files[blobpath]
- local total, checked, done = 0, 0, 0
- if files then
- for k, v in table.sortedhash(files) do -- next, files do, beware: this is not the resolve order
- total = total + 1
- if find(k,"^remap:") then
- -- forget about these
- elseif find(k,pattern) then
- if type(v) == "string" then
- checked = checked + 1
- if handle(blobtype,blobpath,v,k) then
- done = done + 1
- end
- else
- checked = checked + #v
- for i=1,#v do
- if handle(blobtype,blobpath,v[i],k) then
- done = done + 1
- end
- end
+ for path, name in filtered(instance.files[blobpath],pattern) do
+ if type(path) == "string" then
+ checked = checked + 1
+ if handle(blobtype,blobpath,path,name) then
+ done = done + 1
+ end
+ else
+ checked = checked + #path
+ for i=1,#path do
+ if handle(blobtype,blobpath,path[i],name) then
+ done = done + 1
end
end
end
@@ -1711,8 +1868,8 @@ function resolvers.dowithfilesintree(pattern,handle,before,after) -- will move,
end
end
-resolvers.obsolete = resolvers.obsolete or { }
-local obsolete = resolvers.obsolete
+local obsolete = resolvers.obsolete or { }
+resolvers.obsolete = obsolete
resolvers.find_file = resolvers.findfile obsolete.find_file = resolvers.findfile
resolvers.find_files = resolvers.findfiles obsolete.find_files = resolvers.findfiles
diff --git a/Master/texmf-dist/tex/context/base/data-sch.lua b/Master/texmf-dist/tex/context/base/data-sch.lua
index adc774489d7..d79e0c7ef59 100644
--- a/Master/texmf-dist/tex/context/base/data-sch.lua
+++ b/Master/texmf-dist/tex/context/base/data-sch.lua
@@ -31,8 +31,18 @@ function cleaners.none(specification)
return specification.original
end
-function cleaners.strip(specification)
- return (gsub(specification.original,"[^%a%d%.]+","-")) -- so we keep periods
+-- function cleaners.strip(specification)
+-- -- todo: only keep suffix periods, so after the last
+-- return (gsub(specification.original,"[^%a%d%.]+","-")) -- so we keep periods
+-- end
+
+function cleaners.strip(specification) -- keep suffixes
+ local path, name = file.splitbase(specification.original)
+ if path == "" then
+ return (gsub(name,"[^%a%d%.]+","-"))
+ else
+ return (gsub((gsub(path,"%.","-") .. "-" .. name),"[^%a%d%.]+","-"))
+ end
end
function cleaners.md5(specification)
@@ -55,7 +65,7 @@ local cached, loaded, reused, thresholds, handlers = { }, { }, { }, { }, { }
local function runcurl(name,cachename) -- we use sockets instead or the curl library when possible
local command = "curl --silent --insecure --create-dirs --output " .. cachename .. " " .. name
- os.spawn(command)
+ os.execute(command)
end
local function fetch(specification)
diff --git a/Master/texmf-dist/tex/context/base/data-tex.lua b/Master/texmf-dist/tex/context/base/data-tex.lua
index 04c5ef469ee..b6b97a0a989 100644
--- a/Master/texmf-dist/tex/context/base/data-tex.lua
+++ b/Master/texmf-dist/tex/context/base/data-tex.lua
@@ -77,13 +77,13 @@ function helpers.textopener(tag,filename,filehandle,coding)
report_tex("%a opener: %a opened using method %a",tag,filename,coding)
end
if coding == "utf-16-be" then
- lines = utf.utf16_to_utf8_be(lines)
+ lines = utf.utf16_to_utf8_be_t(lines)
elseif coding == "utf-16-le" then
- lines = utf.utf16_to_utf8_le(lines)
+ lines = utf.utf16_to_utf8_le_t(lines)
elseif coding == "utf-32-be" then
- lines = utf.utf32_to_utf8_be(lines)
+ lines = utf.utf32_to_utf8_be_t(lines)
elseif coding == "utf-32-le" then
- lines = utf.utf32_to_utf8_le(lines)
+ lines = utf.utf32_to_utf8_le_t(lines)
else -- utf8 or unknown (could be a mkvi file)
local runner = textfileactions.runner
if runner then
diff --git a/Master/texmf-dist/tex/context/base/data-tmf.lua b/Master/texmf-dist/tex/context/base/data-tmf.lua
index c522251932e..e0ccac257a1 100644
--- a/Master/texmf-dist/tex/context/base/data-tmf.lua
+++ b/Master/texmf-dist/tex/context/base/data-tmf.lua
@@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['data-tmf'] = {
license = "see context related readme files"
}
-local resolvers = resolvers
+local resolvers = resolvers
local report_tds = logs.reporter("resolvers","tds")
diff --git a/Master/texmf-dist/tex/context/base/data-tmp.lua b/Master/texmf-dist/tex/context/base/data-tmp.lua
index 3e109dcfe6d..8ee5792cc48 100644
--- a/Master/texmf-dist/tex/context/base/data-tmp.lua
+++ b/Master/texmf-dist/tex/context/base/data-tmp.lua
@@ -35,6 +35,7 @@ local report_caches = logs.reporter("resolvers","caches")
local report_resolvers = logs.reporter("resolvers","caching")
local resolvers = resolvers
+local cleanpath = resolvers.cleanpath
-- intermezzo
@@ -72,7 +73,7 @@ local writable, readables, usedreadables = nil, { }, { }
local function identify()
-- Combining the loops makes it messy. First we check the format cache path
-- and when the last component is not present we try to create it.
- local texmfcaches = resolvers.cleanpathlist("TEXMFCACHE")
+ local texmfcaches = resolvers.cleanpathlist("TEXMFCACHE") -- forward ref
if texmfcaches then
for k=1,#texmfcaches do
local cachepath = texmfcaches[k]
@@ -369,10 +370,12 @@ function caches.contentstate()
return content_state or { }
end
-function caches.loadcontent(cachename,dataname)
- local name = caches.hashed(cachename)
- local full, path = caches.getfirstreadablefile(addsuffix(name,luasuffixes.lua),"trees")
- local filename = file.join(path,name)
+function caches.loadcontent(cachename,dataname,filename)
+ if not filename then
+ local name = caches.hashed(cachename)
+ local full, path = caches.getfirstreadablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename = file.join(path,name)
+ end
local blob = loadfile(addsuffix(filename,luasuffixes.luc)) or loadfile(addsuffix(filename,luasuffixes.lua))
if blob then
local data = blob()
@@ -406,10 +409,12 @@ function caches.collapsecontent(content)
end
end
-function caches.savecontent(cachename,dataname,content)
- local name = caches.hashed(cachename)
- local full, path = caches.setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
- local filename = file.join(path,name) -- is full
+function caches.savecontent(cachename,dataname,content,filename)
+ if not filename then
+ local name = caches.hashed(cachename)
+ local full, path = caches.setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename = file.join(path,name) -- is full
+ end
local luaname = addsuffix(filename,luasuffixes.lua)
local lucname = addsuffix(filename,luasuffixes.luc)
if trace_locating then
diff --git a/Master/texmf-dist/tex/context/base/data-tre.lua b/Master/texmf-dist/tex/context/base/data-tre.lua
index 0a8b00d9bfb..4388731f98c 100644
--- a/Master/texmf-dist/tex/context/base/data-tre.lua
+++ b/Master/texmf-dist/tex/context/base/data-tre.lua
@@ -6,50 +6,89 @@ if not modules then modules = { } end modules ['data-tre'] = {
license = "see context related readme files"
}
--- \input tree://oeps1/**/oeps.tex
+-- tree://e:/temporary/mb-mp/**/drawing.jpg
+-- tree://e:/temporary/mb-mp/**/Drawing.jpg
+-- tree://t:./**/tufte.tex
+-- tree://t:/./**/tufte.tex
+-- tree://t:/**/tufte.tex
+-- dirlist://e:/temporary/mb-mp/**/drawing.jpg
+-- dirlist://e:/temporary/mb-mp/**/Drawing.jpg
+-- dirlist://e:/temporary/mb-mp/**/just/some/place/drawing.jpg
+-- dirlist://e:/temporary/mb-mp/**/images/drawing.jpg
+-- dirlist://e:/temporary/mb-mp/**/images/drawing.jpg?option=fileonly
+-- dirlist://///storage-2/resources/mb-mp/**/drawing.jpg
+-- dirlist://e:/**/drawing.jpg
-local find, gsub, format = string.find, string.gsub, string.format
+local find, gsub, lower = string.find, string.gsub, string.lower
+local basename, dirname, joinname = file.basename, file.dirname, file .join
+local globdir, isdir, isfile = dir.glob, lfs.isdir, lfs.isfile
+local P, lpegmatch = lpeg.P, lpeg.match
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
-local report_trees = logs.reporter("resolvers","trees")
+local report_trees = logs.reporter("resolvers","trees")
-local resolvers = resolvers
+local resolvers = resolvers
+local resolveprefix = resolvers.resolve
+local notfound = resolvers.finders.notfound
+local lookup = resolvers.get_from_content
-local done, found, notfound = { }, { }, resolvers.finders.notfound
+-- A tree search is rather dumb ... there is some basic caching of searched trees
+-- but nothing is cached over runs ... it's also a wildcard one so we cannot use
+-- the normal scanner.
-function resolvers.finders.tree(specification)
+local collectors = { }
+local found = { }
+
+function resolvers.finders.tree(specification) -- to be adapted to new formats
local spec = specification.filename
- local fnd = found[spec]
- if fnd == nil then
+ local okay = found[spec]
+ if okay == nil then
if spec ~= "" then
- local path, name = file.dirname(spec), file.basename(spec)
- if path == "" then path = "." end
- local hash = done[path]
- if not hash then
- local pattern = path .. "/*" -- we will use the proper splitter
- hash = dir.glob(pattern)
- done[path] = hash
+ local path = dirname(spec)
+ local name = basename(spec)
+ if path == "" then
+ path = "."
+ end
+ local names = collectors[path]
+ if not names then
+ local pattern = find(path,"/%*+$") and path or (path .. "/*")
+ names = globdir(pattern)
+ collectors[path] = names
end
local pattern = "/" .. gsub(name,"([%.%-%+])", "%%%1") .. "$"
- for k=1,#hash do
- local v = hash[k]
- if find(v,pattern) then
- found[spec] = v
- return v
+ for i=1,#names do
+ local fullname = names[i]
+ if find(fullname,pattern) then
+ found[spec] = fullname
+ return fullname
+ end
+ end
+ -- let's be nice:
+ local pattern = lower(pattern)
+ for i=1,#names do
+ local fullname = lower(names[i])
+ if find(fullname,pattern) then
+ if isfile(fullname) then
+ found[spec] = fullname
+ return fullname
+ else
+ -- no os name mapping
+ break
+ end
end
end
end
- fnd = notfound() -- false
- found[spec] = fnd
+ okay = notfound() -- false
+ found[spec] = okay
end
- return fnd
+ return okay
end
function resolvers.locators.tree(specification)
local name = specification.filename
- local realname = resolvers.resolve(name) -- no shortcut
- if realname and realname ~= '' and lfs.isdir(realname) then
+ local realname = resolveprefix(name) -- no shortcut
+ if realname and realname ~= '' and isdir(realname) then
if trace_locating then
report_trees("locator %a found",realname)
end
@@ -61,15 +100,134 @@ end
function resolvers.hashers.tree(specification)
local name = specification.filename
- if trace_locating then
- report_trees("analysing %a",name)
- end
+ -- if trace_locating then
+ report_trees("analyzing %a",name)
+ -- end
resolvers.methodhandler("hashers",name)
resolvers.generators.file(specification)
end
-resolvers.concatinators.tree = resolvers.concatinators.file
-resolvers.generators.tree = resolvers.generators.file
-resolvers.openers.tree = resolvers.openers.file
-resolvers.loaders.tree = resolvers.loaders.file
+-- This is a variation on tree lookups but this time we do cache in the given
+-- root. We use a similar hasher as the resolvers because we have to deal with
+-- for instance trees with 50K xml files plus a similar amount of resources to
+-- deal and we don't want too much overhead.
+
+local collectors = { }
+local splitter = lpeg.splitat("/**/")
+local stripper = lpeg.replacer { [P("/") * P("*")^1 * P(-1)] = "" }
+
+table.setmetatableindex(collectors, function(t,k)
+ local rootname = lpegmatch(stripper,k)
+ local dataname = joinname(rootname,"dirlist")
+ local content = caches.loadcontent(dataname,"files",dataname)
+ if not content then
+ -- path branch usecache onlyonce tolerant
+ content = resolvers.scanfiles(rootname,nil,nil,false,true) -- so we accept crap
+ caches.savecontent(dataname,"files",content,dataname)
+ end
+ t[k] = content
+ return content
+end)
+
+
+local function checked(root,p,n)
+ if p then
+ if type(p) == "table" then
+ for i=1,#p do
+ local fullname = joinname(root,p[i],n)
+ if isfile(fullname) then -- safeguard
+ return fullname
+ end
+ end
+ else
+ local fullname = joinname(root,p,n)
+ if isfile(fullname) then -- safeguard
+ return fullname
+ end
+ end
+ end
+ return notfound()
+end
+
+-- no funny characters in path but in filename permitted .. sigh
+
+local function resolve(specification) -- can be called directly too
+ local filename = specification.filename
+ -- inspect(specification)
+ if filename ~= "" then
+ local root, rest = lpegmatch(splitter,filename)
+ if root and rest then
+ local path, name = dirname(rest), basename(rest)
+ if name ~= rest then
+ local content = collectors[root]
+ local p, n = lookup(content,name)
+ if not p then
+ return notfound()
+ end
+ local pattern = ".*/" .. path .. "$"
+ local istable = type(p) == "table"
+ if istable then
+ for i=1,#p do
+ local pi = p[i]
+ if pi == path or find(pi,pattern) then
+ local fullname = joinname(root,pi,n)
+ if isfile(fullname) then -- safeguard
+ return fullname
+ end
+ end
+ end
+ elseif p == path or find(p,pattern) then
+ local fullname = joinname(root,p,n)
+ if isfile(fullname) then -- safeguard
+ return fullname
+ end
+ end
+ local queries = specification.queries
+ if queries and queries.option == "fileonly" then
+ return checked(root,p,n)
+ else
+ return notfound()
+ end
+ end
+ end
+ local path, name = dirname(filename), basename(filename)
+ local root = lpegmatch(stripper,path)
+ local content = collectors[path]
+ local p, n = lookup(content,name)
+ if p then
+ return checked(root,p,n)
+ end
+ end
+ return notfound()
+end
+
+resolvers.finders .dirlist = resolve
+resolvers.locators .dirlist = resolvers.locators .tree
+resolvers.hashers .dirlist = resolvers.hashers .tree
+resolvers.generators.dirlist = resolvers.generators.file
+resolvers.openers .dirlist = resolvers.openers .file
+resolvers.loaders .dirlist = resolvers.loaders .file
+
+function resolvers.finders.dirfile(specification)
+ local queries = specification.queries
+ if queries then
+ queries.option = "fileonly"
+ else
+ specification.queries = { option = "fileonly" }
+ end
+ return resolve(specification)
+end
+
+resolvers.locators .dirfile = resolvers.locators .dirlist
+resolvers.hashers .dirfile = resolvers.hashers .dirlist
+resolvers.generators.dirfile = resolvers.generators.dirlist
+resolvers.openers .dirfile = resolvers.openers .dirlist
+resolvers.loaders .dirfile = resolvers.loaders .dirlist
+
+-- local locate = collectors[ [[E:\temporary\mb-mp]] ]
+-- local locate = collectors( [[\\storage-2\resources\mb-mp]] )
+
+-- print(resolvers.findtexfile("tree://e:/temporary/mb-mp/**/VB_wmf_03_vw_01d_ant.jpg"))
+-- print(resolvers.findtexfile("tree://t:/**/tufte.tex"))
+-- print(resolvers.findtexfile("dirlist://e:/temporary/mb-mp/**/VB_wmf_03_vw_01d_ant.jpg"))
diff --git a/Master/texmf-dist/tex/context/base/data-vir.lua b/Master/texmf-dist/tex/context/base/data-vir.lua
index 48fec54e065..7e25c822d07 100644
--- a/Master/texmf-dist/tex/context/base/data-vir.lua
+++ b/Master/texmf-dist/tex/context/base/data-vir.lua
@@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['data-vir'] = {
license = "see context related readme files"
}
-local format, validstrings = string.format, string.valid
+local formatters, validstrings = string.formatters, string.valid
local trace_virtual = false
local report_virtual = logs.reporter("resolvers","virtual")
@@ -18,14 +18,14 @@ local resolvers = resolvers
local finders, openers, loaders, savers = resolvers.finders, resolvers.openers, resolvers.loaders, resolvers.savers
-local data = { }
-local n = 0 -- hm, number can be query
-local template = "virtual://%s.%s"
+local data = { }
+local n = 0 -- hm, number can be query
+local f_virtual = formatters["virtual://%s.%s"]
function savers.virtual(specification,content)
n = n + 1 -- one number for all namespaces
local path = specification.path
- local filename = format(template,path ~= "" and path or "virtualfile",n)
+ local filename = f_virtual(path ~= "" and path or "virtualfile",n)
if trace_virtual then
report_virtual("saver: file %a saved",filename)
end
diff --git a/Master/texmf-dist/tex/context/base/data-zip.lua b/Master/texmf-dist/tex/context/base/data-zip.lua
index 5db69670c6d..2be88e0fc1c 100644
--- a/Master/texmf-dist/tex/context/base/data-zip.lua
+++ b/Master/texmf-dist/tex/context/base/data-zip.lua
@@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['data-zip'] = {
license = "see context related readme files"
}
--- partly redone .. needs testing
+-- real old code ... partly redone .. needs testing due to changes as well as a decent overhaul
local format, find, match = string.format, string.find, string.match
@@ -37,18 +37,6 @@ local archives = zip.archives
zip.registeredfiles = zip.registeredfiles or { }
local registeredfiles = zip.registeredfiles
-local limited = false
-
-directives.register("system.inputmode", function(v)
- if not limited then
- local i_limiter = io.i_limiter(v)
- if i_limiter then
- zip.open = i_limiter.protect(zip.open)
- limited = true
- end
- end
-end)
-
local function validzip(str) -- todo: use url splitter
if not find(str,"^zip://") then
return "zip:///" .. str
@@ -64,7 +52,7 @@ function zip.openarchive(name)
local arch = archives[name]
if not arch then
local full = resolvers.findfile(name) or ""
- arch = (full ~= "" and zip.open(full)) or false
+ arch = full ~= "" and zip.open(full) or false
archives[name] = arch
end
return arch
@@ -235,30 +223,42 @@ function resolvers.usezipfile(archive)
end
function resolvers.registerzipfile(z,tree)
- local files, filter = { }, ""
- if tree == "" then
- filter = "^(.+)/(.-)$"
- else
- filter = format("^%s/(.+)/(.-)$",tree)
- end
+ local names = { }
+ local files = { } -- somewhat overkill .. todo
+ local remap = { } -- somewhat overkill .. todo
+ local n = 0
+ local filter = tree == "" and "^(.+)/(.-)$" or format("^%s/(.+)/(.-)$",tree)
+ local register = resolvers.registerfile
if trace_locating then
report_zip("registering: using filter %a",filter)
end
- local register, n = resolvers.registerfile, 0
for i in z:files() do
- local path, name = match(i.filename,filter)
- if path then
- if name and name ~= '' then
- register(files, name, path)
- n = n + 1
- else
- -- directory
+ local filename = i.filename
+ local path, name = match(filename,filter)
+ if not path then
+ n = n + 1
+ register(names,filename,"")
+ local usedname = lower(filename)
+ files[usedname] = ""
+ if usedname ~= filename then
+ remap[usedname] = filename
end
- else
- register(files, i.filename, '')
+ elseif name and name ~= "" then
n = n + 1
+ register(names,name,path)
+ local usedname = lower(name)
+ files[usedname] = path
+ if usedname ~= name then
+ remap[usedname] = name
+ end
+ else
+ -- directory
end
end
report_zip("registering: %s files registered",n)
- return files
+ return {
+ -- metadata = { },
+ files = files,
+ remap = remap,
+ }
end
diff --git a/Master/texmf-dist/tex/context/base/enco-ini.mkiv b/Master/texmf-dist/tex/context/base/enco-ini.mkiv
index ab3aa488da1..b2e7efd3e5e 100644
--- a/Master/texmf-dist/tex/context/base/enco-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/enco-ini.mkiv
@@ -66,12 +66,16 @@
\fi\fi
\endcsname}
+\unexpanded\def\enco_define_command#1#2%
+ {\setuvalue{\string#1}{#2}}
+
\let\dohandleaccent \enco_handle_accent % maybe useful
\let\dodefineaccent \enco_define_accent % used at the lua end
\let\dodefineaccentcommand\enco_define_accent_command % used at the lua end
+\let\dodefinecommand \enco_define_command % used at the lua end
\unexpanded\def\definecharacter#1 #2 %
- {\doifnumberelse{\string#2}
+ {\doifelsenumber{\string#2}
{\setevalue{\string#1}{\utfchar{#2}}} % or {\expandafter\chardef\csname#1\endcsname#2\relax}
{\setuvalue{\string#1}{#2}}}
@@ -106,7 +110,7 @@
\unexpanded\def\buildtextaccent#1#2% we could do all at the lua end
{\begingroup % but that's no fun (yet)
\setbox\b_enco_accent\hbox{#1}%
- \ctxcommand{buildtextaccent(\number\b_enco_accent)}#2%
+ \clf_buildtextaccent\b_enco_accent#2%
\endgroup}
\unexpanded\def\bottomaccent#1#2#3#4#5% down right slantcorrection accent char
@@ -208,11 +212,42 @@
\def\pound {£} \def\sterling{£}
\def\promille {‰} \def\permille{‰}
-% tex specific (obsolete)
+% tex specific
+
+\ifdefined\textpercent
+ \let\percent \textpercent
+ \let\procent \textpercent
+ \let\ampersand \textampersand
+ \let\dollar \textdollar
+ \let\hash \texthash
+\else
+ \def\percent {\textpercent}
+ \def\procent {\textpercent}
+ \def\ampersand {\textampersand}
+ \def\dollar {\textdollar}
+ \def\hash {\texthash}
+\fi
+
+% from enco-mis:
+
+\unexpanded\def\fakepercent
+ {\mathematics{\normalsuperscript{\scriptscriptstyle0}\kern-.25\emwidth/\kern-.2\emwidth\normalsubscript{\scriptscriptstyle0}}}
+
+\unexpanded\def\fakeperthousand
+ {\mathematics{\normalsuperscript{\scriptscriptstyle0}\kern-.25\emwidth/\kern-.2\emwidth\normalsubscript{\scriptscriptstyle00}}}
+
+\unexpanded\def\fakepermine
+ {\dontleavehmode
+ \bgroup
+ \setbox\scratchbox\hbox
+ {\mathematics{+}}%
+ \hbox to \wd\scratchbox
+ {\hss
+ \mathematics{\normalsuperscript{\scriptscriptstyle-}\kern-.4\emwidth/\kern-.3\emwidth\normalsubscript{\scriptscriptstyle-}}%
+ \hss}%
+ \egroup}
-\def\procent {\percent}
-\def\dollar {\textdollar}
-\def\permine {\fakepermine}
+\def\permine{\fakepermine}
% some more
@@ -250,9 +285,27 @@
\chardef\textcontrolspace"2423
-\unexpanded\def\fallbackcontrolspace
- %{\getglyph{ComputerModernMono}\textcontrolspace}
- {\getglyph{LMTypewriter-Regular}\textcontrolspace}
+\installcorenamespace{controlspace}
+
+% \unexpanded\def\fallbackcontrolspace % beware: non-matching widths
+% {\hbox to \interwordspace{\hss\getglyph{LMTypewriter-Regular}\textcontrolspace\hss}%
+
+\unexpanded\def\fallbackcontrolspace % beware, current font, we also need to honor color
+ {\hbox to \interwordspace \bgroup
+ \hss
+ \ifcsname\??controlspace\number\interwordspace\endcsname
+ \csname\??controlspace\number\interwordspace\endcsname
+ \else
+ \enco_fast_control_space_define % only regular
+ \fi
+ \textcontrolspace
+ \hss
+ \egroup}
+
+\unexpanded\def\enco_fast_control_space_define
+ {\scratchdimen\interwordspace
+ \definedfont[LMTypewriter-Regular at \the\dimexpr\currentfontbodyscale\dimexpr\fontbody]% see font-sym.mkiv
+ \expandafter\glet\csname\??controlspace\number\scratchdimen\endcsname\lastrawfontcall}
\unexpanded\def\normalcontrolspace
{\iffontchar\font\textcontrolspace
@@ -263,29 +316,35 @@
\let\textvisiblespace\normalcontrolspace
-\unexpanded\def\fastcontrolspace % no glyph resolving after first (use grouped)
- {\enco_fast_control_space}
-
-\def\enco_fast_control_space
+\unexpanded\def\optionalcontrolspace
{\iffontchar\font\textcontrolspace
- \enco_fast_control_space_nop
+ \textcontrolspace
\else
- \enco_fast_control_space_yes
- \fi
- \enco_fast_control_space}
-
-\newbox\b_enco_control_space
-
-\def\enco_fast_control_space_nop
- {\let\enco_fast_control_space\textcontrolspace}
-
-\def\enco_fast_control_space_yes
- {\setbox\b_enco_control_space\hbox{\space}%
- \setbox\b_enco_control_space\hbox to \wd\b_enco_control_space{\hss\fallbackcontrolspace\hss}%
- \let\enco_fast_control_space\flushcontrolspacebox}
+ \asciispacechar % used for export !
+ \fi}
-\def\flushcontrolspacebox
- {\copy\b_enco_control_space}
+% \unexpanded\def\fastcontrolspace % no glyph resolving after first (use grouped)
+% {\enco_fast_control_space}
+%
+% \def\enco_fast_control_space
+% {\iffontchar\font\textcontrolspace
+% \enco_fast_control_space_nop
+% \else
+% \enco_fast_control_space_yes
+% \fi
+% \enco_fast_control_space}
+%
+% \newbox\b_enco_control_space
+%
+% \def\enco_fast_control_space_nop
+% {\let\enco_fast_control_space\textcontrolspace}
+%
+% \def\enco_fast_control_space_yes
+% {\setbox\b_enco_control_space\fallbackcontrolspace
+% \let\enco_fast_control_space\flushcontrolspacebox}
+%
+% \def\flushcontrolspacebox
+% {\copy\b_enco_control_space}
% a few defaults (\<whatever>{}), we really need the verbose \empty as it will be
% stringified .. anyhow, we define this at the lua end now but keep it here as a
@@ -305,26 +364,7 @@
% \defineaccent u {\empty} {\textbreve}
% \defineaccent v {\empty} {\textcaron}
-\ctxlua{characters.tex.defineaccents()}
-
-% from enco-mis:
-
-\unexpanded\def\fakepercent
- {\mathematics{\normalsuperscript{\scriptscriptstyle0}\kern-.25\emwidth/\kern-.2\emwidth\normalsubscript{\scriptscriptstyle0}}}
-
-\unexpanded\def\fakeperthousand
- {\mathematics{\normalsuperscript{\scriptscriptstyle0}\kern-.25\emwidth/\kern-.2\emwidth\normalsubscript{\scriptscriptstyle00}}}
-
-\unexpanded\def\fakepermine
- {\dontleavehmode
- \bgroup
- \setbox\scratchbox\hbox
- {\mathematics{+}}%
- \hbox to \wd\scratchbox
- {\hss
- \mathematics{\normalsuperscript{\scriptscriptstyle-}\kern-.4\emwidth/\kern-.3\emwidth\normalsubscript{\scriptscriptstyle-}}%
- \hss}%
- \egroup}
+\clf_defineaccents % one time
%D A smaller and bolder variant, more like the math and monospaced ones.
@@ -365,37 +405,105 @@
\unexpanded\def\inch {\mathematics{\prime\prime}} % was: \hbox{\rm\char125\relax}
\unexpanded\def\fraction#1#2{\mathematics{#1\over#2}}
-\def\periodswidth {.5em}
-\def\periodsdefault{3} % was 5, but now it's like \unknown
-
-\unexpanded\def\periods
- {\dosingleempty\enco_periods}
-
+% \def\periodswidth {.5em}
+% \def\periodsdefault{3} % was 5, but now it's like \unknown
+%
+% \unexpanded\def\periods
+% {\dosingleempty\enco_periods}
+%
% \def\doperiods[#1]% todo: also n=,width= or maybe just #1,#2
% {\dontleavehmode
% \begingroup
% \scratchdimen\periodswidth
% \hbox to \iffirstargument#1\else\periodsdefault\fi \scratchdimen
-% {\leaders\hbox to \scratchdimen{\hss.\hss}\hss}%
+% {\leaders\hbox to \scratchdimen{\hss\periodsymbol\hss}\hss}%
% \endgroup}
%
% better for export:
+%
+% \unexpanded\def\enco_periods[#1]% todo: also n=,width= or maybe just #1,#2
+% {\dontleavehmode
+% \hbox\bgroup
+% \setbox\scratchbox\hbox to \periodswidth{\hss\periodsymbol\hss}%
+% \dorecurse{\iffirstargument#1\else\periodsdefault\fi}{\copy\scratchbox}%
+% \egroup}
+%
+% \unexpanded\def\unknown
+% {\periods\relax} % relax prevents lookahead for []
+%
+% per request:
+
+%D \startbuffer
+%D \startlines
+%D x\periods x
+%D x\periods[10]x
+%D x\periods[n=10,symbol={,}]x
+%D x\periods[n=4,symbol={!!},width=1em]x
+%D x\periods[n=4,symbol={!!},width=fit]x
+%D x\periods[n=4,symbol={!!},width=fit,distance=1em]x
+%D x\unknown x
+%D \stoplines
+%D \stopbuffer
+%D
+%D \typbuffer \getbuffer
+
+\def\periodswidth {.5\emwidth} % downward compatible
+\def\periodsdefault{3} % downward compatible
+
+\installcorenamespace {periods}
+
+\installsetuponlycommandhandler \??periods {periods}
+
+\setupperiods
+ [\c!n=\periodsdefault,
+ \c!width=\periodswidth, % can also be \v!fit
+ \c!distance=.25\emwidth,
+ \c!symbol=.]
-\unexpanded\def\enco_periods[#1]% todo: also n=,width= or maybe just #1,#2
+\unexpanded\def\periods
{\dontleavehmode
\hbox\bgroup
- \setbox\scratchbox\hbox to \periodswidth{\hss.\hss}%
- \dorecurse{\iffirstargument#1\else\periodsdefault\fi}{\copy\scratchbox}%
+ \doifelsenextoptional\enco_periods_yes\enco_periods_nop}
+
+\unexpanded\def\enco_periods_yes[#1]%
+ {\doifelseassignment{#1}
+ {\setupcurrentperiods[#1]%
+ \scratchcounter\periodsparameter\c!n}
+ {\doifelsenothing{#1}
+ {\scratchcounter\periodsparameter\c!n}%
+ {\scratchcounter#1}}%
+ \enco_periods_finish}
+
+\unexpanded\def\enco_periods_nop
+ {\scratchcounter\periodsparameter\c!n
+ \enco_periods_finish}
+
+\unexpanded\def\enco_periods_finish
+ {\edef\p_width{\periodsparameter\c!width}%
+ \ifx\p_width\v!fit
+ \enco_periods_finish_fit
+ \else
+ \enco_periods_finish_width
+ \fi
\egroup}
+\unexpanded\def\enco_periods_finish_width
+ {\setbox\scratchbox\hbox to \p_width
+ {\hss\periodsparameter\c!symbol\hss}%
+ \dorecurse\scratchcounter{\copy\scratchbox}}
+
+\unexpanded\def\enco_periods_finish_fit
+ {\edef\p_symbol{\periodsparameter\c!symbol}%
+ \scratchdistance\periodsparameter\c!distance
+ \hskip\scratchdistance
+ \dorecurse\scratchcounter{\p_symbol\hskip\scratchdistance}}
+
\unexpanded\def\unknown
- {\periods\relax} % relax prevents lookahead for []
+ {\dontleavehmode
+ \hbox\bgroup
+ \enco_periods_nop}
-% Example by Wolfgang Schuster on the context list:
-%
-% \unexpanded\def\fourdots{{\def\periodswidth{.3em}\periods[4]}}
-%
-% Hello\fourdots\ World\fourdots \par Hello\fourdots\ World.
+%D Left-overs:
\appendtoks
\let\buildtextaccent\secondoftwoarguments
diff --git a/Master/texmf-dist/tex/context/base/export-example.css b/Master/texmf-dist/tex/context/base/export-example.css
index dbecc01feae..af99d95dbe4 100644
--- a/Master/texmf-dist/tex/context/base/export-example.css
+++ b/Master/texmf-dist/tex/context/base/export-example.css
@@ -7,65 +7,100 @@
*/
+/*
+
+ Because empty div elements are not seen we put a comment in them so that empty
+ table cells etc work ok.
+
+ We can style individual elements in several ways and we support in this css file
+ meaningful elements as well as divs. If needed you can use the chain field as well
+ as chain elements in the div class for styling groups.
+
+ \definefloat[myfloata]
+ \definefloat[myfloatb][myfloatbs][figure]
+
+ context|div.float.myfloata { } float[detail='myfloata'] { }
+ context|div.float.myfloatb { } float[detail='myfloatb'] { }
+ context|div.float.figure { } float[detail='figure'] { }
+ context|div.float.figure.myfloatb { } float[chain~='figure'][detail='myfloata'] { }
+ context|div.myfloata { } *[detail='myfloata'] { }
+ context|div.myfloatb { } *[detail='myfloatb'] { }
+ context|div.figure { } *[chain~='figure'] { }
+ context|div.figure.myfloatb { } *[chain~='figure'][detail='myfloatb'] { }
+
+*/
+
+@namespace context url('http://www.pragma-ade.com/context/export') ;
+
/* ignore : mixed */
/* metadata: display */
-ignore {
+ignore, context|div.ignore {
+ display : none ;
+}
+
+ignore, context|div.private {
display : none ;
}
-xmetadata {
+xmetadata, context|div.xmetadata {
display : none ;
}
-xmetavariable {
+xmetavariable, context|div.xmetavariable {
display : none ;
}
/* document : display */
-document:before {
+document:before, context|div.document:before {
content : attr(title) ;
font-size : 44pt ;
font-weight : bold ;
margin-bottom : 1em ;
}
-document {
+document, context|div.document {
font-family : "DejaVu Serif", "Lucida Bright", serif ;
font-size : 12pt ;
+ line-height : 14.4pt;
max-width : 50em ;
padding : 1em ;
/* text-align : justify ; */
+ text-align : justify ;
/* hyphens : manual ; */
/* text-justify : inter-word ; */
}
-document>metadata {
- font-family : "Lucida Console", "DejaVu Sans Mono", monospace ;
+document>metadata, context|div.document context|div.metadata {
+ font-family : "DejaVu Sans Mono", "Lucida Console", monospace ;
margin-bottom : 2em ;
}
-document>metadata>metavariable[name="title"]:before {
+document>metadata>metavariable[name="title"]:before,
+ context|div.document context|div.metadata context|div.metavariable.name-title:before {
content : "title\00A0\00A0\00A0:\00A0" ;
}
-document>metadata>metavariable[name="author"]:before {
- content : "author\00A0\00A0:\00A0" ;
+document>metadata>metavariable[name="author"]:before,
+ context|div.document context|div.metadata context|div.metavariable.name-author:before {
+ content : "author\00A0\00A0:\00A0" ;
}
-document>metadata>metavariable[name="version"]:before {
+document>metadata>metavariable[name="version"]:before,
+ context|div.document context|div.metadata context|div.metavariable.name-version:before {
content : "version\00A0:\00A0" ;
}
-document>metadata>metavariable[name="title"], document>metadata>metavariable[name="author"], document>metadata>metavariable[name="version"] {
+document>metadata>metavariable[name="title"], document>metadata>metavariable[name="author"], document>metadata>metavariable[name="version"],
+ context|div.document context|div.metadata context|div.metavariable.name-title, context|div.document context|div.metadata context|div.metavariable.name-author, context|div.document context|div.metadata context|div.metavariable.name-version {
display : block ;
}
/* paragraph : mixed */
/* p : mixed */
-paragraph, p {
+paragraph, p, context|div.paragraph, context|div.p {
display : block ;
margin-top : 0.5em ;
margin-bottom : 0.5em ;
@@ -73,7 +108,7 @@ paragraph, p {
/* break : display */
-break {
+break, context|div.break {
display : block ;
margin-bottom : 0.5em ;
}
@@ -81,14 +116,15 @@ break {
/* construct : inline */
/* highlight : inline */
-construct {
+construct, context|div.construct {
}
-construct[detail="important"] {
+construct[detail="important"], context|div.construct.important {
font-weight : bold ;
}
-highlight { /* todo: style and color */
+highlight, context|div.highlight { /* todo: style and color */
+ display : inline ;
}
/* section : display */
@@ -96,76 +132,95 @@ highlight { /* todo: style and color */
/* sectionnumber : mixed */
/* sectioncontent : display */
-section {
+section, context|div.section {
display : block ;
}
-sectioncontent {
+sectioncontent, context|div.sectioncontent {
display : block ;
margin-top : 1em ;
margin-bottom : 1em ;
}
-section[detail="chapter"], section[detail="title"] {
- margin-top : 3em ;
- margin-bottom : 2em ;
+section[detail="chapter"], section[detail="title"],
+ context|div.section.chapter, context|div.section.title {
+ page-break-before : always ;
+ page-break-after : avoid ;
+ margin-top : 3em ;
+ margin-bottom : 2em ;
}
-section[detail="section"], section[detail="subject"] {
- margin-top : 2.5em ;
- margin-bottom : 2.5em ;
+section[detail="section"], section[detail="subject"],
+ context|div.section.section, context|div.section.subject {
+ page-break-after : avoid ;
+ margin-top : 2.5em ;
+ margin-bottom : 2.5em ;
}
-section[detail="subsection"], section[detail="subsubject"] {
- margin-top : 2em ;
- margin-bottom : 2em ;
+section[detail="subsection"], section[detail="subsubject"],
+ context|div.section.subsection, context|div.section.subsubject {
+ page-break-after : avoid ;
+ margin-top : 2em ;
+ margin-bottom : 2em ;
}
-section[detail="subsubsection"], section[detail="subsubsubject"] {
- margin-top : 1em ;
- margin-bottom : 0em ;
+section[detail="subsubsection"], section[detail="subsubsubject"],
+ context|div.section.subsubsection, context|div.section.subsubsubject {
+ page-break-after : avoid ;
+ margin-top : 1em ;
+ margin-bottom : 0em ;
}
-section[detail="summary"], section[detail="subsummary"] {
+section[detail="summary"], section[detail="subsummary"],
+ context|div.section.summary, context|div.section.subsummary {
margin-top : 1em ;
margin-bottom : 1em ;
}
-section[detail="chapter"]>sectionnumber {
+section[detail="chapter"]>sectionnumber,
+ context|div.section.chapter context|div.sectionnumber {
display : inline-block ;
margin-right : 1em ;
font-size : 3em ;
font-weight : bold ;
}
-section[detail="chapter"]>sectiontitle, section[detail="title"]>sectiontitle {
+section[detail="chapter"]>sectiontitle, section[detail="title"]>sectiontitle,
+ context|div.section.chapter context|div.sectiontitle, context|div.section.title context|div.sectiontitle {
+ display : inline-block ;
font-size : 3em ;
font-weight : bold ;
}
-section[detail="section"]>sectiontitle, section[detail="subject"]>sectiontitle {
+section[detail="section"]>sectiontitle, section[detail="subject"]>sectiontitle,
+ context|div.section.section context|div.sectiontitle, context|div.section.subject context|div.sectiontitle {
+ display : inline-block ;
font-size : 2.5em ;
font-weight : bold ;
}
-section[detail="subsection"]>sectiontitle, section[detail="subsubject"]>sectiontitle{
+section[detail="subsection"]>sectiontitle, section[detail="subsubject"]>sectiontitle,
+ context|div.section.subsection context|div.sectiontitle, context|div.section.subsubject context|div.sectiontitle {
+ display : inline-block ;
font-size : 2em ;
font-weight : bold ;
}
-section[detail="subsubsection"]>sectiontitle, section[detail="subsubsubject"]>sectiontitle{
+section[detail="subsubsection"]>sectiontitle, section[detail="subsubsubject"]>sectiontitle,
+ context|div.section.subsubsection context|div.sectiontitle, context|div.section.subsubsubject context|div.sectiontitle {
+ display : inline-block ;
font-size : 1em ;
font-weight : bold ;
}
-section[detail="section"]>sectionnumber {
+section[detail="section"]>sectionnumber, context|div.section.section context|div.sectionnumber {
display : inline-block ;
margin-right : 1em ;
font-size : 2.5em ;
font-weight : bold ;
}
-section[detail="summary"]>sectiontitle {
+section[detail="summary"]>sectiontitle, context|div.section.summary context|div.sectiontitle {
display : block ;
margin-top : 1em ;
margin-bottom : 1em ;
@@ -175,21 +230,14 @@ section[detail="summary"]>sectiontitle {
border-width : .15em;
}
-section[detail="subsection"]>sectionnumber {
- display : inline-block ;
- margin-right : 1em ;
- font-size : 2em ;
- font-weight : bold ;
-}
-
-section[detail="subsection"]>sectionnumber {
+section[detail="subsection"]>sectionnumber, context|div.section.subsection context|div.sectionnumber {
display : inline-block ;
margin-right : 1em ;
font-size : 1em ;
font-weight : bold ;
}
-section[detail="subsummary"]>sectiontitle {
+section[detail="subsummary"]>sectiontitle, context|div.section.subsummary context|div.sectiontitle {
display : block ;
margin-top : 1em ;
margin-bottom : 1em ;
@@ -217,37 +265,37 @@ section[detail="subsummary"]>sectiontitle {
glyphs : 'Α' 'B' 'Γ' 'Δ' 'Ε' 'Ζ' 'Η' 'Θ' 'Ι' 'Κ' 'Λ' 'Μ' 'Ν' 'Ξ' 'Ο' 'Π' 'Ρ' 'Σ' 'Τ' 'Υ' 'Φ' 'Χ' 'Ψ' 'Ω' ;
}
-itemgroup {
+itemgroup, context|div.itemgroup {
display : block ;
margin-bottom : 0.5em ;
margin-top : 0.5em ;
}
-itemgroup[symbol="1"] { list-style-type : disc ; }
-itemgroup[symbol="2"] { list-style-type : square ; }
-itemgroup[symbol="3"] { list-style-type : square ; }
-itemgroup[symbol="4"] { list-style-type : square ; }
-itemgroup[symbol="5"] { list-style-type : circ ; }
-itemgroup[symbol="a"] { list-style-type : lower-alpha ; }
-itemgroup[symbol="A"] { list-style-type : alpha ; }
-itemgroup[symbol="r"] { list-style-type : lower-roman ; }
-itemgroup[symbol="R"] { list-style-type : upper-roman ; }
-itemgroup[symbol="n"] { list-style-type : decimal ; }
-itemgroup[symbol="g"] { list-style-type : lower-greek ; }
-itemgroup[symbol="G"] { list-style-type : upper-greek ; }
-
-item {
+itemgroup[symbol="1"], context|div.itemgroup.symbol-1 { list-style-type : disc ; }
+itemgroup[symbol="2"], context|div.itemgroup.symbol-2 { list-style-type : square ; }
+itemgroup[symbol="3"], context|div.itemgroup.symbol-3 { list-style-type : square ; }
+itemgroup[symbol="4"], context|div.itemgroup.symbol-4 { list-style-type : square ; }
+itemgroup[symbol="5"], context|div.itemgroup.symbol-5 { list-style-type : circ ; }
+itemgroup[symbol="a"], context|div.itemgroup.symbol-a { list-style-type : lower-alpha ; }
+itemgroup[symbol="A"], context|div.itemgroup.symbol-A { list-style-type : alpha ; }
+itemgroup[symbol="r"], context|div.itemgroup.symbol-r { list-style-type : lower-roman ; }
+itemgroup[symbol="R"], context|div.itemgroup.symbol-R { list-style-type : upper-roman ; }
+itemgroup[symbol="n"], context|div.itemgroup.symbol-n { list-style-type : decimal ; }
+itemgroup[symbol="g"], context|div.itemgroup.symbol-g { list-style-type : lower-greek ; }
+itemgroup[symbol="G"], context|div.itemgroup.symbol-G { list-style-type : upper-greek ; }
+
+item, context|div.item {
display : list-item ;
margin-left : 1em ;
margin-bottom : 0.5em ;
margin-top : 0.5em ;
}
-itemtag {
+itemtag, context|div.item {
display: none ;
}
-itemcontent {
+itemcontent, context|div.itemcontent {
}
/* description : display */
@@ -255,13 +303,14 @@ itemcontent {
/* descriptioncontent : mixed */
/* descriptionsymbol : inline */
-description {
+description, context|div.description {
display : block ;
margin-bottom : 1em ;
margin-top : 1em ;
}
-descriptiontag {
+descriptiontag, context|div.descriptiontag {
+ display : inline ;
float : left ;
clear : left ;
margin-right : 1em ;
@@ -269,10 +318,11 @@ descriptiontag {
font-weight : bold ;
}
-descriptioncontent {
+descriptioncontent, context|div.descriptioncontent {
}
-descriptionsymbol {
+descriptionsymbol, context|div.descriptionsymbol {
+ display : inline ;
}
/* verbatimblock : display */
@@ -280,46 +330,47 @@ descriptionsymbol {
/* verbatimline : mixed */
/* verbatim : inline */
-verbatimblock {
+verbatimblock, context|div.verbatimblock {
background-color : rgb(50%,50%,100%) ;
display : block ;
padding : 1em ;
margin-bottom : 1em ;
margin-top : 1em ;
- font-family : "Lucida Console", "DejaVu Sans Mono", monospace ;
+ font-family : "DejaVu Sans Mono", "Lucida Console", monospace ;
}
-verbatimlines+verbatimlines {
+verbatimlines+verbatimlines, context|div.verbatimlines+context|div.verbatimlines {
display : block ;
margin-top : 1em ;
}
-verbatimline {
+verbatimline, context|div.verbatimline {
display : block ;
white-space : pre-wrap ;
}
-verbatim {
+verbatim, context|div.verbatim {
+ display : inline ;
white-space : pre-wrap ;
color : rgb(60%,60%,0%) ;
- font-family : "Lucida Console", "DejaVu Sans Mono", monospace ;
+ font-family : "DejaVu Sans Mono", "Lucida Console", monospace ;
}
/* lines : display */
/* line : mixed */
-lines {
+lines, context|div.lines {
display : block ;
margin-bottom : 1em ;
margin-top : 1em ;
}
-lines+lines {
+lines+lines, context|div.lines+context|div.lines {
display : block ;
margin-top : 1em ;
}
-line {
+line, context|div.line {
display : block ;
white-space : pre-wrap ;
}
@@ -327,7 +378,7 @@ line {
/* synonym : inline */
/* sorting : inline */
-sorting, synonym {
+sorting, synonym, context|div.sorting, context|div.synonym {
display : inline ;
font-variant : small-caps ;
}
@@ -342,41 +393,54 @@ sorting, synonym {
/* registerpage : inline */
/* registerpagerange : mixed */
-register {
+register, context|div.register {
display: none ;
}
+registerlocation, context|div.registerlocation {
+ display: inline ;
+}
+
+registerlocation:after, context|div.registerlocation:after {
+ content : "\25B6\00A0\00A0" ;
+ color : rgb(40%,40%,40%) ;
+ font-size : x-small ;
+ line-height : 0 ;
+ padding-top : 0.5ex ;
+ vertical-align : top ;
+}
+
/* table : display */
/* tablerow : display */
/* tablecell : mixed */
-table {
+table, context|div.table {
display : table ;
}
-tablerow {
+tablerow, context|div.tablerow {
display : table-row ;
}
-tablecell[align="middle"] {
+tablecell[align="middle"], context|div.tablecell.align-middle {
display : table-cell ;
text-align : center ;
padding : .1em ;
}
-tablecell[align="flushleft"] {
+tablecell[align="flushleft"], context|div.tablecell.align-flushleft {
display : table-cell ;
text-align : left ;
padding : .1em ;
}
-tablecell[align="flushright"] {
+tablecell[align="flushright"], context|div.tablecell.align-flushright {
display : table-cell ;
text-align : right ;
padding : .1em ;
}
-tablecell {
+tablecell, context|div.tablecell {
display : table-cell ;
text-align : left ;
padding : .1em ;
@@ -386,36 +450,40 @@ tablecell {
/* tabulaterow : display */
/* tabulatecell : mixed */
-tabulate {
+tabulate, context|div.tabulate {
display : table ;
margin-top : 1em ;
margin-bottom : 1em ;
margin-left : 2.5em ;
}
-tabulaterow {
+floatcontent>tabulate, context|div.floatcontent context|div.tabulate {
+ margin-left : 0em ;
+}
+
+tabulaterow, context|div.tabulaterow {
display : table-row ;
}
-tabulatecell[align="middle"] {
+tabulatecell[align="middle"], context|div.tabulatecell.align-middle {
display : table-cell ;
text-align : center ;
padding-right : 1em ;
}
-tabulatecell[align="flushleft"] {
+tabulatecell[align="flushleft"], context|div.tabulatecell.align-flushleft {
display : table-cell ;
text-align : left ;
padding-right : 1em ;
}
-tabulatecell[align="flushright"] {
+tabulatecell[align="flushright"], context|div.tabulatecell.align-flushright {
display : table-cell ;
text-align : right ;
padding-right : 1em ;
}
-tabulatecell {
+tabulatecell, context|div.tabulatecell {
display : table-cell ;
text-align : left ;
padding-right : 1em ;
@@ -426,23 +494,23 @@ tabulatecell {
/* combinationcontent : mixed */
/* combinationcaption : mixed */
-combination {
+combination, context|div.combination {
display : table ;
margin-top : 0em ;
margin-bottom : 0em ;
}
-combinationpair {
+combinationpair, context|div.combinationpair {
display : table-cell ;
padding-right : 1em ;
}
-combinationcontent {
+combinationcontent, context|div.combinationcontent {
display : table-row ;
text-align : center ;
}
-combinationcaption {
+combinationcaption, context|div.combinationcaption {
display : table-row ;
padding-top : 1ex ;
text-align : center ;
@@ -456,36 +524,39 @@ combinationcaption {
/* listdata : mixed */
/* listpage : mixed */
-list {
+list, context|div.list {
display : block ;
}
-listitem[detail="chapter"] {
+listitem[detail="chapter"], context|div.listitem.chapter {
display : block ;
margin-top : 1em ;
font-weight : bold ;
}
-listitem[detail="section"] {
+listitem[detail="section"], context|div.listitem.section {
display : block ;
}
-listitem[detail="subsection"] {
+listitem[detail="subsection"], context|div.listitem.subsection {
display : block ;
+ display : inline-block ;
}
-listtag {
+listtag, context|div.listtag {
display : inline-block ;
width : 5em ;
}
-listcontent {
+listcontent, context|div.listcontent {
+ display : inline-block ;
}
-listdata {
+listdata, context|div.listdata {
+ display : inline-block ;
}
-listpage {
+listpage, context|div.listpage {
display : none ;
}
@@ -495,35 +566,43 @@ listpage {
/* :lang(en) */
-delimited[detail="quotation"]:before, delimitedblock[detail="quotation"]:before {
- content : "\201C" ;
+delimited[detail="quotation"]:before, delimitedblock[detail="quotation"]:before,
+ context|div.delimited.quotation:before, context|div.delimitedblock.quotation:before {
+ /* content : "\201C" ; */
+ font-style : italic ;
}
-delimited[detail="quotation"]:after, delimitedblock[detail="quotation"]:after {
- content : "\201D" ;
+delimited[detail="quotation"]:after, delimitedblock[detail="quotation"]:after,
+ context|div.delimited.quotation:after, context|div.delimitedblock.quotation:after {
+ /* content : "\201D" ; */
+ font-style : italic ;
}
-delimited[detail="quote"]:before, delimitedblock[detail="quote"]:before {
- content : "\2018" ;
+delimited[detail="quote"]:before, delimitedblock[detail="quote"]:before,
+ context|div.delimited.quote:before, context|div.delimitedblock.quote:before {
+ /* content : "\2018" ; */
+ font-style : italic ;
}
-delimited[detail="quote"]:after, delimitedblock[detail="quote"]:after {
- content : "\2019" ;
+delimited[detail="quote"]:after, delimitedblock[detail="quote"]:after,
+ context|div.delimited.quote:after, context|div.delimitedblock.quote:after {
+ /* content : "\2019" ; */
+ font-style : italic ;
}
-delimited {
+delimited, context|div.delimited {
display : inline
}
-delimitedblock {
+delimitedblock, context|div.delimitedblock {
display : block
}
-subsentence:before, subsentence:after {
+subsentence:before, subsentence:after, context|div.subsentence:before, context|div.subsentence:after {
content : "\2014" ;
}
-subsentence {
+subsentence, context|div.subsentence {
display : inline
}
@@ -537,32 +616,36 @@ subsentence {
/* floattext : mixed */
/* floatcontent : mixed */
-float {
+float, context|div.float {
display : block ;
margin-top : 1em ;
margin-bottom : 1em ;
margin-left : 2.5em ;
}
-floatcaption {
+floatcaption, context|div.floatcaption {
display : block ;
margin-top : 0.5em ;
color : rgb(60%,60%,0%) ;
}
-floatlabel {
+floatlabel, context|div.floatlabel {
+ display : inline-block ;
font-weight : bold ;
- margin-right : 1em ;
+ margin-right : 0.25em ;
}
-floatnumber {
- font-weight : bold ;
+floatnumber, context|div.floatnumber {
+ display : inline ;
+ font-weight : bold ;
+ margin-right : 0.25em ;
}
-floattext {
+floattext, context|div.floattext {
+ display : inline ;
}
-floatcontent {
+floatcontent, context|div.floatcontent {
}
/* image : mixed */
@@ -576,11 +659,11 @@ floatcontent {
height : 5.994cm ;
} */
-mpgraphic:before { /* does not work with empty element */
+mpgraphic:before, context|div.mpgraphic:before { /* does not work with empty element */
content : "[runtime metapost graphic]" ;
}
-mpgraphic {
+mpgraphic, context|div.mpgraphic {
display : inline ;
}
@@ -592,52 +675,68 @@ mpgraphic {
/* formulanumber : mixed */
/* formulacontent : display */
-formula {
+formula, context|div.formula {
display : block ;
margin-top : 1em ;
margin-bottom : 1em ;
margin-left : 2.5em ;
}
-subformula { /* todo */
+subformula, context|div.subformula { /* todo */
display : block ;
margin-top : 1em ;
margin-bottom : 1em ;
margin-left : 2.5em ;
}
-formulaset { /* todo */
+formulaset, context|div.formulaset { /* todo */
display : block ;
margin-top : 1em ;
margin-bottom : 1em ;
margin-left : 2.5em ;
}
-formulacaption { /* todo */
+formulacaption, context|div.formulacaption { /* todo */
display : block ;
margin-top : 0.5em ;
color : rgb(60%,60%,0%) ;
}
-formulalabel {
+formulalabel, context|div.formulalabel {
+ display : inline ;
font-weight : bold ;
- margin-right : 1em ;
+ margin-right : .25em ;
}
-formulanumber {
+formulanumber, context|div.formulanumber {
+ display : inline ;
font-weight : bold ;
}
-formulacontent {
+formulacontent, context|div.formulacontent {
display : block ;
}
-/* link : inline */
+link, context|div.link {
+ display : inline ;
+}
/* margintextblock : inline */
/* margintext : inline */
-/* math : inline */
+margintext, context|div.margintext {
+ display : block ;
+ font-weight : bold ;
+ margin-top : 1em ;
+ margin-bottom : 1em ;
+}
+
+margintext:before, context|div.margintext:before {
+ content : "\25B6\00A0\00A0" ;
+ color : rgb(40%,40%,40%) ;
+}
+
+/* math : inline | display */
/* mn : mixed */
/* mi : mixed */
/* mo : mixed */
@@ -660,67 +759,86 @@ formulacontent {
/* mtr : display */
/* mtd : display */
+context|div.math-inline {
+ display : inline ;
+ vertical-align : 0 ; /* this will be set directly */
+}
+
+context|div.math-display {
+ display : block ;
+ margin : 1ex 0ex 1em 3em ;
+}
+
/* quantity : inline */
/* unit : inline */
/* number : inline */
-quantity {
+quantity, context|div.quantity {
+ display : inline ;
}
-quantity>unit {
+quantity>unit, context|div.quantity>context|div.unit {
+ display : inline ;
}
-quantity>number {
+quantity>number, context|div.quantity>context|div.number {
+ display : inline ;
}
/* sub : inline */
/* sup : inline */
/* subsup : inline */
-sup {
+sup, context|div.sup {
+ display : inline-block ;
font-size : xx-small ;
- line-height : 0 ;
- vertical-align : top ;
+ vertical-align : super ;
}
-sub {
+sub, context|div.sub {
+ display : inline-block ;
font-size : xx-small ;
- line-height : 0 ;
- vertical-align : bottom ;
+ vertical-align : sub ;
}
-
-subsup>sup {
+subsup>sup, context|div.subsup>context|div.sup {
+ display : inline ;
vertical-align : top ;
}
-subsup>sub {
+subsup>sub, context|div.subsup>context|div.sub {
+ display : inline ;
vertical-align : bottom ;
}
-/* xhtml */
+/* links */
-a[href] {
- text-decoration : none ;
- color : inherit ;
-}
-
-a[href]:hover {
- color : rgb(50%,0%,0%) ;
- text-decoration : underline ;
+context|div[href]:hover {
+ color : rgb(50%,0%,0%) ;
+ background-color : rgb(85%,85%,85%) ;
}
/* setups */
-setup {
- display : block ;
+setup, context|div.setup {
+ display : block ;
}
-comment {
+comment, context|div.comment {
background-color : rgb(50%,75%,100%) ;
display : block ;
padding : 1em ;
- margin-bottom : 1em ;
- margin-top : 1em ;
- font-family : "Lucida Console", "DejaVu Sans Mono", monospace ;
+ margin-bottom : 2ex ;
+ margin-top : 2ex ;
+ font-family : "DejaVu Sans Mono", "Lucida Console", monospace ;
+}
+
+/* special */
+
+c, context|div.c {
+ display : inline ;
+}
+
+warning, context|div.warning {
+ display : none ;
}
diff --git a/Master/texmf-dist/tex/context/base/export-example.tex b/Master/texmf-dist/tex/context/base/export-example.tex
index 3a70b92fdaa..32cb79c5ea2 100644
--- a/Master/texmf-dist/tex/context/base/export-example.tex
+++ b/Master/texmf-dist/tex/context/base/export-example.tex
@@ -9,9 +9,7 @@
hyphen=yes]
\setupbackend
- [export=export-example.xml,
- xhtml=export-example.xhtml,
- css=export-example.css]
+ [export=yes]
% \setupalign
% [flushleft]
diff --git a/Master/texmf-dist/tex/context/base/file-ini.lua b/Master/texmf-dist/tex/context/base/file-ini.lua
index 3314bb33dfb..2a0271a9d80 100644
--- a/Master/texmf-dist/tex/context/base/file-ini.lua
+++ b/Master/texmf-dist/tex/context/base/file-ini.lua
@@ -11,29 +11,42 @@ if not modules then modules = { } end modules ['file-ini'] = {
<l n='tex'/>. These methods have counterparts at the <l n='tex'/> end.</p>
--ldx]]--
+
+local implement = interfaces.implement
+local setmacro = interfaces.setmacro
+local setcount = interfaces.setcount
+
resolvers.jobs = resolvers.jobs or { }
-local texsetcount = tex.setcount
+local filenametotable = file.nametotable
+local findtexfile = resolvers.findtexfile
-local context_setvalue = context.setvalue
local commands_doifelse = commands.doifelse
-function commands.splitfilename(fullname)
- local t = file.nametotable(fullname)
- local path = t.path
- texsetcount("splitoffkind",(path == "" and 0) or (path == '.' and 1) or 2)
- context_setvalue("splitofffull",fullname)
- context_setvalue("splitoffpath",path)
- context_setvalue("splitoffname",t.name)
- context_setvalue("splitoffbase",t.base)
- context_setvalue("splitofftype",t.suffix)
+local function splitfilename(full)
+ local split = filenametotable(full)
+ local path = split.path
+ setcount("splitoffkind",(path == "" and 0) or (path == '.' and 1) or 2)
+ setmacro("splitofffull",full or "")
+ setmacro("splitoffpath",path or "")
+ setmacro("splitoffname",split.name or "")
+ setmacro("splitoffbase",split.base or "")
+ setmacro("splitofftype",split.suffix or "")
end
-function commands.doifparentfileelse(n)
- commands_doifelse(n == environment.jobname or n == environment.jobname .. '.tex' or n == environment.outputfilename)
+local function isparentfile(name)
+ return
+ name == environment.jobname
+ or name == environment.jobname .. '.tex'
+ or name == environment.outputfilename
end
-function commands.doiffileexistelse(name)
- local foundname = resolvers.findtexfile(name)
- commands_doifelse(foundname and foundname ~= "")
+local function istexfile(name)
+ local name = name and findtexfile(name)
+ return name ~= "" and name
end
+
+implement { name = "splitfilename", actions = splitfilename, arguments = "string" }
+implement { name = "doifelseparentfile", actions = { isparentfile, commands_doifelse }, arguments = "string" }
+implement { name = "doifelsepathexist", actions = { lfs.isdir, commands_doifelse }, arguments = "string" }
+implement { name = "doifelsefileexist", actions = { istexfile, commands_doifelse }, arguments = "string" }
diff --git a/Master/texmf-dist/tex/context/base/file-ini.mkvi b/Master/texmf-dist/tex/context/base/file-ini.mkvi
index 989241dd1a7..cb9f18cf962 100644
--- a/Master/texmf-dist/tex/context/base/file-ini.mkvi
+++ b/Master/texmf-dist/tex/context/base/file-ini.mkvi
@@ -103,11 +103,11 @@
\the\everystartreadingfile
\pushcatcodetable % saveguard
\setcatcodetable\ctxcatcodes
- \ctxcommand{pushregime()}}% temporarily this way
+ \clf_pushregime}% temporarily this way
\unexpanded\def\stopreadingfile
{\popcatcodetable % saveguard
- \ctxcommand{popregime()}% temporarily this way
+ \clf_popregime % temporarily this way
\the\everystopreadingfile
\global\advance\readingfilelevel\minusone}
@@ -125,7 +125,7 @@
\def\inputgivenfile#name{\normalinput{#name}}
%D \macros
-%D {doiffileelse}
+%D {doifelsefile}
%D
%D The next alternative only looks if a file is present. No
%D loading is done. This one obeys the standard \TEX\ lookup.
@@ -134,11 +134,19 @@
%D \doiffileelse {filename} {found} {not found}
%D \stoptyping
-\def\doiffileexistselse#name{\ctxcommand{doiffileexistelse([[#name]])}}
+\unexpanded\def\doifelsefile {\clf_doifelsefileexist}
+\unexpanded\def\doifelsepath {\clf_doifelsepathexist}
+\unexpanded\def\doiffile #name{\clf_doifelsefileexist{#name}\firstofoneargument\gobbleoneargument}
+\unexpanded\def\doifnotfile #name{\clf_doifelsefileexist{#name}\gobbleoneargument\firstofoneargument}
-\def\doiffileelse {\doiffileexistselse}
-\def\doiffile #name{\doiffileexistselse{#name}\firstofoneargument\gobbleoneargument}
-\def\doifnotfile #name{\doiffileexistselse{#name}\gobbleoneargument\firstofoneargument}
+\let\doiffileelse\doifelsefile
+\let\doifpathelse\doifelsepath
+
+\let\doifelsefileexists\doifelsefile
+\let\doifelsepathexists\doifelsepath
+
+\let\doiffileexistselse\doifelsefileexists
+\let\doifpathexistselse\doifelsepathexists
%D \macros
%D {doifparentfileelse}
@@ -149,7 +157,9 @@
\ifx\outputfilename\undefined \def\outputfilename{\jobname} \fi
-\def\doifparentfileelse#name{\ctxcommand{doifparentfileelse([[#name]])}}
+\unexpanded\def\doifelseparentfile{\clf_doifelseparentfile}
+
+\let\doifparentfileelse\doifelseparentfile
%D \macros
%D {splitfilename}
@@ -185,7 +195,7 @@
\let\splitoffname\empty
\let\splitofftype\empty
-\def\splitfilename#name{\ctxcommand{splitfilename([[#name]])}}
+\unexpanded\def\splitfilename{\clf_splitfilename}
%D \macros
%D {doonlyonce, doinputonce, doendinputonce}
@@ -216,7 +226,7 @@
\fi}
\unexpanded\def\doinputonce#name%
- {\doonlyonce{#name}{\doiffileelse{#name}{\inputgivenfile{#name}}\donothing}}
+ {\doonlyonce{#name}{\doifelsefile{#name}{\inputgivenfile{#name}}\donothing}}
\unexpanded\def\doendinputonce#name%
{\ifcsname\??fileonce#name\endcsname
diff --git a/Master/texmf-dist/tex/context/base/file-job.lua b/Master/texmf-dist/tex/context/base/file-job.lua
index c88eb7e9de1..3a034f0a33e 100644
--- a/Master/texmf-dist/tex/context/base/file-job.lua
+++ b/Master/texmf-dist/tex/context/base/file-job.lua
@@ -11,15 +11,20 @@ if not modules then modules = { } end modules ['file-job'] = {
local gsub, match, find = string.gsub, string.match, string.find
local insert, remove, concat = table.insert, table.remove, table.concat
-local validstring = string.valid
+local validstring, formatters = string.valid, string.formatters
local sortedhash = table.sortedhash
-local formatters = string.formatters
-local commands, resolvers, context = commands, resolvers, context
+local commands = commands
+local resolvers = resolvers
+local context = context
-local trace_jobfiles = false trackers.register("system.jobfiles", function(v) trace_jobfiles = v end)
+local ctx_doifelse = commands.doifelse
-local report_jobfiles = logs.reporter("system","jobfiles")
+local implement = interfaces.implement
+
+local trace_jobfiles = false trackers.register("system.jobfiles", function(v) trace_jobfiles = v end)
+
+local report_jobfiles = logs.reporter("system","jobfiles")
local texsetcount = tex.setcount
local elements = interfaces.elements
@@ -42,6 +47,16 @@ local is_qualified_path = file.is_qualified_path
local cleanpath = resolvers.cleanpath
local inputstack = resolvers.inputstack
+local resolveprefix = resolvers.resolve
+
+local hasscheme = url.hasscheme
+
+local jobresolvers = resolvers.jobs
+
+local registerextrapath = resolvers.registerextrapath
+local resetextrapath = resolvers.resetextrapath
+local pushextrapath = resolvers.pushextrapath
+local popextrapath = resolvers.popextrapath
local v_outer = variables.outer
local v_text = variables.text
@@ -56,7 +71,7 @@ local c_prefix = variables.prefix
local function findctxfile(name) -- loc ? any ?
if is_qualified_path(name) then -- maybe when no suffix do some test for tex
return name
- elseif not url.hasscheme(name) then
+ elseif not hasscheme(name) then
return resolvers.finders.byscheme("loc",name) or ""
else
return resolvers.findtexfile(name) or ""
@@ -65,44 +80,94 @@ end
resolvers.findctxfile = findctxfile
-function commands.processfile(name)
- name = findctxfile(name)
- if name ~= "" then
- context.input(name)
+implement {
+ name = "processfile",
+ arguments = "string",
+ actions = function(name)
+ name = findctxfile(name)
+ if name ~= "" then
+ context.input(name)
+ end
end
-end
+}
-function commands.doifinputfileelse(name)
- commands.doifelse(findctxfile(name) ~= "")
-end
+implement {
+ name = "doifelseinputfile",
+ arguments = "string",
+ actions = function(name)
+ ctx_doifelse(findctxfile(name) ~= "")
+ end
+}
-function commands.locatefilepath(name)
- context(dirname(findctxfile(name)))
-end
+implement {
+ name = "locatefilepath",
+ arguments = "string",
+ actions = function(name)
+ context(dirname(findctxfile(name)))
+ end
+}
-function commands.usepath(paths)
- resolvers.registerextrapath(paths)
-end
+implement {
+ name = "usepath",
+ arguments = "string",
+ actions = function(paths)
+ report_jobfiles("using path: %s",paths)
+ registerextrapath(paths)
+ end
+}
-function commands.usesubpath(subpaths)
- resolvers.registerextrapath(nil,subpaths)
-end
+implement {
+ name = "pushpath",
+ arguments = "string",
+ actions = function(paths)
+ report_jobfiles("pushing path: %s",paths)
+ pushextrapath(paths)
+ end
+}
-function commands.allinputpaths()
- context(concat(resolvers.instance.extra_paths or { },","))
-end
+implement {
+ name = "poppath",
+ actions = function(paths)
+ popextrapath()
+ report_jobfiles("popping path")
+ end
+}
-function commands.setdocumentfilenames()
- environment.initializefilenames()
-end
+implement {
+ name = "usesubpath",
+ arguments = "string",
+ actions = function(subpaths)
+ report_jobfiles("using subpath: %s",subpaths)
+ registerextrapath(nil,subpaths)
+ end
+}
-function commands.usezipfile(name,tree)
- if tree and tree ~= "" then
- resolvers.usezipfile(formatters["zip:///%s?tree=%s"](name,tree))
- else
- resolvers.usezipfile(formatters["zip:///%s"](name))
+implement {
+ name = "resetpath",
+ actions = function()
+ report_jobfiles("resetting path")
+ resetextrapath()
end
-end
+}
+
+implement {
+ name = "allinputpaths",
+ actions = function()
+ context(concat(resolvers.instance.extra_paths or { },","))
+ end
+}
+
+implement {
+ name = "usezipfile",
+ arguments = { "string", "string" },
+ actions = function(name,tree)
+ if tree and tree ~= "" then
+ resolvers.usezipfile(formatters["zip:///%s?tree=%s"](name,tree))
+ else
+ resolvers.usezipfile(formatters["zip:///%s"](name))
+ end
+ end
+}
local report_system = logs.reporter("system")
@@ -113,7 +178,7 @@ local luapatterns = { "%s" .. utilities.lua.suffixes.luc, "%s.lua" }
local cldpatterns = { "%s.cld" }
local xmlpatterns = { "%s.xml" }
-local uselibrary = commands.uselibrary
+local uselibrary = resolvers.uselibrary
local input = context.input
-- status
@@ -124,23 +189,36 @@ local processstack = { }
local processedfile = ""
local processedfiles = { }
-function commands.processedfile()
- context(processedfile)
-end
+implement {
+ name = "processedfile",
+ actions = function()
+ context(processedfile)
+ end
+}
-function commands.processedfiles()
- context(concat(processedfiles,","))
-end
+implement {
+ name = "processedfiles",
+ actions = function()
+ context(concat(processedfiles,","))
+ end
+}
-function commands.dostarttextfile(name)
- insert(processstack,name)
- processedfile = name
- insert(processedfiles,name)
-end
+implement {
+ name = "dostarttextfile",
+ arguments = "string",
+ actions = function(name)
+ insert(processstack,name)
+ processedfile = name
+ insert(processedfiles,name)
+ end
+}
-function commands.dostoptextfile()
- processedfile = remove(processstack) or ""
-end
+implement {
+ name = "dostoptextfile",
+ actions = function()
+ processedfile = remove(processstack) or ""
+ end
+}
local function startprocessing(name,notext)
if not notext then
@@ -158,6 +236,11 @@ end
--
+local typestack = { }
+local currenttype = v_text
+
+--
+
local action = function(name,foundname) input(foundname) end
local failure = function(name,foundname) report_jobfiles("unknown %s file %a","tex",name) end
@@ -216,11 +299,6 @@ local function usexmlfile(name,onlyonce,notext)
stopprocessing(notext)
end
-commands.usetexfile = usetexfile
-commands.useluafile = useluafile
-commands.usecldfile = usecldfile
-commands.usexmlfile = usexmlfile
-
local suffixes = {
mkvi = usetexfile,
mkiv = usetexfile,
@@ -233,21 +311,36 @@ local suffixes = {
}
local function useanyfile(name,onlyonce)
- local s = suffixes[file.suffix(name)]
+ local s = suffixes[suffixonly(name)]
+ context(function() resolvers.pushpath(name) end)
if s then
- s(removesuffix(name),onlyonce)
+ -- s(removesuffix(name),onlyonce)
+ s(name,onlyonce) -- so, first with suffix, then without
else
usetexfile(name,onlyonce) -- e.g. ctx file
---~ resolvers.readfilename(name)
+ -- resolvers.readfilename(name)
end
+ context(resolvers.poppath)
end
-commands.useanyfile = useanyfile
+implement { name = "usetexfile", actions = usetexfile, arguments = "string" }
+implement { name = "useluafile", actions = useluafile, arguments = "string" }
+implement { name = "usecldfile", actions = usecldfile, arguments = "string" }
+implement { name = "usexmlfile", actions = usexmlfile, arguments = "string" }
+
+implement { name = "usetexfileonce", actions = usetexfile, arguments = { "string", true } }
+implement { name = "useluafileonce", actions = useluafile, arguments = { "string", true } }
+implement { name = "usecldfileonce", actions = usecldfile, arguments = { "string", true } }
+implement { name = "usexmlfileonce", actions = usexmlfile, arguments = { "string", true } }
-function resolvers.jobs.usefile(name,onlyonce,notext)
- local s = suffixes[file.suffix(name)]
+implement { name = "useanyfile", actions = useanyfile, arguments = "string" }
+implement { name = "useanyfileonce", actions = useanyfile, arguments = { "string", true } }
+
+function jobresolvers.usefile(name,onlyonce,notext)
+ local s = suffixes[suffixonly(name)]
if s then
- s(removesuffix(name),onlyonce,notext)
+ -- s(removesuffix(name),onlyonce,notext)
+ s(name,onlyonce,notext) -- so, first with suffix, then without
end
end
@@ -262,6 +355,8 @@ local function startstoperror()
startstoperror = dummyfunction
end
+local stopped
+
local function starttext()
if textlevel == 0 then
if trace_jobfiles then
@@ -275,73 +370,86 @@ local function starttext()
end
local function stoptext()
- if textlevel == 0 then
- startstoperror()
- elseif textlevel > 0 then
- textlevel = textlevel - 1
- end
- texsetcount("global","textlevel",textlevel)
- if textlevel <= 0 then
- if trace_jobfiles then
- report_jobfiles("stopping text")
+ if not stopped then
+ if textlevel == 0 then
+ startstoperror()
+ elseif textlevel > 0 then
+ textlevel = textlevel - 1
+ end
+ texsetcount("global","textlevel",textlevel)
+ if textlevel <= 0 then
+ if trace_jobfiles then
+ report_jobfiles("stopping text")
+ end
+ context.dostoptext()
+ -- registerfileinfo[end]jobfilename
+ context.finalend()
+ stopped = true
end
- context.dostoptext()
- -- registerfileinfo[end]jobfilename
- context.finalend()
- commands.stoptext = dummyfunction
end
end
-commands.starttext = starttext
-commands.stoptext = stoptext
+implement { name = "starttext", actions = starttext }
+implement { name = "stoptext", actions = stoptext }
-function commands.forcequitjob(reason)
- if reason then
- report_system("forcing quit: %s",reason)
- else
- report_system("forcing quit")
+implement {
+ name = "forcequitjob",
+ arguments = "string",
+ actions = function(reason)
+ if reason then
+ report_system("forcing quit: %s",reason)
+ else
+ report_system("forcing quit")
+ end
+ context.batchmode()
+ while textlevel >= 0 do
+ context.stoptext()
+ end
end
- context.batchmode()
- while textlevel >= 0 do
+}
+
+implement {
+ name = "forceendjob",
+ actions = function()
+ report_system([[don't use \end to finish a document]])
context.stoptext()
end
-end
-
-function commands.forceendjob()
- report_system([[don't use \end to finish a document]])
- context.stoptext()
-end
+}
-function commands.autostarttext()
- if textlevel == 0 then
- report_system([[auto \starttext ... \stoptext]])
+implement {
+ name = "autostarttext",
+ actions = function()
+ if textlevel == 0 then
+ report_system([[auto \starttext ... \stoptext]])
+ end
+ context.starttext()
end
- context.starttext()
-end
+}
-commands.autostoptext = stoptext
+implement {
+ name = "autostoptext",
+ actions = stoptext
+}
-- project structure
-function commands.processfilemany(name)
- useanyfile(name,false)
-end
-
-function commands.processfileonce(name)
- useanyfile(name,true)
-end
-
-function commands.processfilenone(name)
- -- skip file
-end
-
---
+implement {
+ name = "processfilemany",
+ arguments = { "string", false },
+ actions = useanyfile
+}
-local typestack = { }
-local pathstack = { }
+implement {
+ name = "processfileonce",
+ arguments = { "string", true },
+ actions = useanyfile
+}
-local currenttype = v_text
-local currentpath = "."
+implement {
+ name = "processfilenone",
+ arguments = "string",
+ actions = dummyfunction,
+}
local tree = { type = "text", name = "", branches = { } }
local treestack = { }
@@ -401,10 +509,11 @@ luatex.registerstopactions(function()
logspoptarget()
end)
-job.structure = job.structure or { }
-job.structure.collected = job.structure.collected or { }
-job.structure.tobesaved = root
-job.structure.components = { }
+local jobstructure = job.structure or { }
+job.structure = jobstructure
+jobstructure.collected = jobstructure.collected or { }
+jobstructure.tobesaved = root
+jobstructure.components = { }
local function initialize()
local function collect(root,result)
@@ -420,7 +529,7 @@ local function initialize()
end
return result
end
- job.structure.components = collect(job.structure.collected,{})
+ jobstructure.components = collect(jobstructure.collected,{})
end
job.register('job.structure.collected',root,initialize)
@@ -432,48 +541,67 @@ local context_processfilemany = context.processfilemany
local context_processfileonce = context.processfileonce
local context_processfilenone = context.processfilenone
+-- we need a plug in the nested loaded, push pop pseudo current dir
+
+local function processfilecommon(name,action)
+ -- experiment, might go away
+-- if not hasscheme(name) then
+-- local path = dirname(name)
+-- if path ~= "" then
+-- registerextrapath(path)
+-- report_jobfiles("adding search path %a",path)
+-- end
+-- end
+ -- till here
+ action(name)
+end
+
+local function processfilemany(name) processfilecommon(name,context_processfilemany) end
+local function processfileonce(name) processfilecommon(name,context_processfileonce) end
+local function processfilenone(name) processfilecommon(name,context_processfilenone) end
+
local processors = utilities.storage.allocate {
-- [v_outer] = {
- -- [v_text] = { "many", context_processfilemany },
- -- [v_project] = { "once", context_processfileonce },
- -- [v_environment] = { "once", context_processfileonce },
- -- [v_product] = { "once", context_processfileonce },
- -- [v_component] = { "many", context_processfilemany },
+ -- [v_text] = { "many", processfilemany },
+ -- [v_project] = { "once", processfileonce },
+ -- [v_environment] = { "once", processfileonce },
+ -- [v_product] = { "once", processfileonce },
+ -- [v_component] = { "many", processfilemany },
-- },
[v_text] = {
- [v_text] = { "many", context_processfilemany },
- [v_project] = { "once", context_processfileonce }, -- dubious
- [v_environment] = { "once", context_processfileonce },
- [v_product] = { "many", context_processfilemany }, -- dubious
- [v_component] = { "many", context_processfilemany },
+ [v_text] = { "many", processfilemany },
+ [v_project] = { "once", processfileonce }, -- dubious
+ [v_environment] = { "once", processfileonce },
+ [v_product] = { "many", processfilemany }, -- dubious
+ [v_component] = { "many", processfilemany },
},
[v_project] = {
- [v_text] = { "many", context_processfilemany },
- [v_project] = { "none", context_processfilenone },
- [v_environment] = { "once", context_processfileonce },
- [v_product] = { "none", context_processfilenone },
- [v_component] = { "none", context_processfilenone },
+ [v_text] = { "many", processfilemany },
+ [v_project] = { "none", processfilenone },
+ [v_environment] = { "once", processfileonce },
+ [v_product] = { "none", processfilenone },
+ [v_component] = { "none", processfilenone },
},
[v_environment] = {
- [v_text] = { "many", context_processfilemany },
- [v_project] = { "none", context_processfilenone },
- [v_environment] = { "once", context_processfileonce },
- [v_product] = { "none", context_processfilenone },
- [v_component] = { "none", context_processfilenone },
+ [v_text] = { "many", processfilemany },
+ [v_project] = { "none", processfilenone },
+ [v_environment] = { "once", processfileonce },
+ [v_product] = { "none", processfilenone },
+ [v_component] = { "none", processfilenone },
},
[v_product] = {
- [v_text] = { "many", context_processfilemany },
- [v_project] = { "once", context_processfileonce },
- [v_environment] = { "once", context_processfileonce },
- [v_product] = { "many", context_processfilemany },
- [v_component] = { "many", context_processfilemany },
+ [v_text] = { "many", processfilemany },
+ [v_project] = { "once", processfileonce },
+ [v_environment] = { "once", processfileonce },
+ [v_product] = { "many", processfilemany },
+ [v_component] = { "many", processfilemany },
},
[v_component] = {
- [v_text] = { "many", context_processfilemany },
- [v_project] = { "once", context_processfileonce },
- [v_environment] = { "once", context_processfileonce },
- [v_product] = { "none", context_processfilenone },
- [v_component] = { "many", context_processfilemany },
+ [v_text] = { "many", processfilemany },
+ [v_project] = { "once", processfileonce },
+ [v_environment] = { "once", processfileonce },
+ [v_product] = { "none", processfilenone },
+ [v_component] = { "many", processfilemany },
}
}
@@ -493,7 +621,7 @@ local stop = {
[v_component] = context.stoptext,
}
-resolvers.jobs.processors = processors
+jobresolvers.processors = processors
local function topofstack(what)
local stack = stacks[what]
@@ -520,22 +648,22 @@ local function justacomponent()
end
end
-resolvers.jobs.productcomponent = productcomponent
-resolvers.jobs.justacomponent = justacomponent
+jobresolvers.productcomponent = productcomponent
+jobresolvers.justacomponent = justacomponent
-function resolvers.jobs.currentproject () return topofstack(v_project ) end
-function resolvers.jobs.currentproduct () return topofstack(v_product ) end
-function resolvers.jobs.currentcomponent () return topofstack(v_component ) end
-function resolvers.jobs.currentenvironment() return topofstack(v_environment) end
+function jobresolvers.currentproject () return topofstack(v_project ) end
+function jobresolvers.currentproduct () return topofstack(v_product ) end
+function jobresolvers.currentcomponent () return topofstack(v_component ) end
+function jobresolvers.currentenvironment() return topofstack(v_environment) end
local done = { }
-local tolerant = false -- too messy, mkii user with the wrong sructure should adapt
+local tolerant = false -- too messy, mkii user with the wrong structure should adapt
local function process(what,name)
local depth = #typestack
local process
--
- name = resolvers.resolve(name)
+ name = resolveprefix(name)
--
-- if not tolerant then
-- okay, would be best but not compatible with mkii
@@ -589,10 +717,10 @@ local function process(what,name)
end
end
-function commands.useproject (name) process(v_project, name) end
-function commands.useenvironment(name) process(v_environment,name) end
-function commands.useproduct (name) process(v_product, name) end
-function commands.usecomponent (name) process(v_component, name) end
+implement { name = "useproject", actions = function(name) process(v_project, name) end, arguments = "string" }
+implement { name = "useenvironment", actions = function(name) process(v_environment,name) end, arguments = "string" }
+implement { name = "useproduct", actions = function(name) process(v_product, name) end, arguments = "string" } -- will be overloaded
+implement { name = "usecomponent", actions = function(name) process(v_component, name) end, arguments = "string" }
-- todo: setsystemmode to currenttype
-- todo: make start/stop commands at the tex end
@@ -614,9 +742,7 @@ local stop = {
local function gotonextlevel(what,name) -- todo: something with suffix name
insert(stacks[what],name)
insert(typestack,currenttype)
- insert(pathstack,currentpath)
currenttype = what
- currentpath = dirname(name)
pushtree(what,name)
if start[what] then
start[what]()
@@ -628,7 +754,6 @@ local function gotopreviouslevel(what)
stop[what]()
end
poptree()
- currentpath = remove(pathstack) or "."
currenttype = remove(typestack) or v_text
remove(stacks[what]) -- not currenttype ... weak recovery
-- context.endinput() -- does not work
@@ -642,20 +767,20 @@ local function autoname(name)
return name
end
-function commands.startproject (name) gotonextlevel(v_project, autoname(name)) end
-function commands.startproduct (name) gotonextlevel(v_product, autoname(name)) end
-function commands.startcomponent (name) gotonextlevel(v_component, autoname(name)) end
-function commands.startenvironment(name) gotonextlevel(v_environment,autoname(name)) end
+implement { name = "startproject", actions = function(name) gotonextlevel(v_project, autoname(name)) end, arguments = "string" }
+implement { name = "startproduct", actions = function(name) gotonextlevel(v_product, autoname(name)) end, arguments = "string" }
+implement { name = "startcomponent", actions = function(name) gotonextlevel(v_component, autoname(name)) end, arguments = "string" }
+implement { name = "startenvironment", actions = function(name) gotonextlevel(v_environment,autoname(name)) end, arguments = "string" }
-function commands.stopproject () gotopreviouslevel(v_project ) end
-function commands.stopproduct () gotopreviouslevel(v_product ) end
-function commands.stopcomponent () gotopreviouslevel(v_component ) end
-function commands.stopenvironment() gotopreviouslevel(v_environment) end
+implement { name = "stopproject", actions = function() gotopreviouslevel(v_project ) end }
+implement { name = "stopproduct", actions = function() gotopreviouslevel(v_product ) end }
+implement { name = "stopcomponent", actions = function() gotopreviouslevel(v_component ) end }
+implement { name = "stopenvironment", actions = function() gotopreviouslevel(v_environment) end }
-function commands.currentproject () context(topofstack(v_project )) end
-function commands.currentproduct () context(topofstack(v_product )) end
-function commands.currentcomponent () context(topofstack(v_component )) end
-function commands.currentenvironment() context(topofstack(v_environment)) end
+implement { name = "currentproject", actions = function() context(topofstack(v_project )) end }
+implement { name = "currentproduct", actions = function() context(topofstack(v_product )) end }
+implement { name = "currentcomponent", actions = function() context(topofstack(v_component )) end }
+implement { name = "currentenvironment", actions = function() context(topofstack(v_environment)) end }
-- -- -- this will move -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
--
@@ -684,7 +809,7 @@ local function convertexamodes(str)
end
end
-function commands.loadexamodes(filename)
+function environment.loadexamodes(filename)
if not filename or filename == "" then
filename = removesuffix(tex.jobname)
end
@@ -697,6 +822,12 @@ function commands.loadexamodes(filename)
end
end
+implement {
+ name = "loadexamodes",
+ actions = environment.loadexamodes,
+ arguments = "string"
+}
+
-- changed in mtx-context
-- code moved from luat-ini
@@ -739,20 +870,50 @@ function document.setfilename(i,name)
end
end
-function document.getargument(key,default) -- commands
+function document.getargument(key,default)
local v = document.arguments[key]
if type(v) == "boolean" then
v = (v and "yes") or "no"
document.arguments[key] = v
end
- context(v or default or "")
+ return v or default or ""
end
-function document.getfilename(i) -- commands
- context(document.files[tonumber(i)] or "")
+function document.getfilename(i)
+ return document.files[tonumber(i)] or ""
end
-function commands.getcommandline() -- has to happen at the tex end in order to expand
+implement {
+ name = "setdocumentargument",
+ actions = document.setargument,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "setdocumentdefaultargument",
+ actions = document.setdefaultargument,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "setdocumentfilename",
+ actions = document.setfilename,
+ arguments = { "integer", "string" }
+}
+
+implement {
+ name = "getdocumentargument",
+ actions = { document.getargument, context },
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "getdocumentfilename",
+ actions = { document.getfilename, context },
+ arguments = "integer"
+}
+
+function document.setcommandline() -- has to happen at the tex end in order to expand
-- the document[arguments|files] tables are copies
@@ -891,21 +1052,36 @@ local function apply(list,action)
end
end
-function commands.setdocumentmodes() -- was setup: *runtime:modes
+function document.setmodes() -- was setup: *runtime:modes
apply(document.options.ctxfile .modes,context.enablemode)
apply(document.options.commandline.modes,context.enablemode)
end
-function commands.setdocumentmodules() -- was setup: *runtime:modules
+function document.setmodules() -- was setup: *runtime:modules
apply(document.options.ctxfile .modules,context.usemodule)
apply(document.options.commandline.modules,context.usemodule)
end
-function commands.setdocumentenvironments() -- was setup: *runtime:environments
+function document.setenvironments() -- was setup: *runtime:environments
apply(document.options.ctxfile .environments,context.environment)
apply(document.options.commandline.environments,context.environment)
end
+function document.setfilenames()
+ local initialize = environment.initializefilenames
+ if initialize then
+ initialize()
+ else
+ -- fatal error
+ end
+end
+
+implement { name = "setdocumentcommandline", actions = document.setcommandline, onlyonce = true }
+implement { name = "setdocumentmodes", actions = document.setmodes, onlyonce = true }
+implement { name = "setdocumentmodules", actions = document.setmodules, onlyonce = true }
+implement { name = "setdocumentenvironments", actions = document.setenvironments, onlyonce = true }
+implement { name = "setdocumentfilenames", actions = document.setfilenames, onlyonce = true }
+
local report_files = logs.reporter("system","files")
local report_options = logs.reporter("system","options")
local report_file = logs.reporter("used file")
@@ -936,16 +1112,24 @@ luatex.registerstopactions(function()
logsnewline()
report_options("start commandline options")
logsnewline()
- for argument, value in sortedhash(arguments) do
- report_option("%s=%A",argument,value)
+ if arguments and next(arguments) then
+ for argument, value in sortedhash(arguments) do
+ report_option("%s=%A",argument,value)
+ end
+ else
+ report_file("no arguments")
end
logsnewline()
report_options("stop commandline options")
logsnewline()
report_options("start commandline files")
logsnewline()
- for i=1,#files do
- report_file("% 4i: %s",i,files[i])
+ if files and #files > 0 then
+ for i=1,#files do
+ report_file("% 4i: %s",i,files[i])
+ end
+ else
+ report_file("no files")
end
logsnewline()
report_options("stop commandline files")
@@ -1009,15 +1193,20 @@ if environment.initex then
end
-function commands.doifelsecontinuewithfile(inpname,basetoo)
- local inpnamefull = addsuffix(inpname,"tex")
- local inpfilefull = addsuffix(environment.inputfilename,"tex")
- local continue = inpnamefull == inpfilefull
- if basetoo and not continue then
- continue = inpnamefull == basename(inpfilefull)
- end
- if continue then
- report_system("continuing input file %a",inpname)
+implement {
+ name = "doifelsecontinuewithfile",
+ arguments = "string",
+ actions = function(inpname,basetoo)
+ local inpnamefull = addsuffix(inpname,"tex")
+ local inpfilefull = addsuffix(environment.inputfilename,"tex")
+ local continue = inpnamefull == inpfilefull
+ -- if basetoo and not continue then
+ if not continue then
+ continue = inpnamefull == basename(inpfilefull)
+ end
+ if continue then
+ report_system("continuing input file %a",inpname)
+ end
+ ctx_doifelse(continue)
end
- commands.doifelse(continue)
-end
+}
diff --git a/Master/texmf-dist/tex/context/base/file-job.mkvi b/Master/texmf-dist/tex/context/base/file-job.mkvi
index 5f646ed289c..7814aba3f62 100644
--- a/Master/texmf-dist/tex/context/base/file-job.mkvi
+++ b/Master/texmf-dist/tex/context/base/file-job.mkvi
@@ -21,29 +21,59 @@
% processing
-\unexpanded\def\doifinputfileelse#name%
- {\ctxcommand{doifinputfileelse("#name")}}
+\unexpanded\def\doifelseinputfile#name%
+ {\clf_doifelseinputfile{#name}}
+
+\let\doifinputfileelse\doifelseinputfile
\unexpanded\def\processfile#name%
- {\ctxcommand{processfile("#name")}}
+ {\clf_processfile{#name}}
% path control
+%D In the following example the lookup order is \type {.}, {/foo}, \type
+%D {foo/bar} as one can always explicitly prefix a wanted file.
+%D
+%D \starttyping
+%D \pushpath[foo]
+%D \pushpath[foo/bar]
+%D \input test
+%D \poppath
+%D \poppath
+%D \stoptyping
+
\unexpanded\def\usepath[#path]%
- {\ctxcommand{usepath("#path")}}
+ {\clf_usepath{#path}}
\unexpanded\def\usesubpath[#path]%
- {\ctxcommand{usesubpath("#path")}}
+ {\clf_usesubpath{#path}}
+
+\unexpanded\def\pushpath[#path]%
+ {\clf_pushpath{#path}}
+
+\unexpanded\def\poppath
+ {\clf_poppath}
+
+\unexpanded\def\resetpath % not the pushed paths
+ {\clf_resetpath}
\def\allinputpaths
- {\ctxcommand{allinputpaths()}}
+ {\clf_allinputpaths}
% helper (not really needed nowadays)
\let\locatedfilepath\empty
\unexpanded\def\locatefilepath#name% no [] ?
- {\edef\locatedfilepath{\ctxcommand{locatefilepath("#name")}}}
+ {\edef\locatedfilepath{\clf_locatefilepath{#name}}}
+
+% % maybe:
+%
+% % \dirlist{c:/data/temporary/foo}{images/bar.jpg}
+% % \dirfile{c:/data/temporary/foo}{images/bar.jpg}
+%
+% \def\dirlist#1#2{dirlist://#1/**/#2}
+% \def\dirfile#1#2{dirlist://#1/**/#2?option=fileonly}
% zip files are tree'd
@@ -51,7 +81,7 @@
{\dodoubleempty\syst_files_use_zip_file}
\def\syst_files_use_zip_file[#zipname][#subtree]%
- {\ctxcommand{usezipfile("#zipname","#subtree")}}
+ {\clf_usezipfile{#zipname}{#subtree}}
% exa stuff might become obsolete:
@@ -59,7 +89,7 @@
{\dosingleempty\syst_files_load_exa_modes}
\def\syst_files_load_exa_modes[#name]%
- {\ctxcommand{loadexamodes("#name")}}
+ {\clf_loadexamodes{#name}}
% runtime files (maybe also do this in lua?)
@@ -77,14 +107,6 @@
\def\syst_files_load_indeed#name% from now on we assume a suffix to be part of the name
{\readsysfile{#name}{\showmessage\m!system2{#name}}\donothing}
-% obsolete, but we keep it as reference of what happened
-%
-% \unexpanded\def\loadoptionfile
-% {\readjobfile{\jobname.\f!optionextension}
-% {\writestatus\m!system{\jobname.\f!optionextension\space loaded}%
-% \ctxcommand{copyfiletolog("\jobname.\f!optionextension")}}%
-% {\writestatus\m!system{no \jobname.\f!optionextension}}}
-
% document structure
\ifdefined\textlevel \else \newcount\textlevel \fi % might go away
@@ -105,15 +127,15 @@
\global\everybye\emptytoks
\the\everygoodbye
\global\everygoodbye\emptytoks
- \doifsometokselse\everynotabene{\writeline\the\everynotabene\writeline}\donothing
+ \doifelsesometoks\everynotabene{\writeline\the\everynotabene\writeline}\donothing
\normalend} % tex's \end
-\unexpanded\def\starttext {\ctxcommand{starttext()}}
-\unexpanded\def\stoptext {\ctxcommand{stoptext()}}
-\unexpanded\def\forcequitjob {\ctxcommand{forcequitjob()}}
-\unexpanded\def\end {\ctxcommand{forceendjob()}}
-\unexpanded\def\autostarttext{\ctxcommand{autostarttext()}}
-\unexpanded\def\autostoptext {\ctxcommand{autostoptext()}}
+\unexpanded\def\starttext {\clf_starttext}
+\unexpanded\def\stoptext {\clf_stoptext}
+\unexpanded\def\forcequitjob {\clf_forcequitjob}
+\unexpanded\def\end {\clf_forceendjob}
+\unexpanded\def\autostarttext{\clf_autostarttext}
+\unexpanded\def\autostoptext {\clf_autostoptext}
\unexpanded\def\finishjob{\stoptext} % nicer in luatex call commandline
@@ -125,39 +147,39 @@
% protect structure
-\unexpanded\def\processfilemany#name{\ctxcommand{processfilemany("#name")}}
-\unexpanded\def\processfileonce#name{\ctxcommand{processfileonce("#name")}}
-\unexpanded\def\processfilenone#name{\ctxcommand{processfilenone("#name")}}
+\unexpanded\def\processfilemany#name{\clf_processfilemany{#name}}
+\unexpanded\def\processfileonce#name{\clf_processfileonce{#name}}
+\unexpanded\def\processfilenone#name{\clf_processfilenone{#name}}
-\unexpanded\def\project {\doifnextoptionalcselse\useproject \syst_structure_arg_project}
-\unexpanded\def\product {\doifnextoptionalcselse\useproduct \syst_structure_arg_product}
-\unexpanded\def\component {\doifnextoptionalcselse\usecomponent \syst_structure_arg_component}
-\unexpanded\def\environment{\doifnextoptionalcselse\useenvironment\syst_structure_arg_environment}
+\unexpanded\def\project {\doifelsenextoptionalcs\useproject \syst_structure_arg_project}
+\unexpanded\def\product {\doifelsenextoptionalcs\useproduct \syst_structure_arg_product}
+\unexpanded\def\component {\doifelsenextoptionalcs\usecomponent \syst_structure_arg_component}
+\unexpanded\def\environment{\doifelsenextoptionalcs\useenvironment\syst_structure_arg_environment}
-\def\syst_structure_arg_project #name {\ctxcommand{useproject ("#name")}}
-\def\syst_structure_arg_product #name {\ctxcommand{useproduct ("#name")}}
-\def\syst_structure_arg_component #name {\ctxcommand{usecomponent ("#name")}}
-\def\syst_structure_arg_environment#name {\ctxcommand{useenvironment("#name")}}
+\def\syst_structure_arg_project #name {\clf_useproject {#name}}
+\def\syst_structure_arg_product #name {\clf_useproduct {#name}}
+\def\syst_structure_arg_component #name {\clf_usecomponent {#name}}
+\def\syst_structure_arg_environment#name {\clf_useenvironment{#name}}
-\unexpanded\def\startproject {\doifnextoptionalcselse\syst_structure_start_opt_project \syst_structure_start_arg_project }
-\unexpanded\def\startproduct {\doifnextoptionalcselse\syst_structure_start_opt_product \syst_structure_start_arg_product }
-\unexpanded\def\startcomponent {\doifnextoptionalcselse\syst_structure_start_opt_component \syst_structure_start_arg_component }
-\unexpanded\def\startenvironment{\doifnextoptionalcselse\syst_structure_start_opt_environment\syst_structure_start_arg_environment}
+\unexpanded\def\startproject {\doifelsenextoptionalcs\syst_structure_start_opt_project \syst_structure_start_arg_project }
+\unexpanded\def\startproduct {\doifelsenextoptionalcs\syst_structure_start_opt_product \syst_structure_start_arg_product }
+\unexpanded\def\startcomponent {\doifelsenextoptionalcs\syst_structure_start_opt_component \syst_structure_start_arg_component }
+\unexpanded\def\startenvironment{\doifelsenextoptionalcs\syst_structure_start_opt_environment\syst_structure_start_arg_environment}
-\def\syst_structure_start_arg_project #name {\ctxcommand{startproject ("#name")}}
-\def\syst_structure_start_arg_product #name {\ctxcommand{startproduct ("#name")}}
-\def\syst_structure_start_arg_component #name {\ctxcommand{startcomponent ("#name")}}
-\def\syst_structure_start_arg_environment#name {\ctxcommand{startenvironment("#name")}}
+\def\syst_structure_start_arg_project #name {\clf_startproject {#name}}
+\def\syst_structure_start_arg_product #name {\clf_startproduct {#name}}
+\def\syst_structure_start_arg_component #name {\clf_startcomponent {#name}}
+\def\syst_structure_start_arg_environment#name {\clf_startenvironment{#name}}
-\unexpanded\def\useproject [#name]{\ctxcommand{useproject ("#name")}}
-\unexpanded\def\useproduct [#name]{\ctxcommand{useproduct ("#name")}}
-\unexpanded\def\usecomponent [#name]{\ctxcommand{usecomponent ("#name")}}
-\unexpanded\def\useenvironment[#name]{\ctxcommand{useenvironment("#name")}}
+\unexpanded\def\useproject [#name]{\clf_useproject {#name}}
+\unexpanded\def\useproduct [#name]{\clf_useproduct {#name}}
+\unexpanded\def\usecomponent [#name]{\clf_usecomponent {#name}}
+\unexpanded\def\useenvironment[#name]{\clf_useenvironment{#name}}
-\unexpanded\def\syst_structure_start_opt_project [#name]{\ctxcommand{startproject ("#name")}}
-\unexpanded\def\syst_structure_start_opt_product [#name]{\ctxcommand{startproduct ("#name")}}
-\unexpanded\def\syst_structure_start_opt_component [#name]{\ctxcommand{startcomponent ("#name")}}
-\unexpanded\def\syst_structure_start_opt_environment[#name]{\ctxcommand{startenvironment("#name")}}
+\unexpanded\def\syst_structure_start_opt_project [#name]{\clf_startproject {#name}}
+\unexpanded\def\syst_structure_start_opt_product [#name]{\clf_startproduct {#name}}
+\unexpanded\def\syst_structure_start_opt_component [#name]{\clf_startcomponent {#name}}
+\unexpanded\def\syst_structure_start_opt_environment[#name]{\clf_startenvironment{#name}}
\newconditional\endofinput % hack, needed because \endinput happens one level down in the input when we write from lua
@@ -170,34 +192,35 @@
\endinput
\fi}
-\unexpanded\def\stopproject {\ctxcommand{stopproject ()}\honorendofinput}
-\unexpanded\def\stopproduct {\ctxcommand{stopproduct ()}\honorendofinput}
-\unexpanded\def\stopcomponent {\ctxcommand{stopcomponent ()}\honorendofinput}
-\unexpanded\def\stopenvironment {\ctxcommand{stopenvironment()}\honorendofinput}
+\unexpanded\def\stopproject {\clf_stopproject \honorendofinput}
+\unexpanded\def\stopproduct {\clf_stopproduct \honorendofinput}
+\unexpanded\def\stopcomponent {\clf_stopcomponent \honorendofinput}
+\unexpanded\def\stopenvironment {\clf_stopenvironment\honorendofinput}
-\def\currentproject {\ctxcommand{currentproject ()}}
-\def\currentproduct {\ctxcommand{currentproduct ()}}
-\def\currentcomponent {\ctxcommand{currentcomponent ()}}
-\def\currentenvironment {\ctxcommand{currentenvironment()}}
-\def\processedfile {\ctxcommand{processedfile()}}
-\def\processedfiles {\ctxcommand{processedfiles()}}
+ \let\currentproject \clf_currentproject
+ \let\currentproduct \clf_currentproduct
+ \let\currentcomponent \clf_currentcomponent
+ \let\currentenvironment \clf_currentenvironment
+ \let\processedfile \clf_processedfile
+ \let\processedfiles \clf_processedfiles
-\unexpanded\def\dostarttextfile #name{\ctxcommand{dostarttextfile(name)}}
-\unexpanded\def\dostoptextfile {\ctxcommand{dostoptextfile()}}
+\unexpanded\def\dostarttextfile #name{\clf_dostarttextfile{name}}
+\unexpanded\def\dostoptextfile {\clf_dostoptextfile}
-\unexpanded\def\loadtexfile [#name]{\ctxcommand{usetexfile("#name")}}
-\unexpanded\def\loadluafile [#name]{\ctxcommand{useluafile("#name")}}
-\unexpanded\def\loadcldfile [#name]{\ctxcommand{usecldfile("#name")}}
-\unexpanded\def\loadanyfile [#name]{\ctxcommand{useanyfile("#name")}}
+\unexpanded\def\loadtexfile [#name]{\clf_usetexfile{#name}}
+\unexpanded\def\loadluafile [#name]{\clf_useluafile{#name}}
+\unexpanded\def\loadcldfile [#name]{\clf_usecldfile{#name}}
+\unexpanded\def\loadanyfile [#name]{\clf_useanyfile{#name}}
-\unexpanded\def\loadtexfileonce [#name]{\ctxcommand{usetexfile("#name",true)}}
-\unexpanded\def\loadluafileonce [#name]{\ctxcommand{useluafile("#name",true)}}
-\unexpanded\def\loadcldfileonce [#name]{\ctxcommand{usecldfile("#name",true)}}
-\unexpanded\def\loadanyfileonce [#name]{\ctxcommand{useanyfile("#name",true)}}
+\unexpanded\def\loadtexfileonce [#name]{\clf_usetexfileonce{#name}}
+\unexpanded\def\loadluafileonce [#name]{\clf_useluafileonce{#name}}
+\unexpanded\def\loadcldfileonce [#name]{\clf_usecldfileonce{#name}}
+\unexpanded\def\loadanyfileonce [#name]{\clf_useanyfileonce{#name}}
%D Handy for modules that have a test/demo appended (true added).
-\unexpanded\def\continueifinputfile#name{\ctxcommand{doifelsecontinuewithfile("#name",true)}\relax\endinput} % we cannot do \endinput via lua
+\unexpanded\def\continueifinputfile#name%
+ {\clf_doifelsecontinuewithfile{#name}\relax\endinput} % we cannot do \endinput via lua
% \startproject test
% 1: \startmode[*project] project \stopmode \endgraf
@@ -233,13 +256,13 @@
\newsystemmode\v!environment
\unexpanded\def\startprojectindeed
- {\starttext
+ {%starttext
\pushsystemmode\v!project
\setsystemmode\v!project}
\unexpanded\def\stopprojectindeed
{\popsystemmode\v!project
- \stoptext
+ %stoptext
\signalendofinput\v!project}
\unexpanded\def\startproductindeed
diff --git a/Master/texmf-dist/tex/context/base/file-lib.lua b/Master/texmf-dist/tex/context/base/file-lib.lua
index 3311321c521..361608ea3cf 100644
--- a/Master/texmf-dist/tex/context/base/file-lib.lua
+++ b/Master/texmf-dist/tex/context/base/file-lib.lua
@@ -9,10 +9,18 @@ if not modules then modules = { } end modules ['file-lib'] = {
-- todo: check all usage of truefilename at the tex end and remove
-- files there (and replace definitions by full names)
-local format = string.format
+local format, gsub = string.format, string.gsub
-local trace_files = false trackers.register("resolvers.readfile", function(v) trace_files = v end)
-local report_files = logs.reporter("files","readfile")
+local trace_libraries = false trackers.register("resolvers.libraries", function(v) trace_libraries = v end)
+----- trace_files = false trackers.register("resolvers.readfile", function(v) trace_files = v end)
+
+local report_library = logs.reporter("files","library")
+----- report_files = logs.reporter("files","readfile")
+
+local suffixonly = file.suffix
+local removesuffix = file.removesuffix
+
+local getreadfilename = resolvers.getreadfilename
local loaded = { }
local defaultpatterns = { "%s" }
@@ -25,7 +33,7 @@ local function defaultfailure(name)
report_files("asked name %a, not found",name)
end
-function commands.uselibrary(specification) -- todo; reporter
+function resolvers.uselibrary(specification) -- todo: reporter
local name = specification.name
if name and name ~= "" then
local patterns = specification.patterns or defaultpatterns
@@ -34,32 +42,49 @@ function commands.uselibrary(specification) -- todo; reporter
local onlyonce = specification.onlyonce
local files = utilities.parsers.settings_to_array(name)
local truename = environment.truefilename
- local done = false
+ local function found(filename)
+ local somename = truename and truename(filename) or filename
+ local foundname = getreadfilename("any",".",somename) -- maybe some day also an option not to backtrack .. and ../.. (or block global)
+ return foundname ~= "" and foundname
+ end
for i=1,#files do
local filename = files[i]
- if not loaded[filename] then
+ if loaded[filename] then
+ -- next one
+ else
if onlyonce then
loaded[filename] = true -- todo: base this on return value
end
- for i=1,#patterns do
- local somename = format(patterns[i],filename)
- if truename then
- somename = truename(somename)
+ local foundname = nil
+ local barename = removesuffix(filename)
+ -- direct search (we have an explicit suffix)
+ if barename ~= filename then
+ foundname = found(filename)
+ if trace_libraries then
+ report_library("checking %a: %s",filename,foundname or "not found")
end
- local foundname = resolvers.getreadfilename("any",".",somename) or ""
- if foundname ~= "" then
- action(name,foundname)
- done = true
- break
+ end
+ if not foundname then
+ -- pattern based search
+ for i=1,#patterns do
+ local wanted = format(patterns[i],barename)
+ foundname = found(wanted)
+ if trace_libraries then
+ report_library("checking %a as %a: %s",filename,wanted,foundname or "not found")
+ end
+ if foundname then
+ break
+ end
end
end
- if done then
- break
+ if foundname then
+ action(name,foundname)
+ elseif failure then
+ failure(name)
end
end
end
- if failure and not done then
- failure(name)
- end
end
end
+
+commands.uselibrary = resolvers.uselibrary -- for the moment
diff --git a/Master/texmf-dist/tex/context/base/file-mod.lua b/Master/texmf-dist/tex/context/base/file-mod.lua
index 2f34d9dd2a9..7f3763c5ded 100644
--- a/Master/texmf-dist/tex/context/base/file-mod.lua
+++ b/Master/texmf-dist/tex/context/base/file-mod.lua
@@ -18,25 +18,41 @@ if not modules then modules = { } end modules ['file-mod'] = {
at the <l n='tex'/> side.</p>
--ldx]]--
-local format, concat, tonumber = string.format, table.concat, tonumber
+local format, find, concat, tonumber = string.format, string.find, table.concat, tonumber
local trace_modules = false trackers .register("modules.loading", function(v) trace_modules = v end)
local permit_unprefixed = false directives.register("modules.permitunprefixed", function(v) permit_unprefixed = v end)
local report_modules = logs.reporter("resolvers","modules")
-commands = commands or { }
local commands = commands
-
local context = context
+local implement = interfaces.implement
local findbyscheme = resolvers.finders.byscheme -- use different one
local iterator = utilities.parsers.iterator
-- modules can have a specific suffix or can specify one
-local prefixes = { "m", "p", "s", "x", "v", "t" }
-local suffixes = { "mkvi", "mkiv", "tex", "cld", "lua" } -- order might change and how about cld
+local prefixes = {
+ "m", -- module, extends functionality
+ "p", -- private code
+ "s", -- styles
+ "x", -- xml specific modules
+ -- "v", -- an old internal one for examples
+ "t", -- third party extensions
+}
+
+-- the order might change and how about cld
+
+local suffixes = {
+ "mkvi", -- proprocessed mkiv files
+ "mkiv", -- mkiv files
+ "tex", -- normally source code files
+ "cld", -- context lua documents (often stand alone)
+ "lua", -- lua files
+}
+
local modstatus = { }
local function usemodule(name,hasscheme)
@@ -80,11 +96,11 @@ local function usemodule(name,hasscheme)
end
end
-function commands.usemodules(prefix,askedname,truename)
+function environment.usemodules(prefix,askedname,truename)
local truename = truename or environment.truefilename(askedname)
local hasprefix = prefix and prefix ~= ""
local hashname = ((hasprefix and prefix) or "*") .. "-" .. truename
- local status = modstatus[hashname]
+ local status = modstatus[hashname] or false -- yet unset
if status == 0 then
-- not found
elseif status == 1 then
@@ -118,9 +134,11 @@ function commands.usemodules(prefix,askedname,truename)
end
if status then
-- ok, don't change
- elseif not permit_unprefixed then
- -- forget about it
- elseif usemodule(truename) then
+ elseif find(truename,"%-") and usemodule(truename) then
+ -- assume a user namespace
+ report_modules("using user prefixed file %a",truename)
+ status = 1
+ elseif permit_unprefixed and usemodule(truename) then
report_modules("using unprefixed file %a",truename)
status = 1
else
@@ -165,23 +183,60 @@ end)
-- moved from syst-lua.lua:
-local splitter = lpeg.tsplitter(lpeg.S(". "),tonumber)
+local lpegmatch = lpeg.match
+local splitter = lpeg.tsplitter(lpeg.S(". "),tonumber)
-function commands.doifolderversionelse(one,two) -- one >= two
- if not two then
+function environment.comparedversion(one,two) -- one >= two
+ if not two or two == "" then
one, two = environment.version, one
elseif one == "" then
one = environment.version
end
- one = lpeg.match(splitter,one)
- two = lpeg.match(splitter,two)
+ one = lpegmatch(splitter,one)
+ two = lpegmatch(splitter,two)
one = (one[1] or 0) * 10000 + (one[2] or 0) * 100 + (one[3] or 0)
two = (two[1] or 0) * 10000 + (two[2] or 0) * 100 + (two[3] or 0)
- commands.doifelse(one>=two)
+ if one < two then
+ return -1
+ elseif one > two then
+ return 1
+ else
+ return 0
+ end
end
-function commands.useluamodule(list)
+environment.comparedversion = comparedversion
+
+
+function environment.useluamodule(list)
for filename in iterator(list) do
environment.loadluafile(filename)
end
end
+
+local strings = interfaces.strings
+
+implement {
+ name = "usemodules",
+ actions = environment.usemodules,
+ arguments = strings[2]
+}
+
+implement {
+ name = "doifelseolderversion",
+ actions = function(one,two) commands.doifelse(comparedversion(one,two) >= 0) end,
+ arguments = strings[2]
+}
+
+implement {
+ name = "useluamodule",
+ actions = environment.useluamodule,
+ arguments = "string"
+}
+
+implement {
+ name = "loadluamodule",
+ actions = function(name) dofile(resolvers.findctxfile(name)) end, -- hack
+ arguments = "string"
+}
+
diff --git a/Master/texmf-dist/tex/context/base/file-mod.mkvi b/Master/texmf-dist/tex/context/base/file-mod.mkvi
index 1591a69cc15..f043a68e875 100644
--- a/Master/texmf-dist/tex/context/base/file-mod.mkvi
+++ b/Master/texmf-dist/tex/context/base/file-mod.mkvi
@@ -37,39 +37,6 @@
\let\usemodule \usemodules
\let\usetexmodule\usemodules
-% \def\strc_modules_use[#category][#name][#parameters]%
-% {\pushmacro\currentmodule
-% \pushmacro\currentmoduleparameters
-% \let\currentmoduleparameters\empty
-% \ifthirdargument
-% \singleexpandafter\strc_modules_use_a
-% \else\ifsecondargument
-% \doubleexpandafter\strc_modules_use_b
-% \else
-% \doubleexpandafter\strc_modules_use_c
-% \fi\fi
-% % here we load
-% \popmacro\currentmoduleparameters
-% \popmacro\currentmodule}
-%
-% \def\strc_modules_use_a[#category][#name][#parameters]%
-% {\doifsomething{#name}
-% {\def\currentmoduleparameters{#parameters}%
-% \processcommalist[#name]{\strc_modules_use_indeed{#category}}}}
-%
-% \def\strc_modules_use_b[#category][#name][#parameters]%
-% {\doifsomething{#name}
-% {\doifassignmentelse{#name}
-% {\def\currentmoduleparameters{#name}%
-% \processcommalist[#category]{\strc_modules_use_indeed\empty}}
-% {\processcommalist[#name]{\strc_modules_use_indeed{#category}}}}}
-%
-% \def\strc_modules_use_c[#category][#name][#parameters]%
-% {\processcommalist[#category]{\strc_modules_use_indeed\empty}}
-%
-% \def\strc_modules_use_indeed#category#name%
-% {\ctxcommand{usemodules("#category","#name","\truefilename{#name}")}}
-
\def\strc_modules_use[#category][#name][#parameters]% category=t|m|x|p|...
{\pushmacro\currentmodule
\pushmacro\currentmodulecategory
@@ -79,7 +46,7 @@
\edef\currentmodule {#name}%
\def \currentmoduleparameters{#parameters}%
\else\ifsecondargument
- \doifassignmentelse{#name}
+ \doifelseassignment{#name}
{\let\currentmodulecategory \empty
\edef\currentmodule {#category}%
\edef\currentmoduleparameters{#name}}
@@ -96,8 +63,8 @@
\popmacro\currentmodulecategory
\popmacro\currentmodule}
-\def\strc_modules_use_indeed#category#name% truefilename moved to lua end
- {\ctxcommand{usemodules("#category","#name")}} % ,"\truefilename{#name}")}}
+\def\strc_modules_use_indeed#category#name%
+ {\clf_usemodules{#category}{#name}}
\installcorenamespace{module}
@@ -107,7 +74,7 @@
\newtoks\everysetupmodule
\unexpanded\def\startmodule
- {\doifnextoptionalcselse\syst_modules_start_yes\syst_modules_start_nop}
+ {\doifelsenextoptionalcs\syst_modules_start_yes\syst_modules_start_nop}
\def\syst_modules_start_yes[#name]%
{\pushmacro\currentmodule
@@ -157,8 +124,8 @@
\def\currentmoduleparameter{\moduleparameter\currentmodule} % no need for inlining
-\unexpanded\def\useluamodule [#name]{\ctxlua{dofile(resolvers.findctxfile("#name"))}}
-\unexpanded\def\luaenvironment #name {\ctxlua{dofile(resolvers.findctxfile("#name"))}}
+\unexpanded\def\useluamodule [#name]{\clf_loadluamodule{#1}} % why not use useluamodule
+\unexpanded\def\luaenvironment #name {\clf_loadluamodule{#1}}
% \usemodule[newmml]
% \usemodule[newmml][a=b]
@@ -238,10 +205,13 @@
%D
%D The version pattern is \type {yyyy.mm.dd} (with mm and dd being optional).
-\unexpanded\def\doifolderversionelse#parent#child{\ctxcommand{doifolderversionelse("#parent","#child")}}
-\unexpanded\def\doifoldercontextelse #child{\ctxcommand{doifolderversionelse("#child")}}
+\unexpanded\def\doifelseolderversion#parent#child{\clf_doifelseolderversion{#parent}{#child}}
+\unexpanded\def\doifelseoldercontext #child{\clf_doifelseolderversion{#child}{}}
+
+\let\doifolderversionelse\doifelseolderversion
+\let\doifoldercontextelse\doifelseoldercontext
-%D Relatively new:
+%D Relatively new (no need for a speedup here):
\unexpanded\def\syst_modules_direct_lua#1#2%
{\edef\m_module_command_command {#1}%
@@ -284,8 +254,8 @@
\ctxlua{#2(\!!bs#3\!!es,\!!bs#4\!!es)}%
\directsetup{module:#1:stop}}
-\def\installmodulecommandluaone #1#2{\unexpanded\def#1{\normalexpanded{\syst_modules_one_lua {\strippedcsname#1}{#2}}}}
-\def\installmodulecommandluatwo #1#2{\unexpanded\def#1{\normalexpanded{\syst_modules_two_lua {\strippedcsname#1}{#2}}}}
+\def\installmodulecommandluaone#1#2{\unexpanded\def#1{\normalexpanded{\syst_modules_one_lua{\strippedcsname#1}{#2}}}}
+\def\installmodulecommandluatwo#1#2{\unexpanded\def#1{\normalexpanded{\syst_modules_two_lua{\strippedcsname#1}{#2}}}}
% obsolete
%
@@ -299,6 +269,6 @@
% new:
-\unexpanded\def\useluamodule[#1]{\ctxcommand{useluamodule("#1")}}
+\unexpanded\def\useluamodule[#1]{\clf_useluamodule{#1}}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/file-res.lua b/Master/texmf-dist/tex/context/base/file-res.lua
index 9ae7a6b061b..08a3e22af8f 100644
--- a/Master/texmf-dist/tex/context/base/file-res.lua
+++ b/Master/texmf-dist/tex/context/base/file-res.lua
@@ -17,7 +17,10 @@ local report_files = logs.reporter("files","readfile")
resolvers.maxreadlevel = 2
-directives.register("resolvers.maxreadlevel", function(v) resolvers.maxreadlevel = tonumber(v) or resolvers.maxreadlevel end)
+directives.register("resolvers.maxreadlevel", function(v)
+ -- resolvers.maxreadlevel = (v == false and 0) or (v == true and 2) or tonumber(v) or 2
+ resolvers.maxreadlevel = v == false and 0 or tonumber(v) or 2
+end)
local finders, loaders, openers = resolvers.finders, resolvers.loaders, resolvers.openers
@@ -131,7 +134,7 @@ openers.fix = openers.file loaders.fix = loaders.file
openers.set = openers.file loaders.set = loaders.file
openers.any = openers.file loaders.any = loaders.file
-function getreadfilename(scheme,path,name) -- better do a split and then pass table
+local function getreadfilename(scheme,path,name) -- better do a split and then pass table
local fullname
if hasscheme(name) or is_qualified_path(name) then
fullname = name
@@ -146,16 +149,24 @@ end
resolvers.getreadfilename = getreadfilename
-function commands.getreadfilename(scheme,path,name)
- context(getreadfilename(scheme,path,name))
-end
-
-- a name belonging to the run but also honoring qualified
-function commands.locfilename(name)
- context(getreadfilename("loc",".",name))
-end
+local implement = interfaces.implement
-function commands.doiflocfileelse(name)
- commands.doifelse(isfile(getreadfilename("loc",".",name)))
-end
+implement {
+ name = "getreadfilename",
+ actions = { getreadfilename, context },
+ arguments = { "string", "string", "string" }
+}
+
+implement {
+ name = "locfilename",
+ actions = { getreadfilename, context },
+ arguments = { "'loc'","'.'", "string" },
+}
+
+implement {
+ name = "doifelselocfile",
+ actions = { getreadfilename, isfile, commands.doifelse },
+ arguments = { "'loc'","'.'", "string" },
+}
diff --git a/Master/texmf-dist/tex/context/base/file-res.mkvi b/Master/texmf-dist/tex/context/base/file-res.mkvi
index 5162e63bee3..17f4cf44c5c 100644
--- a/Master/texmf-dist/tex/context/base/file-res.mkvi
+++ b/Master/texmf-dist/tex/context/base/file-res.mkvi
@@ -70,7 +70,7 @@
\let\readfilename\empty
\def\syst_files_read_file#protocol#path#name% #true #false
- {\edef\readfilename{\ctxcommand{getreadfilename("#protocol","#path","#name")}}%
+ {\edef\readfilename{\clf_getreadfilename{#protocol}{#path}{#name}}%
\ifx\readfilename\empty
\expandafter\secondoftwoarguments
\else
@@ -145,7 +145,9 @@
%D \doiflocfileelse {filename} {before loading} {not found}
%D \stoptyping
-\unexpanded\def\doiflocfileelse#name{\ctxcommand{doiflocfileelse([[#name]])}}
- \def\locfilename #name{\ctxcommand{locfilename([[#name]])}}
+\unexpanded\def\doifelselocfile#name{\clf_doifelselocfile{#name}}
+ \def\locfilename #name{\clf_locfilename {#name}}
+
+\let\doiflocfileelse\doifelselocfile
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/file-syn.lua b/Master/texmf-dist/tex/context/base/file-syn.lua
index c1f9a5f4817..b6ad27c8325 100644
--- a/Master/texmf-dist/tex/context/base/file-syn.lua
+++ b/Master/texmf-dist/tex/context/base/file-syn.lua
@@ -6,13 +6,16 @@ if not modules then modules = { } end modules ['file-syn'] = {
license = "see context related readme files"
}
-local report_files = logs.reporter("files")
environment.filesynonyms = environment.filesynonyms or { }
local filesynonyms = environment.filesynonyms
-local settings_to_array = utilities.parsers.settings_to_array
-local findfile = resolvers.findfile
+local settings_to_array = utilities.parsers.settings_to_array
+local findfile = resolvers.findfile
+
+local implement = interfaces.implement
+
+local report_files = logs.reporter("files")
storage.register("environment/filesynonyms", filesynonyms, "environment.filesynonyms")
@@ -27,11 +30,7 @@ end
environment.truefilename = truefilename
-function commands.truefilename(name)
- context(truefilename(name))
-end
-
-function commands.definefilesynonym(name,realname)
+function environment.definefilesynonym(name,realname)
local names = settings_to_array(name)
for i=1,#names do
local name = names[i]
@@ -43,7 +42,7 @@ function commands.definefilesynonym(name,realname)
end
end
-function commands.definefilefallback(name,alternatives)
+function environment.definefilefallback(name,alternatives)
local names = settings_to_array(alternatives)
for i=1,#names do
local realname = findfile(names[i])
@@ -53,3 +52,21 @@ function commands.definefilefallback(name,alternatives)
end
end
end
+
+implement {
+ name = "truefilename",
+ actions = { truefilename, context },
+ arguments = "string"
+}
+
+implement {
+ name = "definefilesynonym",
+ actions = environment.definefilesynonym,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "definefilefallback",
+ actions = environment,definefilefallback,
+ arguments = { "string", "string" }
+}
diff --git a/Master/texmf-dist/tex/context/base/file-syn.mkvi b/Master/texmf-dist/tex/context/base/file-syn.mkvi
index b61bd8ae4d8..52ecd0d71e3 100644
--- a/Master/texmf-dist/tex/context/base/file-syn.mkvi
+++ b/Master/texmf-dist/tex/context/base/file-syn.mkvi
@@ -46,8 +46,8 @@
\unexpanded\def\definefilesynonym {\dodoubleempty \syst_files_define_synonym }
\unexpanded\def\definefilefallback{\dodoubleargument\syst_files_define_fallback} % still used?
-\def\syst_files_define_synonym [#name][#realname]{\ctxcommand{definefilesynonym ("#name","#realname")}}
-\def\syst_files_define_fallback[#name][#alternatives]{\ctxcommand{definefilefallback("#name","#alternatives")}}
+\def\syst_files_define_synonym [#name][#realname]{\clf_definefilesynonym {#name}{#realname}}
+\def\syst_files_define_fallback[#name][#alternatives]{\clf_definefilefallback{#name}{#alternatives}}
%D \macros
%D {truefilename}
@@ -61,6 +61,6 @@
%D
%D The implementation shows that nesting is supported.
-\def\truefilename#1{\ctxcommand{truefilename("#1")}}
+\def\truefilename#1{\clf_truefilename{#1}}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/font-afm.lua b/Master/texmf-dist/tex/context/base/font-afm.lua
index 46ea8a42323..a96c6686e30 100644
--- a/Master/texmf-dist/tex/context/base/font-afm.lua
+++ b/Master/texmf-dist/tex/context/base/font-afm.lua
@@ -40,19 +40,26 @@ local trace_defining = false trackers.register("fonts.defining", function(v
local report_afm = logs.reporter("fonts","afm loading")
+local setmetatableindex = table.setmetatableindex
+
local findbinfile = resolvers.findbinfile
local definers = fonts.definers
local readers = fonts.readers
local constructors = fonts.constructors
+local fontloader = fontloader
+local font_to_table = fontloader.to_table
+local open_font = fontloader.open
+local close_font = fontloader.close
+
local afm = constructors.newhandler("afm")
local pfb = constructors.newhandler("pfb")
local afmfeatures = constructors.newfeatures("afm")
local registerafmfeature = afmfeatures.register
-afm.version = 1.410 -- incrementing this number one up will force a re-cache
+afm.version = 1.500 -- incrementing this number one up will force a re-cache
afm.cache = containers.define("fonts", "afm", afm.version, true)
afm.autoprefixed = true -- this will become false some day (catches texnansi-blabla.*)
@@ -62,6 +69,8 @@ afm.addligatures = true -- best leave this set to true
afm.addtexligatures = true -- best leave this set to true
afm.addkerns = true -- best leave this set to true
+local overloads = fonts.mappings.overloads
+
local applyruntimefixes = fonts.treatments and fonts.treatments.applyfixes
local function setmode(tfmdata,value)
@@ -218,10 +227,10 @@ end
local function get_indexes(data,pfbname)
data.resources.filename = resolvers.unresolve(pfbname) -- no shortcut
- local pfbblob = fontloader.open(pfbname)
+ local pfbblob = open_font(pfbname)
if pfbblob then
local characters = data.characters
- local pfbdata = fontloader.to_table(pfbblob)
+ local pfbdata = font_to_table(pfbblob)
if pfbdata then
local glyphs = pfbdata.glyphs
if glyphs then
@@ -247,7 +256,7 @@ local function get_indexes(data,pfbname)
elseif trace_loading then
report_afm("no data in pfb file %a",pfbname)
end
- fontloader.close(pfbblob)
+ close_font(pfbblob)
elseif trace_loading then
report_afm("invalid pfb file %a",pfbname)
end
@@ -315,7 +324,7 @@ by adding ligatures and kern information to the afm derived data. That
way we can set them faster when defining a font.</p>
--ldx]]--
-local addkerns, addligatures, addtexligatures, unify, normalize -- we will implement these later
+local addkerns, addligatures, addtexligatures, unify, normalize, fixnames -- we will implement these later
function afm.load(filename)
-- hm, for some reasons not resolved yet
@@ -362,6 +371,7 @@ function afm.load(filename)
addkerns(data)
end
normalize(data)
+ fixnames(data)
report_afm("add tounicode data")
fonts.mappings.addtounicode(data,filename)
data.size = size
@@ -369,6 +379,7 @@ function afm.load(filename)
data.pfbsize = pfbsize
data.pfbtime = pfbtime
report_afm("saving %a in cache",name)
+ data.resources.unicodes = nil -- consistent with otf but here we save not much
data = containers.write(afm.cache, name, data)
data = containers.read(afm.cache,name)
end
@@ -432,13 +443,29 @@ unify = function(data, filename)
resources.filename = resolvers.unresolve(filename) -- no shortcut
resources.unicodes = unicodes -- name to unicode
resources.marks = { } -- todo
- resources.names = names -- name to index
+ -- resources.names = names -- name to index
resources.private = private
end
normalize = function(data)
end
+fixnames = function(data)
+ for k, v in next, data.descriptions do
+ local n = v.name
+ local r = overloads[n]
+ if r then
+ local name = r.name
+ if trace_indexing then
+ report_afm("renaming characters %a to %a",n,name)
+ end
+ v.name = name
+ v.unicode = r.unicode
+ end
+ end
+end
+
+
--[[ldx--
<p>These helpers extend the basic table with extra ligatures, texligatures
and extra kerns. This saves quite some lookups later.</p>
@@ -449,7 +476,7 @@ local addthem = function(rawdata,ligatures)
local descriptions = rawdata.descriptions
local resources = rawdata.resources
local unicodes = resources.unicodes
- local names = resources.names
+ -- local names = resources.names
for ligname, ligdata in next, ligatures do
local one = descriptions[unicodes[ligname]]
if one then
@@ -608,8 +635,8 @@ local function copytotfm(data)
local filename = constructors.checkedfilename(resources)
local fontname = metadata.fontname or metadata.fullname
local fullname = metadata.fullname or metadata.fontname
- local endash = unicodes['space']
- local emdash = unicodes['emdash']
+ local endash = 0x0020 -- space
+ local emdash = 0x2014
local spacer = "space"
local spaceunits = 500
--
@@ -669,7 +696,7 @@ local function copytotfm(data)
parameters.x_height = charxheight
else
-- same as otf
- local x = unicodes['x']
+ local x = 0x0078 -- x
if x then
local x = descriptions[x]
if x then
@@ -729,7 +756,34 @@ function afm.setfeatures(tfmdata,features)
end
end
-local function checkfeatures(specification)
+local function addtables(data)
+ local resources = data.resources
+ local lookuptags = resources.lookuptags
+ local unicodes = resources.unicodes
+ if not lookuptags then
+ lookuptags = { }
+ resources.lookuptags = lookuptags
+ end
+ setmetatableindex(lookuptags,function(t,k)
+ local v = type(k) == "number" and ("lookup " .. k) or k
+ t[k] = v
+ return v
+ end)
+ if not unicodes then
+ unicodes = { }
+ resources.unicodes = unicodes
+ setmetatableindex(unicodes,function(t,k)
+ setmetatableindex(unicodes,nil)
+ for u, d in next, data.descriptions do
+ local n = d.name
+ if n then
+ t[n] = u
+ end
+ end
+ return rawget(t,k)
+ end)
+ end
+ constructors.addcoreunicodes(unicodes) -- do we really need this?
end
local function afmtotfm(specification)
@@ -759,6 +813,7 @@ local function afmtotfm(specification)
if not tfmdata then
local rawdata = afm.load(afmname)
if rawdata and next(rawdata) then
+ addtables(rawdata)
adddimensions(rawdata)
tfmdata = copytotfm(rawdata)
if tfmdata and next(tfmdata) then
@@ -808,6 +863,7 @@ those that make sense for this format.</p>
local function prepareligatures(tfmdata,ligatures,value)
if value then
local descriptions = tfmdata.descriptions
+ local hasligatures = false
for unicode, character in next, tfmdata.characters do
local description = descriptions[unicode]
local dligatures = description.ligatures
@@ -823,17 +879,20 @@ local function prepareligatures(tfmdata,ligatures,value)
type = 0
}
end
+ hasligatures = true
end
end
+ tfmdata.properties.hasligatures = hasligatures
end
end
local function preparekerns(tfmdata,kerns,value)
if value then
- local rawdata = tfmdata.shared.rawdata
- local resources = rawdata.resources
- local unicodes = resources.unicodes
+ local rawdata = tfmdata.shared.rawdata
+ local resources = rawdata.resources
+ local unicodes = resources.unicodes
local descriptions = tfmdata.descriptions
+ local haskerns = false
for u, chr in next, tfmdata.characters do
local d = descriptions[u]
local newkerns = d[kerns]
@@ -849,8 +908,10 @@ local function preparekerns(tfmdata,kerns,value)
kerns[uk] = v
end
end
+ haskerns = true
end
end
+ tfmdata.properties.haskerns = haskerns
end
end
diff --git a/Master/texmf-dist/tex/context/base/font-agl.lua b/Master/texmf-dist/tex/context/base/font-agl.lua
index 5ee34b0287c..122d1adc2d1 100644
--- a/Master/texmf-dist/tex/context/base/font-agl.lua
+++ b/Master/texmf-dist/tex/context/base/font-agl.lua
@@ -656,12 +656,18 @@ end
-- We load this table only when needed. We could use a loading mechanism
-- return the table but there are no more vectors like this so why bother.
+--
+-- Well, we currently hav ethis table preloaded anyway.
-fonts.encodings = fonts.encodings or { }
-
-fonts.encodings.agl = {
+local agl = {
names = names, -- unicode -> name
unicodes = unicodes, -- name -> unicode
synonyms = synonyms, -- merged into the other two
extras = extras, -- merged into the other two
}
+
+fonts = fonts or { }
+fonts.encodings = fonts.encodings or { }
+fonts.encodings.agl = agl
+
+return agl
diff --git a/Master/texmf-dist/tex/context/base/font-chk.lua b/Master/texmf-dist/tex/context/base/font-chk.lua
index 591d59d6558..41205ce5ed7 100644
--- a/Master/texmf-dist/tex/context/base/font-chk.lua
+++ b/Master/texmf-dist/tex/context/base/font-chk.lua
@@ -17,6 +17,8 @@ local fastcopy = table.fastcopy
local report_fonts = logs.reporter("fonts","checking")
+local allocate = utilities.storage.allocate
+
local fonts = fonts
fonts.checkers = fonts.checkers or { }
@@ -44,6 +46,8 @@ local tasks = nodes.tasks
local enableaction = tasks.enableaction
local disableaction = tasks.disableaction
+local implement = interfaces.implement
+
local glyph_code = nodes.nodecodes.glyph
local nuts = nodes.nuts
@@ -88,7 +92,7 @@ end
fonts.loggers.onetimemessage = onetimemessage
-local mapping = { -- this is just an experiment to illustrate some principles elsewhere
+local mapping = allocate { -- this is just an experiment to illustrate some principles elsewhere
lu = "placeholder uppercase red",
ll = "placeholder lowercase red",
lt = "placeholder uppercase red",
@@ -113,9 +117,15 @@ local mapping = { -- this is just an experiment to illustrate some principles el
so = "placeholder lowercase yellow",
}
-table.setmetatableindex(mapping,function(t,k) v = "placeholder unknown gray" t[k] = v return v end)
+table.setmetatableindex(mapping,
+ function(t,k)
+ v = "placeholder unknown gray"
+ t[k] = v
+ return v
+ end
+)
-local fakes = {
+local fakes = allocate {
{
name = "lowercase",
code = ".025 -.175 m .425 -.175 l .425 .525 l .025 .525 l .025 -.175 l .025 0 l .425 0 l .025 -.175 m h S",
@@ -153,7 +163,7 @@ local fakes = {
},
}
-local variants = {
+local variants = allocate {
{ tag = "gray", r = .6, g = .6, b = .6 },
{ tag = "red", r = .6, g = 0, b = 0 },
{ tag = "green", r = 0, g = .6, b = 0 },
@@ -216,6 +226,28 @@ function commands.getplaceholderchar(name)
context(helpers.getprivatenode(fontdata[id],name))
end
+local function placeholder(font,char)
+ local tfmdata = fontdata[font]
+ local properties = tfmdata.properties
+ local privates = properties.privates
+ local category = chardata[char].category
+ local fakechar = mapping[category]
+ local p = privates and privates[fakechar]
+ if not p then
+ addmissingsymbols(tfmdata)
+ p = properties.privates[fakechar]
+ end
+ if properties.lateprivates then
+ -- frozen already
+ return "node", getprivatenode(tfmdata,fakechar)
+ else
+ -- good, we have \definefontfeature[default][default][missing=yes]
+ return "char", p
+ end
+end
+
+checkers.placeholder = placeholder
+
function checkers.missing(head)
local lastfont, characters, found = nil, nil, nil
head = tonut(head)
@@ -249,27 +281,15 @@ function checkers.missing(head)
end
elseif action == "replace" then
for i=1,#found do
- local n = found[i]
- local font = getfont(n)
- local char = getchar(n)
- local tfmdata = fontdata[font]
- local properties = tfmdata.properties
- local privates = properties.privates
- local category = chardata[char].category
- local fakechar = mapping[category]
- local p = privates and privates[fakechar]
- if not p then
- addmissingsymbols(tfmdata)
- p = properties.privates[fakechar]
- end
- if properties.lateprivates then -- .frozen
- -- bad, we don't have them at the tex end
- local fake = getprivatenode(tfmdata,fakechar)
- insert_node_after(head,n,fake)
- head = remove_node(head,n,true)
+ local node = found[i]
+ local kind, char = placeholder(getfont(node),getchar(node))
+ if kind == "node" then
+ insert_node_after(head,node,tonut(char))
+ head = remove_node(head,node,true)
+ elseif kind == "char" then
+ setfield(node,"char",char)
else
- -- good, we have \definefontfeature[default][default][missing=yes]
- setfield(n,"char",p)
+ -- error
end
end
else
@@ -278,13 +298,17 @@ function checkers.missing(head)
return tonode(head), false
end
-local relevant = { "missing (will be deleted)", "missing (will be flagged)", "missing" }
+local relevant = {
+ "missing (will be deleted)",
+ "missing (will be flagged)",
+ "missing"
+}
-function checkers.getmissing(id)
+local function getmissing(id)
if id then
- local list = checkers.getmissing(font.current())
+ local list = getmissing(font.current())
if list then
- local _, list = next(checkers.getmissing(font.current()))
+ local _, list = next(getmissing(font.current()))
return list
else
return { }
@@ -314,6 +338,8 @@ function checkers.getmissing(id)
end
end
+checkers.getmissing = getmissing
+
local tracked = false
trackers.register("fonts.missing", function(v)
@@ -329,24 +355,6 @@ trackers.register("fonts.missing", function(v)
action = v
end)
-function commands.checkcharactersinfont()
- enableaction("processors","fonts.checkers.missing")
- tracked = true
-end
-
-function commands.removemissingcharacters()
- enableaction("processors","fonts.checkers.missing")
- action = "remove"
- tracked = true
-end
-
-function commands.replacemissingcharacters()
- enableaction("processors","fonts.checkers.missing")
- action = "replace"
- otffeatures.defaults.missing = true
- tracked = true
-end
-
local report_characters = logs.reporter("fonts","characters")
local report_character = logs.reporter("missing")
diff --git a/Master/texmf-dist/tex/context/base/font-chk.mkiv b/Master/texmf-dist/tex/context/base/font-chk.mkiv
index 4572041c28e..4c8967532e8 100644
--- a/Master/texmf-dist/tex/context/base/font-chk.mkiv
+++ b/Master/texmf-dist/tex/context/base/font-chk.mkiv
@@ -21,11 +21,9 @@
%
% \definefontfeature[default][default][missing=yes]
% \enabletrackers[fonts.missing=replace]
-%
-% or better:
-\unexpanded\def\checkcharactersinfont {\ctxcommand{checkcharactersinfont()}}
-\unexpanded\def\removemissingcharacters {\ctxcommand{removemissingcharacters()}}
-\unexpanded\def\replacemissingcharacters{\ctxcommand{replacemissingcharacters()}}
+\unexpanded\def\checkcharactersinfont {\enabletrackers[fonts.missing]}
+\unexpanded\def\removemissingcharacters {\enabletrackers[fonts.missing=remove]}
+\unexpanded\def\replacemissingcharacters{\enabletrackers[fonts.missing=replace]}
\endinput
diff --git a/Master/texmf-dist/tex/context/base/font-cid.lua b/Master/texmf-dist/tex/context/base/font-cid.lua
index e4b565313b4..0eaacdfbd54 100644
--- a/Master/texmf-dist/tex/context/base/font-cid.lua
+++ b/Master/texmf-dist/tex/context/base/font-cid.lua
@@ -74,7 +74,7 @@ local function loadcidfile(filename)
ordering = ordering,
filename = filename,
unicodes = unicodes,
- names = names
+ names = names,
}
end
end
@@ -112,15 +112,28 @@ function cid.getmap(specification)
report_otf("invalid cidinfo specification, table expected")
return
end
- local registry = specification.registry
- local ordering = specification.ordering
+ local registry = specification.registry
+ local ordering = specification.ordering
local supplement = specification.supplement
- -- check for already loaded file
- local filename = format(registry,ordering,supplement)
- local found = cidmap[lower(filename)]
+ local filename = format(registry,ordering,supplement)
+ local lowername = lower(filename)
+ local found = cidmap[lowername]
if found then
return found
end
+ if ordering == "Identity" then
+ local found = {
+ supplement = supplement,
+ registry = registry,
+ ordering = ordering,
+ filename = filename,
+ unicodes = { },
+ names = { },
+ }
+ cidmap[lowername] = found
+ return found
+ end
+ -- check for already loaded file
if trace_loading then
report_otf("cidmap needed, registry %a, ordering %a, supplement %a",registry,ordering,supplement)
end
diff --git a/Master/texmf-dist/tex/context/base/font-col.lua b/Master/texmf-dist/tex/context/base/font-col.lua
index 187e33311ee..997c57c9f92 100644
--- a/Master/texmf-dist/tex/context/base/font-col.lua
+++ b/Master/texmf-dist/tex/context/base/font-col.lua
@@ -45,6 +45,8 @@ local currentfont = font.current
local fontpatternhassize = fonts.helpers.fontpatternhassize
+local implement = interfaces.implement
+
local list = { }
local current = 0
local enabled = false
@@ -275,9 +277,38 @@ end
-- interface
-commands.fontcollectiondefine = collections.define
-commands.fontcollectionreset = collections.reset
-commands.fontcollectionprepare = collections.prepare
-commands.fontcollectionreport = collections.report
-commands.fontcollectionregister = collections.registermain
-commands.fontcollectionclone = collections.clonevector
+implement {
+ name = "fontcollectiondefine",
+ actions = collections.define,
+ arguments = { "string", "string", "string", "string" }
+}
+
+implement {
+ name = "fontcollectionreset",
+ actions = collections.reset,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "fontcollectionprepare",
+ actions = collections.prepare,
+ arguments = "string"
+}
+
+implement {
+ name = "fontcollectionreport",
+ actions = collections.report,
+ arguments = "string"
+}
+
+implement {
+ name = "fontcollectionregister",
+ actions = collections.registermain,
+ arguments = "string"
+}
+
+implement {
+ name = "fontcollectionclone",
+ actions = collections.clonevector,
+ arguments = "string"
+}
diff --git a/Master/texmf-dist/tex/context/base/font-col.mkvi b/Master/texmf-dist/tex/context/base/font-col.mkvi
index 34a1b04a808..bc8e8151ed1 100644
--- a/Master/texmf-dist/tex/context/base/font-col.mkvi
+++ b/Master/texmf-dist/tex/context/base/font-col.mkvi
@@ -34,13 +34,13 @@
\unexpanded\def\resetfontfallback {\dodoubleempty \font_fallbacks_reset }
\def\font_fallbacks_define[#name][#font][#ranges][#settings]%
- {\ctxcommand{fontcollectiondefine("#name","#font",\!!bs#ranges\!!es,\!!bs#settings\!!es)}}
+ {\clf_fontcollectiondefine{#name}{#font}{#ranges}{#settings}}
\def\font_fallbacks_reset[#name][#font]%
- {\ctxcommand{fontcollectionreset("#name","#font")}}
+ {\clf_fontcollectionreset{#name}{#font}}
\def\font_fallbacks_prepare#name%
- {\ctxcommand{fontcollectionprepare("#name")}} % add fallbacks to last font
+ {\clf_fontcollectionprepare{#name}} % add fallbacks to last font
% we might as well move the handling to lua but then we need to pass the
% fallbacks, skewchar etc.
@@ -77,7 +77,7 @@
{\endgroup}
\def\font_fallbacks_clone_unique#specification#scale% kind of dododefinefont
- {\ctxcommand{fontcollectionreport("defining #specification (relative scale: #scale)")}% brrr
+ {\clf_fontcollectionreport{defining #specification (relative scale: #scale)}% brrr
\setfalse\c_font_auto_size
\let\lastfontidentifier\s!dummy
\def\v_font_size_relative{#scale}%
@@ -89,8 +89,8 @@
\def\font_fallbacks_clone_inherited#font% also a second argument
{\font_fallbacks_clone_unique{#font \savedfontspec}}
-\def\font_fallbacks_register_main #name{\ctxcommand{fontcollectionregister("#name")}}
-\def\font_fallbacks_prepare_clone_vectors#name{\ctxcommand{fontcollectionclone("#name")}}
+\def\font_fallbacks_register_main #name{\clf_fontcollectionregister{#name}}
+\def\font_fallbacks_prepare_clone_vectors#name{\clf_fontcollectionclone{#name}}
% check : only replace when present in replacement font (default: no)
% force : force replacent even when basefont has glyph (default: yes)
diff --git a/Master/texmf-dist/tex/context/base/font-con.lua b/Master/texmf-dist/tex/context/base/font-con.lua
index aca7055235e..72fbb5c0dcc 100644
--- a/Master/texmf-dist/tex/context/base/font-con.lua
+++ b/Master/texmf-dist/tex/context/base/font-con.lua
@@ -45,6 +45,8 @@ constructors.cache = containers.define("fonts", "constructors", constr
constructors.privateoffset = 0xF0000 -- 0x10FFFF
+constructors.cacheintex = true -- so we see the original table in fonts.font
+
-- Some experimental helpers (handy for tracing):
--
-- todo: extra:
@@ -394,7 +396,8 @@ function constructors.scale(tfmdata,specification)
targetparameters.forcedsize = forcedsize -- context specific
targetparameters.extrafactor = extrafactor -- context specific
--
- local tounicode = resources.tounicode
+ local tounicode = fonts.mappings.tounicode
+ --
local defaultwidth = resources.defaultwidth or 0
local defaultheight = resources.defaultheight or 0
local defaultdepth = resources.defaultdepth or 0
@@ -436,6 +439,7 @@ function constructors.scale(tfmdata,specification)
target.tounicode = 1
target.cidinfo = properties.cidinfo
target.format = properties.format
+ target.cache = constructors.cacheintex and "yes" or "renew"
--
local fontname = properties.fontname or tfmdata.fontname -- for the moment we fall back on
local fullname = properties.fullname or tfmdata.fullname -- names in the tfmdata although
@@ -453,6 +457,7 @@ function constructors.scale(tfmdata,specification)
target.psname = psname
target.name = name
--
+ --
properties.fontname = fontname
properties.fullname = fullname
properties.filename = filename
@@ -500,7 +505,9 @@ function constructors.scale(tfmdata,specification)
local autoitalicamount = properties.autoitalicamount
local stackmath = not properties.nostackmath
local nonames = properties.noglyphnames
- local nodemode = properties.mode == "node"
+ local haskerns = properties.haskerns or properties.mode == "base" -- we can have afm in node mode
+ local hasligatures = properties.hasligatures or properties.mode == "base" -- we can have afm in node mode
+ local realdimensions = properties.realdimensions
--
if changed and not next(changed) then
changed = false
@@ -594,43 +601,45 @@ function constructors.scale(tfmdata,specification)
-- we can have a dumb mode (basemode without math etc) that skips most
--
for unicode, character in next, characters do
- local chr, description, index, touni
+ local chr, description, index
if changed then
- -- basemode hack (we try to catch missing tounicodes, e.g. needed for ssty in math cambria)
local c = changed[unicode]
if c then
- local ligatures = character.ligatures -- the original ligatures (as we cannot rely on remapping)
description = descriptions[c] or descriptions[unicode] or character
character = characters[c] or character
index = description.index or c
- if tounicode then
- touni = tounicode[index] -- nb: index!
- if not touni then -- goodie
- local d = descriptions[unicode] or characters[unicode]
- local i = d.index or unicode
- touni = tounicode[i] -- nb: index!
- end
- end
- if ligatures and not character.ligatures then
- character.ligatures = ligatures -- the original targets (for now at least.. see libertine smallcaps)
- end
else
description = descriptions[unicode] or character
index = description.index or unicode
- if tounicode then
- touni = tounicode[index] -- nb: index!
- end
end
else
description = descriptions[unicode] or character
index = description.index or unicode
- if tounicode then
- touni = tounicode[index] -- nb: index!
- end
end
local width = description.width
local height = description.height
local depth = description.depth
+ if realdimensions then
+ -- this is mostly for checking issues
+ if not height or height == 0 then
+ local bb = description.boundingbox
+ local ht = bb[4]
+ if ht ~= 0 then
+ height = ht
+ end
+ if not depth or depth == 0 then
+ local dp = -bb[2]
+ if dp ~= 0 then
+ depth = dp
+ end
+ end
+ elseif not depth or depth == 0 then
+ local dp = -description.boundingbox[2]
+ if dp ~= 0 then
+ depth = dp
+ end
+ end
+ end
if width then width = hdelta*width else width = scaledwidth end
if height then height = vdelta*height else height = scaledheight end
-- if depth then depth = vdelta*depth else depth = scaleddepth end
@@ -669,8 +678,10 @@ function constructors.scale(tfmdata,specification)
}
end
end
- if touni then
- chr.tounicode = touni
+ local isunicode = description.unicode
+ if isunicode then
+ chr.unicode = isunicode
+ chr.tounicode = tounicode(isunicode)
end
if hasquality then
-- we could move these calculations elsewhere (saves calculations)
@@ -767,7 +778,7 @@ function constructors.scale(tfmdata,specification)
end
end
end
- if not nodemode then
+ if haskerns then
local vk = character.kerns
if vk then
local s = sharedkerns[vk]
@@ -778,6 +789,8 @@ function constructors.scale(tfmdata,specification)
end
chr.kerns = s
end
+ end
+ if hasligatures then
local vl = character.ligatures
if vl then
if true then
@@ -965,6 +978,8 @@ function constructors.finalize(tfmdata)
tfmdata.slant = nil
tfmdata.units_per_em = nil
--
+ tfmdata.cache = nil
+ --
properties.finalized = true
--
return tfmdata
@@ -1362,3 +1377,50 @@ function constructors.applymanipulators(what,tfmdata,features,trace,report)
end
end
end
+
+function constructors.addcoreunicodes(unicodes) -- maybe make this a metatable if used at all
+ if not unicodes then
+ unicodes = { }
+ end
+ unicodes.space = 0x0020
+ unicodes.hyphen = 0x002D
+ unicodes.zwj = 0x200D
+ unicodes.zwnj = 0x200C
+ return unicodes
+end
+
+-- -- keep for a while: old tounicode code
+--
+-- if changed then
+-- -- basemode hack (we try to catch missing tounicodes, e.g. needed for ssty in math cambria)
+-- local c = changed[unicode]
+-- if c then
+-- -- local ligatures = character.ligatures -- the original ligatures (as we cannot rely on remapping)
+-- description = descriptions[c] or descriptions[unicode] or character
+-- character = characters[c] or character
+-- index = description.index or c
+-- if tounicode then
+-- touni = tounicode[index] -- nb: index!
+-- if not touni then -- goodie
+-- local d = descriptions[unicode] or characters[unicode]
+-- local i = d.index or unicode
+-- touni = tounicode[i] -- nb: index!
+-- end
+-- end
+-- -- if ligatures and not character.ligatures then
+-- -- character.ligatures = ligatures -- the original targets (for now at least.. see libertine smallcaps)
+-- -- end
+-- else
+-- description = descriptions[unicode] or character
+-- index = description.index or unicode
+-- if tounicode then
+-- touni = tounicode[index] -- nb: index!
+-- end
+-- end
+-- else
+-- description = descriptions[unicode] or character
+-- index = description.index or unicode
+-- if tounicode then
+-- touni = tounicode[index] -- nb: index!
+-- end
+-- end
diff --git a/Master/texmf-dist/tex/context/base/font-ctx.lua b/Master/texmf-dist/tex/context/base/font-ctx.lua
index 2bfcf38598a..2c96e9ac2be 100644
--- a/Master/texmf-dist/tex/context/base/font-ctx.lua
+++ b/Master/texmf-dist/tex/context/base/font-ctx.lua
@@ -21,6 +21,7 @@ local settings_to_hash, hash_to_string = utilities.parsers.settings_to_hash, uti
local formatcolumns = utilities.formatters.formatcolumns
local mergehashes = utilities.parsers.mergehashes
local formatters = string.formatters
+local basename = file.basename
local tostring, next, type, rawget, tonumber = tostring, next, type, rawget, tonumber
local utfchar, utfbyte = utf.char, utf.byte
@@ -44,6 +45,8 @@ local report_mapfiles = logs.reporter("fonts","mapfiles")
local setmetatableindex = table.setmetatableindex
+local implement = interfaces.implement
+
local fonts = fonts
local handlers = fonts.handlers
local otf = handlers.otf -- brrr
@@ -57,6 +60,10 @@ local helpers = fonts.helpers
local hashes = fonts.hashes
local currentfont = font.current
+local encodings = fonts.encodings
+----- aglunicodes = encodings.agl.unicodes
+local aglunicodes = nil -- delayed loading
+
local nuts = nodes.nuts
local tonut = nuts.tonut
@@ -78,18 +85,22 @@ local texdefinefont = tex.definefont
local texsp = tex.sp
local fontdata = hashes.identifiers
-local characters = hashes.chardata
+local characters = hashes.characters
local descriptions = hashes.descriptions
local properties = hashes.properties
local resources = hashes.resources
+local unicodes = hashes.unicodes
local csnames = hashes.csnames
-local marks = hashes.markdata
local lastmathids = hashes.lastmathids
local exheights = hashes.exheights
local emwidths = hashes.emwidths
+local parameters = hashes.parameters
local designsizefilename = fontgoodies.designsizes.filename
+local context_char = context.char
+local context_getvalue = context.getvalue
+
local otffeatures = otf.features
local otftables = otf.tables
@@ -134,10 +145,12 @@ end
-- this will move elsewhere ...
-function fonts.helpers.name(tfmdata)
- return file.basename(type(tfmdata) == "number" and properties[tfmdata].name or tfmdata.properties.name)
+local function getfontname(tfmdata)
+ return basename(type(tfmdata) == "number" and properties[tfmdata].name or tfmdata.properties.name)
end
+fonts.helpers.name = getfontname
+
if _LUAVERSION < 5.2 then
utilities.strings.formatters.add(formatters,"font:name", [["'"..fontname(%s).."'"]], "local fontname = fonts.helpers.name")
@@ -213,7 +226,6 @@ function constructors.trytosharefont(target,tfmdata)
end
end
-
directives.register("fonts.checksharing",function(v)
if not v then
report_defining("font sharing in backend is disabled")
@@ -221,19 +233,6 @@ directives.register("fonts.checksharing",function(v)
constructors.sharefonts = v
end)
-local limited = false
-
-directives.register("system.inputmode", function(v)
- if not limited then
- local i_limiter = io.i_limiter(v)
- if i_limiter then
- fontloader.open = i_limiter.protect(fontloader.open)
- fontloader.info = i_limiter.protect(fontloader.info)
- limited = true
- end
- end
-end)
-
function definers.resetnullfont()
-- resetting is needed because tikz misuses nullfont
local parameters = fonts.nulldata.parameters
@@ -251,7 +250,17 @@ function definers.resetnullfont()
definers.resetnullfont = function() end
end
-commands.resetnullfont = definers.resetnullfont
+implement {
+ name = "resetnullfont",
+ onlyonce = true,
+ actions = function()
+ for i=1,7 do
+ -- we have no direct method yet
+ context([[\fontdimen%s\nullfont\zeropoint]],i)
+ end
+ definers.resetnullfont()
+ end
+}
-- this cannot be a feature initializer as there is no auto namespace
-- so we never enter the loop then; we can store the defaults in the tma
@@ -878,7 +887,10 @@ end
specifiers.splitcontext = splitcontext
function specifiers.contexttostring(name,kind,separator,yes,no,strict,omit) -- not used
- return hash_to_string(mergedtable(handlers[kind].features.defaults or {},setups[name] or {}),separator,yes,no,strict,omit)
+ return hash_to_string(
+ mergedtable(handlers[kind].features.defaults or {},setups[name] or {}),
+ separator, yes, no, strict, omit or { "number" }
+ )
end
local function starred(features) -- no longer fallbacks here
@@ -900,11 +912,11 @@ local separator = S(";,")
local equal = P("=")
local spaces = space^0
local sometext = C((1-equal-space-separator)^1)
-local truevalue = P("+") * spaces * sometext * Cc(true) -- "yes"
-local falsevalue = P("-") * spaces * sometext * Cc(false) -- "no"
+local truevalue = P("+") * spaces * sometext * Cc(true)
+local falsevalue = P("-") * spaces * sometext * Cc(false)
+local somevalue = sometext * spaces * Cc(true)
local keyvalue = sometext * spaces * equal * spaces * sometext
-local somevalue = sometext * spaces * Cc(true) -- "yes"
-local pattern = Cf(Ct("") * (space + separator + Cg(keyvalue + falsevalue + truevalue + somevalue))^0, rawset)
+local pattern = Cf(Ct("") * (space + separator + Cg(falsevalue + truevalue + keyvalue + somevalue))^0, rawset)
local function colonized(specification)
specification.features.normal = normalize_features(lpegmatch(pattern,specification.detail))
@@ -956,14 +968,30 @@ local getspecification = definers.getspecification
do -- else too many locals
- local ctx_setdefaultfontname = context.fntsetdefname
- local ctx_setsomefontname = context.fntsetsomename
- local ctx_setemptyfontsize = context.fntsetnopsize
- local ctx_setsomefontsize = context.fntsetsomesize
- local ctx_letvaluerelax = context.letvaluerelax
+ ----- ctx_setdefaultfontname = context.fntsetdefname
+ ----- ctx_setsomefontname = context.fntsetsomename
+ ----- ctx_setemptyfontsize = context.fntsetnopsize
+ ----- ctx_setsomefontsize = context.fntsetsomesize
+ ----- ctx_letvaluerelax = context.letvaluerelax
+
+ local starttiming = statistics.starttiming
+ local stoptiming = statistics.stoptiming
+
+ local scanners = tokens.scanners
+ local scanstring = scanners.string
+ local scaninteger = scanners.integer
+ local scanboolean = scanners.boolean
+
+ local setmacro = tokens.setters.macro
- function commands.definefont_one(str)
- statistics.starttiming(fonts)
+ local scanners = interfaces.scanners
+
+ -- function commands.definefont_one(str)
+
+ scanners.definefont_one = function()
+ local str = scanstring()
+
+ starttiming(fonts)
if trace_defining then
report_defining("memory usage before: %s",statistics.memused())
report_defining("start stage one: %s",str)
@@ -972,29 +1000,31 @@ do -- else too many locals
local lookup, name, sub, method, detail = getspecification(fullname)
if not name then
report_defining("strange definition %a",str)
- ctx_setdefaultfontname()
+ -- ctx_setdefaultfontname()
elseif name == "unknown" then
- ctx_setdefaultfontname()
+ -- ctx_setdefaultfontname()
else
- ctx_setsomefontname(name)
+ -- ctx_setsomefontname(name)
+ setmacro("somefontname",name,"global")
end
-- we can also use a count for the size
if size and size ~= "" then
local mode, size = lpegmatch(sizepattern,size)
if size and mode then
texsetcount("scaledfontmode",mode)
- ctx_setsomefontsize(size)
+ -- ctx_setsomefontsize(size)
+ setmacro("somefontsize",size)
else
texsetcount("scaledfontmode",0)
- ctx_setemptyfontsize()
+ -- ctx_setemptyfontsize()
end
elseif true then
-- so we don't need to check in tex
texsetcount("scaledfontmode",2)
- ctx_setemptyfontsize()
+ -- ctx_setemptyfontsize()
else
texsetcount("scaledfontmode",0)
- ctx_setemptyfontsize()
+ -- ctx_setemptyfontsize()
end
specification = definers.makespecification(str,lookup,name,sub,method,detail,size)
if trace_defining then
@@ -1011,8 +1041,29 @@ do -- else too many locals
return (gsub(cs,".->", ""))
end
- function commands.definefont_two(global,cs,str,size,inheritancemode,classfeatures,fontfeatures,classfallbacks,fontfallbacks,
- mathsize,textsize,relativeid,classgoodies,goodies,classdesignsize,fontdesignsize,scaledfontmode)
+ -- function commands.definefont_two(global,cs,str,size,inheritancemode,classfeatures,fontfeatures,classfallbacks,fontfallbacks,
+ -- mathsize,textsize,relativeid,classgoodies,goodies,classdesignsize,fontdesignsize,scaledfontmode)
+
+ scanners.definefont_two = function()
+
+ local global = scanboolean() -- \ifx\fontclass\empty\s!false\else\s!true\fi
+ local cs = scanstring () -- {#csname}%
+ local str = scanstring () -- \somefontfile
+ local size = scaninteger() -- \d_font_scaled_font_size
+ local inheritancemode = scaninteger() -- \c_font_feature_inheritance_mode
+ local classfeatures = scanstring () -- \m_font_class_features
+ local fontfeatures = scanstring () -- \m_font_features
+ local classfallbacks = scanstring () -- \m_font_class_fallbacks
+ local fontfallbacks = scanstring () -- \m_font_fallbacks
+ local mathsize = scaninteger() -- \fontface
+ local textsize = scaninteger() -- \d_font_scaled_text_face
+ local relativeid = scaninteger() -- \relativefontid
+ local classgoodies = scanstring () -- \m_font_class_goodies
+ local goodies = scanstring () -- \m_font_goodies
+ local classdesignsize = scanstring () -- \m_font_class_designsize
+ local fontdesignsize = scanstring () -- \m_font_designsize
+ local scaledfontmode = scaninteger() -- \scaledfontmode
+
if trace_defining then
report_defining("start stage two: %s (size %s)",str,size)
end
@@ -1112,7 +1163,8 @@ do -- else too many locals
if not tfmdata then
report_defining("unable to define %a as %a",name,nice_cs(cs))
lastfontid = -1
- ctx_letvaluerelax(cs) -- otherwise the current definition takes the previous one
+ texsetcount("scaledfontsize",0)
+ -- ctx_letvaluerelax(cs) -- otherwise the current definition takes the previous one
elseif type(tfmdata) == "number" then
if trace_defining then
report_defining("reusing %s, id %a, target %a, features %a / %a, fallbacks %a / %a, goodies %a / %a, designsize %a / %a",
@@ -1122,7 +1174,8 @@ do -- else too many locals
texdefinefont(global,cs,tfmdata)
-- resolved (when designsize is used):
local size = fontdata[tfmdata].parameters.size or 0
- ctx_setsomefontsize(size .. "sp")
+ -- ctx_setsomefontsize(size .. "sp")
+ setmacro("somefontsize",size.."sp")
texsetcount("scaledfontsize",size)
lastfontid = tfmdata
else
@@ -1149,7 +1202,8 @@ do -- else too many locals
end
-- resolved (when designsize is used):
local size = tfmdata.parameters.size or 655360
- ctx_setsomefontsize(size .. "sp")
+ setmacro("somefontsize",size.."sp")
+ -- ctx_setsomefontsize(size .. "sp")
texsetcount("scaledfontsize",size)
lastfontid = id
end
@@ -1167,16 +1221,18 @@ do -- else too many locals
lastmathids[mathsize] = lastfontid
end
--
- statistics.stoptiming(fonts)
+ stoptiming(fonts)
end
+ --
+
function definers.define(specification)
--
local name = specification.name
if not name or name == "" then
return -1
else
- statistics.starttiming(fonts)
+ starttiming(fonts)
--
-- following calls expect a few properties to be set:
--
@@ -1232,26 +1288,25 @@ do -- else too many locals
constructors.finalize(tfmdata)
return id, tfmdata
end
- statistics.stoptiming(fonts)
+ stoptiming(fonts)
end
end
-end
-
--- local id, cs = fonts.definers.internal { }
--- local id, cs = fonts.definers.internal { number = 2 }
--- local id, cs = fonts.definers.internal { name = "dejavusans" }
-
-do
+ -- local id, cs = fonts.definers.internal { }
+ -- local id, cs = fonts.definers.internal { number = 2 }
+ -- local id, cs = fonts.definers.internal { name = "dejavusans" }
local n = 0
function definers.internal(specification,cs)
specification = specification or { }
local name = specification.name
- local size = specification.size and number.todimen(specification.size) or texgetdimen("bodyfontsize")
+ local size = tonumber(specification.size)
local number = tonumber(specification.number)
local id = nil
+ if not size then
+ size = texgetdimen("bodyfontsize")
+ end
if number then
id = number
elseif name and name ~= "" then
@@ -1275,6 +1330,17 @@ do
return id, csnames[id]
end
+ -- here
+
+ local infofont = 0
+
+ function fonts.infofont()
+ if infofont == 0 then
+ infofont = definers.define { name = "dejavusansmono", size = tex.sp("6pt") }
+ end
+ return infofont
+ end
+
end
local enable_auto_r_scale = false
@@ -1306,7 +1372,7 @@ function constructors.calculatescale(tfmdata,scaledpoints,relativeid,specificati
end
end
end
- scaledpoints, delta = calculatescale(tfmdata,scaledpoints)
+ local scaledpoints, delta = calculatescale(tfmdata,scaledpoints)
-- if enable_auto_r_scale and relativeid then -- for the moment this is rather context specific (we need to hash rscale then)
-- local relativedata = fontdata[relativeid]
-- local rfmdata = relativedata and relativedata.unscaled and relativedata.unscaled
@@ -1395,10 +1461,10 @@ end
local mappings = fonts.mappings
local loaded = { -- prevent loading (happens in cont-sys files)
- ["original-base.map" ] = true,
- ["original-ams-base.map" ] = true,
- ["original-ams-euler.map"] = true,
- ["original-public-lm.map"] = true,
+ -- ["original-base.map" ] = true,
+ -- ["original-ams-base.map" ] = true,
+ -- ["original-ams-euler.map"] = true,
+ -- ["original-public-lm.map"] = true,
}
function mappings.loadfile(name)
@@ -1436,20 +1502,178 @@ end
mappings.reset() -- resets the default file
+implement {
+ name = "loadmapfile",
+ actions = mappings.loadfile,
+ arguments = "string"
+}
+
+implement {
+ name = "loadmapline",
+ actions = mappings.loadline,
+ arguments = "string"
+}
+
+implement {
+ name = "resetmapfiles",
+ actions = mappings.reset,
+ arguments = "string"
+}
+
-- we need an 'do after the banner hook'
-- => commands
local function nametoslot(name)
local t = type(name)
+ local s = nil
if t == "string" then
- return resources[true].unicodes[name]
+ local slot = unicodes[true][name]
+ if slot then
+ return slot
+ end
+ if not aglunicodes then
+ aglunicodes = encodings.agl.unicodes
+ end
+ slot = aglunicodes[name]
+ if characters[true][slot] then
+ return slot
+ else
+ -- not in font
+ end
elseif t == "number" then
- return n
+ if characters[true][name] then
+ return slot
+ else
+ -- not in font
+ end
end
end
-helpers.nametoslot = nametoslot
+local function indextoslot(index)
+ local r = resources[true]
+ if r then
+ local indices = r.indices
+ if not indices then
+ indices = { }
+ local c = characters[true]
+ for unicode, data in next, c do
+ local di = data.index
+ if di then
+ indices[di] = unicode
+ end
+ end
+ r.indices = indices
+ end
+ return indices[tonumber(index)]
+ end
+end
+
+do -- else too many locals
+
+ local entities = characters.entities
+ local lowered = { } -- delayed initialization
+
+ setmetatableindex(lowered,function(t,k)
+ for k, v in next, entities do
+ local l = lower(k)
+ if not entities[l] then
+ lowered[l] = v
+ end
+ end
+ setmetatableindex(lowered,nil)
+ return lowered[k]
+ end)
+
+ local methods = {
+ -- entity
+ e = function(name)
+ return entities[name] or lowered[name] or name
+ end,
+ -- hexadecimal unicode
+ x = function(name)
+ local n = tonumber(name,16)
+ return n and utfchar(n) or name
+ end,
+ -- decimal unicode
+ d = function(name)
+ local n = tonumber(name)
+ return n and utfchar(n) or name
+ end,
+ -- hexadecimal index (slot)
+ s = function(name)
+ local n = tonumber(name,16)
+ local n = n and indextoslot(n)
+ return n and utfchar(n) or name
+ end,
+ -- decimal index
+ i = function(name)
+ local n = tonumber(name)
+ local n = n and indextoslot(n)
+ return n and utfchar(n) or name
+ end,
+ -- name
+ n = function(name)
+ local n = nametoslot(name)
+ return n and utfchar(n) or name
+ end,
+ -- char
+ c = function(name)
+ return name
+ end,
+ }
+
+ -- -- nicer:
+ --
+ -- setmetatableindex(methods,function(t,k) return methods.c end)
+ --
+ -- local splitter = (C(1) * P(":") + Cc("c")) * C(P(1)^1) / function(method,name)
+ -- return methods[method](name)
+ -- end
+ --
+ -- -- more efficient:
+
+ local splitter = C(1) * P(":") * C(P(1)^1) / function(method,name)
+ local action = methods[method]
+ return action and action(name) or name
+ end
+
+ local function tochar(str)
+ local t = type(str)
+ if t == "number" then
+ return utfchar(str)
+ elseif t == "string" then
+ return lpegmatch(splitter,str) or str
+ else
+ return str
+ end
+ end
+
+ helpers.nametoslot = nametoslot
+ helpers.indextoslot = indextoslot
+ helpers.tochar = tochar
+
+ -- interfaces:
+
+ implement {
+ name = "fontchar",
+ actions = { nametoslot, context_char },
+ arguments = "string",
+ }
+
+ implement {
+ name = "fontcharbyindex",
+ actions = { indextoslot, context_char },
+ arguments = "integer",
+ }
+
+ implement {
+ name = "tochar",
+ actions = { tochar, context },
+ arguments = "string",
+ }
+
+end
-- this will change ...
@@ -1573,15 +1797,21 @@ function fonts.definetypeface(name,t)
local boldwidth = t.boldwidth or t.width or p.boldwidth or p.width or "normal"
Shape = Shapes[shape] or "Serif"
ctx_startfontclass { name }
- ctx_definefontsynonym( { format("%s", Shape) }, { format("spec:%s-%s-regular-%s", fontname, normalweight, normalwidth) } )
- ctx_definefontsynonym( { format("%sBold", Shape) }, { format("spec:%s-%s-regular-%s", fontname, boldweight, boldwidth ) } )
- ctx_definefontsynonym( { format("%sBoldItalic", Shape) }, { format("spec:%s-%s-italic-%s", fontname, boldweight, boldwidth ) } )
- ctx_definefontsynonym( { format("%sItalic", Shape) }, { format("spec:%s-%s-italic-%s", fontname, normalweight, normalwidth) } )
+ ctx_definefontsynonym( { formatters["%s"] (Shape) }, { formatters["spec:%s-%s-regular-%s"] (fontname, normalweight, normalwidth) } )
+ ctx_definefontsynonym( { formatters["%sBold"] (Shape) }, { formatters["spec:%s-%s-regular-%s"] (fontname, boldweight, boldwidth ) } )
+ ctx_definefontsynonym( { formatters["%sBoldItalic"](Shape) }, { formatters["spec:%s-%s-italic-%s"] (fontname, boldweight, boldwidth ) } )
+ ctx_definefontsynonym( { formatters["%sItalic"] (Shape) }, { formatters["spec:%s-%s-italic-%s"] (fontname, normalweight, normalwidth) } )
ctx_stopfontclass()
local settings = sequenced({ features= t.features },",")
ctx_dofastdefinetypeface(name, shortcut, shape, size, settings)
end
+implement {
+ name = "definetypeface",
+ actions = fonts.definetypeface,
+ arguments = { "string", "string" }
+}
+
function fonts.current() -- todo: also handle name
return fontdata[currentfont()] or fontdata[0]
end
@@ -1590,101 +1820,6 @@ function fonts.currentid()
return currentfont() or 0
end
--- interfaces
-
-local context_char = context.char
-local context_getvalue = context.getvalue
-
-local commands_doifelse = commands.doifelse
-
-function commands.fontchar(n)
- n = nametoslot(n)
- if n then
- context_char(n)
- end
-end
-
-function commands.doifelsecurrentfonthasfeature(name) -- can be made faster with a supportedfeatures hash
- local f = fontdata[currentfont()]
- f = f and f.shared
- f = f and f.rawdata
- f = f and f.resources
- f = f and f.features
- commands_doifelse(f and (f.gpos[name] or f.gsub[name]))
-end
-
-local p, f = 1, formatters["%0.1fpt"] -- normally this value is changed only once
-
-local stripper = lpeg.patterns.stripzeros
-
-function commands.nbfs(amount,precision)
- if precision ~= p then
- p = precision
- f = formatters["%0." .. p .. "fpt"]
- end
- context(lpegmatch(stripper,f(amount/65536)))
-end
-
-function commands.featureattribute(tag)
- context(contextnumber(tag))
-end
-
-function commands.setfontfeature(tag)
- texsetattribute(0,contextnumber(tag))
-end
-
-function commands.resetfontfeature()
- texsetattribute(0,0)
-end
-
--- function commands.addfs(tag) withset(tag, 1) end
--- function commands.subfs(tag) withset(tag,-1) end
--- function commands.addff(tag) withfnt(tag, 2) end -- on top of font features
--- function commands.subff(tag) withfnt(tag,-2) end -- on top of font features
-
-function commands.cleanfontname (name) context(names.cleanname(name)) end
-
-function commands.fontlookupinitialize (name) names.lookup(name) end
-function commands.fontlookupnoffound () context(names.noflookups()) end
-function commands.fontlookupgetkeyofindex(key,index) context(names.getlookupkey(key,index)) end
-function commands.fontlookupgetkey (key) context(names.getlookupkey(key)) end
-
--- this might move to a runtime module:
-
-function commands.showchardata(n)
- local tfmdata = fontdata[currentfont()]
- if tfmdata then
- if type(n) == "string" then
- n = utfbyte(n)
- end
- local chr = tfmdata.characters[n]
- if chr then
- report_status("%s @ %s => %U => %c => %s",tfmdata.properties.fullname,tfmdata.parameters.size,n,n,serialize(chr,false))
- end
- end
-end
-
-function commands.showfontparameters(tfmdata)
- -- this will become more clever
- local tfmdata = tfmdata or fontdata[currentfont()]
- if tfmdata then
- local parameters = tfmdata.parameters
- local mathparameters = tfmdata.mathparameters
- local properties = tfmdata.properties
- local hasparameters = parameters and next(parameters)
- local hasmathparameters = mathparameters and next(mathparameters)
- if hasparameters then
- report_status("%s @ %s => text parameters => %s",properties.fullname,parameters.size,serialize(parameters,false))
- end
- if hasmathparameters then
- report_status("%s @ %s => math parameters => %s",properties.fullname,parameters.size,serialize(mathparameters,false))
- end
- if not hasparameters and not hasmathparameters then
- report_status("%s @ %s => no text parameters and/or math parameters",properties.fullname,parameters.size)
- end
- end
-end
-
-- for the moment here, this will become a chain of extras that is
-- hooked into the ctx registration (or scaler or ...)
@@ -1866,79 +2001,152 @@ end
-- end
-- end
-function commands.setfontofid(id)
- context_getvalue(csnames[id])
-end
+do
--- more interfacing:
+ local scanners = tokens.scanners
+ local scanstring = scanners.string
+ local scaninteger = scanners.integer
+ local scandimen = scanners.dimen
+ local scanboolean = scanners.boolean
-commands.definefontfeature = presetcontext
+ local setmacro = tokens.setters.macro
-local cache = { }
+ local scanners = interfaces.scanners
-local hows = {
- ["+"] = "add",
- ["-"] = "subtract",
- ["="] = "replace",
-}
+ function constructors.currentfonthasfeature(n)
+ local f = fontdata[currentfont()]
+ if not f then return end f = f.shared
+ if not f then return end f = f.rawdata
+ if not f then return end f = f.resources
+ if not f then return end f = f.features
+ return f and (f.gpos[n] or f.gsub[n])
+ end
-function commands.feature(how,parent,name,font) -- 0/1 test temporary for testing
- if not how or how == 0 then
- if trace_features and texgetattribute(0) ~= 0 then
- report_cummulative("font %!font:name!, reset",fontdata[font or true])
- end
- texsetattribute(0,0)
- elseif how == true or how == 1 then
- local hash = "feature > " .. parent
- local done = cache[hash]
- if trace_features and done then
- report_cummulative("font %!font:name!, revive %a : %!font:features!",fontdata[font or true],parent,setups[numbers[done]])
- end
- texsetattribute(0,done or 0)
- else
- local full = parent .. how .. name
- local hash = "feature > " .. full
- local done = cache[hash]
- if not done then
- local n = setups[full]
- if n then
- -- already defined
- else
- n = mergecontextfeatures(parent,name,how,full)
+ implement {
+ name = "doifelsecurrentfonthasfeature",
+ actions = { currentfonthasfeature, commands.doifelse },
+ arguments = "string"
+ }
+
+ -- local p, f = 1, formatters["%0.1fpt"] -- normally this value is changed only once
+ --
+ -- local stripper = lpeg.patterns.stripzeros
+ --
+ -- function commands.nbfs(amount,precision)
+ -- if precision ~= p then
+ -- p = precision
+ -- f = formatters["%0." .. p .. "fpt"]
+ -- end
+ -- context(lpegmatch(stripper,f(amount/65536)))
+ -- end
+
+ local f = formatters["%0.2fpt"] -- normally this value is changed only once
+
+ local stripper = lpeg.patterns.stripzeros
+
+ scanners.nbfs = function()
+ context(lpegmatch(stripper,f(scandimen()/65536)))
+ end
+
+ commands.featureattribute = function(tag) context(contextnumber(tag)) end
+ commands.setfontfeature = function(tag) texsetattribute(0,contextnumber(tag)) end
+ commands.resetfontfeature = function() texsetattribute(0,0) end
+ commands.setfontofid = function(id) context_getvalue(csnames[id]) end
+ commands.definefontfeature = presetcontext
+
+ scanners.featureattribute = function() context(contextnumber(scanstring())) end
+ scanners.setfontfeature = function() texsetattribute(0,contextnumber(scanstring())) end
+ scanners.resetfontfeature = function() texsetattribute(0,0) end
+ scanners.setfontofid = function() context_getvalue(csnames[scaninteger()]) end
+ scanners.definefontfeature = function() presetcontext(scanstring(),scanstring(),scanstring()) end
+
+ local cache = { }
+
+ local hows = {
+ ["+"] = "add",
+ ["-"] = "subtract",
+ ["="] = "replace",
+ }
+
+ local function setfeature(how,parent,name,font) -- 0/1 test temporary for testing
+ if not how or how == 0 then
+ if trace_features and texgetattribute(0) ~= 0 then
+ report_cummulative("font %!font:name!, reset",fontdata[font or true])
+ end
+ texsetattribute(0,0)
+ elseif how == true or how == 1 then
+ local hash = "feature > " .. parent
+ local done = cache[hash]
+ if trace_features and done then
+ report_cummulative("font %!font:name!, revive %a : %!font:features!",fontdata[font or true],parent,setups[numbers[done]])
end
- done = registercontextfeature(hash,full,how)
- cache[hash] = done
- if trace_features then
- report_cummulative("font %!font:name!, %s %a : %!font:features!",fontdata[font or true],hows[how],full,setups[numbers[done]])
+ texsetattribute(0,done or 0)
+ else
+ local full = parent .. how .. name
+ local hash = "feature > " .. full
+ local done = cache[hash]
+ if not done then
+ local n = setups[full]
+ if n then
+ -- already defined
+ else
+ n = mergecontextfeatures(parent,name,how,full)
+ end
+ done = registercontextfeature(hash,full,how)
+ cache[hash] = done
+ if trace_features then
+ report_cummulative("font %!font:name!, %s %a : %!font:features!",fontdata[font or true],hows[how],full,setups[numbers[done]])
+ end
end
+ texsetattribute(0,done)
end
- texsetattribute(0,done)
end
-end
-function commands.featurelist(...)
- context(fonts.specifiers.contexttostring(...))
-end
+ local function resetfeature()
+ if trace_features and texgetattribute(0) ~= 0 then
+ report_cummulative("font %!font:name!, reset",fontdata[true])
+ end
+ texsetattribute(0,0)
+ end
-function commands.registerlanguagefeatures()
- local specifications = languages.data.specifications
- for i=1,#specifications do
- local specification = specifications[i]
- local language = specification.opentype
- if language then
- local script = specification.opentypescript or specification.script
- if script then
- local context = specification.context
- if type(context) == "table" then
- for i=1,#context do
- definecontext(context[i], { language = language, script = script})
+ local function registerlanguagefeatures()
+ local specifications = languages.data.specifications
+ for i=1,#specifications do
+ local specification = specifications[i]
+ local language = specification.opentype
+ if language then
+ local script = specification.opentypescript or specification.script
+ if script then
+ local context = specification.context
+ if type(context) == "table" then
+ for i=1,#context do
+ definecontext(context[i], { language = language, script = script})
+ end
+ elseif type(context) == "string" then
+ definecontext(context, { language = language, script = script})
end
- elseif type(context) == "string" then
- definecontext(context, { language = language, script = script})
end
end
end
end
+
+ implement { name = "resetfeature", actions = resetfeature }
+ implement { name = "addfeature", actions = setfeature, arguments = { "'+'", "string", "string" } }
+ implement { name = "subtractfeature", actions = setfeature, arguments = { "'-'", "string", "string" } }
+ implement { name = "replacefeature", actions = setfeature, arguments = { "'='", "string", "string" } }
+ implement { name = "revivefeature", actions = setfeature, arguments = { true, "string" } }
+
+ implement {
+ name = "featurelist",
+ actions = { fonts.specifiers.contexttostring, context },
+ arguments = { "string", "'otf'", "string", "'yes'", "'no'", true }
+ }
+
+ implement {
+ name = "registerlanguagefeatures",
+ actions = registerlanguagefeatures,
+ }
+
end
-- a fontkern plug:
@@ -1956,11 +2164,11 @@ end)
directives.register("nodes.injections.fontkern", function(v) setfield(kern,"subtype",v and 0 or 1) end)
--- here
+-- here (todo: closure)
local trace_analyzing = false trackers.register("otf.analyzing", function(v) trace_analyzing = v end)
-local otffeatures = constructors.newfeatures("otf")
+----- otffeatures = constructors.newfeatures("otf")
local registerotffeature = otffeatures.register
local analyzers = fonts.analyzers
@@ -1979,7 +2187,7 @@ local glyph_code = nodes.nodecodes.glyph
local states = analyzers.states
-local names = {
+local colornames = {
[states.init] = "font:1",
[states.medi] = "font:2",
[states.fina] = "font:3",
@@ -2000,7 +2208,7 @@ local function markstates(head)
for glyph in traverse_by_id(glyph_code,head) do
local a = getprop(glyph,a_state)
if a then
- local name = names[a]
+ local name = colornames[a]
if name then
local color = m_color[name]
if color then
@@ -2055,11 +2263,130 @@ function methods.nocolor(head,font,attr)
return head, true
end
-function commands.purefontname(name)
+local function purefontname(name)
if type(name) == "number" then
- name = fonts.helpers.name(name)
+ name = getfontname(name)
end
if type(name) == "string" then
- context(file.basename(name))
+ return basename(name)
+ end
+end
+
+implement {
+ name = "purefontname",
+ actions = { purefontname, context },
+ arguments = "string",
+}
+
+local list = storage.shared.bodyfontsizes or { }
+storage.shared.bodyfontsizes = list
+
+implement {
+ name = "registerbodyfontsize",
+ arguments = "string",
+ actions = function(size)
+ list[size] = true
+ end
+}
+
+implement {
+ name = "getbodyfontsizes",
+ arguments = "string",
+ actions = function(separator)
+ context(concat(sortedkeys(list),separator))
+ end
+}
+
+implement {
+ name = "processbodyfontsizes",
+ arguments = "string",
+ actions = function(command)
+ local keys = sortedkeys(list)
+ if command then
+ local action = context[command]
+ for i=1,#keys do
+ action(keys[i])
+ end
+ else
+ context(concat(keys,","))
+ end
+ end
+}
+
+implement {
+ name = "cleanfontname",
+ actions = { names.cleanname, context },
+ arguments = "string"
+}
+
+implement {
+ name = "fontlookupinitialize",
+ actions = names.lookup,
+ arguments = "string",
+}
+
+implement {
+ name = "fontlookupnoffound",
+ actions = { names.noflookups, context },
+}
+
+implement {
+ name = "fontlookupgetkeyofindex",
+ actions = { names.getlookupkey, context },
+ arguments = { "string", "integer"}
+}
+
+implement {
+ name = "fontlookupgetkey",
+ actions = { names.getlookupkey, context },
+ arguments = "string"
+}
+
+-- this might move to a runtime module:
+
+function commands.showchardata(n)
+ local tfmdata = fontdata[currentfont()]
+ if tfmdata then
+ if type(n) == "string" then
+ n = utfbyte(n)
+ end
+ local chr = tfmdata.characters[n]
+ if chr then
+ report_status("%s @ %s => %U => %c => %s",tfmdata.properties.fullname,tfmdata.parameters.size,n,n,serialize(chr,false))
+ end
end
end
+
+function commands.showfontparameters(tfmdata)
+ -- this will become more clever
+ local tfmdata = tfmdata or fontdata[currentfont()]
+ if tfmdata then
+ local parameters = tfmdata.parameters
+ local mathparameters = tfmdata.mathparameters
+ local properties = tfmdata.properties
+ local hasparameters = parameters and next(parameters)
+ local hasmathparameters = mathparameters and next(mathparameters)
+ if hasparameters then
+ report_status("%s @ %s => text parameters => %s",properties.fullname,parameters.size,serialize(parameters,false))
+ end
+ if hasmathparameters then
+ report_status("%s @ %s => math parameters => %s",properties.fullname,parameters.size,serialize(mathparameters,false))
+ end
+ if not hasparameters and not hasmathparameters then
+ report_status("%s @ %s => no text parameters and/or math parameters",properties.fullname,parameters.size)
+ end
+ end
+end
+
+implement {
+ name = "currentdesignsize",
+ actions = function()
+ context(parameters[currentfont()].designsize)
+ end
+}
+
+implement {
+ name = "doifelsefontpresent",
+ actions = { names.exists, commands.doifelse },
+ arguments = "string"
+}
diff --git a/Master/texmf-dist/tex/context/base/font-def.lua b/Master/texmf-dist/tex/context/base/font-def.lua
index e5c5d990ce2..fdded3c369c 100644
--- a/Master/texmf-dist/tex/context/base/font-def.lua
+++ b/Master/texmf-dist/tex/context/base/font-def.lua
@@ -433,8 +433,8 @@ function definers.read(specification,size,id) -- id can be optional, name can al
elseif trace_defining and type(tfmdata) == "table" then
local properties = tfmdata.properties or { }
local parameters = tfmdata.parameters or { }
- report_defining("using %s font with id %a, name %a, size %a, bytes %a, encoding %a, fullname %a, filename %a",
- properties.format, id, properties.name, parameters.size, properties.encodingbytes,
+ report_defining("using %a font with id %a, name %a, size %a, bytes %a, encoding %a, fullname %a, filename %a",
+ properties.format or "unknown", id, properties.name, parameters.size, properties.encodingbytes,
properties.encodingname, properties.fullname, file.basename(properties.filename))
end
statistics.stoptiming(fonts)
diff --git a/Master/texmf-dist/tex/context/base/font-enc.lua b/Master/texmf-dist/tex/context/base/font-enc.lua
index 5305f0736a6..2e8b722de39 100644
--- a/Master/texmf-dist/tex/context/base/font-enc.lua
+++ b/Master/texmf-dist/tex/context/base/font-enc.lua
@@ -8,6 +8,7 @@ if not modules then modules = { } end modules ['font-enc'] = {
-- this module is obsolete
+local next = next
local match, gmatch, gsub = string.match, string.gmatch, string.gsub
local setmetatableindex = table.setmetatableindex
@@ -125,7 +126,12 @@ function encodings.make_unicode_vector()
end
end
for name, code in next, characters.synonyms do
- vector[code], hash[name] = name, code
+ if not vector[code] then
+ vector[code] = name
+ end
+ if not hash[name] then
+ hash[name] = code
+ end
end
return containers.write(encodings.cache, 'unicode', { name='unicode', tag='unicode', vector=vector, hash=hash })
end
diff --git a/Master/texmf-dist/tex/context/base/font-enh.lua b/Master/texmf-dist/tex/context/base/font-enh.lua
index 2bf0741f535..3439a434ab4 100644
--- a/Master/texmf-dist/tex/context/base/font-enh.lua
+++ b/Master/texmf-dist/tex/context/base/font-enh.lua
@@ -114,24 +114,24 @@ local registerotffeature = otffeatures.register
-- unicodes = {
-- a1 = 0x2701,
-local tosixteen = fonts.mappings.tounicode16
+----- tosixteen = fonts.mappings.tounicode16
local function initializeunicoding(tfmdata)
local goodies = tfmdata.goodies
local newcoding = nil
- local tounicode = false
+ -- local tounicode = false
for i=1,#goodies do
local remapping = goodies[i].remapping
if remapping and remapping.unicodes then
- newcoding = remapping.unicodes -- names to unicodes
- tounicode = remapping.tounicode
+ newcoding = remapping.unicodes -- names to unicodes
+ -- tounicode = remapping.tounicode -- not used
end
end
if newcoding then
local characters = tfmdata.characters
local descriptions = tfmdata.descriptions
local oldcoding = tfmdata.resources.unicodes
- local tounicodes = tfmdata.resources.tounicode -- index to unicode
+ -- local tounicodes = tfmdata.resources.tounicode -- index to unicode
local originals = { }
for name, newcode in next, newcoding do
local oldcode = oldcoding[name]
@@ -153,15 +153,15 @@ local function initializeunicoding(tfmdata)
else
oldcoding[name] = newcode
end
- if tounicode then
- local description = descriptions[newcode]
- if description then
- local index = description.index
- if not tounicodes[index] then
- tounicodes[index] = tosixteen(newcode) -- shared (we could have a metatable)
- end
- end
- end
+ -- if tounicode then
+ -- local description = descriptions[newcode]
+ -- if description then
+ -- local index = description.index
+ -- if not tounicodes[index] then
+ -- tounicodes[index] = tosixteen(newcode) -- shared (we could have a metatable)
+ -- end
+ -- end
+ -- end
if trace_unicoding then
if oldcode then
report_unicoding("aliasing glyph %a from %U to %U",name,oldcode,newcode)
diff --git a/Master/texmf-dist/tex/context/base/font-ext.lua b/Master/texmf-dist/tex/context/base/font-ext.lua
index ede2151d6b5..b7817c140b0 100644
--- a/Master/texmf-dist/tex/context/base/font-ext.lua
+++ b/Master/texmf-dist/tex/context/base/font-ext.lua
@@ -7,19 +7,17 @@ if not modules then modules = { } end modules ['font-ext'] = {
}
local next, type, byte = next, type, string.byte
-local gmatch, concat, format = string.gmatch, table.concat, string.format
-local utfchar = utf.char
-local commands, context = commands, context
-local fonts, utilities = fonts, utilities
+local context = context
+local fonts = fonts
+local utilities = utilities
-local trace_protrusion = false trackers.register("fonts.protrusion", function(v) trace_protrusion = v end)
-local trace_expansion = false trackers.register("fonts.expansion", function(v) trace_expansion = v end)
+local trace_protrusion = false trackers.register("fonts.protrusion", function(v) trace_protrusion = v end)
+local trace_expansion = false trackers.register("fonts.expansion", function(v) trace_expansion = v end)
local report_expansions = logs.reporter("fonts","expansions")
local report_protrusions = logs.reporter("fonts","protrusions")
-
--- todo: byte(..) => 0xHHHH
+local report_opbd = logs.reporter("fonts","otf opbd")
--[[ldx--
<p>When we implement functions that deal with features, most of them
@@ -42,6 +40,8 @@ local getparameters = utilities.parsers.getparameters
local setmetatableindex = table.setmetatableindex
+local implement = interfaces.implement
+
-- -- -- -- -- --
-- shared
-- -- -- -- -- --
@@ -79,10 +79,6 @@ expansions.vectors = vectors
classes.preset = { stretch = 2, shrink = 2, step = .5, factor = 1 }
-function commands.setupfontexpansion(class,settings)
- getparameters(classes,class,'preset',settings)
-end
-
classes['quality'] = {
stretch = 2, shrink = 2, step = .5, vector = 'default', factor = 1
}
@@ -172,7 +168,11 @@ registerafmfeature {
fonts.goodies.register("expansions", function(...) return fonts.goodies.report("expansions", trace_expansion, ...) end)
-local report_opbd = logs.reporter("fonts","otf opbd")
+implement {
+ name = "setupfontexpansion",
+ arguments = { "string", "string" },
+ actions = function(class,settings) getparameters(classes,class,'preset',settings) end
+}
-- -- -- -- -- --
-- protrusion
@@ -191,10 +191,6 @@ local vectors = protrusions.vectors
classes.preset = { factor = 1, left = 1, right = 1 }
-function commands.setupfontprotrusion(class,settings)
- getparameters(classes,class,'preset',settings)
-end
-
classes['pure'] = {
vector = 'pure', factor = 1
}
@@ -328,8 +324,10 @@ local function map_opbd_onto_protrusion(tfmdata,value,opbd)
local characters = tfmdata.characters
local descriptions = tfmdata.descriptions
local properties = tfmdata.properties
+ local resources = tfmdata.resources
local rawdata = tfmdata.shared.rawdata
local lookuphash = rawdata.lookuphash
+ local lookuptags = resources.lookuptags
local script = properties.script
local language = properties.language
local done, factor, left, right = false, 1, 1, 1
@@ -349,14 +347,14 @@ local function map_opbd_onto_protrusion(tfmdata,value,opbd)
local data = lookuphash[lookup]
if data then
if trace_protrusion then
- report_protrusions("setting left using lfbd lookup %a",lookup)
+ report_protrusions("setting left using lfbd lookup %a",lookuptags[lookup])
end
for k, v in next, data do
-- local p = - v[3] / descriptions[k].width-- or 1 ~= 0 too but the same
local p = - (v[1] / 1000) * factor * left
characters[k].left_protruding = p
if trace_protrusion then
- report_protrusions("lfbd -> %s -> %C -> %0.03f (% t)",lookup,k,p,v)
+ report_protrusions("lfbd -> %s -> %C -> %0.03f (% t)",lookuptags[lookup],k,p,v)
end
end
done = true
@@ -372,14 +370,14 @@ local function map_opbd_onto_protrusion(tfmdata,value,opbd)
local data = lookuphash[lookup]
if data then
if trace_protrusion then
- report_protrusions("setting right using rtbd lookup %a",lookup)
+ report_protrusions("setting right using rtbd lookup %a",lookuptags[lookup])
end
for k, v in next, data do
-- local p = v[3] / descriptions[k].width -- or 3
local p = (v[1] / 1000) * factor * right
characters[k].right_protruding = p
if trace_protrusion then
- report_protrusions("rtbd -> %s -> %C -> %0.03f (% t)",lookup,k,p,v)
+ report_protrusions("rtbd -> %s -> %C -> %0.03f (% t)",lookuptags[lookup],k,p,v)
end
end
end
@@ -487,6 +485,12 @@ registerafmfeature {
fonts.goodies.register("protrusions", function(...) return fonts.goodies.report("protrusions", trace_protrusion, ...) end)
+implement {
+ name = "setupfontprotrusion",
+ arguments = { "string", "string" },
+ actions = function(class,settings) getparameters(classes,class,'preset',settings) end
+}
+
-- -- --
local function initializenostackmath(tfmdata,value)
@@ -502,6 +506,19 @@ registerotffeature {
}
}
+local function initializerealdimensions(tfmdata,value)
+ tfmdata.properties.realdimensions = value and true
+end
+
+registerotffeature {
+ name = "realdimensions",
+ description = "accept negative dimenions",
+ initializers = {
+ base = initializerealdimensions,
+ node = initializerealdimensions,
+ }
+}
+
local function initializeitlc(tfmdata,value) -- hm, always value
if value then
-- the magic 40 and it formula come from Dohyun Kim but we might need another guess
@@ -887,11 +904,17 @@ registerotffeature {
-- a handy helper (might change or be moved to another namespace)
-local new_special = nodes.pool.special
-local new_glyph = nodes.pool.glyph
+local nodepool = nodes.pool
+
+local new_special = nodepool.special
+local new_glyph = nodepool.glyph
+local new_rule = nodepool.rule
local hpack_node = node.hpack
-function fonts.helpers.addprivate(tfmdata,name,characterdata)
+local helpers = fonts.helpers
+local currentfont = font.current
+
+function helpers.addprivate(tfmdata,name,characterdata)
local properties = tfmdata.properties
local privates = properties.privates
local lastprivate = properties.lastprivate
@@ -915,19 +938,19 @@ function fonts.helpers.addprivate(tfmdata,name,characterdata)
return lastprivate
end
-function fonts.helpers.getprivatenode(tfmdata,name)
+local function getprivatenode(tfmdata,name)
local properties = tfmdata.properties
local privates = properties and properties.privates
if privates then
local p = privates[name]
if p then
- local char = tfmdata.characters[p]
+ local char = tfmdata.characters[p]
local commands = char.commands
if commands then
- local fake = hpack_node(new_special(commands[1][2]))
- fake.width = char.width
+ local fake = hpack_node(new_special(commands[1][2]))
+ fake.width = char.width
fake.height = char.height
- fake.depth = char.depth
+ fake.depth = char.depth
return fake
else
-- todo: set current attribibutes
@@ -937,12 +960,18 @@ function fonts.helpers.getprivatenode(tfmdata,name)
end
end
-function fonts.helpers.hasprivate(tfmdata,name)
+helpers.getprivatenode = getprivatenode
+
+function helpers.hasprivate(tfmdata,name)
local properties = tfmdata.properties
local privates = properties and properties.privates
return privates and privates[name] or false
end
-function commands.getprivatechar(name)
- context(fonts.helpers.getprivatenode(fontdata[font.current()],name))
-end
+implement {
+ name = "getprivatechar",
+ arguments = "string",
+ actions = function(name)
+ context(getprivatenode(fontdata[currentfont()],name))
+ end
+}
diff --git a/Master/texmf-dist/tex/context/base/font-fbk.lua b/Master/texmf-dist/tex/context/base/font-fbk.lua
index 48e2167e656..22644f04674 100644
--- a/Master/texmf-dist/tex/context/base/font-fbk.lua
+++ b/Master/texmf-dist/tex/context/base/font-fbk.lua
@@ -19,18 +19,20 @@ local trace_combining_define = false trackers.register("fonts.composing.defi
trackers.register("fonts.combining", "fonts.composing.define") -- for old times sake (and manuals)
trackers.register("fonts.combining.all", "fonts.composing.*") -- for old times sake (and manuals)
-local report_combining = logs.reporter("fonts","combining")
+local report_combining = logs.reporter("fonts","combining")
-local force_combining = false -- just for demo purposes (see mk)
+local force_combining = false -- just for demo purposes (see mk)
-local allocate = utilities.storage.allocate
+local allocate = utilities.storage.allocate
local fonts = fonts
local handlers = fonts.handlers
local constructors = fonts.constructors
-local registerotffeature = handlers.otf.features.register
-local registerafmfeature = handlers.afm.features.register
+local otf = handlers.otf
+local afm = handlers.afm
+local registerotffeature = otf.features.register
+local registerafmfeature = afm.features.register
local unicodecharacters = characters.data
local unicodefallbacks = characters.fallbacks
@@ -302,3 +304,32 @@ end
-- {'special', 'pdf: /Fm\XX\space Do'},
-- {'special', 'pdf: Q'},
-- {'special', 'pdf: Q'},
+
+-- new and experimental
+
+local everywhere = { ["*"] = { ["*"] = true } } -- or: { ["*"] = { "*" } }
+local noflags = { }
+
+local char_specification = {
+ type = "ligature",
+ features = everywhere,
+ data = characters.splits.char,
+ order = { "char-ligatures" },
+ flags = noflags,
+ prepend = true,
+}
+
+local compat_specification = {
+ type = "ligature",
+ features = everywhere,
+ data = characters.splits.compat,
+ order = { "compat-ligatures" },
+ flags = noflags,
+ prepend = true,
+}
+
+otf.addfeature("char-ligatures", char_specification) -- xlig (extra)
+otf.addfeature("compat-ligatures",compat_specification) -- plig (pseudo)
+
+registerotffeature { name = 'char-ligatures', description = 'unicode char specials to ligatures' }
+registerotffeature { name = 'compat-ligatures', description = 'unicode compat specials to ligatures' }
diff --git a/Master/texmf-dist/tex/context/base/font-fea.mkvi b/Master/texmf-dist/tex/context/base/font-fea.mkvi
index 35a9a642a1b..5f6f1b5d5ad 100644
--- a/Master/texmf-dist/tex/context/base/font-fea.mkvi
+++ b/Master/texmf-dist/tex/context/base/font-fea.mkvi
@@ -123,13 +123,13 @@
{\dotripleargument\font_basics_define_font_feature}
\def\font_basics_define_font_feature[#featureset][#parent][#settings]%
- {\ctxcommand{definefontfeature("#featureset","#parent","#settings")}}
+ {\clf_definefontfeature{#featureset}{#parent}{#settings}}
\unexpanded\def\fontfeatureslist
{\dodoubleargument\font_basics_features_list}
\def\font_basics_features_list[#name][#separator]% todo: arg voor type
- {\cldcommand{featurelist("#name","otf","\luaescapestring{#separator}","yes","no",true,{"number"})}}
+ {\clf_featurelist{#name}{\detokenize{#separator}}}
\attribute\zerocount\zerocount % first in list, so fast match
@@ -143,11 +143,11 @@
% hashing at this end is slower
-\unexpanded\def\addfeature {\doifnextoptionalcselse\font_feature_add_yes \font_feature_add_nop }
-\unexpanded\def\subtractfeature {\doifnextoptionalcselse\font_feature_subtract_yes \font_feature_subtract_nop }
-\unexpanded\def\replacefeature {\doifnextoptionalcselse\font_feature_replace_yes \font_feature_replace_nop }
-\unexpanded\def\resetandaddfeature{\doifnextoptionalcselse\font_feature_reset_add_yes\font_feature_reset_add_nop}
-\unexpanded\def\feature {\doifnextoptionalcselse\font_feature_yes \font_feature_nop }
+\unexpanded\def\addfeature {\doifelsenextoptionalcs\font_feature_add_yes \font_feature_add_nop }
+\unexpanded\def\subtractfeature {\doifelsenextoptionalcs\font_feature_subtract_yes \font_feature_subtract_nop }
+\unexpanded\def\replacefeature {\doifelsenextoptionalcs\font_feature_replace_yes \font_feature_replace_nop }
+\unexpanded\def\resetandaddfeature{\doifelsenextoptionalcs\font_feature_reset_add_yes\font_feature_reset_add_nop}
+\unexpanded\def\feature {\doifelsenextoptionalcs\font_feature_yes \font_feature_nop }
\unexpanded\def\font_feature_add_yes [#feature]{\edef\m_font_feature_asked{#feature}\font_feature_add}
\unexpanded\def\font_feature_add_nop #feature{\edef\m_font_feature_asked{#feature}\font_feature_add}
@@ -176,7 +176,7 @@
\fi}
\unexpanded\def\font_feature_add_indeed
- {\ctxcommand{feature("+","\m_font_feature_list","\m_font_feature_asked")}%
+ {\clf_addfeature{\m_font_feature_list}{\m_font_feature_asked}%
\edef\m_font_feature_list{\m_font_feature_list+\m_font_feature_asked}% also + at the lua end
\c_font_feature_state\plusone
\let\currentfeature\m_font_feature_asked}
@@ -191,7 +191,7 @@
\fi}
\unexpanded\def\font_feature_subtract_indeed
- {\ctxcommand{feature("-","\m_font_feature_list","\m_font_feature_asked")}%
+ {\clf_subtractfeature{\m_font_feature_list}{\m_font_feature_asked}%
\edef\m_font_feature_list{\m_font_feature_list-\m_font_feature_asked}% also - at the lua end
\c_font_feature_state\minusone
\let\currentfeature\m_font_feature_asked}
@@ -206,7 +206,7 @@
\fi}
\unexpanded\def\font_feature_replace_indeed
- {\ctxcommand{feature("=","\m_font_feature_list","\m_font_feature_asked")}%
+ {\clf_replacefeature{\m_font_feature_list}{\m_font_feature_asked}%
\edef\m_font_feature_list{\m_font_feature_list=\m_font_feature_asked}% also = at the lua end
\c_font_feature_state\zerocount
\let\currentfeature\m_font_feature_asked}
@@ -220,7 +220,7 @@
{\let\m_font_feature_asked\empty
\let\currentfeature \s!current
\let\m_font_feature_list \s!current
- \ctxcommand{feature(false)}}
+ \clf_resetfeature}
\unexpanded\def\revivefeature
{\ifx\currentfeature\s!current \else
@@ -228,7 +228,7 @@
\fi}
\unexpanded\def\font_feature_revive_indeed
- {\ctxcommand{feature(true,"\m_font_feature_list")}}
+ {\clf_revivefeature{\m_font_feature_list}}
\unexpanded\def\font_feature_reset_add
{\ifnum\c_font_feature_state=\plusone
@@ -240,7 +240,7 @@
\fi}
\unexpanded\def\font_feature_reset_add_indeed
- {\ctxcommand{feature("+","\s!current","\m_font_feature_asked")}%
+ {\clf_addfeature{\s!current}{\m_font_feature_asked}%
\edef\m_font_feature_list{\s!current+\m_font_feature_asked}% also + at the lua end
\c_font_feature_state\plusone
\let\currentfeature\m_font_feature_asked}
@@ -284,12 +284,12 @@
% just for old times sake:
\unexpanded\def\featureattribute#feature%
- {\ctxcommand{featureattribute("#feature")}}
+ {\clf_featureattribute{#feature}}
\unexpanded\def\setfontfeature#feature%
{\edef\currentfeature{#feature}%
\let\m_font_feature_list\currentfeature
- \ctxcommand{setfontfeature("\currentfeature")}}
+ \clf_setfontfeature{\currentfeature}}
\let\resetfontfeature\resetfeature
@@ -324,11 +324,13 @@
% \doifelsecurrentfonthasfeature{kern}{YES}{NO}
\def\doifelsecurrentfonthasfeature#feature%
- {\ctxcommand{doifelsecurrentfonthasfeature("#feature")}}
+ {\clf_doifelsecurrentfonthasfeature{#feature}}
+
+\let\doifcurrentfonthasfeatureelse\doifelsecurrentfonthasfeature
% new:
-\ctxcommand{registerlanguagefeatures()}
+\clf_registerlanguagefeatures
% also new
diff --git a/Master/texmf-dist/tex/context/base/font-fil.mkvi b/Master/texmf-dist/tex/context/base/font-fil.mkvi
index 158bcda713d..1a20d1cd84a 100644
--- a/Master/texmf-dist/tex/context/base/font-fil.mkvi
+++ b/Master/texmf-dist/tex/context/base/font-fil.mkvi
@@ -89,11 +89,11 @@
\def\font_basics_define_font_synonym_nop
{\expandafter\let\csname\??fontfile\m_font_name\endcsname\m_font_file
- \doifnextoptionalcselse\font_basics_define_font_synonym_nop_opt\font_basics_define_font_synonym_nop_nil}
+ \doifelsenextoptionalcs\font_basics_define_font_synonym_nop_opt\font_basics_define_font_synonym_nop_nil}
\def\font_basics_define_font_synonym_yes
{\expandafter\let\csname\??fontfile\fontclass\m_font_name\endcsname\m_font_file
- \doifnextoptionalcselse\font_basics_define_font_synonym_yes_opt\font_basics_define_font_synonym_yes_nil}
+ \doifelsenextoptionalcs\font_basics_define_font_synonym_yes_opt\font_basics_define_font_synonym_yes_nil}
\def\font_basics_define_font_synonym_nop_opt[#specification]%
{\let\p_features \undefined
@@ -241,6 +241,8 @@
\doubleexpandafter\secondoftwoarguments
\fi\fi}
+\let\doiffontsynonymelse\doifelsefontsynonym
+
%D \macros
%D {tracedfontname}
%D
@@ -290,75 +292,75 @@
% resolve
\def\font_helpers_set_features_yes#name%
- {\ifcsname\??fontfile\fontclass#name\s!features \endcsname\expandafter\let\expandafter\m_font_features % class + symbolic_name
- \csname\??fontfile\fontclass#name\s!features \endcsname\else
- \ifcsname\??fontfile #name\s!features \endcsname\expandafter\let\expandafter\m_font_features % symbolic_name
- \csname\??fontfile #name\s!features \endcsname\else
+ {\ifcsname\??fontfile\fontclass#name\s!features \endcsname \edef\m_font_features % class + symbolic_name
+ {\csname\??fontfile\fontclass#name\s!features \endcsname}\else
+ \ifcsname\??fontfile #name\s!features \endcsname \edef\m_font_features % symbolic_name
+ {\csname\??fontfile #name\s!features \endcsname}\else
\ifcsname\??fontfile\fontclass #name\endcsname\expandafter\font_helpers_set_features_yes % class + parent_name
- \csname\??fontfile\fontclass #name\endcsname\else
- \ifcsname\??fontfile #name\endcsname\expandafter\font_helpers_set_features_yes % parent_name
- \csname\??fontfile #name\endcsname\else
+ \csname\??fontfile\fontclass #name\endcsname \else
+ \ifcsname\??fontfile #name\endcsname \expandafter\font_helpers_set_features_yes % parent_name
+ \csname\??fontfile #name\endcsname \else
\let\m_font_features\empty\fi\fi\fi\fi}
\def\font_helpers_set_fallbacks_yes#name%
- {\ifcsname\??fontfile\fontclass#name\s!fallbacks\endcsname\expandafter\let\expandafter\m_font_fallbacks
- \csname\??fontfile\fontclass#name\s!fallbacks\endcsname\else
- \ifcsname\??fontfile #name\s!fallbacks\endcsname\expandafter\let\expandafter\m_font_fallbacks
- \csname\??fontfile #name\s!fallbacks\endcsname\else
- \ifcsname\??fontfile\fontclass #name\endcsname\expandafter\font_helpers_set_fallbacks_yes
- \csname\??fontfile\fontclass #name\endcsname\else
- \ifcsname\??fontfile #name\endcsname\expandafter\font_helpers_set_fallbacks_yes
- \csname\??fontfile #name\endcsname\else
+ {\ifcsname\??fontfile\fontclass#name\s!fallbacks\endcsname \edef\m_font_fallbacks
+ {\csname\??fontfile\fontclass#name\s!fallbacks\endcsname}\else
+ \ifcsname\??fontfile #name\s!fallbacks\endcsname \edef\m_font_fallbacks
+ {\csname\??fontfile #name\s!fallbacks\endcsname}\else
+ \ifcsname\??fontfile\fontclass #name\endcsname \expandafter\font_helpers_set_fallbacks_yes
+ \csname\??fontfile\fontclass #name\endcsname \else
+ \ifcsname\??fontfile #name\endcsname \expandafter\font_helpers_set_fallbacks_yes
+ \csname\??fontfile #name\endcsname \else
\let\m_font_fallbacks\empty\fi\fi\fi\fi}
\def\font_helpers_set_goodies_yes#name%
- {\ifcsname\??fontfile\fontclass#name\s!goodies \endcsname\expandafter\let\expandafter\m_font_goodies
- \csname\??fontfile\fontclass#name\s!goodies \endcsname\else
- \ifcsname\??fontfile #name\s!goodies \endcsname\expandafter\let\expandafter\m_font_goodies
- \csname\??fontfile #name\s!goodies \endcsname\else
- \ifcsname\??fontfile\fontclass #name\endcsname\expandafter\font_helpers_set_goodies_yes
- \csname\??fontfile\fontclass #name\endcsname\else
- \ifcsname\??fontfile #name\endcsname\expandafter\font_helpers_set_goodies_yes
- \csname\??fontfile #name\endcsname\else
+ {\ifcsname\??fontfile\fontclass#name\s!goodies \endcsname \edef\m_font_goodies
+ {\csname\??fontfile\fontclass#name\s!goodies \endcsname}\else
+ \ifcsname\??fontfile #name\s!goodies \endcsname \edef\m_font_goodies
+ {\csname\??fontfile #name\s!goodies \endcsname}\else
+ \ifcsname\??fontfile\fontclass #name\endcsname \expandafter\font_helpers_set_goodies_yes
+ \csname\??fontfile\fontclass #name\endcsname \else
+ \ifcsname\??fontfile #name\endcsname \expandafter\font_helpers_set_goodies_yes
+ \csname\??fontfile #name\endcsname \else
\let\m_font_goodies\empty\fi\fi\fi\fi}
\def\font_helpers_set_designsize_yes#name%
- {\ifcsname\??fontfile\fontclass#name\s!designsize\endcsname\expandafter\let\expandafter\m_font_designsize
- \csname\??fontfile\fontclass#name\s!designsize\endcsname\else
- \ifcsname\??fontfile #name\s!designsize\endcsname\expandafter\let\expandafter\m_font_designsize
- \csname\??fontfile #name\s!designsize\endcsname\else
- \ifcsname\??fontfile\fontclass #name\endcsname\expandafter\font_helpers_set_designsize_yes
- \csname\??fontfile\fontclass #name\endcsname\else
- \ifcsname\??fontfile #name\endcsname\expandafter\font_helpers_set_designsize_yes
- \csname\??fontfile #name\endcsname\else
+ {\ifcsname\??fontfile\fontclass#name\s!designsize\endcsname \edef\m_font_designsize
+ {\csname\??fontfile\fontclass#name\s!designsize\endcsname}\else
+ \ifcsname\??fontfile #name\s!designsize\endcsname \edef\m_font_designsize
+ {\csname\??fontfile #name\s!designsize\endcsname}\else
+ \ifcsname\??fontfile\fontclass #name\endcsname \expandafter\font_helpers_set_designsize_yes
+ \csname\??fontfile\fontclass #name\endcsname \else
+ \ifcsname\??fontfile #name\endcsname \expandafter\font_helpers_set_designsize_yes
+ \csname\??fontfile #name\endcsname \else
\let\m_font_designsize\empty\fi\fi\fi\fi}
\def\font_helpers_set_features_nop#name%
- {\ifcsname\??fontfile#name\s!features \endcsname\expandafter\let\expandafter\m_font_features
- \csname\??fontfile#name\s!features \endcsname\else
- \ifcsname\??fontfile #name\endcsname\expandafter\font_helpers_set_features_nop
- \csname\??fontfile #name\endcsname\else
+ {\ifcsname\??fontfile#name\s!features \endcsname \edef\m_font_features
+ {\csname\??fontfile#name\s!features \endcsname}\else
+ \ifcsname\??fontfile #name\endcsname \expandafter\font_helpers_set_features_nop
+ \csname\??fontfile #name\endcsname \else
\let\m_font_features\empty\fi\fi}
\def\font_helpers_set_fallbacks_nop#name%
- {\ifcsname\??fontfile#name\s!fallbacks\endcsname\expandafter\let\expandafter\m_font_fallbacks
- \csname\??fontfile#name\s!fallbacks\endcsname\else
- \ifcsname\??fontfile #name\endcsname\expandafter\font_helpers_set_fallbacks_nop
- \csname\??fontfile #name\endcsname\else
+ {\ifcsname\??fontfile#name\s!fallbacks\endcsname \edef\m_font_fallbacks
+ {\csname\??fontfile#name\s!fallbacks\endcsname}\else
+ \ifcsname\??fontfile #name\endcsname \expandafter\font_helpers_set_fallbacks_nop
+ \csname\??fontfile #name\endcsname \else
\let\m_font_fallbacks\empty\fi\fi}
\def\font_helpers_set_goodies_nop#name%
- {\ifcsname\??fontfile#name\s!goodies \endcsname\expandafter\let\expandafter\m_font_goodies
- \csname\??fontfile#name\s!goodies \endcsname\else
- \ifcsname\??fontfile #name\endcsname\expandafter\font_helpers_set_goodies_nop
- \csname\??fontfile #name\endcsname\else
+ {\ifcsname\??fontfile#name\s!goodies \endcsname \edef\m_font_goodies
+ {\csname\??fontfile#name\s!goodies \endcsname}\else
+ \ifcsname\??fontfile #name\endcsname \expandafter\font_helpers_set_goodies_nop
+ \csname\??fontfile #name\endcsname \else
\let\m_font_goodies\empty\fi\fi}
\def\font_helpers_set_designsize_nop#name%
- {\ifcsname\??fontfile#name\s!designsize\endcsname\expandafter\let\expandafter\m_font_designsize
- \csname\??fontfile#name\s!designsize\endcsname\else
- \ifcsname\??fontfile #name\endcsname\expandafter\font_helpers_set_designsize_nop
- \csname\??fontfile #name\endcsname\else
+ {\ifcsname\??fontfile#name\s!designsize\endcsname \edef\m_font_designsize
+ {\csname\??fontfile#name\s!designsize\endcsname}\else
+ \ifcsname\??fontfile #name\endcsname \expandafter\font_helpers_set_designsize_nop
+ \csname\??fontfile #name\endcsname \else
\let\m_font_designsize\empty\fi\fi}
\def\font_helpers_update_font_parameters_yes
diff --git a/Master/texmf-dist/tex/context/base/font-gds.lua b/Master/texmf-dist/tex/context/base/font-gds.lua
index 9e7cb841e3f..073d9ed57d1 100644
--- a/Master/texmf-dist/tex/context/base/font-gds.lua
+++ b/Master/texmf-dist/tex/context/base/font-gds.lua
@@ -9,10 +9,12 @@ if not modules then modules = { } end modules ['font-gds'] = {
-- depends on ctx
local type, next, tonumber = type, next, tonumber
-local gmatch, format, lower, find, splitup = string.gmatch, string.format, string.lower, string.find, string.splitup
-local texsp = tex.sp
+local gmatch, lower, find, splitup = string.gmatch, string.lower, string.find, string.splitup
-local fonts, nodes, attributes, node = fonts, nodes, attributes, node
+local fonts = fonts
+local nodes = nodes
+local attributes = attributes
+local node = node
local trace_goodies = false trackers.register("fonts.goodies", function(v) trace_goodies = v end)
local report_goodies = logs.reporter("fonts","goodies")
@@ -20,6 +22,11 @@ local report_goodies = logs.reporter("fonts","goodies")
local allocate = utilities.storage.allocate
local setmetatableindex = table.setmetatableindex
+local implement = interfaces.implement
+
+local texsp = tex.sp
+local formatters = string.formatters
+
local otf = fonts.handlers.otf
local afm = fonts.handlers.afm
local tfm = fonts.handlers.tfm
@@ -429,7 +436,7 @@ local function setextrafeatures(tfmdata)
addotffeature(tfmdata.shared.rawdata,feature,specification)
registerotffeature {
name = feature,
- description = format("extra: %s",feature)
+ description = formatters["extra: %s"](feature)
}
end
end
@@ -819,8 +826,17 @@ end
-- interface
-commands.loadfontgoodies = fontgoodies.load
-commands.enablefontcolorschemes = colorschemes.enable
+implement {
+ name = "loadfontgoodies",
+ actions = fontgoodies.load,
+ arguments = "string"
+}
+
+implement {
+ name = "enablefontcolorschemes",
+ onlyonce = true,
+ actions = colorschemes.enable
+}
-- weird place ... depends on math
@@ -853,7 +869,7 @@ local function setkeepligatures(tfmdata,value)
if letterspacing then
local keptligatures = letterspacing.keptligatures
if keptligatures then
- local unicodes = tfmdata.resources.unicodes
+ local unicodes = tfmdata.resources.unicodes -- so we accept names
local hash = { }
for k, v in next, keptligatures do
local u = unicodes[k]
diff --git a/Master/texmf-dist/tex/context/base/font-gds.mkvi b/Master/texmf-dist/tex/context/base/font-gds.mkvi
index 6d979842872..e9c34e807af 100644
--- a/Master/texmf-dist/tex/context/base/font-gds.mkvi
+++ b/Master/texmf-dist/tex/context/base/font-gds.mkvi
@@ -46,10 +46,10 @@
\definesystemattribute[colorscheme][public]
\unexpanded\def\loadfontgoodies[#filename]%
- {\ctxcommand{loadfontgoodies("#filename")}}
+ {\clf_loadfontgoodies{#filename}}
\unexpanded\def\setfontcolorscheme % will move to the lua end
- {\ctxcommand{enablefontcolorschemes()}%
+ {\clf_enablefontcolorschemes
\unexpanded\xdef\setfontcolorscheme[##1]{\attribute\colorschemeattribute##1\relax}%
\setfontcolorscheme}
diff --git a/Master/texmf-dist/tex/context/base/font-hsh.lua b/Master/texmf-dist/tex/context/base/font-hsh.lua
index 1b0dd08b83c..07acf2138c7 100644
--- a/Master/texmf-dist/tex/context/base/font-hsh.lua
+++ b/Master/texmf-dist/tex/context/base/font-hsh.lua
@@ -35,6 +35,8 @@ local italics = hashes.italics or allocate()
local lastmathids = hashes.lastmathids or allocate()
local dynamics = hashes.dynamics or allocate()
local unicodes = hashes.unicodes or allocate()
+local originals = hashes.originals or allocate()
+local modes = hashes.modes or allocate()
hashes.characters = characters
hashes.descriptions = descriptions
@@ -52,6 +54,8 @@ hashes.italics = italics
hashes.lastmathids = lastmathids
hashes.dynamics = dynamics
hashes.unicodes = unicodes
+hashes.originals = originals
+hashes.modes = modes
local nodepool = nodes.pool
local dummyglyph = nodepool.register(nodepool.glyph())
@@ -261,21 +265,41 @@ setmetatableindex(dynamics, function(t,k)
end
end)
-setmetatableindex(unicodes, function(t,k)
+setmetatableindex(unicodes, function(t,k) -- always a unicode
+ if k == true then
+ return unicodes[currentfont()]
+ else
+ local resources = resources[k]
+ local unicodes = resources and resources.unicodes or { }
+ t[k] = unicodes
+ return unicodes
+ end
+end)
+
+setmetatableindex(originals, function(t,k) -- always a unicode
if k == true then
return originals[currentfont()]
else
- local resources = resources[k]
- local originals = resources and resources.originals or { }
- local characters = characters[k]
- local unicodes = { }
- setmetatableindex(unicodes,function(t,k)
- local v = originals[characters[k].index] or k
- t[k] = v
+ local resolved = { }
+ setmetatableindex(resolved,function(t,name)
+ local u = unicodes[k][name]
+ local d = u and descriptions[k][u]
+ local v = d and d.unicode or u or 0 -- so we return notdef (at least for the moment)
+ t[name] = u
return v
end)
- t[k] = unicodes
- return unicodes
+ t[k] = resolved
+ return resolved
+ end
+end)
+
+setmetatableindex(modes, function(t,k)
+ if k == true then
+ return modes[currentfont()]
+ else
+ local mode = properties[k].mode or "base"
+ t[k] = mode
+ return mode
end
end)
diff --git a/Master/texmf-dist/tex/context/base/font-ini.lua b/Master/texmf-dist/tex/context/base/font-ini.lua
index 884b22474c2..c547f89acf9 100644
--- a/Master/texmf-dist/tex/context/base/font-ini.lua
+++ b/Master/texmf-dist/tex/context/base/font-ini.lua
@@ -29,4 +29,4 @@ fonts.readers = { }
fonts.definers = { methods = { } }
fonts.loggers = { register = function() end }
-fontloader.totable = fontloader.to_table
+fontloader.totable = fontloader.to_table -- not used
diff --git a/Master/texmf-dist/tex/context/base/font-ini.mkvi b/Master/texmf-dist/tex/context/base/font-ini.mkvi
index c1e6d939055..c04952a9e89 100644
--- a/Master/texmf-dist/tex/context/base/font-ini.mkvi
+++ b/Master/texmf-dist/tex/context/base/font-ini.mkvi
@@ -363,7 +363,7 @@
\let\thedefinedfont\relax % not to be confused with \everydefinefont
\unexpanded\def\definedfont
- {\doifnextoptionalcselse\font_basics_defined_font_yes\font_basics_defined_font_nop}
+ {\doifelsenextoptionalcs\font_basics_defined_font_yes\font_basics_defined_font_nop}
\def\font_basics_defined_font_yes[#specification]%
{\c_font_feature_inheritance_mode\c_font_feature_inheritance_fontonly
@@ -419,24 +419,39 @@
%D When we assign for instance 12pt to a \DIMENSION\ register the \type
%D {\the}'d value comes out as 12.0pt, which is often not the way users
%D specify the bodyfont size. Therefore we use normalized values. They
-%D are caches to save overhead in \LUA\ calls.
+%D are cached to save overhead in \LUA\ calls.
-\setnewconstant\fontdigits\plustwo
+% \setnewconstant\fontdigits\plustwo % from now on always 2
\installcorenamespace{fontnormalizedbody}
+% \def\normalizebodyfontsize#macro#body%
+% {\expandafter\let\expandafter#macro\csname\??fontnormalizedbody\number\fontdigits:\number\dimexpr#body\endcsname
+% \ifx#macro\relax
+% \normalizebodyfontsize_indeed#macro{#body}%
+% \fi}
+%
+% \def\normalizebodyfontsize_indeed#macro#body%
+% {\edef#macro{\ctxcommand{nbfs(\number\dimexpr#body,\number\fontdigits)}}%
+% \global\expandafter\let\csname\??fontnormalizedbody\number\fontdigits:\number\dimexpr#body\endcsname#macro}
+%
+% \def\thenormalizedbodyfontsize#body%
+% {\ctxcommand{nbfs(\number\dimexpr#body\relax,\number\fontdigits)}}
+%
+% caching is less relevant now
+
\def\normalizebodyfontsize#macro#body%
- {\expandafter\let\expandafter#macro\csname\??fontnormalizedbody\number\fontdigits:\number\dimexpr#body\endcsname
+ {\expandafter\let\expandafter#macro\csname\??fontnormalizedbody\number\dimexpr#body\endcsname
\ifx#macro\relax
\normalizebodyfontsize_indeed#macro{#body}%
\fi}
\def\normalizebodyfontsize_indeed#macro#body%
- {\edef#macro{\ctxcommand{nbfs(\number\dimexpr#body,\number\fontdigits)}}%
- \global\expandafter\let\csname\??fontnormalizedbody\number\fontdigits:\number\dimexpr#body\endcsname#macro}
+ {\edef#macro{\clf_nbfs\dimexpr#body\relax}%
+ \global\expandafter\let\csname\??fontnormalizedbody\number\dimexpr#body\endcsname#macro}
\def\thenormalizedbodyfontsize#body%
- {\ctxcommand{nbfs(\number\dimexpr#body\relax,\number\fontdigits)}}
+ {\clf_nbfs\dimexpr#body\relax}
\edef\normalizedglobalbodyfontsize{\thenormalizedbodyfontsize\bodyfontsize}
\edef\normalizedlocalbodyfontsize {\thenormalizedbodyfontsize\bodyfontsize}
@@ -723,7 +738,9 @@
\unexpanded\def\font_helpers_low_level_define#specification#csname%
{% we can now set more at the lua end
- \ctxcommand{definefont_one(\!!bs\luaescapestring{#specification}\!!es)}% the escapestring catches at \somedimen
+ \global\let\somefontname\defaultfontfile
+ \let\somefontsize\empty
+ \clf_definefont_one{\detokenize\expandafter{\normalexpanded{#specification}}}% the escapestring catches at \somedimen
% sets \scaledfontmode and \somefontname and \somefontsize
\ifcase\fontface\relax
% \let\v_font_size_absolute\textface % fontbody
@@ -774,39 +791,43 @@
\else
\d_font_scaled_text_face\textface
\fi
- \edef\somefontspec{at \number\d_font_scaled_font_size sp}% probably no longer used, needs checking
+ \edef\somefontspec{at \number\d_font_scaled_font_size sp}%
\edef\somefontfile{\truefontname\somefontname}%
\ifx\somefontfile\s!unknown
\edef\somefontfile{\defaultfontfile}%
\fi
- \ifx\somefontfile\s!unknown
- \edef\somefontfile{\defaultfontfile}%
- \fi
\font_helpers_update_font_parameters
\font_helpers_update_font_class_parameters
% \writestatus{fonts}{low level define: #csname/\somefontfile/\number\d_font_scaled_font_size/\fontface/\number\d_font_scaled_text_face}%
- \ctxcommand{definefont_two(
- \ifx\fontclass\empty false\else true\fi,
- "#csname",
- \!!bs\somefontfile\!!es,
- \number\d_font_scaled_font_size,
- \number\c_font_feature_inheritance_mode,
- "\m_font_class_features",
- "\m_font_features",
- "\m_font_class_fallbacks",
- "\m_font_fallbacks",
- \fontface, % 1/2/3: text script scriptscript 0/4/5: body x xx
- \number\d_font_scaled_text_face,
- "\number\relativefontid", % experiment
- "\m_font_class_goodies", % experiment (not yet used)
- "\m_font_goodies",
- "\m_font_class_designsize",
- "\m_font_designsize",
- \number\scaledfontmode
- )}%
- \edef\somefontspec{at \number\scaledfontsize sp}% we need the resolved designsize (for fallbacks)
- \expandafter\let\expandafter\lastrawfontcall\csname#csname\endcsname
- \the\everydefinefont
+ \clf_definefont_two
+ \ifx\fontclass\empty\s!false\else\s!true\fi
+ {#csname}%
+ {\somefontfile}%
+ \d_font_scaled_font_size
+ \c_font_feature_inheritance_mode
+ {\m_font_class_features}%
+ {\m_font_features}%
+ {\m_font_class_fallbacks}%
+ {\m_font_fallbacks}%
+ \fontface
+ \d_font_scaled_text_face
+ \relativefontid
+ {\m_font_class_goodies}%
+ {\m_font_goodies}%
+ {\m_font_class_designsize}%
+ {\m_font_designsize}%
+ \scaledfontmode
+ \relax
+ \ifcase\scaledfontsize
+ %\scaledfontsize\plusone
+ \let\somefontspec\empty
+ \let\lastrawfontcall\relax
+ \expandafter\let\csname#csname\endcsname\relax
+ \else
+ \edef\somefontspec{at \number\scaledfontsize sp}% we need the resolved designsize (for fallbacks)
+ \expandafter\let\expandafter\lastrawfontcall\csname#csname\endcsname
+ \the\everydefinefont
+ \fi
\c_font_feature_inheritance_mode\c_font_feature_inheritance_default}
\def\font_helpers_check_body_scale#fontsize% gets character (x xx a etc)
@@ -830,10 +851,10 @@
%D The following macros are used at the \LUA\ end. Watch the \type {\normal}
%D hackery: this makes the mkvi parser happy.
-\normaldef\fntsetdefname {\global\let\somefontname\defaultfontfile} % do before calling
-\normaldef\fntsetsomename{\normalgdef\somefontname} % takes argument
-\normaldef\fntsetnopsize {\let\somefontsize\empty} % do before calling
-\normaldef\fntsetsomesize{\normaldef\somefontsize} % takes argument
+% \normaldef\fntsetdefname {\global\let\somefontname\defaultfontfile} % do before calling
+% \normaldef\fntsetnopsize {\let\somefontsize\empty} % do before calling
+% \normaldef\fntsetsomename{\normalgdef\somefontname} % takes argument
+% \normaldef\fntsetsomesize{\normaldef\somefontsize} % takes argument
\newif\ifskipfontcharacteristics \skipfontcharacteristicstrue
@@ -878,7 +899,7 @@
\fi}
\def\font_basics_define_font_a[#name][#specification][#settings]% [name][spec][1.6 | line=10pt | setup_id]
- {\doifsetupselse{#settings}%
+ {\doifelsesetups{#settings}%
{\setuvalue{#name}{\font_basics_define_font_with_setups {#name}{#specification}{#settings}}}
{\setuvalue{#name}{\font_basics_define_font_with_parameters{#name}{#specification}{#settings}}}}
@@ -900,11 +921,19 @@
\unexpanded\def\definefrozenfont
{\dotripleempty\font_basics_define_frozen_font}
+% \def\font_basics_define_frozen_font[#name][#specification][#settings]%
+% {\begingroup
+% \font_basics_define_font[#name][#specification][#settings]%
+% \csname#name\endcsname
+% \expandafter\expandafter\expandafter\endgroup\expandafter\let\csname#name\endcsname\lastrawfontcall}
+
\def\font_basics_define_frozen_font[#name][#specification][#settings]%
{\begingroup
\font_basics_define_font[#name][#specification][#settings]%
\csname#name\endcsname
- \expandafter\endgroup\expandafter\let\csname#name\endcsname\lastrawfontcall}
+ \global\let\lastglobalrawfontcall\lastrawfontcall
+ \endgroup
+ \expandafter\let\csname#name\endcsname\lastglobalrawfontcall}
%D The instance namespace protection makes the switch local so that we can redefine a
%D logical name and/or change the size in between.
@@ -1158,7 +1187,9 @@
\installcorenamespace{fontenvironmentknown}
-\let\bodyfontenvironmentlist\empty % used in font-run (might change)
+% \let\bodyfontenvironmentlist\empty % used in font-run (might change)
+
+\newtoks\bodyfontenvironmentlist
\def\font_helpers_register_environment#class#body%
{\expandafter\let\csname\??fontenvironmentknown#class#body\endcsname\empty}
@@ -1179,6 +1210,12 @@
%D a bodyfont is loaded but changing them afterwards can be sort of tricky as
%D values are not consulted afterwards.
+\def\processbodyfontenvironmentlist#1% no \unexpanded as then we cannot use it in alignments
+ {\clf_processbodyfontsizes{\strippedcsname#1}}
+
+\def\bodyfontenvironmentlist
+ {\clf_getbodyfontsizes}
+
\def\font_basics_define_body_font_environment_class[#class][#body][#settings]%
{\edef\m_font_body{#body}%
\ifx\m_font_body\s!default
@@ -1187,7 +1224,8 @@
\else
\normalizebodyfontsize\m_font_body_normalized\m_font_body
\font_basics_define_body_font_environment_size[#class][\m_font_body_normalized][#settings]%
- \addtocommalist\m_font_body_normalized\bodyfontenvironmentlist
+ %\addtocommalist\m_font_body_normalized\bodyfontenvironmentlist
+ \clf_registerbodyfontsize{\m_font_body_normalized}%
\fi}
%D The empty case uses the same code but needs to ignore the current class
@@ -1367,19 +1405,19 @@
{\font_basics_define_body_font_a[bwhatever][\s!rm][]}
\unexpanded\def\font_basics_define_body_font_a[#whatever]%
- {\doifnumberelse{#whatever}%
+ {\doifelsenumber{#whatever}%
\font_basics_define_body_font_body
\font_basics_define_body_font_name
[#whatever]}
\unexpanded\def\font_basics_define_body_font_body[#body][#style][#specification]%
- {\doifassignmentelse{#specification}
+ {\doifelseassignment{#specification}
\font_basics_define_body_font_body_assignment
\font_basics_define_body_font_body_identifier
[#body][#style][#specification]}%
\unexpanded\def\font_basics_define_body_font_name[#name][#style][#specification]%
- {\doifassignmentelse{#specification}
+ {\doifelseassignment{#specification}
\font_basics_define_body_font_name_assignment
\font_basics_define_body_font_name_identifier
[#name][#style][#specification]}%
@@ -1640,13 +1678,13 @@
\fi}
\def\font_helpers_set_font_check_size#option%
- {\doifnumberelse{#option}{\font_helpers_check_bodyfont_environment{#option}{#option}}\donothing}
+ {\doifelsenumber{#option}{\font_helpers_check_bodyfont_environment{#option}{#option}}\donothing}
\def\font_helpers_set_font_set_font#method#option% method=1: set, method=2: switch
{\doifsomething{#option}{\font_helpers_set_font_set_font_option{#method}{#option}}}
\def\font_helpers_set_font_set_font_option#method#option%
- {\doifnumberelse{#option}%
+ {\doifelsenumber{#option}%
\font_helpers_set_font_set_font_option_body
\font_helpers_set_font_set_font_option_keyword
{#method}{#option}{#option}}
@@ -1988,8 +2026,29 @@
%D takes a bit more time. Keep in mind that the fontsize is
%D represented by a character or empty.
-\unexpanded\def\tx {\font_helpers_set_current_font_x_alternative \fontalternative}
-\unexpanded\def\txx{\font_helpers_set_current_font_xx_alternative\fontalternative}
+% \unexpanded\def\tx {\font_helpers_set_current_font_x_alternative \fontalternative}
+% \unexpanded\def\txx{\font_helpers_set_current_font_xx_alternative\fontalternative}
+
+\unexpanded\def\tx
+ {\ifmmode
+ \scriptstyle
+ \else
+ \let\fontface\!!plusfour
+ \let\fontalternative\fontalternative
+ \font_helpers_synchronize_font
+ \fi
+ \currentxfontsize\plusone
+ \let\tx\txx}
+
+\unexpanded\def\txx
+ {\ifmmode
+ \scriptscriptstyle
+ \else
+ \let\fontface\!!plusfive
+ \let\fontalternative\fontalternative
+ \font_helpers_synchronize_font
+ \fi
+ \currentxfontsize\plustwo}
\let\normaltx \tx
\let\normaltxx\txx
@@ -2082,7 +2141,7 @@
% \newtoks \everyswitchtobodyfont
\unexpanded\def\setupbodyfont
- {\doifnextoptionalcselse\font_basics_setupbodyfont_yes\font_basics_setupbodyfont_nop}
+ {\doifelsenextoptionalcs\font_basics_setupbodyfont_yes\font_basics_setupbodyfont_nop}
\def\font_basics_setupbodyfont_nop
{\restoreglobalbodyfont
@@ -2114,6 +2173,13 @@
\unexpanded\def\switchtobodyfont[#specification]% could become an ifx
{\doifsomething{#specification}{\font_basics_switchtobodyfont{#specification}}}
+
+\unexpanded\def\usebodyfontparameter#1%
+ {\edef\m_font_bodyfont_asked{#1\c!bodyfont}%
+ \ifx\m_font_bodyfont_asked\empty\else
+ \font_basics_switchtobodyfont\m_font_bodyfont_asked
+ \fi}
+
\def\font_helpers_switch_bodyfont_step
{\font_basics_switch_points\m_font_step
\font_basics_switch_style \fontstyle}
@@ -2169,14 +2235,28 @@
%D Handy for manuals:
-\unexpanded\def\fontchar#character%
- {\ctxcommand{fontchar("#character")}}
-%D The next auxilliary macro is an alternative to \type
-%D {\fontname}.
+%D The \type {\tochar} commmand takes a specification:
+%D
+%D \starttabulate[|l|l|l|]
+%D \NC e \NC entity \NC e:eacute \NC \NR
+%D \NC x \NC hexadecimal unicode \NC x:013D \NC \NR
+%D \NC d \NC decimal unicode \NC d:123 \NC \NR
+%D \NC s \NC hexadecimal index (slot) \NC s:210D \NC \NR
+%D \NC i \NC decimal index \NC i:456 \NC \NR
+%D \NC n \NC name \NC n:eight \NC \NR
+%D \NC c \NC name \NC c:x \NC \NR
+%D \stoptabulate
+%D
+%D This is an expandable command!
+
+\unexpanded\def\fontchar #character{\clf_fontchar{#character}}
+\unexpanded\def\fontcharbyindex #index{\clf_fontcharbyindex#index\relax}
+ \def\tochar #specifications{\clf_tochar{#specifications}} % expanded (also used in edef)
+
+%D The next auxilliary macro is an alternative to \type {\fontname}.
-\def\purefontname#font{\ctxcommand{purefontname("\fontname#font")}}
-%def\purefontname#font{\ctxcommand{purefontname(\number\fontid#font)}}
+\def\purefontname#font{\clf_purefontname{\fontname#font}}
%D \macros
%D {switchstyleonly}
@@ -2191,7 +2271,7 @@
%D \stoptyping
\unexpanded\def\switchstyleonly
- {\doifnextoptionalcselse\font_basics_switch_style_only_opt\font_basics_switch_style_only_arg}
+ {\doifelsenextoptionalcs\font_basics_switch_style_only_opt\font_basics_switch_style_only_arg}
\def\font_basics_switch_style_only_arg#name% stupid version
{\font_helpers_set_current_font_style{\csname\??fontshortstyle\checkedstrippedcsname#name\endcsname}%
diff --git a/Master/texmf-dist/tex/context/base/font-inj.lua b/Master/texmf-dist/tex/context/base/font-inj.lua
new file mode 100644
index 00000000000..cb9ed891cfc
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/font-inj.lua
@@ -0,0 +1,1052 @@
+if not modules then modules = { } end modules ['font-inj'] = {
+ version = 1.001,
+ comment = "companion to font-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files",
+}
+
+-- This property based variant is not faster but looks nicer than the attribute one. We
+-- need to use rawget (which is apbout 4 times slower than a direct access but we cannot
+-- get/set that one for our purpose!
+
+if not nodes.properties then return end
+
+local next, rawget = next, rawget
+local utfchar = utf.char
+local fastcopy = table.fastcopy
+
+local trace_injections = false trackers.register("fonts.injections", function(v) trace_injections = v end)
+
+local report_injections = logs.reporter("fonts","injections")
+
+local attributes, nodes, node = attributes, nodes, node
+
+fonts = fonts
+local fontdata = fonts.hashes.identifiers
+
+nodes.injections = nodes.injections or { }
+local injections = nodes.injections
+
+local nodecodes = nodes.nodecodes
+local glyph_code = nodecodes.glyph
+local disc_code = nodecodes.disc
+local kern_code = nodecodes.kern
+
+local nuts = nodes.nuts
+local nodepool = nuts.pool
+
+local newkern = nodepool.kern
+
+local tonode = nuts.tonode
+local tonut = nuts.tonut
+
+local getfield = nuts.getfield
+local setfield = nuts.setfield
+local getnext = nuts.getnext
+local getprev = nuts.getprev
+local getid = nuts.getid
+local getfont = nuts.getfont
+local getsubtype = nuts.getsubtype
+local getchar = nuts.getchar
+
+local traverse_id = nuts.traverse_id
+local insert_node_before = nuts.insert_before
+local insert_node_after = nuts.insert_after
+local find_tail = nuts.tail
+
+local properties = nodes.properties.data
+
+function injections.installnewkern(nk)
+ newkern = nk or newkern
+end
+
+local nofregisteredkerns = 0
+local nofregisteredpairs = 0
+local nofregisteredmarks = 0
+local nofregisteredcursives = 0
+----- markanchors = { } -- one base can have more marks
+local keepregisteredcounts = false
+
+function injections.keepcounts()
+ keepregisteredcounts = true
+end
+
+function injections.resetcounts()
+ nofregisteredkerns = 0
+ nofregisteredpairs = 0
+ nofregisteredmarks = 0
+ nofregisteredcursives = 0
+ keepregisteredcounts = false
+end
+
+-- We need to make sure that a possible metatable will not kick in
+-- unexpectedly.
+
+function injections.reset(n)
+ local p = rawget(properties,n)
+ if p and rawget(p,"injections") then
+ p.injections = nil
+ end
+end
+
+function injections.copy(target,source)
+ local sp = rawget(properties,source)
+ if sp then
+ local tp = rawget(properties,target)
+ local si = rawget(sp,"injections")
+ if si then
+ si = fastcopy(si)
+ if tp then
+ tp.injections = si
+ else
+ propertydata[target] = {
+ injections = si,
+ }
+ end
+ else
+ if tp then
+ tp.injections = nil
+ end
+ end
+ end
+end
+
+function injections.setligaindex(n,index)
+ local p = rawget(properties,n)
+ if p then
+ local i = rawget(p,"injections")
+ if i then
+ i.ligaindex = index
+ else
+ p.injections = {
+ ligaindex = index
+ }
+ end
+ else
+ properties[n] = {
+ injections = {
+ ligaindex = index
+ }
+ }
+ end
+end
+
+function injections.getligaindex(n,default)
+ local p = rawget(properties,n)
+ if p then
+ local i = rawget(p,"injections")
+ if i then
+ return i.ligaindex or default
+ end
+ end
+ return default
+end
+
+function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmnext) -- hm: nuts or nodes
+ local dx = factor*(exit[1]-entry[1])
+ local dy = -factor*(exit[2]-entry[2])
+ local ws, wn = tfmstart.width, tfmnext.width
+ nofregisteredcursives = nofregisteredcursives + 1
+ if rlmode < 0 then
+ dx = -(dx + wn)
+ else
+ dx = dx - ws
+ end
+ --
+ local p = rawget(properties,start)
+ if p then
+ local i = rawget(p,"injections")
+ if i then
+ i.cursiveanchor = true
+ else
+ p.injections = {
+ cursiveanchor = true,
+ }
+ end
+ else
+ properties[start] = {
+ injections = {
+ cursiveanchor = true,
+ },
+ }
+ end
+ local p = rawget(properties,nxt)
+ if p then
+ local i = rawget(p,"injections")
+ if i then
+ i.cursivex = dx
+ i.cursivey = dy
+ else
+ p.injections = {
+ cursivex = dx,
+ cursivey = dy,
+ }
+ end
+ else
+ properties[nxt] = {
+ injections = {
+ cursivex = dx,
+ cursivey = dy,
+ },
+ }
+ end
+ return dx, dy, nofregisteredcursives
+end
+
+function injections.setpair(current,factor,rlmode,r2lflag,spec,injection) -- r2lflag & tfmchr not used
+ local x, y, w, h = factor*spec[1], factor*spec[2], factor*spec[3], factor*spec[4]
+ if x ~= 0 or w ~= 0 or y ~= 0 or h ~= 0 then -- okay?
+ local yoffset = y - h
+ local leftkern = x -- both kerns are set in a pair kern compared
+ local rightkern = w - x -- to normal kerns where we set only leftkern
+ if leftkern ~= 0 or rightkern ~= 0 or yoffset ~= 0 then
+ nofregisteredpairs = nofregisteredpairs + 1
+ if rlmode and rlmode < 0 then
+ leftkern, rightkern = rightkern, leftkern
+ end
+ local p = rawget(properties,current)
+ if p then
+ local i = rawget(p,"injections")
+ if i then
+ if leftkern ~= 0 then
+ i.leftkern = (i.leftkern or 0) + leftkern
+ end
+ if rightkern ~= 0 then
+ i.rightkern = (i.rightkern or 0) + rightkern
+ end
+ if yoffset ~= 0 then
+ i.yoffset = (i.yoffset or 0) + yoffset
+ end
+ elseif leftkern ~= 0 or rightkern ~= 0 then
+ p.injections = {
+ leftkern = leftkern,
+ rightkern = rightkern,
+ yoffset = yoffset,
+ }
+ else
+ p.injections = {
+ yoffset = yoffset,
+ }
+ end
+ elseif leftkern ~= 0 or rightkern ~= 0 then
+ properties[current] = {
+ injections = {
+ leftkern = leftkern,
+ rightkern = rightkern,
+ yoffset = yoffset,
+ },
+ }
+ else
+ properties[current] = {
+ injections = {
+ yoffset = yoffset,
+ },
+ }
+ end
+ return x, y, w, h, nofregisteredpairs
+ end
+ end
+ return x, y, w, h -- no bound
+end
+
+-- this needs checking for rl < 0 but it is unlikely that a r2l script
+-- uses kernclasses between glyphs so we're probably safe (KE has a
+-- problematic font where marks interfere with rl < 0 in the previous
+-- case)
+
+function injections.setkern(current,factor,rlmode,x,injection)
+ local dx = factor * x
+ if dx ~= 0 then
+ nofregisteredkerns = nofregisteredkerns + 1
+ local p = rawget(properties,current)
+ if not injection then
+ injection = "injections"
+ end
+ if p then
+ local i = rawget(p,injection)
+ if i then
+ i.leftkern = dx + (i.leftkern or 0)
+ else
+ p[injection] = {
+ leftkern = dx,
+ }
+ end
+ else
+ properties[current] = {
+ [injection] = {
+ leftkern = dx,
+ },
+ }
+ end
+ return dx, nofregisteredkerns
+ else
+ return 0, 0
+ end
+end
+
+function injections.setmark(start,base,factor,rlmode,ba,ma,tfmbase) -- ba=baseanchor, ma=markanchor
+ local dx, dy = factor*(ba[1]-ma[1]), factor*(ba[2]-ma[2])
+ nofregisteredmarks = nofregisteredmarks + 1
+ -- markanchors[nofregisteredmarks] = base
+ if rlmode >= 0 then
+ dx = tfmbase.width - dx -- see later commented ox
+ end
+ local p = rawget(properties,start)
+ if p then
+ local i = rawget(p,"injections")
+ if i then
+ i.markx = dx
+ i.marky = dy
+ i.markdir = rlmode or 0
+ i.markbase = nofregisteredmarks
+ i.markbasenode = base
+ else
+ p.injections = {
+ markx = dx,
+ marky = dy,
+ markdir = rlmode or 0,
+ markbase = nofregisteredmarks,
+ markbasenode = base,
+ }
+ end
+ else
+ properties[start] = {
+ injections = {
+ markx = dx,
+ marky = dy,
+ markdir = rlmode or 0,
+ markbase = nofregisteredmarks,
+ markbasenode = base,
+ },
+ }
+ end
+ return dx, dy, nofregisteredmarks
+end
+
+local function dir(n)
+ return (n and n<0 and "r-to-l") or (n and n>0 and "l-to-r") or "unset"
+end
+
+local function showchar(n,nested)
+ local char = getchar(n)
+ report_injections("%wfont %s, char %U, glyph %c",nested and 2 or 0,getfont(n),char,char)
+end
+
+local function show(n,what,nested,symbol)
+ if n then
+ local p = rawget(properties,n)
+ if p then
+ local i = rawget(p,what)
+ if i then
+ local leftkern = i.leftkern or 0
+ local rightkern = i.rightkern or 0
+ local yoffset = i.yoffset or 0
+ local markx = i.markx or 0
+ local marky = i.marky or 0
+ local markdir = i.markdir or 0
+ local markbase = i.markbase or 0 -- will be markbasenode
+ local cursivex = i.cursivex or 0
+ local cursivey = i.cursivey or 0
+ local ligaindex = i.ligaindex or 0
+ local margin = nested and 4 or 2
+ --
+ if rightkern ~= 0 or yoffset ~= 0 then
+ report_injections("%w%s pair: lx %p, rx %p, dy %p",margin,symbol,leftkern,rightkern,yoffset)
+ elseif leftkern ~= 0 then
+ report_injections("%w%s kern: dx %p",margin,symbol,leftkern)
+ end
+ if markx ~= 0 or marky ~= 0 or markbase ~= 0 then
+ report_injections("%w%s mark: dx %p, dy %p, dir %s, base %s",margin,symbol,markx,marky,markdir,markbase ~= 0 and "yes" or "no")
+ end
+ if cursivex ~= 0 or cursivey ~= 0 then
+ report_injections("%w%s curs: dx %p, dy %p",margin,symbol,cursivex,cursivey)
+ end
+ if ligaindex ~= 0 then
+ report_injections("%w%s liga: index %i",margin,symbol,ligaindex)
+ end
+ end
+ end
+ end
+end
+
+local function showsub(n,what,where)
+ report_injections("begin subrun: %s",where)
+ for n in traverse_id(glyph_code,n) do
+ showchar(n,where)
+ show(n,what,where," ")
+ end
+ report_injections("end subrun")
+end
+
+local function trace(head,where)
+ report_injections("begin run %s: %s kerns, %s pairs, %s marks and %s cursives registered",
+ where or "",nofregisteredkerns,nofregisteredpairs,nofregisteredmarks,nofregisteredcursives)
+ local n = head
+ while n do
+ local id = getid(n)
+ if id == glyph_code then
+ showchar(n)
+ show(n,"injections",false," ")
+ show(n,"preinjections",false,"<")
+ show(n,"postinjections",false,">")
+ show(n,"replaceinjections",false,"=")
+ elseif id == disc_code then
+ local pre = getfield(n,"pre")
+ local post = getfield(n,"post")
+ local replace = getfield(n,"replace")
+ if pre then
+ showsub(pre,"preinjections","pre")
+ end
+ if post then
+ showsub(post,"postinjections","post")
+ end
+ if replace then
+ showsub(replace,"replaceinjections","replace")
+ end
+ end
+ n = getnext(n)
+ end
+ report_injections("end run")
+end
+
+local function show_result(head)
+ local current = head
+ local skipping = false
+ while current do
+ local id = getid(current)
+ if id == glyph_code then
+ report_injections("char: %C, width %p, xoffset %p, yoffset %p",
+ getchar(current),getfield(current,"width"),getfield(current,"xoffset"),getfield(current,"yoffset"))
+ skipping = false
+ elseif id == kern_code then
+ report_injections("kern: %p",getfield(current,"kern"))
+ skipping = false
+ elseif not skipping then
+ report_injections()
+ skipping = true
+ end
+ current = getnext(current)
+ end
+end
+
+-- we could also check for marks here but maybe not all are registered (needs checking)
+
+local function collect_glyphs_1(head)
+ local glyphs, nofglyphs = { }, 0
+ local marks, nofmarks = { }, 0
+ local nf, tm = nil, nil
+ for n in traverse_id(glyph_code,head) do -- only needed for relevant fonts
+ if getsubtype(n) < 256 then
+ local f = getfont(n)
+ if f ~= nf then
+ nf = f
+ tm = fontdata[nf].resources.marks -- other hash in ctx
+ end
+ if tm and tm[getchar(n)] then
+ nofmarks = nofmarks + 1
+ marks[nofmarks] = n
+ else
+ nofglyphs = nofglyphs + 1
+ glyphs[nofglyphs] = n
+ end
+ -- yoffsets can influence curs steps
+ local p = rawget(properties,n)
+ if p then
+ local i = rawget(p,"injections")
+ if i then
+ local yoffset = i.yoffset
+ if yoffset and yoffset ~= 0 then
+ setfield(n,"yoffset",yoffset)
+ end
+ end
+ end
+ end
+ end
+ return glyphs, nofglyphs, marks, nofmarks
+end
+
+local function collect_glyphs_2(head)
+ local glyphs, nofglyphs = { }, 0
+ local marks, nofmarks = { }, 0
+ local nf, tm = nil, nil
+ for n in traverse_id(glyph_code,head) do
+ if getsubtype(n) < 256 then
+ local f = getfont(n)
+ if f ~= nf then
+ nf = f
+ tm = fontdata[nf].resources.marks -- other hash in ctx
+ end
+ if tm and tm[getchar(n)] then
+ nofmarks = nofmarks + 1
+ marks[nofmarks] = n
+ else
+ nofglyphs = nofglyphs + 1
+ glyphs[nofglyphs] = n
+ end
+ end
+ end
+ return glyphs, nofglyphs, marks, nofmarks
+end
+
+local function inject_marks(marks,nofmarks)
+ for i=1,nofmarks do
+ local n = marks[i]
+ local pn = rawget(properties,n)
+ if pn then
+ pn = rawget(pn,"injections")
+ if pn then
+ local p = pn.markbasenode
+ if p then
+ local px = getfield(p,"xoffset")
+ local ox = 0
+ local rightkern = nil
+ local pp = rawget(properties,p)
+ if pp then
+ pp = rawget(pp,"injections")
+ if pp then
+ rightkern = pp.rightkern
+ end
+ end
+ if rightkern then -- x and w ~= 0
+ if pn.markdir < 0 then
+ -- kern(w-x) glyph(p) kern(x) mark(n)
+ ox = px - pn.markx - rightkern
+ -- report_injections("r2l case 1: %p",ox)
+ else
+ -- kern(x) glyph(p) kern(w-x) mark(n)
+ -- ox = px - getfield(p,"width") + pn.markx - pp.leftkern
+ local leftkern = pp.leftkern
+ if leftkern then
+ ox = px - pn.markx
+ else
+ ox = px - pn.markx - leftkern
+ end
+-- report_injections("l2r case 1: %p",ox)
+ end
+ else
+ -- we need to deal with fonts that have marks with width
+ -- if pn.markdir < 0 then
+ -- ox = px - pn.markx
+ -- -- report_injections("r2l case 3: %p",ox)
+ -- else
+ -- -- ox = px - getfield(p,"width") + pn.markx
+ ox = px - pn.markx
+ -- report_injections("l2r case 3: %p",ox)
+ -- end
+ local wn = getfield(n,"width") -- in arial marks have widths
+ if wn ~= 0 then
+ -- bad: we should center
+ -- insert_node_before(head,n,newkern(-wn/2))
+ -- insert_node_after(head,n,newkern(-wn/2))
+ pn.leftkern = -wn/2
+ pn.rightkern = -wn/2
+ -- wx[n] = { 0, -wn/2, 0, -wn }
+ end
+ -- so far
+ end
+ setfield(n,"xoffset",ox)
+ --
+ local py = getfield(p,"yoffset")
+ local oy = 0
+ if marks[p] then
+ oy = py + pn.marky
+ else
+ oy = getfield(n,"yoffset") + py + pn.marky
+ end
+ setfield(n,"yoffset",oy)
+ else
+ -- normally this can't happen (only when in trace mode which is a special case anyway)
+ -- report_injections("missing mark anchor %i",pn.markbase or 0)
+ end
+ end
+ end
+ end
+end
+
+local function inject_cursives(glyphs,nofglyphs)
+ local cursiveanchor, lastanchor = nil, nil
+ local minc, maxc, last = 0, 0, nil
+ for i=1,nofglyphs do
+ local n = glyphs[i]
+ local pn = rawget(properties,n)
+ if pn then
+ pn = rawget(pn,"injections")
+ end
+ if pn then
+ local cursivex = pn.cursivex
+ if cursivex then
+ if cursiveanchor then
+ if cursivex ~= 0 then
+ pn.leftkern = (pn.leftkern or 0) + cursivex
+ end
+ if lastanchor then
+ if maxc == 0 then
+ minc = lastanchor
+ end
+ maxc = lastanchor
+ properties[cursiveanchor].cursivedy = pn.cursivey
+ end
+ last = n
+ else
+ maxc = 0
+ end
+ elseif maxc > 0 then
+ local ny = getfield(n,"yoffset")
+ for i=maxc,minc,-1 do
+ local ti = glyphs[i]
+ ny = ny + properties[ti].cursivedy
+ setfield(ti,"yoffset",ny) -- why not add ?
+ end
+ maxc = 0
+ end
+ if pn.cursiveanchor then
+ cursiveanchor = n
+ lastanchor = i
+ else
+ cursiveanchor = nil
+ lastanchor = nil
+ if maxc > 0 then
+ local ny = getfield(n,"yoffset")
+ for i=maxc,minc,-1 do
+ local ti = glyphs[i]
+ ny = ny + properties[ti].cursivedy
+ setfield(ti,"yoffset",ny) -- why not add ?
+ end
+ maxc = 0
+ end
+ end
+ elseif maxc > 0 then
+ local ny = getfield(n,"yoffset")
+ for i=maxc,minc,-1 do
+ local ti = glyphs[i]
+ ny = ny + properties[ti].cursivedy
+ setfield(ti,"yoffset",getfield(ti,"yoffset") + ny) -- ?
+ end
+ maxc = 0
+ cursiveanchor = nil
+ lastanchor = nil
+ end
+ -- if maxc > 0 and not cursiveanchor then
+ -- local ny = getfield(n,"yoffset")
+ -- for i=maxc,minc,-1 do
+ -- local ti = glyphs[i]
+ -- ny = ny + properties[ti].cursivedy
+ -- setfield(ti,"yoffset",ny) -- why not add ?
+ -- end
+ -- maxc = 0
+ -- end
+ end
+ if last and maxc > 0 then
+ local ny = getfield(last,"yoffset")
+ for i=maxc,minc,-1 do
+ local ti = glyphs[i]
+ ny = ny + properties[ti].cursivedy
+ setfield(ti,"yoffset",ny) -- why not add ?
+ end
+ end
+end
+
+local function inject_kerns(head,glyphs,nofglyphs)
+ -- todo: pre/post/replace
+ for i=1,#glyphs do
+ local n = glyphs[i]
+ local pn = rawget(properties,n)
+ if pn then
+ local i = rawget(pn,"injections")
+ if i then
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ insert_node_before(head,n,newkern(leftkern)) -- type 0/2
+ end
+ local rightkern = i.rightkern
+ if rightkern and rightkern ~= 0 then
+ insert_node_after(head,n,newkern(rightkern)) -- type 0/2
+ end
+ end
+ end
+ end
+end
+
+local function inject_everything(head,where)
+ head = tonut(head)
+ if trace_injections then
+ trace(head,"everything")
+ end
+ local glyphs, nofglyphs, marks, nofmarks
+ if nofregisteredpairs > 0 then
+ glyphs, nofglyphs, marks, nofmarks = collect_glyphs_1(head)
+ else
+ glyphs, nofglyphs, marks, nofmarks = collect_glyphs_2(head)
+ end
+ if nofglyphs > 0 then
+ if nofregisteredcursives > 0 then
+ inject_cursives(glyphs,nofglyphs)
+ end
+ if nofregisteredmarks > 0 then -- and nofmarks > 0
+ inject_marks(marks,nofmarks)
+ end
+ inject_kerns(head,glyphs,nofglyphs)
+ end
+ if keepregisteredcounts then
+ keepregisteredcounts = false
+ else
+ nofregisteredkerns = 0
+ nofregisteredpairs = 0
+ nofregisteredmarks = 0
+ nofregisteredcursives = 0
+ end
+ return tonode(head), true
+end
+
+local function inject_kerns_only(head,where)
+ head = tonut(head)
+ if trace_injections then
+ trace(head,"kerns")
+ end
+ local n = head
+ local p = nil
+ while n do
+ local id = getid(n)
+ if id == glyph_code then
+ if getsubtype(n) < 256 then
+ local pn = rawget(properties,n)
+ if pn then
+ if p then
+ local d = getfield(p,"post")
+ if d then
+ local i = rawget(pn,"postinjections")
+ if i then
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ local t = find_tail(d)
+ insert_node_after(d,t,newkern(leftkern))
+ end
+ end
+ end
+ local d = getfield(p,"replace")
+ if d then
+ local i = rawget(pn,"replaceinjections")
+ if i then
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ local t = find_tail(d)
+ insert_node_after(d,t,newkern(leftkern))
+ end
+ end
+ else
+ local i = rawget(pn,"injections")
+ if i then
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ setfield(p,"replace",newkern(leftkern))
+ end
+ end
+ end
+ else
+ local i = rawget(pn,"injections")
+ if i then
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ head = insert_node_before(head,n,newkern(leftkern))
+ end
+ end
+ end
+ end
+ else
+ break
+ end
+ p = nil
+ elseif id == disc_code then
+ local d = getfield(n,"pre")
+ if d then
+ local h = d
+ for n in traverse_id(glyph_code,d) do
+ if getsubtype(n) < 256 then
+ local pn = rawget(properties,n)
+ if pn then
+ local i = rawget(pn,"preinjections")
+ if i then
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ h = insert_node_before(h,n,newkern(leftkern))
+ end
+ end
+ end
+ else
+ break
+ end
+ end
+ if h ~= d then
+ setfield(n,"pre",h)
+ end
+ end
+ local d = getfield(n,"post")
+ if d then
+ local h = d
+ for n in traverse_id(glyph_code,d) do
+ if getsubtype(n) < 256 then
+ local pn = rawget(properties,n)
+ if pn then
+ local i = rawget(pn,"postinjections")
+ if i then
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ h = insert_node_before(h,n,newkern(leftkern))
+ end
+ end
+ end
+ else
+ break
+ end
+ end
+ if h ~= d then
+ setfield(n,"post",h)
+ end
+ end
+ local d = getfield(n,"replace")
+ if d then
+ local h = d
+ for n in traverse_id(glyph_code,d) do
+ if getsubtype(n) < 256 then
+ local pn = rawget(properties,n) -- why can it be empty { }
+ if pn then
+ local i = rawget(pn,"replaceinjections")
+ if i then
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ h = insert_node_before(h,n,newkern(leftkern))
+ end
+ end
+ end
+ else
+ break
+ end
+ end
+ if h ~= d then
+ setfield(n,"replace",h)
+ end
+ end
+ p = n
+ else
+ p = nil
+ end
+ n = getnext(n)
+ end
+ --
+ if keepregisteredcounts then
+ keepregisteredcounts = false
+ else
+ nofregisteredkerns = 0
+ end
+ return tonode(head), true
+end
+
+local function inject_pairs_only(head,where)
+ head = tonut(head)
+ if trace_injections then
+ trace(head,"pairs")
+ end
+ --
+ local n = head
+ local p = nil
+ while n do
+ local id = getid(n)
+ if id == glyph_code then
+ if getsubtype(n) < 256 then
+ local pn = rawget(properties,n)
+ if pn then
+ if p then
+ local d = getfield(p,"post")
+ if d then
+ local i = rawget(pn,"postinjections")
+ if i then
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ local t = find_tail(d)
+ insert_node_after(d,t,newkern(leftkern))
+ end
+ -- local rightkern = i.rightkern
+ -- if rightkern and rightkern ~= 0 then
+ -- insert_node_after(head,n,newkern(rightkern))
+ -- n = getnext(n) -- to be checked
+ -- end
+ end
+ end
+ local d = getfield(p,"replace")
+ if d then
+ local i = rawget(pn,"replaceinjections")
+ if i then
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ local t = find_tail(d)
+ insert_node_after(d,t,newkern(leftkern))
+ end
+ -- local rightkern = i.rightkern
+ -- if rightkern and rightkern ~= 0 then
+ -- insert_node_after(head,n,newkern(rightkern))
+ -- n = getnext(n) -- to be checked
+ -- end
+ end
+ else
+ local i = rawget(pn,"injections")
+ if i then
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ setfield(p,"replace",newkern(leftkern))
+ end
+ -- local rightkern = i.rightkern
+ -- if rightkern and rightkern ~= 0 then
+ -- insert_node_after(head,n,newkern(rightkern))
+ -- n = getnext(n) -- to be checked
+ -- end
+ end
+ end
+ else
+ -- this is the most common case
+ local i = rawget(pn,"injections")
+ if i then
+ local yoffset = i.yoffset
+ if yoffset and yoffset ~= 0 then
+ setfield(n,"yoffset",yoffset)
+ end
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ insert_node_before(head,n,newkern(leftkern))
+ end
+ local rightkern = i.rightkern
+ if rightkern and rightkern ~= 0 then
+ insert_node_after(head,n,newkern(rightkern))
+ n = getnext(n) -- to be checked
+ end
+ end
+ end
+ end
+ else
+ break
+ end
+ p = nil
+ elseif id == disc_code then
+ local d = getfield(n,"pre")
+ if d then
+ local h = d
+ for n in traverse_id(glyph_code,d) do
+ if getsubtype(n) < 256 then
+ local p = rawget(properties,n)
+ if p then
+ local i = rawget(p,"preinjections")
+ if i then
+ local yoffset = i.yoffset
+ if yoffset and yoffset ~= 0 then
+ setfield(n,"yoffset",yoffset)
+ end
+ local leftkern = i.leftkern
+ if leftkern ~= 0 then
+ h = insert_node_before(h,n,newkern(leftkern))
+ end
+ local rightkern = i.rightkern
+ if rightkern and rightkern ~= 0 then
+ insert_node_after(head,n,newkern(rightkern))
+ n = getnext(n) -- to be checked
+ end
+ end
+ end
+ else
+ break
+ end
+ end
+ if h ~= d then
+ setfield(n,"pre",h)
+ end
+ end
+ local d = getfield(n,"post")
+ if d then
+ local h = d
+ for n in traverse_id(glyph_code,d) do
+ if getsubtype(n) < 256 then
+ local p = rawget(properties,n)
+ if p then
+ local i = rawget(p,"postinjections")
+ if i then
+ local yoffset = i.yoffset
+ if yoffset and yoffset ~= 0 then
+ setfield(n,"yoffset",yoffset)
+ end
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ h = insert_node_before(h,n,newkern(leftkern))
+ end
+ local rightkern = i.rightkern
+ if rightkern and rightkern ~= 0 then
+ insert_node_after(head,n,newkern(rightkern))
+ n = getnext(n) -- to be checked
+ end
+ end
+ end
+ else
+ break
+ end
+ end
+ if h ~= d then
+ setfield(n,"post",h)
+ end
+ end
+ local d = getfield(n,"replace")
+ if d then
+ local h = d
+ for n in traverse_id(glyph_code,d) do
+ if getsubtype(n) < 256 then
+ local p = rawget(properties,n)
+ if p then
+ local i = rawget(pn,"replaceinjections")
+ if i then
+ local yoffset = i.yoffset
+ if yoffset and yoffset ~= 0 then
+ setfield(n,"yoffset",yoffset)
+ end
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ h = insert_node_before(h,n,newkern(leftkern))
+ end
+ local rightkern = i.rightkern
+ if rightkern and rightkern ~= 0 then
+ insert_node_after(head,n,newkern(rightkern))
+ n = getnext(n) -- to be checked
+ end
+ end
+ end
+ else
+ break
+ end
+ end
+ if h ~= d then
+ setfield(n,"replace",h)
+ end
+ end
+ p = n
+ else
+ p = nil
+ end
+ n = getnext(n)
+ end
+ --
+ if keepregisteredcounts then
+ keepregisteredcounts = false
+ else
+ nofregisteredpairs = 0
+ nofregisteredkerns = 0
+ end
+ return tonode(head), true
+end
+
+function injections.handler(head,where) -- optimize for n=1 ?
+ if nofregisteredmarks > 0 or nofregisteredcursives > 0 then
+ return inject_everything(head,where)
+ elseif nofregisteredpairs > 0 then
+ return inject_pairs_only(head,where)
+ elseif nofregisteredkerns > 0 then
+ return inject_kerns_only(head,where)
+ else
+ return head, false
+ end
+end
diff --git a/Master/texmf-dist/tex/context/base/font-lib.mkvi b/Master/texmf-dist/tex/context/base/font-lib.mkvi
index bfd85245cff..59074b07df2 100644
--- a/Master/texmf-dist/tex/context/base/font-lib.mkvi
+++ b/Master/texmf-dist/tex/context/base/font-lib.mkvi
@@ -19,7 +19,7 @@
\registerctxluafile{font-log}{1.001}
\registerctxluafile{font-con}{1.001}
\registerctxluafile{font-enc}{1.001}
-%registerctxluafile{font-agl}{1.001} % loaded when needed, saves 100K in format
+\registerctxluafile{font-agl}{1.001} % if needed we can comment this and delay loading
\registerctxluafile{font-cid}{1.001} % cid maps
\registerctxluafile{font-map}{1.001}
\registerctxluafile{font-syn}{1.001}
@@ -39,12 +39,13 @@
\registerctxluafile{font-otf}{1.001} % otf main
\registerctxluafile{font-otb}{1.001} % otf main base
-\doiffileelse{font-inj.lua}
- {\registerctxluafile{font-inj}{1.001}} % new method (for the moment only local)
- {\registerctxluafile{node-inj}{1.001}} % old method
+% \doiffileelse{font-inj.lua}
+% {\registerctxluafile{font-inj}{1.001}} % new method (for the moment only local)
+% {\registerctxluafile{node-inj}{1.001}} % old method
-%registerctxluafile{font-ota}{1.001} % otf analyzers
-\registerctxluafile{font-otx}{1.001} % otf analyzers
+\registerctxluafile{font-inj}{1.001} % the old method (lacks some features)
+
+\registerctxluafile{font-ota}{1.001} % otf analyzers
\registerctxluafile{font-otn}{1.001} % otf main node
\registerctxluafile{font-otd}{1.001} % otf dynamics (does an overload)
\registerctxluafile{font-otp}{1.001} % otf pack
@@ -90,17 +91,16 @@
%D \stoptyping
% we can also move the lookups to the fonts.namespace (of commands)
+% one can also directly use the clf calls when speed is needed
-% these will be renamed but it needs synchronization with WS
-
-\def\dolookupfontbyspec #1{\ctxcommand{fontlookupinitialize("#1")}}
-\def\dolookupnoffound {\ctxcommand{fontlookupnoffound()}}
-\def\dolookupgetkeyofindex#1#2{\ctxcommand{fontlookupgetkeyofindex("#1",#2)}}
-\def\dolookupgetkey #1{\ctxcommand{fontlookupgetkey("#1")}}
-\def\cleanfontname #1{\ctxcommand{cleanfontname("#1")}}
+\def\dolookupfontbyspec #1{\clf_fontlookupinitialize{#1}}
+\def\dolookupnoffound {\clf_fontlookupnoffound}
+\def\dolookupgetkeyofindex#1#2{\clf_fontlookupgetkeyofindex{#1}\numexpr#2\relax}
+\def\dolookupgetkey #1{\clf_fontlookupgetkey{#1}}
+\def\cleanfontname #1{\clf_cleanfontname{#1}}
% new:
-\unexpanded\def\setfontofid#1{\ctxcommand{setfontofid(#1)}}
+\unexpanded\def\setfontofid#1{\ctf_setfontofid#1\relax}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/font-map.lua b/Master/texmf-dist/tex/context/base/font-map.lua
index f74e13e8161..449a00f2efd 100644
--- a/Master/texmf-dist/tex/context/base/font-map.lua
+++ b/Master/texmf-dist/tex/context/base/font-map.lua
@@ -6,12 +6,13 @@ if not modules then modules = { } end modules ['font-map'] = {
license = "see context related readme files"
}
-local tonumber = tonumber
+local tonumber, next, type = tonumber, next, type
local match, format, find, concat, gsub, lower = string.match, string.format, string.find, table.concat, string.gsub, string.lower
local P, R, S, C, Ct, Cc, lpegmatch = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Ct, lpeg.Cc, lpeg.match
local utfbyte = utf.byte
local floor = math.floor
+local formatters = string.formatters
local trace_loading = false trackers.register("fonts.loading", function(v) trace_loading = v end)
local trace_mapping = false trackers.register("fonts.mapping", function(v) trace_unimapping = v end)
@@ -22,6 +23,8 @@ local fonts = fonts or { }
local mappings = fonts.mappings or { }
fonts.mappings = mappings
+local allocate = utilities.storage.allocate
+
--[[ldx--
<p>Eventually this code will disappear because map files are kind
of obsolete. Some code may move to runtime or auxiliary modules.</p>
@@ -66,11 +69,14 @@ local function makenameparser(str)
end
end
+local f_single = formatters["%04X"]
+local f_double = formatters["%04X%04X"]
+
local function tounicode16(unicode,name)
if unicode < 0x10000 then
- return format("%04X",unicode)
+ return f_single(unicode)
elseif unicode < 0x1FFFFFFFFF then
- return format("%04X%04X",floor(unicode/1024),unicode%1024+0xDC00)
+ return f_double(floor(unicode/1024),unicode%1024+0xDC00)
else
report_fonts("can't convert %a in %a into tounicode",unicode,name)
end
@@ -79,18 +85,46 @@ end
local function tounicode16sequence(unicodes,name)
local t = { }
for l=1,#unicodes do
- local unicode = unicodes[l]
- if unicode < 0x10000 then
- t[l] = format("%04X",unicode)
+ local u = unicodes[l]
+ if u < 0x10000 then
+ t[l] = f_single(u)
elseif unicode < 0x1FFFFFFFFF then
- t[l] = format("%04X%04X",floor(unicode/1024),unicode%1024+0xDC00)
+ t[l] = f_double(floor(u/1024),u%1024+0xDC00)
else
- report_fonts ("can't convert %a in %a into tounicode",unicode,name)
+ report_fonts ("can't convert %a in %a into tounicode",u,name)
+ return
end
end
return concat(t)
end
+local function tounicode(unicode,name)
+ if type(unicode) == "table" then
+ local t = { }
+ for l=1,#unicode do
+ local u = unicode[l]
+ if u < 0x10000 then
+ t[l] = f_single(u)
+ elseif u < 0x1FFFFFFFFF then
+ t[l] = f_double(floor(u/1024),u%1024+0xDC00)
+ else
+ report_fonts ("can't convert %a in %a into tounicode",u,name)
+ return
+ end
+ end
+ return concat(t)
+ else
+ if unicode < 0x10000 then
+ return f_single(unicode)
+ elseif unicode < 0x1FFFFFFFFF then
+ return f_double(floor(unicode/1024),unicode%1024+0xDC00)
+ else
+ report_fonts("can't convert %a in %a into tounicode",unicode,name)
+ end
+ end
+end
+
+
local function fromunicode16(str)
if #str == 4 then
return tonumber(str,16)
@@ -136,6 +170,7 @@ end
mappings.loadlumtable = loadlumtable
mappings.makenameparser = makenameparser
+mappings.tounicode = tounicode
mappings.tounicode16 = tounicode16
mappings.tounicode16sequence = tounicode16sequence
mappings.fromunicode16 = fromunicode16
@@ -149,6 +184,8 @@ local namesplitter = Ct(C((1 - ligseparator - varseparator)^1) * (ligseparator *
-- print(string.formatters["%s: [% t]"](name,split))
-- end
+-- maybe: ff fi fl ffi ffl => f_f f_i f_l f_f_i f_f_l
+
-- test("i.f_")
-- test("this")
-- test("this.that")
@@ -156,33 +193,54 @@ local namesplitter = Ct(C((1 - ligseparator - varseparator)^1) * (ligseparator *
-- test("such_so_more")
-- test("such_so_more.that")
+-- to be completed .. for fonts that use unicodes for ligatures which
+-- is a actually a bad thing and should be avoided in the first place
+
+local overloads = allocate {
+ IJ = { name = "I_J", unicode = { 0x49, 0x4A }, mess = 0x0132 },
+ ij = { name = "i_j", unicode = { 0x69, 0x6A }, mess = 0x0133 },
+ ff = { name = "f_f", unicode = { 0x66, 0x66 }, mess = 0xFB00 },
+ fi = { name = "f_i", unicode = { 0x66, 0x69 }, mess = 0xFB01 },
+ fl = { name = "f_l", unicode = { 0x66, 0x6C }, mess = 0xFB02 },
+ ffi = { name = "f_f_i", unicode = { 0x66, 0x66, 0x69 }, mess = 0xFB03 },
+ ffl = { name = "f_f_l", unicode = { 0x66, 0x66, 0x6C }, mess = 0xFB04 },
+ fj = { name = "f_j", unicode = { 0x66, 0x6A } },
+ fk = { name = "f_k", unicode = { 0x66, 0x6B } },
+}
+
+for k, v in next, overloads do
+ local name = v.name
+ local mess = v.mess
+ if name then
+ overloads[name] = v
+ end
+ if mess then
+ overloads[mess] = v
+ end
+end
+
+mappings.overloads = overloads
+
function mappings.addtounicode(data,filename)
local resources = data.resources
local properties = data.properties
local descriptions = data.descriptions
local unicodes = resources.unicodes
+ local lookuptypes = resources.lookuptypes
if not unicodes then
return
end
-- we need to move this code
- unicodes['space'] = unicodes['space'] or 32
- unicodes['hyphen'] = unicodes['hyphen'] or 45
- unicodes['zwj'] = unicodes['zwj'] or 0x200D
- unicodes['zwnj'] = unicodes['zwnj'] or 0x200C
- -- the tounicode mapping is sparse and only needed for alternatives
+ unicodes['space'] = unicodes['space'] or 32
+ unicodes['hyphen'] = unicodes['hyphen'] or 45
+ unicodes['zwj'] = unicodes['zwj'] or 0x200D
+ unicodes['zwnj'] = unicodes['zwnj'] or 0x200C
local private = fonts.constructors.privateoffset
- local unknown = format("%04X",utfbyte("?"))
local unicodevector = fonts.encodings.agl.unicodes -- loaded runtime in context
- local tounicode = { }
- local originals = { }
- resources.tounicode = tounicode
- resources.originals = originals
+ ----- namevector = fonts.encodings.agl.names -- loaded runtime in context
+ local missing = { }
local lumunic, uparser, oparser
local cidinfo, cidnames, cidcodes, usedmap
- if false then -- will become an option
- lumunic = loadlumtable(filename)
- lumunic = lumunic and lumunic.tounicode
- end
--
cidinfo = properties.cidinfo
usedmap = cidinfo and fonts.cid.getmap(cidinfo)
@@ -197,12 +255,16 @@ function mappings.addtounicode(data,filename)
for unic, glyph in next, descriptions do
local index = glyph.index
local name = glyph.name
- if unic == -1 or unic >= private or (unic >= 0xE000 and unic <= 0xF8FF) or unic == 0xFFFE or unic == 0xFFFF then
+ local r = overloads[name]
+ if r then
+ -- get rid of weird ligatures
+ -- glyph.name = r.name
+ glyph.unicode = r.unicode
+ elseif unic == -1 or unic >= private or (unic >= 0xE000 and unic <= 0xF8FF) or unic == 0xFFFE or unic == 0xFFFF then
local unicode = lumunic and lumunic[name] or unicodevector[name]
if unicode then
- originals[index] = unicode
- tounicode[index] = tounicode16(unicode,name)
- ns = ns + 1
+ glyph.unicode = unicode
+ ns = ns + 1
end
-- cidmap heuristics, beware, there is no guarantee for a match unless
-- the chain resolves
@@ -211,9 +273,8 @@ function mappings.addtounicode(data,filename)
if foundindex then
unicode = cidcodes[foundindex] -- name to number
if unicode then
- originals[index] = unicode
- tounicode[index] = tounicode16(unicode,name)
- ns = ns + 1
+ glyph.unicode = unicode
+ ns = ns + 1
else
local reference = cidnames[foundindex] -- number to name
if reference then
@@ -221,23 +282,20 @@ function mappings.addtounicode(data,filename)
if foundindex then
unicode = cidcodes[foundindex]
if unicode then
- originals[index] = unicode
- tounicode[index] = tounicode16(unicode,name)
- ns = ns + 1
+ glyph.unicode = unicode
+ ns = ns + 1
end
end
if not unicode or unicode == "" then
local foundcodes, multiple = lpegmatch(uparser,reference)
if foundcodes then
- originals[index] = foundcodes
+ glyph.unicode = foundcodes
if multiple then
- tounicode[index] = tounicode16sequence(foundcodes)
- nl = nl + 1
- unicode = true
+ nl = nl + 1
+ unicode = true
else
- tounicode[index] = tounicode16(foundcodes,name)
- ns = ns + 1
- unicode = foundcodes
+ ns = ns + 1
+ unicode = foundcodes
end
end
end
@@ -284,11 +342,9 @@ function mappings.addtounicode(data,filename)
if n == 0 then -- done then
-- nothing
elseif n == 1 then
- originals[index] = t[1]
- tounicode[index] = tounicode16(t[1],name)
+ glyph.unicode = t[1]
else
- originals[index] = t
- tounicode[index] = tounicode16sequence(t)
+ glyph.unicode = t
end
nl = nl + 1
end
@@ -296,32 +352,163 @@ function mappings.addtounicode(data,filename)
if not unicode or unicode == "" then
local foundcodes, multiple = lpegmatch(uparser,name)
if foundcodes then
+ glyph.unicode = foundcodes
if multiple then
- originals[index] = foundcodes
- tounicode[index] = tounicode16sequence(foundcodes,name)
- nl = nl + 1
- unicode = true
+ nl = nl + 1
+ unicode = true
else
- originals[index] = foundcodes
- tounicode[index] = tounicode16(foundcodes,name)
- ns = ns + 1
- unicode = foundcodes
+ ns = ns + 1
+ unicode = foundcodes
end
end
end
- -- if not unicode then
- -- originals[index] = 0xFFFD
- -- tounicode[index] = "FFFD"
+ -- check using substitutes and alternates
+ local r = overloads[unicode]
+ if r then
+ unicode = r.unicode
+ glyph.unicode = unicode
+ end
+ --
+ if not unicode then
+ missing[name] = true
+ end
+ end
+ end
+ if next(missing) then
+ local guess = { }
+ -- helper
+ local function check(gname,code,unicode)
+ local description = descriptions[code]
+ -- no need to add a self reference
+ local variant = description.name
+ if variant == gname then
+ return
+ end
+ -- the variant already has a unicode (normally that resultrs in a default tounicode to self)
+ local unic = unicodes[variant]
+ if unic == -1 or unic >= private or (unic >= 0xE000 and unic <= 0xF8FF) or unic == 0xFFFE or unic == 0xFFFF then
+ -- no default mapping and therefore maybe no tounicode yet
+ else
+ return
+ end
+ -- the variant already has a tounicode
+ if descriptions[code].unicode then
+ return
+ end
+ -- add to the list
+ local g = guess[variant]
+ -- local r = overloads[unicode]
+ -- if r then
+ -- unicode = r.unicode
-- end
+ if g then
+ g[gname] = unicode
+ else
+ guess[variant] = { [gname] = unicode }
+ end
+ end
+ --
+ for unicode, description in next, descriptions do
+ local slookups = description.slookups
+ if slookups then
+ local gname = description.name
+ for tag, data in next, slookups do
+ local lookuptype = lookuptypes[tag]
+ if lookuptype == "alternate" then
+ for i=1,#data do
+ check(gname,data[i],unicode)
+ end
+ elseif lookuptype == "substitution" then
+ check(gname,data,unicode)
+ end
+ end
+ end
+ local mlookups = description.mlookups
+ if mlookups then
+ local gname = description.name
+ for tag, list in next, mlookups do
+ local lookuptype = lookuptypes[tag]
+ if lookuptype == "alternate" then
+ for i=1,#list do
+ local data = list[i]
+ for i=1,#data do
+ check(gname,data[i],unicode)
+ end
+ end
+ elseif lookuptype == "substitution" then
+ for i=1,#list do
+ check(gname,list[i],unicode)
+ end
+ end
+ end
+ end
+ end
+ -- resolve references
+ local done = true
+ while done do
+ done = false
+ for k, v in next, guess do
+ if type(v) ~= "number" then
+ for kk, vv in next, v do
+ if vv == -1 or vv >= private or (vv >= 0xE000 and vv <= 0xF8FF) or vv == 0xFFFE or vv == 0xFFFF then
+ local uu = guess[kk]
+ if type(uu) == "number" then
+ guess[k] = uu
+ done = true
+ end
+ else
+ guess[k] = vv
+ done = true
+ end
+ end
+ end
+ end
+ end
+ -- wrap up
+ local orphans = 0
+ local guessed = 0
+ for k, v in next, guess do
+ if type(v) == "number" then
+ descriptions[unicodes[k]].unicode = descriptions[v].unicode or v -- can also be a table
+ guessed = guessed + 1
+ else
+ local t = nil
+ local l = lower(k)
+ local u = unicodes[l]
+ if not u then
+ orphans = orphans + 1
+ elseif u == -1 or u >= private or (u >= 0xE000 and u <= 0xF8FF) or u == 0xFFFE or u == 0xFFFF then
+ local unicode = descriptions[u].unicode
+ if unicode then
+ descriptions[unicodes[k]].unicode = unicode
+ guessed = guessed + 1
+ else
+ orphans = orphans + 1
+ end
+ else
+ orphans = orphans + 1
+ end
+ end
+ end
+ if trace_loading and orphans > 0 or guessed > 0 then
+ report_fonts("%s glyphs with no related unicode, %s guessed, %s orphans",guessed+orphans,guessed,orphans)
end
end
if trace_mapping then
for unic, glyph in table.sortedhash(descriptions) do
- local name = glyph.name
- local index = glyph.index
- local toun = tounicode[index]
- if toun then
- report_fonts("internal slot %U, name %a, unicode %U, tounicode %a",index,name,unic,toun)
+ local name = glyph.name
+ local index = glyph.index
+ local unicode = glyph.unicode
+ if unicode then
+ if type(unicode) == "table" then
+ local unicodes = { }
+ for i=1,#unicode do
+ unicodes[i] = formatters("%U",unicode[i])
+ end
+ report_fonts("internal slot %U, name %a, unicode %U, tounicode % t",index,name,unic,unicodes)
+ else
+ report_fonts("internal slot %U, name %a, unicode %U, tounicode %U",index,name,unic,unicode)
+ end
else
report_fonts("internal slot %U, name %a, unicode %U",index,name,unic)
end
diff --git a/Master/texmf-dist/tex/context/base/font-mis.lua b/Master/texmf-dist/tex/context/base/font-mis.lua
index 7385d6f3116..0ec95ee1b56 100644
--- a/Master/texmf-dist/tex/context/base/font-mis.lua
+++ b/Master/texmf-dist/tex/context/base/font-mis.lua
@@ -22,9 +22,15 @@ local handlers = fonts.handlers
handlers.otf = handlers.otf or { }
local otf = handlers.otf
-otf.version = otf.version or 2.755
+otf.version = otf.version or 2.803
otf.cache = otf.cache or containers.define("fonts", "otf", otf.version, true)
+local fontloader = fontloader
+local font_to_table = fontloader.to_table
+local open_font = fontloader.open
+local get_font_info = fontloader.info
+local close_font = fontloader.close
+
function otf.loadcached(filename,format,sub)
-- no recache when version mismatch
local name = file.basename(file.removesuffix(filename))
@@ -54,10 +60,10 @@ function fonts.helpers.getfeatures(name,t,script,language) -- maybe per font typ
if data and data.resources and data.resources.features then
return data.resources.features
else
- local ff = fontloader.open(filename)
+ local ff = open_font(filename)
if ff then
- local data = fontloader.to_table(ff)
- fontloader.close(ff)
+ local data = font_to_table(ff)
+ close_font(ff)
local features = { }
for k=1,#featuregroups do
local what = featuregroups[k]
diff --git a/Master/texmf-dist/tex/context/base/font-nod.lua b/Master/texmf-dist/tex/context/base/font-nod.lua
index 8251dc58842..26c736582b1 100644
--- a/Master/texmf-dist/tex/context/base/font-nod.lua
+++ b/Master/texmf-dist/tex/context/base/font-nod.lua
@@ -11,10 +11,10 @@ if not modules then modules = { } end modules ['font-nod'] = {
might become a runtime module instead. This module will be cleaned up!</p>
--ldx]]--
-local tonumber, tostring = tonumber, tostring
+local tonumber, tostring, rawget = tonumber, tostring, rawget
local utfchar = utf.char
-local concat = table.concat
-local match, gmatch, concat, rep = string.match, string.gmatch, table.concat, string.rep
+local concat, fastcopy = table.concat, table.fastcopy
+local match, rep = string.match, string.rep
local report_nodes = logs.reporter("fonts","tracing")
@@ -75,6 +75,7 @@ local copy_node_list = nuts.copy_list
local hpack_node_list = nuts.hpack
local free_node_list = nuts.flush_list
local traverse_nodes = nuts.traverse
+local traverse_id = nuts.traverse_id
local protect_glyphs = nuts.protect_glyphs
local nodepool = nuts.pool
@@ -91,6 +92,25 @@ local fontcharacters = hashes.characters
local fontproperties = hashes.properties
local fontparameters = hashes.parameters
+local properties = nodes.properties.data
+
+-- direct.set_properties_mode(true,false)
+-- direct.set_properties_mode(true,true) -- default
+
+local function freeze(h,where)
+ -- report_nodes("freezing %s",where)
+ for n in traverse_nodes(tonut(h)) do -- todo: disc but not traced anyway
+ local p = properties[n]
+ if p then
+ local i = p.injections if i then p.injections = fastcopy(i) end
+ -- local i = r.preinjections if i then p.preinjections = fastcopy(i) end
+ -- local i = r.postinjections if i then p.postinjections = fastcopy(i) end
+ -- local i = r.replaceinjections if i then p.replaceinjections = fastcopy(i) end
+ -- only injections
+ end
+ end
+end
+
function char_tracers.collect(head,list,tag,n)
head = tonut(head)
n = n or 0
@@ -103,7 +123,7 @@ function char_tracers.collect(head,list,tag,n)
ok, fn = false, f
end
local c = getchar(head)
- local i = fontidentifiers[f].indices[c] or 0
+ -- local i = fontidentifiers[f].indices[c] or 0 -- zero anyway as indices is nilled
if not ok then
ok = true
n = n + 1
@@ -111,9 +131,28 @@ function char_tracers.collect(head,list,tag,n)
list[n][tag] = { }
end
local l = list[n][tag]
- l[#l+1] = { c, f, i }
+ -- l[#l+1] = { c, f, i }
+ l[#l+1] = { c, f }
elseif id == disc_code then
-- skip
+-- local replace = getfield(head,"replace")
+-- if replace then
+-- for n in traverse_id(glyph_code,replace) do
+-- l[#l+1] = { c, f }
+-- end
+-- end
+-- local pre = getfield(head,"pre")
+-- if pre then
+-- for n in traverse_id(glyph_code,pre) do
+-- l[#l+1] = { c, f }
+-- end
+-- end
+-- local post = getfield(head,"post")
+-- if post then
+-- for n in traverse_id(glyph_code,post) do
+-- l[#l+1] = { c, f }
+-- end
+-- end
else
ok = false
end
@@ -127,7 +166,8 @@ function char_tracers.equal(ta, tb)
else
for i=1,#ta do
local a, b = ta[i], tb[i]
- if a[1] ~= b[1] or a[2] ~= b[2] or a[3] ~= b[3] then
+ -- if a[1] ~= b[1] or a[2] ~= b[2] or a[3] ~= b[3] then
+ if a[1] ~= b[1] or a[2] ~= b[2] then
return false
end
end
@@ -160,20 +200,20 @@ function char_tracers.unicodes(t,decimal)
return concat(tt," ")
end
-function char_tracers.indices(t,decimal)
- local tt = { }
- for i=1,#t do
- local n = t[i][3]
- if n == 0 then
- tt[i] = "-"
- elseif decimal then
- tt[i] = n
- else
- tt[i] = f_unicode(n)
- end
- end
- return concat(tt," ")
-end
+-- function char_tracers.indices(t,decimal)
+-- local tt = { }
+-- for i=1,#t do
+-- local n = t[i][3]
+-- if n == 0 then
+-- tt[i] = "-"
+-- elseif decimal then
+-- tt[i] = n
+-- else
+-- tt[i] = f_unicode(n)
+-- end
+-- end
+-- return concat(tt," ")
+-- end
function char_tracers.start()
local npc = handlers.characters -- should accept nuts too
@@ -248,7 +288,8 @@ end
function step_tracers.glyphs(n,i)
local c = collection[i]
if c then
- local b = hpack_node_list(copy_node_list(c)) -- multiple arguments
+ local c = copy_node_list(c)
+ local b = hpack_node_list(c) -- multiple arguments
setbox(n,b)
end
end
@@ -311,21 +352,59 @@ function step_tracers.font(command)
end
end
-function step_tracers.codes(i,command)
+local colors = {
+ pre = { "darkred" },
+ post = { "darkgreen" },
+ replace = { "darkblue" },
+}
+
+function step_tracers.codes(i,command,space)
local c = collection[i]
+
+ local function showchar(c)
+ if command then
+ local f, c = getfont(c), getchar(c)
+ local d = fontdescriptions[f]
+ local d = d and d[c]
+ context[command](f,c,d and d.class or "")
+ else
+ context("[%s:U+%04X]",getfont(c),getchar(c))
+ end
+ end
+
+ local function showdisc(d,w,what)
+ if w then
+ context.startcolor(colors[what])
+ context("%s:",what)
+ for c in traverse_id(glyph_code,w) do
+ showchar(c)
+ end
+ context[space]()
+ context.stopcolor()
+ end
+ end
+
while c do
local id = getid(c)
if id == glyph_code then
- if command then
- local f, c = getfont(c), getchar(c)
- local d = fontdescriptions[f]
- local d = d and d[c]
- context[command](f,c,d and d.class or "")
- else
- context("[%s:U+%04X]",getfont(c),getchar(c))
- end
+ showchar(c)
elseif id == whatsit_code and (getsubtype(c) == localpar_code or getsubtype(c) == dir_code) then
context("[%s]",getfield(c,"dir"))
+ elseif id == disc_code then
+ local pre = getfield(c,"pre")
+ local post = getfield(c,"post")
+ local replace = getfield(c,"replace")
+ if pre or post or replace then
+ context("[")
+ context[space]()
+ showdisc(c,pre,"pre")
+ showdisc(c,post,"post")
+ showdisc(c,replace,"replace")
+ context[space]()
+ context("]")
+ else
+ context("[disc]")
+ end
else
context("[%s]",nodecodes[id])
end
@@ -355,9 +434,11 @@ end
function step_tracers.check(head)
if collecting then
step_tracers.reset()
- local n = copy_node_list(tonut(head))
- injections.handler(n,nil,"trace",true)
- -- handlers.protectglyphs(n) -- can be option
+ local h = tonut(head)
+ local n = copy_node_list(h)
+ freeze(n,"check")
+ injections.keepcounts(n) -- one-time
+ injections.handler(n,"trace")
protect_glyphs(n)
collection[1] = n
end
@@ -367,9 +448,11 @@ function step_tracers.register(head)
if collecting then
local nc = #collection+1
if messages[nc] then
- local n = copy_node_list(tonut(head))
- injections.handler(n,nil,"trace",true)
- -- handlers.protectglyphs(n) -- can be option
+ local h = tonut(head)
+ local n = copy_node_list(h)
+ freeze(n,"register")
+ injections.keepcounts(n) -- one-time
+ injections.handler(n,"trace")
protect_glyphs(n)
collection[nc] = n
end
@@ -405,16 +488,18 @@ local function toutf(list,result,nofresult,stopcriterium)
if fc then
local fcc = fc[c]
if fcc then
- -- == fromunicode
- local u = fcc.tounicode
- if u then
- for s in gmatch(u,"....") do
+ local u = fcc.unicode
+ if not u then
+ nofresult = nofresult + 1
+ result[nofresult] = utfchar(c)
+ elseif type(u) == "table" then
+ for i=1,#u do
nofresult = nofresult + 1
- result[nofresult] = utfchar(tonumber(s,16))
+ result[nofresult] = utfchar(u[i])
end
else
nofresult = nofresult + 1
- result[nofresult] = utfchar(c)
+ result[nofresult] = utfchar(u)
end
else
nofresult = nofresult + 1
diff --git a/Master/texmf-dist/tex/context/base/font-odv.lua b/Master/texmf-dist/tex/context/base/font-odv.lua
index 079027ffedb..40b1efbb4a9 100644
--- a/Master/texmf-dist/tex/context/base/font-odv.lua
+++ b/Master/texmf-dist/tex/context/base/font-odv.lua
@@ -181,6 +181,25 @@ end
-- we might need to have consonants etc per script and initialize a local table
-- pointing to the right one.
+-- new, to be checked:
+--
+-- U+00978 : DEVANAGARI LETTER MARWARI DDA
+-- U+00980 : BENGALI ANJI
+-- U+00C00 : TELUGU SIGN COMBINING CANDRABINDU ABOVE
+-- U+00C34 : TELUGU LETTER LLLA
+-- U+00C81 : KANNADA SIGN CANDRABINDU
+-- U+00D01 : MALAYALAM SIGN CANDRABINDU
+-- U+00DE6 : SINHALA LITH DIGIT ZERO
+-- U+00DE7 : SINHALA LITH DIGIT ONE
+-- U+00DE8 : SINHALA LITH DIGIT TWO
+-- U+00DE9 : SINHALA LITH DIGIT THREE
+-- U+00DEA : SINHALA LITH DIGIT FOUR
+-- U+00DEB : SINHALA LITH DIGIT FIVE
+-- U+00DEC : SINHALA LITH DIGIT SIX
+-- U+00DED : SINHALA LITH DIGIT SEVEN
+-- U+00DEE : SINHALA LITH DIGIT EIGHT
+-- U+00DEF : SINHALA LITH DIGIT NINE
+
local consonant = {
-- devanagari
[0x0915] = true, [0x0916] = true, [0x0917] = true, [0x0918] = true,
diff --git a/Master/texmf-dist/tex/context/base/font-ota.lua b/Master/texmf-dist/tex/context/base/font-ota.lua
index 8d60ddc0e61..1f1534870a8 100644
--- a/Master/texmf-dist/tex/context/base/font-ota.lua
+++ b/Master/texmf-dist/tex/context/base/font-ota.lua
@@ -1,4 +1,4 @@
-if not modules then modules = { } end modules ['font-ota'] = {
+if not modules then modules = { } end modules ['font-otx'] = {
version = 1.001,
comment = "companion to font-otf.lua (analysing)",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -6,10 +6,7 @@ if not modules then modules = { } end modules ['font-ota'] = {
license = "see context related readme files"
}
--- this might become scrp-*.lua
-
--- [attr] : getprop or getattr
--- [attr] : setprop or setattr
+-- context only
local type = type
@@ -29,21 +26,35 @@ local methods = allocate()
analyzers.initializers = initializers
analyzers.methods = methods
-analyzers.useunicodemarks = false
+---------.useunicodemarks = false
local a_state = attributes.private('state')
+local nuts = nodes.nuts
+local tonut = nuts.tonut
+
+local getfield = nuts.getfield
+local getnext = nuts.getnext
+local getprev = nuts.getprev
+local getid = nuts.getid
+local getprop = nuts.getprop
+local setprop = nuts.setprop
+local getfont = nuts.getfont
+local getsubtype = nuts.getsubtype
+local getchar = nuts.getchar
+
+local traverse_id = nuts.traverse_id
+local traverse_node_list = nuts.traverse
+local end_of_math = nuts.end_of_math
+
local nodecodes = nodes.nodecodes
local glyph_code = nodecodes.glyph
local disc_code = nodecodes.disc
local math_code = nodecodes.math
-local traverse_id = node.traverse_id
-local traverse_node_list = node.traverse
-local end_of_math = node.end_of_math
-
local fontdata = fonts.hashes.identifiers
local categories = characters and characters.categories or { } -- sorry, only in context
+local chardata = characters and characters.data
local otffeatures = fonts.constructors.newfeatures("otf")
local registerotffeature = otffeatures.register
@@ -90,63 +101,70 @@ local features = {
pstf = s_pstf,
}
-analyzers.states = states
-analyzers.features = features
+analyzers.states = states
+analyzers.features = features
+analyzers.useunicodemarks = false
-- todo: analyzers per script/lang, cross font, so we need an font id hash -> script
-- e.g. latin -> hyphenate, arab -> 1/2/3 analyze -- its own namespace
-function analyzers.setstate(head,font)
+function analyzers.setstate(head,font) -- we can skip math
local useunicodemarks = analyzers.useunicodemarks
local tfmdata = fontdata[font]
local descriptions = tfmdata.descriptions
local first, last, current, n, done = nil, nil, head, 0, false -- maybe make n boolean
+ current = tonut(current)
while current do
- local id = current.id
- if id == glyph_code and current.font == font then
+ local id = getid(current)
+ if id == glyph_code and getfont(current) == font then
done = true
- local char = current.char
+ local char = getchar(current)
local d = descriptions[char]
if d then
- if d.class == "mark" or (useunicodemarks and categories[char] == "mn") then
+ if d.class == "mark" then
+ done = true
+ setprop(current,a_state,s_mark)
+ elseif useunicodemarks and categories[char] == "mn" then
done = true
- current[a_state] = s_mark
+ setprop(current,a_state,s_mark)
elseif n == 0 then
first, last, n = current, current, 1
- current[a_state] = s_init
+ setprop(current,a_state,s_init)
else
last, n = current, n+1
- current[a_state] = s_medi
+ setprop(current,a_state,s_medi)
end
else -- finish
if first and first == last then
- last[a_state] = s_isol
+ setprop(last,a_state,s_isol)
elseif last then
- last[a_state] = s_fina
+ setprop(last,a_state,s_fina)
end
first, last, n = nil, nil, 0
end
elseif id == disc_code then
- -- always in the middle
- current[a_state] = s_medi
+ -- always in the middle .. it doesn't make much sense to assign a property
+ -- here ... we might at some point decide to flag the components when present
+ -- but even then it's kind of bogus
+ setprop(current,a_state,s_medi)
last = current
else -- finish
if first and first == last then
- last[a_state] = s_isol
+ setprop(last,a_state,s_isol)
elseif last then
- last[a_state] = s_fina
+ setprop(last,a_state,s_fina)
end
first, last, n = nil, nil, 0
if id == math_code then
current = end_of_math(current)
end
end
- current = current.next
+ current = getnext(current)
end
if first and first == last then
- last[a_state] = s_isol
+ setprop(last,a_state,s_isol)
elseif last then
- last[a_state] = s_fina
+ setprop(last,a_state,s_fina)
end
return head, done
end
@@ -203,234 +221,194 @@ registerotffeature {
-- latin
methods.latn = analyzers.setstate
-
--- This info eventually can go into char-def and we will have a state
--- table for generic then (unicode recognized all states but in practice
--- only has only
---
--- isolated : isol
--- final : isol_fina
--- medial : isol_fina_medi_init
---
--- so in practice, without analyzer it's rather useless info which is
--- why having it in char-def makes only sense for special purposes (like)
--- like tracing cq. visualizing.
-
-local tatweel = 0x0640
-local zwnj = 0x200C
-local zwj = 0x200D
-
-local isolated = { -- isol
- [0x0600] = true, [0x0601] = true, [0x0602] = true, [0x0603] = true,
- [0x0604] = true,
- [0x0608] = true, [0x060B] = true, [0x0621] = true, [0x0674] = true,
- [0x06DD] = true,
- -- mandaic
- [0x0856] = true, [0x0858] = true, [0x0857] = true,
- -- n'ko
- [0x07FA] = true,
- -- also here:
- [zwnj] = true,
-}
-
-local final = { -- isol_fina
- [0x0622] = true, [0x0623] = true, [0x0624] = true, [0x0625] = true,
- [0x0627] = true, [0x0629] = true, [0x062F] = true, [0x0630] = true,
- [0x0631] = true, [0x0632] = true, [0x0648] = true, [0x0671] = true,
- [0x0672] = true, [0x0673] = true, [0x0675] = true, [0x0676] = true,
- [0x0677] = true, [0x0688] = true, [0x0689] = true, [0x068A] = true,
- [0x068B] = true, [0x068C] = true, [0x068D] = true, [0x068E] = true,
- [0x068F] = true, [0x0690] = true, [0x0691] = true, [0x0692] = true,
- [0x0693] = true, [0x0694] = true, [0x0695] = true, [0x0696] = true,
- [0x0697] = true, [0x0698] = true, [0x0699] = true, [0x06C0] = true,
- [0x06C3] = true, [0x06C4] = true, [0x06C5] = true, [0x06C6] = true,
- [0x06C7] = true, [0x06C8] = true, [0x06C9] = true, [0x06CA] = true,
- [0x06CB] = true, [0x06CD] = true, [0x06CF] = true, [0x06D2] = true,
- [0x06D3] = true, [0x06D5] = true, [0x06EE] = true, [0x06EF] = true,
- [0x0759] = true, [0x075A] = true, [0x075B] = true, [0x076B] = true,
- [0x076C] = true, [0x0771] = true, [0x0773] = true, [0x0774] = true,
- [0x0778] = true, [0x0779] = true,
- [0x08AA] = true, [0x08AB] = true, [0x08AC] = true,
- [0xFEF5] = true, [0xFEF7] = true, [0xFEF9] = true, [0xFEFB] = true,
- -- syriac
- [0x0710] = true, [0x0715] = true, [0x0716] = true, [0x0717] = true,
- [0x0718] = true, [0x0719] = true, [0x0728] = true, [0x072A] = true,
- [0x072C] = true, [0x071E] = true,
- [0x072F] = true, [0x074D] = true,
- -- mandaic
- [0x0840] = true, [0x0849] = true, [0x0854] = true, [0x0846] = true,
- [0x084F] = true
-}
-
-local medial = { -- isol_fina_medi_init
- [0x0626] = true, [0x0628] = true, [0x062A] = true, [0x062B] = true,
- [0x062C] = true, [0x062D] = true, [0x062E] = true, [0x0633] = true,
- [0x0634] = true, [0x0635] = true, [0x0636] = true, [0x0637] = true,
- [0x0638] = true, [0x0639] = true, [0x063A] = true, [0x063B] = true,
- [0x063C] = true, [0x063D] = true, [0x063E] = true, [0x063F] = true,
- [0x0641] = true, [0x0642] = true, [0x0643] = true,
- [0x0644] = true, [0x0645] = true, [0x0646] = true, [0x0647] = true,
- [0x0649] = true, [0x064A] = true, [0x066E] = true, [0x066F] = true,
- [0x0678] = true, [0x0679] = true, [0x067A] = true, [0x067B] = true,
- [0x067C] = true, [0x067D] = true, [0x067E] = true, [0x067F] = true,
- [0x0680] = true, [0x0681] = true, [0x0682] = true, [0x0683] = true,
- [0x0684] = true, [0x0685] = true, [0x0686] = true, [0x0687] = true,
- [0x069A] = true, [0x069B] = true, [0x069C] = true, [0x069D] = true,
- [0x069E] = true, [0x069F] = true, [0x06A0] = true, [0x06A1] = true,
- [0x06A2] = true, [0x06A3] = true, [0x06A4] = true, [0x06A5] = true,
- [0x06A6] = true, [0x06A7] = true, [0x06A8] = true, [0x06A9] = true,
- [0x06AA] = true, [0x06AB] = true, [0x06AC] = true, [0x06AD] = true,
- [0x06AE] = true, [0x06AF] = true, [0x06B0] = true, [0x06B1] = true,
- [0x06B2] = true, [0x06B3] = true, [0x06B4] = true, [0x06B5] = true,
- [0x06B6] = true, [0x06B7] = true, [0x06B8] = true, [0x06B9] = true,
- [0x06BA] = true, [0x06BB] = true, [0x06BC] = true, [0x06BD] = true,
- [0x06BE] = true, [0x06BF] = true, [0x06C1] = true, [0x06C2] = true,
- [0x06CC] = true, [0x06CE] = true, [0x06D0] = true, [0x06D1] = true,
- [0x06FA] = true, [0x06FB] = true, [0x06FC] = true, [0x06FF] = true,
- [0x0750] = true, [0x0751] = true, [0x0752] = true, [0x0753] = true,
- [0x0754] = true, [0x0755] = true, [0x0756] = true, [0x0757] = true,
- [0x0758] = true, [0x075C] = true, [0x075D] = true, [0x075E] = true,
- [0x075F] = true, [0x0760] = true, [0x0761] = true, [0x0762] = true,
- [0x0763] = true, [0x0764] = true, [0x0765] = true, [0x0766] = true,
- [0x0767] = true, [0x0768] = true, [0x0769] = true, [0x076A] = true,
- [0x076D] = true, [0x076E] = true, [0x076F] = true, [0x0770] = true,
- [0x0772] = true, [0x0775] = true, [0x0776] = true, [0x0777] = true,
- [0x077A] = true, [0x077B] = true, [0x077C] = true, [0x077D] = true,
- [0x077E] = true, [0x077F] = true,
- [0x08A0] = true, [0x08A2] = true, [0x08A4] = true, [0x08A5] = true,
- [0x08A6] = true, [0x0620] = true, [0x08A8] = true, [0x08A9] = true,
- [0x08A7] = true, [0x08A3] = true,
- -- syriac
- [0x0712] = true, [0x0713] = true, [0x0714] = true, [0x071A] = true,
- [0x071B] = true, [0x071C] = true, [0x071D] = true, [0x071F] = true,
- [0x0720] = true, [0x0721] = true, [0x0722] = true, [0x0723] = true,
- [0x0724] = true, [0x0725] = true, [0x0726] = true, [0x0727] = true,
- [0x0729] = true, [0x072B] = true, [0x072D] = true, [0x072E] = true,
- [0x074E] = true, [0x074F] = true,
- -- mandaic
- [0x0841] = true, [0x0842] = true, [0x0843] = true, [0x0844] = true,
- [0x0845] = true, [0x0847] = true, [0x0848] = true, [0x0855] = true,
- [0x0851] = true, [0x084E] = true, [0x084D] = true, [0x084A] = true,
- [0x084B] = true, [0x084C] = true, [0x0850] = true, [0x0852] = true,
- [0x0853] = true,
- -- n'ko
- [0x07D7] = true, [0x07E8] = true, [0x07D9] = true, [0x07EA] = true,
- [0x07CA] = true, [0x07DB] = true, [0x07CC] = true, [0x07DD] = true,
- [0x07CE] = true, [0x07DF] = true, [0x07D4] = true, [0x07E5] = true,
- [0x07E9] = true, [0x07E7] = true, [0x07E3] = true, [0x07E2] = true,
- [0x07E0] = true, [0x07E1] = true, [0x07DE] = true, [0x07DC] = true,
- [0x07D1] = true, [0x07DA] = true, [0x07D8] = true, [0x07D6] = true,
- [0x07D2] = true, [0x07D0] = true, [0x07CF] = true, [0x07CD] = true,
- [0x07CB] = true, [0x07D3] = true, [0x07E4] = true, [0x07D5] = true,
- [0x07E6] = true,
- -- also here:
- [tatweel]= true,
- [zwj] = true,
-}
+-------.dflt = analyzers.setstate % can be an option or just the default
local arab_warned = { }
--- todo: gref
-
local function warning(current,what)
- local char = current.char
+ local char = getchar(current)
if not arab_warned[char] then
log.report("analyze","arab: character %C has no %a class",char,what)
arab_warned[char] = true
end
end
--- potential optimization: local medial_final = table.merged(medial,final)
+local mappers = {
+ l = s_init, -- left
+ d = s_medi, -- double
+ c = s_medi, -- joiner
+ r = s_fina, -- right
+ u = s_isol, -- nonjoiner
+}
-local function finish(first,last)
- if last then
- if first == last then
- local fc = first.char
- if medial[fc] or final[fc] then
- first[a_state] = s_isol
- else
- warning(first,"isol")
- first[a_state] = s_error
+local classifiers = { } -- we can also use this trick for devanagari
+
+local first_arabic, last_arabic = characters.blockrange("arabic")
+local first_syriac, last_syriac = characters.blockrange("syriac")
+local first_mandiac, last_mandiac = characters.blockrange("mandiac")
+local first_nko, last_nko = characters.blockrange("nko")
+
+table.setmetatableindex(classifiers,function(t,k)
+ local c = chardata[k]
+ local v = false
+ if c then
+ local arabic = c.arabic
+ if arabic then
+ v = mappers[arabic]
+ if not v then
+ log.report("analyze","error in mapping arabic %C",k)
+ -- error
+ v = false
end
- else
- local lc = last.char
- if medial[lc] or final[lc] then
- -- if laststate == 1 or laststate == 2 or laststate == 4 then
- last[a_state] = s_fina
+ elseif k >= first_arabic and k <= last_arabic or k >= first_syriac and k <= last_syriac or
+ k >= first_mandiac and k <= last_mandiac or k >= first_nko and k <= last_nko then
+ if categories[k] == "mn" then
+ v = s_mark
else
- warning(last,"fina")
- last[a_state] = s_error
+ v = s_rest
end
- end
- first, last = nil, nil
- elseif first then
- -- first and last are either both set so we never com here
- local fc = first.char
- if medial[fc] or final[fc] then
- first[a_state] = s_isol
else
- warning(first,"isol")
- first[a_state] = s_error
end
- first = nil
end
- return first, last
-end
+ t[k] = v
+ return v
+end)
function methods.arab(head,font,attr)
- local useunicodemarks = analyzers.useunicodemarks
- local tfmdata = fontdata[font]
- local marks = tfmdata.resources.marks
- local first, last, current, done = nil, nil, head, false
+ local first, last = nil, nil
+ local c_first, c_last = nil, nil
+ local current, done = head, false
+ current = tonut(current)
while current do
- local id = current.id
- if id == glyph_code and current.font == font and current.subtype<256 and not current[a_state] then
+ local id = getid(current)
+ if id == glyph_code and getfont(current) == font and getsubtype(current)<256 and not getprop(current,a_state) then
done = true
- local char = current.char
- if marks[char] or (useunicodemarks and categories[char] == "mn") then
- current[a_state] = s_mark
- elseif isolated[char] then -- can be zwj or zwnj too
- first, last = finish(first,last)
- current[a_state] = s_isol
- first, last = nil, nil
- elseif not first then
- if medial[char] then
- current[a_state] = s_init
- first, last = first or current, current
- elseif final[char] then
- current[a_state] = s_isol
+ local char = getchar(current)
+ local classifier = classifiers[char]
+ if not classifier then
+ if last then
+ if c_last == s_medi or c_last == s_fina then
+ setprop(last,a_state,s_fina)
+ else
+ warning(last,"fina")
+ setprop(last,a_state,s_error)
+ end
+ first, last = nil, nil
+ elseif first then
+ if c_first == s_medi or c_first == s_fina then
+ setprop(first,a_state,s_isol)
+ else
+ warning(first,"isol")
+ setprop(first,a_state,s_error)
+ end
+ first = nil
+ end
+ elseif classifier == s_mark then
+ setprop(current,a_state,s_mark)
+ elseif classifier == s_isol then
+ if last then
+ if c_last == s_medi or c_last == s_fina then
+ setprop(last,a_state,s_fina)
+ else
+ warning(last,"fina")
+ setprop(last,a_state,s_error)
+ end
first, last = nil, nil
- else -- no arab
- first, last = finish(first,last)
+ elseif first then
+ if c_first == s_medi or c_first == s_fina then
+ setprop(first,a_state,s_isol)
+ else
+ warning(first,"isol")
+ setprop(first,a_state,s_error)
+ end
+ first = nil
end
- elseif medial[char] then
- first, last = first or current, current
- current[a_state] = s_medi
- elseif final[char] then
- if not last[a_state] == s_init then
- -- tricky, we need to check what last may be !
- last[a_state] = s_medi
+ setprop(current,a_state,s_isol)
+ elseif classifier == s_medi then
+ if first then
+ last = current
+ c_last = classifier
+ setprop(current,a_state,s_medi)
+ else
+ setprop(current,a_state,s_init)
+ first = current
+ c_first = classifier
+ end
+ elseif classifier == s_fina then
+ if last then
+ if getprop(last,a_state) ~= s_init then
+ setprop(last,a_state,s_medi)
+ end
+ setprop(current,a_state,s_fina)
+ first, last = nil, nil
+ elseif first then
+ -- if getprop(first,a_state) ~= s_init then
+ -- -- needs checking
+ -- setprop(first,a_state,s_medi)
+ -- end
+ setprop(current,a_state,s_fina)
+ first = nil
+ else
+ setprop(current,a_state,s_isol)
+ end
+ else -- classifier == s_rest
+ setprop(current,a_state,s_rest)
+ if last then
+ if c_last == s_medi or c_last == s_fina then
+ setprop(last,a_state,s_fina)
+ else
+ warning(last,"fina")
+ setprop(last,a_state,s_error)
+ end
+ first, last = nil, nil
+ elseif first then
+ if c_first == s_medi or c_first == s_fina then
+ setprop(first,a_state,s_isol)
+ else
+ warning(first,"isol")
+ setprop(first,a_state,s_error)
+ end
+ first = nil
end
- current[a_state] = s_fina
- first, last = nil, nil
- elseif char >= 0x0600 and char <= 0x06FF then -- needs checking
- current[a_state] = s_rest
- first, last = finish(first,last)
- else -- no
- first, last = finish(first,last)
end
else
- if first or last then
- first, last = finish(first,last)
+ if last then
+ if c_last == s_medi or c_last == s_fina then
+ setprop(last,a_state,s_fina)
+ else
+ warning(last,"fina")
+ setprop(last,a_state,s_error)
+ end
+ first, last = nil, nil
+ elseif first then
+ if c_first == s_medi or c_first == s_fina then
+ setprop(first,a_state,s_isol)
+ else
+ warning(first,"isol")
+ setprop(first,a_state,s_error)
+ end
+ first = nil
end
- if id == math_code then
+ if id == math_code then -- a bit duplicate as we test for glyphs twice
current = end_of_math(current)
end
end
- current = current.next
+ current = getnext(current)
end
- if first or last then
- finish(first,last)
+ if last then
+ if c_last == s_medi or c_last == s_fina then
+ setprop(last,a_state,s_fina)
+ else
+ warning(last,"fina")
+ setprop(last,a_state,s_error)
+ end
+ elseif first then
+ if c_first == s_medi or c_first == s_fina then
+ setprop(first,a_state,s_isol)
+ else
+ warning(first,"isol")
+ setprop(first,a_state,s_error)
+ end
end
return head, done
end
diff --git a/Master/texmf-dist/tex/context/base/font-otb.lua b/Master/texmf-dist/tex/context/base/font-otb.lua
index 2e98d3ecbb9..4e955a19774 100644
--- a/Master/texmf-dist/tex/context/base/font-otb.lua
+++ b/Master/texmf-dist/tex/context/base/font-otb.lua
@@ -7,7 +7,7 @@ if not modules then modules = { } end modules ['font-otb'] = {
}
local concat = table.concat
local format, gmatch, gsub, find, match, lower, strip = string.format, string.gmatch, string.gsub, string.find, string.match, string.lower, string.strip
-local type, next, tonumber, tostring = type, next, tonumber, tostring
+local type, next, tonumber, tostring, rawget = type, next, tonumber, tostring, rawget
local lpegmatch = lpeg.match
local utfchar = utf.char
@@ -63,40 +63,40 @@ local function gref(descriptions,n)
end
end
-local function cref(feature,lookupname)
+local function cref(feature,lookuptags,lookupname)
if lookupname then
- return formatters["feature %a, lookup %a"](feature,lookupname)
+ return formatters["feature %a, lookup %a"](feature,lookuptags[lookupname])
else
return formatters["feature %a"](feature)
end
end
-local function report_alternate(feature,lookupname,descriptions,unicode,replacement,value,comment)
+local function report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,comment)
report_prepare("%s: base alternate %s => %s (%S => %S)",
- cref(feature,lookupname),
+ cref(feature,lookuptags,lookupname),
gref(descriptions,unicode),
replacement and gref(descriptions,replacement),
value,
comment)
end
-local function report_substitution(feature,lookupname,descriptions,unicode,substitution)
+local function report_substitution(feature,lookuptags,lookupname,descriptions,unicode,substitution)
report_prepare("%s: base substitution %s => %S",
- cref(feature,lookupname),
+ cref(feature,lookuptags,lookupname),
gref(descriptions,unicode),
gref(descriptions,substitution))
end
-local function report_ligature(feature,lookupname,descriptions,unicode,ligature)
+local function report_ligature(feature,lookuptags,lookupname,descriptions,unicode,ligature)
report_prepare("%s: base ligature %s => %S",
- cref(feature,lookupname),
+ cref(feature,lookuptags,lookupname),
gref(descriptions,ligature),
gref(descriptions,unicode))
end
-local function report_kern(feature,lookupname,descriptions,unicode,otherunicode,value)
+local function report_kern(feature,lookuptags,lookupname,descriptions,unicode,otherunicode,value)
report_prepare("%s: base kern %s + %s => %S",
- cref(feature,lookupname),
+ cref(feature,lookuptags,lookupname),
gref(descriptions,unicode),
gref(descriptions,otherunicode),
value)
@@ -181,7 +181,7 @@ local function finalize_ligatures(tfmdata,ligatures)
local characters = tfmdata.characters
local descriptions = tfmdata.descriptions
local resources = tfmdata.resources
- local unicodes = resources.unicodes
+ local unicodes = resources.unicodes -- we use rawget in order to avoid bulding the table
local private = resources.private
local alldone = false
while not alldone do
@@ -217,12 +217,12 @@ local function finalize_ligatures(tfmdata,ligatures)
local secondname = firstname .. "_" .. secondcode
if i == size - 1 then
target = unicode
- if not unicodes[secondname] then
+ if not rawget(unicodes,secondname) then
unicodes[secondname] = unicode -- map final ligature onto intermediates
end
okay = true
else
- target = unicodes[secondname]
+ target = rawget(unicodes,secondname)
if not target then
break
end
@@ -258,6 +258,7 @@ local function finalize_ligatures(tfmdata,ligatures)
end
end
resources.private = private
+ return true
end
end
@@ -265,13 +266,14 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis
local characters = tfmdata.characters
local descriptions = tfmdata.descriptions
local resources = tfmdata.resources
+ local properties = tfmdata.properties
local changed = tfmdata.changed
- local unicodes = resources.unicodes
local lookuphash = resources.lookuphash
local lookuptypes = resources.lookuptypes
+ local lookuptags = resources.lookuptags
local ligatures = { }
- local alternate = tonumber(value)
+ local alternate = tonumber(value) or true and 1
local defaultalt = otf.defaultbasealternate
local trace_singles = trace_baseinit and trace_singles
@@ -279,39 +281,39 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis
local trace_ligatures = trace_baseinit and trace_ligatures
local actions = {
- substitution = function(lookupdata,lookupname,description,unicode)
+ substitution = function(lookupdata,lookuptags,lookupname,description,unicode)
if trace_singles then
- report_substitution(feature,lookupname,descriptions,unicode,lookupdata)
+ report_substitution(feature,lookuptags,lookupname,descriptions,unicode,lookupdata)
end
changed[unicode] = lookupdata
end,
- alternate = function(lookupdata,lookupname,description,unicode)
+ alternate = function(lookupdata,lookuptags,lookupname,description,unicode)
local replacement = lookupdata[alternate]
if replacement then
changed[unicode] = replacement
if trace_alternatives then
- report_alternate(feature,lookupname,descriptions,unicode,replacement,value,"normal")
+ report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,"normal")
end
elseif defaultalt == "first" then
replacement = lookupdata[1]
changed[unicode] = replacement
if trace_alternatives then
- report_alternate(feature,lookupname,descriptions,unicode,replacement,value,defaultalt)
+ report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,defaultalt)
end
elseif defaultalt == "last" then
replacement = lookupdata[#data]
if trace_alternatives then
- report_alternate(feature,lookupname,descriptions,unicode,replacement,value,defaultalt)
+ report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,defaultalt)
end
else
if trace_alternatives then
- report_alternate(feature,lookupname,descriptions,unicode,replacement,value,"unknown")
+ report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,"unknown")
end
end
end,
- ligature = function(lookupdata,lookupname,description,unicode)
+ ligature = function(lookupdata,lookuptags,lookupname,description,unicode)
if trace_ligatures then
- report_ligature(feature,lookupname,descriptions,unicode,lookupdata)
+ report_ligature(feature,lookuptags,lookupname,descriptions,unicode,lookupdata)
end
ligatures[#ligatures+1] = { unicode, lookupdata }
end,
@@ -328,7 +330,7 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis
local lookuptype = lookuptypes[lookupname]
local action = actions[lookuptype]
if action then
- action(lookupdata,lookupname,description,unicode)
+ action(lookupdata,lookuptags,lookupname,description,unicode)
end
end
end
@@ -343,24 +345,25 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis
local action = actions[lookuptype]
if action then
for i=1,#lookuplist do
- action(lookuplist[i],lookupname,description,unicode)
+ action(lookuplist[i],lookuptags,lookupname,description,unicode)
end
end
end
end
end
end
-
- finalize_ligatures(tfmdata,ligatures)
+ properties.hasligatures = finalize_ligatures(tfmdata,ligatures)
end
local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist) -- todo what kind of kerns, currently all
local characters = tfmdata.characters
local descriptions = tfmdata.descriptions
local resources = tfmdata.resources
- local unicodes = resources.unicodes
+ local properties = tfmdata.properties
+ local lookuptags = resources.lookuptags
local sharedkerns = { }
local traceindeed = trace_baseinit and trace_kerns
+ local haskerns = false
for unicode, character in next, characters do
local description = descriptions[unicode]
local rawkerns = description.kerns -- shared
@@ -384,13 +387,13 @@ local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist
newkerns = { [otherunicode] = value }
done = true
if traceindeed then
- report_kern(feature,lookup,descriptions,unicode,otherunicode,value)
+ report_kern(feature,lookuptags,lookup,descriptions,unicode,otherunicode,value)
end
elseif not newkerns[otherunicode] then -- first wins
newkerns[otherunicode] = value
done = true
if traceindeed then
- report_kern(feature,lookup,descriptions,unicode,otherunicode,value)
+ report_kern(feature,lookuptags,lookup,descriptions,unicode,otherunicode,value)
end
end
end
@@ -399,12 +402,14 @@ local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist
if done then
sharedkerns[rawkerns] = newkerns
character.kerns = newkerns -- no empty assignments
+ haskerns = true
else
sharedkerns[rawkerns] = false
end
end
end
end
+ properties.haskerns = haskerns
end
basemethods.independent = {
@@ -434,13 +439,13 @@ local function make_1(present,tree,name)
end
end
-local function make_2(present,tfmdata,characters,tree,name,preceding,unicode,done,lookupname)
+local function make_2(present,tfmdata,characters,tree,name,preceding,unicode,done,lookuptags,lookupname)
for k, v in next, tree do
if k == "ligature" then
local character = characters[preceding]
if not character then
if trace_baseinit then
- report_prepare("weird ligature in lookup %a, current %C, preceding %C",lookupname,v,preceding)
+ report_prepare("weird ligature in lookup %a, current %C, preceding %C",lookuptags[lookupname],v,preceding)
end
character = makefake(tfmdata,name,present)
end
@@ -461,7 +466,7 @@ local function make_2(present,tfmdata,characters,tree,name,preceding,unicode,don
else
local code = present[name] or unicode
local name = name .. "_" .. k
- make_2(present,tfmdata,characters,v,name,code,k,done,lookupname)
+ make_2(present,tfmdata,characters,v,name,code,k,done,lookuptags,lookupname)
end
end
end
@@ -473,9 +478,10 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis
local changed = tfmdata.changed
local lookuphash = resources.lookuphash
local lookuptypes = resources.lookuptypes
+ local lookuptags = resources.lookuptags
local ligatures = { }
- local alternate = tonumber(value)
+ local alternate = tonumber(value) or true and 1
local defaultalt = otf.defaultbasealternate
local trace_singles = trace_baseinit and trace_singles
@@ -489,36 +495,36 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis
for unicode, data in next, lookupdata do
if lookuptype == "substitution" then
if trace_singles then
- report_substitution(feature,lookupname,descriptions,unicode,data)
+ report_substitution(feature,lookuptags,lookupname,descriptions,unicode,data)
end
changed[unicode] = data
elseif lookuptype == "alternate" then
- local replacement = data[alternate]
+ local replacement = data[alternate]
if replacement then
changed[unicode] = replacement
if trace_alternatives then
- report_alternate(feature,lookupname,descriptions,unicode,replacement,value,"normal")
+ report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,"normal")
end
elseif defaultalt == "first" then
replacement = data[1]
changed[unicode] = replacement
if trace_alternatives then
- report_alternate(feature,lookupname,descriptions,unicode,replacement,value,defaultalt)
+ report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,defaultalt)
end
elseif defaultalt == "last" then
replacement = data[#data]
if trace_alternatives then
- report_alternate(feature,lookupname,descriptions,unicode,replacement,value,defaultalt)
+ report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,defaultalt)
end
else
if trace_alternatives then
- report_alternate(feature,lookupname,descriptions,unicode,replacement,value,"unknown")
+ report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,"unknown")
end
end
elseif lookuptype == "ligature" then
ligatures[#ligatures+1] = { unicode, data, lookupname }
if trace_ligatures then
- report_ligature(feature,lookupname,descriptions,unicode,data)
+ report_ligature(feature,lookuptags,lookupname,descriptions,unicode,data)
end
end
end
@@ -541,7 +547,7 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis
for i=1,nofligatures do
local ligature = ligatures[i]
local unicode, tree, lookupname = ligature[1], ligature[2], ligature[3]
- make_2(present,tfmdata,characters,tree,"ctx_"..unicode,unicode,unicode,done,lookupname)
+ make_2(present,tfmdata,characters,tree,"ctx_"..unicode,unicode,unicode,done,lookuptags,lookupname)
end
end
@@ -552,11 +558,11 @@ local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist
local characters = tfmdata.characters
local descriptions = tfmdata.descriptions
local resources = tfmdata.resources
+ local properties = tfmdata.properties
local lookuphash = resources.lookuphash
+ local lookuptags = resources.lookuptags
local traceindeed = trace_baseinit and trace_kerns
-
-- check out this sharedkerns trickery
-
for l=1,#lookuplist do
local lookupname = lookuplist[l]
local lookupdata = lookuphash[lookupname]
@@ -571,7 +577,7 @@ local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist
for otherunicode, kern in next, data do
if not kerns[otherunicode] and kern ~= 0 then
kerns[otherunicode] = kern
- report_kern(feature,lookup,descriptions,unicode,otherunicode,kern)
+ report_kern(feature,lookuptags,lookup,descriptions,unicode,otherunicode,kern)
end
end
else
@@ -602,7 +608,7 @@ local function featuresinitializer(tfmdata,value)
if true then -- value then
local starttime = trace_preparing and os.clock()
local features = tfmdata.shared.features
- local fullname = trace_preparing and tfmdata.properties.fullname
+ local fullname = tfmdata.properties.fullname or "?"
if features then
applybasemethod("initializehashes",tfmdata)
local collectlookups = otf.collectlookups
@@ -648,21 +654,22 @@ local function featuresinitializer(tfmdata,value)
if order then
for i=1,#order do --
local feature = order[i]
- if features[feature] then
+ local value = features[feature]
+ if value then
local validlookups, lookuplist = collectlookups(rawdata,feature,script,language)
if not validlookups then
-- skip
elseif basesubstitutions and basesubstitutions[feature] then
if trace_preparing then
- report_prepare("filtering base feature %a for %a",feature,fullname)
+ report_prepare("filtering base %s feature %a for %a with value %a","sub",feature,fullname,value)
end
applybasemethod("preparesubstitutions",tfmdata,feature,value,validlookups,lookuplist)
registerbasefeature(feature,value)
elseif basepositionings and basepositionings[feature] then
if trace_preparing then
- report_prepare("filtering base feature %a for %a",feature,fullname)
+ report_prepare("filtering base %a feature %a for %a with value %a","pos",feature,fullname,value)
end
- applybasemethod("preparepositionings",tfmdata,feature,features[feature],validlookups,lookuplist)
+ applybasemethod("preparepositionings",tfmdata,feature,value,validlookups,lookuplist)
registerbasefeature(feature,value)
end
end
diff --git a/Master/texmf-dist/tex/context/base/font-otf.lua b/Master/texmf-dist/tex/context/base/font-otf.lua
index 0a5d1cfea04..85eebaaebd0 100644
--- a/Master/texmf-dist/tex/context/base/font-otf.lua
+++ b/Master/texmf-dist/tex/context/base/font-otf.lua
@@ -24,7 +24,9 @@ local reversed, concat, remove, sortedkeys = table.reversed, table.concat, table
local ioflush = io.flush
local fastcopy, tohash, derivetable = table.fastcopy, table.tohash, table.derive
local formatters = string.formatters
+local P, R, S, C, Ct, lpegmatch = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Ct, lpeg.match
+local setmetatableindex = table.setmetatableindex
local allocate = utilities.storage.allocate
local registertracker = trackers.register
local registerdirective = directives.register
@@ -33,13 +35,16 @@ local stoptiming = statistics.stoptiming
local elapsedtime = statistics.elapsedtime
local findbinfile = resolvers.findbinfile
-local trace_private = false registertracker("otf.private", function(v) trace_private = v end)
-local trace_loading = false registertracker("otf.loading", function(v) trace_loading = v end)
-local trace_features = false registertracker("otf.features", function(v) trace_features = v end)
-local trace_dynamics = false registertracker("otf.dynamics", function(v) trace_dynamics = v end)
-local trace_sequences = false registertracker("otf.sequences", function(v) trace_sequences = v end)
-local trace_markwidth = false registertracker("otf.markwidth", function(v) trace_markwidth = v end)
-local trace_defining = false registertracker("fonts.defining", function(v) trace_defining = v end)
+local trace_private = false registertracker("otf.private", function(v) trace_private = v end)
+local trace_loading = false registertracker("otf.loading", function(v) trace_loading = v end)
+local trace_features = false registertracker("otf.features", function(v) trace_features = v end)
+local trace_dynamics = false registertracker("otf.dynamics", function(v) trace_dynamics = v end)
+local trace_sequences = false registertracker("otf.sequences", function(v) trace_sequences = v end)
+local trace_markwidth = false registertracker("otf.markwidth", function(v) trace_markwidth = v end)
+local trace_defining = false registertracker("fonts.defining", function(v) trace_defining = v end)
+
+local compact_lookups = true registertracker("otf.compactlookups", function(v) compact_lookups = v end)
+local purge_names = true registertracker("otf.purgenames", function(v) purge_names = v end)
local report_otf = logs.reporter("fonts","otf loading")
@@ -48,13 +53,18 @@ local otf = fonts.handlers.otf
otf.glists = { "gsub", "gpos" }
-otf.version = 2.755 -- beware: also sync font-mis.lua
+otf.version = 2.803 -- beware: also sync font-mis.lua
otf.cache = containers.define("fonts", "otf", otf.version, true)
-local fontdata = fonts.hashes.identifiers
+local hashes = fonts.hashes
+local definers = fonts.definers
+local readers = fonts.readers
+local constructors = fonts.constructors
+
+local fontdata = hashes and hashes.identifiers
local chardata = characters and characters.data -- not used
-local otffeatures = fonts.constructors.newfeatures("otf")
+local otffeatures = constructors.newfeatures("otf")
local registerotffeature = otffeatures.register
local enhancers = allocate()
@@ -62,13 +72,8 @@ otf.enhancers = enhancers
local patches = { }
enhancers.patches = patches
-local definers = fonts.definers
-local readers = fonts.readers
-local constructors = fonts.constructors
-
local forceload = false
local cleanup = 0 -- mk: 0=885M 1=765M 2=735M (regular run 730M)
-local usemetatables = false -- .4 slower on mk but 30 M less mem so we might change the default -- will be directive
local packdata = true
local syncspace = true
local forcenotdef = false
@@ -80,7 +85,12 @@ local applyruntimefixes = fonts.treatments and fonts.treatments.applyfixes
local wildcard = "*"
local default = "dflt"
-local fontloaderfields = fontloader.fields
+local fontloader = fontloader
+local open_font = fontloader.open
+local close_font = fontloader.close
+local font_fields = fontloader.fields
+local apply_featurefile = fontloader.apply_featurefile
+
local mainfields = nil
local glyphfields = nil -- not used yet
@@ -93,11 +103,11 @@ formats.dfont = "truetype"
registerdirective("fonts.otf.loader.cleanup", function(v) cleanup = tonumber(v) or (v and 1) or 0 end)
registerdirective("fonts.otf.loader.force", function(v) forceload = v end)
-registerdirective("fonts.otf.loader.usemetatables", function(v) usemetatables = v end)
registerdirective("fonts.otf.loader.pack", function(v) packdata = v end)
registerdirective("fonts.otf.loader.syncspace", function(v) syncspace = v end)
registerdirective("fonts.otf.loader.forcenotdef", function(v) forcenotdef = v end)
registerdirective("fonts.otf.loader.overloadkerns", function(v) overloadkerns = v end)
+-----------------("fonts.otf.loader.alldimensions", function(v) alldimensions = v end)
function otf.fileformat(filename)
local leader = lower(io.loadchunk(filename,4))
@@ -134,7 +144,7 @@ local function load_featurefile(raw,featurefile)
if trace_loading then
report_otf("using featurefile %a", featurefile)
end
- fontloader.apply_featurefile(raw, featurefile)
+ apply_featurefile(raw, featurefile)
end
end
@@ -203,7 +213,6 @@ local valid_fields = table.tohash {
"extrema_bound",
"familyname",
"fontname",
- "fontname",
"fontstyle_id",
"fontstyle_name",
"fullname",
@@ -256,7 +265,7 @@ local ordered_enhancers = {
"analyze glyphs",
"analyze math",
- "prepare tounicode", -- maybe merge with prepare
+ -- "prepare tounicode",
"reorganize lookups",
"reorganize mark classes",
@@ -275,10 +284,15 @@ local ordered_enhancers = {
"check metadata",
"check extra features", -- after metadata
+ "prepare tounicode",
+
"check encoding", -- moved
"add duplicates",
"cleanup tables",
+
+ "compact lookups",
+ "purge names",
}
--[[ldx--
@@ -430,12 +444,12 @@ function otf.load(filename,sub,featurefile) -- second argument (format) is gone
report_otf("loading %a, hash %a",filename,hash)
local fontdata, messages
if sub then
- fontdata, messages = fontloader.open(filename,sub)
+ fontdata, messages = open_font(filename,sub)
else
- fontdata, messages = fontloader.open(filename)
+ fontdata, messages = open_font(filename)
end
if fontdata then
- mainfields = mainfields or (fontloaderfields and fontloaderfields(fontdata))
+ mainfields = mainfields or (font_fields and font_fields(fontdata))
end
if trace_loading and messages and #messages > 0 then
if type(messages) == "string" then
@@ -480,6 +494,8 @@ function otf.load(filename,sub,featurefile) -- second argument (format) is gone
lookuptypes = {
},
},
+ warnings = {
+ },
metadata = {
-- raw metadata, not to be used
},
@@ -492,7 +508,7 @@ function otf.load(filename,sub,featurefile) -- second argument (format) is gone
},
helpers = { -- might go away
tounicodelist = splitter,
- tounicodetable = lpeg.Ct(splitter),
+ tounicodetable = Ct(splitter),
},
}
starttiming(data)
@@ -517,7 +533,7 @@ function otf.load(filename,sub,featurefile) -- second argument (format) is gone
report_otf("preprocessing and caching time %s, packtime %s",
elapsedtime(data),packdata and elapsedtime(packtime) or 0)
end
- fontloader.close(fontdata) -- free memory
+ close_font(fontdata) -- free memory
if cleanup > 3 then
collectgarbage("collect")
end
@@ -535,6 +551,39 @@ function otf.load(filename,sub,featurefile) -- second argument (format) is gone
report_otf("loading from cache using hash %a",hash)
end
enhance("unpack",data,filename,nil,false)
+ --
+ local resources = data.resources
+ local lookuptags = resources.lookuptags
+ local unicodes = resources.unicodes
+ if not lookuptags then
+ lookuptags = { }
+ resources.lookuptags = lookuptags
+ end
+ setmetatableindex(lookuptags,function(t,k)
+ local v = type(k) == "number" and ("lookup " .. k) or k
+ t[k] = v
+ return v
+ end)
+ if not unicodes then
+ unicodes = { }
+ resources.unicodes = unicodes
+ setmetatableindex(unicodes,function(t,k)
+ -- use rawget when no table has to be built
+ setmetatableindex(unicodes,nil)
+ for u, d in next, data.descriptions do
+ local n = d.name
+ if n then
+ t[n] = u
+ -- report_otf("accessing known name %a",k)
+ else
+ -- report_otf("accessing unknown name %a",k)
+ end
+ end
+ return rawget(t,k)
+ end)
+ end
+ constructors.addcoreunicodes(unicodes) -- do we really need this?
+ --
if applyruntimefixes then
applyruntimefixes(filename,data)
end
@@ -576,31 +625,29 @@ actions["add dimensions"] = function(data,filename)
local defaultheight = resources.defaultheight or 0
local defaultdepth = resources.defaultdepth or 0
local basename = trace_markwidth and file.basename(filename)
- if usemetatables then
- for _, d in next, descriptions do
- local wd = d.width
- if not wd then
- d.width = defaultwidth
- elseif trace_markwidth and wd ~= 0 and d.class == "mark" then
- report_otf("mark %a with width %b found in %a",d.name or "<noname>",wd,basename)
- -- d.width = -wd
- end
- setmetatable(d,mt)
+ for _, d in next, descriptions do
+ local bb, wd = d.boundingbox, d.width
+ if not wd then
+ -- or bb?
+ d.width = defaultwidth
+ elseif trace_markwidth and wd ~= 0 and d.class == "mark" then
+ report_otf("mark %a with width %b found in %a",d.name or "<noname>",wd,basename)
+ -- d.width = -wd
end
- else
- for _, d in next, descriptions do
- local bb, wd = d.boundingbox, d.width
- if not wd then
- d.width = defaultwidth
- elseif trace_markwidth and wd ~= 0 and d.class == "mark" then
- report_otf("mark %a with width %b found in %a",d.name or "<noname>",wd,basename)
- -- d.width = -wd
- end
- -- if forcenotdef and not d.name then
- -- d.name = ".notdef"
- -- end
- if bb then
- local ht, dp = bb[4], -bb[2]
+ -- if forcenotdef and not d.name then
+ -- d.name = ".notdef"
+ -- end
+ if bb then
+ local ht = bb[4]
+ local dp = -bb[2]
+ -- if alldimensions then
+ -- if ht ~= 0 then
+ -- d.height = ht
+ -- end
+ -- if dp ~= 0 then
+ -- d.depth = dp
+ -- end
+ -- else
if ht == 0 or ht < 0 then
-- not set
else
@@ -611,7 +658,7 @@ actions["add dimensions"] = function(data,filename)
else
d.depth = dp
end
- end
+ -- end
end
end
end
@@ -683,28 +730,31 @@ actions["prepare glyphs"] = function(data,filename,raw)
if includesubfonts then
metadata.subfonts[cidindex] = somecopy(subfont)
end
+ -- we have delayed loading so we cannot use next
for index=0,subfont.glyphcnt-1 do -- we could take the previous glyphcnt instead of 0
local glyph = cidglyphs[index]
if glyph then
local unicode = glyph.unicode
-if unicode >= 0x00E000 and unicode <= 0x00F8FF then
+ if unicode >= 0x00E000 and unicode <= 0x00F8FF then
unicode = -1
-elseif unicode >= 0x0F0000 and unicode <= 0x0FFFFD then
+ elseif unicode >= 0x0F0000 and unicode <= 0x0FFFFD then
unicode = -1
-elseif unicode >= 0x100000 and unicode <= 0x10FFFD then
+ elseif unicode >= 0x100000 and unicode <= 0x10FFFD then
unicode = -1
-end
- local name = glyph.name or cidnames[index]
+ end
+ local name = glyph.name or cidnames[index]
if not unicode or unicode == -1 then -- or unicode >= criterium then
unicode = cidunicodes[index]
end
if unicode and descriptions[unicode] then
- report_otf("preventing glyph %a at index %H to overload unicode %U",name or "noname",index,unicode)
+ if trace_private then
+ report_otf("preventing glyph %a at index %H to overload unicode %U",name or "noname",index,unicode)
+ end
unicode = -1
end
if not unicode or unicode == -1 then -- or unicode >= criterium then
if not name then
- name = format("u%06X",private)
+ name = format("u%06X.ctx",private)
end
unicode = private
unicodes[name] = private
@@ -714,14 +764,25 @@ end
private = private + 1
nofnames = nofnames + 1
else
+ -- if unicode > criterium then
+ -- local taken = descriptions[unicode]
+ -- if taken then
+ -- private = private + 1
+ -- descriptions[private] = taken
+ -- unicodes[taken.name] = private
+ -- indices[taken.index] = private
+ -- if trace_private then
+ -- report_otf("slot %U is moved to %U due to private in font",unicode)
+ -- end
+ -- end
+ -- end
if not name then
- name = format("u%06X",unicode)
+ name = format("u%06X.ctx",unicode)
end
unicodes[name] = unicode
nofunicodes = nofunicodes + 1
end
indices[index] = unicode -- each index is unique (at least now)
-
local description = {
-- width = glyph.width,
boundingbox = glyph.boundingbox,
@@ -730,7 +791,6 @@ end
index = index,
glyph = glyph,
}
-
descriptions[unicode] = description
else
-- report_otf("potential problem: glyph %U is used but empty",index)
@@ -762,12 +822,37 @@ end
end
private = private + 1
else
+ -- We have a font that uses and exposes the private area. As this is rather unreliable it's
+ -- advised no to trust slots here (better use glyphnames). Anyway, we need a double check:
+ -- we need to move already moved entries and we also need to bump the next private to after
+ -- the (currently) last slot. This could leave us with a hole but we have holes anyway.
+ if unicode > criterium then
+ -- \definedfont[file:HANBatang-LVT.ttf] \fontchar{uF0135} \char"F0135
+ local taken = descriptions[unicode]
+ if taken then
+ if unicode >= private then
+ private = unicode + 1 -- restart private (so we can have mixed now)
+ else
+ private = private + 1 -- move on
+ end
+ descriptions[private] = taken
+ unicodes[taken.name] = private
+ indices[taken.index] = private
+ if trace_private then
+ report_otf("slot %U is moved to %U due to private in font",unicode)
+ end
+ else
+ if unicode >= private then
+ private = unicode + 1 -- restart (so we can have mixed now)
+ end
+ end
+ end
unicodes[name] = unicode
end
indices[index] = unicode
- if not name then
- name = format("u%06X",unicode)
- end
+ -- if not name then
+ -- name = format("u%06X",unicode) -- u%06X.ctx
+ -- end
descriptions[unicode] = {
-- width = glyph.width,
boundingbox = glyph.boundingbox,
@@ -921,8 +1006,8 @@ actions["add duplicates"] = function(data,filename,raw)
local description = descriptions[unicode]
local n = 0
for _, description in next, descriptions do
+ local kerns = description.kerns
if kerns then
- local kerns = description.kerns
for _, k in next, kerns do
local ku = k[unicode]
if ku then
@@ -1260,9 +1345,9 @@ local function s_uncover(splitter,cache,cover)
local uncovered = cache[cover]
if not uncovered then
uncovered = lpegmatch(splitter,cover)
--- for i=1,#uncovered do
--- uncovered[i] = { [uncovered[i]] = true }
--- end
+ -- for i=1,#uncovered do
+ -- uncovered[i] = { [uncovered[i]] = true }
+ -- end
cache[cover] = uncovered
end
return { uncovered }
@@ -1276,9 +1361,14 @@ local function t_hashed(t,cache)
local ti = t[i]
local tih = cache[ti]
if not tih then
- tih = { }
- for i=1,#ti do
- tih[ti[i]] = true
+ local tn = #ti
+ if tn == 1 then
+ tih = { [ti[1]] = true }
+ else
+ tih = { }
+ for i=1,tn do
+ tih[ti[i]] = true
+ end
end
cache[ti] = tih
end
@@ -1294,12 +1384,17 @@ end
local function s_hashed(t,cache)
if t then
- local ht = { }
local tf = t[1]
- for i=1,#tf do
- ht[i] = { [tf[i]] = true }
+ local nf = #tf
+ if nf == 1 then
+ return { [tf[1]] = true }
+ else
+ local ht = { }
+ for i=1,nf do
+ ht[i] = { [tf[i]] = true }
+ end
+ return ht
end
- return ht
else
return nil
end
@@ -1460,12 +1555,12 @@ actions["reorganize lookups"] = function(data,filename,raw) -- we could check fo
local fore = glyphs.fore
if fore and fore ~= "" then
fore = s_uncover(splitter,s_u_cache,fore)
- rule.before = s_hashed(fore,s_h_cache)
+ rule.after = s_hashed(fore,s_h_cache)
end
local back = glyphs.back
if back then
back = s_uncover(splitter,s_u_cache,back)
- rule.after = s_hashed(back,s_h_cache)
+ rule.before = s_hashed(back,s_h_cache)
end
local names = glyphs.names
if names then
@@ -1473,6 +1568,14 @@ actions["reorganize lookups"] = function(data,filename,raw) -- we could check fo
rule.current = s_hashed(names,s_h_cache)
end
rule.glyphs = nil
+ local lookups = rule.lookups
+ if lookups then
+ for i=1,#names do
+ if not lookups[i] then
+ lookups[i] = "" -- fix sparse array
+ end
+ end
+ end
end
end
end
@@ -1490,7 +1593,9 @@ local function check_variants(unicode,the_variants,splitter,unicodes)
for i=1,#glyphs do
local g = glyphs[i]
if done[g] then
- report_otf("skipping cyclic reference %U in math variant %U",g,unicode)
+ if i > 1 then
+ report_otf("skipping cyclic reference %U in math variant %U",g,unicode)
+ end
else
if n == 0 then
n = 1
@@ -1636,6 +1741,8 @@ actions["merge kern classes"] = function(data,filename,raw)
local lookup = subtable.lookup or subtable.name
if kernclass then -- the next one is quite slow
if #kernclass > 0 then
+ -- it's a table with one entry .. a future luatex can just
+ -- omit that level
kernclass = kernclass[1]
lookup = type(kernclass.lookup) == "string" and kernclass.lookup or lookup
report_otf("fixing kernclass table of lookup %a",lookup)
@@ -1740,6 +1847,12 @@ end
-- future versions will remove _
+local valid = (R("\x00\x7E") - S("(){}[]<>%/ \n\r\f\v"))^0 * P(-1)
+
+local function valid_ps_name(str)
+ return str and str ~= "" and #str < 64 and lpegmatch(valid,str) and true or false
+end
+
actions["check metadata"] = function(data,filename,raw)
local metadata = data.metadata
for _, k in next, mainfields do
@@ -1759,16 +1872,54 @@ actions["check metadata"] = function(data,filename,raw)
end
--
if metadata.validation_state and table.contains(metadata.validation_state,"bad_ps_fontname") then
- local name = file.nameonly(filename)
- metadata.fontname = "bad-fontname-" .. name
- metadata.fullname = "bad-fullname-" .. name
+ -- the ff library does a bit too much (and wrong) checking ... so we need to catch this
+ -- at least for now
+ local function valid(what)
+ local names = raw.names
+ for i=1,#names do
+ local list = names[i]
+ local names = list.names
+ if names then
+ local name = names[what]
+ if name and valid_ps_name(name) then
+ return name
+ end
+ end
+ end
+ end
+ local function check(what)
+ local oldname = metadata[what]
+ if valid_ps_name(oldname) then
+ report_otf("ignoring warning %a because %s %a is proper ASCII","bad_ps_fontname",what,oldname)
+ else
+ local newname = valid(what)
+ if not newname then
+ newname = formatters["bad-%s-%s"](what,file.nameonly(filename))
+ end
+ local warning = formatters["overloading %s from invalid ASCII name %a to %a"](what,oldname,newname)
+ data.warnings[#data.warnings+1] = warning
+ report_otf(warning)
+ metadata[what] = newname
+ end
+ end
+ check("fontname")
+ check("fullname")
end
--
end
actions["cleanup tables"] = function(data,filename,raw)
- data.resources.indices = nil -- not needed
- data.helpers = nil
+ local duplicates = data.resources.duplicates
+ if duplicates then
+ for k, v in next, duplicates do
+ if #v == 1 then
+ duplicates[k] = v[1]
+ end
+ end
+ end
+ data.resources.indices = nil -- not needed
+ data.resources.unicodes = nil -- delayed
+ data.helpers = nil -- tricky as we have no unicodes any more
end
-- kern: ttf has a table with kerns
@@ -1866,6 +2017,8 @@ actions["reorganize glyph lookups"] = function(data,filename,raw)
end
+local zero = { 0, 0 }
+
actions["reorganize glyph anchors"] = function(data,filename,raw) -- when we replace inplace we safe entries
local descriptions = data.descriptions
for unicode, description in next, descriptions do
@@ -1874,14 +2027,37 @@ actions["reorganize glyph anchors"] = function(data,filename,raw) -- when we rep
for class, data in next, anchors do
if class == "baselig" then
for tag, specification in next, data do
- for i=1,#specification do
- local si = specification[i]
- specification[i] = { si.x or 0, si.y or 0 }
+ -- for i=1,#specification do
+ -- local si = specification[i]
+ -- specification[i] = { si.x or 0, si.y or 0 }
+ -- end
+ -- can be sparse so we need to fill the holes
+ local n = 0
+ for k, v in next, specification do
+ if k > n then
+ n = k
+ end
+ local x, y = v.x, v.y
+ if x or y then
+ specification[k] = { x or 0, y or 0 }
+ else
+ specification[k] = zero
+ end
end
+ local t = { }
+ for i=1,n do
+ t[i] = specification[i] or zero
+ end
+ data[tag] = t -- so # is okay (nicer for packer)
end
else
for tag, specification in next, data do
- data[tag] = { specification.x or 0, specification.y or 0 }
+ local x, y = specification.x, specification.y
+ if x or y then
+ data[tag] = { x or 0, y or 0 }
+ else
+ data[tag] = zero
+ end
end
end
end
@@ -1890,6 +2066,164 @@ actions["reorganize glyph anchors"] = function(data,filename,raw) -- when we rep
end
end
+local bogusname = (P("uni") + P("u")) * R("AF","09")^4
+ + (P("index") + P("glyph") + S("Ii") * P("dentity") * P(".")^0) * R("09")^1
+local uselessname = (1-bogusname)^0 * bogusname
+
+actions["purge names"] = function(data,filename,raw) -- not used yet
+ if purge_names then
+ local n = 0
+ for u, d in next, data.descriptions do
+ if lpegmatch(uselessname,d.name) then
+ n = n + 1
+ d.name = nil
+ end
+ -- d.comment = nil
+ end
+ if n > 0 then
+ report_otf("%s bogus names removed",n)
+ end
+ end
+end
+
+actions["compact lookups"] = function(data,filename,raw)
+ if not compact_lookups then
+ report_otf("not compacting")
+ return
+ end
+ -- create keyhash
+ local last = 0
+ local tags = table.setmetatableindex({ },
+ function(t,k)
+ last = last + 1
+ t[k] = last
+ return last
+ end
+ )
+ --
+ local descriptions = data.descriptions
+ local resources = data.resources
+ --
+ for u, d in next, descriptions do
+ --
+ -- -- we can also compact anchors and cursives (basechar basemark baselig mark)
+ --
+ local slookups = d.slookups
+ if type(slookups) == "table" then
+ local s = { }
+ for k, v in next, slookups do
+ s[tags[k]] = v
+ end
+ d.slookups = s
+ end
+ --
+ local mlookups = d.mlookups
+ if type(mlookups) == "table" then
+ local m = { }
+ for k, v in next, mlookups do
+ m[tags[k]] = v
+ end
+ d.mlookups = m
+ end
+ --
+ local kerns = d.kerns
+ if type(kerns) == "table" then
+ local t = { }
+ for k, v in next, kerns do
+ t[tags[k]] = v
+ end
+ d.kerns = t
+ end
+ end
+ --
+ local lookups = data.lookups
+ if lookups then
+ local l = { }
+ for k, v in next, lookups do
+ local rules = v.rules
+ if rules then
+ for i=1,#rules do
+ local l = rules[i].lookups
+ if type(l) == "table" then
+ for i=1,#l do
+ l[i] = tags[l[i]]
+ end
+ end
+ end
+ end
+ l[tags[k]] = v
+ end
+ data.lookups = l
+ end
+ --
+ local lookups = resources.lookups
+ if lookups then
+ local l = { }
+ for k, v in next, lookups do
+ local s = v.subtables
+ if type(s) == "table" then
+ for i=1,#s do
+ s[i] = tags[s[i]]
+ end
+ end
+ l[tags[k]] = v
+ end
+ resources.lookups = l
+ end
+ --
+ local sequences = resources.sequences
+ if sequences then
+ for i=1,#sequences do
+ local s = sequences[i]
+ local n = s.name
+ if n then
+ s.name = tags[n]
+ end
+ local t = s.subtables
+ if type(t) == "table" then
+ for i=1,#t do
+ t[i] = tags[t[i]]
+ end
+ end
+ end
+ end
+ --
+ local lookuptypes = resources.lookuptypes
+ if lookuptypes then
+ local l = { }
+ for k, v in next, lookuptypes do
+ l[tags[k]] = v
+ end
+ resources.lookuptypes = l
+ end
+ --
+ local anchor_to_lookup = resources.anchor_to_lookup
+ if anchor_to_lookup then
+ for anchor, lookups in next, anchor_to_lookup do
+ local l = { }
+ for lookup, value in next, lookups do
+ l[tags[lookup]] = value
+ end
+ anchor_to_lookup[anchor] = l
+ end
+ end
+ --
+ local lookup_to_anchor = resources.lookup_to_anchor
+ if lookup_to_anchor then
+ local l = { }
+ for lookup, value in next, lookup_to_anchor do
+ l[tags[lookup]] = value
+ end
+ resources.lookup_to_anchor = l
+ end
+ --
+ tags = table.swapped(tags)
+ --
+ report_otf("%s lookup tags compacted",#tags)
+ --
+ resources.lookuptags = tags
+end
+
-- modes: node, base, none
function otf.setfeatures(tfmdata,features)
@@ -1915,6 +2249,7 @@ end
local function copytotfm(data,cache_id)
if data then
local metadata = data.metadata
+ local warnings = data.warnings
local resources = data.resources
local properties = derivetable(data.properties)
local descriptions = derivetable(data.descriptions)
@@ -2009,6 +2344,7 @@ local function copytotfm(data,cache_id)
local filename = constructors.checkedfilename(resources)
local fontname = metadata.fontname
local fullname = metadata.fullname or fontname
+ local psname = fontname or fullname
local units = metadata.units_per_em or 1000
--
if units == 0 then -- catch bugs in fonts
@@ -2028,8 +2364,8 @@ local function copytotfm(data,cache_id)
parameters.charwidth = charwidth
parameters.charxheight = charxheight
--
- local space = 0x0020 -- unicodes['space'], unicodes['emdash']
- local emdash = 0x2014 -- unicodes['space'], unicodes['emdash']
+ local space = 0x0020
+ local emdash = 0x2014
if monospaced then
if descriptions[space] then
spaceunits, spacer = descriptions[space].width, "space"
@@ -2078,7 +2414,7 @@ local function copytotfm(data,cache_id)
if charxheight then
parameters.x_height = charxheight
else
- local x = 0x78 -- unicodes['x']
+ local x = 0x0078
if x then
local x = descriptions[x]
if x then
@@ -2102,11 +2438,20 @@ local function copytotfm(data,cache_id)
properties.filename = filename
properties.fontname = fontname
properties.fullname = fullname
- properties.psname = fontname or fullname
+ properties.psname = psname
properties.name = filename or fullname
--
-- properties.name = specification.name
-- properties.sub = specification.sub
+ --
+ if warnings and #warnings > 0 then
+ report_otf("warnings for font: %s",filename)
+ report_otf()
+ for i=1,#warnings do
+ report_otf(" %s",warnings[i])
+ end
+ report_otf()
+ end
return {
characters = characters,
descriptions = descriptions,
@@ -2115,6 +2460,7 @@ local function copytotfm(data,cache_id)
resources = resources,
properties = properties,
goodies = goodies,
+ warnings = warnings,
}
end
end
@@ -2135,14 +2481,23 @@ local function otftotfm(specification)
if duplicates then
local nofduplicates, nofduplicated = 0, 0
for parent, list in next, duplicates do
- for i=1,#list do
- local unicode = list[i]
- if not descriptions[unicode] then
- descriptions[unicode] = descriptions[parent] -- or copy
+ if type(list) == "table" then
+ local n = #list
+ for i=1,n do
+ local unicode = list[i]
+ if not descriptions[unicode] then
+ descriptions[unicode] = descriptions[parent] -- or copy
+ nofduplicated = nofduplicated + 1
+ end
+ end
+ nofduplicates = nofduplicates + n
+ else
+ if not descriptions[list] then
+ descriptions[list] = descriptions[parent] -- or copy
nofduplicated = nofduplicated + 1
end
+ nofduplicates = nofduplicates + 1
end
- nofduplicates = nofduplicates + #list
end
if trace_otf and nofduplicated ~= nofduplicates then
report_otf("%i extra duplicates copied out of %i",nofduplicated,nofduplicates)
diff --git a/Master/texmf-dist/tex/context/base/font-otn.lua b/Master/texmf-dist/tex/context/base/font-otn.lua
index 25c750ae88f..52fcbcbd6cd 100644
--- a/Master/texmf-dist/tex/context/base/font-otn.lua
+++ b/Master/texmf-dist/tex/context/base/font-otn.lua
@@ -6,6 +6,9 @@ if not modules then modules = { } end modules ['font-otn'] = {
license = "see context related readme files",
}
+-- todo: looks like we have a leak somewhere (probably in ligatures)
+-- todo: copy attributes to disc
+
-- this is a context version which can contain experimental code, but when we
-- have serious patches we also need to change the other two font-otn files
@@ -26,7 +29,6 @@ if not modules then modules = { } end modules ['font-otn'] = {
-- todo:
--
--- kerning is probably not yet ok for latin around dics nodes (interesting challenge)
-- extension infrastructure (for usage out of context)
-- sorting features according to vendors/renderers
-- alternative loop quitters
@@ -38,7 +40,18 @@ if not modules then modules = { } end modules ['font-otn'] = {
-- mark (to mark) code is still not what it should be (too messy but we need some more extreem husayni tests)
-- remove some optimizations (when I have a faster machine)
--
--- maybe redo the lot some way (more context specific)
+-- beware:
+--
+-- we do some disc jugling where we need to keep in mind that the
+-- pre, post and replace fields can have prev pointers to a nesting
+-- node ... i wonder if that is still needed
+--
+-- not possible:
+--
+-- \discretionary {alpha-} {betagammadelta}
+-- {\discretionary {alphabeta-} {gammadelta}
+-- {\discretionary {alphabetagamma-} {delta}
+-- {alphabetagammadelta}}}
--[[ldx--
<p>This module is a bit more split up that I'd like but since we also want to test
@@ -121,7 +134,6 @@ results in different tables.</p>
-- chainmore : multiple substitutions triggered by contextual lookup (e.g. fij -> f + ij)
--
-- remark: the 'not implemented yet' variants will be done when we have fonts that use them
--- remark: we need to check what to do with discretionaries
-- We used to have independent hashes for lookups but as the tags are unique
-- we now use only one hash. If needed we can have multiple again but in that
@@ -129,16 +141,14 @@ results in different tables.</p>
-- Todo: make plugin feature that operates on char/glyphnode arrays
-local concat, insert, remove = table.concat, table.insert, table.remove
-local gmatch, gsub, find, match, lower, strip = string.gmatch, string.gsub, string.find, string.match, string.lower, string.strip
-local type, next, tonumber, tostring = type, next, tonumber, tostring
-local lpegmatch = lpeg.match
+local type, next, tonumber = type, next, tonumber
local random = math.random
local formatters = string.formatters
local logs, trackers, nodes, attributes = logs, trackers, nodes, attributes
-local registertracker = trackers.register
+local registertracker = trackers.register
+local registerdirective = directives.register
local fonts = fonts
local otf = fonts.handlers.otf
@@ -160,12 +170,25 @@ local trace_steps = false registertracker("otf.steps", function(v
local trace_skips = false registertracker("otf.skips", function(v) trace_skips = v end)
local trace_directions = false registertracker("otf.directions", function(v) trace_directions = v end)
+local trace_kernruns = false registertracker("otf.kernruns", function(v) trace_kernruns = v end)
+local trace_discruns = false registertracker("otf.discruns", function(v) trace_discruns = v end)
+local trace_compruns = false registertracker("otf.compruns", function(v) trace_compruns = v end)
+
+local quit_on_no_replacement = true -- maybe per font
+local check_discretionaries = true -- "trace"
+local zwnjruns = true
+
+registerdirective("otf.zwnjruns", function(v) zwnjruns = v end)
+registerdirective("otf.chain.quitonnoreplacement",function(value) quit_on_no_replacement = value end)
+
+
local report_direct = logs.reporter("fonts","otf direct")
local report_subchain = logs.reporter("fonts","otf subchain")
local report_chain = logs.reporter("fonts","otf chain")
local report_process = logs.reporter("fonts","otf process")
local report_prepare = logs.reporter("fonts","otf prepare")
local report_warning = logs.reporter("fonts","otf warning")
+local report_run = logs.reporter("fonts","otf run")
registertracker("otf.verbose_chain", function(v) otf.setcontextchain(v and "verbose") end)
registertracker("otf.normal_chain", function(v) otf.setcontextchain(v and "normal") end)
@@ -194,12 +217,18 @@ local getfont = nuts.getfont
local getsubtype = nuts.getsubtype
local getchar = nuts.getchar
+local insert_node_before = nuts.insert_before
local insert_node_after = nuts.insert_after
local delete_node = nuts.delete
+local remove_node = nuts.remove
local copy_node = nuts.copy
+local copy_node_list = nuts.copy_list
local find_node_tail = nuts.tail
local flush_node_list = nuts.flush_list
+local free_node = nuts.free
local end_of_math = nuts.end_of_math
+local traverse_nodes = nuts.traverse
+local traverse_id = nuts.traverse_id
local setmetatableindex = table.setmetatableindex
@@ -223,26 +252,31 @@ local dir_code = whatcodes.dir
local localpar_code = whatcodes.localpar
local discretionary_code = disccodes.discretionary
+local regular_code = disccodes.regular
+local automatic_code = disccodes.automatic
local ligature_code = glyphcodes.ligature
local privateattribute = attributes.private
-- Something is messed up: we have two mark / ligature indices, one at the injection
--- end and one here ... this is bases in KE's patches but there is something fishy
+-- end and one here ... this is based on KE's patches but there is something fishy
-- there as I'm pretty sure that for husayni we need some connection (as it's much
-- more complex than an average font) but I need proper examples of all cases, not
-- of only some.
local a_state = privateattribute('state')
-local a_cursbase = privateattribute('cursbase') -- to be checked
-local a_ligacomp = privateattribute('ligacomp') -- assigned here (ideally it should be combined)
+local a_cursbase = privateattribute('cursbase') -- to be checked, probably can go
local injections = nodes.injections
local setmark = injections.setmark
local setcursive = injections.setcursive
local setkern = injections.setkern
local setpair = injections.setpair
+local resetinjection = injections.reset
+local copyinjection = injections.copy
+local setligaindex = injections.setligaindex
+local getligaindex = injections.getligaindex
local cursonce = true
@@ -267,6 +301,7 @@ local currentfont = false
local lookuptable = false
local anchorlookups = false
local lookuptypes = false
+local lookuptags = false
local handlers = { }
local rlmode = 0
local featurevalue = false
@@ -321,20 +356,20 @@ end
local function cref(kind,chainname,chainlookupname,lookupname,index) -- not in the mood to alias f_
if index then
- return formatters["feature %a, chain %a, sub %a, lookup %a, index %a"](kind,chainname,chainlookupname,lookupname,index)
+ return formatters["feature %a, chain %a, sub %a, lookup %a, index %a"](kind,chainname,chainlookupname,lookuptags[lookupname],index)
elseif lookupname then
- return formatters["feature %a, chain %a, sub %a, lookup %a"](kind,chainname,chainlookupname,lookupname)
+ return formatters["feature %a, chain %a, sub %a, lookup %a"](kind,chainname,chainlookupname,lookuptags[lookupname])
elseif chainlookupname then
- return formatters["feature %a, chain %a, sub %a"](kind,chainname,chainlookupname)
+ return formatters["feature %a, chain %a, sub %a"](kind,lookuptags[chainname],lookuptags[chainlookupname])
elseif chainname then
- return formatters["feature %a, chain %a"](kind,chainname)
+ return formatters["feature %a, chain %a"](kind,lookuptags[chainname])
else
return formatters["feature %a"](kind)
end
end
local function pref(kind,lookupname)
- return formatters["feature %a, lookup %a"](kind,lookupname)
+ return formatters["feature %a, lookup %a"](kind,lookuptags[lookupname])
end
-- We can assume that languages that use marks are not hyphenated. We can also assume
@@ -351,10 +386,60 @@ local function copy_glyph(g) -- next and prev are untouched !
if components then
setfield(g,"components",nil)
local n = copy_node(g)
+ copyinjection(n,g) -- we need to preserve the lig indices
setfield(g,"components",components)
return n
else
- return copy_node(g)
+ local n = copy_node(g)
+ copyinjection(n,g) -- we need to preserve the lig indices
+ return n
+ end
+end
+
+-- temp here (context)
+
+local function collapse_disc(start,next)
+ local replace1 = getfield(start,"replace")
+ local replace2 = getfield(next,"replace")
+ if replace1 and replace2 then
+ local pre2 = getfield(next,"pre")
+ local post2 = getfield(next,"post")
+ setfield(replace1,"prev",nil)
+ if pre2 then
+ local pre1 = getfield(start,"pre")
+ if pre1 then
+ flush_node_list(pre1)
+ end
+ local pre1 = copy_node_list(replace1)
+ local tail1 = find_node_tail(pre1)
+ setfield(tail1,"next",pre2)
+ setfield(pre2,"prev",tail1)
+ setfield(start,"pre",pre1)
+ setfield(next,"pre",nil)
+ else
+ setfield(start,"pre",nil)
+ end
+ if post2 then
+ local post1 = getfield(start,"post")
+ if post1 then
+ flush_node_list(post1)
+ end
+ setfield(start,"post",post2)
+ else
+ setfield(start,"post",nil)
+ end
+ local tail1 = find_node_tail(replace1)
+ setfield(tail1,"next",replace2)
+ setfield(replace2,"prev",tail1)
+ setfield(start,"replace",replace1)
+ setfield(next,"replace",nil)
+ --
+ local nextnext = getnext(next)
+ setfield(nextnext,"prev",start)
+ setfield(start,"next",nextnext)
+ free_node(next)
+ else
+ -- maybe remove it
end
end
@@ -372,6 +457,7 @@ local function markstoligature(kind,lookupname,head,start,stop,char)
if head == start then
head = base
end
+ resetinjection(base)
setfield(base,"char",char)
setfield(base,"subtype",ligature_code)
setfield(base,"components",start)
@@ -412,24 +498,99 @@ local function getcomponentindex(start)
end
end
--- eventually we will do positioning in an other way (needs addional w/h/d fields)
+local a_noligature = attributes.private("noligature")
+local prehyphenchar = languages and languages.prehyphenchar
+local posthyphenchar = languages and languages.posthyphenchar
+----- preexhyphenchar = languages and languages.preexhyphenchar
+----- postexhyphenchar = languages and languages.postexhyphenchar
+
+if prehyphenchar then
+
+ -- okay
+
+elseif context then
+
+ report_warning("no language support") os.exit()
+
+else
+
+ local newlang = lang.new
+ local getpre = lang.prehyphenchar
+ local getpost = lang.posthyphenchar
+ -- local getpreex = lang.preexhyphenchar
+ -- local getpostex = lang.postexhyphenchar
+
+ prehyphenchar = function(l) local l = newlang(l) return l and getpre (l) or -1 end
+ posthyphenchar = function(l) local l = newlang(l) return l and getpost (l) or -1 end
+ -- preexhyphenchar = function(l) local l = newlang(l) return l and getpreex (l) or -1 end
+ -- postexhyphenchar = function(l) local l = newlang(l) return l and getpostex(l) or -1 end
+
+end
+
+local function addhyphens(template,pre,post)
+ -- inserted by hyphenation algorithm
+ local l = getfield(template,"lang")
+ local p = prehyphenchar(l)
+ if p and p > 0 then
+ local c = copy_node(template)
+ setfield(c,"char",p)
+ if pre then
+ local t = find_node_tail(pre)
+ setfield(t,"next",c)
+ setfield(c,"prev",t)
+ else
+ pre = c
+ end
+ end
+ local p = posthyphenchar(l)
+ if p and p > 0 then
+ local c = copy_node(template)
+ setfield(c,"char",p)
+ if post then
+ -- post has a prev nesting node .. alternatively we could
+ local prev = getprev(post)
+ setfield(c,"next",post)
+ setfield(post,"prev",c)
+ if prev then
+ setfield(prev,"next",c)
+ setfield(c,"prev",prev)
+ end
+ else
+ post = c
+ end
+ end
+ return pre, post
+end
local function toligature(kind,lookupname,head,start,stop,char,markflag,discfound) -- brr head
+ if getattr(start,a_noligature) == 1 then
+ -- so we can do: e\noligature{ff}e e\noligature{f}fie (we only look at the first)
+ return head, start
+ end
if start == stop and getchar(start) == char then
+ resetinjection(start)
setfield(start,"char",char)
return head, start
end
+ -- needs testing (side effects):
+ local components = getfield(base,"components")
+ if components then
+ flush_node_list(components)
+ end
+ --
local prev = getprev(start)
local next = getnext(stop)
+ local comp = start
setfield(start,"prev",nil)
setfield(stop,"next",nil)
local base = copy_glyph(start)
if start == head then
head = base
end
+ resetinjection(base)
setfield(base,"char",char)
setfield(base,"subtype",ligature_code)
- setfield(base,"components",start) -- start can have components
+ setfield(base,"components",comp) -- start can have components .. do we need to flush?
if prev then
setfield(prev,"next",base)
end
@@ -452,11 +613,13 @@ local function toligature(kind,lookupname,head,start,stop,char,markflag,discfoun
baseindex = baseindex + componentindex
componentindex = getcomponentindex(start)
elseif not deletemarks then -- quite fishy
- setprop(start,a_ligacomp,baseindex + (getprop(start,a_ligacomp) or componentindex))
+ setligaindex(start,baseindex + getligaindex(start,componentindex))
if trace_marks then
- logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(char),getprop(start,a_ligacomp))
+ logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(char),getligaindex(start))
end
- head, current = insert_node_after(head,current,copy_node(start)) -- unlikely that mark has components
+ local n = copy_node(start)
+ copyinjection(n,start)
+ head, current = insert_node_after(head,current,n) -- unlikely that mark has components
elseif trace_marks then
logwarning("%s: delete mark %s",pref(kind,lookupname),gref(char))
end
@@ -468,15 +631,79 @@ local function toligature(kind,lookupname,head,start,stop,char,markflag,discfoun
while start and getid(start) == glyph_code do
local char = getchar(start)
if marks[char] then
- setprop(start,a_ligacomp,baseindex + (getprop(start,a_ligacomp) or componentindex))
+ setligaindex(start,baseindex + getligaindex(start,componentindex))
if trace_marks then
- logwarning("%s: set mark %s, gets index %s",pref(kind,lookupname),gref(char),getprop(start,a_ligacomp))
+ logwarning("%s: set mark %s, gets index %s",pref(kind,lookupname),gref(char),getligaindex(start))
end
else
break
end
start = getnext(start)
end
+ else
+ -- discfound ... forget about marks .. probably no scripts that hyphenate and have marks
+ local discprev = getfield(discfound,"prev")
+ local discnext = getfield(discfound,"next")
+ if discprev and discnext then
+ local subtype = getsubtype(discfound)
+ if subtype == discretionary_code then
+ local pre = getfield(discfound,"pre")
+ local post = getfield(discfound,"post")
+ local replace = getfield(discfound,"replace")
+ if not replace then -- todo: signal simple hyphen
+ local prev = getfield(base,"prev")
+ local copied = copy_node_list(comp)
+ setfield(discnext,"prev",nil) -- also blocks funny assignments
+ setfield(discprev,"next",nil) -- also blocks funny assignments
+ if pre then
+ setfield(comp,"next",pre)
+ setfield(pre,"prev",comp)
+ end
+ pre = comp
+ if post then
+ local tail = find_node_tail(post)
+ setfield(tail,"next",discnext)
+ setfield(discnext,"prev",tail)
+ setfield(post,"prev",nil)
+ else
+ post = discnext
+ end
+ setfield(prev,"next",discfound)
+ setfield(next,"prev",discfound)
+ setfield(discfound,"next",next)
+ setfield(discfound,"prev",prev)
+ setfield(base,"next",nil)
+ setfield(base,"prev",nil)
+ setfield(base,"components",copied)
+ setfield(discfound,"pre",pre)
+ setfield(discfound,"post",post)
+ setfield(discfound,"replace",base)
+ setfield(discfound,"subtype",discretionary_code)
+ base = prev -- restart
+ end
+ elseif discretionary_code == regular_code then
+ -- local prev = getfield(base,"prev")
+ -- local next = getfield(base,"next")
+ local copied = copy_node_list(comp)
+ setfield(discnext,"prev",nil) -- also blocks funny assignments
+ setfield(discprev,"next",nil) -- also blocks funny assignments
+ local pre, post = addhyphens(comp,comp,discnext,subtype) -- takes from components
+ setfield(prev,"next",discfound)
+ setfield(next,"prev",discfound)
+ setfield(discfound,"next",next)
+ setfield(discfound,"prev",prev)
+ setfield(base,"next",nil)
+ setfield(base,"prev",nil)
+ setfield(base,"components",copied)
+ setfield(discfound,"pre",pre)
+ setfield(discfound,"post",post)
+ setfield(discfound,"replace",base)
+ setfield(discfound,"subtype",discretionary_code)
+ base = next -- or restart
+ else
+ -- forget about it in generic usage
+ end
+ end
end
return head, base
end
@@ -485,6 +712,7 @@ function handlers.gsub_single(head,start,kind,lookupname,replacement)
if trace_singles then
logprocess("%s: replacing %s by single %s",pref(kind,lookupname),gref(getchar(start)),gref(replacement))
end
+ resetinjection(start)
setfield(start,"char",replacement)
return head, start, true
end
@@ -524,6 +752,7 @@ end
local function multiple_glyphs(head,start,multiple,ignoremarks)
local nofmultiples = #multiple
if nofmultiples > 0 then
+ resetinjection(start)
setfield(start,"char",multiple[1])
if nofmultiples > 1 then
local sn = getnext(start)
@@ -534,6 +763,7 @@ local function multiple_glyphs(head,start,multiple,ignoremarks)
-- local sn = getnext(sn)
-- end
local n = copy_node(start) -- ignore components
+ resetinjection(n)
setfield(n,"char",multiple[k])
setfield(n,"next",sn)
setfield(n,"prev",start)
@@ -560,6 +790,7 @@ function handlers.gsub_alternate(head,start,kind,lookupname,alternative,sequence
if trace_alternatives then
logprocess("%s: replacing %s by alternative %a to %s, %s",pref(kind,lookupname),gref(getchar(start)),choice,gref(choice),comment)
end
+ resetinjection(start)
setfield(start,"char",choice)
else
if trace_alternatives then
@@ -577,7 +808,7 @@ function handlers.gsub_multiple(head,start,kind,lookupname,multiple,sequence)
end
function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence)
- local s, stop, discfound = getnext(start), nil, false
+ local s, stop = getnext(start), nil
local startchar = getchar(start)
if marks[startchar] then
while s do
@@ -605,24 +836,30 @@ function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence)
else
head, start = markstoligature(kind,lookupname,head,start,stop,lig)
end
- return head, start, true
+ return head, start, true, false
else
-- ok, goto next lookup
end
end
else
- local skipmark = sequence.flags[1]
+ local skipmark = sequence.flags[1]
+ local discfound = false
+ local lastdisc = nil
while s do
local id = getid(s)
- if id == glyph_code and getsubtype(s)<256 then
- if getfont(s) == currentfont then
+ if id == glyph_code and getsubtype(s)<256 then -- not needed
+ if getfont(s) == currentfont then -- also not needed only when mark
local char = getchar(s)
if skipmark and marks[char] then
s = getnext(s)
- else
- local lg = ligature[char]
+ else -- ligature is a tree
+ local lg = ligature[char] -- can there be multiple in a row? maybe in a bad font
if lg then
- stop = s
+ if not discfound and lastdisc then
+ discfound = lastdisc
+ lastdisc = nil
+ end
+ stop = s -- needed for fake so outside then
ligature = lg
s = getnext(s)
else
@@ -633,13 +870,13 @@ function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence)
break
end
elseif id == disc_code then
- discfound = true
+ lastdisc = s
s = getnext(s)
else
break
end
end
- local lig = ligature.ligature
+ local lig = ligature.ligature -- can't we get rid of this .ligature?
if lig then
if stop then
if trace_ligatures then
@@ -651,19 +888,34 @@ function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence)
end
else
-- weird but happens (in some arabic font)
+ resetinjection(start)
setfield(start,"char",lig)
if trace_ligatures then
logprocess("%s: replacing %s by (no real) ligature %s case 3",pref(kind,lookupname),gref(startchar),gref(lig))
end
end
- return head, start, true
+ return head, start, true, discfound
else
- -- weird but happens
+ -- weird but happens, pseudo ligatures ... just the components
end
end
- return head, start, false
+ return head, start, false, discfound
end
+-- function is_gsub_ligature(start,ligature) -- limited case: in disc nodes, only latin, always glyphs
+-- local s = getnext(start)
+-- while s do
+-- local lg = ligature[getchar(s)]
+-- if lg then
+-- ligature = lg
+-- s = getnext(s)
+-- else
+-- return
+-- end
+-- end
+-- return ligature and ligature.ligature
+-- end
+
--[[ldx--
<p>We get hits on a mark, but we're not sure if the it has to be applied so
we need to explicitly test for basechar, baselig and basemark entries.</p>
@@ -752,7 +1004,7 @@ function handlers.gpos_mark2ligature(head,start,kind,lookupname,markanchors,sequ
end
end
end
- local index = getprop(start,a_ligacomp)
+ local index = getligaindex(start)
local baseanchors = descriptions[basechar]
if baseanchors then
baseanchors = baseanchors.anchors
@@ -802,10 +1054,10 @@ function handlers.gpos_mark2mark(head,start,kind,lookupname,markanchors,sequence
local markchar = getchar(start)
if marks[markchar] then
local base = getprev(start) -- [glyph] [basemark] [start=mark]
- local slc = getprop(start,a_ligacomp)
+ local slc = getligaindex(start)
if slc then -- a rather messy loop ... needs checking with husayni
while base do
- local blc = getprop(base,a_ligacomp)
+ local blc = getligaindex(base)
if blc and blc ~= slc then
base = getprev(base)
else
@@ -909,16 +1161,16 @@ function handlers.gpos_cursive(head,start,kind,lookupname,exitanchors,sequence)
end
end
-function handlers.gpos_single(head,start,kind,lookupname,kerns,sequence)
+function handlers.gpos_single(head,start,kind,lookupname,kerns,sequence,injection)
local startchar = getchar(start)
- local dx, dy, w, h = setpair(start,tfmdata.parameters.factor,rlmode,sequence.flags[4],kerns,characters[startchar])
+ local dx, dy, w, h = setpair(start,tfmdata.parameters.factor,rlmode,sequence.flags[4],kerns,injection) -- ,characters[startchar])
if trace_kerns then
logprocess("%s: shifting single %s by (%p,%p) and correction (%p,%p)",pref(kind,lookupname),gref(startchar),dx,dy,w,h)
end
return head, start, false
end
-function handlers.gpos_pair(head,start,kind,lookupname,kerns,sequence)
+function handlers.gpos_pair(head,start,kind,lookupname,kerns,sequence,lookuphash,i,injection)
-- todo: kerns in disc nodes: pre, post, replace -> loop over disc too
-- todo: kerns in components of ligatures
local snext = getnext(start)
@@ -942,14 +1194,14 @@ function handlers.gpos_pair(head,start,kind,lookupname,kerns,sequence)
local a, b = krn[2], krn[3]
if a and #a > 0 then
local startchar = getchar(start)
- local x, y, w, h = setpair(start,factor,rlmode,sequence.flags[4],a,characters[startchar])
+ local x, y, w, h = setpair(start,factor,rlmode,sequence.flags[4],a,injection) -- characters[startchar])
if trace_kerns then
logprocess("%s: shifting first of pair %s and %s by (%p,%p) and correction (%p,%p)",pref(kind,lookupname),gref(startchar),gref(nextchar),x,y,w,h)
end
end
if b and #b > 0 then
local startchar = getchar(start)
- local x, y, w, h = setpair(snext,factor,rlmode,sequence.flags[4],b,characters[nextchar])
+ local x, y, w, h = setpair(snext,factor,rlmode,sequence.flags[4],b,injection) -- characters[nextchar])
if trace_kerns then
logprocess("%s: shifting second of pair %s and %s by (%p,%p) and correction (%p,%p)",pref(kind,lookupname),gref(startchar),gref(nextchar),x,y,w,h)
end
@@ -969,7 +1221,7 @@ function handlers.gpos_pair(head,start,kind,lookupname,kerns,sequence)
end
done = true
elseif krn ~= 0 then
- local k = setkern(snext,factor,rlmode,krn)
+ local k = setkern(snext,factor,rlmode,krn,injection)
if trace_kerns then
logprocess("%s: inserting kern %s between %s and %s",pref(kind,lookupname),k,gref(getchar(prev)),gref(nextchar))
end
@@ -1032,6 +1284,7 @@ function chainprocs.reversesub(head,start,stop,kind,chainname,currentcontext,loo
if trace_singles then
logprocess("%s: single reverse replacement of %s by %s",cref(kind,chainname),gref(char),gref(replacement))
end
+ resetinjection(start)
setfield(start,"char",replacement)
return head, start, true
else
@@ -1086,8 +1339,7 @@ as less as needed but that would also make the code even more messy.</p>
-- end
--[[ldx--
-<p>Here we replace start by a single variant, First we delete the rest of the
-match.</p>
+<p>Here we replace start by a single variant.</p>
--ldx]]--
function chainprocs.gsub_single(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex)
@@ -1095,7 +1347,7 @@ function chainprocs.gsub_single(head,start,stop,kind,chainname,currentcontext,lo
local current = start
local subtables = currentlookup.subtables
if #subtables > 1 then
- logwarning("todo: check if we need to loop over the replacements: %s",concat(subtables," "))
+ logwarning("todo: check if we need to loop over the replacements: % t",subtables)
end
while current do
if getid(current) == glyph_code then
@@ -1116,7 +1368,84 @@ function chainprocs.gsub_single(head,start,stop,kind,chainname,currentcontext,lo
if trace_singles then
logprocess("%s: replacing single %s by %s",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(currentchar),gref(replacement))
end
- setfield(current,"char",replacement)
+ resetinjection(current)
+ if check_discretionaries then
+ -- some fonts use a chain lookup to replace e.g. an f in a fi ligature
+ -- and there can be a disc node in between ... the next code tries to catch
+ -- this
+ local next = getnext(current)
+ local prev = getprev(current) -- todo: just remember it above
+ local done = false
+ if next then
+ if getid(next) == disc_code then
+ local subtype = getsubtype(next)
+ if subtype == discretionary_code then
+ setfield(next,"prev",prev)
+ setfield(prev,"next",next)
+ setfield(current,"prev",nil)
+ setfield(current,"next",nil)
+ local replace = getfield(next,"replace")
+ local pre = getfield(next,"pre")
+ local new = copy_node(current)
+ setfield(new,"char",replacement)
+ if replace then
+ setfield(new,"next",replace)
+ setfield(replace,"prev",new)
+ end
+ if pre then
+ setfield(current,"next",pre)
+ setfield(pre,"prev",current)
+ end
+ setfield(next,"replace",new) -- also updates tail
+ setfield(next,"pre",current) -- also updates tail
+ end
+ start = next
+ done = true
+ local next = getnext(start)
+ if next and getid(next) == disc_code then
+ collapse_disc(start,next)
+ end
+ end
+ end
+ if not done and prev then
+ if getid(prev) == disc_code then
+ local subtype = getsubtype(prev)
+ if subtype == discretionary_code then
+ setfield(next,"prev",prev)
+ setfield(prev,"next",next)
+ setfield(current,"prev",nil)
+ setfield(current,"next",nil)
+ local replace = getfield(prev,"replace")
+ local post = getfield(prev,"post")
+ local new = copy_node(current)
+ setfield(new,"char",replacement)
+ if replace then
+ local tail = find_node_tail(replace)
+ setfield(tail,"next",new)
+ setfield(new,"prev",tail)
+ else
+ replace = new
+ end
+ if post then
+ local tail = find_node_tail(post)
+ setfield(tail,"next",current)
+ setfield(current,"prev",tail)
+ else
+ post = current
+ end
+ setfield(prev,"replace",replace) -- also updates tail
+ setfield(prev,"post",post) -- also updates tail
+ start = prev
+ done = true
+ end
+ end
+ end
+ if not done then
+ setfield(current,"char",replacement)
+ end
+ else
+ setfield(current,"char",replacement)
+ end
end
end
return head, start, true
@@ -1132,8 +1461,7 @@ end
chainmores.gsub_single = chainprocs.gsub_single
--[[ldx--
-<p>Here we replace start by a sequence of new glyphs. First we delete the rest of
-the match.</p>
+<p>Here we replace start by a sequence of new glyphs.</p>
--ldx]]--
function chainprocs.gsub_multiple(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname)
@@ -1197,6 +1525,7 @@ function chainprocs.gsub_alternate(head,start,stop,kind,chainname,currentcontext
if trace_alternatives then
logprocess("%s: replacing %s by alternative %a to %s, %s",cref(kind,chainname,chainlookupname,lookupname),gref(char),choice,gref(choice),comment)
end
+ resetinjection(start)
setfield(start,"char",choice)
else
if trace_alternatives then
@@ -1249,12 +1578,22 @@ function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext,
while s do
local id = getid(s)
if id == disc_code then
- s = getnext(s)
- discfound = true
+ if not discfound then
+ discfound = s
+ end
+ if s == stop then
+ break -- okay? or before the disc
+ else
+ s = getnext(s)
+ end
else
local schar = getchar(s)
if skipmark and marks[schar] then -- marks
+-- if s == stop then -- maybe add this
+-- break
+-- else
s = getnext(s)
+-- end
else
local lg = ligatures[schar]
if lg then
@@ -1283,7 +1622,7 @@ function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext,
end
end
head, start = toligature(kind,lookupname,head,start,stop,l2,currentlookup.flags[1],discfound)
- return head, start, true, nofreplacements
+ return head, start, true, nofreplacements, discfound
elseif trace_bugs then
if start == stop then
logwarning("%s: replacing character %s by ligature fails",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar))
@@ -1293,7 +1632,7 @@ function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext,
end
end
end
- return head, start, false, 0
+ return head, start, false, 0, false
end
chainmores.gsub_ligature = chainprocs.gsub_ligature
@@ -1392,7 +1731,7 @@ function chainprocs.gpos_mark2ligature(head,start,stop,kind,chainname,currentcon
end
end
-- todo: like marks a ligatures hash
- local index = getprop(start,a_ligacomp)
+ local index = getligaindex(start)
local baseanchors = descriptions[basechar].anchors
if baseanchors then
local baseanchors = baseanchors['baselig']
@@ -1443,10 +1782,10 @@ function chainprocs.gpos_mark2mark(head,start,stop,kind,chainname,currentcontext
end
if markanchors then
local base = getprev(start) -- [glyph] [basemark] [start=mark]
- local slc = getprop(start,a_ligacomp)
+ local slc = getligaindex(start)
if slc then -- a rather messy loop ... needs checking with husayni
while base do
- local blc = getprop(base,a_ligacomp)
+ local blc = getligaindex(base)
if blc and blc ~= slc then
base = getprev(base)
else
@@ -1565,7 +1904,7 @@ function chainprocs.gpos_single(head,start,stop,kind,chainname,currentcontext,lo
if kerns then
kerns = kerns[startchar] -- needed ?
if kerns then
- local dx, dy, w, h = setpair(start,tfmdata.parameters.factor,rlmode,sequence.flags[4],kerns,characters[startchar])
+ local dx, dy, w, h = setpair(start,tfmdata.parameters.factor,rlmode,sequence.flags[4],kerns) -- ,characters[startchar])
if trace_kerns then
logprocess("%s: shifting single %s by (%p,%p) and correction (%p,%p)",cref(kind,chainname,chainlookupname),gref(startchar),dx,dy,w,h)
end
@@ -1605,14 +1944,14 @@ function chainprocs.gpos_pair(head,start,stop,kind,chainname,currentcontext,look
local a, b = krn[2], krn[3]
if a and #a > 0 then
local startchar = getchar(start)
- local x, y, w, h = setpair(start,factor,rlmode,sequence.flags[4],a,characters[startchar])
+ local x, y, w, h = setpair(start,factor,rlmode,sequence.flags[4],a) -- ,characters[startchar])
if trace_kerns then
logprocess("%s: shifting first of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(kind,chainname,chainlookupname),gref(startchar),gref(nextchar),x,y,w,h)
end
end
if b and #b > 0 then
local startchar = getchar(start)
- local x, y, w, h = setpair(snext,factor,rlmode,sequence.flags[4],b,characters[nextchar])
+ local x, y, w, h = setpair(snext,factor,rlmode,sequence.flags[4],b) -- ,characters[nextchar])
if trace_kerns then
logprocess("%s: shifting second of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(kind,chainname,chainlookupname),gref(startchar),gref(nextchar),x,y,w,h)
end
@@ -1666,12 +2005,6 @@ local function show_skip(kind,chainname,char,ck,class)
end
end
-local quit_on_no_replacement = true
-
-directives.register("otf.chain.quitonnoreplacement",function(value) -- maybe per font
- quit_on_no_replacement = value
-end)
-
local function normal_handle_contextchain(head,start,kind,chainname,contexts,sequence,lookuphash)
-- local rule, lookuptype, sequence, f, l, lookups = ck[1], ck[2] ,ck[3], ck[4], ck[5], ck[6]
local flags = sequence.flags
@@ -1741,7 +2074,36 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
break
end
elseif id == disc_code then
- last = getnext(last)
+ if check_discretionaries then
+ local replace = getfield(last,"replace")
+ if replace then
+ -- so far we never entered this branch
+ while replace do
+ if seq[n][getchar(replace)] then
+ n = n + 1
+ replace = getnext(replace)
+ if not replace then
+ break
+ elseif n > l then
+-- match = false
+ break
+ end
+ else
+ match = false
+ break
+ end
+ end
+ if not match then
+ break
+ elseif check_discretionaries == "trace" then
+ report_chain("check disc action in current")
+ end
+ else
+ last = getnext(last) -- no skipping here
+ end
+ else
+ last = getnext(last) -- no skipping here
+ end
else
match = false
break
@@ -1787,7 +2149,39 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
break
end
elseif id == disc_code then
- -- skip 'm
+ -- the special case: f i where i becomes dottless i ..
+ if check_discretionaries then
+ local replace = getfield(prev,"replace")
+ if replace then
+ -- we seldom enter this branch (e.g. on brill efficient)
+ replace = find_node_tail(replace)
+ local finish = getprev(replace)
+ while replace do
+ if seq[n][getchar(replace)] then
+ n = n - 1
+ replace = getprev(replace)
+ if not replace or replace == finish then
+ break
+ elseif n < 1 then
+-- match = false
+ break
+ end
+ else
+ match = false
+ break
+ end
+ end
+ if not match then
+ break
+ elseif check_discretionaries == "trace" then
+ report_chain("check disc action in before")
+ end
+ else
+ -- skip 'm
+ end
+ else
+ -- skip 'm
+ end
elseif seq[n][32] then
n = n -1
else
@@ -1796,7 +2190,7 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
end
prev = getprev(prev)
elseif seq[n][32] then -- somewhat special, as zapfino can have many preceding spaces
- n = n -1
+ n = n - 1
else
match = false
break
@@ -1804,6 +2198,8 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
end
elseif f == 2 then
match = seq[1][32]
+-- elseif f > 2 then
+-- match = false -- KE ?
else
for n=f-1,1 do
if not seq[n][32] then
@@ -1848,7 +2244,35 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
break
end
elseif id == disc_code then
- -- skip 'm
+ if check_discretionaries then
+ local replace = getfield(current,"replace")
+ if replace then
+ -- so far we never entered this branch
+ while replace do
+ if seq[n][getchar(replace)] then
+ n = n + 1
+ replace = getnext(replace)
+ if not replace then
+ break
+ elseif n > s then
+ break
+ end
+ else
+ match = false
+ break
+ end
+ end
+ if not match then
+ break
+ elseif check_discretionaries == "trace" then
+ report_chain("check disc action in after")
+ end
+ else
+ -- skip 'm
+ end
+ else
+ -- skip 'm
+ end
elseif seq[n][32] then -- brrr
n = n + 1
else
@@ -1911,7 +2335,7 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
end
else
local i = 1
- repeat
+ while true do
if skipped then
while true do
local char = getchar(start)
@@ -1952,12 +2376,14 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
end
end
end
- if start then
+ if i > nofchainlookups then
+ break
+ elseif start then
start = getnext(start)
else
-- weird
end
- until i > nofchainlookups
+ end
end
else
local replacements = ck[7]
@@ -2133,6 +2559,186 @@ end
-- -- the action
-- end
+-- assumptions:
+--
+-- * languages that use complex disc nodes
+
+-- optimization comes later ...
+
+local function kernrun(disc,run) -- we can assume that prev and next are glyphs
+ if trace_kernruns then
+ report_run("kern") -- will be more detailed
+ end
+ --
+ local prev = getprev(disc) -- todo, keep these in the main loop
+ local next = getnext(disc) -- todo, keep these in the main loop
+ --
+ local pre = getfield(disc,"pre")
+ if not pre then
+ -- go on
+ elseif prev then
+ local nest = getprev(pre)
+ setfield(pre,"prev",prev)
+ setfield(prev,"next",pre)
+ run(prev,"preinjections")
+ setfield(pre,"prev",nest)
+ setfield(prev,"next",disc)
+ else
+ run(pre,"preinjections")
+ end
+ --
+ local post = getfield(disc,"post")
+ if not post then
+ -- go on
+ elseif next then
+ local tail = find_node_tail(post)
+ setfield(tail,"next",next)
+ setfield(next,"prev",tail)
+ run(post,"postinjections",tail)
+ setfield(tail,"next",nil)
+ setfield(next,"prev",disc)
+ else
+ run(post,"postinjections")
+ end
+ --
+ local replace = getfield(disc,"replace")
+ if not replace then
+ -- this should be already done by discfound
+ elseif prev and next then
+ local tail = find_node_tail(replace)
+ local nest = getprev(replace)
+ setfield(replace,"prev",prev)
+ setfield(prev,"next",replace)
+ setfield(tail,"next",next)
+ setfield(next,"prev",tail)
+ run(prev,"replaceinjections",tail)
+ setfield(replace,"prev",nest)
+ setfield(prev,"next",disc)
+ setfield(tail,"next",nil)
+ setfield(next,"prev",disc)
+ elseif prev then
+ local nest = getprev(replace)
+ setfield(replace,"prev",prev)
+ setfield(prev,"next",replace)
+ run(prev,"replaceinjections")
+ setfield(replace,"prev",nest)
+ setfield(prev,"next",disc)
+ elseif next then
+ local tail = find_node_tail(replace)
+ setfield(tail,"next",next)
+ setfield(next,"prev",tail)
+ run(replace,"replaceinjections",tail)
+ setfield(tail,"next",nil)
+ setfield(next,"prev",disc)
+ else
+ run(replace,"replaceinjections")
+ end
+end
+
+-- the if new test might be dangerous as luatex will check / set some tail stuff
+-- in a temp node
+
+local function comprun(disc,run)
+ if trace_compruns then
+ report_run("comp: %s",languages.serializediscretionary(disc))
+ end
+ --
+ local pre = getfield(disc,"pre")
+ if pre then
+ local new, done = run(pre)
+ if done then
+ setfield(disc,"pre",new)
+ end
+ end
+ --
+ local post = getfield(disc,"post")
+ if post then
+ local new, done = run(post)
+ if done then
+ setfield(disc,"post",new)
+ end
+ end
+ --
+ local replace = getfield(disc,"replace")
+ if replace then
+ local new, done = run(replace)
+ if done then
+ setfield(disc,"replace",new)
+ end
+ end
+end
+
+local function testrun(disc,trun,crun)
+ local next = getnext(disc)
+ if next then
+ local replace = getfield(disc,"replace")
+ if replace then
+ local prev = getprev(disc)
+ if prev then
+ -- only look ahead
+ local tail = find_node_tail(replace)
+ -- local nest = getprev(replace)
+ setfield(tail,"next",next)
+ setfield(next,"prev",tail)
+ if trun(replace,next) then
+ setfield(disc,"replace",nil) -- beware, side effects of nest so first
+ setfield(prev,"next",replace)
+ setfield(replace,"prev",prev)
+ setfield(next,"prev",tail)
+ setfield(tail,"next",next)
+ setfield(disc,"prev",nil)
+ setfield(disc,"next",nil)
+ flush_node_list(disc)
+ return replace -- restart
+ else
+ setfield(tail,"next",nil)
+ setfield(next,"prev",disc)
+ end
+ else
+ -- weird case
+ end
+ else
+ -- no need
+ end
+ else
+ -- weird case
+ end
+ comprun(disc,crun)
+ return next
+end
+
+local function discrun(disc,drun,krun)
+ local next = getnext(disc)
+ local prev = getprev(disc)
+ if trace_discruns then
+ report_run("disc") -- will be more detailed
+ end
+ if next and prev then
+ setfield(prev,"next",next)
+ -- setfield(next,"prev",prev)
+ drun(prev)
+ setfield(prev,"next",disc)
+ -- setfield(next,"prev",disc)
+ end
+ --
+ local pre = getfield(disc,"pre")
+ if not pre then
+ -- go on
+ elseif prev then
+ local nest = getprev(pre)
+ setfield(pre,"prev",prev)
+ setfield(prev,"next",pre)
+ krun(prev,"preinjections")
+ setfield(pre,"prev",nest)
+ setfield(prev,"next",disc)
+ else
+ run(pre,"preinjections")
+ end
+ return next
+end
+
+-- todo: maybe run lr and rl stretches
+
local function featuresprocessor(head,font,attr)
local lookuphash = lookuphashes[font] -- we can also check sequences here
@@ -2156,6 +2762,7 @@ local function featuresprocessor(head,font,attr)
anchorlookups = resources.lookup_to_anchor
lookuptable = resources.lookups
lookuptypes = resources.lookuptypes
+ lookuptags = resources.lookuptags
currentfont = font
rlmode = 0
@@ -2176,21 +2783,28 @@ local function featuresprocessor(head,font,attr)
-- todo: retain prev
+ -- We don't goto the next node of a disc node is created so that we can then treat
+ -- the pre, post and replace. It's abit of a hack but works out ok for most cases.
+
+ -- there can be less subtype and attr checking in the comprun etc helpers
+
for s=1,#datasets do
- local dataset = datasets[s]
- featurevalue = dataset[1] -- todo: pass to function instead of using a global
-
- local sequence = dataset[5] -- sequences[s] -- also dataset[5]
- local rlparmode = 0
- local topstack = 0
- local success = false
- local attribute = dataset[2]
- local chain = dataset[3] -- sequence.chain or 0
- local typ = sequence.type
- local subtables = sequence.subtables
+ local dataset = datasets[s]
+ featurevalue = dataset[1] -- todo: pass to function instead of using a global
+ local attribute = dataset[2]
+ local chain = dataset[3] -- sequence.chain or 0
+ local kind = dataset[4]
+ local sequence = dataset[5] -- sequences[s] -- also dataset[5]
+ local rlparmode = 0
+ local topstack = 0
+ local success = false
+ local typ = sequence.type
+ local gpossing = typ == "gpos_single" or typ == "gpos_pair"
+ local subtables = sequence.subtables
+ local handler = handlers[typ]
+
if chain < 0 then
-- this is a limited case, no special treatments like 'init' etc
- local handler = handlers[typ]
-- we need to get rid of this slide! probably no longer needed in latest luatex
local start = find_node_tail(head) -- slow (we can store tail because there's always a skip at the end): todo
while start do
@@ -2204,13 +2818,16 @@ local function featuresprocessor(head,font,attr)
a = true
end
if a then
+ local char = getchar(start)
for i=1,#subtables do
local lookupname = subtables[i]
local lookupcache = lookuphash[lookupname]
if lookupcache then
- local lookupmatch = lookupcache[getchar(start)]
+ -- local lookupmatch = lookupcache[getchar(start)]
+ local lookupmatch = lookupcache[start]
if lookupmatch then
- head, start, success = handler(head,start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,i)
+ -- todo: disc?
+ head, start, success = handler(head,start,kind,lookupname,lookupmatch,sequence,lookuphash,i)
if success then
break
end
@@ -2231,7 +2848,6 @@ local function featuresprocessor(head,font,attr)
end
end
else
- local handler = handlers[typ]
local ns = #subtables
local start = head -- local ?
rlmode = 0 -- to be checked ?
@@ -2242,13 +2858,15 @@ local function featuresprocessor(head,font,attr)
report_missing_cache(typ,lookupname)
else
- local function subrun(start)
- -- mostly for gsub, gpos would demand a more clever approach
+ local function c_run(start) -- no need to check for 256 and attr probably also the same
local head = start
local done = false
while start do
local id = getid(start)
- if id == glyph_code and getfont(start) == font and getsubtype(start) < 256 then
+ if id ~= glyph_code then
+ -- very unlikely
+ start = getnext(start)
+ elseif getfont(start) == font and getsubtype(start) < 256 then
local a = getattr(start,0)
if a then
a = (a == attr) and (not attribute or getprop(start,a_state) == attribute)
@@ -2260,7 +2878,7 @@ local function featuresprocessor(head,font,attr)
if lookupmatch then
-- sequence kan weg
local ok
- head, start, ok = handler(head,start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,1)
+ head, start, ok = handler(head,start,kind,lookupname,lookupmatch,sequence,lookuphash,1)
if ok then
done = true
end
@@ -2270,48 +2888,106 @@ local function featuresprocessor(head,font,attr)
start = getnext(start)
end
else
- start = getnext(start)
+ return head, false
end
end
if done then
- success = true
- return head
+ success = true -- needed in this subrun?
end
+ return head, done
end
- local function kerndisc(disc) -- we can assume that prev and next are glyphs
- local prev = getprev(disc)
- local next = getnext(disc)
- if prev and next then
- setfield(prev,"next",next)
- -- setfield(next,"prev",prev)
- local a = getattr(prev,0)
- if a then
- a = (a == attr) and (not attribute or getprop(prev,a_state) == attribute)
+ local function t_run(start,stop)
+ while start ~= stop do
+ local id = getid(start)
+ if id == glyph_code and getfont(start) == font and getsubtype(start) < 256 then
+ local a = getattr(start,0)
+ if a then
+ a = (a == attr) and (not attribute or getprop(start,a_state) == attribute)
+ else
+ a = not attribute or getprop(start,a_state) == attribute
+ end
+ if a then
+ local lookupmatch = lookupcache[getchar(start)]
+ if lookupmatch then -- hm, hyphens can match (tlig) so we need to really check
+ -- if we need more than ligatures we can outline the code and use functions
+ local s = getnext(start)
+ local l = nil
+ while s do
+ local lg = lookupmatch[getchar(s)]
+ if lg then
+ l = lg
+ s = getnext(s)
+ else
+ break
+ end
+ end
+ if l and l.ligature then
+ return true
+ end
+ end
+ end
+ start = getnext(start)
else
- a = not attribute or getprop(prev,a_state) == attribute
+ break
end
- if a then
- local lookupmatch = lookupcache[getchar(prev)]
- if lookupmatch then
- -- sequence kan weg
- local h, d, ok = handler(head,prev,dataset[4],lookupname,lookupmatch,sequence,lookuphash,1)
- if ok then
- done = true
- success = true
+ end
+ end
+
+ local function d_run(prev) -- we can assume that prev and next are glyphs
+ local a = getattr(prev,0)
+ if a then
+ a = (a == attr) and (not attribute or getprop(prev,a_state) == attribute)
+ else
+ a = not attribute or getprop(prev,a_state) == attribute
+ end
+ if a then
+ local lookupmatch = lookupcache[getchar(prev)]
+ if lookupmatch then
+ -- sequence kan weg
+ local h, d, ok = handler(head,prev,kind,lookupname,lookupmatch,sequence,lookuphash,1)
+ if ok then
+ done = true
+ success = true
+ end
+ end
+ end
+ end
+
+ local function k_run(sub,injection,last)
+ local a = getattr(sub,0)
+ if a then
+ a = (a == attr) and (not attribute or getprop(sub,a_state) == attribute)
+ else
+ a = not attribute or getprop(sub,a_state) == attribute
+ end
+ if a then
+ -- sequence kan weg
+ for n in traverse_nodes(sub) do -- only gpos
+ if n == last then
+ break
+ end
+ local id = getid(n)
+ if id == glyph_code then
+ local lookupmatch = lookupcache[getchar(n)]
+ if lookupmatch then
+ local h, d, ok = handler(sub,n,kind,lookupname,lookupmatch,sequence,lookuphash,1,injection)
+ if ok then
+ done = true
+ success = true
+ end
end
+ else
+ -- message
end
end
- setfield(prev,"next",disc)
- -- setfield(next,"prev",disc)
end
- return next
end
while start do
local id = getid(start)
if id == glyph_code then
- if getfont(start) == font and getsubtype(start) < 256 then
+ if getfont(start) == font and getsubtype(start) < 256 then -- why a 256 test ...
local a = getattr(start,0)
if a then
a = (a == attr) and (not attribute or getprop(start,a_state) == attribute)
@@ -2319,44 +2995,46 @@ local function featuresprocessor(head,font,attr)
a = not attribute or getprop(start,a_state) == attribute
end
if a then
- local lookupmatch = lookupcache[getchar(start)]
+ local char = getchar(start)
+ local lookupmatch = lookupcache[char]
if lookupmatch then
-- sequence kan weg
local ok
- head, start, ok = handler(head,start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,1)
+ head, start, ok = handler(head,start,kind,lookupname,lookupmatch,sequence,lookuphash,1)
if ok then
success = true
+ elseif gpossing and zwnjruns and char == zwnj then
+ discrun(start,d_run)
end
+ elseif gpossing and zwnjruns and char == zwnj then
+ discrun(start,d_run)
end
if start then start = getnext(start) end
else
- start = getnext(start)
+ start = getnext(start)
end
else
start = getnext(start)
end
elseif id == disc_code then
- -- mostly for gsub
- if getsubtype(start) == discretionary_code then
- local pre = getfield(start,"pre")
- if pre then
- local new = subrun(pre)
- if new then setfield(start,"pre",new) end
- end
- local post = getfield(start,"post")
- if post then
- local new = subrun(post)
- if new then setfield(start,"post",new) end
- end
- local replace = getfield(start,"replace")
- if replace then
- local new = subrun(replace)
- if new then setfield(start,"replace",new) end
- end
-elseif typ == "gpos_single" or typ == "gpos_pair" then
- kerndisc(start)
- end
- start = getnext(start)
+ local discretionary = getsubtype(start) == discretionary_code
+ if gpossing then
+ if discretionary then
+ kernrun(start,k_run)
+ else
+ discrun(start,d_run,k_run)
+ end
+ start = getnext(start)
+ elseif discretionary then
+ if typ == "gsub_ligature" then
+ start = testrun(start,t_run,c_run)
+ else
+ comprun(start,c_run)
+ start = getnext(start)
+ end
+ else
+ start = getnext(start)
+ end
elseif id == whatsit_code then -- will be function
local subtype = getsubtype(start)
if subtype == dir_code then
@@ -2401,15 +3079,18 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then
end
end
end
+
else
- local function subrun(start)
- -- mostly for gsub, gpos would demand a more clever approach
+ local function c_run(start)
local head = start
local done = false
while start do
local id = getid(start)
- if id == glyph_code and getfont(start) == font and getsubtype(start) < 256 then
+ if id ~= glyph_code then
+ -- very unlikely
+ start = getnext(start)
+ elseif getfont(start) == font and getsubtype(start) < 256 then
local a = getattr(start,0)
if a then
a = (a == attr) and (not attribute or getprop(start,a_state) == attribute)
@@ -2417,15 +3098,17 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then
a = not attribute or getprop(start,a_state) == attribute
end
if a then
+ local char = getchar(start)
for i=1,ns do
local lookupname = subtables[i]
local lookupcache = lookuphash[lookupname]
if lookupcache then
- local lookupmatch = lookupcache[getchar(start)]
+ -- local lookupmatch = lookupcache[getchar(start)]
+ local lookupmatch = lookupcache[char]
if lookupmatch then
-- we could move all code inline but that makes things even more unreadable
local ok
- head, start, ok = handler(head,start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,i)
+ head, start, ok = handler(head,start,kind,lookupname,lookupmatch,sequence,lookuphash,i)
if ok then
done = true
break
@@ -2443,50 +3126,127 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then
start = getnext(start)
end
else
- start = getnext(start)
+ return head, false
end
end
if done then
success = true
- return head
end
+ return head, done
end
- local function kerndisc(disc) -- we can assume that prev and next are glyphs
- local prev = getprev(disc)
- local next = getnext(disc)
- if prev and next then
- setfield(prev,"next",next)
- -- setfield(next,"prev",prev)
- local a = getattr(prev,0)
- if a then
- a = (a == attr) and (not attribute or getprop(prev,a_state) == attribute)
- else
- a = not attribute or getprop(prev,a_state) == attribute
+ local function d_run(prev)
+ local a = getattr(prev,0)
+ if a then
+ a = (a == attr) and (not attribute or getprop(prev,a_state) == attribute)
+ else
+ a = not attribute or getprop(prev,a_state) == attribute
+ end
+ if a then
+ -- brr prev can be disc
+ local char = getchar(prev)
+ for i=1,ns do
+ local lookupname = subtables[i]
+ local lookupcache = lookuphash[lookupname]
+ if lookupcache then
+ local lookupmatch = lookupcache[char]
+ if lookupmatch then
+ -- we could move all code inline but that makes things even more unreadable
+ local h, d, ok = handler(head,prev,kind,lookupname,lookupmatch,sequence,lookuphash,i)
+ if ok then
+ done = true
+ break
+ end
+ end
+ else
+ report_missing_cache(typ,lookupname)
+ end
end
- if a then
- for i=1,ns do
- local lookupname = subtables[i]
- local lookupcache = lookuphash[lookupname]
- if lookupcache then
- local lookupmatch = lookupcache[getchar(prev)]
- if lookupmatch then
- -- we could move all code inline but that makes things even more unreadable
- local h, d, ok = handler(head,prev,dataset[4],lookupname,lookupmatch,sequence,lookuphash,i)
- if ok then
- done = true
- break
+ end
+ end
+
+ local function k_run(sub,injection,last)
+ local a = getattr(sub,0)
+ if a then
+ a = (a == attr) and (not attribute or getprop(sub,a_state) == attribute)
+ else
+ a = not attribute or getprop(sub,a_state) == attribute
+ end
+ if a then
+ for n in traverse_nodes(sub) do -- only gpos
+ if n == last then
+ break
+ end
+ local id = getid(n)
+ if id == glyph_code then
+ local char = getchar(n)
+ for i=1,ns do
+ local lookupname = subtables[i]
+ local lookupcache = lookuphash[lookupname]
+ if lookupcache then
+ local lookupmatch = lookupcache[char]
+ if lookupmatch then
+ local h, d, ok = handler(head,n,kind,lookupname,lookupmatch,sequence,lookuphash,i,injection)
+ if ok then
+ done = true
+ break
+ end
end
+ else
+ report_missing_cache(typ,lookupname)
end
- else
- report_missing_cache(typ,lookupname)
end
+ else
+ -- message
end
end
- setfield(prev,"next",disc)
- -- setfield(next,"prev",disc)
end
- return next
+ end
+
+ local function t_run(start,stop)
+ while start ~= stop do
+ local id = getid(start)
+ if id == glyph_code and getfont(start) == font and getsubtype(start) < 256 then
+ local a = getattr(start,0)
+ if a then
+ a = (a == attr) and (not attribute or getprop(start,a_state) == attribute)
+ else
+ a = not attribute or getprop(start,a_state) == attribute
+ end
+ if a then
+ local char = getchar(start)
+ for i=1,ns do
+ local lookupname = subtables[i]
+ local lookupcache = lookuphash[lookupname]
+ if lookupcache then
+ local lookupmatch = lookupcache[char]
+ if lookupmatch then
+ -- if we need more than ligatures we can outline the code and use functions
+ local s = getnext(start)
+ local l = nil
+ while s do
+ local lg = lookupmatch[getchar(s)]
+ if lg then
+ l = lg
+ s = getnext(s)
+ else
+ break
+ end
+ end
+ if l and l.ligature then
+ return true
+ end
+ end
+ else
+ report_missing_cache(typ,lookupname)
+ end
+ end
+ end
+ start = getnext(start)
+ else
+ break
+ end
+ end
end
while start do
@@ -2504,18 +3264,23 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then
local lookupname = subtables[i]
local lookupcache = lookuphash[lookupname]
if lookupcache then
- local lookupmatch = lookupcache[getchar(start)]
+ local char = getchar(start)
+ local lookupmatch = lookupcache[char]
if lookupmatch then
-- we could move all code inline but that makes things even more unreadable
local ok
- head, start, ok = handler(head,start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,i)
+ head, start, ok = handler(head,start,kind,lookupname,lookupmatch,sequence,lookuphash,i)
if ok then
success = true
break
elseif not start then
-- don't ask why ... shouldn't happen
break
+ elseif gpossing and zwnjruns and char == zwnj then
+ discrun(start,d_run)
end
+ elseif gpossing and zwnjruns and char == zwnj then
+ discrun(start,d_run)
end
else
report_missing_cache(typ,lookupname)
@@ -2529,27 +3294,24 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then
start = getnext(start)
end
elseif id == disc_code then
- -- mostly for gsub
- if getsubtype(start) == discretionary_code then
- local pre = getfield(start,"pre")
- if pre then
- local new = subrun(pre)
- if new then setfield(start,"pre",new) end
- end
- local post = getfield(start,"post")
- if post then
- local new = subrun(post)
- if new then setfield(start,"post",new) end
+ local discretionary = getsubtype(start) == discretionary_code
+ if gpossing then
+ if discretionary then
+ kernrun(start,k_run)
+ else
+ discrun(start,d_run,k_run)
end
- local replace = getfield(start,"replace")
- if replace then
- local new = subrun(replace)
- if new then setfield(start,"replace",new) end
+ start = getnext(start)
+ elseif discretionary then
+ if typ == "gsub_ligature" then
+ start = testrun(start,t_run,c_run)
+ else
+ comprun(start,c_run)
+ start = getnext(start)
end
-elseif typ == "gpos_single" or typ == "gpos_pair" then
- kerndisc(start)
+ else
+ start = getnext(start)
end
- start = getnext(start)
elseif id == whatsit_code then
local subtype = getsubtype(start)
if subtype == dir_code then
@@ -2600,6 +3362,7 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then
if trace_steps then -- ?
registerstep(head)
end
+
end
head = tonode(head)
@@ -2756,6 +3519,7 @@ local function prepare_contextchains(tfmdata)
local rawdata = tfmdata.shared.rawdata
local resources = rawdata.resources
local lookuphash = resources.lookuphash
+ local lookuptags = resources.lookuptags
local lookups = rawdata.lookups
if lookups then
for lookupname, lookupdata in next, rawdata.lookups do
@@ -2769,7 +3533,7 @@ local function prepare_contextchains(tfmdata)
report_prepare("unsupported format %a",format)
elseif not validformat[lookuptype] then
-- todo: dejavu-serif has one (but i need to see what use it has)
- report_prepare("unsupported format %a, lookuptype %a, lookupname %a",format,lookuptype,lookupname)
+ report_prepare("unsupported format %a, lookuptype %a, lookupname %a",format,lookuptype,lookuptags[lookupname])
else
local contexts = lookuphash[lookupname]
if not contexts then
@@ -2825,7 +3589,7 @@ local function prepare_contextchains(tfmdata)
-- no rules
end
else
- report_prepare("missing lookuptype for lookupname %a",lookupname)
+ report_prepare("missing lookuptype for lookupname %a",lookuptags[lookupname])
end
end
end
diff --git a/Master/texmf-dist/tex/context/base/font-otp.lua b/Master/texmf-dist/tex/context/base/font-otp.lua
index c80ee86ae61..63e4184c19a 100644
--- a/Master/texmf-dist/tex/context/base/font-otp.lua
+++ b/Master/texmf-dist/tex/context/base/font-otp.lua
@@ -140,6 +140,11 @@ end
-- return b
-- end
+-- beware: we cannot unpack and repack the same table because then sharing
+-- interferes (we could catch this if needed) .. so for now: save, reload
+-- and repack in such cases (never needed anyway) .. a tricky aspect is that
+-- we then need to sort more thanks to random hashing
+
local function packdata(data)
if data then
-- stripdata(data)
@@ -750,27 +755,28 @@ local function unpackdata(data)
rule.replacements = tv
end
end
- local fore = rule.fore
- if fore then
- local tv = tables[fore]
- if tv then
- rule.fore = tv
- end
- end
- local back = rule.back
- if back then
- local tv = tables[back]
- if tv then
- rule.back = tv
- end
- end
- local names = rule.names
- if names then
- local tv = tables[names]
- if tv then
- rule.names = tv
- end
- end
+ -- local fore = rule.fore
+ -- if fore then
+ -- local tv = tables[fore]
+ -- if tv then
+ -- rule.fore = tv
+ -- end
+ -- end
+ -- local back = rule.back
+ -- if back then
+ -- local tv = tables[back]
+ -- if tv then
+ -- rule.back = tv
+ -- end
+ -- end
+ -- local names = rule.names
+ -- if names then
+ -- local tv = tables[names]
+ -- if tv then
+ -- rule.names = tv
+ -- end
+ -- end
+ --
local lookups = rule.lookups
if lookups then
local tv = tables[lookups]
@@ -897,3 +903,4 @@ if otf.enhancers.register then
end
otf.enhancers.unpack = unpackdata -- used elsewhere
+otf.enhancers.pack = packdata -- used elsewhere
diff --git a/Master/texmf-dist/tex/context/base/font-ott.lua b/Master/texmf-dist/tex/context/base/font-ott.lua
index 1e23090565b..1f9a1ac041a 100644
--- a/Master/texmf-dist/tex/context/base/font-ott.lua
+++ b/Master/texmf-dist/tex/context/base/font-ott.lua
@@ -858,15 +858,18 @@ function otf.features.normalize(features)
if uv then
-- report_checks("feature value %a first seen at %a",value,key)
else
- if type(value) == "string" then
+ uv = tonumber(value) -- before boolean as there we also handle 0/1
+ if uv then
+ -- we're okay
+ elseif type(value) == "string" then
local b = is_boolean(value)
if type(b) == "nil" then
- uv = tonumber(value) or lower(value)
+ uv = lower(value)
else
uv = b
end
else
- uv = v
+ uv = value
end
if not rawget(features,k) then
k = rawget(verbosefeatures,k) or k
diff --git a/Master/texmf-dist/tex/context/base/font-otx.lua b/Master/texmf-dist/tex/context/base/font-otx.lua
deleted file mode 100644
index dc0469e398e..00000000000
--- a/Master/texmf-dist/tex/context/base/font-otx.lua
+++ /dev/null
@@ -1,419 +0,0 @@
-if not modules then modules = { } end modules ['font-otx'] = {
- version = 1.001,
- comment = "companion to font-otf.lua (analysing)",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
--- context only
-
-local type = type
-
-if not trackers then trackers = { register = function() end } end
-
------ trace_analyzing = false trackers.register("otf.analyzing", function(v) trace_analyzing = v end)
-
-local fonts, nodes, node = fonts, nodes, node
-
-local allocate = utilities.storage.allocate
-
-local otf = fonts.handlers.otf
-
-local analyzers = fonts.analyzers
-local initializers = allocate()
-local methods = allocate()
-
-analyzers.initializers = initializers
-analyzers.methods = methods
----------.useunicodemarks = false
-
-local a_state = attributes.private('state')
-
-local nuts = nodes.nuts
-local tonut = nuts.tonut
-
-local getfield = nuts.getfield
-local getnext = nuts.getnext
-local getprev = nuts.getprev
-local getid = nuts.getid
-local getprop = nuts.getprop
-local setprop = nuts.setprop
-local getfont = nuts.getfont
-local getsubtype = nuts.getsubtype
-local getchar = nuts.getchar
-
-local traverse_id = nuts.traverse_id
-local traverse_node_list = nuts.traverse
-local end_of_math = nuts.end_of_math
-
-local nodecodes = nodes.nodecodes
-local glyph_code = nodecodes.glyph
-local disc_code = nodecodes.disc
-local math_code = nodecodes.math
-
-local fontdata = fonts.hashes.identifiers
-local categories = characters and characters.categories or { } -- sorry, only in context
-local chardata = characters and characters.data
-
-local otffeatures = fonts.constructors.newfeatures("otf")
-local registerotffeature = otffeatures.register
-
---[[ldx--
-<p>Analyzers run per script and/or language and are needed in order to
-process features right.</p>
---ldx]]--
-
--- never use these numbers directly
-
-local s_init = 1 local s_rphf = 7
-local s_medi = 2 local s_half = 8
-local s_fina = 3 local s_pref = 9
-local s_isol = 4 local s_blwf = 10
-local s_mark = 5 local s_pstf = 11
-local s_rest = 6
-
-local states = {
- init = s_init,
- medi = s_medi,
- fina = s_fina,
- isol = s_isol,
- mark = s_mark,
- rest = s_rest,
- rphf = s_rphf,
- half = s_half,
- pref = s_pref,
- blwf = s_blwf,
- pstf = s_pstf,
-}
-
-local features = {
- init = s_init,
- medi = s_medi,
- fina = s_fina,
- isol = s_isol,
- -- mark = s_mark,
- -- rest = s_rest,
- rphf = s_rphf,
- half = s_half,
- pref = s_pref,
- blwf = s_blwf,
- pstf = s_pstf,
-}
-
-analyzers.states = states
-analyzers.features = features
-analyzers.useunicodemarks = false
-
--- todo: analyzers per script/lang, cross font, so we need an font id hash -> script
--- e.g. latin -> hyphenate, arab -> 1/2/3 analyze -- its own namespace
-
-function analyzers.setstate(head,font) -- we can skip math
- local useunicodemarks = analyzers.useunicodemarks
- local tfmdata = fontdata[font]
- local descriptions = tfmdata.descriptions
- local first, last, current, n, done = nil, nil, head, 0, false -- maybe make n boolean
- current = tonut(current)
- while current do
- local id = getid(current)
- if id == glyph_code and getfont(current) == font then
- done = true
- local char = getchar(current)
- local d = descriptions[char]
- if d then
- if d.class == "mark" then
- done = true
- setprop(current,a_state,s_mark)
- elseif useunicodemarks and categories[char] == "mn" then
- done = true
- setprop(current,a_state,s_mark)
- elseif n == 0 then
- first, last, n = current, current, 1
- setprop(current,a_state,s_init)
- else
- last, n = current, n+1
- setprop(current,a_state,s_medi)
- end
- else -- finish
- if first and first == last then
- setprop(last,a_state,s_isol)
- elseif last then
- setprop(last,a_state,s_fina)
- end
- first, last, n = nil, nil, 0
- end
- elseif id == disc_code then
- -- always in the middle
- setprop(current,a_state,s_medi)
- last = current
- else -- finish
- if first and first == last then
- setprop(last,a_state,s_isol)
- elseif last then
- setprop(last,a_state,s_fina)
- end
- first, last, n = nil, nil, 0
- if id == math_code then
- current = end_of_math(current)
- end
- end
- current = getnext(current)
- end
- if first and first == last then
- setprop(last,a_state,s_isol)
- elseif last then
- setprop(last,a_state,s_fina)
- end
- return head, done
-end
-
--- in the future we will use language/script attributes instead of the
--- font related value, but then we also need dynamic features which is
--- somewhat slower; and .. we need a chain of them
-
-local function analyzeinitializer(tfmdata,value) -- attr
- local script, language = otf.scriptandlanguage(tfmdata) -- attr
- local action = initializers[script]
- if not action then
- -- skip
- elseif type(action) == "function" then
- return action(tfmdata,value)
- else
- local action = action[language]
- if action then
- return action(tfmdata,value)
- end
- end
-end
-
-local function analyzeprocessor(head,font,attr)
- local tfmdata = fontdata[font]
- local script, language = otf.scriptandlanguage(tfmdata,attr)
- local action = methods[script]
- if not action then
- -- skip
- elseif type(action) == "function" then
- return action(head,font,attr)
- else
- action = action[language]
- if action then
- return action(head,font,attr)
- end
- end
- return head, false
-end
-
-registerotffeature {
- name = "analyze",
- description = "analysis of character classes",
- default = true,
- initializers = {
- node = analyzeinitializer,
- },
- processors = {
- position = 1,
- node = analyzeprocessor,
- }
-}
-
--- latin
-
-methods.latn = analyzers.setstate
-
-local arab_warned = { }
-
-local function warning(current,what)
- local char = getchar(current)
- if not arab_warned[char] then
- log.report("analyze","arab: character %C has no %a class",char,what)
- arab_warned[char] = true
- end
-end
-
-local mappers = {
- l = s_init, -- left
- d = s_medi, -- double
- c = s_medi, -- joiner
- r = s_fina, -- right
- u = s_isol, -- nonjoiner
-}
-
-local classifiers = { } -- we can also use this trick for devanagari
-
-local first_arabic, last_arabic = characters.blockrange("arabic")
-local first_syriac, last_syriac = characters.blockrange("syriac")
-local first_mandiac, last_mandiac = characters.blockrange("mandiac")
-local first_nko, last_nko = characters.blockrange("nko")
-
-table.setmetatableindex(classifiers,function(t,k)
- local c = chardata[k]
- local v = false
- if c then
- local arabic = c.arabic
- if arabic then
- v = mappers[arabic]
- if not v then
- log.report("analyze","error in mapping arabic %C",k)
- -- error
- v = false
- end
- elseif k >= first_arabic and k <= last_arabic or k >= first_syriac and k <= last_syriac or
- k >= first_mandiac and k <= last_mandiac or k >= first_nko and k <= last_nko then
- if categories[k] == "mn" then
- v = s_mark
- else
- v = s_rest
- end
- else
- end
- end
- t[k] = v
- return v
-end)
-
-function methods.arab(head,font,attr)
- local first, last = nil, nil
- local c_first, c_last = nil, nil
- local current, done = head, false
- current = tonut(current)
- while current do
- local id = getid(current)
- if id == glyph_code and getfont(current) == font and getsubtype(current)<256 and not getprop(current,a_state) then
- done = true
- local char = getchar(current)
- local classifier = classifiers[char]
- if not classifier then
- if last then
- if c_last == s_medi or c_last == s_fina then
- setprop(last,a_state,s_fina)
- else
- warning(last,"fina")
- setprop(last,a_state,s_error)
- end
- first, last = nil, nil
- elseif first then
- if c_first == s_medi or c_first == s_fina then
- setprop(first,a_state,s_isol)
- else
- warning(first,"isol")
- setprop(first,a_state,s_error)
- end
- first = nil
- end
- elseif classifier == s_mark then
- setprop(current,a_state,s_mark)
- elseif classifier == s_isol then
- if last then
- if c_last == s_medi or c_last == s_fina then
- setprop(last,a_state,s_fina)
- else
- warning(last,"fina")
- setprop(last,a_state,s_error)
- end
- first, last = nil, nil
- elseif first then
- if c_first == s_medi or c_first == s_fina then
- setprop(first,a_state,s_isol)
- else
- warning(first,"isol")
- setprop(first,a_state,s_error)
- end
- first = nil
- end
- setprop(current,a_state,s_isol)
- elseif classifier == s_medi then
- if first then
- last = current
- c_last = classifier
- setprop(current,a_state,s_medi)
- else
- setprop(current,a_state,s_init)
- first = current
- c_first = classifier
- end
- elseif classifier == s_fina then
- if last then
- if getprop(last,a_state) ~= s_init then
- setprop(last,a_state,s_medi)
- end
- setprop(current,a_state,s_fina)
- first, last = nil, nil
- elseif first then
- -- if getprop(first,a_state) ~= s_init then
- -- -- needs checking
- -- setprop(first,a_state,s_medi)
- -- end
- setprop(current,a_state,s_fina)
- first = nil
- else
- setprop(current,a_state,s_isol)
- end
- else -- classifier == s_rest
- setprop(current,a_state,s_rest)
- if last then
- if c_last == s_medi or c_last == s_fina then
- setprop(last,a_state,s_fina)
- else
- warning(last,"fina")
- setprop(last,a_state,s_error)
- end
- first, last = nil, nil
- elseif first then
- if c_first == s_medi or c_first == s_fina then
- setprop(first,a_state,s_isol)
- else
- warning(first,"isol")
- setprop(first,a_state,s_error)
- end
- first = nil
- end
- end
- else
- if last then
- if c_last == s_medi or c_last == s_fina then
- setprop(last,a_state,s_fina)
- else
- warning(last,"fina")
- setprop(last,a_state,s_error)
- end
- first, last = nil, nil
- elseif first then
- if c_first == s_medi or c_first == s_fina then
- setprop(first,a_state,s_isol)
- else
- warning(first,"isol")
- setprop(first,a_state,s_error)
- end
- first = nil
- end
- if id == math_code then -- a bit duplicate as we test for glyphs twice
- current = end_of_math(current)
- end
- end
- current = getnext(current)
- end
- if last then
- if c_last == s_medi or c_last == s_fina then
- setprop(last,a_state,s_fina)
- else
- warning(last,"fina")
- setprop(last,a_state,s_error)
- end
- elseif first then
- if c_first == s_medi or c_first == s_fina then
- setprop(first,a_state,s_isol)
- else
- warning(first,"isol")
- setprop(first,a_state,s_error)
- end
- end
- return head, done
-end
-
-methods.syrc = methods.arab
-methods.mand = methods.arab
-methods.nko = methods.arab
-
-directives.register("otf.analyze.useunicodemarks",function(v)
- analyzers.useunicodemarks = v
-end)
diff --git a/Master/texmf-dist/tex/context/base/font-pre.mkiv b/Master/texmf-dist/tex/context/base/font-pre.mkiv
index fc6eb289e64..c184a2118db 100644
--- a/Master/texmf-dist/tex/context/base/font-pre.mkiv
+++ b/Master/texmf-dist/tex/context/base/font-pre.mkiv
@@ -100,14 +100,14 @@
features=no]
\definefontfeature
- [semetic-complete]
+ [semitic-complete]
[mode=node,analyze=yes,language=dflt,ccmp=yes,
init=yes,medi=yes,fina=yes,isol=yes,
mark=yes,mkmk=yes,kern=yes,curs=yes,
liga=yes,dlig=yes,rlig=yes,clig=yes,calt=yes]
\definefontfeature
- [semetic-simple]
+ [semitic-simple]
[mode=node,analyze=yes,language=dflt,ccmp=yes,
init=yes,medi=yes,fina=yes,isol=yes,
mark=yes,mkmk=yes,kern=yes,curs=yes,
@@ -115,22 +115,22 @@
\definefontfeature
[arabic]
- [semetic-complete]
+ [semitic-complete]
[script=arab]
\definefontfeature
[hebrew]
- [semetic-complete]
+ [semitic-complete]
[script=hebr]
\definefontfeature
[simplearabic]
- [semetic-simple]
+ [semitic-simple]
[script=arab]
\definefontfeature
[simplehebrew]
- [semetic-simple]
+ [semitic-simple]
[script=hebr]
% \definefont [DevaOne] [file:chandas.ttf*devanagari-one at 12pt]
@@ -496,15 +496,16 @@
\definefontsize[\s!a] \definefontsize[\s!b]
\definefontsize[\s!c] \definefontsize[\s!d]
-\definealternativestyle [\v!mediaeval] [\os] []
-\definealternativestyle [\v!normal] [\tf] []
-\definealternativestyle [\v!bold] [\bf] []
-\definealternativestyle [\v!type] [\tt] []
-\definealternativestyle [\v!mono] [\tt] []
-\definealternativestyle [\v!slanted] [\sl] []
-\definealternativestyle [\v!italic] [\it] []
-\definealternativestyle [\v!boldslanted,\v!slantedbold] [\bs] []
-\definealternativestyle [\v!bolditalic,\v!italicbold] [\bi] []
+\definealternativestyle [\v!mediaeval] [\os] []
+\definealternativestyle [\v!normal] [\tf] []
+\definealternativestyle [\v!bold] [\bf] []
+\definealternativestyle [\v!type] [\tt] []
+\definealternativestyle [\v!mono] [\tt] []
+\definealternativestyle [\v!monobold] [\tt\bf] []
+\definealternativestyle [\v!slanted] [\sl] []
+\definealternativestyle [\v!italic] [\it] []
+\definealternativestyle [\v!boldslanted,\v!slantedbold] [\bs] []
+\definealternativestyle [\v!bolditalic,\v!italicbold] [\bi] []
\definealternativestyle [\v!small,\v!smallnormal] [\setsmallbodyfont\tf] []
\definealternativestyle [\v!smallbold] [\setsmallbodyfont\bf] []
@@ -584,6 +585,7 @@
\definefontfeature[f:smallcaps][smcp=yes]
\definefontfeature[f:oldstyle] [onum=yes]
\definefontfeature[f:tabular] [tnum=yes]
+\definefontfeature[f:superiors][sups=yes]
\definealternativestyle [\v!smallcaps] [\setsmallcaps] [\setsmallcaps]
\definealternativestyle [\v!oldstyle] [\setoldstyle ] [\setoldstyle ]
@@ -591,6 +593,7 @@
\unexpanded\def\setsmallcaps{\doaddfeature{f:smallcaps}}
\unexpanded\def\setoldstyle {\doaddfeature{f:oldstyle}}
\unexpanded\def\settabular {\doaddfeature{f:tabular}}
+\unexpanded\def\setsuperiors{\doaddfeature{f:superiors}}
%D \macros
%D {tinyfont}
@@ -617,6 +620,22 @@
\definefont[infofont][dejavusansmono at 6pt] % todo \the\everybodyfont
+%D Optimization (later we overload in math):
+
+\unexpanded\def\normaltf{\let\fontalternative\s!tf\font_helpers_synchronize_font}
+\unexpanded\def\normalbf{\let\fontalternative\s!bf\font_helpers_synchronize_font}
+\unexpanded\def\normalit{\let\fontalternative\s!it\font_helpers_synchronize_font}
+\unexpanded\def\normalsl{\let\fontalternative\s!sl\font_helpers_synchronize_font}
+\unexpanded\def\normalbi{\let\fontalternative\s!bi\font_helpers_synchronize_font}
+\unexpanded\def\normalbs{\let\fontalternative\s!bs\font_helpers_synchronize_font}
+
+\let\tf\normaltf
+\let\bf\normalbf
+\let\it\normalit
+\let\sl\normalsl
+\let\bi\normalbi
+\let\bs\normalbs
+
\protect \endinput
% LM math vs CM math (analysis by Taco):
@@ -652,3 +671,30 @@
%
% /lessorequalslant
% /greaterorequalslant
+
+% \unprotect
+%
+% \definehighlight[\v!italic ][\c!command=\v!no,\c!style=\v!italic]
+% \definehighlight[\v!bold ][\c!command=\v!no,\c!style=\v!bold]
+% \definehighlight[\v!bolditalic][\c!command=\v!no,\c!style=\v!bolditalic]
+% \definehighlight[\v!mono] [\c!command=\v!no,\c!style=\v!mono]
+% \definehighlight[\v!monobold] [\c!command=\v!no,\c!style=\v!monobold]
+%
+% \definehighlight[important] [\c!command=\v!no,\c!style=\v!bold]
+% \definehighlight[unimportant] [\c!command=\v!no,\c!color=darkgray]
+% \definehighlight[warning] [\c!command=\v!no,\c!style=\v!bold,\c!color=darkblue]
+% \definehighlight[error] [\c!command=\v!no,\c!style=\v!bold,\c!color=darkred]
+%
+% \protect
+%
+% \starttext
+% \highlight[italic] {italic}
+% \highlight[bolditalic] {bolditalic}
+% \highlight[bold] {bold}
+% \highlight[mono] {mono}
+% \highlight[monobold] {monobold}
+% \highlight[important] {important}
+% \highlight[unimportant]{unimportant}
+% \highlight[warning] {warning}
+% \highlight[error] {error}
+% \stoptext
diff --git a/Master/texmf-dist/tex/context/base/font-run.mkiv b/Master/texmf-dist/tex/context/base/font-run.mkiv
index cb40adedd90..1b8843b94c5 100644
--- a/Master/texmf-dist/tex/context/base/font-run.mkiv
+++ b/Master/texmf-dist/tex/context/base/font-run.mkiv
@@ -12,8 +12,8 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-%D [This code is hooked into the core macros and saves some
-%D format space. It needs a cleanup.]
+%D [This code is hooked into the core macros and saves some format
+%D space. It needs a cleanup.]
\unprotect
@@ -100,8 +100,8 @@
&&\tttf\tx\s!text&&\tttf\tx\s!script&&\tttf\tx\s!scriptscript
&&\tttf\tx\s!x&&\tttf\tx\s!xx&&\tttf\tx\v!small&&\tttf\tx\v!big
&&\tttf\tx\c!interlinespace&\cr
- \noalign{\hrule}
- \@EA\globalprocesscommalist\@EA[\bodyfontenvironmentlist]\next}}
+ \noalign{\hrule}%
+ \processbodyfontenvironmentlist\next}}
\ifinsidefloat\else\stopbaselinecorrection\fi}
\unexpanded\gdef\showfont
diff --git a/Master/texmf-dist/tex/context/base/font-sel.lua b/Master/texmf-dist/tex/context/base/font-sel.lua
index 86300c2dbcb..c3431a213ca 100644
--- a/Master/texmf-dist/tex/context/base/font-sel.lua
+++ b/Master/texmf-dist/tex/context/base/font-sel.lua
@@ -20,6 +20,8 @@ local v_simplefonts = interfaces.variables.simplefonts
local v_selectfont = interfaces.variables.selectfont
local v_default = interfaces.variables.default
+local implement = interfaces.implement
+
local selectfont = fonts.select or { }
fonts.select = selectfont
@@ -299,12 +301,12 @@ local mathsettings = {
},
}
-function commands.defineselectfont(settings)
+function selectfont.define(settings)
local index = #data + 1
data[index] = settings
selectfont.searchfiles(index)
selectfont.filterinput(index)
- context(index)
+ return index
end
local function savefont(data,alternative,entries)
@@ -493,6 +495,14 @@ function selectfont.filterinput(index)
end
end
+local ctx_definefontsynonym = context.definefontsynonym
+local ctx_resetfontfallback = context.resetfontfallback
+local ctx_startfontclass = context.startfontclass
+local ctx_stopfontclass = context.stopfontclass
+local ctx_loadfontgoodies = context.loadfontgoodies
+local ctx_definefontfallback = context.definefontfallback
+local ctx_definetypeface = context.definetypeface
+
local function definefontsynonym(data,alternative,index,fallback)
local fontdata = data.fonts and data.fonts[alternative]
local style = data.metadata.style
@@ -526,20 +536,24 @@ local function definefontsynonym(data,alternative,index,fallback)
local designsize = entry["designsize"] or 100
if designsize == 100 or designsize == 110 or designsize == 120 or designsize == 0 or #fontdata == 1 then
local filepath, filename = splitbase(entry["filename"])
+ if entry["format"] == "ttc" or entry["format"] == "dfont" then
+ filename = formatters["%s(%s)"](filename, entry["rawname"])
+ end
registerdesignsizes( fontfile, "default", filename )
break
end
end
if fallback then
- context.definefontsynonym( { fontname }, { fontfile }, { features = features } )
+ -- can we use
+ ctx_definefontsynonym( { fontname }, { fontfile }, { features = features } )
else
- context.definefontsynonym( { fontname }, { fontfile }, { features = features, fallbacks = fontfile, goodies = goodies } )
+ ctx_definefontsynonym( { fontname }, { fontfile }, { features = features, fallbacks = fontfile, goodies = goodies } )
end
else
if fallback then
- context.definefontsynonym( { fontname }, { fontparent }, { features = features } )
+ ctx_definefontsynonym( { fontname }, { fontparent }, { features = features } )
else
- context.definefontsynonym( { fontname }, { fontparent }, { features = features, fallbacks = fontfile, goodies = goodies } )
+ ctx_definefontsynonym( { fontname }, { fontparent }, { features = features, fallbacks = fontfile, goodies = goodies } )
end
end
end
@@ -552,11 +566,11 @@ local function definetypescript(index)
local typeface = data.metadata.typeface
local style = data.metadata.style
if entry and entry["tf"] then
- context.startfontclass( { typeface } )
+ ctx_startfontclass( { typeface } )
if goodies ~= "" then
goodies = utilities.parsers.settings_to_array(goodies)
for _, goodie in next, goodies do
- context.loadfontgoodies( { goodie } )
+ ctx_loadfontgoodies( { goodie } )
end
end
for alternative, _ in next, alternatives do
@@ -564,7 +578,7 @@ local function definetypescript(index)
definefontsynonym(data,alternative)
end
end
- context.stopfontclass()
+ ctx_stopfontclass()
else
-- regular style not available, loading aborted
end
@@ -595,20 +609,20 @@ local function definetextfontfallback(data,alternative,index)
local synonym = formatters["%s-%s-%s-fallback-%s"](typeface, style, alternative, index)
local fallback = formatters["%s-%s-%s"] (typeface, style, alternative)
if index == 1 then
- context.resetfontfallback( { fallback } )
+ ctx_resetfontfallback( { fallback } )
end
- context.definefontfallback( { fallback }, { synonym }, { range }, { rscale = rscale, check = check, force = force } )
+ ctx_definefontfallback( { fallback }, { synonym }, { range }, { rscale = rscale, check = check, force = force } )
end
local function definetextfallback(entry,index)
local data = data[index]
local typeface = data.metadata.typeface
- context.startfontclass( { typeface } )
+ ctx_startfontclass( { typeface } )
for alternative, _ in next, alternatives do
definefontsynonym (data,alternative,entry,true)
definetextfontfallback(data,alternative,entry)
end
- context.stopfontclass()
+ ctx_stopfontclass()
-- inspect(data)
end
@@ -624,14 +638,14 @@ local function definemathfontfallback(data,alternative,index)
local fontdata = data.fonts and data.fonts[alternative]
local fallback = formatters["%s-%s-%s"](typeface, style, alternative)
if index == 1 then
- context.resetfontfallback( { fallback } )
+ ctx_resetfontfallback( { fallback } )
end
if fontdata and #fontdata > 0 then
for _, entry in next, fontdata do
local filename = entry["filename"]
local designsize = entry["designsize"] or 100
if designsize == 100 or designsize == 110 or designsize == 120 or designsize == 0 or #fontdata == 1 then
- context.definefontfallback( { fallback }, { formatters["file:%s*%s"](filename,features) }, { range }, { rscale = rscale, check = check, force = force, offset = offset } )
+ ctx_definefontfallback( { fallback }, { formatters["file:%s*%s"](filename,features) }, { range }, { rscale = rscale, check = check, force = force, offset = offset } )
break
end
end
@@ -642,13 +656,13 @@ local function definemathfallback(entry,index)
local data = data[index]
local typeface = data.metadata.typeface
local style = data.metadata.style
- context.startfontclass( { typeface } )
+ ctx_startfontclass( { typeface } )
for alternative, _ in next, alternatives do
if synonyms[style][alternative] then
definemathfontfallback(data,alternative,entry)
end
end
- context.stopfontclass()
+ ctx_stopfontclass()
-- inspect(data)
end
@@ -676,7 +690,7 @@ local function definetextfont(index)
local style = styles[data.metadata.style]
local designsize = data.options.opticals == v_yes and "auto" or "default"
local scale = data.options.scale ~= "" and data.options.scale or 1
- context.definetypeface( { fontclass }, { shortstyle }, { style }, { "" }, { "default" }, { designsize = designsize, rscale = scale } )
+ ctx_definetypeface( { fontclass }, { shortstyle }, { style }, { "" }, { "default" }, { designsize = designsize, rscale = scale } )
end
local function definemathfont(index)
@@ -688,9 +702,9 @@ local function definemathfont(index)
local typescript = cleanname(data.metadata.family)
local entries = data.fonts
if entries then
- context.definetypeface( { fontclass }, { shortstyle }, { style }, { "" }, { "default" }, { rscale = scale } )
+ ctx_definetypeface( { fontclass }, { shortstyle }, { style }, { "" }, { "default" }, { rscale = scale } )
else
- context.definetypeface( { fontclass }, { shortstyle }, { style }, { typescript }, { "default" }, { rscale = scale } )
+ ctx_definetypeface( { fontclass }, { shortstyle }, { style }, { typescript }, { "default" }, { rscale = scale } )
end
end
@@ -708,5 +722,49 @@ function selectfont.definetypeface(index)
-- inspect(data)
end
-commands.definefontfamily = selectfont.definetypeface
-commands.definefallbackfamily = selectfont.registerfallback
+local styles = {
+ { "tf" }, { "bf" }, { "it" }, { "sl" }, { "bi" }, { "bs" }, { "sc" },
+}
+
+implement {
+ name = "defineselectfont",
+ actions = { selectfont.define, context },
+ arguments = {
+ {
+ {
+ "metadata", {
+ { "typeface" },
+ { "style" },
+ { "family" },
+ }
+ },
+ {
+ "options", {
+ { "opticals" },
+ { "scale" },
+ { "goodies" },
+ { "alternative" },
+ { "range" },
+ { "offset" },
+ { "check" },
+ { "force" },
+ }
+ },
+ { "alternatives", styles },
+ { "files", styles },
+ { "features", styles },
+ }
+ }
+}
+
+implement {
+ name = "definefontfamily",
+ actions = selectfont.definetypeface,
+ arguments = "integer"
+}
+
+implement {
+ name = "definefallbackfamily",
+ actions = selectfont.registerfallback,
+ arguments = { "string", "string", "integer"}
+}
diff --git a/Master/texmf-dist/tex/context/base/font-sel.mkvi b/Master/texmf-dist/tex/context/base/font-sel.mkvi
index 0b9a4bda987..820d211eb69 100644
--- a/Master/texmf-dist/tex/context/base/font-sel.mkvi
+++ b/Master/texmf-dist/tex/context/base/font-sel.mkvi
@@ -1,6 +1,6 @@
%D \module
%D [ file=font-sel,
-%D version=2014.03.10,
+%D version=2014.07.27,
%D title=\CONTEXT\ User Module,
%D subtitle=Selectfont,
%D author=Wolfgang Schuster,
@@ -27,51 +27,49 @@
\fi
\setexpandedselectfontparameter\c!style {\expandnamespaceparameter\??selectfontstyle \selectfontparameter\c!style \s!rm }%
\setexpandedselectfontparameter\c!alternative{\expandnamespaceparameter\??selectfontalternative\selectfontparameter\c!alternative\v!default}%
- \xdef\selectfont_index{\ctxcommand{
- defineselectfont {
- metadata = {
- typeface = "\selectfontparameter\c!name",
- style = "\selectfontparameter\c!style",
- family = "\selectfontparameter\c!family",
- },
- options = {
- opticals = "\selectfontparameter\c!opticalsize",
- scale = "\selectfontparameter\c!scale",
- goodies = "\selectfontparameter\c!goodies",
- alternative = "\selectfontparameter\c!alternative",
- range = "\selectfontparameter\c!range", % fallback only
- offset = "\selectfontparameter\c!offset", % fallback only
- check = "\selectfontparameter\c!check", % fallback only
- force = "\selectfontparameter\c!force", % fallback only
- },
- alternatives = {
- ["tf"] = "\selectfontparameter\s!tf",
- ["bf"] = "\selectfontparameter\s!bf",
- ["it"] = "\selectfontparameter\s!it",
- ["sl"] = "\selectfontparameter\s!sl",
- ["bi"] = "\selectfontparameter\s!bi",
- ["bs"] = "\selectfontparameter\s!bs",
- ["sc"] = "\selectfontparameter\s!sc",
- },
- files = {
- ["tf"] = "\selectfontparameter\c!regularfont",
- ["bf"] = "\selectfontparameter\c!boldfont",
- ["it"] = "\selectfontparameter\c!italicfont",
- ["sl"] = "\selectfontparameter\c!slantedfont",
- ["bi"] = "\selectfontparameter\c!bolditalicfont",
- ["bs"] = "\selectfontparameter\c!boldslantedfont",
- ["sc"] = "\selectfontparameter\c!smallcapsfont",
- },
- features = {
- ["tf"] = "\selectfontparameter\c!regularfeatures",
- ["bf"] = "\selectfontparameter\c!boldfeatures",
- ["it"] = "\selectfontparameter\c!italicfeatures",
- ["sl"] = "\selectfontparameter\c!slantedfeatures",
- ["bi"] = "\selectfontparameter\c!bolditalicfeatures",
- ["bs"] = "\selectfontparameter\c!boldslantedfeatures",
- ["sc"] = "\selectfontparameter\c!smallcapsfeatures",
- }
- }}}%
+ \xdef\selectfont_index{\clf_defineselectfont
+ metadata {%
+ typeface {\selectfontparameter\c!name}%
+ style {\selectfontparameter\c!style}%
+ family {\selectfontparameter\c!family}%
+ }
+ options {%
+ opticals {\selectfontparameter\c!opticalsize}%
+ scale {\selectfontparameter\c!scale}%
+ goodies {\selectfontparameter\c!goodies}%
+ alternative {\selectfontparameter\c!alternative}%
+ range {\selectfontparameter\c!range}% fallback only
+ offset {\selectfontparameter\c!offset}% fallback only
+ check {\selectfontparameter\c!check}% fallback only
+ force {\selectfontparameter\c!force}% fallback only
+ }
+ alternatives {%
+ tf {\selectfontparameter\s!tf}%
+ bf {\selectfontparameter\s!bf}%
+ it {\selectfontparameter\s!it}%
+ sl {\selectfontparameter\s!sl}%
+ bi {\selectfontparameter\s!bi}%
+ bs {\selectfontparameter\s!bs}%
+ sc {\selectfontparameter\s!sc}%
+ }
+ files {%
+ tf {\selectfontparameter\c!regularfont}%
+ bf {\selectfontparameter\c!boldfont}%
+ it {\selectfontparameter\c!italicfont}%
+ sl {\selectfontparameter\c!slantedfont}%
+ bi {\selectfontparameter\c!bolditalicfont}%
+ bs {\selectfontparameter\c!boldslantedfont}%
+ sc {\selectfontparameter\c!smallcapsfont}%
+ }
+ features {%
+ tf {\selectfontparameter\c!regularfeatures}%
+ bf {\selectfontparameter\c!boldfeatures}%
+ it {\selectfontparameter\c!italicfeatures}%
+ sl {\selectfontparameter\c!slantedfeatures}%
+ bi {\selectfontparameter\c!bolditalicfeatures}%
+ bs {\selectfontparameter\c!boldslantedfeatures}%
+ sc {\selectfontparameter\c!smallcapsfeatures}%
+ }}%
\endgroup}
%D \macros
@@ -104,7 +102,7 @@
{\dodoubleargument\selectfont_preset_define}
\def\selectfont_preset_define[#name][#settings]%
- {\doifassignmentelse{#settings}
+ {\doifelseassignment{#settings}
{\setvalue{\??selectfontpreset#name}{\setupcurrentselectfont[#settings]}}
{\setvalue{\??selectfontpreset#name}{\csname\??selectfontpreset#settings\endcsname}}}
@@ -115,18 +113,74 @@
% unknown preset
\fi}
-%definefontfamilypreset [range:chinese] [\c!range={cjkcompatibilityforms,cjkcompatibilityideographs,cjkcompatibilityideographssupplement,cjkradicalssupplement,cjkstrokes,cjksymbolsandpunctuation,cjkunifiedideographs,cjkunifiedideographsextensiona,cjkunifiedideographsextensionb,halfwidthandfullwidthforms,verticalforms,bopomofo,bopomofoextended}]
-%definefontfamilypreset [range:japanese] [\c!range={cjkcompatibilityforms,cjkcompatibilityideographs,cjkcompatibilityideographssupplement,cjkradicalssupplement,cjkstrokes,cjksymbolsandpunctuation,cjkunifiedideographs,cjkunifiedideographsextensiona,cjkunifiedideographsextensionb,halfwidthandfullwidthforms,verticalforms,hiragana,katakana}]
-%definefontfamilypreset [range:korean] [\c!range={cjkcompatibilityforms,cjkcompatibilityideographs,cjkcompatibilityideographssupplement,cjkradicalssupplement,cjkstrokes,cjksymbolsandpunctuation,cjkunifiedideographs,cjkunifiedideographsextensiona,cjkunifiedideographsextensionb,halfwidthandfullwidthforms,verticalforms,hangulcompatibilityjamo,hanguljamo,hanguljamoextendeda,hanguljamoextendedb,hangulsyllables}]
-%definefontfamilypreset [range:cyrillic] [\c!range={cyrillic,cyrillicextendeda,cyrillicextendedb,cyrillicsupplement}]
-%definefontfamilypreset [range:greek] [\c!range={greekandcoptic,greekextended,ancientgreeknumbers}]
-
-\definefontfamilypreset [range:chinese] [\c!range={0x02E80-0x02EFF,0x03000-0x031EF,0x03300-0x09FFF,0x0F900-0x0FFEF,0x20000-0x2A6DF,0x2F800-0x2FA1F,0x03100-0x0312F,0x031A0-0x031BF}]
-\definefontfamilypreset [range:japanese] [\c!range={0x02E80-0x02EFF,0x03000-0x031EF,0x03300-0x09FFF,0x0F900-0x0FFEF,0x20000-0x2A6DF,0x2F800-0x2FA1F,0x03040-0x0309F,0x030A0-0x030FF}]
-\definefontfamilypreset [range:korean] [\c!range={0x02E80-0x02EFF,0x03000-0x031EF,0x03300-0x09FFF,0x0F900-0x0FFEF,0x20000-0x2A6DF,0x2F800-0x2FA1F,0x01100-0x011FF,0x03130-0x0318F,0x0A960-0x0D7FF}]
-\definefontfamilypreset [range:cyrillic] [\c!range={0x00400-0x0052F,0x02DE0-0x02DFF,0x0A640-0x0A69F}]
-\definefontfamilypreset [range:greek] [\c!range={0x00370-0x003FF,0x01F00-0x01FFF,0x10140-0x1018F}]
-\definefontfamilypreset [range:hebrew] [\c!range={0x00590-0x005FF,0x0FB00-0x0FB4F}]
+\definefontfamilypreset
+ [range:chinese]
+ [\c!range={cjkcompatibilityforms,
+ cjkcompatibilityideographs,
+ cjkcompatibilityideographssupplement,
+ cjkradicalssupplement,
+ cjkstrokes,
+ cjksymbolsandpunctuation,
+ cjkunifiedideographs,
+ cjkunifiedideographsextensiona,
+ cjkunifiedideographsextensionb,
+ halfwidthandfullwidthforms,
+ verticalforms,
+ bopomofo,
+ bopomofoextended}]
+
+\definefontfamilypreset
+ [range:japanese]
+ [\crange={cjkcompatibilityforms,
+ cjkcompatibilityideographs,
+ cjkcompatibilityideographssupplement,
+ cjkradicalssupplement,
+ cjkstrokes,
+ cjksymbolsandpunctuation,
+ cjkunifiedideographs,
+ cjkunifiedideographsextensiona,
+ cjkunifiedideographsextensionb,
+ halfwidthandfullwidthforms,
+ verticalforms,
+ hiragana,
+ katakana}]
+
+\definefontfamilypreset
+ [range:korean]
+ [\c!range={cjkcompatibilityforms,
+ cjkcompatibilityideographs,
+ cjkcompatibilityideographssupplement,
+ cjkradicalssupplement,
+ cjkstrokes,
+ cjksymbolsandpunctuation,
+ cjkunifiedideographs,
+ cjkunifiedideographsextensiona,
+ cjkunifiedideographsextensionb,
+ halfwidthandfullwidthforms,
+ verticalforms,
+ hangulcompatibilityjamo,
+ hanguljamo,
+ hanguljamoextendeda,
+ hanguljamoextendedb,
+ hangulsyllables}]
+
+\definefontfamilypreset
+ [range:cyrillic]
+ [\c!range={cyrillic,
+ cyrillicextendeda,
+ cyrillicextendedb,
+ cyrillicsupplement}]
+
+\definefontfamilypreset
+ [range:greek]
+ [\c!range={greekandcoptic,
+ greekextended,
+ ancientgreeknumbers}]
+
+\definefontfamilypreset
+ [range:hebrew]
+ [\c!range={hebrew,
+ alphabeticpresentationforms}]
\definefontfamilypreset [math:digitsnormal] [\c!range=digitsnormal]
\definefontfamilypreset [math:digitsbold] [\c!range=digitsnormal,\c!offset=digitsbold,\s!tf=style:bold]
@@ -226,7 +280,7 @@
%D \stoptyping
%D
%D When a document contains different languages and the global font lacks some characters
-%D for one language, one could set a different font where these characters are taken from.
+%D for one language, one could set a different font where these charcters are taken from.
%D This fallback font (there can be more than one for a certain style) could be set with
%D the \tex{definefallbackfamily} command which takes the same argument as
%D the \tex{definefontfamily} command.
@@ -271,20 +325,20 @@
{\doquadrupleempty\selectfont_family_define}
\def\selectfont_family_define[#typeface][#style][#family][#settings]%
- {\doifassignmentelse{#settings}
+ {\doifelseassignment{#settings}
{\selectfont_setparameters[\c!name={#typeface},\c!style={#style},\c!family={#family},#settings]}
{\selectfont_setparameters[\c!name={#typeface},\c!style={#style},\c!family={#family},\c!preset={#settings}]}%
- \ctxcommand{definefontfamily(\selectfont_index)}}
+ \clf_definefontfamily\selectfont_index\relax}
\unexpanded\def\definefallbackfamily
{\doquadrupleempty\selectfont_fallback_define}
\def\selectfont_fallback_define[#typeface][#style][#family][#settings]%
- {\doifassignmentelse{#settings}
+ {\doifelseassignment{#settings}
{\selectfont_setparameters[\c!name={#typeface},\c!style={#style},\c!family={#family},#settings]}
{\selectfont_setparameters[\c!name={#typeface},\c!style={#style},\c!family={#family},\c!preset={#settings}]}%
\edef\p_selectfont_style{\expandnamespacevalue\??selectfontstyle{#style}\s!rm}%
- \ctxcommand{definefallbackfamily("#typeface","\p_selectfont_style",\selectfont_index)}}
+ \clf_definefallbackfamily{#typeface}{\p_selectfont_style}\selectfont_index\relax}
%D \macros
%D {setupfontfamily,setupfallbackfamily}
@@ -332,7 +386,8 @@
\unexpanded\def\selectfont_set_default
{\selectfont_set_font_family[\v!serif][Latin Modern Roman][\c!opticalsize=\v!yes]%
\selectfont_set_font_family[\v!sans] [Latin Modern Sans] [\c!opticalsize=\v!yes]%
- \selectfont_set_font_family[\v!mono] [Latin Modern Mono] [\c!opticalsize=\v!yes,\c!features=\s!none]}
+ \selectfont_set_font_family[\v!mono] [Latin Modern Mono] [\c!opticalsize=\v!yes,\c!features=\s!none]%
+ \selectfont_set_font_family[\v!math] [Latin Modern Math] [\c!opticalsize=\v!yes]}
\unexpanded\def\setupfallbackfamily
{\dotripleempty\selectfont_fallback_setup}
diff --git a/Master/texmf-dist/tex/context/base/font-set.mkvi b/Master/texmf-dist/tex/context/base/font-set.mkvi
index f94d6c86e0c..b29545ace3f 100644
--- a/Master/texmf-dist/tex/context/base/font-set.mkvi
+++ b/Master/texmf-dist/tex/context/base/font-set.mkvi
@@ -41,13 +41,15 @@
\let\m_font_fallback_name\empty
-\def\font_preloads_reset_nullfont % this is needed because some macro packages (tikz) misuse \nullfont
- {\dorecurse\plusseven{\fontdimen\recurselevel\nullfont\zeropoint}% keep en eye on this as:
- \ctxcommand{resetnullfont()}% in luatex 0.70 this will also do the previous
- \globallet\font_preloads_reset_nullfont\relax}
+% keep as reference:
+%
+% \def\font_preloads_reset_nullfont % this is needed because some macro packages (tikz) misuse \nullfont
+% {\dorecurse\plusseven{\fontdimen\recurselevel\nullfont\zeropoint}% keep en eye on this as:
+% \clf_resetnullfont % in luatex 0.70 this will also do the previous
+% \globallet\font_preloads_reset_nullfont\relax}
\def\font_preload_check_mode
- {\doifmodeelse{lmmath}
+ {\doifelsemode{lmmath}
{\def\m_font_fallback_name{modern-designsize-virtual}}% this will stay
{\def\m_font_fallback_name{modern-designsize}}% % this might become 'modern'
\glet\font_preload_check_mode\relax}
@@ -81,7 +83,8 @@
\glet\fourthstagepreloadfonts \relax
\global\everyhbox\emptytoks
\global\everyvbox\emptytoks
- \font_preloads_reset_nullfont}
+ % old: \font_preloads_reset_nullfont, new:
+ \clf_resetnullfont}
\appendtoks
\font_preloads_reset
@@ -90,7 +93,9 @@
\def\font_preloads_reset_checked
{\glet\font_preload_default_fonts_tt\relax
\glet\font_preload_default_fonts_mm\relax
- \glet\font_preloads_third_stage \relax}
+ \glet\font_preloads_third_stage \relax
+% \glet\font_preloads_fourth_stage \relax
+ }
\def\font_preloads_zero_stage_indeed
{\definedfont[\s!file:lmmono10-regular sa 1]}
@@ -101,7 +106,7 @@
\font_preloads_zero_stage}
\unexpanded\def\font_preloads_first_stage % % *nofonts -> *preloadfonts
- {\doifmodeelse{*preloadfonts}
+ {\doifelsemode{*preloadfonts}
{\font_preload_default_fonts
\writestatus\m!fonts{preloading latin modern fonts (first stage)}}
{\writestatus\m!fonts{latin modern fonts are not preloaded}}}
@@ -132,7 +137,7 @@
\unexpanded\def\font_preloads_fourth_stage
{\begingroup
%ifzeropt\fontcharwd\font\number`!\relax
- \setbox\scratchbox\hbox{checking fonts}%
+ \setbox\scratchbox\hbox{c o n t e x t}%
\ifzeropt\wd\scratchbox
\writeline
\writestatus\m!fonts{!! No bodyfont has been defined and no defaults have been}%
diff --git a/Master/texmf-dist/tex/context/base/font-sol.lua b/Master/texmf-dist/tex/context/base/font-sol.lua
index a41e4a67946..bbb2997f42b 100644
--- a/Master/texmf-dist/tex/context/base/font-sol.lua
+++ b/Master/texmf-dist/tex/context/base/font-sol.lua
@@ -45,6 +45,8 @@ local v_preroll = variables.preroll
local v_random = variables.random
local v_split = variables.split
+local implement = interfaces.implement
+
local settings_to_array = utilities.parsers.settings_to_array
local settings_to_hash = utilities.parsers.settings_to_hash
@@ -907,8 +909,52 @@ end
-- interface
-commands.definefontsolution = splitters.define
-commands.startfontsolution = splitters.start
-commands.stopfontsolution = splitters.stop
-commands.setfontsolution = splitters.set
-commands.resetfontsolution = splitters.reset
+implement {
+ name = "definefontsolution",
+ actions = splitters.define,
+ arguments = {
+ "string",
+ {
+ { "goodies" },
+ { "solution" },
+ { "less" },
+ { "more" },
+ }
+ }
+}
+
+implement {
+ name = "startfontsolution",
+ actions = splitters.start,
+ arguments = {
+ "string",
+ {
+ { "method" },
+ { "criterium" },
+ { "randomseed" },
+ }
+ }
+}
+
+implement {
+ name = "stopfontsolution",
+ actions = splitters.stop
+}
+
+implement {
+ name = "setfontsolution",
+ actions = splitters.set,
+ arguments = {
+ "string",
+ {
+ { "method" },
+ { "criterium" },
+ { "randomseed" },
+ }
+ }
+}
+
+implement {
+ name = "resetfontsolution",
+ actions = splitters.reset
+}
diff --git a/Master/texmf-dist/tex/context/base/font-sol.mkvi b/Master/texmf-dist/tex/context/base/font-sol.mkvi
index b40e37ceddf..d065b78ea55 100644
--- a/Master/texmf-dist/tex/context/base/font-sol.mkvi
+++ b/Master/texmf-dist/tex/context/base/font-sol.mkvi
@@ -85,24 +85,30 @@
\let\setupfontsolutions\setupfontsolution
\appendtoks
- \ctxcommand{definefontsolution("\currentfontsolution",{ % these are frozen
- goodies = "\fontsolutionparameter\s!goodies",
- solution = "\fontsolutionparameter\c!solution",
- less = "\fontsolutionparameter\c!less",
- more = "\fontsolutionparameter\c!more",
- })}
+ \clf_definefontsolution
+ {\currentfontsolution}%
+ {% these are frozen
+ goodies {\fontsolutionparameter\s!goodies}%
+ solution {\fontsolutionparameter\c!solution}%
+ less {\fontsolutionparameter\c!less}%
+ more {\fontsolutionparameter\c!more}%
+ }%
+ \relax
\to \everydefinefontsolution
\unexpanded\def\setfontsolution[#solution]% just one
{\edef\currentfontsolution{#solution}%
- \ctxcommand{setfontsolution("\currentfontsolution",{
- method = "\fontsolutionparameter\c!method",
- criterium = "\fontsolutionparameter\c!criterium",
- % randomseed = "\fontsolutionparameter\c!random",
- })}}
+ \clf_setfontsolution
+ {\currentfontsolution}%
+ {%
+ method {\fontsolutionparameter\c!method}%
+ criterium {\fontsolutionparameter\c!criterium}%
+ % randomseed {\fontsolutionparameter\c!random}%
+ }%
+ \relax}
\unexpanded\def\resetfontsolution % resets all
- {\ctxcommand{resetfontsolution()}%
+ {\clf_resetfontsolution
\let\currentfontsolution\empty}
\unexpanded\def\startfontsolution % [#1]
@@ -111,7 +117,7 @@
\unexpanded\def\stopfontsolution
{\ifhmode\par\fi
- \ctxcommand{stopfontsolution()}%
+ \clf_stopfontsolution
\popmacro\currentfontsolution}
% We initialize this module at the \LUA\ end.
diff --git a/Master/texmf-dist/tex/context/base/font-sty.mkvi b/Master/texmf-dist/tex/context/base/font-sty.mkvi
index 03fa598c2f2..673cf25aecd 100644
--- a/Master/texmf-dist/tex/context/base/font-sty.mkvi
+++ b/Master/texmf-dist/tex/context/base/font-sty.mkvi
@@ -279,7 +279,7 @@
{\groupedcommand{\font_styles_use_defined{#name}}{}} % or {\font_styles_apply_grouped{#name}}
\setvalue{\??styleargument3}#specification%
- {\doifassignmentelse{#specification}\font_styles_assignment\font_styles_direct{#specification}}
+ {\doifelseassignment{#specification}\font_styles_assignment\font_styles_direct{#specification}}
\def\font_styles_assignment#specification{\groupedcommand{\font_styles_use_generic{#specification}}{}}
\def\font_styles_direct #specification{\groupedcommand{\definedfont[#specification]}{}}
@@ -311,7 +311,7 @@
{\font_styles_use_defined{#name}}
\setvalue{\??styleenvironment3}#specification%
- {\doifassignmentelse{#specification}\font_styles_start_assignment\font_styles_start_direct{#specification}}
+ {\doifelseassignment{#specification}\font_styles_start_assignment\font_styles_start_direct{#specification}}
\def\font_styles_start_assignment#specification{\font_styles_use_generic{#specification}}
\def\font_styles_start_direct #specification{\definedfont[#specification]\relax}
diff --git a/Master/texmf-dist/tex/context/base/font-sym.mkvi b/Master/texmf-dist/tex/context/base/font-sym.mkvi
index c8ca49f7470..a21bea0ba62 100644
--- a/Master/texmf-dist/tex/context/base/font-sym.mkvi
+++ b/Master/texmf-dist/tex/context/base/font-sym.mkvi
@@ -110,12 +110,14 @@
%D The next macro can be used to make decisions based on the shape:
-\def\doifitalicelse#yes#nop%
+\def\doifelseitalic#yes#nop%
{\ifx\fontalternative\s!sl#yes\else
\ifx\fontalternative\s!it#yes\else
\ifx\fontalternative\s!bs#yes\else
\ifx\fontalternative\s!bi#yes\else#nop\fi\fi\fi\fi}
+\let\doifitalicelse\doifelseitalic
+
%D For an example of usage of the following command,
%D see \type {cont-log.tex}.
%D
@@ -167,15 +169,15 @@
\currentsymbolfont
\global\expandafter\let\csname\??symbolfont\askedsymbolfont\endcsname\lastrawfontcall}
-\unexpanded\def\getnamedglyphstyled#fontname#character{{\setstyledsymbolicfont{#fontname}\ctxcommand{fontchar("#character")}}}
-\unexpanded\def\getnamedglyphdirect#fontname#character{{\setdirectsymbolicfont{#fontname}\ctxcommand{fontchar("#character")}}}
-\unexpanded\def\getglyphstyled #fontname#character{{\setstyledsymbolicfont{#fontname}\doifnumberelse{#character}\char\donothing#character}}
-\unexpanded\def\getglyphdirect #fontname#character{{\setdirectsymbolicfont{#fontname}\doifnumberelse{#character}\char\donothing#character}}
+\unexpanded\def\getnamedglyphstyled#fontname#character{{\setstyledsymbolicfont{#fontname}\clf_fontchar{#character}}}
+\unexpanded\def\getnamedglyphdirect#fontname#character{{\setdirectsymbolicfont{#fontname}\clf_fontchar{#character}}}
+\unexpanded\def\getglyphstyled #fontname#character{{\setstyledsymbolicfont{#fontname}\doifelsenumber{#character}\char\donothing#character}}
+\unexpanded\def\getglyphdirect #fontname#character{{\setdirectsymbolicfont{#fontname}\doifelsenumber{#character}\char\donothing#character}}
% this one is wrong:
\unexpanded\def\getscaledglyph#scale#name#content%
- {{\setscaledstyledsymbolicfont\fontbody{#scale}{#name}\doifnumberelse{#content}\char\donothing#content}}
+ {{\setscaledstyledsymbolicfont\fontbody{#scale}{#name}\doifelsenumber{#content}\char\donothing#content}}
\let\getglyph \getglyphstyled % old
\let\getrawglyph \getglyphdirect % old
@@ -234,7 +236,7 @@
%D \macros{doiffontcharelse}
-\unexpanded\def\doiffontcharelse#specification#unicode% this could be a direct lua call
+\unexpanded\def\doifelsefontchar#specification#unicode% this could be a direct lua call
{\begingroup
\font_basics_define_font_without_parameters{thedefinedfont}{#specification}%
\iffontchar\font#unicode\relax
@@ -243,4 +245,6 @@
\endgroup\expandafter\secondoftwoarguments
\fi}
+\let\doiffontcharelse\doifelsefontchar
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/font-syn.lua b/Master/texmf-dist/tex/context/base/font-syn.lua
index 18ed46a2f88..bf46c85730f 100644
--- a/Master/texmf-dist/tex/context/base/font-syn.lua
+++ b/Master/texmf-dist/tex/context/base/font-syn.lua
@@ -33,7 +33,14 @@ local exists = io.exists
local findfile = resolvers.findfile
local cleanpath = resolvers.cleanpath
-local resolveresolved = resolvers.resolve
+local resolveprefix = resolvers.resolve
+
+local fontloader = fontloader
+local font_to_table = fontloader.to_table
+local open_font = fontloader.open
+local get_font_info = fontloader.info
+local close_font = fontloader.close
+local font_fields = fontloader.fields
local settings_to_hash = utilities.parsers.settings_to_hash_tolerant
@@ -50,7 +57,7 @@ using a table that has keys filtered from the font related files.</p>
fonts = fonts or { } -- also used elsewhere
-local names = font.names or allocate { }
+local names = fonts.names or allocate { }
fonts.names = names
local filters = names.filters or { }
@@ -298,10 +305,10 @@ end
but to keep the overview, we define them here.</p>
--ldx]]--
-filters.otf = fontloader.info
-filters.ttf = fontloader.info
-filters.ttc = fontloader.info
-filters.dfont = fontloader.info
+filters.otf = get_font_info
+filters.ttf = get_font_info
+filters.ttc = get_font_info
+filters.dfont = get_font_info
-- We had this as temporary solution because we needed a bit more info but in the
-- meantime it got an interesting side effect: currently luatex delays loading of e.g.
@@ -311,12 +318,12 @@ filters.dfont = fontloader.info
-- missing: names, units_per_em, design_range_bottom, design_range_top, design_size,
-- pfminfo, top_side_bearing
--- function fontloader.fullinfo(...) -- check with taco what we get / could get
--- local ff = fontloader.open(...)
+-- local function get_full_info(...) -- check with taco what we get / could get
+-- local ff = open_font(...)
-- if ff then
--- local d = ff -- and fontloader.to_table(ff)
+-- local d = ff -- and font_to_table(ff)
-- d.glyphs, d.subfonts, d.gpos, d.gsub, d.lookups = nil, nil, nil, nil, nil
--- fontloader.close(ff)
+-- close_font(ff)
-- return d
-- else
-- return nil, "error in loading font"
@@ -327,10 +334,10 @@ filters.dfont = fontloader.info
-- return these keys/values (and maybe some more) but at least we close the loader which
-- might save some memory in the end.
--- function fontloader.fullinfo(name)
--- local ff = fontloader.open(name)
+-- local function get_full_info(name)
+-- local ff = open_font(name)
-- if ff then
--- local fields = table.tohash(fontloader.fields(ff),true)
+-- local fields = table.tohash(font_fields(ff),true) -- isn't that one stable
-- local d = {
-- names = fields.names and ff.names,
-- familyname = fields.familyname and ff.familyname,
@@ -349,36 +356,68 @@ filters.dfont = fontloader.info
-- setmetatableindex(d,function(t,k)
-- report_names("warning, trying to access field %a in font table of %a",k,name)
-- end)
--- fontloader.close(ff)
+-- close_font(ff)
-- return d
-- else
-- return nil, "error in loading font"
-- end
-- end
--- As we have lazy loading anyway, this one still is full and with less code than
--- the previous one. But this depends on the garbage collector to kick in.
+-- more efficient:
+
+local fields = nil
-function fontloader.fullinfo(...)
- local ff = fontloader.open(...)
+local function get_full_info(name)
+ local ff = open_font(name)
if ff then
- local d = { } -- ff is userdata so [1] or # fails on it
- setmetatableindex(d,ff)
+ if not fields then
+ fields = table.tohash(font_fields(ff),true)
+ end
+ -- unfortunately luatex aborts when a field is not available
+ local d = {
+ names = fields.names and ff.names,
+ familyname = fields.familyname and ff.familyname,
+ fullname = fields.fullname and ff.fullname,
+ fontname = fields.fontname and ff.fontname,
+ weight = fields.weight and ff.weight,
+ italicangle = fields.italicangle and ff.italicangle,
+ units_per_em = fields.units_per_em and ff.units_per_em,
+ design_range_bottom = fields.design_range_bottom and ff.design_range_bottom,
+ design_range_top = fields.design_range_top and ff.design_range_top,
+ design_size = fields.design_size and ff.design_size,
+ italicangle = fields.italicangle and ff.italicangle,
+ pfminfo = fields.pfminfo and ff.pfminfo,
+ top_side_bearing = fields.top_side_bearing and ff.top_side_bearing, -- not there
+ }
+ setmetatableindex(d,function(t,k)
+ report_names("warning, trying to access field %a in font table of %a",k,name)
+ end)
+ close_font(ff)
return d
else
return nil, "error in loading font"
end
end
--- We don't get the design_* values here as for that the fontloader has to load feature
--- info and therefore we're not much better off than using 'open'.
---
--- if tonumber(status.luatex_version) > 78 or (tonumber(status.luatex_version) == 78 and tonumber(status.luatex_revision) > 0) then
--- fontloader.fullinfo = fontloader.info
+-- As we have lazy loading anyway, this one still is full and with less code than
+-- the previous one. But this depends on the garbage collector to kick in and in the
+-- current version that somehow happens not that often (on my machine I end up with
+-- soem 3 GB extra before that happens).
+
+-- local function get_full_info(...)
+-- local ff = open_font(...)
+-- if ff then
+-- local d = { } -- ff is userdata so [1] or # fails on it
+-- setmetatableindex(d,ff)
+-- return d -- garbage collection will do the close_font(ff)
+-- else
+-- return nil, "error in loading font"
+-- end
-- end
-filters.otf = fontloader.fullinfo
-filters.ttf = fontloader.fullinfo
+fontloader.fullinfo = get_full_info
+filters .otf = get_full_info
+filters .ttf = get_full_info
function filters.afm(name)
-- we could parse the afm file as well, and then report an error but
@@ -408,7 +447,7 @@ function filters.afm(name)
end
function filters.pfb(name)
- return fontloader.info(name)
+ return get_font_info(name)
end
--[[ldx--
@@ -1065,15 +1104,15 @@ local function analyzefiles(olddata)
resolvers.dowithfilesintree(".*%." .. suffix .. "$", function(method,root,path,name)
if method == "file" or method == "tree" then
local completename = root .."/" .. path .. "/" .. name
- completename = resolveresolved(completename) -- no shortcut
+ completename = resolveprefix(completename) -- no shortcut
identify(completename,name,suffix,name)
return true
end
end, function(blobtype,blobpath,pattern)
- blobpath = resolveresolved(blobpath) -- no shortcut
+ blobpath = resolveprefix(blobpath) -- no shortcut
report_names("scanning path %a for %s files",blobpath,suffix)
end, function(blobtype,blobpath,pattern,total,checked,done)
- blobpath = resolveresolved(blobpath) -- no shortcut
+ blobpath = resolveprefix(blobpath) -- no shortcut
report_names("%s entries found, %s %s files checked, %s okay",total,checked,suffix,done)
end)
end
diff --git a/Master/texmf-dist/tex/context/base/font-tfm.lua b/Master/texmf-dist/tex/context/base/font-tfm.lua
index 827d7058696..ab03788516a 100644
--- a/Master/texmf-dist/tex/context/base/font-tfm.lua
+++ b/Master/texmf-dist/tex/context/base/font-tfm.lua
@@ -70,16 +70,17 @@ local function read_from_tfm(specification)
properties.fontname = tfmdata.fontname
properties.psname = tfmdata.psname
properties.filename = specification.filename
+ properties.format = fonts.formats.tfm -- better than nothing
parameters.size = size
- shared.rawdata = { }
- shared.features = features
- shared.processes = next(features) and tfm.setfeatures(tfmdata,features) or nil
--
tfmdata.properties = properties
tfmdata.resources = resources
tfmdata.parameters = parameters
tfmdata.shared = shared
--
+ shared.rawdata = { }
+ shared.features = features
+ shared.processes = next(features) and tfm.setfeatures(tfmdata,features) or nil
parameters.slant = parameters.slant or parameters[1] or 0
parameters.space = parameters.space or parameters[2] or 0
parameters.space_stretch = parameters.space_stretch or parameters[3] or 0
@@ -114,6 +115,11 @@ local function read_from_tfm(specification)
features.encoding = encoding
end
end
+ -- let's play safe:
+ properties.haskerns = true
+ properties.haslogatures = true
+ resources.unicodes = { }
+ resources.lookuptags = { }
--
return tfmdata
end
diff --git a/Master/texmf-dist/tex/context/base/font-tra.mkiv b/Master/texmf-dist/tex/context/base/font-tra.mkiv
index 45d8a728059..b0c3ae55b5a 100644
--- a/Master/texmf-dist/tex/context/base/font-tra.mkiv
+++ b/Master/texmf-dist/tex/context/base/font-tra.mkiv
@@ -95,7 +95,9 @@
%D \doiffontpresentelse{adam-lindsay-modern-serif}{YES}{NO}
%D \stoptyping
-\unexpanded\def\doiffontpresentelse#1{\ctxcommand{doifelse(fonts.names.exists("#1"))}}
+\unexpanded\def\doifelsefontpresent#1{\clf_doifelsefontpresent{#1}}
+
+\let\doiffontpresentelse\doifelsefontpresent
% experimental, maybe this becomes a module
@@ -114,11 +116,14 @@
{\ctxlua{nodes.tracers.steppers.glyphs(\number\otfcollector,#1)}%
\unhbox\otfcollector}
-\unexpanded\def\otfstepcharcommand#1#2#3% font char class
+\unexpanded\def\otfstepspace
{\removeunwantedspaces
- \hskip.5\emwidth \s!plus .125\emwidth\relax
- \doif{#3}{mark}{\underbar}{U+\hexnumber{#2}}:\ruledhbox{\ctxlua{nodes.tracers.fontchar(#1,#2)}}%
- \hskip.5\emwidth \s!plus .125\emwidth\relax}
+ \hskip.5\emwidth \s!plus .125\emwidth \s!minus .125\emwidth\relax}
+
+\unexpanded\def\otfstepcharcommand#1#2#3% font char class
+ {\otfstepspace
+ \doif{#3}{mark}{\underbar}{U+\hexnumber{#2}}:\ruledhbox{\ctxlua{nodes.tracers.fontchar(#1,#2)}}%
+ \otfstepspace}
\unexpanded\def\otfstepfontcommand#1#2#3% id font size
{\begingroup
@@ -142,7 +147,7 @@
{\ctxlua{nodes.tracers.steppers.font("otfstepfontcommand")}}
\unexpanded\def\showotfstepchars#1%
- {\ctxlua{nodes.tracers.steppers.codes(#1,"otfstepcharcommand")}}
+ {\ctxlua{nodes.tracers.steppers.codes(#1,"otfstepcharcommand","otfstepspace")}}
\unexpanded\def\showotfstepmessages#1%
{\ctxlua{nodes.tracers.steppers.messages(#1,"otfstepmessagecommand",true)}}
diff --git a/Master/texmf-dist/tex/context/base/font-uni.mkiv b/Master/texmf-dist/tex/context/base/font-uni.mkiv
index 223d27606b7..91a488ff205 100644
--- a/Master/texmf-dist/tex/context/base/font-uni.mkiv
+++ b/Master/texmf-dist/tex/context/base/font-uni.mkiv
@@ -13,14 +13,14 @@
\writestatus{loading}{ConTeXt Font Macros / Unicode}
-%D In \MKIV\ we only provide the \type {\uchar} macro and
-%D implement it as just an \UTF\ converter. We expand it so
-%D best not use not use it for active characters.
+%D In \MKIV\ we only provide the \type {\uchar} macro and implement it as just
+%D an \UTF\ converter. We expand it so best not use not use it for active
+%D characters. In practice this command is probably never used anyway but we keep
+%D if for old styles.
\unprotect
-%def\uchar#1#2{\ctxcommand{uchar(,)}}
-\def\uchar#1#2{\cldcontext{utf.char(\number\numexpr#1*256+#2\relax)}}
+\def\uchar#1#2{\clf_uchar\numexpr#1\relax\numexpr#2\relax}
\let\uc\uchar
diff --git a/Master/texmf-dist/tex/context/base/grph-epd.lua b/Master/texmf-dist/tex/context/base/grph-epd.lua
index 4f9d4609765..17f04d593da 100644
--- a/Master/texmf-dist/tex/context/base/grph-epd.lua
+++ b/Master/texmf-dist/tex/context/base/grph-epd.lua
@@ -22,4 +22,13 @@ function figures.mergegoodies(optionlist)
if all or options[variables.layer] then
codeinjections.mergeviewerlayers()
end
+ if all or options[variables.bookmark] then
+ codeinjections.mergebookmarks()
+ end
end
+
+interfaces.implement {
+ name = "figure_mergegoodies",
+ actions = figures.mergegoodies,
+ arguments = "string"
+}
diff --git a/Master/texmf-dist/tex/context/base/grph-epd.mkiv b/Master/texmf-dist/tex/context/base/grph-epd.mkiv
index 58526fd44dd..2df195589b4 100644
--- a/Master/texmf-dist/tex/context/base/grph-epd.mkiv
+++ b/Master/texmf-dist/tex/context/base/grph-epd.mkiv
@@ -17,12 +17,12 @@
\registerctxluafile{grph-epd}{1.001}
-\def\figurereference{\ctxcommand{figurestatus("reference")}} % might become private
+\def\figurereference{\clf_figurestatus{reference}{}} % might become private
\defineoverlay[system:graphics:epdf][\directsetup{system:graphics:epdf}]
\startsetups system:graphics:epdf
- \ctxlua{figures.mergegoodies("\externalfigureparameter\c!interaction")}%
+ \clf_figure_mergegoodies{\externalfigureparameter\c!interaction}%
\reference[\figurereference]{}% todo: dest area
\stopsetups
@@ -32,7 +32,7 @@
\c!offset=\v!overlay,
\c!background={\v!foreground,system:graphics:epdf}]
-\def\grph_epdf_add_overlay
+\unexpanded\def\grph_epdf_add_overlay
{\global\setbox\foundexternalfigure\vbox\bgroup
\system_graphics_epdf{\box\foundexternalfigure}%
\egroup}
diff --git a/Master/texmf-dist/tex/context/base/grph-fig.mkiv b/Master/texmf-dist/tex/context/base/grph-fig.mkiv
index 9b9333fa9a1..f5152874d0d 100644
--- a/Master/texmf-dist/tex/context/base/grph-fig.mkiv
+++ b/Master/texmf-dist/tex/context/base/grph-fig.mkiv
@@ -45,7 +45,7 @@
{\ifsecondargument
\grph_buffers_typeset_indeed[#1][#2]%
\else\iffirstargument
- \doifassignmentelse{#1}
+ \doifelseassignment{#1}
{\grph_buffers_typeset_indeed[\jobname][#1]}%
{\grph_buffers_typeset_indeed[#1][]}%
\else
@@ -53,7 +53,7 @@
\fi\fi}
\def\grph_buffers_typeset_indeed[#1][#2]% we could use the via files
- {\doifnot{#1}{*}{\xdef\lasttypesetbuffer{\ctxcommand{runbuffer("#1",true)}}}%
+ {\doifnot{#1}{*}{\xdef\lasttypesetbuffer{\clf_runbuffer{#1}}}%
\ifcase\c_grph_buffers_mode
% typesetonly
\or
@@ -94,7 +94,7 @@
\def\grph_typesetting_process_indeed#1#2#3#4% options settings-a filename settings-b
{\begingroup
- \edef\m_typesetting_name{\cldcontext{job.files.context("#3","#1")}}%
+ \edef\m_typesetting_name{\clf_runcontextjob{#3}{#1}}%
\ifx\m_typesetting_name\empty \else
\expanded{\externalfigure[\m_typesetting_name]}[#2,#4]%
\fi
diff --git a/Master/texmf-dist/tex/context/base/grph-fil.lua b/Master/texmf-dist/tex/context/base/grph-fil.lua
index 3449f1779c2..c1532ce25e3 100644
--- a/Master/texmf-dist/tex/context/base/grph-fil.lua
+++ b/Master/texmf-dist/tex/context/base/grph-fil.lua
@@ -69,3 +69,9 @@ function jobfiles.context(name,options)
return file.replacesuffix(name,"pdf")
end
end
+
+interfaces.implement {
+ name = "runcontextjob",
+ arguments = { "string", "string" },
+ actions = { jobfiles.context, context }
+}
diff --git a/Master/texmf-dist/tex/context/base/grph-inc.lua b/Master/texmf-dist/tex/context/base/grph-inc.lua
index d89c52996c7..8a064c8e9c8 100644
--- a/Master/texmf-dist/tex/context/base/grph-inc.lua
+++ b/Master/texmf-dist/tex/context/base/grph-inc.lua
@@ -6,6 +6,7 @@ if not modules then modules = { } end modules ['grph-inc'] = {
license = "see context related readme files"
}
+-- todo: files are sometimes located twice
-- todo: empty filename or only suffix always false (not found)
-- lowercase types
-- mps tex tmp svg
@@ -37,6 +38,8 @@ The TeX-Lua mix is suboptimal. This has to do with the fact that we cannot
run TeX code from within Lua. Some more functionality will move to Lua.
]]--
+-- todo: store loaded pages per pdf file someplace
+
local format, lower, find, match, gsub, gmatch = string.format, string.lower, string.find, string.match, string.gsub, string.gmatch
local contains = table.contains
local concat, insert, remove = table.concat, table.insert, table.remove
@@ -46,7 +49,7 @@ local formatters = string.formatters
local longtostring = string.longtostring
local expandfilename = dir.expandname
-local P, lpegmatch = lpeg.P, lpeg.match
+local P, R, S, Cc, C, Cs, Ct, lpegmatch = lpeg.P, lpeg.R, lpeg.S, lpeg.Cc, lpeg.C, lpeg.Cs, lpeg.Ct, lpeg.match
local settings_to_array = utilities.parsers.settings_to_array
local settings_to_hash = utilities.parsers.settings_to_hash
@@ -56,24 +59,37 @@ local replacetemplate = utilities.templates.replace
local images = img
+local hasscheme = url.hasscheme
+local urlhashed = url.hashed
+
+local resolveprefix = resolvers.resolve
+
local texgetbox = tex.getbox
local texsetbox = tex.setbox
local hpack = node.hpack
+local new_latelua = nodes.pool.latelua
+
local context = context
+local implement = interfaces.implement
local variables = interfaces.variables
+
local codeinjections = backends.codeinjections
local nodeinjections = backends.nodeinjections
-local trace_figures = false trackers.register("graphics.locating", function(v) trace_figures = v end)
-local trace_bases = false trackers.register("graphics.bases", function(v) trace_bases = v end)
-local trace_programs = false trackers.register("graphics.programs", function(v) trace_programs = v end)
-local trace_conversion = false trackers.register("graphics.conversion", function(v) trace_conversion = v end)
-local trace_inclusion = false trackers.register("graphics.inclusion", function(v) trace_inclusion = v end)
+local trace_figures = false trackers.register ("graphics.locating", function(v) trace_figures = v end)
+local trace_bases = false trackers.register ("graphics.bases", function(v) trace_bases = v end)
+local trace_programs = false trackers.register ("graphics.programs", function(v) trace_programs = v end)
+local trace_conversion = false trackers.register ("graphics.conversion", function(v) trace_conversion = v end)
+local trace_inclusion = false trackers.register ("graphics.inclusion", function(v) trace_inclusion = v end)
+
+local extra_check = false directives.register("graphics.extracheck", function(v) extra_check = v end)
local report_inclusion = logs.reporter("graphics","inclusion")
+local report_figures = logs.reporter("system","graphics")
+local report_figure = logs.reporter("used graphic")
local f_hash_part = formatters["%s->%s->%s"]
local f_hash_full = formatters["%s->%s->%s->%s->%s->%s->%s"]
@@ -85,23 +101,41 @@ local v_high = variables.high
local v_global = variables["global"]
local v_local = variables["local"]
local v_default = variables.default
+local v_auto = variables.auto
local maxdimen = 2^30-1
function images.check(figure)
if figure then
- local width = figure.width
+ local width = figure.width
local height = figure.height
+ if width <= 0 or height <= 0 then
+ report_inclusion("image %a has bad dimensions (%p,%p), discarding",
+ figure.filename,width,height)
+ return false, "bad dimensions"
+ end
+ local xres = figure.xres
+ local yres = figure.yres
+ local changes = false
if height > width then
if height > maxdimen then
figure.height = maxdimen
figure.width = width * maxdimen/height
- report_inclusion("limiting natural dimensions of %a (%s)",figure.filename,"height")
+ changed = true
end
elseif width > maxdimen then
figure.width = maxdimen
figure.height = height * maxdimen/width
- report_inclusion("limiting natural dimensions of %a (%s)",figure.filename,"width")
+ changed = true
+ end
+ if changed then
+ report_inclusion("limiting natural dimensions of %a, old %p * %p, new %p * %p",
+ figure.filename,width,height,figure.width,figure.height)
+ end
+ if width >=maxdimen or height >= maxdimen then
+ report_inclusion("image %a is too large (%p,%p), discarding",
+ figure.filename,width,height)
+ return false, "dimensions too large"
end
return figure
end
@@ -160,6 +194,7 @@ end
figures = figures or { }
local figures = figures
+figures.images = images
figures.boxnumber = figures.boxnumber or 0
figures.defaultsearch = true
figures.defaultwidth = 0
@@ -228,10 +263,74 @@ local figures_magics = allocate {
{ format = "pdf", pattern = (1 - P("%PDF"))^0 * P("%PDF") },
}
+local figures_native = allocate {
+ pdf = true,
+ jpg = true,
+ jp2 = true,
+ png = true,
+}
+
figures.formats = figures_formats -- frozen
figures.magics = figures_magics -- frozen
figures.order = figures_order -- frozen
+-- name checker
+
+local okay = P("m_k_i_v_")
+
+local pattern = (R("az","AZ") * P(":"))^-1 * ( -- a-z : | A-Z :
+ (okay + R("az","09") + S("_/") - P("_")^2)^1 * (P(".") * R("az")^1)^0 * P(-1) + -- a-z | single _ | /
+ (okay + R("az","09") + S("-/") - P("-")^2)^1 * (P(".") * R("az")^1)^0 * P(-1) + -- a-z | single - | /
+ (okay + R("AZ","09") + S("_/") - P("_")^2)^1 * (P(".") * R("AZ")^1)^0 * P(-1) + -- A-Z | single _ | /
+ (okay + R("AZ","09") + S("-/") - P("-")^2)^1 * (P(".") * R("AZ")^1)^0 * P(-1) -- A-Z | single - | /
+) * Cc(false) + Cc(true)
+
+function figures.badname(name)
+ if not name then
+ -- bad anyway
+ elseif not hasscheme(name) then
+ return lpegmatch(pattern,name)
+ else
+ return lpegmatch(pattern,file.basename(name))
+ end
+end
+
+local trace_names = false
+
+trackers.register("graphics.lognames", function(v)
+ if v and not trace_names then
+ luatex.registerstopactions(function()
+ if figures.nofprocessed > 0 then
+ local report_newline = logs.newline
+ logs.pushtarget("logfile")
+ report_newline()
+ report_figures("start names")
+ for _, data in table.sortedhash(figures_found) do
+ report_newline()
+ report_figure("asked : %s",data.askedname)
+ if data.found then
+ report_figure("format : %s",data.format)
+ report_figure("found : %s",data.foundname)
+ report_figure("used : %s",data.fullname)
+ if data.badname then
+ report_figure("comment : %s","bad name")
+ elseif data.comment then
+ report_figure("comment : %s",data.comment)
+ end
+ else
+ report_figure("comment : %s","not found")
+ end
+ end
+ report_newline()
+ report_figures("stop names")
+ report_newline()
+ logs.poptarget()
+ end
+ end)
+ trace_names = true
+ end
+end)
+
-- We can set the order but only indirectly so that we can check for support.
function figures.setorder(list) -- can be table or string
@@ -330,6 +429,9 @@ end
function figures.registersuffix (suffix, target) register('list', target,suffix ) end
function figures.registerpattern(pattern,target) register('pattern',target,pattern) end
+implement { name = "registerfiguresuffix", actions = register, arguments = { "'list'", "string", "string" } }
+implement { name = "registerfigurepattern", actions = register, arguments = { "'pattern'", "string", "string" } }
+
local last_locationset = last_locationset or nil
local last_pathlist = last_pathlist or nil
@@ -367,6 +469,8 @@ function figures.setpaths(locationset,pathlist)
end
end
+implement { name = "setfigurepaths", actions = figures.setpaths, arguments = { "string", "string" } }
+
-- check conversions and handle it here
function figures.hash(data)
@@ -452,14 +556,15 @@ end
function figures.push(request)
statistics.starttiming(figures)
- local figuredata = figures.initialize(request)
+ local figuredata = figures.initialize(request) -- we could use table.sparse but we set them later anyway
insert(callstack,figuredata)
lastfiguredata = figuredata
return figuredata
end
function figures.pop()
- lastfiguredata = remove(callstack) or lastfiguredata
+ remove(callstack)
+ lastfiguredata = callstack[#callstack] or lastfiguredata
statistics.stoptiming(figures)
end
@@ -479,17 +584,13 @@ end
figures.get = get
-function commands.figurevariable(category,tag,default)
- context(get(category,tag,default))
-end
+implement { name = "figurestatus", actions = { get, context }, arguments = { "'status'", "string", "string" } }
+implement { name = "figurerequest", actions = { get, context }, arguments = { "'request'", "string", "string" } }
+implement { name = "figureused", actions = { get, context }, arguments = { "'used'", "string", "string" } }
-function commands.figurestatus (tag,default) context(get("status", tag,default)) end
-function commands.figurerequest(tag,default) context(get("request",tag,default)) end
-function commands.figureused (tag,default) context(get("used", tag,default)) end
-
-function commands.figurefilepath() context(file.dirname (get("used","fullname"))) end
-function commands.figurefilename() context(file.nameonly(get("used","fullname"))) end
-function commands.figurefiletype() context(file.extname (get("used","fullname"))) end
+implement { name = "figurefilepath", actions = { get, file.dirname, context }, arguments = { "'used'", "'fullname'" } }
+implement { name = "figurefilename", actions = { get, file.nameonly, context }, arguments = { "'used'", "'fullname'" } }
+implement { name = "figurefiletype", actions = { get, file.extname, context }, arguments = { "'used'", "'fullname'" } }
-- todo: local path or cache path
@@ -510,12 +611,31 @@ local function forbiddenname(filename)
end
end
+local function rejected(specification)
+ if extra_check then
+ local fullname = specification.fullname
+ if fullname and figures_native[file.suffix(fullname)] and not figures.guess(fullname) then
+ specification.comment = "probably a bad file"
+ specification.found = false
+ specification.error = true
+ report_inclusion("file %a looks bad",fullname)
+ return true
+ end
+ end
+end
+
local function register(askedname,specification)
if not specification then
- specification = { }
+ specification = { askedname = askedname, comment = "invalid specification" }
elseif forbiddenname(specification.fullname) then
- specification = { }
- else
+ specification = { askedname = askedname, comment = "forbidden name" }
+ elseif specification.internal then
+ -- no filecheck needed
+ specification.found = true
+ if trace_figures then
+ report_inclusion("format %a internally supported by engine",specification.format)
+ end
+ elseif not rejected(specification) then
local format = specification.format
if format then
local conversion = specification.conversion
@@ -552,6 +672,9 @@ local function register(askedname,specification)
report_inclusion("no converter for %a to %a",format,newformat)
end
if converter then
+ --
+ -- todo: outline as helper function
+ --
local oldname = specification.fullname
local newpath = file.dirname(oldname)
local oldbase = file.basename(oldname)
@@ -567,20 +690,23 @@ local function register(askedname,specification)
--
local fc = specification.cache or figures.cachepaths.path
if fc and fc ~= "" and fc ~= "." then
- newpath = fc
+ newpath = gsub(fc,"%*",newpath) -- so cachedir can be "/data/cache/*"
else
newbase = defaultprefix .. newbase
end
- if not file.is_writable(newpath) then
- if trace_conversion then
- report_inclusion("path %a is not writable, forcing conversion path %a",newpath,".")
- end
- newpath = "."
- end
local subpath = specification.subpath or figures.cachepaths.subpath
if subpath and subpath ~= "" and subpath ~= "." then
newpath = newpath .. "/" .. subpath
end
+ if not lfs.isdir(newpath) then
+ dir.makedirs(newpath)
+ if not file.is_writable(newpath) then
+ if trace_conversion then
+ report_inclusion("path %a is not writable, forcing conversion path %a",newpath,".")
+ end
+ newpath = "."
+ end
+ end
local prefix = specification.prefix or figures.cachepaths.prefix
if prefix and prefix ~= "" then
newbase = prefix .. newbase
@@ -602,7 +728,6 @@ local function register(askedname,specification)
local newbase = newbase .. "." .. newformat
--
local newname = file.join(newpath,newbase)
- dir.makedirs(newpath)
oldname = collapsepath(oldname)
newname = collapsepath(newname)
local oldtime = lfs.attributes(oldname,'modification') or 0
@@ -626,7 +751,7 @@ local function register(askedname,specification)
format = newformat
if not figures_suffixes[format] then
-- maybe the new format is lowres.png (saves entry in suffixes)
- -- so let's do thsi extra check
+ -- so let's do this extra check
local suffix = file.suffix(newformat)
if figures_suffixes[suffix] then
if trace_figures then
@@ -636,29 +761,44 @@ local function register(askedname,specification)
end
end
elseif io.exists(oldname) then
- specification.fullname = oldname -- was newname
+ report_inclusion("file %a is bugged",oldname)
+ if format and validtypes[format] then
+ specification.fullname = oldname
+ end
specification.converted = false
+ specification.bugged = true
end
end
end
- local found = figures_suffixes[format] -- validtypes[format]
- if not found then
- specification.found = false
- if trace_figures then
- report_inclusion("format %a is not supported",format)
- end
- else
- specification.found = true
- if trace_figures then
- if validtypes[format] then -- format?
+ if format then
+ local found = figures_suffixes[format] -- validtypes[format]
+ if not found then
+ specification.found = false
+ if trace_figures then
+ report_inclusion("format %a is not supported",format)
+ end
+ elseif validtypes[format] then
+ specification.found = true
+ if trace_figures then
report_inclusion("format %a natively supported by backend",format)
- else
+ end
+ else
+ specification.found = true -- else no foo.1 mps conversion
+ if trace_figures then
report_inclusion("format %a supported by output file format",format)
end
end
+ else
+ specification.askedname = askedname
+ specification.found = false
end
end
- specification.foundname = specification.foundname or specification.fullname
+ if specification.found then
+ specification.foundname = specification.foundname or specification.fullname
+ else
+ specification.foundname = nil
+ end
+ specification.badname = figures.badname(askedname)
local askedhash = f_hash_part(askedname,specification.conversion or "default",specification.resolution or "default")
figures_found[askedhash] = specification
return specification
@@ -667,13 +807,16 @@ end
local resolve_too = false -- true
local internalschemes = {
- file = true,
+ file = true,
+ tree = true,
+ dirfile = true,
+ dirtree = true,
}
local function locate(request) -- name, format, cache
-- not resolvers.cleanpath(request.name) as it fails on a!b.pdf and b~c.pdf
-- todo: more restricted cleanpath
- local askedname = request.name
+ local askedname = request.name or ""
local askedhash = f_hash_part(askedname,request.conversion or "default",request.resolution or "default")
local foundname = figures_found[askedhash]
if foundname then
@@ -684,11 +827,18 @@ local function locate(request) -- name, format, cache
local askedconversion = request.conversion
local askedresolution = request.resolution
--
- if request.format == "" or request.format == "unknown" then
- request.format = nil
+ local askedformat = request.format
+ if not askedformat or askedformat == "" or askedformat == "unknown" then
+ askedformat = file.suffix(askedname) or ""
+ elseif askedformat == v_auto then
+ if trace_figures then
+ report_inclusion("ignoring suffix of %a",askedname)
+ end
+ askedformat = ""
+ askedname = file.removesuffix(askedname)
end
-- protocol check
- local hashed = url.hashed(askedname)
+ local hashed = urlhashed(askedname)
if not hashed then
-- go on
elseif internalschemes[hashed.scheme] then
@@ -697,6 +847,7 @@ local function locate(request) -- name, format, cache
askedname = path
end
else
+ -- local fname = methodhandler('finders',pathname .. "/" .. wantedfiles[k])
local foundname = resolvers.findbinfile(askedname)
if not foundname or not lfs.isfile(foundname) then -- foundname can be dummy
if trace_figures then
@@ -705,7 +856,6 @@ local function locate(request) -- name, format, cache
-- url not found
return register(askedname)
end
- local askedformat = request.format or file.suffix(askedname) or ""
local guessedformat = figures.guess(foundname)
if askedformat ~= guessedformat then
if trace_figures then
@@ -728,9 +878,8 @@ local function locate(request) -- name, format, cache
end
end
-- we could use the hashed data instead
- local askedpath= file.is_rootbased_path(askedname)
+ local askedpath = file.is_rootbased_path(askedname)
local askedbase = file.basename(askedname)
- local askedformat = request.format or file.suffix(askedname) or ""
if askedformat ~= "" then
askedformat = lower(askedformat)
if trace_figures then
@@ -750,7 +899,7 @@ local function locate(request) -- name, format, cache
end
end
if format then
- local foundname, quitscanning, forcedformat = figures.exists(askedname,format,resolve_too) -- not askedformat
+ local foundname, quitscanning, forcedformat, internal = figures.exists(askedname,format,resolve_too) -- not askedformat
if foundname then
return register(askedname, {
askedname = askedname,
@@ -760,6 +909,7 @@ local function locate(request) -- name, format, cache
-- foundname = foundname, -- no
conversion = askedconversion,
resolution = askedresolution,
+ internal = internal,
})
elseif quitscanning then
return register(askedname)
@@ -784,7 +934,7 @@ local function locate(request) -- name, format, cache
else
-- type given
for i=1,#figure_paths do
- local path = figure_paths[i]
+ local path = resolveprefix(figure_paths[i]) -- we resolve (e.g. jobfile:)
local check = path .. "/" .. askedname
-- we pass 'true' as it can be an url as well, as the type
-- is given we don't waste much time
@@ -792,7 +942,7 @@ local function locate(request) -- name, format, cache
if foundname then
return register(check, {
askedname = askedname,
- fullname = check,
+ fullname = foundname, -- check,
format = askedformat,
cache = askedcache,
conversion = askedconversion,
@@ -850,9 +1000,9 @@ local function locate(request) -- name, format, cache
-- local name = file.replacesuffix(askedbase,suffix)
local name = file.replacesuffix(askedname,suffix)
for i=1,#figure_paths do
- local path = figure_paths[i]
+ local path = resolveprefix(figure_paths[i]) -- we resolve (e.g. jobfile:)
local check = path .. "/" .. name
- local isfile = url.hashed(check).scheme == "file"
+ local isfile = internalschemes[urlhashed(check).scheme]
if not isfile then
if trace_figures then
report_inclusion("warning: skipping path %a",path)
@@ -878,7 +1028,7 @@ local function locate(request) -- name, format, cache
report_inclusion("unknown format, using path strategy")
end
for i=1,#figure_paths do
- local path = figure_paths[i]
+ local path = resolveprefix(figure_paths[i]) -- we resolve (e.g. jobfile:)
for j=1,#figures_order do
local format = figures_order[j]
local list = figures_formats[format].list or { format }
@@ -942,7 +1092,7 @@ function identifiers.default(data)
du.fullname = fullname -- can be cached
ds.fullname = foundname -- original
ds.format = l.format
- ds.status = (l.found and 10) or 0
+ ds.status = (l.bugged and 0) or (l.found and 10) or 0
end
return data
end
@@ -952,8 +1102,8 @@ function figures.identify(data)
local list = identifiers.list -- defined at the end
for i=1,#list do
local identifier = list[i]
- data = identifier(data)
- if data.status.status > 0 then
+ local data = identifier(data)
+ if data and (not data.status and data.status.status > 0) then
break
end
end
@@ -969,12 +1119,57 @@ function figures.check(data)
return (checkers[data.status.format] or checkers.generic)(data)
end
+local trace_usage = false
+local used_images = { }
+
+trackers.register("graphics.usage", function(v)
+ if v and not trace_usage then
+ luatex.registerstopactions(function()
+ local found = { }
+ for _, t in table.sortedhash(figures_found) do
+ found[#found+1] = t
+ for k, v in next, t do
+ if v == false or v == "" then
+ t[k] = nil
+ end
+ end
+ end
+ for i=1,#used_images do
+ local u = used_images[i]
+ local s = u.status
+ if s then
+ s.status = nil -- doesn't say much here
+ if s.error then
+ u.used = { } -- better show that it's not used
+ end
+ end
+ for _, t in next, u do
+ for k, v in next, t do
+ if v == false or v == "" then
+ t[k] = nil
+ end
+ end
+ end
+ end
+ table.save(file.nameonly(environment.jobname) .. "-figures-usage.lua",{
+ found = found,
+ used = used_images,
+ } )
+ end)
+ trace_usage = true
+ end
+end)
+
function figures.include(data)
data = data or callstack[#callstack] or lastfiguredata
+ if trace_usage then
+ used_images[#used_images+1] = data
+ end
return (includers[data.status.format] or includers.generic)(data)
end
function figures.scale(data) -- will become lua code
+ data = data or callstack[#callstack] or lastfiguredata
context.doscalefigure()
return data
end
@@ -1011,11 +1206,15 @@ end
function existers.generic(askedname,resolve)
-- not findbinfile
local result
- if lfs.isfile(askedname) then
+ if hasscheme(askedname) then
+ result = resolvers.findbinfile(askedname)
+ elseif lfs.isfile(askedname) then
result = askedname
elseif resolve then
- result = resolvers.findbinfile(askedname) or ""
- if result == "" then result = false end
+ result = resolvers.findbinfile(askedname)
+ end
+ if not result or result == "" then
+ result = false
end
if trace_figures then
if result then
@@ -1029,11 +1228,11 @@ end
function checkers.generic(data)
local dr, du, ds = data.request, data.used, data.status
- local name = du.fullname or "unknown generic"
- local page = du.page or dr.page
- local size = dr.size or "crop"
+ local name = du.fullname or "unknown generic"
+ local page = du.page or dr.page
+ local size = dr.size or "crop"
local color = dr.color or "natural"
- local mask = dr.mask or "none"
+ local mask = dr.mask or "none"
local conversion = dr.conversion
local resolution = dr.resolution
if not conversion or conversion == "" then
@@ -1053,9 +1252,18 @@ function checkers.generic(data)
}
codeinjections.setfigurecolorspace(data,figure)
codeinjections.setfiguremask(data,figure)
- figure = figure and images.check(images.scan(figure)) or false
+ if figure then
+ local f, comment = images.check(images.scan(figure))
+ if not f then
+ ds.comment = comment
+ ds.found = false
+ ds.error = true
+ end
+ figure = f
+ end
local f, d = codeinjections.setfigurealternative(data,figure)
- figure, data = f or figure, d or data
+ figure = f or figure
+ data = d or data
figures_loaded[hash] = figure
if trace_conversion then
report_inclusion("new graphic, using hash %a",hash)
@@ -1081,12 +1289,19 @@ function checkers.generic(data)
return data
end
+local nofimages = 0
+local pofimages = { }
+
+function figures.getrealpage(index)
+ return pofimages[index] or 0
+end
+
function includers.generic(data)
local dr, du, ds = data.request, data.used, data.status
-- here we set the 'natural dimensions'
- dr.width = du.width
- dr.height = du.height
- local hash = figures.hash(data)
+ dr.width = du.width
+ dr.height = du.height
+ local hash = figures.hash(data)
local figure = figures_used[hash]
-- figures.registerresource {
-- filename = du.fullname,
@@ -1102,9 +1317,17 @@ function includers.generic(data)
figures_used[hash] = figure
end
if figure then
- local nr = figures.boxnumber
- -- it looks like we have a leak in attributes here .. todo
- local box = hpack(images.node(figure)) -- images.node(figure) not longer valid
+ local nr = figures.boxnumber
+ nofimages = nofimages + 1
+ ds.pageindex = nofimages
+ local image = images.node(figure)
+ local pager = new_latelua(function()
+ pofimages[nofimages] = pofimages[nofimages] or tex.count.realpageno -- so when reused we register the first one only
+ end)
+ image.next = pager
+ pager.prev = image
+ local box = hpack(image) -- images.node(figure) not longer valid
+
indexed[figure.index] = figure
box.width, box.height, box.depth = figure.width, figure.height, 0 -- new, hm, tricky, we need to do that in tex (yet)
texsetbox(nr,box)
@@ -1178,6 +1401,8 @@ includers.mov = includers.nongeneric
internalschemes.mprun = true
+-- mprun.foo.1 mprun.6 mprun:foo.2
+
local function internal(askedname)
local spec, mprun, mpnum = match(lower(askedname),"mprun([:%.]?)(.-)%.(%d+)")
if spec ~= "" then
@@ -1190,7 +1415,7 @@ end
function existers.mps(askedname)
local mprun, mpnum = internal(askedname)
if mpnum then
- return askedname
+ return askedname, true, "mps", true
else
return existers.generic(askedname)
end
@@ -1211,7 +1436,7 @@ includers.mps = includers.nongeneric
function existers.tex(askedname)
askedname = resolvers.findfile(askedname)
- return askedname ~= "" and askedname or false
+ return askedname ~= "" and askedname or false, true, "tex", true
end
function checkers.tex(data)
@@ -1225,7 +1450,7 @@ includers.tex = includers.nongeneric
function existers.buffer(askedname)
local name = file.nameonly(askedname)
local okay = buffers.exists(name)
- return okay and name, true -- always quit scanning
+ return okay and name, true, "buffer", true -- always quit scanning
end
function checkers.buffer(data)
@@ -1252,7 +1477,10 @@ includers.auto = includers.generic
-- -- -- cld -- -- --
-existers.cld = existers.tex
+function existers.cld(askedname)
+ askedname = resolvers.findfile(askedname)
+ return askedname ~= "" and askedname or false, true, "cld", true
+end
function checkers.cld(data)
return checkers_nongeneric(data,function() context.docheckfigurecld(data.used.fullname) end)
@@ -1270,20 +1498,38 @@ end
-- programs.makeoptions = makeoptions
local function runprogram(binary,argument,variables)
- local binary = match(binary,"[%S]+") -- to be sure
+ -- move this check to the runner code
+ local found = nil
+ if type(binary) == "table" then
+ for i=1,#binary do
+ local b = binary[i]
+ found = os.which(b)
+ if found then
+ binary = b
+ break
+ end
+ end
+ if not found then
+ binary = concat(binary, " | ")
+ end
+ elseif binary then
+ found = os.which(match(binary,"[%S]+"))
+ end
if type(argument) == "table" then
argument = concat(argument," ") -- for old times sake
end
- if not os.which(binary) then
- report_inclusion("program %a is not installed, not running command: %s",binary,command)
+ if not found then
+ report_inclusion("program %a is not installed",binary or "?")
elseif not argument or argument == "" then
- report_inclusion("nothing to run, unknown program %a",binary)
+ report_inclusion("nothing to run, no arguments for program %a",binary)
else
- local command = format([["%s" %s]],binary,replacetemplate(longtostring(argument),variables))
+ -- no need to use the full found filename (found) .. we also don't quote the program
+ -- name any longer as in luatex there is too much messing with these names
+ local command = format([[%s %s]],binary,replacetemplate(longtostring(argument),variables))
if trace_conversion or trace_programs then
report_inclusion("running command: %s",command)
end
- os.spawn(command)
+ os.execute(command)
end
end
@@ -1298,13 +1544,15 @@ local epsconverter = converters.eps or { }
converters.eps = epsconverter
converters.ps = epsconverter
+-- todo: colorspace
+
local epstopdf = {
resolutions = {
[v_low] = "screen",
[v_medium] = "ebook",
[v_high] = "prepress",
},
- command = os.type == "windows" and "gswin32c" or "gs",
+ command = os.type == "windows" and { "gswin64c", "gswin32c" } or "gs",
-- -dProcessDSCComments=false
argument = [[
-q
@@ -1315,8 +1563,10 @@ local epstopdf = {
-dAutoRotatePages=/None
-dPDFSETTINGS=/%presets%
-dEPSCrop
- -sOutputFile=%newname%
- %oldname%
+ -dCompatibilityLevel=%level%
+ -sOutputFile="%newname%"
+ %colorspace%
+ "%oldname%"
-c quit
]],
}
@@ -1324,14 +1574,66 @@ local epstopdf = {
programs.epstopdf = epstopdf
programs.gs = epstopdf
-function epsconverter.pdf(oldname,newname,resolution) -- the resolution interface might change
+local cleanups = { }
+local cleaners = { }
+
+local whitespace = lpeg.patterns.whitespace
+local quadruple = Ct((whitespace^0 * lpeg.patterns.number/tonumber * whitespace^0)^4)
+local betterbox = P("%%BoundingBox:") * quadruple
+ * P("%%HiResBoundingBox:") * quadruple
+ * P("%AI3_Cropmarks:") * quadruple
+ * P("%%CropBox:") * quadruple
+ / function(b,h,m,c)
+ return formatters["%%%%BoundingBox: %i %i %i %i\n%%%%HiResBoundingBox: %F %F %F %F\n%%%%CropBox: %F %F %F %F\n"](
+ m[1],m[2],m[3],m[4],
+ m[1],m[2],m[3],m[4],
+ m[1],m[2],m[3],m[4]
+ )
+ end
+local nocrap = P("%") / "" * (
+ (P("AI9_PrivateDataBegin") * P(1)^0) / "%%%%EOF"
+ + (P("%EOF") * whitespace^0 * P("%AI9_PrintingDataEnd") * P(1)^0) / "%%%%EOF"
+ + (P("AI7_Thumbnail") * (1-P("%%EndData"))^0 * P("%%EndData")) / ""
+ )
+local whatever = nocrap + P(1)
+local pattern = Cs((betterbox * whatever^1 + whatever)^1)
+
+directives.register("graphics.conversion.eps.cleanup.ai",function(v) cleanups.ai = v end)
+
+cleaners.ai = function(name)
+ local tmpname = name .. ".tmp"
+ io.savedata(tmpname,lpegmatch(pattern,io.loaddata(name)))
+ return tmpname
+end
+
+function epsconverter.pdf(oldname,newname,resolution,colorspace) -- the resolution interface might change
local epstopdf = programs.epstopdf -- can be changed
- local presets = epstopdf.resolutions[resolution or ""] or epstopdf.resolutions.high
+ local presets = epstopdf.resolutions[resolution or "high"] or epstopdf.resolutions.high
+ local level = codeinjections.getformatoption("pdf_level") or "1.3"
+ local tmpname = oldname
+ if cleanups.ai then
+ tmpname = cleaners.ai(oldname)
+ end
+ if colorspace == "gray" then
+ colorspace = "-sColorConversionStrategy=Gray -sProcessColorModel=DeviceGray"
+ -- colorspace = "-sColorConversionStrategy=Gray"
+ else
+ colorspace = nil
+ end
runprogram(epstopdf.command, epstopdf.argument, {
- newname = newname,
- oldname = oldname,
- presets = presets,
+ newname = newname,
+ oldname = tmpname,
+ presets = presets,
+ level = tostring(level),
+ colorspace = colorspace,
} )
+ if tmpname ~= oldname then
+ os.remove(tmpname)
+ end
+end
+
+epsconverter["gray.pdf"] = function(oldname,newname,resolution) -- the resolution interface might change
+ epsconverter.pdf(oldname,newname,resolution,"gray")
end
epsconverter.default = epsconverter.pdf
@@ -1339,22 +1641,23 @@ epsconverter.default = epsconverter.pdf
local pdfconverter = converters.pdf or { }
converters.pdf = pdfconverter
-programs.pdftoeps = {
- command = "pdftops",
- argument = [[-eps "%oldname%" "%newname%]],
-}
-
-pdfconverter.stripped = function(oldname,newname)
- local pdftoeps = programs.pdftoeps -- can be changed
- local epstopdf = programs.epstopdf -- can be changed
- local presets = epstopdf.resolutions[resolution or ""] or epstopdf.resolutions.high
- local tmpname = newname .. ".tmp"
- runprogram(pdftoeps.command, pdftoeps.argument, { oldname = oldname, newname = tmpname, presets = presets })
- runprogram(epstopdf.command, epstopdf.argument, { oldname = tmpname, newname = newname, presets = presets })
- os.remove(tmpname)
-end
-
-figures.registersuffix("stripped","pdf")
+-- programs.pdftoeps = {
+-- command = "pdftops",
+-- argument = [[-eps "%oldname%" "%newname%"]],
+-- }
+--
+-- pdfconverter.stripped = function(oldname,newname)
+-- local pdftoeps = programs.pdftoeps -- can be changed
+-- local epstopdf = programs.epstopdf -- can be changed
+-- local presets = epstopdf.resolutions[resolution or ""] or epstopdf.resolutions.high
+-- local level = codeinjections.getformatoption("pdf_level") or "1.3"
+-- local tmpname = newname .. ".tmp"
+-- runprogram(pdftoeps.command, pdftoeps.argument, { oldname = oldname, newname = tmpname, presets = presets, level = level })
+-- runprogram(epstopdf.command, epstopdf.argument, { oldname = tmpname, newname = newname, presets = presets, level = level })
+-- os.remove(tmpname)
+-- end
+--
+-- figures.registersuffix("stripped","pdf")
-- -- -- svg -- -- --
@@ -1431,14 +1734,111 @@ bmpconverter.default = converter
-- todo: lowres
+-- cmyk conversion
+
+-- ecirgb_v2.icc
+-- ecirgb_v2_iccv4.icc
+-- isocoated_v2_300_eci.icc
+-- isocoated_v2_eci.icc
+-- srgb.icc
+-- srgb_v4_icc_preference.icc
+
+-- [[convert %?colorspace: -colorspace "%colorspace%" ?%]]
+
+local rgbprofile = "srgb_v4_icc_preference.icc" -- srgb.icc
+local cmykprofile = "isocoated_v2_300_eci.icc" -- isocoated_v2_eci.icc
+
+directives.register("graphics.conversion.rgbprofile", function(v) rgbprofile = type(v) == "string" and v or rgbprofile end)
+directives.register("graphics.conversion.cmykprofile",function(v) cmykprofile = type(v) == "string" and v or cmykprofile end)
+
+local function profiles()
+ if not lfs.isfile(rgbprofile) then
+ local found = resolvers.findfile(rgbprofile)
+ if found and found ~= "" then
+ rgbprofile = found
+ else
+ report_figures("unknown profile %a",rgbprofile)
+ end
+ end
+ if not lfs.isfile(cmykprofile) then
+ local found = resolvers.findfile(cmykprofile)
+ if found and found ~= "" then
+ cmykprofile = found
+ else
+ report_figures("unknown profile %a",cmykprofile)
+ end
+ end
+ return rgbprofile, cmykprofile
+end
+
+programs.pngtocmykpdf = {
+ command = "gm",
+ argument = [[convert -compress Zip -strip +profile "*" -profile "%rgbprofile%" -profile "%cmykprofile%" -sampling-factor 1x1 "%oldname%" "%newname%"]],
+}
+
+programs.jpgtocmykpdf = {
+ command = "gm",
+ argument = [[convert -compress JPEG -strip +profile "*" -profile "%rgbprofile%" -profile "%cmykprofile%" -sampling-factor 1x1 "%oldname%" "%newname%"]],
+}
+
+programs.pngtograypdf = {
+ command = "gm",
+ argument = [[convert -colorspace gray -compress Zip -sampling-factor 1x1 "%oldname%" "%newname%"]],
+}
+
+programs.jpgtograypdf = {
+ command = "gm",
+ argument = [[convert -colorspace gray -compress Zip -sampling-factor 1x1 "%oldname%" "%newname%"]],
+}
+
+figures.converters.png = {
+ ["cmyk.pdf"] = function(oldname,newname,resolution)
+ local rgbprofile, cmykprofile = profiles()
+ runprogram(programs.pngtocmykpdf.command, programs.pngtocmykpdf.argument, {
+ -- runprogram(programs.pngtocmykpdf, {
+ rgbprofile = rgbprofile,
+ cmykprofile = cmykprofile,
+ oldname = oldname,
+ newname = newname,
+ } )
+ end,
+ ["gray.pdf"] = function(oldname,newname,resolution)
+ runprogram(programs.pngtograypdf.command, programs.pngtograypdf.argument, {
+ -- runprogram(programs.pngtograypdf, {
+ oldname = oldname,
+ newname = newname,
+ } )
+ end,
+}
+
+figures.converters.jpg = {
+ ["cmyk.pdf"] = function(oldname,newname,resolution)
+ local rgbprofile, cmykprofile = profiles()
+ runprogram(programs.jpgtocmykpdf.command, programs.jpgtocmykpdf.argument, {
+ -- runprogram(programs.jpgtocmykpdf, {
+ rgbprofile = rgbprofile,
+ cmykprofile = cmykprofile,
+ oldname = oldname,
+ newname = newname,
+ } )
+ end,
+ ["gray.pdf"] = function(oldname,newname,resolution)
+ runprogram(programs.jpgtograypdf.command, programs.jpgtograypdf.argument, {
+ -- runprogram(programs.jpgtograypdf, {
+ oldname = oldname,
+ newname = newname,
+ } )
+ end,
+}
+
-- -- -- bases -- -- --
local bases = allocate()
figures.bases = bases
-local bases_list = nil -- index => { basename, fullname, xmlroot }
-local bases_used = nil -- [basename] => { basename, fullname, xmlroot } -- pointer to list
-local bases_found = nil
+local bases_list = nil -- index => { basename, fullname, xmlroot }
+local bases_used = nil -- [basename] => { basename, fullname, xmlroot } -- pointer to list
+local bases_found = nil
local bases_enabled = false
local function reset()
@@ -1473,6 +1873,8 @@ function bases.use(basename)
end
end
+implement { name = "usefigurebase", actions = bases.use, arguments = "string" }
+
local function bases_find(basename,askedlabel)
if trace_bases then
report_inclusion("checking for %a in base %a",askedlabel,basename)
@@ -1485,7 +1887,7 @@ local function bases_find(basename,askedlabel)
if base[2] == nil then
-- no yet located
for i=1,#figure_paths do
- local path = figure_paths[i]
+ local path = resolveprefix(figure_paths[i]) -- we resolve (e.g. jobfile:)
local xmlfile = path .. "/" .. basename
if io.exists(xmlfile) then
base[2] = xmlfile
@@ -1503,10 +1905,10 @@ local function bases_find(basename,askedlabel)
page = page + 1
if xml.text(e) == askedlabel then
t = {
- base = file.replacesuffix(base[2],"pdf"),
+ base = file.replacesuffix(base[2],"pdf"),
format = "pdf",
- name = xml.text(e,"../*:file"), -- to be checked
- page = page,
+ name = xml.text(e,"../*:file"), -- to be checked
+ page = page,
}
bases_found[askedlabel] = t
if trace_bases then
@@ -1541,13 +1943,13 @@ function identifiers.base(data)
local dr, du, ds = data.request, data.used, data.status
local fbl = bases_locate(dr.name or dr.label)
if fbl then
- du.page = fbl.page
- du.format = fbl.format
+ du.page = fbl.page
+ du.format = fbl.format
du.fullname = fbl.base
ds.fullname = fbl.name
- ds.format = fbl.format
- ds.page = fbl.page
- ds.status = 10
+ ds.format = fbl.format
+ ds.page = fbl.page
+ ds.status = 10
end
end
return data
@@ -1566,7 +1968,15 @@ identifiers.list = {
statistics.register("graphics processing time", function()
local nofprocessed = figures.nofprocessed
if nofprocessed > 0 then
- return format("%s seconds including tex, %s processed images", statistics.elapsedtime(figures),nofprocessed)
+ local nofnames, nofbadnames = 0, 0
+ for hash, data in next, figures_found do
+ nofnames = nofnames + 1
+ if data.badname then
+ nofbadnames = nofbadnames + 1
+ end
+ end
+ return format("%s seconds including tex, %s processed images, %s unique asked, %s bad names",
+ statistics.elapsedtime(figures),nofprocessed,nofnames,nofbadnames)
else
return nil
end
@@ -1618,8 +2028,59 @@ end
-- interfacing
-commands.setfigurelookuporder = figures.setorder
+implement {
+ name = "figure_push",
+ scope = "private",
+ actions = figures.push,
+ arguments = {
+ {
+ { "name" },
+ { "label" },
+ { "page" },
+ { "size" },
+ { "object" },
+ { "prefix" },
+ { "cache" },
+ { "format" },
+ { "preset" },
+ { "controls" },
+ { "resources" },
+ { "preview" },
+ { "display" },
+ { "mask" },
+ { "conversion" },
+ { "resolution" },
+ { "color" },
+ { "repeat" },
+ { "width", "dimen" },
+ { "height", "dimen" },
+ }
+ }
+}
---
+-- beware, we get a number passed by default
+
+implement { name = "figure_pop", scope = "private", actions = figures.pop }
+implement { name = "figure_done", scope = "private", actions = figures.done }
+implement { name = "figure_dummy", scope = "private", actions = figures.dummy }
+implement { name = "figure_identify", scope = "private", actions = figures.identify }
+implement { name = "figure_scale", scope = "private", actions = figures.scale }
+implement { name = "figure_check", scope = "private", actions = figures.check }
+implement { name = "figure_include", scope = "private", actions = figures.include }
-figures.images = images
+implement {
+ name = "setfigurelookuporder",
+ actions = figures.setorder,
+ arguments = "string"
+}
+
+implement {
+ name = "figure_reset",
+ scope = "private",
+ arguments = { "integer", "dimen", "dimen" },
+ actions = function(box,width,height)
+ figures.boxnumber = box
+ figures.defaultwidth = width
+ figures.defaultheight = height
+ end
+}
diff --git a/Master/texmf-dist/tex/context/base/grph-inc.mkiv b/Master/texmf-dist/tex/context/base/grph-inc.mkiv
index e8b63cc4bb9..6b7f2bd6359 100644
--- a/Master/texmf-dist/tex/context/base/grph-inc.mkiv
+++ b/Master/texmf-dist/tex/context/base/grph-inc.mkiv
@@ -11,6 +11,11 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+% \enabledirectives[graphics.conversion.eps.cleanup.ai]
+
+% \setupexternalfigures[directory=dirfile://./test/**]
+% \externalfigure[crappname(2).eps][frame=on]
+
% todo: messages
\writestatus{loading}{ConTeXt Graphic Macros / Figure Inclusion}
@@ -147,6 +152,11 @@
%D the already set parameters need to be set again or otherwise
%D the old values will be used.
+%D New: \type {method=auto}: strips suffix and uses \quote {order} which is handy in
+%D some of four workflows where sources are used for web and print and where
+%D the web tools need a suffix (like gif) which we don't want as we want a high
+%D quality format.
+
\newconditional\c_grph_include_trace_inheritance
\installtextracker
@@ -174,14 +184,14 @@
\def\grph_include_use[#1][#2][#3][#4]%
{\doifelsenothing{#1}
{\doifsomething{#2}
- {\doifassignmentelse{#3}
+ {\doifelseassignment{#3}
{\grph_include_use_indeed{#2}{#2}{#3}{#4}}
{\grph_include_use_indeed{#2}{#2}\empty{#4}}}}
{\doifelsenothing{#2}
- {\doifassignmentelse{#3}
+ {\doifelseassignment{#3}
{\grph_include_use_indeed{#1}{#1}\empty{#3}}
{\grph_include_use_indeed{#1}{#1}{#3}{#4}}}
- {\doifassignmentelse{#3}
+ {\doifelseassignment{#3}
{\grph_include_use_indeed{#1}{#2}\empty{#3}}
{\grph_include_use_indeed{#1}{#2}{#3}{#4}}}}}
@@ -300,56 +310,56 @@
\edef\p_label {\externalfigureparameter\c!label}%
%
\dostarttagged\t!image\empty
- \ctxlua{figures.push {
- name = "\p_grph_include_name",
- label = "\ifx\p_label\empty\p_grph_include_label\else\p_label\fi",
- page = "\externalfigureparameter\c!page",
- size = "\externalfigureparameter\c!size",
- object = "\externalfigureparameter\c!object",
- prefix = "\externalfigureparameter\c!prefix",
- cache = "\externalfigureparameter\c!cache",
- format = "\externalfigureparameter\c!method",
- preset = "\externalfigureparameter\c!prefix",
- controls = "\externalfigureparameter\c!controls",
- resources = "\externalfigureparameter\c!resources",
- preview = "\externalfigureparameter\c!preview",
- display = "\externalfigureparameter\c!display",
- mask = "\externalfigureparameter\c!mask",
- conversion = "\externalfigureparameter\c!conversion",
- resolution = "\externalfigureparameter\c!resolution",
- color = "\internalspotcolorparent{\externalfigureparameter\c!color}", % hack is needed
- ["repeat"] = "\externalfigureparameter\c!repeat",
- \ifx\p_width\empty \else
- width = \number\dimexpr\p_width,
- \fi
- \ifx\p_height\empty \else
- height = \number\dimexpr\p_height,
- \fi
- } }%
- \ctxlua{figures.identify()}%
- % also mode: checkpresense only
+ \clf_figure_push
+ name {\p_grph_include_name}%
+ label {\ifx\p_label\empty\p_grph_include_label\else\p_label\fi}%
+ page {\externalfigureparameter\c!page}%
+ size {\externalfigureparameter\c!size}%
+ object {\externalfigureparameter\c!object}%
+ prefix {\externalfigureparameter\c!prefix}%
+ cache {\externalfigureparameter\c!cache}%
+ format {\externalfigureparameter\c!method}%
+ preset {\externalfigureparameter\c!prefix}%
+ controls {\externalfigureparameter\c!controls}%
+ resources {\externalfigureparameter\c!resources}%
+ preview {\externalfigureparameter\c!preview}%
+ display {\externalfigureparameter\c!display}%
+ mask {\externalfigureparameter\c!mask}%
+ conversion {\externalfigureparameter\c!conversion}%
+ resolution {\externalfigureparameter\c!resolution}%
+ color {\internalspotcolorparent{\externalfigureparameter\c!color}}% hack is needed
+ repeat {\externalfigureparameter\c!repeat}%
+ \ifx\p_width\empty \else
+ width \dimexpr\p_width\relax
+ \fi
+ \ifx\p_height\empty \else
+ height \dimexpr\p_height\relax
+ \fi
+ \relax
+ \clf_figure_identify
+ \relax
\ifconditional\c_grph_include_test_only
\ifcase\figurestatus \else
- \ctxlua{figures.check()}%
- \ctxlua{figures.dummy()}%
- \ctxlua{figures.scale()}%
- \ctxlua{figures.done()}%
+ \clf_figure_check
+ \clf_figure_dummy
+ \clf_figure_scale
+ \clf_figure_done
\fi
\grph_include_set_mode
\else
\ifcase\figurestatus
- \ctxlua{figures.dummy()}%
- \ctxlua{figures.scale()}%
+ \clf_figure_dummy
+ \clf_figure_scale
\else
- \ctxlua{figures.check()}%
- \ctxlua{figures.include()}%
- \ctxlua{figures.scale()}%
+ \clf_figure_check
+ \clf_figure_include
+ \clf_figure_scale
\fi
- \ctxlua{figures.done()}%
+ \clf_figure_done
\grph_include_set_mode
\grph_include_finalize
\fi
- \ctxlua{figures.pop()}%
+ \clf_figure_pop
\dotagfigure
\naturalvbox attr \imageattribute 2 {\box\foundexternalfigure}%
\dostoptagged
@@ -416,13 +426,13 @@
{\dodoubleargument\grph_include_set_type_synonym}
\def\grph_include_set_type_synonym[#1][#2]%
- {\ctxlua{figures.registersuffix("#1","#2")}}
+ {\clf_registerfiguresuffix{#1}{#2}}
%D Additional paths can be installed with the regular setup command. The next
%D macro picks up the list.
\unexpanded\def\setfigurepathlist
- {\ctxlua{figures.setpaths("\externalfigureparameter\c!location",\!!bs\externalfigureparameter\c!directory\!!es)}}
+ {\clf_setfigurepaths{\externalfigureparameter\c!location}{\externalfigureparameter\c!directory}}
%D Variables:
@@ -432,36 +442,36 @@
\def\defaultfigurewidth {8\lineheight}
\def\defaultfigureheight {6\lineheight}
-\def\figurestatus {\numexpr\ctxcommand{figurestatus("status",0)}\relax} % number: 0 = not found
-\def\figurewidth {\ctxcommand{figurestatus("width",0)}sp}
-\def\figureheight {\ctxcommand{figurestatus("height",0)}sp}
-\def\figurexscale {\ctxcommand{figurestatus("xscale",1)}}
-\def\figureyscale {\ctxcommand{figurestatus("yscale",1)}}
-
-\def\figuresize {\ctxcommand{figurerequest("size")}}
-\def\figurelabel {\ctxcommand{figurerequest("label")}}
-\def\figurefileoriginal {\ctxcommand{figurerequest("name")}}
-\def\figurefilepage {\ctxcommand{figurerequest("page",1)}}
-\def\figurefileoptions {\ctxcommand{figurerequest("options")}}
-\def\figurefileconversion{\ctxcommand{figurerequest("conversion")}}
-\def\figurefilecache {\ctxcommand{figurerequest("cache")}}
-\def\figurefileprefix {\ctxcommand{figurerequest("prefix")}}
-
-\def\figurenaturalwidth {\ctxcommand{figureused("width", \number\dimexpr\defaultfigurewidth \relax)}sp}
-\def\figurenaturalheight {\ctxcommand{figureused("height",\number\dimexpr\defaultfigureheight\relax)}sp}
-\def\figurexresolution {\ctxcommand{figureused("xresolution",0)}}
-\def\figureyresolution {\ctxcommand{figureused("yresolution",0)}}
-\def\figurexsize {\ctxcommand{figureused("xsize",0)}}
-\def\figureysize {\ctxcommand{figureused("ysize",0)}}
-\def\figurecolordepth {\ctxcommand{figureused("colordepth",0)}}
-\def\figuredepth {\ctxcommand{figureused("depth",0)}}
-
-\def\figurefullname {\ctxcommand{figureused("fullname")}}
-\def\noffigurepages {\ctxcommand{figureused("pages",0)}}
-
-\def\figurefilepath {\ctxcommand{figurefilepath()}}
-\def\figurefilename {\ctxcommand{figurefilename()}}
-\def\figurefiletype {\ctxcommand{figurefiletype()}}
+\def\figurestatus {\numexpr\clf_figurestatus{status}{0}\relax} % number: 0 = not found
+\def\figurewidth {\clf_figurestatus{width}{0}sp}
+\def\figureheight {\clf_figurestatus{height}{0}sp}
+\def\figurexscale {\clf_figurestatus{xscale}{1}}
+\def\figureyscale {\clf_figurestatus{yscale}{1}}
+
+\def\figuresize {\clf_figurerequest{size}{}}
+\def\figurelabel {\clf_figurerequest{label}{}}
+\def\figurefileoriginal {\clf_figurerequest{name}{}}
+\def\figurefilepage {\clf_figurerequest{page}{1}}
+\def\figurefileoptions {\clf_figurerequest{options}{}}
+\def\figurefileconversion{\clf_figurerequest{conversion}{}}
+\def\figurefilecache {\clf_figurerequest{cache}{}}
+\def\figurefileprefix {\clf_figurerequest{prefix}{}}
+
+\def\figurenaturalwidth {\clf_figureused{width}{\number\dimexpr\defaultfigurewidth\relax}sp}
+\def\figurenaturalheight {\clf_figureused{height}{\number\dimexpr\defaultfigureheight\relax}sp}
+\def\figurexresolution {\clf_figureused{xresolution}{0}}
+\def\figureyresolution {\clf_figureused{yresolution}{0}}
+\def\figurexsize {\clf_figureused{xsize}{0}}
+\def\figureysize {\clf_figureused{ysize}{0}}
+\def\figurecolordepth {\clf_figureused{colordepth}{0}}
+\def\figuredepth {\clf_figureused{depth}{0}}
+
+\def\figurefullname {\clf_figureused{fullname}{}}
+\def\noffigurepages {\clf_figureused{pages}{0}}
+
+\def\figurefilepath {\clf_figurefilepath}
+\def\figurefilename {\clf_figurefilename}
+\def\figurefiletype {\clf_figurefiletype}
\let\naturalfigurewidth \figurenaturalwidth
\let\naturalfigureheight \figurenaturalheight
@@ -500,12 +510,14 @@
\fi}
\appendtoks
- \ctxlua { % figures.defaultwidth .. maybe a dimen some day
- figures.setpaths("\externalfigureparameter\c!location","\externalfigureparameter\c!directory") ;
- figures.defaultwidth = \number\dimexpr\defaultfigurewidth \relax ;
- figures.defaultheight = \number\dimexpr\defaultfigureheight\relax ;
- figures.boxnumber = \number\foundexternalfigure ;
- }%
+ \clf_setfigurepaths
+ {\externalfigureparameter\c!location}%
+ {\externalfigureparameter\c!directory}%
+ \clf_figure_reset
+ \foundexternalfigure
+ \defaultfigurewidth
+ \defaultfigureheight
+ \relax
\to \everyexternalfigureresets
\appendtoks
@@ -629,7 +641,7 @@
\externalfigure[#1][#2,\c!display=,\c!mask=,\c!object=\v!no]%
\stopnointerference}
-\unexpanded\def\doiffigureelse#1%
+\unexpanded\def\doifelsefigure#1%
{\getfiguredimensions[#1]% so data is available !
\ifcase\figurestatus
\expandafter\secondoftwoarguments
@@ -637,6 +649,8 @@
\expandafter\firstoftwoarguments
\fi}
+\let\doiffigureelse\doifelsefigure
+
% No placement, handy for preprocessing:
\unexpanded\def\registerexternalfigure
@@ -661,14 +675,14 @@
% Figure bases
\unexpanded\def\usefigurebase[#1]%
- {\ctxlua{figures.bases.use("#1")}}
+ {\clf_usefigurebase{#1}}
\appendtoks
\setfigurepathlist % the path may be used elsewhere too (as in x-res-04)
\to \everysetupexternalfigure
\appendtoks
- \ctxcommand{setfigurelookuporder("\externalfigureparameter\c!order")}%
+ \clf_setfigurelookuporder{\externalfigureparameter\c!order}%
\to \everysetupexternalfigure
\definecolor[missingfigurecolor][s=.8]
@@ -762,7 +776,7 @@
{\writestatus\m!system{the \string\showexternalfigures\space command is not (yet) implemented in mkiv}}
\unexpanded\def\overlayfigure#1%
- {\externalfigure[#1][\c!width=\overlaywidth,\c!height=\overlayheight]}
+ {\externalfigure[#1][\c!width=\d_overlay_width,\c!height=\d_overlay_height]}
% Bonus:
diff --git a/Master/texmf-dist/tex/context/base/grph-raw.lua b/Master/texmf-dist/tex/context/base/grph-raw.lua
index 4c5b031ea98..62e96fcc9d7 100644
--- a/Master/texmf-dist/tex/context/base/grph-raw.lua
+++ b/Master/texmf-dist/tex/context/base/grph-raw.lua
@@ -40,3 +40,18 @@ function figures.bitmapimage(t)
report_bitmap("invalid specification")
end
end
+
+interfaces.implement {
+ name = "bitmapimage",
+ actions = figures.bitmapimage,
+ arguments = {
+ {
+ { "data" },
+ { "colorspace" },
+ { "width" },
+ { "height" },
+ { "xresolution" },
+ { "yresolution" },
+ }
+ }
+}
diff --git a/Master/texmf-dist/tex/context/base/grph-raw.mkiv b/Master/texmf-dist/tex/context/base/grph-raw.mkiv
index 1c683556412..8978ba2671b 100644
--- a/Master/texmf-dist/tex/context/base/grph-raw.mkiv
+++ b/Master/texmf-dist/tex/context/base/grph-raw.mkiv
@@ -46,14 +46,14 @@
\unexpanded\def\bitmapimage[#1]#2%
{\hbox\bgroup
\getdummyparameters[\c!color=rgb,\c!width=,\c!height=,\c!x=,\c!y=,#1]%
- \ctxlua{figures.bitmapimage { % we could pass #1 directly ... todo
- data = \!!bs#2\!!es,
- colorspace = "\directdummyparameter\c!color",
- width = "\directdummyparameter\c!width",
- height = "\directdummyparameter\c!height",
- xresolution = "\directdummyparameter\c!x",
- yresolution = "\directdummyparameter\c!y",
- }}%
+ \clf_bitmapimage
+ data {#2}%
+ colorspace {\directdummyparameter\c!color}%
+ width {\directdummyparameter\c!width}%
+ height {\directdummyparameter\c!height}%
+ xresolution {\directdummyparameter\c!x}%
+ yresolution {\directdummyparameter\c!y}%
+ \relax
\egroup}
\unexpanded\def\startbitmapimage[#1]#2\stopbitmapimage
diff --git a/Master/texmf-dist/tex/context/base/grph-trf.mkiv b/Master/texmf-dist/tex/context/base/grph-trf.mkiv
index d907c1b0ca3..fca5c7cf6ef 100644
--- a/Master/texmf-dist/tex/context/base/grph-trf.mkiv
+++ b/Master/texmf-dist/tex/context/base/grph-trf.mkiv
@@ -108,7 +108,7 @@
\edef\currentscale{#1}%
\setupcurrentscale[#2]%
\else\iffirstargument
- \doifassignmentelse{#1}
+ \doifelseassignment{#1}
{\let\currentscale\empty
\setupcurrentscale[#1]}
{\edef\currentscale{#1}}%
@@ -318,11 +318,11 @@
\def\m_grph_scale_factor_set{\v!max,\v!fit,\v!broad,\v!auto} % can be an \edef
\def\grph_scale_by_factor
- {\doifinsetelse\p_factor\m_grph_scale_factor_set
+ {\doifelseinset\p_factor\m_grph_scale_factor_set
\grph_scale_by_factor_a
- {\doifinsetelse\p_hfactor\m_grph_scale_factor_set
+ {\doifelseinset\p_hfactor\m_grph_scale_factor_set
\grph_scale_by_factor_b
- {\doifinsetelse\p_wfactor\m_grph_scale_factor_set
+ {\doifelseinset\p_wfactor\m_grph_scale_factor_set
\grph_scale_by_factor_c
\grph_scale_by_factor_d}}}
@@ -1080,18 +1080,18 @@
{\boxcursor\box\nextbox}
\setvalue{\??rotatepreset\v!left}%
- {\edef\p_rotation_rotation{\doifoddpageelse{90}{270}}}
+ {\edef\p_rotation_rotation{\doifelseoddpage{90}{270}}}
\setvalue{\??rotatepreset\v!right}%
- {\edef\p_rotation_rotation{\doifoddpageelse{270}{90}}}
+ {\edef\p_rotation_rotation{\doifelseoddpage{270}{90}}}
\setvalue{\??rotatepreset\v!inner}%
{\signalrightpage
- \doifrightpageelse{\def\p_rotation_rotation{270}}{\def\p_rotation_rotation{90}}}
+ \doifelserightpage{\def\p_rotation_rotation{270}}{\def\p_rotation_rotation{90}}}
\setvalue{\??rotatepreset\v!outer}%
{\signalrightpage
- \doifrightpageelse{\def\p_rotation_rotation{90}}{\def\p_rotation_rotation{270}}}
+ \doifelserightpage{\def\p_rotation_rotation{90}}{\def\p_rotation_rotation{270}}}
\setvalue{\??rotatepreset\v!default}%
{\edef\p_rotation_rotation{\realnumber{\p_rotation_rotation}}}% get rid of leading zeros and spaces
diff --git a/Master/texmf-dist/tex/context/base/hand-ini.mkiv b/Master/texmf-dist/tex/context/base/hand-ini.mkiv
index 450794d276f..fd18e3221d0 100644
--- a/Master/texmf-dist/tex/context/base/hand-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/hand-ini.mkiv
@@ -42,8 +42,8 @@
\unexpanded\def\setupfontexpansion {\dodoubleargument\font_expansion_setup }
\unexpanded\def\setupfontprotrusion{\dodoubleargument\font_protrusion_setup}
-\def\font_expansion_setup [#1][#2]{\ctxcommand{setupfontexpansion ("#1","#2")}}
-\def\font_protrusion_setup[#1][#2]{\ctxcommand{setupfontprotrusion("#1","#2")}}
+\def\font_expansion_setup [#1][#2]{\clf_setupfontexpansion {#1}{#2}}
+\def\font_protrusion_setup[#1][#2]{\clf_setupfontprotrusion{#1}{#2}}
% \setupfontprotrusion[quality-upright][vector=quality]
% \setupfontprotrusion[quality-slanted][vector=quality,right=1.5]
@@ -51,10 +51,10 @@
\let\pdfadjustspacing\relax \newcount\pdfadjustspacing % a little bit protection
\let\pdfprotrudechars\relax \newcount\pdfprotrudechars % a little bit protection
-\def\font_expansion_enable {\normalpdfadjustspacing\plustwo }
-\def\font_expansion_disable {\normalpdfadjustspacing\zerocount}
-\def\font_protruding_enable {\normalpdfprotrudechars\plustwo }
-\def\font_protruding_disable{\normalpdfprotrudechars\zerocount}
+\def\font_expansion_enable {\normalpdfadjustspacing\plustwo } % these will become normal primitives
+\def\font_expansion_disable {\normalpdfadjustspacing\zerocount} % these will become normal primitives
+\def\font_protruding_enable {\normalpdfprotrudechars\plustwo } % these will become normal primitives
+\def\font_protruding_disable{\normalpdfprotrudechars\zerocount} % these will become normal primitives
\appendtoks \font_expansion_disable \to \everyforgetall % Here or not here?
\appendtoks \font_protruding_disable \to \everyforgetall % Here or not here?
diff --git a/Master/texmf-dist/tex/context/base/java-imp-fld.mkiv b/Master/texmf-dist/tex/context/base/java-imp-fld.mkiv
index aaec257f259..cbd53fffb4a 100644
--- a/Master/texmf-dist/tex/context/base/java-imp-fld.mkiv
+++ b/Master/texmf-dist/tex/context/base/java-imp-fld.mkiv
@@ -30,29 +30,34 @@
%D On into Yes. Also, we've changed the test for the on value
%D into !Off as we dón't know what value it gets in the reader.
+% Is this still okay? We can have unicode now, can't we? Anyway it's kind of
+% messy and unneeded in these unicode times.
+
\startluasetups javascript:pdfencoding
- local verbatim = context.verbatim
- verbatim("{\n")
- for accent, group in table.sortedhash(characters.tex.accentmapping) do
- for character, mapping in table.sortedhash(group) do
+ local ctx_verbatim = context.verbatim
+ local utfbyte = utf.byte
+ local sortedhash = table.sortedhash
+
+ ctx_verbatim("{\n")
+ for accent, group in sortedhash(characters.tex.accentmapping) do
+ for character, mapping in sortedhash(group) do
if character == "" then
character = " "
end
if accent == '"' then
- verbatim(" '\\\\%s%s' : '\\u%04X',\n",accent,character,utf.byte(mapping))
+ ctx_verbatim(" '\\\\%s%s' : '\\u%04X',\n",accent,character,utfbyte(mapping))
else
- verbatim(' "\\\\%s%s" : "\\u%04X",\n',accent,character,utf.byte(mapping))
+ ctx_verbatim(' "\\\\%s%s" : "\\u%04X",\n',accent,character,utfbyte(mapping))
end
end
end
- verbatim(" '\\\\OE' : '\\u0152',\n")
- verbatim(" '\\\\oe' : '\\u0153',\n")
- verbatim(" '\\\\AE' : '\\u00C6',\n")
- verbatim(" '\\\\ae' : '\\u00E6',\n")
- verbatim(" '\\\\<<' : '\\u00AB',\n")
- verbatim(" '\\\\>>' : '\\u00BB',\n")
- verbatim(" '\\\\ss' : '\\u00DF' \n")
- verbatim("}\n")
+ for command, mapping in sortedhash(characters.tex.commandmapping) do
+ ctx_verbatim(' "\\\\%s" : "\\u%04X",\n',command,utfbyte(mapping))
+ end
+ -- ctx_verbatim(" '\\\\<<' : '\\u00AB',\n")
+ -- ctx_verbatim(" '\\\\>>' : '\\u00BB',\n")
+ ctx_verbatim("}\n")
+
\stopluasetups
% maybe make { } tex braces in javascript code so that we can call lua
diff --git a/Master/texmf-dist/tex/context/base/java-ini.lua b/Master/texmf-dist/tex/context/base/java-ini.lua
index 67337949465..069eb5ab610 100644
--- a/Master/texmf-dist/tex/context/base/java-ini.lua
+++ b/Master/texmf-dist/tex/context/base/java-ini.lua
@@ -19,7 +19,7 @@ local variables = interfaces.variables
local formatters = string.formatters
local context = context
-local commands = commands
+local implement = interfaces.implement
local trace_javascript = false trackers.register("backends.javascript", function(v) trace_javascript = v end)
@@ -196,7 +196,13 @@ function javascripts.flushpreambles()
return t
end
-local patterns = { "java-imp-%s.mkiv", "java-imp-%s.tex", "java-%s.mkiv", "java-%s.tex" }
+local patterns = {
+ "java-imp-%s.mkiv",
+ "java-imp-%s.tex",
+ -- obsolete:
+ "java-%s.mkiv",
+ "java-%s.tex"
+}
local function action(name,foundname)
context.startnointerference()
@@ -213,7 +219,7 @@ end
function javascripts.usescripts(name)
if name ~= variables.reset then -- reset is obsolete
- commands.uselibrary {
+ resolvers.uselibrary {
name = name,
patterns = patterns,
action = action,
@@ -225,8 +231,38 @@ end
-- interface
-commands.storejavascriptcode = interactions.javascripts.storecode
-commands.storejavascriptpreamble = interactions.javascripts.storepreamble
-commands.addtojavascriptpreamble = interactions.javascripts.addtopreamble
-commands.usejavascriptpreamble = interactions.javascripts.usepreamblenow
-commands.usejavascriptscripts = interactions.javascripts.usescripts
+implement {
+ name = "storejavascriptcode",
+ actions = javascripts.storecode,
+ arguments = "string"
+}
+
+implement {
+ name = "storejavascriptpreamble",
+ actions = javascripts.storepreamble,
+ arguments = "string"
+}
+
+implement {
+ name = "setjavascriptpreamble",
+ actions = javascripts.setpreamble,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "addtojavascriptpreamble",
+ actions = javascripts.addtopreamble,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "usejavascriptpreamble",
+ actions = javascripts.usepreamblenow,
+ arguments = "string"
+}
+
+implement {
+ name = "usejavascriptscripts",
+ actions = javascripts.usescripts,
+ arguments = "string"
+}
diff --git a/Master/texmf-dist/tex/context/base/java-ini.mkiv b/Master/texmf-dist/tex/context/base/java-ini.mkiv
index e4f0bf28b4c..d6fe4dd8a05 100644
--- a/Master/texmf-dist/tex/context/base/java-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/java-ini.mkiv
@@ -105,15 +105,17 @@
%D This macro can be used to force inclusion of postponed
%D \JAVASCRIPT\ preambles.
+\def\m_java_escape_u{\letterbackslash u}
+
\unexpanded\def\startJScode
{\begingroup
\obeylualines
\obeyluatokens
- \def\u{\letterbackslash u}%
+ \let\u\m_java_escape_u
\java_start_code}
\def\java_start_code#1\stopJScode
- {\normalexpanded{\endgroup\ctxcommand{storejavascriptcode(\!!bs#1\!!es)}}}
+ {\normalexpanded{\endgroup\clf_storejavascriptcode{#1}}}
\let\stopJScode\relax
@@ -121,16 +123,16 @@
{\begingroup
\obeylualines
\obeyluatokens
- \def\u{\letterbackslash u}%
+ \let\u\m_java_escape_u
\java_start_preamble}
\def\java_start_preamble#1\stopJSpreamble
- {\normalexpanded{\endgroup\ctxcommand{storejavascriptpreamble(\!!bs#1\!!es)}}}
+ {\normalexpanded{\endgroup\clf_storejavascriptpreamble{#1}}}
\let\stopJSpreamble\relax
-\unexpanded\def\setJSpreamble #1#2{\ctxcommand{storejavascriptpreamble("#1",\!!bs#2\!!es)}}
-\unexpanded\def\addtoJSpreamble#1#2{\ctxcommand{addtojavascriptpreamble("#1",\!!bs#2\!!es)}}
+\unexpanded\def\setJSpreamble #1#2{\clf_setjavascriptpreamble {#1}{#2}}
+\unexpanded\def\addtoJSpreamble#1#2{\clf_addtojavascriptpreamble{#1}{#2}}
%D \macros
%D {useJSscripts}
@@ -147,11 +149,11 @@
%D
%D The not so complicated implementation of this macro is:
-\def\useJSscripts
+\unexpanded\def\useJSscripts
{\dodoubleempty\java_use_scripts}
\def\java_use_scripts[#1][#2]%
- {\ctxcommand{usejavascriptscripts(\!!bs#1\!!es)}% two steps as this one calls tex code
- \ctxcommand{usejavascriptpreamble("#2")}} % so this one comes later
+ {\clf_usejavascriptscripts {#1}% two steps as this one calls tex code
+ \clf_usejavascriptpreamble{#2}}% so this one comes later
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/l-boolean.lua b/Master/texmf-dist/tex/context/base/l-boolean.lua
index 8d11080e7fc..8f18d4c003d 100644
--- a/Master/texmf-dist/tex/context/base/l-boolean.lua
+++ b/Master/texmf-dist/tex/context/base/l-boolean.lua
@@ -57,11 +57,11 @@ function string.booleanstring(str)
end
end
-function string.is_boolean(str,default)
+function string.is_boolean(str,default,strict)
if type(str) == "string" then
- if str == "true" or str == "yes" or str == "on" or str == "t" or str == "1" then
+ if str == "true" or str == "yes" or str == "on" or str == "t" or (not strict and str == "1") then
return true
- elseif str == "false" or str == "no" or str == "off" or str == "f" or str == "0" then
+ elseif str == "false" or str == "no" or str == "off" or str == "f" or (not strict and str == "0") then
return false
end
end
diff --git a/Master/texmf-dist/tex/context/base/l-dir.lua b/Master/texmf-dist/tex/context/base/l-dir.lua
index 25721206046..81ac65e506d 100644
--- a/Master/texmf-dist/tex/context/base/l-dir.lua
+++ b/Master/texmf-dist/tex/context/base/l-dir.lua
@@ -6,10 +6,11 @@ if not modules then modules = { } end modules ['l-dir'] = {
license = "see context related readme files"
}
--- dir.expandname will be merged with cleanpath and collapsepath
+-- todo: dir.expandname will be sped up and merged with cleanpath and collapsepath
+-- todo: keep track of currentdir (chdir, pushdir, popdir)
local type, select = type, select
-local find, gmatch, match, gsub = string.find, string.gmatch, string.match, string.gsub
+local find, gmatch, match, gsub, sub = string.find, string.gmatch, string.match, string.gsub, string.sub
local concat, insert, remove, unpack = table.concat, table.insert, table.remove, table.unpack
local lpegmatch = lpeg.match
@@ -21,8 +22,8 @@ local lfs = lfs
local attributes = lfs.attributes
local walkdir = lfs.dir
-local isdir = lfs.isdir
-local isfile = lfs.isfile
+local isdir = lfs.isdir -- not robust, will be overloaded anyway
+local isfile = lfs.isfile -- not robust, will be overloaded anyway
local currentdir = lfs.currentdir
local chdir = lfs.chdir
local mkdir = lfs.mkdir
@@ -31,20 +32,41 @@ local onwindows = os.type == "windows" or find(os.getenv("PATH"),";",1,true)
-- in case we load outside luatex
-if not isdir then
- function isdir(name)
- local a = attributes(name)
- return a and a.mode == "directory"
+if onwindows then
+
+ -- lfs.isdir does not like trailing /
+ -- lfs.dir accepts trailing /
+
+ local tricky = S("/\\") * P(-1)
+
+ isdir = function(name)
+ if lpegmatch(tricky,name) then
+ return attributes(name,"mode") == "directory"
+ else
+ return attributes(name.."/.","mode") == "directory"
+ end
+ end
+
+ isfile = function(name)
+ return attributes(name,"mode") == "file"
+ end
+
+ lfs.isdir = isdir
+ lfs.isfile = isfile
+
+else
+
+ isdir = function(name)
+ return attributes(name,"mode") == "directory"
end
- lfs.isdir = isdir
-end
-if not isfile then
- function isfile(name)
- local a = attributes(name)
- return a and a.mode == "file"
+ isfile = function(name)
+ return attributes(name,"mode") == "file"
end
+
+ lfs.isdir = isdir
lfs.isfile = isfile
+
end
-- handy
@@ -53,63 +75,104 @@ function dir.current()
return (gsub(currentdir(),"\\","/"))
end
--- optimizing for no find (*) does not save time
-
---~ local function globpattern(path,patt,recurse,action) -- fails in recent luatex due to some change in lfs
---~ local ok, scanner
---~ if path == "/" then
---~ ok, scanner = xpcall(function() return walkdir(path..".") end, function() end) -- kepler safe
---~ else
---~ ok, scanner = xpcall(function() return walkdir(path) end, function() end) -- kepler safe
---~ end
---~ if ok and type(scanner) == "function" then
---~ if not find(path,"/$") then path = path .. '/' end
---~ for name in scanner do
---~ local full = path .. name
---~ local mode = attributes(full,'mode')
---~ if mode == 'file' then
---~ if find(full,patt) then
---~ action(full)
---~ end
---~ elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then
---~ globpattern(full,patt,recurse,action)
---~ end
---~ end
---~ end
---~ end
-
-local lfsisdir = isdir
-
-local function isdir(path)
- path = gsub(path,"[/\\]+$","")
- return lfsisdir(path)
-end
+-- somewhat optimized
-lfs.isdir = isdir
+local function glob_pattern_function(path,patt,recurse,action)
+ if isdir(path) then
+ local usedpath
+ if path == "/" then
+ usedpath = "/."
+ elseif not find(path,"/$") then
+ usedpath = path .. "/."
+ path = path .. "/"
+ else
+ usedpath = path
+ end
+ local dirs
+ for name in walkdir(usedpath) do
+ if name ~= "." and name ~= ".." then
+ local full = path .. name
+ local mode = attributes(full,'mode')
+ if mode == 'file' then
+ if not patt or find(full,patt) then
+ action(full)
+ end
+ elseif recurse and mode == "directory" then
+ if not dirs then
+ dirs = { full }
+ else
+ dirs[#dirs+1] = full
+ end
+ end
+ end
+ end
+ if dirs then
+ for i=1,#dirs do
+ glob_pattern_function(dirs[i],patt,recurse,action)
+ end
+ end
+ end
+end
-local function globpattern(path,patt,recurse,action)
- if path == "/" then
- path = path .. "."
- elseif not find(path,"/$") then
- path = path .. '/'
+local function glob_pattern_table(path,patt,recurse,result)
+ if not result then
+ result = { }
end
- if isdir(path) then -- lfs.isdir does not like trailing /
- for name in walkdir(path) do -- lfs.dir accepts trailing /
- local full = path .. name
- local mode = attributes(full,'mode')
- if mode == 'file' then
- if find(full,patt) then
- action(full)
+ if isdir(path) then
+ local usedpath
+ if path == "/" then
+ usedpath = "/."
+ elseif not find(path,"/$") then
+ usedpath = path .. "/."
+ path = path .. "/"
+ else
+ usedpath = path
+ end
+ local dirs
+ for name in walkdir(usedpath) do
+ if name ~= "." and name ~= ".." then
+ local full = path .. name
+ local mode = attributes(full,'mode')
+ if mode == 'file' then
+ if not patt or find(full,patt) then
+ result[#result+1] = full
+ end
+ elseif recurse and mode == "directory" then
+ if not dirs then
+ dirs = { full }
+ else
+ dirs[#dirs+1] = full
+ end
end
- elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then
- globpattern(full,patt,recurse,action)
+ end
+ end
+ if dirs then
+ for i=1,#dirs do
+ glob_pattern_table(dirs[i],patt,recurse,result)
end
end
end
+ return result
+end
+
+local function globpattern(path,patt,recurse,method)
+ local kind = type(method)
+ if patt and sub(patt,1,-3) == path then
+ patt = false
+ end
+ if kind == "function" then
+ return glob_pattern_function(path,patt,recurse,method)
+ elseif kind == "table" then
+ return glob_pattern_table(path,patt,recurse,method)
+ else
+ return glob_pattern_table(path,patt,recurse,{ })
+ end
end
dir.globpattern = globpattern
+-- never or seldom used so far:
+
local function collectpattern(path,patt,recurse,result)
local ok, scanner
result = result or { }
@@ -119,18 +182,26 @@ local function collectpattern(path,patt,recurse,result)
ok, scanner, first = xpcall(function() return walkdir(path) end, function() end) -- kepler safe
end
if ok and type(scanner) == "function" then
- if not find(path,"/$") then path = path .. '/' end
+ if not find(path,"/$") then
+ path = path .. '/'
+ end
for name in scanner, first do
- local full = path .. name
- local attr = attributes(full)
- local mode = attr.mode
- if mode == 'file' then
- if find(full,patt) then
+ if name == "." then
+ -- skip
+ elseif name == ".." then
+ -- skip
+ else
+ local full = path .. name
+ local attr = attributes(full)
+ local mode = attr.mode
+ if mode == 'file' then
+ if find(full,patt) then
+ result[name] = attr
+ end
+ elseif recurse and mode == "directory" then
+ attr.list = collectpattern(full,patt,recurse)
result[name] = attr
end
- elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then
- attr.list = collectpattern(full,patt,recurse)
- result[name] = attr
end
end
end
@@ -139,19 +210,14 @@ end
dir.collectpattern = collectpattern
-local separator
+local separator, pattern
if onwindows then -- we could sanitize here
--- pattern = Ct {
--- [1] = (C(P(".") + S("/\\")^1) + C(R("az","AZ") * P(":") * S("/\\")^0) + Cc("./")) * V(2) * V(3),
--- [2] = C(((1-S("*?/\\"))^0 * S("/\\"))^0),
--- [3] = C(P(1)^0)
--- }
-
local slash = S("/\\") / "/"
- pattern = Ct {
+-- pattern = Ct {
+ pattern = {
[1] = (Cs(P(".") + slash^1) + Cs(R("az","AZ") * P(":") * slash^0) + Cc("./")) * V(2) * V(3),
[2] = Cs(((1-S("*?/\\"))^0 * slash)^0),
[3] = Cs(P(1)^0)
@@ -159,7 +225,8 @@ if onwindows then -- we could sanitize here
else -- assume unix
- pattern = Ct {
+-- pattern = Ct {
+ pattern = {
[1] = (C(P(".") + P("/")^1) + Cc("./")) * V(2) * V(3),
[2] = C(((1-S("*?/"))^0 * P("/"))^0),
[3] = C(P(1)^0)
@@ -186,12 +253,11 @@ local function glob(str,t)
elseif isfile(str) then
t(str)
else
- local split = lpegmatch(pattern,str) -- we could use the file splitter
- if split then
- local root, path, base = split[1], split[2], split[3]
+ local root, path, base = lpegmatch(pattern,str) -- we could use the file splitter
+ if root and path and base then
local recurse = find(base,"**",1,true) -- find(base,"%*%*")
- local start = root .. path
- local result = lpegmatch(filter,start .. base)
+ local start = root .. path
+ local result = lpegmatch(filter,start .. base)
globpattern(start,result,recurse,t)
end
end
@@ -210,16 +276,12 @@ local function glob(str,t)
return { str }
end
else
- local split = lpegmatch(pattern,str) -- we could use the file splitter
- if split then
- local t = t or { }
- local action = action or function(name) t[#t+1] = name end
- local root, path, base = split[1], split[2], split[3]
- local recurse = find(base,"**",1,true) -- find(base,"%*%*")
- local start = root .. path
- local result = lpegmatch(filter,start .. base)
- globpattern(start,result,recurse,action)
- return t
+ local root, path, base = lpegmatch(pattern,str) -- we could use the file splitter
+ if root and path and base then
+ local recurse = find(base,"**",1,true) -- find(base,"%*%*")
+ local start = root .. path
+ local result = lpegmatch(filter,start .. base)
+ return globpattern(start,result,recurse,t)
else
return { }
end
@@ -229,11 +291,20 @@ end
dir.glob = glob
---~ list = dir.glob("**/*.tif")
---~ list = dir.glob("/**/*.tif")
---~ list = dir.glob("./**/*.tif")
---~ list = dir.glob("oeps/**/*.tif")
---~ list = dir.glob("/oeps/**/*.tif")
+-- local c = os.clock()
+-- local t = dir.glob("e:/**")
+-- local t = dir.glob("t:/sources/**")
+-- local t = dir.glob("t:/**")
+-- print(os.clock()-c,#t)
+
+-- for i=1,3000 do print(t[i]) end
+-- for i=1,10 do print(t[i]) end
+
+-- list = dir.glob("**/*.tif")
+-- list = dir.glob("/**/*.tif")
+-- list = dir.glob("./**/*.tif")
+-- list = dir.glob("oeps/**/*.tif")
+-- list = dir.glob("/oeps/**/*.tif")
local function globfiles(path,recurse,func,files) -- func == pattern or function
if type(func) == "string" then
@@ -275,10 +346,10 @@ function dir.ls(pattern)
return concat(glob(pattern),"\n")
end
---~ mkdirs("temp")
---~ mkdirs("a/b/c")
---~ mkdirs(".","/a/b/c")
---~ mkdirs("a","b","c")
+-- mkdirs("temp")
+-- mkdirs("a/b/c")
+-- mkdirs(".","/a/b/c")
+-- mkdirs("a","b","c")
local make_indeed = true -- false
@@ -347,17 +418,17 @@ if onwindows then
return pth, (isdir(pth) == true)
end
- --~ print(dir.mkdirs("","","a","c"))
- --~ print(dir.mkdirs("a"))
- --~ print(dir.mkdirs("a:"))
- --~ print(dir.mkdirs("a:/b/c"))
- --~ print(dir.mkdirs("a:b/c"))
- --~ print(dir.mkdirs("a:/bbb/c"))
- --~ print(dir.mkdirs("/a/b/c"))
- --~ print(dir.mkdirs("/aaa/b/c"))
- --~ print(dir.mkdirs("//a/b/c"))
- --~ print(dir.mkdirs("///a/b/c"))
- --~ print(dir.mkdirs("a/bbb//ccc/"))
+ -- print(dir.mkdirs("","","a","c"))
+ -- print(dir.mkdirs("a"))
+ -- print(dir.mkdirs("a:"))
+ -- print(dir.mkdirs("a:/b/c"))
+ -- print(dir.mkdirs("a:b/c"))
+ -- print(dir.mkdirs("a:/bbb/c"))
+ -- print(dir.mkdirs("/a/b/c"))
+ -- print(dir.mkdirs("/aaa/b/c"))
+ -- print(dir.mkdirs("//a/b/c"))
+ -- print(dir.mkdirs("///a/b/c"))
+ -- print(dir.mkdirs("a/bbb//ccc/"))
else
@@ -408,64 +479,75 @@ else
return pth, (isdir(pth) == true)
end
- --~ print(dir.mkdirs("","","a","c"))
- --~ print(dir.mkdirs("a"))
- --~ print(dir.mkdirs("/a/b/c"))
- --~ print(dir.mkdirs("/aaa/b/c"))
- --~ print(dir.mkdirs("//a/b/c"))
- --~ print(dir.mkdirs("///a/b/c"))
- --~ print(dir.mkdirs("a/bbb//ccc/"))
+ -- print(dir.mkdirs("","","a","c"))
+ -- print(dir.mkdirs("a"))
+ -- print(dir.mkdirs("/a/b/c"))
+ -- print(dir.mkdirs("/aaa/b/c"))
+ -- print(dir.mkdirs("//a/b/c"))
+ -- print(dir.mkdirs("///a/b/c"))
+ -- print(dir.mkdirs("a/bbb//ccc/"))
end
dir.makedirs = dir.mkdirs
--- we can only define it here as it uses dir.current
-if onwindows then
+do
- function dir.expandname(str) -- will be merged with cleanpath and collapsepath
- local first, nothing, last = match(str,"^(//)(//*)(.*)$")
- if first then
- first = dir.current() .. "/" -- dir.current sanitizes
- end
- if not first then
- first, last = match(str,"^(//)/*(.*)$")
- end
- if not first then
- first, last = match(str,"^([a-zA-Z]:)(.*)$")
- if first and not find(last,"^/") then
- local d = currentdir()
- if chdir(first) then
- first = dir.current()
+ -- we can only define it here as it uses dir.chdir and we also need to
+ -- make sure we use the non sandboxed variant because otherwise we get
+ -- into a recursive loop due to usage of expandname in the file resolver
+
+ local chdir = sandbox and sandbox.original(chdir) or chdir
+
+ if onwindows then
+
+ local xcurrentdir = dir.current
+
+ function dir.expandname(str) -- will be merged with cleanpath and collapsepath\
+ local first, nothing, last = match(str,"^(//)(//*)(.*)$")
+ if first then
+ first = xcurrentdir() .. "/" -- xcurrentdir sanitizes
+ end
+ if not first then
+ first, last = match(str,"^(//)/*(.*)$")
+ end
+ if not first then
+ first, last = match(str,"^([a-zA-Z]:)(.*)$")
+ if first and not find(last,"^/") then
+ local d = currentdir() -- push / pop
+ if chdir(first) then
+ first = xcurrentdir() -- xcurrentdir sanitizes
+ end
+ chdir(d)
end
- chdir(d)
+ end
+ if not first then
+ first, last = xcurrentdir(), str
+ end
+ last = gsub(last,"//","/")
+ last = gsub(last,"/%./","/")
+ last = gsub(last,"^/*","")
+ first = gsub(first,"/*$","")
+ if last == "" or last == "." then
+ return first
+ else
+ return first .. "/" .. last
end
end
- if not first then
- first, last = dir.current(), str
- end
- last = gsub(last,"//","/")
- last = gsub(last,"/%./","/")
- last = gsub(last,"^/*","")
- first = gsub(first,"/*$","")
- if last == "" or last == "." then
- return first
- else
- return first .. "/" .. last
- end
- end
-else
+ else
- function dir.expandname(str) -- will be merged with cleanpath and collapsepath
- if not find(str,"^/") then
- str = currentdir() .. "/" .. str
+ function dir.expandname(str) -- will be merged with cleanpath and collapsepath
+ if not find(str,"^/") then
+ str = currentdir() .. "/" .. str
+ end
+ str = gsub(str,"//","/")
+ str = gsub(str,"/%./","/")
+ str = gsub(str,"(.)/%.$","%1")
+ return str
end
- str = gsub(str,"//","/")
- str = gsub(str,"/%./","/")
- str = gsub(str,"(.)/%.$","%1")
- return str
+
end
end
diff --git a/Master/texmf-dist/tex/context/base/l-file.lua b/Master/texmf-dist/tex/context/base/l-file.lua
index ebb2b39f4a2..7ed6370f260 100644
--- a/Master/texmf-dist/tex/context/base/l-file.lua
+++ b/Master/texmf-dist/tex/context/base/l-file.lua
@@ -15,51 +15,53 @@ if not lfs then
lfs = optionalrequire("lfs")
end
-if not lfs then
-
- lfs = {
- getcurrentdir = function()
- return "."
- end,
- attributes = function()
- return nil
- end,
- isfile = function(name)
- local f = io.open(name,'rb')
- if f then
- f:close()
- return true
- end
- end,
- isdir = function(name)
- print("you need to load lfs")
- return false
- end
- }
-
-elseif not lfs.isfile then
-
- local attributes = lfs.attributes
-
- function lfs.isdir(name)
- return attributes(name,"mode") == "directory"
- end
-
- function lfs.isfile(name)
- return attributes(name,"mode") == "file"
- end
-
- -- function lfs.isdir(name)
- -- local a = attributes(name)
- -- return a and a.mode == "directory"
- -- end
-
- -- function lfs.isfile(name)
- -- local a = attributes(name)
- -- return a and a.mode == "file"
- -- end
-
-end
+-- -- see later
+--
+-- if not lfs then
+--
+-- lfs = {
+-- getcurrentdir = function()
+-- return "."
+-- end,
+-- attributes = function()
+-- return nil
+-- end,
+-- isfile = function(name)
+-- local f = io.open(name,'rb')
+-- if f then
+-- f:close()
+-- return true
+-- end
+-- end,
+-- isdir = function(name)
+-- print("you need to load lfs")
+-- return false
+-- end
+-- }
+--
+-- elseif not lfs.isfile then
+--
+-- local attributes = lfs.attributes
+--
+-- function lfs.isdir(name)
+-- return attributes(name,"mode") == "directory"
+-- end
+--
+-- function lfs.isfile(name)
+-- return attributes(name,"mode") == "file"
+-- end
+--
+-- -- function lfs.isdir(name)
+-- -- local a = attributes(name)
+-- -- return a and a.mode == "directory"
+-- -- end
+--
+-- -- function lfs.isfile(name)
+-- -- local a = attributes(name)
+-- -- return a and a.mode == "file"
+-- -- end
+--
+-- end
local insert, concat = table.insert, table.concat
local match, find, gmatch = string.match, string.find, string.gmatch
@@ -72,6 +74,28 @@ local checkedsplit = string.checkedsplit
local P, R, S, C, Cs, Cp, Cc, Ct = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpeg.Cp, lpeg.Cc, lpeg.Ct
+-- better this way:
+
+local tricky = S("/\\") * P(-1)
+local attributes = lfs.attributes
+
+if sandbox then
+ sandbox.redefine(lfs.isfile,"lfs.isfile")
+ sandbox.redefine(lfs.isdir, "lfs.isdir")
+end
+
+function lfs.isdir(name)
+ if lpegmatch(tricky,name) then
+ return attributes(name,"mode") == "directory"
+ else
+ return attributes(name.."/.","mode") == "directory"
+ end
+end
+
+function lfs.isfile(name)
+ return attributes(name,"mode") == "file"
+end
+
local colon = P(":")
local period = P(".")
local periods = P("..")
@@ -133,8 +157,8 @@ file.suffix = suffixonly
file.suffixesonly = suffixesonly
file.suffixes = suffixesonly
-file.dirname = pathpart -- obsolete
-file.extname = suffixonly -- obsolete
+file.dirname = pathpart -- obsolete
+file.extname = suffixonly -- obsolete
-- actually these are schemes
@@ -385,31 +409,90 @@ local deslasher = lpeg.replacer(S("\\/")^1,"/")
-- then we still have to deal with urls ... anyhow, multiple // are never a real
-- problem but just ugly.
-function file.join(...)
- local lst = { ... }
- local one = lst[1]
+-- function file.join(...)
+-- local lst = { ... }
+-- local one = lst[1]
+-- if lpegmatch(isnetwork,one) then
+-- local one = lpegmatch(reslasher,one)
+-- local two = lpegmatch(deslasher,concat(lst,"/",2))
+-- if lpegmatch(hasroot,two) then
+-- return one .. two
+-- else
+-- return one .. "/" .. two
+-- end
+-- elseif lpegmatch(isroot,one) then
+-- local two = lpegmatch(deslasher,concat(lst,"/",2))
+-- if lpegmatch(hasroot,two) then
+-- return two
+-- else
+-- return "/" .. two
+-- end
+-- elseif one == "" then
+-- return lpegmatch(stripper,concat(lst,"/",2))
+-- else
+-- return lpegmatch(deslasher,concat(lst,"/"))
+-- end
+-- end
+
+function file.join(one, two, three, ...)
+ if not two then
+ return one == "" and one or lpegmatch(stripper,one)
+ end
+ if one == "" then
+ return lpegmatch(stripper,three and concat({ two, three, ... },"/") or two)
+ end
if lpegmatch(isnetwork,one) then
local one = lpegmatch(reslasher,one)
- local two = lpegmatch(deslasher,concat(lst,"/",2))
+ local two = lpegmatch(deslasher,three and concat({ two, three, ... },"/") or two)
if lpegmatch(hasroot,two) then
return one .. two
else
return one .. "/" .. two
end
elseif lpegmatch(isroot,one) then
- local two = lpegmatch(deslasher,concat(lst,"/",2))
+ local two = lpegmatch(deslasher,three and concat({ two, three, ... },"/") or two)
if lpegmatch(hasroot,two) then
return two
else
return "/" .. two
end
- elseif one == "" then
- return lpegmatch(stripper,concat(lst,"/",2))
else
- return lpegmatch(deslasher,concat(lst,"/"))
+ return lpegmatch(deslasher,concat({ one, two, three, ... },"/"))
end
end
+-- or we can use this:
+--
+-- function file.join(...)
+-- local n = select("#",...)
+-- local one = select(1,...)
+-- if n == 1 then
+-- return one == "" and one or lpegmatch(stripper,one)
+-- end
+-- if one == "" then
+-- return lpegmatch(stripper,n > 2 and concat({ ... },"/",2) or select(2,...))
+-- end
+-- if lpegmatch(isnetwork,one) then
+-- local one = lpegmatch(reslasher,one)
+-- local two = lpegmatch(deslasher,n > 2 and concat({ ... },"/",2) or select(2,...))
+-- if lpegmatch(hasroot,two) then
+-- return one .. two
+-- else
+-- return one .. "/" .. two
+-- end
+-- elseif lpegmatch(isroot,one) then
+-- local two = lpegmatch(deslasher,n > 2 and concat({ ... },"/",2) or select(2,...))
+-- if lpegmatch(hasroot,two) then
+-- return two
+-- else
+-- return "/" .. two
+-- end
+-- else
+-- return lpegmatch(deslasher,concat({ ... },"/"))
+-- end
+-- end
+
+-- print(file.join("c:/whatever"))
-- print(file.join("c:/whatever","name"))
-- print(file.join("//","/y"))
-- print(file.join("/","/y"))
diff --git a/Master/texmf-dist/tex/context/base/l-io.lua b/Master/texmf-dist/tex/context/base/l-io.lua
index 020e811bf09..a91d44d8776 100644
--- a/Master/texmf-dist/tex/context/base/l-io.lua
+++ b/Master/texmf-dist/tex/context/base/l-io.lua
@@ -339,11 +339,6 @@ function io.readstring(f,n,m)
return str
end
---
-
-if not io.i_limiter then function io.i_limiter() end end -- dummy so we can test safely
-if not io.o_limiter then function io.o_limiter() end end -- dummy so we can test safely
-
-- This works quite ok:
--
-- function io.piped(command,writer)
diff --git a/Master/texmf-dist/tex/context/base/l-lpeg.lua b/Master/texmf-dist/tex/context/base/l-lpeg.lua
index 666af210386..4aadadb727c 100644
--- a/Master/texmf-dist/tex/context/base/l-lpeg.lua
+++ b/Master/texmf-dist/tex/context/base/l-lpeg.lua
@@ -145,6 +145,9 @@ patterns.utfbom_8 = utfbom_8
patterns.utf_16_be_nl = P("\000\r\000\n") + P("\000\r") + P("\000\n") -- P("\000\r") * (P("\000\n") + P(true)) + P("\000\n")
patterns.utf_16_le_nl = P("\r\000\n\000") + P("\r\000") + P("\n\000") -- P("\r\000") * (P("\n\000") + P(true)) + P("\n\000")
+patterns.utf_32_be_nl = P("\000\000\000\r\000\000\000\n") + P("\000\000\000\r") + P("\000\000\000\n")
+patterns.utf_32_le_nl = P("\r\000\000\000\n\000\000\000") + P("\r\000\000\000") + P("\n\000\000\000")
+
patterns.utf8one = R("\000\127")
patterns.utf8two = R("\194\223") * utf8next
patterns.utf8three = R("\224\239") * utf8next * utf8next
@@ -183,10 +186,26 @@ local fullstripper = whitespace^0 * C((whitespace^0 * nonwhitespace^1)^0)
----- collapser = Cs(spacer^0/"" * ((spacer^1 * endofstring / "") + (spacer^1/" ") + P(1))^0)
local collapser = Cs(spacer^0/"" * nonspacer^0 * ((spacer^0/" " * nonspacer^1)^0))
+local b_collapser = Cs( whitespace^0 /"" * (nonwhitespace^1 + whitespace^1/" ")^0)
+local e_collapser = Cs((whitespace^1 * P(-1)/"" + nonwhitespace^1 + whitespace^1/" ")^0)
+local m_collapser = Cs( (nonwhitespace^1 + whitespace^1/" ")^0)
+
+local b_stripper = Cs( spacer^0 /"" * (nonspacer^1 + spacer^1/" ")^0)
+local e_stripper = Cs((spacer^1 * P(-1)/"" + nonspacer^1 + spacer^1/" ")^0)
+local m_stripper = Cs( (nonspacer^1 + spacer^1/" ")^0)
+
patterns.stripper = stripper
patterns.fullstripper = fullstripper
patterns.collapser = collapser
+patterns.b_collapser = b_collapser
+patterns.m_collapser = m_collapser
+patterns.e_collapser = e_collapser
+
+patterns.b_stripper = b_stripper
+patterns.m_stripper = m_stripper
+patterns.e_stripper = e_stripper
+
patterns.lowercase = lowercase
patterns.uppercase = uppercase
patterns.letter = patterns.lowercase + patterns.uppercase
@@ -225,9 +244,12 @@ patterns.integer = sign^-1 * digit^1
patterns.unsigned = digit^0 * period * digit^1
patterns.float = sign^-1 * patterns.unsigned
patterns.cunsigned = digit^0 * comma * digit^1
+patterns.cpunsigned = digit^0 * (period + comma) * digit^1
patterns.cfloat = sign^-1 * patterns.cunsigned
+patterns.cpfloat = sign^-1 * patterns.cpunsigned
patterns.number = patterns.float + patterns.integer
patterns.cnumber = patterns.cfloat + patterns.integer
+patterns.cpnumber = patterns.cpfloat + patterns.integer
patterns.oct = zero * octdigit^1
patterns.octal = patterns.oct
patterns.HEX = zero * P("X") * (digit+uppercase)^1
@@ -496,7 +518,6 @@ function lpeg.finder(lst,makefunction,isutf) -- beware: slower than find with 'p
pattern = P(lst)
end
if isutf then
--- pattern = ((utf8char or 1)-pattern)^0 * pattern
pattern = ((utf8char or 1)-pattern)^0 * pattern
else
pattern = (1-pattern)^0 * pattern
@@ -813,23 +834,48 @@ end
-- experiment:
+local p_false = P(false)
+local p_true = P(true)
+
local function make(t)
- local p
+ local function making(t)
+ local p = p_false
+ local keys = sortedkeys(t)
+-- local okay = t[""]
+ for i=1,#keys do
+ local k = keys[i]
+ if k ~= "" then
+ local v = t[k]
+ if v == true then
+ p = p + P(k) * p_true
+ elseif v == false then
+ -- can't happen
+-- elseif okay then
+-- p = p + P(k) * (making(v) + p_true)
+ else
+ p = p + P(k) * making(v)
+ end
+ end
+ end
+ if t[""] then
+ p = p + p_true
+ end
+ return p
+ end
+ local p = p_false
local keys = sortedkeys(t)
for i=1,#keys do
local k = keys[i]
- local v = t[k]
- if not p then
- if next(v) then
- p = P(k) * make(v)
+ if k ~= "" then
+ local v = t[k]
+ if v == true then
+ p = p + P(k) * p_true
+ elseif v == false then
+ -- can't happen
+-- elseif v[""] then
+-- p = p + P(k) * (making(v) + p_true)
else
- p = P(k)
- end
- else
- if next(v) then
- p = p + P(k) * make(v)
- else
- p = p + P(k)
+ p = p + P(k) * making(v)
end
end
end
@@ -838,19 +884,109 @@ end
function lpeg.utfchartabletopattern(list) -- goes to util-lpg
local tree = { }
- for i=1,#list do
- local t = tree
- for c in gmatch(list[i],".") do
- if not t[c] then
- t[c] = { }
+ local n = #list
+ if n == 0 then
+ for s in next, list do
+ local t = tree
+ local p, pk
+ for c in gmatch(s,".") do
+ if t == true then
+ t = { [c] = true, [""] = true }
+ p[pk] = t
+ p = t
+ t = false
+ elseif t == false then
+ t = { [c] = false }
+ p[pk] = t
+ p = t
+ t = false
+ else
+ local tc = t[c]
+ if not tc then
+ tc = false
+ t[c] = false
+ end
+ p = t
+ t = tc
+ end
+ pk = c
+ end
+ if t == false then
+ p[pk] = true
+ elseif t == true then
+ -- okay
+ else
+ t[""] = true
+ end
+ end
+ else
+ for i=1,n do
+ local s = list[i]
+ local t = tree
+ local p, pk
+ for c in gmatch(s,".") do
+ if t == true then
+ t = { [c] = true, [""] = true }
+ p[pk] = t
+ p = t
+ t = false
+ elseif t == false then
+ t = { [c] = false }
+ p[pk] = t
+ p = t
+ t = false
+ else
+ local tc = t[c]
+ if not tc then
+ tc = false
+ t[c] = false
+ end
+ p = t
+ t = tc
+ end
+ pk = c
+ end
+ if t == false then
+ p[pk] = true
+ elseif t == true then
+ -- okay
+ else
+ t[""] = true
end
- t = t[c]
end
end
+-- inspect(tree)
return make(tree)
end
--- inspect ( lpeg.utfchartabletopattern {
+-- local t = { "a", "abc", "ac", "abe", "abxyz", "xy", "bef","aa" }
+-- local p = lpeg.Cs((lpeg.utfchartabletopattern(t)/string.upper + 1)^1)
+
+-- inspect(lpegmatch(p,"a"))
+-- inspect(lpegmatch(p,"aa"))
+-- inspect(lpegmatch(p,"aaaa"))
+-- inspect(lpegmatch(p,"ac"))
+-- inspect(lpegmatch(p,"bc"))
+-- inspect(lpegmatch(p,"zzbczz"))
+-- inspect(lpegmatch(p,"zzabezz"))
+-- inspect(lpegmatch(p,"ab"))
+-- inspect(lpegmatch(p,"abc"))
+-- inspect(lpegmatch(p,"abe"))
+-- inspect(lpegmatch(p,"xa"))
+-- inspect(lpegmatch(p,"bx"))
+-- inspect(lpegmatch(p,"bax"))
+-- inspect(lpegmatch(p,"abxyz"))
+-- inspect(lpegmatch(p,"foobarbefcrap"))
+
+-- local t = { ["^"] = 1, ["^^"] = 2, ["^^^"] = 3, ["^^^^"] = 4 }
+-- local p = lpeg.Cs((lpeg.utfchartabletopattern(t)/t + 1)^1)
+-- inspect(lpegmatch(p," ^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^ ^^^^^^^ "))
+
+-- local t = { ["^^"] = 2, ["^^^"] = 3, ["^^^^"] = 4 }
+-- local p = lpeg.Cs((lpeg.utfchartabletopattern(t)/t + 1)^1)
+-- inspect(lpegmatch(p," ^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^ ^^^^^^^ "))
+
+-- lpeg.utfchartabletopattern {
-- utfchar(0x00A0), -- nbsp
-- utfchar(0x2000), -- enquad
-- utfchar(0x2001), -- emquad
@@ -866,7 +1002,7 @@ end
-- utfchar(0x200B), -- zerowidthspace
-- utfchar(0x202F), -- narrownobreakspace
-- utfchar(0x205F), -- math thinspace
--- } )
+-- }
-- a few handy ones:
--
@@ -935,3 +1071,75 @@ lpeg.patterns.stripzeros = stripper
-- lpegmatch(stripper,str)
-- print(#str, os.clock()-ts, lpegmatch(stripper,sample))
+-- for practical reasone we keep this here:
+
+local byte_to_HEX = { }
+local byte_to_hex = { }
+local byte_to_dec = { } -- for md5
+local hex_to_byte = { }
+
+for i=0,255 do
+ local H = format("%02X",i)
+ local h = format("%02x",i)
+ local d = format("%03i",i)
+ local c = char(i)
+ byte_to_HEX[c] = H
+ byte_to_hex[c] = h
+ byte_to_dec[c] = d
+ hex_to_byte[h] = c
+ hex_to_byte[H] = c
+end
+
+local hextobyte = P(2)/hex_to_byte
+local bytetoHEX = P(1)/byte_to_HEX
+local bytetohex = P(1)/byte_to_hex
+local bytetodec = P(1)/byte_to_dec
+local hextobytes = Cs(hextobyte^0)
+local bytestoHEX = Cs(bytetoHEX^0)
+local bytestohex = Cs(bytetohex^0)
+local bytestodec = Cs(bytetodec^0)
+
+patterns.hextobyte = hextobyte
+patterns.bytetoHEX = bytetoHEX
+patterns.bytetohex = bytetohex
+patterns.bytetodec = bytetodec
+patterns.hextobytes = hextobytes
+patterns.bytestoHEX = bytestoHEX
+patterns.bytestohex = bytestohex
+patterns.bytestodec = bytestodec
+
+function string.toHEX(s)
+ if not s or s == "" then
+ return s
+ else
+ return lpegmatch(bytestoHEX,s)
+ end
+end
+
+function string.tohex(s)
+ if not s or s == "" then
+ return s
+ else
+ return lpegmatch(bytestohex,s)
+ end
+end
+
+function string.todec(s)
+ if not s or s == "" then
+ return s
+ else
+ return lpegmatch(bytestodec,s)
+ end
+end
+
+function string.tobytes(s)
+ if not s or s == "" then
+ return s
+ else
+ return lpegmatch(hextobytes,s)
+ end
+end
+
+-- local h = "ADFE0345"
+-- local b = lpegmatch(patterns.hextobytes,h)
+-- print(h,b,string.tohex(b),string.toHEX(b))
diff --git a/Master/texmf-dist/tex/context/base/l-lua.lua b/Master/texmf-dist/tex/context/base/l-lua.lua
index 9565f484a2a..1a2a9872364 100644
--- a/Master/texmf-dist/tex/context/base/l-lua.lua
+++ b/Master/texmf-dist/tex/context/base/l-lua.lua
@@ -165,3 +165,14 @@ end
if lua then
lua.mask = load([[τεχ = 1]]) and "utf" or "ascii"
end
+
+local flush = io.flush
+
+if flush then
+
+ local execute = os.execute if execute then function os.execute(...) flush() return execute(...) end end
+ local exec = os.exec if exec then function os.exec (...) flush() return exec (...) end end
+ local spawn = os.spawn if spawn then function os.spawn (...) flush() return spawn (...) end end
+ local popen = io.popen if popen then function io.popen (...) flush() return popen (...) end end
+
+end
diff --git a/Master/texmf-dist/tex/context/base/l-math.lua b/Master/texmf-dist/tex/context/base/l-math.lua
index 43f60b56bee..ec62919b46a 100644
--- a/Master/texmf-dist/tex/context/base/l-math.lua
+++ b/Master/texmf-dist/tex/context/base/l-math.lua
@@ -8,6 +8,10 @@ if not modules then modules = { } end modules ['l-math'] = {
local floor, sin, cos, tan = math.floor, math.sin, math.cos, math.tan
+if not math.ceiling then
+ math.ceiling = math.ceil
+end
+
if not math.round then
function math.round(x) return floor(x + 0.5) end
end
diff --git a/Master/texmf-dist/tex/context/base/l-md5.lua b/Master/texmf-dist/tex/context/base/l-md5.lua
index 8ac20a5a5fb..00272c873f1 100644
--- a/Master/texmf-dist/tex/context/base/l-md5.lua
+++ b/Master/texmf-dist/tex/context/base/l-md5.lua
@@ -19,48 +19,38 @@ if not md5 then
end
local md5, file = md5, file
-local gsub, format, byte = string.gsub, string.format, string.byte
-local md5sum = md5.sum
+local gsub = string.gsub
-local function convert(str,fmt)
- return (gsub(md5sum(str),".",function(chr) return format(fmt,byte(chr)) end))
-end
-
-if not md5.HEX then function md5.HEX(str) return convert(str,"%02X") end end
-if not md5.hex then function md5.hex(str) return convert(str,"%02x") end end
-if not md5.dec then function md5.dec(str) return convert(str,"%03i") end end
-
--- local P, Cs, lpegmatch = lpeg.P, lpeg.Cs,lpeg.match
---
--- if not md5.HEX then
--- local function remap(chr) return format("%02X",byte(chr)) end
--- function md5.HEX(str) return (gsub(md5.sum(str),".",remap)) end
--- end
+-- local gsub, format, byte = string.gsub, string.format, string.byte
--
--- if not md5.hex then
--- local function remap(chr) return format("%02x",byte(chr)) end
--- function md5.hex(str) return (gsub(md5.sum(str),".",remap)) end
+-- local function convert(str,fmt)
+-- return (gsub(md5sum(str),".",function(chr) return format(fmt,byte(chr)) end))
-- end
--
--- if not md5.dec then
--- local function remap(chr) return format("%03i",byte(chr)) end
--- function md5.dec(str) return (gsub(md5.sum(str),".",remap)) end
--- end
+-- if not md5.HEX then function md5.HEX(str) return convert(str,"%02X") end end
+-- if not md5.hex then function md5.hex(str) return convert(str,"%02x") end end
+-- if not md5.dec then function md5.dec(str) return convert(str,"%03i") end end
--- if not md5.HEX then
--- local pattern_HEX = Cs( ( P(1) / function(chr) return format("%02X",byte(chr)) end)^0 )
--- function md5.HEX(str) return lpegmatch(pattern_HEX,md5.sum(str)) end
--- end
---
--- if not md5.hex then
--- local pattern_hex = Cs( ( P(1) / function(chr) return format("%02x",byte(chr)) end)^0 )
--- function md5.hex(str) return lpegmatch(pattern_hex,md5.sum(str)) end
--- end
---
--- if not md5.dec then
--- local pattern_dec = Cs( ( P(1) / function(chr) return format("%02i",byte(chr)) end)^0 )
--- function md5.dec(str) return lpegmatch(pattern_dec,md5.sum(str)) end
--- end
+do
+
+ local patterns = lpeg and lpeg.patterns
+
+ if patterns then
+
+ local bytestoHEX = patterns.bytestoHEX
+ local bytestohex = patterns.bytestohex
+ local bytestodec = patterns.bytestodec
+
+ local lpegmatch = lpeg.match
+ local md5sum = md5.sum
+
+ if not md5.HEX then function md5.HEX(str) if str then return lpegmatch(bytestoHEX,md5sum(str)) end end end
+ if not md5.hex then function md5.hex(str) if str then return lpegmatch(bytestohex,md5sum(str)) end end end
+ if not md5.dec then function md5.dec(str) if str then return lpegmatch(bytestodec,md5sum(str)) end end end
+
+ end
+
+end
function file.needsupdating(oldname,newname,threshold) -- size modification access change
local oldtime = lfs.attributes(oldname,"modification")
diff --git a/Master/texmf-dist/tex/context/base/l-os.lua b/Master/texmf-dist/tex/context/base/l-os.lua
index 1dff79cd3f3..f44b31662aa 100644
--- a/Master/texmf-dist/tex/context/base/l-os.lua
+++ b/Master/texmf-dist/tex/context/base/l-os.lua
@@ -25,8 +25,6 @@ if not modules then modules = { } end modules ['l-os'] = {
-- os.sleep() => socket.sleep()
-- math.randomseed(tonumber(string.sub(string.reverse(tostring(math.floor(socket.gettime()*10000))),1,6)))
--- maybe build io.flush in os.execute
-
local os = os
local date, time = os.date, os.time
local find, format, gsub, upper, gmatch = string.find, string.format, string.gsub, string.upper, string.gmatch
@@ -118,15 +116,11 @@ end
-- end of environment hack
-local execute, spawn, exec, iopopen, ioflush = os.execute, os.spawn or os.execute, os.exec or os.execute, io.popen, io.flush
-
-function os.execute(...) ioflush() return execute(...) end
-function os.spawn (...) ioflush() return spawn (...) end
-function os.exec (...) ioflush() return exec (...) end
-function io.popen (...) ioflush() return iopopen(...) end
+local execute = os.execute
+local iopopen = io.popen
function os.resultof(command)
- local handle = io.popen(command,"r")
+ local handle = iopopen(command,"r") -- already has flush
if handle then
local result = handle:read("*all") or ""
handle:close()
@@ -160,7 +154,7 @@ local launchers = {
}
function os.launch(str)
- os.execute(format(launchers[os.name] or launchers.unix,str))
+ execute(format(launchers[os.name] or launchers.unix,str))
end
if not os.times then -- ?
diff --git a/Master/texmf-dist/tex/context/base/l-sandbox.lua b/Master/texmf-dist/tex/context/base/l-sandbox.lua
new file mode 100644
index 00000000000..f7901379cd7
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/l-sandbox.lua
@@ -0,0 +1,271 @@
+if not modules then modules = { } end modules ['l-sandbox'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- We use string instead of function variables, so 'io.open' instead of io.open. That
+-- way we can still intercept repetetive overloads. One complication is that when we use
+-- sandboxed function sin helpers in the sanbox checkers, we can get a recursion loop
+-- so for that vreason we need to keep originals around till we enable the sandbox.
+
+-- if sandbox then return end
+
+local global = _G
+local next = next
+local unpack = unpack or table.unpack
+local type = type
+local tprint = texio.write_nl or print
+local tostring = tostring
+local format = string.format -- no formatters yet
+local concat = table.concat
+local sort = table.sort
+local gmatch = string.gmatch
+
+sandbox = { }
+local sandboxed = false
+local overloads = { }
+local skiploads = { }
+local initializers = { }
+local finalizers = { }
+local originals = { }
+local comments = { }
+local trace = false
+local logger = false
+
+-- this comes real early, so that we can still alias
+
+local function report(...)
+ tprint("sandbox ! " .. format(...)) -- poor mans tracer
+end
+
+sandbox.report = report
+
+function sandbox.setreporter(r)
+ report = r
+ sandbox.report = r
+end
+
+function sandbox.settrace(v)
+ trace = v
+end
+
+function sandbox.setlogger(l)
+ logger = type(l) == "function" and l or false
+end
+
+local function register(func,overload,comment)
+ if type(func) == "function" then
+ if type(overload) == "string" then
+ comment = overload
+ overload = nil
+ end
+ local function f(...)
+ if sandboxed then
+ local overload = overloads[f]
+ if overload then
+ if logger then
+ local result = { overload(func,...) }
+ logger {
+ comment = comments[f] or tostring(f),
+ arguments = { ... },
+ result = result[1] and true or false,
+ }
+ return unpack(result)
+ else
+ return overload(func,...)
+ end
+ else
+ -- ignored, maybe message
+ end
+ else
+ return func(...)
+ end
+ end
+ if comment then
+ comments[f] = comment
+ if trace then
+ report("registering function: %s",comment)
+ end
+ end
+ overloads[f] = overload or false
+ originals[f] = func
+ return f
+ end
+end
+
+local function redefine(func,comment)
+ if type(func) == "function" then
+ skiploads[func] = comment or comments[func] or "unknown"
+ if overloads[func] == false then
+ overloads[func] = nil -- not initialized anyway
+ end
+ end
+end
+
+sandbox.register = register
+sandbox.redefine = redefine
+
+function sandbox.original(func)
+ return originals and originals[func] or func
+end
+
+function sandbox.overload(func,overload,comment)
+ comment = comment or comments[func] or "?"
+ if type(func) ~= "function" then
+ if trace then
+ report("overloading unknown function: %s",comment)
+ end
+ elseif type(overload) ~= "function" then
+ if trace then
+ report("overloading function with bad overload: %s",comment)
+ end
+ elseif overloads[func] == nil then
+ if trace then
+ report("function is not registered: %s",comment)
+ end
+ elseif skiploads[func] then
+ if trace then
+ report("function is not skipped: %s",comment)
+ end
+ else
+ if trace then
+ report("overloading function: %s",comment)
+ end
+ overloads[func] = overload
+ end
+ return func
+end
+
+function sandbox.initializer(f)
+ if not sandboxed then
+ initializers[#initializers+1] = f
+ elseif trace then
+ report("already enabled, discarding initializer")
+ end
+end
+
+function sandbox.finalizer(f)
+ if not sandboxed then
+ finalizers[#finalizers+1] = f
+ elseif trace then
+ report("already enabled, discarding finalizer")
+ end
+end
+
+function sandbox.enable()
+ if not sandboxed then
+ for i=1,#initializers do
+ initializers[i]()
+ end
+ for i=1,#finalizers do
+ finalizers[i]()
+ end
+ local nnot = 0
+ local nyes = 0
+ local cnot = { }
+ local cyes = { }
+ local skip = { }
+ for k, v in next, overloads do
+ local c = comments[k]
+ if v then
+ if c then
+ cyes[#cyes+1] = c
+ else -- if not skiploads[k] then
+ nyes = nyes + 1
+ end
+ else
+ if c then
+ cnot[#cnot+1] = c
+ else -- if not skiploads[k] then
+ nnot = nnot + 1
+ end
+ end
+ end
+ for k, v in next, skiploads do
+ skip[#skip+1] = v
+ end
+ if #cyes > 0 then
+ sort(cyes)
+ report(" overloaded known : %s",concat(cyes," | "))
+ end
+ if nyes > 0 then
+ report(" overloaded unknown : %s",nyes)
+ end
+ if #cnot > 0 then
+ sort(cnot)
+ report("not overloaded known : %s",concat(cnot," | "))
+ end
+ if nnot > 0 then
+ report("not overloaded unknown : %s",nnot)
+ end
+ if #skip > 0 then
+ sort(skip)
+ report("not overloaded redefined : %s",concat(skip," | "))
+ end
+ initializers = nil
+ finalizers = nil
+ originals = nil
+ sandboxed = true
+ end
+end
+
+-- we sandbox some of the built-in functions now:
+
+-- todo: require
+-- todo: load
+
+local function supported(library)
+ local l = _G[library]
+ -- if l then
+ -- for k, v in next, l do
+ -- report("%s.%s",library,k)
+ -- end
+ -- end
+ return l
+end
+
+-- io.tmpfile : we don't know where that one ends up but probably is user temp space
+-- os.tmpname : no need to deal with this: outputs rubish anyway (\s9v0. \s9v0.1 \s9v0.2 etc)
+-- os.tmpdir : not needed either (luatex.vob000 luatex.vob000 etc)
+
+-- os.setenv : maybe
+-- require : maybe (normally taken from tree)
+-- http etc : maybe (all schemes that go outside)
+
+loadfile = register(loadfile,"loadfile")
+
+if supported("io") then
+ io.open = register(io.open, "io.open")
+ io.popen = register(io.popen, "io.popen") -- needs checking
+ io.lines = register(io.lines, "io.lines")
+ io.output = register(io.output, "io.output")
+ io.input = register(io.input, "io.input")
+end
+
+if supported("os") then
+ os.execute = register(os.execute, "os.execute")
+ os.spawn = register(os.spawn, "os.spawn")
+ os.exec = register(os.exec, "os.exec")
+ os.rename = register(os.rename, "os.rename")
+ os.remove = register(os.remove, "os.remove")
+end
+
+if supported("lfs") then
+ lfs.chdir = register(lfs.chdir, "lfs.chdir")
+ lfs.mkdir = register(lfs.mkdir, "lfs.mkdir")
+ lfs.rmdir = register(lfs.rmdir, "lfs.rmdir")
+ lfs.isfile = register(lfs.isfile, "lfs.isfile")
+ lfs.isdir = register(lfs.isdir, "lfs.isdir")
+ lfs.attributes = register(lfs.attributes, "lfs.attributes")
+ lfs.dir = register(lfs.dir, "lfs.dir")
+ lfs.lock_dir = register(lfs.lock_dir, "lfs.lock_dir")
+ lfs.touch = register(lfs.touch, "lfs.touch")
+ lfs.link = register(lfs.link, "lfs.link")
+ lfs.setmode = register(lfs.setmode, "lfs.setmode")
+ lfs.readlink = register(lfs.readlink, "lfs.readlink")
+ lfs.shortname = register(lfs.shortname, "lfs.shortname")
+ lfs.symlinkattributes = register(lfs.symlinkattributes,"lfs.symlinkattributes")
+end
diff --git a/Master/texmf-dist/tex/context/base/l-string.lua b/Master/texmf-dist/tex/context/base/l-string.lua
index 3b1a0003ff9..70c66f66169 100644
--- a/Master/texmf-dist/tex/context/base/l-string.lua
+++ b/Master/texmf-dist/tex/context/base/l-string.lua
@@ -94,7 +94,7 @@ end
-- return not find(str,"%S")
-- end
-local pattern = P(" ")^0 * P(-1)
+local pattern = P(" ")^0 * P(-1) -- maybe also newlines
-- patterns.onlyspaces = pattern
diff --git a/Master/texmf-dist/tex/context/base/l-table.lua b/Master/texmf-dist/tex/context/base/l-table.lua
index d231830eddc..97e0441eb09 100644
--- a/Master/texmf-dist/tex/context/base/l-table.lua
+++ b/Master/texmf-dist/tex/context/base/l-table.lua
@@ -49,12 +49,22 @@ function table.keys(t)
end
end
+-- local function compare(a,b)
+-- local ta, tb = type(a), type(b) -- needed, else 11 < 2
+-- if ta == tb then
+-- return a < b
+-- else
+-- return tostring(a) < tostring(b) -- not that efficient
+-- end
+-- end
+
local function compare(a,b)
- local ta, tb = type(a), type(b) -- needed, else 11 < 2
- if ta == tb then
+ local ta = type(a) -- needed, else 11 < 2
+ local tb = type(b) -- needed, else 11 < 2
+ if ta == tb and ta == "number" then
return a < b
else
- return tostring(a) < tostring(b)
+ return tostring(a) < tostring(b) -- not that efficient
end
end
@@ -164,14 +174,14 @@ local function sortedhash(t,cmp)
end
local n = 0
local m = #s
- local function kv(s)
+ local function kv() -- (s)
if n < m then
n = n + 1
local k = s[n]
return k, t[k]
end
end
- return kv, s
+ return kv -- , s
else
return nothing
end
@@ -400,7 +410,7 @@ local function simple_table(t)
if tv == "number" then
nt = nt + 1
if hexify then
- tt[nt] = format("0x%04X",v)
+ tt[nt] = format("0x%X",v)
else
tt[nt] = tostring(v) -- tostring not needed
end
@@ -451,7 +461,7 @@ local function do_serialize(root,name,depth,level,indexed)
local tn = type(name)
if tn == "number" then
if hexify then
- handle(format("%s[0x%04X]={",depth,name))
+ handle(format("%s[0x%X]={",depth,name))
else
handle(format("%s[%s]={",depth,name))
end
@@ -469,7 +479,7 @@ local function do_serialize(root,name,depth,level,indexed)
end
end
-- we could check for k (index) being number (cardinal)
- if root and next(root) then
+ if root and next(root) ~= nil then
-- local first, last = nil, 0 -- #root cannot be trusted here (will be ok in 5.2 when ipairs is gone)
-- if compact then
-- -- NOT: for k=1,#root do (we need to quit at nil)
@@ -502,7 +512,7 @@ local function do_serialize(root,name,depth,level,indexed)
if compact and first and tk == "number" and k >= first and k <= last then
if tv == "number" then
if hexify then
- handle(format("%s 0x%04X,",depth,v))
+ handle(format("%s 0x%X,",depth,v))
else
handle(format("%s %s,",depth,v)) -- %.99g
end
@@ -513,7 +523,7 @@ local function do_serialize(root,name,depth,level,indexed)
handle(format("%s %q,",depth,v))
end
elseif tv == "table" then
- if not next(v) then
+ if next(v) == nil then
handle(format("%s {},",depth))
elseif inline then -- and #t > 0
local st = simple_table(v)
@@ -543,25 +553,25 @@ local function do_serialize(root,name,depth,level,indexed)
elseif tv == "number" then
if tk == "number" then
if hexify then
- handle(format("%s [0x%04X]=0x%04X,",depth,k,v))
+ handle(format("%s [0x%X]=0x%X,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v)) -- %.99g
end
elseif tk == "boolean" then
if hexify then
- handle(format("%s [%s]=0x%04X,",depth,k and "true" or "false",v))
+ handle(format("%s [%s]=0x%X,",depth,k and "true" or "false",v))
else
handle(format("%s [%s]=%s,",depth,k and "true" or "false",v)) -- %.99g
end
elseif noquotes and not reserved[k] and lpegmatch(propername,k) then
if hexify then
- handle(format("%s %s=0x%04X,",depth,k,v))
+ handle(format("%s %s=0x%X,",depth,k,v))
else
handle(format("%s %s=%s,",depth,k,v)) -- %.99g
end
else
if hexify then
- handle(format("%s [%q]=0x%04X,",depth,k,v))
+ handle(format("%s [%q]=0x%X,",depth,k,v))
else
handle(format("%s [%q]=%s,",depth,k,v)) -- %.99g
end
@@ -570,7 +580,7 @@ local function do_serialize(root,name,depth,level,indexed)
if reduce and tonumber(v) then
if tk == "number" then
if hexify then
- handle(format("%s [0x%04X]=%s,",depth,k,v))
+ handle(format("%s [0x%X]=%s,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
@@ -584,7 +594,7 @@ local function do_serialize(root,name,depth,level,indexed)
else
if tk == "number" then
if hexify then
- handle(format("%s [0x%04X]=%q,",depth,k,v))
+ handle(format("%s [0x%X]=%q,",depth,k,v))
else
handle(format("%s [%s]=%q,",depth,k,v))
end
@@ -597,10 +607,10 @@ local function do_serialize(root,name,depth,level,indexed)
end
end
elseif tv == "table" then
- if not next(v) then
+ if next(v) == nil then
if tk == "number" then
if hexify then
- handle(format("%s [0x%04X]={},",depth,k))
+ handle(format("%s [0x%X]={},",depth,k))
else
handle(format("%s [%s]={},",depth,k))
end
@@ -616,7 +626,7 @@ local function do_serialize(root,name,depth,level,indexed)
if st then
if tk == "number" then
if hexify then
- handle(format("%s [0x%04X]={ %s },",depth,k,concat(st,", ")))
+ handle(format("%s [0x%X]={ %s },",depth,k,concat(st,", ")))
else
handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
end
@@ -636,7 +646,7 @@ local function do_serialize(root,name,depth,level,indexed)
elseif tv == "boolean" then
if tk == "number" then
if hexify then
- handle(format("%s [0x%04X]=%s,",depth,k,v and "true" or "false"))
+ handle(format("%s [0x%X]=%s,",depth,k,v and "true" or "false"))
else
handle(format("%s [%s]=%s,",depth,k,v and "true" or "false"))
end
@@ -653,7 +663,7 @@ local function do_serialize(root,name,depth,level,indexed)
-- local f = getinfo(v).what == "C" and dump(function(...) return v(...) end) or dump(v) -- maybe strip
if tk == "number" then
if hexify then
- handle(format("%s [0x%04X]=load(%q),",depth,k,f))
+ handle(format("%s [0x%X]=load(%q),",depth,k,f))
else
handle(format("%s [%s]=load(%q),",depth,k,f))
end
@@ -668,7 +678,7 @@ local function do_serialize(root,name,depth,level,indexed)
else
if tk == "number" then
if hexify then
- handle(format("%s [0x%04X]=%q,",depth,k,tostring(v)))
+ handle(format("%s [0x%X]=%q,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%q,",depth,k,tostring(v)))
end
@@ -683,7 +693,7 @@ local function do_serialize(root,name,depth,level,indexed)
--~ end
end
end
- if level > 0 then
+ if level > 0 then
handle(format("%s},",depth))
end
end
@@ -727,7 +737,7 @@ local function serialize(_handle,root,name,specification) -- handle wins
end
elseif tname == "number" then
if hexify then
- handle(format("[0x%04X]={",name))
+ handle(format("[0x%X]={",name))
else
handle("[" .. name .. "]={")
end
@@ -748,7 +758,7 @@ local function serialize(_handle,root,name,specification) -- handle wins
root._w_h_a_t_e_v_e_r_ = nil
end
-- Let's forget about empty tables.
- if next(root) then
+ if next(root) ~= nil then
do_serialize(root,name,"",0)
end
end
@@ -922,16 +932,27 @@ end
table.identical = identical
table.are_equal = are_equal
--- maybe also make a combined one
-
-function table.compact(t) -- remove empty tables, assumes subtables
- if t then
- for k, v in next, t do
- if not next(v) then -- no type checking
- t[k] = nil
+local function sparse(old,nest,keeptables)
+ local new = { }
+ for k, v in next, old do
+ if not (v == "" or v == false) then
+ if nest and type(v) == "table" then
+ v = sparse(v,nest)
+ if keeptables or next(v) ~= nil then
+ new[k] = v
+ end
+ else
+ new[k] = v
end
end
end
+ return new
+end
+
+table.sparse = sparse
+
+function table.compact(t)
+ return sparse(t,true,true)
end
function table.contains(t, v)
@@ -1055,11 +1076,11 @@ end
-- slower than #t on indexed tables (#t only returns the size of the numerically indexed slice)
function table.is_empty(t)
- return not t or not next(t)
+ return not t or next(t) == nil
end
function table.has_one_entry(t)
- return t and not next(t,next(t))
+ return t and next(t,next(t)) == nil
end
-- new
@@ -1114,3 +1135,49 @@ function table.values(t,s) -- optional sort flag
return { }
end
end
+
+-- maybe this will move to util-tab.lua
+
+-- for k, v in table.filtered(t,pattern) do ... end
+-- for k, v in table.filtered(t,pattern,true) do ... end
+-- for k, v in table.filtered(t,pattern,true,cmp) do ... end
+
+function table.filtered(t,pattern,sort,cmp)
+ if t and type(pattern) == "string" then
+ if sort then
+ local s
+ if cmp then
+ -- it would be nice if the sort function would accept a third argument (or nicer, an optional first)
+ s = sortedhashkeys(t,function(a,b) return cmp(t,a,b) end)
+ else
+ s = sortedkeys(t) -- the robust one
+ end
+ local n = 0
+ local m = #s
+ local function kv(s)
+ while n < m do
+ n = n + 1
+ local k = s[n]
+ if find(k,pattern) then
+ return k, t[k]
+ end
+ end
+ end
+ return kv, s
+ else
+ local n = next(t)
+ local function iterator()
+ while n ~= nil do
+ local k = n
+ n = next(t,k)
+ if find(k,pattern) then
+ return k, t[k]
+ end
+ end
+ end
+ return iterator, t
+ end
+ else
+ return nothing
+ end
+end
diff --git a/Master/texmf-dist/tex/context/base/l-unicode.lua b/Master/texmf-dist/tex/context/base/l-unicode.lua
index be61f3d73cb..02dd1a00304 100644
--- a/Master/texmf-dist/tex/context/base/l-unicode.lua
+++ b/Master/texmf-dist/tex/context/base/l-unicode.lua
@@ -34,20 +34,23 @@ local type = type
local char, byte, format, sub, gmatch = string.char, string.byte, string.format, string.sub, string.gmatch
local concat = table.concat
local P, C, R, Cs, Ct, Cmt, Cc, Carg, Cp = lpeg.P, lpeg.C, lpeg.R, lpeg.Cs, lpeg.Ct, lpeg.Cmt, lpeg.Cc, lpeg.Carg, lpeg.Cp
-local lpegmatch, patterns = lpeg.match, lpeg.patterns
-local bytepairs = string.bytepairs
+local lpegmatch = lpeg.match
+local patterns = lpeg.patterns
+local tabletopattern = lpeg.utfchartabletopattern
-local finder = lpeg.finder
-local replacer = lpeg.replacer
+local bytepairs = string.bytepairs
-local utfvalues = utf.values
-local utfgmatch = utf.gmatch -- not always present
+local finder = lpeg.finder
+local replacer = lpeg.replacer
+
+local utfvalues = utf.values
+local utfgmatch = utf.gmatch -- not always present
local p_utftype = patterns.utftype
local p_utfstricttype = patterns.utfstricttype
local p_utfoffset = patterns.utfoffset
-local p_utf8char = patterns.utf8char
+local p_utf8char = patterns.utf8character
local p_utf8byte = patterns.utf8byte
local p_utfbom = patterns.utfbom
local p_newline = patterns.newline
@@ -510,22 +513,70 @@ end
-- a replacement for simple gsubs:
-function utf.remapper(mapping)
- local pattern = Cs((p_utf8char/mapping)^0)
- return function(str)
- if not str or str == "" then
- return ""
+-- function utf.remapper(mapping)
+-- local pattern = Cs((p_utf8char/mapping)^0)
+-- return function(str)
+-- if not str or str == "" then
+-- return ""
+-- else
+-- return lpegmatch(pattern,str)
+-- end
+-- end, pattern
+-- end
+
+function utf.remapper(mapping,option) -- static also returns a pattern
+ local variant = type(mapping)
+ if variant == "table" then
+ if option == "dynamic" then
+ local pattern = false
+ table.setmetatablenewindex(mapping,function(t,k,v) rawset(t,k,v) pattern = false end)
+ return function(str)
+ if not str or str == "" then
+ return ""
+ else
+ if not pattern then
+ pattern = Cs((tabletopattern(mapping)/mapping + p_utf8char)^0)
+ end
+ return lpegmatch(pattern,str)
+ end
+ end
+ elseif option == "pattern" then
+ return Cs((tabletopattern(mapping)/mapping + p_utf8char)^0)
+ -- elseif option == "static" then
else
- return lpegmatch(pattern,str)
+ local pattern = Cs((tabletopattern(mapping)/mapping + p_utf8char)^0)
+ return function(str)
+ if not str or str == "" then
+ return ""
+ else
+ return lpegmatch(pattern,str)
+ end
+ end, pattern
+ end
+ elseif variant == "function" then
+ if option == "pattern" then
+ return Cs((p_utf8char/mapping + p_utf8char)^0)
+ else
+ local pattern = Cs((p_utf8char/mapping + p_utf8char)^0)
+ return function(str)
+ if not str or str == "" then
+ return ""
+ else
+ return lpegmatch(pattern,str)
+ end
+ end, pattern
+ end
+ else
+ -- is actually an error
+ return function(str)
+ return str or ""
end
- end, pattern
+ end
end
-- local remap = utf.remapper { a = 'd', b = "c", c = "b", d = "a" }
-- print(remap("abcd 1234 abcd"))
---
-
function utf.replacer(t) -- no precheck, always string builder
local r = replacer(t,false,false,true)
return function(str)
@@ -631,285 +682,359 @@ end
local utf16_to_utf8_be, utf16_to_utf8_le
local utf32_to_utf8_be, utf32_to_utf8_le
-local utf_16_be_linesplitter = patterns.utfbom_16_be^-1 * lpeg.tsplitat(patterns.utf_16_be_nl)
-local utf_16_le_linesplitter = patterns.utfbom_16_le^-1 * lpeg.tsplitat(patterns.utf_16_le_nl)
+local utf_16_be_getbom = patterns.utfbom_16_be^-1
+local utf_16_le_getbom = patterns.utfbom_16_le^-1
+local utf_32_be_getbom = patterns.utfbom_32_be^-1
+local utf_32_le_getbom = patterns.utfbom_32_le^-1
+
+local utf_16_be_linesplitter = utf_16_be_getbom * lpeg.tsplitat(patterns.utf_16_be_nl)
+local utf_16_le_linesplitter = utf_16_le_getbom * lpeg.tsplitat(patterns.utf_16_le_nl)
+local utf_32_be_linesplitter = utf_32_be_getbom * lpeg.tsplitat(patterns.utf_32_be_nl)
+local utf_32_le_linesplitter = utf_32_le_getbom * lpeg.tsplitat(patterns.utf_32_le_nl)
+
+-- we have three possibilities: bytepairs (using tables), gmatch (using tables), gsub and
+-- lpeg. Bytepairs are the fastert but as soon as we need to remove bombs and so the gain
+-- is less due to more testing. Also, we seldom have to convert utf16 so we don't care to
+-- much about a few milliseconds more runtime. The lpeg variant is upto 20% slower but
+-- still pretty fast.
+--
+-- for historic resone we keep the bytepairs variants around .. beware they don't grab the
+-- bom like the lpegs do so they're not dropins in the functions that follow
+--
+-- utf16_to_utf8_be = function(s)
+-- if not s then
+-- return nil
+-- elseif s == "" then
+-- return ""
+-- end
+-- local result, r, more = { }, 0, 0
+-- for left, right in bytepairs(s) do
+-- if right then
+-- local now = 256*left + right
+-- if more > 0 then
+-- now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong
+-- more = 0
+-- r = r + 1
+-- result[r] = utfchar(now)
+-- elseif now >= 0xD800 and now <= 0xDBFF then
+-- more = now
+-- else
+-- r = r + 1
+-- result[r] = utfchar(now)
+-- end
+-- end
+-- end
+-- return concat(result)
+-- end
+--
+-- local utf16_to_utf8_be_t = function(t)
+-- if not t then
+-- return nil
+-- elseif type(t) == "string" then
+-- t = lpegmatch(utf_16_be_linesplitter,t)
+-- end
+-- local result = { } -- we reuse result
+-- for i=1,#t do
+-- local s = t[i]
+-- if s ~= "" then
+-- local r, more = 0, 0
+-- for left, right in bytepairs(s) do
+-- if right then
+-- local now = 256*left + right
+-- if more > 0 then
+-- now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong
+-- more = 0
+-- r = r + 1
+-- result[r] = utfchar(now)
+-- elseif now >= 0xD800 and now <= 0xDBFF then
+-- more = now
+-- else
+-- r = r + 1
+-- result[r] = utfchar(now)
+-- end
+-- end
+-- end
+-- t[i] = concat(result,"",1,r) -- we reused tmp, hence t
+-- end
+-- end
+-- return t
+-- end
+--
+-- utf16_to_utf8_le = function(s)
+-- if not s then
+-- return nil
+-- elseif s == "" then
+-- return ""
+-- end
+-- local result, r, more = { }, 0, 0
+-- for left, right in bytepairs(s) do
+-- if right then
+-- local now = 256*right + left
+-- if more > 0 then
+-- now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong
+-- more = 0
+-- r = r + 1
+-- result[r] = utfchar(now)
+-- elseif now >= 0xD800 and now <= 0xDBFF then
+-- more = now
+-- else
+-- r = r + 1
+-- result[r] = utfchar(now)
+-- end
+-- end
+-- end
+-- return concat(result)
+-- end
+--
+-- local utf16_to_utf8_le_t = function(t)
+-- if not t then
+-- return nil
+-- elseif type(t) == "string" then
+-- t = lpegmatch(utf_16_le_linesplitter,t)
+-- end
+-- local result = { } -- we reuse result
+-- for i=1,#t do
+-- local s = t[i]
+-- if s ~= "" then
+-- local r, more = 0, 0
+-- for left, right in bytepairs(s) do
+-- if right then
+-- local now = 256*right + left
+-- if more > 0 then
+-- now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong
+-- more = 0
+-- r = r + 1
+-- result[r] = utfchar(now)
+-- elseif now >= 0xD800 and now <= 0xDBFF then
+-- more = now
+-- else
+-- r = r + 1
+-- result[r] = utfchar(now)
+-- end
+-- end
+-- end
+-- t[i] = concat(result,"",1,r) -- we reused tmp, hence t
+-- end
+-- end
+-- return t
+-- end
+--
+-- local utf32_to_utf8_be_t = function(t)
+-- if not t then
+-- return nil
+-- elseif type(t) == "string" then
+-- t = lpegmatch(utflinesplitter,t)
+-- end
+-- local result = { } -- we reuse result
+-- for i=1,#t do
+-- local r, more = 0, -1
+-- for a,b in bytepairs(t[i]) do
+-- if a and b then
+-- if more < 0 then
+-- more = 256*256*256*a + 256*256*b
+-- else
+-- r = r + 1
+-- result[t] = utfchar(more + 256*a + b)
+-- more = -1
+-- end
+-- else
+-- break
+-- end
+-- end
+-- t[i] = concat(result,"",1,r)
+-- end
+-- return t
+-- end
+--
+-- local utf32_to_utf8_le_t = function(t)
+-- if not t then
+-- return nil
+-- elseif type(t) == "string" then
+-- t = lpegmatch(utflinesplitter,t)
+-- end
+-- local result = { } -- we reuse result
+-- for i=1,#t do
+-- local r, more = 0, -1
+-- for a,b in bytepairs(t[i]) do
+-- if a and b then
+-- if more < 0 then
+-- more = 256*b + a
+-- else
+-- r = r + 1
+-- result[t] = utfchar(more + 256*256*256*b + 256*256*a)
+-- more = -1
+-- end
+-- else
+-- break
+-- end
+-- end
+-- t[i] = concat(result,"",1,r)
+-- end
+-- return t
+-- end
--- we have three possibilities:
+local more = 0
+
+local p_utf16_to_utf8_be = C(1) * C(1) /function(left,right)
+ local now = 256*byte(left) + byte(right)
+ if more > 0 then
+ now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong
+ more = 0
+ return utfchar(now)
+ elseif now >= 0xD800 and now <= 0xDBFF then
+ more = now
+ return "" -- else the c's end up in the stream
+ else
+ return utfchar(now)
+ end
+end
--- bytepairs: 0.048
--- gmatch : 0.069
--- lpeg : 0.089 (match time captures)
+local p_utf16_to_utf8_le = C(1) * C(1) /function(right,left)
+ local now = 256*byte(left) + byte(right)
+ if more > 0 then
+ now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong
+ more = 0
+ return utfchar(now)
+ elseif now >= 0xD800 and now <= 0xDBFF then
+ more = now
+ return "" -- else the c's end up in the stream
+ else
+ return utfchar(now)
+ end
+end
+local p_utf32_to_utf8_be = C(1) * C(1) * C(1) * C(1) /function(a,b,c,d)
+ return utfchar(256*256*256*byte(a) + 256*256*byte(b) + 256*byte(c) + byte(d))
+end
-if bytepairs then
+local p_utf32_to_utf8_le = C(1) * C(1) * C(1) * C(1) /function(a,b,c,d)
+ return utfchar(256*256*256*byte(d) + 256*256*byte(c) + 256*byte(b) + byte(a))
+end
- -- with a little bit more code we could include the linesplitter
+p_utf16_to_utf8_be = P(true) / function() more = 0 end * utf_16_be_getbom * Cs(p_utf16_to_utf8_be^0)
+p_utf16_to_utf8_le = P(true) / function() more = 0 end * utf_16_le_getbom * Cs(p_utf16_to_utf8_le^0)
+p_utf32_to_utf8_be = P(true) / function() more = 0 end * utf_32_be_getbom * Cs(p_utf32_to_utf8_be^0)
+p_utf32_to_utf8_le = P(true) / function() more = 0 end * utf_32_le_getbom * Cs(p_utf32_to_utf8_le^0)
- utf16_to_utf8_be = function(t)
- if type(t) == "string" then
- t = lpegmatch(utf_16_be_linesplitter,t)
- end
- local result = { } -- we reuse result
- for i=1,#t do
- local r, more = 0, 0
- for left, right in bytepairs(t[i]) do
- if right then
- local now = 256*left + right
- if more > 0 then
- now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong
- more = 0
- r = r + 1
- result[r] = utfchar(now)
- elseif now >= 0xD800 and now <= 0xDBFF then
- more = now
- else
- r = r + 1
- result[r] = utfchar(now)
- end
- end
- end
- t[i] = concat(result,"",1,r) -- we reused tmp, hence t
- end
- return t
+patterns.utf16_to_utf8_be = p_utf16_to_utf8_be
+patterns.utf16_to_utf8_le = p_utf16_to_utf8_le
+patterns.utf32_to_utf8_be = p_utf32_to_utf8_be
+patterns.utf32_to_utf8_le = p_utf32_to_utf8_le
+
+utf16_to_utf8_be = function(s)
+ if s and s ~= "" then
+ return lpegmatch(p_utf16_to_utf8_be,s)
+ else
+ return s
end
+end
- utf16_to_utf8_le = function(t)
- if type(t) == "string" then
- t = lpegmatch(utf_16_le_linesplitter,t)
- end
- local result = { } -- we reuse result
- for i=1,#t do
- local r, more = 0, 0
- for left, right in bytepairs(t[i]) do
- if right then
- local now = 256*right + left
- if more > 0 then
- now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong
- more = 0
- r = r + 1
- result[r] = utfchar(now)
- elseif now >= 0xD800 and now <= 0xDBFF then
- more = now
- else
- r = r + 1
- result[r] = utfchar(now)
- end
- end
- end
- t[i] = concat(result,"",1,r) -- we reused tmp, hence t
+local utf16_to_utf8_be_t = function(t)
+ if not t then
+ return nil
+ elseif type(t) == "string" then
+ t = lpegmatch(utf_16_be_linesplitter,t)
+ end
+ for i=1,#t do
+ local s = t[i]
+ if s ~= "" then
+ t[i] = lpegmatch(p_utf16_to_utf8_be,s)
end
- return t
end
+ return t
+end
- utf32_to_utf8_be = function(t)
- if type(t) == "string" then
- t = lpegmatch(utflinesplitter,t)
- end
- local result = { } -- we reuse result
- for i=1,#t do
- local r, more = 0, -1
- for a,b in bytepairs(t[i]) do
- if a and b then
- if more < 0 then
- more = 256*256*256*a + 256*256*b
- else
- r = r + 1
- result[t] = utfchar(more + 256*a + b)
- more = -1
- end
- else
- break
- end
- end
- t[i] = concat(result,"",1,r)
- end
- return t
+utf16_to_utf8_le = function(s)
+ if s and s ~= "" then
+ return lpegmatch(p_utf16_to_utf8_le,s)
+ else
+ return s
end
+end
- utf32_to_utf8_le = function(t)
- if type(t) == "string" then
- t = lpegmatch(utflinesplitter,t)
- end
- local result = { } -- we reuse result
- for i=1,#t do
- local r, more = 0, -1
- for a,b in bytepairs(t[i]) do
- if a and b then
- if more < 0 then
- more = 256*b + a
- else
- r = r + 1
- result[t] = utfchar(more + 256*256*256*b + 256*256*a)
- more = -1
- end
- else
- break
- end
- end
- t[i] = concat(result,"",1,r)
+local utf16_to_utf8_le_t = function(t)
+ if not t then
+ return nil
+ elseif type(t) == "string" then
+ t = lpegmatch(utf_16_le_linesplitter,t)
+ end
+ for i=1,#t do
+ local s = t[i]
+ if s ~= "" then
+ t[i] = lpegmatch(p_utf16_to_utf8_le,s)
end
- return t
end
+ return t
+end
-else
-
- utf16_to_utf8_be = function(t)
- if type(t) == "string" then
- t = lpegmatch(utf_16_be_linesplitter,t)
- end
- local result = { } -- we reuse result
- for i=1,#t do
- local r, more = 0, 0
- for left, right in gmatch(t[i],"(.)(.)") do
- if left == "\000" then -- experiment
- r = r + 1
- result[r] = utfchar(byte(right))
- elseif right then
- local now = 256*byte(left) + byte(right)
- if more > 0 then
- now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong
- more = 0
- r = r + 1
- result[r] = utfchar(now)
- elseif now >= 0xD800 and now <= 0xDBFF then
- more = now
- else
- r = r + 1
- result[r] = utfchar(now)
- end
- end
- end
- t[i] = concat(result,"",1,r) -- we reused tmp, hence t
- end
- return t
+utf32_to_utf8_be = function(s)
+ if s and s ~= "" then
+ return lpegmatch(p_utf32_to_utf8_be,s)
+ else
+ return s
end
+end
- utf16_to_utf8_le = function(t)
- if type(t) == "string" then
- t = lpegmatch(utf_16_le_linesplitter,t)
- end
- local result = { } -- we reuse result
- for i=1,#t do
- local r, more = 0, 0
- for left, right in gmatch(t[i],"(.)(.)") do
- if right == "\000" then
- r = r + 1
- result[r] = utfchar(byte(left))
- elseif right then
- local now = 256*byte(right) + byte(left)
- if more > 0 then
- now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong
- more = 0
- r = r + 1
- result[r] = utfchar(now)
- elseif now >= 0xD800 and now <= 0xDBFF then
- more = now
- else
- r = r + 1
- result[r] = utfchar(now)
- end
- end
- end
- t[i] = concat(result,"",1,r) -- we reused tmp, hence t
+local utf32_to_utf8_be_t = function(t)
+ if not t then
+ return nil
+ elseif type(t) == "string" then
+ t = lpegmatch(utf_32_be_linesplitter,t)
+ end
+ for i=1,#t do
+ local s = t[i]
+ if s ~= "" then
+ t[i] = lpegmatch(p_utf32_to_utf8_be,s)
end
- return t
end
+ return t
+end
- utf32_to_utf8_le = function() return { } end -- never used anyway
- utf32_to_utf8_be = function() return { } end -- never used anyway
-
- -- the next one is slighty slower
-
- -- local result, lines, r, more = { }, { }, 0, 0
- --
- -- local simple = Cmt(
- -- C(1) * C(1), function(str,p,left,right)
- -- local now = 256*byte(left) + byte(right)
- -- if more > 0 then
- -- now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong
- -- more = 0
- -- r = r + 1
- -- result[r] = utfchar(now)
- -- elseif now >= 0xD800 and now <= 0xDBFF then
- -- more = now
- -- else
- -- r = r + 1
- -- result[r] = utfchar(now)
- -- end
- -- return p
- -- end
- -- )
- --
- -- local complex = Cmt(
- -- C(1) * C(1), function(str,p,left,right)
- -- local now = 256*byte(left) + byte(right)
- -- if more > 0 then
- -- now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong
- -- more = 0
- -- r = r + 1
- -- result[r] = utfchar(now)
- -- elseif now >= 0xD800 and now <= 0xDBFF then
- -- more = now
- -- else
- -- r = r + 1
- -- result[r] = utfchar(now)
- -- end
- -- return p
- -- end
- -- )
- --
- -- local lineend = Cmt (
- -- patterns.utf_16_be_nl, function(str,p)
- -- lines[#lines+1] = concat(result,"",1,r)
- -- r, more = 0, 0
- -- return p
- -- end
- -- )
- --
- -- local be_1 = patterns.utfbom_16_be^-1 * (simple + complex)^0
- -- local be_2 = patterns.utfbom_16_be^-1 * (lineend + simple + complex)^0
- --
- -- utf16_to_utf8_be = function(t)
- -- if type(t) == "string" then
- -- local s = t
- -- lines, r, more = { }, 0, 0
- -- lpegmatch(be_2,s)
- -- if r > 0 then
- -- lines[#lines+1] = concat(result,"",1,r)
- -- end
- -- result = { }
- -- return lines
- -- else
- -- for i=1,#t do
- -- r, more = 0, 0
- -- lpegmatch(be_1,t[i])
- -- t[i] = concat(result,"",1,r)
- -- end
- -- result = { }
- -- return t
- -- end
- -- end
+utf32_to_utf8_le = function(s)
+ if s and s ~= "" then
+ return lpegmatch(p_utf32_to_utf8_le,s)
+ else
+ return s
+ end
+end
+local utf32_to_utf8_le_t = function(t)
+ if not t then
+ return nil
+ elseif type(t) == "string" then
+ t = lpegmatch(utf_32_le_linesplitter,t)
+ end
+ for i=1,#t do
+ local s = t[i]
+ if s ~= "" then
+ t[i] = lpegmatch(p_utf32_to_utf8_le,s)
+ end
+ end
+ return t
end
-utf.utf16_to_utf8_le = utf16_to_utf8_le
-utf.utf16_to_utf8_be = utf16_to_utf8_be
-utf.utf32_to_utf8_le = utf32_to_utf8_le
-utf.utf32_to_utf8_be = utf32_to_utf8_be
+utf.utf16_to_utf8_le_t = utf16_to_utf8_le_t
+utf.utf16_to_utf8_be_t = utf16_to_utf8_be_t
+utf.utf32_to_utf8_le_t = utf32_to_utf8_le_t
+utf.utf32_to_utf8_be_t = utf32_to_utf8_be_t
-function utf.utf8_to_utf8(t)
+utf.utf16_to_utf8_le = utf16_to_utf8_le
+utf.utf16_to_utf8_be = utf16_to_utf8_be
+utf.utf32_to_utf8_le = utf32_to_utf8_le
+utf.utf32_to_utf8_be = utf32_to_utf8_be
+
+function utf.utf8_to_utf8_t(t)
return type(t) == "string" and lpegmatch(utflinesplitter,t) or t
end
-function utf.utf16_to_utf8(t,endian)
- return endian and utf16_to_utf8_be(t) or utf16_to_utf8_le(t) or t
+function utf.utf16_to_utf8_t(t,endian)
+ return endian and utf16_to_utf8_be_t(t) or utf16_to_utf8_le_t(t) or t
end
-function utf.utf32_to_utf8(t,endian)
- return endian and utf32_to_utf8_be(t) or utf32_to_utf8_le(t) or t
+function utf.utf32_to_utf8_t(t,endian)
+ return endian and utf32_to_utf8_be_t(t) or utf32_to_utf8_le_t(t) or t
end
-local function little(c)
- local b = byte(c)
+local function little(b)
if b < 0x10000 then
return char(b%256,b/256)
else
@@ -919,8 +1044,7 @@ local function little(c)
end
end
-local function big(c)
- local b = byte(c)
+local function big(b)
if b < 0x10000 then
return char(b/256,b%256)
else
@@ -930,18 +1054,10 @@ local function big(c)
end
end
--- function utf.utf8_to_utf16(str,littleendian)
--- if littleendian then
--- return char(255,254) .. utfgsub(str,".",little)
--- else
--- return char(254,255) .. utfgsub(str,".",big)
--- end
--- end
-
-local _, l_remap = utf.remapper(little)
-local _, b_remap = utf.remapper(big)
+local l_remap = Cs((p_utf8byte/little+P(1)/"")^0)
+local b_remap = Cs((p_utf8byte/big +P(1)/"")^0)
-function utf.utf8_to_utf16_be(str,nobom)
+local function utf8_to_utf16_be(str,nobom)
if nobom then
return lpegmatch(b_remap,str)
else
@@ -949,7 +1065,7 @@ function utf.utf8_to_utf16_be(str,nobom)
end
end
-function utf.utf8_to_utf16_le(str,nobom)
+local function utf8_to_utf16_le(str,nobom)
if nobom then
return lpegmatch(l_remap,str)
else
@@ -957,11 +1073,14 @@ function utf.utf8_to_utf16_le(str,nobom)
end
end
+utf.utf8_to_utf16_be = utf8_to_utf16_be
+utf.utf8_to_utf16_le = utf8_to_utf16_le
+
function utf.utf8_to_utf16(str,littleendian,nobom)
if littleendian then
- return utf.utf8_to_utf16_le(str,nobom)
+ return utf8_to_utf16_le(str,nobom)
else
- return utf.utf8_to_utf16_be(str,nobom)
+ return utf8_to_utf16_be(str,nobom)
end
end
@@ -992,16 +1111,16 @@ function utf.xstring(s)
end
function utf.toeight(str)
- if not str then
+ if not str or str == "" then
return nil
end
local utftype = lpegmatch(p_utfstricttype,str)
if utftype == "utf-8" then
- return sub(str,4)
- elseif utftype == "utf-16-le" then
- return utf16_to_utf8_le(str)
+ return sub(str,4) -- remove the bom
elseif utftype == "utf-16-be" then
- return utf16_to_utf8_ne(str)
+ return utf16_to_utf8_be(str) -- bom gets removed
+ elseif utftype == "utf-16-le" then
+ return utf16_to_utf8_le(str) -- bom gets removed
else
return str
end
diff --git a/Master/texmf-dist/tex/context/base/l-url.lua b/Master/texmf-dist/tex/context/base/l-url.lua
index 7bb73125493..b189ec5bba8 100644
--- a/Master/texmf-dist/tex/context/base/l-url.lua
+++ b/Master/texmf-dist/tex/context/base/l-url.lua
@@ -145,19 +145,25 @@ local splitquery = Cf ( Ct("") * P { "sequence",
-- hasher
local function hashed(str) -- not yet ok (/test?test)
- if str == "" then
+ if not str or str == "" then
return {
scheme = "invalid",
original = str,
}
end
- local s = split(str)
- local rawscheme = s[1]
- local rawquery = s[4]
- local somescheme = rawscheme ~= ""
- local somequery = rawquery ~= ""
+ local detailed = split(str)
+ local rawscheme = ""
+ local rawquery = ""
+ local somescheme = false
+ local somequery = false
+ if detailed then
+ rawscheme = detailed[1]
+ rawquery = detailed[4]
+ somescheme = rawscheme ~= ""
+ somequery = rawquery ~= ""
+ end
if not somescheme and not somequery then
- s = {
+ return {
scheme = "file",
authority = "",
path = str,
@@ -167,30 +173,33 @@ local function hashed(str) -- not yet ok (/test?test)
noscheme = true,
filename = str,
}
- else -- not always a filename but handy anyway
- local authority, path, filename = s[2], s[3]
- if authority == "" then
- filename = path
- elseif path == "" then
- filename = ""
- else
- filename = authority .. "/" .. path
- end
- s = {
- scheme = rawscheme,
- authority = authority,
- path = path,
- query = lpegmatch(unescaper,rawquery), -- unescaped, but possible conflict with & and =
- queries = lpegmatch(splitquery,rawquery), -- split first and then unescaped
- fragment = s[5],
- original = str,
- noscheme = false,
- filename = filename,
- }
end
- return s
+ -- not always a filename but handy anyway
+ local authority = detailed[2]
+ local path = detailed[3]
+ local filename = nil
+ if authority == "" then
+ filename = path
+ elseif path == "" then
+ filename = ""
+ else
+ filename = authority .. "/" .. path
+ end
+ return {
+ scheme = rawscheme,
+ authority = authority,
+ path = path,
+ query = lpegmatch(unescaper,rawquery), -- unescaped, but possible conflict with & and =
+ queries = lpegmatch(splitquery,rawquery), -- split first and then unescaped
+ fragment = detailed[5],
+ original = str,
+ noscheme = false,
+ filename = filename,
+ }
end
+-- inspect(hashed())
+-- inspect(hashed(""))
-- inspect(hashed("template:///test"))
-- inspect(hashed("template:///test++.whatever"))
-- inspect(hashed("template:///test%2B%2B.whatever"))
@@ -247,7 +256,7 @@ function url.construct(hash) -- dodo: we need to escape !
return lpegmatch(escaper,concat(fullurl))
end
-local pattern = Cs(noslash * R("az","AZ") * (S(":|")/":") * noslash * P(1)^0)
+local pattern = Cs(slash^-1/"" * R("az","AZ") * ((S(":|")/":") + P(":")) * slash * P(1)^0)
function url.filename(filename)
local spec = hashed(filename)
@@ -257,6 +266,7 @@ end
-- print(url.filename("/c|/test"))
-- print(url.filename("/c/test"))
+-- print(url.filename("file:///t:/sources/cow.svg"))
local function escapestring(str)
return lpegmatch(escaper,str)
diff --git a/Master/texmf-dist/tex/context/base/lang-def.mkiv b/Master/texmf-dist/tex/context/base/lang-def.mkiv
index 5c1d6de9cbf..c2fb9640cd6 100644
--- a/Master/texmf-dist/tex/context/base/lang-def.mkiv
+++ b/Master/texmf-dist/tex/context/base/lang-def.mkiv
@@ -271,37 +271,6 @@
\installlanguage [\s!slovenian] [\s!sl]
\installlanguage [slovene] [\s!sl] % both possible (mojca: still needed?)
-\def\doconvertsloveniancharacters{\dodoconvertcharacters{25}}
-
-\def\sloveniancharacters{\doconvertsloveniancharacters\sloveniancharacter}
-\def\slovenianCharacters{\doconvertsloveniancharacters\slovenianCharacter}
-
-%D Define general-purpose macros for Slovenian character enumerations:
-
-\defineconversion [sloveniancharacter] [\sloveniancharacter]
-\defineconversion [slovenianCharacter] [\slovenianCharacter]
-
-\defineconversion [sloveniancharacters] [\sloveniancharacters]
-\defineconversion [slovenianCharacters] [\slovenianCharacters]
-
-%D Define these as the general character enumeration when
-%D language is Slovenian. If you feel uncomfortable with this,
-%D mail Mojca, since she promised to to take the heat.
-
-\defineconversion [\s!sl] [character] [\sloveniancharacter]
-\defineconversion [\s!sl] [Character] [\slovenianCharacter]
-
-\defineconversion [\s!sl] [characters] [\sloveniancharacters]
-\defineconversion [\s!sl] [Characters] [\slovenianCharacters]
-
-\defineconversion [\s!sl] [a] [\sloveniancharacters]
-\defineconversion [\s!sl] [A] [\slovenianCharacters]
-\defineconversion [\s!sl] [AK] [\smallcapped\sloveniancharacters]
-\defineconversion [\s!sl] [KA] [\smallcapped\sloveniancharacters]
-
-\def\sloveniancharacters#1{\ctxcommand{alphabetic(\number#1,"sl")}}
-\def\slovenianCharacters#1{\ctxcommand{Alphabetic(\number#1,"sl")}}
-
% Cyrillic Languages
\installlanguage
@@ -510,7 +479,8 @@
\c!rightquote=’,
\c!leftquotation=“,
\c!rightquotation=”,
- \c!date={서기,\v!year,년,\v!month,월,\v!day,일}]
+ % \c!date={서기,\space,\v!year,\labeltext{\v!year},\space,\v!month,\labeltext{\v!month},\space,\v!day,\labeltext{\v!day}}]
+ \c!date={\v!year,\labeltext{\v!year},\space,\v!month,\labeltext{\v!month},\space,\v!day,\labeltext{\v!day}}]
% Greek
diff --git a/Master/texmf-dist/tex/context/base/lang-dis.lua b/Master/texmf-dist/tex/context/base/lang-dis.lua
new file mode 100644
index 00000000000..db19a0fc5b8
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/lang-dis.lua
@@ -0,0 +1,203 @@
+if not modules then modules = { } end modules ['lang-dis'] = {
+ version = 1.001,
+ comment = "companion to lang-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local concat = table.concat
+
+local nodes = nodes
+
+local tasks = nodes.tasks
+local nuts = nodes.nuts
+local nodepool = nuts.pool
+
+local tonode = nuts.tonode
+local tonut = nuts.tonut
+
+local getfield = nuts.getfield
+local setfield = nuts.setfield
+local getnext = nuts.getnext
+local getprev = nuts.getprev
+local getid = nuts.getid
+local getfont = nuts.getfont
+local getattr = nuts.getattr
+local getsubtype = nuts.getsubtype
+local getchar = nuts.getchar
+
+local copy_node = nuts.copy
+local free_node = nuts.free
+local remove_node = nuts.remove
+local traverse_id = nuts.traverse_id
+local traverse_nodes = nuts.traverse
+
+local nodecodes = nodes.nodecodes
+local disccodes = nodes.disccodes
+
+local disc_code = nodecodes.disc
+local glyph_code = nodecodes.glyph
+local discretionary_code = disccodes.discretionary
+
+local a_visualize = attributes.private("visualizediscretionary")
+local setattribute = tex.setattribute
+
+local getlanguagedata = languages.getdata
+
+local expanders = {
+ [disccodes.discretionary] = function(d,template)
+ -- \discretionary
+ return template
+ end,
+ [disccodes.explicit] = function(d,template)
+ -- \-
+ local pre = getfield(d,"pre")
+ if pre and getid(pre) == glyph_code and getchar(pre) <= 0 then
+ setfield(d,"pre",nil)
+ end
+ local post = getfield(d,"post")
+ if post and getid(post) == glyph_code and getchar(post) <= 0 then
+ setfield(d,"post",nil)
+ end
+-- setfield(d,"subtype",discretionary_code) -- to be checked
+ return template
+ end,
+ [disccodes.automatic] = function(d,template)
+ -- following a - : the pre and post chars are already appended and set
+ -- so we have pre=preex and post=postex .. however, the previous
+ -- hyphen is already injected ... downside: the font handler sees this
+ -- so this is another argument for doing a hyphenation pass in context
+ if getfield(d,"pre") then
+ -- we have a preex characters and want that one to replace the
+ -- character in front which is the trigger
+ if not template then
+ -- can there be font kerns already?
+ template = getprev(d)
+ if template and getid(template) ~= glyph_code then
+ template = getnext(d)
+ if template and getid(template) ~= glyph_code then
+ template = nil
+ end
+ end
+ end
+ if template then
+ local pseudohead = getprev(template)
+ if pseudohead then
+ while template ~= d do
+ pseudohead, template, removed = remove_node(pseudohead,template)
+ setfield(d,"replace",removed)
+ -- break ?
+ end
+ else
+ -- can't happen
+ end
+ setfield(d,"subtype",discretionary_code)
+ else
+ -- print("lone regular discretionary ignored")
+ end
+ end
+ return template
+ end,
+ [disccodes.regular] = function(d,template)
+ -- simple
+ if not template then
+ -- can there be font kerns already?
+ template = getprev(d)
+ if template and getid(template) ~= glyph_code then
+ template = getnext(d)
+ if template and getid(template) ~= glyph_code then
+ template = nil
+ end
+ end
+ end
+ if template then
+ local language = template and getfield(template,"lang")
+ local data = getlanguagedata(language)
+ local prechar = data.prehyphenchar
+ local postchar = data.posthyphenchar
+ if prechar and prechar > 0 then
+ local c = copy_node(template)
+ setfield(c,"char",prechar)
+ setfield(d,"pre",c)
+ end
+ if postchar and postchar > 0 then
+ local c = copy_node(template)
+ setfield(c,"char",postchar)
+ setfield(d,"post",c)
+ end
+ setfield(d,"subtype",discretionary_code)
+ else
+ -- print("lone regular discretionary ignored")
+ end
+ return template
+ end,
+ [disccodes.first] = function()
+ -- forget about them
+ end,
+ [disccodes.second] = function()
+ -- forget about them
+ end,
+}
+
+languages.expanders = expanders
+
+function languages.expand(d,template,subtype)
+ if not subtype then
+ subtype = getsubtype(d)
+ end
+ if subtype ~= discretionary_code then
+ return expanders[subtype](d,template)
+ end
+end
+
+local setlistcolor = nodes.tracers.colors.setlist
+
+function languages.visualizediscretionaries(head)
+ for d in traverse_id(disc_code,tonut(head)) do
+ if getattr(d,a_visualize) then
+ local pre = getfield(d,"pre")
+ local post = getfield(d,"post")
+ local replace = getfield(d,"replace")
+ if pre then
+ setlistcolor(pre,"darkred")
+ end
+ if post then
+ setlistcolor(post,"darkgreen")
+ end
+ if replace then
+ setlistcolor(replace,"darkblue")
+ end
+ end
+ end
+end
+
+local enabled = false
+
+function languages.showdiscretionaries(v)
+ if v == false then
+ setattribute(a_visualize,unsetvalue)
+ else -- also nil
+ if not enabled then
+ nodes.tasks.enableaction("processors","languages.visualizediscretionaries")
+ enabled = true
+ end
+ setattribute(a_visualize,1)
+ end
+end
+
+interfaces.implement {
+ name = "showdiscretionaries",
+ actions = languages.showdiscretionaries
+}
+
+local toutf = nodes.listtoutf
+
+function languages.serializediscretionary(d) -- will move to tracer
+ return string.formatters["{%s}{%s}{%s}"](
+ toutf(getfield(d,"pre")) or "",
+ toutf(getfield(d,"post")) or "",
+ toutf(getfield(d,"replace")) or ""
+ )
+end
+
diff --git a/Master/texmf-dist/tex/context/base/lang-hyp.lua b/Master/texmf-dist/tex/context/base/lang-hyp.lua
new file mode 100644
index 00000000000..496cfd19b43
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/lang-hyp.lua
@@ -0,0 +1,1648 @@
+if not modules then modules = { } end modules ['lang-hyp'] = {
+ version = 1.001,
+ comment = "companion to lang-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- todo: hyphenate over range if needed
+
+-- to be considered: reset dictionary.hyphenated when a pattern is added
+-- or maybe an explicit reset of the cache
+
+-- In an automated workflow hypenation of long titles can be somewhat problematic
+-- especially when demands conflict. For that reason I played a bit with a Lua based
+-- variant of the traditional hyphenation machinery. This mechanism has been extended
+-- several times in projects, of which a good description can be found in TUGboat,
+-- Volume 27 (2006), No. 2 — Proceedings of EuroTEX2006: Automatic non-standard
+-- hyphenation in OpenOffice.org by László Németh.
+--
+-- Being the result of two days experimenting the following implementation is probably
+-- not completely okay yet. If there is demand I might add some more features and plugs.
+-- The performance is quite okay but can probably improved a bit, although this is not
+-- the most critital code.
+--
+-- . a l g o r i t h m .
+-- 4l1g4
+-- l g o3
+-- 1g o
+-- 2i t h
+-- 4h1m
+-- ---------------------
+-- 4 1 4 3 2 0 4 1
+-- a l-g o-r i t h-m
+
+-- . a s s z o n n y a l .
+-- s1s z/sz=sz,1,3
+-- n1n y/ny=ny,1,3
+-- -----------------------
+-- 0 1 0 0 0 1 0 0 0/sz=sz,2,3,ny=ny,6,3
+-- a s-s z o n-n y a l/sz=sz,2,3,ny=ny,6,3
+--
+-- ab1cd/ef=gh,2,2 : acd - efd (pattern/replacement,start,length
+--
+-- In the procecess of wrapping up (for the ctx conference proceedings) I cleaned up
+-- and extended the code a bit.
+
+local type, rawset, tonumber, next = type, rawset, tonumber, next
+
+local P, R, S, Cg, Cf, Ct, Cc, C, Carg, Cs = lpeg.P, lpeg.R, lpeg.S, lpeg.Cg, lpeg.Cf, lpeg.Ct, lpeg.Cc, lpeg.C, lpeg.Carg, lpeg.Cs
+local lpegmatch = lpeg.match
+
+local concat = table.concat
+local insert = table.insert
+local remove = table.remove
+local formatters = string.formatters
+local utfchar = utf.char
+local utfbyte = utf.byte
+
+if not characters then
+ require("char-ini")
+end
+
+local setmetatableindex = table.setmetatableindex
+
+-- \enabletrackers[hyphenator.steps=silent] will not write to the terminal
+
+local trace_steps = false trackers.register("hyphenator.steps", function(v) trace_steps = v end)
+local trace_visualize = false trackers.register("hyphenator.visualize",function(v) trace_visualize = v end)
+
+local report = logs.reporter("hyphenator")
+
+local implement = interfaces and interfaces.implement or function() end
+
+languages = languages or { }
+local hyphenators = languages.hyphenators or { }
+languages.hyphenators = hyphenators
+local traditional = hyphenators.traditional or { }
+hyphenators.traditional = traditional
+
+local dictionaries = setmetatableindex(function(t,k)
+ local v = {
+ patterns = { },
+ hyphenated = { },
+ specials = { },
+ exceptions = { },
+ loaded = false,
+ }
+ t[k] = v
+ return v
+end)
+
+hyphenators.dictionaries = dictionaries
+
+local character = lpeg.patterns.utf8character
+local digit = R("09")
+local weight = digit/tonumber + Cc(0)
+local fence = P(".")
+local hyphen = P("-")
+local space = P(" ")
+local char = character - space
+local validcharacter = (character - S("./"))
+local keycharacter = character - S("/")
+----- basepart = Ct( (Cc(0) * fence)^-1 * (weight * validcharacter)^1 * weight * (fence * Cc(0))^-1)
+local specpart = (P("/") * Cf ( Ct("") *
+ Cg ( Cc("before") * C((1-P("="))^1) * P("=") ) *
+ Cg ( Cc("after") * C((1-P(","))^1) ) *
+ ( P(",") *
+ Cg ( Cc("start") * ((1-P(","))^1/tonumber) * P(",") ) *
+ Cg ( Cc("length") * ((1-P(-1) )^1/tonumber) )
+ )^-1
+ , rawset))^-1
+
+local make_hashkey_p = Cs((digit/"" + keycharacter)^1)
+----- make_pattern_p = basepart * specpart
+local make_hashkey_e = Cs((hyphen/"" + keycharacter)^1)
+local make_pattern_e = Ct(P(char) * (hyphen * Cc(true) * P(char) + P(char) * Cc(false))^1) -- catch . and char after -
+
+-- local make_hashkey_c = Cs((digit + keycharacter/"")^1)
+-- local make_pattern_c = Ct((P(1)/tonumber)^1)
+
+-- local cache = setmetatableindex(function(t,k)
+-- local n = lpegmatch(make_hashkey_c,k)
+-- local v = lpegmatch(make_pattern_c,n)
+-- t[k] = v
+-- return v
+-- end)
+--
+-- local weight_n = digit + Cc("0")
+-- local basepart_n = Cs( (Cc("0") * fence)^-1 * (weight * validcharacter)^1 * weight * (fence * Cc("0"))^-1) / cache
+-- local make_pattern_n = basepart_n * specpart
+
+local make_pattern_c = Ct((P(1)/tonumber)^1)
+
+-- us + nl: 17664 entries -> 827 unique (saves some 3M)
+
+local cache = setmetatableindex(function(t,k)
+ local v = lpegmatch(make_pattern_c,k)
+ t[k] = v
+ return v
+end)
+
+local weight_n = digit + Cc("0")
+local fence_n = fence / "0"
+local char_n = validcharacter / ""
+local basepart_n = Cs(fence_n^-1 * (weight_n * char_n)^1 * weight_n * fence_n^-1) / cache
+local make_pattern_n = basepart_n * specpart
+
+local function register_pattern(patterns,specials,str,specification)
+ local k = lpegmatch(make_hashkey_p,str)
+ -- local v1, v2 = lpegmatch(make_pattern_p,str)
+ local v1, v2 = lpegmatch(make_pattern_n,str)
+ patterns[k] = v1 -- is this key still ok for complex patterns
+ if specification then
+ specials[k] = specification
+ elseif v2 then
+ specials[k] = v2
+ end
+end
+
+local function unregister_pattern(patterns,specials,str)
+ local k = lpegmatch(make_hashkey_p,str)
+ patterns[k] = nil
+ specials[k] = nil
+end
+
+local p_lower = lpeg.patterns.utf8lower
+
+local function register_exception(exceptions,str,specification)
+ local l = lpegmatch(p_lower,str)
+ local k = lpegmatch(make_hashkey_e,l)
+ local v = lpegmatch(make_pattern_e,l)
+ exceptions[k] = v
+end
+
+local p_pattern = ((Carg(1) * Carg(2) * C(char^1)) / register_pattern + 1)^1
+local p_exception = ((Carg(1) * C(char^1)) / register_exception + 1)^1
+local p_split = Ct(C(character)^1)
+
+function traditional.loadpatterns(language,filename)
+ local dictionary = dictionaries[language]
+ if not dictionary.loaded then
+ if not filename or filename == "" then
+ filename = "lang-" .. language
+ end
+ filename = file.addsuffix(filename,"lua")
+ local fullname = resolvers.findfile(filename)
+ if fullname and fullname ~= "" then
+ local specification = dofile(fullname)
+ if specification then
+ local patterns = specification.patterns
+ if patterns then
+ local data = patterns.data
+ if data and data ~= "" then
+ lpegmatch(p_pattern,data,1,dictionary.patterns,dictionary.specials)
+ end
+ end
+ local exceptions = specification.exceptions
+ if exceptions then
+ local data = exceptions.data
+ if data and data ~= "" then
+ lpegmatch(p_exception,data,1,dictionary.exceptions)
+ end
+ end
+ end
+ end
+ dictionary.loaded = true
+ end
+ return dictionary
+end
+
+local lcchars = characters.lcchars
+local uccodes = characters.uccodes
+local categories = characters.categories
+local nofwords = 0
+local nofhashed = 0
+
+local steps = nil
+local f_show = formatters["%w%s"]
+
+local function show_log()
+ if trace_steps == true then
+ report()
+ local w = #steps[1][1]
+ for i=1,#steps do
+ local s = steps[i]
+ report("%s%w%S %S",s[1],w - #s[1] + 3,s[2],s[3])
+ end
+ report()
+ end
+end
+
+local function show_1(wsplit)
+ local u = concat(wsplit," ")
+ steps = { { f_show(0,u), f_show(0,u) } }
+end
+
+local function show_2(c,m,wsplit,done,i,spec)
+ local s = lpegmatch(p_split,c)
+ local t = { }
+ local n = #m
+ local w = #wsplit
+ for j=1,n do
+ t[#t+1] = m[j]
+ t[#t+1] = s[j]
+ end
+ local m = 2*i-2
+ local l = #t
+ local s = spec and table.sequenced(spec) or ""
+ if m == 0 then
+ steps[#steps+1] = { f_show(m, concat(t,"",2)), f_show(1,concat(done," ",2,#done),s) }
+ elseif i+1 == w then
+ steps[#steps+1] = { f_show(m-1,concat(t,"",1,#t-1)), f_show(1,concat(done," ",2,#done),s) }
+ else
+ steps[#steps+1] = { f_show(m-1,concat(t)), f_show(1,concat(done," ",2,#done),s) }
+ end
+end
+
+local function show_3(wsplit,done)
+ local t = { }
+ local h = { }
+ local n = #wsplit
+ for i=1,n do
+ local w = wsplit[i]
+ if i > 1 then
+ local d = done[i]
+ t[#t+1] = i > 2 and d % 2 == 1 and "-" or " "
+ h[#h+1] = d
+ end
+ t[#t+1] = w
+ h[#h+1] = w
+ end
+ steps[#steps+1] = { f_show(0,concat(h)), f_show(0,concat(t)) }
+ show_log()
+end
+
+local function show_4(wsplit,done)
+ steps = { { concat(wsplit," ") } }
+ show_log()
+end
+
+function traditional.lasttrace()
+ return steps
+end
+
+-- We could reuse the w table but as we cache the resolved words
+-- there is not much gain in that complication.
+--
+-- Beware: word can be a table and when n is passed to we can
+-- assume reuse so we need to honor that n then.
+
+-- todo: a fast variant for tex ... less lookups (we could check is
+-- dictionary has changed) ... although due to caching the already
+-- done words, we don't do much here
+
+local function hyphenate(dictionary,word,n) -- odd is okay
+ nofwords = nofwords + 1
+ local hyphenated = dictionary.hyphenated
+ local isstring = type(word) == "string"
+ if isstring then
+ local done = hyphenated[word]
+ if done ~= nil then
+ return done
+ end
+ elseif n then
+ local done = hyphenated[concat(word,"",1,n)]
+ if done ~= nil then
+ return done
+ end
+ else
+ local done = hyphenated[concat(word)]
+ if done ~= nil then
+ return done
+ end
+ end
+ local key
+ if isstring then
+ key = word
+ word = lpegmatch(p_split,word)
+ if not n then
+ n = #word
+ end
+ else
+ if not n then
+ n = #word
+ end
+ key = concat(word,"",1,n)
+ end
+ local l = 1
+ local w = { "." }
+ for i=1,n do
+ local c = word[i]
+ l = l + 1
+ w[l] = lcchars[c] or c
+ end
+ l = l + 1
+ w[l] = "."
+ local c = concat(w,"",2,l-1)
+ --
+ local done = hyphenated[c]
+ if done ~= nil then
+ hyphenated[key] = done
+ nofhashed = nofhashed + 1
+ return done
+ end
+ --
+ local exceptions = dictionary.exceptions
+ local exception = exceptions[c]
+ if exception then
+ if trace_steps then
+ show_4(w,exception)
+ end
+ hyphenated[key] = exception
+ nofhashed = nofhashed + 1
+ return exception
+ end
+ --
+ if trace_steps then
+ show_1(w)
+ end
+ --
+ local specials = dictionary.specials
+ local patterns = dictionary.patterns
+ --
+-- inspect(specials)
+ local spec
+ for i=1,l do
+ for j=i,l do
+ local c = concat(w,"",i,j)
+ local m = patterns[c]
+ if m then
+ local s = specials[c]
+ if not done then
+ done = { }
+ spec = nil
+ -- the string that we resolve has explicit fences (.) so
+ -- done starts at the first fence and runs upto the last
+ -- one so we need one slot less
+ for i=1,l do
+ done[i] = 0
+ end
+ end
+ -- we run over the pattern that always has a (zero) value for
+ -- each character plus one more as we look at both sides
+ for k=1,#m do
+ local new = m[k]
+ if not new then
+ break
+ elseif new == true then
+ report("fatal error")
+ break
+ elseif new > 0 then
+ local pos = i + k - 1
+ local old = done[pos]
+ if not old then
+ -- break ?
+ elseif new > old then
+ done[pos] = new
+ if s then
+ local b = i + (s.start or 1) - 1
+ if b > 0 then
+ local e = b + (s.length or 2) - 1
+ if e > 0 then
+ if pos >= b and pos <= e then
+ if spec then
+ spec[pos] = { s, k - 1 }
+ else
+ spec = { [pos] = { s, k - 1 } }
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ if trace_steps and done then
+ show_2(c,m,w,done,i,s)
+ end
+ end
+ end
+ end
+ if trace_steps and done then
+ show_3(w,done)
+ end
+ if done then
+ local okay = false
+ for i=3,#done do
+ if done[i] % 2 == 1 then
+ done[i-2] = spec and spec[i] or true
+ okay = true
+ else
+ done[i-2] = false
+ end
+ end
+ if okay then
+ done[#done] = nil
+ done[#done] = nil
+ else
+ done = false
+ end
+ else
+ done = false
+ end
+ hyphenated[key] = done
+ nofhashed = nofhashed + 1
+ return done
+end
+
+function traditional.gettrace(language,word)
+ if not word or word == "" then
+ return
+ end
+ local dictionary = dictionaries[language]
+ if dictionary then
+ local hyphenated = dictionary.hyphenated
+ hyphenated[word] = nil
+ hyphenate(dictionary,word)
+ return steps
+ end
+end
+
+local methods = setmetatableindex(function(t,k) local v = hyphenate t[k] = v return v end)
+
+function traditional.installmethod(name,f)
+ if rawget(methods,name) then
+ report("overloading %a is not permitted",name)
+ else
+ methods[name] = f
+ end
+end
+
+local s_detail_1 = "-"
+local f_detail_2 = formatters["%s-%s"]
+local f_detail_3 = formatters["{%s}{%s}{}"]
+local f_detail_4 = formatters["{%s%s}{%s%s}{%s}"]
+
+function traditional.injecthyphens(dictionary,word,specification)
+ if not word then
+ return false
+ end
+ if not specification then
+ return word
+ end
+ local hyphens = hyphenate(dictionary,word)
+ if not hyphens then
+ return word
+ end
+
+ -- the following code is similar to code later on but here we have
+ -- strings while there we have hyphen specs
+
+ local word = lpegmatch(p_split,word)
+ local size = #word
+
+ local leftmin = specification.leftcharmin or 2
+ local rightmin = size - (specification.rightcharmin or leftmin)
+ local leftchar = specification.leftchar
+ local rightchar = specification.rightchar
+
+ local result = { }
+ local rsize = 0
+ local position = 1
+
+ while position <= size do
+ if position >= leftmin and position <= rightmin then
+ local hyphen = hyphens[position]
+ if not hyphen then
+ rsize = rsize + 1
+ result[rsize] = word[position]
+ position = position + 1
+ elseif hyphen == true then
+ rsize = rsize + 1
+ result[rsize] = word[position]
+ rsize = rsize + 1
+ if leftchar and rightchar then
+ result[rsize] = f_detail_3(rightchar,leftchar)
+ else
+ result[rsize] = s_detail_1
+ end
+ position = position + 1
+ else
+ local o, h = hyphen[2]
+ if o then
+ h = hyphen[1]
+ else
+ h = hyphen
+ o = 1
+ end
+ local b = position - o + (h.start or 1)
+ local e = b + (h.length or 2) - 1
+ if b > 0 and e >= b then
+ for i=1,b-position do
+ rsize = rsize + 1
+ result[rsize] = word[position]
+ position = position + 1
+ end
+ rsize = rsize + 1
+ if leftchar and rightchar then
+ result[rsize] = f_detail_4(h.before,rightchar,leftchar,h.after,concat(word,"",b,e))
+ else
+ result[rsize] = f_detail_2(h.before,h.after)
+ end
+ position = e + 1
+ else
+ -- error
+ rsize = rsize + 1
+ result[rsize] = word[position]
+ position = position + 1
+ end
+ end
+ else
+ rsize = rsize + 1
+ result[rsize] = word[position]
+ position = position + 1
+ end
+ end
+ return concat(result)
+end
+
+do
+
+ local word = C((1-space)^1)
+ local spaces = space^1
+
+ local u_pattern = (Carg(1) * Carg(2) * word / unregister_pattern + spaces)^1
+ local r_pattern = (Carg(1) * Carg(2) * word * Carg(3) / register_pattern + spaces)^1
+ local e_pattern = (Carg(1) * word / register_exception + spaces)^1
+
+ function traditional.registerpattern(language,str,specification)
+ local dictionary = dictionaries[language]
+ if specification == false then
+ lpegmatch(u_pattern,str,1,dictionary.patterns,dictionary.specials)
+ -- unregister_pattern(dictionary.patterns,dictionary.specials,str)
+ else
+ lpegmatch(r_pattern,str,1,dictionary.patterns,dictionary.specials,type(specification) == "table" and specification or false)
+ -- register_pattern(dictionary.patterns,dictionary.specials,str,specification)
+ end
+ end
+
+ function traditional.registerexception(language,str)
+ lpegmatch(e_pattern,str,1,dictionaries[language].exceptions)
+ end
+
+end
+
+-- todo: unicodes or utfhash ?
+
+if context then
+
+ local nodecodes = nodes.nodecodes
+ local disccodes = nodes.disccodes
+
+ local glyph_code = nodecodes.glyph
+ local disc_code = nodecodes.disc
+ local math_code = nodecodes.math
+ local hlist_code = nodecodes.hlist
+
+ local discretionary_code = disccodes.discretionary
+ local explicit_code = disccodes.explicit
+ local regular_code = disccodes.regular
+ local automatic_code = disccodes.automatic
+
+ local nuts = nodes.nuts
+ local tonut = nodes.tonut
+ local tonode = nodes.tonode
+ local nodepool = nuts.pool
+
+ local new_disc = nodepool.disc
+ local new_glyph = nodepool.glyph
+
+ local setfield = nuts.setfield
+ local getfield = nuts.getfield
+ local getfont = nuts.getfont
+ local getchar = nuts.getchar
+ local getid = nuts.getid
+ local getattr = nuts.getattr
+ local getnext = nuts.getnext
+ local getprev = nuts.getprev
+ local getsubtype = nuts.getsubtype
+ local getlist = nuts.getlist
+ local insert_before = nuts.insert_before
+ local insert_after = nuts.insert_after
+ local copy_node = nuts.copy
+ local remove_node = nuts.remove
+ local end_of_math = nuts.end_of_math
+ local node_tail = nuts.tail
+ local traverse_id = nuts.traverse_id
+
+ local setcolor = nodes.tracers.colors.set
+
+ local variables = interfaces.variables
+ local v_reset = variables.reset
+ local v_yes = variables.yes
+ local v_all = variables.all
+
+ local settings_to_array = utilities.parsers.settings_to_array
+
+ local unsetvalue = attributes.unsetvalue
+ local texsetattribute = tex.setattribute
+
+ local prehyphenchar = lang.prehyphenchar
+ local posthyphenchar = lang.posthyphenchar
+ local preexhyphenchar = lang.preexhyphenchar
+ local postexhyphenchar = lang.postexhyphenchar
+
+ local lccodes = characters.lccodes
+
+ local a_hyphenation = attributes.private("hyphenation")
+
+ function traditional.loadpatterns(language)
+ return dictionaries[language]
+ end
+
+ setmetatableindex(dictionaries,function(t,k) -- for the moment we use an independent data structure
+ if type(k) == "string" then
+ -- this will force a load if not yet loaded (we need a nicer way)
+ -- for the moment that will do (nneeded for examples that register
+ -- a pattern specification
+ languages.getnumber(k)
+ end
+ local specification = languages.getdata(k)
+ local dictionary = {
+ patterns = { },
+ exceptions = { },
+ hyphenated = { },
+ specials = { },
+ instance = false,
+ characters = { },
+ unicodes = { },
+ }
+ if specification then
+ local resources = specification.resources
+ if resources then
+ local characters = dictionary.characters or { }
+ local unicodes = dictionary.unicodes or { }
+ for i=1,#resources do
+ local r = resources[i]
+ if not r.in_dictionary then
+ r.in_dictionary = true
+ local patterns = r.patterns
+ if patterns then
+ local data = patterns.data
+ if data then
+ -- regular patterns
+ lpegmatch(p_pattern,data,1,dictionary.patterns,dictionary.specials)
+ end
+ local extra = patterns.extra
+ if extra then
+ -- special patterns
+ lpegmatch(p_pattern,extra,1,dictionary.patterns,dictionary.specials)
+ end
+ end
+ local exceptions = r.exceptions
+ if exceptions then
+ local data = exceptions.data
+ if data and data ~= "" then
+ lpegmatch(p_exception,data,1,dictionary.exceptions)
+ end
+ end
+ local usedchars = lpegmatch(p_split,patterns.characters)
+ for i=1,#usedchars do
+ local char = usedchars[i]
+ local code = utfbyte(char)
+ local upper = uccodes[code]
+ characters[char] = code
+ unicodes [code] = char
+ if type(upper) == "table" then
+ for i=1,#upper do
+ local u = upper[i]
+ unicodes[u] = utfchar(u)
+ end
+ else
+ unicodes[upper] = utfchar(upper)
+ end
+ end
+ end
+ end
+ dictionary.characters = characters
+ dictionary.unicodes = unicodes
+ setmetatableindex(characters,function(t,k) local v = k and utfbyte(k) t[k] = v return v end)
+ end
+ t[specification.number] = dictionary
+ dictionary.instance = specification.instance -- needed for hyphenchars
+ end
+ t[k] = dictionary
+ return dictionary
+ end)
+
+ -- Beware: left and right min doesn't mean that in a 1 mmm hsize there can be snippets
+ -- with less characters than either of them! This could be an option but such a narrow
+ -- hsize doesn't make sense anyway.
+
+ -- We assume that featuresets are defined global ... local definitions
+ -- (also mid paragraph) make not much sense anyway. For the moment we
+ -- assume no predefined sets so we don't need to store them. Nor do we
+ -- need to hash them in order to save space ... no sane user will define
+ -- many of them.
+
+ local featuresets = hyphenators.featuresets or { }
+ hyphenators.featuresets = featuresets
+
+ storage.shared.noflanguagesfeaturesets = storage.shared.noflanguagesfeaturesets or 0
+
+ local noffeaturesets = storage.shared.noflanguagesfeaturesets
+
+ storage.register("languages/hyphenators/featuresets",featuresets,"languages.hyphenators.featuresets")
+
+ ----- hash = table.sequenced(featureset,",") -- no need now
+
+ local function register(name,featureset)
+ noffeaturesets = noffeaturesets + 1
+ featureset.attribute = noffeaturesets
+ featuresets[noffeaturesets] = featureset -- access by attribute
+ featuresets[name] = featureset -- access by name
+ storage.shared.noflanguagesfeaturesets = noffeaturesets
+ return noffeaturesets
+ end
+
+ local function makeset(...) -- a bit overkill, supporting variants but who cares
+ local set = { }
+ for i=1,select("#",...) do
+ local list = select(i,...)
+ local kind = type(list)
+ local used = nil
+ if kind == "string" then
+ if list == v_all then
+ -- not ok ... now all get ignored
+ return setmetatableindex(function(t,k) local v = utfchar(k) t[k] = v return v end)
+ elseif list ~= "" then
+ used = lpegmatch(p_split,list)
+ set = set or { }
+ for i=1,#used do
+ local char = used[i]
+ set[utfbyte(char)] = char
+ end
+ end
+ elseif kind == "table" then
+ if next(list) then
+ set = set or { }
+ for byte, char in next, list do
+ set[byte] = char == true and utfchar(byte) or char
+ end
+ elseif #list > 0 then
+ set = set or { }
+ for i=1,#list do
+ local l = list[i]
+ if type(l) == "number" then
+ set[l] = utfchar(l)
+ else
+ set[utfbyte(l)] = l
+ end
+ end
+ end
+ end
+ end
+ return set
+ end
+
+ local defaulthyphens = {
+ [0x2D] = true, -- hyphen
+ [0xAD] = true, -- soft hyphen
+ }
+
+ local defaultjoiners = {
+ [0x200C] = true, -- nzwj
+ [0x200D] = true, -- zwj
+ }
+
+ local function somehyphenchar(c)
+ c = tonumber(c)
+ return c ~= 0 and c or nil
+ end
+
+ local function definefeatures(name,featureset)
+ local extrachars = featureset.characters -- "[]()"
+ local hyphenchars = featureset.hyphens
+ local joinerchars = featureset.joiners
+ local alternative = featureset.alternative
+ local rightwordmin = tonumber(featureset.rightwordmin)
+ local charmin = tonumber(featureset.charmin)
+ local leftcharmin = tonumber(featureset.leftcharmin)
+ local rightcharmin = tonumber(featureset.rightcharmin)
+ local rightedge = featureset.rightedge
+ local leftchar = somehyphenchar(featureset.leftchar)
+ local rightchar = somehyphenchar(featureset.rightchar)
+ --
+ joinerchars = joinerchars == v_yes and defaultjoiners or joinerchars
+ hyphenchars = hyphenchars == v_yes and defaulthyphens or hyphenchars
+ -- not yet ok: extrachars have to be ignored so it cannot be all)
+ featureset.extrachars = makeset(joinerchars or "",extrachars or "")
+ featureset.hyphenchars = makeset(hyphenchars or "")
+ featureset.alternative = alternative or "hyphenate"
+ featureset.rightwordmin = rightwordmin and rightwordmin > 0 and rightwordmin or nil
+ featureset.charmin = charmin and charmin > 0 and charmin or nil
+ featureset.leftcharmin = leftcharmin and leftcharmin > 0 and leftcharmin or nil
+ featureset.rightcharmin = rightcharmin and rightcharmin > 0 and rightcharmin or nil
+ featureset.leftchar = leftchar
+ featureset.rightchar = rightchar
+ featureset.strict = rightedge == 'tex'
+ --
+ return register(name,featureset)
+ end
+
+ local function setfeatures(n)
+ if not n or n == v_reset then
+ n = false
+ else
+ local f = featuresets[n]
+ if not f and type(n) == "string" then
+ local t = settings_to_array(n)
+ local s = { }
+ for i=1,#t do
+ local ti = t[i]
+ local fs = featuresets[ti]
+ if fs then
+ for k, v in next, fs do
+ s[k] = v
+ end
+ end
+ end
+ n = register(n,s)
+ else
+ n = f and f.attribute
+ end
+ end
+ texsetattribute(a_hyphenation,n or unsetvalue)
+ end
+
+ traditional.definefeatures = definefeatures
+ traditional.setfeatures = setfeatures
+
+ implement {
+ name = "definehyphenationfeatures",
+ actions = definefeatures,
+ arguments = {
+ "string",
+ {
+ { "characters" },
+ { "hyphens" },
+ { "joiners" },
+ { "rightwordmin", "integer" },
+ { "charmin", "integer" },
+ { "leftcharmin", "integer" },
+ { "rightcharmin", "integer" },
+ { "leftchar", "integer" },
+ { "rightchar", "integer" },
+ { "alternative" },
+ { "rightedge" },
+ }
+ }
+ }
+
+ implement {
+ name = "sethyphenationfeatures",
+ actions = setfeatures,
+ arguments = "string"
+ }
+
+ implement {
+ name = "registerhyphenationpattern",
+ actions = traditional.registerpattern,
+ arguments = { "string", "string", "boolean" }
+ }
+
+ implement {
+ name = "registerhyphenationexception",
+ actions = traditional.registerexception,
+ arguments = { "string", "string" }
+ }
+
+ -- This is a relative large function with local variables and local
+ -- functions. A previous implementation had the functions outside but
+ -- this is cleaner and as efficient. The test runs 100 times over
+ -- tufte.tex, knuth.tex, zapf.tex, ward.tex and darwin.tex in lower
+ -- and uppercase with a 1mm hsize.
+ --
+ -- language=0 language>0 4 | 3 * slower
+ --
+ -- tex 2.34 | 1.30 2.55 | 1.45 0.21 | 0.15
+ -- lua 2.42 | 1.38 3.30 | 1.84 0.88 | 0.46
+ --
+ -- Of course we have extra overhead (virtual Lua machine) but also we
+ -- check attributes and support specific local options). The test puts
+ -- the typeset text in boxes and discards it. If we also flush the
+ -- runtime is 4.31|2.56 and 4.99|2.94 seconds so the relative difference
+ -- is (somehow) smaller. The test has 536 pages. There is a little bit
+ -- of extra overhead because we store the patterns in a different way.
+ --
+ -- As usual I will look for speedups. Some 0.01 seconds could be gained
+ -- by sharing patterns which is not impressive but it does save some
+ -- 3M memory on this test. (Some optimizations already brought the 3.30
+ -- seconds down to 3.14 but it all depends on aggressive caching.)
+
+ -- As we kick in the hyphenator before fonts get handled, we don't look
+ -- at implicit (font) kerns or ligatures.
+
+ local starttiming = statistics.starttiming
+ local stoptiming = statistics.stoptiming
+
+ local strictids = {
+ [nodecodes.hlist] = true,
+ [nodecodes.vlist] = true,
+ [nodecodes.rule] = true,
+ [nodecodes.disc] = true,
+ [nodecodes.accent] = true,
+ [nodecodes.math] = true,
+ }
+
+ function traditional.hyphenate(head)
+
+ local first = tonut(head)
+ local tail = nil
+ local last = nil
+ local current = first
+ local dictionary = nil
+ local instance = nil
+ local characters = nil
+ local unicodes = nil
+ local exhyphenchar = tex.exhyphenchar
+ local extrachars = nil
+ local hyphenchars = nil
+ local language = nil
+ local start = nil
+ local stop = nil
+ local word = { } -- we reuse this table
+ local size = 0
+ local leftchar = false
+ local rightchar = false -- utfbyte("-")
+ local leftexchar = false
+ local rightexchar = false -- utfbyte("-")
+ local leftmin = 0
+ local rightmin = 0
+ local charmin = 1
+ local leftcharmin = nil
+ local rightcharmin = nil
+ ----- leftwordmin = nil
+ local rightwordmin = nil
+ local leftchar = nil
+ local rightchar = nil
+ local attr = nil
+ local lastwordlast = nil
+ local hyphenated = hyphenate
+ local strict = nil
+
+ -- We cannot use an 'enabled' boolean (false when no characters or extras) because we
+ -- can have plugins that set a characters metatable and so) ... it doesn't save much
+ -- anyway. Using (unicodes and unicodes[code]) and a nil table when no characters also
+ -- doesn't save much. So there not that much to gain for languages that don't hyphenate.
+ --
+ -- enabled = (unicodes and (next(unicodes) or getmetatable(unicodes))) or (extrachars and next(extrachars))
+ --
+ -- This can be used to not add characters i.e. keep size 0 but then we need to check for
+ -- attributes that change it, which costs time too. Not much to gain there.
+
+ starttiming(traditional)
+
+ local function synchronizefeatureset(a)
+ local f = a and featuresets[a]
+ if f then
+ hyphenated = methods[f.alternative or "hyphenate"]
+ extrachars = f.extrachars
+ hyphenchars = f.hyphenchars
+ rightwordmin = f.rightwordmin
+ charmin = f.charmin
+ leftcharmin = f.leftcharmin
+ rightcharmin = f.rightcharmin
+ leftchar = f.leftchar
+ rightchar = f.rightchar
+ strict = f.strict and strictids
+ if rightwordmin and rightwordmin > 0 and lastwordlast ~= rightwordmin then
+ -- so we can change mid paragraph but it's kind of unpredictable then
+ if not tail then
+ tail = node_tail(first)
+ end
+ last = tail
+ local inword = false
+ while last and rightwordmin > 0 do
+ local id = getid(last)
+ if id == glyph_code then
+ inword = true
+ if trace_visualize then
+ setcolor(last,"darkred")
+ end
+ elseif inword then
+ inword = false
+ rightwordmin = rightwordmin - 1
+ end
+ last = getprev(last)
+ end
+ lastwordlast = rightwordmin
+ end
+ if not charmin or charmin == 0 then
+ charmin = 1
+ end
+ else
+ hyphenated = methods.hyphenate
+ extrachars = false
+ hyphenchars = false
+ rightwordmin = false
+ charmin = 1
+ leftcharmin = false
+ rightcharmin = false
+ leftchar = false
+ rightchar = false
+ strict = false
+ end
+
+ return a
+ end
+
+ local function flush(hyphens) -- todo: no need for result
+
+ local rightmin = size - rightmin
+ local result = { }
+ local rsize = 0
+ local position = 1
+
+ -- todo: remember last dics and don't go back to before that (plus
+ -- message) .. for simplicity we also assume that we don't start
+ -- with a dics node
+ --
+ -- there can be a conflict: if we backtrack then we can end up in
+ -- another disc and get out of sync (dup chars and so)
+
+ while position <= size do
+ if position >= leftmin and position <= rightmin then
+ local hyphen = hyphens[position]
+ if not hyphen then
+ rsize = rsize + 1
+ result[rsize] = word[position]
+ position = position + 1
+ elseif hyphen == true then
+ rsize = rsize + 1
+ result[rsize] = word[position]
+ rsize = rsize + 1
+ result[rsize] = true
+ position = position + 1
+ else
+ local o, h = hyphen[2]
+ if o then
+ -- { hyphen, offset)
+ h = hyphen[1]
+ else
+ -- hyphen
+ h = hyphen
+ o = 1
+ end
+ local b = position - o + (h.start or 1)
+ local e = b + (h.length or 2) - 1
+ if b > 0 and e >= b then
+ for i=1,b-position do
+ rsize = rsize + 1
+ result[rsize] = word[position]
+ position = position + 1
+ end
+ rsize = rsize + 1
+ result[rsize] = {
+ h.before or "", -- pre
+ h.after or "", -- post
+ concat(word,"",b,e), -- replace
+ h.right, -- optional after pre
+ h.left, -- optional before post
+ }
+ position = e + 1
+ else
+ -- error
+ rsize = rsize + 1
+ result[rsize] = word[position]
+ position = position + 1
+ end
+ end
+ else
+ rsize = rsize + 1
+ result[rsize] = word[position]
+ position = position + 1
+ end
+ end
+
+ local function serialize(replacement,leftchar,rightchar)
+ if not replacement then
+ return
+ elseif replacement == true then
+ local glyph = copy_node(stop)
+ setfield(glyph,"char",leftchar or rightchar)
+ return glyph
+ end
+ local head = nil
+ local current = nil
+ if leftchar then
+ head = copy_node(stop)
+ current = head
+ setfield(head,"char",leftchar)
+ end
+ local rsize = #replacement
+ if rsize == 1 then
+ local glyph = copy_node(stop)
+ setfield(glyph,"char",characters[replacement])
+ if head then
+ insert_after(current,current,glyph)
+ else
+ head = glyph
+ end
+ current = glyph
+ elseif rsize > 0 then
+ local list = lpegmatch(p_split,replacement) -- this is an utf split (could be cached)
+ for i=1,#list do
+ local glyph = copy_node(stop)
+ setfield(glyph,"char",characters[list[i]])
+ if head then
+ insert_after(current,current,glyph)
+ else
+ head = glyph
+ end
+ current = glyph
+ end
+ end
+ if rightchar then
+ local glyph = copy_node(stop)
+ insert_after(current,current,glyph)
+ setfield(glyph,"char",rightchar)
+ end
+ return head
+ end
+
+ local current = start
+
+ local attributes = getfield(start,"attr") -- todo: just copy the last disc .. faster
+
+ for i=1,rsize do
+ local r = result[i]
+ if r == true then
+ local disc = new_disc()
+ if rightchar then
+ setfield(disc,"pre",serialize(true,rightchar))
+ end
+ if leftchar then
+ setfield(disc,"post",serialize(true,leftchar))
+ end
+ if attributes then
+ setfield(disc,"attr",attributes)
+ end
+ -- could be a replace as well
+ insert_before(first,current,disc)
+ elseif type(r) == "table" then
+ local disc = new_disc()
+ local pre = r[1]
+ local post = r[2]
+ local replace = r[3]
+ local right = r[4] ~= false and rightchar
+ local left = r[5] ~= false and leftchar
+ if pre and pre ~= "" then
+ setfield(disc,"pre",serialize(pre,false,right))
+ end
+ if post and post ~= "" then
+ setfield(disc,"post",serialize(post,left,false))
+ end
+ if replace and replace ~= "" then
+ setfield(disc,"replace",serialize(replace))
+ end
+ if attributes then
+ setfield(disc,"attr",attributes)
+ end
+ insert_before(first,current,disc)
+ else
+ setfield(current,"char",characters[r])
+ if i < rsize then
+ current = getnext(current)
+ end
+ end
+ end
+ if current and current ~= stop then
+ local current = getnext(current)
+ local last = getnext(stop)
+ while current ~= last do
+ first, current = remove_node(first,current,true)
+ end
+ end
+
+ end
+
+ local function inject(leftchar,rightchar,code,attributes)
+ if first ~= current then
+ local disc = new_disc()
+ first, current, glyph = remove_node(first,current)
+ first, current = insert_before(first,current,disc)
+ if trace_visualize then
+ setcolor(glyph,"darkred") -- these get checked
+ setcolor(disc,"darkgreen") -- in the colorizer
+ end
+ setfield(disc,"replace",glyph)
+ if not leftchar then
+ leftchar = code
+ end
+ if rightchar then
+ local glyph = copy_node(glyph)
+ setfield(glyph,"char",rightchar)
+ setfield(disc,"pre",glyph)
+ end
+ if leftchar then
+ local glyph = copy_node(glyph)
+ setfield(glyph,"char",leftchar)
+ setfield(disc,"post",glyph)
+ end
+ if attributes then
+ setfield(disc,"attr",attributes)
+ end
+ end
+ return current
+ end
+
+ local a = getattr(first,a_hyphenation)
+ if a ~= attr then
+ attr = synchronizefeatureset(a)
+ end
+
+ -- The first attribute in a word determines the way a word gets hyphenated
+ -- and if relevant, other properties are also set then. We could optimize for
+ -- silly one-char cases but it has no priority as the code is still not that
+ -- much slower than the native hyphenator and this variant also provides room
+ -- for extensions.
+
+ while current and current ~= last do -- and current
+ local id = getid(current)
+ if id == glyph_code then
+ local code = getchar(current)
+ local lang = getfield(current,"lang")
+ if lang ~= language then
+ if dictionary and size > charmin and leftmin + rightmin <= size then
+ if categories[word[1]] == "lu" and getfield(start,"uchyph") < 0 then
+ -- skip
+ else
+ local hyphens = hyphenated(dictionary,word,size)
+ if hyphens then
+ flush(hyphens)
+ end
+ end
+ end
+ language = lang
+ if language > 0 then
+ --
+ dictionary = dictionaries[language]
+ instance = dictionary.instance
+ characters = dictionary.characters
+ unicodes = dictionary.unicodes
+ --
+ local a = getattr(current,a_hyphenation)
+ attr = synchronizefeatureset(a)
+ leftchar = leftchar or (instance and posthyphenchar (instance)) -- we can make this more
+ rightchar = rightchar or (instance and prehyphenchar (instance)) -- efficient if needed
+ leftexchar = (instance and preexhyphenchar (instance))
+ rightexchar = (instance and postexhyphenchar(instance))
+ leftmin = leftcharmin or getfield(current,"left")
+ rightmin = rightcharmin or getfield(current,"right")
+ if not leftchar or leftchar < 0 then
+ leftchar = false
+ end
+ if not rightchar or rightchar < 0 then
+ rightchar = false
+ end
+ --
+ local char = unicodes[code] or (extrachars and extrachars[code])
+ if char then
+ word[1] = char
+ size = 1
+ start = current
+ else
+ size = 0
+ end
+ else
+ size = 0
+ end
+ elseif language <= 0 then
+ --
+ elseif size > 0 then
+ local char = unicodes[code] or (extrachars and extrachars[code])
+ if char then
+ size = size + 1
+ word[size] = char
+ elseif dictionary then
+ if size > charmin and leftmin + rightmin <= size then
+ if categories[word[1]] == "lu" and getfield(start,"uchyph") < 0 then
+ -- skip
+ else
+ local hyphens = hyphenated(dictionary,word,size)
+ if hyphens then
+ flush(hyphens)
+ end
+ end
+ end
+ size = 0
+ -- maybe also a strict mode here: no hyphenation before hyphenchars and skip
+ -- the next set (but then, strict is an option)
+ if code == exhyphenchar then
+ current = inject(leftexchar,rightexchar,code,getfield(current,"attr"))
+ elseif hyphenchars and hyphenchars[code] then
+ current = inject(leftchar,rightchar,code,getfield(current,"attr"))
+ end
+ end
+ else
+ local a = getattr(current,a_hyphenation)
+ if a ~= attr then
+ attr = synchronizefeatureset(a) -- influences extrachars
+ leftchar = leftchar or (instance and posthyphenchar (instance)) -- we can make this more
+ rightchar = rightchar or (instance and prehyphenchar (instance)) -- efficient if needed
+ leftexchar = (instance and preexhyphenchar (instance))
+ rightexchar = (instance and postexhyphenchar(instance))
+ leftmin = leftcharmin or getfield(current,"left")
+ rightmin = rightcharmin or getfield(current,"right")
+ if not leftchar or leftchar < 0 then
+ leftchar = false
+ end
+ if not rightchar or rightchar < 0 then
+ rightchar = false
+ end
+ end
+ --
+ local char = unicodes[code] or (extrachars and extrachars[code])
+ if char then
+ word[1] = char
+ size = 1
+ start = current
+ end
+ end
+ stop = current
+ current = getnext(current)
+ else
+ if id == disc_code then
+ local subtype = getsubtype(current)
+ if subtype == discretionary_code then -- \discretionary
+ size = 0
+ current = getnext(current)
+ elseif subtype == explicit_code then -- \- => only here
+ size = 0
+ current = getnext(current)
+ while current do
+ local id = getid(current)
+ if id == glyph_code or id == disc_code then
+ current = getnext(current)
+ else
+ break
+ end
+ end
+ -- todo: change to discretionary_code
+ else
+ -- automatic (-) : the hyphenator turns an exhyphen into glyph+disc
+ -- first : done by the hyphenator
+ -- second : done by the hyphenator
+ -- regular : done by the hyphenator
+ size = 0
+ current = getnext(current)
+ end
+ elseif strict and strict[id] then
+ current = id == math_code and getnext(end_of_math(current)) or getnext(current)
+ size = 0
+ else
+ current = id == math_code and getnext(end_of_math(current)) or getnext(current)
+ end
+ if size > 0 then
+ if dictionary and size > charmin and leftmin + rightmin <= size then
+ if categories[word[1]] == "lu" and getfield(start,"uchyph") < 0 then
+ -- skip
+ else
+ local hyphens = hyphenated(dictionary,word,size)
+ if hyphens then
+ flush(hyphens)
+ end
+ end
+ end
+ size = 0
+ end
+ end
+ end
+ -- we can have quit due to last so we need to flush the last seen word, we could move this in
+ -- the loop and test for current but ... messy
+ if dictionary and size > charmin and leftmin + rightmin <= size then
+ if categories[word[1]] == "lu" and getfield(start,"uchyph") < 0 then
+ -- skip
+ else
+ local hyphens = hyphenated(dictionary,word,size)
+ if hyphens then
+ flush(hyphens)
+ end
+ end
+ end
+
+ stoptiming(traditional)
+
+ return head, true
+ end
+
+ statistics.register("hyphenation",function()
+ if nofwords > 0 or statistics.elapsed(traditional) > 0 then
+ return string.format("%s words hyphenated, %s unique, used time %s",
+ nofwords,nofhashed,statistics.elapsedseconds(traditional) or 0)
+ end
+ end)
+
+ local texmethod = "builders.kernel.hyphenation"
+ local oldmethod = texmethod
+ local newmethod = texmethod
+
+ -- local newmethod = "languages.hyphenators.traditional.hyphenate"
+ --
+ -- nodes.tasks.prependaction("processors","words",newmethod)
+ -- nodes.tasks.disableaction("processors",oldmethod)
+ --
+ -- nodes.tasks.replaceaction("processors","words",oldmethod,newmethod)
+
+ -- \enabledirectives[hyphenators.method=traditional]
+ -- \enabledirectives[hyphenators.method=builtin]
+
+ -- push / pop ? check first attribute
+
+ -- local replaceaction = nodes.tasks.replaceaction -- no longer overload this way (too many local switches)
+
+ local hyphenate = lang.hyphenate
+ local expanders = languages.expanders
+ local methods = { }
+ local usedmethod = false
+ local stack = { }
+
+ local function original(head)
+ local done = hyphenate(head)
+ return head, done
+ end
+
+ local function expanded(head)
+ local done = hyphenate(head)
+ if done then
+ for d in traverse_id(disc_code,tonut(head)) do
+ local s = getsubtype(d)
+ if s ~= discretionary_code then
+ expanders[s](d,template)
+ done = true
+ end
+ end
+ end
+ return head, done
+ end
+
+ local getcount = tex.getcount
+
+ hyphenators.methods = methods
+ hyphenators.optimize = false
+
+ function hyphenators.handler(head,groupcode)
+ if usedmethod then
+ if groupcode == "hbox" and hyphenators.optimize then
+ if getcount("hyphenstate") > 0 then
+ forced = false
+ return usedmethod(head)
+ else
+ return head, false
+ end
+ else
+ return usedmethod(head)
+ end
+ else
+ return head, false
+ end
+ end
+
+ methods.tex = original
+ methods.original = original
+ methods.expanded = expanded
+ methods.traditional = languages.hyphenators.traditional.hyphenate
+ methods.none = false -- function(head) return head, false end
+
+ usedmethod = original
+
+ local function setmethod(method)
+ usedmethod = type(method) == "string" and methods[method]
+ if usedmethod == nil then
+ usedmethod = methods.tex
+ end
+ end
+ local function pushmethod(method)
+ insert(stack,usedmethod)
+ usedmethod = type(method) == "string" and methods[method]
+ if usedmethod == nil then
+ usedmethod = methods.tex
+ end
+ end
+ local function popmethod()
+ usedmethod = remove(stack) or methods.tex
+ end
+
+ hyphenators.setmethod = setmethod
+ hyphenators.pushmethod = pushmethod
+ hyphenators.popmethod = popmethod
+
+ directives.register("hyphenators.method",setmethod)
+
+ function hyphenators.setup(specification)
+ local method = specification.method
+ if method then
+ setmethod(method)
+ end
+ end
+
+ implement { name = "sethyphenationmethod", actions = setmethod, arguments = "string" }
+ implement { name = "pushhyphenation", actions = pushmethod, arguments = "string" }
+ implement { name = "pophyphenation", actions = popmethod }
+
+ -- can become a runtime loaded one:
+
+ local context = context
+ local ctx_NC = context.NC
+ local ctx_NR = context.NR
+ local ctx_verbatim = context.verbatim
+
+ function hyphenators.showhyphenationtrace(language,word)
+ if not word or word == "" then
+ return
+ end
+ local saved = trace_steps
+ trace_steps = "silent"
+ local steps = traditional.gettrace(language,word)
+ trace_steps = saved
+ if steps then
+ local n = #steps
+ if n > 0 then
+ context.starttabulate { "|r|l|l|l|" }
+ for i=1,n do
+ local s = steps[i]
+ ctx_NC() if i > 1 and i < n then context(i-1) end
+ ctx_NC() ctx_verbatim(s[1])
+ ctx_NC() ctx_verbatim(s[2])
+ ctx_NC() ctx_verbatim(s[3])
+ ctx_NC()
+ ctx_NR()
+ end
+ context.stoptabulate()
+ end
+ end
+ end
+
+ implement {
+ name = "showhyphenationtrace",
+ actions = hyphenators.showhyphenationtrace,
+ arguments = { "string", "string" }
+ }
+
+ function nodes.stripdiscretionaries(head)
+ local h = tonut(head)
+ for l in traverse_id(hlist_code,h) do
+ for d in traverse_id(disc_code,getlist(l)) do
+ remove_node(h,false,true)
+ end
+ end
+ return tonode(h)
+ end
+
+
+else
+
+-- traditional.loadpatterns("nl","lang-nl")
+-- traditional.loadpatterns("de","lang-de")
+-- traditional.loadpatterns("us","lang-us")
+
+-- traditional.registerpattern("nl","e1ë", { start = 1, length = 2, before = "e", after = "e" } )
+-- traditional.registerpattern("nl","oo7ë", { start = 2, length = 3, before = "o", after = "e" } )
+-- traditional.registerpattern("de","qqxc9xkqq",{ start = 3, length = 4, before = "ab", after = "cd" } )
+
+-- local specification = {
+-- leftcharmin = 2,
+-- rightcharmin = 2,
+-- leftchar = "<",
+-- rightchar = ">",
+-- }
+
+-- print("reëel", traditional.injecthyphens(dictionaries.nl,"reëel", specification),"r{e>}{<e}{eë}el")
+-- print("reeëel", traditional.injecthyphens(dictionaries.nl,"reeëel", specification),"re{e>}{<e}{eë}el")
+-- print("rooëel", traditional.injecthyphens(dictionaries.nl,"rooëel", specification),"r{o>}{<e}{ooë}el")
+
+-- print( "qxcxkq", traditional.injecthyphens(dictionaries.de, "qxcxkq", specification),"")
+-- print( "qqxcxkqq", traditional.injecthyphens(dictionaries.de, "qqxcxkqq", specification),"")
+-- print( "qqqxcxkqqq", traditional.injecthyphens(dictionaries.de, "qqqxcxkqqq", specification),"")
+-- print("qqqqxcxkqqqq",traditional.injecthyphens(dictionaries.de,"qqqqxcxkqqqq",specification),"")
+
+-- print("kunstmatig", traditional.injecthyphens(dictionaries.nl,"kunstmatig", specification),"")
+-- print("kunststofmatig", traditional.injecthyphens(dictionaries.nl,"kunststofmatig", specification),"")
+-- print("kunst[stof]matig", traditional.injecthyphens(dictionaries.nl,"kunst[stof]matig", specification),"")
+
+-- traditional.loadpatterns("us","lang-us")
+
+-- local specification = {
+-- leftcharmin = 2,
+-- rightcharmin = 2,
+-- leftchar = false,
+-- rightchar = false,
+-- }
+
+-- trace_steps = true
+
+-- print("components", traditional.injecthyphens(dictionaries.us,"components", specification),"")
+-- print("single", traditional.injecthyphens(dictionaries.us,"single", specification),"sin-gle")
+-- print("everyday", traditional.injecthyphens(dictionaries.us,"everyday", specification),"every-day")
+-- print("associate", traditional.injecthyphens(dictionaries.us,"associate", specification),"as-so-ciate")
+-- print("philanthropic", traditional.injecthyphens(dictionaries.us,"philanthropic", specification),"phil-an-thropic")
+-- print("projects", traditional.injecthyphens(dictionaries.us,"projects", specification),"projects")
+-- print("Associate", traditional.injecthyphens(dictionaries.us,"Associate", specification),"As-so-ciate")
+-- print("Philanthropic", traditional.injecthyphens(dictionaries.us,"Philanthropic", specification),"Phil-an-thropic")
+-- print("Projects", traditional.injecthyphens(dictionaries.us,"Projects", specification),"Projects")
+
+end
+
diff --git a/Master/texmf-dist/tex/context/base/lang-hyp.mkiv b/Master/texmf-dist/tex/context/base/lang-hyp.mkiv
new file mode 100644
index 00000000000..927f5a0576f
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/lang-hyp.mkiv
@@ -0,0 +1,267 @@
+%D \module
+%D [ file=lang-ini,
+%D version=2014.08.10,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Experimental Patterns,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This is an experimental module. We often have to deal with titles
+%D that have conflicting demands:
+%D
+%D \startitemize
+%D \startitem They go into a dedicated space (often a graphic). \stopitem
+%D \startitem The words cannot be hyphenated. \stopitem
+%D \startitem But as an escape they can get hyphenated. \stopitem
+%D \startitem In that case we want at least an extra word on the last line. \stopitem
+%D \stopitemize
+%D
+%D These and maybe more cases can be dealt with using dedicated hyphenation
+%D mechanisms. At he same time we want to experiment with more extensive patterns
+%D as discussed in {\em TUGboat, Volume 27 (2006), No. 2—Proceedings of EuroTEX2006}.
+
+% lua: 5.341 5.354
+% tex: 5.174 5.262
+
+\writestatus{loading}{ConTeXt Language Macros / Initialization}
+
+\registerctxluafile{lang-dis}{1.001}
+\registerctxluafile{lang-hyp}{1.001}
+
+\unprotect
+
+\definesystemattribute[hyphenation][public]
+
+%D This command can change! At some point we will keep the setting with the
+%D paragraph and then the \type {\par} can go.
+
+% \unexpanded\def\atleastoneword#1%
+% {\begingroup
+% \enabledirectives[hyphenators.method=traditional]%
+% \enabledirectives[hyphenators.rightwordsmin=1]%
+% \lefthyphenmin \plusfour
+% \righthyphenmin\plusfour
+% #1\par
+% \disabledirectives[hyphenators.rightwordsmin]%
+% \enabledirectives[hyphenators.method]%
+% \endgroup}
+
+
+% \exhyphenchar \hyphenasciicode
+% \preexhyphenchar \lessthanasciicode
+% \postexhyphenchar\morethanasciicode
+
+%D Here is the real way:
+
+\installcorenamespace{hyphenation}
+\installcorenamespace{hyphenationfeatures}
+
+\installparameterhandler \??hyphenation {hyphenation}
+\installsetuphandler \??hyphenation {hyphenation}
+
+\setuphyphenation
+ [\c!method=\s!default,
+ \s!righthyphenchar=0, % number tzt g: etc
+ \s!lefthyphenchar=0] % number
+
+\appendtoks
+ \clf_sethyphenationmethod{\hyphenationparameter\c!method}%
+\to \everysetuphyphenation
+
+%D These are mostly meant for manuals:
+
+\unexpanded\def\starthyphenation[#1]%
+ {\begingroup
+ \clf_pushhyphenation{#1}}
+
+\unexpanded\def\stophyphenation
+ {\ifhmode\par\fi
+ \clf_pophyphenation
+ \endgroup}
+
+% This is a global setting, so we need to disable it when needed. However, as
+% we are (hopefully) compatible and attribute driven one can also just keep it
+% enabled.
+%
+% \setuphyphenation
+% [\c!method=\s!traditional] % no translations
+
+\unexpanded\def\definehyphenationfeatures
+ {\dodoubleargument\lang_hyphenation_define_features}
+
+\unexpanded\def\lang_hyphenation_define_features[#1][#2]%
+ {\begingroup
+ \letdummyparameter\c!characters\empty % maybe \s!
+ \letdummyparameter\c!hyphens\empty % maybe \s!
+ \letdummyparameter\c!joiners\empty % maybe \s!
+ \letdummyparameter\c!rightwords\zerocount % maybe \s!
+ \letdummyparameter\s!lefthyphenmin\zerocount
+ \letdummyparameter\s!righthyphenmin\zerocount
+ \letdummyparameter\s!hyphenmin\zerocount
+ \letdummyparameter\s!lefthyphenchar\zerocount
+ \letdummyparameter\s!righthyphenchar\zerocount
+ \letdummyparameter\c!alternative\empty
+ \letdummyparameter\c!rightedge\empty
+ \getdummyparameters[#2]%
+ \clf_definehyphenationfeatures
+ {#1}%
+ {
+ characters {\dummyparameter\c!characters}%
+ hyphens {\dummyparameter\c!hyphens}%
+ joiners {\dummyparameter\c!joiners}%
+ rightwordmin \numexpr\dummyparameter\c!rightwords\relax
+ charmin \numexpr\dummyparameter\s!hyphenmin\relax
+ leftcharmin \numexpr\dummyparameter\s!lefthyphenmin\relax
+ rightcharmin \numexpr\dummyparameter\s!righthyphenmin\relax
+ leftchar \numexpr\dummyparameter\s!lefthyphenchar\relax
+ rightchar \numexpr\dummyparameter\s!righthyphenchar\relax
+ alternative {\dummyparameter\c!alternative}%
+ rightedge {\dummyparameter\c!rightedge}%
+ }%
+ \relax
+ \endgroup}
+
+\unexpanded\def\sethyphenationfeatures[#1]%
+ {\clf_sethyphenationfeatures{#1}}
+
+% todo: \start ... \stop too
+
+\unexpanded\def\registerhyphenationpattern
+ {\dodoubleempty\lang_hyphenation_register_pattern}
+
+\def\lang_hyphenation_register_pattern[#1][#2]%
+ {\clf_registerhyphenationpattern\ifsecondargument{#1}{#2}\else{\currentlanguage}{#1}\fi\s!true\relax}
+
+\unexpanded\def\unregisterhyphenationpattern
+ {\dodoubleempty\lang_hyphenation_unregister_pattern}
+
+\def\lang_hyphenation_unregister_pattern[#1][#2]%
+ {\clf_registerhyphenationpattern\ifsecondargument{#1}{#2}\else{\currentlanguage}{#1}\fi\s!false\relax}
+
+\unexpanded\def\registerhyphenationexception
+ {\dodoubleempty\lang_hyphenation_register_exception}
+
+\def\lang_hyphenation_register_exception[#1][#2]%
+ {\clf_registerhyphenationexception\ifsecondargument{#1}{#2}\else{\currentlanguage}{#1}\fi\relax}
+
+\unexpanded\def\showhyphenationtrace
+ {\dodoubleempty\lang_hyphenation_show_trace}
+
+\def\lang_hyphenation_show_trace[#1][#2]%
+ {\begingroup
+ \tt
+ \clf_showhyphenationtrace\ifsecondargument{#1}{#2}\else{\currentlanguage}{#1}\fi\relax
+ \endgroup}
+
+% For old times sake:
+
+\unexpanded\def\atleastoneword#1%
+ {\begingroup
+ \starthyphenation[\c!method=traditional]% this might become default or a faster switch
+ \sethyphenationfeatures[words]%
+ #1\par
+ \stopthyphenation
+ \endgroup}
+
+%D For me:
+
+\unexpanded\def\showdiscretionaries
+ {\clf_showdiscretionaries}
+
+%D These are (at least now) not cummulative:
+
+\definehyphenationfeatures % just an example
+ [fences]
+ [\c!characters={[]()}]
+
+\definehyphenationfeatures
+ [words]
+ [\c!rightwords=1,
+ \s!lefthyphenmin=4,
+ \s!righthyphenmin=4]
+
+\definehyphenationfeatures
+ [default]
+ [%c!rightedge=\v!tex,
+ \c!hyphens=\v!yes,
+ \c!joiners=\v!yes]
+
+\definehyphenationfeatures
+ [strict]
+ [\c!rightedge=\s!tex]
+
+% \sethyphenationfeatures
+% [fences]
+
+% \sethyphenationfeatures
+% [default,fences]
+
+% \setuphyphenation % will be default
+% [method=expanded]
+
+\protect \endinput
+
+% \starttext
+%
+% \enabledirectives[hyphenators.method=traditional]
+%
+% % \dorecurse{1000}{\input tufte \par}
+%
+% \setupalign[verytolerant,flushleft]
+% \setuplayout[width=140pt] \showframe
+%
+% longword longword long word longword longwordword \blank
+%
+% \enabledirectives[hyphenators.rightwordsmin=1]
+%
+% longword longword long word longword longwordword\blank
+%
+% \disabledirectives[hyphenators.rightwordsmin]
+%
+% longword longword long word longword longwordword\blank
+%
+% \atleastoneword{longword longword long word longword longwordword}
+%
+% \enabledirectives[hyphenators.method=traditional]
+%
+% \stoptext
+
+% \startluacode
+% -- e1ë/e=e reëel re-eel
+% -- a1atje./a=t,1,3 omaatje oma-tje
+% -- schif1f/ff=f,5,2 Schiffahrt Schiff-fahrt
+%
+% languages.hyphenators.traditional.registerpattern("en","a1b", { start = 1, length = 2, before = "CD", after = "EF" } )
+% languages.hyphenators.traditional.registerpattern("en","e1ë", { start = 1, length = 2, before = "e", after = "e" } )
+% languages.hyphenators.traditional.registerpattern("en","oo1ë", { start = 2, length = 2, before = "o", after = "e" } )
+% languages.hyphenators.traditional.registerpattern("en","qqxc9xkqq",{ start = 3, length = 4, before = "ab", after = "cd" } ) -- replacement start length
+%
+% -- print("reëel", injecthyphens(dictionaries.nl,"reëel", 2,2))
+% -- print("reeëel", injecthyphens(dictionaries.nl,"reeëel", 2,2))
+% -- print("rooëel", injecthyphens(dictionaries.nl,"rooëel", 2,2))
+% -- print( "QXcXkQ", injecthyphens(dictionaries.de, "QXcXkQ", 2,2))
+% -- print( "QQXcXkQQ", injecthyphens(dictionaries.de, "QQXcXkQQ", 2,2))
+% -- print( "QQQXcXkQQQ", injecthyphens(dictionaries.de, "QQQXcXkQQQ", 2,2))
+% -- print("QQQQXcXkQQQQ",injecthyphens(dictionaries.de,"QQQQXcXkQQQQ",2,2))
+% --
+% -- print( "QQXcXkQQ QQXcXkQQ", injecthyphens(dictionaries.de, "QQXcXkQQ QQXcXkQQ", 2,2))
+% \stopluacode
+%
+% \starttext
+%
+% \blank
+%
+% xreëel rooëel \par xxabxx xxxabxxx \par
+%
+% \hsize1mm \lefthyphenmin2 \righthyphenmin2
+%
+% \blank Capacity \blank capacity \blank xyabxy \blank xreëel \blank rooëel \blank
+%
+% xy\discretionary{CD}{EF}{ab}xy % xxacceedxxx
+%
+% \stoptext
diff --git a/Master/texmf-dist/tex/context/base/lang-ini.lua b/Master/texmf-dist/tex/context/base/lang-ini.lua
index a9f428caa97..d75a665e2be 100644
--- a/Master/texmf-dist/tex/context/base/lang-ini.lua
+++ b/Master/texmf-dist/tex/context/base/lang-ini.lua
@@ -21,16 +21,22 @@ local utfbyte = utf.byte
local format, gsub = string.format, string.gsub
local concat, sortedkeys, sortedpairs = table.concat, table.sortedkeys, table.sortedpairs
+local context = context
+local commands = commands
+local implement = interfaces.implement
+
local settings_to_array = utilities.parsers.settings_to_array
local trace_patterns = false trackers.register("languages.patterns", function(v) trace_patterns = v end)
local report_initialization = logs.reporter("languages","initialization")
-local prehyphenchar = lang.prehyphenchar -- global per language
-local posthyphenchar = lang.posthyphenchar -- global per language
-local lefthyphenmin = lang.lefthyphenmin
-local righthyphenmin = lang.righthyphenmin
+local prehyphenchar = lang.prehyphenchar -- global per language
+local posthyphenchar = lang.posthyphenchar -- global per language
+local preexhyphenchar = lang.preexhyphenchar -- global per language
+local postexhyphenchar = lang.postexhyphenchar -- global per language
+local lefthyphenmin = lang.lefthyphenmin
+local righthyphenmin = lang.righthyphenmin
local lang = lang
lang.exceptions = lang.hyphenation
@@ -53,9 +59,9 @@ local numbers = languages.numbers
languages.data = languages.data or { }
local data = languages.data
-storage.register("languages/numbers", numbers, "languages.numbers")
storage.register("languages/registered",registered,"languages.registered")
storage.register("languages/associated",associated,"languages.associated")
+storage.register("languages/numbers", numbers, "languages.numbers")
storage.register("languages/data", data, "languages.data")
local nofloaded = 0
@@ -73,6 +79,9 @@ local function resolve(tag)
end
local function tolang(what) -- returns lang object
+ if not what then
+ what = tex.language
+ end
local tag = numbers[what]
local data = tag and registered[tag] or registered[what]
if data then
@@ -85,6 +94,14 @@ local function tolang(what) -- returns lang object
end
end
+function languages.getdata(tag) -- or number
+ if tag then
+ return registered[tag] or registered[numbers[tag]]
+ else
+ return registered[numbers[tex.language]]
+ end
+end
+
-- languages.tolang = tolang
-- patterns=en
@@ -115,7 +132,10 @@ local function loaddefinitions(tag,specification)
if trace_patterns then
report_initialization("pattern specification for language %a: %s",tag,specification.patterns)
end
- local dataused, ok = data.used, false
+ local dataused = data.used
+ local ok = false
+ local resources = data.resources or { }
+ data.resources = resources
for i=1,#definitions do
local definition = definitions[i]
if definition == "" then
@@ -137,13 +157,15 @@ local function loaddefinitions(tag,specification)
report_initialization("loading definition %a for language %a from %a",definition,tag,fullname)
end
local suffix, gzipped = gzip.suffix(fullname)
- local defs = table.load(fullname,gzipped and gzip.load)
- if defs then -- todo: version test
+ local loaded = table.load(fullname,gzipped and gzip.load)
+ if loaded then -- todo: version test
ok, nofloaded = true, nofloaded + 1
- -- instance:patterns (defs.patterns and defs.patterns .data or "")
- -- instance:hyphenation(defs.exceptions and defs.exceptions.data or "")
- instance:patterns (validdata(defs.patterns, "patterns", tag) or "")
- instance:hyphenation(validdata(defs.exceptions,"exceptions",tag) or "")
+ -- instance:patterns (loaded.patterns and resources.patterns .data or "")
+ -- instance:hyphenation(loaded.exceptions and resources.exceptions.data or "")
+ instance:patterns (validdata(loaded.patterns, "patterns", tag) or "")
+ instance:hyphenation(validdata(loaded.exceptions,"exceptions",tag) or "")
+ resources[#resources+1] = loaded -- so we can use them otherwise
+
else
report_initialization("invalid definition %a for language %a in %a",definition,tag,filename)
end
@@ -286,10 +308,12 @@ 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
+function languages.prehyphenchar (what) return prehyphenchar (tolang(what)) end
+function languages.posthyphenchar (what) return posthyphenchar (tolang(what)) end
+function languages.preexhyphenchar (what) return preexhyphenchar (tolang(what)) end
+function languages.postexhyphenchar(what) return postexhyphenchar(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{}{}{}'
@@ -351,7 +375,7 @@ languages.associate('fr','latn','fra')
statistics.register("loaded patterns", function()
local result = languages.logger.report()
if result ~= "none" then
--- return result
+ -- return result
return format("%s, load time: %s",result,statistics.elapsedtime(languages))
end
end)
@@ -363,17 +387,58 @@ end)
-- interface
-local getnumber = languages.getnumber
+implement {
+ name = "languagenumber",
+ actions = { languages.getnumber, context },
+ arguments = { "string", "string", "string" }
+}
-function commands.languagenumber(tag,default,patterns)
- context(getnumber(tag,default,patterns))
-end
+implement {
+ name = "installedlanguages",
+ actions = { languages.installed, context },
+}
-function commands.installedlanguages(separator)
- context(languages.installed(separator))
-end
+implement {
+ name = "definelanguage",
+ actions = languages.define,
+ arguments = { "string", "string" }
+}
-commands.definelanguage = languages.define
-commands.setlanguagesynonym = languages.setsynonym
-commands.unloadlanguage = languages.unload
-commands.setlanguageexceptions = languages.setexceptions
+implement {
+ name = "setlanguagesynonym",
+ actions = languages.setsynonym,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "unloadlanguage",
+ actions = languages.unload,
+ arguments = { "string" }
+}
+
+implement {
+ name = "setlanguageexceptions",
+ actions = languages.setexceptions,
+ arguments = { "string", "string" }
+}
+
+
+implement {
+ name = "currentprehyphenchar",
+ actions = function()
+ local c = prehyphenchar(tolang())
+ if c and c > 0 then
+ context.char(c)
+ end
+ end
+}
+
+implement {
+ name = "currentposthyphenchar",
+ actions = function()
+ local c = posthyphenchar(tolang())
+ if c and c > 0 then
+ context.char(c)
+ end
+ end
+}
diff --git a/Master/texmf-dist/tex/context/base/lang-ini.mkiv b/Master/texmf-dist/tex/context/base/lang-ini.mkiv
index 4ed7839bddc..335d6d1c9d0 100644
--- a/Master/texmf-dist/tex/context/base/lang-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/lang-ini.mkiv
@@ -111,6 +111,44 @@
\csname\??language\s!default#2\endcsname
\fi\fi\fi}
+\def\mainlanguageparameter#1%
+ {\ifcsname\??language\currentmainlanguage#1\endcsname
+ \csname\??language\currentmainlanguage#1\endcsname
+ \else\ifcsname\??language\currentmainlanguage\s!default\endcsname
+ \expandafter\specificlanguageparameter\csname\??language\currentmainlanguage\s!default\endcsname{#1}%
+ \else\ifcsname\??language\s!default#1\endcsname
+ \csname\??language\s!default#1\endcsname
+ \fi\fi\fi}
+
+\def\currentusedlanguage{\currentlanguage}
+
+\let\usedlanguageparameter\languageparameter
+
+\def\askedlanguageparameter#1% assumes \currentusedlanguage being set
+ {\ifcsname\??language\currentusedlanguage#1\endcsname
+ \csname\??language\currentusedlanguage#1\endcsname
+ \else\ifcsname\??language\currentusedlanguage\s!default\endcsname
+ \expandafter\specificlanguageparameter\csname\??language\currentusedlanguage\s!default\endcsname{#1}%
+ \else\ifcsname\??language\s!default#1\endcsname
+ \csname\??language\s!default#1\endcsname
+ \fi\fi\fi}
+
+\unexpanded\def\setlanguageparameter#1%
+ {\edef\currentusedlanguage{\reallanguagetag{#1\c!language}}%
+ %\let\setlanguageparameter\gobbleoneargument
+ \ifx\currentusedlanguage\empty
+ \let\currentusedlanguage \currentlanguage
+ \let\usedlanguageparameter\languageparameter
+ \else\ifx\currentusedlanguage\v!global
+ \let\currentusedlanguage \currentmainlanguage
+ \let\usedlanguageparameter\mainlanguageparameter
+ \else\ifx\currentusedlanguage\v!local
+ \let\currentusedlanguage \currentlanguage
+ \let\usedlanguageparameter\languageparameter
+ \else
+ \let\usedlanguageparameter\askedlanguageparameter
+ \fi\fi\fi}
+
\unexpanded\def\setupcurrentlanguage[#1]%
{\setcurrentlanguage\currentmainlanguage{#1}}
@@ -162,7 +200,6 @@
%D implementations support run time addition of patterns to a
%D preloaded format).
-
%D \macros
%D {preloadlanguages}
%D
@@ -174,15 +211,17 @@
\newtoks \everysetuplanguage
-\def\installedlanguages{\ctxcommand{installedlanguages()}}
+\def\installedlanguages{\clf_installedlanguages}
-\unexpanded\def\doiflanguageelse#1%
+\unexpanded\def\doifelselanguage#1%
{\ifcsname\??language#1\c!state\endcsname
\expandafter\firstoftwoarguments
\else
\expandafter\secondoftwoarguments
\fi}
+\let\doiflanguageelse\doifelselanguage
+
\def\reallanguagetag#1%
{\ifcsname\??languagelinked#1\endcsname\csname\??languagelinked#1\endcsname\else#1\fi}
@@ -192,17 +231,17 @@
{\dodoubleargument\lang_basics_install}
\def\lang_basics_install[#1][#2]%
- {\doifassignmentelse{#2}
- {\doiflanguageelse{#1}
+ {\doifelseassignment{#2}
+ {\doifelselanguage{#1}
{\getparameters[\??language#1][#2]}
{\setvalue{\??languagelinked#1}{#1}%
\lang_basics_install_indeed{#1}{#1}%
\getparameters[\??language#1][\c!state=\v!start,#2]}%
\edef\currentsetuplanguage{#1}%
- \ctxcommand{definelanguage("#1","\specificlanguageparameter{#1}\s!default")}%
+ \clf_definelanguage{#1}{\specificlanguageparameter{#1}\s!default}%
\the\everysetuplanguage}
{\setvalue{\??languagelinked#1}{#2}%
- \ctxcommand{setlanguagesynonym("#1","#2")}%
+ \clf_setlanguagesynonym{#1}{#2}%
\lang_basics_install_indeed{#1}{#2}}}
\def\lang_basics_install_indeed#1#2%
@@ -213,7 +252,7 @@
%D used dutch mnemonics in the dutch version, but nowadays
%D conform a standard.
-\unexpanded\def\doifpatternselse#1%
+\unexpanded\def\doifelsepatterns#1%
{\begingroup % will change
\lang_basics_set_current[#1]%
\ifnum\normallanguage>\zerocount
@@ -222,6 +261,8 @@
\endgroup\expandafter\secondoftwoarguments
\fi}
+\let\doifpatternselse\doifelsepatterns
+
%D \macros
%D {setuplanguage}
%D
@@ -254,7 +295,7 @@
\lang_basics_synchronize}
\appendtoks
- \ctxcommand{unloadlanguage("\currentsetuplanguage")}%
+ \clf_unloadlanguage{\currentsetuplanguage}%
\to \everysetuplanguage
\setuplanguage
@@ -354,13 +395,58 @@
\newtoks \everylanguage
+% \def\lang_basics_synchronize% assumes that \currentlanguage is set % % % use different name as complex
+% {\normallanguage\ctxcommand{languagenumber(%
+% "\currentlanguage",%
+% "\defaultlanguage\currentlanguage",%
+% "\languageparameter\s!patterns"%
+% )}\relax
+% \the\everylanguage\relax}
+
+% (some 20%) faster but code jungle (the publication code can have excessive
+% switching
+
+\installcorenamespace{languagenumbers}
+
+\appendtoks
+ % we need to reassign the number because new patterns can be defined later on
+ % so let's hope not that many \setups happen during a run
+ \global\expandafter\let\csname\??languagenumbers\currentlanguage\endcsname\undefined
+\to \everysetuplanguage
+
+\def\lang_basics_synchronize_yes
+ {\zerocount % see below
+ \global\expandafter\chardef\csname\??languagenumbers\currentlanguage\endcsname
+ \clf_languagenumber
+ {\currentlanguage}%
+ {\defaultlanguage\currentlanguage}%
+ {\languageparameter\s!patterns}%
+ \relax
+ \normallanguage\csname\??languagenumbers\currentlanguage\endcsname}
+
+\let\lang_basics_synchronize_nop\zerocount % not loaded anyway
+
+\letvalue{\??languagenumbers}\lang_basics_synchronize_nop % initime
+
+\appendtoks
+ \letvalue{\??languagenumbers}\lang_basics_synchronize_yes % runtime
+\to \everydump
+
\def\lang_basics_synchronize% assumes that \currentlanguage is set % % % use different name as complex
- {\normallanguage\ctxcommand{languagenumber(%
- "\currentlanguage",%
- "\defaultlanguage\currentlanguage",%
- "\languageparameter\s!patterns"%
- )}\relax
- \the\everylanguage\relax}
+ {\normallanguage\csname\??languagenumbers
+ \ifcsname\??languagenumbers\currentlanguage\endcsname
+ \currentlanguage
+ \fi
+ \endcsname
+ \relax
+ \the\everylanguage
+ \relax}
+
+% experimental
+
+\newcount\hyphenstate
+
+% so far
\newcount\hyphenminoffset
@@ -479,7 +565,11 @@
\lang_basics_switch_asked}
\unexpanded\def\language
- {\doifnextoptionalcselse\lang_basics_set_current\normallanguage}
+ {\doifelsenextoptionalcs\lang_basics_set_current\normallanguage}
+
+\let\setlanguage\language % we make these synonyms
+
+\let\patterns\gobbleoneargument
\newcount\mainlanguagenumber
@@ -647,7 +737,7 @@
\ifx\askedlanguage\empty
\let\askedlanguage\currentlanguage
\fi
- \ctxcommand{setlanguageexceptions("\askedlanguage",\!!bs#2\!!es)}%
+ \clf_setlanguageexceptions{\askedlanguage}{#2}%
\endgroup}
%D For the moment here:
@@ -655,4 +745,18 @@
\uchyph 1 % also treat uppercase
\exhyphenchar 45 % to permit breaking at explicit hyphens
+%D New:
+
+\unexpanded\def\traceddiscretionary#1#2#3%
+ {\dontleavehmode
+ \discretionary{\darkred#1}{\darkgreen#2}{\darkblue#3}}
+
+\unexpanded\def\samplediscretionary
+ {\traceddiscretionary
+ {pre\clf_currentprehyphenchar}%
+ {\clf_currentposthyphenchar post}%
+ {replace}}
+
+% todo: make this configurable
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/lang-lab.lua b/Master/texmf-dist/tex/context/base/lang-lab.lua
index 91c258418c9..e90bee017cf 100644
--- a/Master/texmf-dist/tex/context/base/lang-lab.lua
+++ b/Master/texmf-dist/tex/context/base/lang-lab.lua
@@ -19,6 +19,9 @@ local report_labels = logs.reporter("languages","labels")
languages.labels = languages.labels or { }
local labels = languages.labels
+local context = context
+local implement = interfaces.implement
+
local variables = interfaces.variables
local settings_to_array = utilities.parsers.settings_to_array
@@ -30,19 +33,27 @@ end
labels.split = split
-local contextsprint = context.sprint
+local contextsprint = context.sprint
+
+local f_setlabeltextpair = formatters["\\setlabeltextpair{%s}{%s}{%s}{%s}{%s}"]
+local f_key_key = formatters["\\v!%s:\\v!%s"]
+local f_key_raw = formatters["\\v!%s:%s"]
+local f_raw_key = formatters["%s:\\v!%s"]
+local f_raw_raw = formatters["%s:%s"]
+local f_key = formatters["\\v!%s"]
+local f_raw = formatters["%s"]
local function definelanguagelabels(data,class,tag,rawtag)
for language, text in next, data.labels do
if text == "" then
-- skip
elseif type(text) == "table" then
- contextsprint(prtcatcodes,"\\setlabeltextpair{",class,"}{",language,"}{",tag,"}{",text[1],"}{",text[2],"}")
+ contextsprint(prtcatcodes,f_setlabeltextpair(class,language,tag,text[1],text[2]))
if trace_labels then
report_labels("language %a, defining label %a as %a and %a",language,rawtag,text[1],text[2])
end
else
- contextsprint(prtcatcodes,"\\setlabeltextpair{",class,"}{",language,"}{",tag,"}{",text,"}{}")
+ contextsprint(prtcatcodes,f_setlabeltextpair(class,language,tag,text,""))
if trace_labels then
report_labels("language %a, defining label %a as %a",language,rawtag,text)
end
@@ -55,6 +66,7 @@ function labels.define(class,name,prefixed)
if list then
report_labels("defining label set %a",name)
for tag, data in next, list do
+ tag = variables[tag] or tag
if data.hidden then
-- skip
elseif prefixed then
@@ -62,17 +74,17 @@ function labels.define(class,name,prefixed)
if second then
if rawget(variables,first) then
if rawget(variables,second) then
- definelanguagelabels(data,class,formatters["\\v!%s:\\v!%s"](first,second),tag)
+ definelanguagelabels(data,class,f_key_key(first,second),tag)
else
- definelanguagelabels(data,class,formatters["\\v!%s:%s"](first,second),tag)
+ definelanguagelabels(data,class,f_key_raw(first,second),tag)
end
elseif rawget(variables,second) then
- definelanguagelabels(data,class,formatters["%s:\\v!%s"](first,second),tag)
+ definelanguagelabels(data,class,f_raw_key(first,second),tag)
else
- definelanguagelabels(data,class,formatters["%s:%s"](first,second),tag)
+ definelanguagelabels(data,class,f_raw_raw(first,second),tag)
end
elseif rawget(variables,rawtag) then
- definelanguagelabels(data,class,formatters["\\v!%s"](tag),tag)
+ definelanguagelabels(data,class,f_key(tag),tag)
else
definelanguagelabels(data,class,tag,tag)
end
@@ -102,7 +114,11 @@ end
-- interface
-commands.definelabels = labels.define
+interfaces.implement {
+ name = "definelabels",
+ actions = labels.define,
+ arguments = { "string", "string", "boolean" }
+}
-- function commands.setstrippedtextprefix(str)
-- context(string.strip(str))
@@ -115,7 +131,7 @@ commands.definelabels = labels.define
-- text : "a,b,c"
-- separators : "{, },{ and }"
-function commands.concatcommalist(settings) -- it's too easy to forget that this one is there
+local function concatcommalist(settings) -- it's too easy to forget that this one is there
local list = settings.list or settings_to_array(settings.text or "")
local size = #list
local command = settings.command and context[settings.command] or context
@@ -140,3 +156,16 @@ function commands.concatcommalist(settings) -- it's too easy to forget that this
command(list[size])
end
end
+
+implement {
+ name = "concatcommalist",
+ actions = concatcommalist,
+ arguments = {
+ {
+ { "text" },
+ { "separators" },
+ { "first" },
+ { "second" },
+ }
+ }
+}
diff --git a/Master/texmf-dist/tex/context/base/lang-lab.mkiv b/Master/texmf-dist/tex/context/base/lang-lab.mkiv
index 7dcaaecb414..fbe3346dcff 100644
--- a/Master/texmf-dist/tex/context/base/lang-lab.mkiv
+++ b/Master/texmf-dist/tex/context/base/lang-lab.mkiv
@@ -84,6 +84,7 @@
\unexpanded\def\lang_labels_define_class_indeed#1#2#3#4#5#6#7#8#9%
{\setuvalue{setup#1text}{\protecttextprefixes#2\def\currenttextprefixclass{#1}\dodoubleempty\lang_labels_text_prefix_setup}%
\setuvalue{preset#1text}{\protecttextprefixes1\def\currenttextprefixclass{#1}\dodoubleempty\lang_labels_text_prefix_setup}%
+ \setuvalue{copy#1text}{\protecttextprefixes1\def\currenttextprefixclass{#1}\dodoubleempty\lang_labels_text_prefix_copy}%
\setuvalue{start#1text}{\protecttextprefixes1\def\currenttextprefixclass{#1}\dotripleempty\lang_labels_text_prefix_start[#1]}%
\letvalue{stop#1text}\relax
\def#4{\reallanguagetag{\defaultlanguage\currentmainlanguage}}%
@@ -180,7 +181,8 @@
\grabuntil{stop#1text}\lang_labels_text_prefix_start_indeed}
\def\lang_labels_text_prefix_start_indeed#1% text (not special checking done here yet, only for long texts anyway)
- {\expandafter\edef\csname\??label\currenttextprefixclass:\currenttextprefixtag:\currenttextprefixname\endcsname{{\ctxcommand{strip(\!!bs#1\!!es)}}\empty}}
+ {\expandafter\edef\csname\??label\currenttextprefixclass:\currenttextprefixtag:\currenttextprefixname\endcsname%
+ {{\clf_strip{#1}}\empty}}
\def\lang_labels_text_prefix_setup[#1][#2]%
{\ifsecondargument
@@ -236,17 +238,38 @@
{\expandafter\def\csname\??label\currenttextprefixclass:\currenttextprefixtag:#1\endcsname{#2}}
\unexpanded\def\setlabeltextpair#1#2#3#4#5% a fast one for usage at the Lua end
- {\expandafter\def\csname\??label#1:\reallanguagetag{#2}:#3\endcsname{{#4}{#5}}} % class tag key left right
+ {%\writestatus{!!!!}{#1:\reallanguagetag{#2}:#3}%
+ \expandafter\def\csname\??label#1:\reallanguagetag{#2}:#3\endcsname{{#4}{#5}}} % class tag key left right
+
+\def\lang_labels_text_prefix_copy[#1][#2]%
+ {\ifsecondargument
+ \edef\currenttextprefixtag{\reallanguagetag{#1}}%
+ \processcommalist[#2]\lang_labels_text_prefix_copy_indeed
+ \else
+ \edef\currenttextprefixtag{\reallanguagetag\currentmainlanguage}%
+ \processcommalist[#1]\lang_labels_text_prefix_copy_indeed
+ \fi}
+
+\def\lang_labels_text_prefix_copy_indeed#1%
+ {\lang_labels_text_prefix_copy_pair[#1]}
+
+\def\lang_labels_text_prefix_copy_pair[#1=#2]%
+ {\lang_labels_text_prefix_copy_pair_indeed{#1}[#2,,]}
+
+\def\lang_labels_text_prefix_copy_pair_indeed#1[#2,#3]%
+ {\expandafter\let
+ \csname\??label\currenttextprefixclass:\currenttextprefixtag:#1\expandafter\endcsname
+ \csname\??label\currenttextprefixclass:\currenttextprefixtag:#2\endcsname}
\definelabelclass [head] [0] % titles
\definelabelclass [label] [0] % texts
\definelabelclass [mathlabel] [0] % functions
\definelabelclass [taglabel] [2] % tags
-\ctxcommand{definelabels("head", "titles", true )}
-\ctxcommand{definelabels("label", "texts", true )}
-\ctxcommand{definelabels("mathlabel", "functions",false)}
-\ctxcommand{definelabels("taglabel", "tags", false)}
+\clf_definelabels{head}{titles}\s!true\relax
+\clf_definelabels{label}{texts}\s!true\relax
+\clf_definelabels{mathlabel}{functions}\s!false\relax
+\clf_definelabels{taglabel}{tags}\s!false\relax
%D \macros
%D {translate}
@@ -298,7 +321,7 @@
%D \assigntranslation[en=something,nl=iets]\to\command
%D \stoptyping
-\def\assigntranslation[#1]\to#2%
+\unexpanded\def\assigntranslation[#1]\to#2% bad, this \to
{\getparameters[\??translation][#1]%
\edef#2{\csname\??translation\currentlanguage\endcsname}}
@@ -326,12 +349,12 @@
{\dodoubleempty\typo_helpers_concat_comma_list}
\def\typo_helpers_concat_comma_list[#1][#2]%
- {\ctxcommand{concatcommalist{
- text = \!!bs#1\!!es,
- separators = \!!bs#2\!!es,
- first = \!!bs\labeltext{and-1}\!!es,
- second = \!!bs\labeltext{and-2}\!!es
- }}}
+ {\clf_concatcommalist
+ text {#1}%
+ separators {#2}%
+ first {\detokenize\expandafter{\normalexpanded{\labeltext{and-1}}}}%
+ second {\detokenize\expandafter{\normalexpanded{\labeltext{and-2}}}}%
+ \relax}
\setuplabeltext [\s!nl] [and-1={{, }}, and-2={{ en }}] % 1, 2 en 3
\setuplabeltext [\s!en] [and-1={{, }}, and-2={{, }}] % 1, 2, 3
diff --git a/Master/texmf-dist/tex/context/base/lang-mis.mkiv b/Master/texmf-dist/tex/context/base/lang-mis.mkiv
index 0c4bc3ac48e..2b886b3cec1 100644
--- a/Master/texmf-dist/tex/context/base/lang-mis.mkiv
+++ b/Master/texmf-dist/tex/context/base/lang-mis.mkiv
@@ -20,35 +20,28 @@
\unprotect
-%D One of \TEX's strong points in building paragraphs is the way
-%D hyphenations are handled. Although for real good hyphenation
-%D of non||english languages some extensions to the program are
-%D needed, fairly good results can be reached with the standard
-%D mechanisms and an additional macro, at least in Dutch.
-
-%D \CONTEXT\ originates in the wish to typeset educational
-%D materials, especially in a technical environment. In
-%D production oriented environments, a lot of compound words
-%D are used. Because the Dutch language poses no limits on
-%D combining words, we often favor putting dashes between those
-%D words, because it facilitates reading, at least for those
-%D who are not that accustomed to it.
-%D
-%D In \TEX\ compound words, separated by a hyphen, are not
-%D hyphenated at all. In spite of the multiple pass paragraph
-%D typesetting this can lead to parts of words sticking into
-%D the margin. The solution lays in saying \type
-%D {spoelwater||terugwinunit} instead of \type
-%D {spoelwater-terugwinunit}. By using a one character command
-%D like \type {|}, delimited by the same character \type {|},
-%D we get ourselves both a decent visualization (in \TEXEDIT\
-%D and colored verbatim we color these commands yellow) and an
-%D efficient way of combining words.
-%D
-%D The sequence \type{||} simply leads to two words connected by
-%D a hyphen. Because we want to distinguish such a hyphen from
-%D the one inserted when \TEX\ hyphenates a word, we use a bit
-%D longer one.
+%D One of \TEX's strong points in building paragraphs is the way hyphenations are
+%D handled. Although for real good hyphenation of non||english languages some
+%D extensions to the program are needed, fairly good results can be reached with the
+%D standard mechanisms and an additional macro, at least in Dutch.
+%D
+%D \CONTEXT\ originates in the wish to typeset educational materials, especially in
+%D a technical environment. In production oriented environments, a lot of compound
+%D words are used. Because the Dutch language poses no limits on combining words, we
+%D often favor putting dashes between those words, because it facilitates reading,
+%D at least for those who are not that accustomed to it.
+%D
+%D In \TEX\ compound words, separated by a hyphen, are not hyphenated at all. In
+%D spite of the multiple pass paragraph typesetting this can lead to parts of words
+%D sticking into the margin. The solution lays in saying \type
+%D {spoelwater||terugwinunit} instead of \type {spoelwater-terugwinunit}. By using a
+%D one character command like \type {|}, delimited by the same character \type {|},
+%D we get ourselves both a decent visualization (in \TEXEDIT\ and colored verbatim
+%D we color these commands yellow) and an efficient way of combining words.
+%D
+%D The sequence \type{||} simply leads to two words connected by a hyphen. Because
+%D we want to distinguish such a hyphen from the one inserted when \TEX\ hyphenates
+%D a word, we use a bit longer one.
%D
%D \hyphenation {spoel-wa-ter te-rug-win-unit}
%D
@@ -56,9 +49,8 @@
%D \test {spoelwater||terugwinunit}
%D \stoptest
%D
-%D As we already said, the \type{|} is a command. This commands
-%D accepts an optional argument before it's delimiter, which is
-%D also a \type{|}.
+%D As we already said, the \type{|} is a command. This commands accepts an optional
+%D argument before it's delimiter, which is also a \type{|}.
%D
%D \hyphenation {po-ly-meer che-mie}
%D
@@ -66,8 +58,8 @@
%D \test {polymeer|*|chemie}
%D \stoptest
%D
-%D Arguments like \type{*} are not interpreted and inserted
-%D directly, in contrary to arguments like:
+%D Arguments like \type{*} are not interpreted and inserted directly, in contrary to
+%D arguments like:
%D
%D \starttest
%D \test {polymeer|~|chemie}
@@ -75,22 +67,21 @@
%D \test {polymeer|(|chemie|)| }
%D \stoptest
%D
-%D Although such situations seldom occur |<|we typeset thousands
-%D of pages before we encountered one that forced us to enhance
-%D this mechanism|>| we also have to take care of comma's.
+%D Although such situations seldom occur |<|we typeset thousands of pages before we
+%D encountered one that forced us to enhance this mechanism|>| we also have to take
+%D care of comma's.
%D
-%D \hyphenation {uit-stel-len}
+%D \hyphenation {uit-stel-len}
%D
-%D \starttest
-%D \test {op||, in|| en uitstellen}
-%D \stoptest
+%D \starttest
+%D \test {op||, in|| en uitstellen}
+%D \stoptest
%D
-%D The next special case (concerning quotes) was brought to my
-%D attention by Piet Tutelaers, one of the driving forces
-%D behind rebuilding hyphenation patterns for the dutch
-%D language.\footnote{In 1996 the spelling of the dutch
-%D language has been slightly reformed which made this topic
-%D actual again.} We'll also take care of this case.
+%D The next special case (concerning quotes) was brought to my attention by Piet
+%D Tutelaers, one of the driving forces behind rebuilding hyphenation patterns for
+%D the dutch language.\footnote{In 1996 the spelling of the dutch language has been
+%D slightly reformed which made this topic actual again.} We'll also take care of
+%D this case.
%D
%D \starttest
%D \test {AOW|'|er}
@@ -99,8 +90,7 @@
%D \test {rock|-|'n|-|roller}
%D \stoptest
%D
-%D Tobias Burnus pointed out that I should also support
-%D something like
+%D Tobias Burnus pointed out that I should also support something like
%D
%D \starttest
%D \test {well|_|known}
@@ -117,11 +107,10 @@
%D \macros
%D {installdiscretionaries}
%D
-%D The mechanism described here is one of the older inner parts
-%D of \CONTEXT. The most recent extensions concerns some
-%D special cases as well as the possibility to install other
-%D characters as delimiters. The prefered way of specifying
-%D compound words is using \type{||}, which is installed by:
+%D The mechanism described here is one of the older inner parts of \CONTEXT. The
+%D most recent extensions concerns some special cases as well as the possibility to
+%D install other characters as delimiters. The prefered way of specifying compound
+%D words is using \type{||}, which is installed by:
%D
%D \starttyping
%D \installdiscretionary | -
@@ -153,20 +142,18 @@
%D {compoundhyphen,
%D beginofsubsentence,endofsubsentence}
%D
-%D Now let's go to the macros. First we define some variables.
-%D In the main \CONTEXT\ modules these can be tuned by a setup
-%D command. Watch the (maybe) better looking compound hyphen.
+%D Now let's go to the macros. First we define some variables. In the main \CONTEXT\
+%D modules these can be tuned by a setup command. Watch the (maybe) better looking
+%D compound hyphen.
\ifx\compoundhyphen \undefined \unexpanded\def\compoundhyphen {\hbox{-\kern-.25ex-}} \fi
\ifx\beginofsubsentence\undefined \unexpanded\def\beginofsubsentence{\hbox{\emdash}} \fi
\ifx\endofsubsentence \undefined \unexpanded\def\endofsubsentence {\hbox{\emdash}} \fi
-%D The last two variables are needed for subsentences
-%D |<|like this one|>| which we did not yet mention.
-%D
-%D We want to enable breaking but at the same time don't want
-%D compound characters like |-| or || to be separated from the
-%D words. \TEX\ hackers will recognise the next two macro's:
+%D The last two variables are needed for subsentences |<|like this one|>| which we
+%D did not yet mention. We want to enable breaking but at the same time don't want
+%D compound characters like |-| or || to be separated from the words. \TEX\ hackers
+%D will recognise the next two macro's:
\ifx\prewordbreak \undefined \unexpanded\def\prewordbreak {\penalty\plustenthousand\hskip\zeropoint\relax} \fi
\ifx\postwordbreak\undefined \unexpanded\def\postwordbreak {\penalty\zerocount \hskip\zeropoint\relax} \fi
@@ -177,19 +164,17 @@
%D \macros
%D {beginofsubsentencespacing,endofsubsentencespacing}
%D
-%D In the previous macros we provided two hooks which can be
-%D used to support nested sub||sentences. In \CONTEXT\ these
-%D hooks are used to insert a small space when needed.
+%D In the previous macros we provided two hooks which can be used to support nested
+%D sub||sentences. In \CONTEXT\ these hooks are used to insert a small space when
+%D needed.
\ifx\beginofsubsentencespacing\undefined \let\beginofsubsentencespacing\relax \fi
\ifx\endofsubsentencespacing \undefined \let\endofsubsentencespacing \relax \fi
-%D The following piece of code is a torture test compound
-%D hndling. The \type {\relax} before the \type {\ifmmode} is
-%D needed because of the alignment scanner (in \ETEX\ this
-%D problem is not present because there a protected macro is
-%D not expanded. Thanks to Tobias Burnus for providing this
-%D example.
+%D The following piece of code is a torture test compound handling. The \type
+%D {\relax} before the \type {\ifmmode} is needed because of the alignment scanner
+%D (in \ETEX\ this problem is not present because there a protected macro is not
+%D expanded. Thanks to Tobias Burnus for providing this example.
%D
%D \startformula
%D \left|f(x_n)-{1\over2}\right| =
@@ -234,10 +219,9 @@
\def\lang_discretionaries_process_none#1%
{\detokenize{#1}}
-%D The macro \type{\lang_discretionaries_check_before} takes care
-%D of loners like \type{||word}, while it counterpart \type
-%D {\lang_discretionaries_check_after} is responsible for handling
-%D the comma.
+%D The macro \type{\lang_discretionaries_check_before} takes care of loners like
+%D \type{||word}, while it counterpart \type {\lang_discretionaries_check_after} is
+%D responsible for handling the comma.
\newsignal\compoundbreakpoint
@@ -327,8 +311,8 @@
%D \macros
%D {directdiscretionary}
%D
-%D In those situations where the nature of characters is
-%D less predictable, we can use the more direct approach:
+%D In those situations where the nature of characters is less predictable, we can
+%D use the more direct approach:
\unexpanded\def\directdiscretionary
{\csname
@@ -450,10 +434,9 @@
%D \macros
%D {fakecompoundhyphen}
%D
-%D In headers and footers as well as in active pieces of text
-%D we need a dirty hack. Try to imagine what is needed to
-%D savely break the next text across a line and at the same
-%D time make the words interactive.
+%D In headers and footers as well as in active pieces of text we need a dirty hack.
+%D Try to imagine what is needed to savely break the next text across a line and at
+%D the same time make the words interactive.
%D
%D \starttyping
%D \goto{Some||Long||Word}
@@ -471,10 +454,9 @@
%D {midworddiscretionary}
%D
%D If needed, one can add a discretionary hyphen using \type
-%D {\midworddiscretionary}. This macro does the same as
-%D \PLAIN\ \TEX's \type {\-}, but, like the ones implemented
-%D earlier, this one also looks ahead for spaces and grouping
-%D tokens.
+%D {\midworddiscretionary}. This macro does the same as \PLAIN\ \TEX's \type {\-},
+%D but, like the ones implemented earlier, this one also looks ahead for spaces and
+%D grouping tokens.
\unexpanded\def\midworddiscretionary
{\futurelet\nexttoken\lang_discretionaries_mid_word}
@@ -489,15 +471,13 @@
%D \macros
%D {installcompoundcharacter}
%D
-%D When Tobias Burnus started translating the dutch manual of
-%D \PPCHTEX\ into german, he suggested to let \CONTEXT\ support
-%D the \type{german.sty} method of handling compound
-%D characters, especially the umlaut. This package is meant for
-%D use with \PLAIN\ \TEX\ as well as \LATEX.
+%D When Tobias Burnus started translating the dutch manual of \PPCHTEX\ into german,
+%D he suggested to let \CONTEXT\ support the \type{german.sty} method of handling
+%D compound characters, especially the umlaut. This package is meant for use with
+%D \PLAIN\ \TEX\ as well as \LATEX.
%D
-%D I decided to implement compound character support as
-%D versatile as possible. As a result one can define his own
-%D compound character support, like:
+%D I decided to implement compound character support as versatile as possible. As a
+%D result one can define his own compound character support, like:
%D
%D \starttyping
%D \installcompoundcharacter "a {\"a}
@@ -515,25 +495,24 @@
%D \installcompoundcharacter "ff {\discretionary{ff-}{f}{ff}}
%D \stoptyping
%D
-%D The support is not limited to alphabetic characters, so the
-%D next definition is also valid.
+%D The support is not limited to alphabetic characters, so the next definition is
+%D also valid.
%D
%D \starttyping
%D \installcompoundcharacter ". {.\doifnextcharelse{\spacetoken}{}{\kern.125em}}
%D \stoptyping
%D
-%D The implementation looks familiar and uses the same tricks as
-%D mentioned earlier in this module. We take care of two
-%D arguments, which complicates things a bit.
+%D The implementation looks familiar and uses the same tricks as mentioned earlier
+%D in this module. We take care of two arguments, which complicates things a bit.
\installcorenamespace{compoundnormal}
\installcorenamespace{compoundsingle}
\installcorenamespace{compoundmultiple}
\installcorenamespace{compounddefinition}
-%D When we started working on MK IV code, we needed a different
-%D approach for defining the active character itself. In MK II as
-%D well as in MK IV we now use the catcode vectors.
+%D When I started working on \MKIV\ code, we needed a different approach for
+%D defining the active character itself. In \MKII\ as well as in \MKIV\ we now use
+%D the catcode vectors.
\setnewconstant\compoundcharactermode\plusone
@@ -551,22 +530,19 @@
\expandafter\letcatcodecommand\expandafter\ctxcatcodes\expandafter\c_lang_compounds_character\csname\??compounddefinition\detokenize{#1}\endcsname
\fi}
-%D We can also ignore definitions (needed in for instance \XML). Beware,
-%D this macro is supposed to be used grouped!
+%D We can also ignore definitions (needed in for instance \XML). Beware, this macro
+%D is supposed to be used grouped!
\def\ignorecompoundcharacter
{\compoundcharactermode\zerocount}
-%D In handling the compound characters we have to take care of
-%D \type{\bgroup} and \type{\egroup} tokens, so we end up with
-%D a multi||step interpretation macro. We look ahead for a
-%D \type{\bgroup}, \type{\egroup} or \type{\blankspace}. Being
-%D no user of this mechanism, the credits for testing them goes
-%D to Tobias Burnus, the first german user of \CONTEXT.
+%D In handling the compound characters we have to take care of \type {\bgroup} and
+%D \type {\egroup} tokens, so we end up with a multi||step interpretation macro. We
+%D look ahead for a \type {\bgroup}, \type {\egroup} or \type {\blankspace}. Being
+%D no user of this mechanism, the credits for testing them goes to Tobias Burnus,
+%D the first german user of \CONTEXT.
%D
-%D We define these macros as \type{\long} because we can
-%D expect \type{\par} tokens. We need to look into the future
-%D with \type{\futurelet} to prevent spaces from
+%D We need to look into the future with \type{\futurelet} to prevent spaces from
%D disappearing.
\def\lang_compounds_handle_character#1%
@@ -604,12 +580,11 @@
\tripleexpandafter\lang_compounds_handle_character_two
\fi\fi\fi}
-%D Besides taken care of the grouping and space tokens, we have
-%D to deal with three situations. First we look if the next
-%D character equals the first one, if so, then we just insert
-%D the original. Next we look if indeed a compound character is
-%D defined. We either execute the compound character or just
-%D insert the first. So we have
+%D Besides taken care of the grouping and space tokens, we have to deal with three
+%D situations. First we look if the next character equals the first one, if so, then
+%D we just insert the original. Next we look if indeed a compound character is
+%D defined. We either execute the compound character or just insert the first. So we
+%D have
%D
%D \starttyping
%D <key><key> <key><known> <key><unknown>
@@ -639,8 +614,8 @@
\fi\fi\fi
\next}
-%D For very obscure applications (see for an application \type
-%D {lang-sla.tex}) we provide:
+%D For very obscure applications (see for an application \type {lang-sla.tex}) we
+%D provide:
\def\simplifiedcompoundcharacter#1#2%
{\ifcsname\??compoundsingle\string#1\string#2\endcsname
@@ -652,8 +627,8 @@
%D \macros
%D {disablediscretionaries,disablecompoundcharacter}
%D
-%D Occasionally we need to disable this mechanism. For the
-%D moment we assume that \type {|} is used.
+%D Occasionally we need to disable this mechanism. For the moment we assume that
+%D \type {|} is used.
\let\disablediscretionaries \ignorediscretionaries
\let\disablecompoundcharacters\ignorecompoundcharacter
@@ -668,9 +643,8 @@
%D \macros
%D {compound}
%D
-%D We will overload the already active \type {|} so we have
-%D to save its meaning in order to be able to use this handy
-%D macro.
+%D We will overload the already active \type {|} so we have to save its meaning in
+%D order to be able to use this handy macro.
%D
%D \starttyping
%D so test\compound{}test can be used instead of test||test
@@ -688,8 +662,7 @@
\egroup
-%D Here we hook some code into the clean up mechanism needed
-%D for verbatim data.
+%D Here we hook some code into the clean up mechanism needed for verbatim data.
\appendtoks
\disablecompoundcharacters
diff --git a/Master/texmf-dist/tex/context/base/lang-rep.lua b/Master/texmf-dist/tex/context/base/lang-rep.lua
index 02eb59f487c..95a5e545aac 100644
--- a/Master/texmf-dist/tex/context/base/lang-rep.lua
+++ b/Master/texmf-dist/tex/context/base/lang-rep.lua
@@ -15,7 +15,7 @@ if not modules then modules = { } end modules ['lang-rep'] = {
-- although (given experiences so far) we don't really need that. After all, each problem
-- is somewhat unique.
-local type = type
+local type, tonumber = type, tonumber
local utfbyte, utfsplit = utf.byte, utf.split
local P, C, U, Cc, Ct, lpegmatch = lpeg.P, lpeg.C, lpeg.patterns.utf8character, lpeg.Cc, lpeg.Ct, lpeg.match
local find = string.find
@@ -56,6 +56,8 @@ local unsetvalue = attributes.unsetvalue
local v_reset = interfaces.variables.reset
+local implement = interfaces.implement
+
local replacements = languages.replacements or { }
languages.replacements = replacements
@@ -75,6 +77,8 @@ table.setmetatableindex(lists,function(lists,name)
return data
end)
+lists[v_reset].attribute = unsetvalue -- so we discard 0
+
-- todo: glue kern
local function add(root,word,replacement)
@@ -260,7 +264,7 @@ end
local enabled = false
-function replacements.set(n) -- number or 'reset'
+function replacements.set(n)
if n == v_reset then
n = unsetvalue
else
@@ -278,5 +282,14 @@ end
-- interface
-commands.setreplacements = replacements.set
-commands.addreplacements = replacements.add
+implement {
+ name = "setreplacements",
+ actions = replacements.set,
+ arguments = "string"
+}
+
+implement {
+ name = "addreplacements",
+ actions = replacements.add,
+ arguments = { "string", "string", "string" }
+}
diff --git a/Master/texmf-dist/tex/context/base/lang-rep.mkiv b/Master/texmf-dist/tex/context/base/lang-rep.mkiv
index b3f21f22a4f..a98d51f6c8b 100644
--- a/Master/texmf-dist/tex/context/base/lang-rep.mkiv
+++ b/Master/texmf-dist/tex/context/base/lang-rep.mkiv
@@ -51,7 +51,7 @@
%D \stoptyping
\unexpanded\def\setreplacements[#1]%
- {\ctxcommand{setreplacements("#1")}}
+ {\clf_setreplacements{#1}}
\unexpanded\def\resetreplacements
{\attribute\replacementsattribute\attributeunsetvalue}
@@ -61,7 +61,7 @@
\unexpanded\def\languages_replacements_replace[#1][#2][#3]%
{\ifthirdargument
- \ctxcommand{addreplacements("#1",\!!bs#2\!!es,\!!bs#3\!!es)}%
+ \clf_addreplacements{#1}{#2}{#3}%
\fi}
\appendtoks
diff --git a/Master/texmf-dist/tex/context/base/lang-txt.lua b/Master/texmf-dist/tex/context/base/lang-txt.lua
index 4c3a3a9859c..298e05db4be 100644
--- a/Master/texmf-dist/tex/context/base/lang-txt.lua
+++ b/Master/texmf-dist/tex/context/base/lang-txt.lua
@@ -415,6 +415,27 @@ data.labels={
},
},
texts={
+ ["year"]={
+ labels={
+ en="year",
+ nl="jaar",
+ kr="년",
+ },
+ },
+ ["month"]={
+ labels={
+ en="month",
+ nl="maand",
+ kr="월",
+ },
+ },
+ ["day"]={
+ labels={
+ en="day",
+ nl="dag",
+ kr="일",
+ },
+ },
["and"]={
labels={
af="",
@@ -506,7 +527,7 @@ data.labels={
hu="április",
it="aprile",
ja="4",
- kr="4월",
+ kr="4",
la="Aprilis",
lt="balandžio",
nb="april",
@@ -613,7 +634,7 @@ data.labels={
hu="augusztus",
it="agosto",
ja="8",
- kr="8월",
+ kr="8",
la="Augustus",
lt="rugpjūčio",
nb="august",
@@ -681,7 +702,7 @@ data.labels={
fr="Chapitre ",
gr="Κεφάλαιο",
hr="Poglavlje ",
- hu=",. fejezet:",
+ hu={""," fejezet"},
it="",
ja={"第","章"},
kr={"제","장"},
@@ -756,7 +777,7 @@ data.labels={
hu="december",
it="dicembre",
ja="12",
- kr="12월",
+ kr="12",
la="December",
lt="gruodžio",
nb="desember",
@@ -828,7 +849,7 @@ data.labels={
hu="február",
it="febbraio",
ja="2",
- kr="2월",
+ kr="2",
la="Februarius",
lt="vasario",
nb="februar",
@@ -895,12 +916,12 @@ data.labels={
fr="Figure ",
gr="Σχήμα",
hr="Slika ",
- hu=",. ábra:",
+ hu={""," ábra"},
it="Fig. ",
ja="図",
- kr="그림",
+ kr="그림 ",
la="Imago ",
- lt=", pav.",
+ lt={""," pav."},
nb="Figur ",
nl="Figuur ",
nn="Figur ",
@@ -969,7 +990,7 @@ data.labels={
fr="Illustration ",
gr="Γραφικό",
hr="Slika ",
- hu=",. kép:",
+ hu={""," kép"},
it="Grafico ",
ja="イラスト",
la="Typus ",
@@ -990,6 +1011,18 @@ data.labels={
vi="Đồ thị",
},
},
+ precedingpage={
+ labels={
+ en="on a preceding page",
+ nl="op een voorgaande bladzijde",
+ },
+ },
+ followingpage={
+ labels={
+ en="on a following page",
+ nl="op een volgende bladzijde",
+ },
+ },
hencefore={
labels={
af="",
@@ -1041,6 +1074,7 @@ data.labels={
hr="vidi ispod",
hu="lásd lejjebb",
it="come mostrato sotto",
+ kr="이후로",
la="",
lt="kaip parodyta žemiau",
nb="som vist under",
@@ -1074,7 +1108,7 @@ data.labels={
fr="Intermède ",
gr="Παύση",
hr="Intermeco ",
- hu=",. intermezzo:",
+ hu={""," intermezzo"},
it="Intermezzo ",
ja="間奏曲",
kr="간주곡",
@@ -1116,7 +1150,7 @@ data.labels={
hu="január",
it="gennaio",
ja="1",
- kr="1월",
+ kr="1",
la="Ianuarius",
lt="sausio",
nb="januar",
@@ -1189,7 +1223,7 @@ data.labels={
hu="július",
it="luglio",
ja="7",
- kr="7월",
+ kr="7",
la="Iulius",
lt="liepos",
nb="juli",
@@ -1261,7 +1295,7 @@ data.labels={
hu="június",
it="giugno",
ja="6",
- kr="6월",
+ kr="6",
la="Iunius",
lt="birželio",
nb="juni",
@@ -1328,7 +1362,7 @@ data.labels={
fr="ligne ",
gr="Γραμμή",
hr="redak ",
- hu=",. sor:",
+ hu={""," sor"},
it="riga ",
ja="線",
kr="행",
@@ -1406,7 +1440,7 @@ data.labels={
hu="március",
it="marzo",
ja="3",
- kr="3월",
+ kr="3",
la="Martius",
lt="kovo",
nb="mars",
@@ -1479,7 +1513,7 @@ data.labels={
hu="május",
it="maggio",
ja="5",
- kr="5월",
+ kr="5",
la="Maius",
lt="gegužės",
nb="mai",
@@ -1588,7 +1622,7 @@ data.labels={
hu="november",
it="novembre",
ja="11",
- kr="11월",
+ kr="11",
la="November",
lt="lapkričio",
nb="november",
@@ -1659,7 +1693,7 @@ data.labels={
hu="október",
it="ottobre",
ja="10",
- kr="10월",
+ kr="10",
la="October",
lt="spalio",
nb="oktober",
@@ -1761,12 +1795,12 @@ data.labels={
fr="Partie ",
gr="Μέρος",
hr="Dio ",
- hu=",. rész:",
+ hu={""," rész"},
it="Parte ",
ja={"第","パート"},
kr={"제","부"},
la="Pars ",
- lt=", dalis",
+ lt={""," dalis"},
nb="Del",
nl="Deel ",
nn="Del",
@@ -1913,7 +1947,7 @@ data.labels={
hu="szeptember",
it="settembre",
ja="9",
- kr="9월",
+ kr="9",
la="September",
lt="rugsėjo",
nb="september",
@@ -2128,12 +2162,12 @@ data.labels={
fr="Tableau ",
gr="Πίνακας",
hr="Tablica ",
- hu=",. táblázat:",
+ hu={""," táblázat"},
it="Tabella ",
ja="表",
- kr="표",
+ kr="표 ",
la="Tabula ",
- lt=", lentelė.",
+ lt={""," lentelė."},
nb="Tabell ",
nl="Tabel ",
nn="Tabell ",
@@ -2355,7 +2389,7 @@ data.labels={
hu="Ábrák",
it="Figure",
ja="図",
- kr="그림",
+ kr="그림 ",
la="Imagines",
lt="Iliustracijos",
nb="Figurer",
@@ -2392,7 +2426,7 @@ data.labels={
hu="Grafikák",
it="Grafici",
ja="グラフ",
- kr="그래픽",
+ kr="그래픽 ",
la="Typi",
lt="Graphics",
nb="Bilde",
@@ -2429,7 +2463,7 @@ data.labels={
hu="Index",
it="Indice",
ja="目次",
- kr="색인",
+ kr="찾아보기",
la="Indices",
lt="Rodyklė",
nb="Register",
@@ -2537,6 +2571,7 @@ data.labels={
hr="Literatura",
hu="Bibliográfia",
it="Bibliografia",
+ kr="참고문헌",
la="",
lt="Literatūra",
nb="",
@@ -2573,7 +2608,7 @@ data.labels={
hu="Táblázatok",
it="Tabelle",
ja="机",
- kr="표",
+ kr="표 ",
la="Tabulae",
lt="Lentelės",
nb="Tabeller",
@@ -2630,4 +2665,135 @@ data.labels={
},
},
},
+ btx = {
+ ["mastersthesis"] = {
+ labels = {
+ en = "Master's thesis",
+ fr = "Thèse de master (DEA, DESS, master)",
+ de = "Masterarbeit",
+ },
+ },
+ ["phdthesis"] = {
+ labels = {
+ en = "PhD thesis",
+ fr = "Thèse de doctorat",
+ de = "Dissertation",
+ },
+ },
+ ["technicalreport"] = {
+ labels = {
+ en = "Technical report",
+ fr = "Rapport technique",
+ de = "Technischer Bericht",
+ },
+ },
+ --
+ ["editor"] = {
+ labels = {
+ en = "editor",
+ fr = "éditeur",
+ de = "Herausgeber",
+ },
+ },
+ ["editors"] = {
+ labels = {
+ en = "editors",
+ fr = "éditeurs",
+ de = "Herausgeber",
+ },
+ },
+ ["edition"] = {
+ labels = {
+ en = "edition",
+ fr = "édition",
+ de = "Auflage",
+ },
+ },
+ --
+ ["volume"] = {
+ labels = {
+ en = "volume",
+ de = "Band",
+ },
+ },
+ ["Volume"] = {
+ labels = {
+ en = "Volume",
+ de = "Band",
+ },
+ },
+ ["number"] = {
+ labels = {
+ en = "number",
+ fr = "numéro",
+ de = "Numer",
+ },
+ },
+ ["Number"] = {
+ labels = {
+ en = "Number",
+ fr = "Numéro",
+ de = "Numer",
+ },
+ },
+ ["in"] = {
+ labels = {
+ en = "in",
+ fr = "dans",
+ de = "in",
+ },
+ },
+ ["of"] = {
+ labels = {
+ en = "of",
+ fr = "de",
+ de = "von",
+ },
+ },
+ --
+ ["In"] = {
+ labels = {
+ en = "In",
+ fr = "Dans",
+ de = "In",
+ },
+ },
+ --
+ ["p"] = {
+ labels = {
+ en = "p",
+ de = "S",
+ },
+ },
+ ["pp"] = {
+ labels = {
+ en = "pp",
+ de = "S",
+ },
+ },
+ ["pages"] = {
+ labels = {
+ en = "pages",
+ de = "Seiten",
+ },
+ },
+ --
+ ["and"] = {
+ labels = {
+ en = "and",
+ de = "und",
+ },
+ },
+ ["others"] = {
+ labels = {
+ en = "et al.",
+ },
+ },
+ }
}
+
+local functions = data.labels.functions
+
+functions.asin = functions.arcsin
+functions.acos = functions.arccos
+functions.atan = functions.arctan
diff --git a/Master/texmf-dist/tex/context/base/lang-url.lua b/Master/texmf-dist/tex/context/base/lang-url.lua
index fb4147580d2..39418beefa2 100644
--- a/Master/texmf-dist/tex/context/base/lang-url.lua
+++ b/Master/texmf-dist/tex/context/base/lang-url.lua
@@ -8,10 +8,14 @@ if not modules then modules = { } end modules ['lang-url'] = {
local utfcharacters, utfvalues, utfbyte, utfchar = utf.characters, utf.values, utf.byte, utf.char
-commands = commands or { }
local commands = commands
+local context = context
-context = context
+local implement = interfaces.implement
+
+local variables = interfaces.variables
+local v_before = variables.before
+local v_after = variables.after
local is_letter = characters.is_letter
@@ -26,39 +30,39 @@ commands.hyphenatedurl = commands.hyphenatedurl or { }
local hyphenatedurl = commands.hyphenatedurl
local characters = utilities.storage.allocate {
- ["!"] = 1,
- ["\""] = 1,
- ["#"] = 1,
- ["$"] = 1,
- ["%"] = 1,
- ["&"] = 1,
- ["("] = 1,
- ["*"] = 1,
- ["+"] = 1,
- [","] = 1,
- ["-"] = 1,
- ["."] = 1,
- ["/"] = 1,
- [":"] = 1,
- [";"] = 1,
- ["<"] = 1,
- ["="] = 1,
- [">"] = 1,
- ["?"] = 1,
- ["@"] = 1,
- ["["] = 1,
- ["\\"] = 1,
- ["^"] = 1,
- ["_"] = 1,
- ["`"] = 1,
- ["{"] = 1,
- ["|"] = 1,
- ["~"] = 1,
-
- ["'"] = 2,
- [")"] = 2,
- ["]"] = 2,
- ["}"] = 2,
+ ["!"] = "before",
+ ["\""] = "before",
+ ["#"] = "before",
+ ["$"] = "before",
+ ["%"] = "before",
+ ["&"] = "before",
+ ["("] = "before",
+ ["*"] = "before",
+ ["+"] = "before",
+ [","] = "before",
+ ["-"] = "before",
+ ["."] = "before",
+ ["/"] = "before",
+ [":"] = "before",
+ [";"] = "before",
+ ["<"] = "before",
+ ["="] = "before",
+ [">"] = "before",
+ ["?"] = "before",
+ ["@"] = "before",
+ ["["] = "before",
+ ["\\"] = "before",
+ ["^"] = "before",
+ ["_"] = "before",
+ ["`"] = "before",
+ ["{"] = "before",
+ ["|"] = "before",
+ ["~"] = "before",
+
+ ["'"] = "after",
+ [")"] = "after",
+ ["]"] = "after",
+ ["}"] = "after",
}
local mapping = utilities.storage.allocate {
@@ -129,10 +133,10 @@ local function action(hyphenatedurl,str,left,right,disc)
ctx_d(utfbyte(s))
else
local c = characters[s]
- if c == 1 then
+ if c == v_before then
p = false
ctx_b(utfbyte(s))
- elseif c == 2 then
+ elseif c == v_after then
p = false
ctx_a(utfbyte(s))
else
@@ -162,8 +166,21 @@ table.setmetatablecall(hyphenatedurl,action) -- watch out: a caller
function hyphenatedurl.setcharacters(str,value) -- 1, 2 == before, after
for s in utfcharacters(str) do
- characters[s] = value or 1
+ characters[s] = value or v_before
end
end
-- .hyphenatedurl.setcharacters("')]}",2)
+
+implement {
+ name = "sethyphenatedurlcharacters",
+ actions = hyphenatedurl.setcharacters,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "hyphenatedurl",
+ scope = "private",
+ actions = function(...) action(hyphenatedurl,...) end,
+ arguments = { "string", "integer", "integer", "string" }
+}
diff --git a/Master/texmf-dist/tex/context/base/lang-url.mkiv b/Master/texmf-dist/tex/context/base/lang-url.mkiv
index 8990dccd86f..e7d62ba016c 100644
--- a/Master/texmf-dist/tex/context/base/lang-url.mkiv
+++ b/Master/texmf-dist/tex/context/base/lang-url.mkiv
@@ -44,18 +44,21 @@
\newtoks\everyhyphenatedurl
\appendtoks
- \let\&\letterampersand
- \let\#\letterhash
- \let\~\lettertilde
- \let\\\letterbackslash
- \let\$\letterdollar
- \let\^\letterhat
- \let\_\letterunderscore
- \let\{\letterleftbrace
- \let\}\letterrightbrace
- \let\|\letterbar
- \let~=\lettertilde
- \let|=\letterbar
+ \resetfontfeature
+ \resetcharacterspacing
+ %
+ \let\&\letterampersand
+ \let\#\letterhash
+ \let\~\lettertilde
+ \let\\\letterbackslash
+ \let\$\letterdollar
+ \let\^\letterhat
+ \let\_\letterunderscore
+ \let\{\letterleftbrace
+ \let\}\letterrightbrace
+ \let\|\letterbar
+ \let~=\lettertilde
+ \let|=\letterbar
\to \everyhyphenatedurl
\let\hyphenatedurlseparator \empty % \periodcentered
@@ -86,9 +89,9 @@
\let\lang_url_show\relax
-\unexpanded\def\sethyphenatedurlnormal#1{\ctxcommand{hyphenatedurl.setcharacters(\!!bs#1\!!es,0)}} % Lua names will change
-\unexpanded\def\sethyphenatedurlbefore#1{\ctxcommand{hyphenatedurl.setcharacters(\!!bs#1\!!es,1)}} % Lua names will change
-\unexpanded\def\sethyphenatedurlafter #1{\ctxcommand{hyphenatedurl.setcharacters(\!!bs#1\!!es,2)}} % Lua names will change
+\unexpanded\def\sethyphenatedurlnormal#1{\clf_sethyphenatedurlcharacters{#1}{\v!normal}}
+\unexpanded\def\sethyphenatedurlbefore#1{\clf_sethyphenatedurlcharacters{#1}{\v!before}}
+\unexpanded\def\sethyphenatedurlafter #1{\clf_sethyphenatedurlcharacters{#1}{\v!after }}
% \sethyphenatedurlafter{ABCDEF}
@@ -106,12 +109,12 @@
\let\C\lang_url_C % character_nobreak
\scratchskipone\zeropoint\s!plus\dimexpr\emwidth/12\s!minus\dimexpr\emwidth/24\relax % 1.00pt @ 12pt
\scratchskiptwo\zeropoint\s!plus\dimexpr\emwidth/48\s!minus\dimexpr\emwidth/96\relax % 0.25pt @ 12pt
- \normalexpanded{\noexpand\ctxcommand{hyphenatedurl(
- \!!bs\noexpand\detokenize{#1}\!!es,
- \number\hyphenatedurllefthyphenmin,
- \number\hyphenatedurlrighthyphenmin,
- "\hyphenatedurldiscretionary"
- )}}%
+ \normalexpanded{\noexpand\clf_hyphenatedurl
+ {\noexpand\detokenize{#1}}%
+ \hyphenatedurllefthyphenmin
+ \hyphenatedurlrighthyphenmin
+ {\hyphenatedurldiscretionary}%
+ }%
\endgroup}
%D \macros
@@ -138,3 +141,31 @@
% \dorecurse{100}{\test{a} \test{ab} \test{abc} \test{abcd} \test{abcde} \test{abcdef}}
\protect \endinput
+
+% \setuppapersize[A7]
+%
+% \unexpanded\def\WhateverA#1%
+% {\dontleavehmode
+% \begingroup
+% \prehyphenchar"B7\relax
+% \setbox\scratchbox\hbox{\tttf#1}%
+% \prehyphenchar`-\relax
+% \unhbox\scratchbox
+% \endgroup}
+%
+% \unexpanded\def\WhateverB#1%
+% {\dontleavehmode
+% \begingroup
+% \tttf
+% \prehyphenchar\minusone
+% % \localrightbox{\llap{_}}%
+% \localrightbox{\llap{\smash{\lower1.5ex\hbox{\char"2192}}}}%
+% \setbox\scratchbox\hbox{#1}%
+% \prehyphenchar`-\relax
+% \unhbox\scratchbox
+% \endgroup}
+%
+% \begingroup \hsize1cm
+% \WhateverA{thisisaboringandverylongcommand}\par
+% \WhateverB{thisisaboringandverylongcommand}\par
+% \endgroup
diff --git a/Master/texmf-dist/tex/context/base/lang-wrd.lua b/Master/texmf-dist/tex/context/base/lang-wrd.lua
index 5fc23757ef9..b564a02aec9 100644
--- a/Master/texmf-dist/tex/context/base/lang-wrd.lua
+++ b/Master/texmf-dist/tex/context/base/lang-wrd.lua
@@ -14,7 +14,10 @@ local P, S, Cs = lpeg.P, lpeg.S, lpeg.Cs
local report_words = logs.reporter("languages","words")
-local nodes, node, languages = nodes, node, languages
+local nodes = nodes
+local languages = languages
+
+local implement = interfaces.implement
languages.words = languages.words or { }
local words = languages.words
@@ -361,6 +364,24 @@ end
-- interface
-commands.enablespellchecking = words.enable
-commands.disablespellchecking = words.disable
-commands.loadspellchecklist = words.load
+implement {
+ name = "enablespellchecking",
+ actions = words.enable,
+ arguments = {
+ {
+ { "method" },
+ { "list" }
+ }
+ }
+}
+
+implement {
+ name = "disablespellchecking",
+ actions = words.disable
+}
+
+implement {
+ name = "loadspellchecklist",
+ arguments = { "string", "string" },
+ actions = words.load
+}
diff --git a/Master/texmf-dist/tex/context/base/lang-wrd.mkiv b/Master/texmf-dist/tex/context/base/lang-wrd.mkiv
index 6824899121f..8c544773b3a 100644
--- a/Master/texmf-dist/tex/context/base/lang-wrd.mkiv
+++ b/Master/texmf-dist/tex/context/base/lang-wrd.mkiv
@@ -40,15 +40,18 @@
\appendtoks
\doifelse{\directspellcheckingparameter\c!state}\v!start
- {\ctxcommand{enablespellchecking { method = "\directspellcheckingparameter\c!method", list = "\directspellcheckingparameter\c!list" }}}
- {\ctxcommand{disablespellchecking()}}%
+ {\clf_enablespellchecking
+ method {\directspellcheckingparameter\c!method}%
+ list {\directspellcheckingparameter\c!list}%
+ \relax}
+ {\clf_disablespellchecking}%
\to \everysetupspellchecking
\unexpanded\def\loadspellchecklist
{\dodoubleempty\lang_spellchecking_load_list}
\def\lang_spellchecking_load_list[#1][#2]%
- {\ctxcommand{loadspellchecklist("#1","#2")}}
+ {\clf_loadspellchecklist{#1}{#2}}
\setupspellchecking
[\c!state=\v!stop,
diff --git a/Master/texmf-dist/tex/context/base/lpdf-ano.lua b/Master/texmf-dist/tex/context/base/lpdf-ano.lua
index ab3a7405369..f5e320a0021 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-ano.lua
+++ b/Master/texmf-dist/tex/context/base/lpdf-ano.lua
@@ -116,8 +116,8 @@ local pdf_border_style = pdfarray { 0, 0, 0 } -- radius radius linewidth
local pdf_border_color = nil
local set_border = false
-function pdfborder()
- border_set = true
+local function pdfborder()
+ set_border = true
return pdf_border_style, pdf_border_color
end
@@ -157,6 +157,9 @@ local pagereferences = allocate() -- annots are cached themselves
setmetatableindex(pagedestinations, function(t,k)
k = tonumber(k)
+ if not k or k <= 0 then
+ return pdfnull()
+ end
local v = rawget(t,k)
if v then
-- report_reference("page number expected, got %s: %a",type(k),k)
@@ -172,6 +175,9 @@ end)
setmetatableindex(pagereferences,function(t,k)
k = tonumber(k)
+ if not k or k <= 0 then
+ return nil
+ end
local v = rawget(t,k)
if v then
return v
@@ -244,7 +250,7 @@ local function pdfnametree(destinations)
for j=i,amount do
local destination = sorted[j]
local pagenumber = destinations[destination]
- names[#names+1] = destination
+ names[#names+1] = tostring(destination) -- tostring is a safeguard
names[#names+1] = pdfreference(pagenumber)
end
local first = sorted[i]
@@ -325,7 +331,7 @@ local f_fith = formatters["<< /D [ %i 0 R /FitH %0.3F ] >>"]
local f_fitv = formatters["<< /D [ %i 0 R /FitV %0.3F ] >>"]
local f_fitbh = formatters["<< /D [ %i 0 R /FitBH %0.3F ] >>"]
local f_fitbv = formatters["<< /D [ %i 0 R /FitBV %0.3F ] >>"]
-local f_fitr = formatters["<< /D [ %i 0 R /FitR [ %0.3F %0.3F %0.3F %0.3F ] ] >>"]
+local f_fitr = formatters["<< /D [ %i 0 R /FitR %0.3F %0.3F %0.3F %0.3F ] >>"]
local v_standard = variables.standard
local v_frame = variables.frame
@@ -338,15 +344,28 @@ local v_tight = variables.tight
-- nicer is to create dictionaries and set properties but it's a bit overkill
+-- The problem with the following settings is that they are guesses: we never know
+-- if a box is part of something larger that needs to be in view, or that we are
+-- dealing with a vbox or vtop so the used h/d values cannot be trusted in a tight
+-- view. Of course some decent additional offset would be nice so maybe i'll add
+-- that some day. I never use anything else than 'fit' anyway as I think that the
+-- document should fit the device (and vice versa). In fact, with todays swipe
+-- and finger zooming this whole view is rather useless and as with any zooming
+-- one looses the overview and keeps zooming.
+
local destinationactions = {
- [v_standard] = function(r,w,h,d) return f_xyz (r,pdfrectangle(w,h,d)) end, -- local left,top with zoom (0 in our case)
- [v_frame] = function(r,w,h,d) return f_fitr (r,pdfrectangle(w,h,d)) end, -- fit rectangle in window
- [v_width] = function(r,w,h,d) return f_fith (r, gethpos() *factor) end, -- top coordinate, fit width of page in window
- [v_minwidth] = function(r,w,h,d) return f_fitbh(r, gethpos() *factor) end, -- top coordinate, fit width of content in window
- [v_height] = function(r,w,h,d) return f_fitv (r,(getvpos()+h)*factor) end, -- left coordinate, fit height of page in window
- [v_minheight] = function(r,w,h,d) return f_fitbv(r,(getvpos()+h)*factor) end, -- left coordinate, fit height of content in window
- [v_fit] = f_fit, -- fit page in window
- [v_tight] = f_fitb, -- fit content in window
+ -- [v_standard] = function(r,w,h,d) return f_xyz (r,pdfrectangle(w,h,d)) end, -- local left,top with zoom (0 in our case)
+ [v_standard] = function(r,w,h,d) return f_xyz (r,gethpos()*factor,(getvpos()+h)*factor) end, -- local left,top with no zoom
+ [v_frame] = function(r,w,h,d) return f_fitr (r,pdfrectangle(w,h,d)) end, -- fit rectangle in window
+ -- [v_width] = function(r,w,h,d) return f_fith (r,gethpos()*factor) end, -- top coordinate, fit width of page in window
+ [v_width] = function(r,w,h,d) return f_fith (r,(getvpos()+h)*factor) end, -- top coordinate, fit width of page in window
+ -- [v_minwidth] = function(r,w,h,d) return f_fitbh(r,gethpos()*factor) end, -- top coordinate, fit width of content in window
+ [v_minwidth] = function(r,w,h,d) return f_fitbh(r,(getvpos()+h)*factor) end, -- top coordinate, fit width of content in window
+ -- [v_height] = function(r,w,h,d) return f_fitv (r,(getvpos()+h)*factor) end, -- left coordinate, fit height of page in window
+ [v_height] = function(r,w,h,d) return f_fitv (r,gethpos()*factor) end, -- left coordinate, fit height of page in window
+ -- [v_minheight] = function(r,w,h,d) return f_fitbv(r,(getvpos()+h)*factor) end, -- left coordinate, fit height of content in window
+ [v_minheight] = function(r,w,h,d) return f_fitbv(r,gethpos()*factor) end, -- left coordinate, fit height of content in window [v_fit] = f_fit, -- fit page in window
+ [v_tight] = f_fitb, -- fit content in window
}
local mapping = {
@@ -377,7 +396,7 @@ end)
local function flushdestination(width,height,depth,names,view)
local r = pdfpagereference(texgetcount("realpageno"))
- if view == defaultview then
+ if view == defaultview or not view or view == "" then
r = pagedestinations[r]
else
local action = view and destinationactions[view] or defaultaction
@@ -420,6 +439,9 @@ function nodeinjections.destination(width,height,depth,names,view)
usedviews[name] = view
names[n] = autoprefix .. name
doview = true
+ else
+ -- names[n] = autoprefix .. name
+ names[n] = false
end
end
elseif method == v_page then
@@ -540,7 +562,9 @@ local function pdfaction(actions)
if what then
what = what(a,actions)
end
- if what then
+ if action == what then
+ -- ignore this one, else we get a loop
+ elseif what then
action.Next = what
action = what
else
@@ -1025,53 +1049,109 @@ function specials.action(var)
end
end
-local function build(levels,start,parent,method)
- local startlevel = levels[start][1]
+local function build(levels,start,parent,method,nested)
+ local startlevel = levels[start].level
local i, n = start, 0
local child, entry, m, prev, first, last, f, l
while i and i <= #levels do
- local li = levels[i]
- local level, title, reference, open = li[1], li[2], li[3], li[4]
- if level < startlevel then
- pdfflushobject(child,entry)
- return i, n, first, last
- elseif level == startlevel then
- if trace_bookmarks then
- report_bookmark("%3i %w%s %s",reference.realpage,(level-1)*2,(open and "+") or "-",title)
- end
- local prev = child
- child = pdfreserveobject()
- if entry then
- entry.Next = child and pdfreference(child)
- pdfflushobject(prev,entry)
- end
- entry = pdfdictionary {
- Title = pdfunicode(title),
- Parent = parent,
- Prev = prev and pdfreference(prev),
- A = somedestination(reference.internal,reference.internal,reference.realpage),
- }
- -- entry.Dest = somedestination(reference.internal,reference.internal,reference.realpage)
- if not first then first, last = child, child end
- prev = child
- last = prev
- n = n + 1
+ local current = levels[i]
+ if current.usedpage == false then
+ -- safeguard
i = i + 1
- elseif i < #levels and level > startlevel then
- i, m, f, l = build(levels,i,pdfreference(child),method)
- entry.Count = (open and m) or -m
- if m > 0 then
- entry.First, entry.Last = pdfreference(f), pdfreference(l)
- end
else
- -- missing intermediate level but ok
- i, m, f, l = build(levels,i,pdfreference(child),method)
- entry.Count = (open and m) or -m
- if m > 0 then
- entry.First, entry.Last = pdfreference(f), pdfreference(l)
+ local level = current.level
+ local title = current.title
+ local reference = current.reference
+ local opened = current.opened
+ local reftype = type(reference)
+ local variant = "unknown"
+ if reftype == "table" then
+ -- we're okay
+ variant = "list"
+ elseif reftype == "string" then
+ local resolved = references.identify("",reference)
+ local realpage = resolved and structures.references.setreferencerealpage(resolved) or 0
+ if realpage > 0 then
+ variant = "realpage"
+ realpage = realpage
+ end
+ elseif reftype == "number" then
+ if reference > 0 then
+ variant = "realpage"
+ realpage = reference
+ end
+ else
+ -- error
+ end
+ if variant == "unknown" then
+ -- error, ignore
+ i = i + 1
+ elseif level <= startlevel then
+ if level < startlevel then
+ if nested then -- could be an option but otherwise we quit too soon
+ if entry then
+ pdfflushobject(child,entry)
+ else
+ report_bookmark("error 1")
+ end
+ return i, n, first, last
+ else
+ report_bookmark("confusing level change at level %a around %a",level,title)
+ end
+ end
+ if trace_bookmarks then
+ report_bookmark("%3i %w%s %s",reference.realpage,(level-1)*2,(opened and "+") or "-",title)
+ end
+ local prev = child
+ child = pdfreserveobject()
+ if entry then
+ entry.Next = child and pdfreference(child)
+ pdfflushobject(prev,entry)
+ end
+ local action = nil
+ if variant == "list" then
+ action = somedestination(reference.internal,reference.internal,reference.realpage)
+ elseif variant == "realpage" then
+ action = pagereferences[realpage]
+ end
+ entry = pdfdictionary {
+ Title = pdfunicode(title),
+ Parent = parent,
+ Prev = prev and pdfreference(prev),
+ A = action,
+ }
+ -- entry.Dest = somedestination(reference.internal,reference.internal,reference.realpage)
+ if not first then first, last = child, child end
+ prev = child
+ last = prev
+ n = n + 1
+ i = i + 1
+ elseif i < #levels and level > startlevel then
+ i, m, f, l = build(levels,i,pdfreference(child),method,true)
+ if entry then
+ entry.Count = (opened and m) or -m
+ if m > 0 then
+ entry.First = pdfreference(f)
+ entry.Last = pdfreference(l)
+ end
+ else
+ report_bookmark("error 2")
+ end
+ else
+ -- missing intermediate level but ok
+ i, m, f, l = build(levels,i,pdfreference(child),method,true)
+ if entry then
+ entry.Count = (opened and m) or -m
+ if m > 0 then
+ entry.First = pdfreference(f)
+ entry.Last = pdfreference(l)
+ end
+ pdfflushobject(child,entry)
+ else
+ report_bookmark("error 3")
+ end
+ return i, n, first, last
end
- pdfflushobject(child,entry)
- return i, n, first, last
end
end
pdfflushobject(child,entry)
@@ -1079,10 +1159,9 @@ local function build(levels,start,parent,method)
end
function codeinjections.addbookmarks(levels,method)
- if #levels > 0 then
- structures.bookmarks.flatten(levels) -- dirty trick for lack of structure
+ if levels and #levels > 0 then
local parent = pdfreserveobject()
- local _, m, first, last = build(levels,1,pdfreference(parent),method or "internal")
+ local _, m, first, last = build(levels,1,pdfreference(parent),method or "internal",false)
local dict = pdfdictionary {
Type = pdfconstant("Outlines"),
First = pdfreference(first),
diff --git a/Master/texmf-dist/tex/context/base/lpdf-col.lua b/Master/texmf-dist/tex/context/base/lpdf-col.lua
index 9e483f9b51f..877c01a1c24 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-col.lua
+++ b/Master/texmf-dist/tex/context/base/lpdf-col.lua
@@ -48,6 +48,7 @@ local registercolor = colors.register
local colorsvalue = colors.value
local transparenciesvalue = transparencies.value
local forcedmodel = colors.forcedmodel
+local getpagecolormodel = colors.getpagecolormodel
local c_transparency = pdfconstant("Transparency")
@@ -98,11 +99,10 @@ table.setmetatableindex(transparencygroups, function(transparencygroups,colormod
end
end)
-local currentgroupcolormodel
-
local function addpagegroup()
- if currentgroupcolormodel then
- local g = transparencygroups[currentgroupcolormodel]
+ local model = getpagecolormodel()
+ if model then
+ local g = transparencygroups[model]
if g then
addtopageattributes("Group",g)
end
@@ -111,13 +111,6 @@ end
lpdf.registerpagefinalizer(addpagegroup,3,"pagegroup")
-local function synchronizecolormodel(model)
- currentgroupcolormodel = model
-end
-
-backends.codeinjections.synchronizecolormodel = synchronizecolormodel
-commands.synchronizecolormodel = synchronizecolormodel
-
-- injection code (needs a bit reordering)
-- color injection
@@ -184,7 +177,7 @@ local f_gray_function = formatters["%s mul"]
local documentcolorspaces = pdfdictionary()
-local spotcolorhash = { } -- not needed
+local spotcolorhash = { } -- not needed
local spotcolornames = { }
local indexcolorhash = { }
local delayedindexcolors = { }
@@ -202,7 +195,7 @@ end
-- This should become delayed i.e. only flush when used; in that case we need
-- need to store the specification and then flush them when accesssomespotcolor
-- is called. At this moment we assume that splotcolors that get defined are
--- also used which keeps the overhad small anyway.
+-- also used which keeps the overhad small anyway. Tricky for mp ...
local processcolors
@@ -240,6 +233,7 @@ local function registersomespotcolor(name,noffractions,names,p,colorspace,range,
local colorants = pdfdictionary()
for n in gmatch(names,"[^,]+") do
local name = spotcolornames[n] or n
+ -- the cmyk names assume that they are indeed these colors
if n == "cyan" then
name = "Cyan"
elseif n == "magenta" then
@@ -250,9 +244,15 @@ local function registersomespotcolor(name,noffractions,names,p,colorspace,range,
name = "Black"
else
local sn = spotcolorhash[name] or spotcolorhash[n]
+ if not sn then
+ report_color("defining %a as colorant",name)
+ colors.definespotcolor("",name,"p=1",true)
+ sn = spotcolorhash[name] or spotcolorhash[n]
+ end
if sn then
colorants[name] = pdfreference(sn)
else
+ -- maybe some day generate colorants (spot colors for multi) automatically
report_color("unknown colorant %a, using black instead",name or n)
name = "Black"
end
@@ -484,8 +484,11 @@ function registrations.transparency(n,a,t)
end
statistics.register("page group warning", function()
- if done and not transparencygroups[currentgroupcolormodel] then
- return "transparencies are used but no pagecolormodel is set"
+ if done then
+ local model = getpagecolormodel()
+ if model and not transparencygroups[model] then
+ return "transparencies are used but no pagecolormodel is set"
+ end
end
end)
@@ -529,6 +532,12 @@ end
lpdf.color = lpdfcolor
+interfaces.implement {
+ name = "lpdf_color",
+ actions = { lpdfcolor, context },
+ arguments = "integer"
+}
+
function lpdf.colorspec(model,ca,default)
if ca and ca > 0 then
local cv = colors.value(ca)
@@ -553,7 +562,7 @@ function lpdf.colorspec(model,ca,default)
end
function lpdf.pdfcolor(attribute) -- bonus, for pgf and friends
- context(lpdfcolor(1,attribute))
+ return lpdfcolor(1,attribute)
end
function lpdf.transparency(ct,default) -- kind of overlaps with transparencycode
diff --git a/Master/texmf-dist/tex/context/base/lpdf-epa.lua b/Master/texmf-dist/tex/context/base/lpdf-epa.lua
index 61d57b8d361..dd5ecc60990 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-epa.lua
+++ b/Master/texmf-dist/tex/context/base/lpdf-epa.lua
@@ -10,30 +10,43 @@ if not modules then modules = { } end modules ['lpdf-epa'] = {
-- change.
local type, tonumber = type, tonumber
-local format, gsub = string.format, string.gsub
+local format, gsub, lower = string.format, string.gsub, string.lower
local formatters = string.formatters
----- lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
-local trace_links = false trackers.register("figures.links", function(v) trace_links = v end)
-local report_link = logs.reporter("backend","merging")
+local trace_links = false trackers.register("figures.links", function(v) trace_links = v end)
+local trace_outlines = false trackers.register("figures.outliness", function(v) trace_outlines = v end)
+local report_link = logs.reporter("backend","link")
+local report_outline = logs.reporter("backend","outline")
+
+local epdf = epdf
local backends = backends
local lpdf = lpdf
local context = context
+local loadpdffile = lpdf.epdf.load
+
+local nameonly = file.nameonly
+
local variables = interfaces.variables
local codeinjections = backends.pdf.codeinjections
----- urlescaper = lpegpatterns.urlescaper
----- utftohigh = lpegpatterns.utftohigh
local escapetex = characters.filters.utf.private.escape
+local bookmarks = structures.bookmarks
+
local layerspec = { -- predefining saves time
"epdflinks"
}
+local f_namespace = formatters["lpdf-epa-%s-"]
+
local function makenamespace(filename)
- return format("lpdf-epa-%s-",file.removesuffix(file.basename(filename)))
+ filename = gsub(lower(nameonly(filename)),"[^%a%d]+","-")
+ return f_namespace(filename)
end
local function add_link(x,y,w,h,destination,what)
@@ -71,7 +84,7 @@ local function link_goto(x,y,w,h,document,annotation,pagedata,namespace)
if type(destination) == "string" then
local destinations = document.destinations
local wanted = destinations[destination]
- destination = wanted and wanted.D
+ destination = wanted and wanted.D -- is this ok? isn't it destination already a string?
if destination then what = "named" end
end
local pagedata = destination and destination[1]
@@ -94,10 +107,17 @@ local function link_uri(x,y,w,h,document,annotation)
end
end
+-- The rules in PDF on what a 'file specification' is, is in fact quite elaborate
+-- (see section 3.10 in the 1.7 reference) so we need to test for string as well
+-- as a table. TH/20140916
+
local function link_file(x,y,w,h,document,annotation)
local a = annotation.A
if a then
local filename = a.F
+ if type(filename) == "table" then
+ filename = filename.F
+ end
if filename then
filename = escapetex(filename)
local destination = a.D
@@ -124,7 +144,7 @@ function codeinjections.mergereferences(specification)
end
if specification then
local fullname = specification.fullname
- local document = lpdf.epdf.load(fullname)
+ local document = loadpdffile(fullname) -- costs time
if document then
local pagenumber = specification.page or 1
local xscale = specification.yscale or 1
@@ -132,22 +152,31 @@ function codeinjections.mergereferences(specification)
local size = specification.size or "crop" -- todo
local pagedata = document.pages[pagenumber]
local annotations = pagedata and pagedata.Annots
+ local namespace = makenamespace(fullname)
+ local reference = namespace .. pagenumber
if annotations and annotations.n > 0 then
- local namespace = format("lpdf-epa-%s-",file.removesuffix(file.basename(fullname)))
- local reference = namespace .. pagenumber
- local mediabox = pagedata.MediaBox
- local llx, lly, urx, ury = mediabox[1], mediabox[2], mediabox[3], mediabox[4]
- local width, height = xscale * (urx - llx), yscale * (ury - lly) -- \\overlaywidth, \\overlayheight
+ local mediabox = pagedata.MediaBox
+ local llx = mediabox[1]
+ local lly = mediabox[2]
+ local urx = mediabox[3]
+ local ury = mediabox[4]
+ local width = xscale * (urx - llx) -- \\overlaywidth, \\overlayheight
+ local height = yscale * (ury - lly) -- \\overlaywidth, \\overlayheight
context.definelayer( { "epdflinks" }, { height = height.."bp" , width = width.."bp" })
for i=1,annotations.n do
local annotation = annotations[i]
if annotation then
- local subtype = annotation.Subtype
+ local subtype = annotation.Subtype
local rectangle = annotation.Rect
- local a_llx, a_lly, a_urx, a_ury = rectangle[1], rectangle[2], rectangle[3], rectangle[4]
- local x, y = xscale * (a_llx - llx), yscale * (a_lly - lly)
- local w, h = xscale * (a_urx - a_llx), yscale * (a_ury - a_lly)
- if subtype == "Link" then
+ local a_llx = rectangle[1]
+ local a_lly = rectangle[2]
+ local a_urx = rectangle[3]
+ local a_ury = rectangle[4]
+ local x = xscale * (a_llx - llx)
+ local y = yscale * (a_lly - lly)
+ local w = xscale * (a_urx - a_llx)
+ local h = yscale * (a_ury - a_lly)
+ if subtype == "Link" then
local a = annotation.A
if a then
local linktype = a.S
@@ -161,7 +190,7 @@ function codeinjections.mergereferences(specification)
report_link("unsupported link annotation %a",linktype)
end
else
- report_link("mising link annotation")
+ report_link("missing link annotation")
end
elseif trace_links then
report_link("unsupported annotation %a",subtype)
@@ -171,21 +200,21 @@ function codeinjections.mergereferences(specification)
end
end
context.flushlayer { "epdflinks" }
- -- context("\\gdef\\figurereference{%s}",reference) -- global
- context.setgvalue("figurereference",reference) -- global
- if trace_links then
- report_link("setting figure reference to %a",reference)
- end
- specification.reference = reference
- return namespace
end
+ -- moved outside previous test
+ context.setgvalue("figurereference",reference) -- global
+ if trace_links then
+ report_link("setting figure reference to %a",reference)
+ end
+ specification.reference = reference
+ return namespace
end
end
return ""-- no namespace, empty, not nil
end
function codeinjections.mergeviewerlayers(specification)
- -- todo: parse included page for layers
+ -- todo: parse included page for layers .. or only for whole document inclusion
if true then
return
end
@@ -195,9 +224,9 @@ function codeinjections.mergeviewerlayers(specification)
end
if specification then
local fullname = specification.fullname
- local document = lpdf.epdf.load(fullname)
+ local document = loadpdffile(fullname)
if document then
- local namespace = format("lpdf:epa:%s:",file.removesuffix(file.basename(fullname)))
+ local namespace = makenamespace(fullname)
local layers = document.layers
if layers then
for i=1,layers.n do
@@ -225,3 +254,160 @@ function codeinjections.mergeviewerlayers(specification)
end
end
+-- new: for taco
+
+-- Beware, bookmarks can be in pdfdoc encoding or in unicode. However, in mkiv we
+-- write out the strings in unicode (hex). When we read them in, we check for a bom
+-- and convert to utf.
+
+function codeinjections.getbookmarks(filename)
+
+ -- The first version built a nested tree and flattened that afterwards ... but I decided
+ -- to keep it simple and flat.
+
+ local list = bookmarks.extras.get(filename)
+
+ if list then
+ return list
+ else
+ list = { }
+ end
+
+ local document = nil
+
+ if lfs.isfile(filename) then
+ document = loadpdffile(filename)
+ else
+ report_outline("unknown file %a",filename)
+ bookmarks.extras.register(filename,list)
+ return list
+ end
+
+ local outlines = document.Catalog.Outlines
+ local pages = document.pages
+ local nofpages = pages.n -- we need to access once in order to initialize
+ local destinations = document.destinations
+
+ -- I need to check this destination analyzer with the one in annotations .. best share
+ -- code (and not it's inconsistent). On the todo list ...
+
+ local function setdestination(current,entry)
+ local destination = nil
+ local action = current.A
+ if action then
+ local subtype = action.S
+ if subtype == "GoTo" then
+ destination = action.D
+ if type(destination) == "string" then
+ entry.destination = destination
+ destination = destinations[destination]
+ local pagedata = destination and destination[1]
+ if pagedata then
+ entry.realpage = pagedata.number
+ end
+ else
+ -- maybe
+ end
+ else
+ -- maybe
+ end
+ else
+ local destination = current.Dest
+ if destination then
+ if type(destination) == "string" then
+ local wanted = destinations[destination]
+ destination = wanted and wanted.D
+ if destination then
+ entry.destination = destination
+ end
+ else
+ local pagedata = destination and destination[1]
+ if pagedata and pagedata.Type == "Page" then
+ entry.realpage = pagedata.number
+ end
+ end
+ end
+ end
+ end
+
+ local function traverse(current,depth)
+ while current do
+ -- local title = current.Title
+ local title = current("Title") -- can be pdfdoc or unicode
+ if title then
+ local entry = {
+ level = depth,
+ title = title,
+ }
+ list[#list+1] = entry
+ setdestination(current,entry)
+ if trace_outlines then
+ report_outline("%w%s",2*depth,title)
+ end
+ end
+ local first = current.First
+ if first then
+ local current = first
+ while current do
+ local title = current.Title
+ if title and trace_outlines then
+ report_outline("%w%s",2*depth,title)
+ end
+ local entry = {
+ level = depth,
+ title = title,
+ }
+ setdestination(current,entry)
+ list[#list+1] = entry
+ traverse(current.First,depth+1)
+ current = current.Next
+ end
+ end
+ current = current.Next
+ end
+ end
+
+ if outlines then
+ if trace_outlines then
+ report_outline("outline of %a:",document.filename)
+ report_outline()
+ end
+ traverse(outlines,0)
+ if trace_outlines then
+ report_outline()
+ end
+ elseif trace_outlines then
+ report_outline("no outline in %a",document.filename)
+ end
+
+ bookmarks.extras.register(filename,list)
+
+ return list
+
+end
+
+function codeinjections.mergebookmarks(specification)
+ -- codeinjections.getbookmarks(document)
+ if not specification then
+ specification = figures and figures.current()
+ specification = specification and specification.status
+ end
+ if specification then
+ local fullname = specification.fullname
+ local bookmarks = backends.codeinjections.getbookmarks(fullname)
+ local realpage = tonumber(specification.page) or 1
+ for i=1,#bookmarks do
+ local b = bookmarks[i]
+ if not b.usedpage then
+ if b.realpage == realpage then
+ if trace_options then
+ report_outline("using %a at page %a of file %a",b.title,realpage,fullname)
+ end
+ b.usedpage = true
+ b.section = structures.sections.currentsectionindex()
+ b.pageindex = specification.pageindex
+ end
+ end
+ end
+ end
+end
diff --git a/Master/texmf-dist/tex/context/base/lpdf-epd.lua b/Master/texmf-dist/tex/context/base/lpdf-epd.lua
index a7399f6b4e2..1dc20bc267d 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-epd.lua
+++ b/Master/texmf-dist/tex/context/base/lpdf-epd.lua
@@ -6,124 +6,287 @@ if not modules then modules = { } end modules ['lpdf-epd'] = {
license = "see context related readme files"
}
--- This is an experimental layer around the epdf library. The reason for
--- this layer is that I want to be independent of the library (which
--- implements a selection of what a file provides) and also because I
--- want an interface closer to Lua's table model while the API stays
--- close to the original xpdf library. Of course, after prototyping a
--- solution, we can optimize it using the low level epdf accessors.
-
--- It will be handy when we have a __length and __next that can trigger
--- the resolve till then we will provide .n as #.
-
--- As there can be references to the parent we cannot expand a tree. I
--- played with some expansion variants but it does to pay off.
-
--- Maybe we need a close().
--- We cannot access all destinations in one run.
-
-local setmetatable, rawset, rawget, tostring, tonumber = setmetatable, rawset, rawget, tostring, tonumber
-local lower, match, char, find, sub = string.lower, string.match, string.char, string.find, string.sub
+-- This is an experimental layer around the epdf library. The reason for this layer is that
+-- I want to be independent of the library (which implements a selection of what a file
+-- provides) and also because I want an interface closer to Lua's table model while the API
+-- stays close to the original xpdf library. Of course, after prototyping a solution, we can
+-- optimize it using the low level epdf accessors. However, not all are accessible (this will
+-- be fixed).
+--
+-- It will be handy when we have a __length and __next that can trigger the resolve till then
+-- we will provide .n as #; maybe in Lua 5.3 or later.
+--
+-- As there can be references to the parent we cannot expand a tree. I played with some
+-- expansion variants but it does not pay off; adding extra checks is nto worth the trouble.
+--
+-- The document stays over. In order to free memory one has to explicitly onload the loaded
+-- document.
+--
+-- We have much more checking then needed in the prepare functions because occasionally
+-- we run into bugs in poppler or the epdf interface. It took us a while to realize that
+-- there was a long standing gc issue the on long runs with including many pages could
+-- crash the analyzer.
+--
+-- Normally a value is fetched by key, as in foo.Title but as it can be in pdfdoc encoding
+-- a safer bet is foo("Title") which will return a decoded string (or the original if it
+-- already was unicode).
+
+local setmetatable, rawset, rawget, type = setmetatable, rawset, rawget, type
+local tostring, tonumber = tostring, tonumber
+local lower, match, char, byte, find = string.lower, string.match, string.char, string.byte, string.find
+local abs = math.abs
local concat = table.concat
-local toutf = string.toutf
+local toutf, toeight, utfchar = string.toutf, utf.toeight, utf.char
+
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+local P, C, S, R, Ct, Cc, V, Carg, Cs, Cf, Cg = lpeg.P, lpeg.C, lpeg.S, lpeg.R, lpeg.Ct, lpeg.Cc, lpeg.V, lpeg.Carg, lpeg.Cs, lpeg.Cf, lpeg.Cg
+
+local epdf = epdf
+ lpdf = lpdf or { }
+local lpdf = lpdf
+local lpdf_epdf = { }
+lpdf.epdf = lpdf_epdf
+
+local pdf_open = epdf.open
+
+local report_epdf = logs.reporter("epdf")
+
+local getDict, getArray, getReal, getNum, getString, getBool, getName, getRef, getRefNum
+local getType, getTypeName
+local dictGetLength, dictGetVal, dictGetValNF, dictGetKey
+local arrayGetLength, arrayGetNF, arrayGet
+local streamReset, streamGetDict, streamGetChar
+
+do
+ local object = epdf.Object()
+ --
+ getDict = object.getDict
+ getArray = object.getArray
+ getReal = object.getReal
+ getNum = object.getNum
+ getString = object.getString
+ getBool = object.getBool
+ getName = object.getName
+ getRef = object.getRef
+ getRefNum = object.getRefNum
+ --
+ getType = object.getType
+ getTypeName = object.getTypeName
+ --
+ streamReset = object.streamReset
+ streamGetDict = object.streamGetDict
+ streamGetChar = object.streamGetChar
+ --
+end
-local report_epdf = logs.reporter("epdf")
+local function initialize_methods(xref)
+ local dictionary = epdf.Dict(xref)
+ local array = epdf.Array(xref)
+ --
+ dictGetLength = dictionary.getLength
+ dictGetVal = dictionary.getVal
+ dictGetValNF = dictionary.getValNF
+ dictGetKey = dictionary.getKey
+ --
+ arrayGetLength = array.getLength
+ arrayGetNF = array.getNF
+ arrayGet = array.get
+ --
+ initialize_methods = function()
+ -- already done
+ end
+end
--- a bit of protection
+local typenames = { [0] =
+ "boolean",
+ "integer",
+ "real",
+ "string",
+ "name",
+ "null",
+ "array",
+ "dictionary",
+ "stream",
+ "ref",
+ "cmd",
+ "error",
+ "eof",
+ "none",
+ "integer64",
+}
-local limited = false
+local typenumbers = table.swapped(typenames)
-directives.register("system.inputmode", function(v)
- if not limited then
- local i_limiter = io.i_limiter(v)
- if i_limiter then
- epdf.open = i_limiter.protect(epdf.open)
- limited = true
- end
- end
-end)
+local null_code = typenumbers.null
+local ref_code = typenumbers.ref
---
+local function fatal_error(...)
+ report_epdf(...)
+ report_epdf("aborting job in order to avoid crash")
+ os.exit()
+end
+
+-- epdf is the built-in library
function epdf.type(o)
local t = lower(match(tostring(o),"[^ :]+"))
return t or "?"
end
-lpdf = lpdf or { }
-local lpdf = lpdf
+local checked_access
+
+-- dictionaries (can be optimized: ... resolve and redefine when all locals set)
-lpdf.epdf = { }
+local frompdfdoc = lpdf.frompdfdoc
-local checked_access
+local function get_flagged(t,f,k)
+ local fk = f[k]
+ if not fk then
+ return t[k]
+ elseif fk == "rawtext" then
+ return frompdfdoc(t[k])
+ else -- no other flags yet
+ return t[k]
+ end
+end
-local function prepare(document,d,t,n,k,mt)
+local function prepare(document,d,t,n,k,mt,flags)
for i=1,n do
- local v = d:getVal(i)
- local r = d:getValNF(i)
- if r:getTypeName() == "ref" then
- r = r:getRef().num
- local c = document.cache[r]
- if c then
- --
+ local v = dictGetVal(d,i)
+ if v then
+ local r = dictGetValNF(d,i)
+ local kind = getType(v)
+ if kind == null_code then
+ -- ignore
else
- c = checked_access[v:getTypeName()](v,document,r)
- if c then
- document.cache[r] = c
- document.xrefs[c] = r
+ local key = dictGetKey(d,i)
+ if kind then
+ if r and getType(r) == ref_code then
+ local objnum = getRefNum(r)
+ local cached = document.__cache__[objnum]
+ if not cached then
+ cached = checked_access[kind](v,document,objnum,mt)
+ if c then
+ document.__cache__[objnum] = cached
+ document.__xrefs__[cached] = objnum
+ end
+ end
+ t[key] = cached
+ else
+ local v, flag = checked_access[kind](v,document)
+ t[key] = v
+ if flag and flags then
+ flags[key] = flag -- flags
+ end
+ end
+ else
+ report_epdf("warning: nil value for key %a in dictionary",key)
end
end
- t[d:getKey(i)] = c
else
- t[d:getKey(i)] = checked_access[v:getTypeName()](v,document)
+ fatal_error("error: invalid value at index %a in dictionary of %a",i,document.filename)
end
end
- getmetatable(t).__index = nil -- ?? weird
-setmetatable(t,mt)
+ if mt then
+ setmetatable(t,mt)
+ else
+ getmetatable(t).__index = nil
+ end
return t[k]
end
-local function some_dictionary(d,document,r,mt)
- local n = d and d:getLength() or 0
+local function some_dictionary(d,document)
+ local n = d and dictGetLength(d) or 0
+ if n > 0 then
+ local t = { }
+ local f = { }
+ setmetatable(t, {
+ __index = function(t,k)
+ return prepare(document,d,t,n,k,_,_,f)
+ end,
+ __call = function(t,k)
+ return get_flagged(t,f,k)
+ end,
+ } )
+ return t
+ end
+end
+
+local function get_dictionary(object,document,r,mt)
+ local d = getDict(object)
+ local n = d and dictGetLength(d) or 0
if n > 0 then
local t = { }
- setmetatable(t, { __index = function(t,k) return prepare(document,d,t,n,k,mt) end } )
+ local f = { }
+ setmetatable(t, {
+ __index = function(t,k)
+ return prepare(document,d,t,n,k,mt,f)
+ end,
+ __call = function(t,k)
+ return get_flagged(t,f,k)
+ end,
+ } )
return t
end
end
-local done = { }
+-- arrays (can be optimized: ... resolve and redefine when all locals set)
local function prepare(document,a,t,n,k)
for i=1,n do
- local v = a:get(i)
- local r = a:getNF(i)
- if v:getTypeName() == "null" then
- -- TH: weird, but appears possible
- elseif r:getTypeName() == "ref" then
- r = r:getRef().num
- local c = document.cache[r]
- if c then
- --
+ local v = arrayGet(a,i)
+ if v then
+ local kind = getType(v)
+ if kind == null_code then
+ -- ignore
+ elseif kind then
+ local r = arrayGetNF(a,i)
+ if r and getType(r) == ref_code then
+ local objnum = getRefNum(r)
+ local cached = document.__cache__[objnum]
+ if not cached then
+ cached = checked_access[kind](v,document,objnum)
+ document.__cache__[objnum] = cached
+ document.__xrefs__[cached] = objnum
+ end
+ t[i] = cached
+ else
+ t[i] = checked_access[kind](v,document)
+ end
else
- c = checked_access[v:getTypeName()](v,document,r)
- document.cache[r] = c
- document.xrefs[c] = r
+ report_epdf("warning: nil value for index %a in array",i)
end
- t[i] = c
else
- t[i] = checked_access[v:getTypeName()](v,document)
+ fatal_error("error: invalid value at index %a in array of %a",i,document.filename)
end
end
getmetatable(t).__index = nil
return t[k]
end
-local function some_array(a,document,r)
- local n = a and a:getLength() or 0
+local function some_array(a,document)
+ local n = a and arrayGetLength(a) or 0
if n > 0 then
local t = { n = n }
- setmetatable(t, { __index = function(t,k) return prepare(document,a,t,n,k) end } )
+ setmetatable(t, {
+ __index = function(t,k)
+ return prepare(document,a,t,n,k)
+ end
+ } )
+ return t
+ end
+end
+
+local function get_array(object,document)
+ local a = getArray(object)
+ local n = a and arrayGetLength(a) or 0
+ if n > 0 then
+ local t = { n = n }
+ setmetatable(t, {
+ __index = function(t,k)
+ return prepare(document,a,t,n,k)
+ end
+ } )
return t
end
end
@@ -131,9 +294,9 @@ end
local function streamaccess(s,_,what)
if not what or what == "all" or what == "*all" then
local t, n = { }, 0
- s:streamReset()
+ streamReset(s)
while true do
- local c = s:streamGetChar()
+ local c = streamGetChar(s)
if c < 0 then
break
else
@@ -145,56 +308,96 @@ local function streamaccess(s,_,what)
end
end
-local function some_stream(d,document,r)
+local function get_stream(d,document)
if d then
- d:streamReset()
- local s = some_dictionary(d:streamGetDict(),document,r)
+ streamReset(d)
+ local s = some_dictionary(streamGetDict(d),document)
getmetatable(s).__call = function(...) return streamaccess(d,...) end
return s
end
end
--- we need epdf.boolean(v) in addition to v:getBool() [dictionary, array, stream, real, integer, string, boolean, name, ref, null]
-
-checked_access = {
- dictionary = function(d,document,r)
- return some_dictionary(d:getDict(),document,r)
- end,
- array = function(a,document,r)
- return some_array(a:getArray(),document,r)
- end,
- stream = function(v,document,r)
- return some_stream(v,document,r)
- end,
- real = function(v)
- return v:getReal()
- end,
- integer = function(v)
- return v:getNum()
- end,
- string = function(v)
- return toutf(v:getString())
- end,
- boolean = function(v)
- return v:getBool()
- end,
- name = function(v)
- return v:getName()
- end,
- ref = function(v)
- return v:getRef()
- end,
- null = function()
- return nil
- end,
-}
+-- We need to convert the string from utf16 although there is no way to
+-- check if we have a regular string starting with a bom. So, we have
+-- na dilemma here: a pdf doc encoded string can be invalid utf.
--- checked_access.real = epdf.real
--- checked_access.integer = epdf.integer
--- checked_access.string = epdf.string
--- checked_access.boolean = epdf.boolean
--- checked_access.name = epdf.name
--- checked_access.ref = epdf.ref
+-- <hex encoded> : implicit 0 appended if odd
+-- (byte encoded) : \( \) \\ escaped
+--
+-- <FE><FF> : utf16be
+--
+-- \r \r \t \b \f \( \) \\ \NNN and \<newline> : append next line
+--
+-- the getString function gives back bytes so we don't need to worry about
+-- the hex aspect.
+
+local u_pattern = lpeg.patterns.utfbom_16_be * lpeg.patterns.utf16_to_utf8_be
+----- b_pattern = lpeg.patterns.hextobytes
+
+local function get_string(v)
+ -- the toutf function only converts a utf16 string and leves the original
+ -- untouched otherwise; one might want to apply lpdf.frompdfdoc to a
+ -- non-unicode string
+ local s = getString(v)
+ if not s or s == "" then
+ return ""
+ end
+ local u = lpegmatch(u_pattern,s)
+ if u then
+ return u -- , "unicode"
+ end
+ -- this is too tricky and fails on e.g. reload of url www.pragma-ade.com)
+ -- local b = lpegmatch(b_pattern,s)
+ -- if b then
+ -- return b, "rawtext"
+ -- end
+ return s, "rawtext"
+end
+
+local function get_null()
+ return nil
+end
+
+-- we have dual access: by typenumber and by typename
+
+local function invalidaccess(k,document)
+ local fullname = type(document) == "table" and document.fullname
+ if fullname then
+ fatal_error("error, asking for key %a in checker of %a",k,fullname)
+ else
+ fatal_error("error, asking for key %a in checker",k)
+ end
+end
+
+checked_access = table.setmetatableindex(function(t,k)
+ return function(v,document)
+ invalidaccess(k,document)
+ end
+end)
+
+checked_access[typenumbers.boolean] = getBool
+checked_access[typenumbers.integer] = getNum
+checked_access[typenumbers.real] = getReal
+checked_access[typenumbers.string] = get_string -- getString
+checked_access[typenumbers.name] = getName
+checked_access[typenumbers.null] = get_null
+checked_access[typenumbers.array] = get_array -- d,document,r
+checked_access[typenumbers.dictionary] = get_dictionary -- d,document,r
+checked_access[typenumbers.stream] = get_stream
+checked_access[typenumbers.ref] = getRef
+
+for i=0,#typenames do
+ local checker = checked_access[i]
+ if not checker then
+ checker = function()
+ return function(v,document)
+ invalidaccess(i,document)
+ end
+ end
+ checked_access[i] = checker
+ end
+ checked_access[typenames[i]] = checker
+end
local function getnames(document,n,target) -- direct
if n then
@@ -252,7 +455,6 @@ local function getlayers(document)
local n = layers.n
for i=1,n do
local layer = layers[i]
---~ print(document.xrefs[layer])
t[i] = layer.Name
end
t.n = n
@@ -261,52 +463,39 @@ local function getlayers(document)
end
end
+local function getstructure(document)
+ -- this might become a tree
+ return document.Catalog.StructTreeRoot
+end
local function getpages(document,Catalog)
- local data = document.data
- local xrefs = document.xrefs
- local cache = document.cache
- local cata = data:getCatalog()
- local xref = data:getXRef()
- local pages = { }
- local nofpages = cata:getNumPages()
--- local function getpagestuff(pagenumber,k)
--- if k == "MediaBox" then
--- local pageobj = cata:getPage(pagenumber)
--- local pagebox = pageobj:getMediaBox()
--- return { pagebox.x1, pagebox.y1, pagebox.x2, pagebox.y2 }
--- elseif k == "CropBox" then
--- local pageobj = cata:getPage(pagenumber)
--- local pagebox = pageobj:getMediaBox()
--- return { pagebox.x1, pagebox.y1, pagebox.x2, pagebox.y2 }
--- elseif k == "Resources" then
--- print("todo page resources from parent")
--- -- local pageobj = cata:getPage(pagenumber)
--- -- local resources = pageobj:getResources()
--- end
--- end
--- for pagenumber=1,nofpages do
--- local mt = { __index = function(t,k)
--- local v = getpagestuff(pagenumber,k)
--- if v then
--- t[k] = v
--- end
--- return v
--- end }
- local mt = { __index = Catalog.Pages }
+ local __data__ = document.__data__
+ local __xrefs__ = document.__xrefs__
+ local __cache__ = document.__cache__
+ local __xref__ = document.__xref__
+ --
+ local catalog = __data__:getCatalog()
+ local pages = { }
+ local nofpages = catalog:getNumPages()
+ local metatable = { __index = Catalog.Pages }
+ --
for pagenumber=1,nofpages do
- local pagereference = cata:getPageRef(pagenumber).num
- local pagedata = some_dictionary(xref:fetch(pagereference,0):getDict(),document,pagereference,mt)
+ local pagereference = catalog:getPageRef(pagenumber).num
+ local pageobject = __xref__:fetch(pagereference,0)
+ local pagedata = get_dictionary(pageobject,document,pagereference,metatable)
if pagedata then
- pagedata.number = pagenumber
- pages[pagenumber] = pagedata
- xrefs[pagedata] = pagereference
- cache[pagereference] = pagedata
+ -- rawset(pagedata,"number",pagenumber)
+ pagedata.number = pagenumber
+ pages[pagenumber] = pagedata
+ __xrefs__[pagedata] = pagereference
+ __cache__[pagereference] = pagedata
else
report_epdf("missing pagedata at slot %i",i)
end
end
+ --
pages.n = nofpages
+ --
return pages
end
@@ -329,23 +518,29 @@ end
local loaded = { }
-function lpdf.epdf.load(filename)
+function lpdf_epdf.load(filename)
local document = loaded[filename]
if not document then
- statistics.starttiming(lpdf.epdf)
- local data = epdf.open(filename) -- maybe resolvers.find_file
- if data then
+ statistics.starttiming(lpdf_epdf)
+ local __data__ = pdf_open(filename) -- maybe resolvers.find_file
+ if __data__ then
+ local __xref__ = __data__:getXRef()
document = {
- filename = filename,
- cache = { },
- xrefs = { },
- data = data,
+ filename = filename,
+ __cache__ = { },
+ __xrefs__ = { },
+ __fonts__ = { },
+ __data__ = __data__,
+ __xref__ = __xref__,
}
- local Catalog = some_dictionary(data:getXRef():getCatalog():getDict(),document)
- local Info = some_dictionary(data:getXRef():getDocInfo():getDict(),document)
- document.Catalog = Catalog
- document.Info = Info
- -- document.catalog = Catalog
+ --
+ initialize_methods(__xref__)
+ --
+ local Catalog = some_dictionary(__xref__:getCatalog():getDict(),document)
+ local Info = some_dictionary(__xref__:getDocInfo():getDict(),document)
+ --
+ document.Catalog = Catalog
+ document.Info = Info
-- a few handy helper tables
document.pages = delayed(document,"pages", function() return getpages(document,Catalog) end)
document.destinations = delayed(document,"destinations", function() return getnames(document,Catalog.Names and Catalog.Names.Dests) end)
@@ -353,28 +548,292 @@ function lpdf.epdf.load(filename)
document.widgets = delayed(document,"widgets", function() return getnames(document,Catalog.Names and Catalog.Names.AcroForm) end)
document.embeddedfiles = delayed(document,"embeddedfiles",function() return getnames(document,Catalog.Names and Catalog.Names.EmbeddedFiles) end)
document.layers = delayed(document,"layers", function() return getlayers(document) end)
+ document.structure = delayed(document,"structure", function() return getstructure(document) end)
else
document = false
end
loaded[filename] = document
- statistics.stoptiming(lpdf.epdf)
- -- print(statistics.elapsedtime(lpdf.epdf))
+ loaded[document] = document
+ statistics.stoptiming(lpdf_epdf)
+ -- print(statistics.elapsedtime(lpdf_epdf))
+ end
+ return document or nil
+end
+
+function lpdf_epdf.unload(filename)
+ local document = loaded[filename]
+ if document then
+ loaded[document] = nil
+ loaded[filename] = nil
end
- return document
end
-- for k, v in next, expand(t) do
-function lpdf.epdf.expand(t)
+local function expand(t)
if type(t) == "table" then
local dummy = t.dummy
end
return t
end
+-- for k, v in expanded(t) do
+
+local function expanded(t)
+ if type(t) == "table" then
+ local dummy = t.dummy
+ end
+ return next, t
+end
+
+lpdf_epdf.expand = expand
+lpdf_epdf.expanded = expanded
+
+-- we could resolve the text stream in one pass if we directly handle the
+-- font but why should we complicate things
+
+local hexdigit = R("09","AF")
+local numchar = ( P("\\") * ( (R("09")^3/tonumber) + C(1) ) ) + C(1)
+local number = lpegpatterns.number / tonumber
+local spaces = lpegpatterns.whitespace^1
+local optspaces = lpegpatterns.whitespace^0
+local keyword = P("/") * C(R("AZ","az","09")^1)
+local operator = C((R("AZ","az")+P("'")+P('"'))^1)
+
+local grammar = P { "start",
+ start = (keyword + number + V("dictionary") + V("unicode") + V("string") + V("unicode")+ V("array") + spaces)^1,
+ -- keyvalue = (keyword * spaces * V("start") + spaces)^1,
+ keyvalue = optspaces * Cf(Ct("") * Cg(keyword * optspaces * V("start") * optspaces)^1,rawset),
+ array = P("[") * Ct(V("start")^1) * P("]"),
+ dictionary = P("<<") * V("keyvalue") * P(">>"),
+ unicode = P("<") * Ct(Cc("hex") * C((1-P(">"))^1)) * P(">"),
+ string = P("(") * Ct(Cc("dec") * C((V("string")+numchar)^1)) * P(")"), -- untested
+}
+
+local operation = Ct(grammar^1 * operator)
+local parser = Ct((operation + P(1))^1)
+
+-- beginbfrange : <start> <stop> <firstcode>
+-- <start> <stop> [ <firstsequence> <firstsequence> <firstsequence> ]
+-- beginbfchar : <code> <newcodes>
+
+local fromsixteen = lpdf.fromsixteen -- maybe inline the lpeg ... but not worth it
+
+local function f_bfchar(t,a,b)
+ t[tonumber(a,16)] = fromsixteen(b)
+end
+
+local function f_bfrange_1(t,a,b,c)
+ print("todo 1",a,b,c)
+ -- c is string
+ -- todo t[tonumber(a,16)] = fromsixteen(b)
+end
+
+local function f_bfrange_2(t,a,b,c)
+ print("todo 2",a,b,c)
+ -- c is table
+ -- todo t[tonumber(a,16)] = fromsixteen(b)
+end
+
+local optionals = spaces^0
+local hexstring = optionals * P("<") * C((1-P(">"))^1) * P(">")
+local bfchar = Carg(1) * hexstring * hexstring / f_bfchar
+local bfrange = Carg(1) * hexstring * hexstring * hexstring / f_bfrange_1
+ + Carg(1) * hexstring * hexstring * optionals * P("[") * Ct(hexstring^1) * optionals * P("]") / f_bfrange_2
+local fromunicode = (
+ P("beginbfchar" ) * bfchar ^1 * optionals * P("endbfchar" ) +
+ P("beginbfrange") * bfrange^1 * optionals * P("endbfrange") +
+ spaces +
+ P(1)
+)^1 * Carg(1)
+
+local function analyzefonts(document,resources) -- unfinished
+ local fonts = document.__fonts__
+ if resources then
+ local fontlist = resources.Font
+ if fontlist then
+ for id, data in expanded(fontlist) do
+ if not fonts[id] then
+ -- a quck hack ... I will look into it more detail if I find a real
+ -- -application for it
+ local tounicode = data.ToUnicode()
+ if tounicode then
+ tounicode = lpegmatch(fromunicode,tounicode,1,{})
+ end
+ fonts[id] = {
+ tounicode = type(tounicode) == "table" and tounicode or { }
+ }
+ table.setmetatableindex(fonts[id],"self")
+ end
+ end
+ end
+ end
+ return fonts
+end
+
+local more = 0
+local unic = nil -- cheaper than passing each time as Carg(1)
+
+local p_hex_to_utf = C(4) / function(s) -- needs checking !
+ local now = tonumber(s,16)
+ if more > 0 then
+ now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong
+ more = 0
+ return unic[now] or utfchar(now)
+ elseif now >= 0xD800 and now <= 0xDBFF then
+ more = now
+ -- return ""
+ else
+ return unic[now] or utfchar(now)
+ end
+end
+
+local p_dec_to_utf = C(1) / function(s) -- needs checking !
+ local now = byte(s)
+ return unic[now] or utfchar(now)
+end
+
+local p_hex_to_utf = P(true) / function() more = 0 end * Cs(p_hex_to_utf^1)
+local p_dec_to_utf = P(true) / function() more = 0 end * Cs(p_dec_to_utf^1)
+
+function lpdf_epdf.getpagecontent(document,pagenumber)
+
+ local page = document.pages[pagenumber]
+
+ if not page then
+ return
+ end
+
+ local fonts = analyzefonts(document,page.Resources)
+
+ local content = page.Contents() or ""
+ local list = lpegmatch(parser,content)
+ local font = nil
+ -- local unic = nil
+
+ for i=1,#list do
+ local entry = list[i]
+ local size = #entry
+ local operator = entry[size]
+ if operator == "Tf" then
+ font = fonts[entry[1]]
+ unic = font.tounicode
+ elseif operator == "TJ" then -- { array, TJ }
+ local list = entry[1]
+ for i=1,#list do
+ local li = list[i]
+ if type(li) == "table" then
+ if li[1] == "hex" then
+ list[i] = lpegmatch(p_hex_to_utf,li[2])
+ else
+ list[i] = lpegmatch(p_dec_to_utf,li[2])
+ end
+ else
+ -- kern
+ end
+ end
+ elseif operator == "Tj" or operator == "'" or operator == '"' then -- { string, Tj } { string, ' } { n, m, string, " }
+ local list = entry[size-1]
+ if list[1] == "hex" then
+ list[2] = lpegmatch(p_hex_to_utf,li[2])
+ else
+ list[2] = lpegmatch(p_dec_to_utf,li[2])
+ end
+ end
+ end
+
+ unic = nil -- can be collected
+
+ return list
+
+end
+
+-- This is also an experiment. When I really neet it I can improve it, fo rinstance
+-- with proper position calculating. It might be usefull for some search or so.
+
+local softhyphen = utfchar(0xAD) .. "$"
+local linefactor = 1.3
+
+function lpdf_epdf.contenttotext(document,list) -- maybe signal fonts
+ local last_y = 0
+ local last_f = 0
+ local text = { }
+ local last = 0
+
+ for i=1,#list do
+ local entry = list[i]
+ local size = #entry
+ local operator = entry[size]
+ if operator == "Tf" then
+ last_f = entry[2]
+ elseif operator == "TJ" then
+ local list = entry[1]
+ for i=1,#list do
+ local li = list[i]
+ if type(li) == "string" then
+ last = last + 1
+ text[last] = li
+ elseif li < -50 then
+ last = last + 1
+ text[last] = " "
+ end
+ end
+ line = concat(list)
+ elseif operator == "Tj" then
+ last = last + 1
+ text[last] = entry[size-1]
+ elseif operator == "cm" or operator == "Tm" then
+ local ty = entry[6]
+ local dy = abs(last_y - ty)
+ if dy > linefactor*last_f then
+ if last > 0 then
+ if find(text[last],softhyphen) then
+ -- ignore
+ else
+ last = last + 1
+ text[last] = "\n"
+ end
+ end
+ end
+ last_y = ty
+ end
+ end
+
+ return concat(text)
+end
+
+function lpdf_epdf.getstructure(document,list) -- just a test
+ local depth = 0
+ for i=1,#list do
+ local entry = list[i]
+ local size = #entry
+ local operator = entry[size]
+ if operator == "BDC" then
+ report_epdf("%w%s : %s",depth,entry[1] or "?",entry[2].MCID or "?")
+ depth = depth + 1
+ elseif operator == "EMC" then
+ depth = depth - 1
+ elseif operator == "TJ" then
+ local list = entry[1]
+ for i=1,#list do
+ local li = list[i]
+ if type(li) == "string" then
+ report_epdf("%w > %s",depth,li)
+ elseif li < -50 then
+ report_epdf("%w >",depth,li)
+ end
+ end
+ elseif operator == "Tj" then
+ report_epdf("%w > %s",depth,entry[size-1])
+ end
+ end
+end
+
+-- document.Catalog.StructTreeRoot.ParentTree.Nums[2][1].A.P[1])
+
-- helpers
--- function lpdf.epdf.getdestinationpage(document,name)
--- local destination = document.data:findDest(name)
+-- function lpdf_epdf.getdestinationpage(document,name)
+-- local destination = document.__data__:findDest(name)
-- return destination and destination.number
-- end
diff --git a/Master/texmf-dist/tex/context/base/lpdf-fld.lua b/Master/texmf-dist/tex/context/base/lpdf-fld.lua
index 414562ad58a..f0aad36237c 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-fld.lua
+++ b/Master/texmf-dist/tex/context/base/lpdf-fld.lua
@@ -280,10 +280,8 @@ end
local pdfdocencodingvector, pdfdocencodingcapsule
--- The pdf doc encoding vector is needed in order to
--- trigger propper unicode. Interesting is that when
--- a glyph is not in the vector, it is still visible
--- as it is taken from some other font. Messy.
+-- The pdf doc encoding vector is needed in order to trigger propper unicode. Interesting is that when
+-- a glyph is not in the vector, it is still visible as it is taken from some other font. Messy.
-- To be checked: only when text/line fields.
@@ -334,7 +332,7 @@ local function fieldsurrounding(specification)
local fontsize = specification.fontsize or "12pt"
local fontstyle = specification.fontstyle or "rm"
local fontalternative = specification.fontalternative or "tf"
- local colorvalue = specification.colorvalue
+ local colorvalue = tonumber(specification.colorvalue)
local s = fontnames[fontstyle]
if not s then
fontstyle, s = "rm", fontnames.rm
diff --git a/Master/texmf-dist/tex/context/base/lpdf-fmt.lua b/Master/texmf-dist/tex/context/base/lpdf-fmt.lua
index 568b801b493..862c011b8a0 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-fmt.lua
+++ b/Master/texmf-dist/tex/context/base/lpdf-fmt.lua
@@ -710,7 +710,9 @@ function codeinjections.setformat(s)
end
end
function codeinjections.setformat(noname)
- report_backend("error, format is already set to %a, ignoring %a",formatname,noname.format)
+ if trace_format then
+ report_backend("error, format is already set to %a, ignoring %a",formatname,noname.format)
+ end
end
else
report_backend("error, format %a is not supported",format)
@@ -732,9 +734,11 @@ directives.register("backend.format", function(v) -- table !
end
end)
-function commands.setformat(s)
- codeinjections.setformat(s)
-end
+interfaces.implement {
+ name = "setformat",
+ actions = codeinjections.setformat,
+ arguments = { { "*" } }
+}
function codeinjections.getformatoption(key)
return formatspecification and formatspecification[key]
diff --git a/Master/texmf-dist/tex/context/base/lpdf-grp.lua b/Master/texmf-dist/tex/context/base/lpdf-grp.lua
index b3cc7ce1f5f..36c3507bed2 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-grp.lua
+++ b/Master/texmf-dist/tex/context/base/lpdf-grp.lua
@@ -118,7 +118,7 @@ function nodeinjections.injectbitmap(t)
height = width * yresolution / xresolution
end
local image = img.new {
- stream = format(template,d(),t.data),
+ stream = formatters[template](d(),t.data),
width = width,
height = height,
bbox = { 0, 0, urx, ury },
diff --git a/Master/texmf-dist/tex/context/base/lpdf-ini.lua b/Master/texmf-dist/tex/context/base/lpdf-ini.lua
index 025f62c4f84..834f845c59a 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-ini.lua
+++ b/Master/texmf-dist/tex/context/base/lpdf-ini.lua
@@ -6,17 +6,27 @@ if not modules then modules = { } end modules ['lpdf-ini'] = {
license = "see context related readme files"
}
+-- beware of "too many locals" here
+
local setmetatable, getmetatable, type, next, tostring, tonumber, rawset = setmetatable, getmetatable, type, next, tostring, tonumber, rawset
local char, byte, format, gsub, concat, match, sub, gmatch = string.char, string.byte, string.format, string.gsub, table.concat, string.match, string.sub, string.gmatch
-local utfchar, utfvalues = utf.char, utf.values
+local utfchar, utfbyte, utfvalues = utf.char, utf.byte, utf.values
local sind, cosd, floor, max, min = math.sind, math.cosd, math.floor, math.max, math.min
local lpegmatch, P, C, R, S, Cc, Cs = lpeg.match, lpeg.P, lpeg.C, lpeg.R, lpeg.S, lpeg.Cc, lpeg.Cs
local formatters = string.formatters
+local isboolean = string.is_boolean
local report_objects = logs.reporter("backend","objects")
local report_finalizing = logs.reporter("backend","finalizing")
local report_blocked = logs.reporter("backend","blocked")
+local implement = interfaces.implement
+local two_strings = interfaces.strings[2]
+
+-- In ConTeXt MkIV we use utf8 exclusively so all strings get mapped onto a hex
+-- encoded utf16 string type between <>. We could probably save some bytes by using
+-- strings between () but then we end up with escaped ()\ too.
+
-- gethpos : used
-- getpos : used
-- getvpos : used
@@ -56,9 +66,9 @@ local pdf = pdf
local factor = number.dimenfactors.bp
if pdf.setinfo then
--- table.setmetatablenewindex(pdf,function(t,k,v)
--- report_blocked("'pdf.%s' is not supported",k)
--- end)
+ -- table.setmetatablenewindex(pdf,function(t,k,v)
+ -- report_blocked("'pdf.%s' is not supported",k)
+ -- end)
-- the getters are harmless
end
@@ -103,15 +113,27 @@ local pdfimmediateobject = pdf.immediateobj
local pdfdeferredobject = pdf.obj
local pdfreferenceobject = pdf.refobj
-function pdf.setinfo () report_blocked("'pdf.%s' is not supported","setinfo") end -- use lpdf.addtoinfo etc
-function pdf.setcatalog () report_blocked("'pdf.%s' is not supported","setcatalog") end
-function pdf.setnames () report_blocked("'pdf.%s' is not supported","setnames") end
-function pdf.settrailer () report_blocked("'pdf.%s' is not supported","settrailer") end
-function pdf.setpageresources () report_blocked("'pdf.%s' is not supported","setpageresources") end
-function pdf.setpageattributes () report_blocked("'pdf.%s' is not supported","setpageattributes") end
-function pdf.setpagesattributes() report_blocked("'pdf.%s' is not supported","setpagesattributes") end
+-- function pdf.setinfo () report_blocked("'pdf.%s' is not supported","setinfo") end -- use lpdf.addtoinfo etc
+-- function pdf.setcatalog () report_blocked("'pdf.%s' is not supported","setcatalog") end
+-- function pdf.setnames () report_blocked("'pdf.%s' is not supported","setnames") end
+-- function pdf.settrailer () report_blocked("'pdf.%s' is not supported","settrailer") end
+-- function pdf.setpageresources () report_blocked("'pdf.%s' is not supported","setpageresources") end
+-- function pdf.setpageattributes () report_blocked("'pdf.%s' is not supported","setpageattributes") end
+-- function pdf.setpagesattributes() report_blocked("'pdf.%s' is not supported","setpagesattributes") end
+-- function pdf.registerannot () report_blocked("'pdf.%s' is not supported","registerannot") end
+
+local function pdfdisablecommand(command)
+ pdf[command] = function() report_blocked("'pdf.%s' is not supported",command) end
+end
-function pdf.registerannot() report_blocked("'pdf.%s' is not supported","registerannot") end
+pdfdisablecommand("setinfo")
+pdfdisablecommand("setcatalog")
+pdfdisablecommand("setnames")
+pdfdisablecommand("settrailer")
+pdfdisablecommand("setpageresources")
+pdfdisablecommand("setpageattributes")
+pdfdisablecommand("setpagesattributes")
+pdfdisablecommand("registerannot")
local trace_finalizers = false trackers.register("backend.finalizers", function(v) trace_finalizers = v end)
local trace_resources = false trackers.register("backend.resources", function(v) trace_resources = v end)
@@ -180,67 +202,112 @@ function lpdf.rectangle(width,height,depth)
end
end
---
+-- we could use a hash of predefined unicodes
+
+-- local function tosixteen(str) -- an lpeg might be faster (no table)
+-- if not str or str == "" then
+-- return "<feff>" -- not () as we want an indication that it's unicode
+-- else
+-- local r, n = { "<feff" }, 1
+-- for b in utfvalues(str) do
+-- n = n + 1
+-- if b < 0x10000 then
+-- r[n] = format("%04x",b)
+-- else
+-- -- r[n] = format("%04x%04x",b/1024+0xD800,b%1024+0xDC00)
+-- r[n] = format("%04x%04x",floor(b/1024),b%1024+0xDC00) --bit32.rshift(b,10)
+-- end
+-- end
+-- n = n + 1
+-- r[n] = ">"
+-- return concat(r)
+-- end
+-- end
+
+local cache = table.setmetatableindex(function(t,k) -- can be made weak
+ local v = utfbyte(k)
+ if v < 0x10000 then
+ v = format("%04x",v)
+ else
+ -- v = format("%04x%04x",v/1024+0xD800,v%1024+0xDC00)
+ v = format("%04x%04x",floor(v/1024),v%1024+0xDC00)
+ end
+ t[k] = v
+ return v
+end)
+
+local escaped = Cs(Cc("(") * (S("\\()")/"\\%0" + P(1))^0 * Cc(")"))
+local unified = Cs(Cc("<feff") * (lpeg.patterns.utf8character/cache)^1 * Cc(">"))
local function tosixteen(str) -- an lpeg might be faster (no table)
if not str or str == "" then
return "<feff>" -- not () as we want an indication that it's unicode
else
- local r, n = { "<feff" }, 1
- for b in utfvalues(str) do
- n = n + 1
- if b < 0x10000 then
- r[n] = format("%04x",b)
- else
- -- r[n] = format("%04x%04x",b/1024+0xD800,b%1024+0xDC00)
- r[n] = format("%04x%04x",floor(b/1024),b%1024+0xDC00)
- end
- end
- n = n + 1
- r[n] = ">"
- return concat(r)
+ return lpegmatch(unified,str)
end
end
-lpdf.tosixteen = tosixteen
+local more = 0
+
+local pattern = C(4) / function(s) -- needs checking !
+ local now = tonumber(s,16)
+ if more > 0 then
+ now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong
+ more = 0
+ return utfchar(now)
+ elseif now >= 0xD800 and now <= 0xDBFF then
+ more = now
+ return "" -- else the c's end up in the stream
+ else
+ return utfchar(now)
+ end
+end
--- lpeg is some 5 times faster than gsub (in test) on escaping
+local pattern = P(true) / function() more = 0 end * Cs(pattern^0)
--- local escapes = {
--- ["\\"] = "\\\\",
--- ["/"] = "\\/", ["#"] = "\\#",
--- ["<"] = "\\<", [">"] = "\\>",
--- ["["] = "\\[", ["]"] = "\\]",
--- ["("] = "\\(", [")"] = "\\)",
--- }
---
--- local escaped = Cs(Cc("(") * (S("\\/#<>[]()")/escapes + P(1))^0 * Cc(")"))
---
--- local function toeight(str)
--- if not str or str == "" then
--- return "()"
--- else
--- return lpegmatch(escaped,str)
--- end
--- end
---
--- -- no need for escaping .. just use unicode instead
+local function fromsixteen(str)
+ if not str or str == "" then
+ return ""
+ else
+ return lpegmatch(pattern,str)
+ end
+end
--- \0 \t \n \r \f <space> ( ) [ ] { } / %
+local toregime = regimes.toregime
+local fromregime = regimes.fromregime
-local function toeight(str)
- return "(" .. str .. ")"
+local function topdfdoc(str,default)
+ if not str or str == "" then
+ return ""
+ else
+ return lpegmatch(escaped,toregime("pdfdoc",str,default)) -- could be combined if needed
+ end
end
-lpdf.toeight = toeight
+local function frompdfdoc(str)
+ if not str or str == "" then
+ return ""
+ else
+ return fromregime("pdfdoc",str)
+ end
+end
--- local escaped = lpeg.Cs((lpeg.S("\0\t\n\r\f ()[]{}/%")/function(s) return format("#%02X",byte(s)) end + lpeg.P(1))^0)
---
--- local function cleaned(str)
--- return (str and str ~= "" and lpegmatch(escaped,str)) or ""
--- end
---
--- lpdf.cleaned = cleaned -- not public yet
+if not toregime then topdfdoc = function(s) return s end end
+if not fromregime then frompdfdoc = function(s) return s end end
+
+local function toeight(str)
+ if not str or str == "" then
+ return "()"
+ else
+ return lpegmatch(escaped,str)
+ end
+end
+
+lpdf.tosixteen = tosixteen
+lpdf.toeight = toeight
+lpdf.topdfdoc = topdfdoc
+lpdf.fromsixteen = fromsixteen
+lpdf.frompdfdoc = frompdfdoc
local function merge_t(a,b)
local t = { }
@@ -249,6 +316,7 @@ local function merge_t(a,b)
return setmetatable(t,getmetatable(a))
end
+local f_key_null = formatters["/%s null"]
local f_key_value = formatters["/%s %s"]
local f_key_dictionary = formatters["/%s << % t >>"]
local f_dictionary = formatters["<< % t >>"]
@@ -275,12 +343,17 @@ tostring_d = function(t,contentonly,key)
r[rn] = f_key_value(k,toeight(v))
elseif tv == "number" then
r[rn] = f_key_number(k,v)
- elseif tv == "unicode" then
- r[rn] = f_key_value(k,tosixteen(v))
+ -- elseif tv == "unicode" then -- can't happen
+ -- r[rn] = f_key_value(k,tosixteen(v))
elseif tv == "table" then
local mv = getmetatable(v)
if mv and mv.__lpdftype then
- r[rn] = f_key_value(k,tostring(v))
+ -- if v == t then
+ -- report_objects("ignoring circular reference in dirctionary")
+ -- r[rn] = f_key_null(k)
+ -- else
+ r[rn] = f_key_value(k,tostring(v))
+ -- end
elseif v[1] then
r[rn] = f_key_value(k,tostring_a(v))
else
@@ -315,13 +388,18 @@ tostring_a = function(t,contentonly,key)
r[k] = toeight(v)
elseif tv == "number" then
r[k] = f_tonumber(v)
- elseif tv == "unicode" then
- r[k] = tosixteen(v)
+ -- elseif tv == "unicode" then
+ -- r[k] = tosixteen(v)
elseif tv == "table" then
local mv = getmetatable(v)
local mt = mv and mv.__lpdftype
if mt then
- r[k] = tostring(v)
+ -- if v == t then
+ -- report_objects("ignoring circular reference in array")
+ -- r[k] = "null"
+ -- else
+ r[k] = tostring(v)
+ -- end
elseif v[1] then
r[k] = tostring_a(v)
else
@@ -345,16 +423,17 @@ tostring_a = function(t,contentonly,key)
end
end
-local tostring_x = function(t) return concat(t," ") end
-local tostring_s = function(t) return toeight(t[1]) end
-local tostring_u = function(t) return tosixteen(t[1]) end
-local tostring_n = function(t) return tostring(t[1]) end -- tostring not needed
-local tostring_n = function(t) return f_tonumber(t[1]) end -- tostring not needed
-local tostring_c = function(t) return t[1] end -- already prefixed (hashed)
-local tostring_z = function() return "null" end
-local tostring_t = function() return "true" end
-local tostring_f = function() return "false" end
-local tostring_r = function(t) local n = t[1] return n and n > 0 and (n .. " 0 R") or "NULL" end
+local tostring_x = function(t) return concat(t," ") end
+local tostring_s = function(t) return toeight(t[1]) end
+local tostring_p = function(t) return topdfdoc(t[1],t[2]) end
+local tostring_u = function(t) return tosixteen(t[1]) end
+----- tostring_n = function(t) return tostring(t[1]) end -- tostring not needed
+local tostring_n = function(t) return f_tonumber(t[1]) end -- tostring not needed
+local tostring_c = function(t) return t[1] end -- already prefixed (hashed)
+local tostring_z = function() return "null" end
+local tostring_t = function() return "true" end
+local tostring_f = function() return "false" end
+local tostring_r = function(t) local n = t[1] return n and n > 0 and (n .. " 0 R") or "null" end
local tostring_v = function(t)
local s = t[1]
@@ -365,18 +444,19 @@ local tostring_v = function(t)
end
end
-local function value_x(t) return t end -- the call is experimental
-local function value_s(t,key) return t[1] end -- the call is experimental
-local function value_u(t,key) return t[1] end -- the call is experimental
-local function value_n(t,key) return t[1] end -- the call is experimental
-local function value_c(t) return sub(t[1],2) end -- the call is experimental
-local function value_d(t) return tostring_d(t,true) end -- the call is experimental
-local function value_a(t) return tostring_a(t,true) end -- the call is experimental
-local function value_z() return nil end -- the call is experimental
-local function value_t(t) return t.value or true end -- the call is experimental
-local function value_f(t) return t.value or false end -- the call is experimental
-local function value_r() return t[1] or 0 end -- the call is experimental -- NULL
-local function value_v() return t[1] end -- the call is experimental
+local function value_x(t) return t end
+local function value_s(t) return t[1] end
+local function value_p(t) return t[1] end
+local function value_u(t) return t[1] end
+local function value_n(t) return t[1] end
+local function value_c(t) return sub(t[1],2) end
+local function value_d(t) return tostring_d(t,true) end
+local function value_a(t) return tostring_a(t,true) end
+local function value_z() return nil end
+local function value_t(t) return t.value or true end
+local function value_f(t) return t.value or false end
+local function value_r() return t[1] or 0 end -- null
+local function value_v() return t[1] end
local function add_x(t,k,v) rawset(t,k,tostring(v)) end
@@ -385,6 +465,7 @@ local mt_d = { __lpdftype = "dictionary", __tostring = tostring_d, __call = valu
local mt_a = { __lpdftype = "array", __tostring = tostring_a, __call = value_a }
local mt_u = { __lpdftype = "unicode", __tostring = tostring_u, __call = value_u }
local mt_s = { __lpdftype = "string", __tostring = tostring_s, __call = value_s }
+local mt_p = { __lpdftype = "docstring", __tostring = tostring_p, __call = value_p }
local mt_n = { __lpdftype = "number", __tostring = tostring_n, __call = value_n }
local mt_c = { __lpdftype = "constant", __tostring = tostring_c, __call = value_c }
local mt_z = { __lpdftype = "null", __tostring = tostring_z, __call = value_z }
@@ -418,8 +499,12 @@ local function pdfstring(str,default)
return setmetatable({ str or default or "" },mt_s)
end
+local function pdfdocstring(str,default,defaultchar)
+ return setmetatable({ str or default or "", defaultchar or " " },mt_p)
+end
+
local function pdfunicode(str,default)
- return setmetatable({ str or default or "" },mt_u)
+ return setmetatable({ str or default or "" },mt_u) -- could be a string
end
local cache = { } -- can be weak
@@ -503,6 +588,7 @@ end
lpdf.stream = pdfstream -- THIS WILL PROBABLY CHANGE
lpdf.dictionary = pdfdictionary
lpdf.array = pdfarray
+lpdf.docstring = pdfdocstring
lpdf.string = pdfstring
lpdf.unicode = pdfunicode
lpdf.number = pdfnumber
@@ -532,7 +618,7 @@ end
-- lpdf.object = pdfdeferredobject
-- lpdf.referenceobject = pdfreferenceobject
-local pagereference = pdf.pageref or tex.pdfpageref
+local pagereference = pdf.pageref -- tex.pdfpageref is obsolete
local nofpages = 0
function lpdf.pagereference(n)
@@ -765,108 +851,147 @@ end
callbacks.register("finish_pdffile", lpdf.finalizedocument)
--- some minimal tracing, handy for checking the order
-local function trace_set(what,key)
- if trace_resources then
- report_finalizing("setting key %a in %a",key,what)
- end
-end
-local function trace_flush(what)
- if trace_resources then
- report_finalizing("flushing %a",what)
- end
-end
+do
-lpdf.protectresources = true
+ -- some minimal tracing, handy for checking the order
-local catalog = pdfdictionary { Type = pdfconstant("Catalog") } -- nicer, but when we assign we nil the Type
-local info = pdfdictionary { Type = pdfconstant("Info") } -- nicer, but when we assign we nil the Type
------ names = pdfdictionary { Type = pdfconstant("Names") } -- nicer, but when we assign we nil the Type
+ local function trace_set(what,key)
+ if trace_resources then
+ report_finalizing("setting key %a in %a",key,what)
+ end
+ end
-local function flushcatalog() if not environment.initex then trace_flush("catalog") catalog.Type = nil pdfsetcatalog(catalog()) end end
-local function flushinfo () if not environment.initex then trace_flush("info") info .Type = nil pdfsetinfo (info ()) end end
--------------- flushnames () if not environment.initex then trace_flush("names") names .Type = nil pdfsetnames (names ()) end end
+ local function trace_flush(what)
+ if trace_resources then
+ report_finalizing("flushing %a",what)
+ end
+ end
-function lpdf.addtocatalog(k,v) if not (lpdf.protectresources and catalog[k]) then trace_set("catalog",k) catalog[k] = v end end
-function lpdf.addtoinfo (k,v) if not (lpdf.protectresources and info [k]) then trace_set("info", k) info [k] = v end end
--------- lpdf.addtonames (k,v) if not (lpdf.protectresources and names [k]) then trace_set("names", k) names [k] = v end end
+ lpdf.protectresources = true
-local names = pdfdictionary {
- -- Type = pdfconstant("Names")
-}
+ local catalog = pdfdictionary { Type = pdfconstant("Catalog") } -- nicer, but when we assign we nil the Type
+ local info = pdfdictionary { Type = pdfconstant("Info") } -- nicer, but when we assign we nil the Type
+ ----- names = pdfdictionary { Type = pdfconstant("Names") } -- nicer, but when we assign we nil the Type
-local function flushnames()
- if next(names) and not environment.initex then
- names.Type = pdfconstant("Names")
- trace_flush("names")
- lpdf.addtocatalog("Names",pdfreference(pdfimmediateobject(tostring(names))))
+ local function flushcatalog()
+ if not environment.initex then
+ trace_flush("catalog")
+ catalog.Type = nil
+ pdfsetcatalog(catalog())
+ end
end
-end
-function lpdf.addtonames(k,v)
- if not (lpdf.protectresources and names [k]) then
- trace_set("names", k)
- names [k] = v
+ local function flushinfo()
+ if not environment.initex then
+ trace_flush("info")
+ info.Type = nil
+ pdfsetinfo(info())
+ end
end
-end
-local dummy = pdfreserveobject() -- else bug in hvmd due so some internal luatex conflict
+ -- local function flushnames()
+ -- if not environment.initex then
+ -- trace_flush("names")
+ -- names.Type = nil
+ -- pdfsetnames(names())
+ -- end
+ -- end
+
+ function lpdf.addtocatalog(k,v)
+ if not (lpdf.protectresources and catalog[k]) then
+ trace_set("catalog",k)
+ catalog[k] = v
+ end
+ end
--- Some day I will implement a proper minimalized resource management.
+ function lpdf.addtoinfo(k,v)
+ if not (lpdf.protectresources and info[k]) then
+ trace_set("info",k)
+ info[k] = v
+ end
+ end
-local r_extgstates, d_extgstates = pdfreserveobject(), pdfdictionary() local p_extgstates = pdfreference(r_extgstates)
-local r_colorspaces, d_colorspaces = pdfreserveobject(), pdfdictionary() local p_colorspaces = pdfreference(r_colorspaces)
-local r_patterns, d_patterns = pdfreserveobject(), pdfdictionary() local p_patterns = pdfreference(r_patterns)
-local r_shades, d_shades = pdfreserveobject(), pdfdictionary() local p_shades = pdfreference(r_shades)
+ -- local function lpdf.addtonames(k,v)
+ -- if not (lpdf.protectresources and names[k]) then
+ -- trace_set("names",k)
+ -- names[k] = v
+ -- end
+ -- end
-local function checkextgstates () if next(d_extgstates ) then addtopageresources("ExtGState", p_extgstates ) end end
-local function checkcolorspaces() if next(d_colorspaces) then addtopageresources("ColorSpace",p_colorspaces) end end
-local function checkpatterns () if next(d_patterns ) then addtopageresources("Pattern", p_patterns ) end end
-local function checkshades () if next(d_shades ) then addtopageresources("Shading", p_shades ) end end
+ local names = pdfdictionary {
+ -- Type = pdfconstant("Names")
+ }
-local function flushextgstates () if next(d_extgstates ) then trace_flush("extgstates") pdfimmediateobject(r_extgstates, tostring(d_extgstates )) end end
-local function flushcolorspaces() if next(d_colorspaces) then trace_flush("colorspaces") pdfimmediateobject(r_colorspaces,tostring(d_colorspaces)) end end
-local function flushpatterns () if next(d_patterns ) then trace_flush("patterns") pdfimmediateobject(r_patterns, tostring(d_patterns )) end end
-local function flushshades () if next(d_shades ) then trace_flush("shades") pdfimmediateobject(r_shades, tostring(d_shades )) end end
+ local function flushnames()
+ if next(names) and not environment.initex then
+ names.Type = pdfconstant("Names")
+ trace_flush("names")
+ lpdf.addtocatalog("Names",pdfreference(pdfimmediateobject(tostring(names))))
+ end
+ end
-function lpdf.collectedresources()
- local ExtGState = next(d_extgstates ) and p_extgstates
- local ColorSpace = next(d_colorspaces) and p_colorspaces
- local Pattern = next(d_patterns ) and p_patterns
- local Shading = next(d_shades ) and p_shades
- if ExtGState or ColorSpace or Pattern or Shading then
- local collected = pdfdictionary {
- ExtGState = ExtGState,
- ColorSpace = ColorSpace,
- Pattern = Pattern,
- Shading = Shading,
- -- ProcSet = pdfarray { pdfconstant("PDF") },
- }
- return collected()
- else
- return ""
+ function lpdf.addtonames(k,v)
+ if not (lpdf.protectresources and names[k]) then
+ trace_set("names", k)
+ names [k] = v
+ end
+ end
+
+ local r_extgstates, d_extgstates = pdfreserveobject(), pdfdictionary() local p_extgstates = pdfreference(r_extgstates)
+ local r_colorspaces, d_colorspaces = pdfreserveobject(), pdfdictionary() local p_colorspaces = pdfreference(r_colorspaces)
+ local r_patterns, d_patterns = pdfreserveobject(), pdfdictionary() local p_patterns = pdfreference(r_patterns)
+ local r_shades, d_shades = pdfreserveobject(), pdfdictionary() local p_shades = pdfreference(r_shades)
+
+ local function checkextgstates () if next(d_extgstates ) then addtopageresources("ExtGState", p_extgstates ) end end
+ local function checkcolorspaces() if next(d_colorspaces) then addtopageresources("ColorSpace",p_colorspaces) end end
+ local function checkpatterns () if next(d_patterns ) then addtopageresources("Pattern", p_patterns ) end end
+ local function checkshades () if next(d_shades ) then addtopageresources("Shading", p_shades ) end end
+
+ local function flushextgstates () if next(d_extgstates ) then trace_flush("extgstates") pdfimmediateobject(r_extgstates, tostring(d_extgstates )) end end
+ local function flushcolorspaces() if next(d_colorspaces) then trace_flush("colorspaces") pdfimmediateobject(r_colorspaces,tostring(d_colorspaces)) end end
+ local function flushpatterns () if next(d_patterns ) then trace_flush("patterns") pdfimmediateobject(r_patterns, tostring(d_patterns )) end end
+ local function flushshades () if next(d_shades ) then trace_flush("shades") pdfimmediateobject(r_shades, tostring(d_shades )) end end
+
+ function lpdf.collectedresources()
+ local ExtGState = next(d_extgstates ) and p_extgstates
+ local ColorSpace = next(d_colorspaces) and p_colorspaces
+ local Pattern = next(d_patterns ) and p_patterns
+ local Shading = next(d_shades ) and p_shades
+ if ExtGState or ColorSpace or Pattern or Shading then
+ local collected = pdfdictionary {
+ ExtGState = ExtGState,
+ ColorSpace = ColorSpace,
+ Pattern = Pattern,
+ Shading = Shading,
+ -- ProcSet = pdfarray { pdfconstant("PDF") },
+ }
+ return collected()
+ else
+ return ""
+ end
end
-end
-function lpdf.adddocumentextgstate (k,v) d_extgstates [k] = v end
-function lpdf.adddocumentcolorspace(k,v) d_colorspaces[k] = v end
-function lpdf.adddocumentpattern (k,v) d_patterns [k] = v end
-function lpdf.adddocumentshade (k,v) d_shades [k] = v end
+ function lpdf.adddocumentextgstate (k,v) d_extgstates [k] = v end
+ function lpdf.adddocumentcolorspace(k,v) d_colorspaces[k] = v end
+ function lpdf.adddocumentpattern (k,v) d_patterns [k] = v end
+ function lpdf.adddocumentshade (k,v) d_shades [k] = v end
-registerdocumentfinalizer(flushextgstates,3,"extended graphic states")
-registerdocumentfinalizer(flushcolorspaces,3,"color spaces")
-registerdocumentfinalizer(flushpatterns,3,"patterns")
-registerdocumentfinalizer(flushshades,3,"shades")
+ registerdocumentfinalizer(flushextgstates,3,"extended graphic states")
+ registerdocumentfinalizer(flushcolorspaces,3,"color spaces")
+ registerdocumentfinalizer(flushpatterns,3,"patterns")
+ registerdocumentfinalizer(flushshades,3,"shades")
-registerdocumentfinalizer(flushnames,3,"names") -- before catalog
-registerdocumentfinalizer(flushcatalog,3,"catalog")
-registerdocumentfinalizer(flushinfo,3,"info")
+ registerdocumentfinalizer(flushnames,3,"names") -- before catalog
+ registerdocumentfinalizer(flushcatalog,3,"catalog")
+ registerdocumentfinalizer(flushinfo,3,"info")
-registerpagefinalizer(checkextgstates,3,"extended graphic states")
-registerpagefinalizer(checkcolorspaces,3,"color spaces")
-registerpagefinalizer(checkpatterns,3,"patterns")
-registerpagefinalizer(checkshades,3,"shades")
+ registerpagefinalizer(checkextgstates,3,"extended graphic states")
+ registerpagefinalizer(checkcolorspaces,3,"color spaces")
+ registerpagefinalizer(checkpatterns,3,"patterns")
+ registerpagefinalizer(checkshades,3,"shades")
+
+end
-- in strc-bkm: lpdf.registerdocumentfinalizer(function() structures.bookmarks.place() end,1)
@@ -877,54 +1002,78 @@ end
-- ! -> universaltime
-local timestamp = os.date("%Y-%m-%dT%X") .. os.timezone(true)
+do
-function lpdf.timestamp()
- return timestamp
-end
+ local timestamp = os.date("%Y-%m-%dT%X") .. os.timezone(true)
-function lpdf.pdftimestamp(str)
- local Y, M, D, h, m, s, Zs, Zh, Zm = match(str,"^(%d%d%d%d)%-(%d%d)%-(%d%d)T(%d%d):(%d%d):(%d%d)([%+%-])(%d%d):(%d%d)$")
- return Y and format("D:%s%s%s%s%s%s%s%s'%s'",Y,M,D,h,m,s,Zs,Zh,Zm)
-end
+ function lpdf.timestamp()
+ return timestamp
+ end
+
+ function lpdf.pdftimestamp(str)
+ local Y, M, D, h, m, s, Zs, Zh, Zm = match(str,"^(%d%d%d%d)%-(%d%d)%-(%d%d)T(%d%d):(%d%d):(%d%d)([%+%-])(%d%d):(%d%d)$")
+ return Y and format("D:%s%s%s%s%s%s%s%s'%s'",Y,M,D,h,m,s,Zs,Zh,Zm)
+ end
+
+ function lpdf.id()
+ return format("%s.%s",tex.jobname,timestamp)
+ end
-function lpdf.id()
- return format("%s.%s",tex.jobname,timestamp)
end
+-- return nil is nicer in test prints
+
function lpdf.checkedkey(t,key,variant)
local pn = t and t[key]
- if pn then
+ if pn ~= nil then
local tn = type(pn)
if tn == variant then
if variant == "string" then
- return pn ~= "" and pn or nil
+ if pn ~= "" then
+ return pn
+ end
elseif variant == "table" then
- return next(pn) and pn or nil
+ if next(pn) then
+ return pn
+ end
else
return pn
end
- elseif tn == "string" and variant == "number" then
- return tonumber(pn)
+ elseif tn == "string" then
+ if variant == "number" then
+ return tonumber(pn)
+ elseif variant == "boolean" then
+ return isboolean(pn,nil,true)
+ end
end
end
+ -- return nil
end
function lpdf.checkedvalue(value,variant) -- code not shared
- if value then
+ if value ~= nil then
local tv = type(value)
if tv == variant then
if variant == "string" then
- return value ~= "" and value
+ if value ~= "" then
+ return value
+ end
elseif variant == "table" then
- return next(value) and value
+ if next(value) then
+ return value
+ end
else
return value
end
- elseif tv == "string" and variant == "number" then
- return tonumber(value)
+ elseif tv == "string" then
+ if variant == "number" then
+ return tonumber(value)
+ elseif variant == "boolean" then
+ return isboolean(value,nil,true)
+ end
end
end
+ -- return nil
end
function lpdf.limited(n,min,max,default)
@@ -944,10 +1093,11 @@ function lpdf.limited(n,min,max,default)
end
end
--- lpdf.addtoinfo("ConTeXt.Version", tex.contextversiontoks)
+-- lpdf.addtoinfo("ConTeXt.Version", environment.version)
-- lpdf.addtoinfo("ConTeXt.Time", os.date("%Y.%m.%d %H:%M")) -- :%S
-- lpdf.addtoinfo("ConTeXt.Jobname", environment.jobname)
-- lpdf.addtoinfo("ConTeXt.Url", "www.pragma-ade.com")
+-- lpdf.addtoinfo("ConTeXt.Support", "contextgarden.net")
-- if not pdfreferenceobject then
--
@@ -1002,3 +1152,62 @@ end
-- end
-- end,
-- })
+
+
+-- The next variant of ActualText is what Taco and I could come up with
+-- eventually. As of September 2013 Acrobat copies okay, Sumatra copies a
+-- question mark, pdftotext injects an extra space and Okular adds a
+-- newline plus space.
+
+-- return formatters["BT /Span << /ActualText (CONTEXT) >> BDC [<feff>] TJ % t EMC ET"](code)
+
+do
+
+ local f_actual_text_one = formatters["BT /Span << /ActualText <feff%04x> >> BDC [<feff>] TJ %s EMC ET"]
+ local f_actual_text_two = formatters["BT /Span << /ActualText <feff%04x%04x> >> BDC [<feff>] TJ %s EMC ET"]
+ local f_actual_text = formatters["/Span <</ActualText %s >> BDC"]
+
+ local context = context
+ local pdfdirect = nodes.pool.pdfdirect
+
+ function codeinjections.unicodetoactualtext(unicode,pdfcode)
+ if unicode < 0x10000 then
+ return f_actual_text_one(unicode,pdfcode)
+ else
+ return f_actual_text_two(unicode/1024+0xD800,unicode%1024+0xDC00,pdfcode)
+ end
+ end
+
+ implement {
+ name = "startactualtext",
+ arguments = "string",
+ actions = function(str)
+ context(pdfdirect(f_actual_text(tosixteen(str))))
+ end
+ }
+
+ implement {
+ name = "stopactualtext",
+ actions = function()
+ context(pdfdirect("EMC"))
+ end
+ }
+
+end
+
+-- interface
+
+local lpdfverbose = lpdf.verbose
+
+implement { name = "lpdf_collectedresources", actions = { lpdf.collectedresources, context } }
+implement { name = "lpdf_addtocatalog", arguments = two_strings, actions = lpdf.addtocatalog }
+implement { name = "lpdf_addtoinfo", arguments = two_strings, actions = lpdf.addtoinfo }
+implement { name = "lpdf_addtonames", arguments = two_strings, actions = lpdf.addtonames }
+implement { name = "lpdf_addpageattributes", arguments = two_strings, actions = lpdf.addtopageattributes }
+implement { name = "lpdf_addpagesattributes", arguments = two_strings, actions = lpdf.addtopagesattributes }
+implement { name = "lpdf_addpageresources", arguments = two_strings, actions = lpdf.addtopageresources }
+implement { name = "lpdf_adddocumentextgstate", arguments = two_strings, actions = function(a,b) lpdf.adddocumentextgstate (a,lpdfverbose(b)) end }
+implement { name = "lpdf_adddocumentcolorspace", arguments = two_strings, actions = function(a,b) lpdf.adddocumentcolorspace(a,lpdfverbose(b)) end }
+implement { name = "lpdf_adddocumentpattern", arguments = two_strings, actions = function(a,b) lpdf.adddocumentpattern (a,lpdfverbose(b)) end }
+implement { name = "lpdf_adddocumentshade", arguments = two_strings, actions = function(a,b) lpdf.adddocumentshade (a,lpdfverbose(b)) end }
+
diff --git a/Master/texmf-dist/tex/context/base/lpdf-mis.lua b/Master/texmf-dist/tex/context/base/lpdf-mis.lua
index 6efbd38820e..a1b12d8c0bb 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-mis.lua
+++ b/Master/texmf-dist/tex/context/base/lpdf-mis.lua
@@ -241,67 +241,93 @@ lpdf.registerdocumentfinalizer(flushjavascripts,"javascripts")
-- -- --
local pagespecs = {
- [variables.max] = { "FullScreen", false, false },
- [variables.bookmark] = { "UseOutlines", false, false },
- [variables.fit] = { "UseNone", false, true },
- [variables.doublesided] = { "UseNone", "TwoColumnRight", true },
- [variables.singlesided] = { "UseNone", false, false },
- [variables.default] = { "UseNone", "auto", false },
- [variables.auto] = { "UseNone", "auto", false },
- [variables.none] = { false, false, false },
+ [variables.max] = { mode = "FullScreen", layout = false, fit = false, fixed = false, duplex = false },
+ [variables.bookmark] = { mode = "UseOutlines", layout = false, fit = false, fixed = false, duplex = false },
+ [variables.fit] = { mode = "UseNone", layout = false, fit = true, fixed = false, duplex = false },
+ [variables.doublesided] = { mode = "UseNone", layout = "TwoColumnRight", fit = true, fixed = false, duplex = false },
+ [variables.singlesided] = { mode = "UseNone", layout = false, fit = false, fixed = false, duplex = false },
+ [variables.default] = { mode = "UseNone", layout = "auto", fit = false, fixed = false, duplex = false },
+ [variables.auto] = { mode = "UseNone", layout = "auto", fit = false, fixed = false, duplex = false },
+ [variables.none] = { mode = false, layout = false, fit = false, fixed = false, duplex = false },
+ -- new
+ [variables.fixed] = { mode = "UseNone", layout = "auto", fit = false, fixed = true, duplex = false }, -- noscale
+ [variables.landscape] = { mode = "UseNone", layout = "auto", fit = false, fixed = true, duplex = "DuplexFlipShortEdge" },
+ [variables.portrait] = { mode = "UseNone", layout = "auto", fit = false, fixed = true, duplex = "DuplexFlipLongEdge" },
+
}
local pagespec, topoffset, leftoffset, height, width, doublesided = "default", 0, 0, 0, 0, false
+local pdfpaperheight = tex.pdfpageheight
+local pdfpaperwidth = tex.pdfpagewidth
+
function codeinjections.setupcanvas(specification)
local paperheight = specification.paperheight
local paperwidth = specification.paperwidth
local paperdouble = specification.doublesided
if paperheight then
texset('global','pdfpageheight',paperheight)
+ pdfpaperheight = paperheight
end
if paperwidth then
texset('global','pdfpagewidth',paperwidth)
+ pdfpaperwidth = paperwidth
end
pagespec = specification.mode or pagespec
topoffset = specification.topoffset or 0
leftoffset = specification.leftoffset or 0
- height = specification.height or tex.pdfpageheight
- width = specification.width or tex.pdfpagewidth
+ height = specification.height or pdfpaperheight
+ width = specification.width or pdfpaperwidth
if paperdouble ~= nil then
doublesided = paperdouble
end
end
local function documentspecification()
+ if not pagespec or pagespec == "" then
+ pagespec = variables.default
+ end
+ -- local settings = utilities.parsers.settings_to_array(pagespec)
+ -- local spec = pagespecs[variables.default]
+ -- for i=1,#settings do
+ -- local s = pagespecs[settings[i]]
+ -- if s then
+ -- for k, v in next, s do
+ -- spec[k] = v
+ -- end
+ -- end
+ -- end
local spec = pagespecs[pagespec] or pagespecs[variables.default]
- if spec then
- local mode, layout, fit = spec[1], spec[2], spec[3]
- if layout == variables.auto then
- if doublesided then
- spec = pagespecs[variables.doublesided] -- to be checked voor interfaces
- if spec then
- mode, layout, fit = spec[1], spec[2], spec[3]
- end
- else
- layout = false
+ if spec.layout == "auto" then
+ if doublesided then
+ local s = pagespecs[variables.doublesided] -- to be checked voor interfaces
+ for k, v in next, s do
+ spec[k] = v
end
+ else
+ spec.layout = false
end
- mode = mode and pdfconstant(mode)
- layout = layout and pdfconstant(layout)
- fit = fit and pdfdictionary { FitWindow = true }
- if layout then
- addtocatalog("PageLayout",layout)
- end
- if mode then
- addtocatalog("PageMode",mode)
- end
- if fit then
- addtocatalog("ViewerPreferences",fit)
- end
- addtoinfo ("Trapped", pdfconstant("False")) -- '/Trapped' in /Info, 'Trapped' in XMP
- addtocatalog("Version", pdfconstant(format("1.%s",tex.pdfminorversion)))
end
+ local layout = spec.layout
+ local mode = spec.mode
+ local fit = spec.fit
+ local fixed = spec.fixed
+ local duplex = spec.duplex
+ if layout then
+ addtocatalog("PageLayout",pdfconstant(layout))
+ end
+ if mode then
+ addtocatalog("PageMode",pdfconstant(mode))
+ end
+ if fit or fixed or duplex then
+ addtocatalog("ViewerPreferences",pdfdictionary {
+ FitWindow = fit and true or nil,
+ PrintScaling = fixed and pdfconstant("None") or nil,
+ Duplex = duplex and pdfconstant(duplex) or nil,
+ })
+ end
+ addtoinfo ("Trapped", pdfconstant("False")) -- '/Trapped' in /Info, 'Trapped' in XMP
+ addtocatalog("Version", pdfconstant(format("1.%s",tex.pdfminorversion)))
end
-- temp hack: the mediabox is not under our control and has a precision of 4 digits
@@ -313,7 +339,7 @@ local function boxvalue(n) -- we could share them
end
local function pagespecification()
- local pageheight = tex.pdfpageheight
+ local pageheight = pdfpaperheight
local box = pdfarray { -- can be cached
boxvalue(leftoffset),
boxvalue(pageheight+topoffset-height),
diff --git a/Master/texmf-dist/tex/context/base/lpdf-pda.xml b/Master/texmf-dist/tex/context/base/lpdf-pda.xml
index 2d8e7b6f59f..3f6b969c01d 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-pda.xml
+++ b/Master/texmf-dist/tex/context/base/lpdf-pda.xml
@@ -3,15 +3,20 @@
<!-- lpdf-pda.xml -->
<x:xmpmeta xmlns:x="adobe:ns:meta/">
+ <!-- http://www.pdfa.org/wp-content/uploads/2011/08/tn0008_predefined_xmp_properties_in_pdfa-1_2008-03-20.pdf -->
<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:li xml:lang="x-default"/>
</rdf:Seq>
</dc:creator>
- <dc:description/>
+ <dc:description>
+ <rdf:Alt>
+ <rdf:li xml:lang="x-default"/>
+ </rdf:Alt>
+ </dc:description>
<dc:title>
<rdf:Alt>
<rdf:li xml:lang="x-default"/>
diff --git a/Master/texmf-dist/tex/context/base/lpdf-pdx.xml b/Master/texmf-dist/tex/context/base/lpdf-pdx.xml
index 42e11650e71..d55e1fdf303 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-pdx.xml
+++ b/Master/texmf-dist/tex/context/base/lpdf-pdx.xml
@@ -8,10 +8,14 @@
<dc:format>application/pdf</dc:format>
<dc:creator>
<rdf:Seq>
- <rdf:li/>
+ <rdf:li xml:lang="x-default"/>
</rdf:Seq>
</dc:creator>
- <dc:description/>
+ <dc:description>
+ <rdf:Alt>
+ <rdf:li xml:lang="x-default"/>
+ </rdf:Alt>
+ </dc:description>
<dc:title>
<rdf:Alt>
<rdf:li xml:lang="x-default"/>
diff --git a/Master/texmf-dist/tex/context/base/lpdf-ren.lua b/Master/texmf-dist/tex/context/base/lpdf-ren.lua
index 37b70642076..61676d5a81a 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-ren.lua
+++ b/Master/texmf-dist/tex/context/base/lpdf-ren.lua
@@ -54,12 +54,27 @@ local pdf_ocg = pdfconstant("OCG")
local pdf_ocmd = pdfconstant("OCMD")
local pdf_off = pdfconstant("OFF")
local pdf_on = pdfconstant("ON")
+local pdf_view = pdfconstant("View")
+local pdf_design = pdfconstant("Design")
local pdf_toggle = pdfconstant("Toggle")
local pdf_setocgstate = pdfconstant("SetOCGState")
local copy_node = node.copy
-local lpdf_usage = pdfdictionary { Print = pdfdictionary { PrintState = pdf_off } }
+local pdf_print = {
+ [v_yes] = pdfdictionary { PrintState = pdf_on },
+ [v_no ] = pdfdictionary { PrintState = pdf_off },
+}
+
+local pdf_intent = {
+ [v_yes] = pdf_view,
+ [v_no] = pdf_design,
+}
+
+local pdf_export = {
+ [v_yes] = pdf_on,
+ [v_no] = pdf_off,
+}
-- We can have references to layers before they are places, for instance from
-- hide and vide actions. This is why we need to be able to force usage of layers
@@ -99,10 +114,13 @@ local function useviewerlayer(name) -- move up so that we can use it as local
local nn = pdfreserveobject()
local nr = pdfreference(nn)
local nd = pdfdictionary {
- Type = pdf_ocg,
- Name = specification.title or "unknown",
- Intent = ((specification.editable ~= v_no) and pdf_design) or nil, -- disable layer hiding by user
- Usage = ((specification.printable == v_no) and lpdf_usage) or nil, -- printable or not
+ Type = pdf_ocg,
+ Name = specification.title or "unknown",
+ Usage = {
+ Intent = pdf_intent[specification.editable or v_yes], -- disable layer hiding by user (useless)
+ Print = pdf_print [specification.printable or v_yes], -- printable or not
+ Export = pdf_export[specification.export or v_yes], -- export or not
+ },
}
cache[#cache+1] = { nn, nd }
pdfln[tag] = nr -- was n
@@ -165,6 +183,14 @@ local function flushtextlayers()
ON = videlayers,
OFF = hidelayers,
BaseState = pdf_on,
+
+AS = pdfarray {
+ pdfdictionary {
+ Category = pdfarray { pdfconstant("Print") },
+ Event = pdfconstant("Print"),
+ OCGs = (viewerlayers.hasorder and sortedlayers) or nil,
+ }
+},
},
}
addtocatalog("OCProperties",d)
diff --git a/Master/texmf-dist/tex/context/base/lpdf-tag.lua b/Master/texmf-dist/tex/context/base/lpdf-tag.lua
index 276816e8041..dbe4d3f1ee7 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-tag.lua
+++ b/Master/texmf-dist/tex/context/base/lpdf-tag.lua
@@ -8,8 +8,10 @@ if not modules then modules = { } end modules ['lpdf-tag'] = {
local next = next
local format, match, concat = string.format, string.match, table.concat
-local lpegmatch = lpeg.match
+local lpegmatch, P, S, C = lpeg.match, lpeg.P, lpeg.S, lpeg.C
local utfchar = utf.char
+local settings_to_hash = utilities.parsers.settings_to_hash
+local formatters = string.formatters
local trace_tags = false trackers.register("structures.tags", function(v) trace_tags = v end)
@@ -78,13 +80,17 @@ local root = { pref = pdfreference(structure_ref), kids = structu
local tree = { }
local elements = { }
local names = pdfarray()
-local taglist = structures.tags.taglist
-local usedlabels = structures.tags.labels
-local properties = structures.tags.properties
+
+local structurestags = structures.tags
+local taglist = structurestags.taglist
+local specifications = structurestags.specifications
+local usedlabels = structurestags.labels
+local properties = structurestags.properties
+local lasttaginchain = structurestags.lastinchain
+
local usedmapping = { }
-local colonsplitter = lpeg.splitat(":")
-local dashsplitter = lpeg.splitat("-")
+-- local tagsplitter = structurestags.patterns.splitter
local add_ids = false -- true
@@ -96,13 +102,14 @@ local function finishstructure()
if #structure_kids > 0 then
local nums, n = pdfarray(), 0
for i=1,#tree do
- n = n + 1 ; nums[n] = i-1
+ n = n + 1 ; nums[n] = i - 1
n = n + 1 ; nums[n] = pdfreference(pdfflushobject(tree[i]))
end
local parenttree = pdfdictionary {
Nums = nums
}
-- we need to split names into smaller parts (e.g. alphabetic or so)
+ -- we already have code for that somewhere
if add_ids then
local kids = pdfdictionary {
Limits = pdfarray { names[1], names[#names-1] },
@@ -150,10 +157,10 @@ local pdf_mcr = pdfconstant("MCR")
local pdf_struct_element = pdfconstant("StructElem")
local function initializepage()
- index = 0
+ index = 0
pagenum = texgetcount("realpageno")
pageref = pdfreference(pdfpagereference(pagenum))
- list = pdfarray()
+ list = pdfarray()
tree[pagenum] = list -- we can flush after done, todo
end
@@ -164,20 +171,51 @@ end
-- here we can flush and free elements that are finished
+local pdf_userproperties = pdfconstant("UserProperties")
+
+local function makeattribute(t)
+ if t and next(t) then
+ local properties = pdfarray()
+ for k, v in next, t do
+ properties[#properties+1] = pdfdictionary {
+ N = pdfunicode(k),
+ V = pdfunicode(v),
+ }
+ end
+ return pdfdictionary {
+ O = pdf_userproperties,
+ P = properties,
+ }
+ end
+end
+
local function makeelement(fulltag,parent)
- local tag, n = lpegmatch(dashsplitter,fulltag)
- local tg, detail = lpegmatch(colonsplitter,tag)
- local k, r = pdfarray(), pdfreserveobject()
- usedmapping[tg] = true
- tg = usedlabels[tg] or tg
+ local specification = specifications[fulltag]
+ local tag = specification.tagname
+ if tag == "ignore" then
+ return false
+ elseif tag == "mstackertop" or tag == "mstackerbot" or tag == "mstackermid"then
+ -- TODO
+ return true
+ end
+ --
+ local detail = specification.detail
+ local userdata = specification.userdata
+ --
+ usedmapping[tag] = true
+ --
+ local k = pdfarray()
+ local r = pdfreserveobject()
+ local t = usedlabels[tag] or tag
local d = pdfdictionary {
Type = pdf_struct_element,
- S = pdfconstant(tg),
+ S = pdfconstant(t),
ID = (add_ids and fulltag) or nil,
T = detail and detail or nil,
P = parent.pref,
Pg = pageref,
K = pdfreference(r),
+ A = a and makeattribute(a) or nil,
-- Alt = " Who cares ",
-- ActualText = " Hi Hans ",
}
@@ -188,10 +226,14 @@ local function makeelement(fulltag,parent)
end
local kids = parent.kids
kids[#kids+1] = s
- elements[fulltag] = { tag = tag, pref = s, kids = k, knum = r, pnum = pagenum }
+ local e = { tag = t, pref = s, kids = k, knum = r, pnum = pagenum }
+ elements[fulltag] = e
+ return e
end
-local function makecontent(parent,start,stop,slist,id)
+local f_BDC = formatters["/%s <</MCID %s>> BDC"]
+
+local function makecontent(parent,id)
local tag = parent.tag
local kids = parent.kids
local last = index
@@ -215,116 +257,304 @@ local function makecontent(parent,start,stop,slist,id)
kids[#kids+1] = d
end
--
- local bliteral = pdfliteral(format("/%s <</MCID %s>>BDC",tag,last))
- local eliteral = pdfliteral("EMC")
- -- use insert instead:
- local prev = getprev(start)
- if prev then
- setfield(prev,"next",bliteral)
- setfield(bliteral,"prev",prev)
- end
- setfield(start,"prev",bliteral)
- setfield(bliteral,"next",start)
- -- use insert instead:
- local next = getnext(stop)
- if next then
- setfield(next,"prev",eliteral)
- setfield(eliteral,"next",next)
- end
- setfield(stop,"next",eliteral)
- setfield(eliteral,"prev",stop)
- --
- if slist and getlist(slist) == start then
- setfield(slist,"list",bliteral)
- elseif not getprev(start) then
- report_tags("this can't happen: injection in front of nothing")
- end
index = index + 1
- list[index] = parent.pref
- return bliteral, eliteral
+ list[index] = parent.pref -- page related list
+ --
+ return f_BDC(tag,last)
end
--- -- --
-
-local level, last, ranges, range = 0, nil, { }, nil
-
-local function collectranges(head,list)
- for n in traverse_nodes(head) do
- local id = getid(n) -- 14: image, 8: literal (mp)
- if id == glyph_code then
- local at = getattr(n,a_tagged)
- if not at then
- range = nil
- elseif last ~= at then
- range = { at, "glyph", n, n, list } -- attr id start stop list
- ranges[#ranges+1] = range
- last = at
- elseif range then
- range[4] = n -- stop
- end
- elseif id == hlist_code or id == vlist_code then
- local at = getattr(n,a_image)
- if at then
+-- no need to adapt head, as we always operate on lists
+
+function nodeinjections.addtags(head)
+
+ local last = nil
+ local ranges = { }
+ local range = nil
+ local head = tonut(head)
+
+ local function collectranges(head,list)
+ for n in traverse_nodes(head) do
+ local id = getid(n) -- 14: image, 8: literal (mp)
+ if id == glyph_code then
local at = getattr(n,a_tagged)
if not at then
range = nil
+ elseif last ~= at then
+ range = { at, "glyph", n, n, list } -- attr id start stop list
+ ranges[#ranges+1] = range
+ last = at
+ elseif range then
+ range[4] = n -- stop
+ end
+ elseif id == hlist_code or id == vlist_code then
+ local at = getattr(n,a_image)
+ if at then
+ local at = getattr(n,a_tagged)
+ if not at then
+ range = nil
+ else
+ ranges[#ranges+1] = { at, "image", n, n, list } -- attr id start stop list
+ end
+ last = nil
else
- ranges[#ranges+1] = { at, "image", n, n, list } -- attr id start stop list
+ local nl = getlist(n)
+ -- slide_nodelist(nl) -- temporary hack till math gets slided (tracker item)
+ collectranges(nl,n)
end
- last = nil
- else
- local nl = getlist(n)
- slide_nodelist(nl) -- temporary hack till math gets slided (tracker item)
- collectranges(nl,n)
end
end
end
-end
-function nodeinjections.addtags(head)
- -- no need to adapt head, as we always operate on lists
- level, last, ranges, range = 0, nil, { }, nil
initializepage()
- head = tonut(head)
+
collectranges(head)
+
if trace_tags then
for i=1,#ranges do
local range = ranges[i]
- local attr, id, start, stop = range[1], range[2], range[3], range[4]
- local tags = taglist[attr]
+ local attr = range[1]
+ local id = range[2]
+ local start = range[3]
+ local stop = range[4]
+ local tags = taglist[attr]
if tags then -- not ok ... only first lines
- report_tags("%s => %s : %05i % t",tosequence(start,start),tosequence(stop,stop),attr,tags)
+ report_tags("%s => %s : %05i % t",tosequence(start,start),tosequence(stop,stop),attr,tags.taglist)
end
end
end
+
+ local top = nil
+ local noftop = 0
+
for i=1,#ranges do
- local range = ranges[i]
- local attr, id, start, stop, list = range[1], range[2], range[3], range[4], range[5]
- local tags = taglist[attr]
- local prev = root
- local noftags, tag = #tags, nil
- for j=1,noftags do
- local tag = tags[j]
- if not elements[tag] then
- makeelement(tag,prev)
+ local range = ranges[i]
+ local attr = range[1]
+ local id = range[2]
+ local start = range[3]
+ local stop = range[4]
+ local list = range[5]
+ local specification = taglist[attr]
+ local taglist = specification.taglist
+ local noftags = #taglist
+ local common = 0
+
+ if top then
+ for i=1,noftags >= noftop and noftop or noftags do
+ if top[i] == taglist[i] then
+ common = i
+ else
+ break
+ end
+ end
+ end
+
+ local prev = common > 0 and elements[taglist[common]] or root
+
+ for j=common+1,noftags do
+ local tag = taglist[j]
+ local prv = elements[tag] or makeelement(tag,prev)
+ if prv == false then
+ -- ignore this one
+ prev = false
+ break
+ elseif prv == true then
+ -- skip this one
+ else
+ prev = prv
end
- prev = elements[tag]
end
- local b, e = makecontent(prev,start,stop,list,id)
- if start == head then
- report_tags("this can't happen: parent list gets tagged")
- head = b
+
+ if prev then
+ -- use insert instead:
+ local literal = pdfliteral(makecontent(prev,id))
+ local prev = getprev(start)
+ if prev then
+ setfield(prev,"next",literal)
+ setfield(literal,"prev",prev)
+ end
+ setfield(start,"prev",literal)
+ setfield(literal,"next",start)
+ if list and getlist(list) == start then
+ setfield(list,"list",literal)
+ end
+ -- use insert instead:
+ local literal = pdfliteral("EMC")
+ local next = getnext(stop)
+ if next then
+ setfield(next,"prev",literal)
+ setfield(literal,"next",next)
+ end
+ setfield(stop,"next",literal)
+ setfield(literal,"prev",stop)
end
+ top = taglist
+ noftop = noftags
end
+
finishpage()
- -- can be separate feature
- --
- -- injectspans(tonut(head)) -- does to work yet
- --
+
head = tonode(head)
return head, true
+
end
+-- variant: more structure but funny collapsing in viewer
+
+-- function nodeinjections.addtags(head)
+--
+-- local last, ranges, range = nil, { }, nil
+--
+-- local function collectranges(head,list)
+-- for n in traverse_nodes(head) do
+-- local id = getid(n) -- 14: image, 8: literal (mp)
+-- if id == glyph_code then
+-- local at = getattr(n,a_tagged)
+-- if not at then
+-- range = nil
+-- elseif last ~= at then
+-- range = { at, "glyph", n, n, list } -- attr id start stop list
+-- ranges[#ranges+1] = range
+-- last = at
+-- elseif range then
+-- range[4] = n -- stop
+-- end
+-- elseif id == hlist_code or id == vlist_code then
+-- local at = getattr(n,a_image)
+-- if at then
+-- local at = getattr(n,a_tagged)
+-- if not at then
+-- range = nil
+-- else
+-- ranges[#ranges+1] = { at, "image", n, n, list } -- attr id start stop list
+-- end
+-- last = nil
+-- else
+-- local nl = getlist(n)
+-- -- slide_nodelist(nl) -- temporary hack till math gets slided (tracker item)
+-- collectranges(nl,n)
+-- end
+-- end
+-- end
+-- end
+--
+-- initializepage()
+--
+-- head = tonut(head)
+-- collectranges(head)
+--
+-- if trace_tags then
+-- for i=1,#ranges do
+-- local range = ranges[i]
+-- local attr = range[1]
+-- local id = range[2]
+-- local start = range[3]
+-- local stop = range[4]
+-- local tags = taglist[attr]
+-- if tags then -- not ok ... only first lines
+-- report_tags("%s => %s : %05i % t",tosequence(start,start),tosequence(stop,stop),attr,tags.taglist)
+-- end
+-- end
+-- end
+--
+-- local top = nil
+-- local noftop = 0
+-- local last = nil
+--
+-- for i=1,#ranges do
+-- local range = ranges[i]
+-- local attr = range[1]
+-- local id = range[2]
+-- local start = range[3]
+-- local stop = range[4]
+-- local list = range[5]
+-- local specification = taglist[attr]
+-- local taglist = specification.taglist
+-- local noftags = #taglist
+-- local tag = nil
+-- local common = 0
+-- -- local prev = root
+--
+-- if top then
+-- for i=1,noftags >= noftop and noftop or noftags do
+-- if top[i] == taglist[i] then
+-- common = i
+-- else
+-- break
+-- end
+-- end
+-- end
+--
+-- local result = { }
+-- local r = noftop - common
+-- if r > 0 then
+-- for i=1,r do
+-- result[i] = "EMC"
+-- end
+-- end
+--
+-- local prev = common > 0 and elements[taglist[common]] or root
+--
+-- for j=common+1,noftags do
+-- local tag = taglist[j]
+-- local prv = elements[tag] or makeelement(tag,prev)
+-- -- if prv == false then
+-- -- -- ignore this one
+-- -- prev = false
+-- -- break
+-- -- elseif prv == true then
+-- -- -- skip this one
+-- -- else
+-- prev = prv
+-- r = r + 1
+-- result[r] = makecontent(prev,id)
+-- -- end
+-- end
+--
+-- if r > 0 then
+-- local literal = pdfliteral(concat(result,"\n"))
+-- -- use insert instead:
+-- local literal = pdfliteral(result)
+-- local prev = getprev(start)
+-- if prev then
+-- setfield(prev,"next",literal)
+-- setfield(literal,"prev",prev)
+-- end
+-- setfield(start,"prev",literal)
+-- setfield(literal,"next",start)
+-- if list and getlist(list) == start then
+-- setfield(list,"list",literal)
+-- end
+-- end
+--
+-- top = taglist
+-- noftop = noftags
+-- last = stop
+--
+-- end
+--
+-- if last and noftop > 0 then
+-- local result = { }
+-- for i=1,noftop do
+-- result[i] = "EMC"
+-- end
+-- local literal = pdfliteral(concat(result,"\n"))
+-- -- use insert instead:
+-- local next = getnext(last)
+-- if next then
+-- setfield(next,"prev",literal)
+-- setfield(literal,"next",next)
+-- end
+-- setfield(last,"next",literal)
+-- setfield(literal,"prev",last)
+-- end
+--
+-- finishpage()
+--
+-- head = tonode(head)
+-- return head, true
+--
+-- end
+
-- this belongs elsewhere (export is not pdf related)
function codeinjections.enabletags(tg,lb)
diff --git a/Master/texmf-dist/tex/context/base/lpdf-xmp.lua b/Master/texmf-dist/tex/context/base/lpdf-xmp.lua
index c8b2d236c62..b44c57b42aa 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-xmp.lua
+++ b/Master/texmf-dist/tex/context/base/lpdf-xmp.lua
@@ -26,7 +26,7 @@ local pdfconstant = lpdf.constant
local pdfreference = lpdf.reference
local pdfflushstreamobject = lpdf.flushstreamobject
--- I wonder why this begin end is empty / w (no time now to look into it)
+-- I wonder why this begin end is empty / w (no time now to look into it) / begin can also be "?"
local xpacket = [[
<?xpacket begin="" id="%s"?>
@@ -50,7 +50,7 @@ local mapping = {
-- Dublin Core schema
["Author"] = "rdf:Description/dc:creator/rdf:Seq/rdf:li",
["Format"] = "rdf:Description/dc:format", -- optional, but nice to have
- ["Subject"] = "rdf:Description/dc:description",
+ ["Subject"] = "rdf:Description/dc:description/rdf:Alt/rdf:li",
["Title"] = "rdf:Description/dc:title/rdf:Alt/rdf:li",
-- XMP Basic schema
["CreateDate"] = "rdf:Description/xmp:CreateDate",
@@ -91,7 +91,12 @@ local function setxmpfile(name)
end
codeinjections.setxmpfile = setxmpfile
-commands.setxmpfile = setxmpfile
+
+interfaces.implement {
+ name = "setxmpfile",
+ arguments = "string",
+ actions = setxmpfile
+}
local function valid_xmp()
if not xmp then
@@ -105,7 +110,7 @@ local function valid_xmp()
if xmpfile ~= "" then
report_xmp("using file %a",xmpfile)
end
- local xmpdata = (xmpfile ~= "" and io.loaddata(xmpfile)) or ""
+ local xmpdata = xmpfile ~= "" and io.loaddata(xmpfile) or ""
xmp = xml.convert(xmpdata)
end
return xmp
@@ -157,8 +162,7 @@ local function flushxmpinfo()
local producer = format("LuaTeX-%0.2f.%s",tex.luatexversion/100,tex.luatexrevision)
local creator = "LuaTeX + ConTeXt MkIV"
local time = lpdf.timestamp()
- local fullbanner = tex.pdftexbanner
- -- local fullbanner = gsub(tex.pdftexbanner,"kpse.*","")
+ local fullbanner = status.banner
pdfaddxmpinfo("DocumentID", documentid)
pdfaddxmpinfo("InstanceID", instanceid)
@@ -173,7 +177,7 @@ local function flushxmpinfo()
pdfaddtoinfo("Creator", creator)
pdfaddtoinfo("CreationDate", time)
pdfaddtoinfo("ModDate", time)
--- pdfaddtoinfo("PTEX.Fullbanner", fullbanner) -- no checking done on existence
+ -- pdfaddtoinfo("PTEX.Fullbanner", fullbanner) -- no checking done on existence
local blob = xml.tostring(xml.first(xmp or valid_xmp(),"/x:xmpmeta"))
local md = pdfdictionary {
diff --git a/Master/texmf-dist/tex/context/base/luat-bas.mkiv b/Master/texmf-dist/tex/context/base/luat-bas.mkiv
index a3891271619..cb00d8f55e7 100644
--- a/Master/texmf-dist/tex/context/base/luat-bas.mkiv
+++ b/Master/texmf-dist/tex/context/base/luat-bas.mkiv
@@ -13,7 +13,8 @@
\writestatus{loading}{ConTeXt Lua Macros / Basic Lua Libraries}
-\registerctxluafile{l-lua} {1.001}
+\registerctxluafile{l-lua} {1.001} % before sandbox
+\registerctxluafile{l-sandbox} {1.001}
\registerctxluafile{l-package} {1.001}
\registerctxluafile{l-lpeg} {1.001}
\registerctxluafile{l-function}{1.001}
diff --git a/Master/texmf-dist/tex/context/base/luat-cnf.lua b/Master/texmf-dist/tex/context/base/luat-cnf.lua
index fba2b71d1ec..0f6b8598f37 100644
--- a/Master/texmf-dist/tex/context/base/luat-cnf.lua
+++ b/Master/texmf-dist/tex/context/base/luat-cnf.lua
@@ -7,7 +7,9 @@ if not modules then modules = { } end modules ['luat-cnf'] = {
}
local type, next, tostring, tonumber = type, next, tostring, tonumber
-local format, concat, find = string.format, table.concat, string.find
+local format, concat, find, lower, gsub = string.format, table.concat, string.find, string.lower, string.gsub
+
+local report = logs.reporter("system")
local allocate = utilities.storage.allocate
@@ -17,8 +19,10 @@ texconfig.shell_escape = 't'
luatex = luatex or { }
local luatex = luatex
-texconfig.error_line = 79 -- 79 -- obsolete
-texconfig.half_error_line = 50 -- 50 -- obsolete
+texconfig.max_print_line = 100000 -- frozen
+texconfig.max_in_open = 127 -- frozen
+texconfig.error_line = 79 -- frozen
+texconfig.half_error_line = 50 -- frozen
texconfig.expand_depth = 10000 -- 10000
texconfig.hash_extra = 100000 -- 0
@@ -28,25 +32,9 @@ texconfig.max_print_line = 10000 -- 79
texconfig.max_strings = 500000 -- 15000
texconfig.param_size = 25000 -- 60
texconfig.save_size = 50000 -- 4000
+texconfig.save_size = 100000 -- 4000
texconfig.stack_size = 10000 -- 300
--- local function initialize()
--- local t, variable = allocate(), resolvers.variable
--- for name, default in next, variablenames do
--- local name = variablenames[i]
--- local value = variable(name)
--- value = tonumber(value)
--- if not value or value == "" or value == 0 then
--- value = default
--- end
--- texconfig[name], t[name] = value, value
--- end
--- initialize = nil
--- return t
--- end
---
--- luatex.variables = initialize()
-
local stub = [[
-- checking
@@ -76,7 +64,7 @@ function texconfig.init()
"string", "table", "coroutine", "debug", "file", "io", "lpeg", "math", "os", "package", "bit32",
},
basictex = { -- noad
- "callback", "font", "img", "lang", "lua", "node", "pdf", "status", "tex", "texconfig", "texio", "token",
+ "callback", "font", "img", "lang", "lua", "node", "pdf", "status", "tex", "texconfig", "texio", "token", "newtoken"
},
extralua = {
"gzip", "zip", "zlib", "lfs", "ltn12", "mime", "socket", "md5", "profiler", "unicode", "utf",
@@ -87,6 +75,7 @@ function texconfig.init()
obsolete = {
"fontforge", -- can be filled by luat-log
"kpse",
+ "token",
},
functions = {
"assert", "pcall", "xpcall", "error", "collectgarbage",
@@ -175,26 +164,55 @@ end)
]]
local variablenames = {
- "error_line", "half_error_line",
- "expand_depth", "hash_extra", "nest_size",
- "max_in_open", "max_print_line", "max_strings",
- "param_size", "save_size", "stack_size",
+ error_line = false,
+ half_error_line = false,
+ max_print_line = false,
+ max_in_open = false,
+ expand_depth = true,
+ hash_extra = true,
+ nest_size = true,
+ max_strings = true,
+ param_size = true,
+ save_size = true,
+ stack_size = true,
}
local function makestub()
name = name or (environment.jobname .. ".lui")
+ report("creating stub file %a using directives:",name)
+ report()
firsttable = firsttable or lua.firstbytecode
local t = {
"-- this file is generated, don't change it\n",
"-- configuration (can be overloaded later)\n"
}
- for _,v in next, variablenames do
+ for v, permitted in table.sortedhash(variablenames) do
+ local d = "luatex." .. gsub(lower(v),"[^%a]","")
+ local dv = directives.value(d)
local tv = texconfig[v]
- if tv and tv ~= "" then
+ if dv then
+ if not tv then
+ report(" %s = %s (%s)",d,dv,"configured")
+ tv = dv
+ elseif not permitted then
+ report(" %s = %s (%s)",d,tv,"frozen")
+ elseif tonumber(dv) >= tonumber(tv) then
+ report(" %s = %s (%s)",d,dv,"overloaded")
+ tv = dv
+ else
+ report(" %s = %s (%s)",d,tv,"preset kept")
+ end
+ elseif tv then
+ report(" %s = %s (%s)",d,tv,permitted and "preset" or "frozen")
+ else
+ report(" %s = <unset>",d)
+ end
+ if tv then
t[#t+1] = format("texconfig.%s=%s",v,tv)
end
end
io.savedata(name,format("%s\n\n%s",concat(t,"\n"),format(stub,firsttable)))
+ logs.newline()
end
lua.registerfinalizer(makestub,"create stub file")
diff --git a/Master/texmf-dist/tex/context/base/luat-cod.lua b/Master/texmf-dist/tex/context/base/luat-cod.lua
index c16a3b110ea..c436ee6d7a6 100644
--- a/Master/texmf-dist/tex/context/base/luat-cod.lua
+++ b/Master/texmf-dist/tex/context/base/luat-cod.lua
@@ -162,7 +162,7 @@ local function target_file(name)
return targetpath .. "/" .. name
end
-local function find_read_file (id,name)
+local function find_read_file(id,name)
return source_file(name)
end
diff --git a/Master/texmf-dist/tex/context/base/luat-exe.lua b/Master/texmf-dist/tex/context/base/luat-exe.lua
index a57a5a006fb..d8d954a307b 100644
--- a/Master/texmf-dist/tex/context/base/luat-exe.lua
+++ b/Master/texmf-dist/tex/context/base/luat-exe.lua
@@ -6,121 +6,68 @@ if not modules then modules = { } end modules ['luat-exe'] = {
license = "see context related readme files"
}
--- this module needs checking (very old and never really used, not even enabled)
+if not sandbox then require("l-sandbox") require("util-sbx") end -- for testing
-local match, find, gmatch = string.match, string.find, string.gmatch
-local concat = table.concat
-local select = select
+local type = type
-local report_executers = logs.reporter("system","executers")
+local executers = resolvers.executers or { }
+resolvers.executers = executers
-resolvers.executers = resolvers.executers or { }
-local executers = resolvers.executers
+local disablerunners = sandbox.disablerunners
+local registerbinary = sandbox.registerbinary
+local registerroot = sandbox.registerroot
-local permitted = { }
+local lpegmatch = lpeg.match
-local osexecute = os.execute
-local osexec = os.exec
-local osspawn = os.spawn
-local iopopen = io.popen
+local sc_splitter = lpeg.tsplitat(";")
+local cm_splitter = lpeg.tsplitat(",")
-local execute = osexecute
-local exec = osexec
-local spawn = osspawn
-local popen = iopopen
-
-local function register(...)
- for k=1,select("#",...) do
- local v = select(k,...)
- permitted[#permitted+1] = v == "*" and ".*" or v
- end
-end
+local execution_mode directives.register("system.executionmode", function(v) execution_mode = v end)
+local execution_list directives.register("system.executionlist", function(v) execution_list = v end)
+local root_list directives.register("system.rootlist", function(v) root_list = v end)
-local function prepare(...)
- -- todo: make more clever first split
- local t = { ... }
- local n = #n
- local one = t[1]
- if n == 1 then
- if type(one) == 'table' then
- return one, concat(t," ",2,n)
- else
- local name, arguments = match(one,"^(.-)%s+(.+)$")
- if name and arguments then
- return name, arguments
- else
- return one, ""
+sandbox.initializer(function()
+ if execution_mode == "none" then
+ -- will be done later
+ elseif execution_mode == "list" then
+ if type(execution_list) == "string" then
+ execution_list = lpegmatch(cm_splitter,execution_list)
+ end
+ if type(execution_list) == "table" then
+ for i=1,#execution_list do
+ registerbinary(execution_list[i])
end
end
else
- return one, concat(t," ",2,n)
+ -- whatever else we have configured
end
-end
+end)
-local function executer(action)
- return function(...)
- local name, arguments = prepare(...)
- for k=1,#permitted do
- local v = permitted[k]
- if find(name,v) then
- return action(name .. " " .. arguments)
- else
- report_executers("not permitted: %s %s",name,arguments)
+sandbox.initializer(function()
+ if type(root_list) == "string" then
+ root_list = lpegmatch(sc_splitter,root_list)
+ end
+ if type(root_list) == "table" then
+ for i=1,#root_list do
+ local entry = root_list[i]
+ if entry ~= "" then
+ registerroot(entry)
end
end
- return action("")
end
-end
+end)
-local function finalize() -- todo: os.exec, todo: report ipv print
- execute = executer(osexecute)
- exec = executer(osexec)
- spawn = executer(osspawn)
- popen = executer(iopopen)
- finalize = function()
- report_executers("already finalized")
- end
- register = function()
- report_executers("already finalized, no registration permitted")
- end
- os.execute = execute
- os.exec = exec
- os.spawn = spawn
- io.popen = popen
-end
-
-executers.finalize = function(...) return finalize(...) end
-executers.register = function(...) return register(...) end
-executers.execute = function(...) return execute (...) end
-executers.exec = function(...) return exec (...) end
-executers.spawn = function(...) return spawn (...) end
-executers.popen = function(...) return popen (...) end
-
-local execution_mode directives.register("system.executionmode", function(v) execution_mode = v end)
-local execution_list directives.register("system.executionlist", function(v) execution_list = v end)
-
-function executers.check()
+sandbox.finalizer(function()
if execution_mode == "none" then
- finalize()
- elseif execution_mode == "list" and execution_list ~= "" then
- for s in gmatch("[^%s,]",execution_list) do
- register(s)
- end
- finalize()
- else
- -- all
+ disablerunners()
end
-end
-
---~ resolvers.executers.register('.*')
---~ resolvers.executers.register('*')
---~ resolvers.executers.register('dir','ls')
---~ resolvers.executers.register('dir')
+end)
---~ resolvers.executers.finalize()
---~ resolvers.executers.execute('dir',"*.tex")
---~ resolvers.executers.execute("dir *.tex")
---~ resolvers.executers.execute("ls *.tex")
---~ os.execute('ls')
+-- Let's prevent abuse of these libraries (built-in support still works).
---~ resolvers.executers.check()
+sandbox.finalizer(function()
+ mplib = nil
+ epdf = nil
+ zip = nil
+ fontloader = nil
+end)
diff --git a/Master/texmf-dist/tex/context/base/luat-fmt.lua b/Master/texmf-dist/tex/context/base/luat-fmt.lua
index 20a4a8fcdf7..92c1dd6c45d 100644
--- a/Master/texmf-dist/tex/context/base/luat-fmt.lua
+++ b/Master/texmf-dist/tex/context/base/luat-fmt.lua
@@ -95,7 +95,7 @@ function environment.make_format(name)
-- generate format
local command = format("%s --ini %s --lua=%s %s %sdump",engine,primaryflags(),quoted(usedluastub),quoted(fulltexsourcename),os.platform == "unix" and "\\\\" or "\\")
report_format("running command: %s\n",command)
- os.spawn(command)
+ os.execute(command)
-- remove related mem files
local pattern = file.removesuffix(file.basename(usedluastub)).."-*.mem"
-- report_format("removing related mplib format with pattern %a", pattern)
@@ -133,7 +133,7 @@ function environment.run_format(name,data,more)
else
local command = format("%s %s --fmt=%s --lua=%s %s %s",engine,primaryflags(),quoted(barename),quoted(luaname),quoted(data),more ~= "" and quoted(more) or "")
report_format("running command: %s",command)
- os.spawn(command)
+ os.execute(command)
end
end
end
diff --git a/Master/texmf-dist/tex/context/base/luat-ini.lua b/Master/texmf-dist/tex/context/base/luat-ini.lua
index 9303b614a3e..34e83e7bb38 100644
--- a/Master/texmf-dist/tex/context/base/luat-ini.lua
+++ b/Master/texmf-dist/tex/context/base/luat-ini.lua
@@ -6,14 +6,6 @@ if not modules then modules = { } end modules ['luat-ini'] = {
license = "see context related readme files"
}
--- rather experimental down here ... adapted to lua 5.2 ... but still
--- experimental
-
-local debug = require("debug")
-
-local string, table, lpeg, math, io, system = string, table, lpeg, math, io, system
-local rawset, rawget, next, setmetatable = rawset, rawget, next, setmetatable
-
--[[ldx--
<p>We cannot load anything yet. However what we will do us reserve a few tables.
These can be used for runtime user data or third party modules and will not be
@@ -29,180 +21,6 @@ parametersets = parametersets or { } -- experimental for team
table.setmetatableindex(moduledata,table.autokey)
table.setmetatableindex(thirddata, table.autokey)
---[[ldx--
-<p>Please create a namespace within these tables before using them!</p>
-
-<typing>
-userdata ['my.name'] = { }
-thirddata['tricks' ] = { }
-</typing>
---ldx]]--
-
---[[ldx--
-<p>We could cook up a readonly model for global tables but it makes more sense
-to invite users to use one of the predefined namespaces. One can redefine the
-protector. After all, it's just a lightweight suggestive system, not a
-watertight one.</p>
---ldx]]--
-
-local global = _G
-global.global = global
-
-local dummy = function() end
-
---[[ldx--
-<p>Another approach is to freeze tables by using a metatable, this will be
-implemented stepwise.</p>
---ldx]]--
-
--- moduledata : no need for protection (only for developers)
--- isolatedata : full protection
--- userdata : protected
--- thirddata : protected
-
---[[ldx--
-<p>We could have a metatable that automaticaly creates a top level namespace.</p>
---ldx]]--
-
-local luanames = lua.name -- luatex itself
-
-lua.numbers = lua.numbers or { } local numbers = lua.numbers
-lua.messages = lua.messages or { } local messages = lua.messages
-
-storage.register("lua/numbers", numbers, "lua.numbers" )
-storage.register("lua/messages", messages, "lua.messages")
-
-local f_message = string.formatters["=[instance: %s]"] -- the = controls the lua error / see: lobject.c
-
-local setfenv = setfenv or debug.setfenv -- < 5.2
-
-if setfenv then
-
- local protected = {
- -- global table
- global = global,
- -- user tables
- -- moduledata = moduledata,
- userdata = userdata,
- thirddata = thirddata,
- documentdata = documentdata,
- -- reserved
- protect = dummy,
- unprotect = dummy,
- -- luatex
- tex = tex,
- -- lua
- string = string,
- table = table,
- lpeg = lpeg,
- math = math,
- io = io,
- file = file,
- bit32 = bit32,
- --
- context = context,
- }
-
- local protect_full = function(name)
- local t = { }
- for k, v in next, protected do
- t[k] = v
- end
- return t
- end
-
- local protect_part = function(name) -- adds
- local t = rawget(global,name)
- if not t then
- t = { }
- for k, v in next, protected do
- t[k] = v
- end
- rawset(global,name,t)
- end
- return t
- end
-
- protect = function(name)
- if name == "isolateddata" then
- setfenv(2,protect_full(name))
- else
- setfenv(2,protect_part(name or "shareddata"))
- end
- end
-
- function lua.registername(name,message)
- local lnn = lua.numbers[name]
- if not lnn then
- lnn = #messages + 1
- messages[lnn] = message
- numbers[name] = lnn
- end
- luanames[lnn] = message
- context(lnn)
- -- initialize once
- if name ~= "isolateddata" then
- protect_full(name or "shareddata")
- end
- end
-
-elseif libraries then -- assume >= 5.2
-
- local shared
-
- protect = function(name)
- if not shared then
- -- e.g. context is not yet known
- local public = {
- global = global,
- -- moduledata = moduledata,
- userdata = userdata,
- thirddata = thirddata,
- documentdata = documentdata,
- protect = dummy,
- unprotect = dummy,
- context = context,
- }
- --
- for k, v in next, libraries.builtin do public[k] = v end
- for k, v in next, libraries.functions do public[k] = v end
- for k, v in next, libraries.obsolete do public[k] = nil end
- --
- shared = { __index = public }
- protect = function(name)
- local t = global[name] or { }
- setmetatable(t,shared) -- set each time
- return t
- end
- end
- return protect(name)
- end
-
- function lua.registername(name,message)
- local lnn = lua.numbers[name]
- if not lnn then
- lnn = #messages + 1
- messages[lnn] = message
- numbers[name] = lnn
- end
- luanames[lnn] = f_message(message)
- context(lnn)
- end
-
-else
-
- protect = dummy
-
- function lua.registername(name,message)
- local lnn = lua.numbers[name]
- if not lnn then
- lnn = #messages + 1
- messages[lnn] = message
- numbers[name] = lnn
- end
- luanames[lnn] = f_message(message)
- context(lnn)
- end
-
+if not global then
+ global = _G
end
-
diff --git a/Master/texmf-dist/tex/context/base/luat-ini.mkiv b/Master/texmf-dist/tex/context/base/luat-ini.mkiv
index 7823ebd5a96..b455a415821 100644
--- a/Master/texmf-dist/tex/context/base/luat-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/luat-ini.mkiv
@@ -34,7 +34,7 @@
% the \type {\normalexpanded} around \type {\directlua}. Something to discuss
% in the team.
-\unexpanded\def\startlua % \stoplua
+\normalprotected\def\startlua % \stoplua
{\begingroup
\obeylualines
\luat_start_lua_indeed}
@@ -42,7 +42,7 @@
\def\luat_start_lua_indeed#1\stoplua
{\normalexpanded{\endgroup\noexpand\directlua{#1}}} % \zerocount is default
-\unexpanded\def\startluacode % \stopluacode
+\normalprotected\def\startluacode % \stopluacode
{\begingroup
\obeylualines
\obeyluatokens
@@ -77,7 +77,7 @@
\edef\lua_letter_seven {\string\7} \edef\lua_letter_eight {\string\8}
\edef\lua_letter_nine {\string\9} \edef\lua_letter_zero {\string\0}
-\appendtoks
+\everyluacode {% \appendtoks
\let\\\lua_letter_backslash
\let\|\lua_letter_bar \let\-\lua_letter_dash
\let\(\lua_letter_lparent \let\)\lua_letter_rparent
@@ -92,93 +92,15 @@
\let\5\lua_letter_five \let\6\lua_letter_six
\let\7\lua_letter_seven \let\8\lua_letter_eight
\let\9\lua_letter_nine \let\0\lua_letter_zero
-\to \everyluacode
+} % \to \everyluacode
-\unexpanded\def\obeyluatokens
+\normalprotected\def\obeyluatokens
{\setcatcodetable\luacatcodes
\the\everyluacode}
-
\edef\luamajorversion{\ctxwrite{_MINORVERSION}}
\edef\luaminorversion{\ctxwrite{_MAJORVERSION}}
-%D \macros
-%D {definenamedlua}
-%D
-%D We provide an interface for defining instances:
-
-\def\s!lua{lua} \def\v!code{code} \def\!!name{name} \def\s!data{data}
-
-%D Beware: because \type {\expanded} is een convert command, the error
-%D message will show \type{<inserted text>} as part of the message.
-
-\installcorenamespace{luacode}
-
-\unexpanded\def\luat_start_named_lua_code#1%
- {\begingroup
- \obeylualines
- \obeyluatokens
- \csname\??luacode#1\endcsname}
-
-% \unexpanded\def\definenamedlua[#1]#2[#3]% no optional arg handling here yet / we could use numbers instead (more efficient)
-% {\ifcsname\??luacode#1\endcsname \else
-% \scratchcounter\ctxlua{lua.registername("#1","#3")}%
-% \normalexpanded{\xdef\csname\??luacode#1\endcsname##1\csname\e!stop#1\v!code\endcsname}%
-% {\noexpand\normalexpanded{\endgroup\noexpand\directlua\the\scratchcounter{_G=protect("#1\s!data")##1}}}%
-% \expandafter\edef\csname\e!start#1\v!code\endcsname {\luat_start_named_lua_code{#1}}%
-% \expandafter\edef\csname #1\v!code\endcsname##1{\noexpand\directlua\the\scratchcounter{_G=protect("#1\s!data")##1}}%
-% \fi}
-
-\unexpanded\def\definenamedlua[#1]#2[#3]% no optional arg handling here yet / we could use numbers instead (more efficient)
- {\ifcsname\??luacode#1\endcsname \else
- \expandafter\chardef\csname\??luacode:#1\endcsname\ctxlua{lua.registername("#1","#3")}%
- \normalexpanded{\xdef\csname\??luacode#1\endcsname##1\csname\e!stop#1\v!code\endcsname}%
- {\noexpand\normalexpanded{\endgroup\noexpand\directlua\csname\??luacode:#1\endcsname{_G=protect("#1\s!data")##1}}}%
- \expandafter\edef\csname\e!start#1\v!code\endcsname {\luat_start_named_lua_code{#1}}%
- \expandafter\edef\csname #1\v!code\endcsname##1{\noexpand\directlua\csname\??luacode:#1\endcsname{_G=protect("#1\s!data")##1}}%
- \fi}
-
-%D We predefine a few.
-
-% \definenamedlua[module][module instance] % not needed
-
-\definenamedlua[user] [private user]
-\definenamedlua[third] [third party module]
-\definenamedlua[isolated][isolated]
-
-%D In practice this works out as follows:
-%D
-%D \startbuffer
-%D \startluacode
-%D context("LUA")
-%D \stopluacode
-%D
-%D \startusercode
-%D global.context("USER 1")
-%D context.par()
-%D context("USER 2")
-%D context.par()
-%D if characters then
-%D context("ACCESS directly")
-%D elseif global.characters then
-%D context("ACCESS via global")
-%D else
-%D context("NO ACCESS at all")
-%D end
-%D context.par()
-%D if bogus then
-%D context("ACCESS directly")
-%D elseif global.bogus then
-%D context("ACCESS via global")
-%D else
-%D context("NO ACCESS at all")
-%D end
-%D context.par()
-%D \stopusercode
-%D \stopbuffer
-%D
-%D \typebuffer
-
%D We need a way to pass strings safely to \LUA\ without the
%D need for tricky escaping. Compare:
%D
@@ -196,23 +118,28 @@
%D for it:
%D
%D \starttyping
-%D \long\edef\luaescapestring#1{\!!bs#1\!!es}
+%D \edef\luaescapestring#1{\!!bs#1\!!es}
%D \stoptyping
-\def\setdocumentfilename #1#2{\ctxlua{document.setfilename(#1,"#2")}}
-\def\setdocumentargument #1#2{\ctxlua{document.setargument("#1","#2")}}
-\def\setdocumentargumentdefault#1#2{\ctxlua{document.setdefaultargument("#1","#2")}}
-\def\getdocumentfilename #1{\ctxlua{document.getfilename("#1")}}
-\def\getdocumentargument #1{\ctxlua{document.getargument("#1")}}
-\def\getdocumentargumentdefault#1#2{\ctxlua{document.getargument("#1","#2")}}
-\def\doifdocumentargumentelse #1{\doifsomethingelse{\getdocumentargument{#1}}}
-\def\doifdocumentargument #1{\doifsomething {\getdocumentargument{#1}}}
-\def\doifnotdocumentargument #1{\doifnothing {\getdocumentargument{#1}}}
-\def\doifdocumentfilenameelse #1{\doifsomethingelse{\getdocumentfilename{#1}}}
-\def\doifdocumentfilename #1{\doifsomething {\getdocumentfilename{#1}}}
-\def\doifnotdocumentfilename #1{\doifnothing {\getdocumentfilename{#1}}}
-
-\let\doifelsedocumentargument\doifdocumentargumentelse
+\def\setdocumentfilename #1#2{\clf_setdocumentfilename\numexpr#1\relax{#2}}
+\def\setdocumentargument #1#2{\clf_setdocumentargument{#1}{#2}}
+\def\setdocumentargumentdefault#1#2{\clf_setdocumentdefaultargument{#1}{#2}}
+\def\getdocumentfilename #1{\clf_getdocumentfilename\numexpr#1\relax}
+\def\getdocumentargument #1{\clf_getdocumentargument{#1}{}}
+\def\setdocumentargument #1#2{\clf_setdocumentargument{#1}{#2}}
+\def\getdocumentargumentdefault#1#2{\clf_getdocumentargument{#1}{#2}}
+
+% seldom used so no need for speedy variants:
+
+\def\doifelsedocumentargument #1{\doifelsesomething{\clf_getdocumentargument{#1}}}
+\def\doifdocumentargument #1{\doifsomething {\clf_getdocumentargument{#1}}}
+\def\doifnotdocumentargument #1{\doifnothing {\clf_getdocumentargument{#1}}}
+\def\doifelsedocumentfilename #1{\doifelsesomething{\clf_getdocumentfilename\numexpr#1\relax}}
+\def\doifdocumentfilename #1{\doifsomething {\clf_getdocumentfilename\numexpr#1\relax}}
+\def\doifnotdocumentfilename #1{\doifnothing {\clf_getdocumentfilename\numexpr#1\relax}}
+
+\let\doifdocumentargumentelse\doifelsedocumentargument
+\let\doifdocumentfilenameelse\doifelsedocumentfilename
%D A handy helper:
@@ -220,7 +147,7 @@
%D Experimental:
-\unexpanded\def\startluaparameterset[#1]%
+\normalprotected\def\startluaparameterset[#1]%
{\begingroup
\obeylualines
\obeyluatokens
@@ -259,7 +186,7 @@
%D \ctxluacode{context("%0.5f",1/3)}
%D \stoptyping
-\unexpanded\def\ctxluacode
+\normalprotected\def\ctxluacode
{\begingroup
\obeylualines
\obeyluatokens
@@ -288,25 +215,19 @@
% \dorecurse{10000}{\ctxlua{context(" C3 ")}} \page
% \stoptext
-\installcorenamespace{ctxfunction}
+\installsystemnamespace{ctxfunction}
\normalprotected\def\startctxfunctiondefinition #1 %
{\begingroup \obeylualines \obeyluatokens \luat_start_lua_function_definition_indeed{#1}}
-% \def\luat_start_lua_function_definition_indeed#1#2\stopctxfunctiondefinition
-% {\endgroup\expandafter\edef\csname#1\endcsname{\noexpand\luafunction\ctxcommand{ctxfunction(\!!bs#2\!!es)}\relax}}
-
-\installcorenamespace{luafunction}
+\installsystemnamespace{luafunction}
\def\luat_start_lua_function_definition_indeed#1#2\stopctxfunctiondefinition
{\endgroup
\expandafter\chardef\csname\??luafunction#1\endcsname\ctxcommand{ctxfunction(\!!bs#2\!!es)}\relax
\expandafter\edef\csname#1\endcsname{\noexpand\luafunction\csname\??luafunction#1\endcsname}}
-% \unexpanded\def\setctxluafunction#1#2% experiment
-% {\expandafter\chardef\csname#1\endcsname#2\relax}
-
-\unexpanded\def\setctxluafunction#1#2% experiment
+\normalprotected\def\setctxluafunction#1#2% experiment
{\expandafter\chardef\csname\??luafunction#1\endcsname#2\relax
\expandafter\edef\csname#1\endcsname{\noexpand\luafunction\csname\??luafunction#1\endcsname}}
@@ -323,4 +244,40 @@
\def\ctxfunction#1%
{\csname\??ctxfunction#1\endcsname}
+% In theory this is faster due to the call not being wrapped in a function but in
+% practice the speedup can't be noticed. The actions called for often have lots of
+% lookups so an extra one doesn't matter much. The kind of calls differs a lot per
+% document and often there are other ways to optimize a style. For instance we can
+% gain a lot when defining a font, but when a frozen definition is used that gain
+% gets completely lost. For some calls (take list writers) it can get worse if only
+% because readability gets worse and passing is already efficient due to selective
+% flushing, while with the token scanners one has to scan all of them.
+
+% \startctxfunctiondefinition foo commands.foo() \stopctxfunctiondefinition
+%
+% \installctxfunction\foo{commands.foo}
+
+% This is a forward definition:
+
+\def\checkedstrippedcsname#1% this permits \strippedcsname{\xxx} and \strippedcsname{xxx}
+ {\expandafter\syst_helpers_checked_stripped_csname\string#1}
+
+\def\syst_helpers_checked_stripped_csname#1%
+ {\if\noexpand#1\letterbackslash\else#1\fi}
+
+\normalprotected\def\installctxfunction#1#2%
+ {\edef\m_syst_name{\checkedstrippedcsname#1}%
+ \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxfunction("#2",true)}\relax
+ \expandafter\xdef\csname\m_syst_name\endcsname{\noexpand\luafunction\csname\??luafunction\m_syst_name\endcsname}}
+
+\normalprotected\def\installctxscanner#1#2%
+ {\edef\m_syst_name{\checkedstrippedcsname#1}%
+ \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxscanner("\m_syst_name","#2",true)}\relax
+ \expandafter\xdef\csname\m_syst_name\endcsname{\noexpand\luafunction\csname\??luafunction\m_syst_name\endcsname}}
+
+\normalprotected\def\resetctxscanner#1%
+ {\edef\m_syst_name{\checkedstrippedcsname#1}%
+ \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\zerocount
+ \global\expandafter\let\csname\m_syst_name\endcsname\relax}
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/luat-iop.lua b/Master/texmf-dist/tex/context/base/luat-iop.lua
index 52f14683e76..e1772af4e90 100644
--- a/Master/texmf-dist/tex/context/base/luat-iop.lua
+++ b/Master/texmf-dist/tex/context/base/luat-iop.lua
@@ -6,190 +6,19 @@ if not modules then modules = { } end modules ['luat-iop'] = {
license = "see context related readme files"
}
--- this paranoid stuff in web2c ... we cannot hook checks into the
--- input functions because one can always change the callback but
--- we can feed back specific patterns and paths into the next
--- mechanism
-
--- os.execute os.exec os.spawn io.fopen
--- os.remove lfs.chdir lfs.mkdir
--- io.open zip.open epdf.open mlib.new
-
--- cache
-
-local topattern, find = string.topattern, string.find
-
-local report_limiter = logs.reporter("system","limiter")
-
--- the basic methods
-
-local function match(ruleset,name)
- local n = #ruleset
- if n > 0 then
- for i=1,n do
- local r = ruleset[i]
- if find(name,r[1]) then
- return r[2]
- end
- end
- return false
- else
- -- nothing defined (or any)
- return true
- end
-end
-
-local function protect(ruleset,proc)
- return function(name,...)
- if name == "" then
- -- report_limiter("no access permitted: <no name>") -- can happen in mplib code
- return nil, "no name given"
- elseif match(ruleset,name) then
- return proc(name,...)
- else
- report_limiter("no access permitted for %a",name)
- return nil, name .. ": no access permitted"
- end
- end
-end
-
-function io.limiter(preset)
- preset = preset or { }
- local ruleset = { }
- for i=1,#preset do
- local p = preset[i]
- local what, spec = p[1] or "", p[2] or ""
- if spec == "" then
- -- skip 'm
- elseif what == "tree" then
- resolvers.dowithpath(spec, function(r)
- local spec = resolvers.resolve(r) or ""
- if spec ~= "" then
- ruleset[#ruleset+1] = { topattern(spec,true), true }
- end
- end)
- elseif what == "permit" then
- ruleset[#ruleset+1] = { topattern(spec,true), true }
- elseif what == "forbid" then
- ruleset[#ruleset+1] = { topattern(spec,true), false }
- end
- end
- if #ruleset > 0 then
- return {
- match = function(name) return match (ruleset,name) end,
- protect = function(proc) return protect(ruleset,proc) end,
- }
- else
- return {
- match = function(name) return true end,
- protect = proc,
- }
- end
-end
-
--- a few handlers
-
-io.i_limiters = { }
-io.o_limiters = { }
-
-function io.i_limiter(v)
- local i = io.i_limiters[v]
- if i then
- local i_limiter = io.limiter(i)
- function io.i_limiter()
- return i_limiter
- end
- return i_limiter
- end
-end
-
-function io.o_limiter(v)
- local o = io.o_limiters[v]
- if o then
- local o_limiter = io.limiter(o)
- function io.o_limiter()
- return o_limiter
- end
- return o_limiter
- end
-end
-
--- the real thing (somewhat fuzzy as we need to know what gets done)
-
-local i_opener, i_limited = io.open, false
-local o_opener, o_limited = io.open, false
-
-local function i_register(v)
- if not i_limited then
- local i_limiter = io.i_limiter(v)
- if i_limiter then
- local protect = i_limiter.protect
- i_opener = protect(i_opener)
- i_limited = true
- report_limiter("input mode set to %a",v)
- end
- end
-end
-
-local function o_register(v)
- if not o_limited then
- local o_limiter = io.o_limiter(v)
- if o_limiter then
- local protect = o_limiter.protect
- o_opener = protect(o_opener)
- o_limited = true
- report_limiter("output mode set to %a",v)
- end
- end
-end
-
-function io.open(name,method)
- if method and find(method,"[wa]") then
- return o_opener(name,method)
- else
- return i_opener(name,method)
- end
-end
-
-directives.register("system.inputmode", i_register)
-directives.register("system.outputmode", o_register)
-
-local i_limited = false
-local o_limited = false
-
-local function i_register(v)
- if not i_limited then
- local i_limiter = io.i_limiter(v)
- if i_limiter then
- local protect = i_limiter.protect
- lfs.chdir = protect(lfs.chdir) -- needs checking
- i_limited = true
- end
- end
-end
-
-local function o_register(v)
- if not o_limited then
- local o_limiter = io.o_limiter(v)
- if o_limiter then
- local protect = o_limiter.protect
- os.remove = protect(os.remove) -- rather okay
- lfs.chdir = protect(lfs.chdir) -- needs checking
- lfs.mkdir = protect(lfs.mkdir) -- needs checking
- o_limited = true
- end
- end
-end
-
-directives.register("system.inputmode", i_register)
-directives.register("system.outputmode", o_register)
-
--- the definitions
-
-local limiters = resolvers.variable("limiters")
-
-if limiters then
- io.i_limiters = limiters.input or { }
- io.o_limiters = limiters.output or { }
-end
-
+local cleanedpathlist = resolvers.cleanedpathlist
+local registerroot = sandbox.registerroot
+
+sandbox.initializer(function()
+ local function register(str,mode)
+ local trees = cleanedpathlist(str)
+ for i=1,#trees do
+ registerroot(trees[i],mode)
+ end
+ end
+ register("TEXMF","read")
+ register("TEXINPUTS","read")
+ register("MPINPUTS","read")
+ -- register("TEXMFCACHE","write")
+ registerroot(".","write")
+end)
diff --git a/Master/texmf-dist/tex/context/base/luat-lib.mkiv b/Master/texmf-dist/tex/context/base/luat-lib.mkiv
index 3f72e780e8b..24f9da41513 100644
--- a/Master/texmf-dist/tex/context/base/luat-lib.mkiv
+++ b/Master/texmf-dist/tex/context/base/luat-lib.mkiv
@@ -36,6 +36,8 @@
\registerctxluafile{util-sta}{1.001}
+\registerctxluafile{util-sbx}{1.001} % needs tracker and templates
+
\registerctxluafile{data-ini}{1.001}
\registerctxluafile{data-exp}{1.001}
\registerctxluafile{data-env}{1.001}
@@ -71,8 +73,8 @@
\registerctxluafile{luat-ini}{1.001}
\registerctxluafile{util-env}{1.001}
\registerctxluafile{luat-env}{1.001}
-\registerctxluafile{luat-exe}{1.001}
-\registerctxluafile{luat-iop}{1.001}
+\registerctxluafile{luat-exe}{1.001} % simplified
+\registerctxluafile{luat-iop}{1.001} % simplified
\registerctxluafile{luat-bwc}{1.001}
\registerctxluafile{trac-lmx}{1.001} % might become l-lmx or luat-lmx
\registerctxluafile{luat-mac}{1.001}
diff --git a/Master/texmf-dist/tex/context/base/luat-mac.lua b/Master/texmf-dist/tex/context/base/luat-mac.lua
index 282dc8ce3d3..6214e591e5b 100644
--- a/Master/texmf-dist/tex/context/base/luat-mac.lua
+++ b/Master/texmf-dist/tex/context/base/luat-mac.lua
@@ -92,7 +92,7 @@ local nolong = 1 - longleft - longright
local utf8character = P(1) * R("\128\191")^1 -- unchecked but fast
local name = (R("AZ","az") + utf8character)^1
-local csname = (R("AZ","az") + S("@?!_") + utf8character)^1
+local csname = (R("AZ","az") + S("@?!_:-*") + utf8character)^1
local longname = (longleft/"") * (nolong^1) * (longright/"")
local variable = P("#") * Cs(name + longname)
local escapedname = escape * csname
@@ -144,7 +144,10 @@ local grammar = { "converter",
* V("texbody")
* stopcode
* poplocal,
- texbody = ( V("definition")
+ texbody = (
+leadingcomment -- new per 2015-03-03 (ugly)
++
+ V("definition")
+ identifier
+ V("braced")
+ (1 - stopcode)
@@ -201,7 +204,7 @@ end
function macros.convertfile(oldname,newname) -- beware, no testing on oldname == newname
local data = resolvers.loadtexfile(oldname)
- data = interfaces.preprocessed(data) or ""
+ data = interfaces.preprocessed(data) or "" -- interfaces not yet defined
io.savedata(newname,data)
end
@@ -385,7 +388,7 @@ end
-- \normalexpanded
-- {\def\yes[#one]#two\csname\e!stop#stoptag\endcsname{\command_yes[#one]{#two}}%
-- \def\nop #one\csname\e!stop#stoptag\endcsname{\command_nop {#one}}}%
--- \doifnextoptionalelse\yes\nop}
+-- \doifelsenextoptional\yes\nop}
-- ]]))
--
-- print(macros.preprocessed([[
diff --git a/Master/texmf-dist/tex/context/base/luat-run.lua b/Master/texmf-dist/tex/context/base/luat-run.lua
index 607c3528ae7..65cf0f33866 100644
--- a/Master/texmf-dist/tex/context/base/luat-run.lua
+++ b/Master/texmf-dist/tex/context/base/luat-run.lua
@@ -130,31 +130,21 @@ luatex.registerstopactions(luatex.cleanuptempfiles)
-- for the moment here
-local synctex = false
-
local report_system = logs.reporter("system")
+local synctex = 0
directives.register("system.synctex", function(v)
- synctex = v
- if v then
- report_system("synctex functionality is enabled!")
+ synctex = tonumber(v) or (toboolean(v,true) and 1) or (v == "zipped" and 1) or (v == "unzipped" and -1) or 0
+ if synctex ~= 0 then
+ report_system("synctex functionality is enabled (%s)!",tostring(synctex))
else
report_system("synctex functionality is disabled!")
end
- synctex = tonumber(synctex) or (toboolean(synctex,true) and 1) or (synctex == "zipped" and 1) or (synctex == "unzipped" and -1) or false
- -- currently this is bugged:
- tex.synctex = synctex
- -- so for the moment we need:
- context.normalsynctex()
- if synctex then
- context.plusone()
- else
- context.zerocount()
- end
+ tex.normalsynctex = synctex
end)
statistics.register("synctex tracing",function()
- if synctex or tex.synctex ~= 0 then
+ if synctex ~= 0 then
return "synctex has been enabled (extra log file generated)"
end
end)
@@ -230,3 +220,12 @@ directives.register("system.reportfiles", function(v)
register("stop_file", report_none)
end
end)
+
+-- start_run doesn't work
+
+-- luatex.registerstartactions(function()
+-- if environment.arguments.sandbox then
+-- sandbox.enable()
+-- end
+-- end)
+
diff --git a/Master/texmf-dist/tex/context/base/luat-usr.lua b/Master/texmf-dist/tex/context/base/luat-usr.lua
new file mode 100644
index 00000000000..071e3bf5bb9
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/luat-usr.lua
@@ -0,0 +1,192 @@
+if not modules then modules = { } end modules ['luat-usr'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local global = global
+
+local moduledata = moduledata
+local thirddata = thirddata
+local userdata = userdata
+local documentdata = documentdata
+
+local context = context
+local tostring = tostring
+local tonumber = tonumber
+local print = print
+
+local string = string
+local table = table
+local lpeg = lpeg
+local math = math
+local io = io
+local os = os
+local lpeg = lpeg
+
+local luanames = lua.name -- luatex itself
+
+local setmetatableindex = table.setmetatableindex
+local load = load
+local xpcall = xpcall
+local instance_banner = string.formatters["=[instance: %s]"] -- the = controls the lua error / see: lobject.c
+local tex_errormessage = context.errmessage
+
+local implement = interfaces.implement
+local reporter = logs.reporter
+
+local report_instance = reporter("lua instance")
+local report_script = reporter("lua script")
+local report_thread = reporter("lua thread")
+local newline = logs.newline
+
+lua.numbers = lua.numbers or { }
+lua.messages = lua.messages or { }
+
+local numbers = lua.numbers
+local messages = lua.messages
+
+storage.register("lua/numbers", numbers, "lua.numbers" )
+storage.register("lua/messages", messages, "lua.messages")
+
+-- First we implement a pure lua version of directlua and a persistent
+-- variant of it:
+
+local function runscript(code)
+ local done, message = loadstring(code)
+ if done then
+ done()
+ else
+ newline()
+ report_script("error : %s",message or "unknown")
+ report_script()
+ report_script("code : %s",code)
+ newline()
+ end
+end
+
+local threads = setmetatableindex(function(t,k)
+ local v = setmetatableindex({},global)
+ t[k] = v
+ return v
+end)
+
+local function runthread(name,code)
+ if not code or code == "" then
+ threads[name] = nil
+ else
+ local thread = threads[name]
+ local done, message = loadstring(code,nil,nil,thread)
+ if done then
+ done()
+ else
+ newline()
+ report_thread("thread: %s",name)
+ report_thread("error : %s",message or "unknown")
+ report_thread()
+ report_thread("code : %s",code)
+ newline()
+ end
+ end
+end
+
+interfaces.implement {
+ name = "luascript",
+ actions = runscript,
+ arguments = "string"
+}
+
+interfaces.implement {
+ name = "luathread",
+ actions = runthread,
+ arguments = { "string", "string" }
+}
+
+-- local scanners = interfaces.scanners
+--
+-- local function ctxscanner(name)
+-- local scanner = scanners[name]
+-- if scanner then
+-- scanner()
+-- else
+-- report("unknown scanner: %s",name)
+-- end
+-- end
+--
+-- interfaces.implement {
+-- name = "clfscanner",
+-- actions = ctxscanner,
+-- arguments = "string",
+-- }
+
+local function registername(name,message)
+ if not name or name == "" then
+ report_instance("no valid name given")
+ return
+ end
+ if not message or message == "" then
+ message = name
+ end
+ local lnn = numbers[name]
+ if not lnn then
+ lnn = #messages + 1
+ messages[lnn] = message
+ numbers[name] = lnn
+ end
+ luanames[lnn] = instance_banner(message)
+ local report = reporter("lua instance",message)
+ local proxy = {
+ -- we can access all via:
+ global = global, -- or maybe just a metatable
+ -- some protected data
+ moduledata = setmetatableindex(moduledata),
+ thirddata = setmetatableindex(thirddata),
+ -- less protected data
+ userdata = userdata,
+ documentdata = documentdata,
+ -- always there fast
+ context = context,
+ tostring = tostring,
+ tonumber = tonumber,
+ -- standard lua modules
+ string = string,
+ table = table,
+ lpeg = lpeg,
+ math = math,
+ io = io,
+ os = os,
+ lpeg = lpeg,
+ --
+ print = print,
+ report = report,
+ }
+ return function(code)
+ local code, message = load(code,nil,nil,proxy)
+ if not code then
+ report_instance("error: %s",message or code)
+ elseif not xpcall(code,report) then
+ tex_errormessage("hit return to continue or quit this run")
+ end
+ end
+end
+
+lua.registername = registername
+
+implement {
+ name = "registernamedlua",
+ arguments = { "string", "string", "string" },
+ actions = function(name,message,csname)
+ if csname and csname ~= "" then
+ implement {
+ name = csname,
+ arguments = "string",
+ actions = registername(name,message) or report,
+ scope = "private",
+ }
+ else
+ report_instance("unvalid csname for %a",message or name or "?")
+ end
+ end
+}
diff --git a/Master/texmf-dist/tex/context/base/luat-usr.mkiv b/Master/texmf-dist/tex/context/base/luat-usr.mkiv
new file mode 100644
index 00000000000..92d40010c0f
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/luat-usr.mkiv
@@ -0,0 +1,126 @@
+%D \module
+%D [ file=luat-usr,
+%D version=2005.08.11,% moved from luat-ini
+%D title=\CONTEXT\ Lua Macros,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Lua Macros / Userspace}
+
+\unprotect
+
+\registerctxluafile{luat-usr}{1.001}
+
+%D A few goodies:
+%D
+%D \startbuffer
+%D \luascript { context("foo 1:") context(i) }
+%D \luathread {test} { i = 10 context("bar 1:") context(i) }
+%D \luathread {test} { context("bar 2:") context(i) }
+%D \luathread {test} {}
+%D \luathread {test} { context("bar 3:") context(i) }
+%D \luascript { context("foo 2:") context(i) }
+%D \stopbuffer
+%D
+%D \typebuffer \startlines \getbuffer \stoplines
+
+\let\luascript \clf_luascript
+\let\luathread \clf_luathread
+%let\clfscanner\clf_clfscanner
+%def\clfscanner#1{\csname clf_#1\endcsname}
+
+%D \macros
+%D {definenamedlua}
+%D
+%D We provide an interface for defining instances:
+
+\def\s!lua {lua}
+\def\s!code {code}
+\def\s!data {data}
+%def\s!start{start}
+%def\s!stop {stop}
+
+%D Beware: because \type {\expanded} is een convert command, the error
+%D message will show \type{<inserted text>} as part of the message.
+
+\installsystemnamespace{luacode}
+
+\unexpanded\def\definenamedlua
+ {\bgroup
+ \dodoubleempty\syst_definenamedlua}
+
+\unexpanded\def\syst_definenamedlua[#1][#2]% no optional arg handling here yet / we could use numbers instead (more efficient)
+ {\iffirstargument
+ \ifcsname\??luacode#1\endcsname \else
+ %
+ \edef\fullname{lua_code_#1}%
+ %
+ \clf_registernamedlua{#1}{#2}{\fullname}%
+ %
+ \unexpanded\expandafter\xdef\csname\s!start#1\s!code\endcsname
+ {\begingroup
+ \obeylualines
+ \obeyluatokens
+ \csname\??luacode#1\endcsname}%
+ %
+ \global\expandafter\let\csname\s!stop#1\s!code\endcsname\relax
+ %
+ \normalexpanded{\xdef\csname\??luacode#1\endcsname##1\csname\s!stop#1\s!code\endcsname}%
+ {\noexpand\expandafter\endgroup
+ \noexpand\expandafter
+ \expandafter\noexpand\csname clf_\fullname\endcsname
+ \noexpand\expandafter{\noexpand\normalexpanded{##1}}}%
+ %
+ \global\expandafter\let\csname#1\s!code\expandafter\endcsname\csname clf_\fullname\endcsname
+ \fi
+ \fi
+ \egroup}
+
+%D We predefine a few.
+
+% \definenamedlua[module][module instance] % not needed
+
+\definenamedlua[user] [private user]
+\definenamedlua[third] [third party module]
+\definenamedlua[isolated][isolated]
+
+%D In practice this works out as follows:
+%D
+%D \startbuffer
+%D \startluacode
+%D context("LUA")
+%D \stopluacode
+%D
+%D \startusercode
+%D global.context("USER 1")
+%D context.par()
+%D context("USER 2")
+%D context.par()
+%D if characters then
+%D context("ACCESS directly")
+%D elseif global.characters then
+%D context("ACCESS via global")
+%D else
+%D context("NO ACCESS at all")
+%D end
+%D context.par()
+%D if bogus then
+%D context("ACCESS directly")
+%D elseif global.bogus then
+%D context("ACCESS via global")
+%D else
+%D context("NO ACCESS at all")
+%D end
+%D context.par()
+%D \stopusercode
+%D \stopbuffer
+%D
+%D \typebuffer
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/lxml-aux.lua b/Master/texmf-dist/tex/context/base/lxml-aux.lua
index 0fffe261a00..f6816ccb6b0 100644
--- a/Master/texmf-dist/tex/context/base/lxml-aux.lua
+++ b/Master/texmf-dist/tex/context/base/lxml-aux.lua
@@ -10,20 +10,23 @@ if not modules then modules = { } end modules ['lxml-aux'] = {
-- compatibility reasons
local trace_manipulations = false trackers.register("lxml.manipulations", function(v) trace_manipulations = v end)
+local trace_inclusions = false trackers.register("lxml.inclusions", function(v) trace_inclusions = v end)
local report_xml = logs.reporter("xml")
local xml = xml
-local xmlconvert, xmlcopy, xmlname = xml.convert, xml.copy, xml.name
+local xmlcopy, xmlname = xml.copy, xml.name
local xmlinheritedconvert = xml.inheritedconvert
local xmlapplylpath = xml.applylpath
local xmlfilter = xml.filter
-local type, setmetatable, getmetatable = type, setmetatable, getmetatable
+local type, next, setmetatable, getmetatable = type, next, setmetatable, getmetatable
local insert, remove, fastcopy, concat = table.insert, table.remove, table.fastcopy, table.concat
local gmatch, gsub, format, find, strip = string.gmatch, string.gsub, string.format, string.find, string.strip
local utfbyte = utf.byte
+local lpegmatch = lpeg.match
+local striplinepatterns = utilities.strings.striplinepatterns
local function report(what,pattern,c,e)
report_xml("%s element %a, root %a, position %a, index %a, pattern %a",what,xmlname(e),xmlname(e.__p__),c,e.ni,pattern)
@@ -83,13 +86,15 @@ end
function xml.each(root,pattern,handle,reverse)
local collected = xmlapplylpath(root,pattern)
if collected then
- if reverse then
- for c=#collected,1,-1 do
- handle(collected[c])
- end
- else
- for c=1,#collected do
- handle(collected[c])
+ if handle then
+ if reverse then
+ for c=#collected,1,-1 do
+ handle(collected[c])
+ end
+ else
+ for c=1,#collected do
+ handle(collected[c])
+ end
end
end
return collected
@@ -162,6 +167,8 @@ local function redo_ni(d)
end
end
+xml.reindex = redo_ni
+
local function xmltoelement(whatever,root)
if not whatever then
return nil
@@ -221,8 +228,18 @@ function xml.delete(root,pattern)
report('deleting',pattern,c,e)
end
local d = p.dt
- remove(d,e.ni)
- redo_ni(d) -- can be made faster and inlined
+ local ni = e.ni
+ if ni <= #d then
+ if false then
+ p.dt[ni] = ""
+ else
+ -- what if multiple deleted in one set
+ remove(d,ni)
+ redo_ni(d) -- can be made faster and inlined
+ end
+ else
+ -- disturbing
+ end
end
end
end
@@ -353,46 +370,63 @@ xml.insertbefore = function(r,p,e) insert_element(r,p,e,true) end
xml.injectafter = inject_element
xml.injectbefore = function(r,p,e) inject_element(r,p,e,true) end
-local function include(xmldata,pattern,attribute,recursive,loaddata)
- -- parse="text" (default: xml), encoding="" (todo)
- -- attribute = attribute or 'href'
- pattern = pattern or 'include'
- loaddata = loaddata or io.loaddata
+local function include(xmldata,pattern,attribute,recursive,loaddata,level)
+ -- attribute = attribute or 'href'
+ pattern = pattern or 'include'
+ loaddata = loaddata or io.loaddata
local collected = xmlapplylpath(xmldata,pattern)
if collected then
+ if not level then
+ level = 1
+ end
for c=1,#collected do
local ek = collected[c]
local name = nil
local ekdt = ek.dt
local ekat = ek.at
- local epdt = ek.__p__.dt
+ local ekrt = ek.__p__
+ local epdt = ekrt.dt
if not attribute or attribute == "" then
name = (type(ekdt) == "table" and ekdt[1]) or ekdt -- check, probably always tab or str
end
if not name then
for a in gmatch(attribute or "href","([^|]+)") do
name = ekat[a]
- if name then break end
+ if name then
+ break
+ end
+ end
+ end
+ local data = nil
+ if name and name ~= "" then
+ data = loaddata(name) or ""
+ if trace_inclusions then
+ report_xml("including %s bytes from %a at level %s by pattern %a and attribute %a (%srecursing)",#data,name,level,pattern,attribute or "",recursive and "" or "not ")
end
end
- local data = (name and name ~= "" and loaddata(name)) or ""
- if data == "" then
+ if not data or data == "" then
epdt[ek.ni] = "" -- xml.empty(d,k)
elseif ekat["parse"] == "text" then
-- for the moment hard coded
epdt[ek.ni] = xml.escaped(data) -- d[k] = xml.escaped(data)
else
---~ local settings = xmldata.settings
---~ settings.parent_root = xmldata -- to be tested
---~ local xi = xmlconvert(data,settings)
local xi = xmlinheritedconvert(data,xmldata)
if not xi then
epdt[ek.ni] = "" -- xml.empty(d,k)
else
if recursive then
- include(xi,pattern,attribute,recursive,loaddata)
+ include(xi,pattern,attribute,recursive,loaddata,level+1)
+ end
+ local child = xml.body(xi) -- xml.assign(d,k,xi)
+ child.__p__ = ekrt
+ child.__f__ = name -- handy for tracing
+ epdt[ek.ni] = child
+ local inclusions = xmldata.settings.inclusions
+ if inclusions then
+ inclusions[#inclusions+1] = name
+ else
+ xmldata.settings.inclusions = { name }
end
- epdt[ek.ni] = xml.body(xi) -- xml.assign(d,k,xi)
end
end
end
@@ -401,68 +435,100 @@ end
xml.include = include
+function xml.inclusion(e,default)
+ while e do
+ local f = e.__f__
+ if f then
+ return f
+ else
+ e = e.__p__
+ end
+ end
+ return default
+end
+
+function xml.inclusions(e,sorted)
+ while e do
+ local settings = e.settings
+ if settings then
+ local inclusions = settings.inclusions
+ if inclusions then
+ inclusions = table.unique(inclusions) -- a copy
+ if sorted then
+ table.sort(inclusions) -- so we sort the copy
+ end
+ return inclusions -- and return the copy
+ else
+ e = e.__p__
+ end
+ else
+ e = e.__p__
+ end
+ end
+end
+
+local b_collapser = lpeg.patterns.b_collapser
+local m_collapser = lpeg.patterns.m_collapser
+local e_collapser = lpeg.patterns.e_collapser
+
+local b_stripper = lpeg.patterns.b_stripper
+local m_stripper = lpeg.patterns.m_stripper
+local e_stripper = lpeg.patterns.e_stripper
+
+local lpegmatch = lpeg.match
+
local function stripelement(e,nolines,anywhere)
local edt = e.dt
if edt then
- if anywhere then
- local t, n = { }, 0
- for e=1,#edt do
+ local n = #edt
+ if n == 0 then
+ return e -- convenient
+ elseif anywhere then
+ local t = { }
+ local m = 0
+ for e=1,n do
local str = edt[e]
if type(str) ~= "string" then
- n = n + 1
- t[n] = str
+ m = m + 1
+ t[m] = str
elseif str ~= "" then
- -- todo: lpeg for each case
if nolines then
- str = gsub(str,"%s+"," ")
+ str = lpegmatch((n == 1 and b_collapser) or (n == m and e_collapser) or m_collapser,str)
+ else
+ str = lpegmatch((n == 1 and b_stripper) or (n == m and e_stripper) or m_stripper,str)
end
- str = gsub(str,"^%s*(.-)%s*$","%1")
if str ~= "" then
- n = n + 1
- t[n] = str
+ m = m + 1
+ t[m] = str
end
end
end
e.dt = t
else
- -- we can assume a regular sparse xml table with no successive strings
- -- otherwise we should use a while loop
- if #edt > 0 then
- -- strip front
- local str = edt[1]
- if type(str) ~= "string" then
- -- nothing
- elseif str == "" then
+ local str = edt[1]
+ if type(str) == "string" then
+ if str ~= "" then
+ str = lpegmatch(nolines and b_collapser or b_stripper,str)
+ end
+ if str == "" then
remove(edt,1)
+ n = n - 1
else
- if nolines then
- str = gsub(str,"%s+"," ")
- end
- str = gsub(str,"^%s+","")
- if str == "" then
- remove(edt,1)
- else
- edt[1] = str
- end
+ edt[1] = str
end
end
- local nedt = #edt
- if nedt > 0 then
- -- strip end
- local str = edt[nedt]
- if type(str) ~= "string" then
- -- nothing
- elseif str == "" then
- remove(edt)
- else
- if nolines then
- str = gsub(str,"%s+"," ")
- end
- str = gsub(str,"%s+$","")
+ if n > 0 then
+ str = edt[n]
+ if type(str) == "string" then
if str == "" then
remove(edt)
else
- edt[nedt] = str
+ str = lpegmatch(nolines and e_collapser or e_stripper,str)
+ if str == "" then
+ remove(edt)
+ else
+ edt[n] = str
+ end
end
end
end
@@ -702,8 +768,8 @@ function xml.finalizers.xml.cdata(collected)
return ""
end
-function xml.insertcomment(e,str,n) -- also insertcdata
- table.insert(e.dt,n or 1,{
+function xml.insertcomment(e,str,n)
+ insert(e.dt,n or 1,{
tg = "@cm@",
ns = "",
special = true,
@@ -712,7 +778,27 @@ function xml.insertcomment(e,str,n) -- also insertcdata
})
end
-function xml.setcdata(e,str) -- also setcomment
+function xml.insertcdata(e,str,n)
+ insert(e.dt,n or 1,{
+ tg = "@cd@",
+ ns = "",
+ special = true,
+ at = { },
+ dt = { str },
+ })
+end
+
+function xml.setcomment(e,str,n)
+ e.dt = { {
+ tg = "@cm@",
+ ns = "",
+ special = true,
+ at = { },
+ dt = { str },
+ } }
+end
+
+function xml.setcdata(e,str)
e.dt = { {
tg = "@cd@",
ns = "",
@@ -790,7 +876,7 @@ local function recurse(e,action)
for i=1,#edt do
local str = edt[i]
if type(str) ~= "string" then
- recurse(str,action,recursive)
+ recurse(str,action) -- ,recursive
elseif str ~= "" then
edt[i] = action(str)
end
@@ -809,3 +895,91 @@ function helpers.recursetext(collected,action,recursive)
end
end
end
+
+-- on request ... undocumented ...
+--
+-- _tag : element name
+-- _type : node type (_element can be an option)
+-- _namespace : only if given
+--
+-- [1..n] : text or table
+-- key : value or attribite 'key'
+--
+-- local str = [[
+-- <?xml version="1.0" ?>
+-- <a one="1">
+-- <!-- rubish -->
+-- <b two="1"/>
+-- <b two="2">
+-- c &gt; d
+-- </b>
+-- </a>
+-- ]]
+--
+-- inspect(xml.totable(xml.convert(str)))
+-- inspect(xml.totable(xml.convert(str),true))
+-- inspect(xml.totable(xml.convert(str),true,true))
+
+local specials = {
+ ["@rt@"] = "root",
+ ["@pi@"] = "instruction",
+ ["@cm@"] = "comment",
+ ["@dt@"] = "declaration",
+ ["@cd@"] = "cdata",
+}
+
+local function convert(x,strip,flat)
+ local ns = x.ns
+ local tg = x.tg
+ local at = x.at
+ local dt = x.dt
+ local node = flat and {
+ [0] = (not x.special and (ns ~= "" and ns .. ":" .. tg or tg)) or nil,
+ } or {
+ _namespace = ns ~= "" and ns or nil,
+ _tag = not x.special and tg or nil,
+ _type = specials[tg] or "_element",
+ }
+ if at then
+ for k, v in next, at do
+ node[k] = v
+ end
+ end
+ local n = 0
+ for i=1,#dt do
+ local di = dt[i]
+ if type(di) == "table" then
+ if flat and di.special then
+ -- ignore
+ else
+ di = convert(di,strip,flat)
+ if di then
+ n = n + 1
+ node[n] = di
+ end
+ end
+ elseif strip then
+ di = lpegmatch(strip,di)
+ if di ~= "" then
+ n = n + 1
+ node[n] = di
+ end
+ else
+ n = n + 1
+ node[n] = di
+ end
+ end
+ if next(node) then
+ return node
+ end
+end
+
+function xml.totable(x,strip,flat)
+ if type(x) == "table" then
+ if strip then
+ strip = striplinepatterns[strip]
+ end
+ return convert(x,strip,flat)
+ end
+end
+
diff --git a/Master/texmf-dist/tex/context/base/lxml-css.lua b/Master/texmf-dist/tex/context/base/lxml-css.lua
index 0deaea4d391..fa921b24f48 100644
--- a/Master/texmf-dist/tex/context/base/lxml-css.lua
+++ b/Master/texmf-dist/tex/context/base/lxml-css.lua
@@ -146,7 +146,19 @@ local pattern = Cf( Ct("") * (
+ (C("sansserif") + C("sans")) / "sans-serif" -- match before serif
+ C("serif")
)
- ) + P(1)
+ )
+--+ P("\\") * (
+-- P("bf") * ( Cg ( Cc("weight") * Cc("bold") ) )
+-- + P("bi") * ( Cg ( Cc("weight") * Cc("bold") )
+-- * Cg ( Cc("style") * Cc("italic") ) )
+-- + P("bs") * ( Cg ( Cc("weight") * Cc("bold") )
+-- * Cg ( Cc("style") * Cc("oblique") ) )
+-- + P("it") * ( Cg ( Cc("style") * Cc("italic") ) )
+-- + P("sl") * ( Cg ( Cc("style") * Cc("oblique") ) )
+-- + P("sc") * ( Cg ( Cc("variant") * Cc("small-caps") ) )
+-- + P("tt") * ( Cg ( Cc("family") * Cc("monospace") ) )
+--)
+ + P(1)
)^0 , rawset)
function css.fontspecification(str)
diff --git a/Master/texmf-dist/tex/context/base/lxml-ini.lua b/Master/texmf-dist/tex/context/base/lxml-ini.lua
new file mode 100644
index 00000000000..64e78eb42c8
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/lxml-ini.lua
@@ -0,0 +1,136 @@
+if not modules then modules = { } end modules ['lxml-ini'] = {
+ version = 1.001,
+ comment = "this module is the basis for the lxml-* ones",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local xml = xml
+local lxml = lxml
+
+-- this defines an extra scanner lxmlid:
+
+local scanners = tokens.scanners
+local scanstring = scanners.string
+local getid = lxml.id
+
+scanners.lxmlid = function() return getid(scanstring()) end
+
+local implement = interfaces.implement
+
+-- lxml.id
+
+implement { name = "lxmlid", actions = lxml.getid, arguments = "string" }
+
+implement { name = "xmldoif", actions = lxml.doif, arguments = { "string", "string" } }
+implement { name = "xmldoifnot", actions = lxml.doifnot, arguments = { "string", "string" } }
+implement { name = "xmldoifelse", actions = lxml.doifelse, arguments = { "string", "string" } }
+implement { name = "xmldoiftext", actions = lxml.doiftext, arguments = { "string", "string" } }
+implement { name = "xmldoifnottext", actions = lxml.doifnottext, arguments = { "string", "string" } }
+implement { name = "xmldoifelsetext", actions = lxml.doifelsetext, arguments = { "string", "string" } }
+
+implement { name = "xmldoifempty", actions = lxml.doifempty, arguments = { "string", "string" } }
+implement { name = "xmldoifnotempty", actions = lxml.doifnotempty, arguments = { "string", "string" } }
+implement { name = "xmldoifelseempty", actions = lxml.doifelseempty, arguments = { "string", "string" } }
+implement { name = "xmldoifselfempty", actions = lxml.doifempty, arguments = "string" }
+implement { name = "xmldoifnotselfempty", actions = lxml.doifnotempty, arguments = "string" }
+implement { name = "xmldoifelseselfempty", actions = lxml.doifelseempty, arguments = "string" }
+
+--------- { name = "xmlcontent", actions = lxml.content, arguments = "string" }
+--------- { name = "xmlflushstripped", actions = lxml.strip, arguments = { "string", true } }
+implement { name = "xmlall", actions = lxml.all, arguments = { "string", "string" } }
+implement { name = "xmlatt", actions = lxml.att, arguments = { "string", "string" } }
+implement { name = "xmlattdef", actions = lxml.att, arguments = { "string", "string", "string" } }
+implement { name = "xmlattribute", actions = lxml.attribute, arguments = { "string", "string", "string" } }
+implement { name = "xmlattributedef", actions = lxml.attribute, arguments = { "string", "string", "string", "string" } }
+implement { name = "xmlchainatt", actions = lxml.chainattribute, arguments = { "string", "'/'", "string" } }
+implement { name = "xmlchainattdef", actions = lxml.chainattribute, arguments = { "string", "'/'", "string", "string" } }
+implement { name = "xmlchecknamespace", actions = xml.checknamespace, arguments = { "lxmlid", "string", "string" } }
+implement { name = "xmlcommand", actions = lxml.command, arguments = { "string", "string", "string" } }
+implement { name = "xmlconcat", actions = lxml.concat, arguments = { "string", "string", "string" } } -- \detokenize{#3}
+implement { name = "xmlconcatrange", actions = lxml.concatrange, arguments = { "string", "string", "string", "string", "string" } } -- \detokenize{#5}
+implement { name = "xmlcontext", actions = lxml.context, arguments = { "string", "string" } }
+implement { name = "xmlcount", actions = lxml.count, arguments = { "string", "string" } }
+implement { name = "xmldelete", actions = lxml.delete, arguments = { "string", "string" } }
+implement { name = "xmldirect", actions = lxml.direct, arguments = "string" }
+implement { name = "xmldirectives", actions = lxml.directives.setup, arguments = "string" }
+implement { name = "xmldirectivesafter", actions = lxml.directives.after, arguments = "string" }
+implement { name = "xmldirectivesbefore", actions = lxml.directives.before, arguments = "string" }
+implement { name = "xmldisplayverbatim", actions = lxml.displayverbatim, arguments = "string" }
+implement { name = "xmlelement", actions = lxml.element, arguments = { "string", "string" } } -- could be integer but now we can alias
+implement { name = "xmlfilter", actions = lxml.filter, arguments = { "string", "string" } }
+implement { name = "xmlfilterlist", actions = lxml.filterlist, arguments = { "string", "string" } }
+implement { name = "xmlfirst", actions = lxml.first, arguments = { "string", "string" } }
+implement { name = "xmlflush", actions = lxml.flush, arguments = "string" }
+implement { name = "xmlflushcontext", actions = lxml.context, arguments = "string" }
+implement { name = "xmlflushlinewise", actions = lxml.flushlinewise, arguments = "string" }
+implement { name = "xmlflushspacewise", actions = lxml.flushspacewise, arguments = "string" }
+implement { name = "xmlfunction", actions = lxml.applyfunction, arguments = { "string", "string" } }
+implement { name = "xmlinclude", actions = lxml.include, arguments = { "string", "string", "string", true } }
+implement { name = "xmlincludeoptions", actions = lxml.include, arguments = { "string", "string", "string", "string" } }
+implement { name = "xmlinclusion", actions = lxml.inclusion, arguments = "string" }
+implement { name = "xmlinclusions", actions = lxml.inclusions, arguments = "string" }
+implement { name = "xmlindex", actions = lxml.index, arguments = { "string", "string", "string" } } -- can be integer but now we can alias
+implement { name = "xmlinfo", actions = lxml.info, arguments = "string" }
+implement { name = "xmlinlineverbatim", actions = lxml.inlineverbatim, arguments = "string" }
+implement { name = "xmllast", actions = lxml.last, arguments = "string" }
+implement { name = "xmlload", actions = lxml.load, arguments = { "string", "string", "string", "string" } }
+implement { name = "xmlloadbuffer", actions = lxml.loadbuffer, arguments = { "string", "string", "string", "string" } }
+implement { name = "xmlloaddata", actions = lxml.loaddata, arguments = { "string", "string", "string", "string" } }
+implement { name = "xmlloaddirectives", actions = lxml.directives.load, arguments = "string" }
+implement { name = "xmlloadregistered", actions = lxml.loadregistered, arguments = { "string", "string", "string" } }
+implement { name = "xmlmain", actions = lxml.main, arguments = "string" }
+implement { name = "xmlmatch", actions = lxml.match, arguments = "string" }
+implement { name = "xmlname", actions = lxml.name, arguments = "string" }
+implement { name = "xmlnamespace", actions = lxml.namespace, arguments = "string" }
+implement { name = "xmlnonspace", actions = lxml.nonspace, arguments = { "string", "string" } }
+implement { name = "xmlpos", actions = lxml.pos, arguments = "string" }
+implement { name = "xmlraw", actions = lxml.raw, arguments = { "string", "string" } }
+implement { name = "xmlregisterns", actions = xml.registerns, arguments = { "string", "string" } }
+implement { name = "xmlremapname", actions = xml.remapname, arguments = { "lxmlid", "string","string","string" } }
+implement { name = "xmlremapnamespace", actions = xml.renamespace, arguments = { "lxmlid", "string", "string" } }
+implement { name = "xmlsave", actions = lxml.save, arguments = { "string", "string" } }
+implement { name = "xmlsetfunction", actions = lxml.setaction, arguments = { "string", "string", "string" } }
+implement { name = "xmlsetsetup", actions = lxml.setsetup, arguments = { "string", "string", "string" } }
+implement { name = "xmlsnippet", actions = lxml.snippet, arguments = { "string", "string" } }
+implement { name = "xmlstrip", actions = lxml.strip, arguments = { "string", "string" } }
+implement { name = "xmlstripanywhere", actions = lxml.strip, arguments = { "string", "string", true, true } }
+implement { name = "xmlstripnolines", actions = lxml.strip, arguments = { "string", "string", true } }
+implement { name = "xmlstripped", actions = lxml.stripped, arguments = { "string", "string" } }
+implement { name = "xmlstrippednolines", actions = lxml.stripped, arguments = { "string", "string", true } }
+implement { name = "xmltag", actions = lxml.tag, arguments = "string" }
+implement { name = "xmltext", actions = lxml.text, arguments = { "string", "string" } }
+implement { name = "xmltobuffer", actions = lxml.tobuffer, arguments = { "string", "string", "string" } }
+implement { name = "xmltobufferverbose", actions = lxml.tobuffer, arguments = { "string", "string", "string", true } }
+implement { name = "xmltofile", actions = lxml.tofile, arguments = { "string", "string", "string" } }
+implement { name = "xmltoparameters", actions = lxml.toparameters, arguments = "string" }
+implement { name = "xmlverbatim", actions = lxml.verbatim, arguments = "string" }
+
+implement { name = "xmlstartraw", actions = lxml.startraw }
+implement { name = "xmlstopraw", actions = lxml.stopraw }
+
+implement { name = "xmlprependsetup", actions = lxml.installsetup, arguments = { 1, "string", "string" } } -- 2:*
+implement { name = "xmlappendsetup", actions = lxml.installsetup, arguments = { 2, "string", "string" } } -- 2:*
+implement { name = "xmlbeforesetup", actions = lxml.installsetup, arguments = { 3, "string", "string", "string" } } -- 2:*
+implement { name = "xmlaftersetup", actions = lxml.installsetup, arguments = { 4, "string", "string", "string" } } -- 2:*
+implement { name = "xmlprependdocumentsetup", actions = lxml.installsetup, arguments = { 1, "string", "string" } }
+implement { name = "xmlappenddocumentsetup", actions = lxml.installsetup, arguments = { 2, "string", "string" } }
+implement { name = "xmlbeforedocumentsetup", actions = lxml.installsetup, arguments = { 3, "string", "string", "string" } }
+implement { name = "xmlafterdocumentsetup", actions = lxml.installsetup, arguments = { 4, "string", "string" } }
+implement { name = "xmlremovesetup", actions = lxml.removesetup, arguments = { "string", "string" } } -- 1:*
+implement { name = "xmlremovedocumentsetup", actions = lxml.removesetup, arguments = { "string", "string" } }
+implement { name = "xmlflushdocumentsetups", actions = lxml.flushsetups, arguments = { "string", "string", "string" } } -- 2:*
+implement { name = "xmlresetdocumentsetups", actions = lxml.resetsetups, arguments = "string" }
+
+implement { name = "xmlgetindex", actions = lxml.getindex, arguments = { "string", "string" } }
+implement { name = "xmlwithindex", actions = lxml.withindex, arguments = { "string", "string", "string" } }
+
+implement { name = "xmlsetentity", actions = xml.registerentity, arguments = { "string", "string" } }
+implement { name = "xmltexentity", actions = lxml.registerentity, arguments = { "string", "string" } }
+
+implement { name = "xmlsetcommandtotext", actions = lxml.setcommandtotext, arguments = "string" }
+implement { name = "xmlsetcommandtonone", actions = lxml.setcommandtonone, arguments = "string" }
+
+implement { name = "xmlstarttiming", actions = function() statistics.starttiming(lxml) end }
+implement { name = "xmlstoptiming", actions = function() statistics.stoptiming (lxml) end }
diff --git a/Master/texmf-dist/tex/context/base/lxml-ini.mkiv b/Master/texmf-dist/tex/context/base/lxml-ini.mkiv
index 752e315da5e..1141288992e 100644
--- a/Master/texmf-dist/tex/context/base/lxml-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/lxml-ini.mkiv
@@ -12,6 +12,7 @@
%C details.
%D Todo: auto apply setups (manage at lua end)
+%D Todo: manuak: \xmlinclusion \xmlinclusions
\writestatus{loading}{ConTeXt XML Support / Initialization}
@@ -20,102 +21,195 @@
%registerctxluafile{lxml-xml}{1.001} % xml finalizers
%registerctxluafile{lxml-aux}{1.001} % extras using parser
%registerctxluafile{lxml-mis}{1.001} % extras independent of parser
-\registerctxluafile{char-ent}{1.001}
\registerctxluafile{lxml-ent}{1.001} % entity hacks
\registerctxluafile{lxml-tex}{1.001} % tex finalizers
\registerctxluafile{lxml-dir}{1.001} % ctx hacks
+\registerctxluafile{lxml-ini}{1.001} % interface
\unprotect % todo \!!bs \!!es where handy (slower)
+% todo: { } mandate
+% avoid #
+
\def\ctxlxml #1{\ctxlua{lxml.#1}}
-\def\xmlmain #1{\ctxlxml{main("#1")}}
-\def\xmlmatch #1{\ctxlxml{match("#1")}}
-\def\xmlall #1#2{\ctxlxml{all("#1","#2")}}
-\def\xmlatt #1#2{\ctxlxml{att("#1","#2")}}
-\def\xmlattdef #1#2#3{\ctxlxml{att("#1","#2","#3")}}
-\def\xmlchainatt #1#2{\ctxlxml{chainattribute("#1","/","#2")}}
-\def\xmlchainattdef #1#2#3{\ctxlxml{chainattribute("#1","/","#2","#3")}}
-\def\xmlattribute #1#2#3{\ctxlxml{attribute("#1","#2","#3")}}
-\def\xmlattributedef #1#2#3#4{\ctxlxml{attribute("#1","#2","#3","#4")}}
-\def\xmlcommand #1#2#3{\ctxlxml{command("#1","#2","#3")}}
-\def\xmlconcat #1#2#3{\ctxlxml{concat("#1","#2",[[\detokenize{#3}]])}}
-\def\xmlconcatrange #1#2#3#4#5{\ctxlxml{concatrange("#1","#2","#3","#4",[[\detokenize{#5}]])}}
-\def\xmlcount #1#2{\ctxlxml{count("#1","#2")}}
-\def\xmldelete #1#2{\ctxlxml{delete("#1","#2")}}
-\def\xmldirectives #1{\ctxlxml{directives.setup("#1")}}
-\def\xmldirectivesbefore #1{\ctxlxml{directives.before("#1")}}
-\def\xmldirectivesafter #1{\ctxlxml{directives.after("#1")}}
-\def\xmlfilter #1#2{\ctxlxml{filter("#1",\!!bs#2\!!es)}}
-\def\xmlfilterlist #1#2{\ctxlxml{filterlist("#1",\!!bs#2\!!es)}}
-\def\xmlfunction #1#2{\ctxlxml{applyfunction("#1",\!!bs#2\!!es)}}
-\def\xmlfirst #1#2{\ctxlxml{first("#1","#2")}}
-\def\xmlflush #1{\ctxlxml{flush("#1")}}
-\def\xmlflushlinewise #1{\ctxlxml{flushlinewise("#1")}}
-\def\xmlflushspacewise #1{\ctxlxml{flushspacewise("#1")}}
-%def\xmlcontent #1{\ctxlxml{content("#1")}}
-%def\xmlflushstripped #1{\ctxlxml{strip("#1",true)}}
-\def\xmldirect #1{\ctxlxml{direct("#1")}} % in loops, not dt but root
-\def\xmlidx #1#2#3{\ctxlxml{idx("#1","#2",\number#3)}}
-\def\xmlinclude #1#2#3{\ctxlxml{include("#1","#2","#3",true)}}
-\def\xmlincludeoptions#1#2#3#4{\ctxlxml{include("#1","#2","#3","#4")}}
-\def\xmlsave #1#2{\ctxlxml{save("#1","#2")}}
-\def\xmlindex #1#2#3{\ctxlxml{index("#1","#2",\number#3)}}
-\def\xmlinfo #1{\hbox{\ttxx[\ctxlxml{info("#1")}]}}
+%def\xmlall #1#2{\clf_xmlall {#1}{#2}}
+%def\xmlatt #1#2{\clf_xmlatt {#1}{#2}}
+%def\xmlattdef #1#2#3{\clf_xmlattdef {#1}{#2}{#3}}
+%def\xmlattribute #1#2#3{\clf_xmlattribute {#1}{#2}{#3}}
+%def\xmlattributedef #1#2#3#4{\clf_xmlattributedef {#1}{#2}{#3}{#4}}
+%def\xmlchainatt #1#2{\clf_xmlchainatt {#1}{#2}}
+%def\xmlchainattdef #1#2#3{\clf_xmlchainattdef {#1}{#2}{#3}}
+%def\xmlchecknamespace #1#2#3{\clf_xmlchecknamespace {#1}{#2}{#3}} % element
+%def\xmlcommand #1#2#3{\clf_xmlcommand {#1}{#2}{#3}}
+\def\xmlconcat #1#2#3{\clf_xmlconcat {#1}{#2}{\detokenize{#3}}}
+\def\xmlconcatrange #1#2#3#4#5{\clf_xmlconcatrange {#1}{#2}{#3}{#4}{\detokenize{#5}}}
+%def\xmlcontext #1#2{\clf_xmlcontext {#1}{#2}}
+%def\xmlcount #1#2{\clf_xmlcount {#1}{#2}}
+%def\xmldelete #1#2{\clf_xmldelete {#1}{#2}}
+%def\xmldirect #1{\clf_xmldirect {#1}} % in loops, not dt but root
+%def\xmldirectives #1{\clf_xmldirectives {#1}}
+%def\xmldirectivesafter #1{\clf_xmldirectivesafter {#1}}
+%def\xmldirectivesbefore #1{\clf_xmldirectivesbefore {#1}}
+%def\xmldisplayverbatim #1{\clf_xmldisplayverbatim {#1}}
+%def\xmlelement #1#2{\clf_xmlelement {#1}{#2}}
+%def\xmlfilter #1#2{\clf_xmlfilter {#1}{#2}}
+%def\xmlfilterlist #1#2{\clf_xmlfilterlist {#1}{#2}}
+%def\xmlfirst #1#2{\clf_xmlfirst {#1}{#2}}
+%def\xmlflush #1{\clf_xmlflush {#1}}
+%def\xmlflushcontext #1{\clf_xmlflushcontext {#1}}
+%def\xmlflushlinewise #1{\clf_xmlflushlinewise {#1}}
+%def\xmlflushspacewise #1{\clf_xmlflushspacewise {#1}}
+%def\xmlfunction #1#2{\clf_xmlfunction {#1}{#2}}
+%def\xmlinclude #1#2#3{\clf_xmlinclude {#1}{#2}{#3}}
+%def\xmlincludeoptions#1#2#3#4{\clf_xmlincludeoptions {#1}{#2}{#3}{#4}}
+%def\xmlinclusion #1{\clf_xmlinclusion {#1}}
+%def\xmlinclusions #1{\clf_xmlinclusions {#1}}
+%def\xmlindex #1#2#3{\clf_xmlindex {#1}{#2}{#3}}
+%let\xmlposition \xmlindex
+%def\xmlinlineverbatim #1{\clf_xmlinlineverbatim {#1}}
+%def\xmllast #1#2{\clf_xmllast {#1}{#2}}
+\def\xmlload #1#2{\clf_xmlload {#1}{#2}{\directxmlparameter\c!entities}{\directxmlparameter\c!compress}}
+\def\xmlloadbuffer #1#2{\clf_xmlloadbuffer {#1}{#2}{\directxmlparameter\c!entities}{\directxmlparameter\c!compress}}
+\def\xmlloaddata #1#2{\clf_xmlloaddata {#1}{#2}{\directxmlparameter\c!entities}{\directxmlparameter\c!compress}}
+%def\xmlloaddirectives #1{\clf_xmlloaddirectives {#1}}
+\def\xmlloadregistered #1#2{\clf_xmlloadregistered {#1}{\directxmlparameter\c!entities}{\directxmlparameter\c!compress}}
+%def\xmlmain #1{\clf_xmlmain {#1}}
+%def\xmlmatch #1{\clf_xmlmatch {#1}}
+%def\xmlname #1{\clf_xmlname {#1}}
+%def\xmlnamespace #1{\clf_xmlnamespace {#1}}
+%def\xmlnonspace #1#2{\clf_xmlnonspace {#1}{#2}}
+%def\xmlpos #1{\clf_xmlpos {#1}}
+%def\xmlraw #1#2{\clf_xmlraw {#1}{#2}}
+%def\xmlregisterns #1#2{\clf_xmlregisterns {#1}{#2}} % document
+%def\xmlremapname #1#2#3#4{\clf_xmlremapname {#1}{#2}{#3}{#4}} % element
+%def\xmlremapnamespace #1#2#3{\clf_xmlremapnamespace {#1}{#2}{#3}} % document
+%def\xmlsave #1#2{\clf_xmlsave {#1}{#2}}
+%def\xmlsetfunction #1#2#3{\clf_xmlsetfunction {#1}{#2}{#3}}
+%def\xmlsetsetup #1#2#3{\clf_xmlsetsetup {#1}{#2}{#3}}
+%def\xmlsnippet #1#2{\clf_xmlsnippet {#1}{#2}}
+%def\xmlstrip #1#2{\clf_xmlstrip {#1}{#2}}
+%def\xmlstripanywhere #1#2{\clf_xmlstripanywhere {#1}{#2}}
+%def\xmlstripnolines #1#2{\clf_xmlstripnolines {#1}{#2}}
+%def\xmlstripped #1#2{\clf_xmlstripped {#1}{#2}}
+%def\xmlstrippednolines #1#2{\clf_xmlstrippednolines {#1}{#2}}
+%def\xmltag #1{\clf_xmltag {#1}}
+%def\xmltext #1#2{\clf_xmltext {#1}{#2}}
+%def\xmltobuffer #1#2#3{\clf_xmltobuffer {#1}{#2}{#3}} % id pattern name
+%def\xmltobufferverbose #1#2#3{\clf_xmltobufferverbose {#1}{#2}{#3}} % id pattern name
+%def\xmltofile #1#2#3{\clf_xmltofile {#1}{#2}{#3}} % id pattern filename
+%def\xmltoparameters #1{\clf_xmltoparameters {#1}}
+%def\xmlverbatim #1{\clf_xmlverbatim {#1}}
+
+% experiment:
+\let\xmlall \clf_xmlall
+\let\xmlatt \clf_xmlatt
+\let\xmlattdef \clf_xmlattdef
+\let\xmlattribute \clf_xmlattribute
+\let\xmlattributedef \clf_xmlattributedef
+\let\xmlchainatt \clf_xmlchainatt
+\let\xmlchainattdef \clf_xmlchainattdef
+\let\xmlchecknamespace \clf_xmlchecknamespace
+\let\xmlcommand \clf_xmlcommand
+% \xmlconcat
+% \xmlconcatrange
+\let\xmlcontext \clf_xmlcontext
+\let\xmlcount \clf_xmlcount
+\let\xmldelete \clf_xmldelete
+\let\xmldirect \clf_xmldirect % in loops, not dt but root
+\let\xmldirectives \clf_xmldirectives
+\let\xmldirectivesafter \clf_xmldirectivesafter
+\let\xmldirectivesbefore \clf_xmldirectivesbefore
+\let\xmldisplayverbatim \clf_xmldisplayverbatim
+\let\xmlelement \clf_xmlelement
+\let\xmlfilter \clf_xmlfilter
+\let\xmlfilterlist \clf_xmlfilterlist
+\let\xmlfirst \clf_xmlfirst
+\let\xmlflush \clf_xmlflush
+\let\xmlflushcontext \clf_xmlflushcontext
+\let\xmlflushlinewise \clf_xmlflushlinewise
+\let\xmlflushspacewise \clf_xmlflushspacewise
+\let\xmlfunction \clf_xmlfunction
+\let\xmlinclude \clf_xmlinclude
+\let\xmlincludeoptions \clf_xmlincludeoptions
+\let\xmlinclusion \clf_xmlinclusion
+\let\xmlinclusions \clf_xmlinclusions
+\let\xmlindex \clf_xmlindex
+\let\xmlposition \clf_xmlindex
+\let\xmlinlineverbatim \clf_xmlinlineverbatim
+\let\xmllast \clf_xmllast
+% \xmlload
+% \xmlloadbuffer
+% \xmlloaddata
+\let\xmlloaddirectives \clf_xmlloaddirectives
+% \xmlloadregistered
+\let\xmlmain \clf_xmlmain
+\let\xmlmatch \clf_xmlmatch
+\let\xmlname \clf_xmlname
+\let\xmlnamespace \clf_xmlnamespace
+\let\xmlnonspace \clf_xmlnonspace
+\let\xmlpos \clf_xmlpos
+\let\xmlraw \clf_xmlraw
+\let\xmlregisterns \clf_xmlregisterns % document
+\let\xmlremapname \clf_xmlremapname % element
+\let\xmlremapnamespace \clf_xmlremapnamespace % document
+\let\xmlsave \clf_xmlsave
+\let\xmlsetfunction \clf_xmlsetfunction
+\let\xmlsetsetup \clf_xmlsetsetup
+\let\xmlsnippet \clf_xmlsnippet
+\let\xmlstrip \clf_xmlstrip
+\let\xmlstripanywhere \clf_xmlstripanywhere
+\let\xmlstripnolines \clf_xmlstripnolines
+\let\xmlstripped \clf_xmlstripped
+\let\xmlstrippednolines \clf_xmlstrippednolines
+\let\xmltag \clf_xmltag
+\let\xmltext \clf_xmltext
+\let\xmltobuffer \clf_xmltobuffer % id pattern name
+\let\xmltobufferverbose \clf_xmltobufferverbose % id pattern name
+\let\xmltofile \clf_xmltofile % id pattern filename
+\let\xmltoparameters \clf_xmltoparameters
+\let\xmlverbatim \clf_xmlverbatim
+
+\def\xmlinfo #1{\hbox{\ttxx[\clf_xmlinfo{#1}]}}
\def\xmlshow #1{\startpacked\ttx\xmlverbatim{#1}\stoppacked}
-\def\xmllast #1#2{\ctxlxml{last("#1","#2")}}
-\def\xmlname #1{\ctxlxml{name("#1")}}
-\def\xmlnamespace #1{\ctxlxml{namespace("#1")}}
-\def\xmlnonspace #1#2{\ctxlxml{nonspace("#1","#2")}}
-\def\xmlraw #1#2{\ctxlxml{raw("#1","#2")}}
-\def\xmlcontext #1#2{\ctxlxml{context("#1","#2")}}
-\def\xmlflushcontext #1{\ctxlxml{context("#1")}}
-\def\xmlsnippet #1#2{\ctxlxml{snippet("#1",#2)}}
-\def\xmlelement #1#2{\ctxlxml{element("#1",#2)}}
-\def\xmlregisterns #1#2{\ctxlua{xml.registerns("#1","#2")}} % document
-\def\xmlremapname #1#2#3#4{\ctxlua{xml.remapname(lxml.id("#1"),"#2","#3","#4")}} % element
-\def\xmlremapnamespace #1#2#3{\ctxlua{xml.renamespace(lxml.id("#1"),"#2","#3")}} % document
-\def\xmlchecknamespace #1#2#3{\ctxlua{xml.checknamespace(lxml.id("#1"),"#2","#3")}} % element
-\def\xmlsetfunction #1#2#3{\ctxlxml{setaction("#1",\!!bs#2\!!es,#3)}}
-\def\xmlsetsetup #1#2#3{\ctxlxml{setsetup("#1",\!!bs#2\!!es,"#3")}}
-\def\xmlstrip #1#2{\ctxlxml{strip("#1","#2")}}
-\def\xmlstripnolines #1#2{\ctxlxml{strip("#1","#2",true)}}
-\def\xmlstripanywhere #1#2{\ctxlxml{strip("#1","#2",true,true)}}
-\def\xmlstripped #1#2{\ctxlxml{stripped("#1","#2")}}
-\def\xmlstrippednolines #1#2{\ctxlxml{stripped("#1","#2",true)}}
-\def\xmltag #1{\ctxlxml{tag("#1")}}
-\def\xmltext #1#2{\ctxlxml{text("#1","#2")}}
-\def\xmlverbatim #1{\ctxlxml{verbatim("#1")}}
-\def\xmldisplayverbatim #1{\ctxlxml{displayverbatim("#1")}}
-\def\xmlinlineverbatim #1{\ctxlxml{inlineverbatim("#1")}}
-
-\def\xmlload #1#2{\ctxlxml{load("#1","#2","\directxmlparameter\c!entities","\directxmlparameter\c!compress")}}
-\def\xmlloadbuffer #1#2{\ctxlxml{loadbuffer("#1","#2","\directxmlparameter\c!entities","\directxmlparameter\c!compress")}}
-\def\xmlloaddata #1#2{\ctxlxml{loaddata("#1",\!!bs#2\!!es,"\directxmlparameter\c!entities","\directxmlparameter\c!compress")}}
-\def\xmlloadregistered #1#2{\ctxlxml{loadregistered("#1","\directxmlparameter\c!entities","\directxmlparameter\c!compress")}}
-\def\xmlloaddirectives #1{\ctxlxml{directives.load("any:///#1")}}
-\def\xmlpos #1{\ctxlxml{pos("#1")}}
-
-\def\xmltoparameters #1{\ctxlxml{toparameters("#1")}}
-
-\def\xmltofile #1#2#3{\ctxlxml{tofile("#1","#2","#3")}} % id pattern filename
+
+% goodie:
+
+\unexpanded\def\xmlprettyprint#1#2%
+ {\xmltobufferverbose{#1}{.}{xml-temp}%
+ \ifdefined\scitebuffer
+ \scitebuffer[#2][xml-temp]%
+ \else
+ \typebuffer[xml-temp][\c!option=#2]%
+ \fi}
% kind of special:
-\def\xmlstartraw{\ctxlxml{startraw()}}
-\def\xmlstopraw {\ctxlxml{stopraw()}}
+%def\xmlstartraw{\clf_xmlstartraw}
+%def\xmlstopraw {\clf_xmlstopraw}
+
+\let\xmlstartraw\clf_xmlstartraw
+\let\xmlstopraw \clf_xmlstopraw
-% todo: \xmldoifelseattribute
+% these are expandable! todo: \xmldoifelseattribute
-\def\xmldoif #1#2{\ctxlxml{doif (\!!bs#1\!!es,\!!bs#2\!!es)}} % expandable
-\def\xmldoifnot #1#2{\ctxlxml{doifnot (\!!bs#1\!!es,\!!bs#2\!!es)}} % expandable
-\def\xmldoifelse #1#2{\ctxlxml{doifelse (\!!bs#1\!!es,\!!bs#2\!!es)}} % expandable
-\def\xmldoiftext #1#2{\ctxlxml{doiftext (\!!bs#1\!!es,\!!bs#2\!!es)}} % expandable
-\def\xmldoifnottext #1#2{\ctxlxml{doifnottext (\!!bs#1\!!es,\!!bs#2\!!es)}} % expandable
-\def\xmldoifelsetext #1#2{\ctxlxml{doifelsetext(\!!bs#1\!!es,\!!bs#2\!!es)}} % expandable
+\let\xmldoif \clf_xmldoif
+\let\xmldoifnot \clf_xmldoifnot
+\let\xmldoifelse \clf_xmldoifelse
+\let\xmldoiftext \clf_xmldoiftext
+\let\xmldoifnottext \clf_xmldoifnottext
+\let\xmldoifelsetext \clf_xmldoifelsetext
-%def\xmldoifelseempty #1#2{\ctxlxml{doifelseempty("#1","#2")}} % #2, "*" or "" == self not yet implemented
-%def\xmldoifelseselfempty #1{\ctxlxml{doifelseempty("#1")}}
+\let\xmldoifempty \clf_xmldoifempty
+\let\xmldoifnotempty \clf_xmldoifnotempty
+\let\xmldoifelseempty \clf_xmldoifelseempty
+\let\xmldoifselfempty \clf_xmldoifselfempty
+\let\xmldoifnotselfempty \clf_xmldoifnotselfempty
+\let\xmldoifelseselfempty \clf_xmldoifelseselfempty
+
+\let\xmldoiftextelse \xmldoifelsetext
+\let\xmldoifemptyelse \xmldoifelseempty
+\let\xmldoifselfemptyelse \xmldoifelseselfempty
% \startxmlsetups xml:include
% \xmlinclude{main}{include}{filename|href}
@@ -129,28 +223,28 @@
%\ef\xmlsetup#1#2{\setupwithargument{#2}{#1}}
\let\xmlsetup\setupwithargumentswapped
-\let\xmls\setupwithargumentswapped
-\let\xmlw\setupwithargument
+\let\xmls\setupwithargumentswapped % hardly any faster
+\let\xmlw\setupwithargument % hardly any faster
\newtoks \registeredxmlsetups
% todo: 1:xml:whatever always before 3:xml:something
-\unexpanded\def\xmlprependsetup #1{\ctxlxml{installsetup(1,"*","#1")}}
-\unexpanded\def\xmlappendsetup #1{\ctxlxml{installsetup(2,"*","#1")}}
-\unexpanded\def\xmlbeforesetup #1#2{\ctxlxml{installsetup(3,"*","#1","#2")}}
-\unexpanded\def\xmlaftersetup #1#2{\ctxlxml{installsetup(4,"*","#1","#2")}}
+\unexpanded\def\xmlprependsetup #1{\clf_xmlprependsetup {*}{#1}}
+\unexpanded\def\xmlappendsetup #1{\clf_xmlappendsetup {*}{#1}}
+\unexpanded\def\xmlbeforesetup #1#2{\clf_xmlbeforesetup {*}{#1}{#2}}
+\unexpanded\def\xmlaftersetup #1#2{\clf_xmlaftersetup {*}{#1}{#2}}
-\unexpanded\def\xmlprependdocumentsetup #1#2{\ctxlxml{installsetup(1,"#1","#2")}}
-\unexpanded\def\xmlappenddocumentsetup #1#2{\ctxlxml{installsetup(2,"#1","#2")}}
-\unexpanded\def\xmlbeforedocumentsetup#1#2#3{\ctxlxml{installsetup(3,"#1","#2","#3")}}
-\unexpanded\def\xmlafterdocumentsetup #1#2#3{\ctxlxml{installsetup(4,"#1","#2","#3")}}
+\unexpanded\def\xmlprependdocumentsetup #1#2{\clf_xmlprependdocumentsetup{#1}{#2}}
+\unexpanded\def\xmlappenddocumentsetup #1#2{\clf_xmlappenddocumentsetup {#1}{#2}}
+\unexpanded\def\xmlbeforedocumentsetup #1#2#3{\clf_xmlbeforedocumentsetup {#1}{#2}{#3}}
+\unexpanded\def\xmlafterdocumentsetup #1#2#3{\clf_xmlafterdocumentsetup {#1}{#2}{#3}}
-\unexpanded\def\xmlremovesetup #1{\ctxlxml{removesetup("*","#1")}}
-\unexpanded\def\xmlremovedocumentsetup #1#2{\ctxlxml{removesetup("#1","#2")}}
+\unexpanded\def\xmlremovesetup #1{\clf_xmlremovesetup {*}{#1}}
+\unexpanded\def\xmlremovedocumentsetup #1#2{\clf_xmlremovedocumentsetup {#1}{#2}}
-\unexpanded\def\xmlflushdocumentsetups #1#2{\ctxlxml{flushsetups("#1","*","#2")}} % #1 == id where to apply * and #2
-\unexpanded\def\xmlresetdocumentsetups #1{\ctxlxml{resetsetups("#1")}}
+\unexpanded\def\xmlflushdocumentsetups #1#2{\clf_xmlflushdocumentsetups {#1}{*}{#2}} % #1 == id where to apply * and #2
+\unexpanded\def\xmlresetdocumentsetups #1{\clf_xmlresetdocumentsetups {#1}}
\let\xmlregistersetup \xmlappendsetup
\let\xmlregisterdocumentsetup\xmlappenddocumentsetup
@@ -170,8 +264,8 @@
\xmldefaulttotext{#1}% after include
\xmlstoptiming}
-\unexpanded\def\xmlstarttiming{\ctxlua{statistics.starttiming(lxml)}}
-\unexpanded\def\xmlstoptiming {\ctxlua{statistics.stoptiming (lxml)}}
+\unexpanded\def\xmlstarttiming{\clf_xmlstarttiming}
+\unexpanded\def\xmlstoptiming {\clf_xmlstoptiming}
\def\lxml_process#1#2#3#4#5% flag \loader id name what initializersetup
{\begingroup
@@ -229,11 +323,6 @@
% \xmlsetfunction{main}{verbatim}{lxml.displayverbatim}
% \xmlsetfunction{main}{verb} {lxml.inlineverbatim}
-% \unexpanded\def\startxmldisplayverbatim[#1]{}
-% \unexpanded\def\stopxmldisplayverbatim {}
-% \unexpanded\def\startxmlinlineverbatim [#1]{}
-% \unexpanded\def\stopxmlinlineverbatim {}
-
% we use an xml: namespace so one has to define a suitable verbatim, say
%
% \definetyping[xml:verbatim][typing]
@@ -252,7 +341,7 @@
\unexpanded\def\startxmlinlineverbatim[#1]%
{\begingroup
\edef\currenttype{xml:#1}%
- \let\stopxmldisplayverbatim\endgroup
+ \let\stopxmlinlineverbatim\endgroup
\doinitializeverbatim}
% will move but is developed for xml
@@ -271,14 +360,13 @@
\def\inlinemessage #1{\dontleavehmode{\tttf#1}}
\def\displaymessage#1{\blank\inlinemessage{#1}\blank}
-% \def\xmltraceentities % settextcleanup is not defined
-% {\ctxlua{xml.settextcleanup(lxml.trace_text_entities)}%
-% \appendtoks\ctxlxml{showtextentities()}\to\everygoodbye}
-
% processing instructions
-\def\xmlcontextdirective#1% kind class key value
- {\executeifdefined{xml#1directive}\gobblethreearguments}
+\unexpanded\def\xmlinstalldirective#1#2%
+ {\clf_xmlinstalldirective{#1}{\checkedstrippedcsname#2}}
+
+% \def\xmlcontextdirective#1% kind class key value
+% {\executeifdefined{xml#1directive}\gobblethreearguments}
% setting up xml:
%
@@ -301,15 +389,15 @@
\letvalue{\??xmldefaults\v!text }\plusone
\letvalue{\??xmldefaults\v!hidden}\plustwo
-\unexpanded\def\xmldefaulttotext#1%
+\unexpanded\def\xmldefaulttotext
{\ifcase\xmlprocessingmode
- % unset
+ \expandafter\gobbleoneargument % unset
\or
- \ctxlxml{setcommandtotext("#1")}% 1
+ \expandafter\clf_xmlsetcommandtotext % 1
\or
- \ctxlxml{setcommandtonone("#1")}% 2
+ \expandafter\clf_xmlsetcommandtonone % 2
\else
- % unset
+ \expandafter\gobbleoneargument % unset
\fi}
\appendtoks
@@ -326,22 +414,23 @@
%def\xmlvalue #1#2{\ifcsname\??xmlmapvalue#1:#2\endcsname\csname\??xmlmapvalue#1:#2\expandafter\expandafter\gobbleoneargument\expandafter\endcsname\else\expandafter\firstofoneargument\fi}
\def\xmldoifelsevalue #1#2{\ifcsname\??xmlmapvalue#1:#2\endcsname\expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi}
+\let\xmldoifvalueelse\xmldoifelsevalue
+
\let\xmlmapval\xmlmapvalue
\let\xmlval \xmlvalue
%D Experimental:
-\def\xmlgetindex #1{\ctxlxml{getindex("\xmldocument","#1")}}
-\def\xmlrawindex #1{\ctxlxml{rawindex("#1")}}
-\def\xmlwithindex #1#2{\ctxlxml{withindex("\xmldocument","#1","#2")}}
+\def\xmlgetindex #1{\clf_xmlgetindex {\xmldocument}{#1}}
+\def\xmlwithindex #1#2{\clf_xmlwithindex{\xmldocument}{#1}{#2}}
\def\xmlreference #1#2{\string\xmlwithindex{#1}{#2}}
%D Entities (might change):
\setnewconstant\xmlautoentities\plusone % 0=off, 1=upper, 2=upper,lower
-\def\xmlsetentity#1#2{\ctxlua{xml.registerentity('#1',\!!bs\detokenize{#2}\!!es)}}
-\def\xmltexentity#1#2{\ctxlua{lxml.registerentity('#1',\!!bs\detokenize{#2}\!!es)}}
+\unexpanded\def\xmlsetentity#1#2{\clf_xmlsetentity{#1}{\detokenize{#2}}}
+\unexpanded\def\xmltexentity#1#2{\clf_xmltexentity{#1}{\detokenize{#2}}}
% \xmlsetentity{tex}{\TEX{}} % {} needed
@@ -393,6 +482,16 @@
\let\processxmlfile \processXMLfile
\let\xmldata \XMLdata
+\unexpanded\def\xmlsetinjectors[#1]%
+ {\clf_xmlsetinjectors{#1}}
+
+\unexpanded\def\xmlresetinjectors
+ {\clf_xmlresetinjectors{}}
+
+\def\xmlinjector#1{\executeifdefined{#1}\donothing}
+
+\let\xmlapplyselectors\clf_xmlapplyselectors
+
\protect \endinput
% \newcount\charactersactiveoffset \charactersactiveoffset="10000
diff --git a/Master/texmf-dist/tex/context/base/lxml-lpt.lua b/Master/texmf-dist/tex/context/base/lxml-lpt.lua
index 8567f26234a..decb6567bf5 100644
--- a/Master/texmf-dist/tex/context/base/lxml-lpt.lua
+++ b/Master/texmf-dist/tex/context/base/lxml-lpt.lua
@@ -505,6 +505,9 @@ local function apply_expression(list,expression,order)
return collected
end
+-- this one can be made faster but there are not that many conversions so it doesn't
+-- really pay of
+
local P, V, C, Cs, Cc, Ct, R, S, Cg, Cb = lpeg.P, lpeg.V, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.Ct, lpeg.R, lpeg.S, lpeg.Cg, lpeg.Cb
local spaces = S(" \n\r\t\f")^0
@@ -541,12 +544,11 @@ local lp_builtin = P (
local lp_attribute = (P("@") + P("attribute::")) / "" * Cc("(ll.at and ll.at['") * ((R("az","AZ") + S("-_:"))^1) * Cc("'])")
--- lp_fastpos_p = (P("+")^0 * R("09")^1 * P(-1)) / function(s) return "l==" .. s end
--- lp_fastpos_n = (P("-") * R("09")^1 * P(-1)) / function(s) return "(" .. s .. "<0 and (#list+".. s .. "==l))" end
-
-lp_fastpos_p = P("+")^0 * R("09")^1 * P(-1) / "l==%0"
-lp_fastpos_n = P("-") * R("09")^1 * P(-1) / "(%0<0 and (#list+%0==l))"
+----- lp_fastpos_p = (P("+")^0 * R("09")^1 * P(-1)) / function(s) return "l==" .. s end
+----- lp_fastpos_n = (P("-") * R("09")^1 * P(-1)) / function(s) return "(" .. s .. "<0 and (#list+".. s .. "==l))" end
+local lp_fastpos_p = P("+")^0 * R("09")^1 * P(-1) / "l==%0"
+local lp_fastpos_n = P("-") * R("09")^1 * P(-1) / "(%0<0 and (#list+%0==l))"
local lp_fastpos = lp_fastpos_n + lp_fastpos_p
local lp_reserved = C("and") + C("or") + C("not") + C("div") + C("mod") + C("true") + C("false")
@@ -806,7 +808,7 @@ local function nodesettostring(set,nodetest)
if not ns or ns == "" then ns = "*" end
if not tg or tg == "" then tg = "*" end
tg = (tg == "@rt@" and "[root]") or format("%s:%s",ns,tg)
- t[i] = (directive and tg) or format("not(%s)",tg)
+ t[#t+1] = (directive and tg) or format("not(%s)",tg)
end
if nodetest == false then
return format("not(%s)",concat(t,"|"))
@@ -1132,7 +1134,6 @@ expressions.print = function(...)
return true
end
-expressions.contains = find
expressions.find = find
expressions.upper = upper
expressions.lower = lower
@@ -1156,6 +1157,10 @@ function expressions.contains(str,pattern)
return false
end
+function xml.expressions.idstring(str)
+ return type(str) == "string" and gsub(str,"^#","") or ""
+end
+
-- user interface
local function traverse(root,pattern,handle)
diff --git a/Master/texmf-dist/tex/context/base/lxml-sor.mkiv b/Master/texmf-dist/tex/context/base/lxml-sor.mkiv
index 0ee1f16f3e2..0d8eb6ba174 100644
--- a/Master/texmf-dist/tex/context/base/lxml-sor.mkiv
+++ b/Master/texmf-dist/tex/context/base/lxml-sor.mkiv
@@ -19,10 +19,13 @@
\unprotect
+% the flusher is unexpandable so that it can be used in tables (noalign
+% interferences)
+
\unexpanded\def\xmlresetsorter #1{\ctxlxml{sorters.reset("#1")}}
\unexpanded\def\xmladdsortentry#1#2#3{\ctxlxml{sorters.add("#1","#2",\!!bs#3\!!es)}}
\unexpanded\def\xmlshowsorter #1{\ctxlxml{sorters.show("#1")}}
-\unexpanded\def\xmlflushsorter #1#2{\ctxlxml{sorters.flush("#1","#2")}}
+ \def\xmlflushsorter #1#2{\ctxlxml{sorters.flush("#1","#2")}}
\unexpanded\def\xmlsortentries #1{\ctxlxml{sorters.sort("#1")}}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/lxml-tab.lua b/Master/texmf-dist/tex/context/base/lxml-tab.lua
index 8b34a96a3c3..0a72640d086 100644
--- a/Master/texmf-dist/tex/context/base/lxml-tab.lua
+++ b/Master/texmf-dist/tex/context/base/lxml-tab.lua
@@ -42,10 +42,10 @@ local xml = xml
--~ local xml = xml
local concat, remove, insert = table.concat, table.remove, table.insert
-local type, next, setmetatable, getmetatable, tonumber = type, next, setmetatable, getmetatable, tonumber
+local type, next, setmetatable, getmetatable, tonumber, rawset = type, next, setmetatable, getmetatable, tonumber, rawset
local lower, find, match, gsub = string.lower, string.find, string.match, string.gsub
local utfchar = utf.char
-local lpegmatch = lpeg.match
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
local P, S, R, C, V, C, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.C, lpeg.Cs
local formatters = string.formatters
@@ -325,12 +325,13 @@ end
-- one level expansion (simple case), no checking done
-local rest = (1-P(";"))^0
-local many = P(1)^0
+local p_rest = (1-P(";"))^0
+local p_many = P(1)^0
+local p_char = lpegpatterns.utf8character
local parsedentity =
- P("&") * (P("#x")*(rest/fromhex) + P("#")*(rest/fromdec)) * P(";") * P(-1) +
- (P("#x")*(many/fromhex) + P("#")*(many/fromdec))
+ P("&") * (P("#x")*(p_rest/fromhex) + P("#")*(p_rest/fromdec)) * P(";") * P(-1) +
+ (P("#x")*(p_many/fromhex) + P("#")*(p_many/fromdec))
-- parsing in the xml file
@@ -367,7 +368,41 @@ local privates_n = {
-- keeps track of defined ones
}
-local escaped = utf.remapper(privates_u)
+-- -- local escaped = utf.remapper(privates_u) -- can't be used as it freezes
+-- -- local unprivatized = utf.remapper(privates_p) -- can't be used as it freezes
+--
+-- local p_privates_u = false
+-- local p_privates_p = false
+--
+-- table.setmetatablenewindex(privates_u,function(t,k,v) rawset(t,k,v) p_privates_u = false end)
+-- table.setmetatablenewindex(privates_p,function(t,k,v) rawset(t,k,v) p_privates_p = false end)
+--
+-- local function escaped(str)
+-- if not str or str == "" then
+-- return ""
+-- else
+-- if not p_privates_u then
+-- p_privates_u = Cs((lpeg.utfchartabletopattern(privates_u)/privates_u + p_char)^0)
+-- end
+-- return lpegmatch(p_privates_u,str)
+-- end
+-- end
+--
+-- local function unprivatized(str)
+-- if not str or str == "" then
+-- return ""
+-- else
+-- if not p_privates_p then
+-- p_privates_p = Cs((lpeg.utfchartabletopattern(privates_p)/privates_p + p_char)^0)
+-- end
+-- return lpegmatch(p_privates_p,str)
+-- end
+-- end
+
+local escaped = utf.remapper(privates_u,"dynamic")
+local unprivatized = utf.remapper(privates_p,"dynamic")
+
+xml.unprivatized = unprivatized
local function unescaped(s)
local p = privates_n[s]
@@ -382,10 +417,7 @@ local function unescaped(s)
return p
end
-local unprivatized = utf.remapper(privates_p)
-
xml.privatetoken = unescaped
-xml.unprivatized = unprivatized
xml.privatecodes = privates_n
local function handle_hex_entity(str)
@@ -546,7 +578,7 @@ local valid = R('az', 'AZ', '09') + S('_-.')
local name_yes = C(valid^1) * colon * C(valid^1)
local name_nop = C(P(true)) * C(valid^1)
local name = name_yes + name_nop
-local utfbom = lpeg.patterns.utfbom -- no capture
+local utfbom = lpegpatterns.utfbom -- no capture
local spacing = C(space^0)
----- entitycontent = (1-open-semicolon)^0
@@ -768,7 +800,7 @@ end
-- Because we can have a crash (stack issues) with faulty xml, we wrap this one
-- in a protector:
-function xmlconvert(data,settings)
+local function xmlconvert(data,settings)
local ok, result = pcall(function() return _xmlconvert_(data,settings) end)
if ok then
return result
@@ -919,14 +951,18 @@ and then handle the lot.</p>
-- new experimental reorganized serialize
-local function verbose_element(e,handlers) -- options
+local f_attribute = formatters['%s=%q']
+
+local function verbose_element(e,handlers,escape) -- options
local handle = handlers.handle
local serialize = handlers.serialize
local ens, etg, eat, edt, ern = e.ns, e.tg, e.at, e.dt, e.rn
local ats = eat and next(eat) and { }
if ats then
+ local n = 0
for k,v in next, eat do
- ats[#ats+1] = formatters['%s=%q'](k,escaped(v))
+ n = n + 1
+ ats[n] = f_attribute(k,escaped(v))
end
end
if ern and trace_entities and ern ~= ens then
diff --git a/Master/texmf-dist/tex/context/base/lxml-tex.lua b/Master/texmf-dist/tex/context/base/lxml-tex.lua
index 0c58a47cc9f..adb849347e1 100644
--- a/Master/texmf-dist/tex/context/base/lxml-tex.lua
+++ b/Master/texmf-dist/tex/context/base/lxml-tex.lua
@@ -11,7 +11,7 @@ if not modules then modules = { } end modules ['lxml-tex'] = {
-- be an cldf-xml helper library.
local utfchar = utf.char
-local concat, insert, remove = table.concat, table.insert, table.remove
+local concat, insert, remove, sortedkeys = table.concat, table.insert, table.remove, table.sortedkeys
local format, sub, gsub, find, gmatch, match = string.format, string.sub, string.gsub, string.find, string.gmatch, string.match
local type, next, tonumber, tostring, select = type, next, tonumber, tostring, select
local lpegmatch = lpeg.match
@@ -19,43 +19,65 @@ local P, S, C, Cc = lpeg.P, lpeg.S, lpeg.C, lpeg.Cc
local tex, xml = tex, xml
local lowerchars, upperchars, lettered = characters.lower, characters.upper, characters.lettered
+local basename, dirname, joinfile = file.basename, file.dirname, file.join
lxml = lxml or { }
local lxml = lxml
-local catcodenumbers = catcodes.numbers
-local ctxcatcodes = catcodenumbers.ctxcatcodes -- todo: use different method
-local notcatcodes = catcodenumbers.notcatcodes -- todo: use different method
-
-local commands = commands
-local context = context
-local contextsprint = context.sprint -- with catcodes (here we use fast variants, but with option for tracing)
-
-local xmlelements, xmlcollected, xmlsetproperty = xml.elements, xml.collected, xml.setproperty
-local xmlwithelements = xml.withelements
-local xmlserialize, xmlcollect, xmltext, xmltostring = xml.serialize, xml.collect, xml.text, xml.tostring
-local xmlapplylpath = xml.applylpath
-local xmlunprivatized, xmlprivatetoken, xmlprivatecodes = xml.unprivatized, xml.privatetoken, xml.privatecodes
-local xmlstripelement = xml.stripelement
-
-local variables = interfaces and interfaces.variables or { }
+local catcodenumbers = catcodes.numbers
+local ctxcatcodes = catcodenumbers.ctxcatcodes -- todo: use different method
+local notcatcodes = catcodenumbers.notcatcodes -- todo: use different method
+
+local commands = commands
+local context = context
+local contextsprint = context.sprint -- with catcodes (here we use fast variants, but with option for tracing)
+
+local implement = interfaces.implement
+
+local xmlelements = xml.elements
+local xmlcollected = xml.collected
+local xmlsetproperty = xml.setproperty
+local xmlwithelements = xml.withelements
+local xmlserialize = xml.serialize
+local xmlcollect = xml.collect
+local xmltext = xml.text
+local xmltostring = xml.tostring
+local xmlapplylpath = xml.applylpath
+local xmlunprivatized = xml.unprivatized
+local xmlprivatetoken = xml.privatetoken
+local xmlprivatecodes = xml.privatecodes
+local xmlstripelement = xml.stripelement
+local xmlinclusion = xml.inclusion
+local xmlinclusions = xml.inclusions
+local xmlcontent = xml.content
+
+local variables = interfaces and interfaces.variables or { }
local settings_to_hash = utilities.parsers.settings_to_hash
+local settings_to_set = utilities.parsers.settings_to_set
+local options_to_hash = utilities.parsers.options_to_hash
+local options_to_array = utilities.parsers.options_to_array
+
local insertbeforevalue = utilities.tables.insertbeforevalue
local insertaftervalue = utilities.tables.insertaftervalue
-local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
+local resolveprefix = resolvers.resolve
+
+local starttiming = statistics.starttiming
+local stoptiming = statistics.stoptiming
-local trace_setups = false trackers.register("lxml.setups", function(v) trace_setups = v end)
-local trace_loading = false trackers.register("lxml.loading", function(v) trace_loading = v end)
-local trace_access = false trackers.register("lxml.access", function(v) trace_access = v end)
-local trace_comments = false trackers.register("lxml.comments", function(v) trace_comments = v end)
-local trace_entities = false trackers.register("xml.entities", function(v) trace_entities = v end)
+local trace_setups = false trackers.register("lxml.setups", function(v) trace_setups = v end)
+local trace_loading = false trackers.register("lxml.loading", function(v) trace_loading = v end)
+local trace_access = false trackers.register("lxml.access", function(v) trace_access = v end)
+local trace_comments = false trackers.register("lxml.comments", function(v) trace_comments = v end)
+local trace_entities = false trackers.register("xml.entities", function(v) trace_entities = v end)
+local trace_selectors = false trackers.register("lxml.selectors",function(v) trace_selectors = v end)
-local report_lxml = logs.reporter("xml","tex")
-local report_xml = logs.reporter("xml","tex")
+local report_lxml = logs.reporter("lxml","tex")
+local report_xml = logs.reporter("xml","tex")
-local forceraw, rawroot = false, nil
+local forceraw = false
+local forceraw = nil
-- tex entities
--
@@ -65,7 +87,7 @@ lxml.entities = lxml.entities or { }
storage.register("lxml/entities",lxml.entities,"lxml.entities")
---~ xml.placeholders.unknown_any_entity = nil -- has to be per xml
+-- xml.placeholders.unknown_any_entity = nil -- has to be per xml
local xmlentities = xml.entities
local texentities = lxml.entities
@@ -417,7 +439,7 @@ function lxml.convert(id,data,entities,compress,currentresource)
end
function lxml.load(id,filename,compress,entities)
- filename = commands.preparedfile(filename) -- not commands!
+ filename = ctxrunner.preparedfile(filename)
if trace_loading then
report_lxml("loading file %a as %a",filename,id)
end
@@ -436,37 +458,6 @@ function lxml.register(id,xmltable,filename)
return xmltable
end
--- function lxml.include(id,pattern,attribute,recurse,resolve)
--- starttiming(xml)
--- local root = getid(id)
--- xml.include(root,pattern,attribute,recurse,function(filename)
--- if filename then
--- -- preprocessing
--- filename = commands.preparedfile(filename)
--- -- some protection
--- if file.dirname(filename) == "" and root.filename then
--- local dn = file.dirname(root.filename)
--- if dn ~= "" then
--- filename = file.join(dn,filename)
--- end
--- end
--- if trace_loading then
--- report_lxml("including file %a",filename)
--- end
--- -- handy if we have a flattened structure
--- if resolve then
--- filename = resolvers.resolve(filename) or filename
--- end
--- -- todo: check variants and provide
--- noffiles, nofconverted = noffiles + 1, nofconverted + 1
--- return resolvers.loadtexfile(filename) or ""
--- else
--- return ""
--- end
--- end)
--- stoptiming(xml)
--- end
-
-- recurse prepare rootpath resolve basename
local options_true = { "recurse", "prepare", "rootpath" }
@@ -492,17 +483,17 @@ function lxml.include(id,pattern,attribute,options)
end
-- handy if we have a flattened structure
if options.basename then
- filename = file.basename(filename)
+ filename = basename(filename)
end
if options.resolve then
- filename = resolvers.resolve(filename) or filename
+ filename = resolveprefix(filename) or filename
end
-- some protection
if options.rootpath then
- if file.dirname(filename) == "" and root.filename then
- local dn = file.dirname(root.filename)
+ if dirname(filename) == "" and root.filename then
+ local dn = dirname(root.filename)
if dn ~= "" then
- filename = file.join(dn,filename)
+ filename = joinfile(dn,filename)
end
end
end
@@ -518,6 +509,20 @@ function lxml.include(id,pattern,attribute,options)
stoptiming(xml)
end
+function lxml.inclusion(id,default)
+ local inclusion = xmlinclusion(getid(id),default)
+ if inclusion then
+ context(inclusion)
+ end
+end
+
+function lxml.inclusions(id,sorted)
+ local inclusions = xmlinclusions(getid(id),sorted)
+ if inclusions then
+ context(table.concat(inclusions,","))
+ end
+end
+
function lxml.save(id,name)
xml.save(getid(id),name)
end
@@ -603,30 +608,49 @@ local function tex_element(e,handlers)
end
end
+-- <?context-directive foo ... ?>
+-- <?context-foo-directive ... ?>
+
local pihandlers = { } xml.pihandlers = pihandlers
-local category = P("context-") * C((1-P("-"))^1) * P("-directive")
local space = S(" \n\r")
local spaces = space^0
local class = C((1-space)^0)
local key = class
+local rest = C(P(1)^0)
local value = C(P(1-(space * -1))^0)
-
-local parser = category * spaces * class * spaces * key * spaces * value
-
-pihandlers[#pihandlers+1] = function(str)
- if str then
- local a, b, c, d = lpegmatch(parser,str)
- if d then
- contextsprint(ctxcatcodes,"\\xmlcontextdirective{",a,"}{",b,"}{",c,"}{",d,"}")
+local category = P("context-") * (
+ C((1-P("-"))^1) * P("-directive")
+ + P("directive") * spaces * key
+ )
+
+local c_parser = category * spaces * value -- rest
+local k_parser = class * spaces * key * spaces * rest --value
+
+implement {
+ name = "xmlinstalldirective",
+ arguments = { "string", "string" },
+ actions = function(name,csname)
+ if csname then
+ local keyvalueparser = k_parser / context[csname]
+ local keyvaluechecker = function(category,rest,e)
+ lpegmatch(keyvalueparser,rest)
+ end
+ pihandlers[name] = keyvaluechecker
end
end
-end
+}
local function tex_pi(e,handlers)
local str = e.dt[1]
- for i=1,#pihandlers do
- pihandlers[i](str)
+ if str and str ~= "" then
+ local category, rest = lpegmatch(c_parser,str)
+ if category and rest and #rest > 0 then
+ local handler = pihandlers[category]
+ if handler then
+ handler(category,rest,e)
+ end
+ end
end
end
@@ -1500,7 +1524,7 @@ end
lxml.content = text
function lxml.position(id,pattern,n)
- position(xmlapplylpath(getid(id),pattern),n)
+ position(xmlapplylpath(getid(id),pattern),tonumber(n))
end
function lxml.chainattribute(id,pattern,a,default)
@@ -1516,7 +1540,7 @@ function lxml.concat(id,pattern,separator,lastseparator,textonly)
end
function lxml.element(id,n)
- position(xmlapplylpath(getid(id),"/*"),n)
+ position(xmlapplylpath(getid(id),"/*"),tonumber(n)) -- tonumber handy
end
lxml.index = lxml.position
@@ -1554,6 +1578,8 @@ function lxml.att(id,a,default)
end
elseif str ~= "" then
contextsprint(notcatcodes,str)
+ else
+ -- explicit empty is valid
end
elseif default and default ~= "" then
contextsprint(notcatcodes,default)
@@ -1679,7 +1705,20 @@ function lxml.doifelsetext (id,pattern) doifelse(not empty(getid(id),pattern)) e
-- special case: "*" and "" -> self else lpath lookup
---~ function lxml.doifelseempty(id,pattern) doifelse(isempty(getid(id),pattern ~= "" and pattern ~= nil)) end -- not yet done, pattern
+local function checkedempty(id,pattern)
+ local e = getid(id)
+ if not pattern or pattern == "" then
+ local dt = e.dt
+ local nt = #dt
+ return (nt == 0) or (nt == 1 and dt[1] == "")
+ else
+ return isempty(getid(id),pattern)
+ end
+end
+
+function lxml.doifempty (id,pattern) doif (checkedempty(id,pattern)) end
+function lxml.doifnotempty (id,pattern) doifnot (checkedempty(id,pattern)) end
+function lxml.doifelseempty(id,pattern) doifelse(checkedempty(id,pattern)) end
-- status info
@@ -1807,3 +1846,213 @@ end
texfinalizers.upperall = xmlfinalizers.upperall
texfinalizers.lowerall = xmlfinalizers.lowerall
+
+function lxml.tobuffer(id,pattern,name,unescaped)
+ local collected = xmlapplylpath(getid(id),pattern)
+ if collected then
+ if unescaped then
+ collected = xmlcontent(collected[1]) -- expanded entities !
+ else
+ collected = tostring(collected[1])
+ end
+ buffers.assign(name,collected)
+ else
+ buffers.erase(name)
+ end
+end
+
+-- relatively new:
+
+local permitted = nil
+local ctx_xmlinjector = context.xmlinjector
+
+xml.pihandlers["injector"] = function(category,rest,e)
+ local options = options_to_array(rest)
+ local action = options[1]
+ if not action then
+ return
+ end
+ local n = #options
+ if n > 1 then
+ local category = options[2]
+ if category == "*" then
+ ctx_xmlinjector(action)
+ elseif permitted then
+ if n == 2 then
+ if permitted[category] then
+ ctx_xmlinjector(action)
+ end
+ else
+ for i=2,n do
+ local category = options[i]
+ if category == "*" or permitted[category] then
+ ctx_xmlinjector(action)
+ return
+ end
+ end
+ end
+ end
+ else
+ ctx_xmlinjector(action)
+ end
+end
+
+local pattern = P("context-") * C((1-lpeg.patterns.whitespace)^1) * C(P(1)^1)
+
+function lxml.applyselectors(id)
+ local root = getid(id)
+ local function filter(e)
+ local dt = e.dt
+ local ndt = #dt
+ local done = false
+ local i = 1
+ while i <= ndt do
+ local dti = dt[i]
+ if type(dti) == "table" then
+ if dti.tg == "@pi@" then
+ local text = dti.dt[1]
+ local what, rest = lpegmatch(pattern,text)
+ if what == "select" then
+ local categories = options_to_hash(rest)
+ if categories["begin"] then
+ local okay = false
+ for k, v in next, permitted do
+ if categories[k] then
+ okay = k
+ break
+ end
+ end
+ if not trace_selectors then
+ -- skip
+ elseif okay then
+ report_lxml("accepting selector: %s",okay)
+ else
+ categories.begin = false
+ report_lxml("rejecting selector: % t",sortedkeys(categories))
+ end
+ for j=i,ndt do
+ local dtj = dt[j]
+ if type(dtj) == "table" then
+ local tg = dtj.tg
+ if tg == "@pi@" then
+ local text = dtj.dt[1]
+ local what, rest = lpegmatch(pattern,text)
+ if what == "select" then
+ local categories = options_to_hash(rest)
+ if categories["end"] then
+ i = j
+ break
+ else
+ -- error
+ end
+ end
+ elseif not okay then
+ dtj.tg = "@cm@"
+ end
+ else
+-- dt[j] = "" -- okay ?
+ end
+ end
+ end
+ elseif what == "include" then
+ local categories = options_to_hash(rest)
+ if categories["begin"] then
+ local okay = false
+ for k, v in next, permitted do
+ if categories[k] then
+ okay = k
+ break
+ end
+ end
+ if not trace_selectors then
+ -- skip
+ elseif okay then
+ report_lxml("accepting include: %s",okay)
+ else
+ categories.begin = false
+ report_lxml("rejecting include: % t",sortedkeys(categories))
+ end
+ if okay then
+ for j=i,ndt do
+ local dtj = dt[j]
+ if type(dtj) == "table" then
+ local tg = dtj.tg
+ if tg == "@cm@" then
+ local content = dtj.dt[1]
+ local element = root and xml.toelement(content,root)
+ dt[j] = element
+ element.__p__ = dt -- needs checking
+ done = true
+ elseif tg == "@pi@" then
+ local text = dtj.dt[1]
+ local what, rest = lpegmatch(pattern,text)
+ if what == "include" then
+ local categories = options_to_hash(rest)
+ if categories["end"] then
+ i = j
+ break
+ else
+ -- error
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ else
+ filter(dti)
+ end
+ end
+ if done then
+ -- probably not needed
+ xml.reindex(dt)
+ end
+ end
+ i = i + 1
+ end
+ end
+ xmlwithelements(root,filter)
+end
+
+function xml.setinjectors(set)
+ local s = settings_to_set(set)
+ if permitted then
+ for k, v in next, s do
+ permitted[k] = true
+ end
+ else
+ permitted = s
+ end
+end
+
+function xml.resetinjectors(set)
+ if permitted and set and set ~= "" then
+ local s = settings_to_set(set)
+ for k, v in next, s do
+ if v then
+ permitted[k] = nil
+ end
+ end
+ else
+ permitted = nil
+ end
+end
+
+implement {
+ name = "xmlsetinjectors",
+ actions = xml.setinjectors,
+ arguments = "string"
+}
+
+implement {
+ name = "xmlresetinjectors",
+ actions = xml.resetinjectors,
+ arguments = "string"
+}
+
+implement {
+ name = "xmlapplyselectors",
+ actions = lxml.applyselectors,
+ arguments = "string"
+}
diff --git a/Master/texmf-dist/tex/context/base/m-chart.lua b/Master/texmf-dist/tex/context/base/m-chart.lua
index 2b9869379f1..f1e7f4cb937 100644
--- a/Master/texmf-dist/tex/context/base/m-chart.lua
+++ b/Master/texmf-dist/tex/context/base/m-chart.lua
@@ -19,8 +19,6 @@ local P, S, C, Cc, lpegmatch = lpeg.P, lpeg.S, lpeg.C, lpeg.Cc, lpeg.match
local report_chart = logs.reporter("chart")
-local points = number.points -- we can use %p instead
-
local variables = interfaces.variables
local v_yes = variables.yes
@@ -229,6 +227,8 @@ function commands.flow_start_cell(settings)
settings = settings,
x = 1,
y = 1,
+ realx = 1,
+ realy = 1,
name = "",
}
end
@@ -325,9 +325,13 @@ local function inject(includedata,data,hash)
if si.include then
inject(si,data,hash)
else
+ local x = si.x + xoffset
+ local y = si.y + yoffset
local t = {
- x = si.x + xoffset,
- y = si.y + yoffset,
+ x = x,
+ y = y,
+ realx = x,
+ realy = y,
settings = settings,
}
setmetatableindex(t,si)
@@ -451,10 +455,12 @@ function commands.flow_set_location(x,y)
else
y = tonumber(y)
end
- temp.x = x or 1
- temp.y = y or 1
- last_x = x or last_x
- last_y = y or last_y
+ temp.x = x or 1
+ temp.y = y or 1
+ temp.realx = x or 1
+ temp.realy = y or 1
+ last_x = x or last_x
+ last_y = y or last_y
end
function commands.flow_set_connection(location,displacement,name)
@@ -499,17 +505,17 @@ local function process_cells(chart,xoffset,yoffset)
local linesettings = settings.line
context("flow_shape_line_color := \\MPcolor{%s} ;", linesettings.color)
context("flow_shape_fill_color := \\MPcolor{%s} ;", linesettings.backgroundcolor)
- context("flow_shape_line_width := %s ; ", points(linesettings.rulethickness))
+ context("flow_shape_line_width := %p ; ", linesettings.rulethickness)
elseif focus[cell.focus] or focus[cell.name] then
local focussettings = settings.focus
context("flow_shape_line_color := \\MPcolor{%s} ;", focussettings.framecolor)
context("flow_shape_fill_color := \\MPcolor{%s} ;", focussettings.backgroundcolor)
- context("flow_shape_line_width := %s ; ", points(focussettings.rulethickness))
+ context("flow_shape_line_width := %p ; ", focussettings.rulethickness)
else
local shapesettings = settings.shape
context("flow_shape_line_color := \\MPcolor{%s} ;", shapesettings.framecolor)
context("flow_shape_fill_color := \\MPcolor{%s} ;", shapesettings.backgroundcolor)
- context("flow_shape_line_width := %s ; " , points(shapesettings.rulethickness))
+ context("flow_shape_line_width := %p ; " , shapesettings.rulethickness)
end
context("flow_peepshape := false ;") -- todo
context("flow_new_shape(%s,%s,%s) ;",cell.x+xoffset,cell.y+yoffset,shapedata.number)
@@ -580,7 +586,7 @@ local function process_connections(chart,xoffset,yoffset)
context("flow_touchshape := %s ;", linesettings.offset == v_none and "true" or "false")
context("flow_dsp_x := %s ; flow_dsp_y := %s ;",connection.dx or 0, connection.dy or 0)
context("flow_connection_line_color := \\MPcolor{%s} ;",linesettings.color)
- context("flow_connection_line_width := %s ;",points(linesettings.rulethickness))
+ context("flow_connection_line_width := %p ;",linesettings.rulethickness)
context("flow_connect_%s_%s (%s) (%s,%s,%s) (%s,%s,%s) ;",where_cell,where_other,j,cellx,celly,what_cell,otherx,othery,what_other)
context("flow_dsp_x := 0 ; flow_dsp_y := 0 ;")
end
@@ -686,6 +692,7 @@ local function getchart(settings,forced_x,forced_y,forced_nx,forced_ny)
print("no such chart",chartname)
return
end
+-- chart = table.copy(chart)
chart = expanded(chart,settings)
local chartsettings = chart.settings.chart
local autofocus = chart.settings.chart.autofocus
@@ -746,8 +753,8 @@ local function getchart(settings,forced_x,forced_y,forced_nx,forced_ny)
-- relocate cells
for i=1,#data do
local cell = data[i]
- cell.x = cell.x - minx + 1
- cell.y = cell.y - miny + 1
+ cell.x = cell.realx - minx + 1
+ cell.y = cell.realy - miny + 1
end
chart.from_x = 1
chart.from_y = 1
@@ -756,7 +763,9 @@ local function getchart(settings,forced_x,forced_y,forced_nx,forced_ny)
chart.nx = nx
chart.ny = ny
--
- -- inspect(chart)
+ chart.shift_x = minx + 1
+ chart.shift_y = miny + 1
+ --
return chart
end
@@ -792,14 +801,14 @@ local function makechart(chart)
local labeloffset = chartsettings.labeloffset
local exitoffset = chartsettings.exitoffset
local commentoffset = chartsettings.commentoffset
- context("flow_grid_width := %s ;", points(gridwidth))
- context("flow_grid_height := %s ;", points(gridheight))
- context("flow_shape_width := %s ;", points(shapewidth))
- context("flow_shape_height := %s ;", points(shapeheight))
- context("flow_chart_offset := %s ;", points(chartoffset))
- context("flow_label_offset := %s ;", points(labeloffset))
- context("flow_exit_offset := %s ;", points(exitoffset))
- context("flow_comment_offset := %s ;", points(commentoffset))
+ context("flow_grid_width := %p ;", gridwidth)
+ context("flow_grid_height := %p ;", gridheight)
+ context("flow_shape_width := %p ;", shapewidth)
+ context("flow_shape_height := %p ;", shapeheight)
+ context("flow_chart_offset := %p ;", chartoffset)
+ context("flow_label_offset := %p ;", labeloffset)
+ context("flow_exit_offset := %p ;", exitoffset)
+ context("flow_comment_offset := %p ;", commentoffset)
--
local radius = settings.line.radius
local rulethickness = settings.line.rulethickness
@@ -814,10 +823,10 @@ local function makechart(chart)
radius = dy
end
end
- context("flow_connection_line_width := %s ;", points(rulethickness))
- context("flow_connection_smooth_size := %s ;", points(radius))
- context("flow_connection_arrow_size := %s ;", points(radius))
- context("flow_connection_dash_size := %s ;", points(radius))
+ context("flow_connection_line_width := %p ;", rulethickness)
+ context("flow_connection_smooth_size := %p ;", radius)
+ context("flow_connection_arrow_size := %p ;", radius)
+ context("flow_connection_dash_size := %p ;", radius)
--
local offset = chartsettings.offset -- todo: pass string
if offset == v_none or offset == v_overlay or offset == "" then
@@ -825,7 +834,7 @@ local function makechart(chart)
elseif offset == v_standard then
offset = radius -- or rulethickness?
end
- context("flow_chart_offset := %s ;",points(offset))
+ context("flow_chart_offset := %p ;",offset)
--
context("flow_reverse_y := true ;")
process_cells(chart,0,0)
@@ -854,7 +863,7 @@ local function splitchart(chart)
local delta_x = splitsettings.dx or 0
local delta_y = splitsettings.dy or 0
--
- report_chart("spliting %a from (%s,%s) upto (%s,%s) into (%s,%s) with overlap (%s,%s)",
+ report_chart("spliting %a from (%s,%s) upto (%s,%s) with steps (%s,%s) and overlap (%s,%s)",
name,from_x,from_y,to_x,to_y,step_x,step_y,delta_x,delta_y)
--
local part_x = 0
@@ -866,6 +875,9 @@ local function splitchart(chart)
if done then
last_x = to_x
end
+-- if first_x >= to_x then
+-- break
+-- end
local part_y = 0
local first_y = from_y
while true do
@@ -875,14 +887,31 @@ local function splitchart(chart)
if done then
last_y = to_y
end
+-- if first_y >= to_y then
+-- break
+-- end
--
+local data = chart.data
+for i=1,#data do
+ local cell = data[i]
+-- inspect(cell)
+ local cx, cy = cell.x, cell.y
+ if cx >= first_x and cx <= last_x then
+ if cy >= first_y and cy <= last_y then
report_chart("part (%s,%s) of %a is split from (%s,%s) -> (%s,%s)",part_x,part_y,name,first_x,first_y,last_x,last_y)
- local x, y, nx, ny = first_x, first_y, last_x - first_x + 1,last_y - first_y + 1
+ local x = first_x
+ local y = first_y
+ local nx = last_x - first_x + 1
+ local ny = last_y - first_y + 1
context.beforeFLOWsplit()
context.handleFLOWsplit(function()
makechart(getchart(settings,x,y,nx,ny)) -- we need to pass frozen settings !
end)
context.afterFLOWsplit()
+ break
+ end
+ end
+end
--
if done then
break
diff --git a/Master/texmf-dist/tex/context/base/m-chart.mkvi b/Master/texmf-dist/tex/context/base/m-chart.mkvi
index 2b1a7447ccd..a0c8b2244a9 100644
--- a/Master/texmf-dist/tex/context/base/m-chart.mkvi
+++ b/Master/texmf-dist/tex/context/base/m-chart.mkvi
@@ -97,7 +97,6 @@
[\c!framecolor=FLOWfocuscolor,
\c!background=\FLOWshapeparameter\c!background,
\c!backgroundcolor=\FLOWshapeparameter\c!backgroundcolor,
- \c!backgroundscreen=\FLOWshapeparameter\c!backgroundscreen,
\c!rulethickness=\FLOWshapeparameter\c!rulethickness,
\c!offset=\FLOWshapeparameter\c!offset]
@@ -177,7 +176,7 @@
corner = "\FLOWlineparameter\c!corner",
dash = "\FLOWlineparameter\c!dash",
arrow = "\FLOWlineparameter\c!arrow",
- offset = "\FLOWlineparameter\c!offset",
+ offset = \number\dimexpr\FLOWlineparameter\c!offset,
},
} }%
\endgroup}
@@ -193,7 +192,7 @@
\insidefloattrue
\dontcomplain
\setupFLOWchart[#settings]%
- \setupbodyfont[\FLOWchartparameter\c!bodyfont]%
+ \usebodyfontparameter\FLOWchartparameter
\ctxcommand{flow_make_chart {
chart = {
name = "#name",
@@ -259,8 +258,9 @@
\def\FLOW_charts[#name][#settings]
{\begingroup
- \setupFLOWsplit[\c!state=\v!start,#settings]%
- \FLOW_chart[#name][]%
+ \setupFLOWchart[\c!split=\v!yes]%
+ \setupFLOWsplit[#settings]%
+ \module_charts_process[#name][]% \FLOWchart...
\endgroup}
\appendtoks
diff --git a/Master/texmf-dist/tex/context/base/m-hemistich.mkiv b/Master/texmf-dist/tex/context/base/m-hemistich.mkiv
index 55fde7b9283..7a849d415be 100644
--- a/Master/texmf-dist/tex/context/base/m-hemistich.mkiv
+++ b/Master/texmf-dist/tex/context/base/m-hemistich.mkiv
@@ -33,7 +33,7 @@
\unexpanded\def\dodohemistiches#1[#2]#3#4%
{\dontleavehmode
\begingroup
- \doifassignmentelse{#2}
+ \doifelseassignment{#2}
{\edef\currenthemistich{#1}%
\setupcurrenthemistich[#2]}
{\def\currenthemistich{#2}}%
@@ -41,21 +41,29 @@
{\scratchwidth\availablehsize}
{\scratchwidth\hemistichparameter\c!width\relax}%
\spaceskip\zeropoint\s!plus\plusone\s!fill\relax
+ \dostarttagged\t!division\currenthemistich
\hbox to \scratchwidth\bgroup
\scratchwidth.5\dimexpr\scratchwidth-\hemistichparameter\c!distance\relax
\hbox to \scratchwidth\bgroup
+ \dostarttagged\t!construct\c!lefttext
\usehemistichstyleandcolor\c!leftstyle\c!leftcolor#3%
+ \dostoptagged
\egroup
\hss
\begingroup
+ \dostarttagged\t!construct\c!separator
\usehemistichstyleandcolor\c!separatorstyle\c!separatorcolor
\hemistichparameter\c!separator
+ \dostoptagged
\endgroup
\hss
\hbox to \scratchwidth\bgroup
+ \dostarttagged\t!construct\c!righttext
\usehemistichstyleandcolor\c!rightstyle\c!rightcolor#4%
+ \dostoptagged
\egroup
\egroup
+ \dostoptagged
\endgroup}
\unexpanded\def\hemistichescaesura#1#2#3%
diff --git a/Master/texmf-dist/tex/context/base/m-matrix.mkiv b/Master/texmf-dist/tex/context/base/m-matrix.mkiv
new file mode 100644
index 00000000000..ccb376e39c7
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/m-matrix.mkiv
@@ -0,0 +1,495 @@
+%D \module
+%D [ file=m-matrix,
+%D version=2014.11.04, % already a year older
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=Matrices,
+%D author={Jeong Dalyoung \& Hans Hagen},
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This code is based on a post by Dalyoung on the context list. After that
+%D we turned it into a module and improved the code a bit. Feel free to ask
+%D us for more. Once we're satisfied, a more general helper l-matrix could
+%D be made. Dalyoung does the clever bits, and Hans only cleanes up and
+%D optimizes a bit.
+
+% \registerctxluafile{l-matrix}{1.001} % not yet
+
+\startmodule[matrix]
+
+\startluacode
+
+local settings_to_hash = utilities.parsers.settings_to_hash
+local formatters = string.formatters
+local copy = table.copy
+local insert = table.insert
+local remove = table.remove
+
+local matrix = { }
+moduledata.matrix = matrix
+
+local f_matrix_slot = formatters["%s_{%s%s}"]
+
+function matrix.symbolic(sym, x, y, nx ,ny) -- symMatrix("a", "m", "n")
+ local nx = nx or 2
+ local ny = ny or nx
+ local function filled(i,y)
+ local mrow = { }
+ for j=1,nx do
+ mrow[#mrow+1] = f_matrix_slot(sym,i,j)
+ end
+ mrow[#mrow+1] = "\\cdots"
+ mrow[#mrow+1] = f_matrix_slot(sym,i,y)
+ return mrow
+ end
+ local function dummy()
+ local mrow = { }
+ for j=1,nx do
+ mrow[#mrow+1] = "\\vdots"
+ end
+ mrow[#mrow+1] = "\\ddots"
+ mrow[#mrow+1] = "\\vdots"
+ return mrow
+ end
+ --
+ local mm = { }
+ for i=1,ny do
+ mm[i] = filled(i,y)
+ end
+ mm[#mm+1] = dummy()
+ mm[#mm+1] = filled(x,y)
+ return mm
+end
+
+-- todo: define a matrix at the tex end so that we have more control
+
+local fences_p = {
+ left = "\\left(\\,",
+ right = "\\,\\right)",
+}
+
+local fences_b = {
+ left = "\\left[\\,",
+ right = "\\,\\right]",
+}
+
+function matrix.typeset(m,options)
+ local options = settings_to_hash(options or "")
+ context.startmatrix(options.determinant and fences_b or fences_p)
+ for i=1, #m do
+ local mi = m[i]
+ for j=1,#mi do
+ context.NC(mi[j])
+ end
+ context.NR()
+ end
+ context.stopmatrix()
+end
+
+-- interchange two rows (i-th, j-th)
+
+function matrix.swap(t,i,j)
+ t[i], t[j] = t[j], t[i]
+end
+
+-- replace i-th row with factor * (i-th row)
+
+function matrix.multiply(m,i,factor)
+ local mi = m[i]
+ for k=1,#mi do
+ mi[k] = factor * mi[k]
+ end
+ return m
+end
+
+-- scalar product "factor * m"
+
+function matrix.scalar(m, factor)
+ for i=1,#m do
+ local mi = m[i]
+ for j=1,#mi do
+ mi[j] = factor * mi[j]
+ end
+ end
+ return m
+end
+
+-- replace i-th row with i-th row + factor * (j-th row)
+
+function matrix.sumrow(m,i,j,factor)
+ local mi = m[i]
+ local mj = m[j]
+ for k=1,#mi do
+ mi[k] = mi[k] + factor * mj[k]
+ end
+end
+
+-- transpose of a matrix
+
+function matrix.transpose(m)
+ local t = { }
+ for j=1,#m[1] do
+ local r = { }
+ for i=1,#m do
+ r[i] = m[i][j]
+ end
+ t[j] = r
+ end
+ return t
+end
+
+-- inner product of two vectors
+
+function matrix.inner(u,v)
+ local nu = #u
+ if nu == 0 then
+ return 0
+ end
+ local nv = #v
+ if nv ~= nu then
+ return 0
+ end
+ local result = 0
+ for i=1,nu do
+ result = result + u[i] * v[i]
+ end
+ return result
+end
+
+-- product of two matrices
+
+function matrix.product(m1,m2)
+ local product = { }
+ if #m1[1] == #m2 then
+ for i=1,#m1 do
+ local m1i = m1[i]
+ local mrow = { }
+ for j=1,#m2[1] do
+ local temp = 0
+ for k=1,#m1[1] do
+ temp = temp + m1i[k] * m2[k][j]
+ end
+ mrow[j] = temp
+ end
+ product[i] = mrow
+ end
+ end
+ return product
+end
+
+local function uppertri(m,sign)
+ local temp = copy(m)
+ for i=1,#temp-1 do
+ local pivot = temp[i][i]
+ if pivot == 0 then
+ local pRow = i +1
+ while temp[pRow][i] == 0 do
+ pRow = pRow + 1
+ if pRow > #temp then -- if there is no nonzero number
+ return temp
+ end
+ end
+ temp[i], temp[pRow] = temp[pRow], temp[i]
+ if sign then
+ sign = -sign
+ end
+ end
+ local mi = temp[i]
+ for k=i+1, #temp do
+ local factor = -temp[k][i]/mi[i]
+ local mk = temp[k]
+ for l=i,#mk do
+ mk[l] = mk[l] + factor * mi[l]
+ end
+ end
+ end
+ if sign then
+ return temp, sign
+ else
+ return temp
+ end
+end
+
+matrix.uppertri = uppertri
+
+function matrix.determinant(m)
+ if #m == #m[1] then
+ local d = 1
+ local t, s = uppertri(m,1)
+ for i=1,#t do
+ d = d * t[i][i]
+ end
+ return s*d
+ else
+ return 0
+ end
+end
+
+local function rowechelon(m,r)
+ local temp = copy(m)
+ local pRow = 1
+ local pCol = 1
+ while pRow <= #temp do
+ local pivot = temp[pRow][pCol]
+ if pivot == 0 then
+ local i = pRow
+ local n = #temp
+ while temp[i][pCol] == 0 do
+ i = i + 1
+ if i > n then
+ -- no nonzero number in a column
+ pCol = pCol + 1
+ if pCol > #temp[pRow] then
+ -- there is no nonzero number in a row
+ return temp
+ end
+ i = pRow
+ end
+ end
+ temp[pRow], temp[i] = temp[i], temp[pRow]
+ end
+ local row = temp[pRow]
+ pivot = row[pCol]
+ for l=pCol,#row do
+ row[l] = row[l]/pivot
+ end
+
+ if r == 1 then
+ -- make the "reduced row echelon form"
+ local row = temp[pRow]
+ for k=1,pRow-1 do
+ local current = temp[k]
+ local factor = -current[pCol]
+ local mk = current
+ for l=pCol,#mk do
+ mk[l] = mk[l] + factor * row[l]
+ end
+ end
+ end
+ -- just make the row echelon form
+ local row = temp[pRow]
+ for k=pRow+1, #temp do
+ local current = temp[k]
+ local factor = -current[pCol]
+ local mk = current
+ for l=pCol,#mk do
+ mk[l] = mk[l] + factor * row[l]
+ end
+ end
+ pRow = pRow + 1
+ pCol = pCol + 1
+
+ if pRow > #temp or pCol > #temp[1] then
+ pRow = #temp + 1
+ end
+ end
+ return temp
+end
+
+matrix.rowechelon = rowechelon
+matrix.rowEchelon = rowechelon
+
+-- solve the linear equation m X = c
+
+local function solve(m,c)
+ local n = #m
+ if n ~= #c then
+ return copy(m)
+ end
+ local newm = copy(m)
+ local temp = copy(c)
+ for i=1,n do
+ insert(newm[i],temp[i])
+ end
+ return rowechelon(newm,1)
+end
+
+matrix.solve = solve
+
+-- find the inverse matrix of m
+
+local function inverse(m)
+ local n = #m
+ local temp = copy(m)
+ if n ~= #m[1] then
+ return temp
+ end
+ for i=1,n do
+ for j=1,n do
+ insert(temp[i],j == i and 1 or 0)
+ end
+ end
+ temp = rowechelon(temp,1)
+ for i=1,n do
+ for j=1,n do
+ remove(temp[i], 1)
+ end
+ end
+ return temp
+end
+
+matrix.inverse = inverse
+
+\stopluacode
+
+\stopmodule
+
+\unexpanded\def\ctxmodulematrix#1{\ctxlua{moduledata.matrix.#1}}
+
+\continueifinputfile{m-matrix.mkiv}
+
+\starttext
+
+\startluacode
+document.DemoMatrixA = {
+ { 0, 2, 4, -4, 1 },
+ { 0, 0, 2, 3, 4 },
+ { 2, 2, -6, 2, 4 },
+ { 2, 0, -6, 9, 7 },
+ { 2, 3, 4, 5, 6 },
+ { 6, 6, -6, 6, 6 },
+}
+
+document.DemoMatrixB = {
+ { 0, 2, 4, -4, 1 },
+ { 0, 0, 2, 3, 4 },
+ { 2, 2, -6, 2, 4 },
+ { 2, 0, -6, 9, 7 },
+ { 2, 2, -6, 2, 4 },
+ { 2, 2, -6, 2, 4 },
+}
+\stopluacode
+
+\startsubject[title={A symbolic matrix}]
+
+\ctxmodulematrix{typeset(moduledata.matrix.symbolic("a", "m", "n"))}
+\ctxmodulematrix{typeset(moduledata.matrix.symbolic("a", "m", "n", 4, 8))}
+
+\stopsubject
+
+\startsubject[title={Swap two rows (2 and 4)}]
+
+\startluacode
+moduledata.matrix.typeset(document.DemoMatrixA)
+context.blank()
+moduledata.matrix.swap(document.DemoMatrixA, 2, 4)
+context.blank()
+moduledata.matrix.typeset(document.DemoMatrixA)
+\stopluacode
+
+\stopsubject
+
+\startsubject[title={Multiply $3 \times r_2$}]
+
+\startluacode
+moduledata.matrix.typeset(document.DemoMatrixA)
+context.blank()
+moduledata.matrix.typeset(moduledata.matrix.multiply(document.DemoMatrixA, 2, 3))
+\stopluacode
+
+\stopsubject
+
+\startsubject[title={Row 2 + $3 \times r_4$}]
+
+\startluacode
+moduledata.matrix.typeset(document.DemoMatrixA)
+context.blank()
+moduledata.matrix.sumrow(document.DemoMatrixA, 2, 3, 4)
+context.blank()
+moduledata.matrix.typeset(document.DemoMatrixA)
+\stopluacode
+
+\stopsubject
+
+\startsubject[title={Transpose a matrix}]
+
+\startluacode
+moduledata.matrix.typeset(document.DemoMatrixA)
+context.blank()
+moduledata.matrix.typeset(moduledata.matrix.transpose(document.DemoMatrixA))
+\stopluacode
+
+\stopsubject
+
+\startsubject[title={The inner product of two vectors}]
+
+\startluacode
+context(moduledata.matrix.inner({ 1, 2, 3 }, { 3, 1, 2 }))
+context.blank()
+context(moduledata.matrix.inner({ 1, 2, 3 }, { 3, 1, 2, 4 }))
+\stopluacode
+
+\startsubject[title={The product of two matrices}]
+
+\startluacode
+moduledata.matrix.typeset(document.DemoMatrixA)
+context.blank()
+moduledata.matrix.typeset(moduledata.matrix.product(document.DemoMatrixA,document.DemoMatrixA))
+\stopluacode
+
+\stopsubject
+
+\startsubject[title={An Upper Triangular Matrix}]
+
+\ctxmodulematrix{typeset(moduledata.matrix.uppertri(document.DemoMatrixB))}
+
+\startsubject[title={A determinant}]
+
+\startluacode
+local m = {
+ { 1, 2, 4 },
+ { 0, 0, 2 },
+ { 2, 2, -6 },
+}
+context(moduledata.matrix.determinant(m))
+\stopluacode
+
+\stopsubject
+
+\startsubject[title={Row echelon form}]
+
+\startluacode
+local m = {
+ { 1, 3, -2, 0, 2, 0, 0 },
+ { 2, 6, -5, -2, 4, -3, -1 },
+ { 0, 0, 5, 10, 0, 15, 5 },
+ { 2, 6, 0, 8, 4, 18, 6 },
+}
+
+moduledata.matrix.typeset(m)
+moduledata.matrix.typeset(moduledata.matrix.rowechelon(m,1))
+\stopluacode
+
+\stopsubject
+
+\startsubject[title={Solving linear equation}]
+
+\startluacode
+local m = {
+ { 1, 3, -2, 0 },
+ { 2, 0, 1, 2 },
+ { 6, -5, -2, 4 },
+ { -3, -1, 5, 10 },
+}
+
+local c = { 5, 2, 6, 8 }
+
+moduledata.matrix.typeset(moduledata.matrix.solve(m,c))
+\stopluacode
+
+\stopsubject
+
+\startsubject[title={Inverse matrix}]
+
+\startcombination[2*1]
+ {\ctxlua{moduledata.matrix.typeset { { 1, 1, 1 }, { 0, 2, 3 }, { 3, 2, 1 } }}} {}
+ {\ctxlua{moduledata.matrix.typeset(moduledata.matrix.inverse { { 1, 1, 1 }, { 0, 2, 3 }, { 3, 2, 1 } })}} {}
+\stopcombination
+
+\stopsubject
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/m-morse.mkvi b/Master/texmf-dist/tex/context/base/m-morse.mkvi
deleted file mode 100644
index a2c20dff745..00000000000
--- a/Master/texmf-dist/tex/context/base/m-morse.mkvi
+++ /dev/null
@@ -1,273 +0,0 @@
-%D \module
-%D [ file=m-morse,
-%D version=2010.12.10,
-%D title=\CONTEXT\ Extra Modules,
-%D subtitle=Morse,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-% todo: act upon the node list
-% make it a buffer operation
-% nice in cld manual
-
-\startluacode
-
-moduledata.morse = moduledata.morse or { }
-local morse = moduledata.morse
-
-local utfcharacters, gsub = string.utfcharacters, string.gsub
-local ucchars, shchars = characters.ucchars, characters.shchars
-
-local codes = {
-
- ["A"] = "·—",
- ["B"] = "—···",
- ["C"] = "—·—·",
- ["D"] = "—··",
- ["E"] = "·",
- ["F"] = "··—·",
- ["G"] = "——·",
- ["H"] = "····",
- ["I"] = "··",
- ["J"] = "·———",
- ["K"] = "—·—",
- ["L"] = "·—··",
- ["M"] = "——",
- ["N"] = "—·",
- ["O"] = "———",
- ["P"] = "·——·",
- ["Q"] = "——·—",
- ["R"] = "·—·",
- ["S"] = "···",
- ["T"] = "—",
- ["U"] = "··—",
- ["V"] = "···—",
- ["W"] = "·——",
- ["X"] = "—··—",
- ["Y"] = "—·——",
- ["Z"] = "——··",
-
- ["0"] = "—————",
- ["1"] = "·————",
- ["2"] = "··———",
- ["3"] = "···——",
- ["4"] = "····—",
- ["5"] = "·····",
- ["6"] = "—····",
- ["7"] = "——···",
- ["8"] = "———··",
- ["9"] = "————·",
-
- ["."] = "·—·—·—",
- [","] = "——··——",
- [":"] = "———···",
- [";"] = "—·—·—",
-
- ["?"] = "··——··",
- ["!"] = "—·—·——",
-
- ["-"] = "—····—",
- ["/"] = "—··—· ",
-
- ["("] = "—·——·",
- [")"] = "—·——·—",
-
- ["="] = "—···—",
- ["@"] = "·——·—·",
-
- ["'"] = "·————·",
- ['"'] = "·—··—·",
-
- ["À"] = "·——·—",
- ["Å"] = "·——·—",
- ["Ä"] = "·—·—",
- ["Æ"] = "·—·—",
- ["Ç"] = "—·—··",
- ["É"] = "··—··",
- ["È"] = "·—··—",
- ["Ñ"] = "——·——",
- ["Ö"] = "———·",
- ["Ø"] = "———·",
- ["Ü"] = "··——",
- ["ß"] = "··· ···",
-
-}
-
-morse.codes = codes
-
-local fallbackself = false
-
-local function codefallback(t,k)
- if k then
- local u = ucchars[k]
- local v = rawget(t,u) or rawget(t,shchars[u]) or false
- t[k] = v
- return v
- elseif fallbackself then
- return k
- else
- return false
- end
-end
-
-table.setmetatableindex(codes,codefallback)
-
-local MorseBetweenWords = context.MorseBetweenWords
-local MorseBetweenCharacters = context.MorseBetweenCharacters
-local MorseLong = context.MorseLong
-local MorseShort = context.MorseShort
-local MorseSpace = context.MorseSpace
-local MorseUnknown = context.MorseUnknown
-
-local function toverbose(str)
- str = gsub(str,"%s*+%s*","+")
- str = gsub(str,"%s+"," ")
- local done = false
- for m in utfcharacters(str) do
- if done then
- MorseBetweenCharacters()
- end
- if m == "·" or m == "." then
- MorseShort()
- done = true
- elseif m == "—" or m == "-" then
- MorseLong()
- done = true
- elseif m == " " then
- if done then
- MorseBetweenCharacters()
- end
- done = false
- elseif m == "+" then
- MorseBetweenWords()
- done = false
- else
- MorseUnknown(m)
- end
- end
-end
-
-local function toregular(str)
- local inmorse = false
- for s in utfcharacters(str) do
- local m = codes[s]
- if m then
- if inmorse then
- MorseBetweenWords()
- else
- inmorse = true
- end
- local done = false
- for m in utfcharacters(m) do
- if done then
- MorseBetweenCharacters()
- else
- done = true
- end
- if m == "·" then
- MorseShort()
- elseif m == "—" then
- MorseLong()
- elseif m == " " then
- MorseBetweenCharacters()
- end
- end
- inmorse = true
- elseif s == "\n" or s == " " then
- MorseSpace()
- inmorse = false
- else
- if inmorse then
- MorseBetweenWords()
- else
- inmorse = true
- end
- MorseUnknown(s)
- end
- end
-end
-
-local function tomorse(str,verbose)
- if verbose then
- toverbose(str)
- else
- toregular(str)
- end
-end
-
-morse.tomorse = tomorse
-
-function morse.filetomorse(name,verbose)
- tomorse(resolvers.loadtexfile(name),verbose)
-end
-
-function morse.showtable()
- context.starttabulate { "|l|l|" } -- { "|l|l|l|" }
- for k, v in table.sortedpairs(codes) do
- context.NC() context(k)
- -- context.NC() context(v)
- context.NC() tomorse(v,true)
- context.NC() context.NR()
- end
- context.stoptabulate()
-end
-
-\stopluacode
-
-\unprotect
-
-% todo: \setupmorse, but probably it's not worth the trouble.
-
-\def\MorseWidth {0.4em}
-\def\MorseHeight {0.2em}
-%def\MorseShort {\dontleavehmode\blackrule[\c!height=\MorseHeight,\c!width=\dimexpr\MorseWidth]}
-%def\MorseLong {\dontleavehmode\blackrule[\c!height=\MorseHeight,\c!width=3\dimexpr\MorseWidth]}
-\def\MorseShort {\dontleavehmode\vrule\!!width \dimexpr\MorseWidth\!!height\MorseHeight\!!depth\zeropoint\relax}
-\def\MorseLong {\dontleavehmode\vrule\!!width3\dimexpr\MorseWidth\!!height\MorseHeight\!!depth\zeropoint\relax}
-\def\MorseBetweenCharacters {\kern\MorseWidth}
-\def\MorseBetweenWords {\hskip3\dimexpr\MorseWidth\relax}
-\def\MorseSpace {\hskip7\dimexpr\MorseWidth\relax}
-\def\MorseUnknown #text{[\detokenize{#text}]}
-
-\unexpanded\def\MorseCode #text{\ctxlua{moduledata.morse.tomorse(\!!bs#text\!!es,true)}}
-\unexpanded\def\MorseString #text{\ctxlua{moduledata.morse.tomorse(\!!bs#text\!!es)}}
-\unexpanded\def\MorseFile #text{\ctxlua{moduledata.morse.filetomorse("#text")}}
-\unexpanded\def\MorseTable {\ctxlua{moduledata.morse.showtable()}}
-
-\let\Morse \MorseString
-
-%def\MorseShort {·}
-%def\MorseLong {—}
-
-\protect
-
-\continueifinputfile{m-morse.mkvi}
-
-\starttext
-
-\MorseTable
-
-\startlines
-\MorseCode{—·—· ——— —· — · —··— —+—— —·— ·· ···—}
-\MorseCode{—·—· ——— —· — · —··— — + —— —·— ·· ···—}
-\Morse{ÀÁÂÃÄÅàáâãäå}
-\Morse{ÆÇæç}
-\Morse{ÈÉÊËèéêë}
-\Morse{ÌÍÎÏìíîï}
-\Morse{Ññ}
-\Morse{ÒÓÔÕÖòóôõö}
-\Morse{Øø}
-\Morse{ÙÚÛÜùúû}
-\Morse{Ýýÿ}
-\Morse{ß}
-\Morse{Ţţ}
-\stoplines
-
-\Morse{A B C D E F G H I J K L M N O P Q R S T U V W X Y Z}
-
-\stoptext
diff --git a/Master/texmf-dist/tex/context/base/m-oldfun.mkiv b/Master/texmf-dist/tex/context/base/m-oldfun.mkiv
index 1c5a1d29d41..3f2ec0263ed 100644
--- a/Master/texmf-dist/tex/context/base/m-oldfun.mkiv
+++ b/Master/texmf-dist/tex/context/base/m-oldfun.mkiv
@@ -131,7 +131,7 @@
\unexpanded\def\DroppedCaps#1#2#3#4#5#6#7% does not yet handle accented chars
{\defconvertedargument\asciia{#7}%
\defconvertedcommand \asciib{\DroppedString}%
- \doifinstringelse\asciia\asciib
+ \doifelseinstring\asciia\asciib
{\noindentation
\dontleavehmode
\checkindentation % redo this one
diff --git a/Master/texmf-dist/tex/context/base/m-oldnum.mkiv b/Master/texmf-dist/tex/context/base/m-oldnum.mkiv
index efc0af4721f..382c56eb674 100644
--- a/Master/texmf-dist/tex/context/base/m-oldnum.mkiv
+++ b/Master/texmf-dist/tex/context/base/m-oldnum.mkiv
@@ -73,8 +73,8 @@
\chardef\digitoutputmode=1 % 0..6
\chardef\digitsignmode =0 % 0..3
-\def\setdigitmode{\chardef\digitoutputmode}
-\def\setdigitsign{\chardef\digitsignmode}
+\unexpanded\def\setdigitmode{\chardef\digitoutputmode}
+\unexpanded\def\setdigitsign{\chardef\digitsignmode}
%D The digit modes are:
%D
@@ -100,7 +100,7 @@
\unexpanded\def\digits
{\bgroup
\let~@%
- \doifnextbgroupelse\dodigits{\doifnextcharelse\normalmathshift\domathdigits\grabdigit}}
+ \doifelsenextbgroup\dodigits{\doifelsenextchar\normalmathshift\domathdigits\grabdigit}}
\def\dodigits#1%
{\grabdigit#1\relax}
@@ -118,7 +118,7 @@
\ifx\normalmathshift\undefined \let\normalmathshift=$ \fi
-\def\scandigit
+\unexpanded\def\scandigit
{\ifx\next\blankspace
\let\next\handledigits
\else\ifx\next\nextobeyedline % the indirect one
@@ -139,10 +139,10 @@
%D typeset it in superscript. The space placeholders are
%D replaced by a \type {@}.
-\def\savedigit#1#2%
+\unexpanded\def\savedigit#1#2%
{\edef#1{#1\saveddigits#2}\let\saveddigits\empty}
-\long\def\collectdigit#1%
+\unexpanded\def\collectdigit#1%
{\ifx#1~%
\savedigit\collecteddigits @%
\else\if#1_% tricky as can be several catcodes ... will become lua code anyway
@@ -158,13 +158,13 @@
\chardef\powerdigits\plusone
\else
\savedigit\collecteddigits#1%
- %\doifnumberelse{#1}
+ %\doifelsenumber{#1}
% {\savedigit\collecteddigits#1}
% {\def\saveddigits{#1}}%
\fi\fi\fi
\else
\savedigit\savedpowerdigits#1%
- %\doifnumberelse{#1}
+ %\doifelsenumber{#1}
% {\savedigit\savedpowerdigits#1}
% {\def\saveddigits{#1}}%
\fi\fi\fi\fi
@@ -173,7 +173,7 @@
\let\handlemathdigits\firstofoneargument
\let\handletextdigits\mathematics
-\def\handledigits
+\unexpanded\def\handledigits
{%\ifcase\powerdigits
% \edef\collecteddigits{\collecteddigits\saveddigits}%
%\else
@@ -235,7 +235,7 @@
% 0,- is invalid, should be =
% 0,-- is invalid, should be ==
-\def\digitzeroamount
+\unexpanded\def\digitzeroamount
{\digitsgn\zeroamount
\def\digitzeroamount
{\hphantom
@@ -243,7 +243,7 @@
\hskip-\wd\scratchbox}%
\let\digitzeroamount\empty}}
-\def\scandigits#1%
+\unexpanded\def\scandigits#1%
{\if#1.\digitsep1\else
\if#1,\digitsep2\else
\if#1@\digitnop \else
@@ -261,7 +261,7 @@
\newbox\digitsepbox \chardef\autodigitmode=1
-\def\digitsep#1%
+\unexpanded\def\digitsep#1%
{\ifcase\autodigitmode
\doscandigit#1%
\else
@@ -277,7 +277,7 @@
%
% while this works
-\def\digitnop
+\unexpanded\def\digitnop
{\hbox{\hphantom{\box\digitsepbox}}%
\hphantom{0}\chardef\skipdigit1\relax}
@@ -287,7 +287,7 @@
% {\hphantom{\box\digitsepbox0}%
% \chardef\skipdigit1\relax}
-\def\digitsgn#1%
+\unexpanded\def\digitsgn#1%
{\ifcase\digitsignmode#1\else
\hbox
{\setbox\scratchbox\hbox{0}%
@@ -404,11 +404,11 @@
%D \digittemplate 12.000.000,00 % \digittemplate .,
%D \stoptyping
-\def\digittemplate #1 %
+\unexpanded\def\digittemplate #1 %
{\chardef\digitinputmode\zerocount
\handletokens#1\with\scandigittemplate}
-\def\scandigittemplate#1%
+\unexpanded\def\scandigittemplate#1%
{\if #1.\ifcase\digitinputmode\chardef\digitinputmode\plusone \fi% period
\else\if#1,\ifcase\digitinputmode\chardef\digitinputmode\plustwo \fi% comma
\fi\fi}
diff --git a/Master/texmf-dist/tex/context/base/m-scite.mkiv b/Master/texmf-dist/tex/context/base/m-scite.mkiv
index aed2c26315d..7a8e8b06e6f 100644
--- a/Master/texmf-dist/tex/context/base/m-scite.mkiv
+++ b/Master/texmf-dist/tex/context/base/m-scite.mkiv
@@ -66,6 +66,8 @@ local f_mapping = [[
\let\string\slxR\string\letterrightbrace
\let\string\slxM\string\letterdollar
\let\string\slxV\string\letterbar
+\let\string\slxU\string\letterhat
+\let\string\slxD\string\letterunderscore
\let\string\slxH\string\letterhash
\let\string\slxB\string\letterbackslash
\let\string\slxP\string\letterpercent
@@ -76,6 +78,8 @@ local replacer = lpeg.replacer {
["{"] = "\\slxL ",
["}"] = "\\slxR ",
["$"] = "\\slxM ",
+ ["^"] = "\\slxU ",
+ ["_"] = "\\slxD ",
["|"] = "\\slxV ",
["#"] = "\\slxH ",
["\\"] = "\\slxB ",
@@ -195,6 +199,7 @@ end
\installscitecommands
\tt
\dontcomplain
+ \setcatcodetable\ctxcatcodes % needed in xml
\startscite
\getbuffer[lex]%
\stopscite
@@ -213,6 +218,7 @@ end
\installscitecommands
\tt
\dontcomplain
+ \setcatcodetable\ctxcatcodes % needed in xml
\startscite
\getbuffer[lex]%
\stopscite
diff --git a/Master/texmf-dist/tex/context/base/m-spreadsheet.mkiv b/Master/texmf-dist/tex/context/base/m-spreadsheet.mkiv
index 5e0499184bb..914a2b57a9e 100644
--- a/Master/texmf-dist/tex/context/base/m-spreadsheet.mkiv
+++ b/Master/texmf-dist/tex/context/base/m-spreadsheet.mkiv
@@ -88,6 +88,8 @@
\unexpanded\def\doifelsespreadsheetcell
{\dosingleempty\module_spreadsheet_doifelse_cell}
+\let\doifspreadsheetcellelse\doifelsespreadsheetcell
+
\unexpanded\def\module_spreadsheet_doifelse_cell[#1]#2#3%
{\ctxlua{moduledata.spreadsheets.doifelsecell("#1",\number#2,\number#3)}}
@@ -118,7 +120,7 @@
\let\stoprow \module_spreadsheet_row_stop
\let\startcell\module_spreadsheet_cell_start
\let\stopcell \module_spreadsheet_cell_stop
- \doifassignmentelse{#1}
+ \doifelseassignment{#1}
{\module_spreadsheet_start
\directsetup{spreadsheet:before:\currentspreadsheet}%
\bTABLE[\c!align=\v!flushright,#1]}
@@ -136,7 +138,7 @@
\unexpanded\def\module_spreadsheet_row_stop {\eTR}
\unexpanded\def\module_spreadsheet_cell_start
- {\doifnextoptionalelse\module_spreadsheet_cell_start_yes\module_spreadsheet_cell_start_nop}
+ {\doifelsenextoptional\module_spreadsheet_cell_start_yes\module_spreadsheet_cell_start_nop}
\unexpanded\def\module_spreadsheet_cell_start_yes[#1]#2\stopcell
{\bTD[#1]\getspr{#2}\eTD}
diff --git a/Master/texmf-dist/tex/context/base/m-steps.lua b/Master/texmf-dist/tex/context/base/m-steps.lua
index 97759b79917..8eb4815506e 100644
--- a/Master/texmf-dist/tex/context/base/m-steps.lua
+++ b/Master/texmf-dist/tex/context/base/m-steps.lua
@@ -10,7 +10,6 @@ if not modules then modules = { } end modules ['x-flow'] = {
moduledata.steps = moduledata.steps or { }
-local points = number.points -- number.pt
local variables = interfaces.variables
local trace_charts = false
@@ -100,22 +99,22 @@ function commands.step_make_chart(settings)
end
--
context("text_line_color := \\MPcolor{%s} ;", textsettings.framecolor)
- context("text_line_width := %s ;", points(textsettings.rulethickness))
+ context("text_line_width := %p ;", textsettings.rulethickness)
context("text_fill_color := \\MPcolor{%s} ;", textsettings.backgroundcolor)
- context("text_offset := %s ;", points(textsettings.offset))
- context("text_distance_set := %s ;", points(textsettings.distance))
+ context("text_offset := %p ;", textsettings.offset)
+ context("text_distance_set := %p ;", textsettings.distance)
--
context("cell_line_color := \\MPcolor{%s} ;", cellsettings.framecolor)
- context("cell_line_width := %s ;", points(cellsettings.rulethickness))
+ context("cell_line_width := %p ;", cellsettings.rulethickness)
context("cell_fill_color := \\MPcolor{%s} ;", cellsettings.backgroundcolor)
- context("cell_offset := %s ;", points(cellsettings.offset))
- context("cell_distance_x := %s ;", points(cellsettings.dx))
- context("cell_distance_y := %s ;", points(cellsettings.dy))
+ context("cell_offset := %p ;", cellsettings.offset)
+ context("cell_distance_x := %p ;", cellsettings.dx)
+ context("cell_distance_y := %p ;", cellsettings.dy)
--
context("line_line_color := \\MPcolor{%s} ;", linesettings.color)
- context("line_line_width := %s ;", points(linesettings.rulethickness))
- context("line_distance := %s ;", points(linesettings.distance))
- context("line_offset := %s ;", points(linesettings.offset))
+ context("line_line_width := %p ;", linesettings.rulethickness)
+ context("line_distance := %p ;", linesettings.distance)
+ context("line_offset := %p ;", linesettings.offset)
--
for i=1,#steps do
local step = steps[i]
diff --git a/Master/texmf-dist/tex/context/base/m-steps.mkvi b/Master/texmf-dist/tex/context/base/m-steps.mkvi
index a07ece3ae8d..c9c5a063620 100644
--- a/Master/texmf-dist/tex/context/base/m-steps.mkvi
+++ b/Master/texmf-dist/tex/context/base/m-steps.mkvi
@@ -98,7 +98,7 @@
\def\module_steps_start_chart[#name][#settings]%
{\startnointerference
\iffirstargument
- \doifassignmentelse{#name}
+ \doifelseassignment{#name}
{\let\currentSTEPchart\empty
\xdef\module_steps_flush_chart{\module_steps_chart[][#name]}}
{\edef\currentSTEPchart{#name}%
diff --git a/Master/texmf-dist/tex/context/base/m-translate.mkiv b/Master/texmf-dist/tex/context/base/m-translate.mkiv
index f36f9a9fba2..2e6cbe95088 100644
--- a/Master/texmf-dist/tex/context/base/m-translate.mkiv
+++ b/Master/texmf-dist/tex/context/base/m-translate.mkiv
@@ -22,12 +22,34 @@
local compiled, list = nil, nil
+ -- function translators.register(from,to)
+ -- local l = lpeg.P(from)/to
+ -- if not list then
+ -- list = l
+ -- else
+ -- list = list + l
+ -- end
+ -- compiled = nil
+ -- end
+ --
+ -- function translators.translate(s)
+ -- if list then
+ -- if not compiled then
+ -- compiled = lpeg.Cs((list + lpeg.P(1))^0)
+ -- end
+ -- return compiled:match(s)
+ -- else
+ -- return s
+ -- end
+ -- end
+
+ -- local function prepare()
+
function translators.register(from,to)
- local l = lpeg.P(from)/to
if not list then
- list = l
+ list = { [from] = to }
else
- list = list + l
+ list[from] = to
end
compiled = nil
end
@@ -35,7 +57,8 @@
function translators.translate(s)
if list then
if not compiled then
- compiled = lpeg.Cs((list + lpeg.P(1))^0)
+ local tree = lpeg.utfchartabletopattern(list)
+ compiled = lpeg.Cs((tree/list + lpeg.patterns.utf8character)^0 * lpeg.P(-1)) -- the P(1) is needed in order to accept non utf
end
return compiled:match(s)
else
diff --git a/Master/texmf-dist/tex/context/base/m-visual.mkiv b/Master/texmf-dist/tex/context/base/m-visual.mkiv
index 504c0d0c5f2..3c57691ec64 100644
--- a/Master/texmf-dist/tex/context/base/m-visual.mkiv
+++ b/Master/texmf-dist/tex/context/base/m-visual.mkiv
@@ -161,7 +161,7 @@
{\freezerandomseed
\let\endstrut\relax
\let\begstrut\relax
- \doifinsetelse{#1}{\v!left,\v!right}
+ \doifelseinset{#1}{\v!left,\v!right}
{\fakewords{2}{4}}
{\fakewords{4}{10}}}%
{\doifinset{#1}{\v!left,\v!right}
@@ -762,7 +762,7 @@
\startoverlay
{\copy\scratchbox}
{\dodotagbox{#1}\scratchbox{\framed
- [\c!background=\v!screen,\c!backgroundscreen=1]{#2}}}
+ [\c!background=\v!color,\c!backgroundcolor=\v!gray]{#2}}}
\stopoverlay
\egroup
\nextboxwd\the\wd\scratchbox
diff --git a/Master/texmf-dist/tex/context/base/math-act.lua b/Master/texmf-dist/tex/context/base/math-act.lua
index 879480dce59..d0ea789909c 100644
--- a/Master/texmf-dist/tex/context/base/math-act.lua
+++ b/Master/texmf-dist/tex/context/base/math-act.lua
@@ -90,6 +90,8 @@ end
sequencers.appendaction("mathparameters","system","mathematics.scaleparameters")
+-- AccentBaseHeight vs FlattenedAccentBaseHeight
+
function mathematics.checkaccentbaseheight(target,original)
local mathparameters = target.mathparameters
if mathparameters and mathparameters.AccentBaseHeight == 0 then
@@ -103,15 +105,23 @@ function mathematics.checkprivateparameters(target,original)
local mathparameters = target.mathparameters
if mathparameters then
local parameters = target.parameters
+ local properties = target.properties
if parameters then
- if not mathparameters.FractionDelimiterSize then
- mathparameters.FractionDelimiterSize = 1.01 * parameters.size
- end
- if not mathparameters.FractionDelimiterDisplayStyleSize then
- mathparameters.FractionDelimiterDisplayStyleSize = 2.40 * parameters.size
+ local size = parameters.size
+ if size then
+ if not mathparameters.FractionDelimiterSize then
+ mathparameters.FractionDelimiterSize = 1.01 * size
+ end
+ if not mathparameters.FractionDelimiterDisplayStyleSize then
+ mathparameters.FractionDelimiterDisplayStyleSize = 2.40 * size
+ end
+ elseif properties then
+ report_math("invalid parameters in font %a",properties.fullname or "?")
+ else
+ report_math("invalid parameters in font")
end
- elseif target.properties then
- report_math("no parameters in font %a",target.properties.fullname or "?")
+ elseif properties then
+ report_math("no parameters in font %a",properties.fullname or "?")
else
report_math("no parameters and properties in font")
end
@@ -465,21 +475,17 @@ setmetatableindex(extensibles,function(extensibles,font)
return codes
end)
-function mathematics.extensiblecode(family,unicode)
+local function extensiblecode(family,unicode)
return extensibles[family_font(family or 0)][unicode][1]
end
-function commands.extensiblecode(family,unicode)
- context(extensibles[family_font(family or 0)][unicode][1])
-end
-
-- left : [head] ...
-- right : ... [head]
-- horizontal : [head] ... [head]
--
-- abs(right["start"] - right["end"]) | right.advance | characters[right.glyph].width
-function commands.horizontalcode(family,unicode)
+local function horizontalcode(family,unicode)
local font = family_font(family or 0)
local data = extensibles[font][unicode]
local kind = data[1]
@@ -503,13 +509,30 @@ function commands.horizontalcode(family,unicode)
loffset = abs((left ["start"] or 0) - (left ["end"] or 0))
roffset = abs((right["start"] or 0) - (right["end"] or 0))
end
- else
end
- texsetdimen("scratchleftoffset",loffset)
- texsetdimen("scratchrightoffset",roffset)
- context(kind)
+ return kind, loffset, roffset
end
+mathematics.extensiblecode = extensiblecode
+mathematics.horizontalcode = horizontalcode
+
+interfaces.implement {
+ name = "extensiblecode",
+ arguments = { "integer", "integer" },
+ actions = { extensiblecode, context }
+}
+
+interfaces.implement {
+ name = "horizontalcode",
+ arguments = { "integer", "integer" },
+ actions = function(family,unicode)
+ local kind, loffset, roffset = horizontalcode(family,unicode)
+ texsetdimen("scratchleftoffset", loffset)
+ texsetdimen("scratchrightoffset",roffset)
+ context(kind)
+ end
+}
+
-- experiment
-- check: when true, only set when present in font
@@ -517,85 +540,6 @@ end
local blocks = characters.blocks -- this will move to char-ini
-blocks["uppercasenormal"] = { first = 0x00041, last = 0x0005A }
-blocks["uppercasebold"] = { first = 0x1D400, last = 0x1D419 }
-blocks["uppercaseitalic"] = { first = 0x1D434, last = 0x1D44D }
-blocks["uppercasebolditalic"] = { first = 0x1D468, last = 0x1D481 }
-blocks["uppercasescript"] = { first = 0x1D49C, last = 0x1D4B5 }
-blocks["uppercaseboldscript"] = { first = 0x1D4D0, last = 0x1D4E9 }
-blocks["uppercasefraktur"] = { first = 0x1D504, last = 0x1D51D }
-blocks["uppercasedoublestruck"] = { first = 0x1D538, last = 0x1D551 }
-blocks["uppercaseboldfraktur"] = { first = 0x1D56C, last = 0x1D585 }
-blocks["uppercasesansserifnormal"] = { first = 0x1D5A0, last = 0x1D5B9 }
-blocks["uppercasesansserifbold"] = { first = 0x1D5D4, last = 0x1D5ED }
-blocks["uppercasesansserifitalic"] = { first = 0x1D608, last = 0x1D621 }
-blocks["uppercasesansserifbolditalic"] = { first = 0x1D63C, last = 0x1D655 }
-blocks["uppercasemonospace"] = { first = 0x1D670, last = 0x1D689 }
-blocks["uppercasegreeknormal"] = { first = 0x00391, last = 0x003AA }
-blocks["uppercasegreekbold"] = { first = 0x1D6A8, last = 0x1D6C1 }
-blocks["uppercasegreekitalic"] = { first = 0x1D6E2, last = 0x1D6FB }
-blocks["uppercasegreekbolditalic"] = { first = 0x1D71C, last = 0x1D735 }
-blocks["uppercasegreeksansserifbold"] = { first = 0x1D756, last = 0x1D76F }
-blocks["uppercasegreeksansserifbolditalic"] = { first = 0x1D790, last = 0x1D7A9 }
-
-blocks["lowercasenormal"] = { first = 0x00061, last = 0x0007A }
-blocks["lowercasebold"] = { first = 0x1D41A, last = 0x1D433 }
-blocks["lowercaseitalic"] = { first = 0x1D44E, last = 0x1D467 }
-blocks["lowercasebolditalic"] = { first = 0x1D482, last = 0x1D49B }
-blocks["lowercasescript"] = { first = 0x1D4B6, last = 0x1D4CF }
-blocks["lowercaseboldscript"] = { first = 0x1D4EA, last = 0x1D503 }
-blocks["lowercasefraktur"] = { first = 0x1D51E, last = 0x1D537 }
-blocks["lowercasedoublestruck"] = { first = 0x1D552, last = 0x1D56B }
-blocks["lowercaseboldfraktur"] = { first = 0x1D586, last = 0x1D59F }
-blocks["lowercasesansserifnormal"] = { first = 0x1D5BA, last = 0x1D5D3 }
-blocks["lowercasesansserifbold"] = { first = 0x1D5EE, last = 0x1D607 }
-blocks["lowercasesansserifitalic"] = { first = 0x1D622, last = 0x1D63B }
-blocks["lowercasesansserifbolditalic"] = { first = 0x1D656, last = 0x1D66F }
-blocks["lowercasemonospace"] = { first = 0x1D68A, last = 0x1D6A3 }
-blocks["lowercasegreeknormal"] = { first = 0x003B1, last = 0x003CA }
-blocks["lowercasegreekbold"] = { first = 0x1D6C2, last = 0x1D6DB }
-blocks["lowercasegreekitalic"] = { first = 0x1D6FC, last = 0x1D715 }
-blocks["lowercasegreekbolditalic"] = { first = 0x1D736, last = 0x1D74F }
-blocks["lowercasegreeksansserifbold"] = { first = 0x1D770, last = 0x1D789 }
-blocks["lowercasegreeksansserifbolditalic"] = { first = 0x1D7AA, last = 0x1D7C3 }
-
-blocks["digitsnormal"] = { first = 0x00030, last = 0x00039 }
-blocks["digitsbold"] = { first = 0x1D7CE, last = 0x1D7D8 }
-blocks["digitsdoublestruck"] = { first = 0x1D7D8, last = 0x1D7E2 }
-blocks["digitssansserifnormal"] = { first = 0x1D7E2, last = 0x1D7EC }
-blocks["digitssansserifbold"] = { first = 0x1D7EC, last = 0x1D805 }
-blocks["digitsmonospace"] = { first = 0x1D7F6, last = 0x1D80F }
-
-blocks["mathematicaloperators"] = { first = 0x02200, last = 0x022FF }
-blocks["miscellaneousmathematicalsymbolsa"] = { first = 0x027C0, last = 0x027EF }
-blocks["miscellaneousmathematicalsymbolsb"] = { first = 0x02980, last = 0x029FF }
-blocks["supplementalmathematicaloperators"] = { first = 0x02A00, last = 0x02AFF }
-blocks["letterlikesymbols"] = { first = 0x02100, last = 0x0214F }
-blocks["miscellaneoustechnical"] = { first = 0x02308, last = 0x0230B }
-blocks["geometricshapes"] = { first = 0x025A0, last = 0x025FF }
-blocks["miscellaneoussymbolsandarrows"] = { first = 0x02B30, last = 0x02B4C }
-blocks["mathematicalalphanumericsymbols"] = { first = 0x00400, last = 0x1D7FF }
-
-blocks["digitslatin"] = { first = 0x00030, last = 0x00039 }
-blocks["digitsarabicindic"] = { first = 0x00660, last = 0x00669 }
-blocks["digitsextendedarabicindic"] = { first = 0x006F0, last = 0x006F9 }
-------["digitsdevanagari"] = { first = 0x00966, last = 0x0096F }
-------["digitsbengali"] = { first = 0x009E6, last = 0x009EF }
-------["digitsgurmukhi"] = { first = 0x00A66, last = 0x00A6F }
-------["digitsgujarati"] = { first = 0x00AE6, last = 0x00AEF }
-------["digitsoriya"] = { first = 0x00B66, last = 0x00B6F }
-------["digitstamil"] = { first = 0x00030, last = 0x00039 } -- no zero
-------["digitstelugu"] = { first = 0x00C66, last = 0x00C6F }
-------["digitskannada"] = { first = 0x00CE6, last = 0x00CEF }
-------["digitsmalayalam"] = { first = 0x00D66, last = 0x00D6F }
-------["digitsthai"] = { first = 0x00E50, last = 0x00E59 }
-------["digitslao"] = { first = 0x00ED0, last = 0x00ED9 }
-------["digitstibetan"] = { first = 0x00F20, last = 0x00F29 }
-------["digitsmyanmar"] = { first = 0x01040, last = 0x01049 }
-------["digitsethiopic"] = { first = 0x01369, last = 0x01371 }
-------["digitskhmer"] = { first = 0x017E0, last = 0x017E9 }
-------["digitsmongolian"] = { first = 0x01810, last = 0x01809 }
-
-- operators : 0x02200
-- symbolsa : 0x02701
-- symbolsb : 0x02901
diff --git a/Master/texmf-dist/tex/context/base/math-ali.mkiv b/Master/texmf-dist/tex/context/base/math-ali.mkiv
index 6bfde57b6f3..bba55ba72c4 100644
--- a/Master/texmf-dist/tex/context/base/math-ali.mkiv
+++ b/Master/texmf-dist/tex/context/base/math-ali.mkiv
@@ -31,6 +31,8 @@
\newtoks\c_math_align_b
\newtoks\c_math_align_c
+\def\displayopenupvalue{.25\bodyfontsize}
+
\def\math_build_eqalign
{\scratchtoks\emptytoks
\dorecurse{\mathalignmentparameter\c!m}\math_build_eqalign_step
@@ -38,19 +40,25 @@
\def\math_build_eqalign_step
{\ifnum\recurselevel>\plusone
- %\appendtoks
- % \tabskip\mathalignmentparameter\c!distance\aligntab\tabskip\zeropoint
- %\to\scratchtoks
\scratchtoks\expandafter{\the\scratchtoks\tabskip\mathalignmentparameter\c!distance\aligntab\tabskip\zeropoint}%
\fi
\normalexpanded{\scratchtoks{\the\scratchtoks\the\c_math_align_a}}%
\dorecurse{\numexpr\mathalignmentparameter\c!n-\plusone\relax}
{\normalexpanded{\scratchtoks{\the\scratchtoks\the\c_math_align_b}}}}
-\def\math_math_in_eqalign#1{$\tabskip\zeropoint\everycr\emptytoks\displaystyle{{}#1{}}$}
-\def\math_text_in_eqalign#1{$\tabskip\zeropoint\everycr\emptytoks#1$}
+\def\math_math_in_eqalign#1%
+ {\startforceddisplaymath
+ \tabskip\zeropoint
+ \everycr\emptytoks
+ {{}#1{}}%
+ \stopforceddisplaymath}
-\def\displayopenupvalue{.25\bodyfontsize}
+\def\math_text_in_eqalign#1%
+ {\startimath
+ \tabskip\zeropoint
+ \everycr\emptytoks
+ #1%
+ \stopimath}
\def\eqalign#1% why no halign here, probably because of displaywidth
{\emptyhbox
@@ -58,7 +66,15 @@
\vcenter
{\math_openup\displayopenupvalue % was: \openup\jot
\mathsurround\zeropoint
- \ialign{\strut\hfil$\displaystyle{\alignmark\alignmark}$\aligntab$\displaystyle{{}\alignmark\alignmark{}}$\hfil\crcr#1\crcr}}%
+ \ialign{%
+ \strut
+ \hfil
+ \startforceddisplaymath{\alignmark\alignmark}\stopforceddisplaymath
+ \aligntab
+ \startforceddisplaymath{{}\alignmark\alignmark{}}\stopforceddisplaymath
+ \hfil\crcr
+ #1\crcr}%
+ }%
\mskip\thinmuskip}
% preamble is scanned for tabskips so we need the span to prevent an error message
@@ -257,7 +273,7 @@
%
-\def\numberedeqalign
+\unexpanded\def\numberedeqalign
{\doifelse{\formulaparameter\c!location}\v!left
\math_handle_eqalign_no_l_aligned
\math_handle_eqalign_no_r_aligned}
@@ -605,16 +621,27 @@
{\iffirstargument
\setupcurrentmathmatrix[#1]%
\fi
- \emptyhbox
+ % \emptyhbox % noted at 25-05-2014: what was that one doing here? it messed up spacing
\math_matrix_align_method_analyze
\mathmatrixleft
+ % new per 13-10-2014
+ \edef\p_strut{\mathmatrixparameter\c!strut}%
+ \ifx\p_strut\v!no
+ \let\m_matrix_strut\relax
+ \else
+ \let\m_matrix_strut\strut
+ \ifx\p_strut\v!yes\else
+ \spacing\p_strut
+ \fi
+ \fi
+ %
\mathmatrixbox\bgroup
\pushmacro\math_matrix_NC
\let\endmath\relax
\def\NC{\math_matrix_NC}%
\def\MC{\math_matrix_NC\ifmmode\else\startimath\let\endmath\stopimath\fi}%
\global\let\math_matrix_NC\math_matrix_NC_indeed
- \def\NR{\endmath\global\let\math_matrix_NC\math_matrix_NC_indeed\crcr}%
+ \def\NR{\endmath\global\let\math_matrix_NC\math_matrix_NC_indeed\m_matrix_strut \crcr}%
\normalbaselines
\mathsurround\zeropoint
\everycr\emptytoks
@@ -700,7 +727,7 @@
%D
%D \typebuffer \getbuffer
%D
-%D \definemathmatrix[bmatrix][left={\left[\mskip\thinmuskip},right={\mskip\thinmuskip\right]}]
+%D \definemathmatrix[bmatrix][left={\left[\mskip\thinmuskip},right={\mskip\thinmuskip\right]},strut=1.25]
%D
%D \startbuffer
%D \placeformula \startformula[-] \startbmatrix
@@ -1024,8 +1051,7 @@
\strc_formulas_place_number
\setbox\scratchbox\math_hbox to \displaywidth\bgroup
\mathinnerstrut
- $%
- \displaystyle
+ \startforceddisplaymath
\ifcase\mathraggedstatus\or\hfill\or\hfill\fi}
\def\math_box_llapped_math_no
@@ -1047,7 +1073,7 @@
\fi}
\unexpanded\def\stopmathbox
- {$%
+ {\stopforceddisplaymath
\ifcase\mathraggedstatus\or\or\hfill\or\hfill\fi
\egroup
\setbox0\hbox{\unhcopy\scratchbox}%
diff --git a/Master/texmf-dist/tex/context/base/math-arr.mkiv b/Master/texmf-dist/tex/context/base/math-arr.mkiv
index 6824c362e67..0e3a53f3219 100644
--- a/Master/texmf-dist/tex/context/base/math-arr.mkiv
+++ b/Master/texmf-dist/tex/context/base/math-arr.mkiv
@@ -63,7 +63,7 @@
\setvalue{\??matharrowsettings\v!big }{\def\m_math_arrows_extra{20}}
\setvalue{\??matharrowsettings\v!normal }{}
\setvalue{\??matharrowsettings }{}
-\setvalue{\??matharrowsettings\s!unknown}{\doifnumberelse\p_math_spacing{\let\m_math_arrows_extra\p_math_spacing}\donothing}
+\setvalue{\??matharrowsettings\s!unknown}{\doifelsenumber\p_math_spacing{\let\m_math_arrows_extra\p_math_spacing}\donothing}
\def\math_arrows_construct#1#2#3#4#5% hm, looks like we do a double mathrel (a bit cleaned up .. needs checking)
{\begingroup
diff --git a/Master/texmf-dist/tex/context/base/math-def.mkiv b/Master/texmf-dist/tex/context/base/math-def.mkiv
index 25098695902..0888081f065 100644
--- a/Master/texmf-dist/tex/context/base/math-def.mkiv
+++ b/Master/texmf-dist/tex/context/base/math-def.mkiv
@@ -30,6 +30,9 @@
\definemathcommand [arccos] [nolop] {\mfunctionlabeltext{arccos}}
\definemathcommand [arcsin] [nolop] {\mfunctionlabeltext{arcsin}}
\definemathcommand [arctan] [nolop] {\mfunctionlabeltext{arctan}}
+\definemathcommand [acos] [nolop] {\mfunctionlabeltext{acos}}
+\definemathcommand [asin] [nolop] {\mfunctionlabeltext{asin}}
+\definemathcommand [atan] [nolop] {\mfunctionlabeltext{atan}}
\definemathcommand [arg] [nolop] {\mfunctionlabeltext{arg}}
\definemathcommand [cosh] [nolop] {\mfunctionlabeltext{cosh}}
\definemathcommand [cos] [nolop] {\mfunctionlabeltext{cos}}
diff --git a/Master/texmf-dist/tex/context/base/math-dir.lua b/Master/texmf-dist/tex/context/base/math-dir.lua
index bcc5461e976..0f871beede2 100644
--- a/Master/texmf-dist/tex/context/base/math-dir.lua
+++ b/Master/texmf-dist/tex/context/base/math-dir.lua
@@ -33,7 +33,6 @@ local getid = nuts.getid
local getlist = nuts.getlist
local setfield = nuts.setfield
local getattr = nuts.getattr
-local setattr = nuts.setattr
local insert_node_before = nuts.insert_before
local insert_node_after = nuts.insert_after
@@ -163,4 +162,8 @@ function directions.setmath(n)
end
end
-commands.setmathdirection = directions.setmath
+interfaces.implement {
+ name = "setmathdirection",
+ actions = directions.setmath,
+ arguments = "integer"
+}
diff --git a/Master/texmf-dist/tex/context/base/math-fbk.lua b/Master/texmf-dist/tex/context/base/math-fbk.lua
index 70a8ae8d61c..76dd1ad9b1a 100644
--- a/Master/texmf-dist/tex/context/base/math-fbk.lua
+++ b/Master/texmf-dist/tex/context/base/math-fbk.lua
@@ -20,7 +20,6 @@ local virtualcharacters = { }
local identifiers = fonts.hashes.identifiers
local lastmathids = fonts.hashes.lastmathids
-local tounicode16 = fonts.mappings.tounicode16
-- we need a trick (todo): if we define scriptscript, script and text in
-- that order we could use their id's .. i.e. we could always add a font
@@ -190,12 +189,12 @@ virtualcharacters[0x207B] = function(data)
end
virtualcharacters[0x208A] = function(data)
- data.replacement = 0x2212
+ data.replacement = 0x002B
return raised(data,true)
end
virtualcharacters[0x208B] = function(data)
- data.replacement = 0x002B
+ data.replacement = 0x2212
return raised(data,true)
end
@@ -330,7 +329,7 @@ end
-- we could move the defs from math-act here
-local function accent_to_extensible(target,newchr,original,oldchr,height,depth,swap,offset)
+local function accent_to_extensible(target,newchr,original,oldchr,height,depth,swap,offset,unicode)
local characters = target.characters
local olddata = characters[oldchr]
-- brrr ... pagella has only next
@@ -350,6 +349,7 @@ local function accent_to_extensible(target,newchr,original,oldchr,height,depth,s
width = olddata.width,
height = height,
depth = depth,
+ unicode = unicode,
}
local glyphdata = newdata
local nextglyph = olddata.next
@@ -415,7 +415,7 @@ virtualcharacters[0x203E] = function(data) -- could be FE33E instead
height = target.parameters.xheight/4
depth = height
end
- return accent_to_extensible(target,0x203E,data.original,0x0305,height,depth)
+ return accent_to_extensible(target,0x203E,data.original,0x0305,height,depth,nil,nil,0x203E)
end
virtualcharacters[0xFE33E] = virtualcharacters[0x203E] -- convenient
@@ -426,37 +426,37 @@ local function smashed(data,unicode,swap,private)
local original = data.original
local chardata = target.characters[unicode]
if chardata and chardata.height > target.parameters.xheight then
- return accent_to_extensible(target,private,original,unicode,0,0,swap)
+ return accent_to_extensible(target,private,original,unicode,0,0,swap,nil,unicode)
else
return original.characters[unicode]
end
end
-addextra(0xFE3DE, { description="EXTENSIBLE OF 0x03DE", unicodeslot=0xFE3DE, mathextensible = "r", mathstretch = "h" } )
-addextra(0xFE3DC, { description="EXTENSIBLE OF 0x03DC", unicodeslot=0xFE3DC, mathextensible = "r", mathstretch = "h" } )
-addextra(0xFE3B4, { description="EXTENSIBLE OF 0x03B4", unicodeslot=0xFE3B4, mathextensible = "r", mathstretch = "h" } )
+addextra(0xFE3DE, { description="EXTENSIBLE OF 0x03DE", unicodeslot=0xFE3DE, mathextensible = "r", mathstretch = "h", mathclass = "topaccent" } )
+addextra(0xFE3DC, { description="EXTENSIBLE OF 0x03DC", unicodeslot=0xFE3DC, mathextensible = "r", mathstretch = "h", mathclass = "topaccent" } )
+addextra(0xFE3B4, { description="EXTENSIBLE OF 0x03B4", unicodeslot=0xFE3B4, mathextensible = "r", mathstretch = "h", mathclass = "topaccent" } )
virtualcharacters[0xFE3DE] = function(data) return smashed(data,0x23DE,0x23DF,0xFE3DE) end
virtualcharacters[0xFE3DC] = function(data) return smashed(data,0x23DC,0x23DD,0xFE3DC) end
virtualcharacters[0xFE3B4] = function(data) return smashed(data,0x23B4,0x23B5,0xFE3B4) end
-addextra(0xFE3DF, { description="EXTENSIBLE OF 0x03DF", unicodeslot=0xFE3DF, mathextensible = "r", mathstretch = "h" } )
-addextra(0xFE3DD, { description="EXTENSIBLE OF 0x03DD", unicodeslot=0xFE3DD, mathextensible = "r", mathstretch = "h" } )
-addextra(0xFE3B5, { description="EXTENSIBLE OF 0x03B5", unicodeslot=0xFE3B5, mathextensible = "r", mathstretch = "h" } )
+addextra(0xFE3DF, { description="EXTENSIBLE OF 0x03DF", unicodeslot=0xFE3DF, mathextensible = "r", mathstretch = "h", mathclass = "botaccent" } )
+addextra(0xFE3DD, { description="EXTENSIBLE OF 0x03DD", unicodeslot=0xFE3DD, mathextensible = "r", mathstretch = "h", mathclass = "botaccent" } )
+addextra(0xFE3B5, { description="EXTENSIBLE OF 0x03B5", unicodeslot=0xFE3B5, mathextensible = "r", mathstretch = "h", mathclass = "botaccent" } )
-virtualcharacters[0xFE3DF] = function(data) return data.target.characters[0x23DF] end
-virtualcharacters[0xFE3DD] = function(data) return data.target.characters[0x23DD] end
-virtualcharacters[0xFE3B5] = function(data) return data.target.characters[0x23B5] end
+virtualcharacters[0xFE3DF] = function(data) local c = data.target.characters[0x23DF] if c then c.unicode = 0x23DF return c end end
+virtualcharacters[0xFE3DD] = function(data) local c = data.target.characters[0x23DD] if c then c.unicode = 0x23DD return c end end
+virtualcharacters[0xFE3B5] = function(data) local c = data.target.characters[0x23B5] if c then c.unicode = 0x23B5 return c end end
-- todo: add some more .. numbers might change
-addextra(0xFE302, { description="EXTENSIBLE OF 0x0302", unicodeslot=0xFE302, mathstretch = "h" } )
-addextra(0xFE303, { description="EXTENSIBLE OF 0x0303", unicodeslot=0xFE303, mathstretch = "h" } )
+addextra(0xFE302, { description="EXTENSIBLE OF 0x0302", unicodeslot=0xFE302, mathstretch = "h", mathclass = "topaccent" } )
+addextra(0xFE303, { description="EXTENSIBLE OF 0x0303", unicodeslot=0xFE303, mathstretch = "h", mathclass = "topaccent" } )
local function smashed(data,unicode,private)
local target = data.target
local height = target.parameters.xheight / 2
- local c, done = accent_to_extensible(target,private,data.original,unicode,height,0,nil,-height)
+ local c, done = accent_to_extensible(target,private,data.original,unicode,height,0,nil,-height,unicode)
if done then
c.top_accent = nil -- or maybe also all the others
end
@@ -467,15 +467,21 @@ virtualcharacters[0xFE302] = function(data) return smashed(data,0x0302,0xFE302)
virtualcharacters[0xFE303] = function(data) return smashed(data,0x0303,0xFE303) end
-- another crazy hack .. doesn't work as we define scrscr first .. we now have smaller
--- primes so we have smaller primes for the moment, big ones will become an option
+-- primes so we have smaller primes for the moment, big ones will become an option ..
+-- these primes in fonts are a real mess .. kind of a dead end, so don't wonder about
+-- the values below
+
+-- todo: check tounicodes
local function smashed(data,unicode,optional)
local oldchar = data.characters[unicode]
if oldchar then
- local height = 1.2 * data.target.parameters.xheight
+ local xheight = data.target.parameters.xheight
+ local height = 1.2 * xheight
+ local shift = oldchar.height - height
local newchar = {
commands = {
- { "down", oldchar.height - height },
+ { "down", shift },
{ "char", unicode },
},
height = height,
@@ -487,6 +493,30 @@ local function smashed(data,unicode,optional)
end
end
+-- -- relocate all but less flexible so not used .. instead some noad hackery plus
+-- -- the above
+--
+-- local function smashed(data,unicode,optional)
+-- local oldchar = data.characters[unicode]
+-- if oldchar then
+-- local xheight = data.target.parameters.xheight
+-- local height = oldchar.height
+-- local shift = oldchar.height < 1.5*xheight and -(1.8*xheight-height) or 0
+-- local newchar = {
+-- commands = {
+-- { "down", shift },
+-- { "char", unicode },
+-- },
+-- unicode = unicode,
+-- height = height,
+-- width = oldchar.width,
+-- }
+-- return newchar
+-- elseif not optional then
+-- report_fallbacks("missing %U prime in font %a",unicode,data.target.properties.fullname)
+-- end
+-- end
+
addextra(0xFE932, { description="SMASHED PRIME 0x02032", unicodeslot=0xFE932 } )
addextra(0xFE933, { description="SMASHED PRIME 0x02033", unicodeslot=0xFE933 } )
addextra(0xFE934, { description="SMASHED PRIME 0x02034", unicodeslot=0xFE934 } )
@@ -520,7 +550,7 @@ local function actuarian(data)
-- todo: add alttext
-- compromise: lm has large hooks e.g. \actuarial{a}
width = basewidth + 4 * linewidth,
- tounicode = tounicode16(0x20E7),
+ unicode = 0x20E7,
commands = {
{ "right", 2 * linewidth },
{ "down", - baseheight - 3 * linewidth },
diff --git a/Master/texmf-dist/tex/context/base/math-frc.lua b/Master/texmf-dist/tex/context/base/math-frc.lua
index 4f531a5307a..639edc94ba3 100644
--- a/Master/texmf-dist/tex/context/base/math-frc.lua
+++ b/Master/texmf-dist/tex/context/base/math-frc.lua
@@ -25,13 +25,13 @@ table.setmetatableindex(resolved, function(t,k)
return v
end)
-local normalatop = context.normalatop
-local normalover = context.normalover
+local ctx_normalatop = context.normalatop
+local ctx_normalover = context.normalover
-function commands.math_frac(how,left,right,width)
- if how == v_no then
+local function mathfraction(how,left,right,width) -- of course we could use the scanners directly here which
+ if how == v_no then -- is faster but also less abstract ... maybe some day
if left == 0x002E and right == 0x002E then
- normalatop()
+ ctx_normalatop()
else
context("\\atopwithdelims%s%s",resolved[left],resolved[right])
end
@@ -43,9 +43,15 @@ function commands.math_frac(how,left,right,width)
end
else -- v_auto
if left == 0x002E and right == 0x002E then
- normalover()
+ ctx_normalover()
else
context("\\overwithdelims%s%s",resolved[left],resolved[right])
end
end
end
+
+interfaces.implement {
+ name = "mathfraction",
+ actions = mathfraction,
+ arguments = { "string", "number", "number", "dimen" }
+}
diff --git a/Master/texmf-dist/tex/context/base/math-frc.mkiv b/Master/texmf-dist/tex/context/base/math-frc.mkiv
index 7032c665b08..cbe342b6608 100644
--- a/Master/texmf-dist/tex/context/base/math-frc.mkiv
+++ b/Master/texmf-dist/tex/context/base/math-frc.mkiv
@@ -15,7 +15,14 @@
\unprotect
-%D todo: struts ... depends on demand
+%D I need to check it all again as there was a bug in luatex with dimensions that could
+%D resulted in side effects that made me mess with spacing.
+
+\unexpanded\def\topstrut{\vrule\s!width\zeropoint\s!height\strutht\s!depth\zeropoint\relax}
+\unexpanded\def\botstrut{\vrule\s!width\zeropoint\s!height\zeropoint\s!depth\strutdp\relax}
+
+\unexpanded\def\mathtopstrut{\setbox\scratchbox\mathstylehbox{(}\vrule\s!width\zeropoint\s!height\ht\scratchbox\s!depth\zeropoint\relax}
+\unexpanded\def\mathbotstrut{\setbox\scratchbox\mathstylehbox{(}\vrule\s!width\zeropoint\s!height\zeropoint\s!depth\dp\scratchbox\relax}
%D This module is reimplemented in \MKIV\ style.
@@ -106,6 +113,7 @@
\c!rulethickness=.25\exheight,
\c!left=0x2E,
\c!right=0x2E,
+ \c!strut=\v!yes,
\c!topdistance=,
\c!bottomdistance=,
\c!rule=\v!auto]
@@ -122,6 +130,8 @@
\math_fraction_set_distance
\to \everymathematics
+% why only displaystyle .. a bit weak
+
\unexpanded\def\math_fraction_set_distance_top
{\Umathfractionnumup \displaystyle\m_math_fraction_distance_top
\relax}
@@ -157,13 +167,43 @@
% So far for control.
+\installcorenamespace{mathfractionstrut}
+
+\setvalue{\??mathfractionstrut\v!yes}%
+ {\let\m_fractions_strut_top\mathstrut
+ \let\m_fractions_strut_bot\mathstrut}
+
+\setvalue{\??mathfractionstrut\v!math}%
+ {\let\m_fractions_strut_top\mathstrut
+ \let\m_fractions_strut_bot\mathstrut}
+
+\setvalue{\??mathfractionstrut\v!no}%
+ {\let\m_fractions_strut_top\relax
+ \let\m_fractions_strut_bot\relax}
+
+\setvalue{\??mathfractionstrut\v!tight}%
+ {\let\m_fractions_strut_top\mathbotstrut % indeed swapped name
+ \let\m_fractions_strut_bot\mathtopstrut} % indeed swapped name
+
+\let\m_fractions_strut_top\relax
+\let\m_fractions_strut_bot\relax
+
\newdimen\d_math_fraction_margin
\unexpanded\def\math_frac#1%
{\begingroup
\edef\currentmathfraction{#1}%
+ %
\d_math_fraction_margin\mathfractionparameter\c!margin
+ %
\edef\p_math_fractions_color{\mathfractionparameter\c!color}%
+ %
+ \edef\p_math_fractions_strut{\mathfractionparameter\c!strut}%
+ \csname
+ \??mathfractionstrut
+ \ifcsname\??mathfractionstrut\p_math_fractions_strut\endcsname\p_math_fractions_strut\else\v!no\fi
+ \endcsname
+ %
\ifx\p_math_fractions_color\empty
\expandafter\math_frac_normal
\else
@@ -181,18 +221,17 @@
% we use utfchar anyway so we can as well do all at the lua end
\def\math_frac_command
- {\ctxcommand{math_frac(%
- "\mathfractionparameter\c!rule",%
- \number\mathfractionparameter\c!left,%
- \number\mathfractionparameter\c!right,%
- \number\dimexpr\mathfractionparameter\c!rulethickness%
- )}}
-
-% Having a \withmarginornot{#1}{#2} makes not much sense nor do
-% 4 tests or 4 redundant kerns (longer node lists plus possible
-% interference). A split in normal and margin also makes testing
-% easier. When left and right margins are needed we might merge
-% the variants again. After all, these are not real installers.
+ {\clf_mathfraction
+ {\mathfractionparameter\c!rule}%
+ \mathfractionparameter\c!left\space
+ \mathfractionparameter\c!right\space
+ \dimexpr\mathfractionparameter\c!rulethickness\relax
+ \relax}
+
+% Having a \withmarginornot{#1}{#2} makes not much sense nor do 4 tests or 4 redundant
+% kerns (longer node lists plus possible interference). A split in normal and margin
+% also makes testing easier. When left and right margins are needed we might merge the
+% variants again. After all, these are not real installers.
\setvalue{\??mathfractionalternative\v!inner}%
{\ifcase\d_math_fraction_margin
@@ -201,24 +240,6 @@
\expandafter\math_fraction_inner_margin
\fi}
-\def\math_fraction_inner_normal#1#2%
- {\Ustack{%
- {\usemathstyleparameter\mathfractionparameter{#1}}% we should store this one
- \math_frac_command
- {\usemathstyleparameter\mathfractionparameter{#2}}% and reuse it here
- }\endgroup}
-
-\def\math_fraction_inner_margin#1#2%
- {\Ustack{%
- {\kern\d_math_fraction_margin
- \usemathstyleparameter\mathfractionparameter{#1}% we should store this one
- \kern\d_math_fraction_margin}%
- \math_frac_command
- {\kern\d_math_fraction_margin
- \usemathstyleparameter\mathfractionparameter{#2}% and reuse it here
- \kern\d_math_fraction_margin}%
- }\endgroup}
-
\setvalue{\??mathfractionalternative\v!outer}%
{\ifcase\d_math_fraction_margin
\expandafter\math_fraction_outer_normal
@@ -226,21 +247,84 @@
\expandafter\math_fraction_outer_margin
\fi}
+\setvalue{\??mathfractionalternative\v!both}%
+ {\ifcase\d_math_fraction_margin
+ \expandafter\math_fraction_both_normal
+ \else
+ \expandafter\math_fraction_both_margin
+ \fi}
+
+% todo: store first state and reuse second time
+
+\def\math_fraction_inner_normal#1#2%
+ {\Ustack{%
+ {%
+ {\usemathstyleparameter\mathfractionparameter{\m_fractions_strut_top#1}}%
+ \math_frac_command
+ {\usemathstyleparameter\mathfractionparameter{\m_fractions_strut_bot#2}}%
+ }%
+ }\endgroup}
+
\def\math_fraction_outer_normal#1#2%
{\Ustack{%
\usemathstyleparameter\mathfractionparameter
- {{#1}\math_frac_command{#2}}%
+ {%
+ {\m_fractions_strut_top#1}%
+ \math_frac_command
+ {\m_fractions_strut_bot#2}%
+ }%
+ }\endgroup}
+
+\def\math_fraction_both_normal#1#2%
+ {\Ustack{%
+ \usemathstyleparameter\mathfractionparameter
+ {%
+ {\usemathstyleparameter\mathfractionparameter\m_fractions_strut_top#1}%
+ \math_frac_command
+ {\usemathstyleparameter\mathfractionparameter\m_fractions_strut_bot#2}%
+ }%
+ }\endgroup}
+
+\def\math_fraction_inner_margin#1#2%
+ {\Ustack{%
+ {%
+ {\kern\d_math_fraction_margin
+ \usemathstyleparameter\mathfractionparameter{\m_fractions_strut_top#1}%
+ \kern\d_math_fraction_margin}%
+ \math_frac_command
+ {\kern\d_math_fraction_margin
+ \usemathstyleparameter\mathfractionparameter{\m_fractions_strut_bot#2}%
+ \kern\d_math_fraction_margin}%
+ }%
}\endgroup}
\def\math_fraction_outer_margin#1#2%
{\Ustack{%
\usemathstyleparameter\mathfractionparameter
- {{\kern\d_math_fraction_margin#1\kern\d_math_fraction_margin}%
- \math_frac_command
- {\kern\d_math_fraction_margin#2\kern\d_math_fraction_margin}}%
+ {%
+ {\kern\d_math_fraction_margin
+ \m_fractions_strut_top#1%
+ \kern\d_math_fraction_margin}%
+ \math_frac_command
+ {\kern\d_math_fraction_margin
+ \m_fractions_strut_bot#2%
+ \kern\d_math_fraction_margin}%
+ }%
}\endgroup}
-\definemathfraction[frac][\c!mathstyle=]
+\def\math_fraction_both_margin#1#2%
+ {\Ustack{%
+ \usemathstyleparameter\mathfractionparameter
+ {%
+ {\kern\d_math_fraction_margin
+ \usemathstyleparameter\mathfractionparameter\m_fractions_strut_top#1%
+ \kern\d_math_fraction_margin}%
+ \math_frac_command
+ {\kern\d_math_fraction_margin
+ \usemathstyleparameter\mathfractionparameter\m_fractions_strut_bot#2%
+ \kern\d_math_fraction_margin}%
+ }%
+ }\endgroup}
\unexpanded\def\xfrac {\begingroup\let\xfrac\xxfrac\math_frac_alternative\scriptstyle}
\unexpanded\def\xxfrac{\begingroup \math_frac_alternative\scriptscriptstyle}
@@ -251,6 +335,40 @@
{\begingroup
\math_frac_alternative\scriptscriptstyle{#1}{\raise.25\exheight\hbox{$\scriptscriptstyle#2$}}}
+%D Spacing:
+
+\unexpanded\def\nomathfractiongaps {\normalexpanded{\math_no_fraction_gaps \triggermathstyle\mathstyle}} % maybe collect settings
+\unexpanded\def\overlaymathfractiongaps{\normalexpanded{\math_overlay_fraction_gaps\triggermathstyle\mathstyle}} % maybe collect settings
+
+\unexpanded\def\math_no_fraction_gaps#1%
+ {\Umathfractionnumup #1\zeropoint
+ \Umathfractiondenomdown#1\zeropoint}
+
+\unexpanded\def\math_overlay_fraction_gaps#1%
+ {\Umathfractionnumup #1\zeropoint
+ \Umathfractionnumvgap #1\zeropoint
+ %Umathfractionrule #1\zeropoint
+ \Umathfractiondenomvgap#1\zeropoint
+ \Umathfractiondenomdown#1\zeropoint}
+
+\installcorenamespace{mathfractiondistance}
+
+\letvalue{\??mathfractiondistance\v!none }\nomathfractiongaps
+\letvalue{\??mathfractiondistance\v!no }\nomathfractiongaps
+\letvalue{\??mathfractiondistance\v!overlay}\overlaymathfractiongaps
+
+\setupmathfractions
+ [\c!distance=\v!none]
+
+\appendtoks
+ \edef\p_distance{\rootmathfractionparameter\c!distance}%
+ \ifx\p_distance\empty\else
+ \ifcsname\??mathfractiondistance\p_distance\endcsname
+ \csname\??mathfractiondistance\p_distance\endcsname
+ \fi
+ \fi
+\to \everymathematics
+
%D \macros
%D {dfrac, tfrac, frac, dbinom, tbinom, binom}
%D
@@ -277,9 +395,36 @@
% \unexpanded\def\dfrac #1#2{{\displaystyle {{#1}\normalover {#2}}}}
% \unexpanded\def\tfrac #1#2{{\textstyle {{#1}\normalover {#2}}}}
-\definemathfraction[dfrac][\c!alternative=\v!outer,\c!mathstyle=\s!display]
-\definemathfraction[tfrac][\c!alternative=\v!outer,\c!mathstyle=\s!text]
-\definemathfraction[sfrac][\c!alternative=\v!outer,\c!mathstyle=\s!script]
+\definemathfraction[i:frac] [\c!alternative=\v!inner,\c!mathstyle=] % was script and then small but nothing needed
+\definemathfraction[i:tfrac][\c!alternative=\v!inner,\c!mathstyle=\s!text] % was script (before luatex fix)
+\definemathfraction[i:sfrac][\c!alternative=\v!inner,\c!mathstyle=\s!scriptscript]
+\definemathfraction[i:dfrac][\c!alternative=\v!inner,\c!mathstyle=\s!display]
+
+\definemathfraction[d:frac] [\c!alternative=\v!inner,\c!mathstyle=\s!cramped] % was cramped,text
+\definemathfraction[d:tfrac][\c!alternative=\v!both ,\c!mathstyle={\s!cramped,\s!text}] % was cramped,script (before luatex fix)
+\definemathfraction[d:sfrac][\c!alternative=\v!both ,\c!mathstyle={\s!cramped,\s!scriptscript}]
+\definemathfraction[d:dfrac][\c!alternative=\v!inner,\c!mathstyle=\s!display]
+
+%D \unexpanded\def\ShowMathFractions#1#2%
+%D {\dontleavehmode
+%D \begingroup
+%D \showmathstruts
+%D \mathematics{x+\tfrac{#1}{#2}+1+\frac{#1}{#2}+2+\sfrac{#1}{#2}+g}%
+%D \endgroup}
+%D
+%D The default \type {tfrac}, \type {frac} and \type \sfrac} look like this:
+%D
+%D \blank
+%D \ShowMathFractions{a}{a}\par
+%D \ShowMathFractions{1}{x}\par
+%D \ShowMathFractions{a}{b}\par
+%D \ShowMathFractions{1}{b}\par
+%D \blank
+
+\unexpanded\def\frac {\csname\inlineordisplaymath id:frac\endcsname}
+\unexpanded\def\tfrac{\csname\inlineordisplaymath id:tfrac\endcsname}
+\unexpanded\def\sfrac{\csname\inlineordisplaymath id:sfrac\endcsname}
+\unexpanded\def\dfrac{\csname\inlineordisplaymath id:dfrac\endcsname}
% \definemathfraction[ddfrac][\c!mathstyle=\s!display]
% \definemathfraction[ttfrac][\c!mathstyle=\s!text]
@@ -319,7 +464,7 @@
%D \getbuffer
\unexpanded\def\cfrac
- {\doifnextoptionalcselse\math_cfrac_yes\math_cfrac_nop}
+ {\doifelsenextoptionalcs\math_cfrac_yes\math_cfrac_nop}
\def\math_cfrac_nop {\math_cfrac_indeed[cc]}
\def\math_cfrac_yes[#1]{\math_cfrac_indeed[#1cc]}
@@ -364,6 +509,11 @@
\unexpanded\def\splitdfrac#1#2%
{{\displaystyle{{ #1\quad\hfill}\normalabove\zeropoint{ \hfill\quad\mathstrut#2}}}}
+%D For testing:
+
+% \unexpanded\def\ShowMathFractions#1#2%
+% {\mathematics{x+\tfrac{#1}{#2}+1+\frac{#1}{#2}+2+\sfrac{#1}{#2}+g}}
+
\protect \endinput
% I have no clue what \mthfrac and \mthsqrt are supposed to do but
diff --git a/Master/texmf-dist/tex/context/base/math-ini.lua b/Master/texmf-dist/tex/context/base/math-ini.lua
index 9772ce5389d..88159e10746 100644
--- a/Master/texmf-dist/tex/context/base/math-ini.lua
+++ b/Master/texmf-dist/tex/context/base/math-ini.lua
@@ -18,30 +18,33 @@ if not modules then modules = { } end modules ['math-ini'] = {
local formatters, find = string.formatters, string.find
local utfchar, utfbyte, utflength = utf.char, utf.byte, utf.length
local floor = math.floor
+local toboolean = toboolean
-local context = context
-local commands = commands
+local context = context
+local commands = commands
+local implement = interfaces.implement
-local context_sprint = context.sprint
------ context_fprint = context.fprint -- a bit inefficient
+local context_sprint = context.sprint
+----- context_fprint = context.fprint -- a bit inefficient
+local ctx_doifelsesomething = commands.doifelsesomething
-local trace_defining = false trackers.register("math.defining", function(v) trace_defining = v end)
+local trace_defining = false trackers.register("math.defining", function(v) trace_defining = v end)
-local report_math = logs.reporter("mathematics","initializing")
+local report_math = logs.reporter("mathematics","initializing")
-mathematics = mathematics or { }
-local mathematics = mathematics
+mathematics = mathematics or { }
+local mathematics = mathematics
-mathematics.extrabase = 0xFE000 -- here we push some virtuals
-mathematics.privatebase = 0xFF000 -- here we push the ex
+mathematics.extrabase = 0xFE000 -- here we push some virtuals
+mathematics.privatebase = 0xFF000 -- here we push the ex
-local unsetvalue = attributes.unsetvalue
-local allocate = utilities.storage.allocate
-local chardata = characters.data
+local unsetvalue = attributes.unsetvalue
+local allocate = utilities.storage.allocate
+local chardata = characters.data
-local texsetattribute = tex.setattribute
-local setmathcode = tex.setmathcode
-local setdelcode = tex.setdelcode
+local texsetattribute = tex.setattribute
+local setmathcode = tex.setmathcode
+local setdelcode = tex.setdelcode
local families = allocate {
mr = 0,
@@ -464,7 +467,7 @@ end
local function utfmathfiller(chr, default)
local cd = somechar[chr]
- local cmd = cd and (cd.mathfiller or cd.mathname)
+ local cmd = cd and cd.mathfiller -- or cd.mathname
return cmd or default or ""
end
@@ -476,20 +479,72 @@ mathematics.utfmathaccent = utfmathaccent
-- interfaced
-function commands.utfmathclass (...) context(utfmathclass (...)) end
-function commands.utfmathstretch(...) context(utfmathstretch(...)) end
-function commands.utfmathcommand(...) context(utfmathcommand(...)) end
-function commands.utfmathfiller (...) context(utfmathfiller (...)) end
+implement {
+ name = "utfmathclass",
+ actions = { utfmathclass, context },
+ arguments = "string"
+}
-function commands.doifelseutfmathaccent(chr,asked)
- commands.doifelse(utfmathaccent(chr,nil,asked))
-end
+implement {
+ name = "utfmathstretch",
+ actions = { utfmathstretch, context },
+ arguments = "string"
+}
+
+implement {
+ name = "utfmathcommand",
+ actions = { utfmathcommand, context },
+ arguments = "string"
+}
+
+implement {
+ name = "utfmathfiller",
+ actions = { utfmathfiller, context },
+ arguments = "string"
+}
-function commands.utfmathcommandabove(asked) context(utfmathcommand(asked,nil,"topaccent","over" )) end
-function commands.utfmathcommandbelow(asked) context(utfmathcommand(asked,nil,"botaccent","under")) end
+implement {
+ name = "utfmathcommandabove",
+ actions = { utfmathcommand, context },
+ arguments = { "string", false, "'topaccent'","'over'" }
+}
-function commands.doifelseutfmathabove(chr) commands.doifelse(utfmathaccent(chr,nil,"topaccent","over" )) end
-function commands.doifelseutfmathbelow(chr) commands.doifelse(utfmathaccent(chr,nil,"botaccent","under")) end
+implement {
+ name = "utfmathcommandbelow",
+ actions = { utfmathcommand, context },
+ arguments = { "string", false, "'botaccent'","'under'" }
+}
+implement {
+ name = "utfmathcommandfiller",
+ actions = { utfmathfiller, context },
+ arguments = "string"
+}
+
+-- todo: make this a helper:
+
+implement {
+ name = "doifelseutfmathabove",
+ actions = { utfmathaccent, ctx_doifelsesomething },
+ arguments = { "string", false, "'topaccent'", "'over'" }
+}
+
+implement {
+ name = "doifelseutfmathbelow",
+ actions = { utfmathaccent, ctx_doifelsesomething },
+ arguments = { "string", false, "'botaccent'", "'under'" }
+}
+
+implement {
+ name = "doifelseutfmathaccent",
+ actions = { utfmathaccent, ctx_doifelsesomething },
+ arguments = "string",
+}
+
+implement {
+ name = "doifelseutfmathfiller",
+ actions = { utfmathfiller, ctx_doifelsesomething },
+ arguments = "string",
+}
-- helpers
--
@@ -599,30 +654,34 @@ local noffunctions = 1000 -- offset
categories.functions = functions
-function commands.taggedmathfunction(tag,label,apply)
- local delta = apply and 1000 or 0
- if label then
- local n = functions[tag]
- if not n then
- noffunctions = noffunctions + 1
- functions[noffunctions] = tag
- functions[tag] = noffunctions
- texsetattribute(a_mathcategory,noffunctions + delta)
+implement {
+ name = "taggedmathfunction",
+ arguments = { "string", "string", "string" },
+ actions = function(tag,label,apply)
+ local delta = toboolean(apply) and 1000 or 0
+ if toboolean(label) then
+ local n = functions[tag]
+ if not n then
+ noffunctions = noffunctions + 1
+ functions[noffunctions] = tag
+ functions[tag] = noffunctions
+ texsetattribute(a_mathcategory,noffunctions + delta)
+ else
+ texsetattribute(a_mathcategory,n + delta)
+ end
+ context.mathlabeltext(tag)
else
- texsetattribute(a_mathcategory,n + delta)
+ texsetattribute(a_mathcategory,1000 + delta)
+ context(tag)
end
- context.mathlabeltext(tag)
- else
- texsetattribute(a_mathcategory,1000 + delta)
- context(tag)
end
-end
+}
--
local list
-function commands.resetmathattributes()
+function mathematics.resetattributes()
if not list then
list = { }
for k, v in next, attributes.numbers do
@@ -635,3 +694,16 @@ function commands.resetmathattributes()
texsetattribute(list[i],unsetvalue)
end
end
+
+implement {
+ name = "resetmathattributes",
+ actions = mathematics.resetattributes
+}
+
+-- weird to do this here but it's a side affect of math anyway
+
+interfaces.implement {
+ name = "enableasciimode",
+ onlyonce = true,
+ actions = resolvers.macros.enablecomment,
+}
diff --git a/Master/texmf-dist/tex/context/base/math-ini.mkiv b/Master/texmf-dist/tex/context/base/math-ini.mkiv
index adf252d9526..2d6090c03b9 100644
--- a/Master/texmf-dist/tex/context/base/math-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/math-ini.mkiv
@@ -13,6 +13,18 @@
\writestatus{loading}{ConTeXt Math Macros / Initializations}
+% Todo in luatex maincontrol.w: also accept a number here:
+%
+% case set_math_param_cmd:
+% p = cur_chr;
+% get_token();
+% if (cur_cmd != math_style_cmd) {
+%
+% plus two new math styles: larger/smaller
+%
+% \unexpanded\def\Umathshow#1%
+% {\hbox{\infofont(\string#1:\the#1\textstyle,\the#1\scriptstyle,\the#1\scriptscriptstyle)}}
+
%D This module provides namespaces for math fonts, thereby permitting mixed usage of
%D math fonts. Although not strictly needed, we also provide a family name mapping
%D mechanism as used in the (original) AMS math definition files, but here these
@@ -26,6 +38,15 @@
%D restore a changed mathstyle so best avoid that one. However, there are cases where
%D we really need to use such grouping.
+% Weird, these fail, maybe amp is solved in a later state from char noads (needs a
+% fix in luatex):
+%
+% $\char"26$
+% $\a$
+% $\string&$
+
+% mathop applied to characters centers it vertically
+
\unprotect
%D We move these definitions into the format:
@@ -80,7 +101,35 @@
\setnewconstant\defaultmathfamily \zerocount % 255
-\unexpanded\def\resetmathattributes{\ctxcommand{resetmathattributes()}}
+\unexpanded\def\resetmathattributes{\clf_resetmathattributes}
+
+% handy
+
+\newconditional\indisplaymath
+
+\appendtoks
+ \setfalse\indisplaymath
+\to \everymath
+
+\appendtoks
+ \settrue\indisplaymath
+\to \everydisplay
+
+\def\inlineordisplaymath{\ifconditional\indisplaymath\expandafter\secondoftwoarguments\else\expandafter\firstoftwoarguments\fi}
+
+\unexpanded\def\forcedisplaymath
+ {\ifmmode
+ \displaystyle
+ \settrue\indisplaymath
+ \fi}
+
+\unexpanded\def\startforceddisplaymath
+ {\startimath
+ \displaystyle
+ \settrue\indisplaymath}
+
+\unexpanded\def\stopforceddisplaymath
+ {\stopimath}
% \unexpanded\def\rawmathcharacter#1% slow but only for tracing
% {\begingroup
@@ -94,9 +143,9 @@
\unexpanded\def\rawmathematics#1% slow but only for tracing
{\begingroup
\ifmmode
- \resetmathattributes#1%
+ \clf_resetmathattributes#1%
\else
- \startimath\resetmathattributes#1\stopimath
+ \startimath\clf_resetmathattributes#1\stopimath
\fi
\endgroup}
@@ -117,7 +166,7 @@
\installswitchcommandhandler \??mathematics {mathematics} \??mathematics
\unexpanded\def\startmathematics % no grouping, if ever then also an optional second
- {\doifnextoptionalcselse\math_mathematics_start_yes\math_mathematics_start_nop}
+ {\doifelsenextoptionalcs\math_mathematics_start_yes\math_mathematics_start_nop}
\unexpanded\def\math_mathematics_start_yes[#1]%
{\pushmacro\currentmathematics
@@ -143,14 +192,14 @@
% these commands are semi-public but should not be used directly (lua names wil change)
-\unexpanded\def\math_set_attribute #1#2{\ifmmode\ctxcommand{setmathattribute("#1","#2")}\fi}
-\unexpanded\def\math_set_alphabet #1{\ifmmode\ctxcommand{setmathalphabet("#1")}\fi}
-\unexpanded\def\math_set_font_style #1{\ifmmode\ctxcommand{setmathstyle("#1")}\fi}
-\unexpanded\def\math_set_font_alternate#1{\ifmmode\ctxcommand{setmathalternate(\number\defaultmathfamily,"#1")}\fi}
+\unexpanded\def\math_set_attribute #1#2{\ifmmode\clf_setmathattribute{#1}{#2}\fi}
+\unexpanded\def\math_set_alphabet #1{\ifmmode\clf_setmathalphabet{#1}\fi}
+\unexpanded\def\math_set_font_style #1{\ifmmode\clf_setmathstyle{#1}\fi}
+\unexpanded\def\math_set_font_alternate#1{\ifmmode\clf_setmathalternate\defaultmathfamily{#1}\fi}
\installcorenamespace{mathstylealternate} % might become a setuphandler
-\unexpanded\def\math_set_font_style_alterternate#1%
+\unexpanded\def\math_set_font_style_alternate#1%
{\ifcsname\??mathstylealternate\fontclass:#1\endcsname
\expandafter\math_set_font_alternate\csname\??mathstylealternate\fontclass:#1\endcsname
\else\ifcsname\??mathstylealternate#1\endcsname
@@ -169,31 +218,31 @@
\unexpanded\def\mathaltcal{\math_set_font_alternate{cal}\cal} % ss01 in xits
-\let\setmathattribute \math_set_attribute
-\let\setmathalphabet \math_set_alphabet
-\let\setmathfontstyle \math_set_font_style
-\let\setmathfontalternate \math_set_font_alternate
-\let\setmathfontstylealterternate\math_set_font_style_alterternate
+\let\setmathattribute \math_set_attribute
+\let\setmathalphabet \math_set_alphabet
+\let\setmathfontstyle \math_set_font_style
+\let\setmathfontalternate \math_set_font_alternate
+\let\setmathfontstylealternate\math_set_font_style_alternate
-\let\mathalternate \math_set_font_alternate % obsolete
+\let\mathalternate \math_set_font_alternate % obsolete
-\unexpanded\def\mathupright {\math_set_attribute\s!regular\s!tf\math_set_font_style_alterternate\s!tf}
-\unexpanded\def\mathdefault {\math_set_attribute\s!regular\s!it\math_set_font_style_alterternate\s!it}
-\unexpanded\def\mathscript {\math_set_alphabet \s!script \math_set_font_style_alterternate\s!script}
-\unexpanded\def\mathfraktur {\math_set_alphabet \s!fraktur \math_set_font_style_alterternate\s!fraktur}
-\unexpanded\def\mathblackboard{\math_set_alphabet \s!blackboard \math_set_font_style_alterternate\s!blackboard}
+\unexpanded\def\mathupright {\math_set_attribute\s!regular\s!tf\math_set_font_style_alternate\s!tf}
+\unexpanded\def\mathdefault {\math_set_attribute\s!regular\s!it\math_set_font_style_alternate\s!it}
+\unexpanded\def\mathscript {\math_set_alphabet \s!script \math_set_font_style_alternate\s!script}
+\unexpanded\def\mathfraktur {\math_set_alphabet \s!fraktur \math_set_font_style_alternate\s!fraktur}
+\unexpanded\def\mathblackboard{\math_set_alphabet \s!blackboard \math_set_font_style_alternate\s!blackboard}
-\unexpanded\def\mathrm {\math_set_attribute\s!rm\s!tf \math_set_font_style_alterternate\s!tf}
-\unexpanded\def\mathss {\math_set_attribute\s!ss\s!tf \math_set_font_style_alterternate\s!tf}
-\unexpanded\def\mathtt {\math_set_attribute\s!tt\s!tf \math_set_font_style_alterternate\s!tf}
+\unexpanded\def\mathrm {\math_set_attribute\s!rm\s!tf \math_set_font_style_alternate\s!tf}
+\unexpanded\def\mathss {\math_set_attribute\s!ss\s!tf \math_set_font_style_alternate\s!tf}
+\unexpanded\def\mathtt {\math_set_attribute\s!tt\s!tf \math_set_font_style_alternate\s!tf}
-\unexpanded\def\mathtf {\math_set_font_style\s!tf \math_set_font_style_alterternate\s!tf}
-\unexpanded\def\mathsl {\math_set_font_style\s!it \math_set_font_style_alterternate\s!it} % no sl
-\unexpanded\def\mathit {\math_set_font_style\s!it \math_set_font_style_alterternate\s!it}
+\unexpanded\def\mathtf {\math_set_font_style\s!tf \math_set_font_style_alternate\s!tf}
+\unexpanded\def\mathsl {\math_set_font_style\s!it \math_set_font_style_alternate\s!it} % no sl
+\unexpanded\def\mathit {\math_set_font_style\s!it \math_set_font_style_alternate\s!it}
-\unexpanded\def\mathbf {\math_set_font_style\s!bf \math_set_font_style_alterternate\s!bf}
-\unexpanded\def\mathbs {\math_set_font_style\s!bi \math_set_font_style_alterternate\s!bi} % no sl
-\unexpanded\def\mathbi {\math_set_font_style\s!bi \math_set_font_style_alterternate\s!bi}
+\unexpanded\def\mathbf {\math_set_font_style\s!bf \math_set_font_style_alternate\s!bf}
+\unexpanded\def\mathbs {\math_set_font_style\s!bi \math_set_font_style_alternate\s!bi} % no sl
+\unexpanded\def\mathbi {\math_set_font_style\s!bi \math_set_font_style_alternate\s!bi}
\let\tfmath\mathtf % maybe a grouped command
\let\slmath\mathsl
@@ -216,12 +265,12 @@
\unexpanded\def\mathfrak#1{{\mathfraktur #1}} % for AMS compatibility
\unexpanded\def\mathbb #1{{\mathblackboard#1}} % for AMS compatibility
-\let\normaltf\tf \unexpanded\def\tf{\ifmmode\mathtf\else\normaltf\fi}
-\let\normalbf\bf \unexpanded\def\bf{\ifmmode\mathbf\else\normalbf\fi}
-\let\normalit\it \unexpanded\def\it{\ifmmode\mathit\else\normalit\fi}
-\let\normalsl\sl \unexpanded\def\sl{\ifmmode\mathsl\else\normalsl\fi}
-\let\normalbi\bi \unexpanded\def\bi{\ifmmode\mathbi\else\normalbi\fi}
-\let\normalbs\bs \unexpanded\def\bs{\ifmmode\mathbs\else\normalbs\fi}
+\ifdefined\normaltf\else\let\normaltf\tf\fi \unexpanded\def\tf{\ifmmode\mathtf\else\normaltf\fi}
+\ifdefined\normalbf\else\let\normalbf\bf\fi \unexpanded\def\bf{\ifmmode\mathbf\else\normalbf\fi}
+\ifdefined\normalit\else\let\normalit\it\fi \unexpanded\def\it{\ifmmode\mathit\else\normalit\fi}
+\ifdefined\normalsl\else\let\normalsl\sl\fi \unexpanded\def\sl{\ifmmode\mathsl\else\normalsl\fi}
+\ifdefined\normalbi\else\let\normalbi\bi\fi \unexpanded\def\bi{\ifmmode\mathbi\else\normalbi\fi}
+\ifdefined\normalbs\else\let\normalbs\bs\fi \unexpanded\def\bs{\ifmmode\mathbs\else\normalbs\fi}
\let\normalrm\rm \unexpanded\def\rm{\ifmmode\mathrm\else\normalrm\fi}
\let\normalss\ss \unexpanded\def\ss{\ifmmode\mathss\else\normalss\fi}
@@ -231,9 +280,9 @@
\ifdefined\mb \else \let\mb\relax \fi
% 1: $\setmathattribute{ss}{bf}3$
-% 2: $\setmathattribute{ss}{bf}\setmathfontstylealterternate{bf}3$
+% 2: $\setmathattribute{ss}{bf}\setmathfontstylealternate{bf}3$
% 3: $\setmathattribute{ss}{bf}\setmathfontstyle{bf}3$
-% 4: $\setmathattribute{ss}{bf}\setmathfontstyle{bf}\setmathfontstylealterternate{bf}3$
+% 4: $\setmathattribute{ss}{bf}\setmathfontstyle{bf}\setmathfontstylealternate{bf}3$
% 5: $e=mc^2 \quad \mb e=mc^2$
\prependtoks
@@ -260,7 +309,7 @@
\newcount\c_math_renderings_attribute
\appendtoks
- \c_math_renderings_attribute\ctxcommand{mathrenderset("\mathematicsparameter\c!symbolset")}\relax
+ \c_math_renderings_attribute\clf_mathrenderset{\mathematicsparameter\c!symbolset}\relax
\to \everysetupmathematics % only in mathematics
\appendtoks
@@ -282,24 +331,26 @@
\unexpanded\def\boldsymbol
{\mathortext\mathboldsymbol\bold}
-%D Helpers:
+%D Helpers
-\def\utfmathclass #1{\ctxcommand{utfmathclass (\!!bs#1\!!es)}}
-\def\utfmathstretch#1{\ctxcommand{utfmathstretch(\!!bs#1\!!es)}}
-\def\utfmathcommand#1{\ctxcommand{utfmathcommand(\!!bs#1\!!es)}}
-\def\utfmathfiller #1{\ctxcommand{utfmathfiller (\!!bs#1\!!es)}}
+\def\utfmathclass #1{\clf_utfmathclass {#1}}
+\def\utfmathstretch#1{\clf_utfmathstretch{#1}}
+\def\utfmathcommand#1{\clf_utfmathcommand{#1}}
+\def\utfmathfiller #1{\clf_utfmathfiller {#1}}
-\def\utfmathclassfiltered #1#2{\ctxcommand{utfmathclass (\!!bs#1\!!es,nil,"#2")}}
-\def\utfmathcommandfiltered#1#2{\ctxcommand{utfmathcommand(\!!bs#1\!!es,nil,"#2")}}
+\def\utfmathcommandabove #1{\clf_utfmathcommandabove {#1}}
+\def\utfmathcommandbelow #1{\clf_utfmathcommandbelow {#1}}
+\def\utfmathcommandfiller#1{\clf_utfmathcommandfiller{#1}}
-\def\utfmathcommandabove#1{\ctxcommand{utfmathcommandabove(\!!bs#1\!!es)}}
-\def\utfmathcommandbelow#1{\ctxcommand{utfmathcommandbelow(\!!bs#1\!!es)}}
+\unexpanded\def\doifelseutfmathaccent#1{\clf_doifelseutfmathaccent{#1}}
+\unexpanded\def\doifelseutfmathabove #1{\clf_doifelseutfmathabove {#1}}
+\unexpanded\def\doifelseutfmathbelow #1{\clf_doifelseutfmathbelow {#1}}
+\unexpanded\def\doifelseutfmathfiller#1{\clf_doifelseutfmathfiller{#1}}
-\unexpanded\def\doifelseutfmathaccent #1{\ctxcommand{doifelseutfmathaccent(\!!bs#1\!!es)}}
-\unexpanded\def\doifelseutfmathaccentfiltered#1#2{\ctxcommand{doifelseutfmathaccent(\!!bs#1\!!es,"#2")}}
-
-\unexpanded\def\doifelseutfmathabove #1{\ctxcommand{doifelseutfmathabove(\!!bs#1\!!es)}}
-\unexpanded\def\doifelseutfmathbelow #1{\ctxcommand{doifelseutfmathbelow(\!!bs#1\!!es)}}
+\let\doifutfmathaccentelse \doifelseutfmathaccent
+\let\doifutfmathaboveelse \doifelseutfmathabove
+\let\doifutfmathbelowelse \doifelseutfmathbelow
+\let\doifutfmathfillerelse \doifelseutfmathfiller
%D Not used that much:
@@ -396,7 +447,7 @@
\relax
\hskip-.01\emwidth}
-\unexpanded\def\showmathstruts % let's not overload \nath_strut_normal
+\unexpanded\def\showmathstruts % let's not overload \math_strut_normal
{\let\math_strut\math_strut_visual}
\let\math_strut\math_strut_normal
@@ -456,7 +507,7 @@
\startimath#1\stopimath
\egroup
\ht\scratchbox\strutht
- \dp\scratchbox\strutht
+ \dp\scratchbox\strutdp
\box\scratchbox
\endgroup}
@@ -479,8 +530,8 @@
% Once this is stable we can store the number at the tex end which is
% faster. Functions getnumbers >= 1000.
-\expanded\def\math_tags_mathfunction_indeed #1{\ctxcommand{taggedmathfunction("#1",false,\ifconditional\c_apply_function true\else false\fi)}}
-\expanded\def\math_tags_mathfunctionlabeltext_indeed#1{\ctxcommand{taggedmathfunction("#1",true ,\ifconditional\c_apply_function true\else false\fi)}}
+\expanded\def\math_tags_mathfunction_indeed #1{\clf_taggedmathfunction{#1}{false}{\ifconditional\c_apply_function true\else false\fi}}
+\expanded\def\math_tags_mathfunctionlabeltext_indeed#1{\clf_taggedmathfunction{#1} {true}{\ifconditional\c_apply_function true\else false\fi}}
\expanded\def\math_tags_mo_indeed#1{\begingroup \attribute\mathcategoryattribute\plusone #1\endgroup}
\expanded\def\math_tags_mi_indeed#1{\begingroup \attribute\mathcategoryattribute\plustwo #1\endgroup}
@@ -823,17 +874,16 @@
% \ifconditional\knuthmode\else\donknuthmode\fi}
\unexpanded\def\enableasciimode
- {\ctxlua{resolvers.macros.enablecomment()}%
- \glet\enableasciimode\relax}
+ {\clf_enableasciimode} % relaxes itself
\unexpanded\def\asciimode
{\catcodetable\txtcatcodes
- \enableasciimode}
+ \clf_enableasciimode}
\unexpanded\def\startasciimode
{\pushcatcodetable
\catcodetable\txtcatcodes
- \enableasciimode}
+ \clf_enableasciimode}
\unexpanded\def\stopasciimode
{\popcatcodetable}
@@ -851,7 +901,7 @@
\to \everysetupmathematics
\setupmathematics
- [\c!compact=no]
+ [\c!compact=\v!no]
% \enabletrackers[typesetters.directions.math]
@@ -902,8 +952,8 @@
\newcount\c_math_bidi
-\setvalue{\??mathbidi\v!no }{\ctxcommand{setmathdirection(0)}\c_math_bidi\attributeunsetvalue}
-\setvalue{\??mathbidi\v!yes}{\ctxcommand{setmathdirection(1)}\c_math_bidi\plusone}
+\setvalue{\??mathbidi\v!no }{\clf_setmathdirection\zerocount\relax\c_math_bidi\attributeunsetvalue}
+\setvalue{\??mathbidi\v!yes}{\clf_setmathdirection\plusone \relax\c_math_bidi\plusone}
\appendtoks
\edef\p_bidi{\mathematicsparameter\c!bidi}%
@@ -985,7 +1035,7 @@
\def\math_italics_initialize
{\ifnum\c_math_italics_attribute=\attributeunsetvalue \else
- \ctxcommand{setmathitalics()}% one time
+ \clf_setmathitalics % one time
\global\let\math_italics_initialize\relax
\fi}
@@ -1491,6 +1541,16 @@
\crampedscriptstyle \or
\fi}
+\newcount\c_math_saved_style
+
+\unexpanded\def\pushmathstyle % assumes begingroup .. endgroup
+ {\c_math_saved_style\mathstyle}
+
+\unexpanded\def\popmathstyle
+ {\ifnum\mathstyle=\c_math_saved_style\else
+ \triggermathstyle\c_math_saved_style
+ \fi}
+
\installcorenamespace{mathstylecommand}
\installcorenamespace{mathstylecache}
@@ -1826,7 +1886,14 @@
\ifdefined\text\else \let\text\hbox \fi
-\unexpanded\def\mathoptext#1{\mathop{\text{#1}}}
+% \unexpanded\def\mathoptext#1{\mathop{\text{#1}}}
+
+\unexpanded\def\mathoptext
+ {\normalizebodyfontsize\m_math_text_choice_face{\mathstyleface\normalmathstyle}%
+ %\showmathstyle
+ \dowithnextbox
+ {\mathop{\box\nextbox}}%
+ \hbox\bgroup\font_basics_switchtobodyfont\m_math_text_choice_face\let\next}
% new:
@@ -1851,11 +1918,140 @@
% this should be a primitive:
-% \def\mathextensiblecode#1#2%
-% {\cldcontext{mathematics.extensiblecode(\number#1,\number#2)}}
+\def\mathextensiblecode#1#2{\clf_extensiblecode\numexpr#1\relax\numexpr#2\relax}
+\def\mathhorizontalcode#1#2{\clf_horizontalcode\numexpr#1\relax\numexpr#2\relax}
-\def\mathextensiblecode#1#2{\ctxcommand{extensiblecode(\number#1,\number#2)}}
-\def\mathhorizontalcode#1#2{\ctxcommand{horizontalcode(\number#1,\number#2)}}
+% experimental:
+
+%D \starttyping
+%D \enabletrackers[math.openedup]
+%D
+%D \dorecurse{10}{\dorecurse{#1}{whatever }}
+%D
+%D \startitemize[packed]
+%D \startitem whatever \openedupimath{\frac{1}{2}} whatever
+%D \startitem whatever \openedupimath{\frac{1}{2}} whatever
+%D \startitem whatever \openedupimath{\frac{1}{2}} whatever
+%D \stopitemize
+%D \startitemize[packed,columns]
+%D \startitem whatever \openedupimath{\frac{1}{2}} whatever
+%D \startitem whatever \openedupimath{\frac{1}{2}} whatever
+%D \startitem whatever \openedupimath{\frac{1}{2}} whatever
+%D \startitem whatever \openedupimath{\frac{1}{2}} whatever
+%D \startitem whatever \openedupimath{\frac{1}{2}} whatever
+%D \startitem whatever \openedupimath{\frac{1}{2}} whatever
+%D \stopitemize
+%D
+%D \dorecurse{5}{\dorecurse{#1}{whatever }\openedupimath{\frac{1}{2}} }
+%D
+%D \startitemize[packed,columns]
+%D \startitem whatever \openedupimath{1+2} whatever
+%D \startitem whatever \openedupimath{1+2} whatever
+%D \startitem whatever \openedupimath{\frac{1}{2}} whatever
+%D \startitem whatever \openedupimath{1+2} whatever
+%D \startitem whatever \openedupimath{1+2} whatever
+%D \stopitemize
+%D
+%D \dorecurse{5}{\dorecurse{#1}{whatever }\openedupimath{1+2} }
+%D
+%D \startitemize[packed]
+%D \startitem whatever \openedupimath{\frac{1}{2}} whatever
+%D \startitem whatever \openedupimath{\frac{1}{2}} whatever
+%D \startitem whatever \openedupimath{\frac{1}{2}} whatever
+%D \stopitemize
+%D
+%D \dorecurse{10}{whatever }
+%D \dorecurse {5}{\dorecurse{#1}{whatever }\openedupimath{\frac{1}{2}} }
+%D \dorecurse{10}{whatever }
+%D \stoptyping
+
+\def\m_math_inline_openup_ht{\dimexpr\ifinsidecolumns\strutdp\else\lineheight\fi/\plusfour\relax}
+\def\m_math_inline_openup_dp{\dimexpr\ifinsidecolumns\strutdp\else\lineheight\fi/\plusfour\relax}
+
+% \def\m_math_inline_openup_ht{\dimexpr\lineheight/\ifinsidecolumns\pluseight\else\plusfour\fi\relax}
+% \def\m_math_inline_openup_dp{\dimexpr\lineheight/\ifinsidecolumns\pluseight\else\plusfour\fi\relax}
+
+\installtextracker
+ {math.openedup}
+ {\let\math_inline_openup_start_yes\math_inline_openup_traced_start}
+ {\let\math_inline_openup_start_yes\math_inline_openup_normal_start}
+
+\unexpanded\def\math_inline_openup_normal_start
+ {\scratchheight\dimexpr\ht\scratchbox+\m_math_inline_openup_ht\relax
+ \scratchdepth \dimexpr\dp\scratchbox+\m_math_inline_openup_dp\relax
+ \vrule\s!width\zeropoint\s!height\scratchheight\s!depth\scratchdepth\relax
+ \begingroup
+ \let\math_inline_openup_stop\math_inline_openup_normal_stop}
+
+\unexpanded\def\math_inline_openup_normal_stop
+ {\endgroup
+ \vrule\s!width\zeropoint\s!height\scratchheight\s!depth\scratchdepth\relax}
+
+\unexpanded\def\math_inline_openup_traced_start
+ {\scratchtopoffset \ht\scratchbox
+ \scratchbottomoffset\dp\scratchbox
+ \scratchheight \dimexpr\scratchtopoffset +\m_math_inline_openup_ht\relax
+ \scratchdepth \dimexpr\scratchbottomoffset+\m_math_inline_openup_dp\relax
+ \vrule\s!width\zeropoint\s!height\scratchheight\s!depth\scratchdepth\relax
+ \begingroup
+ \dofastcoloractivation{darkred}%
+ \vrule\s!width\emwidth\s!height\scratchheight\s!depth-\scratchtopoffset\relax
+ \endgroup
+ \kern-\emwidth
+ \begingroup
+ \let\math_inline_openup_stop\math_inline_openup_traced_stop}
+
+\unexpanded\def\math_inline_openup_traced_stop
+ {\endgroup
+ \kern-\emwidth
+ \begingroup
+ \dofastcoloractivation{darkblue}%
+ \vrule\s!width\emwidth\s!height-\scratchbottomoffset\s!depth\scratchdepth\relax
+ \endgroup
+ \vrule\s!width\zeropoint\s!height\scratchheight\s!depth\scratchdepth\relax}
+
+\let\math_inline_openup_start_yes\math_inline_openup_normal_start
+\let\math_inline_openup_stop \relax
+
+\def\math_inline_openup_start_nop
+ {\let\math_inline_openup_stop\relax}
+
+\unexpanded\def\openedupimath
+ {\dontleavehmode
+ \begingroup
+ \ifmmode
+ \expandafter\openedupimath_math
+ \else
+ \expandafter\openedupimath_text
+ \fi}
+
+\unexpanded\def\openedupimath_math#1%
+ {\setbox\scratchbox\mathstylehbox{#1}%
+ \ifdim\ht\scratchbox>\strutht
+ \math_inline_openup_start_yes
+ \else\ifdim\dp\scratchbox>\strutdp
+ \math_inline_openup_start_yes
+ \else
+ \math_inline_openup_start_nop
+ \fi\fi
+ #1%
+ \math_inline_openup_stop
+ \endgroup}
+
+\unexpanded\def\openedupimath_text#1%
+ {\setbox\scratchbox\hbox{\startimath#1\stopimath}%
+ \ifdim\ht\scratchbox>\strutht
+ \math_inline_openup_start_yes
+ \else\ifdim\dp\scratchbox>\strutdp
+ \math_inline_openup_start_yes
+ \else
+ \math_inline_openup_start_nop
+ \fi\fi
+ \startimath
+ #1%
+ \stopimath
+ \math_inline_openup_stop
+ \endgroup}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/math-int.mkiv b/Master/texmf-dist/tex/context/base/math-int.mkiv
index 6b480961b6a..6b65738ff2e 100644
--- a/Master/texmf-dist/tex/context/base/math-int.mkiv
+++ b/Master/texmf-dist/tex/context/base/math-int.mkiv
@@ -13,6 +13,8 @@
\writestatus{loading}{ConTeXt Math Macros / Integrals}
+% todo: int and sum etc can be stackers
+
\unprotect
%D \startbuffer
diff --git a/Master/texmf-dist/tex/context/base/math-map.lua b/Master/texmf-dist/tex/context/base/math-map.lua
index f2a588fc7de..add6afa4c1c 100644
--- a/Master/texmf-dist/tex/context/base/math-map.lua
+++ b/Master/texmf-dist/tex/context/base/math-map.lua
@@ -53,6 +53,8 @@ local report_remapping = logs.reporter("mathematics","remapping")
mathematics = mathematics or { }
local mathematics = mathematics
+local implement = interfaces.implement
+
-- Unfortunately some alphabets have gaps (thereby troubling all applications that
-- need to deal with math). Somewhat strange considering all those weird symbols that
-- were added afterwards. The following trickery (and data) is only to be used for
@@ -184,7 +186,7 @@ local regular_tf = {
},
symbols = {
[0x2202]=0x2202, [0x2207]=0x2207,
- [0x0027]=0x2032, -- prime
+ [0x0027]=0x2032, -- prime
},
}
@@ -617,6 +619,39 @@ function mathematics.syncname(alphabet)
texsetattribute(mathalphabet,data and data.attribute or texattribute[mathalphabet])
end
+implement {
+ name = "setmathattribute",
+ arguments = { "string", "string" },
+ actions = function(alphabet,style)
+ local data = alphabets[alphabet] or regular
+ data = data[style] or data.tf
+ texsetattribute(mathalphabet,data and data.attribute or texattribute[mathalphabet])
+ end
+}
+
+implement {
+ name = "setmathstyle",
+ arguments = "string",
+ actions = function(style)
+ local r = mathremap[texgetattribute(mathalphabet)]
+ local alphabet = r and r.alphabet or "regular"
+ local data = alphabets[alphabet][style]
+ texsetattribute(mathalphabet,data and data.attribute or texattribute[mathalphabet])
+ end
+}
+
+implement {
+ name = "setmathalphabet",
+ arguments = "string",
+ actions = function(alphabet)
+ -- local r = mathremap[mathalphabet]
+ local r = mathremap[texgetattribute(mathalphabet)]
+ local style = r and r.style or "tf"
+ local data = alphabets[alphabet][style]
+ texsetattribute(mathalphabet,data and data.attribute or texattribute[mathalphabet])
+ end
+}
+
local islcgreek = regular_tf.lcgreek
local isucgreek = regular_tf.ucgreek
local issygreek = regular_tf.symbols
@@ -742,9 +777,3 @@ function mathematics.addfallbacks(main)
checkedcopy(characters,regular.bi.ucgreek,regular.it.ucgreek)
checkedcopy(characters,regular.bi.lcgreek,regular.it.lcgreek)
end
-
--- interface
-
-commands.setmathattribute = mathematics.syncboth
-commands.setmathalphabet = mathematics.syncname
-commands.setmathstyle = mathematics.syncstyle
diff --git a/Master/texmf-dist/tex/context/base/math-noa.lua b/Master/texmf-dist/tex/context/base/math-noa.lua
index 3a0af01cc9e..893ee6f48d3 100644
--- a/Master/texmf-dist/tex/context/base/math-noa.lua
+++ b/Master/texmf-dist/tex/context/base/math-noa.lua
@@ -28,31 +28,38 @@ local otf = fonts.handlers.otf
local otffeatures = fonts.constructors.newfeatures("otf")
local registerotffeature = otffeatures.register
-local trace_remapping = false trackers.register("math.remapping", function(v) trace_remapping = v end)
-local trace_processing = false trackers.register("math.processing", function(v) trace_processing = v end)
-local trace_analyzing = false trackers.register("math.analyzing", function(v) trace_analyzing = v end)
-local trace_normalizing = false trackers.register("math.normalizing", function(v) trace_normalizing = v end)
-local trace_collapsing = false trackers.register("math.collapsing", function(v) trace_collapsing = v end)
-local trace_goodies = false trackers.register("math.goodies", function(v) trace_goodies = v end)
-local trace_variants = false trackers.register("math.variants", function(v) trace_variants = v end)
-local trace_alternates = false trackers.register("math.alternates", function(v) trace_alternates = v end)
-local trace_italics = false trackers.register("math.italics", function(v) trace_italics = v end)
-local trace_families = false trackers.register("math.families", function(v) trace_families = v end)
-
-local check_coverage = true directives.register("math.checkcoverage", function(v) check_coverage = v end)
-
-local report_processing = logs.reporter("mathematics","processing")
-local report_remapping = logs.reporter("mathematics","remapping")
-local report_normalizing = logs.reporter("mathematics","normalizing")
-local report_collapsing = logs.reporter("mathematics","collapsing")
-local report_goodies = logs.reporter("mathematics","goodies")
-local report_variants = logs.reporter("mathematics","variants")
-local report_alternates = logs.reporter("mathematics","alternates")
-local report_italics = logs.reporter("mathematics","italics")
-local report_families = logs.reporter("mathematics","families")
-
-local a_mathrendering = attributes.private("mathrendering")
-local a_exportstatus = attributes.private("exportstatus")
+local privateattribute = attributes.private
+local registertracker = trackers.register
+local registerdirective = directives.register
+local logreporter = logs.reporter
+
+local trace_remapping = false registertracker("math.remapping", function(v) trace_remapping = v end)
+local trace_processing = false registertracker("math.processing", function(v) trace_processing = v end)
+local trace_analyzing = false registertracker("math.analyzing", function(v) trace_analyzing = v end)
+local trace_normalizing = false registertracker("math.normalizing", function(v) trace_normalizing = v end)
+local trace_collapsing = false registertracker("math.collapsing", function(v) trace_collapsing = v end)
+local trace_patching = false registertracker("math.patching", function(v) trace_patching = v end)
+local trace_goodies = false registertracker("math.goodies", function(v) trace_goodies = v end)
+local trace_variants = false registertracker("math.variants", function(v) trace_variants = v end)
+local trace_alternates = false registertracker("math.alternates", function(v) trace_alternates = v end)
+local trace_italics = false registertracker("math.italics", function(v) trace_italics = v end)
+local trace_families = false registertracker("math.families", function(v) trace_families = v end)
+
+local check_coverage = true registerdirective("math.checkcoverage", function(v) check_coverage = v end)
+
+local report_processing = logreporter("mathematics","processing")
+local report_remapping = logreporter("mathematics","remapping")
+local report_normalizing = logreporter("mathematics","normalizing")
+local report_collapsing = logreporter("mathematics","collapsing")
+local report_patching = logreporter("mathematics","patching")
+local report_goodies = logreporter("mathematics","goodies")
+local report_variants = logreporter("mathematics","variants")
+local report_alternates = logreporter("mathematics","alternates")
+local report_italics = logreporter("mathematics","italics")
+local report_families = logreporter("mathematics","families")
+
+local a_mathrendering = privateattribute("mathrendering")
+local a_exportstatus = privateattribute("exportstatus")
local nuts = nodes.nuts
local nodepool = nuts.pool
@@ -83,8 +90,6 @@ local font_of_family = node.family_font
local new_kern = nodepool.kern
local new_rule = nodepool.rule
-local topoints = number.points
-
local fonthashes = fonts.hashes
local fontdata = fonthashes.identifiers
local fontcharacters = fonthashes.characters
@@ -236,7 +241,7 @@ noads.process = processnoads
-- might as well do this
local families = { }
-local a_mathfamily = attributes.private("mathfamily")
+local a_mathfamily = privateattribute("mathfamily")
local boldmap = mathematics.boldmap
local familymap = { [0] =
@@ -336,8 +341,8 @@ end
-- character remapping
-local a_mathalphabet = attributes.private("mathalphabet")
-local a_mathgreek = attributes.private("mathgreek")
+local a_mathalphabet = privateattribute("mathalphabet")
+local a_mathgreek = privateattribute("mathgreek")
processors.relocate = { }
@@ -488,7 +493,7 @@ end
-- todo: just replace the character by an ord noad
-- and remove the right delimiter as well
-local mathsize = attributes.private("mathsize")
+local mathsize = privateattribute("mathsize")
local resize = { } processors.resize = resize
@@ -517,137 +522,17 @@ function handlers.resize(head,style,penalties)
return true
end
-local collapse = { } processors.collapse = collapse
-
-local mathpairs = characters.mathpairs
-
-mathpairs[0x2032] = { [0x2032] = 0x2033, [0x2033] = 0x2034, [0x2034] = 0x2057 } -- (prime,prime) (prime,doubleprime) (prime,tripleprime)
-mathpairs[0x2033] = { [0x2032] = 0x2034, [0x2033] = 0x2057 } -- (doubleprime,prime) (doubleprime,doubleprime)
-mathpairs[0x2034] = { [0x2032] = 0x2057 } -- (tripleprime,prime)
-
-mathpairs[0x2035] = { [0x2035] = 0x2036, [0x2036] = 0x2037 } -- (reversedprime,reversedprime) (reversedprime,doublereversedprime)
-mathpairs[0x2036] = { [0x2035] = 0x2037 } -- (doublereversedprime,reversedprime)
-
-mathpairs[0x222B] = { [0x222B] = 0x222C, [0x222C] = 0x222D }
-mathpairs[0x222C] = { [0x222B] = 0x222D }
-
-mathpairs[0x007C] = { [0x007C] = 0x2016, [0x2016] = 0x2980 } -- bar+bar=double bar+double=triple
-mathpairs[0x2016] = { [0x007C] = 0x2980 } -- double+bar=triple
-
-local movesub = {
- -- primes
- [0x2032] = 0xFE932,
- [0x2033] = 0xFE933,
- [0x2034] = 0xFE934,
- [0x2057] = 0xFE957,
- -- reverse primes
- [0x2035] = 0xFE935,
- [0x2036] = 0xFE936,
- [0x2037] = 0xFE937,
-}
-
-local validpair = {
- [noad_rel] = true,
- [noad_ord] = true,
- [noad_opdisplaylimits] = true,
- [noad_oplimits] = true,
- [noad_opnolimits] = true,
-}
-
-local function movesubscript(parent,current_nucleus,current_char)
- local prev = getfield(parent,"prev")
- if prev and getid(prev) == math_noad then
- if not getfield(prev,"sup") and not getfield(prev,"sub") then
- setfield(current_nucleus,"char",movesub[current_char or getchar(current_nucleus)])
- -- {f} {'}_n => f_n^'
- local nucleus = getfield(parent,"nucleus")
- local sub = getfield(parent,"sub")
- local sup = getfield(parent,"sup")
- setfield(prev,"sup",nucleus)
- setfield(prev,"sub",sub)
- local dummy = copy_node(nucleus)
- setfield(dummy,"char",0)
- setfield(parent,"nucleus",dummy)
- setfield(parent,"sub",nil)
- if trace_collapsing then
- report_collapsing("fixing subscript")
- end
- end
- end
-end
-
-local function collapsepair(pointer,what,n,parent,nested) -- todo: switch to turn in on and off
- if parent then
- if validpair[getsubtype(parent)] then
- local current_nucleus = getfield(parent,"nucleus")
- if getid(current_nucleus) == math_char then
- local current_char = getchar(current_nucleus)
- if not getfield(parent,"sub") and not getfield(parent,"sup") then
- local mathpair = mathpairs[current_char]
- if mathpair then
- local next_noad = getnext(parent)
- if next_noad and getid(next_noad) == math_noad then
- if validpair[getsubtype(next_noad)] then
- local next_nucleus = getfield(next_noad,"nucleus")
- if getid(next_nucleus) == math_char then
- local next_char = getchar(next_nucleus)
- local newchar = mathpair[next_char]
- if newchar then
- local fam = getfield(current_nucleus,"fam")
- local id = font_of_family(fam)
- local characters = fontcharacters[id]
- if characters and characters[newchar] then
- if trace_collapsing then
- report_collapsing("%U + %U => %U",current_char,next_char,newchar)
- end
- setfield(current_nucleus,"char",newchar)
- local next_next_noad = getnext(next_noad)
- if next_next_noad then
- setfield(parent,"next",next_next_noad)
- setfield(next_next_noad,"prev",parent)
- else
- setfield(parent,"next",nil)
- end
- setfield(parent,"sup",getfield(next_noad,"sup"))
- setfield(parent,"sub",getfield(next_noad,"sub"))
- setfield(next_noad,"sup",nil)
- setfield(next_noad,"sub",nil)
- free_node(next_noad)
- collapsepair(pointer,what,n,parent,true)
- if not nested and movesub[current_char] then
- movesubscript(parent,current_nucleus)
- end
- end
- end
- end
- end
- end
- elseif not nested and movesub[current_char] then
- movesubscript(parent,current_nucleus,current_char)
- end
- elseif not nested and movesub[current_char] then
- movesubscript(parent,current_nucleus,current_char)
- end
- end
- end
- end
-end
-
-collapse[math_char] = collapsepair
-
-function noads.handlers.collapse(head,style,penalties)
- processnoads(head,collapse,"collapse")
- return true
-end
-
-- normalize scripts
local unscript = { } noads.processors.unscript = unscript
+local checkers = { } noads.processors.checkers = checkers
local superscripts = characters.superscripts
local subscripts = characters.subscripts
+local fractions = characters.fractions
local replaced = { }
+local unknowns = { }
local function replace(pointer,what,n,parent)
pointer = parent -- we're following the parent list (chars trigger this)
@@ -726,22 +611,83 @@ local function replace(pointer,what,n,parent)
-- we could return stop
end
+local tracked = false trackers.register("fonts.missing", function(v) tracked = v end)
+local checked = { } -- simple case
+local cached = table.setmetatableindex("table") -- complex case
+
+local function check(pointer,what,n,parent)
+ if tracked then
+ -- slower as we check each font too and we always replace as math has
+ -- more demands than text
+ local char = getchar(pointer)
+ local font = font_of_family(getfield(pointer,"fam"))
+ local fake = cached[font][char]
+ if fake then
+ unknowns[char] = unknowns[char] + 1
+ setfield(pointer,"char",fake)
+ else
+ local chars = fontcharacters[font]
+ if not chars[char] then
+ unknowns[char] = 1
+ local kind, fake = fonts.checkers.placeholder(font,char)
+ if kind == "char" then
+ cached[font][char] = fake
+ setfield(pointer,"char",fake)
+ else
+ cached[font][char] = 0x3F
+ end
+ end
+ end
+ else
+ -- only simple checking, report at the end so one should take
+ -- action anyway ... we can miss a few checks but that is ok
+ -- as there is at least one reported
+ local char = getchar(pointer)
+ local done = unknowns[char]
+ if done then
+ unknowns[char] = done + 1
+ setfield(pointer,"char",0x3F)
+ elseif not checked[char] then
+ local font = font_of_family(getfield(pointer,"fam"))
+ local chars = fontcharacters[font]
+ if not chars[char] then
+ unknowns[char] = 1
+ setfield(pointer,"char",0x3F)
+ if trace_normalizing then
+ report_normalizing("character %C is not available",char)
+ end
+ end
+ end
+ checked[char] = true
+ end
+end
+
unscript[math_char] = replace -- not noads as we need to recurse
+checkers[math_char] = check -- not noads as we need to recurse
function handlers.unscript(head,style,penalties)
processnoads(head,unscript,"unscript")
+ processnoads(head,checkers,"checkers")
return true
end
-statistics.register("math script replacements", function()
- if next(replaced) then
+local function collected(list)
+ if list and next(list) then
local n, t = 0, { }
- for k, v in table.sortedpairs(replaced) do
+ for k, v in table.sortedpairs(list) do
n = n + v
t[#t+1] = formatters["%C"](k)
end
return formatters["% t (n=%s)"](t,n)
end
+end
+
+statistics.register("math script replacements", function()
+ return collected(replaced)
+end)
+
+statistics.register("unknown math characters", function()
+ return collected(unknowns)
end)
-- math alternates: (in xits lgf: $ABC$ $\cal ABC$ $\mathalternate{cal}\cal ABC$)
@@ -787,7 +733,7 @@ registerotffeature {
local getalternate = otf.getalternate
-local a_mathalternate = attributes.private("mathalternate")
+local a_mathalternate = privateattribute("mathalternate")
local alternate = { } -- processors.alternate = alternate
@@ -831,7 +777,12 @@ end
-- = we check for correction first because accessing nodes is slower
-- = the actual glyph is not that important (we can control it with numbers)
-local a_mathitalics = attributes.private("mathitalics")
+-- Italic correction in luatex math is a mess. There are all kind of assumptions based on
+-- old fonts and new font. Eventually there should be a flag that can signal to ignore all
+-- those heuristics. We want to deal with it ourselves also in the perspective of mxed math
+-- and text.
+
+local a_mathitalics = privateattribute("mathitalics")
local italics = { }
local default_factor = 1/20
@@ -899,6 +850,12 @@ local function getcorrection(method,font,char) -- -- or character.italic -- (thi
end
+local setcolor = nodes.tracers.colors.set
+local resetcolor = nodes.tracers.colors.reset
+local italic_kern = new_kern
+local c_positive_d = "trace:db"
+local c_negative_d = "trace:dr"
+
local function insert_kern(current,kern)
local sub = new_node(math_sub) -- todo: pool
local noad = new_node(math_noad) -- todo: pool
@@ -908,13 +865,7 @@ local function insert_kern(current,kern)
return sub
end
-local setcolor = nodes.tracers.colors.set
-local resetcolor = nodes.tracers.colors.reset
-local italic_kern = new_kern
-local c_positive_d = "trace:db"
-local c_negative_d = "trace:dr"
-
-trackers.register("math.italics", function(v)
+registertracker("math.italics.visualize", function(v)
if v then
italic_kern = function(k,font)
local ex = 1.5 * fontexheights[font]
@@ -959,12 +910,14 @@ italics[math_char] = function(pointer,what,n,parent)
report_italics("method %a, adding %p italic correction for lower limit of %C",method,correction,char)
end
end
- else
- if sup then
+ elseif sup then
+ if pointer ~= sub then
setfield(parent,"sup",insert_kern(sup,italic_kern(correction,font)))
if trace_italics then
report_italics("method %a, adding %p italic correction before superscript after %C",method,correction,char)
end
+ else
+ -- otherwise we inject twice
end
end
else
@@ -1044,6 +997,147 @@ function mathematics.resetitalics()
texsetattribute(a_mathitalics,unsetvalue)
end
+-- primes and such
+
+local collapse = { } processors.collapse = collapse
+
+local mathpairs = characters.mathpairs
+
+mathpairs[0x2032] = { [0x2032] = 0x2033, [0x2033] = 0x2034, [0x2034] = 0x2057 } -- (prime,prime) (prime,doubleprime) (prime,tripleprime)
+mathpairs[0x2033] = { [0x2032] = 0x2034, [0x2033] = 0x2057 } -- (doubleprime,prime) (doubleprime,doubleprime)
+mathpairs[0x2034] = { [0x2032] = 0x2057 } -- (tripleprime,prime)
+
+mathpairs[0x2035] = { [0x2035] = 0x2036, [0x2036] = 0x2037 } -- (reversedprime,reversedprime) (reversedprime,doublereversedprime)
+mathpairs[0x2036] = { [0x2035] = 0x2037 } -- (doublereversedprime,reversedprime)
+
+mathpairs[0x222B] = { [0x222B] = 0x222C, [0x222C] = 0x222D }
+mathpairs[0x222C] = { [0x222B] = 0x222D }
+
+mathpairs[0x007C] = { [0x007C] = 0x2016, [0x2016] = 0x2980 } -- bar+bar=double bar+double=triple
+mathpairs[0x2016] = { [0x007C] = 0x2980 } -- double+bar=triple
+
+local movesub = {
+ -- primes
+ [0x2032] = 0xFE932,
+ [0x2033] = 0xFE933,
+ [0x2034] = 0xFE934,
+ [0x2057] = 0xFE957,
+ -- reverse primes
+ [0x2035] = 0xFE935,
+ [0x2036] = 0xFE936,
+ [0x2037] = 0xFE937,
+}
+
+local validpair = {
+ [noad_rel] = true,
+ [noad_ord] = true,
+ [noad_opdisplaylimits] = true,
+ [noad_oplimits] = true,
+ [noad_opnolimits] = true,
+}
+
+local function movesubscript(parent,current_nucleus,current_char)
+ local prev = getfield(parent,"prev")
+ if prev and getid(prev) == math_noad then
+ if not getfield(prev,"sup") and not getfield(prev,"sub") then
+ -- {f} {'}_n => f_n^'
+ setfield(current_nucleus,"char",movesub[current_char or getchar(current_nucleus)])
+ local nucleus = getfield(parent,"nucleus")
+ local sub = getfield(parent,"sub")
+ local sup = getfield(parent,"sup")
+ setfield(prev,"sup",nucleus)
+ setfield(prev,"sub",sub)
+ local dummy = copy_node(nucleus)
+ setfield(dummy,"char",0)
+ setfield(parent,"nucleus",dummy)
+ setfield(parent,"sub",nil)
+ if trace_collapsing then
+ report_collapsing("fixing subscript")
+ end
+ elseif not getfield(prev,"sup") then
+ -- {f} {'}_n => f_n^'
+ setfield(current_nucleus,"char",movesub[current_char or getchar(current_nucleus)])
+ local nucleus = getfield(parent,"nucleus")
+ local sup = getfield(parent,"sup")
+ setfield(prev,"sup",nucleus)
+ local dummy = copy_node(nucleus)
+ setfield(dummy,"char",0)
+ setfield(parent,"nucleus",dummy)
+ if trace_collapsing then
+ report_collapsing("fixing subscript")
+ end
+ end
+ end
+end
+
+local function collapsepair(pointer,what,n,parent,nested) -- todo: switch to turn in on and off
+ if parent then
+ if validpair[getsubtype(parent)] then
+ local current_nucleus = getfield(parent,"nucleus")
+ if getid(current_nucleus) == math_char then
+ local current_char = getchar(current_nucleus)
+ if not getfield(parent,"sub") and not getfield(parent,"sup") then
+ local mathpair = mathpairs[current_char]
+ if mathpair then
+ local next_noad = getnext(parent)
+ if next_noad and getid(next_noad) == math_noad then
+ if validpair[getsubtype(next_noad)] then
+ local next_nucleus = getfield(next_noad,"nucleus")
+ local next_char = getchar(next_nucleus)
+ if getid(next_nucleus) == math_char then
+ local newchar = mathpair[next_char]
+ if newchar then
+ local fam = getfield(current_nucleus,"fam")
+ local id = font_of_family(fam)
+ local characters = fontcharacters[id]
+ if characters and characters[newchar] then
+ if trace_collapsing then
+ report_collapsing("%U + %U => %U",current_char,next_char,newchar)
+ end
+ setfield(current_nucleus,"char",newchar)
+ local next_next_noad = getnext(next_noad)
+ if next_next_noad then
+ setfield(parent,"next",next_next_noad)
+ setfield(next_next_noad,"prev",parent)
+ else
+ setfield(parent,"next",nil)
+ end
+ setfield(parent,"sup",getfield(next_noad,"sup"))
+ setfield(parent,"sub",getfield(next_noad,"sub"))
+ setfield(next_noad,"sup",nil)
+ setfield(next_noad,"sub",nil)
+ free_node(next_noad)
+ collapsepair(pointer,what,n,parent,true)
+ -- if not nested and movesub[current_char] then
+ -- movesubscript(parent,current_nucleus,current_char)
+ -- end
+ end
+ elseif not nested and movesub[current_char] then
+ movesubscript(parent,current_nucleus,current_char)
+ end
+ end
+ end
+ elseif not nested and movesub[current_char] then
+ movesubscript(parent,current_nucleus,current_char)
+ end
+ elseif not nested and movesub[current_char] then
+ movesubscript(parent,current_nucleus,current_char)
+ end
+ elseif not nested and movesub[current_char] then
+ movesubscript(parent,current_nucleus,current_char)
+ end
+ end
+ end
+ end
+end
+
+collapse[math_char] = collapsepair
+
+function noads.handlers.collapse(head,style,penalties)
+ processnoads(head,collapse,"collapse")
+ return true
+end
+
-- variants
local variants = { }
@@ -1139,7 +1233,7 @@ function handlers.classes(head,style,penalties)
return true
end
-trackers.register("math.classes",function(v) tasks.setaction("math","noads.handlers.classes",v) end)
+registertracker("math.classes",function(v) tasks.setaction("math","noads.handlers.classes",v) end)
-- just for me
@@ -1147,7 +1241,7 @@ function handlers.showtree(head,style,penalties)
inspect(nodes.totree(head))
end
-trackers.register("math.showtree",function(v) tasks.setaction("math","noads.handlers.showtree",v) end)
+registertracker("math.showtree",function(v) tasks.setaction("math","noads.handlers.showtree",v) end)
-- the normal builder
@@ -1202,6 +1296,20 @@ end)
-- interface
-commands.setmathalternate = mathematics.setalternate
-commands.setmathitalics = mathematics.setitalics
-commands.resetmathitalics = mathematics.resetitalics
+local implement = interfaces.implement
+
+implement {
+ name = "setmathalternate",
+ actions = mathematics.setalternate,
+ arguments = { "integer", "string" }
+}
+
+implement {
+ name = "setmathitalics",
+ actions = mathematics.setitalics
+}
+
+implement {
+ name = "resetmathitalics",
+ actions = mathematics.resetitalics
+}
diff --git a/Master/texmf-dist/tex/context/base/math-rad.mkvi b/Master/texmf-dist/tex/context/base/math-rad.mkvi
index 027b5c27d50..23e056c1fd2 100644
--- a/Master/texmf-dist/tex/context/base/math-rad.mkvi
+++ b/Master/texmf-dist/tex/context/base/math-rad.mkvi
@@ -28,13 +28,13 @@
\def\root#1\of{\rootradical{#1}} % #2
-\unexpanded\def\sqrt{\doifnextoptionalcselse\rootwithdegree\rootwithoutdegree}
+\unexpanded\def\sqrt{\doifelsenextoptionalcs\rootwithdegree\rootwithoutdegree}
-\def\styledrootradical#1#2% so that \text works ok ... \rootradical behaves somewhat weird
+\unexpanded\def\styledrootradical#1#2% so that \text works ok ... \rootradical behaves somewhat weird
{\normalexpanded{\rootradical{\normalunexpanded{#1}}{\noexpand\triggermathstyle{\normalmathstyle}\normalunexpanded{#2}}}}
-\def\rootwithdegree[#1]{\rootradical{#1}}
-\def\rootwithoutdegree {\rootradical {}}
+\unexpanded\def\rootwithdegree[#1]{\rootradical{#1}}
+\unexpanded\def\rootwithoutdegree {\rootradical {}}
%D Even older stuff:
@@ -62,7 +62,7 @@
\unexpanded\def\math_radical_handle#tag%
{\begingroup
\edef\currentmathradical{#tag}%
- \doifnextoptionalcselse\math_radical_degree_yes\math_radical_degree_nop}
+ \doifelsenextoptionalcs\math_radical_degree_yes\math_radical_degree_nop}
\def\math_radical_alternative{\csname\??mathradicalalternative\mathradicalparameter\c!alternative\endcsname}
@@ -173,11 +173,11 @@
\setbox\nextbox\mathstylehbox{#body}%
% we use the \overlay variables as these are passes anyway and
% it's more efficient than using parameters
- \edef\overlaywidth {\the\wd\nextbox}%
- \edef\overlayheight {\the\ht\nextbox}%
- \edef\overlaydepth {\the\dp\nextbox}%
- \edef\overlayoffset {\the\scratchoffset}%
- \edef\overlaylinewidth{\the\linewidth}%
+ \d_overlay_width \wd\nextbox
+ \d_overlay_height \ht\nextbox
+ \d_overlay_depth \dp\nextbox
+ \d_overlay_offset \scratchoffset
+ \d_overlay_linewidth\linewidth
\edef\overlaylinecolor{\mathradicalparameter\c!color}%
%
\edef\p_mp{\mathradicalparameter\c!mp}%
@@ -233,11 +233,11 @@
{\begingroup
\scratchoffset\mathornamentparameter\c!mpoffset
\setbox\nextbox\mathstylehbox{#body}%
- \edef\overlaywidth {\the\wd\nextbox}%
- \edef\overlayheight {\the\ht\nextbox}%
- \edef\overlaydepth {\the\dp\nextbox}%
- \edef\overlayoffset {\the\scratchoffset}%
- \edef\overlaylinewidth{\the\linewidth}%
+ \d_overlay_width \wd\nextbox
+ \d_overlay_height \ht\nextbox
+ \d_overlay_depth \dp\nextbox
+ \d_overlay_offset \scratchoffset
+ \d_overlay_linewidth\linewidth
\edef\overlaylinecolor{\mathornamentparameter\c!color}%
\edef\p_mp{\mathornamentparameter\c!mp}%
% thw width of the graphic determines the width of the final result
diff --git a/Master/texmf-dist/tex/context/base/math-ren.lua b/Master/texmf-dist/tex/context/base/math-ren.lua
index 5c4c1336944..4628ffe5587 100644
--- a/Master/texmf-dist/tex/context/base/math-ren.lua
+++ b/Master/texmf-dist/tex/context/base/math-ren.lua
@@ -60,6 +60,8 @@ end
mathematics.renderset = renderset
-function commands.mathrenderset(list)
- context(renderset(list))
-end
+interfaces.implement {
+ name = "mathrenderset",
+ actions = { renderset, context },
+ arguments = "string",
+}
diff --git a/Master/texmf-dist/tex/context/base/math-stc.mkvi b/Master/texmf-dist/tex/context/base/math-stc.mkvi
index 76a07db5c68..a879d157f27 100644
--- a/Master/texmf-dist/tex/context/base/math-stc.mkvi
+++ b/Master/texmf-dist/tex/context/base/math-stc.mkvi
@@ -16,6 +16,12 @@
\unprotect
+%D WARNING: If the code here changes, the export needs to be checked! Stackers are rather
+%D special because the order in mathml matters, so we flush in [base under over] order. We
+%D also do some analysis at the \TEX\ end (passing the right variant). It's easy in the
+%D export to deal with it but in the pdf stream less trivial as we don't actually analyze
+%D there.
+
%D At some point the \MKII\ arrow mechanism has been converted to \MKIV, but we kept
%D most of the logic. We now have a more generic variant dealing with extensibles.
%D There are a few demands than we need to meet:
@@ -78,7 +84,7 @@
{\mathstylehbox{\usemathstackerscolorparameter\c!color
\Umathaccent\fam\zerocount\scratchunicode{\hskip\hsize}}}
-% these delimiters are a unuseable as theu don't center for small arguments:
+% these delimiters are a unuseable as they don't center for small arguments:
%
% $\Umathaccent 0 0 "2190{x}$ \par $\Umathaccent 0 0 "27F8{x}$\par
% $\Udelimiterunder 0 "2190{x}$ \par $\Udelimiterunder 0 "27F8{x}$\par
@@ -121,6 +127,18 @@
\def\math_stackers_skip_indeed#amount%
{\filledhboxk{\unsetteststrut\strut\hskip#amount}} % \dontshowstruts
+\let\math_stackers_start_tagged_mid\relax
+\let\math_stackers_start_tagged_top\relax
+\let\math_stackers_start_tagged_bot\relax
+\let\math_stackers_stop_tagged \relax
+
+\appendtoks
+ \def\math_stackers_start_tagged_mid{\dostarttagged\t!mathstackermid\empty\hbox\bgroup}%
+ \def\math_stackers_start_tagged_top{\dostarttagged\t!mathstackertop\empty\hbox\bgroup}%
+ \def\math_stackers_start_tagged_bot{\dostarttagged\t!mathstackerbot\empty\hbox\bgroup}%
+ \def\math_stackers_stop_tagged {\egroup\dostoptagged}%
+\to \everysetuptagging
+
%D We define a full featured command handler.
\installcorenamespace {mathstackers}
@@ -139,9 +157,10 @@
\c!mpoffset=.25\exheight,
\c!voffset=.25\exheight,
\c!hoffset=.5\emwidth,
+ \c!distance=\mathstackersparameter\c!voffset, % distance between symbol and base (can be different from voffset)
\c!minheight=\exheight,
\c!mindepth=\zeropoint,
- \c!minwidth=\emwidth,
+ \c!minwidth=.5\emwidth,
\c!order=\v!normal,
\c!strut=,
\c!color=, % todo: when I need it
@@ -203,11 +222,11 @@
\setvalue{\??mathstackersalternative\v!mp}%
{\hbox\bgroup % todo: add code key + tag
- \edef\overlaywidth {\the\scratchwidth}%
- \edef\overlayheight {\the\dimexpr\mathstackersparameter\c!mpheight}%
- \edef\overlaydepth {\the\dimexpr\mathstackersparameter\c!mpdepth}%
- \edef\overlayoffset {\the\dimexpr\mathstackersparameter\c!mpoffset}%
- \edef\overlaylinewidth{\the\linewidth}%
+ \d_overlay_width \scratchwidth
+ \d_overlay_height \dimexpr\mathstackersparameter\c!mpheight
+ \d_overlay_depth \dimexpr\mathstackersparameter\c!mpdepth
+ \d_overlay_offset \dimexpr\mathstackersparameter\c!mpoffset
+ \d_overlay_linewidth\linewidth
\edef\overlaylinecolor{\mathstackersparameter\c!color}%
\edef\p_mp{\mathstackersparameter\c!mp}%
\uniqueMPgraphic{\p_mp}%
@@ -261,9 +280,11 @@
\fi}
\unexpanded\def\math_stackers_triplet#method#category#codepoint#toptext#bottomtext%
+ %{\math_stackers_start_group{#category}%
{\begingroup
\edef\currentmathstackers{#category}%
\mathstackersparameter\c!left\relax
+ \dostarttagged\t!mathstacker\currentmathstackers
\ifmmode\math_class_by_parameter\mathstackersparameter\else\dontleavehmode\fi
{\edef\p_offset {\mathstackersparameter\c!offset}%
\edef\p_location {\mathstackersparameter\c!location}%
@@ -311,7 +332,11 @@
\fi
\scratchwidth\wd
\ifdim\wd\scratchboxone>\wd\scratchboxtwo
- \scratchboxone
+ \ifdim\wd\scratchboxone>\wd\scratchboxthree
+ \scratchboxone
+ \else
+ \scratchboxthree
+ \fi
\else\ifdim\wd\scratchboxtwo>\wd\scratchboxthree
\scratchboxtwo
\else
@@ -327,7 +352,9 @@
\advance\scratchwidth2\scratchhoffset
%
\ifcase#method\relax
+ \dostarttagged\t!mathstackermid\empty
\setbox\scratchboxthree\csname\??mathstackersalternative\p_alternative\endcsname
+ \dostoptagged
\fi
%
\ifdim\wd\scratchboxone<\scratchwidth
@@ -370,30 +397,54 @@
\fi
%
\math_stackers_normalize_three
- %
- \math_stackers_middle\bgroup
- \box\scratchboxthree
- \egroup
- %
- \ifdim\htdp\scratchboxone>\zeropoint
- \scratchoffset\dimexpr\scratchvoffset
- \kern-\scratchwidth
- \math_stackers_top\bgroup
- \raise\dimexpr\dp\scratchboxone+\scratchheight+\scratchoffset+\scratchtopoffset\relax
- \box\scratchboxone
+ % analysis
+ \ifdim\htdp\scratchboxtwo>\zeropoint
+ \ifdim\htdp\scratchboxone>\zeropoint
+ \dosettagproperty\s!subtype\t!munderover
+ \else
+ \dosettagproperty\s!subtype\t!munder
+ \fi
+ \else
+ \ifdim\htdp\scratchboxone>\zeropoint
+ \dosettagproperty\s!subtype\t!mover
+ \else
+ % brrr
+ \fi
+ \fi
+ % base
+ \math_stackers_start_tagged_mid
+ \math_stackers_middle\bgroup
+ \box\scratchboxthree
\egroup
+ \math_stackers_stop_tagged
+ % under
+ \ifdim\htdp\scratchboxtwo>\zeropoint
+ \math_stackers_start_tagged_bot
+ \scratchoffset\scratchvoffset
+ \kern-\scratchwidth
+ \math_stackers_bottom\bgroup
+ \lower\dimexpr\ht\scratchboxtwo+\scratchdepth+\scratchoffset+\scratchbottomoffset\relax
+ \box\scratchboxtwo
+ \egroup
+ \math_stackers_stop_tagged
+ \fi
+ % over
+ \ifdim\htdp\scratchboxone>\zeropoint
+ \math_stackers_start_tagged_top
+ \scratchoffset\scratchvoffset
+ \kern-\scratchwidth
+ \math_stackers_top\bgroup
+ \raise\dimexpr\dp\scratchboxone+\scratchheight+\scratchoffset+\scratchtopoffset\relax
+ \box\scratchboxone
+ \egroup
+ \math_stackers_stop_tagged
\fi
%
- \ifdim\htdp\scratchboxtwo>\zeropoint
- \scratchoffset\dimexpr\scratchvoffset
- \kern-\scratchwidth
- \math_stackers_bottom\bgroup
- \lower\dimexpr\ht\scratchboxtwo+\scratchdepth+\scratchoffset+\scratchbottomoffset\relax
- \box\scratchboxtwo
- \egroup
- \fi}%
+ }%
+ \dostoptagged
\mathstackersparameter\c!right\relax
\endgroup}
+ %\math_stackers_start_group}
\unexpanded\def\definemathextensible
{\dotripleempty\math_stackers_define_normal}
@@ -449,13 +500,25 @@
\def\math_class_by_parameter_indeed#1%
{\csname\??mathclasses\ifcsname\??mathclasses#1\endcsname#1\fi\endcsname}
-\unexpanded\def\math_stackers_make_double#top#bottom#category#codepoint#codeextra#text%
+% 1 0 name n 0 | 0 1 name n 0 | 1 1 name n n
+
+\unexpanded\def\math_stackers_start_group#category%
{\begingroup
\edef\currentmathstackers{#category}%
+ \edef\p_limits{\mathstackersparameter\c!mathlimits}%
+ \ifx\p_limits\v!yes
+ \def\math_stackers_stop_group{\egroup\endgroup\limits}%
+ \mathop\bgroup
+ \else
+ \let\math_stackers_stop_group\endgroup
+ \fi}
+
+\unexpanded\def\math_stackers_make_double#top#bottom#category#codepoint#codeextra#text%
+ {\math_stackers_start_group{#category}%
\mathstackersparameter\c!left\relax
+ \dostarttagged\t!mathstacker\currentmathstackers
\ifmmode\math_class_by_parameter\mathstackersparameter\else\dontleavehmode\fi
- {\edef\currentmathstackers{#category}%
- \edef\m_math_stackers_text_middle {#text}%
+ {\edef\m_math_stackers_text_middle {#text}%
%
\edef\p_offset {\mathstackersparameter\c!offset}%
\edef\p_location {\mathstackersparameter\c!location}%
@@ -467,7 +530,7 @@
%
\math_stackers_check_unicode{#codepoint}%
%
- \ifx\currentmathtext\empty
+ \ifx\math_stackers_middle\empty
\setbox\scratchboxthree\emptyhbox
\else
\setmathtextbox\scratchboxthree\hbox{\math_stackers_middletext}%
@@ -480,44 +543,74 @@
\fi
\advance\scratchwidth2\scratchhoffset
%
- \setbox\scratchboxtwo \csname\??mathstackersalternative\p_alternative\endcsname
+ \setbox\scratchboxtwo\csname\??mathstackersalternative\p_alternative\endcsname
\setbox\scratchboxthree\hbox to \scratchwidth{\hss\box\scratchboxthree\hss}%
%
- \math_stackers_normalize_three
+ \scratchunicode#codeextra\relax
+ \ifcase\scratchunicode\else
+ \setbox\scratchboxone\csname\??mathstackersalternative\p_alternative\endcsname
+ \fi
%
- \math_stackers_middle\bgroup
- \box\scratchboxthree
- \egroup
+ \math_stackers_normalize_three
+ % analysis
+ \ifcase#bottom\relax
+ \ifcase#top\relax
+ \dosettagproperty\s!subtype\t!munderover
+ \else
+ \dosettagproperty\s!subtype\t!mover
+ \fi
+ \else
+ \ifcase#top\relax
+ \dosettagproperty\s!subtype\t!munder
+ \else
+ % brrr
+ \fi
+ \fi
+ % base
+ \math_stackers_start_tagged_mid
+ \math_stackers_middle\bgroup
+ \box\scratchboxthree
+ \egroup
+ \math_stackers_stop_tagged
%
\ifdim\htdp\scratchboxtwo>\zeropoint
- \kern-\scratchwidth
- \ifcase#top\else
- \math_stackers_top\bgroup
- % \raise\dimexpr\scratchheight+\scratchtopoffset\relax
- \raise\dimexpr\scratchheight+\mathstackersparameter\c!voffset\relax
- \box\scratchboxtwo
- \egroup
- \fi
- \scratchunicode#codeextra\relax
- \ifcase\scratchunicode\else
+ \ifcase#bottom\else
\kern-\scratchwidth
- \setbox\scratchboxtwo\csname\??mathstackersalternative\p_alternative\endcsname
+ % under
+ \math_stackers_start_tagged_bot
+ \math_stackers_bottom\bgroup
+ \lower\dimexpr
+ \scratchdepth
+ +\ht\scratchboxtwo
+ +\mathstackersparameter\c!distance % was \c!voffset
+ \relax
+ \ifcase#top\relax
+ \box\scratchboxtwo
+ \else
+ \box\scratchboxone
+ \fi
+ \egroup
+ \math_stackers_stop_tagged
\fi
- \ifcase#bottom\else
- \math_stackers_bottom\bgroup
- % \lower\dimexpr\scratchdepth+\ht\scratchboxtwo+\scratchbottomoffset\relax
- \lower\dimexpr\scratchdepth+\ht\scratchboxtwo+\mathstackersparameter\c!voffset\relax
- \box\scratchboxtwo
- \egroup
+ \ifcase#top\else
+ \kern-\scratchwidth
+ % over
+ \math_stackers_start_tagged_top
+ \math_stackers_top\bgroup
+ \raise\dimexpr
+ \scratchheight
+ +\dp\scratchboxtwo % new
+ +\mathstackersparameter\c!distance % was \c!voffset
+ \relax
+ \box\scratchboxtwo
+ \egroup
+ \math_stackers_stop_tagged
\fi
+ %
\fi}%
+ \dostoptagged
\mathstackersparameter\c!right\relax
- \edef\p_limits{\mathstackersparameter\c!mathlimits}%
- \ifx\p_limits\v!yes
- \expandafter\endgroup\expandafter\limits
- \else
- \expandafter\endgroup
- \fi}
+ \math_stackers_stop_group}
\unexpanded\def\definemathoverextensible {\dotripleempty \math_extensibles_define_over }
\unexpanded\def\definemathunderextensible {\dotripleempty \math_extensibles_define_under}
@@ -551,14 +644,173 @@
\def\math_stackers_handle_over[#category]%
{\math_stackers_direct_double\plusone\zerocount{\iffirstargument#category\else\v!top \fi}} % will be defined later on
-\def\math_stackers_handle_under[#category]#codepoint#bottomtext%
+\def\math_stackers_handle_under[#category]%
{\math_stackers_direct_double\zerocount\plusone{\iffirstargument#category\else\v!bottom\fi}} % will be defined later on
-\def\math_stackers_handle_double[#category]#codepoint#bottomtext%
+\def\math_stackers_handle_double[#category]%
{\math_stackers_direct_double\plusone\plusone {\iffirstargument#category\else\v!bottom\fi}} % will be defined later on
\def\math_stackers_direct_double#top#bottom#category#codepoint#text%
- {\math_stackers_make_double#top#bottom{#category}{#codepoint}{#text}%
+ {\math_stackers_make_double#top#bottom{#category}{#codepoint}{0}{#text}%
+ \endgroup}
+
+%D A relative new one is a combination of accents and text (as needed in mathml):
+
+\unexpanded\def\math_stackers_make_double_text#where#category#codepoint#text#extra%
+ {\math_stackers_start_group{#category}%
+ \mathstackersparameter\c!left\relax
+ \dostarttagged\t!mathstacker\currentmathstackers
+ \ifmmode\math_class_by_parameter\mathstackersparameter\else\dontleavehmode\fi
+ {\edef\currentmathstackers{#category}%
+ %
+ \edef\p_offset {\mathstackersparameter\c!offset}%
+ \edef\p_location {\mathstackersparameter\c!location}%
+ \edef\p_strut {\mathstackersparameter\c!strut}%
+ \edef\p_alternative{\mathstackersparameter\c!alternative}%
+ %
+ \scratchleftoffset \zeropoint
+ \scratchrightoffset\zeropoint
+ %
+ \edef\m_math_stackers_text_middle{#text}%
+ \math_stackers_check_unicode{#codepoint}%
+ \scratchunicode#codepoint\relax
+ %
+ \ifx\math_stackers_middle\empty
+ \setbox\scratchboxthree\emptyhbox
+ \else
+ \setmathtextbox\scratchboxthree\hbox{\math_stackers_middletext}%
+ \fi
+ %
+ \ifcase#where\relax
+ \edef\m_math_stackers_text_top{#extra}%
+ \ifx\math_stackers_top\empty
+ \setbox\scratchboxone\emptyhbox
+ \else
+ \setmathsmalltextbox\scratchboxone\hbox{\math_stackers_toptext}%
+ \fi
+ \else
+ \edef\m_math_stackers_text_bottom{#extra}%
+ \ifx\math_stackers_bottom\empty
+ \setbox\scratchboxone\emptyhbox
+ \else
+ \setmathsmalltextbox\scratchboxone\hbox{\math_stackers_bottomtext}%
+ \fi
+ \fi
+ %
+ \scratchwidth\wd
+ \ifdim\wd\scratchboxone>\wd\scratchboxthree
+ \scratchboxone
+ \else
+ \scratchboxthree
+ \fi
+ \relax
+ \scratchdimen\mathstackersparameter\c!minwidth\relax
+ \ifdim\scratchwidth<\scratchdimen
+ \scratchwidth\scratchdimen
+ \fi
+ \advance\scratchwidth2\scratchhoffset
+ %
+ \ifdim\wd\scratchboxone<\scratchwidth
+ \setbox\scratchboxone\hbox to \scratchwidth{\hss\unhbox\scratchboxone\hss}%
+ \fi
+ \ifdim\wd\scratchboxthree<\scratchwidth
+ \setbox\scratchboxthree\hbox to \scratchwidth{\hss\unhbox\scratchboxthree\hss}%
+ \fi
+ %
+ \math_stackers_normalize_three
+ % analysis
+ \dosettagproperty\s!subtype\t!munderover
+ % base
+ \math_stackers_start_tagged_mid
+ \math_stackers_middle\bgroup
+ \box\scratchboxthree
+ \egroup
+ \math_stackers_stop_tagged
+ %
+ \setbox\scratchboxtwo\csname\??mathstackersalternative\p_alternative\endcsname
+ \kern-\scratchwidth
+ \ifcase#where\relax
+ % under
+ \math_stackers_start_tagged_bot
+ \math_stackers_bottom\bgroup
+ \lower\dimexpr
+ \scratchdepth
+ +\ht\scratchboxtwo
+ +\mathstackersparameter\c!distance
+ \relax
+ \box\scratchboxtwo % accent
+ \egroup
+ \math_stackers_stop_tagged
+ \kern-\scratchwidth
+ % over
+ \math_stackers_start_tagged_top
+ \math_stackers_top\bgroup
+ \raise\dimexpr
+ \scratchheight
+ +\dp\scratchboxone
+ +\mathstackersparameter\c!voffset
+ \relax
+ \box\scratchboxone % toptext
+ \egroup
+ \math_stackers_stop_tagged
+ \else
+ % under
+ \math_stackers_start_tagged_bot
+ \math_stackers_bottom\bgroup
+ \lower\dimexpr
+ \scratchdepth
+ +\ht\scratchboxone
+ +\mathstackersparameter\c!voffset
+ \relax
+ \box\scratchboxone % bottext
+ \egroup
+ \math_stackers_stop_tagged
+ \kern-\scratchwidth
+ % over
+ \math_stackers_start_tagged_top
+ \math_stackers_top\bgroup
+ \raise\dimexpr
+ \scratchheight
+ +\dp\scratchboxtwo % new
+ +\mathstackersparameter\c!distance
+ \relax
+ \box\scratchboxtwo % accent
+ \egroup
+ \math_stackers_stop_tagged
+ \fi
+ }%
+ \dostoptagged
+ \mathstackersparameter\c!right\relax
+ \math_stackers_stop_group}
+
+\unexpanded\def\definemathovertextextensible {\dotripleempty\math_extensibles_define_over_text }
+\unexpanded\def\definemathundertextextensible{\dotripleempty\math_extensibles_define_under_text}
+
+\def\math_extensibles_define_over_text[#1][#2][#3]%
+ {\ifthirdargument
+ \setuevalue{#2}{\math_stackers_make_double_text\plusone {#1}{\number#3}}%
+ \else
+ \setuevalue{#1}{\math_stackers_make_double_text\plusone \noexpand\currentmathstackers{\number#2}}%
+ \fi}
+
+\def\math_extensibles_define_under_text[#1][#2][#3]%
+ {\ifthirdargument
+ \setuevalue{#2}{\math_stackers_make_double_text\zerocount{#1}{\number#3}}%
+ \else
+ \setuevalue{#1}{\math_stackers_make_double_text\zerocount\noexpand\currentmathstackers{\number#2}}%
+ \fi}
+
+\unexpanded\def\mathovertext {\begingroup\dosingleempty\math_stackers_handle_over_text }
+\unexpanded\def\mathundertext{\begingroup\dosingleempty\math_stackers_handle_under_text }
+
+\def\math_stackers_handle_over_text[#category]%
+ {\math_stackers_direct_double_text\plusone {\iffirstargument#category\else\v!top \fi}} % will be defined later on
+
+\def\math_stackers_handle_under_text[#category]%
+ {\math_stackers_direct_double_text\zerocount{\iffirstargument#category\else\v!bottom\fi}} % will be defined later on
+
+\def\math_stackers_direct_double_text#where#category#codepoint#text#extra%%
+ {\math_stackers_make_double_text#where{#category}{#codepoint}{#text}{#extra}%
\endgroup}
%D Here is a bonus macro that takes three texts. It can be used to get consistent
@@ -654,11 +906,23 @@
[\v!both]
\definemathstackers
- [vfenced]
+ [\v!vfenced]
[\v!both]
[\c!mathclass=\s!ord,
\c!mathlimits=\v!yes]
+% these are needed for mathml:
+
+% \setupmathstackers
+% [\v!both]
+% [\c!hoffset=1pt,
+% \c!voffset=1pt]
+
+\definemathstackers
+ [\v!bothtext]
+ [\v!both]
+ [\c!strut=\v!yes]
+
% These are compatibity definitions, math only.
% todo: top= bottom= middle= is nicer (compare math-fen)
@@ -761,6 +1025,24 @@
\definemathextensible [\v!mathematics] [mrightleftharpoons] ["21CC]
\definemathextensible [\v!mathematics] [mtriplerel] ["2261]
+\definemathextensible [\v!mathematics] [eleftarrowfill] ["2190] % ["27F5]
+\definemathextensible [\v!mathematics] [erightarrowfill] ["2192] % ["27F6]
+\definemathextensible [\v!mathematics] [eleftrightarrowfill] ["27F7]
+\definemathextensible [\v!mathematics] [etwoheadrightarrowfill] ["27F9]
+\definemathextensible [\v!mathematics] [eleftharpoondownfill] ["21BD]
+\definemathextensible [\v!mathematics] [eleftharpoonupfill] ["21BC]
+\definemathextensible [\v!mathematics] [erightharpoondownfill] ["21C1]
+\definemathextensible [\v!mathematics] [erightharpoonupfill] ["21C0]
+
+\definemathextensible [\v!mathematics] [eoverbarfill] ["FE33E]
+\definemathextensible [\v!mathematics] [eunderbarfill] ["FE33F]
+\definemathextensible [\v!mathematics] [eoverbracefill] ["FE3DE]
+\definemathextensible [\v!mathematics] [eunderbracefill] ["FE3DF]
+\definemathextensible [\v!mathematics] [eoverparentfill] ["FE3DC]
+\definemathextensible [\v!mathematics] [eunderparentfill] ["FE3DD]
+\definemathextensible [\v!mathematics] [eoverbracketfill] ["FE3B4]
+\definemathextensible [\v!mathematics] [eunderbracketfill] ["FE3B5]
+
\definemathextensible [\v!text] [trel] ["002D]
\definemathextensible [\v!text] [tequal] ["003D]
\definemathextensible [\v!text] [tmapsto] ["21A6]
@@ -819,23 +1101,39 @@
% alternatively we can move the original to FE*
\definemathoverextensible [vfenced] [overbar] ["FE33E] % ["203E]
-\definemathunderextensible [vfenced] [underbar] ["FE33F] % ["203E]
+\definemathunderextensible [vfenced] [underbar] ["FE33F] % ["203E]
\definemathdoubleextensible [vfenced] [doublebar] ["FE33E] ["FE33F]
\definemathoverextensible [vfenced] [overbrace] ["FE3DE] % ["023DE]
-\definemathunderextensible [vfenced] [underbrace] ["FE3DF] % ["023DF]
+\definemathunderextensible [vfenced] [underbrace] ["FE3DF] % ["023DF]
\definemathdoubleextensible [vfenced] [doublebrace] ["FE3DE] ["FE3DF]
\definemathoverextensible [vfenced] [overparent] ["FE3DC] % ["023DC]
-\definemathunderextensible [vfenced] [underparent] ["FE3DD] % ["023DD]
+\definemathunderextensible [vfenced] [underparent] ["FE3DD] % ["023DD]
\definemathdoubleextensible [vfenced] [doubleparent] ["FE3DC] ["FE3DD]
\definemathoverextensible [vfenced] [overbracket] ["FE3B4] % ["023B4]
-\definemathunderextensible [vfenced] [underbracket] ["FE3B5] % ["023B5]
+\definemathunderextensible [vfenced] [underbracket] ["FE3B5] % ["023B5]
\definemathdoubleextensible [vfenced] [doublebracket] ["FE3B4] ["FE3B5]
% \unexpanded\def\mathopwithlimits#1#2{\mathop{#1{#2}}\limits}
+%D For mathml:
+
+\definemathdoubleextensible [both] [overbarunderbar] ["FE33E] ["FE33F]
+\definemathdoubleextensible [both] [overbraceunderbrace] ["FE3DE] ["FE3DF]
+\definemathdoubleextensible [both] [overparentunderparent] ["FE3DC] ["FE3DD]
+\definemathdoubleextensible [both] [overbracketunderbracket] ["FE3B4] ["FE3B5]
+
+\definemathovertextextensible [bothtext] [overbartext] ["FE33E]
+\definemathundertextextensible [bothtext] [underbartext] ["FE33F]
+\definemathovertextextensible [bothtext] [overbracetext] ["FE3DE]
+\definemathundertextextensible [bothtext] [underbracetext] ["FE3DF]
+\definemathovertextextensible [bothtext] [overparenttext] ["FE3DC]
+\definemathundertextextensible [bothtext] [underparenttext] ["FE3DD]
+\definemathovertextextensible [bothtext] [overbrackettext] ["FE3B4]
+\definemathundertextextensible [bothtext] [underbrackettext] ["FE3B5]
+
%D Some bonus ones (for the moment here):
\definemathstackers
@@ -927,6 +1225,15 @@
\defineextensiblefiller [Leftrightarrowfill] ["27FA]
\defineextensiblefiller [Leftrightarrowfill] ["27FA]
+%defineextensiblefiller [overbarfill] ["FE33E] % untested
+%defineextensiblefiller [underbarfill] ["FE33F] % untested
+\defineextensiblefiller [overbracefill] ["FE3DE] % untested
+\defineextensiblefiller [underbracefill] ["FE3DF] % untested
+\defineextensiblefiller [overparentfill] ["FE3DC] % untested
+\defineextensiblefiller [underparentfill] ["FE3DD] % untested
+\defineextensiblefiller [overbracketfill] ["FE3B4] % untested
+\defineextensiblefiller [underbracketfill] ["FE3B5] % untested
+
%D Extra:
\unexpanded\edef\singlebond{\mathematics{\mathsurround\zeropoint\char\number"002D}}
diff --git a/Master/texmf-dist/tex/context/base/math-tag.lua b/Master/texmf-dist/tex/context/base/math-tag.lua
index 3cd4cae16eb..61d28edde61 100644
--- a/Master/texmf-dist/tex/context/base/math-tag.lua
+++ b/Master/texmf-dist/tex/context/base/math-tag.lua
@@ -6,10 +6,12 @@ if not modules then modules = { } end modules ['math-tag'] = {
license = "see context related readme files"
}
+-- todo: have a local list with local tags that then get appended
+
-- use lpeg matchers
local find, match = string.find, string.match
-local insert, remove = table.insert, table.remove
+local insert, remove, concat = table.insert, table.remove, table.concat
local attributes = attributes
local nodes = nodes
@@ -22,6 +24,7 @@ local getid = nuts.getid
local getchar = nuts.getchar
local getlist = nuts.getlist
local getfield = nuts.getfield
+local getsubtype = nuts.getsubtype
local getattr = nuts.getattr
local setattr = nuts.setattr
@@ -43,15 +46,32 @@ local math_style_code = nodecodes.style -- attr style
local math_choice_code = nodecodes.choice -- attr display text script scriptscript
local math_fence_code = nodecodes.fence -- attr subtype
+local accentcodes = nodes.accentcodes
+
+local math_fixed_top = accentcodes.fixedtop
+local math_fixed_bottom = accentcodes.fixedbottom
+local math_fixed_both = accentcodes.fixedboth
+
+local kerncodes = nodes.kerncodes
+
+local fontkern_code = kerncodes.fontkern
+
local hlist_code = nodecodes.hlist
local vlist_code = nodecodes.vlist
local glyph_code = nodecodes.glyph
+local disc_code = nodecodes.disc
local glue_code = nodecodes.glue
+local kern_code = nodecodes.kern
+local math_code = nodecodes.math
+
+local processnoads = noads.process
local a_tagged = attributes.private('tagged')
+local a_taggedpar = attributes.private('taggedpar')
local a_exportstatus = attributes.private('exportstatus')
local a_mathcategory = attributes.private('mathcategory')
local a_mathmode = attributes.private('mathmode')
+local a_fontkern = attributes.private('fontkern')
local tags = structures.tags
@@ -67,33 +87,53 @@ local mathcodes = mathematics.codes
local ordinary_code = mathcodes.ordinary
local variable_code = mathcodes.variable
+local fromunicode16 = fonts.mappings.fromunicode16
+local font_of_family = node.family_font
+local fontcharacters = fonts.hashes.characters
+
+local report_tags = logs.reporter("structure","tags")
+
local process
local function processsubsup(start)
-- At some point we might need to add an attribute signaling the
-- super- and subscripts because TeX and MathML use a different
- -- order.
+ -- order. The mrows are needed to keep mn's separated.
local nucleus = getfield(start,"nucleus")
local sup = getfield(start,"sup")
local sub = getfield(start,"sub")
if sub then
if sup then
setattr(start,a_tagged,start_tagged("msubsup"))
+ -- start_tagged("mrow")
process(nucleus)
+ -- stop_tagged()
+ start_tagged("mrow")
process(sub)
+ stop_tagged()
+ start_tagged("mrow")
process(sup)
stop_tagged()
+ stop_tagged()
else
setattr(start,a_tagged,start_tagged("msub"))
+ -- start_tagged("mrow")
process(nucleus)
+ -- stop_tagged()
+ start_tagged("mrow")
process(sub)
stop_tagged()
+ stop_tagged()
end
elseif sup then
setattr(start,a_tagged,start_tagged("msup"))
+ -- start_tagged("mrow")
process(nucleus)
+ -- stop_tagged()
+ start_tagged("mrow")
process(sup)
stop_tagged()
+ stop_tagged()
else
process(nucleus)
end
@@ -104,263 +144,407 @@ end
-- todo: variants -> original
local actionstack = { }
+local fencesstack = { }
+
+-- glyph nodes and such can happen in under and over stuff
+
+local function getunicode(n) -- instead of getchar
+ local char = getchar(n)
+ local font = font_of_family(getfield(n,"fam")) -- font_of_family
+ local data = fontcharacters[font][char]
+ return data.unicode or char
+end
+
+-------------------
+
+local content = { }
+local found = false
+
+content[math_char_code] = function() found = true end
+
+local function hascontent(head)
+ found = false
+ processnoads(head,content,"content")
+ return found
+end
+
+--------------------
+
+local function showtag(n,id)
+ local attr = getattr(n,a_tagged)
+ report_tags("%s = %s",nodecodes[id or getid(n)],attr and taglist[attr].tagname or "?")
+end
process = function(start) -- we cannot use the processor as we have no finalizers (yet)
+ local mtexttag = nil
while start do
local id = getid(start)
- if id == math_char_code then
- local char = getchar(start)
- -- check for code
- local a = getattr(start,a_mathcategory)
- if a then
- a = { detail = a }
+
+-- showtag(start,id)
+
+ if id == glyph_code or id == disc_code then
+ if not mtexttag then
+ mtexttag = start_tagged("mtext")
end
- local code = getmathcode(char)
- if code then
- code = code[1]
+ setattr(start,a_tagged,mtexttag)
+ elseif mtexttag and id == kern_code and (getsubtype(start) == fontkern_code or getattr(start,a_fontkern)) then
+ setattr(start,a_tagged,mtexttag)
+ else
+ if mtexttag then
+ stop_tagged()
+ mtexttag = nil
end
- local tag
- if code == ordinary_code or code == variable_code then
- local ch = chardata[char]
- local mc = ch and ch.mathclass
- if mc == "number" then
- tag = "mn"
- elseif mc == "variable" or not mc then -- variable is default
- tag = "mi"
+ if id == math_char_code then
+ local char = getchar(start)
+ local code = getmathcode(char)
+ if code then
+ code = code[1]
+ end
+ local tag
+ if code == ordinary_code or code == variable_code then
+ local ch = chardata[char]
+ local mc = ch and ch.mathclass
+ if mc == "number" then
+ tag = "mn"
+ elseif mc == "variable" or not mc then -- variable is default
+ tag = "mi"
+ else
+ tag = "mo"
+ end
else
tag = "mo"
end
- else
- tag = "mo"
- end
- setattr(start,a_tagged,start_tagged(tag,a))
- stop_tagged()
- break -- okay?
- elseif id == math_textchar_code then
- -- check for code
- local a = getattr(start,a_mathcategory)
- if a then
- setattr(start,a_tagged,start_tagged("ms",{ detail = a }))
- else
- setattr(start,a_tagged,start_tagged("ms"))
- end
- stop_tagged()
- break
- elseif id == math_delim_code then
- -- check for code
- setattr(start,a_tagged,start_tagged("mo"))
- stop_tagged()
- break
- elseif id == math_style_code then
- -- has a next
- elseif id == math_noad_code then
- processsubsup(start)
- elseif id == math_box_code or id == hlist_code or id == vlist_code then
- -- keep an eye on math_box_code and see what ends up in there
- local attr = getattr(start,a_tagged)
- local last = attr and taglist[attr]
- if last and find(last[#last],"formulacaption[:%-]") then
- -- leave alone, will nicely move to the outer level
- else
- local text = start_tagged("mtext")
- setattr(start,a_tagged,text)
- local list = getfield(start,"list")
- if not list then
- -- empty list
- elseif not attr then
- -- box comes from strange place
- set_attributes(list,a_tagged,text)
+ local a = getattr(start,a_mathcategory)
+ if a then
+ setattr(start,a_tagged,start_tagged(tag,{ mathcategory = a }))
else
- -- Beware, the first node in list is the actual list so we definitely
- -- need to nest. This approach is a hack, maybe I'll make a proper
- -- nesting feature to deal with this at another level. Here we just
- -- fake structure by enforcing the inner one.
- local tagdata = taglist[attr]
- local common = #tagdata + 1
- local function runner(list) -- quite inefficient
- local cache = { } -- we can have nested unboxed mess so best local to runner
- for n in traverse_nodes(list) do
- local id = getid(n)
- local aa = getattr(n,a_tagged)
- if aa then
- local ac = cache[aa]
- if not ac then
- local tagdata = taglist[aa]
- local extra = #tagdata
- if common <= extra then
- for i=common,extra do
- ac = restart_tagged(tagdata[i]) -- can be made faster
- end
- for i=common,extra do
- stop_tagged() -- can be made faster
+ setattr(start,a_tagged,start_tagged(tag)) -- todo: a_mathcategory
+ end
+ stop_tagged()
+ break -- okay?
+ elseif id == math_textchar_code then -- or id == glyph_code
+ -- check for code
+ local a = getattr(start,a_mathcategory)
+ if a then
+ setattr(start,a_tagged,start_tagged("ms",{ mathcategory = a })) -- mtext
+ else
+ setattr(start,a_tagged,start_tagged("ms")) -- mtext
+ end
+ stop_tagged()
+ break
+ elseif id == math_delim_code then
+ -- check for code
+ setattr(start,a_tagged,start_tagged("mo"))
+ stop_tagged()
+ break
+ elseif id == math_style_code then
+ -- has a next
+ elseif id == math_noad_code then
+ processsubsup(start)
+ elseif id == math_box_code or id == hlist_code or id == vlist_code then
+ -- keep an eye on math_box_code and see what ends up in there
+ local attr = getattr(start,a_tagged)
+ local specification = taglist[attr]
+ local tag = specification.tagname
+ if tag == "formulacaption" then
+ -- skip
+ elseif tag == "mstacker" then
+ local list = getfield(start,"list")
+ if list then
+ process(list)
+ end
+ else
+ if tag ~= "mstackertop" and tag ~= "mstackermid" and tag ~= "mstackerbot" then
+ tag = "mtext"
+ end
+ local text = start_tagged(tag)
+ setattr(start,a_tagged,text)
+ local list = getfield(start,"list")
+ if not list then
+ -- empty list
+ elseif not attr then
+ -- box comes from strange place
+ set_attributes(list,a_tagged,text) -- only the first node ?
+ else
+ -- Beware, the first node in list is the actual list so we definitely
+ -- need to nest. This approach is a hack, maybe I'll make a proper
+ -- nesting feature to deal with this at another level. Here we just
+ -- fake structure by enforcing the inner one.
+ --
+ -- todo: have a local list with local tags that then get appended
+ --
+ local tagdata = specification.taglist
+ local common = #tagdata + 1
+ local function runner(list,depth) -- quite inefficient
+ local cache = { } -- we can have nested unboxed mess so best local to runner
+ local keep = nil
+ -- local keep = { } -- win case we might need to move keep outside
+ for n in traverse_nodes(list) do
+ local id = getid(n)
+ local mth = id == math_code and getsubtype(n)
+ if mth == 0 then
+ -- insert(keep,text)
+ keep = text
+ text = start_tagged("mrow")
+ common = common + 1
+ end
+ local aa = getattr(n,a_tagged)
+ if aa then
+ local ac = cache[aa]
+ if not ac then
+ local tagdata = taglist[aa].taglist
+ local extra = #tagdata
+ if common <= extra then
+ for i=common,extra do
+ ac = restart_tagged(tagdata[i]) -- can be made faster
+ end
+ for i=common,extra do
+ stop_tagged() -- can be made faster
+ end
+ else
+ ac = text
end
- else
- ac = text
+ cache[aa] = ac
end
- cache[aa] = ac
+ setattr(n,a_tagged,ac)
+ else
+ setattr(n,a_tagged,text)
+ end
+
+ if id == hlist_code or id == vlist_code then
+ runner(getlist(n),depth+1)
+ elseif id == glyph_code then
+ runner(getfield(n,"components"),depth+1) -- this should not be needed
+ elseif id == disc_node then
+ runner(getfield(n,"pre"),depth+1) -- idem
+ runner(getfield(n,"post"),depth+1) -- idem
+ runner(getfield(n,"replace"),depth+1) -- idem
+ end
+ if mth == 1 then
+ stop_tagged()
+ -- text = remove(keep)
+ text = keep
+ common = common - 1
end
- setattr(n,a_tagged,ac)
- else
- setattr(n,a_tagged,text)
- end
- if id == hlist_code or id == vlist_code then
- runner(getlist(n))
end
end
+ runner(list,0)
end
- runner(list)
+ stop_tagged()
end
- stop_tagged()
- end
- elseif id == math_sub_code then
- local list = getfield(start,"list")
- if list then
- local attr = getattr(start,a_tagged)
- local last = attr and taglist[attr]
- local action = last and match(last[#last],"maction:(.-)%-")
- if action and action ~= "" then
- if actionstack[#actionstack] == action then
+ elseif id == math_sub_code then -- normally a hbox
+ local list = getfield(start,"list")
+ if list then
+ local attr = getattr(start,a_tagged)
+ local last = attr and taglist[attr]
+ if last then
+ local tag = last.tagname
+ local detail = last.detail
+ if tag == "maction" then
+ if detail == "" then
+ setattr(start,a_tagged,start_tagged("mrow"))
+ process(list)
+ stop_tagged()
+ elseif actionstack[#actionstack] == action then
+ setattr(start,a_tagged,start_tagged("mrow"))
+ process(list)
+ stop_tagged()
+ else
+ insert(actionstack,action)
+ setattr(start,a_tagged,start_tagged("mrow",{ detail = action }))
+ process(list)
+ stop_tagged()
+ remove(actionstack)
+ end
+ elseif tag == "mstacker" then -- or tag == "mstackertop" or tag == "mstackermid" or tag == "mstackerbot" then
+ -- looks like it gets processed twice
+-- do we still end up here ?
+ setattr(start,a_tagged,restart_tagged(attr)) -- so we just reuse the attribute
+ process(list)
+ stop_tagged()
+ else
+ setattr(start,a_tagged,start_tagged("mrow"))
+ process(list)
+ stop_tagged()
+ end
+ else -- never happens, we're always document
setattr(start,a_tagged,start_tagged("mrow"))
process(list)
stop_tagged()
- else
- insert(actionstack,action)
- setattr(start,a_tagged,start_tagged("mrow",{ detail = action }))
- process(list)
- stop_tagged()
- remove(actionstack)
end
- else
- setattr(start,a_tagged,start_tagged("mrow"))
- process(list)
- stop_tagged()
end
- end
- elseif id == math_fraction_code then
- local num = getfield(start,"num")
- local denom = getfield(start,"denom")
- local left = getfield(start,"left")
- local right = getfield(start,"right")
- if left then
- setattr(left,a_tagged,start_tagged("mo"))
- process(left)
- stop_tagged()
- end
- setattr(start,a_tagged,start_tagged("mfrac"))
- process(num)
- process(denom)
- stop_tagged()
- if right then
- setattr(right,a_tagged,start_tagged("mo"))
- process(right)
+ elseif id == math_fraction_code then
+ local num = getfield(start,"num")
+ local denom = getfield(start,"denom")
+ local left = getfield(start,"left")
+ local right = getfield(start,"right")
+ if left then
+ setattr(left,a_tagged,start_tagged("mo"))
+ process(left)
+ stop_tagged()
+ end
+ setattr(start,a_tagged,start_tagged("mfrac"))
+ process(num)
+ process(denom)
stop_tagged()
- end
- elseif id == math_choice_code then
- local display = getfield(start,"display")
- local text = getfield(start,"text")
- local script = getfield(start,"script")
- local scriptscript = getfield(start,"scriptscript")
- if display then
- process(display)
- end
- if text then
- process(text)
- end
- if script then
- process(script)
- end
- if scriptscript then
- process(scriptscript)
- end
- elseif id == math_fence_code then
- local delim = getfield(start,"delim")
- local subtype = getfield(start,"subtype")
- -- setattr(start,a_tagged,start_tagged("mfenced")) -- needs checking
- if subtype == 1 then
- -- left
- if delim then
- setattr(start,a_tagged,start_tagged("mleft"))
- process(delim)
+ if right then
+ setattr(right,a_tagged,start_tagged("mo"))
+ process(right)
stop_tagged()
end
- elseif subtype == 2 then
- -- middle
- if delim then
- setattr(start,a_tagged,start_tagged("mmiddle"))
- process(delim)
+ elseif id == math_choice_code then
+ local display = getfield(start,"display")
+ local text = getfield(start,"text")
+ local script = getfield(start,"script")
+ local scriptscript = getfield(start,"scriptscript")
+ if display then
+ process(display)
+ end
+ if text then
+ process(text)
+ end
+ if script then
+ process(script)
+ end
+ if scriptscript then
+ process(scriptscript)
+ end
+ elseif id == math_fence_code then
+ local delim = getfield(start,"delim")
+ local subtype = getfield(start,"subtype")
+ if subtype == 1 then
+ -- left
+ local properties = { }
+ insert(fencesstack,properties)
+ setattr(start,a_tagged,start_tagged("mfenced",{ properties = properties })) -- needs checking
+ if delim then
+ start_tagged("ignore")
+ local chr = getfield(delim,"small_char")
+ if chr ~= 0 then
+ properties.left = chr
+ end
+ process(delim)
+ stop_tagged()
+ end
+ start_tagged("mrow") -- begin of subsequence
+ elseif subtype == 2 then
+ -- middle
+ if delim then
+ start_tagged("ignore")
+ local top = fencesstack[#fencesstack]
+ local chr = getfield(delim,"small_char")
+ if chr ~= 0 then
+ local mid = top.middle
+ if mid then
+ mid[#mid+1] = chr
+ else
+ top.middle = { chr }
+ end
+ end
+ process(delim)
+ stop_tagged()
+ end
+ stop_tagged() -- end of subsequence
+ start_tagged("mrow") -- begin of subsequence
+ elseif subtype == 3 then
+ local properties = remove(fencesstack)
+ if not properties then
+ report_tags("missing right fence")
+ properties = { }
+ end
+ if delim then
+ start_tagged("ignore")
+ local chr = getfield(delim,"small_char")
+ if chr ~= 0 then
+ properties.right = chr
+ end
+ process(delim)
+ stop_tagged()
+ end
+ stop_tagged() -- end of subsequence
stop_tagged()
+ else
+ -- can't happen
end
- elseif subtype == 3 then
- if delim then
- setattr(start,a_tagged,start_tagged("mright"))
- process(delim)
+ elseif id == math_radical_code then
+ local left = getfield(start,"left")
+ local degree = getfield(start,"degree")
+ if left then
+ start_tagged("ignore")
+ process(left) -- root symbol, ignored
stop_tagged()
end
- else
- -- can't happen
- end
- -- stop_tagged()
- elseif id == math_radical_code then
- local left = getfield(start,"left")
- local degree = getfield(start,"degree")
- if left then
- start_tagged("")
- process(left) -- root symbol, ignored
- stop_tagged()
- end
- if degree then -- not good enough, can be empty mlist
- setattr(start,a_tagged,start_tagged("mroot"))
- processsubsup(start)
- process(degree)
- stop_tagged()
- else
- setattr(start,a_tagged,start_tagged("msqrt"))
- processsubsup(start)
- stop_tagged()
- end
- elseif id == math_accent_code then
- local accent = getfield(start,"accent")
- local bot_accent = getfield(start,"bot_accent")
- if bot_accent then
- if accent then
- setattr(start,a_tagged,start_tagged("munderover",{ detail = "accent" }))
+ if degree and hascontent(degree) then
+ setattr(start,a_tagged,start_tagged("mroot"))
processsubsup(start)
- process(bot_accent)
- process(accent)
+ process(degree)
stop_tagged()
else
- setattr(start,a_tagged,start_tagged("munder",{ detail = "accent" }))
+ setattr(start,a_tagged,start_tagged("msqrt"))
processsubsup(start)
- process(bot_accent)
stop_tagged()
end
- elseif accent then
- setattr(start,a_tagged,start_tagged("mover",{ detail = "accent" }))
- processsubsup(start)
- process(accent)
+ elseif id == math_accent_code then
+ local accent = getfield(start,"accent")
+ local bot_accent = getfield(start,"bot_accent")
+ local subtype = getsubtype(start)
+ if bot_accent then
+ if accent then
+ setattr(start,a_tagged,start_tagged("munderover", {
+ accent = true,
+ top = getunicode(accent),
+ bottom = getunicode(bot_accent),
+ topfixed = subtype == math_fixed_top or subtype == math_fixed_both,
+ bottomfixed = subtype == math_fixed_bottom or subtype == math_fixed_both,
+ }))
+ processsubsup(start)
+ process(bot_accent)
+ process(accent)
+ stop_tagged()
+ else
+ setattr(start,a_tagged,start_tagged("munder", {
+ accent = true,
+ bottom = getunicode(bot_accent),
+ bottomfixed = subtype == math_fixed_bottom or subtype == math_fixed_both,
+ }))
+ processsubsup(start)
+ process(bot_accent)
+ stop_tagged()
+ end
+ elseif accent then
+ setattr(start,a_tagged,start_tagged("mover", {
+ accent = true,
+ top = getunicode(accent),
+ topfixed = subtype == math_fixed_top or subtype == math_fixed_both,
+ }))
+ processsubsup(start)
+ process(accent)
+ stop_tagged()
+ else
+ processsubsup(start)
+ end
+ elseif id == glue_code then
+ -- local spec = getfield(start,"spec")
+ -- setattr(start,a_tagged,start_tagged("mspace",{ width = getfield(spec,"width") }))
+ setattr(start,a_tagged,start_tagged("mspace"))
stop_tagged()
else
- processsubsup(start)
+ setattr(start,a_tagged,start_tagged("merror", { detail = nodecodes[i] }))
+ stop_tagged()
end
- elseif id == glue_code then
- setattr(start,a_tagged,start_tagged("mspace"))
- stop_tagged()
- else
- setattr(start,a_tagged,start_tagged("merror", { detail = nodecodes[i] }))
- stop_tagged()
end
start = getnext(start)
end
+ if mtexttag then
+ stop_tagged()
+ end
end
function noads.handlers.tags(head,style,penalties)
head = tonut(head)
- local v_math = start_tagged("math")
- local v_mrow = start_tagged("mrow")
local v_mode = getattr(head,a_mathmode)
- -- setattr(head,a_tagged,v_math)
- setattr(head,a_tagged,v_mrow)
- tags.setattributehash(v_math,"mode",v_mode == 1 and "display" or "inline")
+ local v_math = start_tagged("math", { mode = v_mode == 1 and "display" or "inline" })
+ setattr(head,a_tagged,start_tagged("mrow"))
process(head)
stop_tagged()
stop_tagged()
diff --git a/Master/texmf-dist/tex/context/base/math-vfu.lua b/Master/texmf-dist/tex/context/base/math-vfu.lua
index 6d9a9f903bc..a683e02cfdc 100644
--- a/Master/texmf-dist/tex/context/base/math-vfu.lua
+++ b/Master/texmf-dist/tex/context/base/math-vfu.lua
@@ -41,6 +41,8 @@ local allocate = utilities.storage.allocate
local setmetatableindex = table.setmetatableindex
local formatters = string.formatters
+local chardata = characters.data
+
local mathencodings = allocate()
fonts.encodings.math = mathencodings -- better is then: fonts.encodings.vectors
local vfmath = allocate()
@@ -432,6 +434,14 @@ local function repeated(main,characters,id,size,unicode,u,n,private,fraction) --
end
end
+local function cloned(main,characters,id,size,source,target)
+ local data = characters[source]
+ if data then
+ characters[target] = data
+ return true
+ end
+end
+
-- we use the fact that context defines the smallest sizes first .. a real dirty and ugly hack
local data_of_smaller = nil
@@ -451,10 +461,11 @@ function vfmath.addmissing(main,id,size)
-- here id is the index in fonts (normally 14 or so) and that slot points to self
- local characters = main.characters
- local shared = main.shared
- local variables = main.goodies.mathematics and main.goodies.mathematics.variables or { }
+ local characters = main.characters
+ local shared = main.shared
+ local variables = main.goodies.mathematics and main.goodies.mathematics.variables or { }
local joinrelfactor = variables.joinrelfactor or 3
+
for i=0x7A,0x7D do
make(main,characters,id,size,i,1)
end
@@ -536,23 +547,24 @@ function vfmath.addmissing(main,id,size)
-- 21CB leftrightharpoon
-- 21CC rightleftharpoon
- stack (main,characters,id,size,0x2259,0x0003D,3,0x02227) -- \buildrel\wedge\over=
- jointwo (main,characters,id,size,0x22C8,0x022B3,joinrelfactor,0x022B2) -- \mathrel\triangleright\joinrel\mathrel\triangleleft (4 looks better than 3)
- jointwo (main,characters,id,size,0x22A7,0x0007C,joinrelfactor,0x0003D) -- \mathrel|\joinrel=
- jointwo (main,characters,id,size,0x2260,0x00338,0,0x0003D) -- \not\equal
- jointwo (main,characters,id,size,0x2284,0x00338,0,0x02282) -- \not\subset
- jointwo (main,characters,id,size,0x2285,0x00338,0,0x02283) -- \not\supset
- jointwo (main,characters,id,size,0x2209,0x00338,0,0x02208) -- \not\in
- jointwo (main,characters,id,size,0x2254,0x03A,0,0x03D) -- := (≔)
+ stack(main,characters,id,size,0x2259,0x0003D,3,0x02227) -- \buildrel\wedge\over=
+
+ jointwo(main,characters,id,size,0x22C8,0x022B3,joinrelfactor,0x022B2) -- \mathrel\triangleright\joinrel\mathrel\triangleleft (4 looks better than 3)
+ jointwo(main,characters,id,size,0x22A7,0x0007C,joinrelfactor,0x0003D) -- \mathrel|\joinrel=
+ jointwo(main,characters,id,size,0x2260,0x00338,0,0x0003D) -- \not\equal
+ jointwo(main,characters,id,size,0x2284,0x00338,0,0x02282) -- \not\subset
+ jointwo(main,characters,id,size,0x2285,0x00338,0,0x02283) -- \not\supset
+ jointwo(main,characters,id,size,0x2209,0x00338,0,0x02208) -- \not\in
+ jointwo(main,characters,id,size,0x2254,0x03A,0,0x03D) -- := (≔)
repeated(main,characters,id,size,0x222C,0x222B,2,0xFF800,1/3)
repeated(main,characters,id,size,0x222D,0x222B,3,0xFF810,1/3)
- characters[0xFE325] = fastcopy(characters[0x2032])
-
- raise (main,characters,id,size,0x02032,0xFE325,1,id_of_smaller) -- prime
- raise (main,characters,id,size,0x02033,0xFE325,2,id_of_smaller) -- double prime
- raise (main,characters,id,size,0x02034,0xFE325,3,id_of_smaller) -- triple prime
+ if cloned(main,characters,id,size,0x2032,0xFE325) then
+ raise(main,characters,id,size,0x2032,0xFE325,1,id_of_smaller) -- prime
+ raise(main,characters,id,size,0x2033,0xFE325,2,id_of_smaller) -- double prime
+ raise(main,characters,id,size,0x2034,0xFE325,3,id_of_smaller) -- triple prime
+ end
-- there are more (needs discussion first):
@@ -882,7 +894,7 @@ function vfmath.define(specification,set,goodies)
local ru = rv[unicode]
if not ru then
if trace_virtual then
- report_virtual("unicode slot %U has no index %H in vector %a for font %a",unicode,index,vectorname,fontname)
+ report_virtual("unicode slot %U has no index %H in vector %a for font %a (%S)",unicode,index,vectorname,fontname,chardata[unicode].description)
elseif not already_reported then
report_virtual("the mapping is incomplete for %a at %p",name,size)
already_reported = true
diff --git a/Master/texmf-dist/tex/context/base/meta-fig.mkiv b/Master/texmf-dist/tex/context/base/meta-fig.mkiv
index 46dc4cffc81..bf37aa7bfa7 100644
--- a/Master/texmf-dist/tex/context/base/meta-fig.mkiv
+++ b/Master/texmf-dist/tex/context/base/meta-fig.mkiv
@@ -47,6 +47,9 @@
\c!command=\meta_process_graphic_instance{\fittingpageparameter\c!instance},
\c!instance=]
+\unexpanded\def\setupMPpage
+ {\setupfittingpage[MPpage]}
+
%D \macros
%D {MPfigure}
%D
@@ -56,7 +59,7 @@
{\bgroup
\getfiguredimensions[#1]% [\c!object=\v!no] already set
\startMPcode
- externalfigure "#1"
+ draw externalfigure "#1"
xscaled \the\dimexpr\figurewidth \relax\space % must be points
yscaled \the\dimexpr\figureheight\relax\space % must be points
#2 ;
diff --git a/Master/texmf-dist/tex/context/base/meta-fnt.lua b/Master/texmf-dist/tex/context/base/meta-fnt.lua
index 596d0f45669..95bdfa6d966 100644
--- a/Master/texmf-dist/tex/context/base/meta-fnt.lua
+++ b/Master/texmf-dist/tex/context/base/meta-fnt.lua
@@ -21,32 +21,18 @@ mpfonts.version = mpfonts.version or 1.20
mpfonts.inline = true
mpfonts.cache = containers.define("fonts", "mp", mpfonts.version, true)
-metapost.fonts = metapost.fonts or { }
+metapost.fonts = metapost.fonts or { }
+
+local function unicodetoactualtext(...)
+ unicodetoactualtext = backends.codeinjections.unicodetoactualtext
+ return unicodetoactualtext(...)
+end
-- a few glocals
local characters, descriptions = { }, { }
local factor, code, slot, width, height, depth, total, variants, bbox, llx, lly, urx, ury = 100, { }, 0, 0, 0, 0, 0, 0, true, 0, 0, 0, 0
--- The next variant of ActualText is what Taco and I could come up with
--- eventually. As of September 2013 Acrobat copies okay, Sumatra copies a
--- question mark, pdftotext injects an extra space and Okular adds a
--- newline plus space.
-
--- return formatters["BT /Span << /ActualText (CONTEXT) >> BDC [<feff>] TJ % t EMC ET"](code)
-
-local function topdf(n,code)
- if n < 0x10000 then
- return formatters["BT /Span << /ActualText <feff%04x> >> BDC [<feff>] TJ % t EMC ET"](n,code)
- else
- return formatters["BT /Span << /ActualText <feff%04x%04x> >> BDC [<feff>] TJ % t EMC ET"](n/1024+0xD800,n%1024+0xDC00,code)
- end
-end
-
--- local function topdf(n,code)
--- return formatters["/Span << /ActualText (CTX) >> BDC % t EMC"](code)
--- end
-
local flusher = {
startfigure = function(_chr_,_llx_,_lly_,_urx_,_ury_)
code = { }
@@ -68,6 +54,7 @@ local flusher = {
end,
stopfigure = function()
local cd = chardata[n]
+ local code = unicodetoactualtext(slot,concat(code," ")) or ""
descriptions[slot] = {
-- unicode = slot,
name = cd and cd.adobename,
@@ -79,7 +66,7 @@ local flusher = {
if inline then
characters[slot] = {
commands = {
- { "special", "pdf:" .. topdf(slot,code) },
+ { "special", "pdf:" .. code },
}
}
else
@@ -88,13 +75,14 @@ local flusher = {
{
"image",
{
- stream = topdf(slot,code),
+ stream = code,
bbox = { 0, -depth * 65536, width * 65536, height * 65536 }
},
},
}
}
end
+ code = nil -- no need to keep that
end
}
@@ -261,7 +249,16 @@ function metapost.fonts.define(specification)
} )
end
-commands.definemetafont = metapost.fonts.define
+interfaces.implement {
+ name = "definemetafont",
+ actions = metapost.fonts.define,
+ arguments = {
+ {
+ { "fontname" },
+ { "filename" },
+ }
+ }
+}
-- metapost.fonts.define {
-- fontname = "bidi",
diff --git a/Master/texmf-dist/tex/context/base/meta-fnt.mkiv b/Master/texmf-dist/tex/context/base/meta-fnt.mkiv
index 603fcf14d51..e54c0be0a4f 100644
--- a/Master/texmf-dist/tex/context/base/meta-fnt.mkiv
+++ b/Master/texmf-dist/tex/context/base/meta-fnt.mkiv
@@ -21,11 +21,11 @@
{\dotripleempty\meta_font_define}
\def\meta_font_define[#1][#2][#3]%
- {\ctxcommand{definemetafont {
- fontname = "#1",
- filename = "#2"
+ {\clf_definemetafont
+ fontname {#1}%
+ filename {#2}%
% no #3 settings yet (compose, instances)
- }}}
+ \relax}
% \startluacode
% metapost.fonts.define { fontname = "bidi-symbols", filename = "bidi-symbols.mp" }
diff --git a/Master/texmf-dist/tex/context/base/meta-fun.lua b/Master/texmf-dist/tex/context/base/meta-fun.lua
index 78ee25bafe4..7aaaf2818ec 100644
--- a/Master/texmf-dist/tex/context/base/meta-fun.lua
+++ b/Master/texmf-dist/tex/context/base/meta-fun.lua
@@ -26,7 +26,7 @@ function metafun.topath(t,connector)
if type(ti) == "string" then
context(ti)
else
- context("(%s,%s)",ti.x or ti[1] or 0,ti.y or ti[2] or 0)
+ context("(%F,%F)",ti.x or ti[1] or 0,ti.y or ti[2] or 0)
end
end
else
@@ -47,7 +47,7 @@ function metafun.interpolate(f,b,e,s,c)
else
done = true
end
- context("(%s,%s)",i,d(i))
+ context("(%F,%F)",i,d(i))
end
end
if not done then
diff --git a/Master/texmf-dist/tex/context/base/meta-imp-dum.mkiv b/Master/texmf-dist/tex/context/base/meta-imp-dum.mkiv
index 1daff57ac8c..e6ccc234c6d 100644
--- a/Master/texmf-dist/tex/context/base/meta-imp-dum.mkiv
+++ b/Master/texmf-dist/tex/context/base/meta-imp-dum.mkiv
@@ -60,6 +60,8 @@
% \stopuseMPgraphic
\startuseMPgraphic{figure:placeholder}{width,height,reduction,color}
+ begingroup ;
+ save w, h, d, r, p, c, b ;
numeric w, h, d, r ; path p ;
if cmykcolor \MPvar{color} :
cmykcolor c, b ; b := (0,0,0,0)
@@ -80,6 +82,7 @@
withcolor r[c randomized(.3,.9),b] ;
endfor ;
clip currentpicture to p ;
+ endgroup ;
\stopuseMPgraphic
\defineoverlay
diff --git a/Master/texmf-dist/tex/context/base/meta-imp-tab.mkiv b/Master/texmf-dist/tex/context/base/meta-imp-tab.mkiv
new file mode 100644
index 00000000000..a4affbea458
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/meta-imp-tab.mkiv
@@ -0,0 +1,73 @@
+%D \module
+%D [ file=meta-tab,
+%D version=2003.03.21, % very old but now with splitter
+%D title=\METAPOST\ Graphics,
+%D subtitle=Dummy (External) Graphics,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\startuseMPgraphic{TallyBar}
+ height := (10/12) * LineHeight ;
+ span := ( 4/10) * LineHeight ;
+ drift := ( 1/10) * LineHeight ;
+ def d = (uniformdeviate drift) enddef ;
+ for i := 1 upto \MPvar{n} :
+ draw
+ if (i mod 5)=0 :
+ ((-d-4.5span,d)--(+d-0.5span,height-d))
+ else :
+ ((-d,+d)--(+d,height-d))
+ fi
+ shifted (span*i,d-drift) withpen pencircle ;
+ endfor ;
+ currentpicture := currentpicture scaled .75 ;
+\stopuseMPgraphic
+
+\setupMPvariables
+ [TallyBar]
+ [n=0]
+
+\unexpanded\def\tallynumeral#1%
+ {\dontleavehmode
+ \lower.25\exheight\hbox{\useMPgraphic{TallyBar}{n=#1}}}
+
+\unexpanded\def\tallynumerals#1%
+ {\dontleavehmode
+ \begingroup
+ \scratchcounter#1\relax
+ \doloop
+ {\ifnum\scratchcounter>\plusfive
+ \lower.25\exheight\hbox{\useMPgraphic{TallyBar}{n=5}}%
+ \advance\scratchcounter-\plusfive
+ \space
+ \else
+ \lower.25\exheight\hbox{\useMPgraphic{TallyBar}{n=\the\scratchcounter}}%
+ \exitloop
+ \fi}%
+ \endgroup}
+
+\let\FunnyBar\tallynumeral
+
+\defineconversion[tally][\tallynumerals]
+
+\continueifinputfile{meta-imp-tab.mkiv}
+
+\starttext
+
+ \starttabulate[|pr|c|]
+ \NC \tallynumerals {24} \NC \NR
+ \NC \tallynumerals {12} \NC \times \NR
+ \HL
+ \NC \tallynumerals{288} \NC = \NR
+ \stoptabulate
+
+ \tallynumerals{"FFFF}
+
+\stoptext
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/meta-imp-txt.mkiv b/Master/texmf-dist/tex/context/base/meta-imp-txt.mkiv
index bcfc5513fbe..7069d21a4ea 100644
--- a/Master/texmf-dist/tex/context/base/meta-imp-txt.mkiv
+++ b/Master/texmf-dist/tex/context/base/meta-imp-txt.mkiv
@@ -104,7 +104,7 @@
\unexpanded\def\getshapecharacteristics
{\doglobal\increment\currentshapetext
- \doifdefinedelse{parlines:\currentshapetext}
+ \doifelsedefined{parlines:\currentshapetext}
{\global\parlines \getvalue{parlines:\currentshapetext}%
\global\chardef\parfirst \getvalue{parfirst:\currentshapetext}%
\global\parvoffset \getvalue{parvoffset:\currentshapetext}%
@@ -152,7 +152,7 @@
%%%%%%% rotfont nog definieren
-\doifundefined{RotFont}{\definefont[RotFont][RegularBold]}
+\doifundefined{RotFont}{\definefont[RotFont][RegularBold*default]}
\unexpanded\def\processfollowingtoken#1% strut toegevoegd
{\appendtoks#1\to\MPtoks
@@ -174,9 +174,7 @@
{\vbox\bgroup
\forgetall
\dontcomplain
- \startMPenvironment
- \doifundefined{RotFont}{\definefont[RotFont][RegularBold]}%
- \stopMPenvironment
+ \doifundefined{RotFont}{\definefont[RotFont][RegularBold*default]}%
\MPtoks\emptytoks
\resetMPdrawing
\startMPdrawing
@@ -225,6 +223,7 @@
withpen pencircle scaled .50pt withcolor green ;
fi ;
endfor ;
+% fill boundingbox currentpicture ;
\stopMPdrawing
\MPdrawingdonetrue
\getMPdrawing
diff --git a/Master/texmf-dist/tex/context/base/meta-ini.lua b/Master/texmf-dist/tex/context/base/meta-ini.lua
index 713ba3d5d01..8f713126323 100644
--- a/Master/texmf-dist/tex/context/base/meta-ini.lua
+++ b/Master/texmf-dist/tex/context/base/meta-ini.lua
@@ -15,34 +15,6 @@ local context = context
metapost = metapost or { }
--- for the moment downward compatible
-
-local report_metapost = logs.reporter ("metapost")
-local status_metapost = logs.messenger("metapost")
-
-local patterns = { "meta-imp-%s.mkiv", "meta-imp-%s.tex", "meta-%s.mkiv", "meta-%s.tex" } -- we are compatible
-
-local function action(name,foundname)
- status_metapost("library %a is loaded",name)
- context.startreadingfile()
- context.input(foundname)
- context.stopreadingfile()
-end
-
-local function failure(name)
- report_metapost("library %a is unknown or invalid",name)
-end
-
-function commands.useMPlibrary(name)
- commands.uselibrary {
- name = name,
- patterns = patterns,
- action = action,
- failure = failure,
- onlyonce = true,
- }
-end
-
-- experimental
local colorhash = attributes.list[attributes.private('color')]
diff --git a/Master/texmf-dist/tex/context/base/meta-ini.mkiv b/Master/texmf-dist/tex/context/base/meta-ini.mkiv
index 555deca2cbf..c3b94f899cd 100644
--- a/Master/texmf-dist/tex/context/base/meta-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/meta-ini.mkiv
@@ -106,7 +106,7 @@
{\dosinglegroupempty\meta_start_extensions}
\def\meta_start_extensions#1#2\stopMPextensions % we could use buffers instead
- {\ctxlua{metapost.setextensions("#1",\!!bs#2\!!es)}}
+ {\clf_setmpextensions{#1}{#2}}
\let\stopMPextensions\relax
@@ -155,12 +155,12 @@
\global\t_meta_inclusions\expandafter{\the\t_meta_inclusions#2}%
\let\currentMPinstance\m_meta_saved_instance}
-\def\meta_preset_definitions
- {\edef\overlaywidth {\overlaywidth \space}%
- \edef\overlayheight {\overlayheight \space}%
- \edef\overlaylinewidth{\overlaylinewidth\space}%
- \edef\currentwidth {\the\hsize \space}%
- \edef\currentheight {\the\vsize \space}}
+% \def\meta_preset_definitions
+% {\edef\overlaywidth {\overlaywidth \space}%
+% \edef\overlayheight {\overlayheight \space}%
+% \edef\overlaylinewidth{\overlaylinewidth\space}}
+
+\let\meta_preset_definitions\relax
\installcommandhandler \??mpinstance {MPinstance} \??mpinstance
@@ -217,14 +217,22 @@
\def\currentMPinstance {\defaultMPinstance}
\def\currentMPformat {\currentMPinstance}
-\defineMPinstance[metafun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes]
-\defineMPinstance[extrafun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes]
-\defineMPinstance[doublefun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes,\c!method=\s!double]
-\defineMPinstance[binaryfun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes,\c!method=\s!binary]
-\defineMPinstance[decimalfun][\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes,\c!method=\s!decimal]
-\defineMPinstance[mprun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes]
-\defineMPinstance[metapost] [\s!format=mpost]
-\defineMPinstance[nofun] [\s!format=mpost]
+\defineMPinstance[metafun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes]
+\defineMPinstance[extrafun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes]
+\defineMPinstance[lessfun] [\s!format=metafun]
+\defineMPinstance[doublefun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes,\c!method=\s!double]
+\defineMPinstance[binaryfun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes,\c!method=\s!binary]
+\defineMPinstance[decimalfun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes,\c!method=\s!decimal]
+
+\defineMPinstance[mprun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes]
+
+\defineMPinstance[metapost] [\s!format=mpost]
+\defineMPinstance[nofun] [\s!format=mpost]
+\defineMPinstance[doublepost] [\s!format=mpost,\c!method=\s!double]
+\defineMPinstance[binarypost] [\s!format=mpost,\c!method=\s!binary]
+\defineMPinstance[decimalpost][\s!format=mpost,\c!method=\s!decimal]
+
+%defineMPinstance[megapost] [\s!format=mpost,\c!method=\s!decimal]
\newconditional\c_meta_include_initializations
@@ -295,20 +303,19 @@
\forgetall
\edef\p_extensions{\MPinstanceparameter\s!extensions}%
\meta_process_graphic_start
- \normalexpanded{\noexpand\ctxlua{metapost.graphic {
- instance = "\currentMPinstance",
- format = "\currentMPformat",
- data = \!!bs#1;\!!es,
- initializations = \!!bs\meta_flush_current_initializations\!!es,
-% useextensions = "\MPinstanceparameter\s!extensions",
-\ifx\p_extensions\v!yes
- extensions = \!!bs\ctxcommand{getmpextensions("\currentMPinstance")}\!!es,
-\fi
- inclusions = \!!bs\meta_flush_current_inclusions\!!es,
- definitions = \!!bs\meta_flush_current_definitions\!!es,
- figure = "\MPaskedfigure",
- method = "\MPinstanceparameter\c!method",
- }}}%
+ \normalexpanded{\noexpand\clf_mpgraphic
+ instance {\currentMPinstance}%
+ format {\currentMPformat}%
+ data {#1;}%
+ initializations {\meta_flush_current_initializations}%
+ \ifx\p_extensions\v!yes
+ extensions {\clf_getmpextensions{\currentMPinstance}}% goes through tex again
+ \fi
+ inclusions {\meta_flush_current_inclusions}%
+ definitions {\meta_flush_current_definitions}%
+ figure {\MPaskedfigure}%
+ method {\MPinstanceparameter\c!method}%
+ \relax}%
\meta_process_graphic_stop
\meta_stop_current_graphic}
@@ -338,14 +345,32 @@
%D Calling up previously defined graphics.
+% \def\includeMPgraphic#1% gets expanded !
+% {\ifcsname\??mpgraphic#1\endcsname
+% \csname\??mpgraphic#1\endcsname ; % ; is safeguard
+% \fi}
+%
+% \unexpanded\def\meta_enable_include % public
+% {\let\meta_handle_use_graphic \thirdofthreearguments
+% \let\meta_handle_reusable_graphic\thirdofthreearguments}
+%
+% but ... we want this too:
+%
+% \startuseMPgraphic{x}
+% draw textext("\externalfigure[foo.pdf]") ;
+% \stopuseMPgraphic
+%
+% \useMPgraphic{x}
+%
+% so we cannot overload unless we let back to the original meanings
+% each graphic ... a better solution is:
+
\def\includeMPgraphic#1% gets expanded !
{\ifcsname\??mpgraphic#1\endcsname
- \csname\??mpgraphic#1\endcsname ; % ; is safeguard
+ \doubleexpandafter\fourthoffourarguments\csname\??mpgraphic#1\endcsname ; % ; is safeguard
\fi}
-\unexpanded\def\meta_enable_include % public
- {\let\meta_handle_use_graphic \thirdofthreearguments
- \let\meta_handle_reusable_graphic\thirdofthreearguments}
+\let\meta_enable_include\relax
%D Drawings (stepwise built):
@@ -401,20 +426,13 @@
\unexpanded\def\meta_grab_clip_path#1#2#3#4% #4 is alternative (called in backend code)
{\begingroup
- \edef\width {#2\space}\let\overlaywidth \width
- \edef\height{#3\space}\let\overlayheight\height
- \ifcsname\??mpclip#1\endcsname
- \meta_start_current_graphic
- \xdef\MPclippath{\normalexpanded{\noexpand\ctxlua{metapost.theclippath {
- instance = "\currentMPinstance",
- format = "\currentMPformat",
- data = \!!bs\getvalue{\??mpclip#1}\!!es,
- initializations = \!!bs\meta_flush_current_initializations\!!es,
- useextensions = "\MPinstanceparameter\s!extensions",
- inclusions = \!!bs\meta_flush_current_inclusions\!!es,
- method = "\MPinstanceparameter\c!method",
- }}}}%
- \meta_stop_current_graphic
+ \edef\width {#2}% \let\overlaywidth \width
+ \edef\height{#3}% \let\overlayheight\height
+ \d_overlay_width #2\onebasepoint
+ \d_overlay_height#3\onebasepoint
+ \edef\currentMPclip{#1}%
+ \ifcsname\??mpclip\currentMPclip\endcsname
+ \meta_grab_clip_path_indeed
\ifx\MPclippath\empty
\xdef\MPclippath{#4}%
\fi
@@ -423,6 +441,19 @@
\fi
\endgroup}
+\def\meta_grab_clip_path_indeed
+ {\meta_start_current_graphic
+ \normalexpanded{\noexpand\clf_mpsetclippath
+ instance {\currentMPinstance}%
+ format {\currentMPformat}%
+ data {\csname\??mpclip\currentMPclip\endcsname}%
+ initializations {\meta_flush_current_initializations}%
+ useextensions {\MPinstanceparameter\s!extensions}%
+ inclusions {\meta_flush_current_inclusions}%
+ method {\MPinstanceparameter\c!method}%
+ \relax}%
+ \meta_stop_current_graphic}
+
%D Since we want lables to follow the document settings, we
%D also set the font related variables.
@@ -430,7 +461,7 @@
{\dontleavehmode
\begingroup
\definedfont[#1]%
- \hskip\cldcontext{fonts.hashes.parameters[font.current()].designsize}sp\relax
+ \hskip\clf_currentdesignsize\scaledpoint\relax
\endgroup}
\definefontsynonym[MetafunDefault][Regular*default]
@@ -438,7 +469,7 @@
\startMPinitializations % scale is not yet ok
defaultfont:="\truefontname{MetafunDefault}";
% defaultscale:=\the\bodyfontsize/10pt; % only when hard coded 10pt
- defaultscale:=1;
+ % defaultscale:=1;
\stopMPinitializations
% watch out, this is a type1 font because mp can only handle 8 bit fonts
@@ -571,7 +602,7 @@
\def\meta_prepare_variable_yes
{\defconvertedcommand\ascii\m_meta_current_variable % otherwise problems
- \doifcolorelse \ascii % with 2\bodyfontsize
+ \doifelsecolor \ascii % with 2\bodyfontsize
{\meta_prepare_variable_color}
{\begingroup
\setbox\b_meta_variable_box\hbox{\scratchdimen\m_meta_current_variable sp}%
@@ -600,7 +631,13 @@
%D \stoptyping
\def\overlaystamp % watch the \MPcolor, since colors can be redefined
- {\overlaywidth:\overlayheight:\overlaydepth:\overlayoffset:\overlaylinewidth:\MPcolor\overlaycolor:\MPcolor\overlaylinecolor}
+ {\the\d_overlay_width :%
+ \the\d_overlay_height :%
+ \the\d_overlay_depth :%
+ \the\d_overlay_offset :%
+ \the\d_overlay_linewidth:%
+ \MPcolor\overlaycolor :% % todo, expand once \m_overlaycolor
+ \MPcolor\overlaylinecolor} % todo, expand once \m_overlaylinecolor
%D A better approach is to let additional variables play a role
%D in determining the uniqueness. In the next macro, the
@@ -783,19 +820,25 @@
\let\reuseMPgraphic \useMPgraphic % we can save a setup here if needed
\let\reusableMPgraphic\reuseMPgraphic % we can save a setup here if needed
-\unexpanded\def\meta_enable_include
- {\let\meta_handle_use_graphic \thirdofthreearguments
- \let\meta_handle_reusable_graphic\thirdofthreearguments}
-
%D \macros
%D {startuniqueMPpagegraphic,uniqueMPpagegraphic}
%D
%D Experimental.
-\def\m_meta_page_prefix{\doifoddpageelse oe}
+\def\m_meta_page_prefix{\doifelseoddpage oe}
+
+% \def\overlaypagestamp
+% {\m_meta_page_prefix:\overlaywidth:\overlayheight:\overlaydepth:\MPcolor\overlaycolor:\MPcolor\overlaylinecolor}
\def\overlaypagestamp
- {\m_meta_page_prefix:\overlaywidth:\overlayheight:\overlaydepth:\MPcolor\overlaycolor:\MPcolor\overlaylinecolor}
+ {\m_meta_page_prefix :%
+ \the\d_overlay_width :%
+ \the\d_overlay_height :%
+ \the\d_overlay_depth :%
+ \the\d_overlay_offset :%
+ \the\d_overlay_linewidth:%
+ \MPcolor\overlaycolor :%
+ \MPcolor\overlaylinecolor}
\unexpanded\def\startuniqueMPpagegraphic
{\dodoublegroupempty\meta_start_unique_page_graphic}
@@ -859,12 +902,21 @@
% makempy.registerfile(filename)
-\startMPinitializations
- boolean collapse_data; collapse_data:=true;
- def data_mpd_file = "\MPdataMPDfile" enddef ;
- def data_mpo_file = "\MPdataMPOfile" enddef ;
- def data_mpy_file = "\MPdataMPYfile" enddef ;
-\stopMPinitializations
+% % hm. extensions get expanded so the wrong names then end up in format
+%
+% \startMPinitializations
+% boolean collapse_data; collapse_data:=true ; % will be obsolete
+% def data_mpd_file = "\MPdataMPDfile" enddef ; % will go via lua
+% def data_mpo_file = "\MPdataMPOfile" enddef ;
+% def data_mpy_file = "\MPdataMPYfile" enddef ;
+% \stopMPinitializations
+
+\startMPextensions
+ boolean collapse_data; collapse_data:=true ; % will be obsolete
+ def data_mpd_file = "\noexpand\MPdataMPDfile" enddef ; % will go via lua
+ def data_mpo_file = "\noexpand\MPdataMPOfile" enddef ;
+ def data_mpy_file = "\noexpand\MPdataMPYfile" enddef ;
+\stopMPextensions
\unexpanded\def\getMPdata
{\let\MPdata\secondoftwoarguments
@@ -884,7 +936,7 @@
\def\meta_process_buffer[#1]%
{\meta_begin_graphic_group{#1}%
- \meta_process_graphic{\ctxcommand{feedback("\currentMPgraphicname")}}%
+ \meta_process_graphic{\clf_feedback{\currentMPgraphicname}}%
\meta_end_graphic_group}
\unexpanded\def\runMPbuffer
@@ -928,15 +980,15 @@
\else\ifx\m_meta_option\!!plustoken
#2% % use in main doc too
\fi\fi\fi
- \ctxlua{metapost.tex.set(\!!bs\detokenize{#2}\!!es)}}
+ \clf_mptexset{\detokenize{#2}}}
\let\stopMPenvironment\relax
\unexpanded\def\resetMPenvironment
- {\ctxlua{metapost.tex.reset()}}
+ {\clf_mptexreset}
\unexpanded\def\useMPenvironmentbuffer[#1]%
- {\ctxlua{metapost.tex.set(buffers.content("#1"))}}
+ {\clf_mpsetfrombuffer{#1}}
%D This command takes \type {[reset]} as optional
%D argument.
@@ -1058,7 +1110,7 @@
%D Loading specific \METAPOST\ related definitions is
%D accomplished by:
-\unexpanded\def\useMPlibrary[#1]{\ctxcommand{useMPlibrary(\!!bs#1\!!es)}}
+\unexpanded\def\useMPlibrary[#1]{\clf_useMPlibrary{#1}}
%D \macros
%D {setMPtext, MPtext, MPstring, MPbetex}
@@ -1088,46 +1140,62 @@
% \setupcolors[state=stop,conversion=never] % quite tricky ... type mismatch
-% A dirty trick, ** in colo-ini.lua (mpcolor).
+% \startMPextensions
+% color OverlayColor,OverlayLineColor;
+% \stopMPextensions
-\def\m_meta_colo_initializations{% no vardef, goes wrong with spot colors
- def OverlayLineColor=\MPcolor{\overlaylinecolor} enddef;
- def OverlayColor=\MPcolor{\overlaycolor} enddef;
-}
+\startMPinitializations
+ CurrentLayout:="\currentlayout";
+\stopMPinitializations
-\startMPextensions
- color OverlayColor,OverlayLineColor;
-\stopMPextensions
+% \startMPinitializations
+% OverlayWidth:=\overlaywidth;
+% OverlayHeight:=\overlayheight;
+% OverlayDepth:=\overlaydepth;
+% OverlayLineWidth:=\overlaylinewidth;
+% OverlayOffset:=\overlayoffset;
+% \stopMPinitializations
+
+% A dirty trick, ** in colo-ini.lua (mpcolor). We cannot use a vardef, because
+% that fails with spot colors.
\startMPinitializations
- CurrentLayout:="\currentlayout";
- OverlayWidth:=\overlaywidth;
- OverlayHeight:=\overlayheight;
- OverlayDepth:=\overlaydepth;
- OverlayLineWidth:=\overlaylinewidth;
- OverlayOffset:=\overlayoffset;
- %
- \m_meta_colo_initializations
- %
- BaseLineSkip:=\the\baselineskip;
- LineHeight:=\the\baselineskip;
- BodyFontSize:=\the\bodyfontsize;
- %
- TopSkip:=\the\topskip;
- StrutHeight:=\strutheight;
- StrutDepth:=\strutdepth;
- %
- CurrentWidth:=\the\hsize;
- CurrentHeight:=\the\vsize;
- %
- EmWidth:=\the\emwidth;
- ExHeight:=\the\exheight;
- %
- PageNumber:=\the\pageno;
- RealPageNumber:=\the\realpageno;
- LastPageNumber:= \lastpage;
+ def OverlayLineColor=\ifx\overlaylinecolor\empty black \else\MPcolor{\overlaylinecolor} \fi enddef;
+ def OverlayColor =\ifx\overlaycolor \empty black \else\MPcolor{\overlaycolor} \fi enddef;
\stopMPinitializations
+% \newcount\c_overlay_colormodel
+% \newcount\c_overlay_color
+% \newcount\c_overlay_transparency
+% \newcount\c_overlay_linecolor
+% \newcount\c_overlay_linetransparency
+
+% \appendtoks
+% \c_overlay_colormodel \attribute\colormodelattribute
+% \c_overlay_color \colo_helpers_inherited_current_ca\overlaycolor
+% \c_overlay_transparency \colo_helpers_inherited_current_ta\overlaycolor
+% \c_overlay_linecolor \colo_helpers_inherited_current_ca\overlaylinecolor
+% \c_overlay_linetransparency\colo_helpers_inherited_current_ta\overlaylinecolor
+% \to \everyMPgraphic
+
+% \startMPinitializations
+% BaseLineSkip:=\the\baselineskip;
+% LineHeight:=\the\baselineskip;
+% BodyFontSize:=\the\bodyfontsize;
+% %
+% TopSkip:=\the\topskip;
+% StrutHeight:=\strutheight;
+% StrutDepth:=\strutdepth;
+% %
+% CurrentWidth:=\the\hsize;
+% CurrentHeight:=\the\vsize;
+% HSize:=\the\hsize ;
+% VSize:=\the\vsize ;
+% %
+% EmWidth:=\the\emwidth;
+% ExHeight:=\the\exheight;
+% \stopMPinitializations
+
\appendtoks
\disablediscretionaries
\disablecompoundcharacters
@@ -1157,11 +1225,6 @@
\let \} \letterclosebrace
\to \everyMPgraphic
-\startMPinitializations
- prologues:=0;
- mpprocset:=1;
-\stopMPinitializations
-
%D \macros
%D {PDFMPformoffset}
%D
@@ -1188,21 +1251,36 @@
enddef;
\stopMPextensions
-\startMPinitializations
- HSize:=\the\hsize ;
- VSize:=\the\vsize ;
-\stopMPinitializations
-
\startMPextensions
vardef ForegroundBox =
unitsquare xysized(HSize,VSize)
enddef ;
- PageFraction := 1 ;
\stopMPextensions
-\startMPinitializations
- PageFraction := if \lastpage>1: (\realfolio-1)/(\lastpage-1) else: 1 fi ;
-\stopMPinitializations
+% \startMPextensions
+% PageFraction := 1 ;
+% \stopMPextensions
+
+% \startMPinitializations
+% PageFraction := if \lastpage>1: (\realfolio-1)/(\lastpage-1) else: 1 fi ;
+% \stopMPinitializations
+
+\startMPdefinitions {metapost}
+ if unknown context_bare : input mp-bare.mpiv ; fi ;
+\stopMPdefinitions
+\startMPdefinitions {binarypost}
+ if unknown context_bare : input mp-bare.mpiv ; fi ;
+\stopMPdefinitions
+\startMPdefinitions {decimalpost}
+ if unknown context_bare : input mp-bare.mpiv ; fi ;
+\stopMPdefinitions
+\startMPdefinitions {doublepost}
+ if unknown context_bare : input mp-bare.mpiv ; fi ;
+\stopMPdefinitions
+
+% \startMPdefinitions {nofun}
+% if unknown context_bare : input mp-bare.mpiv ; fi ;
+% \stopMPdefinitions
%D And some more. These are not really needed since we
%D don't use the normal figure inclusion macros any longer.
@@ -1363,12 +1441,16 @@
\newconstant\MPcolormethod
\appendtoks
- \ctxlua{metapost.setoutercolor(\number\MPcolormethod,\number\attribute\colormodelattribute,\number\attribute\colorattribute,\number\dogetattribute{transparency})}%
+ \clf_mpsetoutercolor
+ \MPcolormethod\space
+ \attribute\colormodelattribute\space
+ \attribute\colorattribute\space
+ \dogetattribute{transparency}\relax
\to \everyMPgraphic
-\startMPinitializations
- defaultcolormodel := \ifcase\MPcolormethod1\or1\or3\else3\fi;
-\stopMPinitializations
+% \startMPinitializations
+% defaultcolormodel := \ifcase\MPcolormethod1\or1\or3\else3\fi;
+% \stopMPinitializations
%D macros
%D {mprunvar,mpruntab,mprunset}
@@ -1394,9 +1476,9 @@
%D $(x,y) = (\MPrunset{point}{,})$
%D \stoptyping
-\def\MPrunvar #1{\ctxcommand{mprunvar("#1")}} \let\mprunvar\MPrunvar
-\def\MPruntab#1#2{\ctxcommand{mprunvar("#1",\number#2)}} \let\mpruntab\MPruntab
-\def\MPrunset#1#2{\ctxcommand{mprunvar("#1","#2")}} \let\mprunset\MPrunset
+\def\MPrunvar #1{\clf_mprunvar{#1}} \let\mprunvar\MPrunvar
+\def\MPruntab#1#2{\clf_mpruntab{#1}#2\relax} \let\mpruntab\MPruntab % #2 is number
+\def\MPrunset#1#2{\clf_mprunset{#1}{#2}} \let\mprunset\MPrunset
%D We also provide an outputless run:
@@ -1465,7 +1547,7 @@
\edef\p_mpy{\directMPgraphicsparameter{mpy}}%
\ifx\p_mpy\empty \else
\let\MPdataMPYfile\p_mpy
- \ctxlua{metapost.makempy.registerfile("\p_mpy")}%
+ \clf_registermpyfile{\p_mpy}%
\fi
\to \everysetupMPgraphics
diff --git a/Master/texmf-dist/tex/context/base/meta-pag.mkiv b/Master/texmf-dist/tex/context/base/meta-pag.mkiv
index a25353b188e..6b6abd21135 100644
--- a/Master/texmf-dist/tex/context/base/meta-pag.mkiv
+++ b/Master/texmf-dist/tex/context/base/meta-pag.mkiv
@@ -23,82 +23,76 @@
%D pagebody looks.
\startMPextensions
- boolean PageStateAvailable,OnRightPage,InPageBody;
+ boolean PageStateAvailable;
PageStateAvailable:=true;
\stopMPextensions
-\startMPinitializations
- OnRightPage:=true;
- InPageBody:=\ifinpagebody true \else false \fi;
-\stopMPinitializations
-
-\startMPinitializations
- CurrentColumn:=\number\mofcolumns;
- NOfColumns:=\number\nofcolumns;
- % todo: ColumnDistance
-\stopMPinitializations
-
% maybe always set as frozen anyway
-\startMPinitializations
- % def LoadPageState =
- OnRightPage:=\MPonrightpage;
- OnOddPage:=\MPonoddpage;
- RealPageNumber:=\the\realpageno;
- PageNumber:=\the\pageno;
- NOfPages:=\lastpage;
- PaperHeight:=\the\paperheight;
- PaperWidth:=\the\paperwidth;
- PrintPaperHeight:=\the\printpaperheight;
- PrintPaperWidth:=\the\printpaperwidth;
- TopSpace:=\the\topspace;
- BottomSpace:=\the\bottomspace;
- BackSpace:=\the\backspace;
- CutSpace:=\the\cutspace;
- MakeupHeight:=\the\makeupheight;
- MakeupWidth:=\the\makeupwidth;
- TopHeight:=\the\topheight;
- TopDistance:=\the\topdistance;
- HeaderHeight:=\the\headerheight;
- HeaderDistance:=\the\headerdistance;
- TextHeight:=\the\textheight;
- FooterDistance:=\the\footerdistance;
- FooterHeight:=\the\footerheight;
- BottomDistance:=\the\bottomdistance;
- BottomHeight:=\the\bottomheight;
- LeftEdgeWidth:=\the\leftedgewidth;
- LeftEdgeDistance:=\the\leftedgedistance;
- LeftMarginWidth:=\the\leftmarginwidth;
- LeftMarginDistance:=\the\leftmargindistance;
- TextWidth:=\the\textwidth ;
- RightMarginDistance:=\the\rightmargindistance;
- RightMarginWidth:=\the\rightmarginwidth;
- RightEdgeDistance:=\the\rightedgedistance;
- RightEdgeWidth:=\the\rightedgewidth;
- InnerMarginDistance:=\the\innermargindistance;
- InnerMarginWidth:=\the\innermarginwidth;
- OuterMarginDistance:=\the\outermargindistance;
- OuterMarginWidth:=\the\outermarginwidth;
- InnerEdgeDistance:=\the\inneredgedistance;
- InnerEdgeWidth:=\the\inneredgewidth;
- OuterEdgeDistance:=\the\outeredgedistance;
- OuterEdgeWidth:=\the\outeredgewidth;
- PageOffset:=\the\pagebackgroundoffset;
- PageDepth:=\the\pagebackgrounddepth;
- LayoutColumns:=\the\layoutcolumns;
- LayoutColumnDistance:=\the\layoutcolumndistance;
- LayoutColumnWidth:=\the\layoutcolumnwidth;
- def LoadPageState =
- % now always set .. this dummy can move to the mp code
- enddef;
-\stopMPinitializations
+% \startMPinitializations
+% PaperHeight:=\the\paperheight;
+% PaperWidth:=\the\paperwidth;
+% PrintPaperHeight:=\the\printpaperheight;
+% PrintPaperWidth:=\the\printpaperwidth;
+% TopSpace:=\the\topspace;
+% BottomSpace:=\the\bottomspace;
+% BackSpace:=\the\backspace;
+% CutSpace:=\the\cutspace;
+% MakeupHeight:=\the\makeupheight;
+% MakeupWidth:=\the\makeupwidth;
+% TopHeight:=\the\topheight;
+% TopDistance:=\the\topdistance;
+% HeaderHeight:=\the\headerheight;
+% HeaderDistance:=\the\headerdistance;
+% TextHeight:=\the\textheight;
+% FooterDistance:=\the\footerdistance;
+% FooterHeight:=\the\footerheight;
+% BottomDistance:=\the\bottomdistance;
+% BottomHeight:=\the\bottomheight;
+% LeftEdgeWidth:=\the\leftedgewidth;
+% LeftEdgeDistance:=\the\leftedgedistance;
+% LeftMarginWidth:=\the\leftmarginwidth;
+% LeftMarginDistance:=\the\leftmargindistance;
+% TextWidth:=\the\textwidth;
+% RightMarginDistance:=\the\rightmargindistance;
+% RightMarginWidth:=\the\rightmarginwidth;
+% RightEdgeDistance:=\the\rightedgedistance;
+% RightEdgeWidth:=\the\rightedgewidth;
+% InnerMarginDistance:=\the\innermargindistance;
+% InnerMarginWidth:=\the\innermarginwidth;
+% OuterMarginDistance:=\the\outermargindistance;
+% OuterMarginWidth:=\the\outermarginwidth;
+% InnerEdgeDistance:=\the\inneredgedistance;
+% InnerEdgeWidth:=\the\inneredgewidth;
+% OuterEdgeDistance:=\the\outeredgedistance;
+% OuterEdgeWidth:=\the\outeredgewidth;
+% PageOffset:=\the\pagebackgroundoffset;
+% PageDepth:=\the\pagebackgrounddepth;
+% LayoutColumns:=\the\layoutcolumns;
+% LayoutColumnDistance:=\the\layoutcolumndistance;
+% LayoutColumnWidth:=\the\layoutcolumnwidth;
+% %
+% boolean OnRightPage,OnOddPage,InPageBody;
+% %
+% OnRightPage:=\MPonrightpage;
+% OnOddPage:=\MPonoddpage;
+% InPageBody:=\ifinpagebody true \else false \fi;
+% %
+% RealPageNumber:=\the\realpageno;
+% PageNumber:=\the\pageno;
+% NOfPages:=\lastpage;
+% LastPageNumber:=\lastpage;
+% %
+% CurrentColumn:=\number\mofcolumns;
+% NOfColumns:=\number\nofcolumns;
+% \stopMPinitializations
\def\MPonrightpage{true}
\def\MPonoddpage {true}
\def\freezeMPpagelayout
{\edef\MPonrightpage{\doifbothsides {tru}{tru}{fals}e}%
- \edef\MPonoddpage {\doifoddpageelse {tru}{fals}e}}
+ \edef\MPonoddpage {\doifelseoddpage {tru}{fals}e}}
%D We need to freeze the pagelayout before the backgrounds
%D are build, because the overlay will temporarily become
@@ -121,7 +115,7 @@
% \to \everyMPgraphic
\prependtoks
- \calculatereducedvsizes % this is really needed
+ \calculatereducedvsizes % bah, this is really needed
\to \everyMPgraphic
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/meta-pdf.lua b/Master/texmf-dist/tex/context/base/meta-pdf.lua
index 512384450a8..3cbff63b168 100644
--- a/Master/texmf-dist/tex/context/base/meta-pdf.lua
+++ b/Master/texmf-dist/tex/context/base/meta-pdf.lua
@@ -329,7 +329,7 @@ handlers[50] = function() report_mptopdf("skipping special %s",50) end
--end of not supported
function mps.setrgbcolor(r,g,b) -- extra check
- r, g = tonumber(r), tonumber(g) -- needed when we use lpeg
+ r, g, b = tonumber(r), tonumber(g), tonumber(b) -- needed when we use lpeg
if r == 0.0123 and g < 0.1 then
g, b = round(g*10000), round(b*10000)
local s = specials[b]
@@ -411,7 +411,8 @@ function mps.fshow(str,font,scale) -- lpeg parser
mps.textext(font,scale,lpegmatch(package,str))
end
-local cnumber = lpegC(number)
+----- cnumber = lpegC(number)
+local cnumber = number/tonumber -- we now expect numbers (feeds into %F)
local cstring = lpegC(nonspace)
local specials = (lpegP("%%MetaPostSpecials:") * sp * (cstring * sp^0)^0 * eol) / mps.specials
@@ -572,3 +573,11 @@ statistics.register("mps conversion time",function()
return nil
end
end)
+
+-- interface
+
+interfaces.implement {
+ name = "convertmpstopdf",
+ arguments = "string",
+ actions = mptopdf.convertmpstopdf
+}
diff --git a/Master/texmf-dist/tex/context/base/meta-pdf.mkiv b/Master/texmf-dist/tex/context/base/meta-pdf.mkiv
index 3469419d468..50eb1dd720a 100644
--- a/Master/texmf-dist/tex/context/base/meta-pdf.mkiv
+++ b/Master/texmf-dist/tex/context/base/meta-pdf.mkiv
@@ -46,7 +46,7 @@
\forgetall
\offinterlineskip
\setbox\MPbox\vbox\bgroup
- \ctxlua{metapost.mptopdf.convertmpstopdf("\MPfilename")}%
+ \clf_convertmpstopdf{\MPfilename}%
\removeunwantedspaces % not that needed
\egroup
\finalizeMPbox
diff --git a/Master/texmf-dist/tex/context/base/meta-pdh.mkiv b/Master/texmf-dist/tex/context/base/meta-pdh.mkiv
index b65fe6ac697..f3db5b38866 100644
--- a/Master/texmf-dist/tex/context/base/meta-pdh.mkiv
+++ b/Master/texmf-dist/tex/context/base/meta-pdh.mkiv
@@ -374,17 +374,17 @@
%D
%D \startbuffer
%D \startuniqueMPgraphic{CircularShade}
-%D path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ;
+%D path p ; p := unitsquare xscaled OverlayWidth yscaled OverlayHeight ;
%D circular_shade(p,0,.2red,.9red) ;
%D \stopuniqueMPgraphic
%D
%D \startuniqueMPgraphic{LinearShade}
-%D path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ;
+%D path p ; p := unitsquare xscaled OverlayWidth yscaled OverlayHeight ;
%D linear_shade(p,0,.2blue,.9blue) ;
%D \stopuniqueMPgraphic
%D
%D \startuniqueMPgraphic{DuotoneShade}
-%D path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ;
+%D path p ; p := unitsquare xscaled OverlayWidth yscaled OverlayHeight ;
%D linear_shade(p,2,.5green,.5red) ;
%D \stopuniqueMPgraphic
%D \stopbuffer
@@ -429,8 +429,8 @@
%D
%D \def\SomeShade#1#2#3#4#5%
%D {\startuniqueMPgraphic{Shade-#1}
-%D width := \overlaywidth ;
-%D height := \overlayheight ;
+%D width := OverlayWidth ;
+%D height := OverlayHeight ;
%D path p ; p := unitsquare xscaled width yscaled height ;
%D #2_shade(p,#3,#4,#5) ;
%D \stopuniqueMPgraphic
diff --git a/Master/texmf-dist/tex/context/base/meta-tex.lua b/Master/texmf-dist/tex/context/base/meta-tex.lua
index 7a4123abbb3..1008e45c05e 100644
--- a/Master/texmf-dist/tex/context/base/meta-tex.lua
+++ b/Master/texmf-dist/tex/context/base/meta-tex.lua
@@ -6,12 +6,15 @@ if not modules then modules = { } end modules ['meta-tex'] = {
license = "see context related readme files"
}
+local tostring = tostring
local format, gsub, find, match = string.format, string.gsub, string.find, string.match
local formatters = string.formatters
local P, S, R, C, Cs, lpegmatch = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cs, lpeg.match
metapost = metapost or { }
+local implement = interfaces.implement
+
-- local left = P("[")
-- local right = P("]")
-- local space = P(" ")
@@ -39,6 +42,12 @@ function metapost.escaped(str)
context(lpegmatch(pattern,str))
end
+implement {
+ name = "metapostescaped",
+ actions = metapost.escaped,
+ arguments = "string"
+}
+
local simplify = true
-- local function strip(n,e)
@@ -108,10 +117,6 @@ local enumber = number * S("eE") * number
local cleaner = Cs((P("@@")/"@" + P("@")/"%%" + P(1))^0)
-function format_n(fmt,...)
- return
-end
-
context = context or { exponent = function(...) print(...) end }
function metapost.format_string(fmt,...)
@@ -142,6 +147,9 @@ function metapost.nvformat(fmt,str)
metapost.format_number(fmt,metapost.untagvariable(str,false))
end
+implement { name = "metapostformatted", actions = metapost.svformat, arguments = { "string", "string" } }
+implement { name = "metapostgraphformat", actions = metapost.nvformat, arguments = { "string", "string" } }
+
-- local function test(fmt,n)
-- logs.report("mp format test","fmt: %s, n: %s, result: %s, \\exponent{%s}{%s}",fmt,n,
-- formatters[lpegmatch(cleaner,fmt)](n),
@@ -167,3 +175,34 @@ end
-- test("@j","1.2e+102")
-- test("@j","1.23e+102")
-- test("@j","1.234e+102")
+
+local f_textext = formatters[ [[textext("%s")]] ]
+local f_mthtext = formatters[ [[textext("\mathematics{%s}")]] ]
+local f_exptext = formatters[ [[textext("\mathematics{%s\times10^{%s}}")]] ]
+
+local mpprint = mp.print
+
+function mp.format(fmt,str)
+ fmt = lpegmatch(cleaner,fmt)
+ mpprint(f_textext(formatters[fmt](metapost.untagvariable(str,false))))
+end
+
+function mp.formatted(fmt,num) -- svformat
+ fmt = lpegmatch(cleaner,fmt)
+ mpprint(f_textext(formatters[fmt](tonumber(num) or num)))
+end
+
+function mp.graphformat(fmt,num) -- nvformat
+ fmt = lpegmatch(cleaner,fmt)
+ local number = tonumber(num)
+ if number then
+ local base, exponent = lpegmatch(enumber,number)
+ if base and exponent then
+ mpprint(f_exptext(base,exponent))
+ else
+ mpprint(f_mthtext(num))
+ end
+ else
+ mpprint(f_textext(tostring(num)))
+ end
+end
diff --git a/Master/texmf-dist/tex/context/base/meta-tex.mkiv b/Master/texmf-dist/tex/context/base/meta-tex.mkiv
index e7ed5972787..0f5a27ff862 100644
--- a/Master/texmf-dist/tex/context/base/meta-tex.mkiv
+++ b/Master/texmf-dist/tex/context/base/meta-tex.mkiv
@@ -68,7 +68,7 @@
\unexpanded\def\definetextext[#1]%
{\def\currenttextext{#1}%
- \doifnextoptionalcselse\meta_textext_define_one\meta_textext_define_zero}
+ \doifelsenextoptionalcs\meta_textext_define_one\meta_textext_define_zero}
\def\meta_textext_define_one {\setvalue{\??graphictexarguments1:\currenttextext}}
\def\meta_textext_define_zero{\setvalue{\??graphictexarguments0:\currenttextext}}
@@ -76,10 +76,10 @@
\def\sometxt#1#{\meta_some_txt{#1}}
\def\meta_some_txt#1#2% we need to capture embedded quotes (a bit messy as later on textext is filtered
- {textext.drt("\mpsometxt#1{\ctxlua{metapost.escaped(\!!bs#2\!!es)}}")}
+ {textext.drt("\mpsometxt#1{\clf_metapostescaped{#2}}")}
\unexpanded\def\mpsometxt % no _ catcode
- {\doifnextoptionalcselse\meta_some_txt_indeed_yes\meta_some_txt_indeed_nop}
+ {\doifelsenextoptionalcs\meta_some_txt_indeed_yes\meta_some_txt_indeed_nop}
\def\meta_some_txt_indeed_yes[#1]%
{\def\currenttextext{#1}%
@@ -116,8 +116,8 @@
%
% \unexpanded\def\definetextext[#1]#2{\setvalue{@@st@@#1}{#2}}
%
-% \long\def\sometxt #1#{\dosometxt{#1}} % grab optional [args]
-% \long\def\dosometxt #1#2{\ctxlua{metapost.sometxt(\!!bs#1\!!es,\!!bs#2\!!es)}}
+% \def\sometxt #1#{\dosometxt{#1}} % grab optional [args]
+% \def\dosometxt #1#2{\ctxlua{metapost.sometxt(\!!bs#1\!!es,\!!bs#2\!!es)}}
%
% \def\sometxta #1{textext.drt("#1")}
% \def\sometxtb #1#2{textext.drt("\getvalue{@@st@@#1}{#2}")}
@@ -139,7 +139,7 @@
% {\showstruts\useMPgraphic{testgraphic}}
\unexpanded\def\MPexponent #1#2{\mathematics{#1\times10^{#2}}}
-\unexpanded\def\MPformatted #1#2{\ctxlua{metapost.svformat("#1","#2")}}
-\unexpanded\def\MPgraphformat#1#2{\ctxlua{metapost.nvformat("#1","#2")}}
+\unexpanded\def\MPformatted #1#2{\clf_metapostformatted{#1}{#2}}
+\unexpanded\def\MPgraphformat#1#2{\clf_metapostgraphformat{#1}{#2}}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mlib-ctx.lua b/Master/texmf-dist/tex/context/base/mlib-ctx.lua
index fe52187719e..b437e1212c7 100644
--- a/Master/texmf-dist/tex/context/base/mlib-ctx.lua
+++ b/Master/texmf-dist/tex/context/base/mlib-ctx.lua
@@ -6,21 +6,28 @@ if not modules then modules = { } end modules ['mlib-ctx'] = {
license = "see context related readme files",
}
--- todo
+-- for the moment we have the scanners here but they migh tbe moved to
+-- the other modules
+local type, tostring = type, tostring
local format, concat = string.format, table.concat
local settings_to_hash = utilities.parsers.settings_to_hash
local report_metapost = logs.reporter("metapost")
-local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
+local starttiming = statistics.starttiming
+local stoptiming = statistics.stoptiming
-local mplib = mplib
+local mplib = mplib
-metapost = metapost or {}
-local metapost = metapost
+metapost = metapost or {}
+local metapost = metapost
-local v_no = interfaces.variables.no
+local setters = tokens.setters
+local setmacro = setters.macro
+local implement = interfaces.implement
+
+local v_no = interfaces.variables.no
metapost.defaultformat = "metafun"
metapost.defaultinstance = "metafun"
@@ -78,15 +85,155 @@ function metapost.getextensions(instance,state)
end
end
-function commands.getmpextensions(instance,state)
- context(metapost.getextensions(instance,state))
+-- function commands.getmpextensions(instance,state)
+-- context(metapost.getextensions(instance,state))
+-- end
+
+implement {
+ name = "setmpextensions",
+ actions = metapost.setextensions,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "getmpextensions",
+ actions = { metapost.getextensions, context } ,
+ arguments = "string"
+}
+
+local report_metapost = logs.reporter ("metapost")
+local status_metapost = logs.messenger("metapost")
+
+local patterns = {
+ "meta-imp-%s.mkiv",
+ "meta-imp-%s.tex",
+ -- obsolete:
+ "meta-%s.mkiv",
+ "meta-%s.tex"
+}
+
+local function action(name,foundname)
+ status_metapost("library %a is loaded",name)
+ context.startreadingfile()
+ context.input(foundname)
+ context.stopreadingfile()
+end
+
+local function failure(name)
+ report_metapost("library %a is unknown or invalid",name)
end
+implement {
+ name = "useMPlibrary",
+ arguments = "string",
+ actions = function(name)
+ resolvers.uselibrary {
+ name = name,
+ patterns = patterns,
+ action = action,
+ failure = failure,
+ onlyonce = true,
+ }
+ end
+}
+
+-- metapost.variables = { } -- to be stacked
+
+implement {
+ name = "mprunvar",
+ arguments = "string",
+ actions = function(name)
+ local value = metapost.variables[name]
+ if value ~= nil then
+ local tvalue = type(value)
+ if tvalue == "table" then
+ context(concat(value," "))
+ elseif tvalue == "number" or tvalue == "boolean" then
+ context(tostring(value))
+ elseif tvalue == "string" then
+ context(value)
+ end
+ end
+ end
+}
+
+implement {
+ name = "mpruntab",
+ arguments = { "string", "integer" },
+ actions = function(name,n)
+ local value = metapost.variables[name]
+ if value ~= nil then
+ local tvalue = type(value)
+ if tvalue == "table" then
+ context(value[n])
+ elseif tvalue == "number" or tvalue == "boolean" then
+ context(tostring(value))
+ elseif tvalue == "string" then
+ context(value)
+ end
+ end
+ end
+}
+
+implement {
+ name = "mprunset",
+ actions = function(name,connector)
+ local value = metapost.variables[name]
+ if value ~= nil then
+ local tvalue = type(value)
+ if tvalue == "table" then
+ context(concat(value,connector))
+ elseif tvalue == "number" or tvalue == "boolean" then
+ context(tostring(value))
+ elseif tvalue == "string" then
+ context(value)
+ end
+ end
+ end
+}
+
+-- we need to move more from pps to here as pps is the plugin .. the order is a mess
+-- or just move the scanners to pps
+
function metapost.graphic(specification)
- setmpsformat(specification)
- metapost.graphic_base_pass(specification)
+ metapost.graphic_base_pass(setmpsformat(specification))
end
+implement {
+ name = "mpgraphic",
+ actions = metapost.graphic,
+ arguments = {
+ {
+ { "instance" },
+ { "format" },
+ { "data" },
+ { "initializations" },
+ { "extensions" },
+ { "inclusions" },
+ { "definitions" },
+ { "figure" },
+ { "method" },
+ }
+ }
+}
+
+implement {
+ name = "mpsetoutercolor",
+ actions = function(...) metapost.setoutercolor(...) end, -- not yet implemented
+ arguments = { "integer", "integer", "integer", "integer" }
+}
+
+implement {
+ name = "mpflushreset",
+ actions = function() metapost.flushreset() end -- not yet implemented
+}
+
+implement {
+ name = "mpflushliteral",
+ actions = function(str) metapost.flushliteral(str) end, -- not yet implemented
+ arguments = "string",
+}
+
function metapost.getclippath(specification) -- why not a special instance for this
setmpsformat(specification)
local mpx = specification.mpx
@@ -135,11 +282,31 @@ end
function metapost.theclippath(...)
local result = metapost.getclippath(...)
if result then -- we could just print the table
- result = concat(metapost.flushnormalpath(result),"\n")
- context(result)
+-- return concat(metapost.flushnormalpath(result),"\n")
+ return concat(metapost.flushnormalpath(result)," ")
+ else
+ return ""
end
end
+implement {
+ name = "mpsetclippath",
+ actions = function(specification)
+ setmacro("MPclippath",metapost.theclippath(specification),"global")
+ end,
+ arguments = {
+ {
+ { "instance" },
+ { "format" },
+ { "data" },
+ { "initializations" },
+ { "useextensions" },
+ { "inclusions" },
+ { "method" },
+ },
+ }
+}
+
statistics.register("metapost processing time", function()
local n = metapost.n
if n and n > 0 then
@@ -165,17 +332,44 @@ end)
-- only used in graphictexts
metapost.tex = metapost.tex or { }
+local mptex = metapost.tex
local environments = { }
-function metapost.tex.set(str)
+function mptex.set(str)
environments[#environments+1] = str
end
-function metapost.tex.reset()
- environments = { }
+function mptex.setfrombuffer(name)
+ environments[#environments+1] = buffers.content(name)
end
-function metapost.tex.get()
+function mptex.get()
return concat(environments,"\n")
end
+
+function mptex.reset()
+ environments = { }
+end
+
+implement {
+ name = "mptexset",
+ arguments = "string",
+ actions = mptex.set
+}
+
+implement {
+ name = "mptexsetfrombuffer",
+ arguments = "string",
+ actions = mptex.setfrombuffer
+}
+
+implement {
+ name = "mptexget",
+ actions = { mptex.get, context }
+}
+
+implement {
+ name = "mptexreset",
+ actions = mptex.reset
+}
diff --git a/Master/texmf-dist/tex/context/base/mlib-ctx.mkiv b/Master/texmf-dist/tex/context/base/mlib-ctx.mkiv
index e4c1cb6fe3e..a7bb612c854 100644
--- a/Master/texmf-dist/tex/context/base/mlib-ctx.mkiv
+++ b/Master/texmf-dist/tex/context/base/mlib-ctx.mkiv
@@ -19,6 +19,7 @@
\registerctxluafile{mlib-run}{1.001}
\registerctxluafile{mlib-ctx}{1.001}
\registerctxluafile{mlib-lua}{1.001}
+\registerctxluafile{mlib-int}{1.001} % here ?
\unprotect
diff --git a/Master/texmf-dist/tex/context/base/mlib-int.lua b/Master/texmf-dist/tex/context/base/mlib-int.lua
new file mode 100644
index 00000000000..43bf14d3831
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mlib-int.lua
@@ -0,0 +1,149 @@
+if not modules then modules = { } end modules ['mlib-int'] = {
+ version = 1.001,
+ comment = "companion to mlib-ctx.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files",
+}
+
+local factor = number.dimenfactors.bp
+local mpprint = mp.print
+local mpboolean = mp.boolean
+local mpquoted = mp.quoted
+local getdimen = tex.getdimen
+local getcount = tex.getcount
+local get = tex.get
+local mpcolor = attributes.colors.mpcolor
+local emwidths = fonts.hashes.emwidths
+local exheights = fonts.hashes.exheights
+
+function mp.PaperHeight () mpprint(getdimen("paperheight") *factor) end
+function mp.PaperWidth () mpprint(getdimen("paperwidth") *factor) end
+function mp.PrintPaperHeight () mpprint(getdimen("printpaperheight") *factor) end
+function mp.PrintPaperWidth () mpprint(getdimen("printpaperwidth") *factor) end
+function mp.TopSpace () mpprint(getdimen("topspace") *factor) end
+function mp.BottomSpace () mpprint(getdimen("bottomspace") *factor) end
+function mp.BackSpace () mpprint(getdimen("backspace") *factor) end
+function mp.CutSpace () mpprint(getdimen("cutspace") *factor) end
+function mp.MakeupHeight () mpprint(getdimen("makeupheight") *factor) end
+function mp.MakeupWidth () mpprint(getdimen("makeupwidth") *factor) end
+function mp.TopHeight () mpprint(getdimen("topheight") *factor) end
+function mp.TopDistance () mpprint(getdimen("topdistance") *factor) end
+function mp.HeaderHeight () mpprint(getdimen("headerheight") *factor) end
+function mp.HeaderDistance () mpprint(getdimen("headerdistance") *factor) end
+function mp.TextHeight () mpprint(getdimen("textheight") *factor) end
+function mp.FooterDistance () mpprint(getdimen("footerdistance") *factor) end
+function mp.FooterHeight () mpprint(getdimen("footerheight") *factor) end
+function mp.BottomDistance () mpprint(getdimen("bottomdistance") *factor) end
+function mp.BottomHeight () mpprint(getdimen("bottomheight") *factor) end
+function mp.LeftEdgeWidth () mpprint(getdimen("leftedgewidth") *factor) end
+function mp.LeftEdgeDistance () mpprint(getdimen("leftedgedistance") *factor) end
+function mp.LeftMarginWidth () mpprint(getdimen("leftmarginwidth") *factor) end
+function mp.LeftMarginDistance () mpprint(getdimen("leftmargindistance") *factor) end
+function mp.TextWidth () mpprint(getdimen("textwidth") *factor) end
+function mp.RightMarginDistance () mpprint(getdimen("rightmargindistance") *factor) end
+function mp.RightMarginWidth () mpprint(getdimen("rightmarginwidth") *factor) end
+function mp.RightEdgeDistance () mpprint(getdimen("rightedgedistance") *factor) end
+function mp.RightEdgeWidth () mpprint(getdimen("rightedgewidth") *factor) end
+function mp.InnerMarginDistance () mpprint(getdimen("innermargindistance") *factor) end
+function mp.InnerMarginWidth () mpprint(getdimen("innermarginwidth") *factor) end
+function mp.OuterMarginDistance () mpprint(getdimen("outermargindistance") *factor) end
+function mp.OuterMarginWidth () mpprint(getdimen("outermarginwidth") *factor) end
+function mp.InnerEdgeDistance () mpprint(getdimen("inneredgedistance") *factor) end
+function mp.InnerEdgeWidth () mpprint(getdimen("inneredgewidth") *factor) end
+function mp.OuterEdgeDistance () mpprint(getdimen("outeredgedistance") *factor) end
+function mp.OuterEdgeWidth () mpprint(getdimen("outeredgewidth") *factor) end
+function mp.PageOffset () mpprint(getdimen("pagebackgroundoffset")*factor) end
+function mp.PageDepth () mpprint(getdimen("pagebackgrounddepth") *factor) end
+function mp.LayoutColumns () mpprint(getcount("layoutcolumns")) end
+function mp.LayoutColumnDistance() mpprint(getdimen("layoutcolumndistance")*factor) end
+function mp.LayoutColumnWidth () mpprint(getdimen("layoutcolumnwidth") *factor) end
+function mp.SpineWidth () mpprint(getdimen("spinewidth") *factor) end
+function mp.PaperBleed () mpprint(getdimen("paperbleed") *factor) end
+
+function mp.PageNumber () mpprint(getcount("pageno")) end
+function mp.RealPageNumber () mpprint(getcount("realpageno")) end
+function mp.NOfPages () mpprint(getcount("lastpageno")) end
+
+function mp.CurrentColumn () mpprint(getcount("mofcolumns")) end
+function mp.NOfColumns () mpprint(getcount("nofcolumns")) end
+
+function mp.BaseLineSkip () mpprint(getdimen("baselineskip") *factor) end
+function mp.LineHeight () mpprint(getdimen("lineheight") *factor) end
+function mp.BodyFontSize () mpprint(getdimen("bodyfontsize") *factor) end
+
+function mp.TopSkip () mpprint(getdimen("topskip") *factor) end
+function mp.StrutHeight () mpprint(getdimen("strutht") *factor) end
+function mp.StrutDepth () mpprint(getdimen("strutdp") *factor) end
+
+function mp.PageNumber () mpprint(getcount("pageno")) end
+function mp.RealPageNumber () mpprint(getcount("realpageno")) end
+function mp.NOfPages () mpprint(getcount("lastpageno")) end
+
+function mp.CurrentWidth () mpprint(get("hsize") *factor) end
+function mp.CurrentHeight () mpprint(get("vsize") *factor) end
+
+function mp.EmWidth () mpprint(emwidths [false]*factor) end
+function mp.ExHeight () mpprint(exheights[false]*factor) end
+
+mp.HSize = mp.CurrentWidth
+mp.VSize = mp.CurrentHeight
+mp.LastPageNumber = mp.NOfPages
+
+function mp.PageFraction ()
+ local lastpage = getcount("lastpageno")
+ if lastpage > 1 then
+ mpprint((getcount("realpageno")-1)/(lastpage-1))
+ else
+ mpprint(1)
+ end
+end
+
+-- locals
+
+mp.OnRightPage = function() mpprint(structures.pages.on_right()) end -- needs checking
+mp.OnOddPage = function() mpprint(structures.pages.is_odd ()) end -- needs checking
+mp.InPageBody = function() mpprint(structures.pages.in_body ()) end -- needs checking
+
+-- mp.CurrentLayout : \currentlayout
+
+function mp.OverlayWidth () mpprint(getdimen("d_overlay_width") *factor) end
+function mp.OverlayHeight () mpprint(getdimen("d_overlay_height") *factor) end
+function mp.OverlayDepth () mpprint(getdimen("d_overlay_depth") *factor) end
+function mp.OverlayLineWidth () mpprint(getdimen("d_overlay_linewidth")*factor) end
+function mp.OverlayOffset () mpprint(getdimen("d_overlay_offset") *factor) end
+
+function mp.defaultcolormodel()
+ local colormethod = getcount("MPcolormethod")
+ -- if colormethod == 0 then
+ -- return 1
+ -- elseif colormethod == 1 then
+ -- return 1
+ -- elseif colormethod == 2 then
+ -- return 3
+ -- else
+ -- return 3
+ -- end
+ return (colormethod == 0 or colormethod == 1) and 1 or 3
+end
+
+-- not much difference (10000 calls in a graphic neither as expansion seems to win
+-- over defining the macro etc) so let's not waste counters then
+
+-- function mp.OverlayColor()
+-- local c = mpcolor(
+-- getcount("c_overlay_colormodel"),
+-- getcount("c_overlay_color"),
+-- getcount("c_overlay_transparency")
+-- )
+-- mpquoted(c)
+-- end
+--
+-- function mp.OverlayLineColor()
+-- local c = mpcolor(
+-- getcount("c_overlay_colormodel"),
+-- getcount("c_overlay_linecolor"),
+-- getcount("c_overlay_linetransparency")
+-- )
+-- mpquoted(c)
+-- end
diff --git a/Master/texmf-dist/tex/context/base/mlib-lua.lua b/Master/texmf-dist/tex/context/base/mlib-lua.lua
index e3a3ba5d8db..7e05684630d 100644
--- a/Master/texmf-dist/tex/context/base/mlib-lua.lua
+++ b/Master/texmf-dist/tex/context/base/mlib-lua.lua
@@ -1,4 +1,4 @@
-if not modules then modules = { } end modules ['mlib-pdf'] = {
+if not modules then modules = { } end modules ['mlib-lua'] = {
version = 1.001,
comment = "companion to mlib-ctx.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -11,16 +11,21 @@ if not modules then modules = { } end modules ['mlib-pdf'] = {
-- maybe we need mplib.model, but how with instances
local type, tostring, select, loadstring = type, tostring, select, loadstring
-local formatters = string.formatters
local find, gsub = string.find, string.gsub
-local concat = table.concat
-local lpegmatch = lpeg.match
+
+local formatters = string.formatters
+local concat = table.concat
+local lpegmatch = lpeg.match
+
+local P, S, Ct = lpeg.P, lpeg.S, lpeg.Ct
local report_luarun = logs.reporter("metapost","lua")
local trace_luarun = false trackers.register("metapost.lua",function(v) trace_luarun = v end)
local trace_enabled = true
+local be_tolerant = true directives.register("metapost.lua.tolerant",function(v) be_tolerant = v end)
+
mp = mp or { } -- system namespace
MP = MP or { } -- user namespace
@@ -53,6 +58,8 @@ function mp._f_()
end
end
+local f_code = formatters["%s return mp._f_()"]
+
local f_numeric = formatters["%.16f"]
local f_pair = formatters["(%.16f,%.16f)"]
local f_triplet = formatters["(%.16f,%.16f,%.16f)"]
@@ -61,20 +68,32 @@ local f_quadruple = formatters["(%.16f,%.16f,%.16f,%.16f)"]
function mp.print(...)
for i=1,select("#",...) do
local value = select(i,...)
- if value then
+ if value ~= nil then
n = n + 1
local t = type(value)
if t == "number" then
buffer[n] = f_numeric(value)
elseif t == "string" then
buffer[n] = value
- else
+ elseif t == "table" then
+ buffer[n] = "(" .. concat(value,",") .. ")"
+ else -- boolean or whatever
buffer[n] = tostring(value)
end
end
end
end
+function mp.boolean(n)
+ n = n + 1
+ buffer[n] = n and "true" or "false"
+end
+
+function mp.numeric(n)
+ n = n + 1
+ buffer[n] = n and f_numeric(n) or "0"
+end
+
function mp.pair(x,y)
n = n + 1
if type(x) == "table" then
@@ -102,6 +121,55 @@ function mp.quadruple(w,x,y,z)
end
end
+function mp.path(t,connector,cycle)
+ if type(t) == "table" then
+ local tn = #t
+ if tn > 0 then
+ if connector == true then
+ connector = "--"
+ cycle = true
+ elseif not connector then
+ connector = "--"
+ end
+ local ti = t[1]
+ n = n + 1 ; buffer[n] = f_pair(ti[1],ti[2])
+ for i=2,tn do
+ local ti = t[i]
+ n = n + 1 ; buffer[n] = connector
+ n = n + 1 ; buffer[n] = f_pair(ti[1],ti[2])
+ end
+ if cycle then
+ n = n + 1 ; buffer[n] = connector
+ n = n + 1 ; buffer[n] = "cycle"
+ end
+ end
+ end
+end
+
+function mp.size(t)
+ n = n + 1
+ buffer[n] = type(t) == "table" and f_numeric(#t) or "0"
+end
+
+-- experiment: names can change
+
+local datasets = { }
+mp.datasets = datasets
+
+function datasets.load(tag,filename)
+ if not filename then
+ tag, filename = file.basename(tag), tag
+ end
+ local data = mp.dataset(io.loaddata(filename) or "")
+ datasets[tag] = {
+ Data = data,
+ Line = function(n) mp.path(data[n or 1]) end,
+ Size = function() mp.size(data) end,
+ }
+end
+
+--
+
local replacer = lpeg.replacer("@","%%")
function mp.format(fmt,...)
@@ -124,7 +192,53 @@ function mp.quoted(fmt,s,...)
end
end
-local f_code = formatters["%s return mp._f_()"]
+function mp.n(t)
+ return type(t) == "table" and #t or 0
+end
+
+local whitespace = lpeg.patterns.whitespace
+local newline = lpeg.patterns.newline
+local setsep = newline^2
+local comment = (S("#%") + P("--")) * (1-newline)^0 * (whitespace - setsep)^0
+local value = (1-whitespace)^1 / tonumber
+local entry = Ct( value * whitespace * value)
+local set = Ct((entry * (whitespace-setsep)^0 * comment^0)^1)
+local series = Ct((set * whitespace^0)^1)
+
+local pattern = whitespace^0 * series
+
+function mp.dataset(str)
+ return lpegmatch(pattern,str)
+end
+
+-- \startluacode
+-- local str = [[
+-- 10 20 20 20
+-- 30 40 40 60
+-- 50 10
+--
+-- 10 10 20 30
+-- 30 50 40 50
+-- 50 20 -- the last one
+--
+-- 10 20 % comment
+-- 20 10
+-- 30 40 # comment
+-- 40 20
+-- 50 10
+-- ]]
+--
+-- MP.myset = mp.dataset(str)
+--
+-- inspect(MP.myset)
+-- \stopluacode
+--
+-- \startMPpage
+-- color c[] ; c[1] := red ; c[2] := green ; c[3] := blue ;
+-- for i=1 upto lua("mp.print(mp.n(MP.myset))") :
+-- draw lua("mp.path(MP.myset[" & decimal i & "])") withcolor c[i] ;
+-- endfor ;
+-- \stopMPpage
-- function metapost.runscript(code)
-- local f = loadstring(f_code(code))
@@ -147,13 +261,17 @@ local f_code = formatters["%s return mp._f_()"]
local cache, n = { }, 0 -- todo: when > n then reset cache or make weak
function metapost.runscript(code)
- if trace_enabled and trace_luarun then
+ local trace = trace_enabled and trace_luarun
+ if trace then
report_luarun("code: %s",code)
end
local f
if n > 100 then
cache = nil -- forget about caching
f = loadstring(f_code(code))
+ if not f and be_tolerant then
+ f = loadstring(code)
+ end
else
f = cache[code]
if not f then
@@ -161,6 +279,12 @@ function metapost.runscript(code)
if f then
n = n + 1
cache[code] = f
+ elseif be_tolerant then
+ f = loadstring(code)
+ if f then
+ n = n + 1
+ cache[code] = f
+ end
end
end
end
@@ -169,13 +293,21 @@ function metapost.runscript(code)
if result then
local t = type(result)
if t == "number" then
- return f_numeric(result)
+ t = f_numeric(result)
elseif t == "string" then
- return result
+ t = result
else
- return tostring(result)
+ t = tostring(result)
end
+ if trace then
+ report_luarun("result: %s",code)
+ end
+ return t
+ elseif trace then
+ report_luarun("no result")
end
+ else
+ report_luarun("no result, invalid code")
end
return ""
end
@@ -201,12 +333,51 @@ local get_number = get_numeric
local currentmpx = nil
-mp.numeric = function(s) return get_numeric(currentmpx,s) end
-mp.string = function(s) return get_string (currentmpx,s) end
-mp.boolean = function(s) return get_boolean(currentmpx,s) end
-mp.number = mp.numeric
+local get = { }
+mp.get = get
+
+get.numeric = function(s) return get_numeric(currentmpx,s) end
+get.string = function(s) return get_string (currentmpx,s) end
+get.boolean = function(s) return get_boolean(currentmpx,s) end
+get.number = mp.numeric
function metapost.initializescriptrunner(mpx,trialrun)
currentmpx = mpx
- trace_enabled = not trialrun
+ if trace_luarun then
+ report_luarun("type of run: %s", trialrun and "trial" or "final")
+ end
+ -- trace_enabled = not trialrun blocks too much
+end
+
+-- texts:
+
+local factor = 65536*(7227/7200)
+local textexts = nil
+local mptriplet = mp.triplet
+
+function mp.tt_initialize(tt)
+ textexts = tt
+end
+
+-- function mp.tt_wd(n)
+-- local box = textexts and textexts[n]
+-- mpprint(box and box.width/factor or 0)
+-- end
+-- function mp.tt_ht(n)
+-- local box = textexts and textexts[n]
+-- mpprint(box and box.height/factor or 0)
+-- end
+-- function mp.tt_dp(n)
+-- local box = textexts and textexts[n]
+-- mpprint(box and box.depth/factor or 0)
+-- end
+
+function mp.tt_dimensions(n)
+ local box = textexts[n]
+ if box then
+ -- could be made faster with nuts but not critical
+ mptriplet(box.width/factor,box.height/factor,box.depth/factor)
+ else
+ mptriplet(0,0,0)
+ end
end
diff --git a/Master/texmf-dist/tex/context/base/mlib-pdf.lua b/Master/texmf-dist/tex/context/base/mlib-pdf.lua
index d25dde88469..8de09f42a60 100644
--- a/Master/texmf-dist/tex/context/base/mlib-pdf.lua
+++ b/Master/texmf-dist/tex/context/base/mlib-pdf.lua
@@ -19,13 +19,19 @@ local report_metapost = logs.reporter("metapost")
local trace_variables = false trackers.register("metapost.variables",function(v) trace_variables = v end)
-local mplib, context = mplib, context
+local mplib = mplib
+local context = context
local allocate = utilities.storage.allocate
local copy_node = node.copy
local write_node = node.write
+local pen_info = mplib.pen_info
+local object_fields = mplib.fields
+
+local save_table = false
+
metapost = metapost or { }
local metapost = metapost
@@ -33,7 +39,6 @@ metapost.flushers = metapost.flushers or { }
local pdfflusher = { }
metapost.flushers.pdf = pdfflusher
-metapost.multipass = false -- to be stacked
metapost.n = 0
metapost.optimize = true -- false
@@ -53,9 +58,19 @@ local f_J = formatters["%i J"]
local f_d = formatters["[%s] %F d"]
local f_w = formatters["%F w"]
-local pdfliteral = function(s)
+directives.register("metapost.savetable",function(v)
+ if type(v) == "string" then
+ save_table = file.addsuffix(v,"mpl")
+ elseif v then
+ save_table = file.addsuffix(environment.jobname .. "-graphic","mpl")
+ else
+ save_table = false
+ end
+end)
+
+local pdfliteral = function(pdfcode)
local literal = copy_node(mpsliteral)
- literal.data = s
+ literal.data = pdfcode
return literal
end
@@ -64,18 +79,19 @@ end
-- get a new result table and the stored objects are forgotten. Otherwise they
-- are reused.
-local function getobjects(result,figure,f)
+local function getobjects(result,figure,index)
if metapost.optimize then
- local objects = result.objects
- if not objects then
- result.objects = { }
+ local robjects = result.objects
+ if not robjects then
+ robjects = { }
+ result.objects = robjects
end
- objects = result.objects[f]
- if not objects then
- objects = figure:objects()
- result.objects[f] = objects
+ local fobjects = robjects[index or 1]
+ if not fobjects then
+ fobjects = figure:objects()
+ robjects[index] = fobjects
end
- return objects
+ return fobjects
else
return figure:objects()
end
@@ -83,15 +99,20 @@ end
function metapost.convert(result, trialrun, flusher, multipass, askedfig)
if trialrun then
- metapost.multipass = false
- metapost.parse(result, askedfig)
- if multipass and not metapost.multipass and metapost.optimize then
- metapost.flush(result, flusher, askedfig) -- saves a run
+ local multipassindeed = metapost.parse(result,askedfig)
+ if multipass and not multipassindeed and metapost.optimize then
+ if save_table then
+ table.save(save_table,metapost.totable(result,1)) -- direct
+ end
+ metapost.flush(result,flusher,askedfig) -- saves a run
else
return false
end
else
- metapost.flush(result, flusher, askedfig)
+ if save_table then
+ table.save(save_table,metapost.totable(result,1)) -- direct
+ end
+ metapost.flush(result,flusher,askedfig)
end
return true -- done
end
@@ -168,8 +189,6 @@ local bend_tolerance = 131/65536
local rx, sx, sy, ry, tx, ty, divider = 1, 0, 0, 1, 0, 0, 1
-local pen_info = mplib.pen_info
-
local function pen_characteristics(object)
local t = pen_info(object)
rx, ry, sx, sy, tx, ty = t.rx, t.ry, t.sx, t.sy, t.tx, t.ty
@@ -323,32 +342,8 @@ local variable =
local pattern_lst = (variable * newline^0)^0
-metapost.variables = { } -- to be stacked
-metapost.llx = 0 -- to be stacked
-metapost.lly = 0 -- to be stacked
-metapost.urx = 0 -- to be stacked
-metapost.ury = 0 -- to be stacked
-
-function commands.mprunvar(key,n) -- should be defined in another lib
- local value = metapost.variables[key]
- if value ~= nil then
- local tvalue = type(value)
- if tvalue == "table" then
- local ntype = type(n)
- if ntype == "number" then
- context(value[n])
- elseif ntype == "string" then
- context(concat(value,n))
- else
- context(concat(value," "))
- end
- elseif tvalue == "number" or tvalue == "boolean" then
- context(tostring(value))
- elseif tvalue == "string" then
- context(value)
- end
- end
-end
+metapost.variables = { } -- to be stacked
+metapost.properties = { } -- to be stacked
function metapost.untagvariable(str,variables) -- will be redone
if variables == false then
@@ -374,6 +369,30 @@ function metapost.processspecial(str)
end
end
+local function setproperties(figure)
+ local boundingbox = figure:boundingbox()
+ local properties = {
+ llx = boundingbox[1],
+ lly = boundingbox[2],
+ urx = boundingbox[3],
+ ury = boundingbox[4],
+ slot = figure:charcode(),
+ width = figure:width(),
+ height = figure:height(),
+ depth = figure:depth(),
+ italic = figure:italcorr(),
+ number = figure:charcode() or 0,
+ }
+ metapost.properties = properties
+ return properties
+end
+
+local function setvariables(figure)
+ local variables = { }
+ metapost.variables = variables
+ return variables
+end
+
function metapost.flush(result,flusher,askedfig)
if result then
local figures = result.fig
@@ -388,42 +407,27 @@ function metapost.flush(result,flusher,askedfig)
local flushfigure = flusher.flushfigure
local textfigure = flusher.textfigure
local processspecial = flusher.processspecial or metapost.processspecial
- for f=1,#figures do
- local figure = figures[f]
- local objects = getobjects(result,figure,f)
- local fignum = figure:charcode() or 0
- if askedfig == "direct" or askedfig == "all" or askedfig == fignum then
- local t = { }
+ local variables = setvariables(figure) -- also resets then in case of not found
+ for index=1,#figures do
+ local figure = figures[index]
+ local properties = setproperties(figure)
+ if askedfig == "direct" or askedfig == "all" or askedfig == properties.number then
+ local objects = getobjects(result,figure,index)
+ local result = { }
local miterlimit, linecap, linejoin, dashed = -1, -1, -1, false
- local bbox = figure:boundingbox()
- local llx, lly, urx, ury = bbox[1], bbox[2], bbox[3], bbox[4]
- local variables = { }
- metapost.variables = variables
- metapost.properties = {
- llx = llx,
- lly = lly,
- urx = urx,
- ury = ury,
- slot = figure:charcode(),
- width = figure:width(),
- height = figure:height(),
- depth = figure:depth(),
- italic = figure:italcorr(),
- }
- -- replaced by the above
- metapost.llx = llx
- metapost.lly = lly
- metapost.urx = urx
- metapost.ury = ury
+ local llx = properties.llx
+ local lly = properties.lly
+ local urx = properties.urx
+ local ury = properties.ury
if urx < llx then
-- invalid
- startfigure(fignum,0,0,0,0,"invalid",figure)
+ startfigure(properties.number,0,0,0,0,"invalid",figure)
stopfigure()
else
- startfigure(fignum,llx,lly,urx,ury,"begin",figure)
- t[#t+1] = "q"
+ startfigure(properties.number,llx,lly,urx,ury,"begin",figure)
+ result[#result+1] = "q"
if objects then
- resetplugins(t) -- we should move the colorinitializer here
+ resetplugins(result) -- we should move the colorinitializer here
for o=1,#objects do
local object = objects[o]
local objecttype = object.type
@@ -434,20 +438,21 @@ function metapost.flush(result,flusher,askedfig)
processspecial(object.prescript)
end
elseif objecttype == "start_clip" then
- t[#t+1] = "q"
- flushnormalpath(object.path,t,false)
- t[#t+1] = "W n"
+ local evenodd = not object.istext and object.postscript == "evenodd"
+ result[#result+1] = "q"
+ flushnormalpath(object.path,result,false)
+ result[#result+1] = evenodd and "W* n" or "W n"
elseif objecttype == "stop_clip" then
- t[#t+1] = "Q"
- miterlimit, linecap, linejoin, dashed = -1, -1, -1, false
+ result[#result+1] = "Q"
+ miterlimit, linecap, linejoin, dashed = -1, -1, -1, "" -- was false
elseif objecttype == "text" then
- t[#t+1] = "q"
+ result[#result+1] = "q"
local ot = object.transform -- 3,4,5,6,1,2
- t[#t+1] = f_cm(ot[3],ot[4],ot[5],ot[6],ot[1],ot[2]) -- TH: formatters["%F %F m %F %F %F %F 0 0 cm"](unpack(ot))
- flushfigure(t) -- flush accumulated literals
- t = { }
+ result[#result+1] = f_cm(ot[3],ot[4],ot[5],ot[6],ot[1],ot[2]) -- TH: formatters["%F %F m %F %F %F %F 0 0 cm"](unpack(ot))
+ flushfigure(result) -- flush accumulated literals
+ result = { }
textfigure(object.font,object.dsize,object.text,object.width,object.height,object.depth)
- t[#t+1] = "Q"
+ result[#result+1] = "Q"
else
-- we use an indirect table as we want to overload
-- entries but this is not possible in userdata
@@ -463,32 +468,32 @@ function metapost.flush(result,flusher,askedfig)
local before, after = processplugins(object)
local objecttype = object.type -- can have changed
if before then
- t = pluginactions(before,t,flushfigure)
+ result = pluginactions(before,result,flushfigure)
end
local ml = object.miterlimit
if ml and ml ~= miterlimit then
miterlimit = ml
- t[#t+1] = f_M(ml)
+ result[#result+1] = f_M(ml)
end
local lj = object.linejoin
if lj and lj ~= linejoin then
linejoin = lj
- t[#t+1] = f_j(lj)
+ result[#result+1] = f_j(lj)
end
local lc = object.linecap
if lc and lc ~= linecap then
linecap = lc
- t[#t+1] = f_J(lc)
+ result[#result+1] = f_J(lc)
end
local dl = object.dash
if dl then
local d = f_d(concat(dl.dashes or {}," "),dl.offset)
if d ~= dashed then
dashed = d
- t[#t+1] = dashed
+ result[#result+1] = d
end
- elseif dashed then
- t[#t+1] = "[] 0 d"
+ elseif dashed ~= false then -- was just dashed test
+ result[#result+1] = "[] 0 d"
dashed = false
end
local path = object.path -- newpath
@@ -498,7 +503,7 @@ function metapost.flush(result,flusher,askedfig)
if pen then
if pen.type == 'elliptical' then
transformed, penwidth = pen_characteristics(original) -- boolean, value
- t[#t+1] = f_w(penwidth) -- todo: only if changed
+ result[#result+1] = f_w(penwidth) -- todo: only if changed
if objecttype == 'fill' then
objecttype = 'both'
end
@@ -507,58 +512,59 @@ function metapost.flush(result,flusher,askedfig)
end
end
if transformed then
- t[#t+1] = "q"
+ result[#result+1] = "q"
end
+ local evenodd = not object.istext and object.postscript == "evenodd"
if path then
if transformed then
- flushconcatpath(path,t,open)
+ flushconcatpath(path,result,open)
else
- flushnormalpath(path,t,open)
+ flushnormalpath(path,result,open)
end
if objecttype == "fill" then
- t[#t+1] = "h f"
+ result[#result+1] = evenodd and "h f*" or "h f" -- f* = eo
elseif objecttype == "outline" then
- t[#t+1] = open and "S" or "h S"
+ result[#result+1] = open and "S" or "h S"
elseif objecttype == "both" then
- t[#t+1] = "h B"
+ result[#result+1] = evenodd and "h B*" or "h B"-- B* = eo -- b includes closepath
end
end
if transformed then
- t[#t+1] = "Q"
+ result[#result+1] = "Q"
end
local path = object.htap
if path then
if transformed then
- t[#t+1] = "q"
+ result[#result+1] = "q"
end
if transformed then
- flushconcatpath(path,t,open)
+ flushconcatpath(path,result,open)
else
- flushnormalpath(path,t,open)
+ flushnormalpath(path,result,open)
end
if objecttype == "fill" then
- t[#t+1] = "h f"
+ result[#result+1] = evenodd and "h f*" or "h f" -- f* = eo
elseif objecttype == "outline" then
- t[#t+1] = open and "S" or "h S"
+ result[#result+1] = open and "S" or "h S"
elseif objecttype == "both" then
- t[#t+1] = "h B"
+ result[#result+1] = evenodd and "h B*" or "h B"-- B* = eo -- b includes closepath
end
if transformed then
- t[#t+1] = "Q"
+ result[#result+1] = "Q"
end
end
if after then
- t = pluginactions(after,t,flushfigure)
+ result = pluginactions(after,result,flushfigure)
end
if object.grouped then
-- can be qQ'd so changes can end up in groups
- miterlimit, linecap, linejoin, dashed = -1, -1, -1, false
+ miterlimit, linecap, linejoin, dashed = -1, -1, -1, "" -- was false
end
end
end
end
- t[#t+1] = "Q"
- flushfigure(t)
+ result[#result+1] = "Q"
+ flushfigure(result)
stopfigure("end")
end
if askedfig ~= "all" then
@@ -574,20 +580,18 @@ function metapost.parse(result,askedfig)
if result then
local figures = result.fig
if figures then
+ local multipass = false
local analyzeplugins = metapost.analyzeplugins -- each object
- for f=1,#figures do
- local figure = figures[f]
- local fignum = figure:charcode() or 0
- if askedfig == "direct" or askedfig == "all" or askedfig == fignum then
- local bbox = figure:boundingbox()
- metapost.llx = bbox[1]
- metapost.lly = bbox[2]
- metapost.urx = bbox[3]
- metapost.ury = bbox[4]
- local objects = getobjects(result,figure,f)
+ for index=1,#figures do
+ local figure = figures[index]
+ local properties = setproperties(figure)
+ if askedfig == "direct" or askedfig == "all" or askedfig == properties.number then
+ local objects = getobjects(result,figure,index)
if objects then
for o=1,#objects do
- analyzeplugins(objects[o])
+ if analyzeplugins(objects[o]) then
+ multipass = true
+ end
end
end
if askedfig ~= "all" then
@@ -595,24 +599,24 @@ function metapost.parse(result,askedfig)
end
end
end
+ return multipass
end
end
end
-- tracing:
-local t = { }
+local result = { }
local flusher = {
startfigure = function()
- t = { }
+ result = { }
context.startnointerference()
end,
flushfigure = function(literals)
- local n = #t
- for i=1, #literals do
- n = n + 1
- t[n] = literals[i]
+ local n = #result
+ for i=1,#literals do
+ result[n+i] = literals[i]
end
end,
stopfigure = function()
@@ -622,30 +626,35 @@ local flusher = {
function metapost.pdfliterals(result)
metapost.flush(result,flusher)
- return t
+ return result
end
--- so far
-
-function metapost.totable(result)
- local figure = result and result.fig and result.fig[1]
+function metapost.totable(result,askedfig)
+ local askedfig = askedfig or 1
+ local figure = result and result.fig and result.fig[1]
if figure then
- local t = { }
- local objects = figure:objects()
+ local results = { }
+ -- local objects = figure:objects()
+ local objects = getobjects(result,figure,askedfig)
for o=1,#objects do
local object = objects[o]
- local tt = { }
- local fields = mplib.fields(object)
+ local result = { }
+ local fields = object_fields(object) -- hm, is this the whole list, if so, we can get it once
for f=1,#fields do
local field = fields[f]
- tt[field] = object[field]
+ result[field] = object[field]
end
- t[o] = tt
+ results[o] = result
end
- local b = figure:boundingbox()
+ local boundingbox = figure:boundingbox()
return {
- boundingbox = { llx = b[1], lly = b[2], urx = b[3], ury = b[4] },
- objects = t
+ boundingbox = {
+ llx = boundingbox[1],
+ lly = boundingbox[2],
+ urx = boundingbox[3],
+ ury = boundingbox[4],
+ },
+ objects = results
}
else
return nil
diff --git a/Master/texmf-dist/tex/context/base/mlib-pdf.mkiv b/Master/texmf-dist/tex/context/base/mlib-pdf.mkiv
index 0913b3699ae..92bf86ea9f1 100644
--- a/Master/texmf-dist/tex/context/base/mlib-pdf.mkiv
+++ b/Master/texmf-dist/tex/context/base/mlib-pdf.mkiv
@@ -88,7 +88,7 @@
% MPLIB specific:
-\def\MPLIBtoPDF#1{\ctxlua{metapost.flushliteral(#1)}}
+\def\MPLIBtoPDF{\clf_mpflushliteral}
\def\startMPLIBtoPDF#1#2#3#4%
{\meta_process_graphic_figure_start
@@ -109,7 +109,7 @@
\meta_process_graphic_figure_stop}
\def\MPLIBflushreset % This can (will) move to the Lua end.
- {\ctxlua{metapost.flushreset()}}
+ {\clf_mpflushreset}
%D Kind of special:
%
@@ -134,27 +134,50 @@
\unexpanded\def\directMPgraphic
{\dodoublegroupempty\mlib_direct_graphic}
+% \def\mlib_direct_graphic#1#2% makes pages (todo: make boxes)
+% {\meta_begin_graphic_group{#1}%
+% \let\startMPLIBtoPDF\directstartMPLIBtoPDF
+% \let\stopMPLIBtoPDF \directstopMPLIBtoPDF
+% \meta_start_current_graphic
+% \forgetall
+% \edef\p_extensions{\MPinstanceparameter\s!extensions}%
+% \normalexpanded{\noexpand\ctxlua{metapost.graphic {
+% instance = "\currentMPinstance",
+% format = "\currentMPformat",
+% data = \!!bs#2;\!!es,
+% initializations = \!!bs\meta_flush_current_initializations\!!es,
+% % useextensions = "\MPinstanceparameter\s!extensions",
+% \ifx\p_extensions\v!yes
+% extensions = \!!bs\clf_getmpextensions{\currentMPinstance}\!!es,
+% \fi
+% inclusions = \!!bs\meta_flush_current_inclusions\!!es,
+% definitions = \!!bs\meta_flush_current_definitions\!!es,
+% figure = "all",
+% method = "\MPinstanceparameter\c!method",
+% }}}%
+% \meta_stop_current_graphic
+% \meta_end_graphic_group}
+
\def\mlib_direct_graphic#1#2% makes pages (todo: make boxes)
{\meta_begin_graphic_group{#1}%
\let\startMPLIBtoPDF\directstartMPLIBtoPDF
\let\stopMPLIBtoPDF \directstopMPLIBtoPDF
\meta_start_current_graphic
- \forgetall
- \edef\p_extensions{\MPinstanceparameter\s!extensions}%
- \normalexpanded{\noexpand\ctxlua{metapost.graphic {
- instance = "\currentMPinstance",
- format = "\currentMPformat",
- data = \!!bs#2;\!!es,
- initializations = \!!bs\meta_flush_current_initializations\!!es,
-% useextensions = "\MPinstanceparameter\s!extensions",
-\ifx\p_extensions\v!yes
- extensions = \!!bs\ctxcommand{getmpextensions("\currentMPinstance")}\!!es,
-\fi
- inclusions = \!!bs\meta_flush_current_inclusions\!!es,
- definitions = \!!bs\meta_flush_current_definitions\!!es,
- figure = "all",
- method = "\MPinstanceparameter\c!method",
- }}}%
+ \forgetall
+ \edef\p_extensions{\MPinstanceparameter\s!extensions}%
+ \normalexpanded{\noexpand\clf_mpgraphic
+ instance {\currentMPinstance}%
+ format {\currentMPformat}%
+ data {#2;}%
+ initializations {\meta_flush_current_initializations}%
+ \ifx\p_extensions\v!yes
+ extensions {\clf_getmpextensions{\currentMPinstance}}%
+ \fi
+ inclusions {\meta_flush_current_inclusions}%
+ definitions {\meta_flush_current_definitions}%
+ figure {all}%
+ method {\MPinstanceparameter\c!method}%
+ \relax}%
\meta_stop_current_graphic
\meta_end_graphic_group}
diff --git a/Master/texmf-dist/tex/context/base/mlib-pps.lua b/Master/texmf-dist/tex/context/base/mlib-pps.lua
index ce95d5ca734..ab56699b9f9 100644
--- a/Master/texmf-dist/tex/context/base/mlib-pps.lua
+++ b/Master/texmf-dist/tex/context/base/mlib-pps.lua
@@ -6,10 +6,8 @@ if not modules then modules = { } end modules ['mlib-pps'] = {
license = "see context related readme files",
}
--- todo: pass multipass nicer
-
local format, gmatch, match, split = string.format, string.gmatch, string.match, string.split
-local tonumber, type = tonumber, type
+local tonumber, type, unpack = tonumber, type, unpack
local round = math.round
local insert, remove, concat = table.insert, table.remove, table.concat
local Cs, Cf, C, Cg, Ct, P, S, V, Carg = lpeg.Cs, lpeg.Cf, lpeg.C, lpeg.Cg, lpeg.Ct, lpeg.P, lpeg.S, lpeg.V, lpeg.Carg
@@ -21,8 +19,12 @@ local mplib, metapost, lpdf, context = mplib, metapost, lpdf, context
local context = context
local context_setvalue = context.setvalue
+local implement = interfaces.implement
+local setmacro = interfaces.setmacro
+
local texgetbox = tex.getbox
local texsetbox = tex.setbox
+local textakebox = tex.takebox
local copy_list = node.copy_list
local free_list = node.flush_list
local setmetatableindex = table.setmetatableindex
@@ -40,11 +42,19 @@ local report_textexts = logs.reporter("metapost","textexts")
local report_scripts = logs.reporter("metapost","scripts")
local colors = attributes.colors
+local defineprocesscolor = colors.defineprocesscolor
+local definespotcolor = colors.definespotcolor
+local definemultitonecolor = colors.definemultitonecolor
+local colorvalue = colors.value
+
+local transparencies = attributes.transparencies
+local registertransparency = transparencies.register
+local transparencyvalue = transparencies.value
-local rgbtocmyk = colors.rgbtocmyk or function() return 0,0,0,1 end
-local cmyktorgb = colors.cmyktorgb or function() return 0,0,0 end
-local rgbtogray = colors.rgbtogray or function() return 0 end
-local cmyktogray = colors.cmyktogray or function() return 0 end
+local rgbtocmyk = colors.rgbtocmyk -- or function() return 0,0,0,1 end
+local cmyktorgb = colors.cmyktorgb -- or function() return 0,0,0 end
+local rgbtogray = colors.rgbtogray -- or function() return 0 end
+local cmyktogray = colors.cmyktogray -- or function() return 0 end
metapost.makempy = metapost.makempy or { nofconverted = 0 }
local makempy = metapost.makempy
@@ -59,11 +69,6 @@ local innertransparency = nooutertransparency
local pdfcolor = lpdf.color
local pdftransparency = lpdf.transparency
-local registercolor = colors.register
-local registerspotcolor = colors.registerspotcolor
-
-local transparencies = attributes.transparencies
-local registertransparency = transparencies.register
function metapost.setoutercolor(mode,colormodel,colorattribute,transparencyattribute)
-- has always to be called before conversion
@@ -85,6 +90,8 @@ function metapost.setoutercolor(mode,colormodel,colorattribute,transparencyattri
innertransparency = outertransparency -- not yet used
end
+-- todo: get this from the lpdf module
+
local f_f = formatters["%F"]
local f_f3 = formatters["%.3F"]
@@ -94,6 +101,8 @@ local f_cmyk = formatters["%.3F %.3F %.3F %.3F k %.3F %.3F %.3F %.3F K"]
local f_cm = formatters["q %F %F %F %F %F %F cm"]
local f_shade = formatters["MpSh%s"]
+local f_spot = formatters["/%s cs /%s CS %s SCN %s scn"]
+
local function checked_color_pair(color,...)
if not color then
return innercolor, outercolor
@@ -143,15 +152,6 @@ local function normalize(ca,cb)
end
end
--- todo: check for the same colorspace (actually a backend issue), now we can
--- have several similar resources
---
--- normalize(ca,cb) fails for spotcolors
-
-local function spotcolorconverter(parent, n, d, p)
- registerspotcolor(parent)
- return pdfcolor(colors.model,registercolor(nil,'spot',parent,n,d,p)), outercolor
-end
local commasplitter = tsplitat(",")
@@ -217,21 +217,34 @@ local function checkandconvert(ca,cb)
end
end
+-- We keep textexts in a shared list (as it's easier that way and we also had that in
+-- the beginning). Each graphic gets its own (1 based) subtable so that we can also
+-- handle multiple conversions in one go which is needed when we process mp files
+-- directly.
+
local stack = { } -- quick hack, we will pass topofstack around
local top = nil
local nofruns = 0 -- askedfig: "all", "first", number
-local function startjob(texmode)
- top = {
- textexts = { }, -- all boxes, optionally with a different color
- texslots = { }, -- references to textexts in order or usage
- texorder = { }, -- references to textexts by mp index
+local function preset(t,k)
+ -- references to textexts by mp index
+ local v = {
textrial = 0,
texfinal = 0,
- -- used by tx plugin
+ texslots = { },
+ texorder = { },
texhash = { },
+ }
+ t[k] = v
+ return v
+end
+
+local function startjob(plugmode)
+ top = {
+ textexts = { }, -- all boxes, optionally with a different color
texlast = 0,
- texmode = texmode, -- some day we can then skip all pre/postscripts
+ texdata = setmetatableindex({},preset), -- references to textexts in order or usage
+ plugmode = plugmode, -- some day we can then skip all pre/postscripts
}
insert(stack,top)
if trace_runs then
@@ -245,7 +258,7 @@ local function stopjob()
for n, tn in next, top.textexts do
free_list(tn)
if trace_textexts then
- report_textexts("freeing box %s",n)
+ report_textexts("freeing text %s",n)
end
end
if trace_runs then
@@ -257,27 +270,41 @@ local function stopjob()
end
end
-function metapost.settextexts () end -- obsolete
-function metapost.resettextexts() end -- obsolete
+function metapost.getjobdata()
+ return top
+end
-- end of new
-function metapost.settext(box,slot)
- top.textexts[slot] = copy_list(texgetbox(box))
- texsetbox(box,nil)
- -- this will become
- -- top.textexts[slot] = texgetbox(box)
- -- unsetbox(box)
+local function settext(box,slot)
+ if top then
+ top.textexts[slot] = copy_list(texgetbox(box))
+ texsetbox(box,nil)
+ -- this can become
+ -- top.textexts[slot] = textakebox(box)
+ else
+ -- weird error
+ end
end
-function metapost.gettext(box,slot)
- texsetbox(box,copy_list(top.textexts[slot]))
- if trace_textexts then
- report_textexts("putting text %s in box %s",slot,box)
+local function gettext(box,slot)
+ if top then
+ texsetbox(box,copy_list(top.textexts[slot]))
+ if trace_textexts then
+ report_textexts("putting text %s in box %s",slot,box)
+ end
+ -- top.textexts[slot] = nil -- no, pictures can be placed several times
+ else
+ -- weird error
end
- -- top.textexts[slot] = nil -- no, pictures can be placed several times
end
+metapost.settext = settext
+metapost.gettext = gettext
+
+implement { name = "mpsettext", actions = settext, arguments = { "integer", "integer" } } -- box slot
+implement { name = "mpgettext", actions = gettext, arguments = { "integer", "integer" } } -- box slot
+
-- rather generic pdf, so use this elsewhere too it no longer pays
-- off to distinguish between outline and fill (we now have both
-- too, e.g. in arrows)
@@ -467,7 +494,7 @@ end
-- currently a a one-liner produces less code
-- textext.*(".*") can have "'s but tricky parsing as we can have concatenated strings
--- so this is something for a boring plain or train trip and we might assume proper mp
+-- so this is something for a boring plane or train trip and we might assume proper mp
-- input anyway
local parser = Cs((
@@ -477,57 +504,95 @@ local parser = Cs((
+ 1
)^0)
+local checking_enabled = true directives.register("metapost.checktexts",function(v) checking_enabled = v end)
+
local function checktexts(str)
- found, forced = false, false
- return lpegmatch(parser,str), found, forced
+ if checking_enabled then
+ found, forced = false, false
+ return lpegmatch(parser,str), found, forced
+ else
+ return str
+ end
end
metapost.checktexts = checktexts
local factor = 65536*(7227/7200)
-function metapost.edefsxsy(wd,ht,dp) -- helper for figure
- local hd = ht + dp
- context_setvalue("sx",wd ~= 0 and factor/wd or 0)
- context_setvalue("sy",hd ~= 0 and factor/hd or 0)
-end
+-- function metapost.edefsxsy(wd,ht,dp) -- helper for figure
+-- local hd = ht + dp
+-- context_setvalue("sx",wd ~= 0 and factor/wd or 0)
+-- context_setvalue("sy",hd ~= 0 and factor/hd or 0)
+-- end
+
+implement {
+ name = "mpsetsxsy",
+ arguments = { "dimen", "dimen", "dimen" },
+ actions = function(wd,ht,dp)
+ local hd = ht + dp
+ setmacro("sx",wd ~= 0 and factor/wd or 0)
+ setmacro("sy",hd ~= 0 and factor/hd or 0)
+ end
+}
local function sxsy(wd,ht,dp) -- helper for text
local hd = ht + dp
return (wd ~= 0 and factor/wd) or 0, (hd ~= 0 and factor/hd) or 0
end
-local no_first_run = "mfun_first_run := false ;"
-local do_first_run = "mfun_first_run := true ;"
-local no_trial_run = "mfun_trial_run := false ;"
-local do_trial_run = "mfun_trial_run := true ;"
+-- for stock mp we need to declare the booleans first
+
+local no_first_run = "boolean mfun_first_run ; mfun_first_run := false ;"
+local do_first_run = "boolean mfun_first_run ; mfun_first_run := true ;"
+local no_trial_run = "boolean mfun_trial_run ; mfun_trial_run := false ;"
+local do_trial_run = "boolean mfun_trial_run ; mfun_trial_run := true ;"
local do_begin_fig = "; beginfig(1) ; "
local do_end_fig = "; endfig ;"
local do_safeguard = ";"
-local f_text_data = formatters["mfun_tt_w[%i] := %f ; mfun_tt_h[%i] := %f ; mfun_tt_d[%i] := %f ;"]
+-- local f_text_data = formatters["mfun_tt_w[%i] := %f ; mfun_tt_h[%i] := %f ; mfun_tt_d[%i] := %f ;"]
+--
+-- function metapost.textextsdata()
+-- local textexts = top.textexts
+-- local collected = { }
+-- local nofcollected = 0
+-- for k, data in sortedhash(top.texdata) do -- sort is nicer in trace
+-- local texorder = data.texorder
+-- for n=1,#texorder do
+-- local box = textexts[texorder[n]]
+-- if box then
+-- local wd, ht, dp = box.width/factor, box.height/factor, box.depth/factor
+-- if trace_textexts then
+-- report_textexts("passed data item %s:%s > (%p,%p,%p)",k,n,wd,ht,dp)
+-- end
+-- nofcollected = nofcollected + 1
+-- collected[nofcollected] = f_text_data(n,wd,n,ht,n,dp)
+-- else
+-- break
+-- end
+-- end
+-- end
+-- return collected
+-- end
function metapost.textextsdata()
- local texorder = top.texorder
- local textexts = top.textexts
- local collected = { }
- local nofcollected = 0
- for n=1,#texorder do
- local box = textexts[texorder[n]]
- if box then
- local wd, ht, dp = box.width/factor, box.height/factor, box.depth/factor
- if trace_textexts then
- report_textexts("passed data item %s: (%p,%p,%p)",n,wd,ht,dp)
+ local textexts = top.textexts
+ local collected = { }
+ for k, data in sortedhash(top.texdata) do -- sort is nicer in trace
+ local texorder = data.texorder
+ for n=1,#texorder do
+ local box = textexts[texorder[n]]
+ if box then
+ collected[n] = box
+ else
+ break
end
- nofcollected = nofcollected + 1
- collected[nofcollected] = f_text_data(n,wd,n,ht,n,dp)
- else
- break
end
end
- return collected
+ mp.tt_initialize(collected)
end
+
metapost.intermediate = metapost.intermediate or { }
metapost.intermediate.actions = metapost.intermediate.actions or { }
@@ -558,16 +623,16 @@ local function extrapass()
if trace_runs then
report_metapost("second run of job %s, asked figure %a",top.nofruns,top.askedfig)
end
+ local textexts = metapost.textextsdata()
processmetapost(top.mpx, {
top.wrappit and do_begin_fig or "",
no_trial_run,
- concat(metapost.textextsdata()," ;\n"),
+ textexts and concat(textexts," ;\n") or "",
top.initializations,
do_safeguard,
top.data,
top.wrappit and do_end_fig or "",
}, false, nil, false, true, top.askedfig)
- -- context.MPLIBresettexts() -- must happen afterwards
end
function metapost.graphic_base_pass(specification) -- name will change (see mlib-ctx.lua)
@@ -591,17 +656,18 @@ function metapost.graphic_base_pass(specification) -- name will change (see mlib
top.nofruns = nofruns
--
local done_1, done_2, done_3, forced_1, forced_2, forced_3
- data, done_1, forced_1 = checktexts(data)
- -- we had preamble = extensions + inclusions
- if extensions == "" then
- extensions, done_2, forced_2 = "", false, false
- else
- extensions, done_2, forced_2 = checktexts(extensions)
- end
- if inclusions == "" then
- inclusions, done_3, forced_3 = "", false, false
- else
- inclusions, done_3, forced_3 = checktexts(inclusions)
+ if checking_enabled then
+ data, done_1, forced_1 = checktexts(data)
+ if extensions == "" then
+ extensions, done_2, forced_2 = "", false, false
+ else
+ extensions, done_2, forced_2 = checktexts(extensions)
+ end
+ if inclusions == "" then
+ inclusions, done_3, forced_3 = "", false, false
+ else
+ inclusions, done_3, forced_3 = checktexts(inclusions)
+ end
end
top.intermediate = false
top.multipass = false -- no needed here
@@ -686,6 +752,12 @@ function makempy.registerfile(filename)
mpyfilename = filename
end
+implement {
+ name = "registermpyfile",
+ actions = makempy.registerfile,
+ arguments = "string"
+}
+
function makempy.processgraphics(graphics)
if #graphics == 0 then
return
@@ -726,13 +798,13 @@ end
-- -- the new plugin handler -- --
-local sequencers = utilities.sequencers
-local appendgroup = sequencers.appendgroup
-local appendaction = sequencers.appendaction
+local sequencers = utilities.sequencers
+local appendgroup = sequencers.appendgroup
+local appendaction = sequencers.appendaction
-local resetter = nil
-local analyzer = nil
-local processor = nil
+local resetter = nil
+local analyzer = nil
+local processor = nil
local resetteractions = sequencers.new { arguments = "t" }
local analyzeractions = sequencers.new { arguments = "object,prescript" }
@@ -779,7 +851,7 @@ end
-- end
function metapost.pluginactions(what,t,flushfigure) -- before/after object, depending on what
- if top.texmode then
+ if top.plugmode then -- hm, what about other features
for i=1,#what do
local wi = what[i]
if type(wi) == "function" then
@@ -796,7 +868,7 @@ function metapost.pluginactions(what,t,flushfigure) -- before/after object, depe
end
function metapost.resetplugins(t) -- intialize plugins, before figure
- if top.texmode then
+ if top.plugmode then
-- plugins can have been added
resetter = resetteractions.runner
analyzer = analyzeractions.runner
@@ -807,16 +879,18 @@ function metapost.resetplugins(t) -- intialize plugins, before figure
end
function metapost.analyzeplugins(object) -- each object (first pass)
- if top.texmode then
+ if top.plugmode then
local prescript = object.prescript -- specifications
if prescript and #prescript > 0 then
- return analyzer(object,splitprescript(prescript))
+ analyzer(object,splitprescript(prescript))
+ return top.multipass
end
end
+ return false
end
function metapost.processplugins(object) -- each object (second pass)
- if top.texmode then
+ if top.plugmode then
local prescript = object.prescript -- specifications
if prescript and #prescript > 0 then
local before = { }
@@ -860,6 +934,7 @@ end
local function tx_reset()
if top then
+ -- why ?
top.texhash = { }
top.texlast = 0
end
@@ -869,14 +944,23 @@ local fmt = formatters["%s %s %s % t"]
----- pat = tsplitat(":")
local pat = lpeg.tsplitter(":",tonumber) -- so that %F can do its work
+local f_gray_yes = formatters["s=%F,a=%F,t=%F"]
+local f_gray_nop = formatters["s=%F"]
+local f_rgb_yes = formatters["r=%F,g=%F,b=%F,a=%F,t=%F"]
+local f_rgb_nop = formatters["r=%F,g=%F,b=%F"]
+local f_cmyk_yes = formatters["c=%F,m=%F,y=%F,k=%F,a=%F,t=%F"]
+local f_cmyk_nop = formatters["c=%F,m=%F,y=%F,k=%F"]
+
local ctx_MPLIBsetNtext = context.MPLIBsetNtext
local ctx_MPLIBsetCtext = context.MPLIBsetCtext
+local ctx_MPLIBsettext = context.MPLIBsettext
local function tx_analyze(object,prescript) -- todo: hash content and reuse them
+ local data = top.texdata[metapost.properties.number]
local tx_stage = prescript.tx_stage
if tx_stage == "trial" then
- local tx_trial = top.textrial + 1
- top.textrial = tx_trial
+ local tx_trial = data.textrial + 1
+ data.textrial = tx_trial
local tx_number = tonumber(prescript.tx_number)
local s = object.postscript or ""
local c = object.color -- only simple ones, no transparency
@@ -886,80 +970,80 @@ local function tx_analyze(object,prescript) -- todo: hash content and reuse them
c = lpegmatch(pat,txc)
end
end
- local a = prescript.tr_alternative
- local t = prescript.tr_transparency
+ local a = tonumber(prescript.tr_alternative)
+ local t = tonumber(prescript.tr_transparency)
local h = fmt(tx_number,a or "-",t or "-",c or "-")
- local n = top.texhash[h] -- todo: hashed variant with s (nicer for similar labels)
+ local n = data.texhash[h] -- todo: hashed variant with s (nicer for similar labels)
if not n then
local tx_last = top.texlast + 1
top.texlast = tx_last
+ -- report_textexts("tex string: %s",s)
if not c then
ctx_MPLIBsetNtext(tx_last,s)
elseif #c == 1 then
if a and t then
- ctx_MPLIBsetCtext(tx_last,formatters["s=%F,a=%F,t=%F"](c[1],a,t),s)
+ ctx_MPLIBsetCtext(tx_last,f_gray_yes(c[1],a,t),s)
else
- ctx_MPLIBsetCtext(tx_last,formatters["s=%F"](c[1]),s)
+ ctx_MPLIBsetCtext(tx_last,f_gray_nop(c[1]),s)
end
elseif #c == 3 then
if a and t then
- ctx_MPLIBsetCtext(tx_last,formatters["r=%F,g=%F,b=%F,a=%F,t=%F"](c[1],c[2],c[3],a,t),s)
+ ctx_MPLIBsetCtext(tx_last,f_rgb_nop(c[1],c[2],c[3],a,t),s)
else
- ctx_MPLIBsetCtext(tx_last,formatters["r=%F,g=%F,b=%F"](c[1],c[2],c[3]),s)
+ ctx_MPLIBsetCtext(tx_last,f_rgb_nop(c[1],c[2],c[3]),s)
end
elseif #c == 4 then
if a and t then
- ctx_MPLIBsetCtext(tx_last,formatters["c=%F,m=%F,y=%F,k=%F,a=%F,t=%F"](c[1],c[2],c[3],c[4],a,t),s)
+ ctx_MPLIBsetCtext(tx_last,f_cmyk_yes(c[1],c[2],c[3],c[4],a,t),s)
else
- ctx_MPLIBsetCtext(tx_last,formatters["c=%F,m=%F,y=%F,k=%F"](c[1],c[2],c[3],c[4]),s)
+ ctx_MPLIBsetCtext(tx_last,f_cmyk_nop(c[1],c[2],c[3],c[4]),s)
end
else
ctx_MPLIBsetNtext(tx_last,s)
end
top.multipass = true
- metapost.multipass = true -- ugly
- top.texhash[h] = tx_last
- top.texslots[tx_trial] = tx_last
- top.texorder[tx_number] = tx_last
+ data.texhash [h] = tx_last
+ data.texslots[tx_trial] = tx_last
+ data.texorder[tx_number] = tx_last
if trace_textexts then
- report_textexts("stage %a, usage %a, number %a, new %a, hash %a",tx_stage,tx_trial,tx_number,tx_last,h)
+ report_textexts("stage %a, usage %a, number %a, new %a, hash %a, text %a",tx_stage,tx_trial,tx_number,tx_last,h,s)
end
else
- top.texslots[tx_trial] = n
+ data.texslots[tx_trial] = n
if trace_textexts then
- report_textexts("stage %a, usage %a, number %a, new %a, hash %a",tx_stage,tx_trial,tx_number,n,h)
+ report_textexts("stage %a, usage %a, number %a, old %a, hash %a, text %a",tx_stage,tx_trial,tx_number,n,h,s)
end
end
elseif tx_stage == "extra" then
- local tx_trial = top.textrial + 1
- top.textrial = tx_trial
+ local tx_trial = data.textrial + 1
+ data.textrial = tx_trial
local tx_number = tonumber(prescript.tx_number)
- if not top.texorder[tx_number] then
+ if not data.texorder[tx_number] then
local s = object.postscript or ""
local tx_last = top.texlast + 1
top.texlast = tx_last
- context.MPLIBsettext(tx_last,s)
+ ctx_MPLIBsettext(tx_last,s)
top.multipass = true
- metapost.multipass = true -- ugly
- top.texslots[tx_trial] = tx_last
- top.texorder[tx_number] = tx_last
+ data.texslots[tx_trial] = tx_last
+ data.texorder[tx_number] = tx_last
if trace_textexts then
- report_textexts("stage %a, usage %a, number %a, extra %a",tx_stage,tx_trial,tx_number,tx_last)
+ report_textexts("stage %a, usage %a, number %a, extra %a, text %a",tx_stage,tx_trial,tx_number,tx_last,s)
end
end
end
end
local function tx_process(object,prescript,before,after)
- local tx_number = prescript.tx_number
+ local data = top.texdata[metapost.properties.number]
+ local tx_number = tonumber(prescript.tx_number)
if tx_number then
- tx_number = tonumber(tx_number)
local tx_stage = prescript.tx_stage
if tx_stage == "final" then
- top.texfinal = top.texfinal + 1
- local n = top.texslots[top.texfinal]
+ local tx_final = data.texfinal + 1
+ data.texfinal = tx_final
+ local n = data.texslots[tx_final]
if trace_textexts then
- report_textexts("stage %a, usage %a, number %a, use %a",tx_stage,top.texfinal,tx_number,n)
+ report_textexts("stage %a, usage %a, number %a, use %a",tx_stage,tx_final,tx_number,n)
end
local sx, rx, ry, sy, tx, ty = cm(object) -- needs to be frozen outside the function
local box = top.textexts[n]
@@ -983,8 +1067,9 @@ local function tx_process(object,prescript,before,after)
if not trace_textexts then
object.path = false -- else: keep it
end
- object.color = false
+ object.color = false
object.grouped = true
+ object.istext = true
end
end
end
@@ -1007,7 +1092,6 @@ local function gt_analyze(object,prescript)
graphics[gt_index] = formatters["\\MPLIBgraphictext{%s}"](object.postscript or "")
top.intermediate = true
top.multipass = true
- metapost.multipass = true -- ugly
end
end
@@ -1023,9 +1107,9 @@ local function sh_process(object,prescript,before,after)
local sh_type = prescript.sh_type
if sh_type then
nofshades = nofshades + 1
- local domain = lpegmatch(domainsplitter,prescript.sh_domain)
- local centera = lpegmatch(centersplitter,prescript.sh_center_a)
- local centerb = lpegmatch(centersplitter,prescript.sh_center_b)
+ local domain = lpegmatch(domainsplitter,prescript.sh_domain or "0 1")
+ local centera = lpegmatch(centersplitter,prescript.sh_center_a or "0 0")
+ local centerb = lpegmatch(centersplitter,prescript.sh_center_b or "0 0")
--
local sh_color_a = prescript.sh_color_a or "1"
local sh_color_b = prescript.sh_color_b or "1"
@@ -1074,8 +1158,9 @@ local function sh_process(object,prescript,before,after)
local coordinates = { centera[1], centera[2], centerb[1], centerb[2] }
lpdf.linearshade(name,domain,ca,cb,1,colorspace,coordinates,separation) -- backend specific (will be renamed)
elseif sh_type == "circular" then
- local radiusa = tonumber(prescript.sh_radius_a)
- local radiusb = tonumber(prescript.sh_radius_b)
+ local factor = tonumber(prescript.sh_factor) or 1
+ local radiusa = factor * tonumber(prescript.sh_radius_a)
+ local radiusb = factor * tonumber(prescript.sh_radius_b)
local coordinates = { centera[1], centera[2], radiusa, centerb[1], centerb[2], radiusb }
lpdf.circularshade(name,domain,ca,cb,1,colorspace,coordinates,separation) -- backend specific (will be renamed)
else
@@ -1120,8 +1205,9 @@ local function ps_process(object,prescript,before,after)
local first, third = op[1], op[3]
local x, y = first.x_coord, first.y_coord
local w, h = third.x_coord - x, third.y_coord - y
- x = x - metapost.llx
- y = metapost.ury - y
+ local properties = metapost.properties
+ x = x - properties.llx
+ y = properties.ury - y
before[#before+1] = function()
context.MPLIBpositionwhd(ps_label,x,y,w,h)
end
@@ -1156,6 +1242,12 @@ local value = Cs ( (
local t_list = attributes.list[attributes.private('transparency')]
local c_list = attributes.list[attributes.private('color')]
+local remappers = {
+ [1] = formatters["s=%s"],
+ [3] = formatters["r=%s,g=%s,b=%s"],
+ [4] = formatters["c=%s,m=%s,y=%s,k=%s"],
+}
+
local function tr_process(object,prescript,before,after)
-- before can be shortcut to t
local tr_alternative = prescript.tr_alternative
@@ -1171,56 +1263,83 @@ local function tr_process(object,prescript,before,after)
local sp_type = prescript.sp_type
if not sp_type then
c_b, c_a = colorconverter(cs)
- elseif sp_type == "spot" or sp_type == "multitone" then
- local sp_name = prescript.sp_name or "black"
- local sp_fractions = prescript.sp_fractions or 1
- local sp_components = prescript.sp_components or ""
- local sp_value = prescript.sp_value or "1"
- local cf = cs[1]
- if cf ~= 1 then
- -- beware, we do scale the spotcolors but not the alternative representation
- sp_value = lpegmatch(value,sp_value,1,cf) or sp_value
- end
- c_b, c_a = spotcolorconverter(sp_name,sp_fractions,sp_components,sp_value)
- elseif sp_type == "named" then
- -- we might move this to another namespace .. also, named can be a spotcolor
- -- so we need to check for that too ... also we need to resolve indirect
- -- colors so we might need the second pass for this (draw dots with \MPcolor)
+ else
local sp_name = prescript.sp_name or "black"
- if not tr_alternative then
- -- todo: sp_name is not yet registered at this time
- local t = t_list[sp_name] -- string or attribute
- local v = t and attributes.transparencies.value(t)
- if v then
- before[#before+1] = formatters["/Tr%s gs"](registertransparency(nil,v[1],v[2],true))
- after[#after+1] = "/Tr0 gs" -- outertransparency
+ if sp_type == "spot" then
+ local sp_value = prescript.sp_value or "s:1"
+ local sp_temp = formatters["mp:%s"](sp_value)
+ local s = split(sp_value,":")
+ local r = remappers[#s]
+ defineprocesscolor(sp_temp,r and r(unpack(s)) or "s=0",true,true)
+ definespotcolor(sp_name,sp_temp,"p=1",true)
+ sp_type = "named"
+ elseif sp_type == "multitone" then
+ local sp_value = prescript.sp_value or "s:1"
+ local sp_spec = { }
+ local sp_list = split(sp_value," ")
+ for i=1,#sp_list do
+ local v = sp_list[i]
+ local t = formatters["mp:%s"](v)
+ local s = split(v,":")
+ local r = remappers[#s]
+ defineprocesscolor(t,r and r(unpack(s)) or "s=0",true,true)
+ local tt = formatters["ms:%s"](v)
+ definespotcolor(tt,t,"p=1",true)
+ sp_spec[#sp_spec+1] = formatters["%s=1"](t)
end
+ sp_spec = concat(sp_spec,",")
+ definemultitonecolor(sp_name,sp_spec,"","",true)
+ sp_type = "named"
end
- local c = c_list[sp_name] -- string or attribute
- local v = c and attributes.colors.value(c)
- if v then
- -- all=1 gray=2 rgb=3 cmyk=4
- local colorspace = v[1]
- local f = cs[1]
- if colorspace == 2 then
- local s = f*v[2]
- c_b, c_a = checked_color_pair(f_gray,s,s)
- elseif colorspace == 3 then
- local r, g, b = f*v[3], f*v[4], f*v[5]
- c_b, c_a = checked_color_pair(f_rgb,r,g,b,r,g,b)
- elseif colorspace == 4 or colorspace == 1 then
- local c, m, y, k = f*v[6], f*v[7], f*v[8], f*v[9]
- c_b, c_a = checked_color_pair(f_cmyk,c,m,y,k,c,m,y,k)
- else
- local s = f*v[2]
- c_b, c_a = checked_color_pair(f_gray,s,s)
+ if sp_type == "named" then
+ -- we might move this to another namespace .. also, named can be a spotcolor
+ -- so we need to check for that too ... also we need to resolve indirect
+ -- colors so we might need the second pass for this (draw dots with \MPcolor)
+ if not tr_alternative then
+ -- todo: sp_name is not yet registered at this time
+ local t = t_list[sp_name] -- string or attribute
+ local v = t and transparencyvalue(t)
+ if v then
+ before[#before+1] = formatters["/Tr%s gs"](registertransparency(nil,v[1],v[2],true))
+ after[#after+1] = "/Tr0 gs" -- outertransparency
+ end
+ end
+ local c = c_list[sp_name] -- string or attribute
+ local v = c and colorvalue(c)
+ if v then
+ -- all=1 gray=2 rgb=3 cmyk=4
+ local colorspace = v[1]
+ local f = cs[1]
+ if colorspace == 2 then
+ local s = f*v[2]
+ c_b, c_a = checked_color_pair(f_gray,s,s)
+ elseif colorspace == 3 then
+ local r, g, b = f*v[3], f*v[4], f*v[5]
+ c_b, c_a = checked_color_pair(f_rgb,r,g,b,r,g,b)
+ elseif colorspace == 4 or colorspace == 1 then
+ local c, m, y, k = f*v[6], f*v[7], f*v[8], f*v[9]
+ c_b, c_a = checked_color_pair(f_cmyk,c,m,y,k,c,m,y,k)
+ elseif colorspace == 5 then
+ -- not all viewers show the fractions ok
+ local name = v[10]
+ local value = split(v[13],",")
+ if f ~= 1 then
+ for i=1,#value do
+ value[i] = f * (tonumber(value[i]) or 1)
+ end
+ end
+ value = concat(value," ")
+ c_b, c_a = checked_color_pair(f_spot,name,name,value,value)
+ else
+ local s = f*v[2]
+ c_b, c_a = checked_color_pair(f_gray,s,s)
+ end
end
end
- --
end
if c_a and c_b then
before[#before+1] = c_b
- after[#after+1] = c_a
+ after [#after +1] = c_a
end
end
end
diff --git a/Master/texmf-dist/tex/context/base/mlib-pps.mkiv b/Master/texmf-dist/tex/context/base/mlib-pps.mkiv
index 207d9730c8a..07ac84b8d32 100644
--- a/Master/texmf-dist/tex/context/base/mlib-pps.mkiv
+++ b/Master/texmf-dist/tex/context/base/mlib-pps.mkiv
@@ -33,43 +33,23 @@
\newbox \MPtextbox
\newtoks\everyMPLIBsettext % not used
-% \def\MPLIBsettext#1% #2%
-% {\dowithnextbox{\ctxlua{metapost.settext(\number\nextbox,#1)}}\hbox}
-%
-% \def\MPLIBresettexts
-% {\ctxlua{metapost.resettextexts()}}
-%
-% \newconditional\MPLIBtextgetdone
-%
-% \def\MPLIBsettext#1% #2%
-% {\ifconditional\MPLIBtextgetdone
-% \else
-% \cldcontext{metapost.tex.get()}% MPenvironments are depricated
-% \settrue\MPLIBtextgetdone % no \global needed
-% \fi
-% \dowithnextbox{\ctxlua{metapost.settext(\number\nextbox,#1)}}\hbox}
-%
-% \def\MPLIBresettexts
-% {\ctxlua{metapost.resettextexts()}%
-% \setfalse\MPLIBtextgetdone}
-
\def\doMPLIBflushenvironment
{%\writestatus\m!metapost{flushing environment}%
- \cldcontext{metapost.tex.get()}%
+ \clf_mptexget
\let\MPLIBflushenvironment\relax}% MPenvironments are depricated}
\let\MPLIBflushenvironment\doMPLIBflushenvironment
\unexpanded\def\MPLIBsetNtext#1% #2% box text
{\MPLIBflushenvironment
- \dowithnextbox{\ctxlua{metapost.settext(\number\nextbox,#1)}}\hbox\bgroup
+ \dowithnextbox{\clf_mpsettext\nextbox #1}\hbox\bgroup
\meta_set_current_color
\let\MPLIBflushenvironment\doMPLIBflushenvironment
\let\next} % gobble open brace
\unexpanded\def\MPLIBsetCtext#1#2% #3% box colorspec text
{\MPLIBflushenvironment
- \dowithnextbox{\ctxlua{metapost.settext(\number\nextbox,#1)}}\hbox\bgroup
+ \dowithnextbox{\clf_mpsettext\nextbox #1}\hbox\bgroup
\directcolored[#2]%
\meta_set_current_color % so, textcolor wins !
\let\MPLIBflushenvironment\doMPLIBflushenvironment
@@ -77,22 +57,19 @@
\let\MPLIBsettext\MPLIBsetNtext
-\unexpanded\def\MPLIBresettexts
- {\ctxlua{metapost.resettextexts()}}
-
\unexpanded\def\MPLIBgettextscaled#1#2#3% why a copy .. can be used more often
- {\ctxlua{metapost.gettext(\number\MPtextbox,#1)}%
+ {\clf_mpgettext\MPtextbox #1%
\vbox to \zeropoint{\vss\hbox to \zeropoint{\scale[\c!sx=#2,\c!sy=#3]{\raise\dp\MPtextbox\box\MPtextbox}\forcecolorhack\hss}}}
\unexpanded\def\MPLIBfigure#1#2%
{\setbox\scratchbox\hbox{\externalfigure[#1][\c!mask=#2]}%
- \ctxlua{metapost.edefsxsy(\number\wd\scratchbox,\number\ht\scratchbox,0)}%
+ \clf_mpsetsxsy\wd\scratchbox\ht\scratchbox\zeropoint
\vbox to \zeropoint{\vss\hbox to \zeropoint{\scale[\c!sx=\sx,\c!sy=\sy]{\box\scratchbox}\hss}}}
% horrible (we could inline scale and matrix code):
\unexpanded\def\MPLIBgettextscaledcm#1#2#3#4#5#6#7#8#9% 2-7: sx,rx,ry,sy,tx,ty
- {\ctxlua{metapost.gettext(\number\MPtextbox,#1)}%
+ {\clf_mpgettext\MPtextbox #1%
\setbox\MPbox\hbox\bgroup
\dotransformnextbox{#2}{#3}{#4}{#5}{#6}{#7}% does push pop ... will be changed to proper lua call (avoid small numbers)
\vbox to \zeropoint\bgroup
diff --git a/Master/texmf-dist/tex/context/base/mlib-run.lua b/Master/texmf-dist/tex/context/base/mlib-run.lua
index 2a34f44d5c8..121c32ae95a 100644
--- a/Master/texmf-dist/tex/context/base/mlib-run.lua
+++ b/Master/texmf-dist/tex/context/base/mlib-run.lua
@@ -44,12 +44,12 @@ local texerrormessage = logs.texerrormessage
local starttiming = statistics.starttiming
local stoptiming = statistics.stoptiming
+local formatters = string.formatters
+
local mplib = mplib
metapost = metapost or { }
local metapost = metapost
-local mplibone = tonumber(mplib.version()) <= 1.50
-
metapost.showlog = false
metapost.lastlog = ""
metapost.collapse = true -- currently mplib cannot deal with begingroup/endgroup mismatch in stepwise processing
@@ -84,77 +84,74 @@ local mpbasepath = lpeg.instringchecker(P("/metapost/") * (P("context") + P("bas
-- mplib has no real io interface so we have a different mechanism than
-- tex (as soon as we have more control, we will use the normal code)
-
-local finders = { }
-mplib.finders = finders
-
+--
-- for some reason mp sometimes calls this function twice which is inefficient
-- but we cannot catch this
-local function preprocessed(name)
- if not mpbasepath(name) then
- -- we could use the via file but we don't have a complete io interface yet
- local data, found, forced = metapost.checktexts(io.loaddata(name) or "")
- if found then
- local temp = luatex.registertempfile(name,true)
- io.savedata(temp,data)
- return temp
+do
+
+ local finders = { }
+ mplib.finders = finders -- also used in meta-lua.lua
+
+ local new_instance = mplib.new
+ local resolved_file = resolvers.findfile
+
+ local function preprocessed(name)
+ if not mpbasepath(name) then
+ -- we could use the via file but we don't have a complete io interface yet
+ local data, found, forced = metapost.checktexts(io.loaddata(name) or "")
+ if found then
+ local temp = luatex.registertempfile(name,true)
+ io.savedata(temp,data)
+ return temp
+ end
end
+ return name
end
- return name
-end
-mplib.preprocessed = preprocessed -- helper
+ mplib.preprocessed = preprocessed -- helper
-finders.file = function(specification,name,mode,ftype)
- return preprocessed(resolvers.findfile(name,ftype))
-end
+ local function validftype(ftype)
+ if ftype == "" then
+ -- whatever
+ elseif ftype == 0 then
+ -- mplib bug
+ else
+ return ftype
+ end
+ end
-local function i_finder(name,mode,ftype) -- fake message for mpost.map and metafun.mpvi
- local specification = url.hashed(name)
- local finder = finders[specification.scheme] or finders.file
- return finder(specification,name,mode,ftype)
-end
+ finders.file = function(specification,name,mode,ftype)
+ return preprocessed(resolvers.findfile(name,validftype(ftype)))
+ end
-local function o_finder(name,mode,ftype)
- -- report_metapost("output file %a, mode %a, ftype %a",name,mode,ftype)
- return name
-end
+ local function i_finder(name,mode,ftype) -- fake message for mpost.map and metafun.mpvi
+ local specification = url.hashed(name)
+ local finder = finders[specification.scheme] or finders.file
+ return finder(specification,name,mode,validftype(ftype))
+ end
-local function finder(name,mode,ftype)
- if mode == "w" then
- return o_finder(name,mode,ftype)
- else
- return i_finder(name,mode,ftype)
+ local function o_finder(name,mode,ftype)
+ return name
end
-end
-local i_limited = false
-local o_limited = false
+ o_finder = sandbox.register(o_finder,sandbox.filehandlerone,"mplib output finder")
-directives.register("system.inputmode", function(v)
- if not i_limited then
- local i_limiter = io.i_limiter(v)
- if i_limiter then
- i_finder = i_limiter.protect(i_finder)
- i_limited = true
- end
+ local function finder(name,mode,ftype)
+ return (mode == "w" and o_finder or i_finder)(name,mode,validftype(ftype))
end
-end)
-
-directives.register("system.outputmode", function(v)
- if not o_limited then
- local o_limiter = io.o_limiter(v)
- if o_limiter then
- o_finder = o_limiter.protect(o_finder)
- o_limited = true
- end
+
+ function mplib.new(specification)
+ specification.find_file = finder -- so we block an overload
+ return new_instance(specification)
end
-end)
--- -- --
+ mplib.finder = finder
+
+end
-metapost.finder = finder
+local new_instance = mplib.new
+local find_file = mplib.finder
function metapost.reporterror(result)
if not result then
@@ -182,184 +179,93 @@ function metapost.reporterror(result)
return true
end
-if mplibone then
-
- report_metapost("fatal error: mplib is too old")
-
- os.exit()
-
- -- local preamble = [[
- -- boolean mplib ; mplib := true ;
- -- string mp_parent_version ; mp_parent_version := "%s" ;
- -- input "%s" ; dump ;
- -- ]]
- --
- -- metapost.parameters = {
- -- hash_size = 100000,
- -- main_memory = 4000000,
- -- max_in_open = 50,
- -- param_size = 100000,
- -- }
- --
- -- function metapost.make(name, target, version)
- -- starttiming(mplib)
- -- target = file.replacesuffix(target or name, "mem") -- redundant
- -- local mpx = mplib.new ( table.merged (
- -- metapost.parameters,
- -- {
- -- ini_version = true,
- -- find_file = finder,
- -- job_name = file.removesuffix(target),
- -- }
- -- ) )
- -- if mpx then
- -- starttiming(metapost.exectime)
- -- local result = mpx:execute(format(preamble,version or "unknown",name))
- -- stoptiming(metapost.exectime)
- -- mpx:finish()
- -- end
- -- stoptiming(mplib)
- -- end
- --
- -- function metapost.load(name)
- -- starttiming(mplib)
- -- local mpx = mplib.new ( table.merged (
- -- metapost.parameters,
- -- {
- -- ini_version = false,
- -- mem_name = file.replacesuffix(name,"mem"),
- -- find_file = finder,
- -- -- job_name = "mplib",
- -- }
- -- ) )
- -- local result
- -- if not mpx then
- -- result = { status = 99, error = "out of memory"}
- -- end
- -- stoptiming(mplib)
- -- return mpx, result
- -- end
- --
- -- function metapost.checkformat(mpsinput)
- -- local mpsversion = environment.version or "unset version"
- -- local mpsinput = file.addsuffix(mpsinput or "metafun", "mp")
- -- local mpsformat = file.removesuffix(file.basename(texconfig.formatname or (tex and tex.formatname) or mpsinput))
- -- local mpsbase = file.removesuffix(file.basename(mpsinput))
- -- if mpsbase ~= mpsformat then
- -- mpsformat = mpsformat .. "-" .. mpsbase
- -- end
- -- mpsformat = file.addsuffix(mpsformat, "mem")
- -- local mpsformatfullname = caches.getfirstreadablefile(mpsformat,"formats","metapost") or ""
- -- if mpsformatfullname ~= "" then
- -- report_metapost("loading %a from %a", mpsinput, mpsformatfullname)
- -- local mpx, result = metapost.load(mpsformatfullname)
- -- if mpx then
- -- local result = mpx:execute("show mp_parent_version ;")
- -- if not result.log then
- -- metapost.reporterror(result)
- -- else
- -- local version = match(result.log,">> *(.-)[\n\r]") or "unknown"
- -- version = gsub(version,"[\'\"]","")
- -- if version ~= mpsversion then
- -- report_metapost("version mismatch: %s <> %s", version or "unknown", mpsversion)
- -- else
- -- return mpx
- -- end
- -- end
- -- else
- -- report_metapost("error in loading %a from %a", mpsinput, mpsformatfullname)
- -- metapost.reporterror(result)
- -- end
- -- end
- -- local mpsformatfullname = caches.setfirstwritablefile(mpsformat,"formats")
- -- report_metapost("making %a into %a", mpsinput, mpsformatfullname)
- -- metapost.make(mpsinput,mpsformatfullname,mpsversion) -- somehow return ... fails here
- -- if lfs.isfile(mpsformatfullname) then
- -- report_metapost("loading %a from %a", mpsinput, mpsformatfullname)
- -- return metapost.load(mpsformatfullname)
- -- else
- -- report_metapost("problems with %a from %a", mpsinput, mpsformatfullname)
- -- end
- -- end
-
-else
-
- -- let end = relax ;
-
- local preamble = [[
- boolean mplib ; mplib := true ;
- let dump = endinput ;
- input "%s" ;
- ]]
-
- local methods = {
- double = "double",
- scaled = "scaled",
- binary = "binary",
- decimal = "decimal",
- default = "scaled",
- }
+local f_preamble = formatters [ [[
+ boolean mplib ; mplib := true ;
+ let dump = endinput ;
+ input "%s" ;
+]] ]
+
+local methods = {
+ double = "double",
+ scaled = "scaled",
+ binary = "binary",
+ decimal = "decimal",
+ default = "scaled",
+}
- function metapost.runscript(code)
- return code
- end
+function metapost.runscript(code)
+ return code
+end
- function metapost.scripterror(str)
- report_metapost("script error: %s",str)
+function metapost.scripterror(str)
+ report_metapost("script error: %s",str)
+end
+
+-- todo: random_seed
+
+local f_textext = formatters[ [[rawtextext("%s")]] ]
+
+function metapost.maketext(s,mode)
+ if mode and mode == 1 then
+ -- report_metapost("ignoring verbatimtex: %s",s)
+ else
+ -- report_metapost("handling btex ... etex: %s",s)
+ s = gsub(s,'"','"&ditto&"')
+ return f_textext(s)
end
+end
- function metapost.load(name,method)
- starttiming(mplib)
- method = method and methods[method] or "scaled"
- local mpx = mplib.new {
- ini_version = true,
- find_file = finder,
- math_mode = method,
- run_script = metapost.runscript,
- script_error = metapost.scripterror,
- }
- report_metapost("initializing number mode %a",method)
- local result
- if not mpx then
- result = { status = 99, error = "out of memory"}
- else
- result = mpx:execute(format(preamble, file.addsuffix(name,"mp"))) -- addsuffix is redundant
- end
- stoptiming(mplib)
- metapost.reporterror(result)
- return mpx, result
+function metapost.load(name,method)
+ starttiming(mplib)
+ method = method and methods[method] or "scaled"
+ local mpx = new_instance {
+ ini_version = true,
+ math_mode = method,
+ run_script = metapost.runscript,
+ script_error = metapost.scripterror,
+ make_text = metapost.maketext,
+ extensions = 1,
+ }
+ report_metapost("initializing number mode %a",method)
+ local result
+ if not mpx then
+ result = { status = 99, error = "out of memory"}
+ else
+ result = mpx:execute(f_preamble(file.addsuffix(name,"mp"))) -- addsuffix is redundant
end
+ stoptiming(mplib)
+ metapost.reporterror(result)
+ return mpx, result
+end
- function metapost.checkformat(mpsinput,method)
- local mpsversion = environment.version or "unset version"
- local mpsinput = mpsinput or "metafun"
- local foundfile = ""
- if file.suffix(mpsinput) ~= "" then
- foundfile = finder(mpsinput) or ""
- end
- if foundfile == "" then
- foundfile = finder(file.replacesuffix(mpsinput,"mpvi")) or ""
- end
- if foundfile == "" then
- foundfile = finder(file.replacesuffix(mpsinput,"mpiv")) or ""
- end
- if foundfile == "" then
- foundfile = finder(file.replacesuffix(mpsinput,"mp")) or ""
- end
- if foundfile == "" then
- report_metapost("loading %a fails, format not found",mpsinput)
+function metapost.checkformat(mpsinput,method)
+ local mpsversion = environment.version or "unset version"
+ local mpsinput = mpsinput or "metafun"
+ local foundfile = ""
+ if file.suffix(mpsinput) ~= "" then
+ foundfile = find_file(mpsinput) or ""
+ end
+ if foundfile == "" then
+ foundfile = find_file(file.replacesuffix(mpsinput,"mpvi")) or ""
+ end
+ if foundfile == "" then
+ foundfile = find_file(file.replacesuffix(mpsinput,"mpiv")) or ""
+ end
+ if foundfile == "" then
+ foundfile = find_file(file.replacesuffix(mpsinput,"mp")) or ""
+ end
+ if foundfile == "" then
+ report_metapost("loading %a fails, format not found",mpsinput)
+ else
+ report_metapost("loading %a as %a using method %a",mpsinput,foundfile,method or "default")
+ local mpx, result = metapost.load(foundfile,method)
+ if mpx then
+ return mpx
else
- report_metapost("loading %a as %a using method %a",mpsinput,foundfile,method or "default")
- local mpx, result = metapost.load(foundfile,method)
- if mpx then
- return mpx
- else
- report_metapost("error in loading %a",mpsinput)
- metapost.reporterror(result)
- end
+ report_metapost("error in loading %a",mpsinput)
+ metapost.reporterror(result)
end
end
-
end
function metapost.unload(mpx)
@@ -409,7 +315,8 @@ function metapost.reset(mpx)
end
end
-local mp_inp, mp_log, mp_tag = { }, { }, 0
+local mp_tra = { }
+local mp_tag = 0
-- key/values
@@ -423,18 +330,24 @@ function metapost.process(mpx, data, trialrun, flusher, multipass, isextrapass,
mpx = metapost.format(mpx) -- goody
end
if mpx and data then
+ local tra = nil
starttiming(metapost)
metapost.initializescriptrunner(mpx,trialrun)
if trace_graphics then
- if not mp_inp[mpx] then
+ tra = mp_tra[mpx]
+ if not tra then
mp_tag = mp_tag + 1
local jobname = tex.jobname
- mp_inp[mpx] = io.open(format("%s-mplib-run-%03i.mp", jobname,mp_tag),"w")
- mp_log[mpx] = io.open(format("%s-mplib-run-%03i.log",jobname,mp_tag),"w")
+ tra = {
+ inp = io.open(formatters["%s-mplib-run-%03i.mp"] (jobname,mp_tag),"w"),
+ log = io.open(formatters["%s-mplib-run-%03i.log"](jobname,mp_tag),"w"),
+ }
+ mp_tra[mpx] = tra
end
- local banner = format("%% begin graphic: n=%s, trialrun=%s, multipass=%s, isextrapass=%s\n\n", metapost.n, tostring(trialrun), tostring(multipass), tostring(isextrapass))
- mp_inp[mpx]:write(banner)
- mp_log[mpx]:write(banner)
+ local banner = formatters["%% begin graphic: n=%s, trialrun=%s, multipass=%s, isextrapass=%s\n\n"](
+ metapost.n, tostring(trialrun), tostring(multipass), tostring(isextrapass))
+ tra.inp:write(banner)
+ tra.log:write(banner)
end
if type(data) == "table" then
-- this hack is needed because the library currently barks on \n\n
@@ -471,17 +384,17 @@ function metapost.process(mpx, data, trialrun, flusher, multipass, isextrapass,
-- d = string.gsub(d,"\r","")
if d then
if trace_graphics then
- mp_inp[mpx]:write(format("\n%% begin snippet %s\n",i))
- mp_inp[mpx]:write(d)
- mp_inp[mpx]:write(format("\n%% end snippet %s\n",i))
+ tra.inp:write(formatters["\n%% begin snippet %s\n"](i))
+ tra.inp:write(d)
+ tra.inp:write(formatters["\n%% end snippet %s\n"](i))
end
starttiming(metapost.exectime)
- result = mpx:execute(d)
+ result = mpx:execute(d) -- some day we wil use a coroutine with textexts
stoptiming(metapost.exectime)
if trace_graphics and result then
local str = result.log or result.error
if str and str ~= "" then
- mp_log[mpx]:write(str)
+ tra.log:write(str)
end
end
if not metapost.reporterror(result) then
@@ -505,7 +418,7 @@ function metapost.process(mpx, data, trialrun, flusher, multipass, isextrapass,
data = "tracingall;" .. data
end
if trace_graphics then
- mp_inp[mpx]:write(data)
+ tra.inp:write(data)
end
starttiming(metapost.exectime)
result = mpx:execute(data)
@@ -513,7 +426,7 @@ function metapost.process(mpx, data, trialrun, flusher, multipass, isextrapass,
if trace_graphics and result then
local str = result.log or result.error
if str and str ~= "" then
- mp_log[mpx]:write(str)
+ tra.log:write(str)
end
end
-- todo: error message
@@ -533,8 +446,8 @@ function metapost.process(mpx, data, trialrun, flusher, multipass, isextrapass,
end
if trace_graphics then
local banner = "\n% end graphic\n\n"
- mp_inp[mpx]:write(banner)
- mp_log[mpx]:write(banner)
+ tra.inp:write(banner)
+ tra.log:write(banner)
end
stoptiming(metapost)
end
@@ -596,7 +509,7 @@ function metapost.directrun(formatname,filename,outputformat,astable,mpdata)
else
output = figures[v]:svg() -- (3) for prologues
end
- local outname = format("%s-%s.%s",basename,v,outputformat)
+ local outname = formatters["%s-%s.%s"](basename,v,outputformat)
report_metapost("saving %s bytes in %a",#output,outname)
io.savedata(outname,output)
end
@@ -629,7 +542,7 @@ function metapost.quickanddirty(mpxformat,data)
stopfigure = function()
end
}
- local data = format("; beginfig(1) ;\n %s\n ; endfig ;",data)
+ local data = formatters["; beginfig(1) ;\n %s\n ; endfig ;"](data)
metapost.process(mpxformat, { data }, false, flusher, false, false, "all")
if code then
return {
diff --git a/Master/texmf-dist/tex/context/base/mtx-context-arrange.tex b/Master/texmf-dist/tex/context/base/mtx-context-arrange.tex
index 49920293fe6..fb53406d800 100644
--- a/Master/texmf-dist/tex/context/base/mtx-context-arrange.tex
+++ b/Master/texmf-dist/tex/context/base/mtx-context-arrange.tex
@@ -27,10 +27,11 @@
% --printformat : 2UP, etc
% --paperformat=spec : paper*print or paperxprint
%
-% example: context --extra=arrange --printformat=2UP --paperformat=A4,A3,landscape myfile
+% example: context --extra=arrange --printformat=2UP --paperformat=A4*A3,landscape myfile
%
% end help
+
\input mtx-context-common.tex
\doifdocumentargument {paperoffset} {
@@ -46,6 +47,7 @@
\setdocumentargument{sided}{singlesided}
}
+
\setuppapersize
[\getdocumentargument{paperformat_paper}]
[\getdocumentargument{paperformat_print}]
@@ -95,16 +97,17 @@
\starttext
\startluacode
- local format = string.format
- local fprint = function(...) tex.sprint(tex.ctxcatcodes,format(...)) end
-
- if #document.files > 0 then
- if document.arguments.sort then
- table.sort(document.files)
+ local arguments = document.arguments
+ local files = document.files
+ local noffiles = #files
+ if noffiles > 0 then
+ if arguments.sort then
+ table.sort(files)
end
- local emptypages = document.arguments.addempty or ""
- local textwidth = document.arguments.textwidth or "0cm"
- for _, filename in ipairs(document.files) do
+ local emptypages = arguments.addempty or ""
+ local textwidth = arguments.textwidth or "0cm"
+ for i=1,noffiles do
+ local filename = files[i]
if not string.find(filename,"^mtx%-context%-") then
context.insertpages (
{ filename },
@@ -114,7 +117,7 @@
end
end
else
- fprint("no files given")
+ context("no files given")
end
\stopluacode
diff --git a/Master/texmf-dist/tex/context/base/mtx-context-listing.tex b/Master/texmf-dist/tex/context/base/mtx-context-listing.tex
index 2a333c78923..a38fc60a9df 100644
--- a/Master/texmf-dist/tex/context/base/mtx-context-listing.tex
+++ b/Master/texmf-dist/tex/context/base/mtx-context-listing.tex
@@ -24,13 +24,20 @@
% --scite : pretty print comform suffix using scite lexer
% --bodyfont=list : additional bodyfont settings
% --paperformat=spec : paper*print or paperxprint
+% --compact : small margins, small font
%
% end help
\input mtx-context-common.tex
+\doifdocumentargument {compact} {
+ \setdocumentargument{topspace} {5mm}
+ \setdocumentargument{backspace}{5mm}
+ \setdocumentargument{bodyfont} {8pt}
+}
+
\setupbodyfont
- [11pt,tt,\getdocumentargument{bodyfont}]
+ [dejavu,11pt,tt,\getdocumentargument{bodyfont}] % dejavu is more complete
\setuptyping
[lines=yes]
diff --git a/Master/texmf-dist/tex/context/base/mtx-context-precache.tex b/Master/texmf-dist/tex/context/base/mtx-context-precache.tex
new file mode 100644
index 00000000000..9cbb46cf2c5
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mtx-context-precache.tex
@@ -0,0 +1,161 @@
+%D \module
+%D [ file=mtx-context-precache,
+%D version=2014.12.24,
+%D title=\CONTEXT\ Extra Trickry,
+%D subtitle=Precaching Fonts,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% begin help
+%
+% usage: context --extra=precache [no options yet]
+%
+% example: context --extra=precache
+%
+% end help
+
+\startluacode
+
+local lower = string.lower
+local filesuffix = file.suffix
+local findfile = resolvers.find_file
+
+local report = logs.reporter("fonts","precache")
+
+function fonts.names.precache()
+ local handlers = fonts.handlers
+ if not handlers then
+ report("no handlers available")
+ return
+ end
+ local otfloader = handlers.otf and handlers.otf.load
+ local afmloader = handlers.afm and handlers.afm.load
+ if not (otfloader or afmloader) then
+ report("no otf or afm handler available")
+ return
+ end
+ fonts.names.load()
+ local data = fonts.names.data
+ if not data then
+ report("no font data available")
+ return
+ end
+ local specifications = data.specifications
+ if not specifications then
+ report("no font specifications available")
+ return
+ end
+ local n = 0
+ for i=1,#specifications do
+ local specification = specifications[i]
+ local filename = specification.filename
+ local cleanfilename = specification.cleanfilename
+ local foundfile = findfile(filename)
+ if foundfile and foundfile ~= "" then
+ local suffix = lower(filesuffix(foundfile))
+ if suffix == "otf" or suffix == "ttf" then
+ if otfloader then
+ report("caching otf file: %s",foundfile)
+ otfloader(foundfile) -- todo: ttc/sub
+ n = n + 1
+ end
+ elseif suffix == "afm" then
+ if afmloader then
+ report("caching afm file: %s",foundfile)
+ afmloader(foundfile)
+ n = n + 1
+ end
+ end
+ end
+ end
+ report("%s files out of %s cached",n,#specifications)
+end
+
+\stopluacode
+
+\starttext
+
+\setuppapersize
+ [A4,landscape]
+
+\setuplayout
+ [width=middle,
+ height=middle,
+ footer=0pt,
+ header=1cm,
+ headerdistance=0cm,
+ backspace=5mm,
+ topspace=5mm]
+
+\setupbodyfont
+ [dejavu,6pt,tt]
+
+\startmode[*first]
+ \startluacode
+ fonts.names.precache()
+ \stopluacode
+\stopmode
+
+\startluacode
+ fonts.names.load()
+
+ local specifications = fonts.names.data.specifications
+
+ local sorted = { }
+ local hashed = { }
+
+ for i=1,#specifications do
+ local filename = specifications[i].cleanfilename
+ sorted[i] = filename
+ hashed[filename] = i
+ end
+
+ table.sort(sorted)
+
+ local context = context
+ local basename = file.basename
+
+ local NC = context.NC
+ local NR = context.NR
+ local HL = context.HL
+ local bold = context.bold
+
+ context.starttabulate { "||||||||||" }
+ HL()
+ NC() bold("format")
+ NC() bold("cleanfilename")
+ NC() bold("filename")
+ -- NC() bold("familyname")
+ -- NC() bold("fontname")
+ NC() bold("fullname")
+ NC() bold("rawname")
+ NC() bold("style")
+ NC() bold("variant")
+ NC() bold("weight")
+ NC() bold("width")
+ NC() NR()
+ HL()
+ for i=1,#sorted do
+ local specification = specifications[hashed[sorted[i]]]
+ NC() context(specification.format)
+ NC() context(specification.cleanfilename)
+ NC() context(basename(specification.filename))
+ -- NC() context(specification.familyname)
+ -- NC() context(specification.fontname)
+ NC() context(specification.fullname)
+ NC() context(specification.rawname)
+ NC() context(specification.style)
+ NC() context(specification.variant)
+ NC() context(specification.weight)
+ NC() context(specification.width)
+ NC() NR()
+ end
+ context.stoptabulate()
+\stopluacode
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/mult-aux.lua b/Master/texmf-dist/tex/context/base/mult-aux.lua
index 5a103213cde..353b5e69c3a 100644
--- a/Master/texmf-dist/tex/context/base/mult-aux.lua
+++ b/Master/texmf-dist/tex/context/base/mult-aux.lua
@@ -154,3 +154,15 @@ function namespaces.list()
local keys = { "type", "name", "comment", "version", "parent", "definition", "setup", "style" }
utilities.formatters.list(data,"namespace",keys)
end
+
+
+interfaces.implement {
+ name = "definenamespace",
+ arguments = { "string", "string" },
+ actions = namespaces.define
+}
+
+interfaces.implement {
+ name = "listnamespaces",
+ actions = namespaces.list
+}
diff --git a/Master/texmf-dist/tex/context/base/mult-aux.mkiv b/Master/texmf-dist/tex/context/base/mult-aux.mkiv
index bfac58261d3..b69d7f37068 100644
--- a/Master/texmf-dist/tex/context/base/mult-aux.mkiv
+++ b/Master/texmf-dist/tex/context/base/mult-aux.mkiv
@@ -223,14 +223,30 @@
\def#8##1{\csname\ifcsname#1#2:##1\endcsname#1#2:##1\else\s!empty\fi\endcsname}%
\def#9##1{\csname#1#2:##1\endcsname}}
+% pre-expansion can be a bit faster but handly any effect on a normal run so let's go for
+% saving some memory
+%
+% \unexpanded\def\mult_interfaces_install_parameter_handler#1#2#3#4#5#6#7#8#9% inlining \csname*\endcsname is more efficient (#3 and #6 only)
+% {\ifx#2\relax\let#2\empty\fi % it is hardly faster but produces less expansion tracing
+% %\def#3##1{\csname#4{#1#2}{##1}\endcsname}%
+% \edef#3##1{\noexpand\csname\noexpand\ifcsname#1\noexpand#2:##1\endcsname#1\noexpand#2:##1\noexpand\else\noexpand\expandafter\noexpand#5\noexpand\csname#1\noexpand#2:\s!parent\endcsname{##1}\noexpand\fi\endcsname}%
+% \edef#4##1##2{\noexpand\ifcsname##1:##2\endcsname##1:##2\noexpand\else\noexpand\expandafter\noexpand#5\noexpand\csname##1:\s!parent\endcsname{##2}\noexpand\fi}%
+% \def #5##1##2{\ifx##1\relax\s!empty\else#4{##1}{##2}\fi}% is {} needed around ##1 ?
+% \edef#6##1##2{\noexpand\csname\noexpand\ifcsname#1##1:##2\endcsname#1##1:##2\noexpand\else\noexpand\expandafter\noexpand#5\noexpand\csname#1##1:\s!parent\endcsname{##2}\noexpand\fi\endcsname}%
+% \def#7##1{\detokenize\expandafter\expandafter\expandafter{\csname#1#2:##1\endcsname}}% always root, no backtrack
+% % \def#7##1{\mult_interfaces_detokenize{\csname#4{#1#2}{##1}\endcsname}}% compact version
+% % \def#7##1{\mult_interfaces_detokenize{\csname\ifcsname#1#2:##1\endcsname#1#2:##1\else\expandafter#5\csname#1#2:\s!parent\endcsname{##1}\fi\endcsname}}%
+% \edef#8##1{\noexpand\csname\noexpand\ifcsname#1\noexpand#2:##1\endcsname#1\noexpand#2:##1\noexpand\else\s!empty\noexpand\fi\endcsname}%
+% \edef#9##1{\noexpand\csname#1#2:##1\endcsname}}
+
\unexpanded\def\installparameterhandler#1#2%
{\normalexpanded
{\mult_interfaces_install_parameter_handler
{\noexpand#1}% \??aa
\expandafter\noexpand\csname current#2\endcsname
\expandafter\noexpand\csname #2parameter\endcsname
- \expandafter\noexpand\csname do#2parameter\endcsname % or : #2_parameter_hash
- \expandafter\noexpand\csname do#2parentparameter\endcsname % or : #2_parent_parameter_hash
+ \expandafter\noexpand\csname do#2parameter\endcsname % or : #2_parameter
+ \expandafter\noexpand\csname do#2parentparameter\endcsname % or : #2_parent_parameter
\expandafter\noexpand\csname named#2parameter\endcsname
\expandafter\noexpand\csname detokenized#2parameter\endcsname
\expandafter\noexpand\csname strict#2parameter\endcsname % checked
@@ -339,6 +355,11 @@
\expandafter\edef\csname#1#4:\s!parent\endcsname{#2}%
\fi \fi}
+\def\mult_interfaces_chain#1#2{\ifcsname#1#2:\s!chain\endcsname\csname#1#2:\s!chain\endcsname\space\fi}
+\def\getparentchain #1#2{\ifcsname#1#2:\s!chain\endcsname\csname#1#2:\s!chain\endcsname\fi}
+\def\getcurrentparentchain#1#2{\csname#1#2:\s!chain\endcsname} % for the moment test:
+\def\getcurrentparentchain#1#2{\ifcsname#1#2:\s!chain\endcsname\csname#1#2:\s!chain\endcsname\fi}
+
\unexpanded\def\mult_interfaces_install_define_handler#1#2#3#4#5#6#7#8#9% why is \expanded still needed in clones
{\ifx#4\relax\let#4\empty\fi % see \defineregister
\unexpanded\def#2{\dotripleempty#5}%
@@ -351,6 +372,7 @@
\the#6% predefine
\edef#8{##2}%
\mult_check_for_parent{#1}{#3}#4#8%
+ \expandafter\edef\csname#1#4:\s!chain\endcsname{\mult_interfaces_chain#1{##2}##1}%
\expandafter\edef\csname#1#4:\s!parent\endcsname{#1##2}%
\mult_interfaces_get_parameters{#1#4:}[##3]%
\else\ifsecondargument
@@ -358,16 +380,19 @@
\expandafter\mult_check_for_assignment_indeed\detokenize{##2}=@@\_end_
\ifassignment
\let#8\empty
+ \expandafter\edef\csname#1#4:\s!chain\endcsname{##1}%
\expandafter\edef\csname#1#4:\s!parent\endcsname{#3}%
\mult_interfaces_get_parameters{#1#4:}[##2]%
\else
\edef#8{##2}%
\mult_check_for_parent{#1}{#3}#4#8%
+ \expandafter\edef\csname#1#4:\s!chain\endcsname{\mult_interfaces_chain#1{##2}##1}%
\expandafter\edef\csname#1#4:\s!parent\endcsname{#1##2}%
\fi
\else
\the#6% predefine
\let#8\empty
+ \expandafter\edef\csname#1#4:\s!chain\endcsname{##1}%
\expandafter\edef\csname#1#4:\s!parent\endcsname{#3}%
\fi\fi
\the#7%
@@ -696,7 +721,7 @@
\edef#2{##1}%
#3[##2]%
\else\iffirstargument
- \doifassignmentelse{##1}
+ \doifelseassignment{##1}
{\let#2\empty
#3[##1]}%
{\edef#2{##1}}%
@@ -758,11 +783,11 @@
\else
\global\advance\c_mult_interfaces_n_of_namespaces\plusone
\expandafter\edef\csname ??#1\endcsname{\v_interfaces_prefix_template}%
- \ctxcommand{registernamespace(\number\c_mult_interfaces_n_of_namespaces,"#1")}%
+ \clf_registernamespace\c_mult_interfaces_n_of_namespaces{#1}%
\fi}
\def\mult_interfaces_get_parameters_error_indeed#1#2%
- {\ctxcommand{showassignerror("#1","#2",\the\inputlineno)}} % no longer \waitonfatalerror
+ {\clf_showassignerror{#1}{#2}\inputlineno} % no longer \waitonfatalerror
% We install two core namespaces here, as we want nice error messages. Maybe
% we will reserve the first 9.
@@ -844,10 +869,10 @@
{\dodoubleargument\mult_interfaces_define_name_space}
\def\mult_interfaces_define_name_space[#1][#2]% namespace settings
- {\ctxlua{interfaces.namespaces.define(\!!bs#1\!!es,\!!bs#2\!!es)}}
+ {\clf_definenamespace{#1}{#2}}
\def\listnamespaces
- {\ctxlua{interfaces.namespaces.list()}}
+ {\clf_listnamespaces}
%D Helper:
%D
@@ -873,6 +898,8 @@
\expandafter\secondoftwoarguments
\fi}
+\let\doifcommandhandlerelse\doifelsecommandhandler
+
\unexpanded\def\doifcommandhandler#1#2% namespace name
{\ifcsname#1#2:\s!parent\endcsname
\expandafter\firstofoneargument
@@ -891,10 +918,10 @@
% another set of (fast) helpers (grep for usage):
-\def\expandnamespaceparameter#1#2#3% \??xx \getp \c!xx \c!yy
+\def\expandnamespaceparameter#1#2#3% \??xx \getp \c!xx \v!yy
{\csname#1\ifcsname#1\expandafter\expandafter\expandafter\mult_aux_expand_namespace_parameter#2#3}
-\def\mult_aux_expand_namespace_parameter#1#2% \cs \c!yy
+\def\mult_aux_expand_namespace_parameter#1#2% \cs \v!yy
{#1\endcsname#1\else#2\fi\endcsname}
\def\expandnamespacemacro#1#2#3% \??xx \some_edefed_cs \c!yy
@@ -933,13 +960,13 @@
\unexpanded\def\syst_helpers_double_empty#1#2#3%
{\syst_helpers_argument_reset
- \doifnextoptionalelse
+ \doifelsenextoptional
{\syst_helpers_double_empty_one_yes_mult#2#3}%
{\syst_helpers_double_empty_one_nop_mult#1}}
\def\syst_helpers_double_empty_one_yes_mult#1#2[#3]%
{\firstargumenttrue
- \doifnextoptionalelse
+ \doifelsenextoptional
{\secondargumenttrue#2[{#3}]}%
{\syst_helpers_double_empty_two_nop_mult#1{#3}}}
@@ -1006,19 +1033,19 @@
\unexpanded\def\syst_helpers_triple_empty#1#2#3#4%
{\syst_helpers_argument_reset
- \doifnextoptionalelse
+ \doifelsenextoptional
{\syst_helpers_triple_empty_one_yes_mult#2#3#4}%
{\syst_helpers_triple_empty_one_nop_mult#1}}
\def\syst_helpers_triple_empty_one_yes_mult#1#2#3[#4]%
{\firstargumenttrue
- \doifnextoptionalelse
+ \doifelsenextoptional
{\syst_helpers_triple_empty_two_yes_mult#2#3{#4}}%
{\syst_helpers_triple_empty_two_nop_mult#1{#4}}}
\def\syst_helpers_triple_empty_two_yes_mult#1#2#3[#4]%
{\secondargumenttrue
- \doifnextoptionalelse
+ \doifelsenextoptional
{\thirdargumenttrue#2[{#3}][{#4}]}%
{\syst_helpers_triple_empty_three_nop_mult#1{#3}{#4}}}
@@ -1102,8 +1129,8 @@
\expandafter\noexpand\csname saved_setup_current#2\endcsname
\expandafter\noexpand\csname nested_setup_current#2\endcsname}}
-% okay, we can also get rid of the #9, but thiS code looks pretty bad, while the previous is
-% still okay given that we can also use #6 as setup1 (so in fact we can save some cs again and
+% okay, we can also get rid of the #9, but this code looks pretty bad, while the previous is
+% still okay given that we can also use #6 as setup (so in fact we can save some cs again and
% only use one extra)
%
% \global\advance\commalevel \plusone
@@ -1116,4 +1143,108 @@
% % \syst_helpers_do_do_process_comma_item##1,]\relax
% \global\advance\commalevel \minusone
+% The next one is experimental (and used in publications):
+
+\let\c_mult_set\relax
+
+\unexpanded\def\mult_interfaces_install_definition_set#1#2#3#4#5#6#7%
+ {\newcount#3%
+ \let#6\empty
+ \unexpanded\def#2%
+ {\expandafter\let\expandafter\c_mult_set\csname #1_t_#6\endcsname
+ \ifx\c_mult_set\relax
+ \expandafter\newtoks\c_mult_set
+ \expandafter\let\csname #1_t_#6\endcsname\c_mult_set
+ \fi}
+ \unexpanded\def#4##1%
+ {\pushmacro#6%
+ \advance#3\plusone
+ \edef#6{##1}%
+ \unprotect}%
+ \unexpanded\def#5%
+ {\protect
+ \advance#3\minusone
+ \popmacro#6}%
+ \unexpanded\def#7##1%
+ {\edef#6{##1}%
+ #2%
+ \the\c_mult_set\relax}}
+
+\unexpanded\def\installdefinitionset#1#2%
+ {\normalexpanded
+ {\mult_interfaces_install_definition_set
+ {\noexpand#1}% \??aa
+ \expandafter\noexpand\csname set_#2_toks\endcsname
+ \expandafter\noexpand\csname #2_nesting_depth\endcsname
+ \expandafter\noexpand\csname push#2\endcsname
+ \expandafter\noexpand\csname pop#2\endcsname
+ \expandafter\noexpand\csname current#2\endcsname
+ \expandafter\noexpand\csname use#2\endcsname}}
+
+\unexpanded\def\mult_interfaces_install_definition_set_member#1#2#3#4#5#6#7#8#9% no everysetups etc
+ {\let#5#2%
+ \unexpanded\def#2%
+ {\ifcase#4\relax\expandafter#5\else\expandafter#6\fi}%
+ \unexpanded\def#6%
+ {\dodoubleempty#7}%
+ \unexpanded\def#7[##1][##2]%
+ {\ifsecondargument
+ #3\c_mult_set\expandafter{\the\c_mult_set#9[##1][##2]}%
+ \else\iffirstargument
+ #3\c_mult_set\expandafter{\the\c_mult_set#8[##1]}%
+ \fi\fi}}
+
+\unexpanded\def\installdefinitionsetmember#1#2#3#4%
+ {\normalexpanded
+ {\mult_interfaces_install_definition_set_member
+ {\noexpand#3}% \??aa
+ \expandafter\noexpand\csname setup#4\endcsname
+ \expandafter\noexpand\csname set_#2_toks\endcsname
+ \expandafter\noexpand\csname #2_nesting_depth\endcsname
+ \expandafter\noexpand\csname normal_setup_#4\endcsname
+ \expandafter\noexpand\csname delayed_setup_#4\endcsname
+ \expandafter\noexpand\csname do_delayed_setup_#4\endcsname
+ \expandafter\noexpand\csname setup#4_\s!single\endcsname
+ \expandafter\noexpand\csname setup#4_\s!double\endcsname}}
+
+%D Another experiment:
+
+\unexpanded\def\mult_interfaces_install_parent_injector#1#2#3#4%
+ {\unexpanded\def#4##1%
+ {\ifx#3\empty
+ \expandafter\def\csname#1#2:\s!parent\endcsname{#1##1}%
+ \fi}}
+
+\unexpanded\def\installparentinjector#1#2%
+ {\normalexpanded{\mult_interfaces_install_parent_injector
+ {\noexpand#1}%
+ \expandafter\noexpand\csname current#2\endcsname
+ \expandafter\noexpand\csname current#2parent\endcsname
+ \expandafter\noexpand\csname inject#2parent\endcsname}}
+
\protect
+
+%\unprotect
+% \installcorenamespace {test} \installcommandhandler \??test {test} \??test
+% \unexpanded\def\TestMeA[#1]%
+% {\edef\currenttest{#1}
+% \edef\p_before{\testparameter\c!before}%
+% \ifx\p_before\empty \relax \else \relax \fi}
+% \unexpanded\def\TestMeB[#1]%
+% {\edef\currenttest{#1}
+% \doifelsenothing{\testparameter\c!before}\relax\relax}
+% \unexpanded\def\TestMeC[#1]%
+% {\edef\currenttest{#1}
+% \expandafter\expandafter\expandafter\ifx\testparameter\c!before\empty \relax \else \relax \fi}
+% \unexpanded\def\TestMeD[#1]%
+% {\edef\currenttest{#1}
+% \doubleexpandafter\ifx\testparameter\c!before\empty \relax \else \relax \fi}
+% \protect
+%
+% \starttext
+% \definetest[foo] \definetest[bar][foo] \setuptest[bar][before=indeed]
+% \resettimer \dorecurse{100000}{\TestMeA[bar]} A:\elapsedtime \par % 0.502
+% \resettimer \dorecurse{100000}{\TestMeB[bar]} B:\elapsedtime \par % 0.530
+% \resettimer \dorecurse{100000}{\TestMeC[bar]} C:\elapsedtime \par % 0.487
+% \resettimer \dorecurse{100000}{\TestMeD[bar]} D:\elapsedtime \par % 0.493
+% \stoptext
diff --git a/Master/texmf-dist/tex/context/base/mult-chk.lua b/Master/texmf-dist/tex/context/base/mult-chk.lua
index 2a2dfcd4bd9..44a9f739f9e 100644
--- a/Master/texmf-dist/tex/context/base/mult-chk.lua
+++ b/Master/texmf-dist/tex/context/base/mult-chk.lua
@@ -16,7 +16,8 @@ local allocate = utilities.storage.allocate
local report_interface = logs.reporter("interface","checking")
-interfaces = interfaces or { }
+local interfaces = interfaces
+local implement = interfaces.implement
interfaces.syntax = allocate {
test = { keys = table.tohash { "a","b","c","d","e","f","g" } }
@@ -48,6 +49,18 @@ function interfaces.addvalidkeys(category,list)
end
end
+implement {
+ name = "setvalidinterfacekeys",
+ actions = interfaces.setvalidkeys,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "addvalidinterfacekeys",
+ actions = interfaces.addvalidkeys,
+ arguments = { "string", "string" }
+}
+
-- weird code, looks incomplete ... probably an experiment
local prefix, category, keys
@@ -73,4 +86,8 @@ function interfaces.getcheckedparameters(k,p,s)
end
end
--- _igcp_ = interfaces.getcheckedparameters
+implement {
+ name = "getcheckedinterfaceparameters",
+ actions = interfaces.getcheckedparameters,
+ arguments = { "string", "string", "string" }
+}
diff --git a/Master/texmf-dist/tex/context/base/mult-chk.mkiv b/Master/texmf-dist/tex/context/base/mult-chk.mkiv
index 1d02f166d1b..9208a73e1e5 100644
--- a/Master/texmf-dist/tex/context/base/mult-chk.mkiv
+++ b/Master/texmf-dist/tex/context/base/mult-chk.mkiv
@@ -38,8 +38,8 @@
\unexpanded\def\setvalidparameterkeys{\dodoubleargument\mult_checkers_set_valid_parameter_keys}
\unexpanded\def\addvalidparameterkeys{\dodoubleargument\mult_checkers_add_valid_parameter_keys}
-\def\mult_checkers_set_valid_parameter_keys[#1][#2]{\ctxlua{interfaces.setvalidkeys("#1",\!!bs#2\!!es)}}
-\def\mult_checkers_add_valid_parameter_keys[#1][#2]{\ctxlua{interfaces.addvalidkeys("#1",\!!bs#2\!!es)}}
+\def\mult_checkers_set_valid_parameter_keys[#1][#2]{\clf_setvalidinterfacekeys{#1}{#2}}
+\def\mult_checkers_add_valid_parameter_keys[#1][#2]{\clf_addvalidinterfacekeys{#1}{#2}}
\def\mult_checkers_get_checked_parameters_yes[#1]#2[#3]#4[#5%
{\if\noexpand#5]%
@@ -50,8 +50,7 @@
\fi{#1}{#3}#5}
\def\mult_checkers_get_checked_parameters_yes_indeed#1#2#3]%
- %{\ctxlua{_igcp_("#1","#2",\!!bs\detokenize{#3}\!!es)}}
- {\ctxlua{interfaces.getcheckedparameters("#1","#2",\!!bs\detokenize{#3}\!!es)}}
+ {\clf_getcheckedinterfaceparameters{#1}{#2}{\detokenize{#3}}}
\def\mult_checkers_get_checked_parameters_nop[#1]#2[#3]#4[#5%
{\if\noexpand#5]%
diff --git a/Master/texmf-dist/tex/context/base/mult-de.mkii b/Master/texmf-dist/tex/context/base/mult-de.mkii
index 9e7ecd93071..90aae390e0d 100644
--- a/Master/texmf-dist/tex/context/base/mult-de.mkii
+++ b/Master/texmf-dist/tex/context/base/mult-de.mkii
@@ -180,6 +180,7 @@
\setinterfacevariable{flushleft}{flushleft}
\setinterfacevariable{flushouter}{flushouter}
\setinterfacevariable{flushright}{flushright}
+\setinterfacevariable{followingpage}{followingpage}
\setinterfacevariable{footer}{fusszeile}
\setinterfacevariable{footnote}{fussnote}
\setinterfacevariable{force}{zwinge}
@@ -301,6 +302,7 @@
\setinterfacevariable{mirrored}{gespiegelt}
\setinterfacevariable{monday}{montag}
\setinterfacevariable{mono}{mono}
+\setinterfacevariable{monobold}{monofett}
\setinterfacevariable{month}{monat}
\setinterfacevariable{more}{more}
\setinterfacevariable{morehyphenation}{morehyphenation}
@@ -360,6 +362,7 @@
\setinterfacevariable{positive}{positiv}
\setinterfacevariable{postponing}{verschieben}
\setinterfacevariable{postscript}{postscript}
+\setinterfacevariable{precedingpage}{followingpage}
\setinterfacevariable{preference}{einstellung}
\setinterfacevariable{preview}{vorschau}
\setinterfacevariable{previous}{vorig}
@@ -419,7 +422,7 @@
\setinterfacevariable{september}{september}
\setinterfacevariable{serif}{serif}
\setinterfacevariable{serried}{kleinerabstand}
-\setinterfacevariable{setups}{impostazioni}
+\setinterfacevariable{setups}{setups}
\setinterfacevariable{sheet}{sheet}
\setinterfacevariable{short}{kurz}
\setinterfacevariable{simplefonts}{simplefonts}
@@ -651,7 +654,7 @@
\setinterfaceconstant{coupling}{verknuepfung}
\setinterfaceconstant{couplingway}{verkopplungsart}
\setinterfaceconstant{criterium}{kriterium}
-\setinterfaceconstant{css}{css}
+\setinterfaceconstant{cssfile}{cssfile}
\setinterfaceconstant{current}{aktuell}
\setinterfaceconstant{cutspace}{cutspace}
\setinterfaceconstant{dash}{strich}
@@ -686,7 +689,7 @@
\setinterfaceconstant{equalwidth}{equalwidth}
\setinterfaceconstant{escape}{escape}
\setinterfaceconstant{evenmargin}{geraderand}
-\setinterfaceconstant{exitoffset}{labeloffset}
+\setinterfaceconstant{exitoffset}{exitoffset}
\setinterfaceconstant{expansion}{expansion}
\setinterfaceconstant{export}{export}
\setinterfaceconstant{extras}{extras}
@@ -753,6 +756,7 @@
\setinterfaceconstant{indenting}{einziehen}
\setinterfaceconstant{indentnext}{ziehefolgendeein}
\setinterfaceconstant{indicator}{indikator}
+\setinterfaceconstant{initialsep}{initialsep}
\setinterfaceconstant{inner}{innen}
\setinterfaceconstant{innermargin}{innermargin}
\setinterfaceconstant{inputfile}{inputfile}
@@ -858,6 +862,7 @@
\setinterfaceconstant{nright}{nrechts}
\setinterfaceconstant{ntop}{noben}
\setinterfaceconstant{number}{nummer}
+\setinterfaceconstant{numberalign}{numberalign}
\setinterfaceconstant{numbercolor}{nummernfarbe}
\setinterfaceconstant{numbercommand}{nummerbefehl}
\setinterfaceconstant{numberconversion}{numberconversion}
@@ -1281,6 +1286,7 @@
\setinterfacecommand{definetabletemplate}{definieretabellenvorlage}
\setinterfacecommand{definetabulate}{definieretabulator}
\setinterfacecommand{definetext}{definieretext}
+\setinterfacecommand{definetextbackground}{definetextbackground}
\setinterfacecommand{definetextposition}{definetextposition}
\setinterfacecommand{definetextvariable}{definetextvariable}
\setinterfacecommand{definetype}{definetype}
@@ -1441,7 +1447,6 @@
\setinterfacecommand{paperheight}{papierhoehe}
\setinterfacecommand{paperwidth}{papierbreite}
\setinterfacecommand{periods}{punkt}
-\setinterfacecommand{plaatsruwelijst}{placerawlist}
\setinterfacecommand{placebookmarks}{platzierebookmarks}
\setinterfacecommand{placecombinedlist}{platzierezusammengestellteliste}
\setinterfacecommand{placefloat}{placefloat}
@@ -1451,11 +1456,13 @@
\setinterfacecommand{placeheadtext}{placeheadtext}
\setinterfacecommand{placelegend}{platzierelegende}
\setinterfacecommand{placelist}{platziereliste}
+\setinterfacecommand{placelistofsynonyms}{placelistofsynonyms}
\setinterfacecommand{placelocalfootnotes}{platzierelokalefussnoten}
\setinterfacecommand{placelogos}{platzierelogo}
\setinterfacecommand{placeongrid}{amgitterausrichten}
\setinterfacecommand{placeontopofeachother}{platziereuntereinander}
\setinterfacecommand{placepagenumber}{placepagenumber}
+\setinterfacecommand{placerawlist}{placerawlist}
\setinterfacecommand{placereferencelist}{placereferencelist}
\setinterfacecommand{placeregister}{platziereregister}
\setinterfacecommand{placerule}{placerule}
@@ -1602,7 +1609,6 @@
\setinterfacecommand{setupregister}{stelleregisterein}
\setinterfacecommand{setuprotate}{stelledrehenein}
\setinterfacecommand{setuprule}{setuprule}
-\setinterfacecommand{setups}{einstellungen}
\setinterfacecommand{setupscreens}{stellerasterein}
\setinterfacecommand{setupsection}{stelleabschnittein}
\setinterfacecommand{setupsectionblock}{stelleabschnittsblockein}
@@ -1620,6 +1626,7 @@
\setinterfacecommand{setuptables}{stelletabellenein}
\setinterfacecommand{setuptabulate}{stelletabulatorein}
\setinterfacecommand{setuptext}{stelletextein}
+\setinterfacecommand{setuptextbackground}{setuptextbackground}
\setinterfacecommand{setuptextposition}{setuptextposition}
\setinterfacecommand{setuptextrules}{stelletextumrissein}
\setinterfacecommand{setuptexttexts}{stelletexttexteein}
@@ -1666,6 +1673,7 @@
\setinterfacecommand{startdocument}{startdokument}
\setinterfacecommand{startenvironment}{startumgebung}
\setinterfacecommand{startfigure}{startabbildung}
+\setinterfacecommand{startframed}{startframed}
\setinterfacecommand{startglobal}{startglobal}
\setinterfacecommand{startline}{startzeile}
\setinterfacecommand{startlinecorrection}{startzeilenkorrektur}
@@ -1692,6 +1700,7 @@
\setinterfacecommand{starttable}{starttabelle}
\setinterfacecommand{starttables}{starttabellen}
\setinterfacecommand{starttext}{starttext}
+\setinterfacecommand{starttextbackground}{starttextbackground}
\setinterfacecommand{starttextrule}{starttextlinie}
\setinterfacecommand{startunpacked}{startgrosserdurchschuss}
\setinterfacecommand{startversion}{startversion}
@@ -1706,6 +1715,7 @@
\setinterfacecommand{stopcomponent}{stopkomponente}
\setinterfacecommand{stopdocument}{stopdokument}
\setinterfacecommand{stopenvironment}{stopumgebung}
+\setinterfacecommand{stopframed}{stopframed}
\setinterfacecommand{stopglobal}{stopglobal}
\setinterfacecommand{stopline}{stopzeile}
\setinterfacecommand{stoplinecorrection}{stopzeilenkorrektur}
@@ -1731,6 +1741,7 @@
\setinterfacecommand{stoptable}{stoptabelle}
\setinterfacecommand{stoptables}{stoptabellen}
\setinterfacecommand{stoptext}{stoptext}
+\setinterfacecommand{stoptextbackground}{stoptextbackground}
\setinterfacecommand{stoptextrule}{stoptextlinie}
\setinterfacecommand{stopunpacked}{stopgrosserdurchschuss}
\setinterfacecommand{stopversion}{stopversion}
diff --git a/Master/texmf-dist/tex/context/base/mult-def.lua b/Master/texmf-dist/tex/context/base/mult-def.lua
index bd8b361851e..c0831de2d95 100644
--- a/Master/texmf-dist/tex/context/base/mult-def.lua
+++ b/Master/texmf-dist/tex/context/base/mult-def.lua
@@ -1275,6 +1275,10 @@ return {
["pe"]="تعریف‌مترادفها",
["ro"]="definestesinonim",
},
+ ["placelistofsynonyms"]={
+ ["en"]="placelistofsynonyms",
+ ["nl"]="plaatslijstmetsynoniemen",
+ },
["definetabletemplate"]={
["cs"]="definujsablonutabulky",
["de"]="definieretabellenvorlage",
@@ -2905,7 +2909,7 @@ return {
["pe"]="نقطه‌ها",
["ro"]="puncte",
},
- ["plaatsruwelijst"]={
+ ["placerawlist"]={
["cs"]="placerawlist",
["de"]="placerawlist",
["en"]="placerawlist",
@@ -4509,16 +4513,6 @@ return {
["pe"]="بارگذاری‌خط",
["ro"]="seteazarigla",
},
- ["setups"]={
- ["cs"]="nastaveni",
- ["de"]="einstellungen",
- ["en"]="setups",
- ["fr"]="reglages",
- ["it"]="impostazioni",
- ["nl"]="instellingen",
- ["pe"]="بارگذاریها",
- ["ro"]="setari",
- },
["setupscreens"]={
["cs"]="nastavrastr",
["de"]="stellerasterein",
@@ -5039,6 +5033,30 @@ return {
["pe"]="شروع‌تنظیم",
["ro"]="startaliniere",
},
+ ["starttextbackground"]={
+ ["en"]="starttextbackground",
+ ["nl"]="starttekstachtergrond",
+ },
+ ["stoptextbackground"]={
+ ["en"]="stoptextbackground",
+ ["nl"]="stoptekstachtergrond",
+ },
+ ["setuptextbackground"]={
+ ["en"]="setuptextbackground",
+ ["nl"]="steltekstachtergrondin",
+ },
+ ["definetextbackground"]={
+ ["en"]="definetextbackground",
+ ["nl"]="definieertekstachtergrond",
+ },
+ ["startframed"]={
+ ["en"]="startframed",
+ ["nl"]="startomlijnd",
+ },
+ ["stopframed"]={
+ ["en"]="stopframed",
+ ["nl"]="stopomlijnd",
+ },
["startbackground"]={
["cs"]="startpozadi",
["de"]="starthintergrund",
@@ -6454,6 +6472,10 @@ return {
},
},
["constants"]={
+ ["setups"]={
+ ["comment"]="no translations",
+ ["en"]="setups",
+ },
-- select/simplefonts
["regularfont"] ={ ["en"]="regularfont" },
["boldfont"] ={ ["en"]="boldfont" },
@@ -6508,8 +6530,8 @@ return {
["export"] = {
["en"]="export",
},
- ["css"] = {
- ["en"]="css",
+ ["cssfile"] = {
+ ["en"]="cssfile",
},
["xhtml"] = {
["en"]="xhtml",
@@ -6522,7 +6544,7 @@ return {
["en"]="labeloffset",
},
["exitoffset"]={
- ["en"]="labeloffset",
+ ["en"]="exitoffset",
},
["commentoffset"]={
["en"]="commentoffset",
@@ -6558,6 +6580,10 @@ return {
["en"]="headalign",
["nl"]="kopuitlijnen",
},
+ ["numberalign"]={
+ ["en"]="numberalign",
+ ["nl"]="nummeruitlijnen",
+ },
["alignsymbol"]={
["en"]="alignsymbol",
},
@@ -6625,6 +6651,9 @@ return {
["surnamesep"]={
["en"]="surnamesep",
},
+ ["initialsep"]={
+ ["en"]="initialsep",
+ },
["surnameinitialsep"]={
["en"]="surnameinitialsep",
},
@@ -8944,7 +8973,7 @@ return {
["de"]="mindepth",
["en"]="mindepth",
["fr"]="profondeurmin",
- ["it"]="mindeoth",
+ ["it"]="mindepth",
["nl"]="mindiepte",
["pe"]="کمترین‌عمق",
["ro"]="mindepth",
@@ -10133,16 +10162,6 @@ return {
["pe"]="قراربده",
["ro"]="set",
},
- ["setups"]={
- ["cs"]="setups",
- ["de"]="setups",
- ["en"]="setups",
- ["fr"]="reglages",
- ["it"]="setups",
- ["nl"]="setups",
- ["pe"]="بارگذاریها",
- ["ro"]="setups",
- },
["shrink"]={
["en"]="shrink",
["nl"]="krimp",
@@ -11402,6 +11421,18 @@ return {
},
},
["variables"]={
+ ["setups"]={
+ ["comment"]="no translations",
+ ["en"]="setups",
+ },
+ ["followingpage"]={
+ ["en"]="followingpage",
+ ["nl"]="opvolgendepagina",
+ },
+ ["precedingpage"]={
+ ["en"]="followingpage",
+ ["nl"]="voorafgaandepagina",
+ },
["math"]={
["en"]="math",
},
@@ -11518,21 +11549,27 @@ return {
},
["maxheight"]={
["en"]="maxheight",
+ ["nl"]="maxhoogte",
},
["maxdepth"]={
["en"]="maxdepth",
+ ["nl"]="maxdiepte",
},
["maxwidth"]={
["en"]="maxwidth",
+ ["nl"]="maxbreedte",
},
["minheight"]={
["en"]="minheight",
+ ["nl"]="minhoogte",
},
["mindepth"]={
["en"]="mindepth",
+ ["nl"]="mindiepte",
},
["minwidth"]={
["en"]="minwidth",
+ ["nl"]="minbreedte",
},
["short"]={
["nl"]="kort",
@@ -14387,6 +14424,16 @@ return {
["pe"]="مونو",
["ro"]="mono",
},
+ ["monobold"]={
+ ["cs"]="monotucne",
+ ["de"]="monofett",
+ ["en"]="monobold",
+ ["fr"]="monogras",
+ ["it"]="monograssetto",
+ ["nl"]="monovet",
+ ["pe"]="monobold",
+ ["ro"]="monoaldin",
+ },
["month"]={
["cs"]="mesic",
["de"]="monat",
@@ -15484,16 +15531,6 @@ return {
["pe"]="تنگ‌هم",
["ro"]="serried",
},
- ["setups"]={
- ["cs"]="einstellungen",
- ["de"]="impostazioni",
- ["en"]="setups",
- ["fr"]="reglages",
- ["it"]="nastaveni",
- ["nl"]="instellingen",
- ["pe"]="بارگذاریها",
- ["ro"]="setari",
- },
["sheet"]={
["cs"]="sheet",
["de"]="sheet",
diff --git a/Master/texmf-dist/tex/context/base/mult-def.mkiv b/Master/texmf-dist/tex/context/base/mult-def.mkiv
index 321f06154a8..6efeb30694c 100644
--- a/Master/texmf-dist/tex/context/base/mult-def.mkiv
+++ b/Master/texmf-dist/tex/context/base/mult-def.mkiv
@@ -30,85 +30,114 @@
% \input mult-\userinterfacetag \relax
% \input mult-m\userresponsestag \relax
-\ctxlua{interfaces.setuserinterface("\userinterfacetag","\userresponsestag")}
-
-% start todo:
-
-\def\c!fences {fences}
-\def\c!keeptogether {keeptogether}
-\def\c!viewerprefix {viewerprefix}
-
-\def\c!dataset {dataset}
-\def\c!sectionblock {sectionblock}
-\def\c!language {language}
-\def\c!compressseparator{compressseparator}
-\def\c!renderingsetup {renderingsetup}
-\def\c!filler {filler}
-\def\c!resources {resources}
-\def\c!first {first}
-\def\c!last {last}
-\def\c!quotechar {quotechar}
-\def\c!commentchar {commentchar}
-\def\c!symbolcommand {symbolcommand}
-\def\c!xmlsetup {xmlsetup}
-\def\c!comma {comma}
-\def\c!period {period}
-\def\c!monthconversion {monthconversion}
-\def\c!authorconversion {authorconversion}
-\def\c!comment {comment}
-\def\c!textalign {textalign}
-\def\c!up {up}
-\def\c!down {down}
-\def\c!instance {instance}
-\def\c!database {database}
-\def\c!group {group}
-\def\c!groupsuffix {groupsuffix}
-
-\def\c!referencemethod {referencemethod} % forward both
-
-\def\v!dataset {dataset}
-\def\v!compressseparator{compressseparator}
-\def\v!notation {notation}
-\def\v!endnote {endnote}
-\def\v!interactive {interactive}
-\def\v!autopunctuation {autopunctuation}
-\def\v!integral {integral}
-\def\v!shiftup {shiftup}
-\def\v!shiftdown {shiftdown}
-\def\v!construction {construction}
-\def\v!unframed {unframed}
-\def\v!chemical {chemical}
-\def\v!chemicals {chemicals}
-\def\v!words {words}
-\def\v!combination {combination}
-\def\v!norepeat {norepeat}
-\def\v!mixed {mixed}
-\def\v!centerlast {centerlast}
-
-\def\s!lcgreek {lcgreek}
-\def\s!ucgreek {ucgreek}
-\def\s!sygreek {sygreek}
-\def\s!italics {italics}
-\def\s!integral {integral}
-\def\s!insert {insert} % maybe insertclass
-\def\s!marker {marker}
-
-\def\s!mixedcolumn {mixedcolumn}
-
-\def\s!double {double}
-\def\s!decimal {decimal}
-\def\s!binary {binary}
-
-\def\s!internal {internal}
-
-\def\s!current {current}
-
-\def\s!rel {rel}
-\def\s!ord {ord}
-
-\def\c!HL {HL}
-\def\c!VL {VL}
-\def\c!NL {NL}
+\clf_setuserinterface{\userinterfacetag}{\userresponsestag}
+
+% start todo in mult-def.lua:
+
+\def\v!alphabetic {alphabetic}
+\def\v!Alphabetic {Alphabetic}
+
+\def\c!svgstyle {svgstyle}
+
+\def\c!translate {translate}
+
+\def\c!nextleft {nextleft}
+\def\c!nextright {nextright}
+\def\c!nextleftquotation {nextleftquotation}
+\def\c!nextrightquotation{nextrightquotation}
+
+\def\c!fences {fences}
+\def\c!words {words}
+\def\c!characters {characters}
+\def\c!hyphens {hyphens}
+\def\c!joiners {joiners}
+\def\c!leftwords {leftwords}
+\def\c!rightwords {rightwords}
+\def\c!keeptogether {keeptogether}
+\def\c!viewerprefix {viewerprefix}
+
+\def\v!display {display}
+\def\v!inline {inline}
+
+\def\v!camel {camel}
+
+\def\c!dataset {dataset}
+\def\c!sectionblock {sectionblock}
+\def\c!language {language}
+\def\c!compressseparator {compressseparator}
+\def\c!renderingsetup {renderingsetup}
+\def\c!filler {filler}
+\def\c!resources {resources}
+\def\c!first {first}
+\def\c!last {last}
+\def\c!quotechar {quotechar}
+\def\c!commentchar {commentchar}
+\def\c!symbolcommand {symbolcommand}
+\def\c!xmlsetup {xmlsetup}
+\def\c!comma {comma}
+\def\c!period {period}
+\def\c!monthconversion {monthconversion}
+\def\c!authorconversion {authorconversion}
+\def\c!comment {comment}
+\def\c!textalign {textalign}
+\def\c!up {up}
+\def\c!down {down}
+\def\c!instance {instance}
+\def\c!database {database}
+\def\c!group {group}
+\def\c!groupsuffix {groupsuffix}
+\def\c!properties {properties}
+\def\c!journalconversion {journalconversion}
+\def\c!register {register}
+\def\c!note {note}
+\def\c!field {field}
+\def\c!ignore {ignore}
+\def\c!specification {specification}
+
+\def\c!pageleft {pageleft}
+\def\c!pageright {pageright}
+\def\c!pagesep {pagesep}
+\def\c!lastpagesep {lastpagesep}
+\def\c!finalpagesep {finalpagesep}
+\def\c!pageconnector {pageconnector}
+
+\def\c!referencemethod {referencemethod} % forward both
+
+\def\v!dataset {dataset}
+\def\v!compressseparator {compressseparator}
+\def\v!notation {notation}
+\def\v!endnote {endnote}
+\def\v!interactive {interactive}
+\def\v!autopunctuation {autopunctuation}
+\def\v!integral {integral}
+\def\v!shiftup {shiftup}
+\def\v!shiftdown {shiftdown}
+\def\v!construction {construction}
+\def\v!unframed {unframed}
+\def\v!chemical {chemical}
+\def\v!chemicals {chemicals}
+\def\v!words {words}
+\def\v!combination {combination}
+\def\v!norepeat {norepeat}
+\def\v!mixed {mixed}
+\def\v!centerlast {centerlast}
+\def\v!long {long}
+\def\v!box {box}
+
+\def\v!noline {noline}
+\def\v!noheight {noheight}
+\def\v!nodepth {nodepth}
+
+\def\v!bookmark {bookmark}
+
+\def\v!vfenced {vfenced}
+\def\v!bothtext {bothtext}
+
+\def\s!traditional {traditional}
+
+\def\c!HL {HL}
+\def\c!VL {VL}
+\def\c!NL {NL}
\ifdefined\v!kerncharacters\else \def\v!kerncharacters{kerncharacters} \fi % no time now for translations should be a e! actually
\ifdefined\v!letterspacing \else \def\v!letterspacing {letterspacing} \fi % no time now for translations should be a e! actually
diff --git a/Master/texmf-dist/tex/context/base/mult-en.mkii b/Master/texmf-dist/tex/context/base/mult-en.mkii
index bf72af384c7..b08070ba044 100644
--- a/Master/texmf-dist/tex/context/base/mult-en.mkii
+++ b/Master/texmf-dist/tex/context/base/mult-en.mkii
@@ -180,6 +180,7 @@
\setinterfacevariable{flushleft}{flushleft}
\setinterfacevariable{flushouter}{flushouter}
\setinterfacevariable{flushright}{flushright}
+\setinterfacevariable{followingpage}{followingpage}
\setinterfacevariable{footer}{footer}
\setinterfacevariable{footnote}{footnote}
\setinterfacevariable{force}{force}
@@ -301,6 +302,7 @@
\setinterfacevariable{mirrored}{mirrored}
\setinterfacevariable{monday}{monday}
\setinterfacevariable{mono}{mono}
+\setinterfacevariable{monobold}{monobold}
\setinterfacevariable{month}{month}
\setinterfacevariable{more}{more}
\setinterfacevariable{morehyphenation}{morehyphenation}
@@ -360,6 +362,7 @@
\setinterfacevariable{positive}{positive}
\setinterfacevariable{postponing}{postponing}
\setinterfacevariable{postscript}{postscript}
+\setinterfacevariable{precedingpage}{followingpage}
\setinterfacevariable{preference}{preference}
\setinterfacevariable{preview}{preview}
\setinterfacevariable{previous}{previous}
@@ -651,7 +654,7 @@
\setinterfaceconstant{coupling}{coupling}
\setinterfaceconstant{couplingway}{couplingway}
\setinterfaceconstant{criterium}{criterium}
-\setinterfaceconstant{css}{css}
+\setinterfaceconstant{cssfile}{cssfile}
\setinterfaceconstant{current}{current}
\setinterfaceconstant{cutspace}{cutspace}
\setinterfaceconstant{dash}{dash}
@@ -686,7 +689,7 @@
\setinterfaceconstant{equalwidth}{equalwidth}
\setinterfaceconstant{escape}{escape}
\setinterfaceconstant{evenmargin}{evenmargin}
-\setinterfaceconstant{exitoffset}{labeloffset}
+\setinterfaceconstant{exitoffset}{exitoffset}
\setinterfaceconstant{expansion}{expansion}
\setinterfaceconstant{export}{export}
\setinterfaceconstant{extras}{extras}
@@ -753,6 +756,7 @@
\setinterfaceconstant{indenting}{indenting}
\setinterfaceconstant{indentnext}{indentnext}
\setinterfaceconstant{indicator}{indicator}
+\setinterfaceconstant{initialsep}{initialsep}
\setinterfaceconstant{inner}{inner}
\setinterfaceconstant{innermargin}{innermargin}
\setinterfaceconstant{inputfile}{inputfile}
@@ -858,6 +862,7 @@
\setinterfaceconstant{nright}{nright}
\setinterfaceconstant{ntop}{ntop}
\setinterfaceconstant{number}{number}
+\setinterfaceconstant{numberalign}{numberalign}
\setinterfaceconstant{numbercolor}{numbercolor}
\setinterfaceconstant{numbercommand}{numbercommand}
\setinterfaceconstant{numberconversion}{numberconversion}
@@ -1281,6 +1286,7 @@
\setinterfacecommand{definetabletemplate}{definetabletemplate}
\setinterfacecommand{definetabulate}{definetabulate}
\setinterfacecommand{definetext}{definetext}
+\setinterfacecommand{definetextbackground}{definetextbackground}
\setinterfacecommand{definetextposition}{definetextposition}
\setinterfacecommand{definetextvariable}{definetextvariable}
\setinterfacecommand{definetype}{definetype}
@@ -1441,7 +1447,6 @@
\setinterfacecommand{paperheight}{paperheight}
\setinterfacecommand{paperwidth}{paperwidth}
\setinterfacecommand{periods}{periods}
-\setinterfacecommand{plaatsruwelijst}{placerawlist}
\setinterfacecommand{placebookmarks}{placebookmarks}
\setinterfacecommand{placecombinedlist}{placecombinedlist}
\setinterfacecommand{placefloat}{placefloat}
@@ -1451,11 +1456,13 @@
\setinterfacecommand{placeheadtext}{placeheadtext}
\setinterfacecommand{placelegend}{placelegend}
\setinterfacecommand{placelist}{placelist}
+\setinterfacecommand{placelistofsynonyms}{placelistofsynonyms}
\setinterfacecommand{placelocalfootnotes}{placelocalfootnotes}
\setinterfacecommand{placelogos}{placelogos}
\setinterfacecommand{placeongrid}{placeongrid}
\setinterfacecommand{placeontopofeachother}{placeontopofeachother}
\setinterfacecommand{placepagenumber}{placepagenumber}
+\setinterfacecommand{placerawlist}{placerawlist}
\setinterfacecommand{placereferencelist}{placereferencelist}
\setinterfacecommand{placeregister}{placeregister}
\setinterfacecommand{placerule}{placerule}
@@ -1602,7 +1609,6 @@
\setinterfacecommand{setupregister}{setupregister}
\setinterfacecommand{setuprotate}{setuprotate}
\setinterfacecommand{setuprule}{setuprule}
-\setinterfacecommand{setups}{setups}
\setinterfacecommand{setupscreens}{setupscreens}
\setinterfacecommand{setupsection}{setupsection}
\setinterfacecommand{setupsectionblock}{setupsectionblock}
@@ -1620,6 +1626,7 @@
\setinterfacecommand{setuptables}{setuptables}
\setinterfacecommand{setuptabulate}{setuptabulate}
\setinterfacecommand{setuptext}{setuptext}
+\setinterfacecommand{setuptextbackground}{setuptextbackground}
\setinterfacecommand{setuptextposition}{setuptextposition}
\setinterfacecommand{setuptextrules}{setuptextrules}
\setinterfacecommand{setuptexttexts}{setuptexttexts}
@@ -1666,6 +1673,7 @@
\setinterfacecommand{startdocument}{startdocument}
\setinterfacecommand{startenvironment}{startenvironment}
\setinterfacecommand{startfigure}{startfigure}
+\setinterfacecommand{startframed}{startframed}
\setinterfacecommand{startglobal}{startglobal}
\setinterfacecommand{startline}{startline}
\setinterfacecommand{startlinecorrection}{startlinecorrection}
@@ -1692,6 +1700,7 @@
\setinterfacecommand{starttable}{starttable}
\setinterfacecommand{starttables}{starttables}
\setinterfacecommand{starttext}{starttext}
+\setinterfacecommand{starttextbackground}{starttextbackground}
\setinterfacecommand{starttextrule}{starttextrule}
\setinterfacecommand{startunpacked}{startunpacked}
\setinterfacecommand{startversion}{startversion}
@@ -1706,6 +1715,7 @@
\setinterfacecommand{stopcomponent}{stopcomponent}
\setinterfacecommand{stopdocument}{stopdocument}
\setinterfacecommand{stopenvironment}{stopenvironment}
+\setinterfacecommand{stopframed}{stopframed}
\setinterfacecommand{stopglobal}{stopglobal}
\setinterfacecommand{stopline}{stopline}
\setinterfacecommand{stoplinecorrection}{stoplinecorrection}
@@ -1731,6 +1741,7 @@
\setinterfacecommand{stoptable}{stoptable}
\setinterfacecommand{stoptables}{stoptables}
\setinterfacecommand{stoptext}{stoptext}
+\setinterfacecommand{stoptextbackground}{stoptextbackground}
\setinterfacecommand{stoptextrule}{stoptextrule}
\setinterfacecommand{stopunpacked}{stopunpacked}
\setinterfacecommand{stopversion}{stopversion}
diff --git a/Master/texmf-dist/tex/context/base/mult-fr.mkii b/Master/texmf-dist/tex/context/base/mult-fr.mkii
index e1129848fec..d76da18d9e0 100644
--- a/Master/texmf-dist/tex/context/base/mult-fr.mkii
+++ b/Master/texmf-dist/tex/context/base/mult-fr.mkii
@@ -180,6 +180,7 @@
\setinterfacevariable{flushleft}{flushleft}
\setinterfacevariable{flushouter}{flushouter}
\setinterfacevariable{flushright}{flushright}
+\setinterfacevariable{followingpage}{followingpage}
\setinterfacevariable{footer}{pdp}
\setinterfacevariable{footnote}{notepdp}
\setinterfacevariable{force}{force}
@@ -301,6 +302,7 @@
\setinterfacevariable{mirrored}{reflete}
\setinterfacevariable{monday}{lundi}
\setinterfacevariable{mono}{mono}
+\setinterfacevariable{monobold}{monogras}
\setinterfacevariable{month}{mois}
\setinterfacevariable{more}{more}
\setinterfacevariable{morehyphenation}{morehyphenation}
@@ -360,6 +362,7 @@
\setinterfacevariable{positive}{positif}
\setinterfacevariable{postponing}{postponing}
\setinterfacevariable{postscript}{postscript}
+\setinterfacevariable{precedingpage}{followingpage}
\setinterfacevariable{preference}{preference}
\setinterfacevariable{preview}{previsualisation}
\setinterfacevariable{previous}{precedent}
@@ -419,7 +422,7 @@
\setinterfacevariable{september}{septembre}
\setinterfacevariable{serif}{serif}
\setinterfacevariable{serried}{serried}
-\setinterfacevariable{setups}{reglages}
+\setinterfacevariable{setups}{setups}
\setinterfacevariable{sheet}{sheet}
\setinterfacevariable{short}{short}
\setinterfacevariable{simplefonts}{simplefonts}
@@ -651,7 +654,7 @@
\setinterfaceconstant{coupling}{couplage}
\setinterfaceconstant{couplingway}{modecouplage}
\setinterfaceconstant{criterium}{critere}
-\setinterfaceconstant{css}{css}
+\setinterfaceconstant{cssfile}{cssfile}
\setinterfaceconstant{current}{courant}
\setinterfaceconstant{cutspace}{cutspace}
\setinterfaceconstant{dash}{pointille}
@@ -686,7 +689,7 @@
\setinterfaceconstant{equalwidth}{equalwidth}
\setinterfaceconstant{escape}{escape}
\setinterfaceconstant{evenmargin}{margepaire}
-\setinterfaceconstant{exitoffset}{labeloffset}
+\setinterfaceconstant{exitoffset}{exitoffset}
\setinterfaceconstant{expansion}{expansion}
\setinterfaceconstant{export}{export}
\setinterfaceconstant{extras}{extras}
@@ -753,6 +756,7 @@
\setinterfaceconstant{indenting}{composeenalinea}
\setinterfaceconstant{indentnext}{indentesuivant}
\setinterfaceconstant{indicator}{indicateur}
+\setinterfaceconstant{initialsep}{initialsep}
\setinterfaceconstant{inner}{interieur}
\setinterfaceconstant{innermargin}{margeinterieure}
\setinterfaceconstant{inputfile}{fichierentree}
@@ -858,6 +862,7 @@
\setinterfaceconstant{nright}{ndroite}
\setinterfaceconstant{ntop}{nsup}
\setinterfaceconstant{number}{numero}
+\setinterfaceconstant{numberalign}{numberalign}
\setinterfaceconstant{numbercolor}{couleurnumero}
\setinterfaceconstant{numbercommand}{commandenumero}
\setinterfaceconstant{numberconversion}{numberconversion}
@@ -1002,7 +1007,7 @@
\setinterfaceconstant{separatorcolor}{separatorcolor}
\setinterfaceconstant{separatorstyle}{separatorstyle}
\setinterfaceconstant{set}{set}
-\setinterfaceconstant{setups}{reglages}
+\setinterfaceconstant{setups}{setups}
\setinterfaceconstant{shrink}{shrink}
\setinterfaceconstant{side}{cote}
\setinterfaceconstant{sidealign}{sidealign}
@@ -1281,6 +1286,7 @@
\setinterfacecommand{definetabletemplate}{definittrametableau}
\setinterfacecommand{definetabulate}{definittabulation}
\setinterfacecommand{definetext}{definittexte}
+\setinterfacecommand{definetextbackground}{definetextbackground}
\setinterfacecommand{definetextposition}{definitpositiontexte}
\setinterfacecommand{definetextvariable}{definitvariabletexte}
\setinterfacecommand{definetype}{definittype}
@@ -1441,7 +1447,6 @@
\setinterfacecommand{paperheight}{hauteurpapier}
\setinterfacecommand{paperwidth}{largeurpapier}
\setinterfacecommand{periods}{periodes}
-\setinterfacecommand{plaatsruwelijst}{placerawlist}
\setinterfacecommand{placebookmarks}{placemarquespages}
\setinterfacecommand{placecombinedlist}{placelisteinmbriquee}
\setinterfacecommand{placefloat}{placeflottant}
@@ -1451,11 +1456,13 @@
\setinterfacecommand{placeheadtext}{placetextetete}
\setinterfacecommand{placelegend}{placelegende}
\setinterfacecommand{placelist}{placeliste}
+\setinterfacecommand{placelistofsynonyms}{placelistofsynonyms}
\setinterfacecommand{placelocalfootnotes}{placenotespdplocales}
\setinterfacecommand{placelogos}{placelogos}
\setinterfacecommand{placeongrid}{placesurgrille}
\setinterfacecommand{placeontopofeachother}{placelesunsaudessusdesautres}
\setinterfacecommand{placepagenumber}{placenumeropage}
+\setinterfacecommand{placerawlist}{placerawlist}
\setinterfacecommand{placereferencelist}{placelistereference}
\setinterfacecommand{placeregister}{placeregistre}
\setinterfacecommand{placerule}{placeregle}
@@ -1602,7 +1609,6 @@
\setinterfacecommand{setupregister}{regleregistre}
\setinterfacecommand{setuprotate}{regleoriente}
\setinterfacecommand{setuprule}{regleregle}
-\setinterfacecommand{setups}{reglages}
\setinterfacecommand{setupscreens}{regleecrans}
\setinterfacecommand{setupsection}{reglesection}
\setinterfacecommand{setupsectionblock}{regleblocsection}
@@ -1620,6 +1626,7 @@
\setinterfacecommand{setuptables}{regletableaux}
\setinterfacecommand{setuptabulate}{regletabulation}
\setinterfacecommand{setuptext}{regletexte}
+\setinterfacecommand{setuptextbackground}{setuptextbackground}
\setinterfacecommand{setuptextposition}{reglepositiontexte}
\setinterfacecommand{setuptextrules}{reglelignesreglestexte}
\setinterfacecommand{setuptexttexts}{regletextestexte}
@@ -1666,6 +1673,7 @@
\setinterfacecommand{startdocument}{demarredocument}
\setinterfacecommand{startenvironment}{demarreenvironement}
\setinterfacecommand{startfigure}{demarrefigure}
+\setinterfacecommand{startframed}{startframed}
\setinterfacecommand{startglobal}{demarreglobal}
\setinterfacecommand{startline}{demarreligne}
\setinterfacecommand{startlinecorrection}{demarrecorrectionligne}
@@ -1692,6 +1700,7 @@
\setinterfacecommand{starttable}{demarretableau}
\setinterfacecommand{starttables}{demarretableaux}
\setinterfacecommand{starttext}{demarretexte}
+\setinterfacecommand{starttextbackground}{starttextbackground}
\setinterfacecommand{starttextrule}{demarreligneregleetexte}
\setinterfacecommand{startunpacked}{demarredegroupe}
\setinterfacecommand{startversion}{demarreversion}
@@ -1706,6 +1715,7 @@
\setinterfacecommand{stopcomponent}{stoppecomposant}
\setinterfacecommand{stopdocument}{stoppedocument}
\setinterfacecommand{stopenvironment}{stoppeenvironement}
+\setinterfacecommand{stopframed}{stopframed}
\setinterfacecommand{stopglobal}{stoppeglobal}
\setinterfacecommand{stopline}{stoppeligne}
\setinterfacecommand{stoplinecorrection}{stoppecorrectionligne}
@@ -1731,6 +1741,7 @@
\setinterfacecommand{stoptable}{stoppetableau}
\setinterfacecommand{stoptables}{stoppetableaux}
\setinterfacecommand{stoptext}{stoppetexte}
+\setinterfacecommand{stoptextbackground}{stoptextbackground}
\setinterfacecommand{stoptextrule}{stoppeligneregleetexte}
\setinterfacecommand{stopunpacked}{stoppedegroupe}
\setinterfacecommand{stopversion}{stoppeversion}
diff --git a/Master/texmf-dist/tex/context/base/mult-fun.lua b/Master/texmf-dist/tex/context/base/mult-fun.lua
index 846a50ddf3d..27aa3205510 100644
--- a/Master/texmf-dist/tex/context/base/mult-fun.lua
+++ b/Master/texmf-dist/tex/context/base/mult-fun.lua
@@ -4,20 +4,23 @@ return {
"nocolormodel", "greycolormodel", "graycolormodel", "rgbcolormodel", "cmykcolormodel",
"shadefactor",
"textextoffset",
- "normaltransparent", "multiplytransparent", "screentransparent", "overlaytransparent", "softlighttransparent",
- "hardlighttransparent", "colordodgetransparent", "colorburntransparent", "darkentransparent", "lightentransparent",
- "differencetransparent", "exclusiontransparent", "huetransparent", "saturationtransparent", "colortransparent", "luminositytransparent",
--- "originlength", "tickstep ", "ticklength",
--- "autoarrows", "ahfactor",
--- "angleoffset", anglelength", anglemethod",
+ "normaltransparent", "multiplytransparent", "screentransparent", "overlaytransparent",
+ "softlighttransparent", "hardlighttransparent", "colordodgetransparent", "colorburntransparent",
+ "darkentransparent", "lightentransparent", "differencetransparent", "exclusiontransparent",
+ "huetransparent", "saturationtransparent", "colortransparent", "luminositytransparent",
+ -- "originlength", "tickstep ", "ticklength",
+ -- "autoarrows", "ahfactor",
+ -- "angleoffset", anglelength", anglemethod",
"metapostversion",
"maxdimensions",
},
commands = {
+ "transparency",
--
"sqr", "log", "ln", "exp", "inv", "pow", "pi", "radian",
"tand", "cotd", "sin", "cos", "tan", "cot", "atan", "asin", "acos",
"invsin", "invcos", "invtan", "acosh", "asinh", "sinh", "cosh",
+ "zmod",
"paired", "tripled",
"unitcircle", "fulldiamond", "unitdiamond", "fullsquare",
-- "halfcircle", "quartercircle",
@@ -37,24 +40,32 @@ return {
"xsized", "ysized", "xysized", "sized", "xyscaled",
"intersection_point", "intersection_found", "penpoint",
"bbwidth", "bbheight",
- "withshade", "withlinearshading", "withcircularshading", "withfromshadecolor", "withtoshadecolor", "withshading", "shadedinto",
- "withcircularshade", "withlinearshade",
+ "withshade", "withcircularshade", "withlinearshade", -- old but kept
+ "defineshade", "shaded",
+ -- "withshading", "withlinearshading", "withcircularshading", "withfromshadecolor", "withtoshadecolor",
+ "shadedinto", "withshadecolors", "withshadedomain", "withshademethod", "withshadefactor", "withshadevector", "withshadecenter",
"cmyk", "spotcolor", "multitonecolor", "namedcolor",
"drawfill", "undrawfill",
"inverted", "uncolored", "softened", "grayed", "greyed",
"onlayer",
"along",
- "graphictext", "loadfigure", "externalfigure", "withmask", "figure", "register", "bitmapimage",
+ "graphictext", "loadfigure", "externalfigure", "figure", "register",
+ "withmask", "bitmapimage",
"colordecimals", "ddecimal", "dddecimal", "ddddecimal",
- "textext", "thetextext", "rawtextext", "textextoffset", "verbatim", "thelabel", "label", "autoalign",
+ "textext", "thetextext", "rawtextext", "textextoffset",
+ "verbatim",
+ "thelabel", "label",
+ "autoalign",
"transparent", "withtransparency",
"property", "properties", "withproperties",
"asgroup",
- "infont", -- redefined usign textext
- -- "property", "withproperties", "properties", -- not yet
- "set_linear_vector", "linear_shade", "define_linear_shade", "define_circular_linear_shade", "define_sampled_linear_shade",
- "set_circular_vector", "circular_shade", "define_circular_shade", "define_circular_linear_shade", "define_sampled_circular_shade",
- "space", "CRLF",
+ "infont", -- redefined using textext
+ -- "set_linear_vector", "set_circular_vector",
+ -- "linear_shade", "circular_shade",
+ -- "define_linear_shade", "define_circular_shade",
+ -- "define_circular_linear_shade", "define_circular_linear_shade",
+ -- "define_sampled_linear_shade", "define_sampled_circular_shade",
+ "space", "crlf", "dquote", "percent", "SPACE", "CRLF", "DQUOTE", "PERCENT",
"grayscale", "greyscale", "withgray", "withgrey",
"colorpart",
"readfile",
@@ -64,10 +75,12 @@ return {
"break",
"xstretched", "ystretched", "snapped",
--
- "pathconnectors", "function", "constructedpath", "constructedpairs",
- "punkedfunction", "curvedfunction", "tightfunction",
- "punkedpath", "curvedpath", "tightpath",
- "punkedpairs", "curvedpairs", "tightpairs",
+ "pathconnectors", "function",
+ "constructedfunction", "constructedpath", "constructedpairs",
+ -- "punkedfunction", "punkedpath", "punkedpairs",
+ "straightfunction", "straightpath", "straightpairs",
+ "curvedfunction", "curvedpath", "curvedpairs",
+ -- "tightfunction", "tightpath", "tightpairs",
--
"evenly", "oddly",
--
@@ -76,26 +89,31 @@ return {
"pushcurrentpicture", "popcurrentpicture",
--
"arrowpath",
--- "colorlike", "dowithpath", "rangepath", "straightpath", "addbackground",
--- "cleanstring", "asciistring", "setunstringed", "getunstringed", "unstringed",
--- "showgrid",
--- "phantom",
--- "xshifted", "yshifted",
--- "drawarrowpath", "midarrowhead", "arrowheadonpath",
--- "drawxticks", "drawyticks", "drawticks",
--- "pointarrow",
--- "thefreelabel", "freelabel", "freedotlabel",
--- "anglebetween", "colorcircle",
--- "remapcolors", "normalcolors", "resetcolormap", "remapcolor", "remappedcolor",
--- "recolor", "refill", "redraw", "retext", "untext", "restroke", "reprocess", "repathed",
+ -- "colorlike", "dowithpath", "rangepath", "straightpath", "addbackground",
+ -- "cleanstring", "asciistring", "setunstringed", "getunstringed", "unstringed",
+ -- "showgrid",
+ -- "phantom",
+ -- "xshifted", "yshifted",
+ -- "drawarrowpath", "midarrowhead", "arrowheadonpath",
+ -- "drawxticks", "drawyticks", "drawticks",
+ -- "pointarrow",
+ -- "thefreelabel", "freelabel", "freedotlabel",
+ -- "anglebetween", "colorcircle",
+ -- "remapcolors", "normalcolors", "resetcolormap", "remapcolor", "remappedcolor",
+ -- "recolor", "refill", "redraw", "retext", "untext", "restroke", "reprocess", "repathed",
"tensecircle", "roundedsquare",
- "colortype", "whitecolor", "blackcolor",
+ "colortype", "whitecolor", "blackcolor", "basiccolors",
--
--- "swappointlabels",
+ -- "swappointlabels",
"normalfill", "normaldraw", "visualizepaths", "naturalizepaths",
- "drawboundary", "drawwholepath", "visualizeddraw", "visualizedfill", "draworigin", "drawboundingbox",
- "drawpath", "drawpoint", "drawpoints", "drawcontrolpoints", "drawcontrollines", "drawpointlabels",
- "drawlineoptions", "drawpointoptions", "drawcontroloptions", "drawlabeloptions", "draworiginoptions", "drawboundoptions", "drawpathoptions", "resetdrawoptions",
+ "drawboundary", "drawwholepath",
+ "visualizeddraw", "visualizedfill",
+ "draworigin", "drawboundingbox",
+ "drawpath",
+ "drawpoint", "drawpoints", "drawcontrolpoints", "drawcontrollines",
+ "drawpointlabels",
+ "drawlineoptions", "drawpointoptions", "drawcontroloptions", "drawlabeloptions",
+ "draworiginoptions", "drawboundoptions", "drawpathoptions", "resetdrawoptions",
--
"undashed",
--
@@ -103,5 +121,8 @@ return {
--
"passvariable", "passarrayvariable", "tostring", "format", "formatted",
"startpassingvariable", "stoppassingvariable",
+ --
+ "eofill", "eoclip",
+ "area",
},
}
diff --git a/Master/texmf-dist/tex/context/base/mult-ini.lua b/Master/texmf-dist/tex/context/base/mult-ini.lua
index 62e983abca7..bd3b1d38b37 100644
--- a/Master/texmf-dist/tex/context/base/mult-ini.lua
+++ b/Master/texmf-dist/tex/context/base/mult-ini.lua
@@ -12,6 +12,7 @@ local serialize = table.serialize
local context = context
local commands = commands
+local implement = interfaces.implement
local allocate = utilities.storage.allocate
local mark = utilities.storage.mark
@@ -240,9 +241,17 @@ function interfaces.setuserinterface(interface,response)
end
report_interface("definitions: %a constants, %a variables, %a elements, %a commands, %a formats, %a translations",
nofconstants,nofvariables,nofelements,nofcommands,nofformats,noftranslations)
+ else
+ report_interface("the language(s) can only be set when making the format")
end
end
+interfaces.implement {
+ name = "setuserinterface",
+ actions = interfaces.setuserinterface,
+ arguments = { "string", "string" }
+}
+
interfaces.cachedsetups = interfaces.cachedsetups or { }
interfaces.hashedsetups = interfaces.hashedsetups or { }
@@ -282,34 +291,43 @@ end
-- interface
-function commands.writestatus(category,message,...)
- local r = reporters[category]
- if r then
- r(message,...)
- end
+function interfaces.writestatus(category,message)
+ reporters[category](message) -- could also be a setmetatablecall
end
-commands.registernamespace = interfaces.registernamespace
-commands.setinterfaceconstant = interfaces.setconstant
-commands.setinterfacevariable = interfaces.setvariable
-commands.setinterfaceelement = interfaces.setelement
-commands.setinterfacemessage = interfaces.setmessage
-commands.setinterfacemessages = interfaces.setmessages
-commands.showmessage = interfaces.showmessage
+implement { name = "registernamespace", actions = interfaces.registernamespace, arguments = { "integer", "string" } }
+implement { name = "setinterfaceconstant", actions = interfaces.setconstant, arguments = { "string", "string" } }
+implement { name = "setinterfacevariable", actions = interfaces.setvariable, arguments = { "string", "string" } }
+implement { name = "setinterfaceelement", actions = interfaces.setelement, arguments = { "string", "string" } }
+implement { name = "setinterfacemessage", actions = interfaces.setmessage, arguments = { "string", "string", "string" } }
+implement { name = "setinterfacemessages", actions = interfaces.setmessages, arguments = { "string", "string" } }
+implement { name = "showmessage", actions = interfaces.showmessage, arguments = { "string", "string", "string" } }
+
+implement {
+ name = "doifelsemessage",
+ actions = { interfaces.doifelsemessage, commands.doifelse },
+ arguments = { "string", "string" },
+}
-function commands.doifelsemessage(category,tag)
- commands.doifelse(interfaces.doifelsemessage(category,tag))
-end
+implement {
+ name = "getmessage",
+ actions = { interfaces.getmessage, context },
+ arguments = { "string", "string", "string" },
+}
-function commands.getmessage(category,tag,default)
- context(interfaces.getmessage(category,tag,default))
-end
+implement {
+ name = "writestatus",
+ overload = true,
+ actions = interfaces.writestatus,
+ arguments = { "string", "string" },
+}
-function commands.showassignerror(namespace,key,line)
+local function showassignerror(namespace,key,line)
local ns, instance = match(namespace,"^(%d+)[^%a]+(%a*)")
if ns then
namespace = corenamespaces[tonumber(ns)] or ns
end
+ -- injected in the stream for timing:
if instance and instance ~= "" then
context.writestatus("setup",formatters["error in line %a, namespace %a, instance %a, key %a"](line,namespace,instance,key))
else
@@ -317,6 +335,12 @@ function commands.showassignerror(namespace,key,line)
end
end
+implement {
+ name = "showassignerror",
+ actions = showassignerror,
+ arguments = { "string", "string", "integer" },
+}
+
-- a simple helper
local settings_to_hash = utilities.parsers.settings_to_hash
diff --git a/Master/texmf-dist/tex/context/base/mult-ini.mkiv b/Master/texmf-dist/tex/context/base/mult-ini.mkiv
index 09fc5daf0ae..1dd5a696a94 100644
--- a/Master/texmf-dist/tex/context/base/mult-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/mult-ini.mkiv
@@ -365,10 +365,10 @@
{\bgroup
\ifcsname\m!prefix!#2\endcsname\else\setgvalue{\m!prefix!#2}{#2}\fi
\catcode\endoflineasciicode\activecatcode
- \doifinsetelse{#1}{\currentresponses,all}\mult_messages_start_yes\mult_messages_start_nop{#2}}
+ \doifelseinset{#1}{\currentresponses,all}\mult_messages_start_yes\mult_messages_start_nop{#2}}
\def\mult_messages_start_yes#1#2\stopmessages
- {\ctxcommand{setinterfacemessages("#1",\!!bs#2\!!es)}%
+ {\clf_setinterfacemessages{#1}{#2}%
\egroup}
\def\mult_messages_start_nop#1#2\stopmessages
@@ -378,13 +378,15 @@
\unexpanded\def\setinterfacemessage#1#2#3%
{\ifcsname\m!prefix!#1\endcsname\else\setgvalue{\m!prefix!#1}{#1}\fi
- \ctxcommand{setinterfacemessage("#1","#2",\!!bs#3\!!es)}}
+ \clf_setinterfacemessage{#1}{#2}{#3}}
-\unexpanded\def\setmessagetext #1#2{\edef\currentmessagetext{\ctxcommand{getmessage("#1","#2")}}}
-\unexpanded\def\getmessage #1#2{\ctxcommand{getmessage("#1","#2")}}
-\unexpanded\def\doifelsemessage #1#2{\ctxcommand{doifelsemessage("#1","#2")}}
-\unexpanded\def\showmessage #1#2#3{\ctxcommand{showmessage("#1","#2",\!!bs#3\!!es)}}
-\unexpanded\def\writestatus #1#2{\ctxcommand{writestatus("#1",\!!bs#2\!!es)}}
+\unexpanded\def\setmessagetext #1#2{\edef\currentmessagetext{\clf_getmessage{#1}{#2}}}
+\unexpanded\def\getmessage #1#2{\clf_getmessage{#1}{#2}}
+\unexpanded\def\doifelsemessage #1#2{\clf_doifelsemessage{#1}{#2}}
+\unexpanded\def\showmessage #1#2#3{\clf_showmessage{#1}{#2}{#3}}
+\unexpanded\def\writestatus #1#2{\clf_writestatus{#1}{#2}}
+
+\let\doifmessageelse\doifelsemessage
%D \macros
%D {ifshowwarnings, ifshowmessages}
@@ -730,11 +732,11 @@
% temporary mkiv hack (we can best just store the whole table in memory)
\unexpanded\def\setinterfaceconstant#1#2%
- {\ctxcommand{setinterfaceconstant("#1","#2")}%
+ {\clf_setinterfaceconstant{#1}{#2}%
\expandafter\def\csname\c!prefix!#1\endcsname{#1}}
\unexpanded\def\setinterfacevariable#1#2%
- {\ctxcommand{setinterfacevariable("#1","#2")}%
+ {\clf_setinterfacevariable{#1}{#2}%
\expandafter\def\csname\v!prefix!#1\endcsname{#2}}
%D \macros
@@ -763,7 +765,7 @@
%D part is needed, we use a \type{-}:
\unexpanded\def\setinterfaceelement#1#2%
- {\ctxcommand{setinterfaceelement("#1","#2")}%
+ {\clf_setinterfaceelement{#1}{#2}%
\ifcsname\e!prefix!#1\endcsname
\doifnotvalue{\e!prefix!#1}{#2}{\setvalue{\e!prefix!#1}{#2}}%
\else
diff --git a/Master/texmf-dist/tex/context/base/mult-it.mkii b/Master/texmf-dist/tex/context/base/mult-it.mkii
index 5646a212e21..6474d93c4c3 100644
--- a/Master/texmf-dist/tex/context/base/mult-it.mkii
+++ b/Master/texmf-dist/tex/context/base/mult-it.mkii
@@ -180,6 +180,7 @@
\setinterfacevariable{flushleft}{flushleft}
\setinterfacevariable{flushouter}{flushouter}
\setinterfacevariable{flushright}{flushright}
+\setinterfacevariable{followingpage}{followingpage}
\setinterfacevariable{footer}{piedipagina}
\setinterfacevariable{footnote}{notapdp}
\setinterfacevariable{force}{forza}
@@ -301,6 +302,7 @@
\setinterfacevariable{mirrored}{riflesso}
\setinterfacevariable{monday}{lunedi}
\setinterfacevariable{mono}{mono}
+\setinterfacevariable{monobold}{monograssetto}
\setinterfacevariable{month}{mese}
\setinterfacevariable{more}{more}
\setinterfacevariable{morehyphenation}{morehyphenation}
@@ -360,6 +362,7 @@
\setinterfacevariable{positive}{positivo}
\setinterfacevariable{postponing}{posporre}
\setinterfacevariable{postscript}{postscript}
+\setinterfacevariable{precedingpage}{followingpage}
\setinterfacevariable{preference}{preferenza}
\setinterfacevariable{preview}{anteprima}
\setinterfacevariable{previous}{precedente}
@@ -419,7 +422,7 @@
\setinterfacevariable{september}{settembre}
\setinterfacevariable{serif}{serif}
\setinterfacevariable{serried}{vicino}
-\setinterfacevariable{setups}{nastaveni}
+\setinterfacevariable{setups}{setups}
\setinterfacevariable{sheet}{sheet}
\setinterfacevariable{short}{short}
\setinterfacevariable{simplefonts}{simplefonts}
@@ -651,7 +654,7 @@
\setinterfaceconstant{coupling}{accoppiamento}
\setinterfaceconstant{couplingway}{modoaccoppiamento}
\setinterfaceconstant{criterium}{criterio}
-\setinterfaceconstant{css}{css}
+\setinterfaceconstant{cssfile}{cssfile}
\setinterfaceconstant{current}{corrente}
\setinterfaceconstant{cutspace}{cutspace}
\setinterfaceconstant{dash}{dash}
@@ -686,7 +689,7 @@
\setinterfaceconstant{equalwidth}{equalwidth}
\setinterfaceconstant{escape}{escape}
\setinterfaceconstant{evenmargin}{marginepari}
-\setinterfaceconstant{exitoffset}{labeloffset}
+\setinterfaceconstant{exitoffset}{exitoffset}
\setinterfaceconstant{expansion}{espansione}
\setinterfaceconstant{export}{export}
\setinterfaceconstant{extras}{extras}
@@ -753,6 +756,7 @@
\setinterfaceconstant{indenting}{rientro}
\setinterfaceconstant{indentnext}{rientrasuccessivo}
\setinterfaceconstant{indicator}{indicatore}
+\setinterfaceconstant{initialsep}{initialsep}
\setinterfaceconstant{inner}{interno}
\setinterfaceconstant{innermargin}{margineinterno}
\setinterfaceconstant{inputfile}{inputfile}
@@ -834,7 +838,7 @@
\setinterfaceconstant{middletext}{testocentro}
\setinterfaceconstant{midsentence}{midsentence}
\setinterfaceconstant{min}{min}
-\setinterfaceconstant{mindepth}{mindeoth}
+\setinterfaceconstant{mindepth}{mindepth}
\setinterfaceconstant{minheight}{altezzamin}
\setinterfaceconstant{minwidth}{ampiezzamin}
\setinterfaceconstant{moffset}{moffset}
@@ -858,6 +862,7 @@
\setinterfaceconstant{nright}{ndestra}
\setinterfaceconstant{ntop}{ncima}
\setinterfaceconstant{number}{numero}
+\setinterfaceconstant{numberalign}{numberalign}
\setinterfaceconstant{numbercolor}{colorenumero}
\setinterfaceconstant{numbercommand}{comandonumero}
\setinterfaceconstant{numberconversion}{numberconversion}
@@ -1281,6 +1286,7 @@
\setinterfacecommand{definetabletemplate}{definiscimodellotabella}
\setinterfacecommand{definetabulate}{definiscitabulato}
\setinterfacecommand{definetext}{definiscitesto}
+\setinterfacecommand{definetextbackground}{definetextbackground}
\setinterfacecommand{definetextposition}{definisciposizionetesto}
\setinterfacecommand{definetextvariable}{definiscivariabiletesto}
\setinterfacecommand{definetype}{definiscitype}
@@ -1441,7 +1447,6 @@
\setinterfacecommand{paperheight}{altezzacarta}
\setinterfacecommand{paperwidth}{ampiezzacarta}
\setinterfacecommand{periods}{punti}
-\setinterfacecommand{plaatsruwelijst}{placerawlist}
\setinterfacecommand{placebookmarks}{mettisegnalibro}
\setinterfacecommand{placecombinedlist}{mettielencocombinato}
\setinterfacecommand{placefloat}{placefloat}
@@ -1451,11 +1456,13 @@
\setinterfacecommand{placeheadtext}{posizionatestotesta}
\setinterfacecommand{placelegend}{mettilegenda}
\setinterfacecommand{placelist}{mettielenco}
+\setinterfacecommand{placelistofsynonyms}{placelistofsynonyms}
\setinterfacecommand{placelocalfootnotes}{mettinotepdplocali}
\setinterfacecommand{placelogos}{mettiloghi}
\setinterfacecommand{placeongrid}{mettiingriglia}
\setinterfacecommand{placeontopofeachother}{mettiunosullaltro}
\setinterfacecommand{placepagenumber}{mettinumeropagina}
+\setinterfacecommand{placerawlist}{placerawlist}
\setinterfacecommand{placereferencelist}{placereferencelist}
\setinterfacecommand{placeregister}{mettiregistro}
\setinterfacecommand{placerule}{mettilinea}
@@ -1602,7 +1609,6 @@
\setinterfacecommand{setupregister}{impostaregistro}
\setinterfacecommand{setuprotate}{impostarotazione}
\setinterfacecommand{setuprule}{impostalinea}
-\setinterfacecommand{setups}{impostazioni}
\setinterfacecommand{setupscreens}{impostaschermi}
\setinterfacecommand{setupsection}{impostasezione}
\setinterfacecommand{setupsectionblock}{impostabloccosezione}
@@ -1620,6 +1626,7 @@
\setinterfacecommand{setuptables}{impostatabelle}
\setinterfacecommand{setuptabulate}{impostatabulato}
\setinterfacecommand{setuptext}{impostatesto}
+\setinterfacecommand{setuptextbackground}{setuptextbackground}
\setinterfacecommand{setuptextposition}{impostaposizionetesto}
\setinterfacecommand{setuptextrules}{impostalineetesto}
\setinterfacecommand{setuptexttexts}{impostatestotesti}
@@ -1666,6 +1673,7 @@
\setinterfacecommand{startdocument}{iniziadocumento}
\setinterfacecommand{startenvironment}{iniziaambiente}
\setinterfacecommand{startfigure}{iniziafigura}
+\setinterfacecommand{startframed}{startframed}
\setinterfacecommand{startglobal}{iniziaglobale}
\setinterfacecommand{startline}{iniziariga}
\setinterfacecommand{startlinecorrection}{iniziacorrezioneriga}
@@ -1692,6 +1700,7 @@
\setinterfacecommand{starttable}{iniziatabella}
\setinterfacecommand{starttables}{iniziatabelle}
\setinterfacecommand{starttext}{iniziatesto}
+\setinterfacecommand{starttextbackground}{starttextbackground}
\setinterfacecommand{starttextrule}{inizialineatesto}
\setinterfacecommand{startunpacked}{iniziaunpacked}
\setinterfacecommand{startversion}{iniziaversione}
@@ -1706,6 +1715,7 @@
\setinterfacecommand{stopcomponent}{terminacomponente}
\setinterfacecommand{stopdocument}{terminadocumento}
\setinterfacecommand{stopenvironment}{terminaambiente}
+\setinterfacecommand{stopframed}{stopframed}
\setinterfacecommand{stopglobal}{terminaglobale}
\setinterfacecommand{stopline}{terminariga}
\setinterfacecommand{stoplinecorrection}{terminacorrezioneriga}
@@ -1731,6 +1741,7 @@
\setinterfacecommand{stoptable}{terminatabella}
\setinterfacecommand{stoptables}{terminatabelle}
\setinterfacecommand{stoptext}{terminatesto}
+\setinterfacecommand{stoptextbackground}{stoptextbackground}
\setinterfacecommand{stoptextrule}{terminalineatesto}
\setinterfacecommand{stopunpacked}{terminaunpacked}
\setinterfacecommand{stopversion}{terminaversioni}
diff --git a/Master/texmf-dist/tex/context/base/mult-low.lua b/Master/texmf-dist/tex/context/base/mult-low.lua
index dda4e5aadb4..1ad0f9ebbda 100644
--- a/Master/texmf-dist/tex/context/base/mult-low.lua
+++ b/Master/texmf-dist/tex/context/base/mult-low.lua
@@ -13,7 +13,7 @@ return {
--
"zerocount", "minusone", "minustwo", "plusone", "plustwo", "plusthree", "plusfour", "plusfive",
"plussix", "plusseven", "pluseight", "plusnine", "plusten", "plussixteen", "plushundred",
- "plusthousand", "plustenthousand", "plustwentythousand", "medcard", "maxcard",
+ "plusthousand", "plustenthousand", "plustwentythousand", "medcard", "maxcard", "maxcardminusone",
"zeropoint", "onepoint", "halfapoint", "onebasepoint", "maxdimen", "scaledpoint", "thousandpoint",
"points", "halfpoint",
"zeroskip",
@@ -31,7 +31,9 @@ return {
--
"fmtname", "fmtversion", "texengine", "texenginename", "texengineversion",
"luatexengine", "pdftexengine", "xetexengine", "unknownengine",
- "etexversion", "pdftexversion", "xetexversion", "xetexrevision",
+ -- "etexversion",
+ -- "pdftexversion", "pdftexrevision",
+ -- "xetexversion", "xetexrevision",
--
"activecatcode",
--
@@ -60,7 +62,7 @@ return {
"lessthanasciicode", "morethanasciicode", "doublecommentsignal",
"atsignasciicode", "exclamationmarkasciicode", "questionmarkasciicode",
"doublequoteasciicode", "singlequoteasciicode", "forwardslashasciicode",
- "primeasciicode",
+ "primeasciicode", "hyphenasciicode",
--
"activemathcharcode",
--
@@ -85,13 +87,15 @@ return {
"fontexheight", "fontemwidth", "fontextraspace", "slantperpoint",
"interwordspace", "interwordstretch", "interwordshrink", "exheight", "emwidth", "extraspace",
"mathsupdisplay", "mathsupnormal", "mathsupcramped", "mathsubnormal", "mathsubcombined", "mathaxisheight",
+ "muquad",
--
-- maybe a different class
--
"startmode", "stopmode", "startnotmode", "stopnotmode", "startmodeset", "stopmodeset",
- "doifmode", "doifmodeelse", "doifnotmode",
+ "doifmode", "doifelsemode", "doifmodeelse", "doifnotmode",
"startmodeset","stopmodeset",
- "startallmodes", "stopallmodes", "startnotallmodes", "stopnotallmodes", "doifallmodes", "doifallmodeselse", "doifnotallmodes",
+ "startallmodes", "stopallmodes", "startnotallmodes", "stopnotallmodes",
+ "doifallmodes", "doifelseallmodes", "doifallmodeselse", "doifnotallmodes",
"startenvironment", "stopenvironment", "environment",
"startcomponent", "stopcomponent", "component",
"startproduct", "stopproduct", "product",
@@ -103,7 +107,7 @@ return {
"startTEXpage", "stopTEXpage",
-- "startMPpage", "stopMPpage", -- already catched by nested lexer
--
- "enablemode", "disablemode", "preventmode",
+ "enablemode", "disablemode", "preventmode", "definemode",
"globalenablemode", "globaldisablemode", "globalpreventmode",
"pushmode", "popmode",
--
@@ -121,12 +125,12 @@ return {
--
"lefttorightmark", "righttoleftmark",
--
- "breakablethinspace", "nobreakspace", "narrownobreakspace", "zerowidthnobreakspace",
+ "breakablethinspace", "nobreakspace", "nonbreakablespace", "narrownobreakspace", "zerowidthnobreakspace",
"ideographicspace", "ideographichalffillspace",
"twoperemspace", "threeperemspace", "fourperemspace", "fiveperemspace", "sixperemspace",
"figurespace", "punctuationspace", "hairspace",
"zerowidthspace", "zerowidthnonjoiner", "zerowidthjoiner", "zwnj", "zwj",
- "optionalspace",
+ "optionalspace", "asciispacechar",
},
["helpers"] = {
--
@@ -140,9 +144,10 @@ return {
"starttexcode", "stoptexcode",
"startcontextcode", "stopcontextcode",
"startcontextdefinitioncode", "stopcontextdefinitioncode",
+ "texdefinition",
--
- "doifsetupselse", "doifsetups", "doifnotsetups", "setup", "setups", "texsetup", "xmlsetup", "luasetup", "directsetup",
- "doifelsecommandhandler","doifnotcommandhandler","doifcommandhandler",
+ "doifelsesetups", "doifsetupselse", "doifsetups", "doifnotsetups", "setup", "setups", "texsetup", "xmlsetup", "luasetup", "directsetup", "fastsetup",
+ "doifelsecommandhandler", "doifcommandhandlerelse", "doifnotcommandhandler", "doifcommandhandler",
--
"newmode", "setmode", "resetmode",
"newsystemmode", "setsystemmode", "resetsystemmode", "pushsystemmode", "popsystemmode",
@@ -154,7 +159,7 @@ return {
"then",
"begcsname",
--
- "strippedcsname",
+ "strippedcsname","checkedstrippedcsname",
--
"firstargumentfalse", "firstargumenttrue",
"secondargumentfalse", "secondargumenttrue",
@@ -169,6 +174,8 @@ return {
--
"donetrue", "donefalse",
--
+ "inlineordisplaymath","indisplaymath","forcedisplaymath","startforceddisplaymath","stopforceddisplaymath","reqno",
+ --
"htdp",
"unvoidbox",
"hfilll", "vfilll",
@@ -200,7 +207,7 @@ return {
--
"normalbaselineskip", "normallineskip", "normallineskiplimit",
--
- "availablehsize", "localhsize", "setlocalhsize",
+ "availablehsize", "localhsize", "setlocalhsize", "distributedhsize", "hsizefraction",
--
"nextbox", "dowithnextbox", "dowithnextboxcs", "dowithnextboxcontent", "dowithnextboxcontentcs",
--
@@ -222,25 +229,36 @@ return {
"scratchleftskip", "scratchrightskip", "scratchtopskip", "scratchbottomskip",
--
"doif", "doifnot", "doifelse",
- "doifinset", "doifnotinset", "doifinsetelse",
- "doifnextcharelse", "doifnextoptionalelse", "doifnextoptionalcselse", "doiffastoptionalcheckelse",
- "doifnextbgroupelse", "doifnextbgroupcselse",
- "doifnextparenthesiselse",
- "doifundefinedelse", "doifdefinedelse", "doifundefined", "doifdefined",
+ "doifinset", "doifnotinset",
+ "doifelseinset", "doifinsetelse",
+ "doifelsenextchar", "doifnextcharelse",
+ "doifelsenextoptional", "doifnextoptionalelse",
+ "doifelsenextoptionalcs", "doifnextoptionalcselse",
+ "doifelsefastoptionalcheck", "doiffastoptionalcheckelse",
+ "doifelsenextbgroup", "doifnextbgroupelse",
+ "doifelsenextbgroupcs", "doifnextbgroupcselse",
+ "doifelsenextparenthesis", "doifnextparenthesiselse",
+ "doifelseundefined", "doifundefinedelse",
+ "doifelsedefined", "doifdefinedelse",
+ "doifundefined", "doifdefined",
"doifelsevalue", "doifvalue", "doifnotvalue",
- "doifnothing", "doifsomething", "doifelsenothing", "doifsomethingelse",
- "doifvaluenothing", "doifvaluesomething", "doifelsevaluenothing",
- "doifdimensionelse", "doifnumberelse", "doifnumber", "doifnotnumber",
- "doifcommonelse", "doifcommon", "doifnotcommon",
- "doifinstring", "doifnotinstring", "doifinstringelse",
- "doifassignmentelse", "docheckassignment",
+ "doifnothing", "doifsomething",
+ "doifelsenothing", "doifnothingelse",
+ "doifelsesomething", "doifsomethingelse",
+ "doifvaluenothing", "doifvaluesomething",
+ "doifelsevaluenothing", "doifvaluenothingelse",
+ "doifelsedimension", "doifdimensionelse",
+ "doifelsenumber", "doifnumberelse", "doifnumber", "doifnotnumber",
+ "doifelsecommon", "doifcommonelse", "doifcommon", "doifnotcommon",
+ "doifinstring", "doifnotinstring", "doifelseinstring", "doifinstringelse",
+ "doifelseassignment", "doifassignmentelse", "docheckassignment",
--
"tracingall", "tracingnone", "loggingall",
--
"removetoks", "appendtoks", "prependtoks", "appendtotoks", "prependtotoks", "to",
--
- "endgraf", "endpar", "everyendpar", "reseteverypar", "finishpar", "empty", "null", "space", "quad", "enspace",
- "obeyspaces", "obeylines", "obeyedspace", "obeyedline",
+ "endgraf", "endpar", "everyendpar", "reseteverypar", "finishpar", "empty", "null", "space", "quad", "enspace", "nbsp",
+ "obeyspaces", "obeylines", "obeyedspace", "obeyedline", "obeyedtab", "obeyedpage",
"normalspace",
--
"executeifdefined",
@@ -279,6 +297,8 @@ return {
"firstofsixarguments", "secondofsixarguments", "thirdofsixarguments", "fourthofsixarguments", "fifthofsixarguments", "sixthofsixarguments",
--
"firstofoneunexpanded",
+ "firstoftwounexpanded", "secondoftwounexpanded",
+ "firstofthreeunexpanded", "secondofthreeunexpanded", "thirdofthreeunexpanded",
--
"gobbleoneargument", "gobbletwoarguments", "gobblethreearguments", "gobblefourarguments", "gobblefivearguments", "gobblesixarguments", "gobblesevenarguments", "gobbleeightarguments", "gobbleninearguments", "gobbletenarguments",
"gobbleoneoptional", "gobbletwooptionals", "gobblethreeoptionals", "gobblefouroptionals", "gobblefiveoptionals",
@@ -300,7 +320,7 @@ return {
--
"modulonumber", "dividenumber",
--
- "getfirstcharacter", "doiffirstcharelse",
+ "getfirstcharacter", "doifelsefirstchar", "doiffirstcharelse",
--
"startnointerference", "stopnointerference",
--
@@ -310,7 +330,7 @@ return {
--
"offinterlineskip", "oninterlineskip", "nointerlineskip",
--
- "strut", "setstrut", "strutbox", "strutht", "strutdp", "strutwd", "struthtdp", "begstrut", "endstrut", "lineheight",
+ "strut", "halfstrut", "quarterstrut", "depthstrut", "setstrut", "strutbox", "strutht", "strutdp", "strutwd", "struthtdp", "begstrut", "endstrut", "lineheight",
--
"ordordspacing", "ordopspacing", "ordbinspacing", "ordrelspacing",
"ordopenspacing", "ordclosespacing", "ordpunctspacing", "ordinnerspacing",
@@ -344,13 +364,17 @@ return {
"uncramped", "cramped", "triggermathstyle", "mathstylefont", "mathsmallstylefont", "mathstyleface", "mathsmallstyleface", "mathstylecommand", "mathpalette",
"mathstylehbox", "mathstylevbox", "mathstylevcenter", "mathstylevcenteredhbox", "mathstylevcenteredvbox",
"mathtext", "setmathsmalltextbox", "setmathtextbox",
+ "pushmathstyle", "popmathstyle",
--
"triggerdisplaystyle", "triggertextstyle", "triggerscriptstyle", "triggerscriptscriptstyle",
"triggeruncrampedstyle", "triggercrampedstyle",
"triggersmallstyle", "triggeruncrampedsmallstyle", "triggercrampedsmallstyle",
"triggerbigstyle", "triggeruncrampedbigstyle", "triggercrampedbigstyle",
--
- "luaexpr", "expdoifelse", "expdoif", "expdoifnot", "expdoifcommonelse", "expdoifinsetelse",
+ "luaexpr",
+ "expelsedoif", "expdoif", "expdoifnot",
+ "expdoifelsecommon", "expdoifcommonelse",
+ "expdoifelseinset", "expdoifinsetelse",
--
"ctxdirectlua", "ctxlatelua", "ctxsprint", "ctxwrite", "ctxcommand", "ctxdirectcommand", "ctxlatecommand", "ctxreport",
"ctxlua", "luacode", "lateluacode", "directluacode",
@@ -362,7 +386,7 @@ return {
"obeylualines", "obeyluatokens",
"startluacode", "stopluacode", "startlua", "stoplua",
"startctxfunction","stopctxfunction","ctxfunction",
- "startctxfunctiondefinition","stopctxfunctiondefinition",
+ "startctxfunctiondefinition","stopctxfunctiondefinition", "installctxfunction",
--
"carryoverpar",
--
@@ -379,5 +403,6 @@ return {
--
"Ucheckedstartdisplaymath", "Ucheckedstopdisplaymath",
--
+ "nobreak", "allowbreak", "goodbreak",
}
}
diff --git a/Master/texmf-dist/tex/context/base/mult-mes.lua b/Master/texmf-dist/tex/context/base/mult-mes.lua
index 0affb43d6d8..64184f8b0f0 100644
--- a/Master/texmf-dist/tex/context/base/mult-mes.lua
+++ b/Master/texmf-dist/tex/context/base/mult-mes.lua
@@ -1002,6 +1002,15 @@ return {
["publications:11"] = {
en = "unknown command %a",
},
+ ["publications:12"] = {
+ en = "missing setup: %s",
+ },
+ ["publications:13"] = {
+ en = "no field %a for tag %a in dataset %a",
+ },
+ ["publications:14"] = {
+ en = "unknown rendering alternative %a",
+ },
["pushing level: %a"] = {
nl = "niveau omhoog: %a",
},
diff --git a/Master/texmf-dist/tex/context/base/mult-mps.lua b/Master/texmf-dist/tex/context/base/mult-mps.lua
index 717536fbf91..a6bebc26613 100644
--- a/Master/texmf-dist/tex/context/base/mult-mps.lua
+++ b/Master/texmf-dist/tex/context/base/mult-mps.lua
@@ -3,7 +3,7 @@ return {
"btex", "etex", "verbatimtex",
},
shortcuts = {
- "..", "...", "--", "---", "&",
+ "..", "...", "--", "---", "&", "\\",
},
primitives = { -- to be checked
"charcode", "day", "linecap", "linejoin", "miterlimit", "month", "pausing",
@@ -31,8 +31,10 @@ return {
"def", "vardef", "enddef", "expr", "suffix", "text", "primary", "secondary",
"tertiary", "primarydef", "secondarydef", "tertiarydef",
"randomseed", "also", "contour", "doublepath",
- "withcolor", "withcmykcolor", "withpen", "dashed", "if", "else", "elseif", "fi", "for", "endfor", "forever", "exitif", "within",
- "forsuffixes", "downto", "upto", "step", "until",
+ "withcolor", "withcmykcolor", "withpen",
+ "dashed",
+ "if", "else", "elseif", "fi", "for", "endfor", "forever", "exitif", "within",
+ "forsuffixes", "step", "until",
"charlist", "extensible", "fontdimen", "headerbyte", "kern", "ligtable",
"boundarychar", "chardp", "charext", "charht", "charic", "charwd", "designsize",
"fontmaking", "charexists",
@@ -50,29 +52,34 @@ return {
"withprescript", "withpostscript",
"top", "bot", "lft", "rt", "ulft", "urt", "llft", "lrt",
--
- "redpart", "greenpart", "bluepart", "cyanpart", "magentapart", "yellowpart", "blackpart", "greypart",
+ "redpart", "greenpart", "bluepart",
+ "cyanpart", "magentapart", "yellowpart",
+ "blackpart",
"prescriptpart", "postscriptpart",
- "rgbcolor", "cmykcolor", "greycolor", "graycolor",
- "colormodel", "graypart",
+ "rgbcolor", "cmykcolor", -- "greycolor", "graycolor",
+ "colormodel", "graypart", "greypart", "greycolor", "graycolor",
"dashpart", "penpart",
-- "colorpart",
"stroked", "filled", "textual", "clipped", "bounded", "pathpart",
"expandafter",
- "minute", "hour", "outputformat", "outputtemplate", "filenametemplate", "fontmapfile", "fontmapline",
+ "minute", "hour",
+ "outputformat", "outputtemplate", "filenametemplate", "fontmapfile", "fontmapline",
"fontpart", "fontsize", "glyph", "restoreclipcolor", "troffmode",
--
- "runscript",
+ "runscript", "maketext",
},
commands = {
+ "upto", "downto",
"beginfig", "endfig",
- "beginglyph", "endglyph", "charscale",
+ "beginglyph", "endglyph", -- actually a mult-fun one
"rotatedaround", "reflectedabout",
"arrowhead",
"currentpen", "currentpicture", "cuttings",
"defaultfont", "extra_beginfig", "extra_endfig",
"ditto", "EOF", "down",
"evenly", "fullcircle", "halfcircle", "identity", "in", "left",
- "origin", "pensquare", "quartercircle", "right",
+ "pensquare", "penrazor", "penspec",
+ "origin", "quartercircle", "right",
"unitsquare", "up", "withdots",
"abs", "bbox", "ceiling", "center", "cutafter", "cutbefore", "dir",
"directionpoint", "div", "dotprod", "intersectionpoint", "inverse", "mod",
@@ -99,14 +106,13 @@ return {
"counterclockwise", "tensepath", "takepower", "direction",
"softjoin", -- "magstep",
"makelabel", -- "laboff",
- "rotatedabout", "flex", "superellipse", "erase", "image",
+ "rotatedabout", "flex", "superellipse", "image",
"nullpen", "savepen", "clearpen", "penpos", "penlabels", -- "clear_pen_memory",
- "range", "numtok", "thru",
+ "range", "thru",
"z", "laboff",
"bye",
--
"red", "green", "blue", "cyan", "magenta", "yellow", "black", "white", "background",
- "graypart", "graycolor",
--
"mm", "pt", "dd", "bp", "cm", "pc", "cc", "in",
--
@@ -116,8 +122,41 @@ return {
--
"mitered", "rounded", "beveled", "butt", "squared",
"eps", "epsilon", "infinity",
- "bboxmargin", "ahlength", "ahangle", "labeloffset", "dotlabeldiam", "defaultpen", "defaultscale", "join_radius",
+ "bboxmargin",
+ "ahlength", "ahangle",
+ "labeloffset", "dotlabeldiam",
+ "defaultpen", "defaultscale",
+ "join_radius",
+ "charscale", -- actually a mult-fun one
--
"pen_lft", "pen_rt", "pen_top", "pen_bot", -- "pen_count_",
},
+ metafont = {
+ -- :: =: =:| =:|> |=: |=:> |=:| |=:|> |=:|>> ||:
+ "autorounding", "beginchar", "blacker", "boundarychar", "capsule_def",
+ "capsule_end", "change_width", "chardp", "chardx", "chardy", "charexists",
+ "charext", "charht", "charic", "charlist", "charwd", "cull", "cullit",
+ "currenttransform", "currentwindow", "define_blacker_pixels",
+ "define_corrected_pixels", "define_good_x_pixels", "define_good_y_pixels",
+ "define_horizontal_corrected_pixels", "define_pixels",
+ "define_whole_blacker_pixels", "define_whole_pixels",
+ "define_whole_vertical_blacker_pixels", "define_whole_vertical_pixels",
+ "designsize", "display", "displaying", "endchar", "extensible", "extra_beginchar",
+ "extra_endchar", "extra_setup", "fillin", "font_coding_scheme",
+ "font_extra_space", "font_identifier", "font_normal_shrink",
+ "font_normal_space", "font_normal_stretch", "font_quad", "font_size",
+ "font_slant", "font_x_height", "fontdimen", "fontmaking", "gfcorners",
+ "granularity", "grayfont", "headerbyte", "hppp", "hround", "imagerules",
+ "italcorr", "kern", "labelfont", "ligtable", "lowres_fix", "makebox",
+ "makegrid", "maketicks", "mode_def", "mode_setup", "nodisplays",
+ "notransforms", "numspecial", "o_correction", "openit", "openwindow",
+ "pixels_per_inch", "proofing", "proofoffset", "proofrule", "proofrulethickness",
+ "rulepen", "screenchars", "screenrule", "screenstrokes", "screen_cols", "screen_rows",
+ "showit", "slantfont", "smode", "smoothing", "titlefont", "totalweight",
+ "tracingedges", "tracingpens", "turningcheck", "unitpixel", "vppp", "vround",
+ "xoffset", "yoffset",
+ },
+ disabled = {
+ "verbatimtex", "troffmode"
+ }
}
diff --git a/Master/texmf-dist/tex/context/base/mult-nl.mkii b/Master/texmf-dist/tex/context/base/mult-nl.mkii
index aa376c39a1e..22350dc50c3 100644
--- a/Master/texmf-dist/tex/context/base/mult-nl.mkii
+++ b/Master/texmf-dist/tex/context/base/mult-nl.mkii
@@ -180,6 +180,7 @@
\setinterfacevariable{flushleft}{lijnlinks}
\setinterfacevariable{flushouter}{lijnbuiten}
\setinterfacevariable{flushright}{lijnrechts}
+\setinterfacevariable{followingpage}{opvolgendepagina}
\setinterfacevariable{footer}{voet}
\setinterfacevariable{footnote}{voetnoot}
\setinterfacevariable{force}{forceer}
@@ -287,20 +288,21 @@
\setinterfacevariable{mathematics}{wiskunde}
\setinterfacevariable{mathmatrix}{wiskundematrix}
\setinterfacevariable{max}{max}
-\setinterfacevariable{maxdepth}{maxdepth}
-\setinterfacevariable{maxheight}{maxheight}
-\setinterfacevariable{maxwidth}{maxwidth}
+\setinterfacevariable{maxdepth}{maxdiepte}
+\setinterfacevariable{maxheight}{maxhoogte}
+\setinterfacevariable{maxwidth}{maxbreedte}
\setinterfacevariable{may}{mei}
\setinterfacevariable{mediaeval}{mediaeval}
\setinterfacevariable{medium}{middel}
\setinterfacevariable{middle}{midden}
\setinterfacevariable{min}{min}
-\setinterfacevariable{mindepth}{mindepth}
+\setinterfacevariable{mindepth}{mindiepte}
\setinterfacevariable{minheight}{minhoogte}
\setinterfacevariable{minwidth}{minbreedte}
\setinterfacevariable{mirrored}{gespiegeld}
\setinterfacevariable{monday}{maandag}
\setinterfacevariable{mono}{mono}
+\setinterfacevariable{monobold}{monovet}
\setinterfacevariable{month}{maand}
\setinterfacevariable{more}{meer}
\setinterfacevariable{morehyphenation}{morehyphenation}
@@ -360,6 +362,7 @@
\setinterfacevariable{positive}{positief}
\setinterfacevariable{postponing}{uitstellen}
\setinterfacevariable{postscript}{postscript}
+\setinterfacevariable{precedingpage}{voorafgaandepagina}
\setinterfacevariable{preference}{voorkeur}
\setinterfacevariable{preview}{preview}
\setinterfacevariable{previous}{vorige}
@@ -419,7 +422,7 @@
\setinterfacevariable{september}{september}
\setinterfacevariable{serif}{serif}
\setinterfacevariable{serried}{aanelkaar}
-\setinterfacevariable{setups}{instellingen}
+\setinterfacevariable{setups}{setups}
\setinterfacevariable{sheet}{sheet}
\setinterfacevariable{short}{kort}
\setinterfacevariable{simplefonts}{simplefonts}
@@ -651,7 +654,7 @@
\setinterfaceconstant{coupling}{koppeling}
\setinterfaceconstant{couplingway}{koppelwijze}
\setinterfaceconstant{criterium}{criterium}
-\setinterfaceconstant{css}{css}
+\setinterfaceconstant{cssfile}{cssfile}
\setinterfaceconstant{current}{huidige}
\setinterfaceconstant{cutspace}{snijwit}
\setinterfaceconstant{dash}{streep}
@@ -686,7 +689,7 @@
\setinterfaceconstant{equalwidth}{equalwidth}
\setinterfaceconstant{escape}{escape}
\setinterfaceconstant{evenmargin}{evenmarge}
-\setinterfaceconstant{exitoffset}{labeloffset}
+\setinterfaceconstant{exitoffset}{exitoffset}
\setinterfaceconstant{expansion}{expansie}
\setinterfaceconstant{export}{exporteer}
\setinterfaceconstant{extras}{extras}
@@ -753,6 +756,7 @@
\setinterfaceconstant{indenting}{inspringen}
\setinterfaceconstant{indentnext}{springvolgendein}
\setinterfaceconstant{indicator}{aanduiding}
+\setinterfaceconstant{initialsep}{initialsep}
\setinterfaceconstant{inner}{binnen}
\setinterfaceconstant{innermargin}{binnenmarge}
\setinterfaceconstant{inputfile}{inputfile}
@@ -858,6 +862,7 @@
\setinterfaceconstant{nright}{nrechts}
\setinterfaceconstant{ntop}{nboven}
\setinterfaceconstant{number}{nummer}
+\setinterfaceconstant{numberalign}{nummeruitlijnen}
\setinterfaceconstant{numbercolor}{nummerkleur}
\setinterfaceconstant{numbercommand}{nummercommando}
\setinterfaceconstant{numberconversion}{numberconversion}
@@ -1281,6 +1286,7 @@
\setinterfacecommand{definetabletemplate}{definieertabelvorm}
\setinterfacecommand{definetabulate}{definieertabulatie}
\setinterfacecommand{definetext}{definieertekst}
+\setinterfacecommand{definetextbackground}{definieertekstachtergrond}
\setinterfacecommand{definetextposition}{definieertekstpositie}
\setinterfacecommand{definetextvariable}{definieertekstvariabele}
\setinterfacecommand{definetype}{definieertype}
@@ -1441,7 +1447,6 @@
\setinterfacecommand{paperheight}{papierhoogte}
\setinterfacecommand{paperwidth}{papierbreedte}
\setinterfacecommand{periods}{punten}
-\setinterfacecommand{plaatsruwelijst}{plaatsruwelijst}
\setinterfacecommand{placebookmarks}{plaatsbookmarks}
\setinterfacecommand{placecombinedlist}{plaatssamengesteldelijst}
\setinterfacecommand{placefloat}{plaatsplaatsblok}
@@ -1451,11 +1456,13 @@
\setinterfacecommand{placeheadtext}{plaatskoptekst}
\setinterfacecommand{placelegend}{plaatslegenda}
\setinterfacecommand{placelist}{plaatslijst}
+\setinterfacecommand{placelistofsynonyms}{plaatslijstmetsynoniemen}
\setinterfacecommand{placelocalfootnotes}{plaatslokalevoetnoten}
\setinterfacecommand{placelogos}{plaatsbeeldmerken}
\setinterfacecommand{placeongrid}{plaatsopgrid}
\setinterfacecommand{placeontopofeachother}{plaatsonderelkaar}
\setinterfacecommand{placepagenumber}{plaatspaginanummer}
+\setinterfacecommand{placerawlist}{plaatsruwelijst}
\setinterfacecommand{placereferencelist}{plaatsreferentielijst}
\setinterfacecommand{placeregister}{plaatsregister}
\setinterfacecommand{placerule}{plaatslijn}
@@ -1602,7 +1609,6 @@
\setinterfacecommand{setupregister}{stelregisterin}
\setinterfacecommand{setuprotate}{stelroterenin}
\setinterfacecommand{setuprule}{stellijnin}
-\setinterfacecommand{setups}{instellingen}
\setinterfacecommand{setupscreens}{stelrastersin}
\setinterfacecommand{setupsection}{stelsectiein}
\setinterfacecommand{setupsectionblock}{stelsectieblokin}
@@ -1620,6 +1626,7 @@
\setinterfacecommand{setuptables}{steltabellenin}
\setinterfacecommand{setuptabulate}{steltabulatiein}
\setinterfacecommand{setuptext}{steltekstin}
+\setinterfacecommand{setuptextbackground}{steltekstachtergrondin}
\setinterfacecommand{setuptextposition}{steltekstpositiein}
\setinterfacecommand{setuptextrules}{steltekstlijnenin}
\setinterfacecommand{setuptexttexts}{stelteksttekstenin}
@@ -1666,6 +1673,7 @@
\setinterfacecommand{startdocument}{startdocument}
\setinterfacecommand{startenvironment}{startomgeving}
\setinterfacecommand{startfigure}{startfiguur}
+\setinterfacecommand{startframed}{startomlijnd}
\setinterfacecommand{startglobal}{startglobaal}
\setinterfacecommand{startline}{startregel}
\setinterfacecommand{startlinecorrection}{startregelcorrectie}
@@ -1692,6 +1700,7 @@
\setinterfacecommand{starttable}{starttabel}
\setinterfacecommand{starttables}{starttabellen}
\setinterfacecommand{starttext}{starttekst}
+\setinterfacecommand{starttextbackground}{starttekstachtergrond}
\setinterfacecommand{starttextrule}{starttekstlijn}
\setinterfacecommand{startunpacked}{startvanelkaar}
\setinterfacecommand{startversion}{startversie}
@@ -1706,6 +1715,7 @@
\setinterfacecommand{stopcomponent}{stoponderdeel}
\setinterfacecommand{stopdocument}{stopdocument}
\setinterfacecommand{stopenvironment}{stopomgeving}
+\setinterfacecommand{stopframed}{stopomlijnd}
\setinterfacecommand{stopglobal}{stopglobaal}
\setinterfacecommand{stopline}{stopregel}
\setinterfacecommand{stoplinecorrection}{stopregelcorrectie}
@@ -1731,6 +1741,7 @@
\setinterfacecommand{stoptable}{stoptabel}
\setinterfacecommand{stoptables}{stoptabellen}
\setinterfacecommand{stoptext}{stoptekst}
+\setinterfacecommand{stoptextbackground}{stoptekstachtergrond}
\setinterfacecommand{stoptextrule}{stoptekstlijn}
\setinterfacecommand{stopunpacked}{stopvanelkaar}
\setinterfacecommand{stopversion}{stopversie}
diff --git a/Master/texmf-dist/tex/context/base/mult-pe.mkii b/Master/texmf-dist/tex/context/base/mult-pe.mkii
index 16871bb6260..32cf32db1c3 100644
--- a/Master/texmf-dist/tex/context/base/mult-pe.mkii
+++ b/Master/texmf-dist/tex/context/base/mult-pe.mkii
@@ -180,6 +180,7 @@
\setinterfacevariable{flushleft}{پمپ‌چپ}
\setinterfacevariable{flushouter}{پمپ‌خارجی}
\setinterfacevariable{flushright}{پمپ‌راست}
+\setinterfacevariable{followingpage}{followingpage}
\setinterfacevariable{footer}{ته‌برگ}
\setinterfacevariable{footnote}{پانوشت}
\setinterfacevariable{force}{اجبار}
@@ -301,6 +302,7 @@
\setinterfacevariable{mirrored}{منعکس}
\setinterfacevariable{monday}{دوشنبه}
\setinterfacevariable{mono}{مونو}
+\setinterfacevariable{monobold}{monobold}
\setinterfacevariable{month}{ماه}
\setinterfacevariable{more}{more}
\setinterfacevariable{morehyphenation}{شکست‌کلمات‌بیشتر}
@@ -360,6 +362,7 @@
\setinterfacevariable{positive}{مثبت}
\setinterfacevariable{postponing}{تاخیر}
\setinterfacevariable{postscript}{پست‌اسکریپت}
+\setinterfacevariable{precedingpage}{followingpage}
\setinterfacevariable{preference}{ترجیح}
\setinterfacevariable{preview}{پیش‌دید}
\setinterfacevariable{previous}{قبلی}
@@ -419,7 +422,7 @@
\setinterfacevariable{september}{سپتامبر}
\setinterfacevariable{serif}{سریف}
\setinterfacevariable{serried}{تنگ‌هم}
-\setinterfacevariable{setups}{بارگذاریها}
+\setinterfacevariable{setups}{setups}
\setinterfacevariable{sheet}{ورقه}
\setinterfacevariable{short}{short}
\setinterfacevariable{simplefonts}{simplefonts}
@@ -651,7 +654,7 @@
\setinterfaceconstant{coupling}{تزویج}
\setinterfaceconstant{couplingway}{روش‌تزویج}
\setinterfaceconstant{criterium}{criterium}
-\setinterfaceconstant{css}{css}
+\setinterfaceconstant{cssfile}{cssfile}
\setinterfaceconstant{current}{جاری}
\setinterfaceconstant{cutspace}{فضای‌برش}
\setinterfaceconstant{dash}{دش}
@@ -686,7 +689,7 @@
\setinterfaceconstant{equalwidth}{عرض‌یکسان}
\setinterfaceconstant{escape}{فرار}
\setinterfaceconstant{evenmargin}{حاشیه‌زوج}
-\setinterfaceconstant{exitoffset}{labeloffset}
+\setinterfaceconstant{exitoffset}{exitoffset}
\setinterfaceconstant{expansion}{گسترش}
\setinterfaceconstant{export}{export}
\setinterfaceconstant{extras}{extras}
@@ -753,6 +756,7 @@
\setinterfaceconstant{indenting}{تورفتگی}
\setinterfaceconstant{indentnext}{متن‌تورفته}
\setinterfaceconstant{indicator}{اندیکاتور}
+\setinterfaceconstant{initialsep}{initialsep}
\setinterfaceconstant{inner}{داخلی}
\setinterfaceconstant{innermargin}{حاشیه‌داخلی}
\setinterfaceconstant{inputfile}{پرونده‌ورودی}
@@ -858,6 +862,7 @@
\setinterfaceconstant{nright}{nright}
\setinterfaceconstant{ntop}{ntop}
\setinterfaceconstant{number}{شماره}
+\setinterfaceconstant{numberalign}{numberalign}
\setinterfaceconstant{numbercolor}{رنگ‌شماره}
\setinterfaceconstant{numbercommand}{فرمان‌شماره}
\setinterfaceconstant{numberconversion}{numberconversion}
@@ -1002,7 +1007,7 @@
\setinterfaceconstant{separatorcolor}{separatorcolor}
\setinterfaceconstant{separatorstyle}{separatorstyle}
\setinterfaceconstant{set}{قراربده}
-\setinterfaceconstant{setups}{بارگذاریها}
+\setinterfaceconstant{setups}{setups}
\setinterfaceconstant{shrink}{shrink}
\setinterfaceconstant{side}{کنار}
\setinterfaceconstant{sidealign}{تنظیم‌کنار}
@@ -1281,6 +1286,7 @@
\setinterfacecommand{definetabletemplate}{تعریف‌الگوی‌جدول}
\setinterfacecommand{definetabulate}{تعریف‌جدول‌بندی}
\setinterfacecommand{definetext}{تعریف‌متن}
+\setinterfacecommand{definetextbackground}{definetextbackground}
\setinterfacecommand{definetextposition}{تعریف‌مکان‌متن}
\setinterfacecommand{definetextvariable}{تعریف‌متغیرمتن}
\setinterfacecommand{definetype}{تعریف‌تایپ}
@@ -1441,7 +1447,6 @@
\setinterfacecommand{paperheight}{ارتفاع‌برگ}
\setinterfacecommand{paperwidth}{عرض‌برگ}
\setinterfacecommand{periods}{نقطه‌ها}
-\setinterfacecommand{plaatsruwelijst}{درج‌لیست‌خام}
\setinterfacecommand{placebookmarks}{درج‌چوب‌خط}
\setinterfacecommand{placecombinedlist}{درج‌لیست‌مختلط}
\setinterfacecommand{placefloat}{درج‌شناور}
@@ -1451,11 +1456,13 @@
\setinterfacecommand{placeheadtext}{درج‌متن‌سر}
\setinterfacecommand{placelegend}{درج‌راهنما}
\setinterfacecommand{placelist}{درج‌لیست}
+\setinterfacecommand{placelistofsynonyms}{placelistofsynonyms}
\setinterfacecommand{placelocalfootnotes}{درج‌پانوشتهای‌موضعی}
\setinterfacecommand{placelogos}{درج‌آرمها}
\setinterfacecommand{placeongrid}{درج‌در‌توری}
\setinterfacecommand{placeontopofeachother}{درج‌در‌بالای‌یکدیگر}
\setinterfacecommand{placepagenumber}{درج‌شماره‌صفحه}
+\setinterfacecommand{placerawlist}{درج‌لیست‌خام}
\setinterfacecommand{placereferencelist}{درج‌لیست‌مرجع}
\setinterfacecommand{placeregister}{درج‌ثبت}
\setinterfacecommand{placerule}{درج‌خط}
@@ -1602,7 +1609,6 @@
\setinterfacecommand{setupregister}{بارگذاری‌ثبت}
\setinterfacecommand{setuprotate}{بارگذاری‌دوران}
\setinterfacecommand{setuprule}{بارگذاری‌خط}
-\setinterfacecommand{setups}{بارگذاریها}
\setinterfacecommand{setupscreens}{بارگذاری‌پرده‌ها}
\setinterfacecommand{setupsection}{بارگذاری‌بخش}
\setinterfacecommand{setupsectionblock}{بارگذاری‌بلوک‌بخش}
@@ -1620,6 +1626,7 @@
\setinterfacecommand{setuptables}{بارگذاری‌جدولها}
\setinterfacecommand{setuptabulate}{بارگذاری‌جدول‌بندی}
\setinterfacecommand{setuptext}{بارگذاری‌متن}
+\setinterfacecommand{setuptextbackground}{setuptextbackground}
\setinterfacecommand{setuptextposition}{بارگذاری‌مکان‌متن}
\setinterfacecommand{setuptextrules}{بارگذاری‌خطهای‌متن}
\setinterfacecommand{setuptexttexts}{بارگذاری‌متن‌متنها}
@@ -1666,6 +1673,7 @@
\setinterfacecommand{startdocument}{شروع‌نوشتار}
\setinterfacecommand{startenvironment}{شروع‌محیط}
\setinterfacecommand{startfigure}{شروع‌شکل}
+\setinterfacecommand{startframed}{startframed}
\setinterfacecommand{startglobal}{شروع‌سراسری}
\setinterfacecommand{startline}{شروع‌خط}
\setinterfacecommand{startlinecorrection}{شروع‌تصحیح‌خط}
@@ -1692,6 +1700,7 @@
\setinterfacecommand{starttable}{شروع‌جدول}
\setinterfacecommand{starttables}{شروع‌جدولها}
\setinterfacecommand{starttext}{شروع‌متن}
+\setinterfacecommand{starttextbackground}{starttextbackground}
\setinterfacecommand{starttextrule}{شروع‌خط‌متن}
\setinterfacecommand{startunpacked}{شروع‌غیر‌فشرده}
\setinterfacecommand{startversion}{شروع‌نسخه}
@@ -1706,6 +1715,7 @@
\setinterfacecommand{stopcomponent}{پایان‌مولفه}
\setinterfacecommand{stopdocument}{پایان‌نوشتار}
\setinterfacecommand{stopenvironment}{پایان‌محیط}
+\setinterfacecommand{stopframed}{stopframed}
\setinterfacecommand{stopglobal}{پایان‌سراسری}
\setinterfacecommand{stopline}{پایان‌خط}
\setinterfacecommand{stoplinecorrection}{پایان‌تصحیح‌خط}
@@ -1731,6 +1741,7 @@
\setinterfacecommand{stoptable}{پایان‌جدول}
\setinterfacecommand{stoptables}{پایان‌جدولها}
\setinterfacecommand{stoptext}{پایان‌متن}
+\setinterfacecommand{stoptextbackground}{stoptextbackground}
\setinterfacecommand{stoptextrule}{پایان‌خط‌متن}
\setinterfacecommand{stopunpacked}{پایان‌غیرفشرده}
\setinterfacecommand{stopversion}{پایان‌نسخه}
diff --git a/Master/texmf-dist/tex/context/base/mult-prm.lua b/Master/texmf-dist/tex/context/base/mult-prm.lua
index f0b850a5c26..3b4d8435668 100644
--- a/Master/texmf-dist/tex/context/base/mult-prm.lua
+++ b/Master/texmf-dist/tex/context/base/mult-prm.lua
@@ -232,7 +232,7 @@ return {
"latelua",
"luaescapestring",
"luastartup",
- "luatexdatestamp",
+ "luatexbanner",
"luatexrevision",
"luatexversion",
"luafunction",
@@ -253,6 +253,7 @@ return {
"suppressifcsnameerror",
"suppresslongerror",
"suppressoutererror",
+ "suppressmathparerror",
"synctex",
},
["omega"]={
@@ -773,7 +774,7 @@ return {
"lpcode",
"luaescapestring",
"luastartup",
- "luatexdatestamp",
+ "luatexbanner",
"luatexrevision",
"luatexversion",
"mag",
diff --git a/Master/texmf-dist/tex/context/base/mult-ro.mkii b/Master/texmf-dist/tex/context/base/mult-ro.mkii
index d01822944da..a5d90033f03 100644
--- a/Master/texmf-dist/tex/context/base/mult-ro.mkii
+++ b/Master/texmf-dist/tex/context/base/mult-ro.mkii
@@ -180,6 +180,7 @@
\setinterfacevariable{flushleft}{flushleft}
\setinterfacevariable{flushouter}{flushouter}
\setinterfacevariable{flushright}{flushright}
+\setinterfacevariable{followingpage}{followingpage}
\setinterfacevariable{footer}{subsol}
\setinterfacevariable{footnote}{notasubsol}
\setinterfacevariable{force}{fortat}
@@ -301,6 +302,7 @@
\setinterfacevariable{mirrored}{oglindit}
\setinterfacevariable{monday}{luni}
\setinterfacevariable{mono}{mono}
+\setinterfacevariable{monobold}{monoaldin}
\setinterfacevariable{month}{luna}
\setinterfacevariable{more}{more}
\setinterfacevariable{morehyphenation}{morehyphenation}
@@ -360,6 +362,7 @@
\setinterfacevariable{positive}{positiv}
\setinterfacevariable{postponing}{postponing}
\setinterfacevariable{postscript}{postscript}
+\setinterfacevariable{precedingpage}{followingpage}
\setinterfacevariable{preference}{preferinta}
\setinterfacevariable{preview}{previzualizare}
\setinterfacevariable{previous}{precedent}
@@ -419,7 +422,7 @@
\setinterfacevariable{september}{septembrie}
\setinterfacevariable{serif}{serif}
\setinterfacevariable{serried}{serried}
-\setinterfacevariable{setups}{setari}
+\setinterfacevariable{setups}{setups}
\setinterfacevariable{sheet}{sheet}
\setinterfacevariable{short}{short}
\setinterfacevariable{simplefonts}{simplefonts}
@@ -651,7 +654,7 @@
\setinterfaceconstant{coupling}{cuplare}
\setinterfaceconstant{couplingway}{modcuplare}
\setinterfaceconstant{criterium}{criteriu}
-\setinterfaceconstant{css}{css}
+\setinterfaceconstant{cssfile}{cssfile}
\setinterfaceconstant{current}{curent}
\setinterfaceconstant{cutspace}{cutspace}
\setinterfaceconstant{dash}{dash}
@@ -686,7 +689,7 @@
\setinterfaceconstant{equalwidth}{equalwidth}
\setinterfaceconstant{escape}{escape}
\setinterfaceconstant{evenmargin}{marginepara}
-\setinterfaceconstant{exitoffset}{labeloffset}
+\setinterfaceconstant{exitoffset}{exitoffset}
\setinterfaceconstant{expansion}{expansiune}
\setinterfaceconstant{export}{export}
\setinterfaceconstant{extras}{extras}
@@ -753,6 +756,7 @@
\setinterfaceconstant{indenting}{aliniat}
\setinterfaceconstant{indentnext}{aliniaturmator}
\setinterfaceconstant{indicator}{indicator}
+\setinterfaceconstant{initialsep}{initialsep}
\setinterfaceconstant{inner}{intern}
\setinterfaceconstant{innermargin}{innermargin}
\setinterfaceconstant{inputfile}{inputfile}
@@ -858,6 +862,7 @@
\setinterfaceconstant{nright}{ndreapta}
\setinterfaceconstant{ntop}{nsus}
\setinterfaceconstant{number}{numar}
+\setinterfaceconstant{numberalign}{numberalign}
\setinterfaceconstant{numbercolor}{culoarenumar}
\setinterfaceconstant{numbercommand}{comandanumar}
\setinterfaceconstant{numberconversion}{numberconversion}
@@ -1281,6 +1286,7 @@
\setinterfacecommand{definetabletemplate}{definestesablontabel}
\setinterfacecommand{definetabulate}{definestetabulatori}
\setinterfacecommand{definetext}{definestetext}
+\setinterfacecommand{definetextbackground}{definetextbackground}
\setinterfacecommand{definetextposition}{definestepozitietext}
\setinterfacecommand{definetextvariable}{definestevariabilatext}
\setinterfacecommand{definetype}{definetype}
@@ -1441,7 +1447,6 @@
\setinterfacecommand{paperheight}{inaltimehartie}
\setinterfacecommand{paperwidth}{latimehartie}
\setinterfacecommand{periods}{puncte}
-\setinterfacecommand{plaatsruwelijst}{placerawlist}
\setinterfacecommand{placebookmarks}{plaseazasemnecarte}
\setinterfacecommand{placecombinedlist}{punelistacombinata}
\setinterfacecommand{placefloat}{placefloat}
@@ -1451,11 +1456,13 @@
\setinterfacecommand{placeheadtext}{placeheadtext}
\setinterfacecommand{placelegend}{punelegenda}
\setinterfacecommand{placelist}{punelista}
+\setinterfacecommand{placelistofsynonyms}{placelistofsynonyms}
\setinterfacecommand{placelocalfootnotes}{punenotesubsollocale}
\setinterfacecommand{placelogos}{punelogouri}
\setinterfacecommand{placeongrid}{plaseazapegrid}
\setinterfacecommand{placeontopofeachother}{punedeasuprafiecareia}
\setinterfacecommand{placepagenumber}{punenumarpagina}
+\setinterfacecommand{placerawlist}{placerawlist}
\setinterfacecommand{placereferencelist}{placereferencelist}
\setinterfacecommand{placeregister}{puneregistru}
\setinterfacecommand{placerule}{punerigla}
@@ -1602,7 +1609,6 @@
\setinterfacecommand{setupregister}{seteazaregistru}
\setinterfacecommand{setuprotate}{seteazarotare}
\setinterfacecommand{setuprule}{seteazarigla}
-\setinterfacecommand{setups}{setari}
\setinterfacecommand{setupscreens}{seteazaecrane}
\setinterfacecommand{setupsection}{seteazasectiune}
\setinterfacecommand{setupsectionblock}{seteazablocsectiune}
@@ -1620,6 +1626,7 @@
\setinterfacecommand{setuptables}{seteazatabele}
\setinterfacecommand{setuptabulate}{seteazatabulatori}
\setinterfacecommand{setuptext}{seteazatext}
+\setinterfacecommand{setuptextbackground}{setuptextbackground}
\setinterfacecommand{setuptextposition}{seteazapozitietext}
\setinterfacecommand{setuptextrules}{seteazarigletext}
\setinterfacecommand{setuptexttexts}{seteazatextetext}
@@ -1666,6 +1673,7 @@
\setinterfacecommand{startdocument}{startdocument}
\setinterfacecommand{startenvironment}{startmediu}
\setinterfacecommand{startfigure}{startfigura}
+\setinterfacecommand{startframed}{startframed}
\setinterfacecommand{startglobal}{startglobal}
\setinterfacecommand{startline}{startlinie}
\setinterfacecommand{startlinecorrection}{startcorectielinie}
@@ -1692,6 +1700,7 @@
\setinterfacecommand{starttable}{starttabel}
\setinterfacecommand{starttables}{starttabele}
\setinterfacecommand{starttext}{starttext}
+\setinterfacecommand{starttextbackground}{starttextbackground}
\setinterfacecommand{starttextrule}{startriglatext}
\setinterfacecommand{startunpacked}{startneimpachetat}
\setinterfacecommand{startversion}{startversiune}
@@ -1706,6 +1715,7 @@
\setinterfacecommand{stopcomponent}{stopcomponenta}
\setinterfacecommand{stopdocument}{stopdocument}
\setinterfacecommand{stopenvironment}{stopmediu}
+\setinterfacecommand{stopframed}{stopframed}
\setinterfacecommand{stopglobal}{stopblobal}
\setinterfacecommand{stopline}{stoplinie}
\setinterfacecommand{stoplinecorrection}{stopcorectielinie}
@@ -1731,6 +1741,7 @@
\setinterfacecommand{stoptable}{stoptabel}
\setinterfacecommand{stoptables}{stoptabele}
\setinterfacecommand{stoptext}{stoptext}
+\setinterfacecommand{stoptextbackground}{stoptextbackground}
\setinterfacecommand{stoptextrule}{stopriglatext}
\setinterfacecommand{stopunpacked}{stopneimpachetat}
\setinterfacecommand{stopversion}{stopversiune}
diff --git a/Master/texmf-dist/tex/context/base/mult-sys.mkiv b/Master/texmf-dist/tex/context/base/mult-sys.mkiv
index 8c1bff2bc40..63a89492a7f 100644
--- a/Master/texmf-dist/tex/context/base/mult-sys.mkiv
+++ b/Master/texmf-dist/tex/context/base/mult-sys.mkiv
@@ -124,7 +124,7 @@
\definesystemconstant {SansSlanted}
\definesystemconstant {SansBoldSlanted}
\definesystemconstant {SansCaps}
-% \definesystemconstant {SansCapsSlanted}
+%definesystemconstant {SansCapsSlanted}
\definesystemconstant {Mono}
\definesystemconstant {MonoBold}
@@ -133,8 +133,8 @@
\definesystemconstant {MonoSlanted}
\definesystemconstant {MonoBoldSlanted}
\definesystemconstant {MonoCaps}
-% \definesystemconstant {MonoCapsSlanted}
-% \definesystemconstant {MonoVariable}
+%definesystemconstant {MonoCapsSlanted}
+%definesystemconstant {MonoVariable}
\definesystemconstant {DefaultFont}
@@ -261,6 +261,19 @@
\definesystemconstant {single}
\definesystemconstant {multi}
\definesystemconstant {indeed}
+\definesystemconstant {internal}
+\definesystemconstant {current}
+\definesystemconstant {chain}
+
+% translating setups is asking for a mess so we keep them as-is:
+
+\definesystemconstant {setups}
+
+\definesystemconstant {cite}
+\definesystemconstant {nocite}
+\definesystemconstant {list}
+\definesystemconstant {register}
+\definesystemconstant {author}
% \def\s!parent{->} % 1% faster / => does not work in assignments
% \def\s!child {<-} % 1% faster / <= does not work in assignments
@@ -279,12 +292,16 @@
\definesystemconstant {bold}
\definesystemconstant {italic}
\definesystemconstant {slanted}
-
-\definesystemconstant {default}
\definesystemconstant {smallcaps}
+\definesystemconstant {lcgreek}
+\definesystemconstant {ucgreek}
+\definesystemconstant {sygreek}
+\definesystemconstant {italics}
\definesystemconstant {run}
+\definesystemconstant {default}
+
\definesystemconstant {mode}
\definesystemconstant {setup}
\definesystemconstant {environment}
@@ -298,11 +315,22 @@
\definesystemconstant {uncramped}
\definesystemconstant {cramped}
+\definesystemconstant {hyphenmin}
\definesystemconstant {lefthyphenmin}
\definesystemconstant {righthyphenmin}
\definesystemconstant {lefthyphenchar}
\definesystemconstant {righthyphenchar}
+\definesystemconstant {head}
+\definesystemconstant {symbol}
+\definesystemconstant {sub}
+\definesystemconstant {margin}
+\definesystemconstant {edge}
+
+\definesystemconstant {double}
+\definesystemconstant {decimal}
+\definesystemconstant {binary}
+
%definesystemconstant {skewchar}
%definesystemconstant {hyphenchar}
\definesystemconstant {catcodes}
@@ -322,6 +350,12 @@
\definesystemconstant {designsize}
%definesystemconstant {background}
%definesystemconstant {ucmap}
+\definesystemconstant {level}
+\definesystemconstant {integral}
+\definesystemconstant {insert} % maybe insertclass
+\definesystemconstant {marker}
+
+\definesystemconstant {mixedcolumn}
%definesystemconstant {property}
%definesystemconstant {overprint}
@@ -382,8 +416,13 @@
\definesystemconstant {size}
\definesystemconstant {depth}
+\definesystemconstant {height}
+\definesystemconstant {noheight}
\definesystemconstant {nodepth}
+\definesystemconstant {rel}
+\definesystemconstant {ord}
+
%D Just to be complete we define the standard \TEX\ units.
\definesystemconstant {cm}
@@ -538,6 +577,13 @@
\defineinterfacevariable {c} {c}
\defineinterfacevariable {d} {d}
+%D For tagging:
+
+\definesystemconstant {subtype}
+\definesystemconstant {top}
+\definesystemconstant {bottom}
+\definesystemconstant {both}
+
%D Special purpose variables:
\def\v!oddeven#1{\ifodd#1\v!odd\else\v!even\fi}
diff --git a/Master/texmf-dist/tex/context/base/node-aux.lua b/Master/texmf-dist/tex/context/base/node-aux.lua
index 49911625822..12da8ea8ab3 100644
--- a/Master/texmf-dist/tex/context/base/node-aux.lua
+++ b/Master/texmf-dist/tex/context/base/node-aux.lua
@@ -314,13 +314,17 @@ nuts .firstcharinbox = firstcharinbox
nodes.firstcharinbox = firstcharinbox
nodes.firstcharacter = vianuts(firstcharacter)
-function commands.buildtextaccent(n)
- local char = firstcharinbox(n)
- if char > 0 then
- -- context.accent(false,char)
- context([[\accent%s\relax]],char)
+interfaces.implement {
+ name = "buildtextaccent",
+ arguments = "integer",
+ actions = function(n) -- Is this crap really used? Or was it an experiment?
+ local char = firstcharinbox(n)
+ if char > 0 then
+ -- context.accent(false,char)
+ context([[\accent%s\relax]],char)
+ end
end
-end
+}
-- this depends on fonts, so we have a funny dependency ... will be
-- sorted out .. we could make tonodes a plugin into this
@@ -352,7 +356,8 @@ local function tonodes(str,fnt,attr) -- (str,template_glyph) -- moved from blob-
n = new_glyph(fnt,s)
end
if attr then -- normally false when template
- setfield(n,"attr",copy_node_list(attr))
+ -- setfield(n,"attr",copy_node_list(attr))
+ setfield(n,"attr",attr)
end
if head then
insert_node_after(head,tail,n)
diff --git a/Master/texmf-dist/tex/context/base/node-bck.lua b/Master/texmf-dist/tex/context/base/node-bck.lua
index 4b7b4a0643d..99992de0903 100644
--- a/Master/texmf-dist/tex/context/base/node-bck.lua
+++ b/Master/texmf-dist/tex/context/base/node-bck.lua
@@ -178,5 +178,19 @@ nodes.handlers.alignbackgrounds = function(head) local head, done = add_alignbac
-- elsewhere: needs checking
-tasks.appendaction("shipouts","normalizers","nodes.handlers.backgrounds")
-tasks.appendaction("shipouts","normalizers","nodes.handlers.alignbackgrounds")
+-- tasks.appendaction("shipouts","normalizers","nodes.handlers.backgrounds")
+-- tasks.appendaction("shipouts","normalizers","nodes.handlers.alignbackgrounds")
+
+interfaces.implement {
+ name = "enablebackgroundboxes",
+ onlyonce = true,
+ actions = nodes.tasks.enableaction,
+ arguments = { "'shipouts'", "'nodes.handlers.backgrounds'" }
+}
+
+interfaces.implement {
+ name = "enablebackgroundalign",
+ onlyonce = true,
+ actions = nodes.tasks.enableaction,
+ arguments = { "'shipouts'", "'nodes.handlers.alignbackgrounds'" }
+}
diff --git a/Master/texmf-dist/tex/context/base/node-bck.mkiv b/Master/texmf-dist/tex/context/base/node-bck.mkiv
index 25739c56042..ff0de6a5d0c 100644
--- a/Master/texmf-dist/tex/context/base/node-bck.mkiv
+++ b/Master/texmf-dist/tex/context/base/node-bck.mkiv
@@ -21,14 +21,6 @@
\registerctxluafile{node-bck}{1.001}
-\def\node_backgrounds_boxes_initialize % will move to lua
- {\ctxlua{nodes.tasks.enableaction("shipouts","nodes.handlers.backgrounds")}%
- \glet\node_backgrounds_boxes_initialize\donothing}
-
-\def\node_backgrounds_align_initialize % will move to lua
- {\ctxlua{nodes.tasks.enableaction("shipouts","nodes.handlers.alignbackgrounds")}%
- \glet\node_backgrounds_align_initialize\donothing}
-
% \backgroundvbox[green] {\input tufte } \par
% \backgroundvbox[blue] {\input ward } \par
% \backgroundvbox[red] {\input knuth } \par
@@ -71,7 +63,7 @@
% \def\node_backgrounds_boxes_add#1[#2]%
% {\begingroup
-% \node_backgrounds_boxes_initialize
+% \clf_enablebackgroundboxes
% \dousecolorparameter{#2}%
% \normalexpanded{\endgroup#1
% attr \backgroundattribute \plusone
@@ -82,13 +74,13 @@
% more efficient:
\def\node_backgrounds_boxes_add#1[#2]%
- {\node_backgrounds_boxes_initialize
+ {\clf_enablebackgroundboxes
#1\backgroundcolorattr{#2}}
% less argument carry over:
%
% \def\node_backgrounds_boxes_add#1[#2]%
-% {\node_backgrounds_boxes_initialize#1%
+% {\clf_enablebackgroundboxes#1%
% \ifcsname\??colorattribute\currentcolorprefix#2\endcsname
% \thebackgroundcolorattr{\currentcolorprefix#2}%
% \else\ifcsname\??colorattribute#2\endcsname
diff --git a/Master/texmf-dist/tex/context/base/node-fin.lua b/Master/texmf-dist/tex/context/base/node-fin.lua
index 250035f3958..84c5b9a2f93 100644
--- a/Master/texmf-dist/tex/context/base/node-fin.lua
+++ b/Master/texmf-dist/tex/context/base/node-fin.lua
@@ -9,7 +9,7 @@ if not modules then modules = { } end modules ['node-fin'] = {
-- this module is being reconstructed
-- local functions, only slightly slower
--
--- leaders are also triggers
+-- leaders are also triggers ... see colo-ext for an example (negate a box)
local next, type, format = next, type, string.format
@@ -27,7 +27,6 @@ local getid = nuts.getid
local getlist = nuts.getlist
local getleader = nuts.getleader
local getattr = nuts.getattr
-local setattr = nuts.setattr
local copy_node = nuts.copy
local insert_node_before = nuts.insert_before
@@ -51,6 +50,8 @@ local numbers = attributes.numbers
local a_trigger = attributes.private('trigger')
local triggering = false
+local implement = interfaces.implement
+
local starttiming = statistics.starttiming
local stoptiming = statistics.stoptiming
local loadstripped = utilities.lua.loadstripped
@@ -61,6 +62,9 @@ local unsetvalue = attributes.unsetvalue
function states.enabletriggering () triggering = true end
function states.disabletriggering() triggering = false end
+implement { name = "enablestatetriggering", actions = states.enabletriggering }
+implement { name = "disablestatetriggering", actions = states.disabletriggering }
+
nodes.plugindata = nil
-- inheritance: -0x7FFFFFFF -- we can best use nil and skip !
@@ -129,7 +133,7 @@ end
local nsdata, nsnone, nslistwise, nsforced, nsselector, nstrigger
local current, current_selector, done = 0, 0, false -- nb, stack has a local current !
-local nsbegin, nsend
+local nsbegin, nsend, nsreset
function states.initialize(namespace,attribute,head)
nsdata = namespace.data
@@ -143,6 +147,7 @@ function states.initialize(namespace,attribute,head)
done = false -- todo: done cleanup
nsstep = namespace.resolve_step
if nsstep then
+ nsreset = namespace.resolve_reset
nsbegin = namespace.resolve_begin
nsend = namespace.resolve_end
nspush = namespace.push
@@ -168,7 +173,6 @@ function states.finalize(namespace,attribute,head) -- is this one ok?
return head, false, false
end
--- disc nodes can be ignored
-- we need to deal with literals too (reset as well as oval)
-- if id == glyph_code or (id == whatsit_code and getsubtype(stack) == pdfliteral_code) or (id == rule_code and stack.width ~= 0) or (id == glue_code and stack.leader) then
@@ -181,6 +185,8 @@ local function process(namespace,attribute,head,inheritance,default) -- one attr
local id = getid(stack)
if id == glyph_code then
check = true
+ -- elseif id == disc_code then
+ -- check = true -- no longer needed as we flatten replace
elseif id == glue_code then
leader = getleader(stack)
if leader then
@@ -294,6 +300,8 @@ local function selective(namespace,attribute,head,inheritance,default) -- two at
local id = getid(stack)
if id == glyph_code then
check = true
+ -- elseif id == disc_code then
+ -- check = true -- no longer needed as we flatten replace
elseif id == glue_code then
leader = getleader(stack)
if leader then
@@ -364,7 +372,7 @@ local function selective(namespace,attribute,head,inheritance,default) -- two at
done = done or ok
end
-- end nested
- leader = false
+ leader = false
end
elseif default and inheritance then
if current ~= default then
@@ -484,14 +492,17 @@ end
-- experimental
local function stacker(namespace,attribute,head,default) -- no triggering, no inheritance, but list-wise
- nsbegin()
+
+-- nsbegin()
+ local stacked = false
+
local current = head
local previous = head
local done = false
- local okay = false
local attrib = default or unsetvalue
local check = false
local leader = false
+
while current do
local id = getid(current)
if id == glyph_code then
@@ -530,13 +541,15 @@ local function stacker(namespace,attribute,head,default) -- no triggering, no in
if check then
local a = getattr(current,attribute) or unsetvalue
if a ~= attrib then
+ if not stacked then
+ stacked = true
+ nsbegin()
+ end
local n = nsstep(a)
if n then
- -- !!!! TEST CODE !!!!
- -- head = insert_node_before(head,current,copied(nsdata[tonumber(n)])) -- a
head = insert_node_before(head,current,tonut(n)) -- a
end
- attrib, done, okay = a, true, true
+ attrib, done = a, true
if leader then
-- tricky as a leader has to be a list so we cannot inject before
local list, ok = stacker(namespace,attribute,leader,attrib)
@@ -550,19 +563,23 @@ local function stacker(namespace,attribute,head,default) -- no triggering, no in
previous = current
current = getnext(current)
end
- if okay then
- local n = nsend()
- if n then
- -- !!!! TEST CODE !!!!
- -- head = insert_node_after(head,previous,copied(nsdata[tostring(n)]))
- head = insert_node_after(head,previous,tonut(n))
- end
+
+if stacked then
+
+ local n = nsend()
+ while n do
+ head = insert_node_after(head,previous,tonut(n))
+ n = nsend()
end
+
+end
+
return head, done
end
states.stacker = function(namespace,attribute,head,default)
local head, done = stacker(namespace,attribute,tonut(head),default)
+ nsreset()
return tonode(head), done
end
diff --git a/Master/texmf-dist/tex/context/base/node-fin.mkiv b/Master/texmf-dist/tex/context/base/node-fin.mkiv
index 2eb033fc16a..7c95699dd12 100644
--- a/Master/texmf-dist/tex/context/base/node-fin.mkiv
+++ b/Master/texmf-dist/tex/context/base/node-fin.mkiv
@@ -23,12 +23,12 @@
% we might have two variants at some point (efficiency)
-\unexpanded\def\finalizeobjectbox #1{\ctxcommand{finalizebox(\number#1)}}
-\unexpanded\def\finalizeshipoutbox#1{\ctxcommand{finalizebox(\number#1)}}
+\unexpanded\def\finalizeobjectbox #1{\clf_finalizebox#1\relax}
+\unexpanded\def\finalizeshipoutbox#1{\clf_finalizebox#1\relax}
% Experimental (for Aditya):
-\unexpanded\def\cleanupbox#1{\ctxcommand{cleanupbox(\number#1)}}
+\unexpanded\def\cleanupbox#1{\clf_cleanupbox#1\relax}
% Tricky stuff: this might become obsolete.
@@ -61,12 +61,12 @@
\stopinheritattributes}
\def\enableattributeinheritance
- {\ctxlua{attributes.states.enabletriggering()}%
+ {\clf_enablestatetriggering
\let\attributedcopy\doattributedcopy
\let\attributedbox \doattributedbox}
\def\disableattributeinheritance
- {\ctxlua{attributes.states.disabletriggering()}%
+ {\clf_disablestatetriggering
\let\attributedcopy\copy
\let\attributedbox \box}
diff --git a/Master/texmf-dist/tex/context/base/node-fnt.lua b/Master/texmf-dist/tex/context/base/node-fnt.lua
index 7000c4fd7ac..774a687186a 100644
--- a/Master/texmf-dist/tex/context/base/node-fnt.lua
+++ b/Master/texmf-dist/tex/context/base/node-fnt.lua
@@ -13,8 +13,11 @@ local concat, keys = table.concat, table.keys
local nodes, node, fonts = nodes, node, fonts
-local trace_characters = false trackers.register("nodes.characters", function(v) trace_characters = v end)
-local trace_fontrun = false trackers.register("nodes.fontrun", function(v) trace_fontrun = v end)
+local trace_characters = false trackers .register("nodes.characters", function(v) trace_characters = v end)
+local trace_fontrun = false trackers .register("nodes.fontrun", function(v) trace_fontrun = v end)
+
+local force_discrun = true directives.register("nodes.discrun", function(v) force_discrun = v end)
+local force_basepass = true directives.register("nodes.basepass", function(v) force_basepass = v end)
local report_fonts = logs.reporter("fonts","processing")
@@ -31,6 +34,7 @@ local handlers = nodes.handlers
local nuts = nodes.nuts
local tonut = nuts.tonut
+local tonode = nuts.tonode
local getattr = nuts.getattr
local getid = nuts.getid
@@ -38,6 +42,8 @@ local getfont = nuts.getfont
local getsubtype = nuts.getsubtype
local getchar = nuts.getchar
local getnext = nuts.getnext
+local getprev = nuts.getprev
+local getfield = nuts.getfield
local traverse_id = nuts.traverse_id
@@ -111,11 +117,25 @@ fonts.hashes.processes = fontprocesses
-- inside a run which means that we need to keep track of this which in turn complicates matters
-- in a way i don't like
+-- we need to deal with the basemode fonts here and can only run over ranges as we
+-- otherwise get luatex craches due to all kind of asserts in the disc/lig builder
+
+local ligaturing = node.ligaturing
+local kerning = node.kerning
+
function handlers.characters(head)
-- either next or not, but definitely no already processed list
starttiming(nodes)
- local usedfonts, attrfonts = { }, { }
- local a, u, prevfont, prevattr, done = 0, 0, nil, 0, false
+
+ local usedfonts = { }
+ local attrfonts = { }
+ local basefonts = { }
+ local a, u, b = 0, 0, 0
+ local basefont = nil
+ local prevfont = nil
+ local prevattr = 0
+ local done = false
+
if trace_fontrun then
run = run + 1
report_fonts()
@@ -136,43 +156,114 @@ function handlers.characters(head)
n = getnext(n)
end
end
- for n in traverse_id(glyph_code,tonut(head)) do
- -- if getsubtype(n) <256 then -- all are 1
- local font = getfont(n)
- local attr = getattr(n,0) or 0 -- zero attribute is reserved for fonts in context
- if font ~= prevfont or attr ~= prevattr then
- if attr > 0 then
- local used = attrfonts[font]
- if not used then
- used = { }
- attrfonts[font] = used
+
+ local nuthead = tonut(head)
+
+ for n in traverse_id(glyph_code,nuthead) do
+ if getsubtype(n) < 256 then -- all are 1
+ local font = getfont(n)
+ local attr = getattr(n,0) or 0 -- zero attribute is reserved for fonts in context
+ if font ~= prevfont or attr ~= prevattr then
+ if basefont then
+ basefont[2] = tonode(getprev(n)) -- todo, save p
end
- if not used[attr] then
- local fd = setfontdynamics[font]
- if fd then
- used[attr] = fd[attr]
- a = a + 1
+ if attr > 0 then
+ local used = attrfonts[font]
+ if not used then
+ used = { }
+ attrfonts[font] = used
+ end
+ if not used[attr] then
+ local fd = setfontdynamics[font]
+ if fd then
+ used[attr] = fd[attr]
+ a = a + 1
+ elseif force_basepass then
+ b = b + 1
+ basefont = { tonode(n), nil }
+ basefonts[b] = basefont
+ end
+ end
+ else
+ local used = usedfonts[font]
+ if not used then
+ local fp = fontprocesses[font]
+ if fp then
+ usedfonts[font] = fp
+ u = u + 1
+ elseif force_basepass then
+ b = b + 1
+ basefont = { tonode(n), nil }
+ basefonts[b] = basefont
+ end
end
end
- else
- local used = usedfonts[font]
- if not used then
- local fp = fontprocesses[font]
- if fp then
- usedfonts[font] = fp
- u = u + 1
- end
+ prevfont = font
+ prevattr = attr
+ end
+ end
+ end
+
+ -- could be an optional pass : seldom needed, only for documentation as a discretionary
+ -- with pre/post/replace will normally not occur on it's own
+
+ if force_discrun then
+
+ -- basefont is not supported in disc only runs ... it would mean a lot of
+ -- ranges .. we could try to run basemode as a separate processor run but
+ -- not for now (we can consider it when the new node code is tested
+
+ -- local prevfont = nil
+ -- local prevattr = 0
+
+ for d in traverse_id(disc_code,nuthead) do
+ -- we could use first_glyph
+ local r = getfield(n,"replace") -- good enough
+ if r then
+ for n in traverse_id(glyph_code,r) do
+ if getsubtype(n) < 256 then -- all are 1
+ local font = getfont(n)
+ local attr = getattr(n,0) or 0 -- zero attribute is reserved for fonts in context
+ if font ~= prevfont or attr ~= prevattr then
+ if attr > 0 then
+ local used = attrfonts[font]
+ if not used then
+ used = { }
+ attrfonts[font] = used
+ end
+ if not used[attr] then
+ local fd = setfontdynamics[font]
+ if fd then
+ used[attr] = fd[attr]
+ a = a + 1
+ end
+ end
+ else
+ local used = usedfonts[font]
+ if not used then
+ local fp = fontprocesses[font]
+ if fp then
+ usedfonts[font] = fp
+ u = u + 1
+ end
+ end
+ end
+ prevfont = font
+ prevattr = attr
+ end
+ end
+ break
end
end
- prevfont = font
- prevattr = attr
end
- -- end
+
end
+
if trace_fontrun then
report_fonts()
- report_fonts("statics : %s",(u > 0 and concat(keys(usedfonts)," ")) or "none")
- report_fonts("dynamics: %s",(a > 0 and concat(keys(attrfonts)," ")) or "none")
+ report_fonts("statics : %s",u > 0 and concat(keys(usedfonts)," ") or "none")
+ report_fonts("dynamics: %s",a > 0 and concat(keys(attrfonts)," ") or "none")
+ report_fonts("built-in: %s",b > 0 and b or "none")
report_fonts()
end
-- in context we always have at least 2 processors
@@ -224,6 +315,49 @@ function handlers.characters(head)
end
end
end
+ if b == 0 then
+ -- skip
+ elseif b == 1 then
+ -- only one font
+ local front = head == start
+ local range = basefonts[1]
+ local start = range[1]
+ local stop = range[2]
+ if stop then
+ start, stop = ligaturing(start,stop)
+ start, stop = kerning(start,stop)
+ elseif start then -- safeguard
+ start = ligaturing(start)
+ start = kerning(start)
+ else
+ -- something bad happened
+ end
+ if front then
+ -- shouldn't happen
+ head = start
+ end
+ else
+ -- multiple fonts
+ local front = head == start
+ for i=1,b do
+ local range = basefonts[i]
+ local start = range[1]
+ local stop = range[2]
+ if stop then
+ start, stop = ligaturing(start,stop)
+ start, stop = kerning(start,stop)
+ elseif start then -- safeguard
+ start = ligaturing(start)
+ start = kerning(start)
+ else
+ -- something bad happened
+ end
+ end
+ if front then
+ -- shouldn't happen
+ head = start
+ end
+ end
stoptiming(nodes)
if trace_characters then
nodes.report(head,done)
@@ -292,7 +426,9 @@ end
-- return false
-- end
-- end)
-
+--
+-- -- TODO: basepasses!
+--
-- function handlers.characters(head)
-- -- either next or not, but definitely no already processed list
-- starttiming(nodes)
@@ -408,3 +544,13 @@ local d_unprotect_glyphs = nuts.unprotect_glyphs
handlers.protectglyphs = function(n) return d_protect_glyphs (tonut(n)) end
handlers.unprotectglyphs = function(n) return d_unprotect_glyphs(tonut(n)) end
+
+-- function handlers.protectglyphs(h)
+-- local h = tonut(h)
+-- for n in traverse_id(disc_code,h) do
+-- local d = getfield(n,"pre") if d then d_protect_glyphs(d) end
+-- local d = getfield(n,"post") if d then d_protect_glyphs(d) end
+-- local d = getfield(n,"replace") if d then d_protect_glyphs(d) end
+-- end
+-- return d_protect_glyphs(h)
+-- end
diff --git a/Master/texmf-dist/tex/context/base/node-ini.lua b/Master/texmf-dist/tex/context/base/node-ini.lua
index a9ef305c03f..02d4c7a3fb8 100644
--- a/Master/texmf-dist/tex/context/base/node-ini.lua
+++ b/Master/texmf-dist/tex/context/base/node-ini.lua
@@ -154,9 +154,9 @@ local disccodes = allocate {
[0] = "discretionary", -- \discretionary
[1] = "explicit", -- \-
[2] = "automatic", -- following a -
- [3] = "regular", -- simple
- [4] = "first", -- hard first item
- [5] = "second", -- hard second item
+ [3] = "regular", -- by hyphenator: simple
+ [4] = "first", -- by hyphenator: hard first item
+ [5] = "second", -- by hyphenator: hard second item
}
local accentcodes = allocate {
@@ -206,7 +206,7 @@ nodes.whatcodes = whatcodes nodes.whatsitcodes = whatcodes -- more offici
nodes.listcodes = listcodes
nodes.glyphcodes = glyphcodes
nodes.kerncodes = kerncodes
-nodes.penaltycodes = kerncodes
+nodes.penaltycodes = penaltycodes
nodes.mathcodes = mathcodes
nodes.fillcodes = fillcodes
nodes.margincodes = margincodes
diff --git a/Master/texmf-dist/tex/context/base/node-ini.mkiv b/Master/texmf-dist/tex/context/base/node-ini.mkiv
index 5fc519069db..d04e647de42 100644
--- a/Master/texmf-dist/tex/context/base/node-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/node-ini.mkiv
@@ -35,7 +35,7 @@
\registerctxluafile{node-acc}{1.001} % experimental
%registerctxluafile{node-prp}{1.001} % makes no sense (yet)
-\doiffileelse{node-ppt.lua}{\registerctxluafile{node-ppt}{1.001}}{}
+\doifelsefile{node-ppt.lua}{\registerctxluafile{node-ppt}{1.001}}{}
\newcount\c_node_tracers_show_box % box number
diff --git a/Master/texmf-dist/tex/context/base/node-inj.lua b/Master/texmf-dist/tex/context/base/node-inj.lua
index b91646ffc1a..402403529c6 100644
--- a/Master/texmf-dist/tex/context/base/node-inj.lua
+++ b/Master/texmf-dist/tex/context/base/node-inj.lua
@@ -56,7 +56,7 @@ local insert_node_before = nuts.insert_before
local insert_node_after = nuts.insert_after
local a_kernpair = attributes.private('kernpair')
------ a_ligacomp = attributes.private('ligacomp')
+local a_ligacomp = attributes.private('ligacomp')
local a_markbase = attributes.private('markbase')
local a_markmark = attributes.private('markmark')
local a_markdone = attributes.private('markdone')
@@ -64,6 +64,8 @@ local a_cursbase = attributes.private('cursbase')
local a_curscurs = attributes.private('curscurs')
local a_cursdone = attributes.private('cursdone')
+local unsetvalue = attributes.unsetvalue
+
-- This injector has been tested by Idris Samawi Hamid (several arabic fonts as well as
-- the rather demanding Husayni font), Khaled Hosny (latin and arabic) and Kaj Eigner
-- (arabic, hebrew and thai) and myself (whatever font I come across). I'm pretty sure
@@ -84,6 +86,33 @@ local kerns = { }
-- For the moment we pass the r2l key ... volt/arabtype tests .. idris: this needs
-- checking with husayni (volt and fontforge).
+function injections.reset(n)
+-- if getattr(n,a_kernpair) then
+-- setattr(n,a_kernpair,unsetvalue)
+-- end
+-- if getattr(n,a_markdone) then
+-- setattr(n,a_markbase,unsetvalue)
+-- setattr(n,a_markmark,unsetvalue)
+-- setattr(n,a_markdone,unsetvalue)
+-- end
+-- if getattr(n,a_cursdone) then
+-- setattr(n,a_cursbase,unsetvalue)
+-- setattr(n,a_curscurs,unsetvalue)
+-- setattr(n,a_cursdone,unsetvalue)
+-- end
+-- if getattr(n,a_ligacomp) then
+-- setattr(n,a_ligacomp,unsetvalue)
+-- end
+end
+
+function injections.setligaindex(n,index)
+ setattr(n,a_ligacomp,index)
+end
+
+function injections.getligaindex(n,default)
+ return getattr(n,a_ligacomp) or default
+end
+
function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmnext)
local dx, dy = factor*(exit[1]-entry[1]), factor*(exit[2]-entry[2])
local ws, wn = tfmstart.width, tfmnext.width
@@ -343,7 +372,7 @@ function injections.handler(head,where,keep)
for i=maxt,1,-1 do
ny = ny + d[i]
local ti = t[i]
- setfield(ti,"yoffset",ny)
+ setfield(ti,"yoffset",ny) -- maybe add to current yoffset
end
maxt = 0
end
diff --git a/Master/texmf-dist/tex/context/base/node-ltp.lua b/Master/texmf-dist/tex/context/base/node-ltp.lua
index 6ad5de140b9..9529213fc37 100644
--- a/Master/texmf-dist/tex/context/base/node-ltp.lua
+++ b/Master/texmf-dist/tex/context/base/node-ltp.lua
@@ -406,13 +406,13 @@ end
-- resolvers --
-local whatsiters = {
+local whatsitters = {
get_width = { },
get_dimensions = { },
}
-local get_whatsit_width = whatsiters.get_width
-local get_whatsit_dimensions = whatsiters.get_dimensions
+local get_whatsit_width = whatsitters.get_width
+local get_whatsit_dimensions = whatsitters.get_dimensions
local function get_width (n,dir) return getfield(n,"width") end
local function get_dimensions(n,dir) return getfield(n,"width"), getfield(n,"height"), getfield(n,"depth") end
@@ -423,6 +423,8 @@ get_whatsit_width[pdfrefxform_code ] = get_width
get_whatsit_dimensions[pdfrefximage_code] = get_dimensions
get_whatsit_dimensions[pdfrefxform_code ] = get_dimensions
+nodes.whatsitters = whatsitters
+
-- expansion etc --
local function calculate_fraction(x,n,d,max_answer)
@@ -1243,6 +1245,7 @@ local function post_line_break(par)
setfield(prevlast,"post",nil)
end
elseif subtype == first_disc_code then
+ -- what is v ... next probably
if not (getid(v) == disc_code and getsubtype(v) == second_disc_code) then
report_parbuilders('unsupported disc at location %a',4)
end
@@ -2547,10 +2550,10 @@ function diagnostics.feasible_break(par, current, r, b, pi, d, artificial_demeri
par.font_in_short_display = short_display("log",getnext(printed_node),par.font_in_short_display)
else
local save_link = getnext(current)
- setfield(cur_p,"next",nil)
+ setfield(current,"next",nil)
write_nl("log","")
par.font_in_short_display = short_display("log",getnext(printed_node),par.font_in_short_display)
- setfield(cur_p,"next",save_link)
+ setfield(current,"next",save_link)
end
par.printed_node = current
end
@@ -3145,7 +3148,7 @@ local function hpack(head,width,method,direction,firstline,line) -- fast version
end
diagnostics.overfull_hbox(hlist,line,-delta)
end
- elseif order == 0 and hlist.list and last_badness > tex.hbadness then
+ elseif order == 0 and getlist(hlist) and last_badness > tex.hbadness then
diagnostics.bad_hbox(hlist,line,last_badness)
end
end
@@ -3154,6 +3157,8 @@ end
xpack_nodes = hpack -- comment this for old fashioned expansion (we need to fix float mess)
+constructors.methods.hpack = hpack
+
local function common_message(hlist,line,str)
write_nl("")
if status.output_active then -- unset
diff --git a/Master/texmf-dist/tex/context/base/node-nut.lua b/Master/texmf-dist/tex/context/base/node-nut.lua
index 2b4e9968c6e..32f2d57ec32 100644
--- a/Master/texmf-dist/tex/context/base/node-nut.lua
+++ b/Master/texmf-dist/tex/context/base/node-nut.lua
@@ -86,10 +86,14 @@ if not modules then modules = { } end modules ['node-met'] = {
-- luatex 3.9 sec / 54 pps
-- luajittex 2.3 sec / 93 pps
+local type, rawget = type, rawget
+
local nodes = nodes
local gonuts = nodes.gonuts
local direct = node.direct
+local fastcopy = table.fastcopy
+
if type(direct) ~= "table" then
return
elseif gonuts then
@@ -136,6 +140,20 @@ nuts.getsubtype = direct.getsubtype
nuts.getlist = direct.getlist -- only hlist and vlist !
nuts.getleader = direct.getleader
+-- local function track(name)
+-- local n = 0
+-- local f = nuts[name]
+-- function nuts[name](...)
+-- n = n + 1
+-- if n % 1000 == 0 then
+-- print(name,n)
+-- end
+-- return f(...)
+-- end
+-- end
+
+-- track("getsubtype")
+
-- local dgf = direct.getfield function nuts.getlist(n) return dgf(n,"list") end
-- setters
@@ -662,8 +680,14 @@ if propertydata then
data = propertydata,
}
- direct.set_properties_mode(true,false)
- -- direct.set_properties_mode(true,true)
+ -- direct.set_properties_mode(true,false) -- shallow copy ... problem: in fonts we then affect the originals too
+ direct.set_properties_mode(true,true) -- create metatable, slower but needed for font-inj.lua (unless we use an intermediate table)
+
+ -- todo:
+ --
+ -- function direct.set_properties_mode()
+ -- -- we really need the set modes
+ -- end
-- experimental code with respect to copying attributes has been removed
-- as it doesn't pay of (most attributes are only accessed once anyway)
@@ -700,3 +724,31 @@ else
nodes.getprop = setattr
end
+
+function nuts.copy_properties(source,target,what)
+ local newprops = propertydata[source]
+ if not newprops then
+ -- nothing to copy
+ return
+ end
+ if what then
+ -- copy one category
+ newprops = rawget(source,what)
+ if newprops then
+ newprops = fastcopy(newprops)
+ local p = rawget(propertydata,target)
+ if p then
+ p[what] = newprops
+ else
+ propertydata[target] = {
+ [what] = newprops,
+ }
+ end
+ end
+ else
+ -- copy all properties
+ newprops = fastcopy(newprops)
+ propertydata[target] = newprops
+ end
+ return newprops -- for checking
+end
diff --git a/Master/texmf-dist/tex/context/base/node-pro.lua b/Master/texmf-dist/tex/context/base/node-pro.lua
index 2cc00601c77..27e349893b6 100644
--- a/Master/texmf-dist/tex/context/base/node-pro.lua
+++ b/Master/texmf-dist/tex/context/base/node-pro.lua
@@ -55,7 +55,7 @@ do
return concat(t)
end
- local function tracer(what,state,head,groupcode,before,after,show)
+ function processors.tracer(what,state,head,groupcode,before,after,show)
if not groupcode then
groupcode = "unknown"
elseif groupcode == "" then
@@ -69,10 +69,10 @@ do
end
end
- processors.tracer = tracer
-
end
+local tracer = processors.tracer
+
processors.enabled = true -- this will become a proper state (like trackers)
function processors.pre_linebreak_filter(head,groupcode) -- ,size,packtype,direction
diff --git a/Master/texmf-dist/tex/context/base/node-ref.lua b/Master/texmf-dist/tex/context/base/node-ref.lua
index 78ef409bca5..9703cc184a9 100644
--- a/Master/texmf-dist/tex/context/base/node-ref.lua
+++ b/Master/texmf-dist/tex/context/base/node-ref.lua
@@ -16,6 +16,8 @@ if not modules then modules = { } end modules ['node-ref'] = {
-- is grouplevel still used?
+local concat = table.concat
+
local attributes, nodes, node = attributes, nodes, node
local allocate = utilities.storage.allocate, utilities.storage.mark
@@ -32,9 +34,11 @@ local colors = attributes.colors
local references = structures.references
local tasks = nodes.tasks
-local trace_backend = false trackers.register("nodes.backend", function(v) trace_backend = v end)
-local trace_references = false trackers.register("nodes.references", function(v) trace_references = v end)
-local trace_destinations = false trackers.register("nodes.destinations", function(v) trace_destinations = v end)
+local trace_references = false trackers.register("nodes.references", function(v) trace_references = v end)
+local trace_destinations = false trackers.register("nodes.destinations", function(v) trace_destinations = v end)
+local trace_areas = false trackers.register("nodes.areas", function(v) trace_areas = v end)
+local show_references = false trackers.register("nodes.references.show", function(v) show_references = tonumber(v) or (v and 2.25 or false) end)
+local show_destinations = false trackers.register("nodes.destinations.show", function(v) show_destinations = tonumber(v) or (v and 2.00 or false) end)
local report_reference = logs.reporter("backend","references")
local report_destination = logs.reporter("backend","destinations")
@@ -57,6 +61,7 @@ local setattr = nuts.setattr
local getsubtype = nuts.getsubtype
local hpack_list = nuts.hpack
+local vpack_list = nuts.vpack
local list_dimensions = nuts.dimensions
local traverse = nuts.traverse
local find_node_tail = nuts.tail
@@ -69,6 +74,8 @@ local listcodes = nodes.listcodes
local hlist_code = nodecodes.hlist
local vlist_code = nodecodes.vlist
local glue_code = nodecodes.glue
+local glyph_code = nodecodes.glyph
+local rule_code = nodecodes.rule
local whatsit_code = nodecodes.whatsit
local leftskip_code = skipcodes.leftskip
@@ -83,68 +90,147 @@ local line_code = listcodes.line
local new_rule = nodepool.rule
local new_kern = nodepool.kern
+local free_node = nuts.free
+
local tosequence = nodes.tosequence
--- local function dimensions(parent,start,stop)
--- stop = stop and getnext(stop)
--- if parent then
--- if stop then
--- return list_dimensions(getfield(parent,"glue_set"),getfield(parent,"glue_sign"),getfield(parent,"glue_order"),start,stop)
--- else
--- return list_dimensions(getfield(parent,"glue_set"),getfield(parent,"glue_sign",getfield(parent,"glue_order"),start)
--- end
--- else
--- if stop then
--- return list_dimensions(start,stop)
--- else
--- return list_dimensions(start)
--- end
--- end
--- end
---
--- -- more compact
+local implement = interfaces.implement
+
+-- Normally a (destination) area is a box or a simple stretch if nodes but when it is
+-- a paragraph we hav ea problem: we cannot calculate the height well. This happens
+-- with footnotes or content broken across a page.
+
+local function vlist_dimensions(start,stop)
+ local temp
+ if stop then
+ temp = getnext(stop)
+ setfield(stop,"next",nil)
+ end
+ local v = vpack_list(start)
+ local w = getfield(v,"width")
+ local h = getfield(v,"height")
+ local d = getfield(v,"depth")
+ setfield(v,"list",nil)
+ free_node(v)
+ if temp then
+ setfield(stop,"next",temp)
+ end
+ return w, h, d
+end
-local function dimensions(parent,start,stop)
+local function hlist_dimensions(start,stop,parent)
+ local last = stop and getnext(stop)
+ if parent then
+ return list_dimensions(getfield(parent,"glue_set"),getfield(parent,"glue_sign"),getfield(parent,"glue_order"),start,last)
+ else
+ return list_dimensions(start,last)
+ end
+end
+
+local function dimensions(parent,start,stop) -- in principle we could move some to the caller
+ local id = getid(start)
+ if start == stop then
+ if id == hlist_code or id == vlist_code or id == glyph_code or id == rule_code then -- or image
+ if trace_areas then
+ report_area("dimensions taken of %a",nodecodes[id])
+ end
+ return getfield(start,"width"), getfield(parent,"height"), getfield(parent,"depth")
+ else
+ if trace_areas then
+ report_area("dimensions calculated of %a",nodecodes[id])
+ end
+ return hlist_dimensions(start,stop) -- one node only so simple
+ end
+ end
+ local last = stop and getnext(stop)
if parent then
- return list_dimensions(getfield(parent,"glue_set"),getfield(parent,"glue_sign"),getfield(parent,"glue_order"),start,stop and getnext(stop))
+ -- todo: if no prev and no next and parent
+ -- todo: we need a a list_dimensions for a vlist
+ if getid(parent) == vlist_code then
+ local l = getlist(parent)
+ local c = l
+ local ok = false
+ while c do
+ if c == start then
+ ok = true
+ end
+ if ok and getid(c) == hlist_code then
+ break
+ else
+ c = getnext(c)
+ end
+ end
+ if ok and c then
+ if trace_areas then
+ report_area("dimensions taken of first line in vlist")
+ end
+ return getfield(c,"width"), getfield(c,"height"), getfield(c,"depth"), c
+ else
+ if trace_areas then
+ report_area("dimensions taken of vlist (probably wrong)")
+ end
+ return hlist_dimensions(start,stop,parent)
+ end
+ else
+ if trace_areas then
+ report_area("dimensions taken of range starting with %a using parent",nodecodes[id])
+ end
+ return hlist_dimensions(start,stop,parent)
+ end
else
- return list_dimensions(start,stop and getnext(stop))
+ if trace_areas then
+ report_area("dimensions taken of range starting with %a",nodecodes[id])
+ end
+ return hlist_dimensions(start,stop)
end
end
-- is pardir important at all?
local function inject_range(head,first,last,reference,make,stack,parent,pardir,txtdir)
- local width, height, depth = dimensions(parent,first,last)
+ local width, height, depth, line = dimensions(parent,first,last)
if txtdir == "+TRT" or (txtdir == "===" and pardir == "TRT") then -- KH: textdir == "===" test added
width = - width
end
local result, resolved = make(width,height,depth,reference)
if result and resolved then
- if head == first then
- if trace_backend then
- report_area("%s: %04i %s %s %s => w=%p, h=%p, d=%p, c=%S","head",
- reference,pardir or "---",txtdir or "---",tosequence(first,last,true),width,height,depth,resolved)
+ if line then
+ -- special case, we only treat the first line in a vlist
+ local l = getlist(line)
+ if trace_areas then
+ report_area("%s: %04i %s %s %s => w=%p, h=%p, d=%p, c=%S","line",
+ reference,pardir or "---",txtdir or "---",tosequence(l,nil,true),width,height,depth,resolved)
end
- setfield(result,"next",first)
- setfield(first,"prev",result)
- return result, last
+ setfield(line,"list",result)
+ setfield(result,"next",l)
+ setfield(l,"prev",result)
+ return head, last
else
- if trace_backend then
- report_area("%s: %04i %s %s %s => w=%p, h=%p, d=%p, c=%S","middle",
- reference,pardir or "---",txtdir or "---",tosequence(first,last,true),width,height,depth,resolved)
- end
- local prev = getprev(first)
- if prev then
- setfield(prev,"next",result)
- setfield(result,"prev",prev)
+ if head == first then
+ if trace_areas then
+ report_area("%s: %04i %s %s %s => w=%p, h=%p, d=%p, c=%S","head",
+ reference,pardir or "---",txtdir or "---",tosequence(first,last,true),width,height,depth,resolved)
+ end
+ setfield(result,"next",first)
+ setfield(first,"prev",result)
+ return result, last
+ else
+ if trace_areas then
+ report_area("%s: %04i %s %s %s => w=%p, h=%p, d=%p, c=%S","middle",
+ reference,pardir or "---",txtdir or "---",tosequence(first,last,true),width,height,depth,resolved)
+ end
+ local prev = getprev(first)
+ if prev then
+ setfield(prev,"next",result)
+ setfield(result,"prev",prev)
+ end
+ setfield(result,"next",first)
+ setfield(first,"prev",result)
+ -- if first == getnext(head) then
+ -- setfield(head,"next",result) -- hm, weird
+ -- end
+ return head, last
end
- setfield(result,"next",first)
- setfield(first,"prev",result)
--- if first == getnext(head) then
--- setfield(head,"next",result) -- hm, weird
--- end
- return head, last
end
else
return head, last
@@ -152,9 +238,12 @@ local function inject_range(head,first,last,reference,make,stack,parent,pardir,t
end
local function inject_list(id,current,reference,make,stack,pardir,txtdir)
- local width, height, depth, correction = getfield(current,"width"), getfield(current,"height"), getfield(current,"depth"), 0
- local moveright = false
- local first = getlist(current)
+ local width = getfield(current,"width")
+ local height = getfield(current,"height")
+ local depth = getfield(current,"depth")
+ local correction = 0
+ local moveright = false
+ local first = getlist(current)
if id == hlist_code then -- box_code line_code
-- can be either an explicit hbox or a line and there is no way
-- to recognize this; anyway only if ht/dp (then inline)
@@ -193,7 +282,7 @@ local function inject_list(id,current,reference,make,stack,pardir,txtdir)
local result, resolved = make(width,height,depth,reference)
-- todo: only when width is ok
if result and resolved then
- if trace_backend then
+ if trace_areas then
report_area("%s: %04i %s %s %s: w=%p, h=%p, d=%p, c=%S","box",
reference,pardir or "---",txtdir or "----","[]",width,height,depth,resolved)
end
@@ -227,6 +316,10 @@ local function inject_areas(head,attribute,make,stack,done,skip,parent,pardir,tx
while current do
local id = getid(current)
if id == hlist_code or id == vlist_code then
+
+ -- see dimensions: this is tricky with split off boxes like inserts
+ -- where we can end up with a first and last spanning lines
+
local r = getattr(current,attribute)
-- test \goto{test}[page(2)] test \gotobox{test}[page(2)]
-- test \goto{\TeX}[page(2)] test \gotobox{\hbox {x} \hbox {x}}[page(2)]
@@ -330,7 +423,7 @@ local function inject_area(head,attribute,make,stack,done,parent,pardir,txtdir)
return head, true
end
--- tracing
+-- tracing: todo: use predefined colors
local register_color = colors.register
@@ -341,7 +434,33 @@ local u_transparency = nil
local u_colors = { }
local force_gray = true
-local function colorize(width,height,depth,n,reference,what)
+local function addstring(what,str,shift) --todo make a pluggable helper (in font-ctx)
+ if str then
+ local typesetters = nuts.typesetters
+ if typesetters then
+ local hashes = fonts.hashes
+ local infofont = fonts.infofont()
+ local emwidth = hashes.emwidths [infofont]
+ local exheight = hashes.exheights[infofont]
+ if what == "reference" then
+ str = str .. " "
+ shift = - (shift or 2.25) * exheight
+ else
+ str = str .. " "
+ shift = (shift or 2) * exheight
+ end
+ local text = typesetters.fast_hpack(str,infofont)
+ local rule = new_rule(emwidth/5,4*exheight,3*exheight)
+ local list = getlist(text)
+ setfield(text,"shift",shift)
+ return nuts.fasthpack(nuts.linked(text,rule))
+ -- local text = typesetters.fast_hpack(str,fonts.infofont())
+ -- return text
+ end
+ end
+end
+
+local function colorize(width,height,depth,n,reference,what,sr,offset)
if force_gray then n = 0 end
u_transparency = u_transparency or transparencies.register(nil,2,.65)
local ucolor = u_colors[n]
@@ -379,10 +498,37 @@ local function colorize(width,height,depth,n,reference,what)
setfield(rule,"prev",kern)
return kern
else
+
+if sr and sr ~= "" then
+ local text = addstring(what,sr,shift)
+ if text then
+ local kern = new_kern(-getfield(text,"width"))
+ setfield(kern,"next",text)
+ setfield(text,"prev",kern)
+ setfield(text,"next",rule)
+ setfield(rule,"prev",text)
+ return kern
+ end
+end
+
return rule
end
end
+local function justadd(what,sr,shift)
+ if sr and sr ~= "" then
+ local text = addstring(what,sr,shift)
+ if text then
+ local kern = new_kern(-getfield(text,"width"))
+ setfield(kern,"next",text)
+ setfield(text,"prev",kern)
+ setfield(text,"next",rule)
+ setfield(rule,"prev",text)
+ return kern
+ end
+ end
+end
+
-- references:
local texsetattribute = tex.setattribute
@@ -423,23 +569,45 @@ local function makereference(width,height,depth,reference) -- height and depth a
report_reference("resolving attribute %a",reference)
end
local resolved, ht, dp, set, n = sr[1], sr[2], sr[3], sr[4], sr[5]
--- logs.report("temp","child: ht=%p dp=%p, parent: ht=%p dp=%p",ht,dp,height,depth)
+ -- logs.report("temp","child: ht=%p dp=%p, parent: ht=%p dp=%p",ht,dp,height,depth)
if ht then
if height < ht then height = ht end
if depth < dp then depth = dp end
end
--- logs.report("temp","used: ht=%p dp=%p",height,depth)
--- step = 0
+ -- logs.report("temp","used: ht=%p dp=%p",height,depth)
local annot = nodeinjections.reference(width,height,depth,set)
if annot then
-annot = tonut(annot)
+ annot = tonut(annot) -- todo
nofreferences = nofreferences + 1
- local result, current
+ local result, current, texts
+ if show_references then
+ local d = sr[1]
+ if d then
+ local r = d.reference
+ local p = d.prefix
+ if r then
+ if p then
+ texts = p .. "|" .. r
+ else
+ texts = r
+ end
+ else
+ -- t[#t+1] = d.internal or "?"
+ end
+ end
+ end
if trace_references then
local step = 65536
- result = hpack_list(colorize(width,height-step,depth-step,2,reference,"reference")) -- step subtracted so that we can see seperate links
+ result = hpack_list(colorize(width,height-step,depth-step,2,reference,"reference",texts,show_references)) -- step subtracted so that we can see seperate links
setfield(result,"width",0)
current = result
+ elseif texts then
+ texts = justadd("reference",texts,show_references)
+ if texts then
+ result = hpack_list(texts)
+ setfield(result,"width",0)
+ current = result
+ end
end
if current then
setfield(current,"next",annot)
@@ -506,19 +674,49 @@ local function makedestination(width,height,depth,reference)
if trace_destinations then
report_destination("resolving attribute %a",reference)
end
- local resolved, ht, dp, name, view = sr[1], sr[2], sr[3], sr[4], sr[5]
+ local resolved, ht, dp, name, view = sr[1], sr[2], sr[3], sr[4], sr[5] -- sr[4] will change to just internal
if ht then
if height < ht then height = ht end
if depth < dp then depth = dp end
end
- local result, current
+ local result, current, texts
+ if show_destinations then
+ if name and #name > 0 then
+ local t = { }
+ for i=1,#name do
+ local s = name[i]
+ if type(s) == "number" then
+ local d = references.internals[s]
+ if d then
+ d = d.references
+ local r = d.reference
+ local p = d.usedprefix
+ if r then
+ if p then
+ t[#t+1] = p .. "|" .. r
+ else
+ t[#t+1] = r
+ end
+ else
+ -- t[#t+1] = d.internal or "?"
+ end
+ end
+ else
+ -- in fact we have a prefix:name here
+ end
+ end
+ if #t > 0 then
+ texts = concat(t," & ")
+ end
+ end
+ end
if trace_destinations then
local step = 0
if width == 0 then
step = 4*65536
width, height, depth = 5*step, 5*step, 0
end
- local rule = hpack_list(colorize(width,height,depth,3,reference,"destination"))
+ local rule = hpack_list(colorize(width,height,depth,3,reference,"destination",texts,show_destinations))
setfield(rule,"width",0)
if not result then
result, current = rule, rule
@@ -528,6 +726,15 @@ local function makedestination(width,height,depth,reference)
current = rule
end
width, height = width - step, height - step
+ elseif texts then
+ texts = justadd("destination",texts,show_destinations)
+ if texts then
+ result = hpack_list(texts)
+ if result then
+ setfield(result,"width",0)
+ current = result
+ end
+ end
end
nofdestinations = nofdestinations + 1
local annot = nodeinjections.destination(width,height,depth,name,view)
@@ -580,14 +787,17 @@ function references.mark(reference,h,d,view)
return setdestination(tex.currentgrouplevel,h,d,reference,view)
end
-function references.inject(prefix,reference,h,d,highlight,newwindow,layer) -- todo: use currentreference is possible
+function references.inject(prefix,reference,specification) -- todo: use currentreference is possible
+-- print(prefix,reference,h,d,highlight,newwindow,layer)
local set, bug = references.identify(prefix,reference)
if bug or #set == 0 then
-- unknown ref, just don't set it and issue an error
else
-- check
- set.highlight, set.newwindow, set.layer = highlight, newwindow, layer
- setreference(h,d,set) -- sets attribute / todo: for set[*].error
+ set.highlight = specification.highlight
+ set.newwindow = specification.newwindow
+ set.layer = specification.layer
+ setreference(specification.height,specification.depth,set) -- sets attribute / todo: for set[*].error
end
end
@@ -598,8 +808,32 @@ function references.injectcurrentset(h,d) -- used inside doifelse
end
end
-commands.injectreference = references.inject
-commands.injectcurrentreference = references.injectcurrentset
+implement {
+ name = "injectreference",
+ actions = references.inject,
+ arguments = {
+ "string",
+ "string",
+ {
+ { "highlight", "boolean" },
+ { "newwindow", "boolean" },
+ { "layer" },
+ { "height", "dimen" },
+ { "depth", "dimen" },
+ }
+ }
+}
+
+implement {
+ name = "injectcurrentreference",
+ actions = references.injectcurrentset,
+}
+
+implement {
+ name = "injectcurrentreferencehtdp",
+ actions = references.injectcurrentset,
+ arguments = { "dimen", "dimen" },
+}
--
@@ -628,4 +862,11 @@ end)
function references.enableinteraction()
tasks.enableaction("shipouts","nodes.references.handler")
tasks.enableaction("shipouts","nodes.destinations.handler")
+ function references.enableinteraction() end
end
+
+implement {
+ name = "enableinteraction",
+ actions = references.enableinteraction,
+ onlyonce = true
+}
diff --git a/Master/texmf-dist/tex/context/base/node-res.lua b/Master/texmf-dist/tex/context/base/node-res.lua
index 1a9d6f02e2e..43dd3895ed6 100644
--- a/Master/texmf-dist/tex/context/base/node-res.lua
+++ b/Master/texmf-dist/tex/context/base/node-res.lua
@@ -146,6 +146,7 @@ local user_n = register_nut(new_nut("whatsit",whatsitcodes.userdefine
local user_l = register_nut(new_nut("whatsit",whatsitcodes.userdefined)) setfield(user_l,"type",110) -- 44
local user_s = register_nut(new_nut("whatsit",whatsitcodes.userdefined)) setfield(user_s,"type",115) -- 44
local user_t = register_nut(new_nut("whatsit",whatsitcodes.userdefined)) setfield(user_t,"type",116) -- 44
+----- user_c = register_nut(new_nut("whatsit",whatsitcodes.userdefined)) setfield(user_c,"type",108) -- 44
local left_margin_kern = register_nut(new_nut("margin_kern",0))
local right_margin_kern = register_nut(new_nut("margin_kern",1))
local lineskip = register_nut(new_nut("glue",skipcodes.lineskip))
@@ -504,6 +505,17 @@ function nutpool.usertokens(id,tokens)
return n
end
+-- function nutpool.usercode(id,code)
+-- local n = copy_nut(user_c)
+-- if code then
+-- setfield(n,"user_id",id)
+-- setfield(n,"value",code)
+-- else
+-- setfield(n,"value",id)
+-- end
+-- return n
+-- end
+
function nutpool.special(str)
local n = copy_nut(special)
setfield(n,"data",str)
diff --git a/Master/texmf-dist/tex/context/base/node-rul.lua b/Master/texmf-dist/tex/context/base/node-rul.lua
index 6f3bc9df9e6..36d56a16c1a 100644
--- a/Master/texmf-dist/tex/context/base/node-rul.lua
+++ b/Master/texmf-dist/tex/context/base/node-rul.lua
@@ -424,3 +424,52 @@ nodes.shifts.handler = function(head) return process(a_shifted,data,flush_shifte
function nodes.shifts.enable()
tasks.enableaction("shipouts","nodes.shifts.handler")
end
+
+-- interface
+
+local implement = interfaces.implement
+
+implement {
+ name = "definerule",
+ actions = { nodes.rules.define, context },
+ arguments = {
+ {
+ { "continue" },
+ { "unit" },
+ { "order" },
+ { "method", "integer" },
+ { "offset", "number" },
+ { "rulethickness", "string" },
+ { "dy", "number" },
+ { "max", "number" },
+ { "ma", "integer" },
+ { "ca", "integer" },
+ { "ta", "integer" },
+ }
+ }
+}
+
+implement {
+ name = "enablerules",
+ onlyonce = true,
+ actions = nodes.rules.enable
+}
+
+implement {
+ name = "defineshift",
+ actions = { nodes.shifts.define, context },
+ arguments = {
+ {
+ { "continue" },
+ { "unit" },
+ { "method", "integer" },
+ { "dy", "number" },
+ }
+ }
+}
+
+implement {
+ name = "enableshifts",
+ onlyonce = true,
+ actions = nodes.shifts.enable
+}
diff --git a/Master/texmf-dist/tex/context/base/node-rul.mkiv b/Master/texmf-dist/tex/context/base/node-rul.mkiv
index 2d2e61134ef..7fa0473a5ff 100644
--- a/Master/texmf-dist/tex/context/base/node-rul.mkiv
+++ b/Master/texmf-dist/tex/context/base/node-rul.mkiv
@@ -112,19 +112,20 @@
\unexpanded\def\node_rules_define
{\edef\p_node_rules_color{\barparameter\c!color}%
- \setevalue{\??barattribute\currentbar}{\number\ctxlua{nodes.rules.define {
- method = \barparameter\c!method,
- offset = \barparameter\c!offset,
- continue = "\barparameter\c!continue",
- dy = \barparameter\c!dy,
- rulethickness = "\barparameter\c!rulethickness",
- unit = "\barparameter\c!unit",
- order = "\barparameter\c!order",
- max = \barparameter\c!max,
- ma = \thecolormodelattribute,
- ca = \thecolorattribute\p_node_rules_color,
- ta = \thetransparencyattribute\p_node_rules_color
- }}}}
+ \setevalue{\??barattribute\currentbar}{\number
+ \clf_definerule
+ continue {\barparameter\c!continue}%
+ unit {\barparameter\c!unit}%
+ order {\barparameter\c!order}%
+ rulethickness {\barparameter\c!rulethickness}%
+ method \barparameter\c!method
+ ma \thecolormodelattribute
+ ca \thecolorattribute\p_node_rules_color
+ ta \thetransparencyattribute\p_node_rules_color
+ offset \barparameter\c!offset\space % number
+ dy \barparameter\c!dy\space % number
+ max \barparameter\c!max
+ \relax}}
\unexpanded\def\node_rules_redefine#1%
{\def\currentbar{#1}\node_rules_define}
@@ -132,13 +133,16 @@
\unexpanded\def\node_rules_direct#1%
{\groupedcommand{\node_rules_set{#1}}\relax}
-\def\node_rules_set
- {\ctxlua{nodes.rules.enable()}% will be moved to lua
- \glet\node_rules_set\node_rules_set_indeed
- \node_rules_set}
+% \unexpanded\def\node_rules_set
+% {\clf_enablerules % will be moved to lua
+% \glet\node_rules_set\node_rules_set_indeed
+% \node_rules_set}
+%
+%\unexpanded\def\node_rules_set_indeed#1% maybe reverse the 1000 (also maybe use more attributes instead of settings)
-\def\node_rules_set_indeed#1% maybe reverse the 1000 (also maybe use more attributes instead of settings)
- {\edef\currentbar{#1}%
+\unexpanded\def\node_rules_set#1% maybe reverse the 1000 (also maybe use more attributes instead of settings)
+ {\clf_enablerules % will be relaxed
+ \edef\currentbar{#1}%
\expandafter\let\expandafter\c_node_rules_index\csname\??barindex#1\endcsname
\advance\c_node_rules_index\plusone
\usebarstyleandcolor\c!foregroundstyle\c!foregroundcolor
@@ -157,6 +161,8 @@
\unexpanded\def\setbar[#1]%
{\node_rules_set{#1}}
+\let\directsetbar\node_rules_set
+
% ungrouped
\newcount\c_node_rules_nesting % todo: same as colors
@@ -279,31 +285,27 @@
\to \everydefineshift
\unexpanded\def\node_shifts_define
- {\setevalue{\??shiftattribute\currentshift}{\number\ctxlua{nodes.shifts.define {
- method = \shiftparameter\c!method,
- continue = "\shiftparameter\c!continue",
- dy = \shiftparameter\c!dy,
- unit = "\shiftparameter\c!unit",
- }}}}
+ {\setevalue{\??shiftattribute\currentshift}{\number
+ \clf_defineshift
+ continue {\shiftparameter\c!continue}%
+ unit {\shiftparameter\c!unit}%
+ method \shiftparameter\c!method
+ dy \shiftparameter\c!dy % number
+ \relax}}
\unexpanded\def\node_shifts_redefine#1%
{\def\currentshift{#1}\node_shifts_define}
-\unexpanded\def\node_shifts_set
- {\ctxlua{nodes.shifts.enable()}%
- \glet\node_shifts_set\node_shifts_set_indeed
- \node_shifts_set}
-
-% \unexpanded\def\node_shifts_direct#1%
-% {\doisolatedgroupedalign{\node_shifts_set{#1}}\donothing}
-
-\unexpanded\def\node_shifts_direct#1%
- {\groupedcommand
- {\begingroup\dostartisolation\begingroup\node_shifts_set{#1}}
- {\endgroup\dostopisolation\endgroup}}
+% \unexpanded\def\node_shifts_set
+% {\clf_enableshifts
+% \glet\node_shifts_set\node_shifts_set_indeed
+% \node_shifts_set}
+%
+% \def\node_shifts_set_indeed#1% todo: check parent !
-\def\node_shifts_set_indeed#1% todo: check parent !
- {\def\currentshift{#1}%
+\unexpanded\def\node_shifts_set#1% todo: check parent !
+ {\clf_enableshifts
+ \def\currentshift{#1}%
\expandafter\let\expandafter\c_node_shifts_index\csname\??shiftindex#1\endcsname
\advance\c_node_shifts_index\plusone
\attribute\shiftedattribute\numexpr
@@ -320,6 +322,14 @@
\unexpanded\def\stopshift
{\endgroup}
+% \unexpanded\def\node_shifts_direct#1%
+% {\doisolatedgroupedalign{\node_shifts_set{#1}}\donothing}
+
+\unexpanded\def\node_shifts_direct#1%
+ {\groupedcommand
+ {\begingroup\dostartisolation\begingroup\node_shifts_set{#1}}
+ {\endgroup\dostopisolation\endgroup}}
+
\setupshifts
[\c!method=0,
\c!continue=\v!no,
diff --git a/Master/texmf-dist/tex/context/base/node-shp.lua b/Master/texmf-dist/tex/context/base/node-shp.lua
index 6ebfd767fb4..42cc83b8f34 100644
--- a/Master/texmf-dist/tex/context/base/node-shp.lua
+++ b/Master/texmf-dist/tex/context/base/node-shp.lua
@@ -15,6 +15,8 @@ local setmetatableindex = table.setmetatableindex
local nodecodes = nodes.nodecodes
local whatsitcodes = nodes.whatsitcodes
+local disccodes = nodes.disccodes
+
local tasks = nodes.tasks
local handlers = nodes.handlers
@@ -26,11 +28,27 @@ local kern_code = nodecodes.kern
local glue_code = nodecodes.glue
local whatsit_code = nodecodes.whatsit
+local fulldisc_code = disccodes.discretionary
+
local texgetbox = tex.getbox
-local free_node = node.free
-local remove_node = node.remove
-local traverse_nodes = node.traverse
+local implement = interfaces.implement
+
+local nuts = nodes.nuts
+local tonut = nuts.tonut
+local tonode = nuts.tonode
+local free_node = nuts.free
+local remove_node = nuts.remove
+local traverse_nodes = nuts.traverse
+local find_tail = nuts.tail
+
+local getfield = nuts.getfield
+local setfield = nuts.setfield
+local getid = nuts.getid
+local getnext = nuts.getnext
+local getprev = nuts.getprev
+local getlist = nuts.getlist
+local getsubtype = nuts.getsubtype
local removables = {
[whatsitcodes.open] = true,
@@ -41,38 +59,63 @@ local removables = {
[whatsitcodes.latelua] = true,
}
-local function cleanup_redundant(head)
+-- About 10% of the nodes make no sense for the backend. By (at least)
+-- removing the replace disc nodes, we can omit extensive checking in
+-- the finalizer code (e.g. colors in disc nodes). Removing more nodes
+-- (like marks) is not saving much and removing empty boxes is even
+-- dangerous because we can rely on dimensions (e.g. in references).
+
+local wipedisc = false -- we can use them in the export ... can be option
+
+local function cleanup_redundant(head) -- better name is: flatten_page
local start = head
while start do
- local id = start.id
+ local id = getid(start)
if id == disc_code then
- head, start = remove_node(head,start,true)
- -- elseif id == glue_code then
- -- if start.writable then
- -- start = start.next
- -- elseif some_complex_check_on_glue_spec then
- -- head, start = remove_node(head,start,true)
- -- else
- -- start = start.next
- -- end
- elseif id == kern_code then
- if start.kern == 0 then
- head, start = remove_node(head,start,true)
+ if getsubtype(start) == fulldisc_code then
+ local replace = getfield(start,"replace")
+ if replace then
+ local prev = getprev(start)
+ local next = getnext(start)
+ local tail = find_tail(replace)
+ setfield(start,"replace",nil)
+ if start == head then
+ remove_node(head,start,true)
+ head = replace
+ else
+ remove_node(head,start,true)
+ end
+ if next then
+ setfield(tail,"next",next)
+ setfield(next,"prev",tail)
+ end
+ if prev then
+ setfield(prev,"next",replace)
+ setfield(replace,"prev",prev)
+ else
+ setfield(replace,"prev",nil) -- to be sure
+ end
+ start = next
+ elseif wipedisc then
+ -- pre and post can have values
+ head, start = remove_node(head,start,true)
+ else
+ start = getnext(start)
+ end
else
- start = start.next
+ start = getnext(start)
end
- elseif id == mark_code then
- head, start = remove_node(head,start,true)
elseif id == hlist_code or id == vlist_code then
- local sl = start.list
+ local sl = getlist(start)
if sl then
- start.list = cleanup_redundant(sl)
- start = start.next
- else
- head, start = remove_node(head,start,true)
+ local rl = cleanup_redundant(sl)
+ if rl ~= sl then
+ setfield(start,"list",rl)
+ end
end
+ start = getnext(start)
else
- start = start.next
+ start = getnext(start)
end
end
return head
@@ -81,54 +124,49 @@ end
local function cleanup_flushed(head) -- rough
local start = head
while start do
- local id = start.id
- if id == whatsit_code and removables[start.subtype] then
- head, start = remove_node(head,start,true)
+ local id = getid(start)
+ if id == whatsit_code then
+ if removables[getsubtype(start)] then
+ head, start = remove_node(head,start,true)
+ else
+ start = getnext(start)
+ end
elseif id == hlist_code or id == vlist_code then
- local sl = start.list
+ local sl = getlist(start)
if sl then
- start.list = cleanup_flushed(sl)
- start = start.next
- else
- head, start = remove_node(head,start,true)
+ local rl = cleanup_flushed(sl)
+ if rl ~= sl then
+ setfield(start,"list",rl)
+ end
end
+ start = getnext(start)
else
- start = start.next
+ start = getnext(start)
end
end
return head
end
function handlers.cleanuppage(head)
- -- about 10% of the nodes make no sense for the backend
- return cleanup_redundant(head), true
+ return tonode(cleanup_redundant(tonut(head))), true
end
function handlers.cleanupbox(head)
- return cleanup_flushed(head), true
+ return tonode(cleanup_flushed(tonut(head))), true
end
-directives.register("backend.cleanup", function()
- tasks.enableaction("shipouts","nodes.handlers.cleanuppage")
-end)
-
local actions = tasks.actions("shipouts") -- no extra arguments
function handlers.finalize(head) -- problem, attr loaded before node, todo ...
return actions(head)
end
-function commands.cleanupbox(n)
- cleanup_flushed(texgetbox(n))
-end
-
-- handlers.finalize = actions
-- interface
-function commands.finalizebox(n)
- actions(texgetbox(n))
-end
+implement { name = "cleanupbox", actions = { texgetbox, cleanup_flushed }, arguments = "integer" }
+implement { name = "finalizebox", actions = { texgetbox, actions }, arguments = "integer" }
-- just in case we want to optimize lookups:
@@ -158,12 +196,12 @@ local function count(head,data,subcategory)
-- no components, pre, post, replace .. can maybe an option .. but
-- we use this for optimization so it makes sense to look the the
-- main node only
- for n in traverse_nodes(head) do
- local id = n.id
- local dn = data[nodecodes[n.id]]
+ for n in traverse_nodes(tonut(head)) do
+ local id = getid(n)
+ local dn = data[nodecodes[id]] -- we could use id and then later convert to nodecodes
dn[subcategory] = dn[subcategory] + 1
if id == hlist_code or id == vlist_code then
- count(n.list,data,subcategory)
+ count(getfield(n,"list"),data,subcategory)
end
end
end
diff --git a/Master/texmf-dist/tex/context/base/node-tex.lua b/Master/texmf-dist/tex/context/base/node-tex.lua
index 2170e0603fd..c9d3091df23 100644
--- a/Master/texmf-dist/tex/context/base/node-tex.lua
+++ b/Master/texmf-dist/tex/context/base/node-tex.lua
@@ -6,33 +6,32 @@ if not modules then modules = { } end modules ['node-tex'] = {
license = "see context related readme files"
}
-local format = string.format
+builders = builders or { }
+local kernel = builders.kernel or { }
+builders.kernel = kernel
-builders = builders or { }
-builders.kernel = builders.kernel or { }
-local kernel = builders.kernel
+local hyphenate = lang.hyphenate
+local ligaturing = node.ligaturing
+local kerning = node.kerning
-local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
-local hyphenate, ligaturing, kerning = lang.hyphenate, node.ligaturing, node.kerning
+kernel.originals = {
+ hyphenate = hyphenate,
+ ligaturing = ligaturing,
+ kerning = kerning,
+}
function kernel.hyphenation(head)
- -- starttiming(kernel)
local done = hyphenate(head)
- -- stoptiming(kernel)
return head, done
end
function kernel.ligaturing(head)
- -- starttiming(kernel)
- local head, tail, done = ligaturing(head) -- todo: check what is returned
- -- stoptiming(kernel)
+ local head, tail, done = ligaturing(head) -- we return 3 values indeed
return head, done
end
function kernel.kerning(head)
- -- starttiming(kernel)
- local head, tail, done = kerning(head) -- todo: check what is returned
- -- stoptiming(kernel)
+ local head, tail, done = kerning(head) -- we return 3 values indeed
return head, done
end
diff --git a/Master/texmf-dist/tex/context/base/node-tra.lua b/Master/texmf-dist/tex/context/base/node-tra.lua
index 08110727705..a7ab7f77f72 100644
--- a/Master/texmf-dist/tex/context/base/node-tra.lua
+++ b/Master/texmf-dist/tex/context/base/node-tra.lua
@@ -78,6 +78,7 @@ local localpar_code = whatcodes.localpar
local dir_code = whatcodes.dir
local dimenfactors = number.dimenfactors
+local fillorders = nodes.fillcodes
local formatters = string.formatters
-- this will be reorganized:
@@ -171,6 +172,7 @@ local function tosequence(start,stop,compact)
end
nodes.tosequence = tosequence
+nuts .tosequence = tosequence
function nodes.report(t,done)
report_nodes("output %a, %changed %a, %s nodes",status.output_active,done,count_nodes(tonut(t)))
@@ -318,8 +320,12 @@ local function listtoutf(h,joiner,textonly,last)
end
function nodes.listtoutf(h,joiner,textonly,last)
- local joiner = joiner == true and utfchar(0x200C) or joiner -- zwnj
- return listtoutf(tonut(h),joiner,textonly,last and tonut(last))
+ if h then
+ local joiner = joiner == true and utfchar(0x200C) or joiner -- zwnj
+ return listtoutf(tonut(h),joiner,textonly,last and tonut(last))
+ else
+ return ""
+ end
end
local what = { [0] = "unknown", "line", "box", "indent", "row", "cell" }
@@ -353,82 +359,175 @@ local stripper = lpeg.patterns.stripzeros
--
-- redefined:
-local dimenfactors = number.dimenfactors
+-- local function nodetodimen(d,unit,fmt,strip)
+-- d = tonut(d) -- tricky: direct nuts are an issue
+-- if unit == true then
+-- unit = "pt"
+-- fmt = "%0.5f%s"
+-- else
+-- unit = unit or 'pt'
+-- if not fmt then
+-- fmt = "%s%s"
+-- elseif fmt == true then
+-- fmt = "%0.5f%s"
+-- end
+-- end
+-- local id = getid(d)
+-- if id == kern_code then
+-- local str = formatters[fmt](getfield(d,"width")*dimenfactors[unit],unit)
+-- return strip and lpegmatch(stripper,str) or str
+-- end
+-- if id == glue_code then
+-- d = getfield(d,"spec")
+-- end
+-- if not d or not getid(d) == gluespec_code then
+-- local str = formatters[fmt](0,unit)
+-- return strip and lpegmatch(stripper,str) or str
+-- end
+-- local width = getfield(d,"width")
+-- local plus = getfield(d,"stretch_order")
+-- local minus = getfield(d,"shrink_order")
+-- local stretch = getfield(d,"stretch")
+-- local shrink = getfield(d,"shrink")
+-- if plus ~= 0 then
+-- plus = " plus " .. stretch/65536 .. fillcodes[plus]
+-- elseif stretch ~= 0 then
+-- plus = formatters[fmt](stretch*dimenfactors[unit],unit)
+-- plus = " plus " .. (strip and lpegmatch(stripper,plus) or plus)
+-- else
+-- plus = ""
+-- end
+-- if minus ~= 0 then
+-- minus = " minus " .. shrink/65536 .. fillcodes[minus]
+-- elseif shrink ~= 0 then
+-- minus = formatters[fmt](shrink*dimenfactors[unit],unit)
+-- minus = " minus " .. (strip and lpegmatch(stripper,minus) or minus)
+-- else
+-- minus = ""
+-- end
+-- local str = formatters[fmt](getfield(d,"width")*dimenfactors[unit],unit)
+-- return (strip and lpegmatch(stripper,str) or str) .. plus .. minus
+-- end
+--
+-- local function numbertodimen(d,unit,fmt,strip)
+-- if not d then
+-- local str = formatters[fmt](0,unit)
+-- return strip and lpegmatch(stripper,str) or str
+-- end
+-- local t = type(d)
+-- if t == 'string' then
+-- return d
+-- elseif t == "number" then
+-- if unit == true then
+-- unit = "pt"
+-- fmt = "%0.5f%s"
+-- else
+-- unit = unit or 'pt'
+-- if not fmt then
+-- fmt = "%s%s"
+-- elseif fmt == true then
+-- fmt = "%0.5f%s"
+-- end
+-- end
+-- local str = formatters[fmt](d*dimenfactors[unit],unit)
+-- return strip and lpegmatch(stripper,str) or str
+-- else
+-- return nodetodimen(d,unit,fmt,strip) -- real node
+-- end
+-- end
-local function nodetodimen(d,unit,fmt,strip)
- d = tonut(d) -- tricky: direct nuts are an issue
- if unit == true then
- unit = "pt"
- fmt = "%0.5f%s"
- else
- unit = unit or 'pt'
- if not fmt then
- fmt = "%s%s"
- elseif fmt == true then
- fmt = "%0.5f%s"
- end
- end
- local id = getid(d)
+local f_f_f = formatters["%0.5Fpt plus %0.5F%s minus %0.5F%s"]
+local f_f_m = formatters["%0.5Fpt plus %0.5F%s minus %0.5Fpt"]
+local f_p_f = formatters["%0.5Fpt plus %0.5Fpt minus %0.5F%s"]
+local f_p_m = formatters["%0.5Fpt plus %0.5Fpt minus %0.5Fpt"]
+local f_f_z = formatters["%0.5Fpt plus %0.5F%s"]
+local f_p_z = formatters["%0.5Fpt plus %0.5Fpt"]
+local f_z_f = formatters["%0.5Fpt minus %0.5F%s"]
+local f_z_m = formatters["%0.5Fpt minus %0.5Fpt"]
+local f_z_z = formatters["%0.5Fpt"]
+
+local tonut = nodes.tonut
+local getfield = nodes.nuts.getfield
+
+local function nodetodimen(n)
+ n = tonut(n)
+ local id = getid(n)
if id == kern_code then
- local str = formatters[fmt](getfield(d,"width")*dimenfactors[unit],unit)
- return strip and lpegmatch(stripper,str) or str
+ local width = getfield(n,"width")
+ if width == 0 then
+ return "0pt"
+ else
+ return f_z_z(width)
+ end
end
if id == glue_code then
- d = getfield(d,"spec")
+ n = getfield(n,"spec")
end
- if not d or not getid(d) == gluespec_code then
- local str = formatters[fmt](0,unit)
- return strip and lpegmatch(stripper,str) or str
+ if not n or not getid(n) == gluespec_code then
+ return "0pt"
end
- local width = getfield(d,"width")
- local plus = getfield(d,"stretch_order")
- local minus = getfield(d,"shrink_order")
- local stretch = getfield(d,"stretch")
- local shrink = getfield(d,"shrink")
- if plus ~= 0 then
- plus = " plus " .. stretch/65536 .. fillcodes[plus]
+ local stretch_order = getfield(n,"stretch_order")
+ local shrink_order = getfield(n,"shrink_order")
+ local stretch = getfield(n,"stretch") / 65536
+ local shrink = getfield(n,"shrink") / 65536
+ local width = getfield(n,"width") / 65536
+ if stretch_order ~= 0 then
+ if shrink_order ~= 0 then
+ return f_f_f(width,stretch,fillorders[stretch_order],shrink,fillorders[shrink_order])
+ elseif shrink ~= 0 then
+ return f_f_m(width,stretch,fillorders[stretch_order],shrink)
+ else
+ return f_f_z(width,stretch,fillorders[stretch_order])
+ end
+ elseif shrink_order ~= 0 then
+ if stretch ~= 0 then
+ return f_p_f(width,stretch,shrink,fillorders[shrink_order])
+ else
+ return f_z_f(width,shrink,fillorders[shrink_order])
+ end
elseif stretch ~= 0 then
- plus = formatters[fmt](stretch*dimenfactors[unit],unit)
- plus = " plus " .. (strip and lpegmatch(stripper,plus) or plus)
- else
- plus = ""
- end
- if minus ~= 0 then
- minus = " minus " .. shrink/65536 .. fillcodes[minus]
+ if shrink ~= 0 then
+ return f_p_m(width,stretch,shrink)
+ else
+ return f_p_z(width,stretch)
+ end
elseif shrink ~= 0 then
- minus = formatters[fmt](shrink*dimenfactors[unit],unit)
- minus = " minus " .. (strip and lpegmatch(stripper,minus) or minus)
+ return f_z_m(width,shrink)
+ elseif width == 0 then
+ return "0pt"
else
- minus = ""
+ return f_z_z(width)
end
- local str = formatters[fmt](getfield(d,"width")*dimenfactors[unit],unit)
- return (strip and lpegmatch(stripper,str) or str) .. plus .. minus
end
-local function numbertodimen(d,unit,fmt,strip)
- if not d then
- local str = formatters[fmt](0,unit)
- return strip and lpegmatch(stripper,str) or str
- end
- local t = type(d)
- if t == 'string' then
- return d
- elseif t == "number" then
- if unit == true then
- unit = "pt"
- fmt = "%0.5f%s"
+
+-- number.todimen(123)
+-- number.todimen(123,"cm")
+-- number.todimen(123,false,"%F))
+
+local f_pt = formatters["%p"]
+local f_un = formatters["%F%s"]
+
+dimenfactors[""] = dimenfactors.pt
+
+local function numbertodimen(d,unit,fmt)
+ if not d or d == 0 then
+ if not unit or unit == "pt" then
+ return "0pt"
+ elseif fmt then
+ return formatters[fmt](0,unit)
else
- unit = unit or 'pt'
- if not fmt then
- fmt = "%s%s"
- elseif fmt == true then
- fmt = "%0.5f%s"
- end
+ return 0 .. unit
+ end
+ elseif fmt then
+ if not unit then
+ unit = "pt"
end
- local str = formatters[fmt](d*dimenfactors[unit],unit)
- return strip and lpegmatch(stripper,str) or str
+ return formatters[fmt](d*dimenfactors[unit],unit)
+ elseif not unit or unit == "pt" then
+ return f_pt(d)
else
- return nodetodimen(d,unit,fmt,strip) -- real node
+ return f_un(d*dimenfactors[unit],unit)
end
end
@@ -469,7 +568,7 @@ local points = function(n)
elseif type(n) == "number" then
return lpegmatch(stripper,format("%.5fpt",n*ptfactor)) -- faster than formatter
else
- return numbertodimen(n,"pt",true,true) -- also deals with nodes
+ return numbertodimen(n,"pt") -- also deals with nodes
end
end
@@ -479,7 +578,7 @@ local basepoints = function(n)
elseif type(n) == "number" then
return lpegmatch(stripper,format("%.5fbp",n*bpfactor)) -- faster than formatter
else
- return numbertodimen(n,"bp",true,true) -- also deals with nodes
+ return numbertodimen(n,"bp") -- also deals with nodes
end
end
@@ -489,7 +588,7 @@ local pts = function(n)
elseif type(n) == "number" then
return format("%.5fpt",n*ptfactor) -- faster than formatter
else
- return numbertodimen(n,"pt",true) -- also deals with nodes
+ return numbertodimen(n,"pt") -- also deals with nodes
end
end
@@ -506,10 +605,10 @@ number.basepoints = basepoints
number.pts = pts
number.nopts = nopts
-nodes.points = function(n) return numbertodimen(n,"pt",true,true) end
-nodes.basepoints = function(n) return numbertodimen(n,"bp",true,true) end
-nodes.pts = function(n) return numbertodimen(n,"pt",true) end
-nodes.nopts = function(n) return format("%.5f",n*ptfactor) end
+nodes.points = function(n) return numbertodimen(n,"pt") end
+nodes.basepoints = function(n) return numbertodimen(n,"bp") end
+nodes.pts = function(n) return numbertodimen(n,"pt") end
+nodes.nopts = function(n) return format("%.5f",n*ptfactor) end
local colors = { }
tracers.colors = colors
diff --git a/Master/texmf-dist/tex/context/base/node-tsk.lua b/Master/texmf-dist/tex/context/base/node-tsk.lua
index dfa570b2479..56a4b18ef24 100644
--- a/Master/texmf-dist/tex/context/base/node-tsk.lua
+++ b/Master/texmf-dist/tex/context/base/node-tsk.lua
@@ -117,6 +117,14 @@ function tasks.disableaction(name,action)
end
end
+function tasks.replaceaction(name,group,oldaction,newaction)
+ local data = valid(name)
+ if data then
+ sequencers.replaceaction(data.list,group,oldaction,newaction)
+ data.runner = false
+ end
+end
+
function tasks.setaction(name,action,value)
if value then
tasks.enableaction(name,action)
diff --git a/Master/texmf-dist/tex/context/base/pack-bck.mkvi b/Master/texmf-dist/tex/context/base/pack-bck.mkvi
index 72eafd282ee..bb4b72252a2 100644
--- a/Master/texmf-dist/tex/context/base/pack-bck.mkvi
+++ b/Master/texmf-dist/tex/context/base/pack-bck.mkvi
@@ -32,7 +32,7 @@
%D \starttyping
%D \setupbackground
%D [backgroundoffset=4pt,
-%D background=screen,
+%D background=color,
%D frame=on,
%D framecolor=red,
%D leftoffset=2pt]
@@ -206,14 +206,9 @@
\c!corner=\v!rectangular,
\c!frame=\v!off,
\c!depth=\zeropoint,
-% \c!color=,
-% \c!background=\v!screen,
-% \c!backgroundcolor=\backgroundparameter\c!color,
-% \c!screen=\defaultbackgroundscreen,
-%
+ % \c!color=,
\c!background=\v!color,
\c!backgroundcolor=lightgray,
-%
\c!before=,
\c!after=]
diff --git a/Master/texmf-dist/tex/context/base/pack-box.mkiv b/Master/texmf-dist/tex/context/base/pack-box.mkiv
index f8b36691c75..6e3bab6f498 100644
--- a/Master/texmf-dist/tex/context/base/pack-box.mkiv
+++ b/Master/texmf-dist/tex/context/base/pack-box.mkiv
@@ -24,10 +24,10 @@
%D which in itself is ok, but can lead to loops due to rounding errors (happened
%D in demo-obv).
-\definelayer[\v!text-2][\c!position=\v!yes,\c!region=,\c!width=\overlaywidth,\c!height=\overlayheight]
-\definelayer[\v!text-1][\c!position=\v!yes,\c!region=,\c!width=\overlaywidth,\c!height=\overlayheight]
-\definelayer[\v!text+1][\c!position=\v!yes,\c!region=,\c!width=\overlaywidth,\c!height=\overlayheight]
-\definelayer[\v!text+2][\c!position=\v!yes,\c!region=,\c!width=\overlaywidth,\c!height=\overlayheight]
+\definelayer[\v!text-2][\c!position=\v!yes,\c!region=,\c!width=\d_overlay_width,\c!height=\d_overlay_height]
+\definelayer[\v!text-1][\c!position=\v!yes,\c!region=,\c!width=\d_overlay_width,\c!height=\d_overlay_height]
+\definelayer[\v!text+1][\c!position=\v!yes,\c!region=,\c!width=\d_overlay_width,\c!height=\d_overlay_height]
+\definelayer[\v!text+2][\c!position=\v!yes,\c!region=,\c!width=\d_overlay_width,\c!height=\d_overlay_height]
\unexpanded\def\internaltextoverlay#1% will become more generic and installable
{\startoverlay % i.e. probably an overlay by itself
@@ -436,7 +436,7 @@
\def\pack_ornament_text[#1][#2]%
{\bgroup
- \doifassignmentelse{#1}
+ \doifelseassignment{#1}
{\letdummyparameter\c!alternative\v!a
\getdummyparameters[#1]%
\doifelse{\directdummyparameter\c!alternative}\v!a
@@ -552,7 +552,7 @@
%
\doifelse{\bleedingparameter\c!stretch}\v!yes\donetrue\donefalse
%
- \xdef\bleedwidth{\dimexpr
+ \xdef\bleedwidth{\the\dimexpr
\ifdone
\ifconditional\c_pack_boxes_l
\scratchwidth+\MPx\currentbgposition-\MPx\currentpageposition
@@ -563,8 +563,9 @@
\fi\fi
\else
\scratchwidth
- \fi+\scratchhoffset}%
- \xdef\bleedheight{\dimexpr
+ \fi+\scratchhoffset
+ \relax}%
+ \xdef\bleedheight{\the\dimexpr
\ifdone
\ifconditional\c_pack_boxes_t
\paperheight -\MPy\currentbgposition+\MPy\currentpageposition % not checked
@@ -575,7 +576,8 @@
\fi\fi
\else
\scratchheight
- \fi+\scratchvoffset}%
+ \fi+\scratchvoffset
+ \relax}%
\dowithnextboxcontentcs\pack_boxes_bleed_settings\pack_boxes_bleed_finish\hbox}
\def\pack_boxes_bleed_settings
@@ -678,7 +680,7 @@
\dowithnextboxcontent
{\forgetall
\hsize\directdummyparameter\c!width
- \normalexpanded{\setupalign[\directdummyparameter\c!align]}%
+ \usealignparameter\directdummyparameter
\dousestyleparameter{\directdummyparameter\c!style}}
{\setlayer[#1][#2]{\strut\dousecolorparameter{\directdummyparameter\c!color}\flushnextbox}% maybe expand the color
\egroup}%
@@ -977,22 +979,43 @@
\box\scratchbox
\egroup}
-% \backgroundimage{1}{\hsize}{\vsize}{\externalfigure[cow][\c!width=3cm]}
+% \backgroundimage{1}{\hsize}{\vsize}{\externalfigure[cow][\c!width=3cm]}
+
+% \framed[offset=overlay,width=6cm,height=3cm]{\backgroundimage {1}{\hsize}{\vsize}{\externalfigure[cow][width=1cm]}}
+% \framed[offset=overlay,width=6cm,height=3cm]{\backgroundimage {2}{\hsize}{\vsize}{\externalfigure[cow][width=1cm]}}
+% \framed[offset=overlay,width=6cm,height=3cm]{\backgroundimage {3}{\hsize}{\vsize}{\externalfigure[cow][width=1cm]}}
+
+% \framed[offset=overlay,width=4cm,height=2cm]{\backgroundimagefill{1}{\hsize}{\vsize}{\externalfigure[cow][width=1cm]}}
+% \framed[offset=overlay,width=4cm,height=2cm]{\backgroundimagefill{2}{\hsize}{\vsize}{\externalfigure[cow][width=1cm]}}
+% \framed[offset=overlay,width=4cm,height=2cm]{\backgroundimagefill{3}{\hsize}{\vsize}{\externalfigure[cow][width=1cm]}}
+% \framed[offset=overlay,width=2cm,height=4cm]{\backgroundimagefill{1}{\hsize}{\vsize}{\externalfigure[cow][width=1cm]}}
+% \framed[offset=overlay,width=2cm,height=4cm]{\backgroundimagefill{2}{\hsize}{\vsize}{\externalfigure[cow][width=1cm]}}
+% \framed[offset=overlay,width=2cm,height=4cm]{\backgroundimagefill{3}{\hsize}{\vsize}{\externalfigure[cow][width=1cm]}}
+%
+% \framed[offset=overlay,width=4cm,height=2cm]{\backgroundimagefill{1}{\hsize}{\vsize}{\externalfigure[mill]}}
+% \framed[offset=overlay,width=4cm,height=2cm]{\backgroundimagefill{2}{\hsize}{\vsize}{\externalfigure[mill]}}
+% \framed[offset=overlay,width=4cm,height=2cm]{\backgroundimagefill{3}{\hsize}{\vsize}{\externalfigure[mill]}}
+% \framed[offset=overlay,width=2cm,height=4cm]{\backgroundimagefill{1}{\hsize}{\vsize}{\externalfigure[mill]}}
+% \framed[offset=overlay,width=2cm,height=4cm]{\backgroundimagefill{2}{\hsize}{\vsize}{\externalfigure[mill]}}
+% \framed[offset=overlay,width=2cm,height=4cm]{\backgroundimagefill{3}{\hsize}{\vsize}{\externalfigure[mill]}}
\unexpanded\def\backgroundimage#1#2#3% repeat hsize vsize
{\bgroup
\forgetall
- \dowithnextbox{\pack_boxes_background_image{#1}{#2}{#3}}\hbox}
+ \scratchcounter#1\relax
+ \scratchwidth #2\relax
+ \scratchheight #3\relax
+ \dowithnextboxcs\pack_boxes_background_image\hbox}
-\def\pack_boxes_background_image#1#2#3%
+\def\pack_boxes_background_image
{\offinterlineskip
- \ifcase#1\relax
+ \ifcase\scratchcounter
% just one
\else
- \scratchdimen#2\divide\scratchdimen\wd\nextbox\scratchnx\scratchdimen\advance\scratchnx\plusone\relax
- \scratchdimen#3\divide\scratchdimen\ht\nextbox\scratchny\scratchdimen\advance\scratchny\plusone\relax
+ \scratchdimen\scratchwidth \divide\scratchdimen\wd\nextbox\scratchnx\scratchdimen\advance\scratchnx\plusone\relax
+ \scratchdimen\scratchheight\divide\scratchdimen\ht\nextbox\scratchny\scratchdimen\advance\scratchny\plusone\relax
% to be considered: methods
- \ifcase#1%
+ \ifcase\scratchcounter
\or % x and y
\setbox\nextbox\hbox{\dorecurse\scratchnx{\copy\nextbox}}%
\setbox\nextbox\vbox{\dorecurse\scratchny{\copy\nextbox\endgraf}}%
@@ -1002,13 +1025,59 @@
\setbox\nextbox\vbox{\dorecurse\scratchny{\copy\nextbox\endgraf}}%
\fi
\fi
- \ifdim\wd\nextbox>#2\relax
- \setbox\nextbox\hbox to #2{\hss\box\nextbox\hss}%
- \setbox\nextbox\hbox{\normalexpanded{\clip[\c!width=#2,\c!height=\the\ht\nextbox]{\box\nextbox}}}%
+ \ifdim\wd\nextbox>\scratchwidth
+ \setbox\nextbox\hbox to \scratchwidth{\hss\box\nextbox\hss}%
+ \setbox\nextbox\hbox{\normalexpanded{\clip[\c!width=\the\scratchwidth,\c!height=\the\ht\nextbox]{\box\nextbox}}}%
+ \fi
+ \ifdim\ht\nextbox>\scratchheight
+ \setbox\nextbox\vbox to \scratchheight{\vss\box\nextbox\vss}%
+ \setbox\nextbox\hbox{\normalexpanded{\clip[\c!width=\the\wd\nextbox,\c!height=\the\scratchheight]{\box\nextbox}}}%
+ \fi
+ \box\nextbox
+ \egroup}
+
+\unexpanded\def\backgroundimagefill#1#2#3% repeat hsize vsize
+ {\bgroup
+ \forgetall
+ \scratchcounter#1\relax
+ \scratchwidth #2\relax
+ \scratchheight #3\relax
+ \dowithnextboxcs\pack_boxes_background_image_fill\hbox}
+
+\def\pack_boxes_background_image_fill
+ {\offinterlineskip
+ \setbox\nextbox\hbox\bgroup
+ \ifdim\scratchwidth>\scratchheight
+ \scale[\c!width=\the\scratchwidth]{\box\nextbox}%
+ \else
+ \scale[\c!height=\the\scratchheight]{\box\nextbox}%
+ \fi
+ \egroup
+ \ifdim\wd\nextbox>\scratchwidth
+ \setbox\nextbox\hbox to \scratchwidth
+ {\ifcase\scratchcounter
+ \hss\box\nextbox\hss
+ \or
+ \box\nextbox\hss
+ \or
+ \hss\box\nextbox
+ \else
+ \hss\box\nextbox\hss
+ \fi}%
+ \setbox\nextbox\hbox{\normalexpanded{\clip[\c!width=\the\scratchwidth,\c!height=\the\ht\nextbox]{\box\nextbox}}}%
\fi
- \ifdim\ht\nextbox>#3\relax
- \setbox\nextbox\vbox to #3{\vss\box\nextbox\vss}%
- \setbox\nextbox\hbox{\normalexpanded{\clip[\c!width=\the\wd\nextbox,\c!height=#3]{\box\nextbox}}}%
+ \ifdim\ht\nextbox>\scratchheight
+ \setbox\nextbox\vbox to \scratchheight
+ {\ifcase\scratchcounter
+ \vss\box\nextbox\vss
+ \or
+ \box\nextbox\vss
+ \or
+ \vss\box\nextbox
+ \else
+ \vss\box\nextbox\vss
+ \fi}%
+ \setbox\nextbox\hbox{\normalexpanded{\clip[\c!width=\the\wd\nextbox,\c!height=\the\scratchheight]{\box\nextbox}}}%
\fi
\box\nextbox
\egroup}
diff --git a/Master/texmf-dist/tex/context/base/pack-com.mkiv b/Master/texmf-dist/tex/context/base/pack-com.mkiv
index 4ca77af1c45..b734d602858 100644
--- a/Master/texmf-dist/tex/context/base/pack-com.mkiv
+++ b/Master/texmf-dist/tex/context/base/pack-com.mkiv
@@ -178,7 +178,7 @@
\unexpanded\def\pack_common_caption_stop {\removeunwantedspaces\egroup}
\unexpanded\def\stopcombination
- {\bgroup\normalexpanded{\egroup{}\ctxcommand{ntimes("{}{}",\number\c_pack_combinations_n)}}% brr
+ {\bgroup\normalexpanded{\egroup{}\ntimes{{}{}}\c_pack_combinations_n}% brr
\dostoptagged
\egroup
\egroup}
@@ -191,19 +191,19 @@
\edef\currentcombination{#1}%
\edef\currentcombinationspec{#2}%
\ifx\currentcombinationspec\empty
- \doifassignmentelse{#1}%
+ \doifelseassignment{#1}%
{\let\currentcombination\empty
\setupcurrentcombination[#1]%
\edef\currentcombinationspec{\combinationparameter\c!nx*\combinationparameter\c!ny*}}
- {\doifinstringelse{*}\currentcombination
+ {\doifelseinstring{*}\currentcombination
{\edef\currentcombinationspec{\currentcombination*\plusone*}%
\let\currentcombination\empty}
- {\doifnumberelse\currentcombination
+ {\doifelsenumber\currentcombination
{\edef\currentcombinationspec{\currentcombination*\plusone*}%
\let\currentcombination\empty}
{\edef\currentcombinationspec{\combinationparameter\c!nx*\combinationparameter\c!ny*}}}}%
\else
- \doifassignmentelse{#2}%
+ \doifelseassignment{#2}%
{\setupcurrentcombination[#2]%
\edef\currentcombinationspec{\combinationparameter\c!nx*\combinationparameter\c!ny*}}
{\edef\currentcombinationspec{\currentcombinationspec*\plusone*}}%
@@ -221,13 +221,12 @@
\edef\p_height {\combinationparameter\c!height}%
\edef\p_width {\combinationparameter\c!width}%
\edef\p_location{\combinationparameter\c!location}%
- \edef\p_align {\combinationparameter\c!align}%
\edef\p_distance{\combinationparameter\c!distance}%
%
\pack_combinations_location_reset
\rawprocesscommacommand[\p_location]\pack_combinations_location_step
%
- \dostarttagged\t!combination\currentcombination
+ \dostarttaggedchained\t!combination\currentcombination\??combination
\vbox \ifx\p_height\v!fit\else to \p_height \fi \bgroup
\let\combination\empty % permits \combination{}{} handy for cld
\normalexpanded{\pack_combinations_start_indeed[\currentcombinationspec]}}
@@ -295,7 +294,7 @@
\def\pack_combinations_alternative_label_indeed
{\dowithnextboxcs\pack_combinations_pickup_caption\vtop\bgroup
\hsize\wd\b_pack_combinations_content
- \ifx\p_align\empty\else\setupalign[\p_align]\fi
+ \usealignparameter\combinationparameter
\usecombinationstyleandcolor\c!style\c!color
\begstrut
\normalexpanded{\strc_labels_command{\v!combination\ifx\currentcombination\empty\else:\currentcombination\fi}}%
@@ -324,15 +323,18 @@
\def\pack_combinations_caption_second
{\ifx\nexttoken\egroup
% the caption is empty
+ \else\ifx\nexttoken\stopcaption
+ % the caption is empty (new per 2014-05-24)
\else
+ % todo: \p_pack_combinations_alternative\v!none: no style, strut etc
\hsize\wd\b_pack_combinations_content
- \ifx\p_align\empty\else\setupalign[\p_align]\fi
+ \usealignparameter\combinationparameter
\usecombinationstyleandcolor\c!style\c!color
\bgroup
\aftergroup\endstrut
\aftergroup\egroup
\begstrut
- \fi}
+ \fi\fi}
\def\pack_combinations_pickup_package_pair % we need to store the caption row
{\vbox
@@ -626,12 +628,12 @@
\unexpanded\def\placepairedbox[#1]%
{\bgroup
\edef\currentpairedbox{#1}%
- \doifnextoptionalcselse\pack_pairedboxes_place\pack_pairedboxes_place_indeed}
+ \doifelsenextoptionalcs\pack_pairedboxes_place\pack_pairedboxes_place_indeed}
\unexpanded\def\startplacepairedbox[#1]%
{\bgroup
\edef\currentpairedbox{#1}%
- \doifnextoptionalcselse\pack_pairedboxes_place\pack_pairedboxes_place_indeed}
+ \doifelsenextoptionalcs\pack_pairedboxes_place\pack_pairedboxes_place_indeed}
\unexpanded\def\stopplacepairedbox
{}
@@ -780,7 +782,7 @@
\fi}
\def\pack_pairedboxes_between
- {\switchtobodyfont[\pairedboxparameter\c!bodyfont]% split under same regime
+ {\usebodyfontparameter\pairedboxparameter
\setbox\b_pack_pairedboxes_first\box\nextbox
\ifconditional\c_pack_pairedboxes_horizontal
\pack_pairedboxes_between_horizontal
diff --git a/Master/texmf-dist/tex/context/base/pack-fen.mkiv b/Master/texmf-dist/tex/context/base/pack-fen.mkiv
index 4253eeaa76c..04a36fa462c 100644
--- a/Master/texmf-dist/tex/context/base/pack-fen.mkiv
+++ b/Master/texmf-dist/tex/context/base/pack-fen.mkiv
@@ -50,12 +50,12 @@
\else
\def\setinstalledframedimensions
- {\edef\overlaywidth {\the\frameddimenwd\space}%
- \edef\overlayheight {\the\dimexpr\frameddimenht+\frameddimendp\relax\space}%
- \edef\overlaydepth {\the\frameddimendp\space}%
+ {\d_overlay_width \frameddimenwd
+ \d_overlay_height \dimexpr\frameddimenht+\frameddimendp\relax
+ \d_overlay_depth \frameddimendp
+ \d_overlay_linewidth \ruledlinewidth
\edef\overlaycolor {\framedparameter\c!backgroundcolor}%
- \edef\overlaylinecolor{\framedparameter\c!framecolor}%
- \edef\overlaylinewidth{\the\ruledlinewidth}}
+ \edef\overlaylinecolor{\framedparameter\c!framecolor}}
\fi
@@ -63,7 +63,7 @@
\def\whateverleftframe#1%
{\setinstalledframedimensions
- \setbox\b_framed_rendered\vbox to \overlayheight{\vss#1\vss}%
+ \setbox\b_framed_rendered\vbox to \d_overlay_height{\vss#1\vss}%
\setbox\b_framed_rendered\hbox to \zeropoint{\box\b_framed_rendered\hss}%
\ht\b_framed_rendered\zeropoint
\dp\b_framed_rendered\zeropoint
@@ -71,7 +71,7 @@
\def\whateverrightframe#1%
{\setinstalledframedimensions
- \setbox\b_framed_rendered\vbox to \overlayheight{\vss#1\vss}%
+ \setbox\b_framed_rendered\vbox to \d_overlay_height{\vss#1\vss}%
\setbox\b_framed_rendered\hbox to \zeropoint{\hss\box\b_framed_rendered}%
\ht\b_framed_rendered\zeropoint
\dp\b_framed_rendered\zeropoint
@@ -79,7 +79,7 @@
\def\whatevertopframe#1%
{\setinstalledframedimensions
- \setbox\b_framed_rendered\hbox to \overlaywidth{\hss#1\hss}%
+ \setbox\b_framed_rendered\hbox to \d_overlay_width{\hss#1\hss}%
\setbox\b_framed_rendered\vbox to \zeropoint{\box\b_framed_rendered\vss}%
\ht\b_framed_rendered\zeropoint
\dp\b_framed_rendered\zeropoint
@@ -88,7 +88,7 @@
\def\whateverbottomframe#1%
{\setinstalledframedimensions
- \setbox\b_framed_rendered\hbox to \overlaywidth{\hss#1\hss}%
+ \setbox\b_framed_rendered\hbox to \d_overlay_width{\hss#1\hss}%
\setbox\b_framed_rendered\vbox to \zeropoint{\vss\box\b_framed_rendered}%
\ht\b_framed_rendered\zeropoint
\dp\b_framed_rendered\zeropoint
diff --git a/Master/texmf-dist/tex/context/base/pack-lyr.mkiv b/Master/texmf-dist/tex/context/base/pack-lyr.mkiv
index a891c998d4a..a847dec67be 100644
--- a/Master/texmf-dist/tex/context/base/pack-lyr.mkiv
+++ b/Master/texmf-dist/tex/context/base/pack-lyr.mkiv
@@ -101,9 +101,6 @@
\def\layeranchor{\currentlayer:\the\realpageno}
-\unexpanded\def\anch_mark_anchor_box#1%
- {\ctxcommand{markregionbox(\number#1,"\layeranchor")}} % needs an hbox
-
\let\p_pack_layers_doublesided\empty
\let\p_pack_layers_state \empty
\let\p_pack_layers_option \empty
@@ -229,7 +226,7 @@
\else\ifthirdargument
\pack_layers_set_indeed[#1][#2][#3]%
\else
- \doifassignmentelse{#2}
+ \doifelseassignment{#2}
{\pack_layers_set_indeed[#1][][#2]}%
{\pack_layers_set_indeed[#1][#2][]}%
\fi\fi}
@@ -323,7 +320,7 @@
{\dodoubleargument\pack_layers_define_preset}
\def\pack_layers_define_preset[#1][#2]%
- {\doifassignmentelse{#2}
+ {\doifelseassignment{#2}
{\setvalue{\??layerpreset#1}{\setupcurrentlayer[#2]}}
{\setvalue{\??layerpreset#1}{\csname\??layerpreset#2\endcsname}}}
@@ -510,6 +507,8 @@
\expandafter\secondoftwoarguments
\fi}
+\let\doiflayerdataelse\doifelselayerdata
+
%D \macros
%D {flushlayer}
%D
@@ -610,7 +609,7 @@
% {\setlayoutcomponentattribute{\v!layer:#2}}%
% \resetlayoutcomponentattribute
% \ifx\p_pack_layers_option\v!test \ruledvbox \else \vbox \fi \ifx\p_pack_layers_method\v!overlay to \overlayheight \fi \layoutcomponentboxattribute
-% {\hbox \ifx\p_pack_layers_method\v!overlay to \overlaywidth \fi
+% {\hbox \ifx\p_pack_layers_method\v!overlay to \d_overlay_width \fi
% {\edef\currentlayer{#2\the\realpageno}% local
% \edef\p_pack_layers_position{\layerparameter\c!position}% local
% \ifx\p_pack_layers_position\v!yes
@@ -669,15 +668,15 @@
\pack_layers_positioned_box_nop
\fi
% todo: method=offset => overlayoffset right/down (handy for backgrounds with offset)
- \doifoverlayelse{#2}%
+ \doifelseoverlay{#2}%
{\setlayoutcomponentattribute{\v!layer:#2}}%
\resetlayoutcomponentattribute
% we have conflicting demands: some mechanisms want ll anchoring .. I need to figure this out
% an dmaybe we will have 'origin=bottom' or so
\setbox\nextbox
- \ifx\p_pack_layers_option\v!test \ruledvbox \else \vbox \fi \ifx\p_pack_layers_method\v!overlay to \overlayheight \fi \layoutcomponentboxattribute
+ \ifx\p_pack_layers_option\v!test \ruledvbox \else \vbox \fi \ifx\p_pack_layers_method\v!overlay to \d_overlay_height \fi \layoutcomponentboxattribute
{\pack_layers_top_fill
- \hbox \ifx\p_pack_layers_method\v!overlay to \overlaywidth \fi
+ \hbox \ifx\p_pack_layers_method\v!overlay to \d_overlay_width \fi
{\box\nextbox
\hss}%
\pack_layers_bottom_fill}%
@@ -687,7 +686,7 @@
\ifx\p_pack_layers_position\v!yes
\edef\p_pack_layers_region{\layerparameter\c!region}%
\ifx\p_pack_layers_region\empty \else
- \anch_mark_anchor_box\nextbox
+ \anch_mark_tagged_box\nextbox\layeranchor
\fi
\fi
\box\nextbox
@@ -724,12 +723,20 @@
\unexpanded\def\composedlayer#1{\flushlayer[#1]}
+% \unexpanded\def\tightlayer[#1]%
+% {\hbox
+% {\def\currentlayer{#1}% todo: left/right
+% \setbox\nextbox\emptybox
+% \hsize\layerparameter\c!width
+% \vsize\layerparameter\c!height
+% \composedlayer{#1}}}
+
\unexpanded\def\tightlayer[#1]%
{\hbox
{\def\currentlayer{#1}% todo: left/right
- \setbox\nextbox\emptybox % hoogte/breedte are \wd\nextbox/\ht\nextbox
- \hsize\layerparameter\c!width % \overlaywidth = \hsize
- \vsize\layerparameter\c!height % \overlaywheight = \vsize
+ \setbox\nextbox\emptybox
+ \d_overlay_width \layerparameter\c!width
+ \d_overlay_height\layerparameter\c!height
\composedlayer{#1}}}
\let\placelayer\flushlayer
diff --git a/Master/texmf-dist/tex/context/base/pack-mis.mkvi b/Master/texmf-dist/tex/context/base/pack-mis.mkvi
index 38fcc18e419..420f9440a2f 100644
--- a/Master/texmf-dist/tex/context/base/pack-mis.mkvi
+++ b/Master/texmf-dist/tex/context/base/pack-mis.mkvi
@@ -46,7 +46,7 @@
\unexpanded\def\pack_placement#tag%
{\bgroup
\edef\currentplacement{#tag}%
- \doifnextoptionalcselse\pack_placement_yes\pack_placement_nop}
+ \doifelsenextoptionalcs\pack_placement_yes\pack_placement_nop}
\def\pack_placement_yes[#settings]%
{\setupcurrentplacement[#settings]%
@@ -67,6 +67,7 @@
%\ifinsidefloat \else
% \page_backgrounds_add_local_to_box\nextbox
%\fi
+\flushnotes % new per 2014-05-29 : todo: move them up in the mvl
\ifgridsnapping
\pack_placement_flush_grid_yes
\else
diff --git a/Master/texmf-dist/tex/context/base/pack-mrl.mkiv b/Master/texmf-dist/tex/context/base/pack-mrl.mkiv
index c0097cb5fa5..a97c9e6f8c8 100644
--- a/Master/texmf-dist/tex/context/base/pack-mrl.mkiv
+++ b/Master/texmf-dist/tex/context/base/pack-mrl.mkiv
@@ -40,7 +40,7 @@
\unexpanded\def\blackrule
{\hbox\bgroup
- \doifnextoptionalcselse\pack_black_rule_pickup\pack_black_rule_indeed}
+ \doifelsenextoptionalcs\pack_black_rule_pickup\pack_black_rule_indeed}
\def\pack_black_rule_pickup[#1]%
{\setupcurrentblackrules[#1]%
@@ -96,7 +96,7 @@
\unexpanded\def\blackrules % probably never used
{\hbox\bgroup
- \doifnextoptionalcselse\pack_black_rules_pickup\pack_black_rules_indeed}
+ \doifelsenextoptionalcs\pack_black_rules_pickup\pack_black_rules_indeed}
\def\pack_black_rules_pickup[#1]%
{\setupcurrentblackrules[#1]%
@@ -145,7 +145,8 @@
%D \showsetup{hl}
\unexpanded\def\pack_rule_vl_indeed#1#2#3%
- {\bgroup
+ {\dontleavehmode
+ \begingroup
\setbox\scratchbox\hbox
{\vrule
\s!width #1\linewidth
@@ -154,13 +155,14 @@
\dp\scratchbox\strutdp
\ht\scratchbox\strutht
\box\scratchbox
- \egroup}
+ \endgroup}
\def\pack_rule_vl[#1]%
{\pack_rule_vl_indeed{#1}{#1}{#1}}
\def\pack_rule_hl[#1]%
- {\hbox
+ {\dontleavehmode
+ \hbox
{\vrule
\s!width #1\emwidth
\s!height\linewidth
@@ -629,7 +631,7 @@
\def\pack_textrule_nop_indeed{\csname\??textrulealternatives\v!middle\endcsname}%
\csname\??textrulealternatives\v!top\endcsname{#1}%
\bgroup
- \doifsomething{\directtextrulesparameter\c!bodyfont}{\switchtobodyfont[\directtextrulesparameter\c!bodyfont]}}
+ \usebodyfontparameter\directtextrulesparameter}
\unexpanded\def\stoptextrule
{\par
diff --git a/Master/texmf-dist/tex/context/base/pack-obj.lua b/Master/texmf-dist/tex/context/base/pack-obj.lua
index 70876a34688..d1cc5bafc67 100644
--- a/Master/texmf-dist/tex/context/base/pack-obj.lua
+++ b/Master/texmf-dist/tex/context/base/pack-obj.lua
@@ -11,19 +11,21 @@ if not modules then modules = { } end modules ['pack-obj'] = {
reusable components.</p>
--ldx]]--
-local commands, context = commands, context
+local context = context
-local allocate = utilities.storage.allocate
+local implement = interfaces.implement
-local collected = allocate()
-local tobesaved = allocate()
+local allocate = utilities.storage.allocate
-local jobobjects = {
+local collected = allocate()
+local tobesaved = allocate()
+
+local jobobjects = {
collected = collected,
tobesaved = tobesaved,
}
-job.objects = jobobjects
+job.objects = jobobjects
local function initializer()
collected = jobobjects.collected
@@ -32,45 +34,60 @@ end
job.register('job.objects.collected', tobesaved, initializer, nil)
-function jobobjects.save(tag,number,page)
+local function saveobject(tag,number,page)
local t = { number, page }
tobesaved[tag], collected[tag] = t, t
end
-function jobobjects.set(tag,number,page)
+local function setobject(tag,number,page)
collected[tag] = { number, page }
end
-function jobobjects.get(tag)
+local function getobject(tag)
return collected[tag] or tobesaved[tag]
end
-function jobobjects.number(tag,default)
+local function getobjectnumber(tag,default)
local o = collected[tag] or tobesaved[tag]
return o and o[1] or default
end
-function jobobjects.page(tag,default)
+local function getobjectpage(tag,default)
local o = collected[tag] or tobesaved[tag]
return o and o[2] or default
end
--- interface
+jobobjects.save = saveobject
+jobobjects.set = setobject
+jobobjects.get = getobject
+jobobjects.number = getobjectnumber
+jobobjects.page = getobjectpage
-commands.saveobject = jobobjects.save
-commands.setobject = jobobjects.set
+implement {
+ name = "saveobject",
+ actions = saveobject
+}
-function commands.objectnumber(tag,default)
- local o = collected[tag] or tobesaved[tag]
- context(o and o[1] or default)
-end
+implement {
+ name = "setobject",
+ actions = setobject,
+ arguments = { "string", "integer", "integer" }
+}
-function commands.objectpage(tag,default)
- local o = collected[tag] or tobesaved[tag]
- context(o and o[2] or default)
-end
+implement {
+ name = "objectnumber",
+ actions = { getobjectnumber, context },
+ arguments = { "string", "string" },
+}
-function commands.doifobjectreferencefoundelse(tag)
- commands.doifelse(collected[tag] or tobesaved[tag])
-end
+implement {
+ name = "objectpage",
+ actions = { getobjectpage, context },
+ arguments = { "string", "string" },
+}
+implement {
+ name = "doifelseobjectreferencefound",
+ actions = { jobobjects.get, commands.doifelse },
+ arguments = "string"
+}
diff --git a/Master/texmf-dist/tex/context/base/pack-obj.mkiv b/Master/texmf-dist/tex/context/base/pack-obj.mkiv
index 356a0b7ebf8..605dd3b9e5a 100644
--- a/Master/texmf-dist/tex/context/base/pack-obj.mkiv
+++ b/Master/texmf-dist/tex/context/base/pack-obj.mkiv
@@ -366,7 +366,7 @@
% no undefined test ! ! ! ! (pdftex fails on undefined objects)
\unexpanded\def\pack_objects_register_reference#1#2#3{\normalexpanded{\noexpand\ctxlatecommand{saveobject("#1::#2",#3,\noexpand\the\realpageno)}}}
-\unexpanded\def\pack_objects_overload_reference#1#2#3{\ctxcommand{setobject("#1::#2",#3,\the\realpageno)}}
+\unexpanded\def\pack_objects_overload_reference#1#2#3{\clf_setobject{#1::#2}#3 \realpageno\relax}
\unexpanded\def\dosetobjectreference
{\ifcase\crossreferenceobject
@@ -382,8 +382,8 @@
\def\defaultobjectreference#1#2{0} % driver dependent
\def\defaultobjectpage #1#2{\realfolio}
-\unexpanded\def\dogetobjectreference #1#2#3{\xdef#3{\ctxcommand{objectnumber("#1::#2","\defaultobjectreference{#1}{#2}")}}}
-\unexpanded\def\dogetobjectreferencepage#1#2#3{\xdef#3{\ctxcommand{objectpage("#1::#2","\defaultobjectpage{#1}{#2}")}}}
+\unexpanded\def\dogetobjectreference #1#2#3{\xdef#3{\clf_objectnumber{#1::#2}{\defaultobjectreference{#1}{#2}}}}
+\unexpanded\def\dogetobjectreferencepage#1#2#3{\xdef#3{\clf_objectpage {#1::#2}{\defaultobjectpage {#1}{#2}}}}
\unexpanded\def\setobject {\driverreferenced\pack_objects_set1}
\unexpanded\def\settightobject{\driverreferenced\pack_objects_set0}
@@ -399,14 +399,17 @@
%D \doifobjectreferencefoundelse{class}{object}{do then}{do else}
%D \stoptyping
-\unexpanded\def\doifobjectfoundelse#1#2%
+\unexpanded\def\doifelseobjectfound#1#2%
{\ifcsname\??objects#1::#2\endcsname
\expandafter\firstoftwoarguments
\else
\expandafter\secondoftwoarguments
\fi}
-\unexpanded\def\doifobjectreferencefoundelse#1#2%
- {\ctxcommand{doifobjectreferencefoundelse("#1::#2")}}
+\unexpanded\def\doifelseobjectreferencefound#1#2%
+ {\clf_doifelseobjectreferencefound{#1::#2}}
+
+\let\doifobjectfoundelse \doifelseobjectfound
+\let\doifobjectreferencefoundelse\doifelseobjectreferencefound
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/pack-pos.mkiv b/Master/texmf-dist/tex/context/base/pack-pos.mkiv
index f92ceb78ab2..c52c01ca4b9 100644
--- a/Master/texmf-dist/tex/context/base/pack-pos.mkiv
+++ b/Master/texmf-dist/tex/context/base/pack-pos.mkiv
@@ -62,7 +62,7 @@
\edef\currentpositioning{#1}%
\setupcurrentpositioning[#2]%
\else\iffirstargument
- \doifassignmentelse{#1}
+ \doifelseassignment{#1}
{\let\currentpositioning\empty
\setupcurrentpositioning[#1]}%
{\edef\currentpositioning{#1}}%
diff --git a/Master/texmf-dist/tex/context/base/pack-rul.lua b/Master/texmf-dist/tex/context/base/pack-rul.lua
index 0c29eb5f1dd..151642c3a1b 100644
--- a/Master/texmf-dist/tex/context/base/pack-rul.lua
+++ b/Master/texmf-dist/tex/context/base/pack-rul.lua
@@ -14,6 +14,12 @@ if not modules then modules = { } end modules ['pack-rul'] = {
-- challenge: adapt glue_set
-- setfield(h,"glue_set", getfield(h,"glue_set") * getfield(h,"width")/maxwidth -- interesting ... doesn't matter much
+-- \framed[align={lohi,middle}]{$x$}
+-- \framed[align={lohi,middle}]{$ $}
+-- \framed[align={lohi,middle}]{\hbox{ }}
+-- \framed[align={lohi,middle}]{\hbox{}}
+-- \framed[align={lohi,middle}]{$\hskip2pt$}
+
local type = type
local hlist_code = nodes.nodecodes.hlist
@@ -24,6 +30,8 @@ local line_code = nodes.listcodes.line
local texsetdimen = tex.setdimen
local texsetcount = tex.setcount
+local implement = interfaces.implement
+
local nuts = nodes.nuts
local getfield = nuts.getfield
@@ -39,7 +47,7 @@ local hpack = nuts.hpack
local traverse_id = nuts.traverse_id
local node_dimensions = nuts.dimensions
-function commands.doreshapeframedbox(n)
+local function doreshapeframedbox(n)
local box = getbox(n)
local noflines = 0
local firstheight = nil
@@ -91,7 +99,7 @@ function commands.doreshapeframedbox(n)
-- vdone = true
end
if not firstheight then
- -- done
+ -- done)
elseif maxwidth ~= 0 then
if hdone then
for h in traverse_id(hlist_code,list) do
@@ -117,6 +125,8 @@ function commands.doreshapeframedbox(n)
-- end
setfield(box,"width",maxwidth)
averagewidth = noflines > 0 and totalwidth/noflines or 0
+ else -- e.g. empty math {$ $} or \hbox{} or ...
+setfield(box,"width",0)
end
end
end
@@ -128,7 +138,7 @@ function commands.doreshapeframedbox(n)
texsetdimen("global","framedaveragewidth",averagewidth)
end
-function commands.doanalyzeframedbox(n)
+local function doanalyzeframedbox(n)
local box = getbox(n)
local noflines = 0
local firstheight = nil
@@ -156,6 +166,8 @@ function commands.doanalyzeframedbox(n)
texsetdimen("global","framedlastdepth",lastdepth or 0)
end
+implement { name = "doreshapeframedbox", actions = doreshapeframedbox, arguments = "integer" }
+implement { name = "doanalyzeframedbox", actions = doanalyzeframedbox, arguments = "integer" }
function nodes.maxboxwidth(box)
local boxwidth = getfield(box,"width")
diff --git a/Master/texmf-dist/tex/context/base/pack-rul.mkiv b/Master/texmf-dist/tex/context/base/pack-rul.mkiv
index 8fcf8f548d2..141d741cf8d 100644
--- a/Master/texmf-dist/tex/context/base/pack-rul.mkiv
+++ b/Master/texmf-dist/tex/context/base/pack-rul.mkiv
@@ -43,23 +43,23 @@
\def\pack_framed_setup_line_width[#1]%
{\assigndimension{#1}\linewidth{.2\points}{.4\points}{.6\points}}
-%D \macros
-%D {setupscreens}
-%D
-%D Sort of obsolete:
-%D
-%D \showsetup{setupscreens}
-
-\installcorenamespace{screens}
-
-\installsetuponlycommandhandler \??screens {screens}
-
-\appendtoks
- \edef\defaultbackgroundscreen{\directscreensparameter\c!screen}
-\to \everysetupscreens
-
-\setupscreens
- [\c!screen=.90] % was .95 but that's hardly visible
+% %D \macros
+% %D {setupscreens}
+% %D
+% %D Sort of obsolete:
+% %D
+% %D \showsetup{setupscreens}
+%
+% \installcorenamespace{screens}
+%
+% \installsetuponlycommandhandler \??screens {screens}
+%
+% \appendtoks
+% \edef\defaultbackgroundscreen{\directscreensparameter\c!screen}
+% \to \everysetupscreens
+%
+% \setupscreens
+% [\c!screen=.90] % was .95 but that's hardly visible
%D The parameter handler:
@@ -155,8 +155,6 @@
%\c!foregroundcolor=,
%\c!foregroundstyle=,
%\c!background=,
- %\c!backgroundscreen=,
- \c!backgroundscreen=\defaultbackgroundscreen,
%\c!backgroundcolor=,
\c!backgroundoffset=\zeropoint,
%\c!framecolor=,
@@ -238,7 +236,6 @@
\let\p_framed_lines \empty
\let\p_framed_empty \empty
\let\p_framed_backgroundcolor \empty
-\let\p_framed_backgroundscreen\empty
\let\p_framed_framecolor \empty
\let\p_framed_component \empty
\let\p_framed_region \empty
@@ -352,14 +349,14 @@
%D The oval box is drawn using a special macro, depending on
%D the driver in use.
-\def\pack_framed_background_box_gray % avoid black rules when no gray
- {\edef\p_framed_backgroundscreen{\framedparameter\c!backgroundscreen}%
- \ifx\p_framed_backgroundscreen\empty \else
- \pack_framed_background_box_gray_indeed
- \fi}
-
-\def\pack_framed_background_box_gray_indeed % can be more direct but who cares, just compatibility
- {\colored[s=\p_framed_backgroundscreen]{\pack_framed_filled_box}}
+% \def\pack_framed_background_box_gray % avoid black rules when no gray
+% {\edef\p_framed_backgroundscreen{\framedparameter\c!backgroundscreen}%
+% \ifx\p_framed_backgroundscreen\empty \else
+% \pack_framed_background_box_gray_indeed
+% \fi}
+%
+% \def\pack_framed_background_box_gray_indeed % can be more direct but who cares, just compatibility
+% {\colored[s=\p_framed_backgroundscreen]{\pack_framed_filled_box}}
%D It won't be a surprise that we not only provide gray boxes, but also colored
%D ones. Here it is:
@@ -429,14 +426,36 @@
%D
%D The resulting box is lowered to the right depth.
-\def\overlaywidth {\the\hsize\space} % We preset the variables
-\def\overlayheight {\the\vsize\space} % to some reasonable default
-\def\overlaydepth {0pt } % values. The attributes
-\let\overlayoffset \overlaydepth % of the frame can be (are)
-\let\overlaylinewidth \overlaydepth % set somewhere else.
+%def\overlaywidth {\the\hsize\space} % We preset the variables
+%def\overlayheight {\the\vsize\space} % to some reasonable default
+%def\overlaydepth {0pt } % values. The attributes
+%let\overlayoffset \overlaydepth % of the frame can be (are)
+%let\overlaylinewidth \overlaydepth % set somewhere else.
\let\overlaycolor \empty
\let\overlaylinecolor \empty
+\newdimen\d_overlay_width
+\newdimen\d_overlay_height
+\newdimen\d_overlay_depth
+\newdimen\d_overlay_offset
+\newdimen\d_overlay_linewidth
+
+% expandable ... in a future version the space will go (in my one can use Overlay*)
+
+\def\overlaywidth {\the\d_overlay_width \space} % We preset the variables
+\def\overlayheight {\the\d_overlay_height \space} % to some reasonable default
+\def\overlaydepth {\the\d_overlay_depth \space} % values.
+\def\overlayoffset {\the\d_overlay_offset \space} % of the frame can be (are)
+\def\overlaylinewidth {\the\d_overlay_linewidth\space} % set somewhere else.
+
+% public but kind of protected
+
+\def\usedoverlaywidth {\dimexpr\d_overlay_width \relax}
+\def\usedoverlayheight {\dimexpr\d_overlay_height \relax}
+\def\usedoverlaydepth {\dimexpr\d_overlay_depth \relax}
+\def\usedoverlayoffset {\dimexpr\d_overlay_offset \relax}
+\def\usedoverlaylinewidth{\dimexpr\d_overlay_linewidth\relax}
+
%D The next register is used to initialize overlays.
\newtoks\everyoverlay
@@ -452,8 +471,8 @@
\to \everyoverlay
\prependtoks
- \hsize\overlaywidth
- \vsize\overlayheight
+ \hsize\d_overlay_width
+ \vsize\d_overlay_height
\to \everyoverlay
\unexpanded\def\defineoverlay
@@ -475,8 +494,8 @@
\egroup
\setlayoutcomponentattribute{\v!overlay:#1}%
\setbox\scratchbox\hbox \layoutcomponentboxattribute
- {\kern -.5\dimexpr\wd\scratchbox-\d_framed_target_wd\relax % was \overlaywidth
- \raise-.5\dimexpr\ht\scratchbox-\d_framed_target_ht\relax % not \overlayheight !
+ {\kern -.5\dimexpr\wd\scratchbox-\d_framed_target_wd\relax % was \d_overlay_width
+ \raise-.5\dimexpr\ht\scratchbox-\d_framed_target_ht\relax % not \d_overlay_height !
\box\scratchbox}%
\wd\scratchbox\d_framed_target_wd
\ht\scratchbox\d_framed_target_ht
@@ -490,19 +509,21 @@
\unexpanded\def\overlayfakebox
{\hbox
{\setbox\scratchbox\emptyhbox
- \wd\scratchbox\overlaywidth
- \ht\scratchbox\overlayheight
+ \wd\scratchbox\d_overlay_width
+ \ht\scratchbox\d_overlay_height
\box\scratchbox}}
%D For testing we provide:
-\def\doifoverlayelse#1% only tests external overlays
+\def\doifelseoverlay#1% only tests external overlays
{\ifcsname\??overlay#1\endcsname
\expandafter\firstoftwoarguments
\else
\expandafter\secondoftwoarguments
\fi}
+\let\doifoverlayelse\doifelseoverlay
+
%D The content of the box will be (temporary) saved in a box. We also have an
%D extra box for backgrounds.
@@ -599,16 +620,28 @@
\hss
\egroup}}
+% \def\pack_framed_overlay_initialize_indeed
+% {\edef\overlaywidth {\the\d_framed_target_wd\space}%
+% \edef\overlayheight {\the\dimexpr\d_framed_target_ht+\d_framed_target_dp\relax\space}%
+% \edef\overlaydepth {\the\d_framed_target_dp\space}%
+% \edef\overlaycolor {\framedparameter\c!backgroundcolor}% let ?
+% \edef\overlaylinecolor{\framedparameter\c!framecolor}% only needed for layers
+% \edef\overlaylinewidth{\the\d_framed_linewidth\space}%
+% %\edef\overlaycorner {\framedparameter\c!backgroundcorner}%
+% %\edef\overlayradius {\framedparameter\c!backgroundradius}%
+% \edef\overlayoffset {\the\framedbackgroundoffset\space}% \backgroundoffset % we steal this one
+% \let\pack_framed_overlay_initialize\relax}
+
\def\pack_framed_overlay_initialize_indeed
- {\edef\overlaywidth {\the\d_framed_target_wd\space}%
- \edef\overlayheight {\the\dimexpr\d_framed_target_ht+\d_framed_target_dp\relax\space}%
- \edef\overlaydepth {\the\d_framed_target_dp\space}%
+ {\d_overlay_width \d_framed_target_wd
+ \d_overlay_height \dimexpr\d_framed_target_ht+\d_framed_target_dp\relax
+ \d_overlay_depth \d_framed_target_dp
+ \d_overlay_linewidth \d_framed_linewidth
+ \d_overlay_offset \framedbackgroundoffset\relax
\edef\overlaycolor {\framedparameter\c!backgroundcolor}% let ?
\edef\overlaylinecolor{\framedparameter\c!framecolor}% only needed for layers
- \edef\overlaylinewidth{\the\d_framed_linewidth\space}%
%\edef\overlaycorner {\framedparameter\c!backgroundcorner}%
%\edef\overlayradius {\framedparameter\c!backgroundradius}%
- \edef\overlayoffset {\the\framedbackgroundoffset\space}% \backgroundoffset % we steal this one
\let\pack_framed_overlay_initialize\relax}
%D One can explictly insert the foreground box. For that purpose we introduce the
@@ -778,6 +811,35 @@
\newcount\c_pack_framed_nesting
+% to be tested (slightly more efficient):
+%
+% \unexpanded\def\pack_frame_common % #1 #2
+% {\bgroup
+% \advance\c_pack_framed_nesting\plusone
+% \expandafter\let\csname\??framed>\the\c_pack_framed_nesting:\s!parent\endcsname\??framed
+% \edef\currentframed{>\the\c_pack_framed_nesting}%
+% \pack_framed_initialize
+% \bgroup
+% \doifnextoptionalcselse} % #1 #2
+%
+% \unexpanded\def\framed {\pack_frame_common\pack_framed_process_framed_pickup\pack_framed_process_indeed}
+% \unexpanded\def\startframed{\pack_frame_common\pack_framed_start_framed_pickup \pack_framed_start_indeed }
+%
+% \def\pack_framed_process_framed_pickup[#1]%
+% {\setupcurrentframed[#1]%
+% \pack_framed_process_indeed}
+%
+% \def\pack_framed_start_framed_pickup[#1]%
+% {\setupcurrentframed[#1]% here !
+% \secondargumenttrue % dirty trick
+% \pack_framed_start_framed_indeed}
+%
+% \def\pack_framed_start_framed_indeed
+% {\pack_framed_process_indeed
+% \bgroup}
+%
+% no longer .. we also accept \startframed[tag]
+
\unexpanded\def\pack_framed_process_framed[#1]%
{\bgroup
\iffirstargument % faster
@@ -793,20 +855,63 @@
\pack_framed_initialize
\dosingleempty\pack_framed_process_framed}
+% \unexpanded\def\startframed
+% {\dosingleempty\pack_framed_start_framed}
+%
+% \def\pack_framed_start_framed[#1]%
+% {\bgroup
+% \advance\c_pack_framed_nesting\plusone
+% \expandafter\let\csname\??framed>\the\c_pack_framed_nesting:\s!parent\endcsname\??framed
+% \edef\currentframed{>\the\c_pack_framed_nesting}%
+% \pack_framed_initialize
+% \bgroup
+% \iffirstargument
+% \secondargumenttrue % dirty trick
+% \setupcurrentframed[#1]% here !
+% \fi
+% \pack_framed_process_indeed
+% \bgroup
+% \ignorespaces}
+
\unexpanded\def\startframed
{\dosingleempty\pack_framed_start_framed}
\def\pack_framed_start_framed[#1]%
{\bgroup
- \advance\c_pack_framed_nesting\plusone
+ \doifelseassignment{#1}\pack_framed_start_framed_yes\pack_framed_start_framed_nop{#1}}
+
+\def\pack_framed_start_framed_yes#1%
+ {\advance\c_pack_framed_nesting\plusone
\expandafter\let\csname\??framed>\the\c_pack_framed_nesting:\s!parent\endcsname\??framed
\iffirstargument\secondargumenttrue\fi % dirty trick
\edef\currentframed{>\the\c_pack_framed_nesting}%
\pack_framed_initialize
- \pack_framed_process_framed[#1]% can be inlined
- \bgroup}
+ \bgroup
+ \iffirstargument
+ \secondargumenttrue % dirty trick
+ \setupcurrentframed[#1]% here !
+ \fi
+ \pack_framed_process_indeed
+ \bgroup
+ \ignorespaces}
+
+\def\pack_framed_start_framed_nop#1%
+ {\edef\currentframed{#1}%
+ \dosingleempty\pack_framed_start_framed_nop_indeed}
+
+\def\pack_framed_start_framed_nop_indeed[#1]%
+ {\pack_framed_initialize
+ \bgroup
+ \setupcurrentframed[#1]% here !
+ \pack_framed_process_indeed
+ \bgroup
+ \ignorespaces}
+
+% till here
-\let\stopframed\egroup
+\unexpanded\def\stopframed
+ {\removeunwantedspaces
+ \egroup}
\unexpanded\def\normalframedwithsettings[#1]%
{\bgroup
@@ -1304,10 +1409,19 @@
\def\pack_framed_restart
{\aftergroup\pack_framed_finish}
-\def\pack_framed_do_top {\raggedtopcommand\framedparameter\c!top}
-\def\pack_framed_do_bottom{\framedparameter\c!bottom\raggedbottomcommand}
+\def\pack_framed_do_top
+ {\raggedtopcommand
+ \framedparameter\c!top
+ \edef\p_blank{\framedparameter\c!blank}%
+ \ifx\p_blank\v!yes\else % auto or no
+ \doinhibitblank
+ \fi}
+
+\def\pack_framed_do_bottom
+ {\framedparameter\c!bottom
+ \raggedbottomcommand}
-%D Carefull analysis of this macro will learn us that not all branches in the last
+%D Careful analysis of this macro will learn us that not all branches in the last
%D conditionals can be encountered, that is, some assignments to \type{\next} will
%D never occur. Nevertheless we implement the whole scheme, if not for future
%D extensions.
@@ -1385,7 +1499,7 @@
\fi}
\unexpanded\def\pack_framed_finish
- {\pack_framed_stop_orientation % hm, wrong place ! should rotate the result (after reshape)
+ {%\pack_framed_stop_orientation % hm, wrong place ! should rotate the result (after reshape) .. moved down
\pack_framed_locator_before\p_framed_location
\ifconditional\c_framed_has_format
\ifx\p_framed_autowidth\v!force
@@ -1417,6 +1531,7 @@
\ifx\p_framed_empty\v!yes
\pack_framed_fake_box
\fi
+ \pack_framed_stop_orientation % moved here at 2014-05-25
\iftrialtypesetting \else
\edef\p_framed_region{\framedparameter\c!region}%
\ifx\p_framed_region\v!yes % maybe later named
@@ -1910,10 +2025,10 @@
%D \stoplinecorrection
%D
%D \startbuffer
-%D \framed[strut=nee,offset=.5cm] {rule based learning}
-%D \framed[strut=nee,offset=0cm] {rule based learning}
-%D \framed[strut=nee,offset=none] {rule based learning}
-%D \framed[strut=nee,offset=overlay]{rule based learning}
+%D \framed[strut=no,offset=.5cm] {rule based learning}
+%D \framed[strut=no,offset=0cm] {rule based learning}
+%D \framed[strut=no,offset=none] {rule based learning}
+%D \framed[strut=no,offset=overlay]{rule based learning}
%D \stopbuffer
%D
%D \typebuffer
@@ -1923,9 +2038,9 @@
%D \stoplinecorrection
%D
%D \startbuffer
-%D \framed[width=3cm,align=left] {rule\\based\\learning}
-%D \framed[width=3cm,align=middle] {rule\\based\\learning}
-%D \framed[width=3cm,align=right] {rule\\based\\learning}
+%D \framed[width=3cm,align=left] {rule\\based\\learning}
+%D \framed[width=3cm,align=middle] {rule\\based\\learning}
+%D \framed[width=3cm,align=right] {rule\\based\\learning}
%D \framed[width=fit,align=middle] {rule\\based\\learning}
%D \stopbuffer
%D
@@ -1992,7 +2107,6 @@
% \vbox{\hbox{x}}
% \stopTEXpage
-
% \def\pack_framed_forgetall{\forgetall}
\def\pack_framed_set_foregroundcolor
@@ -2008,7 +2122,7 @@
{\vbox to \d_framed_height
\bgroup
\let\postprocessframebox\relax
-% \pack_framed_forgetall
+ % \pack_framed_forgetall
\iftrialtypesetting \else
\pack_framed_set_foregroundcolor
\fi
@@ -2019,7 +2133,7 @@
\raggedcommand
\pack_framed_do_top
\bgroup
-\synchronizeinlinedirection
+ \synchronizeinlinedirection
\localbegstrut
\aftergroup\localendstrut
\aftergroup\pack_framed_do_bottom
@@ -2030,7 +2144,7 @@
{\vbox to \d_framed_height
\bgroup
\let\postprocessframebox\relax
-% \pack_framed_forgetall
+ % \pack_framed_forgetall
\iftrialtypesetting \else
\pack_framed_set_foregroundcolor
\fi
@@ -2041,7 +2155,7 @@
\raggedcenter
\vss
\bgroup
-\synchronizeinlinedirection
+ \synchronizeinlinedirection
\localbegstrut
\aftergroup\localendstrut
\aftergroup\vss
@@ -2052,7 +2166,7 @@
{\vbox to \d_framed_height
\bgroup
\let\postprocessframebox\relax
-% \pack_framed_forgetall
+ % \pack_framed_forgetall
\iftrialtypesetting \else
\pack_framed_set_foregroundcolor
\fi
@@ -2064,7 +2178,7 @@
\aftergroup\localendstrut
\aftergroup\vss
\aftergroup\egroup
-\synchronizeinlinedirection
+ \synchronizeinlinedirection
\localbegstrut
\doformatonelinerbox}
@@ -2072,7 +2186,7 @@
{\vbox
\bgroup
\let\postprocessframebox\relax
-% \pack_framed_forgetall
+ % \pack_framed_forgetall
\iftrialtypesetting \else
\pack_framed_set_foregroundcolor
\fi
@@ -2082,7 +2196,7 @@
\raggedcommand
\pack_framed_do_top
\bgroup
-\synchronizeinlinedirection
+ \synchronizeinlinedirection
\localbegstrut
\aftergroup\localendstrut
\aftergroup\pack_framed_do_bottom
@@ -2093,7 +2207,7 @@
{\vbox to \d_framed_height
\bgroup
\let\postprocessframebox\relax
-% \pack_framed_forgetall
+ % \pack_framed_forgetall
\iftrialtypesetting \else
\pack_framed_set_foregroundcolor
\fi
@@ -2106,7 +2220,7 @@
\hbox
\bgroup
\aftergroup\egroup
-\synchronizeinlinedirection
+ \synchronizeinlinedirection
\localstrut
\doformatonelinerbox}
@@ -2114,13 +2228,13 @@
{\hbox to \d_framed_width
\bgroup
\let\postprocessframebox\relax
-% \pack_framed_forgetall
+ % \pack_framed_forgetall
\iftrialtypesetting \else
\pack_framed_set_foregroundcolor
\fi
\pack_framed_do_setups
\hss
-\synchronizeinlinedirection
+ \synchronizeinlinedirection
\localstrut
\bgroup
\aftergroup\hss
@@ -2135,7 +2249,7 @@
\fi
\let\postprocessframebox\relax
\pack_framed_do_setups
-\synchronizeinlinedirection
+ \synchronizeinlinedirection
\localstrut
\doformatonelinerbox}
@@ -2215,8 +2329,8 @@
\framedmaxwidth \zeropoint
\framedaveragewidth\zeropoint}
-\def\pack_framed_reshape_process{\ifvbox\b_framed_normal\ctxcommand{doreshapeframedbox(\number\b_framed_normal)}\fi}
-\def\pack_framed_reshape_analyze{\ifvbox\b_framed_normal\ctxcommand{doanalyzeframedbox(\number\b_framed_normal)}\fi}
+\def\pack_framed_reshape_process{\ifvbox\b_framed_normal\clf_doreshapeframedbox\b_framed_normal\relax\fi}
+\def\pack_framed_reshape_analyze{\ifvbox\b_framed_normal\clf_doanalyzeframedbox\b_framed_normal\relax\fi}
% torture test / strange case (much depth) / method 2 needed
%
@@ -2514,7 +2628,6 @@
%\c!foregroundstyle=,
%\c!background=,
%\c!backgroundcolor=,
- \c!backgroundscreen=\defaultbackgroundscreen,
\c!linecorrection=\v!on,
\c!depthcorrection=\v!on,
\c!margin=\v!standard]
@@ -2544,7 +2657,7 @@
\dodoubleempty\pack_framed_text_start_indeed}
\def\pack_framed_text_start_indeed[#1][#2]%
- {\doifassignmentelse{#1}
+ {\doifelseassignment{#1}
{\pack_framed_text_start_continue\empty{#1}}
{\pack_framed_text_start_continue{#1}{#2}}}
@@ -2559,7 +2672,7 @@
\startboxedcontent
\hsize\localhsize
% \insidefloattrue % ? better
- \normalexpanded{\switchtobodyfont[\framedtextparameter\c!bodyfont]}%
+ \usebodyfontparameter\framedtextparameter
\letframedtextparameter\c!strut\v!no
\inheritedframedtextframed\bgroup
\let\\=\endgraf
@@ -2570,9 +2683,9 @@
\else
\bgroup
\fi
-\vskip-\strutdp % brrr why is this needed ... needs to be sorted out, see testcase 1
+ \vskip-\strutdp % brrr why is this needed ... needs to be sorted out, see testcase 1
\doinhibitblank
- \setupindenting[\framedtextparameter\c!indenting]%
+ \useindentingparameter\framedtextparameter
\useframedtextstyleandcolor\c!style\c!color
\ignorespaces}
@@ -2675,7 +2788,7 @@
\dosingleempty\pack_framed_text_start_direct}
\def\pack_framed_text_start_direct[#1]%
- {\normalexpanded{\switchtobodyfont[\framedtextparameter\c!bodyfont]}%
+ {\usebodyfontparameter\framedtextparameter
\letframedtextparameter\c!strut\v!no
\iffirstargument
\setupcurrentframedtext[#1]%
diff --git a/Master/texmf-dist/tex/context/base/page-app.mkiv b/Master/texmf-dist/tex/context/base/page-app.mkiv
index e4858d48ffb..2e81f75371f 100644
--- a/Master/texmf-dist/tex/context/base/page-app.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-app.mkiv
@@ -139,6 +139,9 @@
[TEXpage]
[\c!align=\v!normal] % needed, else problems !
+\unexpanded\def\setupTEXpage
+ {\setupfittingpage[TEXpage]}
+
%D For Mojca:
%D
%D \starttyping
diff --git a/Master/texmf-dist/tex/context/base/page-bck.mkiv b/Master/texmf-dist/tex/context/base/page-bck.mkiv
index 0246e8eb61b..01de48e8cda 100644
--- a/Master/texmf-dist/tex/context/base/page-bck.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-bck.mkiv
@@ -55,7 +55,7 @@
%D This is the only spot where we hav ea low level dependency on the way
%D parent chains are defined but we want the speed.
-\def\page_backgrounds_check_background
+\unexpanded\def\page_backgrounds_check_background
{\ifcsname\??framed\currentotrbackground:\c!background\endcsname
\edef\page_background_temp{\csname\??framed\currentotrbackground:\c!background\endcsname}%
\ifx\page_background_temp\empty
@@ -140,13 +140,15 @@
{\edef\currentotrbackground{\??layoutbackgrounds#1}%
\page_backgrounds_check_background}
-\def\doifsomebackgroundelse#1%
+\def\doifelsesomebackground#1%
{\ifcsname\??layoutbackgrounds#1\endcsname
\expandafter\firstoftwoarguments
\else
\expandafter\secondoftwoarguments
\fi}
+\let\doifsomebackgroundelse\doifelsesomebackground
+
\def\doifsomebackground#1%
{\ifcsname\??layoutbackgrounds#1\endcsname
\expandafter\firstofoneargument
@@ -277,7 +279,7 @@
\page_backgrounds_set_boxes
\setbox#1\vbox
{\offinterlineskip
- \doifmarginswapelse{\copy\leftbackground}{\copy\rightbackground}%
+ \doifelsemarginswap{\copy\leftbackground}{\copy\rightbackground}%
\box#1}%
\fi}
@@ -343,7 +345,7 @@
{\dontcomplain
\swapmargins
\ifconditional\swapbackgroundmargins
- \doifmarginswapelse \donothing
+ \doifelsemarginswap \donothing
{\swapmacros\v!rightmargin\v!leftmargin
\swapmacros\v!rightedge \v!leftedge}%
\fi
@@ -501,7 +503,7 @@
\unexpanded\def\page_backgrounds_setup_double[#1][#2][#3]% if needed we can speed this up
{\global\settrue\c_page_backgrounds_some
\def\page_backgrounds_setup_step##1%
- {\doifinsetelse{##1}\v_page_backgrounds_double_set
+ {\doifelseinset{##1}\v_page_backgrounds_double_set
{\page_backgrounds_setup_and_check{##1}{#3}}
{\def\page_backgrounds_setup_step_nested####1{\page_backgrounds_setup_and_check{##1####1}{#3}}%
\processcommacommand[#2]\page_backgrounds_setup_step_nested}}%
@@ -510,7 +512,7 @@
\unexpanded\def\page_backgrounds_setup_single[#1][#2][#3]%
{\global\settrue\c_page_backgrounds_some
- \doifcommonelse{#1}\v_page_backgrounds_single_set
+ \doifelsecommon{#1}\v_page_backgrounds_single_set
{\def\page_backgrounds_setup_step##1{\page_backgrounds_setup_and_check{##1}{#2}}%
\processcommacommand[#1]\page_backgrounds_setup_step
\the\everybackgroundssetup}%
@@ -607,6 +609,48 @@
\setfalse\c_page_backgrounds_some
+%D Sometimes you have a document wide (page) background but need to overload it
+%D locally. In such case (at least in my experience) the only values that get set
+%D are the background and backgroundcolor (if set at all). A full inheritance chain
+%D would complicate things because then we need to use named backgrounds which in
+%D turn will make this mechanism slower. I considered independent local backgrounds
+%D but that also complicates the code (not that much) but isolation means that we
+%D need to set more parameters each time. The following simple approach proabbly
+%D suits most usage.
+%D
+%D \starttyping
+%D \starttext
+%D \setupbackgrounds[page][background=color,backgroundcolor=red]
+%D \input tufte \page
+%D \setupbackgrounds[page][background=,backgroundcolor=]
+%D \input tufte \page
+%D \setupbackgrounds[page][background=color,backgroundcolor=red]
+%D \input tufte \page
+%D \pushbackground[page]
+%D \setupbackgrounds[page][background=color,backgroundcolor=green]
+%D \input tufte \page
+%D \popbackground
+%D \input tufte \page
+%D \stoptext
+%D \stoptyping
+
+\unexpanded\def\pushbackground[#1]%
+ {\pushmacro\popbackground
+ \edef\currentotrbackground{\??layoutbackgrounds#1}%
+ \unexpanded\edef\popbackground
+ {\setupframed
+ [\currentotrbackground]
+ [\c!background=\namedframedparameter{\currentotrbackground}\c!background,
+ \c!backgroundcolor=\namedframedparameter{\currentotrbackground}\c!backgroundcolor]%
+ \page_backgrounds_check_background
+ \popmacro\popbackground}%
+ \setupframed
+ [\currentotrbackground]
+ [\c!background=,\c!backgroundcolor=]%
+ \page_backgrounds_check_background}
+
+\let\popbackground\relax
+
\protect \endinput
% %D The next series is used in local (for instance floating) backgrounds.
diff --git a/Master/texmf-dist/tex/context/base/page-brk.mkiv b/Master/texmf-dist/tex/context/base/page-brk.mkiv
index 11dc04bfda5..f9c93305293 100644
--- a/Master/texmf-dist/tex/context/base/page-brk.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-brk.mkiv
@@ -112,13 +112,13 @@
\endgroup
\fi}
-\def\resetpagebreak % used elsewhere too
+\unexpanded\def\resetpagebreak % used elsewhere too
{\global\settrue\c_page_breaks_enabled}
-\def\simplifypagebreak % to be used grouped !
+\unexpanded\def\simplifypagebreak % to be used grouped !
{\def\page_breaks_process[##1]{\goodbreak}}
-\def\disablepagebreaks % to be used grouped !
+\unexpanded\def\disablepagebreaks % to be used grouped !
{\def\page_breaks_process[##1]{}}
\installpagebreakmethod \s!dummy
@@ -134,11 +134,11 @@
\endgroup}
\installpagebreakmethod \s!unknown
- {\doifinstringelse{+}\page_breaks_current_option
+ {\doifelseinstring{+}\page_breaks_current_option
{\page_otr_flush_all_floats
\page_otr_command_next_page
\dorecurse\page_breaks_current_option\page_otr_insert_dummy_page}
- {\doifnumberelse\page_breaks_current_option
+ {\doifelsenumber\page_breaks_current_option
{\page_otr_flush_all_floats
\page_otr_command_next_page
\doloop
@@ -178,6 +178,8 @@
\global\pageornamentstate\plusone
\fi}
+% also needed: \page \doifoddpageelse\relax{\page[\v!blank,\v!right]
+
\installpagebreakmethod \v!no
{\ifconditional\c_page_breaks_enabled
\dosomebreak\nobreak
@@ -220,11 +222,11 @@
\installpagebreakmethod \v!even
{\page
- \doifoddpageelse\page_reset_marks_and_insert_dummy\donothing}
+ \doifelseoddpage\page_reset_marks_and_insert_dummy\donothing}
\installpagebreakmethod \v!odd
{\page
- \doifoddpageelse\donothing\page_reset_marks_and_insert_dummy}
+ \doifelseoddpage\donothing\page_reset_marks_and_insert_dummy}
\installpagebreakmethod \v!quadruple % not yet ok inside columnsets
{\ifdoublesided
diff --git a/Master/texmf-dist/tex/context/base/page-flt.lua b/Master/texmf-dist/tex/context/base/page-flt.lua
index 7b1afc55cf3..e91285d0a64 100644
--- a/Master/texmf-dist/tex/context/base/page-flt.lua
+++ b/Master/texmf-dist/tex/context/base/page-flt.lua
@@ -242,10 +242,14 @@ function floats.checkedpagefloat(packed)
end
end
-function floats.nofstacked()
+function floats.nofstacked(which)
return #stacks[which or default] or 0
end
+function floats.hasstacked(which)
+ return (#stacks[which or default] or 0) > 0
+end
+
-- todo: check for digits !
local method = C((1-S(", :"))^1)
@@ -273,27 +277,101 @@ end
-- interface
-local context = context
-local context_setvalue = context.setvalue
-
-commands.flushfloat = floats.flush
-commands.savefloat = floats.save
-commands.resavefloat = floats.resave
-commands.pushfloat = floats.push
-commands.popfloat = floats.pop
-commands.consultfloat = floats.consult
-commands.collectfloat = floats.collect
-
-function commands.getfloatvariable (...) local v = floats.getvariable(...) if v then context(v) end end
-function commands.checkedpagefloat (...) local v = floats.checkedpagefloat(...) if v then context(v) end end
-
-function commands.nofstackedfloats (...) context(floats.nofstacked(...)) end
-function commands.doifelsesavedfloat(...) commands.doifelse(floats.nofstacked(...)>0) end
-
-function commands.analysefloatmethod(str) -- currently only one method
- local method, label, row, column = floats.analysemethod(str)
- context_setvalue("floatmethod",method or "")
- context_setvalue("floatlabel", label or "")
- context_setvalue("floatrow", row or "")
- context_setvalue("floatcolumn",column or "")
-end
+local context = context
+local commands = commands
+local implement = interfaces.implement
+local setmacro = interfaces.setmacro
+
+implement {
+ name = "flushfloat",
+ actions = floats.flush,
+ arguments = { "string", "integer" },
+}
+
+implement {
+ name = "flushlabeledfloat",
+ actions = floats.flush,
+ arguments = { "string", "string", true },
+}
+
+implement {
+ name = "savefloat",
+ actions = floats.save,
+ arguments = "string"
+}
+
+implement {
+ name = "savespecificfloat",
+ actions = floats.save,
+ arguments = {
+ "string",
+ {
+ { "specification" },
+ { "label" },
+ }
+ }
+}
+
+implement {
+ name = "resavefloat",
+ actions = floats.resave,
+ arguments = "string"
+}
+
+implement {
+ name = "pushfloat",
+ actions = floats.push
+}
+
+implement {
+ name = "popfloat",
+ actions = floats.pop
+}
+
+implement {
+ name = "consultfloat",
+ actions = floats.consult,
+ arguments = "string",
+}
+
+implement {
+ name = "collectfloat",
+ actions = floats.collect,
+ arguments = { "string", "dimen", "dimen" }
+}
+
+implement {
+ name = "getfloatvariable",
+ actions = { floats.getvariable, context },
+ arguments = "string"
+}
+
+implement {
+ name = "checkedpagefloat",
+ actions = { floats.checkedpagefloat, context },
+ arguments = "string"
+}
+
+implement {
+ name = "nofstackedfloats",
+ actions = { floats.nofstacked, context },
+ arguments = "string"
+}
+
+implement {
+ name = "doifelsestackedfloats",
+ actions = { floats.hasstacked, commands.doifelse },
+ arguments = "string"
+}
+
+implement {
+ name = "analysefloatmethod",
+ actions = function(str)
+ local method, label, row, column = floats.analysemethod(str)
+ setmacro("floatmethod",method or "")
+ setmacro("floatlabel", label or "")
+ setmacro("floatrow", row or "")
+ setmacro("floatcolumn",column or "")
+ end,
+ arguments = "string"
+}
diff --git a/Master/texmf-dist/tex/context/base/page-flt.mkiv b/Master/texmf-dist/tex/context/base/page-flt.mkiv
index d641e1c7d94..16c42713970 100644
--- a/Master/texmf-dist/tex/context/base/page-flt.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-flt.mkiv
@@ -83,49 +83,49 @@
\to \everyfloatscheck
\unexpanded\def\page_floats_flush#1#2%
- {\ctxcommand{flushfloat("#1",\number#2)}%
+ {\clf_flushfloat{#1}#2\relax
\the\everyfloatscheck}
\unexpanded\def\page_floats_flush_by_label#1#2%
- {\ctxcommand{flushfloat("#1","#2",true)}%
+ {\clf_flushlabeledfloat{#1}{#2}\relax
\the\everyfloatscheck}
\unexpanded\def\page_floats_save#1%
- {\ctxcommand{savefloat("#1")}%
+ {\clf_savefloat{#1}\relax
\the\everyfloatscheck}
\unexpanded\def\page_floats_resave#1%
- {\ctxcommand{resavefloat("#1")}%
+ {\clf_resavefloat{#1}\relax
\the\everyfloatscheck}
\unexpanded\def\page_floats_push_saved
- {\ctxcommand{pushfloat()}%
+ {\clf_pushfloat
\the\everyfloatscheck}
\unexpanded\def\page_floats_pop_saved
- {\ctxcommand{popfloat()}%
+ {\clf_popfloat
\the\everyfloatscheck}
\unexpanded\def\page_floats_get_info#1%
- {\ctxcommand{consultfloat("#1")}}
+ {\clf_consultfloat{#1}}
\unexpanded\def\page_floats_if_else#1%
- {\ctxcommand{doifelsesavedfloat("#1")}}
+ {\clf_doifelsestackedfloats{#1}}
\unexpanded\def\page_floats_collect#1#2#3%
- {\ctxcommand{collectfloat("#1",\number\dimexpr#2,\number\dimexpr#3)}}
+ {\clf_collectfloat{#1}\dimexpr#2\relax\dimexpr#3\relax}
-\unexpanded\def\nofstackedfloatincategory#1%
- {\ctxcommand{nofstackedfloats("#1")}}
+\def\nofstackedfloatincategory#1%
+ {\clf_nofstackedfloats{#1}}
\let\page_floats_column_push_saved\page_floats_push_saved % overloaded in page-mul
\let\page_floats_column_pop_saved \page_floats_pop_saved % overloaded in page-mul
\unexpanded\def\page_floats_save_page_float#1#2%
- {\ctxcommand{savefloat("#1", { specification = "#2" })}}
+ {\clf_savespecificfloat{#1}{specification{#2}}\relax}
\unexpanded\def\page_floats_save_somewhere_float#1#2% #1=method
- {\ctxcommand{savefloat("#1", { specification = "#2", label = "\floatlabel" })}}
+ {\clf_savespecificfloat{#1}{specification{#2}label{\floatlabel}}\relax}
%D This is an experimental new feature (for Alan Braslau), a prelude to more:
%D
@@ -256,7 +256,7 @@
\def\page_floats_flush_page_floats_indeed#1% future releases can do more clever things
{\page_floats_flush{#1}\plusone
- \edef\floatspecification{\ctxcommand{getfloatvariable("specification")}}% Is this okay?
+ \edef\floatspecification{\clf_getfloatvariable{specification}}% Is this okay?
\the\everybeforeflushedpagefloat
\vbox to \textheight
{\doifnotinset\v!high\floatspecification\vfill
@@ -265,7 +265,7 @@
\page_otr_fill_and_eject_page}
\unexpanded\def\page_floats_flush_page_floats % used in postpone
- {\edef\m_page_otf_checked_page_float{\ctxcommand{checkedpagefloat()}}% (true) for packed
+ {\edef\m_page_otf_checked_page_float{\clf_checkedpagefloat}%
\ifx\m_page_otf_checked_page_float\empty
% nothing
\else\ifx\m_page_otf_checked_page_float\v!empty
diff --git a/Master/texmf-dist/tex/context/base/page-flw.mkiv b/Master/texmf-dist/tex/context/base/page-flw.mkiv
index ec1fa636df7..56fe32e5b9e 100644
--- a/Master/texmf-dist/tex/context/base/page-flw.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-flw.mkiv
@@ -80,14 +80,14 @@
\def\textflowcollector#1%
{\csname\??textflowbox#1\endcsname}
-\unexpanded\def\doiftextflowcollectorelse#1%
+\unexpanded\def\doifelsetextflowcollector#1%
{\ifcsname\??textflowbox#1\endcsname
\expandafter\firstoftwoarguments
\else
\expandafter\secondoftwoarguments
\fi}
-\unexpanded\def\doiftextflowelse#1%
+\unexpanded\def\doifelsetextflow#1%
{\ifcsname\??textflowbox#1\endcsname
\ifvoid\csname\??textflowbox#1\endcsname
\doubleexpandafter\secondoftwoarguments
@@ -98,6 +98,9 @@
\expandafter\secondoftwoarguments
\fi}
+\let\doiftextflowcollectorelse\doifelsetextflowcollector
+\let\doiftextflowelse \doifelsetextflow
+
% \unexpanded\def\doiftextflow#1%
% {\doiftextflowelse{#1}\firstofoneargument\gobbleoneargument}
diff --git a/Master/texmf-dist/tex/context/base/page-imp.mkiv b/Master/texmf-dist/tex/context/base/page-imp.mkiv
index 230ede570ed..198a982298c 100644
--- a/Master/texmf-dist/tex/context/base/page-imp.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-imp.mkiv
@@ -163,7 +163,7 @@
\donetrue
\fi
\else % testen, aangepast / expanded nodig ?
- \normalexpanded{\doifinsetelse{\the\shippedoutpages}{\pagestoshipout}}\donetrue\donefalse
+ \normalexpanded{\doifelseinset{\the\shippedoutpages}{\pagestoshipout}}\donetrue\donefalse
\fi
\ifdone
\setbox\shipoutscratchbox\hbox{#1}%
@@ -288,7 +288,7 @@
\fi
\setuppapersize
\ifarrangingpages
- \ctxlua{job.disablesave()}%
+ \clf_disablejobsave
%\disabledirective[job.save]%
\fi
\fi}
@@ -355,14 +355,14 @@
{\dosetuparrangement{2}{2}{4}{3}{3}%
\pusharrangedpageSIXTEENTWO\poparrangedpagesAtoD\relax}
-\installpagearrangement 2*2*4 % onother one of Willy Egger
+\installpagearrangement 2*2*4 % another one of Willy Egger
{\dosetuparrangement{2}{1}{8}{3}{2}%
\pusharrangedpageSIXTEENFOUR\poparrangedpagesAtoH\relax}
\installpagearrangement 2TOPSIDE
{\dosetuparrangement{1}{2}{4}{2}{3}%
\pusharrangedpageTWOTOPSIDE\poparrangedpagesTWOTOPSIDE\handlearrangedpageTOP}
-
+
\def\filluparrangedpages % beware: \realpageno is 1 ahead
{\ifarrangingpages
\scratchcounter\numexpr\realpageno-\plusone\relax
@@ -748,7 +748,7 @@
\poparrangedpages
\fi}
-%D Might be used if a printer is printing from a rol or creating mini-books from A4:
+%D Might be used if a printer is printing from a roll or creating mini-books from A4:
%D This section has 16 pages. The folding scheme is first a Z-fold and at the end
%D a final fold in the spine.
%D Coding: [2*8*Z]
@@ -1045,7 +1045,7 @@
%D There should be arrangements for sections made of heavy and thick paper. i.e. the heavier the paper
%D the fewer pages per section:
-%D Section with 8 pages put on to sheets of paper. Each sheet carries recto 2 and verso 2 pages.
+%D Section with 8 pages put on two sheets of paper. Each sheet carries recto 2 and verso 2 pages.
%D Coding: [2*2*2]
\installpagearrangement 2*2*2
@@ -1351,7 +1351,7 @@
\doifelse{#1}\v!page {\let\page_boxes_apply_shift_print\page_boxes_apply_shift}{\let\page_boxes_apply_shift_print\gobbleoneargument}%
\doifelse{#1}\v!paper{\let\page_boxes_apply_shift_paper\page_boxes_apply_shift}{\let\page_boxes_apply_shift_paper\gobbleoneargument}%
\else\ifsecondargument
- \doifinsetelse{#1}{\v!page,\v!paper}
+ \doifelseinset{#1}{\v!page,\v!paper}
{\setuppageshift[#1][#2][#2]}
{\setuppageshift[\v!page][#1][#2]}%
\else\iffirstargument
diff --git a/Master/texmf-dist/tex/context/base/page-ini.mkiv b/Master/texmf-dist/tex/context/base/page-ini.mkiv
index fdffa552d5d..15783a99bc3 100644
--- a/Master/texmf-dist/tex/context/base/page-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-ini.mkiv
@@ -102,6 +102,7 @@
\page_otr_check_for_pending_inserts
% but does not hurt either (we're still in the otr!)
\inpagebodytrue % needed for enabling \blank ! brrr
+ \pagebodymode\plusone % todo: \plustwo when spread
\page_otr_command_flush_saved_floats
\page_otr_command_set_vsize % this is needed for interacting components, like floats and multicolumns
\strc_pagenumbers_increment_counters % should hook into an every
@@ -143,9 +144,15 @@
\newconstant\pageornamentstate % 0=on 1=one-off 2=always-off
+% \appendtoks
+% \ifcase\pageornamentstate \or
+% \pageornamentstate\zerocount
+% \fi
+% \to \everyaftershipout
+
\appendtoks
\ifcase\pageornamentstate \or
- \pageornamentstate\zerocount
+ \global\pageornamentstate\zerocount
\fi
\to \everyaftershipout
@@ -229,7 +236,7 @@
\the\everyafterpagebody
\egroup}
-\def\doiftopofpageelse
+\def\doifelsetopofpage
{\ifdim\pagegoal=\maxdimen
\expandafter\firstoftwoarguments
\else\ifdim\pagegoal=\vsize
@@ -238,6 +245,8 @@
\doubleexpandafter\secondoftwoarguments
\fi\fi}
+\let\doiftopofpageelse\doifelsetopofpage
+
% %D Idea:
%
% \newinsert\thispageinsert % <- installinsertion
diff --git a/Master/texmf-dist/tex/context/base/page-inj.lua b/Master/texmf-dist/tex/context/base/page-inj.lua
index 56e5a234e8b..fd66ead08d1 100644
--- a/Master/texmf-dist/tex/context/base/page-inj.lua
+++ b/Master/texmf-dist/tex/context/base/page-inj.lua
@@ -16,10 +16,9 @@ pagebuilders.injections = injections
local report = logs.reporter("pagebuilder","injections")
local trace = false trackers.register("pagebuilder.injections",function(v) trace = v end)
-local variables = interfaces.variables
-
local context = context
-local commands = commands
+local implement = interfaces.implement
+local variables = interfaces.variables
local texsetcount = tex.setcount
@@ -103,6 +102,24 @@ function injections.flushafter() -- maybe not public, just commands.*
end
end
-commands.page_injections_save = injections.save
-commands.page_injections_flush_after = injections.flushafter
-commands.page_injections_flush_before = injections.flushbefore
+implement {
+ name = "savepageinjections",
+ actions = injections.save,
+ arguments = {
+ {
+ { "name" },
+ { "state" },
+ { "userdata" }
+ }
+ }
+}
+
+implement {
+ name = "flushpageinjectionsbefore",
+ actions = injections.flushbefore
+}
+
+implement {
+ name = "flushpageinjectionsafter",
+ actions = injections.flushafter
+}
diff --git a/Master/texmf-dist/tex/context/base/page-inj.mkvi b/Master/texmf-dist/tex/context/base/page-inj.mkvi
index bee56468346..03472fe5593 100644
--- a/Master/texmf-dist/tex/context/base/page-inj.mkvi
+++ b/Master/texmf-dist/tex/context/base/page-inj.mkvi
@@ -29,8 +29,8 @@
\installframedcommandhandler \??pageinjection {pageinjection} \??pageinjection
\installcommandhandler \??pageinjectionalternative {pageinjectionalternative} \??pageinjectionalternative
-\def\page_boxes_flush_before{\ctxcommand{page_injections_flush_before()}}
-\def\page_boxes_flush_after {\ctxcommand{page_injections_flush_after ()}}
+\let\page_boxes_flush_before\clf_flushpageinjectionsbefore
+\let\page_boxes_flush_after \clf_flushpageinjectionsafter
\def\page_injections_flush_saved#name#parameters%
{\begingroup
@@ -47,11 +47,11 @@
\dodoubleempty\page_injections_direct}
\def\page_injections_direct[#1][#2]% name parameters | settings parameters | name | parameters
- {\doifassignmentelse{#1}
- {\doifassignmentelse{#2}
+ {\doifelseassignment{#1}
+ {\doifelseassignment{#2}
{\page_injections_direct_settings_parameters{#1}{#2}}
{\page_injections_direct_parameters {#1}}}
- {\doifassignmentelse{#2}
+ {\doifelseassignment{#2}
{\page_injections_direct_name_parameters {#1}{#2}}
{\page_injections_direct_name {#1}}}}
@@ -87,11 +87,11 @@
\fi}
\def\page_injections_direct_indeed_yes#parameters%
- {\ctxcommand{page_injections_save{
- name = "\currentpageinjection",
- state = "\p_page_injections_state",
- userdata = \!!bs\normalunexpanded{#parameters}\!!es
- }}%
+ {\clf_savepageinjections
+ name {\currentpageinjection}%
+ state {\p_page_injections_state}%
+ userdata {\normalunexpanded{#parameters}}%
+ \relax
\endgroup}
\def\page_injections_direct_indeed_nop#parameters%
diff --git a/Master/texmf-dist/tex/context/base/page-ins.lua b/Master/texmf-dist/tex/context/base/page-ins.lua
index 7f870735d27..235f586c689 100644
--- a/Master/texmf-dist/tex/context/base/page-ins.lua
+++ b/Master/texmf-dist/tex/context/base/page-ins.lua
@@ -4,19 +4,9 @@ if not modules then modules = { } end modules ['page-ins'] = {
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files",
- -- public = {
- -- functions = {
- -- "inserts.define",
- -- "inserts.getdata",
- -- },
- -- commands = {
- -- "defineinsertion",
- -- "inserttionnumber",
- -- }
- -- }
}
--- Maybe we should only register in lua and forget about the tex end.
+local next = next
structures = structures or { }
structures.inserts = structures.inserts or { }
@@ -36,6 +26,9 @@ local v_firstcolumn = variables.firstcolumn
local v_lastcolumn = variables.lastcolumn
local v_text = variables.text
+local context = context
+local implement = interfaces.implement
+
storage.register("structures/inserts/stored", inserts.stored, "structures.inserts.stored")
local data = inserts.data
@@ -49,7 +42,7 @@ end
function inserts.define(name,specification)
specification.name= name
local number = specification.number or 0
- data[name] = specification
+ data[name] = specification
data[number] = specification
-- only needed at runtime as this get stored in a bytecode register
stored[name] = specification
@@ -90,8 +83,37 @@ end
-- interface
-commands.defineinsertion = inserts.define
-commands.setupinsertion = inserts.setup
-commands.setinsertionlocation = inserts.setlocation
-commands.insertionnumber = function(name) context(data[name].number or 0) end
+implement {
+ name = "defineinsertion",
+ actions = inserts.define,
+ arguments = {
+ "string",
+ {
+ { "number", "integer" }
+ }
+ }
+}
+
+implement {
+ name = "setupinsertion",
+ actions = inserts.setup,
+ arguments = {
+ "string",
+ {
+ { "location" }
+ }
+ }
+}
+
+implement {
+ name = "setinsertionlocation",
+ actions = inserts.setlocation,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "insertionnumber",
+ actions = function(name) context(data[name].number or 0) end,
+ arguments = "string"
+}
diff --git a/Master/texmf-dist/tex/context/base/page-ins.mkiv b/Master/texmf-dist/tex/context/base/page-ins.mkiv
index a63de0b26f2..c91073a143d 100644
--- a/Master/texmf-dist/tex/context/base/page-ins.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-ins.mkiv
@@ -82,13 +82,15 @@
\insert#1{\unvbox#1}%
\fi}
-\unexpanded\def\doifinsertionelse#1%
+\unexpanded\def\doifelseinsertion#1%
{\ifcsname\??insertionnumber#1\endcsname
\expandafter\firstoftwoarguments
\else
\expandafter\secondoftwoarguments
\fi}
+\let\doifinsertionelse\doifelseinsertion
+
% \unexpanded\def\startinsertion[#1]%
% {\insert\csname\??insertionnumber#1\endcsname\bgroup}
%
@@ -108,7 +110,12 @@
\else
\expandafter\newinsert\csname\??insertionnumber\currentinsertion\endcsname
\page_inserts_synchronize_registers
- \ctxcommand{defineinsertion("\currentinsertion",{ number = \number\currentinsertionnumber })}%
+ \clf_defineinsertion
+ {\currentinsertion}%
+ {%
+ number \currentinsertionnumber
+ }%
+ \relax
\t_page_inserts_list\expandafter\expandafter\expandafter
{\expandafter\the\expandafter\t_page_inserts_list
\expandafter\page_inserts_process\csname\??insertionnumber\currentinsertion\endcsname}%
@@ -123,13 +130,16 @@
\to \everydefineinsertion
\appendtoks
- \ctxcommand{setupinsertion("\currentinsertion",{
- location = "\insertionparameter\c!location",
- })}%
+ \clf_setupinsertion
+ {\currentinsertion}
+ {%
+ location {\insertionparameter\c!location}%
+ }%
+ \relax
\to \everysetupinsertion
\unexpanded\def\page_inserts_set_location#1#2% fast one
- {\ctxcommand{setinsertionlocation("#1","#2")}}
+ {\clf_setinsertionlocation{#1}{#2}}
%D Auxiliary macros:
diff --git a/Master/texmf-dist/tex/context/base/page-lay.mkiv b/Master/texmf-dist/tex/context/base/page-lay.mkiv
index 19f23724247..d1328bb6ba0 100644
--- a/Master/texmf-dist/tex/context/base/page-lay.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-lay.mkiv
@@ -30,6 +30,8 @@
\newdimen\paperheight \paperheight = 297mm
\newdimen\paperwidth \paperwidth = 210mm
\newdimen\paperoffset \paperoffset = \zeropoint
+\newdimen\paperbleed \paperbleed = \zeropoint
+\newdimen\spinewidth \spinewidth = \zeropoint
\newdimen\printpaperheight \printpaperheight = \paperheight
\newdimen\printpaperwidth \printpaperwidth = \paperwidth
@@ -154,13 +156,15 @@
\fi
\to \everysetuplayout
-\def\doiflayoutdefinedelse#1%
+\def\doifelselayoutdefined#1%
{\ifcsname\namedlayouthash{#1}\c!state\endcsname % maybe a helper
\expandafter\firstoftwoarguments
\else
\expandafter\secondoftwoarguments
\fi}
+\let\doiflayoutdefinedelse\doifelselayoutdefined
+
\def\layoutdistance#1#2{\ifdim\zeropoint<#1#2\else\zeropoint\fi}
\def\page_layouts_set_dimensions
@@ -365,7 +369,7 @@
\ifx\currentlayouttarget\empty
% invalid target
\else
- \doifassignmentelse{#2}
+ \doifelseassignment{#2}
{\definelayouttarget[#1][#2]}
{\setevalue{\??layoutpaper#1}{#2}%
\setevalue{\??layoutprint#1}{#3}}%
@@ -390,9 +394,9 @@
\unexpanded\def\page_paper_setup_size[#1][#2]%
{\iffirstargument
- \doifassignmentelse{#1}
+ \doifelseassignment{#1}
{\page_paper_setup_size_settings[#1]}
- {\doifassignmentelse{#2}
+ {\doifelseassignment{#2}
{\page_paper_setup_size_settings_by_name[#1][#2]}
{\page_paper_setup_size_change_size[#1][#2]}}%
\else
@@ -1027,7 +1031,7 @@
\unexpanded\def\startlayout[#1]%
{\page
\globalpushmacro\currentlayout
- \doiflayoutdefinedelse{#1}{\setuplayout[#1]}\donothing} % {\setuplayout[\currentlayout]}}
+ \doifelselayoutdefined{#1}{\setuplayout[#1]}\donothing} % {\setuplayout[\currentlayout]}}
\unexpanded\def\stoplayout
{\page
@@ -1121,13 +1125,15 @@
% #single #left #right
-\def\doifoddpageelse
+\def\doifelseoddpage
{\ifodd\pagenoshift
\expandafter\page_layouts_if_odd_else_yes
\else
\expandafter\page_layouts_if_odd_else_nop
\fi}
+\let\doifoddpageelse\doifelseoddpage
+
\def\page_layouts_if_odd_else_yes
{\ifodd\realpageno
\expandafter\secondoftwoarguments
@@ -1142,9 +1148,7 @@
\expandafter\secondoftwoarguments
\fi}
-\let\doifonevenpaginaelse\doifoddpageelse
-
-\def\page_layouts_if_odd_else_again#1{\doifoddpageelse}
+\def\page_layouts_if_odd_else_again#1{\doifelseoddpage}
\def\doifbothsidesoverruled
{\ifdoublesided
@@ -1171,7 +1175,7 @@
\def\settexthoffset % name will change
{\texthoffset\doifbothsides\backspace\backspace{\dimexpr\paperwidth-\backspace-\makeupwidth\relax}}
-
+
% The next hack is too tricky as we may shipout more pages:
%
% \def\freezepagestatechecks
@@ -1199,11 +1203,13 @@
\def\goleftonpage % name will change (we could cache)
{\hskip-\dimexpr\leftmargindistance+\leftmarginwidth+\leftedgedistance+\leftedgewidth\relax}
-\def\doifmarginswapelse#1#2%
+\def\doifelsemarginswap#1#2%
{\doifbothsides{#1}{#1}{#2}}
+\let\doifmarginswapelse\doifelsemarginswap
+
\def\swapmargins % name will change
- {\doifmarginswapelse\relax\doswapmargins}
+ {\doifelsemarginswap\relax\doswapmargins}
\def\doswapmargins % name will change
{\let\swapmargins \relax % to prevent local swapping
@@ -1221,7 +1227,7 @@
{\ifsinglesided
\expandafter\firstoftwoarguments
\else
- \expandafter\doifoddpageelse
+ \expandafter\doifelseoddpage
\fi}
\def\outermarginwidth {\rightorleftpageaction\rightmarginwidth \leftmarginwidth }
@@ -1377,6 +1383,9 @@
\definepapersize [A9] [\c!width=37mm,\c!height=52mm]
\definepapersize [A10] [\c!width=26mm,\c!height=37mm]
+\definepapersize [A4/2][\c!width=\dimexpr297mm/2\relax,\c!height=210mm] % 148.5mm
+%definepapersize [2A5] [\c!width=296mm,\c!height=210mm] % doublewide
+
\definepapersize [B0] [\c!width=1000mm,\c!height=1414mm]
\definepapersize [B1] [\c!width=707mm,\c!height=1000mm]
\definepapersize [B2] [\c!width=500mm,\c!height=707mm]
@@ -1424,6 +1433,7 @@
\definepapersize [SW] [\c!width=800pt,\c!height=450pt] % wide
\definepapersize [HD] [\c!width=1920pt,\c!height=1080pt]
\definepapersize [HD+] [\c!width=1920pt,\c!height=1200pt]
+\definepapersize [HD-] [\c!width=960pt,\c!height=540pt]
%D These are handy too:
@@ -1491,6 +1501,11 @@
\definepapersize [A3plus] [\c!width=329mm,\c!height=483mm]
+%D For Alan:
+
+\definepapersize [business] [\c!width=85mm,\c!height=55mm]
+\definepapersize [businessUS] [\c!width=3.5in,\c!height=2in]
+
%D We can now default to a reasonable size. We match the print
%D paper size with the typeset paper size. This setting should
%D come after the first layout specification (already done).
@@ -1505,15 +1520,18 @@
% [ \c!width=\paperwidth,
% \c!height=\paperheight]
+\setuppapersize
+ [\c!distance=1.5cm] % offset is already taken
+
\definepapersize
[oversized]
- [ \c!width=\dimexpr\paperwidth +1.5cm\relax,
- \c!height=\dimexpr\paperheight+1.5cm\relax]
+ [ \c!width=\dimexpr\paperwidth +\layouttargetparameter\c!distance\relax,
+ \c!height=\dimexpr\paperheight+\layouttargetparameter\c!distance\relax]
\definepapersize
[undersized]
- [ \c!width=\dimexpr\paperwidth -1.5cm\relax,
- \c!height=\dimexpr\paperheight-1.5cm\relax]
+ [ \c!width=\dimexpr\paperwidth -\layouttargetparameter\c!distance\relax,
+ \c!height=\dimexpr\paperheight-\layouttargetparameter\c!distance\relax]
\definepapersize
[doublesized]
@@ -1522,8 +1540,13 @@
\definepapersize
[doubleoversized]
- [ \c!width=\dimexpr \paperheight+1.5cm\relax,
- \c!height=\dimexpr2\paperwidth +1.5cm\relax]
+ [ \c!width=\dimexpr \paperheight+\layouttargetparameter\c!distance\relax,
+ \c!height=\dimexpr2\paperwidth +\layouttargetparameter\c!distance\relax]
+
+\definepapersize
+ [doublewide]
+ [ \c!width=\dimexpr2\paperwidth \relax,
+ \c!height=\dimexpr \paperheight\relax]
% \setuppapersize
% [A4][A4]
diff --git a/Master/texmf-dist/tex/context/base/page-lin.lua b/Master/texmf-dist/tex/context/base/page-lin.lua
index 0b241240c02..5a447c45840 100644
--- a/Master/texmf-dist/tex/context/base/page-lin.lua
+++ b/Master/texmf-dist/tex/context/base/page-lin.lua
@@ -21,6 +21,8 @@ local attributes = attributes
local nodes = nodes
local context = context
+local implement = interfaces.implement
+
nodes.lines = nodes.lines or { }
local lines = nodes.lines
@@ -163,9 +165,19 @@ function boxed.register(configuration)
return last
end
-function commands.registerlinenumbering(configuration)
- context(boxed.register(configuration))
-end
+implement {
+ name = "registerlinenumbering",
+ actions = { boxed.register, context },
+ arguments = {
+ {
+ { "continue" },
+ { "start", "integer" },
+ { "step", "integer" },
+ { "method" },
+ { "tag" },
+ }
+ }
+}
function boxed.setup(n,configuration)
local d = data[n]
@@ -185,7 +197,20 @@ function boxed.setup(n,configuration)
return n
end
-commands.setuplinenumbering = boxed.setup
+implement {
+ name = "setuplinenumbering",
+ actions = boxed.setup,
+ arguments = {
+ "integer",
+ {
+ { "continue" },
+ { "start", "integer" },
+ { "step", "integer" },
+ { "method" },
+ { "tag" },
+ }
+ }
+}
local function check_number(n,a,skip,sameline)
local d = data[a]
@@ -394,5 +419,14 @@ function boxed.stage_two(n,m)
end
end
-commands.linenumbersstageone = boxed.stage_one
-commands.linenumbersstagetwo = boxed.stage_two
+implement {
+ name = "linenumbersstageone",
+ actions = boxed.stage_one,
+ arguments = { "integer", "boolean" }
+}
+
+implement {
+ name = "linenumbersstagetwo",
+ actions = boxed.stage_two,
+ arguments = { "integer", "integer" }
+}
diff --git a/Master/texmf-dist/tex/context/base/page-lin.mkvi b/Master/texmf-dist/tex/context/base/page-lin.mkvi
index e3b6284876e..dd13a98c38e 100644
--- a/Master/texmf-dist/tex/context/base/page-lin.mkvi
+++ b/Master/texmf-dist/tex/context/base/page-lin.mkvi
@@ -73,38 +73,48 @@
\unexpanded\def\page_postprocessors_linenumbers_deepbox#tag{\page_lines_add_numbers_to_box{#tag}\plusone \plusone \plusone }
\unexpanded\def\page_postprocessors_linenumbers_column #tag{\page_lines_add_numbers_to_box{#tag}\currentcolumn\nofcolumns\zerocount}
-\def\page_lines_parameters_regular
- {continue = "\ifnum\c_page_lines_mode=\zerocount\v!yes\else\v!no\fi",
- start = \number\linenumberingparameter\c!start,
- step = \number\linenumberingparameter\c!step,
- method = "\linenumberingparameter\c!method",
- tag = "\currentlinenumbering"}
-
-\def\page_lines_parameters_update
- {continue = "\ifnum\c_page_lines_mode=\zerocount\v!yes\else\v!no\fi"}
-
\def\page_lines_start_define
- {\setxvalue{\??linenumberinginstance\currentlinenumbering}{\ctxcommand{registerlinenumbering({\page_lines_parameters_regular})}}}
+ {\setxvalue{\??linenumberinginstance\currentlinenumbering}%
+ {\clf_registerlinenumbering
+ continue {\ifnum\c_page_lines_mode=\zerocount\v!yes\else\v!no\fi}%
+ start \linenumberingparameter\c!start
+ step \linenumberingparameter\c!step
+ method {\linenumberingparameter\c!method}%
+ tag {\currentlinenumbering}%
+ }}
\def\page_lines_start_update
- {\ctxcommand{setuplinenumbering(\csname\??linenumberinginstance\currentlinenumbering\endcsname,{\page_lines_parameters_update})}}
+ {\clf_setuplinenumbering
+ \csname\??linenumberinginstance\currentlinenumbering\endcsname
+ {%
+ continue {\ifnum\c_page_lines_mode=\zerocount\v!yes\else\v!no\fi}%
+ }%
+ \relax}
\def\page_lines_setup
{\ifcsname \??linenumberinginstance\currentlinenumbering\endcsname
- \ctxcommand{setuplinenumbering(\csname\??linenumberinginstance\currentlinenumbering\endcsname,{\page_lines_parameters_regular})}%
+ \clf_setuplinenumbering
+ \csname\??linenumberinginstance\currentlinenumbering\endcsname
+ {%
+ continue {\ifnum\c_page_lines_mode=\zerocount\v!yes\else\v!no\fi}%
+ start \linenumberingparameter\c!start
+ step \linenumberingparameter\c!step
+ method {\linenumberingparameter\c!method}%
+ tag {\currentlinenumbering}%
+ }%
+ \relax
\fi}
% we could make this a bit more efficient by putting the end reference
% in the same table as the start one but why make things complex ...
-\let\dofinishlinereference\dofinishfullreference % at lua end
-
\unexpanded\def\page_lines_some_reference#1#2#3%
{\dontleavehmode\begingroup
\global\advance\c_page_lines_reference\plusone
\attribute\linereferenceattribute\c_page_lines_reference
- #3%
+ #3% todo: #3{#1} as there is no need to pass #1 as part of #3
% for the moment we use a simple system i.e. no prefixes etc .. todo: store as number
+ \c_strc_references_bind_state\zerocount % we don't want the prewordbreak and manage it here
\normalexpanded{\strc_references_set_named_reference{line}{#2}{conversion=\linenumberingparameter\c!conversion}{\the\c_page_lines_reference}}% kind labels userdata text
\endgroup}
@@ -195,10 +205,10 @@
\ifx\m_argument\v!empty
\let\currentlinenumbering\empty
\else
- \doifassignmentelse{#1}
+ \doifelseassignment{#1}
{\let\currentlinenumbering\empty
\setupcurrentlinenumbering[#1]}
- {\doifnumberelse\m_argument
+ {\doifelsenumber\m_argument
{\let\currentlinenumbering\empty
\letlinenumberingparameter\c!start\m_argument}
{\let\currentlinenumbering\m_argument}}%
@@ -218,7 +228,7 @@
\else
\c_page_lines_mode\plusone
\ifx\m_argument\v!empty \else
- \doifassignmentelse{#2}
+ \doifelseassignment{#2}
{\setupcurrentlinenumbering[#2]}
{\doifnumber\m_argument
{\letlinenumberingparameter\c!start\m_argument}}%
@@ -301,8 +311,14 @@
\setbox\b_page_lines_scratch\vbox
{\forgetall
\offinterlineskip
- \ctxcommand{linenumbersstageone(\number\b_page_lines_number,\ifcase\c_page_lines_nesting false\else true\fi)}}%
- \ctxcommand{linenumbersstagetwo(\number\b_page_lines_number,\number\b_page_lines_scratch)}% can move to lua code
+ \clf_linenumbersstageone
+ \b_page_lines_number
+ \ifcase\c_page_lines_nesting false\else true\fi
+ \relax}%
+ \clf_linenumbersstagetwo
+ \b_page_lines_number
+ \b_page_lines_scratch
+ \fi
\egroup}
\let\page_lines_make_number_indeed\relax
@@ -321,8 +337,14 @@
\setbox\b_page_lines_scratch\vbox
{\forgetall
\offinterlineskip
- \ctxcommand{linenumbersstageone(\number\b_page_lines_number,\ifcase\c_page_lines_nesting false\else true\fi)}}%
- \ctxcommand{linenumbersstagetwo(\number\b_page_lines_number,\number\b_page_lines_scratch)}% can move to lua code
+ \clf_linenumbersstageone
+ \b_page_lines_number
+ \ifcase\c_page_lines_nesting false\else true\fi
+ \relax}%
+ \clf_linenumbersstagetwo
+ \b_page_lines_number
+ \b_page_lines_scratch
+ \relax
\egroup}
\def\page_lines_make_number#tag#mode#linenumber#shift#width#leftskip#dir% beware, one needs so compensate for this in the \hsize
@@ -534,21 +556,23 @@
% eventually we will do this in lua
-\def\currentreferencelinenumber{\ctxcommand{filterreference("linenumber")}}
+\def\currentreferencelinenumber{\clf_filterreference{linenumber}}
\let\m_page_lines_from\empty
\let\m_page_lines_to \empty
\unexpanded\def\doifelsesamelinereference#1#2#3%
- {\doifreferencefoundelse{lr:b:#1}
+ {\doifelsereferencefound{lr:b:#1}
{\edef\m_page_lines_from{\currentreferencelinenumber}%
- \doifreferencefoundelse{lr:e:#1}
+ \doifelsereferencefound{lr:e:#1}
{\edef\m_page_lines_to{\currentreferencelinenumber}%
%[\m_page_lines_from,\m_page_lines_to]
\ifx\m_page_lines_from\m_page_lines_to#2\else#3\fi}
{#2}}
{#2}}
+\let\doifsamelinereferenceelse\doifelsesamelinereference
+
\unexpanded\def\inline#1[#2]%
{\doifelsenothing{#1}
{\doifelsesamelinereference{#2}
diff --git a/Master/texmf-dist/tex/context/base/page-mak.mkvi b/Master/texmf-dist/tex/context/base/page-mak.mkvi
index c910f281d23..ee144f20a34 100644
--- a/Master/texmf-dist/tex/context/base/page-mak.mkvi
+++ b/Master/texmf-dist/tex/context/base/page-mak.mkvi
@@ -45,7 +45,7 @@
\appendtoks
\setuevalue{\e!start\currentmakeup\e!makeup}{\startmakeup[\currentmakeup]}%
\setuevalue{\e!stop \currentmakeup\e!makeup}{\stopmakeup}%
- \doiflayoutdefinedelse\currentmakeup\donothing{\definelayout[\currentmakeup]}% new
+ \doifelselayoutdefined\currentmakeup\donothing{\definelayout[\currentmakeup]}% new
\to \everydefinemakeup
%D The \type{\start}||\type{\stop} macros are used for both
@@ -126,8 +126,7 @@
% nothing
\endgroup
\else
- \endgroup
- \page[\p_page]%
+ \normalexpanded{\endgroup\page[\p_page]}%
\fi\fi
% some dirty trickery (sorry) for determining if we have
% - a layout definition at all
diff --git a/Master/texmf-dist/tex/context/base/page-mbk.mkvi b/Master/texmf-dist/tex/context/base/page-mbk.mkvi
index 9e3e57193bd..8038771d9c7 100644
--- a/Master/texmf-dist/tex/context/base/page-mbk.mkvi
+++ b/Master/texmf-dist/tex/context/base/page-mbk.mkvi
@@ -98,7 +98,7 @@
\unvbox\b_page_margin_blocks
\marginblockparameter\c!inbetween
\fi
- \setupalign[\marginblockparameter\c!align]%
+ \usealignparameter\marginblockparameter
\usemarginblockstyleandcolor\c!style\c!color
\begstrut
\ignorespaces}
diff --git a/Master/texmf-dist/tex/context/base/page-mix.lua b/Master/texmf-dist/tex/context/base/page-mix.lua
index 0fbaa4e30b4..2bf89f73778 100644
--- a/Master/texmf-dist/tex/context/base/page-mix.lua
+++ b/Master/texmf-dist/tex/context/base/page-mix.lua
@@ -13,7 +13,9 @@ if not modules then modules = { } end modules ["page-mix"] = {
-- local trackers, logs, storage = trackers, logs, storage
-- local number, table = number, table
+local next, type = next, type
local concat = table.concat
+local ceil, floor = math.ceil, math.floor
local trace_state = false trackers.register("mixedcolumns.trace", function(v) trace_state = v end)
local trace_detail = false trackers.register("mixedcolumns.detail", function(v) trace_detail = v end)
@@ -81,6 +83,10 @@ local v_auto = variables.auto
local v_none = variables.none
local v_more = variables.more
local v_less = variables.less
+local v_halfline = variables.halfline
+
+local context = context
+local implement = interfaces.implement
pagebuilders = pagebuilders or { }
pagebuilders.mixedcolumns = pagebuilders.mixedcolumns or { }
@@ -222,7 +228,7 @@ local function stripbottomglue(results,discarded)
return height
end
-local function setsplit(specification) -- a rather large function
+local function preparesplit(specification) -- a rather large function
local box = specification.box
if not box then
report_state("fatal error, no box")
@@ -239,16 +245,16 @@ local function setsplit(specification) -- a rather large function
return
end
slidenodes(head) -- we can have set prev's to nil to prevent backtracking
- local discarded = { }
- local originalhead = head
- local originalwidth = specification.originalwidth or getfield(list,"width")
+ local discarded = { }
+ local originalhead = head
+ local originalwidth = specification.originalwidth or getfield(list,"width")
local originalheight = specification.originalheight or getfield(list,"height")
- local current = head
- local skipped = 0
- local height = 0
- local depth = 0
- local skip = 0
- local splitmethod = specification.splitmethod or false
+ local current = head
+ local skipped = 0
+ local height = 0
+ local depth = 0
+ local skip = 0
+ local splitmethod = specification.splitmethod or false
if splitmethod == v_none then
splitmethod = false
end
@@ -428,6 +434,7 @@ local function setsplit(specification) -- a rather large function
local function checked(advance,where,locked)
local total = skip + height + depth + advance
local delta = total - target
+-- - 65536*3
local state = "same"
local okay = false
local skipped = 0
@@ -716,10 +723,12 @@ local kept = head
return specification
end
-function mixedcolumns.finalize(result)
+local function finalize(result)
if result then
- local results = result.results
- for i=1,result.nofcolumns do
+ local results = result.results
+ local columns = result.nofcolumns
+ local maxtotal = 0
+ for i=1,columns do
local r = results[i]
local h = r.head
if h then
@@ -747,6 +756,16 @@ function mixedcolumns.finalize(result)
r.inserts[c] = t
end
end
+ local total = r.height + r.depth
+ if total > maxtotal then
+ maxtotal = total
+ end
+ r.total = total
+ end
+ result.maxtotal = maxtotal
+ for i=1,columns do
+ local r = results[i]
+ r.extra = maxtotal - r.total
end
end
end
@@ -761,12 +780,12 @@ local function report_deltas(result,str)
report_state("%s, cycles %s, deltas % | t",str,result.cycle or 1,t)
end
-function mixedcolumns.setsplit(specification)
+local function setsplit(specification)
splitruns = splitruns + 1
if trace_state then
report_state("split run %s",splitruns)
end
- local result = setsplit(specification)
+ local result = preparesplit(specification)
if result then
if result.overflow then
if trace_state then
@@ -779,7 +798,7 @@ function mixedcolumns.setsplit(specification)
local cycles = specification.cycles or 100
while result.rest and cycle <= cycles do
specification.extra = cycle * step
- result = setsplit(specification) or result
+ result = preparesplit(specification) or result
if trace_state then
report_state("cycle: %s.%s, original height %p, total height %p",
splitruns,cycle,result.originalheight,result.nofcolumns*result.targetheight)
@@ -801,7 +820,7 @@ function mixedcolumns.setsplit(specification)
end
end
-function mixedcolumns.getsplit(result,n)
+local function getsplit(result,n)
if not result then
report_state("flush, column %s, no result",n)
return
@@ -819,13 +838,14 @@ function mixedcolumns.getsplit(result,n)
local strutht = result.strutht
local strutdp = result.strutdp
local lineheight = strutht + strutdp
+ local isglobal = result.alternative == v_global
local v = new_vlist()
setfield(v,"list",h)
-- local v = vpack(h,"exactly",height)
- if result.alternative == v_global then -- option
+ if isglobal then -- option
result.height = result.maxheight
end
@@ -833,11 +853,56 @@ function mixedcolumns.getsplit(result,n)
local dp = 0
local wd = result.originalwidth
- local grid = result.grid
+ local grid = result.grid
+ local internalgrid = result.internalgrid
+ local httolerance = .25
+ local dptolerance = .50
+ local lineheight = internalgrid == v_halfline and lineheight/2 or lineheight
+
+ local function amount(r,s,t)
+ local l = ceil((r-t)/lineheight)
+ local a = lineheight * l
+ if a > s then
+ return a - s
+ else
+ return s
+ end
+ end
if grid then
- ht = lineheight * math.ceil(result.height/lineheight) - strutdp
- dp = strutdp
+ -- print(n,result.maxtotal,r.total,r.extra)
+ if isglobal then
+ local rh = r.height
+ -- ht = (lineheight * ceil(result.height/lineheight) - strutdp
+ ht = amount(rh,strutdp,0)
+ dp = strutdp
+ else
+ -- natural dimensions
+ local rh = r.height
+ local rd = r.depth
+ if rh > ht then
+ ht = amount(rh,strutdp,httolerance*strutht)
+ end
+ if rd > dp then
+ dp = amount(rd,strutht,dptolerance*strutdp)
+ end
+ -- forced dimensions
+ local rh = result.height or 0
+ local rd = result.depth or 0
+ if rh > ht then
+ ht = amount(rh,strutdp,httolerance*strutht)
+ end
+ if rd > dp then
+ dp = amount(rd,strutht,dptolerance*strutdp)
+ end
+ -- always one line at least
+ if ht < strutht then
+ ht = strutht
+ end
+ if dp < strutdp then
+ dp = strutdp
+ end
+ end
else
ht = result.height
dp = result.depth
@@ -867,19 +932,19 @@ function mixedcolumns.getsplit(result,n)
return v
end
-function mixedcolumns.getrest(result)
+local function getrest(result)
local rest = result and result.rest
result.rest = nil -- to be sure
return rest
end
-function mixedcolumns.getlist(result)
+local function getlist(result)
local originalhead = result and result.originalhead
result.originalhead = nil -- to be sure
return originalhead
end
-function mixedcolumns.cleanup(result)
+local function cleanup(result)
local discarded = result.discarded
for i=1,#discarded do
freenode(discarded[i])
@@ -887,52 +952,100 @@ function mixedcolumns.cleanup(result)
result.discarded = { }
end
+mixedcolumns.setsplit = setsplit
+mixedcolumns.getsplit = getsplit
+mixedcolumns.finalize = finalize
+mixedcolumns.getrest = getrest
+mixedcolumns.getlist = getlist
+mixedcolumns.cleanup = cleanup
+
-- interface --
local result
-function commands.mixsetsplit(specification)
- if result then
- for k, v in next, specification do
- result[k] = v
+implement {
+ name = "mixsetsplit",
+ actions = function(specification)
+ if result then
+ for k, v in next, specification do
+ result[k] = v
+ end
+ result = setsplit(result)
+ else
+ result = setsplit(specification)
end
- result = mixedcolumns.setsplit(result)
- else
- result = mixedcolumns.setsplit(specification)
- end
-end
+ end,
+ arguments = {
+ {
+ { "box", "integer" },
+ { "nofcolumns", "integer" },
+ { "maxheight", "dimen" },
+ { "step", "dimen" },
+ { "cycles", "integer" },
+ { "preheight", "dimen" },
+ { "prebox", "integer" },
+ { "strutht", "dimen" },
+ { "strutdp", "dimen" },
+ { "threshold", "dimen" },
+ { "splitmethod" },
+ { "balance" },
+ { "alternative" },
+ { "internalgrid" },
+ { "grid", "boolean" },
+ }
+ }
+}
-function commands.mixgetsplit(n)
- if result then
- context(tonode(mixedcolumns.getsplit(result,n)))
- end
-end
+implement {
+ name = "mixgetsplit",
+ arguments = "integer",
+ actions = function(n)
+ if result then
+ context(tonode(getsplit(result,n)))
+ end
+ end,
+}
-function commands.mixfinalize()
- if result then
- mixedcolumns.finalize(result)
+implement {
+ name = "mixfinalize",
+ actions = function()
+ if result then
+ finalize(result)
+ end
end
-end
+}
-function commands.mixflushrest()
- if result then
- context(tonode(mixedcolumns.getrest(result)))
+implement {
+ name = "mixflushrest",
+ actions = function()
+ if result then
+ context(tonode(getrest(result)))
+ end
end
-end
+}
-function commands.mixflushlist()
- if result then
- context(tonode(mixedcolumns.getlist(result)))
+implement {
+ name = "mixflushlist",
+ actions = function()
+ if result then
+ context(tonode(getlist(result)))
+ end
end
-end
+}
-function commands.mixstate()
- context(result and result.rest and 1 or 0)
-end
+implement {
+ name = "mixstate",
+ actions = function()
+ context(result and result.rest and 1 or 0)
+ end
+}
-function commands.mixcleanup()
- if result then
- mixedcolumns.cleanup(result)
- result = nil
+implement {
+ name = "mixcleanup",
+ actions = function()
+ if result then
+ cleanup(result)
+ result = nil
+ end
end
-end
+}
diff --git a/Master/texmf-dist/tex/context/base/page-mix.mkiv b/Master/texmf-dist/tex/context/base/page-mix.mkiv
index 57de14b88b4..b545e8f4c97 100644
--- a/Master/texmf-dist/tex/context/base/page-mix.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-mix.mkiv
@@ -69,6 +69,7 @@
\c!maxheight=\textheight,
\c!maxwidth=\makeupwidth,
\c!grid=\v!tolerant,
+ \c!internalgrid=\v!line,
\c!step=.25\lineheight, % needs some experimenting
%\c!splitmethod=\v!fixed, % will be default
\c!method=\ifinner\s!box\else\s!otr\fi] % automatic as suggested by WS
@@ -167,6 +168,8 @@
[\c!n=\itemgroupparameter\c!n,
\c!separator=\v!none,
\c!splitmethod=\v!none,
+ \c!grid=\v!tolerant,
+ \c!internalgrid=\v!halfline, % new, we may still revert to \v!line
\c!balance=\v!yes]
\unexpanded\def\strc_itemgroups_start_columns
@@ -289,18 +292,32 @@
\installcorenamespace{mixedcolumnsseparator}
-\setvalue{\??mixedcolumnsseparator\v!rule}%
- {\starttextproperties
- \usemixedcolumnscolorparameter\c!rulecolor
- \vrule\s!width\mixedcolumnsparameter\c!rulethickness
- \stoptextproperties}
+\unexpanded\def\installmixedcolumnseparator#1#2%
+ {\setvalue{\??mixedcolumnsseparator#1}{#2}}
+
+\installmixedcolumnseparator\v!rule
+ {\vrule
+ \s!width \mixedcolumnsparameter\c!rulethickness
+ \s!height\mixedcolumnseparatorheight
+ \s!depth \mixedcolumnseparatordepth
+ \relax}
\unexpanded\def\page_mix_command_inject_separator
- {\bgroup
+ {\begingroup
+ \setbox\scratchbox\hbox to \zeropoint \bgroup
+ \hss
+ \starttextproperties
+ \usemixedcolumnscolorparameter\c!rulecolor
+ \csname\??mixedcolumnsseparator\p_separator\endcsname % was \c!rule
+ \stoptextproperties
+ \hss
+ \egroup
+ \ht\scratchbox\zeropoint
+ \dp\scratchbox\zeropoint
\hss
- \csname\??mixedcolumnsseparator\mixedcolumnsparameter\c!separator\endcsname % was \c!rule
+ \box\scratchbox
\hss
- \egroup}
+ \endgroup}
%D We've now arrived at the real code. The start command mostly sets up the
%D environment and variables that are used in the splitter. One of the last
@@ -348,13 +365,13 @@
\csname\??mixedcolumnsstart\currentmixedcolumnsmethod\endcsname}
\def\page_mix_start_columns_b[#1][#2]%
- {\doifassignmentelse{#1}%
+ {\doifelseassignment{#1}%
{\let\currentmixedcolumns\empty
\page_mix_error_b}
{\edef\currentmixedcolumns{#1}%
\firstargumentfalse}%
\edef\currentmixedcolumnsmethod{\mixedcolumnsparameter\c!method}%
- \mixedcolumnsparameter\c!before\relax % so, it doesn't list to local settings !
+ \mixedcolumnsparameter\c!before\relax % so, it doesn't listen to local settings !
\csname\??mixedcolumnsbefore\currentmixedcolumnsmethod\endcsname\relax
\begingroup
\iffirstargument
@@ -452,6 +469,8 @@
%
\usemixedcolumnscolorparameter\c!color
%
+ \insidecolumnstrue % new
+ %
\nofcolumns\c_page_mix_n_of_columns} % public
%D The otr method related hooks are defined next:
@@ -505,6 +524,10 @@
{\c_page_mix_routine\c_page_mix_routine_balance}%
{\penalty-\plustenthousand}% weird hack, we need to trigger the otr sometimes (new per 20140306, see balancing-001.tex)
\page_otr_trigger_output_routine
+ \ifvoid\b_page_mix_preceding \else
+ % empty columns so we need to make sure pending content is flushed
+ \unvbox\b_page_mix_preceding % new per 2014.10.25
+ \fi
\fi}
\setvalue{\??mixedcolumnsafter\s!otr}%
@@ -521,26 +544,52 @@
\unexpanded\def\page_mix_routine_construct#1%
{\d_page_mix_max_height\mixedcolumnsparameter\c!maxheight % can have changed due to header=high
- \ctxcommand{mixsetsplit {
- box = \number\b_page_mix_collected,
- nofcolumns = \number\c_page_mix_n_of_columns,
- maxheight = \number\d_page_mix_max_height,
- step = \number\d_page_mix_balance_step,
- cycles = \number\c_page_mix_balance_cycles,
- preheight = \number\d_page_mix_preceding_height,
- prebox = \number\b_page_mix_preceding,
- strutht = \number\strutht,
- strutdp = \number\strutdp,
- threshold = \number\d_page_mix_threshold,
- splitmethod = "\mixedcolumnsparameter\c!splitmethod",
- balance = "#1",
- alternative = "\mixedcolumnsparameter\c!alternative",
- grid = \ifgridsnapping true\else false\fi,
- }}%
+ \clf_mixsetsplit
+ box \b_page_mix_collected
+ nofcolumns \c_page_mix_n_of_columns
+ maxheight \d_page_mix_max_height
+ step \d_page_mix_balance_step
+ cycles \c_page_mix_balance_cycles
+ preheight \d_page_mix_preceding_height
+ prebox \b_page_mix_preceding
+ strutht \strutht
+ strutdp \strutdp
+ threshold \d_page_mix_threshold
+ splitmethod {\mixedcolumnsparameter\c!splitmethod}%
+ balance {#1}%
+ alternative {\mixedcolumnsparameter\c!alternative}%
+ internalgrid {\mixedcolumnsparameter\c!internalgrid}%
+ grid \ifgridsnapping true\else false\fi
+ \relax
\deadcycles\zerocount}
+\newdimen\mixedcolumnseparatorheight
+\newdimen\mixedcolumnseparatordepth
+\newdimen\mixedcolumnseparatorwidth
+
+\def\page_mix_routine_package_step
+ {% needs packaging anyway
+ \setbox\scratchbox\page_mix_command_package_column
+ \page_marks_synchronize_column\plusone\c_page_mix_n_of_columns\recurselevel\scratchbox
+ % backgrounds
+ \anch_mark_column_box\scratchbox
+ % for the moment a quick and dirty patch .. we need to go into the box (hence the \plusone) .. a slowdowner
+ \page_lines_add_numbers_to_box\scratchbox\recurselevel\c_page_mix_n_of_columns\plusone
+ % the framed needs a reset of strut, align, setups etc
+ \mixedcolumnseparatorheight\ht\scratchbox
+ \mixedcolumnseparatordepth \dp\scratchbox
+ \inheritedmixedcolumnsframedbox\currentmixedcolumns\scratchbox
+ % optional
+ \ifnum\recurselevel<\c_page_mix_n_of_columns
+ \ifcsname\??mixedcolumnsseparator\p_separator\endcsname
+ \page_mix_command_inject_separator
+ \else
+ \hss
+ \fi
+ \fi}
+
\unexpanded\def\page_mix_routine_package
- {\ctxcommand{mixfinalize()}%
+ {\clf_mixfinalize
\setbox\b_page_mix_collected\vbox \bgroup
\ifvoid\b_page_mix_preceding \else
\page_postprocessors_linenumbers_deepbox\b_page_mix_preceding
@@ -550,26 +599,16 @@
\fi
\hskip\d_page_mix_leftskip
\page_mix_hbox to \d_page_mix_max_width \bgroup
- \dorecurse\c_page_mix_n_of_columns{%
- % needs packaging anyway
- \setbox\scratchbox\page_mix_command_package_column
- \page_marks_synchronize_column\plusone\c_page_mix_n_of_columns\recurselevel\scratchbox
- % for the moment a quick and dirty patch .. we need to go into the box (hence the \plusone) .. a slowdowner
- \page_lines_add_numbers_to_box\scratchbox\recurselevel\c_page_mix_n_of_columns\plusone
- % the framed needs a reset of strut, align, setups etc
- \inheritedmixedcolumnsframedbox\currentmixedcolumns\scratchbox
- % optional
- \ifnum\recurselevel<\c_page_mix_n_of_columns
- \page_mix_command_inject_separator
- \fi
- }%
+ \edef\p_separator{\mixedcolumnsparameter\c!separator}%
+ \mixedcolumnseparatorwidth\d_page_mix_distance % \mixedcolumnsparameter\c!rulethickness\relax
+ \dorecurse\c_page_mix_n_of_columns\page_mix_routine_package_step
\egroup
\egroup}
\unexpanded\def\page_mix_command_package_column
{\page_mix_hbox to \d_page_mix_column_width \bgroup
% maybe intercept empty
- \ctxcommand{mixgetsplit(\recurselevel)}%
+ \clf_mixgetsplit\recurselevel\relax
\hskip-\d_page_mix_column_width
\page_mix_hbox to \d_page_mix_column_width \bgroup
\placenoteinserts
@@ -585,8 +624,8 @@
\page_mix_routine_construct\v!no
\page_mix_routine_package
\page_otr_construct_and_shipout\box\b_page_mix_collected
- \ctxcommand{mixflushrest()}%
- \ctxcommand{mixcleanup()}%
+ \clf_mixflushrest
+ \clf_mixcleanup
\egroup}
\unexpanded\def\page_mix_routine_balance
@@ -597,9 +636,9 @@
\doloop
{%writestatus\m!columns{construct continue (\the\htdp\b_page_mix_collected)}%
\page_mix_routine_construct\v!no
- \ifcase\ctxcommand{mixstate()}\relax
+ \ifcase\clf_mixstate\relax
% 0 = okay, we can balance
- \setbox\b_page_mix_collected\vbox{\ctxcommand{mixflushlist()}}% we could avoid this
+ \setbox\b_page_mix_collected\vbox{\clf_mixflushlist}% we could avoid this
%writestatus\m!columns{construct balance}%
\page_mix_routine_construct\v!yes
\page_mix_routine_package
@@ -614,16 +653,16 @@
\par
\nointerlineskip
\prevdepth\strutdp
- \ctxcommand{mixflushrest()}% rubish
- \ctxcommand{mixcleanup()}% rubish
+ \clf_mixflushrest% rubish
+ \clf_mixcleanup % rubish
\exitloop
\or
% 1 = we have stuff left, so flush and rebalance
%writestatus\m!columns{flush continue}%
\page_mix_routine_package
\page_otr_construct_and_shipout\box\b_page_mix_collected
- \setbox\b_page_mix_collected\vbox{\ctxcommand{mixflushrest()}}% we could avoid this
- \ctxcommand{mixcleanup()}%
+ \setbox\b_page_mix_collected\vbox{\clf_mixflushrest}% we could avoid this
+ \clf_mixcleanup
\ifdim\ht\b_page_mix_collected=\zeropoint
\exitloop
\fi
@@ -718,8 +757,8 @@
\page_mix_routine_construct\v!yes
\page_mix_routine_package
\dontleavehmode\box\b_page_mix_collected
- \ctxcommand{mixflushrest()}%
- \ctxcommand{mixcleanup()}%
+ \clf_mixflushrest
+ \clf_mixcleanup
\egroup}
%D As usual, floats complicates matters and this is where experimental code
@@ -760,11 +799,11 @@
% \unexpanded\def\page_mix_command_flush_top_insertions
% {\page_one_command_flush_top_insertions}
-% \unexpanded\def\page_mix_place_float_top
-% {\showmessage\m!columns4\empty\page_one_place_float_here}
+\unexpanded\def\page_mix_place_float_top
+ {\showmessage\m!columns4\empty\page_one_place_float_here}
-% \unexpanded\def\page_mix_place_float_bottom
-% {\showmessage\m!columns5\empty\page_one_place_float_here}
+\unexpanded\def\page_mix_place_float_bottom
+ {\showmessage\m!columns5\empty\page_one_place_float_here}
\unexpanded\def\page_mix_place_float_here
{\page_one_place_float_here}
diff --git a/Master/texmf-dist/tex/context/base/page-mul.mkiv b/Master/texmf-dist/tex/context/base/page-mul.mkiv
index 0063b3311c5..8db5a47732b 100644
--- a/Master/texmf-dist/tex/context/base/page-mul.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-mul.mkiv
@@ -1430,7 +1430,7 @@
% \stopcolumns
% \def\backgroundfinishcolumnbox
- % {\doifinsetelse\@@kloffset{\v!none,\v!overlay}
+ % {\doifelseinset\@@kloffset{\v!none,\v!overlay}
% {\let\@@kloffset\!!zeropoint}
% {\scratchdimen\@@kloffset
% \advance\scratchdimen -\@@klrulethickness
diff --git a/Master/texmf-dist/tex/context/base/page-one.mkiv b/Master/texmf-dist/tex/context/base/page-one.mkiv
index 3f9dcd7c617..4cf59da2dec 100644
--- a/Master/texmf-dist/tex/context/base/page-one.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-one.mkiv
@@ -454,10 +454,13 @@
\fi\fi
\fi}
+
\def\page_one_place_float_here_indeed
- {%\ifgridsnapping \else
- \baselinecorrection
- %\fi
+ {\ifgridsnapping
+ % otherwise real bad outcome
+ \else
+ \baselinecorrection % this has to be done better (and definitely not in column mode)
+ \fi
\doplacefloatbox
\page_floats_report_total
\dohandlenextfloatindent}
@@ -496,12 +499,12 @@
\def\page_one_place_float_bottom {\page_one_place_float_otherwise}
\def\page_one_place_float_otherwise
- {\doifinsetelse\v!here\floatlocationmethod
+ {\doifelseinset\v!here\floatlocationmethod
\page_one_place_float_otherwise_here
\page_one_place_float_otherwise_else}
\def\page_one_place_float_otherwise_here
- {\doifinsetelse\v!always\floatlocationmethod
+ {\doifelseinset\v!always\floatlocationmethod
{\page[\v!preference]%
\page_otr_command_check_if_float_fits
\ifconditional\c_page_floats_room
@@ -525,7 +528,7 @@
\fi}}
\def\page_one_place_float_otherwise_else
- {\doifinsetelse\v!always\floatlocationmethod
+ {\doifelseinset\v!always\floatlocationmethod
{\page_otr_command_check_if_float_fits
\ifconditional\c_page_floats_room
\page_one_place_float_auto_top_bottom
diff --git a/Master/texmf-dist/tex/context/base/page-pst.lua b/Master/texmf-dist/tex/context/base/page-pst.lua
index 50580ae3316..472bdbabed5 100644
--- a/Master/texmf-dist/tex/context/base/page-pst.lua
+++ b/Master/texmf-dist/tex/context/base/page-pst.lua
@@ -8,16 +8,18 @@ if not modules then modules = { } end modules ['page-pst'] = {
-- todo: adapt message
-local tonumber, next = tonumber, next
-local format, validstring = string.format, string.valid
-local sortedkeys = table.sortedkeys
+local tonumber, next, type = tonumber, next, type
+local find, validstring = string.find, string.valid
-local context = context
-local commands = commands
+local context = context
+local implement = interfaces.implement
local texgetcount = tex.getcount
local texsetcount = tex.setcount
+local sortedkeys = table.sortedkeys
+local formatters = string.formatters
+
local cache = { }
local function flush(page)
@@ -25,7 +27,7 @@ local function flush(page)
if c then
for i=1,#c do
-- characters.showstring(c[i])
- context.viafile(c[i],format("page.%s",validstring(page,"nopage")))
+ context.viafile(c[i],formatters["page.%s"](validstring(page,"nopage")))
end
cache[page] = nil
end
@@ -43,11 +45,11 @@ local function setnextpage()
texsetcount("global","c_page_postponed_blocks_next_page",n)
end
-function commands.flushpostponedblocks(page)
+local function flushpostponedblocks(specification)
-- we need to flush previously pending pages as well and the zero
-- slot is the generic one so that one is always flushed
local t = sortedkeys(cache)
- local p = tonumber(page) or texgetcount("realpageno") or 0
+ local p = tonumber(specification.page) or texgetcount("realpageno") or 0
for i=1,#t do
local ti = t[i]
if ti <= p then
@@ -59,9 +61,19 @@ function commands.flushpostponedblocks(page)
setnextpage()
end
-function commands.registerpostponedblock(page)
+implement {
+ name = "flushpostponedblocks",
+ actions = flushpostponedblocks,
+ arguments = {
+ {
+ { "page" }
+ }
+ }
+}
+
+local function registerpostponedblock(page)
if type(page) == "string" then
- if string.find(page,"^+") then
+ if find(page,"^+") then
page = texgetcount("realpageno") + (tonumber(page) or 1) -- future delta page
else
page = tonumber(page) or 0 -- preferred page or otherwise first possible occasion
@@ -80,7 +92,14 @@ function commands.registerpostponedblock(page)
if page == 0 then
interfaces.showmessage("layouts",3,#c)
else
- interfaces.showmessage("layouts",3,string.format("%s (realpage: %s)",#c,page))
+ interfaces.showmessage("layouts",3,formatters["%s (realpage: %s)"](#c,page))
end
setnextpage()
end
+
+implement {
+ name = "registerpostponedblock",
+ actions = registerpostponedblock,
+ arguments = "string"
+}
+
diff --git a/Master/texmf-dist/tex/context/base/page-pst.mkiv b/Master/texmf-dist/tex/context/base/page-pst.mkiv
index 704289246a3..f12663f6665 100644
--- a/Master/texmf-dist/tex/context/base/page-pst.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-pst.mkiv
@@ -57,10 +57,10 @@
\unexpanded\setvalue{\e!start\v!postponing}%
{\bgroup
\obeylines
- \doifnextoptionalelse{\egroup\page_postponed_blocks_start}{\egroup\page_postponed_blocks_start[0]}}
+ \doifelsenextoptional{\egroup\page_postponed_blocks_start}{\egroup\page_postponed_blocks_start[0]}}
\unexpanded\setvalue{\e!stop\v!postponing}%
- {\ctxcommand{registerpostponedblock("\currentpostponedpage")}\relax}
+ {\clf_registerpostponedblock{\currentpostponedpage}\relax}
\def\page_postponed_blocks_start[#1]%
{\edef\currentpostponedpage{#1}%
@@ -80,7 +80,8 @@
\setnormalcatcodes % postponing in verbatim
\uncatcodespacetokens % postponing in startlines
\restoreglobalbodyfont % otherwise problems inside split verbatim
- \ctxcommand{flushpostponedblocks()}%
+ \clf_flushpostponedblocks
+ % page {123}
\relax
\page_otr_command_flush_floats % new but potential dangerous, maybe we need a classification
\endgroup} % of blocks: with and without flush
diff --git a/Master/texmf-dist/tex/context/base/page-run.mkiv b/Master/texmf-dist/tex/context/base/page-run.mkiv
index 1f2551ebc17..9adcb23c7b3 100644
--- a/Master/texmf-dist/tex/context/base/page-run.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-run.mkiv
@@ -74,9 +74,11 @@
\startluacode
local format, concat = string.format, table.concat
+local todimen = number.todimen
+local texdimen = tex.dimen
-local function todimen(name,unit,fmt)
- return number.todimen(tex.dimen[name],unit,fmt)
+local function asdimen(name,unit)
+ return todimen(texdimen[name],unit,"%0.4f") -- 4 is more than enough, even 3 would be okay
end
local function checkedoptions(options)
@@ -122,7 +124,7 @@ function commands.showlayoutvariables(options)
for i=1,#dimensions do
local d = dimensions[i]
if options[d] then
- context("%s%s",todimen(name,d,"%0.4f"),d)
+ context("%s%s",asdimen(name,d),d)
context.NC()
end
end
@@ -143,7 +145,7 @@ function commands.showlayoutvariables(options)
for i=1,#dimensions do
local d = dimensions[i]
if options[d] then
- result[#result+1] = format("%12s%s",todimen(name,d,"%0.4f"),d)
+ result[#result+1] = format("%12s%s",asdimen(name,d),d)
end
end
commands.writestatus("layout",format("%-24s %s",interfaces.interfacedcommand(name),concat(result," ")))
@@ -297,8 +299,8 @@ end
\unexpanded\gdef\showmargins
{\starttabulate
- \NC asynchrone \NC \doifoddpageelse {odd} {even} \NC \NR
- \NC synchrone \NC \doifrightpageelse {right} {left} \NC \NR
+ \NC asynchrone \NC \doifelseoddpage {odd} {even} \NC \NR
+ \NC synchrone \NC \doifelserightpage {right} {left} \NC \NR
\NC right margin \NC \the\rightmarginwidth \NC \NR
\NC left margin \NC \the\leftmarginwidth \NC \NR
\NC outer margin \NC \the\outermarginwidth \NC \NR
diff --git a/Master/texmf-dist/tex/context/base/page-sel.mkvi b/Master/texmf-dist/tex/context/base/page-sel.mkvi
index cb9bcb509eb..ee25a37db4a 100644
--- a/Master/texmf-dist/tex/context/base/page-sel.mkvi
+++ b/Master/texmf-dist/tex/context/base/page-sel.mkvi
@@ -56,7 +56,7 @@
{\dotripleempty\page_selectors_insert}
\def\page_selectors_insert[#filename][#emptylist][#settings]%
- {\doifassignmentelse{#emptylist}
+ {\doifelseassignment{#emptylist}
{\page_selectors_insert_indeed[#filename][][#emptylist]}
{\page_selectors_insert_indeed[#filename][#emptylist][#settings]}}
diff --git a/Master/texmf-dist/tex/context/base/page-set.mkiv b/Master/texmf-dist/tex/context/base/page-set.mkiv
index 9c232f5358b..8f63dd74e22 100644
--- a/Master/texmf-dist/tex/context/base/page-set.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-set.mkiv
@@ -387,7 +387,7 @@
{\advance\scratchcounter\plusone}}%
\popmacro\columnmaxcells}
-\long\def\OTRSETrecurseRL#1%
+\def\OTRSETrecurseRL#1%
{\dostepwiserecurse\nofcolumns\plusone\minusone
{#1\hskip\namedcolumnsetparameter{\currentcolumnset:\recurselevel}\c!distance}}
@@ -2184,11 +2184,11 @@
\def\dodefinecolumntextarea[#1][#2][#3]% y=0 is mogelijke en handig !
{\ifthirdargument
- \doifinsetelse{#2}{\v!both,\v!fixed}
+ \doifelseinset{#2}{\v!both,\v!fixed}
{\definecolumntextarea[#1][\v!left ][\c!type=#2,#3]%
\definecolumntextarea[#1][\v!right][\c!type=#2,#3]}
{\doifelse{#2}\v!next
- {\doifoddpageelse
+ {\doifelseoddpage
{\definecolumntextarea[#1][\v!right][\c!type=#2,#3]}
{\definecolumntextarea[#1][\v!left ][\c!type=#2,#3]}}
{\presetlocalframed
@@ -2214,7 +2214,7 @@
{\setupcolumntextarea[#1][\v!left ][#3]%
\setupcolumntextarea[#1][\v!right][#3]}
{\doifelse{#2}\v!next
- {\doifoddpageelse
+ {\doifelseoddpage
{\setupcolumntextarea[#1][\v!right][#3]}
{\setupcolumntextarea[#1][\v!left][#3]}}
{\getparameters[\??mt#1#2][#3]}}%
@@ -2379,13 +2379,13 @@
\unexpanded\def\setupcolumntextareatext
{\dotripleempty\dosetupcolumntextareatext}
-\long\def\dosetupcolumntextareatext[#1][#2][#3]%
+\def\dosetupcolumntextareatext[#1][#2][#3]%
{\ifthirdargument
\doifelse{#2}\v!both
{\setvalue{\??mt#1\v!left }{#3}%
\setvalue{\??mt#1\v!right}{#3}}
{\doifelse{#2}\v!next
- {\doifoddpageelse
+ {\doifelseoddpage
{\setvalue{\??mt#1\v!right}{#3}}%
{\setvalue{\??mt#1\v!left }{#3}}}%
{\setvalue{\??mt#1#2}{#3}}}%
diff --git a/Master/texmf-dist/tex/context/base/page-sid.mkiv b/Master/texmf-dist/tex/context/base/page-sid.mkiv
index f7a2357bf34..cbdb95fc371 100644
--- a/Master/texmf-dist/tex/context/base/page-sid.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-sid.mkiv
@@ -15,21 +15,18 @@
\unprotect
-% These macro deal with side floats. We started with Daniel
-% Comenetz macros as published in TUGBoat Volume 14 (1993),
-% No.\ 1: Anchored Figures at Either Margin. I extended and
-% patched the macros to suite our needs which results in a
-% messy module. Therefore, this module badly needs an update
-% because it's now a mixture of old and new macros.
+% These macro deal with side floats. We started with Daniel Comenetz macros as published
+% in TUGBoat Volume 14 (1993), No.\ 1: Anchored Figures at Either Margin. I extended and
+% patched the macros to suite our needs which results in a messy module. Therefore, this
+% module badly needs an update because it's now a mixture of old and new macros.
% Interesting cases where it goes wrong:
%
% \placefigure[left]{}{} \dorecurse{3}{\input ward } {\par} \input ward
%
-% Here we get an unwanted carried over hangindent and parindent. A
-% solution is to associate it with the local par node instead. This
-% is something to discuss with Taco as it could be a new luatex
-% feature: explicitly set par properties.
+% Here we get an unwanted carried over hangindent and parindent. A solution is to associate
+% it with the local par node instead. This is something to discuss with Taco as it could be
+% a new luatex/mkiv feature: explicitly set par properties.
% Maybe I should just rewrite the lot.
@@ -202,17 +199,72 @@
\global\setfalse\c_page_sides_short
\global\setfalse\c_page_sides_flag}
+\unexpanded\def\doifelsesidefloat
+ {\par
+ \ifnum\dimexpr\d_page_sides_vsize-\pagetotal\relax>\zeropoint
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\let\doifsidefloatelse\doifelsesidefloat
+
+% \def\page_sides_flush_floats_indeed
+% {\global\advance\d_page_sides_vsize-\d_page_sides_bottomskip
+% \begingroup
+% \let\page_sides_flush_floats\relax
+% \forgetall
+% \doloop
+% {\strut
+% \iftracesidefloats
+% \color[darkgray]{\ruledhbox{\strut\kern\d_page_sides_width}}%
+% \fi
+% \par
+% % \ifdim\dimexpr\d_page_sides_vsize-\pagetotal\relax>\zeropoint
+% \ifdim\dimexpr\d_page_sides_vsize-\d_page_sides_bottomskip-\pagetotal\relax>\zeropoint
+% \ifnum\recurselevel>\plushundred % safeguard, sort of deadcycles
+% \exitloop
+% \fi
+% \else
+% \exitloop
+% \fi}%
+% \endgroup
+% \ifdim\parskip>\zeropoint % why this test ?
+% \ifdim\d_page_sides_bottomskip>\parskip
+% % \nowhitespace
+% % \vskip\d_page_sides_bottomskip
+% \blank[\v!nowhite,\the\dimexpr\d_page_sides_bottomskip]
+% \fi
+% \else
+% \blank[\the\d_page_sides_bottomskip]% new, so needs checking
+% \fi}
+
+\installcorenamespace{sidefloatsteps}
+
+\setvalue{\??sidefloatsteps\v!line }{\strut}
+\setvalue{\??sidefloatsteps\v!big }{\strut}
+\setvalue{\??sidefloatsteps\v!medium}{\halfstrut}
+\setvalue{\??sidefloatsteps\v!small }{\quarterstrut}
+\setvalue{\??sidefloatsteps\v!depth }{\depthstrut}
+
+% we don't officially know what kind of float we flush
+
\def\page_sides_flush_floats_indeed
{\global\advance\d_page_sides_vsize-\d_page_sides_bottomskip
\begingroup
\let\page_sides_flush_floats\relax
+ \edef\m_pages_strut{\executeifdefined{\??sidefloatsteps\rootfloatparameter\c!step}\strut}%
\forgetall
\doloop
- {\strut
- \iftracesidefloats
- \color[darkgray]{\ruledhbox{\strut\kern\d_page_sides_width}}%
+ {\iftracesidefloats
+ \dontleavehmode
+ \ruledhbox{\m_pages_strut\kern\d_page_sides_width}%
+ \else
+ \m_pages_strut
\fi
\par
+ \nointerlineskip
+ % \ifdim\dimexpr\d_page_sides_vsize-\d_page_sides_bottomskip-\pagetotal\relax>\zeropoint
\ifdim\dimexpr\d_page_sides_vsize-\pagetotal\relax>\zeropoint
\ifnum\recurselevel>\plushundred % safeguard, sort of deadcycles
\exitloop
@@ -223,11 +275,28 @@
\endgroup
\ifdim\parskip>\zeropoint % why this test ?
\ifdim\d_page_sides_bottomskip>\parskip
- \nowhitespace
- \vskip\d_page_sides_bottomskip
+ % \nowhitespace
+ % \vskip\d_page_sides_bottomskip
+% \blank[\v!nowhite,\the\dimexpr\d_page_sides_bottomskip]
+ \blank[\v!nowhite,\rootfloatparameter\c!sidespaceafter]
\fi
+ \else
+% \blank[\the\d_page_sides_bottomskip]% new, so needs checking
+ \blank[\rootfloatparameter\c!sidespaceafter]% new, so needs checking
\fi}
+% alternative method (unsnapped)
+%
+% \def\page_sides_flush_floats_indeed
+% {\scratchdimen\dimexpr\d_page_sides_vsize-\d_page_sides_bottomskip-\pagetotal\relax
+% \ifdim\parskip>\zeropoint % why this test ?
+% \ifdim\scratchdimen>\parskip
+% \blank[\v!nowhite,\the\scratchdimen] % better in stages
+% \fi
+% \else
+% \blank[\the\scratchdimen]
+% \fi}
+
\def\page_sides_check_floats_after_par
{\page_sides_check_floats_indeed
\ifdim\oldpagetotal=\pagetotal \else
@@ -764,7 +833,7 @@
\def\checksidefloat {\page_sides_check_floats}
\def\flushsidefloats {\page_sides_flush_floats}
\def\flushsidefloatsafterpar{\page_sides_flush_floats_after_par}
-%def\forgetsidefloats {\page_sides_forget_floats}
+\def\forgetsidefloats {\page_sides_forget_floats}
%def\synchronizesidefloats {\page_sides_synchronize_floats}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/page-str.lua b/Master/texmf-dist/tex/context/base/page-str.lua
index f2ac27cd9c1..56c6167aa56 100644
--- a/Master/texmf-dist/tex/context/base/page-str.lua
+++ b/Master/texmf-dist/tex/context/base/page-str.lua
@@ -17,6 +17,8 @@ local nodes, node = nodes, node
local nodepool = nodes.pool
local tasks = nodes.tasks
+local implement = interfaces.implement
+
local new_kern = nodepool.kern
local new_glyph = nodepool.glyph
@@ -235,6 +237,60 @@ tasks.disableaction("mvlbuilders", "streams.collect")
function streams.initialize()
tasks.enableaction ("mvlbuilders", "streams.collect")
+ function streams.initialize() end
end
-- todo: remove empty last { }'s
+-- todo: better names, enable etc
+
+implement {
+ name = "initializestream",
+ actions = streams.initialize,
+ onlyonce = true,
+}
+
+implement {
+ name = "enablestream",
+ actions = streams.enable,
+ arguments = "string"
+}
+
+implement {
+ name = "disablestream",
+ actions = streams.disable
+}
+
+implement {
+ name = "startstream",
+ actions = streams.start,
+ arguments = "string"
+}
+
+implement {
+ name = "stopstream",
+ actions = streams.stop
+}
+
+implement {
+ name = "flushstream",
+ actions = streams.flush,
+ arguments = "string"
+}
+
+implement {
+ name = "flushstreamcopy",
+ actions = streams.flush,
+ arguments = { "string", true }
+}
+
+implement {
+ name = "synchronizestream",
+ actions = streams.synchronize,
+ arguments = "string"
+}
+
+implement {
+ name = "pushstream",
+ actions = streams.push,
+ arguments = "string"
+}
diff --git a/Master/texmf-dist/tex/context/base/page-str.mkiv b/Master/texmf-dist/tex/context/base/page-str.mkiv
index a8fab9c6cbb..e4b2fa22980 100644
--- a/Master/texmf-dist/tex/context/base/page-str.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-str.mkiv
@@ -34,7 +34,7 @@
\unprotect
\let \currentoutputstream \empty
-\newif \ifinoutputstream % will becoem a conditional or mode
+\newif \ifinoutputstream % will become a conditional or mode
\newtoks \everyenableoutputstream
\appendtoks
@@ -42,7 +42,7 @@
\to \everyenableoutputstream
\unexpanded\def\initializeoutputstreams
- {\ctxlua{streams.initialize()}%
+ {\clf_initializestream
\glet\initializeoutputstreams\relax}
\unexpanded\def\enableoutputstream[#1]% could be \startoutputsubstream
@@ -50,12 +50,12 @@
\the\everyenableoutputstream
\inoutputstreamtrue
\xdef\currentoutputstream{#1}%
- \ctxlua{streams.enable("#1")}}
+ \clf_enablestream{#1}}
\unexpanded\def\disableoutputstream
{\inoutputstreamfalse
\global\let\currentoutputstream\s!default
- \ctxlua{streams.disable()}}
+ \clf_disablestream}
\unexpanded\def\startoutputstream[#1]%
{\begingroup
@@ -63,10 +63,10 @@
\the\everyenableoutputstream
\inoutputstreamtrue
\xdef\currentoutputstream{#1}%
- \ctxlua{streams.start("#1")}}
+ \clf_startstream{#1}}
\unexpanded\def\stopoutputstream
- {\ctxlua{streams.stop()}%
+ {\clf_stopstream
\endgroup}
\unexpanded\def\startoutputsubstream[#1]% just push/pop instead
@@ -77,13 +77,13 @@
{\globalpopmacro\currentoutputstream
\enableoutputstream[\currentoutputstream]}
-\def\flushoutputstream [#1]{\ctxlua{streams.flush("#1")}}
-\def\outputstreamcopy [#1]{\vbox{\ctxlua{streams.flush("#1",true)}}}
-\def\outputstreambox [#1]{\vbox{\ctxlua{streams.flush("#1")}}}
-\def\outputstreamunvcopy[#1]{\ctxlua{streams.flush("#1",true)}}
-\def\outputstreamunvbox [#1]{\ctxlua{streams.flush("#1")}}
-\def\synchronizestreams [#1]{\ctxlua{streams.synchronize("#1")}}
-\def\dopushoutputstream [#1]{\ctxlua{streams.push("#1")}}
+\def\flushoutputstream [#1]{\clf_flushstream{#1}}
+\def\outputstreambox [#1]{\vbox{\clf_flushstream{#1}}}
+\def\outputstreamcopy [#1]{\vbox{\clf_flushstreamcopy{#1}}}
+\def\outputstreamunvbox [#1]{\clf_flushstream{#1}}
+\def\outputstreamunvcopy[#1]{\clf_flushstreamcopy{#1}}
+\def\synchronizestreams [#1]{\clf_synchronizestream{#1}}
+\def\dopushoutputstream [#1]{\clf_pushstream{#1}}
\unexpanded\def\pushoutputstream
{\dosingleempty\dopushoutputstream}
diff --git a/Master/texmf-dist/tex/context/base/page-txt.mkvi b/Master/texmf-dist/tex/context/base/page-txt.mkvi
index 6d8d50028d9..76143a01859 100644
--- a/Master/texmf-dist/tex/context/base/page-txt.mkvi
+++ b/Master/texmf-dist/tex/context/base/page-txt.mkvi
@@ -142,11 +142,11 @@
%D \showsetup{noheaderandfooterlines}
%D \showsetup{notopandbottomlines}
-\def\noheaderandfooterlines
+\unexpanded\def\noheaderandfooterlines
{\setuplayoutelement[\v!header][\c!state=\v!empty]%
\setuplayoutelement[\v!footer][\c!state=\v!empty]}
-\def\notopandbottomlines
+\unexpanded\def\notopandbottomlines
{\setuplayoutelement[\v!top ][\c!state=\v!empty]%
\setuplayoutelement[\v!bottom][\c!state=\v!empty]}
@@ -253,7 +253,7 @@
%D only when double sided typesetting is enabled.
\unexpanded\def\page_layouts_process_element_double
- {\doifoddpageelse
+ {\doifelseoddpage
\page_layouts_process_element_double_odd
\page_layouts_process_element_double_even}
@@ -378,6 +378,9 @@
\doubleexpandafter\firstoftwoarguments
\fi\fi}
+\let\doiflayouttextlineelse\doifelselayouttextline
+\let\doiflayoutsomelineelse\doifelselayoutsomeline
+
\newconditional\resyncaftertextline
\setvalue{\??layouttextsline\v!normal}{\page_layouts_place_text_line_indeed}
@@ -418,7 +421,7 @@
%D The following macro has to be called after a page
%D is flushed.
-\def\resetlayouttextlines % public
+\unexpanded\def\resetlayouttextlines % public
{\csname\??layouttextsreset\v!top \endcsname
\csname\??layouttextsreset\v!header\endcsname
\csname\??layouttextsreset\v!text \endcsname
@@ -435,7 +438,7 @@
% \settext[header][text][middle][xxx][yyy]
-\def\settextcontent
+\unexpanded\def\settextcontent
{\doquintupleempty\page_layouts_set_text_content}
\def\page_layouts_set_text_content[#vertical][#horizontal][#one][#two][#three]% header text middle text/text
@@ -456,7 +459,7 @@
\c!rightstyle\c!rightcolor\c!rightwidth{#one}}%
\fi\fi\fi}
-\def\resettextcontent
+\unexpanded\def\resettextcontent
{\dotripleempty\page_layouts_reset_text_content}
\def\page_layouts_reset_text_content[#vertical][#horizontal][#tag]% header text middle
@@ -756,10 +759,12 @@
\page_layouts_reset_page_number_location
\ifx\p_strc_pagenumbers_location\empty
% set otherwise
+ \else\ifx\p_strc_pagenumbers_location\v!none
+ % set otherwise
\else
\page_layouts_identify_page_number_location
\page_layouts_set_page_number_location
- \fi
+ \fi\fi
\fi}
\def\page_layouts_place_page_number_left % historic
diff --git a/Master/texmf-dist/tex/context/base/phys-dim.lua b/Master/texmf-dist/tex/context/base/phys-dim.lua
index 870cbd29b0e..7430b62d773 100644
--- a/Master/texmf-dist/tex/context/base/phys-dim.lua
+++ b/Master/texmf-dist/tex/context/base/phys-dim.lua
@@ -50,12 +50,11 @@ local utfchar = utf.char
physics = physics or { }
physics.units = physics.units or { }
-local variables = interfaces.variables
-local v_reverse = variables.reverse
local allocate = utilities.storage.allocate
local context = context
local commands = commands
+local implement = interfaces.implement
local trace_units = false
local report_units = logs.reporter("units")
@@ -173,8 +172,8 @@ local p_c = (ddigitspace^1 * dskipperiod)^0 -- ___.
local p_c_dparser = math_one + math_two + dleader * p_c * dtrailer * dfinal
local c_p_dparser = math_one + math_two + dleader * c_p * dtrailer * dfinal
-function commands.digits(str,p_c)
- if p_c == v_reverse then
+local function makedigits(str,reverse)
+ if reverse then
matchlpeg(p_c_dparser,str)
else
matchlpeg(c_p_dparser,str)
@@ -287,18 +286,29 @@ local long_units = {
-- synonyms
- ["Metric Ton"] = "tonne",
+ MetricTon = "tonne",
Litre = "liter",
+ ["Metric Ton"] = "tonne",
+
-- non-SI units whose values must be obtained experimentally (Table 7)
- ["Electron Volt"] = "electronvolt",
+ AtomicMassUnit = "atomicmassunit",
+ AstronomicalUnit = "astronomicalunit",
+ ElectronVolt = "electronvolt",
Dalton = "dalton",
+
["Atomic Mass Unit"] = "atomicmassunit",
["Astronomical Unit"] = "astronomicalunit",
+ ["Electron Volt"] = "electronvolt",
-- special cases (catch doubles, okay, a bit over the top)
+ DegreesCelsius = "celsius",
+ DegreesFahrenheit = "fahrenheit",
+ DegreeCelsius = "celsius",
+ DegreeFahrenheit = "fahrenheit",
+
["Degrees Celsius"] = "celsius",
["Degrees Fahrenheit"] = "fahrenheit",
["Degree Celsius"] = "celsius",
@@ -323,12 +333,14 @@ local long_units = {
Hg = "mercury",
-- ["Millimetre Of Mercury"] = [[mmHg]],
Angstrom = "angstrom", -- strictly Ångström
- ["Nautical Mile"] = "nauticalmile",
+ NauticalMile = "nauticalmile",
Barn = "barn",
Knot = "knot",
Neper = "neper",
Bel = "bel", -- in practice only decibel used
+ ["Nautical Mile"] = "nauticalmile",
+
-- other non-SI units from CGS system (Table 9)
Erg = "erg",
@@ -601,7 +613,7 @@ labels.units = allocate {
electronvolt = { labels = { en = [[eV]] } },
dalton = { labels = { en = [[Da]] } },
atomicmassunit = { labels = { en = [[u]] } },
- astronomicalunit = { labels = { en = [[ua]] } },
+ astronomicalunit = { labels = { en = [[au]] } },
bar = { labels = { en = [[bar]] } },
angstrom = { labels = { en = [[Å]] } }, -- strictly Ångström
nauticalmile = { labels = { en = [[M]] } },
@@ -799,6 +811,18 @@ local function update_parsers() -- todo: don't remap utf sequences
+ V("nothing") * V("shortunit")
+ V("longprefix") * V("shortunit") -- centi m
+ V("shortprefix") * V("longunit"), -- c meter
+
+-- combination = ( V("longprefix") -- centi meter
+-- + V("nothing")
+-- ) * V("longunit")
+-- + ( V("shortprefix") -- c m
+-- + V("nothing")
+-- + V("longprefix")
+-- ) * V("shortunit") -- centi m
+-- + ( V("shortprefix") -- c meter
+-- ) * V("longunit"),
+
+
dimension = V("somespace")
* (
V("packaged") / dimpre
@@ -812,9 +836,7 @@ local function update_parsers() -- todo: don't remap utf sequences
* V("somespace"),
snippet = V("dimension")
+ V("somesymbol"),
- unit = (
- V("snippet")
- * (V("operator") * V("snippet"))^0
+ unit = ( V("snippet") * (V("operator") * V("snippet"))^0
+ V("somepackaged")
)^1,
}
@@ -854,7 +876,7 @@ local p_c_parser = nil
local c_p_parser = nil
local dirty = true
-function commands.unit(str,p_c)
+local function makeunit(str,reverse)
if dirty then
if trace_units then
report_units("initializing parser")
@@ -863,7 +885,7 @@ function commands.unit(str,p_c)
dirty = false
end
local ok
- if p_c == v_reverse then
+ if reverse then
ok = matchlpeg(p_c_parser,str)
else
ok = matchlpeg(c_p_parser,str)
@@ -909,7 +931,7 @@ local mapping = {
packaged = "packaged",
}
-function commands.registerunit(category,list)
+local function registerunit(category,list)
if not list or list == "" then
list = category
category = "unit"
@@ -922,3 +944,11 @@ function commands.registerunit(category,list)
end
-- inspect(tables)
end
+
+physics.units.registerunit = registerunit
+
+implement { name = "digits_normal", actions = makedigits, arguments = "string" }
+implement { name = "digits_reverse", actions = makedigits, arguments = { "string", true } }
+implement { name = "unit_normal", actions = makeunit, arguments = "string"}
+implement { name = "unit_reverse", actions = makeunit, arguments = { "string", true } }
+implement { name = "registerunit", actions = registerunit, arguments = { "string", "string" } }
diff --git a/Master/texmf-dist/tex/context/base/phys-dim.mkiv b/Master/texmf-dist/tex/context/base/phys-dim.mkiv
index 3de6b23449d..232edc2fc5e 100644
--- a/Master/texmf-dist/tex/context/base/phys-dim.mkiv
+++ b/Master/texmf-dist/tex/context/base/phys-dim.mkiv
@@ -246,12 +246,12 @@
\unexpanded\def\phys_digits_indeed#1%
{\dontleavehmode
\begingroup
- \ctxcommand{digits(\!!bs\detokenize{#1}\!!es,"\ifcase\c_phys_digits_order \v!normal\else\v!reverse\fi")}%
+ \ifcase\c_phys_digits_order\expandafter\clf_digits_normal\else\expandafter\clf_digits_reverse\fi{\detokenize{#1}}%
\endgroup
\settrue\c_phys_units_dospace}
\unexpanded\def\digits
- {\doifnextbgroupelse\phys_digits_argument\phys_digits_spaced}
+ {\doifelsenextbgroup\phys_digits_argument\phys_digits_spaced}
\def\phys_digits_argument#1%
{\phys_digits_indeed{#1}}
@@ -500,7 +500,8 @@
\to \everyunits
\unexpanded\def\phys_units_indeed#1%
- {\ctxcommand{unit(\!!bs\detokenize{#1}\!!es,"\unitparameter\c!order")}}
+ {\edef\p_order{\unitparameter\c!order}%
+ \ifx\p_order\v!reverse\expandafter\clf_unit_reverse\else\expandafter\clf_unit_normal\fi{\detokenize{#1}}}
\unexpanded\def\unitsPUS#1#2#3{\phys_units_next\prefixtext{#1}\unittext{#2}\unitsraise{\suffixtext{#3}}\c_phys_units_state\plusone} % suffix
\unexpanded\def\unitsPU #1#2{\phys_units_next\prefixtext{#1}\unittext{#2}\c_phys_units_state\plusthree} % unit
@@ -578,7 +579,7 @@
\let\unitsNstartindeed\unitsNstart
\unexpanded\def\unitsNstart
- {\doifnextcharelse\unitsNstop\gobbleoneargument\unitsNstartindeed}
+ {\doifelsenextchar\unitsNstop\gobbleoneargument\unitsNstartindeed}
% End of hack.
@@ -682,10 +683,10 @@
\definelabelclass [prefix] [2]
\definelabelclass [suffix] [2] % This is only a label because we want to show them in a table.
-\ctxcommand{definelabels("prefix", "prefixes" )}
-\ctxcommand{definelabels("unit", "units" )}
-\ctxcommand{definelabels("operator","operators")}
-\ctxcommand{definelabels("suffix", "suffixes" )}
+\clf_definelabels{prefix}{prefixes}\s!false\relax
+\clf_definelabels{unit}{units}\s!false\relax
+\clf_definelabels{operator}{operators}\s!false\relax
+\clf_definelabels{suffix}{suffixes}\s!false\relax
%D You can define additional units:
%D
@@ -716,7 +717,7 @@
{\dodoubleempty\phys_units_register}
\def\phys_units_register[#1][#2]%
- {\ctxcommand{registerunit(\!!bs#1\!!es,\!!bs#2\!!es)}}
+ {\clf_registerunit{#1}{#2}}
%D You can generate a list as follows:
%D
diff --git a/Master/texmf-dist/tex/context/base/ppchtex.mkiv b/Master/texmf-dist/tex/context/base/ppchtex.mkiv
index 0f42f91ce9b..d1167d4143a 100644
--- a/Master/texmf-dist/tex/context/base/ppchtex.mkiv
+++ b/Master/texmf-dist/tex/context/base/ppchtex.mkiv
@@ -100,11 +100,11 @@
\newconstant\chemicaldrawingmode
-\doifdefinedelse{beginpicture} % PiCTeX
- {\doifdefinedelse{startMPdrawing}
+\doifelsedefined{beginpicture} % PiCTeX
+ {\doifelsedefined{startMPdrawing}
{\chemicaldrawingmode\plustwo } % MetaPost
{\chemicaldrawingmode\zerocount}} % raw
- {\doifdefinedelse{psaxes}
+ {\doifelsedefined{psaxes}
{\chemicaldrawingmode\plusone } % PSTricks
{\chemicaldrawingmode\plusthree}} % unknown
@@ -387,7 +387,7 @@
{\def\maxchemical{#1}}
\def\doifchemicalnumber#1#2#3%
- {\doifnumberelse{#1}
+ {\doifelsenumber{#1}
{\ifnum#1>\maxchemical\relax
\writestatus{ppchtex}{number #1 is skipped}%
\else
@@ -682,7 +682,7 @@
\edef\@@chemicaltop {\the\!!countc}%
\edef\@@chemicalbottom{\the\!!countd}%
%
- \doifinsetelse\v!on{\@@chemicalframe,\@@chemicalaxis}
+ \doifelseinset\v!on{\@@chemicalframe,\@@chemicalaxis}
{\def\@@chemicalborder{\chemicalframe}}
{\def\@@chemicalborder{\normalchemicalframe}}%
%
@@ -867,14 +867,14 @@
\def\chemicalrepeat {1}
\def\redoprocesschemical[#1#2]%
- {\doifinstringelse{#1}{0123456789.}
+ {\doifelseinstring{#1}{0123456789.}
{\edef\chemicalrepeat{\chemicalrepeat#1}%
\redoprocesschemical[#2]}
{\processchemical[#1#2]%
\def\chemicalrepeat{1}}}
\def\doprocesschemical[#1#2]#3%
- {\doifinstringelse{#1}{0123456789.}
+ {\doifelseinstring{#1}{0123456789.}
{\def\chemicalrepeat{#1}%
\redoprocesschemical[#2]}
{#3}}
@@ -891,9 +891,9 @@
\divide\dimen0 by \@@localchemicalscale
\!!counta=\dimen0
\def\doprocess[##1##2]%
- {\doifinstringelse{##1}{128}
+ {\doifelseinstring{##1}{128}
{\edef\chemicaloffset{\the\!!counta}}
- {\doifinstringelse{##1}{456}
+ {\doifelseinstring{##1}{456}
{\edef\chemicaloffset{-\the\!!counta}}
{\doifelse{##1}{0}
{\edef\chemicaloffset{0}}
@@ -917,9 +917,9 @@
\dimen0=.25\wd0
\divide\dimen0 by \@@localchemicalscale
\!!counta=\dimen0
- \doifinstringelse{#1}{128}
+ \doifelseinstring{#1}{128}
{\edef\chemicaloffset{\the\!!counta}}
- {\doifinstringelse{#1}{456}
+ {\doifelseinstring{#1}{456}
{\edef\chemicaloffset{-\the\!!counta}}
{\doifelse{#1}{0}
{\edef\chemicaloffset{0}}
@@ -959,7 +959,7 @@
\setvalue{\s!angle4.#1}{\dosetchemicalangle{#5}}}
\def\chemicalrotate[#1]%
- {\doifdefinedelse{\s!mirror#1}
+ {\doifelsedefined{\s!mirror#1}
{\getvalue{\s!rotate\chemicalrotation.#1\getvalue{\s!mirror#1}}%
\getvalue{\s!angle\chemicalrotation.#1\getvalue{\s!mirror#1}}}
{\getvalue{\s!rotate\chemicalrotation.#1}%
@@ -984,7 +984,7 @@
\def\processchemicalrotation#1%
{\def\doprocess[##1##2]%
- {\doifnumberelse{##1}
+ {\doifelsenumber{##1}
{\def\chemicalrotation{##1}}
{\unknownchemical{ROT#1}}}%
\doprocess[#1]}
@@ -1067,9 +1067,11 @@
\def\dodoifsinglelocation#1#2\\#3%
{\ifx#2\relax#3\fi}
-\def\doifsinglelocationelse#1%
+\def\doifelsesinglelocation#1%
{\expandafter\dodoifsinglelocationelse#1\relax\\}
+\let\doifsinglelocationelse\doifelsesinglelocation
+
\def\putchemicaltext#1#2%
{\enablechemicalspecials
\ifchemicalpicture
@@ -1706,7 +1708,7 @@
\newif\ifinnerchemical
\def\dosimplechemical#1#2#3%
- {\doifdefinedelse{\??chemical\c!location}
+ {\doifelsedefined{\??chemical\c!location}
{\writestatus{ppchtex}{the {}{}-alternative is not permitted here}}
{\ifinnerchemical
\let\chemicalsign = \chemicalinnersign
@@ -2065,7 +2067,7 @@
HIGH=>\sethighsubscripts,
LOW=>\setlowsubscripts,
\s!default=>,
- \s!unknown=>\doifdefinedelse{\s!executechemical#1}
+ \s!unknown=>\doifelsedefined{\s!executechemical#1}
{\def\chemicalrotation{1}%
\def\chemicaloffset{0}%
\doifdefined{\s!executechemical#1}
@@ -2260,9 +2262,9 @@
{\dosingleargument\dodefinechemical}
\def\getpredefinedchemical#1%
- {\doifdefinedelse{\??chemical#1}
+ {\doifelsedefined{\??chemical#1}
{\getvalue{\??chemical#1}}
- {\doifdefinedelse{#1}
+ {\doifelsedefined{#1}
{\getvalue{#1}}
{\writestatus{ppchtex}{unknown chemical definition #1}}}}
diff --git a/Master/texmf-dist/tex/context/base/publ-aut.lua b/Master/texmf-dist/tex/context/base/publ-aut.lua
index ba492a93bd6..820ac78ff3b 100644
--- a/Master/texmf-dist/tex/context/base/publ-aut.lua
+++ b/Master/texmf-dist/tex/context/base/publ-aut.lua
@@ -11,23 +11,32 @@ if not characters then
dofile(resolvers.findfile("char-ini.lua"))
end
-local context = context
-local chardata = characters.data
+local lpeg = lpeg
-local tostring = tostring
+local type, next, tostring = type, next, tostring
local concat = table.concat
-local lpeg = lpeg
local utfchar = utf.char
+local formatters = string.formatters
+
+local P, C, V, Cs, Ct, Cg, Cf, Cc = lpeg.P, lpeg.C, lpeg.V, lpeg.Cs, lpeg.Ct, lpeg.Cg, lpeg.Cf, lpeg.Cc
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+
+local context = context
+----- commands = commands
-local publications = publications or { }
+local implement = interfaces.implement
+local ctx_setmacro = interfaces.setmacro
-local datasets = publications.datasets or { }
-publications.datasets = datasets
+local publications = publications
-publications.authors = publications.authors or { }
-local authors = publications.authors
+local datasets = publications.datasets
+local getcasted = publications.getcasted
-local P, C, V, Cs, Ct, lpegmatch, lpegpatterns = lpeg.P, lpeg.C, lpeg.V, lpeg.Cs, lpeg.Ct, lpeg.match, lpeg.patterns
+local allocate = utilities.storage.allocate
+
+local chardata = characters.data
+
+local report = logs.reporter("publications","authors")
-- local function makesplitter(separator)
-- return Ct { "start",
@@ -38,17 +47,26 @@ local P, C, V, Cs, Ct, lpegmatch, lpegpatterns = lpeg.P, lpeg.C, lpeg.V, lpeg.Cs
-- }
-- end
-local space = P(" ")
+-- authorlist = { authorspec and authorspec and authorspec }
+-- authorspec = composedname
+-- authorspec = surnames, firstnames
+-- authorspec = von, surnames, firstnames
+-- authorspec = von, surnames, jr, firstnames
+-- authorspec = von, surnames, jr, firstnames, initials
+
+local space = lpegpatterns.whitespace
local comma = P(",")
+local period = P(".")
+local dash = P("-")
local firstcharacter = lpegpatterns.utf8byte
+local utf8character = lpegpatterns.utf8character
+local p_and = space^1 * (P("and") + P("&&") + P("++")) * space^1
+local p_comma = space^0 * comma * space^0
+local p_space = space^1
+local p_shortone = C((utf8character -dash-period)^1)
+local p_longone = C( utf8character) * (1-dash-period)^0
--- local andsplitter = lpeg.tsplitat(space^1 * "and" * space^1)
--- local commasplitter = lpeg.tsplitat(space^0 * comma * space^0)
--- local spacesplitter = lpeg.tsplitat(space^1)
-
-local p_and = space^1 * "and" * space^1
-local p_comma = space^0 * comma * space^0
-local p_space = space^1
+local p_empty = P("{}")/"" * #(p_space^0 * (P(-1) + P(",")))
local andsplitter = Ct { "start",
start = (Cs((V("inner") + (1-p_and))^1) + p_and)^1,
@@ -56,7 +74,7 @@ local andsplitter = Ct { "start",
}
local commasplitter = Ct { "start",
- start = Cs(V("outer")) + (Cs((V("inner") + (1-p_comma))^1) + p_comma)^1,
+ start = Cs(V("outer")) + (p_empty + Cs((V("inner") + (1-p_comma))^1) + p_comma)^1,
outer = (P("{")/"") * ((V("inner") + P(1-P("}")))^1) * (P("}")/""),
inner = P("{") * ((V("inner") + P(1-P("}")))^1) * P("}"),
}
@@ -67,18 +85,40 @@ local spacesplitter = Ct { "start",
inner = P("{") * ((V("inner") + P(1-P("}")))^1) * P("}"),
}
+local p_initial = p_shortone * period * dash^0
+ + p_longone * (period + dash + P(-1))
+local initialsplitter = p_initial * P(-1) + Ct((p_initial)^1)
+
+local optionsplitter = Cf(Ct("") * Cg(C((1-space)^1) * space^0 * Cc(true))^1,rawset)
+
local function is_upper(str)
local first = lpegmatch(firstcharacter,str)
local okay = chardata[first]
return okay and okay.category == "lu"
end
+-- local cleaner = Cs( ( P("{}")/"" + P(1) )^1 )
+
local cache = { } -- 33% reuse on tugboat.bib
local nofhits = 0
local nofused = 0
+publications.authorcache = cache
+
+local function makeinitials(firstnames)
+ if firstnames and #firstnames > 0 then
+ local initials = { }
+ for i=1,#firstnames do
+ initials[i] = lpegmatch(initialsplitter,firstnames[i])
+ end
+ return initials
+ end
+end
+
local function splitauthorstring(str)
- if not str then
+ if str then
+ -- str = lpegmatch(cleaner,str)
+ else
return
end
nofused = nofused + 1
@@ -97,12 +137,15 @@ local function splitauthorstring(str)
-- print("hit 2",author,nofhits,nofused,math.round(100*nofhits/nofused))
end
if not detail then
- local firstnames, vons, surnames, initials, juniors
+ local firstnames, vons, surnames, initials, juniors, options
local split = lpegmatch(commasplitter,author)
--- inspect(split)
local n = #split
+ detail = {
+ original = author,
+ snippets = n,
+ }
if n == 1 then
- -- First von Last
+ -- {First Middle von Last}
local words = lpegmatch(spacesplitter,author)
firstnames, vons, surnames = { }, { }, { }
local i, n = 1, #words
@@ -132,14 +175,17 @@ local function splitauthorstring(str)
else
-- mess
end
- -- safeguard
if #surnames == 0 then
+ -- safeguard
firstnames = { }
vons = { }
surnames = { author }
+ else
+ initials = makeinitials(firstnames)
end
elseif n == 2 then
- -- von Last, First
+ -- {Last, First}
+ -- {von Last, First}
firstnames, vons, surnames = { }, { }, { }
local words = lpegmatch(spacesplitter,split[1])
local i, n = 1, #words
@@ -168,33 +214,44 @@ local function splitauthorstring(str)
while i <= n do
vons[#vons+1], i = words[i], i + 1
end
- else
- -- von Last, Jr ,First
- firstnames = lpegmatch(spacesplitter,split[1])
- juniors = lpegmatch(spacesplitter,split[2])
- surnames = lpegmatch(spacesplitter,split[3])
- if n > 3 then
- -- error
+ if surnames and firstnames and #surnames == 0 then
+ -- safeguard
+ surnames[1] = firstnames[#firstnames]
+ firstnames[#firstnames] = nil
end
- end
- if #surnames == 0 then
- surnames[1] = firstnames[#firstnames]
- firstnames[#firstnames] = nil
- end
- if firstnames then
- initials = { }
- for i=1,#firstnames do
- initials[i] = utfchar(lpegmatch(firstcharacter,firstnames[i]))
+ initials = makeinitials(firstnames)
+ elseif n == 3 then
+ -- {von Last, First, Jr}
+ surnames = lpegmatch(spacesplitter,split[1])
+ juniors = lpegmatch(spacesplitter,split[2])
+ firstnames = lpegmatch(spacesplitter,split[3])
+ initials = makeinitials(firstnames)
+ elseif n == 4 then
+ -- {Von, Last, First, Jr}
+ vons = lpegmatch(spacesplitter,split[1])
+ surnames = lpegmatch(spacesplitter,split[2])
+ juniors = lpegmatch(spacesplitter,split[3])
+ firstnames = lpegmatch(spacesplitter,split[4])
+ initials = makeinitials(firstnames)
+ elseif n >= 5 then
+ -- {Von, Last, First, Jr, F.}
+ -- {Von, Last, First, Jr, Fr., options}
+ vons = lpegmatch(spacesplitter,split[1])
+ surnames = lpegmatch(spacesplitter,split[2])
+ juniors = lpegmatch(spacesplitter,split[3])
+ firstnames = lpegmatch(spacesplitter,split[4])
+ initials = lpegmatch(spacesplitter,split[5])
+ options = split[6]
+ if options then
+ options = lpegmatch(optionsplitter,options)
end
end
- detail = {
- original = author,
- firstnames = firstnames,
- vons = vons,
- surnames = surnames,
- initials = initials,
- juniors = juniors,
- }
+ if firstnames and #firstnames > 0 then detail.firstnames = firstnames end
+ if vons and #vons > 0 then detail.vons = vons end
+ if surnames and #surnames > 0 then detail.surnames = surnames end
+ if initials and #initials > 0 then detail.initials = initials end
+ if juniors and #juniors > 0 then detail.juniors = juniors end
+ if options and next(options) then detail.options = options end
cache[author] = detail
nofhits = nofhits + 1
end
@@ -203,348 +260,326 @@ local function splitauthorstring(str)
return authors
end
--- local function splitauthors(dataset,tag,field)
--- local entries = datasets[dataset]
--- local luadata = entries.luadata
--- if not luadata then
--- return { }
--- end
--- local entry = luadata[tag]
--- if not entry then
--- return { }
--- end
--- return splitauthorstring(entry[field])
--- end
-
-local function the_initials(initials,symbol)
- local t, symbol = { }, symbol or "."
+local function the_initials(initials,symbol,connector)
+ if not symbol then
+ symbol = "."
+ end
+ if not connector then
+ connector = "-"
+ end
+ local result, r = { }, 0
for i=1,#initials do
- t[i] = initials[i] .. symbol
+ local initial = initials[i]
+ if type(initial) == "table" then
+ local set, s = { }, 0
+ for i=1,#initial do
+ if i > 1 then
+ s = s + 1 ; set[s] = connector
+ end
+ s = s + 1 ; set[s] = initial[i]
+ s = s + 1 ; set[s] = symbol
+ end
+ r = r + 1 ; result[r] = concat(set)
+ else
+ r = r + 1 ; result[r] = initial .. symbol
+ end
end
- return t
+ return result
end
--- authors
-
-local settings = { }
-
--- local defaultsettings = {
--- firstnamesep = " ",
--- vonsep = " ",
--- surnamesep = " ",
--- juniorsep = " ",
--- surnamejuniorsep = ", ",
--- juniorjuniorsep = ", ",
--- surnamefirstnamesep = ", ",
--- surnameinitialsep = ", ",
--- namesep = ", ",
--- lastnamesep = " and ",
--- finalnamesep = " and ",
--- etallimit = 1000,
--- etaldisplay = 1000,
--- etaltext = "",
--- }
-
-local defaultsettings = {
- firstnamesep = [[\btxlistvariantparameter{firstnamesep}]],
- vonsep = [[\btxlistvariantparameter{vonsep}]],
- surnamesep = [[\btxlistvariantparameter{surnamesep}]],
- juniorsep = [[\btxlistvariantparameter{juniorsep}]],
- surnamejuniorsep = [[\btxlistvariantparameter{surnamejuniorsep}]],
- juniorjuniorsep = [[\btxlistvariantparameter{juniorjuniorsep}]],
- surnamefirstnamesep = [[\btxlistvariantparameter{surnamefirstnamesep}]],
- surnameinitialsep = [[\btxlistvariantparameter{surnameinitialsep}]],
- namesep = [[\btxlistvariantparameter{namesep}]],
- lastnamesep = [[\btxlistvariantparameter{lastnamesep}]],
- finalnamesep = [[\btxlistvariantparameter{finalnamesep}]],
- --
- etaltext = [[\btxlistvariantparameter{etaltext}]],
- --
- etallimit = 1000,
- etaldisplay = 1000,
-}
-
-function authors.setsettings(s)
+local ctx_btxsetconcat = context.btxsetconcat
+local ctx_btxsetoverflow = context.btxsetoverflow
+local ctx_btxsetinitials = context.btxsetinitials
+local ctx_btxsetfirstnames = context.btxsetfirstnames
+local ctx_btxsetvons = context.btxsetvons
+local ctx_btxsetsurnames = context.btxsetsurnames
+local ctx_btxsetjuniors = context.btxsetjuniors
+local ctx_btxciteauthorsetup = context.btxciteauthorsetup
+local ctx_btxlistauthorsetup = context.btxlistauthorsetup
+local ctx_btxsetauthorvariant = context.btxsetauthorvariant
+local ctx_btxstartauthor = context.btxstartauthor
+local ctx_btxstopauthor = context.btxstopauthor
+
+local concatstate = publications.concatstate
+local f_invalid = formatters["<invalid %s: %s>"]
+
+local currentauthordata = nil
+local currentauthorsymbol = nil
+
+local manipulators = typesetters.manipulators
+local splitmanipulation = manipulators.splitspecification
+local applymanipulation = manipulators.applyspecification
+local manipulatormethods = manipulators.methods
+
+local function value(i,field)
+ if currentauthordata then
+ local entry = currentauthordata[i]
+ if entry then
+ local value = entry[field]
+ if value and #value > 0 then
+ return value
+ end
+ end
+ end
end
-authors.splitstring = splitauthorstring
-
--- [firstnames] [firstnamesep] [vons] [vonsep] [surnames] [juniors] [surnamesep] (Taco, von Hoekwater, jr)
-
-function authors.normal(author,settings)
- local firstnames, vons, surnames, juniors = author.firstnames, author.vons, author.surnames, author.juniors
- local result, settings = { }, settings or defaultsettings
- if firstnames and #firstnames > 0 then
- result[#result+1] = concat(firstnames," ")
- result[#result+1] = settings.firstnamesep or defaultsettings.firstnamesep
- end
- if vons and #vons > 0 then
- result[#result+1] = concat(vons," ")
- result[#result+1] = settings.vonsep or defaultsettings.vonsep
- end
- if surnames and #surnames > 0 then
- result[#result+1] = concat(surnames," ")
- if juniors and #juniors > 0 then
- result[#result+1] = settings.surnamejuniorsep or defaultsettings.surnamejuniorsep
- result[#result+1] = concat(juniors," ")
+implement { name = "btxcurrentfirstnames", arguments = "integer", actions = function(i) local v = value(i,"initials") if v then context(concat(the_initials(v,currentauthorsymbol))) end end }
+implement { name = "btxcurrentinitials", arguments = "integer", actions = function(i) local v = value(i,"firstnames") if v then context(concat(v," ")) end end }
+implement { name = "btxcurrentjuniors", arguments = "integer", actions = function(i) local v = value(i,"juniors") if v then context(concat(v," ")) end end }
+implement { name = "btxcurrentsurnames", arguments = "integer", actions = function(i) local v = value(i,"surnames") if v then context(concat(v," ")) end end }
+implement { name = "btxcurrentvons", arguments = "integer", actions = function(i) local v = value(i,"vons") if v then context(concat(v," ")) end end }
+
+local function btxauthorfield(i,field)
+ if currentauthordata then
+ local entry = currentauthordata[i]
+ if entry then
+ local manipulator, field = splitmanipulation(field)
+ local value = entry[field]
+ if not value or #value == 0 then
+ -- value, no need for message
+ elseif manipulator then
+ for i=1,#value do
+ if i > 1 then
+ context(" ")
+ end
+ context(applymanipulation(manipulator,value) or value)
+ end
+ elseif field == "initials" then
+ context(concat(the_initials(value,currentauthorsymbol)))
+ else
+ context(concat(value," "))
+ end
end
- elseif juniors and #juniors > 0 then
- result[#result+1] = concat(juniors," ")
end
- return concat(result)
end
--- [initials] [initialsep] [vons] [vonsep] [surnames] [juniors] [surnamesep] (T, von Hoekwater, jr)
+-- This is somewhat tricky: an author is not always an author but
+-- can also be a title or key, depending on the (optional) set it's
+-- in. Also, authors can be combined with years and so and they
+-- might be called upon mixed with other calls.
+
+local function btxauthor(dataset,tag,field,settings)
+ local split, usedfield, kind = getcasted(dataset,tag,field)
+ if kind == "author" then
+ local max = split and #split or 0
+ if max == 0 then
+ return
+ -- error
+ end
+ local etallimit = tonumber(settings.etallimit) or 1000
+ local etaldisplay = tonumber(settings.etaldisplay) or etallimit
+ local combiner = settings.combiner
+ local symbol = settings.symbol
+ local index = settings.index
+ if not combiner or combiner == "" then
+ combiner = "normal"
+ end
+ if not symbol then
+ symbol = "."
+ end
+ local ctx_btxsetup = settings.kind == "cite" and ctx_btxciteauthorsetup or ctx_btxlistauthorsetup
+ if max > etallimit and etaldisplay < max then
+ max = etaldisplay
+ end
+ currentauthordata = split
+ currentauthorsymbol = symbol
-function authors.normalshort(author,settings)
- local initials, vons, surnames, juniors = author.initials, author.vons, author.surnames, author.juniors
- local result, settings = { }, settings or defaultsettings
- if initials and #initials > 0 then
- result[#result+1] = concat(initials," ")
- result[#result+1] = settings.initialsep or defaultsettings.initialsep
- end
- if vons and #vons > 0 then
- result[#result+1] = concat(vons," ")
- result[#result+1] = settings.vonsep or defaultsettings.vonsep
- end
- if surnames and #surnames > 0 then
- result[#result+1] = concat(surnames," ")
- if juniors and #juniors > 0 then
- result[#result+1] = settings.surnamejuniorsep or defaultsettings.surnamejuniorsep
- result[#result+1] = concat(juniors," ")
+ local function oneauthor(i)
+ local author = split[i]
+ if index then
+ ctx_btxstartauthor(i,1,0)
+ else
+ local state = author.state or 0
+ ctx_btxstartauthor(i,max,state)
+ ctx_btxsetconcat(concatstate(i,max))
+ ctx_btxsetauthorvariant(combiner)
+ end
+ local initials = author.initials
+ if initials and #initials > 0 then
+ ctx_btxsetinitials() -- (concat(the_initials(initials,symbol)," "))
+ end
+ local firstnames = author.firstnames
+ if firstnames and #firstnames > 0 then
+ ctx_btxsetfirstnames() -- (concat(firstnames," "))
+ end
+ local vons = author.vons
+ if vons and #vons > 0 then
+ ctx_btxsetvons() -- (concat(vons," "))
+ end
+ local surnames = author.surnames
+ if surnames and #surnames > 0 then
+ ctx_btxsetsurnames() -- (concat(surnames," "))
+ end
+ local juniors = author.juniors
+ if juniors and #juniors > 0 then
+ ctx_btxsetjuniors() -- (concat(juniors," "))
+ end
+ if not index and i == max then
+ local overflow = #split - max
+ if overflow > 0 then
+ ctx_btxsetoverflow(overflow)
+ end
+ end
+ ctx_btxsetup(combiner)
+ ctx_btxstopauthor()
+ end
+ if index then
+ oneauthor(index)
+ else
+ for i=1,max do
+ oneauthor(i)
+ end
end
- elseif juniors and #juniors > 0 then
- result[#result+1] = concat(juniors," ")
+ else
+ report("ignored field %a of tag %a, used field %a is no author",field,tag,usedfield)
end
- return concat(result)
end
--- vons surnames juniors, firstnames
+implement {
+ name = "btxauthorfield",
+ actions = btxauthorfield,
+ arguments = { "integer", "string" }
+}
--- [vons] [vonsep] [surnames] [surnamejuniorsep] [juniors] [surnamefirstnamesep] [firstnames] (von Hoekwater jr, Taco)
+implement {
+ name = "btxauthor",
+ actions = btxauthor,
+ arguments = {
+ "string",
+ "string",
+ "string",
+ {
+ { "combiner" },
+ { "kind" },
+ { "etallimit" },
+ { "etaldisplay" },
+ { "symbol" },
+ }
+ }
+}
-function authors.inverted(author,settings)
- local firstnames, vons, surnames, juniors = author.firstnames, author.vons, author.surnames, author.juniors
- local result, settings = { }, settings or defaultsettings
- if vons and #vons > 0 then
- result[#result+1] = concat(vons," ")
- result[#result+1] = settings.vonsep or defaultsettings.vonsep
- end
- if surnames and #surnames > 0 then
- result[#result+1] = concat(surnames," ")
- if juniors and #juniors > 0 then
- result[#result+1] = settings.surnamejuniorsep or defaultsettings.surnamejuniorsep
- result[#result+1] = concat(juniors," ")
- end
- elseif juniors and #juniors > 0 then
- result[#result+1] = concat(juniors," ")
- end
- if firstnames and #firstnames > 0 then
- result[#result+1] = settings.surnamefirstnamesep or defaultsettings.surnamefirstnamesep
- result[#result+1] = concat(firstnames," ")
- end
- return concat(result)
+local function components(snippet,short)
+ local vons = snippet.vons
+ local surnames = snippet.surnames
+ local initials = snippet.initials
+ local firstnames = not short and snippet.firstnames
+ local juniors = snippet.juniors
+ return
+ vons and #vons > 0 and concat(vons," ") or "",
+ surnames and #surnames > 0 and concat(surnames," ") or "",
+ initials and #initials > 0 and concat(the_initials(initials)," ") or "",
+ firstnames and #firstnames > 0 and concat(firstnames," ") or "",
+ juniors and #juniors > 0 and concat(juniors, " ") or ""
end
--- [vons] [vonsep] [surnames] [surnamejuniorsep] [juniors] [surnamefirstnamesep] [initials] (von Hoekwater jr, T)
+local collapsers = allocate { }
-function authors.invertedshort(author,settings)
- local vons, surnames, initials, juniors = author.vons, author.surnames, author.initials, author.juniors
- local result, settings = { }, settings or defaultsettings
+publications.authorcollapsers = collapsers
+
+local function default(author)
+ local vons = author.vons
+ local surnames = author.surnames
+ local initials = author.initials
+ local firstnames = author.firstnames
+ local juniors = author.juniors
+ local result = { }
+ local nofresult = 0
if vons and #vons > 0 then
- result[#result+1] = concat(vons," ")
- result[#result+1] = settings.vonsep or defaultsettings.vonsep
+ nofresult = nofresult + 1 ; result[nofresult] = concat(vons," ")
end
if surnames and #surnames > 0 then
- result[#result+1] = concat(surnames," ")
- if juniors and #juniors > 0 then
- result[#result+1] = settings.surnamejuniorsep or defaultsettings.surnamejuniorsep
- result[#result+1] = concat(juniors," ")
- end
- elseif juniors and #juniors > 0 then
- result[#result+1] = concat(juniors," ")
+ nofresult = nofresult + 1 ; result[nofresult] = concat(surnames," ")
end
if initials and #initials > 0 then
- result[#result+1] = settings.surnameinitialsep or defaultsettings.surnameinitialsep
- result[#result+1] = concat(the_initials(initials)," ")
+ nofresult = nofresult + 1 ; result[nofresult] = concat(the_initials(initials)," ")
end
- return concat(result)
-end
-
-local lastconcatsize = 1
-
-local function concatnames(t,settings)
- local namesep = settings.namesep
- local lastnamesep = settings.lastnamesep
- local finalnamesep = settings.finalnamesep
- local lastconcatsize = #t
- if lastconcatsize > 2 then
- local s = { }
- for i=1,lastconcatsize-2 do
- s[i] = t[i] .. namesep
- end
- s[lastconcatsize-1], s[lastconcatsize] = t[lastconcatsize-1] .. finalnamesep, t[lastconcatsize]
- return concat(s)
- elseif lastconcatsize > 1 then
- return concat(t,lastnamesep)
- elseif lastconcatsize > 0 then
- return t[1]
- else
- return ""
+ if firstnames and #firstnames > 0 then
+ nofresult = nofresult + 1 ; result[nofresult] = concat(firstnames," ")
end
+ if juniors and #juniors > 0 then
+ nofresult = nofresult + 1 ; result[nofresult] = concat(juniors," ")
+ end
+ return concat(result," ")
end
-function authors.concat(dataset,tag,field,settings)
- table.setmetatableindex(settings,defaultsettings)
- local combiner = settings.combiner
- if not combiner or type(combiner) == "string" then
- combiner = authors[combiner or "normal"] or authors.normal
- end
- local split = datasets[dataset].details[tag][field]
- local etallimit = settings.etallimit or 1000
- local etaldisplay = settings.etaldisplay or etallimit
- local max = split and #split or 0
- if max == 0 then
- -- error
- end
- if max > etallimit and etaldisplay < max then
- max = etaldisplay
+collapsers.default = default
+
+local function writer(key,snippets)
+ if not key then
+ return ""
end
- local combined = { }
- for i=1,max do
- combined[i] = combiner(split[i],settings)
+ if type(key) == "string" then
+ return key
end
- local result = concatnames(combined,settings)
- if #combined <= max then
- return result
+ local n = #key
+ if n == 0 then
+ return ""
+ elseif n == 1 then
+ local author = key[1]
+ local options = author.options
+ if options then
+ for option in next, options do
+ local collapse = collapsers[option]
+ if collapse then
+ return collapse(author)
+ end
+ end
+ end
+ return default(author)
else
- return result .. settings.etaltext
- end
-end
-
-function commands.btxauthor(...)
- context(authors.concat(...))
-end
-
-function authors.short(author,year)
- -- todo
--- local result = { }
--- if author then
--- local authors = splitauthors(author)
--- for a=1,#authors do
--- local aa = authors[a]
--- local initials = aa.initials
--- for i=1,#initials do
--- result[#result+1] = initials[i]
--- end
--- local surnames = aa.surnames
--- for s=1,#surnames do
--- result[#result+1] = utfchar(lpegmatch(firstcharacter,surnames[s]))
--- end
--- end
--- end
--- if year then
--- result[#result+1] = year
--- end
--- return concat(result)
-end
-
--- We can consider creating a hashtable key -> entry but I wonder if
--- pays off.
-
-local compare = sorters.comparers.basic -- (a,b)
-local strip = sorters.strip
-local splitter = sorters.splitters.utf
-
-function authors.preparedsort(dataset,list,sorttype_a,sorttype_b,sorttype_c)
- local luadata = datasets[dataset].luadata
- local details = datasets[dataset].details
- local valid = { }
- local splitted = { }
- table.setmetatableindex(splitted,function(t,k) -- could be done in the sorter but seldom that many shared
- local v = splitter(k,true) -- in other cases
- t[k] = v
- return v
- end)
- local snippets = { }
- for i=1,#list do
- -- either { tag, tag, ... } or { { tag, index }, { tag, index } }
- local li = list[i]
- local tag = type(li) == "string" and li or li[1]
- local entry = luadata[tag]
- local detail = details[tag]
- local suffix = tostring(i)
- local year = nil
- local assembled = nil
- if entry and detail then
- local key = detail[sorttype_a] or detail[sorttype_b] or detail[sorttype_c]
- if key then
- -- maybe an option is to also sort the authors first
- local n = #key
- local s = 0
- for i=1,n do
- local k = key[i]
- local vons = k.vons
- local surnames = k.surnames
- local initials = k.initials
- if vons and #vons > 0 then
- s = s + 1 ; snippets[s] = concat(vons," ")
- end
- if surnames and #surnames > 0 then
- s = s + 1 ; snippets[s] = concat(surnames," ")
- end
- if initials and #initials > 0 then
- s = s + 1 ; snippets[s] = concat(initials," ")
+ local t = { }
+ local s = 0
+ for i=1,n do
+ local author = key[i]
+ local options = author.options
+ s = s + 1
+ if options then
+ local done = false
+ for option in next, options do
+ local collapse = collapsers[option]
+ if collapse then
+ t[s] = collapse(author)
+ done = true
end
end
- assembled = concat(snippets," ",1,s)
+ if not done then
+ t[s] = default(author)
+ end
else
- assembled = ""
+ t[s] = default(author)
end
- year = entry.year or "9998"
- else
- assembled = ""
- year = "9999"
end
- valid[i] = {
- index = i,
- split = {
- splitted[strip(assembled)],
- splitted[year],
- splitted[suffix],
- },
--- names = assembled,
--- year = year,
--- suffix = suffix,
- }
+ return concat(t," & ")
end
- return valid
end
-function authors.sorted(dataset,list,sorttype) -- experimental
- local valid = authors.preparedsort(dataset,list,sorttype)
- if #valid == 0 or #valid ~= #list then
- return list
- else
- sorters.sort(valid,compare)
- for i=1,#valid do
- valid[i] = valid[i].index
- end
- return valid
- end
-end
+publications.writers .author = writer
+publications.casters .author = splitauthorstring
+publications.components.author = components
--- local dataset = publications.datasets.test
---
--- local function add(str)
--- dataset.details[str] = { author = publications.authors.splitstring(str) }
--- end
---
--- add("Hagen, Hans and Hoekwater, Taco Whoever T. Ex. and Henkel Hut, Hartmut Harald von der")
--- add("Hans Hagen and Taco Whoever T. Ex. Hoekwater and Hartmut Harald von der Henkel Hut")
--- add("de Gennes, P. and Gennes, P. de")
--- add("van't Hoff, J. H. and {van't Hoff}, J. H.")
+-- sharedmethods.author = {
+-- { field = "key", default = "", unknown = "" },
+-- { field = "author", default = "", unknown = "" },
+-- { field = "title", default = "", unknown = "" },
+-- }
+
+-- Analysis of the APA by Alan:
--
--- local list = table.keys(dataset.details)
--- local sort = publications.authors.sorted("test",list,"author")
--- local test = { } for i=1,#sort do test[i] = dataset.details[list[sort[i]]] end
+-- first : key author editor publisher title journal volume number pages
+-- second: year suffix title month day journal volume number
+
+publications.sortmethods.authoryear = {
+ sequence = {
+ { field = "key", default = "", unknown = "" },
+ { field = "author", default = "", unknown = "" },
+ { field = "year", default = "9998", unknown = "9999" },
+ { field = "suffix", default = " ", unknown = " " },
+ { field = "month", default = "13", unknown = "14" },
+ { field = "day", default = "32", unknown = "33" },
+ { field = "journal", default = "", unknown = "" },
+ { field = "volume", default = "", unknown = "" },
+ { field = "number", default = "", unknown = "" },
+ { field = "title", default = "", unknown = "" },
+ { field = "pages", default = "", unknown = "" },
+ },
+}
diff --git a/Master/texmf-dist/tex/context/base/publ-dat.lua b/Master/texmf-dist/tex/context/base/publ-dat.lua
index 6062d0d4cf7..957322f7c2c 100644
--- a/Master/texmf-dist/tex/context/base/publ-dat.lua
+++ b/Master/texmf-dist/tex/context/base/publ-dat.lua
@@ -8,6 +8,8 @@ if not modules then modules = { } end modules ['publ-dat'] = {
-- todo: strip the @ in the lpeg instead of on do_definition and do_shortcut
-- todo: store bibroot and bibrootdt
+-- todo: dataset = datasets[dataset] => current = datasets[dataset]
+-- todo: maybe split this file
--[[ldx--
<p>This is a prelude to integrated bibliography support. This file just loads
@@ -16,32 +18,42 @@ in a convenient way. Actually handling the data takes place elsewhere.</p>
--ldx]]--
if not characters then
- dofile(resolvers.findfile("char-def.lua"))
- dofile(resolvers.findfile("char-ini.lua"))
+ dofile(resolvers.findfile("char-utf.lua"))
dofile(resolvers.findfile("char-tex.lua"))
end
local chardata = characters.data
local lowercase = characters.lower
-local lower, gsub, find = string.lower, string.gsub, string.find
-local concat = table.concat
+local lower, find, sub = string.lower, string.find, string.sub
+local concat, copy, tohash = table.concat, table.copy, table.tohash
local next, type, rawget = next, type, rawget
local utfchar = utf.char
local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
local textoutf = characters and characters.tex.toutf
local settings_to_hash, settings_to_array = utilities.parsers.settings_to_hash, utilities.parsers.settings_to_array
local formatters = string.formatters
-local sortedkeys, sortedhash = table.sortedkeys, table.sortedhash
-local xmlcollected, xmltext, xmlconvert = xml.collected, xml.text, xmlconvert
+local sortedkeys, sortedhash, keys = table.sortedkeys, table.sortedhash, table.keys
+local xmlcollected, xmltext, xmlconvert = xml.collected, xml.text, xml.convert
local setmetatableindex = table.setmetatableindex
-- todo: more allocate
-local P, R, S, V, C, Cc, Cs, Ct, Carg = lpeg.P, lpeg.R, lpeg.S, lpeg.V, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Carg
+local P, R, S, V, C, Cc, Cs, Ct, Carg, Cmt, Cp = lpeg.P, lpeg.R, lpeg.S, lpeg.V, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Carg, lpeg.Cmt, lpeg.Cp
+
+local p_whitespace = lpegpatterns.whitespace
+local p_utf8character = lpegpatterns.utf8character
+
+local trace = false trackers.register("publications", function(v) trace = v end)
+local trace_duplicates = true trackers.register("publications.duplicates", function(v) trace = v end)
-local trace = false trackers.register("publications", function(v) trace = v end)
local report = logs.reporter("publications")
+local report_duplicates = logs.reporter("publications","duplicates")
+
+local allocate = utilities.storage.allocate
+
+local commands = commands
+local implement = interfaces.implement
publications = publications or { }
local publications = publications
@@ -49,17 +61,120 @@ local publications = publications
local datasets = publications.datasets or { }
publications.datasets = datasets
+local writers = publications.writers or { }
+publications.writers = writers
+
+local tables = publications.tables or { }
+publications.tables = tables
+
publications.statistics = publications.statistics or { }
local publicationsstats = publications.statistics
+local loaders = publications.loaders or { }
+publications.loaders = loaders
+
+local casters = { }
+publications.casters = casters
+
+-- local sorters = { }
+-- publications.sorters = sorters
+--
+-- local indexers = { }
+-- publications.indexers = indexers
+
+local components = { }
+publications.components = components -- register components
+
+local enhancers = publications.enhancers or { }
+publications.enhancers = enhancers
+
+local enhancer = publications.enhancer or utilities.sequencers.new { arguments = "dataset" }
+publications.enhancer = enhancer
+
+utilities.sequencers.appendgroup(enhancer,"system") -- private
+
publicationsstats.nofbytes = 0
publicationsstats.nofdefinitions = 0
publicationsstats.nofshortcuts = 0
publicationsstats.nofdatasets = 0
+local privates = allocate {
+ category = true,
+ tag = true,
+ index = true,
+ suffix = true,
+ specification = true,
+}
+
+local specials = allocate {
+ key = true,
+ crossref = true,
+ keywords = true,
+ language = true,
+ comment = true,
+}
+
+local implicits = allocate {
+ category = "implicit",
+ tag = "implicit",
+ key = "implicit",
+ keywords = "implicit",
+ language = "implicit",
+ crossref = "implicit",
+}
+
+local origins = allocate {
+ "optional",
+ "extra",
+ "required",
+ "virtual",
+}
+
+local virtuals = allocate {
+ "authoryear",
+ "authoryears",
+ "authornum",
+ "num",
+ "suffix",
+}
+
+local defaulttypes = allocate {
+ author = "author",
+ editor = "author",
+ publisher = "author",
+ page = "pagenumber",
+ pages = "pagenumber",
+ keywords = "keyword",
+ doi = "url",
+ url = "url",
+}
+
+local defaultsets = allocate {
+ page = { "page", "pages" },
+}
+
+tables.implicits = implicits
+tables.origins = origins
+tables.virtuals = virtuals
+tables.types = defaulttypes
+tables.sets = defaultsets
+tables.privates = privates
+tables.specials = specials
+
+local variables = interfaces and interfaces.variables or setmetatableindex("self")
+
+local v_all = variables.all
+local v_default = variables.default
+
+if not publications.usedentries then
+ function publications.usedentries()
+ return { }
+ end
+end
+
local xmlplaceholder = "<?xml version='1.0' standalone='yes'?>\n<bibtex></bibtex>"
-local defaultshortcuts = {
+local defaultshortcuts = allocate {
jan = "1",
feb = "2",
mar = "3",
@@ -74,16 +189,144 @@ local defaultshortcuts = {
dec = "12",
}
-local space = lpeg.patterns.whitespace^0
+local space = p_whitespace^0
local separator = space * "+" * space
local l_splitter = lpeg.tsplitat(separator)
local d_splitter = lpeg.splitat (separator)
+local unknownfield = function(t,k)
+ local v = "extra"
+ t[k] = v
+ return v
+end
+
+local unknowncategory = function(t,k)
+ local v = {
+ required = false,
+ optional = false,
+ virtual = false,
+ fields = setmetatableindex(unknownfield), -- this will remember them
+ types = unknowntypes,
+ sets = setmetatableindex(defaultsets), -- new, but rather small
+ }
+ t[k] = v
+ return v
+end
+
+local unknowntype = function(t,k)
+ local v = "string"
+ t[k] = v
+ return v
+end
+
+local default = {
+ name = name,
+ version = "1.00",
+ comment = "unknown specification.",
+ author = "anonymous",
+ copyright = "no one",
+ categories = setmetatableindex(unknowncategory),
+ types = setmetatableindex(defaulttypes,unknowntype),
+}
+
+-- maybe at some point we can have a handlers table with per field
+-- a found, fetch, ... method
+
+local function checkfield(specification,category,data)
+ local list = setmetatableindex({},implicits)
+ data.fields = list
+ data.category = category
+ local sets = data.sets or { }
+ for i=1,#origins do
+ local t = origins[i]
+ local d = data[t]
+ if d then
+ for i=1,#d do
+ local di = d[i]
+ di = sets[di] or di
+ if type(di) == "table" then
+ for i=1,#di do
+ list[di[i]] = t
+ end
+ else
+ list[di] = t
+ end
+ end
+ else
+ data[t] = { }
+ end
+ end
+ return data
+end
+
+local specifications = setmetatableindex(function(t,name)
+ if not name then
+ return default -- initializer
+ end
+ local filename = formatters["publ-imp-%s.lua"](name)
+ local fullname = resolvers.findfile(filename) or ""
+ if fullname == "" then
+ report("no data definition file %a for %a",filename,name)
+ return default
+ end
+ local specification = table.load(fullname)
+ if not specification then
+ report("invalid data definition file %a for %a",fullname,name)
+ return default
+ end
+ --
+ local categories = specification.categories
+ if not categories then
+ categories = { }
+ specification.categories = categories
+ end
+ setmetatableindex(categories,unknowncategory)
+ --
+ local types = specification.types
+ if not types then
+ types = defaulttypes
+ specification.types = types
+ end
+ setmetatableindex(types,unknowntype)
+ --
+ local fields = setmetatableindex(unknownfield)
+ specification.fields = fields
+ --
+ local virtual = specification.virtual
+ if virtual == nil then -- so false is valid
+ virtual = { }
+ elseif virtual == false then
+ virtual = { }
+ elseif type(virtual) ~= table then
+ virtual = virtuals
+ end
+ specification.virtual = virtual
+ specification.virtualfields = tohash(virtual)
+ --
+ for category, data in next, categories do
+ categories[category] = checkfield(specification,category,copy(data)) -- we make sure we have no clones
+ end
+ --
+ t[name] = specification
+ --
+ return specification
+end)
+
+publications.specifications = specifications
+
+function publications.setcategory(target,category,data)
+ local specification = specifications[target]
+ specification.categories[category] = checkfield(specification,category,data)
+end
+
function publications.parenttag(dataset,tag)
- if find(tag,"%+") then
+ if not dataset or not tag then
+ report("error in specification, dataset %a, tag %a",dataset,tag)
+ elseif find(tag,"%+") then
local tags = lpegmatch(l_splitter,tag)
local parent = tags[1]
- local luadata = datasets[dataset].luadata
+ local current = datasets[dataset]
+ local luadata = current.luadata
local first = luadata[parent]
if first then
local combined = first.combined
@@ -109,7 +352,7 @@ function publications.parenttag(dataset,tag)
return parent
end
end
- return tag
+ return tag or ""
end
function publications.new(name)
@@ -121,7 +364,8 @@ function publications.new(name)
luadata = { },
suffixes = { },
xmldata = xmlconvert(xmlplaceholder),
- -- details = { },
+ details = { },
+ ordered = { },
nofbytes = 0,
entries = nil, -- empty == all
sources = { },
@@ -134,29 +378,16 @@ function publications.new(name)
resources = false,
userdata = false,
},
+ specifications = {
+ -- used specifications
+ },
}
-- we delay details till we need it (maybe we just delay the
-- individual fields but that is tricky as there can be some
-- depedencies)
- setmetatableindex(dataset,function(t,k)
- -- will become a plugin
- if k == "details" and publications.enhance then
- dataset.details = { }
- publications.enhance(dataset.name)
- return dataset.details
- end
- end)
return dataset
end
-function publications.markasupdated(name)
- if name == "string" then
- datasets[name].details = nil
- else
- datasets.details = nil
- end
-end
-
setmetatableindex(datasets,function(t,k)
if type(k) == "table" then
return k -- so we can use this accessor as checker
@@ -167,40 +398,6 @@ setmetatableindex(datasets,function(t,k)
end
end)
--- we apply some normalization
-
-local space = S(" \t\n\r\f") -- / " "
-
------ command = P("\\") * Cc("btxcmd{") * (R("az","AZ")^1) * Cc("}")
------ command = P("\\") * (Carg(1) * C(R("az","AZ")^1) / function(list,c) list[c] = (list[c] or 0) + 1 return "btxcmd{" .. c .. "}" end)
-local command = P("\\") * (Carg(1) * C(R("az","AZ")^1) * space^0 / function(list,c) list[c] = (list[c] or 0) + 1 return "btxcmd{" .. c .. "}" end)
-local somemath = P("$") * ((1-P("$"))^1) * P("$") -- let's not assume nested math
-local any = P(1)
-local done = P(-1)
-local one_l = P("{") / ""
-local one_r = P("}") / ""
-local two_l = P("{{") / ""
-local two_r = P("}}") / ""
-local special = P("#") / "\\letterhash"
-
-local filter_0 = S('\\{}')
-local filter_1 = (1-filter_0)^0 * filter_0
-local filter_2 = Cs(
--- {{...}} ... {{...}}
--- two_l * (command + special + any - two_r - done)^0 * two_r * done +
--- one_l * (command + special + any - one_r - done)^0 * one_r * done +
- (somemath + command + special + any )^0
-)
-
--- Currently we expand shortcuts and for large ones (like the acknowledgements
--- in tugboat.bib) this is not that efficient. However, eventually strings get
--- hashed again.
-
-local function do_shortcut(key,value,dataset)
- publicationsstats.nofshortcuts = publicationsstats.nofshortcuts + 1
- dataset.shortcuts[key] = value
-end
-
local function getindex(dataset,luadata,tag)
local found = luadata[tag]
if found then
@@ -214,357 +411,769 @@ end
publications.getindex = getindex
--- todo: categories : metatable that lowers and also counts
--- todo: fields : metatable that lowers
-
-local function do_definition(category,tag,tab,dataset)
- publicationsstats.nofdefinitions = publicationsstats.nofdefinitions + 1
- local fields = dataset.fields
- local luadata = dataset.luadata
- local found = luadata[tag]
- local index = getindex(dataset,luadata,tag)
- local entries = {
- category = lower(category),
- tag = tag,
- index = index,
- }
- for i=1,#tab,2 do
- local original = tab[i]
- local normalized = fields[original]
- if not normalized then
- normalized = lower(original) -- we assume ascii fields
- fields[original] = normalized
- end
- local value = tab[i+1]
- value = textoutf(value)
- if lpegmatch(filter_1,value) then
- value = lpegmatch(filter_2,value,1,dataset.commands) -- we need to start at 1 for { }
- end
- if normalized == "crossref" then
- local parent = luadata[value]
- if parent then
- setmetatableindex(entries,parent)
+do
+
+ -- we apply some normalization
+
+ local space = S(" \t\n\r\f") -- / " "
+ local collapsed = space^1/" "
+ ----- csletter = R("az","AZ")
+ local csletter = lpegpatterns.csletter
+
+ ----- command = P("\\") * Cc("btxcmd{") * (R("az","AZ")^1) * Cc("}")
+ ----- command = P("\\") * (Carg(1) * C(R("az","AZ")^1) / function(list,c) list[c] = (list[c] or 0) + 1 return "btxcmd{" .. c .. "}" end)
+ ----- command = P("\\") * (Carg(1) * C(R("az","AZ")^1) * space^0 / function(list,c) list[c] = (list[c] or 0) + 1 return "btxcmd{" .. c .. "}" end)
+ local command = P("\\") * (Carg(1) * C(csletter^1) * space^0 / function(list,c) list[c] = (list[c] or 0) + 1 return "btxcmd{" .. c .. "}" end)
+ local whatever = P("\\") * P(" ")^1 / " "
+ + P("\\") * ( P("hbox") + P("raise") ) -- bah
+ local somemath = P("$") * ((1-P("$"))^1) * P("$") -- let's not assume nested math
+ ----- character = lpegpatterns.utf8character
+ local any = P(1)
+ local done = P(-1)
+ -- local one_l = P("{") / ""
+ -- local one_r = P("}") / ""
+ -- local two_l = P("{{") / ""
+ -- local two_r = P("}}") / ""
+ local zero_l_r = P("{}") / "" * #P(1)
+ local special = P("#") / "\\letterhash "
+
+ local filter_0 = S('\\{}#')
+ local filter_1 = (1-filter_0)^0 * filter_0
+ local filter_2 = Cs(
+ -- {{...}} ... {{...}}
+ -- two_l * (command + special + any - two_r - done)^0 * two_r * done +
+ -- one_l * (command + special + any - one_r - done)^0 * one_r * done +
+ (
+ somemath +
+ whatever +
+ command +
+ special +
+ collapsed +
+ zero_l_r +
+ any
+ )^0
+ )
+
+ -- Currently we expand shortcuts and for large ones (like the acknowledgements
+ -- in tugboat.bib) this is not that efficient. However, eventually strings get
+ -- hashed again.
+
+ local function do_shortcut(key,value,dataset)
+ publicationsstats.nofshortcuts = publicationsstats.nofshortcuts + 1
+ dataset.shortcuts[key] = value
+ end
+
+ -- todo: categories : metatable that lowers and also counts
+ -- todo: fields : metatable that lowers
+
+ local tags = table.setmetatableindex("table")
+
+ local function do_definition(category,tag,tab,dataset)
+ publicationsstats.nofdefinitions = publicationsstats.nofdefinitions + 1
+ if tag == "" then
+ tag = "no-tag-set"
+ end
+ local fields = dataset.fields
+ local luadata = dataset.luadata
+ local hashtag = tag
+ if luadata[tag] then
+ local t = tags[tag]
+ local d = dataset.name
+ local n = (t[d] or 0) + 1
+ t[d] = n
+ hashtag = tag .. "-" .. n
+ if trace_duplicates then
+ local p = { }
+ for k, v in sortedhash(t) do
+ p[#p+1] = formatters["%s:%s"](k,v)
+ end
+ report_duplicates("tag %a is present multiple times: % t, assigning hashtag %a",tag,p,hashtag)
+ end
+ end
+ local index = getindex(dataset,luadata,hashtag)
+ local entries = {
+ category = lower(category),
+ tag = tag,
+ index = index,
+ }
+ for i=1,#tab,2 do
+ local original = tab[i]
+ local normalized = fields[original]
+ if not normalized then
+ normalized = lower(original) -- we assume ascii fields
+ fields[original] = normalized
+ end
+ -- if entries[normalized] then
+ if rawget(entries,normalized) then
+ if trace_duplicates then
+ report_duplicates("redundant field %a is ignored for tag %a in dataset %a",normalized,tag,dataset.name)
+ end
else
- -- warning
+ local value = tab[i+1]
+ value = textoutf(value)
+ if lpegmatch(filter_1,value) then
+ value = lpegmatch(filter_2,value,1,dataset.commands) -- we need to start at 1 for { }
+ end
+ if normalized == "crossref" then
+ local parent = luadata[value]
+ if parent then
+ setmetatableindex(entries,parent)
+ else
+ -- warning
+ end
+ end
+ entries[normalized] = value
end
end
- entries[normalized] = value
+ luadata[hashtag] = entries
end
- luadata[tag] = entries
-end
-local function resolve(s,dataset)
- return dataset.shortcuts[s] or defaultshortcuts[s] or s -- can be number
-end
+ local function resolve(s,dataset)
+ return dataset.shortcuts[s] or defaultshortcuts[s] or s -- can be number
+ end
-local percent = P("%")
-local start = P("@")
-local comma = P(",")
-local hash = P("#")
-local escape = P("\\")
-local single = P("'")
-local double = P('"')
-local left = P('{')
-local right = P('}')
-local both = left + right
-local lineending = S("\n\r")
-local space = S(" \t\n\r\f") -- / " "
-local spacing = space^0
-local equal = P("=")
------ collapsed = (space^1)/ " "
-local collapsed = (lpegpatterns.whitespace^1)/ " "
-
------ balanced = lpegpatterns.balanced
-local balanced = P {
- [1] = ((escape * (left+right)) + (collapsed + 1 - (left+right)) + V(2))^0,
- [2] = left * V(1) * right
-}
+ local pattern = p_whitespace^0
+ * C(P("message") + P("warning") + P("error") + P("comment")) * p_whitespace^0 * P(":")
+ * p_whitespace^0
+ * C(P(1)^1)
-local keyword = C((R("az","AZ","09") + S("@_:-"))^1)
-local key = C((1-space-equal)^1)
-local tag = C((1-space-comma)^1)
-local reference = keyword
-local category = P("@") * C((1-space-left)^1)
-local s_quoted = ((escape*single) + collapsed + (1-single))^0
-local d_quoted = ((escape*double) + collapsed + (1-double))^0
-
-local b_value = (left /"") * balanced * (right /"")
-local s_value = (single/"") * (b_value + s_quoted) * (single/"")
-local d_value = (double/"") * (b_value + d_quoted) * (double/"")
-local r_value = reference * Carg(1) /resolve
-
-local somevalue = s_value + d_value + b_value + r_value
-local value = Cs((somevalue * ((spacing * hash * spacing)/"" * somevalue)^0))
-
-local assignment = spacing * key * spacing * equal * spacing * value * spacing
-local shortcut = P("@") * (P("string") + P("STRING")) * spacing * left * ((assignment * Carg(1))/do_shortcut * comma^0)^0 * spacing * right
-local definition = category * spacing * left * spacing * tag * spacing * comma * Ct((assignment * comma^0)^0) * spacing * right * Carg(1) / do_definition
-local comment = keyword * spacing * left * (1-right)^0 * spacing * right
-local forget = percent^1 * (1-lineending)^0
-
--- todo \%
-
-local bibtotable = (space + forget + shortcut + definition + comment + 1)^0
-
--- loadbibdata -> dataset.luadata
--- loadtexdata -> dataset.luadata
--- loadluadata -> dataset.luadata
-
--- converttoxml -> dataset.xmldata from dataset.luadata
-
-function publications.loadbibdata(dataset,content,source,kind)
- dataset = datasets[dataset]
- statistics.starttiming(publications)
- publicationsstats.nofbytes = publicationsstats.nofbytes + #content
- dataset.nofbytes = dataset.nofbytes + #content
- if source then
- table.insert(dataset.sources, { filename = source, checksum = md5.HEX(content) })
- dataset.loaded[source] = kind or true
- end
- dataset.newtags = #dataset.luadata > 0 and { } or dataset.newtags
- publications.markasupdated(dataset)
- lpegmatch(bibtotable,content or "",1,dataset)
- statistics.stoptiming(publications)
-end
+ local function do_comment(s,dataset)
+ local how, what = lpegmatch(pattern,s)
+ if how and what then
+ local t = string.splitlines(utilities.strings.striplines(what))
+ local b = file.basename(dataset.fullname or dataset.name or "unset")
+ for i=1,#t do
+ report("%s > %s : %s",b,how,t[i])
+ end
+ end
+ end
+
+ local percent = P("%")
+ local start = P("@")
+ local comma = P(",")
+ local hash = P("#")
+ local escape = P("\\")
+ local single = P("'")
+ local double = P('"')
+ local left = P('{')
+ local right = P('}')
+ local both = left + right
+ local lineending = S("\n\r")
+ local space = S(" \t\n\r\f") -- / " "
+ local spacing = space^0
+ local equal = P("=")
+ ----- collapsed = (space^1)/ " "
+ local collapsed = p_whitespace^1/" "
+ local nospaces = p_whitespace^1/""
+
+ local p_left = (p_whitespace^0 * left) / ""
+ local p_right = (right * p_whitespace^0) / ""
+
+ local balanced = P {
+ [1] = ((escape * (left+right)) + (collapsed + 1 - (left+right))^1 + V(2))^0,
+ [2] = left * V(1) * right,
+ }
+
+ -- local unbalanced = P {
+ -- [1] = left * V(2) * right,
+ -- [2] = ((escape * (left+right)) + (collapsed + 1 - (left+right))^1 + V(1))^0,
+ -- }
+
+ local unbalanced = (left/"") * balanced * (right/"") * P(-1)
+
+ local keyword = C((R("az","AZ","09") + S("@_:-"))^1)
+ local key = C((1-space-equal)^1)
+ local tag = C((1-space-comma)^0)
+ local reference = keyword
+ local category = C((1-space-left)^1)
+ local s_quoted = ((escape*single) + collapsed + (1-single))^0
+ local d_quoted = ((escape*double) + collapsed + (1-double))^0
+
+ local b_value = p_left * balanced * p_right
+ -- local u_value = p_left * unbalanced * p_right -- get rid of outer { }
+ -- local s_value = (single/"") * (u_value + s_quoted) * (single/"")
+ -- local d_value = (double/"") * (u_value + d_quoted) * (double/"")
+ local s_value = (single/"") * (unbalanced + s_quoted) * (single/"")
+ local d_value = (double/"") * (unbalanced + d_quoted) * (double/"")
+ local r_value = reference * Carg(1) /resolve
+
+ local somevalue = d_value + b_value + s_value + r_value
+ local value = Cs((somevalue * ((spacing * hash * spacing)/"" * somevalue)^0))
+
+ value = value / function(s) return lpegmatch(lpegpatterns.stripper,s) end
+
+ local forget = percent^1 * (1-lineending)^0
+ local spacing = spacing * forget^0 * spacing
+ local assignment = spacing * key * spacing * equal * spacing * value * spacing
+ local definition = category * spacing * left * spacing * tag * spacing * comma * Ct((assignment * comma^0)^0) * spacing * right * Carg(1) / do_definition
+
+ local crapword = C((1-space-left)^1)
+ local shortcut = Cmt(crapword,function(_,p,s) return lower(s) == "string" and p end) * spacing * left * ((assignment * Carg(1))/do_shortcut * comma^0)^0 * spacing * right
+ local comment = Cmt(crapword,function(_,p,s) return lower(s) == "comment" and p end) * spacing * lpegpatterns.argument * Carg(1) / do_comment
+
+ local casecrap = #S("sScC") * (shortcut + comment)
+
+ local bibtotable = (space + forget + P("@") * (casecrap + definition) + 1)^0
--- we could use xmlescape again
+ -- todo \%
-local cleaner_0 = S('<>&')
-local cleaner_1 = (1-cleaner_0)^0 * cleaner_0
-local cleaner_2 = Cs ( (
- P("<") / "&lt;" +
- P(">") / "&gt;" +
- P("&") / "&amp;" +
- P(1)
-)^0)
+ -- loadbibdata -> dataset.luadata
+ -- loadtexdata -> dataset.luadata
+ -- loadluadata -> dataset.luadata
-local compact = false -- can be a directive but then we also need to deal with newlines ... not now
+ -- converttoxml -> dataset.xmldata from dataset.luadata
-function publications.converttoxml(dataset,nice) -- we have fields !
- dataset = datasets[dataset]
- local luadata = dataset and dataset.luadata
- if luadata then
+ function publications.loadbibdata(dataset,content,source,kind)
+ if not source then
+ report("invalid source for dataset %a",dataset)
+ return
+ end
+ local current = datasets[dataset]
+ local size = #content
+ if size == 0 then
+ report("empty source %a for dataset %a",source,current.name)
+ else
+ report("adding bib data to set %a from source %a",current.name,source)
+ end
statistics.starttiming(publications)
- statistics.starttiming(xml)
- --
- local result, r = { }, 0
- --
- r = r + 1 ; result[r] = "<?xml version='1.0' standalone='yes'?>"
- r = r + 1 ; result[r] = "<bibtex>"
- --
- if nice then
- local f_entry_start = formatters[" <entry tag='%s' category='%s' index='%s'>"]
- local f_entry_stop = " </entry>"
- local f_field = formatters[" <field name='%s'>%s</field>"]
- for tag, entry in sortedhash(luadata) do
- r = r + 1 ; result[r] = f_entry_start(tag,entry.category,entry.index)
- for key, value in sortedhash(entry) do
- if key ~= "tag" and key ~= "category" and key ~= "index" then
- if lpegmatch(cleaner_1,value) then
- value = lpegmatch(cleaner_2,value)
+ publicationsstats.nofbytes = publicationsstats.nofbytes + size
+ current.nofbytes = current.nofbytes + size
+ if source then
+ table.insert(current.sources, { filename = source, checksum = md5.HEX(content) })
+ current.loaded[source] = kind or true
+ end
+ current.newtags = #current.luadata > 0 and { } or current.newtags
+ lpegmatch(bibtotable,content or "",1,current)
+ statistics.stoptiming(publications)
+ end
+
+end
+
+do
+
+ -- we could use xmlescape again
+
+ local cleaner_0 = S('<>&')
+ local cleaner_1 = (1-cleaner_0)^0 * cleaner_0
+ local cleaner_2 = Cs ( (
+ P("<") / "&lt;" +
+ P(">") / "&gt;" +
+ P("&") / "&amp;" +
+ P(1)
+ )^0)
+
+ local compact = false -- can be a directive but then we also need to deal with newlines ... not now
+
+ function publications.converttoxml(dataset,nice,dontstore,usedonly,subset) -- we have fields !
+ local current = datasets[dataset]
+ local luadata = subset or (current and current.luadata)
+ if luadata then
+ statistics.starttiming(publications)
+ --
+ local result, r, n = { }, 0, 0
+ local usedonly = usedonly and publications.usedentries()
+ --
+ r = r + 1 ; result[r] = "<?xml version='1.0' standalone='yes'?>"
+ r = r + 1 ; result[r] = "<bibtex>"
+ --
+ if nice then
+ local f_entry_start = formatters[" <entry tag='%s' category='%s' index='%s'>"]
+ local s_entry_stop = " </entry>"
+ local f_field = formatters[" <field name='%s'>%s</field>"]
+ for tag, entry in sortedhash(luadata) do
+ if not usedonly or usedonly[tag] then
+ r = r + 1 ; result[r] = f_entry_start(tag,entry.category,entry.index)
+ for key, value in sortedhash(entry) do
+ if key ~= "tag" and key ~= "category" and key ~= "index" then
+ if lpegmatch(cleaner_1,value) then
+ value = lpegmatch(cleaner_2,value)
+ end
+ if value ~= "" then
+ r = r + 1 ; result[r] = f_field(key,value)
+ end
+ end
end
- if value ~= "" then
- r = r + 1 ; result[r] = f_field(key,value)
+ r = r + 1 ; result[r] = s_entry_stop
+ n = n + 1
+ end
+ end
+ else
+ local f_entry_start = formatters["<entry tag='%s' category='%s' index='%s'>"]
+ local s_entry_stop = "</entry>"
+ local f_field = formatters["<field name='%s'>%s</field>"]
+ for tag, entry in next, luadata do
+ if not usedonly or usedonly[tag] then
+ r = r + 1 ; result[r] = f_entry_start(entry.tag,entry.category,entry.index)
+ for key, value in next, entry do
+ if key ~= "tag" and key ~= "category" and key ~= "index" then
+ if lpegmatch(cleaner_1,value) then
+ value = lpegmatch(cleaner_2,value)
+ end
+ if value ~= "" then
+ r = r + 1 ; result[r] = f_field(key,value)
+ end
+ end
end
+ r = r + 1 ; result[r] = s_entry_stop
+ n = n + 1
end
end
- r = r + 1 ; result[r] = f_entry_stop
end
+ --
+ r = r + 1 ; result[r] = "</bibtex>"
+ --
+ result = concat(result,nice and "\n" or nil)
+ --
+ if dontstore then
+ -- indeed
+ else
+ statistics.starttiming(xml)
+ current.xmldata = xmlconvert(result, {
+ resolve_entities = true,
+ resolve_predefined_entities = true, -- in case we have escaped entities
+ -- unify_predefined_entities = true, -- &#038; -> &amp;
+ utfize_entities = true,
+ } )
+ statistics.stoptiming(xml)
+ if lxml then
+ lxml.register(formatters["btx:%s"](current.name),current.xmldata)
+ end
+ end
+ statistics.stoptiming(publications)
+ return result, n
+ end
+ end
+
+end
+
+do
+
+ local function resolvedname(dataset,filename)
+ local current = datasets[dataset]
+ if type(filename) ~= "string" then
+ report("invalid filename %a",tostring(filename))
+ end
+ local fullname = resolvers.findfile(filename,"bib")
+ if fullname == "" then
+ fullname = resolvers.findfile(filename) -- let's not be too picky
+ end
+ if not fullname or fullname == "" then
+ report("no file %a",filename)
+ current.fullname = filename
+ return current, false
else
- local f_entry_start = formatters["<entry tag='%s' category='%s' index='%s'>"]
- local f_entry_stop = "</entry>"
- local f_field = formatters["<field name='%s'>%s</field>"]
- for tag, entry in next, luadata do
- r = r + 1 ; result[r] = f_entry_start(entry.tag,entry.category,entry.index)
- for key, value in next, entry do
- if key ~= "tag" and key ~= "category" and key ~= "index" then
- if lpegmatch(cleaner_1,value) then
- value = lpegmatch(cleaner_2,value)
- end
- if value ~= "" then
- r = r + 1 ; result[r] = f_field(key,value)
- end
- end
+ current.fullname = fullname
+ return current, fullname
+ end
+ end
+
+ publications.resolvedname = resolvedname
+
+ local cleaner = false
+ local cleaned = false
+
+ function loaders.registercleaner(what,fullname)
+ if not fullname or fullname == "" then
+ report("no %s file %a",what,fullname)
+ return
+ end
+ local list = table.load(fullname)
+ if not list then
+ report("invalid %s file %a",what,fullname)
+ return
+ end
+ list = list.replacements
+ if not list then
+ report("no replacement table in %a",fullname)
+ return
+ end
+ if cleaned then
+ report("adding replacements from %a",fullname)
+ for k, v in next, list do
+ cleaned[k] = v
+ end
+ else
+ report("using replacements from %a",fullname)
+ cleaned = list
+ end
+ cleaner = true
+ end
+
+ function loaders.bib(dataset,filename,kind)
+ local dataset, fullname = resolvedname(dataset,filename)
+ if not fullname then
+ return
+ end
+ local data = io.loaddata(filename) or ""
+ if data == "" then
+ report("empty file %a, nothing loaded",fullname)
+ return
+ end
+ if cleaner == true then
+ cleaner = Cs((lpeg.utfchartabletopattern(keys(cleaned)) / cleaned + p_utf8character)^1)
+ end
+ if cleaner ~= false then
+ data = lpegmatch(cleaner,data)
+ end
+ if trace then
+ report("loading file %a",fullname)
+ end
+ publications.loadbibdata(dataset,data,fullname,kind)
+ end
+
+ function loaders.lua(dataset,filename) -- if filename is a table we load that one
+ local current, data, fullname
+ if type(filename) == "table" then
+ current = datasets[dataset]
+ data = filename
+ else
+ dataset, fullname = resolvedname(dataset,filename)
+ if not fullname then
+ return
+ end
+ current = datasets[dataset]
+ data = table.load(filename)
+ end
+ if data then
+ local luadata = current.luadata
+ for tag, entry in next, data do
+ if type(entry) == "table" then
+ entry.index = getindex(current,luadata,tag)
+ entry.tag = tag
+ luadata[tag] = entry -- no cleaning yet
end
- r = r + 1 ; result[r] = f_entry_stop
end
end
- --
- r = r + 1 ; result[r] = "</bibtex>"
- --
- result = concat(result,nice and "\n" or nil)
- --
- dataset.xmldata = xmlconvert(result, {
- resolve_entities = true,
- resolve_predefined_entities = true, -- in case we have escaped entities
- -- unify_predefined_entities = true, -- &#038; -> &amp;
- utfize_entities = true,
- } )
- --
- statistics.stoptiming(xml)
- statistics.stoptiming(publications)
- if lxml then
- lxml.register(formatters["btx:%s"](dataset.name),dataset.xmldata)
+ end
+
+ function loaders.buffer(dataset,name) -- if filename is a table we load that one
+ local current = datasets[dataset]
+ local barename = file.removesuffix(name)
+ local data = buffers.getcontent(barename) or ""
+ if data == "" then
+ report("empty buffer %a, nothing loaded",barename)
+ return
+ end
+ if trace then
+ report("loading buffer",barename)
+ end
+ publications.loadbibdata(current,data,barename,"bib")
+ end
+
+ function loaders.xml(dataset,filename)
+ local dataset, fullname = resolvedname(dataset,filename)
+ if not fullname then
+ return
+ end
+ local current = datasets[dataset]
+ local luadata = current.luadata
+ local root = xml.load(filename)
+ for bibentry in xmlcollected(root,"/bibtex/entry") do
+ local attributes = bibentry.at
+ local tag = attributes.tag
+ local entry = {
+ category = attributes.category,
+ tag = tag, -- afterwards also set, to prevent overload
+ index = 0, -- prelocated
+ }
+ for field in xmlcollected(bibentry,"/field") do
+ entry[field.at.name] = field.dt[1] -- no cleaning yet | xmltext(field)
+ end
+ entry.index = getindex(current,luadata,tag)
+ entry.tag = tag
+ luadata[tag] = entry
end
end
-end
-local loaders = publications.loaders or { }
-publications.loaders = loaders
+ setmetatableindex(loaders,function(t,filetype)
+ local v = function(dataset,filename)
+ report("no loader for file %a with filetype %a",filename,filetype)
+ end
+ t[filetype] = v
+ return v
+ end)
-function loaders.bib(dataset,filename,kind)
- dataset = datasets[dataset]
- local data = io.loaddata(filename) or ""
- if data == "" then
- report("empty file %a, nothing loaded",filename)
- elseif trace then
- report("loading file",filename)
+ function publications.load(specification)
+ local current = datasets[specification.dataset or v_default]
+ local files = settings_to_array(specification.filename)
+ local kind = specification.kind
+ local dataspec = specification.specification
+ statistics.starttiming(publications)
+ for i=1,#files do
+ local filetype, filename = string.splitup(files[i],"::")
+ if not filename then
+ filename = filetype
+ filetype = file.suffix(filename)
+ end
+ if filename then
+ if not filetype or filetype == "" then
+ filetype = "bib"
+ end
+ if file.suffix(filename) == "" then
+ file.addsuffix(filename,filetype)
+ end
+ loaders[filetype](current,filename)
+ if kind then
+ current.loaded[current.fullname or filename] = kind
+ end
+ if dataspec then
+ current.specifications[dataspec] = true
+ end
+ end
+ end
+ local runner = enhancer.runner
+ if runner then
+ runner(current)
+ end
+ statistics.stoptiming(publications)
+ return current
end
- publications.loadbibdata(dataset,data,filename,kind)
+
end
-function loaders.lua(dataset,filename) -- if filename is a table we load that one
- dataset = datasets[dataset]
- inspect(filename)
- local data = type(filename) == "table" and filename or table.load(filename)
- if data then
+do
+
+ function enhancers.order(dataset)
+ local luadata = dataset.luadata
+ local ordered = sortedkeys(luadata)
+ local total = #ordered
+ for i=1,total do
+ ordered[i] = luadata[ordered[i]]
+ end
+ dataset.ordered = ordered
+ end
+
+ function enhancers.details(dataset)
local luadata = dataset.luadata
- for tag, entry in next, data do
- if type(entry) == "table" then
- entry.index = getindex(dataset,luadata,tag)
- luadata[tag] = entry -- no cleaning yet
+ local details = dataset.details
+ for tag, entry in next, luadata do
+ if not details[tag] then
+ details[tag] = { }
end
end
end
+
+ utilities.sequencers.appendaction(enhancer,"system","publications.enhancers.order")
+ utilities.sequencers.appendaction(enhancer,"system","publications.enhancers.details")
+
end
-function loaders.xml(dataset,filename)
- dataset = datasets[dataset]
- local luadata = dataset.luadata
- local root = xml.load(filename)
- for bibentry in xmlcollected(root,"/bibtex/entry") do
- local attributes = bibentry.at
- local tag = attributes.tag
- local entry = {
- category = attributes.category
+do
+
+ local checked = function(s,d) d[s] = (d[s] or 0) + 1 end
+ local checktex = ( (1-P("\\"))^1 + P("\\") * ((C(R("az","AZ")^1) * Carg(1))/checked))^0
+
+ function publications.analyze(dataset)
+ local current = datasets[dataset]
+ local data = current.luadata
+ local categories = { }
+ local fields = { }
+ local commands = { }
+ for k, v in next, data do
+ categories[v.category] = (categories[v.category] or 0) + 1
+ for k, v in next, v do
+ fields[k] = (fields[k] or 0) + 1
+ lpegmatch(checktex,v,1,commands)
+ end
+ end
+ current.analysis = {
+ categories = categories,
+ fields = fields,
+ commands = commands,
}
- for field in xmlcollected(bibentry,"/field") do
- -- entry[field.at.name] = xmltext(field)
- entry[field.at.name] = field.dt[1] -- no cleaning yet
- end
- -- local edt = entry.dt
- -- for i=1,#edt do
- -- local e = edt[i]
- -- local a = e.at
- -- if a and a.name then
- -- t[a.name] = e.dt[1] -- no cleaning yet
- -- end
- -- end
- entry.index = getindex(dataset,luadata,tag)
- luadata[tag] = entry
end
+
end
-setmetatableindex(loaders,function(t,filetype)
- local v = function(dataset,filename)
- report("no loader for file %a with filetype %a",filename,filetype)
+function publications.tags(dataset)
+ return sortedkeys(datasets[dataset].luadata)
+end
+
+function publications.sortedentries(dataset)
+ return sortedhash(datasets[dataset].luadata)
+end
+
+-- a helper:
+
+function publications.concatstate(i,n)
+ if i == 0 then
+ return 0
+ elseif i == 1 then
+ return 1
+ elseif i == 2 and n == 2 then
+ return 4
+ elseif i == n then
+ return 3
+ else
+ return 2
end
- t[k] = v
- return v
-end)
+end
+
+-- savers
+
+do
+
+ local savers = { }
+
+ local s_preamble = [[
+% this is an export from context mkiv
-function publications.load(dataset,filename,kind)
- dataset = datasets[dataset]
- statistics.starttiming(publications)
- local files = settings_to_array(filename)
- for i=1,#files do
- local filetype, filename = string.splitup(files[i],"::")
- if not filename then
- filename = filetype
+@preamble{
+ \ifdefined\btxcmd
+ % we're probably in context
+ \else
+ \def\btxcmd#1{\csname#1\endcsname}
+ \fi
+}
+
+]]
+
+ function savers.bib(dataset,filename,tobesaved)
+ local f_start = formatters["@%s{%s,\n"]
+ local f_field = formatters[" %s = {%s},\n"]
+ local s_stop = "}\n\n"
+ local result = { s_preamble }
+ local n, r = 0, 1
+ for tag, data in sortedhash(tobesaved) do
+ r = r + 1 ; result[r] = f_start(data.category or "article",tag)
+ for key, value in sortedhash(data) do
+ if not privates[key] then
+ r = r + 1 ; result[r] = f_field(key,value)
+ end
+ end
+ r = r + 1 ; result[r] = s_stop
+ n = n + 1
+ end
+ report("%s entries from dataset %a saved in %a",n,dataset,filename)
+ io.savedata(filename,concat(result))
+ end
+
+ function savers.lua(dataset,filename,tobesaved)
+ local list = { }
+ local n = 0
+ for tag, data in next, tobesaved do
+ local t = { }
+ for key, value in next, data do
+ if not privates[key] then
+ d[key] = value
+ end
+ end
+ list[tag] = t
+ n = n + 1
+ end
+ report("%s entries from dataset %a saved in %a",n,dataset,filename)
+ table.save(filename,list)
+ end
+
+ function savers.xml(dataset,filename,tobesaved)
+ local result, n = publications.converttoxml(dataset,true,true,false,tobesaved)
+ report("%s entries from dataset %a saved in %a",n,dataset,filename)
+ io.savedata(filename,result)
+ end
+
+ function publications.save(specification)
+ local dataset = specification.dataset
+ local filename = specification.filename
+ local filetype = specification.filetype
+ local criterium = specification.criterium
+ statistics.starttiming(publications)
+ if not filename or filename == "" then
+ report("no filename for saving given")
+ return
+ end
+ if not filetype or filetype == "" then
filetype = file.suffix(filename)
end
- local fullname = resolvers.findfile(filename,"bib")
- if dataset.loaded[fullname] then -- will become better
- -- skip
- elseif fullname == "" then
- report("no file %a",filename)
- else
- loaders[filetype](dataset,fullname)
+ if not criterium or criterium == "" then
+ criterium = v_all
end
- if kind then
- dataset.loaded[fullname] = kind
+ local saver = savers[filetype]
+ if saver then
+ local current = datasets[dataset]
+ local luadata = current.luadata or { }
+ local tobesaved = { }
+ local result = structures.lists.filter({criterium = criterium, names = "btx"}) or { }
+ for i=1,#result do
+ local userdata = result[i].userdata
+ if userdata then
+ local set = userdata.btxset or v_default
+ if set == dataset then
+ local tag = userdata.btxref
+ if tag then
+ tobesaved[tag] = luadata[tag]
+ end
+ end
+ end
+ end
+ saver(dataset,filename,tobesaved)
+ else
+ report("unknown format %a for saving %a",filetype,dataset)
end
+ statistics.stoptiming(publications)
+ return dataset
end
- statistics.stoptiming(publications)
- return dataset
-end
-local checked = function(s,d) d[s] = (d[s] or 0) + 1 end
-local checktex = ( (1-P("\\"))^1 + P("\\") * ((C(R("az","AZ")^1) * Carg(1))/checked))^0
-
-function publications.analyze(dataset)
- dataset = datasets[dataset]
- local data = dataset.luadata
- local categories = { }
- local fields = { }
- local commands = { }
- for k, v in next, data do
- categories[v.category] = (categories[v.category] or 0) + 1
- for k, v in next, v do
- fields[k] = (fields[k] or 0) + 1
- lpegmatch(checktex,v,1,commands)
- end
- end
- dataset.analysis = {
- categories = categories,
- fields = fields,
- commands = commands,
+ implement {
+ name = "btxsavedataset",
+ actions = publications.save,
+ arguments = {
+ {
+ { "dataset" },
+ { "filename" },
+ { "filetype" },
+ { "criterium" },
+ }
+ }
}
+
end
--- str = [[
--- @COMMENT { CRAP }
--- @STRING{ hans = "h a n s" }
--- @STRING{ taco = "t a c o" }
--- @SOMETHING{ key1, abc = "t a c o" , def = "h a n s" }
--- @SOMETHING{ key2, abc = hans # taco }
--- @SOMETHING{ key3, abc = "hans" # taco }
--- @SOMETHING{ key4, abc = hans # "taco" }
--- @SOMETHING{ key5, abc = hans # taco # "hans" # "taco"}
--- @SOMETHING{ key6, abc = {oeps {oeps} oeps} }
--- ]]
-
--- local dataset = publications.new()
--- publications.tolua(dataset,str)
--- publications.toxml(dataset)
--- publications.toxml(dataset)
--- print(dataset.xmldata)
--- inspect(dataset.luadata)
--- inspect(dataset.xmldata)
--- inspect(dataset.shortcuts)
--- print(dataset.nofbytes,statistics.elapsedtime(publications))
-
--- local dataset = publications.new()
--- publications.load(dataset,"IEEEabrv.bib")
--- publications.load(dataset,"IEEEfull.bib")
--- publications.load(dataset,"IEEEexample.bib")
--- publications.toxml(dataset)
--- print(dataset.nofbytes,statistics.elapsedtime(publications))
-
--- local dataset = publications.new()
--- publications.load(dataset,"gut.bib")
--- publications.load(dataset,"komoedie.bib")
--- publications.load(dataset,"texbook1.bib")
--- publications.load(dataset,"texbook2.bib")
--- publications.load(dataset,"texbook3.bib")
--- publications.load(dataset,"texgraph.bib")
--- publications.load(dataset,"texjourn.bib")
--- publications.load(dataset,"texnique.bib")
--- publications.load(dataset,"tugboat.bib")
--- publications.toxml(dataset)
--- print(dataset.nofbytes,statistics.elapsedtime(publications))
-
--- print(table.serialize(dataset.luadata))
--- print(table.serialize(dataset.xmldata))
--- print(table.serialize(dataset.shortcuts))
--- print(xml.serialize(dataset.xmldata))
+-- casters
+
+do
+
+ publications.detailed = setmetatableindex(function(detailed,kind)
+ local values = setmetatableindex(function(values,value)
+ local caster = casters[kind]
+ local cast = caster and caster(value) or value
+ values[value] = cast
+ return cast
+ end)
+ detailed[kind] = values
+ return values
+ end)
+
+ local keywordsplitter = utilities.parsers.groupedsplitat(";,")
+
+ casters.keyword = function(str)
+ return lpegmatch(keywordsplitter,str)
+ end
+
+
+ writers.keyword = function(k)
+ if type(k) == "table" then
+ return concat(p,";")
+ else
+ return k
+ end
+ end
+
+ local pagessplitter = lpeg.splitat(P("-")^1)
+
+ casters.range = function(str)
+ local first, last = lpegmatch(pagessplitter,str)
+ return first and last and { first, last } or str
+ end
+
+ writers.range = function(p)
+ if type(p) == "table" then
+ return concat(p,"-")
+ else
+ return p
+ end
+ end
+
+ casters.pagenumber = casters.range
+ writers.pagenumber = writers.range
+
+end
diff --git a/Master/texmf-dist/tex/context/base/publ-fnd.lua b/Master/texmf-dist/tex/context/base/publ-fnd.lua
index 383bcac73ca..909b102dba2 100644
--- a/Master/texmf-dist/tex/context/base/publ-fnd.lua
+++ b/Master/texmf-dist/tex/context/base/publ-fnd.lua
@@ -6,167 +6,380 @@ if not modules then modules = { } end modules ['publ-fnd'] = {
license = "see context related readme files"
}
-local tonumber, next = tonumber, next
-local P, R, C, Cs, Cp, Carg = lpeg.P, lpeg.R, lpeg.C, lpeg.Cs, lpeg.Cp, lpeg.Carg
-local lpegmatch = lpeg.match
+if not characters then
+ dofile(resolvers.findfile("char-def.lua"))
+ dofile(resolvers.findfile("char-utf.lua"))
+end
+
+-- this tracker is only for real debugging and not for the average user
+
+local trace_match = false trackers.register("publications.match", function(v) trace_match = v end)
+
+local publications = publications
+
+local tonumber, next, type = tonumber, next, type
+local find = string.find
+local P, R, S, C, Cs, Cp, Cc, Carg, Ct, V = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpeg.Cp, lpeg.Cc, lpeg.Carg, lpeg.Ct, lpeg.V
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
local concat = table.concat
local formatters = string.formatters
local lowercase = characters.lower
+local topattern = string.topattern
+
+publications = publications or { } -- for testing
+
+local report = logs.reporter("publications","match")
local colon = P(":")
local dash = P("-")
local lparent = P("(")
local rparent = P(")")
-local space = lpeg.patterns.whitespace
+local space = lpegpatterns.whitespace
+local utf8char = lpegpatterns.utf8character
local valid = 1 - colon - space - lparent - rparent
----- key = C(valid^1)
local key = C(R("az","AZ")^1)
-local word = Cs(lpeg.patterns.unquoted + valid^1)
+local wildcard = C("*")
+local word = Cs(lpegpatterns.unquoted + lpegpatterns.argument + valid^1)
+local simple = C(valid^1)
local number = C(valid^1)
------ f_string_key = formatters[" local s_%s = entry[%q]"]
-local f_string_key = formatters[" local s_%s = entry[%q] if s_%s then s_%s = lower(s_%s) end "]
-local f_number_key = formatters[" local n_%s = tonumber(entry[%q]) or 0"]
-local f_field_key = formatters[" local f_%s = entry[%q] or ''"]
+----- f_string_key = formatters[" local s_%s = entry[%q] if s_%s then s_%s = lower(s_%s) end "]
+----- f_number_key = formatters[" local n_%s = tonumber(entry[%q]) or 0"]
+----- f_field_key = formatters[" local f_%s = entry[%q] or ''"]
------ f_string_match = formatters["(s_%s and find(lower(s_%s),%q))"]
-local f_string_match = formatters["(s_%s and find(s_%s,%q))"]
-local f_number_match = formatters["(n_%s and n_%s >= %s and n_%s <= %s)"]
-local f_field_match = formatters["f_%s"]
+-- getfuzzy(entry,%q,categories)
-local match = key * (colon/"") * word * Carg(1) / function(key,_,word,keys)
- -- keys[key] = f_string_key(key,key)
- keys[key] = f_string_key(key,key,key,key,key)
- return f_string_match(key,key,lowercase(word))
-end
+-- local f_string_key = formatters[" local s_%s = get(entry,%q)\n if s_%s then s_%s = lower(s_%s) end"]
+-- local f_field_key = formatters[" local f_%s = get(entry,%q) or ''"]
+-- local f_field_key_c = formatters[" local c_%s = get(entry,%q,categories) or ''"]
+-- local f_number_key = formatters[" local n_%s = tonumber(get(entry,%q)) or 0"]
+--
+-- local f_string_match = formatters["(s_%s and find(s_%s,%q))"]
+-- local f_number_match = formatters["(n_%s and n_%s >= %s and n_%s <= %s)"]
+-- local f_field_match = formatters["f_%s"]
+-- local f_field_match_c = formatters["c_%s"]
+--
+-- local f_all_match = formatters["anywhere(entry,%q)"]
-local range = key * (colon/"") * number * (dash/"") * number * Carg(1) / function(key,_,first,_,last,keys)
- keys[key] = f_number_key(key,key)
- return f_number_match(key,key,tonumber(first) or 0,key,tonumber(last) or 0)
-end
+-- topattern(lowercase(word)) : utflowercase + only *?
-local field = (P("field:")/"") * key * Carg(1) / function(_,key,keys)
- keys[key] = f_field_key(key,key)
- return f_field_match(key)
-end
+-- local match = ( (key + wildcard) * (colon/"") ) * word * Carg(1) / function(key,_,word,keys)
+-- if key == "*" or key == "any" then
+-- keys.anywhere = true
+-- if word == "" or word == "*" then
+-- return "true"
+-- else
+-- return f_all_match(topattern(lowercase(word)))
+-- end
+-- else
+-- keys[key] = f_string_key(key,key,key,key,key)
+-- return f_string_match(key,key,topattern(lowercase(word)))
+-- end
+-- end
+--
+-- local default = simple * Carg(1) / function(word,keys)
+-- keys.anywhere = true
+-- if word == "" or word == "*" then
+-- return "true"
+-- else
+-- return f_all_match(topattern(lowercase(word)))
+-- end
+-- end
+--
+-- local range = key * (colon/"") * number * (dash/"") * number * Carg(1) / function(key,_,first,_,last,keys)
+-- keys[key] = f_number_key(key,key)
+-- return f_number_match(key,key,tonumber(first) or 0,key,tonumber(last) or 0)
+-- end
+--
+-- local field = (P("field:")/"") * key * Carg(1) / function(_,key,keys)
+-- keys[key] = f_field_key(key,key)
+-- return f_field_match(key)
+-- end
+--
+-- local cast = (P("cast:")/"") * key * Carg(1) / function(_,key,keys)
+-- keys[key] = f_field_key_c(key,key)
+-- return f_field_match_c(key)
+-- end
+--
+-- local compare = C("==") + P("=")/"==" + P("!=")/"~=" + P("<>")/"~="
+--
+-- local b_match = lparent
+-- local e_match = rparent * space^0 * (#P(-1) + P(",")/" or ") -- maybe also + -> and
+-- local f_match = ((field + cast + range + match + space + compare + P(1))-e_match)^1
+-- local p_match = b_match * default * e_match
+-- + b_match * f_match * e_match
+--
+-- local pattern = Cs(Cc("(") * (P("match")/"" * space^0 * p_match)^1 * Cc(")"))
------ pattern = Cs((field + range + match + P(1))^1)
------ b_match = P("match")/"" * lparent
-local b_match = lparent
-local e_match = rparent * space^0 * P(-1)
-local pattern = Cs(b_match * ((field + range + match + space + P(1))-e_match)^1 * e_match)
+-- field contains fieldname:nonspaces|"whatever"|'whatever'|{whatever}
+-- field exact fieldname=nonspaces|"whatever"|'whatever'|{whatever}
+-- set contains [fieldname]:nonspaces|"whatever"|'whatever'|{whatever}
+-- set exact [fieldname]=nonspaces|"whatever"|'whatever'|{whatever}
+--
+-- with * : any sequence
+-- ? : one character
+--
+-- and match(),match() ... equivalent to () and ()
+--
+-- <123 444> : range
+--
+-- unquoted = field
+-- [..] = set
+--
+-- () and or not
+--
+-- spaces are mandate (at least for now)
--- -- -- -- -- -- -- -- -- -- -- -- --
--- -- -- -- -- -- -- -- -- -- -- -- --
+local key = C(R("az","AZ")^1)
+local contains = S(":~")
+local exact = P("=")
+local valid = (1 - space - lparent -rparent)^1
+local wildcard = P("*") / ".*"
+local single = P("?") / "."
+local dash = P("-") / "%."
+local percent = P("-") / "%%"
+local word = Cs(lpegpatterns.unquoted + lpegpatterns.argument + valid)
+local range = P("<") * space^0 * C((1-space)^1) * space^1 * C((1-space- P(">"))^1) * space^0 * P(">")
-local tolower = lpeg.patterns.tolower
-local lower = string.lower
+local f_key_fld = formatters[" local kf_%s = get(entry,%q) \n if kf_%s then kf_%s = lower(kf_%s) end"]
+local f_key_set = formatters[" local ks_%s = get(entry,%q,categories)\n if ks_%s then ks_%s = lower(ks_%s) end"]
+local f_number_fld = formatters[" local nf_%s = tonumber(get(entry,%q))"]
+local f_number_set = formatters[" local ns_%s = tonumber(get(entry,%q,categories))"]
-local allascii = R("\000\127")^1 * P(-1)
+local f_fld_exact = formatters["(kf_%s == %q)"]
+local f_set_exact = formatters["(ks_%s == %q)"]
+local f_fld_contains = formatters["(kf_%s and find(kf_%s,%q))"]
+local f_set_contains = formatters["(ks_%s and find(ks_%s,%q))"]
+local f_fld_between = formatters["(nf_%s and nf_%s >= %s and nf_%s <= %s)"]
+local f_set_between = formatters["(ns_%s and ns_%s >= %s and ns_%s <= %s)"]
-function characters.checkedlower(str)
- return lpegmatch(allascii,str) and lower(str) or lpegmatch(tolower,str) or str
+local f_all_match = formatters["anywhere(entry,%q)"]
+
+local function test_key_value(keys,where,key,first,last)
+ if not key or key == "" then
+ return "(false)"
+ elseif key == "*" then
+ last = "^.*" .. topattern(lowercase(last)) .. ".*$" -- todo: make an lpeg
+ return f_all_match(last)
+ elseif first == false then
+ -- exact
+ last = lowercase(last)
+ if where == "set" then
+ keys[key] = f_key_set(key,key,key,key,key)
+ return f_set_exact(key,last)
+ else
+ keys[key] = f_key_fld(key,key,key,key,key)
+ return f_fld_exact(key,last)
+ end
+ elseif first == true then
+ -- contains
+ last = "^.*" .. topattern(lowercase(last)) .. ".*$"
+ if where == "set" then
+ keys[key] = f_key_set(key,key,key,key,key)
+ return f_set_contains(key,key,last)
+ else
+ keys[key] = f_key_fld(key,key,key,key,key)
+ return f_fld_contains(key,key,last)
+ end
+ else
+ -- range
+ if where == "set" then
+ keys[key] = f_number_set(key,key)
+ return f_set_between(key,key,tonumber(first),key,tonumber(last))
+ else
+ keys[key] = f_number_fld(key,key)
+ return f_fld_between(key,key,tonumber(first),key,tonumber(last))
+ end
+ end
end
+local p_compare = P { "all",
+ all = (V("one") + V("operator") + V("nested") + C(" "))^1,
+ nested = C("(") * V("all") * C(")"), -- C really needed?
+ operator = C("and")
+ + C("or")
+ + C("not"),
+ one = Carg(1)
+ * V("where")
+ * V("key")
+ * (V("how") * V("word") + V("range"))
+ / test_key_value,
+ key = key
+ + C("*"),
+ where = C("set") * P(":")
+ + Cc(""),
+ how = contains * Cc(true)
+ + exact * Cc(false),
+ word = word,
+ range = range,
+}
+
+-- local p_combine = space^0 * (P(",")/" or ") * space^0
+
+-- local pattern = Cs((P("match")/"" * space^0 * p_compare + p_combine)^1)
+
+local comma = P(",")
+local p_spaces = space^0
+local p_combine = p_spaces * comma * p_spaces / " or "
+local p_expression = P("match")/"" * Cs(p_compare)
+ + Carg(1)
+ * Cc("")
+ * Cc("tag")
+ * Cc(false)
+ * (
+ P("tag") * p_spaces * P("(") * Cs((1-S(")")-space)^1) * p_spaces * P(")")
+ + p_spaces * Cs((1-space-comma)^1) * p_spaces
+ ) / test_key_value
+
+local pattern = Cs {
+ [1] = V(2) * (p_combine * V(2))^0,
+ [2] = p_expression,
+}
+
-- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- -- -- -- -- -- -- -- -- -- --
-local f_template = string.formatters[ [[
+function publications.anywhere(entry,str) -- helpers
+ for k, v in next, entry do
+ if find(lowercase(v),str) then
+ return true
+ end
+ end
+end
+
+-- todo: use an environment instead of
+
+-- table={
+-- { "match", "((kf_editor and find(kf_editor,\"^.*braslau.*$\")))" },
+-- { "hash", "foo1234" },
+-- { "tag", "bar5678" },
+-- }
+
+local f_template = formatters[ [[
local find = string.find
-local lower = characters.checkedlower
+local lower = characters.lower
+local anywhere = publications.anywhere
+local get = publications.getfuzzy
+local specification = publications.currentspecification
+local categories = specification and specification.categories
return function(entry)
%s
-return %s and true or false
+ return %s and true or false
end
]] ]
-local function compile(expr,start)
+local function compile(dataset,expr)
local keys = { }
- local expression = lpegmatch(pattern,expr,start,keys)
- -- print("!!!!",expression)
+ -- local expression = lpegmatch(pattern,expr,start,keys)
+ local expression = lpegmatch(pattern,expr,1,keys)
+ if trace_match then
+ report("compiling expression: %s",expr)
+ end
local definitions = { }
for k, v in next, keys do
definitions[#definitions+1] = v
end
+ if #definitions == 0 then
+ report("invalid expression: %s",expr)
+ elseif trace_match then
+ for i=1,#definitions do
+ report("% 3i : %s",i,definitions[i])
+ end
+ end
definitions = concat(definitions,"\n")
local code = f_template(definitions,expression)
- -- print(code)
- code = loadstring(code)
- if type(code) == "function" then
- code = code()
- if type(code) == "function" then
- return code
+ if trace_match then
+ report("generated code: %s",code)
+ end
+ local finder = loadstring(code) -- use an environment
+ if type(finder) == "function" then
+ finder = finder()
+ if type(finder) == "function" then
+ return finder, code
end
end
- print("no valid expression",expression)
+ report("invalid expression: %s",expr)
return false
end
-local cache = { } -- todo: make weak, or just remember the last one (trial typesetting)
+-- local function test(str)
+-- local keys = { }
+-- local definitions = { }
+-- local expression = lpegmatch(pattern,str,1,keys)
+-- for k, v in next, keys do
+-- definitions[#definitions+1] = v
+-- end
+-- definitions = concat(definitions,"\n")
+-- print(f_template(definitions,expression))
+-- end
-local check = P("match") * space^0 * Cp()
+-- test("match(foo:bar and (foo:bar or foo:bar))")
+-- test("match(foo=bar and (foo=bar or foo=bar))")
+-- test("match(set:foo:bar),match(set:foo:bar)")
+-- test("match(set:foo=bar)")
+-- test("match(foo:{bar bar})")
+-- test("match(foo={bar bar})")
+-- test("match(set:foo:'bar bar')")
+-- test("match(set:foo='bar bar')")
+-- test("match(set:foo<1000 2000>)")
+-- test("match(set:foo<1000 2000>)")
+-- test("match(*:foo)")
+-- test("match(*:*)")
-local function finder(expression)
- local found = cache[expression]
- if found == nil then
- local e = lpegmatch(check,expression)
- found = e and compile(expression,e) or false
- cache[expression] = found
+local trigger = (P("match") + P("tag")) * p_spaces * P("(")
+local check = (1-trigger)^0 * trigger
+
+local function finder(dataset,expression)
+ local found = lpegmatch(check,expression) and compile(dataset,expression) or false
+ if found then
+ local okay, message = pcall(found,{})
+ if not okay then
+ found = false
+ report("error in match: %s",message)
+ end
end
return found
end
+-- finder("match(author:foo)")
+-- finder("match(author:foo and author:bar)")
+-- finder("match(author:foo or (author:bar and page:123))")
+-- finder("match(author:foo),match(author:foo)")
+
publications.finder = finder
function publications.search(dataset,expression)
- local find = finder(expression)
- local source = dataset.luadata
+ local find = finder(dataset,expression)
if find then
- local target = { }
- for k, v in next, source do
- if find(v) then
- target[k] = v
+ local ordered = dataset.ordered
+ local target = { }
+ for i=1,#ordered do
+ local entry = ordered[i]
+ if find(entry) then
+ local tag = entry.tag
+ if not target[tag] then
+ -- we always take the first
+ target[tag] = entry
+ end
end
end
return target
else
- return { source[expression] }
+ return { } -- { dataset.luadata[expression] } -- ?
end
end
-
--- local dataset = publications.new()
--- publications.load(dataset,"t:/manuals/hybrid/tugboat.bib")
---
--- local n = 500
+-- local d = publications.datasets.default
--
--- local function test(dataset,str)
--- local found
--- local start = os.clock()
--- for i=1,n do
--- found = search(dataset,str)
--- end
--- local elapsed = os.clock() - start
--- print(elapsed,elapsed/500,#table.keys(dataset.luadata),str)
--- print(table.concat(table.sortedkeys(found)," "))
--- return found
--- end
+-- local d = publications.load {
+-- dataset = "default",
+-- filename = "t:/manuals/mkiv/hybrid/tugboat.bib"
+-- }
--
--- local found = test(dataset,[[match(author:hagen)]])
--- local found = test(dataset,[[match(author:hagen and author:hoekwater and year:1990-2010)]])
--- local found = test(dataset,[[match(author:"Bogusław Jackowski")]])
--- local found = test(dataset,[[match(author:"Bogusław Jackowski" and (tonumber(field:year) or 0) > 2000)]])
--- local found = test(dataset,[[Hagen:TB19-3-304]])
-
--- 1.328 0.002656 2710 author:hagen
--- Berdnikov:TB21-2-129 Guenther:TB5-1-24 Hagen:TB17-1-54 Hagen:TB19-3-304 Hagen:TB19-3-311 Hagen:TB19-3-317 Hagen:TB22-1-58 Hagen:TB22-3-118 Hagen:TB22-3-136 Hagen:TB22-3-160 Hagen:TB23-1-49 Hagen:TB25-1-108 Hagen:TB25-1-48 Hagen:TB26-2-152
-
--- 1.812 0.003624 2710 author:hagen and author:hoekwater and year:1990-2010
--- Berdnikov:TB21-2-129
-
--- 1.344 0.002688 2710 author:"Bogusław Jackowski"
--- Berdnikov:TB21-2-129 Jackowski:TB16-4-388 Jackowski:TB19-3-267 Jackowski:TB19-3-272 Jackowski:TB20-2-104 Jackowski:TB24-1-64 Jackowski:TB24-3-575 Nowacki:TB19-3-242 Rycko:TB14-3-171
-
--- 1.391 0.002782 2710 author:"Bogusław Jackowski" and (tonumber(field:year) or 0) > 2000
--- Jackowski:TB24-1-64 Jackowski:TB24-3-575
+-- inspect(publications.search(d,[[match(author:hagen)]]))
+-- inspect(publications.search(d,[[match(author:hagen and author:hoekwater and year:1990-2010)]]))
+-- inspect(publications.search(d,[[match(author:"Bogusław Jackowski")]]))
+-- inspect(publications.search(d,[[match(author:"Bogusław Jackowski" and (tonumber(field:year) or 0) > 2000)]]))
+-- inspect(publications.search(d,[[Hagen:TB19-3-304]]))
diff --git a/Master/texmf-dist/tex/context/base/publ-imp-apa.lua b/Master/texmf-dist/tex/context/base/publ-imp-apa.lua
new file mode 100644
index 00000000000..c5d2512fd50
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/publ-imp-apa.lua
@@ -0,0 +1,521 @@
+local specification = {
+ --
+ -- metadata
+ --
+ name = "apa",
+ version = "1.00",
+ comment = "APA specification",
+ author = "Alan Braslau and Hans Hagen",
+ copyright = "ConTeXt development team",
+ --
+ -- derived (combinations of) fields (all share the same default set)
+ --
+ virtual = {
+ "authoryear",
+ "authoryears",
+ "authornum",
+ "num",
+ "suffix",
+ },
+ --
+ -- special datatypes
+ --
+ types = {
+ --
+ -- list of fields that are interpreted as names: "NAME [and NAME]" where
+ -- NAME is one of the following:
+ --
+ -- First vons Last
+ -- vons Last, First
+ -- vons Last, Jrs, First
+ -- Vons, Last, Jrs, First
+ --
+ author = "author", -- interpreted as name(s)
+ editor = "author",
+ artist = "author",
+ composer = "author",
+ producer = "author",
+ director = "author",
+ doi = "url", -- an external link
+ url = "url",
+ page = "pagenumber", -- number or range: f--t
+ pages = "pagenumber",
+ volume = "range",
+ number = "range",
+ keywords = "keyword", -- comma|-|separated list
+ year = "number",
+ },
+ --
+ -- categories with their specific fields
+ --
+ categories = {
+ --
+ -- categories are added below
+ --
+ },
+}
+
+local generic = {
+ --
+ -- A set returns the first field (in order of position below) that is found
+ -- present in an entry. A set having the same name as a field conditionally
+ -- allows the substitution of an alternate field.
+ --
+ -- note that anything can get assigned a doi or be available online.
+ doi = { "doi", "url" },
+ editionset = { "edition", "volume", "number", "pages" },
+}
+
+-- Definition of recognized categories and the fields that they contain.
+-- Required fields should be present; optional fields may also be rendered;
+-- all other fields will be ignored.
+
+-- Sets contain either/or in order of precedence.
+--
+-- For a category *not* defined here yet present in the dataset, *all* fields
+-- are taken as optional. This allows for flexibility in the addition of new
+-- categories.
+
+local categories = specification.categories
+
+-- an article from a journal
+
+categories.article = {
+ sets = {
+ author = { "author", "editor", "title" },
+ doi = generic.doi,
+ },
+ required = {
+ "author"
+ },
+ optional = {
+ "year",
+ "subtitle", "type", "file",
+ "journal", "volume", "number", "pages",
+ "doi", "note",
+ },
+}
+
+-- an article from a magazine
+
+categories.magazine = {
+ sets = categories.article.sets,
+ required = {
+ "author",
+ "year",
+ "journal",
+ },
+ optional = {
+ "subtitle", "type", "file",
+ "number",
+ "month", "day",
+ "doi", "note",
+ },
+}
+
+categories.newspaper = categories.magazine
+
+-- (from jabref) to be identified and setup ...
+
+categories.periodical = {
+ sets = {
+ author = { "editor", "publisher" },
+ doi = generic.doi,
+ },
+ required = {
+ "title",
+ "year",
+ },
+ optional = {
+ "author",
+ "subtitle", "file",
+ "series", "volume", "number", "month",
+ "organization",
+ "doi", "note",
+ },
+}
+
+-- (from jabref) to be identified and setup ...
+
+categories.standard = {
+ sets = {
+ author = { "author", "institution", "organization" },
+ doi = generic.doi,
+ },
+ required = {
+ "author",
+ "year",
+ "title", "subtitle",
+ "doi", "note",
+ },
+ optional = {
+ },
+}
+
+-- a book with an explicit publisher.
+
+categories.book = {
+ sets = {
+ author = { "author", "editor", "publisher", "title" },
+ editionset = generic.editionset,
+ doi = generic.doi,
+ },
+ required = { "author" },
+ optional = {
+ "year", "month", "day",
+ "subtitle", "type", "file",
+ "editionset", "series",
+ "address",
+ "doi", "note",
+ },
+}
+
+-- a part of a book, which may be a chapter (or section or whatever) and/or a range of pages.
+
+categories.inbook = {
+ sets = {
+ author = { "author", "editor", "publisher", "title", },
+ editionset = generic.editionset,
+ doi = generic.doi,
+ },
+ required = {
+ "author",
+ "year" ,
+ },
+ optional = {
+ "subtitle", "type", "file",
+ "booktitle",
+ -- APA ignores this: "chapter",
+ "editionset", "series",
+ "month",
+ "address",
+ "doi", "note",
+ },
+}
+
+-- a book having its own title as part of a collection.
+-- (like inbook, but we here make booktitle required)
+
+categories.incollection = {
+ sets = {
+ author = { "author", "editor", "publisher", "title", },
+ editionset = generic.editionset,
+ doi = generic.doi,
+ },
+ required = {
+ "author",
+ "booktitle",
+ "year",
+ },
+ optional = {
+ "subtitle", "type", "file",
+ "editionset", "series",
+ -- APA ignores this: "chapter",
+ "month",
+ "address",
+ "doi", "note",
+ },
+}
+
+-- a work that is printed and bound, but without a named publisher or sponsoring institution.
+
+categories.booklet = {
+ sets = {
+ author = { "author", "title", },
+ publisher = { "howpublished" }, -- no "publisher"!
+ doi = generic.doi,
+ },
+ required = {
+ "author"
+ },
+ optional = {
+ "publisher",
+ "year", "month",
+ "subtitle", "type", "file",
+ "address",
+ "doi", "note",
+ },
+}
+
+-- the proceedings of a conference.
+
+categories.proceedings = {
+ sets = {
+ author = { "editor", "organization", "publisher", "title" }, -- no "author"!
+ publisher = { "publisher", "organization" },
+ editionset = generic.editionset,
+ doi = generic.doi,
+ },
+ required = {
+ "author",
+ "year"
+ },
+ optional = {
+ "publisher",
+ "subtitle", "file",
+ "editionset", "series",
+ "month",
+ "address",
+ "doi", "note",
+ },
+}
+
+-- an article in a conference proceedings.
+
+categories.inproceedings = {
+ sets = categories.incollection.sets,
+ required = categories.incollection.required,
+ optional = {
+ "subtitle", "type", "file",
+ "month",
+ "edition", "series",
+ "address", "organization",
+ "doi", "note",
+ },
+}
+
+categories.conference = categories.inproceedings
+
+-- a thesis (of course).
+
+categories.thesis = {
+ sets = {
+ doi = generic.doi,
+ },
+ required = {
+ "author",
+ "title",
+ "school",
+ "year",
+ "type"
+ },
+ optional = {
+ "subtitle", "file",
+ "month",
+ "address",
+ "doi", "note",
+ },
+}
+
+categories.mastersthesis = {
+ sets = categories.thesis.sets,
+ required = {
+ "author",
+ "title",
+ "school",
+ "year"
+ },
+ optional = {
+ "type",
+ "subtitle", "file",
+ "month",
+ "address",
+ "doi", "note",
+ },
+}
+categories.phdthesis = categories.mastersthesis
+
+-- a report published by a school or other institution, usually numbered within a series.
+
+categories.techreport = {
+ sets = {
+ author = { "author", "institution", "publisher", "title" },
+ publisher = { "publisher", "institution", },
+ editionset = { "type", "volume", "number", "pages" }, -- no "edition"!
+ doi = generic.doi,
+ },
+ required = {
+ "author",
+ "title",
+ "institution",
+ "year"
+ },
+ optional = {
+ "publisher",
+ "address",
+ "subtitle", "file",
+ "editionset",
+ "month",
+ "doi", "note",
+ },
+}
+
+-- technical documentation.
+
+categories.manual = {
+ sets = {
+ author = { "author", "organization", "publisher", "title" },
+ publisher = { "publisher", "organization", },
+ editionset = generic.editionset,
+ doi = generic.doi,
+ },
+ required = {
+ "title"
+ },
+ optional = {
+ "author", "publisher",
+ "address",
+ "subtitle", "file",
+ "editionset", "month", "year",
+ "doi", "note",
+-- "abstract",
+ },
+}
+
+-- a patent (of course).
+
+categories.patent = {
+ sets = {
+ author = { "author", "assignee", },
+ publisher = { "publisher", "assignee", },
+ year = { "year", "yearfiled", },
+ month = { "month", "monthfiled", },
+ day = { "day", "dayfiled", },
+ doi = generic.doi,
+ },
+ required = {
+ "nationality",
+ "number",
+ "year",
+ },
+ optional = {
+ "type",
+ --check this: "language",
+ "author", "publisher",
+ "title", "subtitle", "file",
+ "address",
+ "day", "month",
+ "doi", "note"
+ },
+}
+
+-- a document having an author and title, but not formally published.
+
+categories.unpublished = {
+ sets = {
+ doi = generic.doi,
+ },
+ required = {
+ "author",
+ "title",
+ "note"
+ },
+ optional = {
+ "subtitle", "file",
+ "year", "month",
+ "doi"
+ },
+}
+
+-- like misc below but includes organization.
+
+categories.electronic = {
+ sets = {
+ doi = generic.doi,
+ },
+ required = {
+ "title"
+ },
+ optional = {
+ "subtitle", "type", "file",
+ "year", "month",
+ "author",
+ "address",
+ "organization",
+ "howpublished",
+ "doi", "note"
+ },
+}
+
+-- not bibtex categories...
+
+categories.film = {
+ sets = {
+ doi = generic.doi,
+ },
+ required = {
+ "producer", "director",
+ "title", "year",
+ "address", "publisher", -- aka studio
+ },
+ optional = {
+ "type",
+ "note",
+ "doi",
+ },
+}
+
+categories.music = {
+ sets = {
+ doi = generic.doi,
+ author = { "composer", "artist", "title", "album" },
+ title = { "title", "album", },
+ },
+ required = {
+ "author",
+ "title",
+ "year",
+ "address", "publisher", -- aka label
+ },
+ optional = {
+ "type",
+ "note",
+ "doi",
+ },
+}
+
+-- use this type when nothing else fits.
+
+categories.misc = {
+ sets = {
+ doi = generic.doi,
+ },
+ required = {
+ -- nothing is really important here
+ },
+ optional = {
+ "author",
+ "title", "subtitle", "file",
+ "year", "month",
+ "howpublished",
+ "doi", "note",
+ },
+}
+
+-- other (whatever jabref does not know!)
+
+categories.other = {
+ sets = {
+ doi = generic.doi,
+ },
+ required = {
+ "author",
+ "title",
+ "year"
+ },
+ optional = {
+ "subtitle", "file",
+ "doi", "note",
+ },
+}
+
+-- if all else fails to match:
+
+categories.literal = {
+ sets = {
+ author = { "key" },
+ doi = generic.doi,
+ },
+ required = {
+ "author",
+ "text"
+ },
+ optional = {
+ "doi", "note"
+ },
+ virtual = false,
+}
+
+-- done
+
+return specification
diff --git a/Master/texmf-dist/tex/context/base/publ-imp-apa.mkiv b/Master/texmf-dist/tex/context/base/publ-imp-apa.mkiv
deleted file mode 100644
index 3f7b119af67..00000000000
--- a/Master/texmf-dist/tex/context/base/publ-imp-apa.mkiv
+++ /dev/null
@@ -1,547 +0,0 @@
-%D \module
-%D [ file=publ-imp-apa,
-%D version=2013.12.12, % based on bibl-apa.tex and later xml variant
-%D title=APA bibliography style,
-%D subtitle=Publications,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is therefore copyrighted
-%D by \PRAGMA. See mreadme.pdf for details.
-
-% common
-
-% \loadbtxdefinitionfile[def]
-
-\startsetups btx:apa:common:wherefrom
- \btxdoifelse {address} {
- \getvariable{btx:temp}{left}
- \btxdoifelse {country} {
- \btxdoifelse {\getvariable{btx:temp}{label}} {
- \btxflush{address}\btxcomma\btxflush{country}: \btxflush{\getvariable{btx:temp}{label}}
- } {
- \btxflush{address}\btxcomma\btxflush{country}
- }
- } {
- \btxdoifelse {\getvariable{btx:temp}{label}} {
- \btxflush{address}\btxcomma\btxflush{\getvariable{btx:temp}{label}}
- } {
- \btxflush{address}
- }
- }
- \getvariable{btx:temp}{right}
- } {
- \btxdoifelse {country} {
- \getvariable{btx:temp}{left}
- \btxdoifelse {\getvariable{btx:temp}{label}} {
- \btxflush{country}: \btxflush{\getvariable{btx:temp}{label}}
- } {
- \btxflush{country}
- }
- \getvariable{btx:temp}{right}
- } {
- \btxdoifelse {\getvariable{btx:temp}{label}} {
- \getvariable{btx:temp}{left}
- \btxflush{\getvariable{btx:temp}{label}}
- \getvariable{btx:temp}{right}
- } {
- \getvariable{btx:temp}{otherwise}
- }
- }
- }
-\stopsetups
-
-% \setvariables[btx:temp][label=,left=,right=,otherwise=]
-
-\startsetups btx:apa:common:publisher
- \begingroup
- \setvariables[btx:temp][label=publisher]\relax
- \btxsetup{btx:apa:common:wherefrom}
- \endgroup
-\stopsetups
-
-\startsetups btx:apa:common:organization
- \begingroup
- \setvariables[btx:temp][label=organization]\relax
- \btxsetup{btx:apa:common:wherefrom}
- \endgroup
-\stopsetups
-
-\startsetups btx:apa:common:school
- \begingroup
- \setvariables[btx:temp][label=school]\relax
- \btxsetup{btx:apa:common:wherefrom}
- \endgroup
-\stopsetups
-
-\startsetups btx:apa:common:institution
- \begingroup
- \setvariables[btx:temp][label=institution]\relax
- \btxsetup{btx:apa:common:wherefrom}
- \endgroup
-\stopsetups
-
-\startsetups btx:apa:common:school:subsentence
- \begingroup
- \setvariables[btx:temp][label=school,left=\btxcomma,right=\btxperiod,otherwise=\btxperiod]\relax
- \btxsetup{btx:apa:common:wherefrom}
- \endgroup
-\stopsetups
-
-\startsetups btx:apa:common:institution:subsentence
- \begingroup
- \setvariables[btx:temp][label=institution,left=\btxcomma,right=\btxperiod,otherwise=\btxperiod]\relax
- \btxsetup{btx:apa:common:wherefrom}
- \endgroup
-\stopsetups
-
-\startsetups btx:apa:common:publisher:sentence
- \begingroup
- \setvariables[btx:temp][label=publisher,left=\btxspace,right=\btxperiod]\relax
- \btxsetup{btx:apa:common:wherefrom}
- \endgroup
-\stopsetups
-
-\startsetups btx:apa:common:organization:sentence
- \begingroup
- \setvariables[btx:temp][label=organization,left=\btxspace,right=\btxperiod]\relax
- \btxsetup{btx:apa:common:wherefrom}
- \endgroup
-\stopsetups
-
-\startsetups btx:apa:common:title-and-series
- \btxdoif {title} {
- \btxflush{title}
- \btxdoif {series} {
- \btxlparent\btxflush{series}\btxrparent
- }
- \btxperiod
- }
-\stopsetups
-
-\startsetups btx:apa:common:title-it-and-series
- \btxdoif {title} {
- \bgroup\it\btxflush{title}\/\egroup
- \btxdoif {series} {
- \btxlparent\btxflush{series}\btxrparent
- }
- \btxperiod
- }
-\stopsetups
-
-\disablemode[btx:apa:edited-book]
-
-\startsetups btx:apa:common:author-and-year
- \btxdoif {author} {
- \btxflushauthor{author}
- }
- \btxdoif {year} {
- \btxlparent\btxflush{year}\btxrparent
- }
- \btxperiod
-\stopsetups
-
-\startsetups btx:apa:common:author-or-key-and-year
- \btxdoifelse {author} {
- \btxflushauthor{author}
- } {
- \btxdoif {key} {
- \btxlbracket\btxsetup{btx:format:key}\btxrbracket
- }
- }
- \btxdoif {year} {
- \btxlparent\btxflush{year}\btxrparent
- }
- \btxperiod
-\stopsetups
-
-\startsetups btx:apa:common:author-editors-crossref-year
- \btxdoif {author} {
- \btxflushauthor{author}
- } {
- \btxdoifelse {editor} {
- \enablemode[btx:apa:edited-book]
- \btxflushauthor{editor}
- \btxcomma\btxsingularplural{editor}{editor}{editors}
- } {
- % weird period
- \btxdoif {crossref} {
- \btxlbracket\btxsetup{btx:format:crossref}\btxrbracket\btxperiod
- }
- }
- }
- \btxdoif {year} {
- \btxlparent\btxflush{year}\btxrparent
- }
- \btxperiod
-\stopsetups
-
-\startsetups btx:apa:common:editor-or-key-and-year
- \btxdoifelse {editor} {
- \enablemode[btx:apa:edited-book]
- \btxflushauthor{editor}
- \btxcomma\btxsingularplural{editor}{editor}{editors}
- } {
- \btxdoif {key} {
- \btxlbracket\btxsetup{btx:format:key}\btxrbracket
- }
- }
- \btxspace
- \btxdoif {year} {
- \btxlparent\btxflush{year}\btxrparent
- }
- \btxperiod
-\stopsetups
-
-\startsetups btx:apa:common:note
- \btxdoif {note} {
- \btxspace\btxflush{note}\btxperiod
- }
-\stopsetups
-
-\startsetups btx:apa:common:comment
- \btxdoif {comment} {
- \btxspace\btxflush{comment}\btxperiod
- }
-\stopsetups
-
-\startsetups btx:apa:common:pages:p
- \btxdoif {pages} {
- \btxspace\btxflush{pages}\btxspace p\btxperiod
- }
-\stopsetups
-
-\startsetups btx:apa:common:pages:pp
- \btxdoif {pages} {
- \btxspace\btxflush{pages}\btxspace pp\btxperiod
- }
-\stopsetups
-
-\startsetups btx:apa:common:pages:pages
- \btxdoif {pages} {
- \btxcomma pages~\btxflush{pages}
- }
-\stopsetups
-
-\startsetups btx:apa:common:edition:sentense
- \btxdoif {edition} {
- \btxspace\btxflush{edition}\btxspace edition\btxperiod
- }
-\stopsetups
-
-% check when the next is used (no period)
-
-% \startsetups btx:apa:common:edition
-% \btxdoif {edition} {
-% \btxspace\btxflush{edition}\btxspace edition
-% }
-% \stopsetups
-
-% we can share more, todo
-
-% specific
-
-\startsetups btx:apa:article
- \btxsetup{btx:apa:common:author-or-key-and-year}
- \btxdoif {title} {
- \btxflush{title}\btxperiod
- }
- \btxdoifelse {journal} {
- \bgroup\it\btxflush{journal}\/\egroup
- } {
- \btxdoif {crossref} {
- In\btxspace\btxflush{crossref}
- }
- }
- \btxdoifelse {volume} {
- \btxcomma\bgroup\it\btxflush{volume}\/\egroup
- \btxdoif {issue} {
- \btxlparent\btxflush{issue}\btxrparent
- }
- \btxdoif {pages} {
- \btxcomma\btxflush{pages}
- }
- \btxperiod
- } {
- \btxsetup{btx:apa:common:pages:pp}
- }
- \btxsetup{btx:apa:common:note}
- \btxsetup{btx:apa:common:comment}
-\stopsetups
-
-\startsetups btx:apa:book
- \btxsetup{btx:apa:common:author-editors-crossref-year}
- \btxdoif {title} {
- \bgroup\it\btxflush{title}\/\egroup
- \doifmodeelse {btx:apa:edited-book} {
- \btxdoifelse {volume} {
- \btxspace Number\nonbreakablespace\btxflush{volume}
- \btxdoifelse {series} {
- \btxspace in\nonbreakablespace\btxflush{series}\btxperiod
- } {
- \btxdoifelse {crossref} {
- \btxspace in\btxlbracket\btxsetup{btx:format:crossref}\btxrbracket
- } {
- \btxperiod
- }
- }
- } {
- \btxdoif {series} {
- \btxspace\btxflush{series}
- }
- \btxperiod
- }
- } {
- \btxdoifelse {crossref} {
- \btxdoif {chapter} {
- \btxcomma\btxflush{chapter}
- }
- \btxsetup{btx:apa:common:pages:pages}
- \btxperiod
- \btxdoif {volume} {
- Volume\nonbreakablespace\btxflush{volume}\btxspace of\nonbreakablespace
- }
- } {
- \btxdoif {volume} {
- \btxcomma volume\nonbreakablespace\btxflush{volume}
- \btxdoif {series} {
- \btxspace of\nonbreakablespace\bgroup\it\btxflush{series}\/\egroup
- }
- \btxdoif {chapter} {
- \btxcomma\btxflush{chapter}
- }
- \btxsetup{btx:apa:common:pages:pages}
- }
- \btxperiod
- }
- }
- }
- \btxsetup{btx:apa:common:edition:sentence}
- \btxsetup{btx:apa:common:publisher:sentence}
- \btxsetup{btx:apa:common:pages:p}% twice?
- \btxsetup{btx:apa:common:note}
-\stopsetups
-
-\startsetups btx:apa:inbook
- \btxsetup{btx:apa:common:author-editors-crossref-year}
- \btxdoifelse {title} {
- \bgroup\it\btxflush{title}\/\egroup
- } {
- \doifmodeelse {btx:apa:edited-book} {
- \btxdoifelse {volume} {
- \btxspace number\nonbreakablespace\btxflush{volume}
- \btxdoifelse {series} {
- \btxspace in\nonbreakablespace\btxflush{series}\btxperiod
- } {
- \btxdoifelse {crossref} {
- \btxspace in\btxlbracket\btxsetup{btx:format:crossref}\btxrbracket
- } {
- \btxperiod
- }
- }
- } {
- \btxdoif {series} {
- \btxspace\btxflush{series}\btxperiod
- }
- }
- } {
- \btxdoifelse {crossref} {
- \btxdoif {chapter} {
- \btxcomma\btxflush{chapter}
- }
- \btxsetup{btx:apa:common:pages:pages}
- \btxdoif {volume} {
- Volume\nonbreakablespace\btxflush{volume}\btxspace of\nonbreakablespace
- }
- \btxdoif {crossref} {
- \btxlbracket\btxsetup{btx:format:crossref}\btxrbracket
- }
- } {
- \btxdoif {volume} {
- \btxcomma volume\nonbreakablespace\btxflush{volume}
- \btxdoif {series} {
- \btxspace of\nonbreakablespace\bgroup\it\btxflush{series}\/\egroup
- }
- \btxdoif {chapter} {
- \btxcomma\btxflush{chapter}
- }
- \btxsetup{btx:apa:common:pages:pages}
- \btxperiod
- }
- }
- }
- }
- \btxspace
- \btxsetup{btx:apa:common:edition:sentence}
- \btxsetup{btx:apa:common:publisher}
- \btxsetup{btx:apa:common:note}
-\stopsetups
-
-\startsetups btx:apa:booklet
- \btxsetup{btx:apa:common:author-or-key-and-year}
- \btxsetup{btx:apa:common:title-it-and-series}
- \btxsetup{btx:apa:common:edition:sentence}
- \btxsetup{btx:apa:common:publication:sentence}
- \btxsetup{btx:apa:common:pages:p}
- \btxsetup{btx:apa:common:note}
-\stopsetups
-
-\startsetups btx:apa:manual
- \btxsetup{btx:apa:common:author-or-key-and-year}
- \btxsetup{btx:apa:common:title-it-and-series}
- \btxsetup{btx:apa:common:edition:sentence}
- \btxsetup{btx:apa:common:organization:sentence}
- \btxsetup{btx:apa:common:pages:p}
- \btxsetup{btx:apa:common:note}
-\stopsetups
-
-\startsetups btx:apa:incollection
- \btxsetup{btx:apa:common:author-and-year}
- \btxdoif {arttitle} {
- \btxflush{arttitle}\btxperiod
- }
- In\btxspace
- \btxdoifelse {title} {
- \btxflushauthor{editor}\btxcomma
- \bgroup\it\btxflush{title}\/\egroup
- \btxdoif {series} {
- \btxdoif {volume} {
- \btxcomma number\btxspace\btxflush{volume}\btxspace in
- }
- \btxspace\btxflush{series}
- }
- \btxdoif {chapter} {
- \btxcomma\btxflush{chapter}\btxspace
- }
- \btxsetup{btx:apa:common:pages:pages}
- \btxdoif {edition} {
- \btxspace\btxflush{edition}\btxspace edition
- }
- \btxsetup{btx:apa:common:publisher:sentence}
- } {
- \btxdoif {crossref} {
- \btxlbracket\btxsetup{btx:format:crossref}\btxrbracket
- }
- \btxdoif {chapter} {
- \btxcomma\btxflush{chapter}
- }
- \btxspace
- \btxsetup{btx:apa:common:pages:pages}
- }
- \btxsetup{btx:apa:common:note}
-\stopsetups
-
-\startsetups btx:apa:inproceedings
- \btxsetup{btx:apa:common:author-and-year}
- \btxdoif {arttitle} {
- \btxflush{arttitle}\btxperiod
- }
- In\btxspace
- \btxdoifelse {title} {
- \btxdoif {editor} {
- \btxflush{btx:apa:format:editors}
- \btxcomma\btxsingularplural{editor}{editor}{editors}\btxcomma
- }
- \bgroup\it\btxflush{title}\/\egroup
- \btxdoif {series} {
- \btxdoif {volume} {
- \btxcomma number~\btxflush{volume} in
- }
- \btxspace
- \btxflush{series}
- }
- \btxdoif {chapter} {
- \btxcomma\btxflush{chapter}\btxspace
- }
- \btxsetup{btx:apa:common:pages:pages}
- \btxperiod
- \btxsetup{btx:apa:common:organization:sentence}
- } {
- \btxdoif {crossref} {
- \btxlbracket\btxsetup{btx:format:crossref}\btxrbracket
- }
- \btxdoif {chapter} {
- \btxcomma\btxflush{chapter}\btxspace
- }
- \btxsetup{btx:apa:common:pages:pages}
- \btxperiod
- }
- \btxsetup{btx:apa:common:note}
-\stopsetups
-
-\startsetups btx:apa:proceedings
- \btxsetup{btx:apa:common:editor-or-key-and-year}
- \btxdoif {title} {
- \bgroup\it\btxflush{title}\/\egroup
- \btxdoif {volume} {
- \btxcomma number\btxspace\btxflush{volume}\btxspace in\btxspace
- }
- \btxdoif {chapter} {
- \btxcomma\btxflush{chapter}\btxspace
- }
- \btxsetup{btx:apa:common:pages:pages}
- \btxperiod
- \btxsetup{btx:apa:common:organization:sentence}
- }
- \btxsetup{btx:apa:common:note}
-\stopsetups
-
-\startsetups btx:apa:common:thesis
- \btxsetup{btx:apa:common:author-and-year}
- \btxsetup{btx:apa:common:title-it-and-series}
- \btxdoifelse {type} {
- \btxflush{type}
- } {
- \getvariable{btx:temp}{label}
- }
- \btxsetup{btx:apa:common:school:subsentence}
- \btxsetup{btx:apa:common:pages:p}
- \btxsetup{btx:apa:common:note}
-\stopsetups
-
-\startsetups btx:apa:mastersthesis
- \setvariables[btx:temp][label=Master's thesis]
- \btxsetup{btx:apa:common:thesis}
-\stopsetups
-
-\startsetups btx:apa:phdthesis
- \setvariables[btx:temp][label=PhD thesis]
- \btxsetup{btx:apa:common:thesis}
-\stopsetups
-
-\startsetups btx:apa:techreport
- \btxsetup{btx:apa:common:author-and-year}
- \btxsetup{btx:apa:common:title-and-series}
- \btxdoifelse {type} {
- \btxflush{type}
- \btxdoif {volume} {
- \btxspace\btxflush{volume}
- }
- } {
- \btxspace Technical Report
- }
- \btxsetup{btx:apa:common:institution:subsentence}
- \btxsetup{btx:apa:common:pages:p}
- \btxsetup{btx:apa:common:note}
-\stopsetups
-
-\startsetups btx:apa:misc
- \btxsetup{btx:apa:common:author-and-year}
- \btxsetup{btx:apa:common:title-and-series}
- \btxsetup{btx:apa:common:publisher:sentence}
- \btxsetup{btx:apa:common:pages:p}
- \btxsetup{btx:apa:common:note}
-\stopsetups
-
-\startsetups btx:apa:unpublished
- \btxsetup{btx:apa:common:author-and-year}
- \btxsetup{btx:apa:common:title-and-series}
- \btxsetup{btx:apa:common:pages:p}
- \btxdoif {type} {
- \btxlparent\btxflush{type}\btxrparent
- }
- \btxsetup{btx:apa:common:note}
-\stopsetups
-
-\endinput
diff --git a/Master/texmf-dist/tex/context/base/publ-imp-apa.mkvi b/Master/texmf-dist/tex/context/base/publ-imp-apa.mkvi
new file mode 100644
index 00000000000..a1814b0a48b
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/publ-imp-apa.mkvi
@@ -0,0 +1,1473 @@
+%D \module
+%D [ file=publ-imp-apa,
+%D version=2013.12.12,
+%D title=APA bibliography style,
+%D subtitle=Publications,
+%D author=Alan Braslau and Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is therefore copyrighted
+%D by \PRAGMA. See mreadme.pdf for details.
+
+\startbtxrenderingdefinitions[apa]
+
+\ifdefined\c!translate \else \def\c!translate{translate} \fi
+
+%D Reference:
+%D \startTEX
+%D @Book{APA2010,
+%D title ={Publication Manual of the American Psychological Association},
+%D year ={2010},
+%D edition ={Sixth},
+%D address ={Washington, DC},
+%D publisher={American Psychological Association},
+%D pages ={291},
+%D url ={http://www.apa.org/books/},
+%D }
+%D \stopTEX
+
+% set ALL specific APA compliant values
+
+\definebtx
+ [apa]
+ [\c!default=default,
+ \c!specification=apa,
+ \c!otherstext={\space\btxlabeltext{apa:others}},
+ %c!journalconversion=\v!normal,
+ \c!monthconversion=\v!month]
+
+% First, define list and rendering parameters
+
+% The APA style sorts the unnumbered rendered list by authoryear
+
+\definebtxrendering
+ [apa]
+ [\c!specification=apa,
+ \c!sorttype=authoryear,
+ \c!numbering=\v!no]
+
+\setupbtxlist
+ [apa]
+ [\c!alternative=\v!paragraph,
+ \c!width=\v!fit,
+ \c!distance=.5\emwidth,
+ \c!margin=3\emwidth]
+
+\definebtx
+ [apa:list]
+ [apa]
+ [\c!otherstext={,\nobreakspace\textellipsis\space},
+ \c!etallimit=7,
+ \c!etaldisplay=6,
+ \c!authorconversion=invertedshort,
+ \c!separator:names:2={,\space}, % aka namesep - in this namespace
+ \c!separator:names:3={,\nobreakspace\textampersand\space}, % comma separated list
+ \c!separator:names:4={\nobreakspace\textampersand\space}] % last of two, no comma!
+
+% First, we define a namespace for a few special fields
+
+\definebtx
+ [apa:list:author]
+ [apa:list]
+
+\definebtx
+ [apa:list:editor]
+ [apa:list:author]
+
+\definebtx
+ [apa:list:suffix]
+ [apa:list]
+
+\definebtx
+ [apa:list:url]
+ [apa:list]
+
+\definebtx
+ [apa:list:doi]
+ [apa:list]
+
+\definebtx
+ [apa:list:invertedshort]
+ [apa:list]
+
+\definebtx
+ [apa:list:short]
+ [apa:list]
+
+% Next, we define a namespace for each category
+
+%D In order to be able to get journals expanded (or normalized or abbreviated) you need
+%D to load a list:
+%D
+%D \starttyping
+%D \btxloadjournallist[journals.txt] % the jabref list
+%D \stoptyping
+
+
+\definebtx
+ [apa:list:journal]
+ [\c!style=\v!italic]
+ %command=\btxexpandedjournal] % btxabbreviatedjournal
+
+\definebtx
+ [apa:list:title]
+ [\c!style=\v!italic,
+ \c!command=\Word,
+ \c!translate=\v!yes]
+
+\definebtx
+ [apa:list:title:article]
+ [apa:list:title]
+ [\c!style=] % journal is set in italics
+
+\definebtx
+ [apa:list:title:magazine]
+ [apa:list:title]
+
+\definebtx
+ [apa:list:title:newspaper]
+ [apa:list:title]
+
+\definebtx
+ [apa:list:title:periodical]
+ [apa:list:title]
+
+\definebtx
+ [apa:list:title:standard]
+ [apa:list:title]
+
+\definebtx
+ [apa:list:title:book]
+ [apa:list:title]
+
+\definebtx
+ [apa:list:title:inbook]
+ [apa:list:title]
+
+\definebtx
+ [apa:list:title:incollection]
+ [apa:list:title]
+ [\c!style=] % booktitle is set in italics
+
+\definebtx
+ [apa:list:title:proceedings]
+ [apa:list:title]
+
+\definebtx
+ [apa:list:title:inproceedings]
+ [apa:list:title]
+ [\c!style=] % booktitle is set in italics
+
+\definebtx
+ [apa:list:title:conference]
+ [apa:list:title]
+ [\c!style=] % booktitle is set in italics
+
+\definebtx
+ [apa:list:title:thesis]
+ [apa:list:title]
+
+\definebtx
+ [apa:list:title:phdthesis]
+ [apa:list:title]
+
+\definebtx
+ [apa:list:title:mastersthesis]
+ [apa:list:title]
+
+\definebtx
+ [apa:list:title:booklet]
+ [apa:list:title]
+
+\definebtx
+ [apa:list:title:manual]
+ [apa:list:title]
+
+\definebtx
+ [apa:list:title:techreport]
+ [apa:list:title]
+
+\definebtx
+ [apa:list:title:unpublished]
+ [apa:list:title]
+
+\definebtx
+ [apa:list:title:patent]
+ [apa:list:title]
+
+\definebtx
+ [apa:list:title:electronic]
+ [apa:list:title]
+
+\definebtx
+ [apa:list:title:music]
+ [apa:list:title]
+
+\definebtx
+ [apa:list:title:film]
+ [apa:list:title]
+
+\definebtx
+ [apa:list:title:other]
+ [apa:list:title]
+
+\definebtx
+ [apa:list:title:misc]
+ [apa:list:title]
+
+\definebtx
+ [apa:list:title:literal]
+ [apa:list:title]
+
+\definebtx
+ [apa:list:type]
+ [\c!command=\Word]
+
+% We define [page] settings in the apa namespace, inheriting the root
+% settings, in order to eventually allow for modifications without touching
+% root.
+
+\definebtx
+ [apa:page]
+ [\s!page]
+
+\definebtx
+ [apa:page:list]
+ [apa:page]
+ [\c!command={\wordright}]
+
+% Then define and set cite parameters.
+
+\definebtx
+ [apa:cite]
+ [apa]
+ [\c!alternative=authoryear,
+ \c!otherstext={,\space\btxlabeltext{apa:others}},
+ \c!etallimit=5,
+ \c!etaldisplay=1, % TODO: when 2-4, show all first time, etaldisplay subsequently...
+ \c!authorconversion=\v!name,
+ \c!sorttype=authoryear,
+ \c!separator:names:2={,\space},
+ \c!separator:names:3={,\space\btxlabeltext{apa:and}\space}, % not \textampersand
+ \c!separator:names:4={\space\btxlabeltext{apa:and}\space}] % not \textampersand
+
+\definebtx
+ [apa:cite:author]
+ [apa:cite]
+
+\definebtx
+ [apa:cite:authoryear]
+ [apa:cite:author]
+ [\c!left={\removeunwantedspaces\pushpunctuation\btxspace(},
+ \c!right={)\poppunctuation},
+ \c!inbetween={,\space},
+ \c!compress=\v!yes]
+
+\definebtx
+ [apa:cite:default]
+ [apa:cite:authoryear]
+
+\definebtx
+ [apa:cite:authoryears]
+ [apa:cite:authoryear]
+ [\c!left=,
+ \c!right=,
+ \c!inbetween={\space}]
+
+\definebtx
+ [apa:cite:authornum]
+ [apa:cite:author]
+ [\c!left={\removeunwantedspaces\pushpunctuation\btxspace(},
+ \c!right={)\poppunctuation},
+ \c!sorttype=authornum]
+
+\definebtx
+ [apa:cite:authorref]
+ [apa:cite:authornum]
+
+\definebtx
+ [apa:cite:author:num] % todo
+ [apa:cite:authornum]
+ [\c!left={\removeunwantedspaces\pushpunctuation\btxspace[},
+ \c!right={]\poppunctuation}]
+
+\definebtx
+ [apa:cite:author:year] % todo
+ [apa:cite]
+
+\definebtx
+ [apa:cite:author:years] % todo
+ [apa:cite:authoryears]
+ [\c!inbetween=,
+ \c!left=(,
+ \c!right=)]
+
+\definebtx
+ [apa:cite:year]
+ [apa:cite]
+ [\c!separator:2={,\space}, % :0 and :1 - between items of a list
+ \c!separator:3={,\space\btxlabeltext{apa:and}\space}, % not \textampersand
+ \c!separator:4={\space\btxlabeltext{apa:and}\space}, % not \textampersand
+ \c!compress=\v!yes,
+ \c!sorttype=\v!default]
+
+\definebtx
+ [apa:cite:title]
+ [apa:cite]
+ [\c!separator:2={,\space}, % :0 and :1 - between items of a list
+ \c!separator:3={,\space\btxlabeltext{apa:and}\space}, % not \textampersand
+ \c!separator:4={\space\btxlabeltext{apa:and}\space}, % not \textampersand
+ \c!command={\language[\currentbtxlanguage]}, % BAH
+ \c!style=\v!italic]
+
+\definebtx
+ [apa:cite:booktitle]
+ [apa:cite:title]
+
+\definebtx
+ [apa:cite:tag]
+ [apa:cite]
+ [\c!left={\removeunwantedspaces\pushpunctuation\btxspace[},
+ \c!right={]\poppunctuation}]
+
+\definebtx
+ [apa:cite:key]
+ [apa:cite:tag]
+
+\definebtx
+ [apa:cite:serial]
+ [apa:cite]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtx
+ [apa:cite:page]
+ [apa:cite]
+ [\c!left=,
+ \c!right=,
+ [\c!separator:2={,\space}, % :0 and :1 - between items of a list
+ \c!separator:3={,\space\btxlabeltext{apa:and}\space}, % not \textampersand
+ \c!separator:4={\space\btxlabeltext{apa:and}\space}] % not \textampersand
+
+\definebtx
+ [apa:cite:pages]
+ [apa:cite:page]
+
+\definebtx
+ [apa:cite:keywords]
+ [apa:cite]
+ [\c!left={(},
+ \c!right={)}]
+
+\definebtx
+ [apa:cite:invertedshort]
+ [apa:cite]
+
+\definebtx
+ [apa:cite:short]
+ [apa:cite]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtx
+ [apa:cite:category]
+ [apa:cite]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtx
+ [apa:cite:type]
+ [apa:cite:category]
+
+\definebtx
+ [apa:cite:url]
+ [apa:cite]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtx
+ [apa:cite:doi]
+ [apa:cite:url]
+
+\definebtx
+ [apa:cite:num]
+ [apa:cite]
+ [\c!compress=\v!yes,
+ \c!left={[},
+ \c!right={]},
+ \c!separator:2={,}, % no space
+ \c!separator:3=\btxparameter{\c!separator:2},
+ \c!separator:4=\btxparameter{\c!separator:2}]
+
+\definebtx
+ [apa:cite:textnum]
+ [apa:cite:num]
+ [\c!left={Ref.\nbsp},
+ \c!right=,
+ \c!separator:2={,\space},
+ \c!separator:3={\space\btxlabeltext{apa:and}\space},
+ \c!separator:4={\space\btxlabeltext{apa:and}\space}]
+
+\definebtx
+ [apa:cite:entry]
+ [apa:cite]
+ [\c!left=,
+ \c!right=,
+ \c!inbetween={\space},
+ \c!separator:2={;\space},
+ \c!separator:3=\btxparameter{\c!separator:2},
+ \c!separator:4=\btxparameter{\c!separator:2}]
+
+% Now we setup for the details of the renderings
+
+%D Sometimes we have verbose injections in an entry and these can be language
+%D dependent, so we use labels.
+%D
+%D Because we want to mix rendering (in the manual) we need a namespace in label
+%D texts:
+
+\setupbtxlabeltext
+ [en]
+ [apa:and=and,
+ apa:number={no.},
+ apa:edition={ed.},
+ apa:Editor={Ed.},
+ apa:Editors={Eds.},
+ apa:Volume={Vol.},
+ apa:Volumes={Vols.},
+ apa:others={et al.},
+ apa:page={p.},
+ apa:pages={pp.},
+ apa:nd={n.d.}, % no date
+ apa:mastersthesis={Master's thesis},
+ apa:phdthesis={Doctoral dissertation},
+ apa:technicalreport={Tech. Rep.}, % Technical report
+ apa:supplement={Suppl.}, % Supplement (not used?)
+ apa:patent=Patent,
+ apa:MotionPicture={Motion picture},
+ apa:Producer=Producer,
+ apa:Producers=Producers,
+ apa:Director=Director,
+ apa:Directors=Directors,
+ apa:Recordedby={Recorded by},
+ apa:Author=Author,
+ apa:Translator={Trans.}, % Translator(s) (not used?)
+ apa:Advanced={Advanced online publication},
+ apa:Retrieved={Available from}, % {Retrieved from},
+ apa:In=In]
+
+\setupbtxlabeltext
+ [nl]
+ [apa:and=en,
+ apa:number={nr.},
+ apa:edition={ed.}, % editie
+ apa:Editor=Editor, % Ed./Eds.
+ apa:Editors=Editors,
+ apa:Volume={Vol.},
+ apa:Volumes={Vols.},
+ apa:others={et al.},
+ apa:page={p.},
+ apa:pages={pp.},
+ apa:nd={g.d.} % geen datum
+ apa:mastersthesis=Masterproef,
+ apa:phdthesis=Proefschrift,
+ apa:technicalreport={Technisch rapport}, % Technical report
+ apa:supplement=Supplement,
+ apa:patent=Octrooi,
+ apa:MotionPicture=Film, % ?
+ apa:Producer=Producent, % ?
+ apa:Producers=Producents, % ?
+ apa:Director=Directeur,
+ apa:Directors=Directeurs,
+ apa:Recordedby={Opgenomen door}, % ?
+ apa:Author=Auteur,
+ apa:Translator=Vertaler,
+ apa:Advanced={Geavanceerde online publicatie},
+ apa:Retrieved={Beschikbaar vanaf}, % {Ontvangen van},
+ apa:In=In]
+
+\setupbtxlabeltext
+ [fr]
+ [apa:and=et,
+ apa:others={et al.},
+ apa:number={n\high{o}},
+ apa:edition={édition},
+ apa:Editor=Éditeur,
+ apa:Editors=Éditeurs,
+ apa:Volume=Volume,
+ apa:Volumes=Volumes,
+ apa:others={et al.},
+ apa:page={p.},
+ apa:pages={pp.},
+ apa:nd={s.d.} % sans date
+ apa:mastersthesis={Thèse de master (DEA, DESS, master)},
+ apa:phdthesis={Thèse de doctorat},
+ apa:technicalreport={Rapport technique},
+ apa:supplement=Supplément,
+ apa:patent=Brevet,
+ apa:MotionPicture={Film cinématographique},
+ apa:Producer=Producteur,
+ apa:Producers=Producteurs,
+ apa:Director=Réalisateur,
+ apa:Directors=Réalisateurs,
+ apa:Recordedby={Enregistré par},
+ apa:Author=Auteur,
+ apa:Translator=Traducteur,
+ apa:Advanced={Publication en ligne anticipée},
+ apa:Retrieved={Disponible à}, % {Téléchargé de},
+ apa:In=Dans]
+
+\setupbtxlabeltext
+ [de]
+ [apa:and=und,
+ apa:number={nr.},
+ apa:edition=Auf\/lage,
+ apa:Editor=Herausgeber, % Hrsg./Hg.
+ apa:Editors=Herausgeber,
+ apa:Volume=Band, % Bd.
+ apa:Volumes={Bände},
+ apa:others={et al.},
+ apa:page={S.},
+ apa:pages={S.},
+ apa:nd={o.D.}, % ohne Datum (mostly: o.J. / ohne Jahr)
+ apa:mastersthesis={Masterarbeit},
+ apa:phdthesis={Dissertation},
+ apa:technicalreport={Technischer Bericht},
+ apa:supplement={Beilage}, % Supplement
+ apa:patent=Patent,
+ apa:MotionPicture=Kinofilm, % ?
+ apa:Producer=Producer, % ?
+ apa:Producers=Produzenten, % ?
+ apa:Director=Director, % ?
+ apa:Directors=Directors, % ?
+ apa:Recordedby={per Einschreiben}, % ?
+ apa:Author=Autor,
+ apa:Translator={Übersetzer}, % Übers.
+ apa:Advanced={Erweiterte Online-Publikation},
+ apa:Retrieved={heruntergeladen von},
+ apa:In=In]
+
+% thanks: Andrea Valle
+
+\setupbtxlabeltext
+ [it]
+ [apa:and=e,
+ apa:number={nº},
+ apa:edition={ed.}, % edizione
+ apa:Editor={A cura di},
+ apa:Editors={A cura di},
+ apa:Volume={Vol.}, % Volume
+ apa:Volumes={Vol.}, % Volumi
+ apa:others={et al.},
+ apa:page={p.},
+ apa:pages={pp.},
+ apa:nd={s.d.}, % senza data
+ apa:mastersthesis={Tesi di laurea},
+ apa:phdthesis={Tesi di dottorato},
+ apa:technicalreport={Relazione tecnica},
+ apa:supplement={Supplemento},
+ apa:patent=Brevetto,
+ apa:MotionPicture=Film, % ?
+ apa:Producer=Produttore,
+ apa:Producers=Produttori,
+ apa:Director=Direttore,
+ apa:Directors=Direttori,
+ apa:Recordedby={Registrato da},
+ apa:Author=Autore,
+ apa:Translator={Trad.}, % Translator(s)
+ apa:Advanced={Pre-pubblicazione on line},
+ apa:Retrieved={Accessible online},
+ apa:In=In]
+
+\setupbtxlabeltext
+ [es]
+ [apa:and=y,
+ apa:number={nº},
+ apa:edition={ed.}, % edición
+ apa:Editor=Editor, % Ed./Eds.
+ apa:Editors=Editores,
+ apa:Volume={Vol.}, % Volumen
+ apa:Volumes={Vols.}, % Volúmenes
+ apa:others={et al.},
+ apa:page={p.},
+ apa:pages={pp.},
+ apa:nd={s.f.}, % sin fecha
+ apa:mastersthesis={Tesis de maestría},
+ apa:phdthesis={Tesis doctoral},
+ apa:technicalreport={Informe técnico},
+ apa:supplement=Suplemento,
+ apa:patent=Patente,
+ apa:MotionPicture=Cinematográfica,
+ apa:Producer=Productor,
+ apa:Producers=Productores,
+ apa:Director=Director,
+ apa:Directors=Directores,
+ apa:Recordedby={Grabada por},
+ apa:Author=Autor,
+ apa:Translator=Traductor,
+ apa:Advanced={Publicación en línea avanzada},
+ apa:Retrieved={Disponible desde}, % {Obtenido de},
+ apa:In=En]
+
+% cite setups
+
+% The following differs from the default returning n.d. if year is empty
+
+\startsetups btx:apa:cite:author:year
+ \texdefinition{\s!btx:\s!cite:concat}
+ \btxparameter\c!left
+ \ifx\currentbtxfirst\empty
+ \btxlabeltext{apa:nd}
+ \else
+ \texdefinition {\s!btx:\s!cite:inject} {
+ \btxcitereference
+ \currentbtxfirst
+ }
+ \ifx\currentbtxsecond\empty \else
+ \btxparameter\v!inbetween
+ \texdefinition {\s!btx:\s!cite:inject} {
+ \currentbtxsecond
+ }
+ \fi
+ \ifx\currentbtxthird\empty \else
+ \texdefinition {\s!btx:\s!cite:inject} {
+ \currentbtxthird
+ }
+ \fi
+ \fi
+ \btxparameter\c!right
+\stopsetups
+
+\startsetups btx:apa:cite:author:years
+ \fastsetup{btx:apa:cite:author:year}
+\stopsetups
+
+% The following differs from the default by including the labels p. and pp.
+
+\startsetups btx:apa:page:list
+ \fastsetup{\s!btx:\s!page:concat}
+ \ifx\currentbtxlastpage\empty
+ \btxlabeltext{apa:page}
+ \else
+ \btxlabeltext{apa:pages}
+ \fi
+ \btxnbsp
+ \ifconditional\btxinteractive
+ \goto {
+ \currentbtxfirstpage
+ } [
+ internal(\currentbtxfirstinternal)
+ ]
+ \ifx\currentbtxlastpage\empty \else
+ \btxparameter\c!pageconnector
+ \goto {
+ \currentbtxlastpage
+ } [
+ internal(\currentbtxlastinternal)
+ ]
+ \fi
+ \else
+ \currentbtxfirstpage
+ \ifx\currentbtxlastpage\empty \else
+ \btxparameter\c!pageconnector
+ \currentbtxlastpage
+ \fi
+ \fi
+\stopsetups
+
+% The sameauthor feature may not be APA compliant
+% (there is nothing in the manual cited above).
+% It can be removed using the command:
+% \resetsetups [apa:list:sameauthor]
+
+% :rule, :empty or :ditto ...
+
+\startsetups apa:list:sameauthor
+ \fastsetup{apa:list:sameauthor:rule}
+\stopsetups
+
+\startsetups apa:list:sameauthor:rule
+ \blackrule
+ [\c!width=\dimexpr\listparameter\c!margin-\interwordspace\relax,
+ \c!height=1.5\linewidth]% \linewidth is just too thin with respect to font strokes...
+\stopsetups
+
+
+\startsetups [apa:list:sameauthor:\v!empty]
+ \kern\dimexpr\listparameter\c!margin-\interwordspace\relax
+\stopsetups
+
+% horrible !
+
+\startsetups apa:list:sameauthor:ditto
+ \inframed
+ [\c!width=\dimexpr\listparameter\c!margin-\interwordspace\relax,
+ \c!frame=\v!off,
+ \c!align=\v!middle]
+ {\doubleprime}
+\stopsetups
+
+%D Instead of texdefinitions without arguments, we could have used setups but in my
+%D editor (hh, scite) the commands stand out better. It also saves an additional
+%D component in the name (e.g. common:) because commands and setups have a different
+%D namespace, so similar calls don't clash. Performance of definitions is somewhat
+%D better.
+
+%D We use "texdefinitions" (with eventual arguments) for helpers that are used
+%D in the rendering "setups" defined for each category below.
+
+%D Note that \btxdoif... and \btxflush rely on the definitions in
+%D publ-imp-apa.lua: fields that are not listed as required nor optional are
+%D IGNORED. We also make heavy use of the notion of sets - comma-separated lists
+%D of alternative fields to be used in hierarchal order. For example:
+%D author = { "author", "editor", "publisher", "title" }, will return the
+%D author field if it exists; if not, the editor field will be returned, if it
+%D exists; if not, the publisher field will be returned, if it exists; if not,
+%D the title field will be returned, it it exists; if not, nothing will be
+%D returned. In lua syntax, it can be understood as
+%D author or editor or publisher or title or ""
+
+% #title can be title or booktitle
+
+\starttexdefinition btx:apa:translated-title #title
+ \ifx\currentbtxlanguage\empty
+ % no need for an extra
+ \else\ifx\mainbtxlanguage\currentbtxlanguage
+ % no need for an extra
+ \else
+ \btxdoif {#title:\mainbtxlanguage} {
+ \begingroup
+ \language[\mainbtxlanguage]
+ \btxleftbracket
+ \btxusecommand[apa:list:title:\currentbtxcategory] {
+ \btxflush{#title:\mainbtxlanguage}
+ }
+ \btxrightbracket
+ \endgroup
+ }
+ \fi\fi
+\stoptexdefinition
+
+\starttexdefinition btx:apa:composed-title #title
+ \begingroup
+ \language[\currentbtxlanguage]
+ \btxusecommand[apa:list:title:\currentbtxcategory] {
+ \btxflush{#title}
+ \btxdoif {sub#title} {
+ \btxcolon
+ \btxflush{sub#title}
+ }
+ }
+ \endgroup
+ \doif{\btxparameter{translate}}\v!yes {
+ \texdefinition{btx:apa:translated-title}{#title}
+ }
+\stoptexdefinition
+
+\starttexdefinition btx:apa:title
+ \setmode{btx:apa:title-placed}
+ % we make the title active, opening "file"
+ \btxdoifelse {file} {
+ \texdefinition{btx:format:inject}
+ {url(file:\btxflush{file})}
+ {
+ \btxstartstyleandcolor [apa:list:title:\currentbtxcategory]
+ \texdefinition{btx:apa:composed-title}{title}
+ \btxstopstyleandcolor
+ }
+ } {
+ \btxstartstyleandcolor [apa:list:title:\currentbtxcategory]
+ \texdefinition{btx:apa:composed-title}{title}
+ \btxstopstyleandcolor
+ }
+ \btxdoif {title} {
+ \btxperiod
+ % TODO: this period may NOT be wanted, as in: Title (2nd ed.).
+ }
+\stoptexdefinition
+
+\starttexdefinition btx:apa:title-if-not-placed
+ \doifelsemode {btx:apa:title-placed} {
+ \resetmode{btx:apa:title-placed}
+ } {
+ \btxdoif {title} {
+ \btxspace
+ \texdefinition {btx:apa:title}
+ }
+ }
+\stoptexdefinition
+
+\starttexdefinition btx:apa:suffixedyear
+ \btxdoifelse {year} {
+ \btxflush{year}
+ \btxflush{suffix}
+ %or \btxflush{suffixedyear}
+ } {
+ \btxlabeltext{apa:nd}
+ }
+\stoptexdefinition
+
+% #author may be author(set) or editor
+
+\starttexdefinition btx:apa:author-or-editor #author
+ \btxdoif {#author} {
+ \btxflush{#author}
+ \doif {\btxfoundname{#author}} {editor} {
+ \btxleftparenthesis
+ \btxsingularorplural {editor} {
+ \btxlabeltext{apa:Editor}
+ } {
+ \btxlabeltext{apa:Editors}
+ }
+ \btxrightparenthesisperiod
+ }
+ }
+\stoptexdefinition
+
+\starttexdefinition btx:apa:authoryear
+ % we make the authoryear active, pointing to the citation
+ \texdefinition{btx:format:inject}
+ {internal(\currentbtxinternal)}
+ {
+ \doifelsesetups{apa:list:sameauthor} {
+ \btxdoifelsesameasprevious {author} {
+ \fastsetup{apa:list:sameauthor}
+ } {
+ \texdefinition{btx:apa:author-or-editor} {author}
+ }
+ } {
+ \texdefinition{btx:apa:author-or-editor} {author}
+ }
+ \btxleftparenthesis
+ \texdefinition{btx:apa:suffixedyear}
+ \btxrightparenthesis
+ }
+ % outside of interaction
+ \btxperiod
+ \doif {\btxfoundname{author}} {title} {
+ \setmode{btx:apa:title-placed}
+ }
+\stoptexdefinition
+
+\starttexdefinition btx:apa:editor-in
+ \btxdoif {booktitle} {
+ \btxlabeltext{apa:In}
+ \doifnot {\btxfoundname{author}} {editor} {
+ \btxspace
+ \texdefinition{btx:apa:author-or-editor} {editor}
+ }
+ \btxspace
+ \btxstartstyleandcolor[apa:list:title]
+ \texdefinition{btx:apa:composed-title} {booktitle}
+ \btxstopstyleandcolor
+ \btxperiod
+ }
+\stoptexdefinition
+
+% TODO: The title is terminated with period. However,
+% we probably don't want this before the parenthesis.
+
+\starttexdefinition btx:apa:leftparenthesis-or-comma
+ \doifelsemode {btx:apa:editionset-is-empty} {
+ \btxleftparenthesis
+ \resetmode{btx:apa:editionset-is-empty}
+ } {
+ \btxcomma
+ }
+\stoptexdefinition
+
+\starttexdefinition btx:apa:editionset
+ \setmode{btx:apa:editionset-is-empty}
+ \doif {\currentbtxcategory} {techreport} {
+ \texdefinition{btx:apa:leftparenthesis-or-comma}
+ \btxdoifelse {type} {
+ \btxusecommand[apa:list:type] {
+ \btxflush{type}
+ }
+ } {
+ \btxlabeltext{apa:technicalreport}
+ }
+ }
+ \btxdoif {volume} {
+ \texdefinition{btx:apa:leftparenthesis-or-comma}
+ \btxoneorrange {volume} {
+ \btxlabeltext{apa:Volume}
+ } {
+ \btxlabeltext{apa:Volumes}
+ }
+ \btxspace
+ \btxflush{volume}
+ }
+ \btxdoif {number} {
+ \texdefinition{btx:apa:leftparenthesis-or-comma}
+ \btxlabeltext{apa:number}
+ \btxspace
+ \btxflush{number}
+ }
+ \btxdoif {edition} {
+ \texdefinition{btx:apa:leftparenthesis-or-comma}
+ \btxflush{edition}
+ \btxspace
+ \btxlabeltext{apa:edition}
+ }
+ \btxdoif {pages} {
+ \texdefinition{btx:apa:leftparenthesis-or-comma}
+ \btxoneorrange {pages} {
+ \btxlabeltext{apa:page}
+ } {
+ \btxlabeltext{apa:pages}
+ }
+ \btxnbsp
+ \btxflush{pages}
+ }
+ \doifnotmode {btx:apa:editionset-is-empty} {
+ \btxrightparenthesisperiod
+ }
+\stoptexdefinition
+
+ % this could be simplified!
+
+\starttexdefinition btx:apa:journal-volume-number-pages
+ \btxdoif {journal} {
+ \btxspace
+ \btxstartstyleandcolor[apa:list:journal]
+ \btxusecommand[apa:list:journal] {
+ \btxflush{journal}
+ }
+ \btxdoifelse {volume} {
+ \btxcomma
+ \btxflush{volume}
+ \btxstopstyleandcolor
+ \btxdoif {number} {
+ %\btxleftparenthesis
+ (\btxflush{number}
+ \btxrightparenthesis
+ }
+ } {
+ \btxstopstyleandcolor
+ \btxdoif {number} {
+ \btxcomma
+ \btxleftparenthesis
+ \btxflush{number}
+ \btxrightparenthesis
+ }
+ }
+ \btxdoif {pages} {
+ \btxcomma
+ \doif {\currentbtxcategory} {newspaper} {
+ \btxoneorrange {pages} {
+ \btxlabeltext{apa:page}
+ } {
+ \btxlabeltext{apa:pages}
+ }
+ \btxnbsp
+ }
+ \btxflush{pages}
+ }
+ \btxperiod
+ \doifnot {\currentbtxcategory} {newspaper} {
+ \btxdoifnot {volume} {
+ \btxdoifnot {number} {
+ \btxdoifnot {pages} {
+ \btxdoif {doi} {%set: doi or url
+ \btxspace
+ \btxlabeltext{apa:Advanced}
+ \btxperiod
+ }
+ }
+ }
+ }
+ }
+ }
+\stoptexdefinition
+
+\starttexdefinition btx:apa:wherefrom-publisher
+ \btxdoifelse {address} {
+ \btxflush{address}
+ \btxdoif {country} {
+ \btxcomma
+ \btxflush{country}
+ }
+ \btxcolon
+ } {
+ \btxdoif {country} {
+ \btxflush{country}
+ \btxcolon
+ }
+ }
+ \doifelse {\btxfoundname{author}} {\btxfoundname{publisher}} {
+ \btxlabeltext{apa:Author}
+ } {
+ \btxdoifelse {publisher} {
+ \btxflush{publisher}
+ } {
+ \btxlabeltext{apa:Author}
+ }
+ }
+ \btxperiod
+\stoptexdefinition
+
+\definebreakpoints[doi]
+\definebreakpoint [doi][:][nleft=3,type=1]
+\definebreakpoint [doi][/][nleft=3,type=1]
+\definebreakpoint [doi][-][nleft=3,type=1]
+\definebreakpoint [doi][.][nleft=3,type=1]
+
+% use \btxentry here?
+
+\starttexdefinition btx:apa:url
+ \btxspace
+ \btxlabeltext{apa:Retrieved}
+ \btxspace
+ \begingroup
+ \setbreakpoints[doi]
+ \ifconditional\btxinteractive
+ \goto {
+ \hyphenatedurl{\btxflush{url}}
+ } [
+ url(\btxflush{url})
+ ]
+ \else
+ \hyphenatedurl{\btxflush{url}}
+ \fi
+ \endgroup
+\stoptexdefinition
+
+% use \btxentry here?
+
+\starttexdefinition btx:apa:doi
+ \btxspace
+ \begingroup
+ \setbreakpoints[doi]
+ \ifconditional\btxinteractive
+ \goto {
+ \hyphenatedurl{doi:\btxflush{doi}}
+ } [
+ url(http://dx.doi.org/\btxflush{doi})
+ ]
+ \else
+ \hyphenatedurl{doi:\btxflush{doi}}
+ \fi
+ \endgroup
+\stoptexdefinition
+
+\starttexdefinition btx:apa:note
+ \btxdoif {note} {
+ \btxleftparenthesis
+ \btxflush{note}
+ \btxrightparenthesis
+ }
+\stoptexdefinition
+
+\starttexdefinition btx:apa:url-doi-note
+ \doif {\btxfoundname{doi}} {url} {
+ \texdefinition{btx:apa:url}
+ }
+ \doif {\btxfoundname{doi}} {doi} {
+ \texdefinition{btx:apa:doi}
+ }
+ \texdefinition{btx:apa:note}
+ \removeunwantedspaces
+\stoptexdefinition
+
+% Then setups, by category
+
+% An article from a journal
+% Required fields: author or editor or title, journal, (year).
+% Optional fields: volume, number, pages, type, doi, url, note.
+% Note that bibtex (and tools) do not include editor (e.g. special issue or section)
+
+\startsetups btx:apa:list:article
+ \texdefinition{btx:apa:authoryear}
+ \texdefinition{btx:apa:title-if-not-placed}
+ \texdefinition{btx:apa:journal-volume-number-pages}
+ \texdefinition{btx:apa:url-doi-note}
+\stopsetups
+
+% An article from a magazine.
+% Required fields: author or title, journal, (year).
+% Optional fields: number, pages, type, month, day, doi, url, note.
+
+\startsetups btx:apa:list:magazine
+ \fastsetup{btx:apa:list:article}
+\stopsetups
+
+% An article from a newspaper.
+% Required fields: author or title, journal, (year).
+% Optional fields: volume, number, pages, type, month, day, doi, url, note.
+
+\startsetups btx:apa:list:newspaper
+ \fastsetup{btx:apa:list:article}
+\stopsetups
+
+% A complete issue of a periodical, such as a special issue of a journal.
+% Required fields: title, year
+% Optional fields: editor, publisher, subtitle, series, volume, number, month, organization, doi, url, issn, note
+
+% needs to be tuned...
+
+\startsetups btx:apa:list:periodical
+ \fastsetup{btx:apa:list:article}
+\stopsetups
+
+% National and international standards issued by a standards body
+% Required fields: author, institution, or organization, year, title
+% Optional fields: subtitle, doi, url, note
+
+\startsetups btx:apa:list:standard
+ \texdefinition{btx:apa:authoryear}
+ \texdefinition{btx:apa:title-if-not-placed}
+ \texdefinition{btx:apa:url-doi-note}
+\stopsetups
+
+% A book with an explicit publisher.
+% Required fields: author or editor or publisher, title, (year).
+% Optional fields: volume or number, series, address, edition, month, day, note.
+% APA ignores: month, day
+
+% todo: series?
+
+\startsetups btx:apa:list:book
+ \texdefinition{btx:apa:authoryear}
+ \texdefinition{btx:apa:title-if-not-placed}
+ \texdefinition{btx:apa:editionset}
+ \texdefinition{btx:apa:wherefrom-publisher}
+ \texdefinition{btx:apa:url-doi-note}
+\stopsetups
+
+% There is some debate about how inbook should differ from incollection
+
+% A part of a book, which may be a chapter (or section or whatever) and/or a range of pages.
+% (note that inbook is handled differently by bibtex and biblatex)
+% Required fields: author or editor, title, chapter and/or pages, publisher, year.
+% Optional fields: volume or number, series, type, address, edition, month, note.
+% We add optional: booktitle.
+% APA ignores: chapter, month
+
+\startsetups btx:apa:list:inbook
+ \texdefinition{btx:apa:authoryear}
+ \texdefinition{btx:apa:title-if-not-placed}
+ \texdefinition{btx:apa:editor-in}
+ \texdefinition{btx:apa:editionset}
+ \texdefinition{btx:apa:wherefrom-publisher}
+ \texdefinition{btx:apa:url-doi-note}
+\stopsetups
+
+% A part of a book having its own title.
+% Required fields: author, title, booktitle, publisher, year.
+% Optional fields: editor, volume or number, series, type, chapter, pages, address, edition, month, note.
+% APA ignores: chapter, month
+
+\startsetups btx:apa:list:incollection
+ \fastsetup{btx:apa:list:inbook}
+\stopsetups
+
+% The proceedings of a conference.
+% Required fields: title, year.
+% Optional fields: editor, volume or number, series, address, month, organization, publisher, note.
+% todo: series?
+
+\startsetups btx:apa:list:proceedings
+ \fastsetup{btx:apa:list:book}
+\stopsetups
+
+% An article in a conference proceedings.
+% Required fields: author, title, booktitle, year.
+% Optional fields: editor, volume or number, series, pages, address, month, organization, publisher, note.
+
+\startsetups btx:apa:list:inproceedings
+ \texdefinition{btx:apa:authoryear}
+ \texdefinition{btx:apa:title-if-not-placed}
+ \texdefinition{btx:apa:editor-in}
+ \texdefinition{btx:apa:editionset}
+ \btxdoif {organization} {
+ \btxspace
+ \btxflush{organization}
+ \btxcomma
+ }
+ \texdefinition{btx:apa:wherefrom-publisher}
+ \texdefinition{btx:apa:url-doi-note}
+\stopsetups
+
+\startsetups btx:apa:list:conference
+ \fastsetup{btx:apa:list:inproceedings}
+\stopsetups
+
+% A thesis.
+% Required fields: author, title, school, year.
+% Optional fields: type, address, month, note.
+
+\startsetups btx:apa:list:thesis
+ \texdefinition{btx:apa:authoryear}
+ \texdefinition{btx:apa:title-if-not-placed}
+ \btxleftparenthesis
+ \btxdoifelse {type} {
+ \btxusecommand[apa:list:type] {
+ \btxflush{type}
+ }
+ } {
+ \btxlabeltext{apa:\currentbtxcategory}
+ }
+ \btxrightparenthesis
+ \btxdoif {school} {
+ \btxperiod
+ \btxflush{school}
+ }
+ \btxdoif {address} {
+ \btxdoifelse {school} {
+ \btxcomma
+ } {
+ \btxperiod
+ }
+ \btxflush{address}
+ \btxdoif {country} {
+ \btxcomma
+ \btxflush{country}
+ }
+ }
+ \btxperiod
+ \texdefinition{btx:apa:url-doi-note}
+\stopsetups
+
+\startsetups btx:apa:list:phdthesis
+ \fastsetup{btx:apa:list:thesis}
+\stopsetups
+
+\startsetups btx:apa:list:mastersthesis
+ \fastsetup{btx:apa:list:thesis}
+\stopsetups
+
+% A work that is printed and bound, but without a named publisher or sponsoring institution.
+% Required field: title.
+% Optional fields: author, howpublished, address, month, year, note.
+
+\startsetups btx:apa:list:booklet
+ \fastsetup{btx:apa:list:book}
+\stopsetups
+
+% Technical documentation.
+% Required field: title.
+% Optional fields: author, organization, address, edition, month, year, note.
+
+\startsetups btx:apa:list:manual
+ \fastsetup{btx:apa:list:book}
+\stopsetups
+
+% A report published by a school or other institution, usually numbered within a series.
+% Required fields: author, title, institution, year.
+% Optional fields: type, number, address, month, note.
+
+\startsetups btx:apa:list:techreport
+ \fastsetup{btx:apa:list:book}
+\stopsetups
+
+% A document having an author and title, but not formally published.
+% Required fields: author, title, note.
+% Optional fields: month, year.
+
+\startsetups btx:apa:list:unpublished
+ \fastsetup{btx:apa:list:book}
+\stopsetups
+
+% A patent. Note that this category was not defined with BIBTEX. Below from JabRef:
+% Required fields: nationality, number, year, yearfiled
+% Optional fields: author, title, assignee, address, type, number, day, dayfiled, month, monthfiled, note, url
+% Also optional: publisher
+
+% todo: yearfiled, monthfiled, dayfiled
+
+\startsetups btx:apa:list:patent
+ \texdefinition{btx:apa:authoryear}
+ \texdefinition{btx:apa:title-if-not-placed}
+ \begingroup
+ \it
+ \btxdoif {nationality} {
+ \btxspace
+ \btxflush{nationality}
+ }
+ \btxspace
+ \btxlabeltext{apa:patent}
+ \btxdoif {number} {
+ \btxspace
+ \btxlabeltext{apa:number}
+ \btxspace
+ \btxflush{number}
+ }
+ \btxperiod
+ \italiccorrection
+ \endgroup
+ \texdefinition{btx:apa:wherefrom-publisher}
+ \texdefinition{btx:apa:url}
+ \texdefinition{btx:apa:note}
+\stopsetups
+
+% Electronic. Note that this category was not defined with BIBTEX. Below from JabRef:
+% Required fields: title
+% Optional fields: address, author, howpublished, month, note, organization, url, year, doi
+% Also optional: type
+
+% Like Misc below but includes organization.
+
+\startsetups btx:apa:list:electronic
+ \texdefinition{btx:apa:authoryear}
+ \texdefinition{btx:apa:title-if-not-placed}
+ \btxdoif {organization} {
+ \btxspace
+ \btxflush{organization}
+ \btxperiod
+ }
+ \btxdoif {howpublished} {
+ \btxspace
+ \btxflush{howpublished}
+ \btxperiod
+ }
+ \texdefinition{btx:apa:url-doi-note}
+\stopsetups
+
+% Film. Note that this category was not defined with BIBTEX.
+% Required fields: producer, director, title, year, address, publisher
+% Optional fields: subtitle, type, note, url, doi
+
+\startsetups btx:apa:list:film
+ \btxdoif {producer} {
+ \btxflush{producer}
+ \btxleftparenthesis
+ \btxsingularorplural {producer} {
+ \btxlabeltext{apa:Producer}
+ } {
+ \btxlabeltext{apa:Producers}
+ }
+ \btxrightparenthesis
+ \btxdoifelse {director} {
+ \removeunwantedspaces
+ \btxparameter{\c!separator:names:3}
+ } {
+ \btxperiod
+ }
+ }
+ \btxdoif {director} {
+ \btxflush{director}
+ \btxleftparenthesis
+ \btxsingularorplural {director} {
+ \btxlabeltext{apa:Director}
+ } {
+ \btxlabeltext{apa:Directors}
+ }
+ \btxrightparenthesisperiod
+ }
+ \btxleftparenthesis
+ \texdefinition{btx:apa:suffixedyear}
+ \btxrightparenthesisperiod
+ \texdefinition {btx:apa:title}
+ \btxleftbracket
+ \btxdoifelse {type} {
+ \btxflush{type}
+ } {
+ \btxlabeltext{apa:MotionPicture}
+ }
+ \btxrightbracketperiod
+ \texdefinition{btx:apa:wherefrom-publisher}
+ \texdefinition{btx:apa:url-doi-note}
+\stopsetups
+
+% Music. Note that this category was not defined with BIBTEX.
+% Required fields: composer, artist, title, album, year, address, publisher
+% Optional fields: subtitle, type, note, url, doi
+
+\startsetups btx:apa:list:music
+ \texdefinition{btx:apa:authoryear}
+ \texdefinition{btx:apa:title-if-not-placed}
+ \doifnot {\btxfoundname{author}} {artist} {
+ \btxdoif {artist} {
+ \btxleftbracket
+ \btxlabeltext{apa:Recordedby}
+ \btxspace
+ \btxflush{artist}
+ \btxrightbracketperiod
+ }
+ }
+ \doifnot {\btxfoundname{title}} {album} {
+ \btxdoif {album} {
+ \btxlabeltext{apa:In}
+ \btxspace
+ \btxflush{album}
+ \btxperiod
+ }
+ }
+ \btxdoif {type} {
+ \btxleftbracket
+ \btxflush{type}
+ \btxrightbracketperiod
+ }
+ \texdefinition{btx:apa:wherefrom-publisher}
+ \texdefinition{btx:apa:url-doi-note}
+\stopsetups
+
+% Other. Note that this category was not defined with BIBTEX. Below from JabRef:
+% Required fields: author or title, year
+% Optional fields: note, doi, url
+
+\startsetups btx:apa:list:other
+ \fastsetup{btx:apa:list:book}
+\stopsetups
+
+% Use this type when nothing else fits.
+% Required fields: none.
+% Optional fields: author, title, howpublished, month, year, note.
+
+\startsetups btx:apa:list:misc
+ \texdefinition{btx:apa:authoryear}
+ \texdefinition{btx:apa:title-if-not-placed}
+ \btxdoif {howpublished} {
+ \btxspace
+ \btxflush{howpublished}
+ \btxperiod
+ }
+ \texdefinition{btx:apa:url-doi-note}
+\stopsetups
+
+% If all else fails to match:
+
+\startsetups btx:apa:list:literal
+ %\btxleftparenthesis
+ \removeunwantedspaces(
+ \btxflush{key}
+ \btxrightparenthesis
+ \btxdoif {text} {
+ \btxflush{text}
+ }
+\stopsetups
+
+% HH: an example of setting up translations using a sub rendering. Keep it here
+% till we find another spot as otherwise I forget about it and I don't want to
+% waste hours reinventing a wheel when something like this is needed.
+%
+% \definebtx
+% [apa:cite:title:translated]
+% [apa:cite:title]
+% [left=\btxleftbracket,
+% right=\btxrightbracket,
+% style=\v!bolditalic]
+%
+% \startsetups btx:apa:cite:title
+% % need to add concat, etc.
+% \btxcitereference
+% \currentbtxfirst
+% \doifmode {btx:apa:translatedtitles} {
+% \ifx\currentbtxlanguage\empty
+% % no need for an extra
+% \else\ifx\mainbtxlanguage\currentbtxlanguage
+% % no need for an extra
+% \else
+% \btxdoif {title:\mainbtxlanguage} {
+% \btxstartciterendering[title:translated]
+% \language[\mainbtxlanguage]
+% \btxflush{title:\mainbtxlanguage}
+% \btxstopciterendering
+% }
+% \fi\fi
+% }
+% \stopsetups
+
+\stopbtxrenderingdefinitions
diff --git a/Master/texmf-dist/tex/context/base/publ-imp-aps.lua b/Master/texmf-dist/tex/context/base/publ-imp-aps.lua
new file mode 100644
index 00000000000..1ec75d7d1df
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/publ-imp-aps.lua
@@ -0,0 +1,479 @@
+local specification = {
+ --
+ -- metadata
+ --
+ name = "aps",
+ version = "1.00",
+ comment = "APS specification",
+ author = "Alan Braslau and Hans Hagen",
+ copyright = "ConTeXt development team",
+ --
+ -- derived (combinations of) fields (all share the same default set)
+ --
+ virtual = {
+ "authoryear",
+ "authoryears",
+ "authornum",
+ "num",
+ "suffix",
+ },
+ --
+ -- special datatypes
+ --
+ types = {
+ --
+ -- list of fields that are interpreted as names: "NAME [and NAME]" where
+ -- NAME is one of the following:
+ --
+ -- First vons Last
+ -- vons Last, First
+ -- vons Last, Jrs, First
+ -- Vons, Last, Jrs, First
+ --
+ author = "author", -- interpreted as name(s)
+ editor = "author",
+ doi = "url", -- an external link
+ url = "url",
+ page = "pagenumber", -- number or range: f--t
+ pages = "pagenumber",
+ volume = "range",
+ number = "range",
+ keywords = "keyword", -- comma|-|separated list
+ year = "number",
+ },
+ --
+ -- categories with their specific fields
+ --
+ categories = {
+ --
+ -- categories are added below
+ --
+ },
+}
+
+local generic = {
+ --
+ -- A set returns the first field (in order of position below) that is found
+ -- present in an entry. A set having the same name as a field conditionally
+ -- allows the substitution of an alternate field.
+ --
+ -- note that anything can get assigned a doi or be available online.
+ editionset = { "edition", "volume", "number", "pages" },
+}
+
+-- Note that the APS specification allows an additional field "collaboration"
+-- to be rendered following the author list (if the collaboration name appears
+-- in the byline of the cited article).
+
+-- Definition of recognized categories and the fields that they contain.
+-- Required fields should be present; optional fields may also be rendered;
+-- all other fields will be ignored.
+
+-- Sets contain either/or in order of precedence.
+--
+-- For a category *not* defined here yet present in the dataset, *all* fields
+-- are taken as optional. This allows for flexibility in the addition of new
+-- categories.
+
+local categories = specification.categories
+
+-- an article from a journal
+
+categories.article = {
+ sets = {
+ author = { "author", "editor" },
+ },
+ required = {
+ "author",
+ },
+ optional = {
+ "collaboration",
+ "year",
+ "title", "subtitle", "type", "file",
+ "journal", "volume", "number", "pages",
+ "doi", "url", "note",
+ },
+}
+
+-- an article from a magazine
+
+categories.magazine = {
+ sets = categories.article.sets,
+ required = {
+ "author",
+ "year",
+ "journal",
+ },
+ optional = {
+ "collaboration",
+ "title", "subtitle", "type", "file",
+ "number", "pages",
+ "month", "day",
+ "doi", "url", "note",
+ },
+}
+
+categories.newspaper = categories.magazine
+
+-- (from jabref) to be identified and setup ...
+
+categories.periodical = {
+ sets = {
+ author = { "editor", "publisher" },
+ },
+ required = {
+ "title",
+ "year",
+ },
+ optional = {
+ "author",
+ "collaboration",
+ "subtitle", "file",
+ "series", "volume", "number", "month",
+ "organization",
+ "doi", "url", "note",
+ },
+}
+
+-- (from jabref) to be identified and setup ...
+
+categories.standard = {
+ sets = {
+ author = { "author", "institution", "organization" },
+ },
+ required = {
+ "author",
+ "year",
+ "title", "subtitle",
+ "doi", "note",
+ },
+ optional = {
+ "collaboration",
+ "url",
+ },
+}
+
+-- a book with an explicit publisher.
+
+categories.book = {
+ sets = {
+ author = { "author", "editor", "publisher" },
+ editionset = generic.editionset,
+ },
+ required = {
+ "author",
+ "title",
+ },
+ optional = {
+ "collaboration",
+ "year", "month", "day",
+ "title", "subtitle", "type", "file",
+ "editionset", "series",
+ "address",
+ "doi", "url", "note",
+ },
+}
+
+-- a part of a book, which may be a chapter (or section or whatever) and/or a range of pages.
+
+categories.inbook = {
+ sets = {
+ author = { "author", "editor", "publisher", },
+ editionset = generic.editionset,
+ },
+ required = {
+ "author",
+ "year" ,
+ "title",
+ },
+ optional = {
+ "collaboration",
+ "subtitle", "type", "file",
+ "booktitle",
+ -- "chapter",
+ "editionset", "series",
+ "month",
+ "address",
+ "doi", "url", "note",
+ },
+}
+
+-- a book having its own title as part of a collection.
+-- (like inbook, but we here make booktitle required)
+
+categories.incollection = {
+ sets = {
+ author = { "author", "editor", "publisher" },
+ editionset = generic.editionset,
+ },
+ required = {
+ "author",
+ "booktitle",
+ "year",
+ },
+ optional = {
+ "collaboration",
+ "title", "subtitle", "type", "file",
+ "editionset", "series",
+ "chapter",
+ "month",
+ "address",
+ "doi", "url", "note",
+ },
+}
+
+-- a work that is printed and bound, but without a named publisher or sponsoring institution.
+
+categories.booklet = {
+ sets = {
+ publisher = { "howpublished" }, -- no "publisher"!
+ },
+ required = {
+ "author",
+ "title",
+ },
+ optional = {
+ "publisher",
+ "collaboration",
+ "year", "month",
+ "subtitle", "type", "file",
+ "address",
+ "doi", "url", "note",
+ },
+}
+
+-- the proceedings of a conference.
+
+categories.proceedings = {
+ sets = {
+ author = { "editor", "organization", "publisher" }, -- no "author"!
+ publisher = { "publisher", "organization" },
+ editionset = generic.editionset,
+ },
+ required = {
+ "author",
+ "year"
+ },
+ optional = {
+ "collaboration",
+ "publisher",
+ "title", "subtitle", "file",
+ "editionset", "series",
+ "month",
+ "address",
+ "doi", "url", "note",
+ },
+}
+
+-- an article in a conference proceedings.
+
+categories.inproceedings = {
+ sets = categories.incollection.sets,
+ required = categories.incollection.required,
+ optional = {
+ "collaboration",
+ "title", "subtitle", "type", "file",
+ "month",
+ "edition", "series",
+ "address", "organization",
+ "doi", "url", "note",
+ },
+}
+
+categories.conference = categories.inproceedings
+
+-- a thesis (of course).
+
+categories.thesis = {
+ required = {
+ "author",
+ "title",
+ "school",
+ "year",
+ "type"
+ },
+ optional = {
+ "collaboration",
+ "subtitle", "file",
+ "month",
+ "address",
+ "doi", "url", "note",
+ },
+}
+
+categories.mastersthesis = {
+ sets = categories.thesis.sets,
+ required = {
+ "author",
+ "title",
+ "school",
+ "year"
+ },
+ optional = {
+ "collaboration",
+ "type",
+ "subtitle", "file",
+ "month",
+ "address",
+ "doi", "url", "note",
+ },
+}
+categories.phdthesis = categories.mastersthesis
+
+-- a report published by a school or other institution, usually numbered within a series.
+
+categories.techreport = {
+ sets = {
+ author = { "author", "institution", "publisher" },
+ publisher = { "publisher", "institution", },
+ editionset = { "type", "volume", "number", "pages" }, -- no "edition"!
+ },
+ required = {
+ "author",
+ "title",
+ "institution",
+ "year"
+ },
+ optional = {
+ "collaboration",
+ "publisher",
+ "address",
+ "subtitle", "file",
+ "editionset",
+ "month",
+ "doi", "url", "note",
+ },
+}
+
+-- technical documentation.
+
+categories.manual = {
+ sets = {
+ author = { "author", "organization", "publisher" },
+ publisher = { "publisher", "organization", },
+ editionset = generic.editionset,
+ },
+ required = {
+ "title"
+ },
+ optional = {
+ "author", "publisher",
+ "collaboration",
+ "address",
+ "subtitle", "file",
+ "editionset", "month", "year",
+ "doi", "url", "note",
+ },
+}
+
+-- a patent (of course).
+
+categories.patent = {
+ sets = {
+ author = { "author", "assignee", },
+ publisher = { "publisher", "assignee", },
+ year = { "year", "yearfiled", },
+ month = { "month", "monthfiled", },
+ day = { "day", "dayfiled", },
+ },
+ required = {
+ "nationality",
+ "number",
+ "year",
+ },
+ optional = {
+ "type",
+ --check this: "language",
+ "author", "publisher",
+ "collaboration",
+ "title", "subtitle", "file",
+ "address",
+ "day", "month",
+ "doi", "url", "note",
+ },
+}
+
+-- a document having an author and title, but not formally published.
+
+categories.unpublished = {
+ required = {
+ "author",
+ "title",
+ "note"
+ },
+ optional = {
+ "collaboration",
+ "subtitle", "file",
+ "year", "month",
+ "doi", "url",
+ },
+}
+
+-- like misc below but includes organization.
+
+categories.electronic = {
+ required = {
+ "title"
+ },
+ optional = {
+ "subtitle", "type", "file",
+ "year", "month",
+ "author",
+ "collaboration",
+ "address",
+ "organization",
+ "howpublished",
+ "doi", "url", "note",
+ },
+}
+
+-- use this type when nothing else fits.
+
+categories.misc = {
+ required = {
+ -- nothing is really important here
+ },
+ optional = {
+ "author",
+ "collaboration",
+ "title", "subtitle", "file",
+ "year", "month",
+ "howpublished",
+ "doi", "url", "note",
+ },
+}
+
+-- other (whatever jabref does not know!)
+
+categories.other = {
+ required = {
+ "author",
+ "title",
+ "year"
+ },
+ optional = {
+ "collaboration",
+ "subtitle", "file",
+ "doi", "url", "note",
+ },
+}
+
+-- if all else fails to match:
+
+categories.literal = {
+ sets = {
+ author = { "key" }, -- need to check this!
+ },
+ required = {
+ "text"
+ },
+ optional = {
+ "author",
+ "doi", "url", "note"
+ },
+ virtual = false,
+}
+
+-- done
+
+return specification
diff --git a/Master/texmf-dist/tex/context/base/publ-imp-aps.mkvi b/Master/texmf-dist/tex/context/base/publ-imp-aps.mkvi
new file mode 100644
index 00000000000..3bc2a1d2184
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/publ-imp-aps.mkvi
@@ -0,0 +1,1156 @@
+%D \module
+%D [ file=publ-imp-aps,
+%D version=2015.03.22,
+%D title=APS bibliography style,
+%D subtitle=Publications,
+%D author=Alan Braslau and Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is therefore copyrighted
+%D by \PRAGMA. See mreadme.pdf for details.
+
+\startbtxrenderingdefinitions[aps]
+
+%D Reference:
+%D \startTEX
+%D @Book{APS2011,
+%D title ={Physical Review Style and Notation Guide}
+%D year ={2011},
+%D month ={June}
+%D edition ={Revised},
+%D editor ={Waldron, A and Judd, P. and Miller, V.},
+%D address ={Ridge, NY},
+%D publisher={American Physical Society},
+%D pages ={26},
+%D url ={http://journals.aps.org/files/styleguide-pr.pdf}
+%D }
+%D \stopTEX
+
+% set ALL specific APS compliant values
+
+\definebtx
+ [aps]
+ [\c!default=default,
+ \c!specification=aps,
+ \c!otherstext={\space\btxlabeltext{aps:others}},
+ \c!etallimit=10,
+ \c!etaldisplay=\btxparameter\c!etallimit,
+ %c!journalconversion=\v!normal,
+ \c!monthconversion=\v!month,
+ optionaltitle=\v!yes,
+ \c!separator:names:2={,\space},
+ \c!separator:names:3={,\space\btxlabeltext{aps:and}\space}, % not \textampersand
+ \c!separator:names:4= {\space\btxlabeltext{aps:and}\space}] % not \textampersand
+
+% First, define and set list and rendering parameters
+
+\definebtxrendering
+ [aps]
+ [\c!specification=aps]
+
+\definebtx
+ [aps:list]
+ [aps]
+ [\c!authorconversion=normalshort]
+
+\definebtx
+ [aps:list:author]
+ [aps:list]
+
+\definebtx
+ [aps:list:editor]
+ [aps:list:author]
+
+\definebtx
+ [aps:list:suffix]
+ [aps:list]
+
+\definebtx
+ [aps:list:url]
+ [aps:list]
+
+\definebtx
+ [aps:list:doi]
+ [aps:list]
+
+\definebtx
+ [aps:list:invertedshort]
+ [aps:list]
+
+% This is for numbering=num
+
+\definebtx
+ [aps:list:num]
+ [aps:list]
+ [left={[},
+ right={]}]
+
+% This is for numbering=yes
+
+\definebtx
+ [aps:list:yes]
+ [aps:list:num]
+
+% This is for numbering=short
+
+\definebtx
+ [aps:list:short]
+ [aps:list:num]
+
+% This is for numbering=bib
+
+\definebtx
+ [aps:list:bib]
+ [aps:list:num]
+
+%D In order to be able to get journals expanded (or normalized or abbreviated) you need
+%D to load a list:
+%D
+%D \starttyping
+%D \btxloadjournallist[journals.txt] % the jabref list
+%D \stoptyping
+
+% TODO
+
+\definebtx
+ [aps:list:journal]
+ [\c!style=\v!italic]
+ %command=\btxexpandedjournal] % btxabbreviatedjournal
+
+\definebtx
+ [aps:list:volume]
+ [\c!style=\v!bold]
+
+\definebtx
+ [aps:list:title]
+ [\c!style=\v!italic,
+ \c!command=\Word]
+
+\definebtx
+ [aps:list:title:article]
+ [aps:list:title]
+ [\c!style=] % journal is set in italics
+
+\definebtx
+ [aps:list:title:magazine]
+ [aps:list:title]
+
+\definebtx
+ [aps:list:title:newspaper]
+ [aps:list:title]
+
+\definebtx
+ [aps:list:title:periodical]
+ [aps:list:title]
+
+\definebtx
+ [aps:list:title:standard]
+ [aps:list:title]
+
+\definebtx
+ [aps:list:title:book]
+ [aps:list:title]
+
+\definebtx
+ [aps:list:title:inbook]
+ [aps:list:title]
+
+\definebtx
+ [aps:list:title:incollection]
+ [aps:list:title]
+ [\c!style=] % booktitle is set in italics
+
+\definebtx
+ [aps:list:title:proceedings]
+ [aps:list:title]
+
+\definebtx
+ [aps:list:title:inproceedings]
+ [aps:list:title]
+ [\c!style=] % booktitle is set in italics
+
+\definebtx
+ [aps:list:title:conference]
+ [aps:list:title]
+ [\c!style=] % booktitle is set in italics
+
+\definebtx
+ [aps:list:title:thesis]
+ [aps:list:title]
+
+\definebtx
+ [aps:list:title:phdthesis]
+ [aps:list:title]
+
+\definebtx
+ [aps:list:title:mastersthesis]
+ [aps:list:title]
+
+\definebtx
+ [aps:list:title:booklet]
+ [aps:list:title]
+
+\definebtx
+ [aps:list:title:manual]
+ [aps:list:title]
+
+\definebtx
+ [aps:list:title:techreport]
+ [aps:list:title]
+
+\definebtx
+ [aps:list:title:unpublished]
+ [aps:list:title]
+
+\definebtx
+ [aps:list:title:patent]
+ [aps:list:title]
+
+\definebtx
+ [aps:list:title:electronic]
+ [aps:list:title]
+
+\definebtx
+ [aps:list:title:other]
+ [aps:list:title]
+
+\definebtx
+ [aps:list:title:misc]
+ [aps:list:title]
+
+\definebtx
+ [aps:list:title:literal]
+ [aps:list:title]
+
+\definebtx
+ [aps:list:type]
+ [\c!command=\Word]
+
+% We define [page] settings in the aps namespace, inheriting the root
+% settings, in order to eventually allow for modifications without touching
+% root.
+
+\definebtx
+ [aps:page]
+ [\s!page]
+
+\definebtx
+ [aps:page:list]
+ [aps:page]
+ [\c!command={\wordright}]
+
+% Then define and set all cite parameters
+
+\definebtx
+ [aps:cite]
+ [aps]
+ [\c!authorconversion=\v!name]
+
+\definebtx
+ [aps:cite:author]
+ [aps:cite]
+
+\definebtx
+ [aps:cite:authoryear]
+ [aps:cite:author]
+ [\c!left={(},
+ \c!right={)},
+ \c!inbetween={,\space}]
+
+\definebtx
+ [aps:cite:authoryears]
+ [aps:cite:authoryear]
+ [\c!left=,
+ \c!right=,
+ \c!inbetween={\space}]
+
+\definebtx
+ [aps:cite:authornum]
+ [aps:cite:author]
+ [\c!left={(},
+ \c!right={)},
+ \c!sorttype=authornum]
+
+\definebtx
+ [aps:cite:authorref]
+ [aps:cite:authornum]
+
+\definebtx
+ [aps:cite:author:num] % todo
+ [aps:cite:authornum]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtx
+ [aps:cite:author:year] % todo
+ [aps:cite:authoryear]
+ [\c!left=,
+ \c!right=]
+
+\definebtx
+ [aps:cite:author:years] % todo
+ [aps:cite:authoryears]
+ [\c!inbetween=,
+ \c!left=(,
+ \c!right=)]
+
+\definebtx
+ [aps:cite:year]
+ [aps:cite]
+ [\c!compress=\v!yes,
+ \c!sorttype=year]
+
+\definebtx
+ [aps:cite:title]
+ [aps:cite]
+ [\c!command={\language[\currentbtxlanguage]}, % BAH
+ \c!style=\v!italic]
+
+\definebtx
+ [aps:cite:booktitle]
+ [aps:cite:title]
+
+\definebtx
+ [aps:cite:tag]
+ [aps:cite]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtx
+ [aps:cite:key]
+ [aps:cite:tag]
+
+\definebtx
+ [aps:cite:serial]
+ [aps:cite]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtx
+ [aps:cite:page]
+ [aps:cite]
+ [\c!left=,
+ \c!right=,
+ [\c!separator:2={,\space}, % :0 and :1 - between items of a list
+ \c!separator:3={,\space\btxlabeltext{aps:and}\space}, % not \textampersand
+ \c!separator:4= {\space\btxlabeltext{aps:and}\space}] % not \textampersand
+
+\definebtx
+ [aps:cite:pages]
+ [aps:cite:page]
+
+\definebtx
+ [aps:cite:keywords]
+ [aps:cite]
+ [\c!left={(},
+ \c!right={)}]
+
+\definebtx
+ [aps:cite:invertedshort]
+ [aps:cite]
+
+\definebtx
+ [aps:cite:short]
+ [aps:cite]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtx
+ [aps:cite:category]
+ [aps:cite]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtx
+ [aps:cite:type]
+ [aps:cite:category]
+
+\definebtx
+ [aps:cite:url]
+ [aps:cite]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtx
+ [aps:cite:doi]
+ [aps:cite:url]
+
+\definebtx
+ [aps:cite:num]
+ [aps:cite]
+ [\c!compress=\v!yes,
+ \c!left={[},
+ \c!right={]},
+ %\c!left=, % TODO: PRB uses superscript references...
+ %\c!right=, % and after punctuation, PRA, C, D, E, and L are before!
+ %\c!command={\high},
+ \c!separator:2={,}, % no space
+ \c!separator:3=\btxparameter{\c!separator:2},
+ \c!separator:4=\btxparameter{\c!separator:2}]
+
+\definebtx
+ [aps:cite:default]
+ [aps:cite:num]
+
+\definebtx
+ [aps:cite:textnum]
+ [aps:cite:num]
+ [\c!left={Ref.\nbsp},
+ \c!command=,
+ \c!separator:2={,\space},
+ \c!separator:3={\space\btxlabeltext{aps:and}\space},
+ \c!separator:4={\space\btxlabeltext{aps:and}\space}]
+
+\definebtx
+ [aps:cite:entry]
+ [aps:cite]
+ [\c!left=,
+ \c!right=,
+ \c!inbetween={\space},
+ \c!separator:2={;\space},
+ \c!separator:3=\btxparameter{\c!separator:2},
+ \c!separator:4=\btxparameter{\c!separator:2}]
+
+%D Sometimes we have verbose injections in an entry and these can be language
+%D dependent, so we use labels.
+%D
+%D Because we want to mix rendering (in the manual) we need a namespace in label
+%D texts:
+
+\setupbtxlabeltext
+ [en]
+ [aps:and=and,
+ aps:number={no.},
+ aps:edition={ed.},
+ aps:Editor={Ed.},
+ aps:Editors={Eds.},
+ aps:Volume={Vol.},
+ aps:Volumes={Vols.},
+ aps:others={et al.},
+ aps:page={p.},
+ aps:pages={pp.},
+ aps:mastersthesis={Master's thesis},
+ aps:phdthesis={Doctoral dissertation},
+ aps:technicalreport={Tech. Rep.}, % Technical report
+ aps:supplement={Suppl.}, % Supplement (not used?)
+ aps:patent=Patent,
+ aps:inpress={in press},
+ aps:tobe={to be published},
+ aps:unpublished={unpublished},
+ aps:In=In]
+
+% Check this (google translate!!):
+
+\setupbtxlabeltext
+ [nl]
+ [aps:and=en,
+ aps:number={nr.},
+ aps:edition={ed.}, % editie
+ aps:Editor=Editor, % Ed./Eds.
+ aps:Editors=Editors,
+ aps:Volume={Vol.},
+ aps:Volumes={Vols.},
+ aps:others={et al.},
+ aps:page={p.},
+ aps:pages={pp.},
+ aps:mastersthesis=Masterproef,
+ aps:phdthesis=Proefschrift,
+ aps:technicalreport={Technisch rapport}, % Technical report
+ aps:supplement=Supplement,
+ aps:patent=Octrooi,
+ aps:inpress={in press}, % CHECK THESE!
+ aps:tobe={worden gepubliceerd},
+ aps:unpublished={onuitgegeven},
+ aps:In=In]
+
+\setupbtxlabeltext
+ [fr]
+ [aps:and=et,
+ aps:others={et al.},
+ aps:number={n\high{o}},
+ aps:edition={édition},
+ aps:Editor=Éditeur,
+ aps:Editors=Éditeurs,
+ aps:Volume=Volume,
+ aps:Volumes=Volumes,
+ aps:others={et al.},
+ aps:page={p.},
+ aps:pages={pp.},
+ aps:mastersthesis={Thèse de master (DEA, DESS, master)},
+ aps:phdthesis={Thèse de doctorat},
+ aps:technicalreport={Rapport technique},
+ aps:supplement=Supplément,
+ aps:patent=Brevet,
+ aps:inpress={sous impression},
+ aps:tobe={à paraître},
+ aps:unpublished={inédit}, % pour un livre
+ aps:In=Dans]
+
+\setupbtxlabeltext
+ [de]
+ [aps:and=und,
+ aps:number={nr.},
+ aps:edition=Auf\/lage,
+ aps:Editor=Herausgeber, % Hrsg./Hg.
+ aps:Editors=Herausgeber,
+ aps:Volume=Band, % Bd.
+ aps:Volumes={Bände},
+ aps:others={et al.},
+ aps:page={S.},
+ aps:pages={S.},
+ aps:mastersthesis={Masterarbeit},
+ aps:phdthesis={Dissertation},
+ aps:technicalreport={Technischer Bericht},
+ aps:supplement={Beilage}, % Supplement
+ aps:patent=Patent,
+ aps:inpress={in der Presse}, % CHECK THESE!
+ aps:tobe={veröffentlicht werden},
+ aps:unpublished={unveröffentlicht},
+ aps:In=In]
+
+% thanks: Andrea Valle
+
+\setupbtxlabeltext
+ [it]
+ [aps:and=e,
+ aps:number={nº},
+ aps:edition={ed.}, % edizione
+ aps:Editor={A cura di},
+ aps:Editors={A cura di},
+ aps:Volume={Vol.}, % Volume
+ aps:Volumes={Vol.}, % Volumi
+ aps:others={et al.},
+ aps:page={p.},
+ aps:pages={pp.},
+ aps:mastersthesis={Tesi di laurea},
+ aps:phdthesis={Tesi di dottorato},
+ aps:technicalreport={Relazione tecnica},
+ aps:supplement={Supplemento},
+ aps:patent=Brevetto,
+ aps:inpress={in press}, % CHECK THESE!
+ aps:tobe={da pubblicare},
+ aps:unpublished={inedito},
+ aps:In=In]
+
+\setupbtxlabeltext
+ [es]
+ [aps:and=y,
+ aps:number={nº},
+ aps:edition={ed.}, % edición
+ aps:Editor=Editor, % Ed./Eds.
+ aps:Editors=Editores,
+ aps:Volume={Vol.}, % Volumen
+ aps:Volumes={Vols.}, % Volúmenes
+ aps:others={et al.},
+ aps:page={p.},
+ aps:pages={pp.},
+ aps:mastersthesis={Tesis de maestría},
+ aps:phdthesis={Tesis doctoral},
+ aps:technicalreport={Informe técnico},
+ aps:supplement=Suplemento,
+ aps:patent=Patente,
+ aps:inpress={en prensa}, % CHECK THESE!
+ aps:tobe={que se publicará},
+ aps:unpublished={inédito},
+ aps:In=En]
+
+% cite setups
+
+\startsetups btx:aps:nd
+ \doifelse {\currentbtxcategory} {article} {
+ \btxlabeltext{aps:tobe}
+ } {
+ \doifelse {\currentbtxcategory} {book} {
+ \btxlabeltext{aps:inpress}
+ } {
+ \btxlabeltext{aps:unpublished}
+ }
+ }
+\stopsetups
+
+\startsetups btx:aps:cite:author:year
+ \texdefinition{\s!btx:\s!cite:concat}
+ \ifx\currentbtxfirst\empty
+ \fastsetup{btx:aps:nd}
+ \else
+ \texdefinition {\s!btx:\s!cite:inject} {
+ \btxcitereference
+ \currentbtxfirst
+ }
+ \ifx\currentbtxsecond\empty \else
+ \btxparameter\v!inbetween
+ \texdefinition {\s!btx:\s!cite:inject} {
+ \currentbtxsecond
+ }
+ \fi
+ \ifx\currentbtxthird\empty \else
+ \texdefinition {\s!btx:\s!cite:inject} {
+ \currentbtxthird
+ }
+ \fi
+ \fi
+\stopsetups
+
+\startsetups btx:aps:cite:author:years
+ \fastsetup{btx:aps:cite:author:year}
+\stopsetups
+
+\startsetups [btx:aps:page:list]
+ \fastsetup{\s!btx:\s!page:concat}
+ \ifx\currentbtxlastpage\empty
+ \btxlabeltext{aps:page}
+ \else
+ \btxlabeltext{aps:pages}
+ \fi
+ \btxnbsp
+ \ifconditional\btxinteractive
+ \goto {
+ \currentbtxfirstpage
+ } [
+ internal(\currentbtxfirstinternal)
+ ]
+ \ifx\currentbtxlastpage\empty \else
+ \btxparameter\c!pageconnector
+ \goto {
+ \currentbtxlastpage
+ } [
+ internal(\currentbtxlastinternal)
+ ]
+ \fi
+ \else
+ \currentbtxfirstpage
+ \ifx\currentbtxlastpage\empty \else
+ \btxparameter\c!pageconnector
+ \currentbtxlastpage
+ \fi
+ \fi
+\stopsetups
+
+%D Instead of texdefinitions without arguments, we could have used setups but in my
+%D editor (hh, scite) the commands stand out better. It also saves an additional
+%D component in the name (e.g. common:) because commands and setups have a different
+%D namespace, so similar calls don't clash. Performance of definitions is somewhat
+%D better.
+
+%D We use "texdefinitions" (with eventual arguments) for helpers that are used
+%D in the rendering "setups" defined for each category below.
+
+%D Note that \btxdoif... and \btxflush rely on the definitions in
+%D publ-imp-aps.lua: fields that are not listed as required nor optional are
+%D IGNORED. We also make heavy use of the notion of sets - comma-separated lists
+%D of alternative fields to be used in hierarchal order. For example:
+%D author = { "author", "editor", "publisher", "title" }, will return the
+%D author field if it exists; if not, the editor field will be returned, if it
+%D exists; if not, the publisher field will be returned, if it exists; if not,
+%D the title field will be returned, it it exists; if not, nothing will be
+%D returned. In lua syntax, it can be understood as
+%D author or editor or publisher or title or ""
+
+\starttexdefinition btx:aps:composed-title #title
+ \begingroup
+ \language[\currentbtxlanguage]
+ \btxusecommand[aps:list:title:\currentbtxcategory] {
+ \btxflush{#title}
+ \btxdoif {sub#title} {
+ \btxcolon
+ \btxflush{sub#title}
+ }
+ }
+ \endgroup
+\stoptexdefinition
+
+\starttexdefinition btx:aps:title
+ \btxdoif {title} {
+ % we make the title active, opening file
+ \btxdoifelse {file} {
+ \texdefinition{btx:format:inject}
+ {url(file:\btxflush{file})}
+ {
+ \btxstartstyleandcolor [aps:list:title:\currentbtxcategory]
+ \texdefinition{btx:aps:composed-title}{title}
+ \btxstopstyleandcolor
+ }
+ } {
+ \btxstartstyleandcolor [aps:list:title:\currentbtxcategory]
+ \texdefinition{btx:aps:composed-title}{title}
+ \btxstopstyleandcolor
+ }
+ \btxcomma
+ }
+\stoptexdefinition
+
+\starttexdefinition btx:aps:optional-title
+ \doif{\btxparameter{optionaltitle}}\v!yes {
+ \texdefinition {btx:aps:title}
+ }
+\stoptexdefinition
+
+\starttexdefinition btx:aps:year
+ \btxdoifelse {year} {
+ \btxflush{year}
+ } {
+ \fastsetup{btx:aps:nd}
+ }
+\stoptexdefinition
+
+% #author may be author(set) or editor
+
+\starttexdefinition btx:aps:author-or-editor #author
+ \btxdoif {#author} {
+ \btxflush{#author}
+ \doifelse {\btxfoundname{#author}} {editor} {
+ \btxleftparenthesis
+ \btxsingularorplural {editor} {
+ \btxlabeltext{aps:Editor}
+ } {
+ \btxlabeltext{aps:Editors}
+ }
+ \btxrightparenthesis
+ } {
+ \btxdoif {collaboration} {
+ \btxleftparenthesis
+ \btxflush{collaboration}
+ \btxrightparenthesis
+ }
+ }
+ }
+\stoptexdefinition
+
+\starttexdefinition btx:aps:author
+ \btxflush{author}
+ \btxcomma
+\stoptexdefinition
+
+\starttexdefinition btx:aps:editor-in
+ \btxdoif {booktitle} {
+ \btxlabeltext{aps:In}
+ \doifnot {\btxfoundname{author}} {editor} {
+ \btxspace
+ \texdefinition{btx:aps:author-or-editor} {editor}
+ }
+ \btxspace
+ \btxstartstyleandcolor[aps:list:title]
+ \texdefinition{btx:aps:composed-title} {booktitle}
+ \btxstopstyleandcolor
+ \btxcomma
+ }
+\stoptexdefinition
+
+\starttexdefinition btx:aps:editionset
+ \doif {\currentbtxcategory} {techreport} {
+ \btxdoifelse {type} {
+ \btxusecommand[\currentbtx:type] {
+ \btxflush{type}
+ }
+ } {
+ \btxlabeltext{aps:technicalreport}
+ }
+ \btxcomma
+ }
+ \btxdoif {volume} {
+ \btxoneorrange {volume} {
+ \btxlabeltext{aps:Volume}
+ } {
+ \btxlabeltext{aps:Volumes}
+ }
+ \btxspace
+ \btxflush{volume}
+ \btxcomma
+ }
+ \btxdoif {number} {
+ \btxlabeltext{aps:number}
+ \btxspace
+ \btxflush{number}
+ \btxcomma
+ }
+ \btxdoif {edition} {
+ \btxflush{edition}
+ \btxspace
+ \btxlabeltext{aps:edition}
+ \btxcomma
+ }
+ \btxdoif {pages} {
+ \btxoneorrange {pages} {
+ \btxlabeltext{aps:page}
+ } {
+ \btxlabeltext{aps:pages}
+ }
+ \btxnbsp
+ \btxflush{pages}
+ \btxcomma
+ }
+\stoptexdefinition
+
+\starttexdefinition btx:aps:journal-volume-year
+ \btxdoif {journal} {
+ % expandedjournal abbreviatedjournal
+ \btxflush{expandedjournal -> journal}
+ \btxdoifelse {volume} {
+ \btxspace
+ \btxstartstyleandcolor [aps:list:volume]
+ \btxflush{volume}
+ \btxstopstyleandcolor
+ \btxdoif {number} {
+ \removeunwantedspaces(
+ \btxflush{number}
+ \btxrightparenthesiscomma
+ }
+ } {
+ \btxdoif {number} {
+ \btxspace
+ \btxflush{number}
+ \btxcomma
+ }
+ }
+ \btxdoif {pages} {
+ \btxspace
+ \btxflush{pages}
+ }
+ \btxleftparenthesis
+ \texdefinition{btx:aps:year}
+ \btxrightparenthesis
+ }
+\stoptexdefinition
+
+\starttexdefinition btx:aps:publisher-wherefrom-year
+ \removeunwantedspaces
+ \removepunctuation
+ \btxleftparenthesis
+ \btxflush{publisher}
+ \btxdoifelse {address} {
+ \btxdoif {publisher} {
+ \btxcomma
+ }
+ \btxflush{address}
+ \btxdoif {country} {
+ \btxcomma
+ \btxflush{country}
+ }
+ \btxcomma
+ } {
+ \btxdoif {publisher} {
+ \btxcomma
+ }
+ }
+ \texdefinition{btx:aps:year}
+ \btxrightparenthesis
+\stoptexdefinition
+
+\starttexdefinition btx:aps:note
+ \btxperiod
+ \btxdoif {note} {
+ \btxleftparenthesis
+ \btxflush{note}
+ \btxrightparenthesis
+ }
+\stoptexdefinition
+
+\starttexdefinition btx:aps:doi-url #text
+ \ifconditional\btxinteractive
+ \btxdoifelse {doi} {
+ \goto {#text} [url(http://dx.doi.org/\btxflush{doi})]
+ } {
+ \btxdoifelse {url} {
+ \goto {#text} [url(\btxflush{url})]
+ } {
+ #text
+ }
+ }
+ \else
+ #text
+ \fi
+
+\stoptexdefinition
+
+% Then setups, by category
+
+% An article from a journal
+% Required fields: author or editor or title, journal, (year).
+% Optional fields: volume, number, pages, type, doi, url, note.
+% Note that bibtex (and tools) do not include editor (e.g. special issue or section)
+
+\startsetups btx:aps:list:article
+ \texdefinition{btx:aps:author}
+ \texdefinition{btx:aps:optional-title}
+ \texdefinition{btx:aps:doi-url} {\texdefinition{btx:aps:journal-volume-year}}
+ \texdefinition{btx:aps:note}
+\stopsetups
+
+% An article from a magazine.
+% Required fields: author or title, journal, (year).
+% Optional fields: number, pages, type, month, day, doi, url, note.
+
+\startsetups btx:aps:list:magazine
+ \fastsetup{btx:aps:list:article}
+\stopsetups
+
+% An article from a newspaper.
+% Required fields: author or title, journal, (year).
+% Optional fields: number, pages, type, month, day, doi, url, note.
+
+\startsetups btx:aps:list:newspaper
+ \fastsetup{btx:aps:list:article}
+\stopsetups
+
+% A complete issue of a periodical, such as a special issue of a journal.
+% Required fields: title, year
+% Optional fields: editor, publisher, subtitle, series, volume, number, month, organization, doi, url, issn, note
+
+% needs to be tuned...
+\startsetups btx:aps:list:periodical
+ \fastsetup{btx:aps:list:article}
+\stopsetups
+
+% National and international standards issued by a standards body
+% Required fields: author, institution, or organization, year, title
+% Optional fields: subtitle, doi, url, note
+
+\startsetups btx:aps:list:standard
+ \texdefinition{btx:aps:author}
+ \texdefinition{btx:aps:title}
+ \texdefinition{btx:aps:note}
+\stopsetups
+% year?
+
+% A book with an explicit publisher.
+% Required fields: author or editor or publisher, title, (year).
+% Optional fields: volume or number, series, address, edition, month, day, note.
+% APS? ignores: month, day
+
+% todo: series?
+
+\startsetups btx:aps:list:book
+ \texdefinition{btx:aps:author}
+ \texdefinition{btx:aps:title}
+ \texdefinition{btx:aps:editionset}
+ \texdefinition{btx:aps:doi-url} {\texdefinition{btx:aps:publisher-wherefrom-year}}
+ \texdefinition{btx:aps:note}
+\stopsetups
+
+% There is some debate about how inbook should differ from incollection
+
+% A part of a book, which may be a chapter (or section or whatever) and/or a range of pages.
+% (note that inbook is handled differently by bibtex and biblatex)
+% Required fields: author or editor, title, chapter and/or pages, publisher, year.
+% Optional fields: volume or number, series, type, address, edition, month, note.
+% We add optional: booktitle.
+% APS? ignores: chapter, month
+
+\startsetups btx:aps:list:inbook
+ \texdefinition{btx:aps:author}
+ \texdefinition{btx:aps:title}
+ \texdefinition{btx:aps:editor-in}
+ \texdefinition{btx:aps:editionset}
+ \texdefinition{btx:aps:doi-url} {\texdefinition{btx:aps:publisher-wherefrom-year}}
+ \texdefinition{btx:aps:note}
+\stopsetups
+% chapter?
+
+% A part of a book having its own title.
+% Required fields: author, title, booktitle, publisher, year.
+% Optional fields: editor, volume or number, series, type, chapter, pages, address, edition, month, note.
+% APS? ignores: chapter, month
+
+\startsetups btx:aps:list:incollection
+ \fastsetup{btx:aps:list:inbook}
+\stopsetups
+
+% The proceedings of a conference.
+% Required fields: title, year.
+% Optional fields: editor, volume or number, series, address, month, organization, publisher, note.
+% todo: series?
+
+\startsetups btx:aps:list:proceedings
+ \fastsetup{btx:aps:list:book}
+\stopsetups
+
+% An article in a conference proceedings.
+% Required fields: author, title, booktitle, year.
+% Optional fields: editor, volume or number, series, pages, address, month, organization, publisher, note.
+
+\startsetups btx:aps:list:inproceedings
+ \texdefinition{btx:aps:author}
+ \texdefinition{btx:aps:title}
+ \texdefinition{btx:aps:editor-in}
+ \texdefinition{btx:aps:editionset}
+ \btxdoif {organization} {
+ \btxspace
+ \btxflush{organization}
+ \btxcomma
+ }
+ \texdefinition{btx:aps:doi-url} {\texdefinition{btx:aps:publisher-wherefrom-year}}
+ \texdefinition{btx:aps:note}
+\stopsetups
+
+\startsetups btx:aps:list:conference
+ \fastsetup{btx:aps:list:inproceedings}
+\stopsetups
+
+% A thesis.
+% Required fields: author, title, school, year.
+% Optional fields: type, address, month, note.
+
+\startsetups btx:aps:list:thesis
+ \texdefinition{btx:aps:author}
+ \texdefinition{btx:aps:title}
+ \btxleftparenthesis
+ \btxdoifelse {type} {
+ \btxusecommand[aps:list:type] {
+ \btxflush{type}
+ }
+ } {
+ \btxlabeltext{aps:\currentbtxcategory}
+ }
+ \btxrightparenthesis
+ \btxdoif {school} {
+ \btxperiod
+ \btxflush{school}
+ }
+ \btxdoif {address} {
+ \btxdoifelse {school} {
+ \btxcomma
+ } {
+ \btxperiod
+ }
+ \btxflush{address}
+ \btxdoif {country} {
+ \btxcomma
+ \btxflush{country}
+ }
+ }
+ \btxperiod
+ \texdefinition{btx:aps:note}
+\stopsetups
+
+\startsetups btx:aps:list:phdthesis
+ \fastsetup{btx:aps:list:thesis}
+\stopsetups
+
+\startsetups btx:aps:list:mastersthesis
+ \fastsetup{btx:aps:list:thesis}
+\stopsetups
+
+% A work that is printed and bound, but without a named publisher or sponsoring institution.
+% Required field: title.
+% Optional fields: author, howpublished, address, month, year, note.
+
+\startsetups btx:aps:list:booklet
+ \fastsetup{btx:aps:list:book}
+\stopsetups
+
+% Technical documentation.
+% Required field: title.
+% Optional fields: author, organization, address, edition, month, year, note.
+
+\startsetups btx:aps:list:manual
+ \fastsetup{btx:aps:list:book}
+\stopsetups
+
+% A report published by a school or other institution, usually numbered within a series.
+% Required fields: author, title, institution, year.
+% Optional fields: type, number, address, month, note.
+
+\startsetups btx:aps:list:techreport
+ \fastsetup{btx:aps:list:book}
+\stopsetups
+
+% A document having an author and title, but not formally published.
+% Required fields: author, title, note.
+% Optional fields: month, year.
+
+\startsetups btx:aps:list:unpublished
+ \fastsetup{btx:aps:list:book}
+\stopsetups
+
+% A patent. Note that this category was not defined with BIBTEX. Below from JabRef:
+% Required fields: nationality, number, year, yearfiled
+% Optional fields: author, title, assignee, address, type, number, day, dayfiled, month, monthfiled, note, url
+% Also optional: publisher
+
+% todo: yearfiled, monthfiled, dayfiled
+
+\startsetups btx:aps:list:patent
+ \texdefinition{btx:aps:author}
+ \texdefinition{btx:aps:title}
+ \begingroup
+ \it
+ \btxdoif {nationality} {
+ \btxspace
+ \btxflush{nationality}
+ }
+ \btxspace
+ \btxlabeltext{aps:patent}
+ \btxdoif {number} {
+ \btxspace
+ \btxlabeltext{aps:number}
+ \btxspace
+ \btxflush{number}
+ }
+ \btxperiod
+ \italiccorrection
+ \endgroup
+ \texdefinition{btx:aps:doi-url} {\texdefinition{btx:aps:publisher-wherefrom-year}}
+ \texdefinition{btx:aps:url}
+ \texdefinition{btx:aps:note}
+\stopsetups
+
+% Electronic. Note that this category was not defined with BIBTEX. Below from JabRef:
+% Required fields: title
+% Optional fields: address, author, howpublished, month, note, organization, url, year, doi
+% Also optional: type
+
+% Like Misc below but includes organization.
+
+\startsetups btx:aps:list:electronic
+ \texdefinition{btx:aps:author}
+ \texdefinition{btx:aps:title}
+ \btxdoif {organization} {
+ \btxspace
+ \btxflush{organization}
+ \btxperiod
+ }
+ \btxdoif {howpublished} {
+ \btxspace
+ \btxflush{howpublished}
+ \btxperiod
+ }
+ \texdefinition{btx:aps:note}
+\stopsetups
+
+% Other. Note that this category was not defined with BIBTEX. Below from JabRef:
+% Required fields: author or title, year
+% Optional fields: note, doi, url
+
+\startsetups btx:aps:list:other
+ \fastsetup{btx:aps:list:book}
+\stopsetups
+
+% Use this type when nothing else fits.
+% Required fields: none.
+% Optional fields: author, title, howpublished, month, year, note.
+
+\startsetups btx:aps:list:misc
+ \texdefinition{btx:aps:author}
+ \texdefinition{btx:aps:title}
+ \btxdoif {howpublished} {
+ \btxspace
+ \btxflush{howpublished}
+ \btxperiod
+ }
+ \texdefinition{btx:aps:note}
+\stopsetups
+
+% If all else fails to match:
+
+\startsetups btx:aps:list:literal
+ %\btxleftparenthesis
+ \removeunwantedspaces(
+ \btxflush{key}
+ \btxrightparenthesis
+ \btxdoif {text} {
+ \btxflush{text}
+ }
+\stopsetups
+
+\stopbtxrenderingdefinitions
diff --git a/Master/texmf-dist/tex/context/base/publ-imp-author.mkvi b/Master/texmf-dist/tex/context/base/publ-imp-author.mkvi
new file mode 100644
index 00000000000..534d8ce0b29
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/publ-imp-author.mkvi
@@ -0,0 +1,303 @@
+% TODO: MAKE default
+
+%D \module
+%D [ file=publ-imp-author,
+%D version=2014.06.23,
+%D title=\CONTEXT\ Publication Support,
+%D subtitle=Authors,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+% these can be used instead of the macros and they accept manipulator prefixes
+%
+% \currentbtxinitials : \btxauthorfield{initials}
+% \currentbtxfirstnames : \btxauthorfield{firstnames}
+% \currentbtxvons : \btxauthorfield{vons}
+% \currentbtxsurnames : \btxauthorfield{surnames}
+% \currentbtxjuniors : \btxauthorfield{juniors}
+
+\starttexdefinition \s!btx:\s!cite:\s!author:\s!de
+ \ifx\currentbtxlanguage\s!de
+ \setmode{\s!btx:\s!de}
+ \fi
+\stoptexdefinition
+
+\startsetups \s!btx:\s!cite:\s!author:concat
+ \ifcase\currentbtxoverflow
+ \btxparameter{\c!separator:names:\number\currentbtxconcat}
+ \else
+ %\btxparameter{\c!separator:names:2}
+ \fi
+\stopsetups
+
+\startsetups \s!btx:\s!cite:\s!author:others
+ \ifcase\currentbtxoverflow \else
+ \btxparameter\c!otherstext
+ \fi
+\stopsetups
+
+\startsetups \s!btx:\s!cite:\s!author:normal
+ \fastsetup{\s!btx:\s!cite:\s!author:concat}
+ \ifx\currentbtxfirstnames\empty \else
+ \currentbtxfirstnames
+ \btxparameter{\c!separator:firstnames}
+ \fi
+ \ifx\currentbtxvons\empty \else
+ \currentbtxvons
+ \ifx\currentbtxsurnames\empty \else
+ \btxparameter{\c!separator:vons}
+ \fi
+ \fi
+ \ifx\currentbtxsurnames\empty \else
+ \currentbtxsurnames
+ \ifx\currentbtxjuniors\empty \else
+ \btxparameter{\c!separator:juniors}
+ \currentbtxjuniors
+ \fi
+ \fi
+ \fastsetup{\s!btx:\s!cite:\s!author:others}
+\stopsetups
+
+\startsetups \s!btx:\s!cite:\s!author:normalshort
+ \fastsetup{\s!btx:\s!cite:\s!author:concat}
+ \ifx\currentbtxinitials\empty \else
+ \currentbtxinitials
+ \btxparameter{\c!separator:initials}
+ \fi
+ \ifx\currentbtxvons\empty \else
+ \currentbtxvons
+ \ifx\currentbtxsurnames\empty \else
+ \btxparameter{\c!separator:vons}
+ \fi
+ \fi
+ \ifx\currentbtxsurnames\empty \else
+ \currentbtxsurnames
+ \ifx\currentbtxjuniors\empty \else
+ \btxparameter{\c!separator:juniors}
+ \currentbtxjuniors
+ \fi
+ \fi
+ \fastsetup{\s!btx:\s!cite:\s!author:others}
+\stopsetups
+
+\startsetups \s!btx:\s!cite:\s!author:inverted
+ \fastsetup{\s!btx:\s!cite:\s!author:concat}
+ \ifx\currentbtxvons\empty \else
+ \texdefinition{\s!btx:\s!cite:\s!author:\s!de}
+ \doifmode {\s!btx:\s!de} {
+ \currentbtxvons
+ \btxparameter{\c!separator:vons}
+ }
+ \fi
+ \ifx\currentbtxsurnames\empty \else
+ \currentbtxsurnames
+ \ifx\currentbtxjuniors\empty \else
+ \btxparameter{\c!separator:juniors}
+ \currentbtxjuniors
+ \fi
+ \fi
+ \ifx\currentbtxfirstnames\empty
+ % firstnames are optional
+ \else
+ \btxparameter{\c!separator:invertedfirstnames}
+ \currentbtxfirstnames
+ \fi
+ \ifx\currentbtxvons\empty \else
+ \doifnotmode {\s!btx:\s!de} {
+ \btxparameter{\c!separator:vons}
+ \currentbtxvons
+ }
+ \fi
+ \fastsetup{\s!btx:\s!cite:\s!author:others}
+\stopsetups
+
+\startsetups \s!btx:\s!cite:\s!author:invertedshort
+ \fastsetup{\s!btx:\s!cite:\s!author:concat}
+ \ifx\currentbtxvons\empty \else
+ \texdefinition{\s!btx:\s!cite:\s!author:\s!de}
+ \doifnotmode {\s!btx:\s!de} {
+ \currentbtxvons
+ \btxparameter{\c!separator:vons}
+ }
+ \fi
+ \ifx\currentbtxsurnames\empty \else
+ \currentbtxsurnames
+ \ifx\currentbtxjuniors\empty \else
+ \btxparameter{\c!separator:juniors}
+ \currentbtxjuniors
+ \fi
+ \fi
+ \ifx\currentbtxinitials\empty
+ % initials are optional
+ \else
+ \btxparameter{\c!separator:invertedinitials}
+ \currentbtxinitials
+ \fi
+ \ifx\currentbtxvons\empty \else
+ \doifmode {\s!btx:\s!de} {
+ \btxparameter{\c!separator:vons}
+ \currentbtxvons
+ }
+ \fi
+ \fastsetup{\s!btx:\s!cite:\s!author:others}
+\stopsetups
+
+\startsetups \s!btx:\s!cite:\s!author:name
+ \fastsetup{\s!btx:\s!cite:\s!author:concat}
+ % is this treated differently in german?
+ \ifx\currentbtxvons\empty \else
+ \currentbtxvons
+ \btxparameter{\c!separator:vons}
+ \fi
+ \currentbtxsurnames
+ \ifcase\currentbtxauthorstate \else
+ % potential clash of names so we force initials
+ \ifx\currentbtxinitials\empty \else
+ \btxparameter{\c!separator:invertedinitials}
+ \currentbtxinitials
+ \fi
+ \fi
+ \fastsetup{\s!btx:\s!cite:\s!author:others}
+\stopsetups
+
+% list (mostly the same)
+
+\startsetups \s!btx:\s!list:\s!author:concat
+ \ifcase\currentbtxoverflow
+ \btxparameter{\c!separator:names:\number\currentbtxconcat}
+ \else
+ \btxparameter{\c!separator:names:2}
+ \fi
+\stopsetups
+
+\startsetups \s!btx:\s!list:\s!author:others
+ \ifcase\currentbtxoverflow \else
+ \btxparameter\c!otherstext
+ \fi
+\stopsetups
+
+\startsetups \s!btx:\s!list:\s!author:normal
+ \fastsetup{\s!btx:\s!list:\s!author:concat}
+ \ifx\currentbtxfirstnames\empty \else
+ \currentbtxfirstnames
+ \btxparameter{\c!separator:firstnames}
+ \fi
+ \ifx\currentbtxvons\empty \else
+ \currentbtxvons
+ \ifx\currentbtxsurnames\empty \else
+ \btxparameter{\c!separator:vons}
+ \fi
+ \fi
+ \ifx\currentbtxsurnames\empty \else
+ \currentbtxsurnames
+ \ifx\currentbtxjuniors\empty \else
+ \btxparameter{\c!separator:juniors}
+ \currentbtxjuniors
+ \fi
+ \fi
+ \fastsetup{\s!btx:\s!list:\s!author:others}
+\stopsetups
+
+\startsetups \s!btx:\s!list:\s!author:normalshort
+ \fastsetup{\s!btx:\s!list:\s!author:concat}
+ \ifx\currentbtxinitials\empty \else
+ \currentbtxinitials
+ \btxparameter{\c!separator:initials}
+ \fi
+ \ifx\currentbtxvons\empty \else
+ \currentbtxvons
+ \ifx\currentbtxsurnames\empty \else
+ \btxparameter{\c!separator:vons}
+ \fi
+ \fi
+ \ifx\currentbtxsurnames\empty \else
+ \currentbtxsurnames
+ \ifx\currentbtxjuniors\empty \else
+ \btxparameter{\c!separator:juniors}
+ \currentbtxjuniors
+ \fi
+ \fi
+ \fastsetup{\s!btx:\s!list:\s!author:others}
+\stopsetups
+
+\startsetups \s!btx:\s!list:\s!author:inverted
+ \fastsetup{\s!btx:\s!list:\s!author:concat}
+ \ifx\currentbtxvons\empty \else
+ \texdefinition{\s!btx:\s!cite:\s!author:\s!de}
+ \doifnotmode {\s!btx:\s!de} {
+ \currentbtxvons
+ \btxparameter{\c!separator:vons}
+ }
+ \fi
+ \ifx\currentbtxsurnames\empty \else
+ \currentbtxsurnames
+ \ifx\currentbtxjuniors\empty \else
+ \btxparameter{\c!separator:juniors}
+ \currentbtxjuniors
+ \fi
+ \fi
+ \ifx\currentbtxfirstnames\empty
+ % firstnames are optional
+ \else
+ \btxparameter{\c!separator:invertedfirstnames}
+ \currentbtxfirstnames
+ \fi
+ \ifx\currentbtxvons\empty \else
+ \doifmode {\s!btx:\s!de} {
+ \btxparameter{\c!separator:vons}
+ \currentbtxvons
+ }
+ \fi
+ \fastsetup{\s!btx:\s!list:\s!author:others}
+\stopsetups
+
+\startsetups \s!btx:\s!list:\s!author:invertedshort
+ \fastsetup{\s!btx:\s!list:\s!author:concat}
+ \ifx\currentbtxvons\empty \else
+ \texdefinition{\s!btx:\s!cite:\s!author:\s!de}
+ \doifnotmode {\s!btx:\s!de} {
+ \currentbtxvons
+ \btxparameter{\c!separator:vons}
+ }
+ \fi
+ \ifx\currentbtxsurnames\empty \else
+ \currentbtxsurnames
+ \ifx\currentbtxjuniors\empty \else
+ \btxparameter{\c!separator:juniors}
+ \currentbtxjuniors
+ \fi
+ \fi
+ \ifx\currentbtxinitials\empty
+ % initials are optional
+ \else
+ \btxparameter{\c!separator:invertedinitials}
+ \currentbtxinitials
+ \fi
+ \ifx\currentbtxvons\empty \else
+ \doifmode {\s!btx:\s!de} {
+ \btxparameter{\c!separator:vons}
+ \currentbtxvons
+ }
+ \fi
+ \fastsetup{\s!btx:\s!list:\s!author:others}
+\stopsetups
+
+\startsetups \s!btx:\s!list:\s!author:name
+ \fastsetup{\s!btx:\s!list:\s!author:concat}
+ % is this treated differently in german?
+ \ifx\currentbtxvons\empty \else
+ \currentbtxvons
+ \btxparameter{\c!separator:vons}
+ \fi
+ \currentbtxsurnames
+ \fastsetup{\s!btx:\s!list:\s!author:others}
+\stopsetups
+
+\protect
diff --git a/Master/texmf-dist/tex/context/base/publ-imp-cite.mkiv b/Master/texmf-dist/tex/context/base/publ-imp-cite.mkiv
deleted file mode 100644
index 1b3157b4b98..00000000000
--- a/Master/texmf-dist/tex/context/base/publ-imp-cite.mkiv
+++ /dev/null
@@ -1,256 +0,0 @@
-%D \module
-%D [ file=publ-imp-cite,
-%D version=2013.12.24,
-%D title=\CONTEXT\ Publication Support,
-%D subtitle=XML,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\unprotect
-
-% The null case:
-
-\startsetups \s!btx:\s!cite:none
- % dummy
-\stopsetups
-
-% This saves keying:
-
-\startsetups \s!btx:\s!cite:common:normal
- \ifx\currentbtxsecond\empty
- \currentbtxfirst
- \else
- \currentbtxfirst
- \btxcitevariantparameter\v!inbetween
- \currentbtxsecond
- \fi
-\stopsetups
-
-\startsetups \s!btx:\s!cite:common:range
- \ifx\currentbtxsecond\empty
- \currentbtxfirst
- \else
- \currentbtxfirst
- \btxcitevariantparameter\c!range
- \currentbtxsecond
- \fi
-\stopsetups
-
-\startsetups \s!btx:\s!cite:concat
- \ifcase\currentbtxconcat \or \or
- \btxcitevariantparameter\c!pubsep
- \or
- \btxcitevariantparameter\c!finalpubsep
- \or
- \btxcitevariantparameter\c!lastpubsep
- \fi
-\stopsetups
-
-% \startsetups \s!btx:\s!cite:render:normal
-% \directsetup{\s!btx:\s!cite:concat}
-% \ifconditional\btxinteractive
-% \goto {
-% \btxcitereference
-% \directsetup{\s!btx:\s!cite:common:normal}
-% } [
-% \s!internal(\currentbtxinternal)
-% ]
-% \else
-% \directsetup{\s!btx:\s!cite:common:normal}
-% \fi
-% \stopsetups
-%
-% more efficient (less tokens, less expansion):
-
-\startsetups \s!btx:\s!cite:render:normal
- \directsetup{\s!btx:\s!cite:concat}
- \ifconditional\btxinteractive
- \goto {
- \btxcitereference
- \ifx\currentbtxsecond\empty
- \currentbtxfirst
- \else
- \currentbtxfirst
- \btxcitevariantparameter\v!inbetween
- \currentbtxsecond
- \fi
- } [
- \s!internal(\currentbtxinternal)
- ]
- \else
- \ifx\currentbtxsecond\empty
- \currentbtxfirst
- \else
- \currentbtxfirst
- \btxcitevariantparameter\v!inbetween
- \currentbtxsecond
- \fi
- \fi
-\stopsetups
-
-% \startsetups \s!btx:\s!cite:render:range
-% \directsetup{\s!btx:\s!cite:concat}
-% \ifconditional\btxinteractive
-% \goto {
-% \btxcitereference
-% \directsetup{\s!btx:\s!cite:common:range}
-% } [
-% \s!internal(\currentbtxinternal)
-% ]
-% \else
-% \directsetup{\s!btx:\s!cite:common:range}
-% \fi
-% \stopsetups
-%
-% more efficient (less tokens, less expansion):
-
-\startsetups \s!btx:\s!cite:render:range
- \directsetup{\s!btx:\s!cite:concat}
- \ifconditional\btxinteractive
- \goto {
- \btxcitereference
- \ifx\currentbtxsecond\empty
- \currentbtxfirst
- \else
- \currentbtxfirst
- \btxcitevariantparameter\c!range
- \currentbtxsecond
- \fi
- } [
- \s!internal(\currentbtxinternal)
- ]
- \else
- \ifx\currentbtxsecond\empty
- \currentbtxfirst
- \else
- \currentbtxfirst
- \btxcitevariantparameter\c!range
- \currentbtxsecond
- \fi
- \fi
-\stopsetups
-
-\startsetups \s!btx:\s!cite:render:variant
- \directsetup{\s!btx:\s!cite:concat}
- \ifconditional\btxinteractive
- \goto {
- \btxcitereference
- \directsetup{\s!btx:\s!cite:render:\currentbtxcitevariant}
- } [
- \s!internal(\currentbtxinternal)
- ]
- \else
- \directsetup{\s!btx:\s!cite:render:\currentbtxcitevariant}
- \fi
-\stopsetups
-
-% author lists: can be less
-
-\startsetups \s!btx:\s!cite:common:author
- \ifx\currentbtxcitevariant\v!normal
- \currentbtxfirst
- \else
- \currentbtxciteauthor
- \fi
- \ifx\currentbtxsecond\empty \else
- \btxcitevariantparameter\v!inbetween
- \currentbtxsecond
- \fi
-\stopsetups
-
-\startsetups \s!btx:\s!cite:render:author
- \directsetup{\s!btx:\s!cite:common:author}
-\stopsetups
-\startsetups \s!btx:\s!cite:render:authoryear
- \directsetup{\s!btx:\s!cite:common:author}
-\stopsetups
-\startsetups \s!btx:\s!cite:render:authoryears
- \directsetup{\s!btx:\s!cite:common:author}
-\stopsetups
-\startsetups \s!btx:\s!cite:render:authornum
- \directsetup{\s!btx:\s!cite:common:author}
-\stopsetups
-
-\startsetups \s!btx:\s!cite:author:num
- \directsetup{\s!btx:\s!cite:render:range}
-\stopsetups
-\startsetups \s!btx:\s!cite:author:year
- \directsetup{\s!btx:\s!cite:render:range}
-\stopsetups
-\startsetups \s!btx:\s!cite:author:years
- \directsetup{\s!btx:\s!cite:render:range}
-\stopsetups
-
-\startsetups \s!btx:\s!cite:author
- \directsetup{\s!btx:\s!cite:render:variant}
-\stopsetups
-\startsetups \s!btx:\s!cite:authoryear
- \directsetup{\s!btx:\s!cite:render:variant}
-\stopsetups
-\startsetups \s!btx:\s!cite:authoryears
- \directsetup{\s!btx:\s!cite:render:variant}
-\stopsetups
-\startsetups \s!btx:\s!cite:authornum
- \directsetup{\s!btx:\s!cite:render:variant}
-\stopsetups
-
-\startsetups \s!btx:\s!cite:year
- \directsetup{\s!btx:\s!cite:render:range}
-\stopsetups
-\startsetups \s!btx:\s!cite:short
- \directsetup{\s!btx:\s!cite:render:normal}
-\stopsetups
-\startsetups \s!btx:\s!cite:serial
- \directsetup{\s!btx:\s!cite:render:range}
-\stopsetups
-\startsetups \s!btx:\s!cite:tag
- \directsetup{\s!btx:\s!cite:render:normal}
-\stopsetups
-\startsetups \s!btx:\s!cite:key
- \directsetup{\s!btx:\s!cite:render:normal}
-\stopsetups
-%startsetups \s!btx:\s!cite:doi
-% \directsetup{\s!btx:\s!cite:render:normal}
-%stopsetups
-%startsetups \s!btx:\s!cite:url
-% \directsetup{\s!btx:\s!cite:render:normal}
-%stopsetups
-\startsetups \s!btx:\s!cite:category
- \directsetup{\s!btx:\s!cite:render:normal}
-\stopsetups
-\startsetups \s!btx:\s!cite:type
- \directsetup{\s!btx:\s!cite:render:normal}
-\stopsetups
-\startsetups \s!btx:\s!cite:num
- \directsetup{\s!btx:\s!cite:render:range}
-\stopsetups
-\startsetups \s!btx:\s!cite:page
- \directsetup{\s!btx:\s!cite:render:normal}
-\stopsetups
-
-\startsetups \s!btx:\s!cite:doi
- \directsetup{\s!btx:\s!cite:render:variant}
-\stopsetups
-\startsetups \s!btx:\s!cite:render:doi
- \hyphenatedurl{\currentbtxfirst}
-\stopsetups
-
-\startsetups \s!btx:\s!cite:url
- \ifconditional\btxinteractive
- \goto {
- \btxcitereference
- \hyphenatedurl{\currentbtxfirst}
- } [
- url(\currentbtxfirst)
- ]
- \else
- \hyphenatedurl{\currentbtxfirst}
- \fi
-\stopsetups
-
-\protect
diff --git a/Master/texmf-dist/tex/context/base/publ-imp-cite.mkvi b/Master/texmf-dist/tex/context/base/publ-imp-cite.mkvi
new file mode 100644
index 00000000000..dfc16c795ee
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/publ-imp-cite.mkvi
@@ -0,0 +1,314 @@
+%D \module
+%D [ file=publ-imp-cite,
+%D version=2013.12.24,
+%D title=\CONTEXT\ Publication Support,
+%D subtitle=Citations,
+%D author=Alan Braslau and Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\starttexdefinition btx:cite:inject #content
+ \ifconditional\btxinteractive
+ \ifx\currentbtxinternal\empty
+ #content
+ \else
+ \goto {
+ #content
+ } [
+ \s!internal(\currentbtxinternal)
+ ]
+ \fi
+ \else
+ #content
+ \fi
+\stoptexdefinition
+
+\starttexdefinition btx:cite:checkconcat
+ \ifnum\currentbtxcount>\zerocount
+ \let\currentbtxinternal\empty
+ \let\currentbtxbacklink\empty
+ \fi
+\stoptexdefinition
+
+% The null case:
+
+\startsetups btx:cite:none
+ \btxcitereference
+ % dummy
+\stopsetups
+
+\startsetups btx:cite:nocite
+ \dontleavehmode
+ \btxcitereference
+\stopsetups
+
+\startsetups btx:cite:unknown
+ \begingroup
+ \btxcitereference
+ unknown: \currentbtxfirst
+ \endgroup
+\stopsetups
+
+\startsetups btx:cite:empty
+ \btxcitereference
+ <empty>
+\stopsetups
+
+\startsetups btx:cite:invalid
+ \btxcitereference
+ {\tt <\currentbtxreference>}
+\stopsetups
+
+% \startsetups btx:cite:normal
+% \ifx\currentbtxfirst\empty
+% \fastsetup{\s!btx:\s!cite:\s!empty}
+% \else\ifx\currentbtxsecond\empty
+% \btxcitereference
+% \currentbtxfirst
+% \ifx\currentbtxthird\empty \else
+% \currentbtxthird
+% \fi
+% \else
+% \btxcitereference
+% \currentbtxfirst
+% \btxparameter\v!inbetween
+% \currentbtxsecond
+% \ifx\currentbtxthird\empty \else
+% \currentbtxthird
+% \fi
+% \fi\fi
+% \stopsetups
+
+%\startsetups btx:cite:range
+% \ifx\currentbtxfirst\empty
+% \fastsetup{\s!btx:\s!cite:\s!empty}
+% \else\ifx\currentbtxsecond\empty
+% \btxcitereference
+% \currentbtxfirst
+% \ifx\currentbtxthird\empty \else
+% \currentbtxthird
+% \fi
+% \else
+% \btxcitereference
+% \currentbtxfirst
+% \btxparameter\c!range
+% \currentbtxsecond
+% \ifx\currentbtxthird\empty \else
+% \currentbtxthird
+% \fi
+% \fi\fi
+%\stopsetups
+
+\starttexdefinition btx:cite:concat
+ \btxparameter{\c!separator:\number\currentbtxconcat}
+\stoptexdefinition
+
+\startsetups btx:cite:normal
+ \texdefinition{\s!btx:\s!cite:concat}
+ \currentbtxlefttext
+ \ifx\currentbtxfirst\empty
+ \fastsetup{\s!btx:\s!cite:\s!empty}
+ \else
+ \texdefinition {\s!btx:\s!cite:inject} {
+ \btxcitereference
+ \btxusecommand[\currentbtxspecification:cite:\currentbtxcitealternative] {
+ \currentbtxfirst
+ }
+ }
+ \ifx\currentbtxsecond\empty \else
+ \btxparameter\v!inbetween
+ \texdefinition {\s!btx:\s!cite:inject} {
+ \btxusecommand[\currentbtxspecification:cite:\currentbtxcitealternative] {
+ \currentbtxsecond
+ }
+ }
+ \fi
+ \ifx\currentbtxthird\empty \else
+ \texdefinition {\s!btx:\s!cite:inject} {
+ \btxusecommand[\currentbtxspecification:cite:\currentbtxcitealternative] {
+ \currentbtxthird
+ }
+ }
+ \fi
+ \fi
+ \currentbtxrighttext
+\stopsetups
+
+\startsetups btx:cite:author
+ \texdefinition{\s!btx:\s!cite:concat}
+ \btxparameter\c!left
+ \currentbtxlefttext
+ \ifx\currentbtxfirst\empty
+ \fastsetup{\s!btx:\s!cite:\s!empty}
+ \else
+ \texdefinition {\s!btx:\s!cite:inject} {
+ \btxcitereference
+ \currentbtxfirst
+ }
+ \fi
+ \ifx\currentbtxsecond\empty \else
+ \relax % keeps a following space
+ \btxparameter\v!inbetween
+ \texdefinition {\s!btx:\s!cite:inject} {
+ \currentbtxsecond
+ }
+ \fi
+ \ifx\currentbtxthird\empty \else
+ \texdefinition {\s!btx:\s!cite:inject} {
+ \currentbtxthird
+ }
+ \fi
+ \currentbtxrighttext
+ \btxparameter\c!right
+\stopsetups
+
+\startsetups btx:cite:range
+ \texdefinition{\s!btx:\s!cite:concat}
+ \currentbtxlefttext
+ \ifx\currentbtxfirst\empty
+ \fastsetup{\s!btx:\s!cite:\s!empty}
+ \else
+ \texdefinition {\s!btx:\s!cite:inject} {
+ \btxcitereference
+ \btxusecommand[\currentbtxspecification:cite:\currentbtxcitealternative] {
+ \currentbtxfirst
+ \ifx\currentbtxsecond\empty \else
+ \btxparameter\c!range
+ \currentbtxsecond
+ \fi
+ \ifx\currentbtxthird\empty \else
+ \currentbtxthird
+ \fi
+ }
+ }
+ \fi
+ \currentbtxrighttext
+\stopsetups
+
+\startsetups btx:cite:listelement
+ \texdefinition{\s!btx:\s!cite:concat}
+ \currentbtxlefttext
+ \ifx\currentbtxfirst\empty
+ \fastsetup{\s!btx:\s!cite:\s!empty}
+ \else
+ \texdefinition {\s!btx:\s!cite:inject} {
+ \btxcitereference
+ \currentbtxfirst
+ }
+ \fi
+ \currentbtxrighttext
+\stopsetups
+
+\startsetups \s!btx:\s!cite:entry
+ \texdefinition{\s!btx:\s!cite:concat}
+ \currentbtxlefttext
+ \btxhandleciteentry
+ \currentbtxrighttext
+\stopsetups
+
+% these three are goodies to get something but are not set up as it makes no
+% sense to have something root for combinations like this (esp not because one
+% gets default anyway
+
+% AB: not so sure about that. Why define them in default rather than here?
+
+\startsetups \s!btx:\s!cite:authoryear
+ \fastsetup{\s!btx:\s!cite:author}
+\stopsetups
+\startsetups \s!btx:\s!cite:authoryears
+ \fastsetup{\s!btx:\s!cite:authoryear}
+\stopsetups
+\startsetups \s!btx:\s!cite:authornum
+ \fastsetup{\s!btx:\s!cite:authoryear}
+\stopsetups
+\startsetups \s!btx:\s!cite:authorref
+ \ifx{\\s!btxparameter\c!alternative}{authoryear}
+ \fastsetup{\s!btx:\s!cite:authoryears}
+ \else\ifx{\btxparameter\c!alternative}{num}
+ \fastsetup{\s!btx:\s!cite:authornum}
+ \else
+ \fastsetup{\s!btx:\s!cite:author}
+ \fi\fi
+\stopsetups
+\startsetups \s!btx:\s!cite:num
+ \fastsetup{\s!btx:\s!cite:range}
+\stopsetups
+\startsetups \s!btx:\s!cite:default
+ \fastsetup{\s!btx:\s!cite:num}
+\stopsetups
+\startsetups \s!btx:\s!cite:textnum
+ \fastsetup{\s!btx:\s!cite:num}
+\stopsetups
+\startsetups \s!btx:\s!cite:year
+ \fastsetup{\s!btx:\s!cite:range}
+\stopsetups
+\startsetups \s!btx:\s!cite:short
+ \fastsetup{\s!btx:\s!cite:range}
+\stopsetups
+\startsetups \s!btx:\s!cite:author:num
+ \fastsetup{\s!btx:\s!cite:range}
+\stopsetups
+\startsetups \s!btx:\s!cite:author:year
+ \fastsetup{\s!btx:\s!cite:range}
+\stopsetups
+\startsetups \s!btx:\s!cite:author:years
+ \fastsetup{\s!btx:\s!cite:concat}%?? in range already?
+ \fastsetup{\s!btx:\s!cite:range}
+\stopsetups
+
+\startsetups \s!btx:\s!cite:serial
+ \fastsetup{\s!btx:\s!cite:range}
+\stopsetups
+\startsetups \s!btx:\s!cite:tag
+ \fastsetup{\s!btx:\s!cite:normal}
+\stopsetups
+\startsetups \s!btx:\s!cite:key
+ \fastsetup{\s!btx:\s!cite:normal}
+\stopsetups
+\startsetups \s!btx:\s!cite:category
+ \fastsetup{\s!btx:\s!cite:normal}
+\stopsetups
+
+% the following correspond to fields, but can be used in many renderings
+
+\startsetups \s!btx:\s!cite:keywords
+ \fastsetup{\s!btx:\s!cite:list}
+\stopsetups
+\startsetups \s!btx:\s!cite:type
+ \fastsetup{\s!btx:\s!cite:normal}
+\stopsetups
+\startsetups \s!btx:\s!cite:title
+ \fastsetup{\s!btx:\s!cite:normal}
+\stopsetups
+\startsetups \s!btx:\s!cite:pages
+ \fastsetup{\s!btx:\s!cite:range}
+\stopsetups
+\startsetups \s!btx:\s!cite:page
+ \fastsetup{\s!btx:\s!cite:normal}
+\stopsetups
+
+% the following is kind of specific, but can be used in many renderings
+
+\startsetups btx:cite:url
+ \ifx\currentbtxfirst\empty
+ \fastsetup{\s!btx:\s!cite:\s!empty}
+ \else\ifconditional\btxinteractive
+ \goto {
+ \btxcitereference
+ \hyphenatedurl{\doif{\currentbtxcitealternative}{doi}{doi:}\currentbtxfirst}
+ } [
+ url(\doif{\currentbtxcitealternative}{doi}{http://dx.doi.org/}\currentbtxfirst)
+ ]
+ \else
+ \btxcitereference
+ \hyphenatedurl{\doif{\currentbtxcitealternative}{doi}{doi:}\currentbtxfirst}
+ \fi\fi
+\stopsetups
+
+\protect
diff --git a/Master/texmf-dist/tex/context/base/publ-imp-commands.mkiv b/Master/texmf-dist/tex/context/base/publ-imp-commands.mkvi
index 14e2dbae12d..14e2dbae12d 100644
--- a/Master/texmf-dist/tex/context/base/publ-imp-commands.mkiv
+++ b/Master/texmf-dist/tex/context/base/publ-imp-commands.mkvi
diff --git a/Master/texmf-dist/tex/context/base/publ-imp-default.lua b/Master/texmf-dist/tex/context/base/publ-imp-default.lua
new file mode 100644
index 00000000000..61b08f30cef
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/publ-imp-default.lua
@@ -0,0 +1,124 @@
+-- For the moment I put this here as example. When writing the publication modules we
+-- explored several approached: pure tex, pure lua, a mix with xml, etc. In the end
+-- each has advantages and drawbacks so we ended up with readable tex plus helpers in
+-- lua. Anyway here is a lua variant of a setup ... it doesn't look nicer. An alternative
+-- can be to build a table with characters but then we need to pass left, right and
+-- other separators so again no real gain.
+
+-- function publications.maybe.default.journal(currentdataset,currenttag)
+-- if publications.okay(currentdataset,currenttag,"journal") then
+-- context.btxspace()
+-- context.startbtxstyle("italic")
+-- commands.btxflush(currentdataset,currenttag,"expandedjournal -> journal")
+-- context.stopbtxstyle()
+-- if publications.okay(currentdataset,currenttag,"volume") then
+-- context.btxspace()
+-- commands.btxflush(currentdataset,currenttag,"volume")
+-- if publications.okay(currentdataset,currenttag,"number") then
+-- context.ignorespaces()
+-- context.btxleftparenthesis()
+-- commands.btxflush(currentdataset,currenttag,"number")
+-- context.btxrightparenthesis()
+-- end
+-- elseif publications.okay(currentdataset,currenttag,"number") then
+-- context.btxlabeltext("default:number")
+-- context.btxspace()
+-- commands.btxflush(currentdataset,currenttag,"number")
+-- end
+-- if publications.okay(currentdataset,currenttag,"pages") then
+-- context.btxcomma()
+-- commands.btxflush(currentdataset,currenttag,"pages")
+-- end
+-- context.btxcomma()
+-- end
+-- end
+
+return {
+ --
+ -- metadata
+ --
+ name = "default",
+ version = "1.00",
+ comment = "DEFAULT specification",
+ author = "Alan Braslau and Hans Hagen",
+ copyright = "ConTeXt development team",
+ --
+ -- derived (combinations of) fields (all share the same default set)
+ --
+ virtual = {
+ "authoryear",
+ "authoryears",
+ "authornum",
+ "num",
+ "suffix",
+ },
+ --
+ -- special datatypes
+ --
+ types = {
+ author = "author", -- interpreted as name(s)
+ editor = "author", -- interpreted as name(s)
+ page = "pagenumber", -- number or range: f--t -- maybe just range
+ pages = "pagenumber", -- number or range: f--t -- maybe just range
+ volume = "range", -- number or range: f--t
+ number = "range", -- number or range: f--t
+ keywords = "keyword", -- comma|-|separated list
+ },
+ --
+ -- categories with their specific fields
+ --
+ categories = {
+ --
+ -- the following fields are for documentation and testing purposes
+ --
+ ["demo-a"] = {
+ sets = {
+ author = { "author", "institution", "organization" },
+ },
+ required = { "author", "title", "year" },
+ optional = { "subtitle" },
+ },
+ ["demo-b"] = {
+ sets = {
+ authors = { "author", "institution", "organization" },
+ },
+ required = { "authors", "title", "year" },
+ optional = { "subtitle" },
+ },
+ --
+ -- we only provide article and book (maybe a few more later) and we keep it
+ -- real simple. See the apa and aps definitions for more extensive examples
+ --
+ article = {
+ sets = {
+ author = { "author", "editor" },
+ },
+ required = {
+ "author", -- a set
+ "year",
+ },
+ optional = {
+ "title",
+ "keywords",
+ "journal", "volume", "number", "pages",
+ },
+ },
+ book = {
+ sets = {
+ author = { "author", "editor", },
+ editionset = { "edition", "volume", "number" },
+ },
+ required = {
+ "author", -- a set
+ "title",
+ "year",
+ },
+ optional = {
+ "subtitle",
+ "keywords",
+ "publisher", "address",
+ "editionset",
+ },
+ },
+ },
+}
diff --git a/Master/texmf-dist/tex/context/base/publ-imp-default.mkvi b/Master/texmf-dist/tex/context/base/publ-imp-default.mkvi
new file mode 100644
index 00000000000..49a0b9eae85
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/publ-imp-default.mkvi
@@ -0,0 +1,594 @@
+%D \module
+%D [ file=publ-imp-default,
+%D version=2014.02.06,
+%D title=Default bibliography style,
+%D subtitle=Publications,
+%D author=Alan Braslau and Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is therefore copyrighted
+%D by \PRAGMA. See mreadme.pdf for details.
+
+%D This default style defines only a few categories: book and article.
+%D If you want more, you need to load a more complete style such as \type {apa},
+%D \type {aps}, etc. The default style is used in the manuals that ship with
+%D \CONTEXT. This file is always loaded.
+
+\startbtxrenderingdefinitions[\s!default]
+
+% \definebtx [\s!default:\s!page ] [\s!page]
+% \definebtx [\s!default:\s!cite ] [\s!cite]
+% \definebtx [\s!default:\s!list ] [\s!list]
+% \definebtx [\s!default:\s!author] [\s!author]
+
+\definebtxrendering
+ [\s!default]
+ [\c!specification=\s!default]
+
+\definebtx
+ [\s!default]
+ [\c!default=, % we do not want to fall|-|back on ourself.
+ \c!otherstext={\space\btxlabeltext{default:others}},
+ %c!journalconversion=\v!normal,
+ \c!monthconversion=\v!number,
+ \c!separator:names:2={,\space},
+ \c!separator:names:3={\space\btxlabeltext{default:and}\space},
+ \c!separator:names:4={\space\btxlabeltext{default:and}\space}]
+
+\definebtx
+ [\s!default:\s!list]
+ [\s!default]
+ [\c!authorconversion=normalshort]
+
+\definebtx
+ [\s!default:\s!cite]
+ [\s!default]
+ [\c!alternative=num,
+ \c!authorconversion=\v!name]
+
+% We define [page] settings in the default namespace, inheriting the root
+% settings, in order to eventually allow for modifications without touching
+% root.
+
+\definebtx
+ [\s!default:\s!page]
+ [\s!page]
+
+\definebtx
+ [\s!default:\s!page:list]
+ [\s!default:\s!page]
+
+% List variants, some having specific settings:
+
+\definebtx
+ [\s!default:\s!list:author]
+ [\s!default:\s!list]
+
+\definebtx
+ [\s!default:\s!list:editor]
+ [\s!default:\s!list:author]
+
+\definebtx
+ [\s!default:\s!list:url]
+ [\s!default:\s!list]
+
+\definebtx
+ [\s!default:\s!list:doi]
+ [\s!default:\s!list]
+
+\definebtx
+ [\s!default:\s!list:invertedshort]
+ [\s!default:\s!list]
+
+% normalshort?
+
+\definebtx
+ [\s!default:\s!list:short]
+ [\s!default:\s!list]
+
+\definebtx
+ [\s!default:\s!list:journal]
+ [\s!default:\s!list]
+ [\c!style=\v!italic]
+
+\definebtx
+ [\s!default:\s!list:title]
+ [\s!default:\s!list]
+ [\c!style=\v!italic,
+ \c!command=\Word]
+
+\definebtx
+ [\s!default:\s!list:title:article]
+ [\s!default:\s!list:title]
+ [\c!style=, % journal is set in italics
+ \c!command={\quotation\Word}]
+
+\definebtx
+ [\s!default:\s!list:title:book]
+ [\s!default:\s!list:title]
+
+% Citation variants, some having specific settings :
+
+\definebtx
+ [\s!default:\s!cite:author]
+ [\s!default:\s!cite]
+
+\definebtx
+ [\s!default:\s!cite:authornum]
+ [\s!default:\s!cite:author]
+ [\c!left={(},
+ \c!right={)}]
+
+\definebtx
+ [\s!default:\s!cite:authoryear]
+ [\s!default:\s!cite:author]
+ [\c!left={(},
+ \c!right={)},
+ \c!inbetween={,\space}]
+
+\definebtx
+ [\s!default:\s!cite:authorref]
+ [\s!default:\s!cite:authornum]
+
+\definebtx
+ [\s!default:\s!cite:authoryears]
+ [\s!default:\s!cite:author]
+
+\definebtx
+ [\s!default:\s!cite:author:num] % todo
+ [\s!default:\s!cite:authornum]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtx
+ [\s!default:\s!cite:author:year] % todo
+ [\s!default:\s!cite:authoryear]
+ [\c!left=,
+ \c!right=]
+
+\definebtx
+ [\s!default:\s!cite:author:years] % todo
+ [\s!default:\s!cite:authoryears]
+ [\c!inbetween=,
+ \c!left=(,
+ \c!right=)]
+
+\definebtx
+ [\s!default:\s!cite:year]
+ [\s!default:\s!cite]
+ [\c!compress=\v!yes,
+ \c!sorttype=year]
+
+\definebtx
+ [\s!default:\s!cite:title]
+ [\s!default:\s!cite]
+ [command={\language[\currentbtxlanguage]}, % BAH
+ \c!style=\v!italic]
+
+\definebtx
+ [\s!default:\s!cite:tag]
+ [\s!default:\s!cite]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtx
+ [\s!default:\s!cite:key]
+ [\s!default:\s!cite:tag]
+
+\definebtx
+ [\s!default:\s!cite:serial]
+ [\s!default:\s!cite]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtx
+ [\s!default:\s!cite:page]
+ [\s!default:\s!cite]
+ [\c!left=,
+ \c!right=]
+
+\definebtx
+ [\s!default:\s!cite:pages]
+ [\s!default:\s!cite:page]
+
+\definebtx
+ [\s!default:\s!cite:keywords]
+ [\s!default:\s!cite]
+ [\c!left={(},
+ \c!right={)}]
+
+\definebtx
+ [\s!default:\s!cite:invertedshort]
+ [\s!default:\s!cite]
+
+\definebtx
+ [\s!default:\s!cite:short]
+ [\s!default:\s!cite]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtx
+ [\s!default:\s!cite:category]
+ [\s!default:\s!cite]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtx
+ [\s!default:\s!cite:type]
+ [\s!default:\s!cite:category]
+
+\definebtx
+ [\s!default:\s!cite:url]
+ [\s!default:\s!cite]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtx
+ [\s!default:\s!cite:doi]
+ [\s!default:\s!cite:url]
+
+\definebtx
+ [\s!default:\s!cite:num]
+ [\s!default:\s!cite]
+ [\c!compress=\v!yes,
+ \c!left={[},
+ \c!right={]},
+ \c!separator:2={,}, % no space
+ \c!separator:3=\btxparameter{\c!separator:2},
+ \c!separator:4=\btxparameter{\c!separator:2}]
+
+\definebtx
+ [\s!default:\s!cite:default]
+ [\s!default:\s!cite:num]
+
+\definebtx
+ [\s!default:\s!cite:textnum]
+ [\s!default:\s!cite:num]
+ [\c!left=, % in apa: {Ref.\nbsp} or so
+ \c!right=,
+ \c!separator:2={,\space},
+ \c!separator:3={,\space\btxlabeltext{default:and}\space},
+ \c!separator:4= {\space\btxlabeltext{default:and}\space}]
+
+\definebtx
+ [\s!default:\s!cite:entry]
+ [\s!default:\s!cite]
+ [\c!left={(},
+ \c!right={)}]
+
+% Multilingual text strings
+
+\setupbtxlabeltext
+ [en]
+ [\s!default:and=and,
+ \s!default:number={no.},
+ \s!default:edition={ed.},
+ \s!default:Editor=Editor, % Ed./Eds.
+ \s!default:Editors=Editors,
+ \s!default:Volume={Vol.},
+ \s!default:Volumes={Vols.},
+ \s!default:others={et al.}]
+
+\setupbtxlabeltext
+ [nl]
+ [\s!default:and=en,
+ \s!default:number={nr.},
+ \s!default:edition={ed.}, % editie
+ \s!default:Editor=Editor, % Ed./Eds.
+ \s!default:Editors=Editors,
+ \s!default:Volume={Vol.},
+ \s!default:Volumes={Vols.},
+ \s!default:others={et al.}]
+
+\setupbtxlabeltext
+ [fr]
+ [\s!default:and=et,
+ \s!default:others={et al.},
+ \s!default:number={n\high{o}},
+ \s!default:edition={édition},
+ \s!default:Editor=Éditeur,
+ \s!default:Editors=Éditeurs,
+ \s!default:Volume=Volume,
+ \s!default:Volumes=Volumes,
+ \s!default:others={et al.}]
+
+\setupbtxlabeltext
+ [de]
+ [\s!default:and=und,
+ \s!default:number={nr.},
+ \s!default:edition=Auf\/lage,
+ \s!default:Editor=Herausgeber, % Hrsg./Hg.
+ \s!default:Editors=Herausgeber,
+ \s!default:Volume=Band, % Bd.
+ \s!default:Volumes={Bände},
+ \s!default:others={et al.}]
+
+\setupbtxlabeltext
+ [it]
+ [\s!default:and=e,
+ \s!default:number={nº},
+ \s!default:edition={ed.}, % edizione
+ \s!default:Editor={A cura di},
+ \s!default:Editors={A cura di},
+ \s!default:Volume={Vol.}, % Volume
+ \s!default:Volumes={Vol.}, % Volumi
+ \s!default:others={et al.}]
+
+\setupbtxlabeltext
+ [es]
+ [\s!default:and=y,
+ \s!default:number={nº},
+ \s!default:edition={ed.}, % edición
+ \s!default:Editor=Editor, % Ed./Eds.
+ \s!default:Editors=Editores,
+ \s!default:Volume={Vol.}, % Volumen
+ \s!default:Volumes={Vols.}, % Volúmenes
+ \s!default:others={et al.}]
+
+% First some helpers:
+
+\starttexdefinition btx:default:composed-title
+ \begingroup
+ \language[\currentbtxlanguage]
+ \btxflush{title}
+ \btxdoif {subtitle} {
+ \btxcolon
+ \btxflush{subtitle}
+ }
+ \endgroup
+\stoptexdefinition
+
+\starttexdefinition btx:default:title
+ \btxdoif {title} {
+ \btxspace
+ \btxstartstyleandcolor [default:list:title:\currentbtxcategory]
+ \btxusecommand[default:list:title:\currentbtxcategory] {
+ \texdefinition{btx:default:composed-title}
+ }
+ \btxstopstyleandcolor
+ \btxcomma
+ }
+\stoptexdefinition
+
+\starttexdefinition btx:default:author
+ \btxdoif {author} {
+ \btxflush{author}
+ \doif {\btxfoundname{author}} {editor} {
+ \btxcomma
+ \btxsingularorplural {editor} {
+ \btxlabeltext{default:Editor}
+ } {
+ \btxlabeltext{default:Editors}
+ }
+ }
+ \btxcomma
+ }
+\stoptexdefinition
+
+\starttexdefinition btx:default:year
+ \btxflush{year}
+ \btxflush{suffix}
+\stoptexdefinition
+
+\starttexdefinition btx:default:journal
+ \btxdoif {journal} {
+ \btxspace
+ \btxstartstyleandcolor [default:list:journal]
+ \btxusecommand[default:list:journal] {
+ \btxflush{journal}
+ }
+ \btxstopstyleandcolor
+ \btxdoifelse {volume} {
+ \btxspace
+ \btxflush{volume}
+ \btxdoif {number} {
+ \ignorespaces % brrr
+ \btxleftparenthesis
+ \btxflush{number}
+ \btxrightparenthesis
+ }
+
+ } {
+ \btxdoif {number} {
+ \btxlabeltext{default:number}
+ \btxspace
+ \btxflush{number}
+ }
+ }
+ \btxdoif {pages} {
+ \btxcomma
+ \btxflush{pages}
+ }
+ \btxcomma
+ }
+\stoptexdefinition
+
+\starttexdefinition btx:default:editionset
+ \btxdoif {editionset} {
+ \removeunwantedspaces
+ \removepunctuation
+ \btxleftparenthesis
+ \doif {\btxfoundname{editionset}} {edition} {
+ \btxflush{edition}
+ \btxspace
+ \btxlabeltext{default:edition}
+ \btxcomma
+ }
+ \btxdoif {volume} {
+ \btxoneorrange {volume} {
+ \btxlabeltext{default:Volume}
+ } {
+ \btxlabeltext{default:Volumes}
+ }
+ \btxspace
+ \btxflush{volume}
+ \btxcomma
+ }
+ \btxdoifelse {number} {
+ \btxlabeltext{default:number}
+ \btxspace
+ \btxflush{number}
+ } {
+ \removeunwantedspaces
+ \removepunctuation
+ }
+ \btxrightparenthesiscomma
+ }
+\stoptexdefinition
+
+\starttexdefinition btx:default:publisher
+ \btxdoif {publisher} {
+ \btxflush{publisher}
+ \btxcomma
+ }
+ \btxdoif {address} {
+ \btxflush{address}
+ \btxcomma
+ }
+\stoptexdefinition
+
+% Then a minimal number of setups:
+
+\startsetups btx:default:list:article
+ \texdefinition{btx:default:author}
+ \texdefinition{btx:default:title}
+ \texdefinition{btx:default:journal}
+ \texdefinition{btx:default:year}
+ \removeunwantedspaces
+ \removepunctuation
+ \btxperiod
+\stopsetups
+
+\startsetups btx:default:list:book
+ \texdefinition{btx:default:author}
+ \texdefinition{btx:default:title}
+ \texdefinition{btx:default:editionset}
+ \texdefinition{btx:default:publisher}
+ \texdefinition{btx:default:year}
+ \removeunwantedspaces
+ \removepunctuation
+ \btxperiod
+\stopsetups
+
+\startsetups btx:default:list:unknown
+ \currentbtxcategory\btxcolon
+ \btxshowentryinline
+\stopsetups
+
+%D Experiment:
+
+\startsetups btx:default:lefttext
+ \currentbtxlefttext
+\stopsetups
+
+\startsetups btx:default:righttext
+ \currentbtxrighttext
+\stopsetups
+
+%D Citations:
+
+% \startsetups \s!btx:\s!default:\s!cite:author
+% \fastsetup{\s!btx:\s!cite:author}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!cite:authoryear
+% \fastsetup{\s!btx:\s!cite:author}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!cite:authoryears
+% \fastsetup{\s!btx:\s!cite:author}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!cite:authornum
+% \fastsetup{\s!btx:\s!cite:author}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!cite:authorref
+% \fastsetup{\s!btx:\s!cite:authorref}
+% \stopsetups
+%
+% \startsetups \s!btx:\s!default:\s!cite:author:num
+% \fastsetup{\s!btx:\s!cite:range}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!cite:author:year
+% \fastsetup{\s!btx:\s!cite:range}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!cite:author:years
+% \fastsetup{\s!btx:\s!cite:concat}
+% \fastsetup{\s!btx:\s!cite:range}
+% \stopsetups
+%
+% \startsetups \s!btx:\s!default:\s!cite:keywords
+% \fastsetup{\s!btx:\s!cite:list}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!cite:year
+% \fastsetup{\s!btx:\s!cite:range}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!cite:short
+% \fastsetup{\s!btx:\s!cite:normal}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!cite:serial
+% \fastsetup{\s!btx:\s!cite:range}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!cite:tag
+% \fastsetup{\s!btx:\s!cite:normal}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!cite:key
+% \fastsetup{\s!btx:\s!cite:normal}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!cite:category
+% \fastsetup{\s!btx:\s!cite:normal}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!cite:type
+% \fastsetup{\s!btx:\s!cite:normal}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!cite:num
+% \fastsetup{\s!btx:\s!cite:range}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!cite:default
+% \fastsetup{\s!btx:\s!default:\s!cite:num}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!cite:textnum
+% \fastsetup{\s!btx:\s!default:\s!cite:num}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!cite:title
+% \fastsetup{\s!btx:\s!cite:normal}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!cite:pages
+% \fastsetup{\s!btx:\s!cite:range}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!cite:page
+% \fastsetup{\s!btx:\s!cite:normal}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!cite:doi
+% \fastsetup{\s!btx:\s!cite:url}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!cite:url
+% \fastsetup{\s!btx:\s!cite:url}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!cite:nocite
+% \fastsetup{\s!btx:\s!cite:nocite}% defined nowhere :
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!cite:entry
+% \fastsetup{\s!btx:\s!cite:entry}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!cite:none
+% \fastsetup{\s!btx:\s!cite:none}
+% \stopsetups
+
+% List
+
+% \startsetups \s!btx:\s!default:\s!list:page
+% \fastsetup{\s!btx:\s!list:page}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!list:yes
+% \fastsetup{\s!btx:\s!list:yes}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!list:num
+% \fastsetup{\s!btx:\s!list:num}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!list:bib
+% \fastsetup{\s!btx:\s!list:bib}
+% \stopsetups
+% \startsetups \s!btx:\s!default:\s!list:short
+% \fastsetup{\s!btx:\s!list:short}
+% \stopsetups
+
+\stopbtxrenderingdefinitions
diff --git a/Master/texmf-dist/tex/context/base/publ-imp-definitions.mkiv b/Master/texmf-dist/tex/context/base/publ-imp-definitions.mkvi
index 2cf2e3e8efe..8dfa931b37a 100644
--- a/Master/texmf-dist/tex/context/base/publ-imp-definitions.mkiv
+++ b/Master/texmf-dist/tex/context/base/publ-imp-definitions.mkvi
@@ -15,6 +15,8 @@
%D happens in the calling setup, if only because that is the place where
%D fences are also dealt with.
+% These will become texdefinitions
+
\unprotect
\startxmlsetups btx:format:crossref
@@ -25,6 +27,16 @@
\btxfield{short}
\stopxmlsetups
+\starttexdefinition btx:format:inject #link #content
+ \ifx\currentbtxinternal\empty
+ #content
+ \else\ifconditional\btxinteractive
+ \goto {#content} [#link]
+ \else
+ #content
+ \fi\fi
+\stoptexdefinition
+
\startxmlsetups btx:format:doi
\edef\currentbtxfielddoi{\btxfield{doi}}
\ifx\currentbtxfielddoi\empty
@@ -47,16 +59,23 @@
\fi\fi
\stopxmlsetups
+\startxmlsetups btx:format:year
+ \edef\currentbtxfieldyear{\btxfield{year}}
+ \ifx\currentbtxfieldyear\empty
+ \btxlabeltext{\currentbtxspecification:nd}
+ \fi
+\stopxmlsetups
+
\startxmlsetups btx:format:month
\edef\currentbtxfieldmonth{\btxfield{month}}
\ifx\currentbtxfieldmonth\empty
{\tttf no-month}
\else
- \edef\p_monthconversion{\btxlistvariantparameter\c!monthconversion}
+ \edef\p_monthconversion{\btxparameter\c!monthconversion}
\ifx\p_monthconversion\empty % month month:mnem
\currentbtxfieldmonth
\else
- \doifnumberelse \currentbtxfieldmonth {
+ \doifelsenumber \currentbtxfieldmonth {
\convertnumber\p_monthconversion\currentbtxfieldmonth
} {
\currentbtxfieldmonth
@@ -65,4 +84,40 @@
\fi
\stopxmlsetups
+% macros:
+
+\starttexdefinition btx:style:italic #content
+ \dontleavehmode
+ \begingroup
+ \it
+ #content
+ \italiccorrection
+ \endgroup
+\stoptexdefinition
+
+\starttexdefinition btx:style:bold #content
+ \dontleavehmode
+ \begingroup
+ \bf
+ #content
+ \endgroup
+\stoptexdefinition
+
+\starttexdefinition btx:style:quote #content
+ \dontleavehmode
+ \startquote
+ #content
+ \stopquote
+\stoptexdefinition
+
+\starttexdefinition btx:style #style #content
+ \doifelsedefined {btx:style:#style} {
+ \texdefinition{btx:style:#style} {
+ #content
+ }
+ } {
+ #content
+ }
+\stoptexdefinition
+
\protect
diff --git a/Master/texmf-dist/tex/context/base/publ-imp-list.mkvi b/Master/texmf-dist/tex/context/base/publ-imp-list.mkvi
new file mode 100644
index 00000000000..e13294f6f5b
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/publ-imp-list.mkvi
@@ -0,0 +1,90 @@
+%D \module
+%D [ file=publ-imp-list,
+%D version=2014.06.16,
+%D title=\CONTEXT\ Publication Support,
+%D subtitle=Lists,
+%D author=Alan Braslau and Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\starttexdefinition btx:list:inject #content
+ \ifconditional\btxinteractive
+ \ifx\currentbtxinternal\empty
+ #content
+ \else
+ \goto {
+ #content
+ } [
+ \s!internal(\currentbtxinternal)
+ ]
+ \fi
+ \else
+ #content
+ \fi
+\stoptexdefinition
+
+\starttexdefinition btx:list:helpers:concat
+ % \ifcase\currentbtxconcat \or \or
+ % \btxparameter\c!pubsep
+ % \or
+ % \btxparameter\c!finalpubsep
+ % \or
+ % \btxparameter\c!lastpubsep
+ % \fi
+ \space
+\stoptexdefinition
+
+\startsetups \s!btx:\s!list:page
+ \texdefinition{\s!btx:\s!list:concat}
+ \texdefinition{\s!btx:\s!list:inject} {
+ % real pagenumber: todo, userpage
+ \currentbtxfirst
+ % order
+ \high{\currentbtxsecond}
+ }
+\stopsetups
+
+\startsetups \s!btx:\s!list:numbering
+ \btxparameter\c!left
+ \texdefinition {\s!btx:\s!list:inject} {
+ \currentbtxfirst
+ \btxparameter\c!stopper
+ }
+ \btxparameter\c!right
+\stopsetups
+
+\startsetups \s!btx:\s!list:num
+ \btxstartstyleandcolor [\currentbtxspecification:list:num]
+ \btxusecommand[\currentbtxspecification:list:num] {
+ \fastsetup{\s!btx:\s!list:numbering}
+ }
+ \btxstopstyleandcolor
+\stopsetups
+
+\startsetups \s!btx:\s!list:yes
+ \fastsetup{\s!btx:\s!list:num}
+\stopsetups
+
+\startsetups \s!btx:\s!list:short
+ \btxstartstyleandcolor [\currentbtxspecification:list:short]
+ \btxusecommand[\currentbtxspecification:list:short] {
+ \fastsetup{\s!btx:\s!list:numbering}
+ }
+ \btxstopstyleandcolor
+\stopsetups
+
+\startsetups \s!btx:\s!list:bib
+ \btxstartstyleandcolor [\currentbtxspecification:list:bib]
+ \btxusecommand[\currentbtxspecification:list:bib] {
+ \fastsetup{\s!btx:\s!list:numbering}
+ }
+ \btxstopstyleandcolor
+\stopsetups
+
+\protect
diff --git a/Master/texmf-dist/tex/context/base/publ-imp-page.mkvi b/Master/texmf-dist/tex/context/base/publ-imp-page.mkvi
new file mode 100644
index 00000000000..19673c829d8
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/publ-imp-page.mkvi
@@ -0,0 +1,78 @@
+%D \module
+%D [ file=publ-imp-page,
+%D version=2014.11.05,
+%D title=\CONTEXT\ Publication Support,
+%D subtitle=Page numbers,
+%D author=Alan Braslau and Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\definebtx
+ [\s!page] % or just outer level
+ [\c!pagestate=\v!stop,
+ \c!pageleft=\btxleftparenthesis, % see below!!
+ \c!pageright=\btxrightparenthesis,
+ \c!pagesep={,\space},
+ \c!lastpagesep={,\space\btxlabeltext{\currentbtxspecification:and}\space},
+ \c!finalpagesep={\space\btxlabeltext{\currentbtxspecification:and}\space},
+ \c!pageconnector=\endash]
+
+\definebtx
+ [\s!page:\s!list]
+ [\s!page]
+ [\c!command={\wordright}]
+
+\startsetups \s!btx:\s!page:concat
+ \ifcase\currentbtxoverflow
+ \ifcase\currentbtxconcat
+ \or % first
+ \or % second
+ \btxparameter\c!pagesep
+ \or % second of two
+ \btxparameter\c!lastpagesep
+ \or % last
+ \btxparameter\c!finalpagesep
+ \fi
+ \fi
+\stopsetups
+
+% for the moment we have only one variant
+
+\startsetups [\s!btx:\s!page:\s!list]
+ \fastsetup{\s!btx:\s!page:concat}
+ % \ifx\currentbtxlastpage\empty
+ % p.
+ % \else
+ % pp.
+ % \fi
+ % \btxnbsp
+ \ifconditional\btxinteractive
+ \goto {
+ \currentbtxfirstpage
+ } [
+ internal(\currentbtxfirstinternal)
+ ]
+ \ifx\currentbtxlastpage\empty \else
+ \btxparameter\c!pageconnector
+ \goto {
+ \currentbtxlastpage
+ } [
+ internal(\currentbtxlastinternal)
+ ]
+ \fi
+ \else
+ \currentbtxfirstpage
+ \ifx\currentbtxlastpage\empty \else
+ \btxparameter\c!pageconnector
+ \currentbtxlastpage
+ \fi
+ \fi
+\stopsetups
+
+\protect
diff --git a/Master/texmf-dist/tex/context/base/publ-imp-replacements.lua b/Master/texmf-dist/tex/context/base/publ-imp-replacements.lua
new file mode 100644
index 00000000000..b15b17e30f8
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/publ-imp-replacements.lua
@@ -0,0 +1,13 @@
+return {
+ name = "replacements",
+ version = "1.00",
+ comment = "Good riddance",
+ author = "Alan Braslau and Hans Hagen",
+ copyright = "ConTeXt development team",
+ replacements = {
+ [ [[Th\^e\llap{\raise0.5ex\hbox{\'{\relax}}}]] ] = "Thánh",
+ [ [[Th\^e\llap{\raise 0.5ex\hbox{\'{\relax}}}]] ] = "Thánh",
+ [ [[Th{\^e}\llap{\raise0.5ex\hbox{\'{\relax}}}]] ] = "Thánh",
+ [ [[Th{\^e}\llap{\raise 0.5ex\hbox{\'{\relax}}}]] ] = "Thánh",
+ },
+}
diff --git a/Master/texmf-dist/tex/context/base/publ-imp-test.bib b/Master/texmf-dist/tex/context/base/publ-imp-test.bib
new file mode 100644
index 00000000000..0d81b49ff08
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/publ-imp-test.bib
@@ -0,0 +1,294 @@
+% This is a test bibliography for developing publ-impl-XXX files. Although
+% meant for testing apa styles, it can also be used for other styles.
+%
+% All publication categories have an example entry here. Most have an entry
+% with a "-min" key, containing only the minimal set of fields.
+%
+% Maintained by: Alan Braslau, Hans Hagen, Robin Kirkham
+
+@article {test-article-min,
+ author = "An Author",
+ title = "Title-article",
+ journal = "Journal",
+ year = "Year"
+}
+
+@article {test-article,
+ author = "An Author",
+ title = "Title-article",
+ journal = "Journal",
+ year = "Year",
+ volume = "Volume",
+ number = "Number",
+ pages = "Pages",
+ month = "Month",
+ note = "Note"
+}
+
+% author, editor, or both
+
+@book {test-book-min,
+ author = "An Author",
+ title = "Title-book",
+ publisher = "Publisher",
+ year = "Year"
+}
+
+% author, editor, or both
+% volume, number, or both
+
+@book {test-book,
+ author = "An Author",
+ editor = "An Editor",
+ title = "Title-book",
+ publisher = "Publisher",
+ year = "Year",
+ volume = "Volume",
+ number = "Number",
+ series = "Series",
+ address = "Address",
+ edition = "Edition",
+ month = "Month",
+ note = "Note"
+}
+
+% no author
+
+@book {test-book-edited,
+ editor = "An Editor",
+ title = "Title-book-edited",
+ publisher = "Publisher",
+ year = "Year"
+}
+
+@booklet {test-booklet-min,
+ title = "Title-booklet"
+}
+
+@booklet {test-booklet,
+ title = "Title-booklet",
+ author = "An Author",
+ howpublished = "How-published",
+ address = "Address",
+ month = "Month",
+ year = "Year",
+ note = "Note"
+}
+
+% author, editor, or both
+% chapter, pages, or both
+
+@inbook {test-inbook-min,
+ author = "An Author",
+ editor = "An Editor",
+ title = "Title-inbook",
+ chapter = "Chapter",
+ pages = "Pages",
+ publisher = "Publisher",
+ year = "Year"
+}
+
+% author, editor, or both
+% chapter, pages, or both
+% volume, number, or both
+
+@inbook {test-inbook,
+ author = "An Author",
+ editor = "An Editor",
+ title = "Title-inbook",
+ chapter = "Chapter",
+ pages = "Pages",
+ publisher = "Publisher",
+ year = "Year",
+ volume = "Volume",
+ number = "Number",
+ series = "Series",
+ type = "Type",
+ address = "Address",
+ edition = "Edition",
+ month = "Month",
+ note = "Note"
+}
+
+@incollection {test-incollection-min,
+ author = "An Author",
+ title = "Title-incollection",
+ booktitle = "Booktitle",
+ publisher = "Publisher",
+ year = "Year"
+}
+
+% volume, number, or both
+
+@incollection {test-incollection,
+ author = "An Author",
+ title = "Title-incollection",
+ booktitle = "Booktitle",
+ publisher = "Publisher",
+ year = "Year",
+ editor = "An Editor",
+ volume = "Volume",
+ number = "Number",
+ series = "Series",
+ type = "Type",
+ chapter = "Chapter",
+ pages = "Pages",
+ address = "Address",
+ edition = "Edition",
+ month = "Month",
+ note = "Note"
+}
+
+@inproceedings {test-inproceedings-min,
+ author = "An Author",
+ title = "Title-inproceedings",
+ booktitle = "Booktitle",
+ year = "Year"
+}
+
+% volume, number, or both
+
+@inproceedings {test-inproceedings,
+ author = "An Author",
+ title = "Title-inproceedings",
+ booktitle = "Booktitle",
+ year = "Year",
+ editor = "An Editor",
+ volume = "Volume",
+ number = "Number",
+ series = "Series",
+ pages = "Pages",
+ address = "Address",
+ month = "Month",
+ organization = "Organization",
+ publisher = "Publisher",
+ note = "Note"
+}
+
+@manual {test-manual-min,
+ title = "Title-manual"
+}
+
+@manual {test-manual,
+ title = "Title-manual",
+ author = "An Author",
+ organization = "Organization",
+ address = "Address",
+ edition = "Edition",
+ month = "Month",
+ year = "Year"
+ note = "Note"
+}
+
+
+@mastersthesis {test-mastersthesis-min,
+ author = "An Author",
+ title = "Title-mastersthesis",
+ school = "School",
+ year = "Year",
+}
+
+@mastersthesis {test-mastersthesis,
+ author = "An Author",
+ title = "Title-mastersthesis",
+ school = "School",
+ year = "Year",
+ type = "Type",
+ address = "Address",
+ month = "Month",
+ note = "Note"
+}
+
+@proceedings {test-proceedings-min,
+ title = "Title-proceedings",
+ year = "Year",
+}
+
+% volume, number, or both
+
+@proceedings {test-proceedings,
+ title = "Title-proceedings",
+ year = "Year",
+ editor = "An Editor",
+ volume = "Volume",
+ number = "Number",
+ series = "Series",
+ address = "Address",
+ month = "Month",
+ organization = "Organization",
+ publisher = "Publisher",
+ note = "Note"
+}
+
+@phdthesis {test-phdthesis-min,
+ author = "An Author",
+ title = "Title-phdthesis",
+ school = "School",
+ year = "Year",
+}
+
+@phdthesis {test-phdthesis,
+ author = "An Author",
+ title = "Title-phdthesis",
+ school = "School",
+ year = "Year",
+ type = "Type",
+ address = "Address",
+ month = "Month",
+ note = "Note"
+}
+
+@techreport {test-techreport-min,
+ author = "An Author",
+ title = "Title-techreport",
+ institution = "Institution",
+ year = "Year",
+}
+
+@techreport {test-techreport,
+ author = "An Author",
+ title = "Title-techreport",
+ institution = "Institution",
+ year = "Year",
+ type = "Type",
+ number = "Number",
+ address = "Address",
+ month = "Month",
+ note = "Note"
+}
+
+@misc {test-misc,
+ author = "An Author",
+ title = "Title-misc",
+ howpublished = "How-published",
+ month = "Month",
+ year = "Year",
+ note = "Note"
+}
+
+@unpublished {test-unpublished-min,
+ author = "An Author",
+ title = "Title-unpublished",
+ note = "Note"
+}
+
+@unpublished {test-unpublished,
+ author = "An Author",
+ title = "Title-unpublished",
+ note = "Note",
+ month = "Month",
+ year = "Year"
+}
+
+% some other test entries
+
+@misc {test-manyauthor,
+ author = "A Author and B Author and C Author and D Author and
+ E Author and F Author and G Author and H Author and
+ I Author and J Author and K Author and L Author and
+ M Author and N Author and O Author and P Author and
+ Q Author and R Author and S Author and T Author and
+ U Author and V Author and W Author and X Author and
+ Y Author and Z Author",
+ title = "Title-Many Authors"
+}
diff --git a/Master/texmf-dist/tex/context/base/publ-ini.lua b/Master/texmf-dist/tex/context/base/publ-ini.lua
index 102b2210453..25397727bff 100644
--- a/Master/texmf-dist/tex/context/base/publ-ini.lua
+++ b/Master/texmf-dist/tex/context/base/publ-ini.lua
@@ -6,138 +6,192 @@ if not modules then modules = { } end modules ['publ-ini'] = {
license = "see context related readme files"
}
--- we could store the destinations in the user list entries
+-- bah .. this 200 locals limit again ... so we need to split it as adding more
+-- do ... ends makes it messier
--- will move:
+-- plug the list sorted in the list mechanism (specification.sortorder)
-local lpegmatch = lpeg.match
-local P, R, C, Ct, Cs = lpeg.P, lpeg.R, lpeg.C, lpeg.Ct, lpeg.Cs
+-- If we define two datasets with the same bib file we can consider
+-- sharing the data but that means that we need to have a parent which
+-- in turn makes things messy if we start manipulating entries in
+-- different ways (future) .. not worth the trouble as we will seldom
+-- load big bib files many times and even then ... fonts are larger.
-local lpegmatch = lpeg.match
-local pattern = Cs((1 - P(1) * P(-1))^0 * (P(".")/"" + P(1)))
-
-local manipulators = {
- stripperiod = function(str) return lpegmatch(pattern,str) end,
- uppercase = characters.upper,
- lowercase = characters.lower,
-}
-
-local manipulation = C((1-P("->"))^1) * P("->") * C(P(1)^0)
-
-local pattern = manipulation / function(operation,str)
- local manipulator = manipulators[operation]
- return manipulator and manipulator(str) or str
-end
-
-local function manipulated(str)
- return lpegmatch(pattern,str) or str
-end
-
-utilities.parsers.manipulation = manipulation
-utilities.parsers.manipulators = manipulators
-utilities.parsers.manipulated = manipulated
-
-function commands.manipulated(str)
- context(manipulated(str))
-end
-
--- use: for rest in gmatch(reference,"[^, ]+") do
+-- A potential optimization is to work with current_dataset, current_tag when
+-- fetching fields but the code become real messy that way (many currents). The
+-- gain is not that large anyway because not much publication stuff is flushed.
local next, rawget, type, tostring, tonumber = next, rawget, type, tostring, tonumber
-local match, gmatch, format, gsub = string.match, string.gmatch, string.format, string.gsub
+local match, find = string.match, string.find
local concat, sort, tohash = table.concat, table.sort, table.tohash
local utfsub = utf.sub
+local mod = math.mod
local formatters = string.formatters
local allocate = utilities.storage.allocate
local settings_to_array, settings_to_set = utilities.parsers.settings_to_array, utilities.parsers.settings_to_set
local sortedkeys, sortedhash = table.sortedkeys, table.sortedhash
local setmetatableindex = table.setmetatableindex
local lpegmatch = lpeg.match
-local P, C, Ct = lpeg.P, lpeg.C, lpeg.Ct
-
-local report = logs.reporter("publications")
-local report_cite = logs.reporter("publications","cite")
-local report_reference = logs.reporter("publications","reference")
-
-local trace = false trackers.register("publications", function(v) trace = v end)
-local trace_cite = false trackers.register("publications.cite", function(v) trace_cite = v end)
-local trace_missing = false trackers.register("publications.cite.missing", function(v) trace_missing = v end)
-local trace_references = false trackers.register("publications.cite.references", function(v) trace_references = v end)
-
-local datasets = publications.datasets
-
-local variables = interfaces.variables
-
-local v_local = variables["local"]
-local v_global = variables["global"]
-
-local v_force = variables.force
-local v_standard = variables.standard
-local v_start = variables.start
-local v_none = variables.none
-local v_left = variables.left
-local v_right = variables.right
-local v_middle = variables.middle
-local v_inbetween = variables.inbetween
-local v_yes = variables.yes
-local v_short = variables.short
-local v_cite = variables.cite
-local v_default = variables.default
-local v_reference = variables.reference
-local v_dataset = variables.dataset
-local v_author = variables.author or "author"
-local v_editor = variables.editor or "editor"
-
-local numbertochar = converters.characters
-
-local logsnewline = logs.newline
-local logspushtarget = logs.pushtarget
-local logspoptarget = logs.poptarget
-local csname_id = token.csname_id
-
-local basicsorter = sorters.basicsorter -- (a,b)
-local sortcomparer = sorters.comparers.basic -- (a,b)
-local sortstripper = sorters.strip
-local sortsplitter = sorters.splitters.utf
-
-local settings_to_array = utilities.parsers.settings_to_array
+local P, S, C, Ct, R, Carg = lpeg.P, lpeg.S, lpeg.C, lpeg.Ct, lpeg.R, lpeg.Carg
+local upper = utf.upper
+
+local report = logs.reporter("publications")
+local report_cite = logs.reporter("publications","cite")
+local report_list = logs.reporter("publications","list")
+local report_reference = logs.reporter("publications","reference")
+local report_shorts = logs.reporter("publications","shorts")
+
+local trace = false trackers.register("publications", function(v) trace = v end)
+local trace_cite = false trackers.register("publications.cite", function(v) trace_cite = v end)
+local trace_missing = false trackers.register("publications.cite.missing", function(v) trace_missing = v end)
+local trace_references = false trackers.register("publications.cite.references", function(v) trace_references = v end)
+local trace_detail = false trackers.register("publications.detail", function(v) trace_detail = v end)
+local trace_shorts = false trackers.register("publications.shorts", function(v) trace_shorts = v end)
+
+publications = publications or { }
+local datasets = publications.datasets
+local writers = publications.writers
+local casters = publications.casters
+local detailed = publications.detailed
+local enhancer = publications.enhancer
+local enhancers = publications.enhancers
+
+local tracers = publications.tracers or { }
+publications.tracers = tracers
+
+local variables = interfaces.variables
+
+local v_local = variables["local"]
+local v_global = variables["global"]
+
+local v_force = variables.force
+local v_none = variables.none
+local v_yes = variables.yes
+local v_all = variables.all
+local v_always = variables.always
+local v_doublesided = variables.doublesided
+local v_default = variables.default
+local v_dataset = variables.dataset
+
+local conditionals = tex.conditionals
+
+local numbertochar = converters.characters
+
+local logsnewline = logs.newline
+local logspushtarget = logs.pushtarget
+local logspoptarget = logs.poptarget
+
+local isdefined = tex.isdefined
+
+----- basicsorter = sorters.basicsorter -- (a,b)
+----- sortstripper = sorters.strip
+----- sortsplitter = sorters.splitters.utf
+
+local manipulators = typesetters.manipulators
+local splitmanipulation = manipulators.splitspecification
+local applymanipulation = manipulators.applyspecification
+local manipulatormethods = manipulators.methods
+
+-- this might move elsewhere
+
+manipulatormethods.Word = converters.Word
+manipulatormethods.WORD = converters.WORD
+manipulatormethods.Words = converters.Words
+manipulatormethods.WORDS = converters.WORDS
local context = context
+local commands = commands
+local implement = interfaces.implement
+local ctx_setmacro = interfaces.setmacro
+
+local ctx_doifelse = commands.doifelse
+local ctx_doif = commands.doif
+local ctx_doifnot = commands.doifnot
+local ctx_gobbletwoarguments = context.gobbletwoarguments
-local ctx_setvalue = context.setvalue
-local ctx_firstoftwoarguments = context.firstoftwoarguments
-local ctx_secondoftwoarguments = context.secondoftwoarguments
-local ctx_firstofoneargument = context.firstofoneargument
-local ctx_gobbleoneargument = context.gobbleoneargument
------ ctx_directsetup = context.directsetup
-
-local ctx_btxlistparameter = context.btxlistparameter
-local ctx_btxcitevariantparameter = context.btxcitevariantparameter
-local ctx_btxlistvariantparameter = context.btxlistvariantparameter
-local ctx_btxdomarkcitation = context.btxdomarkcitation
local ctx_btxdirectlink = context.btxdirectlink
local ctx_btxhandlelistentry = context.btxhandlelistentry
+local ctx_btxhandlelisttextentry = context.btxhandlelisttextentry
local ctx_btxchecklistentry = context.btxchecklistentry
local ctx_btxchecklistcombi = context.btxchecklistcombi
-local ctx_btxsetcitereference = context.btxsetcitereference
-local ctx_btxsetlistreference = context.btxsetlistreference
-local ctx_btxmissing = context.btxmissing
+local ctx_btxsetdataset = context.btxsetdataset
local ctx_btxsettag = context.btxsettag
+local ctx_btxsetnumber = context.btxsetnumber
+local ctx_btxsetlanguage = context.btxsetlanguage
+local ctx_btxsetcombis = context.btxsetcombis
+local ctx_btxsetcategory = context.btxsetcategory
local ctx_btxcitesetup = context.btxcitesetup
+local ctx_btxsubcitesetup = context.btxsubcitesetup
+local ctx_btxpagesetup = context.btxpagesetup
local ctx_btxsetfirst = context.btxsetfirst
local ctx_btxsetsecond = context.btxsetsecond
+local ctx_btxsetthird = context.btxsetthird
local ctx_btxsetinternal = context.btxsetinternal
+local ctx_btxsetlefttext = context.btxsetlefttext
+local ctx_btxsetrighttext = context.btxsetrighttext
+local ctx_btxsetbefore = context.btxsetbefore
+local ctx_btxsetafter = context.btxsetafter
+local ctx_btxsetbacklink = context.btxsetbacklink
+local ctx_btxsetbacktrace = context.btxsetbacktrace
+local ctx_btxsetcount = context.btxsetcount
local ctx_btxsetconcat = context.btxsetconcat
+local ctx_btxsetoveflow = context.btxsetoverflow
+local ctx_btxsetfirstpage = context.btxsetfirstpage
+local ctx_btxsetlastpage = context.btxsetlastpage
+local ctx_btxsetfirstinternal = context.btxsetfirstinternal
+local ctx_btxsetlastinternal = context.btxsetlastinternal
+local ctx_btxstartcite = context.btxstartcite
+local ctx_btxstopcite = context.btxstopcite
+local ctx_btxstartciteauthor = context.btxstartciteauthor
+local ctx_btxstopciteauthor = context.btxstopciteauthor
local ctx_btxstartsubcite = context.btxstartsubcite
local ctx_btxstopsubcite = context.btxstopsubcite
+local ctx_btxstartlistentry = context.btxstartlistentry
+local ctx_btxstoplistentry = context.btxstoplistentry
+local ctx_btxlistsetup = context.btxlistsetup
+local ctx_btxflushauthor = context.btxflushauthor
+local ctx_btxsetnoflistentries = context.btxsetnoflistentries
+local ctx_btxsetcurrentlistentry = context.btxsetcurrentlistentry
+local ctx_btxsetcurrentlistindex = context.btxsetcurrentlistindex
+
+languages.data = languages.data or { }
+local data = languages.data
+
+local specifications = publications.specifications
+local currentspecification = specifications[false]
+local ignoredfields = { }
+publications.currentspecification = currentspecification
+
+local function setspecification(name)
+ currentspecification = specifications[name]
+ if trace then
+ report("setting specification %a",type(name) == "string" and name or "anything")
+ end
+ publications.currentspecification = currentspecification
+end
+
+publications.setspecification = setspecification
+
+implement {
+ name = "btxsetspecification",
+ actions = setspecification,
+ arguments = "string",
+}
+
+local optionalspace = lpeg.patterns.whitespace^0
+local prefixsplitter = optionalspace * lpeg.splitat(optionalspace * P("::") * optionalspace)
statistics.register("publications load time", function()
local publicationsstats = publications.statistics
local nofbytes = publicationsstats.nofbytes
if nofbytes > 0 then
return string.format("%s seconds, %s bytes, %s definitions, %s shortcuts",
- statistics.elapsedtime(publications),nofbytes,publicationsstats.nofdefinitions,publicationsstats.nofshortcuts)
+ statistics.elapsedtime(publications),
+ nofbytes,
+ publicationsstats.nofdefinitions or 0,
+ publicationsstats.nofshortcuts or 0
+ )
else
return nil
end
@@ -145,7 +199,6 @@ end)
luatex.registerstopactions(function()
local done = false
- local undefined = csname_id("undefined*crap")
for name, dataset in sortedhash(datasets) do
for command, n in sortedhash(dataset.commands) do
if not done then
@@ -155,16 +208,12 @@ luatex.registerstopactions(function()
logsnewline()
done = true
end
- local c = csname_id(command)
- if c and c ~= undefined then
+ if isdefined[command] then
report("%-20s %-20s % 5i %s",name,command,n,"known")
+ elseif isdefined[upper(command)] then
+ report("%-20s %-20s % 5i %s",name,command,n,"KNOWN")
else
- local u = csname_id(utf.upper(command))
- if u and u ~= undefined then
- report("%-20s %-20s % 5i %s",name,command,n,"KNOWN")
- else
- report("%-20s %-20s % 5i %s",name,command,n,"unknown")
- end
+ report("%-20s %-20s % 5i %s",name,command,n,"unknown")
end
end
end
@@ -182,638 +231,1244 @@ end)
local collected = allocate()
local tobesaved = allocate()
--- we use a a dedicated (and efficient as it know what it deals with) serializer,
--- also because we need to ignore the 'details' field
-
-local function serialize(t)
- local f_key_table = formatters[" [%q] = {"]
- local f_key_string = formatters[" %s = %q,"]
- local r = { "return {" }
- local m = 1
- for tag, entry in sortedhash(t) do
- m = m + 1
- r[m] = f_key_table(tag)
- local s = sortedkeys(entry)
- for i=1,#s do
- local k = s[i]
- -- if k ~= "details" then
+do
+
+ local function serialize(t)
+ local f_key_table = formatters[" [%q] = {"]
+ local f_key_string = formatters[" %s = %q,"]
+ local r = { "return {" }
+ local m = 1
+ for tag, entry in sortedhash(t) do
+ m = m + 1
+ r[m] = f_key_table(tag)
+ local s = sortedkeys(entry)
+ for i=1,#s do
+ local k = s[i]
m = m + 1
r[m] = f_key_string(k,entry[k])
- -- end
+ end
+ m = m + 1
+ r[m] = " },"
end
- m = m + 1
- r[m] = " },"
- end
- r[m] = "}"
- return concat(r,"\n")
-end
-
-local function finalizer()
- local prefix = tex.jobname -- or environment.jobname
- local setnames = sortedkeys(datasets)
- for i=1,#setnames do
- local name = setnames[i]
- local dataset = datasets[name]
- local userdata = dataset.userdata
- local checksum = nil
- local username = file.addsuffix(file.robustname(formatters["%s-btx-%s"](prefix,name)),"lua")
- if userdata and next(userdata) then
- if job.passes.first then
- local newdata = serialize(userdata)
- checksum = md5.HEX(newdata)
- io.savedata(username,newdata)
+ r[m] = "}"
+ return concat(r,"\n")
+ end
+
+ local function finalizer()
+ local prefix = tex.jobname -- or environment.jobname
+ local setnames = sortedkeys(datasets)
+ for i=1,#setnames do
+ local name = setnames[i]
+ local dataset = datasets[name]
+ local userdata = dataset.userdata
+ local checksum = nil
+ local username = file.addsuffix(file.robustname(formatters["%s-btx-%s"](prefix,name)),"lua")
+ if userdata and next(userdata) then
+ if job.passes.first then
+ local newdata = serialize(userdata)
+ checksum = md5.HEX(newdata)
+ io.savedata(username,newdata)
+ end
+ else
+ os.remove(username)
+ username = nil
end
- else
- os.remove(username)
- username = nil
- end
- local loaded = dataset.loaded
- local sources = dataset.sources
- local used = { }
- for i=1,#sources do
- local source = sources[i]
- if loaded[source.filename] ~= "previous" then -- or loaded[source.filename] == "current"
- used[#used+1] = source
- end
- end
- tobesaved[name] = {
- usersource = {
- filename = username,
- checksum = checksum,
- },
- datasources = used,
- }
+ local loaded = dataset.loaded
+ local sources = dataset.sources
+ local used = { }
+ for i=1,#sources do
+ local source = sources[i]
+ -- if loaded[source.filename] ~= "previous" then -- needs checking
+ if loaded[source.filename] ~= "previous" or loaded[source.filename] == "current" then
+ used[#used+1] = source
+ end
+ end
+ tobesaved[name] = {
+ usersource = {
+ filename = username,
+ checksum = checksum,
+ },
+ datasources = used,
+ }
+ end
end
-end
-local function initializer()
- statistics.starttiming(publications)
-collected = publications.collected or collected -- for the moment as we load runtime
- for name, state in next, collected do
- local dataset = datasets[name]
- local datasources = state.datasources
- local usersource = state.usersource
- if datasources then
- for i=1,#datasources do
- local filename = datasources[i].filename
- publications.load(dataset,filename,"previous")
+ local function initializer()
+ statistics.starttiming(publications)
+ for name, state in next, collected do
+ local dataset = datasets[name]
+ local datasources = state.datasources
+ local usersource = state.usersource
+ if datasources then
+ for i=1,#datasources do
+ local filename = datasources[i].filename
+ publications.load {
+ dataset = dataset,
+ filename = filename,
+ kind = "previous"
+ }
+ end
+ end
+ if usersource then
+ dataset.userdata = table.load(usersource.filename) or { }
end
end
- if usersource then
- dataset.userdata = table.load(usersource.filename) or { }
- end
+ statistics.stoptiming(publications)
+ function initializer() end -- will go, for now, runtime loaded
end
- statistics.stoptiming(publications)
- function initializer() end -- will go, for now, runtime loaded
-end
-job.register('publications.collected',tobesaved,initializer,finalizer)
+ job.register('publications.collected',tobesaved,initializer,finalizer)
-if not publications.authors then
- initializer() -- for now, runtime loaded
end
-local usedentries = { }
-local initialized = false
-
--- {
--- ["metadata"]=1,
--- ["references"]={
--- ["block"]="bodypart",
--- ["internal"]=2,
--- ["realpage"]=1,
--- ["section"]=0,
--- },
--- ["userdata"]={
--- ["btxref"]="Cleveland1985",
--- ["btxset"]="standard",
--- },
--- },
-
-setmetatableindex(usedentries,function(t,k)
- if not initialized then
- usedentries = { }
+-- we want to minimize references as there can be many (at least
+-- when testing)
+
+local nofcitations = 0
+local usedentries = nil
+local citetolist = nil
+local listtocite = nil
+local listtolist = nil
+
+do
+
+ local initialize = nil
+
+ initialize = function(t)
+ usedentries = allocate { }
+ citetolist = allocate { }
+ listtocite = allocate { }
+ listtolist = allocate { }
+ local names = { }
local internals = structures.references.internals
+ local p_collect = (C(R("09")^1) * Carg(1) / function(s,entry) listtocite[tonumber(s)] = entry end + P(1))^0
+ local nofunique = 0
+ local nofreused = 0
for i=1,#internals do
local entry = internals[i]
- local metadata = entry.metadata
- if metadata.kind == "full" then
- local userdata = entry.userdata
- if userdata then
- local set = userdata.btxset
- if set then
- local tag = userdata.btxref
- local s = usedentries[set]
- if s then
- local u = s[tag]
- if u then
- u[#u+1] = entry
- else
- u = { entry }
- s[tag] = u
+ if entry then
+ local metadata = entry.metadata
+ if metadata then
+ local kind = metadata.kind
+ if kind == "full" then
+ -- reference (in list)
+ local userdata = entry.userdata
+ if userdata then
+ local tag = userdata.btxref
+ if tag then
+ local set = userdata.btxset or v_default
+ local s = usedentries[set]
+ if s then
+ local u = s[tag]
+ if u then
+ u[#u+1] = entry
+ else
+ s[tag] = { entry }
+ end
+ nofreused = nofreused + 1
+ else
+ usedentries[set] = { [tag] = { entry } }
+ nofunique = nofunique + 1
+ end
+ -- alternative: collect prev in group
+ local bck = userdata.btxbck
+ if bck then
+ lpegmatch(p_collect,bck,1,entry) -- for s in string.gmatch(bck,"[^ ]+") do listtocite[tonumber(s)] = entry end
+ local lst = tonumber(userdata.btxlst)
+ if lst then
+ listtolist[lst] = entry
+ end
+ else
+ local int = tonumber(userdata.btxint)
+ if int then
+ listtocite[int] = entry
+ end
+ end
+ local detail = datasets[set].details[tag]
+-- todo: these have to be pluggable
+ if detail then
+ local author = detail.author
+ if author then
+ for i=1,#author do
+ local a = author[i]
+ local s = a.surnames
+ if s then
+ local c = concat(s,"+")
+ local n = names[c]
+ if n then
+ n[#n+1] = a
+ break
+ else
+ names[c] = { a }
+ end
+ end
+ end
+ end
+ end
end
- else
- usedentries[set] = { [tag] = { entry } }
end
+ elseif kind == "btx" or kind == "userdata" then -- will go: kind == "userdata"
+ -- list entry (each cite)
+ local userdata = entry.userdata
+ if userdata then
+ local int = tonumber(userdata.btxint)
+ if int then
+ citetolist[int] = entry
+ end
+ end
+ end
+ end
+ else
+ -- weird
+ end
+ end
+ for k, v in next, names do
+ local n = #v
+ if n > 1 then
+ local original = v[1].original
+ for i=2,n do
+ if original ~= v[i].original then
+ report("potential clash in name %a",k)
+ for i=1,n do
+ v[i].state = 1
+ end
+ break
end
end
end
end
- return usedentries[k]
+ if trace_detail then
+ report("%s unique bibentries: %s reused entries",nofunique,nofreused)
+ end
+ initialize = nil
end
-end)
--- local subsets = nil
--- local block = tex.count.btxblock
--- local collected = references.collected
--- local prefix = nil -- todo: dataset ?
--- if prefix and prefix ~= "" then
--- subsets = { collected[prefix] or collected[""] }
--- else
--- local components = references.productdata.components
--- local subset = collected[""]
--- if subset then
--- subsets = { subset }
--- else
--- subsets = { }
--- end
--- for i=1,#components do
--- local subset = collected[components[i]]
--- if subset then
--- subsets[#subsets+1] = subset
--- end
--- end
--- end
--- if #subsets == 0 then
--- subsets = { collected[""] }
--- end
--- local list = type(reference) == "string" and settings_to_array(reference) or reference
--- local todo = table.tohash(list)
--- if #subsets > 0 then
--- local result, nofresult, done = { }, 0, { }
--- for i=1,#subsets do
--- local subset = subsets[i]
--- for i=1,#list do
--- local rest = list[i]
--- local blk, tag, found = block, nil, nil
--- if block then
--- tag = f_destination(dataset,blk,rest)
--- found = subset[tag]
--- if not found then
--- for i=block-1,1,-1 do
--- tag = f_destination(dataset,i,rest)
--- found = subset[tag]
--- if found then
--- blk = i
--- break
--- end
--- end
--- end
--- end
--- if not found then
--- blk = "*"
--- tag = f_destination(dataset,blk,rest)
--- found = subset[tag]
--- end
--- if found then
--- local entries = found.entries
--- if entries then
--- local current = tonumber(entries.text) -- todo: no ranges when no tonumber
--- if current and not done[current] then
--- nofresult = nofresult + 1
--- result[nofresult] = { blk, rest, current, found.references.internal }
--- done[current] = true
--- end
--- end
--- end
--- end
--- end
-
-local reported = { }
-local finder = publications.finder
-
-local function findallused(dataset,reference,block,section)
-local finder = publications.finder
- local find = finder and finder(reference)
- local tags = not find and settings_to_array(reference)
- local todo = { }
- local okay = { } -- only if mark
- local set = usedentries[dataset]
- local valid = datasets[dataset].luadata
- if set then
- local function register(tag)
- local entry = set[tag]
- if entry then
- -- only once in a list
- if #entry == 1 then
- entry = entry[1]
+ usedentries = setmetatableindex(function(_,k) if initialize then initialize() end return usedentries[k] end)
+ citetolist = setmetatableindex(function(_,k) if initialize then initialize() end return citetolist [k] end)
+ listtocite = setmetatableindex(function(_,k) if initialize then initialize() end return listtocite [k] end)
+ listtolist = setmetatableindex(function(_,k) if initialize then initialize() end return listtolist [k] end)
+
+ function publications.usedentries()
+ if initialize then
+ initialize()
+ end
+ return usedentries
+ end
+
+end
+
+-- match:
+--
+-- [current|previous|following] section
+-- [current|previous|following] block
+-- [current|previous|following] component
+--
+-- by prefix
+-- by dataset
+
+local findallused do
+
+ local reported = { }
+ local finder = publications.finder
+
+ findallused = function(dataset,reference,internal)
+ local current = datasets[dataset]
+ local finder = publications.finder -- for the moment, not yet in all betas
+ local find = finder and finder(current,reference)
+ local tags = not find and settings_to_array(reference)
+ local todo = { }
+ local okay = { } -- only if mark
+ local set = usedentries[dataset]
+ local valid = current.luadata
+ local ordered = current.ordered
+ if set then
+ local registered = { }
+ local function register(tag)
+ if registered[tag] then
+ return
else
- -- find best match (todo)
- entry = entry[1] -- for now
+ registered[tag] = true
+ end
+ local entry = set[tag]
+ if entry then
+ -- only once in a list but at some point we can have more (if we
+ -- decide to duplicate)
+ if #entry == 1 then
+ entry = entry[1]
+ else
+ -- same block and section
+ local done = false
+ if internal and internal > 0 then
+ -- first following in list
+ for i=1,#entry do
+ local e = entry[i]
+ if e.references.internal > internal then
+ done = e
+ break
+ end
+ end
+ if not done then
+ -- last preceding in list
+ for i=1,#entry do
+ local e = entry[i]
+ if e.references.internal < internal then
+ done = e
+ else
+ break
+ end
+ end
+ end
+ end
+ if done then
+ entry = done
+ else
+ entry = entry[1]
+ end
+ end
+ okay[#okay+1] = entry
end
- okay[#okay+1] = entry
+ todo[tag] = true
end
- todo[tag] = true
- end
- if find then
- tags = { }
- for tag, entry in next, valid do
- local found = find(entry)
- if found then
+ if reference == "*" then
+ tags = { }
+ for i=1,#ordered do
+ local tag = ordered[i].tag
register(tag)
tags[#tags+1] = tag
end
- end
- else
- for i=1,#tags do
- local tag = tags[i]
- if valid[tag] then
- register(tag)
- elseif not reported[tag] then
- reported[tag] = true
- report_cite("non-existent entry %a in %a",tag,dataset)
+ elseif find then
+-- print("case 1.1")
+ tags = { }
+ for i=1,#ordered do
+ local entry = ordered[i]
+ if find(entry) then
+ local tag = entry.tag
+ register(tag)
+ tags[#tags+1] = tag
+ end
end
- end
- end
- else
- if find then
- tags = { }
- for tag, entry in next, valid do
- local found = find(entry)
- if found then
- todo[tag] = true
- tags[#tags+1] = tag
+ if #tags == 0 and not reported[reference] then
+ tags[1] = reference
+ reported[reference] = true
+ end
+ else
+-- print("case 1.2")
+ for i=1,#tags do
+ local tag = tags[i]
+ if valid[tag] then
+ register(tag)
+ elseif not reported[tag] then
+ reported[tag] = true
+ report_cite("non-existent entry %a in %a",tag,dataset)
+ end
end
end
else
- for i=1,#tags do
- local tag = tags[i]
- if valid[tag] then
- todo[tag] = true
- elseif not reported[tag] then
- reported[tag] = true
- report_cite("non-existent entry %a in %a",tag,dataset)
+ if find then
+-- print("case 2.1")
+ tags = { }
+ for i=1,#ordered do
+ local entry = ordered[i]
+ if find(entry) then
+ local tag = entry.tag
+ tags[#tags+1] = tag
+ todo[tag] = true
+ end
+ end
+ if #tags == 0 and not reported[reference] then
+ tags[1] = reference
+ reported[reference] = true
+ end
+ else
+-- print("case 2.2")
+ for i=1,#tags do
+ local tag = tags[i]
+ if valid[tag] then
+ todo[tag] = true
+ elseif not reported[tag] then
+ reported[tag] = true
+ report_cite("non-existent entry %a in %a",tag,dataset)
+ end
end
end
end
+ return okay, todo, tags
end
- return okay, todo, tags
+
end
-local function flushcollected(flush,nofcollected)
- if nofcollected > 0 then
- flush(1,1)
- if nofcollected > 2 then
- for i=2,nofcollected-1 do
- flush(i,2)
- end
- flush(nofcollected,3)
- elseif nofcollected > 1 then
- flush(nofcollected,4)
- end
+local function unknowncite(reference)
+ ctx_btxsettag(reference)
+ if trace_detail then
+ report("expanding %a cite setup %a","unknown","unknown")
+ end
+ ctx_btxcitesetup("unknown")
+end
+
+local concatstate = publications.concatstate
+
+local tobemarked = nil
+
+local function marknocite(dataset,tag,nofcitations,setup)
+ ctx_btxstartcite()
+ ctx_btxsetdataset(dataset)
+ ctx_btxsettag(tag)
+ ctx_btxsetbacklink(nofcitations)
+ if trace_detail then
+ report("expanding cite setup %a",setup)
end
+ ctx_btxcitesetup(setup)
+ ctx_btxstopcite()
end
-local function markcite(dataset,tag)
- if trace_cite then
- report_cite("mark, dataset: %s, tag: %s",dataset,tag)
+local function markcite(dataset,tag,flush)
+ if not tobemarked then
+ return 0
+ end
+ local citation = tobemarked[tag]
+ if not citation then
+ return 0
+ end
+ if citation == true then
+ nofcitations = nofcitations + 1
+ if trace_cite then
+ report_cite("mark, dataset: %s, tag: %s, number: %s, state: %s",dataset,tag,nofcitations,"cited")
+ end
+ if flush then
+ marknocite(dataset,tag,nofcitations,"nocite")
+ end
+ tobemarked[tag] = nofcitations
+ return nofcitations
+ else
+ return citation
end
- ctx_btxdomarkcitation(dataset,tag)
end
+local marked_dataset = nil
+local marked_list = nil
+
local function flushmarked(dataset,list,todo)
- if todo then
- for i=1,#list do
- local tag = list[i]
- if todo[tag] then
- markcite(dataset,tag)
+ marked_dataset = dataset
+ marked_list = list
+end
+
+local function btxflushmarked()
+ if marked_list and tobemarked then
+ for i=1,#marked_list do
+ -- keep order
+ local tag = marked_list[i]
+ local tbm = tobemarked[tag]
+ if tbm == true or not tbm then
+ nofcitations = nofcitations + 1
+ marknocite(marked_dataset,tag,nofcitations,tbm and "nocite" or "invalid")
+ if trace_cite then
+ report_cite("mark, dataset: %s, tag: %s, number: %s, state: %s",marked_dataset,tag,nofcitations,tbm and "unset" or "invalid")
+ end
end
end
end
+ tobemarked = nil
+ marked_dataset = nil
+ marked_list = nil
end
+implement { name = "btxflushmarked", actions = btxflushmarked }
+
-- basic access
-local function getfield(dataset,tag,name)
+local function getfield(dataset,tag,name) -- for the moment quick and dirty
local d = datasets[dataset].luadata[tag]
return d and d[name]
end
-local function getdetail(dataset,tag,name)
+local function getdetail(dataset,tag,name) -- for the moment quick and dirty
local d = datasets[dataset].details[tag]
return d and d[name]
end
-function commands.btxsingularorplural(dataset,tag,name) -- todo: make field dependent
- local d = datasets[dataset].details[tag]
- if d then
- d = d[name]
- end
- if d then
- d = #d <= 1
+local function getcasted(dataset,tag,field,specification)
+ local current = datasets[dataset]
+ if current then
+ local data = current.luadata[tag]
+ if data then
+ local category = data.category
+ if not specification then
+ specification = currentspecification
+ end
+ local catspec = specification.categories[category]
+ if not catspec then
+ return false
+ end
+ local fields = catspec.fields
+ if fields then
+ local sets = catspec.sets
+ if sets then
+ local set = sets[field]
+ if set then
+ for i=1,#set do
+ local field = set[i]
+ local value = fields[field] and data[field] -- redundant check
+ if value then
+ local kind = specification.types[field]
+ return detailed[kind][value], field, kind
+ end
+ end
+ end
+ end
+ local value = fields[field] and data[field] -- redundant check
+ if value then
+ local kind = specification.types[field]
+ return detailed[kind][value], field, kind
+ end
+ end
+ local data = current.details[tag]
+ if data then
+ local kind = specification.types[field]
+ return data[field], field, kind -- no check
+ end
+ end
end
- commands.doifelse(d)
end
--- basic loading
+local function getfaster(current,data,details,field,categories,types)
+ local category = data.category
+ local catspec = categories[category]
+ if not catspec then
+ return false
+ end
+ local fields = catspec.fields
+ if fields then
+ local sets = catspec.sets
+ if sets then
+ local set = sets[field]
+ if set then
+ for i=1,#set do
+ local field = set[i]
+ local value = fields[field] and data[field] -- redundant check
+ if value then
+ local kind = types[field]
+ return detailed[kind][value], field, kind
+ end
+ end
+ end
+ end
+ local value = fields[field] and data[field] -- redundant check
+ if value then
+ local kind = types[field]
+ return detailed[kind][value]
+ end
+ end
+ if details then
+ local kind = types[field]
+ return details[field]
+ end
+end
-function commands.usebtxdataset(name,filename)
- publications.load(datasets[name],filename,"current")
+local function getdirect(dataset,data,field,catspec) -- no field check, no dataset check
+ local catspec = (catspec or currentspecification).categories[data.category]
+ if not catspec then
+ return false
+ end
+ local fields = catspec.fields
+ if fields then
+ local sets = catspec.sets
+ if sets then
+ local set = sets[field]
+ if set then
+ for i=1,#set do
+ local field = set[i]
+ local value = fields[field] and data[field] -- redundant check
+ if value then
+ return value
+ end
+ end
+ end
+ end
+ return fields[field] and data[field] or nil -- redundant check
+ end
end
-function commands.convertbtxdatasettoxml(name,nice)
- publications.converttoxml(datasets[name],nice)
+local function getfuzzy(data,field,categories) -- no field check, no dataset check
+ local catspec
+ if categories then
+ local category = data.category
+ if category then
+ catspec = categories[data.category]
+ end
+ end
+ if not field then
+ return
+ elseif not catspec then
+ return data[field]
+ end
+ local fields = catspec.fields
+ if fields then
+ local sets = catspec.sets
+ if sets then
+ local set = sets[field]
+ if set then
+ for i=1,#set do
+ local field = set[i]
+ local value = fields[field] and data[field] -- redundant check
+ if value then
+ return value
+ end
+ end
+ end
+ end
+ return fields[field] and data[field] or nil -- redundant check
+ end
end
--- enhancing
+publications.getfield = getfield
+publications.getdetail = getdetail
+publications.getcasted = getcasted
+publications.getfaster = getfaster
+publications.getdirect = getdirect
+publications.getfuzzy = getfuzzy
+
+-- this needs to be checked: a specific type should have a checker
+
+-- author pagenumber keyword url
-local splitauthorstring = publications.authors.splitstring
+-- function commands.btxsingularorplural(dataset,tag,name)
+-- local d = getcasted(dataset,tag,name)
+-- if type(d) == "table" then
+-- d = #d <= 1
+-- else
+-- d = true
+-- end
+-- ctx_doifelse(d)
+-- end
-local pagessplitter = lpeg.splitat(P("-")^1)
+-- function commands.oneorrange(dataset,tag,name)
+-- local d = datasets[dataset].luadata[tag] -- details ?
+-- if d then
+-- d = d[name]
+-- end
+-- if type(d) == "string" then
+-- d = find(d,"%-")
+-- else
+-- d = false
+-- end
+-- ctx_doifelse(not d) -- so singular is default
+-- end
--- maybe not redo when already done
+-- function commands.firstofrange(dataset,tag,name)
+-- local d = datasets[dataset].luadata[tag] -- details ?
+-- if d then
+-- d = d[name]
+-- end
+-- if type(d) == "string" then
+-- context(match(d,"([^%-]+)"))
+-- end
+-- end
-function publications.enhance(dataset) -- for the moment split runs (maybe publications.enhancers)
- statistics.starttiming(publications)
- if type(dataset) == "string" then
- dataset = datasets[dataset]
+local inspectors = allocate()
+local nofmultiple = allocate()
+local firstandlast = allocate()
+
+publications.inspectors = inspectors
+inspectors.nofmultiple = nofmultiple
+inspectors.firstandlast = firstandlast
+
+function nofmultiple.author(d)
+ return type(d) == "table" and #d or 0
+end
+
+function publications.singularorplural(dataset,tag,name)
+ local data, field, kind = getcasted(dataset,tag,name)
+ if data then
+ local test = nofmultiple[kind]
+ if test then
+ local n = test(data)
+ return not n or n < 2
+ end
end
- local luadata = dataset.luadata
- local details = dataset.details
- -- author, editor
- for tag, entry in next, luadata do
- local author = entry.author
- local editor = entry.editor
- details[tag] = {
- author = author and splitauthorstring(author),
- editor = editor and splitauthorstring(editor),
- }
+ return true
+end
+
+function firstandlast.range(d)
+ if type(d) == "table" then
+ return d[1], d[2]
end
- -- short
- local shorts = { }
- for tag, entry in next, luadata do
- local author = details[tag].author
- if author then
- -- number depends on sort order
- local t = { }
- if #author == 0 then
- -- what
- else
- local n = #author == 1 and 3 or 1
- for i=1,#author do
- local surnames = author[i].surnames
- if not surnames or #surnames == 0 then
- -- error
- else
- t[#t+1] = utfsub(surnames[1],1,n)
- end
- end
- end
- local year = tonumber(entry.year) or 0
- local short = formatters["%t%02i"](t,math.mod(year,100))
- local s = shorts[short]
- if not s then
- shorts[short] = tag
- elseif type(s) == "string" then
- shorts[short] = { s, tag }
- else
- s[#s+1] = tag
- end
- else
- --
+end
+
+firstandlast.pagenumber = firstandlast.range
+
+function publications.oneorrange(dataset,tag,name)
+ local data, field, kind = getcasted(dataset,tag,name)
+ if data then
+ local test = firstandlast[kind]
+ if test then
+ local first, last = test(data)
+ return not (first and last)
end
end
- for short, tags in next, shorts do
- if type(tags) == "table" then
- sort(tags)
- for i=1,#tags do
- -- details[tags[i]].short = short .. numbertochar(i)
- local detail = details[tags[i]]
- detail.short = short
- detail.suffix = numbertochar(i)
+ return nil -- nothing at all
+end
+
+function publications.firstofrange(dataset,tag,name)
+ local data, field, kind = getcasted(dataset,tag,name)
+ if data then
+ local test = firstandlast[kind]
+ if test then
+ local first = test(data)
+ if first then
+ return first
end
- else
- details[tags].short = short
end
end
- -- pages
- for tag, entry in next, luadata do
- local pages = entry.pages
- if pages then
- local first, last = lpegmatch(pagessplitter,pages)
- details[tag].pages = first and last and { first, last } or pages
+end
+
+function publications.lastofrange(dataset,tag,name)
+ local data, field, kind = getcasted(dataset,tag,name)
+ if data then
+ local test = firstandlast[kind]
+ if test then
+ local first, last = test(data)
+ if last then
+ return last
+ end
end
end
- -- keywords
- for tag, entry in next, luadata do
- local keyword = entry.keyword
- if keyword then
- details[tag].keyword = settings_to_set(keyword)
+end
+
+local three_strings = { "string", "string", "string" }
+
+implement {
+ name = "btxsingularorplural",
+ actions = { publications.singularorplural, ctx_doifelse },
+ arguments = three_strings
+}
+
+implement {
+ name = "btxoneorrange",
+ actions = { publications.oneorrange, function(b) if b == nil then ctx_gobbletwoarguments() else ctx_doifelse(b) end end },
+ arguments = three_strings
+}
+
+implement {
+ name = "btxfirstofrange",
+ actions = { publications.firstofrange, context },
+ arguments = three_strings
+}
+
+implement {
+ name = "btxlastofrange",
+ actions = { publications.lastofrange, context },
+ arguments = three_strings
+}
+
+-- basic loading
+
+function publications.usedataset(specification)
+ specification.kind = "current"
+ publications.load(specification)
+end
+
+implement {
+ name = "btxusedataset",
+ actions = publications.usedataset,
+ arguments = {
+ {
+ { "specification" },
+ { "dataset" },
+ { "filename" },
+ }
+ }
+}
+
+implement {
+ name = "convertbtxdatasettoxml",
+ arguments = { "string", true },
+ actions = publications.converttoxml
+}
+
+-- enhancing
+
+do
+
+ -- maybe not redo when already done
+
+ local function shortsorter(a,b)
+ local ay, by = a[2], b[2]
+ if ay ~= by then
+ return ay < by
end
+ local ay, by = a[3], b[3]
+ if ay ~= by then
+ -- bah, bah, bah
+ local an, bn = tonumber(ay), tonumber(by)
+ if an and bn then
+ return an < bn
+ else
+ return ay < by
+ end
+ end
+ return a[4] < b[4]
end
- statistics.stoptiming(publications)
-end
-function commands.addbtxentry(name,settings,content)
- local dataset = datasets[name]
- if dataset then
- publications.addtexentry(dataset,settings,content)
+ -- We could avoid loops by combining enhancers but that makes it only
+ -- more messy and for documents that use publications the few extra milli
+ -- seconds are irrelevant (there is for sure more to gain by proper coding
+ -- of the source and or style).
+
+ local f_short = formatters["%t%02i"]
+
+ function publications.enhancers.suffixes(dataset)
+ if not dataset then
+ return -- bad news
+ else
+ report("analyzing previous publication run for %a",dataset.name)
+ end
+ local used = usedentries[dataset.name]
+ if not used then
+ return -- probably a first run
+ end
+ local luadata = dataset.luadata
+ local details = dataset.details
+ local ordered = dataset.ordered
+ if not luadata or not details or not ordered then
+ report("nothing to be analyzed in %a",dataset.name)
+ return -- also bad news
+ end
+ local field = "author" -- currently only author
+ local shorts = { }
+ for i=1,#ordered do
+ local entry = ordered[i]
+ if entry then
+ local tag = entry.tag
+ if tag then
+ local use = used[tag]
+ if use then
+ -- use is a table of used list entries (so there can be more) and we just look at
+ -- the first one for btx properties
+ local listentry = use[1]
+ local userdata = listentry.userdata
+ local btxspc = userdata and userdata.btxspc
+ if btxspc then
+ -- this will become a specification entry
+ local author = getcasted(dataset,tag,field,specifications[btxspc])
+ if type(author) == "table" then
+ -- number depends on sort order
+ local t = { }
+ if #author > 0 then
+ local n = #author == 1 and 3 or 1
+ for i=1,#author do
+ local surnames = author[i].surnames
+ if not surnames or #surnames == 0 then
+ -- error
+ else
+ t[#t+1] = utfsub(surnames[1],1,n)
+ end
+ end
+ end
+ local year = tonumber(entry.year) or 0
+ local short = f_short(t,mod(year,100))
+ local s = shorts[short]
+ -- we could also sort on reference i.e. entries.text
+ if u then
+ u = listentry.entries.text -- hm
+ else
+ u = "0"
+ end
+ if not s then
+ shorts[short] = { { tag, year, u, i } }
+ else
+ s[#s+1] = { tag, year, u, i }
+ end
+ else
+ report("author typecast expected for field %a",field)
+ end
+ else
+ --- no spec so let's forget about it
+ end
+ end
+ end
+ end
+ end
+ -- for short, tags in next, shorts do -- ordered ?
+ for short, tags in sortedhash(shorts) do -- ordered ?
+ local n = #tags
+ if n == 0 then
+ -- skip
+ elseif n == 1 then
+ local tagdata = tags[1]
+ local tag = tagdata[1]
+ local detail = details[tag]
+ local entry = luadata[tag]
+ local year = entry.year
+ detail.short = short
+ if year then
+ detail.suffixedyear = year
+ end
+ if trace_shorts then
+ report_shorts("year %a, suffix %a, short %a, tag %a",year or "-","-",short,tag)
+ end
+ elseif n > 1 then
+ sort(tags,shortsorter)
+ for i=1,n do
+ local tagdata = tags[i]
+ local tag = tagdata[1]
+ local detail = details[tag]
+ local suffix = numbertochar(i)
+ local entry = luadata[tag]
+ local year = entry.year
+ detail.short = short
+ detail.suffix = suffix
+ if year then
+ detail.suffixedyear = year .. suffix
+ end
+ if trace_shorts then
+ report_shorts("year %a, suffix %a, short %a, tag %a",year or "-",suffix or "-",short,tag)
+ end
+ end
+ end
+ end
end
+
+ utilities.sequencers.appendaction(enhancer,"system","publications.enhancers.suffixes")
+
end
-function commands.setbtxdataset(name)
+implement {
+ name = "btxaddentry",
+ actions = function(name,settings,content)
+ local dataset = datasets[name]
+ if dataset then
+ publications.addtexentry(dataset,settings,content)
+ end
+ end,
+ arguments = { "string", "string", "string" }
+}
+
+function publications.checkeddataset(name,default)
local dataset = rawget(datasets,name)
if dataset then
- context(name)
+ return name
+ elseif default and default ~= "" then
+ return default
else
- report("unknown dataset %a",name)
+ report("unknown dataset %a, forcing %a",name,v_default)
+ return v_default
end
end
-function commands.setbtxentry(name,tag)
- local dataset = rawget(datasets,name)
- if dataset then
- if dataset.luadata[tag] then
- context(tag)
+implement {
+ name = "btxsetdataset",
+ actions = { publications.checkeddataset, context },
+ arguments = { "string", "string"}
+}
+
+implement {
+ name = "btxsetentry",
+ actions = function(name,tag)
+ local dataset = rawget(datasets,name)
+ if dataset then
+ if dataset.luadata[tag] then
+ context(tag)
+ else
+ report("unknown tag %a in dataset %a",tag,name)
+ end
else
- report("unknown tag %a in dataset %a",tag,name)
+ report("unknown dataset %a",name)
end
- else
- report("unknown dataset %a",name)
- end
-end
+ end,
+ arguments = { "string", "string" },
+}
--- rendering of fields (maybe multiple manipulators)
+-- rendering of fields
--- local manipulation = utilities.parsers.manipulation
--- local manipulators = utilities.parsers.manipulators
---
--- local function checked(field)
--- local m, f = lpegmatch(manipulation,field)
--- if m then
--- return manipulators[m], f or field
--- else
--- return nil, field
--- end
--- end
+do
-local manipulation = Ct((C((1-P("->"))^1) * P("->"))^1) * C(P(1)^0)
-local manipulators = utilities.parsers.manipulators
+ local typesetters = { }
+ publications.typesetters = typesetters
-local function checked(field)
- local m, f = lpegmatch(manipulation,field)
- if m then
- return m, f or field
- else
- return nil, field
+ local function defaulttypesetter(field,value,manipulator)
+ if value and value ~= "" then
+ value = tostring(value)
+ context(manipulator and applymanipulation(manipulator,value) or value)
+ end
end
-end
-local function manipulated(actions,str)
- for i=1,#actions do
- local action = manipulators[actions[i]]
- if action then
- str = action(str) or str
+ setmetatableindex(typesetters,function(t,k)
+ local v = defaulttypesetter
+ t[k] = v
+ return v
+ end)
+
+ function typesetters.string(field,value,manipulator)
+ if value and value ~= "" then
+ context(manipulator and applymanipulation(manipulator,value) or value)
end
end
- return str
-end
-function commands.btxflush(name,tag,field)
- local dataset = rawget(datasets,name)
- if dataset then
- local fields = dataset.luadata[tag]
- if fields then
- local manipulator, field = checked(field)
- local value = fields[field]
- if type(value) == "string" then
- local suffixes = dataset.suffixes[tag]
- if suffixes then
- local suffix = suffixes[field]
- if suffix then
- value = value .. converters.characters(suffix)
- end
+ function typesetters.author(field,value,manipulator)
+ ctx_btxflushauthor(field)
+ end
+
+ -- function typesetters.url(field,value,manipulator)
+ -- ....
+ -- end
+
+ -- if there is no specification then we're in trouble but there is
+ -- always a default anyway
+ --
+ -- there's also always a fields table but it can be empty due to
+ -- lack of specifications
+ --
+ -- then there can be cases where we have no specification for instance
+ -- when we have a special kind of database
+
+ local splitter = lpeg.splitat(":")
+
+ local function permitted(category,field)
+ local catspec = currentspecification.categories[category]
+ if not catspec then
+ report("invalid category %a, %s",category,"no specification") -- can't happen
+ return false
+ end
+ local fields = catspec.fields
+ if not fields then
+ report("invalid category %a, %s",category,"no fields") -- can't happen
+ return false
+ end
+ if ignoredfields and ignoredfields[field] then
+ return false
+ end
+ local virtualfields = currentspecification.virtualfields
+ if virtualfields and virtualfields[field] then
+ return true
+ end
+ local sets = catspec.sets
+ if sets then
+ local set = sets[field]
+ if set then
+ return set
+ end
+ end
+ if fields[field] then
+ return true
+ end
+ local f, l = lpegmatch(splitter,field)
+ if f and l and fields[f] then
+ return true -- language specific one
+ end
+ end
+
+ local function found(dataset,tag,field,valid,fields)
+ if valid == true then
+ -- local fields = dataset.luadata[tag]
+ local okay = fields[field]
+ if okay then
+ return field, okay
+ end
+ local details = dataset.details[tag]
+ local value = details[field]
+ if value then
+ return field, value
+ end
+ elseif valid then
+ -- local fields = dataset.luadata[tag]
+ for i=1,#valid do
+ local field = valid[i]
+ local value = fields[field]
+ if value then
+ return field, value
end
- context(manipulator and manipulated(manipulator,value) or value)
- return
end
local details = dataset.details[tag]
- if details then
+ for i=1,#valid do
local value = details[field]
- if type(value) == "string" then
- local suffixes = dataset.suffixes[tag]
- if suffixes then
- local suffix = suffixes[field]
- if suffix then
- value = value .. converters.characters(suffix)
+ if value then
+ return field, value
+ end
+ end
+ end
+ end
+
+ local function get(dataset,tag,field,what,check,catspec) -- somewhat more extensive
+ local current = rawget(datasets,dataset)
+ if current then
+ local data = current.luadata[tag]
+ if data then
+ local category = data.category
+ local catspec = (catspec or currentspecification).categories[category]
+ if not catspec then
+ return false
+ end
+ local fields = catspec.fields
+ if fields then
+ local sets = catspec.sets
+ if sets then
+ local set = sets[field]
+ if set then
+ if check then
+ for i=1,#set do
+ local field = set[i]
+ local kind = (not check or data[field]) and fields[field]
+ if kind then
+ return what and kind or field
+ end
+ end
+ elseif what then
+ local t = { }
+ for i=1,#set do
+ t[i] = fields[set[i]] or "unknown"
+ end
+ return concat(t,",")
+ else
+ return concat(set,",")
+ end
end
end
- context(manipulator and manipulated(manipulator,value) or value)
- return
+ local kind = (not check or data[field]) and fields[field]
+ if kind then
+ return what and kind or field
+ end
end
end
- report("unknown field %a of tag %a in dataset %a",field,tag,name)
- else
- report("unknown tag %a in dataset %a",tag,name)
end
- else
- report("unknown dataset %a",name)
+ return ""
end
-end
-function commands.btxdetail(name,tag,field)
- local dataset = rawget(datasets,name)
- if dataset then
- local details = dataset.details[tag]
- if details then
- local manipulator, field = checked(field)
- local value = details[field]
- if type(value) == "string" then
- local suffixes = dataset.suffixes[tag]
- if suffixes then
- local suffix = suffixes[field]
- if suffix then
- value = value .. converters.characters(suffix)
+ publications.permitted = permitted
+ publications.found = found
+ publications.get = get
+
+ local function btxflush(name,tag,field)
+ local dataset = rawget(datasets,name)
+ if dataset then
+ local fields = dataset.luadata[tag]
+ if fields then
+ local manipulator, field = splitmanipulation(field)
+ local category = fields.category
+ local valid = permitted(category,field)
+ if valid then
+ local name, value = found(dataset,tag,field,valid,fields)
+ if value then
+ typesetters[currentspecification.types[name]](field,value,manipulator)
+ elseif trace_detail then
+ report("%s %s %a in category %a for tag %a in dataset %a","unknown","entry",field,category,tag,name)
end
+ elseif trace_detail then
+ report("%s %s %a in category %a for tag %a in dataset %a","invalid","entry",field,category,tag,name)
end
- context(manipulator and manipulated(manipulator,value) or value)
else
- report("unknown detail %a of tag %a in dataset %a",field,tag,name)
+ report("unknown tag %a in dataset %a",tag,name)
end
else
- report("unknown tag %a in dataset %a",tag,name)
+ report("unknown dataset %a",name)
end
- else
- report("unknown dataset %a",name)
end
-end
-function commands.btxfield(name,tag,field)
- local dataset = rawget(datasets,name)
- if dataset then
- local fields = dataset.luadata[tag]
- if fields then
- local manipulator, field = checked(field)
- local value = fields[field]
- if type(value) == "string" then
- local suffixes = dataset.suffixes[tag]
- if suffixes then
- local suffix = suffixes[field]
- if suffix then
- value = value .. converters.characters(suffix)
+ local function btxfield(name,tag,field)
+ local dataset = rawget(datasets,name)
+ if dataset then
+ local fields = dataset.luadata[tag]
+ if fields then
+ local category = fields.category
+ local manipulator, field = splitmanipulation(field)
+ if permitted(category,field) then
+ local value = fields[field]
+ if value then
+ typesetters[currentspecification.types[field]](field,value,manipulator)
+ elseif trace_detail then
+ report("%s %s %a in category %a for tag %a in dataset %a","unknown","field",field,category,tag,name)
end
+ elseif trace_detail then
+ report("%s %s %a in category %a for tag %a in dataset %a","invalid","field",field,category,tag,name)
end
- context(manipulator and manipulated(manipulator,value) or value)
else
- report("unknown field %a of tag %a in dataset %a",field,tag,name)
+ report("unknown tag %a in dataset %a",tag,name)
end
else
- report("unknown tag %a in dataset %a",tag,name)
+ report("unknown dataset %a",name)
end
- else
- report("unknown dataset %a",name)
end
-end
-
--- testing: to be speed up with testcase
-function commands.btxdoifelse(name,tag,field)
- local dataset = rawget(datasets,name)
- if dataset then
- local data = dataset.luadata[tag]
- local value = data and data[field]
- if value and value ~= "" then
- ctx_firstoftwoarguments()
- return
+ local function btxdetail(name,tag,field)
+ local dataset = rawget(datasets,name)
+ if dataset then
+ local fields = dataset.luadata[tag]
+ if fields then
+ local details = dataset.details[tag]
+ if details then
+ local category = fields.category
+ local manipulator, field = splitmanipulation(field)
+ if permitted(category,field) then
+ local value = details[field]
+ if value then
+ typesetters[currentspecification.types[field]](field,value,manipulator)
+ elseif trace_detail then
+ report("%s %s %a in category %a for tag %a in dataset %a","unknown","detail",field,category,tag,name)
+ end
+ elseif trace_detail then
+ report("%s %s %a in category %a for tag %a in dataset %a","invalid","detail",field,category,tag,name)
+ end
+ else
+ report("no details for tag %a in dataset %a",tag,name)
+ end
+ else
+ report("unknown tag %a in dataset %a",tag,name)
+ end
+ else
+ report("unknown dataset %a",name)
end
end
- ctx_secondoftwoarguments()
-end
-function commands.btxdoif(name,tag,field)
- local dataset = rawget(datasets,name)
- if dataset then
- local data = dataset.luadata[tag]
- local value = data and data[field]
- if value and value ~= "" then
- ctx_firstofoneargument()
- return
+ local function btxdirect(name,tag,field)
+ local dataset = rawget(datasets,name)
+ if dataset then
+ local fields = dataset.luadata[tag]
+ if fields then
+ local manipulator, field = splitmanipulation(field)
+ local value = fields[field]
+ if value then
+ context(typesetters.default(field,value,manipulator))
+ elseif trace_detail then
+ report("field %a of tag %a in dataset %a has no value",field,tag,name)
+ end
+ else
+ report("unknown tag %a in dataset %a",tag,name)
+ end
+ else
+ report("unknown dataset %a",name)
end
end
- ctx_gobbleoneargument()
-end
-function commands.btxdoifnot(name,tag,field)
- local dataset = rawget(datasets,name)
- if dataset then
- local data = dataset.luadata[tag]
- local value = data and data[field]
- if value and value ~= "" then
- ctx_gobbleoneargument()
- return
+ local function okay(name,tag,field)
+ local dataset = rawget(datasets,name)
+ if dataset then
+ local fields = dataset.luadata[tag]
+ if fields then
+ local category = fields.category
+ local valid = permitted(category,field)
+ if valid then
+ local value, field = found(dataset,tag,field,valid,fields)
+ return value and value ~= ""
+ end
+ end
end
end
- ctx_firstofoneargument()
+
+ publications.okay = okay
+
+ implement { name = "btxfield", actions = btxfield, arguments = { "string", "string", "string" } }
+ implement { name = "btxdetail", actions = btxdetail, arguments = { "string", "string", "string" } }
+ implement { name = "btxflush", actions = btxflush, arguments = { "string", "string", "string" } }
+ implement { name = "btxdirect", actions = btxdirect, arguments = { "string", "string", "string" } }
+
+ implement { name = "btxfieldname", actions = { get, context }, arguments = { "string", "string", "string", false, false } }
+ implement { name = "btxfieldtype", actions = { get, context }, arguments = { "string", "string", "string", true, false } }
+ implement { name = "btxfoundname", actions = { get, context }, arguments = { "string", "string", "string", false, true } }
+ implement { name = "btxfoundtype", actions = { get, context }, arguments = { "string", "string", "string", true, true } }
+
+ implement { name = "btxdoifelse", actions = { okay, ctx_doifelse }, arguments = { "string", "string", "string" } }
+ implement { name = "btxdoif", actions = { okay, ctx_doif }, arguments = { "string", "string", "string" } }
+ implement { name = "btxdoifnot", actions = { okay, ctx_doifnot }, arguments = { "string", "string", "string" } }
+
end
-- -- alternative approach: keep data at the tex end
@@ -826,1124 +1481,1616 @@ function publications.singularorplural(singular,plural)
end
end
-local patterns = { "publ-imp-%s.mkiv", "publ-imp-%s.tex" }
+-- loading
-local function failure(name)
- report("unknown library %a",name)
-end
+do
-local function action(name,foundname)
- context.input(foundname)
-end
+ local patterns = {
+ "publ-imp-%s.mkvi",
+ "publ-imp-%s.mkiv",
+ "publ-imp-%s.tex",
+ }
+
+ local function failure(name)
+ report("unknown library %a",name)
+ end
+
+ local function action(name,foundname)
+ context.input(foundname)
+ end
-function commands.loadbtxdefinitionfile(name) -- a more specific name
- commands.uselibrary {
- name = gsub(name,"^publ%-",""),
- patterns = patterns,
- action = action,
- failure = failure,
- onlyonce = false,
+ function publications.loaddefinitionfile(name) -- a more specific name
+ resolvers.uselibrary {
+ name = string.gsub(name,"^publ%-",""),
+ patterns = patterns,
+ action = action,
+ failure = failure,
+ onlyonce = true,
+ }
+ end
+
+ local patterns = {
+ "publ-imp-%s.lua",
}
-end
--- lists:
+ function publications.loadreplacementfile(name) -- a more specific name
+ resolvers.uselibrary {
+ name = string.gsub(name,"^publ%-",""),
+ patterns = patterns,
+ action = publications.loaders.registercleaner,
+ failure = failure,
+ onlyonce = true,
+ }
+ end
-publications.lists = publications.lists or { }
-local lists = publications.lists
+ implement { name = "btxloaddefinitionfile", actions = publications.loaddefinitionfile, arguments = "string" }
+ implement { name = "btxloadreplacementfile", actions = publications.loadreplacementfile, arguments = "string" }
-local context = context
-local structures = structures
+end
-local references = structures.references
-local sections = structures.sections
+-- lists
--- per rendering
+do
-local renderings = { } --- per dataset
+ publications.lists = publications.lists or { }
+ local lists = publications.lists
-setmetatableindex(renderings,function(t,k)
- local v = {
- list = { },
- done = { },
- alldone = { },
- used = { },
- registered = { },
- ordered = { },
- shorts = { },
- method = v_none,
- currentindex = 0,
- }
- t[k] = v
- return v
-end)
+ local context = context
+ local structures = structures
--- why shorts vs tags: only for sorting
+ local references = structures.references
+ local sections = structures.sections
-function lists.register(dataset,tag,short) -- needs checking now that we split
- local r = renderings[dataset]
- if not short or short == "" then
- short = tag
- end
- if trace then
- report("registering publication entry %a with shortcut %a",tag,short)
- end
- local top = #r.registered + 1
- -- do we really need these
- r.registered[top] = tag
- r.ordered [tag] = top
- r.shorts [tag] = short
-end
+ -- per rendering
-function lists.nofregistered(dataset)
- return #renderings[dataset].registered
-end
+ local renderings = { } --- per dataset
-function lists.setmethod(dataset,method)
- local r = renderings[dataset]
- r.method = method or v_none
- r.list = { }
- r.done = { }
-end
+ setmetatableindex(renderings,function(t,k)
+ local v = {
+ list = { },
+ done = { },
+ alldone = { },
+ used = { },
+ registered = { },
+ ordered = { },
+ shorts = { },
+ method = v_none,
+ texts = setmetatableindex("table"),
+ currentindex = 0,
+ }
+ t[k] = v
+ return v
+ end)
-local function validkeyword(dataset,tag,keyword)
- local ds = datasets[dataset]
- if not ds then
- report("unknown dataset %a",dataset)
- return
+ -- helper
+
+ function lists.register(dataset,tag,short) -- needs checking now that we split
+ local r = renderings[dataset]
+ if not short or short == "" then
+ short = tag
+ end
+ if trace then
+ report("registering publication entry %a with shortcut %a",tag,short)
+ end
+ local top = #r.registered + 1
+ -- do we really need these
+ r.registered[top] = tag
+ r.ordered [tag] = top
+ r.shorts [tag] = short
end
- local dt = ds.details[tag]
- if not dt then
- report("no details for tag %a",tag)
- return
+
+ function lists.nofregistered(dataset)
+ return #renderings[dataset].registered
end
- local kw = dt.keyword
- if kw then
- for k in next, keyword do
- if kw[k] then
- return true
+
+ local function validkeyword(dataset,tag,keyword,specification) -- todo: pass specification
+ local kw = getcasted(dataset,tag,"keywords",specification)
+ if kw then
+ for i=1,#kw do
+ if keyword[kw[i]] then
+ return true
+ end
end
end
end
-end
-function lists.collectentries(specification)
- local dataset = specification.btxdataset
- if not dataset then
- return
+ local function registerpage(pages,tag,result,listindex)
+ local p = pages[tag]
+ local r = result[listindex].references
+ if p then
+ local last = p[#p][2]
+ local real = last.realpage
+ if real ~= r.realpage then
+ p[#p+1] = { listindex, r }
+ end
+ else
+ pages[tag] = { { listindex, r } }
+ end
end
- local rendering = renderings[dataset]
- local method = rendering.method
- if method == v_none then
- return
+
+ local methods = { }
+ lists.methods = methods
+
+ methods[v_dataset] = function(dataset,rendering,keyword)
+ -- why only once unless criterium=all?
+ local current = datasets[dataset]
+ local luadata = current.luadata
+ local list = rendering.list
+ for tag, data in sortedhash(luadata) do
+ if not keyword or validkeyword(dataset,tag,keyword) then
+ list[#list+1] = { tag, false, 0, false, false, data.index or 0}
+ end
+ end
end
- local result = structures.lists.filter(specification)
- --
- local keyword = specification.keyword
- if keyword and keyword ~= "" then
- keyword = settings_to_set(keyword)
- else
- keyword = nil
- end
- lists.result = result
- local section = sections.currentid()
- local list = rendering.list
- local done = rendering.done
- local alldone = rendering.alldone
- if method == v_local then
+
+ -- todo: names = { "btx" }
+
+ methods[v_force] = function (dataset,rendering,keyword)
+ -- only for checking, can have duplicates, todo: collapse page numbers, although
+ -- we then also needs deferred writes
+ local result = structures.lists.filter(rendering.specifications) or { }
+ local list = rendering.list
+ local current = datasets[dataset]
+ local luadata = current.luadata
for listindex=1,#result do
local r = result[listindex]
- local u = r.userdata
- if u and u.btxset == dataset then
- local tag = u.btxref
- if tag and done[tag] ~= section then
- if not keyword or validkeyword(dataset,tag,keyword) then
- done[tag] = section
- alldone[tag] = true
- list[#list+1] = { tag, listindex }
+ local u = r.userdata -- better check on metadata.kind == "btx"
+ if u then
+ local set = u.btxset or v_default
+ if set == dataset then
+ local tag = u.btxref
+ if tag and (not keyword or validkeyword(dataset,tag,keyword)) then
+ local data = luadata[tag]
+ list[#list+1] = { tag, listindex, 0, u, u.btxint, data and data.index or 0 }
end
end
end
end
- elseif method == v_global then
+ lists.result = result
+ end
+
+ -- local : if tag and done[tag] ~= section then ...
+ -- global : if tag and not alldone[tag] and done[tag] ~= section then ...
+
+ methods[v_local] = function(dataset,rendering,keyword)
+ local result = structures.lists.filter(rendering.specifications) or { }
+ local section = sections.currentid()
+ local list = rendering.list
+ local repeated = rendering.repeated == v_yes
+ local r_done = rendering.done
+ local r_alldone = rendering.alldone
+ local done = repeated and { } or r_done
+ local alldone = repeated and { } or r_alldone
+ local doglobal = rendering.method == v_global
+ local traced = { } -- todo: only if interactive (backlinks) or when tracing
+ local pages = { }
+ local current = datasets[dataset]
+ local luadata = current.luadata
+ -- handy for tracing :
+ rendering.result = result
+ --
for listindex=1,#result do
local r = result[listindex]
local u = r.userdata
- if u and u.btxset == dataset then
- local tag = u.btxref
- if tag and not alldone[tag] and done[tag] ~= section then
- if not keyword or validkeyword(dataset,tag,keyword) then
- done[tag] = section
- alldone[tag] = true
- list[#list+1] = { tag, listindex }
+ if u then -- better check on metadata.kind == "btx"
+ local set = u.btxset or v_default
+ if set == dataset then
+ local tag = u.btxref
+ if not tag then
+ -- problem
+ elseif done[tag] == section then -- a bit messy for global and all and so
+ -- skip
+ elseif doglobal and alldone[tag] then
+ -- skip
+ elseif not keyword or validkeyword(dataset,tag,keyword) then
+ if traced then
+ local l = traced[tag]
+ if l then
+ l[#l+1] = u.btxint
+ else
+ local data = luadata[tag]
+ local l = { tag, listindex, 0, u, u.btxint, data and data.index or 0 }
+ list[#list+1] = l
+ traced[tag] = l
+ end
+ else
+ done[tag] = section
+ alldone[tag] = true
+ local data = luadata[tag]
+ list[#list+1] = { tag, listindex, 0, u, u.btxint, data and data.index or 0 }
+ end
+ end
+ if tag then
+ registerpage(pages,tag,result,listindex)
end
end
end
end
- elseif method == v_force then
- -- only for checking, can have duplicates, todo: collapse page numbers, although
- -- we then also needs deferred writes
- for listindex=1,#result do
- local r = result[listindex]
- local u = r.userdata
- if u and u.btxset == dataset then
- local tag = u.btxref
- if tag then
- if not keyword or validkeyword(dataset,tag,keyword) then
- list[#list+1] = { tag, listindex }
+ if traced then
+ for tag in next, traced do
+ done[tag] = section
+ alldone[tag] = true
+ end
+ end
+ lists.result = result
+ structures.lists.result = result
+ rendering.pages = pages -- or list.pages
+ end
+
+ methods[v_global] = methods[v_local]
+
+ function lists.collectentries(specification)
+ local dataset = specification.dataset
+ if not dataset then
+ return
+ end
+ local rendering = renderings[dataset]
+ if not rendering then
+ return
+ end
+ local method = specification.method or v_none
+ local ignored = specification.ignored or ""
+ rendering.method = method
+ rendering.ignored = ignored ~= "" and settings_to_set(ignored) or nil
+ rendering.list = { }
+ rendering.done = { }
+ rendering.sorttype = specification.sorttype or v_default
+ rendering.criterium = specification.criterium or v_none
+ rendering.repeated = specification.repeated or v_no
+ rendering.group = specification.group or ""
+ rendering.specifications = specification
+ local filtermethod = methods[method]
+ if not filtermethod then
+ report_list("invalid method %a",method or "")
+ return
+ end
+ lists.result = { } -- kind of reset
+ local keyword = specification.keyword
+ if keyword and keyword ~= "" then
+ keyword = settings_to_set(keyword)
+ else
+ keyword = nil
+ end
+ filtermethod(dataset,rendering,keyword)
+ local list = rendering.list
+ ctx_btxsetnoflistentries(list and #list or 0)
+ end
+
+ -- for determining width
+
+ local groups = setmetatableindex("number")
+
+ function lists.prepareentries(dataset)
+ local rendering = renderings[dataset]
+ local list = rendering.list
+ local used = rendering.used
+ local forceall = rendering.criterium == v_all
+ local repeated = rendering.repeated == v_yes
+ local sorttype = rendering.sorttype or v_default
+ local group = rendering.group or ""
+ local sorter = lists.sorters[sorttype]
+ local current = datasets[dataset]
+ local luadata = current.luadata
+ local details = current.details
+ local newlist = { }
+ local lastreferencenumber = groups[group] -- current.lastreferencenumber or 0
+ for i=1,#list do
+ local li = list[i]
+ local tag = li[1]
+ local entry = luadata[tag]
+ if entry then
+ if forceall or repeated or not used[tag] then
+ newlist[#newlist+1] = li
+ -- already here:
+ if not repeated then
+ used[tag] = true -- beware we keep the old state (one can always use criterium=all)
+ end
+ local detail = details[tag]
+ if detail then
+ local referencenumber = detail.referencenumber
+ if not referencenumber then
+ lastreferencenumber = lastreferencenumber + 1
+ referencenumber = lastreferencenumber
+ detail.referencenumber = lastreferencenumber
+ end
+ li[3] = referencenumber
+ else
+ report("missing details for tag %a in dataset %a (enhanced: %s)",tag,dataset,current.enhanced and "yes" or "no")
+ -- weird, this shouldn't happen .. all have a detail
+ lastreferencenumber = lastreferencenumber + 1
+ details[tag] = { referencenumber = lastreferencenumber }
+ li[3] = lastreferencenumber
end
end
end
end
- elseif method == v_dataset then
- local luadata = datasets[dataset].luadata
- for tag, data in table.sortedhash(luadata) do
- if not keyword or validkeyword(dataset,tag,keyword) then
- list[#list+1] = { tag }
+ groups[group] = lastreferencenumber
+ if type(sorter) == "function" then
+ rendering.list = sorter(dataset,rendering,newlist,sorttype) or newlist
+ else
+ rendering.list = newlist
+ end
+ end
+
+ function lists.fetchentries(dataset)
+ local rendering = renderings[dataset]
+ local list = rendering.list
+ if list then
+ for i=1,#list do
+ local li = list[i]
+ ctx_btxsettag(li[1])
+ ctx_btxsetnumber(li[3])
+ ctx_btxchecklistentry()
end
end
end
-end
-lists.sorters = {
- [v_short] = function(dataset,rendering,list)
- local shorts = rendering.shorts
- local function compare(a,b)
- local aa, bb = a and a[1], b and b[1]
- if aa and bb then
- aa, bb = shorts[aa], shorts[bb]
- return aa and bb and aa < bb
+ -- for rendering
+
+ -- setspecification
+
+ local function btxflushpages(dataset,tag)
+ -- todo: interaction
+ local rendering = renderings[dataset]
+ local pages = rendering.pages
+ if not pages then
+ return
+ else
+ pages = pages[tag]
+ end
+ if not pages then
+ return
+ end
+ local nofpages = #pages
+ if nofpages == 0 then
+ return
+ end
+ local first_p = nil
+ local first_r = nil
+ local last_p = nil
+ local last_r = nil
+ local ranges = { }
+ local nofdone = 0
+ local function flush()
+ if last_r and first_r ~= last_r then
+ ranges[#ranges+1] = { first_p, last_p }
+ else
+ ranges[#ranges+1] = { first_p }
end
- return false
end
- sort(list,compare)
- end,
- [v_reference] = function(dataset,rendering,list)
- local function compare(a,b)
- local aa, bb = a and a[1], b and b[1]
- if aa and bb then
- return aa and bb and aa < bb
+ for i=1,nofpages do
+ local next_p = pages[i]
+ local next_r = next_p[2].realpage
+ if not first_r then
+ first_p = next_p
+ first_r = next_r
+ elseif last_r + 1 == next_r then
+ -- continue
+ elseif first_r then
+ flush()
+ first_p = next_p
+ first_r = next_r
end
- return false
+ last_p = next_p
+ last_r = next_r
end
- sort(list,compare)
- end,
- [v_dataset] = function(dataset,rendering,list)
- local function compare(a,b)
- local aa, bb = a and a[1], b and b[1]
- if aa and bb then
- aa, bb = list[aa].index or 0, list[bb].index or 0
- return aa and bb and aa < bb
+ if first_r then
+ flush()
+ end
+ local nofranges = #ranges
+ for i=1,nofranges do
+ local r = ranges[i]
+ ctx_btxsetconcat(concatstate(i,nofranges))
+ local first, last = r[1], r[2]
+ ctx_btxsetfirstinternal(first[2].internal)
+ ctx_btxsetfirstpage(first[1])
+ if last then
+ ctx_btxsetlastinternal(last[2].internal)
+ ctx_btxsetlastpage(last[1])
end
- return false
+ if trace_detail then
+ report("expanding page setup")
+ end
+ ctx_btxpagesetup()
end
- sort(list,compare)
- end,
- -- [v_default] = function(dataset,rendering,list) -- not really needed
- -- local ordered = rendering.ordered
- -- local function compare(a,b)
- -- local aa, bb = a and a[1], b and b[1]
- -- if aa and bb then
- -- aa, bb = ordered[aa], ordered[bb]
- -- return aa and bb and aa < bb
- -- end
- -- return false
- -- end
- -- sort(list,compare)
- -- end,
- [v_author] = function(dataset,rendering,list)
- local valid = publications.authors.preparedsort(dataset,list,v_author,v_editor)
- if #valid == 0 or #valid ~= #list then
- -- nothing to sort
- else
- -- if needed we can wrap compare and use the list directly but this is cleaner
- sorters.sort(valid,sortcomparer)
- for i=1,#valid do
- local v = valid[i]
- valid[i] = list[v.index]
+ end
+
+ implement {
+ name = "btxflushpages",
+ actions = btxflushpages,
+ arguments = { "string", "string" }
+ }
+
+ function lists.sameasprevious(dataset,i,name,order,method)
+ local rendering = renderings[dataset]
+ local list = rendering.list
+ local n = tonumber(i)
+ if n and n > 1 and n <= #list then
+ local luadata = datasets[dataset].luadata
+ local current = getdirect(dataset,luadata[list[n ][1]],name)
+ local previous = getdirect(dataset,luadata[list[n-1][1]],name)
+ -- if not order then
+ -- order = gettexcounter("c_btx_list_reference")
+ -- end
+ if order and order > 0 and (method == v_always or method == v_doublesided) then
+ local clist = listtolist[order]
+ local plist = listtolist[order-1]
+ if clist and plist then
+ local crealpage = clist.references.realpage
+ local prealpage = plist.references.realpage
+ if crealpage ~= prealpage then
+ if method == v_always or not conditionals.layoutisdoublesided then
+ if trace_detail then
+ report("previous %a, current %a, different page",previous,current)
+ end
+ return false
+ elseif crealpage % 2 == 0 then
+ if trace_detail then
+ report("previous %a, current %a, different page",previous,current)
+ end
+ return false
+ end
+ end
+ end
end
- return valid
+ local sameentry = current and current == previous
+ if trace_detail then
+ if sameentry then
+ report("previous %a, current %a, same entry",previous,current)
+ else
+ report("previous %a, current %a, different entry",previous,current)
+ end
+ end
+ return sameentry
+ else
+ return false
end
- end,
-}
+ end
-function lists.flushentries(dataset,sortvariant)
- local rendering = renderings[dataset]
- local list = rendering.list
- local sort = lists.sorters[sortvariant] or lists.sorters[v_default]
- if type(sort) == "function" then
- list = sort(dataset,rendering,list) or list
- end
- for i=1,#list do
- -- we can pass i here too ... more efficient to avoid the setvalue
- local tag = list[i][1]
- local entry = datasets[dataset].luadata[tag]
- if entry then
- ctx_setvalue("currentbtxindex",i) -- todo: helper
+ function lists.flushentry(dataset,i,textmode)
+ local rendering = renderings[dataset]
+ local list = rendering.list
+ local luadata = datasets[dataset].luadata
+ local li = list[i]
+ if li then
+ local tag = li[1]
+ local listindex = li[2]
+ local n = li[3]
+ local entry = luadata[tag]
+ --
+ ctx_btxstartlistentry()
+ ctx_btxsetcurrentlistentry(i) -- redundant
+ ctx_btxsetcurrentlistindex(listindex or 0)
local combined = entry.combined
+ local language = entry.language
if combined then
- ctx_setvalue("currentbtxcombis",concat(combined,","))
+ ctx_btxsetcombis(concat(combined,","))
+ end
+ ctx_btxsetcategory(entry.category or "unknown")
+ ctx_btxsettag(tag)
+ ctx_btxsetnumber(n)
+ if language then
+ ctx_btxsetlanguage(language)
+ end
+ local bl = li[5]
+ if bl and bl ~= "" then
+ ctx_btxsetbacklink(bl)
+ ctx_btxsetbacktrace(concat(li," ",5))
+ local uc = citetolist[tonumber(bl)]
+ if uc then
+ ctx_btxsetinternal(uc.references.internal or "")
+ end
else
- ctx_setvalue("currentbtxcombis","")
+ -- nothing
+ end
+ local userdata = li[4]
+ if userdata then
+ local b = userdata.btxbtx
+ local a = userdata.btxatx
+ if b then
+ ctx_btxsetbefore(b)
+ end
+ if a then
+ ctx_btxsetafter(a)
+ end
end
- ctx_btxhandlelistentry(tag) -- pas i instead
+ rendering.userdata = userdata
+ if textmode then
+ ctx_btxhandlelisttextentry()
+ else
+ ctx_btxhandlelistentry()
+ end
+ ctx_btxstoplistentry()
+ --
+ -- context(function()
+ -- -- wrapup
+ -- rendering.ignoredfields = nil
+ -- end)
end
- end
-end
+ end
-function lists.fetchentries(dataset)
- local list = renderings[dataset].list
- for i=1,#list do
- local tag = list[i][1]
- local entry = datasets[dataset].luadata[tag]
- if entry then
- ctx_btxchecklistentry(tag) -- integrate doifalreadyplaced here
+ local function getuserdata(dataset,key)
+ local rendering = renderings[dataset]
+ if rendering then
+ local userdata = rendering.userdata
+ if userdata then
+ local value = userdata[key]
+ if value and value ~= "" then
+ return value
+ end
+ end
end
end
-end
-function lists.filterall(dataset)
- local r = renderings[dataset]
- local list = r.list
- local registered = r.registered
- for i=1,#registered do
- list[i] = { registered[i], i }
- end
-end
+ lists.uservariable = getuserdata
-function lists.registerplaced(dataset,tag)
- renderings[dataset].used[tag] = true
-end
-
-function lists.doifalreadyplaced(dataset,tag)
- commands.doifelse(renderings[dataset].used[tag])
-end
-
--- we ask for <n>:tag but when we can't find it we go back
--- to look for previous definitions, and when not found again
--- we look forward
+ function lists.filterall(dataset)
+ local r = renderings[dataset]
+ local list = r.list
+ local registered = r.registered
+ for i=1,#registered do
+ list[i] = { registered[i], i, 0, false, false }
+ end
+ end
-local function compare(a,b)
- local aa, bb = a and a[3], b and b[3]
- return aa and bb and aa < bb
-end
+ implement {
+ name = "btxuservariable",
+ actions = { getuserdata, context },
+ arguments = { "string", "string" }
+ }
--- rendering ?
+ implement {
+ name = "btxdoifelseuservariable",
+ actions = { getuserdata, ctx_doifelse },
+ arguments = { "string", "string" }
+ }
--- todo: nicer refs
+ -- implement {
+ -- name = "btxresolvelistreference",
+ -- actions = lists.resolve,
+ -- arguments = { "string", "string" }
+ -- }
+
+ implement {
+ name = "btxcollectlistentries",
+ actions = lists.collectentries,
+ arguments = {
+ {
+ { "names" },
+ { "criterium" },
+ { "reference" },
+ { "method" },
+ { "dataset" },
+ { "keyword" },
+ { "sorttype" },
+ { "repeated" },
+ { "ignored" },
+ { "group" },
+ }
+ }
+ }
--- local f_citereference = formatters["btx:%s:%s"] -- dataset, instance (block), tag, order
--- local f_listreference = formatters["btx:%s:%s:%s:%s"] -- dataset, instance (block), tag, order
---
--- -- local done = { }
--- local last = 0
---
--- function commands.btxcitereference(internal)
--- last = last + 1
--- local ref = f_citereference(internal,last) -- we just need a unique key
--- -- local don = done[ref]
--- -- if don == nil then
--- if trace_references then
--- report_reference("cite: %s",ref)
--- end
--- -- done[ref] = true
--- ctx_btxsetcitereference(ref,internal)
--- -- elseif don then
--- -- report_reference("duplicate cite: %s, skipped",ref)
--- -- done[ref] = false
--- -- -- else
--- -- -- no more messages
--- -- end
--- end
---
--- -- we just need a unique key, so we could also use btx:<number> but this
--- -- way we have a bit of a check for duplicates
---
--- -- local done = { }
--- local last = 0
---
--- function commands.btxlistreference(dataset,block,tag,data)
--- last = last + 1
--- local ref = f_listreference(dataset,block,tag,last)
--- -- local don = done[ref]
--- -- if don == nil then
--- if trace_references then
--- report_reference("list: %s",ref)
--- end
--- -- done[ref] = true
--- ctx_btxsetlistreference(dataset,tag,ref,data)
--- -- elseif don then
--- -- report_reference("duplicate link: %s, skipped",ref)
--- -- done[ref] = false
--- -- -- else
--- -- -- no more messages
--- -- end
--- end
+ implement {
+ name = "btxpreparelistentries",
+ actions = lists.prepareentries,
+ arguments = { "string" },
+ }
+ implement {
+ name = "btxfetchlistentries",
+ actions = lists.fetchentries,
+ arguments = { "string" },
+ }
-local f_citereference = formatters["btx:cite:%s"]
-local f_listreference = formatters["btx:list:%s"]
+ implement {
+ name = "btxflushlistentry",
+ actions = lists.flushentry,
+ arguments = { "string", "integer" }
+ }
-local nofcite = 0
-local noflist = 0
+ implement {
+ name = "btxdoifelsesameasprevious",
+ actions = { lists.sameasprevious, ctx_doifelse },
+ arguments = { "string", "integer", "string", "integer", "string" }
+ }
-function commands.btxcitereference(internal)
- nofcite = nofcite + 1
- local ref = f_citereference(nofcite)
- if trace_references then
- report_reference("cite: %s",ref)
- end
- ctx_btxsetcitereference(ref,internal)
end
-function commands.btxlistreference(dataset,block,tag,data)
- noflist = noflist + 1
- local ref = f_listreference(noflist)
- if trace_references then
- report_reference("list: %s",ref)
- end
- ctx_btxsetlistreference(dataset,tag,ref,data)
-end
+do
+ local citevariants = { }
+ publications.citevariants = citevariants
-commands.btxsetlistmethod = lists.setmethod
-commands.btxresolvelistreference = lists.resolve
-commands.btxregisterlistentry = lists.registerplaced
-commands.btxaddtolist = lists.addentry
-commands.btxcollectlistentries = lists.collectentries
-commands.btxfetchlistentries = lists.fetchentries
-commands.btxflushlistentries = lists.flushentries
-commands.btxdoifelselistentryplaced = lists.doifalreadyplaced
-
-local citevariants = { }
-publications.citevariants = citevariants
-
--- helper
-
-local function sortedtags(dataset,list,sorttype)
- local luadata = datasets[dataset].luadata
- local valid = { }
- for i=1,#list do
- local tag = list[i]
- local entry = luadata[tag]
- if entry then
- local key = entry[sorttype]
- if key then
- valid[#valid+1] = {
- tag = tag,
- split = sortsplitter(sortstripper(key))
- }
- else
- end
+ local function btxhandlecite(specification)
+ local dataset = specification.dataset or v_default
+ local reference = specification.reference
+ local variant = specification.variant
+ if not variant or variant == "" then
+ variant = "default"
end
- end
- if #valid == 0 or #valid ~= #list then
- return list
- else
- sorters.sort(valid,basicsorter)
- for i=1,#valid do
- valid[i] = valid[i].tag
+ if not reference or reference == "" then
+ return
end
- return valid
- end
-end
-
--- if sorttype and sorttype ~= "" then
--- tags = sortedtags(dataset,tags,sorttype)
--- end
-
-local optionalspace = lpeg.patterns.whitespace^0
-local prefixsplitter = optionalspace * lpeg.splitat(optionalspace * P("::") * optionalspace)
-
-function commands.btxhandlecite(specification)
- local tag = specification.reference
- if not tag or tag == "" then
- return
- end
- --
- local dataset = specification.dataset or ""
- local mark = specification.markentry ~= false
- local variant = specification.variant or "num"
- local sorttype = specification.sorttype
- local compress = specification.compress == v_yes
- --
- local prefix, rest = lpegmatch(prefixsplitter,tag)
- if rest then
- dataset = prefix
- else
- rest = tag
- end
- local action = citevariants[variant] -- there is always fallback on default
- if trace_cite then
- report_cite("inject, dataset: %s, tag: %s, variant: %s, compressed",dataset or "-",rest,variant)
+ --
+ specification.variant = variant
+ specification.compress = specification.compress == v_yes
+ specification.markentry = specification.markentry ~= false
+ --
+ local prefix, rest = lpegmatch(prefixsplitter,reference)
+ if prefix and rest then
+ dataset = prefix
+ specification.dataset = prefix
+ specification.reference = rest
+ end
+ --
+ if trace_cite then
+ report_cite("inject, dataset: %s, tag: %s, variant: %s, compressed",
+ specification.dataset or "-",
+ specification.reference,
+ specification.variant
+ )
+ end
+ --
+ ctx_btxsetdataset(dataset)
+ --
+ citevariants[variant](specification) -- we always fall back on default
end
- ctx_setvalue("currentbtxdataset",dataset)
- action(dataset,rest,mark,compress,variant)
-end
-function commands.btxhandlenocite(specification)
- local mark = specification.markentry ~= false
- if not mark then
- return
- end
- local tag = specification.reference
- if not tag or tag == "" then
- return
- end
- local dataset = specification.dataset or ""
- local prefix, rest = lpegmatch(prefixsplitter,tag)
- if rest then
- dataset = prefix
- else
- rest = tag
- end
- ctx_setvalue("currentbtxdataset",dataset)
- local tags = settings_to_array(rest)
- if trace_cite then
- report_cite("mark, dataset: %s, tags: % | t",dataset or "-",tags)
- end
- for i=1,#tags do
- markcite(dataset,tags[i])
+ local function btxhandlenocite(specification)
+ local dataset = specification.dataset or v_default
+ local reference = specification.reference
+ if not reference or reference == "" then
+ return
+ end
+ --
+ local markentry = specification.markentry ~= false
+ local internal = specification.internal or ""
+ --
+ local prefix, rest = lpegmatch(prefixsplitter,reference)
+ if rest then
+ dataset = prefix
+ reference = rest
+ end
+ --
+ if trace_cite then
+ report_cite("mark, dataset: %s, tags: %s",dataset or "-",reference)
+ end
+ --
+ local reference = publications.parenttag(dataset,reference)
+ --
+ local found, todo, list = findallused(dataset,reference,internal)
+ --
+ tobemarked = markentry and todo
+ if found and tobemarked then
+ flushmarked(dataset,list)
+ btxflushmarked() -- here (could also be done in caller)
+ end
end
-end
--- function commands.btxcitevariant(dataset,block,tags,variant) -- uses? specification ?
--- local action = citevariants[variant]
--- if action then
--- action(dataset,tags,variant)
--- end
--- end
+ implement {
+ name = "btxhandlecite",
+ actions = btxhandlecite,
+ arguments = {
+ {
+ { "dataset" },
+ { "reference" },
+ { "markentry", "boolean" },
+ { "variant" },
+ { "sorttype" },
+ { "compress" },
+ { "author" },
+ { "lefttext" },
+ { "righttext" },
+ { "before" },
+ { "after" },
+ }
+ }
+ }
--- sorter
+ implement {
+ name = "btxhandlenocite",
+ actions = btxhandlenocite,
+ arguments = {
+ {
+ { "dataset" },
+ { "reference" },
+ { "markentry", "boolean" },
+ }
+ }
+ }
-local keysorter = function(a,b) return a.sortkey < b.sortkey end
+ -- sorter
-local function compresslist(source)
- for i=1,#source do
- if type(source[i].sortkey) ~= "number" then
- return source
+ local keysorter = function(a,b)
+ local ak = a.sortkey
+ local bk = b.sortkey
+ if ak == bk then
+ local as = a.suffix -- alphabetic
+ local bs = b.suffix -- alphabetic
+ if as and bs then
+ return (as or "") < (bs or "")
+ else
+ return false
+ end
+ else
+ return ak < bk
end
end
- local first, last, firstr, lastr
- local target, noftarget, tags = { }, 0, { }
- sort(source,keysorter)
- -- suffixes
- local oldvalue = nil
- local suffix = 0
- local function setsuffix(entry,suffix,sortfld)
- entry.suffix = suffix
- local dataset = datasets[entry.dataset]
- if dataset then
- local suffixes = dataset.suffixes[entry.tag]
- if suffixes then
- suffixes[sortfld] = suffix
+
+ local function compresslist(source)
+ for i=1,#source do
+ local t = type(source[i].sortkey)
+ if t == "number" then
+ -- okay
+ -- elseif t == "string" then
+ -- -- okay
else
- dataset.suffixes[entry.tag] = { [sortfld] = suffix }
+ return source
end
end
- end
- for i=1,#source do
- local entry = source[i]
- local sortfld = entry.sortfld
- if sortfld then
- local value = entry.sortkey
- if value == oldvalue then
- if suffix == 0 then
- suffix = 1
- local entry = source[i-1]
- setsuffix(entry,suffix,sortfld)
- end
- suffix = suffix + 1
- setsuffix(entry,suffix,sortfld)
+ local first, last, firstr, lastr
+ local target, noftarget, tags = { }, 0, { }
+ sort(source,keysorter)
+ local oldvalue = nil
+ local function flushrange()
+ noftarget = noftarget + 1
+ if last > first + 1 then
+ target[noftarget] = {
+ first = firstr,
+ last = lastr,
+ tags = tags,
+ }
else
- oldvalue = value
- suffix = 0
+ target[noftarget] = firstr
+ if last > first then
+ noftarget = noftarget + 1
+ target[noftarget] = lastr
+ end
end
- else
- break
+ tags = { }
end
- end
- --
- local function flushrange()
- noftarget = noftarget + 1
- if last > first + 1 then
- target[noftarget] = {
- first = firstr,
- last = lastr,
- tags = tags,
- }
- else
- target[noftarget] = firstr
- if last > first then
- noftarget = noftarget + 1
- target[noftarget] = lastr
+ for i=1,#source do
+ local entry = source[i]
+ local current = entry.sortkey
+ local suffix = entry.suffix -- todo but what
+ if not first then
+ first, last, firstr, lastr = current, current, entry, entry
+ elseif current == last + 1 then
+ last, lastr = current, entry
+ else
+ flushrange()
+ first, last, firstr, lastr = current, current, entry, entry
end
+ tags[#tags+1] = entry.tag
end
- tags = { }
- end
- for i=1,#source do
- local entry = source[i]
- local current = entry.sortkey
- if not first then
- first, last, firstr, lastr = current, current, entry, entry
- elseif current == last + 1 then
- last, lastr = current, entry
- else
+ if first and last then
flushrange()
- first, last, firstr, lastr = current, current, entry, entry
end
- tags[#tags+1] = entry.tag
- end
- if first and last then
- flushrange()
+ return target
end
- return target
-end
--- local source = {
--- { tag = "one", internal = 1, value = "foo", page = 1 },
--- { tag = "two", internal = 2, value = "bar", page = 2 },
--- { tag = "three", internal = 3, value = "gnu", page = 3 },
--- }
---
--- local target = compresslist(source)
-
-local numberonly = R("09")^1 / tonumber + P(1)^0
-local f_missing = formatters["<%s>"]
-
--- maybe also sparse (e.g. pages)
-
-local function processcite(dataset,reference,mark,compress,setup,getter,setter,compressor)
- reference = publications.parenttag(dataset,reference)
- local found, todo, list = findallused(dataset,reference)
- if found and setup then
- local source = { }
- local badkey = false
- for i=1,#found do
- local entry = found[i]
- local tag = entry.userdata.btxref
- local internal = entry.references.internal
- local data = getter(dataset,tag,entry,internal)
- if compress and not compressor then
- local sortkey = data.sortkey
- if sortkey then
- local key = lpegmatch(numberonly,sortkey)
- if key then
- data.sortkey = key
+ -- local source = {
+ -- { tag = "one", internal = 1, value = "foo", page = 1 },
+ -- { tag = "two", internal = 2, value = "bar", page = 2 },
+ -- { tag = "three", internal = 3, value = "gnu", page = 3 },
+ -- }
+ --
+ -- local target = compresslist(source)
+
+ local numberonly = R("09")^1 / tonumber + P(1)^0
+ local f_missing = formatters["<%s>"]
+
+ -- maybe also sparse (e.g. pages)
+
+ -- a bit redundant access to datasets
+
+ local function processcite(presets,specification)
+ --
+ if specification then
+ setmetatableindex(specification,presets)
+ else
+ specification = presets
+ end
+ --
+ local dataset = specification.dataset
+ local reference = specification.reference
+ local internal = specification.internal
+ local setup = specification.variant
+ local compress = specification.compress
+ local getter = specification.getter
+ local setter = specification.setter
+ local compressor = specification.compressor
+ --
+ local reference = publications.parenttag(dataset,reference)
+ --
+ local found, todo, list = findallused(dataset,reference,internal)
+ tobemarked = specification.markentry and todo
+ --
+ if not found or #found == 0 then
+ report("nothing found for %a",reference)
+ elseif not setup then
+ report("invalid reference for %a",reference)
+ else
+ if trace_cite then
+ report("processing reference %a",reference)
+ end
+ local source = { }
+ local badkey = false
+ local luadata = datasets[dataset].luadata
+ for i=1,#found do
+ local entry = found[i]
+ local tag = entry.userdata.btxref
+ local ldata = luadata[tag]
+ local data = {
+ internal = entry.references.internal,
+ language = ldata.language,
+ dataset = dataset,
+ tag = tag,
+ -- luadata = ldata,
+ }
+ setter(data,dataset,tag,entry)
+ if compress and not compressor then
+ local sortkey = data.sortkey
+ if sortkey then
+ local key = lpegmatch(numberonly,sortkey)
+ if key then
+ data.sortkey = key
+ else
+ badkey = true
+ end
else
badkey = true
end
+ end
+ if type(data) == "table" then
+ source[#source+1] = data
else
- badkey = true
+ report("error in cite rendering %a",setup or "?")
end
end
- source[i] = data
- end
- if compress and not badkey then
- local target = (compressor or compresslist)(source)
- local function flush(i,state)
- local entry = target[i]
- local first = entry.first
- if first then
- local tags = entry.tags
- if mark then
- for i=1,#tags do
- local tag = tags[i]
- markcite(dataset,tag)
- todo[tag] = false
- end
- end
- ctx_btxsettag(tags[1])
- local internal = first.internal
- if internal then
- ctx_btxsetinternal(internal)
- end
- if not setter(first,entry.last) then
- ctx_btxsetfirst(f_missing(first.tag))
- end
+
+ local lefttext = specification.lefttext
+ local righttext = specification.righttext
+ local before = specification.before
+ local after = specification.after
+
+ if lefttext and lefttext ~= "" then lefttext = settings_to_array(lefttext) end
+ if righttext and righttext ~= "" then righttext = settings_to_array(righttext) end
+ if before and before ~= "" then before = settings_to_array(before) end
+ if after and after ~= "" then after = settings_to_array(after) end
+
+ -- local oneleft = lefttext and #lefttext == 1 and lefttext [1]
+ -- local oneright = righttext and #righttext == 1 and righttext[1]
+ --
+ -- if not oneleft or not oneright then
+ -- compress = false -- very hard coded, or should we have compreess == auto?
+ -- end
+
+ local function flush(i,n,entry,last)
+ local tag = entry.tag
+ local currentcitation = markcite(dataset,tag)
+ --
+ ctx_btxstartcite()
+ ctx_btxsettag(tag)
+ ctx_btxsetcategory(entry.category or "unknown")
+ --
+ -- if oneleft then
+ -- if i == 1 then
+ -- ctx_btxsetlefttext(oneleft)
+ -- end
+ -- elseif lefttext then
+ -- ctx_btxsetlefttext(lefttext[i] or "")
+ -- end
+ -- if oneright then
+ -- if i == n then
+ -- ctx_btxsetrighttext(oneright)
+ -- end
+ -- elseif righttext then
+ -- ctx_btxsetrighttext(righttext[i] or "")
+ -- end
+ -- if before then
+ -- ctx_btxsetbefore(before[i] or (#before == 1 and before[1]) or "")
+ -- end
+ -- if after then
+ -- ctx_btxsetafter(after[i] or (#after == 1 and after[1]) or "")
+ -- end
+ --
+ if lefttext then local text = lefttext [i] ; if text and text ~= "" then ctx_btxsetlefttext (text) end end
+ if righttext then local text = righttext[i] ; if text and text ~= "" then ctx_btxsetrighttext(text) end end
+ if before then local text = before [i] ; if text and text ~= "" then ctx_btxsetbefore (text) end end
+ if after then local text = after [i] ; if text and text ~= "" then ctx_btxsetafter (text) end end
+ --
+ ctx_btxsetbacklink(currentcitation)
+ local bl = listtocite[currentcitation]
+ if bl then
+ -- we refer to a coming list entry
+ ctx_btxsetinternal(bl.references.internal or "")
else
- local tag = entry.tag
- if mark then
- markcite(dataset,tag)
- todo[tag] = false
- end
- ctx_btxsettag(tag)
- local internal = entry.internal
- if internal then
- ctx_btxsetinternal(internal)
- end
- if not setter(entry) then
- ctx_btxsetfirst(f_missing(tag))
- end
+ -- we refer to a previous list entry
+ ctx_btxsetinternal(entry.internal or "")
end
- ctx_btxsetconcat(state)
- ctx_btxcitesetup(setup)
- end
- flushcollected(flush,#target)
- else
- local function flush(i,state)
- local entry = source[i]
- local tag = entry.tag
- if mark then
- markcite(dataset,tag)
- todo[tag] = false
+ local language = entry.language
+ if language then
+ ctx_btxsetlanguage(language)
end
- ctx_btxsettag(tag)
- local internal = entry.internal
- if internal then
- ctx_btxsetinternal(internal)
+ if not getter(entry,last) then
+ ctx_btxsetfirst("") -- (f_missing(tag))
end
- ctx_btxsetconcat(state)
- if not setter(entry) then
- ctx_btxsetfirst(f_missing(entry.tag))
+ ctx_btxsetconcat(concatstate(i,n))
+ if trace_detail then
+ report("expanding cite setup %a",setup)
end
ctx_btxcitesetup(setup)
+ ctx_btxstopcite()
+ end
+
+ if compress and not badkey then
+ local target = (compressor or compresslist)(source)
+ local nofcollected = #target
+ if nofcollected == 0 then
+ report("nothing found for %a",reference)
+ unknowncite(reference)
+ else
+ for i=1,nofcollected do
+ local entry = target[i]
+ local first = entry.first
+ if first then
+ flush(i,nofcollected,first,entry.last)
+ else
+ flush(i,nofcollected,entry)
+ end
+ end
+ end
+ else
+ local nofcollected = #source
+ if nofcollected == 0 then
+ unknowncite(reference)
+ else
+ for i=1,nofcollected do
+ flush(i,nofcollected,source[i])
+ end
+ end
end
- flushcollected(flush,#source)
+ end
+ if tobemarked then
+ flushmarked(dataset,list)
+ btxflushmarked() -- here (could also be done in caller)
end
end
- if mark then
- flushmarked(dataset,list,todo)
- end
-end
-local function simplegetter(first,last,field)
- local value = first[field]
- if value then
- ctx_btxsetfirst(value)
- if last then
- ctx_btxsetsecond(last[field])
+ --
+
+ local function simplegetter(first,last,field)
+ local value = first[field]
+ if value then
+ ctx_btxsetfirst(value)
+ if last then
+ ctx_btxsetsecond(last[field])
+ end
+ return true
end
- return true
end
-end
-local setters = setmetatableindex({},function(t,k)
- local v = function(dataset,tag,entry,internal)
- local value = getfield(dataset,tag,k)
- return {
- tag = tag,
- internal = internal,
- [k] = value,
- sortkey = value,
- sortfld = k,
- }
+ local setters = setmetatableindex({},function(t,k)
+ local v = function(data,dataset,tag,entry)
+ local value = getcasted(dataset,tag,k)
+ data.value = value -- not really needed
+ data[k] = value
+ data.sortkey = value
+ data.sortfld = k
+ end
+ t[k] = v
+ return v
+ end)
+
+ local getters = setmetatableindex({},function(t,k)
+ local v = function(first,last)
+ return simplegetter(first,last,k)
+ end
+ t[k] = v
+ return v
+ end)
+
+ setmetatableindex(citevariants,function(t,k)
+ local p = defaultvariant or "default"
+ local v = rawget(t,p)
+ report_cite("variant %a falls back on %a setter and getter with setup %a",k,p,k)
+ t[k] = v
+ return v
+ end)
+
+ function citevariants.default(presets)
+ local variant = presets.variant
+ processcite(presets,{
+ setup = variant,
+ setter = setters[variant],
+ getter = getters[variant],
+ })
end
- t[k] = v
- return v
-end)
-local getters = setmetatableindex({},function(t,k)
- local v = function(first,last)
- return simplegetter(first,last,k)
+ -- category | type
+
+ do
+
+ local function setter(data,dataset,tag,entry)
+ data.category = getfield(dataset,tag,"category")
+ end
+
+ local function getter(first,last)
+ return simplegetter(first,last,"category")
+ end
+
+ function citevariants.category(presets)
+ processcite(presets,{
+ -- variant = presets.variant or "serial",
+ setter = setter,
+ getter = getter,
+ })
+ end
+
+ function citevariants.type(presets)
+ processcite(presets,{
+ -- variant = presets.variant or "type",
+ setter = setter,
+ getter = getter,
+ })
+ end
+
end
- t[k] = v
- return v
-end)
--- default
-setmetatableindex(citevariants,function(t,k)
- local v = t.default
- t[k] = v
- return v
-end)
+ -- entry (we could provide a generic one)
-function citevariants.default(dataset,reference,mark,compress,variant,setup)
- processcite(dataset,reference,mark,compress,setup or variant,setters[variant],getters[variant])
-end
+ do
--- short
+ local function setter(data,dataset,tag,entry)
+ -- nothing
+ end
-local function setter(dataset,tag,entry,internal)
- return {
- tag = tag,
- internal = internal,
- short = getfield(dataset,tag,"short"),
- suffix = getfield(dataset,tag,"suffix"),
- }
-end
+ local function getter(first,last) -- last not used
+ ctx_btxsetfirst(first.tag)
+ end
-local function getter(first,last) -- last not used
- local short = first.short
- if short then
- local suffix = first.suffix
- if suffix then
- ctx_btxsetfirst(short .. suffix)
- else
- ctx_btxsetfirst(short)
+ function citevariants.entry(presets)
+ processcite(presets,{
+ compress = false,
+ -- variant = presets.variant or "entry",
+ setter = setter,
+ getter = getter,
+ })
end
- return true
+
end
-end
-function citevariants.short(dataset,reference,mark,compress)
- processcite(dataset,reference,mark,false,"short",setter,getter)
-end
+ -- short
--- pages (no compress)
+ do
-local function setter(dataset,tag,entry,internal)
- return {
- dataset = dataset,
- tag = tag,
- internal = internal,
- pages = getdetail(dataset,tag,"pages"),
- }
-end
+ local function setter(data,dataset,tag,entry)
+ data.short = getdetail(dataset,tag,"short")
+ data.suffix = getdetail(dataset,tag,"suffix")
+ end
-local function getter(first,last)
- local pages = first.pages
- if pages then
- if type(pages) == "table" then
- ctx_btxsetfirst(pages[1])
- ctx_btxsetsecond(pages[2])
- else
- ctx_btxsetfirst(pages)
+ local function getter(first,last) -- last not used
+ local short = first.short
+ if short then
+ local suffix = first.suffix
+ if suffix then
+ ctx_btxsetfirst(short .. suffix)
+ else
+ ctx_btxsetfirst(short)
+ end
+ return true
+ end
end
- return true
+
+ function citevariants.short(presets)
+ processcite(presets,{
+ compress = false,
+ -- variant = presets.variant or "short",
+ setter = setter,
+ getter = getter,
+ })
+ end
+
end
-end
-function citevariants.page(dataset,reference,mark,compress)
- processcite(dataset,reference,mark,compress,"page",setter,getter)
-end
+ -- pages (no compress)
--- num
+ do
-local function setter(dataset,tag,entry,internal)
- local text = entry.entries.text
- return {
- dataset = dataset,
- tag = tag,
- internal = internal,
- num = text,
- sortkey = text,
- }
-end
+ local function setter(data,dataset,tag,entry)
+ data.pages = getcasted(dataset,tag,"pages")
+ end
-local function getter(first,last)
- return simplegetter(first,last,"num")
-end
+ local function getter(first,last)
+ local pages = first.pages
+ if pages then
+ if type(pages) == "table" then
+ ctx_btxsetfirst(pages[1])
+ ctx_btxsetsecond(pages[2])
+ else
+ ctx_btxsetfirst(pages)
+ end
+ return true
+ end
+ end
-function citevariants.num(dataset,reference,mark,compress)
- processcite(dataset,reference,mark,compress,"num",setter,getter)
-end
+ function citevariants.page(presets)
+ processcite(presets,{
+ -- variant = presets.variant or "page",
+ setter = setter,
+ getter = getter,
+ })
+ end
--- year
-
-local function setter(dataset,tag,entry,internal)
- local year = getfield(dataset,tag,"year")
- return {
- dataset = dataset,
- tag = tag,
- internal = internal,
- year = year,
- sortkey = year,
- sortfld = "year",
- }
-end
+ end
-local function getter(first,last)
- return simplegetter(first,last,"year")
-end
+ -- num
-function citevariants.year(dataset,reference,mark,compress)
- processcite(dataset,reference,mark,compress,"year",setter,getter)
-end
+ do
--- index | serial
+ local function setter(data,dataset,tag,entry)
+ local entries = entry.entries
+ local text = entries and entries.text or "?"
+ data.num = text
+ data.sortkey = text
+ end
-local function setter(dataset,tag,entry,internal)
- local index = getfield(dataset,tag,"index")
- return {
- dataset = dataset,
- tag = tag,
- internal = internal,
- index = index,
- sortkey = index,
- }
-end
+ local function getter(first,last)
+ return simplegetter(first,last,"num")
+ end
-local function getter(first,last)
- return simplegetter(first,last,"index")
-end
+ function citevariants.num(presets)
+ processcite(presets,{
+ -- variant = presets.variant or "num",
+ setter = setter,
+ getter = getter,
+ })
+ end
-function citevariants.index(dataset,reference,mark,compress)
- processcite(dataset,reference,mark,compress,"index",setter,getter)
-end
+ end
-function citevariants.serial(dataset,reference,mark,compress)
- processcite(dataset,reference,mark,compress,"serial",setter,getter)
-end
+ -- year
--- category | type
+ do
-local function setter(dataset,tag,entry,internal)
- return {
- dataset = dataset,
- tag = tag,
- internal = internal,
- category = getfield(dataset,tag,"category"),
- }
-end
+ local function setter(data,dataset,tag,entry)
+ local year = getfield (dataset,tag,"year")
+ local suffix = getdetail(dataset,tag,"suffix")
+ data.year = year
+ data.suffix = suffix
+ data.sortkey = tonumber(year) or 9999
+ end
-local function getter(first,last)
- return simplegetter(first,last,"category")
-end
+ local function getter(first,last)
+ return simplegetter(first,last,"year")
+ end
-function citevariants.category(dataset,reference,mark,compress)
- processcite(dataset,reference,mark,compress,"category",setter,getter)
-end
+ function citevariants.year(presets)
+ processcite(presets,{
+ -- variant = presets.variant or "year",
+ setter = setter,
+ getter = getter,
+ })
+ end
-function citevariants.type(dataset,reference,mark,compress)
- processcite(dataset,reference,mark,compress,"type",setter,getter)
-end
+ end
--- key | tag
+ -- index | serial
-local function setter(dataset,tag,entry,internal)
- return {
- dataset = dataset,
- tag = tag,
- internal = internal,
- }
-end
+ do
-local function getter(first,last)
- ctx_btxsetfirst(first.tag)
- return true
-end
+ local function setter(data,dataset,tag,entry)
+ local index = getfield(dataset,tag,"index")
+ data.index = index
+ data.sortkey = index
+ end
-function citevariants.key(dataset,reference,mark,compress) return
- processcite(dataset,reference,mark,compress,"key",setter,getter)
-end
+ local function getter(first,last)
+ return simplegetter(first,last,"index")
+ end
-function citevariants.tag(dataset,reference,mark,compress) return
- processcite(dataset,reference,mark,compress,"tag",setter,getter)
-end
+ function citevariants.index(presets)
+ processcite(presets,{
+ -- variant = presets.variant or "index",
+ setter = setter,
+ getter = getter,
+ })
+ end
--- author
+ function citevariants.serial(presets)
+ processcite(presets,{
+ -- variant = presets.variant or "serial",
+ setter = setter,
+ getter = getter,
+ })
+ end
-local function setter(dataset,tag,entry,internal)
- return {
- dataset = dataset,
- tag = tag,
- internal = internal,
- author = getfield(dataset,tag,"author"),
- }
-end
+ end
-local function getter(first,last)
- ctx_btxsetfirst(first.author) -- todo: formatted
- return true
-end
+ -- key | tag
-function citevariants.author(dataset,reference,mark,compress)
- processcite(dataset,reference,mark,false,"author",setter,getter)
-end
+ do
--- todo : sort
--- todo : choose between publications or commands namespace
--- todo : use details.author
--- todo : sort details.author
--- (name, name and name) .. how names? how sorted?
--- todo: we loop at the tex end .. why not here
--- \cite[{hh,afo},kvm]
-
--- common
-
-local function authorcompressor(found,key)
- local result = { }
- local entries = { }
- for i=1,#found do
- local entry = found[i]
- local author = entry.author
- local aentries = entries[author]
- if aentries then
- aentries[#aentries+1] = entry
- else
- entries[author] = { entry }
+ local function setter(data,dataset,tag,entry)
+ -- nothing
end
+
+ local function getter(first,last)
+ ctx_btxsetfirst(first.tag)
+ return true
+ end
+
+ function citevariants.key(presets)
+ return processcite(presets,{
+ variant = "key",
+ setter = setter,
+ getter = getter,
+ })
+ end
+
+ function citevariants.tag(presets)
+ return processcite(presets,{
+ variant = "tag",
+ setter = setter,
+ getter = getter,
+ })
+ end
+
end
- for i=1,#found do
- local entry = found[i]
- local author = entry.author
- local aentries = entries[author]
- if not aentries then
- result[#result+1] = entry
- elseif aentries == true then
- -- already done
- else
- result[#result+1] = entry
- entry.entries = aentries
- entries[author] = true
+
+ -- keyword
+
+ do
+
+ local function listof(list)
+ local size = type(list) == "table" and #list or 0
+ if size > 0 then
+ return function()
+ for i=1,size do
+ ctx_btxsetfirst(list[i])
+ ctx_btxsetconcat(concatstate(i,size))
+ ctx_btxcitesetup("listelement")
+ end
+ return true
+ end
+ else
+ return "?" -- unknown
+ end
+ end
+
+ local function setter(data,dataset,tag,entry)
+ data.keywords = getcasted(dataset,tag,"keywords")
+ end
+
+ local function getter(first,last)
+ context(listof(first.keywords))
+ end
+
+ function citevariants.keywords(presets)
+ return processcite(presets,{
+ variant = "keywords",
+ setter = setter,
+ getter = getter,
+ })
end
+
end
- -- todo: add letters (should we then tag all?)
- return result
-end
-local function authorconcat(target,key,setup)
- local function flush(i,state)
- local entry = target[i]
- local first = entry.first
- if first then
- local internal = first.internal
- if internal then
- ctx_btxsetinternal(internal)
- end
- ctx_btxsetfirst(first[key] or f_missing(first.tag))
- local suffix = entry.suffix
- local value = entry.last[key]
+ -- authors
+
+ do
+
+ local currentbtxciteauthor = function()
+ context.currentbtxciteauthor()
+ return true -- needed?
+ end
+
+ local function authorcompressor(found)
+ local result = { }
+ local entries = { }
+ for i=1,#found do
+ local entry = found[i]
+ local author = entry.author
+ if author then
+ local aentries = entries[author]
+ if aentries then
+ aentries[#aentries+1] = entry
+ else
+ entries[author] = { entry }
+ end
+ end
+ end
+ -- beware: we usetables as hash so we get a cycle when inspecting (unless we start
+ -- hashing with strings)
+ for i=1,#found do
+ local entry = found[i]
+ local author = entry.author
+ if author then
+ local aentries = entries[author]
+ if not aentries then
+ result[#result+1] = entry
+ elseif aentries == true then
+ -- already done
+ else
+ result[#result+1] = entry
+ entry.entries = aentries
+ entries[author] = true
+ end
+ end
+ end
+ -- todo: add letters (should we then tag all?)
+ return result
+ end
+
+ local function authorconcat(target,key,setup)
+ ctx_btxstartsubcite(setup)
+ local nofcollected = #target
+ if nofcollected == 0 then
+ unknowncite(tag)
+ else
+ for i=1,nofcollected do
+ local entry = target[i]
+ local first = entry.first
+ local tag = entry.tag
+ local currentcitation = markcite(entry.dataset,tag)
+ ctx_btxstartciteauthor()
+ ctx_btxsettag(tag)
+ ctx_btxsetbacklink(currentcitation)
+ local bl = listtocite[currentcitation]
+ ctx_btxsetinternal(bl and bl.references.internal or "")
+ if first then
+ ctx_btxsetfirst(first[key] or "") -- f_missing(first.tag))
+ local suffix = entry.suffix
+ local value = entry.last[key]
+ if value then
+ ctx_btxsetsecond(value)
+ end
+ if suffix then
+ ctx_btxsetthird(suffix)
+ end
+ else
+ local suffix = entry.suffix
+ local value = entry[key] or "" -- f_missing(tag)
+ ctx_btxsetfirst(value)
+ if suffix then
+ ctx_btxsetthird(suffix)
+ end
+ end
+ ctx_btxsetconcat(concatstate(i,nofcollected))
+ if trace_detail then
+ report("expanding %a cite setup %a","multiple author",setup)
+ end
+ ctx_btxsubcitesetup(setup)
+ ctx_btxstopciteauthor()
+ end
+ end
+ ctx_btxstopsubcite()
+ end
+
+ local function authorsingle(entry,key,setup)
+ ctx_btxstartsubcite(setup)
+ ctx_btxstartciteauthor()
+ local tag = entry.tag
+ ctx_btxsettag(tag)
+ -- local currentcitation = markcite(entry.dataset,tag)
+ -- ctx_btxsetbacklink(currentcitation)
+ -- local bl = listtocite[currentcitation]
+ -- ctx_btxsetinternal(bl and bl.references.internal or "")
+ ctx_btxsetfirst(entry[key] or "") -- f_missing(tag)
if suffix then
- ctx_btxsetsecond(value .. converters.characters(suffix))
+ ctx_btxsetthird(entry.suffix)
+ end
+ if trace_detail then
+ report("expanding %a cite setup %a","single author",setup)
+ end
+ ctx_btxcitesetup(setup)
+ ctx_btxstopciteauthor()
+ ctx_btxstopsubcite()
+ end
+
+ local partialinteractive = false
+
+ local function authorgetter(first,last,key,setup) -- only first
+ -- ctx_btxsetfirst(first.author) -- unformatted
+ -- ctx_btxsetfirst(currentbtxciteauthor) -- formatter (much slower)
+ if first.type == "author" then
+ ctx_btxsetfirst(currentbtxciteauthor) -- formatter (much slower)
else
- ctx_btxsetsecond(value)
+ ctx_btxsetfirst(first.author) -- unformatted
end
- else
- local internal = entry.internal
- if internal then
- ctx_btxsetinternal(internal)
+ local entries = first.entries
+ -- alternatively we can use a concat with one ... so that we can only make the
+ -- year interactive, as with the concat
+ if partialinteractive and not entries then
+ entries = { first }
end
- local suffix = entry.suffix
- local value = entry[key] or f_missing(entry.tag)
- if suffix then
- ctx_btxsetfirst(value .. converters.characters(suffix))
+ if entries then
+ -- happens with year
+ local c = compresslist(entries)
+ local f = function() authorconcat(c,key,setup) return true end -- indeed return true?
+ ctx_btxsetcount(#c)
+ ctx_btxsetsecond(f)
+ elseif first then
+ -- happens with num
+ local f = function() authorsingle(first,key,setup) return true end -- indeed return true?
+ ctx_btxsetcount(0)
+ ctx_btxsetsecond(f)
+ end
+ return true
+ end
+
+ -- author
+
+ local function setter(data,dataset,tag,entry)
+ data.author, data.field, data.type = getcasted(dataset,tag,"author")
+ end
+
+ local function getter(first,last,_,setup)
+ if first.type == "author" then
+ ctx_btxsetfirst(currentbtxciteauthor) -- formatter (much slower)
else
- ctx_btxsetfirst(value)
+ ctx_btxsetfirst(first.author) -- unformatted
end
+ return true
end
- ctx_btxsetconcat(state)
- ctx_btxcitesetup(setup)
- end
- ctx_btxstartsubcite(setup)
- flushcollected(flush,#target)
- ctx_btxstopsubcite()
-end
-local function authorsingle(entry,key,setup)
- ctx_btxstartsubcite(setup)
- local internal = entry.internal
- if internal then
- ctx_btxsetinternal(internal)
- end
- ctx_btxsetfirst(entry[key] or f_missing(entry.tag))
- ctx_btxcitesetup(setup) -- ??
- ctx_btxstopsubcite()
-end
+ function citevariants.author(presets)
+ processcite(presets,{
+ compress = false,
+ variant = "author",
+ setter = setter,
+ getter = getter,
+ })
+ end
-local function authorgetter(first,last,key,setup) -- only first
- ctx_btxsetfirst(first.author) -- todo: reformat
- local entries = first.entries
- if entries then
- local c = compresslist(entries)
- ctx_btxsetsecond(function() authorconcat(c,key,setup) end)
- else
- ctx_btxsetsecond(function() authorsingle(first,key,setup) end)
- end
- return true
-end
+ -- authornum
--- authornum
-
-local function setter(dataset,tag,entry,internal)
- local text = entry.entries.text
- return {
- dataset = dataset,
- tag = tag,
- internal = internal,
- author = getfield(dataset,tag,"author"),
- num = text,
- sortkey = text and lpegmatch(numberonly,text)
- }
-end
+ local function setter(data,dataset,tag,entry)
+ local entries = entry.entries
+ local text = entries and entries.text or "?"
+ data.author, data.field, data.type = getcasted(dataset,tag,"author")
+ data.num = text
+ data.sortkey = text and lpegmatch(numberonly,text)
+ end
-local function getter(first,last)
- authorgetter(first,last,"num","author:num")
- return true
-end
+ local function getter(first,last)
+ authorgetter(first,last,"num","author:num")
+ return true
+ end
-local function compressor(found)
- return authorcompressor(found,"num")
-end
+ function citevariants.authornum(presets)
+ processcite(presets,{
+ variant = "authornum",
+ setter = setter,
+ getter = getter,
+ compressor = authorcompressor,
+ })
+ end
-function citevariants.authornum(dataset,reference,mark,compress)
- processcite(dataset,reference,mark,compress,"authornum",setter,getter,compressor)
-end
+ -- authoryear | authoryears
--- authoryear | authoryears
-
-local function setter(dataset,tag,entry,internal)
- local year = getfield(dataset,tag,"year")
- return {
- dataset = dataset,
- tag = tag,
- internal = internal,
- author = getfield(dataset,tag,"author"),
- year = year,
- sortkey = year and lpegmatch(numberonly,year),
- sortfld = "year",
- }
-end
+ local function setter(data,dataset,tag,entry)
+ data.author, data.field, data.type = getcasted(dataset,tag,"author")
+ local year = getfield (dataset,tag,"year")
+ local suffix = getdetail(dataset,tag,"suffix")
+ data.year = year
+ data.suffix = suffix
+ data.sortkey = tonumber(year) or 9999
+ end
-local function getter(first,last)
- authorgetter(first,last,"year","author:year")
- return true
-end
+ local function getter(first,last)
+ authorgetter(first,last,"year","author:year")
+ return true
+ end
-local function compressor(found)
- return authorcompressor(found,"year")
-end
+ function citevariants.authoryear(presets)
+ processcite(presets,{
+ variant = "authoryear",
+ setter = setter,
+ getter = getter,
+ compressor = authorcompressor,
+ })
+ end
-function citevariants.authoryear(dataset,reference,mark,compress)
- processcite(dataset,reference,mark,compress,"authoryear",setter,getter,compressor)
-end
+ local function getter(first,last)
+ authorgetter(first,last,"year","author:years")
+ return true
+ end
-local function getter(first,last)
- authorgetter(first,last,"year","author:years")
- return true
-end
+ function citevariants.authoryears(presets)
+ processcite(presets,{
+ variant = "authoryears",
+ setter = setter,
+ getter = getter,
+ compressor = authorcompressor,
+ })
+ end
+
+ end
-function citevariants.authoryears(dataset,reference,mark,compress)
- processcite(dataset,reference,mark,compress,"authoryears",setter,getter,compressor)
end
-- List variants
-local listvariants = { }
-publications.listvariants = listvariants
+do
+
+ local listvariants = { }
+ publications.listvariants = listvariants
-function commands.btxlistvariant(dataset,block,tag,variant,listindex)
- local action = listvariants[variant] or listvariants.default
- if action then
- action(dataset,block,tag,variant,tonumber(listindex) or 0)
+ local function btxlistvariant(dataset,block,tag,variant,listindex)
+ local action = listvariants[variant] or listvariants.default
+ if action then
+ action(dataset,block,tag,variant,tonumber(listindex) or 0)
+ end
end
-end
-function listvariants.default(dataset,block,tag,variant)
- context("?")
-end
+ implement {
+ name = "btxlistvariant",
+ actions = btxlistvariant,
+ arguments = { "string", "string", "string", "string", "string" } -- not integer here
+ }
--- function listvariants.num(dataset,block,tag,variant,listindex)
--- local lst = f_listentry(dataset,block,tag)
--- local ref = f_reference(dataset,block,tag)
--- if trace_references then
--- report_reference("list: %s",lst)
--- end
--- -- todo
--- ctx_btxdirectlink(ref,listindex) -- a goto
--- end
+ function listvariants.default(dataset,block,tag,variant)
+ ctx_btxsetfirst("?")
+ if trace_detail then
+ report("expanding %a list setup %a","default",variant)
+ end
+ ctx_btxlistsetup("default")
+ end
-function listvariants.num(dataset,block,tag,variant,listindex)
- context(listindex) -- a goto
-end
+ function listvariants.num(dataset,block,tag,variant,listindex)
+ ctx_btxsetfirst(listindex)
+ if trace_detail then
+ report("expanding %a list setup %a","num",variant)
+ end
+ ctx_btxlistsetup(variant)
+ end
-function listvariants.short(dataset,block,tag,variant,listindex)
- local short = getdetail(dataset,tag,"short","short")
- local suffix = getdetail(dataset,tag,"suffix","suffix")
- if suffix then
- context(short .. suffix)
- elseif short then
- context(short)
+ listvariants[v_yes] = listvariants.num
+ listvariants.bib = listvariants.num
+
+ function listvariants.short(dataset,block,tag,variant,listindex)
+ local short = getdetail(dataset,tag,"short","short")
+ local suffix = getdetail(dataset,tag,"suffix","suffix")
+ if short then
+ ctx_btxsetfirst(short)
+ end
+ if suffix then
+ ctx_btxsetthird(suffix)
+ end
+ if trace_detail then
+ report("expanding %a list setup %a","short",variant)
+ end
+ ctx_btxlistsetup(variant)
+ end
+
+ function listvariants.page(dataset,block,tag,variant,listindex)
+ local rendering = renderings[dataset]
+ local specification = rendering.list[listindex]
+ for i=3,#specification do
+ local backlink = tonumber(specification[i])
+ if backlink then
+ local citation = citetolist[backlink]
+ if citation then
+ local references = citation.references
+ if references then
+ local internal = references.internal
+ local realpage = references.realpage
+ if internal and realpage then
+ ctx_btxsetconcat(i-2)
+ ctx_btxsetfirst(realpage)
+ ctx_btxsetsecond(backlink)
+ if trace_detail then
+ report("expanding %a list setup %a","page",variant)
+ end
+ ctx_btxlistsetup(variant)
+ end
+ end
+ end
+ end
+ end
end
+
end
diff --git a/Master/texmf-dist/tex/context/base/publ-ini.mkiv b/Master/texmf-dist/tex/context/base/publ-ini.mkiv
index fb0d00d03c0..a4452e45193 100644
--- a/Master/texmf-dist/tex/context/base/publ-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/publ-ini.mkiv
@@ -11,6 +11,11 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+
+% TODO: s! vs v! for default and neutral key/values
+% todo: too many refs in list
+
+% todo: tagging
% todo: we cannot use 'default' as this wipes metadata names (maybe no longer do that)
% todo: \v!cite => \s!cite
% todo: interface with (ml)bibtex (export -> call -> import)
@@ -38,171 +43,229 @@
\writestatus{loading}{ConTeXt Publication Support / Initialization}
\registerctxluafile{publ-dat}{1.001}
+\registerctxluafile{publ-ini}{1.001}
+\registerctxluafile{publ-sor}{1.001}
\registerctxluafile{publ-aut}{1.001}
\registerctxluafile{publ-usr}{1.001}
-\registerctxluafile{publ-ini}{1.001}
\registerctxluafile{publ-oth}{1.001} % this could become an option
-
-\doiffileelse{publ-fnd.lua}
- {\registerctxluafile{publ-fnd}{1.001}} % new method (for the moment only local)
- {}
+\registerctxluafile{publ-fnd}{1.001} % new method (for the moment only local)
+\registerctxluafile{publ-jrn}{1.001}
+\registerctxluafile{publ-reg}{1.001}
\unprotect
\startcontextdefinitioncode
-\def\s!btx {btx}
-\def\s!cite {cite}
-\def\s!list {list}
-\def\v!btxcite{btxcite}
-\def\v!btxlist{btxlist}
-
-% a dedicated construction mechanism
-
-\installcorenamespace {btxlist}
+\def\s!btx {btx}
+
+\def\v!btxcite {btxcite}
+\def\v!btxlist {btxlist}
+\def\v!btxrendering {btxrendering}
+
+\def\s!btxset {btxset}
+\def\s!btxref {btxref}
+\def\s!btxint {btxint}
+\def\s!btxbck {btxbck}
+\def\s!btxltx {btxltx}
+\def\s!btxrtx {btxrtx}
+\def\s!btxatx {btxatx}
+\def\s!btxbtx {btxbtx}
+\def\s!btxspc {btxspc}
+\def\s!btxlst {btxlst}
+
+\definelabelclass[btxlabel][2]
+
+% It is not that trivial to come up with a proper organization of setup
+% and control commands for publications. This is because we have complex
+% inline as well as extensive list rendering. The rules are partially
+% driven by somewhat archaic bibtex specifications and evolving journal
+% (or field) specific demands. The logic in the standards is often so
+% complex that it looks like manual rendering is assumed. But, we want to
+% automate the process as much as possible.
+%
+% Another complication is that in manuals we want to demonstrate different
+% properties of the implementation and therefore we need a way to handle
+% independent standards, databases, etc. This has resulted in the following
+% organization:
+%
+% - general setup (rather minimal)
+% - list setup (rendering)
+% - cite setup
+% - dataset setup
+%
+% The rendering is mostly driven by setups. In there we can call for fields
+% in the database but also for virtual fields or combinations.
-\installcommandhandler \??btxlist {btxlist} \??btxlist
+% The main rendering style (standard driven).
-\unexpanded\setvalue{\??constructioninitializer\v!btxlist}%
- {\let\currentbtxlist \currentconstruction
- \let\constructionparameter \btxlistparameter
- \let\detokenizedconstructionparameter\detokenizedbtxlistparameter
- \let\letconstructionparameter \letbtxlistparameter
- \let\useconstructionstyleandcolor \usebtxliststyleandcolor
- \let\setupcurrentconstruction \setupcurrentbtxlist}
+%D We assume that a specification is global or used grouped. It doesn't make much sense
+%D to split between cite and list here as it only complicates matters (timing) and is
+%D not clear either.
-\expandafter\let\csname\??constructionmainhandler \v!btxlist\expandafter\endcsname\csname\??constructionmainhandler \v!construction\endcsname
-\expandafter\let\csname\??constructioncommandhandler\v!btxlist\expandafter\endcsname\csname\??constructioncommandhandler\v!construction\endcsname
-\expandafter\let\csname\??constructiontexthandler \v!btxlist\expandafter\endcsname\csname\??constructiontexthandler \v!construction\endcsname
+\let\currentbtxspecification\empty
-\unexpanded\setvalue{\??constructioncommandhandler\v!btxlist}%
- {\csname\??constructionstarthandler\v!construction\endcsname
- \csname\??constructionstophandler \v!construction\endcsname
- \endgroup}
+\unexpanded\def\startbtxrenderingdefinitions[#1]%
+ {\unprotect
+ \pushmacro\currentbtxspecification
+ \edef\currentbtxspecification{#1}}
-\unexpanded\setvalue{\??constructionstarthandler\v!btxlist}%
- {\csname\??constructionstarthandler\v!construction\endcsname}
+\unexpanded\def\stopbtxrenderingdefinitions
+ {\popmacro\currentbtxspecification
+ \protect}
-\unexpanded\setvalue{\??constructionstophandler\v!btxlist}%
- {\csname\??constructionstophandler\v!construction\endcsname
- \endgroup}
+\unexpanded\def\loadbtxdefinitionfile [#1]{\clf_btxloaddefinitionfile {#1}}
+\unexpanded\def\loadbtxreplacementfile[#1]{\clf_btxloadreplacementfile{#1}}
-\unexpanded\def\startbtxlistentry#1%
- {\begingroup
- \strc_constructions_initialize{#1}%
- \csname\??constructionstarthandler\currentconstructionhandler\endcsname}
+\unexpanded\def\publ_specification_push#1%
+ {\pushmacro\currentbtxspecification
+ \pushmacro\currentbtxspecificationfallback
+ \edef\currentbtxspecification{#1}%
+ \edef\currentbtxspecificationfallback{\namedbtxparameter\currentbtxspecification\c!default}%
+ \ifx\currentbtxspecificationfallback\currentbtxspecification
+ \let\currentbtxspecificationfallback\empty
+ \fi
+ \clf_btxsetspecification{\currentbtxspecification}}
+
+\unexpanded\def\publ_specification_pop
+ {\popmacro\currentbtxspecificationfallback
+ \popmacro\currentbtxspecification
+ \clf_btxsetspecification{\currentbtxspecification}}
+
+\unexpanded\def\publ_specification_set#1% beware: is global
+ {\edef\currentbtxspecification{#1}%
+ \edef\currentbtxspecificationfallback{\namedbtxparameter\currentbtxspecification\c!default}%
+ \ifx\currentbtxspecificationfallback\currentbtxspecification
+ \let\currentbtxspecificationfallback\empty
+ \fi
+ % has to be done explicitly: \loadbtxdefinitionfile[\currentbtxspecification]%
+ \ifx\currentbtxspecification\empty
+ % we set default at the end
+ \else
+ \clf_btxsetspecification{\currentbtxspecification}%
+ \fi}% todo: ,true == also load
-\unexpanded\def\stopbtxlistentry
- {\csname\??constructionstophandler\currentconstructionhandler\endcsname}
+\installcorenamespace {btx}
-\unexpanded\setvalue{\??constructiontexthandler\v!btxlist}%
- {\begingroup
- \useconstructionstyleandcolor\c!headstyle\c!headcolor % move to \currentconstructiontext
- \the\everyconstruction
- \goto
- {\strut\constructionparameter\c!text\btx_list_reference_inject}%
-% [\s!btx:list:\the\numexpr\locationcount+\plusone]% \nextinternalreference
- [internal(\the\numexpr\locationcount+\plusone)]% \nextinternalreference
- \endgroup}
+\installswitchcommandhandler \??btx {btx} \??btx
-\unexpanded\def\strc_constructions_initialize#1% class instance
- {\edef\currentconstruction{#1}%
- \let\currentconstructionlistentry\!!zerocount
- \expandafter\let\expandafter\currentconstructionmain \csname\??constructionmain \currentconstruction\endcsname
- \expandafter\let\expandafter\currentconstructionlevel \csname\??constructionlevel\currentconstruction\endcsname
- \expandafter\let\expandafter\currentconstructionhandler\csname\??constructionclass\currentconstruction\endcsname
- \csname\??constructioninitializer\currentconstructionhandler\endcsname}
+\appendtoks
+ \ifnum\btxsetupmode=\doingrootsetuproot
+ \publ_specification_set{\btxparameter\c!specification}%
+ \else\ifnum\btxsetupmode=\doingrootsetupnamed
+ \publ_specification_set{\btxparameter\c!specification}%
+ \fi\fi
+\to \everysetupbtx
\appendtoks
- % \ifx\currentbtxlistparent\empty
- % \defineconstruction[\currentbtxlist][\currentbtxlistparent][\s!handler=\v!btxlist,\c!level=1]%
- % \else
- % \defineconstruction[\currentbtxlist][\s!handler=\v!btxlist,\c!level=1]%
- % \fi
- \ifx\currentbtxlistparent\empty
- \letvalue{\??constructionmain\currentbtxlist}\currentbtxlist
- \else
- \letvalue{\??constructionmain\currentbtxlist}\currentbtxlistparent
+ \ifnum\btxsetupmode=\doingrootsetuproot
+ \edef\currentbtxdataset{\clf_btxsetdataset{\btxparameter\c!dataset}{\currentbtxdataset}}%
\fi
- \setevalue{\??constructionlevel\currentbtxlist}{\number\btxlistparameter\c!level}%
- \setevalue{\??constructionclass\currentbtxlist}{\btxlistparameter\s!handler}%
-\to \everydefinebtxlist
-
-\setupbtxlist
- [\s!handler=\v!btxlist,
- \c!level=1]
-
-\setupbtxlist
- [\c!alternative=\v!left,
- \c!headstyle=,
- \c!titlestyle=,
- %\c!style=,
- %\c!color=,
- %\c!headcolor=,
- %\c!titlecolor=,
- \c!width=4\emwidth,
- \c!distance=\emwidth,
- %\c!titledistance=.5\emwidth,
- %\c!hang=,
- %\c!sample=,
- %\c!align=,
- %\c!headalign=,
- \c!margin=\v!no,
- \c!before=\blank,
- \c!inbetween=\blank,
- \c!after=\blank,
- %\c!indentnext=\v!yes,
- %\c!indenting=\v!never,
- %\c!titleleft=(,
- %\c!titleright=),
- %\c!closesymbol=,
- %\c!closecommand=\wordright,
- \c!display=\v!yes,
- \c!command=,
- %\c!titlecommand=,
- %\c!expansion=\v!no,
- %\c!xmlsetup=,
- %\s!catcodes=,
- %\c!title=\v!yes,
- %\c!text=,
- ]
+\to \everysetupbtx
+
+\appendtoks
+ \publ_specification_set{\btxparameter\c!specification}%
+\to \everyjob
+
+\unexpanded\def\startusingbtxspecification[#1]%
+ {\publ_specification_push{#1}}
+
+\let\stopusingbtxspecification\publ_specification_pop
+
+% \setupbtxlist[alternative=paragraph,width=auto,distance=\emwidth]
+% \setupbtxlist[alternative=paragraph,width=auto,distance=\emwidth,margin=2em] % useless
+% \setupbtxlist[alternative=paragraph,width=fit,distance=\emwidth]
+% \setupbtxlist[alternative=paragraph,width=fit,distance=\emwidth,margin=2em]
% here starts the bib stuff
\installcorenamespace {btxdataset}
-\installcorenamespace {btxlistvariant}
-\installcorenamespace {btxcitevariant}
\installcorenamespace {btxrendering}
+\installcorenamespace {btxregister}
\installcorenamespace {btxcommand}
-\installcorenamespace {btxnumbering}
-
-\installcommandhandler \??btxdataset {btxdataset} \??btxdataset
-\installcommandhandler \??btxlistvariant {btxlistvariant} \??btxlistvariant
-\installcommandhandler \??btxcitevariant {btxcitevariant} \??btxcitevariant
-\installcommandhandler \??btxrendering {btxrendering} \??btxrendering
+\installcorenamespace {btxrenderingdefinition}
+
+\installcommandhandler \??btxdataset {btxdataset} \??btxdataset
+\installcommandhandler \??btxregister {btxregister} \??btxregister
+\installcommandhandler \??btxrendering {btxrendering} \??btxrendering
+
+\let\currentbtxcitealternative\empty
+
+\let\currentbtxspecificationfallback\empty
+
+\unexpanded\def\setbtxparameterset#1#2%
+ {\edef\currentbtx
+ {\ifcsname\??btx\currentbtxspecification:#1:#2:\s!parent\endcsname
+ \currentbtxspecification:%
+ \else\ifx\currentbtxspecificationfallback\empty
+ \else\ifcsname\??btx\currentbtxspecificationfallback:#1:#2:\s!parent\endcsname
+ \currentbtxspecificationfallback:%
+ \fi\fi\fi#1:#2}}
+
+\unexpanded\def\setbtxparametersetroot#1%
+ {\edef\currentbtx
+ {\ifcsname\??btx\currentbtxspecification:#1:\s!parent\endcsname
+ \currentbtxspecification:#1%
+ \else\ifx\currentbtxspecificationfallback\empty
+ \else\ifcsname\??btx\currentbtxspecificationfallback:#1:\s!parent\endcsname
+ \currentbtxspecificationfallback:#1%
+ \fi\fi\fi}}
+
+\unexpanded\def\setbtxrendering
+ {\edef\currentbtxrendering
+ {\ifcsname\??btx\currentbtxspecification:\s!parent\endcsname
+ \currentbtxspecification
+ \else\ifx\currentbtxspecificationfallback\empty
+ \else\ifcsname\??btx\currentbtxspecificationfallback:\s!parent\endcsname
+ \currentbtxspecificationfallback
+ \fi\fi\fi}}
+
+\unexpanded\def\setbtxlist % maybe simplify this one, always list=rendering?
+ {\edef\currentbtxlist
+ {\ifcsname\??btx\currentbtxrendering:\s!parent\endcsname
+ \currentbtxrendering
+ \else\ifcsname\??btx\currentbtxspecification:\s!parent\endcsname
+ \currentbtxspecification
+ \else\ifx\currentbtxspecificationfallback\empty
+ \else\ifcsname\??btx\currentbtxspecificationfallback:\s!parent\endcsname
+ \currentbtxspecificationfallback
+ \fi\fi\fi\fi}%
+ \edef\currentlist{\s!btx:\currentbtxlist}}
\unexpanded\def\usebtxdataset
- {\dodoubleargument\publ_use_dataset}
+ {\begingroup
+ \dotripleempty\publ_use_dataset}
-\def\publ_use_dataset[#1][#2]%
- {\ifsecondargument
- \ctxcommand{usebtxdataset("#1","#2")}%
- \else
- \ctxcommand{usebtxdataset("\v!standard","#1")}%
- \fi}
+\def\publ_use_dataset[#1][#2][#3]%
+ {\getdummyparameters[\c!specification=\currentbtxspecification,#3]%
+ \ifsecondargument
+ \clf_btxusedataset
+ specification {\dummyparameter\c!specification}%
+ dataset {#1}%
+ filename {#2}%
+ \relax
+ \else\iffirstargument
+ \clf_btxusedataset
+ specification {\dummyparameter\c!specification}%
+ dataset {\v!default}%
+ filename {#1}%
+ \relax
+ \fi\fi
+ \endgroup}
\definebtxdataset
- [\v!standard]
+ [\v!default]
+% [\c!language=] % nothing set so use current
% \usebtxdataset
-% [standard]
+% [default]
% [mybibs.bib]
+\let\startpublication\relax
+\let\stoppublication \relax
+
\unexpanded\def\startpublication
{\dodoubleempty\publ_set_publication}
-\let\stoppublication\relax
-
\def\publ_set_publication[#1][#2]%
{\begingroup
\catcode\commentasciicode\othercatcode
@@ -215,15 +278,15 @@
\fi\fi{#1}{#2}}
\def\publ_set_publication_default#1#2%
- {\publ_set_publication_indeed\v!standard{#1}}
+ {\publ_set_publication_indeed\v!default{#1}}
\def\publ_set_publication_checked#1#2%
- {\doifassignmentelse{#1}
- {\publ_set_publication_indeed\v!standard{#1}}
+ {\doifelseassignment{#1}
+ {\publ_set_publication_indeed\v!default{#1}}
{\publ_set_publication_indeed{#1}{}}}
\def\publ_set_publication_indeed#1#2#3\stoppublication
- {\ctxcommand{addbtxentry("#1",\!!bs#2\!!es,\!!bs\detokenize{#3}\!!es)}%
+ {\clf_btxaddentry{#1}{#2}{\detokenize{#3}}%
\endgroup
\ignorespaces}
@@ -259,29 +322,45 @@
\unexpanded\def\definebtxcommand#1% {body} #1..#n{body}
{\setuvalue{\??btxcommand\strippedcsname#1}}%
+% tracing
+
+\installtextracker
+ {publications.crosslinks}
+ {\let\btx_trace_list_cross\strc_references_tracer}
+ {\let\btx_trace_list_cross\gobbletwoarguments}
+
+\let\btx_trace_list_cross\gobbletwoarguments
+
% access
\let\currentbtxtag \empty
-\let\currentbtxdataset\v!standard
+\let\currentbtxdataset\v!default
-\unexpanded\def\setbtxdataset[#1]%
- {\edef\currentbtxdataset{\ctxcommand{setbtxdataset("#1")}}}
-
-\unexpanded\def\setbtxentry[#1]%
- {\edef\currentbtxtag{\ctxcommand{setbtxentry("\currentbtxdataset","#1")}}}
+\unexpanded\def\setbtxentry[#1]% or maybe btxsetentry
+ {\edef\currentbtxtag{\clf_btxsetentry{\currentbtxdataset}{#1}}}
% \let\btxsetdataset\setbtxdataset
% \let\btxsetentry \setbtxentry
-\def\btxfield #1{\ctxcommand{btxfield("\currentbtxdataset","\currentbtxtag","#1")}}
-\def\btxdetail #1{\ctxcommand{btxdetail("\currentbtxdataset","\currentbtxtag","#1")}}
-\def\btxflush #1{\ctxcommand{btxflush("\currentbtxdataset","\currentbtxtag","#1")}}
-%def\btxrendering#1{\ctxcommand{btxrendering("\currentbtxdataset","\currentbtxtag","#1","\btxrenderingparameter\c!interaction")}}
-\def\btxdoifelse #1{\ctxcommand{btxdoifelse("\currentbtxdataset","\currentbtxtag","#1")}}
-\def\btxdoif #1{\ctxcommand{btxdoif("\currentbtxdataset","\currentbtxtag","#1")}}
-\def\btxdoifnot #1{\ctxcommand{btxdoifnot("\currentbtxdataset","\currentbtxtag","#1")}}
-
-\let\btxsetup \directsetup
+% todo: no need for the currents as we can keep them at the lua end so we will have
+%
+% \btxfield : current
+% \btxspecificfield : dataset,tag,key
+
+\def\btxfield #1{\clf_btxfield {\currentbtxdataset}{\currentbtxtag}{#1}}
+\def\btxdetail #1{\clf_btxdetail {\currentbtxdataset}{\currentbtxtag}{#1}}
+\def\btxflush #1{\clf_btxflush {\currentbtxdataset}{\currentbtxtag}{#1}}
+\def\btxdirect #1{\clf_btxdirect {\currentbtxdataset}{\currentbtxtag}{#1}}
+\def\btxfieldname #1{\clf_btxfieldname {\currentbtxdataset}{\currentbtxtag}{#1}}
+\def\btxfieldtype #1{\clf_btxfieldtype {\currentbtxdataset}{\currentbtxtag}{#1}}
+\def\btxfoundname #1{\clf_btxfoundname {\currentbtxdataset}{\currentbtxtag}{#1}}
+\def\btxfoundtype #1{\clf_btxfoundtype {\currentbtxdataset}{\currentbtxtag}{#1}}
+\def\btxauthorfield#1{\clf_btxauthorfield \currentbtxauthorindex{#1}}
+\def\btxdoifelse #1{\clf_btxdoifelse {\currentbtxdataset}{\currentbtxtag}{#1}}
+\def\btxdoif #1{\clf_btxdoif {\currentbtxdataset}{\currentbtxtag}{#1}}
+\def\btxdoifnot #1{\clf_btxdoifnot {\currentbtxdataset}{\currentbtxtag}{#1}}
+
+\let\btxsetup\fastsetup
%D How complex will we go? Can we assume that e.g. an apa style will not be mixed
%D with another one? I think this assumption is okay. For manuals we might want to
@@ -289,93 +368,280 @@
%D Rendering.
-\unexpanded\def\btxspace {\removeunwantedspaces\space}
-\unexpanded\def\btxperiod {\removeunwantedspaces.\space}
-\unexpanded\def\btxcomma {\removeunwantedspaces,\space}
-\unexpanded\def\btxlparent {\removeunwantedspaces\space(}
-\unexpanded\def\btxrparent {\removeunwantedspaces)\space}
-\unexpanded\def\btxlbracket{\removeunwantedspaces\space[}
-\unexpanded\def\btxrbracket{\removeunwantedspaces]\space}
+\unexpanded\def\btxspace {\removeunwantedspaces\space}
+\unexpanded\def\btxnobreakspace {\removeunwantedspaces\nobreakspace} % these two are
+\unexpanded\def\btxnbsp {\removeunwantedspaces\nbsp} % the same anyway
+\unexpanded\def\btxperiod {\removeunwantedspaces.\space}
+\unexpanded\def\btxcomma {\removeunwantedspaces,\space}
+\unexpanded\def\btxcolon {\removeunwantedspaces:\space}
+\unexpanded\def\btxsemicolon {\removeunwantedspaces;\space}
+\unexpanded\def\btxlparent {\removeunwantedspaces\space(} % obsolete
+\unexpanded\def\btxrparent {\removeunwantedspaces)\space} % obsolete
+\unexpanded\def\btxleftparenthesis {\removeunwantedspaces\space(}
+\unexpanded\def\btxrightparenthesis {\removeunwantedspaces)\space}
+\unexpanded\def\btxrightparenthesisperiod{\removeunwantedspaces).\space}
+\unexpanded\def\btxrightparenthesiscomma {\removeunwantedspaces),\space}
+\unexpanded\def\btxleftbracket {\removeunwantedspaces\space[}
+\unexpanded\def\btxrightbracket {\removeunwantedspaces]\space}
+\unexpanded\def\btxrightbracketperiod {\removeunwantedspaces].\space}
+\unexpanded\def\btxrightbracketcomma {\removeunwantedspaces],\space}
+
+%D Variables:
+
+\let\currentbtxbacklink \empty \unexpanded\def\btxsetbacklink {\def\currentbtxbacklink}
+\let\currentbtxbacktrace \empty \unexpanded\def\btxsetbacktrace {\def\currentbtxbacktrace}
+\let\currentbtxcategory \empty \unexpanded\def\btxsetcategory {\def\currentbtxcategory}
+\let\currentbtxcombis \empty \unexpanded\def\btxsetcombis {\def\currentbtxcombis}
+\let\currentbtxdataset \empty \unexpanded\def\btxsetdataset {\def\currentbtxdataset}
+\let\currentbtxfirst \empty \unexpanded\def\btxsetfirst {\def\currentbtxfirst}
+\let\currentbtxsecond \empty \unexpanded\def\btxsetsecond {\def\currentbtxsecond}
+\let\currentbtxthird \empty \unexpanded\def\btxsetthird {\def\currentbtxthird}
+\let\currentbtxinternal \empty \unexpanded\def\btxsetinternal {\def\currentbtxinternal}
+\let\currentbtxlefttext \empty \unexpanded\def\btxsetlefttext {\def\currentbtxlefttext}
+\let\currentbtxrighttext \empty \unexpanded\def\btxsetrighttext {\def\currentbtxrighttext}
+\let\currentbtxbefore \empty \unexpanded\def\btxsetbefore {\def\currentbtxbefore}
+\let\currentbtxafter \empty \unexpanded\def\btxsetafter {\def\currentbtxafter}
+\let\currentbtxlanguage \empty \unexpanded\def\btxsetlanguage {\def\currentbtxlanguage}
+\let\currentbtxtag \empty \unexpanded\def\btxsettag {\def\currentbtxtag}
+\let\currentbtxnumber \empty \unexpanded\def\btxsetnumber {\def\currentbtxnumber}
+\let\currentbtxauthorvariant\v!normal \unexpanded\def\btxsetauthorvariant{\def\currentbtxauthorvariant}
+
+\let\currentbtxfirstnames \empty \unexpanded\def\btxsetfirstnames{\let\currentbtxfirstnames\currentbtxfirstnames_indeed}
+\let\currentbtxinitials \empty \unexpanded\def\btxsetinitials {\let\currentbtxinitials \currentbtxinitials_indeed }
+\let\currentbtxjuniors \empty \unexpanded\def\btxsetjuniors {\let\currentbtxjuniors \currentbtxjuniors_indeed }
+\let\currentbtxsurnames \empty \unexpanded\def\btxsetsurnames {\let\currentbtxsurnames \currentbtxsurnames_indeed }
+\let\currentbtxvons \empty \unexpanded\def\btxsetvons {\let\currentbtxvons \currentbtxvons_indeed }
+
+\newconstant\currentbtxoverflow \unexpanded\def\btxsetoverflow #1{\currentbtxoverflow #1\relax}
+\newconstant\currentbtxconcat \unexpanded\def\btxsetconcat #1{\currentbtxconcat #1\relax}
+\newconstant\currentbtxcount \unexpanded\def\btxsetcount #1{\currentbtxcount #1\relax}
+\newconstant\currentbtxauthorindex %unexpanded\def\btxsetauthorindex#1{\currentbtxauthorindex#1\relax} % passed directly
+\newconstant\currentbtxauthorcount %unexpanded\def\btxsetauthorcount#1{\currentbtxauthorcount#1\relax} % passed directly
+\newconstant\currentbtxauthorstate \unexpanded\def\btxsetauthorstate#1{\currentbtxauthorstate#1\relax}
+
+\unexpanded\def\currentbtxfirstnames_indeed{\clf_btxcurrentfirstnames\numexpr\currentbtxauthorindex\relax}
+\unexpanded\def\currentbtxinitials_indeed {\clf_btxcurrentinitials \numexpr\currentbtxauthorindex\relax}
+\unexpanded\def\currentbtxjuniors_indeed {\clf_btxcurrentjuniors \numexpr\currentbtxauthorindex\relax}
+\unexpanded\def\currentbtxsurnames_indeed {\clf_btxcurrentsurnames \numexpr\currentbtxauthorindex\relax}
+\unexpanded\def\currentbtxvons_indeed {\clf_btxcurrentvons \numexpr\currentbtxauthorindex\relax}
+
+\def\currentbtxauthorvariant{normal}
+
+\unexpanded\def\btxlistreset
+ {\let\currentbtxcombis \empty
+ \let\currentbtxcategory \empty
+ \let\currentbtxinternal \empty
+ \let\currentbtxlefttext \empty
+ \let\currentbtxrighttext\empty
+ \let\currentbtxbefore \empty
+ \let\currentbtxafter \empty
+ \let\currentbtxbacklink \empty
+ \let\currentbtxbacktrace\empty
+ \let\currentbtxlanguage \empty
+ \let\currentbtxtag \empty
+ \let\currentbtxnumber \empty
+ \let\currentbtxdataset \empty}
+
+\unexpanded\def\btxcitereset % check for less .. not all resets needed
+ {\let \currentbtxfirst \empty
+ \let \currentbtxsecond \empty
+ \let \currentbtxinternal \empty
+ \let \currentbtxlefttext \empty
+ \let \currentbtxrighttext \empty
+ \let \currentbtxbefore \empty
+ \let \currentbtxafter \empty
+ \let \currentbtxbacklink \empty
+ \let \currentbtxbacktrace \empty % not used here
+ \let \currentbtxlanguage \empty
+ \let \currentbtxdataset \empty
+ \let \currentbtxtag \empty
+ \let \currentbtxnumber \empty
+ \setconstant\currentbtxoverflow \zerocount
+ \setconstant\currentbtxconcat \zerocount
+ \setconstant\currentbtxcount \zerocount}
+
+%D Language:
+
+\def\mainbtxlanguage{\currentmainlanguage}
+
+\unexpanded\def\btx_check_language
+ {\let\mainbtxlanguage\currentlanguage
+ \ifx\currentbtxlanguage\empty
+ \let\currentbtxlanguage\currentlanguage
+ \else
+ \btx_check_language_indeed
+ \fi}
-%D Rendering lists and citations.
+\unexpanded\def\btx_check_language_indeed
+ {\edef\currentbtxlanguage{\reallanguagetag\currentbtxlanguage}%
+ \ifx\currentbtxlanguage\empty
+ \let\currentbtxlanguage\currentlanguage
+ \else\ifx\currentbtxlanguage\currentlanguage\else
+ \setcurrentlanguage\currentmainlanguage\currentbtxlanguage
+ \fi\fi}
+
+%D Tracing
-\newconditional\c_btx_trace
+\newconditional\c_btx_trace % not used yet
\installtextracker
{btxrendering}
{\settrue \c_btx_trace}
{\setfalse\c_btx_trace}
-\unexpanded\def\startbtxrendering
- {\begingroup
- \dosingleempty\btx_start_rendering}
-
-\def\btx_start_rendering[#1]%
- {\edef\currentbtxrendering{#1}}
-
-\unexpanded\def\stopbtxrendering
- {\endgroup}
+%D Rendering lists and citations.
\unexpanded\def\btxtodo#1%
{[#1]}
-%D Specific rendering definitions (like apa):
-
-\unexpanded\def\loadbtxdefinitionfile[#1]%
- {\ctxcommand{loadbtxdefinitionfile("#1")}}
-
%D Lists:
\newdimen\d_publ_number_width
%newdimen\d_publ_number_distance
\ifdefined\btxblock \else \newcount\btxblock \fi \btxblock\plusone
-\ifdefined\btxlistcounter \else \newcount\btxlistcounter \fi
-\ifdefined\btxcitecounter \else \newcount\btxcitecounter \fi
+\ifdefined\btxcitecounter \else \newcount\btxcitecounter \fi % maybe pass this to lua
\newtoks \everysetupbtxlistplacement % name will change
\newtoks \everysetupbtxciteplacement % name will change
-% \def\publ_list_processor % bibref -> btx (old method, keep as reference)
-% {\ctxcommand{btxaddtolist("\currentbtxrendering",\currentlistindex,"btxref")}}
-
\definelist % only used for selecting
[\s!btx]
\setuplist
- [\s!btx]%
- [\c!state=\v!start]%
+ [\s!btx]
+ [\c!prefixstopper=:,
+ \c!state=\v!start,
+ \c!alternative=\v!paragraph,
+ \c!before=\blank,
+ \c!after=\blank,
+ \c!width=\v!auto,
+ \c!distance=\emwidth]
+
+\unexpanded\def\setupbtxlist
+ {\dodoubleempty\publ_setup_list}
+
+\unexpanded\def\publ_setup_list[#1][#2]%
+ {\ifsecondargument
+ \setuplist[\s!btx:#1][#2]%
+ \else\iffirstargument
+ \setuplist[\s!btx][#1]%
+ \fi\fi}
\appendtoks
\ifx\currentbtxrenderingparent\empty
- \definebtxlist
- [\currentbtxrendering]%
+ \definelist
+ [\s!btx:\currentbtxrendering]%
+ [\s!btx]%
+ \else\ifx\currentbtxrenderingparent\s!btx
+ \definelist
+ [\s!btx:\currentbtxrendering]%
+ [\s!btx]%
\else
- \definebtxlist
- [\currentbtxrendering]%
- [\currentbtxrenderingparent]%
- \fi
+ \definelist
+ [\s!btx:\currentbtxrendering]%
+ [\s!btx:\currentbtxrenderingparent]%
+ \fi\fi
\to \everydefinebtxrendering
-\let\currentbtxcombis\empty % goes into the setups
+\newconditional\c_btx_list_texts
+
+\appendtoks
+ \doifelse{\btxrenderingparameter\c!textstate}\v!start
+ \settrue\setfalse\c_btx_list_texts
+\to \everysetupbtxlistplacement
+
+% page stuff (for thomas)
+
+\let\currentbtxfirstpage \empty \unexpanded\def\btxsetfirstpage #1{\def\currentbtxfirstpage{\btx_page_number{#1}}}
+\let\currentbtxlastpage \empty \unexpanded\def\btxsetlastpage #1{\def\currentbtxlastpage {\btx_page_number{#1}}}
+\let\currentbtxfirstinternal\empty \unexpanded\def\btxsetfirstinternal {\def\currentbtxfirstinternal}
+\let\currentbtxlastinternal \empty \unexpanded\def\btxsetlastinternal {\def\currentbtxlastinternal}
+
+\unexpanded\def\btx_page_number#1%
+ {\def\currentlistindex{#1}%
+ \structurelistpagenumber}
+
+\unexpanded\def\btxpagereset
+ {\let \currentbtxfirstpage \empty
+ \let \currentbtxlastpage \empty
+ \let \currentbtxfirstinternal\empty
+ \let \currentbtxlastinternal \empty
+ \setconstant\currentbtxoverflow \zerocount
+ \setconstant\currentbtxconcat \zerocount
+ \setconstant\currentbtxcount \zerocount}
+
+\newconditional\c_btx_list_pages
+
+\appendtoks
+ \doifelse{\btxrenderingparameter\c!pagestate}\v!start
+ \settrue\setfalse\c_btx_list_pages
+\to \everysetupbtxlistplacement
+
+\unexpanded\def\btx_entry_inject_pages % for the moment only normal
+ {\dontleavehmode
+ \begingroup
+ \setbtxlist % probably already set
+ \btxpagereset
+ \setbtxparameterset\s!page\s!list
+ \btxparameter\c!command
+ {\usebtxstyleandcolor\c!style\c!color
+ \btxparameter\c!pageleft
+ \clf_btxflushpages{\currentbtxdataset}{\currentbtxtag}%
+ \btxparameter\c!pageright}%
+ \endgroup}
+
+\unexpanded\def\btxpagesetup
+ {\btxsetuptype\plusfour
+ \fastbtxsetup\s!page\s!list
+ \btxpagereset}
+
+% end of page stuff
\unexpanded\def\btx_entry_inject
{\begingroup
\edef\currentbtxcategory{\btxfield{category}}%
\ignorespaces
- \directsetup{\s!btx:\currentbtxalternative:\currentbtxcategory}%
+ \ifconditional\c_btx_list_texts
+ \currentbtxbefore
+ \fi
+ \begingroup
+ \usebtxstyleandcolor\c!style\c!color
+ \ignorespaces
+ \btxsetuptype\plusthree
+ \fastbtxsetup\s!list\currentbtxcategory
\removeunwantedspaces
+ \endgroup
+ \ifconditional\c_btx_list_pages
+ \btx_entry_inject_pages
+ \fi
\ifx\currentbtxcombis\empty \else
\btxrenderingparameter\c!separator
\processcommacommand[\currentbtxcombis]\btx_entry_inject_combi
\fi
+ \ifconditional\c_btx_list_texts
+ \currentbtxafter
+ \fi
\endgroup}
+\unexpanded\def\btxshowentryinline
+ {\dodoubleempty\btx_entry_show_inline}
+
+\unexpanded\def\btx_entry_show_inline[#1][#2]%
+ {\ifsecondargument
+ \ctxcommand{showbtxentry("#1","#2")}
+ \else\iffirstargument
+ \ctxcommand{showbtxentry("\currentbtxdataset","#1")}
+ \else
+ \ctxcommand{showbtxentry("\currentbtxdataset","\currentbtxtag")}
+ \fi\fi}
+
\def\btx_entry_inject_combi#1%
{\begingroup
\def\currentbtxtag{#1}%
\ignorespaces
- \directsetup{\s!btx:\currentbtxalternative:\currentbtxcategory}%
+ \btxsetuptype\plusthree
+ \fastbtxsetup\s!list\currentbtxcategory
\removeunwantedspaces
\endgroup}
@@ -385,183 +651,329 @@
\let\completelistofpublications\completebtxrendering
\let\placelistofpublications \placebtxrendering
-\def\publ_place_list_check_criterium
- {\edef\currentbtxcriterium{\btxrenderingparameter\c!criterium}% \v!cite will become \s!cite
- \ifx\currentbtxcriterium\empty
- \let\currentbtxcriterium\v!previous
- \else\ifx\currentbtxcriterium\v!cite
- \let\currentbtxcriterium\v!here
- \fi\fi}
+\newtoks\everybtxlistrendering
-\def\publ_place_list_complete[#1][#2]% title might become obsolete, just headtext
- {\begingroup
- \edef\currentbtxrendering{#1}%
- \setupcurrentbtxrendering[#2]%
- \let\currentlist\s!btx
- \let\currentbtxlist\currentbtxrendering
- \publ_place_list_check_criterium
- \edef\currentbtxrenderingtitle{\btxrenderingparameter\c!title}%
- \ifx\currentbtxrenderingtitle\empty
- \normalexpanded{\startnamedsection[\v!chapter][\c!reference=\currentbtxrendering,\c!title={\headtext{\currentbtxrendering}}]}%
- \else
- \normalexpanded{\startnamedsection[\v!chapter][\c!reference=\currentbtxrendering,\c!title={\currentbtxrenderingtitle}]}%
- \fi
- \publ_place_list_indeed
- \stopnamedsection
- \endgroup}
+\appendtoks
+ \setbtxlist
+ %
+ \edef\currentbtxcriterium{\btxrenderingparameter\c!criterium}% \v!cite will become \s!cite
+ \ifx\currentbtxcriterium\empty
+ \let\currentbtxcriterium\v!previous
+ \else\ifx\currentbtxcriterium\v!cite
+ \let\currentbtxcriterium\v!here
+ \fi\fi
+ %
+ \iflocation
+ \letinteractionparameter\c!style\empty
+ \fi
+\to \everybtxlistrendering
-\def\publ_place_list_standard[#1][#2]%
- {\begingroup
- \edef\currentbtxrendering{#1}%
- \setupcurrentbtxrendering[#2]%
- \let\currentlist\s!btx
- \let\currentbtxlist\currentbtxrendering
- \publ_place_list_check_criterium
- \publ_place_list_indeed
- \endgroup}
+\def\nofbtxlistentries {0}
+\def\currentbtxlistentry{0}
+\def\currentbtxlistindex{0} % only for internal use (points back to big list)
-\newconditional\c_publ_place_all
-\newconditional\c_publ_place_register % to be interfaced
-\newconditional\c_publ_place_check % to be interfaced
+\newconditional\c_publ_prefixed
-\appendtoks
- \ifx\currentbtxcriterium\v!all % move this check to lua ... easier to test there anyway
- \settrue\c_publ_place_all
+\unexpanded\def\btxsetnoflistentries #1{\edef\nofbtxlistentries {#1}}
+\unexpanded\def\btxsetcurrentlistentry#1{\edef\currentbtxlistentry{#1}}
+\unexpanded\def\btxsetcurrentlistindex#1{\edef\currentbtxlistindex{#1}}
+
+\unexpanded\def\btxdoifelsesameaspreviouschecked#1#2% #1 == always | doublesided
+ {\clf_btxdoifelsesameasprevious
+ {\currentbtxdataset}%
+ \currentbtxlistentry%
+ {#2}%
+ \c_btx_list_reference
+ {#1}}
+
+\unexpanded\def\btxdoifelsesameasprevious
+ {\btxdoifelsesameaspreviouschecked\v!doublesided}
+
+\let\btxdoifsameaspreviouscheckedelse\btxdoifelsesameaspreviouschecked
+\let\btxdoifsameaspreviouselse \btxdoifelsesameasprevious
+
+\def\publ_place_list_indeed#1[#2][#3]%
+ {\begingroup
+ \ifsecondargument
+ % [rendering] [settings]
+ \edef\currentbtxrendering{#2}%
+ \setupcurrentbtxrendering[#3]%
+ \edef\p_specification{\btxrenderingparameter\c!specification}%
+ \ifx\p_specification\empty\else
+ \let\currentbtxspecification\p_specification
+ \fi
+ \else\iffirstargument
+ \doifelseassignment{#2}
+ {% [settings]
+ \let\currentbtxrendering\currentbtxspecification
+ \setupcurrentbtxrendering[#2]%
+ \edef\p_specification{\btxrenderingparameter\c!specification}%
+ \ifx\p_specification\empty\else
+ \let\currentbtxspecification\p_specification
+ \let\currentbtxrendering\currentbtxspecification % tricky
+ \fi}
+ {\edef\currentbtxrendering{#2}%
+ \edef\p_specification{\btxrenderingparameter\c!specification}%
+ \ifx\p_specification\empty\else
+ \let\currentbtxspecification\p_specification
+ \fi}%
\else
- \setfalse\c_publ_place_all
+ \let\currentbtxrendering\currentbtxspecification
+ \fi\fi
+ \setbtxparameterset\currentbtxspecification\s!list
+ \the\everybtxlistrendering
+ \ifconditional#1\relax
+ \edef\currentbtxrenderingtitle{\btxrenderingparameter\c!title}%
+ \ifx\currentbtxrenderingtitle\empty
+ \normalexpanded{\startnamedsection[\v!chapter][\c!reference=\currentbtxrendering,\c!title={\headtext{\currentbtxrendering}}]}%
+ \else
+ \normalexpanded{\startnamedsection[\v!chapter][\c!reference=\currentbtxrendering,\c!title={\currentbtxrenderingtitle}]}%
+ \fi
\fi
-\to \everysetupbtxlistplacement
-
-\def\publ_place_list_indeed
- {\startbtxrendering[\currentbtxrendering]%
- \directsetup{\btxrenderingparameter\c!setups}%
- % \determinelistcharacteristics[\currentbtxrendering]%
- \edef\currentbtxalternative{\btxrenderingparameter\c!alternative}%
- \edef\currentbtxdataset{\btxrenderingparameter\c!dataset}%
- \let\currentlist\s!btx
- \let\currentbtxlist\currentbtxrendering
- \the\everysetupbtxlistplacement
- \forgetall
- \ctxcommand{btxsetlistmethod("\currentbtxdataset","\btxrenderingparameter\c!method")}%
+ \ifx\currentbtxrendering\empty
+ \setbtxrendering % hm
+ \fi
+ \btxrenderingparameter\c!before
+ \edef\currentbtxdataset{\btxrenderingparameter\c!dataset}%
+ \uselanguageparameter\btxdatasetparameter % new
+ \setbtxlist
+ \the\everystructurelist
+ \the\everysetupbtxlistplacement
+ \forgetall
+ % why not pass this with collect .. todo
+ % here we just collect items
+ \clf_btxcollectlistentries
+ names {\s!btx}%
+ criterium {\currentbtxcriterium}%
+ reference {\btxrenderingparameter\c!reference}%
+ method {\btxrenderingparameter\c!method}%
+ dataset {\currentbtxdataset}%
+ keyword {\btxrenderingparameter\c!keyword}%
+ sorttype {\btxrenderingparameter\c!sorttype}%
+ repeated {\btxrenderingparameter\c!repeat}%
+ ignored {\btxrenderingparameter\c!ignore}%
+ group {\btxrenderingparameter\c!group}%
+ \relax
+ \ifnum\nofbtxlistentries>\zerocount
\startpacked[\v!blank]%
- % here we just collect items
- \ctxcommand{btxcollectlistentries {
- names = "btx",
- criterium = "\currentbtxcriterium",
- number = "\btxrenderingparameter\c!number",
- btxdataset = "\currentbtxdataset",
- keyword = "\btxrenderingparameter\c!keyword",
- }}%
- % next we analyze the width
- \ifx\btx_list_reference_inject_indeed\relax
- \else
- \edef\p_width{\btxrenderingparameter\c!width}%
- \ifx\p_width\v!auto
- \scratchcounter\btxlistcounter
- \setbox\scratchbox\vbox{\settrialtypesetting\ctxcommand{btxfetchlistentries("\currentbtxdataset")}}%
- \d_publ_number_width\wd\scratchbox
- \global\btxlistcounter\scratchcounter
- \letbtxlistparameter\c!width\d_publ_number_width
- \fi
+ % sorting and so
+ \clf_btxpreparelistentries{\currentbtxdataset}% could be put in collect
+ % next we analyze the width
+ \ifx\currentbtxnumbering\empty \else
+ \edef\p_width{\listparameter\c!width}%
+ \ifx\p_width\v!auto
+ \setbox\scratchbox\vbox \bgroup
+ \settrialtypesetting
+ \clf_btxfetchlistentries{\currentbtxdataset}%
+ \egroup
+ \d_publ_number_width\wd\scratchbox
+ \letlistparameter\c!width\d_publ_number_width
\fi
- % this actually typesets them
- \ctxcommand{btxflushlistentries("\currentbtxdataset","\btxrenderingparameter\c!sorttype")}%
+ \fi
+ \doifelse{\listparameter\c!prefix}\v!yes\settrue\setfalse\c_publ_prefixed
+ % this actually typesets them, we loop here as otherwise the whole
+ % bunch gets flushed at once
+ \dorecurse\nofbtxlistentries
+ {\let\currentbtxlistentry\recurselevel
+ \clf_btxflushlistentry{\currentbtxdataset}\currentbtxlistentry\relax}%
\stoppacked
- \stopbtxrendering
- \global\advance\btxblock\plusone}
+ \fi
+ \btxrenderingparameter\c!after
+ \global\advance\btxblock\plusone
+ \ifconditional#1\relax
+ \stopnamedsection
+ \fi
+ \endgroup}
-\def\currentbtxblock{\number\btxblock}
+\def\publ_place_list_complete{\publ_place_list_indeed\conditionaltrue}
+\def\publ_place_list_standard{\publ_place_list_indeed\conditionalfalse}
-\def\publ_place_list_entry_checked
- {\ctxcommand{btxdoifelselistentryplaced("\currentbtxdataset","\currentbtxtag")}\donothing\publ_place_list_entry}
+\def\currentbtxblock{\number\btxblock}
-\def\publ_place_list_entry_register
- {\ctxcommand{btxregisterlistentry("\currentbtxdataset","\currentbtxtag")}}
+% called at the lua end, for determining the width
-\unexpanded\def\btxhandlelistentry#1% called at the lua end
+\unexpanded\def\btxchecklistentry
{\begingroup
- \edef\currentbtxtag{#1}%
- \ifconditional\c_publ_place_all
- \publ_place_list_entry
- \else\ifconditional\c_publ_place_check
- \publ_place_list_entry_checked
- \else
- \publ_place_list_entry
- \fi\fi
+ % todo, switch to font
+ \hbox{\btx_reference_checked}%
+ \par
\endgroup}
-\unexpanded\def\publ_place_list_entry
- {\global\advance\btxlistcounter\plusone
- \ifconditional\c_publ_place_register
- \publ_place_list_entry_register
- \fi
- \let\currentlist\s!btx
- \startbtxlistentry\currentbtxrendering
- \btx_entry_inject
- \stopbtxlistentry}
+% called at the lua end, the real rendering
+
+% we could have a yes and no where o nils the btx_reference_indeed ... saves a check there
+
+\installstructurelistprocessor{\s!btx}
+ {\let\currentlistentrynumber \btx_reference_indeed
+ \let\currentlistentrytitle \btx_entry_indeed
+ \let\currentlistentrypagenumber\btx_page_indeed
+ \strc_lists_apply_renderingsetup}
+
+\def\btx_entry_indeed
+ {\btx_list_reference_inject
+ \btx_entry_inject}
-\unexpanded\def\btxchecklistentry#1% called at the lua end
+\def\btx_page_indeed
+ {}
+
+\unexpanded\def\btxhandlelistentry
+ {\strc_lists_entry_process}
+
+\unexpanded\def\btxstartlistentry % maybe pass i
{\begingroup
- \edef\currentbtxtag{#1}%
- \ifx\currentbtxcriterium\v!all % move this check to lua ... easier to test there anyway
- \publ_check_list_entry
- \else
- \ctxcommand{btxdoifelselistentryplaced("\currentbtxdataset","\currentbtxtag")}\donothing\publ_check_list_entry
+ \global\advance\c_btx_list_reference\plusone}
+
+\unexpanded\def\btxstoplistentry
+ {\iftrialtypesetting
+ \global\advance\c_btx_list_reference\minusone
\fi
\endgroup}
-\unexpanded\def\publ_check_list_entry
- {\global\advance\btxlistcounter\plusone
- % todo, switch to font
- \hbox{\btx_reference_checked}%
- \par}
+\newtoks\everybtxlistentry
-\unexpanded\def\btx_list_reference_inject % we can use a faster \reference
- {\dontleavehmode\begingroup % no box
- \iftrialtypesetting\else
- \ctxcommand{btxlistreference("\currentbtxdataset","\currentbtxblock","\currentbtxtag","\number\btxlistcounter")}%
- \fi
- \btx_list_reference_inject_indeed
+\unexpanded\def\btxlistsetup#1% used for the reference in the list
+ {\the\everybtxlistentry
+ \everybtxlistentry\emptytoks % so only once per entry to be sure
+ \btxsetuptype\plusthree
+ \fastbtxsetup\s!list{#1}}
+
+\appendtoks
+ \btx_check_language
+\to \everybtxlistentry
+
+\unexpanded\def\btx_reference_indeed
+ {\begingroup
+ %let\currentbtxlistvariant\currentbtxnumbering
+ \setbtxparameterset\c!list\currentbtxnumbering
+ \ifx\currentbtxnumbering\empty
+ % nothing
+ \else\ifx\currentbtxnumbering\v!no
+ % nothing
+ \else
+ \usebtxstyleandcolor\c!style\c!color % new, needed?
+ % \btxparameter\c!left
+ \ifconditional\c_publ_prefixed\btxlistprefixednumber\fi
+ \clf_btxlistvariant % some can go
+ {\currentbtxdataset}%
+ {\currentbtxblock}%
+ {\currentbtxtag}%
+ {\currentbtxnumbering}%
+ {\currentbtxnumber}%
+ \relax
+ % \btxparameter\c!right
+ \fi\fi
\endgroup}
+\unexpanded\def\btxlistprefixednumber % hack but alan needs it
+ {\clf_listprefixednumber
+ {\currentlist}%
+ \currentbtxlistindex
+ {%
+ prefix {\listparameter\c!prefix}%
+ separatorset {\listparameter\c!prefixseparatorset}%
+ conversionset {\listparameter\c!prefixconversionset}%
+ starter {\listparameter\c!prefixstarter}%
+ stopper {\listparameter\c!prefixstopper}%
+ set {\listparameter\c!prefixset}%
+ segments {\listparameter\c!prefixsegments}%
+ connector {\listparameter\c!prefixconnector}%
+ }%
+ \relax}
+
\unexpanded\def\btx_reference_checked
{\dontleavehmode\hbox\bgroup
- \btx_list_reference_inject_indeed
+ \btx_reference_indeed
\egroup}
-\unexpanded\def\btx_cite_reference_inject % todo: wrap whole content?
+\newcount\c_btx_list_reference
+
+\unexpanded\def\btx_list_reference_inject
{\dontleavehmode\begingroup % no box
\iftrialtypesetting\else
-% \ifx\currentbtxinternal\empty\else
- % \global\advance\btxcitecounter\plusone
- \ctxcommand{btxcitereference(\number\currentbtxinternal)}%
-% \fi
+ \btx_list_reference_inject_now
\fi
- % \btx_list_reference_inject_indeed
+ % \btx_reference_indeed % else double entry in list
\endgroup}
+\def\btx_list_reference_inject_now
+ {\btx_trace_list_cross\empty\currentbtxbacktrace
+ \strc_references_direct_full_user
+ {\ifx\currentbtxdataset\v!default\else\s!btxset=\currentbtxdataset,\fi%
+ \s!btxref=\currentbtxtag,%
+ \s!btxspc=\currentbtxspecification,%
+ \s!btxlst=\number\c_btx_list_reference,% check if needed
+ \ifx\currentbtxbefore\empty\else\s!btxbtx={\currentbtxbefore},\fi%
+ \ifx\currentbtxafter \empty\else\s!btxatx={\currentbtxafter },\fi%
+ \ifx\currentbtxbacklink\currentbtxbacktrace\s!btxint=\currentbtxbacklink\else\s!btxbck=\currentbtxbacktrace\fi}%
+ {\s!btx::\v!list::\number\c_btx_list_reference}%
+ {\currentbtxnumber}}
+
+\newconditional\c_btx_cite_reference_injected
+
+\unexpanded\def\btx_cite_reference_inject
+ {\ifconditional\c_btx_cite_reference_injected
+ \else
+ \dontleavehmode
+ \iftrialtypesetting \else
+ \ifx\currentbtxbacklink\empty
+ % can be made empty when combining author / year
+ \else
+ \btx_cite_reference_inject_indeed
+ \settrue\c_btx_cite_reference_injected
+ \fi
+ \fi
+ \fi}
+
+\newtoks\t_btx_reference_inject
+
+% \def\btx_cite_reference_inject_indeed
+% {\btx_trace_list_cross\currentbtxbacklink\empty
+% \the\t_btx_reference_inject
+% \normalexpanded{\writedatatolist % can be done faster .. just merge code here (not much) / also type btx
+% [\s!btx]%
+% [\ifx\currentbtxdataset\v!default\else\s!btxset=\currentbtxdataset,\fi%
+% \s!btxref=\currentbtxtag,%
+% \ifx\currentbtxbefore\empty\else\s!btxbtx=\!!bs\currentbtxbefore\!!es,\fi%
+% \ifx\currentbtxafter \empty\else\s!btxatx=\!!bs\currentbtxafter \!!es,\fi%
+% \s!btxint=\number\currentbtxbacklink
+% \ifx\currentbtxciteuservariables\empty\else,\currentbtxciteuservariables\fi]}}
+
+\def\btx_cite_reference_inject_indeed
+ {\btx_trace_list_cross\currentbtxbacklink\empty
+ \the\t_btx_reference_inject
+ \strc_lists_inject_direct % todo: make like \btx_list_reference_inject_now with { }
+ [\s!btx]%
+ [\c!type=\s!btx]% \c!location=\v!none
+ [\ifx\currentbtxdataset\v!default\else\s!btxset=\currentbtxdataset,\fi%
+ \s!btxref=\currentbtxtag,%
+ \ifx\currentbtxbefore\empty\else\s!btxbtx=\!!bs\currentbtxbefore\!!es,\fi%
+ \ifx\currentbtxafter \empty\else\s!btxatx=\!!bs\currentbtxafter \!!es,\fi%
+ \s!btxint=\number\currentbtxbacklink
+ \ifx\currentbtxciteuservariables\empty\else,\currentbtxciteuservariables\fi]}
+
+\def\currentbtxuservariable #1{\clf_btxuservariable {\currentbtxdataset}{#1}}
+\def\btxdoifelseuservariable#1{\clf_btxdoifelseuservariable{\currentbtxdataset}{#1}}
+
+\let\btxdoifuservariableelse\btxdoifelseuservariable
+
\let\btxcitereference\btx_cite_reference_inject
-\setuvalue{\??btxnumbering\v!short }{\btxlistvariant{short}} % these will be setups
-\setuvalue{\??btxnumbering\v!bib }{\btxlistvariant{num}} % these will be setups
-\setuvalue{\??btxnumbering\s!unknown}{\btxlistvariant{num}} % these will be setups
-\setuvalue{\??btxnumbering\v!yes }{\btxlistvariant{num}} % these will be setups
+\let\currentbtxnumbering\empty
\appendtoks
- \edef\p_btx_numbering{\btxrenderingparameter\c!numbering}%
- \letlistparameter\c!numbercommand\firstofoneargument % for the moment, no doubling needed
- \ifx\p_btx_numbering\v!no
- \letlistparameter\c!textcommand\outdented % needed? we can use titlealign
- \letlistparameter\c!symbol \v!none
- \letlistparameter\c!aligntitle \v!yes
- \let\btx_list_reference_inject_indeed\relax
- \else
- \ifcsname\??btxnumbering\p_btx_numbering\endcsname \else
- \let\p_btx_numbering\s!unknown
- \fi
- \letlistparameter\c!headnumber\v!always
- \expandafter\let\expandafter\btx_list_reference_inject_indeed\csname\??btxnumbering\p_btx_numbering\endcsname
- \fi
+ \edef\currentbtxnumbering{\btxrenderingparameter\c!numbering}%
+ \edef\p_numbering{\btxrenderingparameter\c!numbering}% link to headnumber
+ \ifx\p_numbering\v!no
+ \letlistparameter\c!headnumber\v!no
+ \let\currentbtxnumbering\empty
+ % \letlistparameter\c!textcommand\outdented % needed? we can use titlealign
+ \letlistparameter\c!symbol \v!none
+ \letlistparameter\c!aligntitle \v!yes
+ \letlistparameter\c!numbercommand\firstofoneargument % for the moment, no doubling needed
+ \else
+ \letlistparameter\c!headnumber\v!always
+ \fi
+ \let\currentlistmethod\s!btx
\to \everysetupbtxlistplacement
% \appendtoks
@@ -569,135 +981,139 @@
% \to \everysetupbtxlistplacement
\unexpanded\def\btxflushauthor
- {\doifnextoptionalcselse\btx_flush_author_yes\btx_flush_author_nop}
+ {\doifelsenextoptionalcs\btx_flush_author_yes\btx_flush_author_nop}
\def\btx_flush_author_yes[#1]{\btx_flush_author{#1}}
-\def\btx_flush_author_nop {\btx_flush_author{\btxlistvariantparameter\c!author}}
+\def\btx_flush_author_nop {\btx_flush_author{\btxparameter\c!authorconversion}}
\unexpanded\def\btx_flush_author#1#2%
- {\edef\currentbtxfield{#2}%
- \let\currentbtxlistvariant\currentbtxfield
- \ctxcommand{btxauthor("\currentbtxdataset","\currentbtxtag","\currentbtxfield",{
- combiner = "#1",
- etallimit = \number\btxlistvariantparameter\c!etallimit,
- etaldisplay = \number\btxlistvariantparameter\c!etaldisplay,
- })}}
+ {\begingroup
+ \edef\currentbtxfield{#2}%
+ \setbtxparameterset\s!list\currentbtxfield
+ %let\currentbtxlistvariant\currentbtxfield
+ \clf_btxauthor
+ {\currentbtxdataset}%
+ {\currentbtxtag}%
+ {\currentbtxfield}%
+ {%
+ combiner {#1}%
+ kind {list}%
+ etallimit {\btxparameter\c!etallimit}%
+ etaldisplay {\btxparameter\c!etaldisplay}%
+ symbol {\btxparameter{\c!stopper:initials}}%
+ }%
+ \relax
+ \endgroup}
+
+% yes or no: maybe just \flushauthor{...}{...}
+\unexpanded\def\btxflushauthorname {\btx_flush_author{name}} % #1
\unexpanded\def\btxflushauthornormal {\btx_flush_author{normal}} % #1
\unexpanded\def\btxflushauthornormalshort {\btx_flush_author{normalshort}} % #1
\unexpanded\def\btxflushauthorinverted {\btx_flush_author{inverted}} % #1
\unexpanded\def\btxflushauthorinvertedshort{\btx_flush_author{invertedshort}} % #1
\unexpanded\def\currentbtxciteauthor % always author
- {\ctxcommand{btxauthor("\currentbtxdataset","\currentbtxtag","author",{
- combiner = "\btxcitevariantparameter\c!author",
- etallimit = \number\btxcitevariantparameter\c!etallimit,
- etaldisplay = \number\btxcitevariantparameter\c!etaldisplay,
- })}}
+ {\begingroup
+ \setbtxparameterset\s!cite\s!author
+ \clf_btxauthor
+ {\currentbtxdataset}%
+ {\currentbtxtag}%
+ {\s!author}%
+ {%
+ combiner {\btxparameter\c!authorconversion}%
+ kind {cite}%
+ etallimit {\btxparameter\c!etallimit}%
+ etaldisplay {\btxparameter\c!etaldisplay}%
+ symbol {\btxparameter{\c!stopper:initials}}%
+ }%
+ \relax
+ \endgroup}
+
+\unexpanded\def\btxstartauthor#1#2#3% a state > 0 signals that some authors can clash
+ {\begingroup
+ \currentbtxauthorindex#1\relax
+ \currentbtxauthorcount#2\relax
+ \currentbtxauthorstate#3\relax}
+
+\unexpanded\def\btxstopauthor
+ {\endgroup}
+
+\unexpanded\def\btxciteauthorsetup#1{\fastsetup{\s!btx:\s!cite:\s!author:#1}}
+\unexpanded\def\btxlistauthorsetup#1{\fastsetup{\s!btx:\s!list:\s!author:#1}}
% \btxflushauthor{author}
-% \btxflushauthor{artauthor}
% \btxflushauthor{editor}
%
+% \btxflushauthor[name]{author}
% \btxflushauthor[normal]{author}
% \btxflushauthor[normalshort]{author}
% \btxflushauthor[inverted]{author}
% \btxflushauthor[invertedshort]{author}
-% Interaction: only list
+% \btxflushauthor{author}
+% \btxflushauthor{editor}
+%
+% \btxflushauthor[name]{author}
+% \btxflushauthor[normal]{author}
+% \btxflushauthor[normalshort]{author}
+% \btxflushauthor[inverted]{author}
+% \btxflushauthor[invertedshort]{author}
+
+% Interaction
\newconditional\btxinteractive
+\newconditional\btx_interactive
-\unexpanded\def\btxdoifelseinteraction{\secondoftwoarguments}
+% of maybe modes?
\appendtoks
\iflocation
- \edef\p_interaction{\btxlistvariantparameter\c!interaction}%
+ \edef\p_interaction{\btxparameter\c!interaction}%
\ifx\p_interaction\v!stop
- \let\btxdoifelseinteraction\secondoftwoarguments
\setfalse\btxinteractive
\else
- \let\btxdoifelseinteraction\firstoftwoarguments
\settrue\btxinteractive
+ \ifx\p_interaction\v!all
+ \settrue\btx_interactive
+ \else
+ \setfalse\btx_interactive
+ \fi
\fi
\else
- \let\btxdoifelseinteraction\secondoftwoarguments
\setfalse\btxinteractive
+ \setfalse\btx_interactive
\fi
\to \everysetupbtxlistplacement
\appendtoks
\iflocation
- \edef\p_interaction{\btxcitevariantparameter\c!interaction}%
+ \edef\p_interaction{\btxparameter\c!interaction}%
\ifx\p_interaction\v!stop
- \let\btxdoifelseinteraction\secondoftwoarguments
\setfalse\btxinteractive
\else
- \let\btxdoifelseinteraction\firstoftwoarguments
\settrue\btxinteractive
\fi
\else
- \let\btxdoifelseinteraction\secondoftwoarguments
\setfalse\btxinteractive
\fi
\to \everysetupbtxciteplacement
-% bib -> btx
+% till here
-\unexpanded\def\btxgotolink#1[#2]{\doifreferencefoundelse{\bibrefprefix#2}{\goto{#1}[\bibrefprefix#2]}{#1}}
-\unexpanded\def\btxatlink [#1]{\doifreferencefoundelse{\bibrefprefix#1}{\at [\bibrefprefix#1]}{#1}}
-\unexpanded\def\btxinlink [#1]{\doifreferencefoundelse{\bibrefprefix#1}{\expanded{\goto{\currentreferencetext}}[\bibrefprefix#1]}{#1}}
-
-\unexpanded\def\btxdirectlink#1#2{\goto{#2 {\tttf[#1]}}[#1]}
-\unexpanded\def\btxdirectlink#1#2{\goto{#2}[#1]}
-
-\let\gotobiblink\btxgotolink
-\let\atbiblink \btxatlink
-\let\inbiblink \btxinlink
-
-\unexpanded\def\btxnumberedreference[#1]% \bibtexnumref (replaced by \cite[num])
- {\dontleavehmode
- \begingroup
- \btxcitevariantparameter\v!left
- \penalty\plustenthousand % todo
- \ctxcommand{btxresolvelistreference("\currentbtxdataset","#1")}% todo: split dataset from #1, so another call
- \btxcitevariantparameter\v!right
- \endgroup}
-
-\appendtoks
- % for old times sake, for a while at least
- \let\maybeyear\gobbleoneargument
- \let\noopsort \gobbleoneargument
-\to \everysetupbtxlistplacement
-
-\appendtoks
- % for old times sake, for a while at least
- \let\maybeyear\gobbleoneargument
- \let\noopsort \gobbleoneargument
-\to \everysetupbtxciteplacement
-
-\appendtoks
- \doifnot{\btxrenderingparameter\c!continue}\v!yes
- {\global\btxlistcounter\zerocount}%
-\to \everysetupbtxlistplacement
+% \unexpanded\def\btxnumberedreference[#1]% \bibtexnumref (replaced by \cite[num])
+% {\dontleavehmode
+% \begingroup
+% \btxparameter\v!left
+% \penalty\plustenthousand % todo
+% \clf_btxresolvelistreference{\currentbtxdataset}{#1}% todo: split dataset from #1, so another call
+% \btxparameter\v!right
+% \endgroup}
%D When a publication is cited, we need to signal that somehow. This is done with the
%D following (not user) command. We could tag without injecting a node but this way
%D we also store the location, which makes it possible to ask local lists.
-\newconditional\c_publ_cite_write
-
-\unexpanded\def\btxdomarkcitation % called from lua end
- {\iftrialtypesetting
- \expandafter\gobbletwoarguments
- \else
- \expandafter\publ_cite_mark_citation
- \fi}
-
-\def\publ_cite_mark_citation#1#2% called from lua end
- {\dontleavehmode
- \writedatatolist[btx][btxset=#1,btxref=#2]} % \c!location=\v!here
-
%D \macros{cite,nocite,citation,nocitation,usecitation}
%D
%D The inline \type {\cite} command creates a (often) short reference to a publication
@@ -716,98 +1132,120 @@
% [base::tags]
% [settings|variant][base::tags]
-\unexpanded\def\btxcite
+% these need to be sort of protected:
+
+\let\p_publ_cite_before \empty
+\let\p_publ_cite_after \empty
+\let\p_publ_cite_lefttext \empty
+\let\p_publ_cite_righttext\empty
+
+\let\currentbtxciteuservariables\empty
+
+\unexpanded\def\btxhybridcite % so one can alias the old
{\dontleavehmode
\begingroup
- \strictdoifnextoptionalelse\publ_cite_tags_options\publ_cite_tags_indeed}
+ \strictdoifelsenextoptional\publ_cite_tags_options\publ_cite_tags_indeed}
+
+\unexpanded\def\publ_cite_tags_options[#1]%
+ {\strictdoifelsenextoptional{\publ_cite_tags_options_indeed{#1}}{\publ_cite_tags_indeed{#1}}}
\unexpanded\def\publ_cite_tags_indeed#1%
{\letinteractionparameter\c!style\empty
- \edef\currentbtxcitevariant{\btxcitevariantparameter\c!alternative}%
+ \setbtxparametersetroot\s!cite % we need to get the default
+ \edef\currentbtxcitealternative{\btxparameter\c!alternative}%
+ \setbtxparameterset\s!cite\currentbtxcitealternative
\edef\currentbtxcitetag{#1}%
\the\everysetupbtxciteplacement
\publ_cite_variant
\endgroup}
-\let\publ_citation_tags_indeed\publ_cite_tags_indeed
+\unexpanded\def\publ_cite_tags_options_indeed#1%
+ {\doifelseassignment{#1}\publ_cite_tags_settings_indeed\publ_cite_tags_variants_indeed{#1}}
-\unexpanded\def\publ_cite_tags_options[#1]%
- {\strictdoifnextoptionalelse{\publ_cite_tags_options_indeed{#1}}{\publ_cite_tags_indeed{#1}}}
-
-\unexpanded\def\publ_cite_tags_options_indeed#1[#2]%
- {\edef\currentbtxcitetag{#2}%
- \doifassignmentelse{#1}\publ_cite_tags_settings_indeed\publ_cite_tags_variants_indeed{#1}}
-
-\def\publ_cite_tags_settings_indeed#1%
+\def\publ_cite_tags_settings_indeed#1[#2]%
{\letinteractionparameter\c!style\empty
%\letinteractionparameter\c!color\empty
+ \letdummyparameter\c!reference \empty
+ \letdummyparameter\c!alternative\empty
\letdummyparameter\c!before \empty
\letdummyparameter\c!after \empty
- \letdummyparameter\c!extras \empty
- \letdummyparameter\c!alternative\empty
+ \letdummyparameter\c!lefttext \empty
+ \letdummyparameter\c!righttext \empty
\getdummyparameters[#1]%
+ \edef\p_reference{\dummyparameter\c!reference}%
+ \ifx\p_reference\empty
+ \edef\currentbtxcitetag{#2}%
+ \else
+ \let\currentbtxcitetag\p_reference
+ \edef\currentbtxciteuservariables{#2}%
+ \fi
\edef\p_alternative{\dummyparameter\c!alternative}%
\ifx\p_alternative\empty
- \edef\currentbtxcitevariant{\btxcitevariantparameter\c!alternative}%
+ \setbtxparametersetroot\s!cite
+ \edef\currentbtxcitealternative{\btxparameter\c!alternative}%
\else
- \let\currentbtxcitevariant\p_alternative
+ \let\currentbtxcitealternative\p_alternative
\fi
- \setupcurrentbtxcitevariant[#1]%
- \edef\p_extras{\dummyparameter\c!extras}%
- \ifx\p_extras\empty \else
- \edef\p_right{\btxcitevariantparameter\c!right}%
- \ifx\p_right\empty \else
- \setexpandedbtxcitevariantparameter\p_right{\p_extras\p_right}%
- \fi
- \fi
- \edef\p_before{\dummyparameter\c!before}%
- \edef\p_after {\dummyparameter\c!after}%
+ \setbtxparameterset\s!cite\currentbtxcitealternative
+ \setupcurrentbtx[#1]%
+ %
+ \edef\p_publ_cite_before {\dummyparameter\c!before}%
+ \edef\p_publ_cite_after {\dummyparameter\c!after}%
+ \edef\p_publ_cite_lefttext {\dummyparameter\c!lefttext}%
+ \edef\p_publ_cite_righttext{\dummyparameter\c!righttext}%
+ %
\the\everysetupbtxciteplacement
- \ifx\p_before\empty \else
- \p_before
- \space
- \fi
\publ_cite_variant
- \ifx\p_after\empty \else
- \optionalspace
- \p_after
- \fi
\endgroup}
-\def\publ_cite_tags_variants_indeed#1%
+\def\publ_cite_tags_variants_indeed#1[#2]%
{\letinteractionparameter\c!style\empty
- \edef\currentbtxcitevariant{#1}%
+ \edef\currentbtxcitealternative{#1}%
+ \edef\currentbtxcitetag{#2}%
+ \setbtxparameterset\s!cite\currentbtxcitealternative
\the\everysetupbtxciteplacement
\publ_cite_variant
\endgroup}
\newconditional\btxcitecompress
+\let\currentbtxreference\empty
+
\def\publ_cite_variant
{\begingroup
- \settrue\c_publ_cite_write
\publ_cite_handle_variant_indeed[\currentbtxcitetag]}
\unexpanded\def\publ_cite_handle_variant#1%
{\begingroup
- \edef\currentbtxcitevariant{#1}%
+ \edef\currentbtxcitealternative{#1}%
+ \setbtxparameterset\s!cite\currentbtxcitealternative
\the\everysetupbtxciteplacement
\dosingleargument\publ_cite_handle_variant_indeed}
+\unexpanded\def\publ_cite_handle_variant_blob
+ {%\btxparameter\v!left\relax
+ \clf_btxhandlecite
+ dataset {\currentbtxdataset}%
+ reference {\currentbtxreference}%
+ markentry \iftrialtypesetting\s!false\else\s!true\fi\space
+ variant {\currentbtxcitealternative}%
+ sorttype {\btxparameter\c!sorttype}%
+ compress {\btxparameter\c!compress}%
+ author {\btxparameter\c!author}%
+ lefttext {\p_publ_cite_lefttext}%
+ righttext {\p_publ_cite_righttext}%
+ before {\p_publ_cite_before}%
+ after {\p_publ_cite_after}%
+ \relax
+ \clf_btxflushmarked % maybe: \iftrialtypesetting\else ... \fi
+ }%\btxparameter\v!right\relax}
+
\def\publ_cite_handle_variant_indeed[#1]%
- {\usebtxcitevariantstyleandcolor\c!style\c!color
- \letbtxcitevariantparameter\c!alternative\currentbtxcitevariant
- \btxcitevariantparameter\v!left
- \ctxcommand{btxhandlecite{%
- dataset = "\currentbtxdataset",%
- reference = "#1",%
- markentry = \iftrialtypesetting false\else true\fi,%
- variant = "\currentbtxcitevariant",%
- sorttype = "\btxcitevariantparameter\c!sorttype",%
- compress = "\btxcitevariantparameter\c!compress",%
- author = "\btxcitevariantparameter\c!author",%
- }}%
- \btxcitevariantparameter\v!right
+ {\letbtxparameter\c!alternative\currentbtxcitealternative
+ \edef\currentbtxreference{#1}%
+ \usebtxstyleandcolor\c!style\c!color
+ \uselanguageparameter\btxdatasetparameter % new
+ \btxparameter\c!command{\publ_cite_handle_variant_blob}%
\endgroup}
\unexpanded\def\btxcitation
@@ -822,281 +1260,460 @@
\publ_cite_tags_indeed{#1}%
\fi}
-\unexpanded\def\btxnocite
+\unexpanded\def\btxnocitation
{\dosingleempty\publ_cite_no}
\unexpanded\def\publ_cite_no[#1]%
{\iftrialtypesetting \else
- \ctxcommand{btxhandlecite{%
- dataset = "\currentbtxdataset",%
- reference = "#1",%
- markentry = \iftrialtypesetting false\else true\fi,%
- }}%
+ \begingroup
+ \edef\currentbtxreference{#1}%
+ \clf_btxhandlenocite
+ dataset {\currentbtxdataset}%
+ reference {\currentbtxreference}%
+ markentry true%
+ \relax
+ % \clf_btxflushmarked
+ \endgroup
\fi}
\unexpanded\def\btxmissing#1%
- {{\tttf<#1>}}
+ {\dontleavehmode{\tttf<#1>}}
%D Compatibility:
-\let\cite \btxcite
+\let\cite \btxcitation
\let\citation \btxcitation
-\let\nocite \btxnocite
-\let\nocitation \btxnocite
-\let\usepublication\btxnocite
+\let\nocite \btxnocitation
+\let\nocitation \btxnocitation
+%let\usepublication\btxnocitation
+
+%D Setup helpers, beware, we need to wrap this .. now we need to know
+%D how setups are implemented.
+
+\setvalue{\??setup:\s!btx:\s!unknown}#1{\inframed{\tttf#1}}
+
+\def\fastbtxsetup_yes#1#2%
+ {\csname\??setup:\s!btx:%
+ \ifcsname\??setup:\s!btx:\currentbtxspecification:#1:#2\endcsname
+ \currentbtxspecification:#1:#2%
+ \else\ifcsname\??setup:\s!btx:\currentbtxspecificationfallback:#1:#2\endcsname
+ \currentbtxspecificationfallback:#1:#2%
+ \else\ifcsname\??setup:\s!btx:#1:#2\endcsname
+ #1:#2%
+ \else\ifcsname\??setup:\s!btx:\currentbtxspecification:#1:\s!unknown\endcsname
+ \currentbtxspecification:#1:\s!unknown
+ \else\ifcsname\??setup:\s!btx:\currentbtxspecificationfallback:#1:\s!unknown\endcsname
+ \currentbtxspecificationfallback:#1:\s!unknown
+ \else
+ #1:\s!unknown
+ \fi\fi\fi\fi\fi
+ \endcsname{#2}}
+
+\def\fastbtxsetup_nop#1#2%
+ {\csname\??setup:\s!btx:%
+ \ifcsname\??setup:\s!btx:\currentbtxspecification:#1:#2\endcsname
+ \currentbtxspecification:#1:#2%
+ \else\ifcsname\??setup:\s!btx:#1:#2\endcsname
+ #1:#2%
+ \else\ifcsname\??setup:\s!btx:\currentbtxspecification:#1:\s!unknown\endcsname
+ \currentbtxspecification:#1:\s!unknown
+ \else
+ #1:\s!unknown
+ \fi\fi\fi
+ \endcsname{#2}}
+
+\def\fastbtxsetup
+ {\ifx\currentbtxspecificationfallback\empty
+ \expandafter\fastbtxsetup_nop
+ \else
+ \expandafter\fastbtxsetup_yes
+ \fi}
-%D Cite helpers:
+\let\publ_fastbtxsetup_normal\fastbtxsetup
+
+\newconstant\btxsetuptype
+
+% 0 = unknown darkred
+% 1 = cite darkblue
+% 2 = subcite darkgreen
+% 3 = list darkcyan
+% 4 = page darkmagenta
+% 5 = unknown darkred
+
+\unexpanded\def\publ_fastbtxsetup_chain_inbetween
+ {\allowbreak->\allowbreak}
+
+\unexpanded\def\publ_fastbtxsetup_chain_yes#1#2%
+ {\dontleavehmode\begingroup
+ \infofont
+ \ifcase\btxsetuptype\darkred\or\darkblue\or\darkgreen\or\darkcyan\or\darkmagenta\else\darkred\fi
+ [%
+ \currentbtxspecification :#1:#2\ifcsname\??setup:\s!btx:\currentbtxspecification :#1:#2\endcsname\else
+ \publ_fastbtxsetup_chain_inbetween
+ \currentbtxspecificationfallback:#1:#2\ifcsname\??setup:\s!btx:\currentbtxspecificationfallback :#1:#2\endcsname\else
+ \publ_fastbtxsetup_chain_inbetween
+ #1:#2\ifcsname\??setup:\s!btx :#1:#2\endcsname\else
+ \publ_fastbtxsetup_chain_inbetween
+ \currentbtxspecification :#1:\s!unknown\ifcsname\??setup:\s!btx:\currentbtxspecification :#1:\s!unknown\endcsname\else
+ \publ_fastbtxsetup_chain_inbetween
+ \currentbtxspecificationfallback:#1:\s!unknown\ifcsname\??setup:\s!btx:\currentbtxspecificationfallback:#1:\s!unknown\endcsname\else
+ \publ_fastbtxsetup_chain_inbetween
+ unset\fi\fi\fi\fi\fi
+ ]%
+ \endgroup}
-\newconstant\currentbtxconcat
+\unexpanded\def\publ_fastbtxsetup_chain_nop#1#2%
+ {\dontleavehmode\begingroup
+ \infofont
+ \darkred
+ [%
+ \currentbtxspecification :#1:#2\ifcsname\??setup:\s!btx:\currentbtxspecification :#1:#2\endcsname\else
+ \publ_fastbtxsetup_chain_inbetween
+ #1:#2\ifcsname\??setup:\s!btx :#1:#2\endcsname\else
+ \publ_fastbtxsetup_chain_inbetween
+ \currentbtxspecification :#1:\s!unknown\ifcsname\??setup:\s!btx:\currentbtxspecification :#1:\s!unknown\endcsname\else
+ \publ_fastbtxsetup_chain_inbetween
+ unset\fi\fi\fi
+ ]%
+ \endgroup}
-\unexpanded\def\btxcitereset
- {\let\currentbtxfirst \empty
- \let\currentbtxsecond \empty
- \let\currentbtxinternal\empty
- \let\currentbtxtag \empty
- \setconstant\currentbtxconcat\zerocount}
+\unexpanded\def\publ_fastbtxsetup_chain
+ {\ifx\currentbtxspecificationfallback\empty
+ \expandafter\publ_fastbtxsetup_chain_nop
+ \else
+ \expandafter\publ_fastbtxsetup_chain_yes
+ \fi}
-\btxcitereset
+\unexpanded\def\publ_fastbtxsetup_visual#1#2%
+ {\publ_fastbtxsetup_chain{#1}{#2}%
+ \publ_fastbtxsetup_normal{#1}{#2}}
-\unexpanded\def\btxcitesetup#1%
- {\directsetup{btx:cite:#1}%
- \btxcitereset}
+\installtextracker
+ {publications.setups}
+ {\let\fastbtxsetup\publ_fastbtxsetup_visual}
+ {\let\fastbtxsetup\publ_fastbtxsetup_normal}
-\unexpanded\def\btxsetfirst {\def\currentbtxfirst}
-\unexpanded\def\btxsetsecond {\def\currentbtxsecond}
-\unexpanded\def\btxsettag {\def\currentbtxtag}
-\unexpanded\def\btxsetinternal{\def\currentbtxinternal}
-\unexpanded\def\btxsetconcat#1{\setconstant\currentbtxconcat#1\relax}
+%D Cite helpers:
-\unexpanded\def\btxsetlistreference#1#2% #3#4%
- {\strc_references_direct_full_user{btxset="#1",btxref="#2"}}
+\newtoks\everybtxciteentry
-\unexpanded\def\btxsetcitereference#1#2%
- {\ifx\currentbtxinternal\empty \else
- \strc_references_direct_full_user{btxint=#2}{#1}\empty
- \fi}
+\prependtoks
+ \setfalse\c_btx_cite_reference_injected
+\to \everybtxciteentry
-\unexpanded\def\btxstartsubcite#1%
- {\bgroup
- \btxcitereset
- \def\currentbtxcitevariant{#1}%
- \btxcitevariantparameter\c!left}
+\unexpanded\def\btxcitesetup#1%
+ {\the\everybtxciteentry
+ \btxsetuptype\plusone
+ \everybtxciteentry\emptytoks % tricky maybe not when subcites
+ \fastbtxsetup\s!cite{#1}} % no \btxcitereset as we loose dataset and such
-\unexpanded\def\btxstopsubcite
- {\btxcitevariantparameter\c!right
- \egroup}
+\unexpanded\def\btxsubcitesetup#1%
+ {\the\everybtxciteentry
+ \btxsetuptype\plustwo
+ \everybtxciteentry\emptytoks % tricky maybe not when subcites
+ \fastbtxsetup\s!cite{#1}} % no \btxcitereset as we loose dataset and such
-%D List helpers:
+\appendtoks
+ \btx_check_language
+\to \everybtxciteentry
-\def\currentbtxindex{0}
+\unexpanded\def\btxstartsubcite#1%
+ {\begingroup
+ \btxcitereset % todo: limited set
+ \def\currentbtxcitealternative{#1}%
+ \setbtxparameterset\s!cite\currentbtxcitealternative
+ \usebtxstyleandcolor\c!style\c!color
+ % \btxparameter\c!left
+ \relax}
+
+\unexpanded\def\btxstopsubcite
+ {%\relax
+ % \btxparameter\c!right
+ \endgroup}
-\unexpanded\def\btxlistvariant#1% was \currentbtxindex
+\unexpanded\def\btxstartciterendering[#1]%
{\begingroup
- \edef\currentbtxlistvariant{#1}%
- \btxlistvariantparameter\c!left
- \ctxcommand{btxlistvariant("\currentbtxdataset","\currentbtxblock","\currentbtxtag","#1","\number\btxlistcounter")}% some can go
- \btxlistvariantparameter\c!right
+ \edef\currentbtxcitealternative{#1}%
+ \setbtxparameterset\s!cite\currentbtxcitealternative
+ \usebtxstyleandcolor\c!style\c!color
+ % \btxparameter\c!left
+ }%\relax}
+
+\unexpanded\def\btxstopciterendering
+ {\relax
+ % \btxparameter\c!right
\endgroup}
+\let\btxstartcite \begingroup
+\let\btxstopcite \endgroup
+\let\btxstartciteauthor\begingroup
+\let\btxstopciteauthor \endgroup
+
%D Whatever helpers:
-\unexpanded\def\btxsingularplural#1%
- {\ctxcommand{btxsingularorplural("\currentbtxdataset","\currentbtxtag","#1")}}
+\unexpanded\def\btxsingularplural#1{\clf_btxsingularorplural{\currentbtxdataset}{\currentbtxtag}{#1}}
+\unexpanded\def\btxoneorrange #1{\clf_btxoneorrange {\currentbtxdataset}{\currentbtxtag}{#1}}
+\unexpanded\def\btxfirstofrange #1{\clf_btxfirstofrange {\currentbtxdataset}{\currentbtxtag}{#1}}
\let\btxsingularorplural\btxsingularplural
-%D Loading variants:
+\stopcontextdefinitioncode
+
+%D Journals
+
+\unexpanded\def\btxloadjournallist [#1]{\clf_btxloadjournallist{#1}}
+\unexpanded\def\btxsavejournallist [#1]{\clf_btxsavejournallist{#1}}
+\unexpanded\def\btxaddjournal [#1][#2]{\clf_btxaddjournal{#1}{#2}}
+ \def\btxexpandedjournal #1{\clf_btxexpandedjournal{#1}} % \unexpanded ?
+ \def\btxabbreviatedjournal#1{\clf_btxabbreviatedjournal{#1}} % \unexpanded ?
+
+% \installcorenamespace{btxjournal}
+%
+% \letvalue{\s!btxjournal\v!long }\btxexpandedjournal
+% \letvalue{\s!btxjournal\v!short }\btxabbreviatedjournal
+% \letvalue{\s!btxjournal\v!normal}\firstofoneargument
+%
+% \unexpanded\def\btxcheckedjournal
+% {\expandnamespaceparameter\s!btxjournal\btxrenderingparameter\c!journalconversion}
+
+% \btxloadjournallist[list.txt] % Foo Journal of Bars = FBJ \n ....
+%
+% \btxexpandedjournal[fbj]
+% \btxabbreviatedjournal[foo journal of bars]
+
+%D Saving data:
+
+\unexpanded\def\savebtxdataset
+ {\dotripleargument\publ_save_dataset}
+
+\unexpanded\def\publ_save_dataset[#1][#2][#3]%
+ {\ifthirdargument
+ \publ_save_dataset_indeed[#1][#2][#3]%
+ \else\ifsecondargument
+ \doifelseassignment{#2}%
+ {\publ_save_dataset_indeed[\s!default][#1][#2]}%
+ {\publ_save_dataset_indeed[#1][#2][]}%
+ \else\iffirstargument
+ \doifelseassignment{#1}%
+ {\publ_save_dataset_indeed[\s!default][\jobname-saved.bib][#1]}%
+ {\publ_save_dataset_indeed[\s!default][#1][]}%
+ % \else
+ % % bad news
+ \fi\fi\fi}
+
+\unexpanded\def\publ_save_dataset_indeed[#1][#2][#3]%
+ {\begingroup
+ \getdummyparameters
+ [\c!criterium=\v!all,%
+ \c!type=,%
+ \c!dataset=#1,%
+ \c!file=#2,%
+ #3]% % all or used
+ \clf_btxsavedataset
+ dataset {\dummyparameter\c!dataset}%
+ filename {\dummyparameter\c!file}%
+ filetype {\dummyparameter\c!type}%
+ criterium {\dummyparameter\c!criterium}%
+ \relax
+ \endgroup}
+
+% \savebtxdataset[default][e:/tmp/foo.bib]
+% \savebtxdataset[default][e:/tmp/foo.lua]
+% \savebtxdataset[default][e:/tmp/foo.xml]
+
+%D In-text entries:
+
+\unexpanded\def\placecitation{\citation[entry]} % [#1]
+
+\unexpanded\def\btxhandleciteentry
+ {\dontleavehmode
+ \begingroup
+ \def\currentbtxcitealternative{entry}%
+ \setbtxparameterset\s!cite\currentbtxcitealternative % needs checking
+ \btxcitereference
+ \btx_entry_inject
+ \endgroup}
+
+%D Registers
+
+% \setupbtxregister
+% [\c!state=\v!start,
+% \c!dataset=\v!all,
+% \c!method=\v!always]
+
+\unexpanded\def\publ_registers_set
+ {\ifx\currentbtxregister\empty \else
+ \clf_btxsetregister
+ specification {\currentbtxspecification}%
+ name {\currentbtxregister}%
+ state {\btxregisterparameter\c!state}%
+ dataset {\btxregisterparameter\c!dataset}%
+ field {\btxregisterparameter\c!field}%
+ register {\btxregisterparameter\c!register}%
+ method {\btxregisterparameter\c!method}%
+ alternative {\btxregisterparameter\c!alternative}%
+ \relax
+ \fi}
\appendtoks
- \loadbtxdefinitionfile[\btxrenderingparameter\c!alternative]
-\to \everysetupbtxrendering
+ \publ_registers_set
+\to \everydefinebtxregister
-\stopcontextdefinitioncode
+\appendtoks
+ \publ_registers_set
+\to \everysetupbtxregister
+
+\appendtoks
+ \normalexpanded{%
+ \defineprocessor
+ [\s!btx:r:\currentbtxregister]%
+ [\c!style=\noexpand\namedbtxregisterparameter{\currentbtxregister}\noexpand\c!style,
+ \c!color=\noexpand\namedbtxregisterparameter{\currentbtxregister}\noexpand\c!color]}%
+\to \everydefinebtxregister
+
+\appendtoks
+ \clf_btxtoregister{\currentbtxdataset}{\currentbtxtag}%
+\to \t_btx_reference_inject
+
+\unexpanded\def\btxindexedauthor#1#2#3#4#5#6% alternative von last first junior
+ {\begingroup
+ \def\currentbtxcitealternative{#1}%
+ \ifx\currentbtxcitealternative\empty
+ \edef\currentbtxcitealternative{invertedshort}% maybe we need some default here too?
+ \fi
+ %let\currentbtxlistvariant\currentbtxcitealternative % we inherit
+ \the\everysetupbtxciteplacement
+ \def\currentbtxvons {#2}%
+ \def\currentbtxsurnames {#3}%
+ \def\currentbtxinitials {#4}%
+ \def\currentbtxfirstnames {#5}%
+ \def\currentbtxjuniors {#6}%
+ \setbtxparameterset\s!cite\currentbtxcitealternative
+ \fastsetup{\s!btx:\s!cite:\s!author:\currentbtxcitealternative}%
+ \endgroup}
+
+%D We hook some setters in the definition sets:
+
+% \installdefinitionsetmember \??btx {btxspecification} \??btxcitevariant {btxcitevariant}
+% \installdefinitionsetmember \??btx {btxspecification} \??btxlistvariant {btxlistvariant}
+% \installdefinitionsetmember \??btx {btxspecification} \??btxlist {btxlist}
+% \installdefinitionsetmember \??btx {btxspecification} \??btxrendering {btxrendering}
+% \installdefinitionsetmember \??btx {btxspecification} \??btx {btx}
+
+%D And more helpers ... a never ending story these publications:
+
+% \definebtx
+% [btx:apa:list:article:title]
+% [style=bolditalic,
+% command=\WORD]
+%
+% \btxstartstyle[btx:apa:list:article:title]
+% \btxusecommand[btx:apa:list:article:title]{foo}
+% \btxstopstyle
+
+\let\savedcurrentbtx\empty
+
+\unexpanded\def\btxstartstyle[#1]%
+ {\begingroup
+ \let\savedcurrentbtx\currentbtx
+ \def\currentbtx{#1}%
+ \usebtxstyle\c!style
+ \let\currentbtx\savedcurrentbtx}
+
+\unexpanded\def\btxstartcolor[#1]%
+ {\begingroup
+ \let\savedcurrentbtx\currentbtx
+ \def\currentbtx{#1}%
+ \usebtxcolor\c!color
+ \let\currentbtx\savedcurrentbtx}
+
+\unexpanded\def\btxstartstyleandcolor[#1]%
+ {\begingroup
+ \let\savedcurrentbtx\currentbtx
+ \def\currentbtx{#1}%
+ \usebtxstyleandcolor\c!style\c!color
+ \let\currentbtx\savedcurrentbtx}
+
+\let\btxstopstyle \endgroup
+\let\btxstopcolor \endgroup
+\let\btxstopstyleandcolor\endgroup
+
+\unexpanded\def\btxusecommand[#1]%
+ {\namedbtxparameter{#1}\c!command}
%D Defaults:
\setupbtxrendering
- [\c!dataset=\v!standard,
+ [\c!interaction=\v!start, % \v!all
+ \c!specification=\btxparameter\c!specification,
+ \c!dataset=\v!default,
+ \c!repeat=\v!no,
+ \c!continue=\v!no,
\c!method=\v!global,
- \c!setups=btx:rendering:\btxrenderingparameter\c!alternative,
- \c!alternative=apa,
- \c!sorttype=,
- \c!criterium=,
+ % \c!setups=btx:\btxrenderingparameter\c!alternative:initialize, % not the same usage as cite !
+ % \c!sorttype=authoryear,
+ \c!criterium=\v!text,
\c!refcommand=authoryears, % todo
\c!numbering=\v!yes,
-% \c!autohang=\v!no,
+ %\c!saveinlist=\v!no, % maybe for before/after
+ \c!textstate=\v!start,
\c!width=\v!auto,
- \c!separator={; },
+ %\c!pageright=,
+ %\c!pageleft=,
+ \c!separator={;\space},
\c!distance=1.5\emwidth]
-\definebtxrendering
- [\v!standard]
+% Quite some interpunction and labels are the same of at least consistent within
+% a standard when citations and list entries are involved. We assume that each
+% standard defines its own set but it can fall back on these defaults.
-\setupbtxcitevariant
+\setupbtx
[\c!interaction=\v!start,
- \c!setups=btx:cite:\btxcitevariantparameter\c!alternative,
- \c!alternative=num,
- \c!andtext={ and },
- \c!otherstext={ et al.},
- \c!pubsep={, },
- \c!lastpubsep={ and },
- \c!finalpubsep={ and },
+ \c!alternative=num, % default cite form
+ \c!inbetween=\space,
+ \c!range=\endash, % separator:range?
\c!compress=\v!no,
- \c!inbetween={ },
- \c!range=\endash,
- \c!left=,
- \c!middle=,
- \c!right=]
-
-\definebtxcitevariant
- [author]
- [%c!sorttype=,
- \c!left={(},
- \c!middle={, },
- \c!right={)}]
-
-\definebtxcitevariant
- [authornum]
- [author]
- [\c!inbetween={ }]
-
-\definebtxcitevariant
- [authoryear]
- [\c!compress=\v!yes,
- \c!inbetween={, },
- \c!left={(},
- \c!middle={, },
- \c!right={)}]
-
-\definebtxcitevariant
- [authoryears]
- [authoryear]
-
-\definebtxcitevariant
- [author:num]
- [authornum]
- [\c!left={[},
- \c!right={]}]
-
-\definebtxcitevariant
- [author:year]
- [authoryear]
- [\c!left={(},
- \c!right={)}]
-
-\definebtxcitevariant
- [author:years]
- [authoryears]
- [\c!left=,
- \c!right=]
-
-\definebtxcitevariant
- [year]
- [\c!left={(},
- \c!middle={, }, % is middle used?
- \c!right={)}]
-
-\definebtxcitevariant
- [tag]
- [\c!left={[},
- \c!middle={, },
- \c!right={]}]
-
-\definebtxcitevariant
- [key]
- [tag]
-
-\definebtxcitevariant
- [serial]
- [\c!left={[},
- \c!middle={, },
- \c!right={]}]
-
-\definebtxcitevariant
- [page]
- [\c!left={[},
- \c!middle={, },
- \c!right={]}]
-
-\definebtxcitevariant
- [short]
- [\c!left={[},
- \c!middle={, },
- \c!right={]}]
-
-\definebtxcitevariant
- [category]
- [\c!left={[},
- \c!middle={, },
- \c!right={]}]
-
-\definebtxcitevariant
- [type]
- [category]
-
-\definebtxcitevariant
- [doi]
- [\c!left={[},
- \c!middle={, },
- \c!right={]}]
-
-\definebtxcitevariant
- [url]
- [\c!left={[},
- \c!middle={, },
- \c!right={]}]
-
-\definebtxcitevariant
- [page]
- [\c!left=,
- \c!middle={, },
- \c!right=]
-
-\definebtxcitevariant
- [num]
- [\c!compress=\v!yes,
- \c!left={[},
- \c!middle={, },
- \c!right={]}]
-
-\setupbtxlistvariant
- [\c!namesep={, },
- \c!lastnamesep={ and },
- \c!finalnamesep={ and },
- \c!firstnamesep={ },
- \c!juniorsep={ },
- \c!vonsep={ },
- \c!surnamesep={, },
- \c!surnameinitialsep={, },
- \c!surnamefirstnamesep={, },
- \c!etallimit=5,
- \c!etaldisplay=5,
- \c!etaltext={ et al.},
- \c!monthconversion=\v!number,
- \c!authorconversion=\v!normal]
-
-\definebtxlistvariant
- [author]
- [author=invertedshort] % we could also do this in the apa style itself
-
-\definebtxlistvariant
- [editor]
- [author]
-
-\definebtxlistvariant
- [artauthor]
- [author]
-
-\setupbtxcitevariant
- [\c!author =\btxlistvariantparameter\c!author,
- \c!etallimit =\btxlistvariantparameter\c!etallimit,
- \c!etaldisplay =\btxlistvariantparameter\c!etaldisplay]
+ \c!etallimit=3,
+ \c!etaldisplay=\btxparameter\c!etallimit,
+ \c!otherstext={\space et al.},
+ \c!separator:firstnames={\space},
+ \c!separator:juniors={\space},
+ \c!separator:vons={\space},
+ \c!separator:initials={\space},
+ \c!stopper:initials={.},
+ %\c!surnamesep={,\space}, % is this used anywhere?
+ \c!separator:invertedinitials={,\space},
+ \c!separator:invertedfirstnames={,\space},
+ \c!separator:names:2={,\space}, % separates multiple names
+ \c!separator:names:3=\btxparameter{\c!separator:2}, % before last name in a list
+ \c!separator:names:4=\btxparameter{\c!separator:2}, % between only two names
+ \c!separator:2={;\space}, % aka pubsep - separates multiple objects
+ \c!separator:3=\btxparameter{separator:2}, % before last object in a list
+ \c!separator:4=\btxparameter{separator:2}] % between only two objects
% Do we want these in the format? Loading them delayed is somewhat messy.
-\loadbtxdefinitionfile[apa]
-\loadbtxdefinitionfile[cite]
\loadbtxdefinitionfile[commands]
\loadbtxdefinitionfile[definitions]
+\loadbtxdefinitionfile[cite]
+\loadbtxdefinitionfile[list]
+\loadbtxdefinitionfile[page]
+\loadbtxdefinitionfile[author]
+
+% we assume that the users sets up the right specification and if not ... well,
+% hope for the best that something shows up and consult the manual otherwise
+
+\unexpanded\def\usebtxdefinitions[#1]%
+ {\loadbtxdefinitionfile[#1]% % for hh
+ \setupbtx[\c!specification=#1]} % for ab
+
+\setupbtx
+ [\c!specification=\s!default,
+ \c!dataset=\v!default,
+ \c!default=\v!default]
+
+\loadbtxdefinitionfile
+ [\s!default]
+
\protect
diff --git a/Master/texmf-dist/tex/context/base/publ-jrn.lua b/Master/texmf-dist/tex/context/base/publ-jrn.lua
new file mode 100644
index 00000000000..2e040841798
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/publ-jrn.lua
@@ -0,0 +1,188 @@
+if not modules then modules = { } end modules ['publ-jrn'] = {
+ version = 1.001,
+ comment = "this module part of publication support",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- http://jabref.sourceforge.net/journals/journal_abbreviations_general.txt
+--
+-- <full name> = <abbreviation> [;shortest unique abbreviation[;frequency]].
+
+-- require("char-utf")
+
+-- Abhandlungen aus dem Westfälischen Museum für Naturkunde = Abh. Westfäl. Mus. Nat.kd.
+-- Abhandlungen der Naturforschenden Gesellschaft in Zürich = Abh. Nat.forsch. Ges. Zür.
+-- Abhandlungen des Naturwissenschaftlichen Vereins zu Bremen = Abh. Nat.wiss. Ver. Bremen
+
+local context = context
+local commands = commands
+
+local find = string.find
+local P, C, S, Cs, lpegmatch, lpegpatterns = lpeg.P, lpeg.C, lpeg.S, lpeg.Cs, lpeg.match, lpeg.patterns
+
+local report_journals = logs.reporter("publications","journals")
+
+local publications = publications
+local journals = { }
+publications.journals = journals
+
+local lowercase = characters.lower
+
+local expansions = { }
+local abbreviations = { }
+local nofexpansions = 0
+local nofabbreviations = 0
+
+local valid = 1 - S([[ ."':;,-]])
+local pattern = Cs((valid^1 + P(1)/"")^1)
+
+local function simplify(name)
+ -- we have utf but it doesn't matter much if we lower the bytes
+ return name and lowercase(lpegmatch(pattern,name)) or name
+end
+
+local function add(expansion,abbreviation)
+ if expansion and abbreviation then
+ local se = simplify(expansion)
+ local sa = simplify(abbreviation)
+ if not expansions[sa] then
+ expansions[sa] = expansion
+ nofexpansions = nofexpansions + 1
+ end
+ if not abbreviations[se] then
+ abbreviations[se] = abbreviation
+ nofabbreviations = nofabbreviations + 1
+ end
+ end
+end
+
+-- [#%-] comment
+-- meaning = abbreviations [;.....]
+
+local whitespace = lpegpatterns.whitespace^0
+local assignment = whitespace * P("=") * whitespace
+local separator = P(";")
+local newline = lpegpatterns.newline
+local endofline = lpegpatterns.space^0 * (newline + P(-1) + separator)
+local restofline = (1-newline)^0
+local splitter = whitespace * C((1-assignment)^1) * assignment * C((1-endofline)^1) * restofline
+local comment = S("#-%") * restofline
+local pattern = (comment + splitter / add)^0
+
+function journals.load(filename)
+ if not filename then
+ return
+ end-- error
+ if file.suffix(filename,"txt") then
+ local data = io.loaddata(filename)
+ if type(data) ~= "string" then
+ return
+ elseif find(data,"=") then
+ -- expansion = abbreviation
+ lpegmatch(pattern,data)
+ end
+ elseif file.suffix(filename,"lua") then
+ local data = table.load(filename)
+ if type(data) ~= "table" then
+ return
+ else
+ local de = data.expansions
+ local da = data.abbreviations
+ if de and da then
+ -- { expansions = { a = e }, abbreviations = { e = a } }
+ if next(expansions) then
+ table.merge(expansions,de)
+ else
+ expansions = de
+ end
+ if next(abbreviations) then
+ table.merge(abbreviations,da)
+ else
+ abbreviations = da
+ end
+ elseif #data > 0 then
+ -- { expansion, abbreviation }, ... }
+ for i=1,#data do
+ local d = d[i]
+ add(d[1],d[2])
+ end
+ else
+ -- { expansion = abbreviation, ... }
+ for expansion, abbreviation in data do
+ add(expansion,abbreviation)
+ end
+ end
+ end
+ end
+ report_journals("file %a loaded, %s expansions, %s abbreviations",filename,nofexpansions,nofabbreviations)
+end
+
+function journals.save(filename)
+ table.save(filename,{ expansions = expansions, abbreviations = abbreviations })
+end
+
+function journals.add(expansion,abbreviation)
+ add(expansion,abbreviation)
+end
+
+function journals.expanded(name)
+ local s = simplify(name)
+ return expansions[s] or expansions[simplify(abbreviations[s])] or name
+end
+
+function journals.abbreviated(name)
+ local s = simplify(name)
+ return abbreviations[s] or abbreviations[simplify(expansions[s])] or name
+end
+
+local implement = interfaces and interfaces.implement
+
+if implement then
+
+ implement {
+ name = "btxloadjournallist",
+ arguments = "string",
+ actions = journals.load
+ }
+
+ implement {
+ name = "btxsavejournallist",
+ arguments = "string",
+ actions = journals.save
+ }
+
+ implement {
+ name = "btxaddjournal",
+ arguments = { "string", "string" },
+ actions = { journals.add, context }
+ }
+
+ implement {
+ name = "btxexpandedjournal",
+ arguments = "string",
+ actions = { journals.expanded, context },
+ }
+
+ implement {
+ name = "btxabbreviatedjournal",
+ arguments = "string",
+ actions = { journals.abbreviated, context },
+ }
+
+end
+
+-- journals.load("e:/tmp/journals.txt")
+-- journals.save("e:/tmp/journals.lua")
+
+-- inspect(journals.expanded ("Z. Ökol. Nat.schutz"))
+-- inspect(journals.abbreviated("Z. Ökol. Nat. schutz"))
+
+if typesetters then
+ typesetters.manipulators.methods.expandedjournal = journals.expanded
+ typesetters.manipulators.methods.abbreviatedjournal = journals.abbreviated
+end
+
+-- journals.load("t:/manuals/publications-mkiv/journals.txt")
+-- journals.save("t:/manuals/publications-mkiv/journals.lua")
diff --git a/Master/texmf-dist/tex/context/base/publ-oth.lua b/Master/texmf-dist/tex/context/base/publ-oth.lua
index 14da19f9cb4..55c62c31eba 100644
--- a/Master/texmf-dist/tex/context/base/publ-oth.lua
+++ b/Master/texmf-dist/tex/context/base/publ-oth.lua
@@ -11,8 +11,10 @@ local lpegmatch = lpeg.match
local p_endofline = lpeg.patterns.newline
-local loaders = publications.loaders
-local getindex = publications.getindex
+local publications = publications
+
+local loaders = publications.loaders
+local getindex = publications.getindex
local function addfield(t,k,v,fields)
k = fields[k]
@@ -66,7 +68,10 @@ end
function loaders.endnote(dataset,filename)
-- we could combine the next into checkfield but let's not create too messy code
- loaders.lua(dataset,publications.endnotes_to_btx(io.loaddata(filename) or ""))
+ local dataset, fullname = publications.resolvedname(dataset,filename)
+ if fullname then
+ loaders.lua(dataset,publications.endnotes_to_btx(io.loaddata(fullname) or ""))
+ end
end
-- refman --
@@ -97,7 +102,10 @@ end
function loaders.refman(dataset,filename)
-- we could combine the next into checkfield but let's not create too messy code
- loaders.lua(dataset,publications.refman_to_btx(io.loaddata(filename) or ""))
+ local dataset, fullname = publications.resolvedname(dataset,filename)
+ if fullname then
+ loaders.lua(dataset,publications.refman_to_btx(io.loaddata(fullname) or ""))
+ end
end
-- test --
diff --git a/Master/texmf-dist/tex/context/base/publ-reg.lua b/Master/texmf-dist/tex/context/base/publ-reg.lua
new file mode 100644
index 00000000000..39469e510db
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/publ-reg.lua
@@ -0,0 +1,177 @@
+if not modules then modules = { } end modules ['publ-reg'] = {
+ version = 1.001,
+ comment = "this module part of publication support",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local formatters = string.formatters
+local concat = table.concat
+local sortedhash = table.sortedhash
+local lpegmatch = lpeg.match
+
+local context = context
+
+local implement = interfaces.implement
+local variables = interfaces.variables
+
+local v_once = variables.once
+local v_stop = variables.stop
+local v_all = variables.all
+
+local publications = publications
+local datasets = publications.datasets
+local specifications = publications.specifications
+local writers = publications.writers
+local getcasted = publications.getcasted
+
+local registrations = { }
+local sequence = { }
+local flushers = table.setmetatableindex(function(t,k) local v = t.default t[k] = v return v end)
+
+local function btxsetregister(specification)
+ local name = specification.name
+ local register = specification.register
+ local dataset = specification.dataset
+ local field = specification.field
+ if not field or field == "" or not register or register == "" then
+ return
+ end
+ if not dataset or dataset == "" then
+ dataset = v_all
+ end
+ -- could be metatable magic
+ local s = registrations[register]
+ if not s then
+ s = { }
+ registrations[register] = s
+ end
+ local processors = name ~= register and name or ""
+ if processor == "" then
+ processor = nil
+ elseif processor then
+ processor = "btx:r:" .. processor
+ end
+ local datasets = utilities.parsers.settings_to_array(dataset)
+ for i=1,#datasets do
+ local dataset = datasets[i]
+ local d = s[dataset]
+ if not d then
+ d = { }
+ s[dataset] = d
+ end
+ --
+ -- check all
+ --
+ d.active = specification.state ~= v_stop
+ d.once = specification.method == v_once or false
+ d.field = field
+ d.processor = processor
+ d.alternative = d.alternative or specification.alternative
+ d.register = register
+ d.dataset = dataset
+ d.done = d.done or { }
+ end
+ --
+ sequence = { }
+ for register, s in sortedhash(registrations) do
+ for dataset, d in sortedhash(s) do
+ if d.active then
+ sequence[#sequence+1] = d
+ end
+ end
+ end
+end
+
+local function btxtoregister(dataset,tag)
+ local current = datasets[dataset]
+ for i=1,#sequence do
+ local step = sequence[i]
+ local dset = step.dataset
+ if dset == v_all or dset == dataset then
+ local done = step.done
+ if not done[tag] then
+ local value, field, kind = getcasted(current,tag,step.field,specifications[step.specification])
+ if value then
+ flushers[kind](step,field,value)
+ end
+ done[tag] = true
+ end
+ end
+ end
+end
+
+implement {
+ name = "btxsetregister",
+ actions = btxsetregister,
+ arguments = {
+ {
+ { "specification" },
+ { "name" },
+ { "state" },
+ { "dataset" },
+ { "field" },
+ { "register" },
+ { "method" },
+ { "alternative" },
+ }
+ }
+}
+
+implement {
+ name = "btxtoregister",
+ actions = btxtoregister,
+ arguments = { "string", "string" }
+}
+
+-- context.setregisterentry (
+-- { register },
+-- {
+-- ["entries:1"] = value,
+-- ["keys:1"] = value,
+-- }
+-- )
+
+local ctx_dosetfastregisterentry = context.dosetfastregisterentry -- register entry key
+
+----- p_keywords = lpeg.tsplitat(lpeg.patterns.whitespace^0 * lpeg.P(";") * lpeg.patterns.whitespace^0)
+local components = publications.components.author
+local f_author = formatters[ [[\btxindexedauthor{%s}{%s}{%s}{%s}{%s}{%s}]] ]
+
+function flushers.string(step,field,value)
+ if type(value) == "string" and value ~= "" then
+ ctx_dosetfastregisterentry(step.register,value or "","",step.processor or "","")
+ end
+end
+
+flushers.default = flushers.string
+
+local shorts = {
+ normalshort = "normalshort",
+ invertedshort = "invertedshort",
+}
+
+function flushers.author(step,field,value)
+ if type(value) == "table" and #value > 0 then
+ local register = step.register
+ local processor = step.processor
+ local alternative = shorts[step.alternative or "invertedshort"] or "invertedshort"
+ for i=1,#value do
+ local a = value[i]
+ local k = writers[field] { a }
+ local e = f_author(alternative,components(a,short))
+ ctx_dosetfastregisterentry(register,e,k,processor or "","")
+ end
+ end
+end
+
+function flushers.keyword(step,field,value)
+ if type(value) == "table" and #value > 0 then
+ local register = step.register
+ local processor = step.processor
+ for i=1,#value do
+ ctx_dosetfastregisterentry(register,value[i],"",processor or "","")
+ end
+ end
+end
diff --git a/Master/texmf-dist/tex/context/base/publ-sor.lua b/Master/texmf-dist/tex/context/base/publ-sor.lua
new file mode 100644
index 00000000000..c3fcdb0eed1
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/publ-sor.lua
@@ -0,0 +1,276 @@
+if not modules then modules = { } end modules ['publ-sor'] = {
+ version = 1.001,
+ comment = "this module part of publication support",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- if needed we can optimize this one: chekc if it's detail or something else
+-- and use direct access, but in practice it's fast enough
+
+local type = type
+local concat = table.concat
+local formatters = string.formatters
+local compare = sorters.comparers.basic -- (a,b)
+local sort = table.sort
+
+local toarray = utilities.parsers.settings_to_array
+local utfchar = utf.char
+
+local publications = publications
+local writers = publications.writers
+
+local variables = interfaces.variables
+local v_short = variables.short
+local v_default = variables.default
+local v_reference = variables.reference
+local v_dataset = variables.dataset
+
+local report = logs.reporter("publications","sorters")
+
+local trace_sorters trackers.register("publications.sorters",function(v) trace_sorters = v end)
+
+-- authors(s) | year | journal | title | pages
+
+local template = [[
+local type, tostring = type, tostring
+
+local writers = publications.writers
+local datasets = publications.datasets
+local getter = publications.getfaster -- (current,data,details,field,categories,types)
+local strip = sorters.strip
+local splitter = sorters.splitters.utf
+
+local function newsplitter(splitter)
+ return table.setmetatableindex({},function(t,k) -- could be done in the sorter but seldom that many shared
+ local v = splitter(k,true) -- in other cases
+ t[k] = v
+ return v
+ end)
+end
+
+return function(dataset,list,method) -- indexer
+ local current = datasets[dataset]
+ local luadata = current.luadata
+ local details = current.details
+ local specification = publications.currentspecification
+ local categories = specification.categories
+ local types = specification.types
+ local splitted = newsplitter(splitter) -- saves mem
+ local snippets = { } -- saves mem
+ local result = { }
+
+%helpers%
+
+ for i=1,#list do
+ -- either { tag, tag, ... } or { { tag, index }, { tag, index } }
+ local li = list[i]
+ local tag = type(li) == "string" and li or li[1]
+ local index = tostring(i)
+ local entry = luadata[tag]
+ if entry then
+ local detail = details[tag]
+ result[i] = {
+ index = i,
+ split = {
+
+%getters%
+
+ },
+ }
+ else
+ result[i] = {
+ index = i,
+ split = {
+
+%unknowns%
+
+ },
+ }
+ end
+ end
+ return result
+end
+]]
+
+local f_getter = formatters["splitted[strip(getter(current,entry,detail,%q,categories,types) or %q)], -- %s"]
+local f_writer = formatters["splitted[strip(writer_%s(getter(current,entry,detail,%q,categories,types) or %q,snippets))], -- %s"]
+local f_helper = formatters["local writer_%s = writers[%q] -- %s: %s"]
+local f_value = formatters["splitted[%q], -- %s"]
+local s_index = "splitted[index], -- the order in the list, always added"
+
+-- there is no need to cache this in specification
+
+local sharedmethods = { }
+publications.sortmethods = sharedmethods
+
+local function sortsequence(dataset,list,sorttype)
+
+ if not list or #list == 0 then
+ return
+ end
+
+ local specification = publications.currentspecification
+ local types = specification.types
+ local sortmethods = specification.sortmethods
+ local method = sortmethods and sortmethods[sorttype] or sharedmethods[sorttype]
+ local sequence = method and method.sequence
+
+ local s_default = "<before end>"
+ local s_unknown = "<at the end>"
+
+ local c_default = utfchar(0xFFFE)
+ local c_unknown = utfchar(0xFFFF)
+
+ if not sequence and type(sorttype) == "string" then
+ local list = toarray(sorttype)
+ if #list > 0 then
+ sequence = { }
+ for i=1,#list do
+ local entry = toarray(list[i])
+ local field = entry[1]
+ local default = entry[2]
+ local unknown = entry[3] or default
+ sequence[i] = {
+ field = field,
+ default = default == s_default and c_default or default or c_default,
+ unknown = unknown == s_unknown and c_unknown or unknown or c_unknown,
+ }
+ end
+ end
+ if trace_sorters then
+ report("creating sequence from method %a",sorttype)
+ end
+ end
+
+ if sequence then
+
+ local getters = { }
+ local unknowns = { }
+ local helpers = { }
+
+ if trace_sorters then
+ report("initializing method %a",sorttype)
+ end
+
+ for i=1,#sequence do
+ local step = sequence[i]
+ local field = step.field or "?"
+ local default = step.default or c_default
+ local unknown = step.unknown or c_unknown
+ local fldtype = types[field]
+ local writer = fldtype and writers[fldtype]
+
+ if trace_sorters then
+ report("% 3i : field %a, type %a, default %a, unknown %a",i,field,fldtype,
+ default == c_default and s_default or default,
+ unknown == c_unknown and s_unknown or unknown
+ )
+ end
+
+ if writer then
+ local h = #helpers + 1
+ getters[i] = f_writer(h,field,default,field)
+ helpers[h] = f_helper(h,fldtype,field,fldtype)
+ else
+ getters[i] = f_getter(field,default,field)
+ end
+ unknowns[i] = f_value(unknown,field)
+ end
+
+ unknowns[#unknowns+1] = s_index
+ getters [#getters +1] = s_index
+
+ local code = utilities.templates.replace(template, {
+ helpers = concat(helpers, "\n"),
+ getters = concat(getters, "\n"),
+ unknowns = concat(unknowns,"\n"),
+ })
+
+ -- print(code)
+
+ local action, error = loadstring(code)
+ if type(action) == "function" then
+ action = action()
+ else
+ report("error when compiling sort method %a: %s",sorttype,error or "unknown")
+ end
+ if type(action) == "function" then
+ local valid = action(dataset,list,method)
+ if valid and #valid > 0 then
+ sorters.sort(valid,compare)
+ return valid
+ else
+ report("error when applying sort method %a",sorttype)
+ end
+ else
+ report("error in sort method %a",sorttype)
+ end
+ else
+ report("invalid sort method %a",sorttype)
+ end
+
+end
+
+local sorters = {
+ [v_short] = function(dataset,rendering,list)
+ local shorts = rendering.shorts
+ local function compare(a,b)
+ local aa, bb = a and a[1], b and b[1]
+ if aa and bb then
+ aa, bb = shorts[aa], shorts[bb]
+ return aa and bb and aa < bb
+ end
+ return false
+ end
+ sort(list,compare)
+ end,
+ [v_reference] = function(dataset,rendering,list)
+ local function compare(a,b)
+ local aa, bb = a and a[1], b and b[1]
+ if aa and bb then
+ return aa and bb and aa < bb
+ end
+ return false
+ end
+ sort(list,compare)
+ end,
+ [v_dataset] = function(dataset,rendering,list)
+ local function compare(a,b)
+-- inspect(a,b)
+ local aa, bb = a and a[6], b and b[6]
+ if aa and bb then
+ -- aa, bb = list[aa].index or 0, list[bb].index or 0
+ return aa and bb and aa < bb
+ end
+ return false
+ end
+ sort(list,compare)
+ end,
+ [v_default] = function(dataset,rendering,list,sorttype) -- experimental
+ if sorttype == "" or sorttype == v_default then
+ local function compare(a,b)
+ local aa, bb = a and a[3], b and b[3]
+ if aa and bb then
+ return aa and bb and aa < bb
+ end
+ return false
+ end
+ sort(list,compare)
+ else
+ local valid = sortsequence(dataset,list,sorttype)
+ if valid and #valid > 0 then
+ for i=1,#valid do
+ local v = valid[i]
+ valid[i] = list[v.index]
+ end
+ return valid
+ end
+ end
+ end
+}
+
+table.setmetatableindex(sorters,function(t,k) return t[v_default] end)
+
+publications.lists.sorters = sorters
diff --git a/Master/texmf-dist/tex/context/base/publ-tra.lua b/Master/texmf-dist/tex/context/base/publ-tra.lua
index 98c81d800dd..65e9b7ff486 100644
--- a/Master/texmf-dist/tex/context/base/publ-tra.lua
+++ b/Master/texmf-dist/tex/context/base/publ-tra.lua
@@ -6,291 +6,475 @@ if not modules then modules = { } end modules ['publ-tra'] = {
license = "see context related readme files"
}
-local sortedhash = table.sortedhash
-
-local tracers = { }
-publications.tracers = tracers
-local datasets = publications.datasets
-
-local context = context
-local NC, NR = context.NC, context.NR
-local bold = context.bold
-local darkgreen, darkred, darkblue = context.darkgreen, context.darkred, context.darkblue
-
-local fields = table.sorted {
- "abstract",
- "address",
- "annotate",
- "author",
- "booktitle",
- "chapter",
- "comment",
- "country",
- "doi",
- "edition",
- "editor",
- "eprint",
- "howpublished",
- "institution",
- "isbn",
- "issn",
- "journal",
- "key",
- "keyword",
- "keywords",
- "language",
- "lastchecked",
- "month",
- "names",
- "note",
- "notes",
- "number",
- "organization",
- "pages",
- "publisher",
- "school",
- "series",
- "size",
- "title",
- "type",
- "url",
- "volume",
- "year",
- "nationality",
- "assignee",
- "bibnumber",
- "day",
- "dayfiled",
- "monthfiled",
- "yearfiled",
- "revision",
-}
+-- todo: use context.tt .. more efficient, less code
-local citevariants = table.sorted {
- "author",
- "authoryear",
- "authoryears",
- "authornum",
- "year",
- "short",
- "serial",
- "key",
- "doi",
- "url",
- "type",
- "page",
- "none",
- "num",
-}
+local next, type = next, type
-local listvariants = table.sorted {
- "author",
- "editor",
- "artauthor",
-}
+local sortedhash = table.sortedhash
+local sortedkeys = table.sortedkeys
+local settings_to_array = utilities.parsers.settings_to_array
+local formatters = string.formatters
+local concat = table.concat
--- local categories = table.sorted {
--- "article",
--- "book",
--- "booklet",
--- "conference",
--- "inbook",
--- "incollection",
--- "inproceedings",
--- "manual",
--- "mastersthesis",
--- "misc",
--- "phdthesis",
--- "proceedings",
--- "techreport",
--- "unpublished",
--- }
-
-local categories = {
- article = {
- required = { "author", "title", "journal", "year" },
- optional = { "volume", "number", "pages", "month", "note" },
- },
- book = {
- required = { { "author", "editor" }, "title", "publisher", "year" },
- optional = { { "volume", "number" }, "series", "address", "edition", "month","note" },
- },
- booklet = {
- required = { "title" },
- optional = { "author", "howpublished", "address", "month", "year", "note" },
- },
- inbook = {
- required = { { "author", "editor" }, "title", { "chapter", "pages" }, "publisher","year" },
- optional = { { "volume", "number" }, "series", "type", "address", "edition", "month", "note" },
- },
- incollection = {
- required = { "author", "title", "booktitle", "publisher", "year" },
- optional = { "editor", { "volume", "number" }, "series", "type", "chapter", "pages", "address", "edition", "month", "note" },
- },
- inproceedings = {
- required = { "author", "title", "booktitle", "year" },
- optional = { "editor", { "volume", "number" }, "series", "pages", "address", "month","organization", "publisher", "note" },
- },
- manual = {
- required = { "title" },
- optional = { "author", "organization", "address", "edition", "month", "year", "note" },
- },
- mastersthesis = {
- required = { "author", "title", "school", "year" },
- optional = { "type", "address", "month", "note" },
- },
- misc = {
- required = { "author", "title", "howpublished", "month", "year", "note" },
- optional = { "author", "title", "howpublished", "month", "year", "note" },
- },
- phdthesis = {
- required = { "author", "title", "school", "year" },
- optional = { "type", "address", "month", "note" },
- },
- proceedings = {
- required = { "title", "year" },
- optional = { "editor", { "volume", "number" }, "series", "address", "month", "organization", "publisher", "note" },
- },
- techreport = {
- required = { "author", "title", "institution", "year" },
- optional = { "type", "number", "address", "month", "note" },
- },
- unpublished = {
- required = { "author", "title", "note" },
- optional = { "month", "year" },
- },
-}
+local context = context
+local commands = commands
+
+local v_default = interfaces.variables.default
+
+local publications = publications
+local tracers = publications.tracers
+local tables = publications.tables
+local datasets = publications.datasets
+local specifications = publications.specifications
+local citevariants = publications.citevariants
+local getfield = publications.getfield
+local getcasted = publications.getcasted
-publications.tracers.fields = fields
-publications.tracers.categories = categories
-publications.tracers.citevariants = citevariants
-publications.tracers.listvariants = listvariants
--- -- --
+local ctx_NC, ctx_NR, ctx_HL, ctx_FL, ctx_ML, ctx_LL, ctx_EQ = context.NC, context.NR, context.HL, context.FL, context.ML, context.LL, context.EQ
-function tracers.showdatasetfields(dataset)
- local luadata = datasets[dataset].luadata
+local ctx_starttabulate = context.starttabulate
+local ctx_stoptabulate = context.stoptabulate
+
+local ctx_formatted = context.formatted
+local ctx_bold = ctx_formatted.monobold
+local ctx_monobold = ctx_formatted.monobold
+local ctx_verbatim = ctx_formatted.verbatim
+
+local ctx_rotate = context.rotate
+local ctx_llap = context.llap
+local ctx_rlap = context.rlap
+local ctx_page = context.page
+
+local privates = tables.privates
+local specials = tables.specials
+
+local report = logs.reporter("publications","tracers")
+
+function tracers.showdatasetfields(settings)
+ local dataset = settings.dataset
+ local current = datasets[dataset]
+ local luadata = current.luadata
+ local specification = settings.specification
+ local fielddata = specification and specifications[specification] or specifications.apa
+ local categories = fielddata.categories
if next(luadata) then
- context.starttabulate { "|lT|lT|pT|" }
- NC() bold("tag")
- NC() bold("category")
- NC() bold("fields")
- NC() NR() context.FL() -- HL()
- for k, v in sortedhash(luadata) do
- NC() context(k)
- NC() context(v.category)
- NC()
- for k, v in sortedhash(v) do
- if k ~= "details" and k ~= "tag" and k ~= "category" then
- context("%s ",k)
+ ctx_starttabulate { "|lT|lT|pTl|" }
+ ctx_NC() ctx_bold("tag")
+ ctx_NC() ctx_bold("category")
+ ctx_NC() ctx_bold("fields")
+ ctx_NC() ctx_NR()
+ ctx_FL()
+ for tag, entry in sortedhash(luadata) do
+ local category = entry.category
+ local catedata = categories[category]
+ local fields = catedata and catedata.fields or { }
+ ctx_NC() context(tag)
+ ctx_NC() context(category)
+ ctx_NC() -- grouping around colors needed
+ for key, value in sortedhash(entry) do
+ if privates[key] then
+ -- skip
+ elseif specials[key] then
+ context("{\\darkblue %s} ",key)
+ else
+ local kind = fields[key]
+ if kind == "required" then
+ context("{\\darkgreen %s} ",key)
+ elseif kind == "optional" then
+ context("%s ",key)
+ else
+ context("{\\darkyellow %s} ",key)
+ end
end
end
- NC() NR()
+ ctx_NC() ctx_NR()
end
- context.stoptabulate()
+ ctx_stoptabulate()
end
end
-function tracers.showdatasetcompleteness(dataset)
+function tracers.showdatasetcompleteness(settings)
+ local dataset = settings.dataset
+ local current = datasets[dataset]
+ local luadata = current.luadata
+ local specification = settings.specification
+ local fielddata = specification and specifications[specification] or specifications.apa
+ local categories = fielddata.categories
- dataset = datasets[dataset]
+ -- local lpegmatch = lpeg.match
+ -- local texescape = lpeg.patterns.texescape
- local preamble = { "|lBTw(10em)|p|" }
+ local preamble = { "|lTBw(5em)|lBTp(10em)|plT|" }
- local function required(key,value,indirect)
- NC() darkgreen(key)
- NC() if indirect then
- darkblue(value)
- elseif value then
- context(value)
+ local function identified(tag,category,crossref)
+ ctx_NC()
+ ctx_NC() ctx_monobold(category)
+ ctx_NC() if crossref then
+ ctx_monobold("%s\\hfill\\darkblue => %s",tag,crossref)
else
- darkred("\\tttf [missing]")
+ ctx_monobold(tag)
end
- NC() NR()
+ ctx_NC() ctx_NR()
end
- local function optional(key,value,indirect)
- NC() context(key)
- NC() if indirect then
- darkblue(value)
- elseif value then
- context(value)
- end
- NC() NR()
+ local function required(done,foundfields,key,value,indirect)
+ ctx_NC() if not done then ctx_monobold("required") end
+ ctx_NC() context(key)
+ ctx_NC()
+ if indirect then
+ if value then
+ context("\\darkblue")
+ ctx_verbatim(value)
+ else
+ context("\\darkred\\tttf [missing crossref]")
+ end
+ elseif value then
+ ctx_verbatim(value)
+ else
+ context("\\darkred\\tttf [missing value]")
+ end
+ ctx_NC() ctx_NR()
+ foundfields[key] = nil
+ return done or true
end
- local function identified(tag,crossref)
- NC() context("tag")
- NC() if crossref then
- context("\\tttf %s\\hfill\\darkblue => %s",tag,crossref)
- else
- context("\\tttf %s",tag)
- end
- NC() NR()
+ local function optional(done,foundfields,key,value,indirect)
+ ctx_NC() if not done then ctx_monobold("optional") end
+ ctx_NC() context(key)
+ ctx_NC()
+ if indirect then
+ context("\\darkblue")
+ ctx_verbatim(value)
+ elseif value then
+ ctx_verbatim(value)
+ end
+ ctx_NC() ctx_NR()
+ foundfields[key] = nil
+ return done or true
end
- local luadata = datasets[dataset].luadata
+ local function special(done,key,value)
+ ctx_NC() if not done then ctx_monobold("special") end
+ ctx_NC() context(key)
+ ctx_NC() ctx_verbatim(value)
+ ctx_NC() ctx_NR()
+ return done or true
+ end
+
+ local function extra(done,key,value)
+ ctx_NC() if not done then ctx_monobold("extra") end
+ ctx_NC() context(key)
+ ctx_NC() ctx_verbatim(value)
+ ctx_NC() ctx_NR()
+ return done or true
+ end
if next(luadata) then
- for tag, entry in table.sortedhash(luadata) do
- local category = entry.category
- local fields = categories[category]
+ for tag, entry in sortedhash(luadata) do
+ local category = entry.category
+ local fields = categories[category]
+ local foundfields = { }
+ for k, v in next, entry do
+ foundfields[k] = true
+ end
+ ctx_starttabulate(preamble)
+ identified(tag,category,entry.crossref)
+ ctx_FL()
if fields then
- context.starttabulate(preamble)
- identified(tag,entry.crossref)
- context.HL()
local requiredfields = fields.required
- local optionalfields = fields.optional
- for i=1,#requiredfields do
- local r = requiredfields[i]
- if type(r) == "table" then
- local okay = true
- for i=1,#r do
- local ri = r[i]
- if rawget(entry,ri) then
- required(ri,entry[ri])
- okay = true
- elseif entry[ri] then
- required(ri,entry[ri],true)
- okay = true
+ local sets = fields.sets or { }
+ local done = false
+ if requiredfields then
+ for i=1,#requiredfields do
+ local r = requiredfields[i]
+ local r = sets[r] or r
+ if type(r) == "table" then
+ local okay = false
+ for i=1,#r do
+ local ri = r[i]
+ if rawget(entry,ri) then
+ done = required(done,foundfields,ri,entry[ri])
+ okay = true
+ elseif entry[ri] then
+ done = required(done,foundfields,ri,entry[ri],true)
+ okay = true
+ end
end
+ if not okay then
+ done = required(done,foundfields,table.concat(r," {\\letterbar} "))
+ end
+ elseif rawget(entry,r) then
+ done = required(done,foundfields,r,entry[r])
+ elseif entry[r] then
+ done = required(done,foundfields,r,entry[r],true)
+ else
+ done = required(done,foundfields,r)
end
- if not okay then
- required(table.concat(r,"\\letterbar "))
- end
- elseif rawget(entry,r) then
- required(r,entry[r])
- elseif entry[r] then
- required(r,entry[r],true)
- else
- required(r)
end
end
- for i=1,#optionalfields do
- local o = optionalfields[i]
- if type(o) == "table" then
- for i=1,#o do
- local oi = o[i]
- if rawget(entry,oi) then
- optional(oi,entry[oi])
- elseif entry[oi] then
- optional(oi,entry[oi],true)
+ local optionalfields = fields.optional
+ local done = false
+ if optionalfields then
+ for i=1,#optionalfields do
+ local o = optionalfields[i]
+ local o = sets[o] or o
+ if type(o) == "table" then
+ for i=1,#o do
+ local oi = o[i]
+ if rawget(entry,oi) then
+ done = optional(done,foundfields,oi,entry[oi])
+ elseif entry[oi] then
+ done = optional(done,foundfields,oi,entry[oi],true)
+ end
end
+ elseif rawget(entry,o) then
+ done = optional(done,foundfields,o,entry[o])
+ elseif entry[o] then
+ done = optional(done,foundfields,o,entry[o],true)
end
- elseif rawget(entry,o) then
- optional(o,entry[o])
- elseif entry[o] then
- optional(o,entry[o],true)
end
end
- context.stoptabulate()
+ end
+ local done = false
+ for k, v in sortedhash(foundfields) do
+ if privates[k] then
+ -- skip
+ elseif specials[k] then
+ done = special(done,k,entry[k])
+ end
+ end
+ local done = false
+ for k, v in sortedhash(foundfields) do
+ if privates[k] then
+ -- skip
+ elseif not specials[k] then
+ done = extra(done,k,entry[k])
+ end
+ end
+ ctx_stoptabulate()
+ end
+ end
+
+end
+
+function tracers.showfields(settings)
+ local rotation = settings.rotation
+ local specification = settings.specification
+ local fielddata = specification and specifications[specification] or specifications.apa
+ local categories = fielddata.categories
+ local validfields = { }
+ for category, data in next, categories do
+ local sets = data.sets
+ local fields = data.fields
+ for name, list in next, fields do
+ validfields[name] = true
+ end
+ end
+ local s_categories = sortedkeys(categories)
+ local s_fields = sortedkeys(validfields)
+ ctx_starttabulate { "|l" .. string.rep("|c",#s_categories) .. "|" }
+ ctx_FL()
+ ctx_NC()
+ if rotation then
+ rotation = { rotation = rotation }
+ end
+ for i=1,#s_categories do
+ ctx_NC()
+ local txt = formatters["\\bf %s"](s_categories[i])
+ if rotation then
+ ctx_rotate(rotation,txt)
+ else
+ context(txt)
+ end
+ end
+ ctx_NC() ctx_NR()
+ ctx_FL()
+ for i=1,#s_fields do
+ local field = s_fields[i]
+ ctx_NC()
+ ctx_bold(field)
+ for j=1,#s_categories do
+ ctx_NC()
+ local kind = categories[s_categories[j]].fields[field]
+ if kind == "required" then
+ context("\\darkgreen*")
+ elseif kind == "optional" then
+ context("*")
+ end
+ end
+ ctx_NC() ctx_NR()
+ end
+ ctx_LL()
+ ctx_stoptabulate()
+end
+
+function tracers.showtables(settings)
+ for name, list in sortedhash(tables) do
+ ctx_starttabulate { "|Tl|Tl|" }
+ ctx_FL()
+ ctx_NC()
+ ctx_rlap(function() ctx_bold(name) end)
+ ctx_NC()
+ ctx_NC()
+ ctx_NR()
+ ctx_FL()
+ for k, v in sortedhash(list) do
+ ctx_NC()
+ context(k)
+ ctx_NC()
+ if type(v) == "table" then
+ context("% t",v)
else
- -- error
+ context(tostring(v))
+ end
+ ctx_NC()
+ ctx_NR()
+ end
+ ctx_LL()
+ ctx_stoptabulate()
+ end
+end
+
+function tracers.showdatasetauthors(settings)
+
+ local dataset = settings.dataset
+ local field = settings.field
+
+ local sortkey = publications.writers.author
+
+ if not dataset or dataset == "" then dataset = v_default end
+ if not field or field == "" then field = "author" end
+
+ local function row(i,k,v)
+ ctx_NC()
+ if i then
+ ctx_verbatim(i)
+ end
+ ctx_NC()
+ ctx_verbatim(k)
+ ctx_EQ()
+ if type(v) == "table" then
+ local t = { }
+ for i=1,#v do
+ local vi = v[i]
+ if type(vi) == "table" then
+ t[i] = concat(vi,"-")
+ else
+ t[i] = vi
+ end
+ end
+ ctx_verbatim(concat(t, " | "))
+ else
+ ctx_verbatim(v)
+ end
+ ctx_NC()
+ ctx_NR()
+ end
+
+ local function authorrow(ai,k,i)
+ local v = ai[k]
+ if v then
+ row(i,k,v)
+ end
+ end
+
+ local function commonrow(key,value)
+ ctx_NC() ctx_rlap(function() ctx_verbatim(key) end)
+ ctx_NC()
+ ctx_EQ() ctx_verbatim(value)
+ ctx_NC() ctx_NR()
+ end
+
+ local d = datasets[dataset].luadata
+
+ local trialtypesetting = context.trialtypesetting()
+
+ for tag, entry in sortedhash(d) do
+
+ local a, f, k = getcasted(dataset,tag,field)
+
+ if type(a) == "table" and #a > 0 and k == "author" then
+ context.start()
+ context.tt()
+ ctx_starttabulate { "|B|Bl|p|" }
+ ctx_FL()
+ local original = getfield(dataset,tag,field)
+ commonrow("tag",tag)
+ commonrow("field",field)
+ commonrow("original",original)
+ commonrow("sortkey",sortkey(a))
+ for i=1,#a do
+ ctx_ML()
+ local ai = a[i]
+ if ai then
+ authorrow(ai,"original",i)
+ authorrow(ai,"snippets")
+ authorrow(ai,"initials")
+ authorrow(ai,"firstnames")
+ authorrow(ai,"vons")
+ authorrow(ai,"surnames")
+ authorrow(ai,"juniors")
+ local options = ai.options
+ if options then
+ row(false,"options",sortedkeys(options))
+ end
+ elseif not trialtypesetting then
+ report("bad author name: %s",original or "?")
+ end
+ end
+ ctx_LL()
+ ctx_stoptabulate()
+ context.stop()
+ end
+
+ end
+
+end
+
+function tracers.showentry(dataset,tag)
+ local dataset = datasets[dataset]
+ if dataset then
+ local entry = dataset.luadata[tag]
+ local done = false
+ for k, v in sortedhash(entry) do
+ if not privates[k] then
+ ctx_verbatim("%w[%s: %s]",done and 1 or 0,k,v)
+ done = true
end
end
end
+end
+
+local skipped = { index = true, default = true }
+function tracers.showvariants(dataset,pages)
+ local variants = sortedkeys(citevariants)
+ for tag in publications.sortedentries(dataset or v_default) do
+ if pages then
+ ctx_page()
+ end
+ ctx_starttabulate { "|T||" }
+ for i=1,#variants do
+ local variant = variants[i]
+ if not skipped[variant] then
+ ctx_NC() context(variant)
+ -- ctx_EQ() citevariants[variant] { dataset = v_default, reference = tag, variant = variant }
+ ctx_EQ() context.cite({variant},{dataset .. "::" .. tag})
+ ctx_NC() ctx_NR()
+ end
+ end
+ ctx_stoptabulate()
+ if pages then
+ ctx_page()
+ end
+ end
end
commands.showbtxdatasetfields = tracers.showdatasetfields
commands.showbtxdatasetcompleteness = tracers.showdatasetcompleteness
+commands.showbtxfields = tracers.showfields
+commands.showbtxtables = tracers.showtables
+commands.showbtxdatasetauthors = tracers.showdatasetauthors
+commands.showbtxentry = tracers.showentry
+commands.showbtxvariants = tracers.showvariants
diff --git a/Master/texmf-dist/tex/context/base/publ-tra.mkiv b/Master/texmf-dist/tex/context/base/publ-tra.mkiv
index 49fb6d96275..41550519851 100644
--- a/Master/texmf-dist/tex/context/base/publ-tra.mkiv
+++ b/Master/texmf-dist/tex/context/base/publ-tra.mkiv
@@ -20,16 +20,68 @@
\unprotect
-\unexpanded\def\showbtxdatasetfields
- {\dosingleempty\publ_dataset_show_fields}
+\unexpanded\def\showbtxdatasetfields {\dosingleempty\publ_show_dataset_fields}
+\unexpanded\def\showbtxdatasetcompleteness{\dosingleempty\publ_show_dataset_completeness}
+\unexpanded\def\showbtxdatasetauthors {\dosingleempty\publ_show_dataset_authors}
+\unexpanded\def\showbtxfields {\dosingleempty\publ_show_fields}
+\unexpanded\def\showbtxtables {\dosingleempty\publ_show_tables}
-\def\publ_dataset_show_fields[#1]%
- {\ctxcommand{showbtxdatasetfields("\iffirstargument#1\else\currentbtxdataset\fi")}}
+\def\publ_show_dataset_whatever#1[#2]%
+ {\begingroup
+ \letdummyparameter\c!specification\currentbtxspecification
+ \setdummyparameter\c!dataset {\currentbtxdataset}%
+ \letdummyparameter\c!field \empty
+ \iffirstargument
+ \doifelseassignment{#2}
+ {\getdummyparameters[#2]}%
+ {\setdummyparameter\c!dataset{#2}}%
+ \else
+ \getdummyparameters[#2]%
+ \fi
+ % \publ_specification_push{"\dummyparameter\c!specification}%
+ \ctxcommand{#1{
+ dataset = "\dummyparameter\c!dataset",
+ specification = "\dummyparameter\c!specification",
+ field = "\dummyparameter\c!field",
+ }}%
+ % \publ_specification_pop
+ \endgroup}
-\unexpanded\def\showbtxdatasetcompleteness
- {\dosingleempty\publ_dataset_show_completeness}
+\def\publ_show_dataset_fields {\publ_show_dataset_whatever{showbtxdatasetfields}}
+\def\publ_show_dataset_completeness{\publ_show_dataset_whatever{showbtxdatasetcompleteness}}
+\def\publ_show_dataset_authors {\publ_show_dataset_whatever{showbtxdatasetauthors}}
-\def\publ_dataset_show_completeness[#1]%
- {\ctxcommand{showbtxdatasetcompleteness("\iffirstargument#1\else\currentbtxdataset\fi")}}
+\def\publ_show_fields[#1]%
+ {\begingroup
+ \setdummyparameter\c!rotation{90}%
+ \doifelseassignment{#1}%
+ {\letdummyparameter\c!specification\currentbtxspecification
+ \getdummyparameters[#1]}%
+ {\doifelsenothing{#1}%
+ {\letdummyparameter\c!specification\currentbtxspecification}%
+ {\setdummyparameter\c!specification{#1}}}%
+ % \publ_specification_push{"\dummyparameter\c!specification}%
+ \ctxcommand{showbtxfields{
+ rotation = "\dummyparameter\c!rotation",
+ specification = "\dummyparameter\c!specification"
+ }}%
+ % \publ_specification_pop
+ \endgroup}
-\protect \endinput
+\def\publ_show_tables[#1]%
+ {\begingroup
+ \ctxcommand{showbtxtables{}}%
+ \endgroup}
+
+\protect
+
+\continueifinputfile{publ-tra.mkiv}
+
+\starttext
+
+ \showbtxfields[rotation=85] \page
+ \showbtxfields[rotation=90] \page
+
+ \showbtxtables \page
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/publ-usr.lua b/Master/texmf-dist/tex/context/base/publ-usr.lua
index 6bb93ebeef5..f0111227916 100644
--- a/Master/texmf-dist/tex/context/base/publ-usr.lua
+++ b/Master/texmf-dist/tex/context/base/publ-usr.lua
@@ -6,7 +6,15 @@ if not modules then modules = { } end modules ['publ-usr'] = {
license = "see context related readme files"
}
--- local chardata = characters.data
+local P, Cs, R, Cc, C, Carg = lpeg.P, lpeg.Cs, lpeg.R, lpeg.Cc, lpeg.C, lpeg.Carg
+local lpegmatch = lpeg.match
+local settings_to_hash = utilities.parsers.settings_to_hash
+
+local publications = publications
+local datasets = publications.datasets
+
+local report = logs.reporter("publications")
+local trace = false trackers.register("publications",function(v) trace = v end)
-- local str = [[
-- \startpublication[k=Berdnikov:TB21-2-129,t=article,a={{Berdnikov},{}},y=2000,n=2257,s=BHHJ00]
@@ -25,67 +33,94 @@ if not modules then modules = { } end modules ['publ-usr'] = {
-- \stoppublication
-- ]]
-local remapped = {
- artauthor = "author",
- arttitle = "title",
+local lists = {
+ author = true,
+ editor = true,
+ -- artauthor = true,
+ -- arteditor = true,
}
-local P, Cs, R, Cc, Carg = lpeg.P, lpeg.Cs, lpeg.R, lpeg.Cc, lpeg.Carg
-
-local function register(target,key,a,b,c,d,e)
- key = remapped[key] or key
- if b and d and e then
- local s = nil
- if b ~= "" and b then
- s = s and s .. " " .. b or b
- end
- if d ~= "" and d then
- s = s and s .. " " .. d or d
- end
- if e ~= "" and e then
- s = s and s .. " " .. e or e
- end
- if a ~= "" and a then
- s = s and s .. " " .. a or a
- end
- local value = target[key]
- if s then
- if value then
- target[key] = value .. " and " .. s
- else
- target[key] = s
- end
- else
- if not value then
- target[key] = s
- end
- end
- else
- target[key] = b
- end
+local function registervalue(target,key,value)
+ target[key] = value
+end
+
+-- Instead of being generic we just hardcode the old stuff:
+
+local function registerauthor(target,key,juniors,firstnames,initials,vons,surnames)
+ local value = target[key]
+ target[key]= ((value and value .. " and {") or "{") ..
+ vons .. "},{" ..
+ surnames .. "},{" ..
+ juniors .. "},{" ..
+ firstnames .. "},{" ..
+ initials .. "}"
end
local leftbrace = P("{")
local rightbrace = P("}")
local leftbracket = P("[")
local rightbracket = P("]")
+local backslash = P("\\")
+local letter = R("az","AZ")
+
+local skipspaces = lpeg.patterns.whitespace^0
+local key = Cs(letter^1)
+local value = leftbrace * Cs(lpeg.patterns.balanced) * rightbrace
+local optional = leftbracket * Cs((1-rightbracket)^0) * rightbracket
+
+local authorkey = (P("artauthor") + P("author")) / "author"
+ + (P("arteditor") + P("editor")) / "editor"
+local authorvalue = (optional + Cc("{}")) * skipspaces -- [juniors]
+ * (value + Cc("{}")) * skipspaces -- {firstnames}
+ * (optional + Cc("{}")) * skipspaces -- [initials]
+ * (value + Cc("{}")) * skipspaces -- {vons}
+ * (value + Cc("{}")) * skipspaces -- {surnames}
-local key = P("\\") * Cs(R("az","AZ")^1) * lpeg.patterns.space^0
-local mandate = leftbrace * Cs(lpeg.patterns.balanced) * rightbrace + Cc(false)
-local optional = leftbracket * Cs((1-rightbracket)^0) * rightbracket + Cc(false)
-local value = optional^-1 * mandate^-1 * optional^-1 * mandate^-2
+local keyvalue = Carg(1) * authorkey * skipspaces * authorvalue / registerauthor
+ + Carg(1) * key * skipspaces * value / registervalue
-local pattern = ((Carg(1) * key * value) / register + P(1))^0
+local pattern = (backslash * keyvalue + P(1))^0
-function publications.addtexentry(dataset,settings,content)
- settings = utilities.parsers.settings_to_hash(settings)
+local function addtexentry(dataset,settings,content)
+ local current = datasets[dataset]
+ local settings = settings_to_hash(settings)
local data = {
tag = settings.tag or settings.k or "no tag",
category = settings.category or settings.t or "article",
}
- lpeg.match(pattern,content,1,data) -- can set tag too
- dataset.userdata[data.tag] = data
- dataset.luadata[data.tag] = data
- publications.markasupdated(dataset)
+ lpegmatch(pattern,content,1,data) -- can set tag too
+ local tag = data.tag
+ current.userdata[tag] = data
+ current.luadata[tag] = data
+ current.details[tag] = nil
return data
end
+
+local pattern = ( Carg(1)
+ * P("\\startpublication")
+ * skipspaces
+ * optional
+ * C((1 - P("\\stoppublication"))^1)
+ * P("\\stoppublication") / addtexentry
+ + P("%") * (1-lpeg.patterns.newline)^0
+ + P(1)
+)^0
+
+function publications.loaders.bbl(dataset,filename)
+ local dataset, fullname = publications.resolvedname(dataset,filename)
+ if not fullname then
+ return
+ end
+ local data = io.loaddata(filename) or ""
+ if data == "" then
+ report("empty file %a, nothing loaded",fullname)
+ return
+ end
+ if trace then
+ report("loading file %a",fullname)
+ end
+ lpegmatch(pattern,data,1,dataset)
+end
+
+publications.addtexentry = addtexentry
+commands.addbtxentry = addtexentry
diff --git a/Master/texmf-dist/tex/context/base/publ-xml.mkiv b/Master/texmf-dist/tex/context/base/publ-xml.mkiv
index 007f9bb27d2..96375b9cc61 100644
--- a/Master/texmf-dist/tex/context/base/publ-xml.mkiv
+++ b/Master/texmf-dist/tex/context/base/publ-xml.mkiv
@@ -19,7 +19,7 @@
{\dosingleempty\publ_convert_to_xml}
\def\publ_convert_to_xml[#1]%
- {\ctxcommand{convertbtxdatasettoxml("\iffirstargument#1\else\v!standard\fi",true)}} % or current when not empty
+ {\clf_convertbtxdatasettoxml{\iffirstargument#1\else\s!default\fi}} % or current when not empty
% \startxmlsetups btx:initialize
% \xmlregistereddocumentsetups{#1}{}
diff --git a/Master/texmf-dist/tex/context/base/regi-ini.lua b/Master/texmf-dist/tex/context/base/regi-ini.lua
index d5d278b1649..37a88fd5f96 100644
--- a/Master/texmf-dist/tex/context/base/regi-ini.lua
+++ b/Master/texmf-dist/tex/context/base/regi-ini.lua
@@ -15,7 +15,7 @@ runtime.</p>
local commands, context = commands, context
local utfchar = utf.char
-local P, Cs, lpegmatch = lpeg.P, lpeg.Cs, lpeg.match
+local P, Cs, Cc, lpegmatch = lpeg.P, lpeg.Cs, lpeg.Cc, lpeg.match
local char, gsub, format, gmatch, byte, match = string.char, string.gsub, string.format, string.gmatch, string.byte, string.match
local next = next
local insert, remove, fastcopy = table.insert, table.remove, table.fastcopy
@@ -27,6 +27,9 @@ local sequencers = utilities.sequencers
local textlineactions = resolvers.openers.helpers.textlineactions
local setmetatableindex = table.setmetatableindex
+local implement = interfaces.implement
+local setmacro = interfaces.setmacro
+
--[[ldx--
<p>We will hook regime handling code into the input methods.</p>
--ldx]]--
@@ -99,6 +102,8 @@ local synonyms = { -- backward compatibility list
["windows"] = "cp1252",
+ ["pdf"] = "pdfdoc",
+
}
local currentregime = "utf"
@@ -132,7 +137,7 @@ end
setmetatableindex(mapping, loadregime)
setmetatableindex(backmapping,loadreverse)
-local function translate(line,regime)
+local function fromregime(regime,line)
if line and #line > 0 then
local map = mapping[regime and synonyms[regime] or regime or currentregime]
if map then
@@ -178,12 +183,15 @@ local function toregime(vector,str,default) -- toregime('8859-1',"abcde Ä","?")
local r = c[d]
if not r then
local t = fastcopy(backmapping[vector])
- setmetatableindex(t, function(t,k)
- local v = d
- t[k] = v
- return v
- end)
- r = utf.remapper(t)
+ -- r = utf.remapper(t) -- not good for defaults here
+ local pattern = Cs((lpeg.utfchartabletopattern(t)/t + lpeg.patterns.utf8character/d + P(1)/d)^0)
+ r = function(str)
+ if not str or str == "" then
+ return ""
+ else
+ return lpegmatch(pattern,str)
+ end
+ end
c[d] = r
end
return r(str)
@@ -192,6 +200,7 @@ end
local function disable()
currentregime = "utf"
sequencers.disableaction(textlineactions,"regimes.process")
+ return currentregime
end
local function enable(regime)
@@ -202,12 +211,14 @@ local function enable(regime)
currentregime = regime
sequencers.enableaction(textlineactions,"regimes.process")
end
+ return currentregime
end
-regimes.toregime = toregime
-regimes.translate = translate
-regimes.enable = enable
-regimes.disable = disable
+regimes.toregime = toregime
+regimes.fromregime = fromregime
+regimes.translate = function(str,regime) return fromregime(regime,str) end
+regimes.enable = enable
+regimes.disable = disable
-- The following function can be used when we want to make sure that
-- utf gets passed unharmed. This is needed for modules.
@@ -216,7 +227,7 @@ local level = 0
function regimes.process(str,filename,currentline,noflines,coding)
if level == 0 and coding ~= "utf-8" then
- str = translate(str,currentregime)
+ str = fromregime(currentregime,str)
if trace_translating then
report_translating("utf: %s",str)
end
@@ -243,40 +254,62 @@ end
regimes.push = push
regimes.pop = pop
-sequencers.prependaction(textlineactions,"system","regimes.process")
-sequencers.disableaction(textlineactions,"regimes.process")
+if sequencers then
+
+ sequencers.prependaction(textlineactions,"system","regimes.process")
+ sequencers.disableaction(textlineactions,"regimes.process")
+
+end
-- interface:
-commands.enableregime = enable
-commands.disableregime = disable
+implement {
+ name = "enableregime",
+ arguments = "string",
+ actions = function(regime) setmacro("currentregime",enable(regime)) end
+}
-commands.pushregime = push
-commands.popregime = pop
+implement {
+ name = "disableregime",
+ actions = function() setmacro("currentregime",disable()) end
+}
-function commands.currentregime()
- context(currentregime)
-end
+implement {
+ name = "pushregime",
+ actions = push
+}
+
+implement {
+ name = "popregime",
+ actions = pop
+}
local stack = { }
-function commands.startregime(regime)
- insert(stack,currentregime)
- if trace_translating then
- report_translating("start using %a",regime)
+implement {
+ name = "startregime",
+ arguments = "string",
+ actions = function(regime)
+ insert(stack,currentregime)
+ if trace_translating then
+ report_translating("start using %a",regime)
+ end
+ setmacro("currentregime",enable(regime))
end
- enable(regime)
-end
+}
-function commands.stopregime()
- if #stack > 0 then
- local regime = remove(stack)
- if trace_translating then
- report_translating("stop using %a",regime)
+implement {
+ name = "stopregime",
+ actions = function()
+ if #stack > 0 then
+ local regime = remove(stack)
+ if trace_translating then
+ report_translating("stop using %a",regime)
+ end
+ setmacro("currentregime",enable(regime))
end
- enable(regime)
end
-end
+}
-- Next we provide some hacks. Unfortunately we run into crappy encoded
-- (read : mixed) encoded xml files that have these ë ä ö ü sequences
@@ -311,48 +344,82 @@ local patterns = { }
--
-- twice as fast and much less lpeg bytecode
+-- function regimes.cleanup(regime,str)
+-- if not str or str == "" then
+-- return str
+-- end
+-- local p = patterns[regime]
+-- if p == nil then
+-- regime = regime and synonyms[regime] or regime or currentregime
+-- local vector = regime ~= "utf" and regime ~= "utf-8" and mapping[regime]
+-- if vector then
+-- local utfchars = { }
+-- local firsts = { }
+-- for k, uchar in next, vector do
+-- local stream = { }
+-- local split = totable(uchar)
+-- local nofsplits = #split
+-- if nofsplits > 1 then
+-- local first
+-- for i=1,nofsplits do
+-- local u = vector[split[i]]
+-- if not first then
+-- first = firsts[u]
+-- if not first then
+-- first = { }
+-- firsts[u] = first
+-- end
+-- end
+-- stream[i] = u
+-- end
+-- local nofstream = #stream
+-- if nofstream > 1 then
+-- first[#first+1] = concat(stream,2,nofstream)
+-- utfchars[concat(stream)] = uchar
+-- end
+-- end
+-- end
+-- p = P(false)
+-- for k, v in next, firsts do
+-- local q = P(false)
+-- for i=1,#v do
+-- q = q + P(v[i])
+-- end
+-- p = p + P(k) * q
+-- end
+-- p = Cs(((p+1)/utfchars)^1)
+-- -- lpeg.print(p) -- size: 1042
+-- else
+-- p = false
+-- end
+-- patterns[regime] = p
+-- end
+-- return p and lpegmatch(p,str) or str
+-- end
+--
+-- 5 times faster:
+
function regimes.cleanup(regime,str)
+ if not str or str == "" then
+ return str
+ end
local p = patterns[regime]
if p == nil then
regime = regime and synonyms[regime] or regime or currentregime
- local vector = regime ~= "utf" and mapping[regime]
+ local vector = regime ~= "utf" and regime ~= "utf-8" and mapping[regime]
if vector then
- local utfchars = { }
- local firsts = { }
- for k, uchar in next, vector do
- local stream = { }
- local split = totable(uchar)
- local nofsplits = #split
- if nofsplits > 1 then
- local first
- for i=1,nofsplits do
- local u = vector[split[i]]
- if not first then
- first = firsts[u]
- if not first then
- first = { }
- firsts[u] = first
- end
- end
- stream[i] = u
- end
- local nofstream = #stream
- if nofstream > 1 then
- first[#first+1] = concat(stream,2,nofstream)
- utfchars[concat(stream)] = uchar
- end
+ local mapping = { }
+ for k, v in next, vector do
+ local split = totable(v)
+ for i=1,#split do
+ split[i] = utfchar(byte(split[i]))
end
- end
- p = P(false)
- for k, v in next, firsts do
- local q = P(false)
- for i=1,#v do
- q = q + P(v[i])
+ split = concat(split)
+ if v ~= split then
+ mapping[split] = v
end
- p = p + P(k) * q
end
- p = Cs(((p+1)/utfchars)^1)
- -- lpeg.print(p) -- size: 1042
+ p = Cs((lpeg.utfchartabletopattern(mapping)/mapping+P(1))^0)
else
p = false
end
@@ -361,28 +428,9 @@ function regimes.cleanup(regime,str)
return p and lpegmatch(p,str) or str
end
--- local map = require("regi-cp1252")
-- local old = [[test ë ä ö ü crap]]
--- local new = correctencoding(map,old)
---
--- print(old,new)
-
--- obsolete:
---
--- function regimes.setsynonym(synonym,target)
--- synonyms[synonym] = target
--- end
---
--- function regimes.truename(regime)
--- return regime and synonyms[regime] or regime or currentregime
--- end
---
--- commands.setregimesynonym = regimes.setsynonym
---
--- function commands.trueregimename(regime)
--- context(regimes.truename(regime))
--- end
---
--- function regimes.load(regime)
--- return mapping[synonyms[regime] or regime]
--- end
+-- local new = regimes.cleanup("cp1252",old)
+-- report_translating("%s -> %s",old,new)
+-- local old = "Pozn" .. char(0xE1) .. "mky"
+-- local new = fromregime("cp1250",old)
+-- report_translating("%s -> %s",old,new)
diff --git a/Master/texmf-dist/tex/context/base/regi-ini.mkiv b/Master/texmf-dist/tex/context/base/regi-ini.mkiv
index 651e2f13cb1..6190393d804 100644
--- a/Master/texmf-dist/tex/context/base/regi-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/regi-ini.mkiv
@@ -16,34 +16,18 @@
\unprotect
%D \macros
-%D {enableregime,disableregime,currentregime}
+%D {enableregime,disableregime,
+%D startregime,stopregime,
+%D currentregime}
%D
%D Beware, the enable and disable commands are global switches, so
%D best use the start|/|stop commands.
-\unexpanded\def\enableregime[#1]{\ctxcommand{enableregime("#1")}}
-\unexpanded\def\disableregime {\ctxcommand{disableregime()}}
-\unexpanded\def\startregime [#1]{\ctxcommand{startregime("#1")}}
-\unexpanded\def\stopregime {\ctxcommand{stopregime()}}
- \def\currentregime {\ctxcommand{currentregime()}}
+\let\currentregime\empty
-% D \macros
-% D {defineregimesynonym,trueregimename}
-%
-% \unexpanded\def\defineregimesynonym % more or less obsolete
-% {\dodoubleargument\dodefineregimesynonym}
-%
-% \def\dodefineregimesynonym[#1][#2]%
-% {\ctxcommand{setregimesynonym("#1","#2")}}
-%
-% \def\trueregimename#1%
-% {\ctxcommand{trueregimename("#1")}}
-
-% D \macros
-% D {useregime}
-% D
-% D This one is sort of obsolete but we keep them around.
-
-\unexpanded\def\useregime[#1]{}
+\unexpanded\def\enableregime[#1]{\clf_enableregime{#1}}
+\unexpanded\def\disableregime {\clf_disableregime}
+\unexpanded\def\startregime [#1]{\clf_startregime{#1}}
+\unexpanded\def\stopregime {\clf_stopregime}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/regi-pdfdoc.lua b/Master/texmf-dist/tex/context/base/regi-pdfdoc.lua
new file mode 100644
index 00000000000..363d3ae0da3
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/regi-pdfdoc.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['regi-pdfdoc'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+return { [0] =
+ 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x0010,
+ 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x02D8, 0x02C7, 0x02C6, 0x02D9, 0x02DD, 0x02DB, 0x02DA, 0x02DC, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x0192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, 0x201D, 0x2018,
+ 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x0141, 0x0152, 0x0160, 0x0178, 0x017D, 0x0131, 0x0142, 0x0153, 0x0161, 0x017E, 0x009F,
+ 0x20AC, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0xFFFD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF,
+}
diff --git a/Master/texmf-dist/tex/context/base/s-abr-01.tex b/Master/texmf-dist/tex/context/base/s-abr-01.tex
index 733eebf7b95..00a1a5c1e2f 100644
--- a/Master/texmf-dist/tex/context/base/s-abr-01.tex
+++ b/Master/texmf-dist/tex/context/base/s-abr-01.tex
@@ -46,6 +46,7 @@
\logo [ARABTEX] {Arab\TeX}
\logo [ASCII] {ascii}
\logo [ASCIITEX] {ascii\TeX}
+\logo [ASCIIMATH] {AsciiMath}
\logo [BACHOTEX] {Bacho\TeX}
\logo [BIBTEX] {bib\TeX}
\logo [MLBIBTEX] {MLbib\TeX}
@@ -66,6 +67,8 @@
\logo [CMYK] {cmyk}
\logo [CODHOST] {CodHost}
\logo [CONTEXT] {\ConTeXt}
+\logo [CONTEXTWIKI] {\ConTeXt\ Wiki}
+\logo [CONTEXTGROUP] {\ConTeXt\ Group}
\logo [CSS] {css}
\logo [CTAN] {ctan}
\logo [CTXTOOLS] {ctxtools}
@@ -94,6 +97,7 @@
\logo [EMTEX] {em\TeX}
\logo [ENCODING] {enc}
\logo [ENCTEX] {enc\TeX}
+\logo [EPUB] {ePub}
\logo [EPS] {eps}
\logo [ETEX] {\eTeX}
\logo [EUROBACHOTEX] {EuroBacho\TeX}
@@ -235,6 +239,7 @@
\logo [SSD] {ssd}
\logo [SVG] {svg}
\logo [STIX] {Stix}
+\logo [SUMATRAPDF] {SumatraPDF}
\logo [SWIG] {swig}
\logo [SWIGLIB] {SwigLib}
\logo [TABLE] {\TaBlE}
@@ -262,6 +267,7 @@
\logo [TEXTOOLS] {\TeX tools}
\logo [TEXUTIL] {\TeX util}
\logo [TEXWORK] {\TeX work}
+\logo [TEXWORKS] {\TeX works}
\logo [TEXXET] {\TeX\XeT} \def\XeT{XeT}
\logo [TFM] {tfm}
\logo [TIF] {tif}
diff --git a/Master/texmf-dist/tex/context/base/s-art-01.mkiv b/Master/texmf-dist/tex/context/base/s-art-01.mkiv
index e2584a35784..601ee1adc80 100644
--- a/Master/texmf-dist/tex/context/base/s-art-01.mkiv
+++ b/Master/texmf-dist/tex/context/base/s-art-01.mkiv
@@ -2,7 +2,7 @@
\startmodule[art-01]
-\definemeasure [article:margin] [\paperheight/15]
+\definemeasure [article:margin] [\paperheight/20] % was 15, see xtables-mkiv for results
\definemeasure [overview:margin] [\paperheight/30]
\definelayout
@@ -10,7 +10,7 @@
[\c!topspace=\measure{article:margin},
\c!bottomspace=\measure{article:margin},
\c!backspace=\measure{article:margin},
- \c!header=\measure{overview:margin},
+ \c!header=\measure{article:margin},
\c!footer=0pt,
\c!width=\v!middle,
\c!height=\v!middle]
diff --git a/Master/texmf-dist/tex/context/base/s-figures-names.mkiv b/Master/texmf-dist/tex/context/base/s-figures-names.mkiv
new file mode 100644
index 00000000000..a2782efc95d
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-figures-names.mkiv
@@ -0,0 +1,99 @@
+%D \module
+%D [ file=s-figures-names.mkiv,
+%D version=2017.07.17,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Show Figure Names,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Normally this module will be run someplace at the end of a document in some kind of tracing
+%D mode. We could hook it into \type {\stoptext} but better leave it up to the user. Loading
+%D this module upfront will not show anything useful. The main reason for making this module
+%D was that we wanted to report weird figurenames: spaces, multiple hyphens in a row, mixed
+%D hyphens and underscores, inconsistently mixed upper and lowercase, etc.
+%D
+%D If you only want info in the logfile, you can use:
+%D
+%D \starttyping
+%D \enabletrackers[graphics.lognames]
+%D \stoptyping
+%D
+%D This directive is persistent and can be issued any time before the end of the run.
+
+\startmodule[figures-names]
+
+\startluacode
+
+local context = context
+local ctx_NC = context.NC
+local ctx_NR = context.NR
+local ctx_red = context.red
+local ctx_starttabulate = context.starttabulate
+local ctx_stoptabulate = context.stoptabulate
+local ctx_hyphenatedname = context.hyphenatedfilename
+
+trackers.enable("graphics.lognames")
+
+context.start()
+
+ context.switchtobodyfont { "tt,small" }
+
+ local template = { "|Bl|p|" }
+
+ for _, data in table.sortedhash(figures.found) do
+ ctx_starttabulate(template)
+ local badname = data.badname
+ local found = data.found
+ ctx_NC()
+ context("asked name")
+ ctx_NC()
+ if badname then
+ ctx_red()
+ end
+ context(data.askedname)
+ ctx_NC() ctx_NR()
+ if found then
+ ctx_NC()
+ context("format")
+ ctx_NC()
+ context(data.format)
+ ctx_NC() ctx_NR()
+ ctx_NC()
+ context("found file")
+ ctx_NC()
+ ctx_hyphenatedname(data.foundname)
+ -- context(data.foundname)
+ ctx_NC() ctx_NR()
+ ctx_NC()
+ context("used file")
+ ctx_NC()
+ ctx_hyphenatedname(data.fullname)
+ -- context(data.fullname)
+ ctx_NC() ctx_NR()
+ if badname then
+ ctx_NC()
+ context("comment")
+ ctx_NC()
+ context("bad name")
+ ctx_NC() ctx_NR()
+ end
+ else
+ ctx_NC()
+ context("comment")
+ ctx_NC()
+ context(data.comment or "not found")
+ ctx_NC() ctx_NR()
+ end
+ ctx_stoptabulate()
+ end
+
+context.stop()
+
+\stopluacode
+
+\stopmodule
diff --git a/Master/texmf-dist/tex/context/base/s-fnt-10.mkiv b/Master/texmf-dist/tex/context/base/s-fnt-10.mkiv
index 9b6211c2b57..2fe82e0794b 100644
--- a/Master/texmf-dist/tex/context/base/s-fnt-10.mkiv
+++ b/Master/texmf-dist/tex/context/base/s-fnt-10.mkiv
@@ -100,7 +100,7 @@ function fonts.tracers.show_glyphs()
end
\stopluacode
-\def\ShowCompleteFont#1#2#3%
+\unexpanded\def\ShowCompleteFont#1#2#3%
{\bgroup
\page
\font\TestFont=#1 at #2
@@ -118,7 +118,7 @@ end
\page
\egroup}
-\def\ShowAllGlyphs#1#2#3%
+\unexpanded\def\ShowAllGlyphs#1#2#3%
{\bgroup
\page
\def\showglyph##1{\dontleavehmode\strut\char##1\relax\par}
diff --git a/Master/texmf-dist/tex/context/base/s-fnt-21.mkiv b/Master/texmf-dist/tex/context/base/s-fnt-21.mkiv
index 588c9801676..10d5a462394 100644
--- a/Master/texmf-dist/tex/context/base/s-fnt-21.mkiv
+++ b/Master/texmf-dist/tex/context/base/s-fnt-21.mkiv
@@ -47,7 +47,7 @@
\endinput
-% \usemodule[fnt-20]
+% \usemodule[fnt-21]
%
% \starttext
%
diff --git a/Master/texmf-dist/tex/context/base/s-fonts-coverage.lua b/Master/texmf-dist/tex/context/base/s-fonts-coverage.lua
index db47e57c43f..dd772d5f09b 100644
--- a/Master/texmf-dist/tex/context/base/s-fonts-coverage.lua
+++ b/Master/texmf-dist/tex/context/base/s-fonts-coverage.lua
@@ -29,6 +29,7 @@ function moduledata.fonts.coverage.showcomparison(specification)
local present = { }
local names = { }
local files = { }
+ local chars = { }
if not pattern then
-- skip
@@ -56,6 +57,7 @@ function moduledata.fonts.coverage.showcomparison(specification)
end
names[#names+1] = fontname
files[#files+1] = fontfile
+ chars[#names] = fontdata.characters
end
end
@@ -91,7 +93,11 @@ function moduledata.fonts.coverage.showcomparison(specification)
NR()
HL()
for k, v in table.sortedpairs(present) do
- if k > 0 then
+ if k <= 0 then
+ -- ignore
+ elseif k >= 0x110000 then
+ logs.report("warning","weird character %U",k)
+ else
local description = chardata[k].description
if not pattern or (pattern == k) or (description and lpegmatch(pattern,description)) then
NC()
@@ -99,7 +105,11 @@ function moduledata.fonts.coverage.showcomparison(specification)
NC()
for i=1,#names do
getvalue(names[i])
- char(k)
+ if chars[i][k] then
+ char(k)
+ else
+ -- missing
+ end
NC()
end
context(description)
diff --git a/Master/texmf-dist/tex/context/base/s-fonts-ligatures.mkiv b/Master/texmf-dist/tex/context/base/s-fonts-ligatures.mkiv
new file mode 100644
index 00000000000..e6ff2461e8c
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-fonts-ligatures.mkiv
@@ -0,0 +1,292 @@
+%D \module
+%D [ file=s-fonts-ligatures,
+%D version=2014.12.14,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Show Fonts Ligatures,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% begin info
+%
+% title : show some ligature building in fonts
+%
+% comment : we trace some ligatures that have rather different implementations in fontss
+% status : experimental, used for luatex testing
+%
+% end info
+
+\definefontfeature
+ [otfligaturetest]
+ [analyze=off,
+ ccmp=yes, % brill uses that .. not really ligatures !
+ %clig=yes,
+ script=latn,
+ language=dflt]
+
+\hyphenation{xf-fi-a}
+\hyphenation{xff-i-b}
+\hyphenation{xffi-c}
+\hyphenation{xffid}
+
+\registerhyphenationexception[xf-fi-a]
+\registerhyphenationexception[xff-i-b]
+\registerhyphenationexception[xffi-c]
+\registerhyphenationexception[xffid]
+
+\starttexdefinition showotfligaturescaption #1
+ \bTD [align={flushleft,lohi},nx=3]
+ \nohyphens
+ \ttbf
+ #1
+ \eTD
+\stoptexdefinition
+
+\starttexdefinition showotfligatureslegend #1
+ \bTD [width=6em,align={flushleft,lohi}]
+ \nohyphens \ttxx original
+ \eTD
+ \bTD [width=6em,align={flushleft,lohi}]
+ \nohyphens \ttxx expanded
+ \eTD
+ \bTD [width=6em,align={flushleft,lohi}]
+ \nohyphens \ttxx traditional
+ \eTD
+\stoptexdefinition
+
+\starttexdefinition showotfligaturesline #1#2
+ \bTD[toffset=.5ex,frame=off]
+ \starthyphenation[#1]
+ \LigatureFont
+ \showfontkerns
+ \showdiscretionaries
+ \begstrut#2\endstrut
+ \par
+ \stophyphenation
+ \eTD
+\stoptexdefinition
+
+\def\showotfligaturescells{3}
+%def\showotfligaturesnx {12}
+%def\showotfligatureswidth{18em}
+\def\showotfligaturesnx {\the\numexpr 4*\showotfligaturescells}
+\def\showotfligatureswidth{\the\dimexpr6em*\showotfligaturescells}
+
+\starttexdefinition showotfligaturesbanner #1
+ \bTR[frame=off]
+ \bTD [nx=\showotfligaturesnx,width=\showotfligatureswidth,align={middle,lohi},height=4ex]
+ \tttf #1
+ \eTD
+ \eTR
+\stoptexdefinition
+
+\starttexdefinition showotfligaturescaptions #1
+ \bTR[height=3ex,align={middle,lohi},bottomframe=off]
+ \processcommalist[#1]\showotfligaturescaption
+ \eTR
+ \bTR[height=3ex,align={middle,lohi},topframe=off]
+ \processcommalist[#1]\showotfligatureslegend
+ \eTR
+\stoptexdefinition
+
+\starttexdefinition showotfligatureslineset #1
+ \showotfligaturesline{original} {#1}
+ \showotfligaturesline{expanded} {#1}
+ \showotfligaturesline{traditional}{#1}
+\stoptexdefinition
+
+
+\starttexdefinition showotfligaturesparagraphset #1
+ \showotfligatureslineset {
+ \hsize \zeropoint
+ \lefthyphenmin \plustwo
+ \righthyphenmin\plustwo
+ #1
+ }
+\stoptexdefinition
+
+\starttexdefinition showotfligaturesextremeset #1
+ \showotfligatureslineset {
+ \hsize \zeropoint
+ \lefthyphenmin \plusone
+ \righthyphenmin\plusone
+ #1
+ }
+\stoptexdefinition
+
+\starttexdefinition showotfligatureslines #1
+ \bTR[height=4ex,bottomframe=off]
+ \processcommalist[#1]\showotfligatureslineset
+ \eTR
+\stoptexdefinition
+
+\starttexdefinition showotfligaturesparagraphs #1
+ \bTR[topframe=off]
+ \processcommalist[#1]\showotfligaturesparagraphset
+ \eTR
+\stoptexdefinition
+
+\starttexdefinition showotfligaturesextremes #1
+ \bTR[topframe=off]
+ \processcommalist[#1]\showotfligaturesextremeset
+ \eTR
+\stoptexdefinition
+
+\starttexdefinition showotfligaturesdefaults
+ \bTR
+ \bTD [nx=\showotfligaturesnx,width=\showotfligatureswidth,align=middle,height=4ex,frame=off]
+ \start \LigatureFont fb \stop \quad
+ \start \LigatureFont ff \stop \quad
+ \start \LigatureFont fi \stop \quad
+ \start \LigatureFont fk \stop \quad
+ \start \LigatureFont fl \stop \quad
+ \start \LigatureFont ft \stop \quad
+ \start \LigatureFont ffb \stop \quad
+ \start \LigatureFont fff \stop \quad
+ \start \LigatureFont ffi \stop \quad
+ \start \LigatureFont ffl \stop \quad
+ \start \LigatureFont ffk \stop \quad
+ \start \LigatureFont fft \stop
+ \eTD
+ \eTR
+\stoptexdefinition
+
+\starttexdefinition showotfligaturesexample #1#2
+ \showotfligaturescaptions {#1}
+ \showotfligatureslines {#2}
+ \showotfligaturesparagraphs{#2}
+ \showotfligaturesextremes {#2}
+\stoptexdefinition
+
+% todo: n -> and split in lua
+
+\starttexdefinition showotfligaturesexamples
+ \showotfligaturesexample
+ {leafing,baffling,efficient,shifffahrt}
+ {leafing,baffling,efficient,shifffahrt}
+ \showotfligaturesexample
+ {offbeat,effect,ef-fective,ef\-fective}
+ {offbeat,effect,ef-fective,ef\-fective}
+ \showotfligaturesexample
+ {xf+fi+a,xff+i+b,xffi+c,xffid}
+ {xffia, xffib, xffic, xffid}
+\stoptexdefinition
+
+\starttexdefinition showotfligatures [#1]
+ \begingroup
+ \getdummyparameters[font=Regular,features=default,#1]
+ \definefont[LigatureFont][\dummyparameter{font}*\dummyparameter{features},otfligaturetest ht 2ex]
+ \bTABLE[leftframe=off,rightframe=off]
+ \showotfligaturesbanner{\dummyparameter{font} * \dummyparameter{features}}
+ \showotfligaturesdefaults
+ \showotfligaturesexamples
+ \eTABLE
+ \endgroup
+\stoptexdefinition
+
+\continueifinputfile{s-fonts-ligatures.mkiv}
+
+\starttext
+
+ \startTEXpage[offset=10pt] \showotfligatures[font=lmroman10-regular.otf, features=default] \stopTEXpage
+ \startTEXpage[offset=10pt] \showotfligatures[font=dejavu-serif.ttf, features=default] \stopTEXpage
+ \startTEXpage[offset=10pt] \showotfligatures[font=minionpro.otf, features=default] \stopTEXpage
+ \startTEXpage[offset=10pt] \showotfligatures[font=minionpro.otf, features=smallcaps] \stopTEXpage
+ \startTEXpage[offset=10pt] \showotfligatures[font=brill.otf, features=default] \stopTEXpage
+ \startTEXpage[offset=10pt] \showotfligatures[font=gentiumplus-r.ttf, features=default] \stopTEXpage
+ \startTEXpage[offset=10pt] \showotfligatures[font=cambria, features=default] \stopTEXpage
+
+\stoptext
+
+% \startluacode
+%
+% local f = fonts.hashes.identifiers[true]
+%
+% local sequences = f.resources.sequences
+% local descriptions = f.shared.rawdata.descriptions
+% local lookuptypes = f.resources.lookuptypes
+% local lookups = f.resources.lookups
+%
+% local ligatures = { "liga", "dlig", "rlig", "clig", "tlig", "ccmp" }
+% local found = { }
+%
+% for i=1,#sequences do
+% local sequence = sequences[i]
+% local features = sequence.features
+% for i=1,#ligatures do
+% local l = ligatures[i]
+% if features[l] then
+% local subtables = sequence.subtables
+% if subtables then
+% for i=1,#subtables do
+% local subtable = subtables[i]
+% local lookup = found[subtable]
+% if lookup then
+% lookup[l] = true
+% else
+% found[subtable] = { [l] = true }
+% end
+% end
+% end
+% end
+% end
+% end
+%
+% context.starttabulate { "|||T|T|T|" }
+%
+% local function flush(l,v,start,unicode,data,done)
+% local features = found[l]
+% if features then
+% local lookuptype = lookuptypes[l]
+% if lookuptype == "ligature" then
+% local t = { }
+% for i=1,#v do
+% t[i] = utf.char(v[i])
+% end
+% t = table.concat(t," ")
+% if not done[t] then
+% context.NC()
+% context(t)
+% context.NC()
+% context(utf.char(unicode))
+% context.NC()
+% context(" %t",table.sortedkeys(features))
+% context.NC()
+% local name = data.name
+% if name then
+% context(name)
+% end
+% context.NC()
+% context("%U",unicode)
+% context.NC()
+% context.NR()
+% done[t] = true
+% end
+% end
+% end
+% end
+%
+% for unicode, data in table.sortedhash(descriptions) do
+% local slookups = data.slookups
+% local mlookups = data.mlookups
+% local done = { }
+% if slookups then
+% for l, v in next, slookups do
+% flush(l,v,1,unicode,data,done)
+% end
+% end
+% if mlookups then
+% for i=1,#mlookups do
+% local v = mlookups[i]
+% flush(v[1],v,2,unicode,data,done)
+% end
+% end
+% end
+%
+% context.stoptabulate()
+%
+% \stopluacode
diff --git a/Master/texmf-dist/tex/context/base/s-fonts-shapes.lua b/Master/texmf-dist/tex/context/base/s-fonts-shapes.lua
index b387c11ddd7..bca860f3fb8 100644
--- a/Master/texmf-dist/tex/context/base/s-fonts-shapes.lua
+++ b/Master/texmf-dist/tex/context/base/s-fonts-shapes.lua
@@ -16,24 +16,32 @@ local NC, NR = context.NC, context.NR
local space, dontleavehmode, glyph, getvalue = context.space, context.dontleavehmode, context.glyph, context.getvalue
local formatters = string.formatters
-function moduledata.fonts.shapes.showlist(specification) -- todo: ranges
- specification = interfaces.checkedspecification(specification)
- local id, cs = fonts.definers.internal(specification,"<module:fonts:shapes:font>")
- local chrs = fontdata[id].characters
- function char(k)
- dontleavehmode()
- glyph(id,k)
- end
- local function special(v)
- local specials = v.specials
- if specials and #specials > 1 then
- context("%s:",specials[1])
+function char(id,k)
+ dontleavehmode()
+ glyph(id,k)
+end
+
+local function special(id,specials)
+ if specials and #specials > 1 then
+ context("%s:",specials[1])
+ if #specials > 5 then
+ space() char(id,specials[2])
+ space() char(id,specials[3])
+ space() context("...")
+ space() char(id,specials[#specials-1])
+ space() char(id,specials[#specials])
+ else
for i=2,#specials do
- space()
- char(specials[i])
+ space() char(id,specials[i])
end
end
end
+end
+
+function moduledata.fonts.shapes.showlist(specification) -- todo: ranges
+ specification = interfaces.checkedspecification(specification)
+ local id, cs = fonts.definers.internal(specification,"<module:fonts:shapes:font>")
+ local chrs = fontdata[id].characters
context.begingroup()
context.tt()
context.starttabulate { "|l|c|c|c|c|l|l|" }
@@ -50,11 +58,11 @@ function moduledata.fonts.shapes.showlist(specification) -- todo: ranges
for k, v in next, characters.data do
if chrs[k] then
NC() context("0x%05X",k)
- NC() char(k) -- getvalue(cs) context.char(k)
- NC() char(v.shcode)
- NC() char(v.lccode or k)
- NC() char(v.uccode or k)
- NC() special(v)
+ NC() char(id,k) -- getvalue(cs) context.char(k)
+ NC() char(id,v.shcode)
+ NC() char(id,v.lccode or k)
+ NC() char(id,v.uccode or k)
+ NC() special(id,v.specials)
NC() context.tx(v.description)
NC() NR()
end
@@ -67,20 +75,6 @@ function moduledata.fonts.shapes.showlist(specification) -- todo: ranges
specification = interfaces.checkedspecification(specification)
local id, cs = fonts.definers.internal(specification,"<module:fonts:shapes:font>")
local chrs = fontdata[id].characters
- function char(k)
- dontleavehmode()
- glyph(id,k)
- end
- local function special(v)
- local specials = v.specials
- if specials and #specials > 1 then
- context("%s:",specials[1])
- for i=2,#specials do
- space()
- char(specials[i])
- end
- end
- end
context.begingroup()
context.tt()
context.starttabulate { "|l|c|c|c|c|l|l|" }
@@ -97,11 +91,11 @@ function moduledata.fonts.shapes.showlist(specification) -- todo: ranges
for k, v in next, characters.data do
if chrs[k] then
NC() context("0x%05X",k)
- NC() char(k)
- NC() char(v.shcode)
- NC() char(v.lccode or k)
- NC() char(v.uccode or k)
- NC() special(v)
+ NC() char(id,k)
+ NC() char(id,v.shcode)
+ NC() char(id,v.lccode or k)
+ NC() char(id,v.uccode or k)
+ NC() special(id,v.specials)
NC() context.tx(v.description)
NC() NR()
end
@@ -137,7 +131,8 @@ local function showglyphshape(specification)
local top_accent, bot_accent = (d.top_accent or 0)*factor, (d.bot_accent or 0)*factor
local anchors, math = d.anchors, d.math
context.startMPcode()
- context("pickup pencircle scaled .25bp ;")
+ context("numeric lw ; lw := .125bp ;")
+ context("pickup pencircle scaled lw ;")
context('picture p ; p := image(draw textext.drt("\\getuvalue{%s}\\gray\\char%s");); draw p ;',cs,charnum)
context('draw (%s,%s)--(%s,%s)--(%s,%s)--(%s,%s)--cycle withcolor green ;',llx,lly,urx,lly,urx,ury,llx,ury)
context('draw (%s,%s)--(%s,%s) withcolor green ;',llx,0,urx,0)
@@ -153,11 +148,11 @@ local function showglyphshape(specification)
l[#l+1] = formatters["((%s,%s) shifted (%s,%s))"](xsign*k*factor,ysign*h*factor,dx,dy)
end
end
- context("draw ((%s,%s) shifted (%s,%s))--%s dashed (evenly scaled .25) withcolor .5white;", xsign*v[1].kern*factor,lly,dx,dy,l[1])
+ context("draw ((%s,%s) shifted (%s,%s))--%s dashed (evenly scaled 1/16) withcolor .5white;", xsign*v[1].kern*factor,lly,dx,dy,l[1])
context("draw laddered (%s) withcolor .5white ;",table.concat(l,".."))
- context("draw ((%s,%s) shifted (%s,%s))--%s dashed (evenly scaled .25) withcolor .5white;", xsign*v[#v].kern*factor,ury,dx,dy,l[#l])
+ context("draw ((%s,%s) shifted (%s,%s))--%s dashed (evenly scaled 1/16) withcolor .5white;", xsign*v[#v].kern*factor,ury,dx,dy,l[#l])
for k, v in ipairs(l) do
- context("draw %s withcolor blue withpen pencircle scaled 1bp;",v)
+ context("draw %s withcolor blue withpen pencircle scaled 2lw ;",v)
end
end
end
@@ -203,7 +198,7 @@ local function showglyphshape(specification)
end
local function show(x,y,txt)
local xx, yy = x*factor, y*factor
- context("draw (%s,%s) withcolor blue withpen pencircle scaled 1bp;",xx,yy)
+ context("draw (%s,%s) withcolor blue withpen pencircle scaled 2lw ;",xx,yy)
context('label.top("\\type{%s}",(%s,%s-2bp)) ;',txt,xx,yy)
context('label.bot("(%s,%s)",(%s,%s+2bp)) ;',x,y,xx,yy)
end
@@ -242,9 +237,9 @@ local function showglyphshape(specification)
end
end
if italic ~= 0 then
- context('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue;',width,ury,width,ury)
- context('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue;',width+italic,ury,width+italic,ury)
- context('draw (%s,%s-1bp)--(%s,%s-1bp) withcolor blue;',width,ury,width+italic,ury)
+ context('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue ;',width,ury,width,ury)
+ context('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue ;',width+italic,ury,width+italic,ury)
+ context('draw (%s,%s-1bp)--(%s,%s-1bp) withcolor blue ;',width,ury,width+italic,ury)
context('label.lft("\\type{%s}",(%s+2bp,%s-1bp));',"italic",width,ury)
context('label.rt("%s",(%s-2bp,%s-1bp));',d.italic,width+italic,ury)
end
@@ -258,7 +253,7 @@ local function showglyphshape(specification)
context('label.top("\\type{%s}",(%s,%s-1bp));',"bot_accent",top_accent,ury)
context('label.bot("%s",(%s,%s+1bp));',d.bot_accent,bot_accent,lly)
end
- context('draw origin withcolor red withpen pencircle scaled 1bp;')
+ context('draw origin withcolor red withpen pencircle scaled 2lw;')
context("setbounds currentpicture to boundingbox currentpicture enlarged 1bp ;")
context("currentpicture := currentpicture scaled 8 ;")
context.stopMPcode()
diff --git a/Master/texmf-dist/tex/context/base/s-fonts-tables.lua b/Master/texmf-dist/tex/context/base/s-fonts-tables.lua
index 5c91d5ee72c..b3dac7d0630 100644
--- a/Master/texmf-dist/tex/context/base/s-fonts-tables.lua
+++ b/Master/texmf-dist/tex/context/base/s-fonts-tables.lua
@@ -21,6 +21,12 @@ local digits = {
dflt = {
dflt = "1234567890 1/2",
},
+ arab = {
+ dflt = "",
+ },
+ latn = {
+ dflt = "1234567890 1/2",
+ }
}
local punctuation = {
@@ -65,6 +71,9 @@ local lowercase = {
cyrl= {
dflt = "абвгдежзиійклмнопрстуфхцчшщъыьѣэюяѳ"
},
+ arab = {
+ dflt = "ابجدهوزحطيكلمنسعفصقرشتثخذضظغ"
+ },
}
local samples = {
diff --git a/Master/texmf-dist/tex/context/base/s-inf-01.mkvi b/Master/texmf-dist/tex/context/base/s-inf-01.mkvi
index 8263413ace3..2c0c1681e12 100644
--- a/Master/texmf-dist/tex/context/base/s-inf-01.mkvi
+++ b/Master/texmf-dist/tex/context/base/s-inf-01.mkvi
@@ -126,6 +126,8 @@
return max, what, function(n) return (max == 0 and 0) or (n == 0 and 0) or n/max end
end
+ local f_norm = string.formatters["%0.3f"]
+
function document.context_state_1(what)
local max, what, norm = prepare(what)
context.starttabulate { "|Tl|T|T|T|T|T|" }
@@ -154,9 +156,15 @@
(used.mkvi[k] and "vi") or "~~",
k
)
+ -- context("%s\\enspace %s\\quad %s\\quad %s",
+ -- (used.mkii[k] and "ii") or "\\quad",
+ -- (used.mkiv[k] and "iv") or "\\quad",
+ -- (used.mkvi[k] and "vi") or "\\quad",
+ -- k
+ -- )
context.NC()
for i=1,#types do
- context.Bar(types[i],v[i],c[i],norm(v[i]))
+ context.Bar(types[i],v[i],c[i],f_norm(norm(v[i])))
context.NC()
end
context.NR()
@@ -170,7 +178,7 @@
local c = (what == size and comp[k]) or nope
context.StartUp(k)
for i=1,#types do
- context.Up(types[i],norm(v[i]))
+ context.Up(types[i],f_norm(norm(v[i])))
end
context.StopUp()
end
diff --git a/Master/texmf-dist/tex/context/base/s-inf-03.mkiv b/Master/texmf-dist/tex/context/base/s-inf-03.mkiv
index 48449d6900b..a253bed773c 100644
--- a/Master/texmf-dist/tex/context/base/s-inf-03.mkiv
+++ b/Master/texmf-dist/tex/context/base/s-inf-03.mkiv
@@ -8,7 +8,7 @@
\setupbodyfont[dejavu]
-\doifmodeelse {tablet} {
+\doifelsemode {tablet} {
\setuppapersize
[S6,landscape]
@@ -159,16 +159,16 @@ local skipglobal = table.tohash {
"_G", "_M", "_ENV", "",
"context", "modules", "global", "arg", "utf", 1,
"_ptbs_", "_pcol_", "_plib_", "_clib_", "_tlib_",
- "kpse",
+ "kpse", "commands",
}
local skipkeys = table.tohash {
"_pcol_", "_plib_", "_clib_", "_tlib_", "_bpnf_", "_ptbs_",
- "_cldf_", "_cldn_",
+ "_cldf_", "_cldn_", "_cldo_",
"_clmb_", "_clme_", "_clmm_", "_clmn_", "_clma_", "_clmh_",
"_G", "_M", "_ENV", "",
+ -- "global", "shortcuts",
"_VERSION", "_COPYRIGHT", "_DESCRIPTION", "_NAME", "_PACKAGE", "__unload",
-
}
local sameglobal = {
@@ -196,6 +196,8 @@ local variant = 1 -- all parents
local variant = 2 -- parent name too
local variant = 3 -- no parents
+local done = { }
+
local function childtables(key,tab,handler,depth)
depth = depth or 1
local keys = sortedkeys(tab) -- no sorted_pairs
@@ -214,6 +216,10 @@ local function childtables(key,tab,handler,depth)
t = "data"
handler(s,t,depth)
else
+if done[v] then
+ -- logs.report("inf-03","key %a in %a already done",k,v)
+else
+ done[v] = true
handler(s,t,depth)
if variant == 3 then
childtables(false,v,handler,depth+1)
@@ -223,6 +229,7 @@ local function childtables(key,tab,handler,depth)
childtables(s,v,handler,depth+1)
end
end
+end
else
handler(s,t,depth)
end
@@ -245,6 +252,7 @@ end
local function show(title,subtitle,alias,builtin,t,lib,libcolor,glo,glocolor,mark,obsolete)
-- todo: table as argument
+-- print(title,subtitle,alias,builtin,t,lib,libcolor,glo,glocolor,mark,obsolete)
local keys = sortedkeys(t) -- no sorted_pairs
if #keys > 0 then
local fulltitle = title
@@ -341,6 +349,8 @@ end
show("global","",sameglobal.global,false,_G,builtin,"darkgreen",globals,"darkblue",false,obsolete)
+-- inspect(table.sortedkeys(context))
+
for k, v in table.sortedpairs(_G) do
if not skipglobal[k] and not obsolete[k] and type(v) == "table" and not marked(v) then
@@ -351,7 +361,8 @@ for k, v in table.sortedpairs(_G) do
elseif extralua[k] then show(k,"extra lua",sameglobal[k],extralua[k],v,builtin[k],"darkred", false,false,true)
elseif basictex[k] then show(k,"basic tex",sameglobal[k],basictex[k],v,builtin[k],"darkred", false,false,true)
elseif extratex[k] then show(k,"extra tex",sameglobal[k],extratex[k],v,builtin[k],"darkred", false,false,true)
- else show(k,"context", sameglobal[k],false, v,builtin[k],"darkyellow",false,false,true)
+ else
+ show(k,"context", sameglobal[k],false, v,builtin[k],"darkyellow",false,false,true)
end
end
end
diff --git a/Master/texmf-dist/tex/context/base/s-languages-hyphenation.lua b/Master/texmf-dist/tex/context/base/s-languages-hyphenation.lua
index c16c5bd2d94..c5a4f91f1e9 100644
--- a/Master/texmf-dist/tex/context/base/s-languages-hyphenation.lua
+++ b/Master/texmf-dist/tex/context/base/s-languages-hyphenation.lua
@@ -13,8 +13,8 @@ local a_colormodel = attributes.private('colormodel')
local nodecodes = nodes.nodecodes
local nodepool = nodes.pool
-local disc = nodecodes.disc
-local glyph = nodecodes.glyph
+local disc_code = nodecodes.disc
+local glyph_code = nodecodes.glyph
local emwidths = fonts.hashes.emwidths
local exheights = fonts.hashes.exheights
local newkern = nodepool.kern
@@ -23,7 +23,7 @@ local newglue = nodepool.glue
local insert_node_after = node.insert_after
local traverse_by_id = node.traverse_id
-local hyphenate = lang.hyphenate
+local hyphenate = languages.hyphenators.handler -- lang.hyphenate
local find_tail = node.tail
local remove_node = nodes.remove
@@ -36,11 +36,11 @@ local function identify(head,marked)
while current do
local id = current.id
local next = current.next
- if id == disc then
- if prev and next.id == glyph then -- catch other usage of disc
+ if id == disc_code then
+ if prev and next then -- and next.id == glyph_code then -- catch other usage of disc
marked[#marked+1] = prev
end
- elseif id == glyph then
+ elseif id == glyph_code then
prev = current
end
current = next
@@ -81,10 +81,10 @@ function moduledata.languages.hyphenation.showhyphens(head)
local m = { }
local l = langs[i]
marked[i] = m
- for n in traverse_by_id(glyph,head) do
+ for n in traverse_by_id(glyph_code,head) do
n.lang = l
end
- hyphenate(head,find_tail(head))
+ languages.hyphenators.methods.original(head)
identify(head,m)
strip(head,m)
end
diff --git a/Master/texmf-dist/tex/context/base/s-languages-hyphenation.mkiv b/Master/texmf-dist/tex/context/base/s-languages-hyphenation.mkiv
index 769c3d05904..6662dbf2f32 100644
--- a/Master/texmf-dist/tex/context/base/s-languages-hyphenation.mkiv
+++ b/Master/texmf-dist/tex/context/base/s-languages-hyphenation.mkiv
@@ -26,7 +26,7 @@
{\begingroup
\par
% \language\zerocount
- \setupalign[\v!nothyphenated]%
+ % \setupalign[\v!nothyphenated]%
\ctxlua{moduledata.languages.hyphenation.startcomparepatterns("#1")}}
\unexpanded\def\stopcomparepatterns
@@ -56,13 +56,15 @@
\starttext
+\def|#1|{-}
+
\startsubject{Normal text}
\input tufte
\stopsubject
\startsubject{Compare hyphenation points of \showcomparepatternslegend[en,de]}
\startcomparepatterns
- \input tufte \quad (\showcomparepatternslegend)
+ \input tufte \quad (\showcomparepatternslegend)
\stopcomparepatterns
\stopsubject
diff --git a/Master/texmf-dist/tex/context/base/s-languages-system.lua b/Master/texmf-dist/tex/context/base/s-languages-system.lua
index 5afc4d4036f..3b422db9f2e 100644
--- a/Master/texmf-dist/tex/context/base/s-languages-system.lua
+++ b/Master/texmf-dist/tex/context/base/s-languages-system.lua
@@ -10,26 +10,53 @@ moduledata.languages = moduledata.languages or { }
moduledata.languages.system = moduledata.languages.system or { }
local NC, NR, HL = context.NC, context.NR, context.HL
+local sortedhash = table.sortedhash
+local registered = languages.registered
+local context = context
+local ctx_NC = context.NC
+local ctx_NR = context.NR
+local ctx_bold = context.bold
+
+function moduledata.languages.system.loadinstalled()
+ context.start()
+ for k, v in table.sortedhash(registered) do
+ context.language{ k }
+ end
+ context.stop()
+end
function moduledata.languages.system.showinstalled()
- local numbers = languages.numbers
- local registered = languages.registered
- context.starttabulate { "|r|l|l|l|l|" }
- NC() context("id")
- NC() context("tag")
- NC() context("synonyms")
- NC() context("parent")
- NC() context("loaded")
- NC() NR() HL()
- for i=1,#numbers do
- local tag = numbers[i]
- local data = registered[tag]
- NC() context(data.number)
- NC() context(tag)
- NC() context("% t",table.sortedkeys(data.synonyms))
- NC() context(data.parent)
- NC() context("%+t",table.sortedkeys(data.used))
- NC() NR()
+ --
+ context.starttabulate { "|l|r|l|l|p(7em)|r|p|" }
+ context.FL()
+ ctx_NC() ctx_bold("tag")
+ ctx_NC() ctx_bold("n")
+ ctx_NC() ctx_bold("parent")
+ ctx_NC() ctx_bold("file")
+ ctx_NC() ctx_bold("synonyms")
+ ctx_NC() ctx_bold("patterns")
+ ctx_NC() ctx_bold("characters")
+ ctx_NC() ctx_NR()
+ context.FL()
+ for k, v in sortedhash(registered) do
+ local parent = v.parent
+ local resources = v.resources
+ local patterns = resources and resources.patterns
+ ctx_NC() context(k)
+ ctx_NC() context(v.number)
+ ctx_NC() context(v.parent)
+ ctx_NC() context(v.patterns)
+ ctx_NC() for k, v in sortedhash(v.synonyms) do context("%s\\par",k) end
+ if patterns then
+ ctx_NC() context(patterns.n)
+ ctx_NC() context("% t",utf.split(patterns.characters))
+ else
+ ctx_NC()
+ ctx_NC()
+ end
+ ctx_NC() ctx_NR()
end
+ context.LL()
context.stoptabulate()
+ --
end
diff --git a/Master/texmf-dist/tex/context/base/s-languages-system.mkiv b/Master/texmf-dist/tex/context/base/s-languages-system.mkiv
index 36372037433..22991f264f8 100644
--- a/Master/texmf-dist/tex/context/base/s-languages-system.mkiv
+++ b/Master/texmf-dist/tex/context/base/s-languages-system.mkiv
@@ -16,6 +16,7 @@
\registerctxluafile{s-languages-system}{}
\installmodulecommandluasingle \showinstalledlanguages {moduledata.languages.system.showinstalled}
+\installmodulecommandluasingle \loadinstalledlanguages {moduledata.languages.system.loadinstalled}
\stopmodule
@@ -25,6 +26,7 @@
\starttext
+ \loadinstalledlanguages
\showinstalledlanguages
\stoptext
diff --git a/Master/texmf-dist/tex/context/base/s-languages-words.lua b/Master/texmf-dist/tex/context/base/s-languages-words.lua
new file mode 100644
index 00000000000..ea7aee87bcd
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-languages-words.lua
@@ -0,0 +1,32 @@
+if not modules then modules = { } end modules ['s-languages-words'] = {
+ version = 1.001,
+ comment = "companion to s-languages-words.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+moduledata.languages = moduledata.languages or { }
+moduledata.languages.words = moduledata.languages.words or { }
+
+function moduledata.languages.words.showwords(specification)
+ local filename = specification.filename or file.addsuffix(tex.jobname,"words")
+ if lfs.isfile(filename) then
+ local w = dofile(filename)
+ if w then
+ -- table.print(w)
+ for cname, category in table.sortedpairs(w.categories) do
+ for lname, language in table.sortedpairs(category.languages) do
+ context.bold(string.format("category: %s, language: %s, total: %s, unique: %s:",
+ cname, lname, language.total or 0, language.unique or 0)
+ )
+ for word, n in table.sortedpairs(language.list) do
+ context(" %s (%s)",word,n)
+ end
+ context.par()
+ end
+ end
+ end
+ end
+end
+
diff --git a/Master/texmf-dist/tex/context/base/s-languages-words.mkiv b/Master/texmf-dist/tex/context/base/s-languages-words.mkiv
new file mode 100644
index 00000000000..4e350bf34d2
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-languages-words.mkiv
@@ -0,0 +1,22 @@
+%D \module
+%D [ file=s-languages-words,
+%D version=2010.10.21,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Language Environment 3,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This is used in the test suite.
+
+\startmodule[languages-words]
+
+\registerctxluafile{s-languages-words}{}
+
+\installmodulecommandluasingle \showwords {moduledata.languages.words.showwords}
+
+\stopmodule
diff --git a/Master/texmf-dist/tex/context/base/s-map-10.mkiv b/Master/texmf-dist/tex/context/base/s-map-10.mkiv
index b1218f6e276..c7541babc81 100644
--- a/Master/texmf-dist/tex/context/base/s-map-10.mkiv
+++ b/Master/texmf-dist/tex/context/base/s-map-10.mkiv
@@ -172,7 +172,7 @@
\def\hfontii{\ssbf}
\def\hfontiii{\rm\it}
-\doifmodeelse{nosubsub}{%
+\doifelsemode{nosubsub}{%
\setuphead [section][%
style=\hfontii,
before={\blank[line]},
@@ -201,7 +201,7 @@
before={\blank[halfline]}%
]}
-\doifmodeelse{nosubsub}{%
+\doifelsemode{nosubsub}{%
\setuphead [subject][%
style=\hfontii,
before={\blank[halfline]},
@@ -348,10 +348,10 @@
#1]%
\doifnothing{\MapsPeriod}{%
\ifnum \normalmonth<6 \gdef\MapsPeriod{VOORJAAR}\else \gdef\MapsPeriod{NAJAAR}\fi}
- \doifinstringelse{oorjaar}{\MapsPeriod}{\gdef\MapsPeriod{VOORJAAR}}{}%
- \doifinstringelse{pring}{\MapsPeriod}{\gdef\MapsPeriod{VOORJAAR}}{}%
- \doifinstringelse{ajaar}{\MapsPeriod}{\gdef\MapsPeriod{NAJAAR}}{}%
- \doifinstringelse{utumn}{\MapsPeriod}{\gdef\MapsPeriod{NAJAAR}}{}%
+ \doifelseinstring{oorjaar}{\MapsPeriod}{\gdef\MapsPeriod{VOORJAAR}}{}%
+ \doifelseinstring{pring}{\MapsPeriod}{\gdef\MapsPeriod{VOORJAAR}}{}%
+ \doifelseinstring{ajaar}{\MapsPeriod}{\gdef\MapsPeriod{NAJAAR}}{}%
+ \doifelseinstring{utumn}{\MapsPeriod}{\gdef\MapsPeriod{NAJAAR}}{}%
\doifnothing{\MapsYear}{\gdef\MapsYear{\the\year}}%
\doifnothing{\MapsNumber}{%
\ifnum \normalmonth<6
@@ -441,9 +441,9 @@
%%%%%%%%%%%
-\doifmodeelse{onecolumn}{%
+\doifelsemode{onecolumn}{%
\setuplayout[width=340pt]
- \doifmodeelse{asym}{% one col, asymmetric
+ \doifelsemode{asym}{% one col, asymmetric
\setuplayout[backspace=187.3pt]%
\setuptyping [widetyping][oddmargin=-117pt]
\setuppagenumbering [alternative={singlesided,doublesided}]
diff --git a/Master/texmf-dist/tex/context/base/s-math-characters.lua b/Master/texmf-dist/tex/context/base/s-math-characters.lua
index b0a79fcb6e5..8ff3a8660df 100644
--- a/Master/texmf-dist/tex/context/base/s-math-characters.lua
+++ b/Master/texmf-dist/tex/context/base/s-math-characters.lua
@@ -16,23 +16,26 @@ local lower = string.lower
local utfchar = utf.char
local round = math.round
-local fontdata = fonts.hashes.identifiers
-local chardata = characters.data
+local fontdata = fonts.hashes.identifiers
+local chardata = characters.data
+local blocks = characters.blocks
local no_description = "no description, private to font"
-local limited = true
-local fillinthegaps = true
-local upperlimit = 0x0007F
-local upperlimit = 0xF0000
+local limited = true
+local fillinthegaps = true
+local upperlimit = 0x0007F
+local upperlimit = 0xF0000
-local f_unicode = string.formatters["%U"]
-local f_slot = string.formatters["%s/%0X"]
+local f_unicode = string.formatters["%U"]
+local f_slot = string.formatters["%s/%0X"]
function moduledata.math.characters.showlist(specification)
- specification = interfaces.checkedspecification(specification)
- local id = specification.number -- or specification.id
- local list = specification.list
+ specification = interfaces.checkedspecification(specification)
+ local id = specification.number -- or specification.id
+ local list = specification.list
+ local showvirtual = specification.virtual == "all"
+ local check = specification.check == "yes"
if not id then
id = font.current()
end
@@ -70,137 +73,170 @@ function moduledata.math.characters.showlist(specification)
names[k] = (name and file.basename(name)) or id
end
end
- context.showmathcharactersstart()
- for _, unicode in next, sorted do
- if not limited or unicode < upperlimit then
- local code = gaps[unicode] or unicode
- local char = characters[code]
- local desc = descriptions[code]
- local info = chardata[code]
- if char then
- local next_sizes = char.next
- local v_variants = char.vert_variants
- local h_variants = char.horiz_variants
- local commands = char.commands
- local slookups = desc and desc.slookups
- local mlookups = desc and desc.mlookups
- local mathclass = info.mathclass
- local mathspec = info.mathspec
- local mathsymbol = info.mathsymbol
- local description = info.description or no_description
- context.showmathcharactersstartentry()
- context.showmathcharactersreference(f_unicode(unicode))
- context.showmathcharactersentryhexdectit(f_unicode(code),code,lower(description))
- context.showmathcharactersentrywdhtdpic(round(char.width or 0),round(char.height or 0),round(char.depth or 0),round(char.italic or 0))
- if virtual and commands then
- local t = { }
- for i=1,#commands do
- local ci = commands[i]
- if ci[1] == "slot" then
- local fnt, idx = ci[2], ci[3]
- t[#t+1] = f_slot(names[fnt] or fnt,idx)
+ if check then
+ for k, v in table.sortedhash(blocks) do
+ if v.math then
+ local first = v.first
+ local last = v.last
+ local f, l = 0, 0
+ if first and last then
+ for unicode=first,last do
+ local code = gaps[unicode] or unicode
+ local char = characters[code]
+ if char and not (char.commands and not showvirtual) then
+ f = unicode
+ break
end
end
- if #t > 0 then
- context.showmathcharactersentryresource(concat(t,", "))
- end
- end
- if mathclass or mathspec then
- context.showmathcharactersstartentryclassspec()
- if mathclass then
- context.showmathcharactersentryclassname(mathclass,info.mathname or "no name")
- end
- if mathspec then
- for i=1,#mathspec do
- local mi = mathspec[i]
- context.showmathcharactersentryclassname(mi.class,mi.name or "no name")
+ for unicode=last,first,-1 do
+ local code = gaps[unicode] or unicode
+ local char = characters[code]
+ if char and not (char.commands and not showvirtual) then
+ l = unicode
+ break
end
end
- context.showmathcharactersstopentryclassspec()
+ context.showmathcharacterssetrange(k,f,l)
end
- if mathsymbol then
- context.showmathcharactersentrysymbol(f_unicode(mathsymbol),mathsymbol)
- end
- if next_sizes then
- local n, done = 0, { }
- context.showmathcharactersstartnext()
- while next_sizes do
- n = n + 1
- if done[next_sizes] then
- context.showmathcharactersnextcycle(n)
- break
- else
- done[next_sizes] = true
- context.showmathcharactersnextentry(n,f_unicode(next_sizes),next_sizes)
- next_sizes = characters[next_sizes]
- v_variants = next_sizes.vert_variants or v_variants
- h_variants = next_sizes.horiz_variants or h_variants
- if next_sizes then
- next_sizes = next_sizes.next
+ end
+ end
+ else
+ context.showmathcharactersstart()
+ for _, unicode in next, sorted do
+ if not limited or unicode < upperlimit then
+ local code = gaps[unicode] or unicode
+ local char = characters[code]
+ local desc = descriptions[code]
+ local info = chardata[code]
+ if char then
+ local commands = char.commands
+ if commands and not showvirtual then
+ -- skip
+ else
+ local next_sizes = char.next
+ local v_variants = char.vert_variants
+ local h_variants = char.horiz_variants
+ local slookups = desc and desc.slookups
+ local mlookups = desc and desc.mlookups
+ local mathclass = info.mathclass
+ local mathspec = info.mathspec
+ local mathsymbol = info.mathsymbol
+ local description = info.description or no_description
+ context.showmathcharactersstartentry()
+ context.showmathcharactersreference(f_unicode(unicode))
+ context.showmathcharactersentryhexdectit(f_unicode(code),code,lower(description))
+ context.showmathcharactersentrywdhtdpic(round(char.width or 0),round(char.height or 0),round(char.depth or 0),round(char.italic or 0))
+ if virtual and commands then
+ local t = { }
+ for i=1,#commands do
+ local ci = commands[i]
+ if ci[1] == "slot" then
+ local fnt, idx = ci[2], ci[3]
+ t[#t+1] = f_slot(names[fnt] or fnt,idx)
+ end
+ end
+ if #t > 0 then
+ context.showmathcharactersentryresource(concat(t,", "))
end
end
- end
- context.showmathcharactersstopnext()
- if h_variants or v_variants then
- context.showmathcharactersbetweennextandvariants()
- end
- end
- if h_variants then
- context.showmathcharactersstarthvariants()
- for i=1,#h_variants do -- we might go top-down in the original
- local vi = h_variants[i]
- context.showmathcharactershvariantsentry(i,f_unicode(vi.glyph),vi.glyph)
- end
- context.showmathcharactersstophvariants()
- elseif v_variants then
- context.showmathcharactersstartvvariants()
- for i=1,#v_variants do
- local vi = v_variants[#v_variants-i+1]
- context.showmathcharactersvvariantsentry(i,f_unicode(vi.glyph),vi.glyph)
- end
- context.showmathcharactersstopvvariants()
- end
- if slookups or mlookups then
- local variants = { }
- if slookups then
- for lookupname, lookupdata in next, slookups do
- local lookuptype = lookuptypes[lookupname]
- if lookuptype == "substitution" then
- variants[lookupdata] = "sub"
- elseif lookuptype == "alternate" then
- for i=1,#lookupdata do
- variants[lookupdata[i]] = "alt"
+ if mathclass or mathspec then
+ context.showmathcharactersstartentryclassspec()
+ if mathclass then
+ context.showmathcharactersentryclassname(mathclass,info.mathname or "no name")
+ end
+ if mathspec then
+ for i=1,#mathspec do
+ local mi = mathspec[i]
+ context.showmathcharactersentryclassname(mi.class,mi.name or "no name")
end
end
+ context.showmathcharactersstopentryclassspec()
end
- end
- if mlookups then
- for lookupname, lookuplist in next, mlookups do
- local lookuptype = lookuptypes[lookupname]
- for i=1,#lookuplist do
- local lookupdata = lookuplist[i]
- local lookuptype = lookuptypes[lookupname]
- if lookuptype == "substitution" then
- variants[lookupdata] = "sub"
- elseif lookuptype == "alternate" then
- for i=1,#lookupdata do
- variants[lookupdata[i]] = "alt"
+ if mathsymbol then
+ context.showmathcharactersentrysymbol(f_unicode(mathsymbol),mathsymbol)
+ end
+ if next_sizes then
+ local n, done = 0, { }
+ context.showmathcharactersstartnext()
+ while next_sizes do
+ n = n + 1
+ if done[next_sizes] then
+ context.showmathcharactersnextcycle(n)
+ break
+ else
+ done[next_sizes] = true
+ context.showmathcharactersnextentry(n,f_unicode(next_sizes),next_sizes)
+ next_sizes = characters[next_sizes]
+ v_variants = next_sizes.vert_variants or v_variants
+ h_variants = next_sizes.horiz_variants or h_variants
+ if next_sizes then
+ next_sizes = next_sizes.next
end
end
end
+ context.showmathcharactersstopnext()
+ if h_variants or v_variants then
+ context.showmathcharactersbetweennextandvariants()
+ end
end
+ if h_variants then
+ context.showmathcharactersstarthvariants()
+ for i=1,#h_variants do -- we might go top-down in the original
+ local vi = h_variants[i]
+ context.showmathcharactershvariantsentry(i,f_unicode(vi.glyph),vi.glyph)
+ end
+ context.showmathcharactersstophvariants()
+ elseif v_variants then
+ context.showmathcharactersstartvvariants()
+ for i=1,#v_variants do
+ local vi = v_variants[#v_variants-i+1]
+ context.showmathcharactersvvariantsentry(i,f_unicode(vi.glyph),vi.glyph)
+ end
+ context.showmathcharactersstopvvariants()
+ end
+ if slookups or mlookups then
+ local variants = { }
+ if slookups then
+ for lookupname, lookupdata in next, slookups do
+ local lookuptype = lookuptypes[lookupname]
+ if lookuptype == "substitution" then
+ variants[lookupdata] = "sub"
+ elseif lookuptype == "alternate" then
+ for i=1,#lookupdata do
+ variants[lookupdata[i]] = "alt"
+ end
+ end
+ end
+ end
+ if mlookups then
+ for lookupname, lookuplist in next, mlookups do
+ local lookuptype = lookuptypes[lookupname]
+ for i=1,#lookuplist do
+ local lookupdata = lookuplist[i]
+ local lookuptype = lookuptypes[lookupname]
+ if lookuptype == "substitution" then
+ variants[lookupdata] = "sub"
+ elseif lookuptype == "alternate" then
+ for i=1,#lookupdata do
+ variants[lookupdata[i]] = "alt"
+ end
+ end
+ end
+ end
+ end
+ context.showmathcharactersstartlookupvariants()
+ local i = 0
+ for variant, lookuptype in table.sortedpairs(variants) do
+ i = i + 1
+ context.showmathcharacterslookupvariant(i,f_unicode(variant),variant,lookuptype)
+ end
+ context.showmathcharactersstoplookupvariants()
+ end
+ context.showmathcharactersstopentry()
end
- context.showmathcharactersstartlookupvariants()
- local i = 0
- for variant, lookuptype in table.sortedpairs(variants) do
- i = i + 1
- context.showmathcharacterslookupvariant(i,f_unicode(variant),variant,lookuptype)
- end
- context.showmathcharactersstoplookupvariants()
end
- context.showmathcharactersstopentry()
end
end
+ context.showmathcharactersstop()
end
- context.showmathcharactersstop()
end
diff --git a/Master/texmf-dist/tex/context/base/s-math-characters.mkiv b/Master/texmf-dist/tex/context/base/s-math-characters.mkiv
index 1c415954453..3b273cb6c21 100644
--- a/Master/texmf-dist/tex/context/base/s-math-characters.mkiv
+++ b/Master/texmf-dist/tex/context/base/s-math-characters.mkiv
@@ -46,6 +46,7 @@
\let\showmathcharactersstartlookupvariants \relax
\let\showmathcharacterslookupvariant \gobblefourarguments
\let\showmathcharactersstoplookupvariants \relax
+ \let\showmathcharacterssetrange \gobblethreearguments
\stopsetups
@@ -126,15 +127,23 @@
\def\module_math_characters_show[#1]%
{\begingroup
- \getdummyparameters[\c!bodyfont=,\c!list=,\c!alternative=default,#1]%
+ \getdummyparameters
+ [\c!bodyfont=,
+ \c!list=,
+ \c!check=,
+ \c!alternative=default,
+ \c!option=\v!all,
+ #1]%
\directsetup{s-math-characters:\dummyparameter\c!alternative}%
\doifelsenothing{\dummyparameter\c!bodyfont}
{\definedfont[MathRoman*math-text]}
{\definedfont[\dummyparameter\c!bodyfont]}%
\dontcomplain
\ctxlua{moduledata.math.characters.showlist {
- number = false,
- list = "\dummyparameter\c!list",
+ number = false,
+ check = "\dummyparameter\c!check",
+ list = "\dummyparameter\c!list",
+ option = "\dummyparameter\c!option",
}}%
\endgroup}
diff --git a/Master/texmf-dist/tex/context/base/s-math-coverage.lua b/Master/texmf-dist/tex/context/base/s-math-coverage.lua
index 56880f76db0..3c6080dc36e 100644
--- a/Master/texmf-dist/tex/context/base/s-math-coverage.lua
+++ b/Master/texmf-dist/tex/context/base/s-math-coverage.lua
@@ -9,45 +9,50 @@ if not modules then modules = { } end modules ['s-math-coverage'] = {
local utfchar, utfbyte = utf.char, utf.byte
local formatters, lower = string.formatters, string.lower
local concat = table.concat
+local sortedhash = table.sortedhash
-moduledata.math = moduledata.math or { }
-moduledata.math.coverage = moduledata.math.coverage or { }
+moduledata.math = moduledata.math or { }
+moduledata.math.coverage = moduledata.math.coverage or { }
-local context = context
+local context = context
-local ctx_NC = context.NC
-local ctx_NR = context.NR
-local ctx_HL = context.HL
+local ctx_NC = context.NC
+local ctx_NR = context.NR
+local ctx_HL = context.HL
-local ctx_rawmathematics = context.formatted.rawmathematics
-local ctx_mathematics = context.formatted.mathematics
-local ctx_startimath = context.startimath
-local ctx_stopimath = context.stopimath
-local ctx_setmathattribute = context.setmathattribute
-local ctx_underbar = context.underbar
-local ctx_getglyph = context.getglyph
+local ctx_startmixedcolumns = context.startmixedcolumns
+local ctx_stopmixedcolumns = context.stopmixedcolumns
+local ctx_setupalign = context.setupalign
+local ctx_starttabulate = context.starttabulate
+local ctx_stoptabulate = context.stoptabulate
+local ctx_rawmathematics = context.formatted.rawmathematics
+local ctx_mathematics = context.formatted.mathematics
+local ctx_startimath = context.startimath
+local ctx_stopimath = context.stopimath
+local ctx_setmathattribute = context.setmathattribute
+local ctx_underbar = context.underbar
+local ctx_getglyph = context.getglyph
-local styles = mathematics.styles
-local alternatives = mathematics.alternatives
-local charactersets = mathematics.charactersets
+local styles = mathematics.styles
+local alternatives = mathematics.alternatives
+local charactersets = mathematics.charactersets
-local getboth = mathematics.getboth
-local remapalphabets = mathematics.remapalphabets
+local getboth = mathematics.getboth
+local remapalphabets = mathematics.remapalphabets
-local chardata = characters.data
-local superscripts = characters.superscripts
-local subscripts = characters.subscripts
+local chardata = characters.data
+local superscripts = characters.superscripts
+local subscripts = characters.subscripts
context.writestatus("math coverage","underline: not remapped")
function moduledata.math.coverage.showalphabets()
- context.starttabulate { "|lT|l|Tl|" }
+ ctx_starttabulate { "|lT|l|Tl|" }
for i=1,#styles do
local style = styles[i]
for i=1,#alternatives do
local alternative = alternatives[i]
- for i=1,#charactersets do
- local alphabet = charactersets[i]
+ for _, alphabet in sortedhash(charactersets) do
ctx_NC()
if i == 1 then
context("%s %s",style,alternative)
@@ -80,14 +85,14 @@ function moduledata.math.coverage.showalphabets()
end
end
end
- context.stoptabulate()
+ ctx_stoptabulate()
end
function moduledata.math.coverage.showcharacters()
- context.startmixedcolumns()
- context.setupalign { "nothyphenated" }
- context.starttabulate { "|T|i2|Tpl|" }
- for u, d in table.sortedhash(chardata) do
+ ctx_startmixedcolumns { balance = "yes" }
+ ctx_setupalign { "nothyphenated" }
+ ctx_starttabulate { "|T|i2|Tpl|" }
+ for u, d in sortedhash(chardata) do
local mathclass = d.mathclass
local mathspec = d.mathspec
if mathclass or mathspec then
@@ -110,15 +115,15 @@ function moduledata.math.coverage.showcharacters()
ctx_NR()
end
end
- context.stoptabulate()
- context.stopmixedcolumns()
+ ctx_stoptabulate()
+ ctx_stopmixedcolumns()
end
-- This is a somewhat tricky table as we need to bypass the math machinery.
function moduledata.math.coverage.showscripts()
- context.starttabulate { "|cT|c|cT|c|c|c|l|" }
- for k, v in table.sortedhash(table.merged(superscripts,subscripts)) do
+ ctx_starttabulate { "|cT|c|cT|c|c|c|l|" }
+ for k, v in sortedhash(table.merged(superscripts,subscripts)) do
local ck = utfchar(k)
local cv = utfchar(v)
local ss = superscripts[k] and "^" or "_"
@@ -131,14 +136,14 @@ function moduledata.math.coverage.showscripts()
ctx_NC() context(lower(chardata[k].description))
ctx_NC() ctx_NR()
end
- context.stoptabulate()
+ ctx_stoptabulate()
end
-- Handy too.
function moduledata.math.coverage.showbold()
- context.starttabulate { "|lT|cm|lT|cm|lT|" }
- for k, v in table.sortedhash(mathematics.boldmap) do
+ ctx_starttabulate { "|lT|cm|lT|cm|lT|" }
+ for k, v in sortedhash(mathematics.boldmap) do
ctx_NC() context("%U",k)
ctx_NC() context("%c",k)
ctx_NC() context("%U",v)
@@ -146,5 +151,47 @@ function moduledata.math.coverage.showbold()
ctx_NC() context(chardata[k].description)
ctx_NC() ctx_NR()
end
- context.stoptabulate()
+ ctx_stoptabulate()
end
+
+-- function moduledata.math.coverage.showentities()
+-- ctx_startmixedcolumns { balance = "yes" }
+-- ctx_starttabulate { "|Tl|c|Tl|" }
+-- for k, v in sortedhash(characters.entities) do
+-- local b = utf.byte(v)
+-- local d = chardata[b]
+-- local m = d.mathname
+-- local c = d.contextname
+-- local s = ((m and "\\"..m) or (c and "\\".. c) or v) .. "{}{}{}"
+-- ctx_NC()
+-- context("%U",b)
+-- ctx_NC()
+-- ctx_mathematics(s)
+-- ctx_NC()
+-- context(k)
+-- ctx_NC()
+-- ctx_NR()
+-- end
+-- ctx_stoptabulate()
+-- ctx_stopmixedcolumns()
+-- end
+
+function moduledata.math.coverage.showentities()
+ ctx_startmixedcolumns { balance = "yes" }
+ ctx_starttabulate { "|T||T|T|" }
+ for k, v in sortedhash(characters.entities) do
+ local d = chardata[v]
+ if d then
+ local m = d.mathclass or d.mathspec
+ local u = d.unicodeslot
+ ctx_NC() context(m and "m" or "t")
+ ctx_NC() ctx_getglyph("MathRoman",u)
+ ctx_NC() context("%05X",u)
+ ctx_NC() context(k)
+ ctx_NC() ctx_NR()
+ end
+ end
+ ctx_stoptabulate()
+ ctx_stopmixedcolumns()
+end
+
diff --git a/Master/texmf-dist/tex/context/base/s-math-coverage.mkiv b/Master/texmf-dist/tex/context/base/s-math-coverage.mkiv
index 9f084b2841c..e318c9effdd 100644
--- a/Master/texmf-dist/tex/context/base/s-math-coverage.mkiv
+++ b/Master/texmf-dist/tex/context/base/s-math-coverage.mkiv
@@ -15,10 +15,11 @@
\registerctxluafile{s-math-coverage}{}
-\installmodulecommandluasingle \showmathalphabets {moduledata.math.coverage.showalphabets}
-\installmodulecommandluasingle \showmathcharacters {moduledata.math.coverage.showcharacters}
-\installmodulecommandluasingle \showmathscripts {moduledata.math.coverage.showscripts}
-\installmodulecommandluasingle \showmathbold {moduledata.math.coverage.showbold}
+\installmodulecommandluasingle \showmathalphabets {moduledata.math.coverage.showalphabets}
+\installmodulecommandluasingle \showmathcharacters{moduledata.math.coverage.showcharacters}
+\installmodulecommandluasingle \showmathscripts {moduledata.math.coverage.showscripts}
+\installmodulecommandluasingle \showmathbold {moduledata.math.coverage.showbold}
+\installmodulecommandluasingle \showmathentities {moduledata.math.coverage.showentities}
\stopmodule
@@ -32,5 +33,6 @@
\showmathcharacters \page
\showmathscripts \page
\showmathbold \page
+ \showmathentities \page
\stoptext
diff --git a/Master/texmf-dist/tex/context/base/s-math-repertoire.mkiv b/Master/texmf-dist/tex/context/base/s-math-repertoire.mkiv
index 314d23868e5..230eb513ebe 100644
--- a/Master/texmf-dist/tex/context/base/s-math-repertoire.mkiv
+++ b/Master/texmf-dist/tex/context/base/s-math-repertoire.mkiv
@@ -39,7 +39,8 @@
% \setuplayout
% [page]
-\setuppapersize[HD+]
+\setuppapersize
+ [HD+]
\setuplayout
[backspace=0pt,
@@ -102,6 +103,16 @@
color=textcolor,
contrastcolor=nonecolor]
+\def\showmathcharacterssetrange#1#2#3%
+ {\writestatus{range}{#1: \unihex{#2} - \unihex{#3}}%
+ \ifcase#2\relax
+ \definereference[#1][notpresent]%
+ \else\ifcase#3\relax
+ \definereference[#1][notpresent]%
+ \else
+ \normalexpanded{\definereference[#1][\unihex{#2}]}%
+ \fi\fi}
+
\startinteractionmenu[bottom]
\startgot [firstpage] first \stopgot \quad
\startgot [deltapage(-100)] -100 \stopgot \quad
@@ -159,6 +170,22 @@
\startgot [U+1D7AA] grk ss bolditalic \stopgot
\stopinteractionmenu
+% \startinteractionmenu[symbols]
+% \startgot [U+00030] dig normal \stopgot \quad
+% \startgot [U+1D7CE] dig bold \stopgot \quad
+% \startgot [U+1D7D8] dig doublestruck \stopgot \quad
+% \startgot [U+1D7E2] dig ss normal \stopgot \quad
+% \startgot [U+1D7EC] dig ss bold \stopgot \quad
+% \startgot [U+1D7F6] dig monospace \stopgot \quad
+% \startgot [U+02200] operators \stopgot \quad
+% \startgot [U+02701] symbols a \stopgot \quad
+% \startgot [U+02901] symbols b \stopgot \quad
+% \startgot [U+02A00] supplemental \stopgot \quad
+% \startgot [U+027F0] arrows a \stopgot \quad
+% \startgot [U+02900] arrows b \stopgot \quad
+% \startgot [U+1F800] arrows c \stopgot
+% \stopinteractionmenu
+
\startinteractionmenu[symbols]
\startgot [U+00030] dig normal \stopgot \quad
\startgot [U+1D7CE] dig bold \stopgot \quad
@@ -167,9 +194,13 @@
\startgot [U+1D7EC] dig ss bold \stopgot \quad
\startgot [U+1D7F6] dig monospace \stopgot \quad
\startgot [U+02200] operators \stopgot \quad
- \startgot [U+02701] symbols a \stopgot \quad
- \startgot [U+02901] symbols b \stopgot \quad
- \startgot [U+02A00] supplemental \stopgot
+ \startgot [miscellaneousmathematicalsymbolsa] symbols a \stopgot \quad
+ \startgot [miscellaneousmathematicalsymbolsb] symbols b \stopgot \quad
+ \startgot [supplementalmathematicaloperators] supplemental \stopgot \quad
+ \startgot [supplementalarrowsa] arrows a \stopgot \quad
+ \startgot [supplementalarrowsb] arrows b \stopgot \quad
+ \startgot [supplementalarrowsc] arrows c \stopgot \quad
+ \removeunwantedspaces
\stopinteractionmenu
\defineframed
@@ -227,7 +258,7 @@
\showmathcharactersmth{10}{#1}%
\endgroup
\vfilll
- \doifmodeelse{crosslink}
+ \doifelsemode{crosslink}
{\goto{\strut\textcolor\showmathcharacterstxt{#2}}[#2::#1]}%
{\strut\textcolor\showmathcharacterstxt{#2}}}%
\hskip1ex}
@@ -404,13 +435,17 @@
% main
+% this is a one-run style so we can forget about an alternative
+% just assume that the previous definitions are global
+
\unprotect
\unexpanded\def\showmathfontrepertoire
{\dosingleempty\module_math_repertoire_show}
-\def\module_math_repertoire_show[#1]% % this is a one-run style so we can forget about an alternative
- {\showmathfontcharacters[\c!alternative=,#1]} % just assume that the previous definitions are global
+\def\module_math_repertoire_show[#1]%
+ {\showmathfontcharacters[alternative=,option=,check=yes,#1]
+ \showmathfontcharacters[alternative=,option=,#1]}
\protect
@@ -418,7 +453,7 @@
\continueifinputfile{s-math-repertoire.mkiv}
-\showmathcharacterssetbodyfonts{lucidanova,cambria,xits,modern,pagella,termes,bonum,schola}
+\showmathcharacterssetbodyfonts{lucidaot,cambria,xits,modern,pagella,termes,bonum,schola,dejavu}
\starttext
@@ -434,10 +469,11 @@
% \setupbodyfont[stix, 12pt]
% \setupbodyfont[xits, 12pt]
% \setupbodyfont[lucida, 12pt]
- % \setupbodyfont[lucidanova,12pt]
+ % \setupbodyfont[lucidaot, 12pt]
% \setupbodyfont[pagella, 12pt]
% \setupbodyfont[bonum, 12pt]
- \setupbodyfont[schola, 12pt]
+ % \setupbodyfont[schola, 12pt]
+ \setupbodyfont[dejavu, 12pt]
} {
diff --git a/Master/texmf-dist/tex/context/base/s-pre-17.mkiv b/Master/texmf-dist/tex/context/base/s-pre-17.mkiv
index 9505faa6b76..9c46b4ed7a4 100644
--- a/Master/texmf-dist/tex/context/base/s-pre-17.mkiv
+++ b/Master/texmf-dist/tex/context/base/s-pre-17.mkiv
@@ -194,7 +194,7 @@
\egroup
\setbox\scratchbox\vbox\bgroup
\vskip100pt
- \doifmodeelse {SpreadPage} {
+ \doifelsemode {SpreadPage} {
\hbox spread 200pt
} {
\hbox to \wd\scratchbox
diff --git a/Master/texmf-dist/tex/context/base/s-references-show.mkiv b/Master/texmf-dist/tex/context/base/s-references-show.mkiv
new file mode 100644
index 00000000000..72cccce54f1
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-references-show.mkiv
@@ -0,0 +1,132 @@
+%D \module
+%D [ file=s-references-show.mkiv,
+%D version=2015.04.13,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Reference Checking,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\startmodule[references-show]
+
+\unprotect
+
+% \enabletrackers[nodes.references,nodes.destinations] % also shows areas
+
+\enabletrackers[nodes.references.show,nodes.destinations.show]
+
+\enablehiddenbackground % trick
+
+\edef\hiddenbackgroundlist{\hiddenbackgroundlist,trace-references}
+
+\defineoverlay
+ [trace-references]
+ [\directsetup{trace:references:onpage}]
+
+\startluacode
+ local pagelist = structures.references.tracedpages
+
+ function commands.getreferencesonpage(n)
+ n = tonumber(n)
+ if n then
+ local pagedata = pagelist[n]
+ if pagedata then
+ context("%s references",#pagedata)
+ context.blank()
+ for i=1,#pagedata do
+ local details = pagedata[i]
+ local prefix = details[1]
+ local reference = details[2]
+ -- local internal = details[3]
+ -- context("%04i = %s : %s",internal,prefix == "" and "-" or prefix,reference)
+ context("%s : %s",prefix == "" and "-" or prefix,reference)
+ context.par()
+ end
+ else
+ context("no references")
+ end
+ else
+ context("no valid page")
+ end
+ end
+
+\stopluacode
+
+\definecolor
+ [trace:references:onpage]
+ [b=.5,a=1,t=.25]
+
+\defineframed
+ [trace:references:onpage]
+ [\c!offset=2\exheight,
+ %\c!foregroundstyle=\infofont,
+ \c!frame=\v!off,
+ \c!background=\v!color,
+ \c!backgroundcolor=trace:references:onpage,
+ \c!align=\v!normal]
+
+\startsetups trace:references:onpage
+ \vbox to \vsize \bgroup
+ \infofont
+ \vskip\dimexpr-\topspace-\headerheight+2\exheight\relax
+ \hbox to \hsize \bgroup
+ \doifoddpageelse\hss{\hskip\dimexpr-\cutspace+2\exheight\relax}%
+ \directlocalframed [
+ trace:references:onpage
+ ] {
+ \ctxcommand{getreferencesonpage(\the\realpageno)}
+ }
+ \doifoddpageelse{\hskip\dimexpr-\cutspace+2\exheight\relax}\hss
+ \egroup
+ \vss
+ \egroup
+\stopsetups
+
+\protect
+
+\continueifinputfile{s-references-show.mkiv}
+
+\usemodule[art-01]
+
+\setupinteraction
+ [state=start]
+
+\setuppagenumbering
+ [alternative=doublesided]
+
+\starttext
+
+\title {Contents}
+
+\placelist[chapter]
+
+\setupreferenceprefix[zero]
+
+\chapter[crap]{foo}
+
+\setupreferenceprefix[one]
+
+test \pagereference[whatever]
+
+\dorecurse{5}{
+ \placefigure
+ [here][bar 1.#1]
+ {xx}{\framed{xx #1}}
+}
+
+\setupreferenceprefix[two]
+
+\dorecurse{5}{
+ \placefigure
+ [here][bar 2.#1]
+ {xx}{\framed{xx #1}}
+}
+
+\in{checked}[bar 1.1]
+\in{checked}[bar 2.1]
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/s-structure-sections.mkiv b/Master/texmf-dist/tex/context/base/s-structure-sections.mkiv
new file mode 100644
index 00000000000..daaab5abcd0
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-structure-sections.mkiv
@@ -0,0 +1,80 @@
+%D \module
+%D [ file=s-structure-sections,
+%D version=2015.02.02,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Show Structure Sections,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\startluacode
+ local context = context
+ local ctx_NC, ctx_NR = context.NC, context.NR
+ local ctx_bold = context.bold
+
+ structures.tracers = structures.tracers or { }
+
+ function structures.tracers.showsections()
+
+ local list = structures.sections.registered
+ local keys = table.keys(list)
+ table.sort(keys,function(a,b)
+ local la, lb = list[a].level, list[b].level
+ if la == lb then
+ return a < b
+ else
+ return la < lb
+ end
+ end)
+ context.start()
+ context.switchtobodyfont { "tt" }
+ context.starttabulate { "||c||||" }
+ context.FL()
+ ctx_NC() ctx_bold("name")
+ ctx_NC() ctx_bold("level")
+ ctx_NC() ctx_bold("parent")
+ ctx_NC() ctx_bold("section")
+ ctx_NC() ctx_bold("coupling")
+ ctx_NC() context.NR()
+ context.ML()
+ for i=1,#keys do
+ local k = keys[i]
+ local v = list[k]
+ ctx_NC() ctx_bold(k)
+ ctx_NC() context(v.level)
+ ctx_NC() context(v.parent)
+ ctx_NC() context(v.section)
+ ctx_NC() context(v.coupling)
+ ctx_NC() context.NR()
+ end
+ context.LL()
+ context.stoptabulate()
+ context.stop()
+
+ end
+\stopluacode
+
+
+\starttexdefinition showstructuresections
+
+ % no settings yet
+
+ \ctxlua{structures.tracers.showsections()}
+
+\stoptexdefinition
+
+\protect
+
+\continueifinputfile{s-structure-sections.mkiv}
+
+\starttext
+
+ \showstructuresections
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/s-syn-01.tex b/Master/texmf-dist/tex/context/base/s-syntax.mkii
index 01c8f6653dd..6d1d59697ec 100644
--- a/Master/texmf-dist/tex/context/base/s-syn-01.tex
+++ b/Master/texmf-dist/tex/context/base/s-syntax.mkii
@@ -1,5 +1,5 @@
%D \module
-%D [ file=s-syn-01,
+%D [ file=s-syntax, % was: s-syn-01,
%D version=0000.00.00,
%D title=\CONTEXT\ Style File,
%D subtitle=Preliminary Syntax Stuff,
diff --git a/Master/texmf-dist/tex/context/base/s-syntax.mkiv b/Master/texmf-dist/tex/context/base/s-syntax.mkiv
new file mode 100644
index 00000000000..96312f77179
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-syntax.mkiv
@@ -0,0 +1,96 @@
+%D \module
+%D [ file=s-syntax, % was: s-syn-01,
+%D version=0000.00.00,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Preliminary Syntax Stuff,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This is needed for the \METAFUN\ manual: quite old code that I would do
+%D differently nowadays.
+
+\unprotect
+
+\unexpanded\def\module_syntax_Indent #1{\ifvmode\noindent\hbox to 2em{\hss#1}\else#1\fi}
+\unexpanded\def\module_syntax_Sugar #1{\removeunwantedspaces\kern.25em{#1}\kern.25em\ignorespaces}
+\unexpanded\def\module_syntax_Something #1{\Sugar{\mathematics{\langle\hbox{#1}\rangle}}}
+\unexpanded\def\module_syntax_Lbrace {\Sugar{\tttf\leftargument}}
+\unexpanded\def\module_syntax_Rbrace {\Sugar{\tttf\rightargument}}
+\unexpanded\def\module_syntax_Lparent {\Sugar{\tttf(}}
+\unexpanded\def\module_syntax_Rparent {\Sugar{\tttf)}}
+\unexpanded\def\module_syntax_Lbracket {\Sugar{\tttf[}}
+\unexpanded\def\module_syntax_Rbracket {\Sugar{\tttf]}}
+\unexpanded\def\module_syntax_Or {\Sugar{\mathematics{\vert}}}
+\unexpanded\def\module_syntax_Optional #1{\Sugar{\mathematics{[\hbox{#1}]}}}
+\unexpanded\def\module_syntax_Means {\Sugar{\mathematics{\rightarrow}}}
+\unexpanded\def\module_syntax_Tex #1{\Sugar{\type{#1}}}
+\unexpanded\def\module_syntax_Literal #1{\Sugar{\type{#1}}}
+\unexpanded\def\module_syntax_Syntax #1{\strut\kern-.25em{#1}\kern-.25em}
+\unexpanded\def\module_syntax_Next {\crlf\hbox to 2em{}\nobreak}
+\unexpanded\def\module_syntax_Whatever #1{\Sugar{\mathematics{(\hbox{#1})}}}
+\unexpanded\def\module_syntax_Quote #1{\Sugar{\quote{#1}}}
+\unexpanded\def\module_syntax_Or {\Sugar{\module_syntax_Indent{\mathematics{\vert}}}}
+\unexpanded\def\module_syntax_Means {\Sugar{\module_syntax_Indent{\mathematics{\rightarrow}}}}
+\unexpanded\def\module_syntax_FlaggedLiteral #1{\color[darkred]{\module_syntax_Literal{#1}}}
+\unexpanded\def\module_syntax_FlaggedSomething#1{\module_syntax_Something{\color[darkred]{#1}}}
+
+\unexpanded\def\StartSyntax
+ {\startlines
+ % formatters
+ \let\Indent \module_syntax_Indent
+ \let\Sugar \module_syntax_Sugar
+ \let\Something \module_syntax_Something
+ \let\Lbrace \module_syntax_Lbrace
+ \let\Rbrace \module_syntax_Rbrace
+ \let\Lparent \module_syntax_Lparent
+ \let\Rparent \module_syntax_Rparent
+ \let\Lbracket \module_syntax_Lbracket
+ \let\Rbracket \module_syntax_Rbracket
+ \let\Or \module_syntax_Or
+ \let\Optional \module_syntax_Optional
+ \let\Means \module_syntax_Means
+ \let\Tex \module_syntax_Tex
+ \let\Literal \module_syntax_Literal
+ \let\Syntax \module_syntax_Syntax
+ \let\Next \module_syntax_Next
+ \let\Whatever \module_syntax_Whatever
+ \let\Quote \module_syntax_Quote
+ \let\Or \module_syntax_Or
+ \let\Means \module_syntax_Means
+ \let\FlaggedLiteral \module_syntax_FlaggedLiteral
+ \let\FlaggedSomething\module_syntax_FlaggedSomething
+ % shortcuts
+ \let\FL \module_syntax_FlaggedLiteral
+ \let\FS \module_syntax_FlaggedSomething
+ \let\L \module_syntax_Literal
+ \let\S \module_syntax_Something
+ \let\M \module_syntax_Means
+ \let\O \module_syntax_Or
+ \let\Q \module_syntax_Quote
+ \let\LB \module_syntax_Lbrace
+ \let\RB \module_syntax_Rbrace
+ \let\LP \module_syntax_Lparent
+ \let\RP \module_syntax_Rparent
+ \let\LS \module_syntax_Lbracket
+ \let\RS \module_syntax_Rbracket
+ \let\{ \module_syntax_Lbrace
+ \let\} \module_syntax_Rbrace
+ \let\( \module_syntax_Lparent
+ \let\) \module_syntax_Rparent
+ \let\[ \module_syntax_Lbracket
+ \let\] \module_syntax_Rbracket
+ % precaution
+ \catcode`\#\othercatcode}
+
+\unexpanded\def\StopSyntax
+ {\stoplines}
+
+\unexpanded\def\SyntaxCommand#1%
+ {\csname module_syntax_#1\endcsname}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/s-typesetting-kerning.mkiv b/Master/texmf-dist/tex/context/base/s-typesetting-kerning.mkiv
new file mode 100644
index 00000000000..48d81ce3602
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-typesetting-kerning.mkiv
@@ -0,0 +1,209 @@
+%D \module
+%D [ file=s-typesetting-kerning,
+%D version=2014.12.14,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Show Character Kerning,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\definecharacterkerning
+ [typesetting-kerning-demo]
+ [factor=.5]
+
+\startbuffer[showcharacterkerning:boxes]
+ \starttextrule{boxes}
+ \showfontkerns
+ \dontcomplain
+ \startlines
+ test \hbox{!} test
+ test\hbox{!} test
+ test \hbox{!}test
+ test:$x$ test
+ \setcharacterkerning[typesetting-kerning-demo]
+ test \hbox{!} test
+ test\hbox{!} test
+ test \hbox{!}test
+ test:$x$ test
+ \stoplines
+ \stoptextrule
+\stopbuffer
+
+\startbuffer[showcharacterkerning:ligatures]
+ \starttextrule{ligatures}
+ \dontcomplain
+ \startlines
+ effe flink effectief efficient fietsen
+ \blank
+ \setcharacterkerning[typesetting-kerning-demo]
+ effe flink effectief efficient fietsen
+ \blank \hsize\zeropoint
+ effe
+ flink
+ effectief
+ efficient
+ fietsen
+ \stoplines
+ \stoptextrule
+\stopbuffer
+
+\startbuffer[showcharacterkerning:discretionaries]
+ \starttextrule{discretionary}
+ \dontcomplain
+ \startlines
+ \hbox{\samplediscretionary}
+ \hbox{xxx\samplediscretionary}
+ \hbox{\samplediscretionary xxx}
+ \hbox{xxx\samplediscretionary xxx}
+ \blank
+ \setcharacterkerning[typesetting-kerning-demo]
+ \hbox{\samplediscretionary}
+ \hbox{xxx\samplediscretionary}
+ \hbox{\samplediscretionary xxx}
+ \hbox{xxx\samplediscretionary xxx}
+ \blank \hsize\zeropoint
+ \samplediscretionary
+ xxx\samplediscretionary
+ \samplediscretionary xxx
+ xxx\samplediscretionary xxx
+ \stoplines
+ \stoptextrule
+\stopbuffer
+
+\startbuffer[showcharacterkerning:explicits]
+ \starttextrule{explicits}
+ \exhyphenchar \hyphenasciicode
+ \preexhyphenchar \lessthanasciicode
+ \postexhyphenchar\morethanasciicode
+ \def\TestDisc
+ {\discretionary
+ {\kern\emwidth<}%
+ {>\kern\emwidth}%
+ {\kern\emwidth=\kern\emwidth}%
+ }
+ \dontcomplain
+ \startlines
+ \hbox{super-charged}
+ \hbox{super\-charged}
+ \hbox{super\TestDisc charged}
+ \hbox{super\discretionary{[}{]}{[]}charged}
+ \blank
+ \setcharacterkerning[typesetting-kerning-demo]
+ \hbox{super-charged}
+ \hbox{super\-charged}
+ \hbox{super\TestDisc charged}
+ \hbox{super\discretionary{[}{]}{[]}charged}
+ \blank \hsize\zeropoint
+ super-charged
+ super\-charged
+ super\TestDisc charged
+ super\discretionary{[}{]}{[]}charged
+ \stoplines
+ \stoptextrule
+\stopbuffer
+
+\starttexdefinition unexpanded showcharacterkerning
+ \getbuffer[showcharacterkerning:boxes]
+ \getbuffer[showcharacterkerning:ligatures]
+ \getbuffer[showcharacterkerning:discretionaries]
+ \getbuffer[showcharacterkerning:explicits]
+\stoptexdefinition
+
+
+\starttexdefinition showcharacterkerningstepscompared #1
+ \definecharacterkerning[crap][factor=\KerningStepFactor]%
+ \setbox0=\ruledhbox{\color[color-1]{#1}\hss}
+ \setbox2=\ruledhbox{\setcharacterkerning[crap]\color[color-2]{#1}}
+ \setbox4=\ruledhbox{\setcharacterkerning[crap]\showfontkerns\showglyphs#1}
+ \xdef\KerningStepPercentage{\ctxlua{context("\letterpercent 0.2f",(1-\number\wd0/\number\wd2)*100)}}
+ \scratchwidth\wd0
+ \vtop\bgroup
+ \hbox{\box0\hskip-\scratchwidth\box2}
+ \par
+ \box4
+ \egroup
+\stoptexdefinition
+
+\starttexdefinition showcharacterkerningsteps [#1]
+
+ \start
+
+ \getdummyparameters
+ [\s!font=Regular,
+ \c!sample={Wat een bende, rommelen met het font design!},
+ \c!text={rommelen},
+ \c!first=00,
+ \c!last=95,
+ \c!step=05,
+ \c!option=, % \v!page
+ #1]
+
+ \doif{\dummyparameter\c!option}\v!page {
+ \startTEXpage[\c!offset=1ex]
+ }
+
+ \definecolor[color-1][r=1,t=.5,a=1]
+ \definecolor[color-2][b=1,t=.5,a=1]
+
+ \definedfont[\dummyparameter\s!font*default sa 1]
+
+ \doif {\dummyparameter\c!option}\v!page {
+ \begingroup
+ \tttf \dummyparameter\s!font\space @ default
+ \endgroup
+ \blank
+ }
+
+ \starttabulate[|cT|l|cT|l|cT|]
+
+ \NC \tt\bf factor \NC \tt\bf sample \NC \tt\bf \letterpercent \NC \tt\bf text \NC \tt\bf \letterpercent \NC \NR \HL
+
+ \dostepwiserecurse {\dummyparameter\c!first} {\dummyparameter\c!last} {\dummyparameter\c!step} {
+ \NC
+ \xdef\KerningStepFactor{\ctxlua{context("\letterpercent 0.3f",####1/1000)}}
+ \KerningStepFactor
+ \NC
+ \showcharacterkerningstepscompared{\dummyparameter\c!sample}
+ \NC
+ \KerningStepPercentage
+ \NC
+ \showcharacterkerningstepscompared{\dummyparameter\c!text}
+ \NC
+ \KerningStepPercentage
+ \NC \NR
+ }
+
+ \stoptabulate
+
+ \doif{\dummyparameter\c!option}\v!page {
+ \stopTEXpage
+ }
+
+ \stop
+
+\stoptexdefinition
+
+\protect
+
+\continueifinputfile{s-typesetting-kerning.mkiv}
+
+\starttext
+
+ % \showcharacterkerning
+
+ \showcharacterkerningsteps[font=file:FuturaStd-Book.otf,option=page]
+ \showcharacterkerningsteps[font=file:FuturaStd-Medium.otf,option=page]
+ \showcharacterkerningsteps[font=file:FuturaStd-Bold.otf,option=page]
+ \showcharacterkerningsteps[font=file:FuturaStd-heavy.otf,option=page]
+
+\stoptext
+
+% {\hsize1mm efficient\discretionary{\kern1pt!\kern1pt}{\kern1pt!\kern1pt}{\kern1pt!\kern1pt}efficient\par}
+% {\hsize1mm\definedfont[Regular]\setcharacterkerning[typesetting-kerning-demo]efficient\-efficient\par}
+
diff --git a/Master/texmf-dist/tex/context/base/s-youless.mkiv b/Master/texmf-dist/tex/context/base/s-youless.mkiv
index 247eb5f648f..e15973b9c63 100644
--- a/Master/texmf-dist/tex/context/base/s-youless.mkiv
+++ b/Master/texmf-dist/tex/context/base/s-youless.mkiv
@@ -59,9 +59,10 @@
for y=year,year do
- local year = years[y]
- local scale = 20
- local mark = 3
+ local year = years[y]
+ local scale = 20
+ local mark = 3
+ local maxwatt = specification.maxwatt or year.maxwatt
for m=1,12 do
local month = year.months[m]
@@ -69,7 +70,7 @@
context.startMPpage { offset = "10pt" }
context("linecap := butt; pickup pencircle scaled .5")
- for i=0,(math.div(year.maxwatt,1000)+1)*1000,100 do
+ for i=0,(math.div(maxwatt,1000)+1)*1000,100 do
context("draw (%s,%s) -- (%s,%s) withcolor .6white ;",0,i/scale,31 * 24,i/scale)
end
@@ -123,7 +124,7 @@
context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset,0,xoffset,-10)
end
- local max = (math.div(year.maxwatt,1000)+1)
+ local max = (math.div(maxwatt,1000)+1)
for i=0,max*1000,1000 do
context([[draw textext.lft("%s") shifted (%s,%s) ; ]],i,-10,i/scale)
diff --git a/Master/texmf-dist/tex/context/base/scrn-bar.mkvi b/Master/texmf-dist/tex/context/base/scrn-bar.mkvi
index 1dadc26f38f..8a2f9441c80 100644
--- a/Master/texmf-dist/tex/context/base/scrn-bar.mkvi
+++ b/Master/texmf-dist/tex/context/base/scrn-bar.mkvi
@@ -67,7 +67,7 @@
\def\scrn_bar_direct[#tag][#settings]% somewhat messy
{\iflocation
\begingroup
- \doifassignmentelse{#tag}
+ \doifelseassignment{#tag}
{\let\currentinteractionbar\empty
\setupcurrentinteractionbar[#tag]%
\edef\currentinteractionbar{\interactionbarparameter\c!alternative}}%
diff --git a/Master/texmf-dist/tex/context/base/scrn-but.lua b/Master/texmf-dist/tex/context/base/scrn-but.lua
index 74f6e0cd9af..7d883c910b7 100644
--- a/Master/texmf-dist/tex/context/base/scrn-but.lua
+++ b/Master/texmf-dist/tex/context/base/scrn-but.lua
@@ -6,12 +6,10 @@ if not modules then modules = { } end modules ['scrn-but'] = {
license = "see context related readme files"
}
-local commands = commands
local context = context
-
local f_two_colon = string.formatters["%s:%s"]
-function commands.registerbuttons(tag,register,language)
+local function registerbuttons(tag,register,language)
local data = sorters.definitions[language]
local orders = daya and data.orders or sorters.definitions.default.orders
local tag = tag == "" and { "" } or { tag }
@@ -20,3 +18,9 @@ function commands.registerbuttons(tag,register,language)
context.menubutton(tag,f_two_colon(register,order),order)
end
end
+
+interfaces.implement {
+ name = "registerbuttons",
+ actions = registerbuttons,
+ arguments = { "string", "string", "string" }
+}
diff --git a/Master/texmf-dist/tex/context/base/scrn-but.mkvi b/Master/texmf-dist/tex/context/base/scrn-but.mkvi
index f8b236c522a..3fdaf2c5d75 100644
--- a/Master/texmf-dist/tex/context/base/scrn-but.mkvi
+++ b/Master/texmf-dist/tex/context/base/scrn-but.mkvi
@@ -93,7 +93,7 @@
[\c!state=\v!start,
\c!width=\v!fit,
\c!height=\v!broad,
- \c!offset=0.25em,
+ \c!offset=0.25\emwidth,
\c!frame=\v!on,
\c!background=,
\c!backgroundcolor=,
@@ -159,7 +159,7 @@
\attribute\referenceattribute\attributeunsetvalue
\global\setfalse\c_scrn_button_skipped
\chardef\locationboxpagestate\csname\??buttonlocation#currentparameter\c!samepage\endcsname % ?? bt: todo
- \doifreferencefoundelse{#action}\scrn_button_make_yes\scrn_button_make_nop
+ \doifelsereferencefound{#action}\scrn_button_make_yes\scrn_button_make_nop
#currentparameter%
#inheritedframed%
#letparameter%
@@ -217,12 +217,12 @@
{\global\settrue\c_scrn_button_skipped}
\def\scrn_button_make_normal#currentparameter#inheritedframed#letparameter#setparameter#text%
- {\ctxcommand{injectcurrentreference()}%
+ {\clf_injectcurrentreference
\hbox attr \referenceattribute \lastreferenceattribute
{#inheritedframed{\ignorespaces#text\removeunwantedspaces}}}
\def\scrn_button_make_contrast#currentparameter#inheritedframed#letparameter#setparameter#text%
- {\ctxcommand{injectcurrentreference()}%
+ {\clf_injectcurrentreference
\hbox attr \referenceattribute \lastreferenceattribute
{#setparameter\c!foregroundcolor{#currentparameter\c!contrastcolor}%
#inheritedframed{\ignorespaces#text\removeunwantedspaces}}}
@@ -343,12 +343,12 @@
\def\scrn_menu_define[#tag][#category][#settings]% category reflects location, settings can be parent
{\ifthirdargument
- \doifassignmentelse{#settings}%
+ \doifelseassignment{#settings}%
{\scrn_menu_define_original[#tag][#category][\c!category=#category,#settings]}% child definition
{\scrn_menu_define_original[#tag][#settings][\c!category=#category]}% % child definition
\scrn_menu_register{#tag}{#category}%
\else\ifsecondargument
- \doifassignmentelse{#category}%
+ \doifelseassignment{#category}%
{\scrn_menu_define_original[#tag][#category]}% % root definition
{\scrn_menu_define_original[#tag][#category][\c!category=#category]% % child definition
\scrn_menu_register{#tag}{#category}}%
@@ -368,7 +368,7 @@
%D Fill menus:
-\normalexpanded{\long\def\expandafter\noexpand\csname\e!start\v!interactionmenu\endcsname[#tag]#content\expandafter\noexpand\csname\e!stop\v!interactionmenu\endcsname}%
+\normalexpanded{\def\expandafter\noexpand\csname\e!start\v!interactionmenu\endcsname[#tag]#content\expandafter\noexpand\csname\e!stop\v!interactionmenu\endcsname}%
{\def\currentinteractionmenu{#tag}%
\expandafter\settrue\csname\??menustate\interactionmenuparameter\c!category\endcsname
\setinteractionmenuparameter\c!menu{#content}}
@@ -691,7 +691,7 @@
\def\scrn_button_make_position#currentparameter#inheritedframed#letparameter#setparameter#text#action%
{\global\advance\c_scrn_menu_position\plusone
- \doifreferencefoundelse{#action}% 0=not found, 1=same page, >1=elsewhere
+ \doifelsereferencefound{#action}% 0=not found, 1=same page, >1=elsewhere
{\c_scrn_menu_page_mode\ifnum\currentreferencerealpage=\realpageno\plusone\else\plustwo\fi}%
{\c_scrn_menu_page_mode\plustwo}%
\doglobal\appendetoks
@@ -709,7 +709,8 @@
\unexpanded\def\scrn_menu_got_start[#action]#text\stopgot
{\scrn_menu_action_start
- \setupcurrentinteractionmenu[\c!frame=\v!off,\c!background=]% needs checking, was buttons
+ \letinteractionmenuparameter\c!frame\v!off
+ \letinteractionmenuparameter\c!background\empty
\scrn_button_make
\interactionmenuparameter
\inheritedinteractionmenuframed
@@ -967,7 +968,7 @@
\scrn_menu_menu_button_a
{#menutag}{#settings}{#text}{#action}%
\else
- \doifassignmentelse{#menutag}\scrn_menu_menu_button_b\scrn_menu_menu_button_c
+ \doifelseassignment{#menutag}\scrn_menu_menu_button_b\scrn_menu_menu_button_c
{#menutag}{#text}{#action}%
\fi}
@@ -1022,9 +1023,14 @@
\def\scrn_menu_register_menu_buttons[#menu][#register]%
{\ifsecondargument
- \ctxcommand{registerbuttons("menu","#register","\currentlanguage")}
+ \clf_registerbuttons{menu}{#register}{\currentlanguage}%
\else
- \ctxcommand{registerbuttons("","#menu","\currentlanguage")}
+ \clf_registerbuttons{}{#menu}{\currentlanguage}%
\fi}
+% or less readable:
+%
+% \def\scrn_menu_register_menu_buttons[#menu][#register]%
+% {\clf_registerbuttons\ifsecondargument{menu}{#register}\else{}{#menu}\fi{\currentlanguage}}
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/scrn-fld.lua b/Master/texmf-dist/tex/context/base/scrn-fld.lua
index 69480b88794..1563b9005d7 100644
--- a/Master/texmf-dist/tex/context/base/scrn-fld.lua
+++ b/Master/texmf-dist/tex/context/base/scrn-fld.lua
@@ -8,6 +8,10 @@ if not modules then modules = { } end modules ['scrn-fld'] = {
-- we should move some code from lpdf-fld to here
+local context = context
+local ctx_doifelse = commands.doifelse
+local implement = interfaces.implement
+
local variables = interfaces.variables
local v_yes = variables.yes
@@ -40,48 +44,141 @@ fields.defineset = defineset
fields.clone = clone
fields.insert = insert
-commands.definefield = define
-commands.definefieldset = defineset
-commands.clonefield = clone
+-- codeinjections are not yet defined
+
+implement {
+ name = "definefield",
+ actions = define,
+ arguments = {
+ {
+ { "name" },
+ { "alternative" },
+ { "type" },
+ { "category" },
+ { "values" },
+ { "default" },
+ }
+ }
+}
-function commands.insertfield(name,specification)
- texsetbox("b_scrn_field_body",insert(name,specification))
-end
+implement {
+ name = "definefieldset",
+ actions = defineset,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "clonefield",
+ actions = clone,
+ arguments = {
+ {
+ { "children" },
+ { "alternative" },
+ { "parent" },
+ { "category" },
+ { "values" },
+ { "default" },
+ }
+ }
+}
+
+implement {
+ name = "insertfield",
+ actions = function(name,specification)
+ texsetbox("b_scrn_field_body",insert(name,specification))
+ end,
+ arguments = {
+ "string",
+ {
+ { "title" },
+ { "width", "dimen" },
+ { "height", "dimen" },
+ { "depth", "dimen" },
+ { "align" },
+ { "length" },
+ { "fontstyle" },
+ { "fontalternative" },
+ { "fontsize" },
+ { "fontsymbol" },
+ { "colorvalue", "integer" },
+ { "color" },
+ { "backgroundcolorvalue", "integer" },
+ { "backgroundcolor" },
+ { "framecolorvalue", "integer" },
+ { "framecolor" },
+ { "layer" },
+ { "option" },
+ { "align" },
+ { "clickin" },
+ { "clickout" },
+ { "regionin" },
+ { "regionout" },
+ { "afterkey" },
+ { "format" },
+ { "validate" },
+ { "calculate" },
+ { "focusin" },
+ { "focusout" },
+ { "openpage" },
+ { "closepage" },
+ }
+ }
+}
-- (for the monent) only tex interface
-function commands.getfieldcategory(name)
- local g = codeinjections.getfieldcategory(name)
- if g then
- context(g)
+implement {
+ name = "getfieldcategory",
+ arguments = "string",
+ actions = function(name)
+ local g = codeinjections.getfieldcategory(name)
+ if g then
+ context(g)
+ end
end
-end
+}
-function commands.getdefaultfieldvalue(name)
- local d = codeinjections.getdefaultfieldvalue(name)
- if d then
- context(d)
+implement {
+ name = "getdefaultfieldvalue",
+ arguments = "string",
+ actions = function(name)
+ local d = codeinjections.getdefaultfieldvalue(name)
+ if d then
+ context(d)
+ end
end
-end
+}
-function commands.exportformdata(export)
- if export == v_yes then
- codeinjections.exportformdata()
+implement {
+ name = "exportformdata",
+ arguments = "string",
+ actions = function(export)
+ if export == v_yes then
+ codeinjections.exportformdata()
+ end
end
-end
-
-function commands.setformsmethod(method)
- codeinjections.setformsmethod(method)
-end
+}
-function commands.doiffieldcategoryelse(name)
- commands.doifelse(codeinjections.validfieldcategory(name))
-end
+implement {
+ name = "setformsmethod",
+ arguments = "string",
+ actions = function(method)
+ codeinjections.setformsmethod(method)
+ end
+}
-function commands.doiffieldsetelse(tag)
- commands.doifelse(codeinjections.validfieldset(name))
-end
+implement {
+ name = "doifelsefieldcategory",
+ arguments = "string",
+ actions = function(name)
+ ctx_doifelse(codeinjections.validfieldcategory(name))
+ end
+}
-function commands.doiffieldelse(name)
- commands.doifelse(codeinjections.validfield(name))
-end
+implement {
+ name = "doiffieldsetelse",
+ arguments = "string",
+ actions = function(name)
+ ctx_doifelse(codeinjections.validfieldset(name))
+ end
+}
diff --git a/Master/texmf-dist/tex/context/base/scrn-fld.mkvi b/Master/texmf-dist/tex/context/base/scrn-fld.mkvi
index 049ac92c353..4b4c9d0eeca 100644
--- a/Master/texmf-dist/tex/context/base/scrn-fld.mkvi
+++ b/Master/texmf-dist/tex/context/base/scrn-fld.mkvi
@@ -105,7 +105,7 @@
\installdirectcommandhandler \??forms {forms}
\appendtoks
- \ctxcommand{setformsmethod("\formsparameter\c!method")}%
+ \clf_setformsmethod{\formsparameter\c!method}%
\to \everysetupforms
\setupforms
@@ -113,7 +113,7 @@
\appendtoks
\iflocation
- \ctxcommand{exportformdata("\formsparameter\c!export")}%
+ \clf_exportformdata{\formsparameter\c!export}%
\fi
\to \everystoptext
@@ -127,7 +127,7 @@
{\processcommalist[#set]\scrn_symbols_preset_indeed}%
\def\scrn_symbols_preset_indeed#tag%
- {\doifobjectfoundelse{SYM}{#tag}
+ {\doifelseobjectfound{SYM}{#tag}
{}
{\settightobject{SYM}{#tag}\hbox{\symbol[#tag]}% % todo: set this as immediate xform
\page_otr_add_special_content{\hskip-\maxdimen\getobject{SYM}{#tag}}}} % and then force it into the file
@@ -177,23 +177,23 @@
\appendtoks % we cannot use parent .. maybe s!parent has to change
\ifx\currentfieldbodyparent\empty
\scrn_field_check_category
- \ctxcommand{definefield{
- name = "\currentfieldbody",
- alternative = "normal",
- type = "\fieldbodyparameter\c!type",
- category = "\fieldbodyparameter\c!category",
- values = \!!bs\fieldbodyparameter\c!values\!!es,
- default = \!!bs\fieldbodyparameter\c!default\!!es
- }}%
+ \clf_definefield
+ name {\currentfieldbody}%
+ alternative {normal}%
+ type {\fieldbodyparameter\c!type}%
+ category {\fieldbodyparameter\c!category}%
+ values {\fieldbodyparameter\c!values}%
+ default {\fieldbodyparameter\c!default}%
+ \relax
\else
- \ctxcommand{clonefield{
- children = "\currentfieldbody",
- alternative = "clone",
- parent = "\currentfieldbodyparent",
- category = "\fieldbodyparameter\c!category",
- values = \!!bs\fieldbodyparameter\c!values\!!es,
- default = \!!bs\fieldbodyparameter\c!default\!!es
- }}%
+ \clf_clonefield
+ children {\currentfieldbody}%
+ alternative {clone}%
+ parent {\currentfieldbodyparent}%
+ category {\fieldbodyparameter\c!category}%
+ values {\fieldbodyparameter\c!values}%
+ default {\fieldbodyparameter\c!default}%
+ \relax
\fi
\to \everydefinefieldbody
@@ -224,43 +224,46 @@
% == \edef\currentfieldbackgroundcolorvalue{\thecolorattribute\currentfieldbackgroundcolor}%
\fi
\usefieldbodystyleandcolor\c!style\c!color
- \ctxcommand{insertfield("\currentfieldbody", {
- title = "\currentfieldbody",
- width = \number\dimexpr\fieldbodyparameter\c!width \relax,
- height = \number\dimexpr\fieldbodyparameter\c!height\relax,
- depth = \number\dimexpr\fieldbodyparameter\c!depth \relax,
- align = "\fieldbodyparameter\c!align",
- length = "\fieldbodyparameter\c!n",
- fontstyle = "\fontstyle",
- fontalternative = "\fontalternative",
- fontsize = "\fontbody",
- fontsymbol = "\fieldbodyparameter\c!symbol",
- color = "\fieldbodyparameter\c!color",
- colorvalue = \number\attribute\colorattribute,
- \ifx\currentfieldbackgroundcolor\empty \else
- backgroundcolor = "\currentfieldbackgroundcolor",
- backgroundcolorvalue = "\currentfieldbackgroundcolorvalue",
- \fi
- \ifx\currentfieldframecolor\empty \else
- framecolor = "\currentfieldframecolor",
- framecolorvalue = "\currentfieldframecolorvalue",
- \fi
- layer = "\fieldbodyparameter\c!fieldlayer",
- option = "\fieldbodyparameter\c!option",
- align = "\fieldbodyparameter\c!align",
- clickin = "\fieldbodyparameter\c!clickin",
- clickout = "\fieldbodyparameter\c!clickout",
- regionin = "\fieldbodyparameter\c!regionin",
- regionout = "\fieldbodyparameter\c!regionout",
- afterkey = "\fieldbodyparameter\c!afterkey",
- format = "\fieldbodyparameter\c!format",
- validate = "\fieldbodyparameter\c!validate",
- calculate = "\fieldbodyparameter\c!calculate",
- focusin = "\fieldbodyparameter\c!focusin",
- focusout = "\fieldbodyparameter\c!focusout",
- openpage = "\fieldbodyparameter\c!openpage",
- closepage = "\fieldbodyparameter\c!closepage",
- })}}
+ \clf_insertfield
+ {\currentfieldbody}%
+ {%
+ title {\currentfieldbody}
+ width \dimexpr\fieldbodyparameter\c!width \relax
+ height \dimexpr\fieldbodyparameter\c!height\relax
+ depth \dimexpr\fieldbodyparameter\c!depth \relax
+ align {\fieldbodyparameter\c!align}%
+ length {\fieldbodyparameter\c!n}%
+ fontstyle {\fontstyle}%
+ fontalternative {\fontalternative}%
+ fontsize {\fontbody}%
+ fontsymbol {\fieldbodyparameter\c!symbol}%
+ color {\fieldbodyparameter\c!color}%
+ colorvalue \attribute\colorattribute
+ \ifx\currentfieldbackgroundcolor\empty \else
+ backgroundcolor {\currentfieldbackgroundcolor}%
+ backgroundcolorvalue \numexpr\currentfieldbackgroundcolorvalue\relax
+ \fi
+ \ifx\currentfieldframecolor\empty \else
+ framecolor {\currentfieldframecolor}%
+ framecolorvalue \numexpr\currentfieldframecolorvalue\relax
+ \fi
+ layer {\fieldbodyparameter\c!fieldlayer}%
+ option {\fieldbodyparameter\c!option}%
+ align {\fieldbodyparameter\c!align}%
+ clickin {\fieldbodyparameter\c!clickin}%
+ clickout {\fieldbodyparameter\c!clickout}%
+ regionin {\fieldbodyparameter\c!regionin}%
+ regionout {\fieldbodyparameter\c!regionout}%
+ afterkey {\fieldbodyparameter\c!afterkey}%
+ format {\fieldbodyparameter\c!format}%
+ validate {\fieldbodyparameter\c!validate}%
+ calculate {\fieldbodyparameter\c!calculate}%
+ focusin {\fieldbodyparameter\c!focusin}%
+ focusout {\fieldbodyparameter\c!focusout}%
+ openpage {\fieldbodyparameter\c!openpage}%
+ closepage {\fieldbodyparameter\c!closepage}%
+ }%
+ \relax}
%D The sets are used in grouped calculations.
%D
@@ -270,16 +273,20 @@
{\dodoubleempty\scrn_field_define_set}
\def\scrn_field_define_set[#tag][#list]%
- {\ctxcommand{definefieldset("#tag","#list")}}
+ {\clf_definefieldset{#tag}{#list}}
\let\dodefinefieldset\definefieldbodyset % compatibility
%D A few testing macros:
-\def\doiffieldbodyelse #tag{\ctxcommand{doiffieldelse("#tag")}}
-\def\doiffieldcategoryelse#tag{\ctxcommand{doiffieldcategoryelse("#tag")}}
+\def\doifelsefieldbody #tag{\clf_doifelsefield{#tag}}
+\def\doifelsefieldcategory#tag{\clf_doifelsefieldcategory{#tag}}
+
+\let\doiffieldbodyelse \doifelsefieldbody
+\let\doiffieldcategoryelse\doifelsefieldcategory
-\let\doiffieldelse\doiffieldbodyelse % compatibility
+\let\doiffieldelse \doifelsefieldbody % compatibility / will be dropped
+\let\doifelsefield \doifelsefieldbody % compatibility / will be dropped
%D We still support the traditional method of defining fields:
%D
@@ -365,7 +372,7 @@
\def\scrn_field_fit[#tag][#settings]%
{\iflocation
\begingroup
- \edef\currentdefaultfieldvalue{\ctxcommand{getdefaultfieldvalue("#tag")}}%
+ \edef\currentdefaultfieldvalue{\clf_getdefaultfieldvalue{#tag}}%
\setbox\b_scrn_field_fit_symbol\hbox{\symbol[\currentdefaultfieldvalue]}%
\fitfieldframed
{\fieldbody[#tag]
@@ -494,7 +501,7 @@
\scrn_field_load_scripts
\edef\currentfieldbody {#tag}%
\edef\currentfieldlabel {#label}%
- \edef\currentfieldcategory{\ctxcommand{getfieldcategory("#tag")}}%
+ \edef\currentfieldcategory{\clf_getfieldcategory{#tag}}%
\ifx\currentfieldlabel\empty
\let\currentfieldlabel\currentfieldbody
\fi
@@ -679,7 +686,7 @@
\edef\currenttooltipname{tooltip:\number\c_scrn_tooltip_n}%
\setbox\b_scrn_tooltip_anchor\hbox
{\strut#anchortext}%
- \doifassignmentelse{#settings}
+ \doifelseassignment{#settings}
{\setupcurrenttooltip[#settings]}%
{\setupcurrenttooltip[\c!location=#settings]}%
\setbox\b_scrn_tooltip_text\hbox
@@ -740,6 +747,8 @@
%D \goto{walk field}[Walk{mine}]
%D \stoptyping
+% todo: expand #symbols
+
\unexpanded\def\definefieldstack
{\dotripleargument\scrn_fieldstack_define}
@@ -868,7 +877,7 @@
\setvalue{pushbutton:#tag}{\scrn_pushbutton_handle{#tag}{#settings}}}
\def\scrn_pushbutton_define_variant#tag#variant#content%
- {\doifsymboldefinedelse{pushsymbol:#tag:#variant}
+ {\doifelsesymboldefined{pushsymbol:#tag:#variant}
\donothing
{\definesymbol[pushsymbol:#tag:#variant][{#content}]}}
@@ -975,7 +984,7 @@
\setupcurrentinteractionmenu[#settings]%
\let\scrn_rollbutton_symbol\scrn_rollbutton_symbol_m
\else
- \doifassignmentelse{#tag}
+ \doifelseassignment{#tag}
{\let\currentbutton\empty
\setupcurrentbutton[#tag]%
\let\scrn_rollbutton_symbol\scrn_rollbutton_symbol_b}%
diff --git a/Master/texmf-dist/tex/context/base/scrn-hlp.lua b/Master/texmf-dist/tex/context/base/scrn-hlp.lua
index d344ce2802c..99c0565a8b7 100644
--- a/Master/texmf-dist/tex/context/base/scrn-hlp.lua
+++ b/Master/texmf-dist/tex/context/base/scrn-hlp.lua
@@ -6,13 +6,15 @@ if not modules then modules = { } end modules ['scrn-hlp'] = {
license = "see context related readme files"
}
-local format = string.format
+local tonumber = tonumber
local help = { }
interactions.help = help
local context = context
-local commands = commands
+local implement = interfaces.implement
+
+local formatters = string.formatters
local a_help = attributes.private("help")
@@ -48,21 +50,26 @@ local helpscript = [[
local template = "javascript(Hide_All_Help{help:}),action(show{help:%s})"
-function help.register(number,name,box)
- if helpscript then
- interactions.javascripts.setpreamble("HelpTexts",helpscript)
- helpscript = false
- end
- local b = copy_nodelist(texgetbox(box))
- register_list(b)
- data[number] = b
- if name and name ~= "" then
- references[name] = number
- structures.references.define("",name,format(template,number))
+local function register(specification)
+ local number = specification.number
+ local name = specification.name
+ local box = specification.box
+ if number and name and box then
+ if helpscript then
+ interactions.javascripts.setpreamble("HelpTexts",helpscript)
+ helpscript = false
+ end
+ local b = copy_nodelist(texgetbox(box))
+ register_list(b)
+ data[number] = b
+ if name and name ~= "" then
+ references[name] = number
+ structures.references.define("",name,formatters[template](number))
+ end
end
end
-local function collect(head,used)
+local function collectused(head,used)
while head do
local id = head.id
if id == hlist_code then
@@ -74,51 +81,77 @@ local function collect(head,used)
used[#used+1] = a
end
else
- used = collect(head.list,used)
+ used = collectused(head.list,used)
end
elseif id == vlist_code then
- used = collect(head.list,used)
+ used = collectused(head.list,used)
end
head = head.next
end
return used
end
-function help.collect(box)
+local function collect(box)
if next(data) then
- return collect(texgetbox(box).list)
+ return collectused(texgetbox(box).list)
end
end
-commands.registerhelp = help.register
-
-function commands.collecthelp(box)
- local used = help.collect(box)
- if used then
- local done = { }
- context.startoverlay()
- for i=1,#used do
- local d = data[used[i]]
- if d and not done[d] then
- local box = hpack_nodelist(copy_nodelist(d))
- context(false,box)
- done[d] = true
- else
- -- error
+local function reference(name)
+ return references[name] or tonumber(name) or 0
+end
+
+help.register = register
+help.collect = collect
+help.reference = reference
+
+implement {
+ name = "registerhelp",
+ actions = register,
+ arguments = {
+ {
+ { "number", "integer" },
+ { "name" },
+ { "box" , "integer" }
+ }
+ }
+}
+
+implement {
+ name = "collecthelp",
+ arguments = "integer",
+ actions = function(box)
+ local used = collect(box)
+ if used then
+ local done = { }
+ context.startoverlay()
+ for i=1,#used do
+ local d = data[used[i]]
+ if d and not done[d] then
+ local box = hpack_nodelist(copy_nodelist(d))
+ context(false,box)
+ done[d] = true
+ else
+ -- error
+ end
end
+ context.stopoverlay()
end
- context.stopoverlay()
end
-end
-
-function help.reference(name)
- return references[name] or tonumber(name) or 0
-end
+}
-function commands.helpreference(name)
- context(references[name] or tonumber(name) or 0)
-end
+implement {
+ name = "helpreference",
+ arguments = "string",
+ actions = function(name)
+ context(reference(name))
+ end
+}
-function commands.helpaction(name)
- context(template,references[name] or tonumber(name) or 0)
-end
+implement {
+ name = "helpaction",
+ arguments = "string",
+ actions = function(name)
+ context(template,reference(name))
+ end
+}
diff --git a/Master/texmf-dist/tex/context/base/scrn-hlp.mkvi b/Master/texmf-dist/tex/context/base/scrn-hlp.mkvi
index f5a78fb0891..eca79c90a5b 100644
--- a/Master/texmf-dist/tex/context/base/scrn-hlp.mkvi
+++ b/Master/texmf-dist/tex/context/base/scrn-hlp.mkvi
@@ -130,25 +130,31 @@
\c!values=\currenthelpname]%
\setbox\b_scrn_help_box\hbox
{\fieldbody[\currenthelpname]}%
- \ctxcommand{registerhelp(\number\c_scrn_help_n,"\currenthelpreference",\number\b_scrn_help_box)}}
+ \clf_registerhelp
+ number \c_scrn_help_n
+ name {\currenthelpreference}%
+ box \b_scrn_help_box
+ \relax}
-\def\doifelsehelp
+\unexpanded\def\doifelsehelp
{\ifcase\c_scrn_help_n
\expandafter\firstoftwoarguments
\else
\expandafter\secondoftwoarguments
\fi}
-\def\placehelp % was \helpdata
+\let\doifhelpelse\doifelsehelp
+
+\unexpanded\def\placehelp % was \helpdata
{\ifinpagebody\ifcase\c_scrn_help_n\else
- \ctxcommand{collecthelp(255)}% rather hard coded ... bad
+ \clf_collecthelp\normalpagebox
\fi\fi}
\def\helpreference#category%
- {\ctxcommand{helpreference("#category")}}
+ {\clf_helpreference{#category}}
\def\helpaction#category%
- {\ctxcommand{helpaction("#category")}}
+ {\clf_helpaction{#category}}
\unexpanded\def\helpsignal#category%
{\hbox attr \helpattribute \helpreference{#category}{}}
diff --git a/Master/texmf-dist/tex/context/base/scrn-ini.lua b/Master/texmf-dist/tex/context/base/scrn-ini.lua
index 4831408f983..ce9f9f71b06 100644
--- a/Master/texmf-dist/tex/context/base/scrn-ini.lua
+++ b/Master/texmf-dist/tex/context/base/scrn-ini.lua
@@ -16,7 +16,7 @@ local codeinjections = backends.codeinjections
local identitydata = { }
-local function setupidentity(specification)
+function general.setupidentity(specification)
for k, v in next, specification do
identitydata[k] = v
end
@@ -27,6 +27,17 @@ function general.getidentity()
return identitydata
end
-general.setupidentity = setupidentity
-
-commands.setupidentity = setupidentity
+interfaces.implement {
+ name = "setupidentity",
+ actions = general.setupidentity,
+ arguments = {
+ {
+ { "title" },
+ { "subtitle" },
+ { "author" },
+ { "creator" },
+ { "date" },
+ { "keywords" },
+ }
+ }
+}
diff --git a/Master/texmf-dist/tex/context/base/scrn-ini.mkvi b/Master/texmf-dist/tex/context/base/scrn-ini.mkvi
index f5b29462436..2ed822c6e96 100644
--- a/Master/texmf-dist/tex/context/base/scrn-ini.mkvi
+++ b/Master/texmf-dist/tex/context/base/scrn-ini.mkvi
@@ -51,6 +51,8 @@
\expandafter\secondoftwoarguments
\fi}
+\let\doiflocationelse\doifelselocation
+
\setupinteraction
[\c!state=\v!stop]
@@ -176,14 +178,14 @@
%D Identity
\def\scrn_identity_synchronize
- {\ctxcommand{setupidentity{
- title = \!!bs\interactionparameter\c!title\!!es,
- subtitle = \!!bs\interactionparameter\c!subtitle\!!es,
- author = \!!bs\interactionparameter\c!author\!!es,
- creator = \!!bs ConTeXt - \contextversion\!!es,
- date = \!!bs\interactionparameter\c!date\!!es,
- keywords = \!!bs\interactionparameter\c!keyword\!!es,
- }}}
+ {\clf_setupidentity
+ title {\interactionparameter\c!title}%
+ subtitle {\interactionparameter\c!subtitle}%
+ author {\interactionparameter\c!author}%
+ creator { ConTeXt - \contextversion}%
+ date {\interactionparameter\c!date}%
+ keywords {\interactionparameter\c!keyword}%
+ \relax}
\appendtoks
\scrn_identity_synchronize
diff --git a/Master/texmf-dist/tex/context/base/scrn-pag.lua b/Master/texmf-dist/tex/context/base/scrn-pag.lua
index 7003d028508..4d7b388ee0c 100644
--- a/Master/texmf-dist/tex/context/base/scrn-pag.lua
+++ b/Master/texmf-dist/tex/context/base/scrn-pag.lua
@@ -10,18 +10,43 @@ interactions = interactions or { }
interactions.pages = interactions.pages or { }
local pages = interactions.pages
+local implement = interfaces.implement
+
local codeinjections = backends.codeinjections
-local function setupcanvas(specification)
+function pages.setupcanvas(specification)
codeinjections.setupcanvas(specification)
end
-local function setpagetransition(specification)
+function pages.setpagetransition(specification)
codeinjections.setpagetransition(specification)
end
-pages.setupcanvas = setupcanvas
-pages.setpagetransition = setpagetransition
+implement {
+ name = "setupcanvas",
+ actions = pages.setupcanvas,
+ arguments = {
+ {
+ { "mode" },
+ { "singlesided", "boolean" },
+ { "doublesided", "boolean" },
+ { "leftoffset", "dimen" },
+ { "topoffset", "dimen" },
+ { "width", "dimen" },
+ { "height", "dimen" },
+ { "paperwidth", "dimen" },
+ { "paperheight", "dimen" },
+ }
+ }
+}
-commands.setupcanvas = setupcanvas
-commands.setpagetransition = setpagetransition
+implement {
+ name = "setpagetransition",
+ actions = pages.setpagetransition,
+ arguments = {
+ {
+ { "n" },
+ { "delay", "integer" },
+ }
+ }
+}
diff --git a/Master/texmf-dist/tex/context/base/scrn-pag.mkvi b/Master/texmf-dist/tex/context/base/scrn-pag.mkvi
index 5bbdadda885..3dfcd65c5ff 100644
--- a/Master/texmf-dist/tex/context/base/scrn-pag.mkvi
+++ b/Master/texmf-dist/tex/context/base/scrn-pag.mkvi
@@ -124,30 +124,49 @@
%
% \starttext \input ward \stoptext
-\def\scrn_canvas_synchronize_simple
- {\ctxcommand{setupcanvas{
- paperwidth = \number\printpaperwidth,
- paperheight = \number\printpaperheight
- }}}
+\let\scrn_canvas_synchronize_simple \relax
+\let\scrn_canvas_synchronize_complex\relax
-\def\scrn_canvas_synchronize_complex
+\appendtoks
+ \global\let\scrn_canvas_synchronize_simple \scrn_canvas_synchronize_simple_indeed
+ \global\let\scrn_canvas_synchronize_complex\scrn_canvas_synchronize_complex_indeed
+\to \everysetuplayout
+
+\def\scrn_canvas_synchronize_simple_indeed
+ {\clf_setupcanvas
+ paperwidth \printpaperwidth
+ paperheight \printpaperheight
+ \relax
+ %\global\let\scrn_canvas_synchronize_simple \relax
+ \global\let\scrn_canvas_synchronize_complex\relax}
+
+\def\scrn_canvas_synchronize_complex_indeed
{\scrn_canvas_calculate % otherwise we need to hook it into setuppage etc
- \ctxcommand{setupcanvas{
- mode = "\interactionscreenparameter\c!option",
- singlesided = \ifsinglesided true\else false\fi,
- doublesided = \ifdoublesided true\else false\fi,
- leftoffset = \number\canvasbackoffset,
- topoffset = \number\canvastopoffset,
- width = \number\canvaswidth,
- height = \number\canvasheight,
- paperwidth = \number\canvasmaxwidth,
- paperheight = \number\canvasmaxheight
- }}}
+ \clf_setupcanvas
+ mode {\interactionscreenparameter\c!option}%
+ singlesided \ifsinglesided true\else false\fi\space
+ doublesided \ifdoublesided true\else false\fi\space
+ leftoffset \canvasbackoffset
+ topoffset \canvastopoffset
+ width \canvaswidth
+ height \canvasheight
+ paperwidth \canvasmaxwidth
+ paperheight \canvasmaxheight
+ \relax
+ %\global\let\scrn_canvas_synchronize_simple \relax
+ \global\let\scrn_canvas_synchronize_complex\relax}
\appendtoks
- \doifcommonelse{\interactionscreenparameter\c!option}{\v!max,\v!fit}%
- {\global\settrue \c_scrn_canvas_tight_page}%
- {\global\setfalse\c_scrn_canvas_tight_page}%
+ \begingroup
+ \edef\p_option{\interactionscreenparameter\c!option}%
+ \ifx\p_option\v!max
+ \global\settrue \c_scrn_canvas_tight_page
+ \else\ifx\p_option\v!fit
+ \global\settrue \c_scrn_canvas_tight_page
+ \else
+ \global\setfalse\c_scrn_canvas_tight_page
+ \fi\fi
+ \endgroup
\to \everysetupinteractionscreen
\setupinteractionscreen
@@ -159,6 +178,11 @@
\c!topspace=\topspace,
\c!option=\v!auto]
+\appendtoks
+ \global\let\scrn_canvas_synchronize_simple \scrn_canvas_synchronize_simple
+ \global\let\scrn_canvas_synchronize_complex\scrn_canvas_synchronize_complex
+\to \everysetupinteractionscreen
+
%D Conditional page breaks:
\unexpanded\def\screen
@@ -177,7 +201,10 @@
{\dosingleempty\scrn_transitions_setup}
\def\scrn_transitions_setup[#list]%
- {\edef\scrn_transitions_list{#list}}
+ {\edef\scrn_transitions_list{#list}%
+ \ifx\scrn_transitions_list\v!reset
+ \let\scrn_transitions_list\empty
+ \fi}
\def\scrn_transitions_set
{\iflocation \ifx\scrn_transitions_list\empty \else
@@ -187,10 +214,10 @@
\def\scrn_transitions_set_indeed
{\begingroup
\edef\currentinteractionscreendelay{\interactionscreenparameter\c!delay}%
- \ctxcommand{setpagetransition{
- n = "\scrn_transitions_list",
- delay = "\ifx\currentinteractionscreendelay\v!none 0\else\currentinteractionscreendelay\fi"
- }}%
+ \clf_setpagetransition
+ n {\scrn_transitions_list}%
+ delay \ifx\currentinteractionscreendelay\v!none \zerocount\else\currentinteractionscreendelay\fi
+ \relax
\endgroup}
\prependtoks
diff --git a/Master/texmf-dist/tex/context/base/scrn-ref.lua b/Master/texmf-dist/tex/context/base/scrn-ref.lua
index df71b6a97fe..c1fc9487138 100644
--- a/Master/texmf-dist/tex/context/base/scrn-ref.lua
+++ b/Master/texmf-dist/tex/context/base/scrn-ref.lua
@@ -15,6 +15,8 @@ local codeinjections = backends.codeinjections
local expandcurrent = structures.references.expandcurrent
local identify = structures.references.identify
+local implement = interfaces.implement
+
local function check(what)
if what and what ~= "" then
local set, bug = identify("",what)
@@ -54,12 +56,12 @@ local function setclosepageaction(close)
end
end
-references.setopendocument = setopendocumentaction
-references.setclosedocument = setclosedocumentaction
-references.setopenpage = setopenpageaction
-references.setclosepage = setclosepageaction
+references.setopendocument = setopendocumentaction
+references.setclosedocument = setclosedocumentaction
+references.setopenpage = setopenpageaction
+references.setclosepage = setclosepageaction
-commands.setopendocumentaction = setopendocumentaction
-commands.setclosedocumentaction = setclosedocumentaction
-commands.setopenpageaction = setopenpageaction
-commands.setclosepageaction = setclosepageaction
+implement { name = "setopendocumentaction", arguments = "string", actions = setopendocumentaction }
+implement { name = "setclosedocumentaction", arguments = "string", actions = setclosedocumentaction }
+implement { name = "setopenpageaction", arguments = "string", actions = setopenpageaction }
+implement { name = "setclosepageaction", arguments = "string", actions = setclosepageaction }
diff --git a/Master/texmf-dist/tex/context/base/scrn-ref.mkvi b/Master/texmf-dist/tex/context/base/scrn-ref.mkvi
index a06ba1ad8fc..2b15b46778e 100644
--- a/Master/texmf-dist/tex/context/base/scrn-ref.mkvi
+++ b/Master/texmf-dist/tex/context/base/scrn-ref.mkvi
@@ -25,7 +25,7 @@
\to \everysetupinteraction
\def\scrn_reference_enable_page_destinations % no reset
- {\ctxlua{structures.references.setinnermethod("\interactionparameter\c!page")}}
+ {\clf_setinnerreferencemethod{\interactionparameter\c!page}}
\setupinteraction % start fit page and reset form
[\c!page=\v!no,
@@ -34,7 +34,7 @@
\c!focus=\v!fit,
\c!calculate=,
% rendering:
- \c!width=1em,
+ \c!width=\emwidth,
\c!height=\zeropoint,
\c!depth=\zeropoint,
\c!symbolset=]
@@ -46,10 +46,10 @@
\edef\currentinteractionopenaction {\interactionparameter\c!openaction }%
\edef\currentinteractioncloseaction{\interactionparameter\c!closeaction}%
\ifx\currentinteractionopenaction\empty \else
- \ctxcommand{setopendocumentaction("\currentinteractionopenaction")}%
+ \clf_setopendocumentaction{\currentinteractionopenaction}%
\fi
\ifx\currentinteractioncloseaction\empty \else
- \ctxcommand{setclosedocumentaction("\currentinteractioncloseaction")}%
+ \clf_setclosedocumentaction{\currentinteractioncloseaction}%
\fi
\glet\scrn_reference_set_text_actions\relax
\fi}
@@ -59,10 +59,10 @@
\edef\currentinteractionopenpageaction {\interactionparameter\c!openpageaction }%
\edef\currentinteractionclosepageaction{\interactionparameter\c!closepageaction}%
\ifx\currentinteractionopenpageaction\empty \else
- \ctxcommand{setopenpageaction("\currentinteractionopenpageaction")}%
+ \clf_setopenpageaction{\currentinteractionopenpageaction}%
\fi
\ifx\currentinteractionclosepageaction\empty \else
- \ctxcommand{setclosepageaction("\currentinteractionclosepageaction")}%
+ \clf_setclosepageaction{\currentinteractionclosepageaction}%
\fi
\fi}
@@ -73,7 +73,7 @@
\def\scrn_reference_enable_references
{\ifproductionrun
- \ctxlua{structures.references.enableinteraction()}%
+ \clf_enableinteraction % only once anyway
\glet\scrn_reference_enable_references\relax
\fi}
diff --git a/Master/texmf-dist/tex/context/base/scrn-wid.lua b/Master/texmf-dist/tex/context/base/scrn-wid.lua
index 5b319b07ea7..72c9bc733aa 100644
--- a/Master/texmf-dist/tex/context/base/scrn-wid.lua
+++ b/Master/texmf-dist/tex/context/base/scrn-wid.lua
@@ -10,6 +10,7 @@ interactions = interactions or { }
local interactions = interactions
local context = context
+local implement = interfaces.implement
local allocate = utilities.storage.allocate
@@ -42,9 +43,13 @@ local report_attachments = logs.reporter("widgets","attachments")
-- Symbols
-function commands.presetsymbollist(list)
- codeinjections.presetsymbollist(list)
-end
+implement {
+ name = "presetsymbollist",
+ arguments = "string",
+ actions = function(list)
+ codeinjections.presetsymbollist(list)
+ end
+}
-- Attachments
--
@@ -108,11 +113,51 @@ function attachments.insert(specification)
return nodeinjections.attachfile(specification)
end
-commands.registerattachment = attachments.register
+implement {
+ name = "registerattachment",
+ actions = attachments.register,
+ arguments = {
+ {
+ { "tag" },
+ { "registered" },
+ { "title" },
+ { "subtitle" },
+ { "author" },
+ { "file" },
+ { "name" },
+ { "buffer" },
+ }
+ }
+}
-function commands.insertattachment(specification)
- texsetbox("b_scrn_attachment_link",(attachments.insert(specification)))
-end
+implement {
+ name = "insertattachment",
+ actions = function(specification)
+ texsetbox("b_scrn_attachment_link",(attachments.insert(specification)))
+ end,
+ arguments = {
+ {
+ { "tag" },
+ { "registered" },
+ { "method" },
+ { "width", "dimen" },
+ { "height", "dimen" },
+ { "depth", "dimen" },
+ { "colormodel", "integer" },
+ { "colorvalue", "integer" },
+ { "color" },
+ { "transparencyvalue", "integer" },
+ { "symbol" },
+ { "layer" },
+ { "title" },
+ { "subtitle" },
+ { "author" },
+ { "file" },
+ { "name" },
+ { "buffer" },
+ }
+ }
+}
-- Comment
@@ -124,9 +169,32 @@ function comments.insert(specification)
return nodeinjections.comment(specification)
end
-function commands.insertcomment(specification)
- texsetbox("b_scrn_comment_link",(comments.insert(specification)))
-end
+implement {
+ name = "insertcomment",
+ actions = function(specification)
+ texsetbox("b_scrn_comment_link",(comments.insert(specification)))
+ end,
+ arguments = {
+ {
+ { "tag" },
+ { "title" },
+ { "subtitle" },
+ { "author" },
+ { "width", "dimen" },
+ { "height", "dimen" },
+ { "depth", "dimen" },
+ { "nx" },
+ { "ny" },
+ { "colormodel", "integer" },
+ { "colorvalue", "integer" },
+ { "transparencyvalue", "integer" },
+ { "option" },
+ { "symbol" },
+ { "buffer" },
+ { "layer" },
+ }
+ }
+}
-- Soundclips
@@ -153,8 +221,27 @@ function soundclips.insert(tag)
end
end
-commands.registersoundclip = soundclips.register
-commands.insertsoundclip = soundclips.insert
+implement {
+ name = registersoundclip,
+ actions = soundclips.register,
+ arguments = {
+ {
+ { "tag" },
+ { "file" }
+ }
+ }
+}
+
+implement {
+ name = insertsoundclip,
+ actions = soundclips.insert,
+ arguments = {
+ {
+ { "tag" },
+ { "repeat" }
+ }
+ }
+}
-- Renderings
@@ -175,48 +262,84 @@ function renderings.rendering(label)
end
end
-local function var(label,key)
+function renderings.var(label,key)
local rn = renderings[label]
return rn and rn[key] or ""
end
-renderings.var = var
-
-function commands.renderingvar(label,key)
- context(var(label,key))
-end
+implement {
+ name = "renderingvar",
+ actions = { renderings.var, context },
+ arguments = { "string", "string" }
+}
-commands.registerrendering = renderings.register
+implement {
+ name = "registerrendering",
+ actions = renderings.register,
+ arguments = {
+ {
+ { "type" },
+ { "label" },
+ { "mime" },
+ { "filename" },
+ { "option" },
+ }
+ }
+}
-- Rendering:
-function commands.insertrenderingwindow(specification)
- codeinjections.insertrenderingwindow(specification)
-end
+implement {
+ name = "insertrenderingwindow",
+ actions = function(specification)
+ codeinjections.insertrenderingwindow(specification)
+ end,
+ arguments = {
+ {
+ { "label" },
+ { "width", "dimen" },
+ { "height", "dimen" },
+ { "option" },
+ { "page", "integer" },
+ }
+ }
+}
-- Linkedlists (only a context interface)
-function commands.definelinkedlist(tag)
- -- no need
-end
+implement {
+ name = "definelinkedlist",
+ arguments = "string",
+ actions = function(tag)
+ -- no need
+ end
+}
-function commands.enhancelinkedlist(tag,n)
- local ll = jobpasses.gettobesaved(tag)
- if ll then
- ll[n] = texgetcount("realpageno")
- end
-end
+implement {
+ name = "enhancelinkedlist",
+ arguments = { "string", "integer" },
+ actions = function(tag,n)
+ local ll = jobpasses.gettobesaved(tag)
+ if ll then
+ ll[n] = texgetcount("realpageno")
+ end
+ end
+}
-function commands.addlinklistelement(tag)
- local tobesaved = jobpasses.gettobesaved(tag)
- local collected = jobpasses.getcollected(tag) or { }
- local currentlink = #tobesaved + 1
- local noflinks = #collected
- tobesaved[currentlink] = 0
- local f = collected[1] or 0
- local l = collected[noflinks] or 0
- local p = collected[currentlink-1] or f
- local n = collected[currentlink+1] or l
- context.setlinkedlistproperties(currentlink,noflinks,f,p,n,l)
- -- context.ctxlatelua(function() commands.enhancelinkedlist(tag,currentlink) end)
-end
+implement {
+ name = "addlinklistelement",
+ arguments = "string",
+ actions = function(tag)
+ local tobesaved = jobpasses.gettobesaved(tag)
+ local collected = jobpasses.getcollected(tag) or { }
+ local currentlink = #tobesaved + 1
+ local noflinks = #collected
+ tobesaved[currentlink] = 0
+ local f = collected[1] or 0
+ local l = collected[noflinks] or 0
+ local p = collected[currentlink-1] or f
+ local n = collected[currentlink+1] or l
+ context.setlinkedlistproperties(currentlink,noflinks,f,p,n,l)
+ -- context.ctxlatelua(function() commands.enhancelinkedlist(tag,currentlink) end)
+ end
+}
diff --git a/Master/texmf-dist/tex/context/base/scrn-wid.mkvi b/Master/texmf-dist/tex/context/base/scrn-wid.mkvi
index 8dcc7a86a23..57a4be27639 100644
--- a/Master/texmf-dist/tex/context/base/scrn-wid.mkvi
+++ b/Master/texmf-dist/tex/context/base/scrn-wid.mkvi
@@ -100,16 +100,16 @@
\begingroup
\def\currentattachment{_}%
\setupcurrentattachment[#settings,\s!parent=\??attachment]%
- \ctxcommand{registerattachment{
- tag = "#tag",
- registered = "#tag",
- title = "\attachmentparameter\c!title",
- subtitle = "\attachmentparameter\c!subtitle",
- author = "\attachmentparameter\c!author",
- file = "\attachmentparameter\c!file",
- name = "\attachmentparameter\c!name",
- buffer = "\attachmentparameter\c!buffer",
- }}%
+ \clf_registerattachment
+ tag {#tag}%
+ registered {#tag}%
+ title {\attachmentparameter\c!title}%
+ subtitle {\attachmentparameter\c!subtitle}%
+ author {\attachmentparameter\c!author}%
+ file {\attachmentparameter\c!file}%
+ name {\attachmentparameter\c!name}%
+ buffer {\attachmentparameter\c!buffer}%
+ \relax
\endgroup
\else
% todo
@@ -136,7 +136,7 @@
{\bgroup
\doifelsenothing{#registered}
{\scrn_attachment_inject[\v!auto][]}
- {\doifassignmentelse{#registered}
+ {\doifelseassignment{#registered}
{\scrn_attachment_inject[\v!auto][#registered]}
{\scrn_attachment_inject[#registered][#settings]}}%
\egroup}
@@ -162,7 +162,7 @@
{\bgroup
\doifelsenothing{#registered}
{\def\scrn_attachment_stop{\scrn_attachment_inject[\v!auto][\c!buffer=\v!attachment]\egroup}}%
- {\doifassignmentelse{#registered}
+ {\doifelseassignment{#registered}
{\def\scrn_attachment_stop{\scrn_attachment_inject[\v!auto][\c!buffer=\v!attachment,#registered]\egroup}}%
{\def\scrn_attachment_stop{\scrn_attachment_inject[#registered][\c!buffer=\v!attachment,#settings]\egroup}}}%
\grabbufferdatadirect\v!attachment{\e!start\currentattachment}{\e!stop\currentattachment}}
@@ -181,37 +181,37 @@
\edef\currentattachmentheight{\attachmentparameter\c!height}%
\edef\currentattachmentdepth {\attachmentparameter\c!depth }%
\ifx\currentattachmentsymbol\empty
- \ifx\currentattachmentwidth \v!fit\edef\currentattachmentwidth {.5em}\fi
- \ifx\currentattachmentheight\v!fit\edef\currentattachmentheight{.5em}\fi
+ \ifx\currentattachmentwidth \v!fit\edef\currentattachmentwidth {.5\emwidth}\fi
+ \ifx\currentattachmentheight\v!fit\edef\currentattachmentheight{.5\emwidth}\fi
\ifx\currentattachmentdepth \v!fit\let \currentattachmentdepth \zeropoint\fi
\else
- \ctxcommand{presetsymbollist("\attachmentparameter\c!symbol")}%
+ \clf_presetsymbollist{\attachmentparameter\c!symbol}%
% we cannot yet ask for the wd/ht/dp of an xform else we could use those
\setbox\b_scrn_attachment_symbol\hbox{\symbol[\lastpredefinedsymbol]}%
\ifx\currentattachmentwidth \v!fit\edef\currentattachmentwidth {\wd\b_scrn_attachment_symbol}\fi
\ifx\currentattachmentheight\v!fit\edef\currentattachmentheight{\ht\b_scrn_attachment_symbol}\fi
\ifx\currentattachmentdepth \v!fit\edef\currentattachmentdepth {\dp\b_scrn_attachment_symbol}\fi
\fi
- \ctxcommand{insertattachment{
- tag = "\currentattachment",
- registered = "\currentattachmentregistered",
- width = \number\dimexpr\currentattachmentwidth \relax,
- height = \number\dimexpr\currentattachmentheight\relax,
- depth = \number\dimexpr\currentattachmentdepth \relax,
- color = "\attachmentparameter\c!color",
- colormodel = \number\attribute\colormodelattribute,
- colorvalue = \thecolorattribute{\attachmentparameter\c!color},
- transparencyvalue = \thetransparencyattribute{\attachmentparameter\c!color},
- symbol = "\currentattachmentsymbol",
- layer = "\attachmentparameter\c!textlayer",
+ \clf_insertattachment
+ tag {\currentattachment}%
+ registered {\currentattachmentregistered}%
+ width \dimexpr\currentattachmentwidth \relax
+ height \dimexpr\currentattachmentheight\relax
+ depth \dimexpr\currentattachmentdepth \relax
+ color {\attachmentparameter\c!color}%
+ colormodel \attribute\colormodelattribute
+ colorvalue \numexpr\thecolorattribute{\attachmentparameter\c!color}\relax % or are these chardefs
+ transparencyvalue \numexpr\thetransparencyattribute{\attachmentparameter\c!color}\relax % or are these chardefs
+ symbol {\currentattachmentsymbol}%
+ layer {\attachmentparameter\c!textlayer}%
% these will be overloaded by registered when available
- title = "\attachmentparameter\c!title",
- subtitle = "\attachmentparameter\c!subtitle",
- author = "\attachmentparameter\c!author",
- file = "\attachmentparameter\c!file",
- name = "\attachmentparameter\c!name",
- buffer = "\attachmentparameter\c!buffer",
- }}%
+ title {\attachmentparameter\c!title}%
+ subtitle {\attachmentparameter\c!subtitle}%
+ author {\attachmentparameter\c!author}%
+ file {\attachmentparameter\c!file}%
+ name {\attachmentparameter\c!name}%
+ buffer {\attachmentparameter\c!buffer}%
+ \relax
\setbox\b_scrn_attachment_link\hbox{\scrn_attachment_place}%
\wd\b_scrn_attachment_link\currentattachmentwidth
\ht\b_scrn_attachment_link\currentattachmentheight
@@ -219,11 +219,11 @@
\box\b_scrn_attachment_link}
\setvalue{\??attachmentmethod\v!hidden}%
- {\ctxcommand{insertattachment{
- tag = "\currentattachment",
- registered = "\currentattachmentregistered",
- method = "\v!hidden"
- }}}
+ {\clf_insertattachment
+ tag {\currentattachment}%
+ registered {\currentattachmentregistered}%
+ method {\v!hidden}%
+ \relax}
\def\scrn_attachment_place
{\executeifdefined
@@ -398,10 +398,10 @@
\scrn_comment_argument_ignore}
\def\scrn_comment_argument_indeed[#title][#settings]#text%
- {\doifassignmentelse{#title}
+ {\doifelseassignment{#title}
{\setupcurrentcomment[#title]}
{\setupcurrentcomment[\c!title=#title,#settings]}%
- \ctxcommand{assignbuffer("\v!comment",\!!bs#text\!!es)}% todo: expansion control, but expanded by default (xml)
+ \clf_assignbuffer{\v!comment}{#text}\catcodetable\relax% todo: expansion control, but expanded by default (xml)
\scrn_comment_inject
\ignorespaces}
@@ -421,7 +421,7 @@
\def\scrn_comment_start_indeed[#title][#settings]%
{\bgroup
- \doifassignmentelse{#title}
+ \doifelseassignment{#title}
{\setupcurrentcomment[#title]}
{\setupcurrentcomment[\c!title=#title,#settings]}%
\unexpanded\def\scrn_comment_stop{\scrn_comment_inject\egroup}%
@@ -447,35 +447,35 @@
\edef\currentcommentheight{\commentparameter\c!height}%
\edef\currentcommentdepth {\commentparameter\c!depth }%
\ifx\currentcommentsymbol\empty
- \ifx\currentcommentwidth \v!fit\edef\currentcommentwidth {.5em}\fi
- \ifx\currentcommentheight\v!fit\edef\currentcommentheight{.5em}\fi
+ \ifx\currentcommentwidth \v!fit\edef\currentcommentwidth {.5\emwidth}\fi
+ \ifx\currentcommentheight\v!fit\edef\currentcommentheight{.5\emwidth}\fi
\ifx\currentcommentdepth \v!fit\let \currentcommentdepth \zeropoint\fi
\else
- \ctxcommand{presetsymbollist("\commentparameter\c!symbol")}%
+ \clf_presetsymbollist{\commentparameter\c!symbol}%
% we cannot yet ask for the wd/ht/dp of an xform else we could use those
\setbox\b_scrn_comment_symbol\hbox{\symbol[\lastpredefinedsymbol]}%
\ifx\currentcommentwidth \v!fit\edef\currentcommentwidth {\wd\b_scrn_comment_symbol}\fi
\ifx\currentcommentheight\v!fit\edef\currentcommentheight{\ht\b_scrn_comment_symbol}\fi
\ifx\currentcommentdepth \v!fit\edef\currentcommentdepth {\dp\b_scrn_comment_symbol}\fi
\fi
- \ctxcommand{insertcomment{
- tag = "\currentcomment",
- title = "\commentparameter\c!title",
- subtitle = "\commentparameter\c!subtitle",
- author = "\commentparameter\c!author",
- width = \number\dimexpr\currentcommentwidth,
- height = \number\dimexpr\currentcommentheight,
- depth = \number\dimexpr\currentcommentdepth,
- nx = \commentparameter\c!nx,
- ny = \commentparameter\c!ny,
- colormodel = \number\attribute\colormodelattribute,
- colorvalue = \thecolorattribute{\commentparameter\c!color},
- transparencyvalue = \thetransparencyattribute{\commentparameter\c!color},
- option = "\commentparameter\c!option", % todo
- symbol = "\commentparameter\c!symbol",
- buffer = "\v!comment",
- layer = "\commentparameter\c!textlayer"
- }}%
+ \clf_insertcomment
+ tag {\currentcomment}%
+ title {\commentparameter\c!title}%
+ subtitle {\commentparameter\c!subtitle}%
+ author {\commentparameter\c!author}%
+ width \dimexpr\currentcommentwidth\relax
+ height \dimexpr\currentcommentheight\relax
+ depth \dimexpr\currentcommentdepth\relax
+ nx {\commentparameter\c!nx}%
+ ny {\commentparameter\c!ny}%
+ colormodel \attribute\colormodelattribute
+ colorvalue \numexpr\thecolorattribute{\commentparameter\c!color}\relax
+ transparencyvalue \numexpr\thetransparencyattribute{\commentparameter\c!color}\relax
+ option {\commentparameter\c!option}% % todo
+ symbol {\commentparameter\c!symbol}%
+ buffer {\v!comment}%
+ layer {\commentparameter\c!textlayer}%
+ \relax
\wd\b_scrn_comment_link\currentcommentwidth
\ht\b_scrn_comment_link\currentcommentheight
\dp\b_scrn_comment_link\currentcommentdepth
@@ -542,17 +542,17 @@
{\dodoubleargument\scrn_soundtrack_indeed}
\def\scrn_soundtrack_indeed[#tag][#filename]%
- {\ctxcommand{registersoundclip{
- tag = "#tag",
- file = "#filename"
- }}}
+ {\clf_registersoundclip
+ tag {#tag}%
+ file {#filename}%
+ \relax}
\def\checksoundtrack#tag% yet untested in mkiv (also move management to lua)
{\iflocation
- \ctxcommand{insertsoundclip{
- tag = "#tag",
- ["repeat"] = "\directexternalsoundtrackparameter\c!option", % todo: pass option as-is
- }}%
+ \clf_insertsoundclip
+ tag {#tag}%
+ repeat {\directexternalsoundtrackparameter\c!option}%
+ \relax
\fi}
%D Renderings (not yet tested in mkvi):
@@ -571,31 +571,31 @@
\unexpanded\def\setinternalrendering{\dodoubleempty \scrn_rendering_set}
\def\scrn_rendering_use[#tag][#mime][#file][#option]%
- {\ctxcommand{registerrendering{
- type = "external",
- label = "#tag",
- mime = "#mime",
- filename = "#file",
- option = "#option",
- }}}
+ {\clf_registerrendering
+ type {external}%
+ label {#tag}%
+ mime {#mime}%
+ filename {#file}%
+ option {#option}%
+ \relax}
\def\scrn_rendering_set[#tag][#option]% {content} % crappy
{\bgroup
\dowithnextbox
- {\ctxcommand{registerrendering{
- type = "internal",
- label = "#tag",
- mime = "IRO", % brrr
- filename = "#tag",
- option = "#option",
- }}%
+ {\clf_registerrendering
+ type {internal}%
+ label {#tag}%
+ mime {IRO}% brrr
+ filename {#tag}%
+ option {#option}%
+ \relax
\let\objectoffset\zeropoint
\setobject{IRO}{#tag}\hbox{\box\nextbox}%
\egroup}%
\hbox}
-\def\renderingtype #tag{\ctxcommand{renderingvar("#tag","type")}}
-\def\renderingoption#tag{\ctxcommand{renderingvar("#tag","option")}}
+\def\renderingtype #tag{\clf_renderingvar{#tag}{type}}
+\def\renderingoption#tag{\clf_renderingvar{#tag}{option}}
\newdimen\d_scrn_rendering_width \d_scrn_rendering_width 8cm
\newdimen\d_scrn_rendering_height \d_scrn_rendering_height 6cm
@@ -648,13 +648,14 @@
\letrenderingwindowparameter\c!offset\v!overlay
\inheritedrenderingwindowframed
{\vfill
- \ctxcommand{insertrenderingwindow {
- label = "\currentrendering",
- width = \number\d_scrn_rendering_width,
- height = \number\d_scrn_rendering_height,
- option = "\renderingoption\currentrendering",
- page = \number\m_scrn_rendering_page,
- }}\hfill}%
+ \clf_insertrenderingwindow
+ label {\currentrendering}%
+ width \d_scrn_rendering_width
+ height \d_scrn_rendering_height
+ option {\renderingoption\currentrendering}%
+ page \m_scrn_rendering_page
+ \relax
+ \hfill}%
\egroup}
%D Linkedlists (not tested in mkvi):
@@ -676,7 +677,7 @@
% \let\setupbutton\setuplinkedlists\setuplinkedlist
%
% \appendtoks
-% \ctxcommand{definelinkedlist("\currentlinkedlist")}%
+% \clf_definelinkedlist{\currentlinkedlist}%
% \to \everydefinelinkedlist
%
% \def\setlinkedlistproperties#1#2#3#4#5#6%
@@ -694,8 +695,8 @@
% \edef\currentlinkedlist{#1}%
% \ifcsname\??lk\currentlinkedlist\s!parent\endcsname
% \hskip\linkedlistparameter\c!distance
-% \ctxcommand{addlinklistelement("\currentlinkedlist")}%
-% \expanded{\ctxlatelua{commands.enhancelinkedlist("\currentlinkedlist",\currentlink)}}% can also be done at the lua end
+% \clf_addlinklistelement{\currentlinkedlist}%
+% \expanded{\ctxlatecommand{enhancelinkedlist("\currentlinkedlist",\currentlink)}}% can also be done at the lua end
% \dogotosomepage {\??lk\currentlinkedlist}\gotobegincharacter \firstlink
% \ifnum\noflinks>\plustwo
% \dogotosomepage{\??lk\currentlinkedlist}\gobackwardcharacter\previouslink
diff --git a/Master/texmf-dist/tex/context/base/scrp-ini.lua b/Master/texmf-dist/tex/context/base/scrp-ini.lua
index a6bfe4cf9e3..3c3517542d3 100644
--- a/Master/texmf-dist/tex/context/base/scrp-ini.lua
+++ b/Master/texmf-dist/tex/context/base/scrp-ini.lua
@@ -27,6 +27,8 @@ local texsetattribute = tex.setattribute
local nodecodes = nodes.nodecodes
local unsetvalue = attributes.unsetvalue
+local implement = interfaces.implement
+
local glyph_code = nodecodes.glyph
local glue_code = nodecodes.glue
@@ -475,18 +477,19 @@ function scripts.injectors.handler(head)
normal_process = handler.injector
end
if normal_process then
+ -- wrong: originals are indices !
local f = getfont(start)
if f ~= lastfont then
originals = fontdata[f].resources
if resources then
originals = resources.originals
else
- -- can't happen
+ originals = nil -- can't happen
end
lastfont = f
end
local c = getchar(start)
- if originals then
+ if originals and type(originals) == "number" then
c = originals[c] or c
end
local h = hash[c]
@@ -937,5 +940,22 @@ function autofontfeature.disable()
disableaction("processors","scripts.autofontfeature.handler")
end
-commands.enableautofontscript = autofontfeature.enable
-commands.disableautofontscript = autofontfeature.disable
+implement {
+ name = "enableautofontscript",
+ actions = autofontfeature.enable
+}
+
+implement {
+ name = "disableautofontscript",
+ actions = autofontfeature.disable }
+
+implement {
+ name = "setscript",
+ actions = scripts.set,
+ arguments = { "string", "string", "string" }
+}
+
+implement {
+ name = "resetscript",
+ actions = scripts.reset
+}
diff --git a/Master/texmf-dist/tex/context/base/scrp-ini.mkiv b/Master/texmf-dist/tex/context/base/scrp-ini.mkiv
index 4a27dd8e2bf..cd060c02bbd 100644
--- a/Master/texmf-dist/tex/context/base/scrp-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/scrp-ini.mkiv
@@ -41,14 +41,14 @@
\to \everydefinescript
\unexpanded\def\scripts_basics_set
- {\ctxlua{scripts.set("\currentscript","\scriptparameter\c!method","\scriptparameter\c!preset")}}
+ {\clf_setscript{\currentscript}{\scriptparameter\c!method}{\scriptparameter\c!preset}}
\unexpanded\def\setscript[#1]%
{\edef\currentscript{#1}%
\scripts_basics_set}
\unexpanded\def\resetscript
- {\ctxlua{scripts.reset()}}
+ {\clf_resetscript}
\unexpanded\def\startscript[#1]%
{\begingroup
@@ -86,8 +86,8 @@
\fi
\to \everysetupscript
-\unexpanded\def\enableautofontscript {\ctxcommand{enableautofontscript ()}}
-\unexpanded\def\disableautofontscript{\ctxcommand{disableautofontscript()}}
+\unexpanded\def\enableautofontscript {\clf_enableautofontscript }
+\unexpanded\def\disableautofontscript{\clf_disableautofontscript}
\definefontfeature[latn][script=latn]
\definefontfeature[grek][script=grek]
diff --git a/Master/texmf-dist/tex/context/base/sort-ini.lua b/Master/texmf-dist/tex/context/base/sort-ini.lua
index 9ac020166a8..99597761311 100644
--- a/Master/texmf-dist/tex/context/base/sort-ini.lua
+++ b/Master/texmf-dist/tex/context/base/sort-ini.lua
@@ -39,19 +39,28 @@ relatively easy to do.</p>
how they map onto this mechanism. I've learned that users can come up
with any demand so nothing here is frozen.</p>
+<p>Todo: I ran into the Unicode Collation document and noticed that
+there are some similarities (like the weights) but using that method
+would still demand extra code for language specifics. One option is
+to use the allkeys.txt file for the uc vectors but then we would also
+use the collapsed key (sq, code is now commented). In fact, we could
+just hook those into the replacer code that we reun beforehand.</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 gsub, rep, sub, sort, concat = string.gsub, string.rep, string.sub, table.sort, table.concat
+local gsub, rep, sub, sort, concat, tohash, format = string.gsub, string.rep, string.sub, table.sort, table.concat, table.tohash, string.format
local utfbyte, utfchar, utfcharacters, utfvalues = utf.byte, utf.char, utf.characters, utf.values
local next, type, tonumber, rawget, rawset = next, type, tonumber, rawget, rawset
+local P, Cs, R, S, lpegmatch = lpeg.P, lpeg.Cs, lpeg.R, lpeg.S, lpeg.match
local allocate = utilities.storage.allocate
local setmetatableindex = table.setmetatableindex
local trace_tests = false trackers.register("sorters.tests", function(v) trace_tests = v end)
local trace_methods = false trackers.register("sorters.methods", function(v) trace_methods = v end)
+local trace_orders = false trackers.register("sorters.orders", function(v) trace_orders = v end)
local report_sorters = logs.reporter("languages","sorters")
@@ -65,7 +74,9 @@ local digitsoffset = 0x20000 -- frozen
local digitsmaximum = 0xFFFFF -- frozen
local lccodes = characters.lccodes
+local uccodes = characters.uccodes
local lcchars = characters.lcchars
+local ucchars = characters.ucchars
local shchars = characters.shchars
local fscodes = characters.fscodes
local fschars = characters.fschars
@@ -81,7 +92,7 @@ local v_after = variables.after
local v_first = variables.first
local v_last = variables.last
-local validmethods = table.tohash {
+local validmethods = tohash {
"ch", -- raw character (for tracing)
"mm", -- minus mapping
"zm", -- zero mapping
@@ -101,11 +112,11 @@ local predefinedmethods = {
}
sorters = {
- comparers = comparers,
- splitters = splitters,
- definitions = definitions,
- tracers = tracers,
- constants = {
+ comparers = comparers,
+ splitters = splitters,
+ definitions = definitions,
+ tracers = tracers,
+ constants = {
ignoredoffset = ignoredoffset,
replacementoffset = replacementoffset,
digitsoffset = digitsoffset,
@@ -113,6 +124,7 @@ sorters = {
defaultlanguage = v_default,
defaultmethod = v_default,
defaultdigits = v_numbers,
+ validmethods = validmethods,
}
}
@@ -156,6 +168,7 @@ local mte = { -- todo: assign to t
}
local noorder = false
+local nothing = { 0 }
local function preparetables(data)
local orders, lower, m_mappings, z_mappings, p_mappings = data.orders, data.lower, { }, { }, { }
@@ -168,12 +181,12 @@ local function preparetables(data)
__index = function(t,k)
local n, nn
if k then
- if trace_tests then
+ if trace_orders then
report_sorters("simplifing character %C",k)
end
local l = lower[k] or lcchars[k]
if l then
- if trace_tests then
+ if trace_orders then
report_sorters(" 1 lower: %C",l)
end
local ml = rawget(t,l)
@@ -184,7 +197,7 @@ local function preparetables(data)
nn = nn + 1
n[nn] = ml[i] + (t.__delta or 0)
end
- if trace_tests then
+ if trace_orders then
report_sorters(" 2 order: % t",n)
end
end
@@ -192,7 +205,7 @@ local function preparetables(data)
if not n then
local s = shchars[k] -- maybe all components?
if s and s ~= k then
- if trace_tests then
+ if trace_orders then
report_sorters(" 3 shape: %C",s)
end
n = { }
@@ -200,7 +213,7 @@ local function preparetables(data)
for l in utfcharacters(s) do
local ml = rawget(t,l)
if ml then
- if trace_tests then
+ if trace_orders then
report_sorters(" 4 keep: %C",l)
end
if ml then
@@ -212,7 +225,7 @@ local function preparetables(data)
else
l = lower[l] or lcchars[l]
if l then
- if trace_tests then
+ if trace_orders then
report_sorters(" 5 lower: %C",l)
end
local ml = rawget(t,l)
@@ -226,44 +239,45 @@ local function preparetables(data)
end
end
else
- -- -- we probably never enter this branch
- -- -- fschars returns a single char
- --
- -- s = fschars[k]
- -- if s and s ~= k then
- -- if trace_tests then
- -- report_sorters(" 6 split: %s",s)
- -- end
- -- local ml = rawget(t,s)
- -- if ml then
- -- n = { }
- -- nn = 0
- -- for i=1,#ml do
- -- nn = nn + 1
- -- n[nn] = ml[i]
- -- end
- -- end
- -- end
- local b = utfbyte(k)
- n = decomposed[b] or { b }
- if trace_tests then
- report_sorters(" 6 split: %s",utf.tostring(b)) -- todo
+ -- this is a kind of last resort branch that we might want to revise
+ -- one day
+ --
+ -- local b = utfbyte(k)
+ -- n = decomposed[b] or { b }
+ -- if trace_tests then
+ -- report_sorters(" 6 split: %s",utf.tostring(b)) -- todo
+ -- end
+ --
+ -- we need to move way above valid order (new per 2014-10-16) .. maybe we
+ -- need to move it even more up to get numbers right (not all have orders)
+ --
+ if k == "\000" then
+ n = nothing -- shared
+ if trace_orders then
+ report_sorters(" 6 split: space") -- todo
+ end
+ else
+ local b = 2 * #orders + utfbyte(k)
+ n = decomposed[b] or { b } -- could be shared tables
+ if trace_orders then
+ report_sorters(" 6 split: %s",utf.tostring(b)) -- todo
+ end
end
end
if n then
- if trace_tests then
+ if trace_orders then
report_sorters(" 7 order: % t",n)
end
else
n = noorder
- if trace_tests then
+ if trace_orders then
report_sorters(" 8 order: 0")
end
end
end
else
n = noorder
- if trace_tests then
+ if trace_orders then
report_sorters(" 9 order: 0")
end
end
@@ -298,11 +312,11 @@ local function update() -- prepare parent chains, needed when new languages are
end
end
-local function setlanguage(l,m,d,u)
+local function setlanguage(l,m,d,u) -- this will become a specification table
language = (l ~= "" and l) or constants.defaultlanguage
- data = definitions[language or constants.defaultlanguage] or definitions[constants.defaultlanguage]
- method = (m ~= "" and m) or data.method or constants.defaultmethod
- digits = (d ~= "" and d) or data.digits or constants.defaultdigits
+ data = definitions[language or constants.defaultlanguage] or definitions[constants.defaultlanguage]
+ method = (m ~= "" and m) or (data.method ~= "" and data.method) or constants.defaultmethod
+ digits = (d ~= "" and d) or (data.digits ~= "" and data.digits) or constants.defaultdigits
if trace_tests then
report_sorters("setting language %a, method %a, digits %a",language,method,digits)
end
@@ -333,8 +347,8 @@ local function setlanguage(l,m,d,u)
report_sorters("invalid sorter method %a in %a",s,method)
end
end
+ usedinsequence = tohash(sequence)
data.sequence = sequence
- usedinsequence = table.tohash(sequence)
data.usedinsequence = usedinsequence
-- usedinsequence.ch = true -- better just store the string
if trace_tests then
@@ -356,6 +370,8 @@ end
-- tricky: { 0, 0, 0 } vs { 0, 0, 0, 0 } => longer wins and mm, pm, zm can have them
+-- inlining and checking first slot first doesn't speed up (the 400K complex author sort)
+
local function basicsort(sort_a,sort_b)
if sort_a and sort_b then
local na = #sort_a
@@ -363,12 +379,14 @@ local function basicsort(sort_a,sort_b)
if na > nb then
na = nb
end
- for i=1,na do
- local ai, bi = sort_a[i], sort_b[i]
- if ai > bi then
- return 1
- elseif ai < bi then
- return -1
+ if na > 0 then
+ for i=1,na do
+ local ai, bi = sort_a[i], sort_b[i]
+ if ai > bi then
+ return 1
+ elseif ai < bi then
+ return -1
+ end
end
end
end
@@ -378,6 +396,10 @@ end
-- todo: compile compare function
local function basic(a,b) -- trace ea and eb
+ if a == b then
+ -- hashed (shared) entries
+ return 0
+ end
local ea, eb = a.split, b.split
local na, nb = #ea, #eb
if na == 0 and nb == 0 then
@@ -437,31 +459,72 @@ local function basic(a,b) -- trace ea and eb
end
end
+-- if we use sq:
+--
+-- local function basic(a,b) -- trace ea and eb
+-- local ea, eb = a.split, b.split
+-- local na, nb = #ea, #eb
+-- if na == 0 and nb == 0 then
+-- -- simple variant (single word)
+-- return basicsort(ea.sq,eb.sq)
+-- else
+-- -- complex variant, used in register (multiple words)
+-- local result = 0
+-- for i=1,nb < na and nb or na do
+-- local eai, ebi = ea[i], eb[i]
+-- result = basicsort(ea.sq,eb.sq)
+-- if result ~= 0 then
+-- return result
+-- end
+-- end
+-- if result ~= 0 then
+-- return result
+-- elseif na > nb then
+-- return 1
+-- elseif nb > na then
+-- return -1
+-- else
+-- return 0
+-- end
+-- end
+-- end
+
comparers.basic = basic
function sorters.basicsorter(a,b)
return basic(a,b) == -1
end
-local function numify(s)
- s = digitsoffset + tonumber(s) -- alternatively we can create range
- if s > digitsmaximum then
- s = digitsmaximum
+local function numify(old)
+ if digits == v_numbers then -- was swapped, fixed 2014-11-10
+ local new = digitsoffset + tonumber(old) -- alternatively we can create range
+ if new > digitsmaximum then
+ new = digitsmaximum
+ end
+ return utfchar(new)
+ else
+ return old
end
- return utfchar(s)
+end
+
+local pattern = nil
+
+local function prepare()
+ pattern = Cs( (
+ characters.tex.toutfpattern()
+ + lpeg.patterns.whitespace / "\000"
+ + (P("\\") / "") * R("AZ")^0 * (P(-1) + #(1-R("AZ")))
+ + (P("\\") * P(1) * R("az","AZ")^0) / ""
+ + S("[](){}$\"'") / ""
+ + R("09")^1 / numify
+ + P(1)
+ )^0 )
+ return pattern
end
function sorters.strip(str) -- todo: only letters and such
if str and str ~= "" then
- -- todo: make a decent lpeg
- str = gsub(str,"\\[\"\'~^`]*","") -- \"e -- hm, too greedy
- str = gsub(str,"\\%S*","") -- the rest
- str = gsub(str,"%s","\001") -- can be option
- str = gsub(str,"[%s%[%](){}%$\"\']*","") -- %s already done
- if digits == v_numbers then
- str = gsub(str,"(%d+)",numify) -- sort numbers properly
- end
- return str
+ return lpegmatch(pattern or prepare(),str)
else
return ""
end
@@ -529,10 +592,15 @@ function splitters.utf(str,checked) -- we could append m and u but this is clean
else
n = n + 1
local l = lower[sc]
- l = l and utfbyte(l) or lccodes[b]
+ l = l and utfbyte(l) or lccodes[b] or b
+ -- local u = upper[sc]
+ -- u = u and utfbyte(u) or uccodes[b] or b
if type(l) == "table" then
l = l[1] -- there are currently no tables in lccodes but it can be some, day
end
+ -- if type(u) == "table" then
+ -- u = u[1] -- there are currently no tables in lccodes but it can be some, day
+ -- end
z_case[n] = l
if l ~= b then
m_case[n] = l - 1
@@ -591,9 +659,9 @@ function splitters.utf(str,checked) -- we could append m and u but this is clean
-- p_mapping = { p_mappings[fs][1] }
-- end
-- end
-
+ local result
if checked then
- return {
+ result = {
ch = trace_tests and char or nil, -- not in sequence
uc = usedinsequence.uc and byte or nil,
mc = usedinsequence.mc and m_case or nil,
@@ -604,7 +672,7 @@ function splitters.utf(str,checked) -- we could append m and u but this is clean
pm = usedinsequence.pm and p_mapping or nil,
}
else
- return {
+ result = {
ch = char,
uc = byte,
mc = m_case,
@@ -615,7 +683,15 @@ function splitters.utf(str,checked) -- we could append m and u but this is clean
pm = p_mapping,
}
end
-
+ -- local sq, n = { }, 0
+ -- for i=1,#byte do
+ -- for s=1,#sequence do
+ -- n = n + 1
+ -- sq[n] = result[sequence[s]][i]
+ -- end
+ -- end
+ -- result.sq = sq
+ return result
end
local function packch(entry)
@@ -646,11 +722,11 @@ local function packuc(entry)
if #split > 0 then -- useless test
local t = { }
for i=1,#split do
- t[i] = concat(split[i].uc, " ")
+ t[i] = concat(split[i].uc, " ") -- sq
end
return concat(t," + ")
else
- return concat(split.uc," ")
+ return concat(split.uc," ") -- sq
end
end
@@ -677,7 +753,9 @@ function sorters.sort(entries,cmp)
first = " "
else
s = first
- report_sorters(">> %C (%C)",first,letter)
+ if first and letter then
+ report_sorters(">> %C (%C)",first,letter)
+ end
end
report_sorters(" %s | %s",packch(entry),packuc(entry))
end
diff --git a/Master/texmf-dist/tex/context/base/spac-adj.lua b/Master/texmf-dist/tex/context/base/spac-adj.lua
index c87a9d17f62..cdf9b505119 100644
--- a/Master/texmf-dist/tex/context/base/spac-adj.lua
+++ b/Master/texmf-dist/tex/context/base/spac-adj.lua
@@ -56,3 +56,11 @@ function nodes.handlers.graphicvadjust(head,groupcode) -- we can make an actionc
return head, false
end
end
+
+interfaces.implement {
+ name = "enablegraphicvadjust",
+ onlyonce = true,
+ actions = function()
+ nodes.tasks.enableaction("finalizers","nodes.handlers.graphicvadjust")
+ end
+}
diff --git a/Master/texmf-dist/tex/context/base/spac-adj.mkiv b/Master/texmf-dist/tex/context/base/spac-adj.mkiv
index 447dd722963..b8534303df9 100644
--- a/Master/texmf-dist/tex/context/base/spac-adj.mkiv
+++ b/Master/texmf-dist/tex/context/base/spac-adj.mkiv
@@ -16,18 +16,19 @@
\unprotect
% Very nasty but needed for margin stuff inside colored
-% paragraphs. Obsolete anyway.
+% paragraphs. Obsolete for while .
\registerctxluafile{spac-adj}{1.001}
\definesystemattribute [graphicvadjust] [public]
\unexpanded\def\enablegraphicvadjust
- {\ctxlua{nodes.tasks.enableaction("finalizers","nodes.handlers.graphicvadjust")}%
+ {\writestatus\m!systems{graphicvadjusting is no longer needed!}
+ \clf_enablegraphicvadjust %once anyway
\glet\enablegraphicvadjust\relax}
\unexpanded\def\graphicvadjust % currently not enabled ... nasty bidi handling
- {\enablegraphicvadjust % and no longer needed anyway
+ {\clf_enablegraphicvadjust % and probably no longer needed anyway
\dowithnextboxcontentcs\forgetall\spac_vadjust_graphic_finish\vbox}
\def\spac_vadjust_graphic_finish
diff --git a/Master/texmf-dist/tex/context/base/spac-ali.lua b/Master/texmf-dist/tex/context/base/spac-ali.lua
index 08e33c5b87c..880da6213d5 100644
--- a/Master/texmf-dist/tex/context/base/spac-ali.lua
+++ b/Master/texmf-dist/tex/context/base/spac-ali.lua
@@ -133,7 +133,11 @@ function alignments.set(n)
texsetattribute(a_realign,texgetcount("realpageno") * 10 + n)
end
-commands.setrealign = alignments.set
+interfaces.implement {
+ name = "setrealign",
+ actions = alignments.set,
+ arguments = "integer",
+}
statistics.register("realigning", function()
if nofrealigned > 0 then
diff --git a/Master/texmf-dist/tex/context/base/spac-ali.mkiv b/Master/texmf-dist/tex/context/base/spac-ali.mkiv
index c13e4ca7615..fbcce89c46d 100644
--- a/Master/texmf-dist/tex/context/base/spac-ali.mkiv
+++ b/Master/texmf-dist/tex/context/base/spac-ali.mkiv
@@ -38,8 +38,8 @@
\to \everyforgetall
\unexpanded\def\resetrealignsignal{\attribute\realignattribute\attributeunsetvalue}
-\unexpanded\def\signalinnerrealign{\ctxcommand{setrealign(2)}}
-\unexpanded\def\signalouterrealign{\ctxcommand{setrealign(1)}}
+\unexpanded\def\signalinnerrealign{\clf_setrealign\plustwo}
+\unexpanded\def\signalouterrealign{\clf_setrealign\plusone}
\installcorenamespace{aligncommand}
\installcorenamespace{alignhorizontal}
@@ -562,6 +562,12 @@
\spac_align_use_indeed
\fi}
+\unexpanded\def\dousealignparameter#1% faster local variant
+ {\edef\m_spac_align_asked{#1}%
+ \ifx\m_spac_align_asked\empty\else
+ \spac_align_use_indeed
+ \fi}
+
\def\spac_align_use_indeed
{\expandafter\let\expandafter\raggedcommand\csname\??alignmentnormalcache\m_spac_align_asked\endcsname
\ifx\raggedcommand\relax
@@ -715,7 +721,7 @@
\forgetall
\let\\=\endgraf
\ifdoublesided\signalinnerrealign\fi
- \doifrightpageelse\spac_align_set_horizontal_right\spac_align_set_horizontal_left
+ \doifelserightpage\spac_align_set_horizontal_right\spac_align_set_horizontal_left
\let\next}
\unexpanded\def\obox#1#2#3%
@@ -723,7 +729,7 @@
\forgetall
\let\\=\endgraf
\ifdoublesided\signalouterrealign\fi
- \doifrightpageelse\c_spac_align_state_horizontal_left\spac_align_set_horizontal_right
+ \doifelserightpage\c_spac_align_state_horizontal_left\spac_align_set_horizontal_right
\let\next}
\let\raggedbox\relax
@@ -961,7 +967,7 @@
\hbox}
\def\doxcheckline % used for floats so multipass anyway
- {\signalrightpage\doifrightpageelse\donetrue\donefalse}
+ {\signalrightpage\doifelserightpage\donetrue\donefalse}
\setvalue{\??alignline\v!inner }{\doxalignline\doxcheckline++\zeropoint \relax\hss }
\setvalue{\??alignline\v!outer }{\doxalignline\doxcheckline++\zeropoint \hss \relax}
diff --git a/Master/texmf-dist/tex/context/base/spac-chr.lua b/Master/texmf-dist/tex/context/base/spac-chr.lua
index 5b3a15478ce..e3fa6d09983 100644
--- a/Master/texmf-dist/tex/context/base/spac-chr.lua
+++ b/Master/texmf-dist/tex/context/base/spac-chr.lua
@@ -14,13 +14,14 @@ local byte, lower = string.byte, string.lower
-- to be redone: characters will become tagged spaces instead as then we keep track of
-- spaceskip etc
--- todo: only setattr when export
+-- todo: only setattr when export / use properties
local next = next
-trace_characters = false trackers.register("typesetters.characters", function(v) trace_characters = v end)
+local trace_characters = false trackers.register("typesetters.characters", function(v) trace_characters = v end)
+local trace_nbsp = false trackers.register("typesetters.nbsp", function(v) trace_nbsp = v end)
-report_characters = logs.reporter("typesetting","characters")
+local report_characters = logs.reporter("typesetting","characters")
local nodes, node = nodes, node
@@ -39,6 +40,8 @@ local setattr = nuts.setattr
local getfont = nuts.getfont
local getchar = nuts.getchar
+local setcolor = nodes.tracers.colors.set
+
local insert_node_before = nuts.insert_before
local insert_node_after = nuts.insert_after
local remove_node = nuts.remove
@@ -50,6 +53,8 @@ local tasks = nodes.tasks
local nodepool = nuts.pool
local new_penalty = nodepool.penalty
local new_glue = nodepool.glue
+local new_kern = nodepool.kern
+local new_rule = nodepool.rule
local nodecodes = nodes.nodecodes
local skipcodes = nodes.skipcodes
@@ -107,13 +112,22 @@ local function inject_char_space(unicode,head,current,parent)
end
local function inject_nobreak_space(unicode,head,current,space,spacestretch,spaceshrink)
- local attr = getfield(current,"attr")
- local glue = new_glue(space,spacestretch,spaceshrink)
+ local attr = getfield(current,"attr")
+ local glue = new_glue(space,spacestretch,spaceshrink)
local penalty = new_penalty(10000)
setfield(glue,"attr",attr)
setfield(current,"attr",nil)
- setattr(glue,a_character,unicode)
+ setattr(glue,a_character,unicode) -- bombs
head, current = insert_node_after(head,current,penalty)
+ if trace_nbsp then
+ local rule = new_rule(space)
+ local kern = new_kern(-space)
+ local penalty = new_penalty(10000)
+ setcolor(rule,"orange")
+ head, current = insert_node_after(head,current,rule)
+ head, current = insert_node_after(head,current,kern)
+ head, current = insert_node_after(head,current,penalty)
+ end
head, current = insert_node_after(head,current,glue)
return head, current
end
diff --git a/Master/texmf-dist/tex/context/base/spac-chr.mkiv b/Master/texmf-dist/tex/context/base/spac-chr.mkiv
index f9dc6e16b5f..562fb940ce1 100644
--- a/Master/texmf-dist/tex/context/base/spac-chr.mkiv
+++ b/Master/texmf-dist/tex/context/base/spac-chr.mkiv
@@ -77,6 +77,7 @@
\let\zwnj\zerowidthnonjoiner
\let\zwj \zerowidthjoiner
+\let\nbsp\nobreakspace
\chardef\optionalspace"1F % will be space unless before punctuation
diff --git a/Master/texmf-dist/tex/context/base/spac-hor.lua b/Master/texmf-dist/tex/context/base/spac-hor.lua
index c9d6e2b154b..5d5a43e311c 100644
--- a/Master/texmf-dist/tex/context/base/spac-hor.lua
+++ b/Master/texmf-dist/tex/context/base/spac-hor.lua
@@ -6,14 +6,15 @@ if not modules then modules = { } end modules ['spac-hor'] = {
license = "see context related readme files"
}
-local match = string.match
local utfbyte = utf.byte
+local lpegmatch, P, C = lpeg.match, lpeg.P, lpeg.C
local context = context
-local commands = commands
local chardata = characters.data
+local p_check = P("the ") * (P("letter") + P("character")) * P(" ") * lpeg.patterns.utf8byte -- is a capture already
+
local can_have_space = table.tohash {
"lu", "ll", "lt", "lm", "lo", -- letters
-- "mn", "mc", "me", -- marks
@@ -26,10 +27,18 @@ local can_have_space = table.tohash {
-- "cc", "cf", "cs", "co", "cn", -- others
}
-function commands.autonextspace(str) -- todo: use nexttoken
- local ch = match(str,"the letter (.)") or match(str,"the character (.)")
- ch = ch and chardata[utfbyte(ch)]
- if ch and can_have_space[ch.category] then
- context.space()
+local function autonextspace(str) -- todo: make a real not intrusive lookahead
+ local b = lpegmatch(p_check,str)
+ if b then
+ local d = chardata[b]
+ if d and can_have_space[d.category] then
+ context.space()
+ end
end
end
+
+interfaces.implement {
+ name = "autonextspace",
+ actions = autonextspace,
+ arguments = "string",
+}
diff --git a/Master/texmf-dist/tex/context/base/spac-hor.mkiv b/Master/texmf-dist/tex/context/base/spac-hor.mkiv
index 92491ce3218..54156c3b428 100644
--- a/Master/texmf-dist/tex/context/base/spac-hor.mkiv
+++ b/Master/texmf-dist/tex/context/base/spac-hor.mkiv
@@ -32,7 +32,7 @@
{\doifoutervmode{\ifconditional\c_spac_indentation_indent_first\else\spac_indentation_variant_no\fi}}
\unexpanded\def\setupindenting
- {\doifnextoptionalcselse\spac_indentation_setup_options\spac_indentation_setup_size}
+ {\doifelsenextoptionalcs\spac_indentation_setup_options\spac_indentation_setup_size}
\unexpanded\def\spac_indentation_setup_size
{\assigndimension\v_spac_indentation_current\d_spac_indentation_par{1\emwidth}{1.5\emwidth}{2\emwidth}}
@@ -64,6 +64,12 @@
\def\spac_indentation_set_everypar
{\everypar{\checkindentation}}
+\unexpanded\def\useindentingparameter#1% faster local variant
+ {\edef\m_spac_indentation_options{#1\c!indenting}%
+ \ifx\m_spac_indentation_options\empty \else
+ \spac_indentation_setup_indeed
+ \fi}
+
% \def\spac_indentation_apply_step_one#1%
% {\ifcsname\??indentingmethod#1\endcsname
% % case two
@@ -122,7 +128,7 @@
\fi\fi}
\unexpanded\def\indenting % kind of obsolete
- {\doifnextoptionalcselse\spac_indentation_setup_options\relax}
+ {\doifelsenextoptionalcs\spac_indentation_setup_options\relax}
% use \noindentation to suppress next indentation
@@ -258,7 +264,7 @@
\unexpanded\def\spac_indentation_check_next_indentation
{\global\let\dorechecknextindentation\relax
- \doifnextcharelse\par\donothing\spac_indentation_variant_no} % messy check as next is seldom \par
+ \doifelsenextchar\par\donothing\spac_indentation_variant_no} % messy check as next is seldom \par
\def\spac_indentation_variant_auto
{\global\let\dorechecknextindentation\spac_indentation_check_next_indentation}
@@ -380,7 +386,7 @@
\installspacingmethod \v!broad {\nonfrenchspacing} % more depending on what punctuation
\unexpanded\def\setupspacing
- {\doifnextoptionalcselse\spac_spacecodes_setup_yes\spac_spacecodes_setup_nop}
+ {\doifelsenextoptionalcs\spac_spacecodes_setup_yes\spac_spacecodes_setup_nop}
\def\spac_spacecodes_setup_yes[#1]%
{\csname\??spacecodemethod#1\endcsname
@@ -671,7 +677,7 @@
\fi}
\def\spac_narrower_start_named_one[#1]%
- {\doifassignmentelse{#1}\spac_narrower_start_named_one_yes\spac_narrower_start_named_one_nop[#1]}
+ {\doifelseassignment{#1}\spac_narrower_start_named_one_yes\spac_narrower_start_named_one_nop[#1]}
\def\spac_narrower_start_named_one_yes[#1][#2]% [settings] []
{\setupcurrentnarrower[#1]%
@@ -682,14 +688,14 @@
\spac_narrower_start_apply{\narrowerparameter\v!default}}
\def\spac_narrower_start_named_two[#1]%
- {\doifassignmentelse{#1}\spac_narrower_start_named_settings_how\spac_narrower_start_named_tag_unknown[#1]}
+ {\doifelseassignment{#1}\spac_narrower_start_named_settings_how\spac_narrower_start_named_tag_unknown[#1]}
\def\spac_narrower_start_named_settings_how[#1][#2]% [settings] [how]
{\setupcurrentnarrower[#1]%
\spac_narrower_start_apply{#2}}
\def\spac_narrower_start_named_tag_unknown[#1][#2]% [tag] [...]
- {\doifassignmentelse{#2}\spac_narrower_start_named_tag_settings\spac_narrower_start_named_tag_how[#1][#2]}
+ {\doifelseassignment{#2}\spac_narrower_start_named_tag_settings\spac_narrower_start_named_tag_how[#1][#2]}
\def\spac_narrower_start_named_tag_settings[#1][#2]% [tag] [settings]
{\edef\currentnarrower{#1}%
@@ -733,8 +739,8 @@
\unexpanded\def\dosetleftskipadaption #1{\leftskipadaption \ifcsname\??skipadaptionleft #1\endcsname\csname\??skipadaptionleft #1\endcsname\else#1\fi\relax}
\unexpanded\def\dosetrightskipadaption#1{\rightskipadaption\ifcsname\??skipadaptionright#1\endcsname\csname\??skipadaptionright#1\endcsname\else#1\fi\relax}
-\unexpanded\def\doadaptleftskip #1{\dosetleftskipadaption {#1}\advance\leftskip \leftskipadaption }
-\unexpanded\def\doadaptrightskip#1{\dosetrightskipadaption{#1}\advance\rightskip\rightskipadaption}
+\unexpanded\def\doadaptleftskip #1{\normalexpanded{\dosetleftskipadaption {#1}}\advance\leftskip \leftskipadaption }
+\unexpanded\def\doadaptrightskip#1{\normalexpanded{\dosetrightskipadaption{#1}}\advance\rightskip\rightskipadaption}
\unexpanded\def\forgetbothskips
{\leftskip\zeropoint
@@ -780,7 +786,7 @@
{\dosingleargument\spac_tolerances_setup}
\def\spac_tolerances_setup[#1]%
- {\doifinsetelse\v!vertical{#1}%
+ {\doifelseinset\v!vertical{#1}%
{\processcommacommand[#1]\spac_tolerances_step_vertical }
{\processcommacommand[#1]\spac_tolerances_step_horizontal}}
@@ -850,31 +856,6 @@
%D In \CONTEXT\ however we save some processing time by putting
%D an extra \type{\hbox} around the \type{\strutbox}.
-% moved from page-lin.tex to here (due to visualization added
-% in august 2003)
-%
-% \unexpanded \def\crlf
-% {\ifhmode\unskip\else\strut\fi\ifcase\raggedstatus\hfil\fi\break}
-
-\unexpanded\def\crlf
- {\ifhmode
- \unskip
- \prewordbreak\crlfplaceholder
- \ifcase\raggedstatus\hfil\or\or\or\hfil\fi
- \break
- \else
- \crlfplaceholder
- \endgraf
- \fi}
-
-\unexpanded\def\crlfplaceholder
- {\strut}
-
-\unexpanded\def\settestcrlf
- {\unexpanded\def\crlfplaceholder
- {\hbox to \zeropoint
- {\strut{\infofont\kern.25em}\lohi{\infofont CR}{\infofont LF}\hss}}}
-
%D \starttyping
%D % \setuplayout[gridgrid=yes] \showgrid
%D
@@ -1065,7 +1046,7 @@
{\futurelet\nexttoken\spac_spaces_auto_insert_next}
\def\spac_spaces_auto_insert_next
- {\ctxcommand{autonextspace(\!!bs\meaning\nexttoken\!!es)}} % todo, just consult nexttoken at the lua end
+ {\clf_autonextspace{\meaning\nexttoken}} % todo, just consult nexttoken at the lua end
%D Moved from bib module:
@@ -1100,7 +1081,7 @@
%D A rather unknown one:
\unexpanded\def\widened % moved from cont-new
- {\doifnextoptionalcselse\spac_widened_yes\spac_widened_nop}
+ {\doifelsenextoptionalcs\spac_widened_yes\spac_widened_nop}
\def\spac_widened_yes[#1]#2{\hbox \s!spread #1{\hss#2\hss}}
\def\spac_widened_nop #1{\hbox \s!spread \emwidth{\hss#1\hss}}
diff --git a/Master/texmf-dist/tex/context/base/spac-lin.mkiv b/Master/texmf-dist/tex/context/base/spac-lin.mkiv
index 094e18e0bac..20fec5d4537 100644
--- a/Master/texmf-dist/tex/context/base/spac-lin.mkiv
+++ b/Master/texmf-dist/tex/context/base/spac-lin.mkiv
@@ -88,13 +88,13 @@
\linesparameter\c!before
\pushmacro\checkindentation
\whitespace
- \dostarttagged\t!lines\currentlines
+ \dostarttaggedchained\t!lines\currentlines\??lines
\begingroup
\uselinesstyleandcolor\c!style\c!color
- \setupindenting[\linesparameter\c!indenting]%
- \setupalign[\linesparameter\c!align]%
+ \useindentingparameter\linesparameter
+ \usealignparameter\linesparameter
\typesettinglinestrue
- \setupwhitespace[\v!none]%
+ \setupwhitespace[\v!none]% todo use fast variant
%\obeylines % move upwards to keep spaces in the first line due to optional argument
\ignorespaces
\glet\spac_after_first_obeyed_line\spac_lines_after_first_obeyed_line_a
@@ -128,7 +128,7 @@
\egroup}
\def\spac_lines_between
- {\doifmeaningelse\next\obeyedline % brrr
+ {\doifelsemeaning\next\obeyedline % brrr
{\linesparameter\c!inbetween}
{\spac_after_first_obeyed_line}}
diff --git a/Master/texmf-dist/tex/context/base/spac-pag.mkiv b/Master/texmf-dist/tex/context/base/spac-pag.mkiv
index da4c8e9703b..1ecc31d8cd5 100644
--- a/Master/texmf-dist/tex/context/base/spac-pag.mkiv
+++ b/Master/texmf-dist/tex/context/base/spac-pag.mkiv
@@ -51,7 +51,7 @@
\setpagestaterealpageno{#1}{\number#2}%
\fi}
-\unexpanded\def\doifrightpagestateelse#1#2% not expandable !
+\unexpanded\def\doifelserightpagestate#1#2% not expandable !
{\ifcase\frozenpagestate
\pagestatemismatchfalse
\realpagestateno\realfolio
@@ -100,7 +100,7 @@
\expandafter\secondoftwoarguments
\fi}
-\unexpanded\def\doifforcedrightpagestateelse#1#2%
+\unexpanded\def\doifelseforcedrightpagestate#1#2%
{\ifcase\frozenpagestate
\pagestatemismatchfalse
\realpagestateno\realfolio
@@ -135,6 +135,9 @@
\expandafter\secondoftwoarguments
\fi}
+\let\doifrightpagestateelse \doifelserightpagestate
+\let\doifforcedrightpagestateelse\doifelseforcedrightpagestate
+
\unexpanded\def\freezepagestate {\frozenpagestate\plusone }
\unexpanded\def\defrostpagestate{\frozenpagestate\zerocount}
@@ -147,7 +150,9 @@
\definepagestate[\s!paragraph]
\unexpanded\def\signalrightpage {\dotrackpagestate \s!paragraph\nofraggedparagraphs} % use \dontleavehmode if needed
-\unexpanded\def\doifrightpageelse{\doifrightpagestateelse\s!paragraph\nofraggedparagraphs}
+\unexpanded\def\doifelserightpage{\doifelserightpagestate\s!paragraph\nofraggedparagraphs}
+
+\let\doifrightpageelse\doifelserightpage
\installcorenamespace{pagechanges}
diff --git a/Master/texmf-dist/tex/context/base/spac-par.mkiv b/Master/texmf-dist/tex/context/base/spac-par.mkiv
index 825cdca462b..4dd3db24338 100644
--- a/Master/texmf-dist/tex/context/base/spac-par.mkiv
+++ b/Master/texmf-dist/tex/context/base/spac-par.mkiv
@@ -203,6 +203,8 @@
% \glet\flushpostponednodedata\spac_postponed_data_flush
% \fi}
+\newtoks\everyflushatnextpar
+
\unexpanded\def\pushpostponednodedata
{\globalpushbox\b_spac_postponed_data}
@@ -214,6 +216,7 @@
\unexpanded\def\flushatnextpar
{\begingroup
+ \the\everyflushatnextpar
\glet\flushpostponednodedata\spac_postponed_data_flush
\dowithnextboxcs\spac_postponed_data_finish\hbox}
diff --git a/Master/texmf-dist/tex/context/base/spac-ver.lua b/Master/texmf-dist/tex/context/base/spac-ver.lua
index d5a2b4d5693..fc6fba0eb43 100644
--- a/Master/texmf-dist/tex/context/base/spac-ver.lua
+++ b/Master/texmf-dist/tex/context/base/spac-ver.lua
@@ -8,11 +8,16 @@ if not modules then modules = { } end modules ['spac-ver'] = {
-- we also need to call the spacer for inserts!
+-- somehow lists still don't always have proper prev nodes so i need to
+-- check all of the luatex code some day .. maybe i should replece the
+-- whole mvl handler by lua code .. why not
+
-- todo: use lua nodes with lua data (>0.79)
-- see ** can go when 0.79
-- this code dates from the beginning and is kind of experimental; it
--- will be optimized and improved soon
+-- will be optimized and improved soon .. it's way too complex now but
+-- dates from less possibilities
--
-- the collapser will be redone with user nodes; also, we might get make
-- parskip into an attribute and appy it explicitly thereby getting rid
@@ -33,13 +38,20 @@ local formatters = string.formatters
local P, C, R, S, Cc = lpeg.P, lpeg.C, lpeg.R, lpeg.S, lpeg.Cc
-local nodes, node, trackers, attributes, context, commands, tex = nodes, node, trackers, attributes, context, commands, tex
+local nodes = nodes
+local node = node
+local trackers = trackers
+local attributes = attributes
+local context = context
+local tex = tex
local texlists = tex.lists
local texgetdimen = tex.getdimen
+local texsetdimen = tex.setdimen
local texnest = tex.nest
local variables = interfaces.variables
+local implement = interfaces.implement
-- vertical space handler
@@ -104,6 +116,7 @@ local nodepool = nuts.pool
local new_penalty = nodepool.penalty
local new_kern = nodepool.kern
local new_rule = nodepool.rule
+local new_glue = nodepool.glue
local new_gluespec = nodepool.gluespec
local nodecodes = nodes.nodecodes
@@ -134,11 +147,13 @@ local default = {
strut = true,
hfraction = 1,
dfraction = 1,
+ bfraction = 0.25,
}
local fractions = {
minheight = "hfraction", maxheight = "hfraction",
mindepth = "dfraction", maxdepth = "dfraction",
+ box = "bfraction",
top = "tlines", bottom = "blines",
}
@@ -330,27 +345,58 @@ local function snap_hlist(where,current,method,height,depth) -- method.strut is
t[#t+1] = formatters["auto: snapht %p snapdp %p"](snapht,snapdp)
end
end
- local h = height or getfield(current,"height")
- local d = depth or getfield(current,"depth")
- local hr, dr, ch, cd = method.hfraction or 1, method.dfraction or 1, h, d
- local tlines, blines = method.tlines or 1, method.blines or 1
- local done, plusht, plusdp = false, snapht, snapdp
+
+ local h = (method.noheight and 0) or height or getfield(current,"height")
+ local d = (method.nodepth and 0) or depth or getfield(current,"depth")
+ local hr = method.hfraction or 1
+ local dr = method.dfraction or 1
+ local br = method.bfraction or 0
+ local ch = h
+ local cd = d
+ local tlines = method.tlines or 1
+ local blines = method.blines or 1
+ local done = false
+ local plusht = snapht
+ local plusdp = snapdp
local snaphtdp = snapht + snapdp
- if method.none then
+ if method.box then
+ local br = 1 - br
+ if br < 0 then
+ br = 0
+ elseif br > 1 then
+ br = 1
+ end
+ local n = ceiled((h+d-br*snapht-br*snapdp)/snaphtdp)
+ local x = n * snaphtdp - h - d
+ plusht = h + x / 2
+ plusdp = d + x / 2
+ elseif method.max then
+ local n = ceiled((h+d)/snaphtdp)
+ local x = n * snaphtdp - h - d
+ plusht = h + x / 2
+ plusdp = d + x / 2
+ elseif method.min then
+ local n = floored((h+d)/snaphtdp)
+ local x = n * snaphtdp - h - d
+ plusht = h + x / 2
+ plusdp = d + x / 2
+ elseif method.none then
plusht, plusdp = 0, 0
if t then
t[#t+1] = "none: plusht 0pt plusdp 0pt"
end
end
if method.halfline then -- extra halfline
- plusht, plusdp = plusht + snaphtdp/2, plusdp + snaphtdp/2
+ plusht = plusht + snaphtdp/2
+ plusdp = plusdp + snaphtdp/2
if t then
t[#t+1] = formatters["halfline: plusht %p plusdp %p"](plusht,plusdp)
end
end
if method.line then -- extra line
- plusht, plusdp = plusht + snaphtdp, plusdp + snaphtdp
+ plusht = plusht + snaphtdp
+ plusdp = plusdp + snaphtdp
if t then
t[#t+1] = formatters["line: plusht %p plusdp %p"](plusht,plusdp)
end
@@ -512,6 +558,12 @@ local function snap_hlist(where,current,method,height,depth) -- method.strut is
t[#t+1] = formatters["final height: %p -> %p"](h,ch)
t[#t+1] = formatters["final depth: %p -> %p"](d,cd)
end
+-- todo:
+--
+-- if h < 0 or d < 0 then
+-- h = 0
+-- d = 0
+-- end
if t then
report_snapper("trace: %s type %s\n\t%\n\tt",where,nodecodes[getid(current)],t)
end
@@ -879,19 +931,18 @@ local special_penalty_xxx = 0
-- header don't break but also make sure that we have at least a decent
-- break when we have succesive ones (often when testing)
+-- todo: mark headers as such so that we can recognize them
+
local specialmethods = { }
local specialmethod = 1
local properties = nodes.properties.data
-specialmethods[1] = function(start,penalty)
+specialmethods[1] = function(pagehead,pagetail,start,penalty)
--
- if penalty < special_penalty_min or penalty > special_penalty_max then
+ if not pagehead or penalty < special_penalty_min or penalty > special_penalty_max then
return
end
- -- this can move to the caller
- local pagehead = tonut(texlists.page_head)
- local pagetail = find_node_tail(pagehead) -- no texlists.page_tail yet-- no texlists.page_tail yet
local current = pagetail
--
-- nodes.showsimplelist(pagehead,0)
@@ -927,51 +978,84 @@ specialmethods[1] = function(start,penalty)
return
end
elseif trace_specials then
- report_specials(" context %a, higher level, continue",p)
+ report_specials(" context penalty %a, higher level, continue",p)
+ end
+ else
+ local p = getfield(current,"penalty")
+ if p < 10000 then
+ -- assume some other mechanism kicks in so we seem to have content
+ if trace_specials then
+ report_specials(" regular penalty %a, quitting",p)
+ end
+ break
+ else
+ if trace_specials then
+ report_specials(" regular penalty %a, continue",p)
+ end
end
- elseif trace_specials then
- report_specials(" regular penalty, continue")
end
end
current = getprev(current)
end
+ -- none found, so no reson to be special
+ if trace_specials then
+ report_specials(" context penalty, discarding")
+ end
+ return special_penalty_xxx
end
-- specialmethods[2] : always put something before and use that as to-be-changed
+--
+-- we could inject a vadjust to force a recalculation .. a mess
+--
+-- So, the next is far from robust and okay but for the moment this overlaying
+-- has to do. Always test this with the examples in spec-ver.mkvi!
-local function check_experimental_overlay(head,current) -- todo
+local function check_experimental_overlay(head,current)
local p = nil
local c = current
local n = nil
-setfield(head,"prev",nil) -- till we have 0.79 **
-
- local function overlay(p, n, s, mvl)
- local c = getprev(n)
- while c and c ~= p do
- local p = getprev(c)
- free_node(c)
- c = p
- end
- setfield(n,"prev",nil)
- if not mvl then
- setfield(p,"next",n)
+ -- setfield(head,"prev",nil) -- till we have 0.79 **
+
+ local function overlay(p,n,mvl)
+ local p_ht = getfield(p,"height")
+ local p_dp = getfield(p,"depth")
+ local n_ht = getfield(n,"height")
+ local skips = 0
+ --
+ -- We deal with this at the tex end .. we don't see spacing .. enabling this code
+ -- is probably harmless btu then we need to test it.
+ --
+ local c = getnext(p)
+ while c and c ~= n do
+ local id = getid(c)
+ if id == glue_code then
+ skips = skips + getfield(getfield(c,"glue_spec"),"width")
+ elseif id == kern_code then
+ skips = skips + getfield(c,"kern")
+ end
+ c = getnext(c)
end
- local p_ht = getfield(p,"height")
- local p_dp = getfield(p,"depth")
- local n_ht = getfield(n,"height")
- local delta = n_ht + s + p_dp
+ --
+ local delta = n_ht + skips + p_dp
+ texsetdimen("global","d_spac_overlay",-delta) -- for tracing
local k = new_kern(-delta)
- if trace_vspacing then
- report_vspacing("overlaying, prev height: %p, prev depth: %p, next height: %p, skips: %p, move up: %p",p_ht,p_dp,n_ht,s,delta)
- end
if n_ht > p_ht then
- -- we should adapt pagetotal ! (need a hook for that)
+ -- we should adapt pagetotal ! (need a hook for that) .. now we have the wrong pagebreak
setfield(p,"height",n_ht)
end
- return k
+ insert_node_before(head,n,k)
+ if p == head then
+ head = k
+ end
+ if trace_vspacing then
+ report_vspacing("overlaying, prev height: %p, prev depth: %p, next height: %p, skips: %p, move up: %p",p_ht,p_dp,n_ht,skips,delta)
+ end
+ return remove_node(head,current,true)
end
+ -- goto next line
while c do
local id = getid(c)
if id == glue_code or id == penalty_code or id == kern_code then
@@ -985,7 +1069,7 @@ setfield(head,"prev",nil) -- till we have 0.79 **
end
end
if n then
- -- we have a next line
+ -- we have a next line, goto prev line
c = current
while c do
local id = getid(c)
@@ -1002,45 +1086,33 @@ setfield(head,"prev",nil) -- till we have 0.79 **
if a_snapmethod == a_snapvbox then
-- quit, we're not on the mvl
else
- -- messy
local c = tonut(texlists.page_head)
- local s = 0
- while c do
+ while c and c ~= n do
local id = getid(c)
- if id == glue_code then
- if p then
- s = s + getfield(getfield(c,"glue_spec"),"width")
- end
- elseif id == kern_code then
- if p then
- s = s + getfield(c,"kern")
- end
- elseif id == penalty_code then
- -- skip (actually, remove)
- elseif id == hlist_code then
+ if id == hlist_code then
p = c
- s = 0
- else
- p = nil
- s = 0
end
c = getnext(c)
end
if p and p ~= n then
- local k = overlay(p,n,s,true)
- insert_node_before(n,n,k)
- return k, getnext(n)
+ return overlay(p,n,true)
end
end
elseif p ~= n then
- local k = overlay(p,n,0,false )
- insert_node_after(p,p,k)
- return head, getnext(n)
+ return overlay(p,n,false)
end
end
+ -- in fact, we could try again later ... so then no remove (a few tries)
return remove_node(head, current, true)
end
+-- This will be replaced after 0.80+ when we have a more robust look-back and
+-- can look at the bigger picture.
+
+-- todo: look back and when a special is there before a list is seen penalty keep ut
+
+-- we now look back a lot, way too often
+
local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also pass tail
if trace then
reset_tracing(head)
@@ -1052,6 +1124,21 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also
--
-- todo: keep_together: between headers
--
+ local function getpagelist()
+ if not pagehead then
+ pagehead = texlists.page_head
+ if pagehead then
+ pagehead = tonut(texlists.page_head)
+ pagetail = find_node_tail(pagehead) -- no texlists.page_tail yet-- no texlists.page_tail yet
+ else
+ pagetail = nil
+ end
+ else
+ pagetail = nil
+ end
+ return pagehead, pagetail
+ end
+ --
local function flush(why)
if penalty_data then
local p = new_penalty(penalty_data)
@@ -1068,7 +1155,14 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also
head = insert_node_before(head,current,p)
end
-- if penalty_data > special_penalty_min and penalty_data < special_penalty_max then
- properties[p] = { special_penalty = special_penalty or penalty_data }
+ local props = properties[p]
+ if props then
+ props.special_penalty = special_penalty or penalty_data
+ else
+ properties[p] = {
+ special_penalty = special_penalty or penalty_data
+ }
+ end
-- end
end
if glue_data then
@@ -1089,6 +1183,26 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also
penalty_order, penalty_data, natural_penalty = 0, nil, nil
parskip, ignore_parskip, ignore_following, ignore_whitespace = nil, false, false, false
end
+ --
+
+-- quick hack, can be done nicer
+-- local nobreakfound = nil
+-- local function checknobreak()
+-- local pagehead, pagetail = getpagelist()
+-- local current = pagetail
+-- while current do
+-- local id = getid(current)
+-- if id == hlist_code or id == vlist_code then
+-- return false
+-- elseif id == penalty_code then
+-- return getfield(current,"penalty") >= 10000
+-- end
+-- current = getprev(current)
+-- end
+-- return false
+-- end
+
+ --
if trace_vsnapping then
report_snapper("global ht/dp = %p/%p, local ht/dp = %p/%p",
texgetdimen("globalbodyfontstrutheight"), texgetdimen("globalbodyfontstrutdepth"),
@@ -1096,9 +1210,15 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also
)
end
if trace then trace_info("start analyzing",where,what) end
+
+-- local headprev = getprev(head)
+
while current do
local id = getid(current)
if id == hlist_code or id == vlist_code then
+-- if nobreakfound == nil then
+-- nobreakfound = false
+-- end
-- needs checking, why so many calls
if snap then
local list = getlist(current)
@@ -1144,6 +1264,17 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also
-- natural_penalty = getfield(current,"penalty")
-- if trace then trace_done("removed penalty",current) end
-- head, current = remove_node(head, current, true)
+
+-- if nobreakfound == nil then
+-- nobreakfound = checknobreak()
+-- end
+-- if nobreakfound and getfield(current,"penalty") <= 10000 then
+-- -- if trace then
+-- trace_done("removed penalty",current)
+-- -- end
+-- head, current = remove_node(head, current, true)
+-- end
+
current = getnext(current)
elseif id == kern_code then
if snap and trace_vsnapping and getfield(current,"kern") ~= 0 then
@@ -1159,7 +1290,8 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also
local sp = getattr(current,a_skippenalty) -- has no default, no unset (yet)
if sp and sc == penalty then
if where == "page" then
- local p = specialmethods[specialmethod](current,sp)
+ local pagehead, pagetail = getpagelist()
+ local p = specialmethods[specialmethod](pagehead,pagetail,current,sp)
if p then
if trace then
trace_skip("previous special penalty %a is changed to %a using method %a",sp,p,specialmethod)
@@ -1167,6 +1299,12 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also
special_penalty = sp
sp = p
end
+
+-- else
+-- if nobreakfound == nil then
+-- nobreakfound = checknobreak()
+-- end
+
end
if not penalty_data then
penalty_data = sp
@@ -1176,6 +1314,14 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also
penalty_data = sp
end
if trace then trace_skip("penalty in skip",sc,so,sp,current) end
+
+-- if nobreakfound then
+-- penalty_data = 10000
+-- if trace then
+-- trace_skip("nobreak found before penalty in skip",sc,so,sp,current)
+-- end
+-- end
+
head, current = remove_node(head, current, true)
elseif not sc then -- if not sc then
if glue_data then
@@ -1234,6 +1380,8 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also
elseif sc == overlay then
-- todo (overlay following line over previous
if trace then trace_skip("overlay",sc,so,sp,current) end
+ -- beware: head can actually be after the affected nodes as
+ -- we look back ... some day head will the real head
head, current = check_experimental_overlay(head,current,a_snapmethod)
elseif ignore_following then
if trace then trace_skip("disabled",sc,so,sp,current) end
@@ -1431,9 +1579,16 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also
local p = new_penalty(penalty_data)
if trace then trace_done("result",p) end
head, tail = insert_node_after(head,tail,p)
--- if penalty_data > special_penalty_min and penalty_data < special_penalty_max then
- properties[p] = { special_penalty = special_penalty or penalty_data }
--- end
+ -- if penalty_data > special_penalty_min and penalty_data < special_penalty_max then
+ local props = properties[p]
+ if props then
+ props.special_penalty = special_penalty or penalty_data
+ else
+ properties[p] = {
+ special_penalty = special_penalty or penalty_data
+ }
+ end
+ -- end
end
if glue_data then
if not tail then tail = find_node_tail(head) end
@@ -1445,7 +1600,7 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also
else
head, tail = insert_node_after(head,tail,glue_data)
end
-texnest[texnest.ptr].prevdepth = 0 -- appending to the list bypasses tex's prevdepth handler
+ texnest[texnest.ptr].prevdepth = 0 -- appending to the list bypasses tex's prevdepth handler
end
if trace then
if glue_data or penalty_data then
@@ -1456,6 +1611,13 @@ texnest[texnest.ptr].prevdepth = 0 -- appending to the list bypasses tex's prevd
trace_info("head has been changed from %a to %a",nodecodes[getid(oldhead)],nodecodes[getid(head)])
end
end
+
+-- if headprev then
+-- setprev(head,headprev)
+-- setnext(headprev,head)
+-- end
+-- print("C HEAD",tonode(head))
+
return head, true
end
@@ -1576,10 +1738,51 @@ end
-- interface
-commands.vspacing = vspacing.analyze
-commands.vspacingsetamount = vspacing.setskip
-commands.vspacingdefine = vspacing.setmap
-commands.vspacingcollapse = vspacing.collapsevbox
-commands.vspacingsnap = vspacing.snapbox
-commands.resetprevdepth = vspacing.resetprevdepth
-commands.definesnapmethod = vspacing.definesnapmethod
+implement {
+ name = "vspacing",
+ actions = vspacing.analyze,
+ scope = "private",
+ arguments = "string"
+}
+
+implement {
+ name = "resetprevdepth",
+ actions = vspacing.resetprevdepth,
+ scope = "private"
+}
+
+implement {
+ name = "vspacingsetamount",
+ actions = vspacing.setskip,
+ scope = "private",
+ arguments = "string",
+}
+
+implement {
+ name = "vspacingdefine",
+ actions = vspacing.setmap,
+ scope = "private",
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "vspacingcollapse",
+ actions = vspacing.collapsevbox,
+ scope = "private",
+ arguments = "integer"
+}
+
+implement {
+ name = "vspacingsnap",
+ actions = vspacing.snapbox,
+ scope = "private",
+ arguments = { "integer", "integer" }
+}
+
+implement {
+ name = "definesnapmethod",
+ actions = vspacing.definesnapmethod,
+ scope = "private",
+ arguments = { "string", "string" }
+}
+
diff --git a/Master/texmf-dist/tex/context/base/spac-ver.mkiv b/Master/texmf-dist/tex/context/base/spac-ver.mkiv
index 0c84958beb0..e44056954ad 100644
--- a/Master/texmf-dist/tex/context/base/spac-ver.mkiv
+++ b/Master/texmf-dist/tex/context/base/spac-ver.mkiv
@@ -17,6 +17,8 @@
\registerctxluafile{spac-ver}{1.001}
+% todo: use usernodes ?
+
% todo: itemize : intro ... only when there is one or two lines preceding and then
% keep these together i.e. \blank[intro]
@@ -120,7 +122,7 @@
\setvalue{\??interlinespacerelative\v!auto }{\let\setrelativeinterlinespace\spac_linespacing_set_relative_interlinespace}
\def\spac_linespacing_set_specified_relative_interlinespace#1% fragile?
- {\doifdimenstringelse{#1}
+ {\doifelsedimenstring{#1}
{\setupspecifiedinterlinespace[\c!line=#1]}
{\assignvalue{#1}\currentrelativeinterlinespace{1.00}{1.25}{1.50}%
\spacing\currentrelativeinterlinespace}}
@@ -140,6 +142,20 @@
\spacing\currentrelativeinterlinespace
\fi}
+\unexpanded\def\spac_linespacing_setup_use
+ {\ifcsname\namedinterlinespacehash\m_spac_interlinespace\s!parent\endcsname
+ \let\currentinterlinespace\m_spac_interlinespace
+ \spac_linespacing_setup_specified_interline_space
+ % \else
+ % we only support named interlinespaces
+ \fi}
+
+\unexpanded\def\useinterlinespaceparameter#1% see footnotes
+ {\edef\m_spac_interlinespace{#1\c!interlinespace}%
+ \ifx\m_spac_interlinespace\empty \else
+ \spac_linespacing_setup_use
+ \fi}
+
\newtoks\everysetupglobalinterlinespace
\newtoks\everysetuplocalinterlinespace
@@ -174,7 +190,7 @@
\fi\fi}
\def\spac_linespacing_setup_specified_or_relative[#1]%
- {\doifassignmentelse{#1}\setupspecifiedinterlinespace\setuprelativeinterlinespace[#1]%
+ {\doifelseassignment{#1}\setupspecifiedinterlinespace\setuprelativeinterlinespace[#1]%
\the\iflocalinterlinespace\everysetuplocalinterlinespace\else\everysetupglobalinterlinespace\fi}
\def\spac_linespacing_synchronize_local % adapts to the font
@@ -201,7 +217,7 @@
\fi
\popmacro\currentinterlinespace
\else
- \normalexpanded{\noexpand\doifassignmentelse{\p_spac_checked_interlinespace}%
+ \normalexpanded{\noexpand\doifelseassignment{\p_spac_checked_interlinespace}%
\setupspecifiedinterlinespace\setuprelativeinterlinespace[\p_spac_checked_interlinespace]}%
\iflocalinterlinespace
\the\everysetuplocalinterlinespace
@@ -334,7 +350,7 @@
\let\v_spac_whitespace_current\v!none
\unexpanded\def\setupwhitespace
- {\doifnextoptionalcselse\spac_whitespace_setup_yes\spac_whitespace_setup_nop}
+ {\doifelsenextoptionalcs\spac_whitespace_setup_yes\spac_whitespace_setup_nop}
\def\spac_whitespace_setup_nop
{\ifx\v_spac_whitespace_current\v!none\else
@@ -960,6 +976,35 @@
\let\normalstrut\strut
+\unexpanded\def\halfstrut
+ {\relax
+ \dontleavehmode
+ \begingroup
+ \setbox\scratchbox\copy\strutbox
+ \ht\scratchbox\dimexpr\strutht/\plustwo\relax
+ \dp\scratchbox\dimexpr\strutdp/\plustwo\relax
+ \box\scratchbox
+ \endgroup}
+
+\unexpanded\def\quarterstrut
+ {\relax
+ \dontleavehmode
+ \begingroup
+ \setbox\scratchbox\copy\strutbox
+ \ht\scratchbox\dimexpr\strutht/\plusfour\relax
+ \dp\scratchbox\dimexpr\strutdp/\plusfour\relax
+ \box\scratchbox
+ \endgroup}
+
+\unexpanded\def\depthstrut
+ {\relax
+ \dontleavehmode
+ \begingroup
+ \setbox\scratchbox\copy\strutbox
+ \ht\scratchbox\dimexpr\strutht-\struthtdp/\plustwo\relax % assumes that ht > lineheight/2
+ \box\scratchbox
+ \endgroup}
+
%D Sometimes a capstrut comes in handy
%D
%D \starttabulate[|Tl|l|l|]
@@ -1032,12 +1077,17 @@
\newbox\nostrutbox \setbox\nostrutbox\emptyhbox
+\newtoks\everysetnostrut
+
\unexpanded\def\setnostrut
- {\setbox\strutbox\copy\nostrutbox
- \let\strut\empty
- \let\endstrut\empty
- \let\begstrut\empty
- \let\crlfplaceholder\empty}
+ {\the\everysetnostrut}
+
+\appendtoks
+ \setbox\strutbox\copy\nostrutbox
+ \let\strut\empty
+ \let\endstrut\empty
+ \let\begstrut\empty
+\to \everysetnostrut
% when enabled, sigstruts will remove themselves if nothing
% goes inbetween
@@ -1167,7 +1217,7 @@
\let\normaloffinterlineskip\offinterlineskip % knuth's original
\appendtoks
- \ifvmode\ctxcommand{resetprevdepth()}\fi % a nasty hack (tested for a while now)
+ \ifvmode\clf_resetprevdepth\fi % a nasty hack (tested for a while now)
\to \everyafteroutput
%D My own one:
@@ -1341,7 +1391,7 @@
\unexpanded\def\installsnapvalues#1#2% todo: a proper define
{\edef\currentsnapper{#1:#2}%
\ifcsname\??gridsnapperattributes\currentsnapper\endcsname \else
- \setevalue{\??gridsnapperattributes\currentsnapper}{\ctxcommand{definesnapmethod("#1","#2")}}%
+ \setevalue{\??gridsnapperattributes\currentsnapper}{\clf_definesnapmethod{#1}{#2}}%
\fi
\setevalue{\??gridsnappers#1}{\attribute\snapmethodattribute\csname\??gridsnapperattributes\currentsnapper\endcsname\space}}
@@ -1410,6 +1460,9 @@
\definegridsnapping[\v!none] [\v!none]
\definegridsnapping[\v!line] [\v!line]
\definegridsnapping[\v!strut] [\v!strut]
+\definegridsnapping[\v!box] [\v!box] % centers a box rounded upwards (box:.5 -> tolerance)
+\definegridsnapping[\v!min] [\v!min] % centers a box rounded downwards
+\definegridsnapping[\v!max] [\v!max] % centers a box rounded upwards
\definegridsnapping[\v!max] [\v!maxdepth,\v!maxheight,\v!strut]
\definegridsnapping[\v!min] [\v!mindepth,\v!minheight,\v!strut]
@@ -1495,10 +1548,10 @@
\def\spac_grids_snap_to_finish#1%
{\ifvbox\nextbox % this will go away
- \ctxcommand{vspacingcollapse(\number\nextbox)}% isn't that already done?
+ \clf_vspacingcollapse\nextbox\relax % isn't that already done?
\fi
\doifelsenothing{#1}{\spac_grids_snap_value_set\v!normal}{\spac_grids_snap_value_set{#1}}%
- \ctxcommand{vspacingsnap(\number\nextbox,\number\attribute\snapmethodattribute)}%
+ \clf_vspacingsnap\nextbox\attribute\snapmethodattribute\relax
\ifvbox\nextbox\vbox\else\hbox\fi attr \snapmethodattribute \zerocount {\box\nextbox}%
\egroup}
@@ -1648,7 +1701,7 @@
\def\spac_vspacing_define_amount[#1][#2][#3]% can be combined
{\setvalue{\??vspacingamount#1}{\ifgridsnapping#3\else#2\fi}%
- \ctxcommand{vspacingsetamount("#1")}}
+ \clf_vspacingsetamount{#1}}
% \installcorenamespace{vspacingamountnormal}
% \installcorenamespace{vspacingamountgrid}
@@ -1660,13 +1713,13 @@
% \fi
% \csname n>#1\endcsname{#2}%
% \csname g>#1\endcsname{#3}%
-% \ctxcommand{vspacingsetamount("#1")}}
+% \clf_vspacingsetamount{#1}}
\unexpanded\def\definevspacing
{\dodoubleempty\spac_vspacing_define}
\def\spac_vspacing_define[#1][#2]%
- {\ctxcommand{vspacingdefine("#1","#2")}}
+ {\clf_vspacingdefine{#1}{#2}}
%D The injector code (generated at the \LUA\ end):
@@ -1767,7 +1820,7 @@
% The main spacer:
\unexpanded\def\vspacing
- {\doifnextoptionalcselse\spac_vspacing_yes\spac_vspacing_nop}
+ {\doifelsenextoptionalcs\spac_vspacing_yes\spac_vspacing_nop}
\def\spac_vspacing_yes
{\ifinpagebody % somewhat weird
@@ -1788,21 +1841,21 @@
\fi\fi}
\def\spac_vspacing_yes_indeed[#1]%
- {\ifmmode\else\par\ctxcommand{vspacing("#1")}\fi}
+ {\ifmmode\else\par\clf_vspacing{#1}\fi}
\def\spac_vspacing_yes_ignore[#1]%
{\ifmmode\else\par\fi}
\def\spac_vspacing_nop_indeed
- {\ifmmode\else\par\ctxcommand{vspacing("\currentvspacing")}\fi}
+ {\ifmmode\else\par\clf_vspacing{\currentvspacing}\fi}
\def\spac_vspacing_nop_ignore
{\ifmmode\else\par\fi}
\def\directvspacing#1%
- {\par\ctxcommand{vspacing("#1")}}
+ {\par\clf_vspacing{#1}}
-% handy (and faste):
+% handy (and faster):
\unexpanded\def\directvpenalty#1%
{\begingroup
@@ -1823,7 +1876,7 @@
% these depend on bigskipamount cum suis so we'd better sync them
\unexpanded\def\setupvspacing
- {\doifnextoptionalcselse\setupvspacing_yes\setupvspacing_nop}
+ {\doifelsenextoptionalcs\setupvspacing_yes\setupvspacing_nop}
\let\currentvspacing\s!default % hm, default, standard ...
@@ -1876,6 +1929,21 @@
\fi\fi
\relax}
+% used in itemize ... always test this
+
+\newdimen\d_spac_overlay
+
+\def\spac_overlay_lines
+ {\blank[\v!back,\v!overlay]%
+ \nointerlineskip}
+
+% \startitemize[n]
+% \item \input zapf
+% \item \startitemize[a]
+% \item \input knuth
+% \stopitemize
+% \stopitemize
+%
% \strut \hfill first line \blank[overlay] second line \hfill \strut
%
% \ruledvbox {
@@ -1883,6 +1951,9 @@
% line 2 \hfill \strut \blank[overlay]
% \strut \hfill line 3 \hfill \strut
% }
+%
+% \dorecurse{50}
+% {\startitemize[n] \startitem \startitemize[a] \item #1 \stopitemize \stopitem \stopitemize}
\definevspacing[\v!preference][penalty:-500] % goodbreak
\definevspacing[\v!samepage] [penalty:10000] % nobreak
@@ -1893,7 +1964,7 @@
\definevspacing[\v!back] [category:7]
% together [category:8]
\definevspacing[\v!overlay] [category:9]
-\definevspacing[\v!always] [category:0]
+\definevspacing[\v!always] [category:0] % hm, internally it's discard
\definevspacing[\v!weak] [order:0]
\definevspacing[\v!strong] [order:100]
@@ -1920,8 +1991,20 @@
%D \type {\blank} (we needed the first one while playing with the
%D new code).
+% We keep this one as reference
+%
+% \unexpanded\def\inhibitblank
+% {\vspacing[\v!disable]}
+%
+% but use the following more efficient variant instead:
+
\unexpanded\def\inhibitblank
- {\vspacing[\v!disable]} % can be made faster
+ {\ifvmode
+ \begingroup
+ \attribute\skipcategoryattribute\plusfive
+ \vskip\zeropoint
+ \endgroup
+ \fi}
\let\doinhibitblank\inhibitblank % keep this command, used in styles
@@ -2006,7 +2089,7 @@
\let\m_spac_hanging_location\empty
\def\spac_hanging_start[#1]%
- {\doifassignmentelse{#1}
+ {\doifelseassignment{#1}
{\let\m_spac_hanging_location\empty
\setupcurrenthanging[#1]}%
{\edef\m_spac_hanging_location{#1}}%
@@ -2135,7 +2218,7 @@
% as encountered in forced blank skips (see lua code)
%
% \appendtoks
-% \ifvmode\ctxcommand{resetprevdepth()}\fi
+% \ifvmode\clf_resetprevdepth\fi
% \to \everyafteroutput
%
% this should only happen when there is nothing left over (how to detemine that) .. testcase:
diff --git a/Master/texmf-dist/tex/context/base/status-files.pdf b/Master/texmf-dist/tex/context/base/status-files.pdf
index 24b73242775..dc228ad8ae4 100644
--- a/Master/texmf-dist/tex/context/base/status-files.pdf
+++ 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
index f6ca96bc3cd..02c9447e819 100644
--- a/Master/texmf-dist/tex/context/base/status-lua.pdf
+++ b/Master/texmf-dist/tex/context/base/status-lua.pdf
Binary files differ
diff --git a/Master/texmf-dist/tex/context/base/status-mkiv.lua b/Master/texmf-dist/tex/context/base/status-mkiv.lua
index 07e912a88ba..45c2822565b 100644
--- a/Master/texmf-dist/tex/context/base/status-mkiv.lua
+++ b/Master/texmf-dist/tex/context/base/status-mkiv.lua
@@ -320,7 +320,6 @@ return {
},
{
category = "mkiv",
- comment = "maybe this becomes a runtime module",
filename = "toks-ini",
loading = "always",
status = "okay",
@@ -394,6 +393,12 @@ return {
},
{
category = "mkiv",
+ filename = "typo-sus",
+ loading = "always",
+ status = "okay",
+ },
+ {
+ category = "mkiv",
filename = "node-pag",
loading = "never",
status = "okay",
@@ -542,6 +547,12 @@ return {
},
{
category = "mkiv",
+ filename = "lang-hyp",
+ loading = "always",
+ status = "okay",
+ },
+ {
+ category = "mkiv",
filename = "unic-ini",
loading = "always",
status = "okay",
@@ -615,6 +626,12 @@ return {
},
{
category = "mkiv",
+ filename = "lang-hyp",
+ loading = "always",
+ status = "okay",
+ },
+ {
+ category = "mkiv",
filename = "lang-frq",
loading = "on demand",
status = "okay",
@@ -2560,6 +2577,12 @@ return {
},
{
category = "mkiv",
+ filename = "publ-jrn",
+ loading = "always",
+ status = "pending",
+ },
+ {
+ category = "mkiv",
filename = "publ-xml",
loading = "always",
status = "pending",
@@ -3490,6 +3513,18 @@ return {
},
{
category = "lua",
+ filename = "lang-dis",
+ loading = "lang-ini",
+ status = "okay",
+ },
+ {
+ category = "lua",
+ filename = "lang-hyp",
+ loading = "lang-hyp",
+ status = "okay",
+ },
+ {
+ category = "lua",
filename = "lang-ini",
loading = "lang-ini",
status = "okay",
@@ -3502,6 +3537,12 @@ return {
},
{
category = "lua",
+ filename = "lang-hyp",
+ loading = "lang-hyp",
+ status = "okay",
+ },
+ {
+ category = "lua",
filename = "lang-txt",
loading = "lang-lab",
status = "okay",
@@ -4716,7 +4757,14 @@ return {
{
category = "lua",
filename = "toks-ini",
- status = "todo",
+ loading = "toks-ini",
+ status = "okay",
+ },
+ {
+ category = "lua",
+ filename = "toks-scn",
+ loading = "toks-ini",
+ status = "okay",
},
{
category = "lua",
@@ -4820,6 +4868,11 @@ return {
},
{
category = "lua",
+ filename = "typo-sus",
+ status = "okay",
+ },
+ {
+ category = "lua",
filename = "typo-brk",
status = "todo",
},
@@ -4907,6 +4960,11 @@ return {
},
{
category = "lua",
+ filename = "typo-man",
+ status = "todo",
+ },
+ {
+ category = "lua",
filename = "typo-prc",
status = "todo",
},
@@ -5088,6 +5146,12 @@ return {
},
{
category = "lua",
+ filename = "publ-fnd",
+ loading = "publ-ini.mkiv",
+ status = "pending",
+ },
+ {
+ category = "lua",
filename = "publ-tra",
loading = "publ-ini.mkiv",
status = "pending",
diff --git a/Master/texmf-dist/tex/context/base/strc-bkm.lua b/Master/texmf-dist/tex/context/base/strc-bkm.lua
index c38ab3c2e8c..1ff75aa5f72 100644
--- a/Master/texmf-dist/tex/context/base/strc-bkm.lua
+++ b/Master/texmf-dist/tex/context/base/strc-bkm.lua
@@ -13,14 +13,15 @@ if not modules then modules = { } end modules ['strc-bkm'] = {
-- we should hook the placement into everystoptext ... needs checking
-local format, concat, gsub = string.format, table.concat, string.gsub
+-- todo: make an lpeg for stripped
+
+local next, type = next, type
+local gsub, lower = string.gsub, string.lower
+local concat = table.concat
local utfvalues = utf.values
local settings_to_hash = utilities.parsers.settings_to_hash
-local codeinjections = backends.codeinjections
-
-local trace_bookmarks = false trackers.register("references.bookmarks", function(v) trace_bookmarks = v end)
-
+local trace_bookmarks = false trackers.register("references.bookmarks", function(v) trace_bookmarks = v end)
local report_bookmarks = logs.reporter("structure","bookmarks")
local structures = structures
@@ -30,13 +31,17 @@ structures.bookmarks = structures.bookmarks or { }
local bookmarks = structures.bookmarks
local sections = structures.sections
local lists = structures.lists
-
local levelmap = sections.levelmap
local variables = interfaces.variables
+local implement = interfaces.implement
+local codeinjections = backends.codeinjections
-bookmarks.method = "internal" -- or "page"
+bookmarks.method = "internal" -- or "page"
-local names, opened, forced, numbered = { }, { }, { }, { }
+local names = { }
+local opened = { }
+local forced = { }
+local numbered = { }
function bookmarks.register(settings)
local force = settings.force == variables.yes
@@ -78,8 +83,13 @@ function bookmarks.overload(name,text)
end
end
if ls then
- ls.titledata.bookmark = text
+ local titledata = ls.titledata
+ if titledata then
+ titledata.bookmark = text
+ end
end
+ -- last resort
+ -- context.writetolist({name},text,"")
end
local function stripped(str) -- kind of generic
@@ -101,54 +111,6 @@ function bookmarks.setup(spec)
end
end
--- function bookmarks.place()
--- if next(names) then
--- local list = lists.filtercollected(names,"all",nil,lists.collected,forced)
--- if #list > 0 then
--- local levels, noflevels, lastlevel = { }, 0, 1
--- for i=1,#list do
--- local li = list[i]
--- local metadata = li.metadata
--- local name = metadata.name
--- if not metadata.nolist or forced[name] then -- and levelmap[name] then
--- local titledata = li.titledata
--- if titledata then
--- local structural = levelmap[name]
--- lastlevel = structural or lastlevel
--- local title = titledata.bookmark
--- if not title or title == "" then
--- -- We could typeset the title and then convert it.
--- if not structural then
--- -- placeholder, todo: bookmarklabel
--- title = name .. ": " .. (titledata.title or "?")
--- else
--- title = titledata.title or "?"
--- end
--- end
--- if numbered[name] then
--- local sectiondata = sections.collected[li.references.section]
--- local numberdata = li.numberdata
--- if sectiondata and numberdata and not numberdata.hidenumber then
--- -- we could typeset the number and convert it
--- title = concat(sections.typesetnumber(sectiondata,"direct",numberspec,sectiondata)) .. " " .. title
--- end
--- end
--- noflevels = noflevels + 1
--- levels[noflevels] = {
--- lastlevel,
--- stripped(title), -- can be replaced by converter
--- li.references, -- has internal and realpage
--- allopen or opened[name]
--- }
--- end
--- end
--- end
--- bookmarks.finalize(levels)
--- end
--- function bookmarks.place() end -- prevent second run
--- end
--- end
-
function bookmarks.place()
if next(names) then
local levels = { }
@@ -157,26 +119,51 @@ function bookmarks.place()
local nofblocks = #lists.sectionblocks -- always >= 1
local showblocktitle = toboolean(numberspec.showblocktitle,true)
for i=1,nofblocks do
- local block = lists.sectionblocks[i]
+ local block = lists.sectionblocks[i]
local blockdone = nofblocks == 1
- local list = lists.filtercollected(names,block..":all",nil,lists.collected,forced)
+ local list = lists.filter {
+ names = names,
+ criterium = block .. ":all",
+ forced = forced,
+ }
for i=1,#list do
local li = list[i]
local metadata = li.metadata
local name = metadata.name
if not metadata.nolist or forced[name] then -- and levelmap[name] then
local titledata = li.titledata
+ --
+ if not titledata then
+ local userdata = li.userdata
+ if userdata then
+ local first = userdata.first
+ local second = userdata.second
+ if first then
+ if second then
+ titledata = { title = first .. " " .. second }
+ else
+ titledata = { title = first }
+ end
+ else
+ titledata = { title = second }
+ end
+ end
+ end
+ --
if titledata then
if not blockdone then
if showblocktitle then
-- add block entry
local blockdata = sections.sectionblockdata[block]
noflevels = noflevels + 1
+ local references = li.references
levels[noflevels] = {
- 1, -- toplevel
- stripped(blockdata.bookmark ~= "" and blockdata.bookmark or block),
- li.references,
- allopen or opened[name] -- same as first entry
+ level = 1, -- toplevel
+ title = stripped(blockdata.bookmark ~= "" and blockdata.bookmark or block),
+ reference = references,
+ opened = allopen or opened[name], -- same as first entry
+ realpage = references and references.realpage or 0, -- handy for later
+ usedpage = true,
}
end
blockdone = true
@@ -190,27 +177,36 @@ function bookmarks.place()
local title = titledata.bookmark
if not title or title == "" then
-- We could typeset the title and then convert it.
- if not structural then
- -- placeholder, todo: bookmarklabel
- title = name .. ": " .. (titledata.title or "?")
- else
+ -- if not structural then
+ -- title = titledata.title or "?")
+ -- else
title = titledata.title or "?"
- end
+ -- end
end
if numbered[name] then
local sectiondata = sections.collected[li.references.section]
local numberdata = li.numberdata
- if sectiondata and numberdata and not numberdata.hidenumber then
+ if sectiondata and numberdata then
+ if not numberdata.hidenumber then
-- we could typeset the number and convert it
- title = concat(sections.typesetnumber(sectiondata,"direct",numberspec,sectiondata)) .. " " .. title
+ local number = sections.typesetnumber(sectiondata,"direct",numberspec,sectiondata)
+ if number and #number > 0 then
+ title = concat(number) .. " " .. title
+ end
+ end
end
end
noflevels = noflevels + 1
+ local references = li.references
levels[noflevels] = {
- lastlevel,
- stripped(title), -- can be replaced by converter
- li.references, -- has internal and realpage
- allopen or opened[name]
+ level = lastlevel,
+ title = stripped(title), -- can be replaced by converter
+ reference = references, -- has internal and realpage
+ opened = allopen or opened[name],
+ realpage = references and references.realpage or 0, -- handy for later
+ usedpage = true,
+ structural = structural,
+ name = name,
}
end
end
@@ -222,47 +218,296 @@ function bookmarks.place()
end
function bookmarks.flatten(levels)
+ if not levels then
+ -- a plugin messed up
+ return { }
+ end
-- This function promotes leading structurelements with a higher level
-- to the next lower level. Such situations are the result of lack of
-- structure: a subject preceding a chapter in a sectionblock. So, the
-- following code runs over section blocks as well. (bookmarks-007.tex)
local noflevels = #levels
if noflevels > 1 then
- local skip, start, one = false, 1, levels[1]
- local first, block = one[1], one[3].block
+ local function showthem()
+ for i=1,noflevels do
+ local level = levels[i]
+ -- if level.structural then
+ -- report_bookmarks("%i > %s > %s",level.level,level.reference.block,level.title)
+ -- else
+ report_bookmarks("%i > %s > %s > %s",level.level,level.reference.block,level.name,level.title)
+ -- end
+ end
+ end
+ if trace_bookmarks then
+ report_bookmarks("checking structure")
+ showthem()
+ end
+ local skip = false
+ local done = 0
+ local start = 1
+ local one = levels[1]
+ local first = one.level
+ local block = one.reference.block
for i=2,noflevels do
- local li = levels[i]
- local new, newblock = li[1], li[3].block
+ local current = levels[i]
+ local new = current.level
+ local reference = current.reference
+ local newblock = type(reference) == "table" and current.reference.block or block
if newblock ~= block then
- first, block, start, skip = new, newblock, i, false
+ first = new
+ block = newblock
+ start = i
+ skip = false
elseif skip then
-- go on
elseif new > first then
skip = true
elseif new < first then
for j=start,i-1 do
- local lj = levels[j]
- local old = lj[1]
- lj[1] = new
+ local previous = levels[j]
+ local old = previous.level
+ previous.level = new
if trace_bookmarks then
- report_bookmarks("promoting entry %a from level %a to %a: %s",j,old,new,lj[2])
+ report_bookmarks("promoting entry %a from level %a to %a: %s",j,old,new,previous.title)
end
+ done = done + 1
end
skip = true
end
end
+ if trace_bookmarks then
+ if done > 0 then
+ report_bookmarks("%a entries promoted")
+ showthem()
+ else
+ report_bookmarks("nothing promoted")
+ end
+ end
+ end
+ return levels
+end
+
+local extras = { }
+local lists = { }
+local names = { }
+
+bookmarks.extras = extras
+
+local function cleanname(name)
+ return lower(file.basename(name))
+end
+
+function extras.register(name,levels)
+ if name and levels then
+ name = cleanname(name)
+ local found = names[name]
+ if found then
+ lists[found].levels = levels
+ else
+ lists[#lists+1] = {
+ name = name,
+ levels = levels,
+ }
+ names[name] = #lists
+ end
+ end
+end
+
+function extras.get(name)
+ if name then
+ local found = names[cleanname(name)]
+ if found then
+ return lists[found].levels
+ end
+ else
+ return lists
+ end
+end
+
+function extras.reset(name)
+ local l, n = { }, { }
+ if name then
+ name = cleanname(name)
+ for i=1,#lists do
+ local li = lists[i]
+ local ln = li.name
+ if name == ln then
+ -- skip
+ else
+ local m = #l + 1
+ l[m] = li
+ n[ln] = m
+ end
+ end
+ end
+ lists, names = l, n
+end
+
+local function checklists()
+ for i=1,#lists do
+ local levels = lists[i].levels
+ for j=1,#levels do
+ local entry = levels[j]
+ local pageindex = entry.pageindex
+ if pageindex then
+ entry.reference = figures.getrealpage(pageindex)
+ entry.pageindex = nil
+ end
+ end
end
end
+function extras.tosections(levels)
+ local sections = { }
+ local noflists = #lists
+ for i=1,noflists do
+ local levels = lists[i].levels
+ local data = { }
+ sections[i] = data
+ for j=1,#levels do
+ local entry = levels[j]
+ if entry.usedpage then
+ local section = entry.section
+ local d = data[section]
+ if d then
+ d[#d+1] = entry
+ else
+ data[section] = { entry }
+ end
+ end
+ end
+ end
+ return sections
+end
+
+function extras.mergesections(levels,sections)
+ if not sections or #sections == 0 then
+ return levels
+ elseif not levels then
+ return { }
+ else
+ local merge = { }
+ local noflists = #lists
+ if #levels == 0 then
+ local level = 0
+ local section = 0
+ for i=1,noflists do
+ local entries = sections[i][0]
+ if entries then
+ for i=1,#entries do
+ local entry = entries[i]
+ merge[#merge+1] = entry
+ entry.level = entry.level + level
+ end
+ end
+ end
+ else
+ for j=1,#levels do
+ local entry = levels[j]
+ merge[#merge+1] = entry
+ local section = entry.reference.section
+ local level = entry.level
+ entry.section = section -- for tracing
+ for i=1,noflists do
+ local entries = sections[i][section]
+ if entries then
+ for i=1,#entries do
+ local entry = entries[i]
+ merge[#merge+1] = entry
+ entry.level = entry.level + level
+ end
+ end
+ end
+ end
+ end
+ return merge
+ end
+end
+
+function bookmarks.merge(levels,mode)
+ return extras.mergesections(levels,extras.tosections())
+end
+
+local sequencers = utilities.sequencers
+local appendgroup = sequencers.appendgroup
+local appendaction = sequencers.appendaction
+
+local bookmarkactions = sequencers.new {
+ arguments = "levels,method",
+ returnvalues = "levels",
+ results = "levels",
+}
+
+appendgroup(bookmarkactions,"before") -- user
+appendgroup(bookmarkactions,"system") -- private
+appendgroup(bookmarkactions,"after" ) -- user
+
+appendaction(bookmarkactions,"system",bookmarks.flatten)
+appendaction(bookmarkactions,"system",bookmarks.merge)
+
function bookmarks.finalize(levels)
- -- This function can be overloaded by an optional converter
- -- that uses nodes.toutf on a typeset stream. This is something
- -- that we will support when the main loop has become a coroutine.
- codeinjections.addbookmarks(levels,bookmarks.method)
+ local method = bookmarks.method or "internal"
+ checklists() -- so that plugins have the adapted page number
+ levels = bookmarkactions.runner(levels,method)
+ if levels and #levels > 0 then
+ -- normally this is not needed
+ local purged = { }
+ for i=1,#levels do
+ local l = levels[i]
+ if l.usedpage ~= false then
+ purged[#purged+1] = l
+ end
+ end
+ --
+ codeinjections.addbookmarks(purged,method)
+ else
+ -- maybe a plugin messed up
+ end
+end
+
+function bookmarks.installhandler(what,where,func)
+ if not func then
+ where, func = "after", where
+ end
+ if where == "before" or where == "after" then
+ sequencers.appendaction(bookmarkactions,where,func)
+ else
+ report_tex("installing bookmark %a handlers in %a is not possible",what,tostring(where))
+ end
end
-- interface
-commands.overloadbookmark = bookmarks.overload
-commands.registerbookmark = bookmarks.register
-commands.setupbookmarks = bookmarks.setup
+implement {
+ name = "setupbookmarks",
+ actions = bookmarks.setup,
+ arguments = {
+ {
+ { "separatorset" },
+ { "conversionset" },
+ { "starter" },
+ { "stopper" },
+ { "segments" },
+ { "showblocktitle" },
+ }
+ }
+}
+
+implement {
+ name = "registerbookmark",
+ actions = bookmarks.register,
+ arguments = {
+ {
+ { "names" },
+ { "opened" },
+ { "force" },
+ { "number" },
+ }
+ }
+}
+
+implement {
+ name = "overloadbookmark",
+ actions = bookmarks.overload,
+ arguments = { "string", "string" }
+}
diff --git a/Master/texmf-dist/tex/context/base/strc-bkm.mkiv b/Master/texmf-dist/tex/context/base/strc-bkm.mkiv
index 9d2ebd796c6..9688a1f93b1 100644
--- a/Master/texmf-dist/tex/context/base/strc-bkm.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-bkm.mkiv
@@ -74,7 +74,11 @@
\def\strc_bookmarks_bookmark_yes[#1]#2%
{\begingroup
\simplifycommands
- \ctxcommand{overloadbookmark("#1",\!!bs\detokenize\expandafter{\normalexpanded{#2}}\!!es)}%
+ \ifnum\thenamedheadlevel{#1}>\zerocount
+ \clf_overloadbookmark{#1}{\detokenize\expandafter{\normalexpanded{#2}}}%
+ \else
+ \strc_lists_write_to[#1][]{#2}{}% todo: a dedicated bookmark writer
+ \fi
\endgroup}
\def\strc_bookmarks_bookmark_nop[#1]#2%
@@ -106,27 +110,59 @@
\ifthirdargument
\setupcurrentbookmark[#3]% no every so not all possible
\else\ifsecondargument
- \doifassignmentelse{#2}{\let\m_bookmarks_opened\empty\setupcurrentbookmark[#2]}\donothing
+ \doifelseassignment{#2}{\let\m_bookmarks_opened\empty\setupcurrentbookmark[#2]}\donothing
\fi\fi
- \ctxcommand{registerbookmark {
- names = "\m_bookmarks_names",
- opened = "\m_bookmarks_opened",
- force = "\bookmarkparameter\c!force",
- number = "\bookmarkparameter\c!number",
- }}%
+ \clf_registerbookmark
+ names {\m_bookmarks_names}%
+ opened {\m_bookmarks_opened}%
+ force {\bookmarkparameter\c!force}%
+ number {\bookmarkparameter\c!number}%
+ \relax
\endgroup}
\appendtoks
- \ctxcommand{setupbookmarks {
- separatorset = "\bookmarkparameter\c!numberseparatorset",
- conversionset = "\bookmarkparameter\c!numberconversionset",
- starter = \!!bs\bookmarkparameter\c!numberstarter\!!es,
- stopper = \!!bs\bookmarkparameter\c!numberstopper\!!es,
- segments = "\bookmarkparameter\c!numbersegments",
- showblocktitle = "\bookmarkparameter\c!sectionblock",
- }}%
+ \clf_setupbookmarks
+ separatorset {\bookmarkparameter\c!numberseparatorset}%
+ conversionset {\bookmarkparameter\c!numberconversionset}%
+ starter {\bookmarkparameter\c!numberstarter}%
+ stopper {\bookmarkparameter\c!numberstopper}%
+ segments {\bookmarkparameter\c!numbersegments}%
+ showblocktitle {\bookmarkparameter\c!sectionblock}%
+ \relax
\to \everysetupbookmark
+%D There is a plugin mechanism but this is for experts only. The intermediate
+%D data structures are stable.
+%D
+%D \starttyping
+%D \startluacode
+%D structures.bookmarks.installhandler("check before","before",function(levels)
+%D logs.report("extra bookmarks","before (normal bookmarks)")
+%D inspect(levels)
+%D logs.report("extra bookmarks","before (extra bookmarks)")
+%D inspect(structures.bookmarks.extras.get())
+%D return levels
+%D end)
+%D structures.bookmarks.installhandler("check after", "after", function(levels)
+%D logs.report("extra bookmarks","after (merged bookmarks)")
+%D inspect(levels)
+%D return levels
+%D end)
+%D \stopluacode
+%D \starttyping
+%D
+%D This mechanism was added when bookmark inclusion became (optional) part of graphic
+%D inclusion (which is needed by Taco).
+%D
+%D \starttyping
+%D \getfiguredimensions[somefile.pdf]
+%D \dorecurse {\noffigurepages} {
+%D \startTEXpage
+%D \externalfigure[somefile.pdf][interaction=bookmark,page=\recurselevel]
+%D \stopTEXpage
+%D }
+%D \starttyping
+
\protect \endinput
% \starttext
diff --git a/Master/texmf-dist/tex/context/base/strc-blk.lua b/Master/texmf-dist/tex/context/base/strc-blk.lua
index ce3304d59af..0ababcfc09c 100644
--- a/Master/texmf-dist/tex/context/base/strc-blk.lua
+++ b/Master/texmf-dist/tex/context/base/strc-blk.lua
@@ -16,6 +16,8 @@ local allocate = utilities.storage.allocate
local context = context
local commands = commands
+local implement = interfaces.implement
+
local structures = structures
structures.blocks = structures.blocks or { }
@@ -78,13 +80,19 @@ end
function blocks.select(state,name,tag,criterium)
criterium = criterium or "text"
- if find(tag,"=",1,true) then tag = "" end
- local names = settings_to_set(name)
- local all = tag == ""
- local tags = not all and settings_to_set(tag)
- local hide = state == "process"
- local n = sections.numberatdepth(criterium)
- local result = lists.filtercollected("all", criterium, n, collected, { })
+ if find(tag,"=",1,true) then
+ tag = ""
+ end
+ local names = settings_to_set(name)
+ local all = tag == ""
+ local tags = not all and settings_to_set(tag)
+ local hide = state == "process"
+ local result = lists.filter {
+ names = "all",
+ criterium = criterium,
+ number = sections.numberatdepth(criterium), -- not needed
+ collected = collected,
+ }
for i=1,#result do
local ri = result[i]
local metadata = ri.metadata
@@ -148,8 +156,7 @@ end
-- interface
-
-commands.definestructureblock = blocks.define
-commands.savestructureblock = blocks.save
-commands.selectstructureblock = blocks.select
-commands.setstructureblockstate = blocks.setstate
+implement { name = "definestructureblock", actions = blocks.define, arguments = "string" }
+implement { name = "savestructureblock", actions = blocks.save, arguments = { "string", "string" ,"string" } }
+implement { name = "selectstructureblock", actions = blocks.select, arguments = { "string", "string" ,"string", "string" } }
+implement { name = "setstructureblockstate", actions = blocks.setstate, arguments = { "string", "string" ,"string" } }
diff --git a/Master/texmf-dist/tex/context/base/strc-blk.mkiv b/Master/texmf-dist/tex/context/base/strc-blk.mkiv
index bceb66beb1a..fe259d223ce 100644
--- a/Master/texmf-dist/tex/context/base/strc-blk.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-blk.mkiv
@@ -33,7 +33,7 @@
\installcommandhandler \??block {block} \??block
\appendtoks
- \ctxcommand{definestructureblock("\currentblock")}%
+ \clf_definestructureblock{\currentblock}%
\setuevalue{\e!begin\currentblock}{\dodoubleempty\strc_blocks_begin[\currentblock]}%
\setuevalue{\e!end \currentblock}{}%
\to \everydefineblock
@@ -41,7 +41,7 @@
\unexpanded\def\strc_blocks_begin[#1][#2]%
{\normalexpanded{\buff_pickup{@block@}{\e!begin#1}{\e!end#1}}
{}% before
- {\ctxcommand{savestructureblock("#1","#2","@block@")}}%
+ {\clf_savestructureblock{#1}{#2}{@block@}}%
\plusone}% after
\let\strc_blocks_setup\relax
@@ -72,17 +72,17 @@
\egroup}
\def\strc_blocks_set_state[#1][#2][#3]% state name tag
- {\ctxcommand{setstructureblockstate("#1","#2","#3")}}
+ {\clf_setstructureblockstate{#1}{#2}{#3}}
\def\strc_blocks_select[#1][#2][#3][#4]% state name tag setups
{\bgroup
- \doifassignmentelse{#3}
+ \doifelseassignment{#3}
{\getparameters[\??blocktemp][\c!criterium=\v!text,#3]%
\def\strc_blocks_setup{\setupcurrentblock[#3]}%
- \ctxcommand{selectstructureblock("#1","#2","","\csname\??blocktemp\c!criterium\endcsname")}}
+ \clf_selectstructureblock{#1}{#2}{}{\csname\??blocktemp\c!criterium\endcsname}}
{\getparameters[\??blocktemp][\c!criterium=\v!text,#4]%
\def\strc_blocks_setup{\setupcurrentblock[#4]}%
- \ctxcommand{selectstructureblock("#1","#2","#3","\csname\??blocktemp\c!criterium\endcsname")}}%
+ \clf_selectstructureblock{#1}{#2}{#3}{\csname\??blocktemp\c!criterium\endcsname}}%
\egroup}
% hide : save, if [+] also hidden execute
diff --git a/Master/texmf-dist/tex/context/base/strc-con.mkvi b/Master/texmf-dist/tex/context/base/strc-con.mkvi
index 1862b00a6fd..11f6f758e0e 100644
--- a/Master/texmf-dist/tex/context/base/strc-con.mkvi
+++ b/Master/texmf-dist/tex/context/base/strc-con.mkvi
@@ -159,6 +159,7 @@
\unexpanded\def\strc_constructions_initialize#1% class instance
{\edef\currentconstruction{#1}%
+ \let\currentconstructionhash\??construction
\let\currentconstructionlistentry\!!zerocount
\expandafter\let\expandafter\currentconstructionmain \csname\??constructionmain \currentconstruction\endcsname
\expandafter\let\expandafter\currentconstructionlevel \csname\??constructionlevel\currentconstruction\endcsname
@@ -214,7 +215,7 @@
\constructionparameter\c!headcommand
{\strut
\constructionparameter\c!text
- \ctxcommand{savedlisttitle("\currentconstructionmain",\currentconstructionlistentry)}}%
+ \clf_savedlisttitle{\currentconstructionmain}\currentconstructionlistentry\relax}%
\endgroup}
\unexpanded\def\strc_constructions_stored_start
@@ -262,10 +263,14 @@
\def\strc_constructions_ignore_head
{\constructionsheaddistance\zeropoint
- \constructionsheadwidth \zeropoint}
+ \constructionsheadwidth \zeropoint
+ % we also need to make sure that no stretch creeps in (new per 2015-02-02, for Alan)
+ \settrue\c_strc_constructions_distance_none}
+
+\let\currentconstructionhash\??construction
\unexpanded\setvalue{\??constructionstarthandler\v!construction}% this will be redone (reorganized) .. too much boxing
- {\dostarttagged\t!construction\currentconstruction
+ {\dostarttaggedchained\t!construction\currentconstruction\currentconstructionhash
\dotagsetconstruction
\constructionparameter\c!before
\begingroup
@@ -322,7 +327,7 @@
\else
\strc_constructions_preroll_head\currentconstructionsample
\ifzeropt\wd\constructionheadbox
- \strc_constructions_ignore_head
+ \strc_constructions_ignore_head
\else
\strc_constructions_set_width_and_distance
\fi
@@ -352,10 +357,6 @@
\ifx\p_strc_constructions_align\empty \else
\setupalign[\p_strc_constructions_align]% \use...
\fi
- \edef\p_strc_constructions_indenting{\constructionparameter\c!indenting}%
- \ifx\p_strc_constructions_indenting\empty \else
- \indenting[\p_strc_constructions_indenting]% \use...
- \fi
\ifcase\c_strc_constructions_nested_state
\c_strc_constructions_nested_state\plusone
\or
@@ -366,6 +367,11 @@
\edef\p_strc_constructions_headalign{\constructionparameter\c!headalign}%
%
\directsetup\p_strc_constructions_renderingsetup\relax
+ % moved to here 2014-07-03
+ \edef\p_strc_constructions_indenting{\constructionparameter\c!indenting}%
+ \ifx\p_strc_constructions_indenting\empty \else
+ \indenting[\p_strc_constructions_indenting]% \use...
+ \fi
%
\dostoptagged % tag
\dostarttagged\t!constructioncontent\empty
@@ -502,7 +508,7 @@
\setupalign[\p_strc_constructions_headalign]% use fast one
\fi
\ifhbox\constructionheadbox\unhcopy\else\copy\fi\constructionheadbox}%
-\setbox\constructionheadbox\hbox{\box\constructionheadbox}% needed in case of e.g. a real big head font, see descriptions-006.tex
+ \setbox\constructionheadbox\hbox{\box\constructionheadbox}% needed in case of e.g. a real big head font, see descriptions-006.tex
\ht\constructionheadbox\strutht
\dp\constructionheadbox\strutdp}
@@ -526,9 +532,14 @@
% The setups. These only deal with placement of the descriptor and initializing the
% environment. The wrapping happens elsewhere.
+% todo: optimize the setups with
+%
+% \ifconditional\c_strc_constructions_distance_none : no need for skip
+% \ifzeropt\wd\constructionheadbox : no need for box and skips
+
\startsetups[\??constructionrenderings:\v!left]
\edef\p_strc_constructions_hang{\constructionparameter\c!hang}%
- \doifsetupselse{\??constructionrenderings:\v!left:\p_strc_constructions_hang} {
+ \doifelsesetups{\??constructionrenderings:\v!left:\p_strc_constructions_hang} {
\directsetup{\??constructionrenderings:\v!left:\p_strc_constructions_hang}
} {
\directsetup{\??constructionrenderings:\v!left:\v!hanging}
@@ -537,7 +548,7 @@
\startsetups[\??constructionrenderings:\v!right]
\edef\p_strc_constructions_hang{\constructionparameter\c!hang}
- \doifsetupselse{\??constructionrenderings:\v!right:\p_strc_constructions_hang} {
+ \doifelsesetups{\??constructionrenderings:\v!right:\p_strc_constructions_hang} {
\directsetup{\??constructionrenderings:\v!right:\p_strc_constructions_hang}
} {
\directsetup{\??constructionrenderings:\v!right:\v!hanging}
@@ -556,6 +567,7 @@
\copy\constructionheadbox\hss
}
}
+ \nobreak
\useconstructionstyleandcolor\c!style\c!color
\ignorespaces
\stopsetups
@@ -580,6 +592,7 @@
\copy\constructionheadbox
\hskip\rightconstructionskip
}
+ \nobreak
\advance\rightskip \constructionsheaddistance
\useconstructionstyleandcolor\c!style\c!color
\ignorespaces
@@ -634,6 +647,7 @@
\box\constructionheadbox
}
}
+ \nobreak
\useconstructionstyleandcolor\c!style\c!color
\ignorespaces
\stopsetups
@@ -653,6 +667,7 @@
}
}
}
+ \nobreak
\useconstructionstyleandcolor\c!style\c!color
\ignorespaces
\stopsetups
@@ -730,7 +745,7 @@
\startsetups[\??constructionrenderings:\v!serried]
\edef\p_strc_constructions_width{\constructionparameter\c!width}% CHECK ! ! ! wrong parameter namespace
- \doifsetupselse{\??constructionrenderings:\v!serried:\p_strc_constructions_width} {
+ \doifelsesetups{\??constructionrenderings:\v!serried:\p_strc_constructions_width} {
\directsetup{\??constructionrenderings:\v!serried:\p_strc_constructions_width}
} {
\directsetup{\??constructionrenderings:\v!serried:\v!wide}
@@ -741,7 +756,7 @@
\let\\=\crlf
\noindent
\ifhbox\constructionheadbox\unhcopy\else\copy\fi\constructionheadbox % why copy? leftover?
- \penalty\plustenthousand % new
+ \nobreak
\hskip\constructionsheaddistance\relax
\useconstructionstyleandcolor\c!style\c!color
\ignorespaces
@@ -752,8 +767,8 @@
\noindent
\ifhbox\constructionheadbox\unhcopy\else\copy\fi\constructionheadbox % why copy? leftover?
\ifconditional\c_strc_constructions_distance_none \else
- \penalty\plustenthousand % new
- \hskip\constructionsheaddistance \!!plus .5\constructionsheaddistance \!!minus .25\constructionsheaddistance\relax
+ \nobreak
+ \hskip\constructionsheaddistance \!!plus .5\constructionsheaddistance \!!minus .25\constructionsheaddistance\relax
\fi
\useconstructionstyleandcolor\c!style\c!color
\ignorespaces
@@ -770,6 +785,7 @@
\ifhbox\constructionheadbox\unhcopy\else\copy\fi\constructionheadbox
\hss
}
+ \nobreak
\hskip\constructionsheaddistance\relax
\useconstructionstyleandcolor\c!style\c!color
\ignorespaces
@@ -845,7 +861,7 @@
\let\currentconstructionlistentry\!!zerocount
\def\strc_constructions_register
- {\ctxcommand{doiflisthasentry(\currentconstructionlistentry)}%
+ {\clf_doifelselisthasentry\numexpr\currentconstructionlistentry\relax
\strc_constructions_register_nop
\strc_constructions_register_yes}
@@ -858,7 +874,7 @@
\def\strc_constructions_discard
{\iftrialtypesetting
% \writestatus{constructions}{discarding \currentconstruction: \number\currentconstructionlistentry}%
- \ctxcommand{discardfromlist(\currentconstructionlistentry)}%
+ \clf_discardfromlist\currentconstructionlistentry\relax
\fi}
\let\currentconstructionlistnumber \!!zerocount
@@ -928,59 +944,63 @@
\else
\setnextinternalreferences{construction}\currentconstructionmain % plural
\relax
- \scratchcounter\ctxcommand{addtolist{ % we can set a counter at the lua end
- metadata = {
- kind = "construction",
- name = "\currentconstructionmain",
- level = structures.sections.currentlevel(),
- catcodes = \the\catcodetable,
- % \currentdirectionparameters
- },
- references = {
- internal = \nextinternalreference,
- order = \nextinternalorderreference,
- reference = "\currentconstructionreference",
- referenceprefix = "\referenceprefix",
- block = "\currentsectionblock",
- section = structures.sections.currentid(),
- },
- titledata = {
- label = \!!bs\detokenize\expandafter{\currentconstructionlabel }\!!es,
- title = \!!bs\detokenize\expandafter{\currentconstructiontitle }\!!es,
+ \scratchcounter\clf_addtolist
+ metadata {
+ kind {construction}
+ name {\currentconstructionmain}
+ % level structures.sections.currentlevel()
+ catcodes \catcodetable
+ % \currentdirectionparameters
+ }
+ references {
+ internal \nextinternalreference
+ order \nextinternalorderreference
+ reference {\currentconstructionreference}
+ prefix {\referenceprefix}
+ % block {\currentsectionblock}
+ % section structures.sections.currentid(),
+ }
+ titledata {
+ label {\detokenize\expandafter{\currentconstructionlabel}}
+ title {\detokenize\expandafter{\currentconstructiontitle}}
\ifx\currentconstructionbookmark\currentconstructiontitle \else
- bookmark = \!!bs\detokenize\expandafter{\currentconstructionbookmark}\!!es,
+ bookmark {\detokenize\expandafter{\currentconstructionbookmark}}
\fi
\ifx\currentconstructionlist\currentconstructiontitle \else
- list = \!!bs\detokenize\expandafter{\currentconstructionlist }\!!es,
+ list {\detokenize\expandafter{\currentconstructionlist}}
\fi
- },
+ }
\ifconditional\c_strc_constructions_number_state
- prefixdata = {
- prefix = "\constructionparameter\c!prefix",
- separatorset = "\constructionparameter\c!prefixseparatorset",
- conversion = \!!bs\constructionparameter\c!prefixconversion\!!es,
- conversionset = "\constructionparameter\c!prefixconversionset",
- set = "\constructionparameter\c!prefixset",
- segments = "\constructionparameter\c!prefixsegments",
- connector = \!!bs\constructionparameter\c!prefixconnector\!!es,
- },
- numberdata = {
- numbers = structures.counters.compact("\currentconstructionnumber",nil,true), % ! number can be cloned
- separatorset = "\constructionparameter\c!numberseparatorset",
- conversion = "\constructionparameter\c!numberconversion",
- conversionset = "\constructionparameter\c!numberconversionset",
- starter = \!!bs\constructionparameter\c!numberstarter\!!es,
- stopper = \!!bs\constructionparameter\c!numberstopper\!!es,
- segments = "\constructionparameter\c!numbersegments",
- },
+ prefixdata {
+ prefix {\constructionparameter\c!prefix}
+ separatorset {\constructionparameter\c!prefixseparatorset}
+ conversion {\constructionparameter\c!prefixconversion}
+ conversionset {\constructionparameter\c!prefixconversionset}
+ set {\constructionparameter\c!prefixset}
+ segments {\constructionparameter\c!prefixsegments}
+ connector {\constructionparameter\c!prefixconnector}
+ }
+ numberdata {
+ numbers {\currentconstructionnumber}
+ separatorset {\constructionparameter\c!numberseparatorset}
+ conversion {\constructionparameter\c!numberconversion}
+ conversionset {\constructionparameter\c!numberconversionset}
+ starter {\constructionparameter\c!numberstarter}
+ stopper {\constructionparameter\c!numberstopper}
+ segments {\constructionparameter\c!numbersegments}
+ }
\or
% symbol
\fi
- userdata = \!!bs\detokenize{#2}\!!es % will be converted to table at the lua end
- }
- }\relax
+ userdata {\detokenize{#2}}
+ \relax
% \writestatus{constructions}{registering \currentconstruction: \number\scratchcounter}%
- \ctxcommand{setinternalreference("\referenceprefix","\currentconstructionreference",\nextinternalreference,"\interactionparameter\c!focus")}%
+ \clf_setinternalreference
+ prefix {\referenceprefix}%
+ reference {\currentconstructionreference}%
+ internal \nextinternalreference
+ view {\interactionparameter\c!focus}%
+ \relax
\normalexpanded{%
\endgroup
\edef\noexpand\currentconstructionlistentry {\the\scratchcounter}%
@@ -994,7 +1014,7 @@
% macros.
\def\reinstateconstructionnumberentry#1% was xdef
- {\edef\currentconstructionattribute {\ctxcommand {getinternallistreference(#1)}}%
+ {\edef\currentconstructionattribute {\clf_getinternallistreference#1}%
\edef\currentconstructionsynchronize{\ctxlatecommand{enhancelist(#1)}}}
\installstructurelistprocessor{construction}{\usestructurelistprocessor{number+title}}
diff --git a/Master/texmf-dist/tex/context/base/strc-def.mkiv b/Master/texmf-dist/tex/context/base/strc-def.mkiv
index 0738bdf29d8..b4d2a5feadf 100644
--- a/Master/texmf-dist/tex/context/base/strc-def.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-def.mkiv
@@ -32,6 +32,7 @@
\defineresetset [\s!default] [] [1] % each level
\defineprefixset [\s!default] [section-1,section-2,section-3] []
+\defineconversionset [\v!number] [] [numbers]
\defineconversionset [\v!pagenumber] [] [numbers]
\defineprefixset [\v!all] [section-1,section-2,section-3,section-4,section-5,section-6,section-7,section-8] []
@@ -47,6 +48,9 @@
\setupuserpagenumber
[\c!numberconversionset=\v!pagenumber]
+\setupcounters
+ [\c!numberconversionset=\v!number]
+
% \startsetups defaults:frontpart:pagenumbers:roman
% \defineconversionset[\c!frontpart:\c!pagenumber][][romannumerals]
% \setupuserpagenumber[\c!way=\v!by\v!block]
@@ -220,19 +224,19 @@
[\c!before={\blank[\v!preference,\v!big]}, % sort of mkii compatible, watch columns
\c!after=\blank,
\c!label=\v!yes,
- \c!distance=1em]
+ \c!distance=\emwidth]
\setuplist
[\v!chapter]
[\c!before={\blank[\v!preference,\v!big]}, % sort of mkii compatible, watch columns
\c!after=]
-\setuplist [\v!part] [\c!width=0em]
-\setuplist [\v!chapter] [\c!width=2em]
-\setuplist [\v!section] [\c!width=3em]
-\setuplist [\v!subsection] [\c!width=4em]
-\setuplist [\v!subsubsection] [\c!width=5em]
-\setuplist [\v!subsubsubsection] [\c!width=6em]
-\setuplist [\v!subsubsubsubsection] [\c!width=7em]
+\setuplist [\v!part] [\c!width=0\emwidth]
+\setuplist [\v!chapter] [\c!width=2\emwidth]
+\setuplist [\v!section] [\c!width=3\emwidth]
+\setuplist [\v!subsection] [\c!width=4\emwidth]
+\setuplist [\v!subsubsection] [\c!width=5\emwidth]
+\setuplist [\v!subsubsubsection] [\c!width=6\emwidth]
+\setuplist [\v!subsubsubsubsection] [\c!width=7\emwidth]
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/strc-des.mkvi b/Master/texmf-dist/tex/context/base/strc-des.mkvi
index fa20d3caea9..3557000f91d 100644
--- a/Master/texmf-dist/tex/context/base/strc-des.mkvi
+++ b/Master/texmf-dist/tex/context/base/strc-des.mkvi
@@ -76,6 +76,7 @@
\unexpanded\setvalue{\??constructioninitializer\v!description}%
{\let\currentdescription \currentconstruction
\let\constructionparameter \descriptionparameter
+ \let\constructionnamespace \??description
\let\detokenizedconstructionparameter\detokenizeddescriptionparameter
\let\letconstructionparameter \letdescriptionparameter
\let\useconstructionstyleandcolor \usedescriptionstyleandcolor
@@ -102,10 +103,10 @@
\unexpanded\def\strc_descriptions_start#1%
{\begingroup
\strc_constructions_initialize{#1}%
- \doifnextoptionalcselse\strc_descriptions_start_yes\strc_descriptions_start_nop}
+ \doifelsenextoptionalcs\strc_descriptions_start_yes\strc_descriptions_start_nop}
\unexpanded\def\strc_descriptions_start_yes[#1]%
- {\doifassignmentelse{#1}\strc_descriptions_start_yes_assignment\strc_descriptions_start_yes_reference[#1]}
+ {\doifelseassignment{#1}\strc_descriptions_start_yes_assignment\strc_descriptions_start_yes_reference[#1]}
\unexpanded\def\strc_descriptions_start_yes_assignment[#1]% todo userdata
{\strc_constructions_register[\c!label={\descriptionparameter\c!text},\c!reference=,\c!title=,\c!bookmark=,\c!list=,#1][]%
@@ -119,7 +120,7 @@
\fi}
\unexpanded\def\strc_descriptions_start_yes_titled[#1]%
- {\doifnextbgroupelse
+ {\doifelsenextbgroup
{\strc_descriptions_start_yes_titled_indeed[#1]}%
{\setfalse\c_strc_constructions_title_state
\strc_descriptions_start_yes_normal[#1]}}
@@ -140,7 +141,7 @@
\fi}
\unexpanded\def\strc_descriptions_start_nop_titled
- {\doifnextbgroupelse
+ {\doifelsenextbgroup
{\strc_descriptions_start_nop_titled_indeed}%
{\setfalse\c_strc_constructions_title_state
\strc_descriptions_start_nop_normal}}%
@@ -162,7 +163,7 @@
\unexpanded\def\strc_descriptions_command#1%
{\begingroup
\strc_constructions_initialize{#1}%
- \doifnextoptionalcselse\strc_descriptions_yes\strc_descriptions_nop}
+ \doifelsenextoptionalcs\strc_descriptions_yes\strc_descriptions_nop}
\unexpanded\def\strc_descriptions_yes
{\ifconditional\c_strc_constructions_title_state
@@ -176,7 +177,7 @@
\csname\??constructioncommandhandler\currentconstructionhandler\endcsname}
\unexpanded\def\strc_descriptions_yes_titled[#1]%
- {\doifnextbgroupelse
+ {\doifelsenextbgroup
{\strc_descriptions_yes_titled_indeed[#1]}%
{\setfalse\c_strc_constructions_title_state
\strc_descriptions_yes_normal[#1]}}
@@ -197,7 +198,7 @@
\fi}
\unexpanded\def\strc_descriptions_nop_titled
- {\doifnextbgroupelse
+ {\doifelsenextbgroup
{\strc_descriptions_nop_titled_indeed}%
{\setfalse\c_strc_constructions_title_state
\strc_descriptions_nop_normal}}
diff --git a/Master/texmf-dist/tex/context/base/strc-doc.lua b/Master/texmf-dist/tex/context/base/strc-doc.lua
index 38830a4e77c..029d68a9dc2 100644
--- a/Master/texmf-dist/tex/context/base/strc-doc.lua
+++ b/Master/texmf-dist/tex/context/base/strc-doc.lua
@@ -17,15 +17,18 @@ if not modules then modules = { } end modules ['strc-doc'] = {
local next, type, tonumber, select = next, type, tonumber, select
local format, gsub, find, gmatch, match = string.format, string.gsub, string.find, string.gmatch, string.match
-local concat, fastcopy = table.concat, table.fastcopy
+local concat, fastcopy, insert, remove = table.concat, table.fastcopy, table.insert, table.remove
local max, min = math.max, math.min
local allocate, mark, accesstable = utilities.storage.allocate, utilities.storage.mark, utilities.tables.accesstable
local setmetatableindex = table.setmetatableindex
+local lpegmatch, P, C = lpeg.match, lpeg.P, lpeg.C
local catcodenumbers = catcodes.numbers
local ctxcatcodes = catcodenumbers.ctxcatcodes
local variables = interfaces.variables
+local implement = interfaces.implement
+
local v_last = variables.last
local v_first = variables.first
local v_previous = variables.previous
@@ -59,6 +62,8 @@ local startapplyprocessor = processors.startapply
local stopapplyprocessor = processors.stopapply
local strippedprocessor = processors.stripped
+local convertnumber = converters.convert
+
local a_internal = attributes.private('internal')
local ctx_convertnumber = context.convertnumber
@@ -128,28 +133,48 @@ local registered = sections.registered
storage.register("structures/sections/registered", registered, "structures.sections.registered")
+local function update(name,level,section)
+ for k, v in next, registered do
+ if k ~= name and v.coupling == name then
+ report_structure("updating section level %a to level of %a",k,name)
+ context.doredefinehead(k,name)
+ update(k,level,section)
+ end
+ end
+end
+
function sections.register(name,specification)
registered[name] = specification
+ local level = specification.level
+ local section = specification.section
+ update(name,level,section)
end
function sections.currentid()
return #tobesaved
end
+local lastsaved = 0
+
function sections.save(sectiondata)
-- local sectionnumber = helpers.simplify(section.sectiondata) -- maybe done earlier
local numberdata = sectiondata.numberdata
local ntobesaved = #tobesaved
if not numberdata or sectiondata.metadata.nolist then
- return ntobesaved
+ -- stay
else
ntobesaved = ntobesaved + 1
tobesaved[ntobesaved] = numberdata
if not collected[ntobesaved] then
collected[ntobesaved] = numberdata
end
- return ntobesaved
end
+ lastsaved = ntobesaved
+ return ntobesaved
+end
+
+function sections.currentsectionindex()
+ return lastsaved -- only for special controlled situations
end
function sections.load()
@@ -214,7 +239,7 @@ end
function sections.pushblock(name,settings)
counters.check(0) -- we assume sane usage of \page between blocks
local block = name or data.block
- data.blocks[#data.blocks+1] = block
+ insert(data.blocks,block)
data.block = block
sectionblockdata[block] = settings
documents.reset()
@@ -222,17 +247,18 @@ function sections.pushblock(name,settings)
end
function sections.popblock()
- data.blocks[#data.blocks] = nil
- local block = data.blocks[#data.blocks] or data.block
+ local block = remove(data.blocks) or data.block
data.block = block
documents.reset()
return block
end
-function sections.currentblock()
+local function getcurrentblock()
return data.block or data.blocks[#data.blocks] or "unknown"
end
+sections.currentblock = getcurrentblock
+
function sections.currentlevel()
return data.depth
end
@@ -246,15 +272,33 @@ local saveset = { } -- experiment, see sections/tricky-001.tex
function sections.setentry(given)
-- old number
local numbers = data.numbers
+ --
+ local metadata = given.metadata
+ local numberdata = given.numberdata
+ local references = given.references
+ local directives = given.directives
+ local userdata = given.userdata
+
+ if not metadata then
+ metadata = { }
+ given.metadata = metadata
+ end
+ if not numberdata then
+ numberdata = { }
+ given.numberdata = numberdata
+ end
+ if not references then
+ references = { }
+ given.references = references
+ end
local ownnumbers = data.ownnumbers
local forced = data.forced
local status = data.status
local olddepth = data.depth
- local givenname = given.metadata.name
+ local givenname = metadata.name
local mappedlevel = levelmap[givenname]
local newdepth = tonumber(mappedlevel or (olddepth > 0 and olddepth) or 1) -- hm, levelmap only works for section-*
- local directives = given.directives
local resetset = directives and directives.resetset or ""
-- local resetter = sets.getall("structure:resets",data.block,resetset)
-- a trick to permit userdata to overload title, ownnumber and reference
@@ -264,14 +308,13 @@ function sections.setentry(given)
report_structure("name %a, mapped level %a, old depth %a, new depth %a, reset set %a",
givenname,mappedlevel,olddepth,newdepth,resetset)
end
- local u = given.userdata
- if u then
- -- kind of obsolete as we can pass them directly anyway
- if u.reference and u.reference ~= "" then given.metadata.reference = u.reference ; u.reference = nil end
- if u.ownnumber and u.ownnumber ~= "" then given.numberdata.ownnumber = u.ownnumber ; u.ownnumber = nil end
- if u.title and u.title ~= "" then given.titledata.title = u.title ; u.title = nil end
- if u.bookmark and u.bookmark ~= "" then given.titledata.bookmark = u.bookmark ; u.bookmark = nil end
- if u.label and u.label ~= "" then given.titledata.label = u.label ; u.label = nil end
+ if userdata then
+ -- kind of obsolete as we can pass them directly anyway ... NEEDS CHECKING !
+ if userdata.reference and userdata.reference ~= "" then given.metadata.reference = userdata.reference ; userdata.reference = nil end
+ if userdata.ownnumber and userdata.ownnumber ~= "" then given.numberdata.ownnumber = userdata.ownnumber ; userdata.ownnumber = nil end
+ if userdata.title and userdata.title ~= "" then given.titledata.title = userdata.title ; userdata.title = nil end
+ if userdata.bookmark and userdata.bookmark ~= "" then given.titledata.bookmark = userdata.bookmark ; userdata.bookmark = nil end
+ if userdata.label and userdata.label ~= "" then given.titledata.label = userdata.label ; userdata.label = nil end
end
-- so far for the trick
if saveset then
@@ -309,12 +352,12 @@ function sections.setentry(given)
end
end
counters.check(newdepth)
- ownnumbers[newdepth] = given.numberdata.ownnumber or ""
- given.numberdata.ownnumber = nil
+ ownnumbers[newdepth] = numberdata.ownnumber or ""
+ numberdata.ownnumber = nil
data.depth = newdepth
-- new number
olddepth = newdepth
- if given.metadata.increment then
+ if metadata.increment then
local oldn, newn = numbers[newdepth] or 0, 0
local fd = forced[newdepth]
if fd then
@@ -344,40 +387,31 @@ function sections.setentry(given)
v[2](k)
end
end
- local numberdata= given.numberdata
- if not numberdata then
- -- probably simplified to nothing
- numberdata = { }
- given.numberdata = numberdata
- end
-
local n = { }
for i=1,newdepth do
n[i] = numbers[i]
end
numberdata.numbers = n
--- numberdata.numbers = fastcopy(numbers)
-
+ if not numberdata.block then
+ numberdata.block = getcurrentblock() -- also in references
+ end
if #ownnumbers > 0 then
numberdata.ownnumbers = fastcopy(ownnumbers)
end
if trace_detail then
report_structure("name %a, numbers % a, own numbers % a",givenname,numberdata.numbers,numberdata.ownnumbers)
end
-
- local metadata = given.metadata
- local references = given.references
-
+ if not references.block then
+ references.block = getcurrentblock() -- also in numberdata
+ end
local tag = references.tag or tags.getid(metadata.kind,metadata.name)
if tag and tag ~= "" and tag ~= "?" then
references.tag = tag
end
-
local setcomponent = structures.references.setcomponent
if setcomponent then
setcomponent(given) -- might move to the tex end
end
-
references.section = sections.save(given)
-- given.numberdata = nil
end
@@ -528,10 +562,6 @@ end
sections.depthnumber = depthnumber
-function commands.depthnumber(n)
- return context(depthnumber(n))
-end
-
function sections.autodepth(numbers)
for i=#numbers,1,-1 do
if numbers[i] ~= 0 then
@@ -557,10 +587,9 @@ end
-- sign=positive => also zero
-- sign=hang => llap sign
---~ todo: test this
---~
+-- this can be a local function
-local function process(index,numbers,ownnumbers,criterium,separatorset,conversion,conversionset,index,entry,result,preceding,done)
+local function process(index,numbers,ownnumbers,criterium,separatorset,conversion,conversionset,entry,result,preceding,done,language)
-- todo: too much (100 steps)
local number = numbers and (numbers[index] or 0)
local ownnumber = ownnumbers and ownnumbers[index] or ""
@@ -581,10 +610,10 @@ local function process(index,numbers,ownnumbers,criterium,separatorset,conversio
if ownnumber ~= "" then
result[#result+1] = ownnumber
elseif conversion and conversion ~= "" then -- traditional (e.g. used in itemgroups) .. inherited!
- result[#result+1] = converters.convert(conversion,number)
+ result[#result+1] = convertnumber(conversion,number,language)
else
local theconversion = sets.get("structure:conversions",block,conversionset,index,"numbers")
- result[#result+1] = converters.convert(theconversion,number)
+ result[#result+1] = convertnumber(theconversion,number,language)
end
else
if ownnumber ~= "" then
@@ -616,6 +645,7 @@ function sections.typesetnumber(entry,kind,...) -- kind='section','number','pref
local set = ""
local segments = ""
local criterium = ""
+ local language = ""
for d=1,select("#",...) do
local data = select(d,...) -- can be multiple parametersets
if data then
@@ -629,6 +659,7 @@ function sections.typesetnumber(entry,kind,...) -- kind='section','number','pref
if set == "" then set = data.set or "" end
if segments == "" then segments = data.segments or "" end
if criterium == "" then criterium = data.criterium or "" end
+ if language == "" then language = data.language or "" end
end
end
if separatorset == "" then separatorset = "default" end
@@ -640,6 +671,7 @@ function sections.typesetnumber(entry,kind,...) -- kind='section','number','pref
if connector == "" then connector = nil end
if set == "" then set = "default" end
if segments == "" then segments = nil end
+ if language == "" then language = nil end
--
if criterium == v_strict then
criterium = 0
@@ -651,10 +683,10 @@ function sections.typesetnumber(entry,kind,...) -- kind='section','number','pref
criterium = 0
end
--
- local firstprefix, lastprefix = 0, 16
+ local firstprefix, lastprefix = 0, 16 -- too much, could max found level
if segments then
local f, l = match(tostring(segments),"^(.-):(.+)$")
- if l == "*" then
+ if l == "*" or l == v_all then
l = 100 -- new
end
if f and l then
@@ -688,7 +720,7 @@ function sections.typesetnumber(entry,kind,...) -- kind='section','number','pref
applyprocessor(starter)
end
end
- if prefixlist and (kind == 'section' or kind == 'prefix' or kind == 'direct') then
+ if prefixlist and (kind == "section" or kind == "prefix" or kind == "direct") then
-- find valid set (problem: for sectionnumber we should pass the level)
-- no holes
local b, e, bb, ee = 1, #prefixlist, 0, 0
@@ -732,15 +764,13 @@ function sections.typesetnumber(entry,kind,...) -- kind='section','number','pref
local prefix = prefixlist[k]
local index = sections.getlevel(prefix) or k
if index >= firstprefix and index <= lastprefix then
- -- process(index,result)
- preceding, done = process(index,numbers,ownnumbers,criterium,separatorset,conversion,conversionset,index,entry,result,preceding,done)
+ preceding, done = process(index,numbers,ownnumbers,criterium,separatorset,conversion,conversionset,entry,result,preceding,done,language)
end
end
else
-- also holes check
for index=firstprefix,lastprefix do
- -- process(index,result)
- preceding, done = process(index,numbers,ownnumbers,criterium,separatorset,conversion,conversionset,index,entry,result,preceding,done)
+ preceding, done = process(index,numbers,ownnumbers,criterium,separatorset,conversion,conversionset,entry,result,preceding,done,language)
end
end
--
@@ -756,7 +786,7 @@ function sections.typesetnumber(entry,kind,...) -- kind='section','number','pref
if result then
result[#result+1] = strippedprocessor(groupsuffix)
else
- applyprocessor(groupsuffix)
+ applyprocessor(groupsuffix)
end
end
if stopper then
@@ -901,34 +931,21 @@ end
function sections.getnumber(depth,what) -- redefined here
local sectiondata = sections.findnumber(depth,what)
- context((sectiondata and sectiondata.numbers[depth]) or 0)
+ local askednumber = 0
+ if sectiondata then
+ local numbers = sectiondata.numbers
+ if numbers then
+ askednumber = numbers[depth] or 0
+ end
+ end
+ context(askednumber)
end
-- experimental
local levels = { }
---~ function commands.autonextstructurelevel(level)
---~ if level > #levels then
---~ for i=#levels+1,level do
---~ levels[i] = ""
---~ end
---~ end
---~ local finish = concat(levels,"\n",level) or ""
---~ for i=level+1,#levels do
---~ levels[i] = ""
---~ end
---~ levels[level] = [[\finalizeautostructurelevel]]
---~ context(finish)
---~ end
-
---~ function commands.autofinishstructurelevels()
---~ local finish = concat(levels,"\n") or ""
---~ levels = { }
---~ context(finish)
---~ end
-
-function commands.autonextstructurelevel(level)
+local function autonextstructurelevel(level)
if level > #levels then
for i=#levels+1,level do
levels[i] = false
@@ -944,7 +961,7 @@ function commands.autonextstructurelevel(level)
levels[level] = true
end
-function commands.autofinishstructurelevels()
+local function autofinishstructurelevels()
for i=1,#levels do
if levels[i] then
ctx_finalizeauto()
@@ -953,38 +970,132 @@ function commands.autofinishstructurelevels()
levels = { }
end
--- interface (some are actually already commands, like sections.fullnumber)
+implement {
+ name = "autonextstructurelevel",
+ actions = autonextstructurelevel,
+ arguments = "integer",
+}
-commands.structurenumber = sections.fullnumber
-commands.structuretitle = sections.title
+implement {
+ name = "autofinishstructurelevels",
+ actions = autofinishstructurelevels,
+}
-commands.structurevariable = function(name) sections.structuredata(nil,name) end
-commands.structureuservariable = function(name) sections.userdata (nil,name) end
-commands.structurecatcodedget = function(name) sections.structuredata(nil,name,nil,true) end
-commands.structuregivencatcodedget = function(name,catcode) sections.structuredata(nil,name,nil,catcode) end
-commands.structureautocatcodedget = function(name,catcode) sections.structuredata(nil,name,nil,catcode) end
+-- interface (some are actually already commands, like sections.fullnumber)
-commands.namedstructurevariable = sections.structuredata
-commands.namedstructureuservariable = sections.userdata
+implement {
+ name = "depthnumber",
+ actions = { depthnumber, context },
+ arguments = "integer",
+}
-commands.setsectionlevel = sections.setlevel
-commands.setsectionnumber = sections.setnumber
-commands.getsectionnumber = sections.getnumber
-commands.getfullsectionnumber = sections.fullnumber
-commands.getstructuredata = sections.structuredata
-commands.getcurrentsectionlevel = sections.getcurrentlevel
+implement { name = "structurenumber", actions = sections.fullnumber }
+implement { name = "structuretitle", actions = sections.title }
+
+implement { name = "structurevariable", actions = sections.structuredata, arguments = { false, "string" } }
+implement { name = "structureuservariable", actions = sections.userdata, arguments = { false, "string" } }
+implement { name = "structurecatcodedget", actions = sections.structuredata, arguments = { false, "string", false, true } }
+implement { name = "structuregivencatcodedget", actions = sections.structuredata, arguments = { false, "string", false, "integer" } }
+implement { name = "structureautocatcodedget", actions = sections.structuredata, arguments = { false, "string", false, "string" } }
+
+implement { name = "namedstructurevariable", actions = sections.structuredata, arguments = { "string", "string" } }
+implement { name = "namedstructureuservariable", actions = sections.userdata, arguments = { "string", "string" } }
+
+implement { name = "setstructurelevel", actions = sections.setlevel, arguments = { "string", "string" } }
+implement { name = "getstructurelevel", actions = sections.getcurrentlevel, arguments = { "string" } }
+implement { name = "setstructurenumber", actions = sections.setnumber, arguments = { "integer", "string" } }
+implement { name = "getstructurenumber", actions = sections.getnumber, arguments = { "integer" } }
+implement { name = "getsomestructurenumber", actions = sections.getnumber, arguments = { "integer", "string" } }
+implement { name = "getfullstructurenumber", actions = sections.fullnumber, arguments = { "integer" } }
+implement { name = "getsomefullstructurenumber", actions = sections.fullnumber, arguments = { "integer", "string" } }
+implement { name = "getspecificstructuretitle", actions = sections.structuredata, arguments = { "string", "'titledata.title'",false,"string" } }
+
+implement { name = "reportstructure", actions = sections.reportstructure }
+
+implement {
+ name = "registersection",
+ actions = sections.register,
+ arguments = {
+ "string",
+ {
+ { "coupling" },
+ { "section" },
+ { "level", "integer" },
+ { "parent" },
+ }
+ }
+}
-commands.setsectionblock = sections.setblock
-commands.pushsectionblock = sections.pushblock
-commands.popsectionblock = sections.popblock
+implement {
+ name = "setsectionentry",
+ actions = sections.setentry,
+ arguments = {
+ {
+ { "references", {
+ { "internal", "integer" },
+ { "block" },
+ { "backreference" },
+ { "prefix" },
+ { "reference" },
+ }
+ },
+ { "directives", {
+ { "resetset" }
+ }
+ },
+ { "metadata", {
+ { "kind" },
+ { "name" },
+ { "catcodes", "integer" },
+ { "coding" },
+ { "xmlroot" },
+ { "xmlsetup" },
+ { "nolist", "boolean" },
+ { "increment" },
+ }
+ },
+ { "titledata", {
+ { "label" },
+ { "title" },
+ { "bookmark" },
+ { "marking" },
+ { "list" },
+ }
+ },
+ { "numberdata", {
+ { "block" },
+ { "hidenumber", "boolean" },
+ { "separatorset" },
+ { "conversionset" },
+ { "conversion" },
+ { "starter" },
+ { "stopper" },
+ { "set" },
+ { "segments" },
+ { "ownnumber" },
+ { "language" },
+ },
+ },
+ { "userdata" },
+ }
+ }
+}
-commands.registersection = sections.register
-commands.setsectionentry = sections.setentry
-commands.reportstructure = sections.reportstructure
---
+-- os.exit()
-local byway = "^" .. v_by -- ugly but downward compatible
+implement {
+ name = "setsectionblock",
+ actions = sections.setblock,
+ arguments = { "string", { { "bookmark" } } }
+}
-function commands.way(way)
- context((gsub(way,byway,"")))
-end
+implement {
+ name = "pushsectionblock",
+ actions = sections.pushblock,
+ arguments = { "string", { { "bookmark" } } }
+}
+
+implement {
+ name = "popsectionblock",
+ actions = sections.popblock,
+}
diff --git a/Master/texmf-dist/tex/context/base/strc-doc.mkiv b/Master/texmf-dist/tex/context/base/strc-doc.mkiv
index 98abfd6118e..c453f199ef8 100644
--- a/Master/texmf-dist/tex/context/base/strc-doc.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-doc.mkiv
@@ -20,8 +20,13 @@
%D This will move:
\unexpanded\def\setstructuresynchronization#1% todo: use ctxcontext
- {\ctxcommand{setinternalreference("\currentstructurereferenceprefix","\currentstructurereference",\nextinternalreference,"\interactionparameter\c!focus")}%
+ {\clf_setinternalreference
+ prefix {\currentstructurereferenceprefix}%
+ reference {\currentstructurereference}
+ internal \nextinternalreference
+ view {\interactionparameter\c!focus}%
+ \relax
\xdef\currentstructureattribute {\the\lastdestinationattribute}%
- \xdef\currentstructuresynchronize{\ctxlatecommand{enhancelist(#1)}}}
+ \xdef\currentstructuresynchronize{\strc_lists_inject_enhance{#1}{\nextinternalreference}}}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/strc-enu.mkvi b/Master/texmf-dist/tex/context/base/strc-enu.mkvi
index 0a01d2637f5..b76bc0067e1 100644
--- a/Master/texmf-dist/tex/context/base/strc-enu.mkvi
+++ b/Master/texmf-dist/tex/context/base/strc-enu.mkvi
@@ -172,7 +172,7 @@
\ifx\p_counter\empty %
\let\p_counter\currentenumeration
\fi
- \doifcounterelse\p_counter\donothing{\strc_enumerations_define_counter\p_counter}%
+ \doifelsecounter\p_counter\donothing{\strc_enumerations_define_counter\p_counter}%
\letenumerationparameter\s!counter\p_counter
%\strc_enumerations_setup_counter\currentenumeration
\to \everydefineenumeration
@@ -183,6 +183,7 @@
\unexpanded\setvalue{\??constructioninitializer\v!enumeration}%
{\let\currentenumeration \currentconstruction
\let\constructionparameter \enumerationparameter
+ \let\constructionnamespace \??enumeration
\let\detokenizedconstructionparameter\detokenizedenumerationparameter
\let\letconstructionparameter \letenumerationparameter
\let\useconstructionstyleandcolor \useenumerationstyleandcolor
@@ -283,7 +284,7 @@
\unexpanded\def\strc_enumerations_inject_extra_text
{\ifconditional\c_strc_constructions_title_state
- \ctxcommand{doiflisthastitleelse("\currentconstructionmain",\currentconstructionlistentry)}
+ \clf_doifelselisthastitle{\currentconstructionmain}\numexpr\currentconstructionlistentry\relax
\donothing
\strc_enumerations_inject_extra_text_indeed
\fi}
@@ -300,7 +301,7 @@
\useconstructionstyleandcolor\c!titlestyle\c!titlecolor
\constructionparameter\c!titlecommand
{\constructionparameter\c!titleleft
- \ctxcommand{savedlisttitle("\currentconstructionmain",\currentconstructionlistentry)}%
+ \clf_savedlisttitle{\currentconstructionmain}\currentconstructionlistentry\relax
\constructionparameter\c!titleright}%
\endgroup}
@@ -312,7 +313,7 @@
\unexpanded\def\strc_enumerations_inject_number
{\constructionparameter\c!left
\constructionparameter\c!starter
- \ctxcommand{savedlistprefixednumber("\currentconstructionmain",\currentconstructionlistentry)}%
+ \clf_savedlistprefixednumber{\currentconstructionmain}\currentconstructionlistentry\relax
\constructionparameter\c!stopper
\constructionparameter\c!right}
@@ -370,6 +371,6 @@
\fi}
\unexpanded\def\strc_enumerations_skip_number_coupling[#tag]% e.g. for questions with no answer
- {\ctxcommand{setnextreferenceorder("construction","#tag")}}
+ {\clf_setnextreferenceorder{construction}{#tag}}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/strc-flt.mkvi b/Master/texmf-dist/tex/context/base/strc-flt.mkvi
index a939213177d..9a7fc56f6da 100644
--- a/Master/texmf-dist/tex/context/base/strc-flt.mkvi
+++ b/Master/texmf-dist/tex/context/base/strc-flt.mkvi
@@ -17,6 +17,23 @@
\unprotect
+% todo: a keyword for this (and then a settings->hash for speed)
+%
+% \setuplayout[width=middle,backspace=3cm]
+%
+% \appendtoks
+% \settrue\inhibitmargindata
+% \to \everyinsidefloat
+%
+% \starttext
+% \dorecurse{20}{
+% \par \inleft{\red\infofont<#1>} \par
+% \placefigure[leftmargin]{}{\framed[height=1cm,width=2cm]{}}
+% % \placefigure{#1}{\framed[height=1cm,width=2cm]{}}
+% \par line #1.1 \par line #1.2 \par
+% }
+% \stoptext
+
% todo: delay caption creation and make setups for each method instead
% so that we can have a list of methods and redo them as we can
% keep the list or even better: recreate it
@@ -91,8 +108,9 @@
% \c!stopper=\@@kostopper,
\c!suffixseparator=, % currently rather hard coded
\c!suffix=\floatcaptionsuffix,
- \c!distance=1em,
+ \c!distance=\emwidth,
\c!conversion=\v!numbers,
+ \c!maxwidth=\hsize,
\c!command=]
% we can comment some of these
@@ -133,6 +151,7 @@
\c!outermargin=\zeropoint, % idem
\c!leftmargindistance=\zeropoint,
\c!rightmargindistance=\floatparameter\c!leftmargindistance,
+ \c!step=\v!big, % the flish side float step (big=line, medium=halfline, small=quarterline, depth=halfline with normaldepth)
\c!ntop=2,
\c!nbottom=0,
\c!nlines=4, % used?
@@ -186,8 +205,8 @@
{\definefloatcaption[#1][#3]%
\definecounter[#1][#3]%
\definelist[#1][#3]%
- \presetlabeltext[#1=\Word{#3}~]%
- \presetheadtext[#2=\Word{#2}]%
+ \copylabeltext[#1=#3]%
+ %\presetheadtext[#2=\Word{#2}]%
\strc_floats_define_saved[#1][#3]%
\strc_floats_define_commands{#1}{#2}}
@@ -235,8 +254,9 @@
\namedtaggedlabeltexts
\t!floatlabel \currentfloat
\t!floatnumber\currentfloat
- {\ctxcommand{savedlistprefixednumber("\currentfloat",\currentfloatnumber)}%
- \thecurrentfloatnumbersuffix}%
+ {\floatcaptionparameter\c!numbercommand
+ {\clf_savedlistprefixednumber{\currentfloat}\currentfloatnumber\relax
+ \thecurrentfloatnumbersuffix}}%
\fi
\fi \fi}
@@ -244,7 +264,8 @@
{\ifnofloatcaption \else
\ifx\currentfloatnumber\relax\else
\dostarttagged\t!floattext\empty
- \ctxcommand{savedlisttitle("\currentfloat",\currentfloatnumber)}%
+ \floatcaptionparameter\c!textcommand
+ {\clf_savedlisttitle{\currentfloat}\currentfloatnumber\relax}%
\dostoptagged
\fi
\fi}
@@ -489,8 +510,9 @@
\edef\floatlocation{\floatparameter\c!default}% beware of a clash between alignment locations
\fi
\strc_floats_analyze_location
+ % todo: use \lets
\setupcurrentfloatcaption[\c!reference={#reference},\c!title={#caption},\c!marking=,\c!list=,\c!bookmark=]%
- \doifinsetelse\v!split\floatlocation\strc_floats_place_next_box_split\strc_floats_place_next_box_normal}
+ \doifelseinset\v!split\floatlocation\strc_floats_place_next_box_split\strc_floats_place_next_box_normal}
\unexpanded\def\placefloat
{\flushnotes
@@ -535,7 +557,7 @@
\setupcurrentfloatuserdata[#userdata]%
\fi
\strc_floats_analyze_location
- \doifinsetelse\v!split\floatlocation\strc_floats_place_next_box_split\strc_floats_place_next_box_normal
+ \doifelseinset\v!split\floatlocation\strc_floats_place_next_box_split\strc_floats_place_next_box_normal
\bgroup
\ignorespaces}
@@ -547,7 +569,7 @@
{\flushnotes
\page_otr_command_flush_side_floats % here !
\strc_floats_begin_group
- \dodoubleempty\strc_floats_start_place_float}
+ \dotripleempty\strc_floats_start_place_float}
\def\strc_floats_start_place_float[#tag]%
{\strc_floats_set_current_tag{#tag}%
@@ -636,14 +658,14 @@
\unexpanded\def\strc_floats_place_next_box_normal
{\ifconditional\c_page_floats_some_waiting
% this was \checkwaitingfloats spread all over
- \doifinsetelse\v!always\floatlocation
+ \doifelseinset\v!always\floatlocation
{\showmessage\m!floatblocks5\empty}
- {\doifcommonelse\floatlocation\flushfloatslist\page_otr_command_flush_floats\donothing}%
+ {\doifelsecommon\floatlocation\flushfloatslist\page_otr_command_flush_floats\donothing}%
% but which should be done before using box \floatbox
\fi
\page_margin_strc_floats_before % todo: each float handler gets a before
\global\insidefloattrue
- \dostarttagged\t!float\currentfloat
+ \dostarttaggedchained\t!float\currentfloat\??float
\page_margin_strc_floats_set_hsize % todo: each float handler gets a set_hsize
\the\everyinsidefloat
\strc_floats_analyze_variables_one
@@ -681,7 +703,7 @@
{\ifinsidecolumns
\global\setfalse\c_strc_floats_par_float
\else
- \doifcommonelse\floatlocation\flushfloatslist
+ \doifelsecommon\floatlocation\flushfloatslist
{\global\settrue \c_strc_floats_par_float}
{\global\setfalse\c_strc_floats_par_float}%
\fi
@@ -720,12 +742,12 @@
180=>\global\c_strc_floats_rotation\commalistelement\relax,%
270=>\global\c_strc_floats_rotation\commalistelement\relax]%
\fi
- \doifinsetelse\v!nonumber\floatlocation
+ \doifelseinset\v!nonumber\floatlocation
{\global\nofloatnumbertrue}
{\doifelse{\floatcaptionparameter\c!number}\v!yes
{\global\nofloatnumberfalse}
{\global\nofloatnumbertrue}}%
- \doifinsetelse\v!none\floatlocation
+ \doifelseinset\v!none\floatlocation
{\global\nofloatcaptiontrue}
{\global\nofloatcaptionfalse}%
\doif{\floatcaptionparameter\c!number}\v!none % new
@@ -741,7 +763,7 @@
\ifconditional\c_page_floats_center_box_global
\settrue\c_page_floats_center_box_local
\else
- \doifinsetelse\v!local\floatlocation\settrue\setfalse\c_page_floats_center_box_local
+ \doifelseinset\v!local\floatlocation\settrue\setfalse\c_page_floats_center_box_local
\fi
\doifnotcommon{\v!always,\v!here,\v!force}\floatlocation % ! ! ! ! ! !
{\setfalse\c_page_floats_center_box_global
@@ -767,6 +789,8 @@
\expandafter\firstoftwoarguments
\fi}
+\let\doifmainfloatbodyelse\doifelsemainfloatbody
+
% todo: optional user pars
\let\currentfloatattribute\empty % to be checked
@@ -801,7 +825,7 @@
% uses:
\def\strc_floats_group_index
- {\numexpr\ctxcommand{listgroupindex("\currentfloat","\currentfloatgroup")}\relax}
+ {\numexpr\clf_listgroupindex{\currentfloat}{\currentfloatgroup}\relax}
\def\strc_floats_place_packaged_boxes
{\expandafter\strc_floats_place_packaged_boxes_indeed\expandafter{\m_strc_floats_saved_userdata}}
@@ -835,7 +859,7 @@
\relax
\relax
\relax
- [\c!name=\currentfloat,%
+ [\s!name=\currentfloat,% was c!name
\s!counter=\currentfloatcounter,%
\s!hascaption=\ifnofloatcaption \v!no\else\v!yes\fi,%
\s!hasnumber=\ifnofloatnumber \v!no\else\v!yes\fi,%
@@ -896,26 +920,29 @@
\strc_float_load_data
\to \everyinsidefloat
-\def\doifrightpagefloatelse
+\def\doifelserightpagefloat
{\ifdoublesided
\ifsinglesided
\doubleexpandafter\firstoftwoarguments
\else
- \doubleexpandafter\doifoddfloatpageelse
+ \doubleexpandafter\doifelseoddfloatpage
\fi
\else
\expandafter\firstoftwoarguments
\fi}
-\def\doifoddfloatpageelse
+\def\doifelseoddfloatpage
{\ifodd\purenumber\strc_float_realpage\space
\expandafter\firstoftwoarguments
\else
\expandafter\secondoftwoarguments
\fi}
+\let\doifrightpagefloatelse\doifelserightpagefloat
+\let\doifoddpagefloatelse \doifelseoddpagefloat
+
\appendtoks
- \let\rightorleftpageaction\doifrightpagefloatelse
+ \let\rightorleftpageaction\doifelserightpagefloat
\to \everyinsidefloat
% \let\movesidefloat\gobbleoneargument
@@ -926,7 +953,7 @@
\unexpanded\def\movesidefloat[#settings]% (-)n*line|x=,y=
{\global\d_page_sides_downshift \zeropoint
\global\d_page_sides_extrashift\zeropoint
- \doifassignmentelse{#settings}%
+ \doifelseassignment{#settings}%
{\begingroup
\setupcurrentfloat[\c!x=\zeropoint,\c!y=\zeropoint,#settings]%
\ifgridsnapping
@@ -1038,10 +1065,10 @@
\fi
\fi
% we can also support edges .. in that case no common but a fast loop
- \doifinsetelse\v!hanging\floatlocation
- {\doifcommonelse{\v!inleft,\v!leftmargin}\floatlocation
+ \doifelseinset\v!hanging\floatlocation
+ {\doifelsecommon{\v!inleft,\v!leftmargin}\floatlocation
{\let\p_maxwidth\leftmarginwidth}%
- {\doifcommonelse{\v!inright,\v!rightmargin}\floatlocation
+ {\doifelsecommon{\v!inright,\v!rightmargin}\floatlocation
{\let\p_maxwidth\rightmarginwidth}%
{\edef\p_maxwidth{\floatparameter\c!maxwidth}}}}%
{\edef\p_maxwidth{\floatparameter\c!maxwidth}}%
@@ -1050,9 +1077,9 @@
\else
\scratchwidth\p_maxwidth\relax
\ifdim\wd\floatbox>\scratchwidth
- \doifcommonelse{\v!inright,\v!rightmargin,\v!rightedge,\v!inleft,\v!leftmargin,\v!leftedge}\floatlocation
+ \doifelsecommon{\v!inright,\v!rightmargin,\v!rightedge,\v!inleft,\v!leftmargin,\v!leftedge}\floatlocation
{\global\d_page_sides_maximum\scratchwidth}
- {\doifcommonelse{\v!right,\v!left}\floatlocation
+ {\doifelsecommon{\v!right,\v!left}\floatlocation
\strc_floats_realign_floatbox_horizontal_one
\strc_floats_realign_floatbox_horizontal_two}%
\fi
@@ -1104,11 +1131,22 @@
\unexpanded\def\betweenfloatblanko % assumes that spaceafter is present
{\blank[\rootfloatparameter\c!spacebefore]} % or v!back,....
+% \unexpanded\def\doplacefloatbox % used elsewhere
+% {%\forgetall % NO
+% \whitespace
+% \blank[\rootfloatparameter\c!spacebefore]
+% \page_otr_command_flush_float_box
+% \blank[\rootfloatparameter\c!spaceafter]}
+
\unexpanded\def\doplacefloatbox % used elsewhere
{%\forgetall % NO
\whitespace
\blank[\rootfloatparameter\c!spacebefore]
+ \nointerlineskip
+ \flushnotes % new per 2014-05-29 : todo: move them up in the mvl
+ \nointerlineskip
\page_otr_command_flush_float_box
+ \nointerlineskip
\blank[\rootfloatparameter\c!spaceafter]}
% test case:
@@ -1126,7 +1164,7 @@
\global\floatheight \ht\floatbox % forget about the depth
\global\floattextwidth\dimexpr\hsize-\floatwidth-\rootfloatparameter\c!margin\relax
\edef\floatlocation{\floatlocationmethod}% to be sure .. why
- \doifinsetelse\v!tall\floatlocationmethod
+ \doifelseinset\v!tall\floatlocationmethod
{\floattextheight\dimexpr\pagegoal-\pagetotal-\bigskipamount\relax % ugly, this bigskip
\ifdim\floattextheight>\textheight
\floattextheight\textheight
@@ -1151,27 +1189,27 @@
{\floattextheight\ifdim\ht\floattext<\floatheight\floatheight\else\ht\floattext\fi}%
\setbox\floatbox\vbox to \floattextheight
{\hsize\floatwidth
- \doifinsetelse\v!both\floatlocation
- {\doifinsetelse\v!low\floatlocation
+ \doifelseinset\v!both\floatlocation
+ {\doifelseinset\v!low\floatlocation
{\vfill\box\floatbox}
- {\doifinsetelse\v!middle\floatlocation
+ {\doifelseinset\v!middle\floatlocation
{\vfill\box\floatbox\vfill}
{\box\floatbox\vfill}}}
{\box\floatbox\vfill}}%
\setbox\floattext\vbox to \floattextheight
{\hsize\floattextwidth
- \doifinsetelse\v!low\floatlocation
+ \doifelseinset\v!low\floatlocation
{\vfill
\box\floattext
\doifinset\c!offset\floatlocation{\whitespace\blank}}
- {\doifinsetelse\v!middle\floatlocation
+ {\doifelseinset\v!middle\floatlocation
{\vfill
\box\floattext
\vfill}
{\doifinset\v!offset\floatlocation{\whitespace\blank}%
\box\floattext
\vfill}}}%
- \doifinsetelse\v!right\floatlocation
+ \doifelseinset\v!right\floatlocation
{\setbox\floatbox\hbox to \hsize
{\box\floattext
\hfill
@@ -1190,13 +1228,13 @@
\blank[\rootfloatparameter\c!spaceafter]%
\strc_floats_end_text_group
\page_floats_report_total}
-
+
\def\borderedfloatbox
{\begingroup
\setupcurrentfloat[\c!location=\v!normal,\c!width=\v!fit,\c!height=\v!fit]%
\inheritedfloatframed{\box\floatbox}%
\endgroup}
-
+
% minwidth=fit,width=max : no overshoot, as wide as graphic
\def\strc_floats_align_content_indeed
@@ -1366,17 +1404,82 @@
\fi
\strc_floats_make_complete_caption}}
+% \def\strc_floats_prepare_stack_caption_auto
+% {\ifx\p_strc_floats_caption_align\empty \else
+% \doifnotinset\v!middle\p_strc_floats_caption_align{\let\captionovershoot\!!zeropoint}%
+% \fi
+% \edef\captionhsize{\the\wd\b_strc_floats_content}%
+% \ifdim\captionhsize>\hsize
+% % float is wider than \hsize
+% \setbox\b_strc_floats_caption\vbox
+% {\settrialtypesetting
+% \strc_floats_caption_set_align
+% \hsize\captionhsize
+% \notesenabledfalse
+% \strc_floats_make_complete_caption}%
+% \ifdim\ht\scratchbox>\lineheight % more lines
+% \setbox\b_strc_floats_caption\vbox
+% {\strc_floats_caption_set_align
+% \hsize\dimexpr\captionhsize-\captionovershoot\relax
+% \ifdim\hsize<\captionminwidth\relax
+% \hsize\captionhsize
+% \fi
+% \strc_floats_make_complete_caption}%
+% \else
+% \setbox\b_strc_floats_caption\vbox
+% {\strc_floats_caption_set_align
+% \hsize\captionhsize
+% \strc_floats_make_complete_caption}%
+% \fi
+% \else
+% % float is smaller of equal to \hsize
+% \ifdim\captionhsize<\captionminwidth\relax
+% \scratchdimen\captionminwidth % float smaller than min width
+% \edef\captionhsize{\the\scratchdimen}%
+% \fi
+% \setbox\scratchbox\vbox % test with overshoot
+% {\settrialtypesetting
+% \scratchdimen\dimexpr\captionhsize+\captionovershoot+3\emwidth\relax % 3em is an average word length
+% \ifdim\scratchdimen<\hsize
+% \hsize\scratchdimen
+% \fi
+% \notesenabledfalse
+% \strc_floats_make_complete_caption}%
+% \ifdim\ht\scratchbox>\lineheight
+% % at least an average word longer than a line
+% \setbox\b_strc_floats_caption\vbox
+% {\strc_floats_caption_set_align
+% \scratchdimen\dimexpr\captionhsize+\captionovershoot\relax
+% \ifdim\scratchdimen<\hsize
+% \hsize\scratchdimen
+% \fi
+% \strc_floats_make_complete_caption}%
+% \else\ifx\p_strc_floats_caption_align\empty
+% \setbox\b_strc_floats_caption\vbox
+% {\strc_floats_caption_set_align
+% \hsize\captionhsize
+% \raggedcenter % overloads
+% \strc_floats_make_complete_caption}%
+% \else
+% \setbox\b_strc_floats_caption\vbox
+% {\strc_floats_caption_set_align
+% \hsize\captionhsize
+% \strc_floats_make_complete_caption}%
+% \fi\fi
+% \fi}
+
\def\strc_floats_prepare_stack_caption_auto
{\ifx\p_strc_floats_caption_align\empty \else
\doifnotinset\v!middle\p_strc_floats_caption_align{\let\captionovershoot\!!zeropoint}%
\fi
\edef\captionhsize{\the\wd\b_strc_floats_content}%
- \ifdim\captionhsize>\hsize
+ \scratchwidth\floatcaptionparameter\c!maxwidth\relax
+ \ifdim\captionhsize>\scratchwidth
% float is wider than \hsize
\setbox\b_strc_floats_caption\vbox
{\settrialtypesetting
\strc_floats_caption_set_align
- \hsize\captionhsize
+ \hsize\scratchwidth
\notesenabledfalse
\strc_floats_make_complete_caption}%
\ifdim\ht\scratchbox>\lineheight % more lines
@@ -1384,13 +1487,13 @@
{\strc_floats_caption_set_align
\hsize\dimexpr\captionhsize-\captionovershoot\relax
\ifdim\hsize<\captionminwidth\relax
- \hsize\captionhsize
+ \hsize\scratchwidth
\fi
\strc_floats_make_complete_caption}%
\else
\setbox\b_strc_floats_caption\vbox
{\strc_floats_caption_set_align
- \hsize\captionhsize
+ \hsize\scratchwidth
\strc_floats_make_complete_caption}%
\fi
\else
@@ -1456,10 +1559,10 @@
\box\b_strc_floats_content}}
\def\strc_floats_build_box_next_outer
- {\doifrightpagefloatelse\strc_floats_build_box_next_right\strc_floats_build_box_next_left}
+ {\doifelserightpagefloat\strc_floats_build_box_next_right\strc_floats_build_box_next_left}
\def\strc_floats_build_box_next_inner
- {\doifrightpagefloatelse\strc_floats_build_box_next_left\strc_floats_build_box_next_right}
+ {\doifelserightpagefloat\strc_floats_build_box_next_left\strc_floats_build_box_next_right}
\def\strc_floats_build_box_next_right_hang#1%
{\ifconditional\c_strc_floats_par_float \hbox \else \expandafter \strc_floats_align_content \fi
@@ -1510,12 +1613,12 @@
{\strc_floats_build_box_next_left_margin_indeed \leftmargindistance }
\def\strc_floats_build_box_next_outer_margin
- {\doifrightpagefloatelse
+ {\doifelserightpagefloat
{\strc_floats_build_box_next_right_margin_indeed\rightmargindistance}
{\strc_floats_build_box_next_left_margin_indeed \rightmargindistance}}
\def\strc_floats_build_box_next_inner_margin
- {\doifrightpagefloatelse
+ {\doifelserightpagefloat
{\strc_floats_build_box_next_left_margin_indeed \leftmargindistance}
{\strc_floats_build_box_next_right_margin_indeed\leftmargindistance}}
@@ -1552,29 +1655,16 @@
\def\strc_floats_flush_left_caption_hang
{\hsmash{\llap{\box\b_strc_floats_caption\dotfskip{\floatcaptionparameter\c!distance}}}}
-% \def\strc_floats_flush_caption_hang % expanded can go
-% {\expanded{\doifinsetelse{\v!righthanging}{\floatcaptionparameter\c!location}}
-% {\strc_floats_flush_right_caption_hang}
-% {\expanded{\doifinsetelse{\v!lefthanging}{\floatcaptionparameter\c!location}}
-% {\strc_floats_flush_left_caption_hang}
-% {\expanded{\doifinsetelse{\v!hang}{\floatcaptionparameter\c!location}}
-% {\expanded{\doifinsetelse{\v!outer}{\floatcaptionparameter\c!location}}
-% {\doifrightpagefloatelse{\strc_floats_flush_right_caption_hang}{\strc_floats_flush_left_caption_hang}}
-% {\expanded{\doifinsetelse{\v!right}{\floatcaptiondirectives}}
-% {\strc_floats_flush_right_caption_hang}
-% {\strc_floats_flush_left_caption_hang}}}
-% {\box\b_strc_floats_caption}}}}
-
\def\strc_floats_flush_caption_hang % expanded can go
{\edef\p_strc_floats_caption_location{\floatcaptionparameter\c!location}%
- \doifinsetelse\v!righthanging\p_strc_floats_caption_location
+ \doifelseinset\v!righthanging\p_strc_floats_caption_location
{\strc_floats_flush_right_caption_hang}
- {\doifinsetelse\v!lefthanging\p_strc_floats_caption_location
+ {\doifelseinset\v!lefthanging\p_strc_floats_caption_location
{\strc_floats_flush_left_caption_hang}
- {\doifinsetelse\v!hang\p_strc_floats_caption_location
- {\doifinsetelse\v!outer\p_strc_floats_caption_location
- {\doifrightpagefloatelse{\strc_floats_flush_right_caption_hang}{\strc_floats_flush_left_caption_hang}}
- {\doifinsetelse\v!right\floatcaptiondirectives
+ {\doifelseinset\v!hang\p_strc_floats_caption_location
+ {\doifelseinset\v!outer\p_strc_floats_caption_location
+ {\doifelserightpagefloat{\strc_floats_flush_right_caption_hang}{\strc_floats_flush_left_caption_hang}}
+ {\doifelseinset\v!right\floatcaptiondirectives
{\strc_floats_flush_right_caption_hang}
{\strc_floats_flush_left_caption_hang}}}
{\box\b_strc_floats_caption}}}}
@@ -1637,7 +1727,7 @@
\fi}
\def\strc_floats_build_box_top_stack_normal
- {\doifinsetelse\v!overlay{\floatcaptionparameter\c!location}
+ {\doifelseinset\v!overlay{\floatcaptionparameter\c!location}
\strc_floats_build_box_top_stack_normal_overlay
\strc_floats_build_box_top_stack_normal_content}
@@ -1753,8 +1843,8 @@
\processallactionsinset[\floatcaptionparameter\c!location]
[ \v!left=>\let\next\strc_floats_relocate_caption_left,
\v!right=>\let\next\strc_floats_relocate_caption_right,
- \v!inner=>\doifrightpagefloatelse{\let\next\strc_floats_relocate_caption_left }{\let\next\strc_floats_relocate_caption_right},
- \v!outer=>\doifrightpagefloatelse{\let\next\strc_floats_relocate_caption_right}{\let\next\strc_floats_relocate_caption_left }]%
+ \v!inner=>\doifelserightpagefloat{\let\next\strc_floats_relocate_caption_left }{\let\next\strc_floats_relocate_caption_right},
+ \v!outer=>\doifelserightpagefloat{\let\next\strc_floats_relocate_caption_right}{\let\next\strc_floats_relocate_caption_left }]%
\next}
\installfloatboxbuilder \v!none \strc_floats_build_box_default
@@ -1987,7 +2077,7 @@
\definefloat
[\v!graphic]
[\v!graphics]
-
+
% float strategy, replaces some of the above macros
\installcorenamespace{floatmethods}
@@ -1999,7 +2089,7 @@
\let\forcedfloatmethod\empty % set by lua
\def\setfloatmethodvariables#1% \floatmethod \floatlabel \floatrow \floatcolumn
- {\ctxcommand{analysefloatmethod("#1")}}
+ {\clf_analysefloatmethod{#1}}
\def\somesomewherefloat[#1]%
{\page_floats_save_somewhere_float\s!somewhere{#1}}
diff --git a/Master/texmf-dist/tex/context/base/strc-ini.lua b/Master/texmf-dist/tex/context/base/strc-ini.lua
index a48679e6fdf..f736427bb44 100644
--- a/Master/texmf-dist/tex/context/base/strc-ini.lua
+++ b/Master/texmf-dist/tex/context/base/strc-ini.lua
@@ -73,7 +73,7 @@ structures.itemgroups = structures.itemgroups or { }
structures.specials = structures.specials or { }
structures.counters = structures.counters or { }
structures.tags = structures.tags or { }
-structures.formulas = structures.formulas or { }
+structures.formulas = structures.formulas or { } -- not used but reserved
structures.sets = structures.sets or { }
structures.marks = structures.marks or { }
structures.floats = structures.floats or { }
@@ -160,7 +160,7 @@ local function simplify(d,nodefault)
t[k] = simplify(v)
end
elseif tv == "string" then
- if v ~= "" and v ~= "default" then
+ if v ~= "" then
t[k] = v
end
elseif tv == "boolean" then
@@ -336,7 +336,8 @@ function sets.getall(namespace,block,name)
end
end
--- messy (will be another keyword, fixedconversion)
+-- messy (will be another keyword, fixedconversion) .. needs to be documented too
+-- maybe we should cache
local splitter = lpeg.splitat("::")
@@ -376,4 +377,8 @@ end
-- interface
-commands.definestructureset = sets.define
+interfaces.implement {
+ name = "definestructureset",
+ actions = sets.define,
+ arguments = { "string", "string", "string", "string", "boolean" }
+}
diff --git a/Master/texmf-dist/tex/context/base/strc-ini.mkvi b/Master/texmf-dist/tex/context/base/strc-ini.mkvi
index 8488d1dab86..ad83cbc58c2 100644
--- a/Master/texmf-dist/tex/context/base/strc-ini.mkvi
+++ b/Master/texmf-dist/tex/context/base/strc-ini.mkvi
@@ -70,12 +70,12 @@
\unexpanded\def\defineconversionset{\dotripleempty\strc_sets_define_conversion_set}
\unexpanded\def\defineprefixset {\dotripleempty\strc_sets_define_prefix_set}
-% Low level versions (no optional checking). The detokenize and escaping might go away.
+% Low level versions (no optional checking). The detokenize might go away.
-\unexpanded\def\strc_sets_define_reset_set [#name][#set][#default]{\ctxcommand{definestructureset("structure:resets", "#name","\luaescapestring{\detokenize{#set}}","\luaescapestring{\detokenize{#default}}",true)}}
-\unexpanded\def\strc_sets_define_separator_set [#name][#set][#default]{\ctxcommand{definestructureset("structure:separators", "#name","\luaescapestring{\detokenize{#set}}","\luaescapestring{\detokenize{#default}}")}}
-\unexpanded\def\strc_sets_define_conversion_set[#name][#set][#default]{\ctxcommand{definestructureset("structure:conversions","#name","\luaescapestring{\detokenize{#set}}","\luaescapestring{\detokenize{#default}}")}}
-\unexpanded\def\strc_sets_define_prefix_set [#name][#set][#default]{\ctxcommand{definestructureset("structure:prefixes", "#name","\luaescapestring{\detokenize{#set}}","\luaescapestring{\detokenize{#default}}")}}
+\unexpanded\def\strc_sets_define_reset_set [#name][#set][#default]{\clf_definestructureset{structure:resets} {#name}{\detokenize{#set}}{\detokenize{#default}}true\relax}
+\unexpanded\def\strc_sets_define_separator_set [#name][#set][#default]{\clf_definestructureset{structure:separators} {#name}{\detokenize{#set}}{\detokenize{#default}}false\relax}
+\unexpanded\def\strc_sets_define_conversion_set[#name][#set][#default]{\clf_definestructureset{structure:conversions}{#name}{\detokenize{#set}}{\detokenize{#default}}false\relax}
+\unexpanded\def\strc_sets_define_prefix_set [#name][#set][#default]{\clf_definestructureset{structure:prefixes} {#name}{\detokenize{#set}}{\detokenize{#default}}false\relax}
\let\definestructureresetset \defineresetset
\let\definestructureseparatorset \defineseparatorset
diff --git a/Master/texmf-dist/tex/context/base/strc-itm.lua b/Master/texmf-dist/tex/context/base/strc-itm.lua
index 4945c282fba..adec591c1c1 100644
--- a/Master/texmf-dist/tex/context/base/strc-itm.lua
+++ b/Master/texmf-dist/tex/context/base/strc-itm.lua
@@ -6,33 +6,58 @@ if not modules then modules = { } end modules ['strc-itm'] = {
license = "see context related readme files"
}
-local structures = structures
-local itemgroups = structures.itemgroups
-local jobpasses = job.passes
-
-local setvariable = jobpasses.save
-local getvariable = jobpasses.getfield
-
-function itemgroups.register(name,nofitems,maxwidth)
- setvariable("itemgroup", { nofitems, maxwidth })
+local structures = structures
+local itemgroups = structures.itemgroups
+local jobpasses = job.passes
+
+local implement = interfaces.implement
+
+local setvariable = jobpasses.save
+local getvariable = jobpasses.getfield
+
+local texsetcount = tex.setcount
+local texsetdimen = tex.setdimen
+
+local f_stamp = string.formatters["itemgroup:%s:%s"]
+local counts = table.setmetatableindex("number")
+
+-- We keep the counter at the Lua end so we can group the items within
+-- an itemgroup which in turn makes for less passes when one itemgroup
+-- entry is added or removed.
+
+local trialtypesetting = context.trialtypesetting
+
+local function analyzeitemgroup(name,level)
+ local n = counts[name]
+ if level == 1 then
+ n = n + 1
+ counts[name] = n
+ end
+ local stamp = f_stamp(name,n)
+ local n = getvariable(stamp,level,1,0)
+ local w = getvariable(stamp,level,2,0)
+ texsetcount("local","c_strc_itemgroups_max_items",n)
+ texsetdimen("local","d_strc_itemgroups_max_width",w)
end
-function itemgroups.nofitems(name,index)
- return getvariable("itemgroup", index, 1, 0)
+local function registeritemgroup(name,level,nofitems,maxwidth)
+ local n = counts[name]
+ if not trialtypesetting() then
+ -- no trialtypsetting
+ setvariable(f_stamp(name,n), { nofitems, maxwidth }, level)
+ elseif level == 1 then
+ counts[name] = n - 1
+ end
end
-function itemgroups.maxwidth(name,index)
- return getvariable("itemgroup", index, 2, 0)
-end
-
--- interface (might become counter/dimension)
-
-commands.registeritemgroup = itemgroups.register
-
-function commands.nofitems(name,index)
- context(getvariable("itemgroup", index, 1, 0))
-end
+implement {
+ name = "analyzeitemgroup",
+ actions = analyzeitemgroup,
+ arguments = { "string", "integer" }
+}
-function commands.maxitemwidth(name,index)
- context(getvariable("itemgroup", index, 2, 0))
-end
+implement {
+ name = "registeritemgroup",
+ actions = registeritemgroup,
+ arguments = { "string", "integer", "integer", "dimen" }
+}
diff --git a/Master/texmf-dist/tex/context/base/strc-itm.mkvi b/Master/texmf-dist/tex/context/base/strc-itm.mkvi
index 098b863b95a..86fc9d9fd28 100644
--- a/Master/texmf-dist/tex/context/base/strc-itm.mkvi
+++ b/Master/texmf-dist/tex/context/base/strc-itm.mkvi
@@ -15,6 +15,9 @@
\registerctxluafile{strc-itm}{1.001}
+%D As we analyze/register widths and such we could as well push and pop the
+%D numbers at the \LUA\ end (which saves a few calls).
+
%D Cleaning up this module happened around the time when Kate Bush came up
%D with the nicest numbered list of words: 50 Words For Snow. It's therefore
%D no surprise that I had that cd running several times when updating this
@@ -203,7 +206,6 @@
\newdimen \d_strc_itemgroups_max_width % multipass
\newcount \c_strc_itemgroups_max_items % multipass
-\newcount \c_strc_itemgroups_n_of_lists
\newcount \c_strc_itemgroups_n_of_items
\newcount \c_strc_itemgroups_nesting
\newcount \c_strc_itemgroups_column_depth
@@ -227,13 +229,10 @@
\let \currentitemgroupsegments \empty
\def\strc_itemgroups_register_status
- {\iftrialtypesetting \else
- \ctxcommand{registeritemgroup("\currentitemgroup",\number\c_strc_itemgroups_n_of_items,"\itemgroupparameter\c!maxwidth")}%
- \fi}
+ {\clf_registeritemgroup{\currentparentitemgroup}\c_strc_itemgroups_nesting\c_strc_itemgroups_n_of_items\dimexpr\itemgroupparameter\c!maxwidth\relax}
\def\strc_itemgroups_check_n_of_items % we could do this at the lua end and save a call (i.e. will be dimen and counter)
- {\c_strc_itemgroups_max_items\ctxcommand{nofitems("\currentitemgroup",\number\c_strc_itemgroups_n_of_lists)}\relax
- \d_strc_itemgroups_max_width\ctxcommand{maxitemwidth("\currentitemgroup",\number\c_strc_itemgroups_n_of_lists)}\scaledpoint
+ {\clf_analyzeitemgroup{\currentparentitemgroup}\c_strc_itemgroups_nesting\relax
\edef\currentnofitems{\the\c_strc_itemgroups_max_items}}
% todo: \dodosetreference -> \strc_counters_register_component (to be checked)
@@ -249,47 +248,51 @@
\fi \fi}
\def\strc_itemgroups_insert_reference_indeed % maybe we need a 'frozen counter' numberdata blob / quick hack .. .mive this to strc-ref
- {%\setnextinternalreference
+ {% needs testing, gave problems:
+ \setnextinternalreference
% no need to collect nodes in \b_strc_destination_nodes here ... maybe at some point
\strc_references_start_destination_nodes
- % this is somewhat over the top ... we should use the counter's reference
- \ctxcommand{setreferenceattribute("\s!full", "\referenceprefix","\currentitemreference",
- {
- metadata = {
- kind = "item",% ?
- catcodes = \the\catcodetable,
- xmlroot = \ifx\currentreferencecoding\s!xml "\xmldocument" \else nil \fi, % only useful when text
- },
- references = {
- % internal = \nextinternalreference, % no: this spoils references
- block = "\currentsectionblock",
- section = structures.sections.currentid(),
- },
- prefixdata = structures.helpers.simplify {
- prefix = "\namedcounterparameter\v_strc_itemgroups_counter\c!prefix",
- separatorset = "\namedcounterparameter\v_strc_itemgroups_counter\c!prefixseparatorset",
- conversion = \!!bs\namedcounterparameter\v_strc_itemgroups_counter\c!prefixconversion\!!es,
- conversionset = "\namedcounterparameter\v_strc_itemgroups_counter\c!prefixconversionset",
- set = "\namedcounterparameter\v_strc_itemgroups_counter\c!prefixset",
- segments = "\namedcounterparameter\v_strc_itemgroups_counter\c!prefixsegments",
- % segments = "\askedprefixsegments",
- connector = \!!bs\namedcounterparameter\v_strc_itemgroups_counter\c!prefixconnector\!!es,
- },
- numberdata = structures.helpers.simplify {
- numbers = structures.counters.compact("\v_strc_itemgroups_counter",nil,true),
- separatorset = "\namedcounterparameter\v_strc_itemgroups_counter\c!numberseparatorset",
- % conversion = "\namedcounterparameter\v_strc_itemgroups_counter\c!numberconversion",
- % conversion = "\currentitemgroupconversionset",
- % conversionset = "\namedcounterparameter\v_strc_itemgroups_counter\c!numberconversionset",
- % todo: fixedconversion = "\currentitemgroupconversionset", % temp hack:
- conversionset = "fixed::\currentitemgroupconversionset",
- %
- % for the moment no stopper, we need to make references configurable first
- % stopper = \!!bs\namedcounterparameter\v_strc_itemgroups_counter\c!numberstopper\!!es,
- segments = "\namedcounterparameter\v_strc_itemgroups_counter\c!numbersegments",
- },
- })
+ % this is somewhat over the top ... we should use the counter's reference
+ \clf_setreferenceattribute
+ {%
+ metadata {%
+ kind {item}% was item, why?
+ \ifx\currentreferencecoding\s!xml
+ xmlroot {\xmldocument}% only useful when text
+ \fi
+ catcodes \catcodetable
+ }%
+ references {%
+ internal \nextinternalreference % no: this spoils references
+ % block {\currentsectionblock}%
+ view {\interactionparameter\c!focus}%
+ prefix {\referenceprefix}%
+ reference {\currentitemreference}%
+ }%
+ prefixdata {%
+ prefix {\namedcounterparameter\v_strc_itemgroups_counter\c!prefix}%
+ separatorset {\namedcounterparameter\v_strc_itemgroups_counter\c!prefixseparatorset}%
+ conversion {\namedcounterparameter\v_strc_itemgroups_counter\c!prefixconversion}%
+ conversionset {\namedcounterparameter\v_strc_itemgroups_counter\c!prefixconversionset}%
+ set {\namedcounterparameter\v_strc_itemgroups_counter\c!prefixset}%
+ segments {\namedcounterparameter\v_strc_itemgroups_counter\c!prefixsegments}%
+ % segments {\askedprefixsegments}%
+ connector {\namedcounterparameter\v_strc_itemgroups_counter\c!prefixconnector}%
+ }%
+ numberdata {%
+ numbers {\v_strc_itemgroups_counter}%
+ separatorset {\namedcounterparameter\v_strc_itemgroups_counter\c!numberseparatorset}%
+ % conversion {\namedcounterparameter\v_strc_itemgroups_counter\c!numberconversion}%
+ % conversionset {\namedcounterparameter\v_strc_itemgroups_counter\c!numberconversionset}%
+ % fixedconversion {\currentitemgroupconversionset}%
+ conversionset {fixed::\currentitemgroupconversionset}% temp hack
+ %
+ % for the moment no stopper, we need to make references configurable first
+ % stopper {\namedcounterparameter\v_strc_itemgroups_counter\c!numberstopper}%
+ segments {\namedcounterparameter\v_strc_itemgroups_counter\c!numbersegments}%
+ }%
}%
+ \relax
\strc_references_stop_destination_nodes
\xdef\currentdestinationattribute{\number\lastdestinationattribute}%
% will become an option:
@@ -467,7 +470,7 @@
\let\strc_itemgroups_margin_symbol\empty
\let\strc_itemgroups_extra_symbol\empty
%
- \global\letitemgroupparameter\c!maxwidth\!!zerocount
+ \global\letitemgroupparameter\c!maxwidth\!!zeropoint
}
\setvalue{\??itemgroupfirst\v!intro }{\settrue\c_strc_itemgroups_intro }
@@ -482,10 +485,11 @@
\csname\??itemgroupfirst#option\endcsname
\fi}
-\ifdefined\dotagsetitemgroup \else \let\dotagsetitemgroup\relax \fi
+\ifdefined\dotagsetitemgroup \else \let\dotagsetitemgroup\relax \fi
+\ifdefined\dotagsetitem \else \let\dotagsetitem \gobbleoneargument \fi
\def\strc_itemgroups_tag_start_group
- {\dostarttagged\t!itemgroup\currentitemgroup
+ {\dostarttaggedchained\t!itemgroup\currentparentitemgroup\??itemgroup
\dotagsetitemgroup}
\def\strc_itemgroups_tag_stop_group
@@ -576,7 +580,7 @@
% can be made a bit faster
\def\strc_itemgroups_setup_each#category#whatever%
- {\doifassignmentelse{#whatever}
+ {\doifelseassignment{#whatever}
{\strc_itemgroups_normal_setup[#category][#whatever]}
{\strc_itemgroups_normal_setup[#category][\c!option={#whatever}]}}
@@ -587,7 +591,7 @@
{\strc_itemgroups_normal_setup[#category:#level][\c!option={#whatever}]}
\def\strc_itemgroups_setup_list#subcategories#category#whatever%
- {\doifassignmentelse{#whatever}
+ {\doifelseassignment{#whatever}
{\processcommalist[#subcategories]{\strc_itemgroups_setup_list_level_a{#category}{#whatever}}}
{\processcommalist[#subcategories]{\strc_itemgroups_setup_list_level_b{#category}{#whatever}}}}
@@ -639,9 +643,9 @@
\def\strc_itemgroups_set_symbol#symbol%
{\edef\strc_itemgroups_tmp_symbol{#symbol}%
\ifx\strc_itemgroups_tmp_symbol\empty \else
- \doifsymboldefinedelse\strc_itemgroups_tmp_symbol
+ \doifelsesymboldefined\strc_itemgroups_tmp_symbol
\strc_itemgroups_set_symbol_symbol
- {\doifconversiondefinedelse\strc_itemgroups_tmp_symbol
+ {\doifelseconversiondefined\strc_itemgroups_tmp_symbol
\strc_itemgroups_set_symbol_conversion
\donothing}%
\fi}
@@ -706,7 +710,7 @@
\ifthirdargument
\strc_itemgroups_start_indeed[#options][#settings]%
\else\ifsecondargument
- \doifassignmentelse{#options}
+ \doifelseassignment{#options}
{\strc_itemgroups_start_indeed[][#options]}
{\strc_itemgroups_start_indeed[#options][]}%
\else
@@ -745,7 +749,6 @@
\iftrialtypesetting
\strc_counters_save\v_strc_itemgroups_counter
\fi
- \global\advance\c_strc_itemgroups_n_of_lists\plusone
\c_strc_itemgroups_n_of_items\zerocount
\strc_itemgroups_check_n_of_items
\ifx\itemgroupoptions\empty
@@ -811,7 +814,7 @@
\ifinsidecolumns\else\ifcase\c_strc_itemgroups_column_depth
\global\c_strc_itemgroups_column_depth\c_strc_itemgroups_nesting % global ?
\strc_itemgroups_before_command
- \strc_itemgroups_tag_start_group
+ %\strc_itemgroups_tag_start_group
\strc_itemgroups_start_columns
\fi\fi
\fi
@@ -941,8 +944,7 @@
\fi\fi
% new test, needed in sidefloats (surfaced in volker's proceedings)
\iftrialtypesetting
- \strc_counters_restore\v_strc_itemgroups_counter
- \global\advance\c_strc_itemgroups_n_of_lists\minusone
+ \strc_counters_restore\v_strc_itemgroups_counter % could happen in LUA
\fi
\global\advance\c_strc_itemgroups_nesting\minusone
\xdef\currentitemlevel{\number\c_strc_itemgroups_nesting}%
@@ -965,7 +967,7 @@
{\setfalse\c_strc_itemgroups_first
% \begingroup % (3)
\ifcase\c_strc_itemgroups_nesting
- % 0
+ % 0
\or
\strc_itemgroups_start_item_first_one % 1
\else
@@ -1039,15 +1041,11 @@
\strc_itemgroups_start_item_next
\fi
\ifconditional\c_strc_itemgroups_concat
- % \vskip-\lastskip % we cannot use a \dimexpr here because
- % \vskip-\lineheight % then we loose the stretch and shrink
- % \nobreak
- %
- \blank[\v!overlay]% new per 2014-03-27
- %
+ \spac_overlay_lines % see spac-ver.mkvi ... a typical potential problem
\setfalse\c_strc_itemgroups_concat
\fi
\dostarttagged\t!item\empty
+ % \dotagsetitem\empty
\dostarttagged\t!itemtag\empty
\strc_itemgroups_insert_item
\dostoptagged
@@ -1088,17 +1086,24 @@
\fi
\fi
\strc_itemgroups_start_item[#reference]%
- \groupedcommand\strc_itemgroups_start_head_indeed\strc_itemgroups_stop_head_indeed}
+ \pickupgroupedcommand
+ \strc_itemgroups_start_head_indeed
+ \strc_itemgroups_stop_head_indeed
+ \strc_itemgroups_head_body_indeed}
\unexpanded\def\stopitemgrouphead
- {\stopitemgroupitem}
+ {\dostoptagged
+ \stopitemgroupitem}
\unexpanded\def\strc_itemgroups_start_head_indeed
{\settrue\c_strc_itemgroups_head
+ \dotagsetitem\s!head% % weird place
+ \dostarttagged\t!itemhead\empty
\useitemgroupstyleandcolor\c!headstyle\c!headcolor\ignorespaces}
\unexpanded\def\strc_itemgroups_stop_head_indeed
{\removeunwantedspaces
+ \dostoptagged
\ifconditional\c_strc_itemgroups_text
\space
\ignorespaces
@@ -1107,7 +1112,10 @@
\fi
\strc_itemgroups_insert_breakno
\ifconditional\c_strc_itemgroups_pack\else\strc_itemgroups_after_head_command\fi
- \strc_itemgroups_insert_breakno
+ \strc_itemgroups_insert_breakno}
+
+\unexpanded\def\strc_itemgroups_head_body_indeed
+ {\dostarttagged\t!itembody\empty
\noindentation}
% Simple commands.
@@ -1125,30 +1133,37 @@
\unexpanded\def\strc_itemgroups_start_symbol#text%
{\def\strc_itemgroups_extra_symbol{#text}%
\settrue\c_strc_itemgroups_symbol
- \startitemgroupitem}
+ \startitemgroupitem
+ \dotagsetitem\s!symbol}
\unexpanded\def\strc_itemgroups_start_dummy
{\strc_itemgroups_start_symbol\strut\strut} % two ?
\unexpanded\def\strc_itemgroups_start_subitem
{\settrue\c_strc_itemgroups_sub
- \startitemgroupitem}
+ \startitemgroupitem
+ \dotagsetitem\s!sub}
\unexpanded\def\strc_itemgroups_start_edge#text%
{\strc_itemgroups_start_symbol
{\strc_itemgroups_calculate_list_width\c_strc_itemgroups_nesting
+ \dostarttagged\t!ignore\empty % for the moment, maybe an attribute
\hbox to \d_strc_itemgroups_list_width
- {#text\hskip\itemgroupparameter\c!distance}}}
+ {#text\hskip\itemgroupparameter\c!distance}%
+ \dostoptagged}}
\unexpanded\def\strc_itemgroups_start_margin#text%
{\def\strc_itemgroups_margin_symbol % brrr
- {\llap
+ {\dostarttagged\t!ignore\empty % for the moment, maybe an attribute
+ \llap
{\begingroup
\useitemgroupstyleandcolor\c!marstyle\c!marcolor
#text% keep em/ex local
\endgroup
- \hskip\dimexpr\leftskip+\leftmargindistance\relax}}%
- \startitemgroupitem}
+ \hskip\dimexpr\leftskip+\leftmargindistance\relax}%
+ \dostoptagged}%
+ \startitemgroupitem
+ \dotagsetitem\s!margin}
\unexpanded\def\strc_itemgroups_start_text#text%
{\def\strc_itemgroups_extra_symbol{#text}%
@@ -1222,7 +1237,9 @@
{\dontcomplain
\hbox to \d_strc_itemgroups_list_width
{\ifconditional\c_strc_itemgroups_sub
+ \dostarttagged\t!ignore\empty
\llap{+\enspace}%
+ \dostoptagged
\fi
\strc_itemgroups_left_sym_filler
\box\b_strc_itemgroups % can already have a forced widt, only factor handled here
@@ -1232,7 +1249,9 @@
\def\strc_itemgroups_handle_lapped_item_negative
{\llap
{\ifconditional\c_strc_itemgroups_sub
+ \dostarttagged\t!ignore\empty
\llap{+\enspace}%
+ \dostoptagged
\fi
\box\b_strc_itemgroups
\hskip\leftmargindistance}}
@@ -1240,7 +1259,9 @@
\def\strc_itemgroups_handle_groups_text_item
{\hbox
{\ifconditional\c_strc_itemgroups_sub
+ \dostarttagged\t!ignore\empty
+\enspace
+ \dostoptagged
\fi
\box\b_strc_itemgroups
\hskip\interwordspace}%
@@ -1249,7 +1270,9 @@
\def\strc_itemgroups_handle_groups_inline_item
{\hbox to \d_strc_itemgroups_list_width
{\ifconditional\c_strc_itemgroups_sub
+ \dostarttagged\t!ignore\empty
\llap{+\enspace}%
+ \dostoptagged
\fi
\box\b_strc_itemgroups
\hss}} % was: \hfill
@@ -1285,8 +1308,8 @@
\setfalse\c_strc_itemgroups_symbol}
\def\strc_itemgroups_make_fitting_box
- {\ifdim\wd\b_strc_itemgroups>\itemgroupparameter\c!maxwidth\scaledpoint\relax % brr, sp
- \normalexpanded{\global\setitemgroupparameter{\c!maxwidth}{\number\wd\b_strc_itemgroups}}%
+ {\ifdim\wd\b_strc_itemgroups>\itemgroupparameter\c!maxwidth\relax
+ \normalexpanded{\global\setitemgroupparameter{\c!maxwidth}{\the\wd\b_strc_itemgroups}}%
\fi
\ifdim\d_strc_itemgroups_max_width>\zeropoint
\setbox\b_strc_itemgroups\simplealignedbox
@@ -1539,7 +1562,7 @@
{\strc_itemgroups_item_alone}
\def\strc_itemgroups_item_alone[#category]#text\par
- {\doifsomethingelse{#category}{\startitemgroup[#category]}{\startitemgroup[\v!itemize]}%
+ {\doifelsesomething{#category}{\startitemgroup[#category]}{\startitemgroup[\v!itemize]}%
\startitem#text\stopitem
\stopitemgroup}
@@ -1547,7 +1570,7 @@
{\strc_itemgroups_head_alone}
\def\strc_itemgroups_head_alone[#category]#head\par#body\par
- {\doifsomethingelse{#category}{\startitemgroup[#category]}{\startitemgroup[\v!itemize]}%
+ {\doifelsesomething{#category}{\startitemgroup[#category]}{\startitemgroup[\v!itemize]}%
\starthead{#head}#body\stophead
\stopitemgroup}
diff --git a/Master/texmf-dist/tex/context/base/strc-lab.mkiv b/Master/texmf-dist/tex/context/base/strc-lab.mkiv
index 3e661712632..ac49941aaee 100644
--- a/Master/texmf-dist/tex/context/base/strc-lab.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-lab.mkiv
@@ -101,7 +101,7 @@
\ifx\p_counter\empty %
\let\p_counter\currentlabel
\fi
- \doifcounterelse\p_counter\donothing{\strc_labels_define_counter\p_counter}%
+ \doifelsecounter\p_counter\donothing{\strc_labels_define_counter\p_counter}%
\letlabelparameter\s!counter\p_counter
\to \everydefinelabel
@@ -113,6 +113,7 @@
\setvalue{\??constructioninitializer\v!label}%
{\let\currentlabel \currentconstruction
\let\constructionparameter \labelparameter
+ \let\constructionnamespace \??label
\let\detokenizedconstructionparameter\detokenizedlabelparameter
\let\letconstructionparameter \letlabelparameter
\let\useconstructionstyleandcolor \uselabelstyleandcolor
diff --git a/Master/texmf-dist/tex/context/base/strc-lev.lua b/Master/texmf-dist/tex/context/base/strc-lev.lua
index 947889e1e1c..d7ffd6af434 100644
--- a/Master/texmf-dist/tex/context/base/strc-lev.lua
+++ b/Master/texmf-dist/tex/context/base/strc-lev.lua
@@ -8,26 +8,30 @@ if not modules then modules = { } end modules ['strc-lev'] = {
local insert, remove = table.insert, table.remove
-local context = context
-local commands = commands
+local context = context
+local interfaces = interfaces
-local sections = structures.sections
-local default = interfaces.variables.default
+local sections = structures.sections
+local implement = interfaces.implement
-sections.levels = sections.levels or { }
+local v_default = interfaces.variables.default
-local level, levels, categories = 0, sections.levels, { }
+sections.levels = sections.levels or { }
-storage.register("structures/sections/levels", levels, "structures.sections.levels")
+local level = 0
+local levels = sections.levels
+local categories = { }
local f_two_colon = string.formatters["%s:%s"]
-function commands.definesectionlevels(category,list)
+storage.register("structures/sections/levels", levels, "structures.sections.levels")
+
+local function definesectionlevels(category,list)
levels[category] = utilities.parsers.settings_to_array(list)
end
-function commands.startsectionlevel(category)
- category = category ~= "" and category or default
+local function startsectionlevel(category)
+ category = category ~= "" and category or v_default
level = level + 1
local lc = levels[category]
if not lc or level > #lc then
@@ -38,7 +42,7 @@ function commands.startsectionlevel(category)
insert(categories,category)
end
-function commands.stopsectionlevel()
+local function stopsectionlevel()
local category = remove(categories)
if category then
local lc = levels[category]
@@ -52,3 +56,20 @@ function commands.stopsectionlevel()
-- error
end
end
+
+implement {
+ name = "definesectionlevels",
+ actions = definesectionlevels,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "startsectionlevel",
+ actions = startsectionlevel,
+ arguments = "string"
+}
+
+implement {
+ name = "stopsectionlevel",
+ actions = stopsectionlevel,
+}
diff --git a/Master/texmf-dist/tex/context/base/strc-lev.mkvi b/Master/texmf-dist/tex/context/base/strc-lev.mkvi
index b3ec2a2d5a4..dae3f28e30e 100644
--- a/Master/texmf-dist/tex/context/base/strc-lev.mkvi
+++ b/Master/texmf-dist/tex/context/base/strc-lev.mkvi
@@ -26,17 +26,17 @@
\unexpanded\def\definesectionlevels{\dodoubleargument\strc_levels_define}
\unexpanded\def\startsectionlevel {\dosingleempty \strc_levels_start }
-\unexpanded\def\strc_levels_define[#category][#list]{\ctxcommand{definesectionlevels("#category","#list")}}
-\unexpanded\def\strc_levels_start [#category]{\ctxcommand{startsectionlevel("#category")}}
-\unexpanded\def\stopsectionlevel {\ctxcommand{stopsectionlevel()}}
+\unexpanded\def\strc_levels_define[#category][#list]{\clf_definesectionlevels{#category}{#list}}
+\unexpanded\def\strc_levels_start [#category]{\clf_startsectionlevel{#category}}
+\unexpanded\def\stopsectionlevel {\clf_stopsectionlevel}
\unexpanded\def\nostarthead{\dotripleargument\strc_levels_start_nop} % used at the lua end
\unexpanded\def\nostophead {\dosingleargument\strc_levels_stop_nop } % used at the lua end
\unexpanded\def\strc_levels_start[#category]%
- {\doifassignmentelse{#category}
- {\ctxcommand{startsectionlevel("\v!default")}[#category]}
- {\ctxcommand{startsectionlevel("#category")}}}
+ {\doifelseassignment{#category}
+ {\clf_startsectionlevel{\v!default}[#category]}
+ {\clf_startsectionlevel{#category}}}
\unexpanded\def\strc_levels_start_nop[#category][#settings][#userdata]%
{\blank
diff --git a/Master/texmf-dist/tex/context/base/strc-lnt.mkvi b/Master/texmf-dist/tex/context/base/strc-lnt.mkvi
index f84521002e1..ee7d5dd8854 100644
--- a/Master/texmf-dist/tex/context/base/strc-lnt.mkvi
+++ b/Master/texmf-dist/tex/context/base/strc-lnt.mkvi
@@ -92,10 +92,10 @@
\def\page_lines_in_to {\in[lr:e:\currentlinenotereference]}
\unexpanded\def\strc_linenotes_range_normal#1% order
- {\doifreferencefoundelse{lr:b:\currentlinenotereference}\settrue\setfalse\c_page_lines_current_from
+ {\doifelsereferencefound{lr:b:\currentlinenotereference}\settrue\setfalse\c_page_lines_current_from
\ifconditional\c_page_lines_current_from
\xdef\m_page_lines_current_from{\currentreferencelinenumber}%
- \doifreferencefoundelse{lr:e:\currentlinenotereference}\settrue\setfalse\c_page_lines_current_to
+ \doifelsereferencefound{lr:e:\currentlinenotereference}\settrue\setfalse\c_page_lines_current_to
\ifconditional\c_page_lines_current_to
\xdef\m_page_lines_current_to{\currentreferencelinenumber}%
\page_lines_in_from
@@ -111,10 +111,10 @@
\fi}
\unexpanded\def\strc_linenotes_range_sparse#1% order
- {\doifreferencefoundelse{lr:b:\currentlinenotereference}\settrue\setfalse\c_page_lines_current_from
+ {\doifelsereferencefound{lr:b:\currentlinenotereference}\settrue\setfalse\c_page_lines_current_from
\ifconditional\c_page_lines_current_from
\xdef\m_page_lines_current_from{\currentreferencelinenumber}%
- \doifreferencefoundelse{lr:e:\currentlinenotereference}\settrue\setfalse\c_page_lines_current_to
+ \doifelsereferencefound{lr:e:\currentlinenotereference}\settrue\setfalse\c_page_lines_current_to
\ifconditional\c_page_lines_current_to
\xdef\m_page_lines_current_to{\currentreferencelinenumber}%
\ifx\m_page_lines_previous_from\m_page_lines_current_from
diff --git a/Master/texmf-dist/tex/context/base/strc-lst.lua b/Master/texmf-dist/tex/context/base/strc-lst.lua
index 16160e2735f..4c9a7217e7e 100644
--- a/Master/texmf-dist/tex/context/base/strc-lst.lua
+++ b/Master/texmf-dist/tex/context/base/strc-lst.lua
@@ -15,12 +15,16 @@ if not modules then modules = { } end modules ['strc-lst'] = {
--
-- move more to commands
-local format, gmatch, gsub = string.format, string.gmatch, string.gsub
local tonumber, type = tonumber, type
-local concat, insert, remove = table.concat, table.insert, table.remove
+local concat, insert, remove, sort = table.concat, table.insert, table.remove, table.sort
local lpegmatch = lpeg.match
-local simple_hash_to_string, settings_to_hash = utilities.parsers.simple_hash_to_string, utilities.parsers.settings_to_hash
-local allocate, checked = utilities.storage.allocate, utilities.storage.checked
+
+local setmetatableindex = table.setmetatableindex
+local sortedkeys = table.sortedkeys
+
+local settings_to_set = utilities.parsers.settings_to_set
+local allocate = utilities.storage.allocate
+local checked = utilities.storage.checked
local trace_lists = false trackers.register("structures.lists", function(v) trace_lists = v end)
@@ -28,22 +32,23 @@ local report_lists = logs.reporter("structure","lists")
local context = context
local commands = commands
-
-local texgetcount = tex.getcount
+local implement = interfaces.implement
local structures = structures
local lists = structures.lists
local sections = structures.sections
local helpers = structures.helpers
local documents = structures.documents
-local pages = structures.pages
local tags = structures.tags
+local counters = structures.counters
local references = structures.references
local collected = allocate()
local tobesaved = allocate()
local cached = allocate()
local pushed = allocate()
+local kinds = allocate()
+local names = allocate()
lists.collected = collected
lists.tobesaved = tobesaved
@@ -53,19 +58,46 @@ lists.enhancers = lists.enhancers or { }
lists.ordered = allocate(lists.ordered or { }) -- to be checked
lists.cached = cached
lists.pushed = pushed
+lists.kinds = kinds
+lists.names = names
+
+local sorters = sorters
+local sortstripper = sorters.strip
+local sortsplitter = sorters.splitters.utf
+local sortcomparer = sorters.comparers.basic
local sectionblocks = allocate()
lists.sectionblocks = sectionblocks
references.specials = references.specials or { }
-local variables = interfaces.variables
local matchingtilldepth = sections.matchingtilldepth
local numberatdepth = sections.numberatdepth
+local getsectionlevel = sections.getlevel
+local typesetnumber = sections.typesetnumber
+local autosectiondepth = sections.autodepth
--- -- -- -- -- --
+local variables = interfaces.variables
-local function zerostrippedconcat(t,separator) -- for the moment not public
+local v_all = variables.all
+local v_reference = variables.reference
+local v_title = variables.title
+local v_number = variables.reference
+local v_command = variables.command
+local v_text = variables.text
+local v_current = variables.current
+local v_previous = variables.previous
+local v_next = variables.next
+local v_intro = variables.intro
+local v_here = variables.here
+local v_component = variables.component
+local v_reference = variables.reference
+local v_local = variables["local"]
+local v_default = variables.default
+
+-- for the moment not public --
+
+local function zerostrippedconcat(t,separator)
local f, l = 1, #t
for i=f,l do
if t[i] == 0 then
@@ -85,11 +117,11 @@ end
local function initializer()
-- create a cross reference between internal references
-- and list entries
- local collected = lists.collected
- local internals = checked(references.internals)
- local ordered = lists.ordered
+ local collected = lists.collected
+ local internals = checked(references.internals)
+ local ordered = lists.ordered
local usedinternals = references.usedinternals
- local blockdone = { }
+ local blockdone = { }
for i=1,#collected do
local c = collected[i]
local m = c.metadata
@@ -109,7 +141,8 @@ local function initializer()
end
end
-- access by order in list
- local kind, name = m.kind, m.name
+ local kind = m.kind
+ local name = m.name
if kind and name then
local ok = ordered[kind]
if ok then
@@ -122,6 +155,12 @@ local function initializer()
else
ordered[kind] = { [name] = { c } }
end
+ kinds[kind] = true
+ names[name] = true
+ elseif kind then
+ kinds[kind] = true
+ elseif name then
+ names[name] = true
end
end
if r then
@@ -147,7 +186,7 @@ end
job.register('structures.lists.collected', tobesaved, initializer, finalizer)
-local groupindices = table.setmetatableindex("table")
+local groupindices = setmetatableindex("table")
function lists.groupindex(name,group)
local groupindex = groupindices[name]
@@ -157,14 +196,23 @@ end
-- we could use t (as hash key) in order to check for dup entries
function lists.addto(t) -- maybe more more here (saves parsing at the tex end)
- local m = t.metadata
- local u = t.userdata
- if u and type(u) == "string" then
- t.userdata = helpers.touserdata(u)
- end
+ local metadata = t.metadata
+ local userdata = t.userdata
local numberdata = t.numberdata
+ if userdata and type(userdata) == "string" then
+ t.userdata = helpers.touserdata(userdata)
+ end
+ if not metadata.level then
+ metadata.level = structures.sections.currentlevel() -- this is not used so it will go away
+ end
+ if numberdata then
+ local numbers = numberdata.numbers
+ if type(numbers) == "string" then
+ numberdata.numbers = counters.compact(numbers,nil,true)
+ end
+ end
local group = numberdata and numberdata.group
- local name = m.name
+ local name = metadata.name
if not group then
-- forget about it
elseif group == "" then
@@ -180,6 +228,9 @@ function lists.addto(t) -- maybe more more here (saves parsing at the tex end)
setcomponent(t) -- can be inlined
end
local r = t.references
+ if r and not r.section then
+ r.section = structures.sections.currentid()
+ end
local i = r and r.internal or 0 -- brrr
local p = pushed[i]
if not p then
@@ -221,6 +272,11 @@ end
local enhanced = { }
+local synchronizepage = function(r) -- bah ... will move
+ synchronizepage = references.synchronizepage
+ return synchronizepage(r)
+end
+
function lists.enhance(n)
local l = cached[n]
if not l then
@@ -237,7 +293,7 @@ function lists.enhance(n)
-- save in the right order (happens at shipout)
lists.tobesaved[#lists.tobesaved+1] = l
-- default enhancer (cross referencing)
- references.realpage = texgetcount("realpageno")
+ synchronizepage(references)
-- tags
local kind = metadata.kind
local name = metadata.name
@@ -267,51 +323,88 @@ end
local nesting = { }
function lists.pushnesting(i)
- local parent = lists.result[i]
- local name = parent.metadata.name
+ local parent = lists.result[i]
+ local name = parent.metadata.name
local numberdata = parent and parent.numberdata
- local numbers = numberdata and numberdata.numbers
- local number = numbers and numbers[sections.getlevel(name)] or 0
- insert(nesting, { number = number, name = name, result = lists.result, parent = parent })
+ local numbers = numberdata and numberdata.numbers
+ local number = numbers and numbers[getsectionlevel(name)] or 0
+ insert(nesting, {
+ number = number,
+ name = name,
+ result = lists.result,
+ parent = parent
+ })
end
function lists.popnesting()
local old = remove(nesting)
- lists.result = old.result
+ if old then
+ lists.result = old.result
+ else
+ report_lists("nesting error")
+ end
end
--- will be split
-
-- Historically we had blocks but in the mkiv approach that could as well be a level
-- which would simplify things a bit.
-local splitter = lpeg.splitat(":")
+local splitter = lpeg.splitat(":") -- maybe also :: or have a block parameter
--- this will become filtercollected(specification) and then we'll also have sectionblock as key
-
-local sorters = {
- [variables.command] = function(a,b)
+local listsorters = {
+ [v_command] = function(a,b)
if a.metadata.kind == "command" or b.metadata.kind == "command" then
return a.references.internal < b.references.internal
else
return a.references.order < b.references.order
end
end,
- [variables.all] = function(a,b)
+ [v_all] = function(a,b)
return a.references.internal < b.references.internal
end,
+ [v_title] = function(a,b)
+ local da = a.titledata
+ local db = b.titledata
+ if da and db then
+ local ta = da.title
+ local tb = db.title
+ if ta and tb then
+ local sa = da.split
+ if not sa then
+ sa = sortsplitter(sortstripper(ta))
+ da.split = sa
+ end
+ local sb = db.split
+ if not sb then
+ sb = sortsplitter(sortstripper(tb))
+ db.split = sb
+ end
+ return sortcomparer(da,db) == -1
+ end
+ end
+ return a.references.internal < b.references.internal
+ end
}
--- some day soon we will pass a table .. also split the function
+-- was: names, criterium, number, collected, forced, nested, sortorder
-local function filtercollected(names, criterium, number, collected, forced, nested, sortorder) -- names is hash or string
- local numbers, depth = documents.data.numbers, documents.data.depth
- local result, nofresult, detail = { }, 0, nil
- local block = false -- all
- criterium = gsub(criterium or ""," ","") -- not needed
- -- new, will be applied stepwise
+local filters = setmetatableindex(function(t,k) return t[v_default] end)
+
+local function filtercollected(specification)
+ --
+ local names = specification.names or { }
+ local criterium = specification.criterium or v_default
+ local number = 0 -- specification.number
+ local reference = specification.reference or ""
+ local collected = specification.collected or lists.collected
+ local forced = specification.forced or { }
+ local nested = specification.nested or false
+ local sortorder = specification.sortorder or specification.order
+ --
+ local numbers = documents.data.numbers
+ local depth = documents.data.depth
+ local block = false -- all
local wantedblock, wantedcriterium = lpegmatch(splitter,criterium) -- block:criterium
- if wantedblock == "" or wantedblock == variables.all or wantedblock == variables.text then
+ if wantedblock == "" or wantedblock == v_all or wantedblock == v_text then
criterium = wantedcriterium ~= "" and wantedcriterium or criterium
elseif not wantedcriterium then
block = documents.data.block
@@ -321,236 +414,393 @@ local function filtercollected(names, criterium, number, collected, forced, nest
if block == "" then
block = false
end
--- print(">>",block,criterium)
- --
- forced = forced or { } -- todo: also on other branched, for the moment only needed for bookmarks
if type(names) == "string" then
- names = settings_to_hash(names)
+ names = settings_to_set(names)
end
- local all = not next(names) or names[variables.all] or false
+ local all = not next(names) or names[v_all] or false
+ --
+ specification.names = names
+ specification.criterium = criterium
+ specification.number = 0 -- obsolete
+ specification.reference = reference -- new
+ specification.collected = collected
+ specification.forced = forced -- todo: also on other branched, for the moment only needed for bookmarks
+ specification.nested = nested
+ specification.sortorder = sortorder
+ specification.numbers = numbers
+ specification.depth = depth
+ specification.block = block
+ specification.all = all
+ --
if trace_lists then
- report_lists("filtering names %a, criterium %a, block %a, number %a",names,criterium,block or "*",number)
+ report_lists("filtering names %,t, criterium %a, block %a",sortedkeys(names), criterium, block or "*")
end
- if criterium == variables.intro then
- -- special case, no structure yet
- for i=1,#collected do
- local v = collected[i]
+ local result = filters[criterium](specification)
+ if trace_lists then
+ report_lists("criterium %a, block %a, found %a",specification.criterium, specification.block or "*", #result)
+ end
+ --
+ if sortorder then -- experiment
+ local sorter = listsorters[sortorder]
+ if sorter then
+ if trace_lists then
+ report_lists("sorting list using method %a",sortorder)
+ end
+ for i=1,#result do
+ result[i].references.order = i
+ end
+ sort(result,sorter)
+ end
+ end
+ --
+ return result
+end
+
+filters[v_intro] = function(specification)
+ local collected = specification.collected
+ local result = { }
+ local nofresult = #result
+ local all = specification.all
+ local names = specification.names
+ for i=1,#collected do
+ local v = collected[i]
+ local metadata = v.metadata
+ if metadata and (all or names[metadata.name or false]) then
local r = v.references
if r and r.section == 0 then
nofresult = nofresult + 1
result[nofresult] = v
end
end
- elseif all or criterium == variables.all or criterium == variables.text then
- for i=1,#collected do
- local v = collected[i]
- local r = v.references
- if r and (not block or not r.block or block == r.block) then
- local metadata = v.metadata
- if metadata then
- local name = metadata.name or false
- local sectionnumber = (r.section == 0) or sections.collected[r.section]
- if forced[name] or (sectionnumber and not metadata.nolist and (all or names[name])) then -- and not sectionnumber.hidenumber then
- nofresult = nofresult + 1
- result[nofresult] = v
- end
- end
- end
- end
- elseif criterium == variables.current then
- if depth == 0 then
- return filtercollected(names,variables.intro,number,collected,forced,false,sortorder)
- else
+ end
+ return result
+end
+
+filters[v_reference] = function(specification)
+ local collected = specification.collected
+ local result = { }
+ local nofresult = #result
+ local names = specification.names
+ local sections = sections.collected
+ local reference = specification.reference
+ if reference ~= "" then
+ local prefix, rest = lpegmatch(references.prefixsplitter,reference) -- p::r
+ local r = prefix and rest and references.derived[prefix][rest] or references.derived[""][reference]
+ local s = r and r.numberdata -- table ref !
+ if s then
+ local depth = getsectionlevel(r.metadata.name)
+ local numbers = s.numbers
for i=1,#collected do
local v = collected[i]
local r = v.references
if r and (not block or not r.block or block == r.block) then
- local sectionnumber = sections.collected[r.section]
- if sectionnumber then -- and not sectionnumber.hidenumber then
- local cnumbers = sectionnumber.numbers
- local metadata = v.metadata
- if cnumbers then
- if metadata and not metadata.nolist and (all or names[metadata.name or false]) and #cnumbers > depth then
- local ok = true
- for d=1,depth do
- local cnd = cnumbers[d]
- if not (cnd == 0 or cnd == numbers[d]) then
- ok = false
- break
- end
- end
- if ok then
- nofresult = nofresult + 1
- result[nofresult] = v
- end
+ local metadata = v.metadata
+ if metadata and names[metadata.name or false] then
+ local sectionnumber = (r.section == 0) or sections[r.section]
+ if sectionnumber then
+ if matchingtilldepth(depth,numbers,sectionnumber.numbers) then
+ nofresult = nofresult + 1
+ result[nofresult] = v
end
end
end
end
end
- end
- elseif criterium == variables.here then
- -- this is quite dirty ... as cnumbers is not sparse we can misuse #cnumbers
- if depth == 0 then
- return filtercollected(names,variables.intro,number,collected,forced,false,sortorder)
else
- for i=1,#collected do
- local v = collected[i]
- local r = v.references
- if r then -- and (not block or not r.block or block == r.block) then
- local sectionnumber = sections.collected[r.section]
- if sectionnumber then -- and not sectionnumber.hidenumber then
- local cnumbers = sectionnumber.numbers
- local metadata = v.metadata
- if cnumbers then
- if metadata and not metadata.nolist and (all or names[metadata.name or false]) and #cnumbers >= depth then
- local ok = true
- for d=1,depth do
- local cnd = cnumbers[d]
- if not (cnd == 0 or cnd == numbers[d]) then
- ok = false
- break
- end
- end
- if ok then
- nofresult = nofresult + 1
- result[nofresult] = v
- end
- end
- end
- end
+ report_lists("unknown reference %a specified",reference)
+ end
+ else
+ report_lists("no reference specified")
+ end
+ return result
+end
+
+filters[v_all] = function(specification)
+ local collected = specification.collected
+ local result = { }
+ local nofresult = #result
+ local block = specification.block
+ local all = specification.all
+ local forced = specification.forced
+ local names = specification.names
+ local sections = sections.collected
+ for i=1,#collected do
+ local v = collected[i]
+ local r = v.references
+ if r and (not block or not r.block or block == r.block) then
+ local metadata = v.metadata
+ if metadata then
+ local name = metadata.name or false
+ local sectionnumber = (r.section == 0) or sections[r.section]
+ if forced[name] or (sectionnumber and not metadata.nolist and (all or names[name])) then -- and not sectionnumber.hidenumber then
+ nofresult = nofresult + 1
+ result[nofresult] = v
end
end
end
- elseif criterium == variables.previous then
- if depth == 0 then
- return filtercollected(names,variables.intro,number,collected,forced,false,sortorder)
- else
- for i=1,#collected do
- local v = collected[i]
- local r = v.references
- if r and (not block or not r.block or block == r.block) then
- local sectionnumber = sections.collected[r.section]
- if sectionnumber then -- and not sectionnumber.hidenumber then
- local cnumbers = sectionnumber.numbers
- local metadata = v.metadata
- if cnumbers then
- if metadata and not metadata.nolist and (all or names[metadata.name or false]) and #cnumbers >= depth then
- local ok = true
- for d=1,depth-1 do
- local cnd = cnumbers[d]
- if not (cnd == 0 or cnd == numbers[d]) then
- ok = false
- break
- end
- end
- if ok then
- nofresult = nofresult + 1
- result[nofresult] = v
- end
+ end
+ return result
+end
+
+filters[v_text] = filters[v_all]
+
+filters[v_current] = function(specification)
+ if specification.depth == 0 then
+ specification.nested = false
+ specification.criterium = v_intro
+ return filters[v_intro](specification)
+ end
+ local collected = specification.collected
+ local result = { }
+ local nofresult = #result
+ local depth = specification.depth
+ local block = specification.block
+ local all = specification.all
+ local names = specification.names
+ local numbers = specification.numbers
+ local sections = sections.collected
+ for i=1,#collected do
+ local v = collected[i]
+ local r = v.references
+ if r and (not block or not r.block or block == r.block) then
+ local sectionnumber = sections[r.section]
+ if sectionnumber then -- and not sectionnumber.hidenumber then
+ local cnumbers = sectionnumber.numbers
+ local metadata = v.metadata
+ if cnumbers then
+ if metadata and not metadata.nolist and (all or names[metadata.name or false]) and #cnumbers > depth then
+ local ok = true
+ for d=1,depth do
+ local cnd = cnumbers[d]
+ if not (cnd == 0 or cnd == numbers[d]) then
+ ok = false
+ break
end
end
+ if ok then
+ nofresult = nofresult + 1
+ result[nofresult] = v
+ end
end
end
end
end
- elseif criterium == variables["local"] then -- not yet ok
- local nested = nesting[#nesting]
- if nested then
- return filtercollected(names,nested.name,nested.number,collected,forced,nested,sortorder)
- elseif sections.autodepth(documents.data.numbers) == 0 then
- return filtercollected(names,variables.all,number,collected,forced,false,sortorder)
- else
- return filtercollected(names,variables.current,number,collected,forced,false,sortorder)
- end
- elseif criterium == variables.component then
- -- special case, no structure yet
- local component = resolvers.jobs.currentcomponent() or ""
- if component ~= "" then
- for i=1,#collected do
- local v = collected[i]
- local r = v.references
- local m = v.metadata
- if r and r.component == component and (m and names[m.name] or all) then
- nofresult = nofresult + 1
- result[nofresult] = v
+ end
+ return result
+end
+
+filters[v_here] = function(specification)
+ -- this is quite dirty ... as cnumbers is not sparse we can misuse #cnumbers
+ if specification.depth == 0 then
+ specification.nested = false
+ specification.criterium = v_intro
+ return filters[v_intro](specification)
+ end
+ local collected = specification.collected
+ local result = { }
+ local nofresult = #result
+ local depth = specification.depth
+ local block = specification.block
+ local all = specification.all
+ local names = specification.names
+ local numbers = specification.numbers
+ local sections = sections.collected
+ for i=1,#collected do
+ local v = collected[i]
+ local r = v.references
+ if r then -- and (not block or not r.block or block == r.block) then
+ local sectionnumber = sections[r.section]
+ if sectionnumber then -- and not sectionnumber.hidenumber then
+ local cnumbers = sectionnumber.numbers
+ local metadata = v.metadata
+ if cnumbers then
+ if metadata and not metadata.nolist and (all or names[metadata.name or false]) and #cnumbers >= depth then
+ local ok = true
+ for d=1,depth do
+ local cnd = cnumbers[d]
+ if not (cnd == 0 or cnd == numbers[d]) then
+ ok = false
+ break
+ end
+ end
+ if ok then
+ nofresult = nofresult + 1
+ result[nofresult] = v
+ end
+ end
end
end
end
- else -- sectionname, number
- -- not the same as register
- local depth = sections.getlevel(criterium)
- local number = tonumber(number) or numberatdepth(depth) or 0
- if trace_lists then
- local t = sections.numbers()
- detail = format("depth %s, number %s, numbers %s, startset %s",depth,number,(#t>0 and concat(t,".",1,depth)) or "?",#collected)
- end
- if number > 0 then
- local pnumbers = nil
- local pblock = block
- local parent = nested and nested.parent
- if parent then
- pnumbers = parent.numberdata.numbers or pnumbers -- so local as well as nested
- pblock = parent.references.block or pblock
- end
- for i=1,#collected do
- local v = collected[i]
- local r = v.references
- if r and (not block or not r.block or pblock == r.block) then
- local sectionnumber = sections.collected[r.section]
- if sectionnumber then
- local metadata = v.metadata
- local cnumbers = sectionnumber.numbers
- if cnumbers then
- if (all or names[metadata.name or false]) and #cnumbers >= depth and matchingtilldepth(depth,cnumbers,pnumbers) then
- nofresult = nofresult + 1
- result[nofresult] = v
+ end
+ return result
+end
+
+filters[v_previous] = function(specification)
+ if specification.depth == 0 then
+ specification.nested = false
+ specification.criterium = v_intro
+ return filters[v_intro](specification)
+ end
+ local collected = specification.collected
+ local result = { }
+ local nofresult = #result
+ local block = specification.block
+ local all = specification.all
+ local names = specification.names
+ local numbers = specification.numbers
+ local sections = sections.collected
+ local depth = specification.depth
+ for i=1,#collected do
+ local v = collected[i]
+ local r = v.references
+ if r and (not block or not r.block or block == r.block) then
+ local sectionnumber = sections[r.section]
+ if sectionnumber then -- and not sectionnumber.hidenumber then
+ local cnumbers = sectionnumber.numbers
+ local metadata = v.metadata
+ if cnumbers then
+ if metadata and not metadata.nolist and (all or names[metadata.name or false]) and #cnumbers >= depth then
+ local ok = true
+ for d=1,depth-1 do
+ local cnd = cnumbers[d]
+ if not (cnd == 0 or cnd == numbers[d]) then
+ ok = false
+ break
end
end
+ if ok then
+ nofresult = nofresult + 1
+ result[nofresult] = v
+ end
end
end
end
end
end
- if trace_lists then
- report_lists("criterium %a, block %a, found %a, detail %a",criterium,block or "*",#result,detail)
+ return result
+end
+
+filters[v_local] = function(specification)
+ local numbers = specification.numbers
+ local nested = nesting[#nesting]
+ if nested then
+ return filtercollected {
+ names = specification.names,
+ criterium = nested.name,
+ collected = specification.collected,
+ forced = specification.forced,
+ nested = nested,
+ sortorder = specification.sortorder,
+ }
+ else
+ specification.criterium = autosectiondepth(numbers) == 0 and v_all or v_current
+ specification.nested = false
+ return filtercollected(specification) -- rechecks, so better (for determining all)
end
+end
- if sortorder then -- experiment
- local sorter = sorters[sortorder]
- if sorter then
- if trace_lists then
- report_lists("sorting list using method %a",sortorder)
- end
- for i=1,#result do
- result[i].references.order = i
+
+filters[v_component] = function(specification)
+ -- special case, no structure yet
+ local collected = specification.collected
+ local result = { }
+ local nofresult = #result
+ local all = specification.all
+ local names = specification.names
+ local component = resolvers.jobs.currentcomponent() or ""
+ if component ~= "" then
+ for i=1,#collected do
+ local v = collected[i]
+ local r = v.references
+ local m = v.metadata
+ if r and r.component == component and (m and names[m.name] or all) then
+ nofresult = nofresult + 1
+ result[nofresult] = v
end
- table.sort(result,sorter)
end
end
-
return result
end
-lists.filtercollected = filtercollected
+-- local number = tonumber(number) or numberatdepth(depth) or 0
+-- if number > 0 then
+-- ...
+-- end
-function lists.filter(specification)
- return filtercollected(
- specification.names,
- specification.criterium,
- specification.number,
- lists.collected,
- specification.forced,
- false,
- specification.order
- )
+filters[v_default] = function(specification) -- is named
+ local collected = specification.collected
+ local result = { }
+ local nofresult = #result
+ ----- depth = specification.depth
+ local block = specification.block
+ local criterium = specification.criterium
+ local all = specification.all
+ local names = specification.names
+ local numbers = specification.numbers
+ local sections = sections.collected
+ local reference = specification.reference
+ local nested = specification.nested
+ --
+ if reference then
+ reference = tonumber(reference)
+ end
+ --
+ local depth = getsectionlevel(criterium)
+ local pnumbers = nil
+ local pblock = block
+ local parent = nested and nested.parent
+ --
+ if parent then
+ pnumbers = parent.numberdata.numbers or pnumbers -- so local as well as nested
+ pblock = parent.references.block or pblock
+ if trace_lists then
+ report_lists("filtering by block %a and section %a",pblock,criterium)
+ end
+ end
+ --
+ for i=1,#collected do
+ local v = collected[i]
+ local r = v.references
+ if r and (not block or not r.block or pblock == r.block) then
+ local sectionnumber = sections[r.section]
+ if sectionnumber then
+ local metadata = v.metadata
+ local cnumbers = sectionnumber.numbers
+ if cnumbers then
+ if all or names[metadata.name or false] then
+ if reference then
+ -- filter by number
+ if reference == cnumbers[depth] then
+ nofresult = nofresult + 1
+ result[nofresult] = v
+ end
+ else
+ if #cnumbers >= depth and matchingtilldepth(depth,cnumbers,pnumbers) then
+ nofresult = nofresult + 1
+ result[nofresult] = v
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ return result
end
+-- names, criterium, number, collected, forced, nested, sortorder) -- names is hash or string
+
+lists.filter = filtercollected
+
lists.result = { }
+function lists.getresult(r)
+ return lists.result[r]
+end
+
function lists.process(specification)
- lists.result = lists.filter(specification)
- local specials = utilities.parsers.settings_to_hash(specification.extras or "")
+ lists.result = filtercollected(specification)
+ local specials = settings_to_set(specification.extras or "")
specials = next(specials) and specials or nil
for i=1,#lists.result do
local r = lists.result[i]
@@ -561,7 +811,7 @@ function lists.process(specification)
end
function lists.analyze(specification)
- lists.result = lists.filter(specification)
+ lists.result = filtercollected(specification)
end
function lists.userdata(name,r,tag) -- to tex (todo: xml)
@@ -601,7 +851,7 @@ function lists.sectionnumber(name,n,spec)
local data = lists.result[n]
local sectiondata = sections.collected[data.references.section]
-- hm, prefixnumber?
- sections.typesetnumber(sectiondata,"prefix",spec,sectiondata) -- data happens to contain the spec too
+ typesetnumber(sectiondata,"prefix",spec,sectiondata) -- data happens to contain the spec too
end
-- some basics (todo: helpers for pages)
@@ -678,18 +928,18 @@ function lists.number(name,n,spec)
if data then
local numberdata = data.numberdata
if numberdata then
- sections.typesetnumber(numberdata,"number",spec or false,numberdata or false)
+ typesetnumber(numberdata,"number",spec or false,numberdata or false)
end
end
end
-function lists.prefixednumber(name,n,prefixspec,numberspec)
+function lists.prefixednumber(name,n,prefixspec,numberspec,forceddata)
local data = lists.result[n]
if data then
helpers.prefix(data,prefixspec)
- local numberdata = data.numberdata
+ local numberdata = data.numberdata or forceddata
if numberdata then
- sections.typesetnumber(numberdata,"number",numberspec or false,numberdata or false)
+ typesetnumber(numberdata,"number",numberspec or false,numberdata or false)
end
end
end
@@ -718,29 +968,175 @@ end
-- interface (maybe strclistpush etc)
-commands.pushlist = lists.pushnesting
-commands.poplist = lists.popnesting
-commands.enhancelist = lists.enhance
-commands.processlist = lists.process
-commands.analyzelist = lists.analyze
-commands.listtitle = lists.title
-commands.listprefixednumber = lists.prefixednumber
-commands.listprefixedpage = lists.prefixedpage
+if not lists.reordered then
+ function lists.reordered(data)
+ return data.numberdata
+ end
+end
+implement { name = "pushlist", actions = lists.pushnesting, arguments = "integer" }
+implement { name = "poplist", actions = lists.popnesting }
+
+implement {
+ name = "addtolist",
+ actions = { lists.addto, context },
+ arguments = {
+ {
+ { "references", {
+ { "internal", "integer" },
+ { "block" },
+ { "section", "integer" },
+ { "location" },
+ { "prefix" },
+ { "reference" },
+ { "order", "integer" },
+ }
+ },
+ { "metadata", {
+ { "kind" },
+ { "name" },
+ { "level", "integer" },
+ { "catcodes", "integer" },
+ { "coding" },
+ { "xmlroot" },
+ { "setup" },
+ }
+ },
+ { "userdata" },
+ { "titledata", {
+ { "label" },
+ { "title" },
+ { "bookmark" },
+ { "marking" },
+ { "list" },
+ }
+ },
+ { "prefixdata", {
+ { "prefix" },
+ { "separatorset" },
+ { "conversionset" },
+ { "conversion" },
+ { "set" },
+ { "segments" },
+ { "connector" },
+ }
+ },
+ { "numberdata", {
+ { "numbers" },
+ { "groupsuffix" },
+ { "group" },
+ { "counter" },
+ { "separatorset" },
+ { "conversionset" },
+ { "conversion" },
+ { "starter" },
+ { "stopper" },
+ { "segments" },
+ }
+ }
+ }
+ }
+}
-function commands.addtolist (...) context(lists.addto (...)) end
-function commands.listsize (...) context(lists.size (...)) end
-function commands.listlocation (...) context(lists.location (...)) end
-function commands.listlabel (...) context(lists.label (...)) end
-function commands.listrealpage (...) context(lists.realpage (...)) end
-function commands.listgroupindex (...) context(lists.groupindex(...)) end
+implement {
+ name = "enhancelist",
+ actions = lists.enhance,
+ arguments = "integer"
+}
-function commands.currentsectiontolist()
- context(lists.addto(sections.current()))
-end
+implement {
+ name = "processlist",
+ actions = lists.process,
+ arguments = {
+ {
+ { "names" },
+ { "criterium" },
+ { "reference" },
+ { "extras" },
+ { "order" },
+ }
+ }
+}
+
+implement {
+ name = "analyzelist",
+ actions = lists.analyze,
+ arguments = {
+ {
+ { "names" },
+ { "criterium" },
+ { "reference" },
+ }
+ }
+}
+
+implement {
+ name = "listtitle",
+ actions = lists.title,
+ arguments = { "string", "integer" }
+}
+
+implement {
+ name = "listprefixednumber",
+ actions = lists.prefixednumber,
+ arguments = {
+ "string",
+ "integer",
+ {
+ { "prefix" },
+ { "separatorset" },
+ { "conversionset" },
+ { "starter" },
+ { "stopper" },
+ { "set" },
+ { "segments" },
+ { "connector" },
+ },
+ {
+ { "separatorset" },
+ { "conversionset" },
+ { "starter" },
+ { "stopper" },
+ { "segments" },
+ }
+ }
+}
+
+implement {
+ name = "listprefixedpage",
+ actions = lists.prefixedpage,
+ arguments = {
+ "string",
+ "integer",
+ {
+ { "separatorset" },
+ { "conversionset" },
+ { "set" },
+ { "segments" },
+ { "connector" },
+ },
+ {
+ { "prefix" },
+ { "conversionset" },
+ { "starter" },
+ { "stopper" },
+ }
+ }
+}
+
+implement { name = "listsize", actions = { lists.size, context } }
+implement { name = "listlocation", actions = { lists.location, context }, arguments = "integer" }
+implement { name = "listlabel", actions = { lists.label, context }, arguments = { "integer", "string" } }
+implement { name = "listrealpage", actions = { lists.realpage, context }, arguments = { "string", "integer" } }
+implement { name = "listgroupindex", actions = { lists.groupindex, context }, arguments = { "string", "string" } }
-function commands.listuserdata(...)
- local str, metadata = lists.userdata(...)
+implement {
+ name = "currentsectiontolist",
+ actions = { sections.current, lists.addto, context }
+}
+
+local function userdata(name,r,tag)
+ local str, metadata = lists.userdata(name,r,tag)
if str then
-- local catcodes = metadata and metadata.catcodes
-- if catcodes then
@@ -752,25 +1148,21 @@ function commands.listuserdata(...)
end
end
+implement {
+ name = "listuserdata",
+ actions = userdata,
+ arguments = { "string", "integer", "string" }
+}
+
-- we could also set variables .. names will change (when this module is done)
-- maybe strc_lists_savedtitle etc
-function commands.doiflisthastitleelse (...) commands.doifelse(lists.hastitledata (...)) end
-function commands.doiflisthaspageelse (...) commands.doifelse(lists.haspagedata (...)) end
-function commands.doiflisthasnumberelse(...) commands.doifelse(lists.hasnumberdata(...)) end
-function commands.doiflisthasentry (n) commands.doifelse(lists.iscached (n )) end
-
-function commands.savedlistnumber(name,n)
- local data = cached[tonumber(n)]
- if data then
- local numberdata = data.numberdata
- if numberdata then
- sections.typesetnumber(numberdata,"number",numberdata or false)
- end
- end
-end
+implement { name = "doifelselisthastitle", actions = { lists.hastitledata, commands.doifelse }, arguments = { "string", "integer" } }
+implement { name = "doifelselisthaspage", actions = { lists.haspagedata, commands.doifelse }, arguments = { "string", "integer" } }
+implement { name = "doifelselisthasnumber", actions = { lists.hasnumberdata, commands.doifelse }, arguments = { "string", "integer" } }
+implement { name = "doifelselisthasentry", actions = { lists.iscached, commands.doifelse }, arguments = { "integer" } }
-function commands.savedlisttitle(name,n,tag)
+local function savedlisttitle(name,n,tag)
local data = cached[tonumber(n)]
if data then
local titledata = data.titledata
@@ -780,39 +1172,56 @@ function commands.savedlisttitle(name,n,tag)
end
end
--- function commands.savedlistprefixednumber(name,n)
--- local data = cached[tonumber(n)]
--- if data then
--- local numberdata = data.numberdata
--- if numberdata then
--- helpers.prefix(data,data.prefixdata)
--- sections.typesetnumber(numberdata,"number",numberdata or false)
--- end
--- end
--- end
-
-if not lists.reordered then
- function lists.reordered(data)
- return data.numberdata
+local function savedlistnumber(name,n)
+ local data = cached[tonumber(n)]
+ if data then
+ local numberdata = data.numberdata
+ if numberdata then
+ typesetnumber(numberdata,"number",numberdata or false)
+ end
end
end
-function commands.savedlistprefixednumber(name,n)
+local function savedlistprefixednumber(name,n)
local data = cached[tonumber(n)]
if data then
local numberdata = lists.reordered(data)
if numberdata then
helpers.prefix(data,data.prefixdata)
- sections.typesetnumber(numberdata,"number",numberdata or false)
+ typesetnumber(numberdata,"number",numberdata or false)
end
end
end
-commands.discardfromlist = lists.discard
+lists.savedlisttitle = savedlisttitle
+lists.savedlistnumber = savedlistnumber
+lists.savedlistprefixednumber = savedlistprefixednumber
--- new and experimental and therefore off by default
+implement {
+ name = "savedlistnumber",
+ actions = savedlistnumber,
+ arguments = { "string", "integer" }
+}
-local sort, setmetatableindex = table.sort, table.setmetatableindex
+implement {
+ name = "savedlisttitle",
+ actions = savedlisttitle,
+ arguments = { "string", "integer" }
+}
+
+implement {
+ name = "savedlistprefixednumber",
+ actions = savedlistprefixednumber,
+ arguments = { "string", "integer" }
+}
+
+implement {
+ name = "discardfromlist",
+ actions = lists.discard,
+ arguments = { "integer" }
+}
+
+-- new and experimental and therefore off by default
lists.autoreorder = false -- true
diff --git a/Master/texmf-dist/tex/context/base/strc-lst.mkvi b/Master/texmf-dist/tex/context/base/strc-lst.mkvi
index 0008f060231..556d2ab4895 100644
--- a/Master/texmf-dist/tex/context/base/strc-lst.mkvi
+++ b/Master/texmf-dist/tex/context/base/strc-lst.mkvi
@@ -47,7 +47,7 @@
\c!state=\v!start,
\c!coupling=\v!off,
\c!criterium=\v!local,
- \c!number=\zerocount,
+ \c!reference=,% was number which was sort of obsolete
\c!width=3\emwidth,
%\c!maxwidth=,
\c!distance=\zeropoint,
@@ -94,6 +94,8 @@
\expandafter\secondoftwoarguments
\fi}
+\let\doiflistelse\doifelselist
+
%D Regular list entries are bound to a specific location in order to
%D get the right pagenumber etc.\ associated. When pushing something
%D inbetween (in mkiv) it ends up directtly in the list. This is the
@@ -125,37 +127,48 @@
\def\strc_lists_inject_nop[#dummya][#dummyb]%
{\endgroup}
-\def\strc_lists_inject_yes[#settings][#userdata]%
+\unexpanded\def\strc_lists_inject_enhance#listindex#internal%
+ {\normalexpanded{\ctxlatecommand{enhancelist(#listindex)}}}
+
+\unexpanded\def\strc_lists_inject_yes[#settings][#userdata]% can be used directly
{\setupcurrentlist[\c!type=userdata,\c!location=\v!none,#settings]% grouped (use \let...
\edef\p_location{\listparameter\c!location}%
\setnextinternalreference
- \edef\currentlistnumber{\ctxcommand{addtolist{
- references = {
- internal = \nextinternalreference,
- block = "\currentsectionblock", % handy for lists, like bibl
- section = structures.sections.currentid(),
- % location = "\p_location",
- },
- metadata = {
- kind = "\listparameter\c!type",
- name = "\currentlist",
- level = structures.sections.currentlevel(),
- catcodes = \the\catcodetable,
- },
- userdata = \!!bs\detokenize{#userdata}\!!es % will be converted to table at the lua end
- }}}%
+ \scratchcounter\clf_addtolist
+ references {
+ internal \nextinternalreference
+ % block {\currentsectionblock}
+ % section structures.sections.currentid()
+ % location {\p_location}
+ }
+ metadata {
+ kind {\listparameter\c!type}
+ name {\currentlist}
+ % level structures.sections.currentlevel()
+ catcodes \catcodetable
+ }
+ userdata {\detokenize\expandafter{\normalexpanded{#userdata}}}
+ \relax
+ \edef\currentlistnumber{\the\scratchcounter}%
\ifx\p_location\v!here
% this branch injects nodes !
- \expanded{\ctxlatecommand{enhancelist(\currentlistnumber)}}%
- \ctxcommand{setinternalreference(nil,nil,\nextinternalreference)}% will change
+ \strc_lists_inject_enhance{\currentlistnumber}{\nextinternalreference}%
+ \clf_setinternalreference internal \nextinternalreference\relax % this will change
\xdef\currentstructurelistattribute{\the\lastdestinationattribute}%
\dontleavehmode\hbox attr \destinationattribute \lastdestinationattribute{}% todo
\else
% and this one doesn't
- \ctxcommand{enhancelist(\currentlistnumber)}%
+ \clf_enhancelist\currentlistnumber\relax
\fi
\endgroup}
+% todo: make like \strc_references_direct_full_user ... with {}{}{}
+
+\unexpanded\def\strc_lists_inject_direct[#tag]% [#settings][#userdata]
+ {\begingroup
+ \edef\currentlist{#tag}%
+ \strc_lists_inject_yes} % [#settings][#userdata]
+
\unexpanded\def\writebetweenlist{\dodoubleempty \strc_lists_write_between}
\unexpanded\def\writedatatolist {\dotripleargument\strc_lists_write_data_to}
\unexpanded\def\writetolist {\dodoubleempty \strc_lists_write_to}
@@ -244,7 +257,7 @@
\strc_lists_place_current % maybe inline
{#list}%
{\listparameter\c!criterium}%
- {\listparameter\c!number}%
+ {\listparameter\c!reference}%
{\listparameter\c!extras}%
{\listparameter\c!order}%
% \stoplistreferences
@@ -288,7 +301,7 @@
{\dotripleempty\strc_lists_combined_define}
\def\strc_lists_combined_define[#tag][#list][#settings]%
- {\definelist[#tag][\c!criterium=\v!local,\c!number=0,\c!alternative=,\c!list={#list},#settings]% inherits from root
+ {\definelist[#tag][\c!criterium=\v!local,\c!reference=,\c!alternative=,\c!list={#list},#settings]% inherits from root
\setvalue{\e!setup #tag\e!endsetup}{\dodoubleempty\strc_lists_combined_setup [#tag]}%
\setvalue{\e!place #tag}{\dodoubleempty\strc_lists_combined_place [#tag]}%
\setvalue{\e!complete #tag}{\dodoubleempty\strc_lists_combined_complete[#tag]}}
@@ -324,42 +337,42 @@
\def\currentstructurelistnumber{0} % injection
\def\currentlistmethod {entry} % typesetting
-\def\currentlistindex {0} % typesetting
+\def\currentlistindex {0} % typesetting (maybe also a real counter)
\def\structurelistlocation
- {\ctxcommand{listlocation(\currentlistindex)}}
+ {\clf_listlocation\numexpr\currentlistindex\relax}
\def\structurelistrealpagenumber
- {\ctxcommand{listrealpage("\currentlist",\currentlistindex)}}
+ {\clf_listrealpage{\currentlist}\numexpr\currentlistindex\relax}
\unexpanded\def\structurelistpagenumber
{\dostarttagged\t!listpage\empty
- \ctxcommand{listprefixedpage(
- "\currentlist",
- \currentlistindex,
- {
- separatorset = "\listparameter\c!pageprefixseparatorset",
- conversionset = "\listparameter\c!pageprefixconversionset",
- set = "\listparameter\c!pageprefixset",
- segments = "\listparameter\c!pageprefixsegments",
- connector = \!!bs\listparameter\c!pageprefixconnector\!!es,
- },
- {
- prefix = "\listparameter\c!pageprefix",
- conversionset = "\listparameter\c!pageconversionset",
- starter = \!!bs\listparameter\c!pagestarter\!!es,
- stopper = \!!bs\listparameter\c!pagestopper\!!es,
+ \clf_listprefixedpage
+ {\currentlist}
+ \currentlistindex
+ {
+ separatorset {\listparameter\c!pageprefixseparatorset}
+ conversionset {\listparameter\c!pageprefixconversionset}
+ set {\listparameter\c!pageprefixset}
+ segments {\listparameter\c!pageprefixsegments}
+ connector {\listparameter\c!pageprefixconnector}
}
- )}%
+ {
+ prefix {\listparameter\c!pageprefix}
+ conversionset {\listparameter\c!pageconversionset}
+ starter {\listparameter\c!pagestarter}
+ stopper {\listparameter\c!pagestopper}
+ }
+ \relax
\dostoptagged}
\unexpanded\def\structurelistuservariable#name%
{\dostarttagged\t!listdata{#name}%
- \ctxcommand{listuserdata("\currentlist",\currentlistindex,"#name")}%
+ \clf_listuserdata{\currentlist}\currentlistindex{#name}%
\dostoptagged}
\def\rawstructurelistuservariable#name%
- {\ctxcommand{listuserdata("\currentlist",\currentlistindex,"#name")}}
+ {\clf_listuserdata{\currentlist}\currentlistindex{#name}}
\unexpanded\def\structurelistfirst {\structurelistuservariable\s!first } % s!
\unexpanded\def\structurelistsecond{\structurelistuservariable\s!second} % s!
@@ -367,63 +380,70 @@
\def\rawstructurelistfirst {\rawstructurelistuservariable\s!first } % s! % was \unexpanded
\def\rawstructurelistsecond{\rawstructurelistuservariable\s!second} % s! % was \unexpanded
-\unexpanded\def\doifstructurelisthaspageelse
- {\ctxcommand{doiflisthaspageelse("\currentlist",\currentlistindex)}}
+\unexpanded\def\doifelsestructurelisthaspage
+ {\clf_doifelselisthaspage{\currentlist}\numexpr\currentlistindex\relax}
+
+\unexpanded\def\doifelsestructurelisthasnumber
+ {\clf_doifelselisthasnumber{\currentlist}\numexpr\currentlistindex\relax}
-\unexpanded\def\doifstructurelisthasnumberelse
- {\ctxcommand{doiflisthasnumberelse("\currentlist",\currentlistindex)}}
+\let\doifstructurelisthaspageelse \doifelsestructurelisthaspage
+\let\doifstructurelisthasnumberelse\doifelsestructurelisthasnumber
\unexpanded\def\structurelistgenerictitle
{\dostarttagged\t!listcontent\empty
- \ctxcommand{listtitle("\currentlist",\currentlistindex)}%
+ \clf_listtitle{\currentlist}\currentlistindex\relax
\dostoptagged}
\unexpanded\def\structurelistgenericnumber % tricky, we need to delay tagging as we have nested lua calls
{\dostarttagged\t!listtag\empty
- \ctxcommand{listprefixednumber("\currentlist",\currentlistindex, {
- prefix = "\listparameter\c!prefix",
- separatorset = "\listparameter\c!prefixseparatorset",
- conversionset = "\listparameter\c!prefixconversionset",
- starter = \!!bs\listparameter\c!prefixstarter\!!es,
- stopper = \!!bs\listparameter\c!prefixstopper\!!es,
- set = "\listparameter\c!prefixset",
- segments = "\listparameter\c!prefixsegments",
- connector = \!!bs\listparameter\c!prefixconnector\!!es,
- },
- {
- separatorset = "\listparameter\c!numberseparatorset",
- conversionset = "\listparameter\c!numberconversionset",
- starter = \!!bs\listparameter\c!numberstarter\!!es,
- stopper = \!!bs\listparameter\c!numberstopper\!!es,
- segments = "\listparameter\c!numbersegments",
- } )}%
+ \clf_listprefixednumber
+ {\currentlist}%
+ \currentlistindex
+ {%
+ prefix {\listparameter\c!prefix}%
+ separatorset {\listparameter\c!prefixseparatorset}%
+ conversionset {\listparameter\c!prefixconversionset}%
+ starter {\listparameter\c!prefixstarter}%
+ stopper {\listparameter\c!prefixstopper}%
+ set {\listparameter\c!prefixset}%
+ segments {\listparameter\c!prefixsegments}%
+ connector {\listparameter\c!prefixconnector}%
+ }%
+ {%
+ separatorset {\listparameter\c!numberseparatorset}%
+ conversionset {\listparameter\c!numberconversionset}%
+ starter {\listparameter\c!numberstarter}%
+ stopper {\listparameter\c!numberstopper}%
+ segments {\listparameter\c!numbersegments}%
+ }%
+ \relax
\dostoptagged}
% TODO: pass extra tag name (contents, figures, bibliography ...)
-\unexpanded\def\strc_lists_place_current#list#criterium#number#extras#order% beware, not a user command
- {\dostarttagged\t!list\empty
- \ctxcommand{processlist{
- names = "#list",
- criterium = "#criterium",
- number = "#number",
- extras = "#extras",
- order = "#order"
- }}%
+\unexpanded\def\strc_lists_place_current#list#criterium#reference#extras#order% beware, not a user command
+ {\dostarttaggedchained\t!list\empty\??list
+ \clf_processlist
+ names {#list}
+ criterium {#criterium}
+ reference {#reference}
+ extras {#extras}
+ order {#order}
+ \relax
\dostoptagged}
-\unexpanded\def\strc_lists_analyze#list#criterium#number%
- {\ctxcommand{analyzelist{
- names = "#list",
- criterium = "#criterium",
- number = "#number"
- }}}
+\unexpanded\def\strc_lists_analyze#list#criterium#reference%
+ {\clf_analyzelist
+ names {#list}
+ criterium {#criterium}
+ reference {#reference}
+ \relax}
-\def\firststructureelementinlist#list%
- {\ctxcommand{firstinset("#list")}}
+\def\firststructureelementinlist#list% expandable
+ {\clf_firstinset{#list}}
\def\structurelistsize
- {\ctxcommand{listsize()}}
+ {\clf_listsize}
%D Depending on what kind of list we have (e.g.\ a section related one)
%D processors can be defined.
@@ -451,14 +471,12 @@
\def\usestructurelistprocessor#tag%
{\csname\??structurelistprocessor#tag\endcsname}
-\unexpanded\def\strclistsentryprocess#tag#method#index#extra% This one is called at the lua end!
- {\ctxcommand{pushlist(#index)}%
- \edef\currentlist {#tag}%
- \edef\currentlistmethod{#method}%
- \edef\currentlistindex {#index}%
- \edef\currentlistextra {#extra}%
- \listextraparameter\c!before
+\let\dotaglistlocation\relax
+
+\def\strc_lists_entry_process % assume things to be set up
+ {\listextraparameter\c!before
\dostarttagged\t!listitem\currentlist
+ \dotaglistlocation
\csname\??structurelistprocessor
\ifcsname\??structurelistprocessor\currentlist:\currentlistmethod\endcsname\currentlist:\currentlistmethod\else
\ifcsname\??structurelistprocessor\currentlistmethod \endcsname\currentlistmethod \else
@@ -466,8 +484,16 @@
\s!default \fi\fi\fi
\endcsname
\dostoptagged
- \listextraparameter\c!after
- \ctxcommand{poplist()}}
+ \listextraparameter\c!after}
+
+\unexpanded\def\strclistsentryprocess#tag#method#index#extra% This one is called at the lua end!
+ {\clf_pushlist#index\relax
+ \edef\currentlist {#tag}%
+ \edef\currentlistmethod{#method}%
+ \edef\currentlistindex {#index}%
+ \edef\currentlistextra {#extra}%
+ \strc_lists_entry_process
+ \clf_poplist}
% lists that have a number/title are kind of generic and can share code
@@ -481,7 +507,7 @@
\strc_lists_apply_renderingsetup}
\installstructurelistprocessor\s!command
- {\ctxcommand{listuserdata("\currentlist",\currentlistindex,"\s!command")}}
+ {\clf_listuserdata{\currentlist}\currentlistindex{\s!command}}
\installstructurelistprocessor{section}
{\let\currentlistentrynumber \structurelistgenericnumber
@@ -498,7 +524,7 @@
% example of usage elsewhere:
%
% \installstructcurelistprocessor{pubs:userdata}
-% {\ctxcommand{listuserdata("\currentlist",\currentlistindex,"bibref")}}
+% {\clf_listuserdata{\currentlist}\currentlistindex{bibref}}
%D List symbols are used in interactive documents where no numbers
%D are used but nevertheless structure is present. Beware, the list
@@ -520,7 +546,7 @@
\def\strc_lists_assign_dimen#dimension#key#default%
{\edef\m_strc_list_dimen{\listparameter#key}%
- \doifinsetelse\m_strc_list_dimen{\v!fit,\v!broad}{#dimension#default}{#dimension\m_strc_list_dimen}\relax}
+ \doifelseinset\m_strc_list_dimen{\v!fit,\v!broad}{#dimension#default}{#dimension\m_strc_list_dimen}\relax}
\definesymbol[\v!list][\v!none ][\strc_lists_symbol_none]
\definesymbol[\v!list][\v!one ][\strc_lists_symbol_one]
@@ -531,7 +557,7 @@
\unexpanded\def\currentlistsymbol
{\edef\p_symbol{\listparameter\c!symbol}%
- \doifinsymbolsetelse\v!list\p_symbol
+ \doifelseinsymbolset\v!list\p_symbol
{\directsymbol\v!list\p_symbol}
{\directsymbol\v!list\s!default}}
@@ -589,7 +615,7 @@
{\currentlistentrynumber}
\setvalue{\??listsymbollabels\v!yes}% auto (use value stored in tuc file)
- {\edef\currentlistlabel{\ctxcommand{listlabel(\currentlistindex,"\currentlistlabel")}}%
+ {\edef\currentlistlabel{\clf_listlabel\currentlistindex{\currentlistlabel}}%
\leftlabeltext\currentlistlabel
\listparameter\c!starter
\currentlistentrynumber
@@ -700,7 +726,7 @@
\let\p_method\v!command
\fi
\normalexpanded{\definelistalternative[#tag][\p_method]}[\c!command=\strc_lists_placement_command]%
- \doifnextbgroupelse
+ \doifelsenextbgroup
{\strc_lists_define_placement_yes{#tag}}
{\strc_lists_define_placement_nop{#tag}}}
@@ -764,7 +790,7 @@
\settrue\c_lists_has_page
\settrue\c_lists_show_page
\else
- \doifstructurelisthaspageelse\settrue\setfalse\c_lists_has_page
+ \doifelsestructurelisthaspage\settrue\setfalse\c_lists_has_page
\ifx\p_pagenumber\v!yes
\settrue\c_lists_show_page
\else
@@ -777,7 +803,7 @@
\settrue\c_lists_has_number
\settrue\c_lists_show_number
\else
- \doifstructurelisthasnumberelse\settrue\setfalse\c_lists_has_number
+ \doifelsestructurelisthasnumber\settrue\setfalse\c_lists_has_number
\ifx\p_headnumber\v!yes
\settrue\c_lists_show_number
\else
@@ -818,6 +844,8 @@
% todo: provide packager via attributes
+\doinstallinjector\s!list
+
\installcorenamespace{listalternativemethods} % the general wrapper of a rendering
\startsetups[\??listrenderings:none]
@@ -845,12 +873,15 @@
% \stopsetups
\startsetups[\??listrenderings:generic]
+ \typo_injectors_check_list
\listparameter\c!before % can be \hskip
\edef\p_command{\listalternativeparameter\c!command}
\ifx\p_command\empty
\listalternativeparameter\c!before
\vbox {
\forgetall
+ \noindent % otherwise annotations are mirrored up
+ \typo_injectors_mark_list
\hbox \strc_lists_get_reference_attribute\v!all {
\ifconditional\c_lists_show_number
% \ifconditional\c_lists_has_page
@@ -878,6 +909,8 @@
}
\listalternativeparameter\c!after
\else
+ \noindent % otherwise annotations are mirrored up
+\typo_injectors_mark_list
\hbox \strc_lists_get_reference_attribute\v!all \strc_lists_get_destination_attribute {
\p_command\currentlistentrynumber\currentlistentrytitle\currentlistentrypagenumber
}
@@ -889,7 +922,8 @@
\startsetups[\??listrenderings:abc]
\endgraf % are we grouped?
-% \advance % yes or no ... \rightskip is also honored
+ \typo_injectors_check_list
+ % \advance % yes or no ... \rightskip is also honored
\leftskip\listparameter\c!margin % after \endgraf !
\listparameter\c!before
\endgraf
@@ -908,7 +942,8 @@
\scratchwidth\p_width
\fi
\fi\fi
- \noindent
+ \noindent % otherwise annotations are mirrored up
+ \typo_injectors_mark_list
\hbox \strc_lists_get_reference_attribute\v!all \strc_lists_get_destination_attribute {
\setlocalhsize
\hsize\localhsize
@@ -952,6 +987,8 @@
\hsize\scratchhsize
\usealignparameter\listparameter
\ifdim\scratchwidth<\hsize
+ % we have leftskip so we'd better just skip back instead of messing
+ % with hang*
\edef\p_hang{\listparameter\c!hang}
\hangindent\dimexpr\wd\b_strc_lists_number+\scratchdistance\relax
\hangafter\ifx\p_hang\v!no\zerocount\else\plusone\fi
@@ -964,7 +1001,7 @@
\scratchdistance\zeropoint
\fi
\parindent\zeropoint
- \dontleavehmode
+ \dontleavehmode % this nils hang: i need to figure out why
% % topaligned
%
% \scratchdimen\wd\b_strc_lists_number
@@ -1089,7 +1126,9 @@
\stopsetups
\startsetups[\??listrenderings:e]
- \noindent
+ \typo_injectors_check_list
+ \noindent % otherwise annotations are mirrored up
+ \typo_injectors_mark_list
\hbox \strc_lists_get_reference_attribute\v!all \strc_lists_get_destination_attribute {
\letlistparameter\c!depth\zeropoint
\letlistparameter\c!color\empty
@@ -1109,7 +1148,9 @@
\stopsetups
\startsetups[\??listrenderings:f]
- \noindent
+ \typo_injectors_check_list
+ \noindent % otherwise annotations are mirrored up
+ \typo_injectors_mark_list
\hbox \strc_lists_get_reference_attribute\v!all \strc_lists_get_destination_attribute {
\dosetraggedhbox{\listparameter\c!align}%
\raggedbox {
@@ -1127,7 +1168,9 @@
\stopsetups
\startsetups[\??listrenderings:g]
- \noindent
+ \typo_injectors_check_list
+ \noindent % otherwise annotations are mirrored up
+ \typo_injectors_mark_list
\hbox \strc_lists_get_reference_attribute\v!all \strc_lists_get_destination_attribute {
\midaligned {
\strc_lists_set_style_color\c!style\c!color\v!all
@@ -1148,19 +1191,119 @@
\definelistalternative
[\v!interactive]
- [\c!renderingsetup=\??listrenderings:interactive]
+ [\c!renderingsetup=\??listrenderings:interactive,
+ \c!before=\endgraf, % new per 2014-11-08
+ \c!after=\endgraf] % new per 2014-11-08
\startsetups[\??listrenderings:interactive]
- \edef\p_command{\listalternativeparameter\c!command}%
- \ifx\p_command\empty
- [\currentlist: \currentlistentrynumber\space -- \currentlistentrytitle\space -- \currentlistentrypagenumber]%
- \else
- \listparameter\c!before
- \hbox \strc_lists_get_reference_attribute\v!all \strc_lists_get_destination_attribute {
- \p_command\currentlistentrynumber\currentlistentrytitle\currentlistentrypagenumber
- }
- \listparameter\c!after
- \fi
+ \edef\p_command{\listalternativeparameter\c!command}%
+ \typo_injectors_check_list
+ \listparameter\c!before
+ \noindent % otherwise annotations are mirrored up
+ \typo_injectors_mark_list
+ \hbox \strc_lists_get_reference_attribute\v!all \strc_lists_get_destination_attribute {
+ \ifx\p_command\empty
+ [
+ \currentlist:\space
+ \currentlistentrynumber
+ \space\emdash\space
+ \currentlistentrytitle
+ \space\emdash\space
+ \currentlistentrypagenumber
+ ]
+ \else
+ \p_command\currentlistentrynumber\currentlistentrytitle\currentlistentrypagenumber
+ \fi
+ }
+ \listparameter\c!after
+\stopsetups
+
+%D One special for publications (as Alan loves to hangindent). No fonts and
+%D such (for now). No interaction either as that is dealt with elsewhere.
+%D
+%D \currentlistsymbol
+%D \currentlistentry
+%D \currentlistentrypagenumber % not really used
+
+\definelistalternative
+ [\v!paragraph]
+ [\c!filler=\hskip.25\emwidth,
+ \c!renderingsetup=\??listrenderings:\v!paragraph]
+
+\startsetups[\??listrenderings:\v!paragraph]
+ \endgraf % are we grouped?
+ \typo_injectors_check_list % ?
+ \listparameter\c!before
+ \endgraf
+ \begingroup
+ \forgetall
+ \noindent
+ \parindent\zeropoint
+ \edef\p_width{\listparameter\c!width}%
+ \edef\p_distance{\listparameter\c!distance}% we are nice for bib users
+ \edef\p_margin{\listparameter\c!margin}% we are nice for bib users
+ \ifx\p_distance\v!none
+ \scratchdistance\zeropoint
+ \else
+ \scratchdistance\p_distance
+ \fi
+ \ifx\p_margin\v!none
+ \scratchoffset\zeropoint
+ \else
+ \scratchoffset\p_margin
+ \fi
+ \ifx\p_width\v!fit
+ \scratchwidth\zeropoint
+ \leftskip\scratchoffset
+ \else
+ \scratchwidth\p_width
+ \ifdim\scratchoffset=\zeropoint
+ \leftskip\dimexpr\scratchwidth+\scratchdistance\relax
+ \else
+ \leftskip\scratchoffset
+ \fi
+ \fi
+ \usealignparameter\listparameter
+ \hskip-\leftskip
+ \ifconditional\c_lists_has_number
+ \ifconditional\c_lists_show_number
+ \setbox\scratchbox
+ \ifzeropt\scratchwidth
+ \hbox
+ \else
+ \simplealignedbox\scratchwidth{\listparameter\c!numberalign}
+ \fi
+ \bgroup
+ \useliststyleandcolor\c!numberstyle\c!numbercolor
+ \currentlistsymbol
+ \egroup
+ \ifdim\wd\scratchbox>\zeropoint
+ \box\scratchbox
+ \hskip\scratchdistance\relax
+ \fi
+ \fi
+ \fi
+ \begingroup
+ \useliststyleandcolor\c!textstyle\c!textcolor
+ \setstrut
+ \begstrut
+ \currentlistentrytitle
+ \endstrut
+ \endgroup
+ \ifconditional\c_lists_has_page
+ \ifconditional\c_lists_show_page
+ \nobreak
+ \listalternativeparameter\c!filler\relax
+ \begingroup
+ \useliststyleandcolor\c!pagestyle\c!pagecolor
+ \currentlistentrypagenumber
+ \endgroup
+ \fi
+ \fi
+ \endgraf
+ \endgroup
+ \allowbreak
+ \listparameter\c!after
\stopsetups
%D List elements are packaged in such a way that we can click on them
@@ -1303,7 +1446,7 @@
\let\listlength\!!zerocount
\else
\setupcurrentlist[#settings]%
- \strc_lists_analyze{#list}{\listparameter\c!criterium}{\listparameter\c!number}%
+ \strc_lists_analyze{#list}{\listparameter\c!criterium}{\listparameter\c!reference}%
\normalexpanded{\endgroup\noexpand\edef\noexpand\listlength{\structurelistsize}}%
\fi
\strc_lists_set_mode}
diff --git a/Master/texmf-dist/tex/context/base/strc-mar.lua b/Master/texmf-dist/tex/context/base/strc-mar.lua
index 9c6259de4c4..3af9113bf85 100644
--- a/Master/texmf-dist/tex/context/base/strc-mar.lua
+++ b/Master/texmf-dist/tex/context/base/strc-mar.lua
@@ -10,12 +10,14 @@ if not modules then modules = { } end modules ['strc-mar'] = {
-- todo: only commands.* print to tex, native marks return values
local insert, concat = table.insert, table.concat
-local tostring, next, rawget = tostring, next, rawget
+local tostring, next, rawget, type = tostring, next, rawget, type
local lpegmatch = lpeg.match
local context = context
local commands = commands
+local implement = interfaces.implement
+
local allocate = utilities.storage.allocate
local setmetatableindex = table.setmetatableindex
@@ -29,7 +31,6 @@ local getprev = nuts.getprev
local getid = nuts.getid
local getlist = nuts.getlist
local getattr = nuts.getattr
-local setattr = nuts.setattr
local getbox = nuts.getbox
local traversenodes = nuts.traverse
@@ -217,7 +218,11 @@ local function resolve(t,k)
end
function marks.define(name,settings)
- settings = settings or { }
+ if not settings then
+ settings = { }
+ elseif type(settings) == "string" then
+ settings = { parent = settings }
+ end
data[name] = settings
local parent = settings.parent
if parent == nil or parent == "" or parent == name then
@@ -712,20 +717,17 @@ end
-- interface
-commands.markingtitle = marks.title
-commands.markingnumber = marks.number
-
-commands.definemarking = marks.define
-commands.relatemarking = marks.relate
-commands.setmarking = marks.set
-commands.resetmarking = marks.reset
-commands.synchronizemarking = marks.synchronize
-commands.getmarking = marks.fetch
-commands.fetchonemark = marks.fetchonemark
-commands.fetchtwomarks = marks.fetchtwomarks
-commands.fetchallmarks = marks.fetchallmarks
-
-function commands.doifelsemarking(str) -- can be shortcut
- commands.doifelse(marks.exists(str))
-end
+implement { name = "markingtitle", actions = marks.title, arguments = { "string", "string" } }
+implement { name = "markingnumber", actions = marks.number, arguments = { "string", "string" } }
+
+implement { name = "definemarking", actions = marks.define, arguments = { "string", "string" } }
+implement { name = "relatemarking", actions = marks.relate, arguments = { "string", "string" } }
+implement { name = "setmarking", actions = marks.set, arguments = { "string", "string" } }
+implement { name = "resetmarking", actions = marks.reset, arguments = { "string" } }
+implement { name = "synchronizemarking", actions = marks.synchronize, arguments = { "string", "integer", "string" } }
+implement { name = "getmarking", actions = marks.fetch, arguments = { "string", "string", "string" } }
+implement { name = "fetchonemark", actions = marks.fetchonemark, arguments = { "string", "string", "string" } }
+implement { name = "fetchtwomarks", actions = marks.fetchtwomarks, arguments = { "string", "string" } }
+implement { name = "fetchallmarks", actions = marks.fetchallmarks, arguments = { "string", "string" } }
+implement { name = "doifelsemarking", actions = { marks.exists, commands.doifelse }, arguments = "string" }
diff --git a/Master/texmf-dist/tex/context/base/strc-mar.mkiv b/Master/texmf-dist/tex/context/base/strc-mar.mkiv
index 3685b66a702..8bd8c094e44 100644
--- a/Master/texmf-dist/tex/context/base/strc-mar.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-mar.mkiv
@@ -56,35 +56,31 @@
\unexpanded\def\synchronizemarking{\dotripleargument\strc_markings_synchronize}
\appendtoks
- \ctxcommand{definemarking("\currentmarking",{ parent = "\currentmarkingparent" })}%
+ \clf_definemarking{\currentmarking}{\currentmarkingparent}%
\to \everydefinemarking
\def\strc_markings_relate[#1][#2]%
- {\ctxcommand{relatemarking("#1","#2")}}
+ {\clf_relatemarking{#1}{#2}}
\def\strc_markings_set[#1]#2%
{\ifconditional\inhibitsetmarking
% nothing
\else
\doifelse{\namedmarkingparameter{#1}\c!expansion}\v!yes
- {\ctxcommand{setmarking("#1",\!!bs#2\!!es)}}
- {\ctxcommand{setmarking("#1",\!!bs\detokenize{#2}\!!es)}}%
+ {\clf_setmarking{#1}{#2}}
+ {\clf_setmarking{#1}{\detokenize{#2}}}%
\fi}
\def\strc_markings_reset[#1]%
- {\ctxcommand{resetmarking("#1")}}
+ {\clf_resetmarking{#1}}
\def\strc_markings_synchronize[#1][#2][#3]% #1=class #2=boxnumber (some day also name) #3=options, maybe second argument table
- {\ifvoid#2\else\ctxcommand{synchronizemarking("#1",\number#2,"#3")}\fi}
+ {\ifvoid#2\else\clf_synchronizemarking{#1}#2{#3}\fi}
-% \def\doifelsemarking#1% why no \unexpanded
-% {\ctxcommand{doifelsemarking("#1")}}
+\def\doifelsemarking#1% no \noexpanded
+ {\clf_doifelsemarking{#1}}
-% \def\doifelsemarking#1%
-% {\normalexpanded{\noexpand\ctxcommand{doifelsemarking("\noexpand\detokenize{#1}")}}}
-
-\def\doifelsemarking#1%
- {\ctxcommand{doifelsemarking(\!!bs#1\!!es)}}
+\let\doifmarkingelse \doifelsemarking
% \appendtoks
% \strc_markings_synchronize[\v!page][\normalpagebox][\v!keep]% keep if no marks
@@ -116,25 +112,25 @@
\setsystemmode\v!marking
\the\everymarking
\ifthirdargument
- \ctxcommand{getmarking("#1","#2","#3")}%
+ \clf_getmarking{#1}{#2}{#3}%
\else
- \ctxcommand{getmarking("#1","\v!page","#2")}%
+ \clf_getmarking{#1}{\v!page}{#2}%
\fi
\endgroup}}
% the fetchers are fully expandable: [name][method]
-\def\fetchonemark[#1]#2[#3]{\ifconditional\inhibitgetmarking\else\ctxcommand{fetchonemark ("#1","\v!page","#2")}\fi}
-\def\fetchtwomarks [#1]{\ifconditional\inhibitgetmarking\else\ctxcommand{fetchtwomarks("#1","\v!page")}\fi}
-\def\fetchallmarks [#1]{\ifconditional\inhibitgetmarking\else\ctxcommand{fetchallmarks("#1","\v!page")}\fi}
+\def\fetchonemark[#1]#2[#3]{\ifconditional\inhibitgetmarking\else\clf_fetchonemark {#1}{\v!page}{#2}\fi}
+\def\fetchtwomarks [#1]{\ifconditional\inhibitgetmarking\else\clf_fetchtwomarks{#1}{\v!page}\fi}
+\def\fetchallmarks [#1]{\ifconditional\inhibitgetmarking\else\clf_fetchallmarks{#1}{\v!page}\fi}
\let\fetchmark\fetchonemark
% also fully expandable but here we have: [name][range][method]
-\def\fetchonemarking[#1]#2[#3]#4[#5]{\ifconditional\inhibitgetmarking\else\ctxcommand{fetchonemark ("#1","#3","#5")}\fi}
-\def\fetchtwomarkings [#1]#2[#3]{\ifconditional\inhibitgetmarking\else\ctxcommand{fetchtwomarks("#1","#3")}\fi}
-\def\fetchallmarkings [#1]#2[#3]{\ifconditional\inhibitgetmarking\else\ctxcommand{fetchallmarks("#1","#3")}\fi}
+\def\fetchonemarking[#1]#2[#3]#4[#5]{\ifconditional\inhibitgetmarking\else\clf_fetchonemark {#1}{#3}{#5}\fi}
+\def\fetchtwomarkings [#1]#2[#3]{\ifconditional\inhibitgetmarking\else\clf_fetchtwomarks{#1}{#3}\fi}
+\def\fetchallmarkings [#1]#2[#3]{\ifconditional\inhibitgetmarking\else\clf_fetchallmarks{#1}{#3}\fi}
\let\fetchmarking\fetchonemarking
diff --git a/Master/texmf-dist/tex/context/base/strc-mat.lua b/Master/texmf-dist/tex/context/base/strc-mat.lua
index 98b1e996c3c..87f35ed1d3a 100644
--- a/Master/texmf-dist/tex/context/base/strc-mat.lua
+++ b/Master/texmf-dist/tex/context/base/strc-mat.lua
@@ -6,28 +6,35 @@ if not modules then modules = { } end modules ['strc-mat'] = {
license = "see context related readme files"
}
+----- copytable = table.copy
+
local structures = structures
-local lists = structures.lists
-local sections = structures.sections
-local floats = structures.floats
-local helpers = structures.helpers
-local formulas = structures.formulas
+local lists = structures.lists
+local sections = structures.sections
+local floats = structures.floats
+local helpers = structures.helpers
+local formulas = structures.formulas -- not used but reserved
-lists.enhancers = lists.enhancers or { }
+----- context = context
+----- simplify = helpers.simplify
-- maybe we want to do clever things with formulas, the store might go away
-local formuladata = { }
-
-function formulas.store(data)
- formuladata[#formuladata+1] = data
- context(#formuladata)
-end
-
-function formulas.current()
- return formuladata[#formuladata]
-end
+-- local formuladata = { }
+--
+-- function formulas.store(data)
+-- formuladata[#formuladata+1] = data
+-- context(#formuladata)
+-- end
+--
+-- function formulas.current()
+-- return formuladata[#formuladata]
+-- end
+
+-- function formulas.simplify(entry)
+-- return simplify(copytable(entry or formuladata[#formuladata]))
+-- end
function helpers.formulanumber(data,spec)
if data then
@@ -38,10 +45,9 @@ function helpers.formulanumber(data,spec)
end
end
-function formulas.simplify(entry)
- return helpers.simplify(table.copy(entry or formuladata[#formuladata]))
-end
-
function lists.formulanumber(name,n,spec)
- helpers.formulanumber(lists.result[n])
+ local result = lists.result
+ if result then
+ helpers.formulanumber(result[n])
+ end
end
diff --git a/Master/texmf-dist/tex/context/base/strc-mat.mkiv b/Master/texmf-dist/tex/context/base/strc-mat.mkiv
index 18cb005cbea..22fa5488910 100644
--- a/Master/texmf-dist/tex/context/base/strc-mat.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-mat.mkiv
@@ -360,7 +360,7 @@
\def\strc_formulas_handle_sub_numbering_indeed
{\let\strc_formulas_handle_sub_numbering\relax % else error: see math/numbering-001.tex
- \doiftextelse\currentsubformulasuffix
+ \doifelsetext\currentsubformulasuffix
{\strc_counters_setown_sub\v!formula\plustwo\currentsubformulasuffix}
{\strc_counters_increment_sub\v!formula\plustwo}%
\placecurrentformulanumber}
@@ -528,7 +528,7 @@
\unexpanded\def\strc_formulas_start_formula_indeed[#1][#2]% setting leftskip adaption is slow !
{\bgroup % HERE
\def\currentformula{#1}%
- \dostarttagged\t!formula\currentformula
+ \dostarttaggedchained\t!formula\currentformula\??formula
\the\everybeforedisplayformula
\d_strc_formulas_display_skip_par\parskip\relax
%\formulastrutdp\strutdepth
@@ -564,7 +564,7 @@
\unexpanded\def\strc_formulas_start_formula_nested#1%
{\bgroup
\let\strc_formulas_stop_formula\strc_formulas_stop_formula_nested
- \dostarttagged\t!subformula}
+ \dostarttagged\t!subformula\empty}
\unexpanded\def\strc_formulas_stop_formula_nested
{\dostoptagged
@@ -835,14 +835,14 @@
\def\strc_formulas_place[#1]%
{\def\currentplaceformulareference{#1}%
\let\currentplaceformulasuffix\empty
- \doifnextbgroupelse\strc_formulas_place_yes\strc_formulas_place_nop\strc_formulas_place_nop} % [ref]{}
+ \doifelsenextbgroup\strc_formulas_place_yes\strc_formulas_place_nop\strc_formulas_place_nop} % [ref]{}
\def\strc_formulas_place_yes#1%
{\def\currentplaceformulasuffix{#1}%
\strc_formulas_place_nop}
\def\strc_formulas_place_nop
- {\doifnextcharelse$\strc_formulas_place_pickup\strc_formulas_place_indeed} % [ref]$$ [ref]\start
+ {\doifelsenextchar$\strc_formulas_place_pickup\strc_formulas_place_indeed} % [ref]$$ [ref]\start
\def\strc_formulas_place_indeed
{\strc_formulas_place_numbering}
diff --git a/Master/texmf-dist/tex/context/base/strc-not.lua b/Master/texmf-dist/tex/context/base/strc-not.lua
index 40b78d59f8b..71eccf1cec2 100644
--- a/Master/texmf-dist/tex/context/base/strc-not.lua
+++ b/Master/texmf-dist/tex/context/base/strc-not.lua
@@ -38,6 +38,8 @@ local variables = interfaces.variables
local context = context
local commands = commands
+local implement = interfaces.implement
+
-- state: store, insert, postpone
local function store(tag,n)
@@ -69,9 +71,11 @@ end
notes.store = store
-function commands.storenote(tag,n)
- context(store(tag,n))
-end
+implement {
+ name = "storenote",
+ actions = { store, context },
+ arguments = { "string", "integer" }
+}
local function get(tag,n) -- tricky ... only works when defined
local nd = notedata[tag]
@@ -108,9 +112,11 @@ end
notes.listindex = listindex
-function commands.notelistindex(tag,n)
- context(listindex(tag,n))
-end
+implement {
+ name = "notelistindex",
+ actions = { listindex, context },
+ arguments = { "string", "integer" }
+}
local function setstate(tag,newkind)
local state = notestates[tag]
@@ -144,18 +150,28 @@ end
notes.setstate = setstate
notes.getstate = getstate
-commands.setnotestate = setstate
+implement {
+ name = "setnotestate",
+ actions = setstate,
+ arguments = { "string", "string" }
+}
-function commands.getnotestate(tag)
- context(getstate(tag))
-end
+implement {
+ name = "getnotestate",
+ actions = { getstate, context },
+ arguments = "string"
+}
function notes.define(tag,kind,number)
local state = setstate(tag,kind)
state.number = number
end
-commands.definenote = notes.define
+implement {
+ name = "definenote",
+ actions = notes.define,
+ arguments = { "string", "string", "integer" }
+}
function notes.save(tag,newkind)
local state = notestates[tag]
@@ -184,8 +200,8 @@ function notes.restore(tag,forcedstate)
end
end
-commands.savenote = notes.save
-commands.restorenote = notes.restore
+implement { name = "savenote", actions = notes.save, arguments = { "string", "string" } }
+implement { name = "restorenote", actions = notes.restore, arguments = { "string", "string" } }
local function hascontent(tag)
local ok = notestates[tag]
@@ -205,9 +221,11 @@ end
notes.hascontent = hascontent
-function commands.doifnotecontent(tag)
- commands.doif(hascontent(tag))
-end
+implement {
+ name = "doifnotecontent",
+ actions = { hascontent, commands.doif },
+ arguments = "string",
+}
local function internal(tag,n)
local nd = get(tag,n)
@@ -243,9 +261,11 @@ end
notes.doifonsamepageasprevious = onsamepageasprevious
-function commands.doifnoteonsamepageasprevious(tag)
- commands.doifelse(onsamepageasprevious(tag))
-end
+implement {
+ name = "doifnoteonsamepageasprevious",
+ actions = { onsamepageasprevious, commands.doifelse },
+ arguments = "string",
+}
function notes.checkpagechange(tag) -- called before increment !
local nd = notedata[tag] -- can be unset at first entry
@@ -277,7 +297,10 @@ function notes.postpone()
end
end
-commands.postponenotes = notes.postpone
+implement {
+ name = "postponenotes",
+ actions = notes.postpone
+}
function notes.setsymbolpage(tag,n,l)
local l = l or listindex(tag,n)
@@ -297,7 +320,11 @@ function notes.setsymbolpage(tag,n,l)
end
end
-commands.setnotesymbolpage = notes.setsymbolpage
+implement {
+ name = "setnotesymbolpage",
+ actions = notes.setsymbolpage,
+ arguments = { "string", "integer" }
+}
local function getsymbolpage(tag,n)
local li = internal(tag,n)
@@ -351,11 +378,11 @@ notes.getsymbolpage = getsymbolpage
notes.getnumberpage = getnumberpage
notes.getdeltapage = getdeltapage
-function commands.notesymbolpage(tag,n) context(getsymbolpage(tag,n)) end
-function commands.notenumberpage(tag,n) context(getnumberpage(tag,n)) end
-function commands.notedeltapage (tag,n) context(getdeltapage (tag,n)) end
+implement { name = "notesymbolpage", actions = { getsymbolpage, context }, arguments = { "string", "integer" } }
+implement { name = "notenumberpage", actions = { getnumberpage, context }, arguments = { "string", "integer" } }
+implement { name = "notedeltapage", actions = { getdeltapage, context }, arguments = { "string", "integer" } }
-function commands.flushnotes(tag,whatkind,how) -- store and postpone
+local function flushnotes(tag,whatkind,how) -- store and postpone
local state = notestates[tag]
local kind = state.kind
if kind == whatkind then
@@ -411,15 +438,26 @@ function commands.flushnotes(tag,whatkind,how) -- store and postpone
end
end
-function commands.flushpostponednotes()
+local function flushpostponednotes()
if trace_notes then
report_notes("flushing all postponed notes")
end
for tag, _ in next, notestates do
- commands.flushnotes(tag,"postpone")
+ flushnotes(tag,"postpone")
end
end
+implement {
+ name = "flushpostponednotes",
+ actions = flushpostponednotes
+}
+
+implement {
+ name = "flushnotes",
+ actions = flushnotes,
+ arguments = { "string", "string", "string" }
+}
+
function notes.resetpostponed()
if trace_notes then
report_notes("resetting all postponed notes")
@@ -432,13 +470,17 @@ function notes.resetpostponed()
end
end
-function commands.notetitle(tag,n)
- command.savedlisttitle(tag,notedata[tag][n])
-end
+implement {
+ name = "notetitle",
+ actions = function(tag,n) lists.savedlisttitle(tag,notedata[tag][n]) end,
+ arguments = { "string", "integer" }
+}
-function commands.noteprefixednumber(tag,n,spec)
- commands.savedlistprefixednumber(tag,notedata[tag][n])
-end
+implement {
+ name = "noteprefixednumber",
+ actions = function(tag,n) lists.savedlistprefixednumber(tag,notedata[tag][n]) end,
+ arguments = { "string", "integer" }
+}
function notes.internalid(tag,n)
local nd = get(tag,n)
diff --git a/Master/texmf-dist/tex/context/base/strc-not.mkvi b/Master/texmf-dist/tex/context/base/strc-not.mkvi
index 60ab66c980f..25a1072a3e7 100644
--- a/Master/texmf-dist/tex/context/base/strc-not.mkvi
+++ b/Master/texmf-dist/tex/context/base/strc-not.mkvi
@@ -170,7 +170,7 @@
\ifx\p_counter\empty %
\let\p_counter\currentnotation
\fi
- \doifcounterelse\p_counter\donothing{\strc_notes_define_counter\p_counter}%
+ \doifelsecounter\p_counter\donothing{\strc_notes_define_counter\p_counter}%
\letnotationparameter\s!counter\p_counter
%\strc_notes_setup_counter\currentnotation
\to \everydefinenotation
@@ -181,6 +181,7 @@
\unexpanded\setvalue{\??constructioninitializer\v!notation}%
{\let\currentnotation \currentconstruction
\let\constructionparameter \notationparameter
+ \let\constructionnamespace \??notation
\let\detokenizedconstructionparameter\detokenizednotationparameter
\let\letconstructionparameter \letnotationparameter
\let\useconstructionstyleandcolor \usenotationstyleandcolor
@@ -231,7 +232,7 @@
\ifnotesenabled
\strc_counters_increment_sub\currentconstructionnumber\currentconstructionlevel
\fi
- \doifnextoptionalcselse\strc_notations_command_yes\strc_notations_command_nop}
+ \doifelsenextoptionalcs\strc_notations_command_yes\strc_notations_command_nop}
\unexpanded\def\strc_notations_command_nop#title%
{\strc_constructions_register[\c!label={\descriptionparameter\c!text},\c!reference=,\c!title={#title},\c!bookmark=,\c!list=][]%
@@ -240,7 +241,7 @@
\normalexpanded{\endgroup\noteparameter\c!next}}
\unexpanded\def\strc_notations_command_yes[#optional]%
- {\doifassignmentelse{#optional}\strc_notations_command_assignment\strc_notations_command_argument[#optional]}
+ {\doifelseassignment{#optional}\strc_notations_command_assignment\strc_notations_command_argument[#optional]}
\unexpanded\def\strc_notations_command_assignment[#settings]%
{\strc_constructions_register[\c!label={\descriptionparameter\c!text},\c!reference=,\c!title=,\c!bookmark=,\c!list=,#settings][]%
@@ -278,7 +279,7 @@
\normalexpanded % not that efficient but also not that frequently used (\normaldef for parser)
{\def\noexpand\strc_pickup_yes[#one]#two\csname\e!stop#stoptag\endcsname{\strc_notations_command_yes[#one]{#two}}%
\def\noexpand\strc_pickup_nop #one\csname\e!stop#stoptag\endcsname{\strc_notations_command_nop {#one}}}%
- \doifnextoptionalcselse\strc_pickup_yes\strc_pickup_nop}
+ \doifelsenextoptionalcs\strc_pickup_yes\strc_pickup_nop}
\unexpanded\def\strc_notations_start_yes[#reference]#title%
{\strc_constructions_register[\c!label={\descriptionparameter\c!text},\c!reference={#reference},\c!title={#title},\c!bookmark=,\c!list=][]%
@@ -382,7 +383,7 @@
\appendtoks
\ifx\currentnoteparent\empty
- \doifinsertionelse\currentnote
+ \doifelseinsertion\currentnote
\donothing
{\defineinsertion[\currentnote]% could be an option
\normalexpanded{\t_strc_notes{\the\t_strc_notes\noexpand\strc_notes_process_list{\currentnote}}}}%
@@ -392,7 +393,7 @@
\setexpandednoteparameter\s!insert{\namednoteparameter\currentnoteparent\s!insert}%
\definenotation[\currentnote][\currentnoteparent][\c!type=\v!note]%
\fi
- \ctxcommand{definenote("\currentnote","insert",\number\currentnoteinsertionnumber)}%
+ \clf_definenote{\currentnote}{insert}\currentnoteinsertionnumber\relax
\to \everydefinenote
% maybe we will share this at some point:
@@ -437,7 +438,7 @@
\strc_notes_inject_dummy
\else
\begingroup
- \edef\currentnotenumber{\ctxcommand{storenote("\currentnote",\currentconstructionlistentry)}}%
+ \edef\currentnotenumber{\clf_storenote{\currentnote}\currentconstructionlistentry}%
\settrue\processingnote
\ifconditional\c_strc_notes_skip
\globallet\lastnotesymbol\strc_notes_inject_symbol_nop
@@ -519,7 +520,7 @@
\endcsname}
\setvalue{\??noteinteractioninline\v!yes}%
- {\strc_references_get_simple_page_reference{page(\ctxcommand{notenumberpage("\currentnote",\currentnotenumber)})}%
+ {\strc_references_get_simple_page_reference{page(\clf_notenumberpage{\currentnote}\currentnotenumber)}%
\edef\strc_notes_get_reference_attribute_symbol{attr\referenceattribute\currentreferenceattribute}%
\let \strc_notes_set_style_color_inline \strc_notes_set_style_color_inline_yes}
@@ -539,7 +540,7 @@
% page(...) : we could have a dedicated one
\setvalue{\??noteinteractiondisplay\v!yes}%
- {\strc_references_get_simple_page_reference{page(\ctxcommand{notesymbolpage("\currentnote",\currentnotenumber)})}%
+ {\strc_references_get_simple_page_reference{page(\clf_notesymbolpage{\currentnote}\currentnotenumber)}%
\edef\strc_notes_set_reference_attribute_number{\attribute\referenceattribute\currentreferenceattribute}%
\let \strc_notes_set_reference_attribute_text \donothing
\let \strc_notes_set_destination_attribute_text\donothing
@@ -552,7 +553,7 @@
\let\strc_notes_set_style_color_display \strc_notes_set_style_color_display_nop}
\setvalue{\??noteinteractiondisplay\v!all}%
- {\strc_references_get_simple_page_reference{page(\ctxcommand{notesymbolpage("\currentnote",\currentnotenumber)})}%
+ {\strc_references_get_simple_page_reference{page(\clf_notesymbolpage{\currentnote}\currentnotenumber)}%
\edef\strc_notes_set_reference_attribute_text {\attribute\referenceattribute\currentreferenceattribute}%
%\strc_references_set_simple_page_reference{note:\cldcontext{structures.notes.internalid("\currentnote",\currentnotenumber)}}%
\strc_references_set_simple_page_reference{note:\currentnote:\currentnotenumber}%
@@ -561,7 +562,7 @@
\let \strc_notes_set_style_color_display \strc_notes_set_style_color_display_yes}
\setvalue{\??noteinteractiondisplay\v!text}%
- {\strc_references_get_simple_page_reference{page(\ctxcommand{notesymbolpage("\currentnote",\currentnotenumber)})}%
+ {\strc_references_get_simple_page_reference{page(\clf_notesymbolpage{\currentnote}\currentnotenumber)}%
\edef\strc_notes_set_reference_attribute_text {\attribute\referenceattribute\currentreferenceattribute}%
%\strc_references_set_simple_page_reference{note:\cldcontext{structures.notes.internalid("\currentnote",\currentnotenumber)}}%
\strc_references_set_simple_page_reference{note:\currentnote:\currentnotenumber}%
@@ -586,7 +587,7 @@
{\iftrialtypesetting
% keep
\else\ifx\currentcolorparameter\empty
- \scratchcounter\ctxcommand{notedeltapage("\currentnote",\currentnotenumber)}\relax % todo calculate once
+ \scratchcounter\clf_notedeltapage{\currentnote}\currentnotenumber\relax % todo calculate once
\setlocationcolorspecified\scratchcounter
\fi\fi}
@@ -605,7 +606,7 @@
% in mkii the pointer only showed up in pagewise notes
\unexpanded\def\strc_notes_inject_pointer % todo calculate once
- {\ifcase\ctxcommand{notedeltapage("\currentnote",\currentnotenumber)}\relax
+ {\ifcase\clf_notedeltapage{\currentnote}\currentnotenumber\relax\relax
% unknown
\or
% same page
@@ -638,7 +639,7 @@
\unexpanded\def\strc_notes_inject_symbol_indeed#synchronize%
{\removeunwantedspaces
- \doifitalicelse\/\donothing % Charles IV \footnote{the fourth}
+ \doifelseitalic\/\donothing % Charles IV \footnote{the fourth}
\ifdim\lastkern=\notesignal
% \kern\noteparameter\c!distance % yes or no note font? or main text
\strc_notes_inject_separator
@@ -654,18 +655,18 @@
\hbox \strc_notes_get_reference_attribute_symbol \bgroup
\dostarttagged\t!descriptionsymbol\currentnote
\dotagsetnotesymbol
- \noteparameter\c!textcommand{\ctxcommand{noteprefixednumber("\currentnote",\currentnotenumber)}}%
+ \noteparameter\c!textcommand{\clf_noteprefixednumber{\currentnote}\currentnotenumber\relax}%
% the next one can cycle so we need to make sure it has no advance width
\doif{\noteparameter\c!indicator}\v!yes\strc_notes_inject_pointer
\dostoptagged
\egroup
\endgroup
- \dostoptagged % check
+% \dostoptagged % check
\globallet\lastnotesymbol\relax}
\unexpanded\def\strc_notes_inject_dummy % temp hack
{\removeunwantedspaces
- \doifitalicelse\/\donothing % Charles IV \footnote{the fourth}
+ \doifelseitalic\/\donothing % Charles IV \footnote{the fourth}
\ifdim\lastkern=\notesignal
% \kern\noteparameter\c!distance % yes or no note font? or main text
\strc_notes_inject_separator
@@ -1029,7 +1030,7 @@
\def\strc_notes_set_location_text % we don't use inserts anyway (e.g. endnotes)
{\settrue\c_strc_notes_delayed
- \ctxcommand{setnotestate("\currentnote","store")}%
+ \clf_setnotestate{\currentnote}{store}%
\page_inserts_set_location\currentnoteinsertion\v!text % \setupinsertion[\currentnote][\c!location=\v!text]%
\global\count\currentnoteinsertionnumber\zerocount
\global\dimen\currentnoteinsertionnumber\maxdimen
@@ -1181,6 +1182,7 @@
\insert\currentnoteinsertionnumber\bgroup
\the\everyinsidenoteinsert\relax
\usesetupsparameter\noteparameter % experimental
+ \useinterlinespaceparameter\noteparameter
\doifelse{\noteparameter\c!paragraph}\v!yes
{\nointerlineskip
\startvboxtohboxseparator
@@ -1203,7 +1205,7 @@
\edef\currentnote{#tag}%
\strc_constructions_initialize{#tag}%
\strc_notes_synchronize
- \edef\currentconstructionlistentry{\ctxcommand{notelistindex("\currentnote",#id)}}% index in list cache
+ \edef\currentconstructionlistentry{\clf_notelistindex{\currentnote}#id}% index in list cache
% as we can have collected notes (e.g. in tables) we need to recover
% \currentdescriptionattribute and \currentdescriptionsynchronize
%
@@ -1217,14 +1219,14 @@
\begstrut
\strc_references_flush_destination_nodes
\strc_notes_set_destination_attribute_text
- \strc_notes_inject_text
- \endstrut
+ \strc_notes_inject_text\relax
+ \ifvmode\obeydepth\else\endstrut\fi % \obeydepth is new per 2015-01-10
\strc_constructions_stored_stop
% \endgroup
}
\unexpanded\def\strc_notes_inject_text % hm main?
- {\ctxcommand{savedlisttitle("\currentconstructionmain",\currentconstructionlistentry)}}
+ {\clf_savedlisttitle{\currentconstructionmain}\currentconstructionlistentry\relax}
\let\startpushnote\relax
\let\stoppushnote \relax
@@ -1297,7 +1299,7 @@
\noteparameter\c!before
\fi
% \bgroup
- % \setupalign[\noteparameter\c!align]%
+ % \usealignparameter\noteparameter
\placenoterule % alleen in ..mode
% \par
% \egroup
@@ -1353,11 +1355,14 @@
% idea: tag with attr and then just flush them again
\def\strc_notes_flush_global
- {\doifelse{\noteparameter\c!paragraph}\v!yes
+ {\begingroup
+ \useinterlinespaceparameter\noteparameter
+ \doifelse{\noteparameter\c!paragraph}\v!yes
{\vbox\starthboxestohbox
\iftrialtypesetting\unvcopy\else\unvbox\fi\currentnoteinsertionnumber
\stophboxestohbox}
- {\iftrialtypesetting\unvcopied\else\unvboxed\fi\currentnoteinsertionnumber}}
+ {\iftrialtypesetting\unvcopied\else\unvboxed\fi\currentnoteinsertionnumber}%
+ \endgroup}
%D Supporting end notes is surprisingly easy. Even better, we
%D can combine this feature with solving the common \TEX\
@@ -1395,7 +1400,7 @@
{\ifconditional\postponingnotes\else
\global\settrue\postponingnotes
\global\let\flushnotes\doflushnotes
- \ctxcommand{postponenotes()}%
+ \clf_postponenotes
\fi}
\let\flushnotes\relax
@@ -1405,7 +1410,7 @@
\begingroup
\let\flushnotes \relax
\let\postponenotes\relax
- \ctxcommand{flushpostponednotes()}% this also resets the states !
+ \clf_flushpostponednotes% this also resets the states !
\global\setfalse\postponednote
\global\setfalse\postponingnotes
\global\let\flushnotes\relax
@@ -1452,20 +1457,20 @@
\strc_counters_save{#tag}%
\strc_counters_reset{#tag}%
\fi
- \ctxcommand{savenote("#tag","store")}}
+ \clf_savenote{#tag}{store}}
\def\strc_notes_local_stop_step#tag%
{\p_strc_notes_continue{\noteparameter\c!continue}%
\ifx\p_strc_notes_continue\v!yes \else
\strc_counters_restore{#tag}%
\fi
- \ctxcommand{restorenote("#tag")}}
+ \clf_restorenote{#tag}}
\unexpanded\def\placelocalnotes
{\dodoubleempty\strc_notes_local_place}
\def\strc_notes_local_place[#tag][#settings]%
- {\doif{\ctxcommand{getnotestate("#tag")}}{store}{\strc_notes_local_place_indeed{#settings}{#tag}}}
+ {\doif{\clf_getnotestate{#tag}}{store}{\strc_notes_local_place_indeed{#settings}{#tag}}}
\def\strc_notes_local_place_indeed#settings#tag%
{\begingroup
@@ -1525,7 +1530,7 @@
\def\strc_notes_place_indeed#settings#tag% settings note
{\edef\currentnote{#tag}% grouping ?
- \doifelse{\ctxcommand{getnotestate("#tag")}}{store}
+ \doifelse{\clf_getnotestate{#tag}}{store}
\strc_notes_local_place_indeed
\strc_notes_global_place_indeed
{#settings}{#tag}}
@@ -1545,7 +1550,7 @@
{\setvalue{\??notealternative#alternative}{#command}}
\unexpanded\def\doifnotescollected#tag%
- {\ctxcommand{doifnotecontent("#tag")}}
+ {\clf_doifnotecontent{#tag}}
\def\strc_notes_place_local_alternative % will be a setup (wrapper)
{\doifnotescollected\currentnote
@@ -1572,7 +1577,7 @@
% setups ?
-\def\flushlocalnotes#tag{\ctxcommand{flushnotes("#tag","store","\noteparameter\c!criterium")}}
+\def\flushlocalnotes#tag{\clf_flushnotes{#tag}{store}{\noteparameter\c!criterium}}
\installnotealternative \v!none
{\flushlocalnotes\currentnote}
@@ -1597,7 +1602,7 @@
\setupcurrentnote[\c!location=]%
\inheritednoteframed
{\edef\currentnotewidth{\noteparameter\c!width}%
- \doifdimensionelse\currentnotewidth\donothing
+ \doifelsedimension\currentnotewidth\donothing
{\edef\currentnotewidth{\the\hsize}}%
\startsimplecolumns[\c!distance=\noteparameter\c!columndistance,\c!n=\noteparameter\c!n,\c!width=\currentnotewidth]%
\flushlocalnotes\currentnote
@@ -1722,8 +1727,8 @@
\def\strc_notes_set_bodyfont
{\let\strc_notes_set_bodyfont\relax
\restoreglobalbodyfont
- \switchtobodyfont[\noteparameter\c!bodyfont]%
- \setupalign[\noteparameter\c!align]}
+ \usebodyfontparameter\noteparameter
+ \usealignparameter\noteparameter}
%D The footnote mechanism defaults to a traditional one
%D column way of showing them. By default we precede them by
@@ -1764,7 +1769,9 @@
%D }
%D \stoptyping
-\def\doifnoteonsamepageelse[#tag]{\ctxcommand{doifnoteonsamepageasprevious("#tag")}}
+\def\doifelsenoteonsamepage[#tag]{\clf_doifnoteonsamepageasprevious{#tag}}
+
+\let\doifnoteonsamepageelse\doifelsenoteonsamepage
%D New trickery:
@@ -1829,4 +1836,24 @@
% [ownnote]
% [\ownnotesymbol]
+% tricky:
+%
+% \enabletrackers[nodes.areas]
+% \enabletrackers[nodes.references]
+% \enabletrackers[nodes.destinations]
+%
+% \setupnotes[interaction=all,rule=no]
+% \setupinteraction[state=start,focus=standard]
+%
+% \starttext
+% \goto{\input tufte\relax}[page(2)] \par
+% \ruledhbox{\gotobox{\vtop{\input tufte\relax}}[page(2)]} \par
+% \ruledhbox{\gotobox{\vbox{\input tufte\relax}}[page(2)]} \par
+% % \completecontent
+% % \chapter{Chapter}
+% % \dorecurse{5}{\input knuth}
+% a\footnote{\input tufte\par\input ward\relax}
+% \stoptext
+
\protect \endinput
+
diff --git a/Master/texmf-dist/tex/context/base/strc-num.lua b/Master/texmf-dist/tex/context/base/strc-num.lua
index e1fc6003071..0203334fff6 100644
--- a/Master/texmf-dist/tex/context/base/strc-num.lua
+++ b/Master/texmf-dist/tex/context/base/strc-num.lua
@@ -20,6 +20,8 @@ local setmetatableindex = table.setmetatableindex
local trace_counters = false trackers.register("structures.counters", function(v) trace_counters = v end)
local report_counters = logs.reporter("structure","counters")
+local implement = interfaces.implement
+
local structures = structures
local helpers = structures.helpers
local sections = structures.sections
@@ -199,6 +201,24 @@ local function allocate(name,i) -- can be metatable
return ci
end
+local pattern = lpeg.P(variables.by)^-1 * lpeg.C(lpeg.P(1)^1)
+local lpegmatch = lpeg.match
+
+function counters.way(way)
+ if not way or way == "" then
+ return ""
+ else
+ return lpegmatch(pattern,way)
+ end
+end
+
+implement {
+ name = "way",
+ actions = { counters.way, context },
+ arguments = "string"
+}
+
+
function counters.record(name,i)
return allocate(name,i or 1)
end
@@ -376,10 +396,8 @@ local function check(name,data,start,stop)
end
end
-counters.reset = reset
-counters.set = set
-function counters.setown(name,n,value)
+local function setown(name,n,value)
local cd = counterdata[name]
if cd then
local d = allocate(name,n)
@@ -397,7 +415,7 @@ function counters.setown(name,n,value)
end
end
-function counters.restart(name,n,newstart,noreset)
+local function restart(name,n,newstart,noreset)
local cd = counterdata[name]
if cd then
newstart = tonumber(newstart)
@@ -425,7 +443,7 @@ function counters.restore(name)
end
end
-function counters.add(name,n,delta)
+local function add(name,n,delta)
local cd = counterdata[name]
if cd and (cd.state == v_start or cd.state == "") then
local data = cd.data
@@ -494,7 +512,12 @@ local function get(name,n,key)
end
end
-counters.get = get
+counters.reset = reset
+counters.set = set
+counters.add = add
+counters.get = get
+counters.setown = setown
+counters.restart = restart
function counters.value(name,n) -- what to do with own
return get(name,n or 1,'number') or 0
@@ -553,24 +576,7 @@ end
-- interfacing
-commands.definecounter = counters.define
-commands.setcounter = counters.set
-commands.setowncounter = counters.setown
-commands.resetcounter = counters.reset
-commands.restartcounter = counters.restart
-commands.savecounter = counters.save
-commands.restorecounter = counters.restore
-commands.addcounter = counters.add
-
-commands.rawcountervalue = function(...) context(counters.raw (...)) end
-commands.countervalue = function(...) context(counters.value (...)) end
-commands.lastcountervalue = function(...) context(counters.last (...)) end
-commands.firstcountervalue = function(...) context(counters.first (...)) end
-commands.nextcountervalue = function(...) context(counters.next (...)) end
-commands.prevcountervalue = function(...) context(counters.previous(...)) end
-commands.subcountervalues = function(...) context(counters.subs (...)) end
-
-function commands.showcounter(name)
+local function showcounter(name)
local cd = counterdata[name]
if cd then
context("[%s:",name)
@@ -583,17 +589,11 @@ function commands.showcounter(name)
end
end
-function commands.doifelsecounter(name) commands.doifelse(counterdata[name]) end
-function commands.doifcounter (name) commands.doif (counterdata[name]) end
-function commands.doifnotcounter (name) commands.doifnot (counterdata[name]) end
-
-function commands.incrementedcounter(...) context(counters.add(...)) end
-
-- the noreset is somewhat messy ... always false messes up e.g. itemize but true the pagenumbers
--
-- if this fails i'll clean up this still somewhat experimental mechanism (but i need use cases)
-function commands.checkcountersetup(name,level,start,state)
+local function checkcountersetup(name,level,start,state)
local noreset = true -- level > 0 -- was true
counters.restart(name,1,start,noreset) -- was true
counters.setstate(name,state)
@@ -601,6 +601,70 @@ function commands.checkcountersetup(name,level,start,state)
sections.setchecker(name,level,counters.reset)
end
+--
+
+implement { name = "addcounter", actions = add, arguments = { "string", "integer", "integer" } }
+implement { name = "setcounter", actions = set, arguments = { "string", 1, "integer" } }
+implement { name = "setowncounter", actions = setown, arguments = { "string", 1, "string" } }
+implement { name = "restartcounter", actions = restart, arguments = { "string", 1, "integer" } }
+implement { name = "resetcounter", actions = reset, arguments = { "string", 1 } }
+implement { name = "incrementcounter", actions = add, arguments = { "string", 1, 1 } }
+implement { name = "decrementcounter", actions = add, arguments = { "string", 1, -1 } }
+
+implement { name = "setsubcounter", actions = set, arguments = { "string", "integer", "integer" } }
+implement { name = "setownsubcounter", actions = setown, arguments = { "string", "integer", "string" } }
+implement { name = "restartsubcounter", actions = restart, arguments = { "string", "integer", "integer" } }
+implement { name = "resetsubcounter", actions = reset, arguments = { "string", "integer" } }
+implement { name = "incrementsubcounter", actions = add, arguments = { "string", "integer", 1 } }
+implement { name = "decrementsubcounter", actions = add, arguments = { "string", "integer", -1 } }
+
+implement { name = "rawcountervalue", actions = { counters.raw , context }, arguments = { "string", 1 } }
+implement { name = "countervalue", actions = { counters.value , context }, arguments = { "string", 1 } }
+implement { name = "lastcountervalue", actions = { counters.last , context }, arguments = { "string", 1 } }
+implement { name = "firstcountervalue", actions = { counters.first , context }, arguments = { "string", 1 } }
+implement { name = "nextcountervalue", actions = { counters.next , context }, arguments = { "string", 1 } }
+implement { name = "prevcountervalue", actions = { counters.previous, context }, arguments = { "string", 1 } }
+implement { name = "subcountervalues", actions = { counters.subs , context }, arguments = { "string", 1 } }
+
+implement { name = "rawsubcountervalue", actions = { counters.raw , context }, arguments = { "string", "integer" } }
+implement { name = "subcountervalue", actions = { counters.value , context }, arguments = { "string", "integer" } }
+implement { name = "lastsubcountervalue", actions = { counters.last , context }, arguments = { "string", "integer" } }
+implement { name = "firstsubcountervalue", actions = { counters.first , context }, arguments = { "string", "integer" } }
+implement { name = "nextsubcountervalue", actions = { counters.next , context }, arguments = { "string", "integer" } }
+implement { name = "previoussubcountervalue", actions = { counters.previous, context }, arguments = { "string", "integer" } }
+implement { name = "subsubcountervalues", actions = { counters.subs , context }, arguments = { "string", "integer" } }
+
+implement { name = "savecounter", actions = counters.save, arguments = "string" }
+implement { name = "restorecounter", actions = counters.restore, arguments = "string" }
+
+implement { name = "incrementedcounter", actions = { add, context }, arguments = { "string", 1, 1 } }
+implement { name = "decrementedcounter", actions = { add, context }, arguments = { "string", 1, -1 } }
+
+implement { name = "showcounter", actions = showcounter, arguments = "string" } -- todo
+implement { name = "checkcountersetup", actions = checkcountersetup, arguments = { "string", "integer", "integer", "string" } }
+
+table.setmetatablecall(counterdata,function(t,k) return t[k] end)
+
+implement { name = "doifelsecounter", actions = { counterdata, commands.doifelse }, arguments = "string" }
+implement { name = "doifcounter", actions = { counterdata, commands.doif }, arguments = "string" }
+implement { name = "doifnotcounter", actions = { counterdata, commands.doifnot }, arguments = "string" }
+
+implement {
+ name = "definecounter",
+ actions = counters.define,
+ arguments = {
+ {
+ { "name" } ,
+ { "start", "integer" },
+ { "counter" },
+ { "method" },
+ }
+ }
+}
+
+------------------------------------------------------------------
+------------------------------------------------------------------
+
-- -- move to strc-pag.lua
--
-- function counters.analyze(name,counterspecification)
diff --git a/Master/texmf-dist/tex/context/base/strc-num.mkiv b/Master/texmf-dist/tex/context/base/strc-num.mkiv
index 6802027e67b..58095b8e7d9 100644
--- a/Master/texmf-dist/tex/context/base/strc-num.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-num.mkiv
@@ -27,7 +27,9 @@
\installcommandhandler \??counter {counter} \??counter
-\let\setupstructurecounting\setupcounter
+\let\setupcounters\setupcounter
+
+\let\setupstructurecounting\setupcounter % will disappear
\setupcounter
[\c!way=\v!by\v!chapter,
@@ -41,7 +43,7 @@
\c!state=\v!start]
\def\autostructureprefixsegments#1% todo: \c!prefixsegments=\v!auto
- {2:\thenamedheadlevel{\ctxcommand{way("#1\c!way")}}}
+ {2:\thenamedheadlevel{\clf_way{#1\c!way}}}
\appendtoks
\resetcounterparameter\s!counter
@@ -50,15 +52,16 @@
\appendtoks
\ifx\currentcounterparent\empty
\edef\p_start{\counterparameter\c!start}%
- \ctxcommand{definecounter {
- name = "\currentcounter",
- start = \ifx\p_start\empty0\else\number\p_start\fi,
- counter = "\counterparameter\s!counter",
- method = "\counterparameter\c!method",
- }}%
+ \clf_definecounter
+ name {\currentcounter}%
+ start \ifx\p_start\empty\zerocount\else\numexpr\p_start\relax\fi
+ counter {\counterparameter\s!counter}%
+ method {\counterparameter\c!method}%
+ \relax
\letcounterparameter\s!name\currentcounter
\else
- \letcounterparameter\s!name\currentcounterparent
+ % \letcounterparameter\s!name\currentcounterparent % we need a chained clone
+ \setexpandedcounterparameter\s!name{\namedcounterparameter\currentcounterparent\s!name}%
\fi
\strc_counters_check_setup
\to \everydefinecounter
@@ -67,7 +70,7 @@
\ifx\currentcounter\empty \else
\edef\p_number{\counterparameter\c!number}%
\ifx\p_number\empty \else
- \ctxcommand{setcounter("\counterparameter\s!name",1,\number\p_number)}%
+ \clf_setcounter{\counterparameter\s!name}\numexpr\p_number\relax
\letcounterparameter\c!number\empty
\fi
\edef\p_start{\counterparameter\c!start}%
@@ -78,40 +81,28 @@
% % % %
-\def\strc_counters_way#1% slow, we need to store it at the tex end
- {\ctxcommand{way("\namedcounterparameter{#1}\c!way")}}
-
-% \def\thenamedcounterlevel#1%
-% {\thenamedheadlevel{\strc_counters_way{#1}}}
+\def\strc_counters_way#1{\clf_way{\namedcounterparameter{#1}\c!way}}
\def\thenamedcounterlevel#1%
- {\xthenamedheadlevel{\strc_counters_way{#1}}}
-
-% \def\strc_counters_check_setup#1% does it have to happen here?
-% {% this can be done at the lua end / a bit messy here ... todo ...
-% \ifcsname\??counter#1\c!number\endcsname
-% \doifelsevalue {\??counter#1\c!number}{#1} {\letbeundefined{\??counter#1\c!number}}%
-% {\doifvaluenothing{\??counter#1\c!number} {\letbeundefined{\??counter#1\c!number}}}%
-% \fi
-% \ifcsname\??counter#1\c!number\endcsname
-% % it's a clone
-% \else
-% \edef\currentcounterlevel{\thenamedcounterlevel{#1}}%
-% \edef\p_start{\counterparameter{#1}\c!start}%
-% \ctxcommand{checkcountersetup("#1",\currentcounterlevel,\ifx\p_start\empty0\else\number\p_start\fi,"\counterparameter{#1}\c!state")}%
-% \fi}
+ {\xthenamedheadlevel{\clf_way{\namedcounterparameter{#1}\c!way}}}
-\def\strc_counters_check_setup
+\unexpanded\def\strc_counters_check_setup
{\edef\p_name{\directcounterparameter\s!name}%
\ifx\currentcounter\p_name
\edef\currentcounterlevel{\thenamedcounterlevel\currentcounter}%
\edef\p_start{\counterparameter\c!start}%
- \ctxcommand{checkcountersetup("\currentcounter",\currentcounterlevel,\ifx\p_start\empty0\else\number\p_start\fi,"\counterparameter\c!state")}%
+ \clf_checkcountersetup
+ {\currentcounter}%
+ \numexpr\currentcounterlevel\relax
+ \numexpr\ifx\p_start\empty\zerocount\else\p_start\fi\relax % bug in scanner
+ {\counterparameter\c!state}%
\fi}
-\unexpanded\def\doifcounterelse #1{\ctxcommand{doifelsecounter("\namedcounterparameter{#1}\s!name")}}
-\unexpanded\def\doifcounter #1{\ctxcommand{doifcounter ("\namedcounterparameter{#1}\s!name")}}
-\unexpanded\def\doifnotcounter #1{\ctxcommand{doifnotcounter ("\namedcounterparameter{#1}\s!name")}}
+\unexpanded\def\doifelsecounter #1{\clf_doifelsecounter{\namedcounterparameter{#1}\s!name}}
+\unexpanded\def\doifcounter #1{\clf_doifcounter {\namedcounterparameter{#1}\s!name}}
+\unexpanded\def\doifnotcounter #1{\clf_doifnotcounter {\namedcounterparameter{#1}\s!name}}
+
+\let\doifcounterelse\doifelsecounter
\unexpanded\def\setcounter {\dotripleempty \strc_counters_set_interfaced}
\unexpanded\def\setcounterown {\dotripleempty \strc_counters_setown_interfaced}
@@ -252,90 +243,90 @@
\expandafter\gobbleoneoptional
\fi}
-\def\strc_counters_set_two [#1][#2][#3]{\strc_counters_set_sub {#1}{#2}{#3}}
-\def\strc_counters_setown_two [#1][#2][#3]{\strc_counters_setown_sub {#1}{#2}{#3}}
-\def\strc_counters_restart_two [#1][#2][#3]{\strc_counters_restart_sub {#1}{#2}{#3}}
-\def\strc_counters_reset_two [#1][#2]{\strc_counters_reset_sub {#1}{#2}}
-\def\strc_counters_increment_two [#1][#2]{\strc_counters_increment_sub{#1}{#2}}
-\def\strc_counters_decrement_two [#1][#2]{\strc_counters_decrement_sub{#1}{#2}}
-
-\def\strc_counters_raw_two [#1][#2]{\strc_counters_raw_sub {#1}{#2}}
-\def\strc_counters_last_two [#1][#2]{\strc_counters_last_sub {#1}{#2}}
-\def\strc_counters_first_two [#1][#2]{\strc_counters_first_sub {#1}{#2}}
-\def\strc_counters_next_two [#1][#2]{\strc_counters_next_sub {#1}{#2}}
-\def\strc_counters_prev_two [#1][#2]{\strc_counters_prev_sub {#1}{#2}}
-\def\strc_counters_subs_two [#1][#2]{\strc_counters_subs_sub {#1}{#2}}
-
-\def\strc_counters_set_one [#1][#2][#3]{\strc_counters_set_sub {#1}\plusone{#2}}
-\def\strc_counters_setown_one [#1][#2][#3]{\strc_counters_setown_sub {#1}\plusone{#2}}
-\def\strc_counters_restart_one [#1][#2][#3]{\strc_counters_restart_sub {#1}\plusone{#2}}
-\def\strc_counters_reset_one [#1][#2]{\strc_counters_reset_sub {#1}\plusone}
-\def\strc_counters_increment_one [#1][#2]{\strc_counters_increment_sub{#1}\plusone}
-\def\strc_counters_decrement_one [#1][#2]{\strc_counters_decrement_sub{#1}\plusone}
-
-\def\strc_counters_raw_one [#1][#2]{\strc_counters_raw_sub {#1}\plusone}
-\def\strc_counters_last_one [#1][#2]{\strc_counters_last_sub {#1}\plusone}
-\def\strc_counters_first_one [#1][#2]{\strc_counters_first_sub {#1}\plusone}
-\def\strc_counters_next_one [#1][#2]{\strc_counters_next_sub {#1}\plusone}
-\def\strc_counters_prev_one [#1][#2]{\strc_counters_prev_sub {#1}\plusone}
-\def\strc_counters_subs_one [#1][#2]{\strc_counters_subs_sub {#1}\plusone}
-
-\def\strc_counters_save_one [#1]{\strc_counters_save {#1}}
-\def\strc_counters_restore_one [#1]{\strc_counters_restore {#1}}
-
-\unexpanded\def\strc_counters_set #1#2{\strc_counters_set_sub {#1}\plusone{#2}}
-\unexpanded\def\strc_counters_setown #1#2{\strc_counters_setown_sub {#1}\plusone{#2}}
-\unexpanded\def\strc_counters_restart #1#2{\strc_counters_restart_sub {#1}\plusone{#2}}
-\unexpanded\def\strc_counters_reset #1{\strc_counters_reset_sub {#1}\plusone}
-\unexpanded\def\strc_counters_increment #1{\strc_counters_increment_sub{#1}\plusone}
-\unexpanded\def\strc_counters_decrement #1{\strc_counters_decrement_sub{#1}\plusone}
-
- \def\strc_counters_raw #1{\strc_counters_raw_sub {#1}\plusone}
- \def\strc_counters_last #1{\strc_counters_last_sub {#1}\plusone}
- \def\strc_counters_first #1{\strc_counters_first_sub {#1}\plusone}
- \def\strc_counters_next #1{\strc_counters_next_sub {#1}\plusone}
- \def\strc_counters_prev #1{\strc_counters_prev_sub {#1}\plusone}
- \def\strc_counters_subs #1{\strc_counters_subs_sub {#1}\plusone}
-
-\unexpanded\def\strc_counters_set_sub #1#2#3{\ctxcommand{setcounter ("\namedcounterparameter{#1}\s!name",\number#2,\number#3)}}
-\unexpanded\def\strc_counters_setown_sub #1#2#3{\ctxcommand{setowncounter ("\namedcounterparameter{#1}\s!name",\number#2,"#3")}}
-\unexpanded\def\strc_counters_restart_sub #1#2#3{\ctxcommand{restartcounter("\namedcounterparameter{#1}\s!name",\number#2,\number#3)}}
-\unexpanded\def\strc_counters_reset_sub #1#2{\ctxcommand{resetcounter ("\namedcounterparameter{#1}\s!name",\number#2)}}
-\unexpanded\def\strc_counters_increment_sub #1#2{\ctxcommand{addcounter ("\namedcounterparameter{#1}\s!name",\number#2,1)}}
-\unexpanded\def\strc_counters_decrement_sub #1#2{\ctxcommand{addcounter ("\namedcounterparameter{#1}\s!name",\number#2,-1)}}
-
- \def\strc_counters_raw_sub #1#2{\ctxcommand{countervalue ("\namedcounterparameter{#1}\s!name",\number#2)}} % maybe raw
- \def\strc_counters_last_sub #1#2{\ctxcommand{lastcountervalue ("\namedcounterparameter{#1}\s!name",\number#2)}}
- \def\strc_counters_first_sub #1#2{\ctxcommand{firstcountervalue ("\namedcounterparameter{#1}\s!name",\number#2)}}
- \def\strc_counters_next_sub #1#2{\ctxcommand{nextcountervalue ("\namedcounterparameter{#1}\s!name",\number#2)}}
- \def\strc_counters_prev_sub #1#2{\ctxcommand{previouscountervalue("\namedcounterparameter{#1}\s!name",\number#2)}}
- \def\strc_counters_subs_sub #1#2{\ctxcommand{subcountervalues ("\namedcounterparameter{#1}\s!name",\number#2)}}
-
-\unexpanded\def\strc_counters_save #1{\ctxcommand{savecounter ("\namedcounterparameter{#1}\s!name")}}
-\unexpanded\def\strc_counters_restore #1{\ctxcommand{restorecounter("\namedcounterparameter{#1}\s!name")}}
-
-\unexpanded\def\strc_counters_incremented #1{\ctxcommand{incrementedcounter("\namedcounterparameter{#1}\s!name",1, 1)}}
-\unexpanded\def\strc_counters_decremented #1{\ctxcommand{incrementedcounter("\namedcounterparameter{#1}\s!name",1,-1)}}
-
-\unexpanded\def\showcounter [#1]{\ctxcommand{tracecounter("\namedcounterparameter{#1}\s!name")}}
-
-\unexpanded\def\incrementedcounter [#1]{\strc_counters_incremented{#1}} % expandable, no \dosingleargument
-\unexpanded\def\decrementedcounter [#1]{\strc_counters_decremented{#1}} % expandable, no \dosingleargument
+\def\strc_counters_set_two [#1][#2][#3]{\clf_setsubcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax\numexpr#3\relax}
+\def\strc_counters_setown_two [#1][#2][#3]{\clf_setownsubcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax{#3}}
+\def\strc_counters_restart_two [#1][#2][#3]{\clf_restartsubcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax\numexpr#3\relax}
+\def\strc_counters_reset_two [#1][#2]{\clf_resetsubcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax}
+\def\strc_counters_increment_two [#1][#2]{\clf_incrementsubcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax}
+\def\strc_counters_decrement_two [#1][#2]{\clf_decrementsubcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax}
+
+\def\strc_counters_raw_two [#1][#2]{\clf_subcountervalue {\namedcounterparameter{#1}\s!name}\numexpr#2\relax}
+\def\strc_counters_last_two [#1][#2]{\clf_lastsubcountervalue {\namedcounterparameter{#1}\s!name}\numexpr#2\relax}
+\def\strc_counters_first_two [#1][#2]{\clf_firstsubcountervalue {\namedcounterparameter{#1}\s!name}\numexpr#2\relax}
+\def\strc_counters_next_two [#1][#2]{\clf_nextsubcountervalue {\namedcounterparameter{#1}\s!name}\numexpr#2\relax}
+\def\strc_counters_prev_two [#1][#2]{\clf_previoussubcountervalue{\namedcounterparameter{#1}\s!name}\numexpr#2\relax}
+\def\strc_counters_subs_two [#1][#2]{\clf_subsubcountervalues {\namedcounterparameter{#1}\s!name}\numexpr#2\relax}
+
+\def\strc_counters_set_one [#1][#2][#3]{\clf_setcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax}
+\def\strc_counters_setown_one [#1][#2][#3]{\clf_setowncounter {\namedcounterparameter{#1}\s!name}{#2}}
+\def\strc_counters_restart_one [#1][#2][#3]{\clf_restartcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax}
+\def\strc_counters_reset_one [#1][#2]{\clf_resetcounter {\namedcounterparameter{#1}\s!name}}
+\def\strc_counters_increment_one [#1][#2]{\clf_incrementcounter {\namedcounterparameter{#1}\s!name}}
+\def\strc_counters_decrement_one [#1][#2]{\clf_decrementcounter {\namedcounterparameter{#1}\s!name}}
+
+\def\strc_counters_raw_one [#1][#2]{\clf_countervalue {\namedcounterparameter{#1}\s!name}}
+\def\strc_counters_last_one [#1][#2]{\clf_lastcountervalue {\namedcounterparameter{#1}\s!name}}
+\def\strc_counters_first_one [#1][#2]{\clf_firstcountervalue {\namedcounterparameter{#1}\s!name}}
+\def\strc_counters_next_one [#1][#2]{\clf_nextcountervalue {\namedcounterparameter{#1}\s!name}}
+\def\strc_counters_prev_one [#1][#2]{\clf_previouscountervalue {\namedcounterparameter{#1}\s!name}}
+\def\strc_counters_subs_one [#1][#2]{\clf_subcountervalues {\namedcounterparameter{#1}\s!name}}
+
+\def\strc_counters_save_one [#1]{\clf_savecounter {\namedcounterparameter{#1}\s!name}}
+\def\strc_counters_restore_one [#1]{\clf_restorecounter {\namedcounterparameter{#1}\s!name}}
+
+\unexpanded\def\strc_counters_set #1#2{\clf_setcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax}
+\unexpanded\def\strc_counters_setown #1#2{\clf_setowncounter {\namedcounterparameter{#1}\s!name}{#2}}
+\unexpanded\def\strc_counters_restart #1#2{\clf_restartcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax}
+\unexpanded\def\strc_counters_reset #1{\clf_resetcounter {\namedcounterparameter{#1}\s!name}}
+\unexpanded\def\strc_counters_increment #1{\clf_incrementcounter {\namedcounterparameter{#1}\s!name}}
+\unexpanded\def\strc_counters_decrement #1{\clf_decrementcounter {\namedcounterparameter{#1}\s!name}}
+
+ \def\strc_counters_raw #1{\clf_countervalue {\namedcounterparameter{#1}\s!name}}
+ \def\strc_counters_last #1{\clf_lastcountervalue {\namedcounterparameter{#1}\s!name}}
+ \def\strc_counters_first #1{\clf_firstcountervalue {\namedcounterparameter{#1}\s!name}}
+ \def\strc_counters_next #1{\clf_nextcountervalue {\namedcounterparameter{#1}\s!name}}
+ \def\strc_counters_prev #1{\clf_previouscountervalue {\namedcounterparameter{#1}\s!name}}
+ \def\strc_counters_subs #1{\clf_subcountervalues {\namedcounterparameter{#1}\s!name}}
+
+\unexpanded\def\strc_counters_set_sub #1#2#3{\clf_setsubcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax\numexpr#3\relax}
+\unexpanded\def\strc_counters_setown_sub #1#2#3{\clf_setownsubcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax{#3}}
+\unexpanded\def\strc_counters_restart_sub #1#2#3{\clf_restartsubcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax\numexpr#3\relax}
+\unexpanded\def\strc_counters_reset_sub #1#2{\clf_resetsubcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax}
+\unexpanded\def\strc_counters_increment_sub #1#2{\clf_incrementsubcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax}
+\unexpanded\def\strc_counters_decrement_sub #1#2{\clf_decrementsubcounter {\namedcounterparameter{#1}\s!name}\numexpr#2\relax}
+
+ \def\strc_counters_raw_sub #1#2{\clf_subcountervalue {\namedcounterparameter{#1}\s!name}\numexpr#2\relax} % maybe raw
+ \def\strc_counters_last_sub #1#2{\clf_lastsubcountervalue {\namedcounterparameter{#1}\s!name}\numexpr#2\relax}
+ \def\strc_counters_first_sub #1#2{\clf_firstsubcountervalue {\namedcounterparameter{#1}\s!name}\numexpr#2\relax}
+ \def\strc_counters_next_sub #1#2{\clf_nextsubcountervalue {\namedcounterparameter{#1}\s!name}\numexpr#2\relax}
+ \def\strc_counters_prev_sub #1#2{\clf_previoussubcountervalue{\namedcounterparameter{#1}\s!name}\numexpr#2\relax}
+ \def\strc_counters_subs_sub #1#2{\clf_subsubcountervalues {\namedcounterparameter{#1}\s!name}\numexpr#2\relax}
+
+\unexpanded\def\strc_counters_save #1{\clf_savecounter {\namedcounterparameter{#1}\s!name}}
+\unexpanded\def\strc_counters_restore #1{\clf_restorecounter {\namedcounterparameter{#1}\s!name}}
+
+\unexpanded\def\strc_counters_incremented #1{\clf_incrementedcounter {\namedcounterparameter{#1}\s!name}}
+\unexpanded\def\strc_counters_decremented #1{\clf_decrementedcounter {\namedcounterparameter{#1}\s!name}}
+
+\unexpanded\def\showcounter [#1]{\clf_showcounter {\namedcounterparameter{#1}\s!name}}
+
+\unexpanded\def\incrementedcounter [#1]{\clf_incrementedcounter {\namedcounterparameter{#1}\s!name}} % no \dosingleargument
+\unexpanded\def\decrementedcounter [#1]{\clf_decrementedcounter {\namedcounterparameter{#1}\s!name}} % no \dosingleargument
% public variants ... beware, for old cases, from now on the value variants are the
% ones that are expandable
-\def\rawcountervalue [#1]{\strc_counters_raw_sub {#1}\plusone}
-\def\lastcountervalue [#1]{\strc_counters_last_sub {#1}\plusone}
-\def\firstcountervalue[#1]{\strc_counters_first_sub{#1}\plusone}
-\def\nextcountervalue [#1]{\strc_counters_next_sub {#1}\plusone}
-\def\prevcountervalue [#1]{\strc_counters_prev_sub {#1}\plusone}
+\def\rawcountervalue [#1]{\clf_countervalue {\namedcounterparameter{#1}\s!name}}
+\def\lastcountervalue [#1]{\clf_lastcountervalue {\namedcounterparameter{#1}\s!name}}
+\def\firstcountervalue [#1]{\clf_firstcountervalue {\namedcounterparameter{#1}\s!name}}
+\def\nextcountervalue [#1]{\clf_nextcountervalue {\namedcounterparameter{#1}\s!name}}
+\def\prevcountervalue [#1]{\clf_previouscountervalue{\namedcounterparameter{#1}\s!name}}
-\let\rawsubcountervalue \strc_counters_raw_two
-\let\lastsubcountervalue \strc_counters_last_two
-\let\firstsubcountervalue\strc_counters_first_two
-\let\nextsubcountervalue \strc_counters_next_two
-\let\prevsubcountervalue \strc_counters_prev_two
+\let\rawsubcountervalue \strc_counters_raw_two
+\let\lastsubcountervalue \strc_counters_last_two
+\let\firstsubcountervalue \strc_counters_first_two
+\let\nextsubcountervalue \strc_counters_next_two
+\let\prevsubcountervalue \strc_counters_prev_two
% The bypage check needs a multipass reference and therefore we only check for it when we increment
% and know that some content will be placed. We could also check for spreads.
@@ -349,7 +340,7 @@
\strc_counters_reset{#1}%
\fi
\fi
- \ctxcommand{addcounter("\namedcounterparameter{#1}\s!name",\number#2,1)}}
+ \clf_incrementsubcounter{\namedcounterparameter{#1}\s!name}\numexpr#2\relax}
\unexpanded\def\convertedcounter
{\dodoubleempty\strc_counters_converted}
@@ -358,58 +349,58 @@
{\begingroup
\edef\currentcounter{#1}%
\ifsecondargument\setupcurrentcounter[#2]\fi
- \ctxcommand{prefixedconverted(
- "\counterparameter\s!name",
+ \clf_prefixedconverted
+ {\counterparameter\s!name}
{
- prefix = "\counterparameter\c!prefix",
- separatorset = "\counterparameter\c!prefixseparatorset",
- conversion = "\counterparameter\c!prefixconversion",
- conversionset = "\counterparameter\c!prefixconversionset",
- starter = \!!bs\counterparameter\c!prefixstarter\!!es,
- stopper = \!!bs\counterparameter\c!prefixstopper\!!es,
- set = "\counterparameter\c!prefixset",
- segments = "\counterparameter\c!prefixsegments",
- connector = \!!bs\counterparameter\c!prefixconnector\!!es,
- },
+ prefix {\counterparameter\c!prefix}
+ separatorset {\counterparameter\c!prefixseparatorset}
+ conversion {\counterparameter\c!prefixconversion}
+ conversionset {\counterparameter\c!prefixconversionset}
+ starter {\counterparameter\c!prefixstarter}
+ stopper {\counterparameter\c!prefixstopper}
+ set {\counterparameter\c!prefixset}
+ segments {\counterparameter\c!prefixsegments}
+ connector {\counterparameter\c!prefixconnector}
+ }
{
- order = "\counterparameter\c!numberorder",
- separatorset = "\counterparameter\c!numberseparatorset",
- conversion = \!!bs\counterparameter\c!numberconversion\!!es,
- conversionset = "\counterparameter\c!numberconversionset",
- starter = \!!bs\counterparameter\c!numberstarter\!!es,
- stopper = \!!bs\counterparameter\c!numberstopper\!!es,
- segments = "\counterparameter\c!numbersegments",
- type = "\counterparameter\c!type",
- criterium = "\counterparameter\c!criterium", % might change if we also want this with sectioning
+ order {\counterparameter\c!numberorder}
+ separatorset {\counterparameter\c!numberseparatorset}
+ conversion {\counterparameter\c!numberconversion}
+ conversionset {\counterparameter\c!numberconversionset}
+ starter {\counterparameter\c!numberstarter}
+ stopper {\counterparameter\c!numberstopper}
+ segments {\counterparameter\c!numbersegments}
+ type {\counterparameter\c!type}
+ criterium {\counterparameter\c!criterium}
}
- )}%
+ \relax
\endgroup}
\def\directconvertedcounter#1#2% name, type
- {\ctxcommand{prefixedconverted(
- "\namedcounterparameter{#1}\s!name",
+ {\clf_prefixedconverted
+ {\namedcounterparameter{#1}\s!name}
{
- prefix = "\namedcounterparameter{#1}\c!prefix",
- separatorset = "\namedcounterparameter{#1}\c!prefixseparatorset",
- conversion = "\namedcounterparameter{#1}\c!prefixconversion",
- conversionset = "\namedcounterparameter{#1}\c!prefixconversionset",
- % starter = \!!bs\namedcounterparameter{#1}\c!prefixstarter\!!es,
- % stopper = \!!bs\namedcounterparameter{#1}\c!prefixstopper\!!es,
- set = "\namedcounterparameter{#1}\c!prefixset",
- segments = "\namedcounterparameter{#1}\c!prefixsegments",
- connector = \!!bs\namedcounterparameter{#1}\c!prefixconnector\!!es,
- },
+ prefix {\namedcounterparameter{#1}\c!prefix}
+ separatorset {\namedcounterparameter{#1}\c!prefixseparatorset}
+ conversion {\namedcounterparameter{#1}\c!prefixconversion}
+ conversionset {\namedcounterparameter{#1}\c!prefixconversionset}
+ % starter {\namedcounterparameter{#1}\c!prefixstarter}
+ % stopper {\namedcounterparameter{#1}\c!prefixstopper}
+ set {\namedcounterparameter{#1}\c!prefixset}
+ segments {\namedcounterparameter{#1}\c!prefixsegments}
+ connector {\namedcounterparameter{#1}\c!prefixconnector}
+ }
{
- order = "\namedcounterparameter{#1}\c!numberorder",
- separatorset = "\namedcounterparameter{#1}\c!numberseparatorset",
- conversion = \!!bs\namedcounterparameter{#1}\c!numberconversion\!!es,
- conversionset = "\namedcounterparameter{#1}\c!numberconversionset",
- starter = \!!bs\namedcounterparameter{#1}\c!numberstarter\!!es,
- stopper = \!!bs\namedcounterparameter{#1}\c!numberstopper\!!es,
- segments = "\namedcounterparameter{#1}\c!numbersegments",
- type = "#2",
+ order {\namedcounterparameter{#1}\c!numberorder}
+ separatorset {\namedcounterparameter{#1}\c!numberseparatorset}
+ conversion {\namedcounterparameter{#1}\c!numberconversion}
+ conversionset {\namedcounterparameter{#1}\c!numberconversionset}
+ starter {\namedcounterparameter{#1}\c!numberstarter}
+ stopper {\namedcounterparameter{#1}\c!numberstopper}
+ segments {\namedcounterparameter{#1}\c!numbersegments}
+ type {#2}
}
- )}}
+ \relax}
\unexpanded\def\convertedsubcounter
{\dotripleempty\strc_counters_converted_sub}
@@ -444,7 +435,9 @@
\unexpanded\def\doifdefinedcounter {\doifcommandhandler \??counter}
\unexpanded\def\doifundefinedcounter {\doifnotcommandhandler \??counter}
-\unexpanded\def\doifdefinedcounterelse{\doifelsecommandhandler\??counter}
+\unexpanded\def\doifelsedefinedcounter{\doifelsecommandhandler\??counter}
+
+\let\doifdefinedcounterelse\doifelsedefinedcounter
%D What follows is a compatibility layer.
@@ -465,7 +458,8 @@
\let \doifdefinednumber \doifdefinedcounter % {number}{true}
\let \doifundefinednumber \doifnotdefinedcounter % {number}{true}
-\let \doifdefinednumberelse \doifdefinedcounterelse % {number}{true}{false}
+\let \doifelsedefinednumber \doifelsedefinedcounter % {number}{true}{false}
+\let \doifdefinednumberelse \doifelsedefinedcounter % {number}{true}{false}
\let \setupnumbering \setupcounter
@@ -487,7 +481,6 @@
% currentstructurecomponent => \strc_current_ or just \m_strc_
-
\unexpanded\def\strc_counters_register_component#1#2#3#4#5#6#7[#8][#9]% maybe also nolist
{\begingroup
%
@@ -525,27 +518,36 @@
\glet\m_strc_counters_last_registered_attribute \attributeunsetvalue
\glet\m_strc_counters_last_registered_synchronize\relax}
+\def\strc_counters_register_component_check_prefix
+ {\ifx\currentstructurecomponentreferenceprefix\empty
+ \let\currentstructurecomponentreferenceprefix\currentstructurereferenceprefix
+ \fi
+ \ifx\currentstructurecomponentreferenceprefix\empty
+ \let\currentstructurecomponentreferenceprefix\referenceprefix
+ \fi
+ \ifdefined\currentstructurecomponentreferenceprefix\else
+ \let\currentstructurecomponentreferenceprefix\empty
+ \fi}
+
\def\strc_counters_register_component_page#1%
{\xdef\currentstructurecomponentreference {#1\c!reference}%
\xdef\currentstructurecomponentreferenceprefix{#1\c!referenceprefix}%
- % maybe have a helper in strc-ref.mkvi
+ \strc_counters_register_component_check_prefix
\setnextinternalreference
- \ctxcommand{setreferenceattribute(% can be helper with less passed
- "\s!page",
- "\currentstructurecomponentreferenceprefix",
- "\currentstructurecomponentreference",
- {
- references = {
- internal = \nextinternalreference,
- block = "\currentsectionblock",
- section = structures.sections.currentid(),
- },
- metadata = {
- kind = "page",
- },
- },
- "\interactionparameter\c!focus")
- }%
+ \clf_setreferenceattribute
+ {%
+ references {%
+ internal \nextinternalreference
+ % block {\currentsectionblock}% move to lua
+ view {\interactionparameter\c!focus}%
+ prefix {\currentstructurecomponentreferenceprefix}%
+ reference {\currentstructurecomponentreference}%
+ }%
+ metadata {%
+ kind {\s!page}%
+ }%
+ }%
+ \relax
\xdef\m_strc_counters_last_registered_attribute {\the\lastdestinationattribute}%
\glet\m_strc_counters_last_registered_index \relax
\glet\m_strc_counters_last_registered_synchronize\relax}
@@ -559,6 +561,7 @@
\xdef\currentstructurecomponentlabel {#2\c!label}%
\xdef\currentstructurecomponentreference {#2\c!reference}%
\xdef\currentstructurecomponentreferenceprefix{#2\c!referenceprefix}%
+ \strc_counters_register_component_check_prefix
\ifx\currentstructurecomponentexpansion\s!xml
\xmlstartraw
\xdef\currentstructurecomponenttitle {#2\c!title}%
@@ -595,70 +598,71 @@
\fi
%
\setnextinternalreference
- \xdef\m_strc_counters_last_registered_index{\ctxcommand{addtolist{
- metadata = {
- kind = "#1",
- name = "\currentname",
- level = structures.sections.currentlevel(),
- catcodes = \the\ifx\currentstructurecomponentcatcodes\empty\catcodetable\else\csname\currentstructurecomponentcatcodes\endcsname\fi,
- coding = "\currentstructurecomponentcoding",
+ \scratchcounter\clf_addtolist %{
+ metadata {
+ kind {#1}
+ name {\currentname}
+ % level structures.sections.currentlevel()
+ catcodes \ifx\currentstructurecomponentcatcodes\empty\catcodetable\else\csname\currentstructurecomponentcatcodes\endcsname\fi
+ coding {\currentstructurecomponentcoding}
\ifx\currentstructurecomponentcoding\s!xml
- xmlroot = "\xmldocument",
+ xmlroot {\xmldocument}
\fi
\ifx\currentstructurecomponentxmlsetup\empty \else
- xmlsetup = "\currentstructurexmlsetup",
+ xmlsetup {\currentstructurexmlsetup}
\fi
- },
- references = {
- internal = \nextinternalreference,
- block = "\currentsectionblock",
- reference = "\currentstructurecomponentreference",
- referenceprefix = "\currentstructurecomponentreferenceprefix",
- section = structures.sections.currentid(),
- },
- titledata = {
- label = \!!bs\detokenize\expandafter{\currentstructurecomponentlabel }\!!es,
- title = \!!bs\detokenize\expandafter{\currentstructurecomponenttitle }\!!es,
+ }
+ references {
+ internal \nextinternalreference
+ % block {\currentsectionblock}
+ reference {\currentstructurecomponentreference}
+ prefix {\currentstructurecomponentreferenceprefix}
+ % section structures.sections.currentid()
+ }
+ titledata {
+ label {\detokenize\expandafter{\currentstructurecomponentlabel}}
+ title {\detokenize\expandafter{\currentstructurecomponenttitle}}
\ifx\currentstructurecomponentbookmark\currentstructurecomponenttitle \else
- bookmark = \!!bs\detokenize\expandafter{\currentstructurecomponentbookmark}\!!es,
+ bookmark {\detokenize\expandafter{\currentstructurecomponentbookmark}}
\fi
\ifx\currentstructurecomponentmarking\currentstructurecomponenttitle \else
- marking = \!!bs\detokenize\expandafter{\currentstructurecomponentmarking }\!!es,
+ marking {\detokenize\expandafter{\currentstructurecomponentmarking}}
\fi
\ifx\currentstructurecomponentlist\currentstructurecomponenttitle \else
- list = \!!bs\detokenize\expandafter{\currentstructurecomponentlist}\!!es,
+ list {\detokenize\expandafter{\currentstructurecomponentlist}}
\fi
- },
- \ifx\p_hasnumber\v!yes
- prefixdata = {
- prefix = "#2\c!prefix",
- separatorset = "#2\c!prefixseparatorset",
- conversion = \!!bs#2\c!prefixconversion\!!es,
- conversionset = "#2\c!prefixconversionset",
- set = "#2\c!prefixset",
- % segments = "#2\c!prefixsegments",
- segments = "\p_prefixsegments",
- connector = \!!bs#2\c!prefixconnector\!!es,
- },
- numberdata = { % more helpers here, like compact elsewhere
- numbers = structures.counters.compact("\currentcounter",nil,true),
- group = "#2\c!group",
- groupsuffix = \!!bs#2\c!groupsuffix\!!es,
- counter = "\currentcounter",
- separatorset = "#2\c!numberseparatorset",
- conversion = \!!bs#2\c!numberconversion\!!es,
- conversionset = "#2\c!numberconversionset",
- starter = \!!bs#2\c!numberstarter\!!es,
- stopper = \!!bs#2\c!numberstopper\!!es,
- segments = "#2\c!numbersegments",
- },
- \fi
- userdata = \!!bs\detokenize{#4}\!!es % will be converted to table at the lua end
- }
- }}%
- \ctxcommand{setinternalreference(nil,nil,\nextinternalreference)}%
+ }
+ \ifx\p_hasnumber\v!yes
+ prefixdata {
+ prefix {#2\c!prefix}
+ separatorset {#2\c!prefixseparatorset}
+ conversion {#2\c!prefixconversion}
+ conversionset {#2\c!prefixconversionset}
+ set {#2\c!prefixset}
+ % segments {#2\c!prefixsegments}
+ segments {\p_prefixsegments}
+ connector {#2\c!prefixconnector}
+ }
+ numberdata { % more helpers here, like compact elsewhere
+ numbers {\currentcounter}
+ group {#2\c!group}
+ groupsuffix {#2\c!groupsuffix}
+ counter {\currentcounter}
+ separatorset {#2\c!numberseparatorset}
+ conversion {#2\c!numberconversion}
+ conversionset {#2\c!numberconversionset}
+ starter {#2\c!numberstarter}
+ stopper {#2\c!numberstopper}
+ segments {#2\c!numbersegments}
+ }
+ \fi
+ userdata {\detokenize{#4}}
+ %}
+ \relax
+ \xdef\m_strc_counters_last_registered_index{\the\scratchcounter}%
+ \clf_setinternalreference internal \nextinternalreference\relax
\xdef\m_strc_counters_last_registered_attribute {\the\lastdestinationattribute}%
- \xdef\m_strc_counters_last_registered_synchronize{\ctxlatecommand{enhancelist(\m_strc_counters_last_registered_index)}}}
+ \xdef\m_strc_counters_last_registered_synchronize{\strc_lists_inject_enhance{\m_strc_counters_last_registered_index}{\nextinternalreference}}}
\let\m_strc_counters_last_registered_index \relax
\let\m_strc_counters_last_registered_attribute \relax
diff --git a/Master/texmf-dist/tex/context/base/strc-pag.lua b/Master/texmf-dist/tex/context/base/strc-pag.lua
index c294a464539..96d26e6f666 100644
--- a/Master/texmf-dist/tex/context/base/strc-pag.lua
+++ b/Master/texmf-dist/tex/context/base/strc-pag.lua
@@ -25,6 +25,7 @@ local counterdata = counters.data
local variables = interfaces.variables
local context = context
local commands = commands
+local implement = interfaces.implement
local processors = typesetters.processors
local applyprocessor = processors.apply
@@ -61,10 +62,12 @@ function pages.save(prefixdata,numberdata,extradata)
if trace_pages then
report_pages("saving page %s.%s",realpage,userpage)
end
+ local viewerprefix = extradata.viewerprefix
+ local state = extradata.state
local data = {
number = userpage,
- viewerprefix = extradata.viewerprefix,
- state = extradata.state,
+ viewerprefix = viewerprefix ~= "" and viewerprefix or nil,
+ state = state ~= "" and state or nil, -- maybe let "start" be default
block = sections.currentblock(),
prefixdata = prefixdata and helpers.simplify(prefixdata),
numberdata = numberdata and helpers.simplify(numberdata),
@@ -269,6 +272,24 @@ function pages.is_odd(n)
end
end
+function pages.on_right(n)
+ local pagemode = texgetcount("pageduplexmode")
+ if pagemode == 2 or pagemode == 1 then
+ n = n or texgetcount("realpageno")
+ if texgetcount("pagenoshift") % 2 == 0 then
+ return n % 2 == 0
+ else
+ return n % 2 ~= 0
+ end
+ else
+ return true
+ end
+end
+
+function pages.in_body(n)
+ return texgetcount("pagebodymode") > 0
+end
+
-- move to strc-pag.lua
function counters.analyze(name,counterspecification)
@@ -323,5 +344,58 @@ end
--
-commands.savepagedata = pages.save
-commands.prefixedconverted = sections.prefixedconverted -- weird place
+implement {
+ name = "savepagedata",
+ actions = pages.save,
+ arguments = {
+ {
+ { "prefix" },
+ { "separatorset" },
+ { "conversionset" },
+ { "conversion" },
+ { "set" },
+ { "segments" },
+ { "connector" },
+ },
+ {
+ { "conversionset" },
+ { "conversion" },
+ { "starter" },
+ { "stopper" },
+ },
+ {
+ { "viewerprefix" },
+ { "state" },
+ }
+ }
+}
+
+implement { -- weird place
+ name = "prefixedconverted",
+ actions = sections.prefixedconverted,
+ arguments = {
+ "string",
+ {
+ { "prefix" },
+ { "separatorset" },
+ { "conversionset" },
+ { "conversion" },
+ { "starter" },
+ { "stopper" },
+ { "set" },
+ { "segments" },
+ { "connector" },
+ },
+ {
+ { "order" },
+ { "separatorset" },
+ { "conversionset" },
+ { "conversion" },
+ { "starter" },
+ { "stopper" },
+ { "segments" },
+ { "type" },
+ { "criterium" },
+ }
+ }
+}
diff --git a/Master/texmf-dist/tex/context/base/strc-pag.mkiv b/Master/texmf-dist/tex/context/base/strc-pag.mkiv
index 6eddc0fba71..72f0cf32aa8 100644
--- a/Master/texmf-dist/tex/context/base/strc-pag.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-pag.mkiv
@@ -26,12 +26,14 @@
\countdef\subpageno \plustwo \subpageno \zerocount % !
\countdef\arrangeno \plusthree \arrangeno \zerocount % !
\countdef\pagenoshift\plusfour \pagenoshift\zerocount % !
+\countdef\lastpageno \plusfive \lastpageno \zerocount % !
\let\pageno\userpageno
\def\realfolio{\the\realpageno}
\def\userfolio{\the\userpageno}
\def\subfolio {\the\subpageno }
+\def\lastfolio{\the\lastpageno}
\newtoks\everyinitializepagecounters
@@ -103,6 +105,7 @@
\strc_counters_set\s!realpage\realpageno
\strc_counters_set\s!userpage\userpageno
\strc_counters_set\s!subpage \subpageno
+ \lastpageno\lastcountervalue[\s!realpage]\relax
\to \everyinitializepagecounters
\let\setuppagenumber\setupuserpagenumber
@@ -111,24 +114,25 @@
% invisible =
\def\strc_pagenumbers_page_state_save % \normalexpanded?
- {\ctxcommand{savepagedata({
- prefix = "\namedcounterparameter\s!userpage\c!prefix",
- separatorset = "\namedcounterparameter\s!userpage\c!prefixseparatorset",
- conversion = "\namedcounterparameter\s!userpage\c!prefixconversion",
- conversionset = "\namedcounterparameter\s!userpage\c!prefixconversionset",
- set = "\namedcounterparameter\s!userpage\c!prefixset",
- segments = "\namedcounterparameter\s!userpage\c!prefixsegments",
- connector = \!!bs\namedcounterparameter\s!userpage\c!prefixconnector\!!es,
- },{
- conversion = "\namedcounterparameter\s!userpage\c!numberconversion",
- conversionset = "\namedcounterparameter\s!userpage\c!numberconversionset",
- starter = \!!bs\namedcounterparameter\s!userpage\c!numberstarter\!!es,
- stopper = \!!bs\namedcounterparameter\s!userpage\c!numberstopper\!!es,
- },{
- viewerprefix = \!!bs\namedcounterparameter\s!userpage\c!viewerprefix\!!es,
- state = \!!bs\namedcounterparameter\s!userpage\c!state\!!es,
- }
- )}}
+ {\clf_savepagedata
+ {
+ prefix {\namedcounterparameter\s!userpage\c!prefix}
+ separatorset {\namedcounterparameter\s!userpage\c!prefixseparatorset}
+ conversion {\namedcounterparameter\s!userpage\c!prefixconversion}
+ conversionset {\namedcounterparameter\s!userpage\c!prefixconversionset}
+ set {\namedcounterparameter\s!userpage\c!prefixset}
+ segments {\namedcounterparameter\s!userpage\c!prefixsegments}
+ connector {\namedcounterparameter\s!userpage\c!prefixconnector}
+ }{
+ conversion {\namedcounterparameter\s!userpage\c!numberconversion}
+ conversionset {\namedcounterparameter\s!userpage\c!numberconversionset}
+ starter {\namedcounterparameter\s!userpage\c!numberstarter}
+ stopper {\namedcounterparameter\s!userpage\c!numberstopper}
+ }{
+ viewerprefix {\namedcounterparameter\s!userpage\c!viewerprefix}
+ state {\namedcounterparameter\s!userpage\c!state}
+ }%
+ \relax}
\prependtoks
\strc_pagenumbers_page_state_save
@@ -303,6 +307,12 @@
\trackingmarginnotesfalse
\fi
\fi
+ \pageduplexmode
+ \ifsinglesided
+ \ifdoublesided\plustwo\else\zerocount\fi
+ \else
+ \ifdoublesided\plusone\else\zerocount\fi
+ \fi
\page_backgrounds_recalculate
\strc_pagenumbers_set_location
\to \everysetuppagenumbering
diff --git a/Master/texmf-dist/tex/context/base/strc-ref.lua b/Master/texmf-dist/tex/context/base/strc-ref.lua
index 3f2c0608d2a..b6f2e9a3778 100644
--- a/Master/texmf-dist/tex/context/base/strc-ref.lua
+++ b/Master/texmf-dist/tex/context/base/strc-ref.lua
@@ -53,6 +53,7 @@ local v_auto = variables.auto
local context = context
local commands = commands
+local implement = interfaces.implement
local texgetcount = tex.getcount
local texsetcount = tex.setcount
@@ -76,6 +77,8 @@ local references = structures.references
local lists = structures.lists
local counters = structures.counters
+local jobpositions = job.positions
+
-- some might become local
references.defined = references.defined or allocate()
@@ -83,6 +86,7 @@ references.defined = references.defined or allocate()
local defined = references.defined
local derived = allocate()
local specials = allocate()
+local functions = allocate()
local runners = allocate()
local internals = allocate()
local filters = allocate()
@@ -98,6 +102,7 @@ local usedviews = allocate()
references.derived = derived
references.specials = specials
+references.functions = functions
references.runners = runners
references.internals = internals
references.filters = filters
@@ -123,7 +128,7 @@ local context_delayed = context.delayed
local ctx_pushcatcodes = context.pushcatcodes
local ctx_popcatcodes = context.popcatcodes
-local ctx_dofinishsomereference = context.dofinishsomereference
+local ctx_dofinishreference = context.dofinishreference
local ctx_dofromurldescription = context.dofromurldescription
local ctx_dofromurlliteral = context.dofromurlliteral
local ctx_dofromfiledescription = context.dofromfiledescription
@@ -339,8 +344,8 @@ local function setcomponent(data)
local references = data and data.references
if references then
references.component = component
- if references.referenceprefix == component then
- references.referenceprefix = nil
+ if references.prefix == component then
+ references.prefix = nil
end
end
return component
@@ -353,15 +358,32 @@ references.setnextinternal = setnextinternal
references.currentorder = currentorder
references.setcomponent = setcomponent
-commands.setnextreferenceorder = setnextorder
-commands.setnextinternalreference = setnextinternal
+implement {
+ name = "setnextreferenceorder",
+ actions = setnextorder,
+ arguments = { "string", "string" }
+}
-function commands.currentreferenceorder(kind,name)
- context(currentorder(kind,name))
-end
+implement {
+ name = "setnextinternalreference",
+ actions = setnextinternal,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "currentreferenceorder",
+ actions = { currentorder, context },
+ arguments = { "string", "string" }
+}
-function references.set(kind,prefix,tag,data)
--- setcomponent(data)
+function references.set(data)
+ local references = data.references
+ local prefix = references.prefix or ""
+ local reference = references.reference
+ if not reference or reference == "" then
+ report_references("invalid reference")
+ return 0
+ end
local pd = tobesaved[prefix] -- nicer is a metatable
if not pd then
pd = { }
@@ -380,21 +402,44 @@ function references.set(kind,prefix,tag,data)
else
n = n + 1
pd[ref] = data
- ctx_dofinishsomereference(kind,prefix,ref)
+ local r = data.references
+ ctx_dofinishreference(prefix or "",ref or "",r and r.internal or 0)
end
end
- process_settings(tag,action)
+ process_settings(reference,action)
return n > 0
end
+-- function references.enhance(prefix,tag)
+-- local l = tobesaved[prefix][tag]
+-- if l then
+-- l.references.realpage = texgetcount("realpageno")
+-- end
+-- end
+
+local getpos = function() getpos = backends.codeinjections.getpos return getpos () end
+
+local function synchronizepage(reference) -- non public helper
+ reference.realpage = texgetcount("realpageno")
+ if jobpositions.used then
+ reference.x, reference.y = getpos()
+ end
+end
+
+references.synchronizepage = synchronizepage
+
function references.enhance(prefix,tag)
local l = tobesaved[prefix][tag]
if l then
- l.references.realpage = texgetcount("realpageno")
+ synchronizepage(l.references)
end
end
-commands.enhancereference = references.enhance
+implement {
+ name = "enhancereference",
+ actions = references.enhance,
+ arguments = { "string", "string" }
+}
-- -- -- related to strc-ini.lua -- -- --
@@ -402,15 +447,34 @@ commands.enhancereference = references.enhance
local function register_from_lists(collected,derived,pages,sections)
local derived_g = derived[""] -- global
+ local derived_p = nil
+ local derived_c = nil
+ local prefix = nil
+ local component = nil
+ local entry = nil
if not derived_g then
derived_g = { }
derived[""] = derived_g
end
+ local function action(s)
+ if trace_referencing then
+ report_references("list entry %a provides %a reference %a on realpage %a",i,kind,s,realpage)
+ end
+ if derived_p and not derived_p[s] then
+ derived_p[s] = entry
+ end
+ if derived_c and not derived_c[s] then
+ derived_c[s] = entry
+ end
+ if not derived_g[s] then
+ derived_g[s] = entry -- first wins
+ end
+ end
for i=1,#collected do
- local entry = collected[i]
+ entry = collected[i]
local metadata = entry.metadata
if metadata then
- local kind = metadata.kind
+ local kind = metadata.kind -- why this check
if kind then
local references = entry.references
if references then
@@ -418,10 +482,8 @@ local function register_from_lists(collected,derived,pages,sections)
if reference and reference ~= "" then
local realpage = references.realpage
if realpage then
- local prefix = references.referenceprefix
- local component = references.component
- local derived_p = nil
- local derived_c = nil
+ prefix = references.prefix
+ component = references.component
if prefix and prefix ~= "" then
derived_p = derived[prefix]
if not derived_p then
@@ -436,20 +498,6 @@ local function register_from_lists(collected,derived,pages,sections)
derived[component] = derived_c
end
end
- local function action(s)
- if trace_referencing then
- report_references("list entry %a provides %a reference %a on realpage %a",i,kind,s,realpage)
- end
- if derived_p and not derived_p[s] then
- derived_p[s] = entry
- end
- if derived_c and not derived_c[s] then
- derived_c[s] = entry
- end
- if not derived_g[s] then
- derived_g[s] = entry -- first wins
- end
- end
process_settings(reference,action)
end
end
@@ -462,6 +510,78 @@ end
references.registerinitializer(function() register_from_lists(lists.collected,derived) end)
+-- tracing
+
+local function collectbypage(tracedpages)
+ -- lists
+ do
+ local collected = structures.lists.collected
+ local data = nil
+ local function action(reference)
+ local prefix = data.prefix
+ local component = data.component
+ local realpage = data.realpage
+ if realpage then
+ local pagelist = rawget(tracedpages,realpage)
+ local internal = data.internal or 0
+ local prefix = (prefix ~= "" and prefix) or (component ~= "" and component) or ""
+ local pagedata = { prefix, reference, internal }
+ if pagelist then
+ pagelist[#pagelist+1] = pagedata
+ else
+ tracedpages[realpage] = { pagedata }
+ end
+ if internal > 0 then
+ data.usedprefix = prefix
+ end
+ end
+ end
+ for i=1,#collected do
+ local entry = collected[i]
+ local metadata = entry.metadata
+ if metadata and metadata.kind then
+ data = entry.references
+ if data then
+ local reference = data.reference
+ if reference and reference ~= "" then
+ process_settings(reference,action)
+ end
+ end
+ end
+ end
+ end
+ -- references
+ do
+ for prefix, list in next, collected do
+ for reference, entry in next, list do
+ local data = entry.references
+ if data then
+ local realpage = data.realpage
+ local internal = data.internal or 0
+ local pagelist = rawget(tracedpages,realpage)
+ local pagedata = { prefix, reference, internal }
+ if pagelist then
+ pagelist[#pagelist+1] = pagedata
+ else
+ tracedpages[realpage] = { pagedata }
+ end
+ if internal > 0 then
+ data.usedprefix = prefix
+ end
+ end
+ end
+ end
+ end
+end
+
+references.tracedpages = table.setmetatableindex(allocate(),function(t,k)
+ if collectbypage then
+ collectbypage(t)
+ collectbypage = nil
+ end
+ return rawget(t,k)
+end)
+
-- urls
local urls = references.urls or { }
@@ -487,7 +607,11 @@ function urls.get(name)
end
end
-function commands.geturl(name)
+function urls.found(name)
+ return urldata[name]
+end
+
+local function geturl(name)
local url = urls.get(name)
if url and url ~= "" then
ctx_pushcatcodes(txtcatcodes)
@@ -496,18 +620,23 @@ function commands.geturl(name)
end
end
--- function commands.gethyphenatedurl(name,...)
--- local url = urls.get(name)
--- if url and url ~= "" then
--- hyphenatedurl(url,...)
--- end
--- end
+implement {
+ name = "doifelseurldefined",
+ actions = { urls.found, commands.doifelse },
+ arguments = "string"
+}
-function commands.doifurldefinedelse(name)
- commands.doifelse(urldata[name])
-end
+implement {
+ name = "useurl",
+ actions = urls.define,
+ arguments = { "string", "string", "string", "string" }
+}
-commands.useurl= urls.define
+implement {
+ name = "geturl",
+ actions = geturl,
+ arguments = "string",
+}
-- files
@@ -529,11 +658,36 @@ function files.get(name,method,space) -- method: none, before, after, both, spac
end
end
-function commands.doiffiledefinedelse(name)
- commands.doifelse(filedata[name])
+function files.found(name)
+ return filedata[name]
+end
+
+local function getfile(name)
+ local fil = files.get(name)
+ if fil and fil ~= "" then
+ ctx_pushcatcodes(txtcatcodes)
+ context(fil)
+ ctx_popcatcodes()
+ end
end
-commands.usefile= files.define
+implement {
+ name = "doifelsefiledefined",
+ actions = { files.found, commands.doifelse },
+ arguments = "string"
+}
+
+implement {
+ name = "usefile",
+ actions = files.define,
+ arguments = { "string", "string", "string" }
+}
+
+implement {
+ name = "getfile",
+ actions = getfile,
+ arguments = "string"
+}
-- helpers
@@ -613,20 +767,30 @@ function references.checkedprogram(whatever) -- return whatever if not resolved
end
end
-commands.defineprogram = programs.define
+implement {
+ name = "defineprogram",
+ actions = programs.define,
+ arguments = { "string", "string", "string" }
+}
-function commands.getprogram(name)
- local f = programdata[name]
- if f then
- context(f[1])
+local function getprogram(name)
+ local p = programdata[name]
+ if p then
+ context(p[1])
end
end
+implement {
+ name = "getprogram",
+ actions = getprogram,
+ arguments = "string"
+}
+
-- shared by urls and files
-function references.whatfrom(name)
- context((urldata[name] and v_url) or (filedata[name] and v_file) or v_unknown)
-end
+-- function references.whatfrom(name)
+-- context((urldata[name] and v_url) or (filedata[name] and v_file) or v_unknown)
+-- end
function references.from(name)
local u = urldata[name]
@@ -653,7 +817,7 @@ function references.from(name)
end
end
-function commands.from(name)
+local function from(name)
local u = urldata[name]
if u then
local url, file, description = u[1], u[2], u[3]
@@ -678,6 +842,12 @@ function commands.from(name)
end
end
+implement {
+ name = "from",
+ actions = from,
+ arguments = "string"
+}
+
function references.define(prefix,reference,list)
local d = defined[prefix] if not d then d = { } defined[prefix] = d end
d[reference] = list
@@ -690,86 +860,17 @@ function references.reset(prefix,reference)
end
end
-commands.definereference = references.define
-commands.resetreference = references.reset
-
--- \primaryreferencefoundaction
--- \secondaryreferencefoundaction
--- \referenceunknownaction
-
--- t.special t.operation t.arguments t.outer t.inner
-
--- to what extend do we check the non prefixed variant
+implement {
+ name = "definereference",
+ actions = references.define,
+ arguments = { "string", "string", "string" }
+}
--- local strict = false
---
--- local function resolve(prefix,reference,args,set) -- we start with prefix,reference
--- if reference and reference ~= "" then
--- if not set then
--- set = { prefix = prefix, reference = reference }
--- else
--- if not set.reference then set.reference = reference end
--- if not set.prefix then set.prefix = prefix end
--- end
--- local r = settings_to_array(reference)
--- for i=1,#r do
--- local ri = r[i]
--- local d
--- if strict then
--- d = defined[prefix] or defined[""]
--- d = d and d[ri]
--- else
--- d = defined[prefix]
--- d = d and d[ri]
--- if not d then
--- d = defined[""]
--- d = d and d[ri]
--- end
--- end
--- if d then
--- resolve(prefix,d,nil,set)
--- else
--- local var = splitreference(ri)
--- if var then
--- var.reference = ri
--- local vo, vi = var.outer, var.inner
--- if not vo and vi then
--- -- to be checked
--- if strict then
--- d = defined[prefix] or defined[""]
--- d = d and d[vi]
--- else
--- d = defined[prefix]
--- d = d and d[vi]
--- if not d then
--- d = defined[""]
--- d = d and d[vi]
--- end
--- end
--- --
--- if d then
--- resolve(prefix,d,var.arguments,set) -- args can be nil
--- else
--- if args then var.arguments = args end
--- set[#set+1] = var
--- end
--- else
--- if args then var.arguments = args end
--- set[#set+1] = var
--- end
--- if var.has_tex then
--- set.has_tex = true
--- end
--- else
--- -- report_references("funny pattern %a",ri)
--- end
--- end
--- end
--- return set
--- else
--- return { }
--- end
--- end
+implement {
+ name = "resetreference",
+ actions = references.reset,
+ arguments = { "string", "string" }
+}
setmetatableindex(defined,"table")
@@ -824,11 +925,11 @@ end
references.currentset = nil
-function commands.setreferenceoperation(k,v)
+local function setreferenceoperation(k,v)
references.currentset[k].operation = v
end
-function commands.setreferencearguments(k,v)
+local function setreferencearguments(k,v)
references.currentset[k].arguments = v
end
@@ -849,7 +950,22 @@ function references.expandcurrent() -- todo: two booleans: o_has_tex& a_has_tex
end
end
-commands.expandcurrentreference = references.expandcurrent -- for the moment the same
+implement {
+ name = "expandcurrentreference",
+ actions = references.expandcurrent
+}
+
+implement {
+ name = "setreferenceoperation",
+ actions = setreferenceoperation,
+ arguments = { "integer", "string" }
+}
+
+implement {
+ name = "setreferencearguments",
+ actions = setreferencearguments,
+ arguments = { "integer", "string" }
+}
local externals = { }
@@ -893,7 +1009,7 @@ local function loadexternalreferences(name,utilitydata)
local realpage = references.realpage
if kind and realpage then
references.pagedata = pages[realpage]
- local prefix = references.referenceprefix or ""
+ local prefix = references.prefix or ""
local target = external[prefix]
if not target then
target = { }
@@ -995,7 +1111,7 @@ local function loadproductreferences(productname,componentname,utilitydata)
local realpage = references.realpage
if kind and realpage then
references.pagedata = pages[realpage]
- local prefix = references.referenceprefix or ""
+ local prefix = references.prefix or ""
local component = references.component
local ctarget, ptarget
if not component or component == componentname then
@@ -1141,7 +1257,7 @@ local useproduct = commands.useproduct
if useproduct then
- function commands.useproduct(product)
+ local function newuseproduct(product)
useproduct(product)
if texconditionals.autocrossfilereferences then
local component = justacomponent()
@@ -1154,6 +1270,13 @@ if useproduct then
end
end
+ implement {
+ name = "useproduct",
+ actions = newuseproduct,
+ arguments = "string",
+ overload = true,
+ }
+
end
-- productdata.firstsection.numberdata.numbers
@@ -1648,7 +1771,11 @@ local function identify(prefix,reference)
set.n = nofidentified
for i=1,#set do
local var = set[i]
- if var.special then
+ local spe = var.special
+ local fnc = functions[spe]
+ if fnc then
+ var = fnc(var) or { error = "invalid special function" }
+ elseif spe then
var = identify_special(set,var,i)
elseif var.outer then
var = identify_outer(set,var,i)
@@ -1675,7 +1802,7 @@ references.identify = identify
local unknowns, nofunknowns, f_valid = { }, 0, formatters["[%s][%s]"]
-function references.valid(prefix,reference,highlight,newwindow,layer)
+function references.valid(prefix,reference,specification)
local set, bug = identify(prefix,reference)
local unknown = bug or #set == 0
if unknown then
@@ -1690,16 +1817,28 @@ function references.valid(prefix,reference,highlight,newwindow,layer)
unknowns[str] = u + 1
end
else
- set.highlight, set.newwindow, set.layer = highlight, newwindow, layer
+ set.highlight = specification.highlight
+ set.newwindow = specification.newwindow
+ set.layer = specification.layer
currentreference = set[1]
end
-- we can do the expansion here which saves a call
return not unknown
end
-function commands.doifelsereference(prefix,reference,highlight,newwindow,layer)
- commands.doifelse(references.valid(prefix,reference,highlight,newwindow,layer))
-end
+implement {
+ name = "doifelsereference",
+ actions = { references.valid, commands.doifelse },
+ arguments = {
+ "string",
+ "string",
+ {
+ { "highlight", "boolean" },
+ { "newwindow", "boolean" },
+ { "layer" },
+ }
+ }
+}
function references.reportproblems() -- might become local
if nofunknowns > 0 then
@@ -1742,6 +1881,13 @@ function references.setinnermethod(m)
end
end
+implement {
+ name = "setinnerreferencemethod",
+ actions = references.setinnermethod,
+ arguments = "string",
+ onlyonce = true
+}
+
function references.getinnermethod()
return innermethod or defaultinnermethod
end
@@ -1754,24 +1900,27 @@ end)
local destinationattributes = { }
-local function setinternalreference(prefix,tag,internal,view) -- needs checking
+local function setinternalreference(specification)
+ local internal = specification.internal
local destination = unsetvalue
if innermethod == v_auto then
- local t, tn = { }, 0 -- maybe add to current
- if tag then
+ local t, tn = { }, 0 -- maybe add to current (now only used for tracing)
+ local reference = specification.reference
+ if reference then
+ local prefix = specification.prefix
if prefix and prefix ~= "" then
prefix = prefix .. ":" -- watch out, : here
local function action(ref)
tn = tn + 1
t[tn] = prefix .. ref
end
- process_settings(tag,action)
+ process_settings(reference,action)
else
local function action(ref)
tn = tn + 1
t[tn] = ref
end
- process_settings(tag,action)
+ process_settings(reference,action)
end
end
-- ugly .. later we decide to ignore it when we have a real one
@@ -1780,7 +1929,7 @@ local function setinternalreference(prefix,tag,internal,view) -- needs checking
tn = tn + 1
t[tn] = internal -- when number it's internal
end
- destination = references.mark(t,nil,nil,view) -- returns an attribute
+ destination = references.mark(t,nil,nil,specification.view) -- returns an attribute
end
if internal then -- new
destinationattributes[internal] = destination
@@ -1795,16 +1944,103 @@ end
references.setinternalreference = setinternalreference
references.getinternalreference = getinternalreference
-commands.setinternalreference = setinternalreference
-commands.getinternalreference = getinternalreference
-function references.setandgetattribute(kind,prefix,tag,data,view) -- maybe do internal automatically here
- local attr = references.set(kind,prefix,tag,data) and setinternalreference(prefix,tag,nil,view) or unsetvalue
+implement {
+ name = "setinternalreference",
+ actions = setinternalreference,
+ arguments = {
+ {
+ { "prefix" },
+ { "reference" },
+ { "internal", "integer" },
+ { "view" }
+ }
+ }
+}
+
+-- implement {
+-- name = "getinternalreference",
+-- actions = { getinternalreference, context },
+-- arguments = "integer",
+-- }
+
+function references.setandgetattribute(data) -- maybe do internal automatically here
+ local attr = unsetvalue
+ local mdat = data.metadata
+ local rdat = data.references
+ if mdat and rdat then
+ if not rdat.section then
+ rdat.section = structures.sections.currentid()
+ end
+ local ndat = data.numberdata
+ if ndat then
+ local numbers = ndat.numbers
+ if type(numbers) == "string" then
+ ndat.numbers = counters.compact(numbers,nil,true)
+ end
+ data.numberdata = helpers.simplify(ndat)
+ end
+ local pdat = data.prefixdata
+ if pdat then
+ data.prefixdata = helpers.simplify(pdat)
+ end
+ local udat = data.userdata
+ if type(udat) == "string" then
+ data.userdata = helpers.touserdata(udat)
+ end
+ if not rdat.block then
+ rdat.block = structures.sections.currentblock()
+ end
+ local done = references.set(data) -- we had kind i.e .item -> full
+ if done then
+ attr = setinternalreference {
+ prefix = prefix,
+ reference = tag,
+ internal = rdat.internal,
+ view = rdat.view
+ } or unsetvalue
+ end
+ end
texsetcount("lastdestinationattribute",attr)
return attr
end
-commands.setreferenceattribute = references.setandgetattribute
+implement {
+ name = "setreferenceattribute",
+ actions = references.setandgetattribute,
+ arguments = {
+ {
+ {
+ "references", {
+ { "internal", "integer" },
+ { "block" },
+ { "view" },
+ { "prefix" },
+ { "reference" },
+ },
+ },
+ {
+ "metadata", {
+ { "kind" },
+ { "xmlroot" },
+ { "catcodes", "integer" },
+ },
+ },
+ {
+ "prefixdata", { "*" }
+ },
+ {
+ "numberdata", { "*" }
+ },
+ {
+ "entries", { "*" }
+ },
+ {
+ "userdata"
+ }
+ }
+ }
+}
function references.getinternallistreference(n) -- n points into list (todo: registers)
local l = lists.collected[n]
@@ -1812,11 +2048,11 @@ function references.getinternallistreference(n) -- n points into list (todo: reg
return i and destinationattributes[i] or 0
end
-function commands.getinternallistreference(n) -- this will also be a texcount
- local l = lists.collected[n]
- local i = l and l.references.internal
- context(i and destinationattributes[i] or 0)
-end
+implement {
+ name = "getinternallistreference",
+ actions = { references.getinternallistreference, context },
+ arguments = "integer"
+}
--
@@ -1825,12 +2061,11 @@ function references.getcurrentmetadata(tag)
return data and data.metadata and data.metadata[tag]
end
-function commands.getcurrentreferencemetadata(tag)
- local data = references.getcurrentmetadata(tag)
- if data then
- context(data)
- end
-end
+implement {
+ name = "getcurrentreferencemetadata",
+ actions = { references.getcurrentmetadata, context },
+ arguments = "string",
+}
local function currentmetadata(tag)
local data = currentreference and currentreference.i
@@ -1840,15 +2075,29 @@ end
references.currentmetadata = currentmetadata
local function getcurrentprefixspec(default)
- -- todo: message
- return currentmetadata("kind") or "?", currentmetadata("name") or "?", default or "?"
+ local data = currentreference and currentreference.i
+ local metadata = data and data.metadata
+ return
+ metatadata and metadata.kind or "?",
+ metatadata and metadata.name or "?",
+ default or "?"
end
references.getcurrentprefixspec = getcurrentprefixspec
-function commands.getcurrentprefixspec(default)
- ctx_getreferencestructureprefix(getcurrentprefixspec(default))
-end
+-- implement {
+-- name = "getcurrentprefixspec",
+-- actions = { getcurrentprefixspec, context }, -- returns 3 arguments
+-- arguments = "string",
+-- }
+
+implement {
+ name = "getcurrentprefixspec",
+ actions = function(tag)
+ context("{%s}{%s}{%s}",getcurrentprefixspec(tag))
+ end,
+ arguments = "string",
+}
local genericfilters = { }
local userfilters = { }
@@ -1862,12 +2111,12 @@ filters.text = textfilters
filters.full = fullfilters
filters.section = sectionfilters
-local function filterreference(name,...) -- number page title ...
+local function filterreference(name,prefixspec,numberspec) -- number page title ...
local data = currentreference and currentreference.i -- maybe we should take realpage from here
if data then
if name == "realpage" then
local cs = references.analyze() -- normally already analyzed but also sets state
- context(tonumber(cs.realpage) or 0) -- todo, return and in command namespace
+ context(tonumber(cs.realpage) or 0)
else -- assumes data is table
local kind = type(data) == "table" and data.metadata and data.metadata.kind
if kind then
@@ -1877,7 +2126,7 @@ local function filterreference(name,...) -- number page title ...
if trace_referencing then
report_references("name %a, kind %a, using dedicated filter",name,kind)
end
- filter(data,name,...)
+ filter(data,name,prefixspec,numberspec)
elseif trace_referencing then
report_references("name %a, kind %a, using generic filter",name,kind)
end
@@ -1893,21 +2142,27 @@ local function filterreference(name,...) -- number page title ...
end
local function filterreferencedefault()
- return filterreference("default",getcurrentprefixspec(v_default))
+ return filterreference("default",getcurrentprefixspec("default"))
end
references.filter = filterreference
references.filterdefault = filterreferencedefault
-commands.filterreference = filterreference
-commands.filterdefaultreference = filterreferencedefault
+implement {
+ name = "filterreference",
+ actions = filterreference,
+ arguments = "string",
+}
-function commands.currentreferencedefault(tag)
- if not tag then
- tag = "default"
- end
- filterreference(tag,context_delayed(getcurrentprefixspec(tag)))
-end
+implement {
+ name = "filterdefaultreference",
+ actions = filterreference,
+ arguments = {
+ "string", -- 'default'
+ { { "*" } }, -- prefixspec
+ { { "*" } }, -- numberspec
+ }
+}
function genericfilters.title(data)
if data then
@@ -1927,12 +2182,12 @@ function genericfilters.text(data)
end
end
-function genericfilters.number(data,what,prefixspec) -- todo: spec and then no stopper
+function genericfilters.number(data,what,prefixspec,numberspec)
if data then
numberdata = lists.reordered(data) -- data.numberdata
if numberdata then
helpers.prefix(data,prefixspec)
- sections.typesetnumber(numberdata,"number",numberdata)
+ sections.typesetnumber(numberdata,"number",numberspec,numberdata)
else
local useddata = data.useddata
if useddata and useddata.number then
@@ -2056,12 +2311,71 @@ local specials = references.testspecials
-- pretty slow (progressively). In the pagebody one can best check the reference
-- real page to determine if we need contrastlocation as that is more lightweight.
-local function checkedpagestate(n,page)
- local r = referredpage(n)
+local function checkedpagestate(n,page,actions,position,spread)
local p = tonumber(page)
if not p then
return 0
- elseif p > r then
+ end
+ if position and #actions > 0 then
+ local i = actions[1].i -- brrr
+ if i then
+ local a = i.references
+ if a then
+ local x = a.x
+ local y = a.y
+ if x and y then
+ local jp = jobpositions.collected[position]
+ if jp then
+ local px = jp.x
+ local py = jp.y
+ local pp = jp.p
+ if p == pp then
+ -- same page
+ if py > y then
+ return 5 -- above
+ elseif py < y then
+ return 4 -- below
+ elseif px > x then
+ return 4 -- below
+ elseif px < x then
+ return 5 -- above
+ else
+ return 1 -- same
+ end
+ elseif spread then
+ if pp % 2 == 0 then
+ -- left page
+ if pp > p then
+ return 2 -- before
+ elseif pp + 1 == p then
+-- return 4 -- below (on right page)
+ return 5 -- above (on left page)
+ else
+ return 3 -- after
+ end
+ else
+ -- right page
+ if pp < p then
+ return 3 -- after
+ elseif pp - 1 == p then
+-- return 5 -- above (on left page)
+ return 4 -- below (on right page)
+ else
+ return 2 -- before
+ end
+ end
+ elseif pp > p then
+ return 2 -- before
+ else
+ return 3 -- after
+ end
+ end
+ end
+ end
+ end
+ end
+ local r = referredpage(n) -- sort of obsolete
+ if p > r then
return 3 -- after
elseif p < r then
return 2 -- before
@@ -2100,11 +2414,13 @@ local function setreferencerealpage(actions)
end
end
+references.setreferencerealpage = setreferencerealpage
+
-- we store some analysis data alongside the indexed array
-- at this moment only the real reference page is analyzed
-- normally such an analysis happens in the backend code
-function references.analyze(actions)
+function references.analyze(actions,position,spread)
if not actions then
actions = references.currentset
end
@@ -2119,32 +2435,56 @@ function references.analyze(actions)
elseif actions.external then
actions.pagestate = 0
else
- actions.pagestate = checkedpagestate(actions.n,realpage)
+ actions.pagestate = checkedpagestate(actions.n,realpage,actions,position,spread)
end
end
return actions
end
-function commands.referencepagestate(actions)
- if not actions then
- actions = references.currentset
- end
+local function referencepagestate(position,detail,spread)
+ local actions = references.currentset
if not actions then
- context(0)
+ return 0
else
if not actions.pagestate then
- references.analyze(actions) -- delayed unless explicitly asked for
--- print("NO STATE",actions.reference,actions.pagestate)
+ references.analyze(actions,position,spread) -- delayed unless explicitly asked for
+ end
+ local pagestate = actions.pagestate
+ if detail then
+ return pagestate
+ elseif pagestate == 4 then
+ return 2 -- compatible
+ elseif pagestate == 5 then
+ return 3 -- compatible
+ else
+ return pagestate
end
- context(actions.pagestate)
end
end
-function commands.referencerealpage(actions)
+implement {
+ name = "referencepagestate",
+ actions = { referencepagestate, context },
+ arguments = "string"
+}
+
+implement {
+ name = "referencepagedetail",
+ actions = { referencepagestate, context },
+ arguments = { "string", "boolean", "boolean" }
+}
+
+local function referencerealpage(actions)
actions = actions or references.currentset
- context(not actions and 0 or actions.realpage or setreferencerealpage(actions))
+ return not actions and 0 or actions.realpage or setreferencerealpage(actions)
end
+implement {
+ name = "referencerealpage",
+ actions = { referencerealpage, context },
+ arguments = "string"
+}
+
local plist, nofrealpages
local function realpageofpage(p) -- the last one counts !
@@ -2281,6 +2621,102 @@ function specials.section(var,actions)
end
end
+-- experimental:
+
+local p_splitter = lpeg.splitat(":")
+local p_lower = lpeg.patterns.utf8lower
+
+-- We can cache lowercased titles which saves a lot of time, but then
+-- we can better have a global cache with weak keys.
+
+-- local lowercache = table.setmetatableindex(function(t,k)
+-- local v = lpegmatch(p_lower,k)
+-- t[k] = v
+-- return v
+-- end)
+
+local lowercache = false
+
+local function locate(list,askedkind,askedname,pattern)
+ local kinds = lists.kinds
+ local names = lists.names
+ if askedkind and not kinds[askedkind] then
+ return false
+ end
+ if askedname and not names[askedname] then
+ return false
+ end
+ for i=1,#list do
+ local entry = list[i]
+ local metadata = entry.metadata
+ if metadata then
+ local found = false
+ if askedname then
+ local name = metadata.name
+ if name then
+ found = name == askedname
+ end
+ elseif askedkind then
+ local kind = metadata.kind
+ if kind then
+ found = kind == askedkind
+ end
+ end
+ if found then
+ local titledata = entry.titledata
+ if titledata then
+ local title = titledata.title
+ if title then
+ if lowercache then
+ found = lpegmatch(pattern,lowercache[title])
+ else
+ found = lpegmatch(pattern,lpegmatch(p_lower,title))
+ end
+ if found then
+ return {
+ inner = pattern,
+ kind = "inner",
+ reference = pattern,
+ i = entry,
+ p = "",
+ r = entry.references.realpage,
+ }
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+function functions.match(var,actions)
+ if not var.outer then
+ local operation = var.operation
+ if operation and operation ~= "" then
+ local operation = lpegmatch(p_lower,operation)
+ local list = lists.collected
+ local names = false
+ local kinds = false
+ local where, what = lpegmatch(p_splitter,operation)
+ if where and what then
+ local pattern = lpeg.finder(what)
+ return
+ locate(list,false,where,pattern)
+ or locate(list,where,false,pattern)
+ or { error = "no match" }
+ else
+ local pattern = lpeg.finder(operation)
+ -- todo: don't look at section and float in last pass
+ return
+ locate(list,"section",false,pattern)
+ or locate(list,"float",false,pattern)
+ or locate(list,false,false,pattern)
+ or { error = "no match" }
+ end
+ end
+ end
+end
+
-- needs a better split ^^^
-- done differently now:
@@ -2289,24 +2725,36 @@ function references.export(usedname) end
function references.import(usedname) end
function references.load (usedname) end
-commands.exportreferences = references.export
+implement { name = "exportreferences", actions =references.export }
-- better done here .... we don't insert/remove, just use a pointer
local prefixstack = { "" }
local prefixlevel = 1
-function commands.pushreferenceprefix(prefix)
+local function pushreferenceprefix(prefix)
prefixlevel = prefixlevel + 1
prefixstack[prefixlevel] = prefix
- context(prefix)
+ return prefix
end
-function commands.popreferenceprefix()
+local function popreferenceprefix()
prefixlevel = prefixlevel - 1
if prefixlevel > 0 then
- context(prefixstack[prefixlevel])
+ return prefixstack[prefixlevel]
else
report_references("unable to pop referenceprefix")
+ return ""
end
end
+
+implement {
+ name = "pushreferenceprefix",
+ actions = { pushreferenceprefix, context }, -- we can use setmacro
+ arguments = "string",
+}
+
+implement {
+ name = "popreferenceprefix",
+ actions = { popreferenceprefix, context }, -- we can use setmacro
+}
diff --git a/Master/texmf-dist/tex/context/base/strc-ref.mkvi b/Master/texmf-dist/tex/context/base/strc-ref.mkvi
index 91bcb619311..f5d0d1d7863 100644
--- a/Master/texmf-dist/tex/context/base/strc-ref.mkvi
+++ b/Master/texmf-dist/tex/context/base/strc-ref.mkvi
@@ -118,6 +118,11 @@
\unexpanded\def\reference {\dosingleargument\strc_references_full_reference} % never forgotten
\unexpanded\def\setreference {\dodoubleargument\strc_references_set_reference } %
+% maybe: \let\reference\textreference
+
+\unexpanded\def\showreferences
+ {\enabletrackers[nodes.references.show,nodes.destinations.show]}
+
%D These are implemented in a low level form as:
\unexpanded\def\strc_references_text_reference [#labels]{\strc_references_set_named_reference\s!text{#labels}{}}
@@ -140,13 +145,29 @@
\newcount\lastreferenceattribute
\newcount\lastdestinationattribute
-\def\dofinishfullreference#prefix#label{\normalexpanded{\ctxlatecommand{enhancereference("#prefix","#label")}}}
-\def\dofinishtextreference#prefix#label{\normalexpanded{\ctxlatecommand{enhancereference("#prefix","#label",{})}}}
+\def\strc_references_finish#prefix#reference#internal%
+ {\normalexpanded{\ctxlatecommand{enhancereference("#prefix","#reference")}}}
+
+\let\dofinishreference\strc_references_finish % used at lua end
+
+% This is somewhat tricky: we want to keep the reference with the following word but
+% that word should also hyphenate. We need to find a better way.
-\let\dofinishpagereference\dofinishfullreference
-\let\dofinishuserreference\dofinishfullreference
+% 0 = nothing
+% 1 = bind to following word
+
+\setnewconstant\c_strc_references_bind_state\plusone
+
+\def\strc_references_inject_before
+ {}
+
+\def\strc_references_inject_after
+ {\ifcase\c_strc_references_bind_state
+ % nothing
+ \or
+ \prewordbreak % to be tested: \removeunwantedspaces\permithyphenation
+ \fi}
-\def\dofinishsomereference#kind{\executeifdefined{dofinish#{kind}reference}\gobbletwoarguments}
\unexpanded\def\strc_references_set_named_reference
{\ifreferencing
@@ -195,30 +216,34 @@
% beware, the structures.references.set writes a
\setnextinternalreference
\strc_references_start_destination_nodes
- \ctxcommand{setreferenceattribute("\currentreferencekind", "\referenceprefix","\currentreferencelabels",
- {
- references = {
- internal = \nextinternalreference,
- block = "\currentsectionblock",
- section = structures.sections.currentid(),
- },
- metadata = { % we could assume page to have no metadata
- kind = "#kind", % \currentreferencekind
- \ifx\currentreferencekind\s!page\else
- catcodes = \the\catcodetable,
- xmlroot = \ifx\currentreferencecoding\s!xml "\xmldocument"\else nil\fi, % only useful when text
- \fi
- },
+ \clf_setreferenceattribute
+ {%
+ references {%
+ internal \nextinternalreference
+ % block {\currentsectionblock}%
+ view {\interactionparameter\c!focus}%
+ prefix {\referenceprefix}%
+ reference {\currentreferencelabels}%
+ }%
+ metadata {%
+ kind {\currentreferencekind}%
+ \ifx\currentreferencekind\s!page\else
+ \ifx\currentreferencecoding\s!xml
+ xmlroot {\xmldocument}%
+ \fi
+ catcodes \catcodetable
+ \fi
+ }%
\ifx\currentreferencedata\empty\else
- entries = {
- text = \!!bs\currentreferencedata\!!es
- },
+ entries {%
+ text {\currentreferencedata}%
+ }%
\fi
\ifx\currentreferenceuserdata\empty\else
- userdata = structures.helpers.touserdata(\!!bs\detokenize{#userdata}\!!es)
+ userdata {\detokenize{#userdata}}%
\fi
- },"\interactionparameter\c!focus")
- }%
+ }%
+ \relax
\strc_references_stop_destination_nodes
\fi
\else
@@ -229,10 +254,11 @@
\xdef\currentdestinationattribute{\number\lastdestinationattribute}%
% will become an option:
\ifnum\lastdestinationattribute>\zerocount
+ \strc_references_inject_before % new
\dontleavehmode\hbox attr \destinationattribute\lastdestinationattribute\bgroup
\strc_references_flush_destination_nodes
\egroup
- \prewordbreak % new
+ \strc_references_inject_after % new
\fi}
\def\strc_references_set_page_only_destination_attribute#labels% could in fact be fully expandable
@@ -243,19 +269,21 @@
\lastdestinationattribute\attributeunsetvalue
\else
\strc_references_start_destination_nodes
-\setnextinternalreference
- \ctxcommand{setreferenceattribute("\s!page", "\referenceprefix","\currentreferencelabels",
- {
- references = {
- internal = \nextinternalreference,
- block = "\currentsectionblock",
- section = structures.sections.currentid(),
- },
- metadata = {
- kind = "page",
- },
- },"\interactionparameter\c!focus")
- }%
+ \setnextinternalreference
+ \clf_setreferenceattribute
+ {%
+ references {%
+ internal \nextinternalreference
+ % block {\currentsectionblock}%
+ view {\interactionparameter\c!focus}%
+ prefix {\referenceprefix}%
+ reference {\currentreferencelabels}%
+ }%
+ metadata {%
+ kind {page}%
+ }%
+ }%
+ \relax
\strc_references_stop_destination_nodes
\fi
\else
@@ -269,28 +297,28 @@
\setnextinternalreference
\edef\m_strc_references_user{#user}%
\edef\m_strc_references_text{#text}%
- \ctxcommand{setreferenceattribute("\s!full", "\referenceprefix","#labels",
- {
- references = {
- internal = \nextinternalreference,
- block = "\currentsectionblock",
- section = structures.sections.currentid(),
- },
- metadata = {
- kind = "\s!full",
- },
- \ifx\m_strc_references_text\empty \else
- entries = {
- text = \!!bs\m_strc_references_text\!!es
- },
- \fi
- \ifx\m_strc_references_user\empty \else
- userdata = {
- \m_strc_references_user
- }
- \fi
- },"\interactionparameter\c!focus")
- }%
+ \clf_setreferenceattribute
+ {%
+ references {%
+ internal \nextinternalreference
+ % block {\currentsectionblock}%
+ view {\interactionparameter\c!focus}%
+ prefix {\referenceprefix}%
+ reference {#labels}%
+ }%
+ metadata {%
+ kind {\s!full}%
+ }%
+ \ifx\m_strc_references_text\empty \else
+ entries {%
+ text {\m_strc_references_text}%
+ }%
+ \fi
+ \ifx\m_strc_references_user\empty \else
+ userdata {\m_strc_references_user}% \detokenize\expandafter{\normalexpanded{...}}
+ \fi
+ }%
+ \relax
\strc_references_stop_destination_nodes
\else
\setbox\b_strc_destination_nodes\emptyhbox
@@ -300,10 +328,11 @@
\xdef\currentdestinationattribute{\number\lastdestinationattribute}%
% will become an option:
\ifnum\lastdestinationattribute>\zerocount
+ \strc_references_inject_before % new
\dontleavehmode\hbox attr \destinationattribute\lastdestinationattribute\bgroup
\strc_references_flush_destination_nodes
\egroup
- \prewordbreak % new
+ \strc_references_inject_after % new
\fi}
\unexpanded\def\strc_references_direct_full
@@ -345,17 +374,19 @@
\def\strc_references_set_simple_page_reference#label%
{\iflocation
\strc_references_start_destination_nodes
- \ctxcommand{setreferenceattribute("\s!page", "\referenceprefix","#label",
- {
- references = {
- % block = "\currentsectionblock",
- % section = structures.sections.currentid(),
- },
- metadata = { % we could assume page to have no metadata
- kind = "\s!page",
- },
- },"\interactionparameter\c!focus")
- }%
+ \clf_setreferenceattribute
+ {%
+ references {%
+ % block {\currentsectionblock}%
+ view {\interactionparameter\c!focus}%
+ prefix {\referenceprefix}%
+ reference {#label}%
+ }%
+ metadata {%
+ kind {\s!page}%
+ }%
+ }%
+ \relax
\strc_references_stop_destination_nodes
\xdef\currentdestinationattribute{\number\lastdestinationattribute}%
\else
@@ -365,7 +396,15 @@
\def\strc_references_get_simple_page_reference#label%
{\iflocation
- \ctxcommand{injectreference("\referenceprefix","#label",\number\ht\strutbox,\number\dp\strutbox,\extrareferencearguments)}%
+ \clf_injectreference
+ {\referenceprefix}%
+ {#label}%
+ {%
+ height \ht\strutbox
+ depth \dp\strutbox
+ \extrareferencearguments
+ }%
+ \relax
\xdef\currentreferenceattribute{\number\lastreferenceattribute}%
\else
\xdef\currentreferenceattribute{\number\attributeunsetvalue}%
@@ -505,9 +544,6 @@
\newcount\referencehastexstate % set in backend
-\def\referencepagestate{\ctxcommand{referencepagestate()}}
-\def\referencerealpage {\ctxcommand{referencerealpage ()}}
-
% referencepagestate:
%
% 0 = no page ref, 1=same page, 2=before, 3=after
@@ -595,13 +631,13 @@
{\dodoubleempty\strc_references_define_reference}
\def\strc_references_define_reference[#name][#specification]%
- {\ctxcommand{definereference("\referenceprefix","#name",\!!bs\detokenize{#specification}\!!es)}}
+ {\clf_definereference{\referenceprefix}{#name}{\detokenize{#specification}}}
\unexpanded\def\resetreference[#name]%
- {\ctxcommand{resetreference("\referenceprefix","#name")}}
+ {\clf_resetreference{\referenceprefix}{#name}}
\def\setpagereference#name#specification% hm,. low level ?
- {\ctxcommand{definereference("","#name",\!!bs\v!page(\luaescapestring{#specification})\!!es)}}
+ {\clf_definereference{}{#name}{\v!page(\detokenize{#specification}}} % is detokenize needed here?
%D Chained references are defined as:
%D
@@ -631,17 +667,19 @@
\newconditional\gotonewwindow \setfalse\gotonewwindow
\def\expandtexincurrentreference % will happen in lua some time
- {\ifcase\referencehastexstate\else\ctxcommand{expandcurrentreference()}\fi}
+ {\ifcase\referencehastexstate\else\clf_expandcurrentreference\fi}
-\def\expandreferenceoperation#tag#content{\ctxcommand{setreferenceoperation(#tag,\!!bs#content\!!es)}}
-\def\expandreferencearguments#tag#content{\ctxcommand{setreferencearguments(#tag,\!!bs#content\!!es)}}
+\def\expandreferenceoperation#tag#content{\clf_setreferenceoperation#tag{#content}}
+\def\expandreferencearguments#tag#content{\clf_setreferencearguments#tag{#content}}
-\def\doifreferencefoundelse#labels#yes#nop%
- {\ctxcommand{doifelsereference("\referenceprefix",\!!bs#labels\!!es,\luaconditional\highlighthyperlinks,\luaconditional\gotonewwindow)}%
+\def\doifelsereferencefound#label#yes#nop%
+ {\clf_doifelsereference{\referenceprefix}{#label}{\extrareferencearguments}%
{\expandtexincurrentreference
#yes}%
{#nop}}
+\let\doifreferencefoundelse \doifelsereferencefound
+
%D The tester only splits the reference in components but does
%D not look into them. The following macro does a preroll and
%D determines for instance the current real reference pagenumber.
@@ -747,14 +785,14 @@
{\global\advance\locationcount\plusone}
\def\setnextinternalreferences#kind#name% plural
- {\ctxcommand{setnextinternalreference("#kind","#name")}}
+ {\clf_setnextinternalreference{#kind}{#name}}
\def\getinternalorderreference#kind#name%
- {\ctxcommand{currentreferenceorder("#kind","#name")}}
+ {\clf_currentreferenceorder{#kind}{#name}}
\def\thisissomeinternal#kind#name% only for old time sake
{\begingroup
- \ctxcommand{setinternalreference("","#kind:#name")}%
+ \clf_setinternalreference reference {#kind:#name}\relax
\hbox attr \destinationattribute\lastdestinationattribute{}%
\endgroup}
@@ -817,7 +855,7 @@
\appendtoks
\edef\p_export{\referencingparameter\c!export}%
\ifx\p_export\v!yes
- \ctxcommand{exportreferences()}%
+ \clf_exportreferences
\fi
\to \everygoodbye
@@ -832,16 +870,16 @@
% {\popmacro\referenceprefix}
\unexpanded\def\globalpushreferenceprefix#prefix%
- {\xdef\referenceprefix{\ctxcommand{pushreferenceprefix("#prefix")}}}
+ {\xdef\referenceprefix{\clf_pushreferenceprefix{#prefix}}}
\unexpanded\def\globalpopreferenceprefix
- {\xdef\referenceprefix{\ctxcommand{popreferenceprefix()}}}
+ {\xdef\referenceprefix{\clf_popreferenceprefix}}
\unexpanded\def\pushreferenceprefix#prefix%
- {\edef\referenceprefix{\ctxcommand{pushreferenceprefix("#prefix")}}}
+ {\edef\referenceprefix{\clf_pushreferenceprefix{#prefix}}}
\unexpanded\def\popreferenceprefix
- {\edef\referenceprefix{\ctxcommand{popreferenceprefix()}}}
+ {\edef\referenceprefix{\clf_popreferenceprefix}}
\def\m_strc_references_prefix_yes{+}
\def\m_strc_references_prefix_nop{-}
@@ -931,15 +969,15 @@
\ifdefined\over \let\normalmathover \over \unexpanded\def\over {\mathortext\normalmathover \strc_references_about} \else \let\over \strc_references_about \fi
\to \everydump
- \def\filterreference #key{\ctxcommand{filterreference("#key")}} % no checking, expanded
-\unexpanded\def\getreferenceentry#key{\ctxcommand{filterreference("#key")}} % no checking, unexpanded
+ \def\filterreference #key{\clf_filterreference{#key}} % no checking, expanded
+\unexpanded\def\getreferenceentry#key{\clf_filterreference{#key}} % no checking, unexpanded
-\def\currentreferencenumber {\filterreference{number}}
-\def\currentreferencepage {\filterreference{page}}
-\def\currentreferencetitle {\filterreference{title}}
-\def\currentreferencetext {\filterreference{text}}
-\def\currentreferencedefault {\filterreference{default}}
-\def\currentreferencerealpage{\filterreference{realpage}}
+\def\currentreferencenumber {\clf_filterreference{number}}
+\def\currentreferencepage {\clf_filterreference{page}}
+\def\currentreferencetitle {\clf_filterreference{title}}
+\def\currentreferencetext {\clf_filterreference{text}}
+\def\currentreferencedefault {\clf_filterreference{default}}
+\def\currentreferencerealpage{\clf_filterreference{realpage}}
%D The most straightforward way of retrieving references is
%D using \type{\ref}.
@@ -949,7 +987,7 @@
\def\strc_references_get_reference[#key][#label]% #key = number page title text default realpage ...
{\ifsecondargument
- \doifreferencefoundelse{#label}{\ctxcommand{filterreference("#key")}}\dummyreference
+ \doifelsereferencefound{#label}{\clf_filterreference{#key}}\dummyreference
\else
\dummyreference
\fi}
@@ -965,7 +1003,7 @@
\let\\\space
\postponenotes % might go
\referencingparameter\c!left
- \doifreferencefoundelse{#label}
+ \doifelsereferencefound{#label}
{\goto{\limitatetext\currentreferencetitle{\referencingparameter\c!width}\unknown}[#label]}% not so efficient (dup lookup)
{}% todo
\flushnotes % might go
@@ -984,44 +1022,151 @@
%D ... \atpage[someref] ...
%D \stoptyping
-% 0 = unknown
-% 1 = same
-% 2 = before
-% 3 = after
+% standard detail
+%
+% 0 = unknown unknown
+% 1 = same on same page
+% 2 = before preceding page
+% 3 = after following page
+%
+% 4 = above above on same page
+% 5 = below below on same page
-\def\strc_references_by_reference_page_state#unknown#before#current#after%
- {\ifcase\referencepagestate\space#unknown\or#current\or#before\or#after\fi}
+% todo: optimize for use in pagebody
+% todo: maybe make it optional
-% \unexpanded\def\somewhere#backward#foreward#dummy[#label]% #dummy gobbles space around #foreward
-% {\doifreferencefoundelse{#label}% usage needs checking (useless)
-% {\goto{\strc_references_by_reference_page_state{#label}{#backward}{}{#foreward}}[#label]}
-% {[#label]}}
+% \setuppagenumbering[alternative=doublesided]
+% \setupreferencing [doublesided=no] % yes is default
%
-% better:
+% \somewhere{backward}{foreward}[label]
+% \someplace{preceding}{backward}{current}{foreward}{following}[label]
+% \atpage[#label]
+% \doifcheckedpagestate{label}{preceding}{backward}{current}{foreward}{following}{otherwise}
+%
+% \dorecurse {20} {
+% \placefigure[here][fig:#1]{}{\externalfigure[dummy]}
+% \dorecurse {20} {
+% ##1: \atpage[fig:##1] /
+% \doifcheckedpagestate
+% {fig:##1}
+% {preceding}{backward}{current}{foreward}{following}
+% {otherwise}
+% }
+% }
+
+\newcount \nofreferencestates
+\newconditional\pagestatespread
-\unexpanded\def\somewhere#backward#foreward#dummy[#label]% #dummy gobbles space around #foreward
- {\doifreferencefoundelse{#label}%
- {\strc_references_by_reference_page_state{#label}{\goto{#backward}[#label]}{}{\goto{#foreward}[#label]}}
- {[#label]}}
+\appendtoks
+ \doifelse{\referencingparameter\c!doublesided}\v!yes\settrue\setfalse\pagestatespread
+\to \everysetupreferencing
-\unexpanded\def\atpage[#label]% todo
- {\doifreferencefoundelse{#label}% kind of inefficient as \goto also analyzes
- {\goto
- {\strc_references_by_reference_page_state
- {\labeltexts\v!page\dummyreference}%
- {\labeltext\v!hencefore}%
- {\labeltexts\v!atpage\currentreferencepage}%
- {\labeltext\v!hereafter}}%
- [#label]}
- {[#label]}}
+\setupreferencing
+ [\c!doublesided=\v!yes]
+
+\def\referencepagestate
+ {\numexpr\clf_referencepagestate
+ {rst::\number\nofreferencestates}%
+ \relax}
+
+\def\referencepagedetail
+ {\numexpr\clf_referencepagestate
+ {rst::\number\nofreferencestates}%
+ true %
+ \ifconditional\pagestatespread false\ifdoublesided true\else false\fi\fi
+ \relax}
+
+\def\referencerealpage
+ {\clf_referencerealpage}
+
+\unexpanded\def\tracedpagestate
+ {{\blue\tttf(\ifcase\referencepagedetail unknown\or same\or previous\or next\or above\or below\else unknown\fi)}}
+
+\unexpanded\def\markreferencepage
+ {\dontleavehmode\begingroup
+ \iftrialtypesetting
+ % issue warning that not stable
+ \else
+ % needs checking ... but probably never in trialmode
+ \global\advance\nofreferencestates\plusone
+ \xypos{rst::\number\nofreferencestates}%
+ % \tracedpagestate
+ \fi
+ \endgroup}
+
+\unexpanded\def\doifcheckedpagestate#label% #preceding#backward#current#foreward#following#otherwise%
+ {\doifelsereferencefound{#label}\strc_references_handle_page_state_yes\strc_references_handle_page_state_nop}
+
+\let\strc_references_handle_page_state_nop\sixthofsixarguments
+
+\def\strc_references_handle_page_state_yes
+ {\markreferencepage
+ \ifcase\referencepagedetail
+ \expandafter\sixthofsixarguments \or
+ \expandafter\thirdofsixarguments \or
+ \expandafter\firstofsixarguments \or
+ \expandafter\fifthofsixarguments \or
+ \expandafter\secondofsixarguments\or
+ \expandafter\fourthofsixarguments\else
+ \expandafter\sixthofsixarguments \fi}
\unexpanded\def\referencesymbol
- {\hbox{\strut\high
- {\setupsymbolset[\interactionparameter\c!symbolset]%
- \symbol[\strc_references_by_reference_page_state\v!somewhere\v!nowhere\v!previous\v!next]}}}
+ {\hbox\bgroup
+ \strut
+ \markreferencepage
+ \high
+ {\setupsymbolset[\interactionparameter\c!symbolset]%
+ \symbol[\ifcase\referencepagedetail\v!somewhere\or\v!nowhere\or\v!previous\or\v!next\or\v!previous\or\v!next\else\v!somewhere\fi]}%
+ \egroup}
+
+%D Hereafter the \type {\ignorespaces} binds the state node to next character (more likely
+%D than a preceding one) and one can always add an explicit space.
+
+\unexpanded\def\somewhere#backward#foreward#dummy[#label]% #dummy gobbles space around #foreward
+ {\doifcheckedpagestate{#label}%
+ {\goto{#backward}[#label]}%
+ {\goto{#backward}[#label]}%
+ {\ignorespaces}%
+ {\goto{#foreward}[#label]}%
+ {\goto{#foreward}[#label]}%
+ {#label}}%
+
+\unexpanded\def\someplace#preceding#backward#current#foreward#following#dummy[#label]% #dummy gobbles space around #foreward
+ {\doifcheckedpagestate{#label}%
+ {\doifelsenothing{#preceding}{\goto{#preceding}[#label]}\ignorespaces}%
+ {\doifelsenothing {#backward}{\goto {#backward}[#label]}\ignorespaces}%
+ {\doifelsenothing {#current}{\goto {#current}[#label]}\ignorespaces}%
+ {\doifelsenothing {#foreward}{\goto {#foreward}[#label]}\ignorespaces}%
+ {\doifelsenothing{#following}{\goto{#following}[#label]}\ignorespaces}%
+ {#label}}
+
+\unexpanded\def\atpage[#label]% todo
+ {\doifcheckedpagestate{#label}%
+ {\goto{\labeltext \v!precedingpage }[#label]}%
+ {\goto{\labeltext \v!hencefore }[#label]}%
+ {\ignorespaces}%
+ {\goto{\labeltext \v!hereafter }[#label]}%
+ {\goto{\labeltext \v!followingpage }[#label]}%
+ {\goto{\labeltexts\v!page\dummyreference}[#label]}}
+
+% Someone requested this but in retrospect didn't need it so we keep it as example.
+% Beware: a node is injected which is why we add ignorespaces!
+%
+% \unexpanded\def\strc_references_conditional#action#text[#condition]#dummy[#label]%
+% {\doifcheckedpagestate{#label}%
+% {\doifelse{#condition}\v!precedingpage{#action{#text}[#label]}\ignorespaces}%
+% {\doifelse{#condition}\v!hencefore {#action{#text}[#label]}\ignorespaces}%
+% {\doifelse{#condition}\v!current {#action{#text}[#label]}\ignorespaces}%
+% {\doifelse{#condition}\v!hereafter {#action{#text}[#label]}\ignorespaces}%
+% {\doifelse{#condition}\v!followingpage{#action{#text}[#label]}\ignorespaces}%
+% {#label}}
+%
+% \unexpanded\def\conditionalat {\strc_references_conditional\at}
+% \unexpanded\def\conditionalin {\strc_references_conditional\in}
+% \unexpanded\def\conditionalabout{\strc_references_conditional\about}
-%D The other alternatives just conform their names: only the
-%D label, only the text, or the label and the text.
+%D The other alternatives just conform their names: only the label, only the text, or the
+%D label and the text.
% \dounknownreference -> \dummyreference
@@ -1044,11 +1189,11 @@
\setvalue{\??referencinginteraction\v!all}%
{\the\leftreferencetoks
- \doifsometokselse\leftreferencetoks \leftofreferencecontent \donothing
+ \doifelsesometoks\leftreferencetoks \leftofreferencecontent \donothing
\leftofreference
\currentreferencecontent
\rightofreference
- \doifsometokselse\rightreferencetoks\rightofreferencecontent\donothing
+ \doifelsesometoks\rightreferencetoks\rightofreferencecontent\donothing
\the\rightreferencetoks}
\setvalue{\??referencinginteraction\v!label}%
@@ -1108,14 +1253,21 @@
\let\rightofreferencecontent\empty
\fi
% inefficient: double resolve
- \doifreferencefoundelse{#label} % we need to resolve the text
+ \doifelsereferencefound{#label} % we need to resolve the text
{\goto{\referencesequence}[#label]}
{\let\currentreferencecontent\dummyreference
\goto{\referencesequence}[#label]}%
\strc_references_stop_goto}
-\unexpanded\def\strc_references_in{\strc_references_start_goto\let\currentreferencecontent\currentreferencedefault\strc_references_pickup_goto}
-\unexpanded\def\strc_references_at{\strc_references_start_goto\let\currentreferencecontent\currentreferencepage \strc_references_pickup_goto}
+\unexpanded\def\strc_references_in
+ {\strc_references_start_goto
+ \let\currentreferencecontent\currentreferencedefault
+ \strc_references_pickup_goto}
+
+\unexpanded\def\strc_references_at
+ {\strc_references_start_goto
+ \let\currentreferencecontent\currentreferencepage
+ \strc_references_pickup_goto}
%D \macros
%D {definereferenceformat}
@@ -1226,7 +1378,7 @@
\def\autoreferencelabeltextflag{*} % a proper key like 'auto' or 'name' can clash with a label key
\unexpanded\def\autoreferencelabeltext
- {\ctxcommand{getcurrentreferencemetadata("name")}}
+ {\clf_getcurrentreferencemetadata{name}}
% \starttext
% \definereferenceformat[inxx] [left=(,right=),text=txt]
@@ -1271,7 +1423,9 @@
\newconditional\uselocationstrut \settrue\uselocationstrut
\def\extrareferencearguments
- {\luaconditional\highlighthyperlinks,\luaconditional\gotonewwindow,"\currentviewerlayer"}
+ {highlight \luaconditional\highlighthyperlinks\space
+ newwindow \luaconditional\gotonewwindow\space
+ layer {\currentviewerlayer}}
\unexpanded\def\directgoto
{\ifconditional\uselocationstrut
@@ -1303,7 +1457,15 @@
\attribute\referenceattribute\attributeunsetvalue
\global\lastsavedreferenceattribute\attributeunsetvalue
\iflocation
- \ctxcommand{injectreference("\referenceprefix","#label",\number\ht\strutbox,\number\dp\strutbox,\extrareferencearguments)}%
+ \clf_injectreference
+ {\referenceprefix}%
+ {#label}%
+ {%
+ height \ht\strutbox
+ depth \dp\strutbox
+ \extrareferencearguments
+ }%
+ \relax
\setlocationattributes
\setstrut % can be option
\global\lastsavedreferenceattribute\lastreferenceattribute
@@ -1322,7 +1484,15 @@
\global\lastsavedreferenceattribute\attributeunsetvalue
\attribute\referenceattribute\attributeunsetvalue
\iflocation
- \ctxcommand{injectreference("\referenceprefix","#label",\number\dimexpr\interactionparameter\c!height\relax,\number\dimexpr\interactionparameter\c!depth\relax,\extrareferencearguments)}%
+ \clf_injectreference
+ {\referenceprefix}%
+ {#label}%
+ {%
+ height \dimexpr\interactionparameter\c!height\relax
+ depth \dimexpr\interactionparameter\c!depth \relax
+ \extrareferencearguments
+ }%
+ \relax
\setlocationattributes
\attribute\referenceattribute\lastreferenceattribute
\global\lastsavedreferenceattribute\lastreferenceattribute
@@ -1341,9 +1511,12 @@
\global\lastsavedreferenceattribute\attributeunsetvalue
\attribute\referenceattribute\attributeunsetvalue
\iflocation
- \ctxcommand{doifelsereference("\referenceprefix","#label",\extrareferencearguments)}%
+ \clf_doifelsereference{\referenceprefix}{#label}{\extrareferencearguments}%
{\expandtexincurrentreference
- \ctxcommand{injectcurrentreference(\number\ht\strutbox,\number\dp\strutbox)}%
+ \clf_injectcurrentreferencehtdp
+ \ht\strutbox
+ \dp\strutbox
+ \relax
\setlocationattributes
\setstrut % can be option
\global\lastsavedreferenceattribute\lastreferenceattribute
@@ -1358,15 +1531,52 @@
%\egroup\unhbox\referencebox}
\endgroup}
+\unexpanded\def\startgoto[#label]%
+ {\dontleavehmode
+ \begingroup
+ \iflocation
+ \clf_doifelsereference{\referenceprefix}{#label}{\extrareferencearguments}%
+ {\expandafter\startgoto_yes}%
+ {\expandafter\startgoto_nop}%
+ \else
+ \expandafter\startgoto_nop
+ \fi}
+
+\unexpanded\def\startgoto_nop
+ {\let\stopgoto\stopgoto_nop}
+
+\unexpanded\def\stopgoto_nop
+ {\endgroup}
+
+\unexpanded\def\startgoto_yes
+ {\expandtexincurrentreference
+ \clf_injectcurrentreferencehtdp
+ \ht\strutbox
+ \dp\strutbox
+ \relax
+ \setlocationattributes
+ \setstrut % can be option
+ \global\lastsavedreferenceattribute\lastreferenceattribute
+ \attribute\referenceattribute\lastreferenceattribute
+ \dostarttagged\t!link\empty
+ \let\stopgoto\stopgoto_yes}
+
+\unexpanded\def\stopgoto_yes
+ {\dostoptagged
+ \endgroup}
+
\def\dogotohtdp#content#dummy[#label]% dummy gobbles spaces
{\dontleavehmode
\begingroup
\global\lastsavedreferenceattribute\attributeunsetvalue
\attribute\referenceattribute\attributeunsetvalue
\iflocation
- \ctxcommand{doifelsereference("\referenceprefix","#label",\extrareferencearguments)}%
+ \clf_doifelsereference{\referenceprefix}{#label}{\extrareferencearguments}%
{\expandtexincurrentreference
- \ctxcommand{injectcurrentreference(\number\dimexpr\interactionparameter\c!height\relax,\number\dimexpr\interactionparameter\c!depth\relax)}%
+ \clf_injectcurrentreferencehtdp
+ \dimexpr\interactionparameter\c!height\relax
+ \dimexpr\interactionparameter\c!depth \relax
+ \relax
\setlocationattributes
\global\lastsavedreferenceattribute\lastreferenceattribute
\attribute\referenceattribute\lastreferenceattribute
@@ -1385,7 +1595,11 @@
\global\lastsavedreferenceattribute\attributeunsetvalue
\attribute\referenceattribute\attributeunsetvalue
\iflocation
- \ctxcommand{injectreference("\referenceprefix","#label",nil,nil,\extrareferencearguments)}%
+ \clf_injectreference
+ {\referenceprefix}%
+ {#label}%
+ {\extrareferencearguments}%
+ \relax
\setlocationattributes
\global\lastsavedreferenceattribute\lastreferenceattribute
\dostarttagged\t!link\empty
@@ -1402,7 +1616,11 @@
\global\lastsavedreferenceattribute\attributeunsetvalue
\attribute\referenceattribute\attributeunsetvalue
\iflocation
- \ctxcommand{injectreference("\referenceprefix","#label",nil,nil,\extrareferencearguments)}%
+ \clf_injectreference
+ {\referenceprefix}%
+ {#label}%
+ {\extrareferencearguments}%
+ \relax
\setlocationcolorspec{#resolver}% no consequence for strut
\global\lastsavedreferenceattribute\lastreferenceattribute
\dostarttagged\t!link\empty
@@ -1419,7 +1637,11 @@
\global\lastsavedreferenceattribute\attributeunsetvalue
\attribute\referenceattribute\attributeunsetvalue
\iflocation
- \ctxcommand{injectreference("\referenceprefix","#label",nil,nil,\extrareferencearguments)}%
+ \clf_injectreference
+ {\referenceprefix}%
+ {#label}%
+ {\extrareferencearguments}%
+ \relax
\global\lastsavedreferenceattribute\lastreferenceattribute
\dostarttagged\t!link\empty
\hbox attr \referenceattribute \lastreferenceattribute {#content}%
@@ -1435,9 +1657,9 @@
\global\lastsavedreferenceattribute\attributeunsetvalue
\attribute\referenceattribute\attributeunsetvalue
\iflocation
- \ctxcommand{doifelsereference("\referenceprefix","#label",\extrareferencearguments)}%
+ \clf_doifelsereference{\referenceprefix}{#label}{\extrareferencearguments}%
{\expandtexincurrentreference
- \ctxcommand{injectcurrentreference(nil,nil)}%
+ \clf_injectcurrentreference
\setlocationattributes
\global\lastsavedreferenceattribute\lastreferenceattribute
\dostarttagged\t!link\empty
@@ -1457,8 +1679,8 @@
\ht\scratchbox#height%
\global\lastsavedreferenceattribute\attributeunsetvalue
\attribute\referenceattribute\attributeunsetvalue
- \ctxcommand{doifelsereference("\referenceprefix","#label",\extrareferencearguments)}%
- {\ctxcommand{injectcurrentreference(nil,nil)}%
+ \clf_doifelsereference{\referenceprefix}{#label}{\extrareferencearguments}%
+ {\clf_injectcurrentreference
\global\lastsavedreferenceattribute\lastreferenceattribute
\hbox attr \referenceattribute \lastreferenceattribute {\box\scratchbox}}
{\box\scratchbox}%
@@ -1520,13 +1742,16 @@
\let\useexternaldocument\usefile
\def\strc_references_use_url[#label][#url][#file][#description]%
- {\ctxcommand{useurl("#label",\!!bs\detokenize{#url}\!!es,\!!bs\detokenize{#file}\!!es,\!!bs\detokenize{#description}\!!es)}}
+ {\clf_useurl{#label}{\detokenize{#url}}{\detokenize{#file}}{\detokenize{#description}}}
\def\strc_references_use_file[#label][#file][#description]%
- {\ctxcommand{usefile("#label",\!!bs\detokenize{#file}\!!es,\!!bs\detokenize{#description}\!!es)}}
+ {\clf_usefile{#label}{\detokenize{#file}}{\detokenize{#description}}}
-\def\doifurldefinedelse #label{\ctxcommand{doifurldefinedelse ("#label")}}
-\def\doiffiledefinedelse#label{\ctxcommand{doiffiledefinedelse("#label")}}
+\def\doifelseurldefined #label{\clf_doifelseurldefined {#label}}
+\def\doifelsefiledefined#label{\clf_doifelsefiledefined{#label}}
+
+\let\doifurldefinedelse \doifelseurldefined
+\let\doiffiledefinedelse\doifelsefiledefined
%D \macros
%D {url,setupurl}
@@ -1557,7 +1782,7 @@
{\dontleavehmode
\begingroup
\useurlstyleandcolor\c!style\c!color
- \hyphenatedurl{\ctxcommand{geturl("#label")}}%
+ \hyphenatedurl{\clf_geturl{#label}}%
\endgroup}
%D This macro is hooked into a support macro, and thereby
@@ -1588,7 +1813,7 @@
\def\strc_references_do_special_from[#label]%
{\dontleavehmode
- \goto{\ctxcommand{from("#label")}}[fileorurl(#label)]}
+ \goto{\clf_from{#label}}[fileorurl(#label)]}
\def\dofromurldescription#content% called at the lua end
{#content}
@@ -1633,13 +1858,13 @@
{\dotripleargument\strc_references_define_program}
\def\strc_references_define_program[#name][#program][#description]%
- {\ctxcommand{defineprogram("#name",\!!bs#program\!!es,\!!bs#description\!!es)}}
+ {\clf_defineprogram{#name}{#program}{#description}}
\def\program[#name]% incompatible, more consistent, hardy used anyway
{\dontleavehmode
\begingroup
\useprogramsstyleandcolor\c!style\c!color
- \ctxcommand{getprogram("#name","\directprogramsparameter\c!alternative","\directprogramsparameter\c!space")}%
+ \clf_getprogram{#name}%
\endgroup}
%D As we can see, we directly use the special reference
@@ -1728,7 +1953,7 @@
%D
%D Only when \type {text} is not empty, a space is inserted.
-\def\dotextprefix#text%
+\unexpanded\def\dotextprefix#text%
{\begingroup
\setbox\scratchbox\hbox{#text}% to be solved some day
\ifdim\wd\scratchbox>\zeropoint
@@ -1864,14 +2089,24 @@
\installcorenamespace{referencingprefix}
\def\getreferencestructureprefix#kind#name#category% name will change
- {{
- prefix = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefix",
- separatorset = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixseparatorset",
- conversion = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixconversion",
- conversionset = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixconversionset",
- set = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixset",
- segments = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixsegments",
- connector = \!!bs\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixconnector\!!es,
+ {{%
+ prefix {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefix}%
+ separatorset {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixseparatorset}%
+ conversion {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixconversion}%
+ conversionset {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixconversionset}%
+ starter {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixstarter}%
+ stopper {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixstopper}%
+ set {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixset}%
+ segments {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixsegments}%
+ connector {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixconnector}%
+ }%
+ {%
+ separatorset {\referencestructureprefixparameter{#kind}{#name}{#category}\c!numberseparatorset}%
+ conversion {\referencestructureprefixparameter{#kind}{#name}{#category}\c!numberconversion}%
+ conversionset {\referencestructureprefixparameter{#kind}{#name}{#category}\c!numberconversionset}%
+ starter {\referencestructureprefixparameter{#kind}{#name}{#category}\c!numberstarter}%
+ stopper {\referencestructureprefixparameter{#kind}{#name}{#category}\c!numberstopper}%
+ segments {\referencestructureprefixparameter{#kind}{#name}{#category}\c!numbersegments}%
}}
\unexpanded\def\setupreferencestructureprefix
@@ -1893,16 +2128,11 @@
\csname \??referencingprefix:#category#parameter\endcsname
\fi\fi\fi}
-% \def\currentreferencedefault
-% {\ctxcommand{filterdefaultreference()}}
-
-\def\currentreferencedefault
- {\ctxcommand{filterreference("\s!default",\ctxcommand{getcurrentprefixspec("\s!default")})}}
-
-% needs testing
-%
-% \def\currentreferencedefault
-% {\ctxcommand{currentreferencedefault()}}
+\def\currentreferencedefault % for some reason we need to explicitly expand
+ {\normalexpanded{\noexpand\clf_filterdefaultreference
+ {\s!default}%
+ \noexpand\getreferencestructureprefix\clf_getcurrentprefixspec{\s!default}% returns #kind#name#category
+ \relax}}
%D Not all support is visible by looking at the \TEX\ code; here is one of those:^
%D
@@ -1920,6 +2150,55 @@
%D \stopinteractionmenu
%D \stoptyping
+%D Relatively new:
+%D
+%D \starttyping
+%D \chapter{The never ending story}
+%D
+%D \section{An ending story}
+%D
+%D \in{chapter}[match(complex bibliographies)]
+%D \in{chapter}[match(never ending)]
+%D \in{chapter}[match(ending)]
+%D \in{chapter}[match(chapter:never ending)]
+%D \in{chapter}[match(chapter:ending)]
+%D \in{section}[match(section:ending)]
+%D \in{figure}[match(float:mess)]
+%D \in{figure}[match(figure:mess)]
+%D \in{figure (not found)}[match(section:mess)]
+%D \in{figure (not found)}[match(section:xxxx)]
+%D \in{figure}[match(mess)]
+%D
+%D \placefigure{What a mess}{}
+%D
+%D \chapter{About complex bibliographies}
+%D
+%D \in{chapter}[match(complex bibliographies)]
+%D \in{chapter}[match(never ending)]
+%D \in{figure}[match(mess)]
+%D \stoptyping
+
+%D Tracing:
+
+\unexpanded\def\strc_references_tracer#1#2% \csleft csright
+ {\hbox to \zeropoint \bgroup
+ \hss
+ \infofont
+ \darkblue
+ \ifx#1\empty\else
+ \raise\strutht \hbox \s!to \zeropoint \bgroup
+ \hss#1\hskip.2\emwidth
+ \egroup
+ \fi
+ \vrule \s!height 1.5\strutht \s!depth \strutdp \s!width .1\emwidth
+ \ifx#2\empty\else
+ \raise\strutht \hbox \s!to \zeropoint \bgroup
+ \hskip.2\emwidth#2\hss
+ \egroup
+ \fi
+ \hss
+ \egroup}%
+
\protect \endinput
% tricky:
diff --git a/Master/texmf-dist/tex/context/base/strc-reg.lua b/Master/texmf-dist/tex/context/base/strc-reg.lua
index bdb2e0d6713..ed329219595 100644
--- a/Master/texmf-dist/tex/context/base/strc-reg.lua
+++ b/Master/texmf-dist/tex/context/base/strc-reg.lua
@@ -47,6 +47,8 @@ local v_text = variables.text
local context = context
local commands = commands
+local implement = interfaces.implement
+
local matchingtilldepth = sections.matchingtilldepth
local numberatdepth = sections.numberatdepth
local currentlevel = sections.currentlevel
@@ -64,6 +66,10 @@ local a_destination = attributes.private('destination')
local absmaxlevel = 5 -- \c_strc_registers_maxlevel
+local h_prefixpage = helpers.prefixpage
+local h_prefixlastpage = helpers.prefixlastpage
+local h_title = helpers.title
+
local ctx_startregisteroutput = context.startregisteroutput
local ctx_stopregisteroutput = context.stopregisteroutput
local ctx_startregistersection = context.startregistersection
@@ -74,13 +80,115 @@ local ctx_startregisterentry = context.startregisterentry
local ctx_stopregisterentry = context.stopregisterentry
local ctx_startregisterpages = context.startregisterpages
local ctx_stopregisterpages = context.stopregisterpages
-local ctx_stopregisterseewords = context.stopregisterseewords
local ctx_startregisterseewords = context.startregisterseewords
+local ctx_stopregisterseewords = context.stopregisterseewords
local ctx_registerentry = context.registerentry
local ctx_registerseeword = context.registerseeword
local ctx_registerpagerange = context.registerpagerange
local ctx_registeronepage = context.registeronepage
+-- possible export, but ugly code (overloads)
+--
+-- local output, section, entries, nofentries, pages, words, rawtext
+--
+-- h_title = function(a,b) rawtext = a end
+--
+-- local function ctx_startregisteroutput()
+-- output = { }
+-- section = nil
+-- entries = nil
+-- nofentries = nil
+-- pages = nil
+-- words = nil
+-- rawtext = nil
+-- end
+-- local function ctx_stopregisteroutput()
+-- inspect(output)
+-- output = nil
+-- section = nil
+-- entries = nil
+-- nofentries = nil
+-- pages = nil
+-- words = nil
+-- rawtext = nil
+-- end
+-- local function ctx_startregistersection(tag)
+-- section = { }
+-- output[#output+1] = {
+-- section = section,
+-- tag = tag,
+-- }
+-- end
+-- local function ctx_stopregistersection()
+-- end
+-- local function ctx_startregisterentries(n)
+-- entries = { }
+-- nofentries = 0
+-- section[#section+1] = entries
+-- end
+-- local function ctx_stopregisterentries()
+-- end
+-- local function ctx_startregisterentry(n) -- or subentries (nested?)
+-- nofentries = nofentries + 1
+-- entry = { }
+-- entries[nofentries] = entry
+-- end
+-- local function ctx_stopregisterentry()
+-- nofentries = nofentries - 1
+-- entry = entries[nofentries]
+-- end
+-- local function ctx_startregisterpages()
+-- pages = { }
+-- entry.pages = pages
+-- end
+-- local function ctx_stopregisterpages()
+-- end
+-- local function ctx_startregisterseewords()
+-- words = { }
+-- entry.words = words
+-- end
+-- local function ctx_stopregisterseewords()
+-- end
+-- local function ctx_registerentry(processor,internal,seeparent,text)
+-- text()
+-- entry.text = {
+-- processor = processor,
+-- internal = internal,
+-- seeparent = seeparent,
+-- text = rawtext,
+-- }
+-- end
+-- local function ctx_registerseeword(i,n,processor,internal,seeindex,seetext)
+-- seetext()
+-- entry.words[i] = {
+-- processor = processor,
+-- internal = internal,
+-- seeparent = seeparent,
+-- seetext = rawtext,
+-- }
+-- end
+-- local function ctx_registerpagerange(fprocessor,finternal,frealpage,lprocessor,linternal,lrealpage)
+-- pages[#pages+1] = {
+-- first = {
+-- processor = fprocessor,
+-- internal = finternal,
+-- realpage = frealpage,
+-- },
+-- last = {
+-- processor = lprocessor,
+-- internal = linternal,
+-- realpage = lrealpage,
+-- },
+-- }
+-- end
+-- local function ctx_registeronepage(processor,internal,realpage)
+-- pages[#pages+1] = {
+-- processor = processor,
+-- internal = internal,
+-- realpage = realpage,
+-- }
+-- end
+
-- some day we will share registers and lists (although there are some conceptual
-- differences in the application of keywords)
@@ -194,6 +302,7 @@ local function filtercollected(names,criterium,number,collected,prevmode)
end
else -- sectionname, number
-- beware, this works ok for registers
+ -- to be redone with reference instead
local depth = sections.getlevel(criterium)
local number = tonumber(number) or numberatdepth(depth) or 0
if trace_registers then
@@ -309,30 +418,71 @@ end
registers.define = defineregister -- 4 times is somewhat over the top but we want consistency
registers.setmethod = defineregister -- and we might have a difference some day
-commands.defineregister = defineregister
-commands.setregistermethod = defineregister
+
+implement {
+ name = "defineregister",
+ actions = defineregister,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "setregistermethod",
+ actions = defineregister, -- duplicate use
+ arguments = { "string", "string" }
+}
local entrysplitter = lpeg.tsplitat('+') -- & obsolete in mkiv
local tagged = { }
+-- this whole splitting is an inheritance of mkii
+
local function preprocessentries(rawdata)
local entries = rawdata.entries
if entries then
- local e, k = entries[1] or "", entries[2] or ""
- local et, kt, entryproc, pageproc
- if type(e) == "table" then
- et = e
- else
- entryproc, e = splitprocessor(e)
+ --
+ -- local e = entries[1] or ""
+ -- local k = entries[2] or ""
+ -- local et, kt, entryproc, pageproc
+ -- if type(e) == "table" then
+ -- et = e
+ -- else
+ -- entryproc, e = splitprocessor(e)
+ -- et = lpegmatch(entrysplitter,e)
+ -- end
+ -- if type(k) == "table" then
+ -- kt = k
+ -- else
+ -- pageproc, k = splitprocessor(k)
+ -- kt = lpegmatch(entrysplitter,k)
+ -- end
+ --
+ local processors = rawdata.processors
+ local et = entries.entries
+ local kt = entries.keys
+ local entryproc = processors and processors.entry
+ local pageproc = processors and processors.page
+ if entryproc == "" then
+ entryproc = nil
+ end
+ if pageproc == "" then
+ pageproc = nil
+ end
+ if not et then
+ local p, e = splitprocessor(entries.entry or "")
+ if p then
+ entryproc = p
+ end
et = lpegmatch(entrysplitter,e)
end
- if type(k) == "table" then
- kt = k
- else
- pageproc, k = splitprocessor(k)
+ if not kt then
+ local p, k = splitprocessor(entries.key or "")
+ if p then
+ pageproc = p
+ end
kt = lpegmatch(entrysplitter,k)
end
+ --
entries = { }
local ok = false
for k=#et,1,-1 do
@@ -347,7 +497,7 @@ local function preprocessentries(rawdata)
end
rawdata.list = entries
if pageproc or entryproc then
- rawdata.processors = { entryproc, pageproc }
+ rawdata.processors = { entryproc, pageproc } -- old way: indexed .. will be keys
end
rawdata.entries = nil
end
@@ -361,6 +511,11 @@ local function storeregister(rawdata) -- metadata, references, entries
local references = rawdata.references
local metadata = rawdata.metadata
-- checking
+ if not metadata then
+ metadata = { }
+ rawdata.metadata = metadata
+ end
+ --
if not metadata.kind then
metadata.kind = "entry"
end
@@ -372,6 +527,11 @@ local function storeregister(rawdata) -- metadata, references, entries
local name = metadata.name
local notsaved = tobesaved[name].metadata.notsaved
--
+ if not references then
+ references = { }
+ rawdata.references = references
+ end
+ --
local internal = references.internal
if not internal then
internal = texgetcount("locationcount") -- we assume that it has been set
@@ -408,7 +568,9 @@ local function storeregister(rawdata) -- metadata, references, entries
return #entries
end
-local function enhanceregister(name,n)
+registers.store = storeregister
+
+function registers.enhance(name,n)
local data = tobesaved[name].metadata.notsaved and collected[name] or tobesaved[name]
local entry = data.entries[n]
if entry then
@@ -416,7 +578,7 @@ local function enhanceregister(name,n)
end
end
-local function extendregister(name,tag,rawdata) -- maybe do lastsection internally
+function registers.extend(name,tag,rawdata) -- maybe do lastsection internally
if type(tag) == "string" then
tag = tagged[tag]
end
@@ -460,18 +622,70 @@ local function extendregister(name,tag,rawdata) -- maybe do lastsection internal
end
end
-registers.store = storeregister
-registers.enhance = enhanceregister
-registers.extend = extendregister
-
-function commands.storeregister(rawdata)
- local nofentries = storeregister(rawdata)
- setinternalreference(nil,nil,rawdata.references.internal)
- context(nofentries)
+function registers.get(tag,n)
+ local list = tobesaved[tag]
+ return list and list.entries[n]
end
-commands.enhanceregister = enhanceregister
-commands.extendregister = extendregister
+implement {
+ name = "enhanceregister",
+ actions = registers.enhance,
+ arguments = { "string", "integer" }
+}
+
+implement {
+ name = "extendregister",
+ actions = registers.extend,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "storeregister",
+ actions = function(rawdata)
+ local nofentries = storeregister(rawdata)
+ setinternalreference { internal = rawdata.references.internal }
+ context(nofentries)
+ end,
+ arguments = {
+ {
+ { "metadata", {
+ { "kind" },
+ { "name" },
+ { "coding" },
+ { "level", "integer" },
+ { "catcodes", "integer" },
+ { "own" },
+ { "xmlroot" },
+ { "xmlsetup" }
+ }
+ },
+ { "entries", {
+ { "entries", "list" },
+ { "keys", "list" },
+ { "entry" },
+ { "key" }
+ }
+ },
+ { "references", {
+ { "internal", "integer" },
+ { "section", "integer" },
+ { "label" }
+ }
+ },
+ { "seeword", {
+ { "text" }
+ }
+ },
+ { "processors", {
+ { "entry" },
+ { "key" },
+ { "page" }
+ }
+ },
+ { "userdata" },
+ }
+ }
+}
-- sorting and rendering
@@ -508,7 +722,7 @@ end
local seeindex = 0
--- meerdere loops, seewords, dan words, an seewords
+-- meerdere loops, seewords, dan words, anders seewords
local function crosslinkseewords(result) -- all words
-- collect all seewords
@@ -712,10 +926,21 @@ end
registers.analyze = analyzeregister
-function registers.analyze(class,options)
- context(analyzeregister(class,options))
-end
-
+implement {
+ name = "analyzeregister",
+ actions = { analyzeregister, context },
+ arguments = {
+ "string",
+ {
+ { "language" },
+ { "method" },
+ { "numberorder" },
+ { "compress" },
+ { "criterium" },
+ { "pagenumber", "boolean" },
+ }
+ }
+}
-- todo take conversion from index
@@ -724,20 +949,14 @@ function registers.userdata(index,name)
return data and data.userdata and data.userdata[name] or nil
end
-function commands.registeruserdata(index,name)
- local data = references.internals[tonumber(index)]
- data = data and data.userdata and data.userdata[name]
- if data then
- context(data)
- end
-end
+implement {
+ name = "registeruserdata",
+ actions = { registers.userdata, context },
+ arguments = { "integer", "string" }
+}
-- todo: ownnumber
-local h_prefixpage = helpers.prefixpage
-local h_prefixlastpage = helpers.prefixlastpage
-local h_title = helpers.title
-
local function pagerange(f_entry,t_entry,is_last,prefixspec,pagespec)
local fer, ter = f_entry.references, t_entry.references
ctx_registerpagerange(
@@ -873,8 +1092,8 @@ function registers.flush(data,options,prefixspec,pagespec)
if #list > 1 then
list[#list] = nil
else
- -- we have an \seeindex{Foo}{Bar} without Foo being defined anywhere
- report_registers("invalid see entry in register %a, reference %a",entry.metadata.name,list[1][1])
+ -- we have an \seeindex{Foo}{Bar} without Foo being defined anywhere .. somehow this message is wrong
+ -- report_registers("invalid see entry in register %a, reference %a",entry.metadata.name,list[1][1])
end
end
end
@@ -882,60 +1101,68 @@ function registers.flush(data,options,prefixspec,pagespec)
-- but we don't want to allocate too many entries so there we go
while d < #data do
d = d + 1
- local entry = data[d]
+ local entry = data[d]
+ local metadata = entry.metadata
+ local kind = metadata.kind
+ local list = entry.list
local e = { false, false, false }
for i=3,maxlevel do
e[i] = false
end
- local metadata = entry.metadata
- local kind = metadata.kind
- local list = entry.list
for i=1,maxlevel do
if list[i] then
e[i] = list[i][1]
end
- if e[i] ~= done[i] then
- if e[i] and e[i] ~= "" then
- done[i] = e[i]
- for j=i+1,maxlevel do
- done[j] = false
- end
- if started then
- ctx_stopregisterentry()
- started = false
- end
- if n == i then
+ if e[i] == done[i] then
+ -- skip
+ elseif not e[i] then
+ -- see ends up here
+ -- can't happen any more
+ done[i] = false
+ for j=i+1,maxlevel do
+ done[j] = false
+ end
+ elseif e[i] == "" then
+ done[i] = false
+ for j=i+1,maxlevel do
+ done[j] = false
+ end
+ else
+ done[i] = e[i]
+ for j=i+1,maxlevel do
+ done[j] = false
+ end
+ if started then
+ ctx_stopregisterentry()
+ started = false
+ end
+ if n == i then
-- ctx_stopregisterentries()
-- ctx_startregisterentries(n)
- else
- while n > i do
- n = n - 1
- ctx_stopregisterentries()
- end
- while n < i do
- n = n + 1
- ctx_startregisterentries(n)
- end
+ else
+ while n > i do
+ n = n - 1
+ ctx_stopregisterentries()
end
- local references = entry.references
- local processors = entry.processors
- local internal = references.internal or 0
- local seeparent = references.seeparent or ""
- local processor = processors and processors[1] or ""
- -- so, we need to keep e as is (local), or we need local title = e[i] ... which might be
- -- more of a problem
- ctx_startregisterentry(0) -- will become a counter
- started = true
- if metadata then
- ctx_registerentry(processor,internal,seeparent,function() h_title(e[i],metadata) end)
- else -- ?
- ctx_registerentry(processor,internal,seeindex,e[i])
+ while n < i do
+ n = n + 1
+ ctx_startregisterentries(n)
end
+ end
+ local references = entry.references
+ local processors = entry.processors
+ local internal = references.internal or 0
+ local seeparent = references.seeparent or ""
+ local processor = processors and processors[1] or ""
+ -- so, we need to keep e as is (local), or we need local title = e[i] ... which might be
+ -- more of a problem
+ ctx_startregisterentry(0) -- will become a counter
+ started = true
+ if metadata then
+ ctx_registerentry(processor,internal,seeparent,function() h_title(e[i],metadata) end)
else
- done[i] = false
- for j=i+1,maxlevel do
- done[j] = false
- end
+ -- can this happen?
+ ctx_registerentry(processor,internal,seeindex,e[i])
end
end
end
@@ -1051,7 +1278,8 @@ function registers.flush(data,options,prefixspec,pagespec)
local seetext = seeword.text or ""
local processor = seeword.processor or (entry.processors and entry.processors[1]) or ""
local seeindex = entry.references.seeindex or ""
- ctx_registerseeword(i,n,processor,0,seeindex,seetext)
+ -- ctx_registerseeword(i,nt,processor,0,seeindex,seetext)
+ ctx_registerseeword(i,nt,processor,0,seeindex,function() h_title(seetext,metadata) end)
end
ctx_stopregisterseewords()
end
@@ -1078,12 +1306,42 @@ function registers.flush(data,options,prefixspec,pagespec)
-- collectgarbage("collect")
end
-local function processregister(class,...)
+function registers.process(class,...)
if analyzeregister(class,...) > 0 then
local data = collected[class]
registers.flush(data,...)
end
end
-registers.process = processregister
-commands.processregister = processregister
+implement {
+ name = "processregister",
+ actions = registers.process,
+ arguments = {
+ "string",
+ {
+ { "language" },
+ { "method" },
+ { "numberorder" },
+ { "compress" },
+ { "criterium" },
+ { "pagenumber", "boolean" },
+ },
+ {
+ { "separatorset" },
+ { "conversionset" },
+ { "starter" },
+ { "stopper" },
+ { "set" },
+ { "segments" },
+ { "connector" },
+ },
+ {
+ { "prefix" },
+ { "separatorset" },
+ { "conversionset" },
+ { "starter" },
+ { "stopper" },
+ { "segments" },
+ }
+ }
+}
diff --git a/Master/texmf-dist/tex/context/base/strc-reg.mkiv b/Master/texmf-dist/tex/context/base/strc-reg.mkiv
index d072aca69b1..138a1486f3e 100644
--- a/Master/texmf-dist/tex/context/base/strc-reg.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-reg.mkiv
@@ -134,7 +134,7 @@
\ifconditional\c_strc_registers_defining \else % todo: dosingle ...
\settrue\c_strc_registers_defining
\definemixedcolumns[\currentregister][\v!register]% first as otherwise it overloads start/stop
- \ctxcommand{defineregister("\currentregister","\registerparameter\c!referencemethod")}%
+ \clf_defineregister{\currentregister}{\registerparameter\c!referencemethod}%
\normalexpanded{\presetheadtext[\currentregister=\Word{\currentregister}]}%
\setuevalue{\currentregister}{\dodoubleempty\strc_registers_insert_entry[\currentregister]}%
\setuevalue{\e!see\currentregister}{\dodoubleempty\strc_registers_insert_see[\currentregister]}%
@@ -155,7 +155,7 @@
\to \everydefineregister
\appendtoks
- \ctxcommand{setregistermethod("\currentregister","\registerparameter\c!referencemethod")}%
+ \clf_setregistermethod{\currentregister}{\registerparameter\c!referencemethod}%
\to \everysetupregister
%D Registering:
@@ -251,49 +251,49 @@
\setnextinternalreference
% we could consider storing register entries in a list which we
% could then sort
- \xdef\currentregisternumber{\ctxcommand{storeregister{ % 'own' should not be in metadata
- metadata = {
- % kind = "entry",
- name = "\currentregister",
- % level = structures.sections.currentlevel(),
- coding = "\currentregistercoding",
- % catcodes = \the\catcodetable,
+ \xdef\currentregisternumber{\clf_storeregister % 'own' should not be in metadata
+ metadata {%
+ name {\currentregister}%
+ coding {\currentregistercoding}%
\ifx\currentregisterownnumber\v!yes
- own = "\registerparameter\c!alternative", % can be used instead of pagenumber
+ own {\registerparameter\c!alternative}% can be used instead of pagenumber
\fi
\ifx\currentreferencecoding\s!xml
- xmlroot = "\xmldocument", % only useful when text
+ xmlroot {\xmldocument} % only useful when text
\fi
\ifx\currentregisterxmlsetup\empty \else
- xmlsetup = "\currentregisterxmlsetup",
+ xmlsetup {\currentregisterxmlsetup}%
\fi
- },
- references = {
- % internal = \nextinternalreference,
- % section = structures.sections.currentid(), % hm, why then not also lastsection the same way
+ }%
+ references {%
\ifx\currentregisterlabel\empty \else
- label = "\currentregisterlabel",
+ label {\currentregisterlabel}%
\fi
- },
- % \ifx\currentregisterentries\empty \else
- entries = {
+ }%
+ entries {%
% we need a special one for xml, this is just a single one
\ifx\currentregisterentries\empty
- { \!!bs\currentregisterentriesa\!!es, \!!bs\currentregisterentriesb\!!es, \!!bs\currentregisterentriesc\!!es },
+ entries {
+ {\currentregisterentriesa}%
+ {\currentregisterentriesb}%
+ {\currentregisterentriesc}%
+ }
\else
- \!!bs\currentregisterentries\!!es,
+ entry {\currentregisterentries}%
\fi
\ifx\currentregisterkeys\empty
- { \!!bs\currentregisterkeysa\!!es, \!!bs\currentregisterkeysb\!!es, \!!bs\currentregisterkeysc\!!es },
+ keys {
+ {\currentregisterkeysa}%
+ {\currentregisterkeysb}%
+ {\currentregisterkeysc}%
+ }
\else
- \!!bs\currentregisterkeys\!!es,
+ key {\currentregisterkeys}%
\fi
- },
- % \fi
- userdata = structures.helpers.touserdata(\!!bs\detokenize{#3}\!!es)
- }
- }}%
- % \ctxcommand{setinternalreference(nil,nil,\nextinternalreference)}% in previous
+ }%
+ userdata {\detokenize\expandafter{\normalexpanded{#3}}}
+ }%
+ % \clf_setinternalreference internal \nextinternalreference\relax % in previous
\ifx\currentregisterownnumber\v!yes
\glet\currentregistersynchronize\relax
\else
@@ -302,9 +302,42 @@
\currentregistersynchronize % here?
% needs thinking ... bla\index{bla}. will break before the . but adding a
% penalty is also no solution
+ \dostarttagged\t!registerlocation\currentregister
+ \attribute\destinationattribute\lastdestinationattribute \signalcharacter % no \strut as it will be removed during cleanup
+ \dotagregisterlocation
+ \dostoptagged
+ \endgroup}
+
+\unexpanded\def\dosetfastregisterentry#1#2#3#4#5% register entry key processor processor
+ {\begingroup
+ \edef\currentregister{#1}%
+ \setnextinternalreference
+ \xdef\currentregisternumber{\clf_storeregister
+ {%
+ metadata {%
+ name {\currentregister}%
+ }
+ entries {%
+ entry {#2}%
+ key {#3}%
+ }%
+ processors {%
+ entry {#4}%
+ page {#5}%
+ }%
+ }%
+ }%
+ % overlap with the above
+ \xdef\currentregistersynchronize{\ctxlatecommand{enhanceregister("\currentregister",\currentregisternumber)}}%
+ \currentregistersynchronize % here?
+ \dostarttagged\t!registerlocation\currentregister
\attribute\destinationattribute\lastdestinationattribute \signalcharacter % no \strut as it will be removed during cleanup
+ \dotagregisterlocation
+ \dostoptagged
\endgroup}
+\let\dotagregisterlocation\relax % experiment
+
\unexpanded\def\strc_registers_insert_entry[#1][#2]%
{\def\currentregister{#1}%
\doifelse{\registerparameter\c!ownnumber}\v!yes
@@ -349,7 +382,7 @@
\def\strc_registers_finish_entry_indeed#1#2#3% register data userdata
{\begingroup
\edef\currentregister{#1}%
- \setupcurrentregister[\c!entries=,\c!label=,\c!keys=,\c!alternative=,#2]%
+ \setupcurrentregister[\c!entries=,\c!label=,\c!keys=,\c!alternative=,#2]% todo: fast setter
\edef\currentregisterlabel {\registerparameter\c!label}%
\edef\currentregisterexpansion{\registerparameter\c!expansion}%
\edef\currentregisterownnumber{\registerparameter\c!ownnumber}%
@@ -461,27 +494,28 @@
\fi
\setnextinternalreference
% we could consider storing register entries in list
- \edef\temp{\ctxcommand{storeregister{
- metadata = {
- kind = "see",
- name = "\currentregister",
- % level = structures.sections.currentlevel(),
- % catcodes = \the\catcodetable,
- },
- references = {
- % internal = \nextinternalreference,
- % section = structures.sections.currentid(),
- },
- entries = {
- % we need a special one for xml, this is just a single one
- \!!bs\currentregisterentries\!!es,
- \!!bs#2\!!es
- },
- seeword = {
- text = \!!bs\currentregisterseeword\!!es
- },
- }
+ \edef\temp{\clf_storeregister{
+ metadata {%
+ kind {see}%
+ name {\currentregister}%
+ }%
+ references {%
+ % internal = \nextinternalreference,
+ % section = structures.sections.currentid(),
+ }%
+ entries {%
+ % we need a special one for xml, this is just a single one
+ entry {\currentregisterentries}%
+ key {#2}%
+ }%
+ seeword {%
+ text {\currentregisterseeword}%
+ }%
}}%
+ \dostarttagged\t!registerlocation\currentregister
+ \attribute\destinationattribute\lastdestinationattribute \signalcharacter % no \strut as it will be removed during cleanup
+ \dotagregisterlocation
+ \dostoptagged
\endgroup}
%D Rendering:
@@ -497,14 +531,17 @@
{\begingroup
\edef\currentregister{#1}%
\setupregister[\currentregister][#2]%
- \normalexpanded{\endgroup\noexpand\xdef\noexpand\utilityregisterlength{\ctxcommand{analyzeregister('\currentregister',{
- language = "\registerparameter\s!language",
- method = "\registerparameter\c!method",
- numberorder = "\registerparameter\c!numberorder",
- compress = "\registerparameter\c!compress",
- criterium = "\registerparameter\c!criterium",
- pagenumber = \ifx\registerpageseparatorsymbol\empty false\else true\fi,
- })}}}% brrr
+ \normalexpanded{\endgroup\noexpand\xdef\noexpand\utilityregisterlength{\clf_analyzeregister
+ {\currentregister}%
+ {%
+ language {\registerparameter\s!language}%
+ method {\registerparameter\c!method}%
+ numberorder {\registerparameter\c!numberorder}%
+ compress {\registerparameter\c!compress}%
+ criterium {\registerparameter\c!criterium}%
+ pagenumber \ifx\registerpageseparatorsymbol\empty false\else true\fi
+ }%
+ }}%
\ifcase\utilityregisterlength\relax
\resetsystemmode\v!register
\else
@@ -520,27 +557,6 @@
\unexpanded\def\placeregister
{\dodoubleempty\strc_registers_place}
-% \def\strc_registers_place[#1][#2]%
-% {\iffirstargument
-% \begingroup
-% %\forgetall
-% \edef\currentregister{#1}%
-% \setupregister[\currentregister][#2]%
-% \the\everyplaceregister
-% \ifnum\registerparameter\c!n>\plusone
-% \startcolumns
-% [\c!n=\registerparameter\c!n,
-% \c!balance=\registerparameter\c!balance,
-% \c!align=\registerparameter\c!align,
-% \c!tolerance=\registerparameter\c!tolerance]%
-% \strc_registers_place_indeed
-% \stopcolumns
-% \else
-% \strc_registers_place_indeed
-% \fi
-% \endgroup
-% \fi}
-
\def\strc_registers_place[#1][#2]%
{\iffirstargument
\begingroup
@@ -558,42 +574,33 @@
\endgroup
\fi}
-% \def\strc_registers_place_columns
-% {\startmixedcolumns[\currentregister]
-% \startpacked[\v!blank]%
-% \strc_registers_place_indeed
-% \stoppacked
-% \stopmixedcolumns}
-%
-% \def\strc_registers_place_normal
-% {\startpacked[\v!blank]%
-% \strc_registers_place_indeed
-% \stoppacked}
-
\def\strc_registers_place_indeed
- {\ctxcommand{processregister('\currentregister',{
- language = "\registerparameter\s!language",
- method = "\registerparameter\c!method",
- numberorder = "\registerparameter\c!numberorder",
- compress = "\registerparameter\c!compress",
- criterium = "\registerparameter\c!criterium",
- pagenumber = \ifx\registerpageseparatorsymbol\empty false\else true\fi,
- },{
- separatorset = "\registerparameter\c!pageprefixseparatorset",
- conversionset = "\registerparameter\c!pageprefixconversionset",
- starter = \!!bs\registerparameter\c!pageprefixstarter\!!es,
- stopper = \!!bs\registerparameter\c!pageprefixstopper\!!es,
- set = "\registerparameter\c!pageprefixset",
- segments = "\registerparameter\c!pageprefixsegments",
- connector = \!!bs\registerparameter\c!pageprefixconnector\!!es,
- },{
- prefix = "\registerparameter\c!pageprefix",
- separatorset = "\registerparameter\c!pageseparatorset",
- conversionset = "\registerparameter\c!pageconversionset",
- starter = \!!bs\registerparameter\c!pagestarter\!!es,
- stopper = \!!bs\registerparameter\c!pagestopper\!!es,
- segments = "\registerparameter\c!pagesegments",
- })}}
+ {\clf_processregister
+ {\currentregister}%
+ {%
+ language {\registerparameter\s!language}%
+ method {\registerparameter\c!method}%
+ numberorder {\registerparameter\c!numberorder}%
+ compress {\registerparameter\c!compress}%
+ criterium {\registerparameter\c!criterium}%
+ pagenumber \ifx\registerpageseparatorsymbol\empty false\else true\fi
+ }{%
+ separatorset {\registerparameter\c!pageprefixseparatorset}%
+ conversionset {\registerparameter\c!pageprefixconversionset}%
+ starter {\registerparameter\c!pageprefixstarter}%
+ stopper {\registerparameter\c!pageprefixstopper}%
+ set {\registerparameter\c!pageprefixset}%
+ segments {\registerparameter\c!pageprefixsegments}%
+ connector {\registerparameter\c!pageprefixconnector}%
+ }{%
+ prefix {\registerparameter\c!pageprefix}%
+ separatorset {\registerparameter\c!pageseparatorset}%
+ conversionset {\registerparameter\c!pageconversionset}%
+ starter {\registerparameter\c!pagestarter}%
+ stopper {\registerparameter\c!pagestopper}%
+ segments {\registerparameter\c!pagesegments}%
+ }%
+ \relax}
\def\strc_registers_limited_entry#1%
{\limitatetext{#1}\currentregistermaxwidth\unknown}%
@@ -668,17 +675,19 @@
% a = <before> <goodbreak> <character> <par> <after> <nobreak>
-\setvalue{\??registerindicator a}#1%
+\def\strc_registers_indicator_a#1#2%
{\registerparameter\c!before
% bugged, why does leftskip gets set: \vskip\lineheight\goodbreak\vskip-\lineheight
+ \typo_injectors_check_register
\begingroup
\useregisterstyleandcolor\c!style\c!color
\dontleavehmode
+ \typo_injectors_mark_register
\strut
\iflocation
\dosetdirectpagereference{\currentregister:\v!section:#1}%
\fi
- \registerparameter\c!command{#1}%
+ \registerparameter\c!command{#2}%
\endgroup
\blank[\v!samepage]%
\registerparameter\c!after
@@ -687,38 +696,55 @@
% b = <goodbreak> <before> <character> <after> <nobreak>
-\setvalue{\??registerindicator b}#1% will be shared with a
+\def\strc_registers_indicator_b#1#2%
{\registerparameter\c!before
+ \typo_injectors_check_register
\begingroup
\useregisterstyleandcolor\c!style\c!color
\dontleavehmode
+ \typo_injectors_mark_register
\strut
\iflocation
\dosetdirectpagereference{\currentregister:\v!section:#1}%
\fi
- \registerparameter\c!command{#1}%
+ \registerparameter\c!command{#2}%
\endgroup
\registerparameter\c!after
\nobreak}
-\setvalue{\??registerindicator A}#1{\getvalue{\??registerindicator a}{\WORD{#1}}}
-\setvalue{\??registerindicator B}#1{\getvalue{\??registerindicator b}{\WORD{#1}}}
+\setvalue{\??registerindicator a}#1{\strc_registers_indicator_a{#1}{#1}}
+\setvalue{\??registerindicator A}#1{\strc_registers_indicator_a{#1}{\WORD{#1}}}
+\setvalue{\??registerindicator b}#1{\strc_registers_indicator_b{#1}{#1}}
+\setvalue{\??registerindicator B}#1{\strc_registers_indicator_b{#1}{\WORD{#1}}}
%D The following macros are the interface to the rendering. These are
%D generated by \LUA. This might change.
+% \showinjector
+% \setinjector[register][2][\column]
+%
+% \starttext
+% first \index{first}
+% second \index{second}
+% third \index{third}
+% fourth \index{fourth}
+% \placeregister[index]
+% \stoptext
+
+\doinstallinjector\s!register
+
%D Beware, we get funny side effects when a dangling \index precedes an
%D placeindex as then flushing takes place inside the index. Took me hours
%D to notice that.
-\newconditional\c_strc_registers_page_done
+\newconstant \c_strc_registers_page_state % 0=nothing 1=page 2=see
\newdimen \d_strc_registers_distance
\unexpanded\def\startregisteroutput
{\endgraf
\begingroup
\d_strc_registers_distance\registerparameter\c!distance\relax
- \dostarttagged\t!register\currentregister
+ \dostarttaggedchained\t!register\currentregister\??register
\forgeteverypar
\forgetparindent
\forgetparskip}
@@ -728,18 +754,6 @@
\dostoptagged
\endgroup}
-% \unexpanded\def\startregisterentries#1% depth
-% {\endgraf
-% \begingroup
-% \dostarttagged\t!registerentries\empty
-% \let\savedcurrentregister\currentregister
-% \edef\currentregister{\currentregister:#1}%
-% \useregisterstyleandcolor\c!textstyle\c!textcolor
-% \advance\leftskip\numexpr#1-\plusone\relax\dimexpr\d_strc_registers_distance\relax
-% \hangindent\registerparameter\c!distance\relax
-% \hangafter\plusone
-% \let\currentregister\savedcurrentregister}
-
\newdimen\d_strc_registers_hangindent
\newcount\c_strc_registers_hangafter
@@ -756,7 +770,7 @@
\fi
\d_strc_registers_hangindent\registerparameter\c!distance\relax
\c_strc_registers_hangafter \plusone
-\blank[\v!samepage]%
+ \blank[\v!samepage]%
\let\currentregister\savedcurrentregister}
\unexpanded\def\stopregisterentries
@@ -765,12 +779,18 @@
\endgroup}
\unexpanded\def\startregisterentry#1% todo: level
- {\begingroup
+ {\typo_injectors_check_register
+ \begingroup
+ \dostarttagged\t!registerentry\empty
+ \global\setconstant\c_strc_registers_page_state\zerocount
\hangindent\d_strc_registers_hangindent
- \hangafter \c_strc_registers_hangafter}
+ \hangafter \c_strc_registers_hangafter
+ \typo_injectors_mark_register}
\unexpanded\def\stopregisterentry
{\endgraf
+ \global\setconstant\c_strc_registers_page_state\zerocount
+ \dostoptagged
\endgroup}
\unexpanded\def\startregistersection#1% title
@@ -786,7 +806,6 @@
\unexpanded\def\startregisterpages
{\begingroup
\dostarttagged\t!registerpages\empty
- \setfalse\c_strc_registers_page_done
\useregisterstyleandcolor\c!pagestyle\c!pagecolor}
\unexpanded\def\stopregisterpages
@@ -794,9 +813,8 @@
\endgroup}
\unexpanded\def\startregisterseewords
- {\ifhmode\crlf\fi
+ {%\par % \ifhmode\crlf\fi % otherwise wrong level
\begingroup
- \setfalse\c_strc_registers_page_done
\dostarttagged\t!registerpage\empty
\useregisterstyleandcolor\c!pagestyle\c!pagecolor}
@@ -804,12 +822,17 @@
{\dostoptagged
\endgroup}
-\unexpanded\def\registerpageseparator% todo: , configurable
- {\ifconditional\c_strc_registers_page_done
- \registerpageseparatorsymbol
- \else
+\unexpanded\def\registerpageseparator % todo: , configurable
+ {\ifcase\c_strc_registers_page_state
\hskip\d_strc_registers_distance\relax
- \settrue\c_strc_registers_page_done
+ \or
+ \dostarttagged\t!registerseparator\empty
+ \registerpageseparatorsymbol % page
+ \dostoptagged
+ \or
+ \dostarttagged\t!registerseparator\empty
+ \registerpageseparatorsymbol % see
+ \dostoptagged
\fi}
\unexpanded\def\registeronepagerangeseparator
@@ -825,12 +848,14 @@
\unexpanded\def\registeronepage#1#2#3#4% #1:processor content
{\registerpageseparator
+ \global\setconstant\c_strc_registers_page_state\plusone
\dostarttagged\t!registerpage\empty
\withregisterpagecommand{#1}{#2}{#3}{#4}%
\dostoptagged}
\unexpanded\def\registerpagerange#1#2#3#4#5#6#7% #1:processor content, content todo: -- configurable
{\registerpageseparator
+ \global\setconstant\c_strc_registers_page_state\plusone
\dostarttagged\t!registerpagerange\empty
\dostarttagged\t!registerfrompage\empty
\withregisterpagecommand{#1}{#2}{#3}{#4}%
@@ -841,12 +866,8 @@
\dostoptagged
\dostoptagged}
-\let\strc_register_injector_process\relax
-\let\strc_register_injector_show \relax
-
\unexpanded\def\defaultregisterentry#1#2#3#4% #1:processor #2:internal #3:seeindex #4:word
{\def\currentregisterpageindex{#2}%
- \strc_register_injector_process
\iflocation
\def\currentregisterseeindex{#3}%
\doifelse{\registerparameter\c!interaction}\v!text
@@ -858,10 +879,9 @@
\fi}
\unexpanded\def\doapplyregisterentrycommand#1#2% processor text
- {\dostarttagged\t!registerentry\empty
+ {\dostarttagged\t!registercontent\empty
\ifx\currentregisterseeindex\empty \else
\dontleavehmode
- \strc_register_injector_show
\dosetdirectpagereference{seeindex:\currentregisterseeindex}% maybe some day we will support an area
\fi
\applyprocessor{#1}{\registerparameter\c!textcommand{\limitedregisterentry{\registerparameter\c!deeptextcommand{#2}}}}%
@@ -876,7 +896,8 @@
\fi}
\unexpanded\def\defaultregisterseeword#1#2#3#4#5#6% i n #3:processor #4:internal #5:seeindex #6:word
- {%\registerpageseparator
+ {\registerpageseparator
+ \global\setconstant\c_strc_registers_page_state\plustwo
\def\currentregisterpageindex{#4}%
\dostarttagged\t!registersee\empty
\settrue\c_strc_registers_page_done
@@ -914,7 +935,7 @@
% \placeregister[index][n=1,pagecommand=\MyRegisterPageCommand]
% \stoptext
-\def\registerpageuserdata #1#2{\ctxcommand{registeruserdata(#1,"#2")}}
+\def\registerpageuserdata #1#2{\clf_registeruserdata#1{#2}}
\def\currentregisterpageuserdata {\registerpageuserdata\currentregisterpageindex} % {#1}
% not yet ok : new internal handler names
@@ -945,7 +966,7 @@
\def\registeronepage {\registerpagebuttonsymbol\gobblefourarguments}%
\def\registerpagerange{\registerpagebuttonsymbol\gobblesevenarguments}}
-\def\setregisterpagerendering
+\unexpanded\def\setregisterpagerendering
{\doifelse{\registerparameter\c!pagenumber}\v!no
{\let \currentregisterpagesymbol\v!none}
{\edef\currentregisterpagesymbol{\registerparameter\c!symbol}}%
diff --git a/Master/texmf-dist/tex/context/base/strc-ren.mkiv b/Master/texmf-dist/tex/context/base/strc-ren.mkiv
index fdf8fb7f4a4..34903dfa02a 100644
--- a/Master/texmf-dist/tex/context/base/strc-ren.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-ren.mkiv
@@ -135,7 +135,7 @@
\unexpanded\def\strc_rendering_place_head_number_and_text
{\strc_rendering_start_placement
\setheadmarking
- \doiftextelse\getheadnumber
+ \doifelsetext\getheadnumber
\dosettructureheadnumbercontent
\doresettructureheadnumbercontent
\ifconditional\c_strc_sectioning_empty
@@ -422,7 +422,7 @@
{\dodoubleargument\strc_rendering_define_placement}
\def\strc_rendering_define_placement[#1][#2]%
- {\doifnextbgroupelse
+ {\doifelsenextbgroup
{\strc_rendering_define_placement_yes[#1][#2]}%
{\strc_rendering_define_placement_nop[#1][#2]}}
@@ -516,6 +516,11 @@
\fi
\endgroup}
+\def\fakedheadnumber{\vphantom{0}} % needed for mathplus
+
+\unexpanded\def\fakeheadnumbercontent
+ {\hbox to \zeropoint{\let\getheadnumber\fakedheadnumber\headnumbercontent}}
+
\unexpanded\def\strc_rendering_inject_number_and_text
{\edef\p_command{\headparameter\c!command}% assumes \unexpanded definition
\ifx\p_command\empty
@@ -608,6 +613,7 @@
\hsize\headtextwidth
\fi
\noindent
+ \fakeheadnumbercontent % will also be done in the other ones (force consistency with numbered)
\fi
\headtextcontent
}
@@ -629,7 +635,7 @@
\hbox {
\hfill
\headnumbercontent
- \doifrightpageelse{
+ \doifelserightpage{
\scratchdistance\leftmargindistance
} {
\scratchdistance\rightmargindistance
@@ -637,6 +643,8 @@
\hskip\dimexpr\d_strc_rendering_local_leftoffset+\scratchdistance\relax
}
}
+ \else
+ \fakeheadnumbercontent % will also be done in the other ones (force consistency with numbered)
\fi
\headtextcontent
}
@@ -650,6 +658,30 @@
% \directsetup{\??headrenderings:\v!vertical:\v!inmargin}
% \stopsetups
+%D This one is for head based numbering usage: foo 1.2 and so:
+
+\defineheadalternative
+ [\v!reverse]
+ [\c!alternative=\v!vertical,
+ \c!renderingsetup=\??headrenderings:\v!reverse]
+
+\startsetups[\??headrenderings:\v!reverse]
+ \vbox {
+ \headsetupspacing
+ \noindent
+ \begstrut
+ \setfalse\headisdisplay % so a kind of mix
+ \headtextcontent
+ \ifconditional\headshownumber
+ \kern\headnumberdistance
+ \headnumbercontent
+ \else
+ \fakeheadnumbercontent
+ \fi
+ \endstrut
+ }
+\stopsetups
+
\defineheadalternative
[\v!middle]
[\c!alternative=\v!vertical,
@@ -665,6 +697,8 @@
\strut
\headnumbercontent
\par
+ \else
+ \fakeheadnumbercontent % will also be done in the other ones (force consistency with numbered)
\fi
\begstrut
\headtextcontent
diff --git a/Master/texmf-dist/tex/context/base/strc-rsc.lua b/Master/texmf-dist/tex/context/base/strc-rsc.lua
index e2105a4efc1..627e443b2ce 100644
--- a/Master/texmf-dist/tex/context/base/strc-rsc.lua
+++ b/Master/texmf-dist/tex/context/base/strc-rsc.lua
@@ -12,7 +12,8 @@ if not modules then modules = { } end modules ['strc-rsc'] = {
-- The scanner accepts nested outer, but we don't care too much, maybe
-- some day we will have both but currently the innermost wins.
-local lpegmatch, lpegP, lpegS, lpegCs, lpegCt, lpegCf, lpegCc, lpegC, lpegCg = lpeg.match, lpeg.P, lpeg.S, lpeg.Cs, lpeg.Ct, lpeg.Cf, lpeg.Cc, lpeg.C, lpeg.Cg
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+local lpegP, lpegS, lpegCs, lpegCt, lpegCf, lpegCc, lpegC, lpegCg = lpeg.P, lpeg.S, lpeg.Cs, lpeg.Ct, lpeg.Cf, lpeg.Cc, lpeg.C, lpeg.Cg
local find = string.find
local spaces = lpegP(" ")^0
@@ -34,18 +35,28 @@ local backslash = lpegP("\\")
local endofall = spaces * lpegP(-1)
-local o_token = 1 - rparent - rbrace - lparent - lbrace -- can be made more efficient
-local a_token = 1 - rbrace
+----- o_token = 1 - rparent - rbrace - lparent - lbrace -- can be made more efficient
+----- a_token = 1 - rbrace
local s_token = 1 - lparent - lbrace
local i_token = 1 - lparent - lbrace - endofall
local f_token = 1 - lparent - lbrace - dcolon
local c_token = 1 - lparent - lbrace - tcolon
+-- experimental
+
+local o_token = lpegpatterns.nestedparents
+ + (1 - rparent - lbrace)
+local a_token = lpegpatterns.nestedbraces
+ + (1 - rbrace)
+local q_token = lpegpatterns.unsingle
+ + lpegpatterns.undouble
+
local hastexcode = lpegCg(lpegCc("has_tex") * lpegCc(true)) -- cannot be made to work
local component = lpegCg(lpegCc("component") * lpegCs(c_token^1))
local outer = lpegCg(lpegCc("outer") * lpegCs(f_token^1))
-local operation = lpegCg(lpegCc("operation") * lpegCs(o_token^1))
-local arguments = lpegCg(lpegCc("arguments") * lpegCs(a_token^0))
+----- operation = lpegCg(lpegCc("operation") * lpegCs(o_token^1))
+local operation = lpegCg(lpegCc("operation") * lpegCs(q_token + o_token^1))
+local arguments = lpegCg(lpegCc("arguments") * lpegCs(q_token + a_token^0))
local special = lpegCg(lpegCc("special") * lpegCs(s_token^1))
local inner = lpegCg(lpegCc("inner") * lpegCs(i_token^1))
@@ -56,9 +67,16 @@ local inner = lpegCg(lpegCc("inner") * lpegCs(i_token^1))
inner = inner * arguments
special = special * lparent * (operation * arguments)^-1 * rparent
-local referencesplitter = spaces * lpegCf (lpegCt("") * (component + outer)^-1 * (special + inner)^-1 * endofall, rawset)
-local prefixsplitter = lpegCs(lpegP((1-scolon)^1 * scolon)) * #-scolon * lpegCs(lpegP(1)^1)
-local componentsplitter = lpegCs(lpegP((1-scolon)^1)) * scolon * #-scolon * lpegCs(lpegP(1)^1)
+local referencesplitter = spaces
+ * lpegCf (lpegCt("") * (component + outer)^-1 * (special + inner)^-1 * endofall, rawset)
+
+local prefixsplitter = lpegCs(lpegP((1-scolon)^1 * scolon))
+ * #-scolon
+ * lpegCs(lpegP(1)^1)
+
+local componentsplitter = lpegCs(lpegP((1-scolon)^1))
+ * scolon * #-scolon
+ * lpegCs(lpegP(1)^1)
prefixsplitter = componentsplitter
@@ -135,6 +153,8 @@ references.splitcomponent = splitcomponent
-- inspect(splitreference([[ outer :: inner { argument } ]]))
-- inspect(splitreference([[ special ( outer :: operation ) ]]))
+-- inspect(splitreference([[inner(foo,bar)]]))
+
-- inspect(splitreference([[]]))
-- inspect(splitreference([[inner]]))
-- inspect(splitreference([[special(operation{argument,argument})]]))
@@ -152,3 +172,14 @@ references.splitcomponent = splitcomponent
-- inspect(splitreference([[outer::special()]]))
-- inspect(splitreference([[outer::inner{argument}]]))
-- inspect(splitreference([[special(outer::operation)]]))
+
+-- inspect(splitreference([[special(operation)]]))
+-- inspect(splitreference([[special(operation(whatever))]]))
+-- inspect(splitreference([[special(operation{argument,argument{whatever}})]]))
+-- inspect(splitreference([[special(operation{argument{whatever}})]]))
+
+-- inspect(splitreference([[special("operation(")]]))
+-- inspect(splitreference([[special("operation(whatever")]]))
+-- inspect(splitreference([[special(operation{"argument,argument{whatever"})]]))
+-- inspect(splitreference([[special(operation{"argument{whatever"})]]))
+
diff --git a/Master/texmf-dist/tex/context/base/strc-sbe.mkiv b/Master/texmf-dist/tex/context/base/strc-sbe.mkiv
index fc48307ec06..9f1d214cfda 100644
--- a/Master/texmf-dist/tex/context/base/strc-sbe.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-sbe.mkiv
@@ -65,7 +65,7 @@
\resetallstructuremarks
\strc_sectionblock_get_environment\currentsectionblock
\sectionblockparameter\c!before % don't move
- \dostarttagged\t!division\currentsectionblock
+ \dostarttagged\t!division\currentsectionblock % no parents
\to \everybeforesectionblock
\appendtoks
@@ -81,7 +81,9 @@
\def\strc_sectionblock_set[#1][#2]% used to set the default
{\edef\currentsectionblock{#1}% from now on we assume a value
\setupcurrentsectionblock[#2]%
- \ctxcommand{setsectionblock("#1", { bookmark = "\sectionblockparameter\c!bookmark" })}}
+ \clf_setsectionblock{#1}
+ bookmark {\sectionblockparameter\c!bookmark}%
+ \relax}
\let\currentsectionblock\empty % was \s!unknown
@@ -93,7 +95,9 @@
\begingroup
\edef\currentsectionblock{#1}% from now on we assume a value
\setupcurrentsectionblock[#2]%
- \ctxcommand{pushsectionblock("#1", { bookmark = "\sectionblockparameter\c!bookmark" })}%
+ \clf_pushsectionblock{#1}
+ bookmark {\sectionblockparameter\c!bookmark}%
+ \relax
\csname #1true\endcsname % obsolete
\setsystemmode\currentsectionblock
\the\everybeforesectionblock\relax
@@ -102,7 +106,7 @@
\unexpanded\def\stopsectionblock
{\showmessage\m!structures2\currentsectionblock
\the\everyaftersectionblock\relax
- \ctxcommand{popsectionblock()}%
+ \clf_popsectionblock
\endgroup}
%D \starttyping
diff --git a/Master/texmf-dist/tex/context/base/strc-sec.mkiv b/Master/texmf-dist/tex/context/base/strc-sec.mkiv
index 5adfeba1edb..f2a183601cb 100644
--- a/Master/texmf-dist/tex/context/base/strc-sec.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-sec.mkiv
@@ -175,71 +175,68 @@
\setnextinternalreference
\storeinternalreference\currentstructurename\nextinternalreference %
\strc_sectioning_set_reference_prefix
- \ctxcommand{% todo: combine with next call, adapt marks accordingly
- setsectionentry{
- references = {
- internal = \nextinternalreference,
- block = "\currentsectionblock",
- reference = "\currentstructurereference",
- referenceprefix = "\currentstructurereferenceprefix",
- backreference = "\currentstructurebackreference",
- },
- directives = {
- resetset = "\structureparameter\c!sectionresetset",
- },
- metadata = {
- kind = "section",
- name = "\currentstructurename",
- catcodes = \the\ifx\currentstructurecatcodes\empty\catcodetable\else\csname\currentstructurecatcodes\endcsname\fi,
- coding = "\currentstructurecoding",
- \ifx\currentstructurecoding\s!xml
- xmlroot = "\xmldocument",
- \fi
- \ifx\currentstructurexmlsetup\empty \else
- xmlsetup = "\currentstructurexmlsetup",
- \fi
- \ifx\currentstructuresaveinlist\v!no
- nolist = true,
- \fi
- \ifx\currentstructureincrementnumber\v!yes
- increment = "\currentstructureincrementnumber",
- \fi
- },
- titledata = { % we can add mark and reference
- label = \!!bs\detokenize\expandafter{\currentstructurelabel }\!!es,
- title = \!!bs\detokenize\expandafter{\currentstructuretitle }\!!es,
- \ifx\currentstructurebookmark\currentstructuretitle \else
- bookmark = \!!bs\detokenize\expandafter{\currentstructurebookmark }\!!es,
- \fi
- \ifx\currentstructuremarking\currentstructuretitle \else
- marking = \!!bs\detokenize\expandafter{\currentstructuremarking }\!!es,
- \fi
- \ifx\currentstructuresaveinlist\v!no \else
- \ifx\currentstructurelist\currentstructuretitle \else
- list = \!!bs\detokenize\expandafter{\currentstructurelist}\!!es,
- \fi
- \fi
- },
- numberdata = {
- % needed ?
- block = "\currentsectionblock",
- \ifx\currentstructureshownumber\v!no
- hidenumber = true, % titles
- \fi
- % so far
- separatorset = "\structureparameter\c!sectionseparatorset",
- conversion = "\structureparameter\c!sectionconversion", % for good old times sake
- conversionset = "\structureparameter\c!sectionconversionset",
- starter = \!!bs\structureparameter\c!sectionstarter\!!es,
- stopper = \!!bs\structureparameter\c!sectionstopper\!!es,
- set = "\structureparameter\c!sectionset",
- segments = "\structureparameter\c!sectionsegments",
- ownnumber = "\currentstructureownnumber",
- },
- userdata = \!!bs\detokenize{#3}\!!es % will be converted to table at the lua end
+ \clf_setsectionentry
+ references {
+ internal \nextinternalreference\space
+ % block {\currentsectionblock}
+ prefix {\currentstructurereferenceprefix}
+ reference {\currentstructurereference}
+ backreference {\currentstructurebackreference}
}
- }%
- \xdef\currentstructurelistnumber{\ctxcommand{currentsectiontolist()}}%
+ directives {
+ resetset {\structureparameter\c!sectionresetset}
+ }
+ metadata {
+ kind {section}
+ name {\currentstructurename}
+ catcodes \ifx\currentstructurecatcodes\empty\catcodetable\else\csname\currentstructurecatcodes\endcsname\fi\space
+ coding {\currentstructurecoding}
+ \ifx\currentstructurecoding\s!xml
+ xmlroot {\xmldocument}
+ \fi
+ \ifx\currentstructurexmlsetup\empty \else
+ xmlsetup {\currentstructurexmlsetup}
+ \fi
+ \ifx\currentstructuresaveinlist\v!no
+ nolist \space true\space
+ \fi
+ \ifx\currentstructureincrementnumber\v!yes
+ increment {\currentstructureincrementnumber}
+ \fi
+ }
+ titledata {
+ label {\detokenize\expandafter{\currentstructurelabel}}
+ title {\detokenize\expandafter{\currentstructuretitle}}
+ \ifx\currentstructurebookmark\currentstructuretitle \else
+ bookmark {\detokenize\expandafter{\currentstructurebookmark}}
+ \fi
+ \ifx\currentstructuremarking\currentstructuretitle \else
+ marking {\detokenize\expandafter{\currentstructuremarking}}
+ \fi
+ \ifx\currentstructuresaveinlist\v!no \else
+ \ifx\currentstructurelist\currentstructuretitle \else
+ list {\detokenize\expandafter{\currentstructurelist}}
+ \fi
+ \fi
+ }
+ numberdata {
+ % block {\currentsectionblock}
+ \ifx\currentstructureshownumber\v!no
+ hidenumber \space true\space
+ \fi
+ separatorset {\structureparameter\c!sectionseparatorset}
+ conversionset {\structureparameter\c!sectionconversionset}
+ conversion {\structureparameter\c!sectionconversion}
+ starter {\structureparameter\c!sectionstarter}
+ stopper {\structureparameter\c!sectionstopper}
+ set {\structureparameter\c!sectionset}
+ segments {\structureparameter\c!sectionsegments}
+ ownnumber {\currentstructureownnumber}
+ language {\currentlanguage}% for the moment, needed for bookmarks conversion
+ }
+ userdata {\detokenize{#3}}% will be converted to table at the lua end
+ \relax
+ \xdef\currentstructurelistnumber{\clf_currentsectiontolist}%
% \currentstructuresynchronize has to be called someplace, since it introduces a node
\setstructuresynchronization\currentstructurelistnumber
\endgroup}
@@ -266,16 +263,15 @@
% todo: #1 => "#1" ... adapt lua code for name and number
-\def\structurenumber {\ctxcommand{structurenumber()}}
-\def\structuretitle {\ctxcommand{structuretitle()}}
-\def\structurevariable #1{\ctxcommand{structurevariable("#1")}}
-\def\structureuservariable #1{\ctxcommand{structureuservariable("#1")}}
-\def\structurecatcodedget #1{\ctxcommand{structurecatcodedget("#1")}} % bad name
-\def\structuregivencatcodedget #1#2{\ctxcommand{structuregivencatcodedget("#1",\number#2)}} % bad name
-\def\structureautocatcodedget #1#2{\ctxcommand{structureautocatcodedget ("#1","#2")}}
-
-\def\namedstructurevariable #1#2{\ctxcommand{namedstructurevariable ("#1","#2")}}
-\def\namedstructureuservariable#1#2{\ctxcommand{namedstructureuservariable("#1","#2")}}
+\def\structurenumber {\clf_structurenumber}
+\def\structuretitle {\clf_structuretitle}
+\def\structurevariable #1{\clf_structurevariable {#1}}
+\def\structureuservariable #1{\clf_structureuservariable {#1}}
+\def\structurecatcodedget #1{\clf_structurecatcodedget {#1}} % bad name
+\def\structuregivencatcodedget #1#2{\clf_structuregivencatcodedget {#1}#2 } % bad name
+\def\structureautocatcodedget #1#2{\clf_structureautocatcodedget {#1}{#2}}
+\def\namedstructurevariable #1#2{\clf_namedstructurevariable {#1}{#2}}
+\def\namedstructureuservariable#1#2{\clf_namedstructureuservariable{#1}{#2}}
% compatibility issue:
%
@@ -305,18 +301,14 @@
\newconditional\c_strc_rendering_continuous % not used (mkii ?)
-\def\setstructurelevel #1#2{\ctxcommand{setsectionlevel("#1","#2")}} % name, level|parent
-\def\getstructurelevel #1{\ctxcommand{getcurrentsectionlevel("#1")}}% name
-\def\setstructurenumber #1#2{\ctxcommand{setsectionnumber(#1,"#2")}} % level, number (+/-)
-\def\getstructurenumber #1{\ctxcommand{getsectionnumber(#1)}} % level
-\def\getsomestructurenumber #1#2{\ctxcommand{getsectionnumber(#1,"#2")}} % level, what
-\def\getfullstructurenumber #1{\ctxcommand{getfullsectionnumber(#1)}} % level
-\def\getsomefullstructurenumber#1#2{\ctxcommand{getfullsectionnumber(#1,"#2")}}
-\def\getspecificstructuretitle #1{\ctxcommand{getstructuredata("#1","titledata.title",nil,"\headparameter\s!catcodes")}}%
-
-% will be:
-%
-% \def\getfullstructurenumber #1{\ctxcommand{structurenumber(\thenamedheadlevel{#1})}}
+\def\setstructurelevel #1#2{\clf_setstructurelevel {#1}{#2}} % name, level|parent
+\def\getstructurelevel #1{\clf_getstructurelevel {#1}} % name
+\def\setstructurenumber #1#2{\clf_setstructurenumber #1{#2}} % level, number (+/-)
+\def\getstructurenumber #1{\clf_getstructurenumber #1 } % level
+\def\getsomestructurenumber #1#2{\clf_getsomestructurenumber #1{#2}} % level, what
+\def\getfullstructurenumber #1{\clf_getfullstructurenumber #1 } % level
+\def\getsomefullstructurenumber#1#2{\clf_getsomefullstructurenumber #1{#2}} % level, what
+\def\getspecificstructuretitle #1{\clf_getspecificstructuretitle {#1}{\headparameter\s!catcodes}}
% structure heads (like \startchapter)
@@ -412,7 +404,7 @@
\definemarking[\currenthead] [\currentheadsection]%
\definemarking[\currenthead\v!number][\currentheadsection]%
\setupmarking [\currenthead] [\c!filtercommand=\noexpand\sectionheadmarkingtitle {\currenthead}]%
- \setupmarking [\currenthead\c!number][\c!filtercommand=\noexpand\sectionheadmarkingnumber{\currenthead}]%
+ \setupmarking [\currenthead\v!number][\c!filtercommand=\noexpand\sectionheadmarkingnumber{\currenthead}]%
}%
\doifelselist\currenthead\donothing
{\definelist[\currenthead][\c!prefix=\v!no]}%
@@ -430,23 +422,30 @@
\the\everysetuphead
\to \everydefinehead
+\newtoks\everyredefinehead
+
\appendtoks
- \setstructurelevel\currenthead{\thenamedheadlevel\currenthead}%
+ \the\everyredefinehead
\to \everydefinehead
\appendtoks
+ \setstructurelevel\currenthead{\thenamedheadlevel\currenthead}%
+\to \everyredefinehead
+
+\appendtoks
% beware, this is a global register
\begingroup
\edef\currentsectionheadcoupling{\sectionheadcoupling\currenthead}%
\edef\currentsectionheadsection {\sectionheadsection \currentsectionheadcoupling}%
\edef\currentsectionlevel {\sectionlevel \currentsectionheadsection}%
- \ctxcommand{registersection("\currenthead",{
- coupling = "\currentsectionheadcoupling",
- section = "\currentsectionheadsection",
- level = \currentsectionlevel,
- })}%
+ \clf_registersection {\currenthead} {
+ coupling {\currentsectionheadcoupling}
+ section {\currentsectionheadsection}
+ level \currentsectionlevel
+ parent {\currentheadparent}
+ }%
\endgroup
-\to \everydefinehead
+\to \everyredefinehead
\appendtoks
% \setevalue{\e!next \currenthead}{\donexthead [\currenthead]}%
@@ -460,6 +459,15 @@
{\setuevalue\currenthead{\strc_sectioning_handle_nop[\currenthead]}}%
\to \everysetuphead
+\unexpanded\def\doredefinehead#1#2% called at lua end
+ {\pushmacro\currenthead
+ \pushmacro\currentheadparent
+ \edef\currenthead{#1}%
+ \edef\currentheadparent{#2}%
+ \the\everyredefinehead\relax
+ \popmacro\currentheadparent
+ \popmacro\currenthead}
+
\let\currentnamedsection\empty
\unexpanded\def\startnamedsection
@@ -583,8 +591,8 @@
% head -> head
-\def\sectionheadmarkingtitle #1#2{\ctxcommand{markingtitle("#1","#2")}}
-\def\sectionheadmarkingnumber#1#2{\ctxcommand{markingnumber("#1","#2")}}
+\def\sectionheadmarkingtitle #1#2{\clf_markingtitle {#1}{#2}}
+\def\sectionheadmarkingnumber#1#2{\clf_markingnumber{#1}{#2}}
\def\sectionheadcoupling#1{\namedheadparameter{#1}\c!coupling}
\def\sectionheadsection #1{\namedheadparameter{#1}\c!section}
@@ -608,7 +616,7 @@
\unexpanded\def\strc_sectioning_handle_nop_indeed[#1][#2]% for taco: [key=value] variant
{\setfalse\currentstructureown
\triggerautostructurelevel
- \doifassignmentelse{#2}\strc_sectioning_handle_nop_indeed_yes\strc_sectioning_handle_nop_indeed_nop{#1}{#2}}
+ \doifelseassignment{#2}\strc_sectioning_handle_nop_indeed_yes\strc_sectioning_handle_nop_indeed_nop{#1}{#2}}
\unexpanded\def\strc_sectioning_handle_nop_indeed_yes#1#2%
{\strc_sectioning_handle{#1}{#2}{}}
@@ -768,7 +776,7 @@
\unexpanded\def\placeheadtext {\dosingleempty\strc_sectioning_place_head_text } % use with care
\unexpanded\def\placeheadnumber{\dosingleempty\strc_sectioning_place_head_number} % use with care
-\unexpanded\def\strc_sectioning_report{\ctxcommand{reportstructure()}}
+\unexpanded\def\strc_sectioning_report{\clf_reportstructure}
\ifdefined\strc_rendering_initialize_style_and_color \else
@@ -990,15 +998,19 @@
\hskip\s_strc_sectioniong_continuous_signal\relax
\fi}
+% \let\dotagsectionlevel\relax
+
\def\strc_sectioning_before_yes
{\strc_sectioning_check_before\strc_sectioning_handle_page_yes
\headparameter\c!inbetween
- \dostarttagged\t!section\currenthead}
+ \dostarttaggedchained\t!section\currenthead\??head
+% \dotagsectionlevel
+ }
\def\strc_sectioning_before_nop
{\strc_sectioning_check_before\strc_sectioning_handle_page_nop
\headparameter\c!inbetween
- \dostarttagged\currenthead\empty}
+ \dostarttagged\currenthead\empty} % this is a weird one .. needs checking
\def\strc_sectioning_empty_correction
{\ifconditional\c_strc_sectioning_empty
@@ -1045,8 +1057,8 @@
#1%
\fi}
-\def\currentsectioncountervalue {\ctxcommand{depthnumber(\thenamedheadlevel\currenthead)}}
-\def\previoussectioncountervalue{\ctxcommand{depthnumber(\thenamedheadlevel\currenthead-1)}}
+\def\currentsectioncountervalue {\clf_depthnumber\numexpr\thenamedheadlevel\currenthead\relax}
+\def\previoussectioncountervalue{\clf_depthnumber\numexpr\thenamedheadlevel\currenthead+\minusone\relax}
\def\strc_sectioning_handle_page_nop
{\edef\p_continue{\headparameter\c!continue}%
@@ -1101,7 +1113,7 @@
{\dodoubleargument\strc_sectioning_setup_number}
\def\strc_sectioning_setup_number[#1][#2]% todo: reset if at other level
- {\setstructurenumber{\thenamedheadlevel{#1}}{#2}}
+ {\setstructurenumber{\thenamedheadlevel{#1}}{\number#2}}
\def\currentheadnumber{0} % ==> \currentheadnumber
@@ -1148,7 +1160,7 @@
\unexpanded\def\strc_sectioning_initialize_autolevel
{\ifconditional\c_strc_sectioning_auto_levels
- \ctxcommand{autonextstructurelevel(\number\currentheadlevel)}%
+ \clf_autonextstructurelevel\currentheadlevel\relax
\global\setfalse\c_strc_sectioning_auto_levels
\fi}
@@ -1156,7 +1168,7 @@
{\global\settrue\c_strc_sectioning_auto_levels}
\unexpanded\def\finalizeautostructurelevels
- {\ctxcommand{autofinishstructurelevels()}}
+ {\clf_autofinishstructurelevels}
\unexpanded\def\finalizeautostructurelevel
{\dostoptagged
diff --git a/Master/texmf-dist/tex/context/base/strc-syn.lua b/Master/texmf-dist/tex/context/base/strc-syn.lua
index 604365b2d0c..5f3557a6958 100644
--- a/Master/texmf-dist/tex/context/base/strc-syn.lua
+++ b/Master/texmf-dist/tex/context/base/strc-syn.lua
@@ -7,12 +7,12 @@ if not modules then modules = { } end modules ['strc-syn'] = {
}
local next, type = next, type
-local format = string.format
-local allocate = utilities.storage.allocate
-
--- interface to tex end
local context = context
+local implement = interfaces.implement
+
+local allocate = utilities.storage.allocate
+
local sorters = sorters
local structures = structures
@@ -44,77 +44,129 @@ job.register('structures.synonyms.collected', tobesaved, initializer, finalizer)
-- todo: allocate becomes metatable
-local function allocate(class)
- local d = tobesaved[class]
- if not d then
- d = {
- metadata = {
- language = 'en',
- sorted = false,
- class = class
- },
- entries = {
- },
- hash = {
- }
+table.setmetatableindex(tobesaved,function(t,k)
+ local v = {
+ metadata = {
+ language = 'en',
+ sorted = false,
+ class = v
+ },
+ entries = {
+ },
+ hash = {
}
- tobesaved[class] = d
- end
- return d
-end
+ }
+ t[k] = v
+ return v
+end)
function synonyms.define(class,kind)
- local data = allocate(class)
+ local data = tobesaved[class]
data.metadata.kind = kind
end
function synonyms.register(class,kind,spec)
- local data = allocate(class)
+ local data = tobesaved[class]
+ local hash = data.hash
+ local definition = spec.definition
+ local tag = definition.tag or ""
data.metadata.kind = kind -- runtime, not saved in format (yet)
- if not data.hash[spec.definition.tag or ""] then
- data.entries[#data.entries+1] = spec
- data.hash[spec.definition.tag or ""] = spec
+ if not hash[tag] then
+ if definition.used == nil then
+ definition.used = false
+ end
+ if definition.shown == nil then
+ definition.shown = false
+ end
+ local entries = data.entries
+ entries[#entries+1] = spec
+ hash[tag] = spec
end
end
function synonyms.registerused(class,tag)
- local data = allocate(class)
- local dht = data.hash[tag]
- if dht then
- dht.definition.used = true
+ local data = tobesaved[class]
+ local okay = data.hash[tag]
+ if okay then
+ local definition = okay.definition
+ definition.used = true
+ definition.list = true
+ end
+end
+
+function synonyms.registershown(class,tag)
+ local data = tobesaved[class]
+ local okay = data.hash[tag]
+ if okay then
+ local definition = okay.definition
+ definition.shown = true
+ definition.list = true
+ end
+end
+
+function synonyms.isused(class,tag)
+ local data = tobesaved[class]
+ local okay = data.hash[tag]
+ return okay and okay.definition.used
+end
+
+function synonyms.isshown(class,tag)
+ local data = tobesaved[class]
+ local okay = data.hash[tag]
+ return okay and okay.definition.shown
+end
+
+function synonyms.resetused(class)
+ for tag, data in next, tobesaved[class].hash do
+ data.definition.used = false
+ end
+end
+
+function synonyms.resetshown(class)
+ for tag, data in next, tobesaved[class].hash do
+ data.definition.shown = false
end
end
function synonyms.synonym(class,tag)
- local data = allocate(class).hash
- local d = data[tag]
- if d then
- local de = d.definition
- de.used = true
- context(de.synonym)
+ local data = tobesaved[class]
+ local okay = data.hash[tag]
+ if okay then
+ local definition = okay.definition
+ definition.used = true
+ definition.list = true
+ context(definition.synonym)
end
end
function synonyms.meaning(class,tag)
- local data = allocate(class).hash
- local d = data[tag]
- if d then
- local de = d.definition
- de.used = true
- context(de.meaning)
+ local data = tobesaved[class]
+ local okay = data.hash[tag]
+ if okay then
+ local definition = okay.definition
+ definition.shown = true
+ definition.list = true
+ context(definition.meaning)
end
end
synonyms.compare = sorters.comparers.basic -- (a,b)
function synonyms.filter(data,options)
- local result = { }
+ local result = { }
local entries = data.entries
- local all = options and options.criterium == interfaces.variables.all
- for i=1,#entries do
- local entry = entries[i]
- if all or entry.definition.used then
- result[#result+1] = entry
+ local all = options and options.criterium == interfaces.variables.all
+ if all then
+ for i=1,#entries do
+ result[i] = entries[i]
+ end
+ else
+ for i=1,#entries do
+ local entry = entries[i]
+ local definition = entry.definition
+ if definition.list then
+ result[#result+1] = entry
+ end
end
end
data.result = result
@@ -124,12 +176,12 @@ function synonyms.prepare(data)
local result = data.result
if result then
for i=1, #result do
- local r = result[i]
- local rd = r.definition
- if rd then
- local rt = rd.tag
- local sortkey = rt and rt ~= "" and rt or rd.synonym
- r.split = splitter(strip(sortkey))
+ local entry = result[i]
+ local definition = entry.definition
+ if definition then
+ local tag = definition.tag
+ local key = tag ~= "" and tag or definition.synonym
+ entry.split = splitter(strip(key))
end
end
end
@@ -137,25 +189,31 @@ end
function synonyms.sort(data,options)
sorters.sort(data.result,synonyms.compare)
+ data.metadata.sorted = true
end
-function synonyms.finalize(data,options)
- local result = data.result
- data.metadata.nofsorted = #result
- local split = { }
+function synonyms.finalize(data,options) -- mostly the same as registers so we will generalize it: sorters.split
+ local result = data.result
+ local split = { }
+ local nofsplit = 0
+ local lasttag = nil
+ local lasttag = nil
+ local nofdone = 0
for k=1,#result do
- local v = result[k]
- local entry, tag = firstofsplit(v)
- local s = split[entry] -- keeps track of change
- local d
- if not s then
- d = { }
- s = { tag = tag, data = d }
- split[entry] = s
- else
- d = s.data
+ local entry = result[k]
+ local first, tag = firstofsplit(entry)
+ if tag ~= lasttag then
+ -- if trace_registers then
+ -- report_registers("splitting at %a",tag)
+ -- end
+ done = { }
+ nofdone = 0
+ nofsplit = nofsplit + 1
+ lasttag = tag
+ split[nofsplit] = { tag = tag, data = done }
end
- d[#d+1] = v
+ nofdone = nofdone + 1
+ done[nofdone] = entry
end
data.result = split
end
@@ -166,27 +224,25 @@ end
local ctx_synonymentry = context.synonymentry
function synonyms.flush(data,options)
- local kind = data.metadata.kind -- hack, will be done better
local result = data.result
- local sorted = table.sortedkeys(result)
- for k=1,#sorted do
- local letter = sorted[k]
- local sublist = result[letter]
- local data = sublist.data
+ for i=1,#result do
+ local sublist = result[i]
+ local letter = sublist.tag
+ local data = sublist.data
for d=1,#data do
local entry = data[d].definition
ctx_synonymentry(d,entry.tag,entry.synonym,entry.meaning or "")
end
end
- data.result = nil
+ data.result = nil
data.metadata.sorted = false
end
function synonyms.analyzed(class,options)
- local data = synonyms.collected[class]
+ local data = collected[class]
if data and data.entries then
options = options or { }
- sorters.setlanguage(options.language)
+ sorters.setlanguage(options.language,options.method)
synonyms.filter(data,options) -- filters entries to result
synonyms.prepare(data,options) -- adds split table parallel to list table
synonyms.sort(data,options) -- sorts entries in result
@@ -198,12 +254,65 @@ end
function synonyms.process(class,options)
if synonyms.analyzed(class,options) then
- synonyms.flush(synonyms.collected[class],options)
+ synonyms.flush(collected[class],options)
end
end
-commands.registersynonym = synonyms.register
-commands.registerusedsynonym = synonyms.registerused
-commands.synonymmeaning = synonyms.meaning
-commands.synonymname = synonyms.synonym
-commands.processsynonyms = synonyms.process
+-- todo: local higher up
+
+implement { name = "registerusedsynonym", actions = synonyms.registerused, arguments = { "string", "string" } }
+implement { name = "registershownsynonym", actions = synonyms.registershown, arguments = { "string", "string" } }
+implement { name = "synonymmeaning", actions = synonyms.meaning, arguments = { "string", "string" } }
+implement { name = "synonymname", actions = synonyms.synonym, arguments = { "string", "string" } }
+implement { name = "resetusedsynonyms", actions = synonyms.resetused, arguments = "string" }
+implement { name = "resetshownsynonyms", actions = synonyms.resetshown, arguments = "string" }
+
+implement {
+ name = "doifelsesynonymused",
+ actions = { synonyms.isused, commands.doifelse },
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "doifelsesynonymshown",
+ actions = { synonyms.isshown, commands.doifelse },
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "registersynonym",
+ actions = synonyms.register,
+ arguments = {
+ "string",
+ "string",
+ {
+ { "metadata", {
+ { "catcodes", "integer" },
+ { "coding" },
+ { "xmlroot" }
+ }
+ },
+ {
+ "definition", {
+ { "tag" },
+ { "synonym" },
+ { "meaning" },
+ { "used", "boolean" }
+ }
+ }
+ }
+ }
+}
+
+implement {
+ name = "processsynonyms",
+ actions = synonyms.process,
+ arguments = {
+ "string",
+ {
+ { "criterium" },
+ { "language" },
+ { "method" }
+ }
+ }
+}
diff --git a/Master/texmf-dist/tex/context/base/strc-syn.mkiv b/Master/texmf-dist/tex/context/base/strc-syn.mkiv
index 73aca18e601..0c132a602f0 100644
--- a/Master/texmf-dist/tex/context/base/strc-syn.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-syn.mkiv
@@ -15,6 +15,93 @@
\registerctxluafile{strc-syn}{1.001}
+%D Although we could nowadays build this on top of regular lists we keep this
+%D more efficient variant around. Eventually we can add some options to lists
+%D that also provide such functionality but at the cost of much more overhead.
+%D
+%D We show a usage of both synonyms and sorts, which are deep down variants of
+%D so called simple lists. A definition looks like this:
+%D
+%D \startbuffer
+%D \definesynonyms
+%D [myabbreviation]
+%D
+%D \setupsynonyms
+%D [myabbreviation]
+%D [headstyle=bold,
+%D headcolor=darkred,
+%D synonymstyle=boldslanted,
+%D synonymcolor=darkblue,
+%D textstyle=slanted,
+%D textcolor=darkgreen,
+%D style=normal,
+%D color=darkyellow]
+%D
+%D \definesorting
+%D [mylogo]
+%D
+%D \setupsorting
+%D [mylogo]
+%D [style=bold,
+%D color=darkmagenta]
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D More complex definitions involves commands to call up meanings and such. The
+%D use of the defined commands is as follows: \
+%D
+%D \startbuffer
+%D \myabbreviation [FIRST] {TheFirst} {The First Words}
+%D \myabbreviation [SECOND] {TheSecond} {The Second Words}
+%D \myabbreviation [THIRD] {TheThird} {The Third Words}
+%D
+%D \mylogo [FOURTH] {TheFourth}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D By default a synonym is just typeset and flagges as being used, so that in
+%D a list it wil be shows with its meaning. You can however also expand the
+%D meaning automatically at first use:
+%D
+%D \startbuffer
+%D \setupsynonyms[myabbreviation][alternative=first]
+%D
+%D We have \FIRST, \SECOND\ and also \THIRD\ but no \FOURTH.
+%D
+%D We have \FIRST, \SECOND\ and also \THIRD\ but no \FOURTH.
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D We can change the order, as demonstrated in:
+%D
+%D \startbuffer
+%D \resetshownsynonyms[myabbreviation]
+%D
+%D \setupsynonyms[myabbreviation][alternative=last]
+%D
+%D We have \FIRST\ and \THIRD\ or \FOURTH.
+%D
+%D We have \FIRST\ and \THIRD\ or \FOURTH.
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D A list is called up with:
+%D
+%D \startbuffer
+%D \placelistofsynonyms[myabbreviation]
+%D
+%D \placelistofsorts[mylogo]
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D The lists are constructions (like descriptions are) and can be set up
+%D likewise.
+
% todo: add 'define only' option to descriptions, then add sorting (also based on key)
% and call to definition -> replaces this module
@@ -22,7 +109,7 @@
% split but common in lua
-\def\preprocessexpansion#1#2#3#4%
+\def\preprocessexpansion#1#2#3#4% do this at the lua end if still needed
{\ifx#1\s!xml
\xmlstartraw
\xdef#2{#4}%
@@ -100,6 +187,7 @@
\setuvalue{\??constructioninitializer\v!simplelist}%
{\let\currentsimplelist \currentconstruction
\let\constructionparameter \simplelistparameter
+ \let\constructionnamespace \??simplelist
\let\detokenizedconstructionparameter\detokenizedsimplelistparameter
\let\letconstructionparameter \letsimplelistparameter
\let\useconstructionstyleandcolor \usesimpleliststyleandcolor
@@ -175,7 +263,7 @@
%
\presetheadtext[#2=\Word{#2}]% changes the \if...argument
%
- \setvalue{\e!setup #2\e!endsetup}{\setupsynonym[#1]}% obsolete definition
+ \setvalue{\e!setup #2\e!endsetup}{\setupsynonyms[#1]}% obsolete definition
\setvalue{\e!place \e!listof#2}{\placelistofsynonyms[#1]}% accepts extra argument
\setvalue{\e!complete\e!listof#2}{\completelistofsynonyms[#1]}}
@@ -194,21 +282,27 @@
% todo: error message
\else
\edef\currentsynonymexpansion{\simplelistparameter\c!expansion}%
- \preprocessexpansion\currentsynonymexpansion\currentsynonymtext \currentsynonymcoding{#4}%
- \preprocessexpansion\currentsynonymexpansion\currentsynonymmeaning\currentsynonymcoding{#5}%
- \ctxcommand{registersynonym("\currentsynonym", "synonym", {
- metadata = {
- catcodes = \the\catcodetable,
- coding = "\currentsynonymcoding",
- xmlroot = \ifx\currentsynonymcoding\s!xml "\xmldocument" \else nil \fi,
- },
- definition = {
- tag = "\currentsynonymtag",
- synonym = \!!bs\currentsynonymtext\!!es,
- meaning = \!!bs\currentsynonymmeaning\!!es,
- used = false,
- }
- })}%
+ \preprocessexpansion\currentsynonymexpansion\m_synonyms_text \currentsynonymcoding{#4}%
+ \preprocessexpansion\currentsynonymexpansion\m_synonyms_meaning\currentsynonymcoding{#5}%
+ \clf_registersynonym
+ {\currentsynonym}%
+ {synonym}%
+ {%
+ metadata {%
+ catcodes \catcodetable
+ coding {\currentsynonymcoding}%
+ \ifx\currentsynonymcoding\s!xml
+ xmlroot {\xmldocument}%
+ \fi
+ }%
+ definition {%
+ tag {\currentsynonymtag}%
+ synonym {\m_synonyms_text}%
+ meaning {\m_synonyms_meaning}%
+ % used false
+ }%
+ }%
+ \relax
\doif{#1}\v!yes{\setuxvalue\currentsynonymtag{\strc_synonyms_insert{\currentsynonym}{\currentsynonymtag}}}%
\fi
\endgroup}
@@ -217,43 +311,120 @@
{\dodoubleargument\strc_synonyms_register}
\def\strc_synonyms_register[#1][#2]%
- {\ctxcommand{registerusedsynonym("#1","#2")}}
+ {\clf_registerusedsynonym{#1}{#2}}
+
+\unexpanded\def\currentsynonymname {\clf_synonymname {\currentsimplelist}{\currentsynonymtag}}
+\unexpanded\def\currentsynonymmeaning {\clf_synonymmeaning {\currentsimplelist}{\currentsynonymtag}}
+\unexpanded\def\doifelsecurrentsynonymused {\clf_doifelsesynonymused {\currentsimplelist}{\currentsynonymtag}}
+\unexpanded\def\doifelsecurrentsynonymshown{\clf_doifelsesynonymshown{\currentsimplelist}{\currentsynonymtag}}
+\unexpanded\def\resetusedsynonyms [#1]{\clf_resetusedsynonyms {#1}}
+\unexpanded\def\resetshownsynonyms [#1]{\clf_resetshownsynonyms {#1}}
+
+\installcorenamespace{simplelistalternative} % specific ways of rendering a list
+\installcorenamespace{simplelistrenderings} % a namespace for setups (rather local)
+
+\installcommandhandler \??simplelistalternative {simplelistalternative} \??simplelistalternative
+
+\setupsimplelist
+ [\v!synonym]
+ [\c!alternative=\v!normal]
\unexpanded\def\strc_synonyms_insert_meaning#1#2% name tag
{\begingroup
\def\currentsimplelist{#1}%
- \usesimpleliststyleandcolor\c!textstyle\c!textcolor
- \simplelistparameter\c!textcommand{\ctxcommand{synonymmeaning("#1","#2")}}%
+ \fastsetup{\??simplelistrenderings:\v!text}%
\endgroup}
\unexpanded\def\strc_synonyms_insert#1#2% name tag
{\begingroup
\edef\currentsimplelist{#1}%
- \let\currentsynonym\currentsimplelist % for a while
- \def\currentsynonymtag{#2}%
- \dostarttagged\t!synonym\currentsynonym
- \dotagsynonym
- \usesimpleliststyleandcolor\c!synonymstyle\c!synonymcolor
- \simplelistparameter\c!synonymcommand{\ctxcommand{synonymname("#1","#2")}}%
- \dostoptagged
+ \let \currentsynonym\currentsimplelist % for a while
+ \def \currentsynonymtag{#2}%
+ \edef\currentsimplelistalternative{\simplelistparameter\c!alternative}%
+ \fastsetup{\??simplelistrenderings:\v!synonym:\currentsimplelistalternative}%
\normalexpanded{\endgroup\simplelistparameter\c!next}}
+% \setupsimplelistalternative
+% [\c!command=\strictsimplelistparameter\c!command]
+
+\definesimplelistalternative
+ [\v!normal]
+ [\c!inbetween=\space,
+ \c!left=(,
+ \c!right=)]
+
+\definesimplelistalternative
+ [\v!first]
+ [\v!normal]
+
+\definesimplelistalternative
+ [\v!last]
+ [\v!normal]
+
+\startsetups[\??simplelistrenderings::\v!synonym]
+ \begingroup
+ \dostarttaggedchained\t!synonym\currentsynonym\??simplelist
+ \dotagsynonym
+ \usesimpleliststyleandcolor\c!synonymstyle\c!synonymcolor
+ \simplelistparameter\c!synonymcommand{\currentsynonymname}%
+ \dostoptagged
+ \endgroup
+\stopsetups
+
+\startsetups[\??simplelistrenderings::\v!text]
+ \begingroup
+ \usesimpleliststyleandcolor\c!textstyle\c!textcolor
+ \simplelistparameter\c!textcommand{\currentsynonymmeaning}%
+ \endgroup
+\stopsetups
+
+\startsetups[\??simplelistrenderings:\v!synonym:\v!normal]
+ \fastsetup{\??simplelistrenderings::\v!synonym}
+\stopsetups
+
+\startsetups[\??simplelistrenderings:\v!synonym:\v!first]
+ \fastsetup{\??simplelistrenderings::\v!synonym}
+ \doifelsecurrentsynonymshown \donothing {
+ \simplelistalternativeparameter\c!inbetween
+ \simplelistalternativeparameter\c!left
+ \fastsetup{\??simplelistrenderings::\v!text}
+ \simplelistalternativeparameter\c!right
+ }
+\stopsetups
+
+\startsetups[\??simplelistrenderings:\v!synonym:\v!last]
+ \doifelsecurrentsynonymshown {
+ \fastsetup{\??simplelistrenderings::\v!synonym}
+ } {
+ \fastsetup{\??simplelistrenderings::\v!text}
+ \simplelistalternativeparameter\c!inbetween
+ \simplelistalternativeparameter\c!left
+ \fastsetup{\??simplelistrenderings::\v!synonym}
+ \simplelistalternativeparameter\c!right
+ }
+\stopsetups
+
\unexpanded\def\placelistofsynonyms
{\dodoubleempty\strc_synonyms_place_list}
\def\strc_synonyms_place_list[#1][#2]%
{\begingroup
\edef\currentsimplelist{#1}%
- \strc_constructions_initialize{#1}%
- \setupcurrentsimplelist[#2]%
- \let\synonymentry\strc_synonym_normal
- \startpacked
- \ctxcommand{processsynonyms('#1',{
- criterium = "\simplelistparameter\c!criterium",
- language = "\simplelistparameter\s!language",
- method = "\simplelistparameter\c!method",
- })}%
- \stoppacked
+ \doifelsecommandhandler\??simplelist\currentsimplelist
+ {\strc_constructions_initialize{#1}%
+ \setupcurrentsimplelist[#2]%
+ \let\synonymentry\strc_synonym_normal
+ \startpacked
+ \clf_processsynonyms
+ {#1}%
+ {%
+ criterium {\simplelistparameter\c!criterium}%
+ language {\simplelistparameter\s!language}%
+ method {\simplelistparameter\c!method}%
+ }%
+ \relax
+ \stoppacked}%
+ {}% todo: message that invalid
\endgroup}
\def\completelistofsynonyms
@@ -262,10 +433,12 @@
\def\strc_synonyms_complete_list[#1][#2]%
{\begingroup
\edef\currentsimplelist{#1}%
- \normalexpanded{\startnamedsection[\v!chapter][\c!title={\headtext{\simplelistparameter\s!multi}},\c!reference=#1]}%
- \strc_synonyms_place_list[#1][#2]%
- \page
- \stopnamedsection
+ \doifelsecommandhandler\??simplelist\currentsimplelist
+ {\normalexpanded{\startnamedsection[\v!chapter][\c!title={\headtext{\simplelistparameter\s!multi}},\c!reference=#1]}%
+ \strc_synonyms_place_list[#1][#2]%
+ \page
+ \stopnamedsection}%
+ {}% todo: message that invalid
\endgroup}
\unexpanded\def\strc_synonym_normal#1#2#3#4%
@@ -337,40 +510,65 @@
\else
\edef\currentsortingexpansion{\simplelistparameter\c!expansion}%
\preprocessexpansion\currentsortingexpansion\currentsortingtext\currentsortingcoding{#4}%
- \ctxcommand{registersynonym("\currentsorting", "sorting", {
- metadata = {
- catcodes = \the\catcodetable,
- coding = "\currentsortingcoding",
- xmlroot = \ifx\currentsortingcoding\s!xml "\xmldocument" \else nil \fi,
- },
- definition = {
- tag = "\currentsortingtag",
- synonym = \!!bs\currentsortingtext\!!es,
- % used = false,
- }
- })}%
+ \clf_registersynonym
+ {\currentsorting}%
+ {sorting}%
+ {%
+ metadata {%
+ catcodes \catcodetable
+ coding {\currentsortingcoding}%
+ \ifx\currentsortingcoding\s!xml
+ xmlroot {\xmldocument}%
+ \fi
+ }%
+ definition {%
+ tag {\currentsortingtag}%
+ synonym {\currentsortingtext}%
+ % used false
+ }%
+ }%
+ \relax
\doif{#1}\v!yes{\setuxvalue\currentsortingtag{\strc_sorting_insert{\currentsorting}{\currentsortingtag}}}%
\fi
\endgroup}
+\unexpanded\def\currentsortingname {\clf_synonymname {\currentsimplelist}{\currentsortingtag}}
+\unexpanded\def\doifelsecurrentsortingused {\clf_doifelsesynonymused {\currentsimplelist}{\currentsortingtag}}
+\unexpanded\def\resetusedsortings [#1]{\clf_resetusedsynonyms {#1}}
+
+\setupsimplelist
+ [\v!sorting]
+ [\c!alternative=\v!normal]
+
\unexpanded\def\strc_sorting_insert#1#2% name tag
{\begingroup
% no kap currently, of .. we need to map cap onto WORD
\edef\currentsorting{#1}%
- \def\currentsortingtag{#2}%
- \let\currentsimplelist\currentsorting
- \dostarttagged\t!sorting\currentsorting
- \dotagsorting
- \usesimpleliststyleandcolor\c!style\c!color
- \ctxcommand{synonymname("#1","#2")}%
- \dostoptagged
+ \def \currentsortingtag{#2}%
+ \let \currentsimplelist\currentsorting
+ \edef\currentsimplelistalternative{\simplelistparameter\c!alternative}%
+ \fastsetup{\??simplelistrenderings:\v!sorting:\currentsimplelistalternative}%
\normalexpanded{\endgroup\simplelistparameter\c!next}}
+\startsetups [\??simplelistrenderings:\v!sorting:\v!normal]
+ \fastsetup{\??simplelistrenderings::\v!sorting}%
+\stopsetups
+
+\startsetups [\??simplelistrenderings::\v!sorting]
+ \begingroup
+ \dostarttaggedchained\t!sorting\currentsorting\??simplelist
+ \dotagsorting
+ \usesimpleliststyleandcolor\c!style\c!color
+ \currentsortingname
+ \dostoptagged
+ \endgroup
+\stopsetups
+
\unexpanded\def\registersort
{\dodoubleargument\strc_sorting_register}
\def\strc_sorting_register[#1][#2]%
- {\ctxcommand{registerusedsynonym("#1","#2")}}
+ {\clf_registerusedsynonym{#1}{#2}}
% before after
%
@@ -391,11 +589,14 @@
\let\synonymentry\strc_sorting_command
\fi
\startpacked
- \ctxcommand{processsynonyms('#1',{
- criterium = "\simplelistparameter\c!criterium",
- language = "\simplelistparameter\s!language",
- method = "\simplelistparameter\c!method",
- })}%
+ \clf_processsynonyms
+ {#1}%
+ {%
+ criterium {\simplelistparameter\c!criterium}%
+ language {\simplelistparameter\s!language}%
+ method {\simplelistparameter\c!method}%
+ }%
+ \relax
\stoppacked
\endgroup}
@@ -423,6 +624,15 @@
%D Presets.
+% To be considered:
+%
+% \setupsimplelist
+% [\v!sorting]
+% [\c!headstyle=\simplelistparameter\c!synonymstyle,
+% \c!headcolor=\simplelistparameter\c!synonymcolor,
+% \c!style=\simplelistparameter\c!textstyle,
+% \c!color=\simplelistparameter\c!textcolor]
+
\definesynonyms
[\v!abbreviation]
[\v!abbreviations]
diff --git a/Master/texmf-dist/tex/context/base/strc-tag.lua b/Master/texmf-dist/tex/context/base/strc-tag.lua
index 7e5c6f99377..637d74e8c08 100644
--- a/Master/texmf-dist/tex/context/base/strc-tag.lua
+++ b/Master/texmf-dist/tex/context/base/strc-tag.lua
@@ -6,189 +6,219 @@ if not modules then modules = { } end modules ['strc-tag'] = {
license = "see context related readme files"
}
--- This is rather experimental code.
+-- This is rather experimental code. Tagging happens on the fly and there are two analysers
+-- involved: the pdf backend tagger and the exporter. They share data but there are subtle
+-- differences. Each tag carries a specification and these can be accessed by attribute (the
+-- end of the chain tag) or by so called fullname which is a tagname combined with a number.
+local type, next = type, next
local insert, remove, unpack, concat = table.insert, table.remove, table.unpack, table.concat
-local gsub, find, topattern, format = string.gsub, string.find, string.topattern, string.format
-local lpegmatch = lpeg.match
+local find, topattern, format = string.find, string.topattern, string.format
+local lpegmatch, P, S, C, Cc = lpeg.match, lpeg.P, lpeg.S, lpeg.C, lpeg.Cc
local texattribute = tex.attribute
local allocate = utilities.storage.allocate
local settings_to_hash = utilities.parsers.settings_to_hash
+local setmetatableindex = table.setmetatableindex
local trace_tags = false trackers.register("structures.tags", function(v) trace_tags = v end)
local report_tags = logs.reporter("structure","tags")
-local attributes, structures = attributes, structures
+local attributes = attributes
+local structures = structures
+local implement = interfaces.implement
local a_tagged = attributes.private('tagged')
local unsetvalue = attributes.unsetvalue
local codeinjections = backends.codeinjections
-local taglist = allocate()
-local properties = allocate()
-local labels = allocate()
-local stack = { }
-local chain = { }
-local ids = { }
-local enabled = false
-local tagdata = { } -- used in export
-local tagmetadata = { } -- used in export
-
-local tags = structures.tags
-tags.taglist = taglist -- can best be hidden
-tags.labels = labels
-tags.data = tagdata
-tags.metadata = tagmetadata
-
-local properties = allocate {
-
- document = { pdf = "Div", nature = "display" },
-
- division = { pdf = "Div", nature = "display" },
- paragraph = { pdf = "P", nature = "mixed" },
- p = { pdf = "P", nature = "mixed" },
- construct = { pdf = "Span", nature = "inline" },
- highlight = { pdf = "Span", nature = "inline" },
-
- section = { pdf = "Sect", nature = "display" },
- sectiontitle = { pdf = "H", nature = "mixed" },
- sectionnumber = { pdf = "H", nature = "mixed" },
- sectioncontent = { pdf = "Div", nature = "display" },
-
- itemgroup = { pdf = "L", nature = "display" },
- item = { pdf = "Li", nature = "display" },
- itemtag = { pdf = "Lbl", nature = "mixed" },
- itemcontent = { pdf = "LBody", nature = "mixed" },
-
- description = { pdf = "Div", nature = "display" },
- descriptiontag = { pdf = "Div", nature = "mixed" },
- descriptioncontent = { pdf = "Div", nature = "mixed" },
- descriptionsymbol = { pdf = "Span", nature = "inline" }, -- note reference
-
- verbatimblock = { pdf = "Code", nature = "display" },
- verbatimlines = { pdf = "Code", nature = "display" },
- verbatimline = { pdf = "Code", nature = "mixed" },
- verbatim = { pdf = "Code", nature = "inline" },
-
- lines = { pdf = "Code", nature = "display" },
- line = { pdf = "Code", nature = "mixed" },
-
- synonym = { pdf = "Span", nature = "inline" },
- sorting = { pdf = "Span", nature = "inline" },
-
- register = { pdf = "Div", nature = "display" },
- registersection = { pdf = "Div", nature = "display" },
- registertag = { pdf = "Span", nature = "mixed" },
- registerentries = { pdf = "Div", nature = "display" },
- registerentry = { pdf = "Span", nature = "mixed" },
- registersee = { pdf = "Span", nature = "mixed" },
- registerpages = { pdf = "Span", nature = "mixed" },
- registerpage = { pdf = "Span", nature = "inline" },
- registerpagerange = { pdf = "Span", nature = "mixed" },
-
- table = { pdf = "Table", nature = "display" },
- tablerow = { pdf = "TR", nature = "display" },
- tablecell = { pdf = "TD", nature = "mixed" },
-
- tabulate = { pdf = "Table", nature = "display" },
- tabulaterow = { pdf = "TR", nature = "display" },
- tabulatecell = { pdf = "TD", nature = "mixed" },
-
- list = { pdf = "TOC", nature = "display" },
- listitem = { pdf = "TOCI", nature = "display" },
- listtag = { pdf = "Lbl", nature = "mixed" },
- listcontent = { pdf = "P", nature = "mixed" },
- listdata = { pdf = "P", nature = "mixed" },
- listpage = { pdf = "Reference", nature = "mixed" },
-
- delimitedblock = { pdf = "BlockQuote", nature = "display" },
- delimited = { pdf = "Quote", nature = "inline" },
- subsentence = { pdf = "Span", nature = "inline" },
-
- label = { pdf = "Span", nature = "mixed" },
- number = { pdf = "Span", nature = "mixed" },
-
- float = { pdf = "Div", nature = "display" }, -- Figure
- floatcaption = { pdf = "Caption", nature = "mixed" },
- floatlabel = { pdf = "Span", nature = "inline" },
- floatnumber = { pdf = "Span", nature = "inline" },
- floattext = { pdf = "Span", nature = "mixed" },
- floatcontent = { pdf = "P", nature = "mixed" },
-
- image = { pdf = "P", nature = "mixed" },
- mpgraphic = { pdf = "P", nature = "mixed" },
-
- formulaset = { pdf = "Div", nature = "display" },
- formula = { pdf = "Div", nature = "display" }, -- Formula
- formulacaption = { pdf = "Span", nature = "mixed" },
- formulalabel = { pdf = "Span", nature = "mixed" },
- formulanumber = { pdf = "Span", nature = "mixed" },
- formulacontent = { pdf = "P", nature = "display" },
- subformula = { pdf = "Div", nature = "display" },
-
- link = { pdf = "Link", nature = "inline" },
-
- margintextblock = { pdf = "Span", nature = "inline" },
- margintext = { pdf = "Span", nature = "inline" },
-
- math = { pdf = "Div", nature = "inline" }, -- no display
- mn = { pdf = "Span", nature = "mixed" },
- mi = { pdf = "Span", nature = "mixed" },
- mo = { pdf = "Span", nature = "mixed" },
- ms = { pdf = "Span", nature = "mixed" },
- mrow = { pdf = "Span", nature = "display" },
- msubsup = { pdf = "Span", nature = "display" },
- msub = { pdf = "Span", nature = "display" },
- msup = { pdf = "Span", nature = "display" },
- merror = { pdf = "Span", nature = "mixed" },
- munderover = { pdf = "Span", nature = "display" },
- munder = { pdf = "Span", nature = "display" },
- mover = { pdf = "Span", nature = "display" },
- mtext = { pdf = "Span", nature = "mixed" },
- mfrac = { pdf = "Span", nature = "display" },
- mroot = { pdf = "Span", nature = "display" },
- msqrt = { pdf = "Span", nature = "display" },
- mfenced = { pdf = "Span", nature = "display" },
- maction = { pdf = "Span", nature = "display" },
-
- mtable = { pdf = "Table", nature = "display" }, -- might change
- mtr = { pdf = "TR", nature = "display" }, -- might change
- mtd = { pdf = "TD", nature = "display" }, -- might change
-
- ignore = { pdf = "Span", nature = "mixed" },
- metadata = { pdf = "Div", nature = "display" },
- metavariable = { pdf = "Span", nature = "mixed" },
-
- mid = { pdf = "Span", nature = "inline" },
- sub = { pdf = "Span", nature = "inline" },
- sup = { pdf = "Span", nature = "inline" },
- subsup = { pdf = "Span", nature = "inline" },
-
- combination = { pdf = "Span", nature = "display" },
- combinationpair = { pdf = "Span", nature = "display" },
- combinationcontent = { pdf = "Span", nature = "mixed" },
- combinationcaption = { pdf = "Span", nature = "mixed" },
+local taglist = allocate() -- access by attribute
+local specifications = allocate() -- access by fulltag
+local labels = allocate()
+local stack = { }
+local chain = { }
+local ids = { }
+local enabled = false
+local tagcontext = { }
+local tagpatterns = { }
+local lasttags = { }
+local stacksize = 0
+local metadata = nil -- applied to the next element
+
+local tags = structures.tags
+tags.taglist = taglist -- can best be hidden
+tags.labels = labels
+tags.patterns = tagpatterns
+tags.specifications = specifications
+
+-- Tags are internally stored as:
+--
+-- tag>number tag>number tag>number
+
+local p_splitter = C((1-S(">"))^1) * P(">") * C(P(1)^1)
+tagpatterns.splitter = p_splitter
+
+local properties = allocate {
+
+ document = { pdf = "Div", nature = "display" },
+
+ division = { pdf = "Div", nature = "display" },
+ paragraph = { pdf = "P", nature = "mixed" },
+ p = { pdf = "P", nature = "mixed" },
+ construct = { pdf = "Span", nature = "inline" },
+ highlight = { pdf = "Span", nature = "inline" },
+
+ section = { pdf = "Sect", nature = "display" },
+ sectiontitle = { pdf = "H", nature = "mixed" },
+ sectionnumber = { pdf = "H", nature = "mixed" },
+ sectioncontent = { pdf = "Div", nature = "display" },
+
+ itemgroup = { pdf = "L", nature = "display" },
+ item = { pdf = "LI", nature = "display" },
+ itemtag = { pdf = "Lbl", nature = "mixed" },
+ itemcontent = { pdf = "LBody", nature = "mixed" },
+ itemhead = { pdf = "Div", nature = "display" },
+ itembody = { pdf = "Div", nature = "display" },
+
+ description = { pdf = "Div", nature = "display" },
+ descriptiontag = { pdf = "Div", nature = "mixed" },
+ descriptioncontent = { pdf = "Div", nature = "mixed" },
+ descriptionsymbol = { pdf = "Span", nature = "inline" }, -- note reference
+
+ verbatimblock = { pdf = "Code", nature = "display" },
+ verbatimlines = { pdf = "Code", nature = "display" },
+ verbatimline = { pdf = "Code", nature = "mixed" },
+ verbatim = { pdf = "Code", nature = "inline" },
+
+ lines = { pdf = "Code", nature = "display" },
+ line = { pdf = "Code", nature = "mixed" },
+
+ synonym = { pdf = "Span", nature = "inline" },
+ sorting = { pdf = "Span", nature = "inline" },
+
+ register = { pdf = "Div", nature = "display" },
+ registerlocation = { pdf = "Span", nature = "inline" },
+ registersection = { pdf = "Div", nature = "display" },
+ registertag = { pdf = "Span", nature = "mixed" },
+ registerentries = { pdf = "Div", nature = "display" },
+ registerentry = { pdf = "Div", nature = "display" },
+ registercontent = { pdf = "Span", nature = "mixed" },
+ registersee = { pdf = "Span", nature = "mixed" },
+ registerpages = { pdf = "Span", nature = "mixed" },
+ registerpage = { pdf = "Span", nature = "mixed" },
+ registerseparator = { pdf = "Span", nature = "inline" },
+ registerpagerange = { pdf = "Span", nature = "mixed" },
+
+ table = { pdf = "Table", nature = "display" },
+ tablerow = { pdf = "TR", nature = "display" },
+ tablecell = { pdf = "TD", nature = "mixed" },
+
+ tabulate = { pdf = "Table", nature = "display" },
+ tabulaterow = { pdf = "TR", nature = "display" },
+ tabulatecell = { pdf = "TD", nature = "mixed" },
+
+ list = { pdf = "TOC", nature = "display" },
+ listitem = { pdf = "TOCI", nature = "display" },
+ listtag = { pdf = "Lbl", nature = "mixed" },
+ listcontent = { pdf = "P", nature = "mixed" },
+ listdata = { pdf = "P", nature = "mixed" },
+ listpage = { pdf = "Reference", nature = "mixed" },
+
+ delimitedblock = { pdf = "BlockQuote", nature = "display" },
+ delimited = { pdf = "Quote", nature = "inline" },
+ subsentence = { pdf = "Span", nature = "inline" },
+
+ label = { pdf = "Span", nature = "mixed" },
+ number = { pdf = "Span", nature = "mixed" },
+
+ float = { pdf = "Div", nature = "display" }, -- Figure
+ floatcaption = { pdf = "Caption", nature = "mixed" },
+ floatlabel = { pdf = "Span", nature = "inline" },
+ floatnumber = { pdf = "Span", nature = "inline" },
+ floattext = { pdf = "Span", nature = "mixed" },
+ floatcontent = { pdf = "P", nature = "mixed" },
+
+ image = { pdf = "P", nature = "mixed" },
+ mpgraphic = { pdf = "P", nature = "mixed" },
+
+ formulaset = { pdf = "Div", nature = "display" },
+ formula = { pdf = "Div", nature = "display" }, -- Formula
+ formulacaption = { pdf = "Span", nature = "mixed" },
+ formulalabel = { pdf = "Span", nature = "mixed" },
+ formulanumber = { pdf = "Span", nature = "mixed" },
+ formulacontent = { pdf = "P", nature = "display" },
+ subformula = { pdf = "Div", nature = "display" },
+
+ link = { pdf = "Link", nature = "inline" },
+
+ margintextblock = { pdf = "Span", nature = "inline" },
+ margintext = { pdf = "Span", nature = "inline" },
+
+ math = { pdf = "Div", nature = "inline" }, -- no display
+ mn = { pdf = "Span", nature = "mixed" },
+ mi = { pdf = "Span", nature = "mixed" },
+ mo = { pdf = "Span", nature = "mixed" },
+ ms = { pdf = "Span", nature = "mixed" },
+ mrow = { pdf = "Span", nature = "display" },
+ msubsup = { pdf = "Span", nature = "display" },
+ msub = { pdf = "Span", nature = "display" },
+ msup = { pdf = "Span", nature = "display" },
+ merror = { pdf = "Span", nature = "mixed" },
+ munderover = { pdf = "Span", nature = "display" },
+ munder = { pdf = "Span", nature = "display" },
+ mover = { pdf = "Span", nature = "display" },
+ mtext = { pdf = "Span", nature = "mixed" },
+ mfrac = { pdf = "Span", nature = "display" },
+ mroot = { pdf = "Span", nature = "display" },
+ msqrt = { pdf = "Span", nature = "display" },
+ mfenced = { pdf = "Span", nature = "display" },
+ maction = { pdf = "Span", nature = "display" },
+
+ mstacker = { pdf = "Span", nature = "display" }, -- these are only internally used
+ mstackertop = { pdf = "Span", nature = "display" }, -- these are only internally used
+ mstackerbot = { pdf = "Span", nature = "display" }, -- these are only internally used
+ mstackermid = { pdf = "Span", nature = "display" }, -- these are only internally used
+
+ mtable = { pdf = "Table", nature = "display" }, -- might change
+ mtr = { pdf = "TR", nature = "display" }, -- might change
+ mtd = { pdf = "TD", nature = "display" }, -- might change
+
+ ignore = { pdf = "Span", nature = "mixed" }, -- used internally
+ private = { pdf = "Span", nature = "mixed" }, -- for users (like LS) when they need it
+ metadata = { pdf = "Div", nature = "display" },
+ metavariable = { pdf = "Span", nature = "mixed" },
+
+ mid = { pdf = "Span", nature = "inline" },
+ sub = { pdf = "Span", nature = "inline" },
+ sup = { pdf = "Span", nature = "inline" },
+ subsup = { pdf = "Span", nature = "inline" },
+
+ combination = { pdf = "Span", nature = "display" },
+ combinationpair = { pdf = "Span", nature = "display" },
+ combinationcontent = { pdf = "Span", nature = "mixed" },
+ combinationcaption = { pdf = "Span", nature = "mixed" },
}
-function tags.detailedtag(tag,detail,attribute)
- if not attribute then
- attribute = texattribute[a_tagged]
- end
+tags.properties = properties
+
+local patterns = setmetatableindex(function(t,tag)
+ local v = topattern("^" .. tag .. ">")
+ t[tag] = v
+ return v
+end)
+
+function tags.locatedtag(tag)
+ local attribute = texattribute[a_tagged]
if attribute >= 0 then
- local tl = taglist[attribute]
- if tl then
- local pattern
- if detail and detail ~= "" then
- pattern = "^" .. tag .. ":".. detail .. "%-"
- else
- pattern = "^" .. tag .. "%-"
- end
- for i=#tl,1,-1 do
- local tli = tl[i]
- if find(tli,pattern) then
- return tli
+ local specification = taglist[attribute]
+ if specification then
+ local taglist = specification.taglist
+ local pattern = patterns[tag]
+ for i=#taglist,1,-1 do
+ local t = taglist[i]
+ if find(t,pattern) then
+ return t
end
end
end
@@ -198,12 +228,20 @@ function tags.detailedtag(tag,detail,attribute)
return false -- handy as bogus index
end
-tags.properties = properties
-
-local lasttags = { }
-local userdata = { }
-
-tags.userdata = userdata
+function structures.atlocation(str)
+ local specification = taglist[texattribute[a_tagged]]
+ if specification then
+ if list then
+ local taglist = specification.taglist
+ local pattern = patterns[str]
+ for i=#list,1,-1 do
+ if find(list[i],pattern) then
+ return true
+ end
+ end
+ end
+ end
+end
function tags.setproperty(tag,key,value)
local p = properties[tag]
@@ -214,15 +252,18 @@ function tags.setproperty(tag,key,value)
end
end
-function tags.registerdata(data)
- local fulltag = chain[nstack]
- if fulltag then
- tagdata[fulltag] = data
+function tags.setaspect(key,value)
+ local tag = chain[stacksize]
+ if tag then
+ local p = properties[tag]
+ if p then
+ p[key] = value
+ else
+ properties[tag] = { [key] = value }
+ end
end
end
-local metadata
-
function tags.registermetadata(data)
local d = settings_to_hash(data)
if metadata then
@@ -232,75 +273,92 @@ function tags.registermetadata(data)
end
end
-local nstack = 0
-
function tags.start(tag,specification)
- local label, detail, user
- if specification then
- label, detail, user = specification.label, specification.detail, specification.userdata
- end
if not enabled then
codeinjections.enabletags()
enabled = true
end
--
---~ labels[tag] = label ~= "" and label or tag
---~ local fulltag
---~ if detail and detail ~= "" then
---~ fulltag = tag .. ":" .. detail
---~ else
---~ fulltag = tag
---~ end
+ labels[tag] = tag -- can go away
--
- local fulltag = label ~= "" and label or tag
- labels[tag] = fulltag
- if detail and detail ~= "" then
- fulltag = fulltag .. ":" .. detail
- end
+ local attribute = #taglist + 1
+ local tagindex = (ids[tag] or 0) + 1
--
- local t = #taglist + 1
- local n = (ids[fulltag] or 0) + 1
- ids[fulltag] = n
- lasttags[tag] = n
- local completetag = fulltag .. "-" .. n
- nstack = nstack + 1
- chain[nstack] = completetag
- stack[nstack] = t
- -- a copy as we can add key values for alt and actualtext if needed:
- taglist[t] = { unpack(chain,1,nstack) }
+ local completetag = tag .. ">" .. tagindex
--
- if user and user ~= "" then
- -- maybe we should merge this into taglist or whatever ... anyway there is room to optimize
- -- taglist.userdata = settings_to_hash(user)
- userdata[completetag] = settings_to_hash(user)
- end
- if metadata then
- tagmetadata[completetag] = metadata
+ ids[tag] = tagindex
+ lasttags[tag] = tagindex
+ stacksize = stacksize + 1
+ --
+ chain[stacksize] = completetag
+ stack[stacksize] = attribute
+ tagcontext[tag] = completetag
+ --
+ local tagnesting = { unpack(chain,1,stacksize) } -- a copy so we can add actualtext
+ --
+ if specification then
+ specification.attribute = attribute
+ specification.tagindex = tagindex
+ specification.taglist = tagnesting
+ specification.tagname = tag
+ if metadata then
+ specification.metadata = metadata
+ metadata = nil
+ end
+ local userdata = specification.userdata
+ if user ~= "" and type(userdata) == "string" then
+ specification.userdata = settings_to_hash(userdata)
+ end
+ local detail = specification.detail
+ if detail == "" then
+ specification.detail = nil
+ end
+ local parents = specification.parents
+ if parents == "" then
+ specification.parents = nil
+ end
+ else
+ specification = {
+ attribute = attribute,
+ tagindex = tagindex,
+ taglist = tagnesting,
+ tagname = tag,
+ metadata = metadata,
+ }
metadata = nil
end
- texattribute[a_tagged] = t
- return t
+ --
+ taglist[attribute] = specification
+ specifications[completetag] = specification
+ --
+ texattribute[a_tagged] = attribute
+ return attribute
end
-function tags.restart(completetag)
- local t = #taglist + 1
- nstack = nstack + 1
- chain[nstack] = completetag
- stack[nstack] = t
- taglist[t] = { unpack(chain,1,nstack) }
- texattribute[a_tagged] = t
- return t
+function tags.restart(attribute)
+ stacksize = stacksize + 1
+ if type(attribute) == "number" then
+ local taglist = taglist[attribute].taglist
+ chain[stacksize] = taglist[#taglist]
+ else
+ chain[stacksize] = attribute -- a string
+ attribute = #taglist + 1
+ taglist[attribute] = { taglist = { unpack(chain,1,stacksize) } }
+ end
+ stack[stacksize] = attribute
+ texattribute[a_tagged] = attribute
+ return attribute
end
function tags.stop()
- if nstack > 0 then
- nstack = nstack -1
+ if stacksize > 0 then
+ stacksize = stacksize - 1
end
- local t = stack[nstack]
+ local t = stack[stacksize]
if not t then
- if trace_tags then
- report_tags("ignoring end tag, previous chain: %s",nstack > 0 and concat(chain[nstack],"",1,nstack) or "none")
- end
+ -- if trace_tags then
+ report_tags("ignoring end tag, previous chain: %s",stacksize > 0 and concat(chain," ",1,stacksize) or "none")
+ -- end
t = unsetvalue
end
texattribute[a_tagged] = t
@@ -308,24 +366,56 @@ function tags.stop()
end
function tags.getid(tag,detail)
- if detail and detail ~= "" then
- return ids[tag .. ":" .. detail] or "?"
- else
- return ids[tag] or "?"
- end
+ return ids[tag] or "?"
end
function tags.last(tag)
return lasttags[tag] -- or false
end
-function tags.lastinchain()
- return chain[nstack]
+function tags.lastinchain(tag)
+ if tag and tag ~= "" then
+ return tagcontext[tag]
+ else
+ return chain[stacksize]
+ end
end
-function structures.atlocation(str)
- local location = gsub(concat(taglist[texattribute[a_tagged]],"-"),"%-%d+","")
- return find(location,topattern(str)) ~= nil
+local strip = C((1-S(">"))^1)
+
+function tags.elementtag()
+ local fulltag = chain[stacksize]
+ if fulltag then
+ return lpegmatch(strip,fulltag)
+ end
+end
+
+function tags.strip(fulltag)
+ return lpegmatch(strip,fulltag)
+end
+
+function tags.setuserproperties(tag,list)
+ if not list or list == "" then
+ tag, list = chain[stacksize], tag
+ else
+ tag = tagcontext[tag]
+ end
+ if tag then -- an attribute now
+ local l = settings_to_hash(list)
+ local s = specifications[tag]
+ if s then
+ local u = s.userdata
+ if u then
+ for k, v in next, l do
+ u[k] = v
+ end
+ else
+ s.userdata = l
+ end
+ else
+ -- error
+ end
+ end
end
function tags.handler(head) -- we need a dummy
@@ -334,8 +424,8 @@ end
statistics.register("structure elements", function()
if enabled then
- if nstack > 0 then
- return format("%s element chains identified, open chain: %s ",#taglist,concat(chain," => ",1,nstack))
+ if stacksize > 0 then
+ return format("%s element chains identified, open chain: %s ",#taglist,concat(chain," => ",1,stacksize))
else
return format("%s element chains identified",#taglist)
end
@@ -349,6 +439,65 @@ directives.register("backend.addtags", function(v)
end
end)
-commands.starttag = tags.start
-commands.stoptag = tags.stop
-commands.settagproperty = tags.setproperty
+-- interface
+
+local starttag = tags.start
+
+implement {
+ name = "starttag",
+ actions = starttag,
+ arguments = { "string" }
+}
+
+implement {
+ name = "stoptag",
+ actions = tags.stop,
+}
+
+implement {
+ name = "starttag_u",
+ scope = "private",
+ actions = function(tag,userdata) starttag(tag,{ userdata = userdata }) end,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "starttag_d",
+ scope = "private",
+ actions = function(tag,detail) starttag(tag,{ detail = detail }) end,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "starttag_c",
+ scope = "private",
+ actions = function(tag,detail,parents) starttag(tag,{ detail = detail, parents = parents }) end,
+ arguments = { "string", "string", "string" }
+}
+
+implement { name = "settagaspect", actions = tags.setaspect, arguments = { "string", "string" } }
+
+implement { name = "settagproperty", actions = tags.setproperty, arguments = { "string", "string", "string" } }
+implement { name = "settagproperty_b", actions = tags.setproperty, arguments = { "string", "'backend'", "string" }, scope = "private" }
+implement { name = "settagproperty_n", actions = tags.setproperty, arguments = { "string", "'nature'", "string" }, scope = "private" }
+
+implement { name = "getelementtag", actions = { tags.elementtag, context } }
+
+implement {
+ name = "setelementuserproperties",
+ scope = "private",
+ actions = tags.setuserproperties,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "doifelseinelement",
+ actions = { structures.atlocation, commands.testcase },
+ arguments = "string",
+}
+
+implement {
+ name = "settaggedmetadata",
+ actions = structures.tags.registermetadata,
+ arguments = "string"
+}
diff --git a/Master/texmf-dist/tex/context/base/strc-tag.mkiv b/Master/texmf-dist/tex/context/base/strc-tag.mkiv
index 6e792fd3f97..f2b59c29c2d 100644
--- a/Master/texmf-dist/tex/context/base/strc-tag.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-tag.mkiv
@@ -11,6 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+% labels: no language needed
% key/values and other names might change (and probably will)
\writestatus{loading}{ConTeXt Structure Macros / Tags}
@@ -22,123 +23,139 @@
%D Eventually these labels will either move to the modules
%D where they're used, or they will en dup in mult-tag.
-\def\t!document {document} % Div
-
-\def\t!division {division} % Div
-\def\t!paragraph {paragraph} % P
-\def\t!p {p} % P
-\def\t!construct {construct} % Span
-\def\t!highlight {highlight} % Span
-
-\def\t!section {section} % Sect
-\def\t!sectiontitle {sectiontitle} % H
-\def\t!sectionnumber {sectionnumber} % H
-\def\t!sectioncontent {sectioncontent} % Div
-
-\def\t!itemgroup {itemgroup} % L
-\def\t!item {item} % Li
-\def\t!itemtag {itemtag} % Lbl
-\def\t!itemcontent {itemcontent} % LBody
-
-\def\t!description {description} % Li
-\def\t!descriptiontag {descriptiontag} % Lbl
-\def\t!descriptioncontent {descriptioncontent} % LBody
-\def\t!descriptionsymbol {descriptionsymbol} % Span
-
-\let\t!construction \t!description
-\let\t!constructiontag \t!descriptiontag
-\let\t!constructioncontent\t!descriptioncontent
-\let\t!constructionsymbol \t!descriptionsymbol
-
-\def\t!verbatimblock {verbatimblock} % Code
-\def\t!verbatimlines {verbatimlines} % Code
-\def\t!verbatimline {verbatimline} % Code
-\def\t!verbatim {verbatim} % Code
-
-\def\t!lines {lines} % Code
-\def\t!line {line} % Code
-
-\def\t!sorting {sorting} % Span
-\def\t!synonym {synonym} % Span
-
-\def\t!register {register} % Div
-\def\t!registersection {registersection} % Div
-\def\t!registertag {registertag} % Span
-\def\t!registerentries {registerentries} % Div
-\def\t!registerentry {registerentry} % Span
-\def\t!registersee {registersee} % Span
-\def\t!registerpages {registerpages} % Span
-\def\t!registerpage {registerpage} % Span
-\def\t!registerpagerange {registerpagerange} % Span
-
-\def\t!table {table} % Table
-\def\t!tablerow {tablerow} % TR
-\def\t!tablecell {tablecell} % TD
-\def\t!tabulate {tabulate} % Table
-\def\t!tabulaterow {tabulaterow} % TR
-\def\t!tabulatecell {tabulatecell} % TD
-
-\def\t!math {math} % math
-\def\t!mathtable {mtable} % Table
-\def\t!mathtablerow {mtr} % TR
-\def\t!mathtablecell {mtd} % TD
-\def\t!mathaction {maction} %
-
-\def\t!list {list} % TOC
-\def\t!listitem {listitem} % TOCI
-\def\t!listtag {listtag} % Lbl
-\def\t!listcontent {listcontent} % P
-\def\t!listdata {listdata} % P
-\def\t!listpage {listpage} % Reference
-
-\def\t!delimitedblock {delimited} % BlockQuote
-\def\t!delimited {delimited} % Quote
-\def\t!subsentence {subsentence} % Span
-
-\def\t!float {float} % Div
-\def\t!floatcaption {floatcaption} % Caption
-\def\t!floatlabel {floatlabel} % Span
-\def\t!floattext {floattext} % Span
-\def\t!floatnumber {floatnumber} % Span
-\def\t!floatcontent {floatcontent} % P
-
-\def\t!image {image} % P
-
-\def\t!mpgraphic {mpgraphic} % P
-
-\def\t!formulaset {formulaset} % Div
-\def\t!formula {formula} % Div
-\def\t!formulacaption {formulacaption} % Span
-\def\t!formulalabel {formulalabel} % Span
-\def\t!formulanumber {formulanumber} % P
-\def\t!formulacontent {formulacontent} % P
-\def\t!subformula {subformula} % Div
-
-\def\t!link {link} % Link
-
-\def\t!margintext {margintext} % Span
-\def\t!margintextblock {margintextblock} % Div
+\def\t!document {document} % Div
+
+\def\t!division {division} % Div
+\def\t!paragraph {paragraph} % P
+\def\t!p {p} % P
+\def\t!construct {construct} % Span
+\def\t!highlight {highlight} % Span
+
+\def\t!section {section} % Sect
+\def\t!sectiontitle {sectiontitle} % H
+\def\t!sectionnumber {sectionnumber} % H
+\def\t!sectioncontent {sectioncontent} % Div
+
+\def\t!itemgroup {itemgroup} % L
+\def\t!item {item} % Li
+\def\t!itemtag {itemtag} % Lbl
+\def\t!itemcontent {itemcontent} % LBody
+\def\t!itemhead {itemhead} % Div
+\def\t!itembody {itembody} % Div
+
+\def\t!description {description} % Li
+\def\t!descriptiontag {descriptiontag} % Lbl
+\def\t!descriptioncontent {descriptioncontent} % LBody
+\def\t!descriptionsymbol {descriptionsymbol} % Span
+
+\let\t!construction \t!description
+\let\t!constructiontag \t!descriptiontag
+\let\t!constructioncontent \t!descriptioncontent
+\let\t!constructionsymbol \t!descriptionsymbol
+
+\def\t!verbatimblock {verbatimblock} % Code
+\def\t!verbatimlines {verbatimlines} % Code
+\def\t!verbatimline {verbatimline} % Code
+\def\t!verbatim {verbatim} % Code
+
+\def\t!lines {lines} % Code
+\def\t!line {line} % Code
+
+\def\t!sorting {sorting} % Span
+\def\t!synonym {synonym} % Span
+
+\def\t!register {register} % Div
+\def\t!registerlocation {registerlocation} % Span
+\def\t!registersection {registersection} % Div
+\def\t!registertag {registertag} % Span
+\def\t!registerentries {registerentries} % Div
+\def\t!registerentry {registerentry} % Span
+\def\t!registercontent {registercontent} % Span
+\def\t!registersee {registersee} % Span
+\def\t!registerpages {registerpages} % Span
+\def\t!registerpage {registerpage} % Span
+\def\t!registerpagerange {registerpagerange} % Span
+\def\t!registerfrompage {registerfrompage} % Span
+\def\t!registertopage {registertopage} % Span
+\def\t!registerseparator {registerseparator} % Span
+
+\def\t!table {table} % Table
+\def\t!tablerow {tablerow} % TR
+\def\t!tablecell {tablecell} % TD
+\def\t!tabulate {tabulate} % Table
+\def\t!tabulaterow {tabulaterow} % TR
+\def\t!tabulatecell {tabulatecell} % TD
+
+\def\t!math {math} % math
+\def\t!mathtable {mtable} % Table
+\def\t!mathtablerow {mtr} % TR
+\def\t!mathtablecell {mtd} % TD
+\def\t!mathaction {maction} %
+\def\t!mathstacker {mstacker}
+\def\t!mathstackertop {mstackertop}
+\def\t!mathstackermid {mstackermid}
+\def\t!mathstackerbot {mstackerbot}
+
+\def\t!munderover {munderover} % special cases
+\def\t!munder {munder} % special cases
+\def\t!mover {mover} % special cases
+
+\def\t!list {list} % TOC
+\def\t!listitem {listitem} % TOCI
+\def\t!listtag {listtag} % Lbl
+\def\t!listcontent {listcontent} % P
+\def\t!listdata {listdata} % P
+\def\t!listpage {listpage} % Reference
+
+\def\t!delimitedblock {delimited} % BlockQuote
+\def\t!delimited {delimited} % Quote
+\def\t!subsentence {subsentence} % Span
+
+\def\t!float {float} % Div
+\def\t!floatcaption {floatcaption} % Caption
+\def\t!floatlabel {floatlabel} % Span
+\def\t!floattext {floattext} % Span
+\def\t!floatnumber {floatnumber} % Span
+\def\t!floatcontent {floatcontent} % P
+
+\def\t!image {image} % P
+
+\def\t!mpgraphic {mpgraphic} % P
+
+\def\t!formulaset {formulaset} % Div
+\def\t!formula {formula} % Div
+\def\t!formulacaption {formulacaption} % Span
+\def\t!formulalabel {formulalabel} % Span
+\def\t!formulanumber {formulanumber} % P
+\def\t!formulacontent {formulacontent} % P
+\def\t!subformula {subformula} % Div
+
+\def\t!link {link} % Link
+
+\def\t!margintext {margintext} % Span
+\def\t!margintextblock {margintextblock} % Div
% we might opt for verbose variants so this is experimental:
-\def\t!label {label} % Span
-\def\t!number {number} % Span
+\def\t!label {label} % Span
+\def\t!number {number} % Span
-\def\t!ignore {ignore} % Span
+\def\t!ignore {ignore} % Span
+\def\t!private {private} % Span
-\def\t!mid {mid} % Span
-\def\t!sub {sub} % Span
-\def\t!sup {sup} % Span
-\def\t!subsup {subsup} % Span
+\def\t!mid {mid} % Span
+\def\t!sub {sub} % Span
+\def\t!sup {sup} % Span
+\def\t!subsup {subsup} % Span
-\def\t!unit {unit} % Span
-\def\t!quantity {quantity} % Span
-\def\t!number {number} % Span
+\def\t!unit {unit} % Span
+\def\t!quantity {quantity} % Span
+\def\t!number {number} % Span
-\def\t!combination {combination} % Span
-\def\t!combinationpair {combinationpair} % Span
-\def\t!combinationcontent {combinationcontent} % Span
-\def\t!combinationcaption {combinationcaption} % Span
+\def\t!combination {combination} % Span
+\def\t!combinationpair {combinationpair} % Span
+\def\t!combinationcontent {combinationcontent} % Span
+\def\t!combinationcaption {combinationcaption} % Span
% \setuptaglabeltext
% [en]
@@ -152,8 +169,11 @@
\unexpanded\def\setelementbackendtag{\dodoubleargument\strc_tags_set_backend}
\unexpanded\def\setelementnature {\dodoubleargument\strc_tags_set_nature}
-\def\strc_tags_set_backend[#1][#2]{\ctxcommand{settagproperty("#1","backend","#2")}}
-\def\strc_tags_set_nature [#1][#2]{\ctxcommand{settagproperty("#1","nature", "#2")}}
+\def\strc_tags_set_backend[#1][#2]{\clf_settagproperty_b{#1}{#2}} % todo: ignore when no export
+\def\strc_tags_set_nature [#1][#2]{\clf_settagproperty_n{#1}{#2}} % todo: ignore when no export
+
+\unexpanded\def\strc_tags_set_aspect_nop#1#2{}
+\unexpanded\def\strc_tags_set_aspect_yes#1#2{\clf_settagaspect{#1}{#2}} % todo: ignore when no export / also \let
\installcorenamespace{tagging}
@@ -176,11 +196,14 @@
\expandafter\strc_tags_element_stop_yes
\fi}
+% it makes no sense to have labels ... maybe some day as a last 'replace' in the export
+% which might be more efficient then ... okay, we now cannot overload but who cares
+
\unexpanded\def\strc_tags_element_start_yes_indeed_yes[#1][#2]%
- {\ctxcommand{starttag("#1",{label="\dogetupsometaglabeltext{#1}",userdata=\!!bs#2\!!es})}}
+ {\clf_starttag_u{#1}{#2}}
\unexpanded\def\strc_tags_element_stop_yes
- {\ctxcommand{stoptag()}}
+ {\clf_stoptag}
\unexpanded\def\strc_tags_element_start_nop_indeed[#1][#2]%
{}
@@ -191,19 +214,35 @@
\unexpanded\def\strc_tags_enable_elements
{\setuplanguage[\s!default][\s!righthyphenchar="AD]% for the moment here
\let\startelement\strc_tags_element_start_yes
- \let\stopelement \strc_tags_element_stop_yes}
+ \let\stopelement \strc_tags_element_stop_yes
+ \let\dosettagproperty\strc_tags_set_aspect_yes}
\unexpanded\def\strc_tags_disable_elements
{\let\startelement\strc_tags_element_start_nop
- \let\stopelement \strc_tags_element_stop_nop}
+ \let\stopelement \strc_tags_element_stop_nop
+ \let\dosettagproperty\strc_tags_set_aspect_nop}
% beware: making these unexpanded spoils tables (noalign problem)
-\def\strc_tags_enabled_start
+\def\strc_tags_enabled_start_no_detail
+ {\iftrialtypesetting
+ \expandafter\strc_tags_start_nop_no_detail
+ \else
+ \expandafter\strc_tags_start_yes_no_detail
+ \fi}
+
+\def\strc_tags_enabled_start_detail
+ {\iftrialtypesetting
+ \expandafter\strc_tags_start_nop_detail
+ \else
+ \expandafter\strc_tags_start_yes_detail
+ \fi}
+
+\def\strc_tags_enabled_start_chained
{\iftrialtypesetting
- \expandafter\strc_tags_start_nop
+ \expandafter\strc_tags_start_nop_chained
\else
- \expandafter\strc_tags_start_yes
+ \expandafter\strc_tags_start_yes_chained
\fi}
\def\strc_tags_enabled_stop
@@ -213,25 +252,66 @@
\expandafter\strc_tags_stop_yes
\fi}
-\def\strc_tags_start_yes#1#2% we could have a fast labeltext resolver
- {\ctxcommand{starttag("#1",{label="\dogetupsometaglabeltext{#1}",detail="#2"})}}
+\def\strc_tags_start_yes_no_detail #1{\clf_starttag{#1}}
+\def\strc_tags_start_yes_detail #1#2{\clf_starttag_d{#1}{#2}}
+\def\strc_tags_start_yes_chained #1#2#3{\clf_starttag_c{#1}{#2}{\getcurrentparentchain#3{#2}}}
+\def\strc_tags_stop_yes {\clf_stoptag}
-\def\strc_tags_stop_yes
- {\ctxcommand{stoptag()}}
+\let\strc_tags_start_nop_no_detail\gobbleoneargument
+\let\strc_tags_start_nop_detail \gobbletwoarguments
+\let\strc_tags_start_nop_chained \gobblethreearguments
+\let\strc_tags_stop_nop \donothing
-\def\strc_tags_start_nop#1#2%
- {}
+% more efficient:
-\def\strc_tags_stop_nop
- {}
+% \dostarttagged % {tag} {detail}
+% \dostarttaggedchained % {tag} {detail} \??hash
+% \dostarttaggednodetail % {tag}
+
+% \unexpanded\def\strc_tags_enable
+% {\let\dostarttagged\strc_tags_start_yes
+% \let\dostoptagged \strc_tags_stop_yes}
\unexpanded\def\strc_tags_enable
- {\let\dostarttagged\strc_tags_start_yes
- \let\dostoptagged \strc_tags_stop_yes}
+ {\let\dostarttagged \strc_tags_enabled_start_detail
+ \let\dostarttaggednodetail\strc_tags_enabled_start_no_detail
+ \let\dostarttaggedchained \strc_tags_enabled_start_chained
+ \let\dostoptagged \strc_tags_enabled_stop}
\unexpanded\def\strc_tags_disable
- {\let\dostarttagged\strc_tags_start_nop
- \let\dostoptagged \strc_tags_stop_nop}
+ {\let\dostarttagged \strc_tags_start_nop_detail
+ \let\dostarttaggednodetail\strc_tags_start_nop_no_detail
+ \let\dostarttaggedchained \strc_tags_start_nop_chained
+ \let\dostoptagged \strc_tags_stop_nop}
+
+% for luigi (beware: fully expandable):
+
+\def\strc_tags_get_element_tag_yes{\clf_getelementtag}
+\let\strc_tags_get_element_tag_nop\donothing
+
+\unexpanded\def\strc_tags_setup_element_user_properties_yes
+ {\dodoubleempty\strc_tags_setup_element_user_properties_indeed}
+
+\unexpanded\def\strc_tags_setup_element_user_properties_nop
+ {\dodoubleempty\strc_tags_setup_element_user_properties_indeed_nop}
+
+\def\strc_tags_setup_element_user_properties_indeed
+ {\iftrialtypesetting
+ \expandafter\strc_tags_setup_element_user_properties_indeed_nop
+ \else
+ \expandafter\strc_tags_setup_element_user_properties_indeed_yes
+ \fi}
+
+\def\strc_tags_setup_element_user_properties_indeed_nop[#1][#2]{}
+\def\strc_tags_setup_element_user_properties_indeed_yes[#1][#2]{\clf_setelementuserproperties{#1}{#2}}
+
+\unexpanded\def\strc_tags_enable_properties
+ {\let\getelementtag \strc_tags_get_element_tag_yes
+ \let\setupelementuserproperties\strc_tags_setup_element_user_properties_yes}
+
+\unexpanded\def\strc_tags_disable_properties
+ {\let\getelementtag \strc_tags_get_element_tag_nop
+ \let\setupelementuserproperties\strc_tags_setup_element_user_properties_nop}
%D The triggers:
@@ -240,11 +320,13 @@
\appendtoks
\strc_tags_enable_elements
+ \strc_tags_enable_properties
\doifelse{\taggingparameter\c!method}\v!auto\strc_tags_enable\strc_tags_disable
\to \everyenableelements
\appendtoks
\strc_tags_disable_elements
+ \strc_tags_disable_properties
\strc_tags_disable
\to \everydisableelements
@@ -277,41 +359,41 @@
\installcorenamespace {paragraph}
\installcommandhandler \??paragraph {paragraph} \??paragraph
-\setupparagraph % someday maybe also strut (beg/end)
+\setupparagraph % someday maybe also strut (beg/end) and align
[\c!color=,
\c!style=]
\unexpanded\def\startparagraph
- {\dodoubleempty\paragraph_start}
+ {\dodoubleempty\paragraph_start}
\def\paragraph_start
- {\iffirstargument
- \ifsecondargument
- \doubleexpandafter\paragraph_start_two
- \else
- \doubleexpandafter\paragraph_start_one
- \fi
- \else
- \expandafter\paragraph_start_zero
- \fi}
+ {\endgraf % we end before the group
+ \begingroup
+ \iffirstargument
+ \ifsecondargument
+ \doubleexpandafter\paragraph_start_two
+ \else
+ \doubleexpandafter\paragraph_start_one
+ \fi
+ \else
+ \expandafter\paragraph_start_zero
+ \fi}
\def\paragraph_start_two[#1][#2]%
- {\endgraf % we end before the group
- \begingroup
- \let\stopparagraph\paragraph_stop_indeed
- \edef\currentparagraph{#1}%
- \setupcurrentparagraph[#2]%
- \paragraph_start_indeed}
+ {\edef\currentparagraph{#1}%
+ \setupcurrentparagraph[#2]%
+ \paragraph_start_indeed}
\def\paragraph_start_one[#1][#2]%
- {\endgraf % we end before the group
- \begingroup
- \let\stopparagraph\paragraph_stop_indeed
- \doifassignmentelse{#1}
- {\let\currentparagraph\empty
- \setupcurrentparagraph[#1]}
- {\edef\currentparagraph{#1}}%
- \paragraph_start_indeed}
+ {\doifelseassignment{#1}
+ {\let\currentparagraph\empty
+ \setupcurrentparagraph[#1]}
+ {\edef\currentparagraph{#1}}%
+ \paragraph_start_indeed}
+
+\def\paragraph_start_zero[#1][#2]%
+ {\let\currentparagraph\empty
+ \paragraph_start_indeed}
\def\paragraph_start_indeed
{\useparagraphstyleandcolor\c!style\c!color
@@ -319,27 +401,32 @@
\usesetupsparameter\paragraphparameter
\dostarttagged\t!paragraph\currentparagraph}
-\def\paragraph_start_zero[#1][#2]%
- {\let\currentparagraph\empty
- \paragraph_start_indeed}
-
-\unexpanded\def\paragraph_stop_indeed
- {\dostoptagged
- \endgraf % we end inside the group
- \endgroup}
-
\unexpanded\def\stopparagraph
- {\dostoptagged}
+ {\dostoptagged
+ \endgraf % we end inside the group
+ \endgroup}
\let\startpar\startparagraph
\let\stoppar \stopparagraph
+\def\strc_tags_document_start_indeed
+ {\glet\strc_tags_document_start_indeed\relax
+ \dostarttagged\t!document\empty}
+
+\def\strc_tags_document_stop_indeed
+ {\glet\strc_tags_document_stop_indeed\relax
+ \dostoptagged}
+
\appendtoks
- \dostarttagged\t!document\empty
-\to \everystarttext
+ \strc_tags_document_start_indeed % here because otherwise products don't get a root (starttext before env)
+\to \everyenableelements
+
+% \appendtoks
+% \strc_tags_document_start_indeed
+% \to \everystarttext
\appendtoks
- \dostoptagged
+ \strc_tags_document_stop_indeed
\to \everystoptext
\appendtoks
@@ -347,12 +434,14 @@
\strc_tags_disable
\to \everybeforepagebody
-% \doifinelementelse{structure:section} {yes} {no}
-% \doifinelementelse{structure:chapter} {yes} {no}
-% \doifinelementelse{division:*-structure:chapter} {yes} {no}
+% \doifelseinelement{structure:section} {yes} {no}
+% \doifelseinelement{structure:chapter} {yes} {no}
+% \doifelseinelement{division:*-structure:chapter} {yes} {no}
+
+\unexpanded\def\doifelseinelement#1%
+ {\clf_doifelseinelement{#1}}
-\unexpanded\def\doifinelementelse#1%
- {\ctxcommand{testcase(structures.atlocation("#1"))}}
+\let\doifinelementelse\doifelseinelement
\unexpanded\def\taggedlabeltexts#1#2#3% experimental: label, numberdetail, numbercontent
{\begingroup
@@ -398,7 +487,7 @@
%D \stoptyping
\unexpanded\def\settaggedmetadata[#1]%
- {\ctxlua{structures.tags.registermetadata(\!!bs#1\!!es)}}
+ {\clf_settaggedmetadata{#1}}
%D An overload:
diff --git a/Master/texmf-dist/tex/context/base/supp-box.lua b/Master/texmf-dist/tex/context/base/supp-box.lua
index 3c5a3383d01..7cc71a891dd 100644
--- a/Master/texmf-dist/tex/context/base/supp-box.lua
+++ b/Master/texmf-dist/tex/context/base/supp-box.lua
@@ -8,13 +8,16 @@ if not modules then modules = { } end modules ['supp-box'] = {
-- this is preliminary code, use insert_before etc
+local lpegmatch = lpeg.match
+
local report_hyphenation = logs.reporter("languages","hyphenation")
local tex = tex
local context = context
-local commands = commands
local nodes = nodes
+local implement = interfaces.implement
+
local splitstring = string.split
local nodecodes = nodes.nodecodes
@@ -42,9 +45,12 @@ local setfield = nuts.setfield
local setbox = nuts.setbox
local free_node = nuts.free
-local copy_list = nuts.copy_list
+local flush_list = nuts.flush_list
local copy_node = nuts.copy
+local copy_list = nuts.copy_list
local find_tail = nuts.tail
+local traverse_id = nuts.traverse_id
+local link_nodes = nuts.linked
local listtoutf = nodes.listtoutf
@@ -52,29 +58,64 @@ local nodepool = nuts.pool
local new_penalty = nodepool.penalty
local new_hlist = nodepool.hlist
local new_glue = nodepool.glue
+local new_rule = nodepool.rule
+local new_kern = nodepool.kern
+
+local setlistcolor = nodes.tracers.colors.setlist
local texget = tex.get
+local texgetbox = tex.getbox
-local function hyphenatedlist(head)
+local function hyphenatedlist(head,usecolor)
local current = head and tonut(head)
while current do
local id = getid(current)
local next = getnext(current)
local prev = getprev(current)
if id == disc_code then
- local hyphen = getfield(current,"pre")
- if hyphen then
- local penalty = new_penalty(-500)
- -- insert_after etc
- setfield(hyphen,"next",penalty)
- setfield(penalty,"prev",hyphen)
- setfield(prev,"next",hyphen)
- setfield(next,"prev", penalty)
- setfield(penalty,"next",next)
- setfield(hyphen,"prev",prev)
+ local pre = getfield(current,"pre")
+ local post = getfield(current,"post")
+ local replace = getfield(current,"replace")
+ if pre then
setfield(current,"pre",nil)
- free_node(current)
end
+ if post then
+ setfield(current,"post",nil)
+ end
+ if not usecolor then
+ -- nothing fancy done
+ elseif pre and post then
+ setlistcolor(pre,"darkmagenta")
+ setlistcolor(post,"darkcyan")
+ elseif pre then
+ setlistcolor(pre,"darkyellow")
+ elseif post then
+ setlistcolor(post,"darkyellow")
+ end
+ if replace then
+ flush_list(replace)
+ setfield(current,"replace",nil)
+ end
+ -- setfield(current,"replace",new_rule(65536)) -- new_kern(65536*2))
+ setfield(current,"next",nil)
+ setfield(current,"prev",nil)
+ local list = link_nodes (
+ pre and new_penalty(10000),
+ pre,
+ current,
+ post,
+ post and new_penalty(10000)
+ )
+ local tail = find_tail(list)
+ if prev then
+ setfield(prev,"next",list)
+ setfield(list,"prev",prev)
+ end
+ if next then
+ setfield(tail,"next",next)
+ setfield(next,"prev",tail)
+ end
+ -- free_node(current)
elseif id == vlist_code or id == hlist_code then
hyphenatedlist(getlist(current))
end
@@ -82,11 +123,29 @@ local function hyphenatedlist(head)
end
end
-commands.hyphenatedlist = hyphenatedlist
+implement {
+ name = "hyphenatedlist",
+ arguments = { "integer", "boolean" },
+ actions = function(n,color)
+ local b = texgetbox(n)
+ if b then
+ hyphenatedlist(b.list,color)
+ end
+ end
+}
-function commands.showhyphenatedinlist(list)
- report_hyphenation("show: %s",listtoutf(tonut(list),false,true))
-end
+-- local function hyphenatedhack(head,pre)
+-- pre = tonut(pre)
+-- for n in traverse_id(disc_code,tonut(head)) do
+-- local hyphen = getfield(n,"pre")
+-- if hyphen then
+-- flush_list(hyphen)
+-- end
+-- setfield(n,"pre",copy_list(pre))
+-- end
+-- end
+--
+-- commands.hyphenatedhack = hyphenatedhack
local function checkedlist(list)
if type(list) == "number" then
@@ -96,12 +155,20 @@ local function checkedlist(list)
end
end
+implement {
+ name = "showhyphenatedinlist",
+ arguments = "integer",
+ actions = function(box)
+ report_hyphenation("show: %s",listtoutf(checkedlist(n),false,true))
+ end
+}
+
local function applytochars(current,doaction,noaction,nested)
while current do
local id = getid(current)
if nested and (id == hlist_code or id == vlist_code) then
context.beginhbox()
- applytochars(getlist(current),what,nested)
+ applytochars(getlist(current),doaction,noaction,nested)
context.endhbox()
elseif id ~= glyph_code then
noaction(tonode(copy_node(current)))
@@ -124,7 +191,7 @@ local function applytowords(current,doaction,noaction,nested)
noaction(tonode(copy_node(current)))
elseif nested and (id == hlist_code or id == vlist_code) then
context.beginhbox()
- applytowords(getlist(current),what,nested)
+ applytowords(getlist(current),doaction,noaction,nested)
context.egroup()
elseif not start then
start = current
@@ -136,17 +203,43 @@ local function applytowords(current,doaction,noaction,nested)
end
end
-commands.applytochars = function(list,what,nested) applytochars(checkedlist(list),context[what or "ruledhbox"],context,nested) end
-commands.applytowords = function(list,what,nested) applytowords(checkedlist(list),context[what or "ruledhbox"],context,nested) end
+local methods = {
+ char = applytochars,
+ characters = applytochars,
+ word = applytowords,
+ words = applytowords,
+}
+
+implement {
+ name = "applytobox",
+ arguments = {
+ {
+ { "box", "integer" },
+ { "command" },
+ { "method" },
+ { "nested", "boolean" },
+ }
+ },
+ actions = function(specification)
+ local list = checkedlist(specification.box)
+ local action = methods[specification.method or "char"]
+ if list and action then
+ action(list,context[specification.command or "ruledhbox"],context,specification.nested)
+ end
+ end
+}
local split_char = lpeg.Ct(lpeg.C(1)^0)
local split_word = lpeg.tsplitat(lpeg.patterns.space)
local split_line = lpeg.tsplitat(lpeg.patterns.eol)
-function commands.processsplit(str,command,how,spaced)
- how = how or "word"
- if how == "char" then
- local words = lpeg.match(split_char,str)
+local function processsplit(specification)
+ local str = specification.data or ""
+ local command = specification.command or "ruledhbox"
+ local method = specification.method or "word"
+ local spaced = specification.spaced
+ if method == "char" or method == "character" then
+ local words = lpegmatch(split_char,str)
for i=1,#words do
local word = words[i]
if word == " " then
@@ -159,8 +252,8 @@ function commands.processsplit(str,command,how,spaced)
context(word)
end
end
- elseif how == "word" then
- local words = lpeg.match(split_word,str)
+ elseif method == "word" then
+ local words = lpegmatch(split_word,str)
for i=1,#words do
local word = words[i]
if spaced and i > 1 then
@@ -172,8 +265,8 @@ function commands.processsplit(str,command,how,spaced)
context(word)
end
end
- elseif how == "line" then
- local words = lpeg.match(split_line,str)
+ elseif method == "line" then
+ local words = lpegmatch(split_line,str)
for i=1,#words do
local word = words[i]
if spaced and i > 1 then
@@ -190,63 +283,88 @@ function commands.processsplit(str,command,how,spaced)
end
end
+implement {
+ name = "processsplit",
+ actions = processsplit,
+ arguments = {
+ {
+ { "data" },
+ { "command" },
+ { "method" },
+ { "spaced", "boolean" },
+ }
+ }
+}
+
local a_vboxtohboxseparator = attributes.private("vboxtohboxseparator")
-function commands.vboxlisttohbox(original,target,inbetween)
- local current = getlist(getbox(original))
- local head = nil
- local tail = nil
- while current do
- local id = getid(current)
- local next = getnext(current)
- if id == hlist_code then
- local list = getlist(current)
- if head then
- if inbetween > 0 then
- local n = new_glue(0,0,inbetween)
- setfield(tail,"next",n)
- setfield(n,"prev",tail)
- tail = n
- end
- setfield(tail,"next",list)
- setfield(list,"prev",tail)
- else
- head = list
- end
- tail = find_tail(list)
- -- remove last separator
- if getid(tail) == hlist_code and getattribute(tail,a_vboxtohboxseparator) == 1 then
- local temp = tail
- local prev = getprev(tail)
- if next then
- local list = getlist(tail)
- setfield(prev,"next",list)
- setfield(list,"prev",prev)
- setfield(tail,"list",nil)
- tail = find_tail(list)
+implement {
+ name = "vboxlisttohbox",
+ arguments = { "integer", "integer", "dimen" },
+ actions = function(original,target,inbetween)
+ local current = getlist(getbox(original))
+ local head = nil
+ local tail = nil
+ while current do
+ local id = getid(current)
+ local next = getnext(current)
+ if id == hlist_code then
+ local list = getlist(current)
+ if head then
+ if inbetween > 0 then
+ local n = new_glue(0,0,inbetween)
+ setfield(tail,"next",n)
+ setfield(n,"prev",tail)
+ tail = n
+ end
+ setfield(tail,"next",list)
+ setfield(list,"prev",tail)
else
- tail = prev
+ head = list
+ end
+ tail = find_tail(list)
+ -- remove last separator
+ if getid(tail) == hlist_code and getattribute(tail,a_vboxtohboxseparator) == 1 then
+ local temp = tail
+ local prev = getprev(tail)
+ if next then
+ local list = getlist(tail)
+ setfield(prev,"next",list)
+ setfield(list,"prev",prev)
+ setfield(tail,"list",nil)
+ tail = find_tail(list)
+ else
+ tail = prev
+ end
+ free_node(temp)
end
- free_node(temp)
+ -- done
+ setfield(tail,"next",nil)
+ setfield(current,"list",nil)
end
- -- done
- setfield(tail,"next",nil)
- setfield(current,"list",nil)
+ current = next
end
- current = next
+ local result = new_hlist()
+ setfield(result,"list",head)
+ setbox(target,result)
end
- local result = new_hlist()
- setfield(result,"list",head)
- setbox(target,result)
-end
+}
-function commands.hboxtovbox(original)
- local b = getbox(original)
- local factor = texget("baselineskip").width / texget("hsize")
- setfield(b,"depth",0)
- setfield(b,"height",getfield(b,"width") * factor)
-end
+implement {
+ name = "hboxtovbox",
+ arguments = "integer",
+ actions = function(n)
+ local b = getbox(n)
+ local factor = texget("baselineskip").width / texget("hsize")
+ setfield(b,"depth",0)
+ setfield(b,"height",getfield(b,"width") * factor)
+ end
+}
-function commands.boxtostring(n)
- context.puretext(nodes.toutf(tex.box[n].list)) -- helper is defined later
-end
+implement {
+ name = "boxtostring",
+ arguments = "integer",
+ actions = function(n)
+ context.puretext(nodes.toutf(texgetbox(n).list)) -- helper is defined later
+ end
+}
diff --git a/Master/texmf-dist/tex/context/base/supp-box.mkiv b/Master/texmf-dist/tex/context/base/supp-box.mkiv
index 66f373b72a7..54b0e2860a3 100644
--- a/Master/texmf-dist/tex/context/base/supp-box.mkiv
+++ b/Master/texmf-dist/tex/context/base/supp-box.mkiv
@@ -570,7 +570,7 @@
%D \doiftext {data} {then branch}
%D \stoptyping
-\unexpanded\def\doiftextelse#1%
+\unexpanded\def\doifelsetext#1%
{\begingroup
\setbox\scratchbox\hbox
{\settrialtypesetting
@@ -581,6 +581,8 @@
\endgroup\expandafter\firstoftwoarguments
\fi}
+\let\doiftextelse\doifelsetext
+
\unexpanded\def\doiftext#1%
{\begingroup
\setbox\scratchbox\hbox
@@ -658,8 +660,8 @@
%D A slower but more versatile implementation is:
%D
%D \starttyping
-%D \long\def\dowithnextbox#1#2%
-%D {\long\def\syst_boxes_with_next_box{#1}%
+%D \unexpanded\def\dowithnextbox#1#2%
+%D {\def\syst_boxes_with_next_box{#1}%
%D \ifx#2\hbox
%D \afterassignment\syst_boxes_with_next_box_indeed
%D \else\ifx#2\vbox
@@ -1063,10 +1065,11 @@
%D \showhyphens{dohyphenatedword}
%D \stoptyping
-\def\doshowhyphenatednextbox
- {\ctxcommand{showhyphenatedinlist(tex.box[\number\nextbox].list)}}
+\unexpanded\def\doshowhyphenatednextbox
+ {\clf_showhyphenatedinlist\nextbox}
-\unexpanded\def\showhyphens{\dowithnextboxcs\doshowhyphenatednextbox\hbox}
+\unexpanded\def\showhyphens
+ {\dowithnextboxcs\doshowhyphenatednextbox\hbox}
%D The following macros are seldom used but handy for tracing.
%D
@@ -1076,14 +1079,20 @@
%D \hyphenatedfile{tufte}
%D \stoptyping
-\def\dohyphenatednextbox
- {\ctxcommand{hyphenatedlist(tex.box[\number\nextbox].list)}%
+\unexpanded\def\dohyphenatednextbox
+ {\clf_hyphenatedlist\nextbox false\relax
\unhbox\nextbox}
\unexpanded\def\hyphenatedword {\dowithnextboxcs\dohyphenatednextbox\hbox}
\unexpanded\def\hyphenatedpar {\dowithnextboxcs\dohyphenatednextbox\hbox}
\unexpanded\def\hyphenatedfile#1{\dowithnextboxcs\dohyphenatednextbox\hbox{\readfile{#1}\donothing\donothing}}
+\unexpanded\def\dohyphenatednextboxcolor
+ {\clf_hyphenatedlist\nextbox true\relax
+ \unhbox\nextbox}
+
+\unexpanded\def\hyphenatedcoloredword{\dowithnextboxcs\dohyphenatednextboxcolor\hbox}
+
%D \macros
%D {processtokens}
%D
@@ -1363,7 +1372,12 @@
\begingroup
\setbox\scratchbox\hbox{\settrialtypesetting#2{\savecurrentattributes{pic}}}%
\setbox\scratchbox\hbox{\restorecurrentattributes{pic}#1}%
- \ctxcommand{applytochars(\number\scratchbox,"\strippedcsname#2",true)}%
+ \clf_applytobox
+ method {char}%
+ box \scratchbox
+ command {\checkedstrippedcsname#2}%
+ nested true%
+ \relax
\endgroup}
\unexpanded\def\processisolatedwords#1#2%
@@ -1371,34 +1385,88 @@
\begingroup
\setbox\scratchbox\hbox{\settrialtypesetting#2{\savecurrentattributes{pic}}}%
\setbox\scratchbox\hbox{\restorecurrentattributes{pic}#1}%
- \ctxcommand{applytowords(\number\scratchbox,"\strippedcsname#2",true)}%
+ \clf_applytobox
+ method {word}%
+ box \scratchbox
+ command {\checkedstrippedcsname#2}%
+ nested true%
+ \relax
\endgroup}
-\unexpanded\def\processwords#1%
- {\processisolatedwords{#1}\processword}
-
-\let\processword\relax
-
-\unexpanded\def\applytosplitstringchar#1#2{\dontleavehmode\ctxcommand{processsplit(\!!bs#2\!!es,"\strippedcsname#1","char")}}
-\unexpanded\def\applytosplitstringword#1#2{\dontleavehmode\ctxcommand{processsplit(\!!bs#2\!!es,"\strippedcsname#1","word")}}
-\unexpanded\def\applytosplitstringline#1#2{\dontleavehmode\ctxcommand{processsplit(\!!bs#2\!!es,"\strippedcsname#1","line")}}
-
-\unexpanded\def\applytosplitstringcharspaced#1#2{\dontleavehmode\ctxcommand{processsplit(\!!bs#2\!!es,"\strippedcsname#1","char",true)}}
-\unexpanded\def\applytosplitstringwordspaced#1#2{\dontleavehmode\ctxcommand{processsplit(\!!bs#2\!!es,"\strippedcsname#1","word",true)}}
-\unexpanded\def\applytosplitstringlinespaced#1#2{\dontleavehmode\ctxcommand{processsplit(\!!bs#2\!!es,"\strippedcsname#1","line",true)}}
-
%D A variant:
\unexpanded\def\applytocharacters#1%
{\dontleavehmode
- \dowithnextbox{\ctxcommand{applytochars(\number\nextbox,"\strippedcsname#1",true)}}%
+ \dowithnextbox{\clf_applytobox
+ method {char}%
+ box \nextbox
+ command {\checkedstrippedcsname#1}%
+ nested true%
+ \relax}%
\hbox}
\unexpanded\def\applytowords#1%
{\dontleavehmode
- \dowithnextbox{\ctxcommand{applytowords(\number\nextbox,"\strippedcsname#1",true)}}%
+ \dowithnextbox{\clf_applytobox
+ method {word}%
+ box \nextbox
+ command {\checkedstrippedcsname#1}%
+ nested true%
+ \relax}%
\hbox}
+%D The old call:
+
+\unexpanded\def\processwords#1%
+ {\processisolatedwords{#1}\processword}
+
+\let\processword\relax
+
+\unexpanded\def\applytosplitstringchar#1#2%
+ {\dontleavehmode\clf_processsplit
+ data {#2}%
+ command {\checkedstrippedcsname#1}%
+ method {char}%
+ \relax}
+
+\unexpanded\def\applytosplitstringword#1#2%
+ {\dontleavehmode\clf_processsplit
+ data {#2}%
+ command {\checkedstrippedcsname#1}%
+ method {word}%
+ \relax}
+
+\unexpanded\def\applytosplitstringline#1#2%
+ {\dontleavehmode\clf_processsplit
+ data {#2}%
+ command {\checkedstrippedcsname#1}%
+ method {line}%
+ \relax}
+
+\unexpanded\def\applytosplitstringcharspaced#1#2%
+ {\dontleavehmode\clf_processsplit
+ data {#2}%
+ command {\checkedstrippedcsname#1}%
+ method {char}%
+ spaced true%
+ \relax}
+
+\unexpanded\def\applytosplitstringwordspaced#1#2%
+ {\dontleavehmode\clf_processsplit
+ data {#2}%
+ command {\checkedstrippedcsname#1}%
+ method {word}%
+ spaced true%
+ \relax}
+
+\unexpanded\def\applytosplitstringlinespaced#1#2%
+ {\dontleavehmode\clf_processsplit
+ data {#2}%
+ command {\checkedstrippedcsname#1}%
+ method {line}%
+ spaced true%
+ \relax}
+
%D \macros
%D {sbox}
%D
@@ -1795,7 +1863,7 @@
\box\d_syst_boxes_separator
\fi
\egroup
- \ctxcommand{hboxtovbox(\number\scratchbox)}%
+ \clf_hboxtovbox\scratchbox
\box\scratchbox
\endgroup}
@@ -1849,7 +1917,7 @@
\unexpanded\def\stophboxestohbox
{\egroup
- \ctxcommand{vboxlisttohbox(\number\scratchbox,\number\nextbox,\number\dimexpr\hboxestohboxslack)}%
+ \clf_vboxlisttohbox\scratchbox\nextbox\dimexpr\hboxestohboxslack\relax
\dontleavehmode
\unhbox\nextbox
\removeunwantedspaces
@@ -2024,7 +2092,7 @@
{\bgroup
\def\syst_boxes_process_indeed{#1}% #1 can be redefined halfway
\setbox\processbox\emptybox
- \doifnextbgroupelse\syst_boxes_process_yes\syst_boxes_process_nop}
+ \doifelsenextbgroup\syst_boxes_process_yes\syst_boxes_process_nop}
\def\syst_boxes_process_yes
{\dowithnextboxcs\syst_boxes_process_content\hbox}
@@ -2032,7 +2100,7 @@
\def\syst_boxes_process_content
{\removeunwantedspaces
\syst_boxes_process_indeed % takes \nextbox makes \processbox
- \doifnextbgroupelse\syst_boxes_process_yes\syst_boxes_process_nop}
+ \doifelsenextbgroup\syst_boxes_process_yes\syst_boxes_process_nop}
\unexpanded\def\syst_boxes_process_nop
{\removeunwantedspaces
@@ -2489,13 +2557,15 @@
\copy\csname\??stackbox#1:#2\endcsname
\fi}}
-\unexpanded\def\doifboxelse#1#2#3#4%
+\unexpanded\def\doifelsebox#1#2#3#4%
{\ifcsname\??stackbox#1:#2\endcsname
\ifvoid\csname\??stackbox#1:#2\endcsname#4\else#3\fi
\else
#4%
\fi}
+\let\doifboxelse\doifelsebox
+
%D This one is cheaper (the above is no longer used that much):
\installcorenamespace {boxstack}
@@ -2525,9 +2595,6 @@
\unexpanded\def\globalpushbox{\syst_boxes_push\global}
\unexpanded\def\globalpopbox {\syst_boxes_pop \global}
-% \unexpanded\def\pushbox#1{\ctxcommand{pushbox(\number#1)}}
-% \unexpanded\def\popbox #1{\ctxcommand{popbox(\number#1)}}
-
%D \macros
%D {removedepth, obeydepth}
%D
@@ -2776,12 +2843,16 @@
% {\dowithnextbox{\edef#1{\syst_boxes_nodestostring}}\hbox}
%
% \def\syst_boxes_nodestostring
-% {\ctxcommand{boxtostring(\number\nextbox)}}
+% {\clf_boxtostring\nextbox}
\unexpanded\def\nodestostring#1#2% more tolerant for #2=\cs
{\begingroup
\setbox\nextbox\hbox{#2}%
- \normalexpanded{\endgroup\edef\noexpand#1{\ctxcommand{boxtostring(\number\nextbox)}}}}
+ \normalexpanded{\endgroup\edef\noexpand#1{\clf_boxtostring\nextbox}}}
+
+%D Even more dirty:
+
+\let\hyphenatedhbox\hbox
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/supp-ran.lua b/Master/texmf-dist/tex/context/base/supp-ran.lua
index 7997db8f648..1d34393fa64 100644
--- a/Master/texmf-dist/tex/context/base/supp-ran.lua
+++ b/Master/texmf-dist/tex/context/base/supp-ran.lua
@@ -10,12 +10,16 @@ if not modules then modules = { } end modules ['supp-ran'] = {
local report_system = logs.reporter("system","randomizer")
-local math = math
-local context, commands = context, commands
+local math = math
+local context = context
+local implement = interfaces.implement
-local random, randomseed, round, seed, last = math.random, math.randomseed, math.round, false, 1
-
-local maxcount = 2^30-1 -- 1073741823
+local random = math.random
+local randomseed = math.randomseed
+local round = math.round
+local seed = false
+local last = 1
+local maxcount = 2^30-1 -- 1073741823
local function setrandomseedi(n,comment)
if not n then
@@ -34,28 +38,23 @@ end
math.setrandomseedi = setrandomseedi
-function commands.getrandomcounta(min,max)
+local function getrandomnumber(min,max)
last = random(min,max)
- context(last)
-end
-
-function commands.getrandomcountb(min,max)
- last = random(min,max)/65536
- context(last)
+ return last
end
-function commands.setrandomseed(n)
+local function setrandomseed(n)
last = n
setrandomseedi(n)
end
-function commands.getrandomseed(n)
- context(last)
+local function getrandomseed()
+ return last
end
-- maybe stack
-function commands.freezerandomseed(n)
+local function freezerandomseed(n)
if seed == false or seed == nil then
seed = last
setrandomseedi(seed,"freeze",seed)
@@ -65,9 +64,18 @@ function commands.freezerandomseed(n)
end
end
-function commands.defrostrandomseed()
+local function defrostrandomseed()
if seed ~= false then
setrandomseedi(seed,"defrost",seed) -- was last (bug)
seed = false
end
end
+
+implement { name = "getrandomnumber", actions = { getrandomnumber, context }, arguments = { "integer", "integer" } }
+implement { name = "getrandomdimen", actions = { getrandomnumber, context }, arguments = { "dimen", "dimen" } }
+implement { name = "getrandomfloat", actions = { getrandomnumber, context }, arguments = { "number", "number" } }
+implement { name = "setrandomseed", actions = { setrandomseed }, arguments = { "integer" } }
+implement { name = "getrandomseed", actions = { getrandomseed, context } }
+implement { name = "freezerandomseed", actions = { freezerandomseed } }
+implement { name = "defrostrandomseed", actions = { defrostrandomseed } }
+
diff --git a/Master/texmf-dist/tex/context/base/supp-ran.mkiv b/Master/texmf-dist/tex/context/base/supp-ran.mkiv
index f5466a0e1fd..e491737170c 100644
--- a/Master/texmf-dist/tex/context/base/supp-ran.mkiv
+++ b/Master/texmf-dist/tex/context/base/supp-ran.mkiv
@@ -18,13 +18,15 @@
\registerctxluafile{supp-ran}{1.001}
-\unexpanded\def\getrandomcount #1#2#3{#1=\ctxcommand{getrandomcounta(\number#2,\number#3)}\relax}
-\unexpanded\def\getrandomdimen #1#2#3{#1=\ctxcommand{getrandomcounta(\number\dimexpr#2,\number\dimexpr#3)}\scaledpoint\relax}
-\unexpanded\def\getrandomnumber#1#2#3{\edef#1{\ctxcommand{getrandomcounta(\number#2,\number#3)}}}
-\unexpanded\def\getrandomfloat #1#2#3{\edef#1{\ctxcommand{getrandomcountb(\number\dimexpr#2\points,\number\dimexpr#3\points)}}}
-\unexpanded\def\setrandomseed #1{\ctxcommand{setrandomseed(\number#1)}}
-\unexpanded\def\getrandomseed #1{\edef#1{\ctxcommand{getrandomseed()}}}
-\unexpanded\def\freezerandomseed {\ctxcommand{freezerandomseed()}}
-\unexpanded\def\defrostrandomseed {\ctxcommand{defrostrandomseed()}}
+\unprotect
-\endinput
+\unexpanded\def\getrandomcount #1#2#3{#1=\clf_getrandomnumber#2 #3\relax}
+\unexpanded\def\getrandomdimen #1#2#3{#1=\clf_getrandomdimen#2 #3 \scaledpoint\relax}
+\unexpanded\def\getrandomnumber#1#2#3{\edef#1{\clf_getrandomnumber#2 #3}}
+\unexpanded\def\getrandomfloat #1#2#3{\edef#1{\clf_getrandomfloat#2 #3}}
+\unexpanded\def\setrandomseed #1{\clf_setrandomseed#1\relax}
+\unexpanded\def\getrandomseed #1{\edef#1{\clf_getrandomseed}}
+\unexpanded\def\freezerandomseed {\clf_freezerandomseed}
+\unexpanded\def\defrostrandomseed {\clf_defrostrandomseed}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/symb-imp-cc.mkiv b/Master/texmf-dist/tex/context/base/symb-imp-cc.mkiv
index 45ea977328e..e753d695f8c 100644
--- a/Master/texmf-dist/tex/context/base/symb-imp-cc.mkiv
+++ b/Master/texmf-dist/tex/context/base/symb-imp-cc.mkiv
@@ -11,8 +11,10 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+%D LS/HH: This font has changed over time so there might be diffences
+%D in rendering. The otf, ttf and type1 version can differ too.
-\doiffontpresentelse{ccicons.otf} { % redone ctan version
+\doifelsefontpresent{ccicons.otf} { % redone ctan version
\definefontfeature
[creativecommons]
[mode=base,
diff --git a/Master/texmf-dist/tex/context/base/symb-ini.lua b/Master/texmf-dist/tex/context/base/symb-ini.lua
index 9586338be12..6a4a1882529 100644
--- a/Master/texmf-dist/tex/context/base/symb-ini.lua
+++ b/Master/texmf-dist/tex/context/base/symb-ini.lua
@@ -6,20 +6,27 @@ if not modules then modules = { } end modules ['symb-ini'] = {
license = "see context related readme files"
}
-local context, commands = context, commands
+local context = context
+local variables = interfaces.variables
-local variables = interfaces.variables
+fonts = fonts or { } -- brrrr
-fonts = fonts or { } -- brrrr
+local symbols = fonts.symbols or { }
+fonts.symbols = symbols
-local symbols = fonts.symbols or { }
-fonts.symbols = symbols
+local listitem = utilities.parsers.listitem
+local uselibrary = resolvers.uselibrary
local report_symbols = logs.reporter ("fonts","symbols")
local status_symbols = logs.messenger("fonts","symbols")
-local patterns = { "symb-imp-%s.mkiv", "symb-imp-%s.tex", "symb-%s.mkiv", "symb-%s.tex" }
-local listitem = utilities.parsers.listitem
+local patterns = {
+ "symb-imp-%s.mkiv",
+ "symb-imp-%s.tex",
+ -- obsolete:
+ "symb-%s.mkiv",
+ "symb-%s.tex"
+}
local function action(name,foundname)
-- context.startnointerference()
@@ -37,7 +44,7 @@ end
function symbols.uselibrary(name)
if name ~= variables.reset then
for name in listitem(name) do
- commands.uselibrary {
+ uselibrary {
name = name,
patterns = patterns,
action = action,
@@ -48,4 +55,8 @@ function symbols.uselibrary(name)
end
end
-commands.usesymbols = symbols.uselibrary
+interfaces.implement {
+ name = "usesymbols",
+ actions = symbols.uselibrary,
+ arguments = "string",
+}
diff --git a/Master/texmf-dist/tex/context/base/symb-ini.mkiv b/Master/texmf-dist/tex/context/base/symb-ini.mkiv
index e957e68c1f5..40a0af6d690 100644
--- a/Master/texmf-dist/tex/context/base/symb-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/symb-ini.mkiv
@@ -74,9 +74,12 @@
\letvalue{\??symbolset}\empty
-\unexpanded\def\doifinsymbolsetelse#1#2{\ifcsname\??symbol#1:#2\endcsname\expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi}
+\unexpanded\def\doifelseinsymbolset#1#2{\ifcsname\??symbol#1:#2\endcsname\expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi}
\unexpanded\def\doifinsymbolset #1#2{\ifcsname\??symbol#1:#2\endcsname\expandafter\firstofoneargument \else\expandafter\gobbleoneargument \fi}
-\unexpanded\def\doifsymbolsetelse #1{\ifcsname\??symbolset#1\endcsname\expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi}
+\unexpanded\def\doifelsesymbolset #1{\ifcsname\??symbolset#1\endcsname\expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi}
+
+\let\doifinsymbolsetelse\doifelseinsymbolset
+\let\doifsymbolsetelse \doifelsesymbolset
\def\symbolset#1{\csname\??symbolset\ifcsname\??symbolset#1\endcsname#1\fi\endcsname} % no [#1], to be used in commalists etc
@@ -216,7 +219,7 @@
\def\symb_fetch_second#1%
{\doifinsymbolset\empty\currentsymbol{\settrue\c_symb_found}}
-\def\doifsymboldefinedelse#1%
+\unexpanded\def\doifelsesymboldefined#1%
{\begingroup
\edef\currentsymbol{#1}%
\let\symb_fetch\symb_fetch_first
@@ -233,6 +236,8 @@
\fi
\fi}
+\let\doifsymboldefinedelse\doifelsesymboldefined
+
%D \macros
%D {setupsymbolset,startsymbolset}
%D
@@ -300,7 +305,7 @@
%D
%D \showsetup{usesymbols}
-\unexpanded\def\usesymbols[#1]{\ctxcommand{usesymbols("#1")}}
+\unexpanded\def\usesymbols[#1]{\clf_usesymbols{#1}}
%D As longs as symbols are linked to levels or numbers, we can
%D also use the conversion mechanism, but in for instance the
diff --git a/Master/texmf-dist/tex/context/base/syst-aux.lua b/Master/texmf-dist/tex/context/base/syst-aux.lua
index de15428f966..a880bace3b0 100644
--- a/Master/texmf-dist/tex/context/base/syst-aux.lua
+++ b/Master/texmf-dist/tex/context/base/syst-aux.lua
@@ -11,42 +11,66 @@ if not modules then modules = { } end modules ['syst-aux'] = {
-- utfmatch(str,"(.?)(.*)$")
-- utf.sub(str,1,1)
-local commands, context = commands, context
-
-local settings_to_array = utilities.parsers.settings_to_array
-local format = string.format
+local tonumber = tonumber
local utfsub = utf.sub
-local P, S, C, Cc, Cs, Carg, lpegmatch, utf8char = lpeg.P, lpeg.S, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Carg, lpeg.match, lpeg.patterns.utf8char
-
+local P, S, R, C, Cc, Cs, Carg, lpegmatch = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Carg, lpeg.match
-local setvalue = context.setvalue
-
-local pattern = C(utf8char^-1) * C(P(1)^0)
+local context = context
+local implement = interfaces.implement
+local formatters = string.formatters
+local setcatcode = tex.setcatcode
+local utf8character = lpeg.patterns.utf8character
+local settings_to_array = utilities.parsers.settings_to_array
+local setmacro = interfaces.setmacro
+
+local pattern = C(utf8character^-1) * C(P(1)^0)
+
+implement {
+ name = "getfirstcharacter",
+ arguments = "string",
+ actions = function(str)
+ local first, rest = lpegmatch(pattern,str)
+ setmacro("firstcharacter",first)
+ setmacro("remainingcharacters",rest)
+ end
+}
-function commands.getfirstcharacter(str)
- local first, rest = lpegmatch(pattern,str)
- setvalue("firstcharacter",first)
- setvalue("remainingcharacters",rest)
-end
+implement {
+ name = "thefirstcharacter",
+ arguments = "string",
+ actions = function(str)
+ local first, rest = lpegmatch(pattern,str)
+ context(first)
+ end
+}
-function commands.thefirstcharacter(str)
- local first, rest = lpegmatch(pattern,str)
- context(first)
-end
-function commands.theremainingcharacters(str)
- local first, rest = lpegmatch(pattern,str)
- context(rest)
-end
+implement {
+ name = "theremainingcharacters",
+ arguments = "string",
+ actions = function(str)
+ local first, rest = lpegmatch(pattern,str)
+ context(rest)
+ end
+}
-local pattern = C(utf8char^-1)
+local pattern = C(utf8character^-1)
+local ctx_doifelse = commands.doifelse
-function commands.doiffirstcharelse(chr,str)
- commands.doifelse(lpegmatch(pattern,str) == chr)
-end
+implement {
+ name = "doifelsefirstchar",
+ arguments = { "string", "string" },
+ actions = function(str,chr)
+ ctx_doifelse(lpegmatch(pattern,str) == chr)
+ end
+}
-function commands.getsubstring(str,first,last)
- context(utfsub(str,tonumber(first),tonumber(last)))
-end
+implement {
+ name = "getsubstring",
+ arguments = { "string", "string", "string" },
+ actions = function(str,first,last)
+ context(utfsub(str,tonumber(first),tonumber(last)))
+ end
+}
-- function commands.addtocommalist(list,item)
-- if list == "" then
@@ -78,21 +102,40 @@ end
-- end
-- end
-local pattern = (C((1-P("%"))^1) * Carg(1)) /function(n,d) return format("%.0fsp",d * tonumber(n)/100) end * P("%") * P(-1) -- .0 ?
+local pattern = (C((1-P("%"))^1) * Carg(1)) / function(n,d)
+ return formatters["%.0fsp"](d * tonumber(n)/100) end * P("%") * P(-1) -- .0 ?
--- commands.percentageof("10%",65536*10)
+-- percentageof("10%",65536*10)
-function commands.percentageof(str,dim)
- context(lpegmatch(pattern,str,1,dim) or str)
-end
+implement {
+ name = "percentageof",
+ arguments = { "string", "dimen" },
+ actions = function(str,dim)
+ context(lpegmatch(pattern,str,1,dim) or str)
+ end
+}
-- \gdef\setpercentdimen#1#2%
-- {#1=\ctxcommand{percentageof("#2",\number#1)}\relax}
-local spaces = P(" ")^0/""
+local spaces = P(" ")^0 / ""
+local nohash = 1 - P("#")
+local digit = R("09")
+local double = P("##") / "#"
+local single = P("#")
+local sentinel = spaces * (nohash^1 / "\\%0")
+local sargument = (single * digit)^1
+local dargument = (double * digit)^1
-local pattern = Cs(
- ( P("global") / "\\global" )^0
+local usespaces = nil
+local texpreamble = nil
+
+local pattern = Cs( -- ^-1
+ ( P("spaces") / function() usespaces = true return "" end )^0
+ * spaces
+ * ( P("nospaces") / function() usespaces = false return "" end )^0
+ * spaces
+ * ( P("global") / "\\global" )^0
* spaces
* ( P("unexpanded") / "\\unexpanded" )^0
* spaces
@@ -102,15 +145,85 @@ local pattern = Cs(
* spaces
* ( P((1-S(" #"))^1) / "def\\csname %0\\endcsname" )
* spaces
- * Cs( (P("##")/"#" + P(1))^0 )
+ * (
+ -- (double * digit)^1 * sentinel^-1 * double^-1
+ -- + (single * digit)^1 * sentinel^-1 * single^-1
+ ( P("[") * dargument * P("]") + dargument)^1 * sentinel^-1 * double^-1
+ + ( P("[") * sargument * P("]") + sargument)^1 * sentinel^-1 * single^-1
+ + sentinel^-1 * (double+single)^-1
+ )
)
-function commands.thetexdefinition(str)
- context(lpegmatch(pattern,str))
+local ctx_dostarttexdefinition = context.dostarttexdefinition
+
+local function texdefinition_one(str)
+ usespaces = nil
+ texpreamble = lpegmatch(pattern,str)
+ if usespaces == true then
+ setcatcode(32,10) -- space
+ setcatcode(13, 5) -- endofline
+ elseif usespaces == false then
+ setcatcode(32, 9) -- ignore
+ setcatcode(13, 9) -- ignore
+ else
+ -- this is default
+ -- setcatcode(32,10) -- space
+ -- setcatcode(13, 9) -- ignore
+ end
+ ctx_dostarttexdefinition()
+end
+
+local function texdefinition_two()
+ context(texpreamble)
end
-local upper, lower, strip = utf.upper, utf.lower, string.strip
+implement { name = "texdefinition_one", actions = texdefinition_one, scope = "private", arguments = "string" }
+implement { name = "texdefinition_two", actions = texdefinition_two, scope = "private" }
+
+implement { name = "upper", arguments = "string", actions = { utf.upper, context } }
+implement { name = "lower", arguments = "string", actions = { utf.lower, context } }
+implement { name = "strip", arguments = "string", actions = { string.strip, context } } -- or utf.strip
+
+-- implement {
+-- name = "converteddimen",
+-- arguments = { "dimen", "string" },
+-- actions = function(dimen,unit)
+-- context(todimen(dimen,unit or "pt","%0.5f")) -- no unit appended (%F)
+-- end
+-- }
+
+-- where, not really the best spot for this:
-function commands.upper(s) context(upper(s)) end
-function commands.lower(s) context(lower(s)) end
-function commands.strip(s) context(strip(s)) end
+implement {
+ name = "immediatemessage",
+ arguments = { "'message'", "string" },
+ actions = logs.status
+}
+
+implement {
+ name = "resettimer",
+ actions = function()
+ statistics.resettiming("whatever")
+ statistics.starttiming("whatever")
+ end
+}
+
+implement {
+ name = "elapsedtime",
+ actions = function()
+ statistics.stoptiming("whatever")
+ context(statistics.elapsedtime("whatever"))
+ end
+}
+
+local accuracy = table.setmetatableindex(function(t,k)
+ local v = formatters["%0." ..k .. "f"]
+ t[k] = v
+ return v
+end)
+
+implement {
+ name = "rounded",
+ arguments = "integer",
+ actions = function(n,m) context(accuracy[n](m)) end
+}
diff --git a/Master/texmf-dist/tex/context/base/syst-aux.mkiv b/Master/texmf-dist/tex/context/base/syst-aux.mkiv
index 308e4b6fca5..308ed5a3ba4 100644
--- a/Master/texmf-dist/tex/context/base/syst-aux.mkiv
+++ b/Master/texmf-dist/tex/context/base/syst-aux.mkiv
@@ -11,13 +11,17 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-%D There are some references to \LUA\ variants here but these concern
-%D (often old) experiments, moved from local test modules to here,
-%D cleaned up, but not really used. After all it's not that urgent
-%D and replacing helpers is a delicate process. Don't depend on it.
+%D There are some references to \LUA\ variants here but these concern (often old)
+%D experiments, moved from local test modules to here, cleaned up, but not really
+%D used. After all it's not that urgent and replacing helpers is a delicate process.
+%D Don't depend on it.
\registerctxluafile{syst-aux}{1.001}
+% A dedicated primitive \ifvoidmacro\cs == \ifx\cs\empty is some 10% faster but
+% probably not that noticeable in practice. An \ifvoidtoks might make sense but we
+% don't test that often for it (and it's more work to implement in the engine).
+
%D This is a stripped down combination of:
%D
%D \startitemize
@@ -26,20 +30,18 @@
%D \item \type {syst-new.tex}
%D \stopitemize
%D
-%D We keep them around (for \MKII) so you can find comments,
-%D experiences, intermediate versions and cleaner variants
-%D there (and also non-\ETEX\ variants).
+%D We keep them around (for \MKII) so you can find comments, experiences,
+%D intermediate versions and cleaner variants there (and also non-\ETEX\ variants).
%D
-%D Contrary to the older files, we now assume that this one
-%D is used in \CONTEXT\ and therefore we might also assume that
-%D some basic functionality is available.
+%D Contrary to the older files, we now assume that this one is used in \CONTEXT\ and
+%D therefore we might also assume that some basic functionality is available.
%D
-%D The original files contain previous implementations and notes about
-%D performance. This file will be stripped down in due time.
-
-%D Some of the macros here were only used in the bibliography module. They
-%D have been be moved to a separate syst module since the bib module is no
-%D longer using them. Some more will go away.
+%D The original files contain previous implementations and notes about performance.
+%D This file will be stripped down in due time.
+%D
+%D Some of the macros here were only used in the bibliography module. They have been
+%D be moved to a separate syst module since the bib module is no longer using them.
+%D Some more will go away.
\unprotect
@@ -72,13 +74,20 @@
% %def\expunded#1{\normalexpanded\expandafter{#1}}
% \def\expunded#1{\expandafter\empty#1} % used within an edef anyway
-
%D As we don't have namespace definers yet, we use a special one:
-\newcount\c_syst_helpers_n_of_namespaces \c_syst_helpers_n_of_namespaces\pluseight % 1-8 reserved for catcodes
+\ifdefined\c_syst_helpers_n_of_namespaces
+
+ % lets plug in a better error message
+
+\else
+
+ \newcount\c_syst_helpers_n_of_namespaces \c_syst_helpers_n_of_namespaces\pluseight % 1-8 reserved for catcodes
-\def\v_interfaces_prefix_template_system{\number \c_syst_helpers_n_of_namespaces>>}
-%def\v_interfaces_prefix_template_system{\characters\c_syst_helpers_n_of_namespaces>>} % no \characters yet
+ \def\v_interfaces_prefix_template_system{\number \c_syst_helpers_n_of_namespaces>>}
+ %def\v_interfaces_prefix_template_system{\characters\c_syst_helpers_n_of_namespaces>>} % no \characters yet
+
+\fi
\unexpanded\def\installsystemnamespace#1% maybe move this to syst-ini
{\ifcsname ??#1\endcsname
@@ -278,12 +287,14 @@
%D {\localnext} because we don't want clashes with \type
%D {\next}.
-\unexpanded\def\doifnextcharelse#1#2#3% #1 should not be {} !
+\unexpanded\def\doifelsenextchar#1#2#3% #1 should not be {} !
{\let\charactertoken=#1% = needed here
\def\m_syst_action_yes{#2}%
\def\m_syst_action_nop{#3}%
\futurelet\nexttoken\syst_helpers_inspect_next_character}
+\let\doifnextcharelse\doifelsenextchar
+
\def\syst_helpers_inspect_next_character
{\ifx\nexttoken\blankspace
\expandafter\syst_helpers_reinspect_next_character
@@ -318,18 +329,21 @@
\let\syst_helpers_next_optional_character_token=[
-\unexpanded\def\doifnextoptionalelse#1#2%
+\unexpanded\def\doifelsenextoptional#1#2%
{\def\m_syst_action_yes{#1}%
\def\m_syst_action_nop{#2}%
\let\if_next_blank_space_token\iffalse
\futurelet\nexttoken\syst_helpers_inspect_next_optional_character}
-\unexpanded\def\doifnextoptionalcselse#1#2% \cs \cs (upto 10% faster)
+\unexpanded\def\doifelsenextoptionalcs#1#2% \cs \cs (upto 10% faster)
{\let\m_syst_action_yes#1%
\let\m_syst_action_nop#2%
\let\if_next_blank_space_token\iffalse
\futurelet\nexttoken\syst_helpers_inspect_next_optional_character}
+\let\doifnextoptionalelse \doifelsenextoptional
+\let\doifnextoptionalcselse\doifelsenextoptionalcs
+
\def\syst_helpers_inspect_next_optional_character
{\ifx\nexttoken\blankspace
\expandafter\syst_helpers_reinspect_next_optional_character
@@ -346,18 +360,21 @@
\let\syst_helpers_next_bgroup_character_token\bgroup
-\unexpanded\def\doifnextbgroupelse#1#2%
+\unexpanded\def\doifelsenextbgroup#1#2%
{\def\m_syst_action_yes{#1}%
\def\m_syst_action_nop{#2}%
\let\if_next_blank_space_token\iffalse
\futurelet\nexttoken\syst_helpers_inspect_next_bgroup_character}
-\unexpanded\def\doifnextbgroupcselse#1#2%
+\unexpanded\def\doifelsenextbgroupcs#1#2%
{\let\m_syst_action_yes#1%
\let\m_syst_action_nop#2%
\let\if_next_blank_space_token\iffalse
\futurelet\nexttoken\syst_helpers_inspect_next_bgroup_character}
+\let\doifnextbgroupelse \doifelsenextbgroup
+\let\doifnextbgroupcselse\doifelsenextbgroupcs
+
\def\syst_helpers_inspect_next_bgroup_character
{\ifx\nexttoken\blankspace
\expandafter\syst_helpers_reinspect_next_bgroup_character
@@ -374,12 +391,14 @@
\let\syst_helpers_next_parenthesis_character_token(
-\unexpanded\def\doifnextparenthesiselse#1#2%
+\unexpanded\def\doifelsenextparenthesis#1#2%
{\def\m_syst_action_yes{#1}%
\def\m_syst_action_nop{#2}%
\let\if_next_blank_space_token\iffalse
\futurelet\nexttoken\syst_helpers_inspect_next_parenthesis_character}
+\let\doifnextparenthesiselse\doifelsenextparenthesis
+
\def\syst_helpers_inspect_next_parenthesis_character
{\ifx\nexttoken\blankspace
\expandafter\syst_helpers_reinspect_next_parenthesis_character
@@ -396,16 +415,19 @@
%D The next one is handy in predictable situations:
-\unexpanded\def\doiffastoptionalcheckelse#1#2%
+\unexpanded\def\doifelsefastoptionalcheck#1#2%
{\def\m_syst_action_yes{#1}%
\def\m_syst_action_nop{#2}%
\futurelet\nexttoken\syst_helpers_do_if_fast_optional_check_else}
-\unexpanded\def\doiffastoptionalcheckcselse#1#2% \cs \cs
+\unexpanded\def\doifelsefastoptionalcheckcs#1#2% \cs \cs
{\let\m_syst_action_yes#1%
\let\m_syst_action_nop#2%
\futurelet\nexttoken\syst_helpers_do_if_fast_optional_check_else}
+\let\doiffastoptionalcheckelse \doifelsefastoptionalcheck
+\let\doiffastoptionalcheckcselse\doifelsefastoptionalcheckcs
+
\def\syst_helpers_do_if_fast_optional_check_else
{\ifx\nexttoken\syst_helpers_next_optional_character_token
\expandafter\m_syst_action_yes
@@ -574,12 +596,12 @@
\suppressifcsnameerror\plusone
-\def\doifundefinedelse#1%
+\def\doifelseundefined#1%
{\ifcsname#1\endcsname
\expandafter\secondoftwoarguments\else\expandafter\firstoftwoarguments
\fi}
-\def\doifdefinedelse#1%
+\def\doifelsedefined#1%
{\ifcsname#1\endcsname
\expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments
\fi}
@@ -594,6 +616,9 @@
\expandafter\firstofoneargument\else\expandafter\gobbleoneargument
\fi}
+\let\doifundefinedelse\doifelseundefined
+\let\doifdefinedelse \doifelsedefined
+
%D \macros
%D {letbeundefined}
%D
@@ -617,7 +642,7 @@
%D behavior in text and math mode, which was due to this grouping subtilities. We
%D therefore decided to use \type{\begingroup} instead of \type{\bgroup}.
-\unexpanded\def\doifalldefinedelse#1%
+\unexpanded\def\doifelsealldefined#1%
{\begingroup
\donetrue % we could use a reserved one and avoid the group
\processcommalist[#1]\syst_helpers_do_if_all_defined_else
@@ -627,6 +652,8 @@
\endgroup\expandafter\secondoftwoarguments
\fi}
+\let\doifalldefinedelse\doifelsealldefined
+
\def\syst_helpers_do_if_all_defined_else#1%
{\ifcsname#1\endcsname\else
\donefalse
@@ -690,7 +717,7 @@
%D
%D This time, the string is not expanded.
-\unexpanded\def\doifemptyelse#1%
+\unexpanded\def\doifelseempty#1%
{\def\m_syst_string_one{#1}%
\ifx\m_syst_string_one\empty
\expandafter\firstoftwoarguments
@@ -698,6 +725,8 @@
\expandafter\secondoftwoarguments
\fi}
+\let\doifemptyelse\doifelseempty
+
\unexpanded\def\doifempty#1%
{\def\m_syst_string_one{#1}%
\ifx\m_syst_string_one\empty
@@ -763,7 +792,7 @@
\def\syst_helpers_re_do_if_in_set {\expandafter\syst_helpers_do_check_if_item_in_set \m_syst_string_two,],\relax}
\def\syst_helpers_re_do_if_not_in_set {\expandafter\syst_helpers_do_check_if_item_not_in_set \m_syst_string_two,],\relax}
-\unexpanded\def\doifinsetelse#1% make this two step too
+\unexpanded\def\doifelseinset#1% make this two step too
{\edef\m_syst_string_one{#1}%
\ifx\m_syst_string_one\empty
\expandafter\thirdofthreearguments
@@ -771,6 +800,8 @@
\expandafter\syst_helpers_do_if_in_set_else
\fi}
+\let\doifinsetelse\doifelseinset
+
\def\syst_helpers_do_if_in_set_else#1%
{\edef\m_syst_string_two{#1}%
\ifx\m_syst_string_two\empty
@@ -961,10 +992,12 @@
\fi\fi
#1#2}
-\unexpanded\def\doifcommonelse{\syst_helpers_do_do_if_common_else\firstoftwoarguments\secondoftwoarguments}
+\unexpanded\def\doifelsecommon{\syst_helpers_do_do_if_common_else\firstoftwoarguments\secondoftwoarguments}
\unexpanded\def\doifcommon {\syst_helpers_do_do_if_common_else\firstofoneargument \gobbleoneargument }
\unexpanded\def\doifnotcommon {\syst_helpers_do_do_if_common_else\gobbleoneargument \firstofoneargument }
+\let\doifcommonelse\doifelsecommon
+
%D \macros
%D {processcommalist,processcommacommand,quitcommalist,
%D processcommalistwithparameters}
@@ -1306,10 +1339,12 @@
\let\firstcharacter \empty
\let\remainingcharacters\empty
-\unexpanded\def\getfirstcharacter #1{\ctxcommand{getfirstcharacter(\!!bs#1\!!es)}}
-\unexpanded\def\doiffirstcharelse #1#2{\ctxcommand{doiffirstcharelse(\!!bs#1\!!es,\!!bs#2\!!es)}} % chr str
-\unexpanded\def\thefirstcharacter #1{\ctxcommand{thefirstcharacter(\!!bs#1\!!es)}}
-\unexpanded\def\theremainingcharacters#1{\ctxcommand{theremainingcharacters(\!!bs#1\!!es)}}
+\unexpanded\def\getfirstcharacter #1{\clf_getfirstcharacter{#1}}
+\unexpanded\def\doifelsefirstchar #1#2{\clf_doifelsefirstchar{#1}{#2}}
+\unexpanded\def\thefirstcharacter #1{\clf_thefirstcharacter{#1}}
+\unexpanded\def\theremainingcharacters#1{\clf_theremainingcharacters{#1}}
+
+\let\doiffirstcharelse\doifelsefirstchar
%D \macros
%D {doifinstringelse, doifincsnameelse}
@@ -1323,7 +1358,7 @@
\let\m_syst_sub_string\empty
-\unexpanded\def\doifinstringelse#1%
+\unexpanded\def\doifelseinstring#1%
{\edef\m_syst_sub_string{#1}% expand #1 here
\ifx\m_syst_sub_string\empty
\expandafter\thirdofthreearguments
@@ -1331,6 +1366,8 @@
\expandafter\syst_helpers_do_if_in_string_else_indeed
\fi}
+\let\doifinstringelse\doifelseinstring
+
\unexpanded\def\syst_helpers_do_if_in_string_else_indeed#1%
{\syst_helpers_do_if_in_string_else\m_syst_sub_string{#1}%
\expandafter\firstoftwoarguments
@@ -1393,13 +1430,15 @@
{\unless\if##2@}%
\expandafter\syst_helpers_do_do_if_in_csname_else#2#1@@\_e_o_s_}
-\unexpanded\def\doifincsnameelse#1#2%
+\unexpanded\def\doifelseincsname#1#2%
{\normalexpanded{\syst_helpers_do_if_in_csname_else{#1}}{#2}%
\expandafter\firstoftwoarguments
\else
\expandafter\secondoftwoarguments
\fi}
+\let\doifincsnameelse\doifelseincsname
+
%D \macros
%D {doifnumberelse,doifnumber,doifnotnumber}
%D
@@ -1415,13 +1454,15 @@
%D The macro accepts \type {123}, \type {abc}, \type {{}}, \type {\getal} and
%D \type {\the\count...}. This macro is a rather dirty one.
-\def\doifnumberelse#1% does not accept counters (fully expandable)
+\def\doifelsenumber#1% does not accept counters (fully expandable)
{\ifcase0\ifcase1#1\or\or\or\or\or\or\or\or\or\else1\fi\space
\expandafter\secondoftwoarguments
\else
\expandafter\firstoftwoarguments
\fi}
+\let\doifnumberelse\doifelsenumber
+
\def\doifnumber#1%
{\ifcase0\ifcase1#1\or\or\or\or\or\or\or\or\or\else1\fi\space
\expandafter\firstofoneargument
@@ -1446,10 +1487,10 @@
%D \stoptyping
\def\percentdimen#1#2% dimen percentage (with %)
- {\dimexpr\ctxcommand{percentageof("#2",\number#1)}\relax}
+ {\dimexpr\clf_percentageof{#2}\dimexpr#1\relax}
\unexpanded\def\setpercentdimen#1#2% dimen percentage (with %)
- {#1=\ctxcommand{percentageof("#2",\number#1)}\relax}
+ {#1=\clf_percentageof{#2}\dimexpr#1\relax}
%D \macros
%D {makerawcommalist,
@@ -1469,7 +1510,7 @@
%D
%D \starttyping
%D \makerawcommalist[string,string,...]\stringlist
-%D \rawdoifinsetelse{string}{string,...}{...}{...}
+%D \rawdoifelseinset{string}{string,...}{...}{...}
%D \rawprocesscommalist[string,string,...]\commando
%D \rawprocessaction[x][a=>\a,b=>\b,c=>\c]
%D \stoptyping
@@ -1504,12 +1545,12 @@
\unexpanded\def\rawprocesscommacommand[#1]% not really needed
{\normalexpanded{\rawprocesscommalist[#1]}}
-% \def\rawdoifinsetelse#1#2{\doifinstringelse{,#1,}{,#2,}}
+% \def\rawdoifelseinset#1#2{\doifinstringelse{,#1,}{,#2,}}
% \def\rawdoifinset #1#2{\doifinstring {,#1,}{,#2,}}
\def\m_syst_two_commas{,,}
-\unexpanded\def\rawdoifinsetelse#1%
+\unexpanded\def\rawdoifelseinset#1%
{\edef\m_syst_sub_string{,#1,}% expand #1 here
\ifx\m_syst_sub_string\m_syst_two_commas
\expandafter\thirdofthreearguments
@@ -1517,6 +1558,8 @@
\expandafter\syst_helpers_raw_do_if_in_set_else
\fi}
+\let\rawdoifinsetelse\rawdoifinsetelse
+
\unexpanded\def\syst_helpers_raw_do_if_in_set_else#1%
{\syst_helpers_do_if_in_string_else\m_syst_sub_string{,#1,}%
\expandafter\firstoftwoarguments
@@ -2182,7 +2225,7 @@
\unexpanded\def\dosingleempty#1%
{\syst_helpers_argument_reset
- \doifnextoptionalelse
+ \doifelsenextoptional
{\firstargumenttrue#1}%
{\syst_helpers_single_empty_one_nop#1}}
@@ -2194,13 +2237,13 @@
\unexpanded\def\dodoubleempty#1%
{\syst_helpers_argument_reset
- \doifnextoptionalelse
+ \doifelsenextoptional
{\syst_helpers_double_empty_one_yes#1}%
{\syst_helpers_double_empty_one_nop#1}}
\def\syst_helpers_double_empty_one_yes#1[#2]%
{\firstargumenttrue
- \doifnextoptionalelse
+ \doifelsenextoptional
{\secondargumenttrue#1[{#2}]}%
{\syst_helpers_double_empty_two_nop#1{#2}}}
@@ -2224,19 +2267,19 @@
\unexpanded\def\dotripleempty#1%
{\syst_helpers_argument_reset
- \doifnextoptionalelse
+ \doifelsenextoptional
{\syst_helpers_triple_empty_one_yes#1}%
{\syst_helpers_triple_empty_one_nop#1}}
\def\syst_helpers_triple_empty_one_yes#1[#2]%
{\firstargumenttrue
- \doifnextoptionalelse
+ \doifelsenextoptional
{\syst_helpers_triple_empty_two_yes#1{#2}}%
{\syst_helpers_triple_empty_two_nop#1{#2}}}
\def\syst_helpers_triple_empty_two_yes#1#2[#3]%
{\secondargumenttrue
- \doifnextoptionalelse
+ \doifelsenextoptional
{\thirdargumenttrue#1[{#2}][{#3}]}%
{\syst_helpers_triple_empty_three_nop#1{#2}{#3}}}
@@ -2272,25 +2315,25 @@
\unexpanded\def\doquadrupleempty#1%
{\syst_helpers_argument_reset
- \doifnextoptionalelse
+ \doifelsenextoptional
{\syst_helpers_quadruple_empty_one_yes#1}%
{\syst_helpers_quadruple_empty_one_nop#1}}
\def\syst_helpers_quadruple_empty_one_yes#1[#2]%
{\firstargumenttrue
- \doifnextoptionalelse
+ \doifelsenextoptional
{\syst_helpers_quadruple_empty_two_yes#1{#2}}%
{\syst_helpers_quadruple_empty_two_nop#1{#2}}}
\def\syst_helpers_quadruple_empty_two_yes#1#2[#3]%
{\secondargumenttrue
- \doifnextoptionalelse
+ \doifelsenextoptional
{\syst_helpers_quadruple_empty_three_yes#1{#2}{#3}}%
{\syst_helpers_quadruple_empty_three_nop#1{#2}{#3}}}
\def\syst_helpers_quadruple_empty_three_yes#1#2#3[#4]%
{\thirdargumenttrue
- \doifnextoptionalelse
+ \doifelsenextoptional
{\fourthargumenttrue#1[{#2}][{#3}][{#4}]}%
{\syst_helpers_quadruple_empty_four_nop#1{#2}{#3}{#4}}}
@@ -2339,31 +2382,31 @@
\unexpanded\def\doquintupleempty#1%
{\syst_helpers_argument_reset
- \doifnextoptionalelse
+ \doifelsenextoptional
{\syst_helpers_quintuple_empty_one_yes#1}%
{\syst_helpers_quintuple_empty_one_nop#1}}
\def\syst_helpers_quintuple_empty_one_yes#1[#2]%
{\firstargumenttrue
- \doifnextoptionalelse
+ \doifelsenextoptional
{\syst_helpers_quintuple_empty_two_yes#1{#2}}%
{\syst_helpers_quintuple_empty_two_nop#1{#2}}}
\def\syst_helpers_quintuple_empty_two_yes#1#2[#3]%
{\secondargumenttrue
- \doifnextoptionalelse
+ \doifelsenextoptional
{\syst_helpers_quintuple_empty_three_yes#1{#2}{#3}}%
{\syst_helpers_quintuple_empty_three_nop#1{#2}{#3}}}
\def\syst_helpers_quintuple_empty_three_yes#1#2#3[#4]%
{\thirdargumenttrue
- \doifnextoptionalelse
+ \doifelsenextoptional
{\syst_helpers_quintuple_empty_four_yes#1{#2}{#3}{#4}}%
{\syst_helpers_quintuple_empty_four_nop#1{#2}{#3}{#4}}}
\def\syst_helpers_quintuple_empty_four_yes#1#2#3#4[#5]%
{\fourthargumenttrue
- \doifnextoptionalelse
+ \doifelsenextoptional
{\fifthargumenttrue#1[{#2}][{#3}][{#4}][{#5}]}%
{\syst_helpers_quintuple_empty_five_nop#1{#2}{#3}{#4}{#5}}}
@@ -2426,37 +2469,37 @@
\unexpanded\def\dosixtupleempty#1%
{\syst_helpers_argument_reset
- \doifnextoptionalelse
+ \doifelsenextoptional
{\syst_helpers_sixtuple_empty_one_yes#1}
{\syst_helpers_sixtuple_empty_one_nop#1}}
\def\syst_helpers_sixtuple_empty_one_yes#1[#2]%
{\firstargumenttrue
- \doifnextoptionalelse
+ \doifelsenextoptional
{\syst_helpers_sixtuple_empty_two_yes#1{#2}}%
{\syst_helpers_sixtuple_empty_two_nop#1{#2}}}
\def\syst_helpers_sixtuple_empty_two_yes#1#2[#3]%
{\secondargumenttrue
- \doifnextoptionalelse
+ \doifelsenextoptional
{\syst_helpers_sixtuple_empty_three_yes#1{#2}{#3}}%
{\syst_helpers_sixtuple_empty_three_nop#1{#2}{#3}}}
\def\syst_helpers_sixtuple_empty_three_yes#1#2#3[#4]%
{\thirdargumenttrue
- \doifnextoptionalelse
+ \doifelsenextoptional
{\syst_helpers_sixtuple_empty_four_yes#1{#2}{#3}{#4}}%
{\syst_helpers_sixtuple_empty_four_nop#1{#2}{#3}{#4}}}
\def\syst_helpers_sixtuple_empty_four_yes#1#2#3#4[#5]%
{\fourthargumenttrue
- \doifnextoptionalelse
+ \doifelsenextoptional
{\syst_helpers_sixtuple_empty_five_yes#1{#2}{#3}{#4}{#5}}%
{\syst_helpers_sixtuple_empty_five_nop#1{#2}{#3}{#4}{#5}}}
\def\syst_helpers_sixtuple_empty_five_yes#1#2#3#4#5[#6]%
{\fifthargumenttrue
- \doifnextoptionalelse
+ \doifelsenextoptional
{\sixthargumenttrue#1[{#2}][{#3}][{#4}][{#5}][{#6}]}%
{\syst_helpers_sixtuple_empty_six_nop#1{#2}{#3}{#4}{#5}{#6}}}
@@ -2534,43 +2577,43 @@
\unexpanded\def\doseventupleempty#1%
{\syst_helpers_argument_reset
- \doifnextoptionalelse
+ \doifelsenextoptional
{\syst_helpers_seventuple_empty_one_yes#1}%
{\syst_helpers_seventuple_empty_one_nop#1}}
\def\syst_helpers_seventuple_empty_one_yes#1[#2]%
{\firstargumenttrue
- \doifnextoptionalelse
+ \doifelsenextoptional
{\syst_helpers_seventuple_empty_two_yes#1{#2}}%
{\syst_helpers_seventuple_empty_two_nop#1{#2}}}
\def\syst_helpers_seventuple_empty_two_yes#1#2[#3]%
{\secondargumenttrue
- \doifnextoptionalelse
+ \doifelsenextoptional
{\syst_helpers_seventuple_empty_three_yes#1{#2}{#3}}%
{\syst_helpers_seventuple_empty_three_nop#1{#2}{#3}}}
\def\syst_helpers_seventuple_empty_three_yes#1#2#3[#4]%
{\thirdargumenttrue
- \doifnextoptionalelse
+ \doifelsenextoptional
{\syst_helpers_seventuple_empty_four_yes#1{#2}{#3}{#4}}%
{\syst_helpers_seventuple_empty_four_nop#1{#2}{#3}{#4}}}
\def\syst_helpers_seventuple_empty_four_yes#1#2#3#4[#5]%
{\fourthargumenttrue
- \doifnextoptionalelse
+ \doifelsenextoptional
{\syst_helpers_seventuple_empty_five_yes#1{#2}{#3}{#4}{#5}}%
{\syst_helpers_seventuple_empty_five_nop#1{#2}{#3}{#4}{#5}}}
\def\syst_helpers_seventuple_empty_five_yes#1#2#3#4#5[#6]%
{\fifthargumenttrue
- \doifnextoptionalelse
+ \doifelsenextoptional
{\syst_helpers_seventuple_empty_six_yes#1{#2}{#3}{#4}{#5}{#6}}%
{\syst_helpers_seventuple_empty_six_nop#1{#2}{#3}{#4}{#5}{#6}}}
\def\syst_helpers_seventuple_empty_six_yes#1#2#3#4#5#6[#7]%
{\sixthargumenttrue
- \doifnextoptionalelse
+ \doifelsenextoptional
{\seventhargumenttrue#1[{#2}][{#3}][{#4}][{#5}][{#6}][{#7}]}%
{\syst_helpers_seventuple_empty_seven_nop#1{#2}{#3}{#4}{#5}{#6}{#7}}}
@@ -2726,13 +2769,13 @@
\unexpanded\def\complexorsimple#1%
{% \relax % prevents lookahead, brrr
- \doifnextoptionalelse
+ \doifelsenextoptional
{\firstargumenttrue \csname\s!complex\strippedcsname#1\endcsname}
{\firstargumentfalse\csname\s!simple \strippedcsname#1\endcsname}}
\unexpanded\def\complexorsimpleempty#1%
{% \relax % prevents lookahead, brrr
- \doifnextoptionalelse
+ \doifelsenextoptional
{\firstargumenttrue \csname\s!complex\strippedcsname#1\endcsname}
{\firstargumentfalse\csname\s!complex\strippedcsname#1\endcsname[]}}
@@ -2744,10 +2787,10 @@
%D in protection.
\unexpanded\def\syst_helpers_complex_or_simple#1#2%
- {\doifnextoptionalelse{\firstargumenttrue#1}{\firstargumentfalse#2}}
+ {\doifelsenextoptional{\firstargumenttrue#1}{\firstargumentfalse#2}}
\unexpanded\def\syst_helpers_complex_or_simple_empty#1%
- {\doifnextoptionalelse{\firstargumenttrue#1}{\firstargumentfalse#1[]}}
+ {\doifelsenextoptional{\firstargumenttrue#1}{\firstargumentfalse#1[]}}
\unexpanded\def\definecomplexorsimple#1%
{\unexpanded\edef#1{\syst_helpers_complex_or_simple
@@ -2948,7 +2991,14 @@
\def\fifthofsixarguments #1#2#3#4#5#6{#5}
\def\sixthofsixarguments #1#2#3#4#5#6{#6}
-\unexpanded\def\firstofoneunexpanded#1{#1}
+\unexpanded\def\firstofoneunexpanded #1{#1}
+
+\unexpanded\def\firstoftwounexpanded #1#2{#1}
+\unexpanded\def\secondoftwounexpanded #1#2{#2}
+
+\unexpanded\def\firstofthreeunexpanded #1#2#3{#1}
+\unexpanded\def\secondofthreeunexpanded#1#2#3{#2}
+\unexpanded\def\thirdofthreeunexpanded #1#2#3{#3}
%D \macros
%D {globalletempty,letempty,
@@ -3033,7 +3083,7 @@
%D
%D A fully expandable message:
-\def\immediatemessage#1{\ctxlua{logs.status("message","#1")}}
+\let\immediatemessage\clf_immediatemessage % {} mandate
%D \macros
%D {debuggerinfo}
@@ -3249,6 +3299,25 @@
% [here #oeps: \the\scratchcounter]
% \stoptexdefinition
+% \bgroup \obeylines
+%
+% \global\let\stoptexdefinition\relax
+%
+% \unexpanded\gdef\starttexdefinition%
+% {\bgroup%
+% \obeylines%
+% \syst_helpers_start_tex_definition_one}
+%
+% \gdef\syst_helpers_start_tex_definition_one#1
+% {\catcode\endoflineasciicode\ignorecatcode%
+% \syst_helpers_start_tex_definition_two{#1}}
+%
+% \gdef\syst_helpers_start_tex_definition_two#1#2\stoptexdefinition%
+% {\egroup%
+% \ctxcommand{thetexdefinition("#1")}{#2}}
+%
+% \egroup
+
\bgroup \obeylines
\global\let\stoptexdefinition\relax
@@ -3256,19 +3325,19 @@
\unexpanded\gdef\starttexdefinition%
{\bgroup%
\obeylines%
- \syst_helpers_start_tex_definition_one}
+ \syst_helpers_start_tex_definition}
-\gdef\syst_helpers_start_tex_definition_one#1
+\gdef\syst_helpers_start_tex_definition#1
{\catcode\endoflineasciicode\ignorecatcode%
- \syst_helpers_start_tex_definition_two{#1}}
+ \clf_texdefinition_one{#1}}
-\gdef\syst_helpers_start_tex_definition_two#1#2\stoptexdefinition%
+\gdef\dostarttexdefinition#1\stoptexdefinition%
{\egroup%
- \ctxcommand{thetexdefinition("#1")}{#2}}
+ \clf_texdefinition_two{#1}}
\egroup
-\unexpanded\def\texdefinition#1{\csname\ifcsname#1\endcsname#1\else donothing\fi\endcsname}
+\unexpanded\def\texdefinition#1{\csname\ifcsname#1\endcsname#1\else donothing\fi\endcsname} % todo: a nop cs: char 0 or some corenamespace
% This is a first variant, more might be added:
@@ -3345,14 +3414,14 @@
\def\syst_helpers_do_do_do_increment#1,#2){\dodoglobal\edef#1{\the\numexpr\ifdefined#1\ifx#1\relax\else#1\fi\fi+#2\relax}}
\def\syst_helpers_do_do_do_decrement#1,#2){\dodoglobal\edef#1{\the\numexpr\ifdefined#1\ifx#1\relax\else#1\fi\fi-#2\relax}}
-\def\syst_helpers_do_do_increment(#1{\doifnextcharelse,{\syst_helpers_do_do_do_increment#1}{\syst_helpers_do_do_do_increment#1,\plusone}}
-\def\syst_helpers_do_do_decrement(#1{\doifnextcharelse,{\syst_helpers_do_do_do_decrement#1}{\syst_helpers_do_do_do_decrement#1,\plusone}}
+\def\syst_helpers_do_do_increment(#1{\doifelsenextchar,{\syst_helpers_do_do_do_increment#1}{\syst_helpers_do_do_do_increment#1,\plusone}}
+\def\syst_helpers_do_do_decrement(#1{\doifelsenextchar,{\syst_helpers_do_do_do_decrement#1}{\syst_helpers_do_do_do_decrement#1,\plusone}}
\unexpanded\def\fastincrement#1{\dodoglobal\edef#1{\the\numexpr#1+\plusone \relax}}
\unexpanded\def\fastdecrement#1{\dodoglobal\edef#1{\the\numexpr#1+\minusone\relax}}
-\unexpanded\def\increment{\doifnextcharelse(\syst_helpers_do_do_increment\syst_helpers_do_increment}
-\unexpanded\def\decrement{\doifnextcharelse(\syst_helpers_do_do_decrement\syst_helpers_do_decrement}
+\unexpanded\def\increment{\doifelsenextchar(\syst_helpers_do_do_increment\syst_helpers_do_increment}
+\unexpanded\def\decrement{\doifelsenextchar(\syst_helpers_do_do_decrement\syst_helpers_do_decrement}
\unexpanded\def\incrementvalue#1{\expandafter\increment\csname#1\endcsname}
\unexpanded\def\decrementvalue#1{\expandafter\decrement\csname#1\endcsname}
@@ -3396,6 +3465,7 @@
{\expandafter\syst_helpers_checked_stripped_csname\string#1}
\def\syst_helpers_checked_stripped_csname#1%
+ %{\ifx#1\letterbackslash\else#1\fi}
{\if\noexpand#1\letterbackslash\else#1\fi}
%D \macros
@@ -4028,13 +4098,15 @@
\def\syst_helpers_check_if_assignment_else#1=#2#3\_e_o_p_{\if#2@}%
-\unexpanded\def\doifassignmentelse#1% expandable
+\unexpanded\def\doifelseassignment#1% expandable
{\expandafter\syst_helpers_check_if_assignment_else\detokenize{#1}=@@\_e_o_p_
\expandafter\secondoftwoarguments
\else
\expandafter\firstoftwoarguments
\fi}
+\let\doifassignmentelse\doifelseassignment
+
\newif\ifassignment
\unexpanded\def\docheckassignment#1%
@@ -4107,7 +4179,7 @@
%D
%D Watch the one level expansion of the second argument.
-\unexpanded\def\doifmeaningelse#1#2%
+\unexpanded\def\doifelsemeaning#1#2%
{\edef\m_syst_string_one{\meaning#1}%
\def \m_syst_string_two{#2}%
\edef\m_syst_string_two{\meaning\m_syst_string_two}%
@@ -4117,6 +4189,8 @@
\expandafter\secondoftwoarguments
\fi}
+\let\doifmeaningelse\doifelsemeaning
+
%D \macros
%D {doifsamestringselse,doifsamestring,doifnotsamestring}
%D
@@ -4134,10 +4208,12 @@
\edef\m_syst_string_two{\detokenize\expandafter{\normalexpanded{#4}}}%
\ifx\m_syst_string_one\m_syst_string_two\expandafter#1\else\expandafter#2\fi}
-\unexpanded\def\doifsamestringelse{\syst_helpers_if_samestring_else\firstoftwoarguments\secondoftwoarguments}
+\unexpanded\def\doifelsesamestring{\syst_helpers_if_samestring_else\firstoftwoarguments\secondoftwoarguments}
\unexpanded\def\doifsamestring {\syst_helpers_if_samestring_else\firstofoneargument \gobbleoneargument }
\unexpanded\def\doifnotsamestring {\syst_helpers_if_samestring_else\gobbleoneargument \firstofoneargument }
+\let\doifsamestringelse\doifelsesamestring
+
%D \macros
%D {ConvertToConstant,ConvertConstantAfter}
%D
@@ -4199,7 +4275,7 @@
\unexpanded\def\CheckConstantAfter#1#2%
{\expandafter\convertargument\v!prefix!\to\ascii
\convertargument#1\to#2\relax
- \doifinstringelse\ascii{#2}
+ \doifelseinstring\ascii{#2}
{\expandafter\convertargument#1\to#2}
{}}
@@ -4438,6 +4514,18 @@
{\m_syst_helpers_handle_group_after
\egroup}%
+\unexpanded\def\syst_helpers_handle_group_pickup#1#2#3% no inner group (so no kerning interference)
+ {\bgroup
+ \def\m_syst_helpers_handle_group_before{#1}%
+ \def\m_syst_helpers_handle_group_after {#2\egroup#3}%
+ \afterassignment\m_syst_helpers_handle_group_pickup_before
+ \let\next=}
+
+\def\m_syst_helpers_handle_group_pickup_before
+ {\bgroup
+ \aftergroup\m_syst_helpers_handle_group_after
+ \m_syst_helpers_handle_group_before}
+
\unexpanded\def\syst_helpers_handle_group_nop
{\ifnum\currentgrouptype=\semisimplegroupcode
\expandafter\syst_helpers_handle_group_nop_a
@@ -4470,10 +4558,13 @@
%D implementation became:
\unexpanded\def\groupedcommand#1#2%
- {\doifnextbgroupelse{\syst_helpers_handle_group_normal{#1}{#2}}{\syst_helpers_handle_group_nop{#1}{#2}}}
+ {\doifelsenextbgroup{\syst_helpers_handle_group_normal{#1}{#2}}{\syst_helpers_handle_group_nop{#1}{#2}}}
\unexpanded\def\simplegroupedcommand#1#2%
- {\doifnextbgroupelse{\syst_helpers_handle_group_simple{#1}{#2}}{\syst_helpers_handle_group_nop{#1}{#2}}}
+ {\doifelsenextbgroup{\syst_helpers_handle_group_simple{#1}{#2}}{\syst_helpers_handle_group_nop{#1}{#2}}}
+
+\unexpanded\def\pickupgroupedcommand#1#2#3%
+ {\doifelsenextbgroup{\syst_helpers_handle_group_pickup{#1}{#2}{#3}}{\syst_helpers_handle_group_nop{#1}{#2}}}
%D Users should be aware of the fact that grouping can
%D interfere with ones paragraph settings that are executed
@@ -4567,14 +4658,14 @@
\newtoks\AfterPar
\def\redowithpar\par
- {\doifnextcharelse\par\redowithpar\dodowithpar}%
+ {\doifelsenextchar\par\redowithpar\dodowithpar}%
\def\dowithpar#1#2%
{\def\dodowithpar##1\par{#1##1#2}%
\redowithpar\par}
\def\redogotopar\par
- {\doifnextcharelse\par\redogotopar\dodogotopar}%
+ {\doifelsenextchar\par\redogotopar\dodogotopar}%
\def\dogotopar#1%
{\def\dodogotopar{#1}%
@@ -4638,7 +4729,7 @@
\unexpanded\def\dowithpargument#1%
{\def\syst_helpers_next_par##1 \par{#1{##1}}%
\def\syst_helpers_next_arg##1{#1{##1}}%
- \doifnextbgroupelse\syst_helpers_next_arg{\doifnextcharelse\par{#1{}}\syst_helpers_next_par}}
+ \doifelsenextbgroup\syst_helpers_next_arg{\doifelsenextchar\par{#1{}}\syst_helpers_next_par}}
%D The \type{p} in the previous command stands for paragraph.
%D When we want to act upon words we can use the \type{w}
@@ -4668,7 +4759,7 @@
\unexpanded\def\dowithwargument#1%
{\def\syst_helpers_next_war##1 {#1{##1}}%
\def\syst_helpers_next_arg##1{#1{##1}}%
- \doifnextbgroupelse\syst_helpers_next_arg\syst_helpers_next_war}
+ \doifelsenextbgroup\syst_helpers_next_arg\syst_helpers_next_war}
%D \macros
%D {dorepeat,dorepeatwithcommand}
@@ -4763,11 +4854,13 @@
\expandafter\firstoftwoarguments
\fi}
-\def\doifstringinstringelse#1#2%
+\def\doifelsestringinstring#1#2%
{\expandafter\def\expandafter\syst_helpers_if_instring_else\expandafter##\expandafter1#1##2##3\_e_o_s_
{\syst_helpers_if_instring_else_indeed##2}%
\expandafter\expandafter\expandafter\syst_helpers_if_instring_else\expandafter#2#1@@\_e_o_s_}
+\let\doifstringinstringelse\doifelsestringinstring
+
%D \macros
%D {appendtoks,prependtoks,appendtoksonce,prependtoksonce,
%D doifintokselse,flushtoks,dotoks}
@@ -4813,19 +4906,21 @@
\def\syst_helpers_append_toks_once#1\to#2%
{\let\m_syst_helpers_scratch#2%
\t_syst_helpers_scratch\expandafter{\gobbleoneargument#1}%
- \doifintokselse\t_syst_helpers_scratch\m_syst_helpers_scratch\donothing\syst_helpers_append_toks_indeed}
+ \doifelseintoks\t_syst_helpers_scratch\m_syst_helpers_scratch\donothing\syst_helpers_append_toks_indeed}
\def\syst_helpers_prepend_toks_once#1\to#2%
{\let\m_syst_helpers_scratch#2%
\t_syst_helpers_scratch\expandafter{\gobbleoneargument#1}%
- \doifintokselse\t_syst_helpers_scratch\m_syst_helpers_scratch\donothing\syst_helpers_prepend_toks_indeed}
+ \doifelseintoks\t_syst_helpers_scratch\m_syst_helpers_scratch\donothing\syst_helpers_prepend_toks_indeed}
%D The test macro:
-\unexpanded\def\doifintokselse#1#2% #1 en #2 zijn toks
+\unexpanded\def\doifelseintoks#1#2% #1 en #2 zijn toks
{\edef\asciia{\detokenize\expandafter{\the#1}}%
\edef\asciib{\detokenize\expandafter{\the#2}}%
- \doifstringinstringelse\asciia\asciib}
+ \doifelsestringinstring\asciia\asciib}
+
+\let\doifintokselse\doifelseintoks
%D A nice one too:
@@ -5019,24 +5114,26 @@
{\dodoglobal\edef#2{#1\ifx#2\empty\else,#2\fi}}
\unexpanded\def\addtocommalist#1#2% {item} \cs
- {\rawdoifinsetelse{#1}#2\resetglobal
+ {\rawdoifelseinset{#1}#2\resetglobal
{\dodoglobal\edef#2{\ifx#2\empty\else#2,\fi#1}}}
\unexpanded\def\pretocommalist#1#2% {item} \cs
- {\rawdoifinsetelse{#1}#2\resetglobal
+ {\rawdoifelseinset{#1}#2\resetglobal
{\dodoglobal\edef#2{#1\ifx#2\empty\else,#2\fi}}}
-\unexpanded\def\robustdoifinsetelse#1#2%
+\unexpanded\def\robustdoifelseinset#1#2%
{\edef\m_syst_string_one{\detokenize\expandafter{\normalexpanded{#1}}}%
\edef\m_syst_string_two{\detokenize\expandafter{\normalexpanded{#2}}}%
- \rawdoifinsetelse\m_syst_string_one\m_syst_string_two}
+ \rawdoifelseinset\m_syst_string_one\m_syst_string_two}
+
+\let\robustdoifinsetelse\robustdoifelseinset
\unexpanded\def\robustaddtocommalist#1#2% {item} \cs
- {\robustdoifinsetelse{#1}#2\resetglobal
+ {\robustdoifelseinset{#1}#2\resetglobal
{\dodoglobal\edef#2{\ifx#2\empty\else#2,\fi#1}}}
\unexpanded\def\robustpretocommalist#1#2% {item} \cs
- {\robustdoifinsetelse{#1}#2\resetglobal
+ {\robustdoifelseinset{#1}#2\resetglobal
{\dodoglobal\edef#2{#1\ifx#2\empty\else,#2\fi}}}
\unexpanded\def\xsplitstring#1#2% \cs {str}
@@ -5050,7 +5147,7 @@
\def\acleanedupcommalist#1,,#2\relax{#1}
\unexpanded\def\removefromcommalist#1#2% to be sped up
- {\rawdoifinsetelse{#1}#2%
+ {\rawdoifelseinset{#1}#2%
{\normalexpanded{\xsplitstring\noexpand#2{#1}}%
\dodoglobal\edef#2%
{\ifx\m_syst_string_one\empty
@@ -5288,7 +5385,7 @@
\let\popmacro \localpopmacro
%D \macros
-%D {setlocalhsize}
+%D {setlocalhsize,distributedhsize}
%D
%D Sometimes we need to work with the \type{\hsize} that is
%D corrected for indentation and left and right skips. The
@@ -5307,7 +5404,7 @@
\newdimen\localhsize
\unexpanded\def\setlocalhsize % don't change !
- {\doifnextoptionalelse
+ {\doifelsenextoptional
\syst_helpers_set_local_hsize_yes
\syst_helpers_set_local_hsize_nop}
@@ -5326,6 +5423,12 @@
\fi
\relax}
+\def\distributedhsize#1#2#3%
+ {\dimexpr(#1-\numexpr#3-1\relax\dimexpr#2\relax)/#3\relax}
+
+\def\hsizefraction#1#2%
+ {\dimexpr#1/#2\relax}
+
%D \macros
%D {doifvalue,doifnotvalue,doifelsevalue,
%D doifnothing,doifsomething,doifelsenothing,
@@ -5388,7 +5491,7 @@
\expandafter\secondoftwoarguments
\fi}
-\unexpanded\def\doifsomethingelse#1%
+\unexpanded\def\doifelsesomething#1%
{\edef\m_syst_string_one{#1}%
\ifx\m_syst_string_one\empty
\expandafter\secondoftwoarguments
@@ -5420,18 +5523,25 @@
\expandafter\secondoftwoarguments
\fi}
+\let\doifvalueelse \doifelsevalue
+\let\doifnothingelse \doifelsenothing
+\let\doifsomethingelse \doifelsesomething
+\let\doifvaluenothingelse\doifelsevaluenothing
+
%D \macros
%D {doifemptyelsevalue, doifemptyvalue, doifnotemptyvalue}
%D
%D Also handy:
-\def\doifemptyelsevalue#1%
+\def\doifelseemptyvalue#1%
{\expandafter\ifx\csname#1\endcsname\empty
\expandafter\firstoftwoarguments
\else
\expandafter\secondoftwoarguments
\fi}
+\let\doifemptyvalueelse\doifelseemptyvalue
+
\def\doifemptyvalue#1%
{\expandafter\ifx\csname#1\endcsname\empty
\expandafter\firstofoneargument
@@ -5461,10 +5571,12 @@
\processcommalist[#3]\syst_helpers_do_common_check_all
\ifdone\expandafter#1\else\expandafter#2\fi}
-\unexpanded\def\doifallcommonelse{\syst_helpers_do_if_all_common_else\firstoftwoarguments\secondoftwoarguments}
+\unexpanded\def\doifelseallcommon{\syst_helpers_do_if_all_common_else\firstoftwoarguments\secondoftwoarguments}
\unexpanded\def\doifallcommon {\syst_helpers_do_if_all_common_else\firstofonearguments\gobbleoneargument }
\unexpanded\def\doifnotallcommon {\syst_helpers_do_if_all_common_else\gobbleoneargument \firstofonearguments }
+\let\doifallcommonelse\doifelseallcommon
+
%D \macros
%D {DOIF,DOIFELSE,DOIFNOT}
%D
@@ -5668,13 +5780,15 @@
\def\syst_helpers_if_some_space_else#1 #2#3\_e_o_s_{\if\noexpand#2@}
-\def\doifsomespaceelse#1% % #2#3%
+\def\doifelsesomespace#1% % #2#3%
{\syst_helpers_if_some_space_else#1 @ @\_e_o_s_ % #3\else#2\fi}
\expandafter\secondoftwoarguments
\else
\expandafter\firstoftwoarguments
\fi}
+\let\doifsomespaceelse\doifelsesomespace
+
%D \macros
%D {processseparatedlist}
%D
@@ -5924,11 +6038,11 @@
%D These macros are sort of obsolete as we never use uppercase this
%D way. But nevertheless we provide them:
-\def\utfupper#1{\ctxcommand{upper(\!!bs#1\!!es)}} % expandable
-\def\utflower#1{\ctxcommand{lower(\!!bs#1\!!es)}} % expandable
+\def\utfupper#1{\clf_upper{#1}} % expandable
+\def\utflower#1{\clf_lower{#1}} % expandable
-\unexpanded\def\uppercasestring#1\to#2{\dodoglobal\edef#2{\ctxcommand{upper(\!!bs#1\!!es)}}}
-\unexpanded\def\lowercasestring#1\to#2{\dodoglobal\edef#2{\ctxcommand{lower(\!!bs#1\!!es)}}}
+\unexpanded\def\uppercasestring#1\to#2{\dodoglobal\edef#2{\clf_upper{#1}}}
+\unexpanded\def\lowercasestring#1\to#2{\dodoglobal\edef#2{\clf_lower{#1}}}
%D \macros
%D {handletokens}
@@ -6124,24 +6238,20 @@
% \def\threedigitrounding#1%
% {\expandafter\expandafter\expandafter\dothreedigitrounding\expandafter\WITHOUTPT\the\dimexpr#1\points+.0005\points\relax0000.*00\relax}
-\def\integerrounding #1{\cldcontext{"\letterpercent 0.0f",#1}}
-\def\onedigitrounding #1{\cldcontext{"\letterpercent 0.1f",#1}}
-\def\twodigitrounding #1{\cldcontext{"\letterpercent 0.2f",#1}}
-\def\threedigitrounding#1{\cldcontext{"\letterpercent 0.3f",#1}}
+\def\integerrounding #1{\clf_rounded\zerocount\numexpr#1\relax}
+\def\onedigitrounding #1{\clf_rounded\plusone \numexpr#1\relax}
+\def\twodigitrounding #1{\clf_rounded\plustwo \numexpr#1\relax}
+\def\threedigitrounding#1{\clf_rounded\plusthree\numexpr#1\relax}
%D \macros
%D {processcontent}
%D
-%D This is the first occasion where \TEX\ and \ETEX\ are no
-%D longer compatible, although in many cases things go ok.
-%D Beware of verbatim, i.e. catcode changes.
+%D This macro is first used in the tabulation macros.
%D
%D \starttyping
%D \unexpanded\def\starthans%
%D {\processcontent{stophans}\test{\message{\test}\wait}}
%D \stoptyping
-%D
-%D This macro is first used in the tabulation macros.
\unexpanded\def\processcontent#1%
{\begingroup\expandafter\syst_helpers_process_content\csname#1\endcsname}
@@ -6207,7 +6317,7 @@
%D Not that fast I guess, but here's a way to test for token
%D registers being empty.
-\unexpanded\def\doifsometokselse#1%
+\unexpanded\def\doifelsesometoks#1%
{\edef\m_syst_string_one{\the#1}% one level expansion so quite ok
\ifx\m_syst_string_one\empty
\expandafter\secondoftwoarguments
@@ -6215,6 +6325,8 @@
\expandafter\firstoftwoarguments
\fi}
+\let\doifsometokselse\doifelsesometoks
+
\unexpanded\def\doifsometoks#1%
{\edef\m_syst_string_one{\the#1}% one level expansion so quite ok
\ifx\m_syst_string_one\empty
@@ -6253,9 +6365,11 @@
\unexpanded\def\stopstrictinspectnextcharacter
{\let\syst_helpers_inspect_next_character\syst_helpers_normal_inspect_next_character}
-\def\strictdoifnextoptionalelse#1#2%
+\unexpanded\def\strictdoifelsenextoptional#1#2%
{\startstrictinspectnextcharacter
- \doifnextcharelse[{\stopstrictinspectnextcharacter#1}{\stopstrictinspectnextcharacter#2}}
+ \doifelsenextchar[{\stopstrictinspectnextcharacter#1}{\stopstrictinspectnextcharacter#2}}
+
+\let\strictdoifnextoptionalelse\strictdoifelsenextoptional
%D \macros
%D {gobblespacetokens}
@@ -6448,9 +6562,11 @@
%D
%D This is a dirty one: we simply append a unit and discard it when needed.
-\def\doifdimensionelse#1%
+\def\doifelsedimension#1%
{\afterassignment\syst_helpers_if_dimension_else\scratchdimen#1pt\relax}
+\let\doifdimensionelse\doifelsedimension
+
\def\syst_helpers_if_dimension_else#1%
{\ifx#1\relax
\expandafter\secondoftwoarguments
@@ -6479,7 +6595,9 @@
\installsystemnamespace{dimencheckb}
\installsystemnamespace{dimencheckc}
-\def\doifdimenstringelse#1{\normalexpanded{\noexpand\dodimenteststageone#1}\empty\empty]}
+\def\doifelsedimenstring#1{\normalexpanded{\noexpand\dodimenteststageone#1}\empty\empty]}
+
+\let\doifdimenstringelse\doifelsedimenstring
\def\dodimenteststageone #1#2{\csname \??dimenchecka\ifcsname \??dimenchecka#2\endcsname#2\else x\fi\endcsname#2}
\def\dodimenteststagetwo #1#2{\csname \??dimencheckb\ifcsname \??dimencheckb#2\endcsname#2\else x\fi\endcsname#2}
@@ -6602,10 +6720,12 @@
% sometimes handy:
-\unexpanded\def\doifhasspaceelse#1%
+\unexpanded\def\doifelsehasspace#1%
{\edef\m_syst_string_one{#1}%
\normalexpanded{\syst_helpers_if_has_space_else#1\space}\empty\relax}
+\let\doifhasspaceelse\doifelsehasspace
+
\unexpanded\def\syst_helpers_if_has_space_else#1 #2#3\relax % \space\empty\relax
{\ifx\m_syst_string_one\space
\expandafter\firstoftwoarguments
@@ -6614,7 +6734,7 @@
\else
\doubleexpandafter\firstoftwoarguments
\fi\fi}
-
+
% this will replace loadfile once and alike !!! todo
\installsystemnamespace{flag}
@@ -6633,6 +6753,8 @@
\doubleexpandafter\secondoftwoarguments
\fi\fi}
+\let\doifflaggedelse\doifelseflagged
+
\def\doifnotflagged#1%
{\expandafter\ifx\csname\??flag#1\endcsname\relax
\expandafter\firstofoneargument
@@ -6641,10 +6763,10 @@
\else
\doubleexpandafter\firstofoneargument
\fi\fi}
-
+
\unexpanded\def\inheritparameter[#1]#2[#3]#4[#5]% tag tokey fromkey
{\expandafter\def\csname#1#3\expandafter\endcsname\expandafter{\csname#1#5\endcsname}}
-
+
\def\syst_helpers_if_non_zero_positive_else#1#2\end % #3#4%
{\ifx#1\relax
\ifcase\scratchcounter
@@ -6659,9 +6781,11 @@
\expandafter\secondoftwoarguments
\fi}
-\def\doifnonzeropositiveelse#1%
+\def\doifelsenonzeropositive#1%
{\begingroup\afterassignment\syst_helpers_if_non_zero_positive_else\scratchcounter=0#1\relax\empty\end}
-
+
+\let\doifnonzeropositiveelse\doifelsenonzeropositive
+
% here ?
\unexpanded\def\dosetrawvalue #1#2#3{\expandafter \def\csname#1#2\endcsname{#3}}
@@ -6705,8 +6829,8 @@
% \fi
% \def\elapsedseconds{\expandafter\withoutpt\the\dimexpr\elapsedtime sp\relax}
-\def\resettimer {\ctxcommand{resettimer()}}
-\def\elapsedtime {\ctxcommand{elapsedtime()}}
+\let\resettimer \clf_resettimer
+\let\elapsedtime \clf_elapsedtime
\let\elapsedseconds \elapsedtime
\newcount\c_syst_helpers_test_feature_n
@@ -6820,7 +6944,7 @@
%D \typebuffer \getbuffer
\unexpanded\def\ignoreimplicitspaces
- {\doifnextcharelse\relax\relax\relax}
+ {\doifelsenextchar\relax\relax\relax}
%D \macros
%D {processwords}
@@ -6883,7 +7007,7 @@
\def\syst_helpers_direct_double_empty_one_nop#1{#1[][]}
\def\syst_helpers_direct_double_empty_two_nop#1[#2]{#1[#2][]}
-%D Used in math definitions (in an type {\edef}):
+%D Used in math definitions (in an \type {\edef}):
%D \startbuffer
%D [\docheckedpair{}]
@@ -6997,8 +7121,80 @@
% expandable:
-%def\getsubstring#1#2#3{\cldcontext{utf.sub([[#3]],tonumber("#1"),tonumber("#2"))}}
-\def\getsubstring#1#2#3{\ctxcommand{getsubstring(\!!bs#3\!!es,"#1","#2")}}
+\def\getsubstring#1#2#3{\clf_getsubstring{#3}{#1}{#2}}
+
+%D Other dimensions than pt:
+
+% \def\converteddimen#1#2{\clf_converteddimen\dimexpr#1\relax{#2}}
+
+%D Maybe (looks ugly):
+%D
+%D \starttyping
+%D \doifcase {foo}
+%D {bar} {BAR}
+%D {foo} {FOO}
+%D {default} {DEFAULT}
+%D
+%D \doifcase {foo}
+%D {bar} {BAR}
+%D {foo} {\doifcase {bar}
+%D {bar} {BAR}
+%D {foo} {FOO}
+%D {default} {DEFAULT}
+%D }
+%D {default} {DEFAULT}
+%D \stoptyping
+
+% \doifcase {\btxfoundname{author}}
+% {author} {\btxflush{author}}
+% {editor} {\texdefinition{btx:apa:editor-or-editors}}
+% {title} {\texdefinition{btx:apa:title-subtitle-type}}
+% {default} {\btxflush{author}}
+
+% \unexpanded\def\doifcase#1%
+% {\edef\m_case_asked{#1}%
+% \syst_aux_case}
+%
+% \def\syst_aux_case#1%
+% {\edef\m_case_temp{#1}%
+% \ifx\m_case_temp\m_case_asked
+% \expandafter\syst_aux_case_yes
+% \else\ifx\m_case_temp\s!default
+% \doubleexpandafter\firstofoneargument
+% \else
+% \doubleexpandafter\syst_aux_case_nop
+% \fi\fi}
+%
+% \def\syst_aux_skip#1#2%
+% {\edef\m_case_temp{#1}%
+% \ifx\m_case_temp\s!default
+% \expandafter\syst_aux_done
+% \else
+% \expandafter\syst_aux_skip
+% \fi}
+%
+% \def\syst_aux_case_yes#1%
+% {\def\syst_aux_done{#1}%
+% \syst_aux_skip}
+%
+% \def\syst_aux_case_nop#1%
+% {\syst_aux_case}
+
+%D \macros
+%D {ntimes}
+%D
+%D some repetition:
+%D
+%D \startbuffer
+%D \ntimes{*}{20}
+%D \stopbuffer
+%D
+%D \typebuffer \blank gives: \getbuffer \blank
+%D
+%D This is not real fast but quite okay:
+
+%def\ntimes#1#2{\ifnum#2>\zerocount#1\ntimes{#1}{\numexpr#2-\plusone\relax}\fi} % 1.72
+\def\ntimes#1#2{\clf_ntimes{#1}\numexpr#2\relax} % 0.33
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/syst-con.lua b/Master/texmf-dist/tex/context/base/syst-con.lua
index dfbd490518e..0fa685b2dab 100644
--- a/Master/texmf-dist/tex/context/base/syst-con.lua
+++ b/Master/texmf-dist/tex/context/base/syst-con.lua
@@ -7,16 +7,18 @@ if not modules then modules = { } end modules ['syst-con'] = {
}
local tonumber = tonumber
+local math = math
local utfchar = utf.char
-local gsub, format = string.gsub, string.format
+local gsub = string.gsub
converters = converters or { }
local converters = converters
local context = context
-local comands = commands
+local commands = commands
+local implement = interfaces.implement
-local formatters = string,formatters
+local formatters = string.formatters
--[[ldx--
<p>For raw 8 bit characters, the offset is 0x110000 (bottom of plane 18) at
@@ -28,45 +30,39 @@ function converters.octstringtonumber(n) tonumber(n, 8) end
function converters.rawcharacter (n) utfchar(0x110000+n) end
-converters.lchexnumber = formatters["%x" ]
-converters.uchexnumber = formatters["%X" ]
-converters.lchexnumbers = formatters["%02x"]
-converters.uchexnumbers = formatters["%02X"]
-converters.octnumber = formatters["%03o"]
-
-function commands.hexstringtonumber(n) context(tonumber(n,16)) end
-function commands.octstringtonumber(n) context(tonumber(n, 8)) end
-
-function commands.rawcharacter (n) context(utfchar(0x110000+n)) end
-
-function commands.lchexnumber (n) context("%x" ,n) end
-function commands.uchexnumber (n) context("%X" ,n) end
-function commands.lchexnumbers (n) context("%02x",n) end
-function commands.uchexnumbers (n) context("%02X",n) end
-function commands.octnumber (n) context("%03o",n) end
-
-function commands.format(fmt,...) -- used ?
- fmt = gsub(fmt,"@","%%")
- context(fmt,...)
-end
-
-local cosd, sind, tand = math.cosd, math.sind, math.tand
-local cos, sin, tan = math.cos, math.sin, math.tan
-
--- unfortunately %s spits out: 6.1230317691119e-017
---
--- function commands.sind(n) context(sind(n)) end
--- function commands.cosd(n) context(cosd(n)) end
--- function commands.tand(n) context(tand(n)) end
---
--- function commands.sin (n) context(sin (n)) end
--- function commands.cos (n) context(cos (n)) end
--- function commands.tan (n) context(tan (n)) end
-
-function commands.sind(n) context("%0.6F",sind(n)) end
-function commands.cosd(n) context("%0.6F",cosd(n)) end
-function commands.tand(n) context("%0.6F",tand(n)) end
-
-function commands.sin (n) context("%0.6F",sin (n)) end
-function commands.cos (n) context("%0.6F",cos (n)) end
-function commands.tan (n) context("%0.6F",tan (n)) end
+local lchexnumber = formatters["%x"]
+local uchexnumber = formatters["%X"]
+local lchexnumbers = formatters["%02x"]
+local uchexnumbers = formatters["%02X"]
+local octnumber = formatters["%03o"]
+local nicenumber = formatters["%0.6F"]
+
+converters.lchexnumber = lchexnumber
+converters.uchexnumber = uchexnumber
+converters.lchexnumbers = lchexnumbers
+converters.uchexnumbers = uchexnumbers
+converters.octnumber = octnumber
+converters.nicenumber = nicenumber
+
+implement { name = "hexstringtonumber", actions = { tonumber, context }, arguments = { "integer", 16 } }
+implement { name = "octstringtonumber", actions = { tonumber, context }, arguments = { "integer", 8 } }
+
+implement { name = "rawcharacter", actions = function(n) context(utfchar(0x110000+n)) end, arguments = "integer" }
+
+implement { name = "lchexnumber", actions = { lchexnumber, context }, arguments = "integer" }
+implement { name = "uchexnumber", actions = { uchexnumber, context }, arguments = "integer" }
+implement { name = "lchexnumbers", actions = { lchexnumbers, context }, arguments = "integer" }
+implement { name = "uchexnumbers", actions = { uchexnumbers, context }, arguments = "integer" }
+implement { name = "octnumber", actions = { octnumber, context }, arguments = "integer" }
+
+implement { name = "sin", actions = { math.sin, nicenumber, context }, arguments = "number" }
+implement { name = "cos", actions = { math.cos, nicenumber, context }, arguments = "number" }
+implement { name = "tan", actions = { math.tan, nicenumber, context }, arguments = "number" }
+
+implement { name = "sind", actions = { math.sind, nicenumber, context }, arguments = "number" }
+implement { name = "cosd", actions = { math.cosd, nicenumber, context }, arguments = "number" }
+implement { name = "tand", actions = { math.tand, nicenumber, context }, arguments = "number" }
+
+-- only as commands
+
+function commands.format(fmt,...) context((gsub(fmt,"@","%%")),...) end
diff --git a/Master/texmf-dist/tex/context/base/syst-con.mkiv b/Master/texmf-dist/tex/context/base/syst-con.mkiv
index de8ed597e1a..17c40781977 100644
--- a/Master/texmf-dist/tex/context/base/syst-con.mkiv
+++ b/Master/texmf-dist/tex/context/base/syst-con.mkiv
@@ -46,10 +46,10 @@
%D [\expandafter\uchexnumber\expandafter{\the\zerocount}]
%D \stoptyping
-\def\lchexnumber #1{\ctxcommand{lchexnumber(\number#1)}}
-\def\uchexnumber #1{\ctxcommand{uchexnumber(\number#1)}}
-\def\lchexnumbers#1{\ctxcommand{lchexnumbers(\number#1)}}
-\def\uchexnumbers#1{\ctxcommand{uchexnumbers(\number#1)}}
+\def\lchexnumber #1{\clf_lchexnumber \numexpr#1\relax}
+\def\uchexnumber #1{\clf_uchexnumber \numexpr#1\relax}
+\def\lchexnumbers#1{\clf_lchexnumbers\numexpr#1\relax}
+\def\uchexnumbers#1{\clf_uchexnumbers\numexpr#1\relax}
\let\hexnumber\uchexnumber
@@ -58,7 +58,7 @@
%D
%D For unicode remapping purposes, we need octal numbers.
-\def\octnumber#1{\ctxcommand{octnumber(\number#1)}}
+\def\octnumber#1{\clf_octnumber\numexpr#1\relax}
%D \macros
%D {hexstringtonumber,octstringtonumber}
@@ -67,8 +67,8 @@
%D a decimal number, thereby taking care of lowercase characters
%D as well.
-\def\hexstringtonumber#1{\ctxcommand{hexstringtonumber("#1")}}
-\def\octstringtonumber#1{\ctxcommand{octstringtonumber("#1")}}
+\def\hexstringtonumber#1{\clf_hexstringtonumber\numexpr#1\relax}
+\def\octstringtonumber#1{\clf_octstringtonumber\numexpr#1\relax}
%D \macros
%D {rawcharacter}
@@ -76,7 +76,7 @@
%D This macro can be used to produce proper 8 bit characters
%D that we sometimes need in backends and round||trips.
-\def\rawcharacter#1{\ctxcommand{rawcharacter(\number#1)}}
+\def\rawcharacter#1{\clf_rawcharacter\numexpr#1\relax}
%D \macros
%D {twodigits, threedigits}
@@ -126,23 +126,12 @@
%D \macros
%D {setcalculatedsin,setcalculatedcos,setcalculatedtan}
-%D
-%D This saves some 2K in the format. At some point we will redo the
-%D code that calls this. Beware: in \MKII\ this is a separate module.
-
-% \let\calculatesin\gobbleoneargument
-% \let\calculatecos\gobbleoneargument
-% \let\calculatetan\gobbleoneargument
-
-% \def\setcalculatedsin#1#2{\edef#1{\cldcontext{math.sind(#2)}}} % jit-unsafe
-% \def\setcalculatedcos#1#2{\edef#1{\cldcontext{math.cosd(#2)}}} % jit-unsafe
-% \def\setcalculatedtan#1#2{\edef#1{\cldcontext{math.tand(#2)}}} % jit-unsafe
-\def\setcalculatedsin#1#2{\edef#1{\ctxcommand{sind(#2)}}}
-\def\setcalculatedcos#1#2{\edef#1{\ctxcommand{cosd(#2)}}}
-\def\setcalculatedtan#1#2{\edef#1{\ctxcommand{tand(#2)}}}
+\def\setcalculatedsin#1#2{\edef#1{\clf_sind#2}}
+\def\setcalculatedcos#1#2{\edef#1{\clf_cosd#2}}
+\def\setcalculatedtan#1#2{\edef#1{\clf_tand#2}}
- \def\formatted#1{\ctxcommand{format(#1)}}
-\unexpanded\def\format #1{\ctxcommand{format(#1)}}
+ \def\formatted#1{\ctxcommand{format(#1)}} % not clf
+\unexpanded\def\format #1{\ctxcommand{format(#1)}} % not clf
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/syst-ini.mkiv b/Master/texmf-dist/tex/context/base/syst-ini.mkiv
index a533f8a6a6a..8631aed9075 100644
--- a/Master/texmf-dist/tex/context/base/syst-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/syst-ini.mkiv
@@ -114,11 +114,6 @@
end
}
-%D Handy.
-
-\suppresslongerror = 1
-\suppressoutererror = 1
-
%D \ETEX\ has a not so handy way of telling you the version number, i.e. the revision
%D number has a period in it:
@@ -198,7 +193,7 @@
\countdef \c_syst_last_allocated_language = 41 \c_syst_last_allocated_language = \c_syst_min_allocated_language % not used in context
\countdef \c_syst_last_allocated_insertion = 42 \c_syst_last_allocated_insertion = \c_syst_min_allocated_insert
\countdef \c_syst_last_allocated_family = 43 \c_syst_last_allocated_family = \c_syst_min_allocated_family % not used in context
-\countdef \c_syst_last_allocated_attribute = 44 \c_syst_last_allocated_attribute = \c_syst_min_allocated_attribute
+\countdef \c_syst_last_allocated_attribute = 44 \c_syst_last_allocated_attribute = \c_syst_min_allocated_attribute % not used in context
\countdef \c_syst_min_counter_value = 125 \c_syst_min_counter_value = -"7FFFFFFF % beware, we use index 125 at the lua end
\countdef \c_syst_max_counter_value = 126 \c_syst_max_counter_value = "7FFFFFFF % beware, we use index 126 at the lua end
@@ -328,7 +323,7 @@
\newcount\scratchcounterone \newcount\scratchcountertwo \newcount\scratchcounterthree
\newdimen \scratchdimenone \newdimen \scratchdimentwo \newdimen \scratchdimenthree
\newskip \scratchskipone \newskip \scratchskiptwo \newskip \scratchskipthree
-\newbox \scratchmuskipone \newbox \scratchmuskiptwo \newbox \scratchmuskipthree
+\newmuskip\scratchmuskipone \newmuskip\scratchmuskiptwo \newmuskip\scratchmuskipthree
\newtoks \scratchtoksone \newtoks \scratchtokstwo \newtoks \scratchtoksthree
\newbox \scratchboxone \newbox \scratchboxtwo \newbox \scratchboxthree
@@ -386,6 +381,8 @@
\newmuskip\zeromuskip \zeromuskip = 0mu
\newmuskip\onemuskip \onemuskip = 1mu
+\newmuskip\muquad \muquad = 18mu
+
\let\points \onepoint
\let\halfpoint\halfapoint
@@ -417,6 +414,7 @@
\chardef \plustwentythousand = 20000
\chardef \medcard = 32768
\chardef \maxcard = 65536 % pdftex has less mathchars
+\chardef \maxcardminusone = 65535
%D \macros
%D {doubleexpandafter,tripleexpandafter,expanded,startexpanded}
@@ -631,6 +629,8 @@
%D
%D In \LUATEX\ we have ways around this.
+% no longer \errorstopmode cf. plain tex 3.141592653
+
\normalprotected\def\tracingall
{\tracingonline \plusone
\tracingcommands \plusthree
@@ -647,8 +647,7 @@
\tracingifs \plusone
\tracingscantokens\plusone
\tracingnesting \plusone
- \tracingassigns \plustwo
- \errorstopmode}
+ \tracingassigns \plustwo}
\normalprotected\def\loggingall
{\tracingall
@@ -766,8 +765,8 @@
\normalprotected\def\newfraction#1{\let#1\!!plusone}
-%D It would be handy to have a primitive \unless\ifcase because then we could
-%D use nicer values. Anyhow, this conditional code used to be in the \type
+%D It would be handy to have a primitive \type {\unless\ifcase} because then we
+%D could use nicer values. Anyhow, this conditional code used to be in the \type
%D {syst-aux} module but is now promoted to here.
%D \macros
@@ -1016,12 +1015,18 @@
% \bindprimitive ifabsnum ifpdfabsnum
%D We need to make sure that we start up in \DVI\ mode, so, after testing for running
-%D \PDFTEX, we default to \DVI.
-
-\pdfoutput \zerocount
-\pdfminorversion \plusfive
-\pdfgentounicode \plusone
-\pdfinclusioncopyfonts\plusone
+%D \PDFTEX, we default to \DVI. Why?
+
+\pdfoutput \zerocount
+\pdfminorversion \plusseven
+\pdfgentounicode \plusone
+\pdfinclusioncopyfonts \plusone
+\pdfinclusionerrorlevel \zerocount
+\pdfdecimaldigits \plusten
+\pdfhorigin 1 true in
+\pdfvorigin \pdfhorigin
+\pdfimageresolution 300
+\pdfpkresolution 600
\normalprotected\def\nopdfcompression {\pdfobjcompresslevel\zerocount \pdfcompresslevel\zerocount}
\normalprotected\def\maximumpdfcompression{\pdfobjcompresslevel\plusnine \pdfcompresslevel\plusnine }
@@ -1084,6 +1089,12 @@
\voffset\zeropoint \let\voffset\relax \newdimen\voffset % prevent messing up
\hoffset\zeropoint \let\hoffset\relax \newdimen\hoffset % prevent messing up
+%D Handy.
+
+\suppresslongerror \plusone
+\suppressoutererror \plusone
+\suppressmathparerror \plusone
+
%D While cleaning this code up a bit I was listening to Heather Nova's \CD\ Redbird.
%D The first song on that \CD\ ends with a few lines suitable for ending this
%D initialization module:
@@ -1101,4 +1112,21 @@
%D
%D So let's see what \TEX\ can do now that we've opened up the basic machinery.
+%D Now we define a few helpers that we need in a very early stage. We hav eno message system
+%D yet but redundant definitions are fatal anyway.
+
+\newcount\c_syst_helpers_n_of_namespaces \c_syst_helpers_n_of_namespaces\pluseight % 1-8 reserved for catcodes
+
+\def\v_interfaces_prefix_template_system{\number \c_syst_helpers_n_of_namespaces>>}
+%def\v_interfaces_prefix_template_system{\characters\c_syst_helpers_n_of_namespaces>>} % no \characters yet
+
+\normalprotected\def\installsystemnamespace#1%
+ {\ifcsname ??#1\endcsname
+ \immediate\write16{fatal error: duplicate system namespace '#1'}%
+ \expandafter\normalend
+ \else
+ \global\advance\c_syst_helpers_n_of_namespaces\plusone
+ \expandafter\edef\csname ??#1\endcsname{\v_interfaces_prefix_template_system}%
+ \fi}
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/syst-lua.lua b/Master/texmf-dist/tex/context/base/syst-lua.lua
index cd7dcc062c5..a6665f4104a 100644
--- a/Master/texmf-dist/tex/context/base/syst-lua.lua
+++ b/Master/texmf-dist/tex/context/base/syst-lua.lua
@@ -6,16 +6,28 @@ if not modules then modules = { } end modules ['syst-lua'] = {
license = "see context related readme files"
}
-local format, find, match, rep = string.format, string.find, string.match, string.rep
+local find, match = string.find, string.match
local tonumber = tonumber
-local S, lpegmatch, lpegtsplitat = lpeg.S, lpeg.match, lpeg.tsplitat
+local S, C, P, lpegmatch, lpegtsplitat = lpeg.S, lpeg.C, lpeg.P, lpeg.match, lpeg.tsplitat
-commands = commands or { }
-local commands = commands
-local context = context
+commands = commands or { }
+local commands = commands
-function commands.writestatus(...) logs.status(...) end -- overloaded later
+local implement = interfaces.implement
+
+local two_strings = interfaces.strings[2]
+
+local context = context
+local csprint = context.sprint
+
+local prtcatcodes = tex.prtcatcodes
+
+implement { -- will b eoverloaded later
+ name = "writestatus",
+ arguments = two_strings,
+ actions = logs.status,
+}
local ctx_firstoftwoarguments = context.firstoftwoarguments -- context.constructcsonly("firstoftwoarguments" )
local ctx_secondoftwoarguments = context.secondoftwoarguments -- context.constructcsonly("secondoftwoarguments")
@@ -30,24 +42,60 @@ local ctx_gobbleoneargument = context.gobbleoneargument -- context.constru
function commands.doifelse(b)
if b then
ctx_firstoftwoarguments()
+-- csprint(prtcatcodes,[[\ui_ft]]) -- ctx_firstoftwoarguments
+ else
+ ctx_secondoftwoarguments()
+-- csprint(prtcatcodes,[[\ui_st]]) -- ctx_secondoftwoarguments
+ end
+end
+
+function commands.doifelsesomething(b)
+ if b and b ~= "" then
+ ctx_firstoftwoarguments()
+-- csprint(prtcatcodes,[[\ui_ft]]) -- ctx_firstoftwoarguments
else
ctx_secondoftwoarguments()
+-- csprint(prtcatcodes,[[\ui_st]]) -- ctx_secondoftwoarguments
end
end
function commands.doif(b)
if b then
ctx_firstofoneargument()
+-- context.__flushdirect(prtcatcodes,[[\ui_fo]]) -- ctx_firstofonearguments
+ else
+ ctx_gobbleoneargument()
+-- context.__flushdirect(prtcatcodes,[[\ui_go]]) -- ctx_gobbleonearguments
+ end
+end
+
+function commands.doifsomething(b)
+ if b and b ~= "" then
+ ctx_firstofoneargument()
+-- context.__flushdirect(prtcatcodes,[[\ui_fo]]) -- ctx_firstofonearguments
else
ctx_gobbleoneargument()
+-- context.__flushdirect(prtcatcodes,[[\ui_go]]) -- ctx_gobbleonearguments
end
end
function commands.doifnot(b)
if b then
ctx_gobbleoneargument()
+-- csprint(prtcatcodes,[[\ui_go]]) -- ctx_gobbleonearguments
+ else
+ ctx_firstofoneargument()
+-- csprint(prtcatcodes,[[\ui_fo]]) -- ctx_firstofonearguments
+ end
+end
+
+function commands.doifnotthing(b)
+ if b and b ~= "" then
+ ctx_gobbleoneargument()
+-- csprint(prtcatcodes,[[\ui_go]]) -- ctx_gobbleonearguments
else
ctx_firstofoneargument()
+-- csprint(prtcatcodes,[[\ui_fo]]) -- ctx_firstofonearguments
end
end
@@ -68,7 +116,7 @@ end
local s = lpegtsplitat(",")
local h = { }
-function commands.doifcommonelse(a,b) -- often the same test
+local function doifelsecommon(a,b) -- often the same test
local ha = h[a]
local hb = h[b]
if not ha then
@@ -92,7 +140,7 @@ function commands.doifcommonelse(a,b) -- often the same test
ctx_secondoftwoarguments()
end
-function commands.doifinsetelse(a,b)
+local function doifelseinset(a,b)
local hb = h[b]
if not hb then hb = lpegmatch(s,b) h[b] = hb end
for i=1,#hb do
@@ -104,9 +152,21 @@ function commands.doifinsetelse(a,b)
ctx_secondoftwoarguments()
end
+implement {
+ name = "doifelsecommon",
+ arguments = two_strings,
+ actions = doifelsecommon
+}
+
+implement {
+ name = "doifelseinset",
+ arguments = two_strings,
+ actions = doifelseinset
+}
+
local pattern = lpeg.patterns.validdimen
-function commands.doifdimenstringelse(str)
+function commands.doifelsedimenstring(str)
if lpegmatch(pattern,str) then
ctx_firstoftwoarguments()
else
@@ -114,11 +174,70 @@ function commands.doifdimenstringelse(str)
end
end
-function commands.firstinset(str)
- local first = match(str,"^([^,]+),")
- context(first or str)
-end
+local p_first = C((1-P(",")-P(-1))^0)
-function commands.ntimes(str,n)
- context(rep(str,n or 1))
-end
+implement {
+ name = "firstinset",
+ arguments = "string",
+ actions = function(str) context(lpegmatch(p_first,str or "")) end
+}
+
+implement {
+ name = "ntimes",
+ arguments = { "string", "integer" },
+ actions = { string.rep, context }
+}
+
+implement {
+ name = "execute",
+ arguments = "string",
+ actions = os.execute -- wrapped in sandbox
+}
+
+-- function commands.write(n,str)
+-- if n == 18 then
+-- os.execute(str)
+-- elseif n == 16 then
+-- -- immediate
+-- logs.report(str)
+-- else
+-- -- at the tex end we can still drop the write / also delayed vs immediate
+-- context.writeviatex(n,str)
+-- end
+-- end
+
+implement {
+ name = "doifelsesame",
+ arguments = two_strings,
+ actions = function(a,b)
+ if a == b then
+ ctx_firstoftwoarguments()
+ else
+ ctx_secondoftwoarguments()
+ end
+ end
+}
+
+implement {
+ name = "doifsame",
+ arguments = two_strings,
+ actions = function(a,b)
+ if a == b then
+ ctx_firstofoneargument()
+ else
+ ctx_gobbleoneargument()
+ end
+ end
+}
+
+implement {
+ name = "doifnotsame",
+ arguments = two_strings,
+ actions = function(a,b)
+ if a == b then
+ ctx_gobbleoneargument()
+ else
+ ctx_firstofoneargument()
+ end
+ end
+}
diff --git a/Master/texmf-dist/tex/context/base/syst-lua.mkiv b/Master/texmf-dist/tex/context/base/syst-lua.mkiv
index 88a8c246e26..5e82a9ea9e7 100644
--- a/Master/texmf-dist/tex/context/base/syst-lua.mkiv
+++ b/Master/texmf-dist/tex/context/base/syst-lua.mkiv
@@ -15,15 +15,18 @@
\unprotect
-\def\expdoifelse#1#2{\ctxcommand{doifelse(\!!bs#1\!!es==\!!bs#2\!!es)}}
-\def\expdoif #1#2{\ctxcommand{doif (\!!bs#1\!!es==\!!bs#2\!!es)}}
-\def\expdoifnot #1#2{\ctxcommand{doifnot (\!!bs#1\!!es==\!!bs#2\!!es)}}
+\def\expdoifelse#1#2{\clf_doifelsesame{#1}{#2}}
+\def\expdoif #1#2{\clf_doifsame {#1}{#2}}
+\def\expdoifnot #1#2{\clf_doifnotsame {#1}{#2}}
% \testfeatureonce{100000}{\doifelse{hello world}{here i am}{}} % 0.3
% \testfeatureonce{100000}{\expandabledoifelse{hello world}{here i am}{}} % 1.5
-\def\expdoifcommonelse#1#2{\ctxcommand{doifcommonelse("#1","#2")}}
-\def\expdoifinsetelse #1#2{\ctxcommand{doifinsetelse("#1","#2")}}
+\def\expdoifelsecommon#1#2{\clf_doifelsecommon{#1}{#2}}
+\def\expdoifelseinset #1#2{\clf_doifelseinset {#1}{#2}}
+
+\def\expdoifcommonelse\expdoifelsecommon
+\def\expdoifinsetelse \expdoifelseinset
% we define these here, just in case ...
@@ -32,7 +35,7 @@
\edef\!!bs{[\luastringsep[}
\edef\!!es{]\luastringsep]}
-\unexpanded\def\writestatus#1#2{\ctxcommand{writestatus(\!!bs#1\!!es,\!!bs#2\!!es)}}
+\unexpanded\def\writestatus#1#2{\clf_writestatus{#1}{#2}}
% A handy helper:
@@ -41,7 +44,7 @@
% We can omit the tex.ctxcatcodes here as nowadays we seldom
% change the regime at the \TEX\ end:
-\def\luaexpr#1{\directlua{tex.print(tostring(#1))}}
+\def\luaexpr#1{\ctxlua{tex.print(tostring(#1))}} % no use is shortcutting has to be compiled
% helpers:
@@ -50,4 +53,49 @@
\def\ui_ft#1#2{#1}
\def\ui_st#1#2{#2}
+%D Let's bring this under \LUA\ (and therefore \MKIV\ sandbox) control:
+
+% \setnewconstant\c_syst_write 18
+%
+% \unexpanded\def\write#1#% so we can handle \immediate
+% {\ifnum#1=\c_syst_write
+% \expandafter\syst_execute
+% \else
+% \normalwrite#1%
+% \fi}
+%
+% \unexpanded\def\syst_execute#1%
+% {\ctxlua{os.execute(\!!bs#1\!!es)}}
+
+%D But as we only use write 16 we could as well do all in \LUA\
+%D and ignore the rest. Okay, we still can do writes here but only
+%D when not blocked.
+
+% Nicer would be if we could just disable write 18 and keep os.execute
+% which in fact we can do by defining write18 as macro instead of
+% primitive ... todo.
+
+% \unexpanded\def\write#1#%
+% {\syst_write{#1}}
+%
+% \def\syst_write#1#2%
+% {\ctxcommand{write(\number#1,\!!bs\normalunexpanded{#2}\!!es)}}
+%
+% \unexpanded\def\writeviatex#1#2%
+% {\ifx\normalwrite\relax\else
+% \normalwrite#1{#2}%
+% \fi}
+
+% we have no way yet to pickup \immediate unless we redefine it
+% we assume immediate execution
+
+\let\syst_write_execute\clf_execute % always {...}
+
+\unexpanded\def\write#1#%
+ {\ifnum#1=18
+ \expandafter\syst_write_execute
+ \else
+ \normalwrite#1%
+ \fi}
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/syst-rtp.mkiv b/Master/texmf-dist/tex/context/base/syst-rtp.mkiv
index f65e599eca5..82c0778b43f 100644
--- a/Master/texmf-dist/tex/context/base/syst-rtp.mkiv
+++ b/Master/texmf-dist/tex/context/base/syst-rtp.mkiv
@@ -13,6 +13,6 @@
\unprotect
-\def\executesystemcommand#1{\ctxlua{os.execute([[#1]])}}
+\let\executesystemcommand\clf_execute
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/tabl-ltb.mkiv b/Master/texmf-dist/tex/context/base/tabl-ltb.mkiv
index f7fbc0390df..4c892138e82 100644
--- a/Master/texmf-dist/tex/context/base/tabl-ltb.mkiv
+++ b/Master/texmf-dist/tex/context/base/tabl-ltb.mkiv
@@ -138,6 +138,8 @@
\expandafter\secondoftwoarguments
\fi}
+\let\doiflinetablecparameterelse\doifelselinetablecparameter
+
\def\linetablecparameter#1%
{\csname
\ifcsname\??lec\number\linetablecolumn#1\endcsname
@@ -614,7 +616,7 @@
{\global\linetablepage\zerocount
\ifcase\linetablerepeat \else \ifcase\linetablepage
\doif{\linetableparameter\c!repeat}\v!no
- {\global\linetablepage\doifoddpageelse\plusone\plustwo}%
+ {\global\linetablepage\doifelseoddpage\plusone\plustwo}%
\fi \fi}
\def\flushlinetablehead
diff --git a/Master/texmf-dist/tex/context/base/tabl-ntb.mkii b/Master/texmf-dist/tex/context/base/tabl-ntb.mkii
index 465ed44b21f..fbf43eb1edc 100644
--- a/Master/texmf-dist/tex/context/base/tabl-ntb.mkii
+++ b/Master/texmf-dist/tex/context/base/tabl-ntb.mkii
@@ -423,7 +423,9 @@
\ifcsname\@@tblprefix\c!x\positivecol\c!y\positiverow\endcsname\csname\@@tblprefix\c!x\positivecol\c!y\positiverow\endcsname\fi
\ifcsname\@@tblprefix\c!x\negativecol\c!y\negativerow\endcsname\csname\@@tblprefix\c!x\negativecol\c!y\negativerow\endcsname\fi
% done
- \global\letcscsname\@@tblsplitafter\csname\@@tbl\@@tbl\c!after\endcsname
+ \global\letcscsname\@@tblsplitafter \csname\@@tbl\@@tbl\c!after \endcsname
+ \global\letcscsname\@@tblsplitbefore \csname\@@tbl\@@tbl\c!before \endcsname
+ \global\letcscsname\@@tblsplitsamepage\csname\@@tbl\@@tbl\c!samepage\endcsname
\relax}
% we cannot use +n (checking on number/last/first would slow down too much)
@@ -439,7 +441,9 @@
% \dorecurse{10}{\bTR \dorecurse{6}{\bTD xxx \eTD} \eTR}
% \eTABLE
-\globallet\@@tblsplitafter\relax
+\globallet\@@tblsplitafter \relax
+\globallet\@@tblsplitbefore \relax
+\globallet\@@tblsplitsamepage\relax
% split + page:
%
@@ -851,7 +855,17 @@
{\noalign
{\global\advance\tblrow\plusone
\global\tblcol\zerocount
- \global\tblspn\zerocount}%
+ \global\tblspn\zerocount
+ \bgroup % protect local vars
+ \@@tblsplitbefore
+ \egroup
+ \ifx\@@tblsplitsamepage\v!before
+ \unpenalty
+ \nobreak
+ \else\ifx\@@tblsplitsamepage\v!both
+ \unpenalty
+ \nobreak
+ \fi\fi}%
\nexttblcol
\kern\dimexpr\tbltblleftmargindistance-\tbltblcolumndistance\relax}
@@ -862,7 +876,14 @@
{\nointerlineskip
\ifnum\tblrow>\noftblheadlines
\ifnum\gettblnob\tblrow=\zerocount
- \allowbreak
+ \unpenalty
+ \ifx\@@tblsplitsamepage\v!after
+ \nobreak
+ \else\ifx\@@tblsplitsamepage\v!both
+ \nobreak
+ \else
+ \allowbreak
+ \fi\fi
\fi
\else
\allowbreak % else no proper head split off
diff --git a/Master/texmf-dist/tex/context/base/tabl-ntb.mkiv b/Master/texmf-dist/tex/context/base/tabl-ntb.mkiv
index a7a7ae50bc7..2b6f3a3ecf6 100644
--- a/Master/texmf-dist/tex/context/base/tabl-ntb.mkiv
+++ b/Master/texmf-dist/tex/context/base/tabl-ntb.mkiv
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-%D This module as a more modern variant in xtables but as we follow a bit
+%D This module has a more modern variant in xtables but as we follow a bit
%D different approach with settings there, this mechanism will stay. In fact
%D each of them has its advantages. This module could be sped up a bit and made
%D more efficient by delegating some housekeeping to \LUA\ but it's not worth
@@ -19,8 +19,14 @@
%D real purpose in it. If needed I can squeeze out a few more percentages
%D runtime.
+% columndistance 'optimized' ... needs checking
+%
+% we don't need the alignment mechanism .. we can just pack the row in a box
+
\writestatus{loading}{ConTeXt Table Macros / Natural Tables}
+% sometimes this helps (with nc going wild): \setupTABLE[maxwidth=100cm]
+%
% bug: width 3cm is not honored and column becomes too wide
% as given width is added to distributed width
%
@@ -98,7 +104,7 @@
\to \t_tabl_ntb_cell_start
\unexpanded\def\tabl_ntb_cell_start
- {\inhibitblank
+ {% \inhibitblank
\dotagTABLEcell
%\tabl_ntb_next_level
\usenaturaltablelocalstyleandcolor\c!style\c!color
@@ -145,6 +151,9 @@
\newcount\c_tabl_ntb_maximum_row_span
\newcount\c_tabl_ntb_maximum_col_span
+\newcount\c_tabl_ntb_encountered_col
+\newcount\c_tabl_ntb_encountered_max
+
\newtoks\t_tabl_ntb
\newtoks\t_tabl_ntb_row
@@ -162,6 +171,11 @@
\newdimen\d_tabl_ntb_height
\newdimen\d_tabl_ntb_width
+\newdimen\d_tabl_ntb_leftmargindistance
+\newdimen\d_tabl_ntb_rightmargindistance
+\newdimen\d_tabl_ntb_columndistance
+\newdimen\d_tabl_ntb_maxwidth
+
\newtoks\everyTABLEpass % public
\newcount\tablecellrows % public (needs checking)
@@ -208,6 +222,8 @@
\installdirectcommandhandler \??naturaltable {naturaltable} % \??naturaltable
\installsimpleframedcommandhandler \??naturaltablelocal {naturaltablelocal} \??naturaltablelocal
+\installcorenamespace{naturaltabletal}
+\installcorenamespace{naturaltablegal}
\installcorenamespace{naturaltablenob}
\installcorenamespace{naturaltabletag}
\installcorenamespace{naturaltablecol}
@@ -219,11 +235,26 @@
\installcorenamespace{naturaltablehei}
\installcorenamespace{naturaltabledis}
\installcorenamespace{naturaltableaut}
+\installcorenamespace{naturaltablefwd} % forcedwidth
\installcorenamespace{naturaltabletxt}
\installcorenamespace{naturaltablespn}
\installcorenamespace{naturaltableref}
\installcorenamespace{naturaltableset}
\installcorenamespace{naturaltablecell}
+\installcorenamespace{naturaltablesqueeze}
+\installcorenamespace{naturaltabletok}
+
+\letvalue{\??naturaltablesqueeze }\donefalse
+\letvalue{\??naturaltablesqueeze\v!fit }\donetrue
+\letvalue{\??naturaltablesqueeze\v!fixed}\donetrue
+\letvalue{\??naturaltablesqueeze\v!broad}\donetrue
+\letvalue{\??naturaltablesqueeze\v!local}\donetrue
+
+\def\tabl_ntb_let_gal{\global\expandafter\let\csname\??naturaltablegal\m_tabl_tbl_level\endcsname}
+\def\tabl_ntb_get_gal{\csname\??naturaltablegal\m_tabl_tbl_level\endcsname}
+
+\def\tabl_ntb_let_tal#1{\global\expandafter\let\csname\??naturaltabletal\m_tabl_tbl_level:\number#1\endcsname}
+\def\tabl_ntb_get_tal#1{\csname\??naturaltabletal\m_tabl_tbl_level:\number#1\endcsname}
\def\tabl_ntb_set_nob#1{\expandafter\let\csname\??naturaltablenob\m_tabl_tbl_level:\number#1\endcsname\plusone}
\def\tabl_ntb_get_nob#1{\ifcsname\??naturaltablenob\m_tabl_tbl_level:\number#1\endcsname\plusone\else\zerocount\fi}
@@ -281,15 +312,22 @@
% \def\tabl_ntb_row_state#1#2{\ifcsname\??naturaltablerow\m_tabl_tbl_level:\number#1:\number#2\endcsname\zerocount\else\plusone\fi}
% \def\tabl_ntb_col_state#1#2{\ifcsname\??naturaltablecol\m_tabl_tbl_level:\number#1:\number#2\endcsname\zerocount\else\plusone\fi}
-\def\tabl_ntb_set_spn #1{\expandafter\let\csname\??naturaltablespn\m_tabl_tbl_level:\number#1\endcsname \!!plusone}
-\def\tabl_ntb_spn_doifelse#1{\doifelse {\csname\??naturaltablespn\m_tabl_tbl_level:\number#1\endcsname}\!!plusone}
+%def\tabl_ntb_set_spn #1{\expandafter\let\csname\??naturaltablespn\m_tabl_tbl_level:\number#1\endcsname \!!plusone}
+%def\tabl_ntb_spn_doifelse#1{\doifelse {\csname\??naturaltablespn\m_tabl_tbl_level:\number#1\endcsname}\!!plusone}
+
+%def\tabl_ntb_set_spn #1{\setvalue {\??naturaltablespn\m_tabl_tbl_level:\number#1}{1}}
+%def\tabl_ntb_spn_doifelse#1{\doifelsevalue{\??naturaltablespn\m_tabl_tbl_level:\number#1}{1}}
-\def\tabl_ntb_set_spn #1{\setvalue {\??naturaltablespn\m_tabl_tbl_level:\number#1}{1}}
-\def\tabl_ntb_spn_doifelse#1{\doifelsevalue{\??naturaltablespn\m_tabl_tbl_level:\number#1}{1}}
+\def\tabl_ntb_let_ref #1#2{\expandafter\glet\csname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname}
+\def\tabl_ntb_set_ref #1#2{\expandafter\xdef\csname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname}
+\def\tabl_ntb_get_ref #1#2{\ifcsname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname\csname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname\fi}
-\def\tabl_ntb_let_ref#1#2{\expandafter\glet\csname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname}
-\def\tabl_ntb_set_ref#1#2{\expandafter\xdef\csname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname}
-\def\tabl_ntb_get_ref#1#2{\ifcsname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname\csname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname\fi}
+\def\tabl_ntb_set_spn #1{\expandafter\let\csname\??naturaltablespn\m_tabl_tbl_level:\number#1\endcsname \!!plusone}
+\def\tabl_ntb_spn_doifelse#1{\ifcase0\csname\??naturaltablespn\m_tabl_tbl_level:\number#1\endcsname\relax % could be inlined
+ \expandafter\secondoftwoarguments % unset
+ \else
+ \expandafter\firstoftwoarguments % a span
+ \fi}
% keep for a while:
%
@@ -317,6 +355,7 @@
\newif\ifenableTBLbreak \enableTBLbreakfalse
\newif\ifmultipleTBLheads \multipleTBLheadsfalse
\newif\iftightTBLrowspan \tightTBLrowspantrue
+\newif\iftightTBLcolspan \tightTBLcolspanfalse
\newif\iftraceTABLE \traceTABLEfalse
@@ -549,7 +588,6 @@
% local
\ifcsname\m_tabl_ntb_prefix\c!y++\m_tabl_ntb_positive_row\endcsname\csname\m_tabl_ntb_prefix\c!y++\m_tabl_ntb_positive_row\endcsname\fi
% done
- \xdef\m_tabl_ntb_after_split{\naturaltablelocalparameter\c!after}% to be checked
\relax}
% we cannot use +n (checking on number/last/first would slow down too much)
@@ -565,7 +603,9 @@
% \dorecurse{10}{\bTR \dorecurse{6}{\bTD xxx \eTD} \eTR}
% \eTABLE
-\let\m_tabl_ntb_after_split\relax
+\let\m_tabl_ntb_before_split\empty
+\let\m_tabl_ntb_after_split \empty
+\let\m_tabl_ntb_same_page \empty
% split + page:
%
@@ -577,6 +617,7 @@
\unexpanded\def\tabl_ntb_tr
{\c_tabl_ntb_running_col\zerocount
+ \c_tabl_ntb_encountered_col\zerocount
\advance\c_tabl_ntb_maximum_row\plusone
\iffirstargument
\expandafter\tabl_ntb_tr_yes
@@ -591,7 +632,8 @@
\def\m_tabl_ntb_default_nc{\naturaltableparameter\c!nc}
\unexpanded\def\tabl_ntb_td
- {\iffirstargument
+ {\advance\c_tabl_ntb_encountered_col\plusone
+ \iffirstargument
\expandafter\tabl_ntb_td_yes
\else
\expandafter\tabl_ntb_td_nop
@@ -651,7 +693,10 @@
% save text
\normalexpanded
{\tabl_ntb_set_txt_process\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col{\the\c_tabl_ntb_maximum_row}{\the\c_tabl_ntb_running_col}}%
- {#1}{#2}}
+ {#1}{#2}%
+ \ifnum\c_tabl_ntb_encountered_col>\c_tabl_ntb_encountered_max
+ \c_tabl_ntb_encountered_max\c_tabl_ntb_encountered_col
+ \fi}
\def\tabl_ntb_td_nop[#1]#2\eTD
{\global\advance\c_tabl_ntb_spn\plusone\relax
@@ -671,7 +716,10 @@
\tabl_ntb_let_ref\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col\empty
\normalexpanded
{\tabl_ntb_set_txt_process\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col{\the\c_tabl_ntb_maximum_row}{\the\c_tabl_ntb_running_col}}%
- {#1}{#2}}
+ {#1}{#2}%
+ \ifnum\c_tabl_ntb_encountered_col>\c_tabl_ntb_encountered_max
+ \c_tabl_ntb_encountered_max\c_tabl_ntb_encountered_col
+ \fi}
\def\tabl_ntb_td_pass_n#1%
{\scratchcounter\numexpr\m_tabl_ntb_n-\c_tabl_ntb_running_col+\minusone-\c_tabl_ntb_spn\relax
@@ -850,10 +898,20 @@
\ifhmode\kern\zeropoint\fi % blocks \removeunwantedspaces: check this on icare handelingsschema
\resetcharacteralign % new
\setupcurrentnaturaltablelocal[\c!align={\v!right,\v!broad,\v!high},#1]%
+ %
+ \d_tabl_ntb_leftmargindistance \naturaltablelocalparameter\c!leftmargindistance\relax
+ \d_tabl_ntb_rightmargindistance\naturaltablelocalparameter\c!rightmargindistance\relax
+ \d_tabl_ntb_columndistance \naturaltablelocalparameter\c!columndistance\relax
+ \d_tabl_ntb_maxwidth \naturaltablelocalparameter\c!maxwidth\relax
+ %
\usesetupsparameter\naturaltablelocalparameter
\doifelse{\naturaltablelocalparameter\c!textwidth}\v!local
{\hsize\availablehsize}
{\hsize\naturaltablelocalparameter\c!textwidth}%
+ \enableTBLbreakfalse
+ \multipleTBLheadsfalse
+ \autoTBLspreadfalse
+ \tightTBLcolspanfalse
\processaction
[\naturaltablelocalparameter\c!split]
[ \v!yes=>\enableTBLbreaktrue,
@@ -865,7 +923,8 @@
\tabl_ntb_preset_parameters
\processallactionsinset
[\naturaltablelocalparameter\c!option]
- [\v!stretch=>\autoTBLspreadtrue]%
+ [\v!stretch=>\autoTBLspreadtrue,%
+ \v!tight=>\tightTBLcolspantrue]%
\linewidth\naturaltablelocalparameter\c!rulethickness % needs to be frozen
\dontcomplain
\c_tabl_ntb_running_col \zerocount
@@ -905,10 +964,10 @@
\unexpanded\def\eTABLE % beware, we need to get rid of spurious spaces when in hmode
{% tricky and dirty order -)
- \doifsometokselse\t_tabl_ntb_head % slow, better a flag
+ \doifelsesometoks\t_tabl_ntb_head % slow, better a flag
{\the\t_tabl_ntb_head
\c_tabl_ntb_n_of_head_lines\c_tabl_ntb_maximum_row\relax
- \doifsometokselse\t_tabl_ntb_next
+ \doifelsesometoks\t_tabl_ntb_next
{\the\t_tabl_ntb_next
\c_tabl_ntb_n_of_next_lines\numexpr\c_tabl_ntb_maximum_row-\c_tabl_ntb_n_of_head_lines\relax}%
{\c_tabl_ntb_n_of_next_lines\zerocount}% was 1
@@ -1013,7 +1072,7 @@
\ifautoTBLemptycell
\normalexpanded
{\tabl_ntb_set_txt_process\c_tabl_ntb_current_row\c_tabl_ntb_current_col{\the\c_tabl_ntb_current_row}{\the\c_tabl_ntb_current_col}}%
- {}{\strut}%
+ {\c!option=\v!tight}{\strut\kern\scaledpoint}% the kern forces the tight
\fi}
\def\tabl_ntb_loop_two
@@ -1045,79 +1104,179 @@
\newcount\c_tabl_prelocated_rows % \prelocateTBLrows{1000} may speed up large tables
-\def\tabl_ntb_row_start{\t_tabl_ntb_row\emptytoks}
-\def\tabl_ntb_row_stop {\normalexpanded{\t_tabl_ntb{\the\t_tabl_ntb\noexpand\tabl_ntb_row_align_start\the\t_tabl_ntb_row\tabl_ntb_row_align_stop}}}
+% \def\tabl_ntb_row_start{\t_tabl_ntb_row\emptytoks}
+% \def\tabl_ntb_row_stop {\normalexpanded{\t_tabl_ntb{\the\t_tabl_ntb\noexpand\tabl_ntb_row_align_start\the\t_tabl_ntb_row\tabl_ntb_row_align_stop}}}
+
+\def\tabl_ntb_row_start
+ {\t_tabl_ntb_row\emptytoks}
+
+\def\tabl_ntb_row_stop
+ {\ifenableTBLbreak
+ \tabl_ntb_row_stop_split
+ \else
+ \tabl_ntb_row_stop_boxed
+ \fi}
+
+\def\tabl_ntb_row_stop_boxed
+ {% \noindent % no, else double leftskip in narrower
+ \normalexpanded
+ {\t_tabl_ntb
+ {\the\t_tabl_ntb
+ % no need for init
+ \tabl_ntb_row_align_start
+ \the\t_tabl_ntb_row
+ \tabl_ntb_row_align_stop}}}
+
+\def\tabl_ntb_row_stop_split
+ {\ifcsname\??naturaltableset\m_tabl_tbl_level:\c!y++\the\c_tabl_ntb_current_row\endcsname
+ \tabl_ntb_row_stop_split_yes
+ \else
+ \tabl_ntb_row_stop_split_nop
+ \fi}
+
+\def\tabl_ntb_row_stop_split_nop
+ {\normalexpanded
+ {\t_tabl_ntb
+ {\the\t_tabl_ntb
+ \tabl_ntb_row_align_reset
+ \tabl_ntb_row_align_start
+ \the\t_tabl_ntb_row
+ \tabl_ntb_row_align_stop}}}
+
+\def\tabl_ntb_row_stop_split_yes
+ {\begingroup
+ \csname\??naturaltableset\m_tabl_tbl_level:\c!y++\the\c_tabl_ntb_current_row\endcsname
+ \xdef\m_tabl_ntb_before_split{\naturaltablelocalparameter\c!before}% to be checked
+ \xdef\m_tabl_ntb_after_split {\naturaltablelocalparameter\c!after}% to be checked
+ \xdef\m_tabl_ntb_same_page {\naturaltablelocalparameter\c!samepage}%
+ \endgroup
+ \normalexpanded
+ {\t_tabl_ntb
+ {\the\t_tabl_ntb
+ \tabl_ntb_row_align_set{\m_tabl_ntb_before_split}{\m_tabl_ntb_after_split}{\m_tabl_ntb_same_page}%
+ \tabl_ntb_row_align_start
+ \the\t_tabl_ntb_row
+ \tabl_ntb_row_align_stop}}}
+
+\unexpanded\def\tabl_ntb_row_align_set#1#2#3%
+ {\xdef\m_tabl_ntb_before_split{#1}%
+ \xdef\m_tabl_ntb_after_split {#2}%
+ \xdef\m_tabl_ntb_same_page {#3}}
+
+\unexpanded\def\tabl_ntb_row_align_reset
+ {\global\let\m_tabl_ntb_before_split\empty
+ \global\let\m_tabl_ntb_after_split \empty
+ \global\let\m_tabl_ntb_same_page \empty}
\def\tabl_ntb_prelocate_error
{\writestatus\m!system{fatal error: use \string\prelocateTBLrows\space to increase table memory (now: \the\c_tabl_prelocated_rows)}}
% \prelocateTBLrows{1000} % may speed up large tables
-\installcorenamespace{naturaltabletok}
-
\def\prelocateTBLrows#1% we start at zero so we have one to much, better play safe anyway
- {\dostepwiserecurse\c_tabl_prelocated_rows{#1}\plusone{\expandafter\newtoks\csname\??naturaltabletok\recurselevel\endcsname}%
+ {\dostepwiserecurse\c_tabl_prelocated_rows{#1}\plusone
+ {\expandafter\newtoks\csname\??naturaltabletok\recurselevel\endcsname}%
\def\tabl_ntb_row_start
{\ifnum\c_tabl_ntb_row<\c_tabl_prelocated_rows\relax
- \expandafter\let\expandafter\t_tabl_ntb_row\csname\??naturaltabletok\the\c_tabl_ntb_row\endcsname\t_tabl_ntb_row\emptytoks
+ \tabl_ntb_prelocate_okay
\else
\tabl_ntb_prelocate_error
\fi}%
\def\tabl_ntb_row_stop
- {\normalexpanded{\t_tabl_ntb{\the\t_tabl_ntb\noexpand\tabl_ntb_row_align_start\the\csname\??naturaltabletok\the\c_tabl_ntb_row\endcsname\tabl_ntb_row_align_stop}}}%
+ {\normalexpanded
+ {\t_tabl_ntb
+ {\the\t_tabl_ntb
+ \tabl_ntb_row_align_start
+ \the\csname\??naturaltabletok\the\c_tabl_ntb_row\endcsname
+ \tabl_ntb_row_align_stop}}}%
\global\c_tabl_prelocated_rows#1\relax}
+\def\tabl_ntb_prelocate_okay
+ {\expandafter\let\expandafter\t_tabl_ntb_row\csname\??naturaltabletok\the\c_tabl_ntb_row\endcsname\t_tabl_ntb_row\emptytoks}
+
% We use aligments to handle the empty (skipped) columns, so
% that we don't have to (re|)|calculate these.
-\def\tabl_ntb_column_skip
- {\global\advance\c_tabl_ntb_col\plusone}
-
-\def\tabl_ntb_column_next
- {\global\advance\c_tabl_ntb_col\plusone
- \kern\naturaltablelocalparameter\c!columndistance
- \aligntab}
-
-\def\tabl_ntb_column_span
- {\span}
-
\let\m_tabl_ntb_saved_row\!!zerocount
\let\m_tabl_ntb_saved_col\!!zerocount
-\def\tabl_ntb_row_align_start
- {\noalign{\tabl_ntb_row_align_reset}%
- \tabl_ntb_column_next
- \kern\dimexpr\naturaltablelocalparameter\c!leftmargindistance-\naturaltablelocalparameter\c!columndistance\relax}
-
-\unexpanded\def\tabl_ntb_row_align_reset
+\unexpanded\def\tabl_ntb_row_align_start
{\global\advance\c_tabl_ntb_row\plusone
- \global\c_tabl_ntb_col\zerocount
- \global\c_tabl_ntb_spn\zerocount}
+ \global\c_tabl_ntb_col\plusone
+ \global\c_tabl_ntb_spn\zerocount
+ \tabl_ntb_row_align_start_inject
+ \dostarttagged\t!tablerow\empty
+ \hbox\bgroup
+ \kern\dimexpr\d_tabl_ntb_leftmargindistance\relax}
\unexpanded\def\tabl_ntb_row_align_stop
- {\kern\dimexpr\naturaltablelocalparameter\c!rightmargindistance-\naturaltablelocalparameter\c!columndistance\relax
- \crcr
- \noalign
- {\nointerlineskip
- \ifnum\c_tabl_ntb_row>\c_tabl_ntb_n_of_head_lines
- \ifnum\tabl_ntb_get_nob\c_tabl_ntb_row=\zerocount
- \allowbreak
- \fi
- \else
- \allowbreak % else no proper head split off
- \fi
- \bgroup % protect local vars
- \m_tabl_ntb_after_split
- \egroup
- \bgroup % protect local vars
- \scratchcounter\numexpr\c_tabl_ntb_row+\plusone\relax
- \ifnum\scratchcounter>\c_tabl_ntb_n_of_hdnx_lines\relax
- \ifnum\scratchcounter<\c_tabl_ntb_maximum_row\relax
- \doifsomething{\naturaltablelocalparameter\c!spaceinbetween}
- {\blank[\naturaltablelocalparameter\c!spaceinbetween]}%
- \fi
- \fi
- \egroup}}
+ {\kern\dimexpr\d_tabl_ntb_rightmargindistance-\d_tabl_ntb_columndistance\relax
+ \egroup
+ \dostoptagged
+ \tabl_ntb_row_align_stop_inject}
+
+\unexpanded\def\tabl_ntb_before_page
+ {\ifx\m_tabl_ntb_same_page\v!before
+ % \blank[\v!samepage,\v!strong]%
+ \unpenalty
+ \nobreak
+ \else\ifx\m_tabl_ntb_same_page\v!both
+ % \blank[\v!samepage,\v!strong]%
+ \unpenalty
+ \nobreak
+ \fi\fi}
+
+\unexpanded\def\tabl_ntb_after_page
+ {\ifnum\c_tabl_ntb_row>\c_tabl_ntb_n_of_head_lines
+ \ifnum\tabl_ntb_get_nob\c_tabl_ntb_row=\zerocount
+ \unpenalty
+ \ifx\m_tabl_ntb_same_page\v!after
+ % \blank[\v!samepage,\v!strong]%
+ \nobreak
+ \else\ifx\m_tabl_ntb_same_page\v!both
+ % \blank[\v!samepage,\v!strong]%
+ \nobreak
+ \else
+ % \blank[\v!preference,\v!weak]%
+ \allowbreak
+ \fi\fi
+ \fi
+ \else
+ % \blank[\v!preference,\v!weak]%
+ \allowbreak % else no proper head split off
+ \fi}
+
+\unexpanded\def\tabl_ntb_inbetween
+ {\scratchcounter\numexpr\c_tabl_ntb_row+\plusone\relax
+ \ifnum\scratchcounter>\c_tabl_ntb_n_of_hdnx_lines\relax
+ \ifnum\scratchcounter<\c_tabl_ntb_maximum_row\relax
+ \edef\p_spaceinbetween{\naturaltablelocalparameter\c!spaceinbetween}%
+ \ifx\p_spaceinbetween\empty\else
+ \blank[\p_spaceinbetween]%
+ \fi
+ \fi
+ \fi}
+
+\unexpanded\def\tabl_ntb_row_align_start_inject
+ {\bgroup % protect local vars
+ \m_tabl_ntb_before_split
+ \egroup
+ \ifenableTBLbreak
+ \tabl_ntb_before_page
+ \fi}
+
+\unexpanded\def\tabl_ntb_row_align_stop_inject
+ {\par
+ \nointerlineskip
+ \ifenableTBLbreak
+ \tabl_ntb_after_page
+ \fi
+ \bgroup % protect local vars
+ \m_tabl_ntb_after_split
+ \egroup
+ \bgroup % protect local vars
+ \tabl_ntb_inbetween
+ \egroup}
\def\tabl_ntb_flush_content
{\the\everyTABLEpass
@@ -1125,47 +1284,56 @@
\global\c_tabl_ntb_col\zerocount
\global\c_tabl_ntb_row\zerocount
\global\advance\c_tabl_ntb_row\minusone
- \tabskip\zeropoint
- \dostarttagged\t!table\empty
- \dostarttagged\t!tablerow\empty
- \appendtoks\dostoptagged\dostarttagged\t!tablerow\empty\to\everycr
- \halign\bgroup
- \registerparoptions
- % watch out: tagging the cell happens at the outer level (faster)
- \ignorespaces\alignmark\alignmark\unskip
- \aligntab\aligntab
- \ignorespaces\alignmark\alignmark\unskip
- \cr % one too many
- \the\t_tabl_ntb
- \dostoptagged
- \egroup
+ \dostarttaggedchained\t!table\empty\??naturaltable
+ %\registerparoptions % (*) triggers max hsize
+ \the\t_tabl_ntb
\dostoptagged}
+\unexpanded\def\tabl_ntb_span#1%
+ {\dorecurse{#1}
+ {\hskip\tabl_ntb_get_wid\c_tabl_ntb_col\relax
+ \global\advance\c_tabl_ntb_col\plusone}}
+
+\unexpanded\def\tabl_ntb_skip#1%
+ {\global\advance\c_tabl_ntb_col#1\relax}
+
+\unexpanded\def\tabl_ntb_plus
+ {\global\advance\c_tabl_ntb_col\plusone
+ \kern\d_tabl_ntb_columndistance}
+
+% \setvalue{\??naturaltablecell\the\c_tabl_ntb_none}#1#2%
+% {\scratchcounter\tabl_ntb_get_col{#1}{#2}\relax
+% \ifnum\scratchcounter>\zerocount
+% \normalexpanded
+% {\t_tabl_ntb_row
+% {\the\t_tabl_ntb_row
+% \tabl_ntb_span{\the\scratchcounter}%
+% \tabl_ntb_plus}}%
+% \fi}
+
\setvalue{\??naturaltablecell\the\c_tabl_ntb_none}#1#2%
{\scratchcounter\tabl_ntb_get_col{#1}{#2}\relax
\ifnum\scratchcounter>\zerocount
- \advance\scratchcounter\minusone
- \ifnum\scratchcounter>\zerocount
- \tabl_ntb_span
- \fi
- \t_tabl_ntb_row\expandafter{\the\t_tabl_ntb_row\tabl_ntb_column_next}
+ \normalexpanded
+ {\t_tabl_ntb_row
+ {\the\t_tabl_ntb_row
+ \tabl_ntb_span{\the\scratchcounter}}}%
\fi}
\setvalue{\??naturaltablecell\the\c_tabl_ntb_cell}#1#2%
{\t_tabl_ntb_row\expandafter{\the\t_tabl_ntb_row\tabl_ntb_pass #1 #2 }% space delimited -> less tokens
\scratchcounter\tabl_ntb_get_col{#1}{#2}\relax
\ifnum\scratchcounter>\zerocount
- \advance\scratchcounter\minusone
- \ifnum\scratchcounter>\zerocount
- \tabl_ntb_span
- \fi
- \t_tabl_ntb_row\expandafter{\the\t_tabl_ntb_row\tabl_ntb_column_next}
+ \normalexpanded
+ {\t_tabl_ntb_row
+ {\the\t_tabl_ntb_row
+ \ifnum\scratchcounter=\plusone
+ \tabl_ntb_plus
+ \else
+ \tabl_ntb_skip{\the\scratchcounter}%
+ \fi}}%
\fi}
-\def\tabl_ntb_span
- {\dorecurse\scratchcounter{\t_tabl_ntb_row\expandafter{\the\t_tabl_ntb_row\tabl_ntb_column_span}}%
- \dorecurse\scratchcounter{\t_tabl_ntb_row\expandafter{\the\t_tabl_ntb_row\tabl_ntb_column_skip}}}
-
\unexpanded\def\tabl_ntb_cell#1#2%
{\csname\??naturaltablecell\the\tabl_ntb_get_tag{#1}{#2}\endcsname{#1}{#2}}
@@ -1183,16 +1351,22 @@
{\d_tabl_ntb_width\zeropoint
\scratchcounter\c_tabl_ntb_col
\!!counta\tabl_ntb_get_col{#1}{#2}\relax
- \dorecurse\!!counta
- {\advance\d_tabl_ntb_width\dimexpr
- \tabl_ntb_get_wid\scratchcounter
- +\naturaltablelocalparameter\c!columndistance
- \ifnum\recurselevel<\!!counta
- +\tabl_ntb_get_dis\scratchcounter
- \fi
- \relax
- \advance\scratchcounter\plusone}%
- \advance\d_tabl_ntb_width-\naturaltablelocalparameter\c!columndistance\relax
+ \ifcase\!!counta\or
+ \advance\d_tabl_ntb_width\dimexpr
+ \tabl_ntb_get_wid\scratchcounter
+ \relax
+ \advance\scratchcounter\plusone
+ \else
+ \dorecurse\!!counta
+ {\advance\d_tabl_ntb_width\dimexpr
+ \tabl_ntb_get_wid\scratchcounter
+ \ifnum\recurselevel<\!!counta
+ +\d_tabl_ntb_columndistance
+ +\tabl_ntb_get_dis\scratchcounter
+ \fi
+ \relax
+ \advance\scratchcounter\plusone}%
+ \fi
\setbox\scratchbox\hbox{\tabl_ntb_get_txt{#1}{#2}}%
\tabl_ntb_set_ht{#1}{#2}{\the\ht\scratchbox}%
\tabl_ntb_set_wd{#1}{#2}{\the\wd\scratchbox}%
@@ -1223,16 +1397,22 @@
% width
\d_tabl_ntb_width\zeropoint
\scratchcounter\c_tabl_ntb_col
- \dorecurse\!!counta
- {\advance\d_tabl_ntb_width\dimexpr
- \tabl_ntb_get_wid\scratchcounter
- +\naturaltablelocalparameter\c!columndistance
- \ifnum\recurselevel<\!!counta
- +\tabl_ntb_get_dis\scratchcounter
- \fi
- \relax
- \advance\scratchcounter\plusone}%
- \advance\d_tabl_ntb_width-\naturaltablelocalparameter\c!columndistance\relax
+ \ifcase\!!counta\or
+ \advance\d_tabl_ntb_width\dimexpr
+ \tabl_ntb_get_wid\scratchcounter
+ \relax
+ \advance\scratchcounter\plusone
+ \else
+ \dorecurse\!!counta
+ {\advance\d_tabl_ntb_width\dimexpr
+ \tabl_ntb_get_wid\scratchcounter
+ \ifnum\recurselevel<\!!counta
+ +\d_tabl_ntb_columndistance
+ +\tabl_ntb_get_dis\scratchcounter
+ \fi
+ \relax
+ \advance\scratchcounter\plusone}%
+ \fi
% cell
\setbox\scratchbox\hbox attr \taggedattribute \attribute\taggedattribute \bgroup
\dotagTABLEsignal % maybe we need to add some packaging in this case
@@ -1280,10 +1460,13 @@
\fi}
\def\tabl_ntb_table_stop
- {\setbox\scratchbox\hbox
- {\setupcurrentnaturaltablelocal[\c!frame=\v!off,\c!background=,\c!align=\v!no]%
- \inheritednaturaltablelocalframed{\strut}}%
- \edef\minimalcellheight{\the\ht\scratchbox}% not used
+ {\forgetall % new, here see narrower-004.tex
+ %\setbox\scratchbox\hbox
+ % {\letnaturaltablelocalparameter\c!frame\v!off
+ % \letnaturaltablelocalparameter\c!background\empty
+ % \letnaturaltablelocalparameter\c!align\v!no
+ % \inheritednaturaltablelocalframed{\strut}}%
+ %\edef\minimalcellheight{\the\ht\scratchbox}% not used
\dorecurse\c_tabl_ntb_maximum_col
{\tabl_ntb_let_aut\recurselevel\zeropoint
% new
@@ -1292,14 +1475,22 @@
{\tabl_ntb_let_wd\recurselevel\c_tabl_ntb_current_col_one\zeropoint
\tabl_ntb_let_ht\recurselevel\c_tabl_ntb_current_col_one\zeropoint}%
% till here
+ \tabl_ntb_let_tal\recurselevel\zerocount
\tabl_ntb_let_wid\recurselevel\zeropoint
\tabl_ntb_let_dis\recurselevel\zeropoint}%
\dorecurse\c_tabl_ntb_maximum_row
{\tabl_ntb_let_hei\recurselevel\maxdimen}%
+ \tabl_ntb_let_gal\zerocount
\c_tabl_tbl_pass\plusone
\let\tabl_ntb_pass\tabl_ntb_pass_one
\let\tabl_ntb_cell_process\tabl_ntb_cell_process_a
- \setbox0\vbox{\settrialtypesetting \tabl_ntb_flush_content}%
+ \setbox\scratchbox\vbox{\settrialtypesetting \tabl_ntb_flush_content}%
+ \ifcase\tabl_ntb_get_gal\or
+ % \c_tabl_tbl_pass\plusone
+ % \let\tabl_ntb_pass\tabl_ntb_pass_one
+ \let\tabl_ntb_cell_process\tabl_ntb_cell_process_a_extra
+ \setbox\scratchbox\vbox{\settrialtypesetting \tabl_ntb_flush_content}%
+ \fi
\tabl_ntb_let_dis\c_tabl_ntb_maximum_col\zeropoint
\ifautoTBLspread
% experimental, stretch non fixed cells to \hsize
@@ -1308,21 +1499,24 @@
\tabl_ntb_stretch_widths
\let\tabl_ntb_cell_process\tabl_ntb_cell_process_b
\setbox\scratchbox\vbox{\settrialtypesetting \tabl_ntb_flush_content}%
- \else\ifdim\wd0>\hsize
+ \else\ifdim\wd\scratchbox>\hsize
\ifautoTBLhsize
\tabl_ntb_check_widths_one % trial run
\tabl_ntb_check_widths_two % real run
\let\tabl_ntb_cell_process\tabl_ntb_cell_process_b
\setbox\scratchbox\vbox{\settrialtypesetting \tabl_ntb_flush_content}%
\fi
- \else\ifautoTBLrowspan\ifnum\c_tabl_ntb_maximum_row_span>1 % max ?
+ \else\ifautoTBLrowspan\ifnum\c_tabl_ntb_maximum_row_span>\plusone % max ?
% added jan 2002 because nx=* did no longer work
+ \ifnum\c_tabl_ntb_encountered_max<\c_tabl_ntb_maximum_col
+ % added jun 2014 because someone had less columns than nx .. sigh / see *nx*
+ \writestatus\m!TABLE{missing\space\number\numexpr\c_tabl_ntb_maximum_col-\c_tabl_ntb_encountered_max\relax\space column(s), guessing widths}%
+ \fi
\edef\savedhsize{\the\hsize}%
- \hsize\wd0\relax % new per 17/04/2006
+ \hsize\wd\scratchbox\relax % new per 17/04/2006
\tabl_ntb_check_widths_one % trial run
\tabl_ntb_check_widths_two % real run
\hsize\savedhsize
- %
\let\tabl_ntb_cell_process\tabl_ntb_cell_process_c
\setbox\scratchbox\vbox{\settrialtypesetting \tabl_ntb_flush_content}%
\fi\fi\fi\fi
@@ -1336,39 +1530,56 @@
\c_tabl_tbl_pass\plusthree
\let\tabl_ntb_pass\tabl_ntb_pass_three
\ifnum\m_tabl_tbl_level>\plusone
- \expandafter\tabl_tbl_split_nop
+ \tabl_tbl_split_nop
\else\ifenableTBLbreak
- \doubleexpandafter\tabl_tbl_split_yes
+ \tabl_tbl_split_yes
\else
- \doubleexpandafter\tabl_tbl_split_nop
- \fi\fi{\tabl_ntb_flush_content}}
+ \tabl_tbl_split_nop
+ \fi\fi}
\def\tabl_ntb_stretch_widths % more variants, e.g. a max to \dimend
{\ifcase\c_tabl_ntb_maximum_col\else % else division by zero
\!!dimend\zeropoint
- \!!dimene\hsize
+ \!!dimene\dimexpr
+ \hsize
+ -\d_tabl_ntb_leftmargindistance
+ -\d_tabl_ntb_rightmargindistance
+ +\d_tabl_ntb_columndistance
+ \relax
\dorecurse\c_tabl_ntb_maximum_col
- {\advance\!!dimend\dimexpr\tabl_ntb_get_wid\recurselevel+\naturaltablelocalparameter\c!columndistance\relax
- \advance\!!dimene-\tabl_ntb_get_dis\recurselevel}%
- \advance\!!dimend\dimexpr-\naturaltablelocalparameter\c!columndistance+\naturaltablelocalparameter\c!leftmargindistance+\naturaltablelocalparameter\c!rightmargindistance\relax
+ {\advance\!!dimend\dimexpr
+ \tabl_ntb_get_wid\recurselevel
+ \relax
+ \advance\!!dimene\dimexpr
+ -\tabl_ntb_get_dis\recurselevel
+ -\d_tabl_ntb_columndistance
+ \relax}%
+ \relax
% distribute width (stretch)
\ifdim\!!dimend<\!!dimene
\advance\!!dimend-\!!dimene
- \!!dimend-\!!dimend
\divide\!!dimend\c_tabl_ntb_maximum_col
\dorecurse\c_tabl_ntb_maximum_col
- {\tabl_ntb_set_wid\recurselevel{\the\dimexpr\tabl_ntb_get_wid\recurselevel+\!!dimend\relax}}%
+ {\tabl_ntb_set_wid\recurselevel{\the\dimexpr\tabl_ntb_get_wid\recurselevel-\!!dimend\relax}}%
\fi
\fi}
-\def\tabl_tbl_split_nop#1%
- {\setbox\b_tabl_ntb_final\vbox{#1}%
+\def\tabl_tbl_split_nop
+ {\setbox\b_tabl_ntb_final\vbox{\tabl_ntb_flush_content}%
\postprocessTABLEbox\b_tabl_ntb_final
\beforeTABLEbox
+ % packaging prevents max hsized box
+ % \hbox{\registerparoptions\box\b_tabl_ntb_final}% (*) better here
+ % better :
+ \ifinsidefloat
+ % nothing, else we get a \hsized box
+ \else
+ \registerparoptions % (*) better here
+ \fi
\box\b_tabl_ntb_final
\afterTABLEbox}
-\def\tabl_tbl_split_yes % #1
+\def\tabl_tbl_split_yes
{\ifinsidesplitfloat
\donetrue
\else\ifinsidefloat
@@ -1386,14 +1597,15 @@
\let\extratblsplitheight\zeropoint % additional space taken by before/afterTABLEsplitbox
-\def\tabl_ntb_split_box#1%
+\def\tabl_ntb_split_box
{\resettsplit
\def\tsplitminimumfreelines{2}%
\def\tsplitminimumfreespace{\dimexpr\extratblsplitheight+\naturaltablelocalparameter\c!splitoffset\relax}%
\def\tsplitbeforeresult {\beforeTABLEsplitbox}%
\def\tsplitafterresult {\afterTABLEsplitbox}%
\def\tsplitafter {\m_tabl_ntb_after_split}%
- \setbox\tsplitcontent\vbox{#1}%
+ \def\tsplitbefore {\m_tabl_ntb_before_split}% supported ?
+ \setbox\tsplitcontent\vbox{\tabl_ntb_flush_content}%
\ifmultipleTBLheads
\dorecurse\c_tabl_ntb_n_of_head_lines
{\setbox\scratchbox\vsplit\tsplitcontent to \lineheight
@@ -1402,8 +1614,10 @@
{\setbox\scratchbox\vsplit\tsplitcontent to \lineheight
\setbox\tsplitnext\vbox{\unvcopy\tsplitnext\unvcopy\scratchbox}}%
\fi
- \doifsomething{\naturaltablelocalparameter\c!spaceinbetween}
- {\def\tsplitinbetween{\blank[\naturaltablelocalparameter\c!spaceinbetween]}}%
+ \edef\p_spaceinbetween{\naturaltablelocalparameter\c!spaceinbetween}%
+ \ifx\p_spaceinbetween\empty\else
+ \blank[\p_spaceinbetween]%
+ \fi
\def\postprocesstsplit{\postprocessTABLEsplitbox{\box\tsplitresult}}%
\handletsplit}
@@ -1423,15 +1637,23 @@
\def\tabl_ntb_check_widths_indeed#1%
{\iftraceTABLE\tabl_ntb_show_widths{B#1}\fi
\!!counta\zerocount
- \!!dimena\dimexpr\hsize-\naturaltablelocalparameter\c!leftmargindistance-\naturaltablelocalparameter\c!rightmargindistance-\naturaltablelocalparameter\c!columndistance\relax
+ \!!dimena\dimexpr
+ \hsize
+ -\d_tabl_ntb_leftmargindistance
+ -\d_tabl_ntb_rightmargindistance
+ -\d_tabl_ntb_columndistance
+ \relax
\dorecurse\c_tabl_ntb_maximum_col
{\scratchdimen\tabl_ntb_get_aut\recurselevel\relax
- \advance\!!dimena-\tabl_ntb_get_dis\recurselevel\relax
+ \advance\!!dimena\dimexpr
+ -\tabl_ntb_get_dis\recurselevel
+ -\d_tabl_ntb_columndistance
+ \relax
\ifdim\scratchdimen>\zeropoint\relax
\advance\!!dimena -\scratchdimen
\else
\scratchdimen\tabl_ntb_get_wid\recurselevel\relax
- \ifdim\scratchdimen>\naturaltablelocalparameter\c!maxwidth\relax
+ \ifdim\scratchdimen>\d_tabl_ntb_maxwidth\relax
\ifcase#1\else\tabl_ntb_let_wid\recurselevel\zeropoint\fi
\advance\!!counta \plusone
\else
@@ -1440,7 +1662,9 @@
\else
% eigenlijk moet dit alleen als de kolom wordt overspannen door een
% vorige, maw extra dubbele loop en status var
- \advance\!!counta \plusone
+ \ifnum\c_tabl_ntb_encountered_max=\c_tabl_ntb_maximum_col % *nx* bah
+ \advance\!!counta \plusone % setting maxwidth to a large value also works
+ \fi
\fi
\fi
\fi}%
@@ -1531,7 +1755,9 @@
\def\tabl_ntb_show_widths#1%
{\vbox
- {\forgetall\tttf[#1]\dorecurse\c_tabl_ntb_maximum_col
+ {\forgetall
+ \tttf[#1]%
+ \dorecurse\c_tabl_ntb_maximum_col
{\scratchdimen\tabl_ntb_get_wid\recurselevel\relax
[\recurselevel:\the\scratchdimen]}}}
@@ -1548,46 +1774,115 @@
% \setsecondpasscharacteralign \checkalignment{#3}% {\strut#2\unskip}%
% \ignorespaces}
-\def\tabl_ntb_char_align
- {\doifelse{\naturaltablelocalparameter\c!aligncharacter}\v!yes
- \tabl_ntb_char_align_indeed
- \gobbletwoarguments}
+\def\tabl_ntb_char_align % called often
+ {\edef\p_characteralign{\naturaltablelocalparameter\c!aligncharacter}%
+ \ifx\p_characteralign\v!yes
+ \ifcase\c_tabl_tbl_pass\or
+ \tabl_ntb_let_tal\currentTABLEcolumn\plusone
+ \tabl_ntb_let_gal\plusone
+ \fi
+ \expandafter\tabl_ntb_char_align_indeed
+ \else
+ \expandafter\gobbletwoarguments
+ \fi}
\def\tabl_ntb_char_align_indeed#1#2% row column
{\ifcase\c_tabl_tbl_pass \or
- \setcharacteralign{#2}{\naturaltablelocalparameter\c!alignmentcharacter}%
+ \setcharacteralign{#2}{\naturaltablelocalparameter\c!alignmentcharacter}% we could store the character in tal
\fi
\typo_charalign_adapt_font
\signalcharacteralign{#2}{#1}}
+\unexpanded\def\tabl_ntb_cell_process_a_extra#1#2%
+ {\ifcase\tabl_ntb_get_tal{#2}\relax
+ \expandafter\tabl_ntb_cell_process_x
+ \else
+ \expandafter\tabl_ntb_cell_process_a
+ \fi{#1}{#2}}
+
+\unexpanded\def\tabl_ntb_cell_process_x#1#2[#3]#4%
+ {}
+
+% problem: when span doesn't break we can have a span that is the sum of
+% cells but still to small .. chicken egg problem ... for that we should
+% also have a smallest width run
+%
+% nilling the background makes a run upto 25% faster
+
+\def\tabl_ntb_cell_process_a_check_span_one
+ {\ifautosqueezeTBLspan
+ \edef\p_width{\naturaltablelocalparameter\c!width}%
+ \csname\??naturaltablesqueeze\ifcsname\??naturaltablesqueeze\p_width\endcsname\p_width\fi\endcsname
+ \else
+ \donetrue
+ \fi
+ \ifdone % brr, 0
+ \ifnum\scratchcounter>\plusone
+ \tabl_ntb_set_spn\c_tabl_ntb_col
+ \fi
+ \fi}
+
+\def\tabl_ntb_cell_process_a_check_span_two_yes
+ {\iftightTBLcolspan
+ \donefalse
+ \else
+ \ifnum\scratchcounter>\plusone
+ \begingroup
+ \edef\p_width{\naturaltablelocalparameter\c!width}%
+ \csname\??naturaltablesqueeze\ifcsname\??naturaltablesqueeze\p_width\endcsname\p_width\fi\endcsname
+ \ifdone
+ \endgroup
+ \edef\p_option{\naturaltablelocalparameter\c!option}%
+ \ifx\p_option\v!tight\donefalse\else\donetrue\fi
+ \else
+ % a dimension
+ \endgroup
+ \donefalse
+ \fi
+ \else
+ \edef\p_option{\naturaltablelocalparameter\c!option}%
+ \ifx\p_option\v!tight\donefalse\else\donetrue\fi
+ \fi
+ \fi}
+
+
+% \let\tabl_ntb_cell_process_a_check_span_two_nop\donetrue
+
+\def\tabl_ntb_cell_process_a_check_span_two_nop
+ {\ifnum\scratchcounter>\plusone
+ \edef\p_width{\naturaltablelocalparameter\c!width}%
+ \csname\??naturaltablesqueeze\ifcsname\??naturaltablesqueeze\p_width\endcsname\p_width\fi\endcsname
+ \else
+ \donetrue
+ \fi}
+
\unexpanded\def\tabl_ntb_cell_process_a#1#2[#3]#4% grouping added ! ! !
{\bgroup
+ \letnaturaltablelocalparameter\c!option\empty
\tabl_ntb_setup_cell{#1}{#2}%
+ \setupcurrentnaturaltablelocal[#3]%
+ \letnaturaltablelocalparameter\c!background\empty
+ \letnaturaltablelocalparameter\c!frame\v!off
+ \scratchcounter\tabl_ntb_get_col{#1}{#2}\relax
\setbox\scratchbox\hbox
{\scratchdimen\naturaltablelocalparameter\c!distance\relax
\ifdim\scratchdimen>\tabl_ntb_get_dis{#2}\relax
\tabl_ntb_set_dis{#2}{\the\scratchdimen}%
\fi
- \setupcurrentnaturaltablelocal[#3,\c!background=,\c!frame=\v!off]% 25% faster
\inheritednaturaltablelocalframed{\tabl_ntb_cell_start\tabl_ntb_char_align{#1}{#2}#4\tabl_ntb_cell_stop\tabl_ntb_cell_finalize}}%
\scratchdimen\tabl_ntb_get_wid\c_tabl_ntb_col\relax
\ifdim\wd\scratchbox>\scratchdimen
\ifsqueezeTBLspan
- \ifautosqueezeTBLspan
- \doifinsetelse{\naturaltablelocalparameter\c!width}{\v!fit,\v!fixed,\v!broad,\v!local}
- \donetrue \donefalse
- \else
- \donetrue
- \fi
- \ifdone % brr, 0
- \ifnum\tabl_ntb_get_col{#1}{#2}>\plusone \tabl_ntb_set_spn\c_tabl_ntb_col\fi
- \fi
+ \tabl_ntb_cell_process_a_check_span_one
\fi
\tabl_ntb_spn_doifelse\c_tabl_ntb_col
- \donothing
- {\ifdim\tabl_ntb_get_wid\c_tabl_ntb_col<\wd\scratchbox
+ \tabl_ntb_cell_process_a_check_span_two_yes
+ \tabl_ntb_cell_process_a_check_span_two_nop
+ \ifdone
+ \ifdim\tabl_ntb_get_wid\c_tabl_ntb_col<\wd\scratchbox
\tabl_ntb_set_wid\c_tabl_ntb_col{\the\wd\scratchbox}%
- \fi}% auto set
+ \fi
+ \fi
\fi
\scratchcounter\numexpr\c_tabl_ntb_row+\plusone\relax
\scratchdimen\tabl_ntb_get_hei\scratchcounter\relax
@@ -1608,8 +1903,7 @@
% unless span
\tabl_ntb_set_aut\c_tabl_ntb_col{\the\wd\scratchbox}%
% to be translated
- \writestatus\m!TABLE
- {no auto width in (\number#1,\number#2)\space\the\wd\scratchbox/\the\hsize}%
+ \writestatus\m!TABLE{no auto width in (\number#1,\number#2)\space\the\wd\scratchbox/\the\hsize}%
\fi\fi
\fi
\fi
@@ -1624,7 +1918,9 @@
\unexpanded\def\tabl_ntb_cell_process_b_c#1#2#3[#4]#5%
{\setbox\scratchbox\hbox
{\tabl_ntb_setup_cell{#2}{#3}%
- \setupcurrentnaturaltablelocal[#4,#1,\c!frame=\v!off,\c!background=]%
+ \setupcurrentnaturaltablelocal[#4,#1]%
+ \letnaturaltablelocalparameter\c!background\empty
+ \letnaturaltablelocalparameter\c!frame\v!off
\inheritednaturaltablelocalframed{\tabl_ntb_cell_start#5\tabl_ntb_cell_stop}}%
\setbox2\emptyhbox
\wd2\wd\scratchbox
@@ -1663,7 +1959,10 @@
\unexpanded\def\tabl_ntb_cell_process_d#1#2[#3]#4%
{\tabl_ntb_setup_cell{#1}{#2}%
\bgroup
- \setupcurrentnaturaltablelocal[#3,\c!width=\d_tabl_ntb_width,\c!background=,\c!frame=\v!off]% 25% faster
+ \setupcurrentnaturaltablelocal[#3]%
+ \letnaturaltablelocalparameter\c!background\empty
+ \letnaturaltablelocalparameter\c!frame\v!off
+ \setnaturaltablelocalparameter\c!width{\d_tabl_ntb_width}%
\inheritednaturaltablelocalframed{\tabl_ntb_cell_start\tabl_ntb_char_align{#1}{#2}#4\tabl_ntb_cell_stop}%
\egroup}
@@ -1672,10 +1971,11 @@
\setupcurrentnaturaltablelocal[#3]% to get the color right, the way we
\color % handle color here prevents interference due to whatsit nodes
[\naturaltablelocalparameter\c!color] % as well as permits local colors to take precedence
- {\ifdim\d_tabl_ntb_height=\zeropoint\relax % case: nc=maxcolumns
- \setupcurrentnaturaltablelocal[\c!color=,\c!width=\d_tabl_ntb_width]%
+ {\letnaturaltablelocalparameter\c!color\empty
+ \setnaturaltablelocalparameter\c!width{\d_tabl_ntb_width}%
+ \ifdim\d_tabl_ntb_height=\zeropoint\relax % case: nc=maxcolumns
\else
- \setupcurrentnaturaltablelocal[\c!color=,\c!width=\d_tabl_ntb_width,\c!height=\d_tabl_ntb_height]%
+ \setnaturaltablelocalparameter\c!height{\d_tabl_ntb_height}%
\fi
\inheritednaturaltablelocalframed{\tabl_ntb_cell_start\tabl_ntb_char_align{#1}{#2}#4\tabl_ntb_cell_stop}}%
\hskip\tabl_ntb_get_dis{#2}}
@@ -1728,7 +2028,7 @@
\newconditional\resetTABLEmode \settrue\resetTABLEmode
-\def\tabl_ntb_parameters_reset
+\def\tabl_ntb_parameters_reset % we can use setters instead
{\ifnum\m_tabl_tbl_level>\plusone % in ieder geval
\ifconditional\resetTABLEmode
% not ok yet
diff --git a/Master/texmf-dist/tex/context/base/tabl-tab.mkiv b/Master/texmf-dist/tex/context/base/tabl-tab.mkiv
index f9ac27e7011..5add1c684a0 100644
--- a/Master/texmf-dist/tex/context/base/tabl-tab.mkiv
+++ b/Master/texmf-dist/tex/context/base/tabl-tab.mkiv
@@ -1503,9 +1503,9 @@
\global\setfalse\tableactionstatepermitted
\global\setfalse\hassometablehead
\global\setfalse\hassometabletail
- \expanded{\doifinstringelse{|}{#1}}
+ \expanded{\doifelseinstring{|}{#1}}
{\xdef\restarttable{\noexpand\dorestarttable{\noexpand\thirdstagestarttable{#1}}}}
- {\doifdefinedelse{\??tabletemplate#1}
+ {\doifelsedefined{\??tabletemplate#1}
{\gdef\restarttable{\getvalue{\??tabletemplate#1}}}
{\gdef\restarttable{\dorestarttable{\getvalue{#1}}}}}%
\egroup
@@ -1921,7 +1921,7 @@
{\global\currenttablecolumn\zerocount}
\def\dotablevrulecommand#1% global assignments
- {\doifnumberelse{#1}
+ {\doifelsenumber{#1}
{\global\tablevrulethicknessfactor#1\relax
\global\multiply\tablevrulethicknessfactor\m_tabl_table_VLwidth\relax}
{\xdef\tablecurrentvrulecolor{#1}}}
@@ -1955,7 +1955,7 @@
\unexpanded\def\dotableVN#1{\global\noftablevrules#1\relax\VL}
\def\dotablehrulecommand#1% global assignments
- {\doifnumberelse{#1}
+ {\doifelsenumber{#1}
{\global\tablehrulethicknessfactor#1\relax
\global\multiply\tablehrulethicknessfactor\m_tabl_table_HLheight\relax}
{\xdef\tablecurrenthrulecolor{#1}}}
@@ -2075,7 +2075,7 @@
\fi}
\def\dotabledrulecommand#1% global assignments
- {\doifnumberelse{#1}
+ {\doifelsenumber{#1}
{\ifcase\tabledrulespan
\global\tabledrulespan#1\relax
\else
@@ -2203,7 +2203,7 @@
\def\dolocaltablesetup
{\directtablesparameter\c!commands\relax
- \doifsomething{\directtablesparameter\c!bodyfont}{\switchtobodyfont[\directtablesparameter\c!bodyfont]}%
+ \usebodyfontparameter\directtablesparameter
\tablelinethicknessunit\dimexpr\directtablesparameter\c!rulethickness/\tablelinethicknessfactor\relax
\edef\p_tabl_table_height{\directtablesparameter\c!height}%
\edef\p_tabl_table_depth{\directtablesparameter\c!depth}%
@@ -2288,8 +2288,7 @@
\c!distance=\v!medium,
\c!bodyfont=,
\c!commands=,
- \c!background=\v!screen, % huh?
- \c!backgroundscreen=\defaultbackgroundscreen,
+ \c!background=,
\c!backgroundcolor=,
\c!split=\v!auto]
diff --git a/Master/texmf-dist/tex/context/base/tabl-tbl.lua b/Master/texmf-dist/tex/context/base/tabl-tbl.lua
index b088a10086e..13d899de647 100644
--- a/Master/texmf-dist/tex/context/base/tabl-tbl.lua
+++ b/Master/texmf-dist/tex/context/base/tabl-tbl.lua
@@ -25,7 +25,7 @@ local pattern = Ct((separator * (C(nested) + Cc("")) * C((1-separator)^0))^0
local ctx_settabulatelastentry = context.settabulatelastentry
local ctx_settabulateentry = context.settabulateentry
-function commands.presettabulate(preamble)
+local function presettabulate(preamble)
preamble = gsub(preamble,"~","d") -- let's get rid of ~ mess here
if find(preamble,"*",1,true) then
-- todo: lpeg but not now
@@ -43,3 +43,10 @@ function commands.presettabulate(preamble)
end
ctx_settabulatelastentry(t[m+1])
end
+
+interfaces.implement {
+ name = "presettabulate",
+ actions = presettabulate,
+ arguments = "string",
+ scope = "private",
+}
diff --git a/Master/texmf-dist/tex/context/base/tabl-tbl.mkiv b/Master/texmf-dist/tex/context/base/tabl-tbl.mkiv
index c25d61741f4..ae4f03825a7 100644
--- a/Master/texmf-dist/tex/context/base/tabl-tbl.mkiv
+++ b/Master/texmf-dist/tex/context/base/tabl-tbl.mkiv
@@ -331,7 +331,7 @@
{\dowithnextboxcs\tabl_tabulate_shaped_par_finish\vbox\bgroup}
\def\tabl_tabulate_shaped_par_finish
- {\ctxcommand{doreshapeframedbox(\number\nextbox)}%
+ {\clf_doreshapeframedbox\nextbox\relax
\ifvmode\unvbox\else\box\fi\nextbox}
\let\tabl_tabulate_shaped_par_end\egroup
@@ -599,17 +599,17 @@
\tabl_tabulate_set_preamble}
\def\tabl_tabulate_set_preskip#1%
- {\doifnumberelse{#1}
+ {\doifelsenumber{#1}
{\s_tabl_tabulate_pre#1\d_tabl_tabulate_unit\tabl_tabulate_set_preamble }
{\s_tabl_tabulate_pre.5\d_tabl_tabulate_unit\tabl_tabulate_set_preamble#1}}
\def\tabl_tabulate_set_posskip#1%
- {\doifnumberelse{#1}
+ {\doifelsenumber{#1}
{\s_tabl_tabulate_post#1\d_tabl_tabulate_unit\tabl_tabulate_set_preamble }
{\s_tabl_tabulate_post.5\d_tabl_tabulate_unit\tabl_tabulate_set_preamble#1}}
\def\tabl_tabulate_set_preposskip#1%
- {\doifnumberelse{#1}
+ {\doifelsenumber{#1}
{\s_tabl_tabulate_pre#1\d_tabl_tabulate_unit\s_tabl_tabulate_post\s_tabl_tabulate_pre\tabl_tabulate_set_preamble }
{\s_tabl_tabulate_pre.5\d_tabl_tabulate_unit\s_tabl_tabulate_post\s_tabl_tabulate_pre\tabl_tabulate_set_preamble#1}}
@@ -651,7 +651,7 @@
\tabl_tabulate_set_preamble}
\def\tabl_tabulate_pickup_width
- {\doifnextparenthesiselse\tabl_tabulate_set_width_indeed\tabl_tabulate_set_preamble}
+ {\doifelsenextparenthesis\tabl_tabulate_set_width_indeed\tabl_tabulate_set_preamble}
\def\tabl_tabulate_set_width
{\setfalse\c_tabl_tabulate_pwidth_set
@@ -664,7 +664,7 @@
\tabl_tabulate_set_preamble}
\def\tabl_tabulate_set_paragraph
- {\doifnextparenthesiselse
+ {\doifelsenextparenthesis
{\c_tabl_tabulate_modus\plusone
\settrue\c_tabl_tabulate_pwidth_set
\tabl_tabulate_pickup_width}
@@ -749,7 +749,7 @@
\tabl_tabulate_set_preamble}
\def\tabl_tabulate_set_vrule_command#1%
- {\doifnumberelse{#1}
+ {\doifelsenumber{#1}
{\global\d_tabl_tabulate_vrulethickness#1\d_tabl_tabulate_vrulethickness_default}
{\xdef\m_tabl_tabulate_vrule_color{#1}}}
@@ -1049,17 +1049,25 @@
\def\tabl_tabulate_insert_foot_content
{\tabulatenoalign{\global\settrue\c_tabl_tabulate_someamble}%
- \csname\??tabulatehead\currenttabulation\endcsname
+ \csname\??tabulatefoot\currenttabulation\endcsname
\tabulatenoalign{\global\setfalse\c_tabl_tabulate_someamble}}%
\def\tabl_tabulate_check_full_content % - needed, else confusion with \c!header
{\ifcsname\??tabulatehead\currenttabulation\endcsname
- \let\tabl_tabulate_insert_head\tabl_tabulate_insert_head_content
+ \expandafter\ifx\csname\??tabulatehead\currenttabulation\endcsname\empty
+ \let\tabl_tabulate_insert_head\empty
+ \else
+ \let\tabl_tabulate_insert_head\tabl_tabulate_insert_head_content
+ \fi
\else
\let\tabl_tabulate_insert_head\empty
\fi
\ifcsname\??tabulatefoot\currenttabulation\endcsname
- \let\tabl_tabulate_insert_foot\tabl_tabulate_insert_foot_content
+ \expandafter\ifx\csname\??tabulatefoot\currenttabulation\endcsname\empty
+ \let\tabl_tabulate_insert_foot\empty
+ \else
+ \let\tabl_tabulate_insert_foot\tabl_tabulate_insert_head_content
+ \fi
\else
\let\tabl_tabulate_insert_foot\empty
\fi}
@@ -1079,8 +1087,10 @@
\tabulatenoalign{\kern-\lineheight}%
\fi}
-\setuvalue{\e!start\v!tabulatehead}{\doifnextoptionalcselse\tabl_tabulate_start_head_yes\tabl_tabulate_start_head_nop}
-\setuvalue{\e!start\v!tabulatetail}{\doifnextoptionalcselse\tabl_tabulate_start_foot_yes\tabl_tabulate_start_foot_nop}
+% todo: make footer synonym to tail
+
+\setuvalue{\e!start\v!tabulatehead}{\doifelsenextoptionalcs\tabl_tabulate_start_head_yes\tabl_tabulate_start_head_nop}
+\setuvalue{\e!start\v!tabulatetail}{\doifelsenextoptionalcs\tabl_tabulate_start_foot_yes\tabl_tabulate_start_foot_nop}
\let\m_tabl_tabulate_data\empty
@@ -1090,30 +1100,30 @@
\def\tabl_tabulate_start_foot_yes[#1]%
{\processcontent{\e!stop\v!tabulatetail}\m_tabl_tabulate_data{\letvalue{\??tabulatefoot#1}\m_tabl_tabulate_data}}
-% \def\tabl_tabulate_start_head_nop{\tabl_tabulate_start_head_yes[\v!tabulate]}
-% \def\tabl_tabulate_start_foot_nop{\tabl_tabulate_start_foot_yes[\v!tabulate]}
+\def\tabl_tabulate_start_head_nop{\tabl_tabulate_start_head_yes[\v!tabulate]}
+\def\tabl_tabulate_start_foot_nop{\tabl_tabulate_start_foot_yes[\v!tabulate]}
-\def\tabl_tabulate_start_head_nop{\tabl_tabulate_start_head_yes[]}
-\def\tabl_tabulate_start_foot_nop{\tabl_tabulate_start_foot_yes[]}
+% \def\tabl_tabulate_start_head_nop{\tabl_tabulate_start_head_yes[]}
+% \def\tabl_tabulate_start_foot_nop{\tabl_tabulate_start_foot_yes[]}
% \unexpanded\def\tabl_start_defined[#1]%
% {\bgroup
% \edef\currenttabulationparent{#1}%
% \let\currenttabulation\currenttabulationparent
-% \doifnextoptionalcselse\tabl_start_defined_yes\tabl_start_defined_nop}
-%
-% \def\tabl_start_defined_yes[#1]%
-% {\edef\currenttabulation{\currenttabulation:#1}%
-% \tabl_tabulate_start_building}
-%
-% \def\tabl_start_defined_nop
-% {\tabl_tabulate_start_building}
+% \dodoubleargument\tabl_start_defined_indeed}
\unexpanded\def\tabl_start_defined[#1]%
{\bgroup
\edef\currenttabulationparent{#1}%
\let\currenttabulation\currenttabulationparent
- \dodoubleargument\tabl_start_defined_indeed}
+ \edef\p_format{\tabulationparameter\c!format}%
+ \ifx\p_format\v!none
+ % this is special case: we need to define the generic english
+ % \starttabulate in other interfaces as well
+ \expandafter\dodoubleempty \expandafter\tabl_start_regular
+ \else
+ \expandafter\dodoubleargument\expandafter\tabl_start_defined_indeed
+ \fi}
\def\tabl_start_defined_indeed
{\iffirstargument
@@ -1127,7 +1137,7 @@
\fi}
\def\tabl_start_defined_one[#1][#2]%
- {\doifassignmentelse{#1}
+ {\doifelseassignment{#1}
{\setuptabulation[\currenttabulation][#1]}%
{\edef\currenttabulation{\currenttabulation:#1}}%
\tabl_tabulate_start_building}
@@ -1144,26 +1154,11 @@
\unexpanded\setuvalue{\e!start\v!tabulate}%
{\bgroup % whole thing
+ \let\currenttabulationparent\empty
\dodoubleempty\tabl_start_regular}
-% \def\tabl_start_regular[#1][#2]%
-% {%\let\currenttabulationparent\v!tabulate
-% \let\currenttabulationparent\empty
-% \let\currenttabulation\currenttabulationparent
-% \def\p_format{#1}%
-% \ifx\p_format\empty
-% \def\p_format{|l|p|}%
-% \fi
-% \lettabulationparameter\c!format\p_format
-% \ifsecondargument
-% \setupcurrenttabulation[#2]%
-% \fi
-% \tabl_tabulate_start_building}
-
\def\tabl_start_regular
- {%\let\currenttabulationparent\v!tabulate
- \let\currenttabulationparent\empty
- \let\currenttabulation\currenttabulationparent
+ {\let\currenttabulation\currenttabulationparent
\ifsecondargument
\expandafter\tabl_start_regular_two
\else
@@ -1171,7 +1166,7 @@
\fi}
\def\tabl_start_regular_one[#1][#2]%
- {\doifassignmentelse{#1}
+ {\doifelseassignment{#1}
{\setupcurrenttabulation[\c!format={|l|p|},#1]}
{\def\p_format{#1}%
\ifx\p_format\empty
@@ -1321,7 +1316,7 @@
\def\tabl_tabulate_set_color_column#1% overloaded
{\unskip
- \doiffastoptionalcheckelse{\tabl_tabulate_set_color_column_yes#1}{\tabl_tabulate_set_color_column_nop#1}}
+ \doifelsefastoptionalcheck{\tabl_tabulate_set_color_column_yes#1}{\tabl_tabulate_set_color_column_nop#1}}
\def\tabl_tabulate_set_color_column_nop
{\tabl_tabulate_column_normal}
@@ -1360,13 +1355,13 @@
% \fi\fi
\global\let\m_tabl_tabulate_vrule_color_local\m_tabl_tabulate_vrule_color_default
\global\d_tabl_tabulate_vrulethickness_local\d_tabl_tabulate_vrulethickness_default
- \doiffastoptionalcheckelse{\tabl_tabulate_column_vruled_yes#1}{\tabl_tabulate_column_vruled_nop#1}}
+ \doifelsefastoptionalcheck{\tabl_tabulate_column_vruled_yes#1}{\tabl_tabulate_column_vruled_nop#1}}
\def\tabl_tabulate_column_vruled_nop
{\tabl_tabulate_column_normal}
\def\tabl_tabulate_column_vruled_step#1%
- {\doifnumberelse{#1}
+ {\doifelsenumber{#1}
{\global\d_tabl_tabulate_vrulethickness_local#1\d_tabl_tabulate_vrulethickness_default}
{\xdef\m_tabl_tabulate_vrule_color_local{#1}}}
@@ -1454,15 +1449,15 @@
\def\tabl_tabulate_hrule_spec_ignore#1%
{%\global\let\currenttabulationlocalhrulecolor\empty
%\global\d_tabl_tabulate_hrulethickness_local\d_tabl_tabulate_hrulethickness_default
- \doiffastoptionalcheckelse#1#1}
+ \doifelsefastoptionalcheck#1#1}
\def\tabl_tabulate_hrule_spec_pickup#1%
{\global\let\currenttabulationlocalhrulecolor\m_tabl_tabulate_hrule_color_default
\global\d_tabl_tabulate_hrulethickness_local\d_tabl_tabulate_hrulethickness_default
- \doiffastoptionalcheckelse{\tabl_tabulate_hrule_preset#1}#1}
+ \doifelsefastoptionalcheck{\tabl_tabulate_hrule_preset#1}#1}
\def\tabl_tabulate_hrule_preset_step#1%
- {\doifnumberelse{#1}
+ {\doifelsenumber{#1}
{\global\d_tabl_tabulate_hrulethickness_local#1\d_tabl_tabulate_hrulethickness_default}
{\xdef\currenttabulationlocalhrulecolor{#1}}}
@@ -1531,7 +1526,7 @@
\unexpanded\def\tabl_tabulate_color_set#1% we could store the attributes at the cost of a lua call
{\begingroup
- \node_backgrounds_align_initialize % name might change
+ \clf_enablebackgroundalign % was \node_backgrounds_align_initialize
\global\let\tabl_tabulate_color_repeat\tabl_tabulate_color_repeat_second
\global\settrue\c_tabl_tabulate_has_colors
\ifnum\c_tabl_tabulate_column>\c_tabl_tabulate_max_colorcolumn
@@ -2106,7 +2101,7 @@
\c_tabl_tabulate_nofcolumns \zerocount
\c_tabl_tabulate_has_rule_spec_first\zerocount
\c_tabl_tabulate_has_rule_spec_last \zerocount
- \ctxcommand{presettabulate(\!!bs\detokenizedtabulationparameter\c!format\!!es)}%
+ \clf_presettabulate{\detokenizedtabulationparameter\c!format}%
%
% \edef\totaltabulatecolumns{\the\numexpr3*\c_tabl_tabulate_columns+\plusfour}%
\d_tabl_tabulate_width\zeropoint
@@ -2172,7 +2167,7 @@
\global\setbox\b_tabl_tabulate\vbox \bgroup
\fi
%
- \dostarttagged\t!tabulate\empty
+ \dostarttaggedchained\t!tabulate\empty\??tabulation
\dostarttagged\t!tabulaterow\empty
\setfalse\inhibitmargindata % new per 2012.06.13 ... really needed
\everycr\expandafter{\the\everycr\dostoptagged\dostarttagged\t!tabulaterow\empty}%
@@ -2452,4 +2447,10 @@
%D \stopwhatever
%D \stoptyping
+%D This is needed because we soemtimes use the english command in
+%D tracing macros. In fact, most detailed tracing macros that
+%D are done with \LUA\ only work in the english interface anyway.
+
+\definetabulate[tabulate] \setuptabulate[tabulate][\c!format=\v!none] % so no \v! here
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/tabl-tsp.mkiv b/Master/texmf-dist/tex/context/base/tabl-tsp.mkiv
index 0138697af8e..64ab94a67da 100644
--- a/Master/texmf-dist/tex/context/base/tabl-tsp.mkiv
+++ b/Master/texmf-dist/tex/context/base/tabl-tsp.mkiv
@@ -195,7 +195,7 @@
\normalexpanded{\egroup\noexpand\edef\noexpand\extrasplitfloatlines{\the\noflines}}%
\global\settrue\usesamefloatnumber
\else
- \doifnumberelse\extrasplitfloatlines\donothing{\def\extrasplitfloatlines{1}}%
+ \doifelsenumber\extrasplitfloatlines\donothing{\def\extrasplitfloatlines{1}}%
\fi}
\unexpanded\def\doifnotinsidesplitfloat
diff --git a/Master/texmf-dist/tex/context/base/tabl-xtb.lua b/Master/texmf-dist/tex/context/base/tabl-xtb.lua
index 5728b80e95f..bddd627adce 100644
--- a/Master/texmf-dist/tex/context/base/tabl-xtb.lua
+++ b/Master/texmf-dist/tex/context/base/tabl-xtb.lua
@@ -24,13 +24,16 @@ this mechamism will be improved so that it can replace its older cousin.
]]--
-- todo: use linked list instead of r/c array
+-- todo: we can use the sum of previously forced widths for column spans
-local tonumber = tonumber
+local tonumber, next = tonumber, next
local commands = commands
local context = context
local tex = tex
+local implement = interfaces.implement
+
local texgetcount = tex.getcount
local texsetcount = tex.setcount
local texgetdimen = tex.getdimen
@@ -41,10 +44,13 @@ local format = string.format
local concat = table.concat
local points = number.points
+local todimen = string.todimen
+
local context_beginvbox = context.beginvbox
local context_endvbox = context.endvbox
local context_blank = context.blank
local context_nointerlineskip = context.nointerlineskip
+local context_dummyxcell = context.dummyxcell
local variables = interfaces.variables
@@ -83,6 +89,11 @@ local v_repeat = variables["repeat"]
local v_max = variables.max
local v_fixed = variables.fixed
local v_auto = variables.auto
+local v_before = variables.before
+local v_after = variables.after
+local v_both = variables.both
+local v_samepage = variables.samepage
+local v_tight = variables.tight
local xtables = { }
typesetters.xtables = xtables
@@ -110,36 +121,40 @@ local stack, data = { }, nil
function xtables.create(settings)
table.insert(stack,data)
- local rows = { }
- local widths = { }
- local heights = { }
- local depths = { }
- local spans = { }
- local distances = { }
- local autowidths = { }
- local modes = { }
- local fixedrows = { }
- local fixedcolumns = { }
- local frozencolumns = { }
- local options = { }
+ local rows = { }
+ local widths = { }
+ local heights = { }
+ local depths = { }
+ local spans = { }
+ local distances = { }
+ local autowidths = { }
+ local modes = { }
+ local fixedrows = { }
+ local fixedcolumns = { }
+ -- local fixedcspans = { }
+ local frozencolumns = { }
+ local options = { }
+ local rowproperties = { }
data = {
- rows = rows,
- widths = widths,
- heights = heights,
- depths = depths,
- spans = spans,
- distances = distances,
- modes = modes,
- autowidths = autowidths,
- fixedrows = fixedrows,
- fixedcolumns = fixedcolumns,
- frozencolumns = frozencolumns,
- options = options,
- nofrows = 0,
- nofcolumns = 0,
- currentrow = 0,
- currentcolumn = 0,
- settings = settings or { },
+ rows = rows,
+ widths = widths,
+ heights = heights,
+ depths = depths,
+ spans = spans,
+ distances = distances,
+ modes = modes,
+ autowidths = autowidths,
+ fixedrows = fixedrows,
+ fixedcolumns = fixedcolumns,
+ -- fixedcspans = fixedcspans,
+ frozencolumns = frozencolumns,
+ options = options,
+ nofrows = 0,
+ nofcolumns = 0,
+ currentrow = 0,
+ currentcolumn = 0,
+ settings = settings or { },
+ rowproperties = rowproperties,
}
local function add_zero(t,k)
t[k] = 0
@@ -155,6 +170,9 @@ function xtables.create(settings)
nx = 0,
ny = 0,
list = false,
+ wd = 0,
+ ht = 0,
+ dp = 0,
}
row[c] = cell
if c > data.nofcolumns then
@@ -180,24 +198,28 @@ function xtables.create(settings)
setmetatableindex(fixedrows,add_zero)
setmetatableindex(fixedcolumns,add_zero)
setmetatableindex(options,add_table)
+ -- setmetatableindex(fixedcspans,add_table)
+ --
+ local globaloptions = settings_to_hash(settings.option)
--
- settings.columndistance = tonumber(settings.columndistance) or 0
- settings.rowdistance = tonumber(settings.rowdistance) or 0
- settings.leftmargindistance = tonumber(settings.leftmargindistance) or 0
+ settings.columndistance = tonumber(settings.columndistance) or 0
+ settings.rowdistance = tonumber(settings.rowdistance) or 0
+ settings.leftmargindistance = tonumber(settings.leftmargindistance) or 0
settings.rightmargindistance = tonumber(settings.rightmargindistance) or 0
- settings.options = settings_to_hash(settings.option)
- settings.textwidth = tonumber(settings.textwidth) or texget("hsize")
- settings.lineheight = tonumber(settings.lineheight) or texgetdimen("lineheight")
- settings.maxwidth = tonumber(settings.maxwidth) or settings.textwidth/8
+ settings.options = globaloptions
+ settings.textwidth = tonumber(settings.textwidth) or texget("hsize")
+ settings.lineheight = tonumber(settings.lineheight) or texgetdimen("lineheight")
+ settings.maxwidth = tonumber(settings.maxwidth) or settings.textwidth/8
-- if #stack > 0 then
-- settings.textwidth = texget("hsize")
-- end
data.criterium_v = 2 * data.settings.lineheight
data.criterium_h = .75 * data.settings.textwidth
-
+ --
+ data.tight = globaloptions[v_tight] and true or false
end
-function xtables.initialize_reflow_width(option)
+function xtables.initialize_reflow_width(option,width)
local r = data.currentrow
local c = data.currentcolumn + 1
local drc = data.rows[r][c]
@@ -218,8 +240,7 @@ function xtables.initialize_reflow_width(option)
data.currentcolumn = c
end
--- local function rather_fixed(n)
--- for n in node.
+-- todo: we can better set the cell values in one go
function xtables.set_reflow_width()
local r = data.currentrow
@@ -234,50 +255,105 @@ function xtables.set_reflow_width()
--
drc.list = true -- we don't need to keep the content around as we're in trial mode (no: copy_node_list(tb))
--
- local widths, width = data.widths, getfield(tb,"width")
- if width > widths[c] then
- widths[c] = width
- end
- local heights, height = data.heights, getfield(tb,"height")
- if height > heights[r] then
- heights[r] = height
+ local width = getfield(tb,"width")
+ local height = getfield(tb,"height")
+ local depth = getfield(tb,"depth")
+ --
+ local widths = data.widths
+ local heights = data.heights
+ local depths = data.depths
+ local cspan = drc.nx
+ if cspan < 2 then
+ if width > widths[c] then
+ widths[c] = width
+ end
+ else
+ local options = data.options[r][c]
+ if data.tight then
+ -- no check
+ elseif not options then
+ if width > widths[c] then
+ widths[c] = width
+ end
+ elseif not options[v_tight] then
+ if width > widths[c] then
+ widths[c] = width
+ end
+ end
end
- local depths, depth = data.depths, getfield(tb,"depth")
- if depth > depths[r] then
- depths[r] = depth
+ -- if cspan > 1 then
+ -- local f = data.fixedcspans[c]
+ -- local w = f[cspan] or 0
+ -- if width > w then
+ -- f[cspan] = width -- maybe some day a solution for autospanmax and so
+ -- end
+ -- end
+ if drc.ny < 2 then
+ if height > heights[r] then
+ heights[r] = height
+ end
+ if depth > depths[r] then
+ depths[r] = depth
+ end
end
--
+ drc.wd = width
+ drc.ht = height
+ drc.dp = depth
+ --
local dimensionstate = texgetcount("frameddimensionstate")
local fixedcolumns = data.fixedcolumns
local fixedrows = data.fixedrows
if dimensionstate == 1 then
- if width > fixedcolumns[c] then -- how about a span here?
- fixedcolumns[c] = width
- end
+ if cspan > 1 then
+ -- ignore width
+ elseif width > fixedcolumns[c] then -- how about a span here?
+ fixedcolumns[c] = width
+ end
elseif dimensionstate == 2 then
fixedrows[r] = height
elseif dimensionstate == 3 then
fixedrows[r] = height -- width
fixedcolumns[c] = width -- height
- elseif data.options[v_auto] then -- new per 5/5/2014
- data.autowidths[c] = true
- else
- -- no dimensions are set in the cell
- if width <= data.criterium_h and height >= data.criterium_v then
- -- somewhat tricky branch
- if width > fixedcolumns[c] then -- how about a span here?
- -- maybe an image, so let's fix
- fixedcolumns[c] = width
- end
- else
- -- safeguard as it could be text that can be recalculated
- -- and the previous branch could have happened in a previous
- -- row and then forces a wrong one-liner in a multiliner
- if width > fixedcolumns[c] then
- data.autowidths[c] = true -- new per 5/5/2014
- end
+ elseif width <= data.criterium_h and height >= data.criterium_v then
+ -- somewhat tricky branch
+ if width > fixedcolumns[c] then -- how about a span here?
+ -- maybe an image, so let's fix
+ fixedcolumns[c] = width
end
end
+--
+-- -- this fails so not good enough predictor
+--
+-- -- \startxtable
+-- -- \startxrow
+-- -- \startxcell knuth \stopxcell
+-- -- \startxcell \input knuth \stopxcell
+-- -- \stopxrow
+--
+-- else
+-- local o = data.options[r][c]
+-- if o and o[v_auto] then -- new per 5/5/2014 - removed per 15/07/2014
+-- data.autowidths[c] = true
+-- else
+-- -- no dimensions are set in the cell
+-- if width <= data.criterium_h and height >= data.criterium_v then
+-- -- somewhat tricky branch
+-- if width > fixedcolumns[c] then -- how about a span here?
+-- -- maybe an image, so let's fix
+-- fixedcolumns[c] = width
+-- end
+-- else
+-- -- safeguard as it could be text that can be recalculated
+-- -- and the previous branch could have happened in a previous
+-- -- row and then forces a wrong one-liner in a multiliner
+-- if width > fixedcolumns[c] then
+-- data.autowidths[c] = true -- new per 5/5/2014 - removed per 15/07/2014
+-- end
+-- end
+-- end
+-- end
+--
--
drc.dimensionstate = dimensionstate
--
@@ -324,7 +400,6 @@ function xtables.initialize_reflow_height()
end
texsetdimen("d_tabl_x_width",w)
local dimensionstate = drc.dimensionstate or 0
--- print(r,c,w,data.autowidths[c])
if dimensionstate == 1 or dimensionstate == 3 then
-- width was fixed so height is known
texsetcount("c_tabl_x_skip_mode",1)
@@ -334,6 +409,8 @@ function xtables.initialize_reflow_height()
elseif data.autowidths[c] then
-- width has changed so we need to recalculate the height
texsetcount("c_tabl_x_skip_mode",0)
+ elseif data.fixedcolumns[c] then
+ texsetcount("c_tabl_x_skip_mode",0) -- new
else
texsetcount("c_tabl_x_skip_mode",1)
end
@@ -347,18 +424,30 @@ function xtables.set_reflow_height()
-- while row[c].span do -- we could adapt drc.nx instead
-- c = c + 1
-- end
- local tb = getbox("b_tabl_x")
+ local tb = getbox("b_tabl_x")
local drc = row[c]
- if data.fixedrows[r] == 0 then -- and drc.dimensionstate < 2
- local heights, height = data.heights, getfield(tb,"height")
- if height > heights[r] then
- heights[r] = height
- end
- local depths, depth = data.depths, getfield(tb,"depth")
- if depth > depths[r] then
- depths[r] = depth
+ --
+ local width = getfield(tb,"width")
+ local height = getfield(tb,"height")
+ local depth = getfield(tb,"depth")
+ --
+ if drc.ny < 2 then
+ if data.fixedrows[r] == 0 then -- and drc.dimensionstate < 2
+ local heights = data.heights
+ local depths = data.depths
+ if height > heights[r] then
+ heights[r] = height
+ end
+ if depth > depths[r] then
+ depths[r] = depth
+ end
end
end
+ --
+ drc.wd = width
+ drc.ht = height
+ drc.dp = depth
+ --
-- c = c + drc.nx - 1
-- data.currentcolumn = c
end
@@ -372,23 +461,35 @@ function xtables.initialize_construct()
c = c + 1
end
data.currentcolumn = c
- local widths = data.widths
+ local widths = data.widths
local heights = data.heights
- local depths = data.depths
- local w = widths[c]
- local h = heights[r]
- local d = depths[r]
+ local depths = data.depths
+ --
local drc = row[c]
+ local wd = drc.wd
+ local ht = drc.ht
+ local dp = drc.dp
+ --
+ local width = widths[c]
+ local height = heights[r]
+ local depth = depths[r]
+ --
for x=1,drc.nx-1 do
- w = w + widths[c+x]
+ width = width + widths[c+x]
end
- for y=1,drc.ny-1 do
- h = h + heights[r+y]
- d = d + depths[r+y]
+ --
+ local total = height + depth
+ local ny = drc.ny
+ if ny > 1 then
+ for y=1,ny-1 do
+ local nxt = r + y
+ total = total + heights[nxt] + depths[nxt]
+ end
end
- texsetdimen("d_tabl_x_width",w)
- texsetdimen("d_tabl_x_height",h + d)
- texsetdimen("d_tabl_x_depth",0)
+ --
+ texsetdimen("d_tabl_x_width",width)
+ texsetdimen("d_tabl_x_height",total)
+ texsetdimen("d_tabl_x_depth",0) -- for now
end
function xtables.set_construct()
@@ -401,8 +502,7 @@ function xtables.set_construct()
-- end
local drc = row[c]
-- this will change as soon as in luatex we can reset a box list without freeing
--- drc.list = copy_node_list(getbox("b_tabl_x"))
-drc.list = takebox("b_tabl_x")
+ drc.list = takebox("b_tabl_x")
-- c = c + drc.nx - 1
-- data.currentcolumn = c
end
@@ -435,6 +535,8 @@ function xtables.reflow_width()
local maxwidth = settings.maxwidth
-- calculate width
local widths = data.widths
+ local heights = data.heights
+ local depths = data.depths
local distances = data.distances
local autowidths = data.autowidths
local fixedcolumns = data.fixedcolumns
@@ -448,6 +550,7 @@ function xtables.reflow_width()
showwidths("stage 1",widths,autowidths)
end
local noffrozen = 0
+ -- inspect(data.fixedcspans)
if options[v_max] then
for c=1,nofcolumns do
width = width + widths[c]
@@ -570,16 +673,50 @@ function xtables.reflow_width()
--
data.currentrow = 0
data.currentcolumn = 0
+ --
+-- inspect(data)
end
function xtables.reflow_height()
data.currentrow = 0
data.currentcolumn = 0
local settings = data.settings
+ --
+ -- analyze ny
+ --
+ local nofrows = data.nofrows
+ local nofcolumns = data.nofcolumns
+ local widths = data.widths
+ local heights = data.heights
+ local depths = data.depths
+ --
+ for r=1,nofrows do
+ for c=1,nofcolumns do
+ local drc = data.rows[r][c]
+ if drc then
+ local ny = drc.ny
+ if ny > 1 then
+ local height = heights[r]
+ local depth = depths[r]
+ local total = height + depth
+ local htdp = drc.ht + drc.dp
+ for y=1,ny-1 do
+ local nxt = r + y
+ total = total + heights[nxt] + depths[nxt]
+ end
+ local delta = htdp - total
+ if delta > 0 then
+ delta = delta / ny
+ for y=1,ny do
+ heights[y] = heights[y] + delta
+ end
+ end
+ end
+ end
+ end
+ end
+ --
if settings.options[v_height] then
- local heights = data.heights
- local depths = data.depths
- local nofrows = data.nofrows
local totalheight = 0
local totaldepth = 0
for i=1,nofrows do
@@ -597,6 +734,8 @@ function xtables.reflow_height()
end
end
end
+ --
+-- inspect(data)
end
local function showspans(data)
@@ -636,6 +775,7 @@ function xtables.construct()
local rowdistance = settings.rowdistance
local leftmargindistance = settings.leftmargindistance
local rightmargindistance = settings.rightmargindistance
+ local rowproperties = data.rowproperties
-- ranges can be mixes so we collect
if trace_xtable then
@@ -728,14 +868,33 @@ function xtables.construct()
result[nofr][4] = true
end
nofr = nofr + 1
+ local rp = rowproperties[r]
+ -- we have a direction issue here but hpack_node_list(list,0,"exactly","TLT") cannot be used
+ -- due to the fact that we need the width
+ local hbox = hpack_node_list(list)
+ setfield(hbox,"dir","TLT")
result[nofr] = {
- hpack_node_list(list),
+ hbox,
size,
i < nofrange and rowdistance > 0 and rowdistance or false, -- might move
- false
+ false,
+ rp and rp.samepage or false,
}
end
end
+ if nofr > 0 then
+ -- the [5] slot gets the after break
+ result[1] [5] = false
+ result[nofr][5] = false
+ for i=2,nofr-1 do
+ local r = result[i]
+ if r == v_both or r == v_before then
+ result[i-1][5] = true
+ elseif r == v_after then
+ result[i][5] = true
+ end
+ end
+ end
return result
end
local body = collect_range(ranges[body_mode])
@@ -769,8 +928,14 @@ local function inject(row,copy,package)
context_nointerlineskip() -- figure out a better way
if row[4] then
-- nothing as we have a span
+ elseif row[5] then
+ if row[3] then
+ context_blank { v_samepage, row[3] .. "sp" }
+ else
+ context_blank { v_samepage }
+ end
elseif row[3] then
- context_blank(row[3] .. "sp") -- why blank ?
+ context_blank { row[3] .. "sp" } -- why blank ?
else
context(tonode(new_glue(0)))
end
@@ -823,23 +988,23 @@ local function spanheight(body,i)
end
function xtables.flush(directives) -- todo split by size / no inbetween then .. glue list kern blank
- local vsize = directives.vsize
- local method = directives.method or v_normal
- local settings = data.settings
- local results = data.results
- local rowdistance = settings.rowdistance
- local head = results[head_mode]
- local foot = results[foot_mode]
- local more = results[more_mode]
- local body = results[body_mode]
+ local height = directives.height
+ local method = directives.method or v_normal
+ local settings = data.settings
+ local results = data.results
+ local rowdistance = settings.rowdistance
+ local head = results[head_mode]
+ local foot = results[foot_mode]
+ local more = results[more_mode]
+ local body = results[body_mode]
local repeatheader = settings.header == v_repeat
local repeatfooter = settings.footer == v_repeat
- if vsize and vsize > 0 then
+ if height and height > 0 then
context_beginvbox()
local bodystart = data.bodystart or 1
local bodystop = data.bodystop or #body
if bodystart > 0 and bodystart <= bodystop then
- local bodysize = vsize
+ local bodysize = height
local footsize = total(foot,rowdistance)
local headsize = total(head,rowdistance)
local moresize = total(more,rowdistance)
@@ -926,7 +1091,7 @@ function xtables.flush(directives) -- todo split by size / no inbetween then ..
texsetcount("global","c_tabl_x_state",2)
end
else
- if firstsize > vsize then
+ if firstsize > height then
-- get rid of the too large cell
for s=1,firstspans do
inject(body[bodystart])
@@ -950,13 +1115,13 @@ function xtables.flush(directives) -- todo split by size / no inbetween then ..
inject(head[i],false,true)
end
if #head > 0 and rowdistance > 0 then
- context_blank(rowdistance .. "sp")
+ context_blank { rowdistance .. "sp" }
end
for i=1,#body do
inject(body[i],false,true)
end
if #foot > 0 and rowdistance > 0 then
- context_blank(rowdistance .. "sp")
+ context_blank { rowdistance .. "sp" }
end
for i=1,#foot do
inject(foot[i],false,true)
@@ -1014,28 +1179,71 @@ function xtables.cleanup()
data = table.remove(stack)
end
-function xtables.next_row()
+function xtables.next_row(specification)
local r = data.currentrow + 1
data.modes[r] = texgetcount("c_tabl_x_mode")
data.currentrow = r
data.currentcolumn = 0
+ data.rowproperties[r] = specification
+end
+
+function xtables.finish_row()
+ local n = data.nofcolumns - data.currentcolumn
+ if n > 0 then
+ -- message
+ for i=1,n do
+ context_dummyxcell()
+ end
+ end
end
-- eventually we might only have commands
-commands.x_table_create = xtables.create
-commands.x_table_reflow_width = xtables.reflow_width
-commands.x_table_reflow_height = xtables.reflow_height
-commands.x_table_construct = xtables.construct
-commands.x_table_flush = xtables.flush
-commands.x_table_cleanup = xtables.cleanup
-commands.x_table_next_row = xtables.next_row
-commands.x_table_init_reflow_width = xtables.initialize_reflow_width
-commands.x_table_init_reflow_height = xtables.initialize_reflow_height
-commands.x_table_init_construct = xtables.initialize_construct
-commands.x_table_set_reflow_width = xtables.set_reflow_width
-commands.x_table_set_reflow_height = xtables.set_reflow_height
-commands.x_table_set_construct = xtables.set_construct
+implement {
+ name = "x_table_create",
+ actions = xtables.create,
+ arguments = {
+ {
+ { "option" },
+ { "textwidth", "dimen" },
+ { "textheight", "dimen" },
+ { "maxwidth", "dimen" },
+ { "lineheight", "dimen" },
+ { "columndistance", "dimen" },
+ { "leftmargindistance", "dimen" },
+ { "rightmargindistance", "dimen" },
+ { "rowdistance", "dimen" },
+ { "header" },
+ { "footer" },
+ }
+ }
+}
+
+implement {
+ name = "x_table_flush",
+ actions = xtables.flush,
+ arguments = {
+ {
+ { "method" },
+ { "height", "dimen" }
+ }
+ }
+}
-commands.x_table_r = function() context(data.currentrow or 0) end
-commands.x_table_c = function() context(data.currentcolumn or 0) end
+implement { name = "x_table_reflow_width", actions = xtables.reflow_width }
+implement { name = "x_table_reflow_height", actions = xtables.reflow_height }
+implement { name = "x_table_construct", actions = xtables.construct }
+implement { name = "x_table_cleanup", actions = xtables.cleanup }
+implement { name = "x_table_next_row", actions = xtables.next_row }
+implement { name = "x_table_next_row_option", actions = xtables.next_row, arguments = "string" }
+implement { name = "x_table_finish_row", actions = xtables.finish_row }
+implement { name = "x_table_init_reflow_width", actions = xtables.initialize_reflow_width }
+implement { name = "x_table_init_reflow_height", actions = xtables.initialize_reflow_height }
+implement { name = "x_table_init_reflow_width_option", actions = xtables.initialize_reflow_width, arguments = "string" }
+implement { name = "x_table_init_reflow_height_option", actions = xtables.initialize_reflow_height, arguments = "string" }
+implement { name = "x_table_init_construct", actions = xtables.initialize_construct }
+implement { name = "x_table_set_reflow_width", actions = xtables.set_reflow_width }
+implement { name = "x_table_set_reflow_height", actions = xtables.set_reflow_height }
+implement { name = "x_table_set_construct", actions = xtables.set_construct }
+implement { name = "x_table_r", actions = function() context(data.currentrow or 0) end }
+implement { name = "x_table_c", actions = function() context(data.currentcolumn or 0) end }
diff --git a/Master/texmf-dist/tex/context/base/tabl-xtb.mkvi b/Master/texmf-dist/tex/context/base/tabl-xtb.mkvi
index 06fb472cdfd..876abef8c8f 100644
--- a/Master/texmf-dist/tex/context/base/tabl-xtb.mkvi
+++ b/Master/texmf-dist/tex/context/base/tabl-xtb.mkvi
@@ -29,6 +29,8 @@
% - maybe only tag the box
% - scale to fit
%
+% - buffers permit verbatim but are not always handy
+
%D This module started as an afternoon experiment and surprisingly could be
%D mostly finished the same evening. Of course it builds upon existing
%D functionality. The main reason for writing it is that we occasionally
@@ -78,8 +80,13 @@
\let\dotagxtablesignal\relax % names will change
\appendtoks
- \def\dotagxtablecell {\taggedctxcommand{settagtablecell(\number\tablecellrows,\number\tablecellcolumns,\number\raggedstatus)}}%
- \def\dotagxtablesignal{\char\zerocount}% not used
+ \def\dotagxtablecell
+ {\clf_settagtablecell
+ \numexpr\tablecellrows\relax
+ \numexpr\tablecellcolumns\relax
+ \numexpr\raggedstatus\relax}%
+ \def\dotagxtablesignal
+ {\char\zerocount}% not used
\to \everyenableelements
\newdimen\d_tabl_x_width
@@ -96,8 +103,8 @@
\newcount\c_tabl_x_skip_mode % 1 = skip
\newdimen\d_tabl_x_textwidth
-\def\currentxtablerow {\ctxcommand{x_table_r()}}
-\def\currentxtablecolumn{\ctxcommand{x_table_c()}}
+\let\currentxtablerow \clf_x_table_r
+\let\currentxtablecolumn\clf_x_table_c
% \setupxtable[one][parent][a=b,c=d]
% \setupxtable[one] [a=b,c=d]
@@ -194,7 +201,7 @@
\unexpanded\def\tabl_x_embedded_start[#settings]#content\stopembeddedxtable
{\tabl_x_prepare{#settings}%
- \ctxcommand{assignbuffer("embedded_x_table",\!!bs\detokenize{#content}\!!es)}%
+ \clf_assignbuffer{embedded_x_table}{\detokenize{#content}}\catcodetable\relax
\bgroup
\let\tabl_x_start_table\tabl_x_process_buffer
\edef\tabl_x_current_buffer{embedded_x_table}%
@@ -216,12 +223,12 @@
\unexpanded\def\tabl_x_start_named_indeed[#settings]%
{\advance\c_tabl_x_nesting\plusone
- \dostarttagged\t!table\empty
+ \dostarttaggedchained\t!table\empty\??xtable
\iffirstargument
\setupcurrentxtable[#settings]%
\fi
\tabl_x_check_textwidth
- \forgetall
+ %\forgetall % else whitespace mess
\edef\tabl_x_current_buffer{\tabl_x_default_buffer}%
\normalexpanded{\buff_pickup{\tabl_x_current_buffer}{\e!start\currentxtable}{\e!stop\currentxtable}\relax\tabl_x_process\zerocount}}
@@ -240,15 +247,15 @@
\unexpanded\def\tabl_x_prepare#settings% assumes \iffirstargument to be set
{\advance\c_tabl_x_nesting\plusone
- \dostarttagged\t!table\empty
+ \dostarttaggedchained\t!table\empty\??xtable
\iffirstargument
\tabl_x_set_checked{#settings}%
\fi
\tabl_x_check_textwidth
- \forgetall}
+ }% else whitespace mess
\def\tabl_x_get_buffer
- {\ctxcommand{gettexbuffer("\tabl_x_current_buffer")}}
+ {\clf_gettexbuffer{\tabl_x_current_buffer}}
\let\tabl_x_start_row_yes \relax
\let\tabl_x_start_row_nop \relax
@@ -259,23 +266,24 @@
\unexpanded\def\tabl_x_process
{\begingroup % *
- \doifsomething{\xtableparameter\c!bodyfont}
- {\setupbodyfont[\xtableparameter\c!bodyfont]}%
+ \forgetall % moved here
+ \dontcomplain % for the moment here till we figure out where we get the overflow
+ \usebodyfontparameter\xtableparameter
\setbox\scratchbox\vbox
- {\xtableparameter\c!spaceinbetween}%
- \ctxcommand{x_table_create {
- option = "\xtableparameter\c!option",
- textwidth = \number\d_tabl_x_textwidth,
- textheight = \number\dimexpr\xtableparameter\c!textheight,
- maxwidth = \number\dimexpr\xtableparameter\c!maxwidth,
- lineheight = \number\openlineheight,
- columndistance = \number\dimexpr\xtableparameter\c!columndistance,
- leftmargindistance = \number\dimexpr\xtableparameter\c!leftmargindistance,
- rightmargindistance = \number\dimexpr\xtableparameter\c!rightmargindistance,
- rowdistance = \number\ht\scratchbox,
- header = "\xtableparameter\c!header",
- footer = "\xtableparameter\c!footer",
- } }%
+ {\doifsomething{\xtableparameter\c!spaceinbetween}{\blank[\xtableparameter\c!spaceinbetween]}}%
+ \clf_x_table_create
+ option {\xtableparameter\c!option}%
+ textwidth \d_tabl_x_textwidth
+ textheight \dimexpr\xtableparameter\c!textheight\relax
+ maxwidth \dimexpr\xtableparameter\c!maxwidth\relax
+ lineheight \openlineheight
+ columndistance \dimexpr\xtableparameter\c!columndistance\relax
+ leftmargindistance \dimexpr\xtableparameter\c!leftmargindistance\relax
+ rightmargindistance \dimexpr\xtableparameter\c!rightmargindistance\relax
+ rowdistance \ht\scratchbox
+ header {\xtableparameter\c!header}%
+ footer {\xtableparameter\c!footer}%
+ \relax
%
\letxtableparameter\c!option\empty
% not so nice but needed as we use this in the setup
@@ -290,7 +298,7 @@
\let\tabl_x_stop_cell \tabl_x_stop_cell_reflow_width
\settrialtypesetting
\tabl_x_get_buffer
- \ctxcommand{x_table_reflow_width()}\relax
+ \clf_x_table_reflow_width
\endgroup
\begingroup
\let\tabl_x_start_row_yes \tabl_x_start_row_reflow_height_yes
@@ -301,7 +309,7 @@
\let\tabl_x_stop_cell \tabl_x_stop_cell_reflow_height
\settrialtypesetting
\tabl_x_get_buffer
- \ctxcommand{x_table_reflow_height()}\relax
+ \clf_x_table_reflow_height
\endgroup
\begingroup
\let\tabl_x_start_row_yes \tabl_x_start_row_construct_yes
@@ -311,7 +319,7 @@
\let\tabl_x_start_cell_nop\tabl_x_start_cell_construct_nop
\let\tabl_x_stop_cell \tabl_x_stop_cell_construct
\tabl_x_get_buffer
- \ctxcommand{x_table_construct()}\relax
+ \clf_x_table_construct
\endgroup
\endgroup % *
\ifinsidesplitfloat
@@ -321,7 +329,7 @@
\else
\tabl_x_flush_text_checked
\fi\fi
- \ctxcommand{x_table_cleanup()}%
+ \clf_x_table_cleanup
\dostoptagged
\resetbuffer[\tabl_x_current_buffer]%
\egroup}
@@ -336,19 +344,27 @@
% in text flow: headers and footers only once
\setvalue{\??xtableflushsplit\v!yes}%
- {\ctxcommand{x_table_flush{ method = "\v!split" }}}
+ {\clf_x_table_flush
+ method {\v!split}%
+ \relax}
% in text flow: headers and footers only once
\setvalue{\??xtableflushsplit\v!no}%
- {\dontleavehmode % else no leftskip etc
- \ctxcommand{x_table_flush{ method = "\v!normal" }}}
+ {\noindent % \dontleavehmode % else no leftskip etc
+ \clf_x_table_flush
+ method {\v!normal}%
+ \relax
+ \removeunwantedspaces}
% in text flow: headers and footers get repeated
\setvalue{\??xtableflushsplit\v!repeat}%
{\doloop
- {\ctxcommand{x_table_flush{ method = "\v!split", vsize = \number\ifdim\pagegoal=\maxdimen\textheight\else\pagegoal\fi }}%
+ {\clf_x_table_flush
+ method {\v!split}%
+ height \ifdim\pagegoal=\maxdimen\textheight\else\pagegoal\fi
+ \relax
\ifcase\c_tabl_x_state
\exitloop
\else
@@ -370,7 +386,10 @@
% \stopsetups
%
% \unexpanded\def\xtablesplitflush
-% {\ctxcommand{x_table_flush{ method = "\v!split", vsize = \number\dimexpr\xtablesplitvsize\relax}}\relax}
+% {\clf_x_table_flush
+% method {\v!split}%
+% height \dimexpr\xtablesplitvsize\relax
+% \relax}
%
% \def\xtablesplitvsize
% {\ifdim\pagegoal=\maxdimen\textheight\else\pagegoal\fi}
@@ -380,7 +399,9 @@
\let\extratxtablesplitheight\zeropoint % might disappear so don't depend on it
\unexpanded\def\tabl_x_flush_float_normal
- {\ctxcommand{x_table_flush{ method = "\v!normal" }}}
+ {\clf_x_table_flush
+ method {\v!normal}%
+ \relax}
\unexpanded\def\tabl_x_flush_float_split
{\resetdirecttsplit
@@ -391,9 +412,12 @@
\let\tsplitdirectwidth \d_tabl_x_final_width
\handledirecttsplit}
-\unexpanded\def\tabl_x_split_splitter#vsize%
+\unexpanded\def\tabl_x_split_splitter#height%
{\setbox\tsplitresult\vbox
- {\ctxcommand{x_table_flush{ method = "\v!split", vsize = \number\dimexpr#vsize }}}%
+ {\clf_x_table_flush
+ method {\v!split}%
+ height \dimexpr#height\relax
+ \relax}%
\ifcase\c_tabl_x_state
\global\setfalse\somenextsplitofffloat
\else
@@ -402,14 +426,14 @@
\unexpanded\def\startxrow
{\begingroup
- \doifnextoptionalcselse\tabl_x_start_row_yes\tabl_x_start_row_nop}
+ \doifelsenextoptionalcs\tabl_x_start_row_yes\tabl_x_start_row_nop}
\unexpanded\def\tabl_x_start_row_reflow_width_yes[#settings]%
{\setupcurrentxtable[#settings]%
- \ctxcommand{x_table_next_row()}}
+ \clf_x_table_next_row}
\unexpanded\def\tabl_x_start_row_reflow_width_nop
- {\ctxcommand{x_table_next_row()}}
+ {\clf_x_table_next_row}
\unexpanded\def\tabl_x_stop_row_reflow_width
{}
@@ -421,27 +445,36 @@
\unexpanded\def\tabl_x_start_row_construct_yes[#settings]%
{\setupcurrentxtable[#settings]%
\dostarttagged\t!tablerow\empty
- \ctxcommand{x_table_next_row()}}
+ \clf_x_table_next_row_option{\xtableparameter\c!samepage}}
\unexpanded\def\tabl_x_start_row_construct_nop
{\dostarttagged\t!tablerow\empty
- \ctxcommand{x_table_next_row()}}
+ \clf_x_table_next_row}
\unexpanded\def\tabl_x_stop_row_construct
- {\dostoptagged}
+ {\clf_x_table_finish_row
+ \dostoptagged}
\unexpanded\def\stopxrow
{\tabl_x_stop_row
\endgroup}
\unexpanded\def\startxcell
- {\doifnextoptionalcselse\tabl_x_start_cell_yes\tabl_x_start_cell_nop}
+ {\doifelsenextoptionalcs\tabl_x_start_cell_yes\tabl_x_start_cell_nop}
\unexpanded\def\stopxcell
{\tabl_x_stop_cell}
+\unexpanded\def\dummyxcell#1%
+ {\tabl_x_start_cell_nop
+ \tabl_x_stop_cell}
+
+\unexpanded\def\dummyxcell
+ {\tabl_x_start_cell_nop
+ \tabl_x_stop_cell}
+
\unexpanded\def\tabl_x_begin_of_cell
- {\inhibitblank
+ {%\inhibitblank % already in framed
\everypar{\delayedbegstrut}}
\unexpanded\def\tabl_x_end_of_cell
@@ -467,8 +500,16 @@
% Although this becomes kind of messy. It saves already time that we only check
% for it when we have settings.
-\def\tabl_x_set_hsize
- {\hsize.25\maxdimen} % let's be reasonable
+% \def\tabl_x_set_hsize
+% {\hsize.25\maxdimen} % let's be reasonable
+
+% \def\tabl_x_set_hsize
+% {\edef\p_width{\xtableparameter\c!width}%
+% \ifx\p_width\empty
+% \hsize.25\maxdimen % is this really needed
+% \fi}
+
+\let\tabl_x_set_hsize\relax
\unexpanded\def\tabl_x_start_cell_reflow_width_yes[#settings]%
{\setbox\b_tabl_x\hbox\bgroup
@@ -494,7 +535,7 @@
\fi
%
\d_tabl_x_distance\xtableparameter\c!distance\relax
- \ctxcommand{x_table_init_reflow_width("\xtableparameter\c!option")}%
+ \clf_x_table_init_reflow_width_option{\xtableparameter\c!option}%
\inheritedxtableframed\bgroup
\tabl_x_begin_of_cell
\tabl_x_set_hsize}
@@ -508,7 +549,7 @@
\c_tabl_x_nx\plusone
\c_tabl_x_ny\plusone
\d_tabl_x_distance\xtableparameter\c!distance\relax
- \ctxcommand{x_table_init_reflow_width()}%
+ \clf_x_table_init_reflow_width
\inheritedxtableframed\bgroup
\tabl_x_begin_of_cell
\tabl_x_set_hsize}
@@ -517,11 +558,11 @@
{\tabl_x_end_of_cell
\egroup
\egroup
- \ctxcommand{x_table_set_reflow_width()}}
+ \clf_x_table_set_reflow_width}
\unexpanded\def\tabl_x_start_cell_reflow_height_yes[#settings]%
{\setbox\b_tabl_x\hbox\bgroup
- \ctxcommand{x_table_init_reflow_height()}%
+ \clf_x_table_init_reflow_height
\ifcase\c_tabl_x_skip_mode % can be sped up
\ifnum\c_tabl_x_nesting>\plusone
\letxtableparameter\c!height\v!fit % overloads given height
@@ -535,7 +576,7 @@
\unexpanded\def\tabl_x_start_cell_reflow_height_nop
{\setbox\b_tabl_x\hbox\bgroup
- \ctxcommand{x_table_init_reflow_height()}%
+ \clf_x_table_init_reflow_height
\ifcase\c_tabl_x_skip_mode % can be sped up
\ifnum\c_tabl_x_nesting>\plusone
\letxtableparameter\c!height\v!fit % overloads given height
@@ -552,7 +593,7 @@
\egroup
\fi
\egroup
- \ctxcommand{x_table_set_reflow_height()}}
+ \clf_x_table_set_reflow_height}
\unexpanded\def\tabl_x_start_cell_construct_yes[#settings]%
{\dostarttagged\t!tablecell\empty % can't we just tag the box
@@ -560,7 +601,7 @@
\setupcurrentxtable[#settings]%
\letxtableparameter\c!width \d_tabl_x_width % overloads given width
\letxtableparameter\c!height\d_tabl_x_height % overloads given height
- \ctxcommand{x_table_init_construct()}%
+ \clf_x_table_init_construct
\inheritedxtableframed\bgroup
\tabl_x_begin_of_cell
\dotagxtablecell}
@@ -570,7 +611,7 @@
\setbox\b_tabl_x\hbox\bgroup
\letxtableparameter\c!width \d_tabl_x_width % overloads given width
\letxtableparameter\c!height\d_tabl_x_height % overloads given height (commenting it ... nice option)
- \ctxcommand{x_table_init_construct()}%
+ \clf_x_table_init_construct
\inheritedxtableframed\bgroup
\tabl_x_begin_of_cell
\dotagxtablecell}
@@ -580,7 +621,7 @@
\egroup
\dotagxtablesignal % harmless spot
\egroup
- \ctxcommand{x_table_set_construct()}%
+ \clf_x_table_set_construct
\dostoptagged}
\unexpanded\def\startxcellgroup
@@ -677,7 +718,7 @@
\unexpanded\def\startxgroup
{\begingroup
- \doifnextoptionalcselse\tabl_x_start_group_delayed_one\relax}
+ \doifelsenextoptionalcs\tabl_x_start_group_delayed_one\relax}
\unexpanded\def\stopxgroup
{\endgroup}
@@ -695,7 +736,7 @@
\chaintocurrentxtable{#tag}%
\fi
\edef\currentxtable{#tag}%
- \doifnextoptionalcselse\setupcurrentxtable\relax}
+ \doifelsenextoptionalcs\setupcurrentxtable\relax}
\let\startxrowgroup \startxgroup
\let\stopxrowgroup \stopxgroup
@@ -706,7 +747,7 @@
\unexpanded\def\startxcell
{\begingroup
- \doifnextoptionalcselse\tabl_x_start_cell_delayed_one\tabl_x_start_cell_nop}
+ \doifelsenextoptionalcs\tabl_x_start_cell_delayed_one\tabl_x_start_cell_nop}
\unexpanded\def\tabl_x_start_cell_delayed_one[#tag]%
% {\ifcsname\namedxtablehash{#tag}\s!parent\endcsname
@@ -721,7 +762,7 @@
\chaintocurrentxtable{#tag}%
\fi
\edef\currentxtable{#tag}%
- \doifnextoptionalcselse\tabl_x_start_cell_yes\tabl_x_start_cell_nop}
+ \doifelsenextoptionalcs\tabl_x_start_cell_yes\tabl_x_start_cell_nop}
\unexpanded\def\stopxcell
{\tabl_x_stop_cell
@@ -731,7 +772,7 @@
\unexpanded\def\startxrow
{\begingroup
- \doifnextoptionalcselse\tabl_x_start_row_delayed_one\tabl_x_start_row_nop}
+ \doifelsenextoptionalcs\tabl_x_start_row_delayed_one\tabl_x_start_row_nop}
\unexpanded\def\tabl_x_start_row_delayed_one[#tag]%
% {\ifcsname\namedxtablehash{#tag}\s!parent\endcsname
@@ -746,7 +787,7 @@
\chaintocurrentxtable{#tag}%
\fi
\edef\currentxtable{#tag}%
- \doifnextoptionalcselse\tabl_x_start_row_yes\tabl_x_start_row_nop}
+ \doifelsenextoptionalcs\tabl_x_start_row_yes\tabl_x_start_row_nop}
\unexpanded\def\stopxrow
{\tabl_x_stop_row
diff --git a/Master/texmf-dist/tex/context/base/task-ini.lua b/Master/texmf-dist/tex/context/base/task-ini.lua
index 3dc5e71b4c8..ed9989a81cc 100644
--- a/Master/texmf-dist/tex/context/base/task-ini.lua
+++ b/Master/texmf-dist/tex/context/base/task-ini.lua
@@ -21,9 +21,11 @@ local tasks = nodes.tasks
local prependaction = tasks.prependaction
local appendaction = tasks.appendaction
local disableaction = tasks.disableaction
+local enableaction = tasks.enableaction
local freezegroup = tasks.freezegroup
local freezecallbacks = callbacks.freeze
+appendaction("processors", "normalizers", "typesetters.wrappers.handler") -- disabled
appendaction("processors", "normalizers", "typesetters.characters.handler") -- always on
appendaction("processors", "normalizers", "fonts.collections.process") -- disabled
appendaction("processors", "normalizers", "fonts.checkers.missing") -- disabled
@@ -37,11 +39,13 @@ appendaction("processors", "characters", "typesetters.breakpoints.handler")
appendaction("processors", "characters", "scripts.injectors.handler") -- disabled
appendaction("processors", "words", "languages.replacements.handler") -- disabled
-appendaction("processors", "words", "builders.kernel.hyphenation") -- always on
+
+appendaction("processors", "words", "languages.hyphenators.handler") -- always on
+
appendaction("processors", "words", "languages.words.check") -- disabled -- might move up, no disc check needed then
appendaction("processors", "words", "typesetters.initials.handler") -- disabled -- might move up
-appendaction("processors", "words", "typesetters.firstlines.handler") -- disabled -- might move up
+appendaction("processors", "words", "typesetters.firstlines.handler") -- disabled -- might move down
appendaction("processors", "fonts", "builders.paragraphs.solutions.splitters.split") -- experimental
appendaction("processors", "fonts", "nodes.handlers.characters") -- maybe todo
@@ -57,10 +61,12 @@ appendaction("processors", "lists", "typesetters.spacings.handler")
appendaction("processors", "lists", "typesetters.kerns.handler") -- disabled
appendaction("processors", "lists", "typesetters.digits.handler") -- disabled (after otf handling)
appendaction("processors", "lists", "typesetters.italics.handler") -- disabled (after otf/kern handling)
-------------("processors", "lists", "typesetters.initials.handler") -- disabled
+appendaction("processors", "lists", "languages.visualizediscretionaries") -- disabled
+
+-- appendaction("processors", "lists", "typesetters.initials.handler") -- disabled
-appendaction("shipouts", "normalizers", "builders.paragraphs.expansion.trace") -- disabled
appendaction("shipouts", "normalizers", "nodes.handlers.cleanuppage") -- disabled
+appendaction("shipouts", "normalizers", "builders.paragraphs.expansion.trace") -- disabled
appendaction("shipouts", "normalizers", "typesetters.alignments.handler")
appendaction("shipouts", "normalizers", "nodes.references.handler") -- disabled
appendaction("shipouts", "normalizers", "nodes.destinations.handler") -- disabled
@@ -102,10 +108,8 @@ appendaction("math", "builders", "builders.kernel.mlist_to_hlist")
------------("math", "builders", "noads.handlers.italics", nil, "nohead") -- disabled
appendaction("math", "builders", "typesetters.directions.processmath") -- disabled (has to happen pretty late)
--- quite experimental (nodes.handlers.graphicvadjust might go away)
-
appendaction("finalizers", "lists", "builders.paragraphs.keeptogether")
-appendaction("finalizers", "lists", "nodes.handlers.graphicvadjust") -- todo
+------------("finalizers", "lists", "nodes.handlers.graphicvadjust") -- todo
appendaction("finalizers", "fonts", "builders.paragraphs.solutions.splitters.optimize") -- experimental
appendaction("finalizers", "lists", "builders.paragraphs.tag")
@@ -128,6 +132,7 @@ appendaction ("shipouts", "normalizers", "nodes.properties.delayed") -- enabl
-- speedup: only kick in when used
+disableaction("processors", "typesetters.wrappers.handler")
disableaction("processors", "languages.replacements.handler")
disableaction("processors", "typesetters.characteralign.handler")
disableaction("processors", "scripts.autofontfeature.handler")
@@ -147,6 +152,7 @@ disableaction("processors", "typesetters.firstlines.handler")
disableaction("processors", "typesetters.spacings.handler")
disableaction("processors", "typesetters.kerns.handler")
disableaction("processors", "typesetters.italics.handler")
+disableaction("processors", "languages.visualizediscretionaries")
disableaction("processors", "nodes.handlers.stripping")
disableaction("shipouts", "builders.paragraphs.expansion.trace")
@@ -164,7 +170,6 @@ disableaction("shipouts", "nodes.visualizers.handler")
disableaction("shipouts", "nodes.handlers.accessibility")
disableaction("shipouts", "nodes.handlers.backgrounds")
disableaction("shipouts", "nodes.handlers.alignbackgrounds")
-disableaction("shipouts", "nodes.handlers.cleanuppage")
disableaction("shipouts", "nodes.references.handler")
disableaction("shipouts", "nodes.destinations.handler")
@@ -177,7 +182,7 @@ disableaction("processors", "builders.paragraphs.solutions.splitters.split")
disableaction("finalizers", "builders.paragraphs.keeptogether")
disableaction("finalizers", "builders.paragraphs.solutions.splitters.optimize")
-disableaction("finalizers", "nodes.handlers.graphicvadjust") -- sort of obsolete
+-------------("finalizers", "nodes.handlers.graphicvadjust") -- sort of obsolete
disableaction("finalizers", "builders.paragraphs.tag")
disableaction("math", "noads.handlers.showtree")
@@ -216,3 +221,18 @@ freezegroup("vboxbuilders", "normalizers")
freezegroup("math", "normalizers")
freezegroup("math", "builders")
+
+-- new: disabled here
+
+disableaction("processors", "builders.kernel.ligaturing")
+disableaction("processors", "builders.kernel.kerning")
+
+directives.register("nodes.basepass", function(v)
+ if v then
+ disableaction("processors", "builders.kernel.ligaturing")
+ disableaction("processors", "builders.kernel.kerning")
+ else
+ enableaction("processors", "builders.kernel.ligaturing")
+ enableaction("processors", "builders.kernel.kerning")
+ end
+end)
diff --git a/Master/texmf-dist/tex/context/base/toks-ini.lua b/Master/texmf-dist/tex/context/base/toks-ini.lua
index 0f0c016f8e9..f8b94589040 100644
--- a/Master/texmf-dist/tex/context/base/toks-ini.lua
+++ b/Master/texmf-dist/tex/context/base/toks-ini.lua
@@ -5,338 +5,252 @@ if not modules then modules = { } end modules ['toks-ini'] = {
license = "see context related readme files"
}
-local context, commands = context, commands
-local utfbyte, utfchar, utfvalues = utf.byte, utf.char, utf.values
-local format, gsub = string.format, string.gsub
-
---[[ldx--
-<p>This code is experimental and needs a cleanup. The visualizers will move to
-a module.</p>
---ldx]]--
-
--- 1 = command, 2 = modifier (char), 3 = controlsequence id
---
--- callback.register('token_filter', token.get_next)
---
--- token.get_next()
--- token.expand()
--- token.create()
--- token.csname_id()
--- token.csname_name(v)
--- token.command_id()
--- token.command_name(v)
--- token.is_expandable()
--- token.is_activechar()
--- token.lookup(v)
-
--- actually, we can use token registers to store tokens
-
-local token, tex = token, tex
-
-local createtoken = token.create
-local csname_id = token.csname_id
-local command_id = token.command_id
-local command_name = token.command_name
-local get_next = token.get_next
-local expand = token.expand
-local is_activechar = token.is_activechar
-local csname_name = token.csname_name
-
-tokens = tokens or { }
-local tokens = tokens
-
-tokens.vbox = createtoken("vbox")
-tokens.hbox = createtoken("hbox")
-tokens.vtop = createtoken("vtop")
-tokens.bgroup = createtoken(utfbyte("{"), 1)
-tokens.egroup = createtoken(utfbyte("}"), 2)
-
-tokens.letter = function(chr) return createtoken(utfbyte(chr), 11) end
-tokens.other = function(chr) return createtoken(utfbyte(chr), 12) end
-
-tokens.letters = function(str)
- local t, n = { }, 0
- for chr in utfvalues(str) do
- n = n + 1
- t[n] = createtoken(chr, 11)
- end
- return t
-end
-
-tokens.collectors = tokens.collectors or { }
-local collectors = tokens.collectors
-
-collectors.data = collectors.data or { }
-local collectordata = collectors.data
+tokens = tokens or { }
+
+local tokens = tokens
+local tostring = tostring
+local utfchar = utf.char
+local char = string.char
+local printtable = table.print
+local concat = table.concat
+
+if newtoken then
+
+ if setinspector then
+
+ local istoken = newtoken.is_token
+ local simple = { letter = "letter", other_char = "other" }
+
+ local function astable(t)
+ if t and istoken(t) then
+ local cmdname = t.cmdname
+ local simple = simple[cmdname]
+ if simple then
+ return {
+ category = simple,
+ character = utfchar(t.mode) or nil,
+ }
+ else
+ return {
+ command = t.command,
+ id = t.id,
+ tok = t.tok,
+ csname = t.csname,
+ active = t.active,
+ expandable = t.expandable,
+ protected = t.protected,
+ mode = t.mode,
+ cmdname = cmdname,
+ }
+ end
+ end
+ end
-collectors.registered = collectors.registered or { }
-local registered = collectors.registered
+ tokens.istoken = istoken
+ tokens.astable = astable
-local function printlist(data)
- callbacks.push('token_filter', function ()
- callbacks.pop('token_filter') -- tricky but the nil assignment helps
- return data
- end)
-end
+ setinspector(function(v) if istoken(v) then printtable(astable(v),tostring(v)) return true end end)
-tex.printlist = printlist -- will change to another namespace
+ end
-function collectors.flush(tag)
- printlist(collectordata[tag])
-end
+ local scan_toks = newtoken.scan_toks
+ local scan_string = newtoken.scan_string
+ local scan_int = newtoken.scan_int
+ local scan_code = newtoken.scan_code
+ local scan_dimen = newtoken.scan_dimen
+ local scan_glue = newtoken.scan_glue
+ local scan_keyword = newtoken.scan_keyword
+ local scan_token = newtoken.scan_token
+ local scan_word = newtoken.scan_word
+ local scan_number = newtoken.scan_number
-function collectors.test(tag)
- printlist(collectordata[tag])
-end
+ local get_next = newtoken.get_next
-function collectors.register(name)
- registered[csname_id(name)] = name
-end
+ local set_macro = newtoken.set_macro
-local call = command_id("call")
-local letter = command_id("letter")
-local other = command_id("other_char")
-
-function collectors.install(tag,end_cs)
- local data, d = { }, 0
- collectordata[tag] = data
- local endcs = csname_id(end_cs)
- while true do
- local t = get_next()
- local a, b = t[1], t[3]
- if b == endcs then
- context["end_cs"]()
- return
- elseif a == call and registered[b] then
- expand()
+ set_macro = function(k,v,g)
+ if g == "global" then
+ context.setgvalue(k,v or '')
else
- d = d + 1
- data[d] = t
+ context.setvalue(k,v or '')
end
end
-end
-
-function collectors.handle(tag,handle,flush)
- collectordata[tag] = handle(collectordata[tag])
- if flush then
- collectors.flush(tag)
- end
-end
-local show_methods = { }
-collectors.show_methods = show_methods
+ local bits = {
+ escape = 2^ 0,
+ begingroup = 2^ 1,
+ endgroup = 2^ 2,
+ mathshift = 2^ 3,
+ alignment = 2^ 4,
+ endofline = 2^ 5,
+ parameter = 2^ 6,
+ superscript = 2^ 7,
+ subscript = 2^ 8,
+ ignore = 2^ 9,
+ space = 2^10, -- 1024
+ letter = 2^11,
+ other = 2^12,
+ active = 2^13,
+ comment = 2^14,
+ invalid = 2^15,
+ --
+ character = 2^11 + 2^12,
+ whitespace = 2^13 + 2^10, -- / needs more checking
+ --
+ open = 2^10 + 2^1, -- space + begingroup
+ close = 2^10 + 2^2, -- space + endgroup
+ }
+
+ -- for k, v in next, bits do bits[v] = k end
+
+ tokens.bits = bits
+
+ local space_bits = bits.space
+
+ -- words are space or \relax terminated and the trailing space is gobbled; a word
+ -- can contain any non-space letter/other
+
+ local t = { } -- small optimization, a shared variable that is not reset
+
+ if scan_word then
+
+ scan_number = function(base)
+ local s = scan_word()
+ if not s then
+ return nil
+ elseif base then
+ return tonumber(s,base)
+ else
+ return tonumber(s)
+ end
+ end
-function collectors.show(tag, method)
- if type(tag) == "table" then
- show_methods[method or 'a'](tag)
else
- show_methods[method or 'a'](collectordata[tag])
- end
-end
-
-function collectors.defaultwords(t,str)
- local n = #t
- n = n + 1
- t[n] = tokens.bgroup
- n = n + 1
- t[n] = createtoken("red")
- for i=1,#str do
- n = n + 1
- t[n] = tokens.other('*')
- end
- n = n + 1
- t[n] = tokens.egroup
-end
-function collectors.dowithwords(tag,handle)
- local t, w, tn, wn = { }, { }, 0, 0
- handle = handle or collectors.defaultwords
- local tagdata = collectordata[tag]
- for k=1,#tagdata do
- local v = tagdata[k]
- if v[1] == letter then
- wn = wn + 1
- w[wn] = v[2]
- else
- if wn > 0 then
- handle(t,w)
- wn = 0
+ scan_word = function()
+ local n = 0
+ while true do
+ local c = scan_code()
+ if c then
+ n = n + 1
+ t[n] = utfchar(c)
+ elseif scan_code(space_bits) then
+ if n > 0 then
+ break
+ end
+ elseif n > 0 then
+ break
+ else
+ return
+ end
end
- tn = tn + 1
- t[tn] = v
+ return concat(t,"",1,n)
end
- end
- if wn > 0 then
- handle(t,w)
- end
- collectordata[tag] = t
-end
-local function showtoken(t)
- if t then
- local cmd, chr, id, cs, name = t[1], t[2], t[3], nil, command_name(t) or ""
- if cmd == letter or cmd == other then
- return format("%s-> %s -> %s", name, chr, utfchar(chr))
- elseif id > 0 then
- cs = csname_name(t) or nil
- if cs then
- return format("%s-> %s", name, cs)
- elseif tonumber(chr) < 0 then
- return format("%s-> %s", name, id)
+ -- so we gobble the space (like scan_int) (number has to be space or non-char terminated
+ -- as we accept 0xabcd and such so there is no clear separator for a keyword
+
+ scan_number = function(base)
+ local n = 0
+ while true do
+ local c = scan_code()
+ if c then
+ n = n + 1
+ t[n] = char(c)
+ elseif scan_code(space_bits) then
+ if n > 0 then
+ break
+ end
+ elseif n > 0 then
+ break
+ else
+ return
+ end
+ end
+ local s = concat(t,"",1,n)
+ if base then
+ return tonumber(s,base)
else
- return format("%s-> (%s,%s)", name, chr, id)
+ return tonumber(s)
end
- else
- return format("%s", name)
end
- else
- return "no node"
- end
-end
-
-collectors.showtoken = showtoken
-
-function collectors.trace()
- local t = get_next()
- logs.report("tokenlist",showtoken(t))
- return t
-end
-
--- these might move to a runtime module
-show_methods.a = function(data) -- no need to store the table, just pass directly
- local function row(one,two,three,four,five)
- context.NC() context(one)
- context.NC() context(two)
- context.NC() context(three)
- context.NC() context(four)
- context.NC() context(five)
- context.NC() context.NR()
end
- context.starttabulate { "|T|Tr|cT|Tr|T|" }
- row("cmd","chr","","id","name")
- context.HL()
- for _,v in next, data do
- local cmd, chr, id, cs, sym = v[1], v[2], v[3], "", ""
- local name = gsub(command_name(v) or "","_","\\_")
- if id > 0 then
- cs = csname_name(v) or ""
- if cs ~= "" then cs = "\\string " .. cs end
- else
- id = ""
- end
- if cmd == letter or cmd == other then
- sym = "\\char " .. chr
- end
- if tonumber(chr) < 0 then
- row(name,"",sym,id,cs)
- else
- row(name,chr,sym,id,cs)
- end
- end
- context.stoptabulate()
-end
-local function show_b_c(data,swap) -- no need to store the table, just pass directly
- local function row(one,two,three)
- context.NC() context(one)
- context.NC() context(two)
- context.NC() context(three)
- context.NC() context.NR()
- end
- if swap then
- context.starttabulate { "|Tl|Tl|Tr|" }
- else
- context.starttabulate { "|Tl|Tr|Tl|" }
- end
- row("cmd","chr","name")
- context.HL()
- for _,v in next, data do
- local cmd, chr, id, cs, sym = v[1], v[2], v[3], "", ""
- local name = gsub(command_name(v) or "","_","\\_")
- if id > 0 then
- cs = csname_name(v) or ""
- end
- if cmd == letter or cmd == other then
- sym = "\\char " .. chr
- elseif cs == "" then
- -- okay
- elseif is_activechar(v) then
- sym = "\\string " .. cs
+ -- -- the next one cannot handle \iftrue true\else false\fi
+ --
+ -- local function scan_boolean()
+ -- if scan_keyword("true") then
+ -- return true
+ -- elseif scan_keyword("false") then
+ -- return false
+ -- else
+ -- return nil
+ -- end
+ -- end
+
+ local function scan_boolean()
+ local kw = scan_word()
+ if kw == "true" then
+ return true
+ elseif kw == "false" then
+ return false
else
- sym = "\\string\\" .. cs
- end
- if swap then
- row(name,sym,chr)
- elseif tonumber(chr) < 0 then
- row(name,"",sym)
- else
- row(name,chr,sym)
+ return nil
end
end
- context.stoptabulate()
-end
--- Even more experimental ...
+ tokens.scanners = { -- these expand
+ token = scan_token or get_next,
+ toks = scan_toks,
+ tokens = scan_toks,
+ dimen = scan_dimen,
+ dimension = scan_dimen,
+ glue = scan_glue,
+ skip = scan_glue,
+ integer = scan_int,
+ count = scan_int,
+ string = scan_string,
+ code = scan_code,
+ word = scan_word,
+ number = scan_number,
+ boolean = scan_boolean,
+ keyword = scan_keyword,
+ }
+
+ tokens.getters = { -- these don't expand
+ token = get_next,
+ count = tex.getcount,
+ dimen = tex.getdimen,
+ box = tex.getbox,
+ }
+
+ tokens.setters = {
+ macro = set_macro,
+ count = tex.setcount,
+ dimen = tex.setdimen,
+ box = tex.setbox,
+ }
-show_methods.b = function(data) show_b_c(data,false) end
-show_methods.c = function(data) show_b_c(data,true ) end
-
-local remapper = { } -- namespace
-collectors.remapper = remapper
-
-local remapperdata = { } -- user mappings
-remapper.data = remapperdata
-
-function remapper.store(tag,class,key)
- local s = remapperdata[class]
- if not s then
- s = { }
- remapperdata[class] = s
- end
- s[key] = collectordata[tag]
- collectordata[tag] = nil
end
-function remapper.convert(tag,toks)
- local data = remapperdata[tag]
- local leftbracket, rightbracket = utfbyte('['), utfbyte(']')
- local skipping = 0
- -- todo: math
- if data then
- local t, n = { }, 0
- for s=1,#toks do
- local tok = toks[s]
- local one, two = tok[1], tok[2]
- if one == 11 or one == 12 then
- if two == leftbracket then
- skipping = skipping + 1
- n = n + 1 ; t[n] = tok
- elseif two == rightbracket then
- skipping = skipping - 1
- n = n + 1 ; t[n] = tok
- elseif skipping == 0 then
- local new = data[two]
- if new then
- if #new > 1 then
- for n=1,#new do
- n = n + 1 ; t[n] = new[n]
- end
- else
- n = n + 1 ; t[n] = new[1]
- end
- else
- n = n + 1 ; t[n] = tok
- end
- else
- n = n + 1 ; t[n] = tok
- end
- else
- n = n + 1 ; t[n] = tok
- end
- end
- return t
- else
- return toks
- end
-end
+-- static int run_scan_token(lua_State * L)
+-- {
+-- saved_tex_scanner texstate;
+-- save_tex_scanner(texstate);
+-- get_x_token();
+-- make_new_token(L, cur_cmd, cur_chr, cur_cs);
+-- unsave_tex_scanner(texstate);
+-- return 1;
+-- }
+--
+-- static int run_get_future(lua_State * L)
+-- {
+-- /* saved_tex_scanner texstate; */
+-- /* save_tex_scanner(texstate); */
+-- get_token();
+-- make_new_token(L, cur_cmd, cur_chr, cur_cs);
+-- back_input();
+-- /* unsave_tex_scanner(texstate); */
+-- return 1;
+-- }
diff --git a/Master/texmf-dist/tex/context/base/toks-ini.mkiv b/Master/texmf-dist/tex/context/base/toks-ini.mkiv
index 4eb756b7537..49625a93990 100644
--- a/Master/texmf-dist/tex/context/base/toks-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/toks-ini.mkiv
@@ -14,57 +14,11 @@
\writestatus{loading}{ConTeXt Token Support / Initialization}
\registerctxluafile{toks-ini}{1.001}
+\registerctxluafile{toks-scn}{1.001}
+\registerctxluafile{cldf-scn}{1.001}
\unprotect
-%D Handy for manuals \unknown
-
-\unexpanded\def\starttokens [#1]{\ctxlua{tokens.collectors.install("#1","stoptokens")}}
- \let\stoptokens \relax
- \def\flushtokens [#1]{\ctxlua{tokens.collectors.flush("#1")}}
- \def\showtokens [#1]{\ctxlua{tokens.collectors.show("#1")}}
- \def\testtokens [#1]{\ctxlua{tokens.collectors.with_words("#1")}}
- \def\registertoken #1{\ctxlua{tokens.collectors.register("#1")}}
-
-%D Inspired by a prototype by Taco for Thomas cum suis.
-
-% \defineremapper[babelgreek]
-%
-% \remapcharacter[babelgreek][`a]{\alpha}
-% \remapcharacter[babelgreek][`b]{\beta}
-% \remapcharacter[babelgreek][`c]{\gamma}
-% \remapcharacter[babelgreek][`d]{OEPS}
-%
-% \starttext
-%
-% [\startbabelgreek
-% a b c some stuff here \blank[big] oeps b d
-% \stopbabelgreek]
-%
-% [\babelgreek{some stuff here}]
-%
-% \stoptext
-
-\unexpanded\def\defineremapper[#1]%
- {\setuevalue{\e!start#1}{\toks_start_remapper{#1}}%
- \setuevalue{\e!stop #1}{\toks_stop_remapper {#1}}%
- \letvalue{#1}\relax
- \normalexpanded{\expandafter\def\csname#1\endcsname##1{\csname\e!start#1\endcsname##1\csname\e!stop#1\endcsname}}}
-
-\unexpanded\def\toks_start_remapper#1%
- {\ctxlua{tokens.collectors.install("#1", "\e!stop#1")}}
-
-\unexpanded\def\toks_stop_remapper#1%
- {\ctxlua{tokens.collectors.handle("#1",function(str) return tokens.collectors.remapper.convert("#1",str) end, true)}}
-
-\unexpanded\def\remaptokens#1%
- {\ctxlua{tokens.collectors.handle("#1",function(str) return tokens.collectors.remapper.convert("#1",str) end)}}
-
-\unexpanded\def\remapcharacter
- {\dodoubleempty\toks_remap_character}
-
-\def\toks_remap_character[#1][#2]#3%
- {\ctxlua{tokens.collectors.install("store", "ctxlua")}#3%
- \ctxlua{tokens.collectors.remapper.store("store","#1",\number#2)}}
+% nothing yet
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/toks-map.lua b/Master/texmf-dist/tex/context/base/toks-map.lua
new file mode 100644
index 00000000000..9120c2084e6
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/toks-map.lua
@@ -0,0 +1,70 @@
+if not modules then modules = { } end modules ['toks-map'] = {
+ version = 1.001,
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- Even more experimental ... this used to be part of toks-ini but as
+-- this kind of remapping has not much use it is not loaded in the
+-- core. We just keep it here for old times sake.
+
+-- local remapper = { } -- namespace
+-- collectors.remapper = remapper
+--
+-- local remapperdata = { } -- user mappings
+-- remapper.data = remapperdata
+--
+-- function remapper.store(tag,class,key)
+-- local s = remapperdata[class]
+-- if not s then
+-- s = { }
+-- remapperdata[class] = s
+-- end
+-- s[key] = collectordata[tag]
+-- collectordata[tag] = nil
+-- end
+--
+-- function remapper.convert(tag,toks)
+-- local data = remapperdata[tag]
+-- local leftbracket = utfbyte('[')
+-- local rightbracket = utfbyte(']')
+-- local skipping = 0
+-- -- todo: math
+-- if data then
+-- local t, n = { }, 0
+-- for s=1,#toks do
+-- local tok = toks[s]
+-- local one, two = tok[1], tok[2]
+-- if one == 11 or one == 12 then
+-- if two == leftbracket then
+-- skipping = skipping + 1
+-- n = n + 1 ; t[n] = tok
+-- elseif two == rightbracket then
+-- skipping = skipping - 1
+-- n = n + 1 ; t[n] = tok
+-- elseif skipping == 0 then
+-- local new = data[two]
+-- if new then
+-- if #new > 1 then
+-- for n=1,#new do
+-- n = n + 1 ; t[n] = new[n]
+-- end
+-- else
+-- n = n + 1 ; t[n] = new[1]
+-- end
+-- else
+-- n = n + 1 ; t[n] = tok
+-- end
+-- else
+-- n = n + 1 ; t[n] = tok
+-- end
+-- else
+-- n = n + 1 ; t[n] = tok
+-- end
+-- end
+-- return t
+-- else
+-- return toks
+-- end
+-- end
diff --git a/Master/texmf-dist/tex/context/base/toks-map.mkiv b/Master/texmf-dist/tex/context/base/toks-map.mkiv
new file mode 100644
index 00000000000..f1b63a68b0a
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/toks-map.mkiv
@@ -0,0 +1,63 @@
+%D \module
+%D [ file=toks-map, % experimental moved from toks-ini
+%D version=2007.03.03,
+%D title=\CONTEXT\ Token Support,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% \writestatus{loading}{ConTeXt Token Support / Remapping}
+%
+% \registerctxluafile{toks-map}{1.001}
+%
+% \unprotect
+%
+% %D Inspired by a prototype by Taco for Thomas cum suis.
+% %D
+% %D \starttyping
+% %D \defineremapper[babelgreek]
+% %D
+% %D \remapcharacter[babelgreek][`a]{\alpha}
+% %D \remapcharacter[babelgreek][`b]{\beta}
+% %D \remapcharacter[babelgreek][`c]{\gamma}
+% %D \remapcharacter[babelgreek][`d]{OEPS}
+% %D
+% %D \starttext
+% %D
+% %D [\startbabelgreek
+% %D a b c some stuff here \blank[big] oeps b d
+% %D \stopbabelgreek]
+% %D
+% %D [\babelgreek{some stuff here}]
+% %D
+% %D \stoptext
+% %D \stoptyping
+%
+% \unexpanded\def\defineremapper[#1]%
+% {\setuevalue{\e!start#1}{\toks_start_remapper{#1}}%
+% \setuevalue{\e!stop #1}{\toks_stop_remapper {#1}}%
+% \letvalue{#1}\relax
+% \normalexpanded{\expandafter\def\csname#1\endcsname##1{\csname\e!start#1\endcsname##1\csname\e!stop#1\endcsname}}}
+%
+% \unexpanded\def\toks_start_remapper#1%
+% {\ctxlua{tokens.collectors.install("#1", "\e!stop#1")}}
+%
+% \unexpanded\def\toks_stop_remapper#1%
+% {\ctxlua{tokens.collectors.handle("#1",function(str) return tokens.collectors.remapper.convert("#1",str) end, true)}}
+%
+% \unexpanded\def\remaptokens#1%
+% {\ctxlua{tokens.collectors.handle("#1",function(str) return tokens.collectors.remapper.convert("#1",str) end)}}
+%
+% \unexpanded\def\remapcharacter
+% {\dodoubleempty\toks_remap_character}
+%
+% \def\toks_remap_character[#1][#2]#3%
+% {\ctxlua{tokens.collectors.install("store", "ctxlua")}#3%
+% \ctxlua{tokens.collectors.remapper.store("store","#1",\number#2)}}
+%
+% \protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/toks-scn.lua b/Master/texmf-dist/tex/context/base/toks-scn.lua
new file mode 100644
index 00000000000..84924c69419
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/toks-scn.lua
@@ -0,0 +1,437 @@
+if not modules then modules = { } end modules ['toks-scn'] = {
+ version = 1.001,
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- Writing this kind of code (and completing the newtoken code base) is fun. I did
+-- so with the brilliant film music from The Girl with the Dragon Tattoo running in a
+-- loop in the background (three cd's by Trent Reznor and Atticus Ross). An alien
+-- feeling helps with alien code.
+
+-- todo: more \let's at the tex end
+
+local type, next, tostring, tonumber = type, next, tostring, tonumber
+
+local formatters = string.formatters
+local concat = table.concat
+
+local scanners = tokens.scanners
+local tokenbits = tokens.bits
+
+local scanstring = scanners.string
+local scaninteger = scanners.integer
+local scannumber = scanners.number
+local scankeyword = scanners.keyword
+local scanword = scanners.word
+local scancode = scanners.code
+local scanboolean = scanners.boolean
+local scandimen = scanners.dimen
+
+local todimen = number.todimen
+local toboolean = toboolean
+
+local lpegmatch = lpeg.match
+local p_unquoted = lpeg.Cs(lpeg.patterns.unquoted)
+
+local trace_compile = false trackers.register("tokens.compile", function(v) trace_compile = v end)
+local report_compile = logs.reporter("tokens","compile")
+local report_scan = logs.reporter("tokens","scan")
+
+local open = tokenbits.open
+local close = tokenbits.close
+
+local function scanopen()
+ while true do
+ local c = scancode(open)
+ if c == 123 then
+ return true
+ -- elseif c ~= 32 then
+ elseif not c then
+ return
+ end
+ end
+end
+
+local function scanclose()
+ while true do
+ local c = scancode(close)
+ if c == 125 then
+ return true
+ -- elseif c ~= 32 then
+ elseif not c then
+ return
+ end
+ end
+end
+
+scanners.scanopen = scanopen
+scanners.scanclose = scanclose
+
+local function scanlist()
+ local wrapped = scanopen()
+ local list = { }
+ local size = 0
+ while true do
+ local entry = scanstring()
+ if entry then
+ size = size + 1
+ list[size] = entry
+ else
+ break
+ end
+ end
+ if wrapped then
+ scanclose()
+ end
+ return list
+end
+
+local function scanconditional()
+ local kw = scanword()
+ if kw == "true" then
+ return true
+ end
+ if kw == "false" then
+ return false
+ end
+ local c = scaninteger()
+ if c then
+ return c == 0 -- with a conditional 0=true
+ end
+ return nil
+end
+
+scanners.list = scanlist
+scanners.conditional = scanconditional
+
+local shortcuts = {
+ tokens = tokens,
+ bits = tokenbits,
+ open = open,
+ close = close,
+ scanners = scanners,
+ scanstring = scanstring,
+ scaninteger = scaninteger,
+ scannumber = scannumber,
+ scankeyword = scankeyword,
+ scanword = scanword,
+ scancode = scancode,
+ scanboolean = scanboolean,
+ scandimen = scandimen,
+ scandimension = scandimen,
+ scanconditional = scanconditional,
+ scanopen = scanopen,
+ scanclose = scanclose,
+ scanlist = scanlist,
+ todimen = todimen,
+ tonumber = tonumber,
+ tostring = tostring,
+ toboolean = toboolean,
+ inspect = inspect,
+ report = report_scan,
+}
+
+tokens.shortcuts = shortcuts
+
+local load = load
+local dump = string.dump
+
+local function loadstripped(code)
+ return load(code,nil,nil,shortcuts)
+ -- return load(dump(load(code),true),nil,nil,shortcuts)
+end
+
+tokens.converters = {
+ tonumber = "tonumber",
+ tostring = "tostring",
+ toboolean = "toboolean",
+ todimen = "todimen",
+ toglue = "todimen",
+}
+
+local f_if = formatters[ " if scankeyword('%s') then data['%s'] = scan%s()"]
+local f_elseif = formatters[" elseif scankeyword('%s') then data['%s'] = scan%s()"]
+local f_local = formatters["local scan%s = scanners.%s"]
+local f_scan = formatters["scan%s()"]
+local f_shortcut = formatters["local %s = scanners.converters.%s"]
+
+local f_if_c = formatters[ " if scankeyword('%s') then data['%s'] = %s(scan%s())"]
+local f_elseif_c = formatters[" elseif scankeyword('%s') then data['%s'] = %s(scan%s())"]
+local f_scan_c = formatters["%s(scan%s())"]
+
+local f_any = formatters[" else local key = scanword() if key then data[key] = scan%s() else break end end"]
+local f_any_c = formatters[" else local key = scanword() if key then data[key] = %s(scan%s()) else break end end"]
+local s_done = " else break end"
+
+local f_any_all = formatters[" local key = scanword() if key then data[key] = scan%s() else break end"]
+local f_any_all_c= formatters[" local key = scanword() if key then data[key] = %s(scan%s()) else break end"]
+
+local f_table = formatters["%\nt\nreturn function()\n local data = { }\n%s\n return %s\nend\n"]
+local f_sequence = formatters["%\nt\n%\nt\n%\nt\nreturn function()\n return %s\nend\n"]
+local f_simple = formatters["%\nt\nreturn function()\n return %s\nend\n"]
+local f_string = formatters["%q"]
+local f_action_f = formatters["action%s(%s)"]
+local f_action_s = formatters["local action%s = tokens._action[%s]"]
+local f_nested = formatters["local function scan%s()\n local data = { }\n%s\n return data\nend\n"]
+
+-- local f_check = formatters[ [[
+-- local wrapped = false
+-- while true do
+-- local c = scancode(open)
+-- if c == 123 then
+-- wrapped = true
+-- break
+-- elseif c ~= 32 then
+-- break
+-- end
+-- end
+-- while true do
+-- ]] .. "%\nt\n" .. [[
+-- %s
+-- end
+-- if wrapped then
+-- while true do
+-- local c = scancode(close)
+-- if c == 125 then
+-- break
+-- elseif c ~= 32 then
+-- break
+-- end
+-- end
+-- end
+-- ]] ]
+
+local f_check = formatters[ [[
+ local wrapped = scanopen()
+ while true do
+ ]] .. "%\nt\n" .. [[
+ %s
+ end
+ if wrapped then
+ scanclose()
+ end
+]] ]
+
+function tokens.compile(specification)
+ local f = { }
+ local n = 0
+ local c = { }
+ local t = specification.arguments or specification
+ local a = specification.actions or nil
+ if type(a) == "function" then
+ a = { a }
+ end
+ local code
+ local function compile(t,nested)
+ local done = s_done
+ local r = { }
+ local m = 0
+ for i=1,#t do
+ local ti = t[i]
+ if ti == "*" and i == 1 then
+ done = f_any_all("string")
+ else
+ local t1 = ti[1]
+ local t2 = ti[2] or "string"
+ if type(t2) == "table" then
+ n = n + 1
+ f[n] = compile(t2,n)
+ t2 = n
+ end
+ local t3 = ti[3]
+ if type(t3) == "function" then
+ -- todo: also create shortcut
+ elseif t3 then
+ c[t3] = f_shortcut(t3,t3)
+ if t1 == "*" then
+ if i == 1 then
+ done = f_any_all_c(t3,t2)
+ break
+ else
+ done = f_any_c(t3,t2)
+ end
+ else
+ m = m + 1
+ r[m] = (m > 1 and f_elseif_c or f_if_c)(t1,t1,t3,t2)
+ end
+ else
+ if t1 == "*" then
+ if i == 1 then
+ done = f_any_all(t2)
+ break
+ else
+ done = f_any(t2)
+ end
+ else
+ m = m + 1
+ r[m] = (m > 1 and f_elseif or f_if )(t1,t1,t2)
+ end
+ end
+ end
+ end
+ local c = f_check(r,done)
+ if nested then
+ return f_nested(nested,c)
+ else
+ return c
+ end
+ end
+ local tt = type(t)
+ if tt == "string" then
+ if a then
+ local s = lpegmatch(p_unquoted,t)
+ if s and t ~= s then
+ code = t
+ else
+ code = f_scan(t)
+ end
+ tokens._action = a
+ for i=1,#a do
+ code = f_action_f(i,code)
+ f[#f+1] = f_action_s(i,i)
+ end
+ code = f_simple(f,code)
+ else
+ return scanners[t]
+ end
+ elseif tt ~= "table" then
+ return
+ elseif #t == 1 then
+ local ti = t[1]
+ if type(ti) == "table" then
+ ti = compile(ti)
+ code = "data"
+ if a then
+ tokens._action = a
+ for i=1,#a do
+ code = f_action_f(i,code)
+ f[#f+1] = f_action_s(i,i)
+ end
+ end
+ code = f_table(f,ti,code)
+ elseif a then
+ code = f_scan(ti)
+ tokens._action = a
+ for i=1,#a do
+ code = f_action_f(i,code)
+ f[#f+1] = f_action_s(i,i)
+ end
+ code = f_simple(f,code)
+ else
+ return scanners[ti]
+ end
+ else
+ local r = { }
+ local p = { }
+ local m = 0
+ for i=1,#t do
+ local ti = t[i]
+ local tt = type(ti)
+ if tt == "table" then
+ if ti[1] == "_constant_" then
+ local v = ti[2]
+ if type(v) == "string" then
+ r[i] = f_string(v)
+ else
+ r[i] = tostring(v)
+ end
+ else
+ m = m + 1
+ p[m] = compile(ti,100+m)
+ r[i] = f_scan(100+m)
+ end
+ elseif tt == "number" then
+ r[i] = tostring(ti)
+ elseif tt == "boolean" then
+ r[i] = tostring(ti)
+ else
+ local s = lpegmatch(p_unquoted,ti)
+ if s and ti ~= s then
+ r[i] = ti -- a string, given as "'foo'" or '"foo"'
+ elseif scanners[ti] then
+ r[i] = f_scan(ti)
+ else
+ report_compile("unknown scanner %a",ti)
+ r[i] = ti
+ end
+ end
+ end
+ code = concat(r,",")
+ if a then
+ tokens._action = a
+ for i=1,#a do
+ code = f_action_f(i,code)
+ f[#f+1] = f_action_s(i,i)
+ end
+ end
+ code = f_sequence(c,f,p,code)
+ end
+ if not code then
+ return
+ end
+ if trace_compile then
+ report_compile("code: %s",code)
+ end
+ local code, message = loadstripped(code)
+ if code then
+ code = code() -- sets action
+ else
+ report_compile("error in code: %s",code)
+ report_compile("error message: %s",message)
+ end
+ if a then
+ tokens._action = nil
+ end
+ if code then
+ return code
+ end
+end
+
+-- local fetch = tokens.compile {
+-- "string",
+-- "string",
+-- {
+-- { "data", "string" },
+-- { "tab", "string" },
+-- { "method", "string" },
+-- { "foo", {
+-- { "method", "integer" },
+-- { "compact", "number" },
+-- { "nature" },
+-- { "*" }, -- any key
+-- } },
+-- { "compact", "string", "tonumber" },
+-- { "nature", "boolean" },
+-- { "escape", "string" },
+-- { "escape" },
+-- }
+-- "boolean",
+-- }
+--
+-- os.exit()
+
+function tokens.scantable(t,data)
+ if not data then
+ data = { }
+ end
+ local wrapped = scanopen()
+ while true do
+ local key = scanword()
+ if key then
+ local get = t[key]
+ if get then
+ data[key] = get()
+ else
+ -- catch all we can get
+ end
+ else
+ break
+ end
+ end
+ if wrapped then
+ scanclose()
+ end
+ return data
+end
diff --git a/Master/texmf-dist/tex/context/base/toks-tra.lua b/Master/texmf-dist/tex/context/base/toks-tra.lua
new file mode 100644
index 00000000000..bf2b91d38a3
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/toks-tra.lua
@@ -0,0 +1,298 @@
+if not modules then modules = { } end modules ['toks-ini'] = {
+ version = 1.001,
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+
+local utfbyte, utfchar, utfvalues = utf.byte, utf.char, utf.values
+local format, gsub = string.format, string.gsub
+local tostring = tostring
+
+local tokens = tokens
+local newtoken = newtoken
+local tex = tex
+local context = context
+local commands = commands
+
+tokens.collectors = tokens.collectors or { }
+local collectors = tokens.collectors
+
+collectors.data = collectors.data or { }
+local collectordata = collectors.data
+
+collectors.registered = collectors.registered or { }
+local registered = collectors.registered
+
+local report = logs.reporter("tokens","collectors")
+
+if newtoken then
+
+ -- todo:
+ --
+ -- register : macros that will be expanded (only for demo-ing)
+ -- flush : print back to tex
+ -- test : fancy stuff
+
+ local get_next = newtoken.get_next
+ local create = newtoken.create
+
+ function collectors.install(tag,end_cs)
+ local data, d = { }, 0
+ collectordata[tag] = data
+ end_cs = gsub(end_cs,"^\\","")
+ while true do
+ local t = get_next()
+ if t.csname == end_cs then
+ context[end_cs]()
+ return
+ else
+ d = d + 1
+ data[d] = t
+ end
+ end
+ end
+
+ local simple = { letter = "letter", other_char = "other" }
+
+ function collectors.show(data)
+ -- We no longer have methods as we only used (in demos) method a
+ -- so there is no need to burden the core with this. We have a
+ -- different table anyway.
+ if type(data) == "string" then
+ data = collectordata[data]
+ end
+ if not data then
+ return
+ end
+ local ctx_NC = context.NC
+ local ctx_NR = context.NR
+ local ctx_bold = context.bold
+ local ctx_verbatim = context.verbatim
+ context.starttabulate { "|Tl|Tc|Tl|" }
+ ctx_NC() ctx_bold("cmd")
+ ctx_NC() ctx_bold("meaning")
+ ctx_NC() ctx_bold("properties")
+ ctx_NC() ctx_NR()
+ context.HL()
+ for i=1,#data do
+ local token = data[i]
+ local cmdname = token.cmdname
+ local simple = simple[cmdname]
+ ctx_NC()
+ ctx_verbatim(simple or cmdname)
+ ctx_NC()
+ ctx_verbatim(simple and utfchar(token.mode) or token.csname)
+ ctx_NC()
+ if token.active then context("active ") end
+ if token.expandable then context("expandable ") end
+ if token.protected then context("protected ") end
+ ctx_NC()
+ ctx_NR()
+ end
+ context.stoptabulate()
+ end
+
+ local function printlist(data)
+ if data and #data > 0 then
+ report("not supported (yet): printing back to tex")
+ end
+ end
+
+ tokens.printlist = printlist -- will change to another namespace
+
+ function collectors.flush(tag)
+ printlist(collectordata[tag])
+ end
+
+ function collectors.test(tag,handle)
+ report("not supported (yet): testing")
+ end
+
+ function collectors.register(name)
+ report("not supported (yet): registering")
+ end
+
+else
+
+ -- 1 = command, 2 = modifier (char), 3 = controlsequence id
+
+ local create = token.create
+ local csname_id = token.csname_id
+ local command_id = token.command_id
+ local command_name = token.command_name
+ local get_next = token.get_next
+ local expand = token.expand
+ local csname_name = token.csname_name
+
+ local function printlist(data)
+ if data and #data > 0 then
+ callbacks.push('token_filter', function ()
+ callbacks.pop('token_filter') -- tricky but the nil assignment helps
+ return data
+ end)
+ end
+ end
+
+ tokens.printlist = printlist -- will change to another namespace
+
+ function collectors.flush(tag)
+ printlist(collectordata[tag])
+ end
+
+ function collectors.register(name)
+ registered[csname_id(name)] = name
+ end
+
+ local call = command_id("call")
+ local letter = command_id("letter")
+ local other = command_id("other_char")
+
+ function collectors.install(tag,end_cs)
+ local data, d = { }, 0
+ collectordata[tag] = data
+ end_cs = gsub(end_cs,"^\\","")
+ local endcs = csname_id(end_cs)
+ while true do
+ local t = get_next()
+ local a, b = t[1], t[3]
+ if b == endcs then
+ context[end_cs]()
+ return
+ elseif a == call and registered[b] then
+ expand()
+ else
+ d = d + 1
+ data[d] = t
+ end
+ end
+ end
+
+ function collectors.show(data)
+ -- We no longer have methods as we only used (in demos) method a
+ -- so there is no need to burden the core with this.
+ if type(data) == "string" then
+ data = collectordata[data]
+ end
+ if not data then
+ return
+ end
+ local ctx_NC = context.NC
+ local ctx_NR = context.NR
+ local ctx_bold = context.bold
+ local ctx_verbatim = context.verbatim
+ context.starttabulate { "|T|Tr|cT|Tr|T|" }
+ ctx_NC() ctx_bold("cmd")
+ ctx_NC() ctx_bold("chr")
+ ctx_NC()
+ ctx_NC() ctx_bold("id")
+ ctx_NC() ctx_bold("name")
+ ctx_NC() ctx_NR()
+ context.HL()
+ for i=1,#data do
+ local token = data[i]
+ local cmd = token[1]
+ local chr = token[2]
+ local id = token[3]
+ local name = command_name(token)
+ ctx_NC()
+ ctx_verbatim(name)
+ ctx_NC()
+ if tonumber(chr) >= 0 then
+ ctx_verbatim(chr)
+ end
+ ctx_NC()
+ if cmd == letter or cmd == other then
+ ctx_verbatim(utfchar(chr))
+ end
+ ctx_NC()
+ if id > 0 then
+ ctx_verbatim(id)
+ end
+ ctx_NC()
+ if id > 0 then
+ ctx_verbatim(csname_name(token) or "")
+ end
+ ctx_NC() ctx_NR()
+ end
+ context.stoptabulate()
+ end
+
+ function collectors.test(tag,handle)
+ local t, w, tn, wn = { }, { }, 0, 0
+ handle = handle or collectors.defaultwords
+ local tagdata = collectordata[tag]
+ for k=1,#tagdata do
+ local v = tagdata[k]
+ if v[1] == letter then
+ wn = wn + 1
+ w[wn] = v[2]
+ else
+ if wn > 0 then
+ handle(t,w)
+ wn = 0
+ end
+ tn = tn + 1
+ t[tn] = v
+ end
+ end
+ if wn > 0 then
+ handle(t,w)
+ end
+ collectordata[tag] = t
+ end
+
+end
+
+-- Interfacing:
+
+commands.collecttokens = collectors.install
+commands.showtokens = collectors.show
+commands.flushtokens = collectors.flush
+commands.testtokens = collectors.test
+commands.registertoken = collectors.register
+
+-- Redundant:
+
+-- function collectors.test(tag)
+-- printlist(collectordata[tag])
+-- end
+
+-- For old times sake:
+
+collectors.dowithwords = collectors.test
+
+-- This is only used in old articles ... will move to a module:
+
+local create = newtoken and newtoken.create or token.create
+
+tokens.vbox = create("vbox")
+tokens.hbox = create("hbox")
+tokens.vtop = create("vtop")
+tokens.bgroup = create(utfbyte("{"),1)
+tokens.egroup = create(utfbyte("}"),2)
+
+tokens.letter = function(chr) return create(utfbyte(chr),11) end
+tokens.other = function(chr) return create(utfbyte(chr),12) end
+
+tokens.letters = function(str)
+ local t, n = { }, 0
+ for chr in utfvalues(str) do
+ n = n + 1
+ t[n] = create(chr, 11)
+ end
+ return t
+end
+
+function collectors.defaultwords(t,str)
+ if t then
+ local n = #t
+ n = n + 1 ; t[n] = tokens.bgroup
+ n = n + 1 ; t[n] = create("red")
+ for i=1,#str do
+ n = n + 1 ; t[n] = tokens.other('*')
+ end
+ n = n + 1 ; t[n] = tokens.egroup
+ end
+end
diff --git a/Master/texmf-dist/tex/context/base/toks-tra.mkiv b/Master/texmf-dist/tex/context/base/toks-tra.mkiv
new file mode 100644
index 00000000000..a3e27eaf89f
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/toks-tra.mkiv
@@ -0,0 +1,31 @@
+%D \module
+%D [ file=toks-tra, % was toks-ini
+%D version=2007.03.03,
+%D title=\CONTEXT\ Token Support,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Token Support / Tracing}
+
+\registerctxluafile{toks-tra}{1.001}
+
+\unprotect
+
+%D Handy for manuals \unknown\ but not really used in practice, so it might
+%D become a runtime loaded module instead.
+
+\unexpanded\def\starttokens [#1]{\ctxcommand{collecttokens("#1","stoptokens")}}
+ \let\stoptokens \relax
+ \def\flushtokens [#1]{\ctxcommand{flushtokens("#1")}}
+ \def\showtokens [#1]{\ctxcommand{showtokens("#1")}}
+ \def\testtokens [#1]{\ctxcommand{testtokens("#1")}}
+ \def\registertoken #1{\ctxcommand{registertoken("#1")}}
+
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/trac-ctx.lua b/Master/texmf-dist/tex/context/base/trac-ctx.lua
index 706e7a2447a..493ce793686 100644
--- a/Master/texmf-dist/tex/context/base/trac-ctx.lua
+++ b/Master/texmf-dist/tex/context/base/trac-ctx.lua
@@ -6,15 +6,15 @@ if not modules then modules = { } end modules ['trac-ctx'] = {
license = "see context related readme files"
}
-local commands = commands
-local context = context
-local register = trackers.register
+local context = context
+local implement = interfaces.implement
+local register = trackers.register
local textrackers = tex.trackers or { }
local texdirectives = tex.directives or { }
-tex.trackers = textrackers
-tex.directives = texdirectives
+tex.trackers = textrackers
+tex.directives = texdirectives
storage.register("tex/trackers", textrackers, "tex.trackers")
storage.register("tex/directives",texdirectives,"tex.directives")
@@ -39,10 +39,32 @@ local function install(category,register,tag,enable,disable)
register(tag, function(v) doit(category,tag,v) end) -- todo: v,tag in caller
end
-function commands.initializetextrackers () initialize(textrackers ,trackers .register ) end
-function commands.initializetexdirectives() initialize(texdirectives,directives.register) end
+implement {
+ name = "initializetextrackers",
+ actions = function()
+ initialize(textrackers,trackers.register)
+ end
+}
--- commands.install(tag,enable,disable):
+implement {
+ name = "initializetexdirectives",
+ actions = function()
+ initialize(texdirectives,directives.register)
+ end
+}
-function commands.installtextracker (...) install(textrackers ,trackers .register,...) end
-function commands.installtexdirective(...) install(texdirectives,directives.register,...) end
+implement {
+ name = "installtextracker",
+ actions = function(tag,enable,disable)
+ install(textrackers,trackers.register,tag,enable,disable)
+ end,
+ arguments = { "string", "string", "string" }
+}
+
+implement {
+ name = "installtexdirective",
+ actions = function(tag,enable,disable)
+ install(texdirectives,directives.register,tag,enable,disable)
+ end,
+ arguments = { "string", "string", "string" }
+}
diff --git a/Master/texmf-dist/tex/context/base/trac-ctx.mkiv b/Master/texmf-dist/tex/context/base/trac-ctx.mkiv
index 3eb53713cb3..4240281a6fb 100644
--- a/Master/texmf-dist/tex/context/base/trac-ctx.mkiv
+++ b/Master/texmf-dist/tex/context/base/trac-ctx.mkiv
@@ -18,14 +18,14 @@
\unprotect
\unexpanded\def\installtextracker#1#2#3%
- {\ctxcommand{installtextracker("#1",\!!bs\detokenize{#2}\!!es,\!!bs\detokenize{#3}\!!es)}}
+ {\clf_installtextracker{#1}{\detokenize{#2}}{\detokenize{#3}}}
\unexpanded\def\installtexdirective#1#2#3%
- {\ctxcommand{installtexdirective("#1",\!!bs\detokenize{#2}\!!es,\!!bs\detokenize{#3}\!!es)}}
+ {\clf_installtexdirective{#1}{\detokenize{#2}}{\detokenize{#3}}}
\appendtoks
- \ctxcommand{initializetextrackers ()}%
- \ctxcommand{initializetexdirectives()}%
+ \clf_initializetextrackers
+ \clf_initializetexdirectives
\to \everyjob
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/trac-deb.lua b/Master/texmf-dist/tex/context/base/trac-deb.lua
index d52399bcf1f..d998295c13c 100644
--- a/Master/texmf-dist/tex/context/base/trac-deb.lua
+++ b/Master/texmf-dist/tex/context/base/trac-deb.lua
@@ -32,6 +32,8 @@ local texgetdimen = tex.getdimen
local texgettoks = tex.gettoks
local texgetcount = tex.getcount
+local implement = interfaces.implement
+
strings.undefined = "undefined"
lists.scratch = {
@@ -304,3 +306,20 @@ local function trace_calls(n)
end
directives.register("system.tracecalls", function(n) trace_calls(n) end) -- indirect is needed for nilling
+
+implement { name = "showtrackers", actions = trackers.show }
+implement { name = "enabletrackers", actions = trackers.enable, arguments = "string" }
+implement { name = "disabletrackers", actions = trackers.disable, arguments = "string" }
+implement { name = "resettrackers", actions = trackers.reset }
+
+implement { name = "showdirectives", actions = directives.show }
+implement { name = "enabledirectives", actions = directives.enable, arguments = "string" }
+implement { name = "disabledirectives", actions = directives.disable, arguments = "string" }
+
+implement { name = "showexperiments", actions = experiments.show }
+implement { name = "enableexperiments", actions = experiments.enable, arguments = "string" }
+implement { name = "disableexperiments", actions = experiments.disable, arguments = "string" }
+
+implement { name = "showdebuginfo", actions = lmx.showdebuginfo }
+implement { name = "overloaderror", actions = lmx.overloaderror }
+implement { name = "showlogcategories", actions = logs.show }
diff --git a/Master/texmf-dist/tex/context/base/trac-deb.mkiv b/Master/texmf-dist/tex/context/base/trac-deb.mkiv
index fe5dd02dc4a..1e61a351261 100644
--- a/Master/texmf-dist/tex/context/base/trac-deb.mkiv
+++ b/Master/texmf-dist/tex/context/base/trac-deb.mkiv
@@ -13,25 +13,31 @@
\writestatus{loading}{ConTeXt Tracing Macros / Debugger}
+\unprotect
+
%registerctxluafile{trac-lmx}{1.001}
\registerctxluafile{trac-deb}{1.001}
-\unexpanded\def\breakpoint{\showdebuginfo\wait}
+\unexpanded\def\breakpoint {\showdebuginfo\wait}
+
+\unexpanded\def\showtrackers {\clf_showtrackers}
+\unexpanded\def\enabletrackers [#1]{\clf_enabletrackers{#1}}
+\unexpanded\def\disabletrackers [#1]{\clf_disabletrackers{#1}}
+\unexpanded\def\resettrackers {\clf_resettrackers}
+
+\unexpanded\def\showdirectives {\clf_showdirectives}
+\unexpanded\def\enabledirectives [#1]{\clf_enabledirectives{#1}}
+\unexpanded\def\disabledirectives [#1]{\clf_disabledirectives{#1}}
-\unexpanded\def\showtrackers {\ctxlua{trackers.show()}}
-\unexpanded\def\enabletrackers [#1]{\ctxlua{trackers.enable("#1")}}
-\unexpanded\def\disabletrackers [#1]{\ctxlua{trackers.disable("#1")}}
-\unexpanded\def\resettrackers {\ctxlua{trackers.reset()}}
+\unexpanded\def\showexperiments {\clf_showexperiments}
+\unexpanded\def\enableexperiments [#1]{\clf_enableexperiments{#1}}
+\unexpanded\def\disableexperiments[#1]{\clf_disableexperiments{#1}}
-\unexpanded\def\showdirectives {\ctxlua{directives.show()}}
-\unexpanded\def\enabledirectives [#1]{\ctxlua{directives.enable("#1")}}
-\unexpanded\def\disabledirectives [#1]{\ctxlua{directives.disable("#1")}}
+\unexpanded\def\showdebuginfo {\clf_showdebuginfo}
+\unexpanded\def\overloaderror {\clf_overloaderror}
-\unexpanded\def\showexperiments {\ctxlua{experiments.show()}}
-\unexpanded\def\enableexperiments [#1]{\ctxlua{experiments.enable("#1")}}
-\unexpanded\def\disableexperiments[#1]{\ctxlua{experiments.disable("#1")}}
+\unexpanded\def\showlogcategories {\clf_showlogcategories}
-\unexpanded\def\showdebuginfo {\ctxlua{lmx.showdebuginfo()}}
-\unexpanded\def\overloaderror {\ctxlua{lmx.overloaderror()}} % \enabledirectives[system.showerror]
+% \enabledirectives[system.showerror]
-\unexpanded\def\showlogcategories {\ctxlua{logs.show()}}
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/trac-inf.lua b/Master/texmf-dist/tex/context/base/trac-inf.lua
index 034726ffcdd..5497e54eb70 100644
--- a/Master/texmf-dist/tex/context/base/trac-inf.lua
+++ b/Master/texmf-dist/tex/context/base/trac-inf.lua
@@ -207,17 +207,3 @@ function statistics.tracefunction(base,tag,...)
statistics.register(formatters["%s.%s"](tag,name),function() return serialize(stat,"calls") end)
end
end
-
--- where, not really the best spot for this:
-
-commands = commands or { }
-
-function commands.resettimer(name)
- resettiming(name or "whatever")
- starttiming(name or "whatever")
-end
-
-function commands.elapsedtime(name)
- stoptiming(name or "whatever")
- context(elapsedtime(name or "whatever"))
-end
diff --git a/Master/texmf-dist/tex/context/base/trac-jus.lua b/Master/texmf-dist/tex/context/base/trac-jus.lua
index 00c871159ad..0c92848dcec 100644
--- a/Master/texmf-dist/tex/context/base/trac-jus.lua
+++ b/Master/texmf-dist/tex/context/base/trac-jus.lua
@@ -62,9 +62,10 @@ end
checkers.set = set
checkers.reset = reset
-function commands.showjustification(n)
- set(n)
-end
+interfaces.implement {
+ name = "showjustification",
+ actions = set
+}
trackers.register("visualizers.justification", function(v)
if v then
@@ -77,7 +78,7 @@ end)
function checkers.handler(head)
for current in traverse_id(hlist_code,tonut(head)) do
if getattr(current,a_justification) == 1 then
- setattr(current,a_justification,0)
+ setattr(current,a_justification,0) -- kind of reset
local width = getfield(current,"width")
if width > 0 then
local list = getlist(current)
diff --git a/Master/texmf-dist/tex/context/base/trac-jus.mkiv b/Master/texmf-dist/tex/context/base/trac-jus.mkiv
index 7a5347da844..d0823d31196 100644
--- a/Master/texmf-dist/tex/context/base/trac-jus.mkiv
+++ b/Master/texmf-dist/tex/context/base/trac-jus.mkiv
@@ -20,6 +20,6 @@
\definesystemattribute[justification] [public]
\unexpanded\def\showjustification
- {\ctxcommand{showjustification()}}
+ {\clf_showjustification} % currently no argument (default 1)
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/trac-lmx.lua b/Master/texmf-dist/tex/context/base/trac-lmx.lua
index 41d9305361a..4f4ea62c489 100644
--- a/Master/texmf-dist/tex/context/base/trac-lmx.lua
+++ b/Master/texmf-dist/tex/context/base/trac-lmx.lua
@@ -530,7 +530,7 @@ do_nested_include = function(data) -- also used in include
return lpegmatch(pattern_1,data)
end
-function lmxnew(data,defaults,nocache,path) -- todo: use defaults in calling routines
+local function lmxnew(data,defaults,nocache,path) -- todo: use defaults in calling routines
data = data or ""
local known = cache[data]
if not known then
@@ -608,7 +608,7 @@ function lmx.convertfile(templatefile,variables,nocache)
return lmxresult(converter,variables)
end
-function lmxconvert(templatefile,resultfile,variables,nocache) -- or (templatefile,variables)
+local function lmxconvert(templatefile,resultfile,variables,nocache) -- or (templatefile,variables)
if trace_variables then -- will become templates
report_lmx("converting file %a",templatefile)
end
@@ -665,14 +665,13 @@ function lmx.color(r,g,b,a)
end
end
-
-- these can be overloaded
lmx.lmxfile = string.itself
lmx.htmfile = string.itself
lmx.popupfile = os.launch
-function lmxmake(name,variables)
+local function lmxmake(name,variables)
local lmxfile = lmx.lmxfile(name)
local htmfile = lmx.htmfile(name)
if lmxfile == htmfile then
@@ -682,7 +681,7 @@ function lmxmake(name,variables)
return htmfile
end
-lmxmake = lmx.make
+lmx.make = lmxmake
function lmx.show(name,variables)
local htmfile = lmxmake(name,variables)
diff --git a/Master/texmf-dist/tex/context/base/trac-log.lua b/Master/texmf-dist/tex/context/base/trac-log.lua
index 72f271d9c3c..ce620e6cf0c 100644
--- a/Master/texmf-dist/tex/context/base/trac-log.lua
+++ b/Master/texmf-dist/tex/context/base/trac-log.lua
@@ -9,76 +9,28 @@ if not modules then modules = { } end modules ['trac-log'] = {
-- In fact all writes could go through lua and we could write the console and
-- terminal handler in lua then. Ok, maybe it's slower then, so a no-go.
--- if tex and (tex.jobname or tex.formatname) then
---
--- -- quick hack, awaiting speedup in engine (8 -> 6.4 sec for --make with console2)
--- -- still needed for luajittex
---
--- local texio_write_nl = texio.write_nl
--- local texio_write = texio.write
--- local io_write = io.write
---
--- local write_nl = function(target,...)
--- if not io_write then
--- io_write = io.write
--- end
--- if target == "term and log" then
--- texio_write_nl("log",...)
--- texio_write_nl("term","")
--- io_write(...)
--- elseif target == "log" then
--- texio_write_nl("log",...)
--- elseif target == "term" then
--- texio_write_nl("term","")
--- io_write(...)
--- else
--- texio_write_nl("log",target,...)
--- texio_write_nl("term","")
--- io_write(target,...)
--- end
--- end
---
--- local write = function(target,...)
--- if not io_write then
--- io_write = io.write
--- end
--- if target == "term and log" then
--- texio_write("log",...)
--- io_write(...)
--- elseif target == "log" then
--- texio_write("log",...)
--- elseif target == "term" then
--- io_write(...)
--- else
--- texio_write("log",target,...)
--- io_write(target,...)
--- end
--- end
---
--- texio.write = write
--- texio.write_nl = write_nl
---
--- else
---
--- -- texlua or just lua
---
--- end
-
--- todo: less categories, more subcategories (e.g. nodes)
--- todo: split into basics and ctx specific
-
+local next, type, select, print = next, type, select, print
local write_nl, write = texio and texio.write_nl or print, texio and texio.write or io.write
local format, gmatch, find = string.format, string.gmatch, string.find
local concat, insert, remove = table.concat, table.insert, table.remove
local topattern = string.topattern
-local next, type, select = next, type, select
local utfchar = utf.char
+local datetime = os.date
+local openfile = io.open
local setmetatableindex = table.setmetatableindex
local formatters = string.formatters
local texgetcount = tex and tex.getcount
+-- variant is set now
+
+local variant = "default"
+-- local variant = "ansi"
+
+-- todo: less categories, more subcategories (e.g. nodes)
+-- todo: split into basics and ctx specific
+
--[[ldx--
<p>This is a prelude to a more extensive logging module. We no longer
provide <l n='xml'/> based logging as parsing is relatively easy anyway.</p>
@@ -112,12 +64,12 @@ wiki : http://contextgarden.net
-- [[local chruni = utilities.strings.chruni]]
-- )
-utilities.strings.formatters.add (
+formatters.add (
formatters, "unichr",
[["U+" .. format("%%05X",%s) .. " (" .. utfchar(%s) .. ")"]]
)
-utilities.strings.formatters.add (
+formatters.add (
formatters, "chruni",
[[utfchar(%s) .. " (U+" .. format("%%05X",%s) .. ")"]]
)
@@ -150,20 +102,127 @@ setmetatableindex(logs, function(t,k) t[k] = ignore ; return ignore end)
local report, subreport, status, settarget, setformats, settranslations
-local direct, subdirect, writer, pushtarget, poptarget, setlogfile, settimedlog, setprocessor, setformatters
+local direct, subdirect, writer, pushtarget, poptarget, setlogfile, settimedlog, setprocessor, setformatters, newline
+
+-- we use formatters but best check for % then because for simple messages but
+-- we don't want this overhead for single messages (not that there are that
+-- many; we could have a special weak table)
if tex and (tex.jobname or tex.formatname) then
- -- local format = string.formatter
+ local function useluawrites()
- local valueiskey = { __index = function(t,k) t[k] = k return k end } -- will be helper
+ -- quick hack, awaiting speedup in engine (8 -> 6.4 sec for --make with console2)
+ -- still needed for luajittex .. luatex should not have that ^^ mess
- local target = "term and log"
+ local texio_write_nl = texio.write_nl
+ local texio_write = texio.write
+ local io_write = io.write
- logs.flush = io.flush
+ write_nl = function(target,...)
+ if not io_write then
+ io_write = io.write
+ end
+ if target == "term and log" then
+ texio_write_nl("log",...)
+ texio_write_nl("term","")
+ io_write(...)
+ elseif target == "log" then
+ texio_write_nl("log",...)
+ elseif target == "term" then
+ texio_write_nl("term","")
+ io_write(...)
+ elseif target ~= "none" then
+ texio_write_nl("log",target,...)
+ texio_write_nl("term","")
+ io_write(target,...)
+ end
+ end
+
+ write = function(target,...)
+ if not io_write then
+ io_write = io.write
+ end
+ if target == "term and log" then
+ texio_write("log",...)
+ io_write(...)
+ elseif target == "log" then
+ texio_write("log",...)
+ elseif target == "term" then
+ io_write(...)
+ elseif target ~= "none" then
+ texio_write("log",target,...)
+ io_write(target,...)
+ end
+ end
- local formats = { } setmetatable(formats, valueiskey)
- local translations = { } setmetatable(translations,valueiskey)
+ texio.write = write
+ texio.write_nl = write_nl
+
+ useluawrites = ignore
+
+ end
+
+ -- local format = string.formatter
+
+ local whereto = "both"
+ local target = nil
+ local targets = nil
+
+ local formats = table.setmetatableindex("self")
+ local translations = table.setmetatableindex("self")
+
+ local report_yes, subreport_yes, direct_yes, subdirect_yes, status_yes
+ local report_nop, subreport_nop, direct_nop, subdirect_nop, status_nop
+
+ local variants = {
+ default = {
+ formats = {
+ report_yes = formatters["%-15s > %s\n"],
+ report_nop = formatters["%-15s >\n"],
+ direct_yes = formatters["%-15s > %s"],
+ direct_nop = formatters["%-15s >"],
+ subreport_yes = formatters["%-15s > %s > %s\n"],
+ subreport_nop = formatters["%-15s > %s >\n"],
+ subdirect_yes = formatters["%-15s > %s > %s"],
+ subdirect_nop = formatters["%-15s > %s >"],
+ status_yes = formatters["%-15s : %s\n"],
+ status_nop = formatters["%-15s :\n"],
+ },
+ targets = {
+ logfile = "log",
+ log = "log",
+ file = "log",
+ console = "term",
+ terminal = "term",
+ both = "term and log",
+ },
+ },
+ ansi = {
+ formats = {
+ report_yes = formatters["%-15s > %s\n"],
+ report_nop = formatters["%-15s >\n"],
+ direct_yes = formatters["%-15s > %s"],
+ direct_nop = formatters["%-15s >"],
+ subreport_yes = formatters["%-15s > %s > %s\n"],
+ subreport_nop = formatters["%-15s > %s >\n"],
+ subdirect_yes = formatters["%-15s > %s > %s"],
+ subdirect_nop = formatters["%-15s > %s >"],
+ status_yes = formatters["%-15s : %s\n"],
+ status_nop = formatters["%-15s :\n"],
+ },
+ targets = {
+ logfile = "none",
+ log = "none",
+ file = "none",
+ console = "term",
+ terminal = "term",
+ both = "term",
+ },
+ }
+ }
+
+ logs.flush = io.flush
writer = function(...)
write_nl(target,...)
@@ -173,13 +232,6 @@ if tex and (tex.jobname or tex.formatname) then
write_nl(target,"\n")
end
- local report_yes = formatters["%-15s > %s\n"]
- local report_nop = formatters["%-15s >\n"]
-
- -- we can use formatters but best check for % then because for simple messages
- -- we con't want this overhead for single messages (not that there are that
- -- many; we could have a special weak table)
-
report = function(a,b,c,...)
if c then
write_nl(target,report_yes(translations[a],formatters[formats[b]](c,...)))
@@ -192,9 +244,6 @@ if tex and (tex.jobname or tex.formatname) then
end
end
- local direct_yes = formatters["%-15s > %s"]
- local direct_nop = formatters["%-15s >"]
-
direct = function(a,b,c,...)
if c then
return direct_yes(translations[a],formatters[formats[b]](c,...))
@@ -207,9 +256,6 @@ if tex and (tex.jobname or tex.formatname) then
end
end
- local subreport_yes = formatters["%-15s > %s > %s\n"]
- local subreport_nop = formatters["%-15s > %s >\n"]
-
subreport = function(a,s,b,c,...)
if c then
write_nl(target,subreport_yes(translations[a],translations[s],formatters[formats[b]](c,...)))
@@ -222,9 +268,6 @@ if tex and (tex.jobname or tex.formatname) then
end
end
- local subdirect_yes = formatters["%-15s > %s > %s"]
- local subdirect_nop = formatters["%-15s > %s >"]
-
subdirect = function(a,s,b,c,...)
if c then
return subdirect_yes(translations[a],translations[s],formatters[formats[b]](c,...))
@@ -237,9 +280,6 @@ if tex and (tex.jobname or tex.formatname) then
end
end
- local status_yes = formatters["%-15s : %s\n"]
- local status_nop = formatters["%-15s :\n"]
-
status = function(a,b,c,...)
if c then
write_nl(target,status_yes(translations[a],formatters[formats[b]](c,...)))
@@ -252,17 +292,13 @@ if tex and (tex.jobname or tex.formatname) then
end
end
- local targets = {
- logfile = "log",
- log = "log",
- file = "log",
- console = "term",
- terminal = "term",
- both = "term and log",
- }
-
- settarget = function(whereto)
- target = targets[whereto or "both"] or targets.both
+ settarget = function(askedwhereto)
+ whereto = askedwhereto or whereto or "both"
+ target = targets[whereto]
+ if not target then
+ whereto = "both"
+ target = targets[whereto]
+ end
if target == "term" or target == "term and log" then
logs.flush = io.flush
else
@@ -298,24 +334,81 @@ if tex and (tex.jobname or tex.formatname) then
end
end
- setformatters = function(f)
- report_yes = f.report_yes or report_yes
- report_nop = f.report_nop or report_nop
- subreport_yes = f.subreport_yes or subreport_yes
- subreport_nop = f.subreport_nop or subreport_nop
- direct_yes = f.direct_yes or direct_yes
- direct_nop = f.direct_nop or direct_nop
- subdirect_yes = f.subdirect_yes or subdirect_yes
- subdirect_nop = f.subdirect_nop or subdirect_nop
- status_yes = f.status_yes or status_yes
- status_nop = f.status_nop or status_nop
+ setformatters = function(specification)
+ local t = nil
+ local f = nil
+ local d = variants.default
+ if not specification then
+ --
+ elseif type(specification) == "table" then
+ t = specification.targets
+ f = specification.formats or specification
+ else
+ local v = variants[specification]
+ if v then
+ t = v.targets
+ f = v.formats
+ variant = specification
+ end
+ end
+ targets = t or d.targets
+ target = targets[whereto] or target
+ if f then
+ d = d.formats
+ else
+ f = d.formats
+ d = f
+ end
+ setmetatableindex(f,d)
+ report_yes = f.report_yes
+ report_nop = f.report_nop
+ subreport_yes = f.subreport_yes
+ subreport_nop = f.subreport_nop
+ direct_yes = f.direct_yes
+ direct_nop = f.direct_nop
+ subdirect_yes = f.subdirect_yes
+ subdirect_nop = f.subdirect_nop
+ status_yes = f.status_yes
+ status_nop = f.status_nop
+ if variant == "ansi" then
+ useluawrites() -- because tex escapes ^^
+ end
+ settarget(whereto)
end
+ setformatters(variant)
+
setlogfile = ignore
settimedlog = ignore
else
+ local report_yes, subreport_yes, status_yes
+ local report_nop, subreport_nop, status_nop
+
+ local variants = {
+ default = {
+ formats = {
+ report_yes = formatters["%-15s | %s"],
+ report_nop = formatters["%-15s |"],
+ subreport_yes = formatters["%-15s | %s | %s"],
+ subreport_nop = formatters["%-15s | %s |"],
+ status_yes = formatters["%-15s : %s\n"],
+ status_nop = formatters["%-15s :\n"],
+ },
+ },
+ ansi = {
+ formats = {
+ report_yes = formatters["%-15s | %s"],
+ report_nop = formatters["%-15s |"],
+ subreport_yes = formatters["%-15s | %s | %s"],
+ subreport_nop = formatters["%-15s | %s |"],
+ status_yes = formatters["%-15s : %s\n"],
+ status_nop = formatters["%-15s :\n"],
+ },
+ },
+ }
+
logs.flush = ignore
writer = function(s)
@@ -326,9 +419,6 @@ else
write_nl("\n")
end
- local report_yes = formatters["%-15s | %s"]
- local report_nop = formatters["%-15s |"]
-
report = function(a,b,c,...)
if c then
write_nl(report_yes(a,formatters[b](c,...)))
@@ -341,9 +431,6 @@ else
end
end
- local subreport_yes = formatters["%-15s | %s | %s"]
- local subreport_nop = formatters["%-15s | %s |"]
-
subreport = function(a,sub,b,c,...)
if c then
write_nl(subreport_yes(a,sub,formatters[b](c,...)))
@@ -356,9 +443,6 @@ else
end
end
- local status_yes = formatters["%-15s : %s\n"]
- local status_nop = formatters["%-15s :\n"]
-
status = function(a,b,c,...) -- not to be used in lua anyway
if c then
write_nl(status_yes(a,formatters[b](c,...)))
@@ -387,15 +471,36 @@ else
end
end
- setformatters = function(f)
- report_yes = f.report_yes or report_yes
- report_nop = f.report_nop or report_nop
- subreport_yes = f.subreport_yes or subreport_yes
- subreport_nop = f.subreport_nop or subreport_nop
- status_yes = f.status_yes or status_yes
- status_nop = f.status_nop or status_nop
+ setformatters = function(specification)
+ local f = nil
+ local d = variants.default
+ if specification then
+ if type(specification) == "table" then
+ f = specification.formats or specification
+ else
+ local v = variants[specification]
+ if v then
+ f = v.formats
+ end
+ end
+ end
+ if f then
+ d = d.formats
+ else
+ f = d.formats
+ d = f
+ end
+ setmetatableindex(f,d)
+ report_yes = f.report_yes
+ report_nop = f.report_nop
+ subreport_yes = f.subreport_yes
+ subreport_nop = f.subreport_nop
+ status_yes = f.status_yes
+ status_nop = f.status_nop
end
+ setformatters(variant)
+
setlogfile = function(name,keepopen)
if name and name ~= "" then
local localtime = os.localtime
@@ -726,13 +831,13 @@ logs.simpleline = simple
-- obsolete
-function logs.setprogram () end -- obsolete
-function logs.extendbanner() end -- obsolete
-function logs.reportlines () end -- obsolete
-function logs.reportbanner() end -- obsolete
-function logs.reportline () end -- obsolete
-function logs.simplelines () end -- obsolete
-function logs.help () end -- obsolete
+logs.setprogram = ignore -- obsolete
+logs.extendbanner = ignore -- obsolete
+logs.reportlines = ignore -- obsolete
+logs.reportbanner = ignore -- obsolete
+logs.reportline = ignore -- obsolete
+logs.simplelines = ignore -- obsolete
+logs.help = ignore -- obsolete
-- applications
@@ -845,10 +950,12 @@ end
-- logs.system(syslogname,"context","test","fonts","font %s recached due to newer version (%s)","blabla","123")
-- end
-function logs.system(whereto,process,jobname,category,...)
- local message = formatters["%s %s => %s => %s => %s\r"](os.date("%d/%m/%y %H:%m:%S"),process,jobname,category,format(...))
+local f_syslog = formatters["%s %s => %s => %s => %s\r"]
+
+function logs.system(whereto,process,jobname,category,fmt,arg,...)
+ local message = f_syslog(datetime("%d/%m/%y %H:%m:%S"),process,jobname,category,arg == nil and fmt or format(fmt,arg,...))
for i=1,10 do
- local f = io.open(whereto,"a") -- we can consider keeping the file open
+ local f = openfile(whereto,"a") -- we can consider keeping the file open
if f then
f:write(message)
f:close()
diff --git a/Master/texmf-dist/tex/context/base/trac-set.lua b/Master/texmf-dist/tex/context/base/trac-set.lua
index 95fdc43b30f..9e2bf87589a 100644
--- a/Master/texmf-dist/tex/context/base/trac-set.lua
+++ b/Master/texmf-dist/tex/context/base/trac-set.lua
@@ -37,7 +37,7 @@ function setters.initialize(filename,name,values) -- filename only for diagnosti
local data = setter.data
if data then
for key, newvalue in next, values do
- local newvalue = is_boolean(newvalue,newvalue)
+ local newvalue = is_boolean(newvalue,newvalue,true) -- strict
local functions = data[key]
if functions then
local oldvalue = functions.value
@@ -97,7 +97,7 @@ local function set(t,what,newvalue)
elseif not value then
value = false -- catch nil
else
- value = is_boolean(value,value)
+ value = is_boolean(value,value,true) -- strict
end
w = topattern(w,true,true)
for name, functions in next, data do
@@ -258,6 +258,7 @@ function setters.new(name) -- we could use foo:bar syntax (but not used that oft
report = function(...) setters.report (setter,...) end,
enable = function(...) enable (setter,...) end,
disable = function(...) disable (setter,...) end,
+ reset = function(...) reset (setter,...) end, -- can be dangerous
register = function(...) register(setter,...) end,
list = function(...) list (setter,...) end,
show = function(...) show (setter,...) end,
diff --git a/Master/texmf-dist/tex/context/base/trac-tex.lua b/Master/texmf-dist/tex/context/base/trac-tex.lua
index 7e340607313..5fe4754cbde 100644
--- a/Master/texmf-dist/tex/context/base/trac-tex.lua
+++ b/Master/texmf-dist/tex/context/base/trac-tex.lua
@@ -8,7 +8,7 @@ if not modules then modules = { } end modules ['trac-tex'] = {
-- moved from trac-deb.lua
-local format = string.format
+local next = next
local texhashtokens = tex.hashtokens
@@ -20,23 +20,70 @@ function trackers.savehash()
saved = texhashtokens()
end
-function trackers.dumphashtofile(filename,delta)
- local list, hash, command_name = { }, texhashtokens(), token.command_name
- for name, token in next, hash do
- if not delta or not saved[name] then
- -- token: cmd, chr, csid -- combination cmd,chr determines name
- local category = command_name(token)
- local dk = list[category]
- if not dk then
- -- a bit funny names but this sorts better (easier to study)
- dk = { names = { }, found = 0, code = token[1] }
- list[category] = dk
+if newtoken then
+
+ function trackers.dumphashtofile(filename,delta)
+ local list = { }
+ local hash = tex.hashtokens()
+ local create = newtoken.create
+ for name, token in next, hash do
+ if not delta or not saved[name] then
+ if token[2] ~= 0 then -- still old interface
+ local token = create(name)
+ -- inspect(token)
+ local category = token.cmdname
+ local dk = list[category]
+ if not dk then
+ dk = {
+ names = { },
+ found = 0,
+ -- code = token[1],
+ }
+ list[category] = dk
+ end
+ if token.protected then
+ if token.expandable then
+ dk.names[name] = "ep"
+ else
+ dk.names[name] = "-p"
+ end
+ else
+ if token.expandable then
+ dk.names[name] = "ep"
+ else
+ dk.names[name] = "--"
+ end
+ end
+ dk.found = dk.found + 1
+ end
end
- dk.names[name] = { token[2], token[3] }
- dk.found = dk.found + 1
end
+ table.save(filename or tex.jobname .. "-hash.log",list)
end
- io.savedata(filename or tex.jobname .. "-hash.log",table.serialize(list,true))
+
+else
+
+ function trackers.dumphashtofile(filename,delta)
+ local list = { }
+ local hash = texhashtokens()
+ local getname = token.command_name
+ for name, token in next, hash do
+ if not delta or not saved[name] then
+ -- token: cmd, chr, csid -- combination cmd,chr determines name
+ local category = getname(token)
+ local dk = list[category]
+ if not dk then
+ -- a bit funny names but this sorts better (easier to study)
+ dk = { names = { }, found = 0, code = token[1] }
+ list[category] = dk
+ end
+ dk.names[name] = { token[2], token[3] }
+ dk.found = dk.found + 1
+ end
+ end
+ table.save(filename or tex.jobname .. "-hash.log",list)
+ end
+
end
local delta = nil
diff --git a/Master/texmf-dist/tex/context/base/trac-vis.lua b/Master/texmf-dist/tex/context/base/trac-vis.lua
index eb5373ee350..86af6da0bdc 100644
--- a/Master/texmf-dist/tex/context/base/trac-vis.lua
+++ b/Master/texmf-dist/tex/context/base/trac-vis.lua
@@ -190,7 +190,7 @@ end
local function enable()
if not usedfont then
- -- we use a narrow monospaced font
+ -- we use a narrow monospaced font -- infofont ?
visualizers.setfont(fonts.definers.define { name = "lmmonoltcond10regular", size = tex.sp("4pt") })
end
for mode, value in next, modes do
@@ -280,13 +280,6 @@ function visualizers.setlayer(n)
texsetattribute(a_layer,layers[n] or unsetvalue)
end
-commands.setvisual = visualizers.setvisual
-commands.setlayer = visualizers.setlayer
-
-function commands.visual(n)
- context(setvisual(n))
-end
-
local function set(mode,v)
texsetattribute(a_visual,setvisual(mode,texgetattribute(a_visual),v))
end
@@ -322,7 +315,7 @@ local c_glyph_d = "trace:do"
local c_white_d = "trace:dw"
local c_math_d = "trace:dr"
-local function sometext(str,layer,color,textcolor) -- we can just paste verbatim together .. no typesteting needed
+local function sometext(str,layer,color,textcolor,lap) -- we can just paste verbatim together .. no typesteting needed
local text = fast_hpack_string(str,usedfont)
local size = getfield(text,"width")
local rule = new_rule(size,2*exheight,exheight/2)
@@ -336,10 +329,13 @@ local function sometext(str,layer,color,textcolor) -- we can just paste verbatim
local info = linked_nodes(rule,kern,text)
setlisttransparency(info,c_zero)
info = fast_hpack(info)
+ local width = getfield(info,"width")
+ if lap then
+ info = fast_hpack(linked_nodes(new_kern(-width),info))
+ end
if layer then
setattr(info,a_layer,layer)
end
- local width = getfield(info,"width")
setfield(info,"width",0)
setfield(info,"height",0)
setfield(info,"depth",0)
@@ -580,7 +576,8 @@ local function ruledglyph(head,current,previous)
setfield(current,"prev",nil)
local linewidth = emwidth/20
local baseline
- if dp ~= 0 and ht ~= 0 then
+ -- if dp ~= 0 and ht ~= 0 then
+ if (dp >= 0 and ht >= 0) or (dp <= 0 and ht <= 0) then
baseline = new_rule(wd-2*linewidth,linewidth,0)
end
local doublelinewidth = 2*linewidth
@@ -740,7 +737,7 @@ local function ruledpenalty(head,current,vertical)
return head, getnext(current)
end
-local function visualize(head,vertical)
+local function visualize(head,vertical,forced)
local trace_hbox = false
local trace_vbox = false
local trace_vtop = false
@@ -760,7 +757,7 @@ local function visualize(head,vertical)
local prev_trace_fontkern = nil
while current do
local id = getid(current)
- local a = getattr(current,a_visual) or unsetvalue
+ local a = forced or getattr(current,a_visual) or unsetvalue
if a ~= attr then
prev_trace_fontkern = trace_fontkern
if a == unsetvalue then
@@ -801,19 +798,17 @@ local function visualize(head,vertical)
head, current = ruledglyph(head,current,previous)
end
elseif id == disc_code then
- if trace_glyph then
- local pre = getfield(current,"pre")
- if pre then
- setfield(current,"pre",ruledglyph(pre,pre))
- end
- local post = getfield(current,"post")
- if post then
- setfield(current,"post",ruledglyph(post,post))
- end
- local replace = getfield(current,"replace")
- if replace then
- setfield(current,"replace",ruledglyph(replace,replace))
- end
+ local pre = getfield(current,"pre")
+ if pre then
+ setfield(current,"pre",visualize(pre,false,a))
+ end
+ local post = getfield(current,"post")
+ if post then
+ setfield(current,"post",visualize(post,false,a))
+ end
+ local replace = getfield(current,"replace")
+ if replace then
+ setfield(current,"replace",visualize(replace,false,a))
end
elseif id == kern_code then
local subtype = getsubtype(current)
@@ -822,7 +817,7 @@ local function visualize(head,vertical)
if trace_fontkern or prev_trace_fontkern then
head, current = fontkern(head,current)
end
- elseif subtype == user_kern_code then
+ else -- if subtype == user_kern_code then
if trace_kern then
head, current = ruledkern(head,current,vertical)
end
@@ -838,10 +833,6 @@ local function visualize(head,vertical)
if trace_penalty then
head, current = ruledpenalty(head,current,vertical)
end
- elseif id == disc_code then
- setfield(current,"pre",visualize(getfield(current,"pre")))
- setfield(current,"post",isualize(getfield(current,"post")))
- setfield(current,"replace",visualize(getfield(current,"replace")))
elseif id == hlist_code then
local content = getlist(current)
if content then
@@ -967,10 +958,6 @@ function visualizers.markfonts(list)
markfonts(type(n) == "number" and getlist(getbox(n)) or n)
end
-function commands.markfonts(n)
- visualizers.markfonts(n)
-end
-
luatex.registerstopactions(cleanup)
statistics.register("visualization time",function()
@@ -979,3 +966,14 @@ statistics.register("visualization time",function()
return format("%s seconds",statistics.elapsedtime(visualizers))
end
end)
+
+-- interface
+
+local implement = interfaces.implement
+
+implement { name = "setvisual", arguments = "string", actions = visualizers.setvisual }
+implement { name = "getvisual", arguments = "string", actions = { setvisual, context } }
+implement { name = "setvisuallayer", arguments = "string", actions = visualizers.setlayer }
+implement { name = "markvisualfonts", arguments = "integer", actions = visualizers.markfonts }
+implement { name = "setvisualfont", arguments = "integer", actions = visualizers.setfont }
+
diff --git a/Master/texmf-dist/tex/context/base/trac-vis.mkiv b/Master/texmf-dist/tex/context/base/trac-vis.mkiv
index 7517037ea46..a227e83544e 100644
--- a/Master/texmf-dist/tex/context/base/trac-vis.mkiv
+++ b/Master/texmf-dist/tex/context/base/trac-vis.mkiv
@@ -54,10 +54,10 @@
\let\syst_visualizers_vbox\vbox
\let\syst_visualizers_vtop\vtop
-\unexpanded\def\ruledhbox{\syst_visualizers_hbox attr \visualattribute \ctxcommand{visual("simplehbox")} }
-\unexpanded\def\ruledvbox{\syst_visualizers_vbox attr \visualattribute \ctxcommand{visual("simplevbox")} }
-\unexpanded\def\ruledvtop{\syst_visualizers_vtop attr \visualattribute \ctxcommand{visual("simplevtop")} } % special case
-\unexpanded\def\ruledtopv{\syst_visualizers_vtop attr \visualattribute \ctxcommand{visual("vtop")} }
+\unexpanded\def\ruledhbox{\syst_visualizers_hbox attr \visualattribute \clf_getvisual{simplehbox} }
+\unexpanded\def\ruledvbox{\syst_visualizers_vbox attr \visualattribute \clf_getvisual{simplevbox} }
+\unexpanded\def\ruledvtop{\syst_visualizers_vtop attr \visualattribute \clf_getvisual{simplevtop} } % special case
+\unexpanded\def\ruledtopv{\syst_visualizers_vtop attr \visualattribute \clf_getvisual{vtop} }
\unexpanded\def\ruledmbox#1{\ruledhbox{\startimath#1\stopimath}}
@@ -87,29 +87,29 @@
\unexpanded\def\syst_visualizers_makeup[#1]%
{\iffirstargument
- \ctxcommand{setvisual("#1")}%
+ \clf_setvisual{#1}%
\else
- \ctxcommand{setvisual("makeup")}%
+ \clf_setvisual{makeup}%
\let\normalvtop\ruledtopv
\let\vtop \ruledtopv
\fi}
\unexpanded\def\showallmakeup
- {\ctxcommand{setvisual("all")}%
+ {\clf_setvisual{all}%
\let\normalvtop\ruledtopv
\let\vtop \ruledtopv
\showstruts}
\unexpanded\def\showboxes
- {\ctxcommand{setvisual("boxes")}%
+ {\clf_setvisual{boxes}%
\let\normalvtop\ruledtopv
\let\vtop \ruledtopv}
\unexpanded\def\showglyphs
- {\ctxcommand{setvisual("glyph")}}
+ {\clf_setvisual{glyph}}
\unexpanded\def\showfontkerns
- {\ctxcommand{setvisual("fontkern")}}
+ {\clf_setvisual{fontkern}}
\unexpanded\def\setvisualizerfont
{\dosingleempty\syst_visualizers_setfont}
@@ -117,7 +117,7 @@
\def\syst_visualizers_setfont[#1]% somename at 4pt
{\begingroup
\doifelsenothing{#1}{\definedfont[Mono at 4pt]}{\definedfont[#1]}%
- \ctxlua{nodes.visualizers.setfont()}%
+ \clf_setvisualfont\fontid\font
\endgroup}
%D New (these might also be a visualizers):
@@ -148,14 +148,14 @@
%D Overload:
% \def\spac_struts_vide_hbox
-% {\hbox attr \visualattribute \ctxcommand{visual("strut")} }
+% {\hbox attr \visualattribute \clf_getvisual{strut} }
%
% \def\spac_struts_vide_hbox
-% {\xdef\spac_struts_vide_hbox{\hbox attr \visualattribute \ctxcommand{visual("strut")} }%
+% {\xdef\spac_struts_vide_hbox{\hbox attr \visualattribute \clf_getvisual{strut} }%
% \spac_struts_vide_hbox}
\unexpanded\def\spac_struts_vide_hbox
- {\hbox attr \visualattribute \ctxcommand{visual("strut")} }
+ {\hbox attr \visualattribute \clf_getvisual{strut} }
\appendtoks
\normalexpanded{\unexpanded\xdef\spac_struts_vide_hbox\expandafter{\spac_struts_vide_hbox}}%
@@ -167,7 +167,7 @@
{\dontleavehmode
\begingroup
\setbox\scratchbox\hbox{\getbuffer}%
- \ctxcommand{markfonts(\number\scratchbox)}%
+ \clf_markvisualfonts\scratchbox
\unhbox\scratchbox
\endgroup}
diff --git a/Master/texmf-dist/tex/context/base/type-imp-dejavu.mkiv b/Master/texmf-dist/tex/context/base/type-imp-dejavu.mkiv
index de1f7752cc9..41cf1f701e3 100644
--- a/Master/texmf-dist/tex/context/base/type-imp-dejavu.mkiv
+++ b/Master/texmf-dist/tex/context/base/type-imp-dejavu.mkiv
@@ -15,33 +15,6 @@
\starttypescriptcollection[dejavu]
- \starttypescript [\s!mono] [dejavu-condensed] [\s!name]
- \setups[\s!font:\s!fallback:\s!mono]
- % \definefontsynonym [\s!Mono] [\s!name:dejavusansmonocondensed] [\s!features=\s!none]
- % \definefontsynonym [\s!MonoBold] [\s!name:dejavusansmonoboldcondensed] [\s!features=\s!none]
- % \definefontsynonym [\s!MonoItalic] [\s!name:dejavusansmonoobliquecondensed] [\s!features=\s!none]
- % \definefontsynonym [\s!MonoBoldItalic] [\s!name:dejavusansmonoboldobliquecondensed] [\s!features=\s!none]
- \definefontsynonym [\s!Mono] [\s!name:dejavusansmono] [\s!features=dejavu-condensed-mono]
- \definefontsynonym [\s!MonoBold] [\s!name:dejavusansmonobold] [\s!features=dejavu-condensed-mono]
- \definefontsynonym [\s!MonoItalic] [\s!name:dejavusansmonooblique] [\s!features=dejavu-condensed-mono]
- \definefontsynonym [\s!MonoBoldItalic] [\s!name:dejavusansmonoboldoblique] [\s!features=dejavu-condensed-mono]
- \stoptypescript
-
- % \starttypescript [\s!mono] [dejavu-condensed] [\s!name]
- % \setups[\s!font:\s!fallback:\s!mono]
- % \definefontsynonym [\s!Mono] [\s!name:dejavusansmono] [\s!features=\s!none]
- % \definefontsynonym [\s!MonoBold] [\s!name:dejavusansmonobold] [\s!features=\s!none]
- % \definefontsynonym [\s!MonoItalic] [\s!name:dejavusansmonooblique] [\s!features=\s!none]
- % \definefontsynonym [\s!MonoBoldItalic] [\s!name:dejavusansmonoboldoblique] [\s!features=\s!none]
- % \stoptypescript
-
- \starttypescript[dejavu-condensed]
- \definetypeface [dejavu-condensed] [\s!rm] [\s!serif] [dejavu-condensed] [\s!default]
- \definetypeface [dejavu-condensed] [\s!ss] [\s!sans] [dejavu-condensed] [\s!default]
- \definetypeface [dejavu-condensed] [\s!tt] [\s!mono] [dejavu-condensed] [\s!default]
- \definetypeface [dejavu-condensed] [\s!mm] [\s!math] [xits] [\s!default] [\s!rscale=1.2]
- \stoptypescript
-
\starttypescript [\s!serif] [dejavu] [\s!name]
\setups[\s!font:\s!fallback:\s!serif]
\definefontsynonym [\s!Serif] [\s!name:dejavuserif] [\s!features=\s!default]
@@ -66,11 +39,17 @@
\definefontsynonym [\s!MonoBoldItalic] [\s!name:dejavusansmonoboldoblique] [\s!features=\s!none]
\stoptypescript
+ \starttypescript [\s!math][dejavu][\s!name]
+ %\loadfontgoodies[dejavu]
+ \definefontsynonym[\s!MathRoman][file:dejavu-math.otf][\s!features=\s!math\mathsizesuffix]
+ \stoptypescript
+
\starttypescript[dejavu]
\definetypeface [dejavu] [\s!rm] [\s!serif] [dejavu] [\s!default]
\definetypeface [dejavu] [\s!ss] [\s!sans] [dejavu] [\s!default]
\definetypeface [dejavu] [\s!tt] [\s!mono] [dejavu] [\s!default]
- \definetypeface [dejavu] [\s!mm] [\s!math] [xits] [\s!default] [\s!rscale=1.2]
+% \definetypeface [dejavu] [\s!mm] [\s!math] [xits] [\s!default] [\s!rscale=1.2]
+ \definetypeface [dejavu] [\s!mm] [\s!math] [dejavu] [\s!default]
\stoptypescript
\starttypescript[dejavubidi]
@@ -96,4 +75,32 @@
\definefontsynonym [\s!SansBoldItalic] [\s!name:dejavusanscondensedboldoblique] [\s!features=\s!default]
\stoptypescript
+ \starttypescript [\s!mono] [dejavu-condensed] [\s!name]
+ \setups[\s!font:\s!fallback:\s!mono]
+ % \definefontsynonym [\s!Mono] [\s!name:dejavusansmonocondensed] [\s!features=\s!none]
+ % \definefontsynonym [\s!MonoBold] [\s!name:dejavusansmonoboldcondensed] [\s!features=\s!none]
+ % \definefontsynonym [\s!MonoItalic] [\s!name:dejavusansmonoobliquecondensed] [\s!features=\s!none]
+ % \definefontsynonym [\s!MonoBoldItalic] [\s!name:dejavusansmonoboldobliquecondensed] [\s!features=\s!none]
+ \definefontsynonym [\s!Mono] [\s!name:dejavusansmono] [\s!features=dejavu-condensed-mono]
+ \definefontsynonym [\s!MonoBold] [\s!name:dejavusansmonobold] [\s!features=dejavu-condensed-mono]
+ \definefontsynonym [\s!MonoItalic] [\s!name:dejavusansmonooblique] [\s!features=dejavu-condensed-mono]
+ \definefontsynonym [\s!MonoBoldItalic] [\s!name:dejavusansmonoboldoblique] [\s!features=dejavu-condensed-mono]
+ \stoptypescript
+
+ % \starttypescript [\s!mono] [dejavu-condensed] [\s!name]
+ % \setups[\s!font:\s!fallback:\s!mono]
+ % \definefontsynonym [\s!Mono] [\s!name:dejavusansmono] [\s!features=\s!none]
+ % \definefontsynonym [\s!MonoBold] [\s!name:dejavusansmonobold] [\s!features=\s!none]
+ % \definefontsynonym [\s!MonoItalic] [\s!name:dejavusansmonooblique] [\s!features=\s!none]
+ % \definefontsynonym [\s!MonoBoldItalic] [\s!name:dejavusansmonoboldoblique] [\s!features=\s!none]
+ % \stoptypescript
+
+ \starttypescript[dejavu-condensed]
+ \definetypeface [dejavu-condensed] [\s!rm] [\s!serif] [dejavu-condensed] [\s!default]
+ \definetypeface [dejavu-condensed] [\s!ss] [\s!sans] [dejavu-condensed] [\s!default]
+ \definetypeface [dejavu-condensed] [\s!tt] [\s!mono] [dejavu-condensed] [\s!default]
+% \definetypeface [dejavu-condensed] [\s!mm] [\s!math] [xits] [\s!default] [\s!rscale=1.2]
+ \definetypeface [dejavu-condensed] [\s!mm] [\s!math] [dejavu] [\s!default]
+ \stoptypescript
+
\stoptypescriptcollection
diff --git a/Master/texmf-dist/tex/context/base/type-ini.lua b/Master/texmf-dist/tex/context/base/type-ini.lua
index 4f53fbf4011..cd5b32d3e6c 100644
--- a/Master/texmf-dist/tex/context/base/type-ini.lua
+++ b/Master/texmf-dist/tex/context/base/type-ini.lua
@@ -6,15 +6,23 @@ if not modules then modules = { } end modules ['type-ini'] = {
license = "see context related readme files"
}
+local gsub = string.gsub
+local lpegmatch, P, Cs = lpeg.match, lpeg.P, lpeg.Cs
+
-- more code will move here
-local commands, context = commands, context
+local commands = commands
+local context = context
+local implement = interfaces.implement
-local gsub = string.gsub
+local uselibrary = resolvers.uselibrary
+
+local name_one = nil
+local name_two = nil
-local report_typescripts = logs.reporter("fonts","typescripts")
+local p_strip = Cs((P("type-") * (P("imp-")^0))^0/"" * P(1)^0)
-local patterns = { "type-imp-%s.mkiv", "type-imp-%s.tex", "type-%s.mkiv", "type-%s.tex" } -- this will be imp only
+local report = logs.reporter("fonts","typescripts")
local function action(name,foundname)
-- context.startreadingfile()
@@ -27,52 +35,83 @@ local function action(name,foundname)
context.loadfoundtypescriptfile(foundname)
end
-local name_one, name_two
-
-local function failure_two(name)
- report_typescripts("unknown library %a or %a",name_one,name_two)
-end
+local patterns = {
+ "type-imp-%s.mkiv",
+ "type-imp-%s.tex"
+}
-local function failure_one(name)
- name_two = gsub(name,"%-.*$","")
+local function failure(name)
if name == "loc" then
-- ignore
- elseif name_two == name then
- report_typescripts("unknown library %a",name_one)
else
- commands.uselibrary {
- name = name_two,
+ report("unknown library %a",name)
+ end
+end
+
+implement {
+ name = "loadtypescriptfile",
+ arguments = "string",
+ actions = function(name) -- a more specific name
+ uselibrary {
+ name = lpegmatch(p_strip,name) or name,
patterns = patterns,
action = action,
- failure = failure_two,
+ failure = failure,
onlyonce = false, -- will become true
}
end
-end
-
-function commands.doprocesstypescriptfile(name)
- name_one = gsub(name,"^type%-","")
- commands.uselibrary {
- name = name_one,
- patterns = patterns,
- action = action,
- failure = failure_one,
- onlyonce = false, -- will become true
- }
-end
+}
-local patterns = { "type-imp-%s.mkiv", "type-imp-%s.tex" }
+local patterns = {
+ "type-imp-%s.mkiv",
+ "type-imp-%s.tex",
+ -- obsolete
+ "type-%s.mkiv",
+ "type-%s.tex"
+}
-local function failure(name)
- report_typescripts("unknown library %a",name)
-end
+-- local function failure_two(name)
+-- report("unknown library %a or %a",name_one,name_two)
+-- end
+--
+-- local function failure_one(name)
+-- name_two = gsub(name,"%-.*$","")
+-- if name == "loc" then
+-- -- ignore
+-- elseif name_two == name then
+-- report("unknown library %a",name_one)
+-- else
+-- commands.uselibrary {
+-- name = name_two,
+-- patterns = patterns,
+-- action = action,
+-- failure = failure_two,
+-- onlyonce = false, -- will become true
+-- }
+-- end
+-- end
+--
+-- function commands.doprocesstypescriptfile(name)
+-- name_one = lpegmatch(p_strip,name) or name
+-- uselibrary {
+-- name = name_one,
+-- patterns = patterns,
+-- action = action,
+-- failure = failure_one,
+-- onlyonce = false, -- will become true
+-- }
+-- end
-function commands.loadtypescriptfile(name) -- a more specific name
- commands.uselibrary {
- name = gsub(name,"^type%-",""),
- patterns = patterns,
- action = action,
- failure = failure,
- onlyonce = false, -- will become true
- }
-end
+implement {
+ name = "doprocesstypescriptfile",
+ arguments = "string",
+ actions = function(name)
+ uselibrary {
+ name = lpegmatch(p_strip,name) or name,
+ patterns = patterns,
+ action = action,
+ failure = failure,
+ onlyonce = false, -- will become true
+ }
+ end
+}
diff --git a/Master/texmf-dist/tex/context/base/type-ini.mkvi b/Master/texmf-dist/tex/context/base/type-ini.mkvi
index faa9c667c34..f56c5573d5d 100644
--- a/Master/texmf-dist/tex/context/base/type-ini.mkvi
+++ b/Master/texmf-dist/tex/context/base/type-ini.mkvi
@@ -172,7 +172,7 @@
\unexpanded\def\loadtypescriptfile[#1]%
{\pushmacro\typescriptstate
\let\typescriptstate\plustwo % assumes 2 at the outer level
- \ctxcommand{loadtypescriptfile("#1")}%
+ \clf_loadtypescriptfile{#1}%
\popmacro\typescriptstate}
\unexpanded\def\loadfoundtypescriptfile#1%
@@ -237,7 +237,7 @@
\expandafter\let\csname\??typescriptfiles\currenttypefile\endcsname\t_font_typescripts}
\def\font_typescript_process_typescript_file
- {\ctxcommand{doprocesstypescriptfile("\currenttypefile")}}
+ {\clf_doprocesstypescriptfile{\currenttypefile}}
\unexpanded\def\usetypescriptonce
{\dotripleempty\font_typescripts_use_once}
@@ -294,12 +294,12 @@
%{\appendtoks\starttypescript#definitions\stoptypescript\to\c_font_typescripts_document}
{\c_font_typescripts_document\expandafter{\the\c_font_typescripts_document\starttypescript#definitions\stoptypescript}}
-\def\font_typescripts_start_process % could be a faster \doifnextoptionalelse if needed
+\def\font_typescripts_start_process % could be a faster \doifelsenextoptionalif needed
{\let\typescriptone \m_font_typescripts_one
\let\typescripttwo \m_font_typescripts_two
\let\typescriptthree\m_font_typescripts_three
\let\m_font_typescripts_match\empty
- \doifnextoptionalcselse\font_typescripts_start_process_one\font_typescripts_start_process_all}
+ \doifelsenextoptionalcs\font_typescripts_start_process_one\font_typescripts_start_process_all}
\def\font_typescripts_start_process_all % could be a \let
{\ifconditional\c_font_typescripts_first_pass
@@ -333,10 +333,10 @@
{\font_typescripts_check\m_font_typescripts_three\typescriptthree\font_typescripts_start_process_again_three}
\def\font_typescripts_start_process_again_one
- {\doifnextoptionalcselse\font_typescripts_start_process_two\font_typescripts_start_process_yes}
+ {\doifelsenextoptionalcs\font_typescripts_start_process_two\font_typescripts_start_process_yes}
\def\font_typescripts_start_process_again_two
- {\doifnextoptionalcselse\font_typescripts_start_process_three\font_typescripts_start_process_yes}
+ {\doifelsenextoptionalcs\font_typescripts_start_process_three\font_typescripts_start_process_yes}
\let\font_typescripts_start_process_again_three\font_typescripts_start_process_yes
@@ -359,7 +359,7 @@
\donetrue
\let#target\m_font_typescripts_check
\else
- \doifcommonelse\m_font_typescripts_check#asked\donetrue\donefalse
+ \doifelsecommon\m_font_typescripts_check#asked\donetrue\donefalse
\ifdone
\let#target\commalistelement
\fi
@@ -381,13 +381,13 @@
\unexpanded\def\loadmapline{\dodoubleempty\font_map_load_line}
\def\font_map_load_file[#filename]%
- {\ctxlua{fonts.mappings.loadfile("#filename")}}
+ {\clf_loadmapfile{#filename}}
\def\font_map_load_line[#kind][#data]%
- {\ctxlua{fonts.mappings.loadline("#kind","#data")}}
+ {\clf_loadmapline{#kind}{#data}}
\unexpanded\def\forgetmapfiles
- {\ctxlua{fonts.mappings.reset()}}
+ {\clf_resetmapfiles}
% \prependtoks
% \loadmapfile[mkiv-base.map]% can't we preload this one?
@@ -497,7 +497,7 @@
{\font_typefaces_define_indeed[#name][#style]}
\def\font_typefaces_define_d[#name][#specification][#dummya][#dummyb][#dummyc][#dummyd]% use definitions in lfg file
- {\ctxlua{fonts.definetypeface("#name",\!!bs#specification\!!es)}}
+ {\clf_definetypeface{#name}{#specification}}
\def\font_typefaces_define_indeed[#name][#style]% saveguard against redefinition
{\doifsomething{#name}
@@ -575,12 +575,6 @@
\fi \fi \fi
\ifmmode\mr\else\tf\fi} % needed ?
-% obsolete
-%
-% \unexpanded\def\usetypefile[#type]% recurses on path ! % no storage
-% {\edef\currenttypefile{#type}%
-% \ctxcommand{doprocesstypescriptfile("\currenttypefile")}}
-
%D For Taco:
%D
%D \starttyping
diff --git a/Master/texmf-dist/tex/context/base/type-run.mkiv b/Master/texmf-dist/tex/context/base/type-run.mkiv
index 4da633371d9..0455d896636 100644
--- a/Master/texmf-dist/tex/context/base/type-run.mkiv
+++ b/Master/texmf-dist/tex/context/base/type-run.mkiv
@@ -21,7 +21,7 @@
\def\dochecktypescript##1##2% script use
{\doifelsenothing{##1##2}
{\donetrue}
- {\doifcommonelse{##1}{##2}\donetrue\donefalse}}
+ {\doifelsecommon{##1}{##2}\donetrue\donefalse}}
\edef\typescriptone {\truetypescript{#1}}%
\edef\typescripttwo {\truetypescript{#2}}%
\edef\typescriptthree{\truetypescript{#3}}%
@@ -30,7 +30,7 @@
\obeylines % else we loose the first line due to lookahead
\dotripleempty\dostarttypescript}
\def\dostarttypescript[##1][##2][##3]%
- {\long\def\next####1\stoptypescript{\egroup}
+ {\def\next####1\stoptypescript{\egroup}
\dochecktypescript{##1}\typescriptone \ifdone
\dochecktypescript{##2}\typescripttwo \ifdone
\dochecktypescript{##3}\typescriptthree\ifdone
diff --git a/Master/texmf-dist/tex/context/base/typo-bld.lua b/Master/texmf-dist/tex/context/base/typo-bld.lua
index ad37c36f41a..4d0f28d9ab1 100644
--- a/Master/texmf-dist/tex/context/base/typo-bld.lua
+++ b/Master/texmf-dist/tex/context/base/typo-bld.lua
@@ -165,13 +165,8 @@ local function processor(head,followed_by_display)
end
end
-function constructors.enable()
- enabled = true
-end
-
-function constructors.disable()
- enabled = false
-end
+function constructors.enable () enabled = true end
+function constructors.disable() enabled = false end
callbacks.register('linebreak_filter', processor, "breaking paragraps into lines")
@@ -179,15 +174,6 @@ statistics.register("linebreak processing time", function()
return statistics.elapsedseconds(parbuilders)
end)
--- interface
-
-commands.defineparbuilder = constructors.define
-commands.startparbuilder = constructors.start
-commands.stopparbuilder = constructors.stop
-commands.setparbuilder = constructors.set
-commands.enableparbuilder = constructors.enable
-commands.disableparbuilder = constructors.disable
-
-- todo: move from nodes.builders to builders
nodes.builders = nodes.builder or { }
@@ -267,3 +253,12 @@ callbacks.register('buildpage_filter', builders.buildpage_filter, "vertical spac
statistics.register("v-node processing time", function()
return statistics.elapsedseconds(builders)
end)
+
+local implement = interfaces.implement
+
+implement { name = "defineparbuilder", actions = constructors.define, arguments = "string" }
+implement { name = "setparbuilder", actions = constructors.set, arguments = "string" }
+implement { name = "startparbuilder", actions = constructors.start, arguments = "string" }
+implement { name = "stopparbuilder", actions = constructors.stop }
+implement { name = "enableparbuilder", actions = constructors.enable }
+implement { name = "disableparbuilder", actions = constructors.disable }
diff --git a/Master/texmf-dist/tex/context/base/typo-bld.mkiv b/Master/texmf-dist/tex/context/base/typo-bld.mkiv
index 10502005b9a..69047c98b15 100644
--- a/Master/texmf-dist/tex/context/base/typo-bld.mkiv
+++ b/Master/texmf-dist/tex/context/base/typo-bld.mkiv
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\writestatus{loading}{ConTeXt Node Macros / Paragraph Building}
+\writestatus{loading}{ConTeXt Typesetting Macros / Paragraph Building}
%D This is very experimental, undocumented, subjected to changes, etc. just as
%D the underlying interfaces. But at least it's cleaned as part of the status-mkiv
@@ -38,18 +38,18 @@
\installcorenamespace {parbuilder}
\unexpanded\def\defineparbuilder[#1]%
- {\ctxcommand{defineparbuilder("#1")}}
+ {\clf_defineparbuilder{#1}}
\unexpanded\def\startparbuilder[#1]%
{\ifhmode\par\fi
- \ctxcommand{startparbuilder("#1")}}
+ \clf_startparbuilder{#1}}
\unexpanded\def\stopparbuilder
{\ifhmode\par\fi
- \ctxcommand{stopparbuilder()}}
+ \clf_stopparbuilder}
\unexpanded\def\setmainparbuilder[#1]%
- {\ctxcommand{setparbuilder("#1")}}
+ {\clf_setparbuilder{#1}}
% no high level interface, after all implementing a linebreaker is not something that
% the average user will do
@@ -58,7 +58,7 @@
\defineparbuilder[oneline] % just for testing
\defineparbuilder[basic] % just for testing
-\def\enableparbuilders {\ctxcommand{enableparbuilder()}} % hooks in otr so we need to pickup
-\def\disableparbuilders{\ctxcommand{disableparbuilder()}} % hooks in otr so we need to pickup
+\unexpanded\def\enableparbuilders {\clf_enableparbuilder } % hooks in otr so we need to pickup
+\unexpanded\def\disableparbuilders{\clf_disableparbuilder} % hooks in otr so we need to pickup
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/typo-brk.lua b/Master/texmf-dist/tex/context/base/typo-brk.lua
index f9a65c6ba4c..a9d775856b4 100644
--- a/Master/texmf-dist/tex/context/base/typo-brk.lua
+++ b/Master/texmf-dist/tex/context/base/typo-brk.lua
@@ -53,6 +53,8 @@ local tasks = nodes.tasks
local v_reset = interfaces.variables.reset
+local implement = interfaces.implement
+
local new_penalty = nodepool.penalty
local new_glue = nodepool.glue
local new_disc = nodepool.disc
@@ -107,7 +109,8 @@ methods[2] = function(head,start) -- ( => (-
local tmp
head, start, tmp = remove_node(head,start)
head, start = insert_node_before(head,start,new_disc())
- setfield(start,"attr",copy_nodelist(getfield(tmp,"attr"))) -- just a copy will do
+ -- setfield(start,"attr",copy_nodelist(getfield(tmp,"attr"))) -- just a copy will do
+ setfield(start,"attr",getfield(tmp,"attr"))
setfield(start,"replace",tmp)
local tmp = copy_node(tmp)
local hyphen = copy_node(tmp)
@@ -125,7 +128,8 @@ methods[3] = function(head,start) -- ) => -)
local tmp
head, start, tmp = remove_node(head,start)
head, start = insert_node_before(head,start,new_disc())
- setfield(start,"attr",copy_nodelist(getfield(tmp,"attr"))) -- just a copy will do
+ -- setfield(start,"attr",copy_nodelist(getfield(tmp,"attr"))) -- just a copy will do
+ setfield(start,"attr",getfield(tmp,"attr"))
setfield(start,"replace",tmp)
local tmp = copy_node(tmp)
local hyphen = copy_node(tmp)
@@ -143,7 +147,8 @@ methods[4] = function(head,start) -- - => - - -
local tmp
head, start, tmp = remove_node(head,start)
head, start = insert_node_before(head,start,new_disc())
- setfield(start,"attr",copy_nodelist(getfield(tmp,"attr"))) -- just a copy will do
+ -- setfield(start,"attr",copy_nodelist(getfield(tmp,"attr"))) -- just a copy will do
+ setfield(start,"attr",getfield(tmp,"attr"))
setfield(start,"pre",copy_node(tmp))
setfield(start,"post",copy_node(tmp))
setfield(start,"replace",tmp)
@@ -171,7 +176,8 @@ methods[5] = function(head,start,settings) -- x => p q r
if middle then
setfield(start,"replace",(tonodes(tostring(middle),font,attr)))
end
- setfield(start,"attr",copy_nodelist(attr)) -- todo: critical only -- just a copy will do
+ -- setfield(start,"attr",copy_nodelist(attr)) -- todo: critical only -- just a copy will do
+ setfield(start,"attr",attr) -- todo: critical only -- just a copy will do
free_node(tmp)
insert_break(head,start,10000,10000)
end
@@ -315,6 +321,32 @@ end
-- interface
-commands.definebreakpoints = breakpoints.define
-commands.definebreakpoint = breakpoints.setreplacement
-commands.setbreakpoints = breakpoints.set
+implement {
+ name = "definebreakpoints",
+ actions = breakpoints.define,
+ arguments = "string"
+}
+
+implement {
+ name = "definebreakpoint",
+ actions = breakpoints.setreplacement,
+ arguments = {
+ "string",
+ "string",
+ "string",
+ {
+ { "type", "integer" },
+ { "nleft" },
+ { "nright" },
+ { "right" },
+ { "left" },
+ { "middle" },
+ }
+ }
+}
+
+implement {
+ name = "setbreakpoints",
+ actions = breakpoints.set,
+ arguments = "string"
+}
diff --git a/Master/texmf-dist/tex/context/base/typo-brk.mkiv b/Master/texmf-dist/tex/context/base/typo-brk.mkiv
index af498bfecb5..3b463c06f92 100644
--- a/Master/texmf-dist/tex/context/base/typo-brk.mkiv
+++ b/Master/texmf-dist/tex/context/base/typo-brk.mkiv
@@ -25,13 +25,13 @@
\definesystemattribute[breakpoint][public,global]
-\exhyphenchar\minusone % we use a different order then base tex, so we really need this
+% see below: \exhyphenchar \minusone % we use a different order tha n base tex, so we really need this
\unexpanded\def\definebreakpoints
{\dosingleargument\typo_breakpoints_define}
\def\typo_breakpoints_define[#1]%
- {\ctxcommand{definebreakpoints("#1")}}
+ {\clf_definebreakpoints{#1}}
\def\definebreakpoint
{\dotripleempty\typo_breakpoints_define_character}
@@ -39,18 +39,24 @@
\def\typo_breakpoints_define_character[#1][#2][#3]% name char settings
{\begingroup
\getdummyparameters[\c!type=1,\c!nleft=3,\c!nright=3,\s!language=,\c!left=,\c!right=,\c!middle=,#3]%
- \ctxcommand{definebreakpoint("#1", "#2", "\reallanguagetag{\directdummyparameter\s!language}", { % maybe deal with #3 at the lua end
- type = \directdummyparameter\c!type,
- nleft = "\directdummyparameter\c!nleft",
- nright = "\directdummyparameter\c!nright",
- right = "\directdummyparameter\c!right",
- left = "\directdummyparameter\c!left",
- middle = "\directdummyparameter\c!middle"
- } )}%
+ \clf_definebreakpoint
+ {#1}%
+ {#2}%
+ {\reallanguagetag{\directdummyparameter\s!language}}%
+ {% maybe deal with #3 at the lua end
+ type \directdummyparameter\c!type
+ nleft {\directdummyparameter\c!nleft}%
+ nright {\directdummyparameter\c!nright}%
+ right {\directdummyparameter\c!right}%
+ left {\directdummyparameter\c!left}%
+ middle {\directdummyparameter\c!middle}%
+ }%
+ \relax
\endgroup}
\unexpanded\def\setbreakpoints[#1]%
- {\ctxcommand{setbreakpoints("#1")}}
+ {\exhyphenchar\minusone % we use a different order tha n base tex, so we really need this
+ \clf_setbreakpoints{#1}}
\unexpanded\def\resetbreakpoints
{\attribute\breakpointattribute\attributeunsetvalue}
diff --git a/Master/texmf-dist/tex/context/base/typo-cap.lua b/Master/texmf-dist/tex/context/base/typo-cap.lua
index 78ed8700a31..80a74bac916 100644
--- a/Master/texmf-dist/tex/context/base/typo-cap.lua
+++ b/Master/texmf-dist/tex/context/base/typo-cap.lua
@@ -33,6 +33,9 @@ local getchar = nuts.getchar
local copy_node = nuts.copy
local end_of_math = nuts.end_of_math
+local traverse_nodes = nuts.traverse
+local traverse_id = nuts.traverse_id
+local insert_after = nuts.insert_after
local nodecodes = nodes.nodecodes
local skipcodes = nodes.skipcodes
@@ -72,6 +75,8 @@ local a_cases = attributes.private("case")
local extract = bit32.extract
local run = 0 -- a trick to make neighbouring ranges work
+local blocked = { }
+
local function set(tag,font)
if run == 2^6 then
run = 1
@@ -104,88 +109,40 @@ end
--
-- \WORD {far too \Word{many \WORD{more \word{pushed} in between} useless} words}
-local uccodes = characters.uccodes
-local lccodes = characters.lccodes
+local uccodes = characters.uccodes
+local lccodes = characters.lccodes
+local categories = characters.categories
-- true false true == mixed
-local function helper(start,attr,lastfont,n,codes,special,once,keepother)
+local function replacer(start,codes)
local char = getchar(start)
local dc = codes[char]
if dc then
local fnt = getfont(start)
- if keepother and dc == char then
- local lfa = lastfont[n]
- if lfa then
- setfield(start,"font",lfa)
- return start, true
- else
- return start, false
- end
- else
- if special then
- local lfa = lastfont[n]
- if lfa then
- local previd = getid(getprev(start))
- if previd ~= glyph_code and previd ~= disc_code then
- fnt = lfa
- setfield(start,"font",lfa)
- end
+ local ifc = fontchar[fnt]
+ if type(dc) == "table" then
+ for i=1,#dc do
+ if not ifc[dc[i]] then
+ return start, false
end
end
- local ifc = fontchar[fnt]
- if type(dc) == "table" then
- local ok = true
- for i=1,#dc do
- -- could be cached in font
- if not ifc[dc[i]] then
- ok = false
- break
- end
- end
- if ok then
- -- todo: use generic injector
- local prev = start
- local original = start
- for i=1,#dc do
- local chr = dc[i]
- prev = start
- if i == 1 then
- setfield(start,"char",chr)
- else
- local g = copy_node(original)
- setfield(g,"char",chr)
- local next = getnext(start)
- setfield(g,"prev",start)
- if next then
- setfield(g,"next",next)
- setfield(start,"next",g)
- setfield(next,"prev",g)
- end
- start = g
- end
- end
- if once then
- lastfont[n] = false
- end
- return prev, true
- end
- if once then
- lastfont[n] = false
- end
- return start, false
- elseif ifc[dc] then
- setfield(start,"char",dc)
- if once then
- lastfont[n] = false
+ for i=#dc,1,-1 do
+ local chr = dc[i]
+ if i == 1 then
+ setfield(start,"char",chr)
+ else
+ local g = copy_node(start)
+ setfield(g,"char",chr)
+ insert_after(start,start,g)
end
- return start, true
end
+ return start, true
+ elseif ifc[dc] then
+ setfield(start,"char",dc)
+ return start, true
end
end
- if once then
- lastfont[n] = false
- end
return start, false
end
@@ -206,140 +163,147 @@ end
cases.register = register
-local function WORD(start,attr,lastfont,n)
+local function WORD(start,attr,lastfont,n,count,where,first)
lastfont[n] = false
- return helper(start,attr,lastfont,n,uccodes)
+ return replacer(first or start,uccodes)
end
-local function word(start,attr,lastfont,n)
+local function word(start,attr,lastfont,n,count,where,first)
lastfont[n] = false
- return helper(start,attr,lastfont,n,lccodes)
-end
-
-local function blockrest(start)
- local n = getnext(start)
- while n do
- local id = getid(n)
- if id == glyph_code or id == disc_node and getattr(n,a_cases) == attr then
- setattr(n,a_cases,unsetvalue)
- else
- -- break -- we can have nested mess
- end
- n = getnext(n)
- end
+ return replacer(first or start,lccodes)
end
-local function Word(start,attr,lastfont,n) -- looks quite complex
- lastfont[n] = false
- local prev = getprev(start)
- if prev and getid(prev) == kern_code and getsubtype(prev) == kerning_code then
- prev = getprev(prev)
+local function Words(start,attr,lastfont,n,count,where,first) -- looks quite complex
+ if where == "post" then
+ return
end
- if not prev then
- blockrest(start)
- return helper(start,attr,lastfont,n,uccodes)
- end
- local previd = getid(prev)
- if previd ~= glyph_code and previd ~= disc_code then
- -- only the first character is treated
- blockrest(start)
- -- we could return the last in the range and save some scanning
- -- but why bother
- return helper(start,attr,lastfont,n,uccodes)
+ if count == 1 and where ~= "post" then
+ replacer(first or start,uccodes)
+ return start, true, true
else
- return start, false
+ return start, false, true
end
end
-local function Words(start,attr,lastfont,n)
- lastfont[n] = false
- local prev = getprev(start)
- if prev and getid(prev) == kern_code and getsubtype(prev) == kerning_code then
- prev = getprev(prev)
- end
- if not prev then
- return helper(start,attr,lastfont,n,uccodes)
+local function Word(start,attr,lastfont,n,count,where,first)
+ blocked[attr] = true
+ return Words(start,attr,lastfont,n,count,where,first)
+end
+
+local function camel(start,attr,lastfont,n,count,where,first)
+ local _, done_1 = word(start,attr,lastfont,n,count,where,first)
+ local _, done_2 = Words(start,attr,lastfont,n,count,where,first)
+ return start, done_1 or done_2, true
+end
+
+local function mixed(start,attr,lastfont,n,count,where,first)
+ if where == "post" then
+ return
end
- local previd = getid(prev)
- if previd ~= glyph_code and previd ~= disc_code then
- return helper(start,attr,lastfont,n,uccodes)
+ local used = first or start
+ local char = getchar(first)
+ local dc = uccodes[char]
+ if not dc then
+ return start, false, true
+ elseif dc == char then
+ local lfa = lastfont[n]
+ if lfa then
+ setfield(first,"font",lfa)
+ return start, true, true
+ else
+ return start, false, true
+ end
else
- return start, false
+ replacer(first or start,uccodes)
+ return start, true, true
end
end
-local function capital(start,attr,lastfont,n) -- 3
- return helper(start,attr,lastfont,n,uccodes,true,true)
-end
-
-local function Capital(start,attr,lastfont,n) -- 4
- return helper(start,attr,lastfont,n,uccodes,true,false)
+local function Capital(start,attr,lastfont,n,count,where,first,once) -- 3
+ local used = first or start
+ if count == 1 and where ~= "post" then
+ local lfa = lastfont[n]
+ if lfa then
+ local dc = uccodes[getchar(used)]
+ if dc then
+ setfield(used,"font",lfa)
+ end
+ end
+ end
+ local s, d, c = replacer(first or start,uccodes)
+ if once then
+ lastfont[n] = false -- here
+ end
+ return start, d, c
end
-local function mixed(start,attr,lastfont,n)
- return helper(start,attr,lastfont,n,uccodes,false,false,true)
+local function capital(start,attr,lastfont,n,where,count,first,count) -- 4
+ return Capital(start,attr,lastfont,n,where,count,first,true)
end
-local function none(start,attr,lastfont,n)
- return start, false
+local function none(start,attr,lastfont,n,count,where,first)
+ return start, false, true
end
-local function random(start,attr,lastfont,n)
+local function random(start,attr,lastfont,n,count,where,first)
+ local used = first or start
+ local char = getchar(used)
+ local font = getfont(used)
+ local tfm = fontchar[font]
lastfont[n] = false
- local ch = getchar(start)
- local tfm = fontchar[getfont(start)]
- if lccodes[ch] then
+ local kind = categories[char]
+ if kind == "lu" then
while true do
- local d = chardata[randomnumber(1,0xFFFF)]
- if d then
- local uc = uccodes[d]
- if uc and tfm[uc] then -- this also intercepts tables
- setfield(start,"char",uc)
- return start, true
- end
+ local n = randomnumber(0x41,0x5A)
+ if tfm[n] then -- this also intercepts tables
+ setfield(used,"char",n)
+ return start, true
end
end
- elseif uccodes[ch] then
+ elseif kind == "ll" then
while true do
- local d = chardata[randomnumber(1,0xFFFF)]
- if d then
- local lc = lccodes[d]
- if lc and tfm[lc] then -- this also intercepts tables
- setfield(start,"char",lc)
- return start, true
- end
+ local n = randomnumber(0x61,0x7A)
+ if tfm[n] then -- this also intercepts tables
+ setfield(used,"char",n)
+ return start, true
end
end
end
return start, false
end
-register(variables.WORD, WORD) -- 1
-register(variables.word, word) -- 2
-register(variables.Word, Word) -- 3
-register(variables.Words, Words) -- 4
-register(variables.capital, capital) -- 5
-register(variables.Capital, Capital) -- 6
-register(variables.none, none) -- 7 (dummy)
-register(variables.random, random) -- 8
-register(variables.mixed, mixed) -- 9
+register(variables.WORD, WORD) -- 1
+register(variables.word, word) -- 2
+register(variables.Word, Word) -- 3
+register(variables.Words, Words) -- 4
+register(variables.capital,capital) -- 5
+register(variables.Capital,Capital) -- 6
+register(variables.none, none) -- 7 (dummy)
+register(variables.random, random) -- 8
+register(variables.mixed, mixed) -- 9
+register(variables.camel, camel) -- 10
-register(variables.cap, variables.capital) -- clone
-register(variables.Cap, variables.Capital) -- clone
+register(variables.cap, variables.capital) -- clone
+register(variables.Cap, variables.Capital) -- clone
function cases.handler(head) -- not real fast but also not used on much data
- head = tonut(head)
local lastfont = { }
local lastattr = nil
local done = false
- local start = head
+ local start = tonut(head)
+ local count = 0
+ local previd = nil
+ local prev = nil
while start do -- while because start can jump ahead
local id = getid(start)
if id == glyph_code then
local attr = getattr(start,a_cases)
- if attr and attr > 0 then
+ if attr and attr > 0 and not blocked[attr] then
if attr ~= lastattr then
lastattr = attr
+ count = 1
+ else
+ count = count + 1
end
setattr(start,a_cases,unsetvalue)
local n, id, m = get(attr)
@@ -348,7 +312,7 @@ function cases.handler(head) -- not real fast but also not used on much data
end
local action = actions[n] -- map back to low number
if action then
- start, ok = action(start,attr,lastfont,n)
+ start, ok = action(start,attr,lastfont,n,count)
if ok then
done = true
end
@@ -361,9 +325,10 @@ function cases.handler(head) -- not real fast but also not used on much data
end
elseif id == disc_code then
local attr = getattr(start,a_cases)
- if attr and attr > 0 then
+ if attr and attr > 0 and not blocked[attr] then
if attr ~= lastattr then
lastattr = attr
+ count = 0
end
setattr(start,a_cases,unsetvalue)
local n, id, m = get(attr)
@@ -374,28 +339,73 @@ function cases.handler(head) -- not real fast but also not used on much data
if action then
local replace = getfield(start,"replace")
if replace then
- action(replace,attr,lastfont,n)
+ local cnt = count
+ for g in traverse_id(glyph_code,replace) do
+ cnt = cnt + 1
+ -- setattr(g,a_cases,unsetvalue)
+ local _, _, quit = action(start,attr,lastfont,n,cnt,"replace",g)
+ if quit then break end
+ end
end
local pre = getfield(start,"pre")
if pre then
- action(pre,attr,lastfont,n)
+ local cnt = count
+ for g in traverse_id(glyph_code,pre) do
+ cnt = cnt + 1
+ -- setattr(g,a_cases,unsetvalue)
+ local _, _, quit = action(start,attr,lastfont,n,cnt,"pre",g)
+ if quit then break end
+ end
end
local post = getfield(start,"post")
if post then
- action(post,attr,lastfont,n)
+ local cnt = count
+ for g in traverse_id(glyph_code,post) do
+ cnt = cnt + 1
+ -- setattr(g,a_cases,unsetvalue)
+ local _, _, quit = action(start,attr,lastfont,n,cnt,"post",g)
+ if quit then break end
+ end
end
end
+ count = count + 1
end
elseif id == math_code then
start = end_of_math(start)
+ count = 0
+ elseif prev_id == kern_code and getsubtype(prev) == kerning_code then
+ -- still inside a word ...nomally kerns are added later
+ else
+ count = 0
end
- if start then -- why test
- start = getnext(start)
+ if start then
+ prev = start
+ previd = id
+ start = getnext(start)
end
end
- return tonode(head), done
+ return head, done
end
+-- function cases.handler(head) -- let's assume head doesn't change ... no reason
+-- local done = false
+-- local lastfont = { }
+-- for first, last, size, attr in nuts.words(tonut(head),a_cases) do
+-- local n, id, m = get(attr)
+-- if lastfont[n] == nil then
+-- lastfont[n] = id
+-- end
+-- local action = actions[n]
+-- if action then
+-- local _, ok = action(first,attr,lastfont,n)
+-- if ok then
+-- done = true
+-- end
+-- end
+-- end
+-- return head, done
+-- end
+
local enabled = false
function cases.set(n,id)
@@ -422,4 +432,8 @@ end
-- interface
-commands.setcharactercasing = cases.set
+interfaces.implement {
+ name = "setcharactercasing",
+ actions = cases.set,
+ arguments = { "string", "integer" }
+}
diff --git a/Master/texmf-dist/tex/context/base/typo-cap.mkiv b/Master/texmf-dist/tex/context/base/typo-cap.mkiv
index c4458129f51..2859ba104e1 100644
--- a/Master/texmf-dist/tex/context/base/typo-cap.mkiv
+++ b/Master/texmf-dist/tex/context/base/typo-cap.mkiv
@@ -43,6 +43,7 @@
\definecapitals[\v!WORD] % all lower
\definecapitals[\v!Word] % one upper + font
\definecapitals[\v!Words] % some upper
+\definecapitals[\v!camel] % lowers first
\definecapitals[\v!word][\c!style=] % nothing
%D \macros
@@ -76,7 +77,7 @@
% test \Word{test TEST \TeX} test
\unexpanded\def\setcharactercasing[#1]%
- {\ctxcommand{setcharactercasing("#1",\number\fontid\font)}}
+ {\clf_setcharactercasing{#1}\fontid\font}
% todo: names casings
@@ -84,6 +85,7 @@
\unexpanded\def\word {\groupedcommand{\setcharactercasing[\v!word ]}{}}
\unexpanded\def\Word {\groupedcommand{\setcharactercasing[\v!Word ]}{}}
\unexpanded\def\Words{\groupedcommand{\setcharactercasing[\v!Words]}{}}
+\unexpanded\def\camel{\groupedcommand{\setcharactercasing[\v!camel]}{}}
% This might become:
%
@@ -166,16 +168,13 @@
\def\typo_capitals_set_fake#1%
{\edef\currentcapitals{#1}%
- %\setcharactercasing[\currentcapitals]%
- \ctxcommand{setcharactercasing("\currentcapitals",\number\fontid\font)}%
- \signalcharacter % retain current style
+ \clf_setcharactercasing{\currentcapitals}\fontid\font
\usecapitalsstyleparameter\c!style}
\def\typo_capitals_set_real#1%
{\edef\currentcapitals{#1}%
\sc
- %\setcharactercasing[\currentcapitals]}
- \ctxcommand{setcharactercasing("\currentcapitals",\number\fontid\font)}}
+ \clf_setcharactercasing{\currentcapitals}\fontid\font}
\unexpanded\def\pseudosmallcapped{\groupedcommand{\typo_capitals_set_fake\v!WORD }\donothing} % all upper
\unexpanded\def\pseudoSmallcapped{\groupedcommand{\typo_capitals_set_fake\v!capital}\donothing} % one upper + font
diff --git a/Master/texmf-dist/tex/context/base/typo-chr.lua b/Master/texmf-dist/tex/context/base/typo-chr.lua
new file mode 100644
index 00000000000..94095828ddc
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/typo-chr.lua
@@ -0,0 +1,155 @@
+if not modules then modules = { } end modules ['typo-chr'] = {
+ version = 1.001,
+ comment = "companion to typo-bld.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- local nodecodes = nodes.nodecodes
+-- local whatsitcodes = nodes.whatsitcodes
+-- local glyph_code = nodecodes.glyph
+-- local whatsit_code = nodecodes.whatsit
+-- local user_code = whatsitcodes.userdefined
+--
+-- local stringusernode = nodes.pool.userstring
+--
+-- local nuts = nodes.nuts
+-- local pool = nuts.pool
+--
+-- local tonut = nuts.tonut
+-- local tonode = nuts.tonode
+-- local getid = nuts.getid
+-- local getprev = nuts.getprev
+-- local getsubtype = nuts.getsubtype
+-- local getchar = nuts.getchar
+-- local getfield = nuts.getfield
+--
+-- local remove_node = nuts.remove
+-- local traverse_by_id = nuts.traverse_id
+--
+-- local signal = pool.userids.signal
+--
+-- local is_punctuation = characters.is_punctuation
+--
+-- local actions = {
+-- removepunctuation = function(head,n)
+-- local prev = getprev(n)
+-- if prev then
+-- if getid(prev) == glyph_code then
+-- if is_punctuation[getchar(prev)] then
+-- head = remove_node(head,prev,true)
+-- end
+-- end
+-- end
+-- return head
+-- end
+-- }
+--
+-- -- we can also use properties .. todo (saves pass)
+--
+-- typesetters.signals = { }
+--
+-- function typesetters.signals.handler(head)
+-- local h = tonut(head)
+-- local done = false
+-- for n in traverse_by_id(whatsit_code,h) do
+-- if getsubtype(n) == user_code and getfield(n,"user_id") == signal and getfield(n,"type") == 115 then
+-- local action = actions[getfield(n,"value")]
+-- if action then
+-- h = action(h,n)
+-- end
+-- h = remove_node(h,n,true)
+-- done = true
+-- end
+-- end
+-- if done then
+-- return tonode(h), true
+-- else
+-- return head
+-- end
+-- end
+--
+-- local enabled = false
+--
+-- local function signal(what)
+-- if not enabled then
+-- nodes.tasks.prependaction("processors","normalizers", "typesetters.signals.handler")
+-- enabled = true
+-- end
+-- context(stringusernode(signal,what))
+-- end
+--
+-- interfaces.implement {
+-- name = "signal",
+-- actions = signal,
+-- arguments = "string",
+-- }
+
+local insert, remove = table.insert, table.remove
+
+local nodecodes = nodes.nodecodes
+local glyph_code = nodecodes.glyph
+
+local texnest = tex.nest
+local free_node = node.free
+
+local punctuation = characters.is_punctuation
+
+local stack = { }
+
+local function pickup()
+ local list = texnest[texnest.ptr]
+ if list then
+ local tail = list.tail
+ if tail and tail.id == glyph_code and punctuation[tail.char] then
+ local prev = tail.prev
+ list.tail = prev
+ if prev then
+ prev.next = nil
+ end
+ list.tail = prev
+ tail.prev = nil
+ return tail
+ end
+ end
+end
+
+local actions = {
+ remove = function(specification)
+ local n = pickup()
+ if n then
+ free_node(n)
+ end
+ end,
+ push = function(specification)
+ local n = pickup()
+ if n then
+ insert(stack,n or false)
+ end
+ end,
+ pop = function(specification)
+ local n = remove(stack)
+ if n then
+ context(n)
+ end
+ end,
+}
+
+local function pickuppunctuation(specification)
+ local action = actions[specification.action or "remove"]
+ if action then
+ action(specification)
+ end
+end
+
+interfaces.implement {
+ name = "pickuppunctuation",
+ actions = pickuppunctuation,
+ arguments = {
+ {
+ { "action" }
+ }
+ }
+}
+
diff --git a/Master/texmf-dist/tex/context/base/typo-chr.mkiv b/Master/texmf-dist/tex/context/base/typo-chr.mkiv
new file mode 100644
index 00000000000..9d8dd7c20c8
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/typo-chr.mkiv
@@ -0,0 +1,28 @@
+
+%D \module
+%D [ file=typo-cap,
+%D version=2009.03.27, % code moved from core-spa.mkiv
+%D title=\CONTEXT\ Typesetting Macros,
+%D subtitle=Capping,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Typesetting Macros / Characters}
+
+\unprotect
+
+%D Maybe we need a more clever system: either command or style mode etc. so
+%D that we can avoid the grouped mess in a simple style switch.
+
+\registerctxluafile{typo-chr}{1.001}
+
+\unexpanded\def\removepunctuation{\clf_pickuppunctuation action {remove}\relax}
+\unexpanded\def\pushpunctuation {\clf_pickuppunctuation action {push}\relax}
+\unexpanded\def\poppunctuation {\clf_pickuppunctuation action {pop}\relax}
+
+\protect
diff --git a/Master/texmf-dist/tex/context/base/typo-cln.lua b/Master/texmf-dist/tex/context/base/typo-cln.lua
index 8b1ac78768d..7228e02c543 100644
--- a/Master/texmf-dist/tex/context/base/typo-cln.lua
+++ b/Master/texmf-dist/tex/context/base/typo-cln.lua
@@ -101,4 +101,8 @@ end
-- interface
-commands.setcharactercleaning = cleaners.set
+interfaces.implement {
+ name = "setcharactercleaning",
+ actions = cleaners.set,
+ arguments = "string"
+}
diff --git a/Master/texmf-dist/tex/context/base/typo-cln.mkiv b/Master/texmf-dist/tex/context/base/typo-cln.mkiv
index 5306f614f27..193198dc556 100644
--- a/Master/texmf-dist/tex/context/base/typo-cln.mkiv
+++ b/Master/texmf-dist/tex/context/base/typo-cln.mkiv
@@ -24,7 +24,7 @@
%D 1: Autocap first character of a line
\unexpanded\def\setcharactercleaning[#1]% This name might change!
- {\ctxcommand{setcharactercleaning("#1")}} % also accepts "reset"
+ {\clf_setcharactercleaning{#1}} % also accepts "reset"
% \appendtoks
% \attribute\cleanerattribute\attributeunsetvalue
diff --git a/Master/texmf-dist/tex/context/base/typo-del.mkiv b/Master/texmf-dist/tex/context/base/typo-del.mkiv
index 603471f752c..4c3c5ab3da0 100644
--- a/Master/texmf-dist/tex/context/base/typo-del.mkiv
+++ b/Master/texmf-dist/tex/context/base/typo-del.mkiv
@@ -70,23 +70,23 @@
{\ifcase\boundarycharactermode
\or
%\nobreak
- \hskip\hspaceamount\currentlanguage{#2}%
- \languageparameter#1%
+ \hskip\hspaceamount\currentusedlanguage{#2}%
+ \usedlanguageparameter#1%
%\nobreak
- \hskip\hspaceamount\currentlanguage{#2}%
+ \hskip\hspaceamount\currentusedlanguage{#2}%
\or
- \languageparameter#1%
+ \usedlanguageparameter#1%
\fi
\boundarycharactermode\plusone}
\unexpanded\def\leftboundarycharacter#1#2%
{\ifcase\boundarycharactermode
\or
- \languageparameter#1%
+ \usedlanguageparameter#1%
\nobreak
- \hskip\hspaceamount\currentlanguage{#2}%
+ \hskip\hspaceamount\currentusedlanguage{#2}%
\or
- \languageparameter#1%
+ \usedlanguageparameter#1%
\fi
\boundarycharactermode\plusone}
@@ -94,10 +94,10 @@
{\ifcase\boundarycharactermode
\or
\prewordbreak %\nobreak
- \hskip\hspaceamount\currentlanguage{#2}%
- \languageparameter#1%
+ \hskip\hspaceamount\currentusedlanguage{#2}%
+ \usedlanguageparameter#1%
\or
- \languageparameter#1%
+ \usedlanguageparameter#1%
\fi
\boundarycharactermode\plusone}
@@ -142,13 +142,13 @@
{\beforesubsentence
\ifdim\lastkern=\d_typo_subsentence_signal
\unskip
- \kern\hspaceamount\currentlanguage{intersentence}%
+ \kern\hspaceamount\currentusedlanguage{intersentence}%
\fi
\global\advance\c_typo_subsentence_nesting\plusone
\ifnum\c_typo_subsentence_nesting=\plusone
\dontleavehmode % was \leaveoutervmode
\fi
- \dostarttagged\t!subsentence\empty
+ \dostarttagged\t!subsentence\empty % no chain
\symbol[\ifodd\c_typo_subsentence_nesting\c!leftsentence\else\c!leftsubsentence\fi]%
}% \ignorespaces}
@@ -166,7 +166,7 @@
\unexpanded\def\endofsubsentencespacing
{\ifdim\lastkern=\d_typo_subsentence_signal
\unskip
- \hskip\hspaceamount\currentlanguage{intersentence}%
+ \hskip\hspaceamount\currentusedlanguage{intersentence}%
% no good, actually language dependent:
% \ignorespaces
\else
@@ -193,8 +193,8 @@
%definehspace [quote] [\zeropoint]
%definehspace [speech] [\zeropoint]
-\definehspace [quote] [\hspaceamount\currentlanguage{quotation}]
-\definehspace [speech] [\hspaceamount\currentlanguage{quotation}]
+\definehspace [quote] [\hspaceamount\currentusedlanguage{quotation}]
+\definehspace [speech] [\hspaceamount\currentusedlanguage{quotation}]
\definesymbol
[\c!leftquotation]
@@ -205,6 +205,14 @@
[\rightboundarycharacter\c!rightquotation{quotation}]
\definesymbol
+ [\c!nextleftquotation]
+ [\rightboundarycharacter\c!leftquotation{quotation}]
+
+\definesymbol
+ [\c!nextrightquotation]
+ [\leftboundarycharacter\c!rightquotation{quotation}]
+
+\definesymbol
[\c!leftquote]
[\leftboundarycharacter\c!leftquote{quote}]
@@ -248,6 +256,7 @@
\def\typo_delimited_push#1%
{\globalpushmacro\currentdelimitedtext
\def\currentdelimitedtext{#1}%
+ \setlanguageparameter\delimitedtextparameter
\let\currentparentdelimitedtext\currentdelimitedtext
\global\advance\c_typo_delimited_nesting\plusone
\edef\delimitedtextlevel{\number\c_typo_delimited_nesting}%
@@ -297,9 +306,9 @@
\unexpanded\def\startdelimitedtext[#1]%
{\begingroup
\typo_delimited_push{#1}%
- \dostarttagged\t!delimitedblock\currentdelimitedtext
- \edef\p_method{\delimitedtextparameter\c!method}%
- \ifx\p_method\s!font
+ \dostarttaggedchained\t!delimitedblock\currentdelimitedtext\??delimitedtext
+ \edef\p_delimited_method{\delimitedtextparameter\c!method}%
+ \ifx\p_delimited_method\s!font
\expandafter\typo_delimited_start_font
\else
\expandafter\typo_delimited_start_other
@@ -313,16 +322,16 @@
\ignorespaces}
\def\typo_delimited_start_other
- {\edef\p_repeat{\delimitedtextparameter\c!repeat}%
- \ifx\p_repeat\v!yes
+ {\edef\p_delimited_repeat{\delimitedtextparameter\c!repeat}%
+ \ifx\p_delimited_repeat\v!yes
\let\typo_delimited_repeat\typo_delimited_repeat_ideed
\else
\let\typo_delimited_repeat\relax
\fi
- \edef\p_location{\delimitedtextparameter\c!location}%
- \ifx\p_location\v!paragraph
+ \edef\p_delimited_location{\delimitedtextparameter\c!location}%
+ \ifx\p_delimited_location\v!paragraph
\singleexpandafter\typo_delimited_start_par
- \else\ifx\p_location\v!margin
+ \else\ifx\p_delimited_location\v!margin
\doubleexpandafter\typo_delimited_start_par
\else
\doubleexpandafter\typo_delimited_start_txt
@@ -338,8 +347,10 @@
\def\typo_delimited_start_par_indeed[#1]%
{\let\typo_delimited_stop\typo_delimited_stop_par
- \doifsomething{\delimitedtextparameter\c!spacebefore}
- {\blank[\delimitedtextparameter\c!spacebefore]}%
+ \edef\p_delimited_spacebefore{\delimitedtextparameter\c!spacebefore}%
+ \ifx\p_delimited_spacebefore\empty \else
+ \blank[\p_delimited_spacebefore]%
+ \fi
\delimitedtextparameter\c!before
\edef\m_typo_delimited_narrower{#1}%
\ifx\m_typo_delimited_narrower\empty
@@ -353,11 +364,21 @@
\fi
% so far
\pushmacro\checkindentation
- \doifsomething{\delimitedtextparameter\c!indenting} % WS
- {\setupindenting[\delimitedtextparameter\c!indenting]}%
+ \useindentingparameter\delimitedtextparameter
+ %
\begingroup
\usedelimitedtextstyleandcolor\c!style\c!color
+ %
+ \edef\p_delimited_left {\delimitedtextparameter{\c!left}}%
+ \edef\p_delimited_right {\delimitedtextparameter{\c!right}}%
+ \edef\p_delimited_nextleft {\delimitedtextparameter{\c!nextleft}}%
+ \edef\p_delimited_nextright{\delimitedtextparameter{\c!nextright}}%
+ %
\leftdelimitedtextmark
+ %
+ \setnextleftdelimitedtextmark
+ \setnextrightdelimitedtextmark
+ %
\ignorespaces}
\def\typo_delimited_stop_par
@@ -368,10 +389,12 @@
\popmacro\checkindentation
\typo_delimited_stop_par_indeed
\delimitedtextparameter\c!after
- \doifsomething{\delimitedtextparameter\c!spaceafter}
- {\blank[\delimitedtextparameter\c!spaceafter]}%
+ \edef\p_delimited_spaceafter{\delimitedtextparameter\c!spaceafter}%
+ \ifx\p_delimited_spaceafter\empty \else
+ \blank[\p_delimited_spaceafter]%
+ \fi
\useindentnextparameter\delimitedtextparameter
- \dorechecknextindentation}% AM: This was missing!
+ \aftergroup\dorechecknextindentation}% AM: This was missing!
\def\typo_delimited_start_txt
{\let\typo_delimited_stop\typo_delimited_stop_txt
@@ -394,18 +417,18 @@
\unexpanded\def\delimitedtext[#1]%
{\dontleavehmode % following ones can be omited
\typo_delimited_push{#1}%
- \edef\p_method{\delimitedtextparameter\c!method}%
- \ifx\p_method\s!font
+ \edef\p_delimited_method{\delimitedtextparameter\c!method}%
+ \ifx\p_delimited_method\s!font
\expandafter\typo_delimited_fontdriven
\else
\expandafter\typo_delimited_other
\fi}
\def\typo_delimited_other
- {\edef\p_location{\delimitedtextparameter\c!location}%
- \ifx\p_location\v!paragraph
+ {\edef\p_delimited_location{\delimitedtextparameter\c!location}%
+ \ifx\p_delimited_location\v!paragraph
\singleexpandafter\typo_delimited_par
- \else\ifx\p_location\v!margin
+ \else\ifx\p_delimited_location\v!margin
\doubleexpandafter\typo_delimited_par
\else
\doubleexpandafter\typo_delimited_txt
@@ -417,16 +440,89 @@
\unexpanded\def\stopdelimited {\stopdelimitedtext} % no let, dynamically assigned
\def\delimited {\delimitedtext}
+% todo: \dostarttagged\t!nothing\empty % for left/right boxes
+
+%D We have 4 different location and symbol handlers (two pairs):
+%D
+%D \starttyping
+%D \input tufte \startquotation \input tufte \stopquotation
+%D
+%D \setupdelimitedtext
+%D [quotation]
+%D [nextleft=right,
+%D nextright=left]
+%D
+%D \input tufte \startquotation \input tufte \stopquotation
+%D
+%D \setupdelimitedtext
+%D [quotation]
+%D [nextleft={\symbol[nextleftquotation]},
+%D nextright={\symbol[nextrightquotation]}]
+%D
+%D \input tufte \startquotation \input tufte \stopquotation
+%D \stoptyping
+
+\unexpanded\def\setnextleftdelimitedtextmark
+ {\ifx\p_delimited_nextleft\empty
+ % nothing
+ \else\ifx\p_delimited_nextleft\v!left
+ \typo_delimited_nextleft_symbol\p_delimited_left
+ \else\ifx\p_delimited_nextleft\v!right
+ \typo_delimited_nextleft_symbol\p_delimited_right
+ \else
+ \typo_delimited_nextleft_symbol\p_delimited_nextleft
+ \fi\fi\fi}
+
+\unexpanded\def\setnextrightdelimitedtextmark
+ {\ifx\p_delimited_nextright\empty
+ % nothing
+ \else\ifx\p_delimited_nextright\v!right
+ \typo_delimited_nextright_symbol\p_delimited_right
+ \else\ifx\p_delimited_nextright\v!left
+ \typo_delimited_nextright_symbol\p_delimited_left
+ \else
+ \typo_delimited_nextright_symbol\p_delimited_nextright
+ \fi\fi\fi}
+
\unexpanded\def\leftdelimitedtextmark
- {\doifsomething{\delimitedtextparameter\c!left}
- {\setbox\scratchbox\hbox{\delimitedtextparameter\c!left}%
- \dontleavehmode
- \doif{\delimitedtextparameter\c!location}\v!margin{\hskip-\wd\scratchbox}%
- \box\scratchbox}}
+ {\ifx\p_delimited_left\empty
+ % nothing
+ \else
+ \typo_delimited_left_symbol\p_delimited_left
+ \fi}
\unexpanded\def\rightdelimitedtextmark
- {\doifsomething{\delimitedtextparameter\c!right}
- {\hsmash{\delimitedtextparameter\c!right}}}
+ {\ifx\p_delimited_right\empty
+ % nothing
+ \else
+ \typo_delimited_right_symbol\p_delimited_right
+ \fi}
+
+\def\typo_delimited_left_symbol#1%
+ {\setbox\scratchbox\hbox{\usedelimitedtextstyleandcolor\c!symstyle\c!symcolor#1}%
+ \dontleavehmode
+ \edef\p_delimited_margin{\delimitedtextparameter\c!location}%
+ \ifx\p_delimited_margin\v!margin
+ \hskip-\wd\scratchbox
+ \fi
+ \box\scratchbox}
+
+\def\typo_delimited_right_symbol#1%
+ {\hsmash{\usedelimitedtextstyleandcolor\c!symstyle\c!symcolor#1}}
+
+\def\typo_delimited_nextleft_symbol#1%
+ {\localleftbox\bgroup
+ \swapmacros\leftboundarycharacter\rightboundarycharacter
+ \boundarycharactermode\plusone
+ \typo_delimited_left_symbol#1%
+ \egroup}
+
+\def\typo_delimited_nextright_symbol#1%
+ {\localrightbox\bgroup
+ \swapmacros\leftboundarycharacter\rightboundarycharacter
+ \boundarycharactermode\plusone
+ \typo_delimited_right_symbol#1%
+ \egroup}
% \starttext
% \hyphenatedword{groepsvrijstellingsverordeningen}\par
@@ -443,11 +539,12 @@
\def\typo_delimited_handle_middle#1%
{\begingroup
+ \usedelimitedtextstyleandcolor\c!symstyle\c!symcolor
\setbox\scratchbox\hbox{\delimitedtextparameter#1}%
\ifdim\wd\scratchbox>\zeropoint
\ifdim\lastkern=\d_typo_delimited_signal
\unkern
- \hskip\hspaceamount\currentlanguage{interquotation}%
+ \hskip\hspaceamount\currentusedlanguage{interquotation}%
\fi
\ifhmode % else funny pagebeaks
\penalty\plustenthousand
@@ -462,14 +559,15 @@
\def\typo_delimited_handle_left#1%
{\begingroup
+ \usedelimitedtextstyleandcolor\c!symstyle\c!symcolor
\setbox\scratchbox\hbox{\delimitedtextparameter#1}%
\ifdim\wd\scratchbox>\zeropoint
\ifdim\lastkern=\d_typo_delimited_signal
\unkern
- \hskip\hspaceamount\currentlanguage{interquotation}%
+ \hskip\hspaceamount\currentusedlanguage{interquotation}%
\else\ifdim\lastskip=\d_typo_delimited_signal
\unskip
- \hskip\hspaceamount\currentlanguage{interquotation}%
+ \hskip\hspaceamount\currentusedlanguage{interquotation}%
\fi\fi
\strut % new, needed below
\ifhmode % else funny pagebeaks
@@ -485,16 +583,17 @@
\def\typo_delimited_handle_right#1%
{\begingroup
+ \usedelimitedtextstyleandcolor\c!symstyle\c!symcolor
\setbox\scratchbox\hbox{\delimitedtextparameter#1}%
\ifdim\wd\scratchbox>\zeropoint
\ifdim\lastkern=\d_typo_delimited_signal
\unkern
\penalty\plustenthousand
- \hskip\hspaceamount\currentlanguage{interquotation}%
+ \hskip\hspaceamount\currentusedlanguage{interquotation}%
\else\ifdim\lastskip=\d_typo_delimited_signal
\unskip
\penalty\plustenthousand
- \hskip\hspaceamount\currentlanguage{interquotation}%
+ \hskip\hspaceamount\currentusedlanguage{interquotation}%
\fi\fi
\ifhmode % else funny pagebeaks
\penalty\plustenthousand
@@ -508,21 +607,57 @@
\unexpanded\def\typo_delimited_par
{\groupedcommand
- {\dostarttagged\t!delimited\currentdelimitedtext % block?
+ {\dostarttaggedchained\t!delimited\currentdelimitedtext\??delimitedtext % block?
\typo_delimited_handle_left\c!left}
{\typo_delimited_handle_right\c!right
\removelastskip
\dostoptagged
\typo_delimited_pop}}
+% \unexpanded\def\typo_delimited_txt
+% {\doifelse{\delimitedtextparameter\c!style}\v!normal
+% \typo_delimited_quoted
+% \typo_delimited_attributed}
+%
+% \def\typo_delimited_quoted_b
+% {\dostarttaggedchained\t!delimited\currentdelimitedtext\??delimitedtext
+% \typo_delimited_handle_left\c!left}
+%
+% \def\typo_delimited_quoted_e
+% {\typo_delimited_handle_right\c!right
+% \removelastskip
+% \dostoptagged
+% \typo_delimited_pop}
+%
+% \def\typo_delimited_attributed_b
+% {\dostarttaggedchained\t!delimited\currentdelimitedtext\??delimitedtext
+% \usedelimitedtextstyleandcolor\c!style\c!color}
+%
+% \def\typo_delimited_attributed_e
+% {\dostoptagged
+% \typo_delimited_pop}
+%
+% \def\typo_delimited_fontdriven_b
+% {\dostarttaggedchained\t!delimited\currentdelimitedtext\??delimitedtext
+% \languageparameter{\c!left\currentparentdelimitedtext}}% was: \currentdelimitedtext
+%
+% \def\typo_delimited_fontdriven_e
+% {\languageparameter{\c!right\currentparentdelimitedtext}% was: \currentdelimitedtext
+% \dostoptagged
+% \typo_delimited_pop}
+
\unexpanded\def\typo_delimited_txt
- {\doifelse{\delimitedtextparameter\c!style}\v!normal
- \typo_delimited_quoted
- \typo_delimited_attributed}
+ {\edef\p_left_right{\delimitedtextparameter\c!left\delimitedtextparameter\c!right}%
+ \ifx\p_left_right\empty
+ \expandafter\typo_delimited_attributed
+ \else
+ \expandafter\typo_delimited_quoted
+ \fi}
\def\typo_delimited_quoted_b
- {\dostarttagged\t!delimited\currentdelimitedtext
- \typo_delimited_handle_left\c!left}
+ {\dostarttaggedchained\t!delimited\currentdelimitedtext\??delimitedtext
+ \typo_delimited_handle_left\c!left
+ \usedelimitedtextstyleandcolor\c!style\c!color}
\def\typo_delimited_quoted_e
{\typo_delimited_handle_right\c!right
@@ -531,7 +666,7 @@
\typo_delimited_pop}
\def\typo_delimited_attributed_b
- {\dostarttagged\t!delimited\currentdelimitedtext
+ {\dostarttaggedchained\t!delimited\currentdelimitedtext\??delimitedtext
\usedelimitedtextstyleandcolor\c!style\c!color}
\def\typo_delimited_attributed_e
@@ -539,11 +674,12 @@
\typo_delimited_pop}
\def\typo_delimited_fontdriven_b
- {\dostarttagged\t!delimited\currentdelimitedtext
- \languageparameter{\c!left\currentparentdelimitedtext}}% was: \currentdelimitedtext
+ {\dostarttaggedchained\t!delimited\currentdelimitedtext\??delimitedtext
+ \usedlanguageparameter{\c!left\currentparentdelimitedtext}% was: \currentdelimitedtext
+ \usedelimitedtextstyleandcolor\c!style\c!color}
\def\typo_delimited_fontdriven_e
- {\languageparameter{\c!right\currentparentdelimitedtext}% was: \currentdelimitedtext
+ {\usedlanguageparameter{\c!right\currentparentdelimitedtext}% was: \currentdelimitedtext
\dostoptagged
\typo_delimited_pop}
diff --git a/Master/texmf-dist/tex/context/base/typo-dha.lua b/Master/texmf-dist/tex/context/base/typo-dha.lua
index 3410c2dfca0..904b774ec30 100644
--- a/Master/texmf-dist/tex/context/base/typo-dha.lua
+++ b/Master/texmf-dist/tex/context/base/typo-dha.lua
@@ -64,7 +64,6 @@ local getlist = nuts.getlist
local getfield = nuts.getfield
local setfield = nuts.setfield
local getattr = nuts.getattr
-local setattr = nuts.setattr
local getprop = nuts.getprop
local setprop = nuts.setprop
@@ -185,9 +184,9 @@ local function process(start)
finidir = finish
end
if embedded <= 0 then
- finish, autodir, done = "TRT", -1
+ finish, autodir = "TRT", -1
else
- finish, autodir, done = "TLT", 1
+ finish, autodir = "TLT", 1
end
done = true
if finidir == finish then
@@ -347,7 +346,7 @@ local function process(start)
top = top - 1
end
obsolete[#obsolete+1] = current
- else
+ elseif trace_directions then
setcolor(current)
end
else
diff --git a/Master/texmf-dist/tex/context/base/typo-dig.lua b/Master/texmf-dist/tex/context/base/typo-dig.lua
index 67849c6d47b..c753a03520a 100644
--- a/Master/texmf-dist/tex/context/base/typo-dig.lua
+++ b/Master/texmf-dist/tex/context/base/typo-dig.lua
@@ -103,15 +103,14 @@ end
actions[1] = function(head,start,attr)
local font = getfont(start)
local char = getchar(start)
- local unic = chardata[font][char].tounicode
- local what = unic and tonumber(unic,16) or char
- if charbase[what].category == "nd" then
+ local unic = chardata[font][char].unicode or char
+ if charbase[unic].category == "nd" then -- ignore unic tables
local oldwidth = getfield(start,"width")
local newwidth = getdigitwidth(font)
if newwidth ~= oldwidth then
if trace_digits then
report_digits("digit trigger %a, instance %a, char %C, unicode %U, delta %s",
- attr%100,div(attr,100),char,what,newwidth-oldwidth)
+ attr%100,div(attr,100),char,unic,newwidth-oldwidth)
end
head, start = nodes.aligned(head,start,start,newwidth,"middle")
return head, start, true
@@ -174,4 +173,8 @@ end
-- interface
-commands.setdigitsmanipulation = digits.set
+interfaces.implement {
+ name = "setdigitsmanipulation",
+ actions = digits.set,
+ arguments = "string"
+}
diff --git a/Master/texmf-dist/tex/context/base/typo-dig.mkiv b/Master/texmf-dist/tex/context/base/typo-dig.mkiv
index 71425c594a5..aa610b3c943 100644
--- a/Master/texmf-dist/tex/context/base/typo-dig.mkiv
+++ b/Master/texmf-dist/tex/context/base/typo-dig.mkiv
@@ -39,7 +39,7 @@
%D \stoplines
\unexpanded\def\setdigitsmanipulation[#1]%
- {\ctxcommand{setdigitsmanipulation("#1")}}
+ {\clf_setdigitsmanipulation{#1}}
\unexpanded\def\resetdigitsmanipulation
{\attribute\digitsattribute\attributeunsetvalue}
diff --git a/Master/texmf-dist/tex/context/base/typo-dir.lua b/Master/texmf-dist/tex/context/base/typo-dir.lua
index e7d3c686c4f..482b7114d63 100644
--- a/Master/texmf-dist/tex/context/base/typo-dir.lua
+++ b/Master/texmf-dist/tex/context/base/typo-dir.lua
@@ -50,6 +50,8 @@ local tracers = nodes.tracers
local setcolor = tracers.colors.set
local resetcolor = tracers.colors.reset
+local implement = interfaces.implement
+
local directions = typesetters.directions or { }
typesetters.directions = directions
@@ -137,9 +139,17 @@ function directions.setcolor(current,direction,reversed,mirror)
end
end
-function commands.getbidimode(specification)
- context(tomode(specification)) -- hash at tex end
-end
+implement {
+ name = "getbidimode",
+ actions = { tomode, context },
+ arguments = {
+ {
+ { "scope" },
+ { "method" },
+ { "fences" },
+ }
+ }
+}
local enabled = false
@@ -190,4 +200,8 @@ function directions.set(n) -- todo: names and numbers
texsetattribute(a_directions,n)
end
-commands.setdirection = directions.set
+implement {
+ name = "setdirection",
+ arguments = "integer",
+ actions = directions.set
+}
diff --git a/Master/texmf-dist/tex/context/base/typo-dir.mkiv b/Master/texmf-dist/tex/context/base/typo-dir.mkiv
index 0362af56cb0..f9b4ecb976c 100644
--- a/Master/texmf-dist/tex/context/base/typo-dir.mkiv
+++ b/Master/texmf-dist/tex/context/base/typo-dir.mkiv
@@ -13,6 +13,9 @@
\writestatus{loading}{ConTeXt Typesetting Macros / Directions}
+%D At some point we might default to method 'two' but first I need to make it more
+%D efficient (and provide some options). I also want to have some basic tracing.
+
\unprotect
\registerctxluafile{typo-dir}{1.001}
@@ -33,10 +36,14 @@
\edef\righttoleftmark{\normalUchar"200F} \let\rlm\righttoleftmark
\unexpanded\def\setdirection[#1]% todo: symbolic names
- {\ctxcommand{setdirection(\number#1)}}
+ {\clf_setdirection#1\relax}
+
+% \unexpanded\def\resetdirection
+% {\clf_setdirection\zerocount}
+%
+% is in fact:
\unexpanded\def\resetdirection
- %{\ctxcommand{setdirection(0)}}
{\attribute\directionsattribute\attributeunsetvalue}
\newconstant\directionsbidimode % this one might become pivate
@@ -46,12 +53,14 @@
% \setupdirections[bidi=global,method=two]
% \setupdirections[bidi=global,method=two,fences=no]
+% maybee use chardefs
+
\def\typo_dir_get_mode
- {\def\currentbidimode{\ctxcommand{getbidimode {
- scope = "\directionsparameter\c!bidi ",
- method = "\directionsparameter\c!method",
- fences = "\directionsparameter\c!fences",
- }}}%
+ {\def\currentbidimode{\clf_getbidimode
+ scope {\directionsparameter\c!bidi}%
+ method {\directionsparameter\c!method}%
+ fences {\directionsparameter\c!fences}%
+ }%
\expandafter\glet\csname\??directionsbidimode\currentbidistamp\endcsname\currentbidimode}
\appendtoks
diff --git a/Master/texmf-dist/tex/context/base/typo-drp.lua b/Master/texmf-dist/tex/context/base/typo-drp.lua
index 9151100b6f9..4bbf0b8e989 100644
--- a/Master/texmf-dist/tex/context/base/typo-drp.lua
+++ b/Master/texmf-dist/tex/context/base/typo-drp.lua
@@ -91,7 +91,27 @@ function initials.set(specification)
texsetattribute(a_initial,1)
end
-commands.setinitial = initials.set
+interfaces.implement {
+ name = "setinitial",
+ actions = initials.set,
+ arguments = {
+ {
+ { "location" },
+ { "enabled", "boolean" },
+ { "method" },
+ { "distance" ,"dimen" },
+ { "hoffset" ,"dimen" },
+ { "voffset" ,"dimen" },
+ { "font", "integer" },
+ { "dynamic", "integer" },
+ { "ca", "integer" },
+ { "ma", "integer" },
+ { "ta", "integer" },
+ { "n", "integer" },
+ { "m", "integer" },
+ }
+ }
+}
-- dropped caps experiment (will be done properly when luatex
-- stores the state in the local par node) .. btw, search still
@@ -324,6 +344,15 @@ actions[v_default] = function(head,setting)
if dynamic > 0 then
setattr(current,0,dynamic)
end
+-- apply font
+
+-- local g = nodes.copy(tonode(current))
+-- g.subtype = 0
+-- nodes.handlers.characters(g)
+-- nodes.handlers.protectglyphs(g)
+-- setfield(current,"char",g.char)
+-- nodes.free(g)
+
-- can be a helper
if ca and ca > 0 then
setattr(current,a_colorspace,ma == 0 and 1 or ma)
diff --git a/Master/texmf-dist/tex/context/base/typo-drp.mkiv b/Master/texmf-dist/tex/context/base/typo-drp.mkiv
index 3ac47466f7a..2520c3bfdef 100644
--- a/Master/texmf-dist/tex/context/base/typo-drp.mkiv
+++ b/Master/texmf-dist/tex/context/base/typo-drp.mkiv
@@ -99,21 +99,21 @@
{\useinitialstyleparameter\c!style}%
\useinitialcolorparameter\c!color
\edef\p_text{\initialparameter\c!text}% optional
- \ctxcommand{setinitial{
- location = "\initialparameter\c!location",
- enabled = true,
- n = \number\scratchcounter,
- m = \number\initialparameter\c!m,
- method = "\initialparameter\c!method",
- distance = \number\scratchdistance,
- hoffset = \number\scratchhoffset,
- voffset = \number\scratchvoffset,
- ma = \the\attribute\colormodelattribute,
- ca = \the\attribute\colorattribute,
- ta = \the\attribute\transparencyattribute,
- font = \fontid\font,
- dynamic = \number\attribute\zerocount, % it's a bit over the top to support this here
- }}%
+ \clf_setinitial
+ location {\initialparameter\c!location}%
+ enabled true\space
+ n \scratchcounter
+ m \numexpr\initialparameter\c!m\relax
+ method {\initialparameter\c!method}%
+ distance \scratchdistance
+ hoffset \scratchhoffset
+ voffset \scratchvoffset
+ ma \attribute\colormodelattribute
+ ca \attribute\colorattribute
+ ta \attribute\transparencyattribute
+ font \fontid\font
+ dynamic \attribute\zerocount % it's a bit over the top to support this here
+ \relax
\stopluacode
\kern\zeropoint % we need a node
\p_text
diff --git a/Master/texmf-dist/tex/context/base/typo-dua.lua b/Master/texmf-dist/tex/context/base/typo-dua.lua
index 73b00f033fd..1e9b325a623 100644
--- a/Master/texmf-dist/tex/context/base/typo-dua.lua
+++ b/Master/texmf-dist/tex/context/base/typo-dua.lua
@@ -710,7 +710,7 @@ local function apply_to_list(list,size,head,pardir)
if enddir and getsubtype(current) == parfillskip_code then
-- insert the last enddir before \parfillskip glue
local d = new_textdir(enddir)
--- setfield(d,"attr",copy_node(getfield(current,"attr")))
+ -- setfield(d,"attr",getfield(current,"attr"))
head = insert_node_before(head,current,d)
enddir = false
done = true
@@ -719,7 +719,7 @@ local function apply_to_list(list,size,head,pardir)
if begindir and getsubtype(current) == localpar_code then
-- local_par should always be the 1st node
local d = new_textdir(begindir)
--- setfield(d,"attr",copy_node(getfield(current,"attr")))
+ -- setfield(d,"attr",getfield(current,"attr"))
head, current = insert_node_after(head,current,d)
begindir = nil
done = true
@@ -727,7 +727,7 @@ local function apply_to_list(list,size,head,pardir)
end
if begindir then
local d = new_textdir(begindir)
--- setfield(d,"attr",copy_node(getfield(current,"attr")))
+ -- setfield(d,"attr",getfield(current,"attr"))
head = insert_node_before(head,current,d)
done = true
end
@@ -739,7 +739,7 @@ local function apply_to_list(list,size,head,pardir)
end
if enddir then
local d = new_textdir(enddir)
--- setfield(d,"attr",copy_node(getfield(current,"attr")))
+ -- setfield(d,"attr",getfield(current,"attr"))
head, current = insert_node_after(head,current,d)
done = true
end
diff --git a/Master/texmf-dist/tex/context/base/typo-dub.lua b/Master/texmf-dist/tex/context/base/typo-dub.lua
index b6581137b80..a1c9de75245 100644
--- a/Master/texmf-dist/tex/context/base/typo-dub.lua
+++ b/Master/texmf-dist/tex/context/base/typo-dub.lua
@@ -65,7 +65,6 @@ local getid = nuts.getid
local getsubtype = nuts.getsubtype
local getlist = nuts.getlist
local getattr = nuts.getattr
-local setattr = nuts.setattr
local getfield = nuts.getfield
local setfield = nuts.setfield
@@ -147,7 +146,7 @@ local report_directions = logs.reporter("typesetting","directions two")
--
-- l : left to right
-- r : right to left
--- al : right to legt arabic (esp punctuation issues)
+-- al : right to left arabic (esp punctuation issues)
-- explicit: (new)
--
@@ -327,7 +326,7 @@ end
-- ש ( ל ( א ) כ ) 2-8,4-6
-- ש ( ל [ א ] כ ) 2-8,4-6
-function resolve_fences(list,size,start,limit)
+local function resolve_fences(list,size,start,limit)
-- N0: funny effects, not always better, so it's an options
local stack = { }
local top = 0
@@ -820,7 +819,7 @@ local function apply_to_list(list,size,head,pardir)
if enddir and getsubtype(current) == parfillskip_code then
-- insert the last enddir before \parfillskip glue
local d = new_textdir(enddir)
--- setfield(d,"attr",copy_node(getfield(current,"attr")))
+ -- setfield(d,"attr",getfield(current,"attr"))
head = insert_node_before(head,current,d)
enddir = false
done = true
@@ -829,7 +828,7 @@ local function apply_to_list(list,size,head,pardir)
if begindir and getsubtype(current) == localpar_code then
-- local_par should always be the 1st node
local d = new_textdir(begindir)
--- setfield(d,"attr",copy_node(getfield(current,"attr")))
+ -- setfield(d,"attr",getfield(current,"attr"))
head, current = insert_node_after(head,current,d)
begindir = nil
done = true
@@ -837,7 +836,7 @@ local function apply_to_list(list,size,head,pardir)
end
if begindir then
local d = new_textdir(begindir)
--- setfield(d,"attr",copy_node(getfield(current,"attr")))
+ -- setfield(d,"attr",getfield(current,"attr"))
head = insert_node_before(head,current,d)
done = true
end
@@ -849,7 +848,7 @@ local function apply_to_list(list,size,head,pardir)
end
if enddir then
local d = new_textdir(enddir)
--- setfield(d,"attr",copy_node(getfield(current,"attr")))
+ -- setfield(d,"attr",getfield(current,"attr"))
head, current = insert_node_after(head,current,d)
done = true
end
diff --git a/Master/texmf-dist/tex/context/base/typo-fln.lua b/Master/texmf-dist/tex/context/base/typo-fln.lua
index 884a4c829f1..2076a7464ff 100644
--- a/Master/texmf-dist/tex/context/base/typo-fln.lua
+++ b/Master/texmf-dist/tex/context/base/typo-fln.lua
@@ -23,6 +23,9 @@ local firstlines = typesetters.firstlines
local nodes = nodes
local tasks = nodes.tasks
+local context = context
+local implement = interfaces.implement
+
local nuts = nodes.nuts
local tonut = nuts.tonut
local tonode = nuts.tonode
@@ -85,7 +88,21 @@ function firstlines.set(specification)
texsetattribute(a_firstline,1)
end
-commands.setfirstline = firstlines.set
+implement {
+ name = "setfirstline",
+ actions = firstlines.set,
+ arguments = {
+ {
+ { "alternative" },
+ { "font", "integer" },
+ { "dynamic", "integer" },
+ { "ma", "integer" },
+ { "ca", "integer" },
+ { "ta", "integer" },
+ { "n", "integer" },
+ }
+ }
+}
actions[v_line] = function(head,setting)
-- local attribute = fonts.specifiers.contextnumber(setting.feature) -- was experimental
@@ -262,7 +279,7 @@ end
-- goodie
-function commands.applytofirstcharacter(box,what)
+local function applytofirstcharacter(box,what)
local tbox = getbox(box) -- assumes hlist
local list = getlist(tbox)
local done = nil
@@ -283,3 +300,9 @@ function commands.applytofirstcharacter(box,what)
end
end
end
+
+implement {
+ name = "applytofirstcharacter",
+ actions = applytofirstcharacter,
+ arguments = { "integer", "string" }
+}
diff --git a/Master/texmf-dist/tex/context/base/typo-fln.mkiv b/Master/texmf-dist/tex/context/base/typo-fln.mkiv
index c092fc922e4..38a53bfa973 100644
--- a/Master/texmf-dist/tex/context/base/typo-fln.mkiv
+++ b/Master/texmf-dist/tex/context/base/typo-fln.mkiv
@@ -79,15 +79,15 @@
\begingroup
\edef\currentfirstline{#1}%
\usefirstlinestyleandcolor\c!style\c!color
- \ctxcommand{setfirstline {
- alternative = "\firstlineparameter\c!alternative",
- ma = \the\attribute\colormodelattribute,
- ca = \the\attribute\colorattribute,
- ta = \the\attribute\transparencyattribute,
- n = \number\firstlineparameter\c!n,
- font = \fontid\font,
- dynamic = \number\attribute\zerocount,
- }}%
+ \clf_setfirstline
+ alternative {\firstlineparameter\c!alternative}%
+ ma \attribute\colormodelattribute
+ ca \attribute\colorattribute
+ ta \attribute\transparencyattribute
+ n \numexpr\firstlineparameter\c!n\relax
+ font \fontid\font
+ dynamic \attribute\zerocount
+ \relax
\kern\zeropoint % we need a node
% \hskip\zeropoint\s!plus\emwidth\relax % can be an option
\endgroup
@@ -104,7 +104,7 @@
\unexpanded\def\applytofirstcharacter#1%
{\begingroup
\dowithnextbox
- {\ctxcommand{applytofirstcharacter(\number\nextbox,"\strippedcsname#1")}%
+ {\clf_applytofirstcharacter\nextbox{\strippedcsname#1}%
\unhbox\nextbox
\endgroup}%
\hbox}
diff --git a/Master/texmf-dist/tex/context/base/typo-inj.lua b/Master/texmf-dist/tex/context/base/typo-inj.lua
new file mode 100644
index 00000000000..b5d9e1c513a
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/typo-inj.lua
@@ -0,0 +1,94 @@
+if not modules then modules = { } end modules ['typo-inj'] = { -- was node-par
+ version = 1.001,
+ comment = "companion to typo-inj.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local tonumber = tonumber
+
+local context = context
+local implement = interfaces.implement
+
+local injectors = { }
+typesetters.injectors = injectors
+local list = { }
+injectors.list = list
+local showall = false
+
+local settings_to_array = utilities.parsers.settings_to_array
+
+local ctx_domarkinjector = context.domarkinjector
+local ctx_doactivateinjector = context.doactivateinjector
+
+table.setmetatableindex(list,function(t,k)
+ local v = {
+ counter = 0,
+ actions = { },
+ show = false,
+ active = false,
+ }
+ t[k] = v
+ return v
+end)
+
+function injectors.reset(name)
+ list[name] = nil
+end
+
+function injectors.set(name,numbers,command)
+ local injector = list[name]
+ local actions = injector.actions
+ local places = settings_to_array(numbers)
+ for i=1,#places do
+ actions[tonumber(places[i])] = command
+ end
+ if not injector.active then
+ ctx_doactivateinjector(name)
+ injector.active = true
+ end
+end
+
+function injectors.show(name)
+ if not name or name == "" then
+ showall = true
+ else
+ local list = settings_to_array(name)
+ for i=1,#list do
+ list[list[i]].show = true
+ end
+ end
+end
+
+function injectors.mark(name,show)
+ local injector = list[name]
+ local n = injector.counter + 1
+ injector.counter = n
+ if showall or injector.show then
+ ctx_domarkinjector(injector.actions[n] and 1 or 0,n)
+ end
+end
+
+function injectors.check(name,n) -- we could also accent n = number : +/- 2
+ local injector = list[name]
+ if n == false then
+ n = injector.counter
+ elseif n == nil then
+ n = injector.counter + 1 -- next (upcoming)
+ else
+ n = tonumber(n) or 0
+ end
+ local action = injector.actions[n]
+ if action then
+ context(action)
+ end
+end
+
+implement { name = "resetinjector", actions = injectors.reset, arguments = "string" }
+implement { name = "showinjector", actions = injectors.show, arguments = "string" }
+implement { name = "setinjector", actions = injectors.set, arguments = { "string", "string", "string" } }
+implement { name = "markinjector", actions = injectors.mark, arguments = "string" }
+implement { name = "checkinjector", actions = injectors.check, arguments = "string" }
+implement { name = "checkpreviousinjector", actions = injectors.check, arguments = { "string", true } }
+implement { name = "checknextinjector", actions = injectors.check }
diff --git a/Master/texmf-dist/tex/context/base/typo-inj.mkiv b/Master/texmf-dist/tex/context/base/typo-inj.mkiv
new file mode 100644
index 00000000000..46cd9fe4599
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/typo-inj.mkiv
@@ -0,0 +1,77 @@
+%D \module
+%D [ file=typo-inj,
+%D version=2014.10.13,
+%D title=\CONTEXT\ Typesetting Macros,
+%D subtitle=Triggering Actions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Typesetting Macros / Triggering Actions}
+
+%D This is a sort of escape from too automatic typesetting of lists. I have
+%D been thinking fo a more generic injector for instance based on tags (as we
+%D already index each element) but thi sis sort of fuzzy because the number of a
+%D tag is not always incremented before we check for it. Also, registers and lists
+%D are among the few candidates that cannot be controlled directly by putting
+%D something in the input. So,m for the moment I stick to this mechanism but
+%D future versions of \CONTEXT\ might do it differently. Compatibility is not much
+%D of an issue here as this mechanism is only to be used in final production runs.
+
+\unprotect
+
+\registerctxluafile{typo-inj}{1.001}
+
+% todo: no need in trialmode
+
+%D \showinjector
+%D
+%D \setinjector[register][3][\column]
+%D \setinjector[list] [2][{\blank[3*big]}]
+%D
+%D \starttext
+%D \placelist[section][criterium=text]
+%D \blank[3*big]
+%D \placeregister[index][criterium=text]
+%D \page
+%D \startsection[title=Alpha] first \index{first} \stopsection
+%D \startsection[title=Beta] second \index{second} \stopsection
+%D \startsection[title=Gamma] third \index{third} \stopsection
+%D \startsection[title=Delta] fourth \index{fourth} \stopsection
+%D \stoptext
+
+\unexpanded\def\resetinjector [#1]{\clf_resetinjector{#1}}
+\unexpanded\def\markinjector [#1]{\dontleavehmode\clf_markinjector{#1}}
+\unexpanded\def\checkinjector [#1]{\clf_checkinjector{#1}}
+\unexpanded\def\checknextinjector {\clf_checknextinjector}
+\unexpanded\def\checkpreviousinjector {\clf_checkpreviousinjector}
+\unexpanded\def\dosetinjector [#1][#2][#3]{\clf_setinjector{#1}{#2}{#3}}
+\unexpanded\def\doshowinjector [#1]{\clf_showinjector{#1}}
+
+\unexpanded\def\setinjector {\dotripleargument\dosetinjector}
+\unexpanded\def\showinjector{\dosingleempty\doshowinjector}
+
+\unexpanded\def\domarkinjector#1#2% called at the lua end
+ {\dontleavehmode\llap{\infofont\ifcase#1\else\red\fi<#2>\quad}}
+
+% low level definers .. we could have \injectors_mark and \injectors_check and then
+% use \v!list instead of \s!list
+
+\unexpanded\def\doinstallinjector#1%
+ {\letvalue{typo_injectors_mark_#1}\donothing
+ \letvalue{typo_injectors_check_#1}\donothing}
+
+\unexpanded\def\doactivateinjector#1% used at lua end
+ {\setuxvalue{typo_injectors_mark_#1}{\dontleavehmode\noexpand\clf_markinjector{#1}}%
+ \setuxvalue{typo_injectors_check_#1}{\noexpand\clf_checkinjector{#1}}}
+
+\unexpanded\def\dotestinjector#1% only for testing outside unprotect
+ {\csname typo_injectors_check_#1\endcsname
+ \csname typo_injectors_mark_#1\endcsname}
+
+\protect \endinput
+
diff --git a/Master/texmf-dist/tex/context/base/typo-itc.lua b/Master/texmf-dist/tex/context/base/typo-itc.lua
index 7373c0321fb..f37549dc830 100644
--- a/Master/texmf-dist/tex/context/base/typo-itc.lua
+++ b/Master/texmf-dist/tex/context/base/typo-itc.lua
@@ -32,6 +32,7 @@ local tonode = nuts.tonode
local tonut = nuts.tonut
local getfield = nuts.getfield
+local getprev = nuts.getprev
local getnext = nuts.getnext
local getid = nuts.getid
local getfont = nuts.getfont
@@ -42,6 +43,7 @@ local setattr = nuts.setattr
local insert_node_after = nuts.insert_after
local delete_node = nuts.delete
local end_of_math = nuts.end_of_math
+local find_tail = nuts.tail
local texgetattribute = tex.getattribute
local texsetattribute = tex.setattribute
@@ -56,6 +58,8 @@ local fontdata = fonthashes.identifiers
local italicsdata = fonthashes.italics
local exheights = fonthashes.exheights
+local implement = interfaces.implement
+
local forcedvariant = false
function typesetters.italics.forcevariant(variant)
@@ -98,16 +102,55 @@ end
-- todo: clear attribute
+local function okay(data,current,font,prevchar,previtalic,char,what)
+ if not data then
+ if trace_italics then
+ report_italics("ignoring %p between %s italic %C and italic %C",previtalic,what,prevchar,char)
+ end
+ return false
+ end
+ if threshold then
+ local ht = getfield(current,"height")
+ local ex = exheights[font]
+ local th = threshold * ex
+ if ht <= th then
+ if trace_italics then
+ report_italics("ignoring correction between %s italic %C and regular %C, height %p less than threshold %p",prevchar,what,char,ht,th)
+ end
+ return false
+ end
+ end
+ if trace_italics then
+ report_italics("inserting %p between %s italic %C and regular %C",previtalic,what,prevchar,char)
+ end
+ return true
+end
+
function italics.handler(head)
- head = tonut(head)
- local done = false
- local italic = 0
- local lastfont = nil
- local lastattr = nil
- local previous = nil
- local prevchar = nil
- local current = head
- local inserted = nil
+
+ local prev = nil
+ local prevchar = nil
+ local prevhead = tonut(head)
+ local previtalic = 0
+ local previnserted = nil
+
+ local replace = nil
+ local replacechar = nil
+ local replacehead = nil
+ local replaceitalic = 0
+ local replaceinserted = nil
+
+ local post = nil
+ local postchar = nil
+ local posthead = nil
+ local postitalic = 0
+ local postinserted = nil
+
+ local current = prevhead
+ local done = false
+ local lastfont = nil
+ local lastattr = nil
+
while current do
local id = getid(current)
if id == glyph_code then
@@ -115,40 +158,45 @@ function italics.handler(head)
local char = getchar(current)
local data = italicsdata[font]
if font ~= lastfont then
- if italic ~= 0 then
- if data then
- if trace_italics then
- report_italics("ignoring %p between italic %C and italic %C",italic,prevchar,char)
+ if previtalic ~= 0 then
+ if okay(data,current,font,prevchar,previtalic,char,"glyph") then
+ insert_node_after(prevhead,prev,new_correction_kern(previtalic))
+ done = true
+ end
+ elseif previnserted and data then
+ if trace_italics then
+ report_italics("deleting last correction before %s %C",char,"glyph")
+ end
+ delete_node(prevhead,previnserted)
+ else
+ --
+ if replaceitalic ~= 0 then
+ if okay(data,replace,font,replacechar,replaceitalic,char,"replace") then
+ insert_node_after(replacehead,replace,new_correction_kern(replaceitalic))
+ done = true
end
- else
- local okay = true
- if threshold then
- local ht = getfield(current,"height")
- local ex = exheights[font]
- local th = threshold * ex
- if ht <= th then
- if trace_italics then
- report_italics("ignoring correction between italic %C and regular %C, height %p less than threshold %p",prevchar,char,ht,th)
- end
- okay = false
- end
+ replaceitalic = 0
+ elseif replaceinserted and data then
+ if trace_italics then
+ report_italics("deleting last correction before %s %C","replace",char)
end
- if okay then
- if trace_italics then
- report_italics("inserting %p between italic %C and regular %C",italic,prevchar,char)
- end
- insert_node_after(head,previous,new_correction_kern(italic))
+ delete_node(replacehead,replaceinserted)
+ end
+ --
+ if postitalic ~= 0 then
+ if okay(data,post,font,postchar,postitalic,char,"post") then
+ insert_node_after(posthead,post,new_correction_kern(postitalic))
done = true
end
+ postitalic = 0
+ elseif postinserted and data then
+ if trace_italics then
+ report_italics("deleting last correction before %s %C","post",char)
+ end
+ delete_node(posthead,postinserted)
end
- elseif inserted and data then
- if trace_italics then
- report_italics("deleting last correction before %C",char)
- end
- delete_node(head,inserted)
- else
- -- nothing
end
+ --
lastfont = font
end
if data then
@@ -157,63 +205,240 @@ function italics.handler(head)
local cd = data[char]
if not cd then
-- this really can happen
- italic = 0
+ previtalic = 0
else
- italic = cd.italic or cd.italic_correction
- if not italic then
- italic = setitalicinfont(font,char) -- calculated once
- -- italic = 0
+ previtalic = cd.italic or cd.italic_correction
+ if not previtalic then
+ previtalic = setitalicinfont(font,char) -- calculated once
+ -- previtalic = 0
end
- if italic ~= 0 then
+ if previtalic ~= 0 then
lastfont = font
lastattr = attr
- previous = current
+ prev = current
+ -- prevhead = head
prevchar = char
end
end
else
- italic = 0
+ previtalic = 0
end
else
- italic = 0
+ previtalic = 0
end
- inserted = nil
+ previnserted = nil
+ replaceinserted = nil
+ postinserted = nil
elseif id == disc_code then
- -- skip
- elseif id == kern_code then
- inserted = nil
- italic = 0
+ previnserted = nil
+ previtalic = 0
+ replaceinserted = nil
+ replaceitalic = 0
+ postinserted = nil
+ postitalic = 0
+ replace = getfield(current,"replace")
+ if replace then
+ local current = find_tail(replace)
+ if getid(current) ~= glyph_code then
+ current = getprev(current)
+ end
+ if current and getid(current) == glyph_code then
+ local font = getfont(current)
+ local char = getchar(current)
+ local data = italicsdata[font]
+ if data then
+ local attr = forcedvariant or getattr(current,a_italics)
+ if attr and attr > 0 then
+ local cd = data[char]
+ if not cd then
+ -- this really can happen
+ replaceitalic = 0
+ else
+ replaceitalic = cd.italic or cd.italic_correction
+ if not replaceitalic then
+ replaceitalic = setitalicinfont(font,char) -- calculated once
+ -- replaceitalic = 0
+ end
+ if replaceitalic ~= 0 then
+ lastfont = font
+ lastattr = attr
+ replacechar = char
+ replacehead = replace
+ replace = current
+ end
+ end
+-- else
+-- replaceitalic = 0
+ end
+-- else
+-- replaceitalic = 0
+ end
+-- else
+-- replaceitalic = 0
+ end
+-- replaceinserted = nil
+-- else
+-- replaceitalic = 0
+-- replaceinserted = nil
+ end
+ post = getfield(current,"post")
+ if post then
+ local current = find_tail(post)
+ if getid(current) ~= glyph_code then
+ current = getprev(current)
+ end
+ if current and getid(current) == glyph_code then
+ local font = getfont(current)
+ local char = getchar(current)
+ local data = italicsdata[font]
+ if data then
+ local attr = forcedvariant or getattr(current,a_italics)
+ if attr and attr > 0 then
+ local cd = data[char]
+ if not cd then
+ -- this really can happen
+-- postitalic = 0
+ else
+ postitalic = cd.italic or cd.italic_correction
+ if not postitalic then
+ postitalic = setitalicinfont(font,char) -- calculated once
+ -- postitalic = 0
+ end
+ if postitalic ~= 0 then
+ lastfont = font
+ lastattr = attr
+ postchar = char
+ posthead = post
+ post = current
+ end
+ end
+-- else
+-- postitalic = 0
+ end
+-- else
+-- postitalic = 0
+ end
+-- else
+-- postitalic = 0
+ end
+-- postinserted = nil
+-- else
+-- postitalic = 0
+-- postinserted = nil
+ end
+ elseif id == kern_code then -- how about fontkern ?
+ previnserted = nil
+ previtalic = 0
+ replaceinserted = nil
+ replaceitalic = 0
+ postinserted = nil
+ postitalic = 0
elseif id == glue_code then
- if italic ~= 0 then
+ if previtalic ~= 0 then
if trace_italics then
- report_italics("inserting %p between italic %C and glue",italic,prevchar)
+ report_italics("inserting %p between %s italic %C and glue",previtalic,"glyph",prevchar)
+ end
+ previnserted = new_correction_glue(previtalic) -- maybe just add ? else problem with penalties
+ previtalic = 0
+ done = true
+ insert_node_after(prevhead,prev,previnserted)
+ else
+ if replaceitalic ~= 0 then
+ if trace_italics then
+ report_italics("inserting %p between %s italic %C and glue",replaceitalic,"replace",replacechar)
+ end
+ replaceinserted = new_correction_kern(replaceitalic) -- needs to be a kern
+ replaceitalic = 0
+ done = true
+ insert_node_after(replacehead,replace,replaceinserted)
+ end
+ if postitalic ~= 0 then
+ if trace_italics then
+ report_italics("inserting %p between %s italic %C and glue",postitalic,"post",postchar)
+ end
+ postinserted = new_correction_kern(postitalic) -- needs to be a kern
+ postitalic = 0
+ done = true
+ insert_node_after(posthead,post,postinserted)
end
- inserted = new_correction_glue(italic) -- maybe just add ? else problem with penalties
- insert_node_after(head,previous,inserted)
- italic = 0
- done = true
end
elseif id == math_code then
current = end_of_math(current)
- elseif italic ~= 0 then
- if trace_italics then
- report_italics("inserting %p between italic %C and whatever",italic,prevchar)
+ previnserted = nil
+ previtalic = 0
+ replaceinserted = nil
+ replaceitalic = 0
+ postinserted = nil
+ postitalic = 0
+ else
+ if previtalic ~= 0 then
+ if trace_italics then
+ report_italics("inserting %p between %s italic %C and whatever",previtalic,"glyph",prevchar)
+ end
+ insert_node_after(prevhead,prev,new_correction_kern(previtalic))
+ previnserted = nil
+ previtalic = 0
+ replaceinserted = nil
+ replaceitalic = 0
+ postinserted = nil
+ postitalic = 0
+ done = true
+ else
+ if replaceitalic ~= 0 then
+ if trace_italics then
+ report_italics("inserting %p between %s italic %C and whatever",replaceritalic,"replace",replacechar)
+ end
+ insert_node_after(replacehead,replace,new_correction_kern(replaceitalic))
+ previnserted = nil
+ previtalic = 0
+ replaceinserted = nil
+ replaceitalic = 0
+ postinserted = nil
+ postitalic = 0
+ done = true
+ end
+ if postitalic ~= 0 then
+ if trace_italics then
+ report_italics("inserting %p between %s italic %C and whatever",postitalic,"post",postchar)
+ end
+ insert_node_after(posthead,post,new_correction_kern(postitalic))
+ previnserted = nil
+ previtalic = 0
+ replaceinserted = nil
+ replaceitalic = 0
+ postinserted = nil
+ postitalic = 0
+ done = true
+ end
end
- inserted = nil
- insert_node_after(head,previous,new_correction_kern(italic))
- italic = 0
- done = true
end
current = getnext(current)
end
- if italic ~= 0 and lastattr > 1 then -- more control is needed here
- if trace_italics then
- report_italics("inserting %p between italic %C and end of list",italic,prevchar)
+ if lastattr and lastattr > 1 then -- more control is needed here
+ if previtalic ~= 0 then
+ if trace_italics then
+ report_italics("inserting %p between %s italic %C and end of list",previtalic,"glyph",prevchar)
+ end
+ insert_node_after(prevhead,prev,new_correction_kern(previtalic))
+ done = true
+ else
+ if replaceitalic ~= 0 then
+ if trace_italics then
+ report_italics("inserting %p between %s italic %C and end of list",replaceitalic,"replace",replacechar)
+ end
+ insert_node_after(replacehead,replace,new_correction_kern(replaceitalic))
+ done = true
+ end
+ if postitalic ~= 0 then
+ if trace_italics then
+ report_italics("inserting %p between %s italic %C and end of list",postitalic,"post",postchar)
+ end
+ insert_node_after(posthead,post,new_correction_kern(postitalic))
+ done = true
+ end
end
- insert_node_after(head,previous,new_correction_kern(italic))
- done = true
end
- return tonode(head), done
+ return head, done
end
local enable
@@ -241,10 +466,21 @@ function italics.reset()
texsetattribute(a_italics,unsetvalue)
end
+implement {
+ name = "setitaliccorrection",
+ actions = italics.set,
+ arguments = "string"
+}
+
+implement {
+ name = "resetitaliccorrection",
+ actions = italics.reset,
+}
+
local variables = interfaces.variables
local settings_to_hash = utilities.parsers.settings_to_hash
-function commands.setupitaliccorrection(option) -- no grouping !
+local function setupitaliccorrection(option) -- no grouping !
if enable then
enable()
end
@@ -268,16 +504,28 @@ function commands.setupitaliccorrection(option) -- no grouping !
end
end
+implement {
+ name = "setupitaliccorrection",
+ actions = setupitaliccorrection,
+ arguments = "string"
+}
+
-- for manuals:
local stack = { }
-function commands.pushitaliccorrection()
- table.insert(stack,{forcedvariant, texgetattribute(a_italics) })
-end
+implement {
+ name = "pushitaliccorrection",
+ actions = function()
+ table.insert(stack,{forcedvariant, texgetattribute(a_italics) })
+ end
+}
-function commands.popitaliccorrection()
- local top = table.remove(stack)
- forcedvariant = top[1]
- texsetattribute(a_italics,top[2])
-end
+implement {
+ name = "popitaliccorrection",
+ actions = function()
+ local top = table.remove(stack)
+ forcedvariant = top[1]
+ texsetattribute(a_italics,top[2])
+ end
+}
diff --git a/Master/texmf-dist/tex/context/base/typo-itc.mkvi b/Master/texmf-dist/tex/context/base/typo-itc.mkvi
index 4a3bba51850..c0aa8e2f6dd 100644
--- a/Master/texmf-dist/tex/context/base/typo-itc.mkvi
+++ b/Master/texmf-dist/tex/context/base/typo-itc.mkvi
@@ -42,10 +42,10 @@
% 2 = end of word and end of a list
\unexpanded\def\setitaliccorrection[#code]% rather low level (might go away)
- {\ctxlua{typesetters.italics.set(\number#code)}}
+ {\clf_setitaliccorrection#code\relax}
\unexpanded\def\resetitaliccorrection% rather low level (might go away)
- {\ctxlua{typesetters.italics.reset()}}
+ {\clf_resetitaliccorrection}
% global : no attributes, just always (faster and less memory)
% text : only text
@@ -53,7 +53,7 @@
% none : -
\unexpanded\def\setupitaliccorrection[#settings]%
- {\ctxcommand{setupitaliccorrection("#settings")}}
+ {\clf_setupitaliccorrection{#settings}}
\appendtoks
\attribute\italicsattribute\attributeunsetvalue
diff --git a/Master/texmf-dist/tex/context/base/typo-itm.mkiv b/Master/texmf-dist/tex/context/base/typo-itm.mkiv
index eb47e407616..0bb8170c721 100644
--- a/Master/texmf-dist/tex/context/base/typo-itm.mkiv
+++ b/Master/texmf-dist/tex/context/base/typo-itm.mkiv
@@ -109,9 +109,9 @@
\let\p_typo_items_symbol\empty
\let\m_typo_items_symbol\firstofoneargument
\else
- \doifconversiondefinedelse\p_typo_items_symbol
+ \doifelseconversiondefined\p_typo_items_symbol
{\def\m_typo_items_symbol{\convertnumber\p_typo_items_symbol}}
- {\doifsymboldefinedelse\p_typo_items_symbol
+ {\doifelsesymboldefined\p_typo_items_symbol
{\def\m_typo_items_symbol{\symbol[\p_typo_items_symbol]\gobbleoneargument}}
{\let\m_typo_items_symbol\firstofoneargument}}%
\fi\fi
diff --git a/Master/texmf-dist/tex/context/base/typo-krn.lua b/Master/texmf-dist/tex/context/base/typo-krn.lua
index a8ffe557be4..46a977cfd49 100644
--- a/Master/texmf-dist/tex/context/base/typo-krn.lua
+++ b/Master/texmf-dist/tex/context/base/typo-krn.lua
@@ -11,7 +11,8 @@ if not modules then modules = { } end modules ['typo-krn'] = {
local next, type, tonumber = next, type, tonumber
local utfchar = utf.char
-local nodes, node, fonts = nodes, node, fonts
+local nodes = nodes
+local fonts = fonts
local tasks = nodes.tasks
local nuts = nodes.nuts
@@ -20,11 +21,10 @@ local nodepool = nuts.pool
local tonode = nuts.tonode
local tonut = nuts.tonut
+-- check what is used
+
local find_node_tail = nuts.tail
local free_node = nuts.free
-local free_nodelist = nuts.flush_list
-local copy_node = nuts.copy
-local copy_nodelist = nuts.copy_list
local insert_node_before = nuts.insert_before
local insert_node_after = nuts.insert_after
local end_of_math = nuts.end_of_math
@@ -51,6 +51,7 @@ local nodecodes = nodes.nodecodes
local kerncodes = nodes.kerncodes
local skipcodes = nodes.skipcodes
local disccodes = nodes.disccodes
+local listcodes = nodes.listcodes
local glyph_code = nodecodes.glyph
local kern_code = nodecodes.kern
@@ -60,7 +61,12 @@ local hlist_code = nodecodes.hlist
local vlist_code = nodecodes.vlist
local math_code = nodecodes.math
+local box_list_code = listcodes.box
+local user_list_code = listcodes.unknown
+
local discretionary_code = disccodes.discretionary
+local automatic_code = disccodes.automatic
+
local kerning_code = kerncodes.kerning
local userkern_code = kerncodes.userkern
local userskip_code = skipcodes.userskip
@@ -203,39 +209,200 @@ local function spec_injector(fillup,width,stretch,shrink)
end
end
--- needs checking ... base mode / node mode -- also use insert_before/after etc
+-- a simple list injector, no components and such .. just disable ligatures in
+-- kern mode .. maybe not even hyphenate ... anyway, the next one is for simple
+-- sublists .. beware: we can have char -1
+
+local function inject_begin(boundary,prev,keeptogether,krn,ok) -- prev is a glyph
+ local id = getid(boundary)
+ if id == kern_code then
+ if getsubtype(boundary) == kerning_code or getattr(boundary,a_fontkern) then
+ local inject = true
+ if keeptogether then
+ local next = getnext(boundary)
+ if not next or (getid(next) == glyph_code and keeptogether(prev,next)) then
+ inject = false
+ end
+ end
+ if inject then
+ -- not yet ok, as injected kerns can be overlays (from node-inj.lua)
+ setfield(boundary,"subtype",userkern_code)
+ setfield(boundary,"kern",getfield(boundary,"kern") + quaddata[getfont(prev)]*krn)
+ return boundary, true
+ end
+ end
+ elseif id == glyph_code then
+ if keeptogether and keeptogether(boundary,prev) then
+ -- keep 'm
+ else
+ local charone = getchar(prev)
+ if charone > 0 then
+ local font = getfont(boundary)
+ local chartwo = getchar(boundary)
+ local kerns = chardata[font][charone].kerns
+ local kern = new_kern((kerns and kerns[chartwo] or 0) + quaddata[font]*krn)
+ setfield(boundary,"prev",kern)
+ setfield(kern,"next",boundary)
+ return kern, true
+ end
+ end
+ end
+ return boundary, ok
+end
+
+local function inject_end(boundary,next,keeptogether,krn,ok)
+ local tail = find_node_tail(boundary)
+ local id = getid(tail)
+ if id == kern_code then
+ if getsubtype(tail) == kerning_code or getattr(tail,a_fontkern) then
+ local inject = true
+ if keeptogether then
+ local prev = getprev(tail)
+ if getid(prev) == glyph_code and keeptogether(prev,two) then
+ inject = false
+ end
+ end
+ if inject then
+ -- not yet ok, as injected kerns can be overlays (from node-inj.lua)
+ setfield(tail,"subtype",userkern_code)
+ setfield(tail,"kern",getfield(tail,"kern") + quaddata[getfont(next)]*krn)
+ return boundary, true
+ end
+ end
+ elseif id == glyph_code then
+ if keeptogether and keeptogether(tail,two) then
+ -- keep 'm
+ else
+ local charone = getchar(tail)
+ if charone > 0 then
+ local font = getfont(tail)
+ local chartwo = getchar(next)
+ local kerns = chardata[font][charone].kerns
+ local kern = (kerns and kerns[chartwo] or 0) + quaddata[font]*krn
+ insert_node_after(boundary,tail,new_kern(kern))
+ return boundary, true
+ end
+ end
+ end
+ return boundary, ok
+end
-local function do_process(head,force) -- todo: glue so that we can fully stretch
- local start, done, lastfont = head, false, nil
+local function process_list(head,keeptogether,krn,font,okay)
+ local start = head
+ local prev = nil
+ local pid = nil
+ local kern = 0
+ local mark = font and markdata[font]
+ while start do
+ local id = getid(start)
+ if id == glyph_code then
+ if not font then
+ font = getfont(start)
+ mark = markdata[font]
+ kern = quaddata[font]*krn
+ end
+ if prev then
+ local char = getchar(start)
+ if mark[char] then
+ -- skip
+ elseif pid == kern_code then
+ if getsubtype(prev) == kerning_code or getattr(prev,a_fontkern) then
+ local inject = true
+ if keeptogether then
+ local prevprev = getprev(prev)
+ if getid(prevprev) == glyph_code and keeptogether(prevprev,start) then
+ inject = false
+ end
+ end
+ if inject then
+ -- not yet ok, as injected kerns can be overlays (from node-inj.lua)
+ setfield(prev,"subtype",userkern_code)
+ setfield(prev,"kern",getfield(prev,"kern") + kern)
+ okay = true
+ end
+ end
+ elseif pid == glyph_code then
+ if keeptogether and keeptogether(prev,start) then
+ -- keep 'm
+ else
+ local prevchar = getchar(prev)
+ local kerns = chardata[font][prevchar].kerns
+ -- if kerns then
+ -- print("it happens indeed, basemode kerns not yet injected")
+ -- end
+ insert_node_before(head,start,new_kern((kerns and kerns[char] or 0) + kern))
+ okay = true
+ end
+ end
+ end
+ end
+ if start then
+ prev = start
+ pid = id
+ start = getnext(start)
+ end
+ end
+ return head, okay, prev
+end
+
+local function closest_bound(b,get)
+ b = get(b)
+ if b and getid(b) ~= glue_code then
+ while b do
+ if not getattr(b,a_kerns) then
+ break
+ elseif getid(b) == glyph_code then
+ return b, getfont(b)
+ else
+ b = get(b)
+ end
+ end
+ end
+end
+
+function kerns.handler(head)
+ local head = tonut(head)
+ local start = head
+ local done = false
+ local lastfont = nil
local keepligature = kerns.keepligature
local keeptogether = kerns.keeptogether
- local fillup = false
+ local fillup = false
+ local bound = false
+ local prev = nil
+ local previd = nil
+ local prevchar = nil
+ local prevfont = nil
+ local prevmark = nil
while start do
- -- faster to test for attr first
- local attr = force or getattr(start,a_kerns)
+ -- fontkerns don't get the attribute but they always sit between glyphs so
+ -- are always valid bound .. disc nodes also somtimes don't get them
+ local id = getid(start)
+ local attr = getattr(start,a_kerns)
if attr and attr > 0 then
- setattr(start,a_kerns,unsetvalue)
+ setattr(start,a_kerns,0) -- unsetvalue)
local krn = mapping[attr]
if krn == v_max then
- krn = .25
+ krn = .25
fillup = true
else
fillup = false
end
- if krn and krn ~= 0 then
- local id = getid(start)
- if id == glyph_code then -- we could use the subtype ligature
- lastfont = getfont(start)
- local c = getfield(start,"components")
- if not c then
- -- fine
- elseif keepligature and keepligature(start) then
- -- keep 'm
- else
- c = do_process(c,attr)
+ if not krn or krn == 0 then
+ bound = false
+ elseif id == glyph_code then -- we could use the subtype ligature
+ local c = getfield(start,"components")
+ if not c then
+ -- fine
+ elseif keepligature and keepligature(start) then
+ -- keep 'm
+ c = nil
+ else
+ while c do
local s = start
- local p, n = getprev(s), getnext(s)
- local tail = find_node_tail(c)
+ local t = find_node_tail(c)
+ local p = getprev(s)
+ local n = getnext(s)
if p then
setfield(p,"next",c)
setfield(c,"prev",p)
@@ -243,165 +410,190 @@ local function do_process(head,force) -- todo: glue so that we can fully stretch
head = c
end
if n then
- setfield(n,"prev",tail)
+ setfield(n,"prev",t)
+ setfield(t,"next",n)
end
- setfield(tail,"next",n)
start = c
setfield(s,"components",nil)
- -- we now leak nodes !
- -- free_node(s)
- done = true
+ free_node(s)
+ c = getfield(start,"components")
end
- local prev = getprev(start)
- if not prev then
- -- skip
- elseif markdata[lastfont][getchar(start)] then
- -- skip
- else
- local pid = getid(prev)
- if not pid then
- -- nothing
- elseif pid == kern_code then
- if getsubtype(prev) == kerning_code or getattr(prev,a_fontkern) then
- if keeptogether and getid(getprev(prev)) == glyph_code and keeptogether(getprev(prev),start) then -- we could also pass start
- -- keep 'm
- else
- -- not yet ok, as injected kerns can be overlays (from node-inj.lua)
- setfield(prev,"subtype",userkern_code)
- setfield(prev,"kern",getfield(prev,"kern") + quaddata[lastfont]*krn) -- here
- done = true
- end
- end
- elseif pid == glyph_code then
- if getfont(prev) == lastfont then
- local prevchar, lastchar = getchar(prev), getchar(start)
- if keeptogether and keeptogether(prev,start) then
- -- keep 'm
- else
- local kerns = chardata[lastfont][prevchar].kerns
- local kern = kerns and kerns[lastchar] or 0
- krn = kern + quaddata[lastfont]*krn -- here
- insert_node_before(head,start,kern_injector(fillup,krn))
- done = true
- end
- else
- krn = quaddata[lastfont]*krn -- here
- insert_node_before(head,start,kern_injector(fillup,krn))
- done = true
- end
- elseif pid == disc_code then
- -- a bit too complicated, we can best not copy and just calculate
- -- but we could have multiple glyphs involved so ...
- local disc = prev -- disc
- local prv, nxt = getprev(disc), getnext(disc)
- if getsubtype(disc) == discretionary_code then
- -- maybe we should forget about this variant as there is no glue
- -- possible
- local pre, post, replace = getfield(disc,"pre"), getfield(disc,"post"), getfield(disc,"replace")
- if pre and prv then -- must pair with getprev(start)
- local before = copy_node(prv)
- setfield(pre,"prev",before)
- setfield(before,"next",pre)
- setfield(before,"prev",nil)
- pre = do_process(before,attr)
- pre = getnext(pre)
- setfield(pre,"prev",nil)
- setfield(disc,"pre",pre)
- free_node(before)
- end
- if post and nxt then -- must pair with start
- local after = copy_node(nxt)
- local tail = find_node_tail(post)
- setfield(tail,"next",after)
- setfield(after,"prev",tail)
- setfield(after,"next",nil)
- post = do_process(post,attr)
- setfield(tail,"next",nil)
- setfield(disc,"post",post)
- free_node(after)
- end
- if replace and prv and nxt then -- must pair with start and start.prev
- local before = copy_node(prv)
- local after = copy_node(nxt)
- local tail = find_node_tail(replace)
- setfield(replace,"prev",before)
- setfield(before,"next",replace)
- setfield(before,"prev",nil)
- setfield(tail,"next",after)
- setfield(after,"prev",tail)
- setfield(after,"next",nil)
- replace = do_process(before,attr)
- replace = getnext(replace)
- setfield(replace,"prev",nil)
- setfield(getfield(after,"prev"),"next",nil)
- setfield(disc,"replace",replace)
- free_node(after)
- free_node(before)
- elseif prv and getid(prv) == glyph_code and getfont(prv) == lastfont then
- local prevchar, lastchar = getchar(prv), getchar(start)
- local kerns = chardata[lastfont][prevchar].kerns
- local kern = kerns and kerns[lastchar] or 0
- krn = kern + quaddata[lastfont]*krn -- here
- setfield(disc,"replace",kern_injector(false,krn)) -- only kerns permitted, no glue
- else
- krn = quaddata[lastfont]*krn -- here
- setfield(disc,"replace",kern_injector(false,krn)) -- only kerns permitted, no glue
- end
- else
- -- this one happens in most cases: automatic (-), explicit (\-), regular (patterns)
- if prv and getid(prv) == glyph_code and getfont(prv) == lastfont then
- -- the normal case
- local prevchar, lastchar = getchar(prv), getchar(start)
- local kerns = chardata[lastfont][prevchar].kerns
- local kern = kerns and kerns[lastchar] or 0
- krn = kern + quaddata[lastfont]*krn
- else
- krn = quaddata[lastfont]*krn
- end
- insert_node_before(head,start,kern_injector(fillup,krn))
+ end
+ local char = getchar(start)
+ local font = getfont(start)
+ local mark = markdata[font]
+ if not bound then
+ -- yet
+ elseif mark[char] then
+ -- skip
+ elseif previd == kern_code then
+ if getsubtype(prev) == kerning_code or getattr(prev,a_fontkern) then
+ local inject = true
+ if keeptogether then
+ if previd == glyph_code and keeptogether(prev,start) then
+ inject = false
end
end
+ if inject then
+ -- not yet ok, as injected kerns can be overlays (from node-inj.lua)
+ setfield(prev,"subtype",userkern_code)
+ setfield(prev,"kern",getfield(prev,"kern") + quaddata[font]*krn)
+ done = true
+ end
end
- elseif id == glue_code then
- local subtype = getsubtype(start)
- if subtype == userskip_code or subtype == xspaceskip_code or subtype == spaceskip_code then
- local s = getfield(start,"spec")
- local w = getfield(s,"width")
- if w > 0 then
- local width, stretch, shrink = w+gluefactor*w*krn, getfield(s,"stretch"), getfield(s,"shrink")
- setfield(start,"spec",spec_injector(fillup,width,stretch*width/w,shrink*width/w))
+ elseif previd == glyph_code then
+ if prevfont == font then
+ if keeptogether and keeptogether(prev,start) then
+ -- keep 'm
+ else
+ local kerns = chardata[font][prevchar].kerns
+ local kern = (kerns and kerns[char] or 0) + quaddata[font]*krn
+ insert_node_before(head,start,kern_injector(fillup,kern))
done = true
end
+ else
+ insert_node_before(head,start,kern_injector(fillup,quaddata[font]*krn))
+ done = true
end
- elseif id == kern_code then
- -- if getsubtype(start) == kerning_code then -- handle with glyphs
- -- local sk = getfield(start,"kern")
- -- if sk > 0 then
- -- setfield(start,"kern",sk*krn)
- -- done = true
- -- end
- -- end
- elseif lastfont and (id == hlist_code or id == vlist_code) then -- todo: lookahead
- local p = getprev(start)
- if p and getid(p) ~= glue_code then
- insert_node_before(head,start,kern_injector(fillup,quaddata[lastfont]*krn))
+ end
+ prev = start
+ prevchar = char
+ prevfont = font
+ prevmark = mark
+ previd = id
+ bound = true
+ elseif id == disc_code then
+ local prev, next, pglyph, nglyph -- delayed till needed
+ local subtype = getsubtype(start)
+ if subtype == automatic_code then
+ -- this is kind of special, as we have already injected the
+ -- previous kern
+ local prev = getprev(start)
+ local pglyph = prev and getid(prev) == glyph_code
+ languages.expand(start,pglyph and prev)
+ -- we can have a different start now
+ elseif subtype ~= discretionary_code then
+ prev = getprev(start)
+ pglyph = prev and getid(prev) == glyph_code
+ languages.expand(start,pglyph and prev)
+ end
+ local pre = getfield(start,"pre")
+ local post = getfield(start,"post")
+ local replace = getfield(start,"replace")
+ -- we really need to reasign the fields as luatex keeps track of
+ -- the tail in a temp preceding head .. kind of messy so we might
+ -- want to come up with a better solution some day like a real
+ -- pretail etc fields in a disc node
+ --
+ -- maybe i'll merge the now split functions
+ if pre then
+ local okay = false
+ if not prev then
+ prev = prev or getprev(start)
+ pglyph = prev and getid(prev) == glyph_code
+ end
+ if pglyph then
+ pre, okay = inject_begin(pre,prev,keeptogether,krn,okay)
+ end
+ pre, okay = process_list(pre,keeptogether,krn,false,okay)
+ if okay then
+ setfield(start,"pre",pre)
done = true
end
- local n = getnext(start)
- if n and getid(n) ~= glue_code then
- insert_node_after(head,start,kern_injector(fillup,quaddata[lastfont]*krn))
+ end
+ if post then
+ local okay = false
+ if not next then
+ next = getnext(start)
+ nglyph = next and getid(next) == glyph_code
+ end
+ if nglyph then
+ post, okay = inject_end(post,next,keeptogether,krn,okay)
+ end
+ post, okay = process_list(post,keeptogether,krn,false,okay)
+ if okay then
+ setfield(start,"post",post)
done = true
end
- elseif id == math_code then
- start = end_of_math(start)
end
+ if replace then
+ local okay = false
+ if not prev then
+ prev = prev or getprev(start)
+ pglyph = prev and getid(prev) == glyph_code
+ end
+ if pglyph then
+ replace, okay = inject_begin(replace,prev,keeptogether,krn,okay)
+ end
+ if not next then
+ next = getnext(start)
+ nglyph = next and getid(next) == glyph_code
+ end
+ if nglyph then
+ replace, okay = inject_end(replace,next,keeptogether,krn,okay)
+ end
+ replace, okay = process_list(replace,keeptogether,krn,false,okay)
+ if okay then
+ setfield(start,"replace",replace)
+ done = true
+ end
+ elseif prevfont then
+ setfield(start,"replace",new_kern(quaddata[prevfont]*krn))
+ done = true
+ end
+ bound = false
+ elseif id == kern_code then
+ bound = getsubtype(start) == kerning_code or getattr(start,a_fontkern)
+ prev = start
+ previd = id
+ elseif id == glue_code then
+ local subtype = getsubtype(start)
+ if subtype == userskip_code or subtype == xspaceskip_code or subtype == spaceskip_code then
+ local s = getfield(start,"spec")
+ local w = getfield(s,"width")
+ if w > 0 then
+ local width = w+gluefactor*w*krn
+ local stretch = getfield(s,"stretch")
+ local shrink = getfield(s,"shrink")
+ setfield(start,"spec",spec_injector(fillup,width,stretch*width/w,shrink*width/w))
+ done = true
+ end
+ end
+ bound = false
+ elseif id == hlist_code or id == vlist_code then
+ local subtype = getsubtype(start)
+ if subtype == user_list_code or subtype == box_list_code then
+ -- special case
+ local b, f = closest_bound(start,getprev)
+ if b then
+ insert_node_before(head,start,kern_injector(fillup,quaddata[f]*krn))
+ done = true
+ end
+ local b, f = closest_bound(start,getnext)
+ if b then
+ insert_node_after(head,start,kern_injector(fillup,quaddata[f]*krn))
+ done = true
+ end
+ end
+ bound = false
+ elseif id == math_code then
+ start = end_of_math(start)
+ bound = false
end
- end
- if start then
+ if start then
+ start = getnext(start)
+ end
+ elseif id == kern_code then
+ bound = getsubtype(start) == kerning_code or getattr(start,a_fontkern)
+ prev = start
+ previd = id
+ start = getnext(start)
+ else
+ bound = false
start = getnext(start)
end
end
- return head, done
+ return tonode(head), done
end
local enabled = false
@@ -428,11 +620,11 @@ function kerns.set(factor)
return factor
end
-function kerns.handler(head)
- local head, done = do_process(tonut(head)) -- no direct map, because else fourth argument is tail == true
- return tonode(head), done
-end
-
-- interface
-commands.setcharacterkerning = kerns.set
+interfaces.implement {
+ name = "setcharacterkerning",
+ actions = kerns.set,
+ arguments = "string"
+}
+
diff --git a/Master/texmf-dist/tex/context/base/typo-krn.mkiv b/Master/texmf-dist/tex/context/base/typo-krn.mkiv
index 92689f07b85..6d6126542bf 100644
--- a/Master/texmf-dist/tex/context/base/typo-krn.mkiv
+++ b/Master/texmf-dist/tex/context/base/typo-krn.mkiv
@@ -35,13 +35,10 @@
\typo_kerning_set
\fi}
-% \def\typo_kerning_set
-% {\ctxcommand{setcharacterkerning(\characterkerningparameter\c!factor)}}
-
\def\typo_kerning_set
{\usecharacterkerningstyleandcolor\c!style\c!color % goodie, maybe also strut
\useaddfontfeatureparameter\characterkerningparameter
- \ctxcommand{setcharacterkerning("\characterkerningparameter\c!factor")}}
+ \clf_setcharacterkerning{\characterkerningparameter\c!factor}}
\unexpanded\def\resetcharacterkerning % fast one
{\attribute\kernattribute\attributeunsetvalue}
@@ -89,9 +86,9 @@
\appendtoks
\setuevalue{\currentcharacterkerning}%
- {\doifnextoptionalelse
+ {\doifelsenextoptional
{\typo_kerning_apply_yes{\currentcharacterkerning}}%
- {\typo_kerning_apply_nop{\currentcharacterkerning}}}
+ {\typo_kerning_apply_nop{\currentcharacterkerning}}}%
\to \everydefinecharacterkerning
\unexpanded\def\typo_kerning_apply_yes#1[#2]%
diff --git a/Master/texmf-dist/tex/context/base/typo-lan.lua b/Master/texmf-dist/tex/context/base/typo-lan.lua
index 50927f74493..c42d2119eb6 100644
--- a/Master/texmf-dist/tex/context/base/typo-lan.lua
+++ b/Master/texmf-dist/tex/context/base/typo-lan.lua
@@ -67,6 +67,8 @@ function frequencies.averagecharwidth(language,font)
return frequencycache[language or "en"][font or currentfont()]
end
-function commands.averagecharwidth(language,font)
- context(frequencycache[language or "en"][font or currentfont()])
-end
+interfaces.implement {
+ name = "averagecharwidth",
+ actions = { frequencies.averagecharwidth, context },
+ arguments = "string"
+}
diff --git a/Master/texmf-dist/tex/context/base/typo-lan.mkiv b/Master/texmf-dist/tex/context/base/typo-lan.mkiv
index bb4ed204205..8b633957bca 100644
--- a/Master/texmf-dist/tex/context/base/typo-lan.mkiv
+++ b/Master/texmf-dist/tex/context/base/typo-lan.mkiv
@@ -30,7 +30,7 @@
\def\charwidthlanguage{\currentmainlanguage}
-\def\averagecharwidth{\dimexpr\ctxcommand{averagecharwidth("\charwidthlanguage")}\scaledpoint\relax}
+\def\averagecharwidth{\dimexpr\clf_averagecharwidth{\charwidthlanguage}\scaledpoint\relax}
\protect
diff --git a/Master/texmf-dist/tex/context/base/typo-lig.mkiv b/Master/texmf-dist/tex/context/base/typo-lig.mkiv
new file mode 100644
index 00000000000..6171441d6d3
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/typo-lig.mkiv
@@ -0,0 +1,31 @@
+%D \module
+%D [ file=typo-lig,
+%D version=2014.12.01,
+%D title=\CONTEXT\ Typesetting Macros,
+%D subtitle=Ligatures,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Typesetting Macros / Ligatures}
+
+%D This macro is mostly used for testing an attribute that blocks ligatures
+%D in the nodemode handler. It is not really used in practice, and mostly
+%D there as a plug in the generic font handler.
+
+\unprotect
+
+\definesystemattribute[noligature][public]
+
+\unexpanded\def\noligature#1%
+ {\dontleavehmode
+ \begingroup
+ \attribute\noligatureattribute\plusone
+ #1%
+ \endgroup}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/typo-man.lua b/Master/texmf-dist/tex/context/base/typo-man.lua
new file mode 100644
index 00000000000..6c6d7926f37
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/typo-man.lua
@@ -0,0 +1,113 @@
+if not modules then modules = { } end modules ['typo-man'] = {
+ version = 1.001,
+ comment = "companion to typo-prc.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+if not characters then
+ -- for testing stand-alone
+ require("char-def")
+ require("char-ini")
+end
+
+local lpegmatch = lpeg.match
+local P, R, C, Ct, Cs, Carg = lpeg.P, lpeg.R, lpeg.C, lpeg.Ct, lpeg.Cs, lpeg.Carg
+local global = global or _G
+
+local methods = {
+ uppercase = characters.upper,
+ lowercase = characters.lower,
+ Word = converters.Word,
+ Words = converters.Words,
+}
+
+local function nothing(s) return s end -- we already have that one somewhere
+
+-- table.setmetatableindex(methods,function(t,k)
+-- t[k] = nothing
+-- return nothing
+-- end)
+
+local splitter = lpeg.tsplitat(".")
+
+table.setmetatableindex(methods,function(t,k)
+ local s = lpegmatch(splitter,k)
+ local v = global
+ for i=1,#s do
+ v = v[s[i]]
+ if not v then
+ break
+ end
+ end
+ if not v or v == global then
+ v = nothing
+ end
+ t[k] = v
+ return v
+end)
+
+local whitespace = lpeg.patterns.whitespace^0
+local separator = whitespace * P("->") * whitespace
+local pair = C((1-separator)^1) * separator * C(P(1)^0)
+local list = Ct((C((1-separator)^1) * separator)^1) * C(P(1)^0)
+
+local pattern = Carg(1) * pair / function(methods,operation,str)
+ return methods[operation](str) or str
+end
+
+local function apply(str,m)
+ return lpegmatch(pattern,str,1,m or methods) or str
+end
+
+local function splitspecification(field,m)
+ local m, f = lpegmatch(list,field,1,m or methods)
+ if m then
+ return m, f or field
+ else
+ return nil, field
+ end
+end
+
+local function applyspecification(actions,str)
+ if actions then
+ for i=1,#actions do
+ local action = methods[actions[i]]
+ if action then
+ str = action(str) or str
+ end
+ end
+ end
+ return str
+end
+
+if not typesetters then typesetters = { } end
+
+typesetters.manipulators = {
+ methods = methods,
+ apply = apply,
+ patterns = {
+ pair = pair,
+ list = list,
+ },
+ splitspecification = splitspecification,
+ applyspecification = applyspecification,
+}
+
+local pattern = Cs((1 - P(1) * P(-1))^0 * (P(".")/"" + P(1)))
+
+methods.stripperiod = function(str) return lpegmatch(pattern,str) end
+
+-- print(apply("hans"))
+-- print(apply("uppercase->hans"))
+-- print(apply("string.reverse -> hans"))
+-- print(apply("uppercase->hans",{ uppercase = string.reverse } ))
+
+-- print(applyspecification(splitspecification("hans")))
+-- print(applyspecification(splitspecification("lowercase->uppercase->hans")))
+-- print(applyspecification(splitspecification("uppercase->stripperiod->hans.")))
+
+function commands.manipulated(str)
+ context(apply(str))
+end
diff --git a/Master/texmf-dist/tex/context/base/typo-mar.lua b/Master/texmf-dist/tex/context/base/typo-mar.lua
index 4ea6b1e1d86..fed9e0745d6 100644
--- a/Master/texmf-dist/tex/context/base/typo-mar.lua
+++ b/Master/texmf-dist/tex/context/base/typo-mar.lua
@@ -77,6 +77,7 @@ local format, validstring = string.format, string.valid
local insert, remove = table.insert, table.remove
local setmetatable, next = setmetatable, next
local formatters = string.formatters
+local toboolean = toboolean
local attributes, nodes, node, variables = attributes, nodes, node, variables
@@ -115,6 +116,7 @@ local v_continue = variables.continue
local v_first = variables.first
local v_text = variables.text
local v_column = variables.column
+local v_line = variables.line
local nuts = nodes.nuts
local nodepool = nuts.pool
@@ -165,9 +167,6 @@ local localpar_code = whatsitcodes.localpar
local nodepool = nuts.pool
local new_kern = nodepool.kern
-local new_glue = nodepool.glue
-local new_penalty = nodepool.penalty
-local new_stretch = nodepool.stretch
local new_usernumber = nodepool.usernumber
local new_latelua = nodepool.latelua
@@ -177,8 +176,6 @@ local texgetcount = tex.getcount
local texgetdimen = tex.getdimen
local texget = tex.get
-local points = number.points
-
local isleftpage = layouts.status.isleftpage
local registertogether = builders.paragraphs.registertogether -- tonode
@@ -374,11 +371,13 @@ end
local status, nofstatus = { }, 0
local f_anchor = formatters["_plib_.set('md:h',%i,{x=true,c=true})"]
+
local function setanchor(h_anchor)
return new_latelua(f_anchor(h_anchor))
end
-- local t_anchor = { x = true, c = true }
+--
-- local function setanchor(h_anchor)
-- return lateluafunction(function() setposition("md:h",h_anchor,t_anchor) end)
-- end
@@ -449,7 +448,7 @@ local function realign(current,candidate)
anchor = v_text
end
if inline or anchor ~= v_text or candidate.psubtype == alignment_code then
- -- the alignment_code check catches margintexts ste before a tabulate
+ -- the alignment_code check catches margintexts before a tabulate
h_anchors = h_anchors + 1
anchornode = setanchor(h_anchors)
local blob = getposition('md:h',h_anchors)
@@ -555,6 +554,9 @@ end
local function inject(parent,head,candidate)
local box = candidate.box
+ if not box then
+ return head, nil, false -- we can have empty texts
+ end
local width = getfield(box,"width")
local height = getfield(box,"height")
local depth = getfield(box,"depth")
@@ -574,6 +576,11 @@ local function inject(parent,head,candidate)
nofdelayed = nofdelayed + 1
status[nofstatus] = candidate
-- yet untested
+ baseline = tonumber(baseline)
+ if not baseline then
+ baseline = toboolean(baseline)
+ end
+ --
if baseline == true then
baseline = false
-- hbox vtop
@@ -600,10 +607,10 @@ local function inject(parent,head,candidate)
-- offset = offset + height
end
if stack == v_yes then
- offset = offset + candidate.dy
+ offset = offset + candidate.dy -- always
shift = shift + offset
elseif stack == v_continue then
- offset = offset + candidate.dy
+ offset = offset + candidate.dy -- always
if firstonstack then
offset = offset + getovershoot(location)
end
@@ -620,9 +627,19 @@ local function inject(parent,head,candidate)
if trace_margindata then
report_margindata("top aligned by %p",delta)
end
- if delta < candidate.threshold then
+ if delta < candidate.threshold then -- often we need a negative threshold here
shift = shift + voffset + delta
end
+ elseif method == v_line then
+ if getfield(parent,"depth") == 0 then
+ local delta = height - getfield(parent,"height")
+ if trace_margindata then
+ report_margindata("top aligned by %p (no depth)",delta)
+ end
+ if delta < candidate.threshold then -- often we need a negative threshold here
+ shift = shift + voffset + delta
+ end
+ end
elseif method == v_first then
if baseline then
shift = shift + voffset + height - baseline -- option
@@ -740,17 +757,23 @@ local function flushed(scope,parent) -- current is hlist
for l=1,#locations do
local location = locations[l]
local store = displaystore[category][location][scope]
- while true do
- local candidate = remove(store,1) -- brr, local stores are sparse
- if candidate then -- no vpack, as we want to realign
- head, room, con = inject(parent,head,candidate)
- done = true
- continue = continue or con
- nofstored = nofstored - 1
- registertogether(tonode(parent),room) -- !! tonode
- else
- break
+ if store then
+ while true do
+ local candidate = remove(store,1) -- brr, local stores are sparse
+ if candidate then -- no vpack, as we want to realign
+ head, room, con = inject(parent,head,candidate)
+ done = true
+ continue = continue or con
+ nofstored = nofstored - 1
+ if room then
+ registertogether(tonode(parent),room) -- !! tonode
+ end
+ else
+ break
+ end
end
+ else
+ -- report_margindata("fatal error: invalid category %a",category or "?")
end
end
end
@@ -836,15 +859,15 @@ function margins.globalhandler(head,group) -- check group
end
return head, false
elseif group == "hmode_par" then
- return handler("global",head,group)
+ return handler(v_global,head,group)
elseif group == "vmode_par" then -- experiment (for alignments)
- return handler("global",head,group)
+ return handler(v_global,head,group)
-- this needs checking as we then get quite some one liners to process and
-- we cannot look ahead then:
elseif group == "box" then -- experiment (for alignments)
- return handler("global",head,group)
+ return handler(v_global,head,group)
elseif group == "alignment" then -- experiment (for alignments)
- return handler("global",head,group)
+ return handler(v_global,head,group)
else
if trace_margingroup then
report_margindata("ignored 2, group %a, stored %s, inhibit %a",group,nofstored,inhibit)
@@ -885,9 +908,9 @@ function margins.finalhandler(head)
-- if trace_margindata then
-- report_margindata("flushing stage two, instore: %s, delayed: %s",nofstored,nofdelayed)
-- end
-head = tonut(head)
-local head, done = finalhandler(head)
-head = tonode(head)
+ head = tonut(head)
+ local head, done = finalhandler(head)
+ head = tonode(head)
return head, done
else
return head, false
@@ -928,4 +951,32 @@ statistics.register("margin data", function()
end
end)
-commands.savemargindata = margins.save
+interfaces.implement {
+ name = "savemargindata",
+ actions = margins.save,
+ arguments = {
+ {
+ { "location" },
+ { "method" },
+ { "category" },
+ { "name" },
+ { "scope" },
+ { "number", "integer" },
+ { "margin" },
+ { "distance", "dimen" },
+ { "hoffset", "dimen" },
+ { "voffset", "dimen" },
+ { "dy", "dimen" },
+ { "bottomspace", "dimen" },
+ { "baseline"}, -- dimen or string or
+ { "threshold", "dimen" },
+ { "inline", "boolean" },
+ { "anchor" },
+ -- { "leftskip", "dimen" },
+ -- { "rightskip", "dimen" },
+ { "align" },
+ { "line", "integer" },
+ { "stack" },
+ }
+ }
+}
diff --git a/Master/texmf-dist/tex/context/base/typo-mar.mkiv b/Master/texmf-dist/tex/context/base/typo-mar.mkiv
index 2b89f57774d..d5869b45998 100644
--- a/Master/texmf-dist/tex/context/base/typo-mar.mkiv
+++ b/Master/texmf-dist/tex/context/base/typo-mar.mkiv
@@ -14,6 +14,8 @@
%C details.
% todo: tags
+% todo: force inline with option (saves pos)
+% todo: margintitle (also less position then)
\writestatus{loading}{ConTeXt Typesetting Macros / Margindata}
@@ -113,7 +115,7 @@
\c!color=, % maybe \maintextcolor
% \c!name=,
% \c!category=,
- \c!threshold=.25ex,
+ \c!threshold=.25\exheight,
\c!margin=\v!normal,
\c!scope=\v!global,
\c!width=,
@@ -163,7 +165,7 @@
\unexpanded\def\typo_margins_data_synchronize
{\doforcedtrackpagestate\s!margintext\nofmargintexts % includes increment
\docheckpagestate\s!margintext\nofmargintexts
- %\doifrightpagestateelse\s!margintext\nofmargintexts\relax\relax
+ %\doifelserightpagestate\s!margintext\nofmargintexts\relax\relax
\realpageno\realpagestateno
\swapmargins}
@@ -199,13 +201,13 @@
\strc_references_set_page_only_destination_box_attribute\currentmarginreference\currentmarginreference
\fi
\edef\currentmargindatastrut{\margindataparameter\c!strut}%
- \dostarttagged\t!margintext\currentmargindata
+ \dostarttaggedchained\t!margintext\currentmargindata\??margindata
\ifcsname\currentmarginframedhash\s!parent\endcsname
\setbox\nextbox\hbox \currentmarginreference \bgroup
\the\everymargindatacontent
\usemargindatastyleandcolor\c!style\c!color
\setupcurrentmarginframed[\c!location=\v!normal,#textparameters]%
-\typo_margins_data_synchronize
+ \typo_margins_data_synchronize
\inheritedmarginframedframed\bgroup
\ifx\currentmargindatastrut\empty \else
\synchronizestrut\currentmargindatastrut
@@ -221,7 +223,7 @@
\edef\currentmargindatawidth{\margindataparameter\c!width}%
\ifx\currentmargindatawidth\empty
\setbox\nextbox\hbox \currentmarginreference \bgroup
-\typo_margins_data_synchronize
+ \typo_margins_data_synchronize
\the\everymargindatacontent
\usemargindatastyleandcolor\c!style\c!color
\ifx\currentmargindatastrut\empty \else
@@ -235,7 +237,7 @@
\let\currentmarginfirstheight\empty
\else
\setbox\nextbox\hbox \currentmarginreference \bgroup
-\typo_margins_data_synchronize
+ \typo_margins_data_synchronize
\dosetraggedcommand{\margindataparameter\c!align}%
\vtop \bgroup
\the\everymargindatacontent
@@ -258,49 +260,49 @@
\fi
\ifdone
\anch_positions_initialize % we use positions at the lua end
- \ctxcommand{savemargindata{
- location = "\margindataparameter\c!location",
- method = "\margindataparameter\c!method",
- category = "\margindataparameter\c!category",
- name = "\margindataparameter\c!name",
- scope = "\margindataparameter\c!scope",
- number = \number\nextbox,
- margin = "\margindataparameter\c!margin", % local normal margin edge
- distance = \number\dimexpr\margindataparameter\c!distance,
- hoffset = \number\dimexpr\margindataparameter\c!hoffset,
- voffset = \number\dimexpr\margindataparameter\c!voffset,
- dy = \number\dimexpr\margindataparameter\c!dy,
- bottomspace = \number\dimexpr\margindataparameter\c!bottomspace,
+ \clf_savemargindata
+ location {\margindataparameter\c!location}%
+ method {\margindataparameter\c!method}%
+ category {\margindataparameter\c!category}%
+ name {\margindataparameter\c!name}%
+ scope {\margindataparameter\c!scope}%
+ number \nextbox
+ margin {\margindataparameter\c!margin}% local normal margin edge
+ distance \dimexpr\margindataparameter\c!distance\relax
+ hoffset \dimexpr\margindataparameter\c!hoffset\relax
+ voffset \dimexpr\margindataparameter\c!voffset\relax
+ dy \dimexpr\margindataparameter\c!dy\relax
+ bottomspace \dimexpr\margindataparameter\c!bottomspace\relax
\ifx\currentmarginfirstheight\empty \else
- baseline = \currentmarginfirstheight,
+ baseline {\currentmarginfirstheight}%
\fi
- threshold = \number\dimexpr\margindataparameter\c!threshold, % overlap related, will change
+ threshold \dimexpr\margindataparameter\c!threshold\relax % overlap related, will change
\ifhmode
- inline = true,
+ inline true %
\fi
- anchor = "\margindataparameter\c!anchor",
+ anchor {\margindataparameter\c!anchor}%
%
% we're not in forgetall
%
% \ifzeropt\leftskip \else
- % leftskip = \number\leftskip,
+ % leftskip \dimexpr\leftskip\relax
% \fi
% \ifzeropt\leftskip \else
- % rightskip = \number\rightskip,
+ % rightskip \dimexpr\rightskip\relax
% \fi
- align = "\margindataparameter\c!align",
- line = \number\margindataparameter\c!line,
- stack = "\margindataparameter\c!stack",
- }}%
+ align {\margindataparameter\c!align}%
+ line \numexpr\margindataparameter\c!line\relax
+ stack {\margindataparameter\c!stack}%
+ \relax
\else
- \ctxcommand{savemargindata{
- location = "\margindataparameter\c!location",
- method = "\margindataparameter\c!method",
- category = "\margindataparameter\c!category",
- name = "\margindataparameter\c!name",
- scope = "\margindataparameter\c!scope",
- number = \number\nextbox,
- }}%
+ \clf_savemargindata
+ location {\margindataparameter\c!location}%
+ method {\margindataparameter\c!method}%
+ category {\margindataparameter\c!category}%
+ name {\margindataparameter\c!name}%
+ scope {\margindataparameter\c!scope}%
+ number \nextbox
+ \relax
\fi
\endgroup}
diff --git a/Master/texmf-dist/tex/context/base/typo-pag.lua b/Master/texmf-dist/tex/context/base/typo-pag.lua
index 5b96e9c2113..53f79fcfc69 100644
--- a/Master/texmf-dist/tex/context/base/typo-pag.lua
+++ b/Master/texmf-dist/tex/context/base/typo-pag.lua
@@ -52,6 +52,9 @@ trackers.register("parbuilders.keeptogether", function(v) trace_keeptogether =
-- when no hlists are there ? ... maybe the local_par
function parbuilders.registertogether(line,specification) -- might change
+ if not specification then
+ return
+ end
if not enabled then
nodes.tasks.enableaction("finalizers","builders.paragraphs.keeptogether")
end
@@ -87,18 +90,16 @@ function parbuilders.registertogether(line,specification) -- might change
if trace_keeptogether then
local a = a or last
local c = cache[a]
- if trace_keeptogether then
- local noflines = specification.lineheight
- local height = c.height
- local depth = c.depth
- local slack = c.slack
- if not noflines or noflines == 0 then
- noflines = "unknown"
- else
- noflines = math.round((height + depth - slack) / noflines)
- end
- report_keeptogether("registered, index %s, height %p, depth %p, slack %p, noflines %a",a,height,depth,slack,noflines)
+ local noflines = specification.lineheight
+ local height = c.height
+ local depth = c.depth
+ local slack = c.slack
+ if not noflines or noflines == 0 then
+ noflines = "unknown"
+ else
+ noflines = math.round((height + depth - slack) / noflines)
end
+ report_keeptogether("registered, index %s, height %p, depth %p, slack %p, noflines %a",a,height,depth,slack,noflines)
end
end
diff --git a/Master/texmf-dist/tex/context/base/typo-prc.lua b/Master/texmf-dist/tex/context/base/typo-prc.lua
index 959cabbb8e5..cde66df0087 100644
--- a/Master/texmf-dist/tex/context/base/typo-prc.lua
+++ b/Master/texmf-dist/tex/context/base/typo-prc.lua
@@ -6,14 +6,15 @@ if not modules then modules = { } end modules ['typo-prc'] = {
license = "see context related readme files"
}
--- moved from strc-ini.lua
-
-local context, commands = context, commands
-local formatters = string.formatters
local lpegmatch, patterns, P, C, Cs = lpeg.match, lpeg.patterns, lpeg.P, lpeg.C, lpeg.Cs
-- processors: syntax: processor->data ... not ok yet
+local context = context
+local implement = interfaces.implement
+
+local formatters = string.formatters
+
typesetters.processors = typesetters.processors or { }
local processors = typesetters.processors
@@ -21,8 +22,8 @@ local trace_processors = false
local report_processors = logs.reporter("processors")
local registered = { }
-context_applyprocessor = context.applyprocessor
-context_firstofoneargument = context.firstofoneargument
+local ctx_applyprocessor = context.applyprocessor
+local ctx_firstofoneargument = context.firstofoneargument
trackers.register("typesetters.processors", function(v) trace_processors = v end)
@@ -58,7 +59,7 @@ function processors.apply(p,s)
if trace_processors then
report_processors("applying %s processor %a, argument: %s","known",p,s)
end
- context_applyprocessor(p,s)
+ ctx_applyprocessor(p,s)
elseif s then
if trace_processors then
report_processors("applying %s processor %a, argument: %s","unknown",p,s)
@@ -81,21 +82,21 @@ function processors.startapply(p,s)
if trace_processors then
report_processors("start applying %s processor %a","known",p)
end
- context_applyprocessor(p)
+ ctx_applyprocessor(p)
context("{")
return s
elseif p then
if trace_processors then
report_processors("start applying %s processor %a","unknown",p)
end
- context_firstofoneargument()
+ ctx_firstofoneargument()
context("{")
return s
else
if trace_processors then
report_processors("start applying %s processor","ignored")
end
- context_firstofoneargument()
+ ctx_firstofoneargument()
context("{")
return str
end
@@ -124,5 +125,5 @@ end
-- interface
-commands.registerstructureprocessor = processors.register
-commands.resetstructureprocessor = processors.reset
+implement { name = "registerstructureprocessor", actions = processors.register, arguments = "string" }
+implement { name = "resetstructureprocessor", actions = processors.reset, arguments = "string" }
diff --git a/Master/texmf-dist/tex/context/base/typo-prc.mkvi b/Master/texmf-dist/tex/context/base/typo-prc.mkvi
index de221f2419b..49a16569647 100644
--- a/Master/texmf-dist/tex/context/base/typo-prc.mkvi
+++ b/Master/texmf-dist/tex/context/base/typo-prc.mkvi
@@ -13,7 +13,11 @@
\writestatus{loading}{ConTeXt Typesetting Macros / Processors}
+%D For the moment manipulators are loaded here too, as they're in the same
+%D category as processors. This might change. (They are used in publications.)
+
\registerctxluafile{typo-prc}{1.001}
+\registerctxluafile{typo-man}{1.001}
\unprotect
@@ -51,7 +55,7 @@
\appendtoks
\letvalue{\??processorcheck\currentprocessor}\relax
- \ctxcommand{registerstructureprocessor("\currentprocessor")}% global, but it permits using processor that are yet undefined
+ \clf_registerstructureprocessor{\currentprocessor}% global, but it permits using processor that are yet undefined
\to \everydefineprocessor
%D The following command can be used by users but normally it will be
@@ -68,9 +72,12 @@
\fi}
\def\typo_processor_apply
- {\doifelse{\processorparameter\c!state}\v!stop
- \firstofoneargument
- \typo_processor_apply_indeed}
+ {\edef\p_state{\processorparameter\c!state}%
+ \ifx\p_state\v!stop
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\typo_processor_apply_indeed
+ \fi}
\def\typo_processor_apply_indeed#content%
{\begingroup
diff --git a/Master/texmf-dist/tex/context/base/typo-rep.lua b/Master/texmf-dist/tex/context/base/typo-rep.lua
index 15e3f97465e..d95eff68e0f 100644
--- a/Master/texmf-dist/tex/context/base/typo-rep.lua
+++ b/Master/texmf-dist/tex/context/base/typo-rep.lua
@@ -29,7 +29,6 @@ local getchar = nuts.getchar
local getid = nuts.getid
local getattr = nuts.getattr
-local setattr = nuts.setattr
local delete_node = nuts.delete
local replace_node = nuts.replace
@@ -139,4 +138,8 @@ tasks.disableaction("processors","nodes.handlers.stripping")
-- interface
-commands.setcharacterstripping = stripping.set
+interfaces.implement {
+ name = "setcharacterstripping",
+ actions = stripping.set,
+ arguments = "string"
+}
diff --git a/Master/texmf-dist/tex/context/base/typo-rep.mkiv b/Master/texmf-dist/tex/context/base/typo-rep.mkiv
index 46b43949151..c1146997e33 100644
--- a/Master/texmf-dist/tex/context/base/typo-rep.mkiv
+++ b/Master/texmf-dist/tex/context/base/typo-rep.mkiv
@@ -38,7 +38,7 @@
\definesystemattribute[stripping][public]
\unexpanded\def\setcharacterstripping[#1]%
- {\ctxcommand{setcharacterstripping("#1")}}
+ {\clf_setcharacterstripping{#1}}
\unexpanded\def\resetcharacterstripping
{\attribute\strippingattribute\attributeunsetvalue}
diff --git a/Master/texmf-dist/tex/context/base/typo-spa.lua b/Master/texmf-dist/tex/context/base/typo-spa.lua
index eb84eb7d7e3..519ba3f34fb 100644
--- a/Master/texmf-dist/tex/context/base/typo-spa.lua
+++ b/Master/texmf-dist/tex/context/base/typo-spa.lua
@@ -230,6 +230,30 @@ end
-- interface
-commands.definecharacterspacing = spacings.define
-commands.setupcharacterspacing = spacings.setup
-commands.setcharacterspacing = spacings.set
+local implement = interfaces.implement
+
+implement {
+ name = "definecharacterspacing",
+ actions = spacings.define,
+ arguments = "string"
+}
+
+implement {
+ name = "setupcharacterspacing",
+ actions = spacings.setup,
+ arguments = {
+ "string",
+ "integer",
+ {
+ { "left", "number" },
+ { "right", "number" },
+ { "alternative", "integer" },
+ }
+ }
+}
+
+implement {
+ name = "setcharacterspacing",
+ actions = spacings.set,
+ arguments = "string"
+}
diff --git a/Master/texmf-dist/tex/context/base/typo-spa.mkiv b/Master/texmf-dist/tex/context/base/typo-spa.mkiv
index d783353d67d..2e3e71bf3b3 100644
--- a/Master/texmf-dist/tex/context/base/typo-spa.mkiv
+++ b/Master/texmf-dist/tex/context/base/typo-spa.mkiv
@@ -35,7 +35,7 @@
\c!alternative=0]
\unexpanded\def\definecharacterspacing[#1]%
- {\ctxcommand{definecharacterspacing("#1")}}
+ {\clf_definecharacterspacing{#1}}
\unexpanded\def\setupcharacterspacing
{\dotripleargument\typo_characterspacing_setup}
@@ -43,15 +43,19 @@
\def\typo_characterspacing_setup[#1][#2][#3]% todo: #2 list
{\begingroup
\setupcurrent_p_characterspacing[#3]%
- \ctxcommand{setupcharacterspacing("#1",\number#2, { % todo: just pass #3 to the lua end
- left = \direct_p_characterspacingparameter\c!left,
- right = \direct_p_characterspacingparameter\c!right,
- alternative = \direct_p_characterspacingparameter\c!alternative
- })}%
+ \clf_setupcharacterspacing
+ {#1}%
+ \numexpr#2\relax
+ {%
+ left \direct_p_characterspacingparameter\c!left\space
+ right \direct_p_characterspacingparameter\c!right\space
+ alternative \direct_p_characterspacingparameter\c!alternative
+ }%
+ \relax
\endgroup}
\unexpanded\def\setcharacterspacing[#1]% we can store the attribute if we want speed
- {\ctxcommand{setcharacterspacing("#1")}}
+ {\clf_setcharacterspacing{#1}}
\unexpanded\def\resetcharacterspacing % fast one
{\attribute\spacingattribute\attributeunsetvalue}
diff --git a/Master/texmf-dist/tex/context/base/typo-sus.lua b/Master/texmf-dist/tex/context/base/typo-sus.lua
new file mode 100644
index 00000000000..9eef6196bb0
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/typo-sus.lua
@@ -0,0 +1,304 @@
+if not modules then modules = { } end modules ['typo-sus'] = {
+ version = 1.001,
+ comment = "companion to typo-sus.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local punctuation = {
+ po = true,
+}
+
+local openquote = {
+ ps = true,
+ pi = true,
+}
+
+local closequote = {
+ pe = true,
+ pf = true,
+}
+
+local categories = characters.categories
+
+local nodecodes = nodes.nodecodes
+
+local glyph_code = nodecodes.glyph
+local kern_code = nodecodes.kern
+local penalty_code = nodecodes.penalty
+local glue_code = nodecodes.glue
+local math_code = nodecodes.math
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+
+local nuts = nodes.nuts
+local tonut = nodes.tonut
+local tonode = nodes.tonode
+
+local getid = nuts.getid
+local getchar = nuts.getchar
+local getprev = nuts.getprev
+local getnext = nuts.getnext
+local getfield = nuts.getfield
+local getattr = nuts.getattr
+local getfont = nuts.getfont
+local getlist = nuts.getlist
+
+local setfield = nuts.setfield
+local setattr = nuts.setattr
+
+local setcolor = nodes.tracers.colors.set
+local insert_before = nuts.insert_before
+local insert_after = nuts.insert_after
+local end_of_math = nuts.end_of_math
+
+local nodepool = nuts.pool
+
+local new_rule = nodepool.rule
+local new_kern = nodepool.kern
+local new_hlist = nodepool.hlist
+----- new_penalty = nodepool.penalty
+
+local a_characters = attributes.private("characters")
+local a_suspecting = attributes.private('suspecting')
+local a_suspect = attributes.private('suspect')
+local texsetattribute = tex.setattribute
+local enabled = false
+
+local threshold = 65536 / 4
+
+local function special(n)
+ if n then
+ local id = getid(n)
+ if id == kern_code then
+ local kern = getfield(n,"kern")
+ return kern < threshold
+ elseif id == penalty_code then
+ return true
+ elseif id == glue_code then
+ local width = getfield(getfield(n,"spec"),"width")
+ return width < threshold
+ elseif id == hlist_code then
+ local width = getfield(n,"width")
+ return width < threshold
+ end
+ else
+ return false
+ end
+end
+
+local function goback(current)
+ local prev = getprev(current)
+ while prev and special(prev) do
+ prev = getprev(prev)
+ end
+ if prev then
+ return prev, getid(prev)
+ end
+end
+
+local function goforward(current)
+ local next = getnext(current)
+ while next and special(next) do
+ next = getnext(next)
+ end
+ if next then
+ return next, getid(next)
+ end
+end
+
+local function mark(head,current,id,color)
+ if id == glue_code then
+ -- the glue can have stretch and/or shrink so the rule can overlap with the
+ -- following glyph .. no big deal as that one then sits on top of the rule
+ local width = getfield(getfield(current,"spec"),"width")
+ local rule = new_rule(width)
+ local kern = new_kern(-width)
+ head = insert_before(head,current,rule)
+ head = insert_before(head,current,kern)
+ setcolor(rule,color)
+ -- elseif id == kern_code then
+ -- local width = getfield(current,"kern")
+ -- local rule = new_rule(width)
+ -- local kern = new_kern(-width)
+ -- head = insert_before(head,current,rule)
+ -- head = insert_before(head,current,kern)
+ -- setcolor(rule,color)
+ else
+ local width = getfield(current,"width")
+ local extra = fonts.hashes.xheights[getfont(current)] / 2
+ local rule = new_rule(width,getfield(current,"height")+extra,getfield(current,"depth")+extra)
+ local hlist = new_hlist(rule)
+ head = insert_before(head,current,hlist)
+ setcolor(rule,color)
+ setcolor(current,"white")
+ end
+ return head, current
+end
+
+-- we can cache the font and skip ahead to next but it doesn't
+-- save enough time and it makes the code looks bad too ... after
+-- all, we seldom use this
+
+local colors = {
+ "darkred",
+ "darkgreen",
+ "darkblue",
+ "darkcyan",
+ "darkmagenta",
+ "darkyellow",
+ "darkgray",
+ "orange",
+}
+
+local found = 0
+
+function typesetters.marksuspects(head)
+ local head = tonut(head)
+ local current = head
+ local lastdone = nil
+ while current do
+ if getattr(current,a_suspecting) then
+ local id = getid(current)
+ if id == glyph_code then
+ local char = getchar(current)
+ local code = categories[char]
+ local done = false
+ if punctuation[code] then
+ local prev, pid = goback(current)
+ if prev and pid == glue_code then
+ done = 3 -- darkblue
+ elseif prev and pid == math_code then
+ done = 3 -- darkblue
+ else
+ local next, nid = goforward(current)
+ if next and nid ~= glue_code then
+ done = 3 -- darkblue
+ end
+ end
+ elseif openquote[code] then
+ local next, nid = goforward(current)
+ if next and nid == glue_code then
+ done = 1 -- darkred
+ end
+ elseif closequote[code] then
+ local prev, pid = goback(current)
+ if prev and pid == glue_code then
+ done = 1 -- darkred
+ end
+ else
+ local prev, pid = goback(current)
+ if prev then
+ if pid == math_code then
+ done = 7-- darkgray
+ elseif pid == glyph_code and getfont(current) ~= getfont(prev) then
+ if lastdone ~= prev then
+ done = 2 -- darkgreen
+ end
+ end
+ end
+ if not done then
+ local next, nid = goforward(current)
+ if next then
+ if nid == math_code then
+ done = 7 -- darkgray
+ elseif nid == glyph_code and getfont(current) ~= getfont(next) then
+ if lastdone ~= prev then
+ done = 2 -- darkgreen
+ end
+ end
+ end
+ end
+ end
+ if done then
+ setattr(current,a_suspect,done)
+ lastdone = current
+ found = found + 1
+ end
+ current = getnext(current)
+ elseif id == math_code then
+ current = getnext(end_of_math(current))
+ elseif id == glue_code then
+ local a = getattr(current,a_characters)
+ if a then
+ local prev = getprev(current)
+ local prid = prev and getid(prev)
+ local done = false
+ if prid == penalty_code and getfield(prev,"penalty") == 10000 then
+ done = 8 -- orange
+ else
+ done = 5 -- darkmagenta
+ end
+ if done then
+ setattr(current,a_suspect,done)
+ -- lastdone = current
+ found = found + 1
+ end
+ end
+ current = getnext(current)
+ else
+ current = getnext(current)
+ end
+ else
+ current = getnext(current)
+ end
+ end
+ return tonode(head), found > 0
+end
+
+local function showsuspects(head)
+ local current = head
+ while current do
+ local id = getid(current)
+ if id == glyph_code then
+ local a = getattr(current,a_suspect)
+ if a then
+ head, current = mark(head,current,id,colors[a])
+ end
+ elseif id == glue_code then
+ local a = getattr(current,a_suspect)
+ if a then
+ head, current = mark(head,current,id,colors[a])
+ end
+ elseif id == math_code then
+ current = end_of_math(current)
+ elseif id == hlist_code or id == vlist_code then
+ local list = getlist(current)
+ if list then
+ local l = showsuspects(list)
+ if l ~= list then
+ setfield(current,"list",l)
+ end
+ end
+ end
+ current = getnext(current)
+ end
+ return head
+end
+
+function typesetters.showsuspects(head)
+ if found > 0 then
+ return tonode(showsuspects(tonut(head))), true
+ else
+ return head, false
+ end
+end
+
+nodes.tasks.appendaction ("processors","after", "typesetters.marksuspects")
+nodes.tasks.prependaction("shipouts", "normalizers","typesetters.showsuspects")
+
+nodes.tasks.disableaction("processors","typesetters.marksuspects")
+nodes.tasks.disableaction("shipouts", "typesetters.showsuspects")
+
+-- or maybe a directive
+
+trackers.register("typesetters.suspects",function(v)
+ texsetattribute(a_suspecting,v and 1 or unsetvalue)
+ if v and not enabled then
+ nodes.tasks.enableaction("processors","typesetters.marksuspects")
+ nodes.tasks.enableaction("shipouts", "typesetters.showsuspects")
+ enabled = true
+ end
+end)
+
diff --git a/Master/texmf-dist/tex/context/base/typo-sus.mkiv b/Master/texmf-dist/tex/context/base/typo-sus.mkiv
new file mode 100644
index 00000000000..fe44e63277b
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/typo-sus.mkiv
@@ -0,0 +1,51 @@
+%D \module
+%D [ file=typo-sus,
+%D version=2014.11.06,
+%D title=\CONTEXT\ Typesetting Macros,
+%D subtitle=Checking Suspects,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Typesetting Macros / Checking Suspects}
+
+%D This is a rather special module, mostly needed by ourselves for
+%D projects where copy||editing is not that precise.
+
+\registerctxluafile{typo-sus}{1.001}
+
+\unexpanded\def\showsuspects{\enabletrackers[typesetters.suspects]}
+
+%D The suspicious spacing will be colored in the text. There can be false
+%D positives but this features is mostly used when proofreading. So, we
+%D don't worry too much about interference (and efficiency).
+%D
+%D \unexpanded\def\showsample#1%
+%D {\NC \type{#1}%
+%D \NC \enabletrackers[typesetters.suspects]#1\disabletrackers[typesetters.spacing]%
+%D \NC \NR}
+%D
+%D \starttabulate[|||][before=,after=]
+%D \showsample{foo$x$}
+%D \showsample{$x$bar}
+%D \showsample{foo$x$bar}
+%D \showsample{$f+o+o$:}
+%D \showsample{;$f+o+o$}
+%D \showsample{; bar}
+%D \showsample{foo:bar}
+%D \showsample{\quote{ foo }}
+%D \showsample{\quote{bar }}
+%D \showsample{\quote{ bar}}
+%D \showsample{(foo )}
+%D \showsample{\{foo \}}
+%D \showsample{foo{\bf gnu}bar}
+%D \showsample{foo$x^2$bar}
+%D \showsample{foo\nobreakspace bar}
+%D \stoptabulate
+
+\endinput
+
diff --git a/Master/texmf-dist/tex/context/base/typo-tal.lua b/Master/texmf-dist/tex/context/base/typo-tal.lua
index 3a2d80e519e..5663c3bd995 100644
--- a/Master/texmf-dist/tex/context/base/typo-tal.lua
+++ b/Master/texmf-dist/tex/context/base/typo-tal.lua
@@ -6,20 +6,32 @@ if not modules then modules = { } end modules ['typo-tal'] = {
license = "see context related readme files"
}
--- I'll make it a bit more efficient and provide named instances too.
+-- I'll make it a bit more efficient and provide named instances too which is needed for
+-- nested tables.
+--
+-- Currently we have two methods: text and number with some downward compatible
+-- defaulting.
+
+-- We can speed up by saving the current fontcharacters[font] + lastfont.
local next, type = next, type
local div = math.div
local utfbyte = utf.byte
+local splitmethod = utilities.parsers.splitmethod
+
local nodecodes = nodes.nodecodes
local glyph_code = nodecodes.glyph
local glue_code = nodecodes.glue
local fontcharacters = fonts.hashes.characters
-local unicodes = fonts.hashes.unicodes
+----- unicodes = fonts.hashes.unicodes
local categories = characters.categories -- nd
+local variables = interfaces.variables
+local v_text = variables.text
+local v_number = variables.number
+
local nuts = nodes.nuts
local tonut = nuts.tonut
local tonode = nuts.tonode
@@ -62,6 +74,8 @@ local enabled = false
local datasets = false
+local implement = interfaces.implement
+
local comma = 0x002C
local period = 0x002E
local punctuationspace = 0x2008
@@ -80,6 +94,66 @@ local validsigns = {
[0x2213] = 0x2213, -- minusplus
}
+-- If needed we can have more modes which then also means a faster simple handler
+-- for non numbers.
+
+local function setcharacteralign(column,separator)
+ if not enabled then
+ nodes.tasks.enableaction("processors","typesetters.characteralign.handler")
+ enabled = true
+ end
+ if not datasets then
+ datasets = { }
+ end
+ local dataset = datasets[column] -- we can use a metatable
+ if not dataset then
+ local method, token
+ if separator then
+ method, token = splitmethod(separator)
+ if method and token then
+ separator = utfbyte(token) or comma
+ else
+ separator = utfbyte(separator) or comma
+ method = validseparators[separator] and v_number or v_text
+ end
+ else
+ separator = comma
+ method = v_number
+ end
+ dataset = {
+ separator = separator,
+ list = { },
+ maxafter = 0,
+ maxbefore = 0,
+ collected = false,
+ method = method,
+ separators = validseparators,
+ signs = validsigns,
+ }
+ datasets[column] = dataset
+ used = true
+ end
+ return dataset
+end
+
+local function resetcharacteralign()
+ datasets = false
+end
+
+characteralign.setcharacteralign = setcharacteralign
+characteralign.resetcharacteralign = resetcharacteralign
+
+implement {
+ name = "setcharacteralign",
+ actions = setcharacteralign,
+ arguments = { "integer", "string" }
+}
+
+implement {
+ name = "resetcharacteralign",
+ actions = resetcharacteralign
+}
+
local function traced_kern(w)
return tracedrule(w,nil,nil,"darkgray")
end
@@ -102,8 +176,8 @@ function characteralign.handler(originalhead,where)
if not a or a == 0 then
return originalhead, false
end
- local column = div(a,100)
- local row = a % 100
+ local column = div(a,0xFFFF)
+ local row = a % 0xFFFF
local dataset = datasets and datasets[column] or setcharacteralign(column)
local separator = dataset.separator
local list = dataset.list
@@ -114,82 +188,128 @@ function characteralign.handler(originalhead,where)
local c = nil
local current = first
local sign = nil
+ --
+ local validseparators = dataset.separators
+ local validsigns = dataset.signs
+ local method = dataset.method
-- we can think of constraints
- while current do
- local id = getid(current)
- if id == glyph_code then
- local char = getchar(current)
- local font = getfont(current)
- local unicode = unicodes[font][char]
- if not unicode then
- -- no unicode so forget about it
- elseif unicode == separator then
- c = current
- if trace_split then
- setcolor(current,"darkred")
- end
- dataset.hasseparator = true
- elseif categories[unicode] == "nd" or validseparators[unicode] then
- if c then
- if not a_start then
- a_start = current
- end
- a_stop = current
+ if method == v_number then
+ while current do
+ local id = getid(current)
+ if id == glyph_code then
+ local char = getchar(current)
+ local font = getfont(current)
+ -- local unicode = unicodes[font][char]
+ local unicode = fontcharacters[font][char].unicode or char -- ignore tables
+ if not unicode then
+ -- no unicode so forget about it
+ elseif unicode == separator then
+ c = current
if trace_split then
- setcolor(current,validseparators[unicode] and "darkcyan" or "darkblue")
+ setcolor(current,"darkred")
end
- else
- if not b_start then
- if sign then
- b_start = sign
- local new = validsigns[getchar(sign)]
- if char == new or not fontcharacters[getfont(sign)][new] then
- if trace_split then
- setcolor(sign,"darkyellow")
+ dataset.hasseparator = true
+ elseif categories[unicode] == "nd" or validseparators[unicode] then
+ if c then
+ if not a_start then
+ a_start = current
+ end
+ a_stop = current
+ if trace_split then
+ setcolor(current,validseparators[unicode] and "darkcyan" or "darkblue")
+ end
+ else
+ if not b_start then
+ if sign then
+ b_start = sign
+ local new = validsigns[getchar(sign)]
+ if char == new or not fontcharacters[getfont(sign)][new] then
+ if trace_split then
+ setcolor(sign,"darkyellow")
+ end
+ else
+ setfield(sign,"char",new)
+ if trace_split then
+ setcolor(sign,"darkmagenta")
+ end
end
+ sign = nil
+ b_stop = current
else
- setfield(sign,"char",new)
- if trace_split then
- setcolor(sign,"darkmagenta")
- end
+ b_start = current
+ b_stop = current
end
- sign = nil
- b_stop = current
else
- b_start = current
b_stop = current
- if trace_split then
- setcolor(current,validseparators[unicode] and "darkcyan" or "darkblue")
- end
end
- else
- b_stop = current
- if trace_split then
+ if trace_split and current ~= sign then
setcolor(current,validseparators[unicode] and "darkcyan" or "darkblue")
end
end
+ elseif not b_start then
+ sign = validsigns[unicode] and current
+ -- if trace_split then
+ -- setcolor(current,"darkgreen")
+ -- end
+ end
+ elseif (b_start or a_start) and id == glue_code then
+ -- maybe only in number mode
+ -- somewhat inefficient
+ local next = getnext(current)
+ local prev = getprev(current)
+ if next and prev and getid(next) == glyph_code and getid(prev) == glyph_code then -- too much checking
+ local width = fontcharacters[getfont(b_start)][separator or period].width
+ -- local spec = getfield(current,"spec")
+ -- free_spec(spec)
+ setfield(current,"spec",new_gluespec(width))
+ setattr(current,a_character,punctuationspace)
+ if a_start then
+ a_stop = current
+ elseif b_start then
+ b_stop = current
+ end
end
- elseif not b_start then
- sign = validsigns[unicode] and current
end
- elseif (b_start or a_start) and id == glue_code then
- -- somewhat inefficient
- local next = getnext(current)
- local prev = getprev(current)
- if next and prev and getid(next) == glyph_code and getid(prev) == glyph_code then -- too much checking
- local width = fontcharacters[getfont(b_start)][separator or period].width
- -- local spec = getfield(current,"spec")
- -- free_spec(spec)
- setfield(current,"spec",new_gluespec(width))
- setattr(current,a_character,punctuationspace)
- if a_start then
- a_stop = current
- elseif b_start then
- b_stop = current
+ current = getnext(current)
+ end
+ else
+ while current do
+ local id = getid(current)
+ if id == glyph_code then
+ local char = getchar(current)
+ local font = getfont(current)
+ -- local unicode = unicodes[font][char]
+ local unicode = fontcharacters[font][char].unicode or char -- ignore tables
+ if not unicode then
+ -- no unicode so forget about it
+ elseif unicode == separator then
+ c = current
+ if trace_split then
+ setcolor(current,"darkred")
+ end
+ dataset.hasseparator = true
+ else
+ if c then
+ if not a_start then
+ a_start = current
+ end
+ a_stop = current
+ if trace_split then
+ setcolor(current,"darkgreen")
+ end
+ else
+ if not b_start then
+ b_start = current
+ end
+ b_stop = current
+ if trace_split then
+ setcolor(current,"darkblue")
+ end
+ end
end
end
+ current = getnext(current)
end
- current = getnext(current)
end
local entry = list[row]
if entry then
@@ -215,7 +335,7 @@ function characteralign.handler(originalhead,where)
local maxafter = dataset.maxafter
local before = entry.before or 0
local after = entry.after or 0
- local new_kern = trace_split and traced_kern or new_kern
+ local new_kern = trace_split and traced_kern or new_kern
if b_start then
if before < maxbefore then
head = insert_node_before(head,b_start,new_kern(maxbefore-before))
@@ -269,37 +389,3 @@ function characteralign.handler(originalhead,where)
end
return tonode(head), true
end
-
-function setcharacteralign(column,separator)
- if not enabled then
- nodes.tasks.enableaction("processors","typesetters.characteralign.handler")
- enabled = true
- end
- if not datasets then
- datasets = { }
- end
- local dataset = datasets[column] -- we can use a metatable
- if not dataset then
- dataset = {
- separator = separator and utfbyte(separator) or comma,
- list = { },
- maxafter = 0,
- maxbefore = 0,
- collected = false,
- }
- datasets[column] = dataset
- used = true
- end
- return dataset
-end
-
-local function resetcharacteralign()
- datasets = false
-end
-
-characteralign.setcharacteralign = setcharacteralign
-characteralign.resetcharacteralign = resetcharacteralign
-
-commands.setcharacteralign = setcharacteralign
-commands.resetcharacteralign = resetcharacteralign
-
diff --git a/Master/texmf-dist/tex/context/base/typo-tal.mkiv b/Master/texmf-dist/tex/context/base/typo-tal.mkiv
index 7de10a6ec1d..570f1a1f56e 100644
--- a/Master/texmf-dist/tex/context/base/typo-tal.mkiv
+++ b/Master/texmf-dist/tex/context/base/typo-tal.mkiv
@@ -40,25 +40,26 @@
%D
%D \typebuffer \blank \getbuffer \blank
-%D \startbuffer
-%D \bTABLE
-%D \bTR \bTD[aligncharacter=yes] € 1,1 \eTD \eTR
-%D \bTR \bTD[aligncharacter=yes] € 11,11 \eTD \eTR
-%D \bTR \bTD[aligncharacter=yes] € 12\punctuationspace111,11 \eTD \eTR
-%D \bTR \bTD[aligncharacter=yes] € 12 111,11 \eTD \eTR
-%D \bTR \bTD[aligncharacter=yes] € 1.234.451,22222 \eTD \eTR
-%D \bTR \bTD[aligncharacter=yes] € 234.451,2 \eTD \eTR
-%D \bTR \bTD[aligncharacter=yes] € 234.451 \eTD \eTR
-%D \bTR \bTD[aligncharacter=yes] € 451 \eTD \eTR
-%D \bTR \bTD \bf some text \eTD \eTR
-%D \eTABLE
-%D \stopbuffer
-%D
-%D \typebuffer \blank \getbuffer \blank
-
-\unexpanded\def\signalcharacteralign#1#2{\attribute\characteralignattribute=\numexpr#1*\plushundred+#2\relax}
-\unexpanded\def\setcharacteralign #1#2{\ctxcommand{setcharacteralign(\number#1,"#2")}}
-\unexpanded\def\resetcharacteralign {\ctxcommand{resetcharacteralign()}}
+% D \startbuffer
+% D \bTABLE
+% D \bTR \bTD[aligncharacter=yes] € 1,1 \eTD \eTR
+% D \bTR \bTD[aligncharacter=yes] € 11,11 \eTD \eTR
+% D \bTR \bTD[aligncharacter=yes] € 12\punctuationspace111,11 \eTD \eTR
+% D \bTR \bTD[aligncharacter=yes] € 12 111,11 \eTD \eTR
+% D \bTR \bTD[aligncharacter=yes] € 1.234.451,22222 \eTD \eTR
+% D \bTR \bTD[aligncharacter=yes] € 234.451,2 \eTD \eTR
+% D \bTR \bTD[aligncharacter=yes] € 234.451 \eTD \eTR
+% D \bTR \bTD[aligncharacter=yes] € 451 \eTD \eTR
+% D \bTR \bTD \bf some text \eTD \eTR
+% D \eTABLE
+% D \stopbuffer
+% D
+% D \typebuffer \blank \getbuffer \blank
+
+\unexpanded\def\signalcharacteralign#1#2{\attribute\characteralignattribute\numexpr#1*\maxcardminusone+#2\relax} % 0xFFFF
+\unexpanded\def\setcharacteralign #1#2{\clf_setcharacteralign#1{#2}}
+\unexpanded\def\resetcharacteralign {\clf_resetcharacteralign}
+\unexpanded\def\nocharacteralign {\attribute\characteralignattribute\attributeunsetvalue}
%D Mostly downward compatible:
%D
@@ -73,6 +74,15 @@
%D
%D \typebuffer \blank \getbuffer \blank
+%D We have (currently) two modes: \type {text} and \type {number}. The handler tries
+%D to determine the mode automatically. When using periods and commas as separators
+%D the \type {number} mode is chosen. If you use for instance a \type {-} as
+%D separator, \type {text} is chosen, but you can enforce \type {number} with \type
+%D {number->-} (as with other mechanisms, the arrow indicates a methot to apply).
+%D
+%D One can use \type {\nocharacteralign} to disable this mechanism, for instance in
+%D a table cell.
+
\def\alignmentcharacter{,}
\unexpanded\def\typo_charalign_pass_one
@@ -86,19 +96,26 @@
\def\typo_charalign_pass
{\hbox\bgroup\signalcharacteralign\plusone\scratchcounter\let\next}
-\unexpanded\def\startcharacteralign#1\stopcharacteralign
+\unexpanded\def\startcharacteralign
+ {\dosingleempty\typo_charalign_start}
+
+\def\typo_charalign_start[#1]#2\stopcharacteralign
{\bgroup
+ \edef\m_temp{#1}%
+ \ifx\m_temp\empty \else
+ \let\alignmentcharacter\m_temp
+ \fi
\setcharacteralign\plusone\alignmentcharacter
\begingroup
\scratchcounter\zerocount
\let\checkcharacteralign\typo_charalign_pass_one
\settrialtypesetting
- #1\relax
+ #2\relax
\endgroup
\begingroup
\scratchcounter\zerocount
\let\checkcharacteralign\typo_charalign_pass_two
- #1\relax
+ #2\relax
\endgroup
\resetcharacteralign
\egroup}
diff --git a/Master/texmf-dist/tex/context/base/typo-txt.mkvi b/Master/texmf-dist/tex/context/base/typo-txt.mkvi
index fa79a4f6b87..7562fe70cd0 100644
--- a/Master/texmf-dist/tex/context/base/typo-txt.mkvi
+++ b/Master/texmf-dist/tex/context/base/typo-txt.mkvi
@@ -194,4 +194,51 @@
%D \HL
%D \stoptabulate
+%D This is used in the beginners manual. One needs to set the font size to an
+%D acceptable value for this to work.
+
+\unexpanded\def\startnicelyfilledbox
+ {\vbox\bgroup
+ \forgetall
+ \dosingleempty\dostartnicelyfilledbox}
+
+\def\dostartnicelyfilledbox[#1]%
+ {\letdummyparameter\c!width \hsize
+ \letdummyparameter\c!height\vsize
+ \letdummyparameter\c!offset\exheight % we obey to the outer exheight
+ \letdummyparameter\c!strut \v!yes % we obey to the inner strut !
+ \getdummyparameters[#1]%
+ \scratchoffset\dummyparameter\c!offset\relax
+ \setbox\scratchbox\vbox to \dummyparameter\c!height \bgroup
+ \hsize\dummyparameter\c!width\relax
+ \emergencystretch10\scratchoffset
+ \parfillskip\zeropoint
+ \baselineskip\zeropoint plus \onepoint minus \onepoint
+ \beginofshapebox
+ \leftskip \scratchoffset
+ \rightskip\scratchoffset}
+
+\unexpanded\def\stopnicelyfilledbox
+ {\doifelse{\dummyparameter\c!strut}\v!yes
+ {\xdef\doflushnicelyfilledbox
+ {\ht\shapebox\the\strutht
+ \dp\shapebox\the\strutdp
+ \box\shapebox}}%
+ {\gdef\doflushnicelyfilledbox
+ {\box\shapebox}}%
+ \endofshapebox
+ \doreshapebox
+ {\doflushnicelyfilledbox}
+ {\penalty\shapepenalty}
+ {\kern\shapekern}
+ {\vfil}%
+ \kern\scratchoffset
+ \vfilneg
+ \flushshapebox
+ \vfilneg
+ \kern\scratchoffset
+ \egroup
+ \box\scratchbox
+ \egroup}
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/typo-wrp.lua b/Master/texmf-dist/tex/context/base/typo-wrp.lua
new file mode 100644
index 00000000000..07639392ff7
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/typo-wrp.lua
@@ -0,0 +1,76 @@
+if not modules then modules = { } end modules ['typo-wrp'] = {
+ version = 1.001,
+ comment = "companion to typo-wrp.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- begin/end par wrapping stuff ... more to come
+
+local nodecodes = nodes.nodecodes
+
+local glue_code = nodecodes.glue
+local penalty_code = nodecodes.penalty
+local parfill_skip_code = nodes.gluecodes.parfillskip
+local user_penalty_code = nodes.penaltycodes.userpenalty
+
+local nuts = nodes.nuts
+local tonut = nodes.tonut
+local tonode = nodes.tonode
+
+local findtail = nuts.tail
+local getprev = nuts.getprev
+local getid = nuts.getid
+local getsubtype = nuts.getsubtype
+local getfield = nuts.getfield
+local remove = nuts.remove
+
+local wrappers = { }
+typesetters.wrappers = wrappers
+
+local trace_wrappers = trackers.register("typesetters.wrappers",function(v) trace_wrappers = v end)
+
+local report = logs.reporter("paragraphs","wrappers")
+
+-- we really need to pass tail too ... but then we need to check all the plugins
+-- bah ... slowdown
+
+local function remove_dangling_crlf(head,tail)
+ if tail and getid(tail) == glue_code and getsubtype(tail) == parfill_skip_code then
+ tail = getprev(tail)
+ if tail and getid(tail) == penalty_code and getsubtype(tail) == user_penalty_code and getfield(tail,"penalty") == 10000 then
+ tail = getprev(tail)
+ if tail and getid(tail) == penalty_code and getsubtype(tail) == user_penalty_code and getfield(tail,"penalty") == -10000 then
+ if tail == head then
+ -- can't happen
+ else
+ if trace_wrappers then
+ report("removing a probably unwanted end-of-par break in line %s (guess)",tex.inputlineno)
+ end
+ remove(head,tail,true)
+ return head, tail, true
+ end
+ end
+ end
+ end
+ return head, tail, false
+end
+
+function wrappers.handler(head)
+ local head = tonut(head)
+ if head then
+ local tail = findtail(head)
+ local done = false
+ head, tail, done = remove_dangling_crlf(head,tail) -- will be action chain
+ end
+ return head, true
+end
+
+interfaces.implement {
+ name = "enablecrlf",
+ onlyonce = true,
+ actions = function()
+ nodes.tasks.enableaction("processors","typesetters.wrappers.handler")
+ end
+}
diff --git a/Master/texmf-dist/tex/context/base/typo-wrp.mkiv b/Master/texmf-dist/tex/context/base/typo-wrp.mkiv
new file mode 100644
index 00000000000..0538a966273
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/typo-wrp.mkiv
@@ -0,0 +1,65 @@
+%D \module
+%D [ file=typo-wrp,
+%D version=2014.11.09,
+%D title=\CONTEXT\ Typesetting Macros,
+%D subtitle=Wrappers,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Typesetting Macros / Wrapping}
+
+\unprotect
+
+\registerctxluafile{typo-wrp}{1.001}
+
+%D This definition has moved from page-lin.tex to spac-hor.tex (due to
+%D visualization added in august 2003) and now to here (november 2014)
+%D due to cacthing border cases in dirty and messy \XML\ sources).
+
+% \unexpanded\def\crlf
+% {\ifhmode
+% \unskip
+% \prewordbreak\crlfplaceholder
+% \ifcase\raggedstatus\hfil\or\or\or\hfil\fi
+% \break
+% \else
+% \crlfplaceholder
+% \endgraf
+% \fi}
+
+\unexpanded\def\crlf
+ {\ifhmode
+ \expandafter\spac_crlf
+ \fi}
+
+\unexpanded\def\spac_crlf
+ {\clf_enablecrlf % once
+ \unskip
+ \prewordbreak % here or in \spac_crlf_placeholder
+ \spac_crlf_placeholder
+ \ifcase\raggedstatus\hfil\or\or\or\hfil\fi
+ \break
+ \ignorespaces}
+
+\unexpanded\def\spac_crlf_placeholder
+ {\strut}
+
+\unexpanded\def\spac_crlf_placeholder_show
+ {\hbox to \zeropoint{\strut{\infofont\kern.25\emwidth}\lohi{\infofont CR}{\infofont LF}\hss}}
+
+\unexpanded\def\settestcrlf
+ {\let\spac_crlf_placeholder\spac_crlf_placeholder_show}
+
+\unexpanded\def\crlfplaceholder % for old times sake
+ {\spac_crlf_placeholder}
+
+\appendtoks
+ \let\spac_crlf_placeholder\empty
+\to \everysetnostrut
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/unic-ini.lua b/Master/texmf-dist/tex/context/base/unic-ini.lua
index cca1f06175a..132c92efaab 100644
--- a/Master/texmf-dist/tex/context/base/unic-ini.lua
+++ b/Master/texmf-dist/tex/context/base/unic-ini.lua
@@ -11,9 +11,13 @@ local utfchar = utf.char
-- Beware, initializing unicodechar happens at first usage and takes
-- 0.05 -- 0.1 second (lots of function calls).
-function commands.unicodechar(asked)
- local n = characters.unicodechar(asked)
- if n then
- context(utfchar(n))
+interfaces.implement {
+ name = "unicodechar",
+ arguments = "string",
+ actions = function(asked)
+ local n = characters.unicodechar(asked)
+ if n then
+ context(utfchar(n))
+ end
end
-end
+}
diff --git a/Master/texmf-dist/tex/context/base/unic-ini.mkiv b/Master/texmf-dist/tex/context/base/unic-ini.mkiv
index ece0da28355..13ad4bdb98f 100644
--- a/Master/texmf-dist/tex/context/base/unic-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/unic-ini.mkiv
@@ -26,8 +26,7 @@
%D
%D \typebuffer \getbuffer
-%def\unicodechar#1{\char\numexpr#1\relax} % no lookahead
-\def\unicodechar#1{\ctxcommand{unicodechar("#1")}}
+\def\unicodechar#1{\clf_unicodechar{#1}}
\unexpanded\def\unknownchar
{\dontleavehmode\hbox{\vrule\s!width.5\emwidth\s!height\exheight\s!depth\zeropoint}}
diff --git a/Master/texmf-dist/tex/context/base/util-dim.lua b/Master/texmf-dist/tex/context/base/util-dim.lua
index 69061495f94..2bdb870e7a4 100644
--- a/Master/texmf-dist/tex/context/base/util-dim.lua
+++ b/Master/texmf-dist/tex/context/base/util-dim.lua
@@ -24,13 +24,15 @@ local formatters = string.formatters
local texget = tex and tex.get or function() return 65536*10*100 end
+local p_stripzeros = lpeg.patterns.stripzeros
+
--this might become another namespace
number = number or { }
local number = number
-number.tonumberf = function(n) return match(format("%.20f",n),"(.-0?)0*$") end -- one zero too much but alas
-number.tonumberg = function(n) return format("%.20g",n) end
+number.tonumberf = function(n) return lpegmatch(p_stripzeros,format("%.20f",n)) end
+number.tonumberg = function(n) return format("%.20g",n) end
local dimenfactors = allocate {
["pt"] = 1/65536,
@@ -46,66 +48,65 @@ local dimenfactors = allocate {
["nc"] = ( 5080/65043)/65536
}
---~ print(table.serialize(dimenfactors))
---~
---~ %.99g:
---~
---~ t={
---~ ["bp"]=1.5201782378580324e-005,
---~ ["cc"]=1.1883696112892098e-006,
---~ ["cm"]=5.3628510057769479e-007,
---~ ["dd"]=1.4260435335470516e-005,
---~ ["em"]=0.000152587890625,
---~ ["ex"]=6.103515625e-005,
---~ ["in"]=2.1113586636917117e-007,
---~ ["mm"]=5.3628510057769473e-008,
---~ ["nc"]=1.1917446679504327e-006,
---~ ["nd"]=1.4300936015405194e-005,
---~ ["pc"]=1.2715657552083333e-006,
---~ ["pt"]=1.52587890625e-005,
---~ ["sp"]=1,
---~ }
---~
---~ patched %s and tonumber
---~
---~ t={
---~ ["bp"]=0.00001520178238,
---~ ["cc"]=0.00000118836961,
---~ ["cm"]=0.0000005362851,
---~ ["dd"]=0.00001426043534,
---~ ["em"]=0.00015258789063,
---~ ["ex"]=0.00006103515625,
---~ ["in"]=0.00000021113587,
---~ ["mm"]=0.00000005362851,
---~ ["nc"]=0.00000119174467,
---~ ["nd"]=0.00001430093602,
---~ ["pc"]=0.00000127156576,
---~ ["pt"]=0.00001525878906,
---~ ["sp"]=1,
---~ }
+-- print(table.serialize(dimenfactors))
+--
+-- %.99g:
+--
+-- t={
+-- ["bp"]=1.5201782378580324e-005,
+-- ["cc"]=1.1883696112892098e-006,
+-- ["cm"]=5.3628510057769479e-007,
+-- ["dd"]=1.4260435335470516e-005,
+-- ["em"]=0.000152587890625,
+-- ["ex"]=6.103515625e-005,
+-- ["in"]=2.1113586636917117e-007,
+-- ["mm"]=5.3628510057769473e-008,
+-- ["nc"]=1.1917446679504327e-006,
+-- ["nd"]=1.4300936015405194e-005,
+-- ["pc"]=1.2715657552083333e-006,
+-- ["pt"]=1.52587890625e-005,
+-- ["sp"]=1,
+-- }
+--
+-- patched %s and tonumber
+--
+-- t={
+-- ["bp"]=0.00001520178238,
+-- ["cc"]=0.00000118836961,
+-- ["cm"]=0.0000005362851,
+-- ["dd"]=0.00001426043534,
+-- ["em"]=0.00015258789063,
+-- ["ex"]=0.00006103515625,
+-- ["in"]=0.00000021113587,
+-- ["mm"]=0.00000005362851,
+-- ["nc"]=0.00000119174467,
+-- ["nd"]=0.00001430093602,
+-- ["pc"]=0.00000127156576,
+-- ["pt"]=0.00001525878906,
+-- ["sp"]=1,
+-- }
--[[ldx--
<p>A conversion function that takes a number, unit (string) and optional
format (string) is implemented using this table.</p>
--ldx]]--
+local f_none = formatters["%s%s"]
+local f_true = formatters["%0.5F%s"]
-local function numbertodimen(n,unit,fmt)
+local function numbertodimen(n,unit,fmt) -- will be redefined later !
if type(n) == 'string' then
return n
else
unit = unit or 'pt'
+ n = n * dimenfactors[unit]
if not fmt then
- fmt = "%s%s"
+ fmt = f_none(n,unit)
elseif fmt == true then
- fmt = "%0.5f%s"
+ fmt = f_true(n,unit)
+ else
+ return formatters[fmt](n,unit)
end
- return format(fmt,n*dimenfactors[unit],unit)
- -- if fmt then
- -- return format(fmt,n*dimenfactors[unit],unit)
- -- else
- -- return match(format("%.20f",n*dimenfactors[unit]),"(.-0?)0*$") .. unit
- -- end
end
end
diff --git a/Master/texmf-dist/tex/context/base/util-env.lua b/Master/texmf-dist/tex/context/base/util-env.lua
index e96a464b03a..b72226900a9 100644
--- a/Master/texmf-dist/tex/context/base/util-env.lua
+++ b/Master/texmf-dist/tex/context/base/util-env.lua
@@ -9,11 +9,11 @@ if not modules then modules = { } end modules ['util-env'] = {
local allocate, mark = utilities.storage.allocate, utilities.storage.mark
local format, sub, match, gsub, find = string.format, string.sub, string.match, string.gsub, string.find
-local unquoted, quoted = string.unquoted, string.quoted
+local unquoted, quoted, optionalquoted = string.unquoted, string.quoted, string.optionalquoted
local concat, insert, remove = table.concat, table.insert, table.remove
-environment = environment or { }
-local environment = environment
+environment = environment or { }
+local environment = environment
-- precautions
@@ -182,26 +182,14 @@ function environment.splitarguments(separator) -- rather special, cut-off before
end
function environment.reconstructcommandline(arg,noquote)
+ local resolveprefix = resolvers.resolve -- something rather special
arg = arg or environment.originalarguments
if noquote and #arg == 1 then
- -- we could just do: return unquoted(resolvers.resolve(arg[i]))
- local a = arg[1]
- a = resolvers.resolve(a)
- a = unquoted(a)
- return a
+ return unquoted(resolveprefix and resolveprefix(arg[1]) or arg[1])
elseif #arg > 0 then
local result = { }
for i=1,#arg do
- -- we could just do: result[#result+1] = format("%q",unquoted(resolvers.resolve(arg[i])))
- local a = arg[i]
- a = resolvers.resolve(a)
- a = unquoted(a)
- a = gsub(a,'"','\\"') -- tricky
- if find(a," ",1,true) then
- result[#result+1] = quoted(a)
- else
- result[#result+1] = a
- end
+ result[i] = optionalquoted(resolveprefix and resolveprefix(arg[i]) or resolveprefix)
end
return concat(result," ")
else
@@ -238,26 +226,10 @@ end
-- print(environment.relativepath("//x")) -- //x
-- print(environment.relativepath()) -- e:/tmp
--- -- to be tested:
---
--- function environment.reconstructcommandline(arg,noquote)
--- arg = arg or environment.originalarguments
--- if noquote and #arg == 1 then
--- return unquoted(resolvers.resolve(arg[1]))
--- elseif #arg > 0 then
--- local result = { }
--- for i=1,#arg do
--- result[#result+1] = format("%q",unquoted(resolvers.resolve(arg[i]))) -- always quote
--- end
--- return concat(result," ")
--- else
--- return ""
--- end
--- end
-
if arg then
-- new, reconstruct quoted snippets (maybe better just remove the " then and add them later)
+
local newarg, instring = { }, false
for index=1,#arg do
diff --git a/Master/texmf-dist/tex/context/base/util-prs.lua b/Master/texmf-dist/tex/context/base/util-prs.lua
index 2cede919b1e..ea34c2c279d 100644
--- a/Master/texmf-dist/tex/context/base/util-prs.lua
+++ b/Master/texmf-dist/tex/context/base/util-prs.lua
@@ -167,7 +167,7 @@ local value = P(lbrace * C((nobrace + nestedbraces)^0) * rbrace)
+ C((nestedbraces + (1-comma))^0)
local pattern = spaces * Ct(value*(separator*value)^0)
--- "aap, {noot}, mies" : outer {} removes, leading spaces ignored
+-- "aap, {noot}, mies" : outer {} removed, leading spaces ignored
patterns.settings_to_array = pattern
@@ -195,12 +195,40 @@ end
--
-- "{123} , 456 " -> "123" "456"
-local separator = space^0 * comma * space^0
-local value = P(lbrace * C((nobrace + nestedbraces)^0) * rbrace)
- + C((nestedbraces + (1-(space^0*(comma+P(-1)))))^0)
-local withvalue = Carg(1) * value / function(f,s) return f(s) end
-local pattern_a = spaces * Ct(value*(separator*value)^0)
-local pattern_b = spaces * withvalue * (separator*withvalue)^0
+-- local separator = space^0 * comma * space^0
+-- local value = P(lbrace * C((nobrace + nestedbraces)^0) * rbrace)
+-- + C((nestedbraces + (1-(space^0*(comma+P(-1)))))^0)
+-- local withvalue = Carg(1) * value / function(f,s) return f(s) end
+-- local pattern_a = spaces * Ct(value*(separator*value)^0)
+-- local pattern_b = spaces * withvalue * (separator*withvalue)^0
+
+local cache_a = { }
+local cache_b = { }
+
+function parsers.groupedsplitat(symbol,withaction)
+ if not symbol then
+ symbol = ","
+ end
+ local pattern = (withaction and cache_b or cache_a)[symbol]
+ if not pattern then
+ local symbols = S(symbol)
+ local separator = space^0 * symbols * space^0
+ local value = P(lbrace * C((nobrace + nestedbraces)^0) * rbrace)
+ + C((nestedbraces + (1-(space^0*(symbols+P(-1)))))^0)
+ if withaction then
+ local withvalue = Carg(1) * value / function(f,s) return f(s) end
+ pattern = spaces * withvalue * (separator*withvalue)^0
+ cache_b[symbol] = pattern
+ else
+ pattern = spaces * Ct(value*(separator*value)^0)
+ cache_a[symbol] = pattern
+ end
+ end
+ return pattern
+end
+
+local pattern_a = parsers.groupedsplitat(",",false)
+local pattern_b = parsers.groupedsplitat(",",true)
function parsers.stripped_settings_to_array(str)
if not str or str == "" then
@@ -221,8 +249,6 @@ end
-- parsers.process_stripped_settings("{123} , 456 ",function(s) print("["..s.."]") end)
-- parsers.process_stripped_settings("123 , 456 ",function(s) print("["..s.."]") end)
---
-
local function set(t,v)
t[#t+1] = v
end
@@ -275,15 +301,25 @@ function parsers.array_to_string(a,separator)
end
end
-function parsers.settings_to_set(str,t) -- tohash? -- todo: lpeg -- duplicate anyway
- t = t or { }
--- for s in gmatch(str,"%s*([^, ]+)") do -- space added
- for s in gmatch(str,"[^, ]+") do -- space added
- t[s] = true
- end
- return t
+-- function parsers.settings_to_set(str,t) -- tohash? -- todo: lpeg -- duplicate anyway
+-- if str then
+-- t = t or { }
+-- for s in gmatch(str,"[^, ]+") do -- space added
+-- t[s] = true
+-- end
+-- return t
+-- else
+-- return { }
+-- end
+-- end
+
+local pattern = Cf(Ct("") * Cg(C((1-S(", "))^1) * S(", ")^0 * Cc(true))^1,rawset)
+
+function utilities.parsers.settings_to_set(str,t)
+ return str and lpegmatch(pattern,str) or { }
end
+
function parsers.simple_hash_to_string(h, separator)
local t, tn = { }, 0
for k, v in sortedhash(h) do
@@ -297,7 +333,7 @@ end
-- for mtx-context etc: aaaa bbbb cccc=dddd eeee=ffff
-local str = C((1-whitespace-equal)^1)
+local str = Cs(lpegpatterns.unquoted) + C((1-whitespace-equal)^1)
local setting = Cf( Carg(1) * (whitespace^0 * Cg(str * whitespace^0 * (equal * whitespace^0 * str + Cc(""))))^1,rawset)
local splitter = setting^1
@@ -305,6 +341,12 @@ function utilities.parsers.options_to_hash(str,target)
return str and lpegmatch(splitter,str,1,target or { }) or { }
end
+local splitter = lpeg.tsplitat(" ")
+
+function utilities.parsers.options_to_array(str)
+ return str and lpegmatch(splitter,str) or { }
+end
+
-- for chem (currently one level)
local value = P(lbrace * C((nobrace + nestedbraces)^0) * rbrace)
@@ -488,7 +530,7 @@ function parsers.rfc4180splitter(specification)
local field = escaped + non_escaped + Cc("")
local record = Ct(field * (separator * field)^1)
local headerline = record * Cp()
- local wholeblob = Ct((newline^-1 * record)^0)
+ local wholeblob = Ct((newline^(specification.strict and -1 or 1) * record)^0)
return function(data,getheader)
if getheader then
local header, position = lpegmatch(headerline,data)
@@ -542,8 +584,8 @@ end
--
-local pattern_math = Cs((P("%")/"\\percent " + P("^") * Cc("{") * lpegpatterns.integer * Cc("}") + P(1))^0)
-local pattern_text = Cs((P("%")/"\\percent " + (P("^")/"\\high") * Cc("{") * lpegpatterns.integer * Cc("}") + P(1))^0)
+local pattern_math = Cs((P("%")/"\\percent " + P("^") * Cc("{") * lpegpatterns.integer * Cc("}") + anything)^0)
+local pattern_text = Cs((P("%")/"\\percent " + (P("^")/"\\high") * Cc("{") * lpegpatterns.integer * Cc("}") + anything)^0)
patterns.unittotex = pattern
@@ -551,7 +593,7 @@ function parsers.unittotex(str,textmode)
return lpegmatch(textmode and pattern_text or pattern_math,str)
end
-local pattern = Cs((P("^") / "<sup>" * lpegpatterns.integer * Cc("</sup>") + P(1))^0)
+local pattern = Cs((P("^") / "<sup>" * lpegpatterns.integer * Cc("</sup>") + anything)^0)
function parsers.unittoxml(str)
return lpegmatch(pattern,str)
@@ -648,3 +690,27 @@ function utilities.parsers.runtime(time)
local seconds = mod(time,60)
return days, hours, minutes, seconds
end
+
+--
+
+local spacing = whitespace^0
+local apply = P("->")
+local method = C((1-apply)^1)
+local token = lbrace * C((1-rbrace)^1) * rbrace + C(anything^1)
+
+local pattern = spacing * (method * spacing * apply + Carg(1)) * spacing * token
+
+function utilities.parsers.splitmethod(str,default)
+ if str then
+ return lpegmatch(pattern,str,1,default or false)
+ else
+ return default or false, ""
+ end
+end
+
+-- print(utilities.parsers.splitmethod(" foo -> {bar} "))
+-- print(utilities.parsers.splitmethod("foo->{bar}"))
+-- print(utilities.parsers.splitmethod("foo->bar"))
+-- print(utilities.parsers.splitmethod("foo"))
+-- print(utilities.parsers.splitmethod("{foo}"))
+-- print(utilities.parsers.splitmethod())
diff --git a/Master/texmf-dist/tex/context/base/util-sbx.lua b/Master/texmf-dist/tex/context/base/util-sbx.lua
new file mode 100644
index 00000000000..260e8b3b5a7
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/util-sbx.lua
@@ -0,0 +1,415 @@
+if not modules then modules = { } end modules ['util-sbx'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- Note: we use expandname and collapsepath and these use chdir
+-- which is overloaded so we need to use originals there. Just
+-- something to keep in mind.
+
+if not sandbox then require("l-sandbox") end -- for testing
+
+local next, type = next, type
+
+local replace = utilities.templates.replace
+local collapsepath = file.collapsepath
+local expandname = dir.expandname
+local sortedhash = table.sortedhash
+local lpegmatch = lpeg.match
+local platform = os.type
+local P, S, C = lpeg.P, lpeg.S, lpeg.C
+local gsub = string.gsub
+local lower = string.lower
+local unquoted = string.unquoted
+local optionalquoted = string.optionalquoted
+
+local sandbox = sandbox
+local validroots = { }
+local validrunners = { }
+local validbinaries = { }
+local validators = { }
+local p_validroot = nil
+local finalized = nil
+local norunners = false
+local trace = false
+local p_split = lpeg.tsplitat(" ") -- more spaces?
+
+local report = logs.reporter("sandbox")
+
+trackers.register("sandbox",function(v) trace = v end) -- often too late anyway
+
+sandbox.setreporter(report)
+
+sandbox.finalizer(function()
+ finalized = true
+end)
+
+local function registerroot(root,what) -- what == read|write
+ if finalized then
+ report("roots are already finalized")
+ else
+ root = collapsepath(expandname(root))
+ if platform == "windows" then
+ root = lower(root) -- we assume ascii names
+ end
+ -- true: read & write | false: read
+ validroots[root] = what == "write" or false
+ end
+end
+
+sandbox.finalizer(function() -- initializers can set the path
+ if p_validroot then
+ report("roots are already initialized")
+ else
+ sandbox.registerroot(".","write") -- always ok
+ -- also register texmf as read
+ for name in sortedhash(validroots) do
+ if p_validroot then
+ p_validroot = P(name) + p_validroot
+ else
+ p_validroot = P(name)
+ end
+ end
+ p_validroot = p_validroot / validroots
+ end
+end)
+
+local function registerrunner(specification)
+ if finalized then
+ report("runners are already finalized")
+ else
+ local name = specification.name
+ if not name then
+ report("no runner name specified")
+ return
+ end
+ local program = specification.program
+ if type(program) == "string" then
+ -- common for all platforms
+ elseif type(program) == "table" then
+ program = program[platform]
+ end
+ if type(program) ~= "string" or program == "" then
+ report("invalid runner %a specified for platform %a",name,platform)
+ return
+ end
+ specification.program = program
+ validrunners[name] = specification
+ end
+end
+
+local function registerbinary(name)
+ if finalized then
+ report("binaries are already finalized")
+ elseif type(name) == "string" and name ~= "" then
+ validbinaries[name] = true
+ end
+end
+
+-- begin of validators
+
+local p_write = S("wa") p_write = (1 - p_write)^0 * p_write
+local p_path = S("\\/~$%:") p_path = (1 - p_path )^0 * p_path -- be easy on other arguments
+
+local function normalized(name) -- only used in executers
+ if platform == "windows" then
+ name = gsub(name,"/","\\")
+ end
+ return name
+end
+
+function sandbox.possiblepath(name)
+ return lpegmatch(p_path,name) and true or false
+end
+
+local filenamelogger = false
+
+function sandbox.setfilenamelogger(l)
+ filenamelogger = type(l) == "function" and l or false
+end
+
+local function validfilename(name,what)
+ if p_validroot and type(name) == "string" and lpegmatch(p_path,name) then
+ local asked = collapsepath(expandname(name))
+ if platform == "windows" then
+ asked = lower(asked) -- we assume ascii names
+ end
+ local okay = lpegmatch(p_validroot,asked)
+ if okay == true then
+ -- read and write access
+ if filenamelogger then
+ filenamelogger(name,"w",asked,true)
+ end
+ return name
+ elseif okay == false then
+ -- read only access
+ if not what then
+ -- no further argument to io.open so a readonly case
+ if filenamelogger then
+ filenamelogger(name,"r",asked,true)
+ end
+ return name
+ elseif lpegmatch(p_write,what) then
+ if filenamelogger then
+ filenamelogger(name,"w",asked,false)
+ end
+ return -- we want write access
+ else
+ if filenamelogger then
+ filenamelogger(name,"r",asked,true)
+ end
+ return name
+ end
+ else
+ if filenamelogger then
+ filenamelogger(name,"*",name,false)
+ end
+ end
+ else
+ return name
+ end
+end
+
+local function readable(name)
+ if platform == "windows" then
+ name = lower(name) -- we assume ascii names
+ end
+ local valid = validfilename(name,"r")
+ if valid then
+ return normalized(valid)
+ end
+end
+
+local function writeable(name)
+ if platform == "windows" then
+ name = lower(name) -- we assume ascii names
+ end
+ local valid = validfilename(name,"w")
+ if valid then
+ return normalized(valid)
+ end
+end
+
+validators.readable = readable
+validators.writeable = writeable
+validators.filename = readable
+
+table.setmetatableindex(validators,function(t,k)
+ if k then
+ t[k] = readable
+ end
+ return readable
+end)
+
+function validators.string(s)
+ return s -- can be used to prevent filename checking
+end
+
+-- end of validators
+
+sandbox.registerroot = registerroot
+sandbox.registerrunner = registerrunner
+sandbox.registerbinary = registerbinary
+sandbox.validfilename = validfilename
+
+local function filehandlerone(action,one,...)
+ local checkedone = validfilename(one)
+ if checkedone then
+ return action(one,...)
+ else
+-- report("file %a is unreachable",one)
+ end
+end
+
+local function filehandlertwo(action,one,two,...)
+ local checkedone = validfilename(one)
+ if checkedone then
+ local checkedtwo = validfilename(two)
+ if checkedtwo then
+ return action(one,two,...)
+ else
+-- report("file %a is unreachable",two)
+ end
+ else
+-- report("file %a is unreachable",one)
+ end
+end
+
+local function iohandler(action,one,...)
+ if type(one) == "string" then
+ local checkedone = validfilename(one)
+ if checkedone then
+ return action(one,...)
+ end
+ elseif one then
+ return action(one,...)
+ else
+ return action()
+ end
+end
+
+-- runners can be strings or tables
+--
+-- os.execute : string
+-- os.exec : table with program in [0|1]
+-- os.spawn : table with program in [0|1]
+--
+-- our execute: registered program with specification
+
+local function runhandler(action,name,specification)
+ local kind = type(name)
+ if kind ~= "string" then
+ return
+ end
+ if norunners then
+ report("no runners permitted, ignoring command: %s",name)
+ return
+ end
+ local spec = validrunners[name]
+ if not spec then
+ report("unknown runner: %s",name)
+ return
+ end
+ -- specs are already checked
+ local program = spec.program
+ local variables = { }
+ local checkers = spec.checkers or { }
+ if specification then
+ -- we only handle runners that are defined before the sandbox is
+ -- closed so in principle we cannot have user runs with no files
+ -- while for context runners we assume a robust specification
+ for k, v in next, specification do
+ local checker = validators[checkers[k]]
+ local value = checker(unquoted(v)) -- todo: write checkers
+ if value then
+ variables[k] = optionalquoted(value)
+ else
+ report("suspicious argument found, run blocked: %s",v)
+ return
+ end
+ end
+ end
+ local command = replace(program,variables)
+ if trace then
+ report("executing runner: %s",command)
+ end
+ return action(command)
+end
+
+-- only registered (from list) -- no checking on writable so let's assume harmless
+-- runs
+
+local function binaryhandler(action,name)
+ local kind = type(name)
+ local list = name
+ if kind == "string" then
+ list = lpegmatch(p_split,name)
+ end
+ local program = name[0] or name[1]
+ if type(program) ~= "string" or program == "" then
+ return --silently ignore
+ end
+ if norunners then
+ report("no binaries permitted, ignoring command: %s",program)
+ return
+ end
+ if not validbinaries[program] then
+ report("binary is not permitted: %s",program)
+ return
+ end
+ for i=0,#list do
+ local n = list[i]
+ if n then
+ local v = readable(unquoted(n))
+ if v then
+ list[i] = optionalquoted(v)
+ else
+ report("suspicious argument found, run blocked: %s",n)
+ return
+ end
+ end
+ end
+ return action(name)
+end
+
+sandbox.filehandlerone = filehandlerone
+sandbox.filehandlertwo = filehandlertwo
+sandbox.iohandler = iohandler
+sandbox.runhandler = runhandler
+sandbox.binaryhandler = binaryhandler
+
+function sandbox.disablerunners()
+ norunners = true
+end
+
+local execute = sandbox.original(os.execute)
+
+function sandbox.run(name,specification)
+ return runhandler(execute,name,specification)
+end
+
+-------------------
+
+local overload = sandbox.overload
+local register = sandbox.register
+
+ overload(loadfile, filehandlerone,"loadfile") -- todo
+
+if io then
+ overload(io.open, filehandlerone,"io.open")
+ overload(io.popen, filehandlerone,"io.popen")
+ overload(io.input, iohandler, "io.input")
+ overload(io.output, iohandler, "io.output")
+ overload(io.lines, filehandlerone,"io.lines")
+end
+
+if os then
+ overload(os.execute, binaryhandler, "os.execute")
+ overload(os.spawn, binaryhandler, "os.spawn")
+ overload(os.exec, binaryhandler, "os.exec")
+ overload(os.rename, filehandlertwo,"os.rename")
+ overload(os.remove, filehandlerone,"os.remove")
+end
+
+if lfs then
+ overload(lfs.chdir, filehandlerone,"lfs.chdir")
+ overload(lfs.mkdir, filehandlerone,"lfs.mkdir")
+ overload(lfs.rmdir, filehandlerone,"lfs.rmdir")
+ overload(lfs.isfile, filehandlerone,"lfs.isfile")
+ overload(lfs.isdir, filehandlerone,"lfs.isdir")
+ overload(lfs.attributes, filehandlerone,"lfs.attributes")
+ overload(lfs.dir, filehandlerone,"lfs.dir")
+ overload(lfs.lock_dir, filehandlerone,"lfs.lock_dir")
+ overload(lfs.touch, filehandlerone,"lfs.touch")
+ overload(lfs.link, filehandlertwo,"lfs.link")
+ overload(lfs.setmode, filehandlerone,"lfs.setmode")
+ overload(lfs.readlink, filehandlerone,"lfs.readlink")
+ overload(lfs.shortname, filehandlerone,"lfs.shortname")
+ overload(lfs.symlinkattributes,filehandlerone,"lfs.symlinkattributes")
+end
+
+-- these are used later on
+
+if zip then
+ zip.open = register(zip.open, filehandlerone,"zip.open")
+end
+
+if fontloader then
+ fontloader.open = register(fontloader.open,filehandlerone,"fontloader.open")
+ fontloader.info = register(fontloader.info,filehandlerone,"fontloader.info")
+end
+
+if epdf then
+ epdf.open = register(epdf.open, filehandlerone,"epdf.open")
+end
+
+-- not used in a normal mkiv run : os.spawn = os.execute
+-- not used in a normal mkiv run : os.exec = os.exec
+
+-- print(io.open("test.log"))
+-- sandbox.enable()
+-- print(io.open("test.log"))
+-- print(io.open("t:/test.log"))
diff --git a/Master/texmf-dist/tex/context/base/util-seq.lua b/Master/texmf-dist/tex/context/base/util-seq.lua
index 35e6932855c..08fc4e95cb8 100644
--- a/Master/texmf-dist/tex/context/base/util-seq.lua
+++ b/Master/texmf-dist/tex/context/base/util-seq.lua
@@ -17,13 +17,15 @@ use locals to refer to them when compiling the chain.</p>
-- todo: protect groups (as in tasks)
-local format, gsub, concat, gmatch = string.format, string.gsub, table.concat, string.gmatch
+local gsub, concat, gmatch = string.gsub, table.concat, string.gmatch
local type, load = type, load
utilities = utilities or { }
local tables = utilities.tables
local allocate = utilities.storage.allocate
+local formatters = string.formatters
+
local sequencers = { }
utilities.sequencers = sequencers
@@ -31,6 +33,7 @@ local functions = allocate()
sequencers.functions = functions
local removevalue = tables.removevalue
+local replacevalue = tables.replacevalue
local insertaftervalue = tables.insertaftervalue
local insertbeforevalue = tables.insertbeforevalue
@@ -189,6 +192,18 @@ function sequencers.removeaction(t,group,action,force)
end
end
+function sequencers.replaceaction(t,group,oldaction,newaction,force)
+ t = known[t]
+ if t then
+ local g = t.list[group]
+ if g and (force or validaction(oldaction)) then
+ replacevalue(g,oldaction,newaction)
+ t.dirty = true
+ t.runner = nil
+ end
+ end
+end
+
local function localize(str)
return (gsub(str,"[%.: ]+","_"))
end
@@ -204,20 +219,23 @@ local function construct(t)
for i=1,#actions do
local action = actions[i]
if not askip[action] then
+ local localized
if type(action) == "function" then
local name = localize(tostring(action))
functions[name] = action
- action = format("utilities.sequencers.functions.%s",name)
+ action = formatters["utilities.sequencers.functions.%s"](name)
+ localized = localize(name) -- shorter than action
+ else
+ localized = localize(action)
end
- local localized = localize(action)
n = n + 1
- variables[n] = format("local %s = %s",localized,action)
+ variables[n] = formatters["local %s = %s"](localized,action)
if not returnvalues then
- calls[n] = format("%s(%s)",localized,arguments)
+ calls[n] = formatters["%s(%s)"](localized,arguments)
elseif n == 1 then
- calls[n] = format("local %s = %s(%s)",returnvalues,localized,arguments)
+ calls[n] = formatters["local %s = %s(%s)"](returnvalues,localized,arguments)
else
- calls[n] = format("%s = %s(%s)",returnvalues,localized,arguments)
+ calls[n] = formatters["%s = %s(%s)"](returnvalues,localized,arguments)
end
end
end
@@ -230,9 +248,9 @@ local function construct(t)
variables = concat(variables,"\n")
calls = concat(calls,"\n")
if results then
- t.compiled = format("%s\nreturn function(%s)\n%s\nreturn %s\nend",variables,arguments,calls,results)
+ t.compiled = formatters["%s\nreturn function(%s)\n%s\nreturn %s\nend"](variables,arguments,calls,results)
else
- t.compiled = format("%s\nreturn function(%s)\n%s\nend",variables,arguments,calls)
+ t.compiled = formatters["%s\nreturn function(%s)\n%s\nend"](variables,arguments,calls)
end
end
-- print(t.compiled)
@@ -258,6 +276,7 @@ compile = function(t,compiler,n) -- already referred to in sequencers.new
if compiled == "" then
runner = false
else
+-- inspect(compiled)
runner = compiled and load(compiled)() -- we can use loadstripped here
end
t.runner = runner
@@ -314,12 +333,12 @@ function sequencers.nodeprocessor(t,nofarguments) -- todo: handle 'kind' in plug
if not askip[action] then
local localized = localize(action)
n = n + 1
- vars[n] = format("local %s = %s",localized,action)
+ vars[n] = formatters["local %s = %s"](localized,action)
-- only difference with tostring is kind and rets (why no return)
if kind[action] == "nohead" then
- calls[n] = format(" ok = %s(head%s) done = done or ok",localized,args)
+ calls[n] = formatters[" ok = %s(head%s) done = done or ok"](localized,args)
else
- calls[n] = format(" head, ok = %s(head%s) done = done or ok",localized,args)
+ calls[n] = formatters[" head, ok = %s(head%s) done = done or ok"](localized,args)
end
-- local s = " print('" .. tostring(group) .. " " .. tostring(action) .. " : ' .. tostring(head)) "
-- calls[n] = s .. calls[n] .. s
@@ -327,6 +346,6 @@ function sequencers.nodeprocessor(t,nofarguments) -- todo: handle 'kind' in plug
end
end
end
- local processor = #calls > 0 and format(template_yes,concat(vars,"\n"),args,concat(calls,"\n")) or template_nop
+ local processor = #calls > 0 and formatters[template_yes](concat(vars,"\n"),args,concat(calls,"\n")) or template_nop
return processor
end
diff --git a/Master/texmf-dist/tex/context/base/util-sql-loggers.lua b/Master/texmf-dist/tex/context/base/util-sql-loggers.lua
index 7fceb8032c0..ceb1ff75cfa 100644
--- a/Master/texmf-dist/tex/context/base/util-sql-loggers.lua
+++ b/Master/texmf-dist/tex/context/base/util-sql-loggers.lua
@@ -52,7 +52,7 @@ table.setmetatableindex(fromtype,function() return "info" end)
loggers.totype = totype
loggers.fromtype = fromtype
-local template =[[
+local template = [[
CREATE TABLE IF NOT EXISTS %basename% (
`id` int(11) NOT NULL AUTO_INCREMENT,
`time` int(11) NOT NULL,
diff --git a/Master/texmf-dist/tex/context/base/util-sta.lua b/Master/texmf-dist/tex/context/base/util-sta.lua
index 1a61ec4e6c4..27ab5a624b6 100644
--- a/Master/texmf-dist/tex/context/base/util-sta.lua
+++ b/Master/texmf-dist/tex/context/base/util-sta.lua
@@ -81,6 +81,8 @@ end
function stacker.new(name)
+ local report = logs.reporter("stacker",name or nil)
+
local s
local stack = { }
@@ -126,8 +128,18 @@ function stacker.new(name)
end
end
- local tops = { }
- local top, switch
+ local tops = { }
+ local top = nil
+ local switch = nil
+
+ local function resolve_reset(mode)
+ if #tops > 0 then
+ report("resetting %s left-over states of %a",#tops,name)
+ end
+ tops = { }
+ top = nil
+ switch = nil
+ end
local function resolve_begin(mode)
if mode then
@@ -206,8 +218,7 @@ function stacker.new(name)
local function resolve_end()
-- resolve_step(s.unset)
- local noftop = #top
- if noftop > 0 then
+ if #tops > 0 then -- was #top brrr
local result = s.stop(s,top,1,#top)
remove(tops)
top = tops[#tops]
@@ -224,8 +235,6 @@ function stacker.new(name)
resolve_end()
end
- local report = logs.reporter("stacker",name or nil)
-
s = {
name = name or "unknown",
unset = -1,
@@ -240,6 +249,7 @@ function stacker.new(name)
resolve_begin = resolve_begin,
resolve_step = resolve_step,
resolve_end = resolve_end,
+ resolve_reset = resolve_reset,
}
return s -- we can overload functions
diff --git a/Master/texmf-dist/tex/context/base/util-str.lua b/Master/texmf-dist/tex/context/base/util-str.lua
index 5609cdf255d..a677a82ed5c 100644
--- a/Master/texmf-dist/tex/context/base/util-str.lua
+++ b/Master/texmf-dist/tex/context/base/util-str.lua
@@ -216,14 +216,19 @@ local striplinepatterns = {
["retain"] = p_retain_normal,
["retain and collapse"] = p_retain_collapse,
["retain and no empty"] = p_retain_noempty,
+ ["collapse"] = patterns.collapser, -- how about: stripper fullstripper
}
+setmetatable(striplinepatterns,{ __index = function(t,k) return p_prune_collapse end })
+
strings.striplinepatterns = striplinepatterns
function strings.striplines(str,how)
- return str and lpegmatch(how and striplinepatterns[how] or p_prune_collapse,str) or str
+ return str and lpegmatch(striplinepatterns[how],str) or str
end
+-- also see: string.collapsespaces
+
strings.striplong = strings.striplines -- for old times sake
-- local str = table.concat( {
@@ -356,10 +361,10 @@ strings.tracers = tracedchars
function string.tracedchar(b)
-- todo: table
if type(b) == "number" then
- return tracedchars[b] or (utfchar(b) .. " (U+" .. format('%05X',b) .. ")")
+ return tracedchars[b] or (utfchar(b) .. " (U+" .. format("%05X",b) .. ")")
else
local c = utfbyte(b)
- return tracedchars[c] or (b .. " (U+" .. format('%05X',c) .. ")")
+ return tracedchars[c] or (b .. " (U+" .. (c and format("%05X",c) or "?????") .. ")")
end
end
@@ -525,12 +530,21 @@ local format_f = function(f)
return format("format('%%%sf',a%s)",f,n)
end
-local format_F = function(f)
+-- The next one formats an integer as integer and very small values as zero. This is needed
+-- for pdf backend code.
+--
+-- 1.23 % 1 : 0.23
+-- - 1.23 % 1 : 0.77
+--
+-- We could probably use just %s with integers but who knows what Lua 5.3 will do? So let's
+-- for the moment use %i.
+
+local format_F = function(f) -- beware, no cast to number
n = n + 1
if not f or f == "" then
- return format("(((a%s > -0.0000000005 and a%s < 0.0000000005) and '0') or (a%s == 1 and '1') or format('%%.9f',a%s))",n,n,n,n)
+ return format("(((a%s > -0.0000000005 and a%s < 0.0000000005) and '0') or format((a%s %% 1 == 0) and '%%i' or '%%.9f',a%s))",n,n,n,n)
else
- return format("((a%s == 0 and '0') or (a%s == 1 and '1') or format('%%%sf',a%s))",n,n,f,n)
+ return format("format((a%s %% 1 == 0) and '%%i' or '%%%sf',a%s)",n,f,n)
end
end
@@ -830,7 +844,7 @@ local builder = Cs { "start",
+ V("m") + V("M") -- new
+ V("z") -- new
--
- + V("*") -- ignores probably messed up %
+ -- + V("?") -- ignores probably messed up %
)
+ V("*")
)
@@ -885,6 +899,7 @@ local builder = Cs { "start",
["A"] = (prefix_any * P("A")) / format_A, -- %A => "..." (forces tostring)
--
["*"] = Cs(((1-P("%"))^1 + P("%%")/"%%")^1) / format_rest, -- rest (including %%)
+ ["?"] = Cs(((1-P("%"))^1 )^1) / format_rest, -- rest (including %%)
--
["!"] = Carg(2) * prefix_any * P("!") * C((1-P("!"))^1) * P("!") / format_extension,
}
@@ -1082,3 +1097,23 @@ end
-- string.formatteds = formatteds
--
-- setmetatable(formatteds, { __index = make, __call = use })
+
+-- This is a somewhat silly one used in commandline reconstruction but the older
+-- method, using a combination of fine, gsub, quoted and unquoted was not that
+-- reliable.
+--
+-- '"foo"bar \"and " whatever"' => "foo\"bar \"and \" whatever"
+-- 'foo"bar \"and " whatever' => "foo\"bar \"and \" whatever"
+
+local dquote = patterns.dquote -- P('"')
+local equote = patterns.escaped + dquote / '\\"' + 1
+local space = patterns.space
+local cquote = Cc('"')
+
+local pattern =
+ Cs(dquote * (equote - P(-2))^0 * dquote) -- we keep the outer but escape unescaped ones
+ + Cs(cquote * (equote - space)^0 * space * equote^0 * cquote) -- we escape unescaped ones
+
+function string.optionalquoted(str)
+ return lpegmatch(pattern,str) or str
+end
diff --git a/Master/texmf-dist/tex/context/base/util-tab.lua b/Master/texmf-dist/tex/context/base/util-tab.lua
index f9e9b318df3..5eae0d5f676 100644
--- a/Master/texmf-dist/tex/context/base/util-tab.lua
+++ b/Master/texmf-dist/tex/context/base/util-tab.lua
@@ -98,6 +98,17 @@ function tables.removevalue(t,value) -- todo: n
end
end
+function tables.replacevalue(t,oldvalue,newvalue)
+ if oldvalue and newvalue then
+ for i=1,#t do
+ if t[i] == oldvalue then
+ t[i] = newvalue
+ -- replace all, so no: return
+ end
+ end
+ end
+end
+
function tables.insertbeforevalue(t,value,extra)
for i=1,#t do
if t[i] == extra then
@@ -612,7 +623,7 @@ function table.serialize(root,name,specification)
depth = depth + 1
end
-- we could check for k (index) being number (cardinal)
- if root and next(root) then
+ if root and next(root) ~= nil then
local first = nil
local last = 0
last = #root
@@ -637,7 +648,7 @@ function table.serialize(root,name,specification)
elseif tv == "string" then
n = n + 1 t[n] = f_val_str(depth,v)
elseif tv == "table" then
- if not next(v) then
+ if next(v) == nil then
n = n + 1 t[n] = f_val_not(depth)
else
local st = simple_table(v)
@@ -667,7 +678,7 @@ function table.serialize(root,name,specification)
n = n + 1 t[n] = f_key_boo_value_str(depth,k,v)
end
elseif tv == "table" then
- if not next(v) then
+ if next(v) == nil then
if tk == "number" then
n = n + 1 t[n] = f_key_num_value_not(depth,k,v)
elseif tk == "string" then
@@ -731,7 +742,7 @@ function table.serialize(root,name,specification)
root._w_h_a_t_e_v_e_r_ = nil
end
-- Let's forget about empty tables.
- if next(root) then
+ if next(root) ~= nil then
do_serialize(root,name,1,0)
end
end
diff --git a/Master/texmf-dist/tex/context/base/util-tpl.lua b/Master/texmf-dist/tex/context/base/util-tpl.lua
index 67d05822116..468dd429c98 100644
--- a/Master/texmf-dist/tex/context/base/util-tpl.lua
+++ b/Master/texmf-dist/tex/context/base/util-tpl.lua
@@ -52,7 +52,7 @@ local sqlescape = lpeg.replacer {
-- { "\t", "\\t" },
}
-local sqlquoted = lpeg.Cs(lpeg.Cc("'") * sqlescape * lpeg.Cc("'"))
+local sqlquoted = Cs(Cc("'") * sqlescape * Cc("'"))
lpegpatterns.sqlescape = sqlescape
lpegpatterns.sqlquoted = sqlquoted
@@ -111,13 +111,26 @@ local luaescaper = escapers.lua
local quotedluaescaper = quotedescapers.lua
local function replacekeyunquoted(s,t,how,recurse) -- ".. \" "
- local escaper = how and escapers[how] or luaescaper
- return escaper(replacekey(s,t,how,recurse))
+ if how == false then
+ return replacekey(s,t,how,recurse)
+ else
+ local escaper = how and escapers[how] or luaescaper
+ return escaper(replacekey(s,t,how,recurse))
+ end
end
local function replacekeyquoted(s,t,how,recurse) -- ".. \" "
- local escaper = how and quotedescapers[how] or quotedluaescaper
- return escaper(replacekey(s,t,how,recurse))
+ if how == false then
+ return replacekey(s,t,how,recurse)
+ else
+ local escaper = how and quotedescapers[how] or quotedluaescaper
+ return escaper(replacekey(s,t,how,recurse))
+ end
+end
+
+local function replaceoptional(l,m,r,t,how,recurse)
+ local v = t[l]
+ return v and v ~= "" and lpegmatch(replacer,r,1,t,how or "lua",recurse or false) or ""
end
local single = P("%") -- test %test% test : resolves test
@@ -135,12 +148,19 @@ local norquoted = rquoted / ''
local nolquotedq = lquotedq / ''
local norquotedq = rquotedq / ''
-local key = nosingle * ((C((1-nosingle )^1) * Carg(1) * Carg(2) * Carg(3)) / replacekey ) * nosingle
-local quoted = nolquotedq * ((C((1-norquotedq)^1) * Carg(1) * Carg(2) * Carg(3)) / replacekeyquoted ) * norquotedq
-local unquoted = nolquoted * ((C((1-norquoted )^1) * Carg(1) * Carg(2) * Carg(3)) / replacekeyunquoted) * norquoted
+local noloptional = P("%?") / ''
+local noroptional = P("?%") / ''
+local nomoptional = P(":") / ''
+
+
+local args = Carg(1) * Carg(2) * Carg(3)
+local key = nosingle * ((C((1-nosingle )^1) * args) / replacekey ) * nosingle
+local quoted = nolquotedq * ((C((1-norquotedq )^1) * args) / replacekeyquoted ) * norquotedq
+local unquoted = nolquoted * ((C((1-norquoted )^1) * args) / replacekeyunquoted) * norquoted
+local optional = noloptional * ((C((1-nomoptional)^1) * nomoptional * C((1-noroptional)^1) * args) / replaceoptional) * noroptional
local any = P(1)
- replacer = Cs((unquoted + quoted + escape + key + any)^0)
+ replacer = Cs((unquoted + quoted + escape + optional + key + any)^0)
local function replace(str,mapping,how,recurse)
if mapping and str then
@@ -156,6 +176,7 @@ end
-- print(replace("test '%[x]%' test",{ x = [[a '%y%'  a]], y = "oeps" },'sql',true))
-- print(replace([[test %[x]% test]],{ x = [[a "x"  a]]}))
-- print(replace([[test %(x)% test]],{ x = [[a "x"  a]]}))
+-- print(replace([[convert %?x: -x "%x%" ?% %?y: -y "%y%" ?%]],{ x = "yes" }))
templates.replace = replace
@@ -188,3 +209,5 @@ end
-- inspect(utilities.templates.replace("test %one% test", { one = "%two%", two = "two" }))
-- inspect(utilities.templates.resolve({ one = "%two%", two = "two", three = "%three%" }))
+-- inspect(utilities.templates.replace("test %one% test", { one = "%two%", two = "two" },false,true))
+-- inspect(utilities.templates.replace("test %one% test", { one = "%two%", two = "two" },false))
diff --git a/Master/texmf-dist/tex/context/base/x-asciimath.lua b/Master/texmf-dist/tex/context/base/x-asciimath.lua
index 87f04b5ff7d..7ddf5a6379a 100644
--- a/Master/texmf-dist/tex/context/base/x-asciimath.lua
+++ b/Master/texmf-dist/tex/context/base/x-asciimath.lua
@@ -7,268 +7,2058 @@ if not modules then modules = { } end modules ['x-asciimath'] = {
}
--[[ldx--
-<p>Some backgrounds are discussed in <t>x-asciimath.mkiv</t>.</p>
+<p>Some backgrounds are discussed in <t>x-asciimath.mkiv</t>. This is a third version. I first
+tried a to make a proper expression parser but it's not that easy. First we have to avoid left
+recursion, which is not that trivial (maybe a future version of lpeg will provide that), and
+second there is not really a syntax but a mix of expressions and sequences with some fuzzy logic
+applied. Most problematic are fractions and we also need to handle incomplete expressions. So,
+instead we (sort of) tokenize the string and then do some passes over the result. Yes, it's real
+ugly and unsatisfying code mess down here. Don't take this as an example.</p>
--ldx]]--
-local trace_mapping = false if trackers then trackers.register("modules.asciimath.mapping", function(v) trace_mapping = v end) end
+-- todo: spaces around all elements in cleanup?
+-- todo: filter from files listed in tuc file
-local asciimath = { }
-local moduledata = moduledata or { }
-moduledata.asciimath = asciimath
+local trace_mapping = false if trackers then trackers.register("modules.asciimath.mapping", function(v) trace_mapping = v end) end
+local trace_detail = false if trackers then trackers.register("modules.asciimath.detail", function(v) trace_detail = v end) end
+local trace_digits = false if trackers then trackers.register("modules.asciimath.digits", function(v) trace_digits = v end) end
local report_asciimath = logs.reporter("mathematics","asciimath")
-local format = string.format
-local lpegmatch = lpeg.match
-local S, P, R, C, V, Cc, Ct, Cs = lpeg.S, lpeg.P, lpeg.R, lpeg.C, lpeg.V, lpeg.Cc, lpeg.Ct, lpeg.Cs
-
-local letter = lpeg.patterns.utf8
-local space = S(" \n\r\t")
-local spaces = space^0/""
-local integer = P("-")^-1 * R("09")^1
-local realpart = P("-")^-1 * R("09")^1 * S(".")^1 * R("09")^1
-local number = integer -- so we can support nice formatting if needed
-local real = realpart -- so we can support nice formatting if needed
-local float = realpart * P("E") * integer -- so we can support nice formatting if needed
-local texnic = P("\\") * (R("az","AZ")^1)
-
-local premapper = Cs ( (
-
- P("@") / "\\degrees " +
- P("O/") / "\\varnothing " +
- P("o+") / "\\oplus " +
- P("o.") / "\\ocirc " +
- P("!in") / "\\not\\in " +
- P("!=") / "\\neq " +
- P("**") / "\\star " +
- P("*") / "\\cdot " +
- P("//") / "\\slash " +
- P("/_") / "\\angle " +
- P("\\\\") / "\\backslash " +
- P("^^^") / "\\wedge " +
- P("^^") / "\\wedge " +
- P("<<") / "\\left\\langle " +
- P(">>") / "\\right\\rangle " +
- P("<=") / "\\leq " +
- P(">=") / "\\geq " +
- P("-<") / "\\precc " +
- P(">-") / "\\succ " +
- P("~=") / "\\cong " +
- P("~~") / "\\approx " +
- P("=>") / "\\Rightarrow " +
- P("(:") / "\\left\\langle " +
- P(":)") / "\\right\\rangle " +
- P(":.") / "\\therefore " +
- P("~|") / "\\right\\rceil " +
- P("_|_") / "\\bot " +
- P("_|") / "\\right\\rfloor " +
- P("+-") / "\\pm " +
- P("|--") / "\\vdash " +
- P("|==") / "\\models " +
- P("|_") / "\\left\\lfloor " +
- P("|~") / "\\left\\lceil " +
- P("-:") / "\\div " +
- P("_=") / "\\equiv " +
-
- P("|") / "\\middle\\| " +
-
- P("dx") / "(dx)" +
- P("dy") / "(dy)" +
- P("dz") / "(dz)" +
-
- letter + P(1)
+local asciimath = { }
+local moduledata = moduledata or { }
+moduledata.asciimath = asciimath
-)^0 )
+if not characters then
+ require("char-def")
+ require("char-ini")
+ require("char-ent")
+end
+
+local type, rawget = type, rawget
+local concat, insert, remove = table.concat, table.insert, table.remove
+local rep, gmatch, gsub, find = string.rep, string.gmatch, string.gsub, string.find
+local utfchar = utf.char
+
+local lpegmatch, patterns = lpeg.match, lpeg.patterns
+local S, P, R, C, V, Cc, Ct, Cs, Carg = lpeg.S, lpeg.P, lpeg.R, lpeg.C, lpeg.V, lpeg.Cc, lpeg.Ct, lpeg.Cs, lpeg.Carg
+
+local sortedhash = table.sortedhash
+local sortedkeys = table.sortedkeys
+local formatters = string.formatters
+
+local entities = characters.entities or { }
+
+local xmltext = xml.text
+local xmlinclusion = xml.inclusion
+local xmlcollected = xml.collected
+
+-- todo: use private unicodes as temporary slots ... easier to compare
+
+local s_lparent = "\\left\\lparent"
+local s_lbrace = "\\left\\lbrace"
+local s_lbracket = "\\left\\lbracket"
+local s_langle = "\\left\\langle"
+local s_lfloor = "\\left\\lfloor"
+local s_lceil = "\\left\\lceil"
+local s_left = "\\left."
+
+local s_rparent = "\\right\\rparent"
+local s_rbrace = "\\right\\rbrace"
+local s_rbracket = "\\right\\rbracket"
+local s_rangle = "\\right\\rangle"
+local s_rfloor = "\\right\\rfloor"
+local s_rceil = "\\right\\rceil"
+local s_right = "\\right."
+
+local s_mslash = "\\middle/"
+
+local s_lbar = "\\left\\|"
+local s_mbar = "\\middle\\|"
+local s_rbar = "\\right\\|"
+
+local s_lnothing = "\\left ." -- space fools checker
+local s_rnothing = "\\right ." -- space fools checker
local reserved = {
- ["aleph"] = "\\aleph ",
- ["vdots"] = "\\vdots ",
- ["ddots"] = "\\ddots ",
- ["oint"] = "\\oint ",
- ["grad"] = "\\nabla ",
- ["prod"] = "\\prod ",
- ["prop"] = "\\propto ",
- ["sube"] = "\\subseteq ",
- ["supe"] = "\\supseteq ",
- ["sinh"] = "\\sinh ",
- ["cosh"] = "\\cosh ",
- ["tanh"] = "\\tanh ",
- ["sum"] = "\\sum ",
- ["vvv"] = "\\vee ",
- ["nnn"] = "\\cap ",
- ["uuu"] = "\\cup ",
- ["sub"] = "\\subset ",
- ["sup"] = "\\supset ",
- ["not"] = "\\lnot ",
- ["iff"] = "\\Leftrightarrow ",
- ["int"] = "\\int ",
- ["del"] = "\\partial ",
- ["and"] = "\\and ",
- ["not"] = "\\not ",
- ["sin"] = "\\sin ",
- ["cos"] = "\\cos ",
- ["tan"] = "\\tan ",
- ["csc"] = "\\csc ",
- ["sec"] = "\\sec ",
- ["cot"] = "\\cot ",
- ["log"] = "\\log ",
- ["det"] = "\\det ",
- ["lim"] = "\\lim ",
- ["mod"] = "\\mod ",
- ["gcd"] = "\\gcd ",
- ["lcm"] = "\\lcm ",
- ["min"] = "\\min ",
- ["max"] = "\\max ",
- ["xx"] = "\\times ",
- ["in"] = "\\in ",
- ["ox"] = "\\otimes ",
- ["vv"] = "\\vee ",
- ["nn"] = "\\cap ",
- ["uu"] = "\\cup ",
- ["oo"] = "\\infty ",
- ["ln"] = "\\ln ",
- ["or"] = "\\or ",
-
- ["AA"] = "\\forall ",
- ["EE"] = "\\exists ",
- ["TT"] = "\\top ",
- ["CC"] = "\\Bbb{C}",
- ["NN"] = "\\Bbb{N}",
- ["QQ"] = "\\Bbb{Q}",
- ["RR"] = "\\Bbb{R}",
- ["ZZ"] = "\\Bbb{Z}",
+
+ ["prod"] = { false, "\\prod" },
+ ["sinh"] = { false, "\\sinh" },
+ ["cosh"] = { false, "\\cosh" },
+ ["tanh"] = { false, "\\tanh" },
+ ["sum"] = { false, "\\sum" },
+ ["int"] = { false, "\\int" },
+ ["sin"] = { false, "\\sin" },
+ ["cos"] = { false, "\\cos" },
+ ["tan"] = { false, "\\tan" },
+ ["csc"] = { false, "\\csc" },
+ ["sec"] = { false, "\\sec" },
+ ["cot"] = { false, "\\cot" },
+ ["log"] = { false, "\\log" },
+ ["det"] = { false, "\\det" },
+ ["lim"] = { false, "\\lim" },
+ ["mod"] = { false, "\\mod" },
+ ["gcd"] = { false, "\\gcd" },
+ ["min"] = { false, "\\min" },
+ ["max"] = { false, "\\max" },
+ ["ln"] = { false, "\\ln" },
+
+ ["atan"] = { false, "\\atan" }, -- extra
+ ["acos"] = { false, "\\acos" }, -- extra
+ ["asin"] = { false, "\\asin" }, -- extra
+ -- extra
+ ["arctan"] = { false, "\\arctan" }, -- extra
+ ["arccos"] = { false, "\\arccos" }, -- extra
+ ["arcsin"] = { false, "\\arcsin" }, -- extra
+
+ ["and"] = { false, "\\text{and}" },
+ ["or"] = { false, "\\text{or}" },
+ ["if"] = { false, "\\text{if}" },
+
+ ["sqrt"] = { false, "\\asciimathsqrt", "unary" },
+ ["root"] = { false, "\\asciimathroot", "binary" },
+ ["frac"] = { false, "\\frac", "binary" },
+ ["stackrel"] = { false, "\\asciimathstackrel", "binary" },
+ ["hat"] = { false, "\\widehat", "unary" },
+ ["bar"] = { false, "\\overbar", "unary" },
+ ["overbar"] = { false, "\\overbar", "unary" },
+ ["underline"] = { false, "\\underline", "unary" },
+ ["vec"] = { false, "\\overrightarrow", "unary" },
+ ["dot"] = { false, "\\dot", "unary" }, -- 0x2D9
+ ["ddot"] = { false, "\\ddot", "unary" }, -- 0xA8
+
+ -- binary operators
+
+ ["+"] = { true, "+" },
+ ["-"] = { true, "-" },
+ ["*"] = { true, "⋅" },
+ ["**"] = { true, "⋆" },
+ ["//"] = { true, "⁄" }, -- \slash
+ ["\\"] = { true, "\\" },
+ ["xx"] = { true, "×" },
+ ["times"] = { true, "×" },
+ ["-:"] = { true, "÷" },
+ ["@"] = { true, "∘" },
+ ["o+"] = { true, "⊕" },
+ ["ox"] = { true, "⊗" },
+ ["o."] = { true, "⊙" },
+ ["^^"] = { true, "∧" },
+ ["vv"] = { true, "∨" },
+ ["nn"] = { true, "∩" },
+ ["uu"] = { true, "∪" },
+
+ -- big operators
+
+ ["^^^"] = { true, "⋀" },
+ ["vvv"] = { true, "⋁" },
+ ["nnn"] = { true, "⋂" },
+ ["uuu"] = { true, "⋃" },
+ ["int"] = { true, "∫" },
+ ["oint"] = { true, "∮" },
+
+ -- brackets
+
+ ["("] = { true, "(" },
+ [")"] = { true, ")" },
+ ["["] = { true, "[" },
+ ["]"] = { true, "]" },
+ ["{"] = { true, "{" },
+ ["}"] = { true, "}" },
+
+ -- binary relations
+
+ ["="] = { true, "=" },
+ ["eq"] = { true, "=" },
+ ["!="] = { true, "≠" },
+ ["ne"] = { true, "≠" },
+ ["neq"] = { true, "≠" },
+ ["<"] = { true, "<" },
+ ["lt"] = { true, "<" },
+ [">"] = { true, ">" },
+ ["gt"] = { true, ">" },
+ ["<="] = { true, "≤" },
+ ["le"] = { true, "≤" },
+ ["leq"] = { true, "≤" },
+ [">="] = { true, "≥" },
+ ["ge"] = { true, "≥" },
+ ["geq"] = { true, "≥" },
+ ["-<"] = { true, "≺" },
+ [">-"] = { true, "≻" },
+ ["in"] = { true, "∈" },
+ ["!in"] = { true, "∉" },
+ ["sub"] = { true, "⊂" },
+ ["sup"] = { true, "⊃" },
+ ["sube"] = { true, "⊆" },
+ ["supe"] = { true, "⊇" },
+ ["-="] = { true, "≡" },
+ ["~="] = { true, "≅" },
+ ["~~"] = { true, "≈" },
+ ["prop"] = { true, "∝" },
+
+ -- arrows
+
+ ["rarr"] = { true, "→" },
+ ["->"] = { true, "→" },
+ ["larr"] = { true, "←" },
+ ["harr"] = { true, "↔" },
+ ["uarr"] = { true, "↑" },
+ ["darr"] = { true, "↓" },
+ ["rArr"] = { true, "⇒" },
+ ["lArr"] = { true, "⇐" },
+ ["hArr"] = { true, "⇔" },
+ ["|->"] = { true, "↦" },
+
+ -- logical
+
+ ["not"] = { true, "¬" },
+ ["=>"] = { true, "⇒" },
+ ["iff"] = { true, "⇔" },
+ ["AA"] = { true, "∀" },
+ ["EE"] = { true, "∃" },
+ ["_|_"] = { true, "⊥" },
+ ["TT"] = { true, "⊤" },
+ ["|--"] = { true, "⊢" },
+ ["|=="] = { true, "⊨" },
+
+ -- miscellaneous
+
+ ["del"] = { true, "∂" },
+ ["grad"] = { true, "∇" },
+ ["+-"] = { true, "±" },
+ ["O/"] = { true, "∅" },
+ ["oo"] = { true, "∞" },
+ ["aleph"] = { true, "ℵ" },
+ ["angle"] = { true, "∠" },
+ ["/_"] = { true, "∠" },
+ [":."] = { true, "∴" },
+ ["..."] = { true, "..." }, -- ldots
+ ["ldots"] = { true, "..." }, -- ldots
+ ["cdots"] = { true, "⋯" },
+ ["vdots"] = { true, "⋮" },
+ ["ddots"] = { true, "⋱" },
+ ["diamond"] = { true, "⋄" },
+ ["square"] = { true, "□" },
+ ["|__"] = { true, "⌊" },
+ ["__|"] = { true, "⌋" },
+ ["|~"] = { true, "⌈" },
+ ["~|"] = { true, "⌉" },
+
+ -- more
+
+ ["_="] = { true, "≡" },
+
+ -- bonus
+
+ ["prime"] = { true, "′" }, -- bonus
+ ["'"] = { true, "′" }, -- bonus
+ ["''"] = { true, "″" }, -- bonus
+ ["'''"] = { true, "‴" }, -- bonus
+
+ -- special
+
+ ["%"] = { false, "\\mathpercent" },
+ ["&"] = { false, "\\mathampersand" },
+ ["#"] = { false, "\\mathhash" },
+ ["$"] = { false, "\\mathdollar" },
+
+ -- blackboard
+
+ ["CC"] = { true, "ℂ" },
+ ["NN"] = { true, "ℕ" },
+ ["QQ"] = { true, "ℚ" },
+ ["RR"] = { true, "ℝ" },
+ ["ZZ"] = { true, "ℤ" },
+
+ -- greek lowercase
+
+ ["alpha"] = { true, "α" },
+ ["beta"] = { true, "β" },
+ ["gamma"] = { true, "γ" },
+ ["delta"] = { true, "δ" },
+ ["epsilon"] = { true, "ε" },
+ ["varepsilon"] = { true, "ɛ" },
+ ["zeta"] = { true, "ζ" },
+ ["eta"] = { true, "η" },
+ ["theta"] = { true, "θ" },
+ ["vartheta"] = { true, "ϑ" },
+ ["iota"] = { true, "ι" },
+ ["kappa"] = { true, "κ" },
+ ["lambda"] = { true, "λ" },
+ ["mu"] = { true, "μ" },
+ ["nu"] = { true, "ν" },
+ ["xi"] = { true, "ξ" },
+ ["pi"] = { true, "π" },
+ ["rho"] = { true, "ρ" },
+ ["sigma"] = { true, "σ" },
+ ["tau"] = { true, "τ" },
+ ["upsilon"] = { true, "υ" },
+ ["phi"] = { true, "φ" },
+ ["varphi"] = { true, "ϕ" },
+ ["chi"] = { true, "χ" },
+ ["psi"] = { true, "ψ" },
+ ["omega"] = { true, "ω" },
+
+ -- greek uppercase
+
+ ["Gamma"] = { true, "Γ" },
+ ["Delta"] = { true, "Δ" },
+ ["Theta"] = { true, "Θ" },
+ ["Lambda"] = { true, "Λ" },
+ ["Xi"] = { true, "Ξ" },
+ ["Pi"] = { true, "Π" },
+ ["Sigma"] = { true, "Σ" },
+ ["Phi"] = { true, "Φ" },
+ ["Psi"] = { true, "Ψ" },
+ ["Omega"] = { true, "Ω" },
+
+ -- blackboard
+
+ ["bbb a"] = { true, "𝕒" },
+ ["bbb b"] = { true, "𝕓" },
+ ["bbb c"] = { true, "𝕔" },
+ ["bbb d"] = { true, "𝕕" },
+ ["bbb e"] = { true, "𝕖" },
+ ["bbb f"] = { true, "𝕗" },
+ ["bbb g"] = { true, "𝕘" },
+ ["bbb h"] = { true, "𝕙" },
+ ["bbb i"] = { true, "𝕚" },
+ ["bbb j"] = { true, "𝕛" },
+ ["bbb k"] = { true, "𝕜" },
+ ["bbb l"] = { true, "𝕝" },
+ ["bbb m"] = { true, "𝕞" },
+ ["bbb n"] = { true, "𝕟" },
+ ["bbb o"] = { true, "𝕠" },
+ ["bbb p"] = { true, "𝕡" },
+ ["bbb q"] = { true, "𝕢" },
+ ["bbb r"] = { true, "𝕣" },
+ ["bbb s"] = { true, "𝕤" },
+ ["bbb t"] = { true, "𝕥" },
+ ["bbb u"] = { true, "𝕦" },
+ ["bbb v"] = { true, "𝕧" },
+ ["bbb w"] = { true, "𝕨" },
+ ["bbb x"] = { true, "𝕩" },
+ ["bbb y"] = { true, "𝕪" },
+ ["bbb z"] = { true, "𝕫" },
+
+ ["bbb A"] = { true, "𝔸" },
+ ["bbb B"] = { true, "𝔹" },
+ ["bbb C"] = { true, "ℂ" },
+ ["bbb D"] = { true, "𝔻" },
+ ["bbb E"] = { true, "𝔼" },
+ ["bbb F"] = { true, "𝔽" },
+ ["bbb G"] = { true, "𝔾" },
+ ["bbb H"] = { true, "ℍ" },
+ ["bbb I"] = { true, "𝕀" },
+ ["bbb J"] = { true, "𝕁" },
+ ["bbb K"] = { true, "𝕂" },
+ ["bbb L"] = { true, "𝕃" },
+ ["bbb M"] = { true, "𝕄" },
+ ["bbb N"] = { true, "ℕ" },
+ ["bbb O"] = { true, "𝕆" },
+ ["bbb P"] = { true, "ℙ" },
+ ["bbb Q"] = { true, "ℚ" },
+ ["bbb R"] = { true, "ℝ" },
+ ["bbb S"] = { true, "𝕊" },
+ ["bbb T"] = { true, "𝕋" },
+ ["bbb U"] = { true, "𝕌" },
+ ["bbb V"] = { true, "𝕍" },
+ ["bbb W"] = { true, "𝕎" },
+ ["bbb X"] = { true, "𝕏" },
+ ["bbb Y"] = { true, "𝕐" },
+ ["bbb Z"] = { true, "ℤ" },
+
+ -- fraktur
+
+ ["fr a"] = { true, "𝔞" },
+ ["fr b"] = { true, "𝔟" },
+ ["fr c"] = { true, "𝔠" },
+ ["fr d"] = { true, "𝔡" },
+ ["fr e"] = { true, "𝔢" },
+ ["fr f"] = { true, "𝔣" },
+ ["fr g"] = { true, "𝔤" },
+ ["fr h"] = { true, "𝔥" },
+ ["fr i"] = { true, "𝔦" },
+ ["fr j"] = { true, "𝔧" },
+ ["fr k"] = { true, "𝔨" },
+ ["fr l"] = { true, "𝔩" },
+ ["fr m"] = { true, "𝔪" },
+ ["fr n"] = { true, "𝔫" },
+ ["fr o"] = { true, "𝔬" },
+ ["fr p"] = { true, "𝔭" },
+ ["fr q"] = { true, "𝔮" },
+ ["fr r"] = { true, "𝔯" },
+ ["fr s"] = { true, "𝔰" },
+ ["fr t"] = { true, "𝔱" },
+ ["fr u"] = { true, "𝔲" },
+ ["fr v"] = { true, "𝔳" },
+ ["fr w"] = { true, "𝔴" },
+ ["fr x"] = { true, "𝔵" },
+ ["fr y"] = { true, "𝔶" },
+ ["fr z"] = { true, "𝔷" },
+
+ ["fr A"] = { true, "𝔄" },
+ ["fr B"] = { true, "𝔅" },
+ ["fr C"] = { true, "ℭ" },
+ ["fr D"] = { true, "𝔇" },
+ ["fr E"] = { true, "𝔈" },
+ ["fr F"] = { true, "𝔉" },
+ ["fr G"] = { true, "𝔊" },
+ ["fr H"] = { true, "ℌ" },
+ ["fr I"] = { true, "ℑ" },
+ ["fr J"] = { true, "𝔍" },
+ ["fr K"] = { true, "𝔎" },
+ ["fr L"] = { true, "𝔏" },
+ ["fr M"] = { true, "𝔐" },
+ ["fr N"] = { true, "𝔑" },
+ ["fr O"] = { true, "𝔒" },
+ ["fr P"] = { true, "𝔓" },
+ ["fr Q"] = { true, "𝔔" },
+ ["fr R"] = { true, "ℜ" },
+ ["fr S"] = { true, "𝔖" },
+ ["fr T"] = { true, "𝔗" },
+ ["fr U"] = { true, "𝔘" },
+ ["fr V"] = { true, "𝔙" },
+ ["fr W"] = { true, "𝔚" },
+ ["fr X"] = { true, "𝔛" },
+ ["fr Y"] = { true, "𝔜" },
+ ["fr Z"] = { true, "ℨ" },
+
+ -- script
+
+ ["cc a"] = { true, "𝒶" },
+ ["cc b"] = { true, "𝒷" },
+ ["cc c"] = { true, "𝒸" },
+ ["cc d"] = { true, "𝒹" },
+ ["cc e"] = { true, "ℯ" },
+ ["cc f"] = { true, "𝒻" },
+ ["cc g"] = { true, "ℊ" },
+ ["cc h"] = { true, "𝒽" },
+ ["cc i"] = { true, "𝒾" },
+ ["cc j"] = { true, "𝒿" },
+ ["cc k"] = { true, "𝓀" },
+ ["cc l"] = { true, "𝓁" },
+ ["cc m"] = { true, "𝓂" },
+ ["cc n"] = { true, "𝓃" },
+ ["cc o"] = { true, "ℴ" },
+ ["cc p"] = { true, "𝓅" },
+ ["cc q"] = { true, "𝓆" },
+ ["cc r"] = { true, "𝓇" },
+ ["cc s"] = { true, "𝓈" },
+ ["cc t"] = { true, "𝓉" },
+ ["cc u"] = { true, "𝓊" },
+ ["cc v"] = { true, "𝓋" },
+ ["cc w"] = { true, "𝓌" },
+ ["cc x"] = { true, "𝓍" },
+ ["cc y"] = { true, "𝓎" },
+ ["cc z"] = { true, "𝓏" },
+
+ ["cc A"] = { true, "𝒜" },
+ ["cc B"] = { true, "ℬ" },
+ ["cc C"] = { true, "𝒞" },
+ ["cc D"] = { true, "𝒟" },
+ ["cc E"] = { true, "ℰ" },
+ ["cc F"] = { true, "ℱ" },
+ ["cc G"] = { true, "𝒢" },
+ ["cc H"] = { true, "ℋ" },
+ ["cc I"] = { true, "ℐ" },
+ ["cc J"] = { true, "𝒥" },
+ ["cc K"] = { true, "𝒦" },
+ ["cc L"] = { true, "ℒ" },
+ ["cc M"] = { true, "ℳ" },
+ ["cc N"] = { true, "𝒩" },
+ ["cc O"] = { true, "𝒪" },
+ ["cc P"] = { true, "𝒫" },
+ ["cc Q"] = { true, "𝒬" },
+ ["cc R"] = { true, "ℛ" },
+ ["cc S"] = { true, "𝒮" },
+ ["cc T"] = { true, "𝒯" },
+ ["cc U"] = { true, "𝒰" },
+ ["cc V"] = { true, "𝒱" },
+ ["cc W"] = { true, "𝒲" },
+ ["cc X"] = { true, "𝒳" },
+ ["cc Y"] = { true, "𝒴" },
+ ["cc Z"] = { true, "𝒵" },
+
+ -- bold
+
+ ["bb a"] = { true, "𝒂" },
+ ["bb b"] = { true, "𝒃" },
+ ["bb c"] = { true, "𝒄" },
+ ["bb d"] = { true, "𝒅" },
+ ["bb e"] = { true, "𝒆" },
+ ["bb f"] = { true, "𝒇" },
+ ["bb g"] = { true, "𝒈" },
+ ["bb h"] = { true, "𝒉" },
+ ["bb i"] = { true, "𝒊" },
+ ["bb j"] = { true, "𝒋" },
+ ["bb k"] = { true, "𝒌" },
+ ["bb l"] = { true, "𝒍" },
+ ["bb m"] = { true, "𝒎" },
+ ["bb n"] = { true, "𝒏" },
+ ["bb o"] = { true, "𝒐" },
+ ["bb p"] = { true, "𝒑" },
+ ["bb q"] = { true, "𝒒" },
+ ["bb r"] = { true, "𝒓" },
+ ["bb s"] = { true, "𝒔" },
+ ["bb t"] = { true, "𝒕" },
+ ["bb u"] = { true, "𝒖" },
+ ["bb v"] = { true, "𝒗" },
+ ["bb w"] = { true, "𝒘" },
+ ["bb x"] = { true, "𝒙" },
+ ["bb y"] = { true, "𝒚" },
+ ["bb z"] = { true, "𝒛" },
+
+ ["bb A"] = { true, "𝑨" },
+ ["bb B"] = { true, "𝑩" },
+ ["bb C"] = { true, "𝑪" },
+ ["bb D"] = { true, "𝑫" },
+ ["bb E"] = { true, "𝑬" },
+ ["bb F"] = { true, "𝑭" },
+ ["bb G"] = { true, "𝑮" },
+ ["bb H"] = { true, "𝑯" },
+ ["bb I"] = { true, "𝑰" },
+ ["bb J"] = { true, "𝑱" },
+ ["bb K"] = { true, "𝑲" },
+ ["bb L"] = { true, "𝑳" },
+ ["bb M"] = { true, "𝑴" },
+ ["bb N"] = { true, "𝑵" },
+ ["bb O"] = { true, "𝑶" },
+ ["bb P"] = { true, "𝑷" },
+ ["bb Q"] = { true, "𝑸" },
+ ["bb R"] = { true, "𝑹" },
+ ["bb S"] = { true, "𝑺" },
+ ["bb T"] = { true, "𝑻" },
+ ["bb U"] = { true, "𝑼" },
+ ["bb V"] = { true, "𝑽" },
+ ["bb W"] = { true, "𝑾" },
+ ["bb X"] = { true, "𝑿" },
+ ["bb Y"] = { true, "𝒀" },
+ ["bb Z"] = { true, "𝒁" },
+
+ -- sans
+
+ ["sf a"] = { true, "𝖺" },
+ ["sf b"] = { true, "𝖻" },
+ ["sf c"] = { true, "𝖼" },
+ ["sf d"] = { true, "𝖽" },
+ ["sf e"] = { true, "𝖾" },
+ ["sf f"] = { true, "𝖿" },
+ ["sf g"] = { true, "𝗀" },
+ ["sf h"] = { true, "𝗁" },
+ ["sf i"] = { true, "𝗂" },
+ ["sf j"] = { true, "𝗃" },
+ ["sf k"] = { true, "𝗄" },
+ ["sf l"] = { true, "𝗅" },
+ ["sf m"] = { true, "𝗆" },
+ ["sf n"] = { true, "𝗇" },
+ ["sf o"] = { true, "𝗈" },
+ ["sf p"] = { true, "𝗉" },
+ ["sf q"] = { true, "𝗊" },
+ ["sf r"] = { true, "𝗋" },
+ ["sf s"] = { true, "𝗌" },
+ ["sf t"] = { true, "𝗍" },
+ ["sf u"] = { true, "𝗎" },
+ ["sf v"] = { true, "𝗏" },
+ ["sf w"] = { true, "𝗐" },
+ ["sf x"] = { true, "𝗑" },
+ ["sf y"] = { true, "𝗒" },
+ ["sf z"] = { true, "𝗓" },
+
+ ["sf A"] = { true, "𝖠" },
+ ["sf B"] = { true, "𝖡" },
+ ["sf C"] = { true, "𝖢" },
+ ["sf D"] = { true, "𝖣" },
+ ["sf E"] = { true, "𝖤" },
+ ["sf F"] = { true, "𝖥" },
+ ["sf G"] = { true, "𝖦" },
+ ["sf H"] = { true, "𝖧" },
+ ["sf I"] = { true, "𝖨" },
+ ["sf J"] = { true, "𝖩" },
+ ["sf K"] = { true, "𝖪" },
+ ["sf L"] = { true, "𝖫" },
+ ["sf M"] = { true, "𝖬" },
+ ["sf N"] = { true, "𝖭" },
+ ["sf O"] = { true, "𝖮" },
+ ["sf P"] = { true, "𝖯" },
+ ["sf Q"] = { true, "𝖰" },
+ ["sf R"] = { true, "𝖱" },
+ ["sf S"] = { true, "𝖲" },
+ ["sf T"] = { true, "𝖳" },
+ ["sf U"] = { true, "𝖴" },
+ ["sf V"] = { true, "𝖵" },
+ ["sf W"] = { true, "𝖶" },
+ ["sf X"] = { true, "𝖷" },
+ ["sf Y"] = { true, "𝖸" },
+ ["sf Z"] = { true, "𝖹" },
+
+ -- monospace
+
+ ["tt a"] = { true, "𝚊" },
+ ["tt b"] = { true, "𝚋" },
+ ["tt c"] = { true, "𝚌" },
+ ["tt d"] = { true, "𝚍" },
+ ["tt e"] = { true, "𝚎" },
+ ["tt f"] = { true, "𝚏" },
+ ["tt g"] = { true, "𝚐" },
+ ["tt h"] = { true, "𝚑" },
+ ["tt i"] = { true, "𝚒" },
+ ["tt j"] = { true, "𝚓" },
+ ["tt k"] = { true, "𝚔" },
+ ["tt l"] = { true, "𝚕" },
+ ["tt m"] = { true, "𝚖" },
+ ["tt n"] = { true, "𝚗" },
+ ["tt o"] = { true, "𝚘" },
+ ["tt p"] = { true, "𝚙" },
+ ["tt q"] = { true, "𝚚" },
+ ["tt r"] = { true, "𝚛" },
+ ["tt s"] = { true, "𝚜" },
+ ["tt t"] = { true, "𝚝" },
+ ["tt u"] = { true, "𝚞" },
+ ["tt v"] = { true, "𝚟" },
+ ["tt w"] = { true, "𝚠" },
+ ["tt x"] = { true, "𝚡" },
+ ["tt y"] = { true, "𝚢" },
+ ["tt z"] = { true, "𝚣" },
+
+ ["tt A"] = { true, "𝙰" },
+ ["tt B"] = { true, "𝙱" },
+ ["tt C"] = { true, "𝙲" },
+ ["tt D"] = { true, "𝙳" },
+ ["tt E"] = { true, "𝙴" },
+ ["tt F"] = { true, "𝙵" },
+ ["tt G"] = { true, "𝙶" },
+ ["tt H"] = { true, "𝙷" },
+ ["tt I"] = { true, "𝙸" },
+ ["tt J"] = { true, "𝙹" },
+ ["tt K"] = { true, "𝙺" },
+ ["tt L"] = { true, "𝙻" },
+ ["tt M"] = { true, "𝙼" },
+ ["tt N"] = { true, "𝙽" },
+ ["tt O"] = { true, "𝙾" },
+ ["tt P"] = { true, "𝙿" },
+ ["tt Q"] = { true, "𝚀" },
+ ["tt R"] = { true, "𝚁" },
+ ["tt S"] = { true, "𝚂" },
+ ["tt T"] = { true, "𝚃" },
+ ["tt U"] = { true, "𝚄" },
+ ["tt V"] = { true, "𝚅" },
+ ["tt W"] = { true, "𝚆" },
+ ["tt X"] = { true, "𝚇" },
+ ["tt Y"] = { true, "𝚈" },
+ ["tt Z"] = { true, "𝚉" },
+
+ -- some more undocumented
+
+ ["dx"] = { false, { "d", "x" } }, -- "{dx}" "\\left(dx\\right)"
+ ["dy"] = { false, { "d", "y" } }, -- "{dy}" "\\left(dy\\right)"
+ ["dz"] = { false, { "d", "z" } }, -- "{dz}" "\\left(dz\\right)"
+
+ -- fences
+
+ ["(:"] = { true, "(:" },
+ ["{:"] = { true, "{:" },
+ ["[:"] = { true, "[:" },
+ ["("] = { true, "(" },
+ ["["] = { true, "[" },
+ ["{"] = { true, "{" },
+ ["<<"] = { true, "⟨" }, -- why not <:
+ ["|_"] = { true, "⌊" },
+ ["|~"] = { true, "⌈" },
+ ["⟨"] = { true, "⟨" },
+ ["〈"] = { true, "⟨" },
+ ["〈"] = { true, "⟨" },
+
+ [":)"] = { true, ":)" },
+ [":}"] = { true, ":}" },
+ [":]"] = { true, ":]" },
+ [")"] = { true, ")" },
+ ["]"] = { true, "]" },
+ ["}"] = { true, "}" },
+ [">>"] = { true, "⟩" }, -- why not :>
+ ["~|"] = { true, "⌉" },
+ ["_|"] = { true, "⌋" },
+ ["⟩"] = { true, "⟩" },
+ ["〉"] = { true, "⟩" },
+ ["〉"] = { true, "⟩" },
+
+ ["lparent"] = { true, "(" },
+ ["lbracket"] = { true, "[" },
+ ["lbrace"] = { true, "{" },
+ ["langle"] = { true, "⟨" },
+ ["lfloor"] = { true, "⌊" },
+ ["lceil"] = { true, "⌈" },
+
+ ["rparent"] = { true, ")" },
+ ["rbracket"] = { true, "]" },
+ ["rbrace"] = { true, "}" },
+ ["rangle"] = { true, "⟩" },
+ ["rfloor"] = { true, "⌋" },
+ ["rceil"] = { true, "⌉" },
+
+ -- a bit special:
+
+ ["\\frac"] = { true, "frac" },
}
-table.setmetatableindex(reserved,characters.entities)
+local isbinary = {
+ ["\\frac"] = true,
+ ["\\root"] = true,
+ ["\\asciimathroot"] = true,
+ ["\\asciimathstackrel"] = true,
+}
-local postmapper = Cs ( (
+local isunary = {
+ ["\\sqrt"] = true,
+ ["\\asciimathsqrt"] = true,
+ ["\\text"] = true, -- mathoptext
+ ["\\mathoptext"] = true, -- mathoptext
+ ["\\asciimathoptext"] = true, -- mathoptext
+ ["\\hat"] = true, -- widehat
+ ["\\widehat"] = true, -- widehat
+ ["\\bar"] = true, --
+ ["\\overbar"] = true, --
+ ["\\underline"] = true, --
+ ["\\vec"] = true, -- overrightarrow
+ ["\\overrightarrow"] = true, -- overrightarrow
+ ["\\dot"] = true, --
+ ["\\ddot"] = true, --
- P("\\mathoptext ") * spaces * (P("\\bgroup ")/"{") * (1-P("\\egroup "))^1 * (P("\\egroup ")/"}") +
+}
- (P("\\bgroup ")) / "{" +
- (P("\\egroup ")) / "}" +
+local isfunny = {
+ ["\\sin"] = true,
+}
- P("\\") * (R("az","AZ")^2) +
+local isinfix = {
+ ["^"] = true,
+ ["_"] = true,
+}
- (R("AZ","az")^2) / reserved +
+local isleft = {
+ [s_lparent] = true,
+ [s_lbrace] = true,
+ [s_lbracket] = true,
+ [s_langle] = true,
+ [s_lfloor] = true,
+ [s_lceil] = true,
+ [s_left] = true,
+}
- P("{:") / "\\left." +
- P(":}") / "\\right." +
- P("(") / "\\left(" +
- P(")") / "\\right)" +
- P("[") / "\\left[" +
- P("]") / "\\right]" +
- P("{") / "\\left\\{" +
- P("}") / "\\right\\}" +
+local isright = {
+ [s_rparent] = true,
+ [s_rbrace] = true,
+ [s_rbracket] = true,
+ [s_rangle] = true,
+ [s_rfloor] = true,
+ [s_rceil] = true,
+ [s_right] = true,
+}
- letter + P(1)
+local issimplified = {
+}
+
+--
+
+-- special mess
+
+local d_one = R("09")
+local d_two = d_one * d_one
+local d_three = d_two * d_one
+local d_four = d_three * d_one
+local d_split = P(-1) + P(",")
+
+local d_spaced = (Carg(1) * d_three)^1
+
+local digitized_1 = Cs ( (
+ d_three * d_spaced * d_split +
+ d_two * d_spaced * d_split +
+ d_one * d_spaced * d_split +
+ P(1)
+ )^1 )
+
+local p_fourbefore = d_four * d_split
+local p_fourafter = d_four * P(-1)
+
+local p_beforecomma = d_three * d_spaced * d_split
+ + d_two * d_spaced * d_split
+ + d_one * d_spaced * d_split
+ + d_one * d_split
+
+local p_aftercomma = p_fourafter
+ + d_three * d_spaced
+ + d_two * d_spaced
+ + d_one * d_spaced
+
+local digitized_2 = Cs (
+ p_fourbefore * (p_aftercomma^0) +
+ p_beforecomma * ((p_aftercomma + d_one^1)^0)
+ )
+
+local p_fourbefore = d_four * d_split
+local p_fourafter = d_four
+local d_spaced = (Carg(1) * (d_three + d_two + d_one))^1
+local p_aftercomma = p_fourafter * P(-1)
+ + d_three * d_spaced * P(1)^0
+ + d_one^1
+
+-- local digitized_3 = Cs (
+-- p_fourbefore * p_aftercomma^0 +
+-- p_beforecomma * p_aftercomma^0
+-- )
+
+local digitized_3 = Cs((p_fourbefore + p_beforecomma) * p_aftercomma^0)
+
+local splitmethods = {
+ digitized_1,
+ digitized_2,
+ digitized_3,
+}
+
+local splitmethod = nil
+
+function asciimath.setup(settings)
+ splitmethod = splitmethods[tonumber(settings.splitmethod) or 0]
+ if splitmethod then
+ local separator = settings.separator
+ if separator == true or not interfaces or interfaces.variables.yes then
+ digitseparator = utfchar(0x2008)
+ elseif type(separator) == "string" and separator ~= "" then
+ digitseparator = separator
+ else
+ splitmethod = nil
+ end
+ end
+end
+
+local collected_digits = { }
+local collected_filename = "asciimath-digits.lua"
+
+function numbermess(s)
+ if splitmethod then
+ local d = lpegmatch(splitmethod,s,1,digitseparator)
+ if d then
+ if trace_digits and s ~= d then
+ collected_digits[s] = d
+ end
+ return d
+ end
+ end
+ return s
+end
+
+-- asciimath.setup { splitmethod = 3 }
+-- local t = {
+-- "1", "12", "123", "1234", "12345", "123456", "1234567", "12345678", "123456789",
+-- "1,1",
+-- "12,12",
+-- "123,123",
+-- "1234,123",
+-- "1234,1234",
+-- "12345,1234",
+-- "1234,12345",
+-- "12345,12345",
+-- "123456,123456",
+-- "1234567,1234567",
+-- "12345678,12345678",
+-- "123456789,123456789",
+-- "0,1234",
+-- "1234,0",
+-- "1234,00",
+-- "0,123456789",
+-- }
+-- for i=1,#t do print(formatters["%-20s : [%s]"](t[i],numbermess(t[i]))) end
+
+statistics.register("asciimath",function()
+ if trace_digits then
+ local n = table.count(collected_digits)
+ if n > 0 then
+ table.save(collected_filename,collected_digits)
+ return string.format("%s digit conversions saved in %s",n,collected_filename)
+ else
+ os.remove(collected_filename)
+ end
+ end
+end)
+
+local p_number_base = patterns.cpnumber or patterns.cnumber or patterns.number
+local p_number = C(p_number_base)
+----- p_number = p_number_base
+local p_spaces = patterns.whitespace
+
+local p_utf_base = patterns.utf8character
+local p_utf = C(p_utf_base)
+local p_entity = (P("&") * C((1-P(";"))^2) * P(";"))/ entities
+
+entities["gt"] = ">"
+entities["lt"] = "<"
+entities["amp"] = "&"
+entities["dquot"] = '"'
+entities["quot"] = "'"
+
+local p_onechar = p_utf_base * P(-1)
+
+----- p_number = Cs((patterns.cpnumber or patterns.cnumber or patterns.number)/function(s) return (gsub(s,",","{,}")) end)
+
+local sign = P("-")^-1
+local digits = R("09")^1
+local integer = sign * digits
+local real = digits * (S(".") * digits)^-1
+local float = real * (P("E") * integer)^-1
+
+-- local number = C(float + integer)
+-- local p_number = C(float)
+local p_number = float / numbermess
+
+local k_reserved = sortedkeys(reserved)
+local k_commands = { }
+local k_unicode = { }
+
+asciimath.keys = {
+ reserved = k_reserved
+}
+
+local k_reserved_different = { }
+local k_reserved_words = { }
+
+for k, v in sortedhash(reserved) do
+ local replacement = v[2]
+ if v[1] then
+ k_unicode[k] = replacement
+ else
+ k_unicode[k] = k -- keep them ... later we remap these
+ if k ~= replacement then
+ k_reserved_different[#k_reserved_different+1] = k
+ end
+ end
+
+for k, v in next, entities do
+ k_unicode[k] = v
+ k_unicode["\\"..k] = v
+end
+
+if not find(k,"[^[a-zA-Z]+$]") then
+ k_unicode["\\"..k] = k -- dirty trick, no real unicode
+end
+
+ if not find(k,"[^a-zA-Z]") then
+ k_reserved_words[#k_reserved_words+1] = k
+ end
+ k_commands[k] = replacement
+end
+
+local p_reserved =
+ lpeg.utfchartabletopattern(k_reserved_different) / k_commands
+
+local p_unicode =
+ lpeg.utfchartabletopattern(table.keys(k_unicode)) / k_unicode
+
+local p_texescape = patterns.texescape
+
+local function texescaped(s)
+ return lpegmatch(p_texescape,s)
+end
+
+local p_text =
+ P("text")
+ * p_spaces^0
+ * Cc("\\asciimathoptext")
+ * ( -- maybe balanced
+ Cs( P("{") * ((1-P("}"))^0/texescaped) * P("}") )
+ + Cs((P("(")/"{") * ((1-P(")"))^0/texescaped) * (P(")")/"}"))
+ )
+ + Cc("\\asciimathoptext") * Cs(Cc("{") * (patterns.undouble/texescaped) * Cc("}"))
+
+local m_left = {
+ ["(:"] = s_langle,
+ ["{:"] = s_left,
+ ["[:"] = s_left,
+ ["("] = s_lparent,
+ ["["] = s_lbracket,
+ ["{"] = s_lbrace,
+ ["⟨"] = s_langle,
+ ["⌈"] = s_lceil,
+ ["⌊"] = s_lfloor,
+
+ -- ["<<"] = s_langle, -- why not <:
+ -- ["|_"] = s_lfloor,
+ -- ["|~"] = s_lceil,
+ -- ["〈"] = s_langle,
+ -- ["〈"] = s_langle,
+
+ -- ["lparent"] = s_lparent,
+ -- ["lbracket"] = s_lbracket,
+ -- ["lbrace"] = s_lbrace,
+ -- ["langle"] = s_langle,
+ -- ["lfloor"] = s_lfloor,
+ -- ["lceil"] = s_lceil,
+}
+
+local m_right = {
+ [":)"] = s_rangle,
+ [":}"] = s_right,
+ [":]"] = s_right,
+ [")"] = s_rparent,
+ ["]"] = s_rbracket,
+ ["}"] = s_rbrace,
+ ["⟩"] = s_rangle,
+ ["⌉"] = s_rceil,
+ ["⌋"] = s_rfloor,
+
+ -- [">>"] = s_rangle, -- why not :>
+ -- ["~|"] = s_rceil,
+ -- ["_|"] = s_rfloor,
+ -- ["〉"] = s_rangle,
+ -- ["〉"] = s_rangle,
+
+ -- ["rparent"] = s_rparent,
+ -- ["rbracket"] = s_rbracket,
+ -- ["rbrace"] = s_rbrace,
+ -- ["rangle"] = s_rangle,
+ -- ["rfloor"] = s_rfloor,
+ -- ["rceil"] = s_rceil,
+}
+
+local islimits = {
+ ["\\sum"] = true,
+ -- ["∑"] = true,
+ ["\\prod"] = true,
+ -- ["∏"] = true,
+ ["\\lim"] = true,
+}
+
+local p_left =
+ lpeg.utfchartabletopattern(m_left) / m_left
+local p_right =
+ lpeg.utfchartabletopattern(m_right) / m_right
+
+-- special cases
+
+-- local p_special =
+-- C("/")
+-- + P("\\ ") * Cc("{}") * p_spaces^0 * C(S("^_"))
+-- + P("\\ ") * Cc("\\space")
+-- + P("\\\\") * Cc("\\backslash")
+-- + P("\\") * (R("az","AZ")^1/entities)
+-- + P("|") * Cc("\\|")
+--
+-- faster bug also uglier:
+
+local p_special =
+ P("|") * Cc("\\|") -- s_mbar -- maybe always add left / right as in mml ?
+ + P("\\") * (
+ (
+ P(" ") * (
+ Cc("{}") * p_spaces^0 * C(S("^_"))
+ + Cc("\\space")
+ )
+ )
+ + P("\\") * Cc("\\backslash")
+ -- + (R("az","AZ")^1/entities)
+ + C(R("az","AZ")^1)
+ )
+
+-- open | close :: {: | :}
+
+local e_parser = Cs ( (
+ p_entity +
+ p_utf_base
)^0 )
-local parser
-local function converted(original,totex)
- local ok, result
- if trace_mapping then
- report_asciimath("original : %s",original)
+local u_parser = Cs ( (
+ patterns.doublequoted +
+ P("text") * p_spaces^0 * P("(") * (1-P(")"))^0 * P(")") + -- -- todo: balanced
+ p_unicode +
+ p_utf_base
+)^0 )
+
+local a_parser = Ct { "tokenizer",
+ tokenizer = (
+ p_spaces
+ + p_number
+ + p_text
+ -- + Ct(p_open * V("tokenizer") * p_close) -- {: (a+b,=,1),(a+b,=,7) :}
+ -- + Ct(p_open * V("tokenizer") * p_close_right) -- { (a+b,=,1),(a+b,=,7) :}
+ -- + Ct(p_open_left * V("tokenizer") * p_right) -- {: (a+b,=,1),(a+b,=,7) }
+ + Ct(p_left * V("tokenizer") * p_right) -- { (a+b,=,1),(a+b,=,7) }
+ + p_special
+ + p_reserved
+ -- + p_utf - p_close - p_right
+ + (p_utf - p_right)
+ )^1,
+}
+
+local collapse = nil
+local serialize = table.serialize
+local f_state = formatters["level %s : %s : intermediate"]
+
+local function show_state(t,level,state)
+ report_asciimath(serialize(t,f_state(level,state)))
+end
+
+local function show_result(original,entified,unicoded,texcoded)
+ report_asciimath("original > %s",original)
+ report_asciimath("entified > %s",entified)
+ report_asciimath("unicoded > %s",unicoded)
+ report_asciimath("texcoded > %s",texcoded)
+end
+
+local function collapse_matrices(t)
+ local n = #t
+ if n > 4 and t[3] == "," then
+ local l1 = t[1]
+ local r1 = t[n]
+ if isleft[l1] and isright[r1] then
+ local l2 = t[2]
+ local r2 = t[n-1]
+ if type(l2) == "table" and type(r2) == "table" then
+ -- we have a matrix
+ local valid = true
+ for i=3,n-2,2 do
+ if t[i] ~= "," then
+ valid = false
+ break
+ end
+ end
+ if valid then
+ for i=2,n-1,2 do
+ local ti = t[i]
+ local tl = ti[1]
+ local tr = ti[#ti]
+ if isleft[tl] and isright[tr] then
+ -- ok
+ else
+ valid = false
+ break
+ end
+ end
+ if valid then
+ local omit = l1 == s_left and r1 == s_right
+ if omit then
+ t[1] = "\\startmatrix"
+ else
+ t[1] = l1 .. "\\startmatrix"
+ end
+ for i=2,n-1 do
+ if t[i] == "," then
+ t[i] = "\\NR"
+ else
+ local ti = t[i]
+ ti[1] = "\\NC"
+ for i=2,#ti-1 do
+ if ti[i] == "," then
+ ti[i] = "\\NC"
+ end
+ end
+ ti[#ti] = nil
+ end
+ end
+ if omit then
+ t[n] = "\\NR\\stopmatrix"
+ else
+ t[n] = "\\NR\\stopmatrix" .. r1
+ end
+ end
+ end
+ end
+ end
end
- local premapped = lpegmatch(premapper,original)
- if premapped then
- if trace_mapping then
- report_asciimath("prepared : %s",premapped)
+ return t
+end
+
+local function collapse_bars(t)
+ local n, i, l, m = #t, 1, false, 0
+ while i <= n do
+ local current = t[i]
+ if current == "\\|" then
+ if l then
+ m = m + 1
+ t[l] = s_lbar
+ t[i] = s_rbar
+ t[m] = { unpack(t,l,i) }
+ l = false
+ else
+ l = i
+ end
+ elseif not l then
+ m = m + 1
+ t[m] = current
end
- local parsed = lpegmatch(parser,premapped)
- if parsed then
- if trace_mapping then
- report_asciimath("parsed : %s",parsed)
+ i = i + 1
+ end
+ if l then
+ local tt = { s_lnothing } -- space fools final checker
+ local tm = 1
+ for i=1,m do
+ tm = tm + 1
+ tt[tm] = t[i]
+ end
+ tm = tm + 1
+ tt[tm] = s_mbar
+ for i=l+1,n do
+ tm = tm + 1
+ tt[tm] = t[i]
+ end
+ tm = tm + 1
+ tt[tm] = s_rnothing -- space fools final checker
+ m = tm
+ t = tt
+ elseif m < n then
+ for i=n,m+1,-1 do
+ t[i] = nil
+ end
+ end
+ return t
+end
+
+local function collapse_pairs(t)
+ local n, i = #t, 1
+ while i < n do
+ local current = t[i]
+ if current == "/" and i > 1 then
+ local tl = t[i-1]
+ local tr = t[i+1]
+ local tn = t[i+2]
+ if type(tl) == "table" then
+ if isleft[tl[1]] and isright[tl[#tl]] then
+ tl[1] = "" -- todo: remove
+ tl[#tl] = nil
+ end
end
- local postmapped = lpegmatch(postmapper,parsed)
- if postmapped then
- if trace_mapping then
- report_asciimath("finalized: %s",postmapped)
+ if type(tr) == "table" then
+ if tn == "^" then
+ -- brr 1/(1+x)^2
+ elseif isleft[tr[1]] and isright[tr[#tr]] then
+ tr[1] = "" -- todo: remove
+ tr[#tr] = nil
end
- result, ok = postmapped, true
+ end
+ i = i + 2
+ elseif current == "," or current == ";" then
+ -- t[i] = current .. "\\thinspace" -- look sbad in (a,b)
+ i = i + 1
+ else
+ i = i + 1
+ end
+ end
+ return t
+end
+
+local function collapse_parentheses(t)
+ local n, i = #t, 1
+ if n > 2 then
+ while i < n do
+ local current = t[i]
+ if type(current) == "table" and isleft[t[i-1]] and isright[t[i+1]] then
+ local c = #current
+ if c > 2 and isleft[current[1]] and isright[current[c]] then
+ remove(current,c)
+ remove(current,1)
+ end
+ i = i + 3
else
- result = "error in postmapping"
+ i = i + 1
+ end
+ end
+ end
+ return t
+end
+
+local function collapse_signs(t)
+ local n, m, i = #t, 0, 1
+ while i <= n do
+ m = m + 1
+ local current = t[i]
+ if isunary[current] then
+ local one = t[i+1]
+ if not one then
+ m = m + 1
+ t[m] = current .. "{}" -- error
+ break
+ end
+ if type(one) == "table" then
+ if isleft[one[1]] and isright[one[#one]] then
+ remove(one,#one)
+ remove(one,1)
+ end
+ one = collapse(one,level)
+ elseif one == "-" and i + 2 <= n then -- or another sign ? or unary ?
+ local t2 = t[i+2]
+ if type(t2) == "string" then
+ one = one .. t2
+ i = i + 1
+ end
+ end
+ t[m] = current .. "{" .. one .. "}"
+ i = i + 2
+ elseif i + 2 <= n and isfunny[current] then
+ local one = t[i+1]
+ if isinfix[one] then
+ local two = t[i+2]
+ if two == "-" then -- or another sign ? or unary ?
+ local three = t[i+3]
+ if three then
+ if type(three) == "table" then
+ three = collapse(three,level)
+ end
+ t[m] = current .. one .. "{" .. two .. three .. "}"
+ i = i + 4
+ else
+ t[m] = current
+ i = i + 1
+ end
+ else
+ t[m] = current
+ i = i + 1
+ end
+ else
+ t[m] = current
+ i = i + 1
end
else
- result = "error in mapping"
+ t[m] = current
+ i = i + 1
end
+ end
+ if i == n then -- yes?
+ m = m + 1
+ t[m] = t[n]
+ end
+ if m < n then
+ for i=n,m+1,-1 do
+ t[i] = nil
+ end
+ end
+ return t
+end
+
+local function collapse_binaries(t)
+ local n, m, i = #t, 0, 1
+ while i <= n do
+ m = m + 1
+ local current = t[i]
+ if isbinary[current] then
+ local one = t[i+1]
+ local two = t[i+2]
+ if not one then
+ t[m] = current .. "{}{}" -- error
+ break
+ end
+ if type(one) == "table" then
+ if isleft[one[1]] and isright[one[#one]] then
+ remove(one,#one)
+ remove(one,1)
+ end
+ one = collapse(one,level)
+ end
+ if not two then
+ t[m] = current .. "{" .. one .. "}{}"
+ break
+ end
+ if type(two) == "table" then
+ if isleft[two[1]] and isright[two[#two]] then
+ remove(two,#two)
+ remove(two,1)
+ end
+ two = collapse(two,level)
+ end
+ t[m] = current .. "{" .. one .. "}{" .. two .. "}"
+ i = i + 3
+ else
+ t[m] = current
+ i = i + 1
+ end
+ end
+ if i == n then -- yes?
+ m = m + 1
+ t[m] = t[n]
+ end
+ if m < n then
+ for i=n,m+1,-1 do
+ t[i] = nil
+ end
+ end
+ return t
+end
+
+local function collapse_infixes_1(t)
+ local n, i = #t, 1
+ while i <= n do
+ local current = t[i]
+ if isinfix[current] then
+ local what = t[i+1]
+ if what then
+ if type(what) == "table" then
+ local f, l = what[1], what[#what]
+ if isleft[f] and isright[l] then
+ remove(what,#what)
+ remove(what,1)
+ end
+ t[i+1] = collapse(what,level) -- collapse ?
+ end
+ i = i + 2
+ else
+ break
+ end
+ else
+ i = i + 1
+ end
+ end
+ return t
+end
+
+function collapse_limits(t)
+ local n, m, i = #t, 0, 1
+ while i <= n do
+ m = m + 1
+ local current = t[i]
+ if islimits[current] then
+ local one, two, first, second = nil, nil, t[i+1], t[i+3]
+ if first and isinfix[first] then
+ one = t[i+2]
+ if one then
+ -- if type(one) == "table" then
+ -- if isleft[one[1]] and isright[one[#one]] then
+ -- remove(one,#one)
+ -- remove(one,1)
+ -- end
+ -- one = collapse(one,level)
+ -- end
+ if second and isinfix[second] then
+ two = t[i+4]
+ -- if type(two) == "table" then
+ -- if isleft[two[1]] and isright[two[#two]] then
+ -- remove(two,#two)
+ -- remove(two,1)
+ -- end
+ -- two = collapse(two,level)
+ -- end
+ end
+ if two then
+ t[m] = current .. "\\limits" .. first .. "{" .. one .. "}" .. second .. "{" .. two .. "}"
+ i = i + 5
+ else
+ t[m] = current .. "\\limits" .. first .. "{" .. one .. "}"
+ i = i + 3
+ end
+ else
+ t[m] = current
+ i = i + 1
+ end
+ else
+ t[m] = current
+ i = i + 1
+ end
+ else
+ t[m] = current
+ i = i + 1
+ end
+ end
+ if i == n then -- yes?
+ m = m + 1
+ t[m] = t[n]
+ end
+ if m < n then
+ for i=n,m+1,-1 do
+ t[i] = nil
+ end
+ end
+ return t
+end
+
+local function collapse_tables(t)
+ local n, m, i = #t, 0, 1
+ while i <= n do
+ m = m + 1
+ local current = t[i]
+ if type(current) == "table" then
+ if current[1] == "\\NC" then
+ t[m] = collapse(current,level)
+ else
+ t[m] = "{" .. collapse(current,level) .. "}"
+ end
+ i = i + 1
+ else
+ t[m] = current
+ i = i + 1
+ end
+ end
+ if i == n then -- yes?
+ m = m + 1
+ t[m] = t[n]
+ end
+ if m < n then
+ for i=n,m+1,-1 do
+ t[i] = nil
+ end
+ end
+ return t
+end
+
+local function collapse_infixes_2(t)
+ local n, m, i = #t, 0, 1
+ while i < n do
+ local current = t[i]
+ if isinfix[current] and i > 1 then
+ local tl = t[i-1]
+ local tr = t[i+1]
+ local ti = t[i+2]
+ local tn = t[i+3]
+ if ti and tn and isinfix[ti] then
+ t[m] = tl .. current .. "{" .. tr .. "}" .. ti .. "{" .. tn .. "}"
+ i = i + 4
+ else
+ t[m] = tl .. current .. "{" .. tr .. "}"
+ i = i + 2
+ end
+ else
+ m = m + 1
+ t[m] = current
+ i = i + 1
+ end
+ end
+ if i == n then
+ m = m + 1
+ t[m] = t[n]
+ end
+ if m < n then
+ for i=n,m+1,-1 do
+ t[i] = nil
+ end
+ end
+ return t
+end
+
+local function collapse_fractions_1(t)
+ local n, m, i = #t, 0, 1
+ while i < n do
+ local current = t[i]
+ if current == "/" and i > 1 then
+ local tl = t[i-1]
+ local tr = t[i+1]
+ t[m] = "\\frac{" .. tl .. "}{" .. tr .. "}"
+ i = i + 2
+ if i < n then
+ m = m + 1
+ t[m] = t[i]
+ i = i + 1
+ end
+ else
+ m = m + 1
+ t[m] = current
+ i = i + 1
+ end
+ end
+ if i == n then
+ m = m + 1
+ t[m] = t[n]
+ end
+ if m < n then
+ for i=n,m+1,-1 do
+ t[i] = nil
+ end
+ end
+ return t
+end
+
+local function collapse_fractions_2(t)
+ local n, m, i = #t, 0, 1
+ while i < n do
+ local current = t[i]
+ if current == "⁄" and i > 1 then -- \slash
+ t[m] = "{" .. s_left .. t[i-1] .. s_mslash .. t[i+1] .. s_right .. "}"
+ i = i + 2
+ if i < n then
+ m = m + 1
+ t[m] = t[i]
+ i = i + 1
+ end
+ else
+ m = m + 1
+ t[m] = current
+ i = i + 1
+ end
+ end
+ if i == n then
+ m = m + 1
+ t[m] = t[n]
+ end
+ if m < n then
+ for i=n,m+1,-1 do
+ t[i] = nil
+ end
+ end
+ return t
+end
+
+local function collapse_result(t)
+ local n = #t
+ if t[1] == s_left and t[n] == s_right then -- see bar .. space needed there
+ return concat(t," ",2,n-1)
else
- result = "error in premapping"
+ return concat(t," ")
end
- if totex then
- if ok then
- context.mathematics(result)
+end
+
+collapse = function(t,level)
+ -- check
+ if not t then
+ return ""
+ end
+ -- tracing
+ if trace_detail then
+ if level then
+ level = level + 1
else
- context.type(result) -- some day monospaced
+ level = 1
+ end
+ show_state(t,level,"parsed")
+ end
+ -- steps
+ t = collapse_matrices (t) if trace_detail then show_state(t,level,"matrices") end
+ t = collapse_bars (t) if trace_detail then show_state(t,level,"bars") end
+ t = collapse_pairs (t) if trace_detail then show_state(t,level,"pairs") end
+ t = collapse_parentheses(t) if trace_detail then show_state(t,level,"parentheses") end
+ t = collapse_signs (t) if trace_detail then show_state(t,level,"signs") end
+ t = collapse_binaries (t) if trace_detail then show_state(t,level,"binaries") end
+ t = collapse_infixes_1 (t) if trace_detail then show_state(t,level,"infixes (1)") end
+ t = collapse_limits (t) if trace_detail then show_state(t,level,"limits") end
+ t = collapse_tables (t) if trace_detail then show_state(t,level,"tables") end
+ t = collapse_infixes_2 (t) if trace_detail then show_state(t,level,"infixes (2)") end
+ t = collapse_fractions_1(t) if trace_detail then show_state(t,level,"fractions (1)") end
+ t = collapse_fractions_2(t) if trace_detail then show_state(t,level,"fractions (2)") end
+ -- done
+ return collapse_result(t)
+end
+
+-- todo: cache simple ones, say #str < 10, maybe weak
+
+local context = context
+local ctx_mathematics = context and context.mathematics or report_asciimath
+local ctx_type = context and context.type or function() end
+local ctx_inleft = context and context.inleft or function() end
+
+local function convert(str,totex)
+ local entified = lpegmatch(e_parser,str) or str -- when used in text
+ local unicoded = lpegmatch(u_parser,entified) or entified
+ local texcoded = collapse(lpegmatch(a_parser,unicoded))
+ if trace_mapping then
+ show_result(str,entified,unicoded,texcoded)
+ end
+ if totex then
+ ctx_mathematics(texcoded)
+ else
+ return texcoded
+ end
+end
+
+local n = 0
+local p = (
+ (S("{[(") + P("\\left" )) / function() n = n + 1 end
+ + (S("}])") + P("\\right")) / function() n = n - 1 end
+ + p_utf_base
+)^0
+
+local function invalidtex(str)
+ n = 0
+ lpegmatch(p,str)
+ if n == 0 then
+ return false
+ elseif n < 0 then
+ return formatters["too many left fences: %s"](-n)
+ elseif n > 0 then
+ return formatters["not enough right fences: %s"](n)
+ end
+end
+
+local collected = { }
+local indexed = { }
+
+-- bonus
+
+local p_reserved_spaced =
+ C(lpeg.utfchartabletopattern(k_reserved_words)) / " %1 "
+
+local p_text =
+ C(P("text")) / " %1 "
+ * p_spaces^0
+ * ( -- maybe balanced
+ (P("{") * (1-P("}"))^0 * P("}"))
+ + (P("(") * (1-P(")"))^0 * P(")"))
+ )
+ + patterns.doublequoted
+
+local p_expand = Cs((p_text + p_reserved_spaced + p_utf_base)^0)
+local p_compress = patterns.collapser
+
+local function cleanedup(str)
+ return lpegmatch(p_compress,lpegmatch(p_expand,str)) or str
+end
+
+-- so far
+
+local function register(s,cleanedup,collected,shortname)
+ local c = cleanedup(s)
+ local f = collected[c]
+ if f then
+ f.count = f.count + 1
+ f.files[shortname] = (f.files[shortname] or 0) + 1
+ if s ~= c then
+ f.cleanedup = f.cleanedup + 1
+ end
+ f.dirty[s] = (f.dirty[s] or 0) + 1
+ else
+ local texcoded = convert(s)
+ local message = invalidtex(texcoded)
+ if message then
+ report_asciimath("%s: %s : %s",message,s,texcoded)
end
+ collected[c] = {
+ count = 1,
+ files = { [shortname] = 1 },
+ texcoded = texcoded,
+ message = message,
+ cleanedup = s ~= c and 1 or 0,
+ dirty = { [s] = 1 }
+ }
+ end
+end
+
+local function wrapup(collected,indexed)
+ local n = 0
+ for k, v in sortedhash(collected) do
+ n = n + 1
+ v.n= n
+ indexed[n] = k
+ end
+end
+
+function collect(fpattern,element,collected,indexed)
+ local element = element or "am"
+ local mpattern = formatters["<%s>(.-)</%s>"](element,element)
+ local filenames = resolvers.findtexfile(fpattern)
+ if filenames and filenames ~= "" then
+ filenames = { filenames }
else
- return result
- end
-end
-
-local function onlyconverted(str)
- local parsed = lpegmatch(parser,str)
- return parsed or str
-end
-
-local sqrt = P("sqrt") / "\\rootradical \\bgroup \\egroup "
-local root = P("root") / "\\rootradical "
-local frac = P("frac") / "\\frac "
-local stackrel = P("stackrel") / "\\stackrel "
-local text = P("text") / "\\mathoptext "
-local hat = P("hat") / "\\widehat "
-local overbar = P("bar") / "\\overbar "
-local underline = P("ul") / "\\underline "
-local vec = P("vec") / "\\overrightarrow "
-local dot = P("dot") / "\\dot "
-local ddot = P("ddot") / "\\ddot "
-
-local left = P("(:") + P("{:") + P("(") + P("[") + P("{")
-local right = P(":)") + P(":}") + P(")") + P("]") + P("}")
-local leftnorright = 1 - left - right
-local singles = sqrt + text + hat + underline + overbar + vec + ddot + dot
-local doubles = root + frac + stackrel
-local ignoreleft = (left/"") * spaces * spaces
-local ignoreright = spaces * (right/"") * spaces
-local ignoreslash = spaces * (P("/")/"") * spaces
-local comma = P(",")
-local nocomma = 1-comma
-local anychar = P(1)
-local openmatrix = left * spaces * Cc("\\matrix\\bgroup ")
-local closematrix = Cc("\\egroup ") * spaces * right
-local nextcolumn = spaces * (comma/"&") * spaces
-local nextrow = spaces * (comma/"\\cr ") * spaces
-local finishrow = Cc("\\cr ")
-local opengroup = left/"\\bgroup "
-local closegroup = right/"\\egroup "
-local somescript = S("^_") * spaces
-local beginargument = Cc("\\bgroup ")
-local endargument = Cc("\\egroup ")
-
-parser = Cs { "main",
-
- scripts = somescript * V("argument"),
- division = Cc("\\frac") * V("argument") * spaces * ignoreslash * spaces * V("argument"),
- double = doubles * spaces * V("argument") * spaces * V("argument"),
- single = singles * spaces * V("argument"),
-
- balanced = opengroup * (C((leftnorright + V("balanced"))^0)/onlyconverted) * closegroup,
- argument = V("balanced") + V("token"),
-
- element = (V("step") + (V("argument") + V("step")) - ignoreright - nextcolumn - comma)^1,
- commalist = ignoreleft * V("element") * (nextcolumn * spaces * V("element"))^0 * ignoreright,
- matrix = openmatrix * spaces * (V("commalist") * (nextrow * V("commalist"))^0) * finishrow * closematrix,
-
- token = beginargument * (texnic + float + real + number + letter) * endargument,
-
- step = V("scripts") + V("division") + V("single") + V("double"),
- main = (V("matrix") + V("step") + anychar)^0,
+ filenames = dir.glob(fpattern)
+ end
+ local cfpattern = gsub(fpattern,"^%./",lfs.currentdir())
+ local cfpattern = gsub(cfpattern,"\\","/")
+ local wildcard = string.split(cfpattern,"*")[1]
+ if not collected then
+ collected = { }
+ indexed = { }
+ end
+ for i=1,#filenames do
+ filename = gsub(filenames[i],"\\","/")
+ local splitname = (wildcard and wildcard ~= "" and string.split(filename,wildcard)[2]) or filename
+ local shortname = gsub(splitname or file.basename(filename),"^%./","")
+ if shortname == "" then
+ shortname = filename
+ end
+ local fullname = resolvers.findtexfile(filename) or filename
+ if fullname ~= "" then
+ for s in gmatch(io.loaddata(fullname),mpattern) do
+ register(s,cleanedup,collected,shortname)
+ end
+ end
+ end
+ wrapup(collected,indexed)
+ return collected, indexed
+end
+
+function filter(root,pattern,collected,indexed)
+ if not pattern or pattern == "" then
+ pattern = "am"
+ end
+ if not collected then
+ collected = { }
+ indexed = { }
+ end
+ for c in xmlcollected(root,pattern) do
+ register(xmltext(c),cleanedup,collected,xmlinclusion(c) or "" )
+ end
+ wrapup(collected,indexed)
+ return collected, indexed
+end
+
+asciimath.convert = convert
+asciimath.reserved = reserved
+asciimath.collect = collect
+asciimath.filter = filter
+asciimath.invalidtex = invalidtex
+asciimath.cleanedup = cleanedup
+-- sin(x) = 1 : 3.3 uncached 1.2 cached , so no real gain (better optimize the converter then)
+
+local function convert(str)
+ if #str > 0 then
+ local entified = lpegmatch(e_parser,str) or str -- when used in text
+ local unicoded = lpegmatch(u_parser,entified) or entified
+ if lpegmatch(p_onechar,unicoded) then
+ ctx_mathematics(unicoded)
+ else
+ local texcoded = collapse(lpegmatch(a_parser,unicoded))
+ if trace_mapping then
+ show_result(str,entified,unicoded,texcoded)
+ end
+ if #texcoded == 0 then
+ report_asciimath("error in asciimath: %s",str)
+ else
+ local message = invalidtex(texcoded)
+ if message then
+ report_asciimath("%s: %s : %s",message,str,texcoded)
+ ctx_type(formatters["<%s>"](message))
+ else
+ ctx_mathematics(texcoded)
+ end
+ end
+ end
+ end
+end
+
+local context = context
+
+if not context then
+
+-- trace_mapping = true
+-- trace_detail = true
+
+-- report_asciimath(cleanedup([[ac+sinx+xsqrtx+sinsqrtx+sinsqrt(x)]]))
+-- report_asciimath(cleanedup([[a "αsinsqrtx" b]]))
+-- report_asciimath(cleanedup([[a "α" b]]))
+-- report_asciimath(cleanedup([[//4]]))
+
+-- convert("\\frac{a}{b}")
+-- convert("frac{a}{b}")
+-- convert("\\sin{a}{b}")
+-- convert("sin{a}{b}")
+-- convert("1: rightarrow")
+-- convert("2: \\rightarrow")
+
+-- convert("((1,2,3),(4,5,6),(7,8,9))")
+
+-- convert("1/(t+x)^2")
+
+-- convert("AA a > 0 ^^ b > 0 | {:log_g:} a + {:log_g:} b")
+-- convert("AA a &gt; 0 ^^ b > 0 | {:log_g:} a + {:log_g:} b")
+
+-- convert("10000,00001")
+-- convert("4/18*100text(%)~~22,2")
+-- convert("4/18*100text(%)≈22,2")
+-- convert("62541/(197,6)≈316,05")
+
+-- convert([[sum x]])
+-- convert([[sum^(1)_(2) x]])
+-- convert([[lim_(1)^(2) x]])
+-- convert([[lim_(1) x]])
+-- convert([[lim^(2) x]])
+
+-- convert([[{: rangle]])
+-- convert([[\langle\larr]])
+-- convert([[langlelarr]])
+-- convert([[D_f=[0 ,→〉]])
+-- convert([[ac+sinx+xsqrtx]])
+-- convert([[ac+\alpha x+xsqrtx-cc b*pi**psi-3alephx / bb X]])
+-- convert([[ac+\ ^ x+xsqrtx]])
+-- convert([[d/dx(x^2+1)]])
+-- convert([[a "αsinsqrtx" b]])
+-- convert([[a "α" b]])
+-- convert([[//4]])
+-- convert([[ {(a+b,=,1),(a+b,=,7)) ]])
+
+-- convert([[ 2/a // 5/b = (2 b) / ( a b) // ( 5 a ) / ( a b ) = (2 b ) / ( 5 a ) ]])
+-- convert([[ (2+x)/a // 5/b ]])
+
+-- convert([[ ( 2/a ) // ( 5/b ) = ( (2 b) / ( a b) ) // ( ( 5 a ) / ( a b ) ) = (2 b ) / ( 5 a ) ]])
+
+-- convert([[ (x/y)^3 = x^3/y^3 ]])
+
+-- convert([[ {: (1,2) :} ]])
+-- convert([[ {: (a+b,=,1),(a+b,=,7) :} ]])
+-- convert([[ { (a+b,=,1),(a+b,=,7) :} ]])
+-- convert([[ {: (a+b,=,1),(a+b,=,7) } ]])
+-- convert([[ { (a+b,=,1),(a+b,=,7) } ]])
+
+-- convert([[(1,5 ±sqrt(1,25 ),0 )]])
+-- convert([[1//2]])
+-- convert([[(p)/sqrt(p)]])
+-- convert([[u_tot]])
+-- convert([[u_tot=4,4 L+0,054 T]])
+
+-- convert([[ [←;0,2] ]])
+-- convert([[ [←;0,2⟩ ]])
+-- convert([[ ⟨←;0,2 ) ]])
+-- convert([[ ⟨←;0,2 ] ]])
+-- convert([[ ⟨←;0,2⟩ ]])
+
+-- convert([[ x^2(x-1/16)=0 ]])
+-- convert([[ y = ax + 3 - 3a ]])
+-- convert([[ y= ((1/4)) ^x ]])
+-- convert([[ x=\ ^ (1/4) log(0 ,002 )= log(0,002) / (log(1/4) ]])
+-- convert([[ x=\ ^glog(y) ]])
+-- convert([[ x^ (-1 1/2) =1/x^ (1 1/2)=1/ (x^1*x^ (1/2)) =1/ (xsqrt(x)) ]])
+-- convert([[ x^2(10 -x)&gt;2 x^2 ]])
+-- convert([[ x^4&gt;x ]])
+
+ return
+
+end
+
+interfaces.implement {
+ name = "asciimath", -- module_asciimath_convert
+ actions = convert,
+ arguments = "string"
}
-asciimath.reserved = reserved
-asciimath.convert = converted
+local ctx_typebuffer = context.typebuffer
+local ctx_mathematics = context.mathematics
+local ctx_color = context.color
+
+local sequenced = table.sequenced
+local assign_buffer = buffers.assign
+
+local show = { }
+asciimath.show = show
+
+local collected, indexed, ignored = { }, { }, { }
+
+local color = { "darkred" }
+
+function show.ignore(n)
+ if type(n) == "string" then
+ local c = collected[n]
+ n = c and c.n
+ end
+ if n then
+ ignored[n] = true
+ end
+end
+
+function show.count(n,showcleanedup)
+ local v = collected[indexed[n]]
+ local count = v.count
+ local cleanedup = v.cleanedup
+ if not showcleanedup or cleanedup == 0 then
+ context(count)
+ elseif count == cleanedup then
+ ctx_color(color,count)
+ else
+ context("%s+",count-cleanedup)
+ ctx_color(color,cleanedup)
+ end
+end
+
+local h = { }
+local am = { "am" }
+
+function show.nofdirty(n)
+ local k = indexed[n]
+ local v = collected[k]
+ local n = v.cleanedup
+ h = { }
+ if n > 0 then
+ for d, n in sortedhash(v.dirty) do
+ if d ~= k then
+ h[#h+1] = { d, n }
+ end
+ end
+ end
+ context(#h)
+end
+
+function show.dirty(m,wrapped)
+ local d = h[m]
+ if d then
+ ctx_inleft(d[2])
+ if wrapped then
+ assign_buffer("am",'"' .. d[1] .. '"')
+ else
+ assign_buffer("am",d[1])
+ end
+ ctx_typebuffer(am)
+ end
+end
+
+function show.files(n)
+ context(sequenced(collected[indexed[n]].files," "))
+end
-commands.convert = converted
+function show.input(n,wrapped)
+ if wrapped then
+ assign_buffer("am",'"' .. indexed[n] .. '"')
+ else
+ assign_buffer("am",indexed[n])
+ end
+ ctx_typebuffer(am)
+end
+
+function show.result(n)
+ local v = collected[indexed[n]]
+ if ignored[n] then
+ context("ignored")
+ elseif v.message then
+ ctx_color(color, v.message)
+ else
+ ctx_mathematics(v.texcoded)
+ end
+end
+
+function show.load(str,element)
+ collected, indexed, ignored = { }, { }, { }
+ local t = utilities.parsers.settings_to_array(str)
+ for i=1,#t do
+ asciimath.collect(t[i],element or "am",collected,indexed)
+ end
+end
+
+function show.filter(id,element)
+ collected, indexed, ignored = { }, { }, { }
+ asciimath.filter(lxml.getid(id),element or "am",collected,indexed)
+end
+
+function show.max()
+ context(#indexed)
+end
+
+function show.statistics()
+ local usedfiles = { }
+ local noffiles = 0
+ local nofokay = 0
+ local nofbad = 0
+ local nofcleanedup = 0
+ for k, v in next, collected do
+ if ignored[v.n] then
+ nofbad = nofbad + v.count
+ elseif v.message then
+ nofbad = nofbad + v.count
+ else
+ nofokay = nofokay + v.count
+ end
+ nofcleanedup = nofcleanedup + v.cleanedup
+ for k, v in next, v.files do
+ local u = usedfiles[k]
+ if u then
+ usedfiles[k] = u + 1
+ else
+ noffiles = noffiles + 1
+ usedfiles[k] = 1
+ end
+ end
+ end
+ local NC = context.NC
+ local NR = context.NR
+ local EQ = context.EQ
+ context.starttabulate { "|B||" }
+ NC() context("files") EQ() context(noffiles) NC() NR()
+ NC() context("formulas") EQ() context(nofokay+nofbad) NC() NR()
+ NC() context("uniques") EQ() context(#indexed) NC() NR()
+ NC() context("cleanedup") EQ() context(nofcleanedup) NC() NR()
+ NC() context("errors") EQ() context(nofbad) NC() NR()
+ context.stoptabulate()
+end
+
+function show.save(name)
+ table.save(name ~= "" and name or "dummy.lua",collected)
+end
diff --git a/Master/texmf-dist/tex/context/base/x-asciimath.mkiv b/Master/texmf-dist/tex/context/base/x-asciimath.mkiv
index fd385671a50..cc98b54acca 100644
--- a/Master/texmf-dist/tex/context/base/x-asciimath.mkiv
+++ b/Master/texmf-dist/tex/context/base/x-asciimath.mkiv
@@ -1,6 +1,6 @@
%D \module
-%D [ file=m-asciimath,
-%D version=2006.04.24, % 1999.11.06,
+%D [ file=x-asciimath,
+%D version=2014.06.01, % 2006.04.24, % 1999.11.06,
%D title=\CONTEXT\ Modules,
%D subtitle=AsciiMath,
%D author=Hans Hagen,
@@ -11,90 +11,371 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-%D Lua code.
-
\registerctxluafile{x-asciimath}{}
-\def\ctxmoduleasciimath#1{\ctxlua{moduledata.asciimath.#1}}
-
-%D The following code is not officially supported and is only meant
-%D for the Math4All project.
+%D When the Math4All project started, we immediately started using content \MATHML.
+%D Because in school math there is often a reference to calculator input, we also
+%D provided what we called \quote {calcmath}: a predictable expression based way
+%D entering math. At some point \OPENMATH\ was also used but that was later
+%D abandoned because editing is more cumbersome.
+%D
+%D Due to limitations in the web variant (which is independent of rendering for
+%D paper but often determines the coding of document, not seldom for the worse) the
+%D switch was made to presentational \MATHML. But even that proved to be too complex
+%D for rendering on the web, so it got converted to so called \ASCIIMATH\ which
+%D can be rendered using some \JAVASCRIPT\ magic. However, all the formulas (and
+%D we're talking of tens of thousands of them) were very precisely coded by the main
+%D author. Because in intermediate stages of the editing (by additional authors) a
+%D mixture of \MATHML\ and \ASCIIMATH\ was used, we wrote the first version of this
+%D module. As reference we took \url
+%D {http://www1.chapman.edu/~jipsen/mathml/asciimath.html} and. The idea was to
+%D stick to \MATHML\ as reference and if needed use \ASCIIMATH\ as annotation.
%D
-%D The following code kind of maps ascii math
-%D http://www1.chapman.edu/~jipsen/mathml/asciimath.html onto \TEX. The
-%D code was written for the math4all project but in retrospect we
-%D could have used just tex code as the web version can handle that
-%D as well. Anyhow, as we use \MATHML\ as basis it makes sense to add
-%D this to the repertoire as annotation variant, so now we have
-%D content \MATHML\ (prefered), presentation \MATHML\ (often messy),
-%D \OPENMATH\ (what was which we started with in this project)
-%D calcmath (handy for students who are accustomed to calculators),
-%D asciimath (to make Frits's live easier) and of course \TEX. Of
-%D course all are used mixed.
+%D Eventually we ended up with supporting several math encodings in \CONTEXT\ that
+%D could be used mixed: content \MATHML\ (preferred), presentation \MATHML\ (often
+%D messy), \OPENMATH\ (somewhat minimalistic) calcmath (handy for students who are
+%D accustomed to calculators), \ASCIIMATH\ (to make web support easier) and of
+%D course \TEX.
%D
-%D We don't support all quirks of asciimath as I am not in the mood to
-%D write a complex parser while a bit of sane coding can work as well.
+%D The first version had some limitations as we didn't want to support all quirks of
+%D \ASCIIMATH\ and also because I was not really in the mood to write a complex parser
+%D when a bit of sane coding can work equally well. Some comments from that version:
%D
+%D \startnarrower
%D \startitemize
-%D \item We support only the syntactically clear variants and as long
-%D as lpeg does not support left recursion this is as far as we
-%D want to go.
-%D \item The parser is rather insensitive for spaces but yet the advice is
-%D to avoid weird coding like \type {d/dxf(x)} but use \type {d/dx
-%D f(x)} instead. After all we're not in a compact coding cq.\
-%D parser challenge.
-%D \item We also don't support the somewhat confusing \type {sqrt sqrt 2}
-%D nor \type {root3x} (although the second one kind of works). A bit
-%D of defensive coding does not hurt.
-%D \item We can process \type {a/b/c/d} but it's not compatible with the
-%D default behaviour of asciimath. Use grouping instead. Yes, we do
-%D support the somewhat nonstandard grouping token mix.
-%D \item You should use explicit \type {text(..)} directives as one can
-%D never be sure what is a reserved word and not.
+%D \item We support only the syntactically clear variants and as long as lpeg does
+%D not support left recursion this is as far as we want to go.
+%D \item The parser is rather insensitive for spaces but yet the advice is to avoid
+%D weird coding like \type {d/dxf(x)} but use \type {d/dx f(x)} instead. After
+%D all we're not in a compact coding cq.\ parser challenge.
+%D \item We also don't support the somewhat confusing \type {sqrt sqrt 2} nor \type
+%D {root3x} (although the second one kind of works). A bit of defensive coding
+%D does not hurt.
+%D \item We can process \type {a/b/c/d} but it's not compatible with the default
+%D behaviour of \ASCIIMATH. Use grouping instead. Yes, we do support the somewhat
+%D nonstandard grouping token mix.
+%D \item You should use explicit \type {text(..)} directives as one can never be sure
+%D what is a reserved word and not.
%D \stopitemize
%D
-%D Actually, as the only parsing sensitive elements of \TEX\ are
-%D fractions (\type {\over} and friends, a restricted use of \TEX\
-%D coding is probably as comprehensive and parseble.
-%D
-%D The webpage with examples served as starting point so anything beyond
+%D Actually, as the only parsing sensitive elements of \TEX\ are fractions (\type {\over}
+%D and friends, a restricted use of \TEX\ coding is probably as comprehensive and
+%D parsable. The webpage with examples served as starting point so anything beyond
%D what can be found there isn't supported.
+%D \stopnarrower
+%D
+%D Then in 2014 something bad happened. Following the fashion of minimal encoding
+%D (which of course means messy encoding of complex cases and which can make authors
+%D sloppy too) the web based support workflow of the mentioned project ran into some
+%D limitations and magically one day all carefully coded \MATHML\ was converted into
+%D \ASCIIMATH. As there was no way to recover the original thousands of files and
+%D tens of thousands of formulas we were suddenly stuck with \ASCIIMATH. Because the
+%D conversion had be done automagically, we also saw numerous errors and were forced
+%D to come up with some methods to check formulas. Because \MATHML\ poses some
+%D restrictions it has predictable rendering; \ASCIIMATH\ on the other hand enforces
+%D no structure. Also, because \MATHML\ has to be valid \XML\ it always processes.
+%D Of course, during the decade that the project had run we also had to built in
+%D some catches for abuse but at least we had a relatively stable and configurable
+%D subsystem. So, in order to deal with less predictable cases as well as extensive
+%D checking, a new \ASCIIMATH\ parser was written, one that could also be used to
+%D trace bad coding.
+%D
+%D Because the formal description is incomplete, and because some links to resources
+%D are broken, and because some testing on the web showed that sequences of characters
+%D are interpreted that were not mentioned anywhere (visible), and because we noticed
+%D that the parser was dangerously tolerant, the new code is quite different from the
+%D old code.
+%D
+%D One need to keep in mind that because spaces are optional, the only robust way to
+%D edit \ASCIIMATH\ is to use a \WYSIWYG\ editor and hope that the parser doesn't
+%D change ever. Keys are picked up from spaceless sequences and when not recognized
+%D a (sequence) of characters is considered to be variables. So, \type {xsqrtx} is
+%D valid and renders as \type {$x\sqrt{x}$}, \type {xx} becomes \type {×} (times)
+%D but \type {ac} becomes \type {$a c$} (a times c). We're lucky that \type {AC} is
+%D not turned into Alternating Current, but who knows what happens a few years from
+%D now. So, we do support this spaceless mess, but users are warned: best use a
+%D spacy sequence. The extra amount of spaces (at one byte each) an author has to
+%D include in his|/|her active writing time probably stays below the size of one
+%D holiday picture. Another complication is that numbers (in Dutch) use commas instead
+%D of periods, but vectors use commas as well. We also hav esome different names for
+%D functions which then can conflict with the expectations about collapsed variables.
+%D
+%D It must be noted that simplified encodings (that seem to be the fashion today)
+%D can demand from applications to apply fuzzy logic to make something work out
+%D well. Because we have sequential data that gets rendered, sometimes wrong input
+%D gets obscured simply by the rendering: like the comma's in numbers as well as
+%D for separators (depending on space usage), or plain wrong symbols that somehow
+%D get a representation anyway. This in itself is more a side effect of trying to
+%D use the simplified encoding without applying rules (in the input) or to use it
+%D beyong its intended usage, which then of course can lead to adapted parsers and
+%D catches that themselves trigger further abuse. Imagine that instead of developing
+%D new cars, planes, space ships, mobile phones, computers we would have adapted
+%D horse cars, kites, firework, old fashioned phones and mechanical calculators in a
+%D similar way: patch upon patch of traditional means for sure would not have
+%D worked. So, when you use \ASCIIMATH\ best check immediately how it gets rendered
+%D in the browser as well as on paper. And be prepared to check the more complex
+%D code in the future again. We don't offer any guarantees but of course will try to
+%D keep up.
+%D
+%D In retrospect I sometimes wonder if the energy put into constantly adapting to
+%D the fashion of the day pays off. Probably not. It definitely doesn't pay of.
+%D
+%D More complex crap:
+%D
+%D 1: $x + \stackrel{comment}{\stackrel{\utfchar{"23DE}}{yyyyyyyy}} = y$ \blank
+%D 2: \asciimath{x + stackrel{\utfchar{"23DE}}{yyyyyyyy} = y} \blank
+%D 3: \asciimath{x + stackrel{yyyyyyyy}{\utfchar{"23DE}} = y} \blank
+%D 4: \asciimath{x + stackrel{"comment"}{stackrel{\utfchar{"23DE}}{yyyyyyyy}} = y} \blank
+
+\usemodule[mathml-basics]
+
+\startmodule[asciimath]
\unprotect
\writestatus{asciimath}{beware, this is an experimental (m4all only) module}
-%unexpanded\def\asciimath#1{\ctxmoduleasciimath{convert(\!!bs\detokenize{#1}\!!es,true)}}
-\unexpanded\def\asciimath#1{\ctxcommand{convert(\!!bs\detokenize\expandafter{\normalexpanded{#1}}\!!es,true)}}
+%D Hacks:
+
+\unexpanded\def\asciimathoptext #1{\ifmmode\mathoptext{#1}\else#1\fi}
+\unexpanded\def\asciimathoptexttraced #1{\ifmmode\mathoptext{\color[darkgreen]{#1}}\else\color[darkgreen]{#1}\fi}
+\unexpanded\def\asciimathstackrel #1#2{\mathematics{\mathop{\let\limits\relax\mover{#2}{#1}}}}
+\unexpanded\def\asciimathroot #1#2{\sqrt[#1]{#2}}
+\unexpanded\def\asciimathsqrt #1{\sqrt{#1}}
+
+%D The core commands:
+
+% if we need to set
+
+\installsetuponlycommandhandler {asciimath} {asciimath}
+
+\appendtoks
+ \ctxlua{moduledata.asciimath.setup {
+ splitmethod = "\asciimathparameter\c!splitmethod",
+ separator = "\asciimathparameter\c!separator",
+ }}%
+\to \everysetupasciimath
+
+\unexpanded\def\asciimath#1%
+ {\clf_asciimath{\detokenize\expandafter{\normalexpanded{#1}}}}
+
+\unexpanded\def\ctxmoduleasciimath#1%
+ {\ctxlua{moduledata.asciimath.#1}}
+
+%D Some tracing commands. Using tex commands is 10\% slower that directly piping
+%D from \LUA, but this is non|-|critical code.
+
+\unexpanded\def\ShowAsciiMathLoad [#1]{\ctxlua{moduledata.asciimath.show.load("#1")}}
+\unexpanded\def\ShowAsciiMathIgnore[#1]{\ctxlua{moduledata.asciimath.show.ignore("#1")}}
+\unexpanded\def\ShowAsciiMathXML #1#2{\ctxlua{moduledata.asciimath.show.filter("#1","#2")}}
+\unexpanded\def\ShowAsciiMathStats {\ctxlua{moduledata.asciimath.show.statistics()}}
+\unexpanded\def\ShowAsciiMathMax {\ctxlua{moduledata.asciimath.show.max()}}
+
+\unexpanded\def\ShowAsciiMathResult#1%
+ {\begingroup
+ \blank
+ % if we are in vmode, we don't get positions i.e. a smaller tuc file
+ \inleft{\ttbf#1\hfill\ctxlua{moduledata.asciimath.show.count(#1,true)}}%
+ \dontleavehmode
+ \begingroup
+ \ttbf
+ \ctxlua{moduledata.asciimath.show.files(#1)}
+ \endgroup
+ \blank[medium,samepage]
+ \startcolor[darkblue]
+ \ctxlua{moduledata.asciimath.show.input(#1,true)}
+ \stopcolor
+ \blank[medium,samepage]
+ \doifmode{asciimath:show:dirty} {
+ \dorecurse{\ctxlua{moduledata.asciimath.show.nofdirty(#1)}} {
+ \ctxlua{moduledata.asciimath.show.dirty(\recurselevel,true)}
+ \blank[medium,samepage]
+ }
+ }
+ \ctxlua{moduledata.asciimath.show.result(#1)}
+ \blank
+ \endgroup}
+
+\unexpanded\def\ShowAsciiMathStart
+ {\begingroup
+ \let\asciimathoptext\asciimathoptexttraced
+ \setuptyping[\v!buffer][\c!before=,\c!after=]
+ \setupmargindata[\v!left][\c!style=]}
+
+\unexpanded\def\ShowAsciiMathStop
+ {\endgroup}
+
+\unexpanded\def\ShowAsciiMath
+ {\dodoubleempty\doShowAsciiMath}
+
+\unexpanded\def\doShowAsciiMath[#1][#2]%
+ {\iffirstargument
+ \ShowAsciiMathStart
+ \ShowAsciiMathLoad[#1]
+ \ifsecondargument
+ \ShowAsciiMathIgnore[#2]
+ \fi
+ \dorecurse{\ShowAsciiMathMax}{\ShowAsciiMathResult\recurselevel}
+ \page
+ \ShowAsciiMathStats
+ \ShowAsciiMathStop
+ \fi}
+
+\unexpanded\def\xmlShowAsciiMath#1#2%
+ {\iffirstargument
+ \ShowAsciiMathStart
+ \ShowAsciiMathXML{#1}{#2}%
+ \dorecurse{\ShowAsciiMathMax}{\ShowAsciiMathResult\recurselevel}
+ \page
+ \ShowAsciiMathStats
+ \ShowAsciiMathStop
+ \fi}
+
+\unexpanded\def\ShowAsciiMathSave
+ {\dosingleempty\doShowAsciiMathSave}
+
+\unexpanded\def\doShowAsciiMathSave[#1]%
+ {\ctxlua{moduledata.asciimath.show.save("#1")}}
\protect
+\startsetups asciimath:layout
+
+ \setupbodyfont
+ % [pagella,10pt]
+ [dejavu,10pt]
+
+ \setuplayout
+ [backspace=35mm,
+ leftmargin=20mm,
+ rightmargindistance=0pt,
+ leftmargindistance=5mm,
+ cutspace=1cm,
+ topspace=1cm,
+ bottomspace=1cm,
+ width=middle,
+ height=middle,
+ header=0cm,
+ footer=1cm]
+
+ \setupheadertexts
+ []
+
+ \setupfootertexts
+ [\currentdate][\pagenumber]
+
+ \setupalign
+ [flushleft,verytolerant,stretch]
+
+ \dontcomplain
+
+\stopsetups
+
+\stopmodule
+
\continueifinputfile{x-asciimath.mkiv}
-\enabletrackers[modules.asciimath.mapping]
+%D This will become an extra.
-\starttext
+\showframe
+\setups[asciimath:layout]
+
+% \enabletrackers[modules.asciimath.mapping]
+% \enabletrackers[modules.asciimath.detail]
+
+% \starttext
+% \enablemode[asciimath:show:dirty]
+% \ShowAsciiMath[e:/temporary/asciimath/*.xml]
+% % \ShowAsciiMathSave[e:/temporary/asciimath/asciimath.lua]
+% \stoptext
+
+\starttext
+\unexpanded\def\MyAsciiMath#1{\startformula\asciimath{#1}\stopformula}
\startlines
-\asciimath{x^2+y_1+z_12^34}
-\asciimath{sin^-1(x)}
-\asciimath{d/dx f(x)=lim_(h->0) (f(x+h)-f(x))/h}
-\asciimath{f(x)=sum_(n=0)^oo(f^((n))(a))/(n!)(x-a)^n}
-\asciimath{int_0^1 f(x)dx}
-\asciimath{int^1_0 f(x)dx}
-\asciimath{a//b}
-\asciimath{a//\alpha}
-\asciimath{(a/b)/(d/c)}
-\asciimath{((a*b))/(d/c)}
-\asciimath{[[a,b],[c,d]]((n),(k))}
-\asciimath{1/x={(1,text{if } x!=0),(text{undefined},if x=0):}}
-\asciimath{{ (1,2), (x,(x + text(x))) }}
-\asciimath{{(1,2),(x,(x+text(x))),(x,text(x))}}
-\asciimath{{(1,2),(x,(x+text(x))),(x,x text(x))}}
-\asciimath{{(1,2/2),(x,(x+x^22+sqrt(xx))),(x,x text(xyz))}}
-\asciimath{{(1,2/2),(x,(x+x^22+sqrt(xx))),(x,text(xyz)+1+text(hans))}}
-\asciimath{<<a,b>> text{and} {:(x,y),(u,v):}}
-\asciimath{(a,b] = {x text(in) RR | a < x <= b}}
+\MyAsciiMath{x^2 / 10 // z_12^34 / 20}
+% \MyAsciiMath{{:{:x^2:} / 10:} // {:{:z_12^34 :} / 20:}}
+% \MyAsciiMath{x^2+y_1+z_12^34}
+% \MyAsciiMath{sin^-1(x)}
+% \MyAsciiMath{d/dx f(x)=lim_(h->0) (f(x+h)-f(x))/h}
+% \MyAsciiMath{f(x)=sum_(n=0)^oo(f^((n))(a))/(n!)(x-a)^n}
+% \MyAsciiMath{int_0^1 f(x)dx}
+% \MyAsciiMath{int^1_0 f(x)dx}
+% \MyAsciiMath{a//b}
+% \MyAsciiMath{a//\alpha}
+% \MyAsciiMath{(a/b)/(d/c)}
+% \MyAsciiMath{((a*b))/(d/c)}
+% \MyAsciiMath{[[a,b],[c,d]]((n),(k))}
+% \MyAsciiMath{1/x={(1,text{if } x!=0),(text{undefined},if x=0):}}
+% \MyAsciiMath{{ (1,2), (x,(x + text(x))) }}
+% \MyAsciiMath{{(1,2),(x,(x+text(x))),(x,text(x))}}
+% \MyAsciiMath{{(1,2),(x,(x+text(x))),(x,x text(x))}}
+% \MyAsciiMath{{(1,2/2),(x,(x+x^22+sqrt(xx))),(x,x text(xyz))}}
+% \MyAsciiMath{{(1,2/2),(x,(x+x^22+sqrt(xx))),(x,text(xyz)+1+text(hans))}}
+% \MyAsciiMath{<<a,b>> text{and} {:(x,y),(u,v):}}
+% \MyAsciiMath{(a,b] = {x text(in) RR | a < x <= b}}
+% \MyAsciiMath{a/b / c/d = (a * d) / (b * d) / (b * c) / (b * d) = (a * d) / (b * c)}
+% \MyAsciiMath{ (a/b) // (c/d) = ( (a * d) / (b * d) ) // ( (b * c) / (b * d) ) = (a * d) / (b * c)}
+% \MyAsciiMath{sin(x+1)_3^2/b / c/d}
+% \MyAsciiMath{{:{:sin(x+1)_3^2:}/b:} / {:c/d:}}
+% \MyAsciiMath{cos(a) + sin(x+1)_3^2/b / c/d = (a * d) / (b * d) / (b * c) / (b * d) = (a * d) / (b * c)}
+% \MyAsciiMath{S_(11)}
+% \MyAsciiMath{f(x)}
+% \MyAsciiMath{sin(x)}
+% \MyAsciiMath{sin(x+1)}
+% \MyAsciiMath{sin^-1(x)}
+% \MyAsciiMath{sin(2x)}
+% \MyAsciiMath{a_2^2}
+% \MyAsciiMath{( (S_(11),S_(12),S_(1n)),(vdots,ddots,vdots),(S_(m1),S_(m2),S_(mn)) ]}
+% \MyAsciiMath{frac a b}
+% \MyAsciiMath{sin(x)/2 // cos(x)/pi}
+% \MyAsciiMath{a/13 // c/d}
+% \MyAsciiMath{a/b // c/d}
+% \MyAsciiMath{x}
+% \MyAsciiMath{x^2}
+% \MyAsciiMath{sqrt x}
+% \MyAsciiMath{sqrt (x)}
+% \MyAsciiMath{root 2 x}
+% \MyAsciiMath{x+x}
+% \MyAsciiMath{x/3}
+% \MyAsciiMath{x^2 / 10}
+% \MyAsciiMath{x^2 / 10 // z_12^34 / 20}
+% \MyAsciiMath{a^23}
+% \MyAsciiMath{a^{:b^23:}+3x}
+% \MyAsciiMath{a/b / c/d}
+% \MyAsciiMath{sin(x)/b / c/d}
+% \MyAsciiMath{sin(x)/b // c/d}
+% \MyAsciiMath{a/b / c/d = (a * d) / (b * d) / (b * c) / (b * d) = (a * d) / (b * c) }
+% \MyAsciiMath{{:{:x^2:} / 10:} // {:{:z_12^34 :} / 20:}}
+% \MyAsciiMath{x^2+y_1+z_12^34}
+% \MyAsciiMath{sin^-1(x)}
+% \MyAsciiMath{d/dx f(x)=lim_(h->0) (f(x+h)-f(x))/h}
+% \MyAsciiMath{f(x)=sum_(n=0)^oo(f^((n))(a))/(n!)(x-a)^n}
+% \MyAsciiMath{int_0^1 f(x)dx}
+% \MyAsciiMath{int^1_0 f(x)dx}
+% \MyAsciiMath{2x}
+% \MyAsciiMath{a//b}
+% \MyAsciiMath{a//\alpha}
+% \MyAsciiMath{(a/b)/(d/c)}
+% \MyAsciiMath{((a*b))/(d/c)}
+% \MyAsciiMath{[[a,b],[c,d]]((n),(k))}
+% \MyAsciiMath{1/x={(1,text{if } x!=0),(text{undefined},if x=0):}}
+% \MyAsciiMath{{ (1,2), (x,(x + text(x))) }}
+% \MyAsciiMath{{(1,2),(x,(x+text(x))),(x,text(x))}}
+% \MyAsciiMath{{(1,2),(x,(x+text(x))),(x,x text(x))}}
+% \MyAsciiMath{{(1,2/2),(x,(x+x^22+sqrt(xx))),(x,x text(xyz))}}
+% \MyAsciiMath{{(1,2/2),(x,(x+x^22+sqrt(xx))),(x,text(xyz)+1+text(hans))}}
+% \MyAsciiMath{<<a,b>> text{and} {:(x,y),(u,v):}}
+% \MyAsciiMath{(a,b] = {x text(in) RR | a < x <= b}}
+% \MyAsciiMath{x^-2}
+% \MyAsciiMath{x^2(x-1/16)=0}
+% \MyAsciiMath{y= ((1/4)) ^x}
+% \MyAsciiMath{log (0,002) / (log(1/4))}
+% \MyAsciiMath{x=ax+b \ oeps}
+% \MyAsciiMath{x=\ ^ (1/4) log(x)}
+% \MyAsciiMath{x=\ ^ (1/4) log(0 ,002 )= log(0,002) / (log(1/4))}
+% \MyAsciiMath{x^ (-1 1/2) =1/x^ (1 1/2)=1/ (x^1*x^ (1/2)) =1/ (xsqrt(x))}
+% \MyAsciiMath{x^2(10 -x)&gt;2 x^2}
+% \MyAsciiMath{x^4&gt;x}
\stoplines
-
\stoptext
diff --git a/Master/texmf-dist/tex/context/base/x-cals.lua b/Master/texmf-dist/tex/context/base/x-cals.lua
index 36bc1aaba2d..3af6106d803 100644
--- a/Master/texmf-dist/tex/context/base/x-cals.lua
+++ b/Master/texmf-dist/tex/context/base/x-cals.lua
@@ -6,6 +6,7 @@ if not modules then modules = { } end modules ['x-cals'] = {
license = "see context related readme files"
}
+local next = next
local format, lower = string.format, string.lower
local xmlsprint, xmlcprint, xmlcollected, xmlelements = xml.sprint, xml.cprint, xml.collected, xml.elements
local n_todimen, s_todimen = number.todimen, string.todimen
@@ -65,8 +66,10 @@ end
local function getspecs(root, pattern, names, widths)
-- here, but actually we need this in core-ntb.tex
-- but ideally we need an mkiv enhanced core-ntb.tex
- local ignore_widths = cals.ignore_widths
- local shrink_widths = cals.shrink_widths
+ local ignore_widths = cals.ignore_widths
+-- local shrink_widths = at.option == "shrink" or cals.shrink_widths
+-- local stretch_widths = at.option == "stretch" or cals.stretch_widths
+ local shrink_widths = cals.shrink_widths
local stretch_widths = cals.stretch_widths
for e in xmlcollected(root,pattern) do
local at = e.at
diff --git a/Master/texmf-dist/tex/context/base/x-ct.lua b/Master/texmf-dist/tex/context/base/x-ct.lua
index 2dee985c329..9c647e8e790 100644
--- a/Master/texmf-dist/tex/context/base/x-ct.lua
+++ b/Master/texmf-dist/tex/context/base/x-ct.lua
@@ -122,6 +122,8 @@ function moduledata.ct.tabulate(root,namespace)
end
+-- todo: use content and caption
+
function moduledata.ct.combination(root,namespace)
if not root then
diff --git a/Master/texmf-dist/tex/context/base/x-html.mkiv b/Master/texmf-dist/tex/context/base/x-html.mkiv
new file mode 100644
index 00000000000..e1806eb9eb0
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/x-html.mkiv
@@ -0,0 +1,379 @@
+%D \module
+%D [ file=x-html,
+%D version=2011.02.03, % adapted 2014.11.08
+%D title=\CONTEXT\ Modules,
+%D subtitle=HTML,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\startmodule[html]
+
+%D Usage:
+%D
+%D \starttyping
+%D \xmlregistersetup{xml:html:basics}
+%D \xmlregistersetup{xml:html:tables}
+%D \stoptyping
+
+% \xmlsetsetup{#1}{(p|span)[@lang]}{xml:html:lang}
+%
+% \startxmlsetups xml:html:lang
+% \begingroup
+% \language[\xmlatt{#1}{lang}]
+% \xmlsetup{#1}{xml:html:\xmltag{#1}}
+% \endgroup
+% \stopxmlsetups
+
+\unprotect
+
+\definehighlight[b] [\c!command=\v!no,\c!style=\v!bold]
+\definehighlight[i] [\c!command=\v!no,\c!style=\v!italic]
+\definehighlight[bi] [\c!command=\v!no,\c!style=\v!bolditalic]
+\definehighlight[em] [\c!command=\v!no,\c!style=\em]
+\definehighlight[tt] [\c!command=\v!no,\c!style=\v!mono]
+\definehighlight[strong][\c!command=\v!no,\c!style=\v!bold]
+\definehighlight[u] [\c!command=\v!no,\c!style=\directsetbar{\v!underbar}]
+\definehighlight[code] [\c!command=\v!no,\c!style=\v!mono]
+\definehighlight[pre] [\c!command=\v!no]
+
+\protect
+
+% todo: pre
+
+\startxmlsetups xml:html:basics
+ \xmlsetsetup{#1}{p|br|b|i|u|em|tt|strong|ul|ol|li|table|thead|tbody|tfoot|tr|td|th|span|img}{xml:html:*}
+ \xmlsetsetup{#1}{b/i}{xml:html:bi}
+ \xmlsetsetup{#1}{i/b}{xml:html:bi}
+ \xmlstripanywhere{#1}{!pre}
+\stopxmlsetups
+
+\startxmlsetups xml:html:tables
+ \xmlsetsetup{#1}{table|thead|tbody|tfoot|tr|td|th}{xml:html:*}
+\stopxmlsetups
+
+\startxmlsetups xml:html:p
+ \xmldoifnotselfempty {#1} {
+ \dontleavehmode
+ \ignorespaces
+ \xmlflush{#1}
+ \removeunwantedspaces
+ }
+ \par
+\stopxmlsetups
+
+\startxmlsetups xml:html:br
+ \crlf
+\stopxmlsetups
+
+\startxmlsetups xml:html:b
+ \directhighlight{b}{\xmlflush{#1}}
+\stopxmlsetups
+
+\startxmlsetups xml:html:i
+ \directhighlight{i}{\xmlflush{#1}}
+\stopxmlsetups
+
+\startxmlsetups xml:html:bi
+ \directhighlight{bi}{\xmlflush{#1}}
+\stopxmlsetups
+
+\startxmlsetups xml:html:em
+ \directhighlight{em}{\xmlflush{#1}}
+\stopxmlsetups
+
+\startxmlsetups xml:html:tt
+ \directhighlight{tt}{\xmlflush{#1}}
+\stopxmlsetups
+
+\startxmlsetups xml:html:strong
+ \directhighlight{strong}{\xmlflush{#1}}
+\stopxmlsetups
+
+\startxmlsetups xml:html:u
+ \directhighlight{u}{\xmlflush{#1}}
+\stopxmlsetups
+
+\startxmlsetups xml:html:ul
+ \startitemize[packed]
+ \xmlflush{#1}
+ \stopitemize
+\stopxmlsetups
+
+\startxmlsetups xml:html:ol
+ \startitemize[packed,n]
+ \xmlflush{#1}
+ \stopitemize
+\stopxmlsetups
+
+\startxmlsetups xml:html:li
+ \startitem
+ \xmlflush{#1}
+ \stopitem
+\stopxmlsetups
+
+\startxmlsetups xml:html:code
+ \directhighlight{code}{\xmlflushspacewise{#1}}
+\stopxmlsetups
+
+\startxmlsetups xml:html:pre
+ \directhighlight{pre}{\xmlflushspacewise{#1}}
+\stopxmlsetups
+
+\startxmlsetups xml:html:span
+ \xmlflush{#1}
+\stopxmlsetups
+
+\startxmlsetups xml:html:img
+ \ifhmode
+ \dontleavehmode
+ \externalfigure[\xmlatt{#1}{src}]
+ \else
+ \startlinecorrection
+ \externalfigure[\xmlatt{#1}{src}]
+ \stoplinecorrection
+ \fi
+\stopxmlsetups
+
+% tables, maybe we need a generic html table module
+%
+% todo: align
+
+% beware, the padding code is somewhat experimental, eventually the
+% table will be done in cld code
+%
+% we can also use \xmlmap for border etc
+
+\starttexdefinition cssgetsinglepadding #1
+ \ctxlua {
+ context((moduledata.css.padding(
+ "#1",
+ \number\dimexpr0.1ex,
+ \number\dimexpr0.01\hsize,
+ \number\dimexpr1ex,
+ \number\dimexpr1em
+ ))) % returns 4 values therefore ()
+ }sp
+\stoptexdefinition
+
+\startxmlsetups xml:html:table
+ \edef\CellPadding{\xmlatt{#1}{cellpadding}}
+ \ifx\CellPadding\empty
+ \edef\CellPadding{.25ex}
+ \else
+ \edef\CellPadding{\cssgetsinglepadding\CellPadding}
+ \fi
+ \startlinecorrection[blank]
+ \doifelse {\xmlatt{#1}{border}} {0} {
+ \bTABLE[frame=off,offset=\CellPadding]
+ \xmlflush{#1}
+ \eTABLE
+ } {
+ \bTABLE[offset=\CellPadding]
+ \xmlflush{#1}
+ \eTABLE
+ }
+ \stoplinecorrection
+\stopxmlsetups
+
+\startxmlsetups xml:html:thead
+ \bTABLEhead
+ \xmlflush{#1}
+ \eTABLEhead
+\stopxmlsetups
+
+\startxmlsetups xml:html:tbody
+ \bTABLEbody
+ \xmlflush{#1}
+ \eTABLEbody
+\stopxmlsetups
+
+\startxmlsetups xml:html:tfoot
+ \bTABLEfoot
+ \xmlflush{#1}
+ \eTABLEfoot
+\stopxmlsetups
+
+\startxmlsetups xml:html:tr
+ \bTR[ny=\xmlattdef{#1}{rowspan}{1}]
+ \xmlflush{#1}
+ \eTR
+\stopxmlsetups
+
+\startxmlsetups xml:html:td
+ \bTD[nx=\xmlattdef{#1}{colspan}{1}]
+ \xmlflush{#1}
+ \eTD
+\stopxmlsetups
+
+\startxmlsetups xml:html:th
+ \bTH[nx=\xmlattdef{#1}{colspan}{1}]
+ \xmlflush{#1}
+ \eTH
+\stopxmlsetups
+
+% \xmlregistersetup{xml:html:basics}
+
+%D For old times sake:
+
+\startxmlsetups xml:setups:common
+ \xmlsetup{#1}{xml:html:basics}
+ \xmlsetup{#1}{xml:html:tables}
+% \ifconditional\qmlcleanuptwo
+% \xmlsetsetup{#1}{html/br[index() == 1]}{xml:noppes:1}
+% \xmlsetsetup{#1}{html/p[index() == lastindex()]/br[index() == lastindex()]}{xml:noppes:2}
+% \xmlsetsetup{#1}{html/br[index() == lastindex()]}{xml:noppes:3}
+% \xmlsetsetup{#1}{br[name(1) == 'img']}{xml:noppes}
+% \xmlsetsetup{#1}{br[name(1) == 'br' and name(2) == 'img']}{xml:noppes}
+% % \xmlsetsetup{#1}{br/following-sibling::img[position()==1]}{xml:noppes}
+% \fi
+\stopxmlsetups
+
+\stopmodule
+
+\continueifinputfile{x-html.mkiv}
+
+\xmlregistersetup{xml:html:basics}
+\xmlregistersetup{xml:html:tables}
+
+\startxmlsetups xml:whatever
+ \xmlsetsetup {#1} {
+ html|body
+ } {xml:html:*}
+\stopxmlsetups
+
+\xmlregisterdocumentsetup{main}{xml:whatever}
+
+\startxmlsetups xml:html:html
+ \xmlflush{#1}
+\stopxmlsetups
+
+\startxmlsetups xml:html:body
+ \xmlflush{#1}
+\stopxmlsetups
+
+\setuphead[subject][page=yes,style=\bfa]
+
+\starttexdefinition ShowExample#1
+ \startsubject[title=#1]
+ \typebuffer[#1]
+ \starttextrule{result}
+ \xmlprocessbuffer{main}{#1}{}
+ \stoptextrule
+ \stopsubject
+\stoptexdefinition
+
+\starttext
+
+\startbuffer[test 1]
+<html><body>
+<p>test</p>
+<p/>
+<p>test</p>
+</body></html>
+\stopbuffer
+
+\startbuffer[test 2]
+<html><body>
+<p>test (hierna een lf)
+test</p>
+</body></html>
+\stopbuffer
+
+\startbuffer[test 3]
+<html><body>
+<p>test (hierna een lf met lege regel)
+
+test</p>
+</body></html>
+\stopbuffer
+
+\startbuffer[test 4]
+<html><body>
+<p>test (hierna een lf met twee lege regels)
+
+
+test</p>
+</body></html>
+\stopbuffer
+
+\startbuffer[test 5]
+<html><body>
+<p>test (hierna br geen lf)<br/> test</p>
+</body></html>
+\stopbuffer
+
+\startbuffer[test 6]
+<html><body>
+<p>test (hierna br met lf)<br/>
+test</p>
+</body></html>
+\stopbuffer
+
+\startbuffer[test 7]
+<html><body>
+<p>test (hierna br met lf en lege regel)<br/>
+
+test</p>
+</body></html>
+\stopbuffer
+
+\startbuffer[test 8]
+<html><body>
+<p>test (hierna br met lf en twee lege regels)<br/>
+
+
+test</p>
+</body></html>
+\stopbuffer
+
+\startbuffer[test 9]
+<html><body>
+<p>test (hierna bold) <b>bold</b> test</p>
+</body></html>
+\stopbuffer
+
+\startbuffer[test 10]
+<html><body>
+<p>test (hierna lf met bold)
+<b>bold <u>underlined</u></b> test</p>
+</body></html>
+\stopbuffer
+
+\startbuffer[test 11]
+<html><body>
+<p>test (hierna lf met lege regel en bold)
+
+<b>bold</b> test</p>
+</body></html>
+\stopbuffer
+
+\startbuffer[test 12]
+<html><body>
+<p>test (hierna lf met lege regel en lf in bold)
+
+<b>
+bold
+</b> test</p>
+</body></html>
+\stopbuffer
+
+\startbuffer[test 13]
+<html><body>
+<p>test (hierna lf met lege regel en lf en lege regel in bold)
+
+<b>
+
+bold
+
+</b> test</p>
+</body></html>
+\stopbuffer
+
+\dorecurse{13}{\ShowExample{test #1}}
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/x-math-svg.lua b/Master/texmf-dist/tex/context/base/x-math-svg.lua
new file mode 100644
index 00000000000..263827f92f5
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/x-math-svg.lua
@@ -0,0 +1,169 @@
+if not modules then modules = { } end modules ['x-math-svg'] = {
+ version = 1.001,
+ comment = "companion to x-math-svg.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local tostring, type, next = tostring, type, next
+local lpegmatch, P, Cs = lpeg.match, lpeg.P, lpeg.Cs
+
+local xmlfirst = xml.first
+local xmlconvert = xml.convert
+local xmlload = xml.load
+local xmlsave = xml.save
+local xmlcollected = xml.collected
+local xmldelete = xml.delete
+
+local loadtable = table.load
+local savetable = table.save
+
+local replacesuffix = file.replacesuffix
+local addsuffix = file.addsuffix
+local removefile = os.remove
+local isfile = lfs.isfile
+
+local formatters = string.formatters
+
+moduledata = moduledata or table.setmetatableindex("table")
+local svgmath = moduledata.svgmath -- autodefined
+
+local namedata = { }
+local pagedata = { }
+
+local statusname = "x-math-svg-status.lua"
+local pdfname = "x-math-svg.pdf"
+
+local pdftosvg = os.which("mudraw")
+
+local f_make_tex = formatters[ [[context --global kpse:x-math-svg.mkvi --inputfile="%s" --svgstyle="%s" --batch --noconsole --once --purgeall]] ]
+local f_make_svg = formatters[ [[mudraw -o "math-%%d.svg" "%s" 1-9999]] ]
+
+local f_inline = formatters[ [[<div class='math-inline' style='vertical-align:%p'></div>]] ]
+local f_display = formatters[ [[<div class='math-display'></div>]] ]
+
+local f_math_tmp = formatters[ [[math-%i]] ]
+
+function svgmath.process(filename)
+ if not filename then
+ -- no filename given
+ return
+ elseif not isfile(filename) then
+ -- invalid filename
+ return
+ end
+ local index = 0
+ local page = 0
+ local blobs = { }
+ local root = xmlload(filename)
+ for mth in xmlcollected(root,"math") do
+ index = index + 1
+ local blob = tostring(mth)
+ if blobs[blob] then
+ context.ReuseSVGMath(index,blobs[blob])
+ else
+ page = page + 1
+ buffers.assign(f_math_tmp(page),blob)
+ context.MakeSVGMath(index,page,mth.at.display)
+ blobs[blob] = page
+ end
+ end
+ context(function()
+ -- for tracing purposes:
+ for mathdata, pagenumber in next, blobs do
+ local p = pagedata[pagenumber]
+ p.mathml = mathdata
+ p.number = pagenumber
+ end
+ --
+ savetable(statusname, {
+ pagedata = pagedata,
+ namedata = namedata,
+ })
+ end)
+end
+
+function svgmath.register(index,page,specification)
+ if specification then
+ pagedata[page] = specification
+ end
+ namedata[index] = page
+end
+
+function svgmath.convert(filename,svgstyle)
+ if not filename then
+ -- no filename given
+ return false, "no filename"
+ elseif not isfile(filename) then
+ -- invalid filename
+ return false, "invalid filename"
+ elseif not pdftosvg then
+ return false, "mudraw is not installed"
+ end
+
+ os.execute(f_make_tex(filename,svgstyle))
+
+ local data = loadtable(statusname)
+ if not data then
+ -- invalid tex run
+ return false, "invalid tex run"
+ elseif not next(data) then
+ return false, "no converson needed"
+ end
+
+ local pagedata = data.pagedata
+ local namedata = data.namedata
+
+ os.execute(f_make_svg(pdfname))
+
+ local root = xmlload(filename)
+ local index = 0
+ local done = { }
+ local unique = 0
+
+ local between = (1-P("<"))^1/""
+ local strip = Cs((
+ (P("<text") * ((1-P("</text>"))^1) * P("</text>")) * between^0 / "" +
+ P(">") * between +
+ P(1)
+ )^1)
+
+ for mth in xmlcollected(root,"m:math") do
+ index = index + 1
+ local page = namedata[index]
+ if done[page] then
+ mth.__p__.dt[mth.ni] = done[page]
+ else
+ local info = pagedata[page]
+ local depth = info.depth
+ local mode = info.mode
+ local svgname = addsuffix(f_math_tmp(page),"svg")
+ local action = mode == "inline" and f_inline or f_display
+ local x_div = xmlfirst(xmlconvert(action(-depth)),"/div")
+ local svgdata = io.loaddata(svgname)
+ if not svgdata or svgdata == "" then
+ print("error in:",svgname,tostring(mth))
+ else
+ -- svgdata = string.gsub(svgdata,">%s<","")
+ svgdata = lpegmatch(strip,svgdata)
+ local x_svg = xmlfirst(xmlconvert(svgdata),"/svg")
+ -- xmldelete(x_svg,"text")
+ x_div.dt = { x_svg }
+ mth.__p__.dt[mth.ni] = x_div -- use helper
+ end
+ done[page] = x_div
+ unique = unique + 1
+ end
+ end
+
+-- for k, v in next, data do
+-- removefile(addsuffix(k,"svg"))
+-- end
+-- removefile(statusname)
+-- removefile(pdfname)
+
+ xmlsave(root,filename)
+
+ return true, index, unique
+end
diff --git a/Master/texmf-dist/tex/context/base/x-mathml-basics.mkiv b/Master/texmf-dist/tex/context/base/x-mathml-basics.mkiv
new file mode 100644
index 00000000000..e166995b0c8
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/x-mathml-basics.mkiv
@@ -0,0 +1,276 @@
+% macros=mkvi
+
+% makes sense (but rel vs op ...):
+
+% \unexpanded\def\stackrel#1#2{\mathematics{\mathop{\let\limits\relax\mover{#2}{#1}}}}
+
+% this can become a core helper
+
+% bwe could do all of them in lua
+
+\startluacode
+local find = string.find
+local lpegmatch = lpeg.match
+
+local splitter = lpeg.Ct(lpeg.C(lpeg.patterns.nestedbraces + lpeg.patterns.utf8character)^1)
+
+function commands.xmfenced(left,middle,right,content)
+ local l = left ~= "" and left or "("
+ local r = right ~= "" and right or ")"
+ local m = middle ~= "" and middle and lpegmatch(splitter,middle) or { "," }
+ local c = find(content,"{") and lpegmatch(splitter,content) or { content }
+ local n = #c
+ if n > 1 then
+ context("\\left%s",l)
+ for i=1,n do
+ if i > 1 then
+ context("%s %s",m[i] or m[#m],c[i])
+ else
+ context(c[i])
+ end
+ end
+ context("\\right%s",r)
+ else
+ context("\\left%s %s \\right%s",l,content,r)
+ end
+end
+
+\stopluacode
+
+\unprotect
+
+\unexpanded\def\mexecuteifdefined#1%
+ {\ifx#1\empty
+ \expandafter\secondoftwoarguments
+ \else\ifcsname#1\endcsname
+ \doubleexpandafter\firstoftwoarguments
+ \else
+ \doubleexpandafter\secondoftwoarguments
+ \fi\fi
+ {\csname#1\endcsname}}
+
+% mrow
+
+\let\mrow\mathematics
+
+% msub msup msubsup
+
+\starttexdefinition msub #1#2
+ \mathematics {
+ #1_{#2}
+ }
+\stoptexdefinition
+
+\starttexdefinition msup #1#2
+ \mathematics {
+ #1^{#2}
+ }
+\stoptexdefinition
+
+\starttexdefinition msubsup #1#2#3
+ \mathematics {
+ #1_{#2}^{#3}
+ }
+\stoptexdefinition
+
+% mn mo mi
+
+\let\mn\mathematics
+\let\mo\mathematics
+\let\mi\mathematics
+
+% ms mtext
+
+\starttexdefinition ms #1
+ \text {
+ "#1"
+ }
+\stoptexdefinition
+
+\starttexdefinition mtext #1
+ \text {
+ #1
+ }
+\stoptexdefinition
+
+% mover
+
+\starttexdefinition unexpanded moverabove #1
+ \edef\movercommand{\utfmathfiller\movertoken}
+ \mexecuteifdefined\movercommand {#1} \relax
+\stoptexdefinition
+\starttexdefinition unexpanded moverbase #1
+ \edef\mbasecommand{\utfmathfiller\mbasetoken}
+ \mexecuteifdefined\mbasecommand {#1}
+ \relax
+\stoptexdefinition
+\starttexdefinition unexpanded moverbasefiller #1#2
+ \edef\mbasecommand{e\utfmathcommandfiller\mbasetoken}
+ \mexecuteifdefined\mbasecommand \relax {#2} {}
+\stoptexdefinition
+\starttexdefinition unexpanded moveraccent #1#2
+ \edef\movercommand{\utfmathcommandabove\movertoken}
+ \mexecuteifdefined\movercommand \relax {#1}
+\stoptexdefinition
+\starttexdefinition unexpanded movertext #1#2
+ % \mathtriplet {\mathstylehbox{#1}} {#2} {}
+ \mathtriplet {\mathematics{#1}} {#2} {}
+\stoptexdefinition
+\starttexdefinition unexpanded moveraccentchecker #1#2
+ \edef\movertoken{\tochar{#2}}
+ \doifelseutfmathabove\movertoken \moveraccent \movertext {#1}{#2}
+\stoptexdefinition
+
+\starttexdefinition unexpanded mover #1#2
+ \mathematics {
+ \edef\mbasetoken{\tochar{#1}}
+ \doifelseutfmathfiller\mbasetoken \moverbasefiller \moveraccentchecker {#1}{#2}
+ }
+\stoptexdefinition
+
+% munder
+
+\starttexdefinition unexpanded munderbelow #1
+ \edef\mundercommand{\utfmathfiller\mundertoken}
+ \mexecuteifdefined\mundercommand {#1} \relax
+\stoptexdefinition
+\starttexdefinition unexpanded munderbase #1
+ \edef\mbasecommand{\utfmathfiller\mbasetoken}
+ \mexecuteifdefined\mbasecommand {#1}
+ \relax
+\stoptexdefinition
+\starttexdefinition unexpanded munderbasefiller #1#2
+ \edef\mbasecommand{e\utfmathcommandfiller\mbasetoken}
+ \mexecuteifdefined\mbasecommand \relax {#2} {}
+\stoptexdefinition
+\starttexdefinition unexpanded munderaccent #1#2
+ \edef\mundercommand{\utfmathcommandbelow\mundertoken}
+ \mexecuteifdefined\mundercommand \relax {#1}
+\stoptexdefinition
+\starttexdefinition unexpanded mundertext #1#2
+ % \mathtriplet {\mathstylehbox{#1}} {} {#2}
+ \mathtriplet {\mathematics{#1}} {} {#2}
+\stoptexdefinition
+\starttexdefinition unexpanded munderaccentchecker #1#2
+ \edef\mundertoken{\tochar{#2}}
+ \doifelseutfmathbelow\mundertoken \munderaccent \mundertext {#1}{#2}
+\stoptexdefinition
+
+\starttexdefinition unexpanded munder #1#2
+ \mathematics {
+ \edef\mbasetoken{\tochar{#1}}
+ \doifelseutfmathfiller\mbasetoken \munderbasefiller \munderaccentchecker {#1}{#2}
+ }
+\stoptexdefinition
+
+% munderover
+
+% mfenced
+
+% \mfenced{x,y}
+% \mfenced{{x}{y}}
+% \mfenced[separators]{{x}{y}}
+% \mfenced[left][right]{{x}{y}}
+% \mfenced[left][separators][right]{{x}{y}}
+
+\starttexdefinition unexpanded mfenced
+ \dotripleempty\do_mfenced
+\stoptexdefinition
+
+\starttexdefinition unexpanded do_mfenced [#1][#2][#3]#4
+ \mathematics {
+ \ctxcommand{xmfenced(
+ \ifthirdargument "#1","#2","#3"\else
+ \ifsecondargument "#1",",","#2"\else
+ \iffirstargument "(","#1",")"\else
+ "(",",",")"\fi\fi\fi
+ ,"#4")}
+ }
+\stoptexdefinition
+
+% mfrac
+
+\starttexdefinition unexpanded mfrac #1#2
+ \mathematics {
+ \frac{#1}{#2}
+ }
+\stoptexdefinition
+
+% mroot msqrt
+
+\starttexdefinition unexpanded mroot #1#2
+ \mathematics {
+ \sqrt[#1]{#2}
+ }
+\stoptexdefinition
+
+\starttexdefinition unexpanded msqrt #1
+ \mathematics {
+ \sqrt{#1}
+ }
+\stoptexdefinition
+
+% menclose
+
+% merror
+
+% mglyph
+
+% mmultiscripts
+
+% mpadded
+
+% mphantom
+
+% mspace
+
+% mstyle
+
+% mtable mtr mlabeledtr mtd
+
+% maction
+
+% semantics
+
+\protect
+
+\continueifinputfile{x-mathml-basics.mkiv}
+
+\starttext
+
+$\mfenced{1+a}$\par
+$\mfenced[,]{1+a}$\par
+$\mfenced[,]{{1+a}{1+b}}$\par
+
+% $\mover{←}{test}$\par
+% $\mover{\utfchar{"2190}}{test}$\par
+% $\mover{e:leftarrow}{test}$\par
+% $\mover{x:2190}{test}$\par
+
+% $\mover{test}{⏞}$\par
+% $\mover{test}{\utfchar{"23DE}}$\par
+% $\mover{test}{e:overbrace}$\par
+% $\mover{test}{x:23DE}$\par
+% $\mover{test}{over}$\par
+
+% \mover{test}{⏞}\par
+% \mover{test}{\utfchar{"23DE}}\par
+% \mover{test}{e:overbrace}\par
+% \mover{test}{x:23DE}\par
+
+% $\munder{←}{test}$\par
+% $\munder{\utfchar{"2190}}{test}$\par
+% $\munder{e:leftarrow}{test}$\par
+% $\munder{x:2190}{test}$\par
+
+% $\munder{test}{⏟}$\par
+% $\munder{test}{\utfchar{"23DF}}$\par
+% $\munder{test}{e:underbrace}$\par
+% $\munder{test}{x:23DF}$\par
+% $\munder{test}{under}$\par
+
+% \math{{\msup{x}{2}\mo{+}\mn{2}\mi{x}\mo{+}\mi{b}}}
+
+% \mrow{\msup{x}{2}\mo{+}\mn{2}\mi{x}\mo{+}\mi{b}}
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/x-mathml.lua b/Master/texmf-dist/tex/context/base/x-mathml.lua
index 15739eec76e..a0db339bc61 100644
--- a/Master/texmf-dist/tex/context/base/x-mathml.lua
+++ b/Master/texmf-dist/tex/context/base/x-mathml.lua
@@ -6,20 +6,56 @@ if not modules then modules = { } end modules ['x-mathml'] = {
license = "see context related readme files"
}
--- This needs an upgrade to the latest greatest mechanisms.
+-- This needs an upgrade to the latest greatest mechanisms. But ... it
+-- probably doesn't pay back as no mathml support ever did.
local type, next = type, next
-local format, lower, find, gsub = string.format, string.lower, string.find, string.gsub
+local formatters, lower, find, gsub, match = string.formatters, string.lower, string.find, string.gsub, string.match
local strip = string.strip
-local xmlsprint, xmlcprint, xmltext, xmlcontent = xml.sprint, xml.cprint, xml.text, xml.content
+local xmlsprint, xmlcprint, xmltext, xmlcontent, xmlempty = xml.sprint, xml.cprint, xml.text, xml.content, xml.empty
+local lxmlcollected, lxmlfilter = lxml.collected, lxml.filter
local getid = lxml.getid
-local utfchar, utfcharacters, utfvalues = utf.char, utf.characters, utf.values
-local lpegmatch = lpeg.match
+local utfchar, utfcharacters, utfvalues, utfsplit, utflen = utf.char, utf.characters, utf.values, utf.split, utf.len
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+local P, Cs = lpeg.P, lpeg.Cs
local mathml = { }
moduledata.mathml = mathml
lxml.mathml = mathml -- for the moment
+local context = context
+
+local ctx_enabledelimiter = context.enabledelimiter
+local ctx_disabledelimiter = context.disabledelimiter
+local ctx_xmlflush = context.xmlflush -- better xmlsprint
+
+local ctx_halign = context.halign
+local ctx_noalign = context.noalign
+local ctx_bgroup = context.bgroup
+local ctx_egroup = context.egroup
+local ctx_crcr = context.crcr
+
+local ctx_bTABLE = context.bTABLE
+local ctx_eTABLE = context.eTABLE
+local ctx_bTR = context.bTR
+local ctx_eTR = context.eTR
+local ctx_bTD = context.bTD
+local ctx_eTD = context.eTD
+
+local ctx_mn = context.mn
+local ctx_mi = context.mi
+local ctx_mo = context.mo
+local ctx_startimath = context.startimath
+local ctx_ignorespaces = context.ignorespaces
+local ctx_removeunwantedspaces = context.removeunwantedspaces
+local ctx_stopimath = context.stopimath
+
+local ctx_mmlapplycsymbol = context.mmlapplycsymbol
+
+local ctx_mathopnolimits = context.mathopnolimits
+local ctx_left = context.left
+local ctx_right = context.right
+
-- an alternative is to remap to private codes, where we can have
-- different properties .. to be done; this will move and become
-- generic; we can then make the private ones active in math mode
@@ -62,6 +98,7 @@ local o_replacements = { -- in main table
["{"] = "\\mmlleftdelimiter \\lbrace",
["}"] = "\\mmlrightdelimiter\\rbrace",
["|"] = "\\mmlleftorrightdelimiter\\vert",
+ -- ["."] = "\\mmlleftorrightdelimiter.",
["/"] = "\\mmlleftorrightdelimiter\\solidus",
[doublebar] = "\\mmlleftorrightdelimiter\\Vert",
["("] = "\\mmlleftdelimiter(",
@@ -467,20 +504,39 @@ function mathml.stripped(str)
context(strip(str))
end
+local p_entity = (P("&") * ((1-P(";"))^0) * P(";"))
+local p_utfchar = lpegpatterns.utf8character
+local p_spacing = lpegpatterns.whitespace^1
+
+local p_mn = Cs((p_entity/"" + p_spacing/utfchar(0x205F) + p_utfchar/n_replacements)^0)
+local p_strip = Cs((p_entity/"" + p_utfchar )^0)
+local p_mi = Cs((p_entity/"" + p_utfchar/i_replacements)^0)
+
+-- function mathml.mn(id,pattern)
+-- -- maybe at some point we need to interpret the number, but
+-- -- currently we assume an upright font
+-- local str = xmlcontent(getid(id)) or ""
+-- local rep = gsub(str,"&.-;","")
+-- local rep = gsub(rep,"(%s+)",utfchar(0x205F)) -- medspace e.g.: twenty one (nbsp is not seen)
+-- local rep = gsub(rep,".",n_replacements)
+-- ctx_mn(rep)
+-- end
+
function mathml.mn(id,pattern)
-- maybe at some point we need to interpret the number, but
-- currently we assume an upright font
- local str = xmlcontent(getid(id)) or ""
- local rep = gsub(str,"&.-;","")
- local rep = gsub(rep,"(%s+)",utfchar(0x205F)) -- medspace e.g.: twenty one (nbsp is not seen)
- local rep = gsub(rep,".",n_replacements)
- context.mn(rep)
+ ctx_mn(lpegmatch(p_mn,xmlcontent(getid(id)) or ""))
end
+-- function mathml.mo(id)
+-- local str = xmlcontent(getid(id)) or ""
+-- local rep = gsub(str,"&.-;","") -- todo
+-- context(simpleoperatorremapper(rep) or rep)
+-- end
+
function mathml.mo(id)
- local str = xmlcontent(getid(id)) or ""
- local rep = gsub(str,"&.-;","") -- todo
- context(simpleoperatorremapper(rep) or rep)
+ local str = lpegmatch(p_strip,xmlcontent(getid(id)) or "")
+ context(simpleoperatorremapper(str) or str)
end
function mathml.mi(id)
@@ -494,37 +550,43 @@ function mathml.mi(id)
elseif n == 1 then
local first = str[1]
if type(first) == "string" then
- local str = gsub(first,"&.-;","") -- bah
- local rep = i_replacements[str]
- if not rep then
- rep = gsub(str,".",i_replacements)
- end
+ -- local str = gsub(first,"&.-;","") -- bah
+ -- local rep = i_replacements[str]
+ -- if not rep then
+ -- rep = gsub(str,".",i_replacements)
+ -- end
+ local str = lpegmatch(p_strip,first)
+ local rep = i_replacements[str] or lpegmatch(p_mi,str)
context(rep)
- -- context.mi(rep)
+ -- ctx_mi(rep)
else
- context.xmlflush(id) -- xmlsprint or so
+ ctx_xmlflush(id) -- xmlsprint or so
end
else
- context.xmlflush(id) -- xmlsprint or so
+ ctx_xmlflush(id) -- xmlsprint or so
end
else
- context.xmlflush(id) -- xmlsprint or so
+ ctx_xmlflush(id) -- xmlsprint or so
end
end
function mathml.mfenced(id) -- multiple separators
id = getid(id)
- local left, right, separators = id.at.open or "(", id.at.close or ")", id.at.separators or ","
- local l, r = l_replacements[left], r_replacements[right]
- context.enabledelimiter()
+ local at = id.at
+ local left = at.open or "("
+ local right = at.close or ")"
+ local separators = at.separators or ","
+ local l = l_replacements[left]
+ local r = r_replacements[right]
+ ctx_enabledelimiter()
if l then
context(l_replacements[left] or o_replacements[left] or "")
else
context(o_replacements["@l"])
context(left)
end
- context.disabledelimiter()
- local collected = lxml.filter(id,"/*") -- check the *
+ ctx_disabledelimiter()
+ local collected = lxmlfilter(id,"/*") -- check the *
if collected then
local n = #collected
if n == 0 then
@@ -532,7 +594,7 @@ function mathml.mfenced(id) -- multiple separators
elseif n == 1 then
xmlsprint(collected[1]) -- to be checked
else
- local t = utf.split(separators,true)
+ local t = utfsplit(separators,true)
for i=1,n do
xmlsprint(collected[i]) -- to be checked
if i < n then
@@ -551,35 +613,16 @@ function mathml.mfenced(id) -- multiple separators
end
end
end
- context.enabledelimiter()
+ ctx_enabledelimiter()
if r then
context(r_replacements[right] or o_replacements[right] or "")
else
context(right)
context(o_replacements["@r"])
end
- context.disabledelimiter()
+ ctx_disabledelimiter()
end
---~ local function flush(e,tag,toggle)
---~ if toggle then
---~ context("^{")
---~ else
---~ context("_{")
---~ end
---~ if tag == "none" then
---~ context("{}")
---~ else
---~ xmlsprint(e.dt)
---~ end
---~ if not toggle then
---~ context("}")
---~ else
---~ context("}{}")
---~ end
---~ return not toggle
---~ end
-
local function flush(e,tag,toggle)
if tag == "none" then
-- if not toggle then
@@ -599,7 +642,7 @@ end
function mathml.mmultiscripts(id)
local done, toggle = false, false
- for e in lxml.collected(id,"/*") do
+ for e in lxmlcollected(id,"/*") do
local tag = e.tg
if tag == "mprescripts" then
context("{}")
@@ -609,14 +652,14 @@ function mathml.mmultiscripts(id)
end
end
local done, toggle = false, false
- for e in lxml.collected(id,"/*") do
+ for e in lxmlcollected(id,"/*") do
local tag = e.tg
if tag == "mprescripts" then
break
elseif done then
toggle = flush(e,tag,toggle)
else
- xmlsprint(e.dt)
+ xmlsprint(e)
done = true
end
end
@@ -651,12 +694,12 @@ function mathml.mcolumn(root)
local tag = e.tg
if tag == "mi" or tag == "mn" or tag == "mo" or tag == "mtext" then
local str = xmltext(e)
- str = gsub(str,"&.-;","")
+ str = lpegmatch(p_strip,str)
for s in utfcharacters(str) do
m[#m+1] = { tag, s }
end
if tag == "mn" then
- local n = utf.len(str)
+ local n = utflen(str)
if n > numbers then
numbers = n
end
@@ -670,20 +713,20 @@ function mathml.mcolumn(root)
-- m[#m+1] = { tag, e }
end
end
- for e in lxml.collected(root,"/*") do
+ for e in lxmlcollected(root,"/*") do
local m = { }
matrix[#matrix+1] = m
if e.tg == "mrow" then
-- only one level
- for e in lxml.collected(e,"/*") do
+ for e in lxmlcollected(e,"/*") do
collect(m,e)
end
else
collect(m,e)
end
end
- context.halign()
- context.bgroup()
+ ctx_halign()
+ ctx_bgroup()
context([[\hss\startimath\alignmark\stopimath\aligntab\startimath\alignmark\stopimath\cr]])
for i=1,#matrix do
local m = matrix[i]
@@ -695,7 +738,7 @@ function mathml.mcolumn(root)
end
end
if mline then
- context.noalign([[\obeydepth\nointerlineskip]])
+ ctx_noalign([[\obeydepth\nointerlineskip]])
end
for j=1,#m do
local mm = m[j]
@@ -738,9 +781,9 @@ function mathml.mcolumn(root)
local nchr = n_replacements[chr]
context(nchr or chr)
end
- context.crcr()
+ ctx_crcr()
end
- context.egroup()
+ ctx_egroup()
end
local spacesplitter = lpeg.tsplitat(" ")
@@ -758,42 +801,47 @@ function mathml.mtable(root)
local framespacing = at.framespacing or "0pt"
local framespacing = at.framespacing or "-\\ruledlinewidth" -- make this an option
- context.bTABLE { frame = frametypes[frame or "none"] or "off", offset = framespacing, background = "" } -- todo: use xtables and definextable
- for e in lxml.collected(root,"/(mml:mtr|mml:mlabeledtr)") do
- context.bTR()
+ ctx_bTABLE { frame = frametypes[frame or "none"] or "off", offset = framespacing, background = "" } -- todo: use xtables and definextable
+ for e in lxmlcollected(root,"/(mml:mtr|mml:mlabeledtr)") do
+ ctx_bTR()
local at = e.at
local col = 0
local rfr = at.frame or (frames and frames [#frames])
local rra = at.rowalign or (rowaligns and rowaligns [#rowaligns])
local rca = at.columnalign or (columnaligns and columnaligns[#columnaligns])
local ignorelabel = e.tg == "mlabeledtr"
- for e in lxml.collected(e,"/mml:mtd") do -- nested we can use xml.collected
+ for e in lxmlcollected(e,"/mml:mtd") do -- nested we can use xml.collected
col = col + 1
if ignorelabel and col == 1 then
-- get rid of label, should happen at the document level
else
local at = e.at
- local rowspan, columnspan = at.rowspan or 1, at.columnspan or 1
+ local rowspan = at.rowspan or 1
+ local columnspan = at.columnspan or 1
local cra = rowalignments [at.rowalign or (rowaligns and rowaligns [col]) or rra or "center"] or "lohi"
local cca = columnalignments[at.columnalign or (columnaligns and columnaligns[col]) or rca or "center"] or "middle"
local cfr = frametypes [at.frame or (frames and frames [col]) or rfr or "none" ] or "off"
- context.bTD { align = format("{%s,%s}",cra,cca), frame = cfr, nx = columnspan, ny = rowspan }
- context.startimath()
- context.ignorespaces()
- xmlcprint(e)
- context.stopimath()
- context.removeunwantedspaces()
- context.eTD()
+ ctx_bTD { align = formatters["{%s,%s}"](cra,cca), frame = cfr, nx = columnspan, ny = rowspan }
+ if xmlempty(e,".") then
+ -- nothing, else hsize max
+ else
+ ctx_startimath()
+ -- ctx_ignorespaces()
+ xmlcprint(e)
+ -- ctx_removeunwantedspaces()
+ ctx_stopimath()
+ end
+ ctx_eTD()
end
end
-- if e.tg == "mlabeledtr" then
- -- context.bTD()
+ -- ctx_bTD()
-- xmlcprint(xml.first(e,"/!mml:mtd"))
- -- context.eTD()
+ -- ctx_eTD()
-- end
- context.eTR()
+ ctx_eTR()
end
- context.eTABLE()
+ ctx_eTABLE()
end
function mathml.csymbol(root)
@@ -804,14 +852,16 @@ function mathml.csymbol(root)
local full = hash.original or ""
local base = hash.path or ""
local text = strip(xmltext(root) or "")
- context.mmlapplycsymbol(full,base,encoding,text)
+ ctx_mmlapplycsymbol(full,base,encoding,text)
end
+local p = lpeg.Cs(((1-lpegpatterns.whitespace)^1 / "mml:enclose:%0" + (lpegpatterns.whitespace^1)/",")^1)
+
function mathml.menclosepattern(root)
root = getid(root)
local a = root.at.notation
if a and a ~= "" then
- context("mml:enclose:",(gsub(a," +",",mml:enclose:")))
+ context(lpegmatch(p,a))
end
end
@@ -822,8 +872,8 @@ end
function mathml.cpolar_a(root)
root = getid(root)
local dt = root.dt
- context.mathopnolimits("Polar")
- context.left(false,"(")
+ ctx_mathopnolimits("Polar")
+ ctx_left(false,"(")
for k=1,#dt do
local dk = dt[k]
if xml.is_element(dk,"sep") then
@@ -832,7 +882,7 @@ function mathml.cpolar_a(root)
xmlsprint(dk)
end
end
- context.right(false,")")
+ ctx_right(false,")")
end
-- crap .. maybe in char-def a mathml overload
diff --git a/Master/texmf-dist/tex/context/base/x-mathml.mkiv b/Master/texmf-dist/tex/context/base/x-mathml.mkiv
index 5520dbbe6fc..65a7223ce59 100644
--- a/Master/texmf-dist/tex/context/base/x-mathml.mkiv
+++ b/Master/texmf-dist/tex/context/base/x-mathml.mkiv
@@ -1,4 +1,4 @@
-%D \modul
+%D \module
%D [ file=x-mathml,
%D version=2008.05.29,
%D title=\CONTEXT\ XML Modules,
@@ -16,12 +16,17 @@
% This module is under construction and will be cleaned up. We use a funny mix of
% xml, tex and lua. I could rewrite the lot but it also shows how context evolves.
%
-% I might en dup with a lua-only implementation some day.
+% I might end up with a lua-only implementation some day. I must find a good reason
+% to spend time on it. In fact, it might even be more messy.
%
% no m:text strip (needs checking, maybe nbsp is mandate
%
% todo: more will be moved to lua (less hassle)
% todo: move left/right to the lua end
+%
+% this implememation looks like a hack ... this is because we deal with all weird cases we
+% ran into, including abuse that was supposed to render ok (even if it didn't in other
+% renderers) .. it was simply expected to work that way.
\writestatus{loading}{ConTeXt XML Macros / MathML Renderer}
@@ -51,10 +56,10 @@
\xmlregistersetup{xml:mml:define}
-\unexpanded\def\MMLhack
- {\let\MMLpar\par
- \let\par\relax
- \everyvbox{\let\par\MMLpar}}
+% \unexpanded\def\MMLhack % no longer needed
+% {\let\MMLpar\par
+% \let\par\relax
+% \everyvbox{\let\par\MMLpar}}
\xmlmapvalue {mml:math:mode} {display} {\displaymathematics} % we had this already
\xmlmapvalue {mml:math:mode} {inline} {\inlinemathematics }
@@ -75,7 +80,7 @@
}
{
\math_fences_checked_start
- \MMLhack
+ %\MMLhack
\xmlflush{#1}
\math_fences_checked_stop
}
@@ -85,7 +90,7 @@
\startxmlsetups mml:imath
\inlinemathematics {
\math_fences_checked_start
- \MMLhack
+ %\MMLhack
\xmlflush{#1}
\math_fences_checked_stop
}
@@ -94,7 +99,7 @@
\startxmlsetups mml:dmath
\displaymathematics {
\math_fences_checked_start
- \MMLhack
+ %\MMLhack
\xmlflush{#1}
\math_fences_checked_stop
}
@@ -106,7 +111,10 @@
\edef\mmlformulalabel {\xmlatt{#1}{label}\xmlatt{#1}{id}}
\edef\mmlformulasublabel{\xmlatt{#1}{sublabel}\xmlatt{#1}{id}}
\doifsomething\mmlformulalabel{\placeformula[\mmlformulalabel]{\mmlformulasublabel}}
- \startformula\MMLhack\xmlfirst{#1}{/mml:math}\stopformula
+ \startformula
+ %\MMLhack
+ \xmlfirst{#1}{/mml:math}
+ \stopformula
\stopxmlsetups
% old delimiter hacks
@@ -164,11 +172,6 @@
%D filter. There is an intermediate cleaner module but it has
%D some namespace limitations. Here we do it the \MKIV\ way.
-\def\widevec#1%
- {\vbox{\mathsurround\zeropoint\ialign{##\crcr
- \rightarrowfill\crcr\noalign{\nointerlineskip}%
- \startimath\hfil\displaystyle{#1}\hfil\stopimath\crcr}}}
-
%D The rendering macros:
\def\MMLrm{\mr}
@@ -209,7 +212,9 @@
%D We start with the parent elements and the option handler.
-\def\xmlmathmldirective#1{\dosetvalue{MML#1}}
+\unexpanded\def\xmlmathmldirective#1{\dosetvalue{MML#1}}
+
+\xmlinstalldirective{mathml}{xmlmathmldirective}
%def\xmlmathmldirective#1#2#3{[#1][#2][#3]\dosetvalue{MML#1}{#2}{#3}}
@@ -378,7 +383,7 @@
% \MMLdoR
% } {
\edef\mmlapplyaction{\xmlfilter{#1}{/*/name()}}
- \doifsetupselse {mml:apply:mml:\mmlapplyaction} {
+ \doifelsesetups {mml:apply:mml:\mmlapplyaction} {
\xmlsetup{#1}{mml:apply:mml:\mmlapplyaction}
} {
% \MMLdoL
@@ -399,7 +404,7 @@
\startxmlsetups mml:apply:mml:fn
\xmldoifelse {#1} {/mml:fn/mml:ci} {
\edef\mmlfnci{\xmlstripped{#1}{/mml:fn/mml:ci}}% was xmlcontent
- \doifsetupselse{mmc:fn:\mmlfnci} { % was mmc:fn:...
+ \doifelsesetups{mmc:fn:\mmlfnci} { % was mmc:fn:...
\xmlsetup{#1}{mmc:fn:\mmlfnci} % \MMLdoL/MMLdoR to be handled in plugin
} {
\MMLcreset
@@ -466,7 +471,7 @@
\fi
\xmldoifelse {#1} {/mml:ci} { % first
\edef\mmlfnci{\xmltext{#1}{/mml:ci}}% was xmlcontent
- \doifsetupselse{mmc:fn:\mmlfnci} { % was mmc:fn:...
+ \doifelsesetups{mmc:fn:\mmlfnci} { % was mmc:fn:...
\xmlsetup{#1}{mmc:fn:\mmlfnci} % \MMLdoL/MMLdoR to be handled in plugin
} {
\MMLcreset
@@ -497,7 +502,7 @@
\startxmlsetups mmc:fn:apply % where used?
\xmldoifelse {#1} {/mml:ci} { % first
\edef\mmlfnci{\xmltext{#1}{/mml:ci}}% was xmlcontent
- \doifsetupselse{mmc:fn:\mmlfnci} { % was mmc:fn:...
+ \doifelsesetups{mmc:fn:\mmlfnci} { % was mmc:fn:...
\xmlsetup{#1}{mmc:fn:\mmlfnci} % \MMLdoL/MMLdoR to be handled in plugin
} {
\MMLcreset
@@ -524,16 +529,15 @@
\starttexdefinition mmlapplycsymbol #1#2#3#4
% #1=full url, #2=name, #3=encoding, #4=text
\doifelse {#3} {text} {
-% {\mr #4}
\text{#4}
} {
- \doifsetupselse {mml:csymbol:#1} {
+ \doifelsesetups {mml:csymbol:#1} {
% full url
- \directsetup{mml:csymbol:#1}
+ \fastsetup{mml:csymbol:#1}
} {
% somename (fallback)
- \doifsetupselse {mml:csymbol:#2} {
- \directsetup{mml:csymbol:#2}
+ \doifelsesetups {mml:csymbol:#2} {
+ \fastsetup{mml:csymbol:#2}
} {
\xmlval{mmc:cs}{#3}{}% todo
}
@@ -580,7 +584,7 @@
\stopxmlsetups
\startxmlsetups mml:ci:vector
- \widevec{\xmlflush{#1}}
+ \overrightarrow{\xmlflush{#1}}
\stopxmlsetups
\startxmlsetups mml:ci:matrix
@@ -720,7 +724,7 @@
\startxmlsetups mml:cn:rational
\xmldoifelse {#1} {/mml:sep} {
- \frac
+ \mmlfrac
{\xmlsnippet{#1}{1}}
{\xmlsnippet{#1}{3}}
} {
@@ -905,7 +909,7 @@
\mmlsecond{#1}/\mmlthird{#1}
\else
\MMLcreset
- \frac{\MMLcreset\mmlsecond{#1}}{\MMLcreset\mmlthird{#1}}
+ \mmlfrac{\MMLcreset\mmlsecond{#1}}{\MMLcreset\mmlthird{#1}}
\fi
}
\advance\mmldividelevel\minusone
@@ -1051,7 +1055,7 @@
\let\MMLtimes@@symbol\MMLtimessymbol
} {
\xmldoifelse {#1} {/mml:cn[name(1) == 'mml:cn']} {% name(1) is next one
- \doifinsetelse\MMLtimessymbol{\v!yes,\v!no} {
+ \doifelseinset\MMLtimessymbol{\v!yes,\v!no} {
\let\MMLtimes@@symbol\v!yes
} {
\let\MMLtimes@@symbol\MMLtimessymbol
@@ -1303,7 +1307,7 @@
\doifelse \MMLdiffalternative \v!a {
\xmldoifelse {#1} {/mml:lambda} {
% a special case (mathadore/openmath)
- \frac {
+ \mmlfrac {
d
\normalsuperscript
{\xmlfirst{#1}{/mml:bvar}\xmlfirst{#1}{/mml:cn}}
@@ -1316,7 +1320,7 @@
}
} {
\xmldoifelse {#1} {/mml:bvar} {
- \frac {
+ \mmlfrac {
{\mr d}{
\xmldoifelse {#1} {/mml:degree} {
\normalsuperscript{\xmlconcat{#1}{/mml:degree}\empty}
@@ -1331,13 +1335,11 @@
\xmlfirst{#1}{/mml:ci}
} {
\MMLcreset
-\ifnum\xmlcount{#1}{/mml:apply/*}>\plustwo % hack
- \left(
- \xmlfirst{#1}{/mml:apply}
- \right)
-\else
- \xmlfirst{#1}{/mml:apply}
-\fi
+ \ifnum\xmlcount{#1}{/mml:apply/*}>\plustwo % hack
+ \left(\xmlfirst{#1}{/mml:apply}\right)
+ \else
+ \xmlfirst{#1}{/mml:apply}
+ \fi
}
}
} {
@@ -1387,7 +1389,7 @@
\xmlfirst{#1}{/(mml:apply\string|mml:reln\string|mml:ci\string|mml:cn)}
} {
\xmldoifelse {#1} {/mml:bvar} {
- \frac {
+ \mmlfrac {
{\mr d}\normalsuperscript{
\xmldoifelse {#1} {/mml:degree} {
\xmlconcat{#1}{/mml:degree}\empty
@@ -1709,7 +1711,7 @@
\stopxmlsetups
\startxmlsetups mml:annotation
- \xmldoifelse {#1} {.[oneof(@encoding,'TeX','tex','TEX','ConTeXt','context','CONTEXT','ctx')]} {
+ \xmldoifelse {#1} {.[oneof(@encoding,'TeX','tex','application/x-tex','TEX','ConTeXt','context','CONTEXT','ctx')]} {
\xmlflushcontext{#1}
} {
\xmldoifelse {#1} {.[oneof(@encoding,'calcmath','cm')]} {
@@ -1745,7 +1747,7 @@
\startxmlsetups mml:notanumber \mathopnolimits{NaN} \stopxmlsetups
\startxmlsetups mml:true \mathopnolimits{true} \stopxmlsetups
\startxmlsetups mml:false \mathopnolimits{false} \stopxmlsetups
-\startxmlsetups mml:emptyset \mathopnolimits{\O} \stopxmlsetups
+\startxmlsetups mml:emptyset \mathopnolimits{Ø} \stopxmlsetups
\startxmlsetups mml:pi \pi \stopxmlsetups
\startxmlsetups mml:eulergamma \gamma \stopxmlsetups
\startxmlsetups mml:infinity \infty \stopxmlsetups
@@ -1824,25 +1826,33 @@
% helpers: maybe we can need a setting for the uprights
-\xmlmapvalue {mml} {normal} {\mathupright} % {\mathtf}
-\xmlmapvalue {mml} {double-struck} {\mathblackboard}
-\xmlmapvalue {mml} {italic} {\mathit}
-\xmlmapvalue {mml} {fraktur} {\mathfraktur}
-\xmlmapvalue {mml} {script} {\mathscript}
-\xmlmapvalue {mml} {bold} {\mb} % {\mathbf}
-\xmlmapvalue {mml} {bold-italic} {\mathbi}
-\xmlmapvalue {mml} {bold-fraktur} {\mathfraktur\mathbf}
-\xmlmapvalue {mml} {bold-script} {\mathscript\mathbf}
-\xmlmapvalue {mml} {sans-serif} {\mathss}
-\xmlmapvalue {mml} {bold-sans-serif} {\mathss\mathbf}
-\xmlmapvalue {mml} {sans-serif-italic} {\mathss\mathit}
-\xmlmapvalue {mml} {sans-serif-bold-italic} {\mathss\mathbi}
-\xmlmapvalue {mml} {monospace} {\mathtt}
+\xmlmapvalue {mml:s} {normal} {\mathupright} % {\mathtf}
+\xmlmapvalue {mml:s} {double-struck} {\mathblackboard}
+\xmlmapvalue {mml:s} {italic} {\mathit}
+\xmlmapvalue {mml:s} {fraktur} {\mathfraktur}
+\xmlmapvalue {mml:s} {script} {\mathscript}
+\xmlmapvalue {mml:s} {bold} {\mb} % {\mathbf}
+\xmlmapvalue {mml:s} {bold-italic} {\mathbi}
+\xmlmapvalue {mml:s} {bold-fraktur} {\mathfraktur\mathbf}
+\xmlmapvalue {mml:s} {bold-script} {\mathscript\mathbf}
+\xmlmapvalue {mml:s} {sans-serif} {\mathss}
+\xmlmapvalue {mml:s} {bold-sans-serif} {\mathss\mathbf}
+\xmlmapvalue {mml:s} {sans-serif-italic} {\mathss\mathit}
+\xmlmapvalue {mml:s} {sans-serif-bold-italic} {\mathss\mathbi}
+\xmlmapvalue {mml:s} {monospace} {\mathtt}
+
+\xmlmapvalue {mml:l} {-} {\let\mmlfrac\tfrac}
+ \let\mmlfrac\frac
+\xmlmapvalue {mml:l} {+} {\let\mmlfrac\sfrac}
% todo: displaystyle=true/false (or whatever else shows up)
\starttexdefinition setmmlmathstyle #1
- \xmlval {mml} {\xmlatt{#1}{mathvariant}} \empty % was: \mmmr
+ \xmlval{mml:s}{\xmlatt{#1}{mathvariant}}\empty % was: \mmmr
+\stoptexdefinition
+
+\starttexdefinition setmmlscriptlevel #1
+ \xmlval{mml:l}{\xmlatt{#1}{scriptlevel}}{\let\mmlfrac\frac}
\stoptexdefinition
\starttexdefinition applymmlmathcolor #1#2
@@ -1899,8 +1909,11 @@
\startxmlsetups mml:mi % todo: mathsize (unlikely) mathcolor (easy) mathbackground (easy)
\begingroup
+ \pushmathstyle
\setmmlmathstyle{#1}
+ \setmmlscriptlevel{#1}
\ctxmodulemathml{mi("#1")}
+ \popmathstyle
\endgroup
\stopxmlsetups
@@ -2000,7 +2013,7 @@
\overline{\left)\strut\xmlflush{#1}\right.}
} {
\doifelse \mmlmenclosenotation {mml:enclose:actuarial} {
- \overline{\left.\strut\xmlflush{#1}\right|}
+ \overline{\left.\strut\xmlflush{#1}\right\vert}
} {
\doifelse \mmlmenclosenotation {mml:enclose:radical} {
\sqrt{\xmlflush{#1}}
@@ -2010,13 +2023,13 @@
\framed
[frame=off,strut=no,background={\mmlmenclosenotation}] % offset is kind of undefined
{\startimath
- \expanded{\doifinsetelse {mml:enclose:longdiv} {\mmlmenclosenotation}} {
+ \expanded{\doifelseinset {mml:enclose:longdiv} {\mmlmenclosenotation}} {
\overline{\left)\strut\xmlflush{#1}\right.}
} {
- \expanded{\doifinsetelse {mml:enclose:actuarial} {\mmlmenclosenotation}} {
- \overline{\left.\strut\xmlflush{#1}\right|}
+ \expanded{\doifelseinset {mml:enclose:actuarial} {\mmlmenclosenotation}} {
+ \overline{\left.\strut\xmlflush{#1}\right\vert}
} {
- \expanded{\doifinsetelse {mml:enclose:radical} {\mmlmenclosenotation}} {
+ \expanded{\doifelseinset {mml:enclose:radical} {\mmlmenclosenotation}} {
\sqrt{\xmlflush{#1}}
} {
\xmlflush{#1}
@@ -2043,7 +2056,7 @@
\doifelse{\xmlatt{#1}{bevelled}}{true} {
\left.\mmlfirst{#1}\middle/\mmlsecond{#1}\right.% \thinspace\middle/\thinspace
} {
- \frac{\mmlfirst{#1}}{\mmlsecond{#1}}
+ \mmlfrac{\mmlfirst{#1}}{\mmlsecond{#1}}
}
\else
\doifelse {\xmlval{mml:mfrac:linethickness}{\mmlfraclinethickness}{}} {} {
@@ -2074,8 +2087,11 @@
\startxmlsetups mml:mstyle
\begingroup
+ \pushmathstyle
\setmmlmathstyle{#1}
+ \setmmlscriptlevel{#1}
\xmlflush{#1}
+ \popmathstyle
\endgroup
\stopxmlsetups
@@ -2230,6 +2246,8 @@
}
\stopxmlsetups
+% helpers
+
\unexpanded\def\mmlexecuteifdefined#1%
{\ifx#1\empty
\expandafter\secondoftwoarguments
@@ -2240,140 +2258,166 @@
\fi\fi
{\csname#1\endcsname}}
-% todo: combine topaccent/over/bottomaccent/under check
-
-\definemathextensible [\v!mathematics] [mml:overleftarrow] ["2190] % ["27F5]
-\definemathextensible [\v!mathematics] [mml:overrightarrow] ["2192] % ["27F6]
-\definemathextensible [\v!mathematics] [mml:overleftrightarrow] ["27F7]
-\definemathextensible [\v!mathematics] [mml:overtwoheadrightarrow] ["27F9]
-\definemathextensible [\v!mathematics] [mml:overleftharpoondown] ["21BD]
-\definemathextensible [\v!mathematics] [mml:overleftharpoonup] ["21BC]
-\definemathextensible [\v!mathematics] [mml:overrightharpoondown] ["21C1]
-\definemathextensible [\v!mathematics] [mml:overrightharpoonup] ["21C0]
-
-\definemathextensible [\v!mathematics] [mml:underleftarrow] ["2190] % ["27F5]
-\definemathextensible [\v!mathematics] [mml:underrightarrow] ["2192] % ["27F6]
-\definemathextensible [\v!mathematics] [mml:underleftrightarrow] ["27F7]
-\definemathextensible [\v!mathematics] [mml:undertwoheadrightarrow] ["27F9]
-\definemathextensible [\v!mathematics] [mml:underleftharpoondown] ["21BD]
-\definemathextensible [\v!mathematics] [mml:underleftharpoonup] ["21BC]
-\definemathextensible [\v!mathematics] [mml:underrightharpoondown] ["21C1]
-\definemathextensible [\v!mathematics] [mml:underrightharpoonup] ["21C0]
-
-\definemathtriplet [\v!mathematics] [mmlovertriplet]
-\definemathtriplet [\v!mathematics] [mmlundertriplet]
-\definemathtriplet [\v!mathematics] [mmldoubletriplet]
-
-% alternative:
-%
-% \definemathextensible [\v!mathematics] [mml:\utfchar{0x2190}] ["2190] % ["27F5]
-% \definemathextensible [\v!mathematics] [mml:\utfchar{0x2192}] ["2192] % ["27F6]
-% \definemathextensible [\v!mathematics] [mml:\utfchar{0x27F5}] ["2190] % ["27F5]
-% \definemathextensible [\v!mathematics] [mml:\utfchar{0x27F6}] ["2192] % ["27F6]
-% \definemathextensible [\v!mathematics] [mml:\utfchar{0x27F7}] ["27F7]
-% \definemathextensible [\v!mathematics] [mml:\utfchar{0x27F9}] ["27F9]
-% \definemathextensible [\v!mathematics] [mml:\utfchar{0x21BD}] ["21BD]
-% \definemathextensible [\v!mathematics] [mml:\utfchar{0x21BC}] ["21BC]
-% \definemathextensible [\v!mathematics] [mml:\utfchar{0x21C1}] ["21C1]
-% \definemathextensible [\v!mathematics] [mml:\utfchar{0x21C0}] ["21C0]
-
-\unexpanded\def\mmloverof#1{\mmlexecuteifdefined\mmlovercommand\relax{\mmlunexpandedfirst {#1}}\relax}
-\unexpanded\def\mmloveros#1{\mmlexecuteifdefined\mmlovercommand {\mmlunexpandedsecond{#1}}\relax}
-\unexpanded\def\mmloverbf#1{\mmlexecuteifdefined\mmlbasecommand {\mmlunexpandedfirst {#1}}\relax}
-\unexpanded\def\mmloverbs#1{\mmlexecuteifdefined\mmlbasecommand\relax{\mmlunexpandedsecond{#1}}\relax}
+\def\mmlextensible#1{\ctxmodulemathml{extensible(\!!bs#1\!!es)}}
-\startxmlsetups mml:mover
+\definemathtriplet [\v!mathematics] [mmlovertriplet] % or will we use a special instance
+\definemathtriplet [\v!mathematics] [mmlundertriplet] % or will we use a special instance
+\definemathtriplet [\v!mathematics] [mmldoubletriplet] % or will we use a special instance
+
+% common to munder/mover/munderover
+
+\starttexdefinition unexpanded mmlfencedfirst #1
+ \math_fences_checked_start
+ \mmlunexpandedfirst{#1}
+ \math_fences_checked_stop
+\stoptexdefinition
+\starttexdefinition unexpanded mmlfencedsecond #1
+ \math_fences_checked_start
+ \mmlunexpandedsecond{#1}
+ \math_fences_checked_stop
+\stoptexdefinition
+\starttexdefinition unexpanded mmlfencedthird #1
+ \math_fences_checked_start
+ \mmlunexpandedthird{#1}
+ \math_fences_checked_stop
+\stoptexdefinition
+
+% mover
+
+\starttexdefinition unexpanded mmloverabove #1
+ \edef\mmlovercommand{\utfmathfiller\mmlovertoken}
+ \mmlexecuteifdefined\mmlovercommand {\mmlfencedsecond{#1}} \relax
+\stoptexdefinition
+\starttexdefinition unexpanded mmloverbase #1
+ \edef\mmlbasecommand{\utfmathfiller\mmlbasetoken}
+ \mmlexecuteifdefined\mmlbasecommand {\mmlfencedfirst{#1}}
+ \relax
+\stoptexdefinition
+\starttexdefinition unexpanded mmloverbasefiller #1
+ \edef\mmlbasecommand{e\utfmathcommandfiller\mmlbasetoken}
+ \mmlexecuteifdefined\mmlbasecommand \relax {\mmlfencedsecond{#1}} {}
+\stoptexdefinition
+\starttexdefinition unexpanded mmloveraccent #1
+ \edef\mmlovercommand{\utfmathcommandabove\mmlovertoken}
+ \mmlexecuteifdefined\mmlovercommand \relax {\mmlfencedfirst{#1}}
+\stoptexdefinition
+\starttexdefinition unexpanded mmlovertext #1
+ \mmlovertriplet {\mmloverbase{#1}} {\mmloverabove{#1}} {}
+\stoptexdefinition
+\starttexdefinition unexpanded mmloveraccentchecker #1
\edef\mmlovertoken{\mmlextensible{\xmlraw{#1}{/mml:*[2]}}}% /text()
- \doifelseutfmathabove\mmlovertoken {
- \edef\mmlovercommand{\utfmathcommandabove\mmlovertoken}
- \mmloverof{#1}
- } {
- \edef\mmlbasetoken{\xmlraw{#1}{/mml:*[1]}}% /text()
- \doifelseutfmathabove\mmlbasetoken {
- \edef\mmlbasecommand{mml:\utfmathcommandabove\mmlbasetoken}
- \mmloverbs{#1}
- } {
- \edef\mmlbasecommand{\utfmathfiller\mmlbasetoken}
- \edef\mmlovercommand{\utfmathfiller\mmlovertoken}
- \mmlundertriplet{\mmloverbf{#1}}{\mmloveros{#1}}{}%\relax
- }
- }
- % \limits % spoils spacing
+ \doifelseutfmathabove\mmlovertoken \mmloveraccent \mmlovertext {#1}
+\stoptexdefinition
+
+\startxmlsetups mml:mover
+ \edef\mmlbasetoken{\mmlextensible{\xmlraw{#1}{/mml:*[1]}}}% /text()
+ \doifelseutfmathfiller\mmlbasetoken \mmloverbasefiller \mmloveraccentchecker {#1}
\stopxmlsetups
-% alternative:
-%
-% \startxmlsetups mml:mover
-% \edef\mmlovertoken{\xmlraw{#1}{/mml:*[2]}}% /text()
-% \doifelseutfmathabove\mmlovertoken {
-% \edef\mmlovercommand{\utfmathcommandabove\mmlovertoken}
-% \mmloverof{#1}
-% } {
-% \edef\mmlbasetoken{\xmlraw{#1}{/mml:*[1]/text()}}
-% \ifcsname mml:\mmlbasetoken\endcsname
-% \csname mml:\mmlbasetoken\endcsname{\mmlunexpandedsecond{#1}}\relax
-% \else
-% \edef\mmlbasecommand{\utfmathfiller\mmlbasetoken}
-% \edef\mmlovercommand{\utfmathfiller\mmlovertoken}
-% \mmlovertriplet{\mmloveros{#1}}{\mmloverbf{#1}}\relax
-% \fi
-% }
-% % \limits % spoils spacing
-% \stopxmlsetups
+% munder
-% do this in lua
+\starttexdefinition unexpanded mmlunderbelow #1
+ \edef\mmlundercommand{\utfmathfiller\mmlundertoken}
+ \mmlexecuteifdefined\mmlundercommand {\mmlfencedsecond{#1}} \relax
+\stoptexdefinition
+\starttexdefinition unexpanded mmlunderbase #1
+ \edef\mmlbasecommand{\utfmathfiller\mmlbasetoken}
+ \mmlexecuteifdefined\mmlbasecommand {\mmlfencedfirst{#1}}
+ \relax
+\stoptexdefinition
+\starttexdefinition unexpanded mmlunderbasefiller #1
+ \edef\mmlbasecommand{e\utfmathcommandfiller\mmlbasetoken}%
+ \mmlexecuteifdefined\mmlbasecommand \relax {} {\mmlfencedsecond{#1}}
+\stoptexdefinition
+\starttexdefinition unexpanded mmlunderaccent #1
+ \edef\mmlundercommand{\utfmathcommandbelow\mmlundertoken}
+ \mmlexecuteifdefined\mmlundercommand \relax {\mmlfencedfirst{#1}}
+\stoptexdefinition
+\starttexdefinition unexpanded mmlundertext #1
+ \mmlundertriplet {\mmlunderbase{#1}} {} {\mmlunderbelow{#1}}
+\stoptexdefinition
+\starttexdefinition unexpanded mmlunderaccentchecker #1
+ \edef\mmlundertoken{\mmlextensible{\xmlraw{#1}{/mml:*[2]}}}% /text()
+ \doifelseutfmathbelow\mmlundertoken \mmlunderaccent \mmlundertext {#1}
+\stoptexdefinition
-\def\mmlextensible#1{\ctxmodulemathml{extensible(\!!bs#1\!!es)}}
+\startxmlsetups mml:munder
+ \edef\mmlbasetoken{\mmlextensible{\xmlraw{#1}{/mml:*[1]}}}% /text()
+ \doifelseutfmathfiller\mmlbasetoken \mmlunderbasefiller \mmlunderaccentchecker {#1}
+\stopxmlsetups
-\unexpanded\def\mmlunderuf#1{\mmlexecuteifdefined\mmlundercommand\relax {\mmlunexpandedfirst {#1}}\relax}
-\unexpanded\def\mmlunderus#1{\mmlexecuteifdefined\mmlundercommand {\mmlunexpandedsecond{#1}}\relax}
-\unexpanded\def\mmlunderbf#1{\mmlexecuteifdefined\mmlbasecommand {\mmlunexpandedfirst {#1}}\relax}
-%unexpanded\def\mmlunderbs#1{\mmlexecuteifdefined\mmlbasecommand \relax{}{\mmlunexpandedsecond{#1}}\relax}
-\unexpanded\def\mmlunderbs#1{\mmlexecuteifdefined\mmlbasecommand \relax {\mmlunexpandedsecond{#1}}\relax}
+% munderover
-\startxmlsetups mml:munder
+\starttexdefinition unexpanded mmlunderoveraccentcheckerUO #1
+ \edef\mmlundercommand{\utfmathcommandbelow\mmlundertoken}
+ \edef\mmlovercommand {\utfmathcommandabove\mmlovertoken}
+ \edef\mmlbasecommand {\mmlovercommand\mmlundercommand}
+ \ifcsname\mmlbasecommand\endcsname
+ \csname\mmlbasecommand\endcsname {\mmlfencedfirst{#1}}
+ \else\ifcsname\mmlundercommand\endcsname
+ \ifcsname\mmlovercommand\endcsname
+ \csname\mmlovercommand\endcsname {\csname\mmlundercommand\endcsname{\mmlfencedfirst{#1}}}
+ \else
+ \mmldoubletriplet {\csname\mmlundercommand\endcsname{\mmlfencedfirst{#1}}} {\mmlfencedthird{#1}\mmlfencedthird{#1}} {}
+ \fi
+ \else\ifcsname\mmlovercommand\endcsname
+ \mmldoubletriplet {\csname\mmlovercommand\endcsname{\mmlfencedfirst{#1}}} {} {\mmlfencedsecond{#1}}
+ \else
+ \mmlunderoveraccentcheckerTT {#1}
+ \fi\fi\fi
+\stoptexdefinition
+\starttexdefinition unexpanded mmlunderoveraccentcheckerUT #1
+ \edef\mmlundercommand{\utfmathcommandbelow\mmlundertoken}
+ \edef\mmlbasecommand {\mmlundercommand text}
+ \ifcsname\mmlbasecommand\endcsname
+ \csname\mmlbasecommand\endcsname {\mmlfencedfirst{#1}} {\mmlfencedthird{#1}}
+ \else\ifcsname\mmlundercommand\endcsname
+ \mmldoubletriplet {\csname\mmlundercommand\endcsname{\mmlfencedfirst{#1}}} {\mmlfencedthird{#1}} {}
+ \else
+ \mmlunderoveraccentcheckerTT {#1}
+ \fi\fi
+\stoptexdefinition
+\starttexdefinition unexpanded mmlunderoveraccentcheckerOT #1
+ \edef\mmlovercommand{\utfmathcommandabove\mmlovertoken}
+ \edef\mmlbasecommand{\mmlovercommand text}
+ \ifcsname\mmlbasecommand\endcsname
+ \csname\mmlbasecommand\endcsname {\mmlfencedfirst{#1}} {\mmlfencedsecond{#1}}
+ \else\ifcsname\mmlovercommand\endcsname
+ \mmldoubletriplet {\csname\mmlovercommand\endcsname{\mmlfencedfirst{#1}}} {} {\mmlfencedsecond{#1}}
+ \else
+ \mmlunderoveraccentcheckerTT {#1}
+ \fi\fi
+\stoptexdefinition
+\starttexdefinition unexpanded mmlunderoveraccentcheckerTT #1
+ \mmldoubletriplet {\mmlfencedfirst{#1}} {\mmlfencedthird{#1}} {\mmlfencedsecond{#1}} \relax
+\stoptexdefinition
+\starttexdefinition unexpanded mmlunderoveraccentchecker #1
\edef\mmlundertoken{\mmlextensible{\xmlraw{#1}{/mml:*[2]}}}% /text()
- \doifelseutfmathbelow\mmlundertoken {%
- \edef\mmlundercommand{\utfmathcommandbelow\mmlundertoken}
- \mmlunderuf{#1}
+ \edef\mmlovertoken {\mmlextensible{\xmlraw{#1}{/mml:*[3]}}}% /text()
+ \doifelseutfmathbelow\mmlundertoken {
+ \doifelseutfmathabove\mmlovertoken \mmlunderoveraccentcheckerUO \mmlunderoveraccentcheckerUT {#1}
} {
- \edef\mmlbasetoken{\xmlraw{#1}{/mml:*[1]}}% /text()
- \doifelseutfmathbelow\mmlbasetoken {
- \edef\mmlbasecommand{mml:\utfmathcommandbelow\mmlbasetoken}
- \mmlunderbs{#1}
- } {
- \edef\mmlbasecommand {\utfmathfiller\mmlbasetoken}
- \edef\mmlundercommand{\utfmathfiller\mmlundertoken}
- \mmlundertriplet{\mmlunderbf{#1}}{}{\mmlunderus{#1}}%\relax
- }
+ \doifelseutfmathabove\mmlovertoken \mmlunderoveraccentcheckerOT \mmlunderoveraccentcheckerTT {#1}
}
- % \limits % spoils spacing
-\stopxmlsetups
-
-\unexpanded\def\mmlunderoverst#1{\mmlexecuteifdefined\mmlbasecommand \relax{\mmlunexpandedsecond{#1}}{\mmlunexpandedthird{#1}}\relax}
-\unexpanded\def\mmlunderoverbf#1{\mmlexecuteifdefined\mmlbasecommand {\mmlunexpandedfirst {#1}}\relax}
-\unexpanded\def\mmlunderoverus#1{\mmlexecuteifdefined\mmlundercommand {\mmlunexpandedsecond{#1}}\relax}
-\unexpanded\def\mmlunderoverot#1{\mmlexecuteifdefined\mmlovercommand {\mmlunexpandedthird {#1}}\relax}
+\stoptexdefinition
+\starttexdefinition unexpanded mmlunderoverbasefiller #1
+ \edef\mmlbasecommand{e\utfmathcommandfiller\mmlbasetoken}%
+ \mmlexecuteifdefined\mmlbasecommand \relax {\mmlfencedthird{#1}} {\mmlfencedsecond{#1}}
+\stoptexdefinition
\startxmlsetups mml:munderover
- \edef\mmlbasetoken{\xmlraw{#1}{/mml:*[1]}}% /text()
- \doifelseutfmathbelow\mmlbasetoken {
- \edef\mmlbasecommand{mml:\utfmathcommandbelow\mmlbasetoken}
- \mmlunderoverst{#1}
- } {
- \edef\mmlundertoken {\xmlraw{#1}{/mml:*[2]}}% /text()
- \edef\mmlovertoken {\xmlraw{#1}{/mml:*[3]}}% /text()
- \edef\mmlbasecommand {\utfmathfiller\mmlbasetoken}
- \edef\mmlundercommand{\utfmathfiller\mmlundertoken}
- \edef\mmlovercommand {\utfmathfiller\mmlovertoken}
- \mmldoubletriplet{\mmlunderoverbf{#1}}{\mmlunderoverot{#1}}{\mmlunderoverus{#1}}\relax
- }
+ \edef\mmlbasetoken{\mmlextensible{\xmlraw{#1}{/mml:*[1]}}}% /text()
+ \doifelseutfmathfiller\mmlbasetoken \mmlunderoverbasefiller \mmlunderoveraccentchecker {#1}
\stopxmlsetups
% tables (mml:mtable, mml:mtr, mml:mlabledtr, mml:mtd)
\startxmlsetups mml:mtable % some more attributes need to be supported
- \vcenter{\ctxmodulemathml{mtable("#1")}}
+ \vcenter {
+ \hbox {% needed because otherwise positions makr the vcenter wide
+ \ctxmodulemathml{mtable("#1")}
+ }
+ }
\stopxmlsetups
\startxmlsetups mml:mcolumn
@@ -2383,29 +2427,39 @@
\def\mmlsetfakewidth#1{\setbox\scratchbox\hbox{#1}\scratchdimen\wd\scratchbox}
\def\mmlmcolumndigitspace {\mmlsetfakewidth {0}\kern\scratchdimen}
-\def\mmlmcolumndigitrule {\mmlsetfakewidth {0}\vrule width \scratchdimen height .2pt depth .2pt\relax}
-\def\mmlmcolumnsymbolrule {\mmlsetfakewidth{\times}\vrule width \scratchdimen height .2pt depth .2pt\relax}
-\def\mmlmcolumnpunctuationrule{\mmlsetfakewidth {.}\vrule width \scratchdimen height .2pt depth .2pt\relax}
+\def\mmlmcolumndigitrule {\mmlsetfakewidth {0}\vrule \s!width \scratchdimen \s!height .2\points \s!depth .2\points\relax}
+\def\mmlmcolumnsymbolrule {\mmlsetfakewidth{\times}\vrule \s!width \scratchdimen \s!height .2\points \s!depth .2\points\relax}
+\def\mmlmcolumnpunctuationrule{\mmlsetfakewidth {.}\vrule \s!width \scratchdimen \s!height .2\points \s!depth .2\points\relax}
+
+\setupMMLappearance[mspace][\c!option=] % \v!test
\startxmlsetups mml:mspace
\begingroup
\edef\mmlspacetext{\xmlatt{#1}{spacing}}
\ifx\mmlspacetext\empty
- \!!widtha \xmlattdef{#1}{width} \!!zeropoint % must be string
- \!!heighta\xmlattdef{#1}{height}\!!zeropoint
- \!!deptha \xmlattdef{#1}{depth} \!!zeropoint
- \ifdim\!!heighta=\zeropoint
- \ifdim\!!deptha=\zeropoint\else
- \hbox{\vrule\s!depth\!!deptha\s!height\zeropoint\s!width\zeropoint}%
+ \scratchwidth \xmlattdef{#1}{width} \!!zeropoint % must be string
+ \scratchheight\xmlattdef{#1}{height}\!!zeropoint
+ \scratchdepth \xmlattdef{#1}{depth} \!!zeropoint
+ \ifdim\scratchheight=\zeropoint
+ \ifdim\scratchdepth=\zeropoint\else
+ \hbox{\vrule\s!depth\scratchdepth\s!height\zeropoint\s!width\zeropoint}%
\fi
\else
- \hbox{\vrule\s!depth\zeropoint\s!height\!!heighta\s!width\zeropoint}%
+ \hbox{\vrule\s!depth\zeropoint\s!height\scratchheight\s!width\zeropoint}%
\fi
- \ifdim\!!widtha=\zeropoint\else
- \hskip\!!widtha
+ \ifdim\scratchwidth=\zeropoint\else
+ \ifx\MMLmspaceoption\v!test
+ \hbox to \scratchwidth{\showstruts\strut\hss\lower2\exheight\hbox{\infofont\xmlattdef{#1}{width}}\hss\strut}
+ \else
+ \hskip\scratchwidth
+ \fi
\fi
\else
- \phantom{\triggermathstyle\normalmathstyle\mmlspacetext}
+ \ifx\MMLmspaceoption\v!test
+ \hbox{\showstruts\strut\phantom{\triggermathstyle\normalmathstyle\mmlspacetext}\strut}
+ \else
+ \phantom{\triggermathstyle\normalmathstyle\mmlspacetext}
+ \fi
\fi
\endgroup
\stopxmlsetups
diff --git a/Master/texmf-dist/tex/context/base/x-mathml.xsd b/Master/texmf-dist/tex/context/base/x-mathml.xsd
index 17f0bea2aa4..1c29452b06a 100644
--- a/Master/texmf-dist/tex/context/base/x-mathml.xsd
+++ b/Master/texmf-dist/tex/context/base/x-mathml.xsd
@@ -3,9 +3,9 @@
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xds="http://www.w3.org/?">
-<xsd:schema>
+<xsd:schema>
-<xsd:element name="imath" type="mathml:math" />
-<xsd:element name="dmath" type="mathml:math" />
+<xsd:element name="imath" type="mathml:math" />
+<xsd:element name="dmath" type="mathml:math" />
</xsd:schema>
diff --git a/Master/texmf-dist/tex/context/base/x-res-01.mkiv b/Master/texmf-dist/tex/context/base/x-res-01.mkiv
index e234e98677a..36070c61599 100644
--- a/Master/texmf-dist/tex/context/base/x-res-01.mkiv
+++ b/Master/texmf-dist/tex/context/base/x-res-01.mkiv
@@ -256,7 +256,7 @@
\vfill
}
\advance\hsize by -30pt
- \doifmodeelse {clipgrid-distance,clipgrid-steps} {
+ \doifelsemode {clipgrid-distance,clipgrid-steps} {
\xmlsetup{#1}{xml:resource:a}
} {
\xmlsetup{#1}{xml:resource:b}
diff --git a/Master/texmf-dist/tex/context/base/x-set-11.mkiv b/Master/texmf-dist/tex/context/base/x-set-11.mkiv
index 12854dc92d8..73e68e0738c 100644
--- a/Master/texmf-dist/tex/context/base/x-set-11.mkiv
+++ b/Master/texmf-dist/tex/context/base/x-set-11.mkiv
@@ -57,7 +57,7 @@
2: -- wordt verwerkt
3: -- is niet gedefinieerd
4: -- wordt nogmaals verwerkt
- optional: optioneel
+ optional: opt
displaymath: formule
index: ingang
math: formule
@@ -95,7 +95,7 @@
2: -- is processed
3: -- is undefined
4: -- is processed again
- optional: optional
+ optional: opt
displaymath: formula
index: entry
math: formula
@@ -133,7 +133,7 @@
2: -- wird verarbeitet
3: -- ist undefiniert
4: -- ist mehrmals verarbeitet
- optional: optioneel
+ optional: opt
displaymath: formula
index: entry
math: formula
@@ -171,7 +171,7 @@
2: -- je zpracovano
3: -- je nedefinovano
4: -- je zpracovano znovu
- optional: optioneel
+ optional: opt
displaymath: formula
index: entry
math: formula
@@ -209,7 +209,7 @@
2: -- is processed
3: -- is undefined
4: -- is processed again
- optional: optioneel
+ optional: opt
displaymath: formula
index: entry
math: formula
@@ -247,7 +247,7 @@
2: este procesat --
3: -- este nedefinit
4: -- este procesat din nou
- optional: optioneel
+ optional: opt
displaymath: formula
index: entry
math: formula
@@ -285,7 +285,7 @@
2: -- est traité
3: -- n'est pas défini
4: -- est traité de nouveau
- optional: optionel
+ optional: opt
displaymath: formule
index: entrée
math: formule
@@ -369,7 +369,8 @@
} {
\let\currentSETUPprefix\empty
}
- \edef\currentSETUPname{\xmlatt{#1}{name}}
+ % \edef\currentSETUPname{\xmlatt{#1}{name}}
+ \edef\currentSETUPname{\xmlattribute{#1}{/sequence/string[1]}{value}}%
\doifelse {\xmlatt{#1}{generated}} {yes} {
\def\currentSETUPgenerated{*}
} {
@@ -457,7 +458,7 @@
\def\showsetupindeed#1%
{\startelement[setup][name=#1]%
\startelement[noexport][comment={setup definition #1}]
- \xmlfilterlist{\loadedsetups}{/interface/command['#1' == (@type=='environment' and 'start' or '') .. @name]/command(xml:setups:typeset)}%
+ \xmlfilterlist{\loadedsetups}{/interface/command['#1' == (@type=='environment' and '\e!start' or '') .. @name]/command(xml:setups:typeset)}%
\stopelement
\stopelement}
@@ -469,7 +470,7 @@
%D Typesetting:
\setupxml
- [\c!method=mkiv, % mixed mode
+ [%\c!method=mkiv, % mixed mode
\c!default=\v!hidden, % ignore elements that are not defined
\c!compress=\v!yes, % strip comment
\c!entities=\v!yes] % replace entities
@@ -499,37 +500,41 @@
\xmlfilter{#1}{/sequence/first()}
\ignorespaces
\egroup
- \xmldoif{#1}{/arguments} {
- \bgroup
- \enablemode[setups-pass-one]
- \doglobal\newcounter\currentSETUPargument
- \ignorespaces
- \xmlfilter{#1}{/arguments/text()}
- \egroup
- }
- \doif {\xmlatt{#1}{type}} {environment} {
- \bgroup
- \enablemode[setups-pass-one]%
- \hskip.5em\unknown\hskip.5em
- \doif {\xmlatt{#1}{generated}} {yes} {
- \ttsl
- }
- \tex{\e!stop}
- \xmlfilter{#1}{/sequence/first()}
- \ignorespaces
- \egroup
- }
- \endgraf
- \xmldoif{#1}{/arguments} {
- \bgroup
- \enablemode[setups-pass-two]
- \doglobal\newcounter\currentSETUPargument
- %\blank[\v!line] % packed mode (we could do \startunpacked ...)
- \godown[.75\lineheight]
- \switchtobodyfont[\v!small]
- \ignorespaces\xmlfilter{#1}{/arguments/text()}\endgraf
- \egroup
- }
+ \ifshortsetup
+ % nothing
+ \else
+ \xmldoif{#1}{/arguments} {
+ \bgroup
+ \enablemode[setups-pass-one]
+ \doglobal\newcounter\currentSETUPargument
+ \ignorespaces
+ \xmlfilter{#1}{/arguments/text()}
+ \egroup
+ }
+ \doif {\xmlatt{#1}{type}} {environment} {
+ \bgroup
+ \enablemode[setups-pass-one]%
+ \hskip.5em\unknown\hskip.5em
+ \doif {\xmlatt{#1}{generated}} {yes} {
+ \ttsl
+ }
+ \tex{\e!stop}
+ \xmlfilter{#1}{/sequence/first()}
+ \ignorespaces
+ \egroup
+ }
+ \endgraf
+ \xmldoif{#1}{/arguments} {
+ \bgroup
+ \enablemode[setups-pass-two]
+ \doglobal\newcounter\currentSETUPargument
+ %\blank[\v!line] % packed mode (we could do \startunpacked ...)
+ \godown[.75\lineheight]
+ \switchtobodyfont[\v!small]
+ \ignorespaces\xmlfilter{#1}{/arguments/text()}\endgraf
+ \egroup
+ }
+ \fi
\getvalue{\e!stop setuptext}
\stopxmlsetups
@@ -572,7 +577,7 @@
\startxmlsetups xml:setups:word \showSETUPcomponent{#1}{word} {word} \stopxmlsetups
\def\showSETUPcomponent#1#2#3%
- {\doifmodeelse{setups-pass-one}
+ {\doifelsemode{setups-pass-one}
{\getvalue{showSETUP#2}{#1}}
{\simpleSETUPargument{#3}}}
@@ -607,7 +612,7 @@
\stopxmlsetups
\startxmlsetups xml:setups:assignments
- \doifmodeelse{setups-pass-one} {
+ \doifelsemode{setups-pass-one} {
\showSETUPassignment{#1}
} {
\xdef\currentSETUPwidth{0pt}%
@@ -629,7 +634,7 @@
\stopxmlsetups
\startxmlsetups xml:setups:keywords
- \doifmodeelse{setups-pass-one} {
+ \doifelsemode{setups-pass-one} {
\showSETUPkeyword{#1}
} {
\startfirstSETUPcolumn{\showSETUPnumber}%
@@ -665,7 +670,7 @@
\stopxmlsetups
\startxmlsetups xml:setups:constant
- \doifmodeelse {setups-pass-one} {
+ \doifelsemode {setups-pass-one} {
} {
\doif {\xmlatt{#1}{default}} {yes} {
\underbar % next needs to be {braced}
@@ -677,7 +682,7 @@
\stopxmlsetups
\startxmlsetups xml:setups:variable
- \doifmodeelse {setups-pass-one} {
+ \doifelsemode {setups-pass-one} {
\expanded{\setupintfont{\xmlatt{#1}{value}}}\ignorespaces
} {
\c!setup!reserved!{\xmlatt{#1}{value}}
diff --git a/Master/texmf-dist/tex/context/base/x-set-12.mkiv b/Master/texmf-dist/tex/context/base/x-set-12.mkiv
index 6590bfe9e03..c60445313ee 100644
--- a/Master/texmf-dist/tex/context/base/x-set-12.mkiv
+++ b/Master/texmf-dist/tex/context/base/x-set-12.mkiv
@@ -146,8 +146,7 @@
[\c!alternative=\v!doublesided]
\setupsetup
- [\c!criterium=\v!all,
- \c!reference=0]
+ [\c!criterium=\v!all]
\setupframedtexts
[setuptext]
diff --git a/Master/texmf-dist/tex/context/base/x-xtag.mkiv b/Master/texmf-dist/tex/context/base/x-xtag.mkiv
index 09490cc8ff4..ab95c567eec 100644
--- a/Master/texmf-dist/tex/context/base/x-xtag.mkiv
+++ b/Master/texmf-dist/tex/context/base/x-xtag.mkiv
@@ -14,7 +14,7 @@
%D Here we load the \MKII\ (mostly) streaming \XML\ parser. We
%D define a couple of catcode regimes first.
-\ifdefined\XMLbanner \endinput \fi
+\endinput
\writestatus{xtag}{this module is obsolete, use the mkiv-xml features or use mkii instead}
diff --git a/Master/texmf-dist/tex/context/bib/bibl-apa-it.tex b/Master/texmf-dist/tex/context/bib/bibl-apa-it.tex
new file mode 100644
index 00000000000..ebf03313a34
--- /dev/null
+++ b/Master/texmf-dist/tex/context/bib/bibl-apa-it.tex
@@ -0,0 +1,385 @@
+%D \module
+%D [ file=bibl-apa-it,
+%D version=2014.10.10,
+%D title=APA bibliography style,
+%D subtitle=Publications,
+%D author={Andrea Valle \& Alan Braslau},
+%D date=\currentdate,
+%D copyright={Public Domain}]
+%C
+%C Donated to the public domain. Use at your own risk
+
+\unprotect
+
+\setupcite
+ [author,year]
+ [\c!andtext={ e },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ e },
+ \c!compress=\v!no,
+ \c!inbetween={ },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [authoryear]
+ [\c!andtext={ e },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ e },
+ \c!compress=\v!yes,
+ \c!inbetween={ },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [authoryears]
+ [\c!andtext={ e },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ e },
+ \c!compress=\v!yes,
+ \c!inbetween={, },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [key,serial,authornum,page,short,type,doi,url]
+ [\c!andtext={ e },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ e },
+ \c!compress=\v!no,
+ \c!inbetween={ },
+ \c!left={[},
+ \c!right={]}]
+
+\setupcite
+ [num]
+ [\c!andtext={ e },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ e },
+ \c!compress=\v!yes,
+ \c!inbetween={--},
+ \c!left={[},
+ \c!right={]}]
+
+\setuppublications
+ [\c!sorttype=,
+ \c!criterium=,
+ \c!refcommand=authoryears,
+ \c!numbering=\v!no,
+ \c!autohang=\v!no]
+
+\setuppublicationlist
+ [\c!width=24pt,
+ \c!artauthor=\invertedshortauthor,
+ \c!editor=\invertedshortauthor,
+ \c!author=\invertedshortauthor,
+ \c!namesep={, },
+ \c!lastnamesep={ e },
+ \c!finalnamesep={ e },
+ \c!firstnamesep={, },
+ \c!juniorsep={ },
+ \c!vonsep={ },
+ \c!surnamesep={, },
+ \c!authoretallimit=5,
+ \c!editoretallimit=5,
+ \c!artauthoretallimit=5,
+ \c!authoretaldisplay=5,
+ \c!editoretaldisplay=5,
+ \c!artauthoretaldisplay=5,
+ \c!authoretaltext={ et al.},
+ \c!editoretaltext={ et al.},
+ \c!artauthoretaltext={ et al.}]
+
+\def\maybeyear#1{#1}
+\def\etalchar #1{#1}
+
+%D \macros{insertchapter,insertpublisher}
+
+%D Some shortcuts.
+
+% ((#1(type\ |)chapter#2)|#3)
+
+\def\insertchap#1#2#3%
+ {\insertchapter
+ {#1\insertbibtype{}{\ }{capitolo\ }}{#2}%
+ {#3}}
+
+% #1city, country: pubname#2
+% #1country: pubname#2
+% #1pubname#2
+% #1city, country#2
+% #3
+
+\def\insertpublisher#1#2#3%
+ {\insertpubname
+ {\insertcity
+ {#1}
+ {\insertcountry{, }{}{}: }%
+ {#1\insertcountry{}{: }{}}}%
+ {#2}%
+ {\insertcity
+ {#1}
+ {\insertcountry{, }{}{#2}}%
+ {\insertcountry{#1}{#2}{#3}}}%
+ }
+
+\def\insertorg#1#2#3%
+ {\insertorganization
+ {\insertcity
+ {#1}
+ {\insertcountry{, }{}{#2}: }%
+ {\insertcountry{}{: }{#2}}}%
+ {}%
+ {\insertcity
+ {#1}
+ {\insertcountry{, }{}{#2}}%
+ {\insertcountry{}{#2}{#3}}}%
+ }
+
+
+
+\setuppublicationlayout[article]{%
+ \insertartauthors{}{ }{\insertthekey{}{ }{}}%
+ \insertpubyear{(}{). }{\unskip.}%
+ \insertarttitle{\bgroup }{\egroup. }{}%
+ \insertjournal{\bgroup \it}{\egroup}
+ {\insertcrossref{In }{}{}}%
+ \insertvolume
+ {\bgroup \it, }
+ {\egroup\insertissue{\/(}{)}{}\insertpages{, }{.}{.}}
+ {\insertpages{, pp. }{.}{.}}%
+ \insertnote{ }{.}{}%
+ \insertcomment{}{.}{}%
+}
+
+\newif\ifeditedbook
+
+\setuppublicationlayout[book]{%
+ \insertauthors{}{ }{\inserteditors{}{, a c. di%
+ \ \global\editedbooktrue
+ }{\insertthekey{}{. }{}}}%
+ \insertpubyear{(}{). }{\unskip.}%
+ \inserttitle
+ {\bgroup\it }%
+ {\/\egroup
+ \ifeditedbook
+ \global\editedbookfalse
+ \insertvolume
+ { N.~}%
+ {\insertseries
+ { in~\bgroup}%
+ {\egroup. }%
+ {\insertcrossref{ in~}{}{. }}}%
+ {\insertseries{ }{.}{.}}%
+ \else
+ \insertcrossref
+ {\insertchap{, }{}{}%
+ \insertpages{\unskip, pp. }{. }{. }%
+ \insertvolume{Vol.~}{ di~}{}%
+ }%
+ {}%
+ {\insertvolume
+ {, vol.~}%
+ {\insertseries
+ { di~\bgroup\it}%
+ {\egroup}
+ {}}
+ {}%
+ \insertchap{, }{}{}%
+ \insertpages{\unskip, pp. }{.}{.}%
+ }%
+ \fi}%
+ {}%
+ \insertedition{ }{ ed.}{}%
+ \insertpublisher{ }{.}{.}%
+ \insertpages{ }{p. }{ }%
+ \insertnote{}{.}{}%
+}
+
+\setuppublicationlayout[inbook]{%
+ \insertauthors{}{ }{\inserteditors{}{, a c. di%
+ \ \global\editedbooktrue
+ }{\insertthekey{}{. }{}}}%
+ \insertpubyear{(}{). }{\unskip.}%
+ \inserttitle
+ {\bgroup\it }%
+ {\/\egroup
+ \ifeditedbook
+ \global\editedbookfalse
+ \insertvolume
+ { number~}%
+ {\insertseries
+ { in~\bgroup}%
+ {\egroup. }%
+ {\insertcrossref{ in~}{}{.}}}%
+ {\insertseries{ }{.}{}}%
+ \else
+ \insertcrossref
+ {\insertchap{, }{}{}%
+ \insertpages{\unskip, pp. }{. }{. }%
+ \insertvolume{Volume~}{ di~}{}%
+ }%
+ {}%
+ {\insertvolume
+ {, volume~}%
+ {\insertseries
+ { di~\bgroup\it}%
+ {\egroup}
+ {}}
+ {}%
+ \insertchap{, }{}{}%
+ \insertpages{\unskip, pp. }{.}{}%
+ }%
+ \fi}%
+ { }%
+ \insertedition{ }{ ed.}{}%
+ \insertpublisher{ }{.}{.}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[booklet]{%
+ \insertauthors{}{ }{\insertthekey{}{. }{}}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertedition{ }{ ed.}{}%
+ \insertpublisher{ }{.}{.}%
+ \insertpages{}{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[manual]{%
+ \insertauthors{}{ }{\insertthekey{}{. }{}}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup \it }{\/\egroup \insertseries{ (}{)}{}. }{}%
+ \insertedition{ }{ ed.}{}%
+ \insertorg{ }{.}{.}%
+ \insertpages{}{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[incollection]{%
+ \insertartauthors{}{ }{\insertthekey{}{. }{}}%
+ \insertpubyear{(}{). }{}%
+ \insertarttitle{\bgroup }{\egroup. }{}%
+ \inserttitle
+ {In \inserteditors{}%
+ {, a c. di, }%
+ {}%
+ \bgroup\it}%
+ {\egroup
+ \insertseries
+ {\insertvolume{, number }{~in }{ }}%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, pp.~}{. }{\unskip. }%
+ \insertedition{ }{ edition}{}%
+ \insertpublisher{ }{.}{.}%
+ }%
+ {In \insertcrossref{}{}{}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, pp.~}{. }{\unskip. }%
+ }%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[inproceedings]{%
+ \insertauthors{}{ }{}%
+ \insertpubyear{(}{). }{}%
+ \insertarttitle{\bgroup }{\egroup. }{}%%
+ \inserttitle
+ {In \inserteditors{}%
+ {, a c. di, }%
+ {}%
+ \bgroup\it}%
+ {\egroup
+ \insertseries
+ {\insertvolume{, number }{~in }{ }}%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, pp.~}{}{}%
+ \insertorg{. }{.}{.}%
+ }%
+ {In \insertcrossref{}{}{}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, pp.~}{. }{\unskip. }%
+ }%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[proceedings]{%
+ \inserteditors{}{, a c. di%
+ \ \global\editedbooktrue
+ }{\insertthekey{}{ }{}}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle
+ {\bgroup\it}%
+ {\egroup
+ \insertseries
+ {\insertvolume{, number }{~in }{ }}%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, pp.~}{}{}%
+ \insertorg{. }{.}{.}%
+ }%
+ {}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[mastersthesis]{%
+ \insertauthors{}{ }{}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertbibtype{}{, }{Tesi di laurea, }%
+ \insertpublisher{ }{.}{.}%
+ \insertpages{ }{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[phdthesis]{%
+ \insertauthors{}{ }{}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup\it }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertbibtype{}{, }{Tesi di dottorato,}%
+ \insertpublisher{ }{.}{.}%
+ \insertpages{ }{ p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[misc]{%
+ \insertauthors{}{ }{\insertthekey{}{. }{}}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}. }{}%
+ \insertpublisher{ }{.}{.}%
+ \insertpages{ }{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[techreport]{%
+ \insertauthors{}{ }{}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertbibtype{}{\insertvolume{ }{, }{, }}{Relazione tecnica}%
+ \insertpublisher{ }{.}{.}%
+ \insertpages{ }{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[unpublished]{%
+ \insertauthors{}{ }{}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ % \insertpublisher{ }{.}{.}%
+ \insertpages{ }{p. }{}%
+ \insertbibtype{(}{)}{}%
+ \insertnote{ }{.}{}%
+}
+
+\protect
diff --git a/Master/texmf-dist/tex/context/bib/sample.bib b/Master/texmf-dist/tex/context/bib/sample.bib
index 3f8df623eeb..4bb71d3a72a 100644
--- a/Master/texmf-dist/tex/context/bib/sample.bib
+++ b/Master/texmf-dist/tex/context/bib/sample.bib
@@ -35,4 +35,3 @@
address = {London},
keywords = {general},
}
-
diff --git a/Master/texmf-dist/tex/context/extra/showunic.tex b/Master/texmf-dist/tex/context/extra/showunic.tex
deleted file mode 100644
index efdbf4d3a94..00000000000
--- a/Master/texmf-dist/tex/context/extra/showunic.tex
+++ /dev/null
@@ -1,130 +0,0 @@
-% author : Hans Hagen / PRAGMA-ADE
-% version : 2005-06-22
-
-% todo: take antiqua (has everything)
-
-% \tracetypescriptstrue
-
-\usetypescriptfile[type-cbg]
-
-% \preloadtypescriptstrue (default at pragma)
-
-% this font does not work ... why
-%
-% \starttypescript [serif] [hebrew] [default]
-% \definefontsynonym [Serif] [hclassic]
-% \loadmapline[=][hclassic < hclassic.pfb]
-% \stoptypescript
-
-\setuppapersize
- [S6][S6]
-
-\setupbodyfont
- [10pt]
-
-\setuplayout
- [backspace=12pt,
- topspace=12pt,
- width=middle,
- height=middle,
- header=0pt,
- footer=0pt]
-
-\setupcolors
- [state=start]
-
-\setupbackgrounds
- [page]
- [background=color,
- backgroundcolor=darkgray]
-
-\definetypeface [main-latin] [rm] [serif] [latin-modern] [default][encoding=texnansi]
-\definetypeface [main-latin] [tt] [mono] [latin-modern] [default][encoding=texnansi]
-
-\definetypeface [main-math] [rm] [serif] [latin-modern] [default][encoding=texnansi]
-\definetypeface [main-math] [tt] [mono] [latin-modern] [default][encoding=texnansi]
-\definetypeface [main-math] [mm] [math] [latin-modern] [default][encoding=default]
-
-\definetypeface [main-eastern] [rm] [serif] [latin-modern] [default][encoding=qx]
-\definetypeface [main-eastern] [tt] [mono] [latin-modern] [default][encoding=texnansi]
-
-\definetypeface [main-greek] [rm] [serif] [cbgreek] [default][encoding=default]
-\definetypeface [main-greek] [tt] [mono] [latin-modern] [default][encoding=texnansi]
-
-\definetypeface [main-cyrillic] [rm] [serif] [computer-modern] [default][encoding=t2a]
-\definetypeface [main-cyrillic] [tt] [mono] [latin-modern] [default][encoding=texnansi]
-
-% \definetypeface [main-hebrew] [rm] [serif] [hebrew] [default][encoding=default]
-% \definetypeface [main-hebrew] [tt] [mono] [latin-modern] [default][encoding=texnansi]
-
-% The \showunicodetable macro is defined in unic-run.tex.
-
-\starttext
-
-% latin: western / eastern
-
-\startstandardmakeup
- \setupbodyfont[main-latin]
- \centerbox{\scale[factor=max]{\showunicodetable{000}}}
-\stopstandardmakeup
-\startstandardmakeup
- \setupbodyfont[main-eastern]
- \centerbox{\scale[factor=max]{\showunicodetable{001}}}
-\stopstandardmakeup
-\startstandardmakeup
- \setupbodyfont[main-latin]
- \centerbox{\scale[factor=max]{\showunicodetable{002}}}
-\stopstandardmakeup
-
-% greek
-
-\startstandardmakeup
- \setupbodyfont[main-greek]
- \centerbox{\scale[factor=max]{\showunicodetable{003}}}
-\stopstandardmakeup
-
-% cyrillic
-
-\startstandardmakeup
- \setupbodyfont[main-cyrillic]
- \centerbox{\scale[factor=max]{\showunicodetable{004}}}
-\stopstandardmakeup
-
-% hebrew
-
-% \startstandardmakeup
-% \setupbodyfont[mainhebrew]
-% \centerbox{\scale[factor=max]{\showunicodetable{005}}}
-% \stopstandardmakeup
-
-% misc
-
-\startstandardmakeup
- \setupbodyfont[main-latin]
- \centerbox{\scale[factor=max]{\showunicodetable{030}}}
-\stopstandardmakeup
-\startstandardmakeup
- \setupbodyfont[main-latin]
- \centerbox{\scale[factor=max]{\showunicodetable{031}}}
-\stopstandardmakeup
-\startstandardmakeup
- \setupbodyfont[main-latin]
- \centerbox{\scale[factor=max]{\showunicodetable{032}}}
-\stopstandardmakeup
-
-% math
-
-\startstandardmakeup
- \setupbodyfont[main-math]
- \centerbox{\scale[factor=max]{\showunicodetable{033}}}
-\stopstandardmakeup
-\startstandardmakeup
- \setupbodyfont[main-math]
- \centerbox{\scale[factor=max]{\showunicodetable{034}}}
-\stopstandardmakeup
-\startstandardmakeup
- \setupbodyfont[main-math]
- \centerbox{\scale[factor=max]{\showunicodetable{039}}}
-\stopstandardmakeup
-
-\stoptext
diff --git a/Master/texmf-dist/tex/context/fonts/treatments.lfg b/Master/texmf-dist/tex/context/fonts/treatments.lfg
index 44d24da22a3..40bac427c31 100644
--- a/Master/texmf-dist/tex/context/fonts/treatments.lfg
+++ b/Master/texmf-dist/tex/context/fonts/treatments.lfg
@@ -25,24 +25,50 @@ local fix_unifraktur = {
end,
}
-local fix_lmmonoregular = {
- comment = "wrong widths of some glyphs",
- fixes = function(data)
- report("fixing some wrong widths")
- local unicodes = data.resources.unicodes
- local descriptions = data.descriptions
- local defaultwidth = descriptions[unicodes["zero"]].width
- descriptions[unicodes["six"] ].width = defaultwidth
- descriptions[unicodes["nine"] ].width = defaultwidth
- descriptions[unicodes["caron"] ].width = defaultwidth
- descriptions[unicodes["perthousand"] ].width = defaultwidth
- descriptions[unicodes["numero"] ].width = defaultwidth
- descriptions[unicodes["caron.cap"] ].width = defaultwidth
- descriptions[unicodes["six.taboldstyle"] ].width = defaultwidth
- descriptions[unicodes["nine.taboldstyle"]].width = defaultwidth
- descriptions[unicodes["dollar.oldstyle" ]].width = defaultwidth
- end
-}
+-- local fix_lmmonoregular = {
+-- --
+-- -- there are now some extra safeguards for idris
+-- --
+-- comment = "wrong widths of some glyphs",
+-- fixes = function(data)
+-- report("fixing some wrong widths")
+-- local unicodes = data.resources.unicodes
+-- local descriptions = data.descriptions
+-- local function getdescription(name)
+-- local unicode = unicodes[name]
+-- if not unicode then
+-- report("no valid unicode for %a",name)
+-- return
+-- end
+-- local description = descriptions[unicode]
+-- if not description then
+-- report("no glyph names %a in font",name)
+-- return
+-- end
+-- return description
+-- end
+-- local zero = getdescription("zero")
+-- if not zero then
+-- return
+-- end
+-- local defaultwidth = zero.width
+-- local function setwidth(name)
+-- local data = getdescription(name)
+-- if data then
+-- data.width = defaultwidth
+-- end
+-- end
+-- setwidth("six")
+-- setwidth("nine")
+-- setwidth("caron")
+-- setwidth("perthousand")
+-- setwidth("numero")
+-- setwidth("caron.cap")
+-- setwidth("six.taboldstyle")
+-- setwidth("nine.taboldstyle")
+-- setwidth("dollar.oldstyle")
+-- end
+-- }
return {
name = "treatments",
diff --git a/Master/texmf-dist/tex/context/foxet/fe-bryson.xml b/Master/texmf-dist/tex/context/foxet/fe-bryson.xml
deleted file mode 100644
index 28646b65f84..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fe-bryson.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version='1.0'?>
-<fe:sample xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng' origin='Bill Bryson'>
-Imagine trying to live in a world dominated by dihydrogen oxide, a
-compound that has no taste or smell and is so viable in its properties
-that it is generally benign but at other times swiftly lethal.
-Depending on its state, it can scald you or freeze you. In the
-presence of certain organic molecules it can form carbonic acids so
-nasty that they can strip the leaves from trees and eat the faces off
-statuary. In bulk, when agitated, it can strike with a fury that no
-human edifice could withstand. Even for those who have learned to live
-with it, it is often murderous substance. We call it water.
-</fe:sample>
diff --git a/Master/texmf-dist/tex/context/foxet/fe-ward.xml b/Master/texmf-dist/tex/context/foxet/fe-ward.xml
deleted file mode 100644
index 05f7742659b..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fe-ward.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version='1.0'?>
-<fe:sample xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng' origin='Peter Ward'>
-The Earth, as a habitat for animal life, is in old age and
-has a fatal illness. Several, in fact. It would be happening
-whether humans had ever evolved or not. But our presence is
-like the effect of an old-age patient who smokes many packs
-of cigarettes per day - and we humans are the cigarettes.
-</fe:sample>
diff --git a/Master/texmf-dist/tex/context/foxet/fe-zapf.xml b/Master/texmf-dist/tex/context/foxet/fe-zapf.xml
deleted file mode 100644
index faf9a08319c..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fe-zapf.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version='1.0'?>
-<fe:sample xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng' origin='Hermann Zapf'>
-Coming back to the use of typefaces in electronic
-publishing: many of the new typographers receive their
-knowledge and information about the rules of typography
-from books, from computer magazines or the instruction
-manuals which they get with the purchase of a PC or
-software. There is not so much basic instruction, as of
-now, as there was in the old days, showing the differences
-between good and bad typographic design. Many people are
-just fascinated by their PC's tricks, and think that a
-widely<fe:compound/>praised program, called up on the
-screen, will make everything automatic from now on.
-</fe:sample>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-0101.fo b/Master/texmf-dist/tex/context/foxet/fo-0101.fo
deleted file mode 100644
index 197c5834cab..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-0101.fo
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='default'>
- <fo:region-body/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='default'>
- <fo:flow flow-name='xsl-region-body'/>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-0102.fo b/Master/texmf-dist/tex/context/foxet/fo-0102.fo
deleted file mode 100644
index 9adcf917efa..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-0102.fo
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format'
- xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='default'>
- <fo:region-body/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:declarations>
- <fe:definecolor name='red' r='.6'/>
- <fe:definecolor name='green' g='.6'/>
- <fe:definecolor name='blue' b='.6'/>
- <fe:definefontsynonym name='mono' file='lmtt10' encoding='texnansi'/>
- </fo:declarations>
-
- <fo:page-sequence master-reference='default'>
- <fo:flow flow-name='xsl-region-body'/>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-0103.fo b/Master/texmf-dist/tex/context/foxet/fo-0103.fo
deleted file mode 100644
index 95d0d4769c2..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-0103.fo
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='default'>
- <fo:region-body/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:declarations>
- <fo:color-profile src="url('myprofile.xml')" color-profile-name="myprofile"/>
- </fo:declarations>
-
- <fo:page-sequence master-reference='default'>
- <fo:flow flow-name='xsl-region-body'/>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-0201.fo b/Master/texmf-dist/tex/context/foxet/fo-0201.fo
deleted file mode 100644
index f524cfd09a9..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-0201.fo
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format'
- xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test' margin='1cm'>
- <fo:region-body/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test' line-height='18pt'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block>
- <fe:include url='fe-zapf.xml'/>
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-0301.fo b/Master/texmf-dist/tex/context/foxet/fo-0301.fo
deleted file mode 100644
index e0b8a6fc4f1..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-0301.fo
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format'
- xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test' margin='1cm' fe:option='fit'>
- <fo:region-body background-color='lightgray'/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block-container space-after.optimum='12pt' fe:tracing='true'>
- <fo:block>
- before<fo:character character='@'/>after
- </fo:block>
- <fo:block>
- before<fo:character character='@' vertical-align='super'/>after
- before<fo:character character='@' vertical-align='sub' />after
- before<fo:character character='@' vertical-align='-3pt' />after
- before<fo:character character='@' vertical-align='+3pt' />after
- </fo:block>
- <fo:block>
- before<fo:character character='@' glyph-orientation-horizontal='0deg' />after
- before<fo:character character='@' glyph-orientation-horizontal='90deg' />after
- before<fo:character character='@' glyph-orientation-horizontal='180deg'/>after
- before<fo:character character='@' glyph-orientation-horizontal='270deg'/>after
- </fo:block>
- <fo:block>
- before<fo:character character='@' glyph-orientation-horizontal='0deg' vertical-align='super'/>after
- before<fo:character character='@' glyph-orientation-horizontal='90deg' vertical-align='super'/>after
- before<fo:character character='@' glyph-orientation-horizontal='180deg' vertical-align='super'/>after
- before<fo:character character='@' glyph-orientation-horizontal='270deg' vertical-align='super'/>after
- </fo:block>
- <fo:block>
- before<fo:character character='@' glyph-orientation-horizontal='0deg' vertical-align='3pt'/>after
- before<fo:character character='@' glyph-orientation-horizontal='90deg' vertical-align='3pt'/>after
- before<fo:character character='@' glyph-orientation-horizontal='180deg' vertical-align='3pt'/>after
- before<fo:character character='@' glyph-orientation-horizontal='270deg' vertical-align='3pt'/>after
- </fo:block>
- <fo:block>
- before<fo:character character='@' vertical-align='super' text-altitude='10pt'/>after
- before<fo:character character='@' vertical-align='super' text-altitude='20pt'/>after
- before<fo:character character='@' vertical-align='100%' text-altitude='20pt'/>after
- before<fo:character character='@' vertical-align='sub' text-depth='10pt' />after
- before<fo:character character='@' vertical-align='sub' text-depth='20pt' />after
- before<fo:character character='@' vertical-align='-100%' text-depth='20pt' />after
- </fo:block>
- </fo:block-container>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-0601.fo b/Master/texmf-dist/tex/context/foxet/fo-0601.fo
deleted file mode 100644
index 1e291f27888..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-0601.fo
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test'
- margin-top='1cm'
- margin-bottom='2cm'
- margin-left='3cm'
- margin-right='4cm'>
- <fo:region-before extent='1cm' background-color='red' />
- <fo:region-after extent='1cm' background-color='green' />
- <fo:region-start extent='1cm' background-color='blue' />
- <fo:region-end extent='1cm' background-color='yellow'/>
- <fo:region-body margin='2cm' background-color='gray' />
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block>
- <fe:include url='fe-zapf.xml'/>
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-0602.fo b/Master/texmf-dist/tex/context/foxet/fo-0602.fo
deleted file mode 100644
index 36e8647675e..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-0602.fo
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format'
- xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test'
- margin-top='1cm' margin-bottom='2cm' margin-left='3cm' margin-right='4cm'>
- <fo:region-body margin='2cm' background-color='gray' />
- <fo:region-before extent='1cm' background-color='red' precedence='true'/>
- <fo:region-after extent='1cm' background-color='green' />
- <fo:region-start extent='1cm' background-color='blue' />
- <fo:region-end extent='1cm' background-color='yellow'/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block>
- <fe:include url='fe-zapf.xml'/>
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-0603.fo b/Master/texmf-dist/tex/context/foxet/fo-0603.fo
deleted file mode 100644
index 268249d3e4f..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-0603.fo
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test'
- margin-top='1cm' margin-bottom='2cm' margin-left='3cm' margin-right='4cm'>
- <fo:region-body margin='2cm' background-color='gray' />
- <fo:region-before extent='1cm' background-color='red' />
- <fo:region-after extent='1cm' background-color='green' precedence='true'/>
- <fo:region-start extent='1cm' background-color='blue' />
- <fo:region-end extent='1cm' background-color='yellow'/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block>
- <fe:include url='fe-zapf.xml'/>
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-0604.fo b/Master/texmf-dist/tex/context/foxet/fo-0604.fo
deleted file mode 100644
index 891198ee026..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-0604.fo
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test'
- margin-top='1cm' margin-bottom='2cm' margin-left='3cm' margin-right='4cm'>
- <fo:region-body margin='2cm' background-color='gray' />
- <fo:region-before extent='1cm' background-color='red' precedence='true'/>
- <fo:region-after extent='1cm' background-color='green' precedence='true'/>
- <fo:region-start extent='1cm' background-color='blue' />
- <fo:region-end extent='1cm' background-color='yellow'/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block>
- <fe:include url='fe-zapf.xml'/>
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-0611.fo b/Master/texmf-dist/tex/context/foxet/fo-0611.fo
deleted file mode 100644
index 70f495fb69d..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-0611.fo
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test' margin='2cm'>
- <fo:region-body margin='2cm'/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block>
- <fe:include url='fe-zapf.xml' n='15'/>
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-0612.fo b/Master/texmf-dist/tex/context/foxet/fo-0612.fo
deleted file mode 100644
index 4b3de694024..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-0612.fo
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test' margin='2cm'>
- <fo:region-body margin='2cm' column-count='2' column-gap='24pt'/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block>
- <fe:include url='fe-zapf.xml' n='25'/>
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-0613.fo b/Master/texmf-dist/tex/context/foxet/fo-0613.fo
deleted file mode 100644
index f478a571da4..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-0613.fo
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test' margin='1.25cm'>
- <fo:region-body margin='0cm' column-count='3' column-gap='12pt'/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block>
- <fe:include url='fe-zapf.xml' n='15'/>
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-0621.fo b/Master/texmf-dist/tex/context/foxet/fo-0621.fo
deleted file mode 100644
index 554fcc4a098..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-0621.fo
+++ /dev/null
@@ -1,106 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root
- xmlns:fo='http://www.w3.org/1999/XSL/Format'
- xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='any' margin='2cm'>
- <fe:message>setting up simple page master 'any'</fe:message>
- <fo:region-body background-color='darkgray' margin-top='2cm' margin-bottom='2cm' padding='.5cm'/>
- <fo:region-before background-color='darkgray' extent='1cm'/>
- <fo:region-after background-color='darkgray' extent='1cm'/>
- </fo:simple-page-master>
- <fo:simple-page-master master-name='first-page' margin='2cm'>
- <fe:message>setting up simple page master 'first-page'</fe:message>
- <fo:region-body background-color='red' margin='2cm' padding='.5cm'/>
- <fo:region-before background-color='red' extent='1cm'/>
- <fo:region-after background-color='red' extent='1cm'/>
- </fo:simple-page-master>
- <fo:simple-page-master master-name='left-page' margin='2cm'>
- <fe:message>setting up simple page master 'left-page'</fe:message>
- <fo:region-body background-color='green' margin='2cm' padding='.5cm'/>
- <fo:region-before background-color='green' extent='1cm'/>
- <fo:region-after background-color='green' extent='1cm'/>
- </fo:simple-page-master>
- <fo:simple-page-master master-name='right-page' margin='2cm'>
- <fe:message>setting up simple page master 'right-page'</fe:message>
- <fo:region-body background-color='blue' margin='2cm' padding='.5cm'/>
- <fo:region-before background-color='blue' extent='1cm'/>
- <fo:region-after background-color='blue' extent='1cm'/>
- </fo:simple-page-master>
- <fo:simple-page-master master-name='blank-page' margin='2cm'>
- <fe:message>setting up simple page master 'blank-page'</fe:message>
- <fo:region-body background-color='black' margin='2cm' padding='.5cm'/>
- <fo:region-before background-color='black' extent='1cm'/>
- <fo:region-after background-color='black' extent='1cm'/>
- </fo:simple-page-master>
- <fo:simple-page-master master-name='odd' margin='2cm'>
- <fe:message>setting up simple page master 'odd'</fe:message>
- <fo:region-body background-color='cyan' margin='2cm' padding='.5cm' margin-right='2cm'/>
- <fo:region-before background-color='cyan' extent='1cm'/>
- <fo:region-after background-color='cyan' extent='1cm'/>
- </fo:simple-page-master>
- <fo:simple-page-master master-name='even' margin='2cm'>
- <fe:message>setting up simple page master 'even'</fe:message>
- <fo:region-body background-color='magenta' margin='2cm' padding='.5cm' margin-left='2cm'/>
- <fo:region-before background-color='magenta' extent='1cm'/>
- <fo:region-after background-color='magenta' extent='1cm'/>
- </fo:simple-page-master>
- <fo:simple-page-master master-name='rest' margin='2cm'>
- <fe:message>setting up simple page master 'rest'</fe:message>
- <fo:region-body background-color='yellow' margin='2cm' padding='.5cm'/>
- <fo:region-before background-color='yellow' extent='1cm'/>
- <fo:region-after background-color='yellow' extent='1cm'/>
- </fo:simple-page-master>
-
- <fo:page-sequence-master master-name='demo'>
- <fe:message>setting up page sequence master 'demo'</fe:message>
- <fo:repeatable-page-master-alternatives>
- <fo:conditional-page-master-reference page-position='first' master-reference='first-page'/>
- <fo:conditional-page-master-reference page-position='last' master-reference='blank-page'/>
- <fo:conditional-page-master-reference page-position='any' master-reference='odd' odd-or-even='odd'/>
- <fo:conditional-page-master-reference page-position='any' master-reference='even' odd-or-even='even'/>
- </fo:repeatable-page-master-alternatives>
- </fo:page-sequence-master>
- <fo:page-sequence-master master-name='omed'>
- <fe:message>setting up page sequence master 'omed'</fe:message>
- <fo:repeatable-page-master-alternatives>
- <fo:conditional-page-master-reference page-position='first' master-reference='first-page'/>
- <fo:conditional-page-master-reference page-position='last' master-reference='blank-page'/>
- <fo:conditional-page-master-reference page-position='any' master-reference='odd' odd-or-even='even'/>
- <fo:conditional-page-master-reference page-position='any' master-reference='even' odd-or-even='odd'/>
- </fo:repeatable-page-master-alternatives>
- </fo:page-sequence-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='any'>
- <fe:message>starting page sequence 'any'</fe:message>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block>
- <fe:include url='fe-zapf.xml' n='15'/>
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
-
- <fo:page-sequence master-reference='demo' force-page-count='end-on-odd'>
- <fe:message>starting page sequence 'demo'</fe:message>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block>
- <fe:include url='fe-bryson.xml' n='30'/>
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
-
- <fo:page-sequence master-reference='omed' force-page-count='end-on-odd'>
- <fe:message>starting page sequence 'omed'</fe:message>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block>
- <fe:include url='fe-ward.xml' n='30'/>
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-0641.fo b/Master/texmf-dist/tex/context/foxet/fo-0641.fo
deleted file mode 100644
index 9dbb90870e0..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-0641.fo
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test' margin='2cm'>
- <fo:region-body margin='2cm' background-color='gray' fe:background-height='1cm' background-image="url('hacker.jpg')" clip='rect(1cm,1cm,1cm,1cm)' />
- <fo:region-before extent='2cm' background-color='red' fe:background-height='1cm' background-image="url('hacker.jpg')" background-repeat='repeat-x' />
- <fo:region-after extent='2cm' background-color='green' fe:background-height='2cm' background-image="url('hacker.jpg')" background-repeat='repeat-y' />
- <fo:region-start extent='2cm' background-color='blue' fe:background-height='1cm' background-image="url('hacker.jpg')" background-repeat='no-repeat'/>
- <fo:region-end extent='2cm' background-color='yellow' fe:background-height='2cm' background-image="url('hacker.jpg')" background-repeat='repeat' />
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block>
- <fe:include url='fe-zapf.xml'/>
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-0642.fo b/Master/texmf-dist/tex/context/foxet/fo-0642.fo
deleted file mode 100644
index 8f646509cbe..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-0642.fo
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format'
- xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test' margin='2cm'>
- <fo:region-body margin='2cm'
- background-color='gray'
- background-image="url('hacker.jpg')"
- background-position-horizontal='10%'
- background-position-vertical='20%'
- background-repeat='no-repeat'/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block>
- <fe:include url='fe-zapf.xml'/>
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-0643.fo b/Master/texmf-dist/tex/context/foxet/fo-0643.fo
deleted file mode 100644
index 9595d4438a8..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-0643.fo
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format'
- xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test' margin='2cm'>
- <fo:region-body margin='2cm'
- background-color='gray'
- background-image="url('hacker.jpg')"
- background-position-horizontal='center'
- background-position-vertical='center'
- background-repeat='no-repeat'/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block>
- <fe:include url='fe-zapf.xml'/>
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-0644.fo b/Master/texmf-dist/tex/context/foxet/fo-0644.fo
deleted file mode 100644
index a408661e017..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-0644.fo
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format'
- xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test' margin='2cm'>
- <fo:region-body margin='2cm'
- background-color='gray'
- background-image="url('hacker.jpg')"
- background-position-horizontal='3cm'
- background-position-vertical='5cm'
- background-repeat='no-repeat'/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block>
- <fe:include url='fe-zapf.xml'/>
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-0650.fo b/Master/texmf-dist/tex/context/foxet/fo-0650.fo
deleted file mode 100644
index 54fd7c1286e..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-0650.fo
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test'
- margin-top='1cm' margin-bottom='2cm' margin-left='3cm' margin-right='4cm'>
- <fo:region-body margin='.5cm' background-color='gray' fe:z-order='above' />
- <fo:region-before extent='1cm' background-color='red' />
- <fo:region-after extent='1cm' background-color='green' />
- <fo:region-start extent='1cm' background-color='blue' />
- <fo:region-end extent='1cm' background-color='yellow'/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block>
- <fe:include url='fe-zapf.xml'/>
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-0651.fo b/Master/texmf-dist/tex/context/foxet/fo-0651.fo
deleted file mode 100644
index 319592ba8c0..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-0651.fo
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test'
- margin-top='1cm' margin-bottom='2cm' margin-left='3cm' margin-right='4cm'>
- <fo:region-body margin='.5cm' background-color='gray' fe:z-order='below' />
- <fo:region-before extent='1cm' background-color='red' />
- <fo:region-after extent='1cm' background-color='green' />
- <fo:region-start extent='1cm' background-color='blue' />
- <fo:region-end extent='1cm' background-color='yellow'/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block>
- <fe:include url='fe-zapf.xml'/>
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-0701.fo b/Master/texmf-dist/tex/context/foxet/fo-0701.fo
deleted file mode 100644
index fabbe07228c..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-0701.fo
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master margin='2cm' master-name='default'>
- <fo:region-body background-color='darkgray'/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='default' fe:tracing='true'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block-container absolute-position='absolute' height='2cm' width='3cm' left='1cm' top='1cm'>
- <fo:block>Test 1</fo:block>
- </fo:block-container>
- <fo:block-container absolute-position='absolute' height='2cm' left='1cm' top='6cm'>
- <fo:block>Test 2</fo:block>
- </fo:block-container>
- <fo:block-container absolute-position='absolute' height='2cm' left='1cm' top='11cm' right='4cm'>
- <fo:block>Test 3</fo:block>
- </fo:block-container>
- <fo:block-container absolute-position='absolute' height='2cm' width='3cm' right='1cm' bottom='1cm'>
- <fo:block>Test 4</fo:block>
- </fo:block-container>
- <fo:block-container absolute-position='absolute' width='3cm' right='1cm' bottom='6cm'>
- <fo:block>Test 5</fo:block>
- </fo:block-container>
- <fo:block-container absolute-position='absolute' width='3cm' right='1cm' bottom='11cm' top='7cm'>
- <fo:block>Test 6</fo:block>
- </fo:block-container>
- <fo:block-container absolute-position='absolute' left='20%' right='20%' top='20%' bottom='20%'>
- <fo:block>Test 7</fo:block>
- </fo:block-container>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-0801.fo b/Master/texmf-dist/tex/context/foxet/fo-0801.fo
deleted file mode 100644
index b18c4282f99..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-0801.fo
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test' margin='2cm'>
- <fo:region-body margin='2cm'/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test' initial-page-number='123' format='n'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block id='format n'>digits: <fo:page-number/></fo:block>
- </fo:flow>
- </fo:page-sequence>
-
- <fo:page-sequence master-reference='test' initial-page-number='123' format='a'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block id='format a'>characters: <fo:page-number/></fo:block>
- </fo:flow>
- </fo:page-sequence>
-
- <fo:page-sequence master-reference='test' initial-page-number='123' format='i'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block id='format i'>romannumerals: <fo:page-number/></fo:block>
- </fo:flow>
- </fo:page-sequence>
-
- <fo:page-sequence master-reference='test' initial-page-number='123' format='-[(n)]-'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block id='complex format'>complex format: <fo:page-number/></fo:block>
- </fo:flow>
- </fo:page-sequence>
-
- <fo:page-sequence master-reference='test' initial-page-number='123'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block id='no format'>no format: <fo:page-number/></fo:block>
- </fo:flow>
- </fo:page-sequence>
-
- <fo:page-sequence master-reference='test'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block-container space-after='12pt' id='y'>
- <fo:block>digits: <fo:page-number-citation ref-id='format n'/> </fo:block>
- <fo:block>characters: <fo:page-number-citation ref-id='format a'/> </fo:block>
- <fo:block>romannumerals: <fo:page-number-citation ref-id='format i'/> </fo:block>
- <fo:block>complex format: <fo:page-number-citation ref-id='complex format'/> </fo:block>
- <fo:block>no format: <fo:page-number-citation ref-id='no format'/> </fo:block>
- </fo:block-container>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-0901.fo b/Master/texmf-dist/tex/context/foxet/fo-0901.fo
deleted file mode 100644
index 05011269bec..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-0901.fo
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test' margin='.5cm'>
- <fo:region-body margin='.5cm'/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test' initial-page-number='123'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block-container font-style='italic'>
- <fo:block font-family='Times'>times</fo:block>
- <fo:block font-family='Helvetica'>helvetica</fo:block>
- <fo:block font-family='Courier'>courier</fo:block>
- </fo:block-container>
- <fo:block-container font-style='italic'>
- <fo:block font-family='Times'>times</fo:block>
- <fo:block font-family='Helvetica'>helvetica</fo:block>
- <fo:block font-family='Courier'>courier</fo:block>
- </fo:block-container>
- <fo:block-container font-weight='bold'>
- <fo:block font-family='Times'>times</fo:block>
- <fo:block font-family='Helvetica'>helvetica</fo:block>
- <fo:block font-family='Courier'>courier</fo:block>
- </fo:block-container>
- <fo:block-container font-style='italic'>
- <fo:block font-family='Times'>times</fo:block>
- <fo:block font-family='Helvetica'>helvetica</fo:block>
- <fo:block font-family='Courier'>courier</fo:block>
- </fo:block-container>
- <fo:block-container font-style='italic' font-weight='bold' font-size='large'>
- <fo:block font-family='Times'>large</fo:block>
- <fo:block font-family='Helvetica'>large</fo:block>
- <fo:block font-family='Courier'>large</fo:block>
- </fo:block-container>
- <fo:block-container font-style='italic' font-weight='bold' font-size='x-large'>
- <fo:block font-family='Times'>x-large</fo:block>
- <fo:block font-family='Helvetica'>x-large</fo:block>
- <fo:block font-family='Courier'>x-large</fo:block>
- </fo:block-container>
- <fo:block-container font-style='italic' font-weight='bold' font-size='xx-large'>
- <fo:block font-family='Times'>xx-large</fo:block>
- <fo:block font-family='Helvetica'>xx-large</fo:block>
- <fo:block font-family='Courier'>xx-large</fo:block>
- </fo:block-container>
- <fo:block-container font-style='italic' font-weight='bold' font-size='350%'>
- <fo:block font-family='Times'>times</fo:block>
- <fo:block font-family='Helvetica'>helvetica</fo:block>
- <fo:block font-family='Courier'>courier</fo:block>
- </fo:block-container>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-0902.fo b/Master/texmf-dist/tex/context/foxet/fo-0902.fo
deleted file mode 100644
index ebaa06651a8..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-0902.fo
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test' margin='.5cm'>
- <fo:region-body margin='.5cm'/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test' initial-page-number='123'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block-container>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:block-container>
- <fo:block-container line-height='40pt'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:block-container>
- <fo:block-container line-height='180%'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:block-container>
- <fo:block-container line-height='1.2'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:block-container>
- <fo:block-container line-height='normal'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:block-container>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-1001.fo b/Master/texmf-dist/tex/context/foxet/fo-1001.fo
deleted file mode 100644
index 3733265fd09..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-1001.fo
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test' margin='2cm'>
- <fo:region-body margin='2cm'/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test' initial-page-number='123'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block-container fe:tracing='true'>
- <fo:block>a test line d 10pt</fo:block>
- <fo:block space-before.optimum='10pt' space-before.conditionality='discard'/>
- <fo:block>a test line d 5pt</fo:block>
- <fo:block space-before.optimum='5pt' space-before.conditionality='discard'/>
- <fo:block>a test line d 4pt</fo:block>
- <fo:block space-before.optimum='4pt' space-before.conditionality='discard'/>
- <fo:block>a test line d d d</fo:block>
- <fo:block space-before.optimum='10pt' space-before.conditionality='discard'/>
- <fo:block space-before.optimum='4pt' space-before.conditionality='discard'/>
- <fo:block space-before.optimum='5pt' space-before.conditionality='discard'/>
- <fo:block>a test line r d d</fo:block>
- <fo:block space-before.optimum='10pt' space-before.conditionality='retain' />
- <fo:block space-before.optimum='4pt' space-before.conditionality='discard'/>
- <fo:block space-before.optimum='5pt' space-before.conditionality='discard'/>
- <fo:block>a test line d r d</fo:block>
- <fo:block space-before.optimum='10pt' space-before.conditionality='discard'/>
- <fo:block space-before.optimum='4pt' space-before.conditionality='retain' />
- <fo:block space-before.optimum='5pt' space-before.conditionality='discard'/>
- <fo:block>a test line r r d</fo:block>
- <fo:block space-before.optimum='10pt' space-before.conditionality='retain' />
- <fo:block space-before.optimum='4pt' space-before.conditionality='retain' />
- <fo:block space-before.optimum='5pt' space-before.conditionality='discard'/>
- <fo:block>a test line d d r</fo:block>
- <fo:block space-before.optimum='10pt' space-before.conditionality='discard'/>
- <fo:block space-before.optimum='4pt' space-before.conditionality='discard'/>
- <fo:block space-before.optimum='5pt' space-before.conditionality='retain' />
- <fo:block>a test line r d r</fo:block>
- <fo:block space-before.optimum='10pt' space-before.conditionality='retain' />
- <fo:block space-before.optimum='4pt' space-before.conditionality='discard'/>
- <fo:block space-before.optimum='5pt' space-before.conditionality='retain' />
- <fo:block>a test line d r r</fo:block>
- <fo:block space-before.optimum='10pt' space-before.conditionality='discard'/>
- <fo:block space-before.optimum='4pt' space-before.conditionality='retain' />
- <fo:block space-before.optimum='5pt' space-before.conditionality='retain' />
- <fo:block>a test line r r r</fo:block>
- <fo:block space-before.optimum='10pt' space-before.conditionality='retain' />
- <fo:block space-before.optimum='4pt' space-before.conditionality='retain' />
- <fo:block space-before.optimum='5pt' space-before.conditionality='retain' />
- <fo:block>a test line d r r force</fo:block>
- <fo:block space-before.optimum='10pt' space-before.conditionality='discard' space-before.precedence='force'/>
- <fo:block space-before.optimum='4pt' space-before.conditionality='retain' space-before.precedence='force'/>
- <fo:block space-before.optimum='5pt' space-before.conditionality='retain' space-before.precedence='force'/>
- <fo:block>a test line</fo:block>
- </fo:block-container>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-1002.fo b/Master/texmf-dist/tex/context/foxet/fo-1002.fo
deleted file mode 100644
index cc0ea810010..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-1002.fo
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test' margin='2cm'>
- <fo:region-body margin='2cm'/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test' initial-page-number='123'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block start-indent='1cm'>
- <fe:include url='fe-zapf.xml'/>
- </fo:block>
- <fo:block start-indent='1cm' end-indent='1cm'>
- <fe:include url='fe-zapf.xml'/>
- <fo:block start-indent='1cm' end-indent='1cm'>
- <fe:include url='fe-zapf.xml'/>
- </fo:block>
- <fe:include url='fe-zapf.xml'/>
- </fo:block>
- <fo:block end-indent='1cm'>
- <fe:include url='fe-zapf.xml'/>
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-1003.fo b/Master/texmf-dist/tex/context/foxet/fo-1003.fo
deleted file mode 100644
index 4c416e02dff..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-1003.fo
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test' margin='2cm'>
- <fo:region-body margin='2cm'/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test' initial-page-number='123'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block start-indent='1cm' text-indent='3cm'>
- <fe:include url='fe-zapf.xml'/>
- </fo:block>
- <fo:block start-indent='1cm' end-indent='1cm' text-indent='1cm'>
- <fe:include url='fe-zapf.xml'/>
- <fo:block start-indent='1cm' end-indent='1cm' text-indent='1cm'>
- <fe:include url='fe-zapf.xml'/>
- </fo:block>
- <fe:include url='fe-zapf.xml'/>
- </fo:block>
- <fo:block end-indent='1cm' text-indent='3cm'>
- <fe:include url='fe-zapf.xml'/>
- </fo:block>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-1004.fo b/Master/texmf-dist/tex/context/foxet/fo-1004.fo
deleted file mode 100644
index 1c057edd7ec..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-1004.fo
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test' margin='2cm'>
- <fo:region-body margin='2cm'/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test' initial-page-number='123'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block-container space-before.optimum='12pt'>
- <fo:block>
- before<fo:inline space-start='10pt' >inbetween</fo:inline>after
- </fo:block>
- <fo:block>
- before<fo:inline space-end='10pt'>inbetween</fo:inline>after
- </fo:block>
- <fo:block>
- before<fo:inline space-start='10pt' space-end='10pt'>inbetween</fo:inline>after
- </fo:block>
- <fo:block>
- before<fo:inline space-start='-10pt' space-end='-10pt'>inbetween</fo:inline>after
- </fo:block>
- <fo:block>
- before<fo:inline space-start='250%' space-end='250%'>inbetween</fo:inline>after
- </fo:block>
- </fo:block-container>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-1101.fo b/Master/texmf-dist/tex/context/foxet/fo-1101.fo
deleted file mode 100644
index f6953d522d8..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-1101.fo
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test' margin='2cm'>
- <fo:region-body margin='1cm'/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test' fe:tracing='true'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- <fo:list-block
- space-before.optimum='12pt'
- space-after.optimum='12pt'>
- <fo:list-item>
- <fo:list-item-label start-indent='10pt'>
- <fo:block>[a]</fo:block>
- </fo:list-item-label>
- <fo:list-item-body end-indent='0pt'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:list-item-body>
- </fo:list-item>
- <fo:list-item>
- <fo:list-item-label start-indent='10pt'>
- <fo:block>[b]</fo:block>
- </fo:list-item-label>
- <fo:list-item-body end-indent='0pt'>
- <fo:list-block>
- <fo:list-item>
- <fo:list-item-label start-indent='40pt'>
- <fo:block>[bb]</fo:block>
- </fo:list-item-label>
- <fo:list-item-body end-indent='0pt'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:list-item-body>
- </fo:list-item>
- </fo:list-block>
- </fo:list-item-body>
- </fo:list-item>
- </fo:list-block>
- <fo:list-block
- start-indent='1cm'
- end-indent='1cm'
- space-before.optimum='12pt'
- space-after.optimum='12pt'>
- <fo:list-item>
- <fo:list-item-label start-indent='10pt'>
- <fo:block>[a]</fo:block>
- </fo:list-item-label>
- <fo:list-item-body end-indent='0pt'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:list-item-body>
- </fo:list-item>
- </fo:list-block>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-1102.fo b/Master/texmf-dist/tex/context/foxet/fo-1102.fo
deleted file mode 100644
index f8d5a9df3a8..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-1102.fo
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test' margin='2cm'>
- <fo:region-body margin='1cm'/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test' fe:tracing='true' fe:testgrid='true'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:list-block
- space-before.optimum='12pt'
- space-after.optimum='12pt'
- provisional-distance-between-starts='2cm'
- provisional-label-separation='.5cm'>
- <!-- fo:list-item>
- <fo:list-item-label start-indent='0pt' end-indent='0pt'>
- <fo:block>[a]</fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent='0pt' end-indent='0pt'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:list-item-body>
- </fo:list-item>
- <fo:list-item>
- <fo:list-item-label start-indent='50pt' end-indent='0pt'>
- <fo:block>[a]</fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent='0pt' end-indent='0pt'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:list-item-body>
- </fo:list-item>
- <fo:list-item>
- <fo:list-item-label start-indent='0pt' end-indent='50pt'>
- <fo:block>[a]</fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent='0pt' end-indent='0pt'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:list-item-body>
- </fo:list-item>
- <fo:list-item>
- <fo:list-item-label start-indent='0pt' end-indent='0pt'>
- <fo:block>[a]</fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent='50pt' end-indent='0pt'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:list-item-body>
- </fo:list-item>
- <fo:list-item>
- <fo:list-item-label start-indent='0pt' end-indent='0pt'>
- <fo:block>[a]</fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent='0pt' end-indent='50pt'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:list-item-body>
- </fo:list-item>
- <fo:list-item>
- <fo:list-item-label start-indent='50pt' end-indent='50pt'>
- <fo:block>[a]</fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent='0pt' end-indent='0pt'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:list-item-body>
- </fo:list-item>
- <fo:list-item>
- <fo:list-item-label start-indent='0pt' end-indent='0pt'>
- <fo:block>[a]</fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent='50pt' end-indent='50pt'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:list-item-body>
- </fo:list-item>
- <fo:list-item>
- <fo:list-item-label start-indent='50pt' end-indent='50pt'>
- <fo:block>[a]</fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent='50pt' end-indent='50pt'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:list-item-body>
- </fo:list-item>
- <fo:list-item>
- <fo:list-item-label start-indent='10%' end-indent='75%'>
- <fo:block>[a]</fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent='35%' end-indent='10%'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:list-item-body>
- </fo:list-item -->
- <fo:list-item>
- <fo:list-item-label start-indent='1cm' end-indent='10cm'>
- <fo:block>[a]</fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent='4cm' end-indent='1cm'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:list-item-body>
- </fo:list-item>
- <fo:list-item>
- <fo:list-item-label start-indent='1cm' end-indent='label-end()'>
- <fo:block>[a]</fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent='5cm' end-indent='1cm'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:list-item-body>
- </fo:list-item>
- <fo:list-item>
- <fo:list-item-label start-indent='1cm' end-indent='10cm'>
- <fo:block>[a]</fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent='body-start()' end-indent='2cm'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:list-item-body>
- </fo:list-item>
- <fo:list-item>
- <fo:list-item-label start-indent='1cm' end-indent='label-end()'>
- <fo:block>[a]</fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent='body-start()' end-indent='3cm'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:list-item-body>
- </fo:list-item>
- </fo:list-block>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-1103.fo b/Master/texmf-dist/tex/context/foxet/fo-1103.fo
deleted file mode 100644
index 245f3ff0e92..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-1103.fo
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test' margin='2cm'>
- <fo:region-body margin='1cm'/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test' fe:tracing='true'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:list-block space-before.optimum='12pt' space-after.optimum='12pt'
- start-indent='10pt' end-indent='10pt'>
- <fo:list-item>
- <fo:list-item-label start-indent='0pt' end-indent='0pt'>
- <fo:block>[a]</fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent='0pt' end-indent='0pt'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:list-item-body>
- </fo:list-item>
- <fo:list-item>
- <fo:list-item-label start-indent='10pt' end-indent='0pt'>
- <fo:block>[a]</fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent='0pt' end-indent='0pt'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:list-item-body>
- </fo:list-item>
- <fo:list-item>
- <fo:list-item-label start-indent='0pt' end-indent='10pt'>
- <fo:block>[a]</fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent='0pt' end-indent='0pt'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:list-item-body>
- </fo:list-item>
- <fo:list-item>
- <fo:list-item-label start-indent='0pt' end-indent='0pt'>
- <fo:block>[a]</fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent='10pt' end-indent='0pt'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:list-item-body>
- </fo:list-item>
- <fo:list-item>
- <fo:list-item-label start-indent='0pt' end-indent='0pt'>
- <fo:block>[a]</fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent='0pt' end-indent='10pt'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:list-item-body>
- </fo:list-item>
- <fo:list-item>
- <fo:list-item-label start-indent='10pt' end-indent='10pt'>
- <fo:block>[a]</fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent='0pt' end-indent='0pt'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:list-item-body>
- </fo:list-item>
- <fo:list-item>
- <fo:list-item-label start-indent='0pt' end-indent='0pt'>
- <fo:block>[a]</fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent='10pt' end-indent='10pt'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:list-item-body>
- </fo:list-item>
- <fo:list-item>
- <fo:list-item-label start-indent='10pt' end-indent='0pt'>
- <fo:block>[a]</fo:block>
- </fo:list-item-label>
- <fo:list-item-body start-indent='10pt' end-indent='10pt'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:list-item-body>
- </fo:list-item>
- </fo:list-block>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-1104.fo b/Master/texmf-dist/tex/context/foxet/fo-1104.fo
deleted file mode 100644
index 6867e772f61..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-1104.fo
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test' margin='2cm'>
- <fo:region-body margin='1cm'/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:list-block>
- <fo:list-item>
- <fo:list-item-label>
- <fo:block text-align="center">X</fo:block>
- </fo:list-item-label>
- <fo:list-item-body>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:list-item-body>
- </fo:list-item>
- </fo:list-block>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/foxet/fo-1201.fo b/Master/texmf-dist/tex/context/foxet/fo-1201.fo
deleted file mode 100644
index 364dcb21477..00000000000
--- a/Master/texmf-dist/tex/context/foxet/fo-1201.fo
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version='1.0'?>
-
-<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
-
-<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
-
- <fo:layout-master-set>
- <fo:simple-page-master master-name='test' margin='2cm'>
- <fo:region-body margin='1cm'/>
- </fo:simple-page-master>
- </fo:layout-master-set>
-
- <fo:page-sequence master-reference='test' fe:tracing='true'>
- <fo:flow flow-name='xsl-region-body'>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- <fo:block>
- test
- <fo:inline position='static' font-size='600%'>S</fo:inline>
- <fo:inline position='static' font-size='400%'>S</fo:inline>
- <fo:inline position='static' font-size='500%'>S</fo:inline>
- <fo:inline position='fixed' right='2cm' bottom='2cm' font-size='600%'>F</fo:inline>
- <fo:inline position='fixed' right='2cm' top='2cm' font-size='400%'>F</fo:inline>
- <fo:inline position='fixed' left='2cm' bottom='2cm' font-size='500%'>F</fo:inline>
- <fo:inline position='absolute' right='1cm' bottom='1cm' font-size='600%'>A</fo:inline>
- <fo:inline position='absolute' right='1cm' top='1cm' font-size='400%'>A</fo:inline>
- <fo:inline position='absolute' left='1cm' bottom='1cm' font-size='500%'>A</fo:inline>
- <fo:inline position='relative' right='2mm' bottom='2mm' font-size='600%'>R</fo:inline>
- <fo:inline position='relative' right='2mm' top='2mm' font-size='400%'>R</fo:inline>
- <fo:inline position='relative' left='2mm' bottom='2mm' font-size='500%'>R</fo:inline>
- test
- <fo:inline position='static' font-size='600%'>Q</fo:inline>
- <fo:inline position='relative' right='2mm' bottom='2mm' font-size='600%'>Q</fo:inline>
- <fo:inline position='relative' right='2mm' top='2mm' font-size='400%'>Q</fo:inline>
- <fo:inline position='relative' left='2mm' bottom='2mm' font-size='500%'>Q</fo:inline>
- </fo:block>
- <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
- </fo:flow>
- </fo:page-sequence>
-
-</fo:root>
diff --git a/Master/texmf-dist/tex/context/interface/keys-cs.xml b/Master/texmf-dist/tex/context/interface/keys-cs.xml
index 7053ceed751..c8e7e7517c1 100644
--- a/Master/texmf-dist/tex/context/interface/keys-cs.xml
+++ b/Master/texmf-dist/tex/context/interface/keys-cs.xml
@@ -183,6 +183,7 @@
<cd:variable name='flushleft' value='flushleft'/>
<cd:variable name='flushouter' value='flushouter'/>
<cd:variable name='flushright' value='flushright'/>
+ <cd:variable name='followingpage' value='followingpage'/>
<cd:variable name='footer' value='upati'/>
<cd:variable name='footnote' value='poznamkapodcarou'/>
<cd:variable name='force' value='sila'/>
@@ -304,6 +305,7 @@
<cd:variable name='mirrored' value='zrcadleno'/>
<cd:variable name='monday' value='pondeli'/>
<cd:variable name='mono' value='mono'/>
+ <cd:variable name='monobold' value='monotucne'/>
<cd:variable name='month' value='mesic'/>
<cd:variable name='more' value='more'/>
<cd:variable name='morehyphenation' value='morehyphenation'/>
@@ -363,6 +365,7 @@
<cd:variable name='positive' value='positiv'/>
<cd:variable name='postponing' value='odlozit'/>
<cd:variable name='postscript' value='postscript'/>
+ <cd:variable name='precedingpage' value='followingpage'/>
<cd:variable name='preference' value='nastaveni'/>
<cd:variable name='preview' value='nahled'/>
<cd:variable name='previous' value='predchozi'/>
@@ -422,7 +425,7 @@
<cd:variable name='september' value='zari'/>
<cd:variable name='serif' value='serif'/>
<cd:variable name='serried' value='semknuto'/>
- <cd:variable name='setups' value='einstellungen'/>
+ <cd:variable name='setups' value='setups'/>
<cd:variable name='sheet' value='sheet'/>
<cd:variable name='short' value='short'/>
<cd:variable name='simplefonts' value='simplefonts'/>
@@ -657,7 +660,7 @@
<cd:constant name='coupling' value='propojeni'/>
<cd:constant name='couplingway' value='zpusobpropojeni'/>
<cd:constant name='criterium' value='kriterium'/>
- <cd:constant name='css' value='css'/>
+ <cd:constant name='cssfile' value='cssfile'/>
<cd:constant name='current' value='aktualni'/>
<cd:constant name='cutspace' value='cutspace'/>
<cd:constant name='dash' value='pomlcka'/>
@@ -692,7 +695,7 @@
<cd:constant name='equalwidth' value='equalwidth'/>
<cd:constant name='escape' value='escape'/>
<cd:constant name='evenmargin' value='sudamarginalie'/>
- <cd:constant name='exitoffset' value='labeloffset'/>
+ <cd:constant name='exitoffset' value='exitoffset'/>
<cd:constant name='expansion' value='expanzen'/>
<cd:constant name='export' value='export'/>
<cd:constant name='extras' value='extras'/>
@@ -759,6 +762,7 @@
<cd:constant name='indenting' value='odsazovani'/>
<cd:constant name='indentnext' value='odsadpristi'/>
<cd:constant name='indicator' value='indikator'/>
+ <cd:constant name='initialsep' value='initialsep'/>
<cd:constant name='inner' value='vnitrni'/>
<cd:constant name='innermargin' value='innermargin'/>
<cd:constant name='inputfile' value='inputfile'/>
@@ -864,6 +868,7 @@
<cd:constant name='nright' value='nvpravo'/>
<cd:constant name='ntop' value='nvrsek'/>
<cd:constant name='number' value='cislo'/>
+ <cd:constant name='numberalign' value='numberalign'/>
<cd:constant name='numbercolor' value='barvacisla'/>
<cd:constant name='numbercommand' value='ciselnyprikaz'/>
<cd:constant name='numberconversion' value='numberconversion'/>
@@ -1293,6 +1298,7 @@
<cd:command name='definetabletemplate' value='definujsablonutabulky'/>
<cd:command name='definetabulate' value='definujtabelaci'/>
<cd:command name='definetext' value='definujtext'/>
+ <cd:command name='definetextbackground' value='definetextbackground'/>
<cd:command name='definetextposition' value='definetextposition'/>
<cd:command name='definetextvariable' value='definetextvariable'/>
<cd:command name='definetype' value='definetype'/>
@@ -1453,7 +1459,6 @@
<cd:command name='paperheight' value='vyskapapiru'/>
<cd:command name='paperwidth' value='sirkapapiru'/>
<cd:command name='periods' value='tecky'/>
- <cd:command name='plaatsruwelijst' value='placerawlist'/>
<cd:command name='placebookmarks' value='umistizalozky'/>
<cd:command name='placecombinedlist' value='umistikombinovanyseznam'/>
<cd:command name='placefloat' value='placefloat'/>
@@ -1463,11 +1468,13 @@
<cd:command name='placeheadtext' value='placeheadtext'/>
<cd:command name='placelegend' value='umistilegendu'/>
<cd:command name='placelist' value='umistiseznam'/>
+ <cd:command name='placelistofsynonyms' value='placelistofsynonyms'/>
<cd:command name='placelocalfootnotes' value='umistilokalnipoznamkypodcarou'/>
<cd:command name='placelogos' value='umistiloga'/>
<cd:command name='placeongrid' value='umistinamrizku'/>
<cd:command name='placeontopofeachother' value='umistinadsebe'/>
<cd:command name='placepagenumber' value='placepagenumber'/>
+ <cd:command name='placerawlist' value='placerawlist'/>
<cd:command name='placereferencelist' value='placereferencelist'/>
<cd:command name='placeregister' value='umistirejstrik'/>
<cd:command name='placerule' value='placerule'/>
@@ -1614,7 +1621,6 @@
<cd:command name='setupregister' value='nastavrejstrik'/>
<cd:command name='setuprotate' value='nastavotoceni'/>
<cd:command name='setuprule' value='setuprule'/>
- <cd:command name='setups' value='nastaveni'/>
<cd:command name='setupscreens' value='nastavrastr'/>
<cd:command name='setupsection' value='nastavsekci'/>
<cd:command name='setupsectionblock' value='nastavbloksekce'/>
@@ -1632,6 +1638,7 @@
<cd:command name='setuptables' value='nastavtabulky'/>
<cd:command name='setuptabulate' value='nastavtabelaci'/>
<cd:command name='setuptext' value='nastavtext'/>
+ <cd:command name='setuptextbackground' value='setuptextbackground'/>
<cd:command name='setuptextposition' value='setuptextposition'/>
<cd:command name='setuptextrules' value='nastavtextovelinky'/>
<cd:command name='setuptexttexts' value='nastavtexttexty'/>
@@ -1678,6 +1685,7 @@
<cd:command name='startdocument' value='startdokument'/>
<cd:command name='startenvironment' value='startprostredi'/>
<cd:command name='startfigure' value='startobraz'/>
+ <cd:command name='startframed' value='startframed'/>
<cd:command name='startglobal' value='startglobalni'/>
<cd:command name='startline' value='startradek'/>
<cd:command name='startlinecorrection' value='startkorekceradku'/>
@@ -1704,6 +1712,7 @@
<cd:command name='starttable' value='starttabulka'/>
<cd:command name='starttables' value='starttabulky'/>
<cd:command name='starttext' value='starttext'/>
+ <cd:command name='starttextbackground' value='starttextbackground'/>
<cd:command name='starttextrule' value='starttextovalinka'/>
<cd:command name='startunpacked' value='startnezhustene'/>
<cd:command name='startversion' value='startverze'/>
@@ -1718,6 +1727,7 @@
<cd:command name='stopcomponent' value='stopkomponenta'/>
<cd:command name='stopdocument' value='stopdokument'/>
<cd:command name='stopenvironment' value='stopprostredi'/>
+ <cd:command name='stopframed' value='stopframed'/>
<cd:command name='stopglobal' value='stopglobalni'/>
<cd:command name='stopline' value='stopradek'/>
<cd:command name='stoplinecorrection' value='stopkorekceradku'/>
@@ -1743,6 +1753,7 @@
<cd:command name='stoptable' value='stoptabulka'/>
<cd:command name='stoptables' value='stoptabulky'/>
<cd:command name='stoptext' value='stoptext'/>
+ <cd:command name='stoptextbackground' value='stoptextbackground'/>
<cd:command name='stoptextrule' value='stoptextovalinka'/>
<cd:command name='stopunpacked' value='stopnezhustene'/>
<cd:command name='stopversion' value='stopverze'/>
diff --git a/Master/texmf-dist/tex/context/interface/keys-de.xml b/Master/texmf-dist/tex/context/interface/keys-de.xml
index 7164db6e30b..a100a938fa3 100644
--- a/Master/texmf-dist/tex/context/interface/keys-de.xml
+++ b/Master/texmf-dist/tex/context/interface/keys-de.xml
@@ -183,6 +183,7 @@
<cd:variable name='flushleft' value='flushleft'/>
<cd:variable name='flushouter' value='flushouter'/>
<cd:variable name='flushright' value='flushright'/>
+ <cd:variable name='followingpage' value='followingpage'/>
<cd:variable name='footer' value='fusszeile'/>
<cd:variable name='footnote' value='fussnote'/>
<cd:variable name='force' value='zwinge'/>
@@ -304,6 +305,7 @@
<cd:variable name='mirrored' value='gespiegelt'/>
<cd:variable name='monday' value='montag'/>
<cd:variable name='mono' value='mono'/>
+ <cd:variable name='monobold' value='monofett'/>
<cd:variable name='month' value='monat'/>
<cd:variable name='more' value='more'/>
<cd:variable name='morehyphenation' value='morehyphenation'/>
@@ -363,6 +365,7 @@
<cd:variable name='positive' value='positiv'/>
<cd:variable name='postponing' value='verschieben'/>
<cd:variable name='postscript' value='postscript'/>
+ <cd:variable name='precedingpage' value='followingpage'/>
<cd:variable name='preference' value='einstellung'/>
<cd:variable name='preview' value='vorschau'/>
<cd:variable name='previous' value='vorig'/>
@@ -422,7 +425,7 @@
<cd:variable name='september' value='september'/>
<cd:variable name='serif' value='serif'/>
<cd:variable name='serried' value='kleinerabstand'/>
- <cd:variable name='setups' value='impostazioni'/>
+ <cd:variable name='setups' value='setups'/>
<cd:variable name='sheet' value='sheet'/>
<cd:variable name='short' value='kurz'/>
<cd:variable name='simplefonts' value='simplefonts'/>
@@ -657,7 +660,7 @@
<cd:constant name='coupling' value='verknuepfung'/>
<cd:constant name='couplingway' value='verkopplungsart'/>
<cd:constant name='criterium' value='kriterium'/>
- <cd:constant name='css' value='css'/>
+ <cd:constant name='cssfile' value='cssfile'/>
<cd:constant name='current' value='aktuell'/>
<cd:constant name='cutspace' value='cutspace'/>
<cd:constant name='dash' value='strich'/>
@@ -692,7 +695,7 @@
<cd:constant name='equalwidth' value='equalwidth'/>
<cd:constant name='escape' value='escape'/>
<cd:constant name='evenmargin' value='geraderand'/>
- <cd:constant name='exitoffset' value='labeloffset'/>
+ <cd:constant name='exitoffset' value='exitoffset'/>
<cd:constant name='expansion' value='expansion'/>
<cd:constant name='export' value='export'/>
<cd:constant name='extras' value='extras'/>
@@ -759,6 +762,7 @@
<cd:constant name='indenting' value='einziehen'/>
<cd:constant name='indentnext' value='ziehefolgendeein'/>
<cd:constant name='indicator' value='indikator'/>
+ <cd:constant name='initialsep' value='initialsep'/>
<cd:constant name='inner' value='innen'/>
<cd:constant name='innermargin' value='innermargin'/>
<cd:constant name='inputfile' value='inputfile'/>
@@ -864,6 +868,7 @@
<cd:constant name='nright' value='nrechts'/>
<cd:constant name='ntop' value='noben'/>
<cd:constant name='number' value='nummer'/>
+ <cd:constant name='numberalign' value='numberalign'/>
<cd:constant name='numbercolor' value='nummernfarbe'/>
<cd:constant name='numbercommand' value='nummerbefehl'/>
<cd:constant name='numberconversion' value='numberconversion'/>
@@ -1293,6 +1298,7 @@
<cd:command name='definetabletemplate' value='definieretabellenvorlage'/>
<cd:command name='definetabulate' value='definieretabulator'/>
<cd:command name='definetext' value='definieretext'/>
+ <cd:command name='definetextbackground' value='definetextbackground'/>
<cd:command name='definetextposition' value='definetextposition'/>
<cd:command name='definetextvariable' value='definetextvariable'/>
<cd:command name='definetype' value='definetype'/>
@@ -1453,7 +1459,6 @@
<cd:command name='paperheight' value='papierhoehe'/>
<cd:command name='paperwidth' value='papierbreite'/>
<cd:command name='periods' value='punkt'/>
- <cd:command name='plaatsruwelijst' value='placerawlist'/>
<cd:command name='placebookmarks' value='platzierebookmarks'/>
<cd:command name='placecombinedlist' value='platzierezusammengestellteliste'/>
<cd:command name='placefloat' value='placefloat'/>
@@ -1463,11 +1468,13 @@
<cd:command name='placeheadtext' value='placeheadtext'/>
<cd:command name='placelegend' value='platzierelegende'/>
<cd:command name='placelist' value='platziereliste'/>
+ <cd:command name='placelistofsynonyms' value='placelistofsynonyms'/>
<cd:command name='placelocalfootnotes' value='platzierelokalefussnoten'/>
<cd:command name='placelogos' value='platzierelogo'/>
<cd:command name='placeongrid' value='amgitterausrichten'/>
<cd:command name='placeontopofeachother' value='platziereuntereinander'/>
<cd:command name='placepagenumber' value='placepagenumber'/>
+ <cd:command name='placerawlist' value='placerawlist'/>
<cd:command name='placereferencelist' value='placereferencelist'/>
<cd:command name='placeregister' value='platziereregister'/>
<cd:command name='placerule' value='placerule'/>
@@ -1614,7 +1621,6 @@
<cd:command name='setupregister' value='stelleregisterein'/>
<cd:command name='setuprotate' value='stelledrehenein'/>
<cd:command name='setuprule' value='setuprule'/>
- <cd:command name='setups' value='einstellungen'/>
<cd:command name='setupscreens' value='stellerasterein'/>
<cd:command name='setupsection' value='stelleabschnittein'/>
<cd:command name='setupsectionblock' value='stelleabschnittsblockein'/>
@@ -1632,6 +1638,7 @@
<cd:command name='setuptables' value='stelletabellenein'/>
<cd:command name='setuptabulate' value='stelletabulatorein'/>
<cd:command name='setuptext' value='stelletextein'/>
+ <cd:command name='setuptextbackground' value='setuptextbackground'/>
<cd:command name='setuptextposition' value='setuptextposition'/>
<cd:command name='setuptextrules' value='stelletextumrissein'/>
<cd:command name='setuptexttexts' value='stelletexttexteein'/>
@@ -1678,6 +1685,7 @@
<cd:command name='startdocument' value='startdokument'/>
<cd:command name='startenvironment' value='startumgebung'/>
<cd:command name='startfigure' value='startabbildung'/>
+ <cd:command name='startframed' value='startframed'/>
<cd:command name='startglobal' value='startglobal'/>
<cd:command name='startline' value='startzeile'/>
<cd:command name='startlinecorrection' value='startzeilenkorrektur'/>
@@ -1704,6 +1712,7 @@
<cd:command name='starttable' value='starttabelle'/>
<cd:command name='starttables' value='starttabellen'/>
<cd:command name='starttext' value='starttext'/>
+ <cd:command name='starttextbackground' value='starttextbackground'/>
<cd:command name='starttextrule' value='starttextlinie'/>
<cd:command name='startunpacked' value='startgrosserdurchschuss'/>
<cd:command name='startversion' value='startversion'/>
@@ -1718,6 +1727,7 @@
<cd:command name='stopcomponent' value='stopkomponente'/>
<cd:command name='stopdocument' value='stopdokument'/>
<cd:command name='stopenvironment' value='stopumgebung'/>
+ <cd:command name='stopframed' value='stopframed'/>
<cd:command name='stopglobal' value='stopglobal'/>
<cd:command name='stopline' value='stopzeile'/>
<cd:command name='stoplinecorrection' value='stopzeilenkorrektur'/>
@@ -1743,6 +1753,7 @@
<cd:command name='stoptable' value='stoptabelle'/>
<cd:command name='stoptables' value='stoptabellen'/>
<cd:command name='stoptext' value='stoptext'/>
+ <cd:command name='stoptextbackground' value='stoptextbackground'/>
<cd:command name='stoptextrule' value='stoptextlinie'/>
<cd:command name='stopunpacked' value='stopgrosserdurchschuss'/>
<cd:command name='stopversion' value='stopversion'/>
diff --git a/Master/texmf-dist/tex/context/interface/keys-en.xml b/Master/texmf-dist/tex/context/interface/keys-en.xml
index 354b86d65fd..0e51dfc7c97 100644
--- a/Master/texmf-dist/tex/context/interface/keys-en.xml
+++ b/Master/texmf-dist/tex/context/interface/keys-en.xml
@@ -183,6 +183,7 @@
<cd:variable name='flushleft' value='flushleft'/>
<cd:variable name='flushouter' value='flushouter'/>
<cd:variable name='flushright' value='flushright'/>
+ <cd:variable name='followingpage' value='followingpage'/>
<cd:variable name='footer' value='footer'/>
<cd:variable name='footnote' value='footnote'/>
<cd:variable name='force' value='force'/>
@@ -304,6 +305,7 @@
<cd:variable name='mirrored' value='mirrored'/>
<cd:variable name='monday' value='monday'/>
<cd:variable name='mono' value='mono'/>
+ <cd:variable name='monobold' value='monobold'/>
<cd:variable name='month' value='month'/>
<cd:variable name='more' value='more'/>
<cd:variable name='morehyphenation' value='morehyphenation'/>
@@ -363,6 +365,7 @@
<cd:variable name='positive' value='positive'/>
<cd:variable name='postponing' value='postponing'/>
<cd:variable name='postscript' value='postscript'/>
+ <cd:variable name='precedingpage' value='followingpage'/>
<cd:variable name='preference' value='preference'/>
<cd:variable name='preview' value='preview'/>
<cd:variable name='previous' value='previous'/>
@@ -657,7 +660,7 @@
<cd:constant name='coupling' value='coupling'/>
<cd:constant name='couplingway' value='couplingway'/>
<cd:constant name='criterium' value='criterium'/>
- <cd:constant name='css' value='css'/>
+ <cd:constant name='cssfile' value='cssfile'/>
<cd:constant name='current' value='current'/>
<cd:constant name='cutspace' value='cutspace'/>
<cd:constant name='dash' value='dash'/>
@@ -692,7 +695,7 @@
<cd:constant name='equalwidth' value='equalwidth'/>
<cd:constant name='escape' value='escape'/>
<cd:constant name='evenmargin' value='evenmargin'/>
- <cd:constant name='exitoffset' value='labeloffset'/>
+ <cd:constant name='exitoffset' value='exitoffset'/>
<cd:constant name='expansion' value='expansion'/>
<cd:constant name='export' value='export'/>
<cd:constant name='extras' value='extras'/>
@@ -759,6 +762,7 @@
<cd:constant name='indenting' value='indenting'/>
<cd:constant name='indentnext' value='indentnext'/>
<cd:constant name='indicator' value='indicator'/>
+ <cd:constant name='initialsep' value='initialsep'/>
<cd:constant name='inner' value='inner'/>
<cd:constant name='innermargin' value='innermargin'/>
<cd:constant name='inputfile' value='inputfile'/>
@@ -864,6 +868,7 @@
<cd:constant name='nright' value='nright'/>
<cd:constant name='ntop' value='ntop'/>
<cd:constant name='number' value='number'/>
+ <cd:constant name='numberalign' value='numberalign'/>
<cd:constant name='numbercolor' value='numbercolor'/>
<cd:constant name='numbercommand' value='numbercommand'/>
<cd:constant name='numberconversion' value='numberconversion'/>
@@ -1293,6 +1298,7 @@
<cd:command name='definetabletemplate' value='definetabletemplate'/>
<cd:command name='definetabulate' value='definetabulate'/>
<cd:command name='definetext' value='definetext'/>
+ <cd:command name='definetextbackground' value='definetextbackground'/>
<cd:command name='definetextposition' value='definetextposition'/>
<cd:command name='definetextvariable' value='definetextvariable'/>
<cd:command name='definetype' value='definetype'/>
@@ -1453,7 +1459,6 @@
<cd:command name='paperheight' value='paperheight'/>
<cd:command name='paperwidth' value='paperwidth'/>
<cd:command name='periods' value='periods'/>
- <cd:command name='plaatsruwelijst' value='placerawlist'/>
<cd:command name='placebookmarks' value='placebookmarks'/>
<cd:command name='placecombinedlist' value='placecombinedlist'/>
<cd:command name='placefloat' value='placefloat'/>
@@ -1463,11 +1468,13 @@
<cd:command name='placeheadtext' value='placeheadtext'/>
<cd:command name='placelegend' value='placelegend'/>
<cd:command name='placelist' value='placelist'/>
+ <cd:command name='placelistofsynonyms' value='placelistofsynonyms'/>
<cd:command name='placelocalfootnotes' value='placelocalfootnotes'/>
<cd:command name='placelogos' value='placelogos'/>
<cd:command name='placeongrid' value='placeongrid'/>
<cd:command name='placeontopofeachother' value='placeontopofeachother'/>
<cd:command name='placepagenumber' value='placepagenumber'/>
+ <cd:command name='placerawlist' value='placerawlist'/>
<cd:command name='placereferencelist' value='placereferencelist'/>
<cd:command name='placeregister' value='placeregister'/>
<cd:command name='placerule' value='placerule'/>
@@ -1614,7 +1621,6 @@
<cd:command name='setupregister' value='setupregister'/>
<cd:command name='setuprotate' value='setuprotate'/>
<cd:command name='setuprule' value='setuprule'/>
- <cd:command name='setups' value='setups'/>
<cd:command name='setupscreens' value='setupscreens'/>
<cd:command name='setupsection' value='setupsection'/>
<cd:command name='setupsectionblock' value='setupsectionblock'/>
@@ -1632,6 +1638,7 @@
<cd:command name='setuptables' value='setuptables'/>
<cd:command name='setuptabulate' value='setuptabulate'/>
<cd:command name='setuptext' value='setuptext'/>
+ <cd:command name='setuptextbackground' value='setuptextbackground'/>
<cd:command name='setuptextposition' value='setuptextposition'/>
<cd:command name='setuptextrules' value='setuptextrules'/>
<cd:command name='setuptexttexts' value='setuptexttexts'/>
@@ -1678,6 +1685,7 @@
<cd:command name='startdocument' value='startdocument'/>
<cd:command name='startenvironment' value='startenvironment'/>
<cd:command name='startfigure' value='startfigure'/>
+ <cd:command name='startframed' value='startframed'/>
<cd:command name='startglobal' value='startglobal'/>
<cd:command name='startline' value='startline'/>
<cd:command name='startlinecorrection' value='startlinecorrection'/>
@@ -1704,6 +1712,7 @@
<cd:command name='starttable' value='starttable'/>
<cd:command name='starttables' value='starttables'/>
<cd:command name='starttext' value='starttext'/>
+ <cd:command name='starttextbackground' value='starttextbackground'/>
<cd:command name='starttextrule' value='starttextrule'/>
<cd:command name='startunpacked' value='startunpacked'/>
<cd:command name='startversion' value='startversion'/>
@@ -1718,6 +1727,7 @@
<cd:command name='stopcomponent' value='stopcomponent'/>
<cd:command name='stopdocument' value='stopdocument'/>
<cd:command name='stopenvironment' value='stopenvironment'/>
+ <cd:command name='stopframed' value='stopframed'/>
<cd:command name='stopglobal' value='stopglobal'/>
<cd:command name='stopline' value='stopline'/>
<cd:command name='stoplinecorrection' value='stoplinecorrection'/>
@@ -1743,6 +1753,7 @@
<cd:command name='stoptable' value='stoptable'/>
<cd:command name='stoptables' value='stoptables'/>
<cd:command name='stoptext' value='stoptext'/>
+ <cd:command name='stoptextbackground' value='stoptextbackground'/>
<cd:command name='stoptextrule' value='stoptextrule'/>
<cd:command name='stopunpacked' value='stopunpacked'/>
<cd:command name='stopversion' value='stopversion'/>
diff --git a/Master/texmf-dist/tex/context/interface/keys-fr.xml b/Master/texmf-dist/tex/context/interface/keys-fr.xml
index 0e4f9e51671..cd35ad7e19d 100644
--- a/Master/texmf-dist/tex/context/interface/keys-fr.xml
+++ b/Master/texmf-dist/tex/context/interface/keys-fr.xml
@@ -183,6 +183,7 @@
<cd:variable name='flushleft' value='flushleft'/>
<cd:variable name='flushouter' value='flushouter'/>
<cd:variable name='flushright' value='flushright'/>
+ <cd:variable name='followingpage' value='followingpage'/>
<cd:variable name='footer' value='pdp'/>
<cd:variable name='footnote' value='notepdp'/>
<cd:variable name='force' value='force'/>
@@ -304,6 +305,7 @@
<cd:variable name='mirrored' value='reflete'/>
<cd:variable name='monday' value='lundi'/>
<cd:variable name='mono' value='mono'/>
+ <cd:variable name='monobold' value='monogras'/>
<cd:variable name='month' value='mois'/>
<cd:variable name='more' value='more'/>
<cd:variable name='morehyphenation' value='morehyphenation'/>
@@ -363,6 +365,7 @@
<cd:variable name='positive' value='positif'/>
<cd:variable name='postponing' value='postponing'/>
<cd:variable name='postscript' value='postscript'/>
+ <cd:variable name='precedingpage' value='followingpage'/>
<cd:variable name='preference' value='preference'/>
<cd:variable name='preview' value='previsualisation'/>
<cd:variable name='previous' value='precedent'/>
@@ -422,7 +425,7 @@
<cd:variable name='september' value='septembre'/>
<cd:variable name='serif' value='serif'/>
<cd:variable name='serried' value='serried'/>
- <cd:variable name='setups' value='reglages'/>
+ <cd:variable name='setups' value='setups'/>
<cd:variable name='sheet' value='sheet'/>
<cd:variable name='short' value='short'/>
<cd:variable name='simplefonts' value='simplefonts'/>
@@ -657,7 +660,7 @@
<cd:constant name='coupling' value='couplage'/>
<cd:constant name='couplingway' value='modecouplage'/>
<cd:constant name='criterium' value='critere'/>
- <cd:constant name='css' value='css'/>
+ <cd:constant name='cssfile' value='cssfile'/>
<cd:constant name='current' value='courant'/>
<cd:constant name='cutspace' value='cutspace'/>
<cd:constant name='dash' value='pointille'/>
@@ -692,7 +695,7 @@
<cd:constant name='equalwidth' value='equalwidth'/>
<cd:constant name='escape' value='escape'/>
<cd:constant name='evenmargin' value='margepaire'/>
- <cd:constant name='exitoffset' value='labeloffset'/>
+ <cd:constant name='exitoffset' value='exitoffset'/>
<cd:constant name='expansion' value='expansion'/>
<cd:constant name='export' value='export'/>
<cd:constant name='extras' value='extras'/>
@@ -759,6 +762,7 @@
<cd:constant name='indenting' value='composeenalinea'/>
<cd:constant name='indentnext' value='indentesuivant'/>
<cd:constant name='indicator' value='indicateur'/>
+ <cd:constant name='initialsep' value='initialsep'/>
<cd:constant name='inner' value='interieur'/>
<cd:constant name='innermargin' value='margeinterieure'/>
<cd:constant name='inputfile' value='fichierentree'/>
@@ -864,6 +868,7 @@
<cd:constant name='nright' value='ndroite'/>
<cd:constant name='ntop' value='nsup'/>
<cd:constant name='number' value='numero'/>
+ <cd:constant name='numberalign' value='numberalign'/>
<cd:constant name='numbercolor' value='couleurnumero'/>
<cd:constant name='numbercommand' value='commandenumero'/>
<cd:constant name='numberconversion' value='numberconversion'/>
@@ -1008,7 +1013,7 @@
<cd:constant name='separatorcolor' value='separatorcolor'/>
<cd:constant name='separatorstyle' value='separatorstyle'/>
<cd:constant name='set' value='set'/>
- <cd:constant name='setups' value='reglages'/>
+ <cd:constant name='setups' value='setups'/>
<cd:constant name='shrink' value='shrink'/>
<cd:constant name='side' value='cote'/>
<cd:constant name='sidealign' value='sidealign'/>
@@ -1293,6 +1298,7 @@
<cd:command name='definetabletemplate' value='definittrametableau'/>
<cd:command name='definetabulate' value='definittabulation'/>
<cd:command name='definetext' value='definittexte'/>
+ <cd:command name='definetextbackground' value='definetextbackground'/>
<cd:command name='definetextposition' value='definitpositiontexte'/>
<cd:command name='definetextvariable' value='definitvariabletexte'/>
<cd:command name='definetype' value='definittype'/>
@@ -1453,7 +1459,6 @@
<cd:command name='paperheight' value='hauteurpapier'/>
<cd:command name='paperwidth' value='largeurpapier'/>
<cd:command name='periods' value='periodes'/>
- <cd:command name='plaatsruwelijst' value='placerawlist'/>
<cd:command name='placebookmarks' value='placemarquespages'/>
<cd:command name='placecombinedlist' value='placelisteinmbriquee'/>
<cd:command name='placefloat' value='placeflottant'/>
@@ -1463,11 +1468,13 @@
<cd:command name='placeheadtext' value='placetextetete'/>
<cd:command name='placelegend' value='placelegende'/>
<cd:command name='placelist' value='placeliste'/>
+ <cd:command name='placelistofsynonyms' value='placelistofsynonyms'/>
<cd:command name='placelocalfootnotes' value='placenotespdplocales'/>
<cd:command name='placelogos' value='placelogos'/>
<cd:command name='placeongrid' value='placesurgrille'/>
<cd:command name='placeontopofeachother' value='placelesunsaudessusdesautres'/>
<cd:command name='placepagenumber' value='placenumeropage'/>
+ <cd:command name='placerawlist' value='placerawlist'/>
<cd:command name='placereferencelist' value='placelistereference'/>
<cd:command name='placeregister' value='placeregistre'/>
<cd:command name='placerule' value='placeregle'/>
@@ -1614,7 +1621,6 @@
<cd:command name='setupregister' value='regleregistre'/>
<cd:command name='setuprotate' value='regleoriente'/>
<cd:command name='setuprule' value='regleregle'/>
- <cd:command name='setups' value='reglages'/>
<cd:command name='setupscreens' value='regleecrans'/>
<cd:command name='setupsection' value='reglesection'/>
<cd:command name='setupsectionblock' value='regleblocsection'/>
@@ -1632,6 +1638,7 @@
<cd:command name='setuptables' value='regletableaux'/>
<cd:command name='setuptabulate' value='regletabulation'/>
<cd:command name='setuptext' value='regletexte'/>
+ <cd:command name='setuptextbackground' value='setuptextbackground'/>
<cd:command name='setuptextposition' value='reglepositiontexte'/>
<cd:command name='setuptextrules' value='reglelignesreglestexte'/>
<cd:command name='setuptexttexts' value='regletextestexte'/>
@@ -1678,6 +1685,7 @@
<cd:command name='startdocument' value='demarredocument'/>
<cd:command name='startenvironment' value='demarreenvironement'/>
<cd:command name='startfigure' value='demarrefigure'/>
+ <cd:command name='startframed' value='startframed'/>
<cd:command name='startglobal' value='demarreglobal'/>
<cd:command name='startline' value='demarreligne'/>
<cd:command name='startlinecorrection' value='demarrecorrectionligne'/>
@@ -1704,6 +1712,7 @@
<cd:command name='starttable' value='demarretableau'/>
<cd:command name='starttables' value='demarretableaux'/>
<cd:command name='starttext' value='demarretexte'/>
+ <cd:command name='starttextbackground' value='starttextbackground'/>
<cd:command name='starttextrule' value='demarreligneregleetexte'/>
<cd:command name='startunpacked' value='demarredegroupe'/>
<cd:command name='startversion' value='demarreversion'/>
@@ -1718,6 +1727,7 @@
<cd:command name='stopcomponent' value='stoppecomposant'/>
<cd:command name='stopdocument' value='stoppedocument'/>
<cd:command name='stopenvironment' value='stoppeenvironement'/>
+ <cd:command name='stopframed' value='stopframed'/>
<cd:command name='stopglobal' value='stoppeglobal'/>
<cd:command name='stopline' value='stoppeligne'/>
<cd:command name='stoplinecorrection' value='stoppecorrectionligne'/>
@@ -1743,6 +1753,7 @@
<cd:command name='stoptable' value='stoppetableau'/>
<cd:command name='stoptables' value='stoppetableaux'/>
<cd:command name='stoptext' value='stoppetexte'/>
+ <cd:command name='stoptextbackground' value='stoptextbackground'/>
<cd:command name='stoptextrule' value='stoppeligneregleetexte'/>
<cd:command name='stopunpacked' value='stoppedegroupe'/>
<cd:command name='stopversion' value='stoppeversion'/>
diff --git a/Master/texmf-dist/tex/context/interface/keys-it.xml b/Master/texmf-dist/tex/context/interface/keys-it.xml
index afc33eb225d..f07dbb5e6f1 100644
--- a/Master/texmf-dist/tex/context/interface/keys-it.xml
+++ b/Master/texmf-dist/tex/context/interface/keys-it.xml
@@ -183,6 +183,7 @@
<cd:variable name='flushleft' value='flushleft'/>
<cd:variable name='flushouter' value='flushouter'/>
<cd:variable name='flushright' value='flushright'/>
+ <cd:variable name='followingpage' value='followingpage'/>
<cd:variable name='footer' value='piedipagina'/>
<cd:variable name='footnote' value='notapdp'/>
<cd:variable name='force' value='forza'/>
@@ -304,6 +305,7 @@
<cd:variable name='mirrored' value='riflesso'/>
<cd:variable name='monday' value='lunedi'/>
<cd:variable name='mono' value='mono'/>
+ <cd:variable name='monobold' value='monograssetto'/>
<cd:variable name='month' value='mese'/>
<cd:variable name='more' value='more'/>
<cd:variable name='morehyphenation' value='morehyphenation'/>
@@ -363,6 +365,7 @@
<cd:variable name='positive' value='positivo'/>
<cd:variable name='postponing' value='posporre'/>
<cd:variable name='postscript' value='postscript'/>
+ <cd:variable name='precedingpage' value='followingpage'/>
<cd:variable name='preference' value='preferenza'/>
<cd:variable name='preview' value='anteprima'/>
<cd:variable name='previous' value='precedente'/>
@@ -422,7 +425,7 @@
<cd:variable name='september' value='settembre'/>
<cd:variable name='serif' value='serif'/>
<cd:variable name='serried' value='vicino'/>
- <cd:variable name='setups' value='nastaveni'/>
+ <cd:variable name='setups' value='setups'/>
<cd:variable name='sheet' value='sheet'/>
<cd:variable name='short' value='short'/>
<cd:variable name='simplefonts' value='simplefonts'/>
@@ -657,7 +660,7 @@
<cd:constant name='coupling' value='accoppiamento'/>
<cd:constant name='couplingway' value='modoaccoppiamento'/>
<cd:constant name='criterium' value='criterio'/>
- <cd:constant name='css' value='css'/>
+ <cd:constant name='cssfile' value='cssfile'/>
<cd:constant name='current' value='corrente'/>
<cd:constant name='cutspace' value='cutspace'/>
<cd:constant name='dash' value='dash'/>
@@ -692,7 +695,7 @@
<cd:constant name='equalwidth' value='equalwidth'/>
<cd:constant name='escape' value='escape'/>
<cd:constant name='evenmargin' value='marginepari'/>
- <cd:constant name='exitoffset' value='labeloffset'/>
+ <cd:constant name='exitoffset' value='exitoffset'/>
<cd:constant name='expansion' value='espansione'/>
<cd:constant name='export' value='export'/>
<cd:constant name='extras' value='extras'/>
@@ -759,6 +762,7 @@
<cd:constant name='indenting' value='rientro'/>
<cd:constant name='indentnext' value='rientrasuccessivo'/>
<cd:constant name='indicator' value='indicatore'/>
+ <cd:constant name='initialsep' value='initialsep'/>
<cd:constant name='inner' value='interno'/>
<cd:constant name='innermargin' value='margineinterno'/>
<cd:constant name='inputfile' value='inputfile'/>
@@ -840,7 +844,7 @@
<cd:constant name='middletext' value='testocentro'/>
<cd:constant name='midsentence' value='midsentence'/>
<cd:constant name='min' value='min'/>
- <cd:constant name='mindepth' value='mindeoth'/>
+ <cd:constant name='mindepth' value='mindepth'/>
<cd:constant name='minheight' value='altezzamin'/>
<cd:constant name='minwidth' value='ampiezzamin'/>
<cd:constant name='moffset' value='moffset'/>
@@ -864,6 +868,7 @@
<cd:constant name='nright' value='ndestra'/>
<cd:constant name='ntop' value='ncima'/>
<cd:constant name='number' value='numero'/>
+ <cd:constant name='numberalign' value='numberalign'/>
<cd:constant name='numbercolor' value='colorenumero'/>
<cd:constant name='numbercommand' value='comandonumero'/>
<cd:constant name='numberconversion' value='numberconversion'/>
@@ -1293,6 +1298,7 @@
<cd:command name='definetabletemplate' value='definiscimodellotabella'/>
<cd:command name='definetabulate' value='definiscitabulato'/>
<cd:command name='definetext' value='definiscitesto'/>
+ <cd:command name='definetextbackground' value='definetextbackground'/>
<cd:command name='definetextposition' value='definisciposizionetesto'/>
<cd:command name='definetextvariable' value='definiscivariabiletesto'/>
<cd:command name='definetype' value='definiscitype'/>
@@ -1453,7 +1459,6 @@
<cd:command name='paperheight' value='altezzacarta'/>
<cd:command name='paperwidth' value='ampiezzacarta'/>
<cd:command name='periods' value='punti'/>
- <cd:command name='plaatsruwelijst' value='placerawlist'/>
<cd:command name='placebookmarks' value='mettisegnalibro'/>
<cd:command name='placecombinedlist' value='mettielencocombinato'/>
<cd:command name='placefloat' value='placefloat'/>
@@ -1463,11 +1468,13 @@
<cd:command name='placeheadtext' value='posizionatestotesta'/>
<cd:command name='placelegend' value='mettilegenda'/>
<cd:command name='placelist' value='mettielenco'/>
+ <cd:command name='placelistofsynonyms' value='placelistofsynonyms'/>
<cd:command name='placelocalfootnotes' value='mettinotepdplocali'/>
<cd:command name='placelogos' value='mettiloghi'/>
<cd:command name='placeongrid' value='mettiingriglia'/>
<cd:command name='placeontopofeachother' value='mettiunosullaltro'/>
<cd:command name='placepagenumber' value='mettinumeropagina'/>
+ <cd:command name='placerawlist' value='placerawlist'/>
<cd:command name='placereferencelist' value='placereferencelist'/>
<cd:command name='placeregister' value='mettiregistro'/>
<cd:command name='placerule' value='mettilinea'/>
@@ -1614,7 +1621,6 @@
<cd:command name='setupregister' value='impostaregistro'/>
<cd:command name='setuprotate' value='impostarotazione'/>
<cd:command name='setuprule' value='impostalinea'/>
- <cd:command name='setups' value='impostazioni'/>
<cd:command name='setupscreens' value='impostaschermi'/>
<cd:command name='setupsection' value='impostasezione'/>
<cd:command name='setupsectionblock' value='impostabloccosezione'/>
@@ -1632,6 +1638,7 @@
<cd:command name='setuptables' value='impostatabelle'/>
<cd:command name='setuptabulate' value='impostatabulato'/>
<cd:command name='setuptext' value='impostatesto'/>
+ <cd:command name='setuptextbackground' value='setuptextbackground'/>
<cd:command name='setuptextposition' value='impostaposizionetesto'/>
<cd:command name='setuptextrules' value='impostalineetesto'/>
<cd:command name='setuptexttexts' value='impostatestotesti'/>
@@ -1678,6 +1685,7 @@
<cd:command name='startdocument' value='iniziadocumento'/>
<cd:command name='startenvironment' value='iniziaambiente'/>
<cd:command name='startfigure' value='iniziafigura'/>
+ <cd:command name='startframed' value='startframed'/>
<cd:command name='startglobal' value='iniziaglobale'/>
<cd:command name='startline' value='iniziariga'/>
<cd:command name='startlinecorrection' value='iniziacorrezioneriga'/>
@@ -1704,6 +1712,7 @@
<cd:command name='starttable' value='iniziatabella'/>
<cd:command name='starttables' value='iniziatabelle'/>
<cd:command name='starttext' value='iniziatesto'/>
+ <cd:command name='starttextbackground' value='starttextbackground'/>
<cd:command name='starttextrule' value='inizialineatesto'/>
<cd:command name='startunpacked' value='iniziaunpacked'/>
<cd:command name='startversion' value='iniziaversione'/>
@@ -1718,6 +1727,7 @@
<cd:command name='stopcomponent' value='terminacomponente'/>
<cd:command name='stopdocument' value='terminadocumento'/>
<cd:command name='stopenvironment' value='terminaambiente'/>
+ <cd:command name='stopframed' value='stopframed'/>
<cd:command name='stopglobal' value='terminaglobale'/>
<cd:command name='stopline' value='terminariga'/>
<cd:command name='stoplinecorrection' value='terminacorrezioneriga'/>
@@ -1743,6 +1753,7 @@
<cd:command name='stoptable' value='terminatabella'/>
<cd:command name='stoptables' value='terminatabelle'/>
<cd:command name='stoptext' value='terminatesto'/>
+ <cd:command name='stoptextbackground' value='stoptextbackground'/>
<cd:command name='stoptextrule' value='terminalineatesto'/>
<cd:command name='stopunpacked' value='terminaunpacked'/>
<cd:command name='stopversion' value='terminaversioni'/>
diff --git a/Master/texmf-dist/tex/context/interface/keys-nl.xml b/Master/texmf-dist/tex/context/interface/keys-nl.xml
index 9abfe5d7a90..f32d79275c2 100644
--- a/Master/texmf-dist/tex/context/interface/keys-nl.xml
+++ b/Master/texmf-dist/tex/context/interface/keys-nl.xml
@@ -183,6 +183,7 @@
<cd:variable name='flushleft' value='lijnlinks'/>
<cd:variable name='flushouter' value='lijnbuiten'/>
<cd:variable name='flushright' value='lijnrechts'/>
+ <cd:variable name='followingpage' value='opvolgendepagina'/>
<cd:variable name='footer' value='voet'/>
<cd:variable name='footnote' value='voetnoot'/>
<cd:variable name='force' value='forceer'/>
@@ -290,20 +291,21 @@
<cd:variable name='mathematics' value='wiskunde'/>
<cd:variable name='mathmatrix' value='wiskundematrix'/>
<cd:variable name='max' value='max'/>
- <cd:variable name='maxdepth' value='maxdepth'/>
- <cd:variable name='maxheight' value='maxheight'/>
- <cd:variable name='maxwidth' value='maxwidth'/>
+ <cd:variable name='maxdepth' value='maxdiepte'/>
+ <cd:variable name='maxheight' value='maxhoogte'/>
+ <cd:variable name='maxwidth' value='maxbreedte'/>
<cd:variable name='may' value='mei'/>
<cd:variable name='mediaeval' value='mediaeval'/>
<cd:variable name='medium' value='middel'/>
<cd:variable name='middle' value='midden'/>
<cd:variable name='min' value='min'/>
- <cd:variable name='mindepth' value='mindepth'/>
+ <cd:variable name='mindepth' value='mindiepte'/>
<cd:variable name='minheight' value='minhoogte'/>
<cd:variable name='minwidth' value='minbreedte'/>
<cd:variable name='mirrored' value='gespiegeld'/>
<cd:variable name='monday' value='maandag'/>
<cd:variable name='mono' value='mono'/>
+ <cd:variable name='monobold' value='monovet'/>
<cd:variable name='month' value='maand'/>
<cd:variable name='more' value='meer'/>
<cd:variable name='morehyphenation' value='morehyphenation'/>
@@ -363,6 +365,7 @@
<cd:variable name='positive' value='positief'/>
<cd:variable name='postponing' value='uitstellen'/>
<cd:variable name='postscript' value='postscript'/>
+ <cd:variable name='precedingpage' value='voorafgaandepagina'/>
<cd:variable name='preference' value='voorkeur'/>
<cd:variable name='preview' value='preview'/>
<cd:variable name='previous' value='vorige'/>
@@ -422,7 +425,7 @@
<cd:variable name='september' value='september'/>
<cd:variable name='serif' value='serif'/>
<cd:variable name='serried' value='aanelkaar'/>
- <cd:variable name='setups' value='instellingen'/>
+ <cd:variable name='setups' value='setups'/>
<cd:variable name='sheet' value='sheet'/>
<cd:variable name='short' value='kort'/>
<cd:variable name='simplefonts' value='simplefonts'/>
@@ -657,7 +660,7 @@
<cd:constant name='coupling' value='koppeling'/>
<cd:constant name='couplingway' value='koppelwijze'/>
<cd:constant name='criterium' value='criterium'/>
- <cd:constant name='css' value='css'/>
+ <cd:constant name='cssfile' value='cssfile'/>
<cd:constant name='current' value='huidige'/>
<cd:constant name='cutspace' value='snijwit'/>
<cd:constant name='dash' value='streep'/>
@@ -692,7 +695,7 @@
<cd:constant name='equalwidth' value='equalwidth'/>
<cd:constant name='escape' value='escape'/>
<cd:constant name='evenmargin' value='evenmarge'/>
- <cd:constant name='exitoffset' value='labeloffset'/>
+ <cd:constant name='exitoffset' value='exitoffset'/>
<cd:constant name='expansion' value='expansie'/>
<cd:constant name='export' value='exporteer'/>
<cd:constant name='extras' value='extras'/>
@@ -759,6 +762,7 @@
<cd:constant name='indenting' value='inspringen'/>
<cd:constant name='indentnext' value='springvolgendein'/>
<cd:constant name='indicator' value='aanduiding'/>
+ <cd:constant name='initialsep' value='initialsep'/>
<cd:constant name='inner' value='binnen'/>
<cd:constant name='innermargin' value='binnenmarge'/>
<cd:constant name='inputfile' value='inputfile'/>
@@ -864,6 +868,7 @@
<cd:constant name='nright' value='nrechts'/>
<cd:constant name='ntop' value='nboven'/>
<cd:constant name='number' value='nummer'/>
+ <cd:constant name='numberalign' value='nummeruitlijnen'/>
<cd:constant name='numbercolor' value='nummerkleur'/>
<cd:constant name='numbercommand' value='nummercommando'/>
<cd:constant name='numberconversion' value='numberconversion'/>
@@ -1293,6 +1298,7 @@
<cd:command name='definetabletemplate' value='definieertabelvorm'/>
<cd:command name='definetabulate' value='definieertabulatie'/>
<cd:command name='definetext' value='definieertekst'/>
+ <cd:command name='definetextbackground' value='definieertekstachtergrond'/>
<cd:command name='definetextposition' value='definieertekstpositie'/>
<cd:command name='definetextvariable' value='definieertekstvariabele'/>
<cd:command name='definetype' value='definieertype'/>
@@ -1453,7 +1459,6 @@
<cd:command name='paperheight' value='papierhoogte'/>
<cd:command name='paperwidth' value='papierbreedte'/>
<cd:command name='periods' value='punten'/>
- <cd:command name='plaatsruwelijst' value='plaatsruwelijst'/>
<cd:command name='placebookmarks' value='plaatsbookmarks'/>
<cd:command name='placecombinedlist' value='plaatssamengesteldelijst'/>
<cd:command name='placefloat' value='plaatsplaatsblok'/>
@@ -1463,11 +1468,13 @@
<cd:command name='placeheadtext' value='plaatskoptekst'/>
<cd:command name='placelegend' value='plaatslegenda'/>
<cd:command name='placelist' value='plaatslijst'/>
+ <cd:command name='placelistofsynonyms' value='plaatslijstmetsynoniemen'/>
<cd:command name='placelocalfootnotes' value='plaatslokalevoetnoten'/>
<cd:command name='placelogos' value='plaatsbeeldmerken'/>
<cd:command name='placeongrid' value='plaatsopgrid'/>
<cd:command name='placeontopofeachother' value='plaatsonderelkaar'/>
<cd:command name='placepagenumber' value='plaatspaginanummer'/>
+ <cd:command name='placerawlist' value='plaatsruwelijst'/>
<cd:command name='placereferencelist' value='plaatsreferentielijst'/>
<cd:command name='placeregister' value='plaatsregister'/>
<cd:command name='placerule' value='plaatslijn'/>
@@ -1614,7 +1621,6 @@
<cd:command name='setupregister' value='stelregisterin'/>
<cd:command name='setuprotate' value='stelroterenin'/>
<cd:command name='setuprule' value='stellijnin'/>
- <cd:command name='setups' value='instellingen'/>
<cd:command name='setupscreens' value='stelrastersin'/>
<cd:command name='setupsection' value='stelsectiein'/>
<cd:command name='setupsectionblock' value='stelsectieblokin'/>
@@ -1632,6 +1638,7 @@
<cd:command name='setuptables' value='steltabellenin'/>
<cd:command name='setuptabulate' value='steltabulatiein'/>
<cd:command name='setuptext' value='steltekstin'/>
+ <cd:command name='setuptextbackground' value='steltekstachtergrondin'/>
<cd:command name='setuptextposition' value='steltekstpositiein'/>
<cd:command name='setuptextrules' value='steltekstlijnenin'/>
<cd:command name='setuptexttexts' value='stelteksttekstenin'/>
@@ -1678,6 +1685,7 @@
<cd:command name='startdocument' value='startdocument'/>
<cd:command name='startenvironment' value='startomgeving'/>
<cd:command name='startfigure' value='startfiguur'/>
+ <cd:command name='startframed' value='startomlijnd'/>
<cd:command name='startglobal' value='startglobaal'/>
<cd:command name='startline' value='startregel'/>
<cd:command name='startlinecorrection' value='startregelcorrectie'/>
@@ -1704,6 +1712,7 @@
<cd:command name='starttable' value='starttabel'/>
<cd:command name='starttables' value='starttabellen'/>
<cd:command name='starttext' value='starttekst'/>
+ <cd:command name='starttextbackground' value='starttekstachtergrond'/>
<cd:command name='starttextrule' value='starttekstlijn'/>
<cd:command name='startunpacked' value='startvanelkaar'/>
<cd:command name='startversion' value='startversie'/>
@@ -1718,6 +1727,7 @@
<cd:command name='stopcomponent' value='stoponderdeel'/>
<cd:command name='stopdocument' value='stopdocument'/>
<cd:command name='stopenvironment' value='stopomgeving'/>
+ <cd:command name='stopframed' value='stopomlijnd'/>
<cd:command name='stopglobal' value='stopglobaal'/>
<cd:command name='stopline' value='stopregel'/>
<cd:command name='stoplinecorrection' value='stopregelcorrectie'/>
@@ -1743,6 +1753,7 @@
<cd:command name='stoptable' value='stoptabel'/>
<cd:command name='stoptables' value='stoptabellen'/>
<cd:command name='stoptext' value='stoptekst'/>
+ <cd:command name='stoptextbackground' value='stoptekstachtergrond'/>
<cd:command name='stoptextrule' value='stoptekstlijn'/>
<cd:command name='stopunpacked' value='stopvanelkaar'/>
<cd:command name='stopversion' value='stopversie'/>
diff --git a/Master/texmf-dist/tex/context/interface/keys-pe.xml b/Master/texmf-dist/tex/context/interface/keys-pe.xml
index 517c41ed0d8..a55ad78ce1f 100644
--- a/Master/texmf-dist/tex/context/interface/keys-pe.xml
+++ b/Master/texmf-dist/tex/context/interface/keys-pe.xml
@@ -183,6 +183,7 @@
<cd:variable name='flushleft' value='پمپ‌چپ'/>
<cd:variable name='flushouter' value='پمپ‌خارجی'/>
<cd:variable name='flushright' value='پمپ‌راست'/>
+ <cd:variable name='followingpage' value='followingpage'/>
<cd:variable name='footer' value='ته‌برگ'/>
<cd:variable name='footnote' value='پانوشت'/>
<cd:variable name='force' value='اجبار'/>
@@ -304,6 +305,7 @@
<cd:variable name='mirrored' value='منعکس'/>
<cd:variable name='monday' value='دوشنبه'/>
<cd:variable name='mono' value='مونو'/>
+ <cd:variable name='monobold' value='monobold'/>
<cd:variable name='month' value='ماه'/>
<cd:variable name='more' value='more'/>
<cd:variable name='morehyphenation' value='شکست‌کلمات‌بیشتر'/>
@@ -363,6 +365,7 @@
<cd:variable name='positive' value='مثبت'/>
<cd:variable name='postponing' value='تاخیر'/>
<cd:variable name='postscript' value='پست‌اسکریپت'/>
+ <cd:variable name='precedingpage' value='followingpage'/>
<cd:variable name='preference' value='ترجیح'/>
<cd:variable name='preview' value='پیش‌دید'/>
<cd:variable name='previous' value='قبلی'/>
@@ -422,7 +425,7 @@
<cd:variable name='september' value='سپتامبر'/>
<cd:variable name='serif' value='سریف'/>
<cd:variable name='serried' value='تنگ‌هم'/>
- <cd:variable name='setups' value='بارگذاریها'/>
+ <cd:variable name='setups' value='setups'/>
<cd:variable name='sheet' value='ورقه'/>
<cd:variable name='short' value='short'/>
<cd:variable name='simplefonts' value='simplefonts'/>
@@ -657,7 +660,7 @@
<cd:constant name='coupling' value='تزویج'/>
<cd:constant name='couplingway' value='روش‌تزویج'/>
<cd:constant name='criterium' value='criterium'/>
- <cd:constant name='css' value='css'/>
+ <cd:constant name='cssfile' value='cssfile'/>
<cd:constant name='current' value='جاری'/>
<cd:constant name='cutspace' value='فضای‌برش'/>
<cd:constant name='dash' value='دش'/>
@@ -692,7 +695,7 @@
<cd:constant name='equalwidth' value='عرض‌یکسان'/>
<cd:constant name='escape' value='فرار'/>
<cd:constant name='evenmargin' value='حاشیه‌زوج'/>
- <cd:constant name='exitoffset' value='labeloffset'/>
+ <cd:constant name='exitoffset' value='exitoffset'/>
<cd:constant name='expansion' value='گسترش'/>
<cd:constant name='export' value='export'/>
<cd:constant name='extras' value='extras'/>
@@ -759,6 +762,7 @@
<cd:constant name='indenting' value='تورفتگی'/>
<cd:constant name='indentnext' value='متن‌تورفته'/>
<cd:constant name='indicator' value='اندیکاتور'/>
+ <cd:constant name='initialsep' value='initialsep'/>
<cd:constant name='inner' value='داخلی'/>
<cd:constant name='innermargin' value='حاشیه‌داخلی'/>
<cd:constant name='inputfile' value='پرونده‌ورودی'/>
@@ -864,6 +868,7 @@
<cd:constant name='nright' value='nright'/>
<cd:constant name='ntop' value='ntop'/>
<cd:constant name='number' value='شماره'/>
+ <cd:constant name='numberalign' value='numberalign'/>
<cd:constant name='numbercolor' value='رنگ‌شماره'/>
<cd:constant name='numbercommand' value='فرمان‌شماره'/>
<cd:constant name='numberconversion' value='numberconversion'/>
@@ -1008,7 +1013,7 @@
<cd:constant name='separatorcolor' value='separatorcolor'/>
<cd:constant name='separatorstyle' value='separatorstyle'/>
<cd:constant name='set' value='قراربده'/>
- <cd:constant name='setups' value='بارگذاریها'/>
+ <cd:constant name='setups' value='setups'/>
<cd:constant name='shrink' value='shrink'/>
<cd:constant name='side' value='کنار'/>
<cd:constant name='sidealign' value='تنظیم‌کنار'/>
@@ -1293,6 +1298,7 @@
<cd:command name='definetabletemplate' value='تعریف‌الگوی‌جدول'/>
<cd:command name='definetabulate' value='تعریف‌جدول‌بندی'/>
<cd:command name='definetext' value='تعریف‌متن'/>
+ <cd:command name='definetextbackground' value='definetextbackground'/>
<cd:command name='definetextposition' value='تعریف‌مکان‌متن'/>
<cd:command name='definetextvariable' value='تعریف‌متغیرمتن'/>
<cd:command name='definetype' value='تعریف‌تایپ'/>
@@ -1453,7 +1459,6 @@
<cd:command name='paperheight' value='ارتفاع‌برگ'/>
<cd:command name='paperwidth' value='عرض‌برگ'/>
<cd:command name='periods' value='نقطه‌ها'/>
- <cd:command name='plaatsruwelijst' value='درج‌لیست‌خام'/>
<cd:command name='placebookmarks' value='درج‌چوب‌خط'/>
<cd:command name='placecombinedlist' value='درج‌لیست‌مختلط'/>
<cd:command name='placefloat' value='درج‌شناور'/>
@@ -1463,11 +1468,13 @@
<cd:command name='placeheadtext' value='درج‌متن‌سر'/>
<cd:command name='placelegend' value='درج‌راهنما'/>
<cd:command name='placelist' value='درج‌لیست'/>
+ <cd:command name='placelistofsynonyms' value='placelistofsynonyms'/>
<cd:command name='placelocalfootnotes' value='درج‌پانوشتهای‌موضعی'/>
<cd:command name='placelogos' value='درج‌آرمها'/>
<cd:command name='placeongrid' value='درج‌در‌توری'/>
<cd:command name='placeontopofeachother' value='درج‌در‌بالای‌یکدیگر'/>
<cd:command name='placepagenumber' value='درج‌شماره‌صفحه'/>
+ <cd:command name='placerawlist' value='درج‌لیست‌خام'/>
<cd:command name='placereferencelist' value='درج‌لیست‌مرجع'/>
<cd:command name='placeregister' value='درج‌ثبت'/>
<cd:command name='placerule' value='درج‌خط'/>
@@ -1614,7 +1621,6 @@
<cd:command name='setupregister' value='بارگذاری‌ثبت'/>
<cd:command name='setuprotate' value='بارگذاری‌دوران'/>
<cd:command name='setuprule' value='بارگذاری‌خط'/>
- <cd:command name='setups' value='بارگذاریها'/>
<cd:command name='setupscreens' value='بارگذاری‌پرده‌ها'/>
<cd:command name='setupsection' value='بارگذاری‌بخش'/>
<cd:command name='setupsectionblock' value='بارگذاری‌بلوک‌بخش'/>
@@ -1632,6 +1638,7 @@
<cd:command name='setuptables' value='بارگذاری‌جدولها'/>
<cd:command name='setuptabulate' value='بارگذاری‌جدول‌بندی'/>
<cd:command name='setuptext' value='بارگذاری‌متن'/>
+ <cd:command name='setuptextbackground' value='setuptextbackground'/>
<cd:command name='setuptextposition' value='بارگذاری‌مکان‌متن'/>
<cd:command name='setuptextrules' value='بارگذاری‌خطهای‌متن'/>
<cd:command name='setuptexttexts' value='بارگذاری‌متن‌متنها'/>
@@ -1678,6 +1685,7 @@
<cd:command name='startdocument' value='شروع‌نوشتار'/>
<cd:command name='startenvironment' value='شروع‌محیط'/>
<cd:command name='startfigure' value='شروع‌شکل'/>
+ <cd:command name='startframed' value='startframed'/>
<cd:command name='startglobal' value='شروع‌سراسری'/>
<cd:command name='startline' value='شروع‌خط'/>
<cd:command name='startlinecorrection' value='شروع‌تصحیح‌خط'/>
@@ -1704,6 +1712,7 @@
<cd:command name='starttable' value='شروع‌جدول'/>
<cd:command name='starttables' value='شروع‌جدولها'/>
<cd:command name='starttext' value='شروع‌متن'/>
+ <cd:command name='starttextbackground' value='starttextbackground'/>
<cd:command name='starttextrule' value='شروع‌خط‌متن'/>
<cd:command name='startunpacked' value='شروع‌غیر‌فشرده'/>
<cd:command name='startversion' value='شروع‌نسخه'/>
@@ -1718,6 +1727,7 @@
<cd:command name='stopcomponent' value='پایان‌مولفه'/>
<cd:command name='stopdocument' value='پایان‌نوشتار'/>
<cd:command name='stopenvironment' value='پایان‌محیط'/>
+ <cd:command name='stopframed' value='stopframed'/>
<cd:command name='stopglobal' value='پایان‌سراسری'/>
<cd:command name='stopline' value='پایان‌خط'/>
<cd:command name='stoplinecorrection' value='پایان‌تصحیح‌خط'/>
@@ -1743,6 +1753,7 @@
<cd:command name='stoptable' value='پایان‌جدول'/>
<cd:command name='stoptables' value='پایان‌جدولها'/>
<cd:command name='stoptext' value='پایان‌متن'/>
+ <cd:command name='stoptextbackground' value='stoptextbackground'/>
<cd:command name='stoptextrule' value='پایان‌خط‌متن'/>
<cd:command name='stopunpacked' value='پایان‌غیرفشرده'/>
<cd:command name='stopversion' value='پایان‌نسخه'/>
diff --git a/Master/texmf-dist/tex/context/interface/keys-ro.xml b/Master/texmf-dist/tex/context/interface/keys-ro.xml
index b7f5b2e1904..951a5e8c9c2 100644
--- a/Master/texmf-dist/tex/context/interface/keys-ro.xml
+++ b/Master/texmf-dist/tex/context/interface/keys-ro.xml
@@ -183,6 +183,7 @@
<cd:variable name='flushleft' value='flushleft'/>
<cd:variable name='flushouter' value='flushouter'/>
<cd:variable name='flushright' value='flushright'/>
+ <cd:variable name='followingpage' value='followingpage'/>
<cd:variable name='footer' value='subsol'/>
<cd:variable name='footnote' value='notasubsol'/>
<cd:variable name='force' value='fortat'/>
@@ -304,6 +305,7 @@
<cd:variable name='mirrored' value='oglindit'/>
<cd:variable name='monday' value='luni'/>
<cd:variable name='mono' value='mono'/>
+ <cd:variable name='monobold' value='monoaldin'/>
<cd:variable name='month' value='luna'/>
<cd:variable name='more' value='more'/>
<cd:variable name='morehyphenation' value='morehyphenation'/>
@@ -363,6 +365,7 @@
<cd:variable name='positive' value='positiv'/>
<cd:variable name='postponing' value='postponing'/>
<cd:variable name='postscript' value='postscript'/>
+ <cd:variable name='precedingpage' value='followingpage'/>
<cd:variable name='preference' value='preferinta'/>
<cd:variable name='preview' value='previzualizare'/>
<cd:variable name='previous' value='precedent'/>
@@ -422,7 +425,7 @@
<cd:variable name='september' value='septembrie'/>
<cd:variable name='serif' value='serif'/>
<cd:variable name='serried' value='serried'/>
- <cd:variable name='setups' value='setari'/>
+ <cd:variable name='setups' value='setups'/>
<cd:variable name='sheet' value='sheet'/>
<cd:variable name='short' value='short'/>
<cd:variable name='simplefonts' value='simplefonts'/>
@@ -657,7 +660,7 @@
<cd:constant name='coupling' value='cuplare'/>
<cd:constant name='couplingway' value='modcuplare'/>
<cd:constant name='criterium' value='criteriu'/>
- <cd:constant name='css' value='css'/>
+ <cd:constant name='cssfile' value='cssfile'/>
<cd:constant name='current' value='curent'/>
<cd:constant name='cutspace' value='cutspace'/>
<cd:constant name='dash' value='dash'/>
@@ -692,7 +695,7 @@
<cd:constant name='equalwidth' value='equalwidth'/>
<cd:constant name='escape' value='escape'/>
<cd:constant name='evenmargin' value='marginepara'/>
- <cd:constant name='exitoffset' value='labeloffset'/>
+ <cd:constant name='exitoffset' value='exitoffset'/>
<cd:constant name='expansion' value='expansiune'/>
<cd:constant name='export' value='export'/>
<cd:constant name='extras' value='extras'/>
@@ -759,6 +762,7 @@
<cd:constant name='indenting' value='aliniat'/>
<cd:constant name='indentnext' value='aliniaturmator'/>
<cd:constant name='indicator' value='indicator'/>
+ <cd:constant name='initialsep' value='initialsep'/>
<cd:constant name='inner' value='intern'/>
<cd:constant name='innermargin' value='innermargin'/>
<cd:constant name='inputfile' value='inputfile'/>
@@ -864,6 +868,7 @@
<cd:constant name='nright' value='ndreapta'/>
<cd:constant name='ntop' value='nsus'/>
<cd:constant name='number' value='numar'/>
+ <cd:constant name='numberalign' value='numberalign'/>
<cd:constant name='numbercolor' value='culoarenumar'/>
<cd:constant name='numbercommand' value='comandanumar'/>
<cd:constant name='numberconversion' value='numberconversion'/>
@@ -1293,6 +1298,7 @@
<cd:command name='definetabletemplate' value='definestesablontabel'/>
<cd:command name='definetabulate' value='definestetabulatori'/>
<cd:command name='definetext' value='definestetext'/>
+ <cd:command name='definetextbackground' value='definetextbackground'/>
<cd:command name='definetextposition' value='definestepozitietext'/>
<cd:command name='definetextvariable' value='definestevariabilatext'/>
<cd:command name='definetype' value='definetype'/>
@@ -1453,7 +1459,6 @@
<cd:command name='paperheight' value='inaltimehartie'/>
<cd:command name='paperwidth' value='latimehartie'/>
<cd:command name='periods' value='puncte'/>
- <cd:command name='plaatsruwelijst' value='placerawlist'/>
<cd:command name='placebookmarks' value='plaseazasemnecarte'/>
<cd:command name='placecombinedlist' value='punelistacombinata'/>
<cd:command name='placefloat' value='placefloat'/>
@@ -1463,11 +1468,13 @@
<cd:command name='placeheadtext' value='placeheadtext'/>
<cd:command name='placelegend' value='punelegenda'/>
<cd:command name='placelist' value='punelista'/>
+ <cd:command name='placelistofsynonyms' value='placelistofsynonyms'/>
<cd:command name='placelocalfootnotes' value='punenotesubsollocale'/>
<cd:command name='placelogos' value='punelogouri'/>
<cd:command name='placeongrid' value='plaseazapegrid'/>
<cd:command name='placeontopofeachother' value='punedeasuprafiecareia'/>
<cd:command name='placepagenumber' value='punenumarpagina'/>
+ <cd:command name='placerawlist' value='placerawlist'/>
<cd:command name='placereferencelist' value='placereferencelist'/>
<cd:command name='placeregister' value='puneregistru'/>
<cd:command name='placerule' value='punerigla'/>
@@ -1614,7 +1621,6 @@
<cd:command name='setupregister' value='seteazaregistru'/>
<cd:command name='setuprotate' value='seteazarotare'/>
<cd:command name='setuprule' value='seteazarigla'/>
- <cd:command name='setups' value='setari'/>
<cd:command name='setupscreens' value='seteazaecrane'/>
<cd:command name='setupsection' value='seteazasectiune'/>
<cd:command name='setupsectionblock' value='seteazablocsectiune'/>
@@ -1632,6 +1638,7 @@
<cd:command name='setuptables' value='seteazatabele'/>
<cd:command name='setuptabulate' value='seteazatabulatori'/>
<cd:command name='setuptext' value='seteazatext'/>
+ <cd:command name='setuptextbackground' value='setuptextbackground'/>
<cd:command name='setuptextposition' value='seteazapozitietext'/>
<cd:command name='setuptextrules' value='seteazarigletext'/>
<cd:command name='setuptexttexts' value='seteazatextetext'/>
@@ -1678,6 +1685,7 @@
<cd:command name='startdocument' value='startdocument'/>
<cd:command name='startenvironment' value='startmediu'/>
<cd:command name='startfigure' value='startfigura'/>
+ <cd:command name='startframed' value='startframed'/>
<cd:command name='startglobal' value='startglobal'/>
<cd:command name='startline' value='startlinie'/>
<cd:command name='startlinecorrection' value='startcorectielinie'/>
@@ -1704,6 +1712,7 @@
<cd:command name='starttable' value='starttabel'/>
<cd:command name='starttables' value='starttabele'/>
<cd:command name='starttext' value='starttext'/>
+ <cd:command name='starttextbackground' value='starttextbackground'/>
<cd:command name='starttextrule' value='startriglatext'/>
<cd:command name='startunpacked' value='startneimpachetat'/>
<cd:command name='startversion' value='startversiune'/>
@@ -1718,6 +1727,7 @@
<cd:command name='stopcomponent' value='stopcomponenta'/>
<cd:command name='stopdocument' value='stopdocument'/>
<cd:command name='stopenvironment' value='stopmediu'/>
+ <cd:command name='stopframed' value='stopframed'/>
<cd:command name='stopglobal' value='stopblobal'/>
<cd:command name='stopline' value='stoplinie'/>
<cd:command name='stoplinecorrection' value='stopcorectielinie'/>
@@ -1743,6 +1753,7 @@
<cd:command name='stoptable' value='stoptabel'/>
<cd:command name='stoptables' value='stoptabele'/>
<cd:command name='stoptext' value='stoptext'/>
+ <cd:command name='stoptextbackground' value='stoptextbackground'/>
<cd:command name='stoptextrule' value='stopriglatext'/>
<cd:command name='stopunpacked' value='stopneimpachetat'/>
<cd:command name='stopversion' value='stopversiune'/>
diff --git a/Master/texmf-dist/tex/context/sample/darwin.tex b/Master/texmf-dist/tex/context/sample/darwin.tex
new file mode 100644
index 00000000000..6425bf156cc
--- /dev/null
+++ b/Master/texmf-dist/tex/context/sample/darwin.tex
@@ -0,0 +1,19 @@
+It is interesting to contemplate an entangled bank, clothed with many
+plants of many kinds, with birds singing on the bushes, with various
+insects flitting about, and with worms crawling through the damp earth,
+and to reflect that these elaborately constructed forms, so different
+from each other, and dependent on each other in so complex a manner,
+have all been produced by laws acting around us. These laws, taken in
+the largest sense, being Growth with Reproduction; Inheritance which is
+almost implied by reproduction; Variability from the indirect and
+direct action of the external conditions of life, and from use and
+disuse; a Ratio of Increase so high as to lead to a Struggle for Life,
+and as a consequence to Natural Selection, entailing Divergence of
+Character and the Extinction of less-improved forms. Thus, from the war
+of nature, from famine and death, the most exalted object which we are
+capable of conceiving, namely, the production of the higher animals,
+directly follows. There is grandeur in this view of life, with its
+several powers, having been originally breathed into a few forms or
+into one; and that, whilst this planet has gone cycling on according to
+the fixed law of gravity, from so simple a beginning endless forms most
+beautiful and most wonderful have been, and are being, evolved.
diff --git a/Master/texmf-dist/tex/context/sample/dawkins.tex b/Master/texmf-dist/tex/context/sample/dawkins.tex
index 3490b79b021..c0acd3157ad 100644
--- a/Master/texmf-dist/tex/context/sample/dawkins.tex
+++ b/Master/texmf-dist/tex/context/sample/dawkins.tex
@@ -8,13 +8,13 @@ individual out. \quotation {Let's first establish,} I said,
right half of the lecture hall.} I invited everybody to
stand up while my assistant tossed a coin. Everybody on the
left of the hall was asked to \quote {will} the coin to
-come down head. Everybody on the right had to will it to be
+come down heads. Everybody on the right had to will it to be
tails. Obviously one side had to lose, and they were asked
-to sit down. Then those who remained were divided into two,
+to sit down. Then those that remained were divided into two,
with half \quote {willing} heads and the other half tails.
Again the losers sat down. And so on by successive halvings
until, inevitably, after seven or eight tosses, one
individual was left standing. \quotation {A big round of
applause for our psychic.} He must be psychic, mustn't he,
because he successfully influenced the coin eight times in
-a row? \ No newline at end of file
+a row?
diff --git a/Master/texmf-dist/tex/context/sample/douglas.tex b/Master/texmf-dist/tex/context/sample/douglas.tex
index 7d986d484ab..838c6d24d26 100644
--- a/Master/texmf-dist/tex/context/sample/douglas.tex
+++ b/Master/texmf-dist/tex/context/sample/douglas.tex
@@ -1,18 +1,18 @@
Donald Knuth has spent the past several years working on a
system allowing him to control many aspects of the design
-of his forthcoming books, from the typesetting and layout
+of his forthcoming books|=|from the typesetting and layout
down to the very shapes of the letters! Seldom has an
author had anything remotely like this power to control the
final appearance of his or her work. Knuth's \TEX\
-typesetting system has become well|-|known and available in
+typesetting system has become well|-|known and as available in
many countries around the world. By contrast, his
\METAFONT\ system for designing families of typefaces has
-not become as well known or available.
+not become as well known or as available.
In his article \quotation {The Concept of a Meta|-|Font},
Knuth sets forth for the first time the underlying
philosophy of \METAFONT, as well as some of its products.
-Not only is the concept exiting and clearly well executed,
+Not only is the concept exciting and clearly well executed,
but in my opinion the article is charmingly written as well.
However, despite my overall enthusiasm for Knuth's idea and
article, there are some points in it that I feel might be
diff --git a/Master/texmf-dist/tex/context/sample/sample.tex b/Master/texmf-dist/tex/context/sample/sample.tex
index 5f97ea00964..ef31153a112 100644
--- a/Master/texmf-dist/tex/context/sample/sample.tex
+++ b/Master/texmf-dist/tex/context/sample/sample.tex
@@ -1,75 +1,21 @@
-\starttext
-
-The sample directory contains a few files with quotes that can be used
-while testing styles.
-
-I'll complete this file when I've reorganized my books and audio cd's.
-
-If someone makes a nice bibtex file of these, the quotes can also be
-used in testing bibliographic references and citations.
-
-\starttabulate[|l|l|p|]
-\NC \bf file \NC \bf author \NC \bf source \NC \NR
-\HL
-%NC stork.tex \NC David F. Stork \NC \NC \NR
-\NC knuth.tex \NC Donald E. Knuth \NC \NC \NR
-\NC tufte.tex \NC Edward R. Tufte \NC \NC \NR
-\NC reich.tex \NC Steve Reich \NC \NC \NR
-\NC materie.tex \NC Louis Andriessen \NC De Materie \NC \NR
-\NC douglas.tex \NC Douglas R. Hofstadter \NC \NC \NR
-\NC dawkins.tex \NC Dawkins \NC \NC \NR
-\NC ward.tex \NC Peter D. Ward \NC The Life and Death of Planet Earth \NC \NR
-\NC zapf.tex \NC Hermann Zapf \NC About micro-typography and the hz-program, \endgraf
- Electronic Publishing, vol. 6(3), \endgraf
- 283-288 (September 1993) \NC \NR
-\NC bryson.tex \NC Bill Bryson \NC A Short History of Nearly Everything, \endgraf
- Random House, 2003 \NC \NR
-\NC davis.tex \NC Kenneth C. Davis \NC Don't Know Much About History, \endgraf
- Everything You Need to Know About American
- History but Never Learned, \endgraf
- HarperCollins, 2003 \NC \NR
-\NC thuan.tex \NC Trinh Xuan Thuan \NC Chaos and Harmony, Perspectives on Scientific
- Revolutions of the Twentieth Century, \endgraf
- Oxford University Press, 2001 \NC \NR
-\NC hawking.tex \NC Steve W. Hawking \NC The Universe in a Nutshell, Bantam Books
- Random House, 2001 \NC \NR
-\NC linden.tex \NC Eugene Linden \NC The Winds of Change, Climate, Weather, and the
- Destruction of Civilizations, \endgraf
- Simon \& Schuster, 2006, p.106 \NC \NR
-\NC weisman.tex \NC Alan Weisman \NC The World Without Us, \endgraf
- Thomas Dunne Books, 2007, p.160 \NC \NR
-\NC montgomery.tex \NC David R Montgomery \NC Dirt, The Erosion of Civilizations, \endgraf
- University of California Press, 2007, p.199 \NC \NR
-\NC carrol.tex \NC Sean B. Carrol \NC The Making of the Fittest, \endgraf
- Quercus, London, 2006 \NC \NR
-%NC schwarzenegger.tex \NC Arnold Schwarzenegger \NC Several place on the World Wide Web. \NC \NR
-\stoptabulate
+% this original file has been renamed to samples.tex and describes the
+% short quotes that can be used in test files
-% Tufte: This quote will always produce hyphenated text, apart from the content,
-% it's a pretty good test case for protruding.
-
-% Ward: I should find a quote in the extremely well written Rare Earth as well. All Wards
-% books excell.
-
-% A Short History of Nearly Everything: I wish that I had the memory to remember this book
-% verbatim.
-
-% Chaos and Harmony: very nice and well written book, but the typography is rather bad:
-% quite visible inter-character spacing in a text that can be typeset quite well by \TeX.
+\starttext
-% The Universe in a Nutshell: a beautiful designed book, (companion of A Short History
-% of Time).
+see \type {samples.tex}
-% The World Without Us: A properly typeset, very readable book. Read it and you'll look at
-% the world around you differently (and a bit more freightened).
+\blank
-% Dirt, The Erosion of Civilizations: one of those books that you buy immediately after
-% reading a few sentences. Also one of those books that every politician should read.
+\startluacode
+ context("see \\type {samples.tex}")
+\stopluacode
-% The Making of the Fittest: nice sample for color ans subsentence testing. A very
-% readable book but unfortunately it has inter-character spacing.
+\blank
-% The Schwarzenegger letter was originally typeset at a width equivalent to 16.1cm in
-% a default ConTeXt setup.
+\startMPcode
+ draw textext("see \type {samples.tex}") ;
+ draw boundingbox currentpicture enlarged 2pt ;
+\stopMPcode
\stoptext
diff --git a/Master/texmf-dist/tex/context/sample/samples.bib b/Master/texmf-dist/tex/context/sample/samples.bib
new file mode 100644
index 00000000000..e54092aae83
--- /dev/null
+++ b/Master/texmf-dist/tex/context/sample/samples.bib
@@ -0,0 +1,29 @@
+% The following entries were provided by Rik Kabel:
+
+@book{dawkins2000unweaving,
+ title = {Unweaving the Rainbow: Science, Delusion and the Appetite for Wonder},
+ author = {Dawkins, R.},
+ isbn = {9780547347356},
+ url = {http://books.google.com/books?id=ZudTchiioUoC},
+ year = {2000},
+ publisher = {Houghton Mifflin Harcourt},
+ pages = {145--146},
+}
+
+@book{Hofstadter:1985:MTQ:537101,
+ author = {Hofstadter, Douglas R.},
+ title = {Metamagical Themas: Questing for the Essence of Mind and Pattern},
+ year = {1985},
+ isbn = {0465045405},
+ publisher = {Basic Books, Inc.},
+ address = {New York, NY, USA},
+}
+
+@book{Tufte:1990:EI:78223,
+ author = {Tufte, Edward},
+ title = {Envisioning Information},
+ year = {1990},
+ isbn = {0-9613921-1-8},
+ publisher = {Graphics Press},
+ address = {Cheshire, CT, USA},
+}
diff --git a/Master/texmf-dist/tex/context/sample/samples.tex b/Master/texmf-dist/tex/context/sample/samples.tex
new file mode 100644
index 00000000000..6e217a59251
--- /dev/null
+++ b/Master/texmf-dist/tex/context/sample/samples.tex
@@ -0,0 +1,78 @@
+\starttext
+
+The sample directory contains a few files with quotes that can be used
+while testing styles.
+
+I'll complete this file when I've reorganized my books and audio cd's.
+
+If someone makes a nice bibtex file of these, the quotes can also be
+used in testing bibliographic references and citations.
+
+\starttabulate[|l|l|p|]
+\NC \bf file \NC \bf author \NC \bf source \NC \NR
+\HL
+%NC stork.tex \NC David F. Stork \NC \NC \NR
+\NC knuth.tex \NC Donald E. Knuth \NC \NC \NR
+\NC tufte.tex \NC Edward R. Tufte \NC \NC \NR
+\NC reich.tex \NC Steve Reich \NC City Life (1995) \NC \NR
+\NC materie.tex \NC Louis Andriessen \NC De Materie \NC \NR
+\NC douglas.tex \NC Douglas R. Hofstadter \NC \NC \NR
+\NC dawkins.tex \NC Dawkins \NC \NC \NR
+\NC ward.tex \NC Peter D. Ward \NC The Life and Death of Planet Earth \NC \NR
+\NC zapf.tex \NC Hermann Zapf \NC About micro-typography and the hz-program, \endgraf
+ Electronic Publishing, vol. 6(3), \endgraf
+ 283-288 (September 1993) \NC \NR
+\NC bryson.tex \NC Bill Bryson \NC A Short History of Nearly Everything, \endgraf
+ Random House, 2003 \NC \NR
+\NC davis.tex \NC Kenneth C. Davis \NC Don't Know Much About History, \endgraf
+ Everything You Need to Know About American
+ History but Never Learned, \endgraf
+ HarperCollins, 2003 \NC \NR
+\NC thuan.tex \NC Trinh Xuan Thuan \NC Chaos and Harmony, Perspectives on Scientific
+ Revolutions of the Twentieth Century, \endgraf
+ Oxford University Press, 2001 \NC \NR
+\NC hawking.tex \NC Steve W. Hawking \NC The Universe in a Nutshell, Bantam Books
+ Random House, 2001 \NC \NR
+\NC linden.tex \NC Eugene Linden \NC The Winds of Change, Climate, Weather, and the
+ Destruction of Civilizations, \endgraf
+ Simon \& Schuster, 2006, p.106 \NC \NR
+\NC weisman.tex \NC Alan Weisman \NC The World Without Us, \endgraf
+ Thomas Dunne Books, 2007, p.160 \NC \NR
+\NC montgomery.tex \NC David R Montgomery \NC Dirt, The Erosion of Civilizations, \endgraf
+ University of California Press, 2007, p.199 \NC \NR
+\NC carrol.tex \NC Sean B. Carrol \NC The Making of the Fittest, \endgraf
+ Quercus, London, 2006 \NC \NR
+%NC jojomayer.tex \NC Jojo Mayer \NC Between Zero & One, www.youtube.com/watch?v=mSj298iBjBY \NC \NR
+%NC schwarzenegger.tex \NC Arnold Schwarzenegger \NC Several place on the World Wide Web. \NC \NR
+\stoptabulate
+
+% Tufte: This quote will always produce hyphenated text, apart from the content,
+% it's a pretty good test case for protruding.
+
+% Reich: This is a list of the voice samples from Steve Reich's 1995 composition City Life.
+
+% Ward: I should find a quote in the extremely well written Rare Earth as well. All Wards
+% books excell.
+
+% A Short History of Nearly Everything: I wish that I had the memory to remember this book
+% verbatim.
+
+% Chaos and Harmony: very nice and well written book, but the typography is rather bad:
+% quite visible inter-character spacing in a text that can be typeset quite well by \TeX.
+
+% The Universe in a Nutshell: a beautiful designed book, (companion of A Short History
+% of Time).
+
+% The World Without Us: A properly typeset, very readable book. Read it and you'll look at
+% the world around you differently (and a bit more freightened).
+
+% Dirt, The Erosion of Civilizations: one of those books that you buy immediately after
+% reading a few sentences. Also one of those books that every politician should read.
+
+% The Making of the Fittest: nice sample for color ans subsentence testing. A very
+% readable book but unfortunately it has inter-character spacing.
+
+% The Schwarzenegger letter was originally typeset at a width equivalent to 16.1cm in
+% a default ConTeXt setup.
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/test/pdf-a1b-2005.mkiv b/Master/texmf-dist/tex/context/test/pdf-a1b-2005.mkiv
index f980e314849..bc970c3f9d8 100644
--- a/Master/texmf-dist/tex/context/test/pdf-a1b-2005.mkiv
+++ b/Master/texmf-dist/tex/context/test/pdf-a1b-2005.mkiv
@@ -1,9 +1,9 @@
% PDF/A-1b:2005
-\enabletrackers[structure.tags,backend.tags]
+\enabletrackers[structure.tags,backend.tags,backend.xmp]
\setupbackend
- [format=PDF/A-1a:2005,
+ [format=PDF/A-1b:2005,
intent=sRGB IEC61966-2.1, % use <info> entry here; otherwise problems with predefined default profile
profile=sRGB.icc, % use <filename> here
level=0]
@@ -20,8 +20,6 @@
Text is needed, otherwise tagging base entries are not applied.
-\stopchapter
-
\stoptextcolor
%\startTEXpage
diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-gen.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-gen.lua
index c19a49af39f..c4d6536046a 100644
--- a/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-gen.lua
+++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-gen.lua
@@ -15,8 +15,13 @@ local dummyfunction = function()
end
local dummyreporter = function(c)
- return function(...)
- (texio.reporter or texio.write_nl)(c .. " : " .. string.formatters(...))
+ return function(f,...)
+ local r = texio.reporter or texio.write_nl
+ if f then
+ r(c .. " : " .. string.formatters(f,...))
+ else
+ r("")
+ end
end
end
@@ -351,7 +356,12 @@ end
--
function table.setmetatableindex(t,f)
+ if type(t) ~= "table" then
+ f = f or t
+ t = { }
+ end
setmetatable(t,{ __index = f })
+ return t
end
-- helper for plain:
diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-nod.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-nod.lua
index 373dab5a8c7..1ec2895ba8f 100644
--- a/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-nod.lua
+++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-nod.lua
@@ -45,7 +45,7 @@ attributes.private = attributes.private or function(name)
return number
end
--- Nodes:
+-- Nodes (a subset of context so that we don't get too much unused code):
nodes = { }
nodes.pool = { }
@@ -105,10 +105,8 @@ function nodes.pool.kern(k)
return n
end
--- experimental
-
-local getfield = node.getfield or function(n,tag) return n[tag] end
-local setfield = node.setfield or function(n,tag,value) n[tag] = value end
+local getfield = node.getfield
+local setfield = node.setfield
nodes.getfield = getfield
nodes.setfield = setfield
@@ -116,17 +114,6 @@ nodes.setfield = setfield
nodes.getattr = getfield
nodes.setattr = setfield
-if node.getid then nodes.getid = node.getid else function nodes.getid (n) return getfield(n,"id") end end
-if node.getsubtype then nodes.getsubtype = node.getsubtype else function nodes.getsubtype(n) return getfield(n,"subtype") end end
-if node.getnext then nodes.getnext = node.getnext else function nodes.getnext (n) return getfield(n,"next") end end
-if node.getprev then nodes.getprev = node.getprev else function nodes.getprev (n) return getfield(n,"prev") end end
-if node.getchar then nodes.getchar = node.getchar else function nodes.getchar (n) return getfield(n,"char") end end
-if node.getfont then nodes.getfont = node.getfont else function nodes.getfont (n) return getfield(n,"font") end end
-if node.getlist then nodes.getlist = node.getlist else function nodes.getlist (n) return getfield(n,"list") end end
-
-function nodes.tonut (n) return n end
-function nodes.tonode(n) return n end
-
-- being lazy ... just copy a bunch ... not all needed in generic but we assume
-- nodes to be kind of private anyway
@@ -167,12 +154,95 @@ nodes.unset_attribute = node.unset_attribute
nodes.protect_glyphs = node.protect_glyphs
nodes.unprotect_glyphs = node.unprotect_glyphs
-nodes.kerning = node.kerning
-nodes.ligaturing = node.ligaturing
+-----.kerning = node.kerning
+-----.ligaturing = node.ligaturing
nodes.mlist_to_hlist = node.mlist_to_hlist
-- in generic code, at least for some time, we stay nodes, while in context
-- we can go nuts (e.g. experimental); this split permits us us keep code
-- used elsewhere stable but at the same time play around in context
-nodes.nuts = nodes
+local direct = node.direct
+local nuts = { }
+nodes.nuts = nuts
+
+local tonode = direct.tonode
+local tonut = direct.todirect
+
+nodes.tonode = tonode
+nodes.tonut = tonut
+
+nuts.tonode = tonode
+nuts.tonut = tonut
+
+
+local getfield = direct.getfield
+local setfield = direct.setfield
+
+nuts.getfield = getfield
+nuts.setfield = setfield
+nuts.getnext = direct.getnext
+nuts.getprev = direct.getprev
+nuts.getid = direct.getid
+nuts.getattr = getfield
+nuts.setattr = setfield
+nuts.getfont = direct.getfont
+nuts.getsubtype = direct.getsubtype
+nuts.getchar = direct.getchar
+
+nuts.insert_before = direct.insert_before
+nuts.insert_after = direct.insert_after
+nuts.delete = direct.delete
+nuts.copy = direct.copy
+nuts.copy_list = direct.copy_list
+nuts.tail = direct.tail
+nuts.flush_list = direct.flush_list
+nuts.free = direct.free
+nuts.remove = direct.remove
+nuts.is_node = direct.is_node
+nuts.end_of_math = direct.end_of_math
+nuts.traverse = direct.traverse
+nuts.traverse_id = direct.traverse_id
+
+nuts.getprop = nuts.getattr
+nuts.setprop = nuts.setattr
+
+local new_nut = direct.new
+nuts.new = new_nut
+nuts.pool = { }
+
+function nuts.pool.kern(k)
+ local n = new_nut("kern",1)
+ setfield(n,"kern",k)
+ return n
+end
+
+-- properties as used in the (new) injector:
+
+local propertydata = direct.get_properties_table()
+nodes.properties = { data = propertydata }
+
+direct.set_properties_mode(true,true) -- needed for injection
+
+function direct.set_properties_mode() end -- we really need the set modes
+
+nuts.getprop = function(n,k)
+ local p = propertydata[n]
+ if p then
+ return p[k]
+ end
+end
+
+nuts.setprop = function(n,k,v)
+ if v then
+ local p = propertydata[n]
+ if p then
+ p[k] = v
+ else
+ propertydata[n] = { [k] = v }
+ end
+ end
+end
+
+nodes.setprop = nodes.setproperty
+nodes.getprop = nodes.getproperty
diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-cbk.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-cbk.lua
index 9db94f65e48..ce19c8811e9 100644
--- a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-cbk.lua
+++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-cbk.lua
@@ -18,14 +18,51 @@ local nodes = nodes
local traverse_id = node.traverse_id
local glyph_code = nodes.nodecodes.glyph
+local disc_code = nodes.nodecodes.disc
-function nodes.handlers.characters(head)
+-- from now on we apply ligaturing and kerning here because it might interfere with complex
+-- opentype discretionary handling where the base ligature pass expect some weird extra
+-- pointers (which then confuse the tail slider that has some checking built in)
+
+local ligaturing = node.ligaturing
+local kerning = node.kerning
+
+local basepass = true
+
+local function l_warning() texio.write_nl("warning: node.ligaturing called directly") l_warning = nil end
+local function k_warning() texio.write_nl("warning: node.kerning called directly") k_warning = nil end
+
+function node.ligaturing(...)
+ if basepass and l_warning then
+ l_warning()
+ end
+ return ligaturing(...)
+end
+
+function node.kerning(...)
+ if basepass and k_warning then
+ k_warning()
+ end
+ return kerning(...)
+end
+
+function nodes.handlers.setbasepass(v)
+ basepass = v
+end
+
+function nodes.handlers.nodepass(head)
local fontdata = fonts.hashes.identifiers
if fontdata then
- local usedfonts, done, prevfont = { }, false, nil
+ local usedfonts = { }
+ local basefonts = { }
+ local prevfont = nil
+ local basefont = nil
for n in traverse_id(glyph_code,head) do
local font = n.font
if font ~= prevfont then
+ if basefont then
+ basefont[2] = n.prev
+ end
prevfont = font
local used = usedfonts[font]
if not used then
@@ -36,18 +73,57 @@ function nodes.handlers.characters(head)
local processors = shared.processes
if processors and #processors > 0 then
usedfonts[font] = processors
- done = true
+ elseif basepass then
+ basefont = { n, nil }
+ basefonts[#basefonts+1] = basefont
+ end
+ end
+ end
+ end
+ end
+ end
+ for d in traverse_id(disc_code,head) do
+ local r = d.replace
+ if r then
+ for n in traverse_id(glyph_code,r) do
+ local font = n.font
+ if font ~= prevfont then
+ prevfont = font
+ local used = usedfonts[font]
+ if not used then
+ local tfmdata = fontdata[font] --
+ if tfmdata then
+ local shared = tfmdata.shared -- we need to check shared, only when same features
+ if shared then
+ local processors = shared.processes
+ if processors and #processors > 0 then
+ usedfonts[font] = processors
+ end
+ end
end
end
end
end
end
end
- if done then
+ if next(usedfonts) then
for font, processors in next, usedfonts do
for i=1,#processors do
- local h, d = processors[i](head,font,0)
- head, done = h or head, done or d
+ head = processors[i](head,font,0) or head
+ end
+ end
+ end
+ if basepass and #basefonts > 0 then
+ for i=1,#basefonts do
+ local range = basefonts[i]
+ local start = range[1]
+ local stop = range[2]
+ if stop then
+ start, stop = ligaturing(start,stop)
+ start, stop = kerning(start,stop)
+ elseif start then
+ start = ligaturing(start)
+ start = kerning(start)
end
end
end
@@ -57,12 +133,27 @@ function nodes.handlers.characters(head)
end
end
+function nodes.handlers.basepass(head)
+ if not basepass then
+ head = ligaturing(head)
+ head = kerning(head)
+ end
+ return head, true
+end
+
+local nodepass = nodes.handlers.nodepass
+local basepass = nodes.handlers.basepass
+local injectpass = nodes.injections.handler
+local protectpass = nodes.handlers.protectglyphs
+
function nodes.simple_font_handler(head)
--- lang.hyphenate(head)
- head = nodes.handlers.characters(head)
- nodes.injections.handler(head)
- nodes.handlers.protectglyphs(head)
- head = node.ligaturing(head)
- head = node.kerning(head)
- return head
+ if head then
+ head = nodepass(head)
+ head = injectpass(head)
+ head = basepass(head)
+ protectpass(head)
+ return head, true
+ else
+ return head, false
+ end
end
diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-inj.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-inj.lua
index 5e6c0707092..cb9ed891cfc 100644
--- a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-inj.lua
+++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-inj.lua
@@ -1,22 +1,24 @@
-if not modules then modules = { } end modules ['node-inj'] = {
+if not modules then modules = { } end modules ['font-inj'] = {
version = 1.001,
- comment = "companion to node-ini.mkiv",
+ comment = "companion to font-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files",
}
--- This is very experimental (this will change when we have luatex > .50 and
--- a few pending thingies are available. Also, Idris needs to make a few more
--- test fonts. Btw, future versions of luatex will have extended glyph properties
--- that can be of help. Some optimizations can go away when we have faster machines.
+-- This property based variant is not faster but looks nicer than the attribute one. We
+-- need to use rawget (which is apbout 4 times slower than a direct access but we cannot
+-- get/set that one for our purpose!
-local next = next
+if not nodes.properties then return end
+
+local next, rawget = next, rawget
local utfchar = utf.char
+local fastcopy = table.fastcopy
-local trace_injections = false trackers.register("nodes.injections", function(v) trace_injections = v end)
+local trace_injections = false trackers.register("fonts.injections", function(v) trace_injections = v end)
-local report_injections = logs.reporter("nodes","injections")
+local report_injections = logs.reporter("fonts","injections")
local attributes, nodes, node = attributes, nodes, node
@@ -28,496 +30,1023 @@ local injections = nodes.injections
local nodecodes = nodes.nodecodes
local glyph_code = nodecodes.glyph
+local disc_code = nodecodes.disc
local kern_code = nodecodes.kern
-local nodepool = nodes.pool
+
+local nuts = nodes.nuts
+local nodepool = nuts.pool
+
local newkern = nodepool.kern
-local traverse_id = node.traverse_id
-local insert_node_before = node.insert_before
-local insert_node_after = node.insert_after
+local tonode = nuts.tonode
+local tonut = nuts.tonut
+
+local getfield = nuts.getfield
+local setfield = nuts.setfield
+local getnext = nuts.getnext
+local getprev = nuts.getprev
+local getid = nuts.getid
+local getfont = nuts.getfont
+local getsubtype = nuts.getsubtype
+local getchar = nuts.getchar
-local a_kernpair = attributes.private('kernpair')
-local a_ligacomp = attributes.private('ligacomp')
-local a_markbase = attributes.private('markbase')
-local a_markmark = attributes.private('markmark')
-local a_markdone = attributes.private('markdone')
-local a_cursbase = attributes.private('cursbase')
-local a_curscurs = attributes.private('curscurs')
-local a_cursdone = attributes.private('cursdone')
+local traverse_id = nuts.traverse_id
+local insert_node_before = nuts.insert_before
+local insert_node_after = nuts.insert_after
+local find_tail = nuts.tail
--- This injector has been tested by Idris Samawi Hamid (several arabic fonts as well as
--- the rather demanding Husayni font), Khaled Hosny (latin and arabic) and Kaj Eigner
--- (arabic, hebrew and thai) and myself (whatever font I come across). I'm pretty sure
--- that this code is not 100% okay but examples are needed to figure things out.
+local properties = nodes.properties.data
function injections.installnewkern(nk)
newkern = nk or newkern
end
-local cursives = { }
-local marks = { }
-local kerns = { }
+local nofregisteredkerns = 0
+local nofregisteredpairs = 0
+local nofregisteredmarks = 0
+local nofregisteredcursives = 0
+----- markanchors = { } -- one base can have more marks
+local keepregisteredcounts = false
--- Currently we do gpos/kern in a bit inofficial way but when we have the extra fields in
--- glyphnodes to manipulate ht/dp/wd explicitly I will provide an alternative; also, we
--- can share tables.
+function injections.keepcounts()
+ keepregisteredcounts = true
+end
--- For the moment we pass the r2l key ... volt/arabtype tests .. idris: this needs
--- checking with husayni (volt and fontforge).
+function injections.resetcounts()
+ nofregisteredkerns = 0
+ nofregisteredpairs = 0
+ nofregisteredmarks = 0
+ nofregisteredcursives = 0
+ keepregisteredcounts = false
+end
-function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmnext)
- local dx, dy = factor*(exit[1]-entry[1]), factor*(exit[2]-entry[2])
- local ws, wn = tfmstart.width, tfmnext.width
- local bound = #cursives + 1
- start[a_cursbase] = bound
- nxt[a_curscurs] = bound
- cursives[bound] = { rlmode, dx, dy, ws, wn }
- return dx, dy, bound
+-- We need to make sure that a possible metatable will not kick in
+-- unexpectedly.
+
+function injections.reset(n)
+ local p = rawget(properties,n)
+ if p and rawget(p,"injections") then
+ p.injections = nil
+ end
end
-function injections.setpair(current,factor,rlmode,r2lflag,spec,tfmchr)
- local x, y, w, h = factor*spec[1], factor*spec[2], factor*spec[3], factor*spec[4]
- -- dy = y - h
- if x ~= 0 or w ~= 0 or y ~= 0 or h ~= 0 then
- local bound = current[a_kernpair]
- if bound then
- local kb = kerns[bound]
- -- inefficient but singles have less, but weird anyway, needs checking
- kb[2], kb[3], kb[4], kb[5] = (kb[2] or 0) + x, (kb[3] or 0) + y, (kb[4] or 0)+ w, (kb[5] or 0) + h
+function injections.copy(target,source)
+ local sp = rawget(properties,source)
+ if sp then
+ local tp = rawget(properties,target)
+ local si = rawget(sp,"injections")
+ if si then
+ si = fastcopy(si)
+ if tp then
+ tp.injections = si
+ else
+ propertydata[target] = {
+ injections = si,
+ }
+ end
+ else
+ if tp then
+ tp.injections = nil
+ end
+ end
+ end
+end
+
+function injections.setligaindex(n,index)
+ local p = rawget(properties,n)
+ if p then
+ local i = rawget(p,"injections")
+ if i then
+ i.ligaindex = index
+ else
+ p.injections = {
+ ligaindex = index
+ }
+ end
+ else
+ properties[n] = {
+ injections = {
+ ligaindex = index
+ }
+ }
+ end
+end
+
+function injections.getligaindex(n,default)
+ local p = rawget(properties,n)
+ if p then
+ local i = rawget(p,"injections")
+ if i then
+ return i.ligaindex or default
+ end
+ end
+ return default
+end
+
+function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmnext) -- hm: nuts or nodes
+ local dx = factor*(exit[1]-entry[1])
+ local dy = -factor*(exit[2]-entry[2])
+ local ws, wn = tfmstart.width, tfmnext.width
+ nofregisteredcursives = nofregisteredcursives + 1
+ if rlmode < 0 then
+ dx = -(dx + wn)
+ else
+ dx = dx - ws
+ end
+ --
+ local p = rawget(properties,start)
+ if p then
+ local i = rawget(p,"injections")
+ if i then
+ i.cursiveanchor = true
else
- bound = #kerns + 1
- current[a_kernpair] = bound
- kerns[bound] = { rlmode, x, y, w, h, r2lflag, tfmchr.width }
+ p.injections = {
+ cursiveanchor = true,
+ }
end
- return x, y, w, h, bound
+ else
+ properties[start] = {
+ injections = {
+ cursiveanchor = true,
+ },
+ }
+ end
+ local p = rawget(properties,nxt)
+ if p then
+ local i = rawget(p,"injections")
+ if i then
+ i.cursivex = dx
+ i.cursivey = dy
+ else
+ p.injections = {
+ cursivex = dx,
+ cursivey = dy,
+ }
+ end
+ else
+ properties[nxt] = {
+ injections = {
+ cursivex = dx,
+ cursivey = dy,
+ },
+ }
+ end
+ return dx, dy, nofregisteredcursives
+end
+
+function injections.setpair(current,factor,rlmode,r2lflag,spec,injection) -- r2lflag & tfmchr not used
+ local x, y, w, h = factor*spec[1], factor*spec[2], factor*spec[3], factor*spec[4]
+ if x ~= 0 or w ~= 0 or y ~= 0 or h ~= 0 then -- okay?
+ local yoffset = y - h
+ local leftkern = x -- both kerns are set in a pair kern compared
+ local rightkern = w - x -- to normal kerns where we set only leftkern
+ if leftkern ~= 0 or rightkern ~= 0 or yoffset ~= 0 then
+ nofregisteredpairs = nofregisteredpairs + 1
+ if rlmode and rlmode < 0 then
+ leftkern, rightkern = rightkern, leftkern
+ end
+ local p = rawget(properties,current)
+ if p then
+ local i = rawget(p,"injections")
+ if i then
+ if leftkern ~= 0 then
+ i.leftkern = (i.leftkern or 0) + leftkern
+ end
+ if rightkern ~= 0 then
+ i.rightkern = (i.rightkern or 0) + rightkern
+ end
+ if yoffset ~= 0 then
+ i.yoffset = (i.yoffset or 0) + yoffset
+ end
+ elseif leftkern ~= 0 or rightkern ~= 0 then
+ p.injections = {
+ leftkern = leftkern,
+ rightkern = rightkern,
+ yoffset = yoffset,
+ }
+ else
+ p.injections = {
+ yoffset = yoffset,
+ }
+ end
+ elseif leftkern ~= 0 or rightkern ~= 0 then
+ properties[current] = {
+ injections = {
+ leftkern = leftkern,
+ rightkern = rightkern,
+ yoffset = yoffset,
+ },
+ }
+ else
+ properties[current] = {
+ injections = {
+ yoffset = yoffset,
+ },
+ }
+ end
+ return x, y, w, h, nofregisteredpairs
+ end
end
return x, y, w, h -- no bound
end
-function injections.setkern(current,factor,rlmode,x,tfmchr)
- local dx = factor*x
+-- this needs checking for rl < 0 but it is unlikely that a r2l script
+-- uses kernclasses between glyphs so we're probably safe (KE has a
+-- problematic font where marks interfere with rl < 0 in the previous
+-- case)
+
+function injections.setkern(current,factor,rlmode,x,injection)
+ local dx = factor * x
if dx ~= 0 then
- local bound = #kerns + 1
- current[a_kernpair] = bound
- kerns[bound] = { rlmode, dx }
- return dx, bound
+ nofregisteredkerns = nofregisteredkerns + 1
+ local p = rawget(properties,current)
+ if not injection then
+ injection = "injections"
+ end
+ if p then
+ local i = rawget(p,injection)
+ if i then
+ i.leftkern = dx + (i.leftkern or 0)
+ else
+ p[injection] = {
+ leftkern = dx,
+ }
+ end
+ else
+ properties[current] = {
+ [injection] = {
+ leftkern = dx,
+ },
+ }
+ end
+ return dx, nofregisteredkerns
else
return 0, 0
end
end
-function injections.setmark(start,base,factor,rlmode,ba,ma) -- ba=baseanchor, ma=markanchor
+function injections.setmark(start,base,factor,rlmode,ba,ma,tfmbase) -- ba=baseanchor, ma=markanchor
local dx, dy = factor*(ba[1]-ma[1]), factor*(ba[2]-ma[2])
- local bound = base[a_markbase]
- local index = 1
- if bound then
- local mb = marks[bound]
- if mb then
- -- if not index then index = #mb + 1 end
- index = #mb + 1
- mb[index] = { dx, dy, rlmode }
- start[a_markmark] = bound
- start[a_markdone] = index
- return dx, dy, bound
+ nofregisteredmarks = nofregisteredmarks + 1
+ -- markanchors[nofregisteredmarks] = base
+ if rlmode >= 0 then
+ dx = tfmbase.width - dx -- see later commented ox
+ end
+ local p = rawget(properties,start)
+ if p then
+ local i = rawget(p,"injections")
+ if i then
+ i.markx = dx
+ i.marky = dy
+ i.markdir = rlmode or 0
+ i.markbase = nofregisteredmarks
+ i.markbasenode = base
else
- report_injections("possible problem, %U is base mark without data (id %a)",base.char,bound)
+ p.injections = {
+ markx = dx,
+ marky = dy,
+ markdir = rlmode or 0,
+ markbase = nofregisteredmarks,
+ markbasenode = base,
+ }
end
+ else
+ properties[start] = {
+ injections = {
+ markx = dx,
+ marky = dy,
+ markdir = rlmode or 0,
+ markbase = nofregisteredmarks,
+ markbasenode = base,
+ },
+ }
end
- index = index or 1
- bound = #marks + 1
- base[a_markbase] = bound
- start[a_markmark] = bound
- start[a_markdone] = index
- marks[bound] = { [index] = { dx, dy, rlmode } }
- return dx, dy, bound
+ return dx, dy, nofregisteredmarks
end
local function dir(n)
return (n and n<0 and "r-to-l") or (n and n>0 and "l-to-r") or "unset"
end
-local function trace(head)
- report_injections("begin run")
- for n in traverse_id(glyph_code,head) do
- if n.subtype < 256 then
- local kp = n[a_kernpair]
- local mb = n[a_markbase]
- local mm = n[a_markmark]
- local md = n[a_markdone]
- local cb = n[a_cursbase]
- local cc = n[a_curscurs]
- local char = n.char
- report_injections("font %s, char %U, glyph %c",n.font,char,char)
- if kp then
- local k = kerns[kp]
- if k[3] then
- report_injections(" pairkern: dir %a, x %p, y %p, w %p, h %p",dir(k[1]),k[2],k[3],k[4],k[5])
- else
- report_injections(" kern: dir %a, dx %p",dir(k[1]),k[2])
+local function showchar(n,nested)
+ local char = getchar(n)
+ report_injections("%wfont %s, char %U, glyph %c",nested and 2 or 0,getfont(n),char,char)
+end
+
+local function show(n,what,nested,symbol)
+ if n then
+ local p = rawget(properties,n)
+ if p then
+ local i = rawget(p,what)
+ if i then
+ local leftkern = i.leftkern or 0
+ local rightkern = i.rightkern or 0
+ local yoffset = i.yoffset or 0
+ local markx = i.markx or 0
+ local marky = i.marky or 0
+ local markdir = i.markdir or 0
+ local markbase = i.markbase or 0 -- will be markbasenode
+ local cursivex = i.cursivex or 0
+ local cursivey = i.cursivey or 0
+ local ligaindex = i.ligaindex or 0
+ local margin = nested and 4 or 2
+ --
+ if rightkern ~= 0 or yoffset ~= 0 then
+ report_injections("%w%s pair: lx %p, rx %p, dy %p",margin,symbol,leftkern,rightkern,yoffset)
+ elseif leftkern ~= 0 then
+ report_injections("%w%s kern: dx %p",margin,symbol,leftkern)
end
- end
- if mb then
- report_injections(" markbase: bound %a",mb)
- end
- if mm then
- local m = marks[mm]
- if mb then
- local m = m[mb]
- if m then
- report_injections(" markmark: bound %a, index %a, dx %p, dy %p",mm,md,m[1],m[2])
- else
- report_injections(" markmark: bound %a, missing index",mm)
- end
- else
- m = m[1]
- report_injections(" markmark: bound %a, dx %p, dy %p",mm,m and m[1],m and m[2])
+ if markx ~= 0 or marky ~= 0 or markbase ~= 0 then
+ report_injections("%w%s mark: dx %p, dy %p, dir %s, base %s",margin,symbol,markx,marky,markdir,markbase ~= 0 and "yes" or "no")
end
+ if cursivex ~= 0 or cursivey ~= 0 then
+ report_injections("%w%s curs: dx %p, dy %p",margin,symbol,cursivex,cursivey)
+ end
+ if ligaindex ~= 0 then
+ report_injections("%w%s liga: index %i",margin,symbol,ligaindex)
+ end
+ end
+ end
+ end
+end
+
+local function showsub(n,what,where)
+ report_injections("begin subrun: %s",where)
+ for n in traverse_id(glyph_code,n) do
+ showchar(n,where)
+ show(n,what,where," ")
+ end
+ report_injections("end subrun")
+end
+
+local function trace(head,where)
+ report_injections("begin run %s: %s kerns, %s pairs, %s marks and %s cursives registered",
+ where or "",nofregisteredkerns,nofregisteredpairs,nofregisteredmarks,nofregisteredcursives)
+ local n = head
+ while n do
+ local id = getid(n)
+ if id == glyph_code then
+ showchar(n)
+ show(n,"injections",false," ")
+ show(n,"preinjections",false,"<")
+ show(n,"postinjections",false,">")
+ show(n,"replaceinjections",false,"=")
+ elseif id == disc_code then
+ local pre = getfield(n,"pre")
+ local post = getfield(n,"post")
+ local replace = getfield(n,"replace")
+ if pre then
+ showsub(pre,"preinjections","pre")
end
- if cb then
- report_injections(" cursbase: bound %a",cb)
+ if post then
+ showsub(post,"postinjections","post")
end
- if cc then
- local c = cursives[cc]
- report_injections(" curscurs: bound %a, dir %a, dx %p, dy %p",cc,dir(c[1]),c[2],c[3])
+ if replace then
+ showsub(replace,"replaceinjections","replace")
end
end
+ n = getnext(n)
end
report_injections("end run")
end
--- todo: reuse tables (i.e. no collection), but will be extra fields anyway
--- todo: check for attribute
-
--- We can have a fast test on a font being processed, so we can check faster for marks etc
--- but I'll make a context variant anyway.
-
local function show_result(head)
- local current = head
+ local current = head
local skipping = false
while current do
- local id = current.id
+ local id = getid(current)
if id == glyph_code then
- report_injections("char: %C, width %p, xoffset %p, yoffset %p",current.char,current.width,current.xoffset,current.yoffset)
+ report_injections("char: %C, width %p, xoffset %p, yoffset %p",
+ getchar(current),getfield(current,"width"),getfield(current,"xoffset"),getfield(current,"yoffset"))
skipping = false
elseif id == kern_code then
- report_injections("kern: %p",current.kern)
+ report_injections("kern: %p",getfield(current,"kern"))
skipping = false
elseif not skipping then
report_injections()
skipping = true
end
- current = current.next
+ current = getnext(current)
end
end
-function injections.handler(head,where,keep)
- local has_marks, has_cursives, has_kerns = next(marks), next(cursives), next(kerns)
- if has_marks or has_cursives then
- if trace_injections then
- trace(head)
- end
- -- in the future variant we will not copy items but refs to tables
- local done, ky, rl, valid, cx, wx, mk, nofvalid = false, { }, { }, { }, { }, { }, { }, 0
- if has_kerns then -- move outside loop
- local nf, tm = nil, nil
- for n in traverse_id(glyph_code,head) do -- only needed for relevant fonts
- if n.subtype < 256 then
- nofvalid = nofvalid + 1
- valid[nofvalid] = n
- if n.font ~= nf then
- nf = n.font
- tm = fontdata[nf].resources.marks
+-- we could also check for marks here but maybe not all are registered (needs checking)
+
+local function collect_glyphs_1(head)
+ local glyphs, nofglyphs = { }, 0
+ local marks, nofmarks = { }, 0
+ local nf, tm = nil, nil
+ for n in traverse_id(glyph_code,head) do -- only needed for relevant fonts
+ if getsubtype(n) < 256 then
+ local f = getfont(n)
+ if f ~= nf then
+ nf = f
+ tm = fontdata[nf].resources.marks -- other hash in ctx
+ end
+ if tm and tm[getchar(n)] then
+ nofmarks = nofmarks + 1
+ marks[nofmarks] = n
+ else
+ nofglyphs = nofglyphs + 1
+ glyphs[nofglyphs] = n
+ end
+ -- yoffsets can influence curs steps
+ local p = rawget(properties,n)
+ if p then
+ local i = rawget(p,"injections")
+ if i then
+ local yoffset = i.yoffset
+ if yoffset and yoffset ~= 0 then
+ setfield(n,"yoffset",yoffset)
end
- if tm then
- mk[n] = tm[n.char]
+ end
+ end
+ end
+ end
+ return glyphs, nofglyphs, marks, nofmarks
+end
+
+local function collect_glyphs_2(head)
+ local glyphs, nofglyphs = { }, 0
+ local marks, nofmarks = { }, 0
+ local nf, tm = nil, nil
+ for n in traverse_id(glyph_code,head) do
+ if getsubtype(n) < 256 then
+ local f = getfont(n)
+ if f ~= nf then
+ nf = f
+ tm = fontdata[nf].resources.marks -- other hash in ctx
+ end
+ if tm and tm[getchar(n)] then
+ nofmarks = nofmarks + 1
+ marks[nofmarks] = n
+ else
+ nofglyphs = nofglyphs + 1
+ glyphs[nofglyphs] = n
+ end
+ end
+ end
+ return glyphs, nofglyphs, marks, nofmarks
+end
+
+local function inject_marks(marks,nofmarks)
+ for i=1,nofmarks do
+ local n = marks[i]
+ local pn = rawget(properties,n)
+ if pn then
+ pn = rawget(pn,"injections")
+ if pn then
+ local p = pn.markbasenode
+ if p then
+ local px = getfield(p,"xoffset")
+ local ox = 0
+ local rightkern = nil
+ local pp = rawget(properties,p)
+ if pp then
+ pp = rawget(pp,"injections")
+ if pp then
+ rightkern = pp.rightkern
+ end
end
- local k = n[a_kernpair]
- if k then
- local kk = kerns[k]
- if kk then
- local x, y, w, h = kk[2] or 0, kk[3] or 0, kk[4] or 0, kk[5] or 0
- local dy = y - h
- if dy ~= 0 then
- ky[n] = dy
- end
- if w ~= 0 or x ~= 0 then
- wx[n] = kk
+ if rightkern then -- x and w ~= 0
+ if pn.markdir < 0 then
+ -- kern(w-x) glyph(p) kern(x) mark(n)
+ ox = px - pn.markx - rightkern
+ -- report_injections("r2l case 1: %p",ox)
+ else
+ -- kern(x) glyph(p) kern(w-x) mark(n)
+ -- ox = px - getfield(p,"width") + pn.markx - pp.leftkern
+ local leftkern = pp.leftkern
+ if leftkern then
+ ox = px - pn.markx
+ else
+ ox = px - pn.markx - leftkern
end
- rl[n] = kk[1] -- could move in test
+-- report_injections("l2r case 1: %p",ox)
+ end
+ else
+ -- we need to deal with fonts that have marks with width
+ -- if pn.markdir < 0 then
+ -- ox = px - pn.markx
+ -- -- report_injections("r2l case 3: %p",ox)
+ -- else
+ -- -- ox = px - getfield(p,"width") + pn.markx
+ ox = px - pn.markx
+ -- report_injections("l2r case 3: %p",ox)
+ -- end
+ local wn = getfield(n,"width") -- in arial marks have widths
+ if wn ~= 0 then
+ -- bad: we should center
+ -- insert_node_before(head,n,newkern(-wn/2))
+ -- insert_node_after(head,n,newkern(-wn/2))
+ pn.leftkern = -wn/2
+ pn.rightkern = -wn/2
+ -- wx[n] = { 0, -wn/2, 0, -wn }
end
+ -- so far
end
+ setfield(n,"xoffset",ox)
+ --
+ local py = getfield(p,"yoffset")
+ local oy = 0
+ if marks[p] then
+ oy = py + pn.marky
+ else
+ oy = getfield(n,"yoffset") + py + pn.marky
+ end
+ setfield(n,"yoffset",oy)
+ else
+ -- normally this can't happen (only when in trace mode which is a special case anyway)
+ -- report_injections("missing mark anchor %i",pn.markbase or 0)
end
end
- else
- local nf, tm = nil, nil
- for n in traverse_id(glyph_code,head) do
- if n.subtype < 256 then
- nofvalid = nofvalid + 1
- valid[nofvalid] = n
- if n.font ~= nf then
- nf = n.font
- tm = fontdata[nf].resources.marks
+ end
+ end
+end
+
+local function inject_cursives(glyphs,nofglyphs)
+ local cursiveanchor, lastanchor = nil, nil
+ local minc, maxc, last = 0, 0, nil
+ for i=1,nofglyphs do
+ local n = glyphs[i]
+ local pn = rawget(properties,n)
+ if pn then
+ pn = rawget(pn,"injections")
+ end
+ if pn then
+ local cursivex = pn.cursivex
+ if cursivex then
+ if cursiveanchor then
+ if cursivex ~= 0 then
+ pn.leftkern = (pn.leftkern or 0) + cursivex
end
- if tm then
- mk[n] = tm[n.char]
+ if lastanchor then
+ if maxc == 0 then
+ minc = lastanchor
+ end
+ maxc = lastanchor
+ properties[cursiveanchor].cursivedy = pn.cursivey
end
+ last = n
+ else
+ maxc = 0
+ end
+ elseif maxc > 0 then
+ local ny = getfield(n,"yoffset")
+ for i=maxc,minc,-1 do
+ local ti = glyphs[i]
+ ny = ny + properties[ti].cursivedy
+ setfield(ti,"yoffset",ny) -- why not add ?
end
+ maxc = 0
end
+ if pn.cursiveanchor then
+ cursiveanchor = n
+ lastanchor = i
+ else
+ cursiveanchor = nil
+ lastanchor = nil
+ if maxc > 0 then
+ local ny = getfield(n,"yoffset")
+ for i=maxc,minc,-1 do
+ local ti = glyphs[i]
+ ny = ny + properties[ti].cursivedy
+ setfield(ti,"yoffset",ny) -- why not add ?
+ end
+ maxc = 0
+ end
+ end
+ elseif maxc > 0 then
+ local ny = getfield(n,"yoffset")
+ for i=maxc,minc,-1 do
+ local ti = glyphs[i]
+ ny = ny + properties[ti].cursivedy
+ setfield(ti,"yoffset",getfield(ti,"yoffset") + ny) -- ?
+ end
+ maxc = 0
+ cursiveanchor = nil
+ lastanchor = nil
+ end
+ -- if maxc > 0 and not cursiveanchor then
+ -- local ny = getfield(n,"yoffset")
+ -- for i=maxc,minc,-1 do
+ -- local ti = glyphs[i]
+ -- ny = ny + properties[ti].cursivedy
+ -- setfield(ti,"yoffset",ny) -- why not add ?
+ -- end
+ -- maxc = 0
+ -- end
+ end
+ if last and maxc > 0 then
+ local ny = getfield(last,"yoffset")
+ for i=maxc,minc,-1 do
+ local ti = glyphs[i]
+ ny = ny + properties[ti].cursivedy
+ setfield(ti,"yoffset",ny) -- why not add ?
end
- if nofvalid > 0 then
- -- we can assume done == true because we have cursives and marks
- local cx = { }
- if has_kerns and next(ky) then
- for n, k in next, ky do
- n.yoffset = k
+ end
+end
+
+local function inject_kerns(head,glyphs,nofglyphs)
+ -- todo: pre/post/replace
+ for i=1,#glyphs do
+ local n = glyphs[i]
+ local pn = rawget(properties,n)
+ if pn then
+ local i = rawget(pn,"injections")
+ if i then
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ insert_node_before(head,n,newkern(leftkern)) -- type 0/2
+ end
+ local rightkern = i.rightkern
+ if rightkern and rightkern ~= 0 then
+ insert_node_after(head,n,newkern(rightkern)) -- type 0/2
end
end
- -- todo: reuse t and use maxt
- if has_cursives then
- local p_cursbase, p = nil, nil
- -- since we need valid[n+1] we can also use a "while true do"
- local t, d, maxt = { }, { }, 0
- for i=1,nofvalid do -- valid == glyphs
- local n = valid[i]
- if not mk[n] then
- local n_cursbase = n[a_cursbase]
- if p_cursbase then
- local n_curscurs = n[a_curscurs]
- if p_cursbase == n_curscurs then
- local c = cursives[n_curscurs]
- if c then
- local rlmode, dx, dy, ws, wn = c[1], c[2], c[3], c[4], c[5]
- if rlmode >= 0 then
- dx = dx - ws
- else
- dx = dx + wn
- end
- if dx ~= 0 then
- cx[n] = dx
- rl[n] = rlmode
- end
- -- if rlmode and rlmode < 0 then
- dy = -dy
- -- end
- maxt = maxt + 1
- t[maxt] = p
- d[maxt] = dy
- else
- maxt = 0
+ end
+ end
+end
+
+local function inject_everything(head,where)
+ head = tonut(head)
+ if trace_injections then
+ trace(head,"everything")
+ end
+ local glyphs, nofglyphs, marks, nofmarks
+ if nofregisteredpairs > 0 then
+ glyphs, nofglyphs, marks, nofmarks = collect_glyphs_1(head)
+ else
+ glyphs, nofglyphs, marks, nofmarks = collect_glyphs_2(head)
+ end
+ if nofglyphs > 0 then
+ if nofregisteredcursives > 0 then
+ inject_cursives(glyphs,nofglyphs)
+ end
+ if nofregisteredmarks > 0 then -- and nofmarks > 0
+ inject_marks(marks,nofmarks)
+ end
+ inject_kerns(head,glyphs,nofglyphs)
+ end
+ if keepregisteredcounts then
+ keepregisteredcounts = false
+ else
+ nofregisteredkerns = 0
+ nofregisteredpairs = 0
+ nofregisteredmarks = 0
+ nofregisteredcursives = 0
+ end
+ return tonode(head), true
+end
+
+local function inject_kerns_only(head,where)
+ head = tonut(head)
+ if trace_injections then
+ trace(head,"kerns")
+ end
+ local n = head
+ local p = nil
+ while n do
+ local id = getid(n)
+ if id == glyph_code then
+ if getsubtype(n) < 256 then
+ local pn = rawget(properties,n)
+ if pn then
+ if p then
+ local d = getfield(p,"post")
+ if d then
+ local i = rawget(pn,"postinjections")
+ if i then
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ local t = find_tail(d)
+ insert_node_after(d,t,newkern(leftkern))
end
end
- elseif maxt > 0 then
- local ny = n.yoffset
- for i=maxt,1,-1 do
- ny = ny + d[i]
- local ti = t[i]
- ti.yoffset = ti.yoffset + ny
+ end
+ local d = getfield(p,"replace")
+ if d then
+ local i = rawget(pn,"replaceinjections")
+ if i then
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ local t = find_tail(d)
+ insert_node_after(d,t,newkern(leftkern))
+ end
+ end
+ else
+ local i = rawget(pn,"injections")
+ if i then
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ setfield(p,"replace",newkern(leftkern))
+ end
end
- maxt = 0
end
- if not n_cursbase and maxt > 0 then
- local ny = n.yoffset
- for i=maxt,1,-1 do
- ny = ny + d[i]
- local ti = t[i]
- ti.yoffset = ny
+ else
+ local i = rawget(pn,"injections")
+ if i then
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ head = insert_node_before(head,n,newkern(leftkern))
end
- maxt = 0
end
- p_cursbase, p = n_cursbase, n
end
end
- if maxt > 0 then
- local ny = n.yoffset
- for i=maxt,1,-1 do
- ny = ny + d[i]
- local ti = t[i]
- ti.yoffset = ny
+ else
+ break
+ end
+ p = nil
+ elseif id == disc_code then
+ local d = getfield(n,"pre")
+ if d then
+ local h = d
+ for n in traverse_id(glyph_code,d) do
+ if getsubtype(n) < 256 then
+ local pn = rawget(properties,n)
+ if pn then
+ local i = rawget(pn,"preinjections")
+ if i then
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ h = insert_node_before(h,n,newkern(leftkern))
+ end
+ end
+ end
+ else
+ break
end
- maxt = 0
end
- if not keep then
- cursives = { }
+ if h ~= d then
+ setfield(n,"pre",h)
end
end
- if has_marks then
- for i=1,nofvalid do
- local p = valid[i]
- local p_markbase = p[a_markbase]
- if p_markbase then
- local mrks = marks[p_markbase]
- local nofmarks = #mrks
- for n in traverse_id(glyph_code,p.next) do
- local n_markmark = n[a_markmark]
- if p_markbase == n_markmark then
- local index = n[a_markdone] or 1
- local d = mrks[index]
- if d then
- local rlmode = d[3]
- --
- local k = wx[p]
- if k then
- local x = k[2]
- local w = k[4]
- if w then
- if rlmode and rlmode >= 0 then
- -- kern(x) glyph(p) kern(w-x) mark(n)
- n.xoffset = p.xoffset - p.width + d[1] - (w-x)
- else
- -- kern(w-x) glyph(p) kern(x) mark(n)
- n.xoffset = p.xoffset - d[1] - x
- end
- else
- if rlmode and rlmode >= 0 then
- -- okay for husayni
- n.xoffset = p.xoffset - p.width + d[1]
- else
- -- needs checking: is x ok here?
- n.xoffset = p.xoffset - d[1] - x
- end
- end
- else
- if rlmode and rlmode >= 0 then
- n.xoffset = p.xoffset - p.width + d[1]
- else
- n.xoffset = p.xoffset - d[1]
- end
- local w = n.width
- if w ~= 0 then
- insert_node_before(head,n,newkern(-w/2))
- insert_node_after(head,n,newkern(-w/2))
- end
- end
- -- --
- if mk[p] then
- n.yoffset = p.yoffset + d[2]
- else
- n.yoffset = n.yoffset + p.yoffset + d[2]
- end
- --
- if nofmarks == 1 then
- break
- else
- nofmarks = nofmarks - 1
- end
+ local d = getfield(n,"post")
+ if d then
+ local h = d
+ for n in traverse_id(glyph_code,d) do
+ if getsubtype(n) < 256 then
+ local pn = rawget(properties,n)
+ if pn then
+ local i = rawget(pn,"postinjections")
+ if i then
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ h = insert_node_before(h,n,newkern(leftkern))
+ end
+ end
+ end
+ else
+ break
+ end
+ end
+ if h ~= d then
+ setfield(n,"post",h)
+ end
+ end
+ local d = getfield(n,"replace")
+ if d then
+ local h = d
+ for n in traverse_id(glyph_code,d) do
+ if getsubtype(n) < 256 then
+ local pn = rawget(properties,n) -- why can it be empty { }
+ if pn then
+ local i = rawget(pn,"replaceinjections")
+ if i then
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ h = insert_node_before(h,n,newkern(leftkern))
end
- else
- -- KE: there can be <mark> <mkmk> <mark> sequences in ligatures
end
end
+ else
+ break
end
end
- if not keep then
- marks = { }
+ if h ~= d then
+ setfield(n,"replace",h)
end
end
- -- todo : combine
- if next(wx) then
- for n, k in next, wx do
- -- only w can be nil (kernclasses), can be sped up when w == nil
- local x = k[2]
- local w = k[4]
- if w then
- local rl = k[1] -- r2l = k[6]
- local wx = w - x
- if rl < 0 then -- KE: don't use r2l here
- if wx ~= 0 then
- insert_node_before(head,n,newkern(wx)) -- type 0/2
+ p = n
+ else
+ p = nil
+ end
+ n = getnext(n)
+ end
+ --
+ if keepregisteredcounts then
+ keepregisteredcounts = false
+ else
+ nofregisteredkerns = 0
+ end
+ return tonode(head), true
+end
+
+local function inject_pairs_only(head,where)
+ head = tonut(head)
+ if trace_injections then
+ trace(head,"pairs")
+ end
+ --
+ local n = head
+ local p = nil
+ while n do
+ local id = getid(n)
+ if id == glyph_code then
+ if getsubtype(n) < 256 then
+ local pn = rawget(properties,n)
+ if pn then
+ if p then
+ local d = getfield(p,"post")
+ if d then
+ local i = rawget(pn,"postinjections")
+ if i then
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ local t = find_tail(d)
+ insert_node_after(d,t,newkern(leftkern))
+ end
+ -- local rightkern = i.rightkern
+ -- if rightkern and rightkern ~= 0 then
+ -- insert_node_after(head,n,newkern(rightkern))
+ -- n = getnext(n) -- to be checked
+ -- end
end
- if x ~= 0 then
- insert_node_after (head,n,newkern(x)) -- type 0/2
+ end
+ local d = getfield(p,"replace")
+ if d then
+ local i = rawget(pn,"replaceinjections")
+ if i then
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ local t = find_tail(d)
+ insert_node_after(d,t,newkern(leftkern))
+ end
+ -- local rightkern = i.rightkern
+ -- if rightkern and rightkern ~= 0 then
+ -- insert_node_after(head,n,newkern(rightkern))
+ -- n = getnext(n) -- to be checked
+ -- end
end
else
- if x ~= 0 then
- insert_node_before(head,n,newkern(x)) -- type 0/2
+ local i = rawget(pn,"injections")
+ if i then
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ setfield(p,"replace",newkern(leftkern))
+ end
+ -- local rightkern = i.rightkern
+ -- if rightkern and rightkern ~= 0 then
+ -- insert_node_after(head,n,newkern(rightkern))
+ -- n = getnext(n) -- to be checked
+ -- end
end
- if wx ~= 0 then
- insert_node_after (head,n,newkern(wx)) -- type 0/2
+ end
+ else
+ -- this is the most common case
+ local i = rawget(pn,"injections")
+ if i then
+ local yoffset = i.yoffset
+ if yoffset and yoffset ~= 0 then
+ setfield(n,"yoffset",yoffset)
+ end
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ insert_node_before(head,n,newkern(leftkern))
+ end
+ local rightkern = i.rightkern
+ if rightkern and rightkern ~= 0 then
+ insert_node_after(head,n,newkern(rightkern))
+ n = getnext(n) -- to be checked
end
end
- elseif x ~= 0 then
- -- this needs checking for rl < 0 but it is unlikely that a r2l script
- -- uses kernclasses between glyphs so we're probably safe (KE has a
- -- problematic font where marks interfere with rl < 0 in the previous
- -- case)
- insert_node_before(head,n,newkern(x)) -- a real font kern, type 0
end
end
+ else
+ break
end
- if next(cx) then
- for n, k in next, cx do
- if k ~= 0 then
- local rln = rl[n]
- if rln and rln < 0 then
- insert_node_before(head,n,newkern(-k)) -- type 0/2
- else
- insert_node_before(head,n,newkern(k)) -- type 0/2
+ p = nil
+ elseif id == disc_code then
+ local d = getfield(n,"pre")
+ if d then
+ local h = d
+ for n in traverse_id(glyph_code,d) do
+ if getsubtype(n) < 256 then
+ local p = rawget(properties,n)
+ if p then
+ local i = rawget(p,"preinjections")
+ if i then
+ local yoffset = i.yoffset
+ if yoffset and yoffset ~= 0 then
+ setfield(n,"yoffset",yoffset)
+ end
+ local leftkern = i.leftkern
+ if leftkern ~= 0 then
+ h = insert_node_before(h,n,newkern(leftkern))
+ end
+ local rightkern = i.rightkern
+ if rightkern and rightkern ~= 0 then
+ insert_node_after(head,n,newkern(rightkern))
+ n = getnext(n) -- to be checked
+ end
+ end
end
+ else
+ break
end
end
+ if h ~= d then
+ setfield(n,"pre",h)
+ end
end
- if not keep then
- kerns = { }
- end
- -- if trace_injections then
- -- show_result(head)
- -- end
- return head, true
- elseif not keep then
- kerns, cursives, marks = { }, { }, { }
- end
- elseif has_kerns then
- if trace_injections then
- trace(head)
- end
- for n in traverse_id(glyph_code,head) do
- if n.subtype < 256 then
- local k = n[a_kernpair]
- if k then
- local kk = kerns[k]
- if kk then
- local rl, x, y, w = kk[1], kk[2] or 0, kk[3], kk[4]
- if y and y ~= 0 then
- n.yoffset = y -- todo: h ?
- end
- if w then
- -- copied from above
- -- local r2l = kk[6]
- local wx = w - x
- if rl < 0 then -- KE: don't use r2l here
- if wx ~= 0 then
- insert_node_before(head,n,newkern(wx))
+ local d = getfield(n,"post")
+ if d then
+ local h = d
+ for n in traverse_id(glyph_code,d) do
+ if getsubtype(n) < 256 then
+ local p = rawget(properties,n)
+ if p then
+ local i = rawget(p,"postinjections")
+ if i then
+ local yoffset = i.yoffset
+ if yoffset and yoffset ~= 0 then
+ setfield(n,"yoffset",yoffset)
end
- if x ~= 0 then
- insert_node_after (head,n,newkern(x))
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ h = insert_node_before(h,n,newkern(leftkern))
end
- else
- if x ~= 0 then
- insert_node_before(head,n,newkern(x))
- end
- if wx ~= 0 then
- insert_node_after(head,n,newkern(wx))
+ local rightkern = i.rightkern
+ if rightkern and rightkern ~= 0 then
+ insert_node_after(head,n,newkern(rightkern))
+ n = getnext(n) -- to be checked
end
end
- else
- -- simple (e.g. kernclass kerns)
- if x ~= 0 then
- insert_node_before(head,n,newkern(x))
+ end
+ else
+ break
+ end
+ end
+ if h ~= d then
+ setfield(n,"post",h)
+ end
+ end
+ local d = getfield(n,"replace")
+ if d then
+ local h = d
+ for n in traverse_id(glyph_code,d) do
+ if getsubtype(n) < 256 then
+ local p = rawget(properties,n)
+ if p then
+ local i = rawget(pn,"replaceinjections")
+ if i then
+ local yoffset = i.yoffset
+ if yoffset and yoffset ~= 0 then
+ setfield(n,"yoffset",yoffset)
+ end
+ local leftkern = i.leftkern
+ if leftkern and leftkern ~= 0 then
+ h = insert_node_before(h,n,newkern(leftkern))
+ end
+ local rightkern = i.rightkern
+ if rightkern and rightkern ~= 0 then
+ insert_node_after(head,n,newkern(rightkern))
+ n = getnext(n) -- to be checked
+ end
end
end
+ else
+ break
end
end
+ if h ~= d then
+ setfield(n,"replace",h)
+ end
end
+ p = n
+ else
+ p = nil
end
- if not keep then
- kerns = { }
- end
- -- if trace_injections then
- -- show_result(head)
- -- end
- return head, true
+ n = getnext(n)
+ end
+ --
+ if keepregisteredcounts then
+ keepregisteredcounts = false
+ else
+ nofregisteredpairs = 0
+ nofregisteredkerns = 0
+ end
+ return tonode(head), true
+end
+
+function injections.handler(head,where) -- optimize for n=1 ?
+ if nofregisteredmarks > 0 or nofregisteredcursives > 0 then
+ return inject_everything(head,where)
+ elseif nofregisteredpairs > 0 then
+ return inject_pairs_only(head,where)
+ elseif nofregisteredkerns > 0 then
+ return inject_kerns_only(head,where)
else
- -- no tracing needed
+ return head, false
end
- return head, false
end
diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-merged.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-merged.lua
index a0122fbe937..1d6509ae4e4 100644
--- a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-merged.lua
+++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-merged.lua
@@ -1,6 +1,6 @@
-- merged file : luatex-fonts-merged.lua
-- parent file : luatex-fonts.lua
--- merge date : 05/21/14 22:04:03
+-- merge date : 04/18/15 14:41:50
do -- begin closure to overcome local limits and interference
@@ -85,6 +85,13 @@ end
if lua then
lua.mask=load([[τεχ = 1]]) and "utf" or "ascii"
end
+local flush=io.flush
+if flush then
+ local execute=os.execute if execute then function os.execute(...) flush() return execute(...) end end
+ local exec=os.exec if exec then function os.exec (...) flush() return exec (...) end end
+ local spawn=os.spawn if spawn then function os.spawn (...) flush() return spawn (...) end end
+ local popen=io.popen if popen then function io.popen (...) flush() return popen (...) end end
+end
end -- closure
@@ -149,6 +156,8 @@ patterns.utfbom_16_le=utfbom_16_le
patterns.utfbom_8=utfbom_8
patterns.utf_16_be_nl=P("\000\r\000\n")+P("\000\r")+P("\000\n")
patterns.utf_16_le_nl=P("\r\000\n\000")+P("\r\000")+P("\n\000")
+patterns.utf_32_be_nl=P("\000\000\000\r\000\000\000\n")+P("\000\000\000\r")+P("\000\000\000\n")
+patterns.utf_32_le_nl=P("\r\000\000\000\n\000\000\000")+P("\r\000\000\000")+P("\n\000\000\000")
patterns.utf8one=R("\000\127")
patterns.utf8two=R("\194\223")*utf8next
patterns.utf8three=R("\224\239")*utf8next*utf8next
@@ -178,9 +187,21 @@ patterns.nonwhitespace=nonwhitespace
local stripper=spacer^0*C((spacer^0*nonspacer^1)^0)
local fullstripper=whitespace^0*C((whitespace^0*nonwhitespace^1)^0)
local collapser=Cs(spacer^0/""*nonspacer^0*((spacer^0/" "*nonspacer^1)^0))
+local b_collapser=Cs(whitespace^0/""*(nonwhitespace^1+whitespace^1/" ")^0)
+local e_collapser=Cs((whitespace^1*P(-1)/""+nonwhitespace^1+whitespace^1/" ")^0)
+local m_collapser=Cs((nonwhitespace^1+whitespace^1/" ")^0)
+local b_stripper=Cs(spacer^0/""*(nonspacer^1+spacer^1/" ")^0)
+local e_stripper=Cs((spacer^1*P(-1)/""+nonspacer^1+spacer^1/" ")^0)
+local m_stripper=Cs((nonspacer^1+spacer^1/" ")^0)
patterns.stripper=stripper
patterns.fullstripper=fullstripper
patterns.collapser=collapser
+patterns.b_collapser=b_collapser
+patterns.m_collapser=m_collapser
+patterns.e_collapser=e_collapser
+patterns.b_stripper=b_stripper
+patterns.m_stripper=m_stripper
+patterns.e_stripper=e_stripper
patterns.lowercase=lowercase
patterns.uppercase=uppercase
patterns.letter=patterns.lowercase+patterns.uppercase
@@ -217,9 +238,12 @@ patterns.integer=sign^-1*digit^1
patterns.unsigned=digit^0*period*digit^1
patterns.float=sign^-1*patterns.unsigned
patterns.cunsigned=digit^0*comma*digit^1
+patterns.cpunsigned=digit^0*(period+comma)*digit^1
patterns.cfloat=sign^-1*patterns.cunsigned
+patterns.cpfloat=sign^-1*patterns.cpunsigned
patterns.number=patterns.float+patterns.integer
patterns.cnumber=patterns.cfloat+patterns.integer
+patterns.cpnumber=patterns.cpfloat+patterns.integer
patterns.oct=zero*octdigit^1
patterns.octal=patterns.oct
patterns.HEX=zero*P("X")*(digit+uppercase)^1
@@ -636,23 +660,40 @@ function lpeg.append(list,pp,delayed,checked)
end
return p
end
+local p_false=P(false)
+local p_true=P(true)
local function make(t)
- local p
+ local function making(t)
+ local p=p_false
+ local keys=sortedkeys(t)
+ for i=1,#keys do
+ local k=keys[i]
+ if k~="" then
+ local v=t[k]
+ if v==true then
+ p=p+P(k)*p_true
+ elseif v==false then
+ else
+ p=p+P(k)*making(v)
+ end
+ end
+ end
+ if t[""] then
+ p=p+p_true
+ end
+ return p
+ end
+ local p=p_false
local keys=sortedkeys(t)
for i=1,#keys do
local k=keys[i]
- local v=t[k]
- if not p then
- if next(v) then
- p=P(k)*make(v)
- else
- p=P(k)
- end
- else
- if next(v) then
- p=p+P(k)*make(v)
+ if k~="" then
+ local v=t[k]
+ if v==true then
+ p=p+P(k)*p_true
+ elseif v==false then
else
- p=p+P(k)
+ p=p+P(k)*making(v)
end
end
end
@@ -660,13 +701,73 @@ local function make(t)
end
function lpeg.utfchartabletopattern(list)
local tree={}
- for i=1,#list do
- local t=tree
- for c in gmatch(list[i],".") do
- if not t[c] then
- t[c]={}
+ local n=#list
+ if n==0 then
+ for s in next,list do
+ local t=tree
+ local p,pk
+ for c in gmatch(s,".") do
+ if t==true then
+ t={ [c]=true,[""]=true }
+ p[pk]=t
+ p=t
+ t=false
+ elseif t==false then
+ t={ [c]=false }
+ p[pk]=t
+ p=t
+ t=false
+ else
+ local tc=t[c]
+ if not tc then
+ tc=false
+ t[c]=false
+ end
+ p=t
+ t=tc
+ end
+ pk=c
+ end
+ if t==false then
+ p[pk]=true
+ elseif t==true then
+ else
+ t[""]=true
+ end
+ end
+ else
+ for i=1,n do
+ local s=list[i]
+ local t=tree
+ local p,pk
+ for c in gmatch(s,".") do
+ if t==true then
+ t={ [c]=true,[""]=true }
+ p[pk]=t
+ p=t
+ t=false
+ elseif t==false then
+ t={ [c]=false }
+ p[pk]=t
+ p=t
+ t=false
+ else
+ local tc=t[c]
+ if not tc then
+ tc=false
+ t[c]=false
+ end
+ p=t
+ t=tc
+ end
+ pk=c
+ end
+ if t==false then
+ p[pk]=true
+ elseif t==true then
+ else
+ t[""]=true
end
- t=t[c]
end
end
return make(tree)
@@ -706,6 +807,65 @@ local case_2=period*(digit-trailingzeros)^1*(trailingzeros/"")
local number=digit^1*(case_1+case_2)
local stripper=Cs((number+1)^0)
lpeg.patterns.stripzeros=stripper
+local byte_to_HEX={}
+local byte_to_hex={}
+local byte_to_dec={}
+local hex_to_byte={}
+for i=0,255 do
+ local H=format("%02X",i)
+ local h=format("%02x",i)
+ local d=format("%03i",i)
+ local c=char(i)
+ byte_to_HEX[c]=H
+ byte_to_hex[c]=h
+ byte_to_dec[c]=d
+ hex_to_byte[h]=c
+ hex_to_byte[H]=c
+end
+local hextobyte=P(2)/hex_to_byte
+local bytetoHEX=P(1)/byte_to_HEX
+local bytetohex=P(1)/byte_to_hex
+local bytetodec=P(1)/byte_to_dec
+local hextobytes=Cs(hextobyte^0)
+local bytestoHEX=Cs(bytetoHEX^0)
+local bytestohex=Cs(bytetohex^0)
+local bytestodec=Cs(bytetodec^0)
+patterns.hextobyte=hextobyte
+patterns.bytetoHEX=bytetoHEX
+patterns.bytetohex=bytetohex
+patterns.bytetodec=bytetodec
+patterns.hextobytes=hextobytes
+patterns.bytestoHEX=bytestoHEX
+patterns.bytestohex=bytestohex
+patterns.bytestodec=bytestodec
+function string.toHEX(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(bytestoHEX,s)
+ end
+end
+function string.tohex(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(bytestohex,s)
+ end
+end
+function string.todec(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(bytestodec,s)
+ end
+end
+function string.tobytes(s)
+ if not s or s=="" then
+ return s
+ else
+ return lpegmatch(hextobytes,s)
+ end
+end
end -- closure
@@ -866,11 +1026,12 @@ function table.keys(t)
end
end
local function compare(a,b)
- local ta,tb=type(a),type(b)
- if ta==tb then
+ local ta=type(a)
+ local tb=type(b)
+ if ta==tb and ta=="number" then
return a<b
else
- return tostring(a)<tostring(b)
+ return tostring(a)<tostring(b)
end
end
local function sortedkeys(tab)
@@ -970,14 +1131,14 @@ local function sortedhash(t,cmp)
end
local n=0
local m=#s
- local function kv(s)
+ local function kv()
if n<m then
n=n+1
local k=s[n]
return k,t[k]
end
end
- return kv,s
+ return kv
else
return nothing
end
@@ -1142,7 +1303,7 @@ local function simple_table(t)
if tv=="number" then
nt=nt+1
if hexify then
- tt[nt]=format("0x%04X",v)
+ tt[nt]=format("0x%X",v)
else
tt[nt]=tostring(v)
end
@@ -1173,7 +1334,7 @@ local function do_serialize(root,name,depth,level,indexed)
local tn=type(name)
if tn=="number" then
if hexify then
- handle(format("%s[0x%04X]={",depth,name))
+ handle(format("%s[0x%X]={",depth,name))
else
handle(format("%s[%s]={",depth,name))
end
@@ -1190,7 +1351,7 @@ local function do_serialize(root,name,depth,level,indexed)
end
end
end
- if root and next(root) then
+ if root and next(root)~=nil then
local first,last=nil,0
if compact then
last=#root
@@ -1212,7 +1373,7 @@ local function do_serialize(root,name,depth,level,indexed)
if compact and first and tk=="number" and k>=first and k<=last then
if tv=="number" then
if hexify then
- handle(format("%s 0x%04X,",depth,v))
+ handle(format("%s 0x%X,",depth,v))
else
handle(format("%s %s,",depth,v))
end
@@ -1223,7 +1384,7 @@ local function do_serialize(root,name,depth,level,indexed)
handle(format("%s %q,",depth,v))
end
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
handle(format("%s {},",depth))
elseif inline then
local st=simple_table(v)
@@ -1253,25 +1414,25 @@ local function do_serialize(root,name,depth,level,indexed)
elseif tv=="number" then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=0x%04X,",depth,k,v))
+ handle(format("%s [0x%X]=0x%X,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
elseif tk=="boolean" then
if hexify then
- handle(format("%s [%s]=0x%04X,",depth,k and "true" or "false",v))
+ handle(format("%s [%s]=0x%X,",depth,k and "true" or "false",v))
else
handle(format("%s [%s]=%s,",depth,k and "true" or "false",v))
end
elseif noquotes and not reserved[k] and lpegmatch(propername,k) then
if hexify then
- handle(format("%s %s=0x%04X,",depth,k,v))
+ handle(format("%s %s=0x%X,",depth,k,v))
else
handle(format("%s %s=%s,",depth,k,v))
end
else
if hexify then
- handle(format("%s [%q]=0x%04X,",depth,k,v))
+ handle(format("%s [%q]=0x%X,",depth,k,v))
else
handle(format("%s [%q]=%s,",depth,k,v))
end
@@ -1280,7 +1441,7 @@ local function do_serialize(root,name,depth,level,indexed)
if reduce and tonumber(v) then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%s,",depth,k,v))
+ handle(format("%s [0x%X]=%s,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
@@ -1294,7 +1455,7 @@ local function do_serialize(root,name,depth,level,indexed)
else
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%q,",depth,k,v))
+ handle(format("%s [0x%X]=%q,",depth,k,v))
else
handle(format("%s [%s]=%q,",depth,k,v))
end
@@ -1307,10 +1468,10 @@ local function do_serialize(root,name,depth,level,indexed)
end
end
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]={},",depth,k))
+ handle(format("%s [0x%X]={},",depth,k))
else
handle(format("%s [%s]={},",depth,k))
end
@@ -1326,7 +1487,7 @@ local function do_serialize(root,name,depth,level,indexed)
if st then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]={ %s },",depth,k,concat(st,", ")))
+ handle(format("%s [0x%X]={ %s },",depth,k,concat(st,", ")))
else
handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
end
@@ -1346,7 +1507,7 @@ local function do_serialize(root,name,depth,level,indexed)
elseif tv=="boolean" then
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%s,",depth,k,v and "true" or "false"))
+ handle(format("%s [0x%X]=%s,",depth,k,v and "true" or "false"))
else
handle(format("%s [%s]=%s,",depth,k,v and "true" or "false"))
end
@@ -1362,7 +1523,7 @@ local function do_serialize(root,name,depth,level,indexed)
local f=getinfo(v).what=="C" and dump(dummy) or dump(v)
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=load(%q),",depth,k,f))
+ handle(format("%s [0x%X]=load(%q),",depth,k,f))
else
handle(format("%s [%s]=load(%q),",depth,k,f))
end
@@ -1377,7 +1538,7 @@ local function do_serialize(root,name,depth,level,indexed)
else
if tk=="number" then
if hexify then
- handle(format("%s [0x%04X]=%q,",depth,k,tostring(v)))
+ handle(format("%s [0x%X]=%q,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%q,",depth,k,tostring(v)))
end
@@ -1431,7 +1592,7 @@ local function serialize(_handle,root,name,specification)
end
elseif tname=="number" then
if hexify then
- handle(format("[0x%04X]={",name))
+ handle(format("[0x%X]={",name))
else
handle("["..name.."]={")
end
@@ -1449,7 +1610,7 @@ local function serialize(_handle,root,name,specification)
local dummy=root._w_h_a_t_e_v_e_r_
root._w_h_a_t_e_v_e_r_=nil
end
- if next(root) then
+ if next(root)~=nil then
do_serialize(root,name,"",0)
end
end
@@ -1578,14 +1739,25 @@ local function identical(a,b)
end
table.identical=identical
table.are_equal=are_equal
-function table.compact(t)
- if t then
- for k,v in next,t do
- if not next(v) then
- t[k]=nil
+local function sparse(old,nest,keeptables)
+ local new={}
+ for k,v in next,old do
+ if not (v=="" or v==false) then
+ if nest and type(v)=="table" then
+ v=sparse(v,nest)
+ if keeptables or next(v)~=nil then
+ new[k]=v
+ end
+ else
+ new[k]=v
end
end
end
+ return new
+end
+table.sparse=sparse
+function table.compact(t)
+ return sparse(t,true,true)
end
function table.contains(t,v)
if t then
@@ -1690,10 +1862,10 @@ function table.sub(t,i,j)
return { unpack(t,i,j) }
end
function table.is_empty(t)
- return not t or not next(t)
+ return not t or next(t)==nil
end
function table.has_one_entry(t)
- return t and not next(t,next(t))
+ return t and next(t,next(t))==nil
end
function table.loweredkeys(t)
local l={}
@@ -1738,6 +1910,44 @@ function table.values(t,s)
return {}
end
end
+function table.filtered(t,pattern,sort,cmp)
+ if t and type(pattern)=="string" then
+ if sort then
+ local s
+ if cmp then
+ s=sortedhashkeys(t,function(a,b) return cmp(t,a,b) end)
+ else
+ s=sortedkeys(t)
+ end
+ local n=0
+ local m=#s
+ local function kv(s)
+ while n<m do
+ n=n+1
+ local k=s[n]
+ if find(k,pattern) then
+ return k,t[k]
+ end
+ end
+ end
+ return kv,s
+ else
+ local n=next(t)
+ local function iterator()
+ while n~=nil do
+ local k=n
+ n=next(t,k)
+ if find(k,pattern) then
+ return k,t[k]
+ end
+ end
+ end
+ return iterator,t
+ end
+ else
+ return nothing
+ end
+end
end -- closure
@@ -2048,8 +2258,6 @@ function io.readstring(f,n,m)
local str=gsub(f:read(n),"\000","")
return str
end
-if not io.i_limiter then function io.i_limiter() end end
-if not io.o_limiter then function io.o_limiter() end end
end -- closure
@@ -2067,41 +2275,28 @@ local file=file
if not lfs then
lfs=optionalrequire("lfs")
end
-if not lfs then
- lfs={
- getcurrentdir=function()
- return "."
- end,
- attributes=function()
- return nil
- end,
- isfile=function(name)
- local f=io.open(name,'rb')
- if f then
- f:close()
- return true
- end
- end,
- isdir=function(name)
- print("you need to load lfs")
- return false
- end
- }
-elseif not lfs.isfile then
- local attributes=lfs.attributes
- function lfs.isdir(name)
- return attributes(name,"mode")=="directory"
- end
- function lfs.isfile(name)
- return attributes(name,"mode")=="file"
- end
-end
local insert,concat=table.insert,table.concat
local match,find,gmatch=string.match,string.find,string.gmatch
local lpegmatch=lpeg.match
local getcurrentdir,attributes=lfs.currentdir,lfs.attributes
local checkedsplit=string.checkedsplit
local P,R,S,C,Cs,Cp,Cc,Ct=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Cs,lpeg.Cp,lpeg.Cc,lpeg.Ct
+local tricky=S("/\\")*P(-1)
+local attributes=lfs.attributes
+if sandbox then
+ sandbox.redefine(lfs.isfile,"lfs.isfile")
+ sandbox.redefine(lfs.isdir,"lfs.isdir")
+end
+function lfs.isdir(name)
+ if lpegmatch(tricky,name) then
+ return attributes(name,"mode")=="directory"
+ else
+ return attributes(name.."/.","mode")=="directory"
+ end
+end
+function lfs.isfile(name)
+ return attributes(name,"mode")=="file"
+end
local colon=P(":")
local period=P(".")
local periods=P("..")
@@ -2303,28 +2498,30 @@ local isroot=fwslash^1*-1
local hasroot=fwslash^1
local reslasher=lpeg.replacer(S("\\/"),"/")
local deslasher=lpeg.replacer(S("\\/")^1,"/")
-function file.join(...)
- local lst={... }
- local one=lst[1]
+function file.join(one,two,three,...)
+ if not two then
+ return one=="" and one or lpegmatch(stripper,one)
+ end
+ if one=="" then
+ return lpegmatch(stripper,three and concat({ two,three,... },"/") or two)
+ end
if lpegmatch(isnetwork,one) then
local one=lpegmatch(reslasher,one)
- local two=lpegmatch(deslasher,concat(lst,"/",2))
+ local two=lpegmatch(deslasher,three and concat({ two,three,... },"/") or two)
if lpegmatch(hasroot,two) then
return one..two
else
return one.."/"..two
end
elseif lpegmatch(isroot,one) then
- local two=lpegmatch(deslasher,concat(lst,"/",2))
+ local two=lpegmatch(deslasher,three and concat({ two,three,... },"/") or two)
if lpegmatch(hasroot,two) then
return two
else
return "/"..two
end
- elseif one=="" then
- return lpegmatch(stripper,concat(lst,"/",2))
else
- return lpegmatch(deslasher,concat(lst,"/"))
+ return lpegmatch(deslasher,concat({ one,two,three,... },"/"))
end
end
local drivespec=R("az","AZ")^1*colon
@@ -2493,11 +2690,11 @@ function string.booleanstring(str)
return str=="yes" or str=="on" or str=="t"
end
end
-function string.is_boolean(str,default)
+function string.is_boolean(str,default,strict)
if type(str)=="string" then
- if str=="true" or str=="yes" or str=="on" or str=="t" or str=="1" then
+ if str=="true" or str=="yes" or str=="on" or str=="t" or (not strict and str=="1") then
return true
- elseif str=="false" or str=="no" or str=="off" or str=="f" or str=="0" then
+ elseif str=="false" or str=="no" or str=="off" or str=="f" or (not strict and str=="0") then
return false
end
end
@@ -2516,6 +2713,9 @@ if not modules then modules={} end modules ['l-math']={
license="see context related readme files"
}
local floor,sin,cos,tan=math.floor,math.sin,math.cos,math.tan
+if not math.ceiling then
+ math.ceiling=math.ceil
+end
if not math.round then
function math.round(x) return floor(x+0.5) end
end
@@ -2668,10 +2868,12 @@ local striplinepatterns={
["retain"]=p_retain_normal,
["retain and collapse"]=p_retain_collapse,
["retain and no empty"]=p_retain_noempty,
+ ["collapse"]=patterns.collapser,
}
+setmetatable(striplinepatterns,{ __index=function(t,k) return p_prune_collapse end })
strings.striplinepatterns=striplinepatterns
function strings.striplines(str,how)
- return str and lpegmatch(how and striplinepatterns[how] or p_prune_collapse,str) or str
+ return str and lpegmatch(striplinepatterns[how],str) or str
end
strings.striplong=strings.striplines
function strings.nice(str)
@@ -2711,10 +2913,10 @@ string.tracedchars=tracedchars
strings.tracers=tracedchars
function string.tracedchar(b)
if type(b)=="number" then
- return tracedchars[b] or (utfchar(b).." (U+"..format('%05X',b)..")")
+ return tracedchars[b] or (utfchar(b).." (U+"..format("%05X",b)..")")
else
local c=utfbyte(b)
- return tracedchars[c] or (b.." (U+"..format('%05X',c)..")")
+ return tracedchars[c] or (b.." (U+"..(c and format("%05X",c) or "?????")..")")
end
end
function number.signed(i)
@@ -2851,12 +3053,12 @@ local format_f=function(f)
n=n+1
return format("format('%%%sf',a%s)",f,n)
end
-local format_F=function(f)
+local format_F=function(f)
n=n+1
if not f or f=="" then
- return format("(((a%s > -0.0000000005 and a%s < 0.0000000005) and '0') or (a%s == 1 and '1') or format('%%.9f',a%s))",n,n,n,n)
+ return format("(((a%s > -0.0000000005 and a%s < 0.0000000005) and '0') or format((a%s %% 1 == 0) and '%%i' or '%%.9f',a%s))",n,n,n,n)
else
- return format("((a%s == 0 and '0') or (a%s == 1 and '1') or format('%%%sf',a%s))",n,n,f,n)
+ return format("format((a%s %% 1 == 0) and '%%i' or '%%%sf',a%s)",n,f,n)
end
end
local format_g=function(f)
@@ -3084,7 +3286,6 @@ local builder=Cs { "start",
+V("j")+V("J")
+V("m")+V("M")
+V("z")
-+V("*")
)+V("*")
)*(P(-1)+Carg(1))
)^0,
@@ -3128,6 +3329,7 @@ local builder=Cs { "start",
["a"]=(prefix_any*P("a"))/format_a,
["A"]=(prefix_any*P("A"))/format_A,
["*"]=Cs(((1-P("%"))^1+P("%%")/"%%")^1)/format_rest,
+ ["?"]=Cs(((1-P("%"))^1 )^1)/format_rest,
["!"]=Carg(2)*prefix_any*P("!")*C((1-P("!"))^1)*P("!")/format_extension,
}
local direct=Cs (
@@ -3202,6 +3404,15 @@ else
add(formatters,"tex",[[lpegmatch(texescape,%s)]],{ texescape=lpeg.patterns.texescape })
add(formatters,"lua",[[lpegmatch(luaescape,%s)]],{ luaescape=lpeg.patterns.luaescape })
end
+local dquote=patterns.dquote
+local equote=patterns.escaped+dquote/'\\"'+1
+local space=patterns.space
+local cquote=Cc('"')
+local pattern=Cs(dquote*(equote-P(-2))^0*dquote)
++Cs(cquote*(equote-space)^0*space*equote^0*cquote)
+function string.optionalquoted(str)
+ return lpegmatch(pattern,str) or str
+end
end -- closure
@@ -3221,8 +3432,13 @@ end
local dummyfunction=function()
end
local dummyreporter=function(c)
- return function(...)
- (texio.reporter or texio.write_nl)(c.." : "..string.formatters(...))
+ return function(f,...)
+ local r=texio.reporter or texio.write_nl
+ if f then
+ r(c.." : "..string.formatters(f,...))
+ else
+ r("")
+ end
end
end
statistics={
@@ -3462,7 +3678,12 @@ function caches.compile(data,luaname,lucname)
end
end
function table.setmetatableindex(t,f)
+ if type(t)~="table" then
+ f=f or t
+ t={}
+ end
setmetatable(t,{ __index=f })
+ return t
end
arguments={}
if arg then
@@ -3673,21 +3894,12 @@ function nodes.pool.kern(k)
n.kern=k
return n
end
-local getfield=node.getfield or function(n,tag) return n[tag] end
-local setfield=node.setfield or function(n,tag,value) n[tag]=value end
+local getfield=node.getfield
+local setfield=node.setfield
nodes.getfield=getfield
nodes.setfield=setfield
nodes.getattr=getfield
nodes.setattr=setfield
-if node.getid then nodes.getid=node.getid else function nodes.getid (n) return getfield(n,"id") end end
-if node.getsubtype then nodes.getsubtype=node.getsubtype else function nodes.getsubtype(n) return getfield(n,"subtype") end end
-if node.getnext then nodes.getnext=node.getnext else function nodes.getnext (n) return getfield(n,"next") end end
-if node.getprev then nodes.getprev=node.getprev else function nodes.getprev (n) return getfield(n,"prev") end end
-if node.getchar then nodes.getchar=node.getchar else function nodes.getchar (n) return getfield(n,"char") end end
-if node.getfont then nodes.getfont=node.getfont else function nodes.getfont (n) return getfield(n,"font") end end
-if node.getlist then nodes.getlist=node.getlist else function nodes.getlist (n) return getfield(n,"list") end end
-function nodes.tonut (n) return n end
-function nodes.tonode(n) return n end
nodes.tostring=node.tostring or tostring
nodes.copy=node.copy
nodes.copy_list=node.copy_list
@@ -3721,10 +3933,73 @@ nodes.set_attribute=node.set_attribute
nodes.unset_attribute=node.unset_attribute
nodes.protect_glyphs=node.protect_glyphs
nodes.unprotect_glyphs=node.unprotect_glyphs
-nodes.kerning=node.kerning
-nodes.ligaturing=node.ligaturing
nodes.mlist_to_hlist=node.mlist_to_hlist
-nodes.nuts=nodes
+local direct=node.direct
+local nuts={}
+nodes.nuts=nuts
+local tonode=direct.tonode
+local tonut=direct.todirect
+nodes.tonode=tonode
+nodes.tonut=tonut
+nuts.tonode=tonode
+nuts.tonut=tonut
+local getfield=direct.getfield
+local setfield=direct.setfield
+nuts.getfield=getfield
+nuts.setfield=setfield
+nuts.getnext=direct.getnext
+nuts.getprev=direct.getprev
+nuts.getid=direct.getid
+nuts.getattr=getfield
+nuts.setattr=setfield
+nuts.getfont=direct.getfont
+nuts.getsubtype=direct.getsubtype
+nuts.getchar=direct.getchar
+nuts.insert_before=direct.insert_before
+nuts.insert_after=direct.insert_after
+nuts.delete=direct.delete
+nuts.copy=direct.copy
+nuts.copy_list=direct.copy_list
+nuts.tail=direct.tail
+nuts.flush_list=direct.flush_list
+nuts.free=direct.free
+nuts.remove=direct.remove
+nuts.is_node=direct.is_node
+nuts.end_of_math=direct.end_of_math
+nuts.traverse=direct.traverse
+nuts.traverse_id=direct.traverse_id
+nuts.getprop=nuts.getattr
+nuts.setprop=nuts.setattr
+local new_nut=direct.new
+nuts.new=new_nut
+nuts.pool={}
+function nuts.pool.kern(k)
+ local n=new_nut("kern",1)
+ setfield(n,"kern",k)
+ return n
+end
+local propertydata=direct.get_properties_table()
+nodes.properties={ data=propertydata }
+direct.set_properties_mode(true,true)
+function direct.set_properties_mode() end
+nuts.getprop=function(n,k)
+ local p=propertydata[n]
+ if p then
+ return p[k]
+ end
+end
+nuts.setprop=function(n,k,v)
+ if v then
+ local p=propertydata[n]
+ if p then
+ p[k]=v
+ else
+ propertydata[n]={ [k]=v }
+ end
+ end
+end
+nodes.setprop=nodes.setproperty
+nodes.getprop=nodes.getproperty
end -- closure
@@ -3750,7 +4025,7 @@ fonts.analyzers={}
fonts.readers={}
fonts.definers={ methods={} }
fonts.loggers={ register=function() end }
-fontloader.totable=fontloader.to_table
+fontloader.totable=fontloader.to_table
end -- closure
@@ -3783,7 +4058,8 @@ constructors.autocleanup=true
constructors.namemode="fullpath"
constructors.version=1.01
constructors.cache=containers.define("fonts","constructors",constructors.version,false)
-constructors.privateoffset=0xF0000
+constructors.privateoffset=0xF0000
+constructors.cacheintex=true
constructors.keys={
properties={
encodingbytes="number",
@@ -4036,7 +4312,7 @@ function constructors.scale(tfmdata,specification)
targetparameters.textsize=textsize
targetparameters.forcedsize=forcedsize
targetparameters.extrafactor=extrafactor
- local tounicode=resources.tounicode
+ local tounicode=fonts.mappings.tounicode
local defaultwidth=resources.defaultwidth or 0
local defaultheight=resources.defaultheight or 0
local defaultdepth=resources.defaultdepth or 0
@@ -4062,6 +4338,7 @@ function constructors.scale(tfmdata,specification)
target.tounicode=1
target.cidinfo=properties.cidinfo
target.format=properties.format
+ target.cache=constructors.cacheintex and "yes" or "renew"
local fontname=properties.fontname or tfmdata.fontname
local fullname=properties.fullname or tfmdata.fullname
local filename=properties.filename or tfmdata.filename
@@ -4116,7 +4393,9 @@ function constructors.scale(tfmdata,specification)
local autoitalicamount=properties.autoitalicamount
local stackmath=not properties.nostackmath
local nonames=properties.noglyphnames
- local nodemode=properties.mode=="node"
+ local haskerns=properties.haskerns or properties.mode=="base"
+ local hasligatures=properties.hasligatures or properties.mode=="base"
+ local realdimensions=properties.realdimensions
if changed and not next(changed) then
changed=false
end
@@ -4179,42 +4458,44 @@ function constructors.scale(tfmdata,specification)
constructors.beforecopyingcharacters(target,tfmdata)
local sharedkerns={}
for unicode,character in next,characters do
- local chr,description,index,touni
+ local chr,description,index
if changed then
local c=changed[unicode]
if c then
- local ligatures=character.ligatures
description=descriptions[c] or descriptions[unicode] or character
character=characters[c] or character
index=description.index or c
- if tounicode then
- touni=tounicode[index]
- if not touni then
- local d=descriptions[unicode] or characters[unicode]
- local i=d.index or unicode
- touni=tounicode[i]
- end
- end
- if ligatures and not character.ligatures then
- character.ligatures=ligatures
- end
else
description=descriptions[unicode] or character
index=description.index or unicode
- if tounicode then
- touni=tounicode[index]
- end
end
else
description=descriptions[unicode] or character
index=description.index or unicode
- if tounicode then
- touni=tounicode[index]
- end
end
local width=description.width
local height=description.height
local depth=description.depth
+ if realdimensions then
+ if not height or height==0 then
+ local bb=description.boundingbox
+ local ht=bb[4]
+ if ht~=0 then
+ height=ht
+ end
+ if not depth or depth==0 then
+ local dp=-bb[2]
+ if dp~=0 then
+ depth=dp
+ end
+ end
+ elseif not depth or depth==0 then
+ local dp=-description.boundingbox[2]
+ if dp~=0 then
+ depth=dp
+ end
+ end
+ end
if width then width=hdelta*width else width=scaledwidth end
if height then height=vdelta*height else height=scaledheight end
if depth and depth~=0 then
@@ -4251,8 +4532,10 @@ function constructors.scale(tfmdata,specification)
}
end
end
- if touni then
- chr.tounicode=touni
+ local isunicode=description.unicode
+ if isunicode then
+ chr.unicode=isunicode
+ chr.tounicode=tounicode(isunicode)
end
if hasquality then
local ve=character.expansion_factor
@@ -4345,7 +4628,7 @@ function constructors.scale(tfmdata,specification)
end
end
end
- if not nodemode then
+ if haskerns then
local vk=character.kerns
if vk then
local s=sharedkerns[vk]
@@ -4356,6 +4639,8 @@ function constructors.scale(tfmdata,specification)
end
chr.kerns=s
end
+ end
+ if hasligatures then
local vl=character.ligatures
if vl then
if true then
@@ -4512,6 +4797,7 @@ function constructors.finalize(tfmdata)
tfmdata.extend=nil
tfmdata.slant=nil
tfmdata.units_per_em=nil
+ tfmdata.cache=nil
properties.finalized=true
return tfmdata
end
@@ -4856,6 +5142,16 @@ function constructors.applymanipulators(what,tfmdata,features,trace,report)
end
end
end
+function constructors.addcoreunicodes(unicodes)
+ if not unicodes then
+ unicodes={}
+ end
+ unicodes.space=0x0020
+ unicodes.hyphen=0x002D
+ unicodes.zwj=0x200D
+ unicodes.zwnj=0x200C
+ return unicodes
+end
end -- closure
@@ -4947,7 +5243,7 @@ local function loadcidfile(filename)
ordering=ordering,
filename=filename,
unicodes=unicodes,
- names=names
+ names=names,
}
end
end
@@ -4984,10 +5280,23 @@ function cid.getmap(specification)
local ordering=specification.ordering
local supplement=specification.supplement
local filename=format(registry,ordering,supplement)
- local found=cidmap[lower(filename)]
+ local lowername=lower(filename)
+ local found=cidmap[lowername]
if found then
return found
end
+ if ordering=="Identity" then
+ local found={
+ supplement=supplement,
+ registry=registry,
+ ordering=ordering,
+ filename=filename,
+ unicodes={},
+ names={},
+ }
+ cidmap[lowername]=found
+ return found
+ end
if trace_loading then
report_otf("cidmap needed, registry %a, ordering %a, supplement %a",registry,ordering,supplement)
end
@@ -5038,17 +5347,19 @@ if not modules then modules={} end modules ['font-map']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local tonumber=tonumber
+local tonumber,next,type=tonumber,next,type
local match,format,find,concat,gsub,lower=string.match,string.format,string.find,table.concat,string.gsub,string.lower
local P,R,S,C,Ct,Cc,lpegmatch=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Ct,lpeg.Cc,lpeg.match
local utfbyte=utf.byte
local floor=math.floor
+local formatters=string.formatters
local trace_loading=false trackers.register("fonts.loading",function(v) trace_loading=v end)
local trace_mapping=false trackers.register("fonts.mapping",function(v) trace_unimapping=v end)
local report_fonts=logs.reporter("fonts","loading")
local fonts=fonts or {}
local mappings=fonts.mappings or {}
fonts.mappings=mappings
+local allocate=utilities.storage.allocate
local function loadlumtable(filename)
local lumname=file.replacesuffix(file.basename(filename),"lum")
local lumfile=resolvers.findfile(lumname,"map") or ""
@@ -5082,11 +5393,13 @@ local function makenameparser(str)
return p
end
end
+local f_single=formatters["%04X"]
+local f_double=formatters["%04X%04X"]
local function tounicode16(unicode,name)
if unicode<0x10000 then
- return format("%04X",unicode)
+ return f_single(unicode)
elseif unicode<0x1FFFFFFFFF then
- return format("%04X%04X",floor(unicode/1024),unicode%1024+0xDC00)
+ return f_double(floor(unicode/1024),unicode%1024+0xDC00)
else
report_fonts("can't convert %a in %a into tounicode",unicode,name)
end
@@ -5094,17 +5407,43 @@ end
local function tounicode16sequence(unicodes,name)
local t={}
for l=1,#unicodes do
- local unicode=unicodes[l]
- if unicode<0x10000 then
- t[l]=format("%04X",unicode)
+ local u=unicodes[l]
+ if u<0x10000 then
+ t[l]=f_single(u)
elseif unicode<0x1FFFFFFFFF then
- t[l]=format("%04X%04X",floor(unicode/1024),unicode%1024+0xDC00)
+ t[l]=f_double(floor(u/1024),u%1024+0xDC00)
else
- report_fonts ("can't convert %a in %a into tounicode",unicode,name)
+ report_fonts ("can't convert %a in %a into tounicode",u,name)
+ return
end
end
return concat(t)
end
+local function tounicode(unicode,name)
+ if type(unicode)=="table" then
+ local t={}
+ for l=1,#unicode do
+ local u=unicode[l]
+ if u<0x10000 then
+ t[l]=f_single(u)
+ elseif u<0x1FFFFFFFFF then
+ t[l]=f_double(floor(u/1024),u%1024+0xDC00)
+ else
+ report_fonts ("can't convert %a in %a into tounicode",u,name)
+ return
+ end
+ end
+ return concat(t)
+ else
+ if unicode<0x10000 then
+ return f_single(unicode)
+ elseif unicode<0x1FFFFFFFFF then
+ return f_double(floor(unicode/1024),unicode%1024+0xDC00)
+ else
+ report_fonts("can't convert %a in %a into tounicode",unicode,name)
+ end
+ end
+end
local function fromunicode16(str)
if #str==4 then
return tonumber(str,16)
@@ -5115,17 +5454,41 @@ local function fromunicode16(str)
end
mappings.loadlumtable=loadlumtable
mappings.makenameparser=makenameparser
+mappings.tounicode=tounicode
mappings.tounicode16=tounicode16
mappings.tounicode16sequence=tounicode16sequence
mappings.fromunicode16=fromunicode16
local ligseparator=P("_")
local varseparator=P(".")
local namesplitter=Ct(C((1-ligseparator-varseparator)^1)*(ligseparator*C((1-ligseparator-varseparator)^1))^0)
+local overloads=allocate {
+ IJ={ name="I_J",unicode={ 0x49,0x4A },mess=0x0132 },
+ ij={ name="i_j",unicode={ 0x69,0x6A },mess=0x0133 },
+ ff={ name="f_f",unicode={ 0x66,0x66 },mess=0xFB00 },
+ fi={ name="f_i",unicode={ 0x66,0x69 },mess=0xFB01 },
+ fl={ name="f_l",unicode={ 0x66,0x6C },mess=0xFB02 },
+ ffi={ name="f_f_i",unicode={ 0x66,0x66,0x69 },mess=0xFB03 },
+ ffl={ name="f_f_l",unicode={ 0x66,0x66,0x6C },mess=0xFB04 },
+ fj={ name="f_j",unicode={ 0x66,0x6A } },
+ fk={ name="f_k",unicode={ 0x66,0x6B } },
+}
+for k,v in next,overloads do
+ local name=v.name
+ local mess=v.mess
+ if name then
+ overloads[name]=v
+ end
+ if mess then
+ overloads[mess]=v
+ end
+end
+mappings.overloads=overloads
function mappings.addtounicode(data,filename)
local resources=data.resources
local properties=data.properties
local descriptions=data.descriptions
local unicodes=resources.unicodes
+ local lookuptypes=resources.lookuptypes
if not unicodes then
return
end
@@ -5134,18 +5497,10 @@ function mappings.addtounicode(data,filename)
unicodes['zwj']=unicodes['zwj'] or 0x200D
unicodes['zwnj']=unicodes['zwnj'] or 0x200C
local private=fonts.constructors.privateoffset
- local unknown=format("%04X",utfbyte("?"))
- local unicodevector=fonts.encodings.agl.unicodes
- local tounicode={}
- local originals={}
- resources.tounicode=tounicode
- resources.originals=originals
+ local unicodevector=fonts.encodings.agl.unicodes
+ local missing={}
local lumunic,uparser,oparser
local cidinfo,cidnames,cidcodes,usedmap
- if false then
- lumunic=loadlumtable(filename)
- lumunic=lumunic and lumunic.tounicode
- end
cidinfo=properties.cidinfo
usedmap=cidinfo and fonts.cid.getmap(cidinfo)
if usedmap then
@@ -5158,11 +5513,13 @@ function mappings.addtounicode(data,filename)
for unic,glyph in next,descriptions do
local index=glyph.index
local name=glyph.name
- if unic==-1 or unic>=private or (unic>=0xE000 and unic<=0xF8FF) or unic==0xFFFE or unic==0xFFFF then
+ local r=overloads[name]
+ if r then
+ glyph.unicode=r.unicode
+ elseif unic==-1 or unic>=private or (unic>=0xE000 and unic<=0xF8FF) or unic==0xFFFE or unic==0xFFFF then
local unicode=lumunic and lumunic[name] or unicodevector[name]
if unicode then
- originals[index]=unicode
- tounicode[index]=tounicode16(unicode,name)
+ glyph.unicode=unicode
ns=ns+1
end
if (not unicode) and usedmap then
@@ -5170,8 +5527,7 @@ function mappings.addtounicode(data,filename)
if foundindex then
unicode=cidcodes[foundindex]
if unicode then
- originals[index]=unicode
- tounicode[index]=tounicode16(unicode,name)
+ glyph.unicode=unicode
ns=ns+1
else
local reference=cidnames[foundindex]
@@ -5180,21 +5536,18 @@ function mappings.addtounicode(data,filename)
if foundindex then
unicode=cidcodes[foundindex]
if unicode then
- originals[index]=unicode
- tounicode[index]=tounicode16(unicode,name)
+ glyph.unicode=unicode
ns=ns+1
end
end
if not unicode or unicode=="" then
local foundcodes,multiple=lpegmatch(uparser,reference)
if foundcodes then
- originals[index]=foundcodes
+ glyph.unicode=foundcodes
if multiple then
- tounicode[index]=tounicode16sequence(foundcodes)
nl=nl+1
unicode=true
else
- tounicode[index]=tounicode16(foundcodes,name)
ns=ns+1
unicode=foundcodes
end
@@ -5232,39 +5585,157 @@ function mappings.addtounicode(data,filename)
end
if n==0 then
elseif n==1 then
- originals[index]=t[1]
- tounicode[index]=tounicode16(t[1],name)
+ glyph.unicode=t[1]
else
- originals[index]=t
- tounicode[index]=tounicode16sequence(t)
+ glyph.unicode=t
end
nl=nl+1
end
if not unicode or unicode=="" then
local foundcodes,multiple=lpegmatch(uparser,name)
if foundcodes then
+ glyph.unicode=foundcodes
if multiple then
- originals[index]=foundcodes
- tounicode[index]=tounicode16sequence(foundcodes,name)
nl=nl+1
unicode=true
else
- originals[index]=foundcodes
- tounicode[index]=tounicode16(foundcodes,name)
ns=ns+1
unicode=foundcodes
end
end
end
+ local r=overloads[unicode]
+ if r then
+ unicode=r.unicode
+ glyph.unicode=unicode
+ end
+ if not unicode then
+ missing[name]=true
+ end
+ end
+ end
+ if next(missing) then
+ local guess={}
+ local function check(gname,code,unicode)
+ local description=descriptions[code]
+ local variant=description.name
+ if variant==gname then
+ return
+ end
+ local unic=unicodes[variant]
+ if unic==-1 or unic>=private or (unic>=0xE000 and unic<=0xF8FF) or unic==0xFFFE or unic==0xFFFF then
+ else
+ return
+ end
+ if descriptions[code].unicode then
+ return
+ end
+ local g=guess[variant]
+ if g then
+ g[gname]=unicode
+ else
+ guess[variant]={ [gname]=unicode }
+ end
+ end
+ for unicode,description in next,descriptions do
+ local slookups=description.slookups
+ if slookups then
+ local gname=description.name
+ for tag,data in next,slookups do
+ local lookuptype=lookuptypes[tag]
+ if lookuptype=="alternate" then
+ for i=1,#data do
+ check(gname,data[i],unicode)
+ end
+ elseif lookuptype=="substitution" then
+ check(gname,data,unicode)
+ end
+ end
+ end
+ local mlookups=description.mlookups
+ if mlookups then
+ local gname=description.name
+ for tag,list in next,mlookups do
+ local lookuptype=lookuptypes[tag]
+ if lookuptype=="alternate" then
+ for i=1,#list do
+ local data=list[i]
+ for i=1,#data do
+ check(gname,data[i],unicode)
+ end
+ end
+ elseif lookuptype=="substitution" then
+ for i=1,#list do
+ check(gname,list[i],unicode)
+ end
+ end
+ end
+ end
+ end
+ local done=true
+ while done do
+ done=false
+ for k,v in next,guess do
+ if type(v)~="number" then
+ for kk,vv in next,v do
+ if vv==-1 or vv>=private or (vv>=0xE000 and vv<=0xF8FF) or vv==0xFFFE or vv==0xFFFF then
+ local uu=guess[kk]
+ if type(uu)=="number" then
+ guess[k]=uu
+ done=true
+ end
+ else
+ guess[k]=vv
+ done=true
+ end
+ end
+ end
+ end
+ end
+ local orphans=0
+ local guessed=0
+ for k,v in next,guess do
+ if type(v)=="number" then
+ descriptions[unicodes[k]].unicode=descriptions[v].unicode or v
+ guessed=guessed+1
+ else
+ local t=nil
+ local l=lower(k)
+ local u=unicodes[l]
+ if not u then
+ orphans=orphans+1
+ elseif u==-1 or u>=private or (u>=0xE000 and u<=0xF8FF) or u==0xFFFE or u==0xFFFF then
+ local unicode=descriptions[u].unicode
+ if unicode then
+ descriptions[unicodes[k]].unicode=unicode
+ guessed=guessed+1
+ else
+ orphans=orphans+1
+ end
+ else
+ orphans=orphans+1
+ end
+ end
+ end
+ if trace_loading and orphans>0 or guessed>0 then
+ report_fonts("%s glyphs with no related unicode, %s guessed, %s orphans",guessed+orphans,guessed,orphans)
end
end
if trace_mapping then
for unic,glyph in table.sortedhash(descriptions) do
local name=glyph.name
local index=glyph.index
- local toun=tounicode[index]
- if toun then
- report_fonts("internal slot %U, name %a, unicode %U, tounicode %a",index,name,unic,toun)
+ local unicode=glyph.unicode
+ if unicode then
+ if type(unicode)=="table" then
+ local unicodes={}
+ for i=1,#unicode do
+ unicodes[i]=formatters("%U",unicode[i])
+ end
+ report_fonts("internal slot %U, name %a, unicode %U, tounicode % t",index,name,unic,unicodes)
+ else
+ report_fonts("internal slot %U, name %a, unicode %U, tounicode %U",index,name,unic,unicode)
+ end
else
report_fonts("internal slot %U, name %a, unicode %U",index,name,unic)
end
@@ -5406,14 +5877,15 @@ local function read_from_tfm(specification)
properties.fontname=tfmdata.fontname
properties.psname=tfmdata.psname
properties.filename=specification.filename
+ properties.format=fonts.formats.tfm
parameters.size=size
- shared.rawdata={}
- shared.features=features
- shared.processes=next(features) and tfm.setfeatures(tfmdata,features) or nil
tfmdata.properties=properties
tfmdata.resources=resources
tfmdata.parameters=parameters
tfmdata.shared=shared
+ shared.rawdata={}
+ shared.features=features
+ shared.processes=next(features) and tfm.setfeatures(tfmdata,features) or nil
parameters.slant=parameters.slant or parameters[1] or 0
parameters.space=parameters.space or parameters[2] or 0
parameters.space_stretch=parameters.space_stretch or parameters[3] or 0
@@ -5445,6 +5917,10 @@ local function read_from_tfm(specification)
features.encoding=encoding
end
end
+ properties.haskerns=true
+ properties.haslogatures=true
+ resources.unicodes={}
+ resources.lookuptags={}
return tfmdata
end
end
@@ -5500,15 +5976,20 @@ local trace_indexing=false trackers.register("afm.indexing",function(v) trace_in
local trace_loading=false trackers.register("afm.loading",function(v) trace_loading=v end)
local trace_defining=false trackers.register("fonts.defining",function(v) trace_defining=v end)
local report_afm=logs.reporter("fonts","afm loading")
+local setmetatableindex=table.setmetatableindex
local findbinfile=resolvers.findbinfile
local definers=fonts.definers
local readers=fonts.readers
local constructors=fonts.constructors
+local fontloader=fontloader
+local font_to_table=fontloader.to_table
+local open_font=fontloader.open
+local close_font=fontloader.close
local afm=constructors.newhandler("afm")
local pfb=constructors.newhandler("pfb")
local afmfeatures=constructors.newfeatures("afm")
local registerafmfeature=afmfeatures.register
-afm.version=1.410
+afm.version=1.500
afm.cache=containers.define("fonts","afm",afm.version,true)
afm.autoprefixed=true
afm.helpdata={}
@@ -5516,6 +5997,7 @@ afm.syncspace=true
afm.addligatures=true
afm.addtexligatures=true
afm.addkerns=true
+local overloads=fonts.mappings.overloads
local applyruntimefixes=fonts.treatments and fonts.treatments.applyfixes
local function setmode(tfmdata,value)
if value then
@@ -5618,10 +6100,10 @@ local function get_variables(data,fontmetrics)
end
local function get_indexes(data,pfbname)
data.resources.filename=resolvers.unresolve(pfbname)
- local pfbblob=fontloader.open(pfbname)
+ local pfbblob=open_font(pfbname)
if pfbblob then
local characters=data.characters
- local pfbdata=fontloader.to_table(pfbblob)
+ local pfbdata=font_to_table(pfbblob)
if pfbdata then
local glyphs=pfbdata.glyphs
if glyphs then
@@ -5646,7 +6128,7 @@ local function get_indexes(data,pfbname)
elseif trace_loading then
report_afm("no data in pfb file %a",pfbname)
end
- fontloader.close(pfbblob)
+ close_font(pfbblob)
elseif trace_loading then
report_afm("invalid pfb file %a",pfbname)
end
@@ -5703,7 +6185,7 @@ local function readafm(filename)
return nil
end
end
-local addkerns,addligatures,addtexligatures,unify,normalize
+local addkerns,addligatures,addtexligatures,unify,normalize,fixnames
function afm.load(filename)
filename=resolvers.findfile(filename,'afm') or ""
if filename~="" and not fonts.names.ignoredfile(filename) then
@@ -5746,6 +6228,7 @@ function afm.load(filename)
addkerns(data)
end
normalize(data)
+ fixnames(data)
report_afm("add tounicode data")
fonts.mappings.addtounicode(data,filename)
data.size=size
@@ -5753,6 +6236,7 @@ function afm.load(filename)
data.pfbsize=pfbsize
data.pfbtime=pfbtime
report_afm("saving %a in cache",name)
+ data.resources.unicodes=nil
data=containers.write(afm.cache,name,data)
data=containers.read(afm.cache,name)
end
@@ -5812,18 +6296,30 @@ unify=function(data,filename)
local filename=resources.filename or file.removesuffix(file.basename(filename))
resources.filename=resolvers.unresolve(filename)
resources.unicodes=unicodes
- resources.marks={}
- resources.names=names
+ resources.marks={}
resources.private=private
end
normalize=function(data)
end
+fixnames=function(data)
+ for k,v in next,data.descriptions do
+ local n=v.name
+ local r=overloads[n]
+ if r then
+ local name=r.name
+ if trace_indexing then
+ report_afm("renaming characters %a to %a",n,name)
+ end
+ v.name=name
+ v.unicode=r.unicode
+ end
+ end
+end
local addthem=function(rawdata,ligatures)
if ligatures then
local descriptions=rawdata.descriptions
local resources=rawdata.resources
local unicodes=resources.unicodes
- local names=resources.names
for ligname,ligdata in next,ligatures do
local one=descriptions[unicodes[ligname]]
if one then
@@ -5956,8 +6452,8 @@ local function copytotfm(data)
local filename=constructors.checkedfilename(resources)
local fontname=metadata.fontname or metadata.fullname
local fullname=metadata.fullname or metadata.fontname
- local endash=unicodes['space']
- local emdash=unicodes['emdash']
+ local endash=0x0020
+ local emdash=0x2014
local spacer="space"
local spaceunits=500
local monospaced=metadata.isfixedpitch
@@ -6011,7 +6507,7 @@ local function copytotfm(data)
if charxheight then
parameters.x_height=charxheight
else
- local x=unicodes['x']
+ local x=0x0078
if x then
local x=descriptions[x]
if x then
@@ -6058,7 +6554,34 @@ function afm.setfeatures(tfmdata,features)
return {}
end
end
-local function checkfeatures(specification)
+local function addtables(data)
+ local resources=data.resources
+ local lookuptags=resources.lookuptags
+ local unicodes=resources.unicodes
+ if not lookuptags then
+ lookuptags={}
+ resources.lookuptags=lookuptags
+ end
+ setmetatableindex(lookuptags,function(t,k)
+ local v=type(k)=="number" and ("lookup "..k) or k
+ t[k]=v
+ return v
+ end)
+ if not unicodes then
+ unicodes={}
+ resources.unicodes=unicodes
+ setmetatableindex(unicodes,function(t,k)
+ setmetatableindex(unicodes,nil)
+ for u,d in next,data.descriptions do
+ local n=d.name
+ if n then
+ t[n]=u
+ end
+ end
+ return rawget(t,k)
+ end)
+ end
+ constructors.addcoreunicodes(unicodes)
end
local function afmtotfm(specification)
local afmname=specification.filename or specification.name
@@ -6085,6 +6608,7 @@ local function afmtotfm(specification)
if not tfmdata then
local rawdata=afm.load(afmname)
if rawdata and next(rawdata) then
+ addtables(rawdata)
adddimensions(rawdata)
tfmdata=copytotfm(rawdata)
if tfmdata and next(tfmdata) then
@@ -6119,6 +6643,7 @@ end
local function prepareligatures(tfmdata,ligatures,value)
if value then
local descriptions=tfmdata.descriptions
+ local hasligatures=false
for unicode,character in next,tfmdata.characters do
local description=descriptions[unicode]
local dligatures=description.ligatures
@@ -6134,8 +6659,10 @@ local function prepareligatures(tfmdata,ligatures,value)
type=0
}
end
+ hasligatures=true
end
end
+ tfmdata.properties.hasligatures=hasligatures
end
end
local function preparekerns(tfmdata,kerns,value)
@@ -6144,6 +6671,7 @@ local function preparekerns(tfmdata,kerns,value)
local resources=rawdata.resources
local unicodes=resources.unicodes
local descriptions=tfmdata.descriptions
+ local haskerns=false
for u,chr in next,tfmdata.characters do
local d=descriptions[u]
local newkerns=d[kerns]
@@ -6159,8 +6687,10 @@ local function preparekerns(tfmdata,kerns,value)
kerns[uk]=v
end
end
+ haskerns=true
end
end
+ tfmdata.properties.haskerns=haskerns
end
end
local list={
@@ -6590,6 +7120,8 @@ local reversed,concat,remove,sortedkeys=table.reversed,table.concat,table.remove
local ioflush=io.flush
local fastcopy,tohash,derivetable=table.fastcopy,table.tohash,table.derive
local formatters=string.formatters
+local P,R,S,C,Ct,lpegmatch=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Ct,lpeg.match
+local setmetatableindex=table.setmetatableindex
local allocate=utilities.storage.allocate
local registertracker=trackers.register
local registerdirective=directives.register
@@ -6604,26 +7136,28 @@ local trace_dynamics=false registertracker("otf.dynamics",function(v) trace_dyna
local trace_sequences=false registertracker("otf.sequences",function(v) trace_sequences=v end)
local trace_markwidth=false registertracker("otf.markwidth",function(v) trace_markwidth=v end)
local trace_defining=false registertracker("fonts.defining",function(v) trace_defining=v end)
+local compact_lookups=true registertracker("otf.compactlookups",function(v) compact_lookups=v end)
+local purge_names=true registertracker("otf.purgenames",function(v) purge_names=v end)
local report_otf=logs.reporter("fonts","otf loading")
local fonts=fonts
local otf=fonts.handlers.otf
otf.glists={ "gsub","gpos" }
-otf.version=2.755
+otf.version=2.803
otf.cache=containers.define("fonts","otf",otf.version,true)
-local fontdata=fonts.hashes.identifiers
+local hashes=fonts.hashes
+local definers=fonts.definers
+local readers=fonts.readers
+local constructors=fonts.constructors
+local fontdata=hashes and hashes.identifiers
local chardata=characters and characters.data
-local otffeatures=fonts.constructors.newfeatures("otf")
+local otffeatures=constructors.newfeatures("otf")
local registerotffeature=otffeatures.register
local enhancers=allocate()
otf.enhancers=enhancers
local patches={}
enhancers.patches=patches
-local definers=fonts.definers
-local readers=fonts.readers
-local constructors=fonts.constructors
local forceload=false
local cleanup=0
-local usemetatables=false
local packdata=true
local syncspace=true
local forcenotdef=false
@@ -6632,7 +7166,11 @@ local overloadkerns=false
local applyruntimefixes=fonts.treatments and fonts.treatments.applyfixes
local wildcard="*"
local default="dflt"
-local fontloaderfields=fontloader.fields
+local fontloader=fontloader
+local open_font=fontloader.open
+local close_font=fontloader.close
+local font_fields=fontloader.fields
+local apply_featurefile=fontloader.apply_featurefile
local mainfields=nil
local glyphfields=nil
local formats=fonts.formats
@@ -6642,7 +7180,6 @@ formats.ttc="truetype"
formats.dfont="truetype"
registerdirective("fonts.otf.loader.cleanup",function(v) cleanup=tonumber(v) or (v and 1) or 0 end)
registerdirective("fonts.otf.loader.force",function(v) forceload=v end)
-registerdirective("fonts.otf.loader.usemetatables",function(v) usemetatables=v end)
registerdirective("fonts.otf.loader.pack",function(v) packdata=v end)
registerdirective("fonts.otf.loader.syncspace",function(v) syncspace=v end)
registerdirective("fonts.otf.loader.forcenotdef",function(v) forcenotdef=v end)
@@ -6674,7 +7211,7 @@ local function load_featurefile(raw,featurefile)
if trace_loading then
report_otf("using featurefile %a",featurefile)
end
- fontloader.apply_featurefile(raw,featurefile)
+ apply_featurefile(raw,featurefile)
end
end
local function showfeatureorder(rawdata,filename)
@@ -6734,7 +7271,6 @@ local valid_fields=table.tohash {
"extrema_bound",
"familyname",
"fontname",
- "fontname",
"fontstyle_id",
"fontstyle_name",
"fullname",
@@ -6772,7 +7308,6 @@ local ordered_enhancers={
"prepare lookups",
"analyze glyphs",
"analyze math",
- "prepare tounicode",
"reorganize lookups",
"reorganize mark classes",
"reorganize anchor classes",
@@ -6785,9 +7320,12 @@ local ordered_enhancers={
"check glyphs",
"check metadata",
"check extra features",
+ "prepare tounicode",
"check encoding",
"add duplicates",
"cleanup tables",
+ "compact lookups",
+ "purge names",
}
local actions=allocate()
local before=allocate()
@@ -6924,12 +7462,12 @@ function otf.load(filename,sub,featurefile)
report_otf("loading %a, hash %a",filename,hash)
local fontdata,messages
if sub then
- fontdata,messages=fontloader.open(filename,sub)
+ fontdata,messages=open_font(filename,sub)
else
- fontdata,messages=fontloader.open(filename)
+ fontdata,messages=open_font(filename)
end
if fontdata then
- mainfields=mainfields or (fontloaderfields and fontloaderfields(fontdata))
+ mainfields=mainfields or (font_fields and font_fields(fontdata))
end
if trace_loading and messages and #messages>0 then
if type(messages)=="string" then
@@ -6969,6 +7507,7 @@ function otf.load(filename,sub,featurefile)
},
lookuptypes={},
},
+ warnings={},
metadata={
},
properties={
@@ -6977,7 +7516,7 @@ function otf.load(filename,sub,featurefile)
goodies={},
helpers={
tounicodelist=splitter,
- tounicodetable=lpeg.Ct(splitter),
+ tounicodetable=Ct(splitter),
},
}
starttiming(data)
@@ -7002,7 +7541,7 @@ function otf.load(filename,sub,featurefile)
report_otf("preprocessing and caching time %s, packtime %s",
elapsedtime(data),packdata and elapsedtime(packtime) or 0)
end
- fontloader.close(fontdata)
+ close_font(fontdata)
if cleanup>3 then
collectgarbage("collect")
end
@@ -7020,6 +7559,34 @@ function otf.load(filename,sub,featurefile)
report_otf("loading from cache using hash %a",hash)
end
enhance("unpack",data,filename,nil,false)
+ local resources=data.resources
+ local lookuptags=resources.lookuptags
+ local unicodes=resources.unicodes
+ if not lookuptags then
+ lookuptags={}
+ resources.lookuptags=lookuptags
+ end
+ setmetatableindex(lookuptags,function(t,k)
+ local v=type(k)=="number" and ("lookup "..k) or k
+ t[k]=v
+ return v
+ end)
+ if not unicodes then
+ unicodes={}
+ resources.unicodes=unicodes
+ setmetatableindex(unicodes,function(t,k)
+ setmetatableindex(unicodes,nil)
+ for u,d in next,data.descriptions do
+ local n=d.name
+ if n then
+ t[n]=u
+ else
+ end
+ end
+ return rawget(t,k)
+ end)
+ end
+ constructors.addcoreunicodes(unicodes)
if applyruntimefixes then
applyruntimefixes(filename,data)
end
@@ -7056,26 +7623,16 @@ actions["add dimensions"]=function(data,filename)
local defaultheight=resources.defaultheight or 0
local defaultdepth=resources.defaultdepth or 0
local basename=trace_markwidth and file.basename(filename)
- if usemetatables then
- for _,d in next,descriptions do
- local wd=d.width
- if not wd then
- d.width=defaultwidth
- elseif trace_markwidth and wd~=0 and d.class=="mark" then
- report_otf("mark %a with width %b found in %a",d.name or "<noname>",wd,basename)
- end
- setmetatable(d,mt)
+ for _,d in next,descriptions do
+ local bb,wd=d.boundingbox,d.width
+ if not wd then
+ d.width=defaultwidth
+ elseif trace_markwidth and wd~=0 and d.class=="mark" then
+ report_otf("mark %a with width %b found in %a",d.name or "<noname>",wd,basename)
end
- else
- for _,d in next,descriptions do
- local bb,wd=d.boundingbox,d.width
- if not wd then
- d.width=defaultwidth
- elseif trace_markwidth and wd~=0 and d.class=="mark" then
- report_otf("mark %a with width %b found in %a",d.name or "<noname>",wd,basename)
- end
- if bb then
- local ht,dp=bb[4],-bb[2]
+ if bb then
+ local ht=bb[4]
+ local dp=-bb[2]
if ht==0 or ht<0 then
else
d.height=ht
@@ -7084,7 +7641,6 @@ actions["add dimensions"]=function(data,filename)
else
d.depth=dp
end
- end
end
end
end
@@ -7151,24 +7707,26 @@ actions["prepare glyphs"]=function(data,filename,raw)
local glyph=cidglyphs[index]
if glyph then
local unicode=glyph.unicode
-if unicode>=0x00E000 and unicode<=0x00F8FF then
+ if unicode>=0x00E000 and unicode<=0x00F8FF then
unicode=-1
-elseif unicode>=0x0F0000 and unicode<=0x0FFFFD then
+ elseif unicode>=0x0F0000 and unicode<=0x0FFFFD then
unicode=-1
-elseif unicode>=0x100000 and unicode<=0x10FFFD then
+ elseif unicode>=0x100000 and unicode<=0x10FFFD then
unicode=-1
-end
+ end
local name=glyph.name or cidnames[index]
if not unicode or unicode==-1 then
unicode=cidunicodes[index]
end
if unicode and descriptions[unicode] then
- report_otf("preventing glyph %a at index %H to overload unicode %U",name or "noname",index,unicode)
+ if trace_private then
+ report_otf("preventing glyph %a at index %H to overload unicode %U",name or "noname",index,unicode)
+ end
unicode=-1
end
if not unicode or unicode==-1 then
if not name then
- name=format("u%06X",private)
+ name=format("u%06X.ctx",private)
end
unicode=private
unicodes[name]=private
@@ -7179,7 +7737,7 @@ end
nofnames=nofnames+1
else
if not name then
- name=format("u%06X",unicode)
+ name=format("u%06X.ctx",unicode)
end
unicodes[name]=unicode
nofunicodes=nofunicodes+1
@@ -7220,12 +7778,29 @@ end
end
private=private+1
else
+ if unicode>criterium then
+ local taken=descriptions[unicode]
+ if taken then
+ if unicode>=private then
+ private=unicode+1
+ else
+ private=private+1
+ end
+ descriptions[private]=taken
+ unicodes[taken.name]=private
+ indices[taken.index]=private
+ if trace_private then
+ report_otf("slot %U is moved to %U due to private in font",unicode)
+ end
+ else
+ if unicode>=private then
+ private=unicode+1
+ end
+ end
+ end
unicodes[name]=unicode
end
indices[index]=unicode
- if not name then
- name=format("u%06X",unicode)
- end
descriptions[unicode]={
boundingbox=glyph.boundingbox,
name=name,
@@ -7334,8 +7909,8 @@ actions["add duplicates"]=function(data,filename,raw)
local description=descriptions[unicode]
local n=0
for _,description in next,descriptions do
+ local kerns=description.kerns
if kerns then
- local kerns=description.kerns
for _,k in next,kerns do
local ku=k[unicode]
if ku then
@@ -7629,9 +8204,14 @@ local function t_hashed(t,cache)
local ti=t[i]
local tih=cache[ti]
if not tih then
- tih={}
- for i=1,#ti do
- tih[ti[i]]=true
+ local tn=#ti
+ if tn==1 then
+ tih={ [ti[1]]=true }
+ else
+ tih={}
+ for i=1,tn do
+ tih[ti[i]]=true
+ end
end
cache[ti]=tih
end
@@ -7644,12 +8224,17 @@ local function t_hashed(t,cache)
end
local function s_hashed(t,cache)
if t then
- local ht={}
local tf=t[1]
- for i=1,#tf do
- ht[i]={ [tf[i]]=true }
+ local nf=#tf
+ if nf==1 then
+ return { [tf[1]]=true }
+ else
+ local ht={}
+ for i=1,nf do
+ ht[i]={ [tf[i]]=true }
+ end
+ return ht
end
- return ht
else
return nil
end
@@ -7799,12 +8384,12 @@ actions["reorganize lookups"]=function(data,filename,raw)
local fore=glyphs.fore
if fore and fore~="" then
fore=s_uncover(splitter,s_u_cache,fore)
- rule.before=s_hashed(fore,s_h_cache)
+ rule.after=s_hashed(fore,s_h_cache)
end
local back=glyphs.back
if back then
back=s_uncover(splitter,s_u_cache,back)
- rule.after=s_hashed(back,s_h_cache)
+ rule.before=s_hashed(back,s_h_cache)
end
local names=glyphs.names
if names then
@@ -7812,6 +8397,14 @@ actions["reorganize lookups"]=function(data,filename,raw)
rule.current=s_hashed(names,s_h_cache)
end
rule.glyphs=nil
+ local lookups=rule.lookups
+ if lookups then
+ for i=1,#names do
+ if not lookups[i] then
+ lookups[i]=""
+ end
+ end
+ end
end
end
end
@@ -7828,7 +8421,9 @@ local function check_variants(unicode,the_variants,splitter,unicodes)
for i=1,#glyphs do
local g=glyphs[i]
if done[g] then
- report_otf("skipping cyclic reference %U in math variant %U",g,unicode)
+ if i>1 then
+ report_otf("skipping cyclic reference %U in math variant %U",g,unicode)
+ end
else
if n==0 then
n=1
@@ -8067,6 +8662,10 @@ actions["check glyphs"]=function(data,filename,raw)
description.glyph=nil
end
end
+local valid=(R("\x00\x7E")-S("(){}[]<>%/ \n\r\f\v"))^0*P(-1)
+local function valid_ps_name(str)
+ return str and str~="" and #str<64 and lpegmatch(valid,str) and true or false
+end
actions["check metadata"]=function(data,filename,raw)
local metadata=data.metadata
for _,k in next,mainfields do
@@ -8084,14 +8683,50 @@ actions["check metadata"]=function(data,filename,raw)
end
end
if metadata.validation_state and table.contains(metadata.validation_state,"bad_ps_fontname") then
- local name=file.nameonly(filename)
- metadata.fontname="bad-fontname-"..name
- metadata.fullname="bad-fullname-"..name
+ local function valid(what)
+ local names=raw.names
+ for i=1,#names do
+ local list=names[i]
+ local names=list.names
+ if names then
+ local name=names[what]
+ if name and valid_ps_name(name) then
+ return name
+ end
+ end
+ end
+ end
+ local function check(what)
+ local oldname=metadata[what]
+ if valid_ps_name(oldname) then
+ report_otf("ignoring warning %a because %s %a is proper ASCII","bad_ps_fontname",what,oldname)
+ else
+ local newname=valid(what)
+ if not newname then
+ newname=formatters["bad-%s-%s"](what,file.nameonly(filename))
+ end
+ local warning=formatters["overloading %s from invalid ASCII name %a to %a"](what,oldname,newname)
+ data.warnings[#data.warnings+1]=warning
+ report_otf(warning)
+ metadata[what]=newname
+ end
+ end
+ check("fontname")
+ check("fullname")
end
end
actions["cleanup tables"]=function(data,filename,raw)
+ local duplicates=data.resources.duplicates
+ if duplicates then
+ for k,v in next,duplicates do
+ if #v==1 then
+ duplicates[k]=v[1]
+ end
+ end
+ end
data.resources.indices=nil
- data.helpers=nil
+ data.resources.unicodes=nil
+ data.helpers=nil
end
actions["reorganize glyph lookups"]=function(data,filename,raw)
local resources=data.resources
@@ -8173,6 +8808,7 @@ actions["reorganize glyph lookups"]=function(data,filename,raw)
end
end
end
+local zero={ 0,0 }
actions["reorganize glyph anchors"]=function(data,filename,raw)
local descriptions=data.descriptions
for unicode,description in next,descriptions do
@@ -8181,14 +8817,32 @@ actions["reorganize glyph anchors"]=function(data,filename,raw)
for class,data in next,anchors do
if class=="baselig" then
for tag,specification in next,data do
- for i=1,#specification do
- local si=specification[i]
- specification[i]={ si.x or 0,si.y or 0 }
+ local n=0
+ for k,v in next,specification do
+ if k>n then
+ n=k
+ end
+ local x,y=v.x,v.y
+ if x or y then
+ specification[k]={ x or 0,y or 0 }
+ else
+ specification[k]=zero
+ end
end
+ local t={}
+ for i=1,n do
+ t[i]=specification[i] or zero
+ end
+ data[tag]=t
end
else
for tag,specification in next,data do
- data[tag]={ specification.x or 0,specification.y or 0 }
+ local x,y=specification.x,specification.y
+ if x or y then
+ data[tag]={ x or 0,y or 0 }
+ else
+ data[tag]=zero
+ end
end
end
end
@@ -8196,6 +8850,142 @@ actions["reorganize glyph anchors"]=function(data,filename,raw)
end
end
end
+local bogusname=(P("uni")+P("u"))*R("AF","09")^4+(P("index")+P("glyph")+S("Ii")*P("dentity")*P(".")^0)*R("09")^1
+local uselessname=(1-bogusname)^0*bogusname
+actions["purge names"]=function(data,filename,raw)
+ if purge_names then
+ local n=0
+ for u,d in next,data.descriptions do
+ if lpegmatch(uselessname,d.name) then
+ n=n+1
+ d.name=nil
+ end
+ end
+ if n>0 then
+ report_otf("%s bogus names removed",n)
+ end
+ end
+end
+actions["compact lookups"]=function(data,filename,raw)
+ if not compact_lookups then
+ report_otf("not compacting")
+ return
+ end
+ local last=0
+ local tags=table.setmetatableindex({},
+ function(t,k)
+ last=last+1
+ t[k]=last
+ return last
+ end
+ )
+ local descriptions=data.descriptions
+ local resources=data.resources
+ for u,d in next,descriptions do
+ local slookups=d.slookups
+ if type(slookups)=="table" then
+ local s={}
+ for k,v in next,slookups do
+ s[tags[k]]=v
+ end
+ d.slookups=s
+ end
+ local mlookups=d.mlookups
+ if type(mlookups)=="table" then
+ local m={}
+ for k,v in next,mlookups do
+ m[tags[k]]=v
+ end
+ d.mlookups=m
+ end
+ local kerns=d.kerns
+ if type(kerns)=="table" then
+ local t={}
+ for k,v in next,kerns do
+ t[tags[k]]=v
+ end
+ d.kerns=t
+ end
+ end
+ local lookups=data.lookups
+ if lookups then
+ local l={}
+ for k,v in next,lookups do
+ local rules=v.rules
+ if rules then
+ for i=1,#rules do
+ local l=rules[i].lookups
+ if type(l)=="table" then
+ for i=1,#l do
+ l[i]=tags[l[i]]
+ end
+ end
+ end
+ end
+ l[tags[k]]=v
+ end
+ data.lookups=l
+ end
+ local lookups=resources.lookups
+ if lookups then
+ local l={}
+ for k,v in next,lookups do
+ local s=v.subtables
+ if type(s)=="table" then
+ for i=1,#s do
+ s[i]=tags[s[i]]
+ end
+ end
+ l[tags[k]]=v
+ end
+ resources.lookups=l
+ end
+ local sequences=resources.sequences
+ if sequences then
+ for i=1,#sequences do
+ local s=sequences[i]
+ local n=s.name
+ if n then
+ s.name=tags[n]
+ end
+ local t=s.subtables
+ if type(t)=="table" then
+ for i=1,#t do
+ t[i]=tags[t[i]]
+ end
+ end
+ end
+ end
+ local lookuptypes=resources.lookuptypes
+ if lookuptypes then
+ local l={}
+ for k,v in next,lookuptypes do
+ l[tags[k]]=v
+ end
+ resources.lookuptypes=l
+ end
+ local anchor_to_lookup=resources.anchor_to_lookup
+ if anchor_to_lookup then
+ for anchor,lookups in next,anchor_to_lookup do
+ local l={}
+ for lookup,value in next,lookups do
+ l[tags[lookup]]=value
+ end
+ anchor_to_lookup[anchor]=l
+ end
+ end
+ local lookup_to_anchor=resources.lookup_to_anchor
+ if lookup_to_anchor then
+ local l={}
+ for lookup,value in next,lookup_to_anchor do
+ l[tags[lookup]]=value
+ end
+ resources.lookup_to_anchor=l
+ end
+ tags=table.swapped(tags)
+ report_otf("%s lookup tags compacted",#tags)
+ resources.lookuptags=tags
+end
function otf.setfeatures(tfmdata,features)
local okay=constructors.initializefeatures("otf",tfmdata,features,trace_features,report_otf)
if okay then
@@ -8207,6 +8997,7 @@ end
local function copytotfm(data,cache_id)
if data then
local metadata=data.metadata
+ local warnings=data.warnings
local resources=data.resources
local properties=derivetable(data.properties)
local descriptions=derivetable(data.descriptions)
@@ -8281,6 +9072,7 @@ local function copytotfm(data,cache_id)
local filename=constructors.checkedfilename(resources)
local fontname=metadata.fontname
local fullname=metadata.fullname or fontname
+ local psname=fontname or fullname
local units=metadata.units_per_em or 1000
if units==0 then
units=1000
@@ -8295,8 +9087,8 @@ local function copytotfm(data,cache_id)
parameters.italicangle=italicangle
parameters.charwidth=charwidth
parameters.charxheight=charxheight
- local space=0x0020
- local emdash=0x2014
+ local space=0x0020
+ local emdash=0x2014
if monospaced then
if descriptions[space] then
spaceunits,spacer=descriptions[space].width,"space"
@@ -8343,7 +9135,7 @@ local function copytotfm(data,cache_id)
if charxheight then
parameters.x_height=charxheight
else
- local x=0x78
+ local x=0x0078
if x then
local x=descriptions[x]
if x then
@@ -8362,8 +9154,16 @@ local function copytotfm(data,cache_id)
properties.filename=filename
properties.fontname=fontname
properties.fullname=fullname
- properties.psname=fontname or fullname
+ properties.psname=psname
properties.name=filename or fullname
+ if warnings and #warnings>0 then
+ report_otf("warnings for font: %s",filename)
+ report_otf()
+ for i=1,#warnings do
+ report_otf(" %s",warnings[i])
+ end
+ report_otf()
+ end
return {
characters=characters,
descriptions=descriptions,
@@ -8372,6 +9172,7 @@ local function copytotfm(data,cache_id)
resources=resources,
properties=properties,
goodies=goodies,
+ warnings=warnings,
}
end
end
@@ -8390,14 +9191,23 @@ local function otftotfm(specification)
if duplicates then
local nofduplicates,nofduplicated=0,0
for parent,list in next,duplicates do
- for i=1,#list do
- local unicode=list[i]
- if not descriptions[unicode] then
- descriptions[unicode]=descriptions[parent]
+ if type(list)=="table" then
+ local n=#list
+ for i=1,n do
+ local unicode=list[i]
+ if not descriptions[unicode] then
+ descriptions[unicode]=descriptions[parent]
+ nofduplicated=nofduplicated+1
+ end
+ end
+ nofduplicates=nofduplicates+n
+ else
+ if not descriptions[list] then
+ descriptions[list]=descriptions[parent]
nofduplicated=nofduplicated+1
end
+ nofduplicates=nofduplicates+1
end
- nofduplicates=nofduplicates+#list
end
if trace_otf and nofduplicated~=nofduplicates then
report_otf("%i extra duplicates copied out of %i",nofduplicated,nofduplicates)
@@ -8528,7 +9338,7 @@ if not modules then modules={} end modules ['font-otb']={
}
local concat=table.concat
local format,gmatch,gsub,find,match,lower,strip=string.format,string.gmatch,string.gsub,string.find,string.match,string.lower,string.strip
-local type,next,tonumber,tostring=type,next,tonumber,tostring
+local type,next,tonumber,tostring,rawget=type,next,tonumber,tostring,rawget
local lpegmatch=lpeg.match
local utfchar=utf.char
local trace_baseinit=false trackers.register("otf.baseinit",function(v) trace_baseinit=v end)
@@ -8575,36 +9385,36 @@ local function gref(descriptions,n)
return "<error in base mode tracing>"
end
end
-local function cref(feature,lookupname)
+local function cref(feature,lookuptags,lookupname)
if lookupname then
- return formatters["feature %a, lookup %a"](feature,lookupname)
+ return formatters["feature %a, lookup %a"](feature,lookuptags[lookupname])
else
return formatters["feature %a"](feature)
end
end
-local function report_alternate(feature,lookupname,descriptions,unicode,replacement,value,comment)
+local function report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,comment)
report_prepare("%s: base alternate %s => %s (%S => %S)",
- cref(feature,lookupname),
+ cref(feature,lookuptags,lookupname),
gref(descriptions,unicode),
replacement and gref(descriptions,replacement),
value,
comment)
end
-local function report_substitution(feature,lookupname,descriptions,unicode,substitution)
+local function report_substitution(feature,lookuptags,lookupname,descriptions,unicode,substitution)
report_prepare("%s: base substitution %s => %S",
- cref(feature,lookupname),
+ cref(feature,lookuptags,lookupname),
gref(descriptions,unicode),
gref(descriptions,substitution))
end
-local function report_ligature(feature,lookupname,descriptions,unicode,ligature)
+local function report_ligature(feature,lookuptags,lookupname,descriptions,unicode,ligature)
report_prepare("%s: base ligature %s => %S",
- cref(feature,lookupname),
+ cref(feature,lookuptags,lookupname),
gref(descriptions,ligature),
gref(descriptions,unicode))
end
-local function report_kern(feature,lookupname,descriptions,unicode,otherunicode,value)
+local function report_kern(feature,lookuptags,lookupname,descriptions,unicode,otherunicode,value)
report_prepare("%s: base kern %s + %s => %S",
- cref(feature,lookupname),
+ cref(feature,lookuptags,lookupname),
gref(descriptions,unicode),
gref(descriptions,otherunicode),
value)
@@ -8641,7 +9451,7 @@ local function finalize_ligatures(tfmdata,ligatures)
local characters=tfmdata.characters
local descriptions=tfmdata.descriptions
local resources=tfmdata.resources
- local unicodes=resources.unicodes
+ local unicodes=resources.unicodes
local private=resources.private
local alldone=false
while not alldone do
@@ -8677,12 +9487,12 @@ local function finalize_ligatures(tfmdata,ligatures)
local secondname=firstname.."_"..secondcode
if i==size-1 then
target=unicode
- if not unicodes[secondname] then
+ if not rawget(unicodes,secondname) then
unicodes[secondname]=unicode
end
okay=true
else
- target=unicodes[secondname]
+ target=rawget(unicodes,secondname)
if not target then
break
end
@@ -8718,56 +9528,58 @@ local function finalize_ligatures(tfmdata,ligatures)
end
end
resources.private=private
+ return true
end
end
local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplist)
local characters=tfmdata.characters
local descriptions=tfmdata.descriptions
local resources=tfmdata.resources
+ local properties=tfmdata.properties
local changed=tfmdata.changed
- local unicodes=resources.unicodes
local lookuphash=resources.lookuphash
local lookuptypes=resources.lookuptypes
+ local lookuptags=resources.lookuptags
local ligatures={}
- local alternate=tonumber(value)
+ local alternate=tonumber(value) or true and 1
local defaultalt=otf.defaultbasealternate
local trace_singles=trace_baseinit and trace_singles
local trace_alternatives=trace_baseinit and trace_alternatives
local trace_ligatures=trace_baseinit and trace_ligatures
local actions={
- substitution=function(lookupdata,lookupname,description,unicode)
+ substitution=function(lookupdata,lookuptags,lookupname,description,unicode)
if trace_singles then
- report_substitution(feature,lookupname,descriptions,unicode,lookupdata)
+ report_substitution(feature,lookuptags,lookupname,descriptions,unicode,lookupdata)
end
changed[unicode]=lookupdata
end,
- alternate=function(lookupdata,lookupname,description,unicode)
+ alternate=function(lookupdata,lookuptags,lookupname,description,unicode)
local replacement=lookupdata[alternate]
if replacement then
changed[unicode]=replacement
if trace_alternatives then
- report_alternate(feature,lookupname,descriptions,unicode,replacement,value,"normal")
+ report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,"normal")
end
elseif defaultalt=="first" then
replacement=lookupdata[1]
changed[unicode]=replacement
if trace_alternatives then
- report_alternate(feature,lookupname,descriptions,unicode,replacement,value,defaultalt)
+ report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,defaultalt)
end
elseif defaultalt=="last" then
replacement=lookupdata[#data]
if trace_alternatives then
- report_alternate(feature,lookupname,descriptions,unicode,replacement,value,defaultalt)
+ report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,defaultalt)
end
else
if trace_alternatives then
- report_alternate(feature,lookupname,descriptions,unicode,replacement,value,"unknown")
+ report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,"unknown")
end
end
end,
- ligature=function(lookupdata,lookupname,description,unicode)
+ ligature=function(lookupdata,lookuptags,lookupname,description,unicode)
if trace_ligatures then
- report_ligature(feature,lookupname,descriptions,unicode,lookupdata)
+ report_ligature(feature,lookuptags,lookupname,descriptions,unicode,lookupdata)
end
ligatures[#ligatures+1]={ unicode,lookupdata }
end,
@@ -8783,7 +9595,7 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis
local lookuptype=lookuptypes[lookupname]
local action=actions[lookuptype]
if action then
- action(lookupdata,lookupname,description,unicode)
+ action(lookupdata,lookuptags,lookupname,description,unicode)
end
end
end
@@ -8798,22 +9610,24 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis
local action=actions[lookuptype]
if action then
for i=1,#lookuplist do
- action(lookuplist[i],lookupname,description,unicode)
+ action(lookuplist[i],lookuptags,lookupname,description,unicode)
end
end
end
end
end
end
- finalize_ligatures(tfmdata,ligatures)
+ properties.hasligatures=finalize_ligatures(tfmdata,ligatures)
end
local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist)
local characters=tfmdata.characters
local descriptions=tfmdata.descriptions
local resources=tfmdata.resources
- local unicodes=resources.unicodes
+ local properties=tfmdata.properties
+ local lookuptags=resources.lookuptags
local sharedkerns={}
local traceindeed=trace_baseinit and trace_kerns
+ local haskerns=false
for unicode,character in next,characters do
local description=descriptions[unicode]
local rawkerns=description.kerns
@@ -8835,13 +9649,13 @@ local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist
newkerns={ [otherunicode]=value }
done=true
if traceindeed then
- report_kern(feature,lookup,descriptions,unicode,otherunicode,value)
+ report_kern(feature,lookuptags,lookup,descriptions,unicode,otherunicode,value)
end
elseif not newkerns[otherunicode] then
newkerns[otherunicode]=value
done=true
if traceindeed then
- report_kern(feature,lookup,descriptions,unicode,otherunicode,value)
+ report_kern(feature,lookuptags,lookup,descriptions,unicode,otherunicode,value)
end
end
end
@@ -8850,12 +9664,14 @@ local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist
if done then
sharedkerns[rawkerns]=newkerns
character.kerns=newkerns
+ haskerns=true
else
sharedkerns[rawkerns]=false
end
end
end
end
+ properties.haskerns=haskerns
end
basemethods.independent={
preparesubstitutions=preparesubstitutions,
@@ -8881,13 +9697,13 @@ local function make_1(present,tree,name)
end
end
end
-local function make_2(present,tfmdata,characters,tree,name,preceding,unicode,done,lookupname)
+local function make_2(present,tfmdata,characters,tree,name,preceding,unicode,done,lookuptags,lookupname)
for k,v in next,tree do
if k=="ligature" then
local character=characters[preceding]
if not character then
if trace_baseinit then
- report_prepare("weird ligature in lookup %a, current %C, preceding %C",lookupname,v,preceding)
+ report_prepare("weird ligature in lookup %a, current %C, preceding %C",lookuptags[lookupname],v,preceding)
end
character=makefake(tfmdata,name,present)
end
@@ -8908,7 +9724,7 @@ local function make_2(present,tfmdata,characters,tree,name,preceding,unicode,don
else
local code=present[name] or unicode
local name=name.."_"..k
- make_2(present,tfmdata,characters,v,name,code,k,done,lookupname)
+ make_2(present,tfmdata,characters,v,name,code,k,done,lookuptags,lookupname)
end
end
end
@@ -8919,8 +9735,9 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis
local changed=tfmdata.changed
local lookuphash=resources.lookuphash
local lookuptypes=resources.lookuptypes
+ local lookuptags=resources.lookuptags
local ligatures={}
- local alternate=tonumber(value)
+ local alternate=tonumber(value) or true and 1
local defaultalt=otf.defaultbasealternate
local trace_singles=trace_baseinit and trace_singles
local trace_alternatives=trace_baseinit and trace_alternatives
@@ -8932,36 +9749,36 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis
for unicode,data in next,lookupdata do
if lookuptype=="substitution" then
if trace_singles then
- report_substitution(feature,lookupname,descriptions,unicode,data)
+ report_substitution(feature,lookuptags,lookupname,descriptions,unicode,data)
end
changed[unicode]=data
elseif lookuptype=="alternate" then
- local replacement=data[alternate]
+ local replacement=data[alternate]
if replacement then
changed[unicode]=replacement
if trace_alternatives then
- report_alternate(feature,lookupname,descriptions,unicode,replacement,value,"normal")
+ report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,"normal")
end
elseif defaultalt=="first" then
replacement=data[1]
changed[unicode]=replacement
if trace_alternatives then
- report_alternate(feature,lookupname,descriptions,unicode,replacement,value,defaultalt)
+ report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,defaultalt)
end
elseif defaultalt=="last" then
replacement=data[#data]
if trace_alternatives then
- report_alternate(feature,lookupname,descriptions,unicode,replacement,value,defaultalt)
+ report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,defaultalt)
end
else
if trace_alternatives then
- report_alternate(feature,lookupname,descriptions,unicode,replacement,value,"unknown")
+ report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,"unknown")
end
end
elseif lookuptype=="ligature" then
ligatures[#ligatures+1]={ unicode,data,lookupname }
if trace_ligatures then
- report_ligature(feature,lookupname,descriptions,unicode,data)
+ report_ligature(feature,lookuptags,lookupname,descriptions,unicode,data)
end
end
end
@@ -8979,7 +9796,7 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis
for i=1,nofligatures do
local ligature=ligatures[i]
local unicode,tree,lookupname=ligature[1],ligature[2],ligature[3]
- make_2(present,tfmdata,characters,tree,"ctx_"..unicode,unicode,unicode,done,lookupname)
+ make_2(present,tfmdata,characters,tree,"ctx_"..unicode,unicode,unicode,done,lookuptags,lookupname)
end
end
end
@@ -8987,7 +9804,9 @@ local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist
local characters=tfmdata.characters
local descriptions=tfmdata.descriptions
local resources=tfmdata.resources
+ local properties=tfmdata.properties
local lookuphash=resources.lookuphash
+ local lookuptags=resources.lookuptags
local traceindeed=trace_baseinit and trace_kerns
for l=1,#lookuplist do
local lookupname=lookuplist[l]
@@ -9003,7 +9822,7 @@ local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist
for otherunicode,kern in next,data do
if not kerns[otherunicode] and kern~=0 then
kerns[otherunicode]=kern
- report_kern(feature,lookup,descriptions,unicode,otherunicode,kern)
+ report_kern(feature,lookuptags,lookup,descriptions,unicode,otherunicode,kern)
end
end
else
@@ -9029,7 +9848,7 @@ local function featuresinitializer(tfmdata,value)
if true then
local starttime=trace_preparing and os.clock()
local features=tfmdata.shared.features
- local fullname=trace_preparing and tfmdata.properties.fullname
+ local fullname=tfmdata.properties.fullname or "?"
if features then
applybasemethod("initializehashes",tfmdata)
local collectlookups=otf.collectlookups
@@ -9049,20 +9868,21 @@ local function featuresinitializer(tfmdata,value)
if order then
for i=1,#order do
local feature=order[i]
- if features[feature] then
+ local value=features[feature]
+ if value then
local validlookups,lookuplist=collectlookups(rawdata,feature,script,language)
if not validlookups then
elseif basesubstitutions and basesubstitutions[feature] then
if trace_preparing then
- report_prepare("filtering base feature %a for %a",feature,fullname)
+ report_prepare("filtering base %s feature %a for %a with value %a","sub",feature,fullname,value)
end
applybasemethod("preparesubstitutions",tfmdata,feature,value,validlookups,lookuplist)
registerbasefeature(feature,value)
elseif basepositionings and basepositionings[feature] then
if trace_preparing then
- report_prepare("filtering base feature %a for %a",feature,fullname)
+ report_prepare("filtering base %a feature %a for %a with value %a","pos",feature,fullname,value)
end
- applybasemethod("preparepositionings",tfmdata,feature,features[feature],validlookups,lookuplist)
+ applybasemethod("preparepositionings",tfmdata,feature,value,validlookups,lookuplist)
registerbasefeature(feature,value)
end
end
@@ -9096,17 +9916,19 @@ end -- closure
do -- begin closure to overcome local limits and interference
-if not modules then modules={} end modules ['node-inj']={
+if not modules then modules={} end modules ['font-inj']={
version=1.001,
- comment="companion to node-ini.mkiv",
+ comment="companion to font-lib.mkiv",
author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files",
}
-local next=next
+if not nodes.properties then return end
+local next,rawget=next,rawget
local utfchar=utf.char
-local trace_injections=false trackers.register("nodes.injections",function(v) trace_injections=v end)
-local report_injections=logs.reporter("nodes","injections")
+local fastcopy=table.fastcopy
+local trace_injections=false trackers.register("fonts.injections",function(v) trace_injections=v end)
+local report_injections=logs.reporter("fonts","injections")
local attributes,nodes,node=attributes,nodes,node
fonts=fonts
local fontdata=fonts.hashes.identifiers
@@ -9114,134 +9936,347 @@ nodes.injections=nodes.injections or {}
local injections=nodes.injections
local nodecodes=nodes.nodecodes
local glyph_code=nodecodes.glyph
+local disc_code=nodecodes.disc
local kern_code=nodecodes.kern
-local nodepool=nodes.pool
+local nuts=nodes.nuts
+local nodepool=nuts.pool
local newkern=nodepool.kern
-local traverse_id=node.traverse_id
-local insert_node_before=node.insert_before
-local insert_node_after=node.insert_after
-local a_kernpair=attributes.private('kernpair')
-local a_ligacomp=attributes.private('ligacomp')
-local a_markbase=attributes.private('markbase')
-local a_markmark=attributes.private('markmark')
-local a_markdone=attributes.private('markdone')
-local a_cursbase=attributes.private('cursbase')
-local a_curscurs=attributes.private('curscurs')
-local a_cursdone=attributes.private('cursdone')
+local tonode=nuts.tonode
+local tonut=nuts.tonut
+local getfield=nuts.getfield
+local setfield=nuts.setfield
+local getnext=nuts.getnext
+local getprev=nuts.getprev
+local getid=nuts.getid
+local getfont=nuts.getfont
+local getsubtype=nuts.getsubtype
+local getchar=nuts.getchar
+local traverse_id=nuts.traverse_id
+local insert_node_before=nuts.insert_before
+local insert_node_after=nuts.insert_after
+local find_tail=nuts.tail
+local properties=nodes.properties.data
function injections.installnewkern(nk)
newkern=nk or newkern
end
-local cursives={}
-local marks={}
-local kerns={}
-function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmnext)
- local dx,dy=factor*(exit[1]-entry[1]),factor*(exit[2]-entry[2])
- local ws,wn=tfmstart.width,tfmnext.width
- local bound=#cursives+1
- start[a_cursbase]=bound
- nxt[a_curscurs]=bound
- cursives[bound]={ rlmode,dx,dy,ws,wn }
- return dx,dy,bound
+local nofregisteredkerns=0
+local nofregisteredpairs=0
+local nofregisteredmarks=0
+local nofregisteredcursives=0
+local keepregisteredcounts=false
+function injections.keepcounts()
+ keepregisteredcounts=true
+end
+function injections.resetcounts()
+ nofregisteredkerns=0
+ nofregisteredpairs=0
+ nofregisteredmarks=0
+ nofregisteredcursives=0
+ keepregisteredcounts=false
+end
+function injections.reset(n)
+ local p=rawget(properties,n)
+ if p and rawget(p,"injections") then
+ p.injections=nil
+ end
+end
+function injections.copy(target,source)
+ local sp=rawget(properties,source)
+ if sp then
+ local tp=rawget(properties,target)
+ local si=rawget(sp,"injections")
+ if si then
+ si=fastcopy(si)
+ if tp then
+ tp.injections=si
+ else
+ propertydata[target]={
+ injections=si,
+ }
+ end
+ else
+ if tp then
+ tp.injections=nil
+ end
+ end
+ end
end
-function injections.setpair(current,factor,rlmode,r2lflag,spec,tfmchr)
- local x,y,w,h=factor*spec[1],factor*spec[2],factor*spec[3],factor*spec[4]
- if x~=0 or w~=0 or y~=0 or h~=0 then
- local bound=current[a_kernpair]
- if bound then
- local kb=kerns[bound]
- kb[2],kb[3],kb[4],kb[5]=(kb[2] or 0)+x,(kb[3] or 0)+y,(kb[4] or 0)+w,(kb[5] or 0)+h
+function injections.setligaindex(n,index)
+ local p=rawget(properties,n)
+ if p then
+ local i=rawget(p,"injections")
+ if i then
+ i.ligaindex=index
+ else
+ p.injections={
+ ligaindex=index
+ }
+ end
+ else
+ properties[n]={
+ injections={
+ ligaindex=index
+ }
+ }
+ end
+end
+function injections.getligaindex(n,default)
+ local p=rawget(properties,n)
+ if p then
+ local i=rawget(p,"injections")
+ if i then
+ return i.ligaindex or default
+ end
+ end
+ return default
+end
+function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmnext)
+ local dx=factor*(exit[1]-entry[1])
+ local dy=-factor*(exit[2]-entry[2])
+ local ws,wn=tfmstart.width,tfmnext.width
+ nofregisteredcursives=nofregisteredcursives+1
+ if rlmode<0 then
+ dx=-(dx+wn)
+ else
+ dx=dx-ws
+ end
+ local p=rawget(properties,start)
+ if p then
+ local i=rawget(p,"injections")
+ if i then
+ i.cursiveanchor=true
+ else
+ p.injections={
+ cursiveanchor=true,
+ }
+ end
+ else
+ properties[start]={
+ injections={
+ cursiveanchor=true,
+ },
+ }
+ end
+ local p=rawget(properties,nxt)
+ if p then
+ local i=rawget(p,"injections")
+ if i then
+ i.cursivex=dx
+ i.cursivey=dy
else
- bound=#kerns+1
- current[a_kernpair]=bound
- kerns[bound]={ rlmode,x,y,w,h,r2lflag,tfmchr.width }
+ p.injections={
+ cursivex=dx,
+ cursivey=dy,
+ }
end
- return x,y,w,h,bound
+ else
+ properties[nxt]={
+ injections={
+ cursivex=dx,
+ cursivey=dy,
+ },
+ }
+ end
+ return dx,dy,nofregisteredcursives
+end
+function injections.setpair(current,factor,rlmode,r2lflag,spec,injection)
+ local x,y,w,h=factor*spec[1],factor*spec[2],factor*spec[3],factor*spec[4]
+ if x~=0 or w~=0 or y~=0 or h~=0 then
+ local yoffset=y-h
+ local leftkern=x
+ local rightkern=w-x
+ if leftkern~=0 or rightkern~=0 or yoffset~=0 then
+ nofregisteredpairs=nofregisteredpairs+1
+ if rlmode and rlmode<0 then
+ leftkern,rightkern=rightkern,leftkern
+ end
+ local p=rawget(properties,current)
+ if p then
+ local i=rawget(p,"injections")
+ if i then
+ if leftkern~=0 then
+ i.leftkern=(i.leftkern or 0)+leftkern
+ end
+ if rightkern~=0 then
+ i.rightkern=(i.rightkern or 0)+rightkern
+ end
+ if yoffset~=0 then
+ i.yoffset=(i.yoffset or 0)+yoffset
+ end
+ elseif leftkern~=0 or rightkern~=0 then
+ p.injections={
+ leftkern=leftkern,
+ rightkern=rightkern,
+ yoffset=yoffset,
+ }
+ else
+ p.injections={
+ yoffset=yoffset,
+ }
+ end
+ elseif leftkern~=0 or rightkern~=0 then
+ properties[current]={
+ injections={
+ leftkern=leftkern,
+ rightkern=rightkern,
+ yoffset=yoffset,
+ },
+ }
+ else
+ properties[current]={
+ injections={
+ yoffset=yoffset,
+ },
+ }
+ end
+ return x,y,w,h,nofregisteredpairs
+ end
end
return x,y,w,h
end
-function injections.setkern(current,factor,rlmode,x,tfmchr)
+function injections.setkern(current,factor,rlmode,x,injection)
local dx=factor*x
if dx~=0 then
- local bound=#kerns+1
- current[a_kernpair]=bound
- kerns[bound]={ rlmode,dx }
- return dx,bound
+ nofregisteredkerns=nofregisteredkerns+1
+ local p=rawget(properties,current)
+ if not injection then
+ injection="injections"
+ end
+ if p then
+ local i=rawget(p,injection)
+ if i then
+ i.leftkern=dx+(i.leftkern or 0)
+ else
+ p[injection]={
+ leftkern=dx,
+ }
+ end
+ else
+ properties[current]={
+ [injection]={
+ leftkern=dx,
+ },
+ }
+ end
+ return dx,nofregisteredkerns
else
return 0,0
end
end
-function injections.setmark(start,base,factor,rlmode,ba,ma)
+function injections.setmark(start,base,factor,rlmode,ba,ma,tfmbase)
local dx,dy=factor*(ba[1]-ma[1]),factor*(ba[2]-ma[2])
- local bound=base[a_markbase]
- local index=1
- if bound then
- local mb=marks[bound]
- if mb then
- index=#mb+1
- mb[index]={ dx,dy,rlmode }
- start[a_markmark]=bound
- start[a_markdone]=index
- return dx,dy,bound
+ nofregisteredmarks=nofregisteredmarks+1
+ if rlmode>=0 then
+ dx=tfmbase.width-dx
+ end
+ local p=rawget(properties,start)
+ if p then
+ local i=rawget(p,"injections")
+ if i then
+ i.markx=dx
+ i.marky=dy
+ i.markdir=rlmode or 0
+ i.markbase=nofregisteredmarks
+ i.markbasenode=base
else
- report_injections("possible problem, %U is base mark without data (id %a)",base.char,bound)
+ p.injections={
+ markx=dx,
+ marky=dy,
+ markdir=rlmode or 0,
+ markbase=nofregisteredmarks,
+ markbasenode=base,
+ }
end
+ else
+ properties[start]={
+ injections={
+ markx=dx,
+ marky=dy,
+ markdir=rlmode or 0,
+ markbase=nofregisteredmarks,
+ markbasenode=base,
+ },
+ }
end
- index=index or 1
- bound=#marks+1
- base[a_markbase]=bound
- start[a_markmark]=bound
- start[a_markdone]=index
- marks[bound]={ [index]={ dx,dy,rlmode } }
- return dx,dy,bound
+ return dx,dy,nofregisteredmarks
end
local function dir(n)
return (n and n<0 and "r-to-l") or (n and n>0 and "l-to-r") or "unset"
end
-local function trace(head)
- report_injections("begin run")
- for n in traverse_id(glyph_code,head) do
- if n.subtype<256 then
- local kp=n[a_kernpair]
- local mb=n[a_markbase]
- local mm=n[a_markmark]
- local md=n[a_markdone]
- local cb=n[a_cursbase]
- local cc=n[a_curscurs]
- local char=n.char
- report_injections("font %s, char %U, glyph %c",n.font,char,char)
- if kp then
- local k=kerns[kp]
- if k[3] then
- report_injections(" pairkern: dir %a, x %p, y %p, w %p, h %p",dir(k[1]),k[2],k[3],k[4],k[5])
- else
- report_injections(" kern: dir %a, dx %p",dir(k[1]),k[2])
- end
- end
- if mb then
- report_injections(" markbase: bound %a",mb)
- end
- if mm then
- local m=marks[mm]
- if mb then
- local m=m[mb]
- if m then
- report_injections(" markmark: bound %a, index %a, dx %p, dy %p",mm,md,m[1],m[2])
- else
- report_injections(" markmark: bound %a, missing index",mm)
- end
- else
- m=m[1]
- report_injections(" markmark: bound %a, dx %p, dy %p",mm,m and m[1],m and m[2])
- end
+local function showchar(n,nested)
+ local char=getchar(n)
+ report_injections("%wfont %s, char %U, glyph %c",nested and 2 or 0,getfont(n),char,char)
+end
+local function show(n,what,nested,symbol)
+ if n then
+ local p=rawget(properties,n)
+ if p then
+ local i=rawget(p,what)
+ if i then
+ local leftkern=i.leftkern or 0
+ local rightkern=i.rightkern or 0
+ local yoffset=i.yoffset or 0
+ local markx=i.markx or 0
+ local marky=i.marky or 0
+ local markdir=i.markdir or 0
+ local markbase=i.markbase or 0
+ local cursivex=i.cursivex or 0
+ local cursivey=i.cursivey or 0
+ local ligaindex=i.ligaindex or 0
+ local margin=nested and 4 or 2
+ if rightkern~=0 or yoffset~=0 then
+ report_injections("%w%s pair: lx %p, rx %p, dy %p",margin,symbol,leftkern,rightkern,yoffset)
+ elseif leftkern~=0 then
+ report_injections("%w%s kern: dx %p",margin,symbol,leftkern)
+ end
+ if markx~=0 or marky~=0 or markbase~=0 then
+ report_injections("%w%s mark: dx %p, dy %p, dir %s, base %s",margin,symbol,markx,marky,markdir,markbase~=0 and "yes" or "no")
+ end
+ if cursivex~=0 or cursivey~=0 then
+ report_injections("%w%s curs: dx %p, dy %p",margin,symbol,cursivex,cursivey)
+ end
+ if ligaindex~=0 then
+ report_injections("%w%s liga: index %i",margin,symbol,ligaindex)
+ end
+ end
+ end
+ end
+end
+local function showsub(n,what,where)
+ report_injections("begin subrun: %s",where)
+ for n in traverse_id(glyph_code,n) do
+ showchar(n,where)
+ show(n,what,where," ")
+ end
+ report_injections("end subrun")
+end
+local function trace(head,where)
+ report_injections("begin run %s: %s kerns, %s pairs, %s marks and %s cursives registered",
+ where or "",nofregisteredkerns,nofregisteredpairs,nofregisteredmarks,nofregisteredcursives)
+ local n=head
+ while n do
+ local id=getid(n)
+ if id==glyph_code then
+ showchar(n)
+ show(n,"injections",false," ")
+ show(n,"preinjections",false,"<")
+ show(n,"postinjections",false,">")
+ show(n,"replaceinjections",false,"=")
+ elseif id==disc_code then
+ local pre=getfield(n,"pre")
+ local post=getfield(n,"post")
+ local replace=getfield(n,"replace")
+ if pre then
+ showsub(pre,"preinjections","pre")
end
- if cb then
- report_injections(" cursbase: bound %a",cb)
+ if post then
+ showsub(post,"postinjections","post")
end
- if cc then
- local c=cursives[cc]
- report_injections(" curscurs: bound %a, dir %a, dx %p, dy %p",cc,dir(c[1]),c[2],c[3])
+ if replace then
+ showsub(replace,"replaceinjections","replace")
end
end
+ n=getnext(n)
end
report_injections("end run")
end
@@ -9249,307 +10284,586 @@ local function show_result(head)
local current=head
local skipping=false
while current do
- local id=current.id
+ local id=getid(current)
if id==glyph_code then
- report_injections("char: %C, width %p, xoffset %p, yoffset %p",current.char,current.width,current.xoffset,current.yoffset)
+ report_injections("char: %C, width %p, xoffset %p, yoffset %p",
+ getchar(current),getfield(current,"width"),getfield(current,"xoffset"),getfield(current,"yoffset"))
skipping=false
elseif id==kern_code then
- report_injections("kern: %p",current.kern)
+ report_injections("kern: %p",getfield(current,"kern"))
skipping=false
elseif not skipping then
report_injections()
skipping=true
end
- current=current.next
+ current=getnext(current)
end
end
-function injections.handler(head,where,keep)
- local has_marks,has_cursives,has_kerns=next(marks),next(cursives),next(kerns)
- if has_marks or has_cursives then
- if trace_injections then
- trace(head)
- end
- local done,ky,rl,valid,cx,wx,mk,nofvalid=false,{},{},{},{},{},{},0
- if has_kerns then
- local nf,tm=nil,nil
- for n in traverse_id(glyph_code,head) do
- if n.subtype<256 then
- nofvalid=nofvalid+1
- valid[nofvalid]=n
- if n.font~=nf then
- nf=n.font
- tm=fontdata[nf].resources.marks
- end
- if tm then
- mk[n]=tm[n.char]
+local function collect_glyphs_1(head)
+ local glyphs,nofglyphs={},0
+ local marks,nofmarks={},0
+ local nf,tm=nil,nil
+ for n in traverse_id(glyph_code,head) do
+ if getsubtype(n)<256 then
+ local f=getfont(n)
+ if f~=nf then
+ nf=f
+ tm=fontdata[nf].resources.marks
+ end
+ if tm and tm[getchar(n)] then
+ nofmarks=nofmarks+1
+ marks[nofmarks]=n
+ else
+ nofglyphs=nofglyphs+1
+ glyphs[nofglyphs]=n
+ end
+ local p=rawget(properties,n)
+ if p then
+ local i=rawget(p,"injections")
+ if i then
+ local yoffset=i.yoffset
+ if yoffset and yoffset~=0 then
+ setfield(n,"yoffset",yoffset)
end
- local k=n[a_kernpair]
- if k then
- local kk=kerns[k]
- if kk then
- local x,y,w,h=kk[2] or 0,kk[3] or 0,kk[4] or 0,kk[5] or 0
- local dy=y-h
- if dy~=0 then
- ky[n]=dy
- end
- if w~=0 or x~=0 then
- wx[n]=kk
+ end
+ end
+ end
+ end
+ return glyphs,nofglyphs,marks,nofmarks
+end
+local function collect_glyphs_2(head)
+ local glyphs,nofglyphs={},0
+ local marks,nofmarks={},0
+ local nf,tm=nil,nil
+ for n in traverse_id(glyph_code,head) do
+ if getsubtype(n)<256 then
+ local f=getfont(n)
+ if f~=nf then
+ nf=f
+ tm=fontdata[nf].resources.marks
+ end
+ if tm and tm[getchar(n)] then
+ nofmarks=nofmarks+1
+ marks[nofmarks]=n
+ else
+ nofglyphs=nofglyphs+1
+ glyphs[nofglyphs]=n
+ end
+ end
+ end
+ return glyphs,nofglyphs,marks,nofmarks
+end
+local function inject_marks(marks,nofmarks)
+ for i=1,nofmarks do
+ local n=marks[i]
+ local pn=rawget(properties,n)
+ if pn then
+ pn=rawget(pn,"injections")
+ if pn then
+ local p=pn.markbasenode
+ if p then
+ local px=getfield(p,"xoffset")
+ local ox=0
+ local rightkern=nil
+ local pp=rawget(properties,p)
+ if pp then
+ pp=rawget(pp,"injections")
+ if pp then
+ rightkern=pp.rightkern
+ end
+ end
+ if rightkern then
+ if pn.markdir<0 then
+ ox=px-pn.markx-rightkern
+ else
+ local leftkern=pp.leftkern
+ if leftkern then
+ ox=px-pn.markx
+ else
+ ox=px-pn.markx-leftkern
end
- rl[n]=kk[1]
end
+ else
+ ox=px-pn.markx
+ local wn=getfield(n,"width")
+ if wn~=0 then
+ pn.leftkern=-wn/2
+ pn.rightkern=-wn/2
+ end
+ end
+ setfield(n,"xoffset",ox)
+ local py=getfield(p,"yoffset")
+ local oy=0
+ if marks[p] then
+ oy=py+pn.marky
+ else
+ oy=getfield(n,"yoffset")+py+pn.marky
end
+ setfield(n,"yoffset",oy)
+ else
end
end
- else
- local nf,tm=nil,nil
- for n in traverse_id(glyph_code,head) do
- if n.subtype<256 then
- nofvalid=nofvalid+1
- valid[nofvalid]=n
- if n.font~=nf then
- nf=n.font
- tm=fontdata[nf].resources.marks
+ end
+ end
+end
+local function inject_cursives(glyphs,nofglyphs)
+ local cursiveanchor,lastanchor=nil,nil
+ local minc,maxc,last=0,0,nil
+ for i=1,nofglyphs do
+ local n=glyphs[i]
+ local pn=rawget(properties,n)
+ if pn then
+ pn=rawget(pn,"injections")
+ end
+ if pn then
+ local cursivex=pn.cursivex
+ if cursivex then
+ if cursiveanchor then
+ if cursivex~=0 then
+ pn.leftkern=(pn.leftkern or 0)+cursivex
end
- if tm then
- mk[n]=tm[n.char]
+ if lastanchor then
+ if maxc==0 then
+ minc=lastanchor
+ end
+ maxc=lastanchor
+ properties[cursiveanchor].cursivedy=pn.cursivey
end
+ last=n
+ else
+ maxc=0
+ end
+ elseif maxc>0 then
+ local ny=getfield(n,"yoffset")
+ for i=maxc,minc,-1 do
+ local ti=glyphs[i]
+ ny=ny+properties[ti].cursivedy
+ setfield(ti,"yoffset",ny)
end
+ maxc=0
end
+ if pn.cursiveanchor then
+ cursiveanchor=n
+ lastanchor=i
+ else
+ cursiveanchor=nil
+ lastanchor=nil
+ if maxc>0 then
+ local ny=getfield(n,"yoffset")
+ for i=maxc,minc,-1 do
+ local ti=glyphs[i]
+ ny=ny+properties[ti].cursivedy
+ setfield(ti,"yoffset",ny)
+ end
+ maxc=0
+ end
+ end
+ elseif maxc>0 then
+ local ny=getfield(n,"yoffset")
+ for i=maxc,minc,-1 do
+ local ti=glyphs[i]
+ ny=ny+properties[ti].cursivedy
+ setfield(ti,"yoffset",getfield(ti,"yoffset")+ny)
+ end
+ maxc=0
+ cursiveanchor=nil
+ lastanchor=nil
end
- if nofvalid>0 then
- local cx={}
- if has_kerns and next(ky) then
- for n,k in next,ky do
- n.yoffset=k
+ end
+ if last and maxc>0 then
+ local ny=getfield(last,"yoffset")
+ for i=maxc,minc,-1 do
+ local ti=glyphs[i]
+ ny=ny+properties[ti].cursivedy
+ setfield(ti,"yoffset",ny)
+ end
+ end
+end
+local function inject_kerns(head,glyphs,nofglyphs)
+ for i=1,#glyphs do
+ local n=glyphs[i]
+ local pn=rawget(properties,n)
+ if pn then
+ local i=rawget(pn,"injections")
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ insert_node_before(head,n,newkern(leftkern))
+ end
+ local rightkern=i.rightkern
+ if rightkern and rightkern~=0 then
+ insert_node_after(head,n,newkern(rightkern))
end
end
- if has_cursives then
- local p_cursbase,p=nil,nil
- local t,d,maxt={},{},0
- for i=1,nofvalid do
- local n=valid[i]
- if not mk[n] then
- local n_cursbase=n[a_cursbase]
- if p_cursbase then
- local n_curscurs=n[a_curscurs]
- if p_cursbase==n_curscurs then
- local c=cursives[n_curscurs]
- if c then
- local rlmode,dx,dy,ws,wn=c[1],c[2],c[3],c[4],c[5]
- if rlmode>=0 then
- dx=dx-ws
- else
- dx=dx+wn
- end
- if dx~=0 then
- cx[n]=dx
- rl[n]=rlmode
- end
- dy=-dy
- maxt=maxt+1
- t[maxt]=p
- d[maxt]=dy
- else
- maxt=0
+ end
+ end
+end
+local function inject_everything(head,where)
+ head=tonut(head)
+ if trace_injections then
+ trace(head,"everything")
+ end
+ local glyphs,nofglyphs,marks,nofmarks
+ if nofregisteredpairs>0 then
+ glyphs,nofglyphs,marks,nofmarks=collect_glyphs_1(head)
+ else
+ glyphs,nofglyphs,marks,nofmarks=collect_glyphs_2(head)
+ end
+ if nofglyphs>0 then
+ if nofregisteredcursives>0 then
+ inject_cursives(glyphs,nofglyphs)
+ end
+ if nofregisteredmarks>0 then
+ inject_marks(marks,nofmarks)
+ end
+ inject_kerns(head,glyphs,nofglyphs)
+ end
+ if keepregisteredcounts then
+ keepregisteredcounts=false
+ else
+ nofregisteredkerns=0
+ nofregisteredpairs=0
+ nofregisteredmarks=0
+ nofregisteredcursives=0
+ end
+ return tonode(head),true
+end
+local function inject_kerns_only(head,where)
+ head=tonut(head)
+ if trace_injections then
+ trace(head,"kerns")
+ end
+ local n=head
+ local p=nil
+ while n do
+ local id=getid(n)
+ if id==glyph_code then
+ if getsubtype(n)<256 then
+ local pn=rawget(properties,n)
+ if pn then
+ if p then
+ local d=getfield(p,"post")
+ if d then
+ local i=rawget(pn,"postinjections")
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ local t=find_tail(d)
+ insert_node_after(d,t,newkern(leftkern))
end
end
- elseif maxt>0 then
- local ny=n.yoffset
- for i=maxt,1,-1 do
- ny=ny+d[i]
- local ti=t[i]
- ti.yoffset=ti.yoffset+ny
- end
- maxt=0
- end
- if not n_cursbase and maxt>0 then
- local ny=n.yoffset
- for i=maxt,1,-1 do
- ny=ny+d[i]
- local ti=t[i]
- ti.yoffset=ny
- end
- maxt=0
- end
- p_cursbase,p=n_cursbase,n
- end
- end
- if maxt>0 then
- local ny=n.yoffset
- for i=maxt,1,-1 do
- ny=ny+d[i]
- local ti=t[i]
- ti.yoffset=ny
- end
- maxt=0
- end
- if not keep then
- cursives={}
- end
- end
- if has_marks then
- for i=1,nofvalid do
- local p=valid[i]
- local p_markbase=p[a_markbase]
- if p_markbase then
- local mrks=marks[p_markbase]
- local nofmarks=#mrks
- for n in traverse_id(glyph_code,p.next) do
- local n_markmark=n[a_markmark]
- if p_markbase==n_markmark then
- local index=n[a_markdone] or 1
- local d=mrks[index]
- if d then
- local rlmode=d[3]
- local k=wx[p]
- if k then
- local x=k[2]
- local w=k[4]
- if w then
- if rlmode and rlmode>=0 then
- n.xoffset=p.xoffset-p.width+d[1]-(w-x)
- else
- n.xoffset=p.xoffset-d[1]-x
- end
- else
- if rlmode and rlmode>=0 then
- n.xoffset=p.xoffset-p.width+d[1]
- else
- n.xoffset=p.xoffset-d[1]-x
- end
- end
- else
- if rlmode and rlmode>=0 then
- n.xoffset=p.xoffset-p.width+d[1]
- else
- n.xoffset=p.xoffset-d[1]
- end
- local w=n.width
- if w~=0 then
- insert_node_before(head,n,newkern(-w/2))
- insert_node_after(head,n,newkern(-w/2))
- end
- end
- if mk[p] then
- n.yoffset=p.yoffset+d[2]
- else
- n.yoffset=n.yoffset+p.yoffset+d[2]
- end
- if nofmarks==1 then
- break
- else
- nofmarks=nofmarks-1
- end
+ end
+ local d=getfield(p,"replace")
+ if d then
+ local i=rawget(pn,"replaceinjections")
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ local t=find_tail(d)
+ insert_node_after(d,t,newkern(leftkern))
+ end
+ end
+ else
+ local i=rawget(pn,"injections")
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ setfield(p,"replace",newkern(leftkern))
end
- else
+ end
+ end
+ else
+ local i=rawget(pn,"injections")
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ head=insert_node_before(head,n,newkern(leftkern))
end
end
end
end
- if not keep then
- marks={}
+ else
+ break
+ end
+ p=nil
+ elseif id==disc_code then
+ local d=getfield(n,"pre")
+ if d then
+ local h=d
+ for n in traverse_id(glyph_code,d) do
+ if getsubtype(n)<256 then
+ local pn=rawget(properties,n)
+ if pn then
+ local i=rawget(pn,"preinjections")
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ h=insert_node_before(h,n,newkern(leftkern))
+ end
+ end
+ end
+ else
+ break
+ end
+ end
+ if h~=d then
+ setfield(n,"pre",h)
end
end
- if next(wx) then
- for n,k in next,wx do
- local x=k[2]
- local w=k[4]
- if w then
- local rl=k[1]
- local wx=w-x
- if rl<0 then
- if wx~=0 then
- insert_node_before(head,n,newkern(wx))
+ local d=getfield(n,"post")
+ if d then
+ local h=d
+ for n in traverse_id(glyph_code,d) do
+ if getsubtype(n)<256 then
+ local pn=rawget(properties,n)
+ if pn then
+ local i=rawget(pn,"postinjections")
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ h=insert_node_before(h,n,newkern(leftkern))
+ end
end
- if x~=0 then
- insert_node_after (head,n,newkern(x))
+ end
+ else
+ break
+ end
+ end
+ if h~=d then
+ setfield(n,"post",h)
+ end
+ end
+ local d=getfield(n,"replace")
+ if d then
+ local h=d
+ for n in traverse_id(glyph_code,d) do
+ if getsubtype(n)<256 then
+ local pn=rawget(properties,n)
+ if pn then
+ local i=rawget(pn,"replaceinjections")
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ h=insert_node_before(h,n,newkern(leftkern))
+ end
+ end
+ end
+ else
+ break
+ end
+ end
+ if h~=d then
+ setfield(n,"replace",h)
+ end
+ end
+ p=n
+ else
+ p=nil
+ end
+ n=getnext(n)
+ end
+ if keepregisteredcounts then
+ keepregisteredcounts=false
+ else
+ nofregisteredkerns=0
+ end
+ return tonode(head),true
+end
+local function inject_pairs_only(head,where)
+ head=tonut(head)
+ if trace_injections then
+ trace(head,"pairs")
+ end
+ local n=head
+ local p=nil
+ while n do
+ local id=getid(n)
+ if id==glyph_code then
+ if getsubtype(n)<256 then
+ local pn=rawget(properties,n)
+ if pn then
+ if p then
+ local d=getfield(p,"post")
+ if d then
+ local i=rawget(pn,"postinjections")
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ local t=find_tail(d)
+ insert_node_after(d,t,newkern(leftkern))
+ end
+ end
+ end
+ local d=getfield(p,"replace")
+ if d then
+ local i=rawget(pn,"replaceinjections")
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ local t=find_tail(d)
+ insert_node_after(d,t,newkern(leftkern))
+ end
end
else
- if x~=0 then
- insert_node_before(head,n,newkern(x))
+ local i=rawget(pn,"injections")
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ setfield(p,"replace",newkern(leftkern))
+ end
+ end
+ end
+ else
+ local i=rawget(pn,"injections")
+ if i then
+ local yoffset=i.yoffset
+ if yoffset and yoffset~=0 then
+ setfield(n,"yoffset",yoffset)
+ end
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ insert_node_before(head,n,newkern(leftkern))
end
- if wx~=0 then
- insert_node_after (head,n,newkern(wx))
+ local rightkern=i.rightkern
+ if rightkern and rightkern~=0 then
+ insert_node_after(head,n,newkern(rightkern))
+ n=getnext(n)
end
end
- elseif x~=0 then
- insert_node_before(head,n,newkern(x))
end
end
+ else
+ break
end
- if next(cx) then
- for n,k in next,cx do
- if k~=0 then
- local rln=rl[n]
- if rln and rln<0 then
- insert_node_before(head,n,newkern(-k))
- else
- insert_node_before(head,n,newkern(k))
+ p=nil
+ elseif id==disc_code then
+ local d=getfield(n,"pre")
+ if d then
+ local h=d
+ for n in traverse_id(glyph_code,d) do
+ if getsubtype(n)<256 then
+ local p=rawget(properties,n)
+ if p then
+ local i=rawget(p,"preinjections")
+ if i then
+ local yoffset=i.yoffset
+ if yoffset and yoffset~=0 then
+ setfield(n,"yoffset",yoffset)
+ end
+ local leftkern=i.leftkern
+ if leftkern~=0 then
+ h=insert_node_before(h,n,newkern(leftkern))
+ end
+ local rightkern=i.rightkern
+ if rightkern and rightkern~=0 then
+ insert_node_after(head,n,newkern(rightkern))
+ n=getnext(n)
+ end
+ end
end
+ else
+ break
end
end
+ if h~=d then
+ setfield(n,"pre",h)
+ end
end
- if not keep then
- kerns={}
- end
- return head,true
- elseif not keep then
- kerns,cursives,marks={},{},{}
- end
- elseif has_kerns then
- if trace_injections then
- trace(head)
- end
- for n in traverse_id(glyph_code,head) do
- if n.subtype<256 then
- local k=n[a_kernpair]
- if k then
- local kk=kerns[k]
- if kk then
- local rl,x,y,w=kk[1],kk[2] or 0,kk[3],kk[4]
- if y and y~=0 then
- n.yoffset=y
- end
- if w then
- local wx=w-x
- if rl<0 then
- if wx~=0 then
- insert_node_before(head,n,newkern(wx))
- end
- if x~=0 then
- insert_node_after (head,n,newkern(x))
+ local d=getfield(n,"post")
+ if d then
+ local h=d
+ for n in traverse_id(glyph_code,d) do
+ if getsubtype(n)<256 then
+ local p=rawget(properties,n)
+ if p then
+ local i=rawget(p,"postinjections")
+ if i then
+ local yoffset=i.yoffset
+ if yoffset and yoffset~=0 then
+ setfield(n,"yoffset",yoffset)
end
- else
- if x~=0 then
- insert_node_before(head,n,newkern(x))
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ h=insert_node_before(h,n,newkern(leftkern))
end
- if wx~=0 then
- insert_node_after(head,n,newkern(wx))
+ local rightkern=i.rightkern
+ if rightkern and rightkern~=0 then
+ insert_node_after(head,n,newkern(rightkern))
+ n=getnext(n)
end
end
- else
- if x~=0 then
- insert_node_before(head,n,newkern(x))
+ end
+ else
+ break
+ end
+ end
+ if h~=d then
+ setfield(n,"post",h)
+ end
+ end
+ local d=getfield(n,"replace")
+ if d then
+ local h=d
+ for n in traverse_id(glyph_code,d) do
+ if getsubtype(n)<256 then
+ local p=rawget(properties,n)
+ if p then
+ local i=rawget(pn,"replaceinjections")
+ if i then
+ local yoffset=i.yoffset
+ if yoffset and yoffset~=0 then
+ setfield(n,"yoffset",yoffset)
+ end
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ h=insert_node_before(h,n,newkern(leftkern))
+ end
+ local rightkern=i.rightkern
+ if rightkern and rightkern~=0 then
+ insert_node_after(head,n,newkern(rightkern))
+ n=getnext(n)
+ end
end
end
+ else
+ break
end
end
+ if h~=d then
+ setfield(n,"replace",h)
+ end
end
+ p=n
+ else
+ p=nil
end
- if not keep then
- kerns={}
- end
- return head,true
+ n=getnext(n)
+ end
+ if keepregisteredcounts then
+ keepregisteredcounts=false
else
+ nofregisteredpairs=0
+ nofregisteredkerns=0
+ end
+ return tonode(head),true
+end
+function injections.handler(head,where)
+ if nofregisteredmarks>0 or nofregisteredcursives>0 then
+ return inject_everything(head,where)
+ elseif nofregisteredpairs>0 then
+ return inject_pairs_only(head,where)
+ elseif nofregisteredkerns>0 then
+ return inject_kerns_only(head,where)
+ else
+ return head,false
end
- return head,false
end
end -- closure
do -- begin closure to overcome local limits and interference
-if not modules then modules={} end modules ['font-ota']={
+if not modules then modules={} end modules ['font-otx']={
version=1.001,
comment="companion to font-otf.lua (analysing)",
author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -9568,13 +10882,24 @@ analyzers.initializers=initializers
analyzers.methods=methods
analyzers.useunicodemarks=false
local a_state=attributes.private('state')
+local nuts=nodes.nuts
+local tonut=nuts.tonut
+local getfield=nuts.getfield
+local getnext=nuts.getnext
+local getprev=nuts.getprev
+local getid=nuts.getid
+local getprop=nuts.getprop
+local setprop=nuts.setprop
+local getfont=nuts.getfont
+local getsubtype=nuts.getsubtype
+local getchar=nuts.getchar
+local traverse_id=nuts.traverse_id
+local traverse_node_list=nuts.traverse
+local end_of_math=nuts.end_of_math
local nodecodes=nodes.nodecodes
local glyph_code=nodecodes.glyph
local disc_code=nodecodes.disc
local math_code=nodecodes.math
-local traverse_id=node.traverse_id
-local traverse_node_list=node.traverse
-local end_of_math=node.end_of_math
local fontdata=fonts.hashes.identifiers
local categories=characters and characters.categories or {}
local otffeatures=fonts.constructors.newfeatures("otf")
@@ -9616,51 +10941,52 @@ function analyzers.setstate(head,font)
local tfmdata=fontdata[font]
local descriptions=tfmdata.descriptions
local first,last,current,n,done=nil,nil,head,0,false
+ current=tonut(current)
while current do
- local id=current.id
- if id==glyph_code and current.font==font then
+ local id=getid(current)
+ if id==glyph_code and getfont(current)==font then
done=true
- local char=current.char
+ local char=getchar(current)
local d=descriptions[char]
if d then
if d.class=="mark" or (useunicodemarks and categories[char]=="mn") then
done=true
- current[a_state]=s_mark
+ setprop(current,a_state,s_mark)
elseif n==0 then
first,last,n=current,current,1
- current[a_state]=s_init
+ setprop(current,a_state,s_init)
else
last,n=current,n+1
- current[a_state]=s_medi
+ setprop(current,a_state,s_medi)
end
else
if first and first==last then
- last[a_state]=s_isol
+ setprop(last,a_state,s_isol)
elseif last then
- last[a_state]=s_fina
+ setprop(last,a_state,s_fina)
end
first,last,n=nil,nil,0
end
elseif id==disc_code then
- current[a_state]=s_medi
+ setprop(current,a_state,s_medi)
last=current
else
if first and first==last then
- last[a_state]=s_isol
+ setprop(last,a_state,s_isol)
elseif last then
- last[a_state]=s_fina
+ setprop(last,a_state,s_fina)
end
first,last,n=nil,nil,0
if id==math_code then
current=end_of_math(current)
end
end
- current=current.next
+ current=getnext(current)
end
if first and first==last then
- last[a_state]=s_isol
+ setprop(last,a_state,s_isol)
elseif last then
- last[a_state]=s_fina
+ setprop(last,a_state,s_fina)
end
return head,done
end
@@ -9716,6 +11042,7 @@ local isolated={
[0x0856]=true,[0x0858]=true,[0x0857]=true,
[0x07FA]=true,
[zwnj]=true,
+ [0x08AD]=true,
}
local final={
[0x0622]=true,[0x0623]=true,[0x0624]=true,[0x0625]=true,
@@ -9733,15 +11060,16 @@ local final={
[0x06D3]=true,[0x06D5]=true,[0x06EE]=true,[0x06EF]=true,
[0x0759]=true,[0x075A]=true,[0x075B]=true,[0x076B]=true,
[0x076C]=true,[0x0771]=true,[0x0773]=true,[0x0774]=true,
- [0x0778]=true,[0x0779]=true,
+ [0x0778]=true,[0x0779]=true,
[0x08AA]=true,[0x08AB]=true,[0x08AC]=true,
[0xFEF5]=true,[0xFEF7]=true,[0xFEF9]=true,[0xFEFB]=true,
- [0x0710]=true,[0x0715]=true,[0x0716]=true,[0x0717]=true,
- [0x0718]=true,[0x0719]=true,[0x0728]=true,[0x072A]=true,
- [0x072C]=true,[0x071E]=true,
+ [0x0710]=true,[0x0715]=true,[0x0716]=true,[0x0717]=true,
+ [0x0718]=true,[0x0719]=true,[0x0728]=true,[0x072A]=true,
+ [0x072C]=true,[0x071E]=true,
[0x072F]=true,[0x074D]=true,
[0x0840]=true,[0x0849]=true,[0x0854]=true,[0x0846]=true,
- [0x084F]=true
+ [0x084F]=true,
+ [0x08AE]=true,[0x08B1]=true,[0x08B2]=true,
}
local medial={
[0x0626]=true,[0x0628]=true,[0x062A]=true,[0x062B]=true,
@@ -9801,12 +11129,12 @@ local medial={
[0x07D2]=true,[0x07D0]=true,[0x07CF]=true,[0x07CD]=true,
[0x07CB]=true,[0x07D3]=true,[0x07E4]=true,[0x07D5]=true,
[0x07E6]=true,
- [tatweel]=true,
- [zwj]=true,
+ [tatweel]=true,[zwj]=true,
+ [0x08A1]=true,[0x08AF]=true,[0x08B0]=true,
}
local arab_warned={}
local function warning(current,what)
- local char=current.char
+ local char=getchar(current)
if not arab_warned[char] then
log.report("analyze","arab: character %C has no %a class",char,what)
arab_warned[char]=true
@@ -9815,30 +11143,30 @@ end
local function finish(first,last)
if last then
if first==last then
- local fc=first.char
+ local fc=getchar(first)
if medial[fc] or final[fc] then
- first[a_state]=s_isol
+ setprop(first,a_state,s_isol)
else
warning(first,"isol")
- first[a_state]=s_error
+ setprop(first,a_state,s_error)
end
else
- local lc=last.char
+ local lc=getchar(last)
if medial[lc] or final[lc] then
- last[a_state]=s_fina
+ setprop(last,a_state,s_fina)
else
warning(last,"fina")
- last[a_state]=s_error
+ setprop(last,a_state,s_error)
end
end
first,last=nil,nil
elseif first then
- local fc=first.char
+ local fc=getchar(first)
if medial[fc] or final[fc] then
- first[a_state]=s_isol
+ setprop(first,a_state,s_isol)
else
warning(first,"isol")
- first[a_state]=s_error
+ setprop(first,a_state,s_error)
end
first=nil
end
@@ -9849,38 +11177,39 @@ function methods.arab(head,font,attr)
local tfmdata=fontdata[font]
local marks=tfmdata.resources.marks
local first,last,current,done=nil,nil,head,false
+ current=tonut(current)
while current do
- local id=current.id
- if id==glyph_code and current.font==font and current.subtype<256 and not current[a_state] then
+ local id=getid(current)
+ if id==glyph_code and getfont(current)==font and getsubtype(current)<256 and not getprop(current,a_state) then
done=true
- local char=current.char
+ local char=getchar(current)
if marks[char] or (useunicodemarks and categories[char]=="mn") then
- current[a_state]=s_mark
+ setprop(current,a_state,s_mark)
elseif isolated[char] then
first,last=finish(first,last)
- current[a_state]=s_isol
+ setprop(current,a_state,s_isol)
first,last=nil,nil
elseif not first then
if medial[char] then
- current[a_state]=s_init
+ setprop(current,a_state,s_init)
first,last=first or current,current
elseif final[char] then
- current[a_state]=s_isol
+ setprop(current,a_state,s_isol)
first,last=nil,nil
else
first,last=finish(first,last)
end
elseif medial[char] then
first,last=first or current,current
- current[a_state]=s_medi
+ setprop(current,a_state,s_medi)
elseif final[char] then
- if not last[a_state]==s_init then
- last[a_state]=s_medi
+ if getprop(last,a_state)~=s_init then
+ setprop(last,a_state,s_medi)
end
- current[a_state]=s_fina
+ setprop(current,a_state,s_fina)
first,last=nil,nil
elseif char>=0x0600 and char<=0x06FF then
- current[a_state]=s_rest
+ setprop(current,a_state,s_rest)
first,last=finish(first,last)
else
first,last=finish(first,last)
@@ -9893,7 +11222,7 @@ function methods.arab(head,font,attr)
current=end_of_math(current)
end
end
- current=current.next
+ current=getnext(current)
end
if first or last then
finish(first,last)
@@ -9950,6 +11279,7 @@ local report_chain=logs.reporter("fonts","otf chain")
local report_process=logs.reporter("fonts","otf process")
local report_prepare=logs.reporter("fonts","otf prepare")
local report_warning=logs.reporter("fonts","otf warning")
+local report_run=logs.reporter("fonts","otf run")
registertracker("otf.verbose_chain",function(v) otf.setcontextchain(v and "verbose") end)
registertracker("otf.normal_chain",function(v) otf.setcontextchain(v and "normal") end)
registertracker("otf.replacements","otf.singles,otf.multiples,otf.alternatives,otf.ligatures")
@@ -9957,12 +11287,33 @@ registertracker("otf.positions","otf.marks,otf.kerns,otf.cursive")
registertracker("otf.actions","otf.replacements,otf.positions")
registertracker("otf.injections","nodes.injections")
registertracker("*otf.sample","otf.steps,otf.actions,otf.analyzing")
-local insert_node_after=node.insert_after
-local delete_node=nodes.delete
-local copy_node=node.copy
-local find_node_tail=node.tail or node.slide
-local flush_node_list=node.flush_list
-local end_of_math=node.end_of_math
+local nuts=nodes.nuts
+local tonode=nuts.tonode
+local tonut=nuts.tonut
+local getfield=nuts.getfield
+local setfield=nuts.setfield
+local getnext=nuts.getnext
+local getprev=nuts.getprev
+local getid=nuts.getid
+local getattr=nuts.getattr
+local setattr=nuts.setattr
+local getprop=nuts.getprop
+local setprop=nuts.setprop
+local getfont=nuts.getfont
+local getsubtype=nuts.getsubtype
+local getchar=nuts.getchar
+local insert_node_before=nuts.insert_before
+local insert_node_after=nuts.insert_after
+local delete_node=nuts.delete
+local remove_node=nuts.remove
+local copy_node=nuts.copy
+local copy_node_list=nuts.copy_list
+local find_node_tail=nuts.tail
+local flush_node_list=nuts.flush_list
+local free_node=nuts.free
+local end_of_math=nuts.end_of_math
+local traverse_nodes=nuts.traverse
+local traverse_id=nuts.traverse_id
local setmetatableindex=table.setmetatableindex
local zwnj=0x200C
local zwj=0x200D
@@ -9980,25 +11331,22 @@ local math_code=nodecodes.math
local dir_code=whatcodes.dir
local localpar_code=whatcodes.localpar
local discretionary_code=disccodes.discretionary
+local regular_code=disccodes.regular
+local automatic_code=disccodes.automatic
local ligature_code=glyphcodes.ligature
local privateattribute=attributes.private
local a_state=privateattribute('state')
-local a_markbase=privateattribute('markbase')
-local a_markmark=privateattribute('markmark')
-local a_markdone=privateattribute('markdone')
-local a_cursbase=privateattribute('cursbase')
-local a_curscurs=privateattribute('curscurs')
-local a_cursdone=privateattribute('cursdone')
-local a_kernpair=privateattribute('kernpair')
-local a_ligacomp=privateattribute('ligacomp')
+local a_cursbase=privateattribute('cursbase')
local injections=nodes.injections
local setmark=injections.setmark
local setcursive=injections.setcursive
local setkern=injections.setkern
local setpair=injections.setpair
-local markonce=true
+local resetinjection=injections.reset
+local copyinjection=injections.copy
+local setligaindex=injections.setligaindex
+local getligaindex=injections.getligaindex
local cursonce=true
-local kernonce=true
local fonthashes=fonts.hashes
local fontdata=fonthashes.identifiers
local otffeatures=fonts.constructors.newfeatures("otf")
@@ -10014,6 +11362,7 @@ local currentfont=false
local lookuptable=false
local anchorlookups=false
local lookuptypes=false
+local lookuptags=false
local handlers={}
local rlmode=0
local featurevalue=false
@@ -10058,98 +11407,104 @@ local function gref(n)
end
local function cref(kind,chainname,chainlookupname,lookupname,index)
if index then
- return formatters["feature %a, chain %a, sub %a, lookup %a, index %a"](kind,chainname,chainlookupname,lookupname,index)
+ return formatters["feature %a, chain %a, sub %a, lookup %a, index %a"](kind,chainname,chainlookupname,lookuptags[lookupname],index)
elseif lookupname then
- return formatters["feature %a, chain %a, sub %a, lookup %a"](kind,chainname,chainlookupname,lookupname)
+ return formatters["feature %a, chain %a, sub %a, lookup %a"](kind,chainname,chainlookupname,lookuptags[lookupname])
elseif chainlookupname then
- return formatters["feature %a, chain %a, sub %a"](kind,chainname,chainlookupname)
+ return formatters["feature %a, chain %a, sub %a"](kind,lookuptags[chainname],lookuptags[chainlookupname])
elseif chainname then
- return formatters["feature %a, chain %a"](kind,chainname)
+ return formatters["feature %a, chain %a"](kind,lookuptags[chainname])
else
return formatters["feature %a"](kind)
end
end
local function pref(kind,lookupname)
- return formatters["feature %a, lookup %a"](kind,lookupname)
+ return formatters["feature %a, lookup %a"](kind,lookuptags[lookupname])
end
local function copy_glyph(g)
- local components=g.components
+ local components=getfield(g,"components")
if components then
- g.components=nil
+ setfield(g,"components",nil)
local n=copy_node(g)
- g.components=components
+ copyinjection(n,g)
+ setfield(g,"components",components)
return n
else
- return copy_node(g)
+ local n=copy_node(g)
+ copyinjection(n,g)
+ return n
end
end
local function markstoligature(kind,lookupname,head,start,stop,char)
- if start==stop and start.char==char then
+ if start==stop and getchar(start)==char then
return head,start
else
- local prev=start.prev
- local next=stop.next
- start.prev=nil
- stop.next=nil
+ local prev=getprev(start)
+ local next=getnext(stop)
+ setfield(start,"prev",nil)
+ setfield(stop,"next",nil)
local base=copy_glyph(start)
if head==start then
head=base
end
- base.char=char
- base.subtype=ligature_code
- base.components=start
+ resetinjection(base)
+ setfield(base,"char",char)
+ setfield(base,"subtype",ligature_code)
+ setfield(base,"components",start)
if prev then
- prev.next=base
+ setfield(prev,"next",base)
end
if next then
- next.prev=base
+ setfield(next,"prev",base)
end
- base.next=next
- base.prev=prev
+ setfield(base,"next",next)
+ setfield(base,"prev",prev)
return head,base
end
end
local function getcomponentindex(start)
- if start.id~=glyph_code then
+ if getid(start)~=glyph_code then
return 0
- elseif start.subtype==ligature_code then
+ elseif getsubtype(start)==ligature_code then
local i=0
- local components=start.components
+ local components=getfield(start,"components")
while components do
i=i+getcomponentindex(components)
- components=components.next
+ components=getnext(components)
end
return i
- elseif not marks[start.char] then
+ elseif not marks[getchar(start)] then
return 1
else
return 0
end
end
local function toligature(kind,lookupname,head,start,stop,char,markflag,discfound)
- if start==stop and start.char==char then
- start.char=char
+ if start==stop and getchar(start)==char then
+ resetinjection(start)
+ setfield(start,"char",char)
return head,start
end
- local prev=start.prev
- local next=stop.next
- start.prev=nil
- stop.next=nil
+ local prev=getprev(start)
+ local next=getnext(stop)
+ setfield(start,"prev",nil)
+ setfield(stop,"next",nil)
local base=copy_glyph(start)
if start==head then
head=base
end
- base.char=char
- base.subtype=ligature_code
- base.components=start
+ resetinjection(base)
+ setfield(base,"char",char)
+ setfield(base,"subtype",ligature_code)
+ setfield(base,"components",start)
if prev then
- prev.next=base
+ setfield(prev,"next",base)
end
if next then
- next.prev=base
+ setfield(next,"prev",base)
end
- base.next=next
- base.prev=prev
+ setfield(base,"next",next)
+ setfield(base,"prev",prev)
if not discfound then
local deletemarks=markflag~="mark"
local components=start
@@ -10158,42 +11513,43 @@ local function toligature(kind,lookupname,head,start,stop,char,markflag,discfoun
local head=base
local current=base
while start do
- local char=start.char
+ local char=getchar(start)
if not marks[char] then
baseindex=baseindex+componentindex
componentindex=getcomponentindex(start)
elseif not deletemarks then
- start[a_ligacomp]=baseindex+(start[a_ligacomp] or componentindex)
+ setligaindex(start,baseindex+getligaindex(start,componentindex))
if trace_marks then
- logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(char),start[a_ligacomp])
+ logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(char),getligaindex(start))
end
head,current=insert_node_after(head,current,copy_node(start))
elseif trace_marks then
logwarning("%s: delete mark %s",pref(kind,lookupname),gref(char))
end
- start=start.next
+ start=getnext(start)
end
- local start=current.next
- while start and start.id==glyph_code do
- local char=start.char
+ local start=getnext(current)
+ while start and getid(start)==glyph_code do
+ local char=getchar(start)
if marks[char] then
- start[a_ligacomp]=baseindex+(start[a_ligacomp] or componentindex)
+ setligaindex(start,baseindex+getligaindex(start,componentindex))
if trace_marks then
- logwarning("%s: set mark %s, gets index %s",pref(kind,lookupname),gref(char),start[a_ligacomp])
+ logwarning("%s: set mark %s, gets index %s",pref(kind,lookupname),gref(char),getligaindex(start))
end
else
break
end
- start=start.next
+ start=getnext(start)
end
end
return head,base
end
function handlers.gsub_single(head,start,kind,lookupname,replacement)
if trace_singles then
- logprocess("%s: replacing %s by single %s",pref(kind,lookupname),gref(start.char),gref(replacement))
+ logprocess("%s: replacing %s by single %s",pref(kind,lookupname),gref(getchar(start)),gref(replacement))
end
- start.char=replacement
+ resetinjection(start)
+ setfield(start,"char",replacement)
return head,start,true
end
local function get_alternative_glyph(start,alternatives,value,trace_alternatives)
@@ -10219,7 +11575,7 @@ local function get_alternative_glyph(start,alternatives,value,trace_alternatives
return false,trace_alternatives and formatters["invalid value %a, %s"](value,"out of range")
end
elseif value==0 then
- return start.char,trace_alternatives and formatters["invalid value %a, %s"](value,"no change")
+ return getchar(start),trace_alternatives and formatters["invalid value %a, %s"](value,"no change")
elseif value<1 then
return alternatives[1],trace_alternatives and formatters["invalid value %a, taking %a"](value,1)
else
@@ -10230,25 +11586,27 @@ end
local function multiple_glyphs(head,start,multiple,ignoremarks)
local nofmultiples=#multiple
if nofmultiples>0 then
- start.char=multiple[1]
+ resetinjection(start)
+ setfield(start,"char",multiple[1])
if nofmultiples>1 then
- local sn=start.next
+ local sn=getnext(start)
for k=2,nofmultiples do
local n=copy_node(start)
- n.char=multiple[k]
- n.next=sn
- n.prev=start
+ resetinjection(n)
+ setfield(n,"char",multiple[k])
+ setfield(n,"next",sn)
+ setfield(n,"prev",start)
if sn then
- sn.prev=n
+ setfield(sn,"prev",n)
end
- start.next=n
+ setfield(start,"next",n)
start=n
end
end
return head,start,true
else
if trace_multiples then
- logprocess("no multiple for %s",gref(start.char))
+ logprocess("no multiple for %s",gref(getchar(start)))
end
return head,start,false
end
@@ -10258,34 +11616,35 @@ function handlers.gsub_alternate(head,start,kind,lookupname,alternative,sequence
local choice,comment=get_alternative_glyph(start,alternative,value,trace_alternatives)
if choice then
if trace_alternatives then
- logprocess("%s: replacing %s by alternative %a to %s, %s",pref(kind,lookupname),gref(start.char),choice,gref(choice),comment)
+ logprocess("%s: replacing %s by alternative %a to %s, %s",pref(kind,lookupname),gref(getchar(start)),choice,gref(choice),comment)
end
- start.char=choice
+ resetinjection(start)
+ setfield(start,"char",choice)
else
if trace_alternatives then
- logwarning("%s: no variant %a for %s, %s",pref(kind,lookupname),value,gref(start.char),comment)
+ logwarning("%s: no variant %a for %s, %s",pref(kind,lookupname),value,gref(getchar(start)),comment)
end
end
return head,start,true
end
function handlers.gsub_multiple(head,start,kind,lookupname,multiple,sequence)
if trace_multiples then
- logprocess("%s: replacing %s by multiple %s",pref(kind,lookupname),gref(start.char),gref(multiple))
+ logprocess("%s: replacing %s by multiple %s",pref(kind,lookupname),gref(getchar(start)),gref(multiple))
end
return multiple_glyphs(head,start,multiple,sequence.flags[1])
end
function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence)
- local s,stop,discfound=start.next,nil,false
- local startchar=start.char
+ local s,stop,discfound=getnext(start),nil,false
+ local startchar=getchar(start)
if marks[startchar] then
while s do
- local id=s.id
- if id==glyph_code and s.font==currentfont and s.subtype<256 then
- local lg=ligature[s.char]
+ local id=getid(s)
+ if id==glyph_code and getfont(s)==currentfont and getsubtype(s)<256 then
+ local lg=ligature[getchar(s)]
if lg then
stop=s
ligature=lg
- s=s.next
+ s=getnext(s)
else
break
end
@@ -10297,9 +11656,9 @@ function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence)
local lig=ligature.ligature
if lig then
if trace_ligatures then
- local stopchar=stop.char
+ local stopchar=getchar(stop)
head,start=markstoligature(kind,lookupname,head,start,stop,lig)
- logprocess("%s: replacing %s upto %s by ligature %s case 1",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(start.char))
+ logprocess("%s: replacing %s upto %s by ligature %s case 1",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(getchar(start)))
else
head,start=markstoligature(kind,lookupname,head,start,stop,lig)
end
@@ -10310,18 +11669,18 @@ function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence)
else
local skipmark=sequence.flags[1]
while s do
- local id=s.id
- if id==glyph_code and s.subtype<256 then
- if s.font==currentfont then
- local char=s.char
+ local id=getid(s)
+ if id==glyph_code and getsubtype(s)<256 then
+ if getfont(s)==currentfont then
+ local char=getchar(s)
if skipmark and marks[char] then
- s=s.next
+ s=getnext(s)
else
local lg=ligature[char]
if lg then
stop=s
ligature=lg
- s=s.next
+ s=getnext(s)
else
break
end
@@ -10331,7 +11690,7 @@ function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence)
end
elseif id==disc_code then
discfound=true
- s=s.next
+ s=getnext(s)
else
break
end
@@ -10340,36 +11699,36 @@ function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence)
if lig then
if stop then
if trace_ligatures then
- local stopchar=stop.char
+ local stopchar=getchar(stop)
head,start=toligature(kind,lookupname,head,start,stop,lig,skipmark,discfound)
- logprocess("%s: replacing %s upto %s by ligature %s case 2",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(start.char))
+ logprocess("%s: replacing %s upto %s by ligature %s case 2",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(getchar(start)))
else
head,start=toligature(kind,lookupname,head,start,stop,lig,skipmark,discfound)
end
- return head,start,true
else
- start.char=lig
+ resetinjection(start)
+ setfield(start,"char",lig)
if trace_ligatures then
logprocess("%s: replacing %s by (no real) ligature %s case 3",pref(kind,lookupname),gref(startchar),gref(lig))
end
- return head,start,true
end
+ return head,start,true
else
end
end
return head,start,false
end
function handlers.gpos_mark2base(head,start,kind,lookupname,markanchors,sequence)
- local markchar=start.char
+ local markchar=getchar(start)
if marks[markchar] then
- local base=start.prev
- if base and base.id==glyph_code and base.font==currentfont and base.subtype<256 then
- local basechar=base.char
+ local base=getprev(start)
+ if base and getid(base)==glyph_code and getfont(base)==currentfont and getsubtype(base)<256 then
+ local basechar=getchar(base)
if marks[basechar] then
while true do
- base=base.prev
- if base and base.id==glyph_code and base.font==currentfont and base.subtype<256 then
- basechar=base.char
+ base=getprev(base)
+ if base and getid(base)==glyph_code and getfont(base)==currentfont and getsubtype(base)<256 then
+ basechar=getchar(base)
if not marks[basechar] then
break
end
@@ -10393,7 +11752,7 @@ function handlers.gpos_mark2base(head,start,kind,lookupname,markanchors,sequence
if al[anchor] then
local ma=markanchors[anchor]
if ma then
- local dx,dy,bound=setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma)
+ local dx,dy,bound=setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar])
if trace_marks then
logprocess("%s, anchor %s, bound %s: anchoring mark %s to basechar %s => (%p,%p)",
pref(kind,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
@@ -10418,16 +11777,16 @@ function handlers.gpos_mark2base(head,start,kind,lookupname,markanchors,sequence
return head,start,false
end
function handlers.gpos_mark2ligature(head,start,kind,lookupname,markanchors,sequence)
- local markchar=start.char
+ local markchar=getchar(start)
if marks[markchar] then
- local base=start.prev
- if base and base.id==glyph_code and base.font==currentfont and base.subtype<256 then
- local basechar=base.char
+ local base=getprev(start)
+ if base and getid(base)==glyph_code and getfont(base)==currentfont and getsubtype(base)<256 then
+ local basechar=getchar(base)
if marks[basechar] then
while true do
- base=base.prev
- if base and base.id==glyph_code and base.font==currentfont and base.subtype<256 then
- basechar=base.char
+ base=getprev(base)
+ if base and getid(base)==glyph_code and getfont(base)==currentfont and getsubtype(base)<256 then
+ basechar=getchar(base)
if not marks[basechar] then
break
end
@@ -10439,7 +11798,7 @@ function handlers.gpos_mark2ligature(head,start,kind,lookupname,markanchors,sequ
end
end
end
- local index=start[a_ligacomp]
+ local index=getligaindex(start)
local baseanchors=descriptions[basechar]
if baseanchors then
baseanchors=baseanchors.anchors
@@ -10453,7 +11812,7 @@ function handlers.gpos_mark2ligature(head,start,kind,lookupname,markanchors,sequ
if ma then
ba=ba[index]
if ba then
- local dx,dy,bound=setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma)
+ local dx,dy,bound=setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar])
if trace_marks then
logprocess("%s, anchor %s, index %s, bound %s: anchoring mark %s to baselig %s at index %s => (%p,%p)",
pref(kind,lookupname),anchor,index,bound,gref(markchar),gref(basechar),index,dx,dy)
@@ -10484,22 +11843,22 @@ function handlers.gpos_mark2ligature(head,start,kind,lookupname,markanchors,sequ
return head,start,false
end
function handlers.gpos_mark2mark(head,start,kind,lookupname,markanchors,sequence)
- local markchar=start.char
+ local markchar=getchar(start)
if marks[markchar] then
- local base=start.prev
- local slc=start[a_ligacomp]
+ local base=getprev(start)
+ local slc=getligaindex(start)
if slc then
while base do
- local blc=base[a_ligacomp]
+ local blc=getligaindex(base)
if blc and blc~=slc then
- base=base.prev
+ base=getprev(base)
else
break
end
end
end
- if base and base.id==glyph_code and base.font==currentfont and base.subtype<256 then
- local basechar=base.char
+ if base and getid(base)==glyph_code and getfont(base)==currentfont and getsubtype(base)<256 then
+ local basechar=getchar(base)
local baseanchors=descriptions[basechar]
if baseanchors then
baseanchors=baseanchors.anchors
@@ -10511,7 +11870,7 @@ function handlers.gpos_mark2mark(head,start,kind,lookupname,markanchors,sequence
if al[anchor] then
local ma=markanchors[anchor]
if ma then
- local dx,dy,bound=setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,true)
+ local dx,dy,bound=setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar])
if trace_marks then
logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%p,%p)",
pref(kind,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
@@ -10537,20 +11896,20 @@ function handlers.gpos_mark2mark(head,start,kind,lookupname,markanchors,sequence
return head,start,false
end
function handlers.gpos_cursive(head,start,kind,lookupname,exitanchors,sequence)
- local alreadydone=cursonce and start[a_cursbase]
+ local alreadydone=cursonce and getprop(start,a_cursbase)
if not alreadydone then
local done=false
- local startchar=start.char
+ local startchar=getchar(start)
if marks[startchar] then
if trace_cursive then
logprocess("%s: ignoring cursive for mark %s",pref(kind,lookupname),gref(startchar))
end
else
- local nxt=start.next
- while not done and nxt and nxt.id==glyph_code and nxt.font==currentfont and nxt.subtype<256 do
- local nextchar=nxt.char
+ local nxt=getnext(start)
+ while not done and nxt and getid(nxt)==glyph_code and getfont(nxt)==currentfont and getsubtype(nxt)<256 do
+ local nextchar=getchar(nxt)
if marks[nextchar] then
- nxt=nxt.next
+ nxt=getnext(nxt)
else
local entryanchors=descriptions[nextchar]
if entryanchors then
@@ -10584,13 +11943,13 @@ function handlers.gpos_cursive(head,start,kind,lookupname,exitanchors,sequence)
return head,start,done
else
if trace_cursive and trace_details then
- logprocess("%s, cursive %s is already done",pref(kind,lookupname),gref(start.char),alreadydone)
+ logprocess("%s, cursive %s is already done",pref(kind,lookupname),gref(getchar(start)),alreadydone)
end
return head,start,false
end
end
function handlers.gpos_single(head,start,kind,lookupname,kerns,sequence)
- local startchar=start.char
+ local startchar=getchar(start)
local dx,dy,w,h=setpair(start,tfmdata.parameters.factor,rlmode,sequence.flags[4],kerns,characters[startchar])
if trace_kerns then
logprocess("%s: shifting single %s by (%p,%p) and correction (%p,%p)",pref(kind,lookupname),gref(startchar),dx,dy,w,h)
@@ -10598,33 +11957,33 @@ function handlers.gpos_single(head,start,kind,lookupname,kerns,sequence)
return head,start,false
end
function handlers.gpos_pair(head,start,kind,lookupname,kerns,sequence)
- local snext=start.next
+ local snext=getnext(start)
if not snext then
return head,start,false
else
local prev,done=start,false
local factor=tfmdata.parameters.factor
local lookuptype=lookuptypes[lookupname]
- while snext and snext.id==glyph_code and snext.font==currentfont and snext.subtype<256 do
- local nextchar=snext.char
+ while snext and getid(snext)==glyph_code and getfont(snext)==currentfont and getsubtype(snext)<256 do
+ local nextchar=getchar(snext)
local krn=kerns[nextchar]
if not krn and marks[nextchar] then
prev=snext
- snext=snext.next
+ snext=getnext(snext)
else
if not krn then
elseif type(krn)=="table" then
if lookuptype=="pair" then
local a,b=krn[2],krn[3]
if a and #a>0 then
- local startchar=start.char
+ local startchar=getchar(start)
local x,y,w,h=setpair(start,factor,rlmode,sequence.flags[4],a,characters[startchar])
if trace_kerns then
logprocess("%s: shifting first of pair %s and %s by (%p,%p) and correction (%p,%p)",pref(kind,lookupname),gref(startchar),gref(nextchar),x,y,w,h)
end
end
if b and #b>0 then
- local startchar=start.char
+ local startchar=getchar(start)
local x,y,w,h=setpair(snext,factor,rlmode,sequence.flags[4],b,characters[nextchar])
if trace_kerns then
logprocess("%s: shifting second of pair %s and %s by (%p,%p) and correction (%p,%p)",pref(kind,lookupname),gref(startchar),gref(nextchar),x,y,w,h)
@@ -10637,7 +11996,7 @@ function handlers.gpos_pair(head,start,kind,lookupname,kerns,sequence)
elseif krn~=0 then
local k=setkern(snext,factor,rlmode,krn)
if trace_kerns then
- logprocess("%s: inserting kern %s between %s and %s",pref(kind,lookupname),k,gref(prev.char),gref(nextchar))
+ logprocess("%s: inserting kern %s between %s and %s",pref(kind,lookupname),k,gref(getchar(prev)),gref(nextchar))
end
done=true
end
@@ -10672,13 +12031,14 @@ function chainmores.chainsub(head,start,stop,kind,chainname,currentcontext,looku
return head,start,false
end
function chainprocs.reversesub(head,start,stop,kind,chainname,currentcontext,lookuphash,replacements)
- local char=start.char
+ local char=getchar(start)
local replacement=replacements[char]
if replacement then
if trace_singles then
logprocess("%s: single reverse replacement of %s by %s",cref(kind,chainname),gref(char),gref(replacement))
end
- start.char=replacement
+ resetinjection(start)
+ setfield(start,"char",replacement)
return head,start,true
else
return head,start,false
@@ -10691,8 +12051,8 @@ function chainprocs.gsub_single(head,start,stop,kind,chainname,currentcontext,lo
logwarning("todo: check if we need to loop over the replacements: %s",concat(subtables," "))
end
while current do
- if current.id==glyph_code then
- local currentchar=current.char
+ if getid(current)==glyph_code then
+ local currentchar=getchar(current)
local lookupname=subtables[1]
local replacement=lookuphash[lookupname]
if not replacement then
@@ -10709,21 +12069,22 @@ function chainprocs.gsub_single(head,start,stop,kind,chainname,currentcontext,lo
if trace_singles then
logprocess("%s: replacing single %s by %s",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(currentchar),gref(replacement))
end
- current.char=replacement
+ resetinjection(current)
+ setfield(current,"char",replacement)
end
end
return head,start,true
elseif current==stop then
break
else
- current=current.next
+ current=getnext(current)
end
end
return head,start,false
end
chainmores.gsub_single=chainprocs.gsub_single
function chainprocs.gsub_multiple(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname)
- local startchar=start.char
+ local startchar=getchar(start)
local subtables=currentlookup.subtables
local lookupname=subtables[1]
local replacements=lookuphash[lookupname]
@@ -10752,8 +12113,8 @@ function chainprocs.gsub_alternate(head,start,stop,kind,chainname,currentcontext
local subtables=currentlookup.subtables
local value=featurevalue==true and tfmdata.shared.features[kind] or featurevalue
while current do
- if current.id==glyph_code then
- local currentchar=current.char
+ if getid(current)==glyph_code then
+ local currentchar=getchar(current)
local lookupname=subtables[1]
local alternatives=lookuphash[lookupname]
if not alternatives then
@@ -10768,7 +12129,8 @@ function chainprocs.gsub_alternate(head,start,stop,kind,chainname,currentcontext
if trace_alternatives then
logprocess("%s: replacing %s by alternative %a to %s, %s",cref(kind,chainname,chainlookupname,lookupname),gref(char),choice,gref(choice),comment)
end
- start.char=choice
+ resetinjection(start)
+ setfield(start,"char",choice)
else
if trace_alternatives then
logwarning("%s: no variant %a for %s, %s",cref(kind,chainname,chainlookupname,lookupname),value,gref(char),comment)
@@ -10782,14 +12144,14 @@ function chainprocs.gsub_alternate(head,start,stop,kind,chainname,currentcontext
elseif current==stop then
break
else
- current=current.next
+ current=getnext(current)
end
end
return head,start,false
end
chainmores.gsub_alternate=chainprocs.gsub_alternate
function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex)
- local startchar=start.char
+ local startchar=getchar(start)
local subtables=currentlookup.subtables
local lookupname=subtables[1]
local ligatures=lookuphash[lookupname]
@@ -10804,20 +12166,20 @@ function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext,
logwarning("%s: no ligatures starting with %s",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar))
end
else
- local s=start.next
+ local s=getnext(start)
local discfound=false
local last=stop
local nofreplacements=0
local skipmark=currentlookup.flags[1]
while s do
- local id=s.id
+ local id=getid(s)
if id==disc_code then
- s=s.next
+ s=getnext(s)
discfound=true
else
- local schar=s.char
+ local schar=getchar(s)
if skipmark and marks[schar] then
- s=s.next
+ s=getnext(s)
else
local lg=ligatures[schar]
if lg then
@@ -10825,7 +12187,7 @@ function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext,
if s==stop then
break
else
- s=s.next
+ s=getnext(s)
end
else
break
@@ -10842,7 +12204,7 @@ function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext,
if start==stop then
logprocess("%s: replacing character %s by ligature %s case 3",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(l2))
else
- logprocess("%s: replacing character %s upto %s by ligature %s case 4",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(stop.char),gref(l2))
+ logprocess("%s: replacing character %s upto %s by ligature %s case 4",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(getchar(stop)),gref(l2))
end
end
head,start=toligature(kind,lookupname,head,start,stop,l2,currentlookup.flags[1],discfound)
@@ -10851,7 +12213,7 @@ function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext,
if start==stop then
logwarning("%s: replacing character %s by ligature fails",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar))
else
- logwarning("%s: replacing character %s upto %s by ligature fails",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(stop.char))
+ logwarning("%s: replacing character %s upto %s by ligature fails",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(getchar(stop)))
end
end
end
@@ -10860,7 +12222,7 @@ function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext,
end
chainmores.gsub_ligature=chainprocs.gsub_ligature
function chainprocs.gpos_mark2base(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname)
- local markchar=start.char
+ local markchar=getchar(start)
if marks[markchar] then
local subtables=currentlookup.subtables
local lookupname=subtables[1]
@@ -10869,14 +12231,14 @@ function chainprocs.gpos_mark2base(head,start,stop,kind,chainname,currentcontext
markanchors=markanchors[markchar]
end
if markanchors then
- local base=start.prev
- if base and base.id==glyph_code and base.font==currentfont and base.subtype<256 then
- local basechar=base.char
+ local base=getprev(start)
+ if base and getid(base)==glyph_code and getfont(base)==currentfont and getsubtype(base)<256 then
+ local basechar=getchar(base)
if marks[basechar] then
while true do
- base=base.prev
- if base and base.id==glyph_code and base.font==currentfont and base.subtype<256 then
- basechar=base.char
+ base=getprev(base)
+ if base and getid(base)==glyph_code and getfont(base)==currentfont and getsubtype(base)<256 then
+ basechar=getchar(base)
if not marks[basechar] then
break
end
@@ -10897,7 +12259,7 @@ function chainprocs.gpos_mark2base(head,start,stop,kind,chainname,currentcontext
if al[anchor] then
local ma=markanchors[anchor]
if ma then
- local dx,dy,bound=setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma)
+ local dx,dy,bound=setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar])
if trace_marks then
logprocess("%s, anchor %s, bound %s: anchoring mark %s to basechar %s => (%p,%p)",
cref(kind,chainname,chainlookupname,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
@@ -10923,7 +12285,7 @@ function chainprocs.gpos_mark2base(head,start,stop,kind,chainname,currentcontext
return head,start,false
end
function chainprocs.gpos_mark2ligature(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname)
- local markchar=start.char
+ local markchar=getchar(start)
if marks[markchar] then
local subtables=currentlookup.subtables
local lookupname=subtables[1]
@@ -10932,14 +12294,14 @@ function chainprocs.gpos_mark2ligature(head,start,stop,kind,chainname,currentcon
markanchors=markanchors[markchar]
end
if markanchors then
- local base=start.prev
- if base and base.id==glyph_code and base.font==currentfont and base.subtype<256 then
- local basechar=base.char
+ local base=getprev(start)
+ if base and getid(base)==glyph_code and getfont(base)==currentfont and getsubtype(base)<256 then
+ local basechar=getchar(base)
if marks[basechar] then
while true do
- base=base.prev
- if base and base.id==glyph_code and base.font==currentfont and base.subtype<256 then
- basechar=base.char
+ base=getprev(base)
+ if base and getid(base)==glyph_code and getfont(base)==currentfont and getsubtype(base)<256 then
+ basechar=getchar(base)
if not marks[basechar] then
break
end
@@ -10951,7 +12313,7 @@ function chainprocs.gpos_mark2ligature(head,start,stop,kind,chainname,currentcon
end
end
end
- local index=start[a_ligacomp]
+ local index=getligaindex(start)
local baseanchors=descriptions[basechar].anchors
if baseanchors then
local baseanchors=baseanchors['baselig']
@@ -10963,7 +12325,7 @@ function chainprocs.gpos_mark2ligature(head,start,stop,kind,chainname,currentcon
if ma then
ba=ba[index]
if ba then
- local dx,dy,bound=setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma)
+ local dx,dy,bound=setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar])
if trace_marks then
logprocess("%s, anchor %s, bound %s: anchoring mark %s to baselig %s at index %s => (%p,%p)",
cref(kind,chainname,chainlookupname,lookupname),anchor,a or bound,gref(markchar),gref(basechar),index,dx,dy)
@@ -10990,67 +12352,67 @@ function chainprocs.gpos_mark2ligature(head,start,stop,kind,chainname,currentcon
return head,start,false
end
function chainprocs.gpos_mark2mark(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname)
- local markchar=start.char
+ local markchar=getchar(start)
if marks[markchar] then
- local subtables=currentlookup.subtables
- local lookupname=subtables[1]
- local markanchors=lookuphash[lookupname]
- if markanchors then
- markanchors=markanchors[markchar]
- end
- if markanchors then
- local base=start.prev
- local slc=start[a_ligacomp]
- if slc then
- while base do
- local blc=base[a_ligacomp]
- if blc and blc~=slc then
- base=base.prev
- else
- break
- end
+ local subtables=currentlookup.subtables
+ local lookupname=subtables[1]
+ local markanchors=lookuphash[lookupname]
+ if markanchors then
+ markanchors=markanchors[markchar]
+ end
+ if markanchors then
+ local base=getprev(start)
+ local slc=getligaindex(start)
+ if slc then
+ while base do
+ local blc=getligaindex(base)
+ if blc and blc~=slc then
+ base=getprev(base)
+ else
+ break
end
end
- if base and base.id==glyph_code and base.font==currentfont and base.subtype<256 then
- local basechar=base.char
- local baseanchors=descriptions[basechar].anchors
+ end
+ if base and getid(base)==glyph_code and getfont(base)==currentfont and getsubtype(base)<256 then
+ local basechar=getchar(base)
+ local baseanchors=descriptions[basechar].anchors
+ if baseanchors then
+ baseanchors=baseanchors['basemark']
if baseanchors then
- baseanchors=baseanchors['basemark']
- if baseanchors then
- local al=anchorlookups[lookupname]
- for anchor,ba in next,baseanchors do
- if al[anchor] then
- local ma=markanchors[anchor]
- if ma then
- local dx,dy,bound=setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,true)
- if trace_marks then
- logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%p,%p)",
- cref(kind,chainname,chainlookupname,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
- end
- return head,start,true
+ local al=anchorlookups[lookupname]
+ for anchor,ba in next,baseanchors do
+ if al[anchor] then
+ local ma=markanchors[anchor]
+ if ma then
+ local dx,dy,bound=setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar])
+ if trace_marks then
+ logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%p,%p)",
+ cref(kind,chainname,chainlookupname,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
end
+ return head,start,true
end
end
- if trace_bugs then
- logwarning("%s: no matching anchors for mark %s and basemark %s",gref(kind,chainname,chainlookupname,lookupname),gref(markchar),gref(basechar))
- end
+ end
+ if trace_bugs then
+ logwarning("%s: no matching anchors for mark %s and basemark %s",gref(kind,chainname,chainlookupname,lookupname),gref(markchar),gref(basechar))
end
end
- elseif trace_bugs then
- logwarning("%s: prev node is no mark",cref(kind,chainname,chainlookupname,lookupname))
end
elseif trace_bugs then
- logwarning("%s: mark %s has no anchors",cref(kind,chainname,chainlookupname,lookupname),gref(markchar))
+ logwarning("%s: prev node is no mark",cref(kind,chainname,chainlookupname,lookupname))
end
+ elseif trace_bugs then
+ logwarning("%s: mark %s has no anchors",cref(kind,chainname,chainlookupname,lookupname),gref(markchar))
+ end
elseif trace_bugs then
logwarning("%s: mark %s is no mark",cref(kind,chainname,chainlookupname),gref(markchar))
end
return head,start,false
end
function chainprocs.gpos_cursive(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname)
- local alreadydone=cursonce and start[a_cursbase]
+ local alreadydone=cursonce and getprop(start,a_cursbase)
if not alreadydone then
- local startchar=start.char
+ local startchar=getchar(start)
local subtables=currentlookup.subtables
local lookupname=subtables[1]
local exitanchors=lookuphash[lookupname]
@@ -11064,11 +12426,11 @@ function chainprocs.gpos_cursive(head,start,stop,kind,chainname,currentcontext,l
logprocess("%s: ignoring cursive for mark %s",pref(kind,lookupname),gref(startchar))
end
else
- local nxt=start.next
- while not done and nxt and nxt.id==glyph_code and nxt.font==currentfont and nxt.subtype<256 do
- local nextchar=nxt.char
+ local nxt=getnext(start)
+ while not done and nxt and getid(nxt)==glyph_code and getfont(nxt)==currentfont and getsubtype(nxt)<256 do
+ local nextchar=getchar(nxt)
if marks[nextchar] then
- nxt=nxt.next
+ nxt=getnext(nxt)
else
local entryanchors=descriptions[nextchar]
if entryanchors then
@@ -11102,7 +12464,7 @@ function chainprocs.gpos_cursive(head,start,stop,kind,chainname,currentcontext,l
return head,start,done
else
if trace_cursive and trace_details then
- logprocess("%s, cursive %s is already done",pref(kind,lookupname),gref(start.char),alreadydone)
+ logprocess("%s, cursive %s is already done",pref(kind,lookupname),gref(getchar(start)),alreadydone)
end
return head,start,false
end
@@ -11110,7 +12472,7 @@ function chainprocs.gpos_cursive(head,start,stop,kind,chainname,currentcontext,l
return head,start,false
end
function chainprocs.gpos_single(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex,sequence)
- local startchar=start.char
+ local startchar=getchar(start)
local subtables=currentlookup.subtables
local lookupname=subtables[1]
local kerns=lookuphash[lookupname]
@@ -11127,9 +12489,9 @@ function chainprocs.gpos_single(head,start,stop,kind,chainname,currentcontext,lo
end
chainmores.gpos_single=chainprocs.gpos_single
function chainprocs.gpos_pair(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex,sequence)
- local snext=start.next
+ local snext=getnext(start)
if snext then
- local startchar=start.char
+ local startchar=getchar(start)
local subtables=currentlookup.subtables
local lookupname=subtables[1]
local kerns=lookuphash[lookupname]
@@ -11139,26 +12501,26 @@ function chainprocs.gpos_pair(head,start,stop,kind,chainname,currentcontext,look
local lookuptype=lookuptypes[lookupname]
local prev,done=start,false
local factor=tfmdata.parameters.factor
- while snext and snext.id==glyph_code and snext.font==currentfont and snext.subtype<256 do
- local nextchar=snext.char
+ while snext and getid(snext)==glyph_code and getfont(snext)==currentfont and getsubtype(snext)<256 do
+ local nextchar=getchar(snext)
local krn=kerns[nextchar]
if not krn and marks[nextchar] then
prev=snext
- snext=snext.next
+ snext=getnext(snext)
else
if not krn then
elseif type(krn)=="table" then
if lookuptype=="pair" then
local a,b=krn[2],krn[3]
if a and #a>0 then
- local startchar=start.char
+ local startchar=getchar(start)
local x,y,w,h=setpair(start,factor,rlmode,sequence.flags[4],a,characters[startchar])
if trace_kerns then
logprocess("%s: shifting first of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(kind,chainname,chainlookupname),gref(startchar),gref(nextchar),x,y,w,h)
end
end
if b and #b>0 then
- local startchar=start.char
+ local startchar=getchar(start)
local x,y,w,h=setpair(snext,factor,rlmode,sequence.flags[4],b,characters[nextchar])
if trace_kerns then
logprocess("%s: shifting second of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(kind,chainname,chainlookupname),gref(startchar),gref(nextchar),x,y,w,h)
@@ -11170,7 +12532,7 @@ function chainprocs.gpos_pair(head,start,stop,kind,chainname,currentcontext,look
if a and a~=0 then
local k=setkern(snext,factor,rlmode,a)
if trace_kerns then
- logprocess("%s: inserting first kern %s between %s and %s",cref(kind,chainname,chainlookupname),k,gref(prev.char),gref(nextchar))
+ logprocess("%s: inserting first kern %s between %s and %s",cref(kind,chainname,chainlookupname),k,gref(getchar(prev)),gref(nextchar))
end
end
if b and b~=0 then
@@ -11181,7 +12543,7 @@ function chainprocs.gpos_pair(head,start,stop,kind,chainname,currentcontext,look
elseif krn~=0 then
local k=setkern(snext,factor,rlmode,krn)
if trace_kerns then
- logprocess("%s: inserting kern %s between %s and %s",cref(kind,chainname,chainlookupname),k,gref(prev.char),gref(nextchar))
+ logprocess("%s: inserting kern %s between %s and %s",cref(kind,chainname,chainlookupname),k,gref(getchar(prev)),gref(nextchar))
end
done=true
end
@@ -11202,6 +12564,10 @@ local function show_skip(kind,chainname,char,ck,class)
logwarning("%s: skipping char %s, class %a, rule %a, lookuptype %a",cref(kind,chainname),gref(char),class,ck[1],ck[2])
end
end
+local quit_on_no_replacement=true
+directives.register("otf.chain.quitonnoreplacement",function(value)
+ quit_on_no_replacement=value
+end)
local function normal_handle_contextchain(head,start,kind,chainname,contexts,sequence,lookuphash)
local flags=sequence.flags
local done=false
@@ -11219,7 +12585,7 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
local seq=ck[3]
local s=#seq
if s==1 then
- match=current.id==glyph_code and current.font==currentfont and current.subtype<256 and seq[1][current.char]
+ match=getid(current)==glyph_code and getfont(current)==currentfont and getsubtype(current)<256 and seq[1][getchar(current)]
else
local f,l=ck[4],ck[5]
if f==1 and f==l then
@@ -11227,13 +12593,13 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
if f==l then
else
local n=f+1
- last=last.next
+ last=getnext(last)
while n<=l do
if last then
- local id=last.id
+ local id=getid(last)
if id==glyph_code then
- if last.font==currentfont and last.subtype<256 then
- local char=last.char
+ if getfont(last)==currentfont and getsubtype(last)<256 then
+ local char=getchar(last)
local ccd=descriptions[char]
if ccd then
local class=ccd.class
@@ -11242,10 +12608,10 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
if trace_skips then
show_skip(kind,chainname,char,ck,class)
end
- last=last.next
+ last=getnext(last)
elseif seq[n][char] then
if n<l then
- last=last.next
+ last=getnext(last)
end
n=n+1
else
@@ -11261,7 +12627,7 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
break
end
elseif id==disc_code then
- last=last.next
+ last=getnext(last)
else
match=false
break
@@ -11274,15 +12640,15 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
end
end
if match and f>1 then
- local prev=start.prev
+ local prev=getprev(start)
if prev then
local n=f-1
while n>=1 do
if prev then
- local id=prev.id
+ local id=getid(prev)
if id==glyph_code then
- if prev.font==currentfont and prev.subtype<256 then
- local char=prev.char
+ if getfont(prev)==currentfont and getsubtype(prev)<256 then
+ local char=getchar(prev)
local ccd=descriptions[char]
if ccd then
local class=ccd.class
@@ -11312,7 +12678,7 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
match=false
break
end
- prev=prev.prev
+ prev=getprev(prev)
elseif seq[n][32] then
n=n -1
else
@@ -11332,15 +12698,15 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
end
end
if match and s>l then
- local current=last and last.next
+ local current=last and getnext(last)
if current then
local n=l+1
while n<=s do
if current then
- local id=current.id
+ local id=getid(current)
if id==glyph_code then
- if current.font==currentfont and current.subtype<256 then
- local char=current.char
+ if getfont(current)==currentfont and getsubtype(current)<256 then
+ local char=getchar(current)
local ccd=descriptions[char]
if ccd then
local class=ccd.class
@@ -11370,7 +12736,7 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
match=false
break
end
- current=current.next
+ current=getnext(current)
elseif seq[n][32] then
n=n+1
else
@@ -11393,7 +12759,7 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
if match then
if trace_contexts then
local rule,lookuptype,f,l=ck[1],ck[2],ck[4],ck[5]
- local char=start.char
+ local char=getchar(start)
if ck[9] then
logwarning("%s: rule %s matches at char %s for (%s,%s,%s) chars, lookuptype %a, %a => %a",
cref(kind,chainname),rule,gref(char),f-1,l-f+1,s-l,lookuptype,ck[9],ck[10])
@@ -11424,15 +12790,15 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
end
else
local i=1
- repeat
+ while true do
if skipped then
while true do
- local char=start.char
+ local char=getchar(start)
local ccd=descriptions[char]
if ccd then
local class=ccd.class
if class==skipmark or class==skipligature or class==skipbase or (markclass and class=="mark" and not markclass[char]) then
- start=start.next
+ start=getnext(start)
else
break
end
@@ -11461,18 +12827,20 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
end
end
end
- if start then
- start=start.next
+ if i>nofchainlookups then
+ break
+ elseif start then
+ start=getnext(start)
else
end
- until i>nofchainlookups
+ end
end
else
local replacements=ck[7]
if replacements then
head,start,done=chainprocs.reversesub(head,start,last,kind,chainname,ck,lookuphash,replacements)
else
- done=true
+ done=quit_on_no_replacement
if trace_contexts then
logprocess("%s: skipping match",cref(kind,chainname))
end
@@ -11543,7 +12911,7 @@ local function initialize(sequence,script,language,enabled)
if features then
local order=sequence.order
if order then
- for i=1,#order do
+ for i=1,#order do
local kind=order[i]
local valid=enabled[kind]
if valid then
@@ -11595,6 +12963,7 @@ local function featuresprocessor(head,font,attr)
if not lookuphash then
return head,false
end
+ head=tonut(head)
if trace_steps then
checkstep(head)
end
@@ -11606,6 +12975,7 @@ local function featuresprocessor(head,font,attr)
anchorlookups=resources.lookup_to_anchor
lookuptable=resources.lookups
lookuptypes=resources.lookuptypes
+ lookuptags=resources.lookuptags
currentfont=font
rlmode=0
local sequences=resources.sequences
@@ -11627,10 +12997,10 @@ local function featuresprocessor(head,font,attr)
local handler=handlers[typ]
local start=find_node_tail(head)
while start do
- local id=start.id
+ local id=getid(start)
if id==glyph_code then
- if start.font==font and start.subtype<256 then
- local a=start[0]
+ if getfont(start)==font and getsubtype(start)<256 then
+ local a=getattr(start,0)
if a then
a=a==attr
else
@@ -11641,7 +13011,7 @@ local function featuresprocessor(head,font,attr)
local lookupname=subtables[i]
local lookupcache=lookuphash[lookupname]
if lookupcache then
- local lookupmatch=lookupcache[start.char]
+ local lookupmatch=lookupcache[getchar(start)]
if lookupmatch then
head,start,success=handler(head,start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,i)
if success then
@@ -11652,15 +13022,15 @@ local function featuresprocessor(head,font,attr)
report_missing_cache(typ,lookupname)
end
end
- if start then start=start.prev end
+ if start then start=getprev(start) end
else
- start=start.prev
+ start=getprev(start)
end
else
- start=start.prev
+ start=getprev(start)
end
else
- start=start.prev
+ start=getprev(start)
end
end
else
@@ -11678,16 +13048,16 @@ local function featuresprocessor(head,font,attr)
local head=start
local done=false
while start do
- local id=start.id
- if id==glyph_code and start.font==font and start.subtype<256 then
- local a=start[0]
+ local id=getid(start)
+ if id==glyph_code and getfont(start)==font and getsubtype(start)<256 then
+ local a=getattr(start,0)
if a then
- a=(a==attr) and (not attribute or start[a_state]==attribute)
+ a=(a==attr) and (not attribute or getprop(start,a_state)==attribute)
else
- a=not attribute or start[a_state]==attribute
+ a=not attribute or getprop(start,a_state)==attribute
end
if a then
- local lookupmatch=lookupcache[start.char]
+ local lookupmatch=lookupcache[getchar(start)]
if lookupmatch then
local ok
head,start,ok=handler(head,start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,1)
@@ -11695,12 +13065,12 @@ local function featuresprocessor(head,font,attr)
done=true
end
end
- if start then start=start.next end
+ if start then start=getnext(start) end
else
- start=start.next
+ start=getnext(start)
end
else
- start=start.next
+ start=getnext(start)
end
end
if done then
@@ -11709,18 +13079,18 @@ local function featuresprocessor(head,font,attr)
end
end
local function kerndisc(disc)
- local prev=disc.prev
- local next=disc.next
+ local prev=getprev(disc)
+ local next=getnext(disc)
if prev and next then
- prev.next=next
- local a=prev[0]
+ setfield(prev,"next",next)
+ local a=getattr(prev,0)
if a then
- a=(a==attr) and (not attribute or prev[a_state]==attribute)
+ a=(a==attr) and (not attribute or getprop(prev,a_state)==attribute)
else
- a=not attribute or prev[a_state]==attribute
+ a=not attribute or getprop(prev,a_state)==attribute
end
if a then
- local lookupmatch=lookupcache[prev.char]
+ local lookupmatch=lookupcache[getchar(prev)]
if lookupmatch then
local h,d,ok=handler(head,prev,dataset[4],lookupname,lookupmatch,sequence,lookuphash,1)
if ok then
@@ -11729,22 +13099,22 @@ local function featuresprocessor(head,font,attr)
end
end
end
- prev.next=disc
+ setfield(prev,"next",disc)
end
return next
end
while start do
- local id=start.id
+ local id=getid(start)
if id==glyph_code then
- if start.font==font and start.subtype<256 then
- local a=start[0]
+ if getfont(start)==font and getsubtype(start)<256 then
+ local a=getattr(start,0)
if a then
- a=(a==attr) and (not attribute or start[a_state]==attribute)
+ a=(a==attr) and (not attribute or getprop(start,a_state)==attribute)
else
- a=not attribute or start[a_state]==attribute
+ a=not attribute or getprop(start,a_state)==attribute
end
if a then
- local lookupmatch=lookupcache[start.char]
+ local lookupmatch=lookupcache[getchar(start)]
if lookupmatch then
local ok
head,start,ok=handler(head,start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,1)
@@ -11752,38 +13122,38 @@ local function featuresprocessor(head,font,attr)
success=true
end
end
- if start then start=start.next end
+ if start then start=getnext(start) end
else
- start=start.next
+ start=getnext(start)
end
else
- start=start.next
+ start=getnext(start)
end
elseif id==disc_code then
- if start.subtype==discretionary_code then
- local pre=start.pre
+ if getsubtype(start)==discretionary_code then
+ local pre=getfield(start,"pre")
if pre then
local new=subrun(pre)
- if new then start.pre=new end
+ if new then setfield(start,"pre",new) end
end
- local post=start.post
+ local post=getfield(start,"post")
if post then
local new=subrun(post)
- if new then start.post=new end
+ if new then setfield(start,"post",new) end
end
- local replace=start.replace
+ local replace=getfield(start,"replace")
if replace then
local new=subrun(replace)
- if new then start.replace=new end
+ if new then setfield(start,"replace",new) end
end
elseif typ=="gpos_single" or typ=="gpos_pair" then
kerndisc(start)
end
- start=start.next
+ start=getnext(start)
elseif id==whatsit_code then
- local subtype=start.subtype
+ local subtype=getsubtype(start)
if subtype==dir_code then
- local dir=start.dir
+ local dir=getfield(start,"dir")
if dir=="+TRT" or dir=="+TLT" then
topstack=topstack+1
dirstack[topstack]=dir
@@ -11802,7 +13172,7 @@ elseif typ=="gpos_single" or typ=="gpos_pair" then
report_process("directions after txtdir %a: parmode %a, txtmode %a, # stack %a, new dir %a",dir,rlparmode,rlmode,topstack,newdir)
end
elseif subtype==localpar_code then
- local dir=start.dir
+ local dir=getfield(start,"dir")
if dir=="TRT" then
rlparmode=-1
elseif dir=="TLT" then
@@ -11815,11 +13185,11 @@ elseif typ=="gpos_single" or typ=="gpos_pair" then
report_process("directions after pardir %a: parmode %a, txtmode %a",dir,rlparmode,rlmode)
end
end
- start=start.next
+ start=getnext(start)
elseif id==math_code then
- start=end_of_math(start).next
+ start=getnext(end_of_math(start))
else
- start=start.next
+ start=getnext(start)
end
end
end
@@ -11828,20 +13198,20 @@ elseif typ=="gpos_single" or typ=="gpos_pair" then
local head=start
local done=false
while start do
- local id=start.id
- if id==glyph_code and start.id==font and start.subtype<256 then
- local a=start[0]
+ local id=getid(start)
+ if id==glyph_code and getfont(start)==font and getsubtype(start)<256 then
+ local a=getattr(start,0)
if a then
- a=(a==attr) and (not attribute or start[a_state]==attribute)
+ a=(a==attr) and (not attribute or getprop(start,a_state)==attribute)
else
- a=not attribute or start[a_state]==attribute
+ a=not attribute or getprop(start,a_state)==attribute
end
if a then
for i=1,ns do
local lookupname=subtables[i]
local lookupcache=lookuphash[lookupname]
if lookupcache then
- local lookupmatch=lookupcache[start.char]
+ local lookupmatch=lookupcache[getchar(start)]
if lookupmatch then
local ok
head,start,ok=handler(head,start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,i)
@@ -11856,12 +13226,12 @@ elseif typ=="gpos_single" or typ=="gpos_pair" then
report_missing_cache(typ,lookupname)
end
end
- if start then start=start.next end
+ if start then start=getnext(start) end
else
- start=start.next
+ start=getnext(start)
end
else
- start=start.next
+ start=getnext(start)
end
end
if done then
@@ -11870,22 +13240,22 @@ elseif typ=="gpos_single" or typ=="gpos_pair" then
end
end
local function kerndisc(disc)
- local prev=disc.prev
- local next=disc.next
+ local prev=getprev(disc)
+ local next=getnext(disc)
if prev and next then
- prev.next=next
- local a=prev[0]
+ setfield(prev,"next",next)
+ local a=getattr(prev,0)
if a then
- a=(a==attr) and (not attribute or prev[a_state]==attribute)
+ a=(a==attr) and (not attribute or getprop(prev,a_state)==attribute)
else
- a=not attribute or prev[a_state]==attribute
+ a=not attribute or getprop(prev,a_state)==attribute
end
if a then
for i=1,ns do
local lookupname=subtables[i]
local lookupcache=lookuphash[lookupname]
if lookupcache then
- local lookupmatch=lookupcache[prev.char]
+ local lookupmatch=lookupcache[getchar(prev)]
if lookupmatch then
local h,d,ok=handler(head,prev,dataset[4],lookupname,lookupmatch,sequence,lookuphash,i)
if ok then
@@ -11898,26 +13268,26 @@ elseif typ=="gpos_single" or typ=="gpos_pair" then
end
end
end
- prev.next=disc
+ setfield(prev,"next",disc)
end
return next
end
while start do
- local id=start.id
+ local id=getid(start)
if id==glyph_code then
- if start.font==font and start.subtype<256 then
- local a=start[0]
+ if getfont(start)==font and getsubtype(start)<256 then
+ local a=getattr(start,0)
if a then
- a=(a==attr) and (not attribute or start[a_state]==attribute)
+ a=(a==attr) and (not attribute or getprop(start,a_state)==attribute)
else
- a=not attribute or start[a_state]==attribute
+ a=not attribute or getprop(start,a_state)==attribute
end
if a then
for i=1,ns do
local lookupname=subtables[i]
local lookupcache=lookuphash[lookupname]
if lookupcache then
- local lookupmatch=lookupcache[start.char]
+ local lookupmatch=lookupcache[getchar(start)]
if lookupmatch then
local ok
head,start,ok=handler(head,start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,i)
@@ -11932,38 +13302,38 @@ elseif typ=="gpos_single" or typ=="gpos_pair" then
report_missing_cache(typ,lookupname)
end
end
- if start then start=start.next end
+ if start then start=getnext(start) end
else
- start=start.next
+ start=getnext(start)
end
else
- start=start.next
+ start=getnext(start)
end
elseif id==disc_code then
- if start.subtype==discretionary_code then
- local pre=start.pre
+ if getsubtype(start)==discretionary_code then
+ local pre=getfield(start,"pre")
if pre then
local new=subrun(pre)
- if new then start.pre=new end
+ if new then setfield(start,"pre",new) end
end
- local post=start.post
+ local post=getfield(start,"post")
if post then
local new=subrun(post)
- if new then start.post=new end
+ if new then setfield(start,"post",new) end
end
- local replace=start.replace
+ local replace=getfield(start,"replace")
if replace then
local new=subrun(replace)
- if new then start.replace=new end
+ if new then setfield(start,"replace",new) end
end
elseif typ=="gpos_single" or typ=="gpos_pair" then
kerndisc(start)
end
- start=start.next
+ start=getnext(start)
elseif id==whatsit_code then
- local subtype=start.subtype
+ local subtype=getsubtype(start)
if subtype==dir_code then
- local dir=start.dir
+ local dir=getfield(start,"dir")
if dir=="+TRT" or dir=="+TLT" then
topstack=topstack+1
dirstack[topstack]=dir
@@ -11982,7 +13352,7 @@ elseif typ=="gpos_single" or typ=="gpos_pair" then
report_process("directions after txtdir %a: parmode %a, txtmode %a, # stack %a, new dir %a",dir,rlparmode,rlmode,topstack,newdir)
end
elseif subtype==localpar_code then
- local dir=start.dir
+ local dir=getfield(start,"dir")
if dir=="TRT" then
rlparmode=-1
elseif dir=="TLT" then
@@ -11995,11 +13365,11 @@ elseif typ=="gpos_single" or typ=="gpos_pair" then
report_process("directions after pardir %a: parmode %a, txtmode %a",dir,rlparmode,rlmode)
end
end
- start=start.next
+ start=getnext(start)
elseif id==math_code then
- start=end_of_math(start).next
+ start=getnext(end_of_math(start))
else
- start=start.next
+ start=getnext(start)
end
end
end
@@ -12011,6 +13381,7 @@ elseif typ=="gpos_single" or typ=="gpos_pair" then
registerstep(head)
end
end
+ head=tonode(head)
return head,done
end
local function generic(lookupdata,lookupname,unicode,lookuphash)
@@ -12137,6 +13508,7 @@ local function prepare_contextchains(tfmdata)
local rawdata=tfmdata.shared.rawdata
local resources=rawdata.resources
local lookuphash=resources.lookuphash
+ local lookuptags=resources.lookuptags
local lookups=rawdata.lookups
if lookups then
for lookupname,lookupdata in next,rawdata.lookups do
@@ -12149,7 +13521,7 @@ local function prepare_contextchains(tfmdata)
if not validformat then
report_prepare("unsupported format %a",format)
elseif not validformat[lookuptype] then
- report_prepare("unsupported format %a, lookuptype %a, lookupname %a",format,lookuptype,lookupname)
+ report_prepare("unsupported format %a, lookuptype %a, lookupname %a",format,lookuptype,lookuptags[lookupname])
else
local contexts=lookuphash[lookupname]
if not contexts then
@@ -12198,7 +13570,7 @@ local function prepare_contextchains(tfmdata)
else
end
else
- report_prepare("missing lookuptype for lookupname %a",lookupname)
+ report_prepare("missing lookuptype for lookupname %a",lookuptags[lookupname])
end
end
end
@@ -12950,27 +14322,6 @@ local function unpackdata(data)
rule.replacements=tv
end
end
- local fore=rule.fore
- if fore then
- local tv=tables[fore]
- if tv then
- rule.fore=tv
- end
- end
- local back=rule.back
- if back then
- local tv=tables[back]
- if tv then
- rule.back=tv
- end
- end
- local names=rule.names
- if names then
- local tv=tables[names]
- if tv then
- rule.names=tv
- end
- end
local lookups=rule.lookups
if lookups then
local tv=tables[lookups]
@@ -13091,6 +14442,7 @@ if otf.enhancers.register then
otf.enhancers.register("unpack",unpackdata)
end
otf.enhancers.unpack=unpackdata
+otf.enhancers.pack=packdata
end -- closure
@@ -13446,8 +14798,8 @@ function definers.read(specification,size,id)
elseif trace_defining and type(tfmdata)=="table" then
local properties=tfmdata.properties or {}
local parameters=tfmdata.parameters or {}
- report_defining("using %s font with id %a, name %a, size %a, bytes %a, encoding %a, fullname %a, filename %a",
- properties.format,id,properties.name,parameters.size,properties.encodingbytes,
+ report_defining("using %a font with id %a, name %a, size %a, bytes %a, encoding %a, fullname %a, filename %a",
+ properties.format or "unknown",id,properties.name,parameters.size,properties.encodingbytes,
properties.encodingname,properties.fullname,file.basename(properties.filename))
end
statistics.stoptiming(fonts)
@@ -13778,13 +15130,40 @@ local fonts=fonts
local nodes=nodes
local traverse_id=node.traverse_id
local glyph_code=nodes.nodecodes.glyph
-function nodes.handlers.characters(head)
+local disc_code=nodes.nodecodes.disc
+local ligaturing=node.ligaturing
+local kerning=node.kerning
+local basepass=true
+local function l_warning() texio.write_nl("warning: node.ligaturing called directly") l_warning=nil end
+local function k_warning() texio.write_nl("warning: node.kerning called directly") k_warning=nil end
+function node.ligaturing(...)
+ if basepass and l_warning then
+ l_warning()
+ end
+ return ligaturing(...)
+end
+function node.kerning(...)
+ if basepass and k_warning then
+ k_warning()
+ end
+ return kerning(...)
+end
+function nodes.handlers.setbasepass(v)
+ basepass=v
+end
+function nodes.handlers.nodepass(head)
local fontdata=fonts.hashes.identifiers
if fontdata then
- local usedfonts,done,prevfont={},false,nil
+ local usedfonts={}
+ local basefonts={}
+ local prevfont=nil
+ local basefont=nil
for n in traverse_id(glyph_code,head) do
local font=n.font
if font~=prevfont then
+ if basefont then
+ basefont[2]=n.prev
+ end
prevfont=font
local used=usedfonts[font]
if not used then
@@ -13795,18 +15174,57 @@ function nodes.handlers.characters(head)
local processors=shared.processes
if processors and #processors>0 then
usedfonts[font]=processors
- done=true
+ elseif basepass then
+ basefont={ n,nil }
+ basefonts[#basefonts+1]=basefont
+ end
+ end
+ end
+ end
+ end
+ end
+ for d in traverse_id(disc_code,head) do
+ local r=d.replace
+ if r then
+ for n in traverse_id(glyph_code,r) do
+ local font=n.font
+ if font~=prevfont then
+ prevfont=font
+ local used=usedfonts[font]
+ if not used then
+ local tfmdata=fontdata[font]
+ if tfmdata then
+ local shared=tfmdata.shared
+ if shared then
+ local processors=shared.processes
+ if processors and #processors>0 then
+ usedfonts[font]=processors
+ end
+ end
end
end
end
end
end
end
- if done then
+ if next(usedfonts) then
for font,processors in next,usedfonts do
for i=1,#processors do
- local h,d=processors[i](head,font,0)
- head,done=h or head,done or d
+ head=processors[i](head,font,0) or head
+ end
+ end
+ end
+ if basepass and #basefonts>0 then
+ for i=1,#basefonts do
+ local range=basefonts[i]
+ local start=range[1]
+ local stop=range[2]
+ if stop then
+ start,stop=ligaturing(start,stop)
+ start,stop=kerning(start,stop)
+ elseif start then
+ start=ligaturing(start)
+ start=kerning(start)
end
end
end
@@ -13815,13 +15233,27 @@ function nodes.handlers.characters(head)
return head,false
end
end
+function nodes.handlers.basepass(head)
+ if not basepass then
+ head=ligaturing(head)
+ head=kerning(head)
+ end
+ return head,true
+end
+local nodepass=nodes.handlers.nodepass
+local basepass=nodes.handlers.basepass
+local injectpass=nodes.injections.handler
+local protectpass=nodes.handlers.protectglyphs
function nodes.simple_font_handler(head)
- head=nodes.handlers.characters(head)
- nodes.injections.handler(head)
- nodes.handlers.protectglyphs(head)
- head=node.ligaturing(head)
- head=node.kerning(head)
- return head
+ if head then
+ head=nodepass(head)
+ head=injectpass(head)
+ head=basepass(head)
+ protectpass(head)
+ return head,true
+ else
+ return head,false
+ end
end
end -- closure
diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-ota.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-ota.lua
new file mode 100644
index 00000000000..f083fe09e83
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-ota.lua
@@ -0,0 +1,459 @@
+if not modules then modules = { } end modules ['font-otx'] = {
+ version = 1.001,
+ comment = "companion to font-otf.lua (analysing)",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local type = type
+
+if not trackers then trackers = { register = function() end } end
+
+----- trace_analyzing = false trackers.register("otf.analyzing", function(v) trace_analyzing = v end)
+
+local fonts, nodes, node = fonts, nodes, node
+
+local allocate = utilities.storage.allocate
+
+local otf = fonts.handlers.otf
+
+local analyzers = fonts.analyzers
+local initializers = allocate()
+local methods = allocate()
+
+analyzers.initializers = initializers
+analyzers.methods = methods
+analyzers.useunicodemarks = false
+
+local a_state = attributes.private('state')
+
+local nuts = nodes.nuts
+local tonut = nuts.tonut
+
+local getfield = nuts.getfield
+local getnext = nuts.getnext
+local getprev = nuts.getprev
+local getid = nuts.getid
+local getprop = nuts.getprop
+local setprop = nuts.setprop
+local getfont = nuts.getfont
+local getsubtype = nuts.getsubtype
+local getchar = nuts.getchar
+
+local traverse_id = nuts.traverse_id
+local traverse_node_list = nuts.traverse
+local end_of_math = nuts.end_of_math
+
+local nodecodes = nodes.nodecodes
+local glyph_code = nodecodes.glyph
+local disc_code = nodecodes.disc
+local math_code = nodecodes.math
+
+local fontdata = fonts.hashes.identifiers
+local categories = characters and characters.categories or { } -- sorry, only in context
+
+local otffeatures = fonts.constructors.newfeatures("otf")
+local registerotffeature = otffeatures.register
+
+--[[ldx--
+<p>Analyzers run per script and/or language and are needed in order to
+process features right.</p>
+--ldx]]--
+
+-- never use these numbers directly
+
+local s_init = 1 local s_rphf = 7
+local s_medi = 2 local s_half = 8
+local s_fina = 3 local s_pref = 9
+local s_isol = 4 local s_blwf = 10
+local s_mark = 5 local s_pstf = 11
+local s_rest = 6
+
+local states = {
+ init = s_init,
+ medi = s_medi,
+ fina = s_fina,
+ isol = s_isol,
+ mark = s_mark,
+ rest = s_rest,
+ rphf = s_rphf,
+ half = s_half,
+ pref = s_pref,
+ blwf = s_blwf,
+ pstf = s_pstf,
+}
+
+local features = {
+ init = s_init,
+ medi = s_medi,
+ fina = s_fina,
+ isol = s_isol,
+ -- mark = s_mark,
+ -- rest = s_rest,
+ rphf = s_rphf,
+ half = s_half,
+ pref = s_pref,
+ blwf = s_blwf,
+ pstf = s_pstf,
+}
+
+analyzers.states = states
+analyzers.features = features
+
+-- todo: analyzers per script/lang, cross font, so we need an font id hash -> script
+-- e.g. latin -> hyphenate, arab -> 1/2/3 analyze -- its own namespace
+
+function analyzers.setstate(head,font)
+ local useunicodemarks = analyzers.useunicodemarks
+ local tfmdata = fontdata[font]
+ local descriptions = tfmdata.descriptions
+ local first, last, current, n, done = nil, nil, head, 0, false -- maybe make n boolean
+ current = tonut(current)
+ while current do
+ local id = getid(current)
+ if id == glyph_code and getfont(current) == font then
+ done = true
+ local char = getchar(current)
+ local d = descriptions[char]
+ if d then
+ if d.class == "mark" or (useunicodemarks and categories[char] == "mn") then
+ done = true
+ setprop(current,a_state,s_mark)
+ elseif n == 0 then
+ first, last, n = current, current, 1
+ setprop(current,a_state,s_init)
+ else
+ last, n = current, n+1
+ setprop(current,a_state,s_medi)
+ end
+ else -- finish
+ if first and first == last then
+ setprop(last,a_state,s_isol)
+ elseif last then
+ setprop(last,a_state,s_fina)
+ end
+ first, last, n = nil, nil, 0
+ end
+ elseif id == disc_code then
+ -- always in the middle
+ setprop(current,a_state,s_medi)
+ last = current
+ else -- finish
+ if first and first == last then
+ setprop(last,a_state,s_isol)
+ elseif last then
+ setprop(last,a_state,s_fina)
+ end
+ first, last, n = nil, nil, 0
+ if id == math_code then
+ current = end_of_math(current)
+ end
+ end
+ current = getnext(current)
+ end
+ if first and first == last then
+ setprop(last,a_state,s_isol)
+ elseif last then
+ setprop(last,a_state,s_fina)
+ end
+ return head, done
+end
+
+-- in the future we will use language/script attributes instead of the
+-- font related value, but then we also need dynamic features which is
+-- somewhat slower; and .. we need a chain of them
+
+local function analyzeinitializer(tfmdata,value) -- attr
+ local script, language = otf.scriptandlanguage(tfmdata) -- attr
+ local action = initializers[script]
+ if not action then
+ -- skip
+ elseif type(action) == "function" then
+ return action(tfmdata,value)
+ else
+ local action = action[language]
+ if action then
+ return action(tfmdata,value)
+ end
+ end
+end
+
+local function analyzeprocessor(head,font,attr)
+ local tfmdata = fontdata[font]
+ local script, language = otf.scriptandlanguage(tfmdata,attr)
+ local action = methods[script]
+ if not action then
+ -- skip
+ elseif type(action) == "function" then
+ return action(head,font,attr)
+ else
+ action = action[language]
+ if action then
+ return action(head,font,attr)
+ end
+ end
+ return head, false
+end
+
+registerotffeature {
+ name = "analyze",
+ description = "analysis of character classes",
+ default = true,
+ initializers = {
+ node = analyzeinitializer,
+ },
+ processors = {
+ position = 1,
+ node = analyzeprocessor,
+ }
+}
+
+-- latin
+
+methods.latn = analyzers.setstate
+
+-- This info eventually can go into char-def and we will have a state
+-- table for generic then (unicode recognized all states but in practice
+-- only has only
+--
+-- isolated : isol
+-- final : isol_fina
+-- medial : isol_fina_medi_init
+--
+-- so in practice, without analyzer it's rather useless info which is
+-- why having it in char-def makes only sense for special purposes (like)
+-- like tracing cq. visualizing.
+
+local tatweel = 0x0640
+local zwnj = 0x200C
+local zwj = 0x200D
+
+local isolated = { -- isol
+ [0x0600] = true, [0x0601] = true, [0x0602] = true, [0x0603] = true,
+ [0x0604] = true,
+ [0x0608] = true, [0x060B] = true, [0x0621] = true, [0x0674] = true,
+ [0x06DD] = true,
+ -- mandaic
+ [0x0856] = true, [0x0858] = true, [0x0857] = true,
+ -- n'ko
+ [0x07FA] = true,
+ -- also here:
+ [zwnj] = true,
+ -- 7
+ [0x08AD] = true,
+}
+
+local final = { -- isol_fina
+ [0x0622] = true, [0x0623] = true, [0x0624] = true, [0x0625] = true,
+ [0x0627] = true, [0x0629] = true, [0x062F] = true, [0x0630] = true,
+ [0x0631] = true, [0x0632] = true, [0x0648] = true, [0x0671] = true,
+ [0x0672] = true, [0x0673] = true, [0x0675] = true, [0x0676] = true,
+ [0x0677] = true, [0x0688] = true, [0x0689] = true, [0x068A] = true,
+ [0x068B] = true, [0x068C] = true, [0x068D] = true, [0x068E] = true,
+ [0x068F] = true, [0x0690] = true, [0x0691] = true, [0x0692] = true,
+ [0x0693] = true, [0x0694] = true, [0x0695] = true, [0x0696] = true,
+ [0x0697] = true, [0x0698] = true, [0x0699] = true, [0x06C0] = true,
+ [0x06C3] = true, [0x06C4] = true, [0x06C5] = true, [0x06C6] = true,
+ [0x06C7] = true, [0x06C8] = true, [0x06C9] = true, [0x06CA] = true,
+ [0x06CB] = true, [0x06CD] = true, [0x06CF] = true, [0x06D2] = true,
+ [0x06D3] = true, [0x06D5] = true, [0x06EE] = true, [0x06EF] = true,
+ [0x0759] = true, [0x075A] = true, [0x075B] = true, [0x076B] = true,
+ [0x076C] = true, [0x0771] = true, [0x0773] = true, [0x0774] = true,
+ [0x0778] = true, [0x0779] = true,
+ [0x08AA] = true, [0x08AB] = true, [0x08AC] = true,
+ [0xFEF5] = true, [0xFEF7] = true, [0xFEF9] = true, [0xFEFB] = true,
+ -- syriac
+ [0x0710] = true, [0x0715] = true, [0x0716] = true, [0x0717] = true,
+ [0x0718] = true, [0x0719] = true, [0x0728] = true, [0x072A] = true,
+ [0x072C] = true, [0x071E] = true,
+ [0x072F] = true, [0x074D] = true,
+ -- mandaic
+ [0x0840] = true, [0x0849] = true, [0x0854] = true, [0x0846] = true,
+ [0x084F] = true,
+ -- 7
+ [0x08AE] = true, [0x08B1] = true, [0x08B2] = true,
+}
+
+local medial = { -- isol_fina_medi_init
+ [0x0626] = true, [0x0628] = true, [0x062A] = true, [0x062B] = true,
+ [0x062C] = true, [0x062D] = true, [0x062E] = true, [0x0633] = true,
+ [0x0634] = true, [0x0635] = true, [0x0636] = true, [0x0637] = true,
+ [0x0638] = true, [0x0639] = true, [0x063A] = true, [0x063B] = true,
+ [0x063C] = true, [0x063D] = true, [0x063E] = true, [0x063F] = true,
+ [0x0641] = true, [0x0642] = true, [0x0643] = true,
+ [0x0644] = true, [0x0645] = true, [0x0646] = true, [0x0647] = true,
+ [0x0649] = true, [0x064A] = true, [0x066E] = true, [0x066F] = true,
+ [0x0678] = true, [0x0679] = true, [0x067A] = true, [0x067B] = true,
+ [0x067C] = true, [0x067D] = true, [0x067E] = true, [0x067F] = true,
+ [0x0680] = true, [0x0681] = true, [0x0682] = true, [0x0683] = true,
+ [0x0684] = true, [0x0685] = true, [0x0686] = true, [0x0687] = true,
+ [0x069A] = true, [0x069B] = true, [0x069C] = true, [0x069D] = true,
+ [0x069E] = true, [0x069F] = true, [0x06A0] = true, [0x06A1] = true,
+ [0x06A2] = true, [0x06A3] = true, [0x06A4] = true, [0x06A5] = true,
+ [0x06A6] = true, [0x06A7] = true, [0x06A8] = true, [0x06A9] = true,
+ [0x06AA] = true, [0x06AB] = true, [0x06AC] = true, [0x06AD] = true,
+ [0x06AE] = true, [0x06AF] = true, [0x06B0] = true, [0x06B1] = true,
+ [0x06B2] = true, [0x06B3] = true, [0x06B4] = true, [0x06B5] = true,
+ [0x06B6] = true, [0x06B7] = true, [0x06B8] = true, [0x06B9] = true,
+ [0x06BA] = true, [0x06BB] = true, [0x06BC] = true, [0x06BD] = true,
+ [0x06BE] = true, [0x06BF] = true, [0x06C1] = true, [0x06C2] = true,
+ [0x06CC] = true, [0x06CE] = true, [0x06D0] = true, [0x06D1] = true,
+ [0x06FA] = true, [0x06FB] = true, [0x06FC] = true, [0x06FF] = true,
+ [0x0750] = true, [0x0751] = true, [0x0752] = true, [0x0753] = true,
+ [0x0754] = true, [0x0755] = true, [0x0756] = true, [0x0757] = true,
+ [0x0758] = true, [0x075C] = true, [0x075D] = true, [0x075E] = true,
+ [0x075F] = true, [0x0760] = true, [0x0761] = true, [0x0762] = true,
+ [0x0763] = true, [0x0764] = true, [0x0765] = true, [0x0766] = true,
+ [0x0767] = true, [0x0768] = true, [0x0769] = true, [0x076A] = true,
+ [0x076D] = true, [0x076E] = true, [0x076F] = true, [0x0770] = true,
+ [0x0772] = true, [0x0775] = true, [0x0776] = true, [0x0777] = true,
+ [0x077A] = true, [0x077B] = true, [0x077C] = true, [0x077D] = true,
+ [0x077E] = true, [0x077F] = true,
+ [0x08A0] = true, [0x08A2] = true, [0x08A4] = true, [0x08A5] = true,
+ [0x08A6] = true, [0x0620] = true, [0x08A8] = true, [0x08A9] = true,
+ [0x08A7] = true, [0x08A3] = true,
+ -- syriac
+ [0x0712] = true, [0x0713] = true, [0x0714] = true, [0x071A] = true,
+ [0x071B] = true, [0x071C] = true, [0x071D] = true, [0x071F] = true,
+ [0x0720] = true, [0x0721] = true, [0x0722] = true, [0x0723] = true,
+ [0x0724] = true, [0x0725] = true, [0x0726] = true, [0x0727] = true,
+ [0x0729] = true, [0x072B] = true, [0x072D] = true, [0x072E] = true,
+ [0x074E] = true, [0x074F] = true,
+ -- mandaic
+ [0x0841] = true, [0x0842] = true, [0x0843] = true, [0x0844] = true,
+ [0x0845] = true, [0x0847] = true, [0x0848] = true, [0x0855] = true,
+ [0x0851] = true, [0x084E] = true, [0x084D] = true, [0x084A] = true,
+ [0x084B] = true, [0x084C] = true, [0x0850] = true, [0x0852] = true,
+ [0x0853] = true,
+ -- n'ko
+ [0x07D7] = true, [0x07E8] = true, [0x07D9] = true, [0x07EA] = true,
+ [0x07CA] = true, [0x07DB] = true, [0x07CC] = true, [0x07DD] = true,
+ [0x07CE] = true, [0x07DF] = true, [0x07D4] = true, [0x07E5] = true,
+ [0x07E9] = true, [0x07E7] = true, [0x07E3] = true, [0x07E2] = true,
+ [0x07E0] = true, [0x07E1] = true, [0x07DE] = true, [0x07DC] = true,
+ [0x07D1] = true, [0x07DA] = true, [0x07D8] = true, [0x07D6] = true,
+ [0x07D2] = true, [0x07D0] = true, [0x07CF] = true, [0x07CD] = true,
+ [0x07CB] = true, [0x07D3] = true, [0x07E4] = true, [0x07D5] = true,
+ [0x07E6] = true,
+ -- also here:
+ [tatweel]= true, [zwj] = true,
+ -- 7
+ [0x08A1] = true, [0x08AF] = true, [0x08B0] = true,
+}
+
+local arab_warned = { }
+
+-- todo: gref
+
+local function warning(current,what)
+ local char = getchar(current)
+ if not arab_warned[char] then
+ log.report("analyze","arab: character %C has no %a class",char,what)
+ arab_warned[char] = true
+ end
+end
+
+-- potential optimization: local medial_final = table.merged(medial,final)
+
+local function finish(first,last)
+ if last then
+ if first == last then
+ local fc = getchar(first)
+ if medial[fc] or final[fc] then
+ setprop(first,a_state,s_isol)
+ else
+ warning(first,"isol")
+ setprop(first,a_state,s_error)
+ end
+ else
+ local lc = getchar(last)
+ if medial[lc] or final[lc] then
+ -- if laststate == 1 or laststate == 2 or laststate == 4 then
+ setprop(last,a_state,s_fina)
+ else
+ warning(last,"fina")
+ setprop(last,a_state,s_error)
+ end
+ end
+ first, last = nil, nil
+ elseif first then
+ -- first and last are either both set so we never com here
+ local fc = getchar(first)
+ if medial[fc] or final[fc] then
+ setprop(first,a_state,s_isol)
+ else
+ warning(first,"isol")
+ setprop(first,a_state,s_error)
+ end
+ first = nil
+ end
+ return first, last
+end
+
+function methods.arab(head,font,attr)
+ local useunicodemarks = analyzers.useunicodemarks
+ local tfmdata = fontdata[font]
+ local marks = tfmdata.resources.marks
+ local first, last, current, done = nil, nil, head, false
+ current = tonut(current)
+ while current do
+ local id = getid(current)
+ if id == glyph_code and getfont(current) == font and getsubtype(current)<256 and not getprop(current,a_state) then
+ done = true
+ local char = getchar(current)
+ if marks[char] or (useunicodemarks and categories[char] == "mn") then
+ setprop(current,a_state,s_mark)
+ elseif isolated[char] then -- can be zwj or zwnj too
+ first, last = finish(first,last)
+ setprop(current,a_state,s_isol)
+ first, last = nil, nil
+ elseif not first then
+ if medial[char] then
+ setprop(current,a_state,s_init)
+ first, last = first or current, current
+ elseif final[char] then
+ setprop(current,a_state,s_isol)
+ first, last = nil, nil
+ else -- no arab
+ first, last = finish(first,last)
+ end
+ elseif medial[char] then
+ first, last = first or current, current
+ setprop(current,a_state,s_medi)
+ elseif final[char] then
+ if getprop(last,a_state) ~= s_init then
+ -- tricky, we need to check what last may be !
+ setprop(last,a_state,s_medi)
+ end
+ setprop(current,a_state,s_fina)
+ first, last = nil, nil
+ elseif char >= 0x0600 and char <= 0x06FF then -- needs checking
+ setprop(current,a_state,s_rest)
+ first, last = finish(first,last)
+ else -- no
+ first, last = finish(first,last)
+ end
+ else
+ if first or last then
+ first, last = finish(first,last)
+ end
+ if id == math_code then
+ current = end_of_math(current)
+ end
+ end
+ current = getnext(current)
+ end
+ if first or last then
+ finish(first,last)
+ end
+ return head, done
+end
+
+methods.syrc = methods.arab
+methods.mand = methods.arab
+methods.nko = methods.arab
+
+directives.register("otf.analyze.useunicodemarks",function(v)
+ analyzers.useunicodemarks = v
+end)
diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-otn.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-otn.lua
index 068f0a9b926..343e1826e0f 100644
--- a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-otn.lua
+++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-otn.lua
@@ -6,8 +6,17 @@ if not modules then modules = { } end modules ['font-otn'] = {
license = "see context related readme files",
}
+-- todo: looks like we have a leak somewhere (probably in ligatures)
+-- todo: copy attributes to disc
+
+-- this is a context version which can contain experimental code, but when we
+-- have serious patches we also need to change the other two font-otn files
+
-- preprocessors = { "nodes" }
+-- anchor class : mark, mkmk, curs, mklg (todo)
+-- anchor type : mark, basechar, baselig, basemark, centry, cexit, max (todo)
+
-- this is still somewhat preliminary and it will get better in due time;
-- much functionality could only be implemented thanks to the husayni font
-- of Idris Samawi Hamid to who we dedicate this module.
@@ -20,7 +29,6 @@ if not modules then modules = { } end modules ['font-otn'] = {
-- todo:
--
--- kerning is probably not yet ok for latin around dics nodes (interesting challenge)
-- extension infrastructure (for usage out of context)
-- sorting features according to vendors/renderers
-- alternative loop quitters
@@ -160,6 +168,7 @@ local report_chain = logs.reporter("fonts","otf chain")
local report_process = logs.reporter("fonts","otf process")
local report_prepare = logs.reporter("fonts","otf prepare")
local report_warning = logs.reporter("fonts","otf warning")
+local report_run = logs.reporter("fonts","otf run")
registertracker("otf.verbose_chain", function(v) otf.setcontextchain(v and "verbose") end)
registertracker("otf.normal_chain", function(v) otf.setcontextchain(v and "normal") end)
@@ -171,12 +180,35 @@ registertracker("otf.injections","nodes.injections")
registertracker("*otf.sample","otf.steps,otf.actions,otf.analyzing")
-local insert_node_after = node.insert_after
-local delete_node = nodes.delete
-local copy_node = node.copy
-local find_node_tail = node.tail or node.slide
-local flush_node_list = node.flush_list
-local end_of_math = node.end_of_math
+local nuts = nodes.nuts
+local tonode = nuts.tonode
+local tonut = nuts.tonut
+
+local getfield = nuts.getfield
+local setfield = nuts.setfield
+local getnext = nuts.getnext
+local getprev = nuts.getprev
+local getid = nuts.getid
+local getattr = nuts.getattr
+local setattr = nuts.setattr
+local getprop = nuts.getprop
+local setprop = nuts.setprop
+local getfont = nuts.getfont
+local getsubtype = nuts.getsubtype
+local getchar = nuts.getchar
+
+local insert_node_before = nuts.insert_before
+local insert_node_after = nuts.insert_after
+local delete_node = nuts.delete
+local remove_node = nuts.remove
+local copy_node = nuts.copy
+local copy_node_list = nuts.copy_list
+local find_node_tail = nuts.tail
+local flush_node_list = nuts.flush_list
+local free_node = nuts.free
+local end_of_math = nuts.end_of_math
+local traverse_nodes = nuts.traverse
+local traverse_id = nuts.traverse_id
local setmetatableindex = table.setmetatableindex
@@ -200,36 +232,33 @@ local dir_code = whatcodes.dir
local localpar_code = whatcodes.localpar
local discretionary_code = disccodes.discretionary
+local regular_code = disccodes.regular
+local automatic_code = disccodes.automatic
local ligature_code = glyphcodes.ligature
local privateattribute = attributes.private
-- Something is messed up: we have two mark / ligature indices, one at the injection
--- end and one here ... this is bases in KE's patches but there is something fishy
+-- end and one here ... this is based on KE's patches but there is something fishy
-- there as I'm pretty sure that for husayni we need some connection (as it's much
-- more complex than an average font) but I need proper examples of all cases, not
-- of only some.
local a_state = privateattribute('state')
-local a_markbase = privateattribute('markbase')
-local a_markmark = privateattribute('markmark')
-local a_markdone = privateattribute('markdone') -- assigned at the injection end
-local a_cursbase = privateattribute('cursbase')
-local a_curscurs = privateattribute('curscurs')
-local a_cursdone = privateattribute('cursdone')
-local a_kernpair = privateattribute('kernpair')
-local a_ligacomp = privateattribute('ligacomp') -- assigned here (ideally it should be combined)
+local a_cursbase = privateattribute('cursbase') -- to be checked, probably can go
local injections = nodes.injections
local setmark = injections.setmark
local setcursive = injections.setcursive
local setkern = injections.setkern
local setpair = injections.setpair
+local resetinjection = injections.reset
+local copyinjection = injections.copy
+local setligaindex = injections.setligaindex
+local getligaindex = injections.getligaindex
-local markonce = true
local cursonce = true
-local kernonce = true
local fonthashes = fonts.hashes
local fontdata = fonthashes.identifiers
@@ -252,6 +281,7 @@ local currentfont = false
local lookuptable = false
local anchorlookups = false
local lookuptypes = false
+local lookuptags = false
local handlers = { }
local rlmode = 0
local featurevalue = false
@@ -306,20 +336,20 @@ end
local function cref(kind,chainname,chainlookupname,lookupname,index) -- not in the mood to alias f_
if index then
- return formatters["feature %a, chain %a, sub %a, lookup %a, index %a"](kind,chainname,chainlookupname,lookupname,index)
+ return formatters["feature %a, chain %a, sub %a, lookup %a, index %a"](kind,chainname,chainlookupname,lookuptags[lookupname],index)
elseif lookupname then
- return formatters["feature %a, chain %a, sub %a, lookup %a"](kind,chainname,chainlookupname,lookupname)
+ return formatters["feature %a, chain %a, sub %a, lookup %a"](kind,chainname,chainlookupname,lookuptags[lookupname])
elseif chainlookupname then
- return formatters["feature %a, chain %a, sub %a"](kind,chainname,chainlookupname)
+ return formatters["feature %a, chain %a, sub %a"](kind,lookuptags[chainname],lookuptags[chainlookupname])
elseif chainname then
- return formatters["feature %a, chain %a"](kind,chainname)
+ return formatters["feature %a, chain %a"](kind,lookuptags[chainname])
else
return formatters["feature %a"](kind)
end
end
local function pref(kind,lookupname)
- return formatters["feature %a, lookup %a"](kind,lookupname)
+ return formatters["feature %a, lookup %a"](kind,lookuptags[lookupname])
end
-- We can assume that languages that use marks are not hyphenated. We can also assume
@@ -332,42 +362,49 @@ end
-- and indices.
local function copy_glyph(g) -- next and prev are untouched !
- local components = g.components
+ local components = getfield(g,"components")
if components then
- g.components = nil
+ setfield(g,"components",nil)
local n = copy_node(g)
- g.components = components
+ copyinjection(n,g) -- we need to preserve the lig indices
+ setfield(g,"components",components)
return n
else
- return copy_node(g)
+ local n = copy_node(g)
+ copyinjection(n,g) -- we need to preserve the lig indices
+ return n
end
end
+--
+
+
-- start is a mark and we need to keep that one
local function markstoligature(kind,lookupname,head,start,stop,char)
- if start == stop and start.char == char then
+ if start == stop and getchar(start) == char then
return head, start
else
- local prev = start.prev
- local next = stop.next
- start.prev = nil
- stop.next = nil
+ local prev = getprev(start)
+ local next = getnext(stop)
+ setfield(start,"prev",nil)
+ setfield(stop,"next",nil)
local base = copy_glyph(start)
if head == start then
head = base
end
- base.char = char
- base.subtype = ligature_code
- base.components = start
+ resetinjection(base)
+ setfield(base,"char",char)
+ setfield(base,"subtype",ligature_code)
+ setfield(base,"components",start)
if prev then
- prev.next = base
+ setfield(prev,"next",base)
end
if next then
- next.prev = base
+ setfield(next,"prev",base)
end
- base.next = next
- base.prev = prev
+ setfield(base,"next",next)
+ setfield(base,"prev",prev)
return head, base
end
end
@@ -380,17 +417,17 @@ end
-- third component.
local function getcomponentindex(start)
- if start.id ~= glyph_code then
+ if getid(start) ~= glyph_code then
return 0
- elseif start.subtype == ligature_code then
+ elseif getsubtype(start) == ligature_code then
local i = 0
- local components = start.components
+ local components = getfield(start,"components")
while components do
i = i + getcomponentindex(components)
- components = components.next
+ components = getnext(components)
end
return i
- elseif not marks[start.char] then
+ elseif not marks[getchar(start)] then
return 1
else
return 0
@@ -400,29 +437,31 @@ end
-- eventually we will do positioning in an other way (needs addional w/h/d fields)
local function toligature(kind,lookupname,head,start,stop,char,markflag,discfound) -- brr head
- if start == stop and start.char == char then
- start.char = char
+ if start == stop and getchar(start) == char then
+ resetinjection(start)
+ setfield(start,"char",char)
return head, start
end
- local prev = start.prev
- local next = stop.next
- start.prev = nil
- stop.next = nil
+ local prev = getprev(start)
+ local next = getnext(stop)
+ setfield(start,"prev",nil)
+ setfield(stop,"next",nil)
local base = copy_glyph(start)
if start == head then
head = base
end
- base.char = char
- base.subtype = ligature_code
- base.components = start -- start can have components
+ resetinjection(base)
+ setfield(base,"char",char)
+ setfield(base,"subtype",ligature_code)
+ setfield(base,"components",start) -- start can have components
if prev then
- prev.next = base
+ setfield(prev,"next",base)
end
if next then
- next.prev = base
+ setfield(next,"prev",base)
end
- base.next = next
- base.prev = prev
+ setfield(base,"next",next)
+ setfield(base,"prev",prev)
if not discfound then
local deletemarks = markflag ~= "mark"
local components = start
@@ -432,35 +471,35 @@ local function toligature(kind,lookupname,head,start,stop,char,markflag,discfoun
local current = base
-- first we loop over the glyphs in start .. stop
while start do
- local char = start.char
+ local char = getchar(start)
if not marks[char] then
baseindex = baseindex + componentindex
componentindex = getcomponentindex(start)
elseif not deletemarks then -- quite fishy
- start[a_ligacomp] = baseindex + (start[a_ligacomp] or componentindex)
+ setligaindex(start,baseindex + getligaindex(start,componentindex))
if trace_marks then
- logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(char),start[a_ligacomp])
+ logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(char),getligaindex(start))
end
head, current = insert_node_after(head,current,copy_node(start)) -- unlikely that mark has components
elseif trace_marks then
logwarning("%s: delete mark %s",pref(kind,lookupname),gref(char))
end
- start = start.next
+ start = getnext(start)
end
-- we can have one accent as part of a lookup and another following
-- local start = components -- was wrong (component scanning was introduced when more complex ligs in devanagari was added)
- local start = current.next
- while start and start.id == glyph_code do
- local char = start.char
+ local start = getnext(current)
+ while start and getid(start) == glyph_code do
+ local char = getchar(start)
if marks[char] then
- start[a_ligacomp] = baseindex + (start[a_ligacomp] or componentindex)
+ setligaindex(start,baseindex + getligaindex(start,componentindex))
if trace_marks then
- logwarning("%s: set mark %s, gets index %s",pref(kind,lookupname),gref(char),start[a_ligacomp])
+ logwarning("%s: set mark %s, gets index %s",pref(kind,lookupname),gref(char),getligaindex(start))
end
else
break
end
- start = start.next
+ start = getnext(start)
end
end
return head, base
@@ -468,9 +507,10 @@ end
function handlers.gsub_single(head,start,kind,lookupname,replacement)
if trace_singles then
- logprocess("%s: replacing %s by single %s",pref(kind,lookupname),gref(start.char),gref(replacement))
+ logprocess("%s: replacing %s by single %s",pref(kind,lookupname),gref(getchar(start)),gref(replacement))
end
- start.char = replacement
+ resetinjection(start)
+ setfield(start,"char",replacement)
return head, start, true
end
@@ -497,7 +537,7 @@ local function get_alternative_glyph(start,alternatives,value,trace_alternatives
return false, trace_alternatives and formatters["invalid value %a, %s"](value,"out of range")
end
elseif value == 0 then
- return start.char, trace_alternatives and formatters["invalid value %a, %s"](value,"no change")
+ return getchar(start), trace_alternatives and formatters["invalid value %a, %s"](value,"no change")
elseif value < 1 then
return alternatives[1], trace_alternatives and formatters["invalid value %a, taking %a"](value,1)
else
@@ -509,30 +549,32 @@ end
local function multiple_glyphs(head,start,multiple,ignoremarks)
local nofmultiples = #multiple
if nofmultiples > 0 then
- start.char = multiple[1]
+ resetinjection(start)
+ setfield(start,"char",multiple[1])
if nofmultiples > 1 then
- local sn = start.next
+ local sn = getnext(start)
for k=2,nofmultiples do -- todo: use insert_node
-- untested:
--
--- while ignoremarks and marks[sn.char] then
--- local sn = sn.next
+-- while ignoremarks and marks[getchar(sn)] then
+-- local sn = getnext(sn)
-- end
local n = copy_node(start) -- ignore components
- n.char = multiple[k]
- n.next = sn
- n.prev = start
+ resetinjection(n)
+ setfield(n,"char",multiple[k])
+ setfield(n,"next",sn)
+ setfield(n,"prev",start)
if sn then
- sn.prev = n
+ setfield(sn,"prev",n)
end
- start.next = n
+ setfield(start,"next",n)
start = n
end
end
return head, start, true
else
if trace_multiples then
- logprocess("no multiple for %s",gref(start.char))
+ logprocess("no multiple for %s",gref(getchar(start)))
end
return head, start, false
end
@@ -543,12 +585,13 @@ function handlers.gsub_alternate(head,start,kind,lookupname,alternative,sequence
local choice, comment = get_alternative_glyph(start,alternative,value,trace_alternatives)
if choice then
if trace_alternatives then
- logprocess("%s: replacing %s by alternative %a to %s, %s",pref(kind,lookupname),gref(start.char),choice,gref(choice),comment)
+ logprocess("%s: replacing %s by alternative %a to %s, %s",pref(kind,lookupname),gref(getchar(start)),choice,gref(choice),comment)
end
- start.char = choice
+ resetinjection(start)
+ setfield(start,"char",choice)
else
if trace_alternatives then
- logwarning("%s: no variant %a for %s, %s",pref(kind,lookupname),value,gref(start.char),comment)
+ logwarning("%s: no variant %a for %s, %s",pref(kind,lookupname),value,gref(getchar(start)),comment)
end
end
return head, start, true
@@ -556,23 +599,23 @@ end
function handlers.gsub_multiple(head,start,kind,lookupname,multiple,sequence)
if trace_multiples then
- logprocess("%s: replacing %s by multiple %s",pref(kind,lookupname),gref(start.char),gref(multiple))
+ logprocess("%s: replacing %s by multiple %s",pref(kind,lookupname),gref(getchar(start)),gref(multiple))
end
return multiple_glyphs(head,start,multiple,sequence.flags[1])
end
function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence)
- local s, stop, discfound = start.next, nil, false
- local startchar = start.char
+ local s, stop, discfound = getnext(start), nil, false
+ local startchar = getchar(start)
if marks[startchar] then
while s do
- local id = s.id
- if id == glyph_code and s.font == currentfont and s.subtype<256 then
- local lg = ligature[s.char]
+ local id = getid(s)
+ if id == glyph_code and getfont(s) == currentfont and getsubtype(s)<256 then
+ local lg = ligature[getchar(s)]
if lg then
stop = s
ligature = lg
- s = s.next
+ s = getnext(s)
else
break
end
@@ -584,9 +627,9 @@ function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence)
local lig = ligature.ligature
if lig then
if trace_ligatures then
- local stopchar = stop.char
+ local stopchar = getchar(stop)
head, start = markstoligature(kind,lookupname,head,start,stop,lig)
- logprocess("%s: replacing %s upto %s by ligature %s case 1",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(start.char))
+ logprocess("%s: replacing %s upto %s by ligature %s case 1",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(getchar(start)))
else
head, start = markstoligature(kind,lookupname,head,start,stop,lig)
end
@@ -598,18 +641,18 @@ function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence)
else
local skipmark = sequence.flags[1]
while s do
- local id = s.id
- if id == glyph_code and s.subtype<256 then
- if s.font == currentfont then
- local char = s.char
+ local id = getid(s)
+ if id == glyph_code and getsubtype(s)<256 then
+ if getfont(s) == currentfont then
+ local char = getchar(s)
if skipmark and marks[char] then
- s = s.next
+ s = getnext(s)
else
local lg = ligature[char]
if lg then
stop = s
ligature = lg
- s = s.next
+ s = getnext(s)
else
break
end
@@ -619,7 +662,7 @@ function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence)
end
elseif id == disc_code then
discfound = true
- s = s.next
+ s = getnext(s)
else
break
end
@@ -628,21 +671,21 @@ function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence)
if lig then
if stop then
if trace_ligatures then
- local stopchar = stop.char
+ local stopchar = getchar(stop)
head, start = toligature(kind,lookupname,head,start,stop,lig,skipmark,discfound)
- logprocess("%s: replacing %s upto %s by ligature %s case 2",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(start.char))
+ logprocess("%s: replacing %s upto %s by ligature %s case 2",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(getchar(start)))
else
head, start = toligature(kind,lookupname,head,start,stop,lig,skipmark,discfound)
end
- return head, start, true
else
-- weird but happens (in some arabic font)
- start.char = lig
+ resetinjection(start)
+ setfield(start,"char",lig)
if trace_ligatures then
logprocess("%s: replacing %s by (no real) ligature %s case 3",pref(kind,lookupname),gref(startchar),gref(lig))
end
- return head, start, true
end
+ return head, start, true
else
-- weird but happens
end
@@ -656,16 +699,16 @@ we need to explicitly test for basechar, baselig and basemark entries.</p>
--ldx]]--
function handlers.gpos_mark2base(head,start,kind,lookupname,markanchors,sequence)
- local markchar = start.char
+ local markchar = getchar(start)
if marks[markchar] then
- local base = start.prev -- [glyph] [start=mark]
- if base and base.id == glyph_code and base.font == currentfont and base.subtype<256 then
- local basechar = base.char
+ local base = getprev(start) -- [glyph] [start=mark]
+ if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then
+ local basechar = getchar(base)
if marks[basechar] then
while true do
- base = base.prev
- if base and base.id == glyph_code and base.font == currentfont and base.subtype<256 then
- basechar = base.char
+ base = getprev(base)
+ if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then
+ basechar = getchar(base)
if not marks[basechar] then
break
end
@@ -689,7 +732,7 @@ function handlers.gpos_mark2base(head,start,kind,lookupname,markanchors,sequence
if al[anchor] then
local ma = markanchors[anchor]
if ma then
- local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma)
+ local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar])
if trace_marks then
logprocess("%s, anchor %s, bound %s: anchoring mark %s to basechar %s => (%p,%p)",
pref(kind,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
@@ -717,16 +760,16 @@ end
function handlers.gpos_mark2ligature(head,start,kind,lookupname,markanchors,sequence)
-- check chainpos variant
- local markchar = start.char
+ local markchar = getchar(start)
if marks[markchar] then
- local base = start.prev -- [glyph] [optional marks] [start=mark]
- if base and base.id == glyph_code and base.font == currentfont and base.subtype<256 then
- local basechar = base.char
+ local base = getprev(start) -- [glyph] [optional marks] [start=mark]
+ if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then
+ local basechar = getchar(base)
if marks[basechar] then
while true do
- base = base.prev
- if base and base.id == glyph_code and base.font == currentfont and base.subtype<256 then
- basechar = base.char
+ base = getprev(base)
+ if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then
+ basechar = getchar(base)
if not marks[basechar] then
break
end
@@ -738,7 +781,7 @@ function handlers.gpos_mark2ligature(head,start,kind,lookupname,markanchors,sequ
end
end
end
- local index = start[a_ligacomp]
+ local index = getligaindex(start)
local baseanchors = descriptions[basechar]
if baseanchors then
baseanchors = baseanchors.anchors
@@ -752,7 +795,7 @@ function handlers.gpos_mark2ligature(head,start,kind,lookupname,markanchors,sequ
if ma then
ba = ba[index]
if ba then
- local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma) -- index
+ local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar]) -- index
if trace_marks then
logprocess("%s, anchor %s, index %s, bound %s: anchoring mark %s to baselig %s at index %s => (%p,%p)",
pref(kind,lookupname),anchor,index,bound,gref(markchar),gref(basechar),index,dx,dy)
@@ -785,22 +828,22 @@ function handlers.gpos_mark2ligature(head,start,kind,lookupname,markanchors,sequ
end
function handlers.gpos_mark2mark(head,start,kind,lookupname,markanchors,sequence)
- local markchar = start.char
+ local markchar = getchar(start)
if marks[markchar] then
- local base = start.prev -- [glyph] [basemark] [start=mark]
- local slc = start[a_ligacomp]
+ local base = getprev(start) -- [glyph] [basemark] [start=mark]
+ local slc = getligaindex(start)
if slc then -- a rather messy loop ... needs checking with husayni
while base do
- local blc = base[a_ligacomp]
+ local blc = getligaindex(base)
if blc and blc ~= slc then
- base = base.prev
+ base = getprev(base)
else
break
end
end
end
- if base and base.id == glyph_code and base.font == currentfont and base.subtype<256 then -- subtype test can go
- local basechar = base.char
+ if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then -- subtype test can go
+ local basechar = getchar(base)
local baseanchors = descriptions[basechar]
if baseanchors then
baseanchors = baseanchors.anchors
@@ -812,7 +855,7 @@ function handlers.gpos_mark2mark(head,start,kind,lookupname,markanchors,sequence
if al[anchor] then
local ma = markanchors[anchor]
if ma then
- local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,true)
+ local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar])
if trace_marks then
logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%p,%p)",
pref(kind,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
@@ -840,21 +883,21 @@ function handlers.gpos_mark2mark(head,start,kind,lookupname,markanchors,sequence
end
function handlers.gpos_cursive(head,start,kind,lookupname,exitanchors,sequence) -- to be checked
- local alreadydone = cursonce and start[a_cursbase]
+ local alreadydone = cursonce and getprop(start,a_cursbase)
if not alreadydone then
local done = false
- local startchar = start.char
+ local startchar = getchar(start)
if marks[startchar] then
if trace_cursive then
logprocess("%s: ignoring cursive for mark %s",pref(kind,lookupname),gref(startchar))
end
else
- local nxt = start.next
- while not done and nxt and nxt.id == glyph_code and nxt.font == currentfont and nxt.subtype<256 do
- local nextchar = nxt.char
+ local nxt = getnext(start)
+ while not done and nxt and getid(nxt) == glyph_code and getfont(nxt) == currentfont and getsubtype(nxt)<256 do
+ local nextchar = getchar(nxt)
if marks[nextchar] then
-- should not happen (maybe warning)
- nxt = nxt.next
+ nxt = getnext(nxt)
else
local entryanchors = descriptions[nextchar]
if entryanchors then
@@ -889,14 +932,14 @@ function handlers.gpos_cursive(head,start,kind,lookupname,exitanchors,sequence)
return head, start, done
else
if trace_cursive and trace_details then
- logprocess("%s, cursive %s is already done",pref(kind,lookupname),gref(start.char),alreadydone)
+ logprocess("%s, cursive %s is already done",pref(kind,lookupname),gref(getchar(start)),alreadydone)
end
return head, start, false
end
end
function handlers.gpos_single(head,start,kind,lookupname,kerns,sequence)
- local startchar = start.char
+ local startchar = getchar(start)
local dx, dy, w, h = setpair(start,tfmdata.parameters.factor,rlmode,sequence.flags[4],kerns,characters[startchar])
if trace_kerns then
logprocess("%s: shifting single %s by (%p,%p) and correction (%p,%p)",pref(kind,lookupname),gref(startchar),dx,dy,w,h)
@@ -907,19 +950,19 @@ end
function handlers.gpos_pair(head,start,kind,lookupname,kerns,sequence)
-- todo: kerns in disc nodes: pre, post, replace -> loop over disc too
-- todo: kerns in components of ligatures
- local snext = start.next
+ local snext = getnext(start)
if not snext then
return head, start, false
else
local prev, done = start, false
local factor = tfmdata.parameters.factor
local lookuptype = lookuptypes[lookupname]
- while snext and snext.id == glyph_code and snext.font == currentfont and snext.subtype<256 do
- local nextchar = snext.char
+ while snext and getid(snext) == glyph_code and getfont(snext) == currentfont and getsubtype(snext)<256 do
+ local nextchar = getchar(snext)
local krn = kerns[nextchar]
if not krn and marks[nextchar] then
prev = snext
- snext = snext.next
+ snext = getnext(snext)
else
if not krn then
-- skip
@@ -927,14 +970,14 @@ function handlers.gpos_pair(head,start,kind,lookupname,kerns,sequence)
if lookuptype == "pair" then -- probably not needed
local a, b = krn[2], krn[3]
if a and #a > 0 then
- local startchar = start.char
+ local startchar = getchar(start)
local x, y, w, h = setpair(start,factor,rlmode,sequence.flags[4],a,characters[startchar])
if trace_kerns then
logprocess("%s: shifting first of pair %s and %s by (%p,%p) and correction (%p,%p)",pref(kind,lookupname),gref(startchar),gref(nextchar),x,y,w,h)
end
end
if b and #b > 0 then
- local startchar = start.char
+ local startchar = getchar(start)
local x, y, w, h = setpair(snext,factor,rlmode,sequence.flags[4],b,characters[nextchar])
if trace_kerns then
logprocess("%s: shifting second of pair %s and %s by (%p,%p) and correction (%p,%p)",pref(kind,lookupname),gref(startchar),gref(nextchar),x,y,w,h)
@@ -946,7 +989,7 @@ function handlers.gpos_pair(head,start,kind,lookupname,kerns,sequence)
-- if a and a ~= 0 then
-- local k = setkern(snext,factor,rlmode,a)
-- if trace_kerns then
- -- logprocess("%s: inserting first kern %s between %s and %s",pref(kind,lookupname),k,gref(prev.char),gref(nextchar))
+ -- logprocess("%s: inserting first kern %s between %s and %s",pref(kind,lookupname),k,gref(getchar(prev)),gref(nextchar))
-- end
-- end
-- if b and b ~= 0 then
@@ -957,7 +1000,7 @@ function handlers.gpos_pair(head,start,kind,lookupname,kerns,sequence)
elseif krn ~= 0 then
local k = setkern(snext,factor,rlmode,krn)
if trace_kerns then
- logprocess("%s: inserting kern %s between %s and %s",pref(kind,lookupname),k,gref(prev.char),gref(nextchar))
+ logprocess("%s: inserting kern %s between %s and %s",pref(kind,lookupname),k,gref(getchar(prev)),gref(nextchar))
end
done = true
end
@@ -1012,13 +1055,14 @@ end
-- itself. It is meant mostly for dealing with Urdu.
function chainprocs.reversesub(head,start,stop,kind,chainname,currentcontext,lookuphash,replacements)
- local char = start.char
+ local char = getchar(start)
local replacement = replacements[char]
if replacement then
if trace_singles then
logprocess("%s: single reverse replacement of %s by %s",cref(kind,chainname),gref(char),gref(replacement))
end
- start.char = replacement
+ resetinjection(start)
+ setfield(start,"char",replacement)
return head, start, true
else
return head, start, false
@@ -1047,9 +1091,9 @@ as less as needed but that would also make the code even more messy.</p>
-- -- done
-- elseif ignoremarks then
-- repeat -- start x x m x x stop => start m
--- local next = start.next
--- if not marks[next.char] then
--- local components = next.components
+-- local next = getnext(start)
+-- if not marks[getchar(next)] then
+-- local components = getfield(next,"components")
-- if components then -- probably not needed
-- flush_node_list(components)
-- end
@@ -1059,8 +1103,8 @@ as less as needed but that would also make the code even more messy.</p>
-- until next == stop
-- else -- start x x x stop => start
-- repeat
--- local next = start.next
--- local components = next.components
+-- local next = getnext(start)
+-- local components = getfield(next,"components")
-- if components then -- probably not needed
-- flush_node_list(components)
-- end
@@ -1084,8 +1128,8 @@ function chainprocs.gsub_single(head,start,stop,kind,chainname,currentcontext,lo
logwarning("todo: check if we need to loop over the replacements: %s",concat(subtables," "))
end
while current do
- if current.id == glyph_code then
- local currentchar = current.char
+ if getid(current) == glyph_code then
+ local currentchar = getchar(current)
local lookupname = subtables[1] -- only 1
local replacement = lookuphash[lookupname]
if not replacement then
@@ -1102,14 +1146,15 @@ function chainprocs.gsub_single(head,start,stop,kind,chainname,currentcontext,lo
if trace_singles then
logprocess("%s: replacing single %s by %s",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(currentchar),gref(replacement))
end
- current.char = replacement
+ resetinjection(current)
+ setfield(current,"char",replacement)
end
end
return head, start, true
elseif current == stop then
break
else
- current = current.next
+ current = getnext(current)
end
end
return head, start, false
@@ -1124,7 +1169,7 @@ the match.</p>
function chainprocs.gsub_multiple(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname)
-- local head, n = delete_till_stop(head,start,stop)
- local startchar = start.char
+ local startchar = getchar(start)
local subtables = currentlookup.subtables
local lookupname = subtables[1]
local replacements = lookuphash[lookupname]
@@ -1167,8 +1212,8 @@ function chainprocs.gsub_alternate(head,start,stop,kind,chainname,currentcontext
local subtables = currentlookup.subtables
local value = featurevalue == true and tfmdata.shared.features[kind] or featurevalue
while current do
- if current.id == glyph_code then -- is this check needed?
- local currentchar = current.char
+ if getid(current) == glyph_code then -- is this check needed?
+ local currentchar = getchar(current)
local lookupname = subtables[1]
local alternatives = lookuphash[lookupname]
if not alternatives then
@@ -1183,7 +1228,8 @@ function chainprocs.gsub_alternate(head,start,stop,kind,chainname,currentcontext
if trace_alternatives then
logprocess("%s: replacing %s by alternative %a to %s, %s",cref(kind,chainname,chainlookupname,lookupname),gref(char),choice,gref(choice),comment)
end
- start.char = choice
+ resetinjection(start)
+ setfield(start,"char",choice)
else
if trace_alternatives then
logwarning("%s: no variant %a for %s, %s",cref(kind,chainname,chainlookupname,lookupname),value,gref(char),comment)
@@ -1197,7 +1243,7 @@ function chainprocs.gsub_alternate(head,start,stop,kind,chainname,currentcontext
elseif current == stop then
break
else
- current = current.next
+ current = getnext(current)
end
end
return head, start, false
@@ -1212,7 +1258,7 @@ assume rather stupid ligatures (no complex disc nodes).</p>
--ldx]]--
function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex)
- local startchar = start.char
+ local startchar = getchar(start)
local subtables = currentlookup.subtables
local lookupname = subtables[1]
local ligatures = lookuphash[lookupname]
@@ -1227,20 +1273,20 @@ function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext,
logwarning("%s: no ligatures starting with %s",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar))
end
else
- local s = start.next
+ local s = getnext(start)
local discfound = false
local last = stop
local nofreplacements = 0
local skipmark = currentlookup.flags[1]
while s do
- local id = s.id
+ local id = getid(s)
if id == disc_code then
- s = s.next
+ s = getnext(s)
discfound = true
else
- local schar = s.char
+ local schar = getchar(s)
if skipmark and marks[schar] then -- marks
- s = s.next
+ s = getnext(s)
else
local lg = ligatures[schar]
if lg then
@@ -1248,7 +1294,7 @@ function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext,
if s == stop then
break
else
- s = s.next
+ s = getnext(s)
end
else
break
@@ -1265,7 +1311,7 @@ function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext,
if start == stop then
logprocess("%s: replacing character %s by ligature %s case 3",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(l2))
else
- logprocess("%s: replacing character %s upto %s by ligature %s case 4",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(stop.char),gref(l2))
+ logprocess("%s: replacing character %s upto %s by ligature %s case 4",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(getchar(stop)),gref(l2))
end
end
head, start = toligature(kind,lookupname,head,start,stop,l2,currentlookup.flags[1],discfound)
@@ -1274,7 +1320,7 @@ function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext,
if start == stop then
logwarning("%s: replacing character %s by ligature fails",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar))
else
- logwarning("%s: replacing character %s upto %s by ligature fails",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(stop.char))
+ logwarning("%s: replacing character %s upto %s by ligature fails",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(getchar(stop)))
end
end
end
@@ -1285,7 +1331,7 @@ end
chainmores.gsub_ligature = chainprocs.gsub_ligature
function chainprocs.gpos_mark2base(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname)
- local markchar = start.char
+ local markchar = getchar(start)
if marks[markchar] then
local subtables = currentlookup.subtables
local lookupname = subtables[1]
@@ -1294,14 +1340,14 @@ function chainprocs.gpos_mark2base(head,start,stop,kind,chainname,currentcontext
markanchors = markanchors[markchar]
end
if markanchors then
- local base = start.prev -- [glyph] [start=mark]
- if base and base.id == glyph_code and base.font == currentfont and base.subtype<256 then
- local basechar = base.char
+ local base = getprev(start) -- [glyph] [start=mark]
+ if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then
+ local basechar = getchar(base)
if marks[basechar] then
while true do
- base = base.prev
- if base and base.id == glyph_code and base.font == currentfont and base.subtype<256 then
- basechar = base.char
+ base = getprev(base)
+ if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then
+ basechar = getchar(base)
if not marks[basechar] then
break
end
@@ -1322,7 +1368,7 @@ function chainprocs.gpos_mark2base(head,start,stop,kind,chainname,currentcontext
if al[anchor] then
local ma = markanchors[anchor]
if ma then
- local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma)
+ local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar])
if trace_marks then
logprocess("%s, anchor %s, bound %s: anchoring mark %s to basechar %s => (%p,%p)",
cref(kind,chainname,chainlookupname,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
@@ -1349,7 +1395,7 @@ function chainprocs.gpos_mark2base(head,start,stop,kind,chainname,currentcontext
end
function chainprocs.gpos_mark2ligature(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname)
- local markchar = start.char
+ local markchar = getchar(start)
if marks[markchar] then
local subtables = currentlookup.subtables
local lookupname = subtables[1]
@@ -1358,14 +1404,14 @@ function chainprocs.gpos_mark2ligature(head,start,stop,kind,chainname,currentcon
markanchors = markanchors[markchar]
end
if markanchors then
- local base = start.prev -- [glyph] [optional marks] [start=mark]
- if base and base.id == glyph_code and base.font == currentfont and base.subtype<256 then
- local basechar = base.char
+ local base = getprev(start) -- [glyph] [optional marks] [start=mark]
+ if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then
+ local basechar = getchar(base)
if marks[basechar] then
while true do
- base = base.prev
- if base and base.id == glyph_code and base.font == currentfont and base.subtype<256 then
- basechar = base.char
+ base = getprev(base)
+ if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then
+ basechar = getchar(base)
if not marks[basechar] then
break
end
@@ -1378,7 +1424,7 @@ function chainprocs.gpos_mark2ligature(head,start,stop,kind,chainname,currentcon
end
end
-- todo: like marks a ligatures hash
- local index = start[a_ligacomp]
+ local index = getligaindex(start)
local baseanchors = descriptions[basechar].anchors
if baseanchors then
local baseanchors = baseanchors['baselig']
@@ -1390,7 +1436,7 @@ function chainprocs.gpos_mark2ligature(head,start,stop,kind,chainname,currentcon
if ma then
ba = ba[index]
if ba then
- local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma) -- index
+ local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar])
if trace_marks then
logprocess("%s, anchor %s, bound %s: anchoring mark %s to baselig %s at index %s => (%p,%p)",
cref(kind,chainname,chainlookupname,lookupname),anchor,a or bound,gref(markchar),gref(basechar),index,dx,dy)
@@ -1418,64 +1464,59 @@ function chainprocs.gpos_mark2ligature(head,start,stop,kind,chainname,currentcon
end
function chainprocs.gpos_mark2mark(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname)
- local markchar = start.char
+ local markchar = getchar(start)
if marks[markchar] then
- -- local alreadydone = markonce and start[a_markmark]
- -- if not alreadydone then
- -- local markanchors = descriptions[markchar].anchors markanchors = markanchors and markanchors.mark
- local subtables = currentlookup.subtables
- local lookupname = subtables[1]
- local markanchors = lookuphash[lookupname]
- if markanchors then
- markanchors = markanchors[markchar]
- end
- if markanchors then
- local base = start.prev -- [glyph] [basemark] [start=mark]
- local slc = start[a_ligacomp]
- if slc then -- a rather messy loop ... needs checking with husayni
- while base do
- local blc = base[a_ligacomp]
- if blc and blc ~= slc then
- base = base.prev
- else
- break
- end
+ -- local markanchors = descriptions[markchar].anchors markanchors = markanchors and markanchors.mark
+ local subtables = currentlookup.subtables
+ local lookupname = subtables[1]
+ local markanchors = lookuphash[lookupname]
+ if markanchors then
+ markanchors = markanchors[markchar]
+ end
+ if markanchors then
+ local base = getprev(start) -- [glyph] [basemark] [start=mark]
+ local slc = getligaindex(start)
+ if slc then -- a rather messy loop ... needs checking with husayni
+ while base do
+ local blc = getligaindex(base)
+ if blc and blc ~= slc then
+ base = getprev(base)
+ else
+ break
end
end
- if base and base.id == glyph_code and base.font == currentfont and base.subtype<256 then -- subtype test can go
- local basechar = base.char
- local baseanchors = descriptions[basechar].anchors
+ end
+ if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then -- subtype test can go
+ local basechar = getchar(base)
+ local baseanchors = descriptions[basechar].anchors
+ if baseanchors then
+ baseanchors = baseanchors['basemark']
if baseanchors then
- baseanchors = baseanchors['basemark']
- if baseanchors then
- local al = anchorlookups[lookupname]
- for anchor,ba in next, baseanchors do
- if al[anchor] then
- local ma = markanchors[anchor]
- if ma then
- local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,true)
- if trace_marks then
- logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%p,%p)",
- cref(kind,chainname,chainlookupname,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
- end
- return head, start, true
+ local al = anchorlookups[lookupname]
+ for anchor,ba in next, baseanchors do
+ if al[anchor] then
+ local ma = markanchors[anchor]
+ if ma then
+ local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar])
+ if trace_marks then
+ logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%p,%p)",
+ cref(kind,chainname,chainlookupname,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
end
+ return head, start, true
end
end
- if trace_bugs then
- logwarning("%s: no matching anchors for mark %s and basemark %s",gref(kind,chainname,chainlookupname,lookupname),gref(markchar),gref(basechar))
- end
+ end
+ if trace_bugs then
+ logwarning("%s: no matching anchors for mark %s and basemark %s",gref(kind,chainname,chainlookupname,lookupname),gref(markchar),gref(basechar))
end
end
- elseif trace_bugs then
- logwarning("%s: prev node is no mark",cref(kind,chainname,chainlookupname,lookupname))
end
elseif trace_bugs then
- logwarning("%s: mark %s has no anchors",cref(kind,chainname,chainlookupname,lookupname),gref(markchar))
+ logwarning("%s: prev node is no mark",cref(kind,chainname,chainlookupname,lookupname))
end
- -- elseif trace_marks and trace_details then
- -- logprocess("%s, mark %s is already bound (n=%s), ignoring mark2mark",pref(kind,lookupname),gref(markchar),alreadydone)
- -- end
+ elseif trace_bugs then
+ logwarning("%s: mark %s has no anchors",cref(kind,chainname,chainlookupname,lookupname),gref(markchar))
+ end
elseif trace_bugs then
logwarning("%s: mark %s is no mark",cref(kind,chainname,chainlookupname),gref(markchar))
end
@@ -1483,9 +1524,9 @@ function chainprocs.gpos_mark2mark(head,start,stop,kind,chainname,currentcontext
end
function chainprocs.gpos_cursive(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname)
- local alreadydone = cursonce and start[a_cursbase]
+ local alreadydone = cursonce and getprop(start,a_cursbase)
if not alreadydone then
- local startchar = start.char
+ local startchar = getchar(start)
local subtables = currentlookup.subtables
local lookupname = subtables[1]
local exitanchors = lookuphash[lookupname]
@@ -1499,12 +1540,12 @@ function chainprocs.gpos_cursive(head,start,stop,kind,chainname,currentcontext,l
logprocess("%s: ignoring cursive for mark %s",pref(kind,lookupname),gref(startchar))
end
else
- local nxt = start.next
- while not done and nxt and nxt.id == glyph_code and nxt.font == currentfont and nxt.subtype<256 do
- local nextchar = nxt.char
+ local nxt = getnext(start)
+ while not done and nxt and getid(nxt) == glyph_code and getfont(nxt) == currentfont and getsubtype(nxt)<256 do
+ local nextchar = getchar(nxt)
if marks[nextchar] then
-- should not happen (maybe warning)
- nxt = nxt.next
+ nxt = getnext(nxt)
else
local entryanchors = descriptions[nextchar]
if entryanchors then
@@ -1539,7 +1580,7 @@ function chainprocs.gpos_cursive(head,start,stop,kind,chainname,currentcontext,l
return head, start, done
else
if trace_cursive and trace_details then
- logprocess("%s, cursive %s is already done",pref(kind,lookupname),gref(start.char),alreadydone)
+ logprocess("%s, cursive %s is already done",pref(kind,lookupname),gref(getchar(start)),alreadydone)
end
return head, start, false
end
@@ -1549,7 +1590,7 @@ end
function chainprocs.gpos_single(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex,sequence)
-- untested .. needs checking for the new model
- local startchar = start.char
+ local startchar = getchar(start)
local subtables = currentlookup.subtables
local lookupname = subtables[1]
local kerns = lookuphash[lookupname]
@@ -1570,9 +1611,9 @@ chainmores.gpos_single = chainprocs.gpos_single -- okay?
-- when machines become faster i will make a shared function
function chainprocs.gpos_pair(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex,sequence)
- local snext = start.next
+ local snext = getnext(start)
if snext then
- local startchar = start.char
+ local startchar = getchar(start)
local subtables = currentlookup.subtables
local lookupname = subtables[1]
local kerns = lookuphash[lookupname]
@@ -1582,12 +1623,12 @@ function chainprocs.gpos_pair(head,start,stop,kind,chainname,currentcontext,look
local lookuptype = lookuptypes[lookupname]
local prev, done = start, false
local factor = tfmdata.parameters.factor
- while snext and snext.id == glyph_code and snext.font == currentfont and snext.subtype<256 do
- local nextchar = snext.char
+ while snext and getid(snext) == glyph_code and getfont(snext) == currentfont and getsubtype(snext)<256 do
+ local nextchar = getchar(snext)
local krn = kerns[nextchar]
if not krn and marks[nextchar] then
prev = snext
- snext = snext.next
+ snext = getnext(snext)
else
if not krn then
-- skip
@@ -1595,14 +1636,14 @@ function chainprocs.gpos_pair(head,start,stop,kind,chainname,currentcontext,look
if lookuptype == "pair" then
local a, b = krn[2], krn[3]
if a and #a > 0 then
- local startchar = start.char
+ local startchar = getchar(start)
local x, y, w, h = setpair(start,factor,rlmode,sequence.flags[4],a,characters[startchar])
if trace_kerns then
logprocess("%s: shifting first of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(kind,chainname,chainlookupname),gref(startchar),gref(nextchar),x,y,w,h)
end
end
if b and #b > 0 then
- local startchar = start.char
+ local startchar = getchar(start)
local x, y, w, h = setpair(snext,factor,rlmode,sequence.flags[4],b,characters[nextchar])
if trace_kerns then
logprocess("%s: shifting second of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(kind,chainname,chainlookupname),gref(startchar),gref(nextchar),x,y,w,h)
@@ -1614,7 +1655,7 @@ function chainprocs.gpos_pair(head,start,stop,kind,chainname,currentcontext,look
if a and a ~= 0 then
local k = setkern(snext,factor,rlmode,a)
if trace_kerns then
- logprocess("%s: inserting first kern %s between %s and %s",cref(kind,chainname,chainlookupname),k,gref(prev.char),gref(nextchar))
+ logprocess("%s: inserting first kern %s between %s and %s",cref(kind,chainname,chainlookupname),k,gref(getchar(prev)),gref(nextchar))
end
end
if b and b ~= 0 then
@@ -1625,7 +1666,7 @@ function chainprocs.gpos_pair(head,start,stop,kind,chainname,currentcontext,look
elseif krn ~= 0 then
local k = setkern(snext,factor,rlmode,krn)
if trace_kerns then
- logprocess("%s: inserting kern %s between %s and %s",cref(kind,chainname,chainlookupname),k,gref(prev.char),gref(nextchar))
+ logprocess("%s: inserting kern %s between %s and %s",cref(kind,chainname,chainlookupname),k,gref(getchar(prev)),gref(nextchar))
end
done = true
end
@@ -1657,6 +1698,12 @@ local function show_skip(kind,chainname,char,ck,class)
end
end
+local quit_on_no_replacement = true
+
+directives.register("otf.chain.quitonnoreplacement",function(value) -- maybe per font
+ quit_on_no_replacement = value
+end)
+
local function normal_handle_contextchain(head,start,kind,chainname,contexts,sequence,lookuphash)
-- local rule, lookuptype, sequence, f, l, lookups = ck[1], ck[2] ,ck[3], ck[4], ck[5], ck[6]
local flags = sequence.flags
@@ -1677,7 +1724,7 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
-- f..l = mid string
if s == 1 then
-- never happens
- match = current.id == glyph_code and current.font == currentfont and current.subtype<256 and seq[1][current.char]
+ match = getid(current) == glyph_code and getfont(current) == currentfont and getsubtype(current)<256 and seq[1][getchar(current)]
else
-- maybe we need a better space check (maybe check for glue or category or combination)
-- we cannot optimize for n=2 because there can be disc nodes
@@ -1692,13 +1739,13 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
-- match = true
else
local n = f + 1
- last = last.next
+ last = getnext(last)
while n <= l do
if last then
- local id = last.id
+ local id = getid(last)
if id == glyph_code then
- if last.font == currentfont and last.subtype<256 then
- local char = last.char
+ if getfont(last) == currentfont and getsubtype(last)<256 then
+ local char = getchar(last)
local ccd = descriptions[char]
if ccd then
local class = ccd.class
@@ -1707,10 +1754,10 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
if trace_skips then
show_skip(kind,chainname,char,ck,class)
end
- last = last.next
+ last = getnext(last)
elseif seq[n][char] then
if n < l then
- last = last.next
+ last = getnext(last)
end
n = n + 1
else
@@ -1726,7 +1773,7 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
break
end
elseif id == disc_code then
- last = last.next
+ last = getnext(last)
else
match = false
break
@@ -1740,15 +1787,15 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
end
-- before
if match and f > 1 then
- local prev = start.prev
+ local prev = getprev(start)
if prev then
local n = f-1
while n >= 1 do
if prev then
- local id = prev.id
+ local id = getid(prev)
if id == glyph_code then
- if prev.font == currentfont and prev.subtype<256 then -- normal char
- local char = prev.char
+ if getfont(prev) == currentfont and getsubtype(prev)<256 then -- normal char
+ local char = getchar(prev)
local ccd = descriptions[char]
if ccd then
local class = ccd.class
@@ -1779,7 +1826,7 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
match = false
break
end
- prev = prev.prev
+ prev = getprev(prev)
elseif seq[n][32] then -- somewhat special, as zapfino can have many preceding spaces
n = n -1
else
@@ -1800,16 +1847,16 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
end
-- after
if match and s > l then
- local current = last and last.next
+ local current = last and getnext(last)
if current then
-- removed optimization for s-l == 1, we have to deal with marks anyway
local n = l + 1
while n <= s do
if current then
- local id = current.id
+ local id = getid(current)
if id == glyph_code then
- if current.font == currentfont and current.subtype<256 then -- normal char
- local char = current.char
+ if getfont(current) == currentfont and getsubtype(current)<256 then -- normal char
+ local char = getchar(current)
local ccd = descriptions[char]
if ccd then
local class = ccd.class
@@ -1840,7 +1887,7 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
match = false
break
end
- current = current.next
+ current = getnext(current)
elseif seq[n][32] then
n = n + 1
else
@@ -1864,7 +1911,7 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
-- ck == currentcontext
if trace_contexts then
local rule, lookuptype, f, l = ck[1], ck[2], ck[4], ck[5]
- local char = start.char
+ local char = getchar(start)
if ck[9] then
logwarning("%s: rule %s matches at char %s for (%s,%s,%s) chars, lookuptype %a, %a => %a",
cref(kind,chainname),rule,gref(char),f-1,l-f+1,s-l,lookuptype,ck[9],ck[10])
@@ -1896,15 +1943,15 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
end
else
local i = 1
- repeat
+ while true do
if skipped then
while true do
- local char = start.char
+ local char = getchar(start)
local ccd = descriptions[char]
if ccd then
local class = ccd.class
if class == skipmark or class == skipligature or class == skipbase or (markclass and class == "mark" and not markclass[char]) then
- start = start.next
+ start = getnext(start)
else
break
end
@@ -1937,19 +1984,21 @@ local function normal_handle_contextchain(head,start,kind,chainname,contexts,seq
end
end
end
- if start then
- start = start.next
+ if i > nofchainlookups then
+ break
+ elseif start then
+ start = getnext(start)
else
-- weird
end
- until i > nofchainlookups
+ end
end
else
local replacements = ck[7]
if replacements then
head, start, done = chainprocs.reversesub(head,start,last,kind,chainname,ck,lookuphash,replacements) -- sequence
else
- done = true -- can be meant to be skipped
+ done = quit_on_no_replacement -- can be meant to be skipped / quite inconsistent in fonts
if trace_contexts then
logprocess("%s: skipping match",cref(kind,chainname))
end
@@ -2040,7 +2089,7 @@ local function initialize(sequence,script,language,enabled)
if features then
local order = sequence.order
if order then
- for i=1,#order do
+ for i=1,#order do --
local kind = order[i] --
local valid = enabled[kind]
if valid then
@@ -2099,12 +2148,12 @@ end
-- if ok then
-- done = true
-- end
--- if start then start = start.next end
+-- if start then start = getnext(start) end
-- else
--- start = start.next
+-- start = getnext(start)
-- end
-- else
--- start = start.next
+-- start = getnext(start)
-- end
-- there will be a new direction parser (pre-parsed etc)
@@ -2114,7 +2163,7 @@ end
-- attr = attr or false
--
-- local a = getattr(start,0)
--- if (a == attr and (not attribute or getattr(start,a_state) == attribute)) or (not attribute or getattr(start,a_state) == attribute) then
+-- if (a == attr and (not attribute or getprop(start,a_state) == attribute)) or (not attribute or getprop(start,a_state) == attribute) then
-- -- the action
-- end
@@ -2126,6 +2175,8 @@ local function featuresprocessor(head,font,attr)
return head, false
end
+ head = tonut(head)
+
if trace_steps then
checkstep(head)
end
@@ -2139,6 +2190,7 @@ local function featuresprocessor(head,font,attr)
anchorlookups = resources.lookup_to_anchor
lookuptable = resources.lookups
lookuptypes = resources.lookuptypes
+ lookuptags = resources.lookuptags
currentfont = font
rlmode = 0
@@ -2157,6 +2209,8 @@ local function featuresprocessor(head,font,attr)
-- Keeping track of the headnode is needed for devanagari (I generalized it a bit
-- so that multiple cases are also covered.)
+ -- todo: retain prev
+
for s=1,#datasets do
local dataset = datasets[s]
featurevalue = dataset[1] -- todo: pass to function instead of using a global
@@ -2175,10 +2229,10 @@ local function featuresprocessor(head,font,attr)
-- we need to get rid of this slide! probably no longer needed in latest luatex
local start = find_node_tail(head) -- slow (we can store tail because there's always a skip at the end): todo
while start do
- local id = start.id
+ local id = getid(start)
if id == glyph_code then
- if start.font == font and start.subtype<256 then
- local a = start[0]
+ if getfont(start) == font and getsubtype(start) < 256 then
+ local a = getattr(start,0)
if a then
a = a == attr
else
@@ -2189,7 +2243,7 @@ local function featuresprocessor(head,font,attr)
local lookupname = subtables[i]
local lookupcache = lookuphash[lookupname]
if lookupcache then
- local lookupmatch = lookupcache[start.char]
+ local lookupmatch = lookupcache[getchar(start)]
if lookupmatch then
head, start, success = handler(head,start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,i)
if success then
@@ -2200,15 +2254,15 @@ local function featuresprocessor(head,font,attr)
report_missing_cache(typ,lookupname)
end
end
- if start then start = start.prev end
+ if start then start = getprev(start) end
else
- start = start.prev
+ start = getprev(start)
end
else
- start = start.prev
+ start = getprev(start)
end
else
- start = start.prev
+ start = getprev(start)
end
end
else
@@ -2228,16 +2282,16 @@ local function featuresprocessor(head,font,attr)
local head = start
local done = false
while start do
- local id = start.id
- if id == glyph_code and start.font == font and start.subtype <256 then
- local a = start[0]
+ local id = getid(start)
+ if id == glyph_code and getfont(start) == font and getsubtype(start) < 256 then
+ local a = getattr(start,0)
if a then
- a = (a == attr) and (not attribute or start[a_state] == attribute)
+ a = (a == attr) and (not attribute or getprop(start,a_state) == attribute)
else
- a = not attribute or start[a_state] == attribute
+ a = not attribute or getprop(start,a_state) == attribute
end
if a then
- local lookupmatch = lookupcache[start.char]
+ local lookupmatch = lookupcache[getchar(start)]
if lookupmatch then
-- sequence kan weg
local ok
@@ -2246,12 +2300,12 @@ local function featuresprocessor(head,font,attr)
done = true
end
end
- if start then start = start.next end
+ if start then start = getnext(start) end
else
- start = start.next
+ start = getnext(start)
end
else
- start = start.next
+ start = getnext(start)
end
end
if done then
@@ -2261,19 +2315,19 @@ local function featuresprocessor(head,font,attr)
end
local function kerndisc(disc) -- we can assume that prev and next are glyphs
- local prev = disc.prev
- local next = disc.next
+ local prev = getprev(disc)
+ local next = getnext(disc)
if prev and next then
- prev.next = next
- -- next.prev = prev
- local a = prev[0]
+ setfield(prev,"next",next)
+ -- setfield(next,"prev",prev)
+ local a = getattr(prev,0)
if a then
- a = (a == attr) and (not attribute or prev[a_state] == attribute)
+ a = (a == attr) and (not attribute or getprop(prev,a_state) == attribute)
else
- a = not attribute or prev[a_state] == attribute
+ a = not attribute or getprop(prev,a_state) == attribute
end
if a then
- local lookupmatch = lookupcache[prev.char]
+ local lookupmatch = lookupcache[getchar(prev)]
if lookupmatch then
-- sequence kan weg
local h, d, ok = handler(head,prev,dataset[4],lookupname,lookupmatch,sequence,lookuphash,1)
@@ -2283,24 +2337,24 @@ local function featuresprocessor(head,font,attr)
end
end
end
- prev.next = disc
- -- next.prev = disc
+ setfield(prev,"next",disc)
+ -- setfield(next,"prev",disc)
end
return next
end
while start do
- local id = start.id
+ local id = getid(start)
if id == glyph_code then
- if start.font == font and start.subtype<256 then
- local a = start[0]
+ if getfont(start) == font and getsubtype(start) < 256 then
+ local a = getattr(start,0)
if a then
- a = (a == attr) and (not attribute or start[a_state] == attribute)
+ a = (a == attr) and (not attribute or getprop(start,a_state) == attribute)
else
- a = not attribute or start[a_state] == attribute
+ a = not attribute or getprop(start,a_state) == attribute
end
if a then
- local lookupmatch = lookupcache[start.char]
+ local lookupmatch = lookupcache[getchar(start)]
if lookupmatch then
-- sequence kan weg
local ok
@@ -2309,39 +2363,39 @@ local function featuresprocessor(head,font,attr)
success = true
end
end
- if start then start = start.next end
+ if start then start = getnext(start) end
else
- start = start.next
+ start = getnext(start)
end
else
- start = start.next
+ start = getnext(start)
end
elseif id == disc_code then
-- mostly for gsub
- if start.subtype == discretionary_code then
- local pre = start.pre
+ if getsubtype(start) == discretionary_code then
+ local pre = getfield(start,"pre")
if pre then
local new = subrun(pre)
- if new then start.pre = new end
+ if new then setfield(start,"pre",new) end
end
- local post = start.post
+ local post = getfield(start,"post")
if post then
local new = subrun(post)
- if new then start.post = new end
+ if new then setfield(start,"post",new) end
end
- local replace = start.replace
+ local replace = getfield(start,"replace")
if replace then
local new = subrun(replace)
- if new then start.replace = new end
+ if new then setfield(start,"replace",new) end
end
elseif typ == "gpos_single" or typ == "gpos_pair" then
kerndisc(start)
end
- start = start.next
+ start = getnext(start)
elseif id == whatsit_code then -- will be function
- local subtype = start.subtype
+ local subtype = getsubtype(start)
if subtype == dir_code then
- local dir = start.dir
+ local dir = getfield(start,"dir")
if dir == "+TRT" or dir == "+TLT" then
topstack = topstack + 1
dirstack[topstack] = dir
@@ -2360,7 +2414,7 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then
report_process("directions after txtdir %a: parmode %a, txtmode %a, # stack %a, new dir %a",dir,rlparmode,rlmode,topstack,newdir)
end
elseif subtype == localpar_code then
- local dir = start.dir
+ local dir = getfield(start,"dir")
if dir == "TRT" then
rlparmode = -1
elseif dir == "TLT" then
@@ -2374,11 +2428,11 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then
report_process("directions after pardir %a: parmode %a, txtmode %a",dir,rlparmode,rlmode)
end
end
- start = start.next
+ start = getnext(start)
elseif id == math_code then
- start = end_of_math(start).next
+ start = getnext(end_of_math(start))
else
- start = start.next
+ start = getnext(start)
end
end
end
@@ -2389,20 +2443,20 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then
local head = start
local done = false
while start do
- local id = start.id
- if id == glyph_code and start.id == font and start.subtype <256 then
- local a = start[0]
+ local id = getid(start)
+ if id == glyph_code and getfont(start) == font and getsubtype(start) < 256 then
+ local a = getattr(start,0)
if a then
- a = (a == attr) and (not attribute or start[a_state] == attribute)
+ a = (a == attr) and (not attribute or getprop(start,a_state) == attribute)
else
- a = not attribute or start[a_state] == attribute
+ a = not attribute or getprop(start,a_state) == attribute
end
if a then
for i=1,ns do
local lookupname = subtables[i]
local lookupcache = lookuphash[lookupname]
if lookupcache then
- local lookupmatch = lookupcache[start.char]
+ local lookupmatch = lookupcache[getchar(start)]
if lookupmatch then
-- we could move all code inline but that makes things even more unreadable
local ok
@@ -2419,12 +2473,12 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then
report_missing_cache(typ,lookupname)
end
end
- if start then start = start.next end
+ if start then start = getnext(start) end
else
- start = start.next
+ start = getnext(start)
end
else
- start = start.next
+ start = getnext(start)
end
end
if done then
@@ -2434,23 +2488,23 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then
end
local function kerndisc(disc) -- we can assume that prev and next are glyphs
- local prev = disc.prev
- local next = disc.next
+ local prev = getprev(disc)
+ local next = getnext(disc)
if prev and next then
- prev.next = next
- -- next.prev = prev
- local a = prev[0]
+ setfield(prev,"next",next)
+ -- setfield(next,"prev",prev)
+ local a = getattr(prev,0)
if a then
- a = (a == attr) and (not attribute or prev[a_state] == attribute)
+ a = (a == attr) and (not attribute or getprop(prev,a_state) == attribute)
else
- a = not attribute or prev[a_state] == attribute
+ a = not attribute or getprop(prev,a_state) == attribute
end
if a then
for i=1,ns do
local lookupname = subtables[i]
local lookupcache = lookuphash[lookupname]
if lookupcache then
- local lookupmatch = lookupcache[prev.char]
+ local lookupmatch = lookupcache[getchar(prev)]
if lookupmatch then
-- we could move all code inline but that makes things even more unreadable
local h, d, ok = handler(head,prev,dataset[4],lookupname,lookupmatch,sequence,lookuphash,i)
@@ -2464,28 +2518,28 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then
end
end
end
- prev.next = disc
- -- next.prev = disc
+ setfield(prev,"next",disc)
+ -- setfield(next,"prev",disc)
end
return next
end
while start do
- local id = start.id
+ local id = getid(start)
if id == glyph_code then
- if start.font == font and start.subtype<256 then
- local a = start[0]
+ if getfont(start) == font and getsubtype(start) < 256 then
+ local a = getattr(start,0)
if a then
- a = (a == attr) and (not attribute or start[a_state] == attribute)
+ a = (a == attr) and (not attribute or getprop(start,a_state) == attribute)
else
- a = not attribute or start[a_state] == attribute
+ a = not attribute or getprop(start,a_state) == attribute
end
if a then
for i=1,ns do
local lookupname = subtables[i]
local lookupcache = lookuphash[lookupname]
if lookupcache then
- local lookupmatch = lookupcache[start.char]
+ local lookupmatch = lookupcache[getchar(start)]
if lookupmatch then
-- we could move all code inline but that makes things even more unreadable
local ok
@@ -2502,39 +2556,39 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then
report_missing_cache(typ,lookupname)
end
end
- if start then start = start.next end
+ if start then start = getnext(start) end
else
- start = start.next
+ start = getnext(start)
end
else
- start = start.next
+ start = getnext(start)
end
elseif id == disc_code then
-- mostly for gsub
- if start.subtype == discretionary_code then
- local pre = start.pre
+ if getsubtype(start) == discretionary_code then
+ local pre = getfield(start,"pre")
if pre then
local new = subrun(pre)
- if new then start.pre = new end
+ if new then setfield(start,"pre",new) end
end
- local post = start.post
+ local post = getfield(start,"post")
if post then
local new = subrun(post)
- if new then start.post = new end
+ if new then setfield(start,"post",new) end
end
- local replace = start.replace
+ local replace = getfield(start,"replace")
if replace then
local new = subrun(replace)
- if new then start.replace = new end
+ if new then setfield(start,"replace",new) end
end
elseif typ == "gpos_single" or typ == "gpos_pair" then
kerndisc(start)
end
- start = start.next
+ start = getnext(start)
elseif id == whatsit_code then
- local subtype = start.subtype
+ local subtype = getsubtype(start)
if subtype == dir_code then
- local dir = start.dir
+ local dir = getfield(start,"dir")
if dir == "+TRT" or dir == "+TLT" then
topstack = topstack + 1
dirstack[topstack] = dir
@@ -2553,7 +2607,7 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then
report_process("directions after txtdir %a: parmode %a, txtmode %a, # stack %a, new dir %a",dir,rlparmode,rlmode,topstack,newdir)
end
elseif subtype == localpar_code then
- local dir = start.dir
+ local dir = getfield(start,"dir")
if dir == "TRT" then
rlparmode = -1
elseif dir == "TLT" then
@@ -2566,11 +2620,11 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then
report_process("directions after pardir %a: parmode %a, txtmode %a",dir,rlparmode,rlmode)
end
end
- start = start.next
+ start = getnext(start)
elseif id == math_code then
- start = end_of_math(start).next
+ start = getnext(end_of_math(start))
else
- start = start.next
+ start = getnext(start)
end
end
end
@@ -2581,7 +2635,11 @@ elseif typ == "gpos_single" or typ == "gpos_pair" then
if trace_steps then -- ?
registerstep(head)
end
+
end
+
+ head = tonode(head)
+
return head, done
end
@@ -2734,6 +2792,7 @@ local function prepare_contextchains(tfmdata)
local rawdata = tfmdata.shared.rawdata
local resources = rawdata.resources
local lookuphash = resources.lookuphash
+ local lookuptags = resources.lookuptags
local lookups = rawdata.lookups
if lookups then
for lookupname, lookupdata in next, rawdata.lookups do
@@ -2747,7 +2806,7 @@ local function prepare_contextchains(tfmdata)
report_prepare("unsupported format %a",format)
elseif not validformat[lookuptype] then
-- todo: dejavu-serif has one (but i need to see what use it has)
- report_prepare("unsupported format %a, lookuptype %a, lookupname %a",format,lookuptype,lookupname)
+ report_prepare("unsupported format %a, lookuptype %a, lookupname %a",format,lookuptype,lookuptags[lookupname])
else
local contexts = lookuphash[lookupname]
if not contexts then
@@ -2803,7 +2862,7 @@ local function prepare_contextchains(tfmdata)
-- no rules
end
else
- report_prepare("missing lookuptype for lookupname %a",lookupname)
+ report_prepare("missing lookuptype for lookupname %a",lookuptags[lookupname])
end
end
end
diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts.lua
index 5e5c9a4cfa6..c81e8cd1a88 100644
--- a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts.lua
+++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts.lua
@@ -27,6 +27,17 @@ if not modules then modules = { } end modules ['luatex-fonts'] = {
-- also add more helper code here, but that depends to what extend metatex (sidetrack of context)
-- evolves into a low level layer (depends on time, as usual).
+texio.write_nl("")
+texio.write_nl("--------------------------------------------------------------------------------")
+texio.write_nl("The font code has been brought in sync with the context version of 2014.12.21 so")
+texio.write_nl("if things don't work out as expected the interfacing needs to be checked. When")
+texio.write_nl("this works as expected a second upgrade will happen that gives a more complete")
+texio.write_nl("support and another sync with the context code (that new code is currently being")
+texio.write_nl("tested. The base pass is now integrated in the main pass. The results can differ")
+texio.write_nl("from those in context because there we integrate some mechanisms differently.")
+texio.write_nl("--------------------------------------------------------------------------------")
+texio.write_nl("")
+
utf = utf or unicode.utf8
-- We have some (global) hooks (for latex):
@@ -210,12 +221,12 @@ if non_generic_context.luatex_fonts.skip_loading ~= true then
loadmodule('font-oti.lua')
loadmodule('font-otf.lua')
loadmodule('font-otb.lua')
- loadmodule('luatex-fonts-inj.lua') -- will be replaced (luatex >= .80)
- loadmodule('font-ota.lua')
+ loadmodule('luatex-fonts-inj.lua')
+ loadmodule('luatex-fonts-ota.lua')
loadmodule('luatex-fonts-otn.lua')
- loadmodule('font-otp.lua') -- optional
+ loadmodule('font-otp.lua')
loadmodule('luatex-fonts-lua.lua')
- loadmodule('font-def.lua')
+ loadmodule('font-def.lua') -- this code (stripped) might end up in luatex-fonts-def.lua
loadmodule('luatex-fonts-def.lua')
loadmodule('luatex-fonts-ext.lua') -- some extensions
diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-test.tex b/Master/texmf-dist/tex/generic/context/luatex/luatex-test.tex
index b822af66875..6f48e0ced7a 100644
--- a/Master/texmf-dist/tex/generic/context/luatex/luatex-test.tex
+++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-test.tex
@@ -35,14 +35,16 @@
\font\gothic=msgothic(ms-gothic) {\gothic whatever}
-\font\testy=file:IranNastaliq.ttf:mode=node;script=arab;language=dflt;+calt;+ccmp;+init;+isol;+medi;+fina;+liga;+rlig;+kern;+mark;+mkmk at 14pt
-\testy این یک متن نمونه است با قلم ذر که درست آمده است.
+\bgroup
-\pdfprotrudechars2 \pdfadjustspacing2
+ \pdfprotrudechars2
+ \pdfadjustspacing2
-\font\testb=file:lmroman12-regular:+liga;extend=1.5 at 12pt \testb \input tufte \par
-\font\testb=file:lmroman12-regular:+liga;slant=0.8 at 12pt \testb \input tufte \par
-\font\testb=file:lmroman12-regular:+liga;protrusion=default at 12pt \testb \input tufte \par
+ \font\testb=file:lmroman12-regular:+liga;extend=1.5 at 12pt \testb \input tufte \par
+ \font\testb=file:lmroman12-regular:+liga;slant=0.8 at 12pt \testb \input tufte \par
+ \font\testb=file:lmroman12-regular:+liga;protrusion=default at 12pt \testb \input tufte \par
+
+\egroup
\setmplibformat{plain}
@@ -64,13 +66,12 @@
\font\test=dejavuserif:+kern at 10pt \test
-\hsize 1mm
-\noindent Циолковский
+\bgroup \hsize 1mm \noindent Циолковский \par \egroup
\loadpatterns{ru}
-\noindent Циолковский
+\bgroup \hsize 1mm \noindent Циолковский \par \egroup
a bit of math