From deab0bfe7f4be57121779e93bf291e518fda7cf3 Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Fri, 20 Jul 2018 21:48:33 +0200 Subject: 2018-07-20 21:28:00 --- doc/context/documents/general/manuals/luatex.pdf | Bin 1521742 -> 1521933 bytes doc/context/documents/general/manuals/onandon.pdf | Bin 4750536 -> 6602776 bytes doc/context/documents/general/manuals/tiptrick.pdf | Bin 47528 -> 47908 bytes doc/context/documents/general/qrcs/setup-cs.pdf | Bin 842777 -> 842775 bytes doc/context/documents/general/qrcs/setup-de.pdf | Bin 841990 -> 841991 bytes doc/context/documents/general/qrcs/setup-en.pdf | Bin 846612 -> 846605 bytes doc/context/documents/general/qrcs/setup-fr.pdf | Bin 841044 -> 841039 bytes doc/context/documents/general/qrcs/setup-it.pdf | Bin 844311 -> 844307 bytes .../documents/general/qrcs/setup-mapping-cs.pdf | Bin 346144 -> 346140 bytes .../documents/general/qrcs/setup-mapping-de.pdf | Bin 429316 -> 429311 bytes .../documents/general/qrcs/setup-mapping-en.pdf | Bin 343646 -> 343638 bytes .../documents/general/qrcs/setup-mapping-fr.pdf | Bin 346246 -> 346244 bytes .../documents/general/qrcs/setup-mapping-it.pdf | Bin 344850 -> 344846 bytes .../documents/general/qrcs/setup-mapping-nl.pdf | Bin 343940 -> 343935 bytes .../documents/general/qrcs/setup-mapping-ro.pdf | Bin 598649 -> 598646 bytes doc/context/documents/general/qrcs/setup-nl.pdf | Bin 837087 -> 837082 bytes doc/context/documents/general/qrcs/setup-ro.pdf | Bin 839541 -> 839552 bytes .../sources/general/manuals/luatex/luatex-lua.tex | 2 + .../sources/general/manuals/onandon/onandon-53.tex | 288 ++ .../general/manuals/onandon/onandon-execute.tex | 396 ++ .../general/manuals/onandon/onandon-expansion.tex | 307 ++ .../general/manuals/onandon/onandon-media.tex | 220 + .../general/manuals/onandon/onandon-speed-000.tex | 116 - .../general/manuals/onandon/onandon-speed-001.tex | 15 - .../general/manuals/onandon/onandon-speed-002.tex | 16 - .../general/manuals/onandon/onandon-speed-003.tex | 15 - .../general/manuals/onandon/onandon-speed-005.tex | 17 - .../general/manuals/onandon/onandon-speed-006.tex | 17 - .../general/manuals/onandon/onandon-speed-007.tex | 31 - .../general/manuals/onandon/onandon-speed-008.tex | 32 - .../general/manuals/onandon/onandon-speed-009.tex | 15 - .../general/manuals/onandon/onandon-speed-010.tex | 15 - .../general/manuals/onandon/onandon-speed-011.tex | 20 - .../general/manuals/onandon/onandon-speed-012.tex | 20 - .../sources/general/manuals/onandon/onandon.tex | 37 +- tex/context/base/mkii/cont-new.mkii | 2 +- tex/context/base/mkii/context.mkii | 2 +- tex/context/base/mkiv/char-def.lua | 4957 +++++++++++++++++++- tex/context/base/mkiv/char-emj.lua | 260 +- tex/context/base/mkiv/char-ini.lua | 11 + tex/context/base/mkiv/cont-new.mkiv | 2 +- tex/context/base/mkiv/context.mkiv | 2 +- tex/context/base/mkiv/lpdf-epd.lua | 2 + tex/context/base/mkiv/node-bck.lua | 2 +- tex/context/base/mkiv/node-ini.lua | 4 +- tex/context/base/mkiv/node-par.lua | 8 +- tex/context/base/mkiv/node-pro.lua | 6 +- tex/context/base/mkiv/node-ref.lua | 83 + tex/context/base/mkiv/node-rul.lua | 1 - tex/context/base/mkiv/node-tsk.lua | 25 +- tex/context/base/mkiv/pack-rul.lua | 4 +- tex/context/base/mkiv/page-ini.lua | 43 +- tex/context/base/mkiv/status-files.pdf | Bin 26146 -> 26134 bytes tex/context/base/mkiv/status-lua.pdf | Bin 264927 -> 265034 bytes tex/context/base/mkiv/strc-blk.lua | 93 +- tex/context/base/mkiv/strc-blk.mkiv | 27 +- tex/context/base/mkiv/supp-box.lua | 49 +- tex/context/base/mkiv/task-ini.lua | 2 +- tex/context/base/mkiv/trac-vis.lua | 14 +- tex/context/base/mkiv/typo-bld.lua | 9 +- tex/context/base/mkiv/typo-wrp.lua | 75 +- tex/context/base/mkiv/typo-wrp.mkiv | 9 +- tex/context/base/mkiv/util-seq.lua | 12 +- tex/context/base/mkiv/util-sql-logins.lua | 5 + tex/context/interface/mkiv/i-context.pdf | Bin 846612 -> 846605 bytes tex/context/interface/mkiv/i-readme.pdf | Bin 61212 -> 61206 bytes tex/generic/context/luatex/luatex-fonts-merged.lua | 2 +- 67 files changed, 6725 insertions(+), 565 deletions(-) create mode 100644 doc/context/sources/general/manuals/onandon/onandon-53.tex create mode 100644 doc/context/sources/general/manuals/onandon/onandon-execute.tex create mode 100644 doc/context/sources/general/manuals/onandon/onandon-expansion.tex create mode 100644 doc/context/sources/general/manuals/onandon/onandon-media.tex delete mode 100644 doc/context/sources/general/manuals/onandon/onandon-speed-000.tex delete mode 100644 doc/context/sources/general/manuals/onandon/onandon-speed-001.tex delete mode 100644 doc/context/sources/general/manuals/onandon/onandon-speed-002.tex delete mode 100644 doc/context/sources/general/manuals/onandon/onandon-speed-003.tex delete mode 100644 doc/context/sources/general/manuals/onandon/onandon-speed-005.tex delete mode 100644 doc/context/sources/general/manuals/onandon/onandon-speed-006.tex delete mode 100644 doc/context/sources/general/manuals/onandon/onandon-speed-007.tex delete mode 100644 doc/context/sources/general/manuals/onandon/onandon-speed-008.tex delete mode 100644 doc/context/sources/general/manuals/onandon/onandon-speed-009.tex delete mode 100644 doc/context/sources/general/manuals/onandon/onandon-speed-010.tex delete mode 100644 doc/context/sources/general/manuals/onandon/onandon-speed-011.tex delete mode 100644 doc/context/sources/general/manuals/onandon/onandon-speed-012.tex diff --git a/doc/context/documents/general/manuals/luatex.pdf b/doc/context/documents/general/manuals/luatex.pdf index 032c5b1b6..545e55d68 100644 Binary files a/doc/context/documents/general/manuals/luatex.pdf and b/doc/context/documents/general/manuals/luatex.pdf differ diff --git a/doc/context/documents/general/manuals/onandon.pdf b/doc/context/documents/general/manuals/onandon.pdf index 3195b7ebd..add044367 100644 Binary files a/doc/context/documents/general/manuals/onandon.pdf and b/doc/context/documents/general/manuals/onandon.pdf differ diff --git a/doc/context/documents/general/manuals/tiptrick.pdf b/doc/context/documents/general/manuals/tiptrick.pdf index 55d65029a..ea55ab7d8 100644 Binary files a/doc/context/documents/general/manuals/tiptrick.pdf and b/doc/context/documents/general/manuals/tiptrick.pdf differ diff --git a/doc/context/documents/general/qrcs/setup-cs.pdf b/doc/context/documents/general/qrcs/setup-cs.pdf index 597e89e0c..329441f3c 100644 Binary files a/doc/context/documents/general/qrcs/setup-cs.pdf and b/doc/context/documents/general/qrcs/setup-cs.pdf differ diff --git a/doc/context/documents/general/qrcs/setup-de.pdf b/doc/context/documents/general/qrcs/setup-de.pdf index 4838c00e5..70c658b2b 100644 Binary files a/doc/context/documents/general/qrcs/setup-de.pdf and b/doc/context/documents/general/qrcs/setup-de.pdf differ diff --git a/doc/context/documents/general/qrcs/setup-en.pdf b/doc/context/documents/general/qrcs/setup-en.pdf index b467a753e..f2279cf49 100644 Binary files a/doc/context/documents/general/qrcs/setup-en.pdf and b/doc/context/documents/general/qrcs/setup-en.pdf differ diff --git a/doc/context/documents/general/qrcs/setup-fr.pdf b/doc/context/documents/general/qrcs/setup-fr.pdf index 2f550ac44..5a3e45afe 100644 Binary files a/doc/context/documents/general/qrcs/setup-fr.pdf and b/doc/context/documents/general/qrcs/setup-fr.pdf differ diff --git a/doc/context/documents/general/qrcs/setup-it.pdf b/doc/context/documents/general/qrcs/setup-it.pdf index 4e39b5e08..b03853499 100644 Binary files a/doc/context/documents/general/qrcs/setup-it.pdf and b/doc/context/documents/general/qrcs/setup-it.pdf differ diff --git a/doc/context/documents/general/qrcs/setup-mapping-cs.pdf b/doc/context/documents/general/qrcs/setup-mapping-cs.pdf index faf79f9b7..ec2d100e3 100644 Binary files a/doc/context/documents/general/qrcs/setup-mapping-cs.pdf and b/doc/context/documents/general/qrcs/setup-mapping-cs.pdf differ diff --git a/doc/context/documents/general/qrcs/setup-mapping-de.pdf b/doc/context/documents/general/qrcs/setup-mapping-de.pdf index 7037db2c0..a94f73894 100644 Binary files a/doc/context/documents/general/qrcs/setup-mapping-de.pdf and b/doc/context/documents/general/qrcs/setup-mapping-de.pdf differ diff --git a/doc/context/documents/general/qrcs/setup-mapping-en.pdf b/doc/context/documents/general/qrcs/setup-mapping-en.pdf index 5f495892a..f44fe7c4a 100644 Binary files a/doc/context/documents/general/qrcs/setup-mapping-en.pdf and b/doc/context/documents/general/qrcs/setup-mapping-en.pdf differ diff --git a/doc/context/documents/general/qrcs/setup-mapping-fr.pdf b/doc/context/documents/general/qrcs/setup-mapping-fr.pdf index c92fdf0d9..71ee87097 100644 Binary files a/doc/context/documents/general/qrcs/setup-mapping-fr.pdf and b/doc/context/documents/general/qrcs/setup-mapping-fr.pdf differ diff --git a/doc/context/documents/general/qrcs/setup-mapping-it.pdf b/doc/context/documents/general/qrcs/setup-mapping-it.pdf index ad7c68621..f37ab1589 100644 Binary files a/doc/context/documents/general/qrcs/setup-mapping-it.pdf and b/doc/context/documents/general/qrcs/setup-mapping-it.pdf differ diff --git a/doc/context/documents/general/qrcs/setup-mapping-nl.pdf b/doc/context/documents/general/qrcs/setup-mapping-nl.pdf index d09218df0..dab7f627a 100644 Binary files a/doc/context/documents/general/qrcs/setup-mapping-nl.pdf and b/doc/context/documents/general/qrcs/setup-mapping-nl.pdf differ diff --git a/doc/context/documents/general/qrcs/setup-mapping-ro.pdf b/doc/context/documents/general/qrcs/setup-mapping-ro.pdf index 3312cbd36..3021a6ac5 100644 Binary files a/doc/context/documents/general/qrcs/setup-mapping-ro.pdf and b/doc/context/documents/general/qrcs/setup-mapping-ro.pdf differ diff --git a/doc/context/documents/general/qrcs/setup-nl.pdf b/doc/context/documents/general/qrcs/setup-nl.pdf index 20965c2b7..b6d12170c 100644 Binary files a/doc/context/documents/general/qrcs/setup-nl.pdf and b/doc/context/documents/general/qrcs/setup-nl.pdf differ diff --git a/doc/context/documents/general/qrcs/setup-ro.pdf b/doc/context/documents/general/qrcs/setup-ro.pdf index 729ff45d1..09040ae71 100644 Binary files a/doc/context/documents/general/qrcs/setup-ro.pdf and b/doc/context/documents/general/qrcs/setup-ro.pdf differ diff --git a/doc/context/sources/general/manuals/luatex/luatex-lua.tex b/doc/context/sources/general/manuals/luatex/luatex-lua.tex index e9007e964..0f7cae3a3 100644 --- a/doc/context/sources/general/manuals/luatex/luatex-lua.tex +++ b/doc/context/sources/general/manuals/luatex/luatex-lua.tex @@ -673,6 +673,8 @@ accept a string and return a string with the hash. \startsubsection[title={Locales}] +\index {locales} + In stock \LUA, many things depend on the current locale. In \LUATEX, we can't do that, because it makes documents unportable. While \LUATEX\ is running if forces the following locale settings: diff --git a/doc/context/sources/general/manuals/onandon/onandon-53.tex b/doc/context/sources/general/manuals/onandon/onandon-53.tex new file mode 100644 index 000000000..0d5dc1b9c --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon-53.tex @@ -0,0 +1,288 @@ +% language=uk + +\startcomponent onandon-53 + +\environment onandon-environment + +\startchapter[title={From \LUA\ 5.2 to 5.3}] + +When we started with \LUATEX\ we used \LUA\ 5.1 and moved to 5.2 when that became +available. We didn't run into issues then because there were no fundamental +changes that could not be dealt with. However, when \LUA\ 5.3 was announced in +2015 we were not sure if we should make the move. The main reason was that we'd +chosen \LUA\ because of its clean design which meant that we had only one number +type: double. In 5.3 on the other hand, deep down a number can be either an +integer or a floating point quantity. + +Internally \TEX\ is mostly (up to) 32-bit integers and when we go from \LUA\ to +\TEX\ we round numbers. Nonetheless one can expect some benefits in using +integers. Performance|-|wise we didn't expect much, and memory consumption would +be the same too. So, the main question then was: can we get the same output and +not run into trouble due to possible differences in serializing numbers; after +all \TEX\ is about stability. The serialization aspect is for instance important +when we compare quantities and|/|or use numbers in hashes. + +Apart from this change in number model, which comes with a few extra helpers, +another extension in 5.3 was that bit|-|wise operations are now part of the +language. The lpeg library is still not part of stock \LUA. There is some minimal +\UTF8 support, but less than we provide in \LUATEX\ already. So, looking at these +changes, we were not in a hurry to update. Also, it made sense to wait till this +important number|-|related change was stable. + +But, a few years later, we still had it on our agenda to test, and after the +\CONTEXT\ 2017 meeting we decided to give it a try; here are some observations. A +quick test was just dropping in the new \LUA\ code and seeing if we could make a +\CONTEXT\ format. Indeed that was no big deal but a test run failed because at +some point a (for instance) \type {1} became a \type {1.0}. It turned out that +serializing has some side effects. And with some ad hoc prints for tracing (in +the \LUATEX\ source) I could figure out what went on. How numbers are seen can +(to some extent) be deduced from the \type {string.format} function, which is in +\LUA\ a combination of parsing, splitting and concatenation combined with piping +to the \CCODE\ \type {sprintf} function. \footnote {Actually, at some point I +decided to write my own formatter on top of \type {format} and I ended up with +splitting as well. It's only now that I realize why this is working out so well +(in terms of performance): simple format (single items) are passed more or less +directly to \type {sprintf} and as \LUA\ itself is fast, due to some caching, the +overhead is small compared to the built|-|in splitter method. And the \CONTEXT\ +formatter has many more options and is extensible.} + +\starttyping +local a = 2 * (1/2) print(string.format("%s", a),math.type(x)) +local b = 2 * (1/2) print(string.format("%d", b),math.type(x)) +local c = 2 print(string.format("%d", c),math.type(x)) +local d = -2 print(string.format("%d", d),math.type(x)) +local e = 2 * (1/2) print(string.format("%i", e),math.type(x)) +local f = 2.1 print(string.format("%.0f",f),math.type(x)) +local g = 2.0 print(string.format("%.0f",g),math.type(x)) +local h = 2.1 print(string.format("%G", h),math.type(x)) +local i = 2.0 print(string.format("%G", i),math.type(x)) +local j = 2 print(string.format("%.0f",j),math.type(x)) +local k = -2 print(string.format("%.0f",k),math.type(x)) +\stoptyping + +This gives the following results: + +\starttabulate[|cBT|c|T|c|cT|] +\BC a \NC 2 * (1/2)\NC s \NC 1.0 \NC float \NC \NR +\BC b \NC 2 * (1/2)\NC d \NC 1 \NC float \NC \NR +\BC c \NC 2 \NC d \NC 2 \NC integer \NC \NR +\BC d \NC -2 \NC d \NC 2 \NC integer \NC \NR +\BC e \NC 2 * (1/2)\NC i \NC 1 \NC float \NC \NR +\BC f \NC 2.1 \NC .0f \NC 2 \NC float \NC \NR +\BC g \NC 2.0 \NC .0f \NC 2 \NC float \NC \NR +\BC h \NC 2.1 \NC G \NC 2.1 \NC float \NC \NR +\BC i \NC 2.0 \NC G \NC 2 \NC float \NC \NR +\BC j \NC 2 \NC .0f \NC 2 \NC integer \NC \NR +\BC k \NC -2 \NC .0f \NC 2 \NC integer \NC \NR +\stoptabulate + +This demonstrates that we have to be careful when we need these numbers +represented as strings. In \CONTEXT\ the number of places where we had to check +for that was not that large; in fact, only some hashing related to font sizes had +to be done using explicit rounding. + +Another surprising side effect is the following. Instead of: + +\starttyping +local n = 2^6 +\stoptyping + +we now need to use: + +\starttyping +local n = 0x40 +\stoptyping + +or just: + +\starttyping +local n = 64 +\stoptyping + +because we don't want this to be serialized to \type {64.0} which is due to the +fact that a power results in a float. One can wonder if this makes sense when we +apply it to an integer. + +At any rate, once we could process a file, two documents were chosen for a +performance test. Some experiments with loops and casts had demonstrated that we +could expect a small performance hit and indeed, this was the case. Processing +the \LUATEX\ manual takes 10.7 seconds with 5.2 on my 5-year-old laptop and 11.6 +seconds with 5.3. If we consider that \CONTEXT\ spends 50\% of its time in \LUA, +then we see a 20\% performance penalty. Processing the \METAFUN\ manual (which +has lots of \METAPOST\ images) went from less than 20 seconds (\LUAJITTEX\ does +it in 16 seconds) up to more than 27 seconds. So there we lose more than 50\% on +the \LUA\ end. When we observed these kinds of differences, Luigi and I +immediately got into debugging mode, partly out of curiosity, but also because +consistent performance is important to~us. + +Because these numbers made no sense, we traced different sub-mechanisms and +eventually it became clear that the reason for the speed penalty was that the +core \typ {string.format} function was behaving quite badly in the \type {mingw} +cross-compiled binary, as seen by this test: + +\starttyping +local t = os.clock() +for i=1,1000*1000 do + -- local a = string.format("%.3f",1.23) + -- local b = string.format("%i",123) + local c = string.format("%s",123) +end +print(os.clock()-t) +\stoptyping + +\starttabulate[|c|c|c|c|c|] +\BC \BC lua 5.3 \BC lua 5.2 \BC texlua 5.3 \BC texlua 5.2 \BC \NR +\BC a \NC 0.43 \NC 0.54 \NC 3.71 (0.47) \NC 0.53 \NC \NR +\BC b \NC 0.18 \NC 0.24 \NC 3.78 (0.17) \NC 0.22 \NC \NR +\BC c \NC 0.26 \NC 0.68 \NC 3.67 (0.29) \NC 0.66 \NC \NR +\stoptabulate + +The 5.2 binaries perform the same but the 5.3 Lua binary greatly outperforms +\LUATEX, and so we had to figure out why. After all, all this integer +optimization could bring some gain! It took us a while to figure this out. The +numbers in parentheses are the results after fixing this. + +Because font internals are specified in integers one would expect a gain +in running: + +\starttyping +mtxrun --script font --reload force +\stoptyping + +and indeed that is the case. On my machine a scan results in 2561 registered +fonts from 4906 read files and with 5.2 that takes 9.1 seconds while 5.3 needs a +bit less: 8.6 seconds (with the bad format performance) and even less once that +was fixed. For a test: + +\starttyping +\setupbodyfont[modern] \tf \bf \it \bs +\setupbodyfont[pagella] \tf \bf \it \bs +\setupbodyfont[dejavu] \tf \bf \it \bs +\setupbodyfont[termes] \tf \bf \it \bs +\setupbodyfont[cambria] \tf \bf \it \bs +\starttext \stoptext +\stoptyping + +This code needs 30\% more runtime so the question is: how often do we call \type +{string.format} there? A first run (when we wipe the font cache) needs some +715,000 calls while successive runs need 115,000 calls so that slow down +definitely comes from the bad handling of \type {string.format}. When we drop in +a \LUA\ update or whatever other dependency we don't want this kind of impact. In +fact, when one uses external libraries that are or can be compiled under the +\TEX\ Live infrastructure and the impact would be such, it's bad advertising, +especially when one considers the occasional complaint about \LUATEX\ being +slower than other engines. + +The good news is that eventually Luigi was able to nail down this issue and we +got a binary that performed well. It looks like \LUA\ 5.3.4 (cross|)|compiles +badly with \GCC\ 5.3.0 and 6.3.0. + +So in the end caching the fonts takes: + +\starttabulate[||c|c|] +\BC \BC caching \BC running \NC \NR +\BC 5.2 stock \NC 8.3 \NC 1.2 \NC \NR +\BC 5.3 bugged \NC 12.6 \NC 2.1 \NC \NR +\BC 5.3 fixed \NC 6.3 \NC 1.0 \NC \NR +\stoptabulate + +So indeed it looks like 5.3 is able to speed up \LUATEX\ a bit, given that one +integrates it in the right way! Using a recent compiler is needed too, although +one can wonder when a bad case will show up again. One can also wonder why such a +slow down can mostly go unnoticed, because for sure \LUATEX\ is not the only +compiled program. + +The next examples are some edge cases that show you need to be aware +that +\startitemize[n,text,nostopper] + \startitem an integer has its limits, \stopitem + \startitem that hexadecimal numbers are integers and \stopitem + \startitem that \LUA\ and \LUAJIT\ can be different in details. \stopitem +\stopitemize + +\starttabulate[||T|T|] +\NC \NC \tx print(0xFFFFFFFFFFFFFFFF) \NC \tx print(0x7FFFFFFFFFFFFFFF) \NC \NR +\HL +\BC lua 52 \NC 1.844674407371e+019 \NC 9.2233720368548e+018 \NC \NR +\BC luajit \NC 1.844674407371e+19 \NC 9.2233720368548e+18 \NC \NR +\BC lua 53 \NC -1 \NC 9223372036854775807 \NC \NR +\stoptabulate + +So, to summarize the process. A quick test was relatively easy: move 5.3 into the +code base, adapt a little bit of internals (there were some \LUATEX\ interfacing +bits where explicit rounding was needed), run tests and eventually fix some +issues related to the Makefile (compatibility) and \CCODE\ obscurities (the slow +\type {sprintf}). Adapting \CONTEXT\ was also not much work, and the test suite +uncovered some nasty side effects. For instance, the valid 5.2 solution: + +\starttyping +local s = string.format("02X",u/1024) +local s = string.char (u/1024) +\stoptyping + +now has to become (both 5.2 and 5.3): + +\starttyping +local s = string.format("02X",math.floor(u/1024)) +local s = string.char (math.floor(u/1024)) +\stoptyping + +or (both 5.2 and (emulated or real) 5.3): + +\starttyping +local s = string.format("02X",bit32.rshift(u,10)) +local s = string.char (bit32.rshift(u,10)) +\stoptyping + +or (only 5.3): + +\starttyping +local s = string.format("02X",u >> 10)) +local s = string.char (u >> 10) +\stoptyping + +or (only 5.3): + +\starttyping +local s = string.format("02X",u//1024) +local s = string.char (u//1024) +\stoptyping + +A conditional section like: + +\starttyping +if LUAVERSION >= 5.3 then + local s = string.format("02X",u >> 10)) + local s = string.char (u >> 10) +else + local s = string.format("02X",bit32.rshift(u,10)) + local s = string.char (bit32.rshift(u,10)) +end +\stoptyping + +will fail because (of course) the 5.2 parser doesn't like that. In \CONTEXT\ we +have some experimental solutions for that but that is beyond this summary. + +In the process a few \UTF\ helpers were added to the string library so that we +have a common set for \LUAJIT\ and \LUA\ (the \type {utf8} library that was added +to 5.3 is not that important for \LUATEX). For now we keep the \type {bit32} +library on board. Of course we'll not mention all the details here. + +When we consider a gain in speed of 5-10\% with 5.3 that also means that the gain +of \LUAJITTEX\ compared to 5.2 becomes less. For instance in font processing both +engines now perform closer to the same. + +As I write this, we've just entered 2018 and after a few months of testing +\LUATEX\ with \LUA\ 5.3 we're confident that we can move the code to the +experimental branch. This means that we will use this version in the \CONTEXT\ +distribution and likely will ship this version as 1.10 in 2019, where it becomes +the default. The 2018 version of \TEX~Live will have 1.07 with \LUA\ 5.2 while +intermediate versions of the \LUA\ 5.3 binary will end up on the \CONTEXT\ +garden, probably with number 1.08 and 1.09 (who knows what else we will add or +change in the meantime). + +\stopchapter + +\stopcomponent + +% collectgarbage("count") -- two return values in 2 diff --git a/doc/context/sources/general/manuals/onandon/onandon-execute.tex b/doc/context/sources/general/manuals/onandon/onandon-execute.tex new file mode 100644 index 000000000..abb3b4d8a --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon-execute.tex @@ -0,0 +1,396 @@ +% language=uk + +\startcomponent onandon-execute + +\environment onandon-environment + +\startchapter[title={Executing \TEX}] + +Much of the \LUA\ code in \CONTEXT\ originates from experiments. When it survives +in the source code it is probably used, waiting to be used or kept for +educational purposes. The functionality that we describe here has already been +present for a while in \CONTEXT, but improved a little starting with \LUATEX\ +1.08 due to an extra helper. The code shown here is generic and not used in +\CONTEXT\ as such. + +Say that we have this code: + +\startbuffer +for i=1,10000 do + tex.sprint("1") + tex.sprint("2") + for i=1,3 do + tex.sprint("3") + tex.sprint("4") + tex.sprint("5") + end + tex.sprint("\\space") +end +\stopbuffer + +\typebuffer + +% \ctxluabuffer + +When we call \type {\directlua} with this snippet we get some 30 pages of \type +{12345345345}. The printed text is saved till the end of the \LUA\ call, so +basically we pipe some 170.000 characters to \TEX\ that get interpreted as one +paragraph. + +Now imagine this: + +\startbuffer +\setbox0\hbox{xxxxxxxxxxx} \number\wd0 +\stopbuffer + +\typebuffer + +which gives \getbuffer. If we check the box in \LUA, with: + +\startbuffer +tex.sprint(tex.box[0].width) +tex.sprint("\\enspace") +tex.sprint("\\setbox0\\hbox{!}") +tex.sprint(tex.box[0].width) +\stopbuffer + +\typebuffer + +the result is {\tttf \ctxluabuffer}, which is not what you would expect at first +sight. However, if you consider that we just pipe to a \TEX\ buffer that gets +parsed after the \LUA\ call, it will be clear that the reported width is the +width that we started with. It will work all right if we say: + +\startbuffer +tex.sprint(tex.box[0].width) +tex.sprint("\\enspace") +tex.sprint("\\setbox0\\hbox{!}") +tex.sprint("\\directlua{tex.sprint(tex.box[0].width)}") +\stopbuffer + +\typebuffer + +because now we get: {\tttf\ctxluabuffer}. It's not that complex to write some +support code that makes this more convenient. This can work out quite well but +there is a drawback. If we use this code: + +\startbuffer +print(status.input_ptr) +tex.sprint(tex.box[0].width) +tex.sprint("\\enspace") +tex.sprint("\\setbox0\\hbox{!}") +tex.sprint("\\directlua{print(status.input_ptr)\ + tex.sprint(tex.box[0].width)}") +\stopbuffer + +\typebuffer + +Here we get \type {6} and \type {7} reported. You can imagine that when a lot of +nested \type {\directlua} calls happen, we can get an overflow of the input level +or (depending on what we do) the input stack size. Ideally we want to do a \LUA\ +call, temporarily go to \TEX, return to \LUA, etc.\ without needing to worry +about nesting and possible crashes due to \LUA\ itself running into problems. One +charming solution is to use so|-|called coroutines: independent \LUA\ threads +that one can switch between --- you jump out from the current routine to another +and from there back to the current one. However, when we use \type {\directlua} +for that, we still have this nesting issue and what is worse, we keep nesting +function calls too. This can be compared to: + +\starttyping +\def\whatever{\ifdone\whatever\fi} +\stoptyping + +where at some point \type {\ifdone} is false so we quit. But we keep nesting when +the condition is met, so eventually we can end up with some nesting related +overflow. The following: + +\starttyping +\def\whatever{\ifdone\expandafter\whatever\fi} +\stoptyping + +is less likely to overflow because there we have tail recursion which basically +boils down to not nesting but continuing. Do we have something similar in +\LUATEX\ for \LUA ? Yes, we do. We can register a function, for instance: + +\starttyping +lua.get_functions_table()[1] = function() print("Hi there!") end +\stoptyping + +and call that one with: + +\starttyping +\luafunction 1 +\stoptyping + +This is a bit faster than calling a function like: + +\starttyping +\directlua{HiThere()} +\stoptyping + +which can also be achieved by + +\starttyping +\directlua{print("Hi there!")} +\stoptyping + +which sometimes can be more convenient. Anyway, a function call is what we can +use for our purpose as it doesn't involve interpretation and effectively behaves +like a tail call. The following snippet shows what we have in mind: + +\startbuffer[code] +local stepper = nil +local stack = { } +local fid = 0xFFFFFF +local goback = "\\luafunction" .. fid .. "\\relax" + +function tex.resume() + if coroutine.status(stepper) == "dead" then + stepper = table.remove(stack) + end + if stepper then + coroutine.resume(stepper) + end +end + +lua.get_functions_table()[fid] = tex.resume + +function tex.yield() + tex.sprint(goback) + coroutine.yield() + texio.closeinput() +end + +function tex.routine(f) + table.insert(stack,stepper) + stepper = coroutine.create(f) + tex.sprint(goback) +end +\stopbuffer + +\ctxluabuffer[code] + +\startbuffer[demo] +tex.routine(function() + tex.sprint(tex.box[0].width) + tex.sprint("\\enspace") + tex.sprint("\\setbox0\\hbox{!}") + tex.yield() + tex.sprint(tex.box[0].width) +end) +\stopbuffer + +\typebuffer[demo] +We start a routine, jump out to \TEX\ in the middle, come back when we're done +and continue. This gives us: \ctxluabuffer [demo], which is what we expect. + +\setbox0\hbox{xxxxxxxxxxx} + +\ctxluabuffer[demo] + +This mechanism permits efficient (nested) loops like: + +\startbuffer[demo] +tex.routine(function() + for i=1,10000 do + tex.sprint("1") + tex.yield() + tex.sprint("2") + tex.routine(function() + for i=1,3 do + tex.sprint("3") + tex.yield() + tex.sprint("4") + tex.yield() + tex.sprint("5") + end + end) + tex.sprint("\\space") + tex.yield() + end +end) +\stopbuffer + +\typebuffer[demo] + +We do create coroutines, go back and forwards between \LUA\ and \TEX, but avoid +memory being filled up with printed content. If we flush paragraphs (instead of +e.g.\ the space) then the main difference is that instead of a small delay due to +the loop unfolding in a large set of prints and accumulated content, we now get a +steady flushing and processing. + +However, we can still have an overflow of input buffers because we still nest +them: the limitation at the \TEX\ end has moved to a limitation at the \LUA\ end. +How come? Here is the code that we use: + +\typebuffer[code] + +The \type {routine} creates a coroutine, and \type {yield} gives control to \TEX. +The \type {resume} is done at the \TEX\ end when we're finished there. In +practice this works fine and when you permit enough nesting and levels in \TEX\ +then you will not easily overflow. + +When I picked up this side project and wondered how to get around it, it suddenly +struck me that if we could just quit the current input level then nesting would +not be a problem. Adding a simple helper to the engine made that possible (of +course figuring it out took a while): + +\startbuffer[code] +local stepper = nil +local stack = { } +local fid = 0xFFFFFF +local goback = "\\luafunction" .. fid .. "\\relax" + +function tex.resume() + if coroutine.status(stepper) == "dead" then + stepper = table.remove(stack) + end + if stepper then + coroutine.resume(stepper) + end +end + +lua.get_functions_table()[fid] = tex.resume + +if texio.closeinput then + function tex.yield() + tex.sprint(goback) + coroutine.yield() + texio.closeinput() + end +else + function tex.yield() + tex.sprint(goback) + coroutine.yield() + end +end + +function tex.routine(f) + table.insert(stack,stepper) + stepper = coroutine.create(f) + tex.sprint(goback) +end +\stopbuffer + +\ctxluabuffer[code] + +\typebuffer[code] + +The trick is in \type {texio.closeinput}, a recent helper and one that should be +used with care. We assume that the user knows what she or he is doing. On an old +laptop with a i7-3840 processor running \WINDOWS\ 10 the following snippet takes +less than 0.35 seconds with \LUATEX\ and 0.26 seconds with \LUAJITTEX. + +\startbuffer[code] +tex.routine(function() + for i=1,10000 do + tex.sprint("\\setbox0\\hpack{x}") + tex.yield() + tex.sprint(tex.box[0].width) + tex.routine(function() + for i=1,3 do + tex.sprint("\\setbox0\\hpack{xx}") + tex.yield() + tex.sprint(tex.box[0].width) + end + end) + end +end) +\stopbuffer + +\typebuffer[code] + +% \testfeatureonce {1} {\setbox0\hpack{\ctxluabuffer[code]}} \elapsedtime + +Say that we run the bad snippet: + +\startbuffer[code] +for i=1,10000 do + tex.sprint("\\setbox0\\hpack{x}") + tex.sprint(tex.box[0].width) + for i=1,3 do + tex.sprint("\\setbox0\\hpack{xx}") + tex.sprint(tex.box[0].width) + end +end +\stopbuffer + +\typebuffer[code] + +% \testfeatureonce {1} {\setbox0\hpack{\ctxluabuffer[code]}} \elapsedtime + +This time we need 0.12 seconds in both engines. So what if we run this: + +\startbuffer[code] +\dorecurse{10000}{% + \setbox0\hpack{x} + \number\wd0 + \dorecurse{3}{% + \setbox0\hpack{xx} + \number\wd0 + }% +} +\stopbuffer + +\typebuffer[code] + +% \testfeatureonce {1} {\setbox0\hpack{\getbuffer[code]}} \elapsedtime + +Pure \TEX\ needs 0.30 seconds for both engines but there we lose 0.13 seconds on +the loop code. In the \LUA\ example where we yield, the loop code takes hardly +any time. As we need only 0.05 seconds more it demonstrates that when we use the +power of \LUA\ the performance hit of the switch is quite small: we yield 40.000 +times! In general, such differences are far exceeded by the overhead: the time +needed to typeset the content (which \type {\hpack} doesn't do), breaking +paragraphs into lines, constructing pages and other overhead involved in the run. +In \CONTEXT\ we use a slightly different variant which has 0.30 seconds more +overhead, but that is probably true for all \LUA\ usage in \CONTEXT, but again, +it disappears in other runtime. + +Here is another example: + +\startbuffer[code] +\def\TestWord#1% + {\directlua{ + tex.routine(function() + tex.sprint("\\setbox0\\hbox{\\tttf #1}") + tex.yield() + tex.sprint(math.round(100 * tex.box[0].width/tex.hsize)) + tex.sprint(" percent of the hsize: ") + tex.sprint("\\box0") + end) + }} +\stopbuffer + +\typebuffer[code] \getbuffer[code] + +\startbuffer +The width of next word is \TestWord {inline}! +\stopbuffer + +\typebuffer \getbuffer + +Now, in order to stay realistic, this macro can also be defined as: + +\startbuffer[code] +\def\TestWord#1% + {\setbox0\hbox{\tttf #1}% + \directlua{ + tex.sprint(math.round(100 * tex.box[0].width/tex.hsize)) + } % + percent of the hsize: \box0\relax} +\stopbuffer + +\typebuffer[code] + +We get the same result: \quotation {\getbuffer}. + +We have been using a \LUA|-|\TEX\ mix for over a decade now in \CONTEXT, and have +never really needed this mixed model. There are a few places where we could +(have) benefitted from it and we might use it in a few places, but so far we have +done fine without it. In fact, in most cases typesetting can be done fine at the +\TEX\ end. It's all a matter of imagination. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/onandon/onandon-expansion.tex b/doc/context/sources/general/manuals/onandon/onandon-expansion.tex new file mode 100644 index 000000000..73a0b4953 --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon-expansion.tex @@ -0,0 +1,307 @@ +% language=uk + +\startcomponent onandon-expansion + +\environment onandon-environment + +\startchapter[title={More (new) expansion trickery}] + +Contrary to what one might expect when looking at macro definitions, \TEX\ is +pretty efficient. Occasionally I wonder if some extra built in functionality +could help me write better code but when you program with a bit care there is +often not much to gain in terms of tokens and performance. \footnote {The long +trip to the yearly Bacho\TeX\ meeting is always a good opportunity to ponder +\TEX\ and its features. The new functionality discussed here is a side effect of +the most recent trip.} Also, some possible extensions probably only would be +applied a few times which makes them low priority. When you look at the +extensions brought by \ETEX\ the number is not that large, and \LUATEX\ only +added a few that deal with the language, for instance \tex {expanded} which is +like an \tex {edef} without the defining a macro and acts on a token list wrapped +in (normally) curly braces. Just as reference we mention some of the expansion +related helpers. + +\starttabulate[|l|l|p|] +\BC command \BC argument \BC + comment +\NC \NR +\HL +\NC \tex {expandafter} \NC \type {token} \NC + The token after the next token gets expanded (one level only). In tricky + \TEX\ code you can often see multiple such commands in sequence which makes a + nice puzzle. +\NC \NR +\NC \tex {noexpand} \NC \type {token} \NC + The token after this command is not expanded in the context of expansion. +\NC \NR +\NC \tex {expanded} \NC \type {{tokens}} \NC + The given token list is expanded. This command showed up early in \LUATEX\ + development and was taken from \ETEX\ follow|-|ups. I have mails from 2011 + mentioning its presence in \PDFTEX\ 1.50 (which was targeted in 2008) but + somehow it never ended up in a production version at that time (and we're + still not at that version). In \CONTEXT\ we already had a command with that + name so there we use \tex {normalexpanded}. Users normally can just use the + \CONTEXT\ variant of \type {\expanded}. +\NC \NR +\NC \tex {unexpanded} \NC \type {{tokens}} \NC + The given token list is hidden from expansion. Again, in \CONTEXT\ we already + had a command serving as prefix for definitions so instead we use \tex + {normalunexpanded}. In the core of \CONTEXT\ this new \ETEX\ command is hardly + used. +\NC \NR +\NC \tex {detokenize} \NC \type {{tokens}} \NC + The given tokenlist becomes (basically) verbatim \TEX\ code. We had something + like that in \CONTEXT\ but have no nameclash. It is used in a few places. It's + also an \ETEX\ command. +\NC \NR +\NC \tex {scantokens} \NC \type {{tokens}} \NC + This primitive interprets its argument as a pseudo file. We don't really use it. +\NC \NR % +\NC \tex {scantextokens} \NC \type {{tokens}} \NC + This \LUATEX\ primitive does the same but has no end|-|of|-|file side + effects. This one is also not really used in \CONTEXT. +\NC \NR +\NC \tex {protected} \NC \type {\.def} \NC + The definition following this prefix, introduced in \ETEX, is unexpandable in + the context of expansion. We already used such a command in \CONTEXT\ but + with a completely different meaning so use \tex {normalprotected} as prefix + or \tex {unexpanded} which is an alias. +\NC \NR +\stoptabulate + +Here I will present two other extensions in \LUATEX\ that can come in handy, and +they are there simply because their effect can hardly be realized otherwise +(never say never in \TEX). One has to do with immediately applying a definition, +the other with user defined conditions. The first one relates directly to +expansion, the second one concerns conditions and relates more to parsing +branches which on purpose avoids expansion. + +For the first one I use some silly examples. I must admit that although I can +envision useful application, I really need to go over the large amount of +\CONTEXT\ source code to really find a place where it is making things better. +Take the following definitions: + +\startbuffer +\newcount\NumberOfCalls + +\def\TestMe{\advance\NumberOfCalls1 } + +\edef\Tested{\TestMe foo:\the\NumberOfCalls} +\edef\Tested{\TestMe foo:\the\NumberOfCalls} +\edef\Tested{\TestMe foo:\the\NumberOfCalls} + +\meaning\Tested +\stopbuffer + +\typebuffer + +The result is a macro \tex {Tested} that not only has the unexpanded incrementing +code in its body but also hasn't done any advancing: + +\getbuffer + +Of course when you're typesetting something, this kind of expansion normally is +not needed. Instead of the above definition we can define \tex {TestMe} in a way +that expands the assignment immediately. You need of course to be aware of +preventing look ahead interference by using a space or \tex {relax} (often an +expression works better as it doesn't leave an \tex {relax}). + +\startbuffer +\def\TestMe{\immediateassignment\advance\NumberOfCalls1 } + +\edef\Tested{\TestMe bar:\the\NumberOfCalls} +\edef\Tested{\TestMe bar:\the\NumberOfCalls} +\edef\Tested{\TestMe bar:\the\NumberOfCalls} + +\meaning\Tested +\stopbuffer + +\typebuffer + +This time the counter gets updated and we don't see interference in the resulting +\tex {Tested} macro: + +\getbuffer + +Here is a somewhat silly example of an expanded comparison of two \quote +{strings}: + +\startbuffer +\def\expandeddoifelse#1#2#3#4% + {\immediateassignment\edef\tempa{#1}% + \immediateassignment\edef\tempb{#2}% + \ifx\tempa\tempb + \immediateassignment\def\next{#3}% + \else + \immediateassignment\def\next{#4}% + \fi + \next} + +\edef\Tested + {(\expandeddoifelse{abc}{def}{yes}{nop}/% + \expandeddoifelse{abc}{abc}{yes}{nop})} + +\meaning\Tested +\stopbuffer + +\typebuffer + +I don't remember many cases where I needed such an expanded comparison. We have a +variant in \CONTEXT\ that uses \LUA\ but that one is not really used in the core. +Anyway, the above code gives: + +\getbuffer + +You can do the same assignments as in preambles of \tex {halign} and after \tex +{accent} which means that assignments to box registers are blocked (boxing +involves grouping and delayed assignments and so). The error you will get when +you use a non||assignment command refers to a prefix, because internally such +commands are called prefixed commands. Leading spaces and \tex {relax} are +ignored. + +In addition to this one|-|time immediate assignment a pseudo token list variant +is provided, so the above could be rewritten to: + +\starttyping +\def\expandeddoifelse#1#2#3#4% + {\immediateassigned { + \edef\tempa{#1} + \edef\tempb{#2} + }% + \ifx\tempa\tempb + \immediateassignment\def\next{#3}% + \else + \immediateassignment\def\next{#4}% + \fi + \next} +\stoptyping + +While \tex {expanded} first builds a token lists that then gets used, the \tex +{immediateassigned} primitive just walls over the list delimited by curly braces. + +A next extension concerns conditions. If you have done a bit of extensive \TEX\ +programming you know that nested conditions need to be properly constructed in +for instance macro bodies. This is because (for good reason) \TEX\ goes into a +fast scanning mode when there is a match and it has to skip the \tex {else} upto +\tex {fi} branch. In order to do that properly a nested \tex {if} in there needs +to have a matching \tex {fi}. + +In practice this is no real problem and careful coding will never give a problem +here: you can either hide nested code in a macro or somehow jump over nested +conditions if really needed. Actually you only need to care when you pickup a +token inside the branch because likely you don't want to pick up for instance a +\tex {fi} but something that comes after it. Say that we have a sane conditional +setup like this: + +\starttyping +\newif\iffoo \foofalse +\newif\ifbar \bartrue + +\ifoo + \ifbar \else \fi +\else + \ifbar \else \fi +\fi +\stoptyping + +Here the \tex {iffoo} and \tex {ifbar} need to be equivalent to \tex {iftrue} or +\tex {iffalse} in order to succeed well and that is what for instance \tex +{footrue} and \tex {foofalse} will do: change the meaning of \tex {iffoo}. + +But imagine that you want something more complex. You want for instance to let +\tex {ifbar} do some calculations. In that case you want it to behave a bit like +what a so called \type {vardef} in \METAPOST\ does: the end result is what +matters. Now, because \TEX\ macros often are a complex mix of expandable and +non|-|expandable this is not that trivial. One solution is a dedicated definer, +say \tex {cdef} for defining a macro with conditional properties. I actually +implemented such a definer a few years ago but left it so long in a folder with +ideas that I only found it back after I had come up with another solution. It was +probably proof that it was not that good an idea. + +The solution implemented in \LUATEX\ is just a special case of a test: \tex +{ifcondition}. When looking at the next example, keep in mind that from the +perspective of \TEX's scanner it only needs to know if something is a token that +does some test and has a matching \tex {fi}. For that purpose you can consider +\tex {ifcondition} to be \tex {iftrue}. When \TEX\ actually wants to do a test, +which is the case in the true branch, then it will simply ignore this \tex +{ifcondition} primitive and expands what comes after it (which is \TEX's natural +behaviour). Effectively \tex {ifcondition} has no meaning except from when it has +to be skipped, in which case it's a token flagged as \tex {if} kind of command. + +\starttyping +\unexpanded\def\something#1#2% + {\edef\tempa{#1}% + \edef\tempb{#2} + \ifx\tempa\tempb} + +\ifcondition\something{a}{b}% + \ifcondition\something{a}{a}% + true 1 + \else + false 1 + \fi +\else + \ifcondition\something{a}{a}% + true 2 + \else + false 2 + \fi +\fi +\stoptyping + +Wrapped in a macro you can actually make this fully expandable when you use the +previously mentioned immediate assignment. Here is another example: + +\starttyping +\unexpanded\def\onoddpage + {\ifodd\count0 } + +\ifcondition\onoddpage odd \else even \fi page +\stoptyping + +The previously defined comparison macro can now be rewritten as: + +\starttyping +\def\equaltokens#1#2% + {\immediateassignment\edef\tempa{#1}% + \immediateassignment\edef\tempb{#2}% + \ifx\tempa\tempb} + +\def\expandeddoifelse#1#2#3#4% + {\ifcondition\equaltokens{#1}{#2}% + \immediateassignment\def\next{#3}% + \else + \immediateassignment\def\next{#4}% + \fi + \next} +\stoptyping + +When used this way it will of course also work without the \tex {ifcondition} but +when used nested it can be like this. This last example also demonstrates that +this feature probably only makes sense in more complicated cases where more work +is done in the \tex {onoddpage} or \tex {equaltokens} macro. And again, I am not +sure if for instance in \CONTEXT\ I have a real use for it because there are only +a few cases where nesting like this could benefit. I did some tests with a low +level macro where it made the code look nicer. It was actually a bit faster but +most core macros are not called that often. Although the overhead of this feature +can be neglected, performance should not be the reason for using it: in \CONTEXT\ +for instance one can often only measure such possible speed|-|ups on macros that +are called tens or hundreds of thousands of times and that seldom happens in a +real run end even then a change from say 0.827 seconds to 0.815 seconds for 10K +calls of a complex case is just noise as the opposite can also happen. + +Although not strictly necessary these extensions might make some code look better +so that is why they officially will be available in the 1.09 release of \LUATEX\ +in fall 2018. It might eventually inspire me to go over some code and see where I +can improve the look and feel. + +The last few years I have implemented some more ideas as local experiments, for +instance \tex {futurelet} variant or a simple (one level) \tex {expand}, but in +the end rejected them because there is no real benefit in them (no better looking +code, no gain in performance, hard to document, possible side effects, etc.), so +it is very unlikely that we will have more extensions like this. After all, we +could do more than 40 years without them. Although \unknown\ who knows what we +will provide in \LUATEX\ version~2. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/onandon/onandon-media.tex b/doc/context/sources/general/manuals/onandon/onandon-media.tex new file mode 100644 index 000000000..f44c3bb19 --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon-media.tex @@ -0,0 +1,220 @@ +% language=uk + +\startcomponent onandon-media + +\environment onandon-environment + +\startchapter[title={The state of \PDF}] + +\startsection[title={Introduction}] + +Below I will spend some words on the state of \PDF\ in \CONTEXT\ mid 2018. These +are just some reflections, not an in|-|depth discussion of the state of affairs. I +sometimes feel the need to wrap up. + +\stopsection + +\startsection[title={Media}] + +For over two decades \CONTEXT\ has supported fancy \PDF\ features like movies and +sound. In fact, as happens more, the flexibility of \TEX\ made it possible to +support such features right after they became available, often even before other +applications supported them. + +The first approach to support such media clips was relatively easy. In \PDF\ one +has the text flow, resulting from the typesetting process, either or not enhanced +with images that are referred to from the flow. In that respect images are an +integral part of \PDF. On a separate layer there can be annotations. There are +many kinds and they are originally a sort of extension mechanism that permits +plugins to add features to a document. Examples of this are hyperlinks and the +already mentioned media clips. Video was supported by the quicktime movie plugin. +As far as I know in the meantime that plugin has been dropped as official part of +Acrobat but one can still plug it in. + +Later an extra mechanism was introduced, tagged renditions. It separates the +views from the media and was more complex. When I first played with it, quite +some media were possible, and I made a demo that could handle mov, mp3, smi and +swf files. But last time I checked none of these really worked, apart from the +swf file. One gets pop|-|ups for missing viewers and a look at the reader +preferences makes one pessimistic about future support anyway. But one should be +able to set up a list of useable players with this mechanism (although only an +Adobe one seems to be okay so we're back to where we started). + +At some point support for u3d was added. Interesting is that there is quite some +infrastructure described in the \PDF\ standard. Also something called rich media +was introduced and that should replace the former video and audio annotations +(definitely in \PDF\ version 2) and probably some day the renditions will no +longer be supported either. Open source \PDF\ viewers just stuck to supporting +text and static images. + +Now, do these rich media work well? Hardly. The standard leaves it to the viewer +and provides ways to define viewers (although it's unclear to me how that works +out in practice.) Basically in \PDF\ version 2 there is no native support for +simple straightforward video. One has to construct a complex set of related +annotations. + +One can give arguments (like security risks) for not supporting all these fancy +features but then why make rich media part of the specification at all? Browsers +beat \PDF\ viewers in showing media and as browsers can operate in kiosk mode I +suppose that it's not that hard to delegate showing whatever you want in an +embedded window in the \PDF\ viewer. Or why not simply support videolan out of +the box. All we need is the ability to view movies and control them (play, pause, +stop, rewind, etc). Where \HTML\ evolved towards easier media support, \PDF\ +evolved to more obscurity. + +So, how bad is it really? There are \PDF\ files around that have video! Indeed, +but the way they're supposed to do this is as follows: currently one actually has +to embed a shockwave video player (a user interface around something built|-|in) +and let that player show for instance an mp4 movie. However, support for +shockwave (flash) will be dropped in 2020 and that renders documents that use it +obsolete. This even makes one wonder about \JAVASCRIPT\ and widgets like form +fields, also a rather moving and somewhat unstable target. (I must have a +document being a calculator somewhere made in the previous century, in the early +days of \PDF.) + +I think that the plugin model failed already rather early in the \PDF\ history if +only because it made no sense to develop them when in a next version of Acrobat +the functionality was copied in the core. In a similar fashion \JAVASCRIPT\ +support seems to have stalled. + +Unfortunately the open source viewers never catched on with media, forms and +\JAVASCRIPT\ and therefore there has been no momentum created to keep things +supported. It all makes efforts spent on supporting this kind of \PDF\ features a +waste of time. It also makes one careful in using them: it only works on the +short term. + +Get me right, I'm not talking of complex media like 3d or animations but of +straightforward video support. I understand that the rich media framework tries +to cover complex cases but it's simple cases that carry the format. On the other +hand, one can wonder why the \PDF\ format makes it possible to specify behaviour +that in practice depends on \JAVASCRIPT\ and therefore could as well have been +delegated to \JAVASCRIPT\ as well. It would probably have been much cleaner. +\footnote {It looks like mu\PDF\ in 2018 got some support related to widgets aka +fields but alas not for layers which would be quite useful.} + +The \PDF\ version 2 specification mentions \type {3D}, \type {Video} and \type +{Audio} as primary content types so maybe future viewers will support video out +of the box. Who knows. We try to keep up in \CONTEXT\ because it's often not that +complex to support \PDF\ features but with hardly any possibility to test them, +they have a low priority. And with Acrobat moving to the cloud and thereby +creating a more of less lifelong dependency on remote resources it doesn't become +much interesting to explore those routes either. + +\stopsection + +\startsection[title={Accessibility}] + +A popular \PDF\ related topic is accessibility. One aspect of that is tagged +\PDF. This substandard is in my opinion not something that deserves a price for +beauty. I know that there are \CONTEXT\ users who need to be compliant but I +always wonder what a publisher really does with such a file. It's a bit like +requiring \XML\ as source but at the same time sacrificing really rich encoded +and sources for tweaks that suite the current limitations of for instance browsers, +tool|-|chains and competence. We've seen it happen. + +Support for tagged \PDF\ has been available in \CONTEXT\ already for a while but +as far as I know only Acrobat professional can do something with it. The reason +for tagging is that a document is then useable for (for instance) visually +impaired users, but aren't they better served with a proper complete and very +structured source in some format that tools suitable for it can use? How many +publishers distribute \PDF\ files while they can still make money on prints? How +many are really interested in distributing enriched content that then can be +reused somehow? And how many are willing to invest in tools instead of waiting +for it to happen for free? It's a bit cheap trick to just expect authors (and +their in the case of \TEX\ free tools) to suit a publishers needs. Anyway, just +as with advanced interactive documents or forms, I wonder if it will catch on. At +least no publisher ever asked us and by the time they might do the competition of +web based dissemination could have driven \PDF\ to the background. But, in +\CONTEXT\ we will keep supporting such features anyway, if only because it's +quite doable. But \unknown\ it's user demand that drives development, not the +market, which means that the motivation for implementing such features depends on +user input as well as challenging aspects that make it somewhat fun to spend time +on them. + +\stopsection + +\startsection[title={Quality assurance}] + +Another aspect popping up occasionally is validation. I'm not entirely sure what +drives that but delegating a problem can be one reason. Often we see publishers +and printers use old versions of \PDF\ related tools. Also, some workflows are +kind of ancient anyway and are more driven by \POSTSCRIPT\ history than \PDF\ +possibilities. I sometimes get the impression that it takes at least a decade for +these things to catch on, and by that time it doesn't matter any more that \TEX\ +and friends were at the front: their users are harassed by what the market +demands by then. + +Support for several standards related to validation is already part of \CONTEXT\ +for quite a while. For instance the bump from \PDF\ 1.7 to 2.0 was hardly worth +noticing, simply because there are not that many fundamental changes. Adapting +\LUATEX\ was trivial (and actually not really needed), and macro packages can +provide what is needed without much problems. So, yes, we can support it without +much hassle. Personally I never ran into a case where validation was really +needed. The danger of validation is that it can give a false impression of +quality. And as with everything quality control created a market. As with other +features it is users who drive the availability of support for this. After all, +they are the ones testing it and figuring out the often fuzzy specifications. +These are things that one can always look at in retrospect (like: it has to be +done this or that way) while in practice in order to be an early adopter one has +to gamble a bit and see where it fails or succeeds. Fortunately it's relatively +easy to adapt macro packages and \CONTEXT\ users are willing to update so it's +not really an issue. + +Putting a stamp of approval on a \PDF\ cannot hide the inconsistencies between +for instance vector graphics produced by a third party. They also don't expose +inconsistent use of color and fonts. The page streams produced by \LUATEX\ are +simple and clean enough to not give problems with validation. The problem lays +more with resources coming from elsewhere. When you're phoned by a printing house +about an issue with \RGB\ images in a file where there is no sign of \RGB\ being +used but where a validator reports an issue, you're lucky when an experienced +printer dating back decades then replies that he already had that impression and +will contact the origin. There is no easy way out of this but educating users +(authors) is an option. However, they are often dependent on the publishers and +departments that deal with these and those tend to come with directives that the +authors cannot really argue with (or about). + +\stopsection + +\startsection[title={Interactivity}] + +This is an area where \TEX\ (an therefore also \CONTEXT) always had an edge, +There is a lot possible and in principle all that \PDF\ provides can be +supported. But the more fancy one goes, the more one depends on Acrobat. +Interactivity in \PDF\ evolved stepwise and is mostly market driven. As a result +it is (or was) not always consistent. This is partly due to the fact that we have +a chicken|-|egg issue: you need typesetting machinery, viewer as well as a +standard. + +The regular hyperlinks, page or named driven are normally supported by viewers. +Some redefined named destinations (like going to a next page, or going back in a +chain of followed links) not always. Launching applications, as it also relates +to security, can be qualified as an unreliable mechanism. More advanced linking, +for instance using \JAVASCRIPT\ is hardly supported. In that respect \PDF\ +viewers lag way behind \HTML\ browsers. I understand that there can be security +risks involved. It's interesting to see that in Acrobat one can mess with +internals of files which makes the \API\ large and complex, but if we stick to +the useful core, the amount of interfacing needed is quite small. Lack of support +in open source viewers (we're talking of about two decades now) made me loose +interest in these features but they are and will be supported in \CONTEXT. We'll +see if and when viewers catch up. + +Comments and attachments are also part of interactivity and of course we +supported them right from the start. Some free viewers also support them by now. +Personally I never use comments but they can be handy for popping up information +or embedding snippets or (structured) sources (like \MATHML\ or bibliographic +data). In \CONTEXT\ we can even support \PDF\ inclusion with (a reasonable) +subset of these so called annotations. As the \PDF\ standard no longer evolves +much we can expect all these features to become stable. + +\stopsection + +\startsection[title={Summary}] + +We have always supported the fancy \PDF\ features and we will continue doing so +in \CONTEXT . However, many of them depends on what viewers support, and after +decades of \PDF\ that is still kind of disappointing, which is not that +motivating. We'll see what happens. + +\stopsection + +\stopchapter diff --git a/doc/context/sources/general/manuals/onandon/onandon-speed-000.tex b/doc/context/sources/general/manuals/onandon/onandon-speed-000.tex deleted file mode 100644 index f48af866d..000000000 --- a/doc/context/sources/general/manuals/onandon/onandon-speed-000.tex +++ /dev/null @@ -1,116 +0,0 @@ -% \startenvironment onandon-speed-000 - -% \dontcomplain - -\edef\sapolsky{\ignorespaces\cldloadfile{sapolsky}\removeunwantedspaces} - -\startluacode - - function document.ResetSample(title) - document.elapsed = { - title = title, - times = { }, - } - end - - function document.RegisterSample(bodyfont,elapsed) - table.insert(document.elapsed.times, { - bodyfont = bodyfont, - elapsed = elapsed - }) - end - - function document.SaveSample() - if LUATEXENGINE == "luajittex" then - table.save(tex.jobname.."-jit.lua",document.elapsed) - else - table.save(tex.jobname..".lua",document.elapsed) - end - end - - function document.ShowSample(filename) - -- context.typefile(filename..".tex") - local elapsed = table.load(file.nameonly(filename)..".lua") - local elapsedjit = table.load(file.nameonly(filename).."-jit.lua") - if elapsed and elapsedjit then - context.testpage { 6 } - context.starttabulate { "|l|l|lp|" } - context.HL() - context.NC() context.formatted.rlap("\\bf %s",elapsed.title) - context.NC() - context.NC() - context.NC() context.NR() - context.HL() - local times = elapsed.times - local timesjit = elapsedjit.times - for j=1,#times do - local t = times[j] - local tjit = timesjit[j] - context.NC() context(t.bodyfont) - context.NC() context(t.elapsed) - context.NC() context(tjit.elapsed) - context.NC() context.NR() - end - context.HL() - context.stoptabulate() - end - end - - function document.SampleTitle(filename) - local elapsed = table.load(filename..".lua") - if elapsed then - context(elapsed.title) - end - end -\stopluacode - -\appendtoks - \ctxlua{document.SaveSample()}% -\to \everystoptext - -\def\SampleCount{1000} -\def\SampleCount{100} - -\unexpanded\def\RegisterSample#1% - {\ctxlua{document.RegisterSample("#1","\elapsedtime")}} - -\unexpanded\def\ProcessSample#1% - {\page - \ctxlua{document.ResetSample("#1")}% - \resettimer \Sample {modern} \RegisterSample {modern} - \resettimer \Sample {pagella} \RegisterSample {pagella} - \resettimer \Sample {termes} \RegisterSample {termes} - \resettimer \Sample {cambria} \RegisterSample {cambria} - \resettimer \Sample {dejavu} \RegisterSample {dejavu} - \resettimer \Sample {ebgaramond} \RegisterSample {ebgaramond} - \resettimer \Sample {lucidaot} \RegisterSample {lucidaot} - \page } - -\unexpanded\def\ProcessBaselineSample#1% - {\page - \ctxlua{document.ResetSample("#1")}% - \resettimer \Sample {baseline} \RegisterSample {baseline} - \page } - -\unexpanded\def\Sample#1% - {\setupbodyfont[#1]} - -\unexpanded\def\ShowSample#1% - {\ctxlua{document.ShowSample("#1")}} - -\unexpanded\def\SampleTitle#1% - {\ctxlua{document.SampleTitle("#1.lua")}} - -\continueifinputfile{onandon-speed-000.tex} - -\starttext - -\ProcessSample{bodyfont} - -\setbox\scratchbox\vbox{\hsize1pt\tttf\sapolsky} \getnoflines{\htdp\scratchbox} - -\writestatus{!!!!!!}{noflines : \the\noflines} - -\stoptext - -% \stopenvironment diff --git a/doc/context/sources/general/manuals/onandon/onandon-speed-001.tex b/doc/context/sources/general/manuals/onandon/onandon-speed-001.tex deleted file mode 100644 index b6c241752..000000000 --- a/doc/context/sources/general/manuals/onandon/onandon-speed-001.tex +++ /dev/null @@ -1,15 +0,0 @@ -\environment onandon-speed-000 - -\ProcessSample{bodyfont} \setupbodyfont[dejavu] - -\starttext - -\def\Sample#1% - {\start - \switchtobodyfont[#1] - \setbox\scratchbox\hbox{\tf\bf\it\bi}% - \stop} - -\ProcessSample{bodyfont switch and 4 style changes (first time)} - -\stoptext diff --git a/doc/context/sources/general/manuals/onandon/onandon-speed-002.tex b/doc/context/sources/general/manuals/onandon/onandon-speed-002.tex deleted file mode 100644 index edd6dd0f7..000000000 --- a/doc/context/sources/general/manuals/onandon/onandon-speed-002.tex +++ /dev/null @@ -1,16 +0,0 @@ -\environment onandon-speed-000 - -\ProcessSample{bodyfont} \setupbodyfont[dejavu] - -\starttext - -\def\Sample#1% - {\start - \switchtobodyfont[#1] - \setbox\scratchbox\hbox{\tf\bf\it\bi}% - \stop} - -\ProcessSample{bodyfont switch and 4 style changes (first time)} -\ProcessSample{bodyfont switch and 4 style changes (follow up)} - -\stoptext diff --git a/doc/context/sources/general/manuals/onandon/onandon-speed-003.tex b/doc/context/sources/general/manuals/onandon/onandon-speed-003.tex deleted file mode 100644 index 4362ccb4f..000000000 --- a/doc/context/sources/general/manuals/onandon/onandon-speed-003.tex +++ /dev/null @@ -1,15 +0,0 @@ -\environment onandon-speed-000 - -\ProcessSample{bodyfont} \setupbodyfont[dejavu] - -\starttext - -\def\Sample#1% - {\start - \switchtobodyfont[#1] - \dorecurse\SampleCount{\setbox\scratchbox\hbox{\sapolsky\space\sapolsky\space\sapolsky\space\sapolsky}}% - \stop} - -\ProcessSample{\SampleCount\space hboxes with 4 texts using one font} - -\stoptext diff --git a/doc/context/sources/general/manuals/onandon/onandon-speed-005.tex b/doc/context/sources/general/manuals/onandon/onandon-speed-005.tex deleted file mode 100644 index 7aeb53b4b..000000000 --- a/doc/context/sources/general/manuals/onandon/onandon-speed-005.tex +++ /dev/null @@ -1,17 +0,0 @@ -\environment onandon-speed-000 - -\ProcessSample{bodyfont} \setupbodyfont[dejavu] - -\starttext - -\def\Sample#1% - {\start - \switchtobodyfont[#1] - \dorecurse\SampleCount{\sapolsky\space\sapolsky\space\sapolsky\space\sapolsky\par}% - \stop} - -\startlayout[page] - \ProcessSample{\SampleCount\space times 4 texts on pages} -\stoplayout - -\stoptext diff --git a/doc/context/sources/general/manuals/onandon/onandon-speed-006.tex b/doc/context/sources/general/manuals/onandon/onandon-speed-006.tex deleted file mode 100644 index d15ef428e..000000000 --- a/doc/context/sources/general/manuals/onandon/onandon-speed-006.tex +++ /dev/null @@ -1,17 +0,0 @@ -\environment onandon-speed-000 - -\ProcessSample{bodyfont} \setupbodyfont[dejavu] - -\starttext - -\def\Sample#1% - {\start - \switchtobodyfont[#1] - \dorecurse\SampleCount{\tf\sapolsky\space\bf\sapolsky\space\it\sapolsky\space\bi\sapolsky\space\par}% - \stop} - -\startlayout[page] - \ProcessSample{\SampleCount\space times 4 texts on pages using 4 styles} -\stoplayout - -\stoptext diff --git a/doc/context/sources/general/manuals/onandon/onandon-speed-007.tex b/doc/context/sources/general/manuals/onandon/onandon-speed-007.tex deleted file mode 100644 index 7a4eed497..000000000 --- a/doc/context/sources/general/manuals/onandon/onandon-speed-007.tex +++ /dev/null @@ -1,31 +0,0 @@ -\environment onandon-speed-000 - -\ProcessSample{bodyfont} \setupbodyfont[dejavu] - -\starttext - -\def\sapolsky{% - Agriculture is a fairly recent human invention, and in many ways it was one of - the great {\bf stupid} moves of all time. Hunter|-|gatherers have thousands of wild - sources of food to subsist on. Agriculture changed that all, generating an - overwhelming reliance on a few dozen domesticated food sources, making you - extremely vulnerable to the next famine, the next locust infestation, the next - potato blight. Agriculture allowed for stockpiling of surplus resources and thus, - {\bf inevitably}, the unequal stockpiling of them --- stratification of society and - the invention of classes. Thus, it allowed for the invention of poverty. I think - that the punch line of the primate|-|human difference is that when humans - invented poverty, they came up with a way of subjugating the low|-|ranking like - {\bf nothing ever seen before} in the primate world. -}% - -\def\Sample#1% - {\start - \switchtobodyfont[#1] - \dorecurse\SampleCount{\sapolsky\par}% - \stop} - -\startlayout[page] - \ProcessSample{\SampleCount\space texts on pages with [1,2,4] bold font switches} -\stoplayout - -\stoptext diff --git a/doc/context/sources/general/manuals/onandon/onandon-speed-008.tex b/doc/context/sources/general/manuals/onandon/onandon-speed-008.tex deleted file mode 100644 index ae968bc10..000000000 --- a/doc/context/sources/general/manuals/onandon/onandon-speed-008.tex +++ /dev/null @@ -1,32 +0,0 @@ -\environment onandon-speed-000 - -\ProcessSample{bodyfont} \setupbodyfont[dejavu] - -\starttext - -\def\sapolsky{% - Agriculture is a fairly recent human invention, and in many ways it was one - of the great \type {stupid} moves of all time. Hunter|-|gatherers have - thousands of wild sources of food to subsist on. Agriculture changed that - all, generating an overwhelming reliance on a few dozen domesticated food - sources, making you extremely vulnerable to the next famine, the next locust - infestation, the next potato blight. Agriculture allowed for stockpiling of - surplus resources and thus, \type {inevitably}, the unequal stockpiling of - them --- stratification of society and the invention of classes. Thus, it - allowed for the invention of poverty. I think that the punch line of the - primate|-|human difference is that when humans invented poverty, they came up - with a way of subjugating the low|-|ranking like \type {nothing ever seen - before} in the primate world. -}% - -\def\Sample#1% - {\start - \switchtobodyfont[#1] - \dorecurse\SampleCount{\sapolsky\par}% - \stop} - -\startlayout[page] - \ProcessSample{\SampleCount\space texts on pages with [1,2,4] word verbatim switches} -\stoplayout - -\stoptext diff --git a/doc/context/sources/general/manuals/onandon/onandon-speed-009.tex b/doc/context/sources/general/manuals/onandon/onandon-speed-009.tex deleted file mode 100644 index 61116e652..000000000 --- a/doc/context/sources/general/manuals/onandon/onandon-speed-009.tex +++ /dev/null @@ -1,15 +0,0 @@ -\environment onandon-speed-000 - -\ProcessSample{bodyfont} \setupbodyfont[dejavu] - -\starttext - -\def\Sample#1% - {\start - \infofont - \dorecurse\SampleCount{\setbox\scratchbox\hpack{\sapolsky\space\sapolsky\space\sapolsky\space\sapolsky}}% - \stop} - -\ProcessBaselineSample{\SampleCount\space hboxes with 4 texts and no font handling} - -\stoptext diff --git a/doc/context/sources/general/manuals/onandon/onandon-speed-010.tex b/doc/context/sources/general/manuals/onandon/onandon-speed-010.tex deleted file mode 100644 index 673c2b1e5..000000000 --- a/doc/context/sources/general/manuals/onandon/onandon-speed-010.tex +++ /dev/null @@ -1,15 +0,0 @@ -\environment onandon-speed-000 - -\ProcessSample{bodyfont} \setupbodyfont[dejavu] - -\starttext - -\def\Sample#1% - {\start - \infofont - \dorecurse\SampleCount{\setbox\scratchbox\hbox{\sapolsky\space\sapolsky\space\sapolsky\space\sapolsky}}% - \stop} - -\ProcessBaselineSample{\SampleCount\space hboxes with 4 texts and no features} - -\stoptext diff --git a/doc/context/sources/general/manuals/onandon/onandon-speed-011.tex b/doc/context/sources/general/manuals/onandon/onandon-speed-011.tex deleted file mode 100644 index 90d924c00..000000000 --- a/doc/context/sources/general/manuals/onandon/onandon-speed-011.tex +++ /dev/null @@ -1,20 +0,0 @@ -\environment onandon-speed-000 - -\ProcessSample{bodyfont} \setupbodyfont[dejavu] - -\dontcomplain - -\starttext - -\def\Sample#1% - {\start - \tttf\tx - \dorecurse\SampleCount{\sapolsky\space\sapolsky\space\sapolsky\space\sapolsky\par}% - \stop} - -\startlayout[page] - \ProcessBaselineSample {\SampleCount\space paragraphs with 4 texts and no features} -\stoplayout - - -\stoptext diff --git a/doc/context/sources/general/manuals/onandon/onandon-speed-012.tex b/doc/context/sources/general/manuals/onandon/onandon-speed-012.tex deleted file mode 100644 index e2d51e195..000000000 --- a/doc/context/sources/general/manuals/onandon/onandon-speed-012.tex +++ /dev/null @@ -1,20 +0,0 @@ -\environment onandon-speed-000 - -\ProcessSample{bodyfont} \setupbodyfont[dejavu] - -\dontcomplain - -\starttext - -\def\SampleCount{1000} - -\def\Sample#1% - {\start -% \switchtobodyfont[#1] - \dorecurse\SampleCount{\sapolsky\par} - \stop} - -% \ProcessSample{\SampleCount\space pages no features} -\ProcessBaselineSample{\SampleCount\space paragraphs text} - -\stoptext diff --git a/doc/context/sources/general/manuals/onandon/onandon.tex b/doc/context/sources/general/manuals/onandon/onandon.tex index 2352907fc..00b01f9ae 100644 --- a/doc/context/sources/general/manuals/onandon/onandon.tex +++ b/doc/context/sources/general/manuals/onandon/onandon.tex @@ -34,42 +34,19 @@ \startbodymatter \component onandon-decade - \component onandon-ffi - - % \startchapter[title=Variable fonts] First published in user group magazines. \stopchapter - \component onandon-variable - + \component onandon-variable % first published in user group magazines \component onandon-emoji - - \startchapter[title={Children of \TEX}] First published in user group magazines. \stopchapter - % \component onandon-children - \component onandon-performance - \component onandon-editing - - \startchapter[title={Advertising \TEX}] First published in user group magazines. \stopchapter - % \component onandon-perception - - \startchapter[title={Tricky fences}] First published in user group magazines. \stopchapter - % \component onandon-fences - - % \component onandon-media - - \startchapter[title={From 5.2 to 5.3}] First published in user group magazines. \stopchapter - % \component onandon-53 - - \startchapter[title={Executing \TEX}] First published in user group magazines. \stopchapter - % \component onandon-execute - + \component onandon-fences % first published in user group magazines + \component onandon-media + \component onandon-53 % first published in user group magazines + \component onandon-execute % first published in user group magazines \component onandon-modern - - \startchapter[title={More expansion}] Maybe first published in user group magazines. \stopchapter - % \component onandon-expansion - - \component onandon-110 + \component onandon-expansion \component onandon-runtoks + \component onandon-110 \stopbodymatter \stopproduct diff --git a/tex/context/base/mkii/cont-new.mkii b/tex/context/base/mkii/cont-new.mkii index 26e92909a..ce3ef17ee 100644 --- a/tex/context/base/mkii/cont-new.mkii +++ b/tex/context/base/mkii/cont-new.mkii @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2018.07.18 17:33} +\newcontextversion{2018.07.20 21:20} %D This file is loaded at runtime, thereby providing an %D excellent place for hacks, patches, extensions and new diff --git a/tex/context/base/mkii/context.mkii b/tex/context/base/mkii/context.mkii index 0ce44438c..ba5135d80 100644 --- a/tex/context/base/mkii/context.mkii +++ b/tex/context/base/mkii/context.mkii @@ -20,7 +20,7 @@ %D your styles an modules. \edef\contextformat {\jobname} -\edef\contextversion{2018.07.18 17:33} +\edef\contextversion{2018.07.20 21:20} %D For those who want to use this: diff --git a/tex/context/base/mkiv/char-def.lua b/tex/context/base/mkiv/char-def.lua index fcbf01900..8f2583afe 100644 --- a/tex/context/base/mkiv/char-def.lua +++ b/tex/context/base/mkiv/char-def.lua @@ -14164,6 +14164,13 @@ characters.data={ synonyms={ "armenian patiw" }, unicodeslot=0x55F, }, + [0x560]={ + category="ll", + description="ARMENIAN SMALL LETTER TURNED AYB", + direction="l", + linebreak="al", + unicodeslot=0x560, + }, [0x561]={ adobename="aybarmenian", category="ll", @@ -14515,6 +14522,13 @@ characters.data={ specials={ "compat", 0x565, 0x582 }, unicodeslot=0x587, }, + [0x588]={ + category="ll", + description="ARMENIAN SMALL LETTER YI WITH STROKE", + direction="l", + linebreak="al", + unicodeslot=0x588, + }, [0x589]={ adobename="periodarmenian", category="po", @@ -15283,6 +15297,13 @@ characters.data={ linebreak="hl", unicodeslot=0x5EA, }, + [0x5EF]={ + category="lo", + description="HEBREW YOD TRIANGLE", + direction="r", + linebreak="hl", + unicodeslot=0x5EF, + }, [0x5F0]={ adobename="vavvavhebrew", category="lo", @@ -17638,6 +17659,7 @@ characters.data={ unicodeslot=0x70D, }, [0x70F]={ + arabic="t", category="cf", description="SYRIAC ABBREVIATION MARK", direction="al", @@ -19362,6 +19384,28 @@ characters.data={ linebreak="al", unicodeslot=0x7FA, }, + [0x7FD]={ + category="mn", + combining=0xDC, + description="NKO DANTAYALAN", + direction="nsm", + linebreak="cm", + unicodeslot=0x7FD, + }, + [0x7FE]={ + category="sc", + description="NKO DOROME SIGN", + direction="r", + linebreak="pr", + unicodeslot=0x7FE, + }, + [0x7FF]={ + category="sc", + description="NKO TAMAN SIGN", + direction="r", + linebreak="pr", + unicodeslot=0x7FF, + }, [0x800]={ category="lo", description="SAMARITAN LETTER ALAF", @@ -20361,6 +20405,14 @@ characters.data={ linebreak="al", unicodeslot=0x8BD, }, + [0x8D3]={ + category="mn", + combining=0xDC, + description="ARABIC SMALL LOW WAW", + direction="nsm", + linebreak="cm", + unicodeslot=0x8D3, + }, [0x8D4]={ category="mn", combining=0xE6, @@ -21284,8 +21336,8 @@ characters.data={ description="DEVANAGARI SIGN NUKTA", direction="nsm", indic="o", - indicmark="b", indicclass="nukta", + indicmark="b", linebreak="cm", unicodeslot=0x93C, }, @@ -21522,8 +21574,8 @@ characters.data={ description="DEVANAGARI STRESS SIGN ANUDATTA", direction="nsm", indic="s", - indicmark="b", indicclass="anudatta", + indicmark="b", linebreak="cm", unicodeslot=0x952, }, @@ -22376,8 +22428,8 @@ characters.data={ description="BENGALI SIGN NUKTA", direction="nsm", indic="o", - indicmark="b", indicclass="nukta", + indicmark="b", linebreak="cm", unicodeslot=0x9BC, }, @@ -22823,6 +22875,14 @@ characters.data={ linebreak="al", unicodeslot=0x9FD, }, + [0x9FE]={ + category="mn", + combining=0xE6, + description="BENGALI SANDHI MARK", + direction="nsm", + linebreak="cm", + unicodeslot=0x9FE, + }, [0xA01]={ category="mn", description="GURMUKHI SIGN ADAK BINDI", @@ -23247,8 +23307,8 @@ characters.data={ description="GURMUKHI SIGN NUKTA", direction="nsm", indic="o", - indicmark="b", indicclass="nukta", + indicmark="b", linebreak="cm", unicodeslot=0xA3C, }, @@ -23565,6 +23625,13 @@ characters.data={ linebreak="cm", unicodeslot=0xA75, }, + [0xA76]={ + category="po", + description="GURMUKHI ABBREVIATION SIGN", + direction="l", + linebreak="al", + unicodeslot=0xA76, + }, [0xA81]={ adobename="candrabindugujarati", category="mn", @@ -24032,8 +24099,8 @@ characters.data={ description="GUJARATI SIGN NUKTA", direction="nsm", indic="o", - indicmark="b", indicclass="nukta", + indicmark="b", linebreak="cm", unicodeslot=0xABC, }, @@ -24807,8 +24874,8 @@ characters.data={ description="ORIYA SIGN NUKTA", direction="nsm", indic="o", - indicmark="b", indicclass="nukta", + indicmark="b", linebreak="cm", unicodeslot=0xB3C, }, @@ -25809,6 +25876,13 @@ characters.data={ linebreak="cm", unicodeslot=0xC03, }, + [0xC04]={ + category="mn", + description="TELUGU SIGN COMBINING ANUSVARA ABOVE", + direction="nsm", + linebreak="cm", + unicodeslot=0xC04, + }, [0xC05]={ category="lo", description="TELUGU LETTER A", @@ -26175,9 +26249,9 @@ characters.data={ category="lo", description="TELUGU LETTER VA", direction="l", + indic="c", linebreak="al", unicodeslot=0xC35, - indic="c", }, [0xC36]={ category="lo", @@ -26614,6 +26688,13 @@ characters.data={ linebreak="cm", unicodeslot=0xC83, }, + [0xC84]={ + category="po", + description="KANNADA SIGN SIDDHAM", + direction="l", + linebreak="bb", + unicodeslot=0xC84, + }, [0xC85]={ category="lo", description="KANNADA LETTER A", @@ -27014,8 +27095,8 @@ characters.data={ description="KANNADA SIGN NUKTA", direction="nsm", indic="o", - indicmark="b", indicclass="nukta", + indicmark="b", linebreak="cm", unicodeslot=0xCBC, }, @@ -46377,6 +46458,14 @@ characters.data={ linebreak="al", unicodeslot=0x1877, }, + [0x1878]={ + arabic="d", + category="lo", + description="MONGOLIAN LETTER CHA WITH TWO DOTS", + direction="l", + linebreak="al", + unicodeslot=0x1878, + }, [0x1880]={ arabic="u", category="lo", @@ -52619,6 +52708,328 @@ characters.data={ linebreak="al", unicodeslot=0x1C88, }, + [0x1C90]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER AN", + direction="l", + linebreak="al", + unicodeslot=0x1C90, + }, + [0x1C91]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER BAN", + direction="l", + linebreak="al", + unicodeslot=0x1C91, + }, + [0x1C92]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER GAN", + direction="l", + linebreak="al", + unicodeslot=0x1C92, + }, + [0x1C93]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER DON", + direction="l", + linebreak="al", + unicodeslot=0x1C93, + }, + [0x1C94]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER EN", + direction="l", + linebreak="al", + unicodeslot=0x1C94, + }, + [0x1C95]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER VIN", + direction="l", + linebreak="al", + unicodeslot=0x1C95, + }, + [0x1C96]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER ZEN", + direction="l", + linebreak="al", + unicodeslot=0x1C96, + }, + [0x1C97]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER TAN", + direction="l", + linebreak="al", + unicodeslot=0x1C97, + }, + [0x1C98]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER IN", + direction="l", + linebreak="al", + unicodeslot=0x1C98, + }, + [0x1C99]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER KAN", + direction="l", + linebreak="al", + unicodeslot=0x1C99, + }, + [0x1C9A]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER LAS", + direction="l", + linebreak="al", + unicodeslot=0x1C9A, + }, + [0x1C9B]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER MAN", + direction="l", + linebreak="al", + unicodeslot=0x1C9B, + }, + [0x1C9C]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER NAR", + direction="l", + linebreak="al", + unicodeslot=0x1C9C, + }, + [0x1C9D]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER ON", + direction="l", + linebreak="al", + unicodeslot=0x1C9D, + }, + [0x1C9E]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER PAR", + direction="l", + linebreak="al", + unicodeslot=0x1C9E, + }, + [0x1C9F]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER ZHAR", + direction="l", + linebreak="al", + unicodeslot=0x1C9F, + }, + [0x1CA0]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER RAE", + direction="l", + linebreak="al", + unicodeslot=0x1CA0, + }, + [0x1CA1]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER SAN", + direction="l", + linebreak="al", + unicodeslot=0x1CA1, + }, + [0x1CA2]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER TAR", + direction="l", + linebreak="al", + unicodeslot=0x1CA2, + }, + [0x1CA3]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER UN", + direction="l", + linebreak="al", + unicodeslot=0x1CA3, + }, + [0x1CA4]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER PHAR", + direction="l", + linebreak="al", + unicodeslot=0x1CA4, + }, + [0x1CA5]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER KHAR", + direction="l", + linebreak="al", + unicodeslot=0x1CA5, + }, + [0x1CA6]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER GHAN", + direction="l", + linebreak="al", + unicodeslot=0x1CA6, + }, + [0x1CA7]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER QAR", + direction="l", + linebreak="al", + unicodeslot=0x1CA7, + }, + [0x1CA8]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER SHIN", + direction="l", + linebreak="al", + unicodeslot=0x1CA8, + }, + [0x1CA9]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER CHIN", + direction="l", + linebreak="al", + unicodeslot=0x1CA9, + }, + [0x1CAA]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER CAN", + direction="l", + linebreak="al", + unicodeslot=0x1CAA, + }, + [0x1CAB]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER JIL", + direction="l", + linebreak="al", + unicodeslot=0x1CAB, + }, + [0x1CAC]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER CIL", + direction="l", + linebreak="al", + unicodeslot=0x1CAC, + }, + [0x1CAD]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER CHAR", + direction="l", + linebreak="al", + unicodeslot=0x1CAD, + }, + [0x1CAE]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER XAN", + direction="l", + linebreak="al", + unicodeslot=0x1CAE, + }, + [0x1CAF]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER JHAN", + direction="l", + linebreak="al", + unicodeslot=0x1CAF, + }, + [0x1CB0]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER HAE", + direction="l", + linebreak="al", + unicodeslot=0x1CB0, + }, + [0x1CB1]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER HE", + direction="l", + linebreak="al", + unicodeslot=0x1CB1, + }, + [0x1CB2]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER HIE", + direction="l", + linebreak="al", + unicodeslot=0x1CB2, + }, + [0x1CB3]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER WE", + direction="l", + linebreak="al", + unicodeslot=0x1CB3, + }, + [0x1CB4]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER HAR", + direction="l", + linebreak="al", + unicodeslot=0x1CB4, + }, + [0x1CB5]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER HOE", + direction="l", + linebreak="al", + unicodeslot=0x1CB5, + }, + [0x1CB6]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER FI", + direction="l", + linebreak="al", + unicodeslot=0x1CB6, + }, + [0x1CB7]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER YN", + direction="l", + linebreak="al", + unicodeslot=0x1CB7, + }, + [0x1CB8]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER ELIFI", + direction="l", + linebreak="al", + unicodeslot=0x1CB8, + }, + [0x1CB9]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN", + direction="l", + linebreak="al", + unicodeslot=0x1CB9, + }, + [0x1CBA]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER AIN", + direction="l", + linebreak="al", + unicodeslot=0x1CBA, + }, + [0x1CBD]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER AEN", + direction="l", + linebreak="al", + unicodeslot=0x1CBD, + }, + [0x1CBE]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN", + direction="l", + linebreak="al", + unicodeslot=0x1CBE, + }, + [0x1CBF]={ + category="lu", + description="GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN", + direction="l", + linebreak="al", + unicodeslot=0x1CBF, + }, [0x1CC0]={ category="po", description="SUNDANESE PUNCTUATION BINDU SURYA", @@ -65371,6 +65782,7 @@ characters.data={ linebreak="ai", mathclass="ordinary", mathname="rightangle", + mirror=0x2BFE, unicodeslot=0x221F, }, [0x2220]={ @@ -65382,6 +65794,7 @@ characters.data={ linebreak="ai", mathclass="ordinary", mathname="angle", + mirror=0x29A3, unicodeslot=0x2220, }, [0x2221]={ @@ -65391,6 +65804,7 @@ characters.data={ linebreak="al", mathclass="ordinary", mathname="measuredangle", + mirror=0x299B, unicodeslot=0x2221, }, [0x2222]={ @@ -65400,6 +65814,7 @@ characters.data={ linebreak="al", mathclass="ordinary", mathname="sphericalangle", + mirror=0x29A0, synonyms={ "angle arc" }, unicodeslot=0x2222, }, @@ -65430,6 +65845,7 @@ characters.data={ name="nmid", }, }, + mirror=0x2AEE, specials={ "char", 0x2223, 0x338 }, unicodeslot=0x2224, }, @@ -65834,6 +66250,7 @@ characters.data={ name="cong", }, }, + mirror=0x224C, unicodeslot=0x2245, }, [0x2246]={ @@ -65909,6 +66326,7 @@ characters.data={ direction="on", linebreak="ai", mathclass="relation", + mirror=0x2245, unicodeslot=0x224C, }, [0x224D]={ @@ -67110,6 +67528,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="multimap", + mirror=0x27DC, unicodeslot=0x22B8, }, [0x22B9]={ @@ -73450,8 +73869,8 @@ characters.data={ }, [0x25CC]={ adobename="dottedcircle", - contextname="dottedcircle", category="so", + contextname="dottedcircle", description="DOTTED CIRCLE", direction="on", linebreak="al", @@ -77559,6 +77978,7 @@ characters.data={ description="LEFT MULTIMAP", direction="on", linebreak="al", + mirror=0x22B8, unicodeslot=0x27DC, }, [0x27DD]={ @@ -80944,6 +81364,7 @@ characters.data={ description="MEASURED ANGLE OPENING LEFT", direction="on", linebreak="al", + mirror=0x2221, unicodeslot=0x299B, }, [0x299C]={ @@ -80979,6 +81400,7 @@ characters.data={ description="SPHERICAL ANGLE OPENING LEFT", direction="on", linebreak="al", + mirror=0x2222, unicodeslot=0x29A0, }, [0x29A1]={ @@ -81000,6 +81422,7 @@ characters.data={ description="REVERSED ANGLE", direction="on", linebreak="al", + mirror=0x2220, unicodeslot=0x29A3, }, [0x29A4]={ @@ -81007,6 +81430,7 @@ characters.data={ description="ANGLE WITH UNDERBAR", direction="on", linebreak="al", + mirror=0x29A5, unicodeslot=0x29A4, }, [0x29A5]={ @@ -81014,6 +81438,7 @@ characters.data={ description="REVERSED ANGLE WITH UNDERBAR", direction="on", linebreak="al", + mirror=0x29A4, unicodeslot=0x29A5, }, [0x29A6]={ @@ -81035,6 +81460,7 @@ characters.data={ description="MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT", direction="on", linebreak="al", + mirror=0x29A9, unicodeslot=0x29A8, }, [0x29A9]={ @@ -81042,6 +81468,7 @@ characters.data={ description="MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT", direction="on", linebreak="al", + mirror=0x29A8, unicodeslot=0x29A9, }, [0x29AA]={ @@ -81049,6 +81476,7 @@ characters.data={ description="MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT", direction="on", linebreak="al", + mirror=0x29AB, unicodeslot=0x29AA, }, [0x29AB]={ @@ -81056,6 +81484,7 @@ characters.data={ description="MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT", direction="on", linebreak="al", + mirror=0x29AA, unicodeslot=0x29AB, }, [0x29AC]={ @@ -81063,6 +81492,7 @@ characters.data={ description="MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP", direction="on", linebreak="al", + mirror=0x29AD, unicodeslot=0x29AC, }, [0x29AD]={ @@ -81070,6 +81500,7 @@ characters.data={ description="MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP", direction="on", linebreak="al", + mirror=0x29AC, unicodeslot=0x29AD, }, [0x29AE]={ @@ -81077,6 +81508,7 @@ characters.data={ description="MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN", direction="on", linebreak="al", + mirror=0x29AF, unicodeslot=0x29AE, }, [0x29AF]={ @@ -81084,6 +81516,7 @@ characters.data={ description="MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN", direction="on", linebreak="al", + mirror=0x29AE, unicodeslot=0x29AF, }, [0x29B0]={ @@ -81502,6 +81935,7 @@ characters.data={ description="DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK", direction="on", linebreak="al", + mirror=0x29E9, unicodeslot=0x29E8, }, [0x29E9]={ @@ -81509,6 +81943,7 @@ characters.data={ description="DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK", direction="on", linebreak="al", + mirror=0x29E8, unicodeslot=0x29E9, }, [0x29EA]={ @@ -82608,6 +83043,7 @@ characters.data={ description="LESS-THAN WITH QUESTION MARK ABOVE", direction="on", linebreak="al", + mirror=0x2A7C, unicodeslot=0x2A7B, }, [0x2A7C]={ @@ -82615,6 +83051,7 @@ characters.data={ description="GREATER-THAN WITH QUESTION MARK ABOVE", direction="on", linebreak="al", + mirror=0x2A7B, unicodeslot=0x2A7C, }, [0x2A7D]={ @@ -82692,6 +83129,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="lessapprox", + mirror=0x2A86, unicodeslot=0x2A85, }, [0x2A86]={ @@ -82701,6 +83139,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="gtrapprox", + mirror=0x2A85, unicodeslot=0x2A86, }, [0x2A87]={ @@ -82710,6 +83149,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="lneq", + mirror=0x2A88, unicodeslot=0x2A87, }, [0x2A88]={ @@ -82719,6 +83159,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="rneq", + mirror=0x2A87, unicodeslot=0x2A88, }, [0x2A89]={ @@ -82728,6 +83169,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="lnapprox", + mirror=0x2A8A, unicodeslot=0x2A89, }, [0x2A8A]={ @@ -82737,6 +83179,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="gnapprox", + mirror=0x2A89, unicodeslot=0x2A8A, }, [0x2A8B]={ @@ -82766,6 +83209,7 @@ characters.data={ description="LESS-THAN ABOVE SIMILAR OR EQUAL", direction="on", linebreak="al", + mirror=0x2A8E, unicodeslot=0x2A8D, }, [0x2A8E]={ @@ -82773,6 +83217,7 @@ characters.data={ description="GREATER-THAN ABOVE SIMILAR OR EQUAL", direction="on", linebreak="al", + mirror=0x2A8D, unicodeslot=0x2A8E, }, [0x2A8F]={ @@ -82780,6 +83225,7 @@ characters.data={ description="LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN", direction="on", linebreak="al", + mirror=0x2A90, unicodeslot=0x2A8F, }, [0x2A90]={ @@ -82787,6 +83233,7 @@ characters.data={ description="GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN", direction="on", linebreak="al", + mirror=0x2A8F, unicodeslot=0x2A90, }, [0x2A91]={ @@ -82894,6 +83341,7 @@ characters.data={ description="SIMILAR OR LESS-THAN", direction="on", linebreak="al", + mirror=0x2A9E, unicodeslot=0x2A9D, variants={ [0xFE00]="with similar following the slant of the upper leg", @@ -82904,6 +83352,7 @@ characters.data={ description="SIMILAR OR GREATER-THAN", direction="on", linebreak="al", + mirror=0x2A9D, unicodeslot=0x2A9E, variants={ [0xFE00]="with similar following the slant of the upper leg", @@ -82914,6 +83363,7 @@ characters.data={ description="SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN", direction="on", linebreak="al", + mirror=0x2AA0, unicodeslot=0x2A9F, }, [0x2AA0]={ @@ -82921,6 +83371,7 @@ characters.data={ description="SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN", direction="on", linebreak="al", + mirror=0x2A9F, unicodeslot=0x2AA0, }, [0x2AA1]={ @@ -83065,6 +83516,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="precneq", + mirror=0x2AB2, unicodeslot=0x2AB1, }, [0x2AB2]={ @@ -83074,6 +83526,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="succneq", + mirror=0x2AB1, unicodeslot=0x2AB2, }, [0x2AB3]={ @@ -83103,6 +83556,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="precneqq", + mirror=0x2AB6, unicodeslot=0x2AB5, }, [0x2AB6]={ @@ -83112,6 +83566,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="succneqq", + mirror=0x2AB5, unicodeslot=0x2AB6, }, [0x2AB7]={ @@ -83121,6 +83576,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="precapprox", + mirror=0x2AB8, unicodeslot=0x2AB7, }, [0x2AB8]={ @@ -83130,6 +83586,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="succapprox", + mirror=0x2AB7, unicodeslot=0x2AB8, }, [0x2AB9]={ @@ -83139,6 +83596,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="precnapprox", + mirror=0x2ABA, unicodeslot=0x2AB9, }, [0x2ABA]={ @@ -83148,6 +83606,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="succnapprox", + mirror=0x2AB9, unicodeslot=0x2ABA, }, [0x2ABB]={ @@ -83255,6 +83714,7 @@ characters.data={ description="SUBSET OF ABOVE TILDE OPERATOR", direction="on", linebreak="al", + mirror=0x2AC8, unicodeslot=0x2AC7, }, [0x2AC8]={ @@ -83262,6 +83722,7 @@ characters.data={ description="SUPERSET OF ABOVE TILDE OPERATOR", direction="on", linebreak="al", + mirror=0x2AC7, unicodeslot=0x2AC8, }, [0x2AC9]={ @@ -83269,6 +83730,7 @@ characters.data={ description="SUBSET OF ABOVE ALMOST EQUAL TO", direction="on", linebreak="al", + mirror=0x2ACA, unicodeslot=0x2AC9, }, [0x2ACA]={ @@ -83276,6 +83738,7 @@ characters.data={ description="SUPERSET OF ABOVE ALMOST EQUAL TO", direction="on", linebreak="al", + mirror=0x2AC9, unicodeslot=0x2ACA, }, [0x2ACB]={ @@ -83285,6 +83748,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="subsetneqq", + mirror=0x2ACC, unicodeslot=0x2ACB, variants={ [0xFE00]="with stroke through bottom members", @@ -83297,6 +83761,7 @@ characters.data={ linebreak="al", mathclass="relation", mathname="supsetneqq", + mirror=0x2ACB, unicodeslot=0x2ACC, variants={ [0xFE00]="with stroke through bottom members", @@ -83559,6 +84024,7 @@ characters.data={ description="DOES NOT DIVIDE WITH REVERSED NEGATION SLASH", direction="on", linebreak="al", + mirror=0x2224, unicodeslot=0x2AEE, }, [0x2AEF]={ @@ -84998,6 +85464,27 @@ characters.data={ synonyms={ "escape" }, unicodeslot=0x2BB9, }, + [0x2BBA]={ + category="so", + description="OVERLAPPING WHITE SQUARES", + direction="on", + linebreak="al", + unicodeslot=0x2BBA, + }, + [0x2BBB]={ + category="so", + description="OVERLAPPING WHITE AND BLACK SQUARES", + direction="on", + linebreak="al", + unicodeslot=0x2BBB, + }, + [0x2BBC]={ + category="so", + description="OVERLAPPING BLACK SQUARES", + direction="on", + linebreak="al", + unicodeslot=0x2BBC, + }, [0x2BBD]={ category="so", description="BALLOT BOX WITH LIGHT X", @@ -85145,6 +85632,181 @@ characters.data={ linebreak="al", unicodeslot=0x2BD2, }, + [0x2BD3]={ + category="so", + description="PLUTO FORM TWO", + direction="on", + linebreak="al", + unicodeslot=0x2BD3, + }, + [0x2BD4]={ + category="so", + description="PLUTO FORM THREE", + direction="on", + linebreak="al", + unicodeslot=0x2BD4, + }, + [0x2BD5]={ + category="so", + description="PLUTO FORM FOUR", + direction="on", + linebreak="al", + unicodeslot=0x2BD5, + }, + [0x2BD6]={ + category="so", + description="PLUTO FORM FIVE", + direction="on", + linebreak="al", + unicodeslot=0x2BD6, + }, + [0x2BD7]={ + category="so", + description="TRANSPLUTO", + direction="on", + linebreak="al", + unicodeslot=0x2BD7, + }, + [0x2BD8]={ + category="so", + description="PROSERPINA", + direction="on", + linebreak="al", + unicodeslot=0x2BD8, + }, + [0x2BD9]={ + category="so", + description="ASTRAEA", + direction="on", + linebreak="al", + unicodeslot=0x2BD9, + }, + [0x2BDA]={ + category="so", + description="HYGIEA", + direction="on", + linebreak="al", + unicodeslot=0x2BDA, + }, + [0x2BDB]={ + category="so", + description="PHOLUS", + direction="on", + linebreak="al", + unicodeslot=0x2BDB, + }, + [0x2BDC]={ + category="so", + description="NESSUS", + direction="on", + linebreak="al", + unicodeslot=0x2BDC, + }, + [0x2BDD]={ + category="so", + description="WHITE MOON SELENA", + direction="on", + linebreak="al", + unicodeslot=0x2BDD, + }, + [0x2BDE]={ + category="so", + description="BLACK DIAMOND ON CROSS", + direction="on", + linebreak="al", + unicodeslot=0x2BDE, + }, + [0x2BDF]={ + category="so", + description="TRUE LIGHT MOON ARTA", + direction="on", + linebreak="al", + unicodeslot=0x2BDF, + }, + [0x2BE0]={ + category="so", + description="CUPIDO", + direction="on", + linebreak="al", + unicodeslot=0x2BE0, + }, + [0x2BE1]={ + category="so", + description="HADES", + direction="on", + linebreak="al", + unicodeslot=0x2BE1, + }, + [0x2BE2]={ + category="so", + description="ZEUS", + direction="on", + linebreak="al", + unicodeslot=0x2BE2, + }, + [0x2BE3]={ + category="so", + description="KRONOS", + direction="on", + linebreak="al", + unicodeslot=0x2BE3, + }, + [0x2BE4]={ + category="so", + description="APOLLON", + direction="on", + linebreak="al", + unicodeslot=0x2BE4, + }, + [0x2BE5]={ + category="so", + description="ADMETOS", + direction="on", + linebreak="al", + unicodeslot=0x2BE5, + }, + [0x2BE6]={ + category="so", + description="VULCANUS", + direction="on", + linebreak="al", + unicodeslot=0x2BE6, + }, + [0x2BE7]={ + category="so", + description="POSEIDON", + direction="on", + linebreak="al", + unicodeslot=0x2BE7, + }, + [0x2BE8]={ + category="so", + description="LEFT HALF BLACK STAR", + direction="on", + linebreak="al", + unicodeslot=0x2BE8, + }, + [0x2BE9]={ + category="so", + description="RIGHT HALF BLACK STAR", + direction="on", + linebreak="al", + unicodeslot=0x2BE9, + }, + [0x2BEA]={ + category="so", + description="STAR WITH LEFT HALF BLACK", + direction="on", + linebreak="al", + unicodeslot=0x2BEA, + }, + [0x2BEB]={ + category="so", + description="STAR WITH RIGHT HALF BLACK", + direction="on", + linebreak="al", + unicodeslot=0x2BEB, + }, [0x2BEC]={ category="so", description="LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS", @@ -85173,6 +85835,112 @@ characters.data={ linebreak="al", unicodeslot=0x2BEF, }, + [0x2BF0]={ + category="so", + description="ERIS FORM ONE", + direction="on", + linebreak="al", + unicodeslot=0x2BF0, + }, + [0x2BF1]={ + category="so", + description="ERIS FORM TWO", + direction="on", + linebreak="al", + unicodeslot=0x2BF1, + }, + [0x2BF2]={ + category="so", + description="SEDNA", + direction="on", + linebreak="al", + unicodeslot=0x2BF2, + }, + [0x2BF3]={ + category="so", + description="RUSSIAN ASTROLOGICAL SYMBOL VIGINTILE", + direction="on", + linebreak="al", + unicodeslot=0x2BF3, + }, + [0x2BF4]={ + category="so", + description="RUSSIAN ASTROLOGICAL SYMBOL NOVILE", + direction="on", + linebreak="al", + unicodeslot=0x2BF4, + }, + [0x2BF5]={ + category="so", + description="RUSSIAN ASTROLOGICAL SYMBOL QUINTILE", + direction="on", + linebreak="al", + unicodeslot=0x2BF5, + }, + [0x2BF6]={ + category="so", + description="RUSSIAN ASTROLOGICAL SYMBOL BINOVILE", + direction="on", + linebreak="al", + unicodeslot=0x2BF6, + }, + [0x2BF7]={ + category="so", + description="RUSSIAN ASTROLOGICAL SYMBOL SENTAGON", + direction="on", + linebreak="al", + unicodeslot=0x2BF7, + }, + [0x2BF8]={ + category="so", + description="RUSSIAN ASTROLOGICAL SYMBOL TREDECILE", + direction="on", + linebreak="al", + unicodeslot=0x2BF8, + }, + [0x2BF9]={ + category="so", + description="EQUALS SIGN WITH INFINITY BELOW", + direction="on", + linebreak="al", + unicodeslot=0x2BF9, + }, + [0x2BFA]={ + category="so", + description="UNITED SYMBOL", + direction="on", + linebreak="al", + unicodeslot=0x2BFA, + }, + [0x2BFB]={ + category="so", + description="SEPARATED SYMBOL", + direction="on", + linebreak="al", + unicodeslot=0x2BFB, + }, + [0x2BFC]={ + category="so", + description="DOUBLED SYMBOL", + direction="on", + linebreak="al", + unicodeslot=0x2BFC, + }, + [0x2BFD]={ + category="so", + description="PASSED SYMBOL", + direction="on", + linebreak="al", + unicodeslot=0x2BFD, + }, + [0x2BFE]={ + category="so", + description="REVERSED RIGHT ANGLE", + direction="on", + linebreak="al", + mirror=0x221F, + unicodeslot=0x2BFE, + }, [0x2C00]={ category="lu", description="GLAGOLITIC CAPITAL LETTER AZU", @@ -89226,6 +89994,41 @@ characters.data={ linebreak="ba", unicodeslot=0x2E49, }, + [0x2E4A]={ + category="po", + description="DOTTED SOLIDUS", + direction="on", + linebreak="ba", + unicodeslot=0x2E4A, + }, + [0x2E4B]={ + category="po", + description="TRIPLE DAGGER", + direction="on", + linebreak="al", + unicodeslot=0x2E4B, + }, + [0x2E4C]={ + category="po", + description="MEDIEVAL COMMA", + direction="on", + linebreak="ba", + unicodeslot=0x2E4C, + }, + [0x2E4D]={ + category="po", + description="PARAGRAPHUS MARK", + direction="on", + linebreak="al", + unicodeslot=0x2E4D, + }, + [0x2E4E]={ + category="po", + description="PUNCTUS ELEVATUS MARK", + direction="on", + linebreak="ba", + unicodeslot=0x2E4E, + }, [0x2E80]={ category="so", cjkwd="w", @@ -95434,6 +96237,14 @@ characters.data={ linebreak="id", unicodeslot=0x312E, }, + [0x312F]={ + category="lo", + cjkwd="w", + description="BOPOMOFO LETTER NN", + direction="l", + linebreak="id", + unicodeslot=0x312F, + }, [0x3131]={ adobename="kiyeokkorean", category="lo", @@ -117174,6 +117985,13 @@ characters.data={ linebreak="al", unicodeslot=0xA7AE, }, + [0xA7AF]={ + category="ll", + description="LATIN LETTER SMALL CAPITAL Q", + direction="l", + linebreak="al", + unicodeslot=0xA7AF, + }, [0xA7B0]={ category="lu", description="LATIN CAPITAL LETTER TURNED K", @@ -117230,6 +118048,20 @@ characters.data={ linebreak="al", unicodeslot=0xA7B7, }, + [0xA7B8]={ + category="lu", + description="LATIN CAPITAL LETTER U WITH STROKE", + direction="l", + linebreak="al", + unicodeslot=0xA7B8, + }, + [0xA7B9]={ + category="ll", + description="LATIN SMALL LETTER U WITH STROKE", + direction="l", + linebreak="al", + unicodeslot=0xA7B9, + }, [0xA7F7]={ category="lo", description="LATIN EPIGRAPHIC LETTER SIDEWAYS I", @@ -118975,6 +119807,20 @@ characters.data={ linebreak="al", unicodeslot=0xA8FD, }, + [0xA8FE]={ + category="lo", + description="DEVANAGARI LETTER AY", + direction="l", + linebreak="al", + unicodeslot=0xA8FE, + }, + [0xA8FF]={ + category="mn", + description="DEVANAGARI VOWEL SIGN AY", + direction="nsm", + linebreak="cm", + unicodeslot=0xA8FF, + }, [0xA900]={ category="nd", description="KAYAH LI DIGIT ZERO", @@ -136230,6 +137076,9 @@ characters.data={ linebreak="id", specials={ "wide", 0x30 }, unicodeslot=0xFF10, + variants={ + [0xFE00]="short diagonal stroke form", + }, }, [0xFF11]={ adobename="onemonospace", @@ -150982,6 +151831,20 @@ characters.data={ linebreak="al", unicodeslot=0x10A33, }, + [0x10A34]={ + category="lo", + description="KHAROSHTHI LETTER TTTA", + direction="r", + linebreak="al", + unicodeslot=0x10A34, + }, + [0x10A35]={ + category="lo", + description="KHAROSHTHI LETTER VHA", + direction="r", + linebreak="al", + unicodeslot=0x10A35, + }, [0x10A38]={ category="mn", combining=0xE6, @@ -151070,6 +151933,13 @@ characters.data={ linebreak="al", unicodeslot=0x10A47, }, + [0x10A48]={ + category="no", + description="KHAROSHTHI FRACTION ONE HALF", + direction="r", + linebreak="al", + unicodeslot=0x10A48, + }, [0x10A50]={ category="po", description="KHAROSHTHI PUNCTUATION DOT", @@ -154318,6 +155188,396 @@ characters.data={ linebreak="al", unicodeslot=0x10CFF, }, + [0x10D00]={ + arabic="l", + category="lo", + description="HANIFI ROHINGYA LETTER A", + direction="al", + linebreak="al", + unicodeslot=0x10D00, + }, + [0x10D01]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER BA", + direction="al", + linebreak="al", + unicodeslot=0x10D01, + }, + [0x10D02]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER PA", + direction="al", + linebreak="al", + unicodeslot=0x10D02, + }, + [0x10D03]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER TA", + direction="al", + linebreak="al", + unicodeslot=0x10D03, + }, + [0x10D04]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER TTA", + direction="al", + linebreak="al", + unicodeslot=0x10D04, + }, + [0x10D05]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER JA", + direction="al", + linebreak="al", + unicodeslot=0x10D05, + }, + [0x10D06]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER CA", + direction="al", + linebreak="al", + unicodeslot=0x10D06, + }, + [0x10D07]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER HA", + direction="al", + linebreak="al", + unicodeslot=0x10D07, + }, + [0x10D08]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER KHA", + direction="al", + linebreak="al", + unicodeslot=0x10D08, + }, + [0x10D09]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER FA", + direction="al", + linebreak="al", + unicodeslot=0x10D09, + }, + [0x10D0A]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER DA", + direction="al", + linebreak="al", + unicodeslot=0x10D0A, + }, + [0x10D0B]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER DDA", + direction="al", + linebreak="al", + unicodeslot=0x10D0B, + }, + [0x10D0C]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER RA", + direction="al", + linebreak="al", + unicodeslot=0x10D0C, + }, + [0x10D0D]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER RRA", + direction="al", + linebreak="al", + unicodeslot=0x10D0D, + }, + [0x10D0E]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER ZA", + direction="al", + linebreak="al", + unicodeslot=0x10D0E, + }, + [0x10D0F]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER SA", + direction="al", + linebreak="al", + unicodeslot=0x10D0F, + }, + [0x10D10]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER SHA", + direction="al", + linebreak="al", + unicodeslot=0x10D10, + }, + [0x10D11]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER KA", + direction="al", + linebreak="al", + unicodeslot=0x10D11, + }, + [0x10D12]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER GA", + direction="al", + linebreak="al", + unicodeslot=0x10D12, + }, + [0x10D13]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER LA", + direction="al", + linebreak="al", + unicodeslot=0x10D13, + }, + [0x10D14]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER MA", + direction="al", + linebreak="al", + unicodeslot=0x10D14, + }, + [0x10D15]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER NA", + direction="al", + linebreak="al", + unicodeslot=0x10D15, + }, + [0x10D16]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER WA", + direction="al", + linebreak="al", + unicodeslot=0x10D16, + }, + [0x10D17]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER KINNA WA", + direction="al", + linebreak="al", + unicodeslot=0x10D17, + }, + [0x10D18]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER YA", + direction="al", + linebreak="al", + unicodeslot=0x10D18, + }, + [0x10D19]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER KINNA YA", + direction="al", + linebreak="al", + unicodeslot=0x10D19, + }, + [0x10D1A]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER NGA", + direction="al", + linebreak="al", + unicodeslot=0x10D1A, + }, + [0x10D1B]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER NYA", + direction="al", + linebreak="al", + unicodeslot=0x10D1B, + }, + [0x10D1C]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA LETTER VA", + direction="al", + linebreak="al", + unicodeslot=0x10D1C, + }, + [0x10D1D]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA VOWEL A", + direction="al", + linebreak="al", + unicodeslot=0x10D1D, + }, + [0x10D1E]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA VOWEL I", + direction="al", + linebreak="al", + unicodeslot=0x10D1E, + }, + [0x10D1F]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA VOWEL U", + direction="al", + linebreak="al", + unicodeslot=0x10D1F, + }, + [0x10D20]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA VOWEL E", + direction="al", + linebreak="al", + unicodeslot=0x10D20, + }, + [0x10D21]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA VOWEL O", + direction="al", + linebreak="al", + unicodeslot=0x10D21, + }, + [0x10D22]={ + arabic="r", + category="lo", + description="HANIFI ROHINGYA MARK SAKIN", + direction="al", + linebreak="al", + unicodeslot=0x10D22, + }, + [0x10D23]={ + arabic="d", + category="lo", + description="HANIFI ROHINGYA MARK NA KHONNA", + direction="al", + linebreak="al", + unicodeslot=0x10D23, + }, + [0x10D24]={ + category="mn", + combining=0xE6, + description="HANIFI ROHINGYA SIGN HARBAHAY", + direction="nsm", + linebreak="cm", + unicodeslot=0x10D24, + }, + [0x10D25]={ + category="mn", + combining=0xE6, + description="HANIFI ROHINGYA SIGN TAHALA", + direction="nsm", + linebreak="cm", + unicodeslot=0x10D25, + }, + [0x10D26]={ + category="mn", + combining=0xE6, + description="HANIFI ROHINGYA SIGN TANA", + direction="nsm", + linebreak="cm", + unicodeslot=0x10D26, + }, + [0x10D27]={ + category="mn", + combining=0xE6, + description="HANIFI ROHINGYA SIGN TASSI", + direction="nsm", + linebreak="cm", + unicodeslot=0x10D27, + }, + [0x10D30]={ + category="nd", + description="HANIFI ROHINGYA DIGIT ZERO", + direction="an", + linebreak="nu", + unicodeslot=0x10D30, + }, + [0x10D31]={ + category="nd", + description="HANIFI ROHINGYA DIGIT ONE", + direction="an", + linebreak="nu", + unicodeslot=0x10D31, + }, + [0x10D32]={ + category="nd", + description="HANIFI ROHINGYA DIGIT TWO", + direction="an", + linebreak="nu", + unicodeslot=0x10D32, + }, + [0x10D33]={ + category="nd", + description="HANIFI ROHINGYA DIGIT THREE", + direction="an", + linebreak="nu", + unicodeslot=0x10D33, + }, + [0x10D34]={ + category="nd", + description="HANIFI ROHINGYA DIGIT FOUR", + direction="an", + linebreak="nu", + unicodeslot=0x10D34, + }, + [0x10D35]={ + category="nd", + description="HANIFI ROHINGYA DIGIT FIVE", + direction="an", + linebreak="nu", + unicodeslot=0x10D35, + }, + [0x10D36]={ + category="nd", + description="HANIFI ROHINGYA DIGIT SIX", + direction="an", + linebreak="nu", + unicodeslot=0x10D36, + }, + [0x10D37]={ + category="nd", + description="HANIFI ROHINGYA DIGIT SEVEN", + direction="an", + linebreak="nu", + unicodeslot=0x10D37, + }, + [0x10D38]={ + category="nd", + description="HANIFI ROHINGYA DIGIT EIGHT", + direction="an", + linebreak="nu", + unicodeslot=0x10D38, + }, + [0x10D39]={ + category="nd", + description="HANIFI ROHINGYA DIGIT NINE", + direction="an", + linebreak="nu", + unicodeslot=0x10D39, + }, [0x10E60]={ category="no", description="RUMI DIGIT ONE", @@ -154535,6 +155795,617 @@ characters.data={ linebreak="al", unicodeslot=0x10E7E, }, + [0x10F00]={ + category="lo", + description="OLD SOGDIAN LETTER ALEPH", + direction="r", + linebreak="al", + unicodeslot=0x10F00, + }, + [0x10F01]={ + category="lo", + description="OLD SOGDIAN LETTER FINAL ALEPH", + direction="r", + linebreak="al", + unicodeslot=0x10F01, + }, + [0x10F02]={ + category="lo", + description="OLD SOGDIAN LETTER BETH", + direction="r", + linebreak="al", + unicodeslot=0x10F02, + }, + [0x10F03]={ + category="lo", + description="OLD SOGDIAN LETTER FINAL BETH", + direction="r", + linebreak="al", + unicodeslot=0x10F03, + }, + [0x10F04]={ + category="lo", + description="OLD SOGDIAN LETTER GIMEL", + direction="r", + linebreak="al", + unicodeslot=0x10F04, + }, + [0x10F05]={ + category="lo", + description="OLD SOGDIAN LETTER HE", + direction="r", + linebreak="al", + unicodeslot=0x10F05, + }, + [0x10F06]={ + category="lo", + description="OLD SOGDIAN LETTER FINAL HE", + direction="r", + linebreak="al", + unicodeslot=0x10F06, + }, + [0x10F07]={ + category="lo", + description="OLD SOGDIAN LETTER WAW", + direction="r", + linebreak="al", + unicodeslot=0x10F07, + }, + [0x10F08]={ + category="lo", + description="OLD SOGDIAN LETTER ZAYIN", + direction="r", + linebreak="al", + unicodeslot=0x10F08, + }, + [0x10F09]={ + category="lo", + description="OLD SOGDIAN LETTER HETH", + direction="r", + linebreak="al", + unicodeslot=0x10F09, + }, + [0x10F0A]={ + category="lo", + description="OLD SOGDIAN LETTER YODH", + direction="r", + linebreak="al", + unicodeslot=0x10F0A, + }, + [0x10F0B]={ + category="lo", + description="OLD SOGDIAN LETTER KAPH", + direction="r", + linebreak="al", + unicodeslot=0x10F0B, + }, + [0x10F0C]={ + category="lo", + description="OLD SOGDIAN LETTER LAMEDH", + direction="r", + linebreak="al", + unicodeslot=0x10F0C, + }, + [0x10F0D]={ + category="lo", + description="OLD SOGDIAN LETTER MEM", + direction="r", + linebreak="al", + unicodeslot=0x10F0D, + }, + [0x10F0E]={ + category="lo", + description="OLD SOGDIAN LETTER NUN", + direction="r", + linebreak="al", + unicodeslot=0x10F0E, + }, + [0x10F0F]={ + category="lo", + description="OLD SOGDIAN LETTER FINAL NUN", + direction="r", + linebreak="al", + unicodeslot=0x10F0F, + }, + [0x10F10]={ + category="lo", + description="OLD SOGDIAN LETTER FINAL NUN WITH VERTICAL TAIL", + direction="r", + linebreak="al", + unicodeslot=0x10F10, + }, + [0x10F11]={ + category="lo", + description="OLD SOGDIAN LETTER SAMEKH", + direction="r", + linebreak="al", + unicodeslot=0x10F11, + }, + [0x10F12]={ + category="lo", + description="OLD SOGDIAN LETTER AYIN", + direction="r", + linebreak="al", + unicodeslot=0x10F12, + }, + [0x10F13]={ + category="lo", + description="OLD SOGDIAN LETTER ALTERNATE AYIN", + direction="r", + linebreak="al", + unicodeslot=0x10F13, + }, + [0x10F14]={ + category="lo", + description="OLD SOGDIAN LETTER PE", + direction="r", + linebreak="al", + unicodeslot=0x10F14, + }, + [0x10F15]={ + category="lo", + description="OLD SOGDIAN LETTER SADHE", + direction="r", + linebreak="al", + unicodeslot=0x10F15, + }, + [0x10F16]={ + category="lo", + description="OLD SOGDIAN LETTER FINAL SADHE", + direction="r", + linebreak="al", + unicodeslot=0x10F16, + }, + [0x10F17]={ + category="lo", + description="OLD SOGDIAN LETTER FINAL SADHE WITH VERTICAL TAIL", + direction="r", + linebreak="al", + unicodeslot=0x10F17, + }, + [0x10F18]={ + category="lo", + description="OLD SOGDIAN LETTER RESH-AYIN-DALETH", + direction="r", + linebreak="al", + unicodeslot=0x10F18, + }, + [0x10F19]={ + category="lo", + description="OLD SOGDIAN LETTER SHIN", + direction="r", + linebreak="al", + unicodeslot=0x10F19, + }, + [0x10F1A]={ + category="lo", + description="OLD SOGDIAN LETTER TAW", + direction="r", + linebreak="al", + unicodeslot=0x10F1A, + }, + [0x10F1B]={ + category="lo", + description="OLD SOGDIAN LETTER FINAL TAW", + direction="r", + linebreak="al", + unicodeslot=0x10F1B, + }, + [0x10F1C]={ + category="lo", + description="OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL", + direction="r", + linebreak="al", + unicodeslot=0x10F1C, + }, + [0x10F1D]={ + category="no", + description="OLD SOGDIAN NUMBER ONE", + direction="r", + linebreak="al", + unicodeslot=0x10F1D, + }, + [0x10F1E]={ + category="no", + description="OLD SOGDIAN NUMBER TWO", + direction="r", + linebreak="al", + unicodeslot=0x10F1E, + }, + [0x10F1F]={ + category="no", + description="OLD SOGDIAN NUMBER THREE", + direction="r", + linebreak="al", + unicodeslot=0x10F1F, + }, + [0x10F20]={ + category="no", + description="OLD SOGDIAN NUMBER FOUR", + direction="r", + linebreak="al", + unicodeslot=0x10F20, + }, + [0x10F21]={ + category="no", + description="OLD SOGDIAN NUMBER FIVE", + direction="r", + linebreak="al", + unicodeslot=0x10F21, + }, + [0x10F22]={ + category="no", + description="OLD SOGDIAN NUMBER TEN", + direction="r", + linebreak="al", + unicodeslot=0x10F22, + }, + [0x10F23]={ + category="no", + description="OLD SOGDIAN NUMBER TWENTY", + direction="r", + linebreak="al", + unicodeslot=0x10F23, + }, + [0x10F24]={ + category="no", + description="OLD SOGDIAN NUMBER THIRTY", + direction="r", + linebreak="al", + unicodeslot=0x10F24, + }, + [0x10F25]={ + category="no", + description="OLD SOGDIAN NUMBER ONE HUNDRED", + direction="r", + linebreak="al", + unicodeslot=0x10F25, + }, + [0x10F26]={ + category="no", + description="OLD SOGDIAN FRACTION ONE HALF", + direction="r", + linebreak="al", + unicodeslot=0x10F26, + }, + [0x10F27]={ + category="lo", + description="OLD SOGDIAN LIGATURE AYIN-DALETH", + direction="r", + linebreak="al", + unicodeslot=0x10F27, + }, + [0x10F30]={ + arabic="d", + category="lo", + description="SOGDIAN LETTER ALEPH", + direction="al", + linebreak="al", + unicodeslot=0x10F30, + }, + [0x10F31]={ + arabic="d", + category="lo", + description="SOGDIAN LETTER BETH", + direction="al", + linebreak="al", + unicodeslot=0x10F31, + }, + [0x10F32]={ + arabic="d", + category="lo", + description="SOGDIAN LETTER GIMEL", + direction="al", + linebreak="al", + unicodeslot=0x10F32, + }, + [0x10F33]={ + arabic="r", + category="lo", + description="SOGDIAN LETTER HE", + direction="al", + linebreak="al", + unicodeslot=0x10F33, + }, + [0x10F34]={ + arabic="d", + category="lo", + description="SOGDIAN LETTER WAW", + direction="al", + linebreak="al", + unicodeslot=0x10F34, + }, + [0x10F35]={ + arabic="d", + category="lo", + description="SOGDIAN LETTER ZAYIN", + direction="al", + linebreak="al", + unicodeslot=0x10F35, + }, + [0x10F36]={ + arabic="d", + category="lo", + description="SOGDIAN LETTER HETH", + direction="al", + linebreak="al", + unicodeslot=0x10F36, + }, + [0x10F37]={ + arabic="d", + category="lo", + description="SOGDIAN LETTER YODH", + direction="al", + linebreak="al", + unicodeslot=0x10F37, + }, + [0x10F38]={ + arabic="d", + category="lo", + description="SOGDIAN LETTER KAPH", + direction="al", + linebreak="al", + unicodeslot=0x10F38, + }, + [0x10F39]={ + arabic="d", + category="lo", + description="SOGDIAN LETTER LAMEDH", + direction="al", + linebreak="al", + unicodeslot=0x10F39, + }, + [0x10F3A]={ + arabic="d", + category="lo", + description="SOGDIAN LETTER MEM", + direction="al", + linebreak="al", + unicodeslot=0x10F3A, + }, + [0x10F3B]={ + arabic="d", + category="lo", + description="SOGDIAN LETTER NUN", + direction="al", + linebreak="al", + unicodeslot=0x10F3B, + }, + [0x10F3C]={ + arabic="d", + category="lo", + description="SOGDIAN LETTER SAMEKH", + direction="al", + linebreak="al", + unicodeslot=0x10F3C, + }, + [0x10F3D]={ + arabic="d", + category="lo", + description="SOGDIAN LETTER AYIN", + direction="al", + linebreak="al", + unicodeslot=0x10F3D, + }, + [0x10F3E]={ + arabic="d", + category="lo", + description="SOGDIAN LETTER PE", + direction="al", + linebreak="al", + unicodeslot=0x10F3E, + }, + [0x10F3F]={ + arabic="d", + category="lo", + description="SOGDIAN LETTER SADHE", + direction="al", + linebreak="al", + unicodeslot=0x10F3F, + }, + [0x10F40]={ + arabic="d", + category="lo", + description="SOGDIAN LETTER RESH-AYIN", + direction="al", + linebreak="al", + unicodeslot=0x10F40, + }, + [0x10F41]={ + arabic="d", + category="lo", + description="SOGDIAN LETTER SHIN", + direction="al", + linebreak="al", + unicodeslot=0x10F41, + }, + [0x10F42]={ + arabic="d", + category="lo", + description="SOGDIAN LETTER TAW", + direction="al", + linebreak="al", + unicodeslot=0x10F42, + }, + [0x10F43]={ + arabic="d", + category="lo", + description="SOGDIAN LETTER FETH", + direction="al", + linebreak="al", + unicodeslot=0x10F43, + }, + [0x10F44]={ + arabic="d", + category="lo", + description="SOGDIAN LETTER LESH", + direction="al", + linebreak="al", + unicodeslot=0x10F44, + }, + [0x10F45]={ + arabic="u", + category="lo", + description="SOGDIAN INDEPENDENT SHIN", + direction="al", + linebreak="al", + unicodeslot=0x10F45, + }, + [0x10F46]={ + category="mn", + combining=0xDC, + description="SOGDIAN COMBINING DOT BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0x10F46, + }, + [0x10F47]={ + category="mn", + combining=0xDC, + description="SOGDIAN COMBINING TWO DOTS BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0x10F47, + }, + [0x10F48]={ + category="mn", + combining=0xE6, + description="SOGDIAN COMBINING DOT ABOVE", + direction="nsm", + linebreak="cm", + unicodeslot=0x10F48, + }, + [0x10F49]={ + category="mn", + combining=0xE6, + description="SOGDIAN COMBINING TWO DOTS ABOVE", + direction="nsm", + linebreak="cm", + unicodeslot=0x10F49, + }, + [0x10F4A]={ + category="mn", + combining=0xE6, + description="SOGDIAN COMBINING CURVE ABOVE", + direction="nsm", + linebreak="cm", + unicodeslot=0x10F4A, + }, + [0x10F4B]={ + category="mn", + combining=0xDC, + description="SOGDIAN COMBINING CURVE BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0x10F4B, + }, + [0x10F4C]={ + category="mn", + combining=0xE6, + description="SOGDIAN COMBINING HOOK ABOVE", + direction="nsm", + linebreak="cm", + unicodeslot=0x10F4C, + }, + [0x10F4D]={ + category="mn", + combining=0xDC, + description="SOGDIAN COMBINING HOOK BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0x10F4D, + }, + [0x10F4E]={ + category="mn", + combining=0xDC, + description="SOGDIAN COMBINING LONG HOOK BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0x10F4E, + }, + [0x10F4F]={ + category="mn", + combining=0xDC, + description="SOGDIAN COMBINING RESH BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0x10F4F, + }, + [0x10F50]={ + category="mn", + combining=0xDC, + description="SOGDIAN COMBINING STROKE BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0x10F50, + }, + [0x10F51]={ + arabic="d", + category="no", + description="SOGDIAN NUMBER ONE", + direction="al", + linebreak="al", + unicodeslot=0x10F51, + }, + [0x10F52]={ + arabic="d", + category="no", + description="SOGDIAN NUMBER TEN", + direction="al", + linebreak="al", + unicodeslot=0x10F52, + }, + [0x10F53]={ + arabic="d", + category="no", + description="SOGDIAN NUMBER TWENTY", + direction="al", + linebreak="al", + unicodeslot=0x10F53, + }, + [0x10F54]={ + arabic="r", + category="no", + description="SOGDIAN NUMBER ONE HUNDRED", + direction="al", + linebreak="al", + unicodeslot=0x10F54, + }, + [0x10F55]={ + category="po", + description="SOGDIAN PUNCTUATION TWO VERTICAL BARS", + direction="al", + linebreak="al", + unicodeslot=0x10F55, + }, + [0x10F56]={ + category="po", + description="SOGDIAN PUNCTUATION TWO VERTICAL BARS WITH DOTS", + direction="al", + linebreak="al", + unicodeslot=0x10F56, + }, + [0x10F57]={ + category="po", + description="SOGDIAN PUNCTUATION CIRCLE WITH DOT", + direction="al", + linebreak="al", + unicodeslot=0x10F57, + }, + [0x10F58]={ + category="po", + description="SOGDIAN PUNCTUATION TWO CIRCLES WITH DOTS", + direction="al", + linebreak="al", + unicodeslot=0x10F58, + }, + [0x10F59]={ + category="po", + description="SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT", + direction="al", + linebreak="al", + unicodeslot=0x10F59, + }, [0x11000]={ category="mc", description="BRAHMI SIGN CANDRABINDU", @@ -155733,6 +157604,7 @@ characters.data={ unicodeslot=0x110BC, }, [0x110BD]={ + arabic="u", category="cf", description="KAITHI NUMBER SIGN", direction="l", @@ -155767,6 +157639,14 @@ characters.data={ linebreak="ba", unicodeslot=0x110C1, }, + [0x110CD]={ + arabic="u", + category="cf", + description="KAITHI NUMBER SIGN ABOVE", + direction="l", + linebreak="al", + unicodeslot=0x110CD, + }, [0x110D0]={ category="lo", description="SORA SOMPENG LETTER SAH", @@ -156488,6 +158368,27 @@ characters.data={ linebreak="ba", unicodeslot=0x11143, }, + [0x11144]={ + category="lo", + description="CHAKMA LETTER LHAA", + direction="l", + linebreak="al", + unicodeslot=0x11144, + }, + [0x11145]={ + category="mc", + description="CHAKMA VOWEL SIGN AA", + direction="l", + linebreak="cm", + unicodeslot=0x11145, + }, + [0x11146]={ + category="mc", + description="CHAKMA VOWEL SIGN EI", + direction="l", + linebreak="cm", + unicodeslot=0x11146, + }, [0x11150]={ category="lo", description="MAHAJANI LETTER A", @@ -157277,8 +159178,8 @@ characters.data={ [0x111C9]={ category="po", description="SHARADA SANDHI MARK", - direction="l", - linebreak="al", + direction="nsm", + linebreak="cm", unicodeslot=0x111C9, }, [0x111CA]={ @@ -159099,6 +161000,14 @@ characters.data={ linebreak="al", unicodeslot=0x11339, }, + [0x1133B]={ + category="mn", + combining=0x7, + description="COMBINING BINDU BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0x1133B, + }, [0x1133C]={ category="mn", combining=0x7, @@ -160006,6 +161915,14 @@ characters.data={ linebreak="al", unicodeslot=0x1145D, }, + [0x1145E]={ + category="mn", + combining=0xE6, + description="NEWA SANDHI MARK", + direction="nsm", + linebreak="cm", + unicodeslot=0x1145E, + }, [0x11480]={ category="lo", description="TIRHUTA ANJI", @@ -162524,6 +164441,13 @@ characters.data={ linebreak="sa", unicodeslot=0x11719, }, + [0x1171A]={ + category="lo", + description="AHOM LETTER ALTERNATE BA", + direction="l", + linebreak="sa", + unicodeslot=0x1171A, + }, [0x1171D]={ category="mn", description="AHOM CONSONANT SIGN MEDIAL LA", @@ -162742,6 +164666,428 @@ characters.data={ linebreak="sa", unicodeslot=0x1173F, }, + [0x11800]={ + category="lo", + description="DOGRA LETTER A", + direction="l", + linebreak="al", + unicodeslot=0x11800, + }, + [0x11801]={ + category="lo", + description="DOGRA LETTER AA", + direction="l", + linebreak="al", + unicodeslot=0x11801, + }, + [0x11802]={ + category="lo", + description="DOGRA LETTER I", + direction="l", + linebreak="al", + unicodeslot=0x11802, + }, + [0x11803]={ + category="lo", + description="DOGRA LETTER II", + direction="l", + linebreak="al", + unicodeslot=0x11803, + }, + [0x11804]={ + category="lo", + description="DOGRA LETTER U", + direction="l", + linebreak="al", + unicodeslot=0x11804, + }, + [0x11805]={ + category="lo", + description="DOGRA LETTER UU", + direction="l", + linebreak="al", + unicodeslot=0x11805, + }, + [0x11806]={ + category="lo", + description="DOGRA LETTER E", + direction="l", + linebreak="al", + unicodeslot=0x11806, + }, + [0x11807]={ + category="lo", + description="DOGRA LETTER AI", + direction="l", + linebreak="al", + unicodeslot=0x11807, + }, + [0x11808]={ + category="lo", + description="DOGRA LETTER O", + direction="l", + linebreak="al", + unicodeslot=0x11808, + }, + [0x11809]={ + category="lo", + description="DOGRA LETTER AU", + direction="l", + linebreak="al", + unicodeslot=0x11809, + }, + [0x1180A]={ + category="lo", + description="DOGRA LETTER KA", + direction="l", + linebreak="al", + unicodeslot=0x1180A, + }, + [0x1180B]={ + category="lo", + description="DOGRA LETTER KHA", + direction="l", + linebreak="al", + unicodeslot=0x1180B, + }, + [0x1180C]={ + category="lo", + description="DOGRA LETTER GA", + direction="l", + linebreak="al", + unicodeslot=0x1180C, + }, + [0x1180D]={ + category="lo", + description="DOGRA LETTER GHA", + direction="l", + linebreak="al", + unicodeslot=0x1180D, + }, + [0x1180E]={ + category="lo", + description="DOGRA LETTER NGA", + direction="l", + linebreak="al", + unicodeslot=0x1180E, + }, + [0x1180F]={ + category="lo", + description="DOGRA LETTER CA", + direction="l", + linebreak="al", + unicodeslot=0x1180F, + }, + [0x11810]={ + category="lo", + description="DOGRA LETTER CHA", + direction="l", + linebreak="al", + unicodeslot=0x11810, + }, + [0x11811]={ + category="lo", + description="DOGRA LETTER JA", + direction="l", + linebreak="al", + unicodeslot=0x11811, + }, + [0x11812]={ + category="lo", + description="DOGRA LETTER JHA", + direction="l", + linebreak="al", + unicodeslot=0x11812, + }, + [0x11813]={ + category="lo", + description="DOGRA LETTER NYA", + direction="l", + linebreak="al", + unicodeslot=0x11813, + }, + [0x11814]={ + category="lo", + description="DOGRA LETTER TTA", + direction="l", + linebreak="al", + unicodeslot=0x11814, + }, + [0x11815]={ + category="lo", + description="DOGRA LETTER TTHA", + direction="l", + linebreak="al", + unicodeslot=0x11815, + }, + [0x11816]={ + category="lo", + description="DOGRA LETTER DDA", + direction="l", + linebreak="al", + unicodeslot=0x11816, + }, + [0x11817]={ + category="lo", + description="DOGRA LETTER DDHA", + direction="l", + linebreak="al", + unicodeslot=0x11817, + }, + [0x11818]={ + category="lo", + description="DOGRA LETTER NNA", + direction="l", + linebreak="al", + unicodeslot=0x11818, + }, + [0x11819]={ + category="lo", + description="DOGRA LETTER TA", + direction="l", + linebreak="al", + unicodeslot=0x11819, + }, + [0x1181A]={ + category="lo", + description="DOGRA LETTER THA", + direction="l", + linebreak="al", + unicodeslot=0x1181A, + }, + [0x1181B]={ + category="lo", + description="DOGRA LETTER DA", + direction="l", + linebreak="al", + unicodeslot=0x1181B, + }, + [0x1181C]={ + category="lo", + description="DOGRA LETTER DHA", + direction="l", + linebreak="al", + unicodeslot=0x1181C, + }, + [0x1181D]={ + category="lo", + description="DOGRA LETTER NA", + direction="l", + linebreak="al", + unicodeslot=0x1181D, + }, + [0x1181E]={ + category="lo", + description="DOGRA LETTER PA", + direction="l", + linebreak="al", + unicodeslot=0x1181E, + }, + [0x1181F]={ + category="lo", + description="DOGRA LETTER PHA", + direction="l", + linebreak="al", + unicodeslot=0x1181F, + }, + [0x11820]={ + category="lo", + description="DOGRA LETTER BA", + direction="l", + linebreak="al", + unicodeslot=0x11820, + }, + [0x11821]={ + category="lo", + description="DOGRA LETTER BHA", + direction="l", + linebreak="al", + unicodeslot=0x11821, + }, + [0x11822]={ + category="lo", + description="DOGRA LETTER MA", + direction="l", + linebreak="al", + unicodeslot=0x11822, + }, + [0x11823]={ + category="lo", + description="DOGRA LETTER YA", + direction="l", + linebreak="al", + unicodeslot=0x11823, + }, + [0x11824]={ + category="lo", + description="DOGRA LETTER RA", + direction="l", + linebreak="al", + unicodeslot=0x11824, + }, + [0x11825]={ + category="lo", + description="DOGRA LETTER LA", + direction="l", + linebreak="al", + unicodeslot=0x11825, + }, + [0x11826]={ + category="lo", + description="DOGRA LETTER VA", + direction="l", + linebreak="al", + unicodeslot=0x11826, + }, + [0x11827]={ + category="lo", + description="DOGRA LETTER SHA", + direction="l", + linebreak="al", + unicodeslot=0x11827, + }, + [0x11828]={ + category="lo", + description="DOGRA LETTER SSA", + direction="l", + linebreak="al", + unicodeslot=0x11828, + }, + [0x11829]={ + category="lo", + description="DOGRA LETTER SA", + direction="l", + linebreak="al", + unicodeslot=0x11829, + }, + [0x1182A]={ + category="lo", + description="DOGRA LETTER HA", + direction="l", + linebreak="al", + unicodeslot=0x1182A, + }, + [0x1182B]={ + category="lo", + description="DOGRA LETTER RRA", + direction="l", + linebreak="al", + unicodeslot=0x1182B, + }, + [0x1182C]={ + category="mc", + description="DOGRA VOWEL SIGN AA", + direction="l", + linebreak="cm", + unicodeslot=0x1182C, + }, + [0x1182D]={ + category="mc", + description="DOGRA VOWEL SIGN I", + direction="l", + linebreak="cm", + unicodeslot=0x1182D, + }, + [0x1182E]={ + category="mc", + description="DOGRA VOWEL SIGN II", + direction="l", + linebreak="cm", + unicodeslot=0x1182E, + }, + [0x1182F]={ + category="mn", + description="DOGRA VOWEL SIGN U", + direction="nsm", + linebreak="cm", + unicodeslot=0x1182F, + }, + [0x11830]={ + category="mn", + description="DOGRA VOWEL SIGN UU", + direction="nsm", + linebreak="cm", + unicodeslot=0x11830, + }, + [0x11831]={ + category="mn", + description="DOGRA VOWEL SIGN VOCALIC R", + direction="nsm", + linebreak="cm", + unicodeslot=0x11831, + }, + [0x11832]={ + category="mn", + description="DOGRA VOWEL SIGN VOCALIC RR", + direction="nsm", + linebreak="cm", + unicodeslot=0x11832, + }, + [0x11833]={ + category="mn", + description="DOGRA VOWEL SIGN E", + direction="nsm", + linebreak="cm", + unicodeslot=0x11833, + }, + [0x11834]={ + category="mn", + description="DOGRA VOWEL SIGN AI", + direction="nsm", + linebreak="cm", + unicodeslot=0x11834, + }, + [0x11835]={ + category="mn", + description="DOGRA VOWEL SIGN O", + direction="nsm", + linebreak="cm", + unicodeslot=0x11835, + }, + [0x11836]={ + category="mn", + description="DOGRA VOWEL SIGN AU", + direction="nsm", + linebreak="cm", + unicodeslot=0x11836, + }, + [0x11837]={ + category="mn", + description="DOGRA SIGN ANUSVARA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11837, + }, + [0x11838]={ + category="mc", + description="DOGRA SIGN VISARGA", + direction="l", + linebreak="cm", + unicodeslot=0x11838, + }, + [0x11839]={ + category="mn", + combining=0x9, + description="DOGRA SIGN VIRAMA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11839, + }, + [0x1183A]={ + category="mn", + combining=0x7, + description="DOGRA SIGN NUKTA", + direction="nsm", + linebreak="cm", + unicodeslot=0x1183A, + }, + [0x1183B]={ + category="po", + description="DOGRA ABBREVIATION SIGN", + direction="l", + linebreak="al", + unicodeslot=0x1183B, + }, [0x118A0]={ category="lu", description="WARANG CITI CAPITAL LETTER NGAA", @@ -164362,6 +166708,13 @@ characters.data={ linebreak="ba", unicodeslot=0x11A9C, }, + [0x11A9D]={ + category="lo", + description="SOYOMBO MARK PLUTA", + direction="l", + linebreak="al", + unicodeslot=0x11A9D, + }, [0x11A9E]={ category="po", description="SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME", @@ -166480,6 +168833,623 @@ characters.data={ linebreak="nu", unicodeslot=0x11D59, }, + [0x11D60]={ + category="lo", + description="GUNJALA GONDI LETTER A", + direction="l", + linebreak="al", + unicodeslot=0x11D60, + }, + [0x11D61]={ + category="lo", + description="GUNJALA GONDI LETTER AA", + direction="l", + linebreak="al", + unicodeslot=0x11D61, + }, + [0x11D62]={ + category="lo", + description="GUNJALA GONDI LETTER I", + direction="l", + linebreak="al", + unicodeslot=0x11D62, + }, + [0x11D63]={ + category="lo", + description="GUNJALA GONDI LETTER II", + direction="l", + linebreak="al", + unicodeslot=0x11D63, + }, + [0x11D64]={ + category="lo", + description="GUNJALA GONDI LETTER U", + direction="l", + linebreak="al", + unicodeslot=0x11D64, + }, + [0x11D65]={ + category="lo", + description="GUNJALA GONDI LETTER UU", + direction="l", + linebreak="al", + unicodeslot=0x11D65, + }, + [0x11D67]={ + category="lo", + description="GUNJALA GONDI LETTER EE", + direction="l", + linebreak="al", + unicodeslot=0x11D67, + }, + [0x11D68]={ + category="lo", + description="GUNJALA GONDI LETTER AI", + direction="l", + linebreak="al", + unicodeslot=0x11D68, + }, + [0x11D6A]={ + category="lo", + description="GUNJALA GONDI LETTER OO", + direction="l", + linebreak="al", + unicodeslot=0x11D6A, + }, + [0x11D6B]={ + category="lo", + description="GUNJALA GONDI LETTER AU", + direction="l", + linebreak="al", + unicodeslot=0x11D6B, + }, + [0x11D6C]={ + category="lo", + description="GUNJALA GONDI LETTER YA", + direction="l", + linebreak="al", + unicodeslot=0x11D6C, + }, + [0x11D6D]={ + category="lo", + description="GUNJALA GONDI LETTER VA", + direction="l", + linebreak="al", + unicodeslot=0x11D6D, + }, + [0x11D6E]={ + category="lo", + description="GUNJALA GONDI LETTER BA", + direction="l", + linebreak="al", + unicodeslot=0x11D6E, + }, + [0x11D6F]={ + category="lo", + description="GUNJALA GONDI LETTER BHA", + direction="l", + linebreak="al", + unicodeslot=0x11D6F, + }, + [0x11D70]={ + category="lo", + description="GUNJALA GONDI LETTER MA", + direction="l", + linebreak="al", + unicodeslot=0x11D70, + }, + [0x11D71]={ + category="lo", + description="GUNJALA GONDI LETTER KA", + direction="l", + linebreak="al", + unicodeslot=0x11D71, + }, + [0x11D72]={ + category="lo", + description="GUNJALA GONDI LETTER KHA", + direction="l", + linebreak="al", + unicodeslot=0x11D72, + }, + [0x11D73]={ + category="lo", + description="GUNJALA GONDI LETTER TA", + direction="l", + linebreak="al", + unicodeslot=0x11D73, + }, + [0x11D74]={ + category="lo", + description="GUNJALA GONDI LETTER THA", + direction="l", + linebreak="al", + unicodeslot=0x11D74, + }, + [0x11D75]={ + category="lo", + description="GUNJALA GONDI LETTER LA", + direction="l", + linebreak="al", + unicodeslot=0x11D75, + }, + [0x11D76]={ + category="lo", + description="GUNJALA GONDI LETTER GA", + direction="l", + linebreak="al", + unicodeslot=0x11D76, + }, + [0x11D77]={ + category="lo", + description="GUNJALA GONDI LETTER GHA", + direction="l", + linebreak="al", + unicodeslot=0x11D77, + }, + [0x11D78]={ + category="lo", + description="GUNJALA GONDI LETTER DA", + direction="l", + linebreak="al", + unicodeslot=0x11D78, + }, + [0x11D79]={ + category="lo", + description="GUNJALA GONDI LETTER DHA", + direction="l", + linebreak="al", + unicodeslot=0x11D79, + }, + [0x11D7A]={ + category="lo", + description="GUNJALA GONDI LETTER NA", + direction="l", + linebreak="al", + unicodeslot=0x11D7A, + }, + [0x11D7B]={ + category="lo", + description="GUNJALA GONDI LETTER CA", + direction="l", + linebreak="al", + unicodeslot=0x11D7B, + }, + [0x11D7C]={ + category="lo", + description="GUNJALA GONDI LETTER CHA", + direction="l", + linebreak="al", + unicodeslot=0x11D7C, + }, + [0x11D7D]={ + category="lo", + description="GUNJALA GONDI LETTER TTA", + direction="l", + linebreak="al", + unicodeslot=0x11D7D, + }, + [0x11D7E]={ + category="lo", + description="GUNJALA GONDI LETTER TTHA", + direction="l", + linebreak="al", + unicodeslot=0x11D7E, + }, + [0x11D7F]={ + category="lo", + description="GUNJALA GONDI LETTER LLA", + direction="l", + linebreak="al", + unicodeslot=0x11D7F, + }, + [0x11D80]={ + category="lo", + description="GUNJALA GONDI LETTER JA", + direction="l", + linebreak="al", + unicodeslot=0x11D80, + }, + [0x11D81]={ + category="lo", + description="GUNJALA GONDI LETTER JHA", + direction="l", + linebreak="al", + unicodeslot=0x11D81, + }, + [0x11D82]={ + category="lo", + description="GUNJALA GONDI LETTER DDA", + direction="l", + linebreak="al", + unicodeslot=0x11D82, + }, + [0x11D83]={ + category="lo", + description="GUNJALA GONDI LETTER DDHA", + direction="l", + linebreak="al", + unicodeslot=0x11D83, + }, + [0x11D84]={ + category="lo", + description="GUNJALA GONDI LETTER NGA", + direction="l", + linebreak="al", + unicodeslot=0x11D84, + }, + [0x11D85]={ + category="lo", + description="GUNJALA GONDI LETTER PA", + direction="l", + linebreak="al", + unicodeslot=0x11D85, + }, + [0x11D86]={ + category="lo", + description="GUNJALA GONDI LETTER PHA", + direction="l", + linebreak="al", + unicodeslot=0x11D86, + }, + [0x11D87]={ + category="lo", + description="GUNJALA GONDI LETTER HA", + direction="l", + linebreak="al", + unicodeslot=0x11D87, + }, + [0x11D88]={ + category="lo", + description="GUNJALA GONDI LETTER RA", + direction="l", + linebreak="al", + unicodeslot=0x11D88, + }, + [0x11D89]={ + category="lo", + description="GUNJALA GONDI LETTER SA", + direction="l", + linebreak="al", + unicodeslot=0x11D89, + }, + [0x11D8A]={ + category="mc", + description="GUNJALA GONDI VOWEL SIGN AA", + direction="l", + linebreak="cm", + unicodeslot=0x11D8A, + }, + [0x11D8B]={ + category="mc", + description="GUNJALA GONDI VOWEL SIGN I", + direction="l", + linebreak="cm", + unicodeslot=0x11D8B, + }, + [0x11D8C]={ + category="mc", + description="GUNJALA GONDI VOWEL SIGN II", + direction="l", + linebreak="cm", + unicodeslot=0x11D8C, + }, + [0x11D8D]={ + category="mc", + description="GUNJALA GONDI VOWEL SIGN U", + direction="l", + linebreak="cm", + unicodeslot=0x11D8D, + }, + [0x11D8E]={ + category="mc", + description="GUNJALA GONDI VOWEL SIGN UU", + direction="l", + linebreak="cm", + unicodeslot=0x11D8E, + }, + [0x11D90]={ + category="mn", + description="GUNJALA GONDI VOWEL SIGN EE", + direction="nsm", + linebreak="cm", + unicodeslot=0x11D90, + }, + [0x11D91]={ + category="mn", + description="GUNJALA GONDI VOWEL SIGN AI", + direction="nsm", + linebreak="cm", + unicodeslot=0x11D91, + }, + [0x11D93]={ + category="mc", + description="GUNJALA GONDI VOWEL SIGN OO", + direction="l", + linebreak="cm", + unicodeslot=0x11D93, + }, + [0x11D94]={ + category="mc", + description="GUNJALA GONDI VOWEL SIGN AU", + direction="l", + linebreak="cm", + unicodeslot=0x11D94, + }, + [0x11D95]={ + category="mn", + description="GUNJALA GONDI SIGN ANUSVARA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11D95, + }, + [0x11D96]={ + category="mc", + description="GUNJALA GONDI SIGN VISARGA", + direction="l", + linebreak="cm", + unicodeslot=0x11D96, + }, + [0x11D97]={ + category="mn", + combining=0x9, + description="GUNJALA GONDI VIRAMA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11D97, + }, + [0x11D98]={ + category="lo", + description="GUNJALA GONDI OM", + direction="l", + linebreak="al", + unicodeslot=0x11D98, + }, + [0x11DA0]={ + category="nd", + description="GUNJALA GONDI DIGIT ZERO", + direction="l", + linebreak="nu", + unicodeslot=0x11DA0, + }, + [0x11DA1]={ + category="nd", + description="GUNJALA GONDI DIGIT ONE", + direction="l", + linebreak="nu", + unicodeslot=0x11DA1, + }, + [0x11DA2]={ + category="nd", + description="GUNJALA GONDI DIGIT TWO", + direction="l", + linebreak="nu", + unicodeslot=0x11DA2, + }, + [0x11DA3]={ + category="nd", + description="GUNJALA GONDI DIGIT THREE", + direction="l", + linebreak="nu", + unicodeslot=0x11DA3, + }, + [0x11DA4]={ + category="nd", + description="GUNJALA GONDI DIGIT FOUR", + direction="l", + linebreak="nu", + unicodeslot=0x11DA4, + }, + [0x11DA5]={ + category="nd", + description="GUNJALA GONDI DIGIT FIVE", + direction="l", + linebreak="nu", + unicodeslot=0x11DA5, + }, + [0x11DA6]={ + category="nd", + description="GUNJALA GONDI DIGIT SIX", + direction="l", + linebreak="nu", + unicodeslot=0x11DA6, + }, + [0x11DA7]={ + category="nd", + description="GUNJALA GONDI DIGIT SEVEN", + direction="l", + linebreak="nu", + unicodeslot=0x11DA7, + }, + [0x11DA8]={ + category="nd", + description="GUNJALA GONDI DIGIT EIGHT", + direction="l", + linebreak="nu", + unicodeslot=0x11DA8, + }, + [0x11DA9]={ + category="nd", + description="GUNJALA GONDI DIGIT NINE", + direction="l", + linebreak="nu", + unicodeslot=0x11DA9, + }, + [0x11EE0]={ + category="lo", + description="MAKASAR LETTER KA", + direction="l", + linebreak="al", + unicodeslot=0x11EE0, + }, + [0x11EE1]={ + category="lo", + description="MAKASAR LETTER GA", + direction="l", + linebreak="al", + unicodeslot=0x11EE1, + }, + [0x11EE2]={ + category="lo", + description="MAKASAR LETTER NGA", + direction="l", + linebreak="al", + unicodeslot=0x11EE2, + }, + [0x11EE3]={ + category="lo", + description="MAKASAR LETTER PA", + direction="l", + linebreak="al", + unicodeslot=0x11EE3, + }, + [0x11EE4]={ + category="lo", + description="MAKASAR LETTER BA", + direction="l", + linebreak="al", + unicodeslot=0x11EE4, + }, + [0x11EE5]={ + category="lo", + description="MAKASAR LETTER MA", + direction="l", + linebreak="al", + unicodeslot=0x11EE5, + }, + [0x11EE6]={ + category="lo", + description="MAKASAR LETTER TA", + direction="l", + linebreak="al", + unicodeslot=0x11EE6, + }, + [0x11EE7]={ + category="lo", + description="MAKASAR LETTER DA", + direction="l", + linebreak="al", + unicodeslot=0x11EE7, + }, + [0x11EE8]={ + category="lo", + description="MAKASAR LETTER NA", + direction="l", + linebreak="al", + unicodeslot=0x11EE8, + }, + [0x11EE9]={ + category="lo", + description="MAKASAR LETTER CA", + direction="l", + linebreak="al", + unicodeslot=0x11EE9, + }, + [0x11EEA]={ + category="lo", + description="MAKASAR LETTER JA", + direction="l", + linebreak="al", + unicodeslot=0x11EEA, + }, + [0x11EEB]={ + category="lo", + description="MAKASAR LETTER NYA", + direction="l", + linebreak="al", + unicodeslot=0x11EEB, + }, + [0x11EEC]={ + category="lo", + description="MAKASAR LETTER YA", + direction="l", + linebreak="al", + unicodeslot=0x11EEC, + }, + [0x11EED]={ + category="lo", + description="MAKASAR LETTER RA", + direction="l", + linebreak="al", + unicodeslot=0x11EED, + }, + [0x11EEE]={ + category="lo", + description="MAKASAR LETTER LA", + direction="l", + linebreak="al", + unicodeslot=0x11EEE, + }, + [0x11EEF]={ + category="lo", + description="MAKASAR LETTER VA", + direction="l", + linebreak="al", + unicodeslot=0x11EEF, + }, + [0x11EF0]={ + category="lo", + description="MAKASAR LETTER SA", + direction="l", + linebreak="al", + unicodeslot=0x11EF0, + }, + [0x11EF1]={ + category="lo", + description="MAKASAR LETTER A", + direction="l", + linebreak="al", + unicodeslot=0x11EF1, + }, + [0x11EF2]={ + category="lo", + description="MAKASAR ANGKA", + direction="l", + linebreak="al", + unicodeslot=0x11EF2, + }, + [0x11EF3]={ + category="mn", + description="MAKASAR VOWEL SIGN I", + direction="nsm", + linebreak="cm", + unicodeslot=0x11EF3, + }, + [0x11EF4]={ + category="mn", + description="MAKASAR VOWEL SIGN U", + direction="nsm", + linebreak="cm", + unicodeslot=0x11EF4, + }, + [0x11EF5]={ + category="mc", + description="MAKASAR VOWEL SIGN E", + direction="l", + linebreak="cm", + unicodeslot=0x11EF5, + }, + [0x11EF6]={ + category="mc", + description="MAKASAR VOWEL SIGN O", + direction="l", + linebreak="cm", + unicodeslot=0x11EF6, + }, + [0x11EF7]={ + category="po", + description="MAKASAR PASSIMBANG", + direction="l", + linebreak="al", + unicodeslot=0x11EF7, + }, + [0x11EF8]={ + category="po", + description="MAKASAR END OF SECTION", + direction="l", + linebreak="al", + unicodeslot=0x11EF8, + }, [0x12000]={ category="lo", description="CUNEIFORM SIGN A", @@ -192135,6 +195105,643 @@ characters.data={ linebreak="al", unicodeslot=0x16B8F, }, + [0x16E40]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER M", + direction="l", + linebreak="al", + unicodeslot=0x16E40, + }, + [0x16E41]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER S", + direction="l", + linebreak="al", + unicodeslot=0x16E41, + }, + [0x16E42]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER V", + direction="l", + linebreak="al", + unicodeslot=0x16E42, + }, + [0x16E43]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER W", + direction="l", + linebreak="al", + unicodeslot=0x16E43, + }, + [0x16E44]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER ATIU", + direction="l", + linebreak="al", + unicodeslot=0x16E44, + }, + [0x16E45]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER Z", + direction="l", + linebreak="al", + unicodeslot=0x16E45, + }, + [0x16E46]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER KP", + direction="l", + linebreak="al", + unicodeslot=0x16E46, + }, + [0x16E47]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER P", + direction="l", + linebreak="al", + unicodeslot=0x16E47, + }, + [0x16E48]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER T", + direction="l", + linebreak="al", + unicodeslot=0x16E48, + }, + [0x16E49]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER G", + direction="l", + linebreak="al", + unicodeslot=0x16E49, + }, + [0x16E4A]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER F", + direction="l", + linebreak="al", + unicodeslot=0x16E4A, + }, + [0x16E4B]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER I", + direction="l", + linebreak="al", + unicodeslot=0x16E4B, + }, + [0x16E4C]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER K", + direction="l", + linebreak="al", + unicodeslot=0x16E4C, + }, + [0x16E4D]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER A", + direction="l", + linebreak="al", + unicodeslot=0x16E4D, + }, + [0x16E4E]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER J", + direction="l", + linebreak="al", + unicodeslot=0x16E4E, + }, + [0x16E4F]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER E", + direction="l", + linebreak="al", + unicodeslot=0x16E4F, + }, + [0x16E50]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER B", + direction="l", + linebreak="al", + unicodeslot=0x16E50, + }, + [0x16E51]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER C", + direction="l", + linebreak="al", + unicodeslot=0x16E51, + }, + [0x16E52]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER U", + direction="l", + linebreak="al", + unicodeslot=0x16E52, + }, + [0x16E53]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER YU", + direction="l", + linebreak="al", + unicodeslot=0x16E53, + }, + [0x16E54]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER L", + direction="l", + linebreak="al", + unicodeslot=0x16E54, + }, + [0x16E55]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER Q", + direction="l", + linebreak="al", + unicodeslot=0x16E55, + }, + [0x16E56]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER HP", + direction="l", + linebreak="al", + unicodeslot=0x16E56, + }, + [0x16E57]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER NY", + direction="l", + linebreak="al", + unicodeslot=0x16E57, + }, + [0x16E58]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER X", + direction="l", + linebreak="al", + unicodeslot=0x16E58, + }, + [0x16E59]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER D", + direction="l", + linebreak="al", + unicodeslot=0x16E59, + }, + [0x16E5A]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER OE", + direction="l", + linebreak="al", + unicodeslot=0x16E5A, + }, + [0x16E5B]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER N", + direction="l", + linebreak="al", + unicodeslot=0x16E5B, + }, + [0x16E5C]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER R", + direction="l", + linebreak="al", + unicodeslot=0x16E5C, + }, + [0x16E5D]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER O", + direction="l", + linebreak="al", + unicodeslot=0x16E5D, + }, + [0x16E5E]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER AI", + direction="l", + linebreak="al", + unicodeslot=0x16E5E, + }, + [0x16E5F]={ + category="lu", + description="MEDEFAIDRIN CAPITAL LETTER Y", + direction="l", + linebreak="al", + unicodeslot=0x16E5F, + }, + [0x16E60]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER M", + direction="l", + linebreak="al", + unicodeslot=0x16E60, + }, + [0x16E61]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER S", + direction="l", + linebreak="al", + unicodeslot=0x16E61, + }, + [0x16E62]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER V", + direction="l", + linebreak="al", + unicodeslot=0x16E62, + }, + [0x16E63]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER W", + direction="l", + linebreak="al", + unicodeslot=0x16E63, + }, + [0x16E64]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER ATIU", + direction="l", + linebreak="al", + unicodeslot=0x16E64, + }, + [0x16E65]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER Z", + direction="l", + linebreak="al", + unicodeslot=0x16E65, + }, + [0x16E66]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER KP", + direction="l", + linebreak="al", + unicodeslot=0x16E66, + }, + [0x16E67]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER P", + direction="l", + linebreak="al", + unicodeslot=0x16E67, + }, + [0x16E68]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER T", + direction="l", + linebreak="al", + unicodeslot=0x16E68, + }, + [0x16E69]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER G", + direction="l", + linebreak="al", + unicodeslot=0x16E69, + }, + [0x16E6A]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER F", + direction="l", + linebreak="al", + unicodeslot=0x16E6A, + }, + [0x16E6B]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER I", + direction="l", + linebreak="al", + unicodeslot=0x16E6B, + }, + [0x16E6C]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER K", + direction="l", + linebreak="al", + unicodeslot=0x16E6C, + }, + [0x16E6D]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER A", + direction="l", + linebreak="al", + unicodeslot=0x16E6D, + }, + [0x16E6E]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER J", + direction="l", + linebreak="al", + unicodeslot=0x16E6E, + }, + [0x16E6F]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER E", + direction="l", + linebreak="al", + unicodeslot=0x16E6F, + }, + [0x16E70]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER B", + direction="l", + linebreak="al", + unicodeslot=0x16E70, + }, + [0x16E71]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER C", + direction="l", + linebreak="al", + unicodeslot=0x16E71, + }, + [0x16E72]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER U", + direction="l", + linebreak="al", + unicodeslot=0x16E72, + }, + [0x16E73]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER YU", + direction="l", + linebreak="al", + unicodeslot=0x16E73, + }, + [0x16E74]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER L", + direction="l", + linebreak="al", + unicodeslot=0x16E74, + }, + [0x16E75]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER Q", + direction="l", + linebreak="al", + unicodeslot=0x16E75, + }, + [0x16E76]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER HP", + direction="l", + linebreak="al", + unicodeslot=0x16E76, + }, + [0x16E77]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER NY", + direction="l", + linebreak="al", + unicodeslot=0x16E77, + }, + [0x16E78]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER X", + direction="l", + linebreak="al", + unicodeslot=0x16E78, + }, + [0x16E79]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER D", + direction="l", + linebreak="al", + unicodeslot=0x16E79, + }, + [0x16E7A]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER OE", + direction="l", + linebreak="al", + unicodeslot=0x16E7A, + }, + [0x16E7B]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER N", + direction="l", + linebreak="al", + unicodeslot=0x16E7B, + }, + [0x16E7C]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER R", + direction="l", + linebreak="al", + unicodeslot=0x16E7C, + }, + [0x16E7D]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER O", + direction="l", + linebreak="al", + unicodeslot=0x16E7D, + }, + [0x16E7E]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER AI", + direction="l", + linebreak="al", + unicodeslot=0x16E7E, + }, + [0x16E7F]={ + category="ll", + description="MEDEFAIDRIN SMALL LETTER Y", + direction="l", + linebreak="al", + unicodeslot=0x16E7F, + }, + [0x16E80]={ + category="no", + description="MEDEFAIDRIN DIGIT ZERO", + direction="l", + linebreak="al", + unicodeslot=0x16E80, + }, + [0x16E81]={ + category="no", + description="MEDEFAIDRIN DIGIT ONE", + direction="l", + linebreak="al", + unicodeslot=0x16E81, + }, + [0x16E82]={ + category="no", + description="MEDEFAIDRIN DIGIT TWO", + direction="l", + linebreak="al", + unicodeslot=0x16E82, + }, + [0x16E83]={ + category="no", + description="MEDEFAIDRIN DIGIT THREE", + direction="l", + linebreak="al", + unicodeslot=0x16E83, + }, + [0x16E84]={ + category="no", + description="MEDEFAIDRIN DIGIT FOUR", + direction="l", + linebreak="al", + unicodeslot=0x16E84, + }, + [0x16E85]={ + category="no", + description="MEDEFAIDRIN DIGIT FIVE", + direction="l", + linebreak="al", + unicodeslot=0x16E85, + }, + [0x16E86]={ + category="no", + description="MEDEFAIDRIN DIGIT SIX", + direction="l", + linebreak="al", + unicodeslot=0x16E86, + }, + [0x16E87]={ + category="no", + description="MEDEFAIDRIN DIGIT SEVEN", + direction="l", + linebreak="al", + unicodeslot=0x16E87, + }, + [0x16E88]={ + category="no", + description="MEDEFAIDRIN DIGIT EIGHT", + direction="l", + linebreak="al", + unicodeslot=0x16E88, + }, + [0x16E89]={ + category="no", + description="MEDEFAIDRIN DIGIT NINE", + direction="l", + linebreak="al", + unicodeslot=0x16E89, + }, + [0x16E8A]={ + category="no", + description="MEDEFAIDRIN NUMBER TEN", + direction="l", + linebreak="al", + unicodeslot=0x16E8A, + }, + [0x16E8B]={ + category="no", + description="MEDEFAIDRIN NUMBER ELEVEN", + direction="l", + linebreak="al", + unicodeslot=0x16E8B, + }, + [0x16E8C]={ + category="no", + description="MEDEFAIDRIN NUMBER TWELVE", + direction="l", + linebreak="al", + unicodeslot=0x16E8C, + }, + [0x16E8D]={ + category="no", + description="MEDEFAIDRIN NUMBER THIRTEEN", + direction="l", + linebreak="al", + unicodeslot=0x16E8D, + }, + [0x16E8E]={ + category="no", + description="MEDEFAIDRIN NUMBER FOURTEEN", + direction="l", + linebreak="al", + unicodeslot=0x16E8E, + }, + [0x16E8F]={ + category="no", + description="MEDEFAIDRIN NUMBER FIFTEEN", + direction="l", + linebreak="al", + unicodeslot=0x16E8F, + }, + [0x16E90]={ + category="no", + description="MEDEFAIDRIN NUMBER SIXTEEN", + direction="l", + linebreak="al", + unicodeslot=0x16E90, + }, + [0x16E91]={ + category="no", + description="MEDEFAIDRIN NUMBER SEVENTEEN", + direction="l", + linebreak="al", + unicodeslot=0x16E91, + }, + [0x16E92]={ + category="no", + description="MEDEFAIDRIN NUMBER EIGHTEEN", + direction="l", + linebreak="al", + unicodeslot=0x16E92, + }, + [0x16E93]={ + category="no", + description="MEDEFAIDRIN NUMBER NINETEEN", + direction="l", + linebreak="al", + unicodeslot=0x16E93, + }, + [0x16E94]={ + category="no", + description="MEDEFAIDRIN DIGIT ONE ALTERNATE FORM", + direction="l", + linebreak="al", + unicodeslot=0x16E94, + }, + [0x16E95]={ + category="no", + description="MEDEFAIDRIN DIGIT TWO ALTERNATE FORM", + direction="l", + linebreak="al", + unicodeslot=0x16E95, + }, + [0x16E96]={ + category="no", + description="MEDEFAIDRIN DIGIT THREE ALTERNATE FORM", + direction="l", + linebreak="al", + unicodeslot=0x16E96, + }, + [0x16E97]={ + category="po", + description="MEDEFAIDRIN COMMA", + direction="l", + linebreak="ba", + unicodeslot=0x16E97, + }, + [0x16E98]={ + category="po", + description="MEDEFAIDRIN FULL STOP", + direction="l", + linebreak="ba", + unicodeslot=0x16E98, + }, + [0x16E99]={ + category="po", + description="MEDEFAIDRIN SYMBOL AIVA", + direction="l", + linebreak="al", + unicodeslot=0x16E99, + }, + [0x16E9A]={ + category="po", + description="MEDEFAIDRIN EXCLAMATION OH", + direction="l", + linebreak="al", + unicodeslot=0x16E9A, + }, [0x16F00]={ category="lo", description="MIAO LETTER PA", @@ -209493,6 +213100,146 @@ characters.data={ linebreak="al", unicodeslot=0x1D245, }, + [0x1D2E0]={ + category="no", + description="MAYAN NUMERAL ZERO", + direction="l", + linebreak="al", + unicodeslot=0x1D2E0, + }, + [0x1D2E1]={ + category="no", + description="MAYAN NUMERAL ONE", + direction="l", + linebreak="al", + unicodeslot=0x1D2E1, + }, + [0x1D2E2]={ + category="no", + description="MAYAN NUMERAL TWO", + direction="l", + linebreak="al", + unicodeslot=0x1D2E2, + }, + [0x1D2E3]={ + category="no", + description="MAYAN NUMERAL THREE", + direction="l", + linebreak="al", + unicodeslot=0x1D2E3, + }, + [0x1D2E4]={ + category="no", + description="MAYAN NUMERAL FOUR", + direction="l", + linebreak="al", + unicodeslot=0x1D2E4, + }, + [0x1D2E5]={ + category="no", + description="MAYAN NUMERAL FIVE", + direction="l", + linebreak="al", + unicodeslot=0x1D2E5, + }, + [0x1D2E6]={ + category="no", + description="MAYAN NUMERAL SIX", + direction="l", + linebreak="al", + unicodeslot=0x1D2E6, + }, + [0x1D2E7]={ + category="no", + description="MAYAN NUMERAL SEVEN", + direction="l", + linebreak="al", + unicodeslot=0x1D2E7, + }, + [0x1D2E8]={ + category="no", + description="MAYAN NUMERAL EIGHT", + direction="l", + linebreak="al", + unicodeslot=0x1D2E8, + }, + [0x1D2E9]={ + category="no", + description="MAYAN NUMERAL NINE", + direction="l", + linebreak="al", + unicodeslot=0x1D2E9, + }, + [0x1D2EA]={ + category="no", + description="MAYAN NUMERAL TEN", + direction="l", + linebreak="al", + unicodeslot=0x1D2EA, + }, + [0x1D2EB]={ + category="no", + description="MAYAN NUMERAL ELEVEN", + direction="l", + linebreak="al", + unicodeslot=0x1D2EB, + }, + [0x1D2EC]={ + category="no", + description="MAYAN NUMERAL TWELVE", + direction="l", + linebreak="al", + unicodeslot=0x1D2EC, + }, + [0x1D2ED]={ + category="no", + description="MAYAN NUMERAL THIRTEEN", + direction="l", + linebreak="al", + unicodeslot=0x1D2ED, + }, + [0x1D2EE]={ + category="no", + description="MAYAN NUMERAL FOURTEEN", + direction="l", + linebreak="al", + unicodeslot=0x1D2EE, + }, + [0x1D2EF]={ + category="no", + description="MAYAN NUMERAL FIFTEEN", + direction="l", + linebreak="al", + unicodeslot=0x1D2EF, + }, + [0x1D2F0]={ + category="no", + description="MAYAN NUMERAL SIXTEEN", + direction="l", + linebreak="al", + unicodeslot=0x1D2F0, + }, + [0x1D2F1]={ + category="no", + description="MAYAN NUMERAL SEVENTEEN", + direction="l", + linebreak="al", + unicodeslot=0x1D2F1, + }, + [0x1D2F2]={ + category="no", + description="MAYAN NUMERAL EIGHTEEN", + direction="l", + linebreak="al", + unicodeslot=0x1D2F2, + }, + [0x1D2F3]={ + category="no", + description="MAYAN NUMERAL NINETEEN", + direction="l", + linebreak="al", + unicodeslot=0x1D2F3, + }, [0x1D300]={ category="so", description="MONOGRAM FOR EARTH", @@ -210228,6 +213975,55 @@ characters.data={ linebreak="al", unicodeslot=0x1D371, }, + [0x1D372]={ + category="no", + description="IDEOGRAPHIC TALLY MARK ONE", + direction="l", + linebreak="al", + unicodeslot=0x1D372, + }, + [0x1D373]={ + category="no", + description="IDEOGRAPHIC TALLY MARK TWO", + direction="l", + linebreak="al", + unicodeslot=0x1D373, + }, + [0x1D374]={ + category="no", + description="IDEOGRAPHIC TALLY MARK THREE", + direction="l", + linebreak="al", + unicodeslot=0x1D374, + }, + [0x1D375]={ + category="no", + description="IDEOGRAPHIC TALLY MARK FOUR", + direction="l", + linebreak="al", + unicodeslot=0x1D375, + }, + [0x1D376]={ + category="no", + description="IDEOGRAPHIC TALLY MARK FIVE", + direction="l", + linebreak="al", + unicodeslot=0x1D376, + }, + [0x1D377]={ + category="no", + description="TALLY MARK ONE", + direction="l", + linebreak="al", + unicodeslot=0x1D377, + }, + [0x1D378]={ + category="no", + description="TALLY MARK FIVE", + direction="l", + linebreak="al", + unicodeslot=0x1D378, + }, [0x1D400]={ category="lu", description="MATHEMATICAL BOLD CAPITAL A", @@ -226170,6 +229966,482 @@ characters.data={ linebreak="op", unicodeslot=0x1E95F, }, + [0x1EC71]={ + category="no", + description="INDIC SIYAQ NUMBER ONE", + direction="al", + linebreak="al", + unicodeslot=0x1EC71, + }, + [0x1EC72]={ + category="no", + description="INDIC SIYAQ NUMBER TWO", + direction="al", + linebreak="al", + unicodeslot=0x1EC72, + }, + [0x1EC73]={ + category="no", + description="INDIC SIYAQ NUMBER THREE", + direction="al", + linebreak="al", + unicodeslot=0x1EC73, + }, + [0x1EC74]={ + category="no", + description="INDIC SIYAQ NUMBER FOUR", + direction="al", + linebreak="al", + unicodeslot=0x1EC74, + }, + [0x1EC75]={ + category="no", + description="INDIC SIYAQ NUMBER FIVE", + direction="al", + linebreak="al", + unicodeslot=0x1EC75, + }, + [0x1EC76]={ + category="no", + description="INDIC SIYAQ NUMBER SIX", + direction="al", + linebreak="al", + unicodeslot=0x1EC76, + }, + [0x1EC77]={ + category="no", + description="INDIC SIYAQ NUMBER SEVEN", + direction="al", + linebreak="al", + unicodeslot=0x1EC77, + }, + [0x1EC78]={ + category="no", + description="INDIC SIYAQ NUMBER EIGHT", + direction="al", + linebreak="al", + unicodeslot=0x1EC78, + }, + [0x1EC79]={ + category="no", + description="INDIC SIYAQ NUMBER NINE", + direction="al", + linebreak="al", + unicodeslot=0x1EC79, + }, + [0x1EC7A]={ + category="no", + description="INDIC SIYAQ NUMBER TEN", + direction="al", + linebreak="al", + unicodeslot=0x1EC7A, + }, + [0x1EC7B]={ + category="no", + description="INDIC SIYAQ NUMBER TWENTY", + direction="al", + linebreak="al", + unicodeslot=0x1EC7B, + }, + [0x1EC7C]={ + category="no", + description="INDIC SIYAQ NUMBER THIRTY", + direction="al", + linebreak="al", + unicodeslot=0x1EC7C, + }, + [0x1EC7D]={ + category="no", + description="INDIC SIYAQ NUMBER FORTY", + direction="al", + linebreak="al", + unicodeslot=0x1EC7D, + }, + [0x1EC7E]={ + category="no", + description="INDIC SIYAQ NUMBER FIFTY", + direction="al", + linebreak="al", + unicodeslot=0x1EC7E, + }, + [0x1EC7F]={ + category="no", + description="INDIC SIYAQ NUMBER SIXTY", + direction="al", + linebreak="al", + unicodeslot=0x1EC7F, + }, + [0x1EC80]={ + category="no", + description="INDIC SIYAQ NUMBER SEVENTY", + direction="al", + linebreak="al", + unicodeslot=0x1EC80, + }, + [0x1EC81]={ + category="no", + description="INDIC SIYAQ NUMBER EIGHTY", + direction="al", + linebreak="al", + unicodeslot=0x1EC81, + }, + [0x1EC82]={ + category="no", + description="INDIC SIYAQ NUMBER NINETY", + direction="al", + linebreak="al", + unicodeslot=0x1EC82, + }, + [0x1EC83]={ + category="no", + description="INDIC SIYAQ NUMBER ONE HUNDRED", + direction="al", + linebreak="al", + unicodeslot=0x1EC83, + }, + [0x1EC84]={ + category="no", + description="INDIC SIYAQ NUMBER TWO HUNDRED", + direction="al", + linebreak="al", + unicodeslot=0x1EC84, + }, + [0x1EC85]={ + category="no", + description="INDIC SIYAQ NUMBER THREE HUNDRED", + direction="al", + linebreak="al", + unicodeslot=0x1EC85, + }, + [0x1EC86]={ + category="no", + description="INDIC SIYAQ NUMBER FOUR HUNDRED", + direction="al", + linebreak="al", + unicodeslot=0x1EC86, + }, + [0x1EC87]={ + category="no", + description="INDIC SIYAQ NUMBER FIVE HUNDRED", + direction="al", + linebreak="al", + unicodeslot=0x1EC87, + }, + [0x1EC88]={ + category="no", + description="INDIC SIYAQ NUMBER SIX HUNDRED", + direction="al", + linebreak="al", + unicodeslot=0x1EC88, + }, + [0x1EC89]={ + category="no", + description="INDIC SIYAQ NUMBER SEVEN HUNDRED", + direction="al", + linebreak="al", + unicodeslot=0x1EC89, + }, + [0x1EC8A]={ + category="no", + description="INDIC SIYAQ NUMBER EIGHT HUNDRED", + direction="al", + linebreak="al", + unicodeslot=0x1EC8A, + }, + [0x1EC8B]={ + category="no", + description="INDIC SIYAQ NUMBER NINE HUNDRED", + direction="al", + linebreak="al", + unicodeslot=0x1EC8B, + }, + [0x1EC8C]={ + category="no", + description="INDIC SIYAQ NUMBER ONE THOUSAND", + direction="al", + linebreak="al", + unicodeslot=0x1EC8C, + }, + [0x1EC8D]={ + category="no", + description="INDIC SIYAQ NUMBER TWO THOUSAND", + direction="al", + linebreak="al", + unicodeslot=0x1EC8D, + }, + [0x1EC8E]={ + category="no", + description="INDIC SIYAQ NUMBER THREE THOUSAND", + direction="al", + linebreak="al", + unicodeslot=0x1EC8E, + }, + [0x1EC8F]={ + category="no", + description="INDIC SIYAQ NUMBER FOUR THOUSAND", + direction="al", + linebreak="al", + unicodeslot=0x1EC8F, + }, + [0x1EC90]={ + category="no", + description="INDIC SIYAQ NUMBER FIVE THOUSAND", + direction="al", + linebreak="al", + unicodeslot=0x1EC90, + }, + [0x1EC91]={ + category="no", + description="INDIC SIYAQ NUMBER SIX THOUSAND", + direction="al", + linebreak="al", + unicodeslot=0x1EC91, + }, + [0x1EC92]={ + category="no", + description="INDIC SIYAQ NUMBER SEVEN THOUSAND", + direction="al", + linebreak="al", + unicodeslot=0x1EC92, + }, + [0x1EC93]={ + category="no", + description="INDIC SIYAQ NUMBER EIGHT THOUSAND", + direction="al", + linebreak="al", + unicodeslot=0x1EC93, + }, + [0x1EC94]={ + category="no", + description="INDIC SIYAQ NUMBER NINE THOUSAND", + direction="al", + linebreak="al", + unicodeslot=0x1EC94, + }, + [0x1EC95]={ + category="no", + description="INDIC SIYAQ NUMBER TEN THOUSAND", + direction="al", + linebreak="al", + unicodeslot=0x1EC95, + }, + [0x1EC96]={ + category="no", + description="INDIC SIYAQ NUMBER TWENTY THOUSAND", + direction="al", + linebreak="al", + unicodeslot=0x1EC96, + }, + [0x1EC97]={ + category="no", + description="INDIC SIYAQ NUMBER THIRTY THOUSAND", + direction="al", + linebreak="al", + unicodeslot=0x1EC97, + }, + [0x1EC98]={ + category="no", + description="INDIC SIYAQ NUMBER FORTY THOUSAND", + direction="al", + linebreak="al", + unicodeslot=0x1EC98, + }, + [0x1EC99]={ + category="no", + description="INDIC SIYAQ NUMBER FIFTY THOUSAND", + direction="al", + linebreak="al", + unicodeslot=0x1EC99, + }, + [0x1EC9A]={ + category="no", + description="INDIC SIYAQ NUMBER SIXTY THOUSAND", + direction="al", + linebreak="al", + unicodeslot=0x1EC9A, + }, + [0x1EC9B]={ + category="no", + description="INDIC SIYAQ NUMBER SEVENTY THOUSAND", + direction="al", + linebreak="al", + unicodeslot=0x1EC9B, + }, + [0x1EC9C]={ + category="no", + description="INDIC SIYAQ NUMBER EIGHTY THOUSAND", + direction="al", + linebreak="al", + unicodeslot=0x1EC9C, + }, + [0x1EC9D]={ + category="no", + description="INDIC SIYAQ NUMBER NINETY THOUSAND", + direction="al", + linebreak="al", + unicodeslot=0x1EC9D, + }, + [0x1EC9E]={ + category="no", + description="INDIC SIYAQ NUMBER LAKH", + direction="al", + linebreak="al", + unicodeslot=0x1EC9E, + }, + [0x1EC9F]={ + category="no", + description="INDIC SIYAQ NUMBER LAKHAN", + direction="al", + linebreak="al", + unicodeslot=0x1EC9F, + }, + [0x1ECA0]={ + category="no", + description="INDIC SIYAQ LAKH MARK", + direction="al", + linebreak="al", + unicodeslot=0x1ECA0, + }, + [0x1ECA1]={ + category="no", + description="INDIC SIYAQ NUMBER KAROR", + direction="al", + linebreak="al", + unicodeslot=0x1ECA1, + }, + [0x1ECA2]={ + category="no", + description="INDIC SIYAQ NUMBER KARORAN", + direction="al", + linebreak="al", + unicodeslot=0x1ECA2, + }, + [0x1ECA3]={ + category="no", + description="INDIC SIYAQ NUMBER PREFIXED ONE", + direction="al", + linebreak="al", + unicodeslot=0x1ECA3, + }, + [0x1ECA4]={ + category="no", + description="INDIC SIYAQ NUMBER PREFIXED TWO", + direction="al", + linebreak="al", + unicodeslot=0x1ECA4, + }, + [0x1ECA5]={ + category="no", + description="INDIC SIYAQ NUMBER PREFIXED THREE", + direction="al", + linebreak="al", + unicodeslot=0x1ECA5, + }, + [0x1ECA6]={ + category="no", + description="INDIC SIYAQ NUMBER PREFIXED FOUR", + direction="al", + linebreak="al", + unicodeslot=0x1ECA6, + }, + [0x1ECA7]={ + category="no", + description="INDIC SIYAQ NUMBER PREFIXED FIVE", + direction="al", + linebreak="al", + unicodeslot=0x1ECA7, + }, + [0x1ECA8]={ + category="no", + description="INDIC SIYAQ NUMBER PREFIXED SIX", + direction="al", + linebreak="al", + unicodeslot=0x1ECA8, + }, + [0x1ECA9]={ + category="no", + description="INDIC SIYAQ NUMBER PREFIXED SEVEN", + direction="al", + linebreak="al", + unicodeslot=0x1ECA9, + }, + [0x1ECAA]={ + category="no", + description="INDIC SIYAQ NUMBER PREFIXED EIGHT", + direction="al", + linebreak="al", + unicodeslot=0x1ECAA, + }, + [0x1ECAB]={ + category="no", + description="INDIC SIYAQ NUMBER PREFIXED NINE", + direction="al", + linebreak="al", + unicodeslot=0x1ECAB, + }, + [0x1ECAC]={ + category="so", + description="INDIC SIYAQ PLACEHOLDER", + direction="al", + linebreak="po", + unicodeslot=0x1ECAC, + }, + [0x1ECAD]={ + category="no", + description="INDIC SIYAQ FRACTION ONE QUARTER", + direction="al", + linebreak="al", + unicodeslot=0x1ECAD, + }, + [0x1ECAE]={ + category="no", + description="INDIC SIYAQ FRACTION ONE HALF", + direction="al", + linebreak="al", + unicodeslot=0x1ECAE, + }, + [0x1ECAF]={ + category="no", + description="INDIC SIYAQ FRACTION THREE QUARTERS", + direction="al", + linebreak="al", + unicodeslot=0x1ECAF, + }, + [0x1ECB0]={ + category="sc", + description="INDIC SIYAQ RUPEE MARK", + direction="al", + linebreak="po", + unicodeslot=0x1ECB0, + }, + [0x1ECB1]={ + category="no", + description="INDIC SIYAQ NUMBER ALTERNATE ONE", + direction="al", + linebreak="al", + unicodeslot=0x1ECB1, + }, + [0x1ECB2]={ + category="no", + description="INDIC SIYAQ NUMBER ALTERNATE TWO", + direction="al", + linebreak="al", + unicodeslot=0x1ECB2, + }, + [0x1ECB3]={ + category="no", + description="INDIC SIYAQ NUMBER ALTERNATE TEN THOUSAND", + direction="al", + linebreak="al", + unicodeslot=0x1ECB3, + }, + [0x1ECB4]={ + category="no", + description="INDIC SIYAQ ALTERNATE LAKH MARK", + direction="al", + linebreak="al", + unicodeslot=0x1ECB4, + }, [0x1EE00]={ category="lo", comment="check math properties", @@ -229431,6 +233703,13 @@ characters.data={ specials={ "circle", 0x57, 0x5A }, unicodeslot=0x1F12E, }, + [0x1F12F]={ + category="so", + description="COPYLEFT SYMBOL", + direction="on", + linebreak="al", + unicodeslot=0x1F12F, + }, [0x1F130]={ category="so", cjkwd="a", @@ -239053,6 +243332,14 @@ characters.data={ linebreak="id", unicodeslot=0x1F6F8, }, + [0x1F6F9]={ + category="so", + cjkwd="w", + description="SKATEBOARD", + direction="on", + linebreak="id", + unicodeslot=0x1F6F9, + }, [0x1F700]={ category="so", description="ALCHEMICAL SYMBOL FOR QUINTESSENCE", @@ -240461,6 +244748,34 @@ characters.data={ linebreak="al", unicodeslot=0x1F7D4, }, + [0x1F7D5]={ + category="so", + description="CIRCLED TRIANGLE", + direction="on", + linebreak="id", + unicodeslot=0x1F7D5, + }, + [0x1F7D6]={ + category="so", + description="NEGATIVE CIRCLED TRIANGLE", + direction="on", + linebreak="id", + unicodeslot=0x1F7D6, + }, + [0x1F7D7]={ + category="so", + description="CIRCLED SQUARE", + direction="on", + linebreak="id", + unicodeslot=0x1F7D7, + }, + [0x1F7D8]={ + category="so", + description="NEGATIVE CIRCLED SQUARE", + direction="on", + linebreak="id", + unicodeslot=0x1F7D8, + }, [0x1F800]={ category="so", description="LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD", @@ -242067,6 +246382,30 @@ characters.data={ linebreak="id", unicodeslot=0x1F94C, }, + [0x1F94D]={ + category="so", + cjkwd="w", + description="LACROSSE STICK AND BALL", + direction="on", + linebreak="id", + unicodeslot=0x1F94D, + }, + [0x1F94E]={ + category="so", + cjkwd="w", + description="SOFTBALL", + direction="on", + linebreak="id", + unicodeslot=0x1F94E, + }, + [0x1F94F]={ + category="so", + cjkwd="w", + description="FLYING DISC", + direction="on", + linebreak="id", + unicodeslot=0x1F94F, + }, [0x1F950]={ category="so", cjkwd="w", @@ -242292,6 +246631,118 @@ characters.data={ linebreak="id", unicodeslot=0x1F96B, }, + [0x1F96C]={ + category="so", + cjkwd="w", + description="LEAFY GREEN", + direction="on", + linebreak="id", + unicodeslot=0x1F96C, + }, + [0x1F96D]={ + category="so", + cjkwd="w", + description="MANGO", + direction="on", + linebreak="id", + unicodeslot=0x1F96D, + }, + [0x1F96E]={ + category="so", + cjkwd="w", + description="MOON CAKE", + direction="on", + linebreak="id", + unicodeslot=0x1F96E, + }, + [0x1F96F]={ + category="so", + cjkwd="w", + description="BAGEL", + direction="on", + linebreak="id", + unicodeslot=0x1F96F, + }, + [0x1F970]={ + category="so", + cjkwd="w", + description="SMILING FACE WITH SMILING EYES AND THREE HEARTS", + direction="on", + linebreak="id", + unicodeslot=0x1F970, + }, + [0x1F973]={ + category="so", + cjkwd="w", + description="FACE WITH PARTY HORN AND PARTY HAT", + direction="on", + linebreak="id", + unicodeslot=0x1F973, + }, + [0x1F974]={ + category="so", + cjkwd="w", + description="FACE WITH UNEVEN EYES AND WAVY MOUTH", + direction="on", + linebreak="id", + unicodeslot=0x1F974, + }, + [0x1F975]={ + category="so", + cjkwd="w", + description="OVERHEATED FACE", + direction="on", + linebreak="id", + unicodeslot=0x1F975, + }, + [0x1F976]={ + category="so", + cjkwd="w", + description="FREEZING FACE", + direction="on", + linebreak="id", + unicodeslot=0x1F976, + }, + [0x1F97A]={ + category="so", + cjkwd="w", + description="FACE WITH PLEADING EYES", + direction="on", + linebreak="id", + unicodeslot=0x1F97A, + }, + [0x1F97C]={ + category="so", + cjkwd="w", + description="LAB COAT", + direction="on", + linebreak="id", + unicodeslot=0x1F97C, + }, + [0x1F97D]={ + category="so", + cjkwd="w", + description="GOGGLES", + direction="on", + linebreak="id", + unicodeslot=0x1F97D, + }, + [0x1F97E]={ + category="so", + cjkwd="w", + description="HIKING BOOT", + direction="on", + linebreak="id", + unicodeslot=0x1F97E, + }, + [0x1F97F]={ + category="so", + cjkwd="w", + description="FLAT SHOE", + direction="on", + linebreak="id", + unicodeslot=0x1F97F, + }, [0x1F980]={ category="so", cjkwd="w", @@ -242485,6 +246936,174 @@ characters.data={ linebreak="id", unicodeslot=0x1F997, }, + [0x1F998]={ + category="so", + cjkwd="w", + description="KANGAROO", + direction="on", + linebreak="id", + unicodeslot=0x1F998, + }, + [0x1F999]={ + category="so", + cjkwd="w", + description="LLAMA", + direction="on", + linebreak="id", + unicodeslot=0x1F999, + }, + [0x1F99A]={ + category="so", + cjkwd="w", + description="PEACOCK", + direction="on", + linebreak="id", + unicodeslot=0x1F99A, + }, + [0x1F99B]={ + category="so", + cjkwd="w", + description="HIPPOPOTAMUS", + direction="on", + linebreak="id", + unicodeslot=0x1F99B, + }, + [0x1F99C]={ + category="so", + cjkwd="w", + description="PARROT", + direction="on", + linebreak="id", + unicodeslot=0x1F99C, + }, + [0x1F99D]={ + category="so", + cjkwd="w", + description="RACCOON", + direction="on", + linebreak="id", + unicodeslot=0x1F99D, + }, + [0x1F99E]={ + category="so", + cjkwd="w", + description="LOBSTER", + direction="on", + linebreak="id", + unicodeslot=0x1F99E, + }, + [0x1F99F]={ + category="so", + cjkwd="w", + description="MOSQUITO", + direction="on", + linebreak="id", + unicodeslot=0x1F99F, + }, + [0x1F9A0]={ + category="so", + cjkwd="w", + description="MICROBE", + direction="on", + linebreak="id", + unicodeslot=0x1F9A0, + }, + [0x1F9A1]={ + category="so", + cjkwd="w", + description="BADGER", + direction="on", + linebreak="id", + unicodeslot=0x1F9A1, + }, + [0x1F9A2]={ + category="so", + cjkwd="w", + description="SWAN", + direction="on", + linebreak="id", + unicodeslot=0x1F9A2, + }, + [0x1F9B0]={ + category="so", + cjkwd="w", + description="EMOJI COMPONENT RED HAIR", + direction="on", + linebreak="id", + unicodeslot=0x1F9B0, + }, + [0x1F9B1]={ + category="so", + cjkwd="w", + description="EMOJI COMPONENT CURLY HAIR", + direction="on", + linebreak="id", + unicodeslot=0x1F9B1, + }, + [0x1F9B2]={ + category="so", + cjkwd="w", + description="EMOJI COMPONENT BALD", + direction="on", + linebreak="id", + unicodeslot=0x1F9B2, + }, + [0x1F9B3]={ + category="so", + cjkwd="w", + description="EMOJI COMPONENT WHITE HAIR", + direction="on", + linebreak="id", + unicodeslot=0x1F9B3, + }, + [0x1F9B4]={ + category="so", + cjkwd="w", + description="BONE", + direction="on", + linebreak="id", + unicodeslot=0x1F9B4, + }, + [0x1F9B5]={ + category="so", + cjkwd="w", + description="LEG", + direction="on", + linebreak="eb", + unicodeslot=0x1F9B5, + }, + [0x1F9B6]={ + category="so", + cjkwd="w", + description="FOOT", + direction="on", + linebreak="eb", + unicodeslot=0x1F9B6, + }, + [0x1F9B7]={ + category="so", + cjkwd="w", + description="TOOTH", + direction="on", + linebreak="id", + unicodeslot=0x1F9B7, + }, + [0x1F9B8]={ + category="so", + cjkwd="w", + description="SUPERHERO", + direction="on", + linebreak="eb", + unicodeslot=0x1F9B8, + }, + [0x1F9B9]={ + category="so", + cjkwd="w", + description="SUPERVILLAIN", + direction="on", + linebreak="eb", + unicodeslot=0x1F9B9, + }, [0x1F9C0]={ category="so", cjkwd="w", @@ -242493,6 +247112,22 @@ characters.data={ linebreak="id", unicodeslot=0x1F9C0, }, + [0x1F9C1]={ + category="so", + cjkwd="w", + description="CUPCAKE", + direction="on", + linebreak="id", + unicodeslot=0x1F9C1, + }, + [0x1F9C2]={ + category="so", + cjkwd="w", + description="SALT SHAKER", + direction="on", + linebreak="id", + unicodeslot=0x1F9C2, + }, [0x1F9D0]={ category="so", cjkwd="w", @@ -242677,6 +247312,304 @@ characters.data={ linebreak="id", unicodeslot=0x1F9E6, }, + [0x1F9E7]={ + category="so", + cjkwd="w", + description="RED GIFT ENVELOPE", + direction="on", + linebreak="id", + unicodeslot=0x1F9E7, + }, + [0x1F9E8]={ + category="so", + cjkwd="w", + description="FIRECRACKER", + direction="on", + linebreak="id", + unicodeslot=0x1F9E8, + }, + [0x1F9E9]={ + category="so", + cjkwd="w", + description="JIGSAW PUZZLE PIECE", + direction="on", + linebreak="id", + unicodeslot=0x1F9E9, + }, + [0x1F9EA]={ + category="so", + cjkwd="w", + description="TEST TUBE", + direction="on", + linebreak="id", + unicodeslot=0x1F9EA, + }, + [0x1F9EB]={ + category="so", + cjkwd="w", + description="PETRI DISH", + direction="on", + linebreak="id", + unicodeslot=0x1F9EB, + }, + [0x1F9EC]={ + category="so", + cjkwd="w", + description="DNA DOUBLE HELIX", + direction="on", + linebreak="id", + unicodeslot=0x1F9EC, + }, + [0x1F9ED]={ + category="so", + cjkwd="w", + description="COMPASS", + direction="on", + linebreak="id", + unicodeslot=0x1F9ED, + }, + [0x1F9EE]={ + category="so", + cjkwd="w", + description="ABACUS", + direction="on", + linebreak="id", + unicodeslot=0x1F9EE, + }, + [0x1F9EF]={ + category="so", + cjkwd="w", + description="FIRE EXTINGUISHER", + direction="on", + linebreak="id", + unicodeslot=0x1F9EF, + }, + [0x1F9F0]={ + category="so", + cjkwd="w", + description="TOOLBOX", + direction="on", + linebreak="id", + unicodeslot=0x1F9F0, + }, + [0x1F9F1]={ + category="so", + cjkwd="w", + description="BRICK", + direction="on", + linebreak="id", + unicodeslot=0x1F9F1, + }, + [0x1F9F2]={ + category="so", + cjkwd="w", + description="MAGNET", + direction="on", + linebreak="id", + unicodeslot=0x1F9F2, + }, + [0x1F9F3]={ + category="so", + cjkwd="w", + description="LUGGAGE", + direction="on", + linebreak="id", + unicodeslot=0x1F9F3, + }, + [0x1F9F4]={ + category="so", + cjkwd="w", + description="LOTION BOTTLE", + direction="on", + linebreak="id", + unicodeslot=0x1F9F4, + }, + [0x1F9F5]={ + category="so", + cjkwd="w", + description="SPOOL OF THREAD", + direction="on", + linebreak="id", + unicodeslot=0x1F9F5, + }, + [0x1F9F6]={ + category="so", + cjkwd="w", + description="BALL OF YARN", + direction="on", + linebreak="id", + unicodeslot=0x1F9F6, + }, + [0x1F9F7]={ + category="so", + cjkwd="w", + description="SAFETY PIN", + direction="on", + linebreak="id", + unicodeslot=0x1F9F7, + }, + [0x1F9F8]={ + category="so", + cjkwd="w", + description="TEDDY BEAR", + direction="on", + linebreak="id", + unicodeslot=0x1F9F8, + }, + [0x1F9F9]={ + category="so", + cjkwd="w", + description="BROOM", + direction="on", + linebreak="id", + unicodeslot=0x1F9F9, + }, + [0x1F9FA]={ + category="so", + cjkwd="w", + description="BASKET", + direction="on", + linebreak="id", + unicodeslot=0x1F9FA, + }, + [0x1F9FB]={ + category="so", + cjkwd="w", + description="ROLL OF PAPER", + direction="on", + linebreak="id", + unicodeslot=0x1F9FB, + }, + [0x1F9FC]={ + category="so", + cjkwd="w", + description="BAR OF SOAP", + direction="on", + linebreak="id", + unicodeslot=0x1F9FC, + }, + [0x1F9FD]={ + category="so", + cjkwd="w", + description="SPONGE", + direction="on", + linebreak="id", + unicodeslot=0x1F9FD, + }, + [0x1F9FE]={ + category="so", + cjkwd="w", + description="RECEIPT", + direction="on", + linebreak="id", + unicodeslot=0x1F9FE, + }, + [0x1F9FF]={ + category="so", + cjkwd="w", + description="NAZAR AMULET", + direction="on", + linebreak="id", + unicodeslot=0x1F9FF, + }, + [0x1FA60]={ + category="so", + description="XIANGQI RED GENERAL", + direction="on", + linebreak="id", + unicodeslot=0x1FA60, + }, + [0x1FA61]={ + category="so", + description="XIANGQI RED MANDARIN", + direction="on", + linebreak="id", + unicodeslot=0x1FA61, + }, + [0x1FA62]={ + category="so", + description="XIANGQI RED ELEPHANT", + direction="on", + linebreak="id", + unicodeslot=0x1FA62, + }, + [0x1FA63]={ + category="so", + description="XIANGQI RED HORSE", + direction="on", + linebreak="id", + unicodeslot=0x1FA63, + }, + [0x1FA64]={ + category="so", + description="XIANGQI RED CHARIOT", + direction="on", + linebreak="id", + unicodeslot=0x1FA64, + }, + [0x1FA65]={ + category="so", + description="XIANGQI RED CANNON", + direction="on", + linebreak="id", + unicodeslot=0x1FA65, + }, + [0x1FA66]={ + category="so", + description="XIANGQI RED SOLDIER", + direction="on", + linebreak="id", + unicodeslot=0x1FA66, + }, + [0x1FA67]={ + category="so", + description="XIANGQI BLACK GENERAL", + direction="on", + linebreak="id", + unicodeslot=0x1FA67, + }, + [0x1FA68]={ + category="so", + description="XIANGQI BLACK MANDARIN", + direction="on", + linebreak="id", + unicodeslot=0x1FA68, + }, + [0x1FA69]={ + category="so", + description="XIANGQI BLACK ELEPHANT", + direction="on", + linebreak="id", + unicodeslot=0x1FA69, + }, + [0x1FA6A]={ + category="so", + description="XIANGQI BLACK HORSE", + direction="on", + linebreak="id", + unicodeslot=0x1FA6A, + }, + [0x1FA6B]={ + category="so", + description="XIANGQI BLACK CHARIOT", + direction="on", + linebreak="id", + unicodeslot=0x1FA6B, + }, + [0x1FA6C]={ + category="so", + description="XIANGQI BLACK CANNON", + direction="on", + linebreak="id", + unicodeslot=0x1FA6C, + }, + [0x1FA6D]={ + category="so", + description="XIANGQI BLACK SOLDIER", + direction="on", + linebreak="id", + unicodeslot=0x1FA6D, + }, [0x2F800]={ category="lo", cjkwd="w", @@ -248239,4 +253172,4 @@ characters.data={ synonyms={ "vs17" }, unicodeslot=0xE0100, }, -} +} \ No newline at end of file diff --git a/tex/context/base/mkiv/char-emj.lua b/tex/context/base/mkiv/char-emj.lua index 718d3bc6e..187bb6712 100644 --- a/tex/context/base/mkiv/char-emj.lua +++ b/tex/context/base/mkiv/char-emj.lua @@ -15,6 +15,7 @@ return { ["3rd place medal"]={ 0x1F949 }, ["a button (blood type)"]={ 0x1F170 }, ["ab button (blood type)"]={ 0x1F18E }, + ["abacus"]={ 0x1F9EE }, ["admission tickets"]={ 0x1F39F }, ["adult"]={ 0x1F9D1 }, ["adult: dark skin tone"]={ 0x1F9D1, 0x1F3FF }, @@ -48,8 +49,8 @@ return { ["ant"]={ 0x1F41C }, ["antarctica"]={ 0x1F1E6, 0x1F1F6 }, ["antenna bars"]={ 0x1F4F6 }, - ["anticlockwise arrows button"]={ 0x1F504 }, ["antigua & barbuda"]={ 0x1F1E6, 0x1F1EC }, + ["anxious face with sweat"]={ 0x1F630 }, ["aquarius"]={ 0x2652 }, ["argentina"]={ 0x1F1E6, 0x1F1F7 }, ["aries"]={ 0x2648 }, @@ -108,12 +109,15 @@ return { ["backhand index pointing up: medium-dark skin tone"]={ 0x1F446, 0x1F3FE }, ["backhand index pointing up: medium-light skin tone"]={ 0x1F446, 0x1F3FC }, ["bacon"]={ 0x1F953 }, + ["badger"]={ 0x1F9A1 }, ["badminton"]={ 0x1F3F8 }, + ["bagel"]={ 0x1F96F }, ["baggage claim"]={ 0x1F6C4 }, ["baguette bread"]={ 0x1F956 }, ["bahamas"]={ 0x1F1E7, 0x1F1F8 }, ["bahrain"]={ 0x1F1E7, 0x1F1ED }, ["balance scale"]={ 0x2696 }, + ["bald"]={ 0x1F9B2 }, ["balloon"]={ 0x1F388 }, ["ballot box with ballot"]={ 0x1F5F3 }, ["ballot box with check"]={ 0x2611 }, @@ -124,11 +128,13 @@ return { ["barbados"]={ 0x1F1E7, 0x1F1E7 }, ["barber pole"]={ 0x1F488 }, ["baseball"]={ 0x26BE }, + ["basket"]={ 0x1F9FA }, ["basketball"]={ 0x1F3C0 }, ["bat"]={ 0x1F987 }, ["bathtub"]={ 0x1F6C1 }, ["battery"]={ 0x1F50B }, ["beach with umbrella"]={ 0x1F3D6 }, + ["beaming face with smiling eyes"]={ 0x1F601 }, ["bear face"]={ 0x1F43B }, ["bearded person"]={ 0x1F9D4 }, ["bearded person: dark skin tone"]={ 0x1F9D4, 0x1F3FF }, @@ -190,6 +196,7 @@ return { ["boar"]={ 0x1F417 }, ["bolivia"]={ 0x1F1E7, 0x1F1F4 }, ["bomb"]={ 0x1F4A3 }, + ["bone"]={ 0x1F9B4 }, ["bookmark"]={ 0x1F516 }, ["bookmark tabs"]={ 0x1F4D1 }, ["books"]={ 0x1F4DA }, @@ -217,6 +224,7 @@ return { ["breast-feeding: medium skin tone"]={ 0x1F931, 0x1F3FD }, ["breast-feeding: medium-dark skin tone"]={ 0x1F931, 0x1F3FE }, ["breast-feeding: medium-light skin tone"]={ 0x1F931, 0x1F3FC }, + ["bricks"]={ 0x1F9F1 }, ["bride with veil"]={ 0x1F470 }, ["bride with veil: dark skin tone"]={ 0x1F470, 0x1F3FF }, ["bride with veil: light skin tone"]={ 0x1F470, 0x1F3FB }, @@ -230,10 +238,12 @@ return { ["british virgin islands"]={ 0x1F1FB, 0x1F1EC }, ["broccoli"]={ 0x1F966 }, ["broken heart"]={ 0x1F494 }, + ["broom"]={ 0x1F9F9 }, ["brunei"]={ 0x1F1E7, 0x1F1F3 }, ["bug"]={ 0x1F41B }, ["building construction"]={ 0x1F3D7 }, ["bulgaria"]={ 0x1F1E7, 0x1F1EC }, + ["bullet train"]={ 0x1F685 }, ["burkina faso"]={ 0x1F1E7, 0x1F1EB }, ["burrito"]={ 0x1F32F }, ["burundi"]={ 0x1F1E7, 0x1F1EE }, @@ -289,6 +299,7 @@ return { ["chequered flag"]={ 0x1F3C1 }, ["cherries"]={ 0x1F352 }, ["cherry blossom"]={ 0x1F338 }, + ["chess pawn"]={ 0x265F }, ["chestnut"]={ 0x1F330 }, ["chicken"]={ 0x1F414 }, ["child"]={ 0x1F9D2 }, @@ -344,10 +355,12 @@ return { ["coconut"]={ 0x1F965 }, ["cocos (keeling) islands"]={ 0x1F1E8, 0x1F1E8 }, ["coffin"]={ 0x26B0 }, + ["cold face"]={ 0x1F976 }, ["collision"]={ 0x1F4A5 }, ["colombia"]={ 0x1F1E8, 0x1F1F4 }, ["comet"]={ 0x2604 }, ["comoros"]={ 0x1F1F0, 0x1F1F2 }, + ["compass"]={ 0x1F9ED }, ["computer disk"]={ 0x1F4BD }, ["computer mouse"]={ 0x1F5B1 }, ["confetti ball"]={ 0x1F38A }, @@ -372,6 +385,7 @@ return { ["copyright"]={ 0xA9 }, ["costa rica"]={ 0x1F1E8, 0x1F1F7 }, ["couch and lamp"]={ 0x1F6CB }, + ["counterclockwise arrows button"]={ 0x1F504 }, ["couple with heart"]={ 0x1F491 }, ["couple with heart: man, man"]={ 0x1F468, 0x200D, 0x2764, 0x200D, 0x1F468 }, ["couple with heart: woman, man"]={ 0x1F469, 0x200D, 0x2764, 0x200D, 0x1F468 }, @@ -381,10 +395,10 @@ return { ["cowboy hat face"]={ 0x1F920 }, ["crab"]={ 0x1F980 }, ["crayon"]={ 0x1F58D }, - ["crazy face"]={ 0x1F92A }, ["credit card"]={ 0x1F4B3 }, ["crescent moon"]={ 0x1F319 }, - ["cricket"]={ 0x1F3CF }, + ["cricket"]={ 0x1F997 }, + ["cricket game"]={ 0x1F3CF }, ["croatia"]={ 0x1F1ED, 0x1F1F7 }, ["crocodile"]={ 0x1F40A }, ["croissant"]={ 0x1F950 }, @@ -405,9 +419,11 @@ return { ["cuba"]={ 0x1F1E8, 0x1F1FA }, ["cucumber"]={ 0x1F952 }, ["cup with straw"]={ 0x1F964 }, + ["cupcake"]={ 0x1F9C1 }, ["curaçao"]={ 0x1F1E8, 0x1F1FC }, ["curling stone"]={ 0x1F94C }, ["curly loop"]={ 0x27B0 }, + ["curly-haired"]={ 0x1F9B1 }, ["currency exchange"]={ 0x1F4B1 }, ["curry rice"]={ 0x1F35B }, ["custard"]={ 0x1F36E }, @@ -419,6 +435,7 @@ return { ["côte d’ivoire"]={ 0x1F1E8, 0x1F1EE }, ["dagger"]={ 0x1F5E1 }, ["dango"]={ 0x1F361 }, + ["dark skin tone"]={ 0x1F3FF }, ["dashing away"]={ 0x1F4A8 }, ["deciduous tree"]={ 0x1F333 }, ["deer"]={ 0x1F98C }, @@ -440,11 +457,11 @@ return { ["diego garcia"]={ 0x1F1E9, 0x1F1EC }, ["dim button"]={ 0x1F505 }, ["direct hit"]={ 0x1F3AF }, - ["disappointed but relieved face"]={ 0x1F625 }, ["disappointed face"]={ 0x1F61E }, ["dizzy"]={ 0x1F4AB }, ["dizzy face"]={ 0x1F635 }, ["djibouti"]={ 0x1F1E9, 0x1F1EF }, + ["dna"]={ 0x1F9EC }, ["dog"]={ 0x1F415 }, ["dog face"]={ 0x1F436 }, ["dollar banknote"]={ 0x1F4B5 }, @@ -458,9 +475,10 @@ return { ["doughnut"]={ 0x1F369 }, ["dove"]={ 0x1F54A }, ["down arrow"]={ 0x2B07 }, - ["down button"]={ 0x1F53D }, ["down-left arrow"]={ 0x2199 }, ["down-right arrow"]={ 0x2198 }, + ["downcast face with sweat"]={ 0x1F613 }, + ["downwards button"]={ 0x1F53D }, ["dragon"]={ 0x1F409 }, ["dragon face"]={ 0x1F432 }, ["dress"]={ 0x1F457 }, @@ -519,25 +537,21 @@ return { ["eye in speech bubble"]={ 0x1F441, 0x200D, 0x1F5E8 }, ["eyes"]={ 0x1F440 }, ["face blowing a kiss"]={ 0x1F618 }, - ["face savouring delicious food"]={ 0x1F60B }, + ["face savoring food"]={ 0x1F60B }, ["face screaming in fear"]={ 0x1F631 }, ["face vomiting"]={ 0x1F92E }, - ["face with cold sweat"]={ 0x1F613 }, ["face with hand over mouth"]={ 0x1F92D }, ["face with head-bandage"]={ 0x1F915 }, ["face with medical mask"]={ 0x1F637 }, ["face with monocle"]={ 0x1F9D0 }, ["face with open mouth"]={ 0x1F62E }, - ["face with open mouth & cold sweat"]={ 0x1F630 }, ["face with raised eyebrow"]={ 0x1F928 }, ["face with rolling eyes"]={ 0x1F644 }, ["face with steam from nose"]={ 0x1F624 }, - ["face with stuck-out tongue"]={ 0x1F61B }, - ["face with stuck-out tongue & closed eyes"]={ 0x1F61D }, - ["face with stuck-out tongue & winking eye"]={ 0x1F61C }, - ["face with symbols over mouth"]={ 0x1F92C }, + ["face with symbols on mouth"]={ 0x1F92C }, ["face with tears of joy"]={ 0x1F602 }, ["face with thermometer"]={ 0x1F912 }, + ["face with tongue"]={ 0x1F61B }, ["face without mouth"]={ 0x1F636 }, ["factory"]={ 0x1F3ED }, ["fairy"]={ 0x1F9DA }, @@ -593,9 +607,11 @@ return { ["finland"]={ 0x1F1EB, 0x1F1EE }, ["fire"]={ 0x1F525 }, ["fire engine"]={ 0x1F692 }, + ["fire extinguisher"]={ 0x1F9EF }, + ["firecracker"]={ 0x1F9E8 }, ["fireworks"]={ 0x1F386 }, ["first quarter moon"]={ 0x1F313 }, - ["first quarter moon with face"]={ 0x1F31B }, + ["first quarter moon face"]={ 0x1F31B }, ["fish"]={ 0x1F41F }, ["fish cake with swirl"]={ 0x1F365 }, ["fishing pole"]={ 0x1F3A3 }, @@ -613,6 +629,7 @@ return { ["floppy disk"]={ 0x1F4BE }, ["flower playing cards"]={ 0x1F3B4 }, ["flushed face"]={ 0x1F633 }, + ["flying disc"]={ 0x1F94F }, ["flying saucer"]={ 0x1F6F8 }, ["fog"]={ 0x1F32B }, ["foggy"]={ 0x1F301 }, @@ -622,6 +639,12 @@ return { ["folded hands: medium skin tone"]={ 0x1F64F, 0x1F3FD }, ["folded hands: medium-dark skin tone"]={ 0x1F64F, 0x1F3FE }, ["folded hands: medium-light skin tone"]={ 0x1F64F, 0x1F3FC }, + ["foot"]={ 0x1F9B6 }, + ["foot: dark skin tone"]={ 0x1F9B6, 0x1F3FF }, + ["foot: light skin tone"]={ 0x1F9B6, 0x1F3FB }, + ["foot: medium skin tone"]={ 0x1F9B6, 0x1F3FD }, + ["foot: medium-dark skin tone"]={ 0x1F9B6, 0x1F3FE }, + ["foot: medium-light skin tone"]={ 0x1F9B6, 0x1F3FC }, ["footprints"]={ 0x1F463 }, ["fork and knife"]={ 0x1F374 }, ["fork and knife with plate"]={ 0x1F37D }, @@ -646,7 +669,7 @@ return { ["frowning face with open mouth"]={ 0x1F626 }, ["fuel pump"]={ 0x26FD }, ["full moon"]={ 0x1F315 }, - ["full moon with face"]={ 0x1F31D }, + ["full moon face"]={ 0x1F31D }, ["funeral urn"]={ 0x26B1 }, ["gabon"]={ 0x1F1EC, 0x1F1E6 }, ["gambia"]={ 0x1F1EC, 0x1F1F2 }, @@ -678,6 +701,7 @@ return { ["goal net"]={ 0x1F945 }, ["goat"]={ 0x1F410 }, ["goblin"]={ 0x1F47A }, + ["goggles"]={ 0x1F97D }, ["gorilla"]={ 0x1F98D }, ["graduation cap"]={ 0x1F393 }, ["grapes"]={ 0x1F347 }, @@ -689,9 +713,13 @@ return { ["greenland"]={ 0x1F1EC, 0x1F1F1 }, ["grenada"]={ 0x1F1EC, 0x1F1E9 }, ["grimacing face"]={ 0x1F62C }, + ["grinning cat face"]={ 0x1F63A }, ["grinning cat face with smiling eyes"]={ 0x1F638 }, ["grinning face"]={ 0x1F600 }, - ["grinning face with smiling eyes"]={ 0x1F601 }, + ["grinning face with big eyes"]={ 0x1F603 }, + ["grinning face with smiling eyes"]={ 0x1F604 }, + ["grinning face with sweat"]={ 0x1F605 }, + ["grinning squinting face"]={ 0x1F606 }, ["growing heart"]={ 0x1F497 }, ["guadeloupe"]={ 0x1F1EC, 0x1F1F5 }, ["guam"]={ 0x1F1EC, 0x1F1FA }, @@ -713,6 +741,12 @@ return { ["hammer and pick"]={ 0x2692 }, ["hammer and wrench"]={ 0x1F6E0 }, ["hamster face"]={ 0x1F439 }, + ["hand with fingers splayed"]={ 0x1F590 }, + ["hand with fingers splayed: dark skin tone"]={ 0x1F590, 0x1F3FF }, + ["hand with fingers splayed: light skin tone"]={ 0x1F590, 0x1F3FB }, + ["hand with fingers splayed: medium skin tone"]={ 0x1F590, 0x1F3FD }, + ["hand with fingers splayed: medium-dark skin tone"]={ 0x1F590, 0x1F3FE }, + ["hand with fingers splayed: medium-light skin tone"]={ 0x1F590, 0x1F3FC }, ["handbag"]={ 0x1F45C }, ["handshake"]={ 0x1F91D }, ["hatching chick"]={ 0x1F423 }, @@ -738,7 +772,8 @@ return { ["high voltage"]={ 0x26A1 }, ["high-heeled shoe"]={ 0x1F460 }, ["high-speed train"]={ 0x1F684 }, - ["high-speed train with bullet nose"]={ 0x1F685 }, + ["hiking boot"]={ 0x1F97E }, + ["hippopotamus"]={ 0x1F99B }, ["hole"]={ 0x1F573 }, ["honduras"]={ 0x1F1ED, 0x1F1F3 }, ["honey pot"]={ 0x1F36F }, @@ -756,13 +791,15 @@ return { ["hospital"]={ 0x1F3E5 }, ["hot beverage"]={ 0x2615 }, ["hot dog"]={ 0x1F32D }, + ["hot face"]={ 0x1F975 }, ["hot pepper"]={ 0x1F336 }, ["hot springs"]={ 0x2668 }, ["hotel"]={ 0x1F3E8 }, - ["hourglass"]={ 0x231B }, - ["hourglass with flowing sand"]={ 0x23F3 }, + ["hourglass done"]={ 0x231B }, + ["hourglass not done"]={ 0x23F3 }, ["house"]={ 0x1F3E0 }, ["house with garden"]={ 0x1F3E1 }, + ["houses"]={ 0x1F3D8 }, ["hugging face"]={ 0x1F917 }, ["hundred points"]={ 0x1F4AF }, ["hungary"]={ 0x1F1ED, 0x1F1FA }, @@ -782,6 +819,7 @@ return { ["index pointing up: medium-light skin tone"]={ 0x261D, 0x1F3FC }, ["india"]={ 0x1F1EE, 0x1F1F3 }, ["indonesia"]={ 0x1F1EE, 0x1F1E9 }, + ["infinity"]={ 0x267E }, ["information"]={ 0x2139 }, ["input latin letters"]={ 0x1F524 }, ["input latin lowercase"]={ 0x1F521 }, @@ -820,17 +858,19 @@ return { ["japanese “vacancy” button"]={ 0x1F233 }, ["jeans"]={ 0x1F456 }, ["jersey"]={ 0x1F1EF, 0x1F1EA }, + ["jigsaw"]={ 0x1F9E9 }, ["joker"]={ 0x1F0CF }, ["jordan"]={ 0x1F1EF, 0x1F1F4 }, ["joystick"]={ 0x1F579 }, ["kaaba"]={ 0x1F54B }, + ["kangaroo"]={ 0x1F998 }, ["kazakhstan"]={ 0x1F1F0, 0x1F1FF }, ["kenya"]={ 0x1F1F0, 0x1F1EA }, ["key"]={ 0x1F511 }, ["keyboard"]={ 0x2328 }, - ["keycap 10"]={ 0x1F51F }, ["keycap: 0"]={ 0x30, 0x20E3 }, ["keycap: 1"]={ 0x31, 0x20E3 }, + ["keycap: 10"]={ 0x1F51F }, ["keycap: 2"]={ 0x32, 0x20E3 }, ["keycap: 3"]={ 0x33, 0x20E3 }, ["keycap: 4"]={ 0x34, 0x20E3 }, @@ -849,7 +889,7 @@ return { ["kiss: man, man"]={ 0x1F468, 0x200D, 0x2764, 0x200D, 0x1F48B, 0x200D, 0x1F468 }, ["kiss: woman, man"]={ 0x1F469, 0x200D, 0x2764, 0x200D, 0x1F48B, 0x200D, 0x1F468 }, ["kiss: woman, woman"]={ 0x1F469, 0x200D, 0x2764, 0x200D, 0x1F48B, 0x200D, 0x1F469 }, - ["kissing cat face with closed eyes"]={ 0x1F63D }, + ["kissing cat face"]={ 0x1F63D }, ["kissing face"]={ 0x1F617 }, ["kissing face with closed eyes"]={ 0x1F61A }, ["kissing face with smiling eyes"]={ 0x1F619 }, @@ -859,18 +899,21 @@ return { ["kosovo"]={ 0x1F1FD, 0x1F1F0 }, ["kuwait"]={ 0x1F1F0, 0x1F1FC }, ["kyrgyzstan"]={ 0x1F1F0, 0x1F1EC }, + ["lab coat"]={ 0x1F97C }, ["label"]={ 0x1F3F7 }, + ["lacrosse"]={ 0x1F94D }, ["lady beetle"]={ 0x1F41E }, ["laos"]={ 0x1F1F1, 0x1F1E6 }, ["laptop computer"]={ 0x1F4BB }, ["large blue diamond"]={ 0x1F537 }, ["large orange diamond"]={ 0x1F536 }, ["last quarter moon"]={ 0x1F317 }, - ["last quarter moon with face"]={ 0x1F31C }, + ["last quarter moon face"]={ 0x1F31C }, ["last track button"]={ 0x23EE }, ["latin cross"]={ 0x271D }, ["latvia"]={ 0x1F1F1, 0x1F1FB }, ["leaf fluttering in wind"]={ 0x1F343 }, + ["leafy green"]={ 0x1F96C }, ["lebanon"]={ 0x1F1F1, 0x1F1E7 }, ["ledger"]={ 0x1F4D2 }, ["left arrow"]={ 0x2B05 }, @@ -883,8 +926,13 @@ return { ["left-facing fist: medium skin tone"]={ 0x1F91B, 0x1F3FD }, ["left-facing fist: medium-dark skin tone"]={ 0x1F91B, 0x1F3FE }, ["left-facing fist: medium-light skin tone"]={ 0x1F91B, 0x1F3FC }, - ["left-pointing magnifying glass"]={ 0x1F50D }, ["left-right arrow"]={ 0x2194 }, + ["leg"]={ 0x1F9B5 }, + ["leg: dark skin tone"]={ 0x1F9B5, 0x1F3FF }, + ["leg: light skin tone"]={ 0x1F9B5, 0x1F3FB }, + ["leg: medium skin tone"]={ 0x1F9B5, 0x1F3FD }, + ["leg: medium-dark skin tone"]={ 0x1F9B5, 0x1F3FE }, + ["leg: medium-light skin tone"]={ 0x1F9B5, 0x1F3FC }, ["lemon"]={ 0x1F34B }, ["leo"]={ 0x264C }, ["leopard"]={ 0x1F406 }, @@ -896,6 +944,7 @@ return { ["liechtenstein"]={ 0x1F1F1, 0x1F1EE }, ["light bulb"]={ 0x1F4A1 }, ["light rail"]={ 0x1F688 }, + ["light skin tone"]={ 0x1F3FB }, ["link"]={ 0x1F517 }, ["linked paperclips"]={ 0x1F587 }, ["lion face"]={ 0x1F981 }, @@ -903,11 +952,14 @@ return { ["lithuania"]={ 0x1F1F1, 0x1F1F9 }, ["litter in bin sign"]={ 0x1F6AE }, ["lizard"]={ 0x1F98E }, + ["llama"]={ 0x1F999 }, + ["lobster"]={ 0x1F99E }, ["locked"]={ 0x1F512 }, ["locked with key"]={ 0x1F510 }, ["locked with pen"]={ 0x1F50F }, ["locomotive"]={ 0x1F682 }, ["lollipop"]={ 0x1F36D }, + ["lotion bottle"]={ 0x1F9F4 }, ["loudly crying face"]={ 0x1F62D }, ["loudspeaker"]={ 0x1F4E2 }, ["love hotel"]={ 0x1F3E9 }, @@ -918,6 +970,7 @@ return { ["love-you gesture: medium skin tone"]={ 0x1F91F, 0x1F3FD }, ["love-you gesture: medium-dark skin tone"]={ 0x1F91F, 0x1F3FE }, ["love-you gesture: medium-light skin tone"]={ 0x1F91F, 0x1F3FC }, + ["luggage"]={ 0x1F9F3 }, ["luxembourg"]={ 0x1F1F1, 0x1F1FA }, ["lying face"]={ 0x1F925 }, ["macau sar china"]={ 0x1F1F2, 0x1F1F4 }, @@ -929,6 +982,9 @@ return { ["mage: medium skin tone"]={ 0x1F9D9, 0x1F3FD }, ["mage: medium-dark skin tone"]={ 0x1F9D9, 0x1F3FE }, ["mage: medium-light skin tone"]={ 0x1F9D9, 0x1F3FC }, + ["magnet"]={ 0x1F9F2 }, + ["magnifying glass tilted left"]={ 0x1F50D }, + ["magnifying glass tilted right"]={ 0x1F50E }, ["mahjong red dragon"]={ 0x1F004 }, ["malawi"]={ 0x1F1F2, 0x1F1FC }, ["malaysia"]={ 0x1F1F2, 0x1F1FE }, @@ -1089,12 +1145,6 @@ return { ["man health worker: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x2695 }, ["man health worker: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x2695 }, ["man health worker: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x2695 }, - ["man in business suit levitating"]={ 0x1F574 }, - ["man in business suit levitating: dark skin tone"]={ 0x1F574, 0x1F3FF }, - ["man in business suit levitating: light skin tone"]={ 0x1F574, 0x1F3FB }, - ["man in business suit levitating: medium skin tone"]={ 0x1F574, 0x1F3FD }, - ["man in business suit levitating: medium-dark skin tone"]={ 0x1F574, 0x1F3FE }, - ["man in business suit levitating: medium-light skin tone"]={ 0x1F574, 0x1F3FC }, ["man in lotus position"]={ 0x1F9D8, 0x200D, 0x2642 }, ["man in lotus position: dark skin tone"]={ 0x1F9D8, 0x1F3FF, 0x200D, 0x2642 }, ["man in lotus position: light skin tone"]={ 0x1F9D8, 0x1F3FB, 0x200D, 0x2642 }, @@ -1107,6 +1157,12 @@ return { ["man in steamy room: medium skin tone"]={ 0x1F9D6, 0x1F3FD, 0x200D, 0x2642 }, ["man in steamy room: medium-dark skin tone"]={ 0x1F9D6, 0x1F3FE, 0x200D, 0x2642 }, ["man in steamy room: medium-light skin tone"]={ 0x1F9D6, 0x1F3FC, 0x200D, 0x2642 }, + ["man in suit levitating"]={ 0x1F574 }, + ["man in suit levitating: dark skin tone"]={ 0x1F574, 0x1F3FF }, + ["man in suit levitating: light skin tone"]={ 0x1F574, 0x1F3FB }, + ["man in suit levitating: medium skin tone"]={ 0x1F574, 0x1F3FD }, + ["man in suit levitating: medium-dark skin tone"]={ 0x1F574, 0x1F3FE }, + ["man in suit levitating: medium-light skin tone"]={ 0x1F574, 0x1F3FC }, ["man in tuxedo"]={ 0x1F935 }, ["man in tuxedo: dark skin tone"]={ 0x1F935, 0x1F3FF }, ["man in tuxedo: light skin tone"]={ 0x1F935, 0x1F3FB }, @@ -1227,6 +1283,18 @@ return { ["man student: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F393 }, ["man student: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F393 }, ["man student: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F393 }, + ["man superhero"]={ 0x1F9B8, 0x200D, 0x2642 }, + ["man superhero: dark skin tone"]={ 0x1F9B8, 0x1F3FF, 0x200D, 0x2642 }, + ["man superhero: light skin tone"]={ 0x1F9B8, 0x1F3FB, 0x200D, 0x2642 }, + ["man superhero: medium skin tone"]={ 0x1F9B8, 0x1F3FD, 0x200D, 0x2642 }, + ["man superhero: medium-dark skin tone"]={ 0x1F9B8, 0x1F3FE, 0x200D, 0x2642 }, + ["man superhero: medium-light skin tone"]={ 0x1F9B8, 0x1F3FC, 0x200D, 0x2642 }, + ["man supervillain"]={ 0x1F9B9, 0x200D, 0x2642 }, + ["man supervillain: dark skin tone"]={ 0x1F9B9, 0x1F3FF, 0x200D, 0x2642 }, + ["man supervillain: light skin tone"]={ 0x1F9B9, 0x1F3FB, 0x200D, 0x2642 }, + ["man supervillain: medium skin tone"]={ 0x1F9B9, 0x1F3FD, 0x200D, 0x2642 }, + ["man supervillain: medium-dark skin tone"]={ 0x1F9B9, 0x1F3FE, 0x200D, 0x2642 }, + ["man supervillain: medium-light skin tone"]={ 0x1F9B9, 0x1F3FC, 0x200D, 0x2642 }, ["man surfing"]={ 0x1F3C4, 0x200D, 0x2642 }, ["man surfing: dark skin tone"]={ 0x1F3C4, 0x1F3FF, 0x200D, 0x2642 }, ["man surfing: light skin tone"]={ 0x1F3C4, 0x1F3FB, 0x200D, 0x2642 }, @@ -1282,11 +1350,36 @@ return { ["man with chinese cap: medium-dark skin tone"]={ 0x1F472, 0x1F3FE }, ["man with chinese cap: medium-light skin tone"]={ 0x1F472, 0x1F3FC }, ["man zombie"]={ 0x1F9DF, 0x200D, 0x2642 }, + ["man, bald"]={ 0x1F468, 0x200D, 0x1F9B2 }, + ["man, bald: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x1F9B2 }, + ["man, bald: light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x1F9B2 }, + ["man, bald: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F9B2 }, + ["man, bald: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F9B2 }, + ["man, bald: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F9B2 }, + ["man, curly haired"]={ 0x1F468, 0x200D, 0x1F9B1 }, + ["man, curly haired: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x1F9B1 }, + ["man, curly haired: light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x1F9B1 }, + ["man, curly haired: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F9B1 }, + ["man, curly haired: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F9B1 }, + ["man, curly haired: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F9B1 }, + ["man, red haired"]={ 0x1F468, 0x200D, 0x1F9B0 }, + ["man, red haired: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x1F9B0 }, + ["man, red haired: light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x1F9B0 }, + ["man, red haired: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F9B0 }, + ["man, red haired: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F9B0 }, + ["man, red haired: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F9B0 }, + ["man, white haired"]={ 0x1F468, 0x200D, 0x1F9B3 }, + ["man, white haired: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x1F9B3 }, + ["man, white haired: light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x1F9B3 }, + ["man, white haired: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F9B3 }, + ["man, white haired: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F9B3 }, + ["man, white haired: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F9B3 }, ["man: dark skin tone"]={ 0x1F468, 0x1F3FF }, ["man: light skin tone"]={ 0x1F468, 0x1F3FB }, ["man: medium skin tone"]={ 0x1F468, 0x1F3FD }, ["man: medium-dark skin tone"]={ 0x1F468, 0x1F3FE }, ["man: medium-light skin tone"]={ 0x1F468, 0x1F3FC }, + ["mango"]={ 0x1F96D }, ["mantelpiece clock"]={ 0x1F570 }, ["man’s shoe"]={ 0x1F45E }, ["map of japan"]={ 0x1F5FE }, @@ -1299,10 +1392,13 @@ return { ["mayotte"]={ 0x1F1FE, 0x1F1F9 }, ["meat on bone"]={ 0x1F356 }, ["medical symbol"]={ 0x2695 }, + ["medium skin tone"]={ 0x1F3FD }, + ["medium-dark skin tone"]={ 0x1F3FE }, + ["medium-light skin tone"]={ 0x1F3FC }, ["megaphone"]={ 0x1F4E3 }, ["melon"]={ 0x1F348 }, ["memo"]={ 0x1F4DD }, - ["men with bunny ears partying"]={ 0x1F46F, 0x200D, 0x2642 }, + ["men with bunny ears"]={ 0x1F46F, 0x200D, 0x2642 }, ["men wrestling"]={ 0x1F93C, 0x200D, 0x2642 }, ["menorah"]={ 0x1F54E }, ["men’s room"]={ 0x1F6B9 }, @@ -1326,6 +1422,7 @@ return { ["merperson: medium-light skin tone"]={ 0x1F9DC, 0x1F3FC }, ["metro"]={ 0x1F687 }, ["mexico"]={ 0x1F1F2, 0x1F1FD }, + ["microbe"]={ 0x1F9A0 }, ["micronesia"]={ 0x1F1EB, 0x1F1F2 }, ["microphone"]={ 0x1F3A4 }, ["microscope"]={ 0x1F52C }, @@ -1353,9 +1450,11 @@ return { ["monorail"]={ 0x1F69D }, ["montenegro"]={ 0x1F1F2, 0x1F1EA }, ["montserrat"]={ 0x1F1F2, 0x1F1F8 }, + ["moon cake"]={ 0x1F96E }, ["moon viewing ceremony"]={ 0x1F391 }, ["morocco"]={ 0x1F1F2, 0x1F1E6 }, ["mosque"]={ 0x1F54C }, + ["mosquito"]={ 0x1F99F }, ["motor boat"]={ 0x1F6E5 }, ["motor scooter"]={ 0x1F6F5 }, ["motorcycle"]={ 0x1F3CD }, @@ -1393,6 +1492,7 @@ return { ["national park"]={ 0x1F3DE }, ["nauru"]={ 0x1F1F3, 0x1F1F7 }, ["nauseated face"]={ 0x1F922 }, + ["nazar amulet"]={ 0x1F9FF }, ["necktie"]={ 0x1F454 }, ["nepal"]={ 0x1F1F3, 0x1F1F5 }, ["nerd face"]={ 0x1F913 }, @@ -1521,21 +1621,24 @@ return { ["paperclip"]={ 0x1F4CE }, ["papua new guinea"]={ 0x1F1F5, 0x1F1EC }, ["paraguay"]={ 0x1F1F5, 0x1F1FE }, + ["parrot"]={ 0x1F99C }, ["part alternation mark"]={ 0x303D }, ["party popper"]={ 0x1F389 }, + ["partying face"]={ 0x1F973 }, ["passenger ship"]={ 0x1F6F3 }, ["passport control"]={ 0x1F6C2 }, ["pause button"]={ 0x23F8 }, ["paw prints"]={ 0x1F43E }, ["peace symbol"]={ 0x262E }, ["peach"]={ 0x1F351 }, + ["peacock"]={ 0x1F99A }, ["peanuts"]={ 0x1F95C }, ["pear"]={ 0x1F350 }, ["pen"]={ 0x1F58A }, ["pencil"]={ 0x270F }, ["penguin"]={ 0x1F427 }, ["pensive face"]={ 0x1F614 }, - ["people with bunny ears partying"]={ 0x1F46F }, + ["people with bunny ears"]={ 0x1F46F }, ["people wrestling"]={ 0x1F93C }, ["performing arts"]={ 0x1F3AD }, ["persevering face"]={ 0x1F623 }, @@ -1727,6 +1830,7 @@ return { ["person wearing turban: medium-dark skin tone"]={ 0x1F473, 0x1F3FE }, ["person wearing turban: medium-light skin tone"]={ 0x1F473, 0x1F3FC }, ["peru"]={ 0x1F1F5, 0x1F1EA }, + ["petri dish"]={ 0x1F9EB }, ["philippines"]={ 0x1F1F5, 0x1F1ED }, ["pick"]={ 0x26CF }, ["pie"]={ 0x1F967 }, @@ -1738,6 +1842,7 @@ return { ["pine decoration"]={ 0x1F38D }, ["pineapple"]={ 0x1F34D }, ["ping pong"]={ 0x1F3D3 }, + ["pirate flag"]={ 0x1F3F4, 0x200D, 0x2620 }, ["pisces"]={ 0x2653 }, ["pistol"]={ 0x1F52B }, ["pitcairn islands"]={ 0x1F1F5, 0x1F1F3 }, @@ -1745,6 +1850,7 @@ return { ["place of worship"]={ 0x1F6D0 }, ["play button"]={ 0x25B6 }, ["play or pause button"]={ 0x23EF }, + ["pleading face"]={ 0x1F97A }, ["poland"]={ 0x1F1F5, 0x1F1F1 }, ["police car"]={ 0x1F693 }, ["police car light"]={ 0x1F6A8 }, @@ -1798,6 +1904,7 @@ return { ["question mark"]={ 0x2753 }, ["rabbit"]={ 0x1F407 }, ["rabbit face"]={ 0x1F430 }, + ["raccoon"]={ 0x1F99D }, ["racing car"]={ 0x1F3CE }, ["radio"]={ 0x1F4FB }, ["radio button"]={ 0x1F518 }, @@ -1819,12 +1926,6 @@ return { ["raised fist: medium-dark skin tone"]={ 0x270A, 0x1F3FE }, ["raised fist: medium-light skin tone"]={ 0x270A, 0x1F3FC }, ["raised hand"]={ 0x270B }, - ["raised hand with fingers splayed"]={ 0x1F590 }, - ["raised hand with fingers splayed: dark skin tone"]={ 0x1F590, 0x1F3FF }, - ["raised hand with fingers splayed: light skin tone"]={ 0x1F590, 0x1F3FB }, - ["raised hand with fingers splayed: medium skin tone"]={ 0x1F590, 0x1F3FD }, - ["raised hand with fingers splayed: medium-dark skin tone"]={ 0x1F590, 0x1F3FE }, - ["raised hand with fingers splayed: medium-light skin tone"]={ 0x1F590, 0x1F3FC }, ["raised hand: dark skin tone"]={ 0x270B, 0x1F3FF }, ["raised hand: light skin tone"]={ 0x270B, 0x1F3FB }, ["raised hand: medium skin tone"]={ 0x270B, 0x1F3FD }, @@ -1838,14 +1939,17 @@ return { ["raising hands: medium-light skin tone"]={ 0x1F64C, 0x1F3FC }, ["ram"]={ 0x1F40F }, ["rat"]={ 0x1F400 }, + ["receipt"]={ 0x1F9FE }, ["record button"]={ 0x23FA }, ["recycling symbol"]={ 0x267B }, ["red apple"]={ 0x1F34E }, ["red circle"]={ 0x1F534 }, + ["red envelope"]={ 0x1F9E7 }, ["red heart"]={ 0x2764 }, ["red paper lantern"]={ 0x1F3EE }, ["red triangle pointed down"]={ 0x1F53B }, ["red triangle pointed up"]={ 0x1F53A }, + ["red-haired"]={ 0x1F9B0 }, ["registered"]={ 0xAE }, ["relieved face"]={ 0x1F60C }, ["reminder ribbon"]={ 0x1F397 }, @@ -1870,11 +1974,11 @@ return { ["right-facing fist: medium skin tone"]={ 0x1F91C, 0x1F3FD }, ["right-facing fist: medium-dark skin tone"]={ 0x1F91C, 0x1F3FE }, ["right-facing fist: medium-light skin tone"]={ 0x1F91C, 0x1F3FC }, - ["right-pointing magnifying glass"]={ 0x1F50E }, ["ring"]={ 0x1F48D }, ["roasted sweet potato"]={ 0x1F360 }, ["robot face"]={ 0x1F916 }, ["rocket"]={ 0x1F680 }, + ["roll of paper"]={ 0x1F9FB }, ["rolled-up newspaper"]={ 0x1F5DE }, ["roller coaster"]={ 0x1F3A2 }, ["rolling on the floor laughing"]={ 0x1F923 }, @@ -1889,9 +1993,12 @@ return { ["russia"]={ 0x1F1F7, 0x1F1FA }, ["rwanda"]={ 0x1F1F7, 0x1F1FC }, ["réunion"]={ 0x1F1F7, 0x1F1EA }, + ["sad but relieved face"]={ 0x1F625 }, + ["safety pin"]={ 0x1F9F7 }, ["sagittarius"]={ 0x2650 }, ["sailboat"]={ 0x26F5 }, ["sake"]={ 0x1F376 }, + ["salt"]={ 0x1F9C2 }, ["samoa"]={ 0x1F1FC, 0x1F1F8 }, ["san marino"]={ 0x1F1F8, 0x1F1F2 }, ["sandwich"]={ 0x1F96A }, @@ -1910,8 +2017,8 @@ return { ["school"]={ 0x1F3EB }, ["school backpack"]={ 0x1F392 }, ["scissors"]={ 0x2702 }, + ["scorpio"]={ 0x264F }, ["scorpion"]={ 0x1F982 }, - ["scorpius"]={ 0x264F }, ["scotland"]={ 0x1F3F4, 0xE0067, 0xE0062, 0xE0073, 0xE0063, 0xE0074, 0xE007F }, ["scroll"]={ 0x1F4DC }, ["seat"]={ 0x1F4BA }, @@ -1955,6 +2062,7 @@ return { ["sint maarten"]={ 0x1F1F8, 0x1F1FD }, ["six o’clock"]={ 0x1F555 }, ["six-thirty"]={ 0x1F561 }, + ["skateboard"]={ 0x1F6F9 }, ["skier"]={ 0x26F7 }, ["skis"]={ 0x1F3BF }, ["skull"]={ 0x1F480 }, @@ -1971,15 +2079,11 @@ return { ["small blue diamond"]={ 0x1F539 }, ["small orange diamond"]={ 0x1F538 }, ["smiling cat face with heart-eyes"]={ 0x1F63B }, - ["smiling cat face with open mouth"]={ 0x1F63A }, ["smiling face"]={ 0x263A }, + ["smiling face with 3 hearts"]={ 0x1F970 }, ["smiling face with halo"]={ 0x1F607 }, ["smiling face with heart-eyes"]={ 0x1F60D }, ["smiling face with horns"]={ 0x1F608 }, - ["smiling face with open mouth"]={ 0x1F603 }, - ["smiling face with open mouth & closed eyes"]={ 0x1F606 }, - ["smiling face with open mouth & cold sweat"]={ 0x1F605 }, - ["smiling face with open mouth & smiling eyes"]={ 0x1F604 }, ["smiling face with smiling eyes"]={ 0x1F60A }, ["smiling face with sunglasses"]={ 0x1F60E }, ["smirking face"]={ 0x1F60F }, @@ -1996,9 +2100,11 @@ return { ["snowflake"]={ 0x2744 }, ["snowman"]={ 0x2603 }, ["snowman without snow"]={ 0x26C4 }, + ["soap"]={ 0x1F9FC }, ["soccer ball"]={ 0x26BD }, ["socks"]={ 0x1F9E6 }, ["soft ice cream"]={ 0x1F366 }, + ["softball"]={ 0x1F94E }, ["solomon islands"]={ 0x1F1F8, 0x1F1E7 }, ["somalia"]={ 0x1F1F8, 0x1F1F4 }, ["soon arrow"]={ 0x1F51C }, @@ -2026,11 +2132,13 @@ return { ["spiral calendar"]={ 0x1F5D3 }, ["spiral notepad"]={ 0x1F5D2 }, ["spiral shell"]={ 0x1F41A }, + ["sponge"]={ 0x1F9FD }, ["spoon"]={ 0x1F944 }, ["sport utility vehicle"]={ 0x1F699 }, ["sports medal"]={ 0x1F3C5 }, ["spouting whale"]={ 0x1F433 }, ["squid"]={ 0x1F991 }, + ["squinting face with tongue"]={ 0x1F61D }, ["sri lanka"]={ 0x1F1F1, 0x1F1F0 }, ["st. barthélemy"]={ 0x1F1E7, 0x1F1F1 }, ["st. helena"]={ 0x1F1F8, 0x1F1ED }, @@ -2040,6 +2148,7 @@ return { ["st. pierre & miquelon"]={ 0x1F1F5, 0x1F1F2 }, ["st. vincent & grenadines"]={ 0x1F1FB, 0x1F1E8 }, ["stadium"]={ 0x1F3DF }, + ["star"]={ 0x2B50 }, ["star and crescent"]={ 0x262A }, ["star of david"]={ 0x2721 }, ["star-struck"]={ 0x1F929 }, @@ -2065,10 +2174,23 @@ return { ["sunrise"]={ 0x1F305 }, ["sunrise over mountains"]={ 0x1F304 }, ["sunset"]={ 0x1F307 }, + ["superhero"]={ 0x1F9B8 }, + ["superhero: dark skin tone"]={ 0x1F9B8, 0x1F3FF }, + ["superhero: light skin tone"]={ 0x1F9B8, 0x1F3FB }, + ["superhero: medium skin tone"]={ 0x1F9B8, 0x1F3FD }, + ["superhero: medium-dark skin tone"]={ 0x1F9B8, 0x1F3FE }, + ["superhero: medium-light skin tone"]={ 0x1F9B8, 0x1F3FC }, + ["supervillain"]={ 0x1F9B9 }, + ["supervillain: dark skin tone"]={ 0x1F9B9, 0x1F3FF }, + ["supervillain: light skin tone"]={ 0x1F9B9, 0x1F3FB }, + ["supervillain: medium skin tone"]={ 0x1F9B9, 0x1F3FD }, + ["supervillain: medium-dark skin tone"]={ 0x1F9B9, 0x1F3FE }, + ["supervillain: medium-light skin tone"]={ 0x1F9B9, 0x1F3FC }, ["suriname"]={ 0x1F1F8, 0x1F1F7 }, ["sushi"]={ 0x1F363 }, ["suspension railway"]={ 0x1F69F }, ["svalbard & jan mayen"]={ 0x1F1F8, 0x1F1EF }, + ["swan"]={ 0x1F9A2 }, ["swaziland"]={ 0x1F1F8, 0x1F1FF }, ["sweat droplets"]={ 0x1F4A6 }, ["sweden"]={ 0x1F1F8, 0x1F1EA }, @@ -2090,6 +2212,7 @@ return { ["taxi"]={ 0x1F695 }, ["teacup without handle"]={ 0x1F375 }, ["tear-off calendar"]={ 0x1F4C6 }, + ["teddy bear"]={ 0x1F9F8 }, ["telephone"]={ 0x260E }, ["telephone receiver"]={ 0x1F4DE }, ["telescope"]={ 0x1F52D }, @@ -2098,10 +2221,12 @@ return { ["ten-thirty"]={ 0x1F565 }, ["tennis"]={ 0x1F3BE }, ["tent"]={ 0x26FA }, + ["test tube"]={ 0x1F9EA }, ["thailand"]={ 0x1F1F9, 0x1F1ED }, ["thermometer"]={ 0x1F321 }, ["thinking face"]={ 0x1F914 }, ["thought balloon"]={ 0x1F4AD }, + ["thread"]={ 0x1F9F5 }, ["three o’clock"]={ 0x1F552 }, ["three-thirty"]={ 0x1F55E }, ["thumbs down"]={ 0x1F44E }, @@ -2129,6 +2254,8 @@ return { ["tomato"]={ 0x1F345 }, ["tonga"]={ 0x1F1F9, 0x1F1F4 }, ["tongue"]={ 0x1F445 }, + ["toolbox"]={ 0x1F9F0 }, + ["tooth"]={ 0x1F9B7 }, ["top arrow"]={ 0x1F51D }, ["top hat"]={ 0x1F3A9 }, ["tornado"]={ 0x1F32A }, @@ -2179,12 +2306,12 @@ return { ["united states"]={ 0x1F1FA, 0x1F1F8 }, ["unlocked"]={ 0x1F513 }, ["up arrow"]={ 0x2B06 }, - ["up button"]={ 0x1F53C }, ["up! button"]={ 0x1F199 }, ["up-down arrow"]={ 0x2195 }, ["up-left arrow"]={ 0x2196 }, ["up-right arrow"]={ 0x2197 }, ["upside-down face"]={ 0x1F643 }, + ["upwards button"]={ 0x1F53C }, ["uruguay"]={ 0x1F1FA, 0x1F1FE }, ["uzbekistan"]={ 0x1F1FA, 0x1F1FF }, ["vampire"]={ 0x1F9DB }, @@ -2253,16 +2380,17 @@ return { ["white heavy check mark"]={ 0x2705 }, ["white large square"]={ 0x2B1C }, ["white medium square"]={ 0x25FB }, - ["white medium star"]={ 0x2B50 }, ["white medium-small square"]={ 0x25FD }, ["white question mark"]={ 0x2754 }, ["white small square"]={ 0x25AB }, ["white square button"]={ 0x1F533 }, + ["white-haired"]={ 0x1F9B3 }, ["wilted flower"]={ 0x1F940 }, ["wind chime"]={ 0x1F390 }, ["wind face"]={ 0x1F32C }, ["wine glass"]={ 0x1F377 }, ["winking face"]={ 0x1F609 }, + ["winking face with tongue"]={ 0x1F61C }, ["wolf face"]={ 0x1F43A }, ["woman"]={ 0x1F469 }, ["woman artist"]={ 0x1F469, 0x200D, 0x1F3A8 }, @@ -2542,6 +2670,18 @@ return { ["woman student: medium skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F393 }, ["woman student: medium-dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F393 }, ["woman student: medium-light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F393 }, + ["woman superhero"]={ 0x1F9B8, 0x200D, 0x2640 }, + ["woman superhero: dark skin tone"]={ 0x1F9B8, 0x1F3FF, 0x200D, 0x2640 }, + ["woman superhero: light skin tone"]={ 0x1F9B8, 0x1F3FB, 0x200D, 0x2640 }, + ["woman superhero: medium skin tone"]={ 0x1F9B8, 0x1F3FD, 0x200D, 0x2640 }, + ["woman superhero: medium-dark skin tone"]={ 0x1F9B8, 0x1F3FE, 0x200D, 0x2640 }, + ["woman superhero: medium-light skin tone"]={ 0x1F9B8, 0x1F3FC, 0x200D, 0x2640 }, + ["woman supervillain"]={ 0x1F9B9, 0x200D, 0x2640 }, + ["woman supervillain: dark skin tone"]={ 0x1F9B9, 0x1F3FF, 0x200D, 0x2640 }, + ["woman supervillain: light skin tone"]={ 0x1F9B9, 0x1F3FB, 0x200D, 0x2640 }, + ["woman supervillain: medium skin tone"]={ 0x1F9B9, 0x1F3FD, 0x200D, 0x2640 }, + ["woman supervillain: medium-dark skin tone"]={ 0x1F9B9, 0x1F3FE, 0x200D, 0x2640 }, + ["woman supervillain: medium-light skin tone"]={ 0x1F9B9, 0x1F3FC, 0x200D, 0x2640 }, ["woman surfing"]={ 0x1F3C4, 0x200D, 0x2640 }, ["woman surfing: dark skin tone"]={ 0x1F3C4, 0x1F3FF, 0x200D, 0x2640 }, ["woman surfing: light skin tone"]={ 0x1F3C4, 0x1F3FB, 0x200D, 0x2640 }, @@ -2597,6 +2737,30 @@ return { ["woman with headscarf: medium-dark skin tone"]={ 0x1F9D5, 0x1F3FE }, ["woman with headscarf: medium-light skin tone"]={ 0x1F9D5, 0x1F3FC }, ["woman zombie"]={ 0x1F9DF, 0x200D, 0x2640 }, + ["woman, bald"]={ 0x1F469, 0x200D, 0x1F9B2 }, + ["woman, bald: dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x1F9B2 }, + ["woman, bald: light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x1F9B2 }, + ["woman, bald: medium skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F9B2 }, + ["woman, bald: medium-dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F9B2 }, + ["woman, bald: medium-light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F9B2 }, + ["woman, curly haired"]={ 0x1F469, 0x200D, 0x1F9B1 }, + ["woman, curly haired: dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x1F9B1 }, + ["woman, curly haired: light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x1F9B1 }, + ["woman, curly haired: medium skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F9B1 }, + ["woman, curly haired: medium-dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F9B1 }, + ["woman, curly haired: medium-light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F9B1 }, + ["woman, red haired"]={ 0x1F469, 0x200D, 0x1F9B0 }, + ["woman, red haired: dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x1F9B0 }, + ["woman, red haired: light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x1F9B0 }, + ["woman, red haired: medium skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F9B0 }, + ["woman, red haired: medium-dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F9B0 }, + ["woman, red haired: medium-light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F9B0 }, + ["woman, white haired"]={ 0x1F469, 0x200D, 0x1F9B3 }, + ["woman, white haired: dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x1F9B3 }, + ["woman, white haired: light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x1F9B3 }, + ["woman, white haired: medium skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F9B3 }, + ["woman, white haired: medium-dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F9B3 }, + ["woman, white haired: medium-light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F9B3 }, ["woman: dark skin tone"]={ 0x1F469, 0x1F3FF }, ["woman: light skin tone"]={ 0x1F469, 0x1F3FB }, ["woman: medium skin tone"]={ 0x1F469, 0x1F3FD }, @@ -2604,11 +2768,13 @@ return { ["woman: medium-light skin tone"]={ 0x1F469, 0x1F3FC }, ["woman’s boot"]={ 0x1F462 }, ["woman’s clothes"]={ 0x1F45A }, + ["woman’s flat shoe"]={ 0x1F97F }, ["woman’s hat"]={ 0x1F452 }, ["woman’s sandal"]={ 0x1F461 }, - ["women with bunny ears partying"]={ 0x1F46F, 0x200D, 0x2640 }, + ["women with bunny ears"]={ 0x1F46F, 0x200D, 0x2640 }, ["women wrestling"]={ 0x1F93C, 0x200D, 0x2640 }, ["women’s room"]={ 0x1F6BA }, + ["woozy face"]={ 0x1F974 }, ["world map"]={ 0x1F5FA }, ["worried face"]={ 0x1F61F }, ["wrapped gift"]={ 0x1F381 }, @@ -2619,11 +2785,13 @@ return { ["writing hand: medium skin tone"]={ 0x270D, 0x1F3FD }, ["writing hand: medium-dark skin tone"]={ 0x270D, 0x1F3FE }, ["writing hand: medium-light skin tone"]={ 0x270D, 0x1F3FC }, + ["yarn"]={ 0x1F9F6 }, ["yellow heart"]={ 0x1F49B }, ["yemen"]={ 0x1F1FE, 0x1F1EA }, ["yen banknote"]={ 0x1F4B4 }, ["yin yang"]={ 0x262F }, ["zambia"]={ 0x1F1FF, 0x1F1F2 }, + ["zany face"]={ 0x1F92A }, ["zebra"]={ 0x1F993 }, ["zimbabwe"]={ 0x1F1FF, 0x1F1FC }, ["zipper-mouth face"]={ 0x1F910 }, diff --git a/tex/context/base/mkiv/char-ini.lua b/tex/context/base/mkiv/char-ini.lua index c308a2c0f..4ee9db8b5 100644 --- a/tex/context/base/mkiv/char-ini.lua +++ b/tex/context/base/mkiv/char-ini.lua @@ -234,6 +234,7 @@ local blocks = allocate { ["cham"] = { first = 0x0AA00, last = 0x0AA5F, description = "Cham" }, ["cherokee"] = { first = 0x013A0, last = 0x013FF, otf="cher", description = "Cherokee" }, ["cherokeesupplement"] = { first = 0x0AB70, last = 0x0ABBF, description = "Cherokee Supplement" }, + ["chesssymbols"] = { first = 0x1FA00, last = 0x1FA6F, description = "Chess Symbols" }, ["cjkcompatibility"] = { first = 0x03300, last = 0x033FF, otf="hang", description = "CJK Compatibility" }, ["cjkcompatibilityforms"] = { first = 0x0FE30, last = 0x0FE4F, otf="hang", description = "CJK Compatibility Forms" }, ["cjkcompatibilityideographs"] = { first = 0x0F900, last = 0x0FAFF, otf="hang", description = "CJK Compatibility Ideographs" }, @@ -296,6 +297,7 @@ local blocks = allocate { -- ["digitsthai"] = { first = 0x00E50, last = 0x00E59, math = true }, -- ["digitstibetan"] = { first = 0x00F20, last = 0x00F29, math = true }, ["dingbats"] = { first = 0x02700, last = 0x027BF, description = "Dingbats" }, + ["dogra"] = { first = 0x11800, last = 0x1184F, description = "Dogra" }, ["dominotiles"] = { first = 0x1F030, last = 0x1F09F, description = "Domino Tiles" }, ["duployan"] = { first = 0x1BC00, last = 0x1BC9F, description = "Duployan" }, ["earlydynasticcuneiform"] = { first = 0x12480, last = 0x1254F, description = "Early Dynastic Cuneiform" }, @@ -314,6 +316,7 @@ local blocks = allocate { ["geometricshapes"] = { first = 0x025A0, last = 0x025FF, math = true, description = "Geometric Shapes" }, ["geometricshapesextended"] = { first = 0x1F780, last = 0x1F7FF, description = "Geometric Shapes Extended" }, ["georgian"] = { first = 0x010A0, last = 0x010FF, otf="geor", description = "Georgian" }, + ["georgianextended"] = { first = 0x01C90, last = 0x01CBF, description = "Georgian Extended" }, ["georgiansupplement"] = { first = 0x02D00, last = 0x02D2F, otf="geor", description = "Georgian Supplement" }, ["glagolitic"] = { first = 0x02C00, last = 0x02C5F, otf="glag", description = "Glagolitic" }, ["glagoliticsupplement"] = { first = 0x1E000, last = 0x1E02F, description = "Glagolitic Supplement" }, @@ -322,6 +325,7 @@ local blocks = allocate { ["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" }, + ["gunjalagondi"] = { first = 0x11D60, last = 0x11DAF, description = "Gunjala Gondi" }, ["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" }, @@ -329,6 +333,7 @@ local blocks = allocate { ["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" }, + ["hanifirohingya"] = { first = 0x10D00, last = 0x10D3F, description = "Hanifi Rohingya" }, ["hanunoo"] = { first = 0x01720, last = 0x0173F, otf="hano", description = "Hanunoo" }, ["hatran"] = { first = 0x108E0, last = 0x108FF, description = "Hatran" }, ["hebrew"] = { first = 0x00590, last = 0x005FF, otf="hebr", description = "Hebrew" }, @@ -338,6 +343,7 @@ local blocks = allocate { ["ideographicdescriptioncharacters"] = { first = 0x02FF0, last = 0x02FFF, description = "Ideographic Description Characters" }, ["ideographicsymbolsandpunctuation"] = { first = 0x16FE0, last = 0x16FFF, description = "Ideographic Symbols and Punctuation" }, ["imperialaramaic"] = { first = 0x10840, last = 0x1085F, description = "Imperial Aramaic" }, + ["indicsiyaqnumbers"] = { first = 0x1EC70, last = 0x1ECBF, description = "Indic Siyaq Numbers" }, ["inscriptionalpahlavi"] = { first = 0x10B60, last = 0x10B7F, description = "Inscriptional Pahlavi" }, ["inscriptionalparthian"] = { first = 0x10B40, last = 0x10B5F, description = "Inscriptional Parthian" }, ["ipaextensions"] = { first = 0x00250, last = 0x002AF, description = "IPA Extensions" }, @@ -396,6 +402,7 @@ local blocks = allocate { ["lydian"] = { first = 0x10920, last = 0x1093F, description = "Lydian" }, ["mahajani"] = { first = 0x11150, last = 0x1117F, description = "Mahajani" }, ["mahjongtiles"] = { first = 0x1F000, last = 0x1F02F, description = "Mahjong Tiles" }, + ["makasar"] = { first = 0x11EE0, last = 0x11EFF, description = "Makasar" }, ["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" }, @@ -403,6 +410,8 @@ local blocks = allocate { ["masaramgondi"] = { first = 0x11D00, last = 0x11D5F, description = "Masaram Gondi" }, ["mathematicalalphanumericsymbols"] = { first = 0x1D400, last = 0x1D7FF, math = true, description = "Mathematical Alphanumeric Symbols" }, ["mathematicaloperators"] = { first = 0x02200, last = 0x022FF, math = true, description = "Mathematical Operators" }, + ["mayannumerals"] = { first = 0x1D2E0, last = 0x1D2FF, description = "Mayan Numerals" }, + ["medefaidrin"] = { first = 0x16E40, last = 0x16E9F, description = "Medefaidrin" }, ["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" }, @@ -438,6 +447,7 @@ local blocks = allocate { ["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" }, + ["oldsogdian"] = { first = 0x10F00, last = 0x10F2F, description = "Old Sogdian" }, ["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" }, @@ -468,6 +478,7 @@ local blocks = allocate { ["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" }, + ["sogdian"] = { first = 0x10F30, last = 0x10F6F, description = "Sogdian" }, ["sorasompeng"] = { first = 0x110D0, last = 0x110FF, description = "Sora Sompeng" }, ["soyombo"] = { first = 0x11A50, last = 0x11AAF, description = "Soyombo" }, ["spacingmodifierletters"] = { first = 0x002B0, last = 0x002FF, description = "Spacing Modifier Letters" }, diff --git a/tex/context/base/mkiv/cont-new.mkiv b/tex/context/base/mkiv/cont-new.mkiv index a09dbd99c..7d09bd5aa 100644 --- a/tex/context/base/mkiv/cont-new.mkiv +++ b/tex/context/base/mkiv/cont-new.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2018.07.18 17:33} +\newcontextversion{2018.07.20 21:20} %D This file is loaded at runtime, thereby providing an excellent place for %D hacks, patches, extensions and new features. diff --git a/tex/context/base/mkiv/context.mkiv b/tex/context/base/mkiv/context.mkiv index 07cda500d..f3b9915ae 100644 --- a/tex/context/base/mkiv/context.mkiv +++ b/tex/context/base/mkiv/context.mkiv @@ -42,7 +42,7 @@ %D has to match \type {YYYY.MM.DD HH:MM} format. \edef\contextformat {\jobname} -\edef\contextversion{2018.07.18 17:33} +\edef\contextversion{2018.07.20 21:20} \edef\contextkind {beta} %D For those who want to use this: diff --git a/tex/context/base/mkiv/lpdf-epd.lua b/tex/context/base/mkiv/lpdf-epd.lua index f6e28cdec..5ecb12c47 100644 --- a/tex/context/base/mkiv/lpdf-epd.lua +++ b/tex/context/base/mkiv/lpdf-epd.lua @@ -1301,6 +1301,8 @@ if img then do end end + -- todo: codeinjections + lpdf_epdf.image = { open = openpdf, close = closepdf, diff --git a/tex/context/base/mkiv/node-bck.lua b/tex/context/base/mkiv/node-bck.lua index 8174888ee..3c453bfb3 100644 --- a/tex/context/base/mkiv/node-bck.lua +++ b/tex/context/base/mkiv/node-bck.lua @@ -70,7 +70,7 @@ local a_linefiller = privateattributes("linefiller") local a_ruled = privateattributes("ruled") local trace_alignment = false -local report_alignment = logs.reported("backgrounds","alignment") +local report_alignment = logs.reporter("backgrounds","alignment") trackers.register("backgrounds.alignments",function(v) trace_alignment = v end) diff --git a/tex/context/base/mkiv/node-ini.lua b/tex/context/base/mkiv/node-ini.lua index a9f8850b4..9b35f29f6 100644 --- a/tex/context/base/mkiv/node-ini.lua +++ b/tex/context/base/mkiv/node-ini.lua @@ -107,7 +107,6 @@ dircodes = allocate { [1] = "cancel", } - -- local glyphcodes = allocate { -- [ 1] = "character", -- [ 2] = "ligature", @@ -383,6 +382,9 @@ nodes.dirvalues = dirvalues nodes.gluevalues = gluevalues nodes.pdfliteralvalues = pdfliteralvalues +dirvalues.lefttoright = 0 +dirvalues.righttoleft = 1 + nodes.subtypes = { [nodecodes.accent] = accentcodes, [nodecodes.boundary] = boundarycodes, diff --git a/tex/context/base/mkiv/node-par.lua b/tex/context/base/mkiv/node-par.lua index e45e6dc16..4afaef220 100644 --- a/tex/context/base/mkiv/node-par.lua +++ b/tex/context/base/mkiv/node-par.lua @@ -11,6 +11,8 @@ local stoptiming = statistics.stoptiming local actions = nodes.tasks.actions("everypar") +-- this one is called a lot! + local function everypar(head) starttiming(builders) head = actions(head) @@ -18,4 +20,8 @@ local function everypar(head) return head end -callback.register("insert_local_par",everypar,"paragraph start") +if LUATEXFUNCTIONALITY > 6857 then + + callback.register("insert_local_par",everypar,"paragraph start") + +end diff --git a/tex/context/base/mkiv/node-pro.lua b/tex/context/base/mkiv/node-pro.lua index ad1035bbc..575ddbb28 100644 --- a/tex/context/base/mkiv/node-pro.lua +++ b/tex/context/base/mkiv/node-pro.lua @@ -65,8 +65,6 @@ do end -local tracer = processors.tracer - processors.enabled = true -- this will become a proper state (like trackers) do @@ -74,6 +72,8 @@ do local has_glyph = nodes.has_glyph local count_nodes = nodes.countall + local tracer = processors.tracer + local function pre_linebreak_filter(head,groupcode) -- ,size,packtype,direction local found = force_processors or has_glyph(head) if found then @@ -153,6 +153,8 @@ do local actions = tasks.actions("finalizers") -- head, where local count_nodes = nodes.countall + local tracer = processors.tracer + local function post_linebreak_filter(head,groupcode) if trace_callbacks then local before = count_nodes(head,true) diff --git a/tex/context/base/mkiv/node-ref.lua b/tex/context/base/mkiv/node-ref.lua index 492c65b0c..27d209701 100644 --- a/tex/context/base/mkiv/node-ref.lua +++ b/tex/context/base/mkiv/node-ref.lua @@ -444,6 +444,89 @@ local function inject_areas(head,attribute,make,stack,done,skip,parent,pardir,tx return head, pardir, txtdir end +-- -- maybe first check for glyphs and use a goto: +-- +-- local function inject_areas(head,attribute,make,stack,done,skip,parent,pardir,txtdir) -- main +-- local first, last, firstdir, reference +-- if not pardir then +-- pardir = "===" +-- end +-- if not texdir then +-- txtdir = "===" +-- end +-- local current = head +-- while current do +-- local id = getid(current) +-- local r -- else scope message due to goto +-- if id == glyph_code then +-- goto rest +-- elseif id == hlist_code or id == vlist_code then +-- 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)] +-- -- if r and (not skip or r >) skip then -- maybe no > test +-- -- inject_list(id,current,r,make,stack,pardir,txtdir) +-- -- end +-- if r then +-- if not reference then +-- reference, first, last, firstdir = r, current, current, txtdir +-- elseif r == reference then +-- -- same link +-- last = current +-- elseif (done[reference] or 0) == 0 then +-- if not skip or r > skip then -- maybe no > test +-- head, current = inject_range(head,first,last,reference,make,stack,parent,pardir,firstdir) +-- reference, first, last, firstdir = nil, nil, nil, nil +-- end +-- else +-- reference, first, last, firstdir = r, current, current, txtdir +-- end +-- done[r] = (done[r] or 0) + 1 +-- end +-- local list = getlist(current) +-- if list then +-- local h +-- h, pardir, txtdir = inject_areas(list,attribute,make,stack,done,r or skip or 0,current,pardir,txtdir) +-- if h ~= current then +-- setlist(current,h) +-- end +-- end +-- if r then +-- done[r] = done[r] - 1 +-- end +-- elseif id == glue_code and getsubtype(current) == leftskip_code then -- any glue at the left? +-- -- +-- elseif id == dir_code then +-- txtdir = getdir(current) +-- elseif id == localpar_code then -- only test at begin +-- pardir = getdir(current) +-- end +-- goto next +-- ::rest:: +-- r = getattr(current,attribute) +-- if not r then +-- -- just go on, can be kerns +-- elseif not reference then +-- reference, first, last, firstdir = r, current, current, txtdir +-- elseif r == reference then +-- last = current +-- elseif (done[reference] or 0) == 0 then -- or id == glue_code and getsubtype(current) == right_skip_code +-- if not skip or r > skip then -- maybe no > test +-- head, current = inject_range(head,first,last,reference,make,stack,parent,pardir,firstdir) +-- reference, first, last, firstdir = nil, nil, nil, nil +-- end +-- else +-- reference, first, last, firstdir = r, current, current, txtdir +-- end +-- ::next:: +-- current = getnext(current) +-- end +-- if reference and (done[reference] or 0) == 0 then +-- head = inject_range(head,first,last,reference,make,stack,parent,pardir,firstdir) +-- end +-- return head, pardir, txtdir +-- end + -- tracing: todo: use predefined colors local register_color = colors.register diff --git a/tex/context/base/mkiv/node-rul.lua b/tex/context/base/mkiv/node-rul.lua index 39ad1cf58..e8259df44 100644 --- a/tex/context/base/mkiv/node-rul.lua +++ b/tex/context/base/mkiv/node-rul.lua @@ -44,7 +44,6 @@ local getfont = nuts.getfont local getsubtype = nuts.getsubtype local getlist = nuts.getlist local setwhd = nuts.setwhd -local setdir = nuts.setdir local setattrlist = nuts.setattrlist local setshift = nuts.setshift local getwidth = nuts.getwidth diff --git a/tex/context/base/mkiv/node-tsk.lua b/tex/context/base/mkiv/node-tsk.lua index aa59d1d5d..f2f78252a 100644 --- a/tex/context/base/mkiv/node-tsk.lua +++ b/tex/context/base/mkiv/node-tsk.lua @@ -226,24 +226,25 @@ statistics.register("node list callback tasks", function() end end) -function tasks.actions(name) -- we optimize for the number or arguments (no ...) +local function create(data,t) + created = created + 1 + local runner = compile(data.list,data.processor,t) + if trace_tasks then + report_tasks("creating runner %a, %i actions enabled",t.name,data.list.steps or 0) + end + data.runner = runner + return runner +end + +function tasks.actions(name) local data = tasksdata[name] if data then local t = data.templates if t then t.name = data.name return function(...) - total = total + 1 -- will go away - local runner = data.runner - if not runner then - created = created + 1 - if trace_tasks then - report_tasks("creating runner %a",name) - end - runner = compile(data.list,data.processor,t) - data.runner = runner - end - return runner(...) + total = total + 1 + return (data.runner or create(data,t))(...) end end end diff --git a/tex/context/base/mkiv/pack-rul.lua b/tex/context/base/mkiv/pack-rul.lua index a270bffe7..80379b207 100644 --- a/tex/context/base/mkiv/pack-rul.lua +++ b/tex/context/base/mkiv/pack-rul.lua @@ -44,6 +44,7 @@ local getid = nuts.getid local getsubtype = nuts.getsubtype local getbox = nuts.getbox local getdir = nuts.getdir +local getdirection = nuts.getdirection local setshift = nuts.setshift local setwidth = nuts.setwidth local getwidth = nuts.getwidth @@ -199,7 +200,8 @@ if LUATEXVERSION >= 1.090 then if list then if id == hlist_code then if subtype == box_code or subtype == line_code then - lastlinelength = list_dimensions(list,getdir(n)) + -- lastlinelength = list_dimensions(list,getdir(n)) + lastlinelength = list_dimensions(list,getdirection(n)) else lastlinelength = width end diff --git a/tex/context/base/mkiv/page-ini.lua b/tex/context/base/mkiv/page-ini.lua index 5b73c9729..3d5534128 100644 --- a/tex/context/base/mkiv/page-ini.lua +++ b/tex/context/base/mkiv/page-ini.lua @@ -41,23 +41,39 @@ function pages.mark(name,list) local page = list[i] local sign = false if type(page) == "string" then - local s, p = match(page,"([%+%-])(%d+)") - if s then - sign, page = s, p + local f, t = match(page,"(%d+)[:%-](%d+)") + if f and t then + f, t = tonumber(f), tonumber(t) + if f and t and f <= t then + if trace then + report("marking page %i upto %i as %a",f,t,name) + end + for page=f,t do + data[page][name] = true + end + end + page = false + else + local s, p = match(page,"([%+%-])(%d+)") + if s then + sign, page = s, p + end end end - page = tonumber(page) if page then - if sign == "+" then - page = realpage + page - end - if sign == "-" then - report("negative page numbers are not supported") - else - if trace then - report("marking page %i as %a",page,name) + page = tonumber(page) + if page then + if sign == "+" then + page = realpage + page + end + if sign == "-" then + report("negative page numbers are not supported") + else + if trace then + report("marking page %i as %a",page,name) + end + data[page][name] = true end - data[page][name] = true end end end @@ -75,7 +91,6 @@ local function marked(name) rawset(data,i,nil) end local pagedata = rawget(data,realpage) - print(pagedata and pagedata[name] and true or false) return pagedata and pagedata[name] and true or false end diff --git a/tex/context/base/mkiv/status-files.pdf b/tex/context/base/mkiv/status-files.pdf index 3106a2cfb..73d70bb17 100644 Binary files a/tex/context/base/mkiv/status-files.pdf and b/tex/context/base/mkiv/status-files.pdf differ diff --git a/tex/context/base/mkiv/status-lua.pdf b/tex/context/base/mkiv/status-lua.pdf index 61d33704a..fd2363cb3 100644 Binary files a/tex/context/base/mkiv/status-lua.pdf and b/tex/context/base/mkiv/status-lua.pdf differ diff --git a/tex/context/base/mkiv/strc-blk.lua b/tex/context/base/mkiv/strc-blk.lua index 4e129a842..89df440c9 100644 --- a/tex/context/base/mkiv/strc-blk.lua +++ b/tex/context/base/mkiv/strc-blk.lua @@ -9,7 +9,7 @@ if not modules then modules = { } end modules ['strc-blk'] = { -- this one runs on top of buffers and structure local type, next = type, next -local find, format, validstring = string.find, string.format, string.valid +local find, formatters, validstring = string.find, string.formatters, string.valid local settings_to_set, settings_to_array = utilities.parsers.settings_to_set, utilities.parsers.settings_to_array local allocate = utilities.storage.allocate @@ -25,6 +25,7 @@ structures.blocks = structures.blocks or { } local blocks = structures.blocks local sections = structures.sections local lists = structures.lists +local helpers = structures.helpers local collected = allocate() local tobesaved = allocate() @@ -42,14 +43,28 @@ end job.register('structures.blocks.collected', tobesaved, initializer) local listitem = utilities.parsers.listitem +local f_block = formatters["block.%s"] + +function blocks.uservariable(index,key,default) + local c = collected[index] + if c then + local u = c.userdata + if u then + local v = u[key] or default + if v then + context(v) + end + end + end +end -function blocks.print(name,data,parameters,hide) +local function printblock(index,name,data,hide) if hide then - context.dostarthiddenblock(name, parameters) + context.dostarthiddenblock(index,name) else - context.dostartnormalblock(name, parameters) + context.dostartnormalblock(index,name) end - context.viafile(data,format("block.%s",validstring(name,"noname"))) + context.viafile(data,f_block(validstring(name,"noname"))) if hide then context.dostophiddenblock() else @@ -57,12 +72,14 @@ function blocks.print(name,data,parameters,hide) end end +blocks.print = printblock + function blocks.define(name) states[name] = { all = "hide" } end function blocks.setstate(state,name,tag) - local all = tag == "" + local all = tag == "" local tags = not all and settings_to_array(tag) for n in listitem(name) do local sn = states[n] @@ -98,12 +115,12 @@ function blocks.select(state,name,tag,criterium) local metadata = ri.metadata if names[metadata.name] then if all then - blocks.print(name,ri.data,ri.parameters,hide) + printblock(ri.index,name,ri.data,hide) else local mtags = metadata.tags for tag, sta in next, tags do if mtags[tag] then - blocks.print(name,ri.data,ri.parameters,hide) + printblock(ri.index,name,ri.data,hide) break end end @@ -112,42 +129,51 @@ function blocks.select(state,name,tag,criterium) end end -function blocks.save(name,tag,parameters,buffer) -- wrong, not yet adapted - local data = buffers.getcontent(buffer) - local tags = settings_to_set(tag) - local plus, minus = false, false - if tags['+'] then plus = true tags['+'] = nil end - if tags['-'] then minus = true tags['-'] = nil end - tobesaved[#tobesaved+1] = { - metadata = { - name = name, - tags = tags, - plus = plus, +function blocks.save(name,tag,userdata,buffer) -- wrong, not yet adapted + local data = buffers.getcontent(buffer) + local tags = settings_to_set(tag) + local plus = false + local minus = false + local last = #tobesaved + 1 + local all = states[name].all + if tags['+'] then + plus = true + tags['+'] = nil + end + if tags['-'] then + minus = true + tags['-'] = nil + end + tobesaved[last] = helpers.simplify { + metadata = { + name = name, + tags = tags, + plus = plus, minus = minus, }, + index = last, + data = data or "error", + userdata = userdata and type(userdata) == "string" and helpers.touserdata(userdata), references = { - section = sections.currentid(), + section = sections.currentid(), }, - data = data or "error", - parameters = parameters, } - local allstate = states[name].all if not next(tags) then - if allstate ~= "hide" then - blocks.print(name,data,parameters) + if all ~= "hide" then + printblock(last,name,data) elseif plus then - blocks.print(name,data,parameters,true) + printblock(last,name,data,true) end else local sn = states[name] for tag, _ in next, tags do if sn[tag] == nil then - if allstate ~= "hide" then - blocks.print(name,data,parameters) + if all ~= "hide" then + printblock(last,name,data) break end elseif sn[tag] ~= "hide" then - blocks.print(name,data,parameters) + printblock(last,name,data) break end end @@ -157,7 +183,8 @@ end -- interface -implement { name = "definestructureblock", actions = blocks.define, arguments = "string" } -implement { name = "savestructureblock", actions = blocks.save, arguments = "4 strings" } -implement { name = "selectstructureblock", actions = blocks.select, arguments = "4 strings" } -implement { name = "setstructureblockstate", actions = blocks.setstate, arguments = "3 strings" } +implement { name = "definestructureblock", actions = blocks.define, arguments = "string" } +implement { name = "savestructureblock", actions = blocks.save, arguments = "4 strings" } +implement { name = "selectstructureblock", actions = blocks.select, arguments = "4 strings" } +implement { name = "setstructureblockstate", actions = blocks.setstate, arguments = "3 strings" } +implement { name = "structureblockuservariable", actions = blocks.uservariable, arguments = { "integer", "string" } } diff --git a/tex/context/base/mkiv/strc-blk.mkiv b/tex/context/base/mkiv/strc-blk.mkiv index 1ff7ec51b..4d7437b37 100644 --- a/tex/context/base/mkiv/strc-blk.mkiv +++ b/tex/context/base/mkiv/strc-blk.mkiv @@ -35,14 +35,14 @@ \appendtoks \clf_definestructureblock{\currentblock}% \setuevalue{\e!begin\currentblock}{\dotripleempty\strc_blocks_begin[\currentblock]}% - \setuevalue{\e!end \currentblock}{}% + \letvalue {\e!end \currentblock}\donothing \to \everydefineblock \unexpanded\def\strc_blocks_begin[#1][#2][#3]% - {\normalexpanded{\buff_pickup{@block@}{\e!begin#1}{\e!end#1}} - {}% before - {\clf_savestructureblock{#1}{#2}{#3}{@block@}}% - \plusone}% after + {\normalexpanded{\buff_pickup{\??block}{\e!begin#1}{\e!end#1}} + {}% + {\clf_savestructureblock{#1}{#2}{#3}{\??block}}% + \plusone}% \let\strc_blocks_setup\relax @@ -54,11 +54,13 @@ {\dostopnormalblock \stopnointerference} +\newconstant\c_strc_blocks_index + \unexpanded\def\dostartnormalblock#1#2% called at lua end - {\bgroup + {\begingroup \visibletrue % will change - \edef\currentblock{#1}% - \setupcurrentblock[#2]% + \edef\currentblock{#2}% + \c_strc_blocks_index#1\relax \strc_blocks_setup \let\strc_blocks_setup\relax \blockparameter\c!before @@ -70,13 +72,13 @@ {\removeunwantedspaces \blockparameter\c!after \par % todo: alternative = text, paragraph - \egroup} + \endgroup} \def\strc_blocks_set_state[#1][#2][#3]% state name tag {\clf_setstructureblockstate{#1}{#2}{#3}} \def\strc_blocks_select[#1][#2][#3][#4]% state name tag setups - {\bgroup + {\begingroup \doifelseassignment{#3} {\getparameters[\??blocktemp][\c!criterium=\v!text,#3]% \def\strc_blocks_setup{\setupcurrentblock[#3]}% @@ -84,7 +86,10 @@ {\getparameters[\??blocktemp][\c!criterium=\v!text,#4]% \def\strc_blocks_setup{\setupcurrentblock[#4]}% \clf_selectstructureblock{#1}{#2}{#3}{\csname\??blocktemp\c!criterium\endcsname}}% - \egroup} + \endgroup} + +\def\blockuservariable#1% + {\clf_structureblockuservariable\c_strc_blocks_index{#1}} % hide : save, if [+] also hidden execute % keep : save and normal execute diff --git a/tex/context/base/mkiv/supp-box.lua b/tex/context/base/mkiv/supp-box.lua index dc680cda0..133c93fe4 100644 --- a/tex/context/base/mkiv/supp-box.lua +++ b/tex/context/base/mkiv/supp-box.lua @@ -41,7 +41,7 @@ local getid = nuts.getid local getlist = nuts.getlist local getattribute = nuts.getattribute local getbox = nuts.getbox -local getdir = nuts.getdir +local getdirection = nuts.getdirection local getwidth = nuts.getwidth local takebox = nuts.takebox @@ -66,6 +66,7 @@ local list_dimensions = nuts.dimensions local hpack = nuts.hpack local nextdisc = nuts.traversers.disc +local nextdir = nuts.traversers.dir local nexthlist = nuts.traversers.hlist local listtoutf = nodes.listtoutf @@ -419,29 +420,41 @@ interfaces.implement { nodes.setboxtonaturalwd = setboxtonaturalwd -local function firstdirinbox(n) - local b = getbox(n) - if b then - local l = getlist(b) - if l then - for h in nexthlist, l do - return getdir(h) +local doifelse = commands.doifelse + +do + + local dirvalues = nodes.dirvalues + local righttoleft = dirvalues.righttoleft + local lefttoright = dirvalues.lefttoright + + local function firstdirinbox(n) + local b = getbox(n) + if b then + local l = getlist(b) + if l then + for d in nextdir, l do + return getdirection(d) + end + for h in nexthlist, l do + return getdirection(h) + end end end + return lefttoright end -end -nodes.firstdirinbox = firstdirinbox + nodes.firstdirinbox = firstdirinbox -local doifelse = commands.doifelse + interfaces.implement { + name = "doifelserighttoleftinbox", + arguments = "integer", + actions = function(n) + doifelse(firstdirinbox(n) == righttoleft) + end + } -interfaces.implement { - name = "doifelserighttoleftinbox", - arguments = "integer", - actions = function(n) - doifelse(firstdirinbox(n) == "TRT") - end -} +end -- new (handy for mp) .. might move to its own module diff --git a/tex/context/base/mkiv/task-ini.lua b/tex/context/base/mkiv/task-ini.lua index 5695be936..48aa65baa 100644 --- a/tex/context/base/mkiv/task-ini.lua +++ b/tex/context/base/mkiv/task-ini.lua @@ -127,7 +127,7 @@ appendaction("contributers", "normalizers", "nodes.handlers.flattenline", appendaction("contributers", "normalizers", "nodes.handlers.textbackgrounds", nil, "nut", "disabled" ) appendaction("vboxbuilders", "normalizers", "nodes.handlers.backgroundsvbox", nil, "nut", "disabled" ) ---------("vboxbuilders", "normalizers", "typesetters.margins.localhandler", nil, "nut", "disabled" ) +------------("vboxbuilders", "normalizers", "typesetters.margins.localhandler", nil, "nut", "disabled" ) appendaction("vboxbuilders", "normalizers", "builders.vspacing.vboxhandler", nil, "nut", "enabled" ) appendaction("vboxbuilders", "normalizers", "builders.profiling.vboxhandler", nil, "nut", "disabled" ) appendaction("vboxbuilders", "normalizers", "typesetters.checkers.handler", nil, "nut", "disabled" ) diff --git a/tex/context/base/mkiv/trac-vis.lua b/tex/context/base/mkiv/trac-vis.lua index 5c92a80f8..6ae65509b 100644 --- a/tex/context/base/mkiv/trac-vis.lua +++ b/tex/context/base/mkiv/trac-vis.lua @@ -63,7 +63,7 @@ local getdisc = nuts.getdisc local getwhd = nuts.getwhd local getkern = nuts.getkern local getpenalty = nuts.getpenalty -local getdir = nuts.getdir +----- getdirection = nuts.getdirection local getwidth = nuts.getwidth local getdepth = nuts.getdepth local getshift = nuts.getshift @@ -118,6 +118,10 @@ local stoptiming = statistics.stoptiming local a_visual = attributes.private("visual") local a_layer = attributes.private("viewerlayer") +----- dirvalues = nodes.dirvalues +----- LTL = dirvalues.LTL +----- RTT = dirvalues.RTT + local band = bit32.band local bor = bit32.bor @@ -705,8 +709,8 @@ local ruledbox do local wd, ht, dp = getwhd(current) if wd ~= 0 then local shift = getshift(current) - -- local dir = getdir(current) - -- if dir == "LTL" or dir == "RRT" then + -- local dir = getdirection(current) + -- if dir == LTL or dir == RRT then -- wd, ht, dp = ht + dp, wd, 0 -- end local next = getnext(current) @@ -854,8 +858,8 @@ local ruledglyph do -- local wd = chardata[getfont(current)][getchar(current)].width if wd ~= 0 then local wd, ht, dp = getwhd(current) - -- local dir = getdir(current) - -- if dir == "LTL" or dir = "RTT" then + -- local dir = getdirection(current) + -- if dir == LTL or dir == RTT then -- wd, ht, dp = ht + dp, wd, 0 -- end local next = getnext(current) diff --git a/tex/context/base/mkiv/typo-bld.lua b/tex/context/base/mkiv/typo-bld.lua index 54dfacc15..1c96947db 100644 --- a/tex/context/base/mkiv/typo-bld.lua +++ b/tex/context/base/mkiv/typo-bld.lua @@ -199,11 +199,7 @@ function builders.vpack_filter(head,groupcode,size,packtype,maxdepth,direction) local before = count_nodes(head) head, done = vboxactions(head,groupcode,size,packtype,maxdepth,direction) local after = count_nodes(head) - if done then - nodes.processors.tracer("vpack","changed",head,groupcode,before,after,true) - else - nodes.processors.tracer("vpack","unchanged",head,groupcode,before,after,true) - end + nodes.processors.tracer("vpack",head,groupcode,before,after,done) else head, done = vboxactions(head,groupcode) end @@ -256,7 +252,8 @@ function builders.buildpage_filter(groupcode) if trace_page_builder then report(groupcode) end - return nil, false -- no return value needed +-- return nil, false -- no return value needed + return nil end end diff --git a/tex/context/base/mkiv/typo-wrp.lua b/tex/context/base/mkiv/typo-wrp.lua index 13bb5a0cc..3be64f53e 100644 --- a/tex/context/base/mkiv/typo-wrp.lua +++ b/tex/context/base/mkiv/typo-wrp.lua @@ -8,48 +8,67 @@ if not modules then modules = { } end modules ['typo-wrp'] = { -- begin/end par wrapping stuff ... more to come -local nodecodes = nodes.nodecodes +local nodecodes = nodes.nodecodes +local gluecodes = nodes.gluecodes +local penaltycodes = nodes.penaltycodes +local boundarycodes = nodes.boundarycodes -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 glue_code = nodecodes.glue +local penalty_code = nodecodes.penalty +local boundary_code = nodecodes.boundary -local nuts = nodes.nuts +local parfill_skip_code = gluecodes.parfillskip -local find_node_tail = nuts.tail -local getprev = nuts.getprev -local getid = nuts.getid -local getsubtype = nuts.getsubtype -local getpenalty = nuts.getpenalty -local remove = nuts.remove +local user_penalty_code = penaltycodes.userpenalty +local line_penalty_code = penaltycodes.linepenalty +local linebreak_penalty_code = penaltycodes.linebreakpenalty -local enableaction = nodes.tasks.enableaction +local word_boundary_code = boundarycodes.word -local wrappers = { } -typesetters.wrappers = wrappers +local nuts = nodes.nuts -local trace_wrappers = trackers.register("typesetters.wrappers",function(v) trace_wrappers = v end) +local find_node_tail = nuts.tail +local getprev = nuts.getprev +local getid = nuts.getid +local getsubtype = nuts.getsubtype +local getpenalty = nuts.getpenalty +local remove = nuts.remove -local report = logs.reporter("paragraphs","wrappers") +local enableaction = nodes.tasks.enableaction + +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 +-- This check is very tight to the crlf definition. We check for: +-- +-- [break -10000] [wordboundary] [line(break)penalty] [parfillskip] +-- +-- If needed we can extend this checker for other cases but then we will also +-- use attributes. + local function remove_dangling_crlf(head,tail) - if tail and getid(tail) == glue_code and getsubtype(tail) == parfill_skip_code then + if head and 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 getpenalty(tail) == 10000 then - tail = getprev(tail) - if tail and getid(tail) == penalty_code and getsubtype(tail) == user_penalty_code and getpenalty(tail) == -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) + if tail and getid(tail) == penalty_code then + local subtype = getsubtype(tail) + if subtype == line_penalty_code or subtype == linebreak_penalty_code then + tail = getprev(tail) + if tail and getid(tail) == boundary_code and getsubtype(tail) == word_boundary_code then + tail = getprev(tail) + if tail ~= head and getid(tail) == penalty_code and getsubtype(tail) == user_penalty_code and getpenalty(tail) == -10000 then + 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 end - remove(head,tail,true) - return head, tail end end end diff --git a/tex/context/base/mkiv/typo-wrp.mkiv b/tex/context/base/mkiv/typo-wrp.mkiv index 0e010515b..4e9ecf2e1 100644 --- a/tex/context/base/mkiv/typo-wrp.mkiv +++ b/tex/context/base/mkiv/typo-wrp.mkiv @@ -40,18 +40,21 @@ \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 + % in bad usage this can lead to: [break -10000] [wordboundary] [line(break)penalty] [parfillskip] \break - \hskip\zeropoint % new so that the next word also hyphenates + \wordboundary + % which we then remove (maybe we should flag the wordboundary with an attribute but not now \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}} + {\wordboundary + %\nobreak + \hpack to \zeropoint{\strut{\infofont\kern.25\emwidth}\lohi{\infofont CR}{\infofont LF}\hss}} \unexpanded\def\settestcrlf {\let\spac_crlf_placeholder\spac_crlf_placeholder_show} diff --git a/tex/context/base/mkiv/util-seq.lua b/tex/context/base/mkiv/util-seq.lua index 4f4cd4a4d..e7a503faf 100644 --- a/tex/context/base/mkiv/util-seq.lua +++ b/tex/context/base/mkiv/util-seq.lua @@ -17,8 +17,9 @@ use locals to refer to them when compiling the chain.

-- todo: protect groups (as in tasks) -local gsub, concat, gmatch = string.gsub, table.concat, string.gmatch -local type, load = type, load +local gsub, gmatch = string.gsub, string.gmatch +local concat, sortedkeys = table.concat, table.sortedkeys +local type, load, next, tostring = type, load, next, tostring utilities = utilities or { } local tables = utilities.tables @@ -75,6 +76,7 @@ function sequencers.new(t) -- was reset gskip = { }, dirty = true, runner = nil, + steps = 0, } if t then s.arguments = t.arguments @@ -292,6 +294,7 @@ local function construct(t) end end t.dirty = false + t.steps = n if n == 0 then t.compiled = "" else @@ -399,6 +402,7 @@ function sequencers.nodeprocessor(t,nofarguments) end end end + t.steps = steps local processor if steps == 0 then processor = templates.default or construct { } @@ -412,15 +416,13 @@ function sequencers.nodeprocessor(t,nofarguments) actions = concat(calls,"\n"), } end - -- processor = "print('running : " .. (t.name or "?") .. "')\n" .. processor -- print(processor) - return processor end statistics.register("used sequences",function() if next(usednames) then - return table.concat(table.sortedkeys(usednames)," ") + return concat(sortedkeys(usednames)," ") end end) diff --git a/tex/context/base/mkiv/util-sql-logins.lua b/tex/context/base/mkiv/util-sql-logins.lua index dcb48fb35..6773f91bf 100644 --- a/tex/context/base/mkiv/util-sql-logins.lua +++ b/tex/context/base/mkiv/util-sql-logins.lua @@ -244,6 +244,11 @@ function logins.userpermitted(db,name) } end if not data or not data.name then + if not data then + report_logins("no user data for %a",name) + else + report_logins("no name entry for %a",name) + end local d = { name = name, state = 0, diff --git a/tex/context/interface/mkiv/i-context.pdf b/tex/context/interface/mkiv/i-context.pdf index b467a753e..f2279cf49 100644 Binary files a/tex/context/interface/mkiv/i-context.pdf and b/tex/context/interface/mkiv/i-context.pdf differ diff --git a/tex/context/interface/mkiv/i-readme.pdf b/tex/context/interface/mkiv/i-readme.pdf index a7b264970..4a0d5e8bb 100644 Binary files a/tex/context/interface/mkiv/i-readme.pdf and b/tex/context/interface/mkiv/i-readme.pdf differ diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua index 043b461d7..9714f39bb 100644 --- a/tex/generic/context/luatex/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex/luatex-fonts-merged.lua @@ -1,6 +1,6 @@ -- merged file : c:/data/develop/context/sources/luatex-fonts-merged.lua -- parent file : c:/data/develop/context/sources/luatex-fonts.lua --- merge date : 07/18/18 17:33:07 +-- merge date : 07/20/18 21:20:26 do -- begin closure to overcome local limits and interference -- cgit v1.2.3