diff options
84 files changed, 10107 insertions, 1258 deletions
diff --git a/metapost/context/base/mp-mlib.mp b/metapost/context/base/mp-mlib.mp index 7b3491539..cedfa9f7b 100644 --- a/metapost/context/base/mp-mlib.mp +++ b/metapost/context/base/mp-mlib.mp @@ -100,15 +100,21 @@ vardef rawtextext(expr str) = withpostscript str ) else : - image ( - _tt_n_ := _tt_n_ + 1 ; - addto currentpicture doublepath unitsquare - xscaled _tt_w_[_tt_n_] - yscaled (_tt_h_[_tt_n_] + _tt_d_[_tt_n_]) - withprescript "tx_number=" & decimal _tt_n_ - withprescript "tx_stage=final" - ; % withpostscript str ; - ) shifted (0,-_tt_d_[_tt_n_]) + _tt_n_ := _tt_n_ + 1 ; + if known _tt_d_[_tt_n_] : + image ( + addto currentpicture doublepath unitsquare + xscaled _tt_w_[_tt_n_] + yscaled (_tt_h_[_tt_n_] + _tt_d_[_tt_n_]) + withprescript "tx_number=" & decimal _tt_n_ + withprescript "tx_stage=final" + ; % withpostscript str ; + ) shifted (0,-_tt_d_[_tt_n_]) + else : + image ( + addto currentpicture doublepath unitsquare ; + ) + fi fi enddef ; diff --git a/scripts/context/lua/mtxrun.lua b/scripts/context/lua/mtxrun.lua index ea70a5cc4..0d9e071fe 100644 --- a/scripts/context/lua/mtxrun.lua +++ b/scripts/context/lua/mtxrun.lua @@ -1282,7 +1282,8 @@ local function serialize(root,name,_handle,_reduce,_noquotes,_hexify) if root then -- The dummy access will initialize a table that has a delayed initialization -- using a metatable. - local dummy = root.whatever + local dummy = root._w_h_a_t_e_v_e_r_ + root._w_h_a_t_e_v_e_r_ = nil -- Let's forget about empty tables. if next(root) then do_serialize(root,name,"",0) @@ -4792,6 +4793,7 @@ function setters.register(t,what,...) end end end + return false -- so we can use it in an assignment end function setters.enable(t,what) @@ -7246,6 +7248,7 @@ if not modules then modules = { } end modules ['lxml-pth'] = { } -- e.ni is only valid after a filter run +-- todo: B/C/[get first match] local concat, remove, insert = table.concat, table.remove, table.insert local type, next, tonumber, tostring, setmetatable, loadstring = type, next, tonumber, tostring, setmetatable, loadstring diff --git a/scripts/context/perl/mptopdf.pl b/scripts/context/perl/mptopdf.pl index 374d8912a..42db9001e 100644 --- a/scripts/context/perl/mptopdf.pl +++ b/scripts/context/perl/mptopdf.pl @@ -27,11 +27,12 @@ use File::Basename ; $Getopt::Long::passthrough = 1 ; # no error message $Getopt::Long::autoabbrev = 1 ; # partial switch accepted -my $Help = 0; -my $Latex = 0; -my $RawMP = 1; +my $Help = 0 ; +my $Latex = 0 ; +my $TeXexec = 0 ; +my $RawMP = 1 ; my $MetaFun = 0 ; -my $PassOn = '' ; +my $PassOn = '' ; &GetOptions ( "help" => \$Help , @@ -47,9 +48,9 @@ my $miktex = 0 ; my $done = 0 ; my $report = '' ; my $mplatexswitch = " --tex=latex " ; -my $texexecswitch = " --tex=\"texexec --batch --once --nomp --mptex\" " # untested +my $texexecswitch = " --tex=\"texexec --batch --once --nomp --mptex\" " ; # untested -my $dosish = ($Config{'osname'} =~/^(ms)?dos|^os\/2|^mswin/i) ; +my $dosish = ($Config{'osname'} =~ /^(ms)?dos|^os\/2|^mswin/i) ; my $escapeshell = (($ENV{'SHELL'}) && ($ENV{'SHELL'} =~ m/sh/i )); if ($ENV{"TEXSYSTEM"}) { diff --git a/scripts/context/stubs/mswin/mtxrun.lua b/scripts/context/stubs/mswin/mtxrun.lua index ea70a5cc4..0d9e071fe 100644 --- a/scripts/context/stubs/mswin/mtxrun.lua +++ b/scripts/context/stubs/mswin/mtxrun.lua @@ -1282,7 +1282,8 @@ local function serialize(root,name,_handle,_reduce,_noquotes,_hexify) if root then -- The dummy access will initialize a table that has a delayed initialization -- using a metatable. - local dummy = root.whatever + local dummy = root._w_h_a_t_e_v_e_r_ + root._w_h_a_t_e_v_e_r_ = nil -- Let's forget about empty tables. if next(root) then do_serialize(root,name,"",0) @@ -4792,6 +4793,7 @@ function setters.register(t,what,...) end end end + return false -- so we can use it in an assignment end function setters.enable(t,what) @@ -7246,6 +7248,7 @@ if not modules then modules = { } end modules ['lxml-pth'] = { } -- e.ni is only valid after a filter run +-- todo: B/C/[get first match] local concat, remove, insert = table.concat, table.remove, table.insert local type, next, tonumber, tostring, setmetatable, loadstring = type, next, tonumber, tostring, setmetatable, loadstring diff --git a/scripts/context/stubs/unix/mtxrun b/scripts/context/stubs/unix/mtxrun index ea70a5cc4..0d9e071fe 100644 --- a/scripts/context/stubs/unix/mtxrun +++ b/scripts/context/stubs/unix/mtxrun @@ -1282,7 +1282,8 @@ local function serialize(root,name,_handle,_reduce,_noquotes,_hexify) if root then -- The dummy access will initialize a table that has a delayed initialization -- using a metatable. - local dummy = root.whatever + local dummy = root._w_h_a_t_e_v_e_r_ + root._w_h_a_t_e_v_e_r_ = nil -- Let's forget about empty tables. if next(root) then do_serialize(root,name,"",0) @@ -4792,6 +4793,7 @@ function setters.register(t,what,...) end end end + return false -- so we can use it in an assignment end function setters.enable(t,what) @@ -7246,6 +7248,7 @@ if not modules then modules = { } end modules ['lxml-pth'] = { } -- e.ni is only valid after a filter run +-- todo: B/C/[get first match] local concat, remove, insert = table.concat, table.remove, table.insert local type, next, tonumber, tostring, setmetatable, loadstring = type, next, tonumber, tostring, setmetatable, loadstring diff --git a/tex/context/base/anch-pgr.mkiv b/tex/context/base/anch-pgr.mkiv index 957fd25af..7c3ffdf43 100644 --- a/tex/context/base/anch-pgr.mkiv +++ b/tex/context/base/anch-pgr.mkiv @@ -147,11 +147,6 @@ \def\MPanchoridentifier{mpa} % {mp-anchor} \def\MPoverlayposprefix{MO::} -% obsolete and wrong anyway -% -% \long\unexpanded\def\defineMPpositiongraphic#1% -% {\long\setvalue{\MPoverlayposprefix#1}} - %D The rest of the definitions concerning such overlays may %D look complicated, @@ -217,16 +212,6 @@ \fi \fi} -% \def\cleanuppositionaction#1% not in trialtypesetting -% {\ifcsname\POSactionprefix#1++\endcsname -% \the\everycleanpositionaction -% \iflocalpositioning -% \global\expandafter\let\csname\POSactionprefix#1++\endcsname\empty -% \else -% \global\expandafter\let\csname\POSactionprefix#1++\expandafter\endcsname\csname\POSactionprefix#1++\endcsname -% \fi -% \fi} - \def\handlepositionaction#1\with#2\on#3% {\bgroup \ifx\currentpositionoverlay\empty @@ -1076,185 +1061,187 @@ \def\stackposleft {\dostackposbox{\copy\nextbox\hskip\nextboxwd\hskip\stackposdistance}} \def\stackposright{\dostackposbox{\hskip\stackposdistance\hskip\nextboxwd\flushnextbox}} -%D \macros -%D {stackeddown} -%D -%D However, a better implementation is possible with the -%D following macro. We now have an extra key \type {stack} for -%D margin settings. When set to \type {yes}, this macro comes -%D into action. - -% Because there can be many stacked items in a line and successive lines, we -% play dirty and adapt the position and height of the current node so that -% this becomes visible to a next pass. +% obsolete % -% \startbuffer -% \inleft {test 1} test 1 \inleft {test 2} test 2 \endgraf -% \inleft {test 3} test 3 -% \stopbuffer -% \getbuffer \typebuffer \flushstatus \page +% %D \macros +% %D {stackeddown} +% %D +% %D However, a better implementation is possible with the +% %D following macro. We now have an extra key \type {stack} for +% %D margin settings. When set to \type {yes}, this macro comes +% %D into action. % -% \startbuffer -% \inleft {test 1} test 1 \inleft {test 2} test 2 \inleft {test 3} test 3 \endgraf -% \inleft {test 4} test 4 -% \stopbuffer -% \getbuffer \typebuffer \flushstatus \page +% % Because there can be many stacked items in a line and successive lines, we +% % play dirty and adapt the position and height of the current node so that +% % this becomes visible to a next pass. +% % +% % \startbuffer +% % \inleft {test 1} test 1 \inleft {test 2} test 2 \endgraf +% % \inleft {test 3} test 3 +% % \stopbuffer +% % \getbuffer \typebuffer \flushstatus \page +% % +% % \startbuffer +% % \inleft {test 1} test 1 \inleft {test 2} test 2 \inleft {test 3} test 3 \endgraf +% % \inleft {test 4} test 4 +% % \stopbuffer +% % \getbuffer \typebuffer \flushstatus \page +% % +% % \startbuffer +% % \inleft {test 1} test 1 \endgraf +% % \inleft {test 2} test 2 \endgraf +% % \inleft {test 3} test 3 +% % \stopbuffer +% % \getbuffer \typebuffer \flushstatus \page +% % +% % \startbuffer +% % \inleft {test 1\\test 1} test 1 \inleft {test 2} test 2 \endgraf +% % \inleft {test 3} test 3 +% % \stopbuffer +% % \getbuffer \typebuffer \flushstatus \page +% % +% % \startbuffer +% % \inleft {test 1\\test 1\\test 1\\test 1\\test 1} test 1 \endgraf +% % test 2 \endgraf +% % \inleft {test 3} test 3 +% % \stopbuffer +% % \getbuffer \typebuffer \flushstatus \page +% % +% % \startbuffer +% % \inleft{test 1} test \inleft{test 2} test \inleft{test 3\\test 3} test +% % \stopbuffer +% % \getbuffer \typebuffer \flushstatus \page +% % +% % \startbuffer +% % \inleft{test 1\\test 1\\test 1} test \inleft{test 2\\test 2} test \inleft{test 3\\test 3\\test 3} test \endgraf +% % \inleft{test 1\\test 1\\test 1} test \inleft{test 2\\test 2} test \inleft{test 3\\test 3\\test 3} test +% % \stopbuffer +% % \getbuffer \typebuffer \flushstatus \page % -% \startbuffer -% \inleft {test 1} test 1 \endgraf -% \inleft {test 2} test 2 \endgraf -% \inleft {test 3} test 3 -% \stopbuffer -% \getbuffer \typebuffer \flushstatus \page +% \newdimen\laststackvmove % use \scratchdimenone instead of skip % -% \startbuffer -% \inleft {test 1\\test 1} test 1 \inleft {test 2} test 2 \endgraf -% \inleft {test 3} test 3 -% \stopbuffer -% \getbuffer \typebuffer \flushstatus \page +% \def\stackeddown +% {\bgroup +% % this macro assumes a few things and is meant to work for margin notes +% \dowithnextbox +% {\global\advance\currentautopos\plusone +% \global\laststackvmove\zeropoint +% \hpos{\POSstackprefix\number\currentautopos} +% {\edef\next +% {\nextboxht\the\nextboxht +% \nextboxdp\the\nextboxdp +% \nextboxwd\the\nextboxwd}% +% \previousautopos\currentautopos +% \scratchdimen\zeropoint +% \scratchcounter\zerocount +% \doloop +% {\advance\previousautopos\minusone +% \edef\currentposition {\POSstackprefix\number\currentautopos}% +% \edef\previousposition{\POSstackprefix\number\previousautopos}% +% \ifnum\MPp\currentposition=\MPp\previousposition\relax +% %\registerstatus{doing \number\currentautopos/\number\previousautopos}% +% \doifoverlappingelse\currentposition\previousposition +% {\scratchskip\dimexpr +% \MPy\currentposition +% -\MPy\previousposition +% -\MPd\currentposition % untested +% +\MPd\previousposition % untested +% +\MPh\currentposition +% \relax\relax % second relax realy needed, forgotten while dimexpressing +% % todo: also take depth into account +% \ifdim\scratchskip<\scratchdimen +% %\registerstatus{no \the\scratchskip}% +% \else +% %\registerstatus{yes \the\scratchskip}% +% \scratchdimen\scratchskip +% \fi}% +% \donothing % {\registerstatus{next}}% +% \ifnum\previousautopos<\zerocount\exitloop\fi +% \else +% \exitloop +% \fi}% +% \ifdim\scratchdimen=\zeropoint \else +% \bgroup +% \edef\currentposition{\POSstackprefix\number\currentautopos}% +% \scratchskip\scratchdimen +% \advance\scratchskip\MPh\currentposition +% \scratchdimen-\scratchdimen +% \advance\scratchdimen\MPy\currentposition +% %\registerstatus{old \number\currentautopos: \MPy\currentposition/\MPh\currentposition}% +% \expanded{\replacepospxywhd +% {\currentposition}{\MPp\currentposition}{\MPx\currentposition}{\the\scratchdimen}% +% {\MPw\currentposition}{\the\scratchskip}{\MPd\currentposition}}% +% %\registerstatus{new \number\currentautopos: \MPy\currentposition/\MPh\currentposition}% +% \egroup +% \global\laststackvmove\scratchdimen % new +% \setbox\nextbox\iftracepositions\@EA\ruledhbox\else\@EA\hbox\fi +% {\lower\scratchdimen\flushnextbox}% +% \next +% %\registerstatus{\strut}% +% \fi +% \flushnextbox}% +% \egroup}} % -% \startbuffer -% \inleft {test 1\\test 1\\test 1\\test 1\\test 1} test 1 \endgraf -% test 2 \endgraf -% \inleft {test 3} test 3 -% \stopbuffer -% \getbuffer \typebuffer \flushstatus \page +% %D The next hack make sure that margin texts near faulty +% %D strutted lines are handled ok. % -% \startbuffer -% \inleft{test 1} test \inleft{test 2} test \inleft{test 3\\test 3} test -% \stopbuffer -% \getbuffer \typebuffer \flushstatus \page +% \newif\ifrepositionmarginbox \repositionmarginboxtrue % -% \startbuffer -% \inleft{test 1\\test 1\\test 1} test \inleft{test 2\\test 2} test \inleft{test 3\\test 3\\test 3} test \endgraf -% \inleft{test 1\\test 1\\test 1} test \inleft{test 2\\test 2} test \inleft{test 3\\test 3\\test 3} test -% \stopbuffer -% \getbuffer \typebuffer \flushstatus \page - -\newdimen\laststackvmove % use \scratchdimenone instead of skip - -\def\stackeddown - {\bgroup - % this macro assumes a few things and is meant to work for margin notes - \dowithnextbox - {\global\advance\currentautopos\plusone - \global\laststackvmove\zeropoint - \hpos{\POSstackprefix\number\currentautopos} - {\edef\next - {\nextboxht\the\nextboxht - \nextboxdp\the\nextboxdp - \nextboxwd\the\nextboxwd}% - \previousautopos\currentautopos - \scratchdimen\zeropoint - \scratchcounter\zerocount - \doloop - {\advance\previousautopos\minusone - \edef\currentposition {\POSstackprefix\number\currentautopos}% - \edef\previousposition{\POSstackprefix\number\previousautopos}% - \ifnum\MPp\currentposition=\MPp\previousposition\relax - %\registerstatus{doing \number\currentautopos/\number\previousautopos}% - \doifoverlappingelse\currentposition\previousposition - {\scratchskip\dimexpr - \MPy\currentposition - -\MPy\previousposition - -\MPd\currentposition % untested - +\MPd\previousposition % untested - +\MPh\currentposition - \relax\relax % second relax realy needed, forgotten while dimexpressing - % todo: also take depth into account - \ifdim\scratchskip<\scratchdimen - %\registerstatus{no \the\scratchskip}% - \else - %\registerstatus{yes \the\scratchskip}% - \scratchdimen\scratchskip - \fi}% - \donothing % {\registerstatus{next}}% - \ifnum\previousautopos<\zerocount\exitloop\fi - \else - \exitloop - \fi}% - \ifdim\scratchdimen=\zeropoint \else - \bgroup - \edef\currentposition{\POSstackprefix\number\currentautopos}% - \scratchskip\scratchdimen - \advance\scratchskip\MPh\currentposition - \scratchdimen-\scratchdimen - \advance\scratchdimen\MPy\currentposition - %\registerstatus{old \number\currentautopos: \MPy\currentposition/\MPh\currentposition}% - \expanded{\replacepospxywhd - {\currentposition}{\MPp\currentposition}{\MPx\currentposition}{\the\scratchdimen}% - {\MPw\currentposition}{\the\scratchskip}{\MPd\currentposition}}% - %\registerstatus{new \number\currentautopos: \MPy\currentposition/\MPh\currentposition}% - \egroup - \global\laststackvmove\scratchdimen % new - \setbox\nextbox\iftracepositions\@EA\ruledhbox\else\@EA\hbox\fi - {\lower\scratchdimen\flushnextbox}% - \next - %\registerstatus{\strut}% - \fi - \flushnextbox}% - \egroup}} - -%D The next hack make sure that margin texts near faulty -%D strutted lines are handled ok. - -\newif\ifrepositionmarginbox \repositionmarginboxtrue - -\newcount\currentmarginpos - -\def\dopositionmarginbox#1% - {\bgroup - \ifrepositionmarginbox - \global\advance\currentmarginpos\plusone - %\setposition{\s!margin:\number\currentmarginpos}% not always - \ifcase\marginrepositionmethod - % nothing - \or - % nothing - \or - % stack / page check yet untested - \setposition{\s!margin:\number\currentmarginpos}% - \scratchdimen\MPy{\s!margin:\number\currentmarginpos}% - \global\advance\currentmarginpos\plusone - \advance\scratchdimen -\MPy{\s!margin:\number\currentmarginpos}% - \advance\scratchdimen -\strutdp - % new but bugged - % \setbox#1\hbox - % {\hskip-\MPx{\s!margin:\number\currentmarginpos}% - % \hskip\MPx{head:\the\realpageno}% - % \box#1}% - % so far - \setbox#1\hbox - {\setposition{\s!margin:\number\currentmarginpos}% - \raise\scratchdimen\box#1}% - \or - % move up - \setposition{\s!margin:\number\currentmarginpos}% - \ifnum\MPp{p:\number\parposcounter}=\MPp{\s!margin:\number\currentmarginpos}\relax - \scratchdimen\dimexpr\MPy{p:\number\parposcounter}-\MPy{\s!margin:\number\currentmarginpos}\relax - \expanded{\setbox#1\hbox{\raise\scratchdimen\box#1}\ht#1\the\ht#1\dp#1\the\dp#1}% - \fi - \or - % move up, assume end of par - \setposition{\s!margin:\number\currentmarginpos}% - \ifnum\MPp{p:\number\parposcounter}=\MPp{\s!margin:\number\currentmarginpos}\relax - \getnoflines\margincontentheight - \advance\noflines\minusone - \scratchdimen\noflines\lineheight - \else - \scratchdimen\dimexpr\MPy{p:\number\parposcounter}-\MPy{\s!margin:\number\currentmarginpos}\relax - \fi - \expanded{\setbox#1\hbox{\raise\scratchdimen\box#1}\ht#1\the\ht#1\dp#1\the\dp#1}% - \fi - \dp#1\zeropoint - \ht#1\zeropoint - \fi - \graphicvadjust{\dontleavehmode\box#1}% dontleavehmode is needed to get direction right - \egroup} - -% \setnewconstant\marginrepositionmethod\plusone % sidemethod -% \setnewconstant\margincontentmethod \plusthree % textmethod % beware: 1 = old method -% \setnewconstant\marginpagecheckmethod \plusone % splitmethod +% \newcount\currentmarginpos +% +% \def\dopositionmarginbox#1% +% {\bgroup +% \ifrepositionmarginbox +% \global\advance\currentmarginpos\plusone +% %\setposition{\s!margin:\number\currentmarginpos}% not always +% \ifcase\marginrepositionmethod +% % nothing +% \or +% % nothing +% \or +% % stack / page check yet untested +% \setposition{\s!margin:\number\currentmarginpos}% +% \scratchdimen\MPy{\s!margin:\number\currentmarginpos}% +% \global\advance\currentmarginpos\plusone +% \advance\scratchdimen -\MPy{\s!margin:\number\currentmarginpos}% +% \advance\scratchdimen -\strutdp +% % new but bugged +% % \setbox#1\hbox +% % {\hskip-\MPx{\s!margin:\number\currentmarginpos}% +% % \hskip\MPx{head:\the\realpageno}% +% % \box#1}% +% % so far +% \setbox#1\hbox +% {\setposition{\s!margin:\number\currentmarginpos}% +% \raise\scratchdimen\box#1}% +% \or +% % move up +% \setposition{\s!margin:\number\currentmarginpos}% +% \ifnum\MPp{p:\number\parposcounter}=\MPp{\s!margin:\number\currentmarginpos}\relax +% \scratchdimen\dimexpr\MPy{p:\number\parposcounter}-\MPy{\s!margin:\number\currentmarginpos}\relax +% \expanded{\setbox#1\hbox{\raise\scratchdimen\box#1}\ht#1\the\ht#1\dp#1\the\dp#1}% +% \fi +% \or +% % move up, assume end of par +% \setposition{\s!margin:\number\currentmarginpos}% +% \ifnum\MPp{p:\number\parposcounter}=\MPp{\s!margin:\number\currentmarginpos}\relax +% \getnoflines\margincontentheight +% \advance\noflines\minusone +% \scratchdimen\noflines\lineheight +% \else +% \scratchdimen\dimexpr\MPy{p:\number\parposcounter}-\MPy{\s!margin:\number\currentmarginpos}\relax +% \fi +% \expanded{\setbox#1\hbox{\raise\scratchdimen\box#1}\ht#1\the\ht#1\dp#1\the\dp#1}% +% \fi +% \dp#1\zeropoint +% \ht#1\zeropoint +% \fi +% \graphicvadjust{\dontleavehmode\box#1}% dontleavehmode is needed to get direction right +% \egroup} +% +% % \setnewconstant\marginrepositionmethod\plusone % sidemethod +% % \setnewconstant\margincontentmethod \plusthree % textmethod % beware: 1 = old method +% % \setnewconstant\marginpagecheckmethod \plusone % splitmethod %D For a right menu, a sequence of calls to \type %D {right_menu_button} is generated. @@ -1315,11 +1302,6 @@ \def\tbPOSprefix {tbp:\number\noftabpositions:} -% \def\tableposindeed -% {\scratchtoks\posXCtoks -% \global\posXCtoks\emptytoks -% \the\scratchtoks} - \def\tablepos {\normalexpanded{\global\posXCtoks\emptytoks\the\posXCtoks}} diff --git a/tex/context/base/attr-ini.mkiv b/tex/context/base/attr-ini.mkiv index cfdc31eaf..0d7328a12 100644 --- a/tex/context/base/attr-ini.mkiv +++ b/tex/context/base/attr-ini.mkiv @@ -88,7 +88,6 @@ \definesystemattribute [layoutcomponent] [public] \definesystemattribute [reference] [public] \definesystemattribute [destination] [public] -\definesystemattribute [graphicvadjust] [public] \definesystemattribute [ruled] [public] \definesystemattribute [shifted] [public] diff --git a/tex/context/base/bibl-tra.lua b/tex/context/base/bibl-tra.lua index 6a9f77f43..55d541fdc 100644 --- a/tex/context/base/bibl-tra.lua +++ b/tex/context/base/bibl-tra.lua @@ -56,6 +56,10 @@ function hacks.register(str) ordered[str] = #registered end +function hacks.nofregistered() + return #registered +end + function hacks.reset(m) mode, list, done = m, { }, { } end diff --git a/tex/context/base/bibl-tra.mkiv b/tex/context/base/bibl-tra.mkiv index 9a42cb539..6eea80899 100644 --- a/tex/context/base/bibl-tra.mkiv +++ b/tex/context/base/bibl-tra.mkiv @@ -185,6 +185,7 @@ \setuplist [pubs] [\c!state=\v!start, + \c!criterium=\@@pbcriterium, \c!width=] \installstructurelistprocessor{pubs:userdata}% @@ -307,16 +308,6 @@ \newif\ifbibcitecompress\bibcitecompresstrue -% \appendtoks -% \processaction -% [\@@pbnumbering] -% [ \v!yes=>\let\@@pbinumbercommand\firstofoneargument, -% \v!no=>\let\@@pbinumbercommand\gobbleoneargument, -% \v!short=>\def\@@pbinumbercommand##1{\bibgetvars\currentpublicationkey}, -% \v!bib=>\def\@@pbinumbercommand##1{\bibgetvarn\currentpublicationkey}, -% \s!unknown=>\let\@@pbinumbercommand\firstofoneargument]% -% \to \everysetuppublications - \def\@@pbinumbercommand{\executeifdefined{\??pb:\c!numbercommand:\@@pbnumbering}\firstofoneargument} \letvalue{\??pb:\c!numbercommand:\v!yes }\firstofoneargument @@ -348,16 +339,10 @@ \def\usepublications[#1]% {\processcommalist[#1]\dousepublications} -% \def\dousepublications#1% -% {\doonlyonce{#1.\f!bibextension} -% {\readfile{#1.\f!bibextension} -% {\showmessage\m!publications{4}{#1.\f!bibextension}} -% {\showmessage\m!publications{2}{#1.\f!bibextension}}}} - \def\dousepublications#1% {\doonlyonce{#1.\f!bibextension}{\dodousepublications{#1}}} -\def\dodousepublications#1% +\def\dodousepublications#1% brr, this par stuff {\let\@@savedpar\par \let\par\ignorespaces \ifhmode\kern\zeropoint\fi @@ -394,7 +379,10 @@ \let\normalsetuppublicationlayout\setuppublicationlayout -\setuppublicationlist[\c!title=,\c!command=\dospecialbibinsert,\c!maybeyear=\v!on] +\setuppublicationlist + [\c!title=, + \c!command=\dospecialbibinsert, + \c!maybeyear=\v!on] %D \macros{bibalternative} %D @@ -442,20 +430,6 @@ \processcommacommand[\bibcommandlist]\simplebibdef -% \def\bibinsertdoi#1#2#3% -% {\begingroup -% \bibdoifelse{\@@pb@doi}% -% {\edef\ascii{\detokenize\expandafter{\@@pb@doi}}% probably not ok, to less expansion -% #1\expanded{\bibgotoDOI{\@@pb@thekey}{\ascii}}#2}{#3}% -% \endgroup} -% -% \def\bibinsertbiburl#1#2#3% -% {\begingroup -% \bibdoifelse{\@@pb@biburl}% -% {\edef\ascii{\detokenize\expandafter{\@@pb@biburl}}% probably not ok, to less expansion -% #1\expanded{\bibgotoURL{\@@pb@thekey}{\ascii}}#2}{#3}% -% \endgroup} - \def\bibinsertdoi#1#2#3% let's see how this fails {\bibdoifelse{\@@pb@doi}{#1\expanded{\bibgotoDOI{\@@pb@thekey}{\@@pb@doi}}#2}{#3}} @@ -506,19 +480,6 @@ %D \specialbibinsert{author}{\author@num}{<before>}{<after>}{<not>} %D \stoptyping -% \def\docomplexbibdef#1% -% {\def\currentype{#1}% -% \dosingleempty\dodocomplexbibdef} - -% \def\dodocomplexbibdef[#1]#2% -% {\def\firstarg{#1}\def\secondarg{#2}% -% \dosingleempty\dododocomplexbibdef} - -% \def\dododocomplexbibdef[#1]#2#3% -% {\@EA\increment\csname\currentype @num\endcsname -% \setevalue{\??pb @\currentype\csname \currentype @num\endcsname}% -% {{\secondarg}{#2}{#3}{#1}{\firstarg}}\ignorespaces} - \def\docomplexbibdef#1% {\dodoubleempty\dodocomplexbibdef[#1]} @@ -583,29 +544,6 @@ %D \#2 = number of items to be typeset %D \#3 = commacommand containing authors -% \def\dospecialbibinsert#1#2#3% -% {\getcommacommandsize[#3]% -% \scratchcounter\zerocount -% \def\processauthoritem##1% -% {\advance\scratchcounter\plusone -% \ifnum\numexpr\scratchcounter-\plusone\relax<#2\relax -% \publicationlistparameter{#1}##1% -% \ifnum\scratchcounter=#2\relax -% \ifnum\etallimitcounter<\commalistsize\relax -% \bibalternative{#1etaltext}% -% \fi -% \else\ifnum\numexpr\scratchcounter+\plusone\relax=#2\relax -% \ifnum\commalistsize>\plustwo -% \bibalternative\c!finalnamesep -% \else -% \bibalternative\c!lastnamesep -% \fi -% \else -% \bibalternative\c!namesep -% \fi\fi -% \fi}% -% \processcommacommand[#3]\processauthoritem} - \def\doprocessauthoritem#1#2#3% {\advance\scratchcounter\plusone \ifnum\numexpr\scratchcounter-\plusone\relax<#2\relax @@ -678,22 +616,6 @@ \def\clearbibitem#1{\setvalue{\??pb @#1}{}}% -% \def\clearbibitemtwo#1% -% {\letvalue{#1@num}\!!zerocount -% \doloop -% {\doifdefinedelse{\??pb @#1\recurselevel} -% {\letvalueempty{\??pb @#1\recurselevel}} % why not undefined? -% {\exitloop}}} - -% \def\clearbibitemtwo#1% -% {\letvalue{#1@num}\!!zerocount -% \doloop -% {\ifcsname\??pb @#1\recurselevel\endcsname -% \expandafter\let\csname\??pb @#1\recurselevel\undefined -% \else -% \exitloop -% \fi}} - \def\clearbibitemtwo#1% is this reset really needed? after all we reset the counter and we are local {%\dofastrecurse\plusone{\csname#1@num\endcsname}\plusone{\expandafter\let\csname\??pb @#1\recurselevel\undefined}% \letvalue{#1@num}\!!zerocount} @@ -786,7 +708,7 @@ {\preloadbiblist \doifdefinedelse{pbd:#1} \firstoftwoarguments - {\showmessage\m!publications{5}{#1 is unknown}\secondoftwoarguments}} + {\showmessage\m!publications{5}{#1}\secondoftwoarguments}} %D \macros{bib@crossref} %D @@ -822,7 +744,8 @@ \edef\currentlist{pubs}% \ctxlua{bibtex.hacks.reset(\number\bibtexoncemode)}% \doifelse{\listparameter\c!criterium}\v!all - {\ctxlua{bibtex.hacks.filterall()}} + {\showmessage\m!publications{7}{}% + \ctxlua{bibtex.hacks.filterall()}} {\doif{\listparameter\c!criterium}\v!cite {\setuplist[pubs][\c!criterium=\v!here]}% \doplacestructurelist @@ -836,6 +759,7 @@ \newif\ifinpublist + \def\initializepubslist {\def\currentlist{pubs}% \edef\@@pbnumbering{\@@pbnumbering}% @@ -843,7 +767,10 @@ {\ifx\@@pbnumbering\v!short \setbox\scratchbox\hbox{\@@pbnumbercommand{\listparameter\c!samplesize}}% \else - \setbox\scratchbox\hbox{\@@pbnumbercommand{\ctxlua{tex.write(structures.lists.size())}}}% + \doifelse{\listparameter\c!criterium}\v!all + {\setbox\scratchbox\hbox{\@@pbnumbercommand{\ctxlua{tex.write{bibtex.hacks.nofregistered()}}}}} + {\determinelistcharacteristics[pubs]% + \setbox\scratchbox\hbox{\@@pbnumbercommand{\structurelistsize}}}% \fi \edef\publistnumberbox{\hbox to \the\wd\scratchbox}% \expanded{\setuplist[pubs][\c!width=\the\wd\scratchbox,\c!distance=\zeropoint]}% @@ -882,7 +809,8 @@ \def\docompletepublications[#1]% {\begingroup - \setuplist[pubs][\c!criterium=\v!previous,#1] +% \setuplist[pubs][\c!criterium=\v!previous,#1] + \setuplist[pubs][#1] \doifelsenothing{\publicationlistparameter\c!title} {\systemsuppliedchapter[pubs]{\headtext{pubs}}} {\normalexpanded{\systemsuppliedchapter[pubs]{\publicationlistparameter\c!title}}}% @@ -897,7 +825,8 @@ \def\doplacepublications[#1]% {\begingroup - \setuplist[pubs][\c!criterium=\v!previous,#1]% +% \setuplist[pubs][\c!criterium=\v!previous,#1]% + \setuplist[pubs][#1]% \dodoplacepublications} \def\dodoplacepublications @@ -912,6 +841,9 @@ \global\advance\bibtexblock\plusone} %D \subsubject{What's in a publication} +%D +%D Watch out: here all means all publications in database, so use +%D text when you want text only. \unexpanded\def\typesetapublication#1% {\doifsomething{#1} @@ -981,17 +913,6 @@ %D \type{\cite} commands with a braced argument (these might appear %D in included data from the \type{.bib} file). -% \unexpanded\def\cite -% {\doifnextoptionalelse\dodocite\dobibref} -% \def\dobibref#1% -% {\docite[#1][]} -% \def\dodocite[#1]% -% {\startstrictinspectnextcharacter -% \dodoubleempty\dododocite[#1]} -% \def\dododocite % [#1][#2] -% {\stopstrictinspectnextcharacter -% \docite} - \unexpanded\def\cite {\strictdoifnextoptionalelse\dodocite\dobibref} @@ -1550,6 +1471,7 @@ [\c!monthconversion=, \c!alternative=apa, \c!method=\v!global, + \c!criterium=\v!previous, \c!refcommand=num, \c!numbercommand=\bibleftnumber] diff --git a/tex/context/base/blob-ini.lua b/tex/context/base/blob-ini.lua index ffb435c25..623325040 100644 --- a/tex/context/base/blob-ini.lua +++ b/tex/context/base/blob-ini.lua @@ -6,8 +6,11 @@ if not modules then modules = { } end modules ['blob-ini'] = { license = "see context related readme files" } --- later we will consider an OO variant. - +-- Experimental ... names and functionality will change ... just a +-- place to collect code, so: +-- +-- DON'T USE THESE FUNCTIONS AS THEY WILL CHANGE! +-- -- This module is just a playground. Occasionally we need to typeset -- at the lua and and this is one method. In principle we can construct -- pages this way too which sometimes makes sense in dumb cases. Actually, @@ -20,13 +23,10 @@ if not modules then modules = { } end modules ['blob-ini'] = { -- collapse or new pars -- interline spacing etc --- DON'T USE THESE FUNCTIONS AS THEY WILL CHANGE! - local type = type local report_blobs = logs.reporter("blobs") -local utfvalues = string.utfvalues local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns local fontdata = fonts.identifiers @@ -61,56 +61,13 @@ local ctxtextcapture = lpeg.Ct ( ( ) )^0) -local function tonodes(str,fnt,attr) -- (str,template_glyph) - if not str or str == "" then - return - end - local head, tail, space, fnt, template = nil, nil, nil, nil, nil - if not fnt then - fnt = current_font() - elseif type(fnt) ~= "number" and fnt.id == "glyph" then - fnt, template = nil, fnt - -- else - -- already a number - end - for s in utfvalues(str) do - local n - if s == 32 then - if not space then - local parameters = fontdata[fnt].parameters - space = new_glue(parameters.space,parameters.space_stretch,parameters.space_shrink) - n = space - else - n = copy_node(space) - end - elseif template then - n = copy_node(template) - n.char = s - else - n = new_glyph(fnt,s) - end - if attr then -- normally false when template - n.attr = copy_node_list(attr) - end - if head then - insert_node_after(head,tail,n) - else - head = n - end - tail = n - end - return head, tail -end - -blobs.tonodes = tonodes - function blobs.new() return { list = { }, } end -function blobs.append(t,str) +function blobs.append(t,str) -- will be link nodes.link local kind = type(str) local dummy = nil if kind == "number" then diff --git a/tex/context/base/buff-ini.lua b/tex/context/base/buff-ini.lua index 9de1cd606..a0bf29b80 100644 --- a/tex/context/base/buff-ini.lua +++ b/tex/context/base/buff-ini.lua @@ -177,7 +177,10 @@ function commands.savebuffer(list,name) -- name is optional end function commands.getbuffer(name) - context.viafile(data[name]) + local str = data[name] + if str and str ~= "" then + context.viafile(str) + end end function commands.getbuffermkvi(name) diff --git a/tex/context/base/cldf-ini.lua b/tex/context/base/cldf-ini.lua index b7f9ee44b..da8e70962 100644 --- a/tex/context/base/cldf-ini.lua +++ b/tex/context/base/cldf-ini.lua @@ -39,7 +39,7 @@ local texcount = tex.count local isnode = node.is_node -- after 0.65 just node.type local writenode = node.write -local copynodelist = node.copylist +local copynodelist = node.copy_list local ctxcatcodes = tex.ctxcatcodes local prtcatcodes = tex.prtcatcodes @@ -219,8 +219,10 @@ local methodhandler = resolvers.methodhandler function context.viafile(data) -- this is the only way to deal with nested buffers -- and other catcode sensitive data - local filename = resolvers.savers.byscheme("virtual","viafile",data) - context.input(filename) + if data and data ~= "" then + local filename = resolvers.savers.byscheme("virtual","viafile",data) + context.input(filename) + end end -- -- -- diff --git a/tex/context/base/cont-new.mkii b/tex/context/base/cont-new.mkii index 7b70a1eca..c5ffe80c9 100644 --- a/tex/context/base/cont-new.mkii +++ b/tex/context/base/cont-new.mkii @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2011.02.20 20:34} +\newcontextversion{2011.02.25 22:03} %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/cont-new.mkiv b/tex/context/base/cont-new.mkiv index a4be52755..b47ff0ef2 100644 --- a/tex/context/base/cont-new.mkiv +++ b/tex/context/base/cont-new.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2011.02.20 20:34} +\newcontextversion{2011.02.25 22:03} %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/context.mkii b/tex/context/base/context.mkii index 0b27e58b8..9d4a81588 100644 --- a/tex/context/base/context.mkii +++ b/tex/context/base/context.mkii @@ -20,7 +20,7 @@ %D your styles an modules. \edef\contextformat {\jobname} -\edef\contextversion{2011.02.20 20:34} +\edef\contextversion{2011.02.25 22:03} %D For those who want to use this: diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv index fe13f3a7c..1906ffea4 100644 --- a/tex/context/base/context.mkiv +++ b/tex/context/base/context.mkiv @@ -20,7 +20,7 @@ %D your styles an modules. \edef\contextformat {\jobname} -\edef\contextversion{2011.02.20 20:34} +\edef\contextversion{2011.02.25 22:03} %D For those who want to use this: @@ -113,15 +113,17 @@ \loadmarkfile{attr-ini} +\loadmarkfile{core-var} +\loadmarkfile{core-env} + +\loadmarkfile{layo-ini} + \loadmarkfile{node-ini} \loadmarkfile{node-fin} \loadmarkfile{node-mig} \loadmarkfile{node-par} %loadmarkfile{node-pag} -\loadmarkfile{core-var} -\loadmarkfile{core-env} - \loadmarkfile{back-ini} \loadmarkfile{attr-col} @@ -243,7 +245,8 @@ \loadmarkfile{page-lin} \loadmarkfile{page-par} -\loadmarkfile{page-mar} +%loadmarkfile{page-mar} % also commented code in anch-pgr.mkiv +\loadmarkfile{typo-mar} \loadmarkfile{core-job} % why so late? diff --git a/tex/context/base/core-con.lua b/tex/context/base/core-con.lua index 277a7354d..ea1f6635d 100644 --- a/tex/context/base/core-con.lua +++ b/tex/context/base/core-con.lua @@ -42,7 +42,7 @@ function commands.number(n) context(n) end -- to be reconsidered ... languages namespace here, might become local plus a register command -languages.counters = allocate { +local counters = allocate { ['**'] = { 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, @@ -118,7 +118,7 @@ languages.counters = allocate { }, } -local counters = languages.counters +languages.counters = counters counters['ar'] = counters['arabic'] counters['gr'] = counters['greek'] @@ -175,7 +175,7 @@ local function do_alphabetic(n,mapping,mapper,t) end local chr = mapping[n] or fallback if mapper then - chr = mapper(chr) + chr = mapper[chr] end local max = #mapping if n > max then @@ -208,12 +208,12 @@ converters.Character = Character converters.characters = characters converters.Characters = Characters -function commands.alphabetic(n) context(alphabetic(n)) end -function commands.Alphabetic(n) context(Alphabetic(n)) end -function commands.character (n) context(character (n)) end -function commands.Character (n) context(Character (n)) end -function commands.characters(n) context(characters(n)) end -function commands.Characters(n) context(Characters(n)) end +function commands.alphabetic(n,c) context(alphabetic(n,c)) end +function commands.Alphabetic(n,c) context(Alphabetic(n,c)) end +function commands.character (n) context(character (n)) end +function commands.Character (n) context(Character (n)) end +function commands.characters(n) context(characters(n)) end +function commands.Characters(n) context(Characters(n)) end local days = { [false] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, diff --git a/tex/context/base/core-ini.mkiv b/tex/context/base/core-ini.mkiv index 90ec9df24..34e20d3f1 100644 --- a/tex/context/base/core-ini.mkiv +++ b/tex/context/base/core-ini.mkiv @@ -27,7 +27,7 @@ \appendtoks \checkindentation \to \everypar \appendtoks \showparagraphnumber \to \everypar \appendtoks \restoreinterlinepenalty \to \everypar -\appendtoks \flushmargincontents \to \everypar +%appendtoks \flushmargincontents \to \everypar \appendtoks \flushcommentanchors \to \everypar \appendtoks \flushnotes \to \everypar \appendtoks \synchronizenotes \to \everypar diff --git a/tex/context/base/core-job.mkiv b/tex/context/base/core-job.mkiv index 28a864655..db8d3ed93 100644 --- a/tex/context/base/core-job.mkiv +++ b/tex/context/base/core-job.mkiv @@ -303,7 +303,7 @@ % \appendtoks \synchronizesidefloats \to \everypar % \appendtoks \checkindentation \to \everypar % \appendtoks \showparagraphnumber \to \everypar -% \appendtoks \flushmargincontents \to \everypar +% %appendtoks \flushmargincontents \to \everypar % \appendtoks \flushcommentanchors \to \everypar % \appendtoks \synchronizenotes \to \everypar diff --git a/tex/context/base/font-afm.lua b/tex/context/base/font-afm.lua index 3e6625386..e9450f88d 100644 --- a/tex/context/base/font-afm.lua +++ b/tex/context/base/font-afm.lua @@ -1084,22 +1084,20 @@ node_initializers.lineheight = common_initializers.lineheight base_initializers.compose = common_initializers.compose node_initializers.compose = common_initializers.compose --- afm specific, encodings ...kind of obsolete - -register_feature('encoding') - -base_initializers.encoding = common_initializers.encoding -node_initializers.encoding = common_initializers.encoding - --- todo: oldstyle smallcaps as features for afm files (use with care) - -base_initializers.onum = common_initializers.oldstyle -base_initializers.smcp = common_initializers.smallcaps -base_initializers.fkcp = common_initializers.fakecaps - -register_feature('onum',false) -register_feature('smcp',false) -register_feature('fkcp',false) +-- afm specific, obsolete +-- +-- register_feature('encoding') +-- +-- base_initializers.encoding = common_initializers.encoding +-- node_initializers.encoding = common_initializers.encoding +-- +-- base_initializers.onum = common_initializers.oldstyle +-- base_initializers.smcp = common_initializers.smallcaps +-- base_initializers.fkcp = common_initializers.fakecaps +-- +-- register_feature('onum',false) +-- register_feature('smcp',false) +-- register_feature('fkcp',false) -- readers diff --git a/tex/context/base/font-age.lua b/tex/context/base/font-age.lua new file mode 100644 index 000000000..5c19d41b1 --- /dev/null +++ b/tex/context/base/font-age.lua @@ -0,0 +1,3743 @@ +if not modules then modules = { } end modules ['font-map'] = { + version = 1.001, + comment = "companion to font-ini.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "derived from http://www.adobe.com/devnet/opentype/archives/glyphlist.txt", + original = "Adobe Glyph List, version 2.0, September 20, 2002", +} + +fonts = fonts or { } +fonts.enc = fonts.enc or { } +fonts.enc.agl = fonts.enc.agl or { } + +fonts.enc.agl.unicodes = { -- generated + ["A"]=65, + ["AE"]=198, + ["AEacute"]=508, + ["AEmacron"]=482, + ["Aacute"]=193, + ["Abreve"]=258, + ["Abreveacute"]=7854, + ["Abrevecyrillic"]=1232, + ["Abrevedotbelow"]=7862, + ["Abrevegrave"]=7856, + ["Abrevehookabove"]=7858, + ["Abrevetilde"]=7860, + ["Acaron"]=461, + ["Acircle"]=9398, + ["Acircumflex"]=194, + ["Acircumflexacute"]=7844, + ["Acircumflexdotbelow"]=7852, + ["Acircumflexgrave"]=7846, + ["Acircumflexhookabove"]=7848, + ["Acircumflextilde"]=7850, + ["Adblgrave"]=512, + ["Adieresis"]=196, + ["Adieresiscyrillic"]=1234, + ["Adieresismacron"]=478, + ["Adotbelow"]=7840, + ["Adotmacron"]=480, + ["Agrave"]=192, + ["Ahookabove"]=7842, + ["Aiecyrillic"]=1236, + ["Ainvertedbreve"]=514, + ["Alpha"]=913, + ["Alphatonos"]=902, + ["Amacron"]=256, + ["Amonospace"]=65313, + ["Aogonek"]=260, + ["Aring"]=197, + ["Aringacute"]=506, + ["Aringbelow"]=7680, + ["Atilde"]=195, + ["Aybarmenian"]=1329, + ["B"]=66, + ["Bcircle"]=9399, + ["Bdotaccent"]=7682, + ["Bdotbelow"]=7684, + ["Benarmenian"]=1330, + ["Beta"]=914, + ["Bhook"]=385, + ["Blinebelow"]=7686, + ["Bmonospace"]=65314, + ["Btopbar"]=386, + ["C"]=67, + ["Caarmenian"]=1342, + ["Cacute"]=262, + ["Ccaron"]=268, + ["Ccedilla"]=199, + ["Ccedillaacute"]=7688, + ["Ccircle"]=9400, + ["Ccircumflex"]=264, + ["Cdotaccent"]=266, + ["Chaarmenian"]=1353, + ["Cheabkhasiancyrillic"]=1212, + ["Chedescenderabkhasiancyrillic"]=1214, + ["Chedescendercyrillic"]=1206, + ["Chedieresiscyrillic"]=1268, + ["Cheharmenian"]=1347, + ["Chekhakassiancyrillic"]=1227, + ["Cheverticalstrokecyrillic"]=1208, + ["Chi"]=935, + ["Chook"]=391, + ["Cmonospace"]=65315, + ["Coarmenian"]=1361, + ["D"]=68, + ["DZ"]=497, + ["DZcaron"]=452, + ["Daarmenian"]=1332, + ["Dafrican"]=393, + ["Dcaron"]=270, + ["Dcedilla"]=7696, + ["Dcircle"]=9401, + ["Dcircumflexbelow"]=7698, + ["Ddotaccent"]=7690, + ["Ddotbelow"]=7692, + ["Deicoptic"]=1006, + ["Deltagreek"]=916, + ["Dhook"]=394, + ["Digammagreek"]=988, + ["Dlinebelow"]=7694, + ["Dmonospace"]=65316, + ["Dslash"]=272, + ["Dtopbar"]=395, + ["Dz"]=498, + ["Dzcaron"]=453, + ["Dzeabkhasiancyrillic"]=1248, + ["E"]=69, + ["Eacute"]=201, + ["Ebreve"]=276, + ["Ecaron"]=282, + ["Ecedillabreve"]=7708, + ["Echarmenian"]=1333, + ["Ecircle"]=9402, + ["Ecircumflex"]=202, + ["Ecircumflexacute"]=7870, + ["Ecircumflexbelow"]=7704, + ["Ecircumflexdotbelow"]=7878, + ["Ecircumflexgrave"]=7872, + ["Ecircumflexhookabove"]=7874, + ["Ecircumflextilde"]=7876, + ["Edblgrave"]=516, + ["Edieresis"]=203, + ["Edotaccent"]=278, + ["Edotbelow"]=7864, + ["Egrave"]=200, + ["Eharmenian"]=1335, + ["Ehookabove"]=7866, + ["Eightroman"]=8551, + ["Einvertedbreve"]=518, + ["Eiotifiedcyrillic"]=1124, + ["Elevenroman"]=8554, + ["Emacron"]=274, + ["Emacronacute"]=7702, + ["Emacrongrave"]=7700, + ["Emonospace"]=65317, + ["Endescendercyrillic"]=1186, + ["Eng"]=330, + ["Enghecyrillic"]=1188, + ["Enhookcyrillic"]=1223, + ["Eogonek"]=280, + ["Eopen"]=400, + ["Epsilon"]=917, + ["Epsilontonos"]=904, + ["Ereversed"]=398, + ["Esdescendercyrillic"]=1194, + ["Esh"]=425, + ["Eta"]=919, + ["Etarmenian"]=1336, + ["Etatonos"]=905, + ["Eth"]=208, + ["Etilde"]=7868, + ["Etildebelow"]=7706, + ["Ezh"]=439, + ["Ezhcaron"]=494, + ["Ezhreversed"]=440, + ["F"]=70, + ["Fcircle"]=9403, + ["Fdotaccent"]=7710, + ["Feharmenian"]=1366, + ["Feicoptic"]=996, + ["Fhook"]=401, + ["Fiveroman"]=8548, + ["Fmonospace"]=65318, + ["Fourroman"]=8547, + ["G"]=71, + ["GBsquare"]=13191, + ["Gacute"]=500, + ["Gamma"]=915, + ["Gammaafrican"]=404, + ["Gangiacoptic"]=1002, + ["Gbreve"]=286, + ["Gcaron"]=486, + ["Gcircle"]=9404, + ["Gcircumflex"]=284, + ["Gcommaaccent"]=290, + ["Gdotaccent"]=288, + ["Ghadarmenian"]=1346, + ["Ghemiddlehookcyrillic"]=1172, + ["Ghestrokecyrillic"]=1170, + ["Ghook"]=403, + ["Gimarmenian"]=1331, + ["Gmacron"]=7712, + ["Gmonospace"]=65319, + ["Gsmallhook"]=667, + ["Gstroke"]=484, + ["H"]=72, + ["HPsquare"]=13259, + ["Haabkhasiancyrillic"]=1192, + ["Hadescendercyrillic"]=1202, + ["Hbar"]=294, + ["Hbrevebelow"]=7722, + ["Hcedilla"]=7720, + ["Hcircle"]=9405, + ["Hcircumflex"]=292, + ["Hdieresis"]=7718, + ["Hdotaccent"]=7714, + ["Hdotbelow"]=7716, + ["Hmonospace"]=65320, + ["Hoarmenian"]=1344, + ["Horicoptic"]=1000, + ["Hzsquare"]=13200, + ["I"]=73, + ["IJ"]=306, + ["Iacute"]=205, + ["Ibreve"]=300, + ["Icaron"]=463, + ["Icircle"]=9406, + ["Icircumflex"]=206, + ["Idblgrave"]=520, + ["Idieresis"]=207, + ["Idieresisacute"]=7726, + ["Idieresiscyrillic"]=1252, + ["Idotaccent"]=304, + ["Idotbelow"]=7882, + ["Iebrevecyrillic"]=1238, + ["Ifraktur"]=8465, + ["Igrave"]=204, + ["Ihookabove"]=7880, + ["Iinvertedbreve"]=522, + ["Imacron"]=298, + ["Imacroncyrillic"]=1250, + ["Imonospace"]=65321, + ["Iniarmenian"]=1339, + ["Iogonek"]=302, + ["Iota"]=921, + ["Iotaafrican"]=406, + ["Iotadieresis"]=938, + ["Iotatonos"]=906, + ["Istroke"]=407, + ["Itilde"]=296, + ["Itildebelow"]=7724, + ["Izhitsadblgravecyrillic"]=1142, + ["J"]=74, + ["Jaarmenian"]=1345, + ["Jcircle"]=9407, + ["Jcircumflex"]=308, + ["Jheharmenian"]=1355, + ["Jmonospace"]=65322, + ["K"]=75, + ["KBsquare"]=13189, + ["KKsquare"]=13261, + ["Kabashkircyrillic"]=1184, + ["Kacute"]=7728, + ["Kadescendercyrillic"]=1178, + ["Kahookcyrillic"]=1219, + ["Kappa"]=922, + ["Kastrokecyrillic"]=1182, + ["Kaverticalstrokecyrillic"]=1180, + ["Kcaron"]=488, + ["Kcircle"]=9408, + ["Kcommaaccent"]=310, + ["Kdotbelow"]=7730, + ["Keharmenian"]=1364, + ["Kenarmenian"]=1343, + ["Kheicoptic"]=998, + ["Khook"]=408, + ["Klinebelow"]=7732, + ["Kmonospace"]=65323, + ["Koppacyrillic"]=1152, + ["Koppagreek"]=990, + ["Ksicyrillic"]=1134, + ["L"]=76, + ["LJ"]=455, + ["Lacute"]=313, + ["Lambda"]=923, + ["Lcaron"]=317, + ["Lcircle"]=9409, + ["Lcircumflexbelow"]=7740, + ["Lcommaaccent"]=315, + ["Ldotaccent"]=319, + ["Ldotbelow"]=7734, + ["Ldotbelowmacron"]=7736, + ["Liwnarmenian"]=1340, + ["Lj"]=456, + ["Llinebelow"]=7738, + ["Lmonospace"]=65324, + ["Lslash"]=321, + ["M"]=77, + ["MBsquare"]=13190, + ["Macute"]=7742, + ["Mcircle"]=9410, + ["Mdotaccent"]=7744, + ["Mdotbelow"]=7746, + ["Menarmenian"]=1348, + ["Mmonospace"]=65325, + ["Mturned"]=412, + ["Mu"]=924, + ["N"]=78, + ["NJ"]=458, + ["Nacute"]=323, + ["Ncaron"]=327, + ["Ncircle"]=9411, + ["Ncircumflexbelow"]=7754, + ["Ncommaaccent"]=325, + ["Ndotaccent"]=7748, + ["Ndotbelow"]=7750, + ["Nhookleft"]=413, + ["Nineroman"]=8552, + ["Nj"]=459, + ["Nlinebelow"]=7752, + ["Nmonospace"]=65326, + ["Nowarmenian"]=1350, + ["Ntilde"]=209, + ["Nu"]=925, + ["O"]=79, + ["OE"]=338, + ["Oacute"]=211, + ["Obarredcyrillic"]=1256, + ["Obarreddieresiscyrillic"]=1258, + ["Obreve"]=334, + ["Ocaron"]=465, + ["Ocenteredtilde"]=415, + ["Ocircle"]=9412, + ["Ocircumflex"]=212, + ["Ocircumflexacute"]=7888, + ["Ocircumflexdotbelow"]=7896, + ["Ocircumflexgrave"]=7890, + ["Ocircumflexhookabove"]=7892, + ["Ocircumflextilde"]=7894, + ["Odblgrave"]=524, + ["Odieresis"]=214, + ["Odieresiscyrillic"]=1254, + ["Odotbelow"]=7884, + ["Ograve"]=210, + ["Oharmenian"]=1365, + ["Ohookabove"]=7886, + ["Ohorn"]=416, + ["Ohornacute"]=7898, + ["Ohorndotbelow"]=7906, + ["Ohorngrave"]=7900, + ["Ohornhookabove"]=7902, + ["Ohorntilde"]=7904, + ["Ohungarumlaut"]=336, + ["Oi"]=418, + ["Oinvertedbreve"]=526, + ["Omacron"]=332, + ["Omacronacute"]=7762, + ["Omacrongrave"]=7760, + ["Omega"]=8486, + ["Omegacyrillic"]=1120, + ["Omegagreek"]=937, + ["Omegaroundcyrillic"]=1146, + ["Omegatitlocyrillic"]=1148, + ["Omegatonos"]=911, + ["Omicron"]=927, + ["Omicrontonos"]=908, + ["Omonospace"]=65327, + ["Oneroman"]=8544, + ["Oogonek"]=490, + ["Oogonekmacron"]=492, + ["Oopen"]=390, + ["Oslash"]=216, + ["Ostrokeacute"]=510, + ["Otcyrillic"]=1150, + ["Otilde"]=213, + ["Otildeacute"]=7756, + ["Otildedieresis"]=7758, + ["P"]=80, + ["Pacute"]=7764, + ["Pcircle"]=9413, + ["Pdotaccent"]=7766, + ["Peharmenian"]=1354, + ["Pemiddlehookcyrillic"]=1190, + ["Phi"]=934, + ["Phook"]=420, + ["Pi"]=928, + ["Piwrarmenian"]=1363, + ["Pmonospace"]=65328, + ["Psi"]=936, + ["Psicyrillic"]=1136, + ["Q"]=81, + ["Qcircle"]=9414, + ["Qmonospace"]=65329, + ["R"]=82, + ["Raarmenian"]=1356, + ["Racute"]=340, + ["Rcaron"]=344, + ["Rcircle"]=9415, + ["Rcommaaccent"]=342, + ["Rdblgrave"]=528, + ["Rdotaccent"]=7768, + ["Rdotbelow"]=7770, + ["Rdotbelowmacron"]=7772, + ["Reharmenian"]=1360, + ["Rfraktur"]=8476, + ["Rho"]=929, + ["Rinvertedbreve"]=530, + ["Rlinebelow"]=7774, + ["Rmonospace"]=65330, + ["Rsmallinverted"]=641, + ["Rsmallinvertedsuperior"]=694, + ["S"]=83, + ["SF010000"]=9484, + ["SF020000"]=9492, + ["SF030000"]=9488, + ["SF040000"]=9496, + ["SF050000"]=9532, + ["SF060000"]=9516, + ["SF070000"]=9524, + ["SF080000"]=9500, + ["SF090000"]=9508, + ["SF100000"]=9472, + ["SF110000"]=9474, + ["SF190000"]=9569, + ["SF200000"]=9570, + ["SF210000"]=9558, + ["SF220000"]=9557, + ["SF230000"]=9571, + ["SF240000"]=9553, + ["SF250000"]=9559, + ["SF260000"]=9565, + ["SF270000"]=9564, + ["SF280000"]=9563, + ["SF360000"]=9566, + ["SF370000"]=9567, + ["SF380000"]=9562, + ["SF390000"]=9556, + ["SF400000"]=9577, + ["SF410000"]=9574, + ["SF420000"]=9568, + ["SF430000"]=9552, + ["SF440000"]=9580, + ["SF450000"]=9575, + ["SF460000"]=9576, + ["SF470000"]=9572, + ["SF480000"]=9573, + ["SF490000"]=9561, + ["SF500000"]=9560, + ["SF510000"]=9554, + ["SF520000"]=9555, + ["SF530000"]=9579, + ["SF540000"]=9578, + ["Sacute"]=346, + ["Sacutedotaccent"]=7780, + ["Sampigreek"]=992, + ["Scaron"]=352, + ["Scarondotaccent"]=7782, + ["Scedilla"]=350, + ["Schwa"]=399, + ["Schwacyrillic"]=1240, + ["Schwadieresiscyrillic"]=1242, + ["Scircle"]=9416, + ["Scircumflex"]=348, + ["Scommaaccent"]=536, + ["Sdotaccent"]=7776, + ["Sdotbelow"]=7778, + ["Sdotbelowdotaccent"]=7784, + ["Seharmenian"]=1357, + ["Sevenroman"]=8550, + ["Shaarmenian"]=1351, + ["Sheicoptic"]=994, + ["Shhacyrillic"]=1210, + ["Shimacoptic"]=1004, + ["Sigma"]=931, + ["Sixroman"]=8549, + ["Smonospace"]=65331, + ["Stigmagreek"]=986, + ["T"]=84, + ["Tau"]=932, + ["Tbar"]=358, + ["Tcaron"]=356, + ["Tcircle"]=9417, + ["Tcircumflexbelow"]=7792, + ["Tcommaaccent"]=354, + ["Tdotaccent"]=7786, + ["Tdotbelow"]=7788, + ["Tedescendercyrillic"]=1196, + ["Tenroman"]=8553, + ["Tetsecyrillic"]=1204, + ["Theta"]=920, + ["Thook"]=428, + ["Thorn"]=222, + ["Threeroman"]=8546, + ["Tiwnarmenian"]=1359, + ["Tlinebelow"]=7790, + ["Tmonospace"]=65332, + ["Toarmenian"]=1337, + ["Tonefive"]=444, + ["Tonesix"]=388, + ["Tonetwo"]=423, + ["Tretroflexhook"]=430, + ["Twelveroman"]=8555, + ["Tworoman"]=8545, + ["U"]=85, + ["Uacute"]=218, + ["Ubreve"]=364, + ["Ucaron"]=467, + ["Ucircle"]=9418, + ["Ucircumflex"]=219, + ["Ucircumflexbelow"]=7798, + ["Udblgrave"]=532, + ["Udieresis"]=220, + ["Udieresisacute"]=471, + ["Udieresisbelow"]=7794, + ["Udieresiscaron"]=473, + ["Udieresiscyrillic"]=1264, + ["Udieresisgrave"]=475, + ["Udieresismacron"]=469, + ["Udotbelow"]=7908, + ["Ugrave"]=217, + ["Uhookabove"]=7910, + ["Uhorn"]=431, + ["Uhornacute"]=7912, + ["Uhorndotbelow"]=7920, + ["Uhorngrave"]=7914, + ["Uhornhookabove"]=7916, + ["Uhorntilde"]=7918, + ["Uhungarumlaut"]=368, + ["Uhungarumlautcyrillic"]=1266, + ["Uinvertedbreve"]=534, + ["Ukcyrillic"]=1144, + ["Umacron"]=362, + ["Umacroncyrillic"]=1262, + ["Umacrondieresis"]=7802, + ["Umonospace"]=65333, + ["Uogonek"]=370, + ["Upsilon"]=933, + ["Upsilonacutehooksymbolgreek"]=979, + ["Upsilonafrican"]=433, + ["Upsilondieresis"]=939, + ["Upsilondieresishooksymbolgreek"]=980, + ["Upsilonhooksymbol"]=978, + ["Upsilontonos"]=910, + ["Uring"]=366, + ["Ustraightcyrillic"]=1198, + ["Ustraightstrokecyrillic"]=1200, + ["Utilde"]=360, + ["Utildeacute"]=7800, + ["Utildebelow"]=7796, + ["V"]=86, + ["Vcircle"]=9419, + ["Vdotbelow"]=7806, + ["Vewarmenian"]=1358, + ["Vhook"]=434, + ["Vmonospace"]=65334, + ["Voarmenian"]=1352, + ["Vtilde"]=7804, + ["W"]=87, + ["Wacute"]=7810, + ["Wcircle"]=9420, + ["Wcircumflex"]=372, + ["Wdieresis"]=7812, + ["Wdotaccent"]=7814, + ["Wdotbelow"]=7816, + ["Wgrave"]=7808, + ["Wmonospace"]=65335, + ["X"]=88, + ["Xcircle"]=9421, + ["Xdieresis"]=7820, + ["Xdotaccent"]=7818, + ["Xeharmenian"]=1341, + ["Xi"]=926, + ["Xmonospace"]=65336, + ["Y"]=89, + ["Yacute"]=221, + ["Ycircle"]=9422, + ["Ycircumflex"]=374, + ["Ydieresis"]=376, + ["Ydotaccent"]=7822, + ["Ydotbelow"]=7924, + ["Yerudieresiscyrillic"]=1272, + ["Ygrave"]=7922, + ["Yhook"]=435, + ["Yhookabove"]=7926, + ["Yiarmenian"]=1349, + ["Yiwnarmenian"]=1362, + ["Ymonospace"]=65337, + ["Ytilde"]=7928, + ["Yusbigcyrillic"]=1130, + ["Yusbigiotifiedcyrillic"]=1132, + ["Yuslittlecyrillic"]=1126, + ["Yuslittleiotifiedcyrillic"]=1128, + ["Z"]=90, + ["Zaarmenian"]=1334, + ["Zacute"]=377, + ["Zcaron"]=381, + ["Zcircle"]=9423, + ["Zcircumflex"]=7824, + ["Zdotaccent"]=379, + ["Zdotbelow"]=7826, + ["Zedescendercyrillic"]=1176, + ["Zedieresiscyrillic"]=1246, + ["Zeta"]=918, + ["Zhearmenian"]=1338, + ["Zhebrevecyrillic"]=1217, + ["Zhedescendercyrillic"]=1174, + ["Zhedieresiscyrillic"]=1244, + ["Zlinebelow"]=7828, + ["Zmonospace"]=65338, + ["Zstroke"]=437, + ["a"]=97, + ["aabengali"]=2438, + ["aacute"]=225, + ["aadeva"]=2310, + ["aagujarati"]=2694, + ["aagurmukhi"]=2566, + ["aamatragurmukhi"]=2622, + ["aarusquare"]=13059, + ["aavowelsignbengali"]=2494, + ["aavowelsigndeva"]=2366, + ["aavowelsigngujarati"]=2750, + ["abbreviationmarkarmenian"]=1375, + ["abbreviationsigndeva"]=2416, + ["abengali"]=2437, + ["abopomofo"]=12570, + ["abreve"]=259, + ["abreveacute"]=7855, + ["abrevecyrillic"]=1233, + ["abrevedotbelow"]=7863, + ["abrevegrave"]=7857, + ["abrevehookabove"]=7859, + ["abrevetilde"]=7861, + ["acaron"]=462, + ["acircle"]=9424, + ["acircumflex"]=226, + ["acircumflexacute"]=7845, + ["acircumflexdotbelow"]=7853, + ["acircumflexgrave"]=7847, + ["acircumflexhookabove"]=7849, + ["acircumflextilde"]=7851, + ["acute"]=180, + ["acutebelowcmb"]=791, + ["acutecomb"]=769, + ["acutedeva"]=2388, + ["acutelowmod"]=719, + ["acutetonecmb"]=833, + ["adblgrave"]=513, + ["addakgurmukhi"]=2673, + ["adeva"]=2309, + ["adieresis"]=228, + ["adieresiscyrillic"]=1235, + ["adieresismacron"]=479, + ["adotbelow"]=7841, + ["adotmacron"]=481, + ["ae"]=230, + ["aeacute"]=509, + ["aekorean"]=12624, + ["aemacron"]=483, + ["afii10017"]=1040, + ["afii10018"]=1041, + ["afii10019"]=1042, + ["afii10020"]=1043, + ["afii10021"]=1044, + ["afii10022"]=1045, + ["afii10023"]=1025, + ["afii10024"]=1046, + ["afii10025"]=1047, + ["afii10026"]=1048, + ["afii10027"]=1049, + ["afii10028"]=1050, + ["afii10029"]=1051, + ["afii10030"]=1052, + ["afii10031"]=1053, + ["afii10032"]=1054, + ["afii10033"]=1055, + ["afii10034"]=1056, + ["afii10035"]=1057, + ["afii10036"]=1058, + ["afii10037"]=1059, + ["afii10038"]=1060, + ["afii10039"]=1061, + ["afii10040"]=1062, + ["afii10041"]=1063, + ["afii10042"]=1064, + ["afii10043"]=1065, + ["afii10044"]=1066, + ["afii10045"]=1067, + ["afii10046"]=1068, + ["afii10047"]=1069, + ["afii10048"]=1070, + ["afii10049"]=1071, + ["afii10050"]=1168, + ["afii10051"]=1026, + ["afii10052"]=1027, + ["afii10053"]=1028, + ["afii10054"]=1029, + ["afii10055"]=1030, + ["afii10056"]=1031, + ["afii10057"]=1032, + ["afii10058"]=1033, + ["afii10059"]=1034, + ["afii10060"]=1035, + ["afii10061"]=1036, + ["afii10062"]=1038, + ["afii10065"]=1072, + ["afii10145"]=1039, + ["afii10146"]=1122, + ["afii10147"]=1138, + ["afii10148"]=1140, + ["afii299"]=8206, + ["afii300"]=8207, + ["afii301"]=8205, + ["afii57534"]=1749, + ["afii61573"]=8236, + ["afii61574"]=8237, + ["afii61575"]=8238, + ["agrave"]=224, + ["agujarati"]=2693, + ["agurmukhi"]=2565, + ["ahiragana"]=12354, + ["ahookabove"]=7843, + ["aibengali"]=2448, + ["aibopomofo"]=12574, + ["aideva"]=2320, + ["aiecyrillic"]=1237, + ["aigujarati"]=2704, + ["aigurmukhi"]=2576, + ["aimatragurmukhi"]=2632, + ["ainarabic"]=1593, + ["ainfinalarabic"]=65226, + ["aininitialarabic"]=65227, + ["ainmedialarabic"]=65228, + ["ainvertedbreve"]=515, + ["aivowelsignbengali"]=2504, + ["aivowelsigndeva"]=2376, + ["aivowelsigngujarati"]=2760, + ["akatakana"]=12450, + ["akatakanahalfwidth"]=65393, + ["akorean"]=12623, + ["alefarabic"]=1575, + ["alefdageshhebrew"]=64304, + ["aleffinalarabic"]=65166, + ["alefhamzaabovearabic"]=1571, + ["alefhamzaabovefinalarabic"]=65156, + ["alefhamzabelowarabic"]=1573, + ["alefhamzabelowfinalarabic"]=65160, + ["alefhebrew"]=1488, + ["aleflamedhebrew"]=64335, + ["alefmaddaabovearabic"]=1570, + ["alefmaddaabovefinalarabic"]=65154, + ["alefmaksuraarabic"]=1609, + ["alefmaksurafinalarabic"]=65264, + ["alefpatahhebrew"]=64302, + ["alefqamatshebrew"]=64303, + ["aleph"]=8501, + ["allequal"]=8780, + ["alpha"]=945, + ["alphatonos"]=940, + ["amacron"]=257, + ["amonospace"]=65345, + ["ampersand"]=38, + ["ampersandmonospace"]=65286, + ["amsquare"]=13250, + ["anbopomofo"]=12578, + ["angbopomofo"]=12580, + ["angkhankhuthai"]=3674, + ["angle"]=8736, + ["anglebracketleft"]=12296, + ["anglebracketleftvertical"]=65087, + ["anglebracketright"]=12297, + ["anglebracketrightvertical"]=65088, + ["angleleft"]=9001, + ["angleright"]=9002, + ["angstrom"]=8491, + ["anoteleia"]=903, + ["anudattadeva"]=2386, + ["anusvarabengali"]=2434, + ["anusvaradeva"]=2306, + ["anusvaragujarati"]=2690, + ["aogonek"]=261, + ["apaatosquare"]=13056, + ["aparen"]=9372, + ["apostrophearmenian"]=1370, + ["apostrophemod"]=700, + ["apple"]=63743, + ["approaches"]=8784, + ["approxequal"]=8776, + ["approxequalorimage"]=8786, + ["araeaekorean"]=12686, + ["araeakorean"]=12685, + ["arc"]=8978, + ["arighthalfring"]=7834, + ["aring"]=229, + ["aringacute"]=507, + ["aringbelow"]=7681, + ["arrowboth"]=8596, + ["arrowdashdown"]=8675, + ["arrowdashleft"]=8672, + ["arrowdashright"]=8674, + ["arrowdashup"]=8673, + ["arrowdbldown"]=8659, + ["arrowdblup"]=8657, + ["arrowdown"]=8595, + ["arrowdownleft"]=8601, + ["arrowdownright"]=8600, + ["arrowdownwhite"]=8681, + ["arrowheaddownmod"]=709, + ["arrowheadleftmod"]=706, + ["arrowheadrightmod"]=707, + ["arrowheadupmod"]=708, + ["arrowleft"]=8592, + ["arrowleftdbl"]=8656, + ["arrowleftdblstroke"]=8653, + ["arrowleftoverright"]=8646, + ["arrowleftwhite"]=8678, + ["arrowright"]=8594, + ["arrowrightdblstroke"]=8655, + ["arrowrightheavy"]=10142, + ["arrowrightoverleft"]=8644, + ["arrowrightwhite"]=8680, + ["arrowtableft"]=8676, + ["arrowtabright"]=8677, + ["arrowup"]=8593, + ["arrowupdn"]=8597, + ["arrowupdownbase"]=8616, + ["arrowupleft"]=8598, + ["arrowupleftofdown"]=8645, + ["arrowupright"]=8599, + ["arrowupwhite"]=8679, + ["asciicircum"]=94, + ["asciicircummonospace"]=65342, + ["asciitilde"]=126, + ["asciitildemonospace"]=65374, + ["ascript"]=593, + ["ascriptturned"]=594, + ["asmallhiragana"]=12353, + ["asmallkatakana"]=12449, + ["asmallkatakanahalfwidth"]=65383, + ["asterisk"]=42, + ["asteriskarabic"]=1645, + ["asteriskmath"]=8727, + ["asteriskmonospace"]=65290, + ["asterisksmall"]=65121, + ["asterism"]=8258, + ["asymptoticallyequal"]=8771, + ["at"]=64, + ["atilde"]=227, + ["atmonospace"]=65312, + ["atsmall"]=65131, + ["aturned"]=592, + ["aubengali"]=2452, + ["aubopomofo"]=12576, + ["audeva"]=2324, + ["augujarati"]=2708, + ["augurmukhi"]=2580, + ["aulengthmarkbengali"]=2519, + ["aumatragurmukhi"]=2636, + ["auvowelsignbengali"]=2508, + ["auvowelsigndeva"]=2380, + ["auvowelsigngujarati"]=2764, + ["avagrahadeva"]=2365, + ["aybarmenian"]=1377, + ["ayinaltonehebrew"]=64288, + ["ayinhebrew"]=1506, + ["b"]=98, + ["babengali"]=2476, + ["backslash"]=92, + ["backslashmonospace"]=65340, + ["badeva"]=2348, + ["bagujarati"]=2732, + ["bagurmukhi"]=2604, + ["bahiragana"]=12400, + ["bahtthai"]=3647, + ["bakatakana"]=12496, + ["barmonospace"]=65372, + ["bbopomofo"]=12549, + ["bcircle"]=9425, + ["bdotaccent"]=7683, + ["bdotbelow"]=7685, + ["beamedsixteenthnotes"]=9836, + ["because"]=8757, + ["becyrillic"]=1073, + ["beharabic"]=1576, + ["behfinalarabic"]=65168, + ["behinitialarabic"]=65169, + ["behiragana"]=12409, + ["behmedialarabic"]=65170, + ["behmeeminitialarabic"]=64671, + ["behmeemisolatedarabic"]=64520, + ["behnoonfinalarabic"]=64621, + ["bekatakana"]=12505, + ["benarmenian"]=1378, + ["beta"]=946, + ["betasymbolgreek"]=976, + ["betdageshhebrew"]=64305, + ["bethebrew"]=1489, + ["betrafehebrew"]=64332, + ["bhabengali"]=2477, + ["bhadeva"]=2349, + ["bhagujarati"]=2733, + ["bhagurmukhi"]=2605, + ["bhook"]=595, + ["bihiragana"]=12403, + ["bikatakana"]=12499, + ["bilabialclick"]=664, + ["bindigurmukhi"]=2562, + ["birusquare"]=13105, + ["blackcircle"]=9679, + ["blackdiamond"]=9670, + ["blackleftpointingtriangle"]=9664, + ["blacklenticularbracketleft"]=12304, + ["blacklenticularbracketleftvertical"]=65083, + ["blacklenticularbracketright"]=12305, + ["blacklenticularbracketrightvertical"]=65084, + ["blacklowerlefttriangle"]=9699, + ["blacklowerrighttriangle"]=9698, + ["blackrightpointingtriangle"]=9654, + ["blacksmallsquare"]=9642, + ["blackstar"]=9733, + ["blackupperlefttriangle"]=9700, + ["blackupperrighttriangle"]=9701, + ["blackuppointingsmalltriangle"]=9652, + ["blank"]=9251, + ["blinebelow"]=7687, + ["block"]=9608, + ["bmonospace"]=65346, + ["bobaimaithai"]=3610, + ["bohiragana"]=12412, + ["bokatakana"]=12508, + ["bparen"]=9373, + ["bqsquare"]=13251, + ["braceleft"]=123, + ["braceleftmonospace"]=65371, + ["braceleftsmall"]=65115, + ["braceleftvertical"]=65079, + ["braceright"]=125, + ["bracerightmonospace"]=65373, + ["bracerightsmall"]=65116, + ["bracerightvertical"]=65080, + ["bracketleft"]=91, + ["bracketleftmonospace"]=65339, + ["bracketright"]=93, + ["bracketrightmonospace"]=65341, + ["breve"]=728, + ["brevebelowcmb"]=814, + ["brevecmb"]=774, + ["breveinvertedbelowcmb"]=815, + ["breveinvertedcmb"]=785, + ["breveinverteddoublecmb"]=865, + ["bridgebelowcmb"]=810, + ["bridgeinvertedbelowcmb"]=826, + ["brokenbar"]=166, + ["bstroke"]=384, + ["btopbar"]=387, + ["buhiragana"]=12406, + ["bukatakana"]=12502, + ["bullet"]=8226, + ["bulletoperator"]=8729, + ["bullseye"]=9678, + ["c"]=99, + ["caarmenian"]=1390, + ["cabengali"]=2458, + ["cacute"]=263, + ["cadeva"]=2330, + ["cagujarati"]=2714, + ["cagurmukhi"]=2586, + ["calsquare"]=13192, + ["candrabindubengali"]=2433, + ["candrabinducmb"]=784, + ["candrabindudeva"]=2305, + ["candrabindugujarati"]=2689, + ["capslock"]=8682, + ["careof"]=8453, + ["caron"]=711, + ["caronbelowcmb"]=812, + ["caroncmb"]=780, + ["carriagereturn"]=8629, + ["cbopomofo"]=12568, + ["ccaron"]=269, + ["ccedilla"]=231, + ["ccedillaacute"]=7689, + ["ccircle"]=9426, + ["ccircumflex"]=265, + ["ccurl"]=597, + ["cdotaccent"]=267, + ["cdsquare"]=13253, + ["cedilla"]=184, + ["cedillacmb"]=807, + ["cent"]=162, + ["centigrade"]=8451, + ["centmonospace"]=65504, + ["chaarmenian"]=1401, + ["chabengali"]=2459, + ["chadeva"]=2331, + ["chagujarati"]=2715, + ["chagurmukhi"]=2587, + ["chbopomofo"]=12564, + ["cheabkhasiancyrillic"]=1213, + ["checkmark"]=10003, + ["checyrillic"]=1095, + ["chedescenderabkhasiancyrillic"]=1215, + ["chedescendercyrillic"]=1207, + ["chedieresiscyrillic"]=1269, + ["cheharmenian"]=1395, + ["chekhakassiancyrillic"]=1228, + ["cheverticalstrokecyrillic"]=1209, + ["chi"]=967, + ["chieuchacirclekorean"]=12919, + ["chieuchaparenkorean"]=12823, + ["chieuchcirclekorean"]=12905, + ["chieuchkorean"]=12618, + ["chieuchparenkorean"]=12809, + ["chochangthai"]=3594, + ["chochanthai"]=3592, + ["chochingthai"]=3593, + ["chochoethai"]=3596, + ["chook"]=392, + ["cieucacirclekorean"]=12918, + ["cieucaparenkorean"]=12822, + ["cieuccirclekorean"]=12904, + ["cieuckorean"]=12616, + ["cieucparenkorean"]=12808, + ["cieucuparenkorean"]=12828, + ["circleot"]=8857, + ["circlepostalmark"]=12342, + ["circlewithlefthalfblack"]=9680, + ["circlewithrighthalfblack"]=9681, + ["circumflex"]=710, + ["circumflexbelowcmb"]=813, + ["circumflexcmb"]=770, + ["clear"]=8999, + ["clickalveolar"]=450, + ["clickdental"]=448, + ["clicklateral"]=449, + ["clickretroflex"]=451, + ["clubsuitblack"]=9827, + ["clubsuitwhite"]=9831, + ["cmcubedsquare"]=13220, + ["cmonospace"]=65347, + ["cmsquaredsquare"]=13216, + ["coarmenian"]=1409, + ["colon"]=58, + ["colonmonospace"]=65306, + ["colonsign"]=8353, + ["colonsmall"]=65109, + ["colontriangularhalfmod"]=721, + ["colontriangularmod"]=720, + ["comma"]=44, + ["commaabovecmb"]=787, + ["commaaboverightcmb"]=789, + ["commaarabic"]=1548, + ["commaarmenian"]=1373, + ["commamonospace"]=65292, + ["commareversedabovecmb"]=788, + ["commareversedmod"]=701, + ["commasmall"]=65104, + ["commaturnedabovecmb"]=786, + ["commaturnedmod"]=699, + ["congruent"]=8773, + ["contourintegral"]=8750, + ["control"]=8963, + ["controlACK"]=6, + ["controlBEL"]=7, + ["controlBS"]=8, + ["controlCAN"]=24, + ["controlCR"]=13, + ["controlDC1"]=17, + ["controlDC2"]=18, + ["controlDC3"]=19, + ["controlDC4"]=20, + ["controlDEL"]=127, + ["controlDLE"]=16, + ["controlEM"]=25, + ["controlENQ"]=5, + ["controlEOT"]=4, + ["controlESC"]=27, + ["controlETB"]=23, + ["controlETX"]=3, + ["controlFF"]=12, + ["controlFS"]=28, + ["controlGS"]=29, + ["controlHT"]=9, + ["controlLF"]=10, + ["controlNAK"]=21, + ["controlRS"]=30, + ["controlSI"]=15, + ["controlSO"]=14, + ["controlSOT"]=2, + ["controlSTX"]=1, + ["controlSUB"]=26, + ["controlSYN"]=22, + ["controlUS"]=31, + ["controlVT"]=11, + ["copyright"]=169, + ["cornerbracketleft"]=12300, + ["cornerbracketlefthalfwidth"]=65378, + ["cornerbracketleftvertical"]=65089, + ["cornerbracketright"]=12301, + ["cornerbracketrighthalfwidth"]=65379, + ["cornerbracketrightvertical"]=65090, + ["corporationsquare"]=13183, + ["cosquare"]=13255, + ["coverkgsquare"]=13254, + ["cparen"]=9374, + ["cruzeiro"]=8354, + ["cstretched"]=663, + ["curlyand"]=8911, + ["curlyor"]=8910, + ["currency"]=164, + ["d"]=100, + ["daarmenian"]=1380, + ["dabengali"]=2470, + ["dadarabic"]=1590, + ["dadeva"]=2342, + ["dadfinalarabic"]=65214, + ["dadinitialarabic"]=65215, + ["dadmedialarabic"]=65216, + ["dageshhebrew"]=1468, + ["dagger"]=8224, + ["daggerdbl"]=8225, + ["dagujarati"]=2726, + ["dagurmukhi"]=2598, + ["dahiragana"]=12384, + ["dakatakana"]=12480, + ["dalarabic"]=1583, + ["daletdageshhebrew"]=64307, + ["dalettserehebrew"]=1491, + ["dalfinalarabic"]=65194, + ["dammalowarabic"]=1615, + ["dammatanarabic"]=1612, + ["danda"]=2404, + ["dargalefthebrew"]=1447, + ["dasiapneumatacyrilliccmb"]=1157, + ["dblanglebracketleft"]=12298, + ["dblanglebracketleftvertical"]=65085, + ["dblanglebracketright"]=12299, + ["dblanglebracketrightvertical"]=65086, + ["dblarchinvertedbelowcmb"]=811, + ["dblarrowleft"]=8660, + ["dblarrowright"]=8658, + ["dbldanda"]=2405, + ["dblgravecmb"]=783, + ["dblintegral"]=8748, + ["dbllowlinecmb"]=819, + ["dbloverlinecmb"]=831, + ["dblprimemod"]=698, + ["dblverticalbar"]=8214, + ["dblverticallineabovecmb"]=782, + ["dbopomofo"]=12553, + ["dbsquare"]=13256, + ["dcaron"]=271, + ["dcedilla"]=7697, + ["dcircle"]=9427, + ["dcircumflexbelow"]=7699, + ["ddabengali"]=2465, + ["ddadeva"]=2337, + ["ddagujarati"]=2721, + ["ddagurmukhi"]=2593, + ["ddalarabic"]=1672, + ["ddalfinalarabic"]=64393, + ["dddhadeva"]=2396, + ["ddhabengali"]=2466, + ["ddhadeva"]=2338, + ["ddhagujarati"]=2722, + ["ddhagurmukhi"]=2594, + ["ddotaccent"]=7691, + ["ddotbelow"]=7693, + ["decimalseparatorpersian"]=1643, + ["decyrillic"]=1076, + ["degree"]=176, + ["dehihebrew"]=1453, + ["dehiragana"]=12391, + ["deicoptic"]=1007, + ["dekatakana"]=12487, + ["deleteleft"]=9003, + ["deleteright"]=8998, + ["delta"]=948, + ["deltaturned"]=397, + ["denominatorminusonenumeratorbengali"]=2552, + ["dezh"]=676, + ["dhabengali"]=2471, + ["dhadeva"]=2343, + ["dhagujarati"]=2727, + ["dhagurmukhi"]=2599, + ["dhook"]=599, + ["dialytikatonoscmb"]=836, + ["diamond"]=9830, + ["diamondsuitwhite"]=9826, + ["dieresis"]=168, + ["dieresisbelowcmb"]=804, + ["dieresiscmb"]=776, + ["dieresistonos"]=901, + ["dihiragana"]=12386, + ["dikatakana"]=12482, + ["dittomark"]=12291, + ["divide"]=247, + ["divides"]=8739, + ["divisionslash"]=8725, + ["djecyrillic"]=1106, + ["dlinebelow"]=7695, + ["dlsquare"]=13207, + ["dmacron"]=273, + ["dmonospace"]=65348, + ["dnblock"]=9604, + ["dochadathai"]=3598, + ["dodekthai"]=3604, + ["dohiragana"]=12393, + ["dokatakana"]=12489, + ["dollar"]=36, + ["dollarmonospace"]=65284, + ["dollarsmall"]=65129, + ["dong"]=8363, + ["dorusquare"]=13094, + ["dotaccent"]=729, + ["dotaccentcmb"]=775, + ["dotbelowcomb"]=803, + ["dotkatakana"]=12539, + ["dotlessi"]=305, + ["dotlessjstrokehook"]=644, + ["dotmath"]=8901, + ["dottedcircle"]=9676, + ["downtackbelowcmb"]=798, + ["downtackmod"]=725, + ["dparen"]=9375, + ["dtail"]=598, + ["dtopbar"]=396, + ["duhiragana"]=12389, + ["dukatakana"]=12485, + ["dz"]=499, + ["dzaltone"]=675, + ["dzcaron"]=454, + ["dzcurl"]=677, + ["dzeabkhasiancyrillic"]=1249, + ["dzecyrillic"]=1109, + ["dzhecyrillic"]=1119, + ["e"]=101, + ["eacute"]=233, + ["earth"]=9793, + ["ebengali"]=2447, + ["ebopomofo"]=12572, + ["ebreve"]=277, + ["ecandradeva"]=2317, + ["ecandragujarati"]=2701, + ["ecandravowelsigndeva"]=2373, + ["ecandravowelsigngujarati"]=2757, + ["ecaron"]=283, + ["ecedillabreve"]=7709, + ["echarmenian"]=1381, + ["echyiwnarmenian"]=1415, + ["ecircle"]=9428, + ["ecircumflex"]=234, + ["ecircumflexacute"]=7871, + ["ecircumflexbelow"]=7705, + ["ecircumflexdotbelow"]=7879, + ["ecircumflexgrave"]=7873, + ["ecircumflexhookabove"]=7875, + ["ecircumflextilde"]=7877, + ["ecyrillic"]=1108, + ["edblgrave"]=517, + ["edeva"]=2319, + ["edieresis"]=235, + ["edotaccent"]=279, + ["edotbelow"]=7865, + ["eegurmukhi"]=2575, + ["eematragurmukhi"]=2631, + ["efcyrillic"]=1092, + ["egrave"]=232, + ["egujarati"]=2703, + ["eharmenian"]=1383, + ["ehbopomofo"]=12573, + ["ehiragana"]=12360, + ["ehookabove"]=7867, + ["eibopomofo"]=12575, + ["eight"]=56, + ["eightbengali"]=2542, + ["eightcircle"]=9319, + ["eightcircleinversesansserif"]=10129, + ["eightdeva"]=2414, + ["eighteencircle"]=9329, + ["eighteenparen"]=9349, + ["eighteenperiod"]=9369, + ["eightgujarati"]=2798, + ["eightgurmukhi"]=2670, + ["eighthackarabic"]=1640, + ["eighthangzhou"]=12328, + ["eightideographicparen"]=12839, + ["eightinferior"]=8328, + ["eightmonospace"]=65304, + ["eightparen"]=9339, + ["eightperiod"]=9359, + ["eightpersian"]=1784, + ["eightroman"]=8567, + ["eightsuperior"]=8312, + ["eightthai"]=3672, + ["einvertedbreve"]=519, + ["eiotifiedcyrillic"]=1125, + ["ekatakana"]=12456, + ["ekatakanahalfwidth"]=65396, + ["ekonkargurmukhi"]=2676, + ["ekorean"]=12628, + ["elcyrillic"]=1083, + ["element"]=8712, + ["elevencircle"]=9322, + ["elevenparen"]=9342, + ["elevenperiod"]=9362, + ["elevenroman"]=8570, + ["ellipsis"]=8230, + ["ellipsisvertical"]=8942, + ["emacron"]=275, + ["emacronacute"]=7703, + ["emacrongrave"]=7701, + ["emcyrillic"]=1084, + ["emdash"]=8212, + ["emdashvertical"]=65073, + ["emonospace"]=65349, + ["emphasismarkarmenian"]=1371, + ["emptyset"]=8709, + ["enbopomofo"]=12579, + ["encyrillic"]=1085, + ["endash"]=8211, + ["endashvertical"]=65074, + ["endescendercyrillic"]=1187, + ["eng"]=331, + ["engbopomofo"]=12581, + ["enghecyrillic"]=1189, + ["enhookcyrillic"]=1224, + ["enspace"]=8194, + ["eogonek"]=281, + ["eokorean"]=12627, + ["eopen"]=603, + ["eopenclosed"]=666, + ["eopenreversed"]=604, + ["eopenreversedclosed"]=606, + ["eopenreversedhook"]=605, + ["eparen"]=9376, + ["epsilon"]=949, + ["epsilontonos"]=941, + ["equal"]=61, + ["equalmonospace"]=65309, + ["equalsmall"]=65126, + ["equalsuperior"]=8316, + ["equivalence"]=8801, + ["erbopomofo"]=12582, + ["ercyrillic"]=1088, + ["ereversed"]=600, + ["ereversedcyrillic"]=1101, + ["escyrillic"]=1089, + ["esdescendercyrillic"]=1195, + ["esh"]=643, + ["eshcurl"]=646, + ["eshortdeva"]=2318, + ["eshortvowelsigndeva"]=2374, + ["eshreversedloop"]=426, + ["eshsquatreversed"]=645, + ["esmallhiragana"]=12359, + ["esmallkatakana"]=12455, + ["esmallkatakanahalfwidth"]=65386, + ["estimated"]=8494, + ["eta"]=951, + ["etarmenian"]=1384, + ["etatonos"]=942, + ["eth"]=240, + ["etilde"]=7869, + ["etildebelow"]=7707, + ["etnahtalefthebrew"]=1425, + ["eturned"]=477, + ["eukorean"]=12641, + ["euro"]=8364, + ["evowelsignbengali"]=2503, + ["evowelsigndeva"]=2375, + ["evowelsigngujarati"]=2759, + ["exclam"]=33, + ["exclamarmenian"]=1372, + ["exclamdbl"]=8252, + ["exclamdown"]=161, + ["exclammonospace"]=65281, + ["ezh"]=658, + ["ezhcaron"]=495, + ["ezhcurl"]=659, + ["ezhreversed"]=441, + ["ezhtail"]=442, + ["f"]=102, + ["fadeva"]=2398, + ["fagurmukhi"]=2654, + ["fahrenheit"]=8457, + ["fathalowarabic"]=1614, + ["fathatanarabic"]=1611, + ["fbopomofo"]=12552, + ["fcircle"]=9429, + ["fdotaccent"]=7711, + ["feharabic"]=1601, + ["feharmenian"]=1414, + ["fehfinalarabic"]=65234, + ["fehinitialarabic"]=65235, + ["fehmedialarabic"]=65236, + ["feicoptic"]=997, + ["ff"]=64256, + ["ffi"]=64259, + ["ffl"]=64260, + ["fi"]=64257, + ["fifteencircle"]=9326, + ["fifteenparen"]=9346, + ["fifteenperiod"]=9366, + ["figuredash"]=8210, + ["filledbox"]=9632, + ["filledrect"]=9644, + ["finalkafdageshhebrew"]=64314, + ["finalkafshevahebrew"]=1498, + ["finalmemhebrew"]=1501, + ["finalnunhebrew"]=1503, + ["finalpehebrew"]=1507, + ["finaltsadihebrew"]=1509, + ["firsttonechinese"]=713, + ["fisheye"]=9673, + ["fitacyrillic"]=1139, + ["five"]=53, + ["fivebengali"]=2539, + ["fivecircle"]=9316, + ["fivecircleinversesansserif"]=10126, + ["fivedeva"]=2411, + ["fiveeighths"]=8541, + ["fivegujarati"]=2795, + ["fivegurmukhi"]=2667, + ["fivehackarabic"]=1637, + ["fivehangzhou"]=12325, + ["fiveideographicparen"]=12836, + ["fiveinferior"]=8325, + ["fivemonospace"]=65301, + ["fiveparen"]=9336, + ["fiveperiod"]=9356, + ["fivepersian"]=1781, + ["fiveroman"]=8564, + ["fivesuperior"]=8309, + ["fivethai"]=3669, + ["fl"]=64258, + ["florin"]=402, + ["fmonospace"]=65350, + ["fmsquare"]=13209, + ["fofanthai"]=3615, + ["fofathai"]=3613, + ["fongmanthai"]=3663, + ["four"]=52, + ["fourbengali"]=2538, + ["fourcircle"]=9315, + ["fourcircleinversesansserif"]=10125, + ["fourdeva"]=2410, + ["fourgujarati"]=2794, + ["fourgurmukhi"]=2666, + ["fourhackarabic"]=1636, + ["fourhangzhou"]=12324, + ["fourideographicparen"]=12835, + ["fourinferior"]=8324, + ["fourmonospace"]=65300, + ["fournumeratorbengali"]=2551, + ["fourparen"]=9335, + ["fourperiod"]=9355, + ["fourpersian"]=1780, + ["fourroman"]=8563, + ["foursuperior"]=8308, + ["fourteencircle"]=9325, + ["fourteenparen"]=9345, + ["fourteenperiod"]=9365, + ["fourthai"]=3668, + ["fourthtonechinese"]=715, + ["fparen"]=9377, + ["fraction"]=8260, + ["franc"]=8355, + ["g"]=103, + ["gabengali"]=2455, + ["gacute"]=501, + ["gadeva"]=2327, + ["gafarabic"]=1711, + ["gaffinalarabic"]=64403, + ["gafinitialarabic"]=64404, + ["gafmedialarabic"]=64405, + ["gagujarati"]=2711, + ["gagurmukhi"]=2583, + ["gahiragana"]=12364, + ["gakatakana"]=12460, + ["gamma"]=947, + ["gammalatinsmall"]=611, + ["gammasuperior"]=736, + ["gangiacoptic"]=1003, + ["gbopomofo"]=12557, + ["gbreve"]=287, + ["gcaron"]=487, + ["gcircle"]=9430, + ["gcircumflex"]=285, + ["gcommaaccent"]=291, + ["gdotaccent"]=289, + ["gecyrillic"]=1075, + ["gehiragana"]=12370, + ["gekatakana"]=12466, + ["geometricallyequal"]=8785, + ["gereshaccenthebrew"]=1436, + ["gereshhebrew"]=1523, + ["gereshmuqdamhebrew"]=1437, + ["germandbls"]=223, + ["gershayimaccenthebrew"]=1438, + ["gershayimhebrew"]=1524, + ["getamark"]=12307, + ["ghabengali"]=2456, + ["ghadarmenian"]=1394, + ["ghadeva"]=2328, + ["ghagujarati"]=2712, + ["ghagurmukhi"]=2584, + ["ghainarabic"]=1594, + ["ghainfinalarabic"]=65230, + ["ghaininitialarabic"]=65231, + ["ghainmedialarabic"]=65232, + ["ghemiddlehookcyrillic"]=1173, + ["ghestrokecyrillic"]=1171, + ["gheupturncyrillic"]=1169, + ["ghhadeva"]=2394, + ["ghhagurmukhi"]=2650, + ["ghook"]=608, + ["ghzsquare"]=13203, + ["gihiragana"]=12366, + ["gikatakana"]=12462, + ["gimarmenian"]=1379, + ["gimeldageshhebrew"]=64306, + ["gimelhebrew"]=1490, + ["gjecyrillic"]=1107, + ["glottalinvertedstroke"]=446, + ["glottalstop"]=660, + ["glottalstopinverted"]=662, + ["glottalstopmod"]=704, + ["glottalstopreversed"]=661, + ["glottalstopreversedmod"]=705, + ["glottalstopreversedsuperior"]=740, + ["glottalstopstroke"]=673, + ["glottalstopstrokereversed"]=674, + ["gmacron"]=7713, + ["gmonospace"]=65351, + ["gohiragana"]=12372, + ["gokatakana"]=12468, + ["gparen"]=9378, + ["gpasquare"]=13228, + ["grave"]=96, + ["gravebelowcmb"]=790, + ["gravecomb"]=768, + ["gravedeva"]=2387, + ["gravelowmod"]=718, + ["gravemonospace"]=65344, + ["gravetonecmb"]=832, + ["greater"]=62, + ["greaterequal"]=8805, + ["greaterequalorless"]=8923, + ["greatermonospace"]=65310, + ["greaterorequivalent"]=8819, + ["greaterorless"]=8823, + ["greateroverequal"]=8807, + ["greatersmall"]=65125, + ["gscript"]=609, + ["gstroke"]=485, + ["guhiragana"]=12368, + ["guillemotleft"]=171, + ["guillemotright"]=187, + ["guilsinglleft"]=8249, + ["guilsinglright"]=8250, + ["gukatakana"]=12464, + ["guramusquare"]=13080, + ["gysquare"]=13257, + ["h"]=104, + ["haabkhasiancyrillic"]=1193, + ["habengali"]=2489, + ["hadescendercyrillic"]=1203, + ["hadeva"]=2361, + ["hagujarati"]=2745, + ["hagurmukhi"]=2617, + ["haharabic"]=1581, + ["hahfinalarabic"]=65186, + ["hahinitialarabic"]=65187, + ["hahiragana"]=12399, + ["hahmedialarabic"]=65188, + ["haitusquare"]=13098, + ["hakatakana"]=12495, + ["hakatakanahalfwidth"]=65418, + ["halantgurmukhi"]=2637, + ["hamzasukunarabic"]=1569, + ["hangulfiller"]=12644, + ["hardsigncyrillic"]=1098, + ["harpoonleftbarbup"]=8636, + ["harpoonrightbarbup"]=8640, + ["hasquare"]=13258, + ["hatafpatahwidehebrew"]=1458, + ["hatafqamatswidehebrew"]=1459, + ["hatafsegolwidehebrew"]=1457, + ["hbar"]=295, + ["hbopomofo"]=12559, + ["hbrevebelow"]=7723, + ["hcedilla"]=7721, + ["hcircle"]=9431, + ["hcircumflex"]=293, + ["hdieresis"]=7719, + ["hdotaccent"]=7715, + ["hdotbelow"]=7717, + ["heartsuitblack"]=9829, + ["heartsuitwhite"]=9825, + ["hedageshhebrew"]=64308, + ["hehaltonearabic"]=1729, + ["heharabic"]=1607, + ["hehebrew"]=1492, + ["hehfinalaltonearabic"]=64423, + ["hehfinalarabic"]=65258, + ["hehhamzaabovefinalarabic"]=64421, + ["hehhamzaaboveisolatedarabic"]=64420, + ["hehinitialaltonearabic"]=64424, + ["hehinitialarabic"]=65259, + ["hehiragana"]=12408, + ["hehmedialaltonearabic"]=64425, + ["hehmedialarabic"]=65260, + ["heiseierasquare"]=13179, + ["hekatakana"]=12504, + ["hekatakanahalfwidth"]=65421, + ["hekutaarusquare"]=13110, + ["henghook"]=615, + ["herutusquare"]=13113, + ["hethebrew"]=1495, + ["hhook"]=614, + ["hhooksuperior"]=689, + ["hieuhacirclekorean"]=12923, + ["hieuhaparenkorean"]=12827, + ["hieuhcirclekorean"]=12909, + ["hieuhkorean"]=12622, + ["hieuhparenkorean"]=12813, + ["hihiragana"]=12402, + ["hikatakana"]=12498, + ["hikatakanahalfwidth"]=65419, + ["hiriqwidehebrew"]=1460, + ["hlinebelow"]=7830, + ["hmonospace"]=65352, + ["hoarmenian"]=1392, + ["hohipthai"]=3627, + ["hohiragana"]=12411, + ["hokatakana"]=12507, + ["hokatakanahalfwidth"]=65422, + ["holamwidehebrew"]=1465, + ["honokhukthai"]=3630, + ["hookcmb"]=777, + ["hookpalatalizedbelowcmb"]=801, + ["hookretroflexbelowcmb"]=802, + ["hoonsquare"]=13122, + ["horicoptic"]=1001, + ["horizontalbar"]=8213, + ["horncmb"]=795, + ["hotsprings"]=9832, + ["house"]=8962, + ["hparen"]=9379, + ["hsuperior"]=688, + ["hturned"]=613, + ["huhiragana"]=12405, + ["huiitosquare"]=13107, + ["hukatakana"]=12501, + ["hukatakanahalfwidth"]=65420, + ["hungarumlaut"]=733, + ["hungarumlautcmb"]=779, + ["hv"]=405, + ["hyphen"]=45, + ["hyphenmonospace"]=65293, + ["hyphensmall"]=65123, + ["hyphentwo"]=8208, + ["i"]=105, + ["iacute"]=237, + ["iacyrillic"]=1103, + ["ibengali"]=2439, + ["ibopomofo"]=12583, + ["ibreve"]=301, + ["icaron"]=464, + ["icircle"]=9432, + ["icircumflex"]=238, + ["icyrillic"]=1110, + ["idblgrave"]=521, + ["ideographearthcircle"]=12943, + ["ideographfirecircle"]=12939, + ["ideographicallianceparen"]=12863, + ["ideographiccallparen"]=12858, + ["ideographiccentrecircle"]=12965, + ["ideographicclose"]=12294, + ["ideographiccomma"]=12289, + ["ideographiccommaleft"]=65380, + ["ideographiccongratulationparen"]=12855, + ["ideographiccorrectcircle"]=12963, + ["ideographicearthparen"]=12847, + ["ideographicenterpriseparen"]=12861, + ["ideographicexcellentcircle"]=12957, + ["ideographicfestivalparen"]=12864, + ["ideographicfinancialcircle"]=12950, + ["ideographicfinancialparen"]=12854, + ["ideographicfireparen"]=12843, + ["ideographichaveparen"]=12850, + ["ideographichighcircle"]=12964, + ["ideographiciterationmark"]=12293, + ["ideographiclaborcircle"]=12952, + ["ideographiclaborparen"]=12856, + ["ideographicleftcircle"]=12967, + ["ideographiclowcircle"]=12966, + ["ideographicmedicinecircle"]=12969, + ["ideographicmetalparen"]=12846, + ["ideographicmoonparen"]=12842, + ["ideographicnameparen"]=12852, + ["ideographicperiod"]=12290, + ["ideographicprintcircle"]=12958, + ["ideographicreachparen"]=12867, + ["ideographicrepresentparen"]=12857, + ["ideographicresourceparen"]=12862, + ["ideographicrightcircle"]=12968, + ["ideographicsecretcircle"]=12953, + ["ideographicselfparen"]=12866, + ["ideographicsocietyparen"]=12851, + ["ideographicspace"]=12288, + ["ideographicspecialparen"]=12853, + ["ideographicstockparen"]=12849, + ["ideographicstudyparen"]=12859, + ["ideographicsunparen"]=12848, + ["ideographicsuperviseparen"]=12860, + ["ideographicwaterparen"]=12844, + ["ideographicwoodparen"]=12845, + ["ideographiczero"]=12295, + ["ideographmetalcircle"]=12942, + ["ideographmooncircle"]=12938, + ["ideographnamecircle"]=12948, + ["ideographsuncircle"]=12944, + ["ideographwatercircle"]=12940, + ["ideographwoodcircle"]=12941, + ["ideva"]=2311, + ["idieresis"]=239, + ["idieresisacute"]=7727, + ["idieresiscyrillic"]=1253, + ["idotbelow"]=7883, + ["iebrevecyrillic"]=1239, + ["iecyrillic"]=1077, + ["ieungacirclekorean"]=12917, + ["ieungaparenkorean"]=12821, + ["ieungcirclekorean"]=12903, + ["ieungkorean"]=12615, + ["ieungparenkorean"]=12807, + ["igrave"]=236, + ["igujarati"]=2695, + ["igurmukhi"]=2567, + ["ihiragana"]=12356, + ["ihookabove"]=7881, + ["iibengali"]=2440, + ["iicyrillic"]=1080, + ["iideva"]=2312, + ["iigujarati"]=2696, + ["iigurmukhi"]=2568, + ["iimatragurmukhi"]=2624, + ["iinvertedbreve"]=523, + ["iishortcyrillic"]=1081, + ["iivowelsignbengali"]=2496, + ["iivowelsigndeva"]=2368, + ["iivowelsigngujarati"]=2752, + ["ij"]=307, + ["ikatakana"]=12452, + ["ikatakanahalfwidth"]=65394, + ["ikorean"]=12643, + ["iluyhebrew"]=1452, + ["imacron"]=299, + ["imacroncyrillic"]=1251, + ["imageorapproximatelyequal"]=8787, + ["imatragurmukhi"]=2623, + ["imonospace"]=65353, + ["increment"]=8710, + ["infinity"]=8734, + ["iniarmenian"]=1387, + ["integral"]=8747, + ["integralbt"]=8993, + ["integraltp"]=8992, + ["intersection"]=8745, + ["intisquare"]=13061, + ["invbullet"]=9688, + ["invsmileface"]=9787, + ["iocyrillic"]=1105, + ["iogonek"]=303, + ["iota"]=953, + ["iotadieresis"]=970, + ["iotadieresistonos"]=912, + ["iotalatin"]=617, + ["iotatonos"]=943, + ["iparen"]=9380, + ["irigurmukhi"]=2674, + ["ismallhiragana"]=12355, + ["ismallkatakana"]=12451, + ["ismallkatakanahalfwidth"]=65384, + ["issharbengali"]=2554, + ["istroke"]=616, + ["iterationhiragana"]=12445, + ["iterationkatakana"]=12541, + ["itilde"]=297, + ["itildebelow"]=7725, + ["iubopomofo"]=12585, + ["iucyrillic"]=1102, + ["ivowelsignbengali"]=2495, + ["ivowelsigndeva"]=2367, + ["ivowelsigngujarati"]=2751, + ["izhitsacyrillic"]=1141, + ["izhitsadblgravecyrillic"]=1143, + ["j"]=106, + ["jaarmenian"]=1393, + ["jabengali"]=2460, + ["jadeva"]=2332, + ["jagujarati"]=2716, + ["jagurmukhi"]=2588, + ["jbopomofo"]=12560, + ["jcaron"]=496, + ["jcircle"]=9433, + ["jcircumflex"]=309, + ["jcrossedtail"]=669, + ["jdotlessstroke"]=607, + ["jecyrillic"]=1112, + ["jeemarabic"]=1580, + ["jeemfinalarabic"]=65182, + ["jeeminitialarabic"]=65183, + ["jeemmedialarabic"]=65184, + ["jeharabic"]=1688, + ["jehfinalarabic"]=64395, + ["jhabengali"]=2461, + ["jhadeva"]=2333, + ["jhagujarati"]=2717, + ["jhagurmukhi"]=2589, + ["jheharmenian"]=1403, + ["jis"]=12292, + ["jmonospace"]=65354, + ["jparen"]=9381, + ["jsuperior"]=690, + ["k"]=107, + ["kabashkircyrillic"]=1185, + ["kabengali"]=2453, + ["kacute"]=7729, + ["kacyrillic"]=1082, + ["kadescendercyrillic"]=1179, + ["kadeva"]=2325, + ["kafarabic"]=1603, + ["kafdageshhebrew"]=64315, + ["kaffinalarabic"]=65242, + ["kafhebrew"]=1499, + ["kafinitialarabic"]=65243, + ["kafmedialarabic"]=65244, + ["kafrafehebrew"]=64333, + ["kagujarati"]=2709, + ["kagurmukhi"]=2581, + ["kahiragana"]=12363, + ["kahookcyrillic"]=1220, + ["kakatakana"]=12459, + ["kakatakanahalfwidth"]=65398, + ["kappa"]=954, + ["kappasymbolgreek"]=1008, + ["kapyeounmieumkorean"]=12657, + ["kapyeounphieuphkorean"]=12676, + ["kapyeounpieupkorean"]=12664, + ["kapyeounssangpieupkorean"]=12665, + ["karoriisquare"]=13069, + ["kasmallkatakana"]=12533, + ["kasquare"]=13188, + ["kasraarabic"]=1616, + ["kasratanarabic"]=1613, + ["kastrokecyrillic"]=1183, + ["katahiraprolongmarkhalfwidth"]=65392, + ["kaverticalstrokecyrillic"]=1181, + ["kbopomofo"]=12558, + ["kcalsquare"]=13193, + ["kcaron"]=489, + ["kcircle"]=9434, + ["kcommaaccent"]=311, + ["kdotbelow"]=7731, + ["keharmenian"]=1412, + ["kehiragana"]=12369, + ["kekatakana"]=12465, + ["kekatakanahalfwidth"]=65401, + ["kenarmenian"]=1391, + ["kesmallkatakana"]=12534, + ["kgreenlandic"]=312, + ["khabengali"]=2454, + ["khacyrillic"]=1093, + ["khadeva"]=2326, + ["khagujarati"]=2710, + ["khagurmukhi"]=2582, + ["khaharabic"]=1582, + ["khahfinalarabic"]=65190, + ["khahinitialarabic"]=65191, + ["khahmedialarabic"]=65192, + ["kheicoptic"]=999, + ["khhadeva"]=2393, + ["khhagurmukhi"]=2649, + ["khieukhacirclekorean"]=12920, + ["khieukhaparenkorean"]=12824, + ["khieukhcirclekorean"]=12906, + ["khieukhkorean"]=12619, + ["khieukhparenkorean"]=12810, + ["khokhaithai"]=3586, + ["khokhonthai"]=3589, + ["khokhuatthai"]=3587, + ["khokhwaithai"]=3588, + ["khomutthai"]=3675, + ["khook"]=409, + ["khorakhangthai"]=3590, + ["khzsquare"]=13201, + ["kihiragana"]=12365, + ["kikatakana"]=12461, + ["kikatakanahalfwidth"]=65399, + ["kiroguramusquare"]=13077, + ["kiromeetorusquare"]=13078, + ["kirosquare"]=13076, + ["kiyeokacirclekorean"]=12910, + ["kiyeokaparenkorean"]=12814, + ["kiyeokcirclekorean"]=12896, + ["kiyeokkorean"]=12593, + ["kiyeokparenkorean"]=12800, + ["kiyeoksioskorean"]=12595, + ["kjecyrillic"]=1116, + ["klinebelow"]=7733, + ["klsquare"]=13208, + ["kmcubedsquare"]=13222, + ["kmonospace"]=65355, + ["kmsquaredsquare"]=13218, + ["kohiragana"]=12371, + ["kohmsquare"]=13248, + ["kokaithai"]=3585, + ["kokatakana"]=12467, + ["kokatakanahalfwidth"]=65402, + ["kooposquare"]=13086, + ["koppacyrillic"]=1153, + ["koreanstandardsymbol"]=12927, + ["koroniscmb"]=835, + ["kparen"]=9382, + ["kpasquare"]=13226, + ["ksicyrillic"]=1135, + ["ktsquare"]=13263, + ["kturned"]=670, + ["kuhiragana"]=12367, + ["kukatakana"]=12463, + ["kukatakanahalfwidth"]=65400, + ["kvsquare"]=13240, + ["kwsquare"]=13246, + ["l"]=108, + ["labengali"]=2482, + ["lacute"]=314, + ["ladeva"]=2354, + ["lagujarati"]=2738, + ["lagurmukhi"]=2610, + ["lakkhangyaothai"]=3653, + ["lamaleffinalarabic"]=65276, + ["lamalefhamzaabovefinalarabic"]=65272, + ["lamalefhamzaaboveisolatedarabic"]=65271, + ["lamalefhamzabelowfinalarabic"]=65274, + ["lamalefhamzabelowisolatedarabic"]=65273, + ["lamalefisolatedarabic"]=65275, + ["lamalefmaddaabovefinalarabic"]=65270, + ["lamalefmaddaaboveisolatedarabic"]=65269, + ["lamarabic"]=1604, + ["lambda"]=955, + ["lambdastroke"]=411, + ["lameddageshhebrew"]=64316, + ["lamedholamhebrew"]=1500, + ["lamfinalarabic"]=65246, + ["lamhahinitialarabic"]=64714, + ["lamjeeminitialarabic"]=64713, + ["lamkhahinitialarabic"]=64715, + ["lamlamhehisolatedarabic"]=65010, + ["lammedialarabic"]=65248, + ["lammeemhahinitialarabic"]=64904, + ["lammeeminitialarabic"]=64716, + ["lammeemkhahinitialarabic"]=65247, + ["largecircle"]=9711, + ["lbar"]=410, + ["lbelt"]=620, + ["lbopomofo"]=12556, + ["lcaron"]=318, + ["lcircle"]=9435, + ["lcircumflexbelow"]=7741, + ["lcommaaccent"]=316, + ["ldotaccent"]=320, + ["ldotbelow"]=7735, + ["ldotbelowmacron"]=7737, + ["leftangleabovecmb"]=794, + ["lefttackbelowcmb"]=792, + ["less"]=60, + ["lessequal"]=8804, + ["lessequalorgreater"]=8922, + ["lessmonospace"]=65308, + ["lessorequivalent"]=8818, + ["lessorgreater"]=8822, + ["lessoverequal"]=8806, + ["lesssmall"]=65124, + ["lezh"]=622, + ["lfblock"]=9612, + ["lhookretroflex"]=621, + ["lira"]=8356, + ["liwnarmenian"]=1388, + ["lj"]=457, + ["ljecyrillic"]=1113, + ["lladeva"]=2355, + ["llagujarati"]=2739, + ["llinebelow"]=7739, + ["llladeva"]=2356, + ["llvocalicbengali"]=2529, + ["llvocalicdeva"]=2401, + ["llvocalicvowelsignbengali"]=2531, + ["llvocalicvowelsigndeva"]=2403, + ["lmiddletilde"]=619, + ["lmonospace"]=65356, + ["lmsquare"]=13264, + ["lochulathai"]=3628, + ["logicaland"]=8743, + ["logicalnot"]=172, + ["logicalor"]=8744, + ["lolingthai"]=3621, + ["lowlinecenterline"]=65102, + ["lowlinecmb"]=818, + ["lowlinedashed"]=65101, + ["lozenge"]=9674, + ["lparen"]=9383, + ["lslash"]=322, + ["lsquare"]=8467, + ["luthai"]=3622, + ["lvocalicbengali"]=2444, + ["lvocalicdeva"]=2316, + ["lvocalicvowelsignbengali"]=2530, + ["lvocalicvowelsigndeva"]=2402, + ["lxsquare"]=13267, + ["m"]=109, + ["mabengali"]=2478, + ["macron"]=175, + ["macronbelowcmb"]=817, + ["macroncmb"]=772, + ["macronlowmod"]=717, + ["macronmonospace"]=65507, + ["macute"]=7743, + ["madeva"]=2350, + ["magujarati"]=2734, + ["magurmukhi"]=2606, + ["mahapakhlefthebrew"]=1444, + ["mahiragana"]=12414, + ["maichattawathai"]=3659, + ["maiekthai"]=3656, + ["maihanakatthai"]=3633, + ["maitaikhuthai"]=3655, + ["maithothai"]=3657, + ["maitrithai"]=3658, + ["maiyamokthai"]=3654, + ["makatakana"]=12510, + ["makatakanahalfwidth"]=65423, + ["mansyonsquare"]=13127, + ["maqafhebrew"]=1470, + ["mars"]=9794, + ["masoracirclehebrew"]=1455, + ["masquare"]=13187, + ["mbopomofo"]=12551, + ["mbsquare"]=13268, + ["mcircle"]=9436, + ["mcubedsquare"]=13221, + ["mdotaccent"]=7745, + ["mdotbelow"]=7747, + ["meemarabic"]=1605, + ["meemfinalarabic"]=65250, + ["meeminitialarabic"]=65251, + ["meemmedialarabic"]=65252, + ["meemmeeminitialarabic"]=64721, + ["meemmeemisolatedarabic"]=64584, + ["meetorusquare"]=13133, + ["mehiragana"]=12417, + ["meizierasquare"]=13182, + ["mekatakana"]=12513, + ["mekatakanahalfwidth"]=65426, + ["memdageshhebrew"]=64318, + ["memhebrew"]=1502, + ["menarmenian"]=1396, + ["merkhakefulalefthebrew"]=1446, + ["merkhalefthebrew"]=1445, + ["mhook"]=625, + ["mhzsquare"]=13202, + ["middledotkatakanahalfwidth"]=65381, + ["mieumacirclekorean"]=12914, + ["mieumaparenkorean"]=12818, + ["mieumcirclekorean"]=12900, + ["mieumkorean"]=12609, + ["mieumpansioskorean"]=12656, + ["mieumparenkorean"]=12804, + ["mieumpieupkorean"]=12654, + ["mieumsioskorean"]=12655, + ["mihiragana"]=12415, + ["mikatakana"]=12511, + ["mikatakanahalfwidth"]=65424, + ["minus"]=8722, + ["minusbelowcmb"]=800, + ["minuscircle"]=8854, + ["minusmod"]=727, + ["minusplus"]=8723, + ["minute"]=8242, + ["miribaarusquare"]=13130, + ["mirisquare"]=13129, + ["mlonglegturned"]=624, + ["mlsquare"]=13206, + ["mmcubedsquare"]=13219, + ["mmonospace"]=65357, + ["mmsquaredsquare"]=13215, + ["mohiragana"]=12418, + ["mohmsquare"]=13249, + ["mokatakana"]=12514, + ["mokatakanahalfwidth"]=65427, + ["molsquare"]=13270, + ["momathai"]=3617, + ["moverssquare"]=13223, + ["moverssquaredsquare"]=13224, + ["mparen"]=9384, + ["mpasquare"]=13227, + ["mssquare"]=13235, + ["mturned"]=623, + ["mu1"]=181, + ["muasquare"]=13186, + ["muchgreater"]=8811, + ["muchless"]=8810, + ["mufsquare"]=13196, + ["mugreek"]=956, + ["mugsquare"]=13197, + ["muhiragana"]=12416, + ["mukatakana"]=12512, + ["mukatakanahalfwidth"]=65425, + ["mulsquare"]=13205, + ["multiply"]=215, + ["mumsquare"]=13211, + ["munahlefthebrew"]=1443, + ["musicalnote"]=9834, + ["musicalnotedbl"]=9835, + ["musicflatsign"]=9837, + ["musicsharpsign"]=9839, + ["mussquare"]=13234, + ["muvsquare"]=13238, + ["muwsquare"]=13244, + ["mvmegasquare"]=13241, + ["mvsquare"]=13239, + ["mwmegasquare"]=13247, + ["mwsquare"]=13245, + ["n"]=110, + ["nabengali"]=2472, + ["nabla"]=8711, + ["nacute"]=324, + ["nadeva"]=2344, + ["nagujarati"]=2728, + ["nagurmukhi"]=2600, + ["nahiragana"]=12394, + ["nakatakana"]=12490, + ["nakatakanahalfwidth"]=65413, + ["nasquare"]=13185, + ["nbopomofo"]=12555, + ["ncaron"]=328, + ["ncircle"]=9437, + ["ncircumflexbelow"]=7755, + ["ncommaaccent"]=326, + ["ndotaccent"]=7749, + ["ndotbelow"]=7751, + ["nehiragana"]=12397, + ["nekatakana"]=12493, + ["nekatakanahalfwidth"]=65416, + ["nfsquare"]=13195, + ["ngabengali"]=2457, + ["ngadeva"]=2329, + ["ngagujarati"]=2713, + ["ngagurmukhi"]=2585, + ["ngonguthai"]=3591, + ["nhiragana"]=12435, + ["nhookleft"]=626, + ["nhookretroflex"]=627, + ["nieunacirclekorean"]=12911, + ["nieunaparenkorean"]=12815, + ["nieuncieuckorean"]=12597, + ["nieuncirclekorean"]=12897, + ["nieunhieuhkorean"]=12598, + ["nieunkorean"]=12596, + ["nieunpansioskorean"]=12648, + ["nieunparenkorean"]=12801, + ["nieunsioskorean"]=12647, + ["nieuntikeutkorean"]=12646, + ["nihiragana"]=12395, + ["nikatakana"]=12491, + ["nikatakanahalfwidth"]=65414, + ["nikhahitthai"]=3661, + ["nine"]=57, + ["ninebengali"]=2543, + ["ninecircle"]=9320, + ["ninecircleinversesansserif"]=10130, + ["ninedeva"]=2415, + ["ninegujarati"]=2799, + ["ninegurmukhi"]=2671, + ["ninehackarabic"]=1641, + ["ninehangzhou"]=12329, + ["nineideographicparen"]=12840, + ["nineinferior"]=8329, + ["ninemonospace"]=65305, + ["nineparen"]=9340, + ["nineperiod"]=9360, + ["ninepersian"]=1785, + ["nineroman"]=8568, + ["ninesuperior"]=8313, + ["nineteencircle"]=9330, + ["nineteenparen"]=9350, + ["nineteenperiod"]=9370, + ["ninethai"]=3673, + ["nj"]=460, + ["njecyrillic"]=1114, + ["nkatakana"]=12531, + ["nkatakanahalfwidth"]=65437, + ["nlegrightlong"]=414, + ["nlinebelow"]=7753, + ["nmonospace"]=65358, + ["nmsquare"]=13210, + ["nnabengali"]=2467, + ["nnadeva"]=2339, + ["nnagujarati"]=2723, + ["nnagurmukhi"]=2595, + ["nnnadeva"]=2345, + ["nohiragana"]=12398, + ["nokatakana"]=12494, + ["nokatakanahalfwidth"]=65417, + ["nonbreakingspace"]=160, + ["nonenthai"]=3603, + ["nonuthai"]=3609, + ["noonarabic"]=1606, + ["noonfinalarabic"]=65254, + ["noonghunnaarabic"]=1722, + ["noonghunnafinalarabic"]=64415, + ["nooninitialarabic"]=65255, + ["noonjeeminitialarabic"]=64722, + ["noonjeemisolatedarabic"]=64587, + ["noonmedialarabic"]=65256, + ["noonmeeminitialarabic"]=64725, + ["noonmeemisolatedarabic"]=64590, + ["noonnoonfinalarabic"]=64653, + ["notcontains"]=8716, + ["notelementof"]=8713, + ["notequal"]=8800, + ["notgreater"]=8815, + ["notgreaternorequal"]=8817, + ["notgreaternorless"]=8825, + ["notidentical"]=8802, + ["notless"]=8814, + ["notlessnorequal"]=8816, + ["notparallel"]=8742, + ["notprecedes"]=8832, + ["notsubset"]=8836, + ["notsucceeds"]=8833, + ["notsuperset"]=8837, + ["nowarmenian"]=1398, + ["nparen"]=9385, + ["nssquare"]=13233, + ["nsuperior"]=8319, + ["ntilde"]=241, + ["nu"]=957, + ["nuhiragana"]=12396, + ["nukatakana"]=12492, + ["nukatakanahalfwidth"]=65415, + ["nuktabengali"]=2492, + ["nuktadeva"]=2364, + ["nuktagujarati"]=2748, + ["nuktagurmukhi"]=2620, + ["numbersign"]=35, + ["numbersignmonospace"]=65283, + ["numbersignsmall"]=65119, + ["numeralsigngreek"]=884, + ["numeralsignlowergreek"]=885, + ["numero"]=8470, + ["nundageshhebrew"]=64320, + ["nunhebrew"]=1504, + ["nvsquare"]=13237, + ["nwsquare"]=13243, + ["nyabengali"]=2462, + ["nyadeva"]=2334, + ["nyagujarati"]=2718, + ["nyagurmukhi"]=2590, + ["o"]=111, + ["oacute"]=243, + ["oangthai"]=3629, + ["obarred"]=629, + ["obarredcyrillic"]=1257, + ["obarreddieresiscyrillic"]=1259, + ["obengali"]=2451, + ["obopomofo"]=12571, + ["obreve"]=335, + ["ocandradeva"]=2321, + ["ocandragujarati"]=2705, + ["ocandravowelsigndeva"]=2377, + ["ocandravowelsigngujarati"]=2761, + ["ocaron"]=466, + ["ocircle"]=9438, + ["ocircumflex"]=244, + ["ocircumflexacute"]=7889, + ["ocircumflexdotbelow"]=7897, + ["ocircumflexgrave"]=7891, + ["ocircumflexhookabove"]=7893, + ["ocircumflextilde"]=7895, + ["ocyrillic"]=1086, + ["odblgrave"]=525, + ["odeva"]=2323, + ["odieresis"]=246, + ["odieresiscyrillic"]=1255, + ["odotbelow"]=7885, + ["oe"]=339, + ["oekorean"]=12634, + ["ogonek"]=731, + ["ogonekcmb"]=808, + ["ograve"]=242, + ["ogujarati"]=2707, + ["oharmenian"]=1413, + ["ohiragana"]=12362, + ["ohookabove"]=7887, + ["ohorn"]=417, + ["ohornacute"]=7899, + ["ohorndotbelow"]=7907, + ["ohorngrave"]=7901, + ["ohornhookabove"]=7903, + ["ohorntilde"]=7905, + ["ohungarumlaut"]=337, + ["oi"]=419, + ["oinvertedbreve"]=527, + ["okatakana"]=12458, + ["okatakanahalfwidth"]=65397, + ["okorean"]=12631, + ["olehebrew"]=1451, + ["omacron"]=333, + ["omacronacute"]=7763, + ["omacrongrave"]=7761, + ["omdeva"]=2384, + ["omega"]=969, + ["omegacyrillic"]=1121, + ["omegalatinclosed"]=631, + ["omegaroundcyrillic"]=1147, + ["omegatitlocyrillic"]=1149, + ["omegatonos"]=974, + ["omgujarati"]=2768, + ["omicron"]=959, + ["omicrontonos"]=972, + ["omonospace"]=65359, + ["one"]=49, + ["onebengali"]=2535, + ["onecircle"]=9312, + ["onecircleinversesansserif"]=10122, + ["onedeva"]=2407, + ["onedotenleader"]=8228, + ["oneeighth"]=8539, + ["onegujarati"]=2791, + ["onegurmukhi"]=2663, + ["onehackarabic"]=1633, + ["onehalf"]=189, + ["onehangzhou"]=12321, + ["oneideographicparen"]=12832, + ["oneinferior"]=8321, + ["onemonospace"]=65297, + ["onenumeratorbengali"]=2548, + ["oneparen"]=9332, + ["oneperiod"]=9352, + ["onepersian"]=1777, + ["onequarter"]=188, + ["oneroman"]=8560, + ["onesuperior"]=185, + ["onethai"]=3665, + ["onethird"]=8531, + ["oogonek"]=491, + ["oogonekmacron"]=493, + ["oogurmukhi"]=2579, + ["oomatragurmukhi"]=2635, + ["oopen"]=596, + ["oparen"]=9386, + ["option"]=8997, + ["ordfeminine"]=170, + ["ordmasculine"]=186, + ["oshortdeva"]=2322, + ["oshortvowelsigndeva"]=2378, + ["oslash"]=248, + ["osmallhiragana"]=12361, + ["osmallkatakana"]=12457, + ["osmallkatakanahalfwidth"]=65387, + ["ostrokeacute"]=511, + ["otcyrillic"]=1151, + ["otilde"]=245, + ["otildeacute"]=7757, + ["otildedieresis"]=7759, + ["oubopomofo"]=12577, + ["overline"]=8254, + ["overlinecenterline"]=65098, + ["overlinecmb"]=773, + ["overlinedashed"]=65097, + ["overlinedblwavy"]=65100, + ["overlinewavy"]=65099, + ["ovowelsignbengali"]=2507, + ["ovowelsigndeva"]=2379, + ["ovowelsigngujarati"]=2763, + ["p"]=112, + ["paampssquare"]=13184, + ["paasentosquare"]=13099, + ["pabengali"]=2474, + ["pacute"]=7765, + ["padeva"]=2346, + ["pagedown"]=8671, + ["pageup"]=8670, + ["pagujarati"]=2730, + ["pagurmukhi"]=2602, + ["pahiragana"]=12401, + ["paiyannoithai"]=3631, + ["pakatakana"]=12497, + ["palatalizationcyrilliccmb"]=1156, + ["palochkacyrillic"]=1216, + ["pansioskorean"]=12671, + ["paragraph"]=182, + ["parallel"]=8741, + ["parenleft"]=40, + ["parenleftaltonearabic"]=64830, + ["parenleftinferior"]=8333, + ["parenleftmonospace"]=65288, + ["parenleftsmall"]=65113, + ["parenleftsuperior"]=8317, + ["parenleftvertical"]=65077, + ["parenright"]=41, + ["parenrightaltonearabic"]=64831, + ["parenrightinferior"]=8334, + ["parenrightmonospace"]=65289, + ["parenrightsmall"]=65114, + ["parenrightsuperior"]=8318, + ["parenrightvertical"]=65078, + ["partialdiff"]=8706, + ["paseqhebrew"]=1472, + ["pashtahebrew"]=1433, + ["pasquare"]=13225, + ["patahwidehebrew"]=1463, + ["pazerhebrew"]=1441, + ["pbopomofo"]=12550, + ["pcircle"]=9439, + ["pdotaccent"]=7767, + ["pecyrillic"]=1087, + ["pedageshhebrew"]=64324, + ["peezisquare"]=13115, + ["pefinaldageshhebrew"]=64323, + ["peharabic"]=1662, + ["peharmenian"]=1402, + ["pehebrew"]=1508, + ["pehfinalarabic"]=64343, + ["pehinitialarabic"]=64344, + ["pehiragana"]=12410, + ["pehmedialarabic"]=64345, + ["pekatakana"]=12506, + ["pemiddlehookcyrillic"]=1191, + ["perafehebrew"]=64334, + ["percent"]=37, + ["percentarabic"]=1642, + ["percentmonospace"]=65285, + ["percentsmall"]=65130, + ["period"]=46, + ["periodarmenian"]=1417, + ["periodcentered"]=183, + ["periodhalfwidth"]=65377, + ["periodmonospace"]=65294, + ["periodsmall"]=65106, + ["perispomenigreekcmb"]=834, + ["perpendicular"]=8869, + ["perthousand"]=8240, + ["peseta"]=8359, + ["pfsquare"]=13194, + ["phabengali"]=2475, + ["phadeva"]=2347, + ["phagujarati"]=2731, + ["phagurmukhi"]=2603, + ["phi"]=966, + ["phieuphacirclekorean"]=12922, + ["phieuphaparenkorean"]=12826, + ["phieuphcirclekorean"]=12908, + ["phieuphkorean"]=12621, + ["phieuphparenkorean"]=12812, + ["philatin"]=632, + ["phinthuthai"]=3642, + ["phisymbolgreek"]=981, + ["phook"]=421, + ["phophanthai"]=3614, + ["phophungthai"]=3612, + ["phosamphaothai"]=3616, + ["pi"]=960, + ["pieupacirclekorean"]=12915, + ["pieupaparenkorean"]=12819, + ["pieupcieuckorean"]=12662, + ["pieupcirclekorean"]=12901, + ["pieupkiyeokkorean"]=12658, + ["pieupkorean"]=12610, + ["pieupparenkorean"]=12805, + ["pieupsioskiyeokkorean"]=12660, + ["pieupsioskorean"]=12612, + ["pieupsiostikeutkorean"]=12661, + ["pieupthieuthkorean"]=12663, + ["pieuptikeutkorean"]=12659, + ["pihiragana"]=12404, + ["pikatakana"]=12500, + ["pisymbolgreek"]=982, + ["piwrarmenian"]=1411, + ["plus"]=43, + ["plusbelowcmb"]=799, + ["pluscircle"]=8853, + ["plusminus"]=177, + ["plusmod"]=726, + ["plusmonospace"]=65291, + ["plussmall"]=65122, + ["plussuperior"]=8314, + ["pmonospace"]=65360, + ["pmsquare"]=13272, + ["pohiragana"]=12413, + ["pointingindexdownwhite"]=9759, + ["pointingindexleftwhite"]=9756, + ["pointingindexrightwhite"]=9758, + ["pointingindexupwhite"]=9757, + ["pokatakana"]=12509, + ["poplathai"]=3611, + ["postalmark"]=12306, + ["postalmarkface"]=12320, + ["pparen"]=9387, + ["precedes"]=8826, + ["prescription"]=8478, + ["primemod"]=697, + ["primereversed"]=8245, + ["product"]=8719, + ["projective"]=8965, + ["prolongedkana"]=12540, + ["propellor"]=8984, + ["proportion"]=8759, + ["proportional"]=8733, + ["psi"]=968, + ["psicyrillic"]=1137, + ["psilipneumatacyrilliccmb"]=1158, + ["pssquare"]=13232, + ["puhiragana"]=12407, + ["pukatakana"]=12503, + ["pvsquare"]=13236, + ["pwsquare"]=13242, + ["q"]=113, + ["qadeva"]=2392, + ["qadmahebrew"]=1448, + ["qafarabic"]=1602, + ["qaffinalarabic"]=65238, + ["qafinitialarabic"]=65239, + ["qafmedialarabic"]=65240, + ["qamatswidehebrew"]=1464, + ["qarneyparahebrew"]=1439, + ["qbopomofo"]=12561, + ["qcircle"]=9440, + ["qhook"]=672, + ["qmonospace"]=65361, + ["qofdageshhebrew"]=64327, + ["qoftserehebrew"]=1511, + ["qparen"]=9388, + ["quarternote"]=9833, + ["qubutswidehebrew"]=1467, + ["question"]=63, + ["questionarabic"]=1567, + ["questionarmenian"]=1374, + ["questiondown"]=191, + ["questiongreek"]=894, + ["questionmonospace"]=65311, + ["quotedbl"]=34, + ["quotedblbase"]=8222, + ["quotedblleft"]=8220, + ["quotedblmonospace"]=65282, + ["quotedblprime"]=12318, + ["quotedblprimereversed"]=12317, + ["quotedblright"]=8221, + ["quoteleft"]=8216, + ["quotereversed"]=8219, + ["quoteright"]=8217, + ["quoterightn"]=329, + ["quotesinglbase"]=8218, + ["quotesingle"]=39, + ["quotesinglemonospace"]=65287, + ["r"]=114, + ["raarmenian"]=1404, + ["rabengali"]=2480, + ["racute"]=341, + ["radeva"]=2352, + ["radical"]=8730, + ["radoverssquare"]=13230, + ["radoverssquaredsquare"]=13231, + ["radsquare"]=13229, + ["rafehebrew"]=1471, + ["ragujarati"]=2736, + ["ragurmukhi"]=2608, + ["rahiragana"]=12425, + ["rakatakana"]=12521, + ["rakatakanahalfwidth"]=65431, + ["ralowerdiagonalbengali"]=2545, + ["ramiddlediagonalbengali"]=2544, + ["ramshorn"]=612, + ["ratio"]=8758, + ["rbopomofo"]=12566, + ["rcaron"]=345, + ["rcircle"]=9441, + ["rcommaaccent"]=343, + ["rdblgrave"]=529, + ["rdotaccent"]=7769, + ["rdotbelow"]=7771, + ["rdotbelowmacron"]=7773, + ["referencemark"]=8251, + ["registered"]=174, + ["reharmenian"]=1408, + ["rehfinalarabic"]=65198, + ["rehiragana"]=12428, + ["rehyehaleflamarabic"]=1585, + ["rekatakana"]=12524, + ["rekatakanahalfwidth"]=65434, + ["reshdageshhebrew"]=64328, + ["reshtserehebrew"]=1512, + ["reversedtilde"]=8765, + ["reviamugrashhebrew"]=1431, + ["revlogicalnot"]=8976, + ["rfishhook"]=638, + ["rfishhookreversed"]=639, + ["rhabengali"]=2525, + ["rhadeva"]=2397, + ["rho"]=961, + ["rhook"]=637, + ["rhookturned"]=635, + ["rhookturnedsuperior"]=693, + ["rhosymbolgreek"]=1009, + ["rhotichookmod"]=734, + ["rieulacirclekorean"]=12913, + ["rieulaparenkorean"]=12817, + ["rieulcirclekorean"]=12899, + ["rieulhieuhkorean"]=12608, + ["rieulkiyeokkorean"]=12602, + ["rieulkiyeoksioskorean"]=12649, + ["rieulkorean"]=12601, + ["rieulmieumkorean"]=12603, + ["rieulpansioskorean"]=12652, + ["rieulparenkorean"]=12803, + ["rieulphieuphkorean"]=12607, + ["rieulpieupkorean"]=12604, + ["rieulpieupsioskorean"]=12651, + ["rieulsioskorean"]=12605, + ["rieulthieuthkorean"]=12606, + ["rieultikeutkorean"]=12650, + ["rieulyeorinhieuhkorean"]=12653, + ["rightangle"]=8735, + ["righttackbelowcmb"]=793, + ["righttriangle"]=8895, + ["rihiragana"]=12426, + ["rikatakana"]=12522, + ["rikatakanahalfwidth"]=65432, + ["ring"]=730, + ["ringbelowcmb"]=805, + ["ringcmb"]=778, + ["ringhalfleft"]=703, + ["ringhalfleftarmenian"]=1369, + ["ringhalfleftbelowcmb"]=796, + ["ringhalfleftcentered"]=723, + ["ringhalfright"]=702, + ["ringhalfrightbelowcmb"]=825, + ["ringhalfrightcentered"]=722, + ["rinvertedbreve"]=531, + ["rittorusquare"]=13137, + ["rlinebelow"]=7775, + ["rlongleg"]=636, + ["rlonglegturned"]=634, + ["rmonospace"]=65362, + ["rohiragana"]=12429, + ["rokatakana"]=12525, + ["rokatakanahalfwidth"]=65435, + ["roruathai"]=3619, + ["rparen"]=9389, + ["rrabengali"]=2524, + ["rradeva"]=2353, + ["rragurmukhi"]=2652, + ["rreharabic"]=1681, + ["rrehfinalarabic"]=64397, + ["rrvocalicbengali"]=2528, + ["rrvocalicdeva"]=2400, + ["rrvocalicgujarati"]=2784, + ["rrvocalicvowelsignbengali"]=2500, + ["rrvocalicvowelsigndeva"]=2372, + ["rrvocalicvowelsigngujarati"]=2756, + ["rtblock"]=9616, + ["rturned"]=633, + ["rturnedsuperior"]=692, + ["ruhiragana"]=12427, + ["rukatakana"]=12523, + ["rukatakanahalfwidth"]=65433, + ["rupeemarkbengali"]=2546, + ["rupeesignbengali"]=2547, + ["ruthai"]=3620, + ["rvocalicbengali"]=2443, + ["rvocalicdeva"]=2315, + ["rvocalicgujarati"]=2699, + ["rvocalicvowelsignbengali"]=2499, + ["rvocalicvowelsigndeva"]=2371, + ["rvocalicvowelsigngujarati"]=2755, + ["s"]=115, + ["sabengali"]=2488, + ["sacute"]=347, + ["sacutedotaccent"]=7781, + ["sadarabic"]=1589, + ["sadeva"]=2360, + ["sadfinalarabic"]=65210, + ["sadinitialarabic"]=65211, + ["sadmedialarabic"]=65212, + ["sagujarati"]=2744, + ["sagurmukhi"]=2616, + ["sahiragana"]=12373, + ["sakatakana"]=12469, + ["sakatakanahalfwidth"]=65403, + ["sallallahoualayhewasallamarabic"]=65018, + ["samekhdageshhebrew"]=64321, + ["samekhhebrew"]=1505, + ["saraaathai"]=3634, + ["saraaethai"]=3649, + ["saraaimaimalaithai"]=3652, + ["saraaimaimuanthai"]=3651, + ["saraamthai"]=3635, + ["saraathai"]=3632, + ["saraethai"]=3648, + ["saraiithai"]=3637, + ["saraithai"]=3636, + ["saraothai"]=3650, + ["saraueethai"]=3639, + ["sarauethai"]=3638, + ["sarauthai"]=3640, + ["sarauuthai"]=3641, + ["sbopomofo"]=12569, + ["scaron"]=353, + ["scarondotaccent"]=7783, + ["scedilla"]=351, + ["schwa"]=601, + ["schwacyrillic"]=1241, + ["schwadieresiscyrillic"]=1243, + ["schwahook"]=602, + ["scircle"]=9442, + ["scircumflex"]=349, + ["scommaaccent"]=537, + ["sdotaccent"]=7777, + ["sdotbelow"]=7779, + ["sdotbelowdotaccent"]=7785, + ["seagullbelowcmb"]=828, + ["second"]=8243, + ["secondtonechinese"]=714, + ["section"]=167, + ["seenarabic"]=1587, + ["seenfinalarabic"]=65202, + ["seeninitialarabic"]=65203, + ["seenmedialarabic"]=65204, + ["segoltahebrew"]=1426, + ["segolwidehebrew"]=1462, + ["seharmenian"]=1405, + ["sehiragana"]=12379, + ["sekatakana"]=12475, + ["sekatakanahalfwidth"]=65406, + ["semicolon"]=59, + ["semicolonarabic"]=1563, + ["semicolonmonospace"]=65307, + ["semicolonsmall"]=65108, + ["semivoicedmarkkana"]=12444, + ["semivoicedmarkkanahalfwidth"]=65439, + ["sentisquare"]=13090, + ["sentosquare"]=13091, + ["seven"]=55, + ["sevenbengali"]=2541, + ["sevencircle"]=9318, + ["sevencircleinversesansserif"]=10128, + ["sevendeva"]=2413, + ["seveneighths"]=8542, + ["sevengujarati"]=2797, + ["sevengurmukhi"]=2669, + ["sevenhackarabic"]=1639, + ["sevenhangzhou"]=12327, + ["sevenideographicparen"]=12838, + ["seveninferior"]=8327, + ["sevenmonospace"]=65303, + ["sevenparen"]=9338, + ["sevenperiod"]=9358, + ["sevenpersian"]=1783, + ["sevenroman"]=8566, + ["sevensuperior"]=8311, + ["seventeencircle"]=9328, + ["seventeenparen"]=9348, + ["seventeenperiod"]=9368, + ["seventhai"]=3671, + ["shaarmenian"]=1399, + ["shabengali"]=2486, + ["shacyrillic"]=1096, + ["shaddadammaarabic"]=64609, + ["shaddadammatanarabic"]=64606, + ["shaddafathaarabic"]=64608, + ["shaddafathatanarabic"]=1617, + ["shaddakasraarabic"]=64610, + ["shaddakasratanarabic"]=64607, + ["shadedark"]=9619, + ["shadelight"]=9617, + ["shademedium"]=9618, + ["shadeva"]=2358, + ["shagujarati"]=2742, + ["shagurmukhi"]=2614, + ["shalshelethebrew"]=1427, + ["shbopomofo"]=12565, + ["shchacyrillic"]=1097, + ["sheenarabic"]=1588, + ["sheenfinalarabic"]=65206, + ["sheeninitialarabic"]=65207, + ["sheenmedialarabic"]=65208, + ["sheicoptic"]=995, + ["sheqelhebrew"]=8362, + ["shevawidehebrew"]=1456, + ["shhacyrillic"]=1211, + ["shimacoptic"]=1005, + ["shindageshhebrew"]=64329, + ["shindageshshindothebrew"]=64300, + ["shindageshsindothebrew"]=64301, + ["shindothebrew"]=1473, + ["shinhebrew"]=1513, + ["shinshindothebrew"]=64298, + ["shinsindothebrew"]=64299, + ["shook"]=642, + ["sigma"]=963, + ["sigmafinal"]=962, + ["sigmalunatesymbolgreek"]=1010, + ["sihiragana"]=12375, + ["sikatakana"]=12471, + ["sikatakanahalfwidth"]=65404, + ["siluqlefthebrew"]=1469, + ["sindothebrew"]=1474, + ["siosacirclekorean"]=12916, + ["siosaparenkorean"]=12820, + ["sioscieuckorean"]=12670, + ["sioscirclekorean"]=12902, + ["sioskiyeokkorean"]=12666, + ["sioskorean"]=12613, + ["siosnieunkorean"]=12667, + ["siosparenkorean"]=12806, + ["siospieupkorean"]=12669, + ["siostikeutkorean"]=12668, + ["six"]=54, + ["sixbengali"]=2540, + ["sixcircle"]=9317, + ["sixcircleinversesansserif"]=10127, + ["sixdeva"]=2412, + ["sixgujarati"]=2796, + ["sixgurmukhi"]=2668, + ["sixhackarabic"]=1638, + ["sixhangzhou"]=12326, + ["sixideographicparen"]=12837, + ["sixinferior"]=8326, + ["sixmonospace"]=65302, + ["sixparen"]=9337, + ["sixperiod"]=9357, + ["sixpersian"]=1782, + ["sixroman"]=8565, + ["sixsuperior"]=8310, + ["sixteencircle"]=9327, + ["sixteencurrencydenominatorbengali"]=2553, + ["sixteenparen"]=9347, + ["sixteenperiod"]=9367, + ["sixthai"]=3670, + ["slash"]=47, + ["slashmonospace"]=65295, + ["slong"]=383, + ["slongdotaccent"]=7835, + ["smonospace"]=65363, + ["sofpasuqhebrew"]=1475, + ["softhyphen"]=173, + ["softsigncyrillic"]=1100, + ["sohiragana"]=12381, + ["sokatakana"]=12477, + ["sokatakanahalfwidth"]=65407, + ["soliduslongoverlaycmb"]=824, + ["solidusshortoverlaycmb"]=823, + ["sorusithai"]=3625, + ["sosalathai"]=3624, + ["sosothai"]=3595, + ["sosuathai"]=3626, + ["space"]=32, + ["spadesuitblack"]=9824, + ["spadesuitwhite"]=9828, + ["sparen"]=9390, + ["squarebelowcmb"]=827, + ["squarecc"]=13252, + ["squarecm"]=13213, + ["squarediagonalcrosshatchfill"]=9641, + ["squarehorizontalfill"]=9636, + ["squarekg"]=13199, + ["squarekm"]=13214, + ["squarekmcapital"]=13262, + ["squareln"]=13265, + ["squarelog"]=13266, + ["squaremg"]=13198, + ["squaremil"]=13269, + ["squaremm"]=13212, + ["squaremsquared"]=13217, + ["squareorthogonalcrosshatchfill"]=9638, + ["squareupperlefttolowerrightfill"]=9639, + ["squareupperrighttolowerleftfill"]=9640, + ["squareverticalfill"]=9637, + ["squarewhitewithsmallblack"]=9635, + ["srsquare"]=13275, + ["ssabengali"]=2487, + ["ssadeva"]=2359, + ["ssagujarati"]=2743, + ["ssangcieuckorean"]=12617, + ["ssanghieuhkorean"]=12677, + ["ssangieungkorean"]=12672, + ["ssangkiyeokkorean"]=12594, + ["ssangnieunkorean"]=12645, + ["ssangpieupkorean"]=12611, + ["ssangsioskorean"]=12614, + ["ssangtikeutkorean"]=12600, + ["sterling"]=163, + ["sterlingmonospace"]=65505, + ["strokelongoverlaycmb"]=822, + ["strokeshortoverlaycmb"]=821, + ["subset"]=8834, + ["subsetnotequal"]=8842, + ["subsetorequal"]=8838, + ["succeeds"]=8827, + ["suchthat"]=8715, + ["suhiragana"]=12377, + ["sukatakana"]=12473, + ["sukatakanahalfwidth"]=65405, + ["sukunarabic"]=1618, + ["summation"]=8721, + ["sun"]=9788, + ["superset"]=8835, + ["supersetnotequal"]=8843, + ["supersetorequal"]=8839, + ["svsquare"]=13276, + ["syouwaerasquare"]=13180, + ["t"]=116, + ["tabengali"]=2468, + ["tackdown"]=8868, + ["tackleft"]=8867, + ["tadeva"]=2340, + ["tagujarati"]=2724, + ["tagurmukhi"]=2596, + ["taharabic"]=1591, + ["tahfinalarabic"]=65218, + ["tahinitialarabic"]=65219, + ["tahiragana"]=12383, + ["tahmedialarabic"]=65220, + ["taisyouerasquare"]=13181, + ["takatakana"]=12479, + ["takatakanahalfwidth"]=65408, + ["tatweelarabic"]=1600, + ["tau"]=964, + ["tavdageshhebrew"]=64330, + ["tavhebrew"]=1514, + ["tbar"]=359, + ["tbopomofo"]=12554, + ["tcaron"]=357, + ["tccurl"]=680, + ["tcheharabic"]=1670, + ["tchehfinalarabic"]=64379, + ["tchehmedialarabic"]=64381, + ["tchehmeeminitialarabic"]=64380, + ["tcircle"]=9443, + ["tcircumflexbelow"]=7793, + ["tcommaaccent"]=355, + ["tdieresis"]=7831, + ["tdotaccent"]=7787, + ["tdotbelow"]=7789, + ["tecyrillic"]=1090, + ["tedescendercyrillic"]=1197, + ["teharabic"]=1578, + ["tehfinalarabic"]=65174, + ["tehhahinitialarabic"]=64674, + ["tehhahisolatedarabic"]=64524, + ["tehinitialarabic"]=65175, + ["tehiragana"]=12390, + ["tehjeeminitialarabic"]=64673, + ["tehjeemisolatedarabic"]=64523, + ["tehmarbutaarabic"]=1577, + ["tehmarbutafinalarabic"]=65172, + ["tehmedialarabic"]=65176, + ["tehmeeminitialarabic"]=64676, + ["tehmeemisolatedarabic"]=64526, + ["tehnoonfinalarabic"]=64627, + ["tekatakana"]=12486, + ["tekatakanahalfwidth"]=65411, + ["telephone"]=8481, + ["telephoneblack"]=9742, + ["telishagedolahebrew"]=1440, + ["telishaqetanahebrew"]=1449, + ["tencircle"]=9321, + ["tenideographicparen"]=12841, + ["tenparen"]=9341, + ["tenperiod"]=9361, + ["tenroman"]=8569, + ["tesh"]=679, + ["tetdageshhebrew"]=64312, + ["tethebrew"]=1496, + ["tetsecyrillic"]=1205, + ["tevirlefthebrew"]=1435, + ["thabengali"]=2469, + ["thadeva"]=2341, + ["thagujarati"]=2725, + ["thagurmukhi"]=2597, + ["thalarabic"]=1584, + ["thalfinalarabic"]=65196, + ["thanthakhatthai"]=3660, + ["theharabic"]=1579, + ["thehfinalarabic"]=65178, + ["thehinitialarabic"]=65179, + ["thehmedialarabic"]=65180, + ["thereexists"]=8707, + ["therefore"]=8756, + ["theta"]=952, + ["thetasymbolgreek"]=977, + ["thieuthacirclekorean"]=12921, + ["thieuthaparenkorean"]=12825, + ["thieuthcirclekorean"]=12907, + ["thieuthkorean"]=12620, + ["thieuthparenkorean"]=12811, + ["thirteencircle"]=9324, + ["thirteenparen"]=9344, + ["thirteenperiod"]=9364, + ["thonangmonthothai"]=3601, + ["thook"]=429, + ["thophuthaothai"]=3602, + ["thorn"]=254, + ["thothahanthai"]=3607, + ["thothanthai"]=3600, + ["thothongthai"]=3608, + ["thothungthai"]=3606, + ["thousandcyrillic"]=1154, + ["thousandsseparatorpersian"]=1644, + ["three"]=51, + ["threebengali"]=2537, + ["threecircle"]=9314, + ["threecircleinversesansserif"]=10124, + ["threedeva"]=2409, + ["threeeighths"]=8540, + ["threegujarati"]=2793, + ["threegurmukhi"]=2665, + ["threehackarabic"]=1635, + ["threehangzhou"]=12323, + ["threeideographicparen"]=12834, + ["threeinferior"]=8323, + ["threemonospace"]=65299, + ["threenumeratorbengali"]=2550, + ["threeparen"]=9334, + ["threeperiod"]=9354, + ["threepersian"]=1779, + ["threequarters"]=190, + ["threeroman"]=8562, + ["threesuperior"]=179, + ["threethai"]=3667, + ["thzsquare"]=13204, + ["tihiragana"]=12385, + ["tikatakana"]=12481, + ["tikatakanahalfwidth"]=65409, + ["tikeutacirclekorean"]=12912, + ["tikeutaparenkorean"]=12816, + ["tikeutcirclekorean"]=12898, + ["tikeutkorean"]=12599, + ["tikeutparenkorean"]=12802, + ["tilde"]=732, + ["tildebelowcmb"]=816, + ["tildecomb"]=771, + ["tildedoublecmb"]=864, + ["tildeoperator"]=8764, + ["tildeoverlaycmb"]=820, + ["tildeverticalcmb"]=830, + ["timescircle"]=8855, + ["tipehalefthebrew"]=1430, + ["tippigurmukhi"]=2672, + ["titlocyrilliccmb"]=1155, + ["tiwnarmenian"]=1407, + ["tlinebelow"]=7791, + ["tmonospace"]=65364, + ["toarmenian"]=1385, + ["tohiragana"]=12392, + ["tokatakana"]=12488, + ["tokatakanahalfwidth"]=65412, + ["tonebarextrahighmod"]=741, + ["tonebarextralowmod"]=745, + ["tonebarhighmod"]=742, + ["tonebarlowmod"]=744, + ["tonebarmidmod"]=743, + ["tonefive"]=445, + ["tonesix"]=389, + ["tonetwo"]=424, + ["tonos"]=900, + ["tonsquare"]=13095, + ["topatakthai"]=3599, + ["tortoiseshellbracketleft"]=12308, + ["tortoiseshellbracketleftsmall"]=65117, + ["tortoiseshellbracketleftvertical"]=65081, + ["tortoiseshellbracketright"]=12309, + ["tortoiseshellbracketrightsmall"]=65118, + ["tortoiseshellbracketrightvertical"]=65082, + ["totaothai"]=3605, + ["tpalatalhook"]=427, + ["tparen"]=9391, + ["trademark"]=8482, + ["tretroflexhook"]=648, + ["triagdn"]=9660, + ["triaglf"]=9668, + ["triagrt"]=9658, + ["triagup"]=9650, + ["ts"]=678, + ["tsadidageshhebrew"]=64326, + ["tsadihebrew"]=1510, + ["tsecyrillic"]=1094, + ["tserewidehebrew"]=1461, + ["tshecyrillic"]=1115, + ["ttabengali"]=2463, + ["ttadeva"]=2335, + ["ttagujarati"]=2719, + ["ttagurmukhi"]=2591, + ["tteharabic"]=1657, + ["ttehfinalarabic"]=64359, + ["ttehinitialarabic"]=64360, + ["ttehmedialarabic"]=64361, + ["tthabengali"]=2464, + ["tthadeva"]=2336, + ["tthagujarati"]=2720, + ["tthagurmukhi"]=2592, + ["tturned"]=647, + ["tuhiragana"]=12388, + ["tukatakana"]=12484, + ["tukatakanahalfwidth"]=65410, + ["tusmallhiragana"]=12387, + ["tusmallkatakana"]=12483, + ["tusmallkatakanahalfwidth"]=65391, + ["twelvecircle"]=9323, + ["twelveparen"]=9343, + ["twelveperiod"]=9363, + ["twelveroman"]=8571, + ["twentycircle"]=9331, + ["twentyparen"]=9351, + ["twentyperiod"]=9371, + ["two"]=50, + ["twobengali"]=2536, + ["twocircle"]=9313, + ["twocircleinversesansserif"]=10123, + ["twodeva"]=2408, + ["twodotleader"]=8229, + ["twodotleadervertical"]=65072, + ["twogujarati"]=2792, + ["twogurmukhi"]=2664, + ["twohackarabic"]=1634, + ["twohangzhou"]=12322, + ["twoideographicparen"]=12833, + ["twoinferior"]=8322, + ["twomonospace"]=65298, + ["twonumeratorbengali"]=2549, + ["twoparen"]=9333, + ["twoperiod"]=9353, + ["twopersian"]=1778, + ["tworoman"]=8561, + ["twostroke"]=443, + ["twosuperior"]=178, + ["twothai"]=3666, + ["twothirds"]=8532, + ["u"]=117, + ["uacute"]=250, + ["ubar"]=649, + ["ubengali"]=2441, + ["ubopomofo"]=12584, + ["ubreve"]=365, + ["ucaron"]=468, + ["ucircle"]=9444, + ["ucircumflex"]=251, + ["ucircumflexbelow"]=7799, + ["ucyrillic"]=1091, + ["udattadeva"]=2385, + ["udblgrave"]=533, + ["udeva"]=2313, + ["udieresis"]=252, + ["udieresisacute"]=472, + ["udieresisbelow"]=7795, + ["udieresiscaron"]=474, + ["udieresiscyrillic"]=1265, + ["udieresisgrave"]=476, + ["udieresismacron"]=470, + ["udotbelow"]=7909, + ["ugrave"]=249, + ["ugujarati"]=2697, + ["ugurmukhi"]=2569, + ["uhiragana"]=12358, + ["uhookabove"]=7911, + ["uhorn"]=432, + ["uhornacute"]=7913, + ["uhorndotbelow"]=7921, + ["uhorngrave"]=7915, + ["uhornhookabove"]=7917, + ["uhorntilde"]=7919, + ["uhungarumlaut"]=369, + ["uhungarumlautcyrillic"]=1267, + ["uinvertedbreve"]=535, + ["ukatakana"]=12454, + ["ukatakanahalfwidth"]=65395, + ["ukcyrillic"]=1145, + ["ukorean"]=12636, + ["umacron"]=363, + ["umacroncyrillic"]=1263, + ["umacrondieresis"]=7803, + ["umatragurmukhi"]=2625, + ["umonospace"]=65365, + ["underscore"]=95, + ["underscoredbl"]=8215, + ["underscoremonospace"]=65343, + ["underscorevertical"]=65075, + ["underscorewavy"]=65103, + ["union"]=8746, + ["universal"]=8704, + ["uogonek"]=371, + ["uparen"]=9392, + ["upblock"]=9600, + ["upperdothebrew"]=1476, + ["upsilon"]=965, + ["upsilondieresis"]=971, + ["upsilondieresistonos"]=944, + ["upsilonlatin"]=650, + ["upsilontonos"]=973, + ["uptackbelowcmb"]=797, + ["uptackmod"]=724, + ["uragurmukhi"]=2675, + ["uring"]=367, + ["ushortcyrillic"]=1118, + ["usmallhiragana"]=12357, + ["usmallkatakana"]=12453, + ["usmallkatakanahalfwidth"]=65385, + ["ustraightcyrillic"]=1199, + ["ustraightstrokecyrillic"]=1201, + ["utilde"]=361, + ["utildeacute"]=7801, + ["utildebelow"]=7797, + ["uubengali"]=2442, + ["uudeva"]=2314, + ["uugujarati"]=2698, + ["uugurmukhi"]=2570, + ["uumatragurmukhi"]=2626, + ["uuvowelsignbengali"]=2498, + ["uuvowelsigndeva"]=2370, + ["uuvowelsigngujarati"]=2754, + ["uvowelsignbengali"]=2497, + ["uvowelsigndeva"]=2369, + ["uvowelsigngujarati"]=2753, + ["v"]=118, + ["vadeva"]=2357, + ["vagujarati"]=2741, + ["vagurmukhi"]=2613, + ["vakatakana"]=12535, + ["vavdageshhebrew"]=64309, + ["vavhebrew"]=1493, + ["vavholamhebrew"]=64331, + ["vavvavhebrew"]=1520, + ["vavyodhebrew"]=1521, + ["vcircle"]=9445, + ["vdotbelow"]=7807, + ["vecyrillic"]=1074, + ["veharabic"]=1700, + ["vehfinalarabic"]=64363, + ["vehinitialarabic"]=64364, + ["vehmedialarabic"]=64365, + ["vekatakana"]=12537, + ["venus"]=9792, + ["verticalbar"]=124, + ["verticallineabovecmb"]=781, + ["verticallinebelowcmb"]=809, + ["verticallinelowmod"]=716, + ["verticallinemod"]=712, + ["vewarmenian"]=1406, + ["vhook"]=651, + ["vikatakana"]=12536, + ["viramabengali"]=2509, + ["viramadeva"]=2381, + ["viramagujarati"]=2765, + ["visargabengali"]=2435, + ["visargadeva"]=2307, + ["visargagujarati"]=2691, + ["vmonospace"]=65366, + ["voarmenian"]=1400, + ["voicediterationhiragana"]=12446, + ["voicediterationkatakana"]=12542, + ["voicedmarkkana"]=12443, + ["voicedmarkkanahalfwidth"]=65438, + ["vokatakana"]=12538, + ["vparen"]=9393, + ["vtilde"]=7805, + ["vturned"]=652, + ["vuhiragana"]=12436, + ["vukatakana"]=12532, + ["w"]=119, + ["wacute"]=7811, + ["waekorean"]=12633, + ["wahiragana"]=12431, + ["wakatakana"]=12527, + ["wakatakanahalfwidth"]=65436, + ["wakorean"]=12632, + ["wasmallhiragana"]=12430, + ["wasmallkatakana"]=12526, + ["wattosquare"]=13143, + ["wavedash"]=12316, + ["wavyunderscorevertical"]=65076, + ["wawarabic"]=1608, + ["wawfinalarabic"]=65262, + ["wawhamzaabovearabic"]=1572, + ["wawhamzaabovefinalarabic"]=65158, + ["wbsquare"]=13277, + ["wcircle"]=9446, + ["wcircumflex"]=373, + ["wdieresis"]=7813, + ["wdotaccent"]=7815, + ["wdotbelow"]=7817, + ["wehiragana"]=12433, + ["weierstrass"]=8472, + ["wekatakana"]=12529, + ["wekorean"]=12638, + ["weokorean"]=12637, + ["wgrave"]=7809, + ["whitebullet"]=9702, + ["whitecircle"]=9675, + ["whitecircleinverse"]=9689, + ["whitecornerbracketleft"]=12302, + ["whitecornerbracketleftvertical"]=65091, + ["whitecornerbracketright"]=12303, + ["whitecornerbracketrightvertical"]=65092, + ["whitediamond"]=9671, + ["whitediamondcontainingblacksmalldiamond"]=9672, + ["whitedownpointingsmalltriangle"]=9663, + ["whitedownpointingtriangle"]=9661, + ["whiteleftpointingsmalltriangle"]=9667, + ["whiteleftpointingtriangle"]=9665, + ["whitelenticularbracketleft"]=12310, + ["whitelenticularbracketright"]=12311, + ["whiterightpointingsmalltriangle"]=9657, + ["whiterightpointingtriangle"]=9655, + ["whitesmallsquare"]=9643, + ["whitesmilingface"]=9786, + ["whitesquare"]=9633, + ["whitestar"]=9734, + ["whitetelephone"]=9743, + ["whitetortoiseshellbracketleft"]=12312, + ["whitetortoiseshellbracketright"]=12313, + ["whiteuppointingsmalltriangle"]=9653, + ["whiteuppointingtriangle"]=9651, + ["wihiragana"]=12432, + ["wikatakana"]=12528, + ["wikorean"]=12639, + ["wmonospace"]=65367, + ["wohiragana"]=12434, + ["wokatakana"]=12530, + ["wokatakanahalfwidth"]=65382, + ["won"]=8361, + ["wonmonospace"]=65510, + ["wowaenthai"]=3623, + ["wparen"]=9394, + ["wring"]=7832, + ["wsuperior"]=695, + ["wturned"]=653, + ["wynn"]=447, + ["x"]=120, + ["xabovecmb"]=829, + ["xbopomofo"]=12562, + ["xcircle"]=9447, + ["xdieresis"]=7821, + ["xdotaccent"]=7819, + ["xeharmenian"]=1389, + ["xi"]=958, + ["xmonospace"]=65368, + ["xparen"]=9395, + ["xsuperior"]=739, + ["y"]=121, + ["yaadosquare"]=13134, + ["yabengali"]=2479, + ["yacute"]=253, + ["yadeva"]=2351, + ["yaekorean"]=12626, + ["yagujarati"]=2735, + ["yagurmukhi"]=2607, + ["yahiragana"]=12420, + ["yakatakana"]=12516, + ["yakatakanahalfwidth"]=65428, + ["yakorean"]=12625, + ["yamakkanthai"]=3662, + ["yasmallhiragana"]=12419, + ["yasmallkatakana"]=12515, + ["yasmallkatakanahalfwidth"]=65388, + ["yatcyrillic"]=1123, + ["ycircle"]=9448, + ["ycircumflex"]=375, + ["ydieresis"]=255, + ["ydotaccent"]=7823, + ["ydotbelow"]=7925, + ["yeharabic"]=1610, + ["yehbarreearabic"]=1746, + ["yehbarreefinalarabic"]=64431, + ["yehfinalarabic"]=65266, + ["yehhamzaabovearabic"]=1574, + ["yehhamzaabovefinalarabic"]=65162, + ["yehhamzaaboveinitialarabic"]=65163, + ["yehhamzaabovemedialarabic"]=65164, + ["yehinitialarabic"]=65267, + ["yehmedialarabic"]=65268, + ["yehmeeminitialarabic"]=64733, + ["yehmeemisolatedarabic"]=64600, + ["yehnoonfinalarabic"]=64660, + ["yehthreedotsbelowarabic"]=1745, + ["yekorean"]=12630, + ["yen"]=165, + ["yenmonospace"]=65509, + ["yeokorean"]=12629, + ["yeorinhieuhkorean"]=12678, + ["yerahbenyomolefthebrew"]=1450, + ["yericyrillic"]=1099, + ["yerudieresiscyrillic"]=1273, + ["yesieungkorean"]=12673, + ["yesieungpansioskorean"]=12675, + ["yesieungsioskorean"]=12674, + ["yetivhebrew"]=1434, + ["ygrave"]=7923, + ["yhook"]=436, + ["yhookabove"]=7927, + ["yiarmenian"]=1397, + ["yicyrillic"]=1111, + ["yikorean"]=12642, + ["yinyang"]=9775, + ["yiwnarmenian"]=1410, + ["ymonospace"]=65369, + ["yoddageshhebrew"]=64313, + ["yodhebrew"]=1497, + ["yodyodhebrew"]=1522, + ["yodyodpatahhebrew"]=64287, + ["yohiragana"]=12424, + ["yoikorean"]=12681, + ["yokatakana"]=12520, + ["yokatakanahalfwidth"]=65430, + ["yokorean"]=12635, + ["yosmallhiragana"]=12423, + ["yosmallkatakana"]=12519, + ["yosmallkatakanahalfwidth"]=65390, + ["yotgreek"]=1011, + ["yoyaekorean"]=12680, + ["yoyakorean"]=12679, + ["yoyakthai"]=3618, + ["yoyingthai"]=3597, + ["yparen"]=9396, + ["ypogegrammeni"]=890, + ["ypogegrammenigreekcmb"]=837, + ["yr"]=422, + ["yring"]=7833, + ["ysuperior"]=696, + ["ytilde"]=7929, + ["yturned"]=654, + ["yuhiragana"]=12422, + ["yuikorean"]=12684, + ["yukatakana"]=12518, + ["yukatakanahalfwidth"]=65429, + ["yukorean"]=12640, + ["yusbigcyrillic"]=1131, + ["yusbigiotifiedcyrillic"]=1133, + ["yuslittlecyrillic"]=1127, + ["yuslittleiotifiedcyrillic"]=1129, + ["yusmallhiragana"]=12421, + ["yusmallkatakana"]=12517, + ["yusmallkatakanahalfwidth"]=65389, + ["yuyekorean"]=12683, + ["yuyeokorean"]=12682, + ["yyabengali"]=2527, + ["yyadeva"]=2399, + ["z"]=122, + ["zaarmenian"]=1382, + ["zacute"]=378, + ["zadeva"]=2395, + ["zagurmukhi"]=2651, + ["zaharabic"]=1592, + ["zahfinalarabic"]=65222, + ["zahinitialarabic"]=65223, + ["zahiragana"]=12374, + ["zahmedialarabic"]=65224, + ["zainarabic"]=1586, + ["zainfinalarabic"]=65200, + ["zakatakana"]=12470, + ["zaqefgadolhebrew"]=1429, + ["zaqefqatanhebrew"]=1428, + ["zarqahebrew"]=1432, + ["zayindageshhebrew"]=64310, + ["zayinhebrew"]=1494, + ["zbopomofo"]=12567, + ["zcaron"]=382, + ["zcircle"]=9449, + ["zcircumflex"]=7825, + ["zcurl"]=657, + ["zdotaccent"]=380, + ["zdotbelow"]=7827, + ["zecyrillic"]=1079, + ["zedescendercyrillic"]=1177, + ["zedieresiscyrillic"]=1247, + ["zehiragana"]=12380, + ["zekatakana"]=12476, + ["zero"]=48, + ["zerobengali"]=2534, + ["zerodeva"]=2406, + ["zerogujarati"]=2790, + ["zerogurmukhi"]=2662, + ["zerohackarabic"]=1632, + ["zeroinferior"]=8320, + ["zeromonospace"]=65296, + ["zeropersian"]=1776, + ["zerosuperior"]=8304, + ["zerothai"]=3664, + ["zerowidthjoiner"]=65279, + ["zerowidthnonjoiner"]=8204, + ["zerowidthspace"]=8203, + ["zeta"]=950, + ["zhbopomofo"]=12563, + ["zhearmenian"]=1386, + ["zhebrevecyrillic"]=1218, + ["zhecyrillic"]=1078, + ["zhedescendercyrillic"]=1175, + ["zhedieresiscyrillic"]=1245, + ["zihiragana"]=12376, + ["zikatakana"]=12472, + ["zinorhebrew"]=1454, + ["zlinebelow"]=7829, + ["zmonospace"]=65370, + ["zohiragana"]=12382, + ["zokatakana"]=12478, + ["zparen"]=9397, + ["zretroflexhook"]=656, + ["zstroke"]=438, + ["zuhiragana"]=12378, + ["zukatakana"]=12474, + + -- extras + + ["Dcroat"]=272, + ["Delta"]=8710, + ["Euro"]=8364, + ["H18533"]=9679, + ["H18543"]=9642, + ["H18551"]=9643, + ["H22073"]=9633, + ["Ldot"]=319, + ["Oslashacute"]=510, + ["SF10000"]=9484, + ["SF20000"]=9492, + ["SF30000"]=9488, + ["SF40000"]=9496, + ["SF50000"]=9532, + ["SF60000"]=9516, + ["SF70000"]=9524, + ["SF80000"]=9500, + ["SF90000"]=9508, + ["Upsilon1"]=978, + ["afii10066"]=1073, + ["afii10067"]=1074, + ["afii10068"]=1075, + ["afii10069"]=1076, + ["afii10070"]=1077, + ["afii10071"]=1105, + ["afii10072"]=1078, + ["afii10073"]=1079, + ["afii10074"]=1080, + ["afii10075"]=1081, + ["afii10076"]=1082, + ["afii10077"]=1083, + ["afii10078"]=1084, + ["afii10079"]=1085, + ["afii10080"]=1086, + ["afii10081"]=1087, + ["afii10082"]=1088, + ["afii10083"]=1089, + ["afii10084"]=1090, + ["afii10085"]=1091, + ["afii10086"]=1092, + ["afii10087"]=1093, + ["afii10088"]=1094, + ["afii10089"]=1095, + ["afii10090"]=1096, + ["afii10091"]=1097, + ["afii10092"]=1098, + ["afii10093"]=1099, + ["afii10094"]=1100, + ["afii10095"]=1101, + ["afii10096"]=1102, + ["afii10097"]=1103, + ["afii10098"]=1169, + ["afii10099"]=1106, + ["afii10100"]=1107, + ["afii10101"]=1108, + ["afii10102"]=1109, + ["afii10103"]=1110, + ["afii10104"]=1111, + ["afii10105"]=1112, + ["afii10106"]=1113, + ["afii10107"]=1114, + ["afii10108"]=1115, + ["afii10109"]=1116, + ["afii10110"]=1118, + ["afii10193"]=1119, + ["afii10194"]=1123, + ["afii10195"]=1139, + ["afii10196"]=1141, + ["afii10846"]=1241, + ["afii208"]=8213, + ["afii57381"]=1642, + ["afii57388"]=1548, + ["afii57392"]=1632, + ["afii57393"]=1633, + ["afii57394"]=1634, + ["afii57395"]=1635, + ["afii57396"]=1636, + ["afii57397"]=1637, + ["afii57398"]=1638, + ["afii57399"]=1639, + ["afii57400"]=1640, + ["afii57401"]=1641, + ["afii57403"]=1563, + ["afii57407"]=1567, + ["afii57409"]=1569, + ["afii57410"]=1570, + ["afii57411"]=1571, + ["afii57412"]=1572, + ["afii57413"]=1573, + ["afii57414"]=1574, + ["afii57415"]=1575, + ["afii57416"]=1576, + ["afii57417"]=1577, + ["afii57418"]=1578, + ["afii57419"]=1579, + ["afii57420"]=1580, + ["afii57421"]=1581, + ["afii57422"]=1582, + ["afii57423"]=1583, + ["afii57424"]=1584, + ["afii57425"]=1585, + ["afii57426"]=1586, + ["afii57427"]=1587, + ["afii57428"]=1588, + ["afii57429"]=1589, + ["afii57430"]=1590, + ["afii57431"]=1591, + ["afii57432"]=1592, + ["afii57433"]=1593, + ["afii57434"]=1594, + ["afii57440"]=1600, + ["afii57441"]=1601, + ["afii57442"]=1602, + ["afii57443"]=1603, + ["afii57444"]=1604, + ["afii57445"]=1605, + ["afii57446"]=1606, + ["afii57448"]=1608, + ["afii57449"]=1609, + ["afii57450"]=1610, + ["afii57451"]=1611, + ["afii57452"]=1612, + ["afii57453"]=1613, + ["afii57454"]=1614, + ["afii57455"]=1615, + ["afii57456"]=1616, + ["afii57457"]=1617, + ["afii57458"]=1618, + ["afii57470"]=1607, + ["afii57505"]=1700, + ["afii57506"]=1662, + ["afii57507"]=1670, + ["afii57508"]=1688, + ["afii57509"]=1711, + ["afii57511"]=1657, + ["afii57512"]=1672, + ["afii57513"]=1681, + ["afii57514"]=1722, + ["afii57519"]=1746, + ["afii57636"]=8362, + ["afii57645"]=1470, + ["afii57658"]=1475, + ["afii57664"]=1488, + ["afii57665"]=1489, + ["afii57666"]=1490, + ["afii57667"]=1491, + ["afii57668"]=1492, + ["afii57669"]=1493, + ["afii57670"]=1494, + ["afii57671"]=1495, + ["afii57672"]=1496, + ["afii57673"]=1497, + ["afii57674"]=1498, + ["afii57675"]=1499, + ["afii57676"]=1500, + ["afii57677"]=1501, + ["afii57678"]=1502, + ["afii57679"]=1503, + ["afii57680"]=1504, + ["afii57681"]=1505, + ["afii57682"]=1506, + ["afii57683"]=1507, + ["afii57684"]=1508, + ["afii57685"]=1509, + ["afii57686"]=1510, + ["afii57687"]=1511, + ["afii57688"]=1512, + ["afii57689"]=1513, + ["afii57690"]=1514, + ["afii57716"]=1520, + ["afii57717"]=1521, + ["afii57718"]=1522, + ["afii57793"]=1460, + ["afii57794"]=1461, + ["afii57795"]=1462, + ["afii57796"]=1467, + ["afii57797"]=1464, + ["afii57798"]=1463, + ["afii57799"]=1456, + ["afii57800"]=1458, + ["afii57801"]=1457, + ["afii57802"]=1459, + ["afii57803"]=1474, + ["afii57804"]=1473, + ["afii57806"]=1465, + ["afii57807"]=1468, + ["afii57839"]=1469, + ["afii57841"]=1471, + ["afii57842"]=1472, + ["afii57929"]=700, + ["afii61248"]=8453, + ["afii61289"]=8467, + ["afii61352"]=8470, + ["afii61664"]=8204, + ["afii63167"]=1645, + ["afii64937"]=701, + ["arrowdblboth"]=8660, + ["arrowdblleft"]=8656, + ["arrowdblright"]=8658, + ["arrowupdnbse"]=8616, + ["bar"]=124, + ["circle"]=9675, + ["circlemultiply"]=8855, + ["circleplus"]=8853, + ["club"]=9827, + ["colonmonetary"]=8353, + ["dcroat"]=273, + ["dkshade"]=9619, + ["existential"]=8707, + ["female"]=9792, + ["gradient"]=8711, + ["heart"]=9829, + ["hookabovecomb"]=777, + ["invcircle"]=9689, + ["ldot"]=320, + ["longs"]=383, + ["ltshade"]=9617, + ["male"]=9794, + ["mu"]=181, + ["napostrophe"]=329, + ["notelement"]=8713, + ["omega1"]=982, + ["openbullet"]=9702, + ["orthogonal"]=8735, + ["oslashacute"]=511, + ["phi1"]=981, + ["propersubset"]=8834, + ["propersuperset"]=8835, + ["reflexsubset"]=8838, + ["reflexsuperset"]=8839, + ["shade"]=9618, + ["sigma1"]=962, + ["similar"]=8764, + ["smileface"]=9786, + ["spacehackarabic"]=32, + ["spade"]=9824, + ["theta1"]=977, + ["twodotenleader"]=8229, +} diff --git a/tex/context/base/font-agl.lua b/tex/context/base/font-agl.lua index 6ce0daa34..45aae9507 100644 --- a/tex/context/base/font-agl.lua +++ b/tex/context/base/font-agl.lua @@ -3,7 +3,7 @@ if not modules then modules = { } end modules ['font-map'] = { comment = "companion to font-ini.mkiv", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright = "derived from http://www.adobe.com/devnet/opentype/archives/glyphlist.txt", - comment = "Adobe Glyph List, version 2.0, September 20, 2002", + original = "Adobe Glyph List, version 2.0, September 20, 2002", } local allocate = utilities.storage.allocate @@ -15,7 +15,7 @@ local unicodes = allocate { -- filled from char-def.lua } -local extras = allocate { +local extras = allocate { -- private extensions Dcroat = 0x0110, Delta = 0x2206, Euro = 0x20AC, @@ -274,6 +274,8 @@ end -- We load this table only when needed. We coul duse a loading mechanism -- return the table but there are no more vectors like this so why bother. +fonts.enc = fonts.enc or { } + fonts.enc.agl = { names = names, -- unicode -> name unicodes = unicodes, -- name -> unicode diff --git a/tex/context/base/font-def.lua b/tex/context/base/font-def.lua index 61132e661..3a09b6664 100644 --- a/tex/context/base/font-def.lua +++ b/tex/context/base/font-def.lua @@ -372,7 +372,12 @@ function tfm.read(specification) local postprocessors = tfmtable.postprocessors if postprocessors then for i=1,#postprocessors do - postprocessors[i](tfmtable) -- after scaling etc + local extrahash = postprocessors[i](tfmtable) -- after scaling etc + if type(extrahash) == "string" and extrahash ~= "" then + -- e.g. a reencoding needs this + extrahash = gsub(lower(extrahash),"[^a-z]","-") + tfmtable.fullname = format("%s-%s",tfmtable.fullname,extrahash) + end end end -- diff --git a/tex/context/base/font-dum.lua b/tex/context/base/font-dum.lua index 1d7612035..54b631d55 100644 --- a/tex/context/base/font-dum.lua +++ b/tex/context/base/font-dum.lua @@ -310,3 +310,45 @@ fonts.strippables = table.tohash { 0xE0077, 0xE0078, 0xE0079, 0xE007A, 0xE007B, 0xE007C, 0xE007D, 0xE007E, 0xE007F, } +-- \font\test=file:somefont:reencode=mymessup +-- +-- fonts.enc.reencodings.mymessup = { +-- [109] = 110, -- m +-- [110] = 109, -- n +-- } + +fonts.enc = fonts.enc or {} +local reencodings = { } +fonts.enc.reencodings = reencodings + +local function specialreencode(tfmdata,value) + -- we forget about kerns as we assume symbols and we + -- could issue a message if ther are kerns but it's + -- a hack anyway so we odn't care too much here + local encoding = value and reencodings[value] + if encoding then + local temp = { } + local char = tfmdata.characters + for k, v in next, encoding do + temp[k] = char[v] + end + for k, v in next, temp do + char[k] = temp[k] + end + -- if we use the font otherwise luatex gets confused so + -- we return an additional hash component for fullname + return string.format("reencoded:%s",value) + end +end + +local function reencode(tfmdata,value) + tfmdata.postprocessors = tfmdata.postprocessors or { } + table.insert(tfmdata.postprocessors, + function(tfmdata) + return specialreencode(tfmdata,value) + end + ) +end + +table.insert(fonts.manipulators,"reencode") +fonts.initializers.base.otf.reencode = reencode diff --git a/tex/context/base/font-enh.lua b/tex/context/base/font-enh.lua index 77c145c4b..34cdd9264 100644 --- a/tex/context/base/font-enh.lua +++ b/tex/context/base/font-enh.lua @@ -188,7 +188,7 @@ function tfm.remap(tfmdata,remapping) end end tfmdata.encodingbytes = 2 - tfmdata.format = 'type1' + tfmdata.format = tfmdata.format or 'type1' end end diff --git a/tex/context/base/font-ext.lua b/tex/context/base/font-ext.lua index eb1e9f447..16a0008cc 100644 --- a/tex/context/base/font-ext.lua +++ b/tex/context/base/font-ext.lua @@ -49,19 +49,21 @@ local otf = fonts.otf <p>This feature will remove inter-digit kerns.</p> --ldx]]-- -table.insert(triggers,"equaldigits") - -function initializers.common.equaldigits(tfmdata,value) - if value then - local chr = tfmdata.characters - for i = utfbyte('0'), utfbyte('9') do - local c = chr[i] - if c then - c.kerns = nil - end - end - end -end +-- old code, no kerns set at this point, so this has to be done afterwards +-- +-- table.insert(triggers,"equaldigits") +-- +-- function initializers.common.equaldigits(tfmdata,value) +-- if value then +-- local chr = tfmdata.characters +-- for i = utfbyte('0'), utfbyte('9') do +-- local c = chr[i] +-- if c then +-- c.kerns = nil +-- end +-- end +-- end +-- end --[[ldx-- <p>This feature will give all glyphs an equal height and/or depth. Valid @@ -69,42 +71,44 @@ values are <type>none</type>, <type>height</type>, <type>depth</type> and <type>both</type>.</p> --ldx]]-- -table.insert(triggers,"lineheight") - -function initializers.common.lineheight(tfmdata,value) - if value and type(value) == "string" then - if value == "none" then - for _,v in next, tfmdata.characters do - v.height, v.depth = 0, 0 - end - else - local ascender, descender = tfmdata.ascender, tfmdata.descender - if ascender and descender then - local ht, dp = ascender or 0, descender or 0 - if value == "height" then - dp = 0 - elseif value == "depth" then - ht = 0 - end - if ht > 0 then - if dp > 0 then - for _,v in next, tfmdata.characters do - v.height, v.depth = ht, dp - end - else - for _,v in next, tfmdata.characters do - v.height = ht - end - end - elseif dp > 0 then - for _,v in next, tfmdata.characters do - v.depth = dp - end - end - end - end - end -end +-- old code, no dimensions set at this point, so this has to be done afterwards +-- +-- table.insert(triggers,"lineheight") +-- +-- function initializers.common.lineheight(tfmdata,value) +-- if value and type(value) == "string" then +-- if value == "none" then +-- for _,v in next, tfmdata.characters do +-- v.height, v.depth = 0, 0 +-- end +-- else +-- local ascender, descender = tfmdata.ascender, tfmdata.descender +-- if ascender and descender then +-- local ht, dp = ascender or 0, descender or 0 +-- if value == "height" then +-- dp = 0 +-- elseif value == "depth" then +-- ht = 0 +-- end +-- if ht > 0 then +-- if dp > 0 then +-- for _,v in next, tfmdata.characters do +-- v.height, v.depth = ht, dp +-- end +-- else +-- for _,v in next, tfmdata.characters do +-- v.height = ht +-- end +-- end +-- elseif dp > 0 then +-- for _,v in next, tfmdata.characters do +-- v.depth = dp +-- end +-- end +-- end +-- end +-- end +-- end -- -- -- -- -- -- -- shared diff --git a/tex/context/base/font-ini.lua b/tex/context/base/font-ini.lua index 3eee559a0..df534c6ad 100644 --- a/tex/context/base/font-ini.lua +++ b/tex/context/base/font-ini.lua @@ -6,6 +6,9 @@ if not modules then modules = { } end modules ['font-ini'] = { license = "see context related readme files" } +-- The font code will be upgraded and reorganized so that we have a +-- leaner generic code base and can do more tuning for context. + --[[ldx-- <p>Not much is happening here.</p> --ldx]]-- diff --git a/tex/context/base/font-ini.mkiv b/tex/context/base/font-ini.mkiv index a4e406d47..781f79ad4 100644 --- a/tex/context/base/font-ini.mkiv +++ b/tex/context/base/font-ini.mkiv @@ -2085,13 +2085,23 @@ %D sequence of a session. After the loading job is done, the %D macro relaxes itself and reset the signal. -\fontdimen1\nullfont 0\scaledpoint -\fontdimen2\nullfont 256377\scaledpoint -\fontdimen3\nullfont 128188\scaledpoint -\fontdimen4\nullfont 85459\scaledpoint -\fontdimen5\nullfont 338952\scaledpoint -\fontdimen6\nullfont 786432\scaledpoint -\fontdimen7\nullfont 85459\scaledpoint +% \fontdimen1\nullfont 0\scaledpoint +% \fontdimen2\nullfont 256377\scaledpoint +% \fontdimen3\nullfont 128188\scaledpoint +% \fontdimen4\nullfont 85459\scaledpoint +% \fontdimen5\nullfont 338952\scaledpoint +% \fontdimen6\nullfont 786432\scaledpoint +% \fontdimen7\nullfont 85459\scaledpoint + +\fontslantperpoint \nullfont 0\scaledpoint +\fontinterwordspace \nullfont 256377\scaledpoint +\fontinterwordstretch\nullfont 128188\scaledpoint +\fontinterwordshrink \nullfont 85459\scaledpoint +\fontexheight \nullfont 338952\scaledpoint +\fontemwidth \nullfont 786432\scaledpoint +\fontextraspace \nullfont 85459\scaledpoint + +\fetchruntimecommand \showfontparameters {\f!fontprefix\s!run} \def\resetnullfont % this is needed because some macro packages (tikz) misuse \nullfont {\dorecurse7{\fontdimen\recurselevel\nullfont\zeropoint}% diff --git a/tex/context/base/font-otf.lua b/tex/context/base/font-otf.lua index 0cffc5348..c974d89c8 100644 --- a/tex/context/base/font-otf.lua +++ b/tex/context/base/font-otf.lua @@ -38,42 +38,47 @@ local starttiming, stoptiming, elapsedtime = statistics.starttiming, statistics. local findbinfile = resolvers.findbinfile -local fonts = fonts +local fonts = fonts -fonts.otf = fonts.otf or { } -local otf = fonts.otf -local tfm = fonts.tfm +fonts.otf = fonts.otf or { } +local otf = fonts.otf +local tfm = fonts.tfm -local fontdata = fonts.identifiers -local chardata = characters and characters.data -- not used +local fontdata = fonts.identifiers +local chardata = characters and characters.data -- not used -otf.features = otf.features or { } -otf.features.list = otf.features.list or { } -otf.features.default = otf.features.default or { } +-- todo: probably first time so local first -otf.enhancers = allocate() -local enhancers = otf.enhancers -enhancers.patches = { } -local patches = enhancers.patches +otf.features = otf.features or { } +local features = otf.features +features.list = features.list or { } +local featurelist = features.list +features.default = features.default or { } +local defaultfeatures = features.default -local definers = fonts.definers -local readers = fonts.tfm.readers +otf.enhancers = allocate() +local enhancers = otf.enhancers +enhancers.patches = { } +local patches = enhancers.patches -otf.glists = { "gsub", "gpos" } +local definers = fonts.definers +local readers = fonts.tfm.readers -otf.version = 2.710 -- beware: also sync font-mis.lua -otf.cache = containers.define("fonts", "otf", otf.version, true) +otf.glists = { "gsub", "gpos" } -local loadmethod = "table" -- table, mixed, sparse -local forceload = false -local cleanup = 0 -local usemetatables = false -- .4 slower on mk but 30 M less mem so we might change the default -- will be directive -local packdata = true -local syncspace = true -local forcenotdef = false +otf.version = 2.710 -- beware: also sync font-mis.lua +otf.cache = containers.define("fonts", "otf", otf.version, true) -local wildcard = "*" -local default = "dflt" +local loadmethod = "table" -- table, mixed, sparse +local forceload = false +local cleanup = 0 +local usemetatables = false -- .4 slower on mk but 30 M less mem so we might change the default -- will be directive +local packdata = true +local syncspace = true +local forcenotdef = false + +local wildcard = "*" +local default = "dflt" local fontloaderfields = fontloader.fields local mainfields = nil @@ -1534,9 +1539,12 @@ end -- -- -- -- -- -- -- -- -- -- -- -- -function otf.features.register(name,default) - otf.features.list[#otf.features.list+1] = name - otf.features.default[name] = default +function features.register(name,default,description) + featurelist[#featurelist+1] = name + defaultfeatures[name] = default + if description and description ~= "" then + fonts.otf.tables.features[name] = description + end end -- for context this will become a task handler @@ -1629,6 +1637,8 @@ local function copytotfm(data,cache_id) -- we can save a copy when we reorder th end local spaceunits, spacer = 500, "space" -- indices maps from unicodes to indices + -- this wil stay as we can manipulate indices + -- beforehand for u, i in next, indices do characters[u] = { } -- we need this because for instance we add protruding info and loop over characters descriptions[u] = glyphs[i] @@ -1684,10 +1694,10 @@ local function copytotfm(data,cache_id) -- we can save a copy when we reorder th end end -- end math - local endash, emdash, space = 0x20, 0x2014, "space" -- unicodes['space'], unicodes['emdash'] + local space, emdash = 0x20, 0x2014 -- unicodes['space'], unicodes['emdash'] if metadata.isfixedpitch then - if descriptions[endash] then - spaceunits, spacer = descriptions[endash].width, "space" + if descriptions[space] then + spaceunits, spacer = descriptions[space].width, "space" end if not spaceunits and descriptions[emdash] then spaceunits, spacer = descriptions[emdash].width, "emdash" @@ -1696,8 +1706,8 @@ local function copytotfm(data,cache_id) -- we can save a copy when we reorder th spaceunits, spacer = metadata.charwidth, "charwidth" end else - if descriptions[endash] then - spaceunits, spacer = descriptions[endash].width, "space" + if descriptions[space] then + spaceunits, spacer = descriptions[space].width, "space" end if not spaceunits and descriptions[emdash] then spaceunits, spacer = descriptions[emdash].width/2, "emdash/2" @@ -1765,7 +1775,6 @@ local function copytotfm(data,cache_id) -- we can save a copy when we reorder th boundarychar_label = 0, boundarychar = 65536, designsize = (designsize/10)*65536, - spacer = "500 units", encodingbytes = 2, mode = mode, filename = filename, @@ -1824,7 +1833,8 @@ local function otftotfm(specification) tfmdata.has_italic = otfdata.metadata.has_italic if not tfmdata.language then tfmdata.language = 'dflt' end if not tfmdata.script then tfmdata.script = 'dflt' end - shared.processes, shared.features = otf.setfeatures(tfmdata,definers.check(features,otf.features.default)) + -- at this moment no characters are assinged yet, only empty slots + shared.processes, shared.features = otf.setfeatures(tfmdata,definers.check(features,defaultfeatures)) end end containers.write(tfm.cache,cache_id,tfmdata) @@ -1832,7 +1842,7 @@ local function otftotfm(specification) return tfmdata end -otf.features.register('mathsize') +features.register('mathsize') local function read_from_otf(specification) -- wrong namespace local tfmtable = otftotfm(specification) diff --git a/tex/context/base/font-run.mkiv b/tex/context/base/font-run.mkiv index aaa714c3d..7a6764ac8 100644 --- a/tex/context/base/font-run.mkiv +++ b/tex/context/base/font-run.mkiv @@ -357,4 +357,15 @@ {(\withoutpt\the\nextboxht,\withoutpt\the\nextboxdp)}% \hbox} +\gdef\showfontparameters + {\starttabulate[|tl|l|] + \NC slantperpoint \NC \the\fontslantperpoint \font \NC\NR + \NC interwordspace \NC \the\fontinterwordspace \font \NC\NR + \NC interwordstretch\NC \the\fontinterwordstretch\font \NC\NR + \NC interwordshrink \NC \the\fontinterwordshrink \font \NC\NR + \NC exheight \NC \the\fontexheight \font \NC\NR + \NC emwidth \NC \the\fontemwidth \font \NC\NR + \NC extraspace \NC \the\fontextraspace \font \NC\NR + \stoptabulate} + \protect \endinput diff --git a/tex/context/base/l-table.lua b/tex/context/base/l-table.lua index e335944cd..0189c887c 100644 --- a/tex/context/base/l-table.lua +++ b/tex/context/base/l-table.lua @@ -621,7 +621,8 @@ local function serialize(root,name,_handle,_reduce,_noquotes,_hexify) if root then -- The dummy access will initialize a table that has a delayed initialization -- using a metatable. - local dummy = root.whatever + local dummy = root._w_h_a_t_e_v_e_r_ + root._w_h_a_t_e_v_e_r_ = nil -- Let's forget about empty tables. if next(root) then do_serialize(root,name,"",0) diff --git a/tex/context/base/lpdf-wid.lua b/tex/context/base/lpdf-wid.lua index 684fa8025..d0e441c26 100644 --- a/tex/context/base/lpdf-wid.lua +++ b/tex/context/base/lpdf-wid.lua @@ -160,17 +160,24 @@ end -- -local nofattachments, attachments, filestreams = 0, { }, { } +local nofattachments, attachments, filestreams, referenced = 0, { }, { }, { } -- todo: hash and embed once +local ignorereferenced = true -- fuzzy pdf spec .. twice in attachment list, can become an option + local function flushembeddedfiles() if next(filestreams) then local e = pdfarray() for name, reference in next, filestreams do if reference then - e[#e+1] = pdfstring(name) - e[#e+1] = reference -- already a reference + if ignorereferenced and referenced[name] then + reference = nil + end + if reference then + e[#e+1] = pdfstring(name) + e[#e+1] = reference -- already a reference + end else -- we can issue a message end @@ -218,6 +225,7 @@ function codeinjections.attachfile(specification) -- todo: message return end + referenced[filename] = true nofattachments = nofattachments + 1 local label = attachment.label or "" local title = attachment.title or "" diff --git a/tex/context/base/luat-run.lua b/tex/context/base/luat-run.lua index 65ac641c9..51856640d 100644 --- a/tex/context/base/luat-run.lua +++ b/tex/context/base/luat-run.lua @@ -102,8 +102,10 @@ callbacks.register("pre_dump", pre_dump_actions, "lua related fi local tempfiles = { } -function luatex.registertempfile(name) - name = name .. ".mkiv-tmp" -- maybe just .tmp +function luatex.registertempfile(name,extrasuffix) + if extrasuffix then + name = name .. ".mkiv-tmp" -- maybe just .tmp + end if trace_temp_files and not tempfiles[name] then report_tempfiles("registering temporary file: %s",name) end diff --git a/tex/context/base/lxml-lpt.lua b/tex/context/base/lxml-lpt.lua index 0f65a741d..f25d13eed 100644 --- a/tex/context/base/lxml-lpt.lua +++ b/tex/context/base/lxml-lpt.lua @@ -7,6 +7,7 @@ if not modules then modules = { } end modules ['lxml-pth'] = { } -- e.ni is only valid after a filter run +-- todo: B/C/[get first match] local concat, remove, insert = table.concat, table.remove, table.insert local type, next, tonumber, tostring, setmetatable, loadstring = type, next, tonumber, tostring, setmetatable, loadstring diff --git a/tex/context/base/m-graph.mkiv b/tex/context/base/m-graph.mkiv index 9b28b6fd9..e8aeb2375 100644 --- a/tex/context/base/m-graph.mkiv +++ b/tex/context/base/m-graph.mkiv @@ -40,40 +40,40 @@ % We could also delegate parsing using lower level plugins. \startMPinclusions -% input string ; -% input marith ; -% input graph.mp ; - -% vardef roundd(expr x, d) = -% if abs d > 4 : -% if d > 0 : -% x -% else : -% 0 -% fi -% elseif d > 0 : -% save i ; i = floor x ; -% i + round(Ten_to[d]*(x-i))/Ten_to[d] -% else : -% round(x/Ten_to[-d])*Ten_to[-d] -% fi -% enddef ; - -% Ten_to0 = 1 ; -% Ten_to1 = 10 ; -% Ten_to2 = 100 ; -% Ten_to3 = 1000 ; -% Ten_to4 = 10000 ; -% -% def sFe_base = -% enddef ; -% -% picture Fe_plus ; Fe_plus := btex + etex ; - -% vardef format (expr f,x) = dofmt_.Feform_(f,x) enddef ; -% vardef Mformat (expr f,x) = dofmt_.Meform (f,x) enddef ; -% vardef formatstr (expr f,x) = dofmt_.Feform_(f,x) enddef ; -% vardef Mformatstr(expr f,x) = dofmt_.Meform(f,x) enddef ; + % input string ; + % input marith ; + input graph.mp ; + + vardef roundd(expr x, d) = + if abs d > 4 : + if d > 0 : + x + else : + 0 + fi + elseif d > 0 : + save i ; i = floor x ; + i + round(Ten_to[d]*(x-i))/Ten_to[d] + else : + round(x/Ten_to[-d])*Ten_to[-d] + fi + enddef ; + + Ten_to0 = 1 ; + Ten_to1 = 10 ; + Ten_to2 = 100 ; + Ten_to3 = 1000 ; + Ten_to4 = 10000 ; + + def sFe_base = + enddef ; + + picture Fe_plus ; Fe_plus := btex + etex ; + + vardef format (expr f,x) = dofmt_.Feform_(f,x) enddef ; + vardef Mformat (expr f,x) = dofmt_.Meform (f,x) enddef ; + vardef formatstr (expr f,x) = dofmt_.Feform_(f,x) enddef ; + vardef Mformatstr(expr f,x) = dofmt_.Meform(f,x) enddef ; vardef escaped_format(expr s) = "" for n=1 upto length(s) : & @@ -86,7 +86,7 @@ enddef ; vardef dofmt_@\#(expr f, x) = - textext("\MPgraphformat{"&escaped_format(f)&"}{"&(if string x : x else: decimal x fi)&"}") + textext("\MPgraphformat{" & escaped_format(f) & "}{" & (if string x : x else: decimal x fi) & "}") enddef ; % vardef format(expr f, x) = diff --git a/tex/context/base/m-spreadsheet.mkiv b/tex/context/base/m-spreadsheet.mkiv new file mode 100644 index 000000000..49f59ded9 --- /dev/null +++ b/tex/context/base/m-spreadsheet.mkiv @@ -0,0 +1,265 @@ +%D \module +%D [ file=m-spreadsheet, +%D version=2011.02.21, +%D title=\CONTEXT\ Extra Modules, +%D subtitle=Spreadsheets, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright=PRAGMA] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D This is an experimental follow up on discussion on the mailing list. + +\startluacode +local byte, format = string.byte, string.format +local R, P, C, Cs, Cc, Carg, lpegmatch = lpeg.R, lpeg.P, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.Carg, lpeg.match + +local spreadsheets = { } +moduledata.spreadsheets = spreadsheets + +local data = { } +spreadsheets.data = data + +local stack, current = { }, "default" + +local mt ; mt = { + __index = function(t,k) + local v = { } + setmetatable(v,mt) + t[k] = v + return v + end, +} + +function spreadsheets.reset(name) + if not name or name == "" then name = "default" end + local d = { } + setmetatable(d,mt) + data[name] = d +end + +function spreadsheets.start(name) + if not name or name == "" then name = "default" end + table.insert(stack,current) + current = name + if not data[current] then + local d = { } + setmetatable(d,mt) + data[current] = d + end +end + +function spreadsheets.stop() + current = table.remove(stack) +end + +spreadsheets.reset() + +local offset = byte("A") - 1 + +local function assign(s,n) + return format("moduledata.spreadsheets.data['%s'][%s]",n,byte(s)-offset) +end + +-------- datacell(name,a,b,...) +function datacell(a,b,...) + local n = 0 + if b then + local t = { a, b, ... } + for i=1,#t do + n = n * (i-1) * 26 + byte(t[i]) - offset + end + else + n = byte(a) - offset + end + -- return format("dat['%s'][%s]",name,n) + return format("dat[%s]",n) +end + +----- cell = (Carg(1) * C(R("AZ"))^1) / datacell * (Cc("[") * (R("09")^1) * Cc("]") + #P(1)) +local cell = C(R("AZ"))^1 / datacell * (Cc("[") * (R("09")^1) * Cc("]") + #P(1)) +local pattern = Cs(Cc("return ") * (cell + P(1))^0) + +local functions = { } +spreadsheets.functions = functions + +function functions.sum(c,f,t) + if f and t then + local r = 0 + for i=f,t do + r = r + c[i] + end + return r + else + return 0 + end +end + +function functions.fmt(pattern,n) + return format("%"..pattern,n) +end + +local template = [[ + local spr = moduledata.spreadsheets.functions + local dat = moduledata.spreadsheets.data['%s'] + local sum = spr.sum + local fmt = spr.fmt + %s +]] + +local function execute(name,r,c,str) + if name == "" then name = current if name == "" then name = "default" end end + str = lpegmatch(pattern,str,1,name) + str = format(template,name,str) + -- print(str) + local result = loadstring(str) + result = result and result() or 0 + data[name][c][r] = result + return result +end + +function spreadsheets.set(name,r,c,str) + if name == "" then name = current if name == "" then name = "default" end end + execute(name,r,c,str) +end + +function spreadsheets.get(name,r,c,str) + if name == "" then name = current if name == "" then name = "default" end end + if not str or str == "" then + context(data[name][c][r] or 0) + else + local result = execute(name,r,c,str) + if result then + if type(result) == "number" then + data[name][c][r] = result + end + context(result) + end + end +end + +function spreadsheets.doifelsecell(name,r,c) + if name == "" then name = current if name == "" then name = "default" end end + local d = data[name] + commands.testcase(d and d[c][r]) +end + +function spreadsheets.show(name) + if name == "" then name = current if name == "" then name = "default" end end + table.print(data[name],name) +end +\stopluacode + +\unprotect + +% todo: get(...) set(..) ctx(...) + +\unexpanded\def\resetspreadsheet {\dosingleempty\doresetspreadsheet} +\unexpanded\def\doresetspreadsheet [#1]{\ctxlua{moduledata.spreadsheets.reset("#1")}} +\unexpanded\def\startspreadsheet {\dosingleempty\dostartspreadsheet} +\unexpanded\def\dostartspreadsheet [#1]{\ctxlua{moduledata.spreadsheets.start("#1")}} +\unexpanded\def\stopspreadsheet {\ctxlua{moduledata.spreadsheets.stop()}} +\unexpanded\def\showspreadsheet {\dosingleempty\doshowspreadsheet} +\unexpanded\def\doshowspreadsheet [#1]{\ctxlua{moduledata.spreadsheets.show("#1")}} +\unexpanded\def\getspreadsheet {\dosingleempty\dogetspreadsheet} +\unexpanded\def\dosetspreadsheet [#1]#2#3#4{\ctxlua{moduledata.spreadsheets.set ("#1",\number#2,\number#3,"#4")}} +\unexpanded\def\setspreadsheet {\dosingleempty\dosetspreadsheet} +\unexpanded\def\dogetspreadsheet [#1]#2#3#4{\ctxlua{moduledata.spreadsheets.get ("#1",\number#2,\number#3,"#4")}} +\unexpanded\def\doifelsespreadsheetcell {\dosingleempty\dodoifelsespreadsheetcell} +\unexpanded\def\dodoifelsespreadsheetcell[#1]#2#3{\ctxlua{moduledata.spreadsheets.doifelsecell("#1","#2","#3")}} + +\def\TABLEsetspreadsheet#1{\ctxlua{moduledata.spreadsheets.set("",\number\tblrow+1,\number\tblcol,\!!bs#1\!!es)}} +\def\TABLEgetspreadsheet#1{\ctxlua{moduledata.spreadsheets.get("",\number\tblrow+1,\number\tblcol,\!!bs#1\!!es)}} + +\appendtoks + \resetspreadsheet + \let\setspr\TABLEsetspreadsheet + \let\getspr\TABLEgetspreadsheet +\to \everyTABLEpass + +\unexpanded\def\startspreadsheettable % quick and dirty + {\dosingleempty\dostartspreadsheettable} + +\unexpanded\def\dostartspreadsheettable[#1]% + {\bgroup + \startspreadsheet[#1]%% + \def\startrow{\bTR}% + \def\stoprow {\eTR}% + \def\startcell##1\stopcell{\bTD\getspr{##1}\eTD}% + \bTABLE[\c!align=flushright]} + +\unexpanded\def\stopspreadsheettable + {\eTABLE + \stopspreadsheet + \egroup} + +\protect + +\doifnotmode{demo}{\endinput} + +\starttext + +\bTABLE[align=middle] + \bTR + \bTD \getspr{100} \eTD \bTD test \setspr{30} \eTD + \eTR + \bTR + \bTD \getspr{20} \eTD \bTD \getspr{4+3} \eTD + \eTR + \bTR + \bTD \getspr{A[1] + A[2]} \eTD + \bTD \getspr{B1 + B2} \eTD + \eTR + \bTR + \bTD[nx=2] \bf \getspr{(A[3] + B[3]) /100} \eTD + \eTR + \bTR + \bTD[nx=2] \bf \getspr{string.format("\letterpercent0.3f",(A[3] + B[3]) /100)} \eTD + \eTR + \bTR + \bTD[nx=2] \bf \getspr{fmt("0.3f",(sum(A,1,2)) / 10)} \eTD + \eTR +\eTABLE + +\startspreadsheet[mysheet] + +\bTABLE[align=middle] + \bTR + \bTD \getspr{100} \eTD \bTD test \setspr{30} \eTD + \eTR + \bTR + \bTD \getspr{20} \eTD \bTD \getspr{4+3} \eTD + \eTR + \bTR + \bTD \getspr{A[1] + A[2]} \eTD + \bTD \getspr{B[1] + B[2]} \eTD + \eTR + \bTR + \bTD[nx=2] \bf \getspr{A[3] + B[3]} \eTD + \eTR +\eTABLE + +\stopspreadsheet + +\startspreadsheettable + \startrow + \startcell 3 \stopcell + \startcell 9 \stopcell + \startcell A[1] + B[1] \stopcell + \stoprow +\stopspreadsheettable + +bla bla \getspreadsheet[mysheet]{2}{2}{} + +bla bla \getspreadsheet[mysheet]{4}{1}{} + +% \showspreadsheet +% \showspreadsheet[mysheet] + +\doifelsespreadsheetcell[mysheet]{1}{2}{YES}{NOP} +\doifelsespreadsheetcell[myshoot]{1}{2}{YES}{NOP} + +\stoptext diff --git a/tex/context/base/mlib-run.lua b/tex/context/base/mlib-run.lua index e35d92b28..72c16775d 100644 --- a/tex/context/base/mlib-run.lua +++ b/tex/context/base/mlib-run.lua @@ -73,7 +73,7 @@ local function finder(name, mode, ftype) -- we use the finder to intercept btex/ if not (find(name,"/metapost/context/base/") or find(name,"/metapost/context/") or find(name,"/metapost/base/")) then local data, found, forced = metapost.checktexts(io.loaddata(name) or "") if found then - local temp = luatex.registertempfile(name) + local temp = luatex.registertempfile(name,true) io.savedata(temp,data) name = temp end diff --git a/tex/context/base/mult-de.mkii b/tex/context/base/mult-de.mkii index ffdc666e7..494df52bd 100644 --- a/tex/context/base/mult-de.mkii +++ b/tex/context/base/mult-de.mkii @@ -272,7 +272,6 @@ \setinterfacevariable{marginedge}{marginalkante} \setinterfacevariable{margintitle}{marginaltitel} \setinterfacevariable{marking}{beschriftung} -\setinterfacevariable{mask}{mask} \setinterfacevariable{mathalignment}{mathalignment} \setinterfacevariable{mathcases}{mathcases} \setinterfacevariable{mathmatrix}{mathmatrix} @@ -758,6 +757,7 @@ \setinterfaceconstant{margintext}{marginaltext} \setinterfaceconstant{marking}{beschriftung} \setinterfaceconstant{marstyle}{beschrstil} +\setinterfaceconstant{mask}{mask} \setinterfaceconstant{max}{max} \setinterfaceconstant{maxdepth}{maxdepth} \setinterfaceconstant{maxheight}{maxhoehe} diff --git a/tex/context/base/mult-def.lua b/tex/context/base/mult-def.lua index 886138386..a119c00c0 100644 --- a/tex/context/base/mult-def.lua +++ b/tex/context/base/mult-def.lua @@ -7493,6 +7493,10 @@ return { ["pe"]="نمایش", ["ro"]="display", }, + ["mask"]={ + ["en"]="mask", + ["nl"]="masker", + }, ["distance"]={ ["cs"]="vzdalenost", ["de"]="abstand", @@ -12601,10 +12605,6 @@ return { ["pe"]="نمایش", ["ro"]="display", }, - ["mask"]={ - ["en"]="mask", - ["nl"]="masker", - }, ["dot"]={ ["cs"]="tecka", ["de"]="punkt", diff --git a/tex/context/base/mult-en.mkii b/tex/context/base/mult-en.mkii index 3e21fb078..1fc61060c 100644 --- a/tex/context/base/mult-en.mkii +++ b/tex/context/base/mult-en.mkii @@ -272,7 +272,6 @@ \setinterfacevariable{marginedge}{marginedge} \setinterfacevariable{margintitle}{margintitle} \setinterfacevariable{marking}{marking} -\setinterfacevariable{mask}{mask} \setinterfacevariable{mathalignment}{mathalignment} \setinterfacevariable{mathcases}{mathcases} \setinterfacevariable{mathmatrix}{mathmatrix} @@ -758,6 +757,7 @@ \setinterfaceconstant{margintext}{margintext} \setinterfaceconstant{marking}{marking} \setinterfaceconstant{marstyle}{marstyle} +\setinterfaceconstant{mask}{mask} \setinterfaceconstant{max}{max} \setinterfaceconstant{maxdepth}{maxdepth} \setinterfaceconstant{maxheight}{maxheight} diff --git a/tex/context/base/mult-fr.mkii b/tex/context/base/mult-fr.mkii index 509d7c8f8..f5c75dec4 100644 --- a/tex/context/base/mult-fr.mkii +++ b/tex/context/base/mult-fr.mkii @@ -272,7 +272,6 @@ \setinterfacevariable{marginedge}{bordmarge} \setinterfacevariable{margintitle}{titremarge} \setinterfacevariable{marking}{marquage} -\setinterfacevariable{mask}{mask} \setinterfacevariable{mathalignment}{mathalignment} \setinterfacevariable{mathcases}{mathcases} \setinterfacevariable{mathmatrix}{mathmatrix} @@ -758,6 +757,7 @@ \setinterfaceconstant{margintext}{textemarge} \setinterfaceconstant{marking}{marquage} \setinterfaceconstant{marstyle}{stylemarquage} +\setinterfaceconstant{mask}{mask} \setinterfaceconstant{max}{max} \setinterfaceconstant{maxdepth}{maxdepth} \setinterfaceconstant{maxheight}{hauteurmax} diff --git a/tex/context/base/mult-it.mkii b/tex/context/base/mult-it.mkii index b8555d9f6..a31cb9689 100644 --- a/tex/context/base/mult-it.mkii +++ b/tex/context/base/mult-it.mkii @@ -272,7 +272,6 @@ \setinterfacevariable{marginedge}{bordomargine} \setinterfacevariable{margintitle}{titoloinmargine} \setinterfacevariable{marking}{marcatura} -\setinterfacevariable{mask}{mask} \setinterfacevariable{mathalignment}{mathalignment} \setinterfacevariable{mathcases}{mathcases} \setinterfacevariable{mathmatrix}{mathmatrix} @@ -758,6 +757,7 @@ \setinterfaceconstant{margintext}{testomargine} \setinterfaceconstant{marking}{marcatura} \setinterfaceconstant{marstyle}{stilemarcatura} +\setinterfaceconstant{mask}{mask} \setinterfaceconstant{max}{max} \setinterfaceconstant{maxdepth}{maxdepth} \setinterfaceconstant{maxheight}{altezzamax} diff --git a/tex/context/base/mult-mes.lua b/tex/context/base/mult-mes.lua index 0e51c69d0..cdd6d5ad2 100644 --- a/tex/context/base/mult-mes.lua +++ b/tex/context/base/mult-mes.lua @@ -987,11 +987,14 @@ return { en = "loading database from %s", }, ["publications:5"] = { - en = "warning: cite argument %s on line \\the\\inputlineno", + en = "warning: unknown cite argument %s on line \\the\\inputlineno", }, ["publications:6"] = { en = "loading formatting style from %s", }, + ["publications:7"] = { + en = "placing all entries, use 'text' to be more selective", + }, ["pushing level: %s"] = { nl = "niveau omhoog: %s", }, diff --git a/tex/context/base/mult-nl.mkii b/tex/context/base/mult-nl.mkii index 659f99982..8fef745f8 100644 --- a/tex/context/base/mult-nl.mkii +++ b/tex/context/base/mult-nl.mkii @@ -272,7 +272,6 @@ \setinterfacevariable{marginedge}{kantlijn} \setinterfacevariable{margintitle}{margetitel} \setinterfacevariable{marking}{markering} -\setinterfacevariable{mask}{masker} \setinterfacevariable{mathalignment}{wiskundeuitlijnen} \setinterfacevariable{mathcases}{mathcases} \setinterfacevariable{mathmatrix}{wiskundematrix} @@ -758,6 +757,7 @@ \setinterfaceconstant{margintext}{margetekst} \setinterfaceconstant{marking}{markering} \setinterfaceconstant{marstyle}{marletter} +\setinterfaceconstant{mask}{masker} \setinterfaceconstant{max}{max} \setinterfaceconstant{maxdepth}{maxdepth} \setinterfaceconstant{maxheight}{maxhoogte} diff --git a/tex/context/base/mult-pe.mkii b/tex/context/base/mult-pe.mkii index b5b3d7ec2..e003e15a9 100644 --- a/tex/context/base/mult-pe.mkii +++ b/tex/context/base/mult-pe.mkii @@ -272,7 +272,6 @@ \setinterfacevariable{marginedge}{لبهحاشیه} \setinterfacevariable{margintitle}{عنوانحاشیه} \setinterfacevariable{marking}{نشانهگذاری} -\setinterfacevariable{mask}{mask} \setinterfacevariable{mathalignment}{تنظیمریاضی} \setinterfacevariable{mathcases}{حالتهایریاضی} \setinterfacevariable{mathmatrix}{ماتریشریاضی} @@ -758,6 +757,7 @@ \setinterfaceconstant{margintext}{متنحاشیه} \setinterfaceconstant{marking}{نشانهگذاری} \setinterfaceconstant{marstyle}{سبکحاش} +\setinterfaceconstant{mask}{mask} \setinterfaceconstant{max}{بیشترین} \setinterfaceconstant{maxdepth}{maxdepth} \setinterfaceconstant{maxheight}{بیشترینارتفاع} diff --git a/tex/context/base/mult-ro.mkii b/tex/context/base/mult-ro.mkii index fdbc06ad8..88491aade 100644 --- a/tex/context/base/mult-ro.mkii +++ b/tex/context/base/mult-ro.mkii @@ -272,7 +272,6 @@ \setinterfacevariable{marginedge}{marginebordura} \setinterfacevariable{margintitle}{titlumarginal} \setinterfacevariable{marking}{marcaje} -\setinterfacevariable{mask}{mask} \setinterfacevariable{mathalignment}{mathalignment} \setinterfacevariable{mathcases}{mathcases} \setinterfacevariable{mathmatrix}{mathmatrix} @@ -758,6 +757,7 @@ \setinterfaceconstant{margintext}{textmargine} \setinterfaceconstant{marking}{marcaje} \setinterfaceconstant{marstyle}{stilmarcaj} +\setinterfaceconstant{mask}{mask} \setinterfaceconstant{max}{max} \setinterfaceconstant{maxdepth}{maxdepth} \setinterfaceconstant{maxheight}{inaltimemaxima} diff --git a/tex/context/base/node-aux.lua b/tex/context/base/node-aux.lua index 37671687b..51293e78a 100644 --- a/tex/context/base/node-aux.lua +++ b/tex/context/base/node-aux.lua @@ -6,27 +6,41 @@ if not modules then modules = { } end modules ['node-aux'] = { license = "see context related readme files" } +local type, tostring = type, tostring + local nodes, node = nodes, node -local nodecodes = nodes.nodecodes +local utfvalues = string.utfvalues + +local nodecodes = nodes.nodecodes + +local glyph_code = nodecodes.glyph +local hlist_code = nodecodes.hlist +local vlist_code = nodecodes.vlist -local glyph_code = nodecodes.glyph -local hlist_code = nodecodes.hlist -local vlist_code = nodecodes.vlist +local nodepool = nodes.pool -local traverse_nodes = node.traverse -local traverse_id = node.traverse_id -local free_node = node.free -local hpack_nodes = node.hpack -local has_attribute = node.has_attribute -local set_attribute = node.set_attribute -local get_attribute = node.get_attribute -local unset_attribute = node.unset_attribute -local first_glyph = node.first_glyph or node.first_character +local new_glue = nodepool.glue +local new_glyph = nodepool.glyph -local texbox = tex.box +local traverse_nodes = node.traverse +local traverse_id = node.traverse_id +local free_node = node.free +local hpack_nodes = node.hpack +local has_attribute = node.has_attribute +local set_attribute = node.set_attribute +local get_attribute = node.get_attribute +local unset_attribute = node.unset_attribute +local first_glyph = node.first_glyph or node.first_character +local copy_node = node.copy +local slide_nodes = node.slide +local insert_node_after = node.insert_after +local isnode = node.is_node + +local texbox = tex.box function nodes.repack_hlist(list,...) +--~ nodes.showsimplelist(list) local temp, b = hpack_nodes(list,...) list = temp.list temp.list = nil @@ -205,3 +219,107 @@ end --~ end --~ nodes.firstline = firstline + +-- this depends on fonts, so we have a funny dependency ... will be +-- sorted out .. we could make tonodes a plugin into this + +local function tonodes(str,fnt,attr) -- (str,template_glyph) -- moved from blob-ini + if not str or str == "" then + return + end + local head, tail, space, fnt, template = nil, nil, nil, nil, nil + if not fnt then + fnt = current_font() + elseif type(fnt) ~= "number" and fnt.id == "glyph" then + fnt, template = nil, fnt + -- else + -- already a number + end + for s in utfvalues(str) do + local n + if s == 32 then + if space then + n = copy_node(space) + elseif fonts then -- depedency + local parameters = fonts.identifiers[fnt].parameters + space = new_glue(parameters.space,parameters.space_stretch,parameters.space_shrink) + n = space + end + elseif template then + n = copy_node(template) + n.char = s + else + n = new_glyph(fnt,s) + end + if attr then -- normally false when template + n.attr = copy_node_list(attr) + end + if head then + insert_node_after(head,tail,n) + else + head = n + end + tail = n + end + return head, tail +end + +nodes.tonodes = tonodes + +local function link(head,tail,list,currentfont,currentattr) + for i=1,#list do + local n = list[i] + if n then + local tn = isnode(n) + if not tn then + local tn = type(n) + if tn == "number" then + local h, t = tonodes(tostring(n),currentfont,currentattr) + if not h then + -- skip + elseif not head then + head, tail = h, t + else + tail.next, h.prev, tail = h, t, t + end + elseif tn == "string" then + if #tn > 0 then + local h, t = tonodes(n,font.current(),currentattr) + if not h then + -- skip + elseif not head then + head, tail = h, t + else + tail.next, h.prev, tail = h, t, t + end + end + elseif tn == "table" then + if #tn > 0 then + head, tail = link(head,tail,n,currentfont,currentattr) + end + end + elseif not head then + head = n + if n.next then + tail = slide_nodes(n) + else + tail = n + end + else + tail.next = n + n.prev = tail + if n.next then + tail = slide_nodes(n) + else + tail = n + end + end + end + end + return head, tail +end + +function nodes.link(...) + local currentfont = font.current + return link(nil,nil,{...},currentfont,currentattr) +end diff --git a/tex/context/base/node-ini.lua b/tex/context/base/node-ini.lua index a29af830b..fa53f1200 100644 --- a/tex/context/base/node-ini.lua +++ b/tex/context/base/node-ini.lua @@ -54,10 +54,12 @@ into the <l n='tex'/> engine, but this is a not so natural extension.</p> also ignore the empty nodes. [This is obsolete!]</p> --ldx]]-- -local traverse, traverse_id = node.traverse, node.traverse_id -local free_node, remove_node = node.free, node.remove -local insert_node_before, insert_node_after = node.insert_before, node.insert_after -local slide_nodes = node.slide +local traverse = node.traverse +local traverse_id = node.traverse_id +local free_node = node.free +local remove_node = node.remove +local insert_node_before = node.insert_before +local insert_node_after = node.insert_after local allocate = utilities.storage.allocate @@ -69,25 +71,25 @@ nodes.handlers = nodes.handlers or { } -- there will be more of this: local skipcodes = allocate { - [ 0] = "userskip", - [ 1] = "lineskip", - [ 2] = "baselineskip", - [ 3] = "parskip", - [ 4] = "abovedisplayskip", - [ 5] = "belowdisplayskip", - [ 6] = "abovedisplayshortskip", - [ 7] = "belowdisplayshortskip", - [ 8] = "leftskip", - [ 9] = "rightskip", - [10] = "topskip", - [11] = "splittopskip", - [12] = "tabskip", - [13] = "spaceskip", - [14] = "xspaceskip", - [15] = "parfillskip", - [16] = "thinmuskip", - [17] = "medmuskip", - [18] = "thickmuskip", + [ 0] = "userskip", + [ 1] = "lineskip", + [ 2] = "baselineskip", + [ 3] = "parskip", + [ 4] = "abovedisplayskip", + [ 5] = "belowdisplayskip", + [ 6] = "abovedisplayshortskip", + [ 7] = "belowdisplayshortskip", + [ 8] = "leftskip", + [ 9] = "rightskip", + [10] = "topskip", + [11] = "splittopskip", + [12] = "tabskip", + [13] = "spaceskip", + [14] = "xspaceskip", + [15] = "parfillskip", + [16] = "thinmuskip", + [17] = "medmuskip", + [18] = "thickmuskip", } local noadcodes = allocate { @@ -347,27 +349,6 @@ function nodes.reference(n) return lpegmatch(reference,tostring(n)) end -function nodes.link(n,...) -- blobs ? - if n then - if type(n) ~= "table" then - n = { n, ... } - end - local head = n[1] - local tail = slide_nodes(head) - for i=2,#n do - local ni = n[i] - tail.next = ni - ni.prev = tail - tail = slide_nodes(ni) - end - return head - else - -- sort of fatal error - end -end - --- - if not node.next then function node.next(n) return n and n.next end diff --git a/tex/context/base/node-pro.lua b/tex/context/base/node-pro.lua index a901616b5..2d04a4d71 100644 --- a/tex/context/base/node-pro.lua +++ b/tex/context/base/node-pro.lua @@ -122,9 +122,9 @@ local hpack = node.hpack function nodes.fasthpack(...) -- todo: pass explicit arguments enabled = false - local hp = hpack(...) + local hp, b = hpack(...) enabled = true - return hp + return hp, b end callbacks.register('pre_linebreak_filter', processors.pre_linebreak_filter,"all kind of horizontal manipulations (before par break)") diff --git a/tex/context/base/node-res.lua b/tex/context/base/node-res.lua index 6e11742de..7f737ea70 100644 --- a/tex/context/base/node-res.lua +++ b/tex/context/base/node-res.lua @@ -309,10 +309,10 @@ local lastid = 0 setmetatable(userids, { __index = function(t,k) if type(k) == "string" then - local n = lastid + 1 - rawset(userids,n,k) - rawset(userids,k,n) - return n + lastid = lastid + 1 + rawset(userids,lastid,k) + rawset(userids,k,lastid) + return lastid else rawset(userids,k,k) return k @@ -323,7 +323,7 @@ setmetatable(userids, { end } ) -function pool.usernumber(id,num) -- if one argument then num +function pool.usernumber(id,num) local n = copy_node(user_n) if num then n.user_id, n.value = id, num diff --git a/tex/context/base/pack-rul.mkiv b/tex/context/base/pack-rul.mkiv index b516bafbe..053b217c5 100644 --- a/tex/context/base/pack-rul.mkiv +++ b/tex/context/base/pack-rul.mkiv @@ -915,6 +915,8 @@ \def\c!fr!analyze{fr:analyze} % private option +% we can make macros for the offset, width, and height branches or do an \csname + \unexpanded\def\dodolocalframed {\!!framedframeoffset\framedparameter\c!frameoffset \edef\@@framedbackgroundoffset{\framedparameter\c!backgroundoffset}% @@ -999,7 +1001,14 @@ \fi\fi \!!framedheight\zeropoint \!!framedwidth \zeropoint - \ifx\localwidth\v!fit + \ifx\localwidth\empty % fallback to fit + \ifboxhasformat + \boxhaswidthtrue + \!!framedwidth\hsize + \else + \boxhaswidthfalse + \fi + \else\ifx\localwidth\v!fit \ifboxhasformat \boxhaswidthtrue \!!framedwidth\hsize @@ -1023,15 +1032,17 @@ \else \boxhaswidthtrue \!!framedwidth\localwidth - \fi\fi\fi\fi - \ifx\localheight\v!fit + \fi\fi\fi\fi\fi + \ifx\localheight\empty % fallback to fit + \boxhasheightfalse + \else\ifx\localheight\v!fit \boxhasheightfalse % no longer: \boxhasstrutfalse \else\ifx\localheight\v!broad \boxhasheightfalse \else \boxhasheighttrue \!!framedheight\localheight - \fi\fi + \fi\fi\fi \ifboxhasheight % obey user set height, also downward compatible \else @@ -2343,20 +2354,18 @@ \def\dovlwdhtdp#1#2#3% {\bgroup - \!!dimena#2\strutht - \!!dimenb#3\strutdp \setbox\scratchbox\hbox {\vrule \!!width #1\linewidth - \!!height\!!dimena - \!!depth \!!dimenb}% + \!!height#2\strutht + \!!depth #3\strutdp}% \dp\scratchbox\strutdp \ht\scratchbox\strutht \box\scratchbox \egroup} \def\complexvl[#1]% - {\dovlwdhtdp{1}{#1}{#1}} + {\dovlwdhtdp\plusone{#1}{#1}} \def\complexhl[#1]% {\hbox diff --git a/tex/context/base/page-lay.mkiv b/tex/context/base/page-lay.mkiv index 9588dbb3e..6cc8afc9c 100644 --- a/tex/context/base/page-lay.mkiv +++ b/tex/context/base/page-lay.mkiv @@ -913,7 +913,7 @@ \doscalepagebox{#1}\@@lysx\@@lysy \fi \else - \doscalepagebox{#1}\@@lysscale\@@lyscale + \doscalepagebox{#1}\@@lyscale\@@lyscale \fi} \def\doscalepagebox#1#2#3% diff --git a/tex/context/base/page-mar.mkiv b/tex/context/base/page-mar.mkiv index 100729d20..433364a06 100644 --- a/tex/context/base/page-mar.mkiv +++ b/tex/context/base/page-mar.mkiv @@ -11,6 +11,8 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. +\endinput % obsolete, also commented code in anch-pgr.mkiv + %D Support for margin words is one of the reasons for writing %D \CONTEXT. Over time support for marginal content has been %D extended en enhanced. Therefore it's always good to watch diff --git a/tex/context/base/page-mul.mkiv b/tex/context/base/page-mul.mkiv index 0a57b9e41..581ba5a59 100644 --- a/tex/context/base/page-mul.mkiv +++ b/tex/context/base/page-mul.mkiv @@ -1256,9 +1256,17 @@ \def\OTRMULdotopinsertions {\ifconditional\onlylocalcolumnfloats\relax \else\OTRONEdotopinsertions \fi} \def\OTRMULdoflushfloats {\ifconditional\onlylocalcolumnfloats\doflushcolumnfloats\else\OTRONEdoflushfloats \fi} +\newtoks\everylocalcolumnfloatspar + +\everylocalcolumnfloatspar + {\flushnotes + \flushcolumnfloat + % \flushmargincontents + \checkindentation} + \def\setlocalcolumnfloats {\settrue\onlylocalcolumnfloats - \everypar{\flushnotes\flushcolumnfloat\flushmargincontents\checkindentation}% + \everypar\everylocalcolumnfloatspar \let\flushcolumnfloat\doflushcolumnfloat \let\flushcolumnfloats\doflushcolumnfloats} diff --git a/tex/context/base/page-run.mkiv b/tex/context/base/page-run.mkiv index 4e92efa27..1c7595b03 100644 --- a/tex/context/base/page-run.mkiv +++ b/tex/context/base/page-run.mkiv @@ -22,28 +22,28 @@ {\forgetall \dontcomplain \globaldefs\minusone - \dimen0\pagegoal + \dimen\zerocount\pagegoal \definepapersize[X][\c!width=4em, \c!height=6em]% \definepapersize[Y][\c!width=12em,\c!height=14em]% \setuppapersize[#1,X][#2,Y]% \setuplayout[#3]% - \setbox0\vbox + \setbox\zerocount\vbox {\framed [\c!offset=\v!overlay,\c!strut=\v!no, \c!width=\paperwidth,\c!height=\paperheight] {\ss ABC\par DEF}}% \doublesidedfalse \def\cutmarklength{.5em}% - \addpagecutmarks0% - \replicatepagebox0% - \scalepagebox0% - \mirrorpaperbox0% - \orientpaperbox0% - \centerpagebox0% - \mirrorprintbox0% - \orientprintbox0% - \offsetprintbox0% - \pagegoal\dimen0 + \addpagecutmarks \zerocount + \replicatepagebox\zerocount + \scalepagebox \zerocount + \mirrorpaperbox \zerocount + \orientpaperbox \zerocount + \centerpagebox \zerocount + \mirrorprintbox \zerocount + \orientprintbox \zerocount + \offsetprintbox \zerocount + \pagegoal\dimen\zerocount \box0}} \gdef\showprint diff --git a/tex/context/base/scrp-cjk.lua b/tex/context/base/scrp-cjk.lua index b3cc5dee5..7c9833bb3 100644 --- a/tex/context/base/scrp-cjk.lua +++ b/tex/context/base/scrp-cjk.lua @@ -545,7 +545,7 @@ local function process(head,first,last) local font = first.font if font ~= lastfont then lastfont = font - set_parameters(font,numbertodataset[get_attribute(first,a_preproc)]) + set_parameters(font,numbertodataset[has_attribute(first,a_preproc)]) end action(head,first) end diff --git a/tex/context/base/sort-ini.lua b/tex/context/base/sort-ini.lua index 4f5cf5224..e8580653a 100644 --- a/tex/context/base/sort-ini.lua +++ b/tex/context/base/sort-ini.lua @@ -66,6 +66,7 @@ local lccodes = characters.lccodes local lcchars = characters.lcchars local shchars = characters.shchars local fscodes = characters.fscodes +local fschars = characters.fschars local variables = interfaces.variables @@ -161,7 +162,7 @@ local function preparetables(data) local n, nn if k then if trace_tests then - report_sorters("simplifing character 0x%04x %s",utfbyte(k),k) + report_sorters("simplifing character 0x%04X %s",utfbyte(k),k) end local l = lower[k] or lcchars[k] if l then @@ -182,8 +183,8 @@ local function preparetables(data) end end if not n then - local s = shchars[k] - if s and s ~= k then -- weird test + local s = shchars[k] -- maybe all components? + if s and s ~= k then if trace_tests then report_sorters(" 3 shape: %s",s) end @@ -217,21 +218,39 @@ local function preparetables(data) end end end - if trace_tests then - report_sorters(" 6 order: %s",concat(n," ")) + else + -- fschars returns a single char + s = fschars[k] + if s and s ~= k then + if trace_tests then + report_sorters(" 6 split: %s",s) + end + local ml = rawget(t,s) + if ml then + n = { } + nn = 0 + for i=1,#ml do + nn = nn + 1 + n[nn] = ml[i] + end + end end end - if not n then + if n then + if trace_tests then + report_sorters(" 7 order: %s",concat(n," ")) + end + else n = noorder if trace_tests then - report_sorters(" 7 order: 0") + report_sorters(" 8 order: 0") end end end else n = noorder if trace_tests then - report_sorters(" 8 order: 0") + report_sorters(" 9 order: 0") end end rawset(t,k,n) @@ -585,8 +604,12 @@ function splitters.utf(str) -- we could append m and u but this is cleaner, s is p_case[n] = l end char[n], byte[n] = sc, b +local fs = fscodes[b] or b local msc = m_mappings[sc] if msc ~= noorder then +if not msc then + msc = m_mappings[fs] +end for i=1,#msc do nm = nm + 1 m_mapping[nm] = msc[i] @@ -594,6 +617,9 @@ function splitters.utf(str) -- we could append m and u but this is cleaner, s is end local zsc = z_mappings[sc] if zsc ~= noorder then +if not zsc then + zsc = z_mappings[fs] +end for i=1,#zsc do nz = nz + 1 z_mapping[nz] = zsc[i] @@ -601,6 +627,9 @@ function splitters.utf(str) -- we could append m and u but this is cleaner, s is end local psc = p_mappings[sc] if psc ~= noorder then +if not psc then + psc = p_mappings[fs] +end for i=1,#psc do np = np + 1 p_mapping[np] = psc[i] @@ -611,20 +640,20 @@ function splitters.utf(str) -- we could append m and u but this is cleaner, s is -- only those needed that are part of a sequence - local b = byte[1] - if b then - -- we set them to the first split code (korean) - local fs = fscodes[b] or b - if #m_mapping == 0 then - m_mapping = { m_mappings[fs][1] } - end - if #z_mapping == 0 then - z_mapping = { z_mappings[fs][1] } - end - if #p_mapping == 0 then - p_mapping = { p_mappings[fs][1] } - end - end +--~ local b = byte[1] +--~ if b then +--~ -- we set them to the first split code (korean) +--~ local fs = fscodes[b] or b +--~ if #m_mapping == 0 then +--~ m_mapping = { m_mappings[fs][1] } +--~ end +--~ if #z_mapping == 0 then +--~ z_mapping = { z_mappings[fs][1] } +--~ end +--~ if #p_mapping == 0 then +--~ p_mapping = { p_mappings[fs][1] } +--~ end +--~ end local t = { ch = char, @@ -681,7 +710,7 @@ function sorters.sort(entries,cmp) local nofentries = #entries report_sorters("entries: %s, language: %s, method: %s, digits: %s",nofentries,language,method,tostring(digits)) for i=1,nofentries do - report_sorters("entry %s",table.serialize(entries[i].split,i)) + report_sorters("entry %s",table.serialize(entries[i].split,i,true,true,true)) end end if trace_tests then diff --git a/tex/context/base/spac-ali.lua b/tex/context/base/spac-ali.lua new file mode 100644 index 000000000..37bff74d1 --- /dev/null +++ b/tex/context/base/spac-ali.lua @@ -0,0 +1,132 @@ +if not modules then modules = { } end modules ['spac-ali'] = { + version = 1.001, + comment = "companion to spac-ali.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local div = math.div + +local tasks = nodes.tasks +local appendaction = tasks.appendaction +local prependaction = tasks.prependaction +local disableaction = tasks.disableaction +local enableaction = tasks.enableaction + +local has_attribute = node.has_attribute +local unset_attribute = node.unset_attribute +local slide_nodes = node.slide +local hpack_nodes = node.hpack -- nodes.fasthpack not really faster here + +local link_nodes = nodes.link + +local nodecodes = nodes.nodecodes +local listcodes = nodes.listcodes + +local hlist_code = nodecodes.hlist +local vlist_code = nodecodes.vlist +local line_code = listcodes.line + +local nodepool = nodes.pool + +local new_stretch = nodepool.stretch + +local a_realign = attributes.private("realign") + +local texattribute = tex.attribute +local texcount = tex.count + +local isleftpage = layouts.status.isleftpage + +local alignments = { } +typesetters.alignments = alignments + +local report_realign = logs.reporter("typesetters","margindata") +local trace_realign = trackers.register("typesetters.margindata", function(v) trace_margindata = v end) + +local nofrealigned = 0 + +-- leftskip rightskip parfillskip +-- raggedleft 0 + 0 - +-- raggedright 0 0 fil +-- raggedcenter 0 + 0 + - + +local function handler(head,leftpage,realpageno) + local current = head + local done = false + while current do + local id = current.id + if id == hlist_code then + if current.subtype == line_code then + local a = has_attribute(current,a_realign) + if not a or a == 0 then + -- skip + else + local align = a % 10 + local pageno = div(a,10) + if pageno == realpageno then + -- already ok + else + local action = 0 + if align == 1 then -- flushright + action = leftpage and 1 or 2 + elseif align == 2 then -- flushleft + action = leftpage and 2 or 1 + end + if action == 1 then + current.list = hpack_nodes(link_nodes(current.list,new_stretch(3)),current.width,"exactly") + if trace_realign then + report_realign("flush left: align %s, page %s, realpage %s",align,pageno,realpageno) + end + elseif action == 2 then + current.list = hpack_nodes(link_nodes(new_stretch(3),current.list),current.width,"exactly") + if trace_realign then + report_realign("flush right: align %s, page %s, realpage %s",align,pageno,realpageno) + end + elseif trace_realign then + report_realign("invalid: align %s, page %s, realpage %s",align,pageno,realpageno) + end + done = true + nofrealigned = nofrealigned + 1 + end + unset_attribute(current,a_realign) + end + end + handler(current.list,leftpage,realpageno) + elseif id == vlist_code then + handler(current.list,leftpage,realpageno) + end + current = current.next + end + return head, done +end + +function alignments.handler(head) + local leftpage = isleftpage(true,false) + local realpageno = texcount.realpageno + return handler(head,leftpage,realpageno) +end + +local enabled = false + +function alignments.set(n) + if not enabled then + enableaction("shipouts","typesetters.alignments.handler") + enabled = true + if trace_realign then + report_realign("enabled") + end + end + texattribute[a_realign] = texcount.realpageno * 10 + n +end + +commands.setrealign = alignments.set + +statistics.register("realigning", function() + if nofrealigned > 0 then + return string.format("%s processed",nofrealigned) + else + return nil + end +end) diff --git a/tex/context/base/spac-ali.mkiv b/tex/context/base/spac-ali.mkiv index d9a85920f..e93b20c63 100644 --- a/tex/context/base/spac-ali.mkiv +++ b/tex/context/base/spac-ali.mkiv @@ -15,6 +15,18 @@ \unprotect +\registerctxluafile{spac-ali}{1.001} + +\definesystemattribute[realign][public] + +\unexpanded\def\resetrealignsignal{\attribute\realignattribute\attributeunsetvalue} +\unexpanded\def\signalinnerrealign{\ctxcommand{setrealign(2)}} +\unexpanded\def\signalouterrealign{\ctxcommand{setrealign(1)}} + +\appendtoks + \resetrealignsignal +\to \everyforgetall + % We will not use bodydir and pagedir so we disable them. That way we get % normal hyperlink support. @@ -69,55 +81,108 @@ \unexpanded\def\definehbox {\dodoubleargument\dodefinehbox} -\def\iobox#1#2#3#% here #3# is not really needed - {\vbox\bgroup % we want to return a vbox like the others - \hbox\bgroup% we need to pack the signal with the box - \signalrightpage - \dowithnextboxcontent - {\let\\=\endgraf\forgetall\doifrightpageelse#1#2} - {\box\nextbox\egroup\egroup} - \vbox#3} +% To be redone: + +% \def\iobox#1#2#3#% here #3# is not really needed +% {\vbox\bgroup % we want to return a vbox like the others +% \hbox\bgroup% we need to pack the signal with the box +% \signalrightpage +% \dowithnextboxcontent +% {\let\\=\endgraf\forgetall\doifrightpageelse#1#2} +% {\box\nextbox\egroup\egroup} +% \vbox#3} +% \def\obox{\iobox\raggedleft \raggedright} % outerbox +% \def\ibox{\iobox\raggedright\raggedleft} % innerbox + +\def\ibox#1#2#3% + {\vbox\bgroup + \forgetall + \let\\=\endgraf + \ifdoublesided\signalinnerrealign\fi + \doifrightpageelse\raggedright\raggedleft + \let\next} + +\def\obox#1#2#3% + {\vbox\bgroup + \forgetall + \let\\=\endgraf + \ifdoublesided\signalouterrealign\fi + \doifrightpageelse\raggedleft\raggedright + \let\next} + +% \def\dosetraggedvbox#1% can be more keys +% {\let\raggedbox\vbox +% \processfirstactioninset +% [#1] +% [ \v!left=>\let\raggedbox\lbox, +% \v!right=>\let\raggedbox\rbox, +% \v!middle=>\let\raggedbox\cbox, +% \v!inner=>\let\raggedbox\ibox, +% \v!outer=>\let\raggedbox\obox, +% \v!flushleft=>\let\raggedbox\rbox, +% \v!flushright=>\let\raggedbox\lbox, +% \v!center=>\let\raggedbox\cbox, +% \v!no=>\def\raggedbox{\vbox\bgroup\raggedright\let\next=}]} + +% \def\dosetraggedhbox#1% can be more keys +% {\let\raggedbox\hbox +% \processaction % slow +% [#1] +% [ \v!left=>\def\raggedbox{\doalignedline\v!left }, +% \v!right=>\def\raggedbox{\doalignedline\v!right }, +% \v!middle=>\def\raggedbox{\doalignedline\v!middle}, +% \v!inner=>\def\raggedbox{\doalignedline\v!inner }, +% \v!outer=>\def\raggedbox{\doalignedline\v!outer }, +% \v!flushleft=>\def\raggedbox{\doalignedline\v!right }, +% \v!flushright=>\def\raggedbox{\doalignedline\v!left }, +% \v!center=>\def\raggedbox{\doalignedline\v!middle}]} + +\def\@@ragged@@command{@@ragged@@c} +\def\@@ragged@@hbox {@@ragged@@h} +\def\@@ragged@@vbox {@@ragged@@v} + +\def\dosetraggedvbox#1% can be more keys + {\let\raggedbox\vbox + \processcommacommand[#1]\dodosetraggedvbox} -\def\obox{\iobox\raggedleft \raggedright} % outerbox -\def\ibox{\iobox\raggedright\raggedleft} % innerbox +\def\dosetraggedhbox#1% can be more keys + {\let\raggedbox\hbox + \processcommacommand[#1]\dodosetraggedhbox} \def\dosetraggedvbox#1% - {\let\raggedbox\vbox - \processfirstactioninset - [#1] - [ \v!left=>\let\raggedbox\lbox, - \v!right=>\let\raggedbox\rbox, - \v!middle=>\let\raggedbox\cbox, - \v!inner=>\let\raggedbox\ibox, - \v!outer=>\let\raggedbox\obox, - \v!flushleft=>\let\raggedbox\rbox, - \v!flushright=>\let\raggedbox\lbox, - \v!center=>\let\raggedbox\cbox, - \v!no=>\def\raggedbox{\vbox\bgroup\raggedright\let\next=}]} + {\ifcsname\@@ragged@@vbox#1\endcsname + \csname\@@ragged@@vbox#1\endcsname + \quitcommalist + \fi} \def\dosetraggedhbox#1% - {\let\raggedbox\hbox - \processaction % slow - [#1] - [ \v!left=>\def\raggedbox{\doalignedline\v!left }, - \v!right=>\def\raggedbox{\doalignedline\v!right }, - \v!middle=>\def\raggedbox{\doalignedline\v!middle}, - \v!inner=>\def\raggedbox{\doalignedline\v!inner }, - \v!outer=>\def\raggedbox{\doalignedline\v!outer }, - \v!flushleft=>\def\raggedbox{\doalignedline\v!right }, - \v!flushright=>\def\raggedbox{\doalignedline\v!left }, - \v!center=>\def\raggedbox{\doalignedline\v!middle}]} - -\newconditional \injectraggedpagesignals \settrue\injectraggedpagesignals + {\ifcsname\@@ragged@@hbox#1\endcsname + \csname\@@ragged@@hbox#1\endcsname + \quitcommalist + \fi} + +\setvalue{\@@ragged@@vbox\v!left }{\let\raggedbox\lbox} +\setvalue{\@@ragged@@vbox\v!right }{\let\raggedbox\rbox} +\setvalue{\@@ragged@@vbox\v!middle }{\let\raggedbox\cbox} +\setvalue{\@@ragged@@vbox\v!inner }{\let\raggedbox\ibox} +\setvalue{\@@ragged@@vbox\v!outer }{\let\raggedbox\obox} +\setvalue{\@@ragged@@vbox\v!flushleft }{\let\raggedbox\rbox} +\setvalue{\@@ragged@@vbox\v!flushright}{\let\raggedbox\lbox} +\setvalue{\@@ragged@@vbox\v!center }{\let\raggedbox\cbox} +\setvalue{\@@ragged@@vbox\v!no }{\def\raggedbox{\vbox\bgroup\raggedright\let\next=}]} + +\setvalue{\@@ragged@@hbox\v!left }{\def\raggedbox{\doalignedline\v!left }} +\setvalue{\@@ragged@@hbox\v!right }{\def\raggedbox{\doalignedline\v!right }} +\setvalue{\@@ragged@@hbox\v!middle }{\def\raggedbox{\doalignedline\v!middle}} +\setvalue{\@@ragged@@hbox\v!inner }{\def\raggedbox{\doalignedline\v!inner }} +\setvalue{\@@ragged@@hbox\v!outer }{\def\raggedbox{\doalignedline\v!outer }} +\setvalue{\@@ragged@@hbox\v!flushleft }{\def\raggedbox{\doalignedline\v!right }} +\setvalue{\@@ragged@@hbox\v!flushright}{\def\raggedbox{\doalignedline\v!left }} +\setvalue{\@@ragged@@hbox\v!center }{\def\raggedbox{\doalignedline\v!middle}} \def\dosetraggedcommand#1% {\normalexpanded{\noexpand\dodosetraggedcommand{#1}}} -\def\dosetpureraggedcommand#1% - {\setfalse\injectraggedpagesignals - \normalexpanded{\dodosetraggedcommand{#1}}% - \settrue\injectraggedpagesignals} - \newtoks\everyraggedcommand \def\raggedcommand{\the\everyraggedcommand} @@ -125,11 +190,11 @@ % slow, we can do this in lua ... some day \unexpanded\def\dodosetraggedcommand#1% beware: #1=empty is ignored, keep that! - {\everyraggedcommand\emptytoks + {\everyraggedcommand{\resetrealignsignal}% \emptytoks maybe only when #1 <> empty \let\raggedtopcommand\empty \let\raggedbottomcommand\empty \setfalse\raggedonelinerstate - \doifsomething{#1} + \doifsomething{#1}% {\doifinsetelse\v!broad{#1}\!!doneatrue\!!doneafalse \doifinsetelse\v!wide {#1}\!!donebtrue\!!donebfalse \!!donectrue @@ -138,8 +203,6 @@ \def\dododosetraggedcommand#1% {\executeifdefined{\@@ragged@@command\string#1}\relax} -\def\@@ragged@@command{@@raggedcommand} - \setvalue{\@@ragged@@command\v!hanging }{\appendtoks\enableprotruding \to\everyraggedcommand} \setvalue{\@@ragged@@command\v!nothanging }{\appendtoks\disableprotruding \to\everyraggedcommand} \setvalue{\@@ragged@@command\v!hz }{\appendtoks\enableadjusting \to\everyraggedcommand} @@ -203,28 +266,20 @@ {\appendtoks\notragged\to\everyraggedcommand} \setvalue{\@@ragged@@command\v!inner}% - {\ifconditional\injectraggedpagesignals - \signalrightpage % may interfere - \doifrightpageelse - {\getvalue{\@@ragged@@command\v!right}}% - {\getvalue{\@@ragged@@command\v!left }}% - \else - \rightorleftpageaction - {\getvalue{\@@ragged@@command\v!left }}% - {\getvalue{\@@ragged@@command\v!right}}% - \fi} + {\ifdoublesided + \appendtoks\signalinnerrealign\to\everyraggedcommand + \fi + \rightorleftpageaction + {\getvalue{\@@ragged@@command\v!right}}% + {\getvalue{\@@ragged@@command\v!left }}} \setvalue{\@@ragged@@command\v!outer}% - {\ifconditional\injectraggedpagesignals - \signalrightpage % may interfere - \doifrightpageelse - {\getvalue{\@@ragged@@command\v!left }}% - {\getvalue{\@@ragged@@command\v!right}}% - \else - \rightorleftpageaction - {\getvalue{\@@ragged@@command\v!right}}% - {\getvalue{\@@ragged@@command\v!left }}% - \fi} + {\ifdoublesided + \appendtoks\signalouterrealign\to\everyraggedcommand + \fi + \rightorleftpageaction + {\getvalue{\@@ragged@@command\v!left }}% + {\getvalue{\@@ragged@@command\v!right}}} \setvalue{\@@ragged@@command\v!lesshyphenation}% {\appendtoks\lesshyphens\to\everyraggedcommand} @@ -346,7 +401,7 @@ \begingroup \dontshowcomposition \inleftmargin{\vsmash - {\switchtobodyfont[7pt,tt]% + {\infofont \framed[\c!align=\v!right]{\thepardata}}}% \endgroup} @@ -454,6 +509,11 @@ \setvalue{@@ngila@@\v!broad }{\!!doneatrue} \setvalue{@@ngila@@\v!wide }{\!!donebtrue} +\def\setraggedparagraphmode + {\doifrightpageelse + {\ifdoublesided\signalinnerrealign\firstoftwoarguments \fi} + {\ifdoublesided\signalouterrealign\secondoftwoarguments\fi}} + \def\installalign#1#2{\setvalue{@@align@@#1}{#2}} % can be used for overloads \installalign \v!new {\@@asraggedfalse} @@ -526,6 +586,7 @@ {\!!doneafalse \!!donebfalse \raggedstatus\zerocount + \resetrealignsignal \processcommacommand[#1]\dodosetupngila \processcommacommand[#1]\dodosetupalign} @@ -601,9 +662,10 @@ \letvalue{\s!do\v!line\v!flushright}\leftaligned \letvalue{\s!do\v!line\v!center }\midaligned -\def\doalignedline#1{\csname\s!do\v!line#1\endcsname} +\def\doalignedline#1{\resetrealignsignal\csname\s!do\v!line#1\endcsname} -%D Experimental: +%D Experimental (will be redone when floats are redone as it's real messy +%D now): \def\doxalignline#1#2#3#4#5#6% {\noindentation % was \noindent @@ -624,7 +686,13 @@ \endgroup} \hbox} -\def\doxcheckline +% \def\doxcheckline % no vbox so no +% {\doifrightpageelse\donetrue\donefalse +% \ifdoublesided +% \ifdone\signalinnerrealign\else\signalouterrealign\fi +% \fi} + +\def\doxcheckline % used for floats so multipass anyway {\signalrightpage\doifrightpageelse\donetrue\donefalse} \setvalue{\s!do\v!line\v!inner }{\doxalignline\doxcheckline++\zeropoint \relax\hss } diff --git a/tex/context/base/spac-pag.mkiv b/tex/context/base/spac-pag.mkiv index 96a65e9f8..9babab29a 100644 --- a/tex/context/base/spac-pag.mkiv +++ b/tex/context/base/spac-pag.mkiv @@ -138,8 +138,8 @@ {\ifcase\pagesignallevel\or\postsignalrightpage\fi \advance\pagesignallevel\minusone} -\def\setraggedparagraphmode - {\signalrightpage\doifrightpageelse} % move it there +% \def\setraggedparagraphmode +% {\signalrightpage\doifrightpageelse} % move it there \ifx\swapmargins\undefined \let\swapmargins\undefined \fi % todo diff --git a/tex/context/base/spac-par.lua b/tex/context/base/spac-par.lua new file mode 100644 index 000000000..f695e11e9 --- /dev/null +++ b/tex/context/base/spac-par.lua @@ -0,0 +1,59 @@ +if not modules then modules = { } end modules ['spac-par'] = { + version = 1.001, + comment = "companion to spac-par.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- sort of obsolete code + +local attribute = attributes.private('graphicvadjust') + +local nodecodes = nodes.nodecodes + +local hlist_code = nodecodes.hlist +local vlist_code = nodecodes.vlist + +local remove_node = nodes.remove +local hpack_node = node.hpack +local vpack_node = node.vpack +local has_attribute = node.has_attribute + +function nodes.handlers.graphicvadjust(head,groupcode) -- we can make an actionchain for mvl only + if groupcode == "" then -- mvl only + local h, p, done = head, nil, false + while h do + local id = h.id + if id == hlist_code or id == vlist_code then + local a = has_attribute(h,attribute) + if a then + if p then + local n + head, h, n = remove_node(head,h) + local pl = p.list + if n.width ~= 0 then + n = hpack_node(n,0,'exactly') -- todo: dir + end + if pl then + pl.prev = n + n.next = pl + end + p.list = n + done = true + else + -- can't happen + end + else + p = h + h = h.next + end + else + h = h.next + end + end + return head, done + else + return head, false + end +end diff --git a/tex/context/base/spac-par.mkiv b/tex/context/base/spac-par.mkiv index 4093edcac..222f4fd2c 100644 --- a/tex/context/base/spac-par.mkiv +++ b/tex/context/base/spac-par.mkiv @@ -156,10 +156,19 @@ % Very nasty but needed for margin stuff inside colored % paragraphs. +\registerctxluafile{spac-par}{1.001} + +\definesystemattribute [graphicvadjust] [public] + \let\normalvadjust\vadjust -\def\graphicvadjust % nasty bidi handling - {\dowithnextboxcontent +\def\enablegraphicvadjust + {\ctxlua{nodes.tasks.enableaction("finalizers","nodes.handlers.graphicvadjust")}% + \glet\enablegraphicvadjust\relax} + +\def\graphicvadjust % currently not enabled; nasty bidi handling + {\enablegraphicvadjust + \dowithnextboxcontent {\forgetall} {\vadjust{\vbox attr \graphicvadjustattribute \plusone {\unvbox\nextbox diff --git a/tex/context/base/spac-ver.lua b/tex/context/base/spac-ver.lua index ecd5139fa..a734c5f38 100644 --- a/tex/context/base/spac-ver.lua +++ b/tex/context/base/spac-ver.lua @@ -1267,68 +1267,7 @@ end -- We will split this module so a few locals are repeated. Also this will be -- rewritten. -local attribute = attributes.private('graphicvadjust') - -local nodecodes = nodes.nodecodes - -local hlist_code = nodecodes.hlist -local vlist_code = nodecodes.vlist - -local remove_node = nodes.remove -local hpack_node = node.hpack -local vpack_node = node.vpack -local has_attribute = node.has_attribute - -function nodes.handlers.graphicvadjust(head,groupcode) -- we can make an actionchain for mvl only - if groupcode == "" then -- mvl only - local h, p, done = head, nil, false - while h do - local id = h.id - if id == hlist_code or id == vlist_code then - local a = has_attribute(h,attribute) - if a then - if p then - local n - head, h, n = remove_node(head,h) - local pl = p.list - if n.width ~= 0 then - n = hpack_node(n,0,'exactly') -- todo: dir - end - if pl then - pl.prev = n - n.next = pl - end - p.list = n - done = true - else - -- can't happen - end - else - p = h - h = h.next - end - else - h = h.next - end - end - return head, done - else - return head, false - end -end - ---~ function nodes.handlers.graphicvadjust(head,groupcode) -- we can make an actionchain for mvl only ---~ if groupcode == "" then -- mvl only ---~ return head, false ---~ else ---~ return head, false ---~ end ---~ end - ---~ nodes.tasks.appendaction("finalizers", "lists", "nodes.handlers.graphicvadjust") - nodes.builders = nodes.builder or { } - local builders = nodes.builders local actions = nodes.tasks.actions("vboxbuilders") diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf Binary files differindex 381b78431..bb84d7da8 100644 --- a/tex/context/base/status-files.pdf +++ b/tex/context/base/status-files.pdf diff --git a/tex/context/base/strc-des.mkiv b/tex/context/base/strc-des.mkiv index 4407e32ea..9cca5e8d4 100644 --- a/tex/context/base/strc-des.mkiv +++ b/tex/context/base/strc-des.mkiv @@ -241,10 +241,10 @@ \nobreak \@@dodescription} -\def\do@@description#1% +\def\do@@description#1% temp hack, the scope {\def\\{\crlf}% \noindent - #1{\ifhbox\descriptionheadbox\unhcopy\else\copy\fi\descriptionheadbox}% + #1[\c!scope=\v!local]{\ifhbox\descriptionheadbox\unhcopy\else\copy\fi\descriptionheadbox}% \@@dodescription} \setvalue{@@description\v!inmargin }{\do@@description\inmargin} diff --git a/tex/context/base/strc-doc.mkiv b/tex/context/base/strc-doc.mkiv index 2d05bf04d..0942de4c3 100644 --- a/tex/context/base/strc-doc.mkiv +++ b/tex/context/base/strc-doc.mkiv @@ -22,7 +22,7 @@ % We operate in a \type {@@ns} namespace. All data is passed through % variables. Of course we can built another interface on top of this % that accepts multiple arguments. We might change this approach and -% remove this layer. +% remove this layer but it was needed for the transition. \def\currentstructurecounter{0} @@ -36,10 +36,23 @@ \getparameters % initialization, used not grouped anyway [\??ns] - [\c!number=,\c!level=,\c!name=,\c!title=,\c!bookmark=,\c!marking=,\c!list=,\c!label=,\c!coupling=,\c!ownnumber=, - \c!sectionseparatorset=\s!default,\c!sectionconversionset=\s!default, - \c!sectionstopper=,\c!sectionstarter=,\c!sectionsegments=, - \c!sectionresetset=,\c!reference=, + [\c!number=, + \c!level=, + \c!name=, + \c!title=, + \c!bookmark=, + \c!marking=, + \c!list=, + \c!label=, + \c!coupling=, + \c!ownnumber=, + \c!sectionseparatorset=\s!default, + \c!sectionconversionset=\s!default, + \c!sectionstopper=, + \c!sectionstarter=, + \c!sectionsegments=, + \c!sectionresetset=, + \c!reference=, \c!expansion=\v!no, \c!xmlsetup=, \s!catcodes=, diff --git a/tex/context/base/strc-sec.mkiv b/tex/context/base/strc-sec.mkiv index c9a5f870f..ee5c0ec65 100644 --- a/tex/context/base/strc-sec.mkiv +++ b/tex/context/base/strc-sec.mkiv @@ -86,21 +86,49 @@ \def\resetcurrentstructuremarks {\resetmarking[\laststructuresectionname]} % will become option %def\resetcurrentstructuremarkswithpage{\resetmarking[\laststructuresectionname]} % will become option +% \c!before=, +% \c!after=, +% \c!distance=\zeropoint, +% \c!page=, +% \c!header=, +% \c!text=, +% \c!footer=, +% \c!numbercommand=, +% \c!textcommand=, +% \c!ownnumber=\v!no, +% \c!number=\v!yes, +% \c!file=, +% \c!expansion=, +% \c!grid=, +% \c!margintext=, +% +% \c!xmlsetup=, +% \s!catcodes=, + +\newtoks\everydefinestructuresection + +\appendtoks + % This is a rather practical default that we don't want to + % be part of the parent chain lookup mechanism; it's also + % mkii compatible. Somewhat weird that it's part of the + % top level structure but it will be flattened anyway. + \getparameters[\??nh\currentstructuresection] + [ \c!textstyle=\structureheadparameterstrict\c!style, + \c!textcolor=\structureheadparameterstrict\c!color, + \c!numberstyle=\structureheadparameterstrict\c!style, + \c!numbercolor=\structureheadparameterstrict\c!color]% +\to \everydefinestructuresection + \unexpanded\def\definestructuresection[#1]% {\ifcsname\??nh#1\endcsname - % rather fatal error + % redefinition is a rather fatal error \else + \edef\currentstructuresection{#1}% \global\advance\maxstructuredepth\plusone \setevalue{\??nh#1\c!level}{\the\maxstructuredepth}% \setstructurelevel{#1}{\the\maxstructuredepth}% \normalexpanded{\noexpand\getparameters[\??nh#1][\s!parent=\??nh\laststructuresectionname]}% - % this is a rather practical default that we don't want to be part of the parent chain - % lookup mechanism; it's also mkii compativle; this might become \everystructureheaddefine - \getparameters[\??nh#1] - [ \c!textstyle=\structureheadparameterstrict\c!style, - \c!textcolor=\structureheadparameterstrict\c!color, - \c!numberstyle=\structureheadparameterstrict\c!style, - \c!numbercolor=\structureheadparameterstrict\c!color]% + \the\everydefinestructuresection % so far for these default inheritances \definemarking[#1]% \ifnum\maxstructuredepth>\plusone @@ -190,15 +218,6 @@ \fi\fi}% \normalexpanded{\noexpand\getparameters[\??nh#1][\s!parent=\??nh\currentstructureheadparent]}% % or just \setevalue{\??nh#1\s!parent}{\??nh\currentstructureheadparent}% -% \ifx\currentstructureheadsection\empty -% \definemarking[#1]% -% \setupmarking[#1][\c!filtercommand=\sectionheadmarkingtitle{#1}]% -% \else -% \definemarking[#1][\currentstructureheadsection]% -% \definemarking[#1\v!number][#1]% -% \setupmarking[#1][\c!filtercommand=\sectionheadmarkingtitle{#1}]% -% \setupmarking[#1\c!number][\c!filtercommand=\sectionheadmarkingnumber{#1}]% -% \fi \definemarking[#1] [\currentstructureheadsection]% \definemarking[#1\v!number][\currentstructureheadsection]% \setupmarking [#1] [\c!filtercommand=\sectionheadmarkingtitle {#1}]% @@ -216,15 +235,12 @@ {\getparameters[\??nh#1][\c!label=#1]% \doifundefined{\??li#1}{\definelist[#1][\c!prefix=\v!no]}}% definestructurelist ? {\getparameters[\??nh#1][\s!parent=\??nh#2,\c!label=#1,\c!coupling=#2]% -% \definemarking[#1] [#2]% -% \definemarking[#1\v!number][#2\c!number]% \definemarking[#1] [#2]% \definemarking[#1\v!number][#2\c!number]% \doifundefined{\??li#1}{\definelist[#1][#2][\c!prefix=\v!no]}}% definestructurelist ? \the\everystructureheadsetup} \appendtoks -% \setstructurelevel\currentstructurehead{\structuresectionheadsection{\structuresectionheadcoupling\currentstructurehead}}% \setstructurelevel\currentstructurehead{\thenamedstructureheadlevel\currentstructurehead}% \doifelse{\structureheadparameter\c!ownnumber}\v!yes {\setevalue\currentstructurehead{\dohandlestructureheadown[\currentstructurehead]}} diff --git a/tex/context/base/supp-dir.mkiv b/tex/context/base/supp-dir.mkiv index 0634bd36f..dce47a178 100644 --- a/tex/context/base/supp-dir.mkiv +++ b/tex/context/base/supp-dir.mkiv @@ -18,6 +18,17 @@ % \expanded{\defineactivecharacter \number"2000E} {\textdir TRT\relax} % \expanded{\defineactivecharacter \number"2000F} {\textdir TLT\relax} +%D As we have less directions now we can use something + +% \chardef\@@D@@TLT0 +% \chardef\@@D@@TRT1 +% \chardef\@@D@@RTT0 +% \chardef\@@D@@LRL1 +% +% \def\thetextdir{\csname @@D@@\the\textdir\endcsname} +% +% \ifnum\thetextdir=0 L\else R\fi \textdir TRT \ifnum\thetextdir=0 L\else R\fi + \unexpanded\def\showdirsinmargin {\doifelse{\the\pardir}\!!TLT {\inleft{\normalexpanded{\noexpand\hbox dir TLT{\ttxx[\the\pardir,\the\textdir]}}}} diff --git a/tex/context/base/tabl-ntb.mkiv b/tex/context/base/tabl-ntb.mkiv index 11acaff9e..dfdf46510 100644 --- a/tex/context/base/tabl-ntb.mkiv +++ b/tex/context/base/tabl-ntb.mkiv @@ -981,7 +981,13 @@ \tblpass\zerocount \tbltoks\emptytoks} -\def\flushtbltoks{\begintbl\the\tbltoks\endtbl} +\newtoks\everyTABLEpass + +\def\flushtbltoks + {\the\everyTABLEpass + \begintbl + \the\tbltoks + \endtbl} \def\domakeTBLone#1 #2 % {\gettbltxt{#1}{#2}}% diff --git a/tex/context/base/task-ini.lua b/tex/context/base/task-ini.lua index a8e60954e..4afdaa034 100644 --- a/tex/context/base/task-ini.lua +++ b/tex/context/base/task-ini.lua @@ -11,130 +11,138 @@ if not modules then modules = { } end modules ['task-ini'] = { -- -- we can disable more handlers and enable then when really used (*) -local tasks = nodes.tasks - -tasks.appendaction("processors", "normalizers", "fonts.collections.process") -- todo -tasks.appendaction("processors", "normalizers", "fonts.checkers.missing") -- disabled - -tasks.appendaction("processors", "characters", "typesetters.cleaners.handler") -- disabled -tasks.appendaction("processors", "characters", "typesetters.directions.handler") -- disabled -tasks.appendaction("processors", "characters", "typesetters.cases.handler") -- disabled -tasks.appendaction("processors", "characters", "typesetters.breakpoints.handler") -- disabled -tasks.appendaction("processors", "characters", "scripts.preprocess") - -tasks.appendaction("processors", "words", "builders.kernel.hyphenation") -- always on -tasks.appendaction("processors", "words", "languages.words.check") -- disabled - -tasks.appendaction("processors", "fonts", "builders.paragraphs.solutions.splitters.split") -- experimental -tasks.appendaction("processors", "fonts", "nodes.handlers.characters") -- maybe todo -tasks.appendaction("processors", "fonts", "nodes.injections.handler") -- maybe todo -tasks.appendaction("processors", "fonts", "nodes.handlers.protectglyphs", nil, "nohead") -- maybe todo -tasks.appendaction("processors", "fonts", "builders.kernel.ligaturing") -- always on -tasks.appendaction("processors", "fonts", "builders.kernel.kerning") -- always on -tasks.appendaction("processors", "fonts", "nodes.handlers.stripping") -- disabled (might move) - -tasks.appendaction("processors", "lists", "typesetters.spacings.handler") -- disabled -tasks.appendaction("processors", "lists", "typesetters.kerns.handler") -- disabled -tasks.appendaction("processors", "lists", "typesetters.digits.handler") -- disabled (after otf handling) - -tasks.appendaction("shipouts", "normalizers", "nodes.handlers.cleanuppage") -- disabled -tasks.appendaction("shipouts", "normalizers", "nodes.references.handler") -- disabled -tasks.appendaction("shipouts", "normalizers", "nodes.destinations.handler") -- disabled -tasks.appendaction("shipouts", "normalizers", "nodes.rules.handler") -- disabled -tasks.appendaction("shipouts", "normalizers", "nodes.shifts.handler") -- disabled -tasks.appendaction("shipouts", "normalizers", "structures.tags.handler") -- disabled -tasks.appendaction("shipouts", "normalizers", "nodes.handlers.accessibility") -- disabled -tasks.appendaction("shipouts", "normalizers", "nodes.handlers.backgrounds") -- disabled - -tasks.appendaction("shipouts", "finishers", "attributes.colors.handler") -- disabled -tasks.appendaction("shipouts", "finishers", "attributes.transparencies.handler") -- disabled -tasks.appendaction("shipouts", "finishers", "attributes.colorintents.handler") -- disabled -tasks.appendaction("shipouts", "finishers", "attributes.negatives.handler") -- disabled -tasks.appendaction("shipouts", "finishers", "attributes.effects.handler") -- disabled -tasks.appendaction("shipouts", "finishers", "attributes.viewerlayers.handler") -- disabled - -tasks.appendaction("math", "normalizers", "noads.handlers.relocate", nil, "nohead") -- always on -tasks.appendaction("math", "normalizers", "noads.handlers.collapse", nil, "nohead") -- always on -tasks.appendaction("math", "normalizers", "noads.handlers.resize", nil, "nohead") -- always on -tasks.appendaction("math", "normalizers", "noads.handlers.respace", nil, "nohead") -- always on -tasks.appendaction("math", "normalizers", "noads.handlers.check", nil, "nohead") -- always on -tasks.appendaction("math", "normalizers", "noads.handlers.tags", nil, "nohead") -- disabled - -tasks.appendaction("math", "builders", "builders.kernel.mlist_to_hlist") -- always on +local tasks = nodes.tasks +local appendaction = tasks.appendaction +local disableaction = tasks.disableaction +local freezegroup = tasks.freezegroup +local freezecallbacks = callbacks.freeze + +appendaction("processors", "normalizers", "fonts.collections.process") -- todo +appendaction("processors", "normalizers", "fonts.checkers.missing") -- disabled + +appendaction("processors", "characters", "typesetters.cleaners.handler") -- disabled +appendaction("processors", "characters", "typesetters.directions.handler") -- disabled +appendaction("processors", "characters", "typesetters.cases.handler") -- disabled +appendaction("processors", "characters", "typesetters.breakpoints.handler") -- disabled +appendaction("processors", "characters", "scripts.preprocess") + +appendaction("processors", "words", "builders.kernel.hyphenation") -- always on +appendaction("processors", "words", "languages.words.check") -- disabled + +appendaction("processors", "fonts", "builders.paragraphs.solutions.splitters.split") -- experimental +appendaction("processors", "fonts", "nodes.handlers.characters") -- maybe todo +appendaction("processors", "fonts", "nodes.injections.handler") -- maybe todo +appendaction("processors", "fonts", "nodes.handlers.protectglyphs", nil, "nohead") -- maybe todo +appendaction("processors", "fonts", "builders.kernel.ligaturing") -- always on +appendaction("processors", "fonts", "builders.kernel.kerning") -- always on +appendaction("processors", "fonts", "nodes.handlers.stripping") -- disabled (might move) + +appendaction("processors", "lists", "typesetters.spacings.handler") -- disabled +appendaction("processors", "lists", "typesetters.kerns.handler") -- disabled +appendaction("processors", "lists", "typesetters.digits.handler") -- disabled (after otf handling) + +appendaction("shipouts", "normalizers", "nodes.handlers.cleanuppage") -- disabled +appendaction("shipouts", "normalizers", "typesetters.alignments.handler") +appendaction("shipouts", "normalizers", "nodes.references.handler") -- disabled +appendaction("shipouts", "normalizers", "nodes.destinations.handler") -- disabled +appendaction("shipouts", "normalizers", "nodes.rules.handler") -- disabled +appendaction("shipouts", "normalizers", "nodes.shifts.handler") -- disabled +appendaction("shipouts", "normalizers", "structures.tags.handler") -- disabled +appendaction("shipouts", "normalizers", "nodes.handlers.accessibility") -- disabled +appendaction("shipouts", "normalizers", "nodes.handlers.backgrounds") -- disabled + +appendaction("shipouts", "finishers", "attributes.colors.handler") -- disabled +appendaction("shipouts", "finishers", "attributes.transparencies.handler") -- disabled +appendaction("shipouts", "finishers", "attributes.colorintents.handler") -- disabled +appendaction("shipouts", "finishers", "attributes.negatives.handler") -- disabled +appendaction("shipouts", "finishers", "attributes.effects.handler") -- disabled +appendaction("shipouts", "finishers", "attributes.viewerlayers.handler") -- disabled + +appendaction("math", "normalizers", "noads.handlers.relocate", nil, "nohead") -- always on +appendaction("math", "normalizers", "noads.handlers.collapse", nil, "nohead") -- always on +appendaction("math", "normalizers", "noads.handlers.resize", nil, "nohead") -- always on +appendaction("math", "normalizers", "noads.handlers.respace", nil, "nohead") -- always on +appendaction("math", "normalizers", "noads.handlers.check", nil, "nohead") -- always on +appendaction("math", "normalizers", "noads.handlers.tags", nil, "nohead") -- disabled + +appendaction("math", "builders", "builders.kernel.mlist_to_hlist") -- always on -- quite experimental (nodes.handlers.graphicvadjust might go away) -tasks.appendaction("finalizers", "lists", "nodes.handlers.graphicvadjust") -- todo -tasks.appendaction("finalizers", "fonts", "builders.paragraphs.solutions.splitters.optimize") -- experimental +appendaction("finalizers", "lists", "nodes.handlers.graphicvadjust") -- todo +appendaction("finalizers", "fonts", "builders.paragraphs.solutions.splitters.optimize") -- experimental -- rather new -tasks.appendaction("mvlbuilders", "normalizers", "nodes.handlers.migrate") -- -tasks.appendaction("mvlbuilders", "normalizers", "builders.vspacing.pagehandler") -- last ! +appendaction("mvlbuilders", "normalizers", "nodes.handlers.migrate") -- +appendaction("mvlbuilders", "normalizers", "builders.vspacing.pagehandler") -- last ! -tasks.appendaction("vboxbuilders", "normalizers", "builders.vspacing.vboxhandler") -- +appendaction("vboxbuilders", "normalizers", "builders.vspacing.vboxhandler") -- -- speedup: only kick in when used -tasks.disableaction("processors", "fonts.checkers.missing") -tasks.disableaction("processors", "chars.handle_breakpoints") -tasks.disableaction("processors", "typesetters.cleaners.handler") -tasks.disableaction("processors", "typesetters.cases.handler") -tasks.disableaction("processors", "typesetters.digits.handler") -tasks.disableaction("processors", "typesetters.breakpoints.handler") -tasks.disableaction("processors", "typesetters.directions.handler") -tasks.disableaction("processors", "languages.words.check") -tasks.disableaction("processors", "typesetters.spacings.handler") -tasks.disableaction("processors", "typesetters.kerns.handler") -tasks.disableaction("processors", "nodes.handlers.stripping") - -tasks.disableaction("shipouts", "nodes.rules.handler") -tasks.disableaction("shipouts", "nodes.shifts.handler") -tasks.disableaction("shipouts", "attributes.colors.handler") -tasks.disableaction("shipouts", "attributes.transparencies.handler") -tasks.disableaction("shipouts", "attributes.colorintents.handler") -tasks.disableaction("shipouts", "attributes.effects.handler") -tasks.disableaction("shipouts", "attributes.negatives.handler") -tasks.disableaction("shipouts", "attributes.viewerlayers.handler") -tasks.disableaction("shipouts", "structures.tags.handler") -tasks.disableaction("shipouts", "nodes.handlers.accessibility") -tasks.disableaction("shipouts", "nodes.handlers.backgrounds") -tasks.disableaction("shipouts", "nodes.handlers.cleanuppage") - -tasks.disableaction("shipouts", "nodes.references.handler") -tasks.disableaction("shipouts", "nodes.destinations.handler") - -tasks.disableaction("mvlbuilders", "nodes.handlers.migrate") - -tasks.disableaction("processors", "builders.paragraphs.solutions.splitters.split") -tasks.disableaction("finalizers", "builders.paragraphs.solutions.splitters.optimize") - -tasks.disableaction("math", "noads.handlers.tags") - -callbacks.freeze("find_.*_file", "find file using resolver") -callbacks.freeze("read_.*_file", "read file at once") -callbacks.freeze("open_.*_file", "open file for reading") +disableaction("processors", "fonts.checkers.missing") +disableaction("processors", "chars.handle_breakpoints") +disableaction("processors", "typesetters.cleaners.handler") +disableaction("processors", "typesetters.cases.handler") +disableaction("processors", "typesetters.digits.handler") +disableaction("processors", "typesetters.breakpoints.handler") +disableaction("processors", "typesetters.directions.handler") +disableaction("processors", "languages.words.check") +disableaction("processors", "typesetters.spacings.handler") +disableaction("processors", "typesetters.kerns.handler") +disableaction("processors", "nodes.handlers.stripping") + +disableaction("shipouts", "typesetters.alignments.handler") +disableaction("shipouts", "nodes.rules.handler") +disableaction("shipouts", "nodes.shifts.handler") +disableaction("shipouts", "attributes.colors.handler") +disableaction("shipouts", "attributes.transparencies.handler") +disableaction("shipouts", "attributes.colorintents.handler") +disableaction("shipouts", "attributes.effects.handler") +disableaction("shipouts", "attributes.negatives.handler") +disableaction("shipouts", "attributes.viewerlayers.handler") +disableaction("shipouts", "structures.tags.handler") +disableaction("shipouts", "nodes.handlers.accessibility") +disableaction("shipouts", "nodes.handlers.backgrounds") +disableaction("shipouts", "nodes.handlers.cleanuppage") + +disableaction("shipouts", "nodes.references.handler") +disableaction("shipouts", "nodes.destinations.handler") + +disableaction("mvlbuilders", "nodes.handlers.migrate") + +disableaction("processors", "builders.paragraphs.solutions.splitters.split") + +disableaction("finalizers", "builders.paragraphs.solutions.splitters.optimize") +disableaction("finalizers", "nodes.handlers.graphicvadjust") -- sort of obsolete + +disableaction("math", "noads.handlers.tags") + +freezecallbacks("find_.*_file", "find file using resolver") +freezecallbacks("read_.*_file", "read file at once") +freezecallbacks("open_.*_file", "open file for reading") -- experimental: -tasks.freezegroup("processors", "normalizers") -tasks.freezegroup("processors", "characters") -tasks.freezegroup("processors", "words") -tasks.freezegroup("processors", "fonts") -tasks.freezegroup("processors", "lists") +freezegroup("processors", "normalizers") +freezegroup("processors", "characters") +freezegroup("processors", "words") +freezegroup("processors", "fonts") +freezegroup("processors", "lists") -tasks.freezegroup("finalizers", "normalizers") -tasks.freezegroup("finalizers", "fonts") -tasks.freezegroup("finalizers", "lists") +freezegroup("finalizers", "normalizers") +freezegroup("finalizers", "fonts") +freezegroup("finalizers", "lists") -tasks.freezegroup("shipouts", "normalizers") -tasks.freezegroup("shipouts", "finishers") +freezegroup("shipouts", "normalizers") +freezegroup("shipouts", "finishers") -tasks.freezegroup("mvlbuilders", "normalizers") -tasks.freezegroup("vboxbuilders", "normalizers") +freezegroup("mvlbuilders", "normalizers") +freezegroup("vboxbuilders", "normalizers") ---~ tasks.freezegroup("parbuilders", "lists") ---~ tasks.freezegroup("pagebuilders", "lists") +--~ freezegroup("parbuilders", "lists") +--~ freezegroup("pagebuilders", "lists") -tasks.freezegroup("math", "normalizers") -tasks.freezegroup("math", "builders") +freezegroup("math", "normalizers") +freezegroup("math", "builders") diff --git a/tex/context/base/trac-set.lua b/tex/context/base/trac-set.lua index 7eb92bfa6..6eeb2f1d5 100644 --- a/tex/context/base/trac-set.lua +++ b/tex/context/base/trac-set.lua @@ -154,6 +154,7 @@ function setters.register(t,what,...) end end end + return false -- so we can use it in an assignment end function setters.enable(t,what) diff --git a/tex/context/base/typo-brk.lua b/tex/context/base/typo-brk.lua index afea669ca..d26f62a07 100644 --- a/tex/context/base/typo-brk.lua +++ b/tex/context/base/typo-brk.lua @@ -29,7 +29,7 @@ local free_node = node.free local insert_node_before = node.insert_before local insert_node_after = node.insert_after local remove_node = nodes.remove -- ! nodes -local tonodes = blobs.tonodes +local link_nodes = nodes.link local texattribute = tex.attribute @@ -152,7 +152,9 @@ methods[5] = function(head,start,settings) -- x => p q r head, start = insert_node_before(head,start,new_disc()) local attr = tmp.attr start.attr = copy_nodelist(attr) -- todo: critical only - start.pre, start.post, start.replace = tonodes(settings.right,tmp,attr), tonodes(settings.left,tmp,attr), tonodes(settings.middle,tmp,attr) + start.pre = link_nodes(settings.right,tmp,attr) + start.post = link_nodes(settings.left,tmp,attr) + start.replace = link_nodes(settings.middle,tmp,attr) free_node(tmp) insert_break(head,start,10000,10000) end diff --git a/tex/context/base/typo-mar.lua b/tex/context/base/typo-mar.lua new file mode 100644 index 000000000..47734b3ee --- /dev/null +++ b/tex/context/base/typo-mar.lua @@ -0,0 +1,568 @@ +if not modules then modules = { } end modules ['typo-mar'] = { + version = 1.001, + comment = "companion to typo-mar.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local format = string.format +local insert, remove = table.insert, table.remove +local setmetatable, next = setmetatable, next + +local attributes, nodes, node, variables = attributes, nodes, node, variables + +local trace_margindata = false trackers.register("typesetters.margindata", function(v) trace_margindata = v end) + +local report_margindata = logs.reporter("typesetters","margindata") + +local tasks = nodes.tasks +local prependaction = tasks.prependaction +local disableaction = tasks.disableaction +local enableaction = tasks.enableaction + +local variables = interfaces.variables + +local conditionals = tex.conditionals + +local v_top = variables.top +local v_depth = variables.depth +local v_local = variables["local"] +local v_global = variables["global"] +local v_left = variables.left +local v_right = variables.right +local v_flushleft = variables.flushleft +local v_flushright = variables.flushright +local v_inner = variables.inner +local v_outer = variables.outer +local v_margin = variables.margin +local v_edge = variables.edge +local v_default = variables.default +local v_normal = variables.normal +local v_yes = variables.yes +local v_first = variables.first + +local has_attribute = node.has_attribute +local set_attribute = node.set_attribute +local unset_attribute = node.unset_attribute +local copy_node_list = node.copy_list +local slide_nodes = node.slide +local hpack_nodes = node.hpack -- nodes.fasthpack not really faster here +local traverse_id = node.traverse_id +local free_node_list = node.free_list + +local link_nodes = nodes.link + +local nodecodes = nodes.nodecodes +local listcodes = nodes.listcodes +local gluecodes = nodes.gluecodes +local whatsitcodes = nodes.whatsitcodes + +local hlist_code = nodecodes.hlist +local vlist_code = nodecodes.vlist +local glue_code = nodecodes.glue +local whatsit_code = nodecodes.whatsit +local line_code = listcodes.line +local leftskip_code = gluecodes.leftskip +local rightskip_code = gluecodes.rightskip +local userdefined_code = whatsitcodes.userdefined + +local nodepool = nodes.pool + +local new_kern = nodepool.kern +local new_stretch = nodepool.stretch +local new_usernumber = nodepool.usernumber + +local texcount = tex.count +local texdimen = tex.dimen +local texbox = tex.box + +local isleftpage = layouts.status.isleftpage + +local a_margindata = attributes.private("margindata") + +local inline_mark = nodepool.userids["margins.inline"] + +local margins = { } +typesetters.margins = margins + +local locations = { v_left, v_right, v_inner, v_outer } -- order might change +local categories = { } +local displaystore = { } -- [category][location][scope] +local inlinestore = { } -- [number] +local nofsaved = 0 +local nofstored = 0 +local nofinlined = 0 +local nofdelayed = 0 + +local mt1 = { + __index = function(t,location) + local v = { [v_local] = { }, [v_global] = { } } + t[location] = v + return v + end +} + +local mt2 = { + __index = function(stores,category) + categories[#categories+1] = category + local v = { } + setmetatable(v,mt1) + stores[category] = v + return v + end +} + +setmetatable(displaystore,mt2) + +local defaults = { + __index = { + location = v_left, + align = v_normal, + method = "", + name = "", + threshold = 0, -- .25ex + margin = v_normal, + scope = v_global, + distance = 0, + hoffset = 0, + voffset = 0, + category = v_default, + line = 0, + vstack = 0, + dy = 0, + baseline = false, + inline = false, + } +} + +local enablelocal, enableglobal -- forward reference (delayed initialization) + +function margins.save(t) + setmetatable(t,defaults) + local inline = t.inline + local location = t.location + local category = t.category + local scope = t.scope + local store + if inline then + store = inlinestore + else + store = displaystore[category][location] + if not store then + report_margindata("invalid location: %s",location) + return + end + store = store[scope] + end + if not store then + report_margindata("invalid scope: %s",scope) + return + end + if enablelocal and scope == "local" then + enablelocal() + end + if enableglobal and scope == "global" then + enableglobal() + end + nofsaved = nofsaved + 1 + nofstored = nofstored + 1 + local name = t.name + if name and name ~= "" then + for i=#store,1,-1 do + local si = store[i] + if si.name == name then + local s = remove(store,i) + free_node_list(s.box) + end + end + end + -- better make a new table and make t entry in t + t.box = copy_node_list(texbox[t.number]) + t.n = nofsaved + -- used later (we will clean up this natural mess later) + -- nice is to make a special status table mechanism + local leftmargindistance = texdimen.naturalleftmargindistance + local rightmargindistance = texdimen.naturalrightmargindistance + t.strutdepth = texbox.strutbox.depth + t.strutheight = texbox.strutbox.height + t.leftskip = tex.leftskip.width + t.rightskip = tex.rightskip.width + t.leftmargindistance = leftmargindistance + t.rightmargindistance = rightmargindistance + t.leftedgedistance = texdimen.naturalleftedgedistance + + texdimen.leftmarginwidth + + leftmargindistance + t.rightedgedistance = texdimen.naturalrightedgedistance + + texdimen.rightmarginwidth + + rightmargindistance + t.lineheight = texdimen.lineheight + -- + -- t.realpageno = texcount.realpageno + if inline then + context(new_usernumber(inline_mark,nofsaved)) + store[nofsaved] = t -- no insert + nofinlined = nofinlined + 1 + else + insert(store,t) + end + if trace_margindata then + report_margindata("saved: %s, location: %s, scope: %s, inline: %s",nofsaved,location,scope,tostring(inline)) + end +end + +-- Actually it's an advantage to have them all anchored left (tags and such) +-- we could keep them in store and flush in stage two but we might want to +-- do more before that so we need the content to be there unless we can be +-- sure that we flush this first which might not be the case in the future. +-- +-- When the prototype inner/outer code that was part of this proved to be +-- okay it was moved elsewhere. + +local status, nofstatus = { }, 0 + +local function realign(current,candidate) + local location = candidate.location + local margin = candidate.margin + local hoffset = candidate.hoffset + local distance = candidate.distance + local hsize = candidate.hsize + local width = candidate.width + local align = candidate.align + -- local realpageno = candidate.realpageno + local leftpage = isleftpage(false,true) + local delta = 0 + local leftdelta = 0 + local rightdelta = 0 + local leftdistance = distance + local rightdistance = distance + if margin == v_normal then + -- + elseif margin == v_local then + leftdelta = - candidate.leftskip + rightdelta = candidate.rightskip + elseif margin == v_margin then + leftdistance = candidate.leftmargindistance + rightdistance = candidate.rightmargindistance + elseif margin == v_edge then + leftdistance = candidate.leftedgedistance + rightdistance = candidate.rightedgedistance + end + if leftpage then + leftdistance, rightdistance = rightdistance, leftdistance + end + if location == v_left then + delta = hoffset + width + leftdistance + leftdelta + elseif location == v_right then + delta = -hoffset - hsize - rightdistance + rightdelta + elseif location == v_inner then + if leftpage then + delta = -hoffset - hsize - rightdistance + rightdelta + else + delta = hoffset + width + leftdistance + leftdelta + end + elseif location == v_outer then + if leftpage then + delta = hoffset + width + leftdistance + leftdelta + else + delta = -hoffset - hsize - rightdistance + rightdelta + end + end + -- we assume that list is a hbox, otherwise we had to take the whole current + -- in order to get it right + current.width = 0 + current.list = hpack_nodes(link_nodes(new_kern(-delta),current.list,new_kern(delta))) + current.width = 0 + if trace_margindata then + report_margindata("realigned: %s, location: %s, margin: %s",candidate.n,location,margin) + end +end + +local function realigned(current,a) + local candidate = status[a] + realign(current,candidate) + nofdelayed = nofdelayed - 1 + status[a] = nil + return true +end + +local stacked = { } + +local function resetstacked() + for i=1,#locations do + stacked[locations[i]] = false + end +end + +resetstacked() + +local function inject(parent,head,candidate) + local box = candidate.box + local width = box.width + local height = box.height + local depth = box.depth + local shift = box.shift + local stack = candidate.stack + local location = candidate.location + local method = candidate.method + local voffset = candidate.voffset + local line = candidate.line + local baseline = candidate.baseline + local offset = stacked[location] + local firstonstack = offset == false + nofstatus = nofstatus + 1 + nofdelayed = nofdelayed + 1 + status[nofstatus] = candidate + -- yet untested + if baseline == true then + baseline = false + -- hbox vtop +--~ for h in traverse_id(hlist_code,box.list.list) do +--~ baseline = h.height +--~ break +--~ end + end + candidate.width = width + candidate.hsize = parent.width -- we can also pass textwidth + if firstonstack then + offset = 0 + else + offset = offset + height + end + if stack == v_yes then + offset = offset + candidate.dy + shift = shift + offset + end + -- -- -- + -- Maybe we also need to patch offset when we apply methods, but how ... + -- This needs a bit of playing as it depends on the stack setting of the + -- following which we don't know yet ... so, consider stacking partially + -- experimental. + -- -- -- + if method == v_top then + local delta = height - parent.height + if trace_margindata then + report_margindata("top aligned: %s, amount: %s",candidate.n,delta) + end + if delta < candidate.threshold then + shift = shift + voffset + delta + end + elseif method == v_first then + if baseline then + shift = shift + voffset + height - baseline -- option + else + shift = shift + voffset -- normal + end + elseif method == v_depth then + local delta = candidate.strutdepth + if trace_margindata then + report_margindata("depth aligned, amount: %s",candidate.n,delta) + end + shift = shift + voffset + delta + elseif method == v_height then + local delta = - candidate.strutheight + if trace_margindata then + report_margindata("height aligned, amount: %s",candidate.n,delta) + end + shift = shift + voffset + delta + elseif voffset ~= 0 then + shift = shift + voffset + end + -- -- -- + if line ~= 0 then + local delta = line * candidate.lineheight + shift = shift + delta +offset = offset + delta + end + box.shift = shift + box.width = 0 + if head then + head.prev = box + box.next = head + end + head = box + set_attribute(box,a_margindata,nofstatus) + if trace_margindata then + report_margindata("injected: %s, location: %s",candidate.n,location) + end + -- we need to add line etc to offset as well + offset = offset + depth + stacked[location] = offset + return head +end + +local function flushinline(parent,head,done) + local current = head + while current and nofinlined > 0 do + local id = current.id + if id == whatsit_code then + if current.subtype == userdefined_code and current.user_id == inline_mark then + local n = current.value + local candidate = inlinestore[n] + if candidate then -- no vpack, as we want to realign + inlinestore[n] = nil + nofinlined = nofinlined - 1 + head = inject(parent,head,candidate) -- maybe return applied offset + done = true + nofstored = nofstored - 1 + end + end + elseif id == hlist_code or id == vlist_code then + -- optional + end + current = current.next + end + return head, done +end + +local function flushed(scope,parent) -- current is hlist + local done = false + local head = parent.list + for c=1,#categories do + local category = categories[c] + for l=1,#locations do + local location = locations[l] + local store = displaystore[category][location][scope] + while true do + local candidate = remove(store,1) + if candidate then -- no vpack, as we want to realign + head = inject(parent,head,candidate) -- maybe return applied offset + done = true + nofstored = nofstored - 1 + else + break + end + end + end + end + if nofinlined > 0 then + if done then + parent.list = head + end + head, done = flushinline(parent,head,false) + end + if done then + parent.list = hpack_nodes(head,parent.width,"exactly") + resetstacked() + end + return done +end + +-- only when group : vbox|vmode_par +-- only when subtype : line, box (no indent alignment cell) + +local function handler(scope,head,group) + if nofstored > 0 then + -- if trace_margindata then + -- report_margindata("flushing stage one, stored: %s, scope: %s, delayed: %s, group: %s",nofstored,scope,nofdelayed,group) + -- end + local current = head + local done = false + while current do + local id = current.id + if (id == vlist_code or id == hlist_code) and not has_attribute(current,a_margindata) then + if flushed(scope,current) then + set_attribute(current,a_margindata,0) -- signal to prevent duplicate processing + if nofstored <= 0 then + break + end + done = true + end + end + current = current.next + end + return head, done + else + return head, false + end +end + +function margins.localhandler(head,group) + if conditionals.inhibitmargindata then + return head, false + elseif nofstored > 0 then + return handler("local",head,group) + else + return head, false + end +end + +function margins.globalhandler(head,group) +--~ print(group) + if conditionals.inhibitmargindata then + return head, false + elseif nofstored > 0 and group == "hmode_par" then + return handler("global",head,group) + else + return head, false + end +end + +local function finalhandler(head) + if nofdelayed > 0 then + local current = head + local done = false + while current do + local id = current.id + if id == hlist_code then + local a = has_attribute(current,a_margindata) + if not a or a == 0 then + finalhandler(current.list) + elseif realigned(current,a) then + done = true + if nofdelayed == 0 then + return head, true + end + end + elseif id == vlist_code then + finalhandler(current.list) + end + current = current.next + end + return head, done + else + return head, false + end +end + +function margins.finalhandler(head) + if nofdelayed > 0 then + -- if trace_margindata then + -- report_margindata("flushing stage two, instore: %s, delayed: %s",nofstored,nofdelayed) + -- end + return finalhandler(head) + else + return head, false + end +end + +prependaction("finalizers", "lists", "typesetters.margins.localhandler") +prependaction("vboxbuilders", "normalizers", "typesetters.margins.localhandler") +prependaction("mvlbuilders", "normalizers", "typesetters.margins.globalhandler") +prependaction("shipouts", "normalizers", "typesetters.margins.finalhandler") + +disableaction("finalizers", "typesetters.margins.localhandler") +disableaction("vboxbuilders", "typesetters.margins.localhandler") +disableaction("mvlbuilders", "typesetters.margins.globalhandler") +disableaction("shipouts", "typesetters.margins.finalhandler") + +enablelocal = function() + enableaction("finalizers", "typesetters.margins.localhandler") + enableaction("vboxbuilders", "typesetters.margins.localhandler") + enableaction("shipouts", "typesetters.margins.finalhandler") + enablelocal = nil +end + +enableglobal = function() + enableaction("mvlbuilders", "typesetters.margins.globalhandler") + enableaction("shipouts", "typesetters.margins.finalhandler") + enableglobal = nil +end + +statistics.register("margin data", function() + if nofsaved > 0 then + return string.format("%s entries, %s pending",nofsaved,nofdelayed) + else + return nil + end +end) diff --git a/tex/context/base/typo-mar.mkiv b/tex/context/base/typo-mar.mkiv new file mode 100644 index 000000000..4d122204e --- /dev/null +++ b/tex/context/base/typo-mar.mkiv @@ -0,0 +1,351 @@ +% macros=mkvi + +%D \module +%D [ file=typo-mar, +%D version=2010.02.15, % was experimental code +%D title=\CONTEXT\ Typesetting Macros, +%D subtitle=Margindata, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright=\PRAGMA] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +% todo: tags + +\writestatus{loading}{ConTeXt Typesetting Macros / Margindata} + +\unprotect + +%D This module has been on the agenda for a while. Actually, it is +%D one of the things that I really need myself, for instance when +%D rendering rather unpredictable (educational) tests encoded in +%D XML. This module permits anchoring for instance item numbers and +%D also overload them when they have subnumbers. In the future it +%D might replace the current maginal note mechanism (that then +%D will be just an instance). +%D +%D In spite of what might be expected, the more advanced \LUA\ based +%D variant is upto twice as fast on simple entries. Also, we no longer +%D need an extra pass to get inner and outer alignments in sync with +%D the pagebuilder. + +\registerctxluafile{typo-mar}{1.001} + +%definesystemattribute[margindata] % only at the lua end + +%D In \MKII\ we have three categories and their historically meaning +%D is as follows: +%D +%D marginlines: These are flushed relative to the start of a line and +%D need to be invoked there. +%D +%D marginwords: These can be issued in the text flow and will migrate +%D sidewards; in spite of the name, it can be a paragraph of text as +%D well, but normally it's words. +%D +%D margintexts: These can be set beforehand and are flushed at the +%D next paragraph of text (of header). +%D +%D In \MKIV\ we have further integrated the mechanism and we now have: +%D +%D margindata: This can be anything that needs to go into the margin. +%D It can be anchored in the text or given beforehand in which case +%D it gets flushed at the first occasion. +%D +%D margintext: This runs on top of margindata and the only difference +%D is that it uses the framed mechanism for packaging. +%D +%D Stacking is done differently as is inner and outer alignment (in +%D most cases more efficient). The functionality is mostly the same +%D as in \MKII, but there are a few additions, like names entries, +%D where later ones overload preceding not yet flushed ones. Data can +%D get catagorized and is then treated as a group (e.g. when stacking +%D is needed). +%D +%D The amount of \TEX\ code is less than in \MKII\ because we do all +%D trickery in at the \LUA\ end. At the end of this file we define +%D several commands, like \type {\inleftmargin} and \type {\inleft}. +%D You can configure them individually or as a group. There is an +%D inheritance model in place. +%D +%D The following notes will be stacked: +%D +%D \starttyping +%D \ininner[line=2]{IM A} +%D \ininner[stack=yes]{IM B} +%D \ininner[stack=yes]{IM C} +%D \stoptyping +%D +%D The distance between them is determined by \type {dy}: +%D +%D \starttyping +%D \ininner[stack=yes,dy=2ex][frame=on] {IM A} +%D \ininner[stack=yes,dy=2ex][frame=on] {IM B} +%D \stoptyping +%D +%D There are several methods of vertical alignment. +%D +%D \starttyping +%D \inmargin [method=first] [frame=on] {first\\second} \input ward \par +%D \inmargin [method=first] [frame=on,offset=3pt] {first\\second} \input ward \par +%D \inmargin [method=first,voffset=-3pt][frame=on,offset=3pt,rulethickness=3pt] {first\\second} \input ward \par +%D \inmargin [method=first,voffset=-6pt][frame=on,offset=3pt,rulethickness=3pt] {first\\second} \input ward \par +%D \stoptyping +%D +%D You sometimes need to combine \type {voffset} with \type {offset}. The first +%D argument concerns the data, the second the framed. Not sharing the setup is +%D on purpose: location, offset, alignment and other parameters might clash. + +\def\??mc{@@mc} % margincategory +\def\??mf{@@mf} % marginframed + +\installcommandhandler\??mc{margindata}\??mc +\installcommandhandler\??mf{marginframed}\??mf + +\setupmargindata + [\c!location=\v!left, + % \c!align=, + % \c!method=, + \c!style=\v!bold, + \c!color=, % maybe textcolor + % \c!name=, + % \c!category=, + \c!threshold=.25ex, + \c!margin=\v!normal, + \c!scope=\v!global, + \c!width=, + % \c!stack=, + \c!line=0, + \c!dy=\zeropoint, + \c!distance=\zeropoint, + \c!hoffset=\zeropoint, + \c!voffset=\zeropoint] + +\setupmarginframed % so, align should be set with the data command + [\c!strut=\v!yes, + \c!offset=\v!overlay, + \c!fr!analyze=\v!yes, + \c!frame=\v!off, + \c!width=\margindataparameter\c!width, + \c!align=\margindataparameter\c!align] + +\appendtoks + \setuevalue\currentmargindata{\margindata[\currentmargindata]}% +\to \everydefinemargindata + +\newconditional\inhibitmargindata % This one is used at the Lua end! +\newtoks \everymargindatacontent % Later on we will set this one. + +\unexpanded\def\margindata[#name]% + {\setfalse\inhibitmargindata % flushing afterwards + \begingroup + %\settrue\inhibitmargindata % no flushing in here + \def\currentmargindata{#name}% + \dodoubleempty\domargindata} + +\appendtoks + \settrue\inhibitmargindata +\to \everyforgetall + +% option test -> ruled + +\appendtoks + \forgetall + \tf + \deactivatecolor +\to \everymargindatacontent + +\unexpanded\def\domargindata[#dataparameters][#textparameters]#content% + {\iffirstargument + \setupmargindata[\currentmargindata][#dataparameters]% + \fi + \edef\currentmargindatastrut{\margindataparameter\c!strut}% + \the\everymargindatacontent + \dostarttagged\t!margintext\currentmargindata + \ifcsname\??mf\currentmargindata\s!parent\endcsname + \setbox\nextbox\hbox\bgroup + \the\everymargindatacontent + \dosetmargindataattributes\c!style\c!color + \localframedwithsettings[\??mf\currentmargindata][\c!location=\v!normal,#textparameters]\bgroup + \ifx\currentmargindatastrut\empty \else + \dosetupstrut[\currentmargindatastrut]% + \fi + \begstrut\margindataparameter\c!command{#content}\endstrut + \egroup + \egroup + \edef\currentmarginfirstheight{\number\dimexpr\framedfirstheight}% + \else + \edef\currentmargindatawidth{\margindataparameter\c!width}% + \ifx\currentmargindatawidth\empty + \setbox\nextbox\hbox\bgroup + \the\everymargindatacontent + \dosetmargindataattributes\c!style\c!color + \ifx\currentmargindatastrut\empty \else + \dosetupstrut[\currentmargindatastrut]% + \fi + \begstrut\margindataparameter\c!command{#content}\endstrut + \egroup + \let\currentmarginfirstheight\empty + \else + \dosetraggedcommand{\margindataparameter\c!align}% + \setbox\nextbox\hbox \bgroup\vtop \bgroup % hbox is needed + \the\everymargindatacontent + \dosetmargindataattributes\c!style\c!color + \hsize\currentmargindatawidth + \raggedcommand + \ifx\currentmargindatastrut\empty \else + \dosetupstrut[\currentmargindatastrut]% + \fi + \begstrut\margindataparameter\c!command{#content}\endstrut + \egroup \egroup + \edef\currentmarginfirstheight{true}% + \fi + \fi + \dostoptagged + \ctxlua{typesetters.margins.save{ + \c!location = "\margindataparameter\c!location", + \c!method = "\margindataparameter\c!method", + \c!category = "\margindataparameter\c!category", + \c!name = "\margindataparameter\c!name", + \c!margin = "\margindataparameter\c!margin", % local normal margin edge + \c!distance = \number\dimexpr\margindataparameter\c!distance, + \c!hoffset = \number\dimexpr\margindataparameter\c!hoffset, + \c!voffset = \number\dimexpr\margindataparameter\c!voffset, + \c!dy = \number\dimexpr\margindataparameter\c!dy, + \ifx\currentmarginfirstheight\empty \else + baseline = \currentmarginfirstheight, + \fi + threshold = \number\dimexpr\margindataparameter\c!threshold, % will change + \ifhmode + inline = true, + \fi + \c!scope = "\margindataparameter\c!scope", + \c!align = "\margindataparameter\c!align", + \c!line = "\margindataparameter\c!line", + \c!stack = "\margindataparameter\c!stack", + \c!number = \number\nextbox + }}% + \endgroup} + +%D Downward compatible hack: + +\unexpanded\def\spaceorpar + {\endgraf\ifhmode\space\fi} + +\appendtoks + \let\\\spaceorpar +\to \everymargindatacontent + +%D Another one: + +% \letvalue{\??mc->\v!left }\v!right +% \letvalue{\??mc->\v!right }\v!left +% \letvalue{\??mc->\v!inner }\v!outer +% \letvalue{\??mc->\v!outer }\v!inner +% \letvalue{\??mc->\v!normal}\v!normal +% +% \def\oppositemargin#1% +% {\csname\??mc->\ifcsname\??mc->#1\endcsname#1\else\v!normal\fi\endcsname} + +%D Definitions: + +% common to lines and text + +\setupmargindata [\v!left ] [\c!method=\v!first,\c!location=\v!left ,\c!margin=\v!margin,\c!align=\v!flushright,\s!parent=\??mc] % we could autoparent when no define yet +\setupmargindata [\v!right] [\c!method=\v!first,\c!location=\v!right,\c!margin=\v!margin,\c!align=\v!flushleft, \s!parent=\??mc] +\setupmargindata [\v!outer] [\c!method=\v!first,\c!location=\v!outer,\c!margin=\v!margin,\c!align=\v!inner, \s!parent=\??mc] +\setupmargindata [\v!inner] [\c!method=\v!first,\c!location=\v!inner,\c!margin=\v!margin,\c!align=\v!outer, \s!parent=\??mc] + +% lines + +\definemargindata [inleftmargin] [\v!left ] [\c!margin=\v!margin,\c!width=\leftmarginwidth ,\c!style=,\c!color=] +\definemargindata [inrightmargin] [\v!right] [\c!margin=\v!margin,\c!width=\rightmarginwidth,\c!style=,\c!color=] +\definemargindata [inoutermargin] [\v!outer] [\c!margin=\v!margin,\c!width=\outermarginwidth,\c!style=,\c!color=] +\definemargindata [ininnermargin] [\v!inner] [\c!margin=\v!margin,\c!width=\innermarginwidth,\c!style=,\c!color=] + +\definemargindata [inleftedge] [\v!left ] [\c!margin=\v!edge ,\c!width=\leftedgewidth ,\c!style=,\c!color=,\c!category=\v!edge] +\definemargindata [inrightedge] [\v!right] [\c!margin=\v!edge ,\c!width=\rightedgewidth ,\c!style=,\c!color=,\c!category=\v!edge] +\definemargindata [inouteredge] [\v!outer] [\c!margin=\v!edge ,\c!width=\outeredgewidth ,\c!style=,\c!color=,\c!category=\v!edge] +\definemargindata [ininneredge] [\v!inner] [\c!margin=\v!edge ,\c!width=\inneredgewidth ,\c!style=,\c!color=,\c!category=\v!edge] + +\definemargindata [atleftmargin] [\v!left ] [\c!margin=\v!normal,\c!width=\leftmarginwidth ,\c!style=,\c!color=] +\definemargindata [atrightmargin] [\v!right] [\c!margin=\v!normal,\c!width=\rightmarginwidth,\c!style=,\c!color=] + +% text + +\definemargindata [inleft] [\v!left ] [\c!margin=\c!margin,\c!width=\leftmarginwidth ,\c!align=\v!flushright] +\definemargindata [inright] [\v!right] [\c!margin=\c!margin,\c!width=\rightmarginwidth,\c!align=\v!flushleft] +\definemargindata [inouter] [\v!outer] [\c!margin=\c!margin,\c!width=\outermarginwidth,\c!align=\v!inner] +\definemargindata [ininner] [\v!inner] [\c!margin=\c!margin,\c!width=\innermarginwidth,\c!align=\v!outer] + +% no longer auto auto-other + +\definemargindata [inmargin] [\v!left] [\c!margin=\c!margin,\c!width=\leftmarginwidth, \c!align=\v!flushright] +\definemargindata [inother] [\v!right] [\c!margin=\c!margin,\c!width=\rightmarginwidth,\c!align=\v!flushleft] + +\definemargindata [margintext] [\v!left] % keep it a bit separated from inleft and inmargin + +\setupmarginframed [\v!left ] [\c!method=\v!first,\c!align=\v!flushright,\s!parent=\??mf] % we could autoparent when no define yet +\setupmarginframed [\v!right] [\c!method=\v!first,\c!align=\v!flushleft, \s!parent=\??mf] +\setupmarginframed [\v!outer] [\c!method=\v!first,\c!align=\v!inner, \s!parent=\??mf] +\setupmarginframed [\v!inner] [\c!method=\v!first,\c!align=\v!outer, \s!parent=\??mf] + +\definemarginframed [inleft] [\v!left ] +\definemarginframed [inright] [\v!right] +\definemarginframed [inouter] [\v!outer] +\definemarginframed [ininner] [\v!inner] +\definemarginframed [inmargin] [\v!inleft] +\definemarginframed [inother] [\v!inright] + +\let\marginword \margintext +\let\margintitle\margintext + +%definemargindata [inouterextra] [\v!outer] [\c!margin=\c!edge,\c!location=\v!outer,\c!width=\outeredgewidth,\c!align=\v!outer,\c!category=\v!edge] +%definemargindata [ininnerextra] [\v!inner] [\c!margin=\c!edge,\c!location=\v!inner,\c!width=\inneredgewidth,\c!align=\v!inner,\c!category=\v!edge] +% +%definemarginframed [inouterextra] [\v!outer] +%definemarginframed [ininnerextra] [\v!inner] + +%D As we have more control we are not backward compatible although in +%D practice it won't hurt that much. +%D So, from now on use: +%D +%D \starttyping +%D \setupmargindata +%D \setupmargintext +%D \stoptyping + +% The following sort of works okay: +% +% \let\definemarginline\definemargindata +% +% \unexpanded\def\defineinmargin +% {\doquadrupleempty\dodefineinmargin} +% +% \def\dodefineinmargin[#name][#location][#align][#settings]% not completely compatible +% {\definemargindata[#name][\c!location=#location,\c!align=#align,#settings]% +% \definemarginframed[#name][#location][\c!align=#align,#settings]} +% +% \let\setupinmargin\setupmargindata +% +% The following is too dangerous: +% +% \unexpanded\def\setupinmargin +% {\dodoubleempty\dosetupinmargin} +% +% \def\dosetupinmargin[#1][#2]% +% {\ifsecondargument +% \processcommalist[#1]{\dodosetupinmargin[#2]}% +% \else +% \setupmargindata [#1]% beware, here we can have clashes, so +% \setupmarginframed[#1]% don't use setupinmargin any more +% \fi} +% +% \def\dodosetupinmargin[#1]#2% [settings]{class} +% {\setupmargindata[#2][#1]% +% \setupmargintext[#2][#1]} + +\protect \endinput diff --git a/tex/context/interface/keys-cs.xml b/tex/context/interface/keys-cs.xml index c0ca64b55..b03a922fc 100644 --- a/tex/context/interface/keys-cs.xml +++ b/tex/context/interface/keys-cs.xml @@ -275,7 +275,6 @@ <cd:variable name='marginedge' value='textovahrana'/> <cd:variable name='margintitle' value='titulmarginalie'/> <cd:variable name='marking' value='znaceni'/> - <cd:variable name='mask' value='mask'/> <cd:variable name='mathalignment' value='mathalignment'/> <cd:variable name='mathcases' value='mathcases'/> <cd:variable name='mathmatrix' value='mathmatrix'/> @@ -764,6 +763,7 @@ <cd:constant name='margintext' value='textmarginalie'/> <cd:constant name='marking' value='znaceni'/> <cd:constant name='marstyle' value='stylsnacky'/> + <cd:constant name='mask' value='mask'/> <cd:constant name='max' value='max'/> <cd:constant name='maxdepth' value='maxdepth'/> <cd:constant name='maxheight' value='maxvyska'/> diff --git a/tex/context/interface/keys-de.xml b/tex/context/interface/keys-de.xml index a1a4d2eee..cbec2130b 100644 --- a/tex/context/interface/keys-de.xml +++ b/tex/context/interface/keys-de.xml @@ -275,7 +275,6 @@ <cd:variable name='marginedge' value='marginalkante'/> <cd:variable name='margintitle' value='marginaltitel'/> <cd:variable name='marking' value='beschriftung'/> - <cd:variable name='mask' value='mask'/> <cd:variable name='mathalignment' value='mathalignment'/> <cd:variable name='mathcases' value='mathcases'/> <cd:variable name='mathmatrix' value='mathmatrix'/> @@ -764,6 +763,7 @@ <cd:constant name='margintext' value='marginaltext'/> <cd:constant name='marking' value='beschriftung'/> <cd:constant name='marstyle' value='beschrstil'/> + <cd:constant name='mask' value='mask'/> <cd:constant name='max' value='max'/> <cd:constant name='maxdepth' value='maxdepth'/> <cd:constant name='maxheight' value='maxhoehe'/> diff --git a/tex/context/interface/keys-en.xml b/tex/context/interface/keys-en.xml index 5daa3a118..d5c3f4b8f 100644 --- a/tex/context/interface/keys-en.xml +++ b/tex/context/interface/keys-en.xml @@ -275,7 +275,6 @@ <cd:variable name='marginedge' value='marginedge'/> <cd:variable name='margintitle' value='margintitle'/> <cd:variable name='marking' value='marking'/> - <cd:variable name='mask' value='mask'/> <cd:variable name='mathalignment' value='mathalignment'/> <cd:variable name='mathcases' value='mathcases'/> <cd:variable name='mathmatrix' value='mathmatrix'/> @@ -764,6 +763,7 @@ <cd:constant name='margintext' value='margintext'/> <cd:constant name='marking' value='marking'/> <cd:constant name='marstyle' value='marstyle'/> + <cd:constant name='mask' value='mask'/> <cd:constant name='max' value='max'/> <cd:constant name='maxdepth' value='maxdepth'/> <cd:constant name='maxheight' value='maxheight'/> diff --git a/tex/context/interface/keys-fr.xml b/tex/context/interface/keys-fr.xml index 73a9b3579..6b0c13b43 100644 --- a/tex/context/interface/keys-fr.xml +++ b/tex/context/interface/keys-fr.xml @@ -275,7 +275,6 @@ <cd:variable name='marginedge' value='bordmarge'/> <cd:variable name='margintitle' value='titremarge'/> <cd:variable name='marking' value='marquage'/> - <cd:variable name='mask' value='mask'/> <cd:variable name='mathalignment' value='mathalignment'/> <cd:variable name='mathcases' value='mathcases'/> <cd:variable name='mathmatrix' value='mathmatrix'/> @@ -764,6 +763,7 @@ <cd:constant name='margintext' value='textemarge'/> <cd:constant name='marking' value='marquage'/> <cd:constant name='marstyle' value='stylemarquage'/> + <cd:constant name='mask' value='mask'/> <cd:constant name='max' value='max'/> <cd:constant name='maxdepth' value='maxdepth'/> <cd:constant name='maxheight' value='hauteurmax'/> diff --git a/tex/context/interface/keys-it.xml b/tex/context/interface/keys-it.xml index a558e4fb1..77d96aa2d 100644 --- a/tex/context/interface/keys-it.xml +++ b/tex/context/interface/keys-it.xml @@ -275,7 +275,6 @@ <cd:variable name='marginedge' value='bordomargine'/> <cd:variable name='margintitle' value='titoloinmargine'/> <cd:variable name='marking' value='marcatura'/> - <cd:variable name='mask' value='mask'/> <cd:variable name='mathalignment' value='mathalignment'/> <cd:variable name='mathcases' value='mathcases'/> <cd:variable name='mathmatrix' value='mathmatrix'/> @@ -764,6 +763,7 @@ <cd:constant name='margintext' value='testomargine'/> <cd:constant name='marking' value='marcatura'/> <cd:constant name='marstyle' value='stilemarcatura'/> + <cd:constant name='mask' value='mask'/> <cd:constant name='max' value='max'/> <cd:constant name='maxdepth' value='maxdepth'/> <cd:constant name='maxheight' value='altezzamax'/> diff --git a/tex/context/interface/keys-nl.xml b/tex/context/interface/keys-nl.xml index ec6ec9949..9d18c63f8 100644 --- a/tex/context/interface/keys-nl.xml +++ b/tex/context/interface/keys-nl.xml @@ -275,7 +275,6 @@ <cd:variable name='marginedge' value='kantlijn'/> <cd:variable name='margintitle' value='margetitel'/> <cd:variable name='marking' value='markering'/> - <cd:variable name='mask' value='masker'/> <cd:variable name='mathalignment' value='wiskundeuitlijnen'/> <cd:variable name='mathcases' value='mathcases'/> <cd:variable name='mathmatrix' value='wiskundematrix'/> @@ -764,6 +763,7 @@ <cd:constant name='margintext' value='margetekst'/> <cd:constant name='marking' value='markering'/> <cd:constant name='marstyle' value='marletter'/> + <cd:constant name='mask' value='masker'/> <cd:constant name='max' value='max'/> <cd:constant name='maxdepth' value='maxdepth'/> <cd:constant name='maxheight' value='maxhoogte'/> diff --git a/tex/context/interface/keys-pe.xml b/tex/context/interface/keys-pe.xml index 80c834304..bf81c052a 100644 --- a/tex/context/interface/keys-pe.xml +++ b/tex/context/interface/keys-pe.xml @@ -275,7 +275,6 @@ <cd:variable name='marginedge' value='لبهحاشیه'/> <cd:variable name='margintitle' value='عنوانحاشیه'/> <cd:variable name='marking' value='نشانهگذاری'/> - <cd:variable name='mask' value='mask'/> <cd:variable name='mathalignment' value='تنظیمریاضی'/> <cd:variable name='mathcases' value='حالتهایریاضی'/> <cd:variable name='mathmatrix' value='ماتریشریاضی'/> @@ -764,6 +763,7 @@ <cd:constant name='margintext' value='متنحاشیه'/> <cd:constant name='marking' value='نشانهگذاری'/> <cd:constant name='marstyle' value='سبکحاش'/> + <cd:constant name='mask' value='mask'/> <cd:constant name='max' value='بیشترین'/> <cd:constant name='maxdepth' value='maxdepth'/> <cd:constant name='maxheight' value='بیشترینارتفاع'/> diff --git a/tex/context/interface/keys-ro.xml b/tex/context/interface/keys-ro.xml index 52ce9255d..d44c195f1 100644 --- a/tex/context/interface/keys-ro.xml +++ b/tex/context/interface/keys-ro.xml @@ -275,7 +275,6 @@ <cd:variable name='marginedge' value='marginebordura'/> <cd:variable name='margintitle' value='titlumarginal'/> <cd:variable name='marking' value='marcaje'/> - <cd:variable name='mask' value='mask'/> <cd:variable name='mathalignment' value='mathalignment'/> <cd:variable name='mathcases' value='mathcases'/> <cd:variable name='mathmatrix' value='mathmatrix'/> @@ -764,6 +763,7 @@ <cd:constant name='margintext' value='textmargine'/> <cd:constant name='marking' value='marcaje'/> <cd:constant name='marstyle' value='stilmarcaj'/> + <cd:constant name='mask' value='mask'/> <cd:constant name='max' value='max'/> <cd:constant name='maxdepth' value='maxdepth'/> <cd:constant name='maxheight' value='inaltimemaxima'/> diff --git a/tex/generic/context/luatex-fonts-merged.lua b/tex/generic/context/luatex-fonts-merged.lua index df7ede76b..ff5ade637 100644 --- a/tex/generic/context/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex-fonts-merged.lua @@ -1,6 +1,6 @@ -- merged file : luatex-fonts-merged.lua -- parent file : luatex-fonts.lua --- merge date : 02/20/11 20:34:15 +-- merge date : 02/25/11 22:03:53 do -- begin closure to overcome local limits and interference @@ -1392,7 +1392,8 @@ local function serialize(root,name,_handle,_reduce,_noquotes,_hexify) if root then -- The dummy access will initialize a table that has a delayed initialization -- using a metatable. - local dummy = root.whatever + local dummy = root._w_h_a_t_e_v_e_r_ + root._w_h_a_t_e_v_e_r_ = nil -- Let's forget about empty tables. if next(root) then do_serialize(root,name,"",0) @@ -3313,6 +3314,9 @@ if not modules then modules = { } end modules ['font-ini'] = { license = "see context related readme files" } +-- The font code will be upgraded and reorganized so that we have a +-- leaner generic code base and can do more tuning for context. + --[[ldx-- <p>Not much is happening here.</p> --ldx]]-- @@ -5732,42 +5736,47 @@ local starttiming, stoptiming, elapsedtime = statistics.starttiming, statistics. local findbinfile = resolvers.findbinfile -local fonts = fonts +local fonts = fonts -fonts.otf = fonts.otf or { } -local otf = fonts.otf -local tfm = fonts.tfm +fonts.otf = fonts.otf or { } +local otf = fonts.otf +local tfm = fonts.tfm -local fontdata = fonts.identifiers -local chardata = characters and characters.data -- not used +local fontdata = fonts.identifiers +local chardata = characters and characters.data -- not used -otf.features = otf.features or { } -otf.features.list = otf.features.list or { } -otf.features.default = otf.features.default or { } +-- todo: probably first time so local first -otf.enhancers = allocate() -local enhancers = otf.enhancers -enhancers.patches = { } -local patches = enhancers.patches +otf.features = otf.features or { } +local features = otf.features +features.list = features.list or { } +local featurelist = features.list +features.default = features.default or { } +local defaultfeatures = features.default -local definers = fonts.definers -local readers = fonts.tfm.readers +otf.enhancers = allocate() +local enhancers = otf.enhancers +enhancers.patches = { } +local patches = enhancers.patches -otf.glists = { "gsub", "gpos" } +local definers = fonts.definers +local readers = fonts.tfm.readers -otf.version = 2.710 -- beware: also sync font-mis.lua -otf.cache = containers.define("fonts", "otf", otf.version, true) +otf.glists = { "gsub", "gpos" } -local loadmethod = "table" -- table, mixed, sparse -local forceload = false -local cleanup = 0 -local usemetatables = false -- .4 slower on mk but 30 M less mem so we might change the default -- will be directive -local packdata = true -local syncspace = true -local forcenotdef = false +otf.version = 2.710 -- beware: also sync font-mis.lua +otf.cache = containers.define("fonts", "otf", otf.version, true) -local wildcard = "*" -local default = "dflt" +local loadmethod = "table" -- table, mixed, sparse +local forceload = false +local cleanup = 0 +local usemetatables = false -- .4 slower on mk but 30 M less mem so we might change the default -- will be directive +local packdata = true +local syncspace = true +local forcenotdef = false + +local wildcard = "*" +local default = "dflt" local fontloaderfields = fontloader.fields local mainfields = nil @@ -7228,9 +7237,12 @@ end -- -- -- -- -- -- -- -- -- -- -- -- -function otf.features.register(name,default) - otf.features.list[#otf.features.list+1] = name - otf.features.default[name] = default +function features.register(name,default,description) + featurelist[#featurelist+1] = name + defaultfeatures[name] = default + if description and description ~= "" then + fonts.otf.tables.features[name] = description + end end -- for context this will become a task handler @@ -7323,6 +7335,8 @@ local function copytotfm(data,cache_id) -- we can save a copy when we reorder th end local spaceunits, spacer = 500, "space" -- indices maps from unicodes to indices + -- this wil stay as we can manipulate indices + -- beforehand for u, i in next, indices do characters[u] = { } -- we need this because for instance we add protruding info and loop over characters descriptions[u] = glyphs[i] @@ -7378,10 +7392,10 @@ local function copytotfm(data,cache_id) -- we can save a copy when we reorder th end end -- end math - local endash, emdash, space = 0x20, 0x2014, "space" -- unicodes['space'], unicodes['emdash'] + local space, emdash = 0x20, 0x2014 -- unicodes['space'], unicodes['emdash'] if metadata.isfixedpitch then - if descriptions[endash] then - spaceunits, spacer = descriptions[endash].width, "space" + if descriptions[space] then + spaceunits, spacer = descriptions[space].width, "space" end if not spaceunits and descriptions[emdash] then spaceunits, spacer = descriptions[emdash].width, "emdash" @@ -7390,8 +7404,8 @@ local function copytotfm(data,cache_id) -- we can save a copy when we reorder th spaceunits, spacer = metadata.charwidth, "charwidth" end else - if descriptions[endash] then - spaceunits, spacer = descriptions[endash].width, "space" + if descriptions[space] then + spaceunits, spacer = descriptions[space].width, "space" end if not spaceunits and descriptions[emdash] then spaceunits, spacer = descriptions[emdash].width/2, "emdash/2" @@ -7459,7 +7473,6 @@ local function copytotfm(data,cache_id) -- we can save a copy when we reorder th boundarychar_label = 0, boundarychar = 65536, designsize = (designsize/10)*65536, - spacer = "500 units", encodingbytes = 2, mode = mode, filename = filename, @@ -7518,7 +7531,8 @@ local function otftotfm(specification) tfmdata.has_italic = otfdata.metadata.has_italic if not tfmdata.language then tfmdata.language = 'dflt' end if not tfmdata.script then tfmdata.script = 'dflt' end - shared.processes, shared.features = otf.setfeatures(tfmdata,definers.check(features,otf.features.default)) + -- at this moment no characters are assinged yet, only empty slots + shared.processes, shared.features = otf.setfeatures(tfmdata,definers.check(features,defaultfeatures)) end end containers.write(tfm.cache,cache_id,tfmdata) @@ -7526,7 +7540,7 @@ local function otftotfm(specification) return tfmdata end -otf.features.register('mathsize') +features.register('mathsize') local function read_from_otf(specification) -- wrong namespace local tfmtable = otftotfm(specification) @@ -11475,281 +11489,3743 @@ if not modules then modules = { } end modules ['font-map'] = { comment = "companion to font-ini.mkiv", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright = "derived from http://www.adobe.com/devnet/opentype/archives/glyphlist.txt", - comment = "Adobe Glyph List, version 2.0, September 20, 2002", + original = "Adobe Glyph List, version 2.0, September 20, 2002", } -local allocate = utilities.storage.allocate - -local names = allocate { - -- filled from char-def.lua -} -local unicodes = allocate { - -- filled from char-def.lua -} - -local extras = allocate { - Dcroat = 0x0110, - Delta = 0x2206, - Euro = 0x20AC, - H18533 = 0x25CF, - H18543 = 0x25AA, - H18551 = 0x25AB, - H22073 = 0x25A1, - Ldot = 0x013F, - Oslashacute = 0x01FE, - SF10000 = 0x250C, - SF20000 = 0x2514, - SF30000 = 0x2510, - SF40000 = 0x2518, - SF50000 = 0x253C, - SF60000 = 0x252C, - SF70000 = 0x2534, - SF80000 = 0x251C, - SF90000 = 0x2524, - Upsilon1 = 0x03D2, - afii10066 = 0x0431, - afii10067 = 0x0432, - afii10068 = 0x0433, - afii10069 = 0x0434, - afii10070 = 0x0435, - afii10071 = 0x0451, - afii10072 = 0x0436, - afii10073 = 0x0437, - afii10074 = 0x0438, - afii10075 = 0x0439, - afii10076 = 0x043A, - afii10077 = 0x043B, - afii10078 = 0x043C, - afii10079 = 0x043D, - afii10080 = 0x043E, - afii10081 = 0x043F, - afii10082 = 0x0440, - afii10083 = 0x0441, - afii10084 = 0x0442, - afii10085 = 0x0443, - afii10086 = 0x0444, - afii10087 = 0x0445, - afii10088 = 0x0446, - afii10089 = 0x0447, - afii10090 = 0x0448, - afii10091 = 0x0449, - afii10092 = 0x044A, - afii10093 = 0x044B, - afii10094 = 0x044C, - afii10095 = 0x044D, - afii10096 = 0x044E, - afii10097 = 0x044F, - afii10098 = 0x0491, - afii10099 = 0x0452, - afii10100 = 0x0453, - afii10101 = 0x0454, - afii10102 = 0x0455, - afii10103 = 0x0456, - afii10104 = 0x0457, - afii10105 = 0x0458, - afii10106 = 0x0459, - afii10107 = 0x045A, - afii10108 = 0x045B, - afii10109 = 0x045C, - afii10110 = 0x045E, - afii10193 = 0x045F, - afii10194 = 0x0463, - afii10195 = 0x0473, - afii10196 = 0x0475, - afii10846 = 0x04D9, - afii208 = 0x2015, - afii57381 = 0x066A, - afii57388 = 0x060C, - afii57392 = 0x0660, - afii57393 = 0x0661, - afii57394 = 0x0662, - afii57395 = 0x0663, - afii57396 = 0x0664, - afii57397 = 0x0665, - afii57398 = 0x0666, - afii57399 = 0x0667, - afii57400 = 0x0668, - afii57401 = 0x0669, - afii57403 = 0x061B, - afii57407 = 0x061F, - afii57409 = 0x0621, - afii57410 = 0x0622, - afii57411 = 0x0623, - afii57412 = 0x0624, - afii57413 = 0x0625, - afii57414 = 0x0626, - afii57415 = 0x0627, - afii57416 = 0x0628, - afii57417 = 0x0629, - afii57418 = 0x062A, - afii57419 = 0x062B, - afii57420 = 0x062C, - afii57421 = 0x062D, - afii57422 = 0x062E, - afii57423 = 0x062F, - afii57424 = 0x0630, - afii57425 = 0x0631, - afii57426 = 0x0632, - afii57427 = 0x0633, - afii57428 = 0x0634, - afii57429 = 0x0635, - afii57430 = 0x0636, - afii57431 = 0x0637, - afii57432 = 0x0638, - afii57433 = 0x0639, - afii57434 = 0x063A, - afii57440 = 0x0640, - afii57441 = 0x0641, - afii57442 = 0x0642, - afii57443 = 0x0643, - afii57444 = 0x0644, - afii57445 = 0x0645, - afii57446 = 0x0646, - afii57448 = 0x0648, - afii57449 = 0x0649, - afii57450 = 0x064A, - afii57451 = 0x064B, - afii57452 = 0x064C, - afii57453 = 0x064D, - afii57454 = 0x064E, - afii57455 = 0x064F, - afii57456 = 0x0650, - afii57457 = 0x0651, - afii57458 = 0x0652, - afii57470 = 0x0647, - afii57505 = 0x06A4, - afii57506 = 0x067E, - afii57507 = 0x0686, - afii57508 = 0x0698, - afii57509 = 0x06AF, - afii57511 = 0x0679, - afii57512 = 0x0688, - afii57513 = 0x0691, - afii57514 = 0x06BA, - afii57519 = 0x06D2, - afii57636 = 0x20AA, - afii57645 = 0x05BE, - afii57658 = 0x05C3, - afii57664 = 0x05D0, - afii57665 = 0x05D1, - afii57666 = 0x05D2, - afii57667 = 0x05D3, - afii57668 = 0x05D4, - afii57669 = 0x05D5, - afii57670 = 0x05D6, - afii57671 = 0x05D7, - afii57672 = 0x05D8, - afii57673 = 0x05D9, - afii57674 = 0x05DA, - afii57675 = 0x05DB, - afii57676 = 0x05DC, - afii57677 = 0x05DD, - afii57678 = 0x05DE, - afii57679 = 0x05DF, - afii57680 = 0x05E0, - afii57681 = 0x05E1, - afii57682 = 0x05E2, - afii57683 = 0x05E3, - afii57684 = 0x05E4, - afii57685 = 0x05E5, - afii57686 = 0x05E6, - afii57687 = 0x05E7, - afii57688 = 0x05E8, - afii57689 = 0x05E9, - afii57690 = 0x05EA, - afii57716 = 0x05F0, - afii57717 = 0x05F1, - afii57718 = 0x05F2, - afii57793 = 0x05B4, - afii57794 = 0x05B5, - afii57795 = 0x05B6, - afii57796 = 0x05BB, - afii57797 = 0x05B8, - afii57798 = 0x05B7, - afii57799 = 0x05B0, - afii57800 = 0x05B2, - afii57801 = 0x05B1, - afii57802 = 0x05B3, - afii57803 = 0x05C2, - afii57804 = 0x05C1, - afii57806 = 0x05B9, - afii57807 = 0x05BC, - afii57839 = 0x05BD, - afii57841 = 0x05BF, - afii57842 = 0x05C0, - afii57929 = 0x02BC, - afii61248 = 0x2105, - afii61289 = 0x2113, - afii61352 = 0x2116, - afii61664 = 0x200C, - afii63167 = 0x066D, - afii64937 = 0x02BD, - arrowdblboth = 0x21D4, - arrowdblleft = 0x21D0, - arrowdblright = 0x21D2, - arrowupdnbse = 0x21A8, - bar = 0x007C, - circle = 0x25CB, - circlemultiply = 0x2297, - circleplus = 0x2295, - club = 0x2663, - colonmonetary = 0x20A1, - dcroat = 0x0111, - dkshade = 0x2593, - existential = 0x2203, - female = 0x2640, - gradient = 0x2207, - heart = 0x2665, - hookabovecomb = 0x0309, - invcircle = 0x25D9, - ldot = 0x0140, - longs = 0x017F, - ltshade = 0x2591, - male = 0x2642, - mu = 0x00B5, - napostrophe = 0x0149, - notelement = 0x2209, - omega1 = 0x03D6, - openbullet = 0x25E6, - orthogonal = 0x221F, - oslashacute = 0x01FF, - phi1 = 0x03D5, - propersubset = 0x2282, - propersuperset = 0x2283, - reflexsubset = 0x2286, - reflexsuperset = 0x2287, - shade = 0x2592, - sigma1 = 0x03C2, - similar = 0x223C, - smileface = 0x263A, - spacehackarabic = 0x0020, - spade = 0x2660, - theta1 = 0x03D1, - twodotenleader = 0x2025, -} - -for u, c in next, characters.data do - local a = c.adobename - if a then - unicodes[a] = u - names [u] = a - end -end - -for a, u in next, extras do - unicodes[a] = u - if not names[u] then - names[u] = a - end -end - --- We load this table only when needed. We coul duse a loading mechanism --- return the table but there are no more vectors like this so why bother. - -fonts.enc.agl = { - names = names, -- unicode -> name - unicodes = unicodes, -- name -> unicode - extras = extras, -- merged into the other two +fonts = fonts or { } +fonts.enc = fonts.enc or { } +fonts.enc.agl = fonts.enc.agl or { } + +fonts.enc.agl.unicodes = { -- generated + ["A"]=65, + ["AE"]=198, + ["AEacute"]=508, + ["AEmacron"]=482, + ["Aacute"]=193, + ["Abreve"]=258, + ["Abreveacute"]=7854, + ["Abrevecyrillic"]=1232, + ["Abrevedotbelow"]=7862, + ["Abrevegrave"]=7856, + ["Abrevehookabove"]=7858, + ["Abrevetilde"]=7860, + ["Acaron"]=461, + ["Acircle"]=9398, + ["Acircumflex"]=194, + ["Acircumflexacute"]=7844, + ["Acircumflexdotbelow"]=7852, + ["Acircumflexgrave"]=7846, + ["Acircumflexhookabove"]=7848, + ["Acircumflextilde"]=7850, + ["Adblgrave"]=512, + ["Adieresis"]=196, + ["Adieresiscyrillic"]=1234, + ["Adieresismacron"]=478, + ["Adotbelow"]=7840, + ["Adotmacron"]=480, + ["Agrave"]=192, + ["Ahookabove"]=7842, + ["Aiecyrillic"]=1236, + ["Ainvertedbreve"]=514, + ["Alpha"]=913, + ["Alphatonos"]=902, + ["Amacron"]=256, + ["Amonospace"]=65313, + ["Aogonek"]=260, + ["Aring"]=197, + ["Aringacute"]=506, + ["Aringbelow"]=7680, + ["Atilde"]=195, + ["Aybarmenian"]=1329, + ["B"]=66, + ["Bcircle"]=9399, + ["Bdotaccent"]=7682, + ["Bdotbelow"]=7684, + ["Benarmenian"]=1330, + ["Beta"]=914, + ["Bhook"]=385, + ["Blinebelow"]=7686, + ["Bmonospace"]=65314, + ["Btopbar"]=386, + ["C"]=67, + ["Caarmenian"]=1342, + ["Cacute"]=262, + ["Ccaron"]=268, + ["Ccedilla"]=199, + ["Ccedillaacute"]=7688, + ["Ccircle"]=9400, + ["Ccircumflex"]=264, + ["Cdotaccent"]=266, + ["Chaarmenian"]=1353, + ["Cheabkhasiancyrillic"]=1212, + ["Chedescenderabkhasiancyrillic"]=1214, + ["Chedescendercyrillic"]=1206, + ["Chedieresiscyrillic"]=1268, + ["Cheharmenian"]=1347, + ["Chekhakassiancyrillic"]=1227, + ["Cheverticalstrokecyrillic"]=1208, + ["Chi"]=935, + ["Chook"]=391, + ["Cmonospace"]=65315, + ["Coarmenian"]=1361, + ["D"]=68, + ["DZ"]=497, + ["DZcaron"]=452, + ["Daarmenian"]=1332, + ["Dafrican"]=393, + ["Dcaron"]=270, + ["Dcedilla"]=7696, + ["Dcircle"]=9401, + ["Dcircumflexbelow"]=7698, + ["Ddotaccent"]=7690, + ["Ddotbelow"]=7692, + ["Deicoptic"]=1006, + ["Deltagreek"]=916, + ["Dhook"]=394, + ["Digammagreek"]=988, + ["Dlinebelow"]=7694, + ["Dmonospace"]=65316, + ["Dslash"]=272, + ["Dtopbar"]=395, + ["Dz"]=498, + ["Dzcaron"]=453, + ["Dzeabkhasiancyrillic"]=1248, + ["E"]=69, + ["Eacute"]=201, + ["Ebreve"]=276, + ["Ecaron"]=282, + ["Ecedillabreve"]=7708, + ["Echarmenian"]=1333, + ["Ecircle"]=9402, + ["Ecircumflex"]=202, + ["Ecircumflexacute"]=7870, + ["Ecircumflexbelow"]=7704, + ["Ecircumflexdotbelow"]=7878, + ["Ecircumflexgrave"]=7872, + ["Ecircumflexhookabove"]=7874, + ["Ecircumflextilde"]=7876, + ["Edblgrave"]=516, + ["Edieresis"]=203, + ["Edotaccent"]=278, + ["Edotbelow"]=7864, + ["Egrave"]=200, + ["Eharmenian"]=1335, + ["Ehookabove"]=7866, + ["Eightroman"]=8551, + ["Einvertedbreve"]=518, + ["Eiotifiedcyrillic"]=1124, + ["Elevenroman"]=8554, + ["Emacron"]=274, + ["Emacronacute"]=7702, + ["Emacrongrave"]=7700, + ["Emonospace"]=65317, + ["Endescendercyrillic"]=1186, + ["Eng"]=330, + ["Enghecyrillic"]=1188, + ["Enhookcyrillic"]=1223, + ["Eogonek"]=280, + ["Eopen"]=400, + ["Epsilon"]=917, + ["Epsilontonos"]=904, + ["Ereversed"]=398, + ["Esdescendercyrillic"]=1194, + ["Esh"]=425, + ["Eta"]=919, + ["Etarmenian"]=1336, + ["Etatonos"]=905, + ["Eth"]=208, + ["Etilde"]=7868, + ["Etildebelow"]=7706, + ["Ezh"]=439, + ["Ezhcaron"]=494, + ["Ezhreversed"]=440, + ["F"]=70, + ["Fcircle"]=9403, + ["Fdotaccent"]=7710, + ["Feharmenian"]=1366, + ["Feicoptic"]=996, + ["Fhook"]=401, + ["Fiveroman"]=8548, + ["Fmonospace"]=65318, + ["Fourroman"]=8547, + ["G"]=71, + ["GBsquare"]=13191, + ["Gacute"]=500, + ["Gamma"]=915, + ["Gammaafrican"]=404, + ["Gangiacoptic"]=1002, + ["Gbreve"]=286, + ["Gcaron"]=486, + ["Gcircle"]=9404, + ["Gcircumflex"]=284, + ["Gcommaaccent"]=290, + ["Gdotaccent"]=288, + ["Ghadarmenian"]=1346, + ["Ghemiddlehookcyrillic"]=1172, + ["Ghestrokecyrillic"]=1170, + ["Ghook"]=403, + ["Gimarmenian"]=1331, + ["Gmacron"]=7712, + ["Gmonospace"]=65319, + ["Gsmallhook"]=667, + ["Gstroke"]=484, + ["H"]=72, + ["HPsquare"]=13259, + ["Haabkhasiancyrillic"]=1192, + ["Hadescendercyrillic"]=1202, + ["Hbar"]=294, + ["Hbrevebelow"]=7722, + ["Hcedilla"]=7720, + ["Hcircle"]=9405, + ["Hcircumflex"]=292, + ["Hdieresis"]=7718, + ["Hdotaccent"]=7714, + ["Hdotbelow"]=7716, + ["Hmonospace"]=65320, + ["Hoarmenian"]=1344, + ["Horicoptic"]=1000, + ["Hzsquare"]=13200, + ["I"]=73, + ["IJ"]=306, + ["Iacute"]=205, + ["Ibreve"]=300, + ["Icaron"]=463, + ["Icircle"]=9406, + ["Icircumflex"]=206, + ["Idblgrave"]=520, + ["Idieresis"]=207, + ["Idieresisacute"]=7726, + ["Idieresiscyrillic"]=1252, + ["Idotaccent"]=304, + ["Idotbelow"]=7882, + ["Iebrevecyrillic"]=1238, + ["Ifraktur"]=8465, + ["Igrave"]=204, + ["Ihookabove"]=7880, + ["Iinvertedbreve"]=522, + ["Imacron"]=298, + ["Imacroncyrillic"]=1250, + ["Imonospace"]=65321, + ["Iniarmenian"]=1339, + ["Iogonek"]=302, + ["Iota"]=921, + ["Iotaafrican"]=406, + ["Iotadieresis"]=938, + ["Iotatonos"]=906, + ["Istroke"]=407, + ["Itilde"]=296, + ["Itildebelow"]=7724, + ["Izhitsadblgravecyrillic"]=1142, + ["J"]=74, + ["Jaarmenian"]=1345, + ["Jcircle"]=9407, + ["Jcircumflex"]=308, + ["Jheharmenian"]=1355, + ["Jmonospace"]=65322, + ["K"]=75, + ["KBsquare"]=13189, + ["KKsquare"]=13261, + ["Kabashkircyrillic"]=1184, + ["Kacute"]=7728, + ["Kadescendercyrillic"]=1178, + ["Kahookcyrillic"]=1219, + ["Kappa"]=922, + ["Kastrokecyrillic"]=1182, + ["Kaverticalstrokecyrillic"]=1180, + ["Kcaron"]=488, + ["Kcircle"]=9408, + ["Kcommaaccent"]=310, + ["Kdotbelow"]=7730, + ["Keharmenian"]=1364, + ["Kenarmenian"]=1343, + ["Kheicoptic"]=998, + ["Khook"]=408, + ["Klinebelow"]=7732, + ["Kmonospace"]=65323, + ["Koppacyrillic"]=1152, + ["Koppagreek"]=990, + ["Ksicyrillic"]=1134, + ["L"]=76, + ["LJ"]=455, + ["Lacute"]=313, + ["Lambda"]=923, + ["Lcaron"]=317, + ["Lcircle"]=9409, + ["Lcircumflexbelow"]=7740, + ["Lcommaaccent"]=315, + ["Ldotaccent"]=319, + ["Ldotbelow"]=7734, + ["Ldotbelowmacron"]=7736, + ["Liwnarmenian"]=1340, + ["Lj"]=456, + ["Llinebelow"]=7738, + ["Lmonospace"]=65324, + ["Lslash"]=321, + ["M"]=77, + ["MBsquare"]=13190, + ["Macute"]=7742, + ["Mcircle"]=9410, + ["Mdotaccent"]=7744, + ["Mdotbelow"]=7746, + ["Menarmenian"]=1348, + ["Mmonospace"]=65325, + ["Mturned"]=412, + ["Mu"]=924, + ["N"]=78, + ["NJ"]=458, + ["Nacute"]=323, + ["Ncaron"]=327, + ["Ncircle"]=9411, + ["Ncircumflexbelow"]=7754, + ["Ncommaaccent"]=325, + ["Ndotaccent"]=7748, + ["Ndotbelow"]=7750, + ["Nhookleft"]=413, + ["Nineroman"]=8552, + ["Nj"]=459, + ["Nlinebelow"]=7752, + ["Nmonospace"]=65326, + ["Nowarmenian"]=1350, + ["Ntilde"]=209, + ["Nu"]=925, + ["O"]=79, + ["OE"]=338, + ["Oacute"]=211, + ["Obarredcyrillic"]=1256, + ["Obarreddieresiscyrillic"]=1258, + ["Obreve"]=334, + ["Ocaron"]=465, + ["Ocenteredtilde"]=415, + ["Ocircle"]=9412, + ["Ocircumflex"]=212, + ["Ocircumflexacute"]=7888, + ["Ocircumflexdotbelow"]=7896, + ["Ocircumflexgrave"]=7890, + ["Ocircumflexhookabove"]=7892, + ["Ocircumflextilde"]=7894, + ["Odblgrave"]=524, + ["Odieresis"]=214, + ["Odieresiscyrillic"]=1254, + ["Odotbelow"]=7884, + ["Ograve"]=210, + ["Oharmenian"]=1365, + ["Ohookabove"]=7886, + ["Ohorn"]=416, + ["Ohornacute"]=7898, + ["Ohorndotbelow"]=7906, + ["Ohorngrave"]=7900, + ["Ohornhookabove"]=7902, + ["Ohorntilde"]=7904, + ["Ohungarumlaut"]=336, + ["Oi"]=418, + ["Oinvertedbreve"]=526, + ["Omacron"]=332, + ["Omacronacute"]=7762, + ["Omacrongrave"]=7760, + ["Omega"]=8486, + ["Omegacyrillic"]=1120, + ["Omegagreek"]=937, + ["Omegaroundcyrillic"]=1146, + ["Omegatitlocyrillic"]=1148, + ["Omegatonos"]=911, + ["Omicron"]=927, + ["Omicrontonos"]=908, + ["Omonospace"]=65327, + ["Oneroman"]=8544, + ["Oogonek"]=490, + ["Oogonekmacron"]=492, + ["Oopen"]=390, + ["Oslash"]=216, + ["Ostrokeacute"]=510, + ["Otcyrillic"]=1150, + ["Otilde"]=213, + ["Otildeacute"]=7756, + ["Otildedieresis"]=7758, + ["P"]=80, + ["Pacute"]=7764, + ["Pcircle"]=9413, + ["Pdotaccent"]=7766, + ["Peharmenian"]=1354, + ["Pemiddlehookcyrillic"]=1190, + ["Phi"]=934, + ["Phook"]=420, + ["Pi"]=928, + ["Piwrarmenian"]=1363, + ["Pmonospace"]=65328, + ["Psi"]=936, + ["Psicyrillic"]=1136, + ["Q"]=81, + ["Qcircle"]=9414, + ["Qmonospace"]=65329, + ["R"]=82, + ["Raarmenian"]=1356, + ["Racute"]=340, + ["Rcaron"]=344, + ["Rcircle"]=9415, + ["Rcommaaccent"]=342, + ["Rdblgrave"]=528, + ["Rdotaccent"]=7768, + ["Rdotbelow"]=7770, + ["Rdotbelowmacron"]=7772, + ["Reharmenian"]=1360, + ["Rfraktur"]=8476, + ["Rho"]=929, + ["Rinvertedbreve"]=530, + ["Rlinebelow"]=7774, + ["Rmonospace"]=65330, + ["Rsmallinverted"]=641, + ["Rsmallinvertedsuperior"]=694, + ["S"]=83, + ["SF010000"]=9484, + ["SF020000"]=9492, + ["SF030000"]=9488, + ["SF040000"]=9496, + ["SF050000"]=9532, + ["SF060000"]=9516, + ["SF070000"]=9524, + ["SF080000"]=9500, + ["SF090000"]=9508, + ["SF100000"]=9472, + ["SF110000"]=9474, + ["SF190000"]=9569, + ["SF200000"]=9570, + ["SF210000"]=9558, + ["SF220000"]=9557, + ["SF230000"]=9571, + ["SF240000"]=9553, + ["SF250000"]=9559, + ["SF260000"]=9565, + ["SF270000"]=9564, + ["SF280000"]=9563, + ["SF360000"]=9566, + ["SF370000"]=9567, + ["SF380000"]=9562, + ["SF390000"]=9556, + ["SF400000"]=9577, + ["SF410000"]=9574, + ["SF420000"]=9568, + ["SF430000"]=9552, + ["SF440000"]=9580, + ["SF450000"]=9575, + ["SF460000"]=9576, + ["SF470000"]=9572, + ["SF480000"]=9573, + ["SF490000"]=9561, + ["SF500000"]=9560, + ["SF510000"]=9554, + ["SF520000"]=9555, + ["SF530000"]=9579, + ["SF540000"]=9578, + ["Sacute"]=346, + ["Sacutedotaccent"]=7780, + ["Sampigreek"]=992, + ["Scaron"]=352, + ["Scarondotaccent"]=7782, + ["Scedilla"]=350, + ["Schwa"]=399, + ["Schwacyrillic"]=1240, + ["Schwadieresiscyrillic"]=1242, + ["Scircle"]=9416, + ["Scircumflex"]=348, + ["Scommaaccent"]=536, + ["Sdotaccent"]=7776, + ["Sdotbelow"]=7778, + ["Sdotbelowdotaccent"]=7784, + ["Seharmenian"]=1357, + ["Sevenroman"]=8550, + ["Shaarmenian"]=1351, + ["Sheicoptic"]=994, + ["Shhacyrillic"]=1210, + ["Shimacoptic"]=1004, + ["Sigma"]=931, + ["Sixroman"]=8549, + ["Smonospace"]=65331, + ["Stigmagreek"]=986, + ["T"]=84, + ["Tau"]=932, + ["Tbar"]=358, + ["Tcaron"]=356, + ["Tcircle"]=9417, + ["Tcircumflexbelow"]=7792, + ["Tcommaaccent"]=354, + ["Tdotaccent"]=7786, + ["Tdotbelow"]=7788, + ["Tedescendercyrillic"]=1196, + ["Tenroman"]=8553, + ["Tetsecyrillic"]=1204, + ["Theta"]=920, + ["Thook"]=428, + ["Thorn"]=222, + ["Threeroman"]=8546, + ["Tiwnarmenian"]=1359, + ["Tlinebelow"]=7790, + ["Tmonospace"]=65332, + ["Toarmenian"]=1337, + ["Tonefive"]=444, + ["Tonesix"]=388, + ["Tonetwo"]=423, + ["Tretroflexhook"]=430, + ["Twelveroman"]=8555, + ["Tworoman"]=8545, + ["U"]=85, + ["Uacute"]=218, + ["Ubreve"]=364, + ["Ucaron"]=467, + ["Ucircle"]=9418, + ["Ucircumflex"]=219, + ["Ucircumflexbelow"]=7798, + ["Udblgrave"]=532, + ["Udieresis"]=220, + ["Udieresisacute"]=471, + ["Udieresisbelow"]=7794, + ["Udieresiscaron"]=473, + ["Udieresiscyrillic"]=1264, + ["Udieresisgrave"]=475, + ["Udieresismacron"]=469, + ["Udotbelow"]=7908, + ["Ugrave"]=217, + ["Uhookabove"]=7910, + ["Uhorn"]=431, + ["Uhornacute"]=7912, + ["Uhorndotbelow"]=7920, + ["Uhorngrave"]=7914, + ["Uhornhookabove"]=7916, + ["Uhorntilde"]=7918, + ["Uhungarumlaut"]=368, + ["Uhungarumlautcyrillic"]=1266, + ["Uinvertedbreve"]=534, + ["Ukcyrillic"]=1144, + ["Umacron"]=362, + ["Umacroncyrillic"]=1262, + ["Umacrondieresis"]=7802, + ["Umonospace"]=65333, + ["Uogonek"]=370, + ["Upsilon"]=933, + ["Upsilonacutehooksymbolgreek"]=979, + ["Upsilonafrican"]=433, + ["Upsilondieresis"]=939, + ["Upsilondieresishooksymbolgreek"]=980, + ["Upsilonhooksymbol"]=978, + ["Upsilontonos"]=910, + ["Uring"]=366, + ["Ustraightcyrillic"]=1198, + ["Ustraightstrokecyrillic"]=1200, + ["Utilde"]=360, + ["Utildeacute"]=7800, + ["Utildebelow"]=7796, + ["V"]=86, + ["Vcircle"]=9419, + ["Vdotbelow"]=7806, + ["Vewarmenian"]=1358, + ["Vhook"]=434, + ["Vmonospace"]=65334, + ["Voarmenian"]=1352, + ["Vtilde"]=7804, + ["W"]=87, + ["Wacute"]=7810, + ["Wcircle"]=9420, + ["Wcircumflex"]=372, + ["Wdieresis"]=7812, + ["Wdotaccent"]=7814, + ["Wdotbelow"]=7816, + ["Wgrave"]=7808, + ["Wmonospace"]=65335, + ["X"]=88, + ["Xcircle"]=9421, + ["Xdieresis"]=7820, + ["Xdotaccent"]=7818, + ["Xeharmenian"]=1341, + ["Xi"]=926, + ["Xmonospace"]=65336, + ["Y"]=89, + ["Yacute"]=221, + ["Ycircle"]=9422, + ["Ycircumflex"]=374, + ["Ydieresis"]=376, + ["Ydotaccent"]=7822, + ["Ydotbelow"]=7924, + ["Yerudieresiscyrillic"]=1272, + ["Ygrave"]=7922, + ["Yhook"]=435, + ["Yhookabove"]=7926, + ["Yiarmenian"]=1349, + ["Yiwnarmenian"]=1362, + ["Ymonospace"]=65337, + ["Ytilde"]=7928, + ["Yusbigcyrillic"]=1130, + ["Yusbigiotifiedcyrillic"]=1132, + ["Yuslittlecyrillic"]=1126, + ["Yuslittleiotifiedcyrillic"]=1128, + ["Z"]=90, + ["Zaarmenian"]=1334, + ["Zacute"]=377, + ["Zcaron"]=381, + ["Zcircle"]=9423, + ["Zcircumflex"]=7824, + ["Zdotaccent"]=379, + ["Zdotbelow"]=7826, + ["Zedescendercyrillic"]=1176, + ["Zedieresiscyrillic"]=1246, + ["Zeta"]=918, + ["Zhearmenian"]=1338, + ["Zhebrevecyrillic"]=1217, + ["Zhedescendercyrillic"]=1174, + ["Zhedieresiscyrillic"]=1244, + ["Zlinebelow"]=7828, + ["Zmonospace"]=65338, + ["Zstroke"]=437, + ["a"]=97, + ["aabengali"]=2438, + ["aacute"]=225, + ["aadeva"]=2310, + ["aagujarati"]=2694, + ["aagurmukhi"]=2566, + ["aamatragurmukhi"]=2622, + ["aarusquare"]=13059, + ["aavowelsignbengali"]=2494, + ["aavowelsigndeva"]=2366, + ["aavowelsigngujarati"]=2750, + ["abbreviationmarkarmenian"]=1375, + ["abbreviationsigndeva"]=2416, + ["abengali"]=2437, + ["abopomofo"]=12570, + ["abreve"]=259, + ["abreveacute"]=7855, + ["abrevecyrillic"]=1233, + ["abrevedotbelow"]=7863, + ["abrevegrave"]=7857, + ["abrevehookabove"]=7859, + ["abrevetilde"]=7861, + ["acaron"]=462, + ["acircle"]=9424, + ["acircumflex"]=226, + ["acircumflexacute"]=7845, + ["acircumflexdotbelow"]=7853, + ["acircumflexgrave"]=7847, + ["acircumflexhookabove"]=7849, + ["acircumflextilde"]=7851, + ["acute"]=180, + ["acutebelowcmb"]=791, + ["acutecomb"]=769, + ["acutedeva"]=2388, + ["acutelowmod"]=719, + ["acutetonecmb"]=833, + ["adblgrave"]=513, + ["addakgurmukhi"]=2673, + ["adeva"]=2309, + ["adieresis"]=228, + ["adieresiscyrillic"]=1235, + ["adieresismacron"]=479, + ["adotbelow"]=7841, + ["adotmacron"]=481, + ["ae"]=230, + ["aeacute"]=509, + ["aekorean"]=12624, + ["aemacron"]=483, + ["afii10017"]=1040, + ["afii10018"]=1041, + ["afii10019"]=1042, + ["afii10020"]=1043, + ["afii10021"]=1044, + ["afii10022"]=1045, + ["afii10023"]=1025, + ["afii10024"]=1046, + ["afii10025"]=1047, + ["afii10026"]=1048, + ["afii10027"]=1049, + ["afii10028"]=1050, + ["afii10029"]=1051, + ["afii10030"]=1052, + ["afii10031"]=1053, + ["afii10032"]=1054, + ["afii10033"]=1055, + ["afii10034"]=1056, + ["afii10035"]=1057, + ["afii10036"]=1058, + ["afii10037"]=1059, + ["afii10038"]=1060, + ["afii10039"]=1061, + ["afii10040"]=1062, + ["afii10041"]=1063, + ["afii10042"]=1064, + ["afii10043"]=1065, + ["afii10044"]=1066, + ["afii10045"]=1067, + ["afii10046"]=1068, + ["afii10047"]=1069, + ["afii10048"]=1070, + ["afii10049"]=1071, + ["afii10050"]=1168, + ["afii10051"]=1026, + ["afii10052"]=1027, + ["afii10053"]=1028, + ["afii10054"]=1029, + ["afii10055"]=1030, + ["afii10056"]=1031, + ["afii10057"]=1032, + ["afii10058"]=1033, + ["afii10059"]=1034, + ["afii10060"]=1035, + ["afii10061"]=1036, + ["afii10062"]=1038, + ["afii10065"]=1072, + ["afii10145"]=1039, + ["afii10146"]=1122, + ["afii10147"]=1138, + ["afii10148"]=1140, + ["afii299"]=8206, + ["afii300"]=8207, + ["afii301"]=8205, + ["afii57534"]=1749, + ["afii61573"]=8236, + ["afii61574"]=8237, + ["afii61575"]=8238, + ["agrave"]=224, + ["agujarati"]=2693, + ["agurmukhi"]=2565, + ["ahiragana"]=12354, + ["ahookabove"]=7843, + ["aibengali"]=2448, + ["aibopomofo"]=12574, + ["aideva"]=2320, + ["aiecyrillic"]=1237, + ["aigujarati"]=2704, + ["aigurmukhi"]=2576, + ["aimatragurmukhi"]=2632, + ["ainarabic"]=1593, + ["ainfinalarabic"]=65226, + ["aininitialarabic"]=65227, + ["ainmedialarabic"]=65228, + ["ainvertedbreve"]=515, + ["aivowelsignbengali"]=2504, + ["aivowelsigndeva"]=2376, + ["aivowelsigngujarati"]=2760, + ["akatakana"]=12450, + ["akatakanahalfwidth"]=65393, + ["akorean"]=12623, + ["alefarabic"]=1575, + ["alefdageshhebrew"]=64304, + ["aleffinalarabic"]=65166, + ["alefhamzaabovearabic"]=1571, + ["alefhamzaabovefinalarabic"]=65156, + ["alefhamzabelowarabic"]=1573, + ["alefhamzabelowfinalarabic"]=65160, + ["alefhebrew"]=1488, + ["aleflamedhebrew"]=64335, + ["alefmaddaabovearabic"]=1570, + ["alefmaddaabovefinalarabic"]=65154, + ["alefmaksuraarabic"]=1609, + ["alefmaksurafinalarabic"]=65264, + ["alefpatahhebrew"]=64302, + ["alefqamatshebrew"]=64303, + ["aleph"]=8501, + ["allequal"]=8780, + ["alpha"]=945, + ["alphatonos"]=940, + ["amacron"]=257, + ["amonospace"]=65345, + ["ampersand"]=38, + ["ampersandmonospace"]=65286, + ["amsquare"]=13250, + ["anbopomofo"]=12578, + ["angbopomofo"]=12580, + ["angkhankhuthai"]=3674, + ["angle"]=8736, + ["anglebracketleft"]=12296, + ["anglebracketleftvertical"]=65087, + ["anglebracketright"]=12297, + ["anglebracketrightvertical"]=65088, + ["angleleft"]=9001, + ["angleright"]=9002, + ["angstrom"]=8491, + ["anoteleia"]=903, + ["anudattadeva"]=2386, + ["anusvarabengali"]=2434, + ["anusvaradeva"]=2306, + ["anusvaragujarati"]=2690, + ["aogonek"]=261, + ["apaatosquare"]=13056, + ["aparen"]=9372, + ["apostrophearmenian"]=1370, + ["apostrophemod"]=700, + ["apple"]=63743, + ["approaches"]=8784, + ["approxequal"]=8776, + ["approxequalorimage"]=8786, + ["araeaekorean"]=12686, + ["araeakorean"]=12685, + ["arc"]=8978, + ["arighthalfring"]=7834, + ["aring"]=229, + ["aringacute"]=507, + ["aringbelow"]=7681, + ["arrowboth"]=8596, + ["arrowdashdown"]=8675, + ["arrowdashleft"]=8672, + ["arrowdashright"]=8674, + ["arrowdashup"]=8673, + ["arrowdbldown"]=8659, + ["arrowdblup"]=8657, + ["arrowdown"]=8595, + ["arrowdownleft"]=8601, + ["arrowdownright"]=8600, + ["arrowdownwhite"]=8681, + ["arrowheaddownmod"]=709, + ["arrowheadleftmod"]=706, + ["arrowheadrightmod"]=707, + ["arrowheadupmod"]=708, + ["arrowleft"]=8592, + ["arrowleftdbl"]=8656, + ["arrowleftdblstroke"]=8653, + ["arrowleftoverright"]=8646, + ["arrowleftwhite"]=8678, + ["arrowright"]=8594, + ["arrowrightdblstroke"]=8655, + ["arrowrightheavy"]=10142, + ["arrowrightoverleft"]=8644, + ["arrowrightwhite"]=8680, + ["arrowtableft"]=8676, + ["arrowtabright"]=8677, + ["arrowup"]=8593, + ["arrowupdn"]=8597, + ["arrowupdownbase"]=8616, + ["arrowupleft"]=8598, + ["arrowupleftofdown"]=8645, + ["arrowupright"]=8599, + ["arrowupwhite"]=8679, + ["asciicircum"]=94, + ["asciicircummonospace"]=65342, + ["asciitilde"]=126, + ["asciitildemonospace"]=65374, + ["ascript"]=593, + ["ascriptturned"]=594, + ["asmallhiragana"]=12353, + ["asmallkatakana"]=12449, + ["asmallkatakanahalfwidth"]=65383, + ["asterisk"]=42, + ["asteriskarabic"]=1645, + ["asteriskmath"]=8727, + ["asteriskmonospace"]=65290, + ["asterisksmall"]=65121, + ["asterism"]=8258, + ["asymptoticallyequal"]=8771, + ["at"]=64, + ["atilde"]=227, + ["atmonospace"]=65312, + ["atsmall"]=65131, + ["aturned"]=592, + ["aubengali"]=2452, + ["aubopomofo"]=12576, + ["audeva"]=2324, + ["augujarati"]=2708, + ["augurmukhi"]=2580, + ["aulengthmarkbengali"]=2519, + ["aumatragurmukhi"]=2636, + ["auvowelsignbengali"]=2508, + ["auvowelsigndeva"]=2380, + ["auvowelsigngujarati"]=2764, + ["avagrahadeva"]=2365, + ["aybarmenian"]=1377, + ["ayinaltonehebrew"]=64288, + ["ayinhebrew"]=1506, + ["b"]=98, + ["babengali"]=2476, + ["backslash"]=92, + ["backslashmonospace"]=65340, + ["badeva"]=2348, + ["bagujarati"]=2732, + ["bagurmukhi"]=2604, + ["bahiragana"]=12400, + ["bahtthai"]=3647, + ["bakatakana"]=12496, + ["barmonospace"]=65372, + ["bbopomofo"]=12549, + ["bcircle"]=9425, + ["bdotaccent"]=7683, + ["bdotbelow"]=7685, + ["beamedsixteenthnotes"]=9836, + ["because"]=8757, + ["becyrillic"]=1073, + ["beharabic"]=1576, + ["behfinalarabic"]=65168, + ["behinitialarabic"]=65169, + ["behiragana"]=12409, + ["behmedialarabic"]=65170, + ["behmeeminitialarabic"]=64671, + ["behmeemisolatedarabic"]=64520, + ["behnoonfinalarabic"]=64621, + ["bekatakana"]=12505, + ["benarmenian"]=1378, + ["beta"]=946, + ["betasymbolgreek"]=976, + ["betdageshhebrew"]=64305, + ["bethebrew"]=1489, + ["betrafehebrew"]=64332, + ["bhabengali"]=2477, + ["bhadeva"]=2349, + ["bhagujarati"]=2733, + ["bhagurmukhi"]=2605, + ["bhook"]=595, + ["bihiragana"]=12403, + ["bikatakana"]=12499, + ["bilabialclick"]=664, + ["bindigurmukhi"]=2562, + ["birusquare"]=13105, + ["blackcircle"]=9679, + ["blackdiamond"]=9670, + ["blackleftpointingtriangle"]=9664, + ["blacklenticularbracketleft"]=12304, + ["blacklenticularbracketleftvertical"]=65083, + ["blacklenticularbracketright"]=12305, + ["blacklenticularbracketrightvertical"]=65084, + ["blacklowerlefttriangle"]=9699, + ["blacklowerrighttriangle"]=9698, + ["blackrightpointingtriangle"]=9654, + ["blacksmallsquare"]=9642, + ["blackstar"]=9733, + ["blackupperlefttriangle"]=9700, + ["blackupperrighttriangle"]=9701, + ["blackuppointingsmalltriangle"]=9652, + ["blank"]=9251, + ["blinebelow"]=7687, + ["block"]=9608, + ["bmonospace"]=65346, + ["bobaimaithai"]=3610, + ["bohiragana"]=12412, + ["bokatakana"]=12508, + ["bparen"]=9373, + ["bqsquare"]=13251, + ["braceleft"]=123, + ["braceleftmonospace"]=65371, + ["braceleftsmall"]=65115, + ["braceleftvertical"]=65079, + ["braceright"]=125, + ["bracerightmonospace"]=65373, + ["bracerightsmall"]=65116, + ["bracerightvertical"]=65080, + ["bracketleft"]=91, + ["bracketleftmonospace"]=65339, + ["bracketright"]=93, + ["bracketrightmonospace"]=65341, + ["breve"]=728, + ["brevebelowcmb"]=814, + ["brevecmb"]=774, + ["breveinvertedbelowcmb"]=815, + ["breveinvertedcmb"]=785, + ["breveinverteddoublecmb"]=865, + ["bridgebelowcmb"]=810, + ["bridgeinvertedbelowcmb"]=826, + ["brokenbar"]=166, + ["bstroke"]=384, + ["btopbar"]=387, + ["buhiragana"]=12406, + ["bukatakana"]=12502, + ["bullet"]=8226, + ["bulletoperator"]=8729, + ["bullseye"]=9678, + ["c"]=99, + ["caarmenian"]=1390, + ["cabengali"]=2458, + ["cacute"]=263, + ["cadeva"]=2330, + ["cagujarati"]=2714, + ["cagurmukhi"]=2586, + ["calsquare"]=13192, + ["candrabindubengali"]=2433, + ["candrabinducmb"]=784, + ["candrabindudeva"]=2305, + ["candrabindugujarati"]=2689, + ["capslock"]=8682, + ["careof"]=8453, + ["caron"]=711, + ["caronbelowcmb"]=812, + ["caroncmb"]=780, + ["carriagereturn"]=8629, + ["cbopomofo"]=12568, + ["ccaron"]=269, + ["ccedilla"]=231, + ["ccedillaacute"]=7689, + ["ccircle"]=9426, + ["ccircumflex"]=265, + ["ccurl"]=597, + ["cdotaccent"]=267, + ["cdsquare"]=13253, + ["cedilla"]=184, + ["cedillacmb"]=807, + ["cent"]=162, + ["centigrade"]=8451, + ["centmonospace"]=65504, + ["chaarmenian"]=1401, + ["chabengali"]=2459, + ["chadeva"]=2331, + ["chagujarati"]=2715, + ["chagurmukhi"]=2587, + ["chbopomofo"]=12564, + ["cheabkhasiancyrillic"]=1213, + ["checkmark"]=10003, + ["checyrillic"]=1095, + ["chedescenderabkhasiancyrillic"]=1215, + ["chedescendercyrillic"]=1207, + ["chedieresiscyrillic"]=1269, + ["cheharmenian"]=1395, + ["chekhakassiancyrillic"]=1228, + ["cheverticalstrokecyrillic"]=1209, + ["chi"]=967, + ["chieuchacirclekorean"]=12919, + ["chieuchaparenkorean"]=12823, + ["chieuchcirclekorean"]=12905, + ["chieuchkorean"]=12618, + ["chieuchparenkorean"]=12809, + ["chochangthai"]=3594, + ["chochanthai"]=3592, + ["chochingthai"]=3593, + ["chochoethai"]=3596, + ["chook"]=392, + ["cieucacirclekorean"]=12918, + ["cieucaparenkorean"]=12822, + ["cieuccirclekorean"]=12904, + ["cieuckorean"]=12616, + ["cieucparenkorean"]=12808, + ["cieucuparenkorean"]=12828, + ["circleot"]=8857, + ["circlepostalmark"]=12342, + ["circlewithlefthalfblack"]=9680, + ["circlewithrighthalfblack"]=9681, + ["circumflex"]=710, + ["circumflexbelowcmb"]=813, + ["circumflexcmb"]=770, + ["clear"]=8999, + ["clickalveolar"]=450, + ["clickdental"]=448, + ["clicklateral"]=449, + ["clickretroflex"]=451, + ["clubsuitblack"]=9827, + ["clubsuitwhite"]=9831, + ["cmcubedsquare"]=13220, + ["cmonospace"]=65347, + ["cmsquaredsquare"]=13216, + ["coarmenian"]=1409, + ["colon"]=58, + ["colonmonospace"]=65306, + ["colonsign"]=8353, + ["colonsmall"]=65109, + ["colontriangularhalfmod"]=721, + ["colontriangularmod"]=720, + ["comma"]=44, + ["commaabovecmb"]=787, + ["commaaboverightcmb"]=789, + ["commaarabic"]=1548, + ["commaarmenian"]=1373, + ["commamonospace"]=65292, + ["commareversedabovecmb"]=788, + ["commareversedmod"]=701, + ["commasmall"]=65104, + ["commaturnedabovecmb"]=786, + ["commaturnedmod"]=699, + ["congruent"]=8773, + ["contourintegral"]=8750, + ["control"]=8963, + ["controlACK"]=6, + ["controlBEL"]=7, + ["controlBS"]=8, + ["controlCAN"]=24, + ["controlCR"]=13, + ["controlDC1"]=17, + ["controlDC2"]=18, + ["controlDC3"]=19, + ["controlDC4"]=20, + ["controlDEL"]=127, + ["controlDLE"]=16, + ["controlEM"]=25, + ["controlENQ"]=5, + ["controlEOT"]=4, + ["controlESC"]=27, + ["controlETB"]=23, + ["controlETX"]=3, + ["controlFF"]=12, + ["controlFS"]=28, + ["controlGS"]=29, + ["controlHT"]=9, + ["controlLF"]=10, + ["controlNAK"]=21, + ["controlRS"]=30, + ["controlSI"]=15, + ["controlSO"]=14, + ["controlSOT"]=2, + ["controlSTX"]=1, + ["controlSUB"]=26, + ["controlSYN"]=22, + ["controlUS"]=31, + ["controlVT"]=11, + ["copyright"]=169, + ["cornerbracketleft"]=12300, + ["cornerbracketlefthalfwidth"]=65378, + ["cornerbracketleftvertical"]=65089, + ["cornerbracketright"]=12301, + ["cornerbracketrighthalfwidth"]=65379, + ["cornerbracketrightvertical"]=65090, + ["corporationsquare"]=13183, + ["cosquare"]=13255, + ["coverkgsquare"]=13254, + ["cparen"]=9374, + ["cruzeiro"]=8354, + ["cstretched"]=663, + ["curlyand"]=8911, + ["curlyor"]=8910, + ["currency"]=164, + ["d"]=100, + ["daarmenian"]=1380, + ["dabengali"]=2470, + ["dadarabic"]=1590, + ["dadeva"]=2342, + ["dadfinalarabic"]=65214, + ["dadinitialarabic"]=65215, + ["dadmedialarabic"]=65216, + ["dageshhebrew"]=1468, + ["dagger"]=8224, + ["daggerdbl"]=8225, + ["dagujarati"]=2726, + ["dagurmukhi"]=2598, + ["dahiragana"]=12384, + ["dakatakana"]=12480, + ["dalarabic"]=1583, + ["daletdageshhebrew"]=64307, + ["dalettserehebrew"]=1491, + ["dalfinalarabic"]=65194, + ["dammalowarabic"]=1615, + ["dammatanarabic"]=1612, + ["danda"]=2404, + ["dargalefthebrew"]=1447, + ["dasiapneumatacyrilliccmb"]=1157, + ["dblanglebracketleft"]=12298, + ["dblanglebracketleftvertical"]=65085, + ["dblanglebracketright"]=12299, + ["dblanglebracketrightvertical"]=65086, + ["dblarchinvertedbelowcmb"]=811, + ["dblarrowleft"]=8660, + ["dblarrowright"]=8658, + ["dbldanda"]=2405, + ["dblgravecmb"]=783, + ["dblintegral"]=8748, + ["dbllowlinecmb"]=819, + ["dbloverlinecmb"]=831, + ["dblprimemod"]=698, + ["dblverticalbar"]=8214, + ["dblverticallineabovecmb"]=782, + ["dbopomofo"]=12553, + ["dbsquare"]=13256, + ["dcaron"]=271, + ["dcedilla"]=7697, + ["dcircle"]=9427, + ["dcircumflexbelow"]=7699, + ["ddabengali"]=2465, + ["ddadeva"]=2337, + ["ddagujarati"]=2721, + ["ddagurmukhi"]=2593, + ["ddalarabic"]=1672, + ["ddalfinalarabic"]=64393, + ["dddhadeva"]=2396, + ["ddhabengali"]=2466, + ["ddhadeva"]=2338, + ["ddhagujarati"]=2722, + ["ddhagurmukhi"]=2594, + ["ddotaccent"]=7691, + ["ddotbelow"]=7693, + ["decimalseparatorpersian"]=1643, + ["decyrillic"]=1076, + ["degree"]=176, + ["dehihebrew"]=1453, + ["dehiragana"]=12391, + ["deicoptic"]=1007, + ["dekatakana"]=12487, + ["deleteleft"]=9003, + ["deleteright"]=8998, + ["delta"]=948, + ["deltaturned"]=397, + ["denominatorminusonenumeratorbengali"]=2552, + ["dezh"]=676, + ["dhabengali"]=2471, + ["dhadeva"]=2343, + ["dhagujarati"]=2727, + ["dhagurmukhi"]=2599, + ["dhook"]=599, + ["dialytikatonoscmb"]=836, + ["diamond"]=9830, + ["diamondsuitwhite"]=9826, + ["dieresis"]=168, + ["dieresisbelowcmb"]=804, + ["dieresiscmb"]=776, + ["dieresistonos"]=901, + ["dihiragana"]=12386, + ["dikatakana"]=12482, + ["dittomark"]=12291, + ["divide"]=247, + ["divides"]=8739, + ["divisionslash"]=8725, + ["djecyrillic"]=1106, + ["dlinebelow"]=7695, + ["dlsquare"]=13207, + ["dmacron"]=273, + ["dmonospace"]=65348, + ["dnblock"]=9604, + ["dochadathai"]=3598, + ["dodekthai"]=3604, + ["dohiragana"]=12393, + ["dokatakana"]=12489, + ["dollar"]=36, + ["dollarmonospace"]=65284, + ["dollarsmall"]=65129, + ["dong"]=8363, + ["dorusquare"]=13094, + ["dotaccent"]=729, + ["dotaccentcmb"]=775, + ["dotbelowcomb"]=803, + ["dotkatakana"]=12539, + ["dotlessi"]=305, + ["dotlessjstrokehook"]=644, + ["dotmath"]=8901, + ["dottedcircle"]=9676, + ["downtackbelowcmb"]=798, + ["downtackmod"]=725, + ["dparen"]=9375, + ["dtail"]=598, + ["dtopbar"]=396, + ["duhiragana"]=12389, + ["dukatakana"]=12485, + ["dz"]=499, + ["dzaltone"]=675, + ["dzcaron"]=454, + ["dzcurl"]=677, + ["dzeabkhasiancyrillic"]=1249, + ["dzecyrillic"]=1109, + ["dzhecyrillic"]=1119, + ["e"]=101, + ["eacute"]=233, + ["earth"]=9793, + ["ebengali"]=2447, + ["ebopomofo"]=12572, + ["ebreve"]=277, + ["ecandradeva"]=2317, + ["ecandragujarati"]=2701, + ["ecandravowelsigndeva"]=2373, + ["ecandravowelsigngujarati"]=2757, + ["ecaron"]=283, + ["ecedillabreve"]=7709, + ["echarmenian"]=1381, + ["echyiwnarmenian"]=1415, + ["ecircle"]=9428, + ["ecircumflex"]=234, + ["ecircumflexacute"]=7871, + ["ecircumflexbelow"]=7705, + ["ecircumflexdotbelow"]=7879, + ["ecircumflexgrave"]=7873, + ["ecircumflexhookabove"]=7875, + ["ecircumflextilde"]=7877, + ["ecyrillic"]=1108, + ["edblgrave"]=517, + ["edeva"]=2319, + ["edieresis"]=235, + ["edotaccent"]=279, + ["edotbelow"]=7865, + ["eegurmukhi"]=2575, + ["eematragurmukhi"]=2631, + ["efcyrillic"]=1092, + ["egrave"]=232, + ["egujarati"]=2703, + ["eharmenian"]=1383, + ["ehbopomofo"]=12573, + ["ehiragana"]=12360, + ["ehookabove"]=7867, + ["eibopomofo"]=12575, + ["eight"]=56, + ["eightbengali"]=2542, + ["eightcircle"]=9319, + ["eightcircleinversesansserif"]=10129, + ["eightdeva"]=2414, + ["eighteencircle"]=9329, + ["eighteenparen"]=9349, + ["eighteenperiod"]=9369, + ["eightgujarati"]=2798, + ["eightgurmukhi"]=2670, + ["eighthackarabic"]=1640, + ["eighthangzhou"]=12328, + ["eightideographicparen"]=12839, + ["eightinferior"]=8328, + ["eightmonospace"]=65304, + ["eightparen"]=9339, + ["eightperiod"]=9359, + ["eightpersian"]=1784, + ["eightroman"]=8567, + ["eightsuperior"]=8312, + ["eightthai"]=3672, + ["einvertedbreve"]=519, + ["eiotifiedcyrillic"]=1125, + ["ekatakana"]=12456, + ["ekatakanahalfwidth"]=65396, + ["ekonkargurmukhi"]=2676, + ["ekorean"]=12628, + ["elcyrillic"]=1083, + ["element"]=8712, + ["elevencircle"]=9322, + ["elevenparen"]=9342, + ["elevenperiod"]=9362, + ["elevenroman"]=8570, + ["ellipsis"]=8230, + ["ellipsisvertical"]=8942, + ["emacron"]=275, + ["emacronacute"]=7703, + ["emacrongrave"]=7701, + ["emcyrillic"]=1084, + ["emdash"]=8212, + ["emdashvertical"]=65073, + ["emonospace"]=65349, + ["emphasismarkarmenian"]=1371, + ["emptyset"]=8709, + ["enbopomofo"]=12579, + ["encyrillic"]=1085, + ["endash"]=8211, + ["endashvertical"]=65074, + ["endescendercyrillic"]=1187, + ["eng"]=331, + ["engbopomofo"]=12581, + ["enghecyrillic"]=1189, + ["enhookcyrillic"]=1224, + ["enspace"]=8194, + ["eogonek"]=281, + ["eokorean"]=12627, + ["eopen"]=603, + ["eopenclosed"]=666, + ["eopenreversed"]=604, + ["eopenreversedclosed"]=606, + ["eopenreversedhook"]=605, + ["eparen"]=9376, + ["epsilon"]=949, + ["epsilontonos"]=941, + ["equal"]=61, + ["equalmonospace"]=65309, + ["equalsmall"]=65126, + ["equalsuperior"]=8316, + ["equivalence"]=8801, + ["erbopomofo"]=12582, + ["ercyrillic"]=1088, + ["ereversed"]=600, + ["ereversedcyrillic"]=1101, + ["escyrillic"]=1089, + ["esdescendercyrillic"]=1195, + ["esh"]=643, + ["eshcurl"]=646, + ["eshortdeva"]=2318, + ["eshortvowelsigndeva"]=2374, + ["eshreversedloop"]=426, + ["eshsquatreversed"]=645, + ["esmallhiragana"]=12359, + ["esmallkatakana"]=12455, + ["esmallkatakanahalfwidth"]=65386, + ["estimated"]=8494, + ["eta"]=951, + ["etarmenian"]=1384, + ["etatonos"]=942, + ["eth"]=240, + ["etilde"]=7869, + ["etildebelow"]=7707, + ["etnahtalefthebrew"]=1425, + ["eturned"]=477, + ["eukorean"]=12641, + ["euro"]=8364, + ["evowelsignbengali"]=2503, + ["evowelsigndeva"]=2375, + ["evowelsigngujarati"]=2759, + ["exclam"]=33, + ["exclamarmenian"]=1372, + ["exclamdbl"]=8252, + ["exclamdown"]=161, + ["exclammonospace"]=65281, + ["ezh"]=658, + ["ezhcaron"]=495, + ["ezhcurl"]=659, + ["ezhreversed"]=441, + ["ezhtail"]=442, + ["f"]=102, + ["fadeva"]=2398, + ["fagurmukhi"]=2654, + ["fahrenheit"]=8457, + ["fathalowarabic"]=1614, + ["fathatanarabic"]=1611, + ["fbopomofo"]=12552, + ["fcircle"]=9429, + ["fdotaccent"]=7711, + ["feharabic"]=1601, + ["feharmenian"]=1414, + ["fehfinalarabic"]=65234, + ["fehinitialarabic"]=65235, + ["fehmedialarabic"]=65236, + ["feicoptic"]=997, + ["ff"]=64256, + ["ffi"]=64259, + ["ffl"]=64260, + ["fi"]=64257, + ["fifteencircle"]=9326, + ["fifteenparen"]=9346, + ["fifteenperiod"]=9366, + ["figuredash"]=8210, + ["filledbox"]=9632, + ["filledrect"]=9644, + ["finalkafdageshhebrew"]=64314, + ["finalkafshevahebrew"]=1498, + ["finalmemhebrew"]=1501, + ["finalnunhebrew"]=1503, + ["finalpehebrew"]=1507, + ["finaltsadihebrew"]=1509, + ["firsttonechinese"]=713, + ["fisheye"]=9673, + ["fitacyrillic"]=1139, + ["five"]=53, + ["fivebengali"]=2539, + ["fivecircle"]=9316, + ["fivecircleinversesansserif"]=10126, + ["fivedeva"]=2411, + ["fiveeighths"]=8541, + ["fivegujarati"]=2795, + ["fivegurmukhi"]=2667, + ["fivehackarabic"]=1637, + ["fivehangzhou"]=12325, + ["fiveideographicparen"]=12836, + ["fiveinferior"]=8325, + ["fivemonospace"]=65301, + ["fiveparen"]=9336, + ["fiveperiod"]=9356, + ["fivepersian"]=1781, + ["fiveroman"]=8564, + ["fivesuperior"]=8309, + ["fivethai"]=3669, + ["fl"]=64258, + ["florin"]=402, + ["fmonospace"]=65350, + ["fmsquare"]=13209, + ["fofanthai"]=3615, + ["fofathai"]=3613, + ["fongmanthai"]=3663, + ["four"]=52, + ["fourbengali"]=2538, + ["fourcircle"]=9315, + ["fourcircleinversesansserif"]=10125, + ["fourdeva"]=2410, + ["fourgujarati"]=2794, + ["fourgurmukhi"]=2666, + ["fourhackarabic"]=1636, + ["fourhangzhou"]=12324, + ["fourideographicparen"]=12835, + ["fourinferior"]=8324, + ["fourmonospace"]=65300, + ["fournumeratorbengali"]=2551, + ["fourparen"]=9335, + ["fourperiod"]=9355, + ["fourpersian"]=1780, + ["fourroman"]=8563, + ["foursuperior"]=8308, + ["fourteencircle"]=9325, + ["fourteenparen"]=9345, + ["fourteenperiod"]=9365, + ["fourthai"]=3668, + ["fourthtonechinese"]=715, + ["fparen"]=9377, + ["fraction"]=8260, + ["franc"]=8355, + ["g"]=103, + ["gabengali"]=2455, + ["gacute"]=501, + ["gadeva"]=2327, + ["gafarabic"]=1711, + ["gaffinalarabic"]=64403, + ["gafinitialarabic"]=64404, + ["gafmedialarabic"]=64405, + ["gagujarati"]=2711, + ["gagurmukhi"]=2583, + ["gahiragana"]=12364, + ["gakatakana"]=12460, + ["gamma"]=947, + ["gammalatinsmall"]=611, + ["gammasuperior"]=736, + ["gangiacoptic"]=1003, + ["gbopomofo"]=12557, + ["gbreve"]=287, + ["gcaron"]=487, + ["gcircle"]=9430, + ["gcircumflex"]=285, + ["gcommaaccent"]=291, + ["gdotaccent"]=289, + ["gecyrillic"]=1075, + ["gehiragana"]=12370, + ["gekatakana"]=12466, + ["geometricallyequal"]=8785, + ["gereshaccenthebrew"]=1436, + ["gereshhebrew"]=1523, + ["gereshmuqdamhebrew"]=1437, + ["germandbls"]=223, + ["gershayimaccenthebrew"]=1438, + ["gershayimhebrew"]=1524, + ["getamark"]=12307, + ["ghabengali"]=2456, + ["ghadarmenian"]=1394, + ["ghadeva"]=2328, + ["ghagujarati"]=2712, + ["ghagurmukhi"]=2584, + ["ghainarabic"]=1594, + ["ghainfinalarabic"]=65230, + ["ghaininitialarabic"]=65231, + ["ghainmedialarabic"]=65232, + ["ghemiddlehookcyrillic"]=1173, + ["ghestrokecyrillic"]=1171, + ["gheupturncyrillic"]=1169, + ["ghhadeva"]=2394, + ["ghhagurmukhi"]=2650, + ["ghook"]=608, + ["ghzsquare"]=13203, + ["gihiragana"]=12366, + ["gikatakana"]=12462, + ["gimarmenian"]=1379, + ["gimeldageshhebrew"]=64306, + ["gimelhebrew"]=1490, + ["gjecyrillic"]=1107, + ["glottalinvertedstroke"]=446, + ["glottalstop"]=660, + ["glottalstopinverted"]=662, + ["glottalstopmod"]=704, + ["glottalstopreversed"]=661, + ["glottalstopreversedmod"]=705, + ["glottalstopreversedsuperior"]=740, + ["glottalstopstroke"]=673, + ["glottalstopstrokereversed"]=674, + ["gmacron"]=7713, + ["gmonospace"]=65351, + ["gohiragana"]=12372, + ["gokatakana"]=12468, + ["gparen"]=9378, + ["gpasquare"]=13228, + ["grave"]=96, + ["gravebelowcmb"]=790, + ["gravecomb"]=768, + ["gravedeva"]=2387, + ["gravelowmod"]=718, + ["gravemonospace"]=65344, + ["gravetonecmb"]=832, + ["greater"]=62, + ["greaterequal"]=8805, + ["greaterequalorless"]=8923, + ["greatermonospace"]=65310, + ["greaterorequivalent"]=8819, + ["greaterorless"]=8823, + ["greateroverequal"]=8807, + ["greatersmall"]=65125, + ["gscript"]=609, + ["gstroke"]=485, + ["guhiragana"]=12368, + ["guillemotleft"]=171, + ["guillemotright"]=187, + ["guilsinglleft"]=8249, + ["guilsinglright"]=8250, + ["gukatakana"]=12464, + ["guramusquare"]=13080, + ["gysquare"]=13257, + ["h"]=104, + ["haabkhasiancyrillic"]=1193, + ["habengali"]=2489, + ["hadescendercyrillic"]=1203, + ["hadeva"]=2361, + ["hagujarati"]=2745, + ["hagurmukhi"]=2617, + ["haharabic"]=1581, + ["hahfinalarabic"]=65186, + ["hahinitialarabic"]=65187, + ["hahiragana"]=12399, + ["hahmedialarabic"]=65188, + ["haitusquare"]=13098, + ["hakatakana"]=12495, + ["hakatakanahalfwidth"]=65418, + ["halantgurmukhi"]=2637, + ["hamzasukunarabic"]=1569, + ["hangulfiller"]=12644, + ["hardsigncyrillic"]=1098, + ["harpoonleftbarbup"]=8636, + ["harpoonrightbarbup"]=8640, + ["hasquare"]=13258, + ["hatafpatahwidehebrew"]=1458, + ["hatafqamatswidehebrew"]=1459, + ["hatafsegolwidehebrew"]=1457, + ["hbar"]=295, + ["hbopomofo"]=12559, + ["hbrevebelow"]=7723, + ["hcedilla"]=7721, + ["hcircle"]=9431, + ["hcircumflex"]=293, + ["hdieresis"]=7719, + ["hdotaccent"]=7715, + ["hdotbelow"]=7717, + ["heartsuitblack"]=9829, + ["heartsuitwhite"]=9825, + ["hedageshhebrew"]=64308, + ["hehaltonearabic"]=1729, + ["heharabic"]=1607, + ["hehebrew"]=1492, + ["hehfinalaltonearabic"]=64423, + ["hehfinalarabic"]=65258, + ["hehhamzaabovefinalarabic"]=64421, + ["hehhamzaaboveisolatedarabic"]=64420, + ["hehinitialaltonearabic"]=64424, + ["hehinitialarabic"]=65259, + ["hehiragana"]=12408, + ["hehmedialaltonearabic"]=64425, + ["hehmedialarabic"]=65260, + ["heiseierasquare"]=13179, + ["hekatakana"]=12504, + ["hekatakanahalfwidth"]=65421, + ["hekutaarusquare"]=13110, + ["henghook"]=615, + ["herutusquare"]=13113, + ["hethebrew"]=1495, + ["hhook"]=614, + ["hhooksuperior"]=689, + ["hieuhacirclekorean"]=12923, + ["hieuhaparenkorean"]=12827, + ["hieuhcirclekorean"]=12909, + ["hieuhkorean"]=12622, + ["hieuhparenkorean"]=12813, + ["hihiragana"]=12402, + ["hikatakana"]=12498, + ["hikatakanahalfwidth"]=65419, + ["hiriqwidehebrew"]=1460, + ["hlinebelow"]=7830, + ["hmonospace"]=65352, + ["hoarmenian"]=1392, + ["hohipthai"]=3627, + ["hohiragana"]=12411, + ["hokatakana"]=12507, + ["hokatakanahalfwidth"]=65422, + ["holamwidehebrew"]=1465, + ["honokhukthai"]=3630, + ["hookcmb"]=777, + ["hookpalatalizedbelowcmb"]=801, + ["hookretroflexbelowcmb"]=802, + ["hoonsquare"]=13122, + ["horicoptic"]=1001, + ["horizontalbar"]=8213, + ["horncmb"]=795, + ["hotsprings"]=9832, + ["house"]=8962, + ["hparen"]=9379, + ["hsuperior"]=688, + ["hturned"]=613, + ["huhiragana"]=12405, + ["huiitosquare"]=13107, + ["hukatakana"]=12501, + ["hukatakanahalfwidth"]=65420, + ["hungarumlaut"]=733, + ["hungarumlautcmb"]=779, + ["hv"]=405, + ["hyphen"]=45, + ["hyphenmonospace"]=65293, + ["hyphensmall"]=65123, + ["hyphentwo"]=8208, + ["i"]=105, + ["iacute"]=237, + ["iacyrillic"]=1103, + ["ibengali"]=2439, + ["ibopomofo"]=12583, + ["ibreve"]=301, + ["icaron"]=464, + ["icircle"]=9432, + ["icircumflex"]=238, + ["icyrillic"]=1110, + ["idblgrave"]=521, + ["ideographearthcircle"]=12943, + ["ideographfirecircle"]=12939, + ["ideographicallianceparen"]=12863, + ["ideographiccallparen"]=12858, + ["ideographiccentrecircle"]=12965, + ["ideographicclose"]=12294, + ["ideographiccomma"]=12289, + ["ideographiccommaleft"]=65380, + ["ideographiccongratulationparen"]=12855, + ["ideographiccorrectcircle"]=12963, + ["ideographicearthparen"]=12847, + ["ideographicenterpriseparen"]=12861, + ["ideographicexcellentcircle"]=12957, + ["ideographicfestivalparen"]=12864, + ["ideographicfinancialcircle"]=12950, + ["ideographicfinancialparen"]=12854, + ["ideographicfireparen"]=12843, + ["ideographichaveparen"]=12850, + ["ideographichighcircle"]=12964, + ["ideographiciterationmark"]=12293, + ["ideographiclaborcircle"]=12952, + ["ideographiclaborparen"]=12856, + ["ideographicleftcircle"]=12967, + ["ideographiclowcircle"]=12966, + ["ideographicmedicinecircle"]=12969, + ["ideographicmetalparen"]=12846, + ["ideographicmoonparen"]=12842, + ["ideographicnameparen"]=12852, + ["ideographicperiod"]=12290, + ["ideographicprintcircle"]=12958, + ["ideographicreachparen"]=12867, + ["ideographicrepresentparen"]=12857, + ["ideographicresourceparen"]=12862, + ["ideographicrightcircle"]=12968, + ["ideographicsecretcircle"]=12953, + ["ideographicselfparen"]=12866, + ["ideographicsocietyparen"]=12851, + ["ideographicspace"]=12288, + ["ideographicspecialparen"]=12853, + ["ideographicstockparen"]=12849, + ["ideographicstudyparen"]=12859, + ["ideographicsunparen"]=12848, + ["ideographicsuperviseparen"]=12860, + ["ideographicwaterparen"]=12844, + ["ideographicwoodparen"]=12845, + ["ideographiczero"]=12295, + ["ideographmetalcircle"]=12942, + ["ideographmooncircle"]=12938, + ["ideographnamecircle"]=12948, + ["ideographsuncircle"]=12944, + ["ideographwatercircle"]=12940, + ["ideographwoodcircle"]=12941, + ["ideva"]=2311, + ["idieresis"]=239, + ["idieresisacute"]=7727, + ["idieresiscyrillic"]=1253, + ["idotbelow"]=7883, + ["iebrevecyrillic"]=1239, + ["iecyrillic"]=1077, + ["ieungacirclekorean"]=12917, + ["ieungaparenkorean"]=12821, + ["ieungcirclekorean"]=12903, + ["ieungkorean"]=12615, + ["ieungparenkorean"]=12807, + ["igrave"]=236, + ["igujarati"]=2695, + ["igurmukhi"]=2567, + ["ihiragana"]=12356, + ["ihookabove"]=7881, + ["iibengali"]=2440, + ["iicyrillic"]=1080, + ["iideva"]=2312, + ["iigujarati"]=2696, + ["iigurmukhi"]=2568, + ["iimatragurmukhi"]=2624, + ["iinvertedbreve"]=523, + ["iishortcyrillic"]=1081, + ["iivowelsignbengali"]=2496, + ["iivowelsigndeva"]=2368, + ["iivowelsigngujarati"]=2752, + ["ij"]=307, + ["ikatakana"]=12452, + ["ikatakanahalfwidth"]=65394, + ["ikorean"]=12643, + ["iluyhebrew"]=1452, + ["imacron"]=299, + ["imacroncyrillic"]=1251, + ["imageorapproximatelyequal"]=8787, + ["imatragurmukhi"]=2623, + ["imonospace"]=65353, + ["increment"]=8710, + ["infinity"]=8734, + ["iniarmenian"]=1387, + ["integral"]=8747, + ["integralbt"]=8993, + ["integraltp"]=8992, + ["intersection"]=8745, + ["intisquare"]=13061, + ["invbullet"]=9688, + ["invsmileface"]=9787, + ["iocyrillic"]=1105, + ["iogonek"]=303, + ["iota"]=953, + ["iotadieresis"]=970, + ["iotadieresistonos"]=912, + ["iotalatin"]=617, + ["iotatonos"]=943, + ["iparen"]=9380, + ["irigurmukhi"]=2674, + ["ismallhiragana"]=12355, + ["ismallkatakana"]=12451, + ["ismallkatakanahalfwidth"]=65384, + ["issharbengali"]=2554, + ["istroke"]=616, + ["iterationhiragana"]=12445, + ["iterationkatakana"]=12541, + ["itilde"]=297, + ["itildebelow"]=7725, + ["iubopomofo"]=12585, + ["iucyrillic"]=1102, + ["ivowelsignbengali"]=2495, + ["ivowelsigndeva"]=2367, + ["ivowelsigngujarati"]=2751, + ["izhitsacyrillic"]=1141, + ["izhitsadblgravecyrillic"]=1143, + ["j"]=106, + ["jaarmenian"]=1393, + ["jabengali"]=2460, + ["jadeva"]=2332, + ["jagujarati"]=2716, + ["jagurmukhi"]=2588, + ["jbopomofo"]=12560, + ["jcaron"]=496, + ["jcircle"]=9433, + ["jcircumflex"]=309, + ["jcrossedtail"]=669, + ["jdotlessstroke"]=607, + ["jecyrillic"]=1112, + ["jeemarabic"]=1580, + ["jeemfinalarabic"]=65182, + ["jeeminitialarabic"]=65183, + ["jeemmedialarabic"]=65184, + ["jeharabic"]=1688, + ["jehfinalarabic"]=64395, + ["jhabengali"]=2461, + ["jhadeva"]=2333, + ["jhagujarati"]=2717, + ["jhagurmukhi"]=2589, + ["jheharmenian"]=1403, + ["jis"]=12292, + ["jmonospace"]=65354, + ["jparen"]=9381, + ["jsuperior"]=690, + ["k"]=107, + ["kabashkircyrillic"]=1185, + ["kabengali"]=2453, + ["kacute"]=7729, + ["kacyrillic"]=1082, + ["kadescendercyrillic"]=1179, + ["kadeva"]=2325, + ["kafarabic"]=1603, + ["kafdageshhebrew"]=64315, + ["kaffinalarabic"]=65242, + ["kafhebrew"]=1499, + ["kafinitialarabic"]=65243, + ["kafmedialarabic"]=65244, + ["kafrafehebrew"]=64333, + ["kagujarati"]=2709, + ["kagurmukhi"]=2581, + ["kahiragana"]=12363, + ["kahookcyrillic"]=1220, + ["kakatakana"]=12459, + ["kakatakanahalfwidth"]=65398, + ["kappa"]=954, + ["kappasymbolgreek"]=1008, + ["kapyeounmieumkorean"]=12657, + ["kapyeounphieuphkorean"]=12676, + ["kapyeounpieupkorean"]=12664, + ["kapyeounssangpieupkorean"]=12665, + ["karoriisquare"]=13069, + ["kasmallkatakana"]=12533, + ["kasquare"]=13188, + ["kasraarabic"]=1616, + ["kasratanarabic"]=1613, + ["kastrokecyrillic"]=1183, + ["katahiraprolongmarkhalfwidth"]=65392, + ["kaverticalstrokecyrillic"]=1181, + ["kbopomofo"]=12558, + ["kcalsquare"]=13193, + ["kcaron"]=489, + ["kcircle"]=9434, + ["kcommaaccent"]=311, + ["kdotbelow"]=7731, + ["keharmenian"]=1412, + ["kehiragana"]=12369, + ["kekatakana"]=12465, + ["kekatakanahalfwidth"]=65401, + ["kenarmenian"]=1391, + ["kesmallkatakana"]=12534, + ["kgreenlandic"]=312, + ["khabengali"]=2454, + ["khacyrillic"]=1093, + ["khadeva"]=2326, + ["khagujarati"]=2710, + ["khagurmukhi"]=2582, + ["khaharabic"]=1582, + ["khahfinalarabic"]=65190, + ["khahinitialarabic"]=65191, + ["khahmedialarabic"]=65192, + ["kheicoptic"]=999, + ["khhadeva"]=2393, + ["khhagurmukhi"]=2649, + ["khieukhacirclekorean"]=12920, + ["khieukhaparenkorean"]=12824, + ["khieukhcirclekorean"]=12906, + ["khieukhkorean"]=12619, + ["khieukhparenkorean"]=12810, + ["khokhaithai"]=3586, + ["khokhonthai"]=3589, + ["khokhuatthai"]=3587, + ["khokhwaithai"]=3588, + ["khomutthai"]=3675, + ["khook"]=409, + ["khorakhangthai"]=3590, + ["khzsquare"]=13201, + ["kihiragana"]=12365, + ["kikatakana"]=12461, + ["kikatakanahalfwidth"]=65399, + ["kiroguramusquare"]=13077, + ["kiromeetorusquare"]=13078, + ["kirosquare"]=13076, + ["kiyeokacirclekorean"]=12910, + ["kiyeokaparenkorean"]=12814, + ["kiyeokcirclekorean"]=12896, + ["kiyeokkorean"]=12593, + ["kiyeokparenkorean"]=12800, + ["kiyeoksioskorean"]=12595, + ["kjecyrillic"]=1116, + ["klinebelow"]=7733, + ["klsquare"]=13208, + ["kmcubedsquare"]=13222, + ["kmonospace"]=65355, + ["kmsquaredsquare"]=13218, + ["kohiragana"]=12371, + ["kohmsquare"]=13248, + ["kokaithai"]=3585, + ["kokatakana"]=12467, + ["kokatakanahalfwidth"]=65402, + ["kooposquare"]=13086, + ["koppacyrillic"]=1153, + ["koreanstandardsymbol"]=12927, + ["koroniscmb"]=835, + ["kparen"]=9382, + ["kpasquare"]=13226, + ["ksicyrillic"]=1135, + ["ktsquare"]=13263, + ["kturned"]=670, + ["kuhiragana"]=12367, + ["kukatakana"]=12463, + ["kukatakanahalfwidth"]=65400, + ["kvsquare"]=13240, + ["kwsquare"]=13246, + ["l"]=108, + ["labengali"]=2482, + ["lacute"]=314, + ["ladeva"]=2354, + ["lagujarati"]=2738, + ["lagurmukhi"]=2610, + ["lakkhangyaothai"]=3653, + ["lamaleffinalarabic"]=65276, + ["lamalefhamzaabovefinalarabic"]=65272, + ["lamalefhamzaaboveisolatedarabic"]=65271, + ["lamalefhamzabelowfinalarabic"]=65274, + ["lamalefhamzabelowisolatedarabic"]=65273, + ["lamalefisolatedarabic"]=65275, + ["lamalefmaddaabovefinalarabic"]=65270, + ["lamalefmaddaaboveisolatedarabic"]=65269, + ["lamarabic"]=1604, + ["lambda"]=955, + ["lambdastroke"]=411, + ["lameddageshhebrew"]=64316, + ["lamedholamhebrew"]=1500, + ["lamfinalarabic"]=65246, + ["lamhahinitialarabic"]=64714, + ["lamjeeminitialarabic"]=64713, + ["lamkhahinitialarabic"]=64715, + ["lamlamhehisolatedarabic"]=65010, + ["lammedialarabic"]=65248, + ["lammeemhahinitialarabic"]=64904, + ["lammeeminitialarabic"]=64716, + ["lammeemkhahinitialarabic"]=65247, + ["largecircle"]=9711, + ["lbar"]=410, + ["lbelt"]=620, + ["lbopomofo"]=12556, + ["lcaron"]=318, + ["lcircle"]=9435, + ["lcircumflexbelow"]=7741, + ["lcommaaccent"]=316, + ["ldotaccent"]=320, + ["ldotbelow"]=7735, + ["ldotbelowmacron"]=7737, + ["leftangleabovecmb"]=794, + ["lefttackbelowcmb"]=792, + ["less"]=60, + ["lessequal"]=8804, + ["lessequalorgreater"]=8922, + ["lessmonospace"]=65308, + ["lessorequivalent"]=8818, + ["lessorgreater"]=8822, + ["lessoverequal"]=8806, + ["lesssmall"]=65124, + ["lezh"]=622, + ["lfblock"]=9612, + ["lhookretroflex"]=621, + ["lira"]=8356, + ["liwnarmenian"]=1388, + ["lj"]=457, + ["ljecyrillic"]=1113, + ["lladeva"]=2355, + ["llagujarati"]=2739, + ["llinebelow"]=7739, + ["llladeva"]=2356, + ["llvocalicbengali"]=2529, + ["llvocalicdeva"]=2401, + ["llvocalicvowelsignbengali"]=2531, + ["llvocalicvowelsigndeva"]=2403, + ["lmiddletilde"]=619, + ["lmonospace"]=65356, + ["lmsquare"]=13264, + ["lochulathai"]=3628, + ["logicaland"]=8743, + ["logicalnot"]=172, + ["logicalor"]=8744, + ["lolingthai"]=3621, + ["lowlinecenterline"]=65102, + ["lowlinecmb"]=818, + ["lowlinedashed"]=65101, + ["lozenge"]=9674, + ["lparen"]=9383, + ["lslash"]=322, + ["lsquare"]=8467, + ["luthai"]=3622, + ["lvocalicbengali"]=2444, + ["lvocalicdeva"]=2316, + ["lvocalicvowelsignbengali"]=2530, + ["lvocalicvowelsigndeva"]=2402, + ["lxsquare"]=13267, + ["m"]=109, + ["mabengali"]=2478, + ["macron"]=175, + ["macronbelowcmb"]=817, + ["macroncmb"]=772, + ["macronlowmod"]=717, + ["macronmonospace"]=65507, + ["macute"]=7743, + ["madeva"]=2350, + ["magujarati"]=2734, + ["magurmukhi"]=2606, + ["mahapakhlefthebrew"]=1444, + ["mahiragana"]=12414, + ["maichattawathai"]=3659, + ["maiekthai"]=3656, + ["maihanakatthai"]=3633, + ["maitaikhuthai"]=3655, + ["maithothai"]=3657, + ["maitrithai"]=3658, + ["maiyamokthai"]=3654, + ["makatakana"]=12510, + ["makatakanahalfwidth"]=65423, + ["mansyonsquare"]=13127, + ["maqafhebrew"]=1470, + ["mars"]=9794, + ["masoracirclehebrew"]=1455, + ["masquare"]=13187, + ["mbopomofo"]=12551, + ["mbsquare"]=13268, + ["mcircle"]=9436, + ["mcubedsquare"]=13221, + ["mdotaccent"]=7745, + ["mdotbelow"]=7747, + ["meemarabic"]=1605, + ["meemfinalarabic"]=65250, + ["meeminitialarabic"]=65251, + ["meemmedialarabic"]=65252, + ["meemmeeminitialarabic"]=64721, + ["meemmeemisolatedarabic"]=64584, + ["meetorusquare"]=13133, + ["mehiragana"]=12417, + ["meizierasquare"]=13182, + ["mekatakana"]=12513, + ["mekatakanahalfwidth"]=65426, + ["memdageshhebrew"]=64318, + ["memhebrew"]=1502, + ["menarmenian"]=1396, + ["merkhakefulalefthebrew"]=1446, + ["merkhalefthebrew"]=1445, + ["mhook"]=625, + ["mhzsquare"]=13202, + ["middledotkatakanahalfwidth"]=65381, + ["mieumacirclekorean"]=12914, + ["mieumaparenkorean"]=12818, + ["mieumcirclekorean"]=12900, + ["mieumkorean"]=12609, + ["mieumpansioskorean"]=12656, + ["mieumparenkorean"]=12804, + ["mieumpieupkorean"]=12654, + ["mieumsioskorean"]=12655, + ["mihiragana"]=12415, + ["mikatakana"]=12511, + ["mikatakanahalfwidth"]=65424, + ["minus"]=8722, + ["minusbelowcmb"]=800, + ["minuscircle"]=8854, + ["minusmod"]=727, + ["minusplus"]=8723, + ["minute"]=8242, + ["miribaarusquare"]=13130, + ["mirisquare"]=13129, + ["mlonglegturned"]=624, + ["mlsquare"]=13206, + ["mmcubedsquare"]=13219, + ["mmonospace"]=65357, + ["mmsquaredsquare"]=13215, + ["mohiragana"]=12418, + ["mohmsquare"]=13249, + ["mokatakana"]=12514, + ["mokatakanahalfwidth"]=65427, + ["molsquare"]=13270, + ["momathai"]=3617, + ["moverssquare"]=13223, + ["moverssquaredsquare"]=13224, + ["mparen"]=9384, + ["mpasquare"]=13227, + ["mssquare"]=13235, + ["mturned"]=623, + ["mu1"]=181, + ["muasquare"]=13186, + ["muchgreater"]=8811, + ["muchless"]=8810, + ["mufsquare"]=13196, + ["mugreek"]=956, + ["mugsquare"]=13197, + ["muhiragana"]=12416, + ["mukatakana"]=12512, + ["mukatakanahalfwidth"]=65425, + ["mulsquare"]=13205, + ["multiply"]=215, + ["mumsquare"]=13211, + ["munahlefthebrew"]=1443, + ["musicalnote"]=9834, + ["musicalnotedbl"]=9835, + ["musicflatsign"]=9837, + ["musicsharpsign"]=9839, + ["mussquare"]=13234, + ["muvsquare"]=13238, + ["muwsquare"]=13244, + ["mvmegasquare"]=13241, + ["mvsquare"]=13239, + ["mwmegasquare"]=13247, + ["mwsquare"]=13245, + ["n"]=110, + ["nabengali"]=2472, + ["nabla"]=8711, + ["nacute"]=324, + ["nadeva"]=2344, + ["nagujarati"]=2728, + ["nagurmukhi"]=2600, + ["nahiragana"]=12394, + ["nakatakana"]=12490, + ["nakatakanahalfwidth"]=65413, + ["nasquare"]=13185, + ["nbopomofo"]=12555, + ["ncaron"]=328, + ["ncircle"]=9437, + ["ncircumflexbelow"]=7755, + ["ncommaaccent"]=326, + ["ndotaccent"]=7749, + ["ndotbelow"]=7751, + ["nehiragana"]=12397, + ["nekatakana"]=12493, + ["nekatakanahalfwidth"]=65416, + ["nfsquare"]=13195, + ["ngabengali"]=2457, + ["ngadeva"]=2329, + ["ngagujarati"]=2713, + ["ngagurmukhi"]=2585, + ["ngonguthai"]=3591, + ["nhiragana"]=12435, + ["nhookleft"]=626, + ["nhookretroflex"]=627, + ["nieunacirclekorean"]=12911, + ["nieunaparenkorean"]=12815, + ["nieuncieuckorean"]=12597, + ["nieuncirclekorean"]=12897, + ["nieunhieuhkorean"]=12598, + ["nieunkorean"]=12596, + ["nieunpansioskorean"]=12648, + ["nieunparenkorean"]=12801, + ["nieunsioskorean"]=12647, + ["nieuntikeutkorean"]=12646, + ["nihiragana"]=12395, + ["nikatakana"]=12491, + ["nikatakanahalfwidth"]=65414, + ["nikhahitthai"]=3661, + ["nine"]=57, + ["ninebengali"]=2543, + ["ninecircle"]=9320, + ["ninecircleinversesansserif"]=10130, + ["ninedeva"]=2415, + ["ninegujarati"]=2799, + ["ninegurmukhi"]=2671, + ["ninehackarabic"]=1641, + ["ninehangzhou"]=12329, + ["nineideographicparen"]=12840, + ["nineinferior"]=8329, + ["ninemonospace"]=65305, + ["nineparen"]=9340, + ["nineperiod"]=9360, + ["ninepersian"]=1785, + ["nineroman"]=8568, + ["ninesuperior"]=8313, + ["nineteencircle"]=9330, + ["nineteenparen"]=9350, + ["nineteenperiod"]=9370, + ["ninethai"]=3673, + ["nj"]=460, + ["njecyrillic"]=1114, + ["nkatakana"]=12531, + ["nkatakanahalfwidth"]=65437, + ["nlegrightlong"]=414, + ["nlinebelow"]=7753, + ["nmonospace"]=65358, + ["nmsquare"]=13210, + ["nnabengali"]=2467, + ["nnadeva"]=2339, + ["nnagujarati"]=2723, + ["nnagurmukhi"]=2595, + ["nnnadeva"]=2345, + ["nohiragana"]=12398, + ["nokatakana"]=12494, + ["nokatakanahalfwidth"]=65417, + ["nonbreakingspace"]=160, + ["nonenthai"]=3603, + ["nonuthai"]=3609, + ["noonarabic"]=1606, + ["noonfinalarabic"]=65254, + ["noonghunnaarabic"]=1722, + ["noonghunnafinalarabic"]=64415, + ["nooninitialarabic"]=65255, + ["noonjeeminitialarabic"]=64722, + ["noonjeemisolatedarabic"]=64587, + ["noonmedialarabic"]=65256, + ["noonmeeminitialarabic"]=64725, + ["noonmeemisolatedarabic"]=64590, + ["noonnoonfinalarabic"]=64653, + ["notcontains"]=8716, + ["notelementof"]=8713, + ["notequal"]=8800, + ["notgreater"]=8815, + ["notgreaternorequal"]=8817, + ["notgreaternorless"]=8825, + ["notidentical"]=8802, + ["notless"]=8814, + ["notlessnorequal"]=8816, + ["notparallel"]=8742, + ["notprecedes"]=8832, + ["notsubset"]=8836, + ["notsucceeds"]=8833, + ["notsuperset"]=8837, + ["nowarmenian"]=1398, + ["nparen"]=9385, + ["nssquare"]=13233, + ["nsuperior"]=8319, + ["ntilde"]=241, + ["nu"]=957, + ["nuhiragana"]=12396, + ["nukatakana"]=12492, + ["nukatakanahalfwidth"]=65415, + ["nuktabengali"]=2492, + ["nuktadeva"]=2364, + ["nuktagujarati"]=2748, + ["nuktagurmukhi"]=2620, + ["numbersign"]=35, + ["numbersignmonospace"]=65283, + ["numbersignsmall"]=65119, + ["numeralsigngreek"]=884, + ["numeralsignlowergreek"]=885, + ["numero"]=8470, + ["nundageshhebrew"]=64320, + ["nunhebrew"]=1504, + ["nvsquare"]=13237, + ["nwsquare"]=13243, + ["nyabengali"]=2462, + ["nyadeva"]=2334, + ["nyagujarati"]=2718, + ["nyagurmukhi"]=2590, + ["o"]=111, + ["oacute"]=243, + ["oangthai"]=3629, + ["obarred"]=629, + ["obarredcyrillic"]=1257, + ["obarreddieresiscyrillic"]=1259, + ["obengali"]=2451, + ["obopomofo"]=12571, + ["obreve"]=335, + ["ocandradeva"]=2321, + ["ocandragujarati"]=2705, + ["ocandravowelsigndeva"]=2377, + ["ocandravowelsigngujarati"]=2761, + ["ocaron"]=466, + ["ocircle"]=9438, + ["ocircumflex"]=244, + ["ocircumflexacute"]=7889, + ["ocircumflexdotbelow"]=7897, + ["ocircumflexgrave"]=7891, + ["ocircumflexhookabove"]=7893, + ["ocircumflextilde"]=7895, + ["ocyrillic"]=1086, + ["odblgrave"]=525, + ["odeva"]=2323, + ["odieresis"]=246, + ["odieresiscyrillic"]=1255, + ["odotbelow"]=7885, + ["oe"]=339, + ["oekorean"]=12634, + ["ogonek"]=731, + ["ogonekcmb"]=808, + ["ograve"]=242, + ["ogujarati"]=2707, + ["oharmenian"]=1413, + ["ohiragana"]=12362, + ["ohookabove"]=7887, + ["ohorn"]=417, + ["ohornacute"]=7899, + ["ohorndotbelow"]=7907, + ["ohorngrave"]=7901, + ["ohornhookabove"]=7903, + ["ohorntilde"]=7905, + ["ohungarumlaut"]=337, + ["oi"]=419, + ["oinvertedbreve"]=527, + ["okatakana"]=12458, + ["okatakanahalfwidth"]=65397, + ["okorean"]=12631, + ["olehebrew"]=1451, + ["omacron"]=333, + ["omacronacute"]=7763, + ["omacrongrave"]=7761, + ["omdeva"]=2384, + ["omega"]=969, + ["omegacyrillic"]=1121, + ["omegalatinclosed"]=631, + ["omegaroundcyrillic"]=1147, + ["omegatitlocyrillic"]=1149, + ["omegatonos"]=974, + ["omgujarati"]=2768, + ["omicron"]=959, + ["omicrontonos"]=972, + ["omonospace"]=65359, + ["one"]=49, + ["onebengali"]=2535, + ["onecircle"]=9312, + ["onecircleinversesansserif"]=10122, + ["onedeva"]=2407, + ["onedotenleader"]=8228, + ["oneeighth"]=8539, + ["onegujarati"]=2791, + ["onegurmukhi"]=2663, + ["onehackarabic"]=1633, + ["onehalf"]=189, + ["onehangzhou"]=12321, + ["oneideographicparen"]=12832, + ["oneinferior"]=8321, + ["onemonospace"]=65297, + ["onenumeratorbengali"]=2548, + ["oneparen"]=9332, + ["oneperiod"]=9352, + ["onepersian"]=1777, + ["onequarter"]=188, + ["oneroman"]=8560, + ["onesuperior"]=185, + ["onethai"]=3665, + ["onethird"]=8531, + ["oogonek"]=491, + ["oogonekmacron"]=493, + ["oogurmukhi"]=2579, + ["oomatragurmukhi"]=2635, + ["oopen"]=596, + ["oparen"]=9386, + ["option"]=8997, + ["ordfeminine"]=170, + ["ordmasculine"]=186, + ["oshortdeva"]=2322, + ["oshortvowelsigndeva"]=2378, + ["oslash"]=248, + ["osmallhiragana"]=12361, + ["osmallkatakana"]=12457, + ["osmallkatakanahalfwidth"]=65387, + ["ostrokeacute"]=511, + ["otcyrillic"]=1151, + ["otilde"]=245, + ["otildeacute"]=7757, + ["otildedieresis"]=7759, + ["oubopomofo"]=12577, + ["overline"]=8254, + ["overlinecenterline"]=65098, + ["overlinecmb"]=773, + ["overlinedashed"]=65097, + ["overlinedblwavy"]=65100, + ["overlinewavy"]=65099, + ["ovowelsignbengali"]=2507, + ["ovowelsigndeva"]=2379, + ["ovowelsigngujarati"]=2763, + ["p"]=112, + ["paampssquare"]=13184, + ["paasentosquare"]=13099, + ["pabengali"]=2474, + ["pacute"]=7765, + ["padeva"]=2346, + ["pagedown"]=8671, + ["pageup"]=8670, + ["pagujarati"]=2730, + ["pagurmukhi"]=2602, + ["pahiragana"]=12401, + ["paiyannoithai"]=3631, + ["pakatakana"]=12497, + ["palatalizationcyrilliccmb"]=1156, + ["palochkacyrillic"]=1216, + ["pansioskorean"]=12671, + ["paragraph"]=182, + ["parallel"]=8741, + ["parenleft"]=40, + ["parenleftaltonearabic"]=64830, + ["parenleftinferior"]=8333, + ["parenleftmonospace"]=65288, + ["parenleftsmall"]=65113, + ["parenleftsuperior"]=8317, + ["parenleftvertical"]=65077, + ["parenright"]=41, + ["parenrightaltonearabic"]=64831, + ["parenrightinferior"]=8334, + ["parenrightmonospace"]=65289, + ["parenrightsmall"]=65114, + ["parenrightsuperior"]=8318, + ["parenrightvertical"]=65078, + ["partialdiff"]=8706, + ["paseqhebrew"]=1472, + ["pashtahebrew"]=1433, + ["pasquare"]=13225, + ["patahwidehebrew"]=1463, + ["pazerhebrew"]=1441, + ["pbopomofo"]=12550, + ["pcircle"]=9439, + ["pdotaccent"]=7767, + ["pecyrillic"]=1087, + ["pedageshhebrew"]=64324, + ["peezisquare"]=13115, + ["pefinaldageshhebrew"]=64323, + ["peharabic"]=1662, + ["peharmenian"]=1402, + ["pehebrew"]=1508, + ["pehfinalarabic"]=64343, + ["pehinitialarabic"]=64344, + ["pehiragana"]=12410, + ["pehmedialarabic"]=64345, + ["pekatakana"]=12506, + ["pemiddlehookcyrillic"]=1191, + ["perafehebrew"]=64334, + ["percent"]=37, + ["percentarabic"]=1642, + ["percentmonospace"]=65285, + ["percentsmall"]=65130, + ["period"]=46, + ["periodarmenian"]=1417, + ["periodcentered"]=183, + ["periodhalfwidth"]=65377, + ["periodmonospace"]=65294, + ["periodsmall"]=65106, + ["perispomenigreekcmb"]=834, + ["perpendicular"]=8869, + ["perthousand"]=8240, + ["peseta"]=8359, + ["pfsquare"]=13194, + ["phabengali"]=2475, + ["phadeva"]=2347, + ["phagujarati"]=2731, + ["phagurmukhi"]=2603, + ["phi"]=966, + ["phieuphacirclekorean"]=12922, + ["phieuphaparenkorean"]=12826, + ["phieuphcirclekorean"]=12908, + ["phieuphkorean"]=12621, + ["phieuphparenkorean"]=12812, + ["philatin"]=632, + ["phinthuthai"]=3642, + ["phisymbolgreek"]=981, + ["phook"]=421, + ["phophanthai"]=3614, + ["phophungthai"]=3612, + ["phosamphaothai"]=3616, + ["pi"]=960, + ["pieupacirclekorean"]=12915, + ["pieupaparenkorean"]=12819, + ["pieupcieuckorean"]=12662, + ["pieupcirclekorean"]=12901, + ["pieupkiyeokkorean"]=12658, + ["pieupkorean"]=12610, + ["pieupparenkorean"]=12805, + ["pieupsioskiyeokkorean"]=12660, + ["pieupsioskorean"]=12612, + ["pieupsiostikeutkorean"]=12661, + ["pieupthieuthkorean"]=12663, + ["pieuptikeutkorean"]=12659, + ["pihiragana"]=12404, + ["pikatakana"]=12500, + ["pisymbolgreek"]=982, + ["piwrarmenian"]=1411, + ["plus"]=43, + ["plusbelowcmb"]=799, + ["pluscircle"]=8853, + ["plusminus"]=177, + ["plusmod"]=726, + ["plusmonospace"]=65291, + ["plussmall"]=65122, + ["plussuperior"]=8314, + ["pmonospace"]=65360, + ["pmsquare"]=13272, + ["pohiragana"]=12413, + ["pointingindexdownwhite"]=9759, + ["pointingindexleftwhite"]=9756, + ["pointingindexrightwhite"]=9758, + ["pointingindexupwhite"]=9757, + ["pokatakana"]=12509, + ["poplathai"]=3611, + ["postalmark"]=12306, + ["postalmarkface"]=12320, + ["pparen"]=9387, + ["precedes"]=8826, + ["prescription"]=8478, + ["primemod"]=697, + ["primereversed"]=8245, + ["product"]=8719, + ["projective"]=8965, + ["prolongedkana"]=12540, + ["propellor"]=8984, + ["proportion"]=8759, + ["proportional"]=8733, + ["psi"]=968, + ["psicyrillic"]=1137, + ["psilipneumatacyrilliccmb"]=1158, + ["pssquare"]=13232, + ["puhiragana"]=12407, + ["pukatakana"]=12503, + ["pvsquare"]=13236, + ["pwsquare"]=13242, + ["q"]=113, + ["qadeva"]=2392, + ["qadmahebrew"]=1448, + ["qafarabic"]=1602, + ["qaffinalarabic"]=65238, + ["qafinitialarabic"]=65239, + ["qafmedialarabic"]=65240, + ["qamatswidehebrew"]=1464, + ["qarneyparahebrew"]=1439, + ["qbopomofo"]=12561, + ["qcircle"]=9440, + ["qhook"]=672, + ["qmonospace"]=65361, + ["qofdageshhebrew"]=64327, + ["qoftserehebrew"]=1511, + ["qparen"]=9388, + ["quarternote"]=9833, + ["qubutswidehebrew"]=1467, + ["question"]=63, + ["questionarabic"]=1567, + ["questionarmenian"]=1374, + ["questiondown"]=191, + ["questiongreek"]=894, + ["questionmonospace"]=65311, + ["quotedbl"]=34, + ["quotedblbase"]=8222, + ["quotedblleft"]=8220, + ["quotedblmonospace"]=65282, + ["quotedblprime"]=12318, + ["quotedblprimereversed"]=12317, + ["quotedblright"]=8221, + ["quoteleft"]=8216, + ["quotereversed"]=8219, + ["quoteright"]=8217, + ["quoterightn"]=329, + ["quotesinglbase"]=8218, + ["quotesingle"]=39, + ["quotesinglemonospace"]=65287, + ["r"]=114, + ["raarmenian"]=1404, + ["rabengali"]=2480, + ["racute"]=341, + ["radeva"]=2352, + ["radical"]=8730, + ["radoverssquare"]=13230, + ["radoverssquaredsquare"]=13231, + ["radsquare"]=13229, + ["rafehebrew"]=1471, + ["ragujarati"]=2736, + ["ragurmukhi"]=2608, + ["rahiragana"]=12425, + ["rakatakana"]=12521, + ["rakatakanahalfwidth"]=65431, + ["ralowerdiagonalbengali"]=2545, + ["ramiddlediagonalbengali"]=2544, + ["ramshorn"]=612, + ["ratio"]=8758, + ["rbopomofo"]=12566, + ["rcaron"]=345, + ["rcircle"]=9441, + ["rcommaaccent"]=343, + ["rdblgrave"]=529, + ["rdotaccent"]=7769, + ["rdotbelow"]=7771, + ["rdotbelowmacron"]=7773, + ["referencemark"]=8251, + ["registered"]=174, + ["reharmenian"]=1408, + ["rehfinalarabic"]=65198, + ["rehiragana"]=12428, + ["rehyehaleflamarabic"]=1585, + ["rekatakana"]=12524, + ["rekatakanahalfwidth"]=65434, + ["reshdageshhebrew"]=64328, + ["reshtserehebrew"]=1512, + ["reversedtilde"]=8765, + ["reviamugrashhebrew"]=1431, + ["revlogicalnot"]=8976, + ["rfishhook"]=638, + ["rfishhookreversed"]=639, + ["rhabengali"]=2525, + ["rhadeva"]=2397, + ["rho"]=961, + ["rhook"]=637, + ["rhookturned"]=635, + ["rhookturnedsuperior"]=693, + ["rhosymbolgreek"]=1009, + ["rhotichookmod"]=734, + ["rieulacirclekorean"]=12913, + ["rieulaparenkorean"]=12817, + ["rieulcirclekorean"]=12899, + ["rieulhieuhkorean"]=12608, + ["rieulkiyeokkorean"]=12602, + ["rieulkiyeoksioskorean"]=12649, + ["rieulkorean"]=12601, + ["rieulmieumkorean"]=12603, + ["rieulpansioskorean"]=12652, + ["rieulparenkorean"]=12803, + ["rieulphieuphkorean"]=12607, + ["rieulpieupkorean"]=12604, + ["rieulpieupsioskorean"]=12651, + ["rieulsioskorean"]=12605, + ["rieulthieuthkorean"]=12606, + ["rieultikeutkorean"]=12650, + ["rieulyeorinhieuhkorean"]=12653, + ["rightangle"]=8735, + ["righttackbelowcmb"]=793, + ["righttriangle"]=8895, + ["rihiragana"]=12426, + ["rikatakana"]=12522, + ["rikatakanahalfwidth"]=65432, + ["ring"]=730, + ["ringbelowcmb"]=805, + ["ringcmb"]=778, + ["ringhalfleft"]=703, + ["ringhalfleftarmenian"]=1369, + ["ringhalfleftbelowcmb"]=796, + ["ringhalfleftcentered"]=723, + ["ringhalfright"]=702, + ["ringhalfrightbelowcmb"]=825, + ["ringhalfrightcentered"]=722, + ["rinvertedbreve"]=531, + ["rittorusquare"]=13137, + ["rlinebelow"]=7775, + ["rlongleg"]=636, + ["rlonglegturned"]=634, + ["rmonospace"]=65362, + ["rohiragana"]=12429, + ["rokatakana"]=12525, + ["rokatakanahalfwidth"]=65435, + ["roruathai"]=3619, + ["rparen"]=9389, + ["rrabengali"]=2524, + ["rradeva"]=2353, + ["rragurmukhi"]=2652, + ["rreharabic"]=1681, + ["rrehfinalarabic"]=64397, + ["rrvocalicbengali"]=2528, + ["rrvocalicdeva"]=2400, + ["rrvocalicgujarati"]=2784, + ["rrvocalicvowelsignbengali"]=2500, + ["rrvocalicvowelsigndeva"]=2372, + ["rrvocalicvowelsigngujarati"]=2756, + ["rtblock"]=9616, + ["rturned"]=633, + ["rturnedsuperior"]=692, + ["ruhiragana"]=12427, + ["rukatakana"]=12523, + ["rukatakanahalfwidth"]=65433, + ["rupeemarkbengali"]=2546, + ["rupeesignbengali"]=2547, + ["ruthai"]=3620, + ["rvocalicbengali"]=2443, + ["rvocalicdeva"]=2315, + ["rvocalicgujarati"]=2699, + ["rvocalicvowelsignbengali"]=2499, + ["rvocalicvowelsigndeva"]=2371, + ["rvocalicvowelsigngujarati"]=2755, + ["s"]=115, + ["sabengali"]=2488, + ["sacute"]=347, + ["sacutedotaccent"]=7781, + ["sadarabic"]=1589, + ["sadeva"]=2360, + ["sadfinalarabic"]=65210, + ["sadinitialarabic"]=65211, + ["sadmedialarabic"]=65212, + ["sagujarati"]=2744, + ["sagurmukhi"]=2616, + ["sahiragana"]=12373, + ["sakatakana"]=12469, + ["sakatakanahalfwidth"]=65403, + ["sallallahoualayhewasallamarabic"]=65018, + ["samekhdageshhebrew"]=64321, + ["samekhhebrew"]=1505, + ["saraaathai"]=3634, + ["saraaethai"]=3649, + ["saraaimaimalaithai"]=3652, + ["saraaimaimuanthai"]=3651, + ["saraamthai"]=3635, + ["saraathai"]=3632, + ["saraethai"]=3648, + ["saraiithai"]=3637, + ["saraithai"]=3636, + ["saraothai"]=3650, + ["saraueethai"]=3639, + ["sarauethai"]=3638, + ["sarauthai"]=3640, + ["sarauuthai"]=3641, + ["sbopomofo"]=12569, + ["scaron"]=353, + ["scarondotaccent"]=7783, + ["scedilla"]=351, + ["schwa"]=601, + ["schwacyrillic"]=1241, + ["schwadieresiscyrillic"]=1243, + ["schwahook"]=602, + ["scircle"]=9442, + ["scircumflex"]=349, + ["scommaaccent"]=537, + ["sdotaccent"]=7777, + ["sdotbelow"]=7779, + ["sdotbelowdotaccent"]=7785, + ["seagullbelowcmb"]=828, + ["second"]=8243, + ["secondtonechinese"]=714, + ["section"]=167, + ["seenarabic"]=1587, + ["seenfinalarabic"]=65202, + ["seeninitialarabic"]=65203, + ["seenmedialarabic"]=65204, + ["segoltahebrew"]=1426, + ["segolwidehebrew"]=1462, + ["seharmenian"]=1405, + ["sehiragana"]=12379, + ["sekatakana"]=12475, + ["sekatakanahalfwidth"]=65406, + ["semicolon"]=59, + ["semicolonarabic"]=1563, + ["semicolonmonospace"]=65307, + ["semicolonsmall"]=65108, + ["semivoicedmarkkana"]=12444, + ["semivoicedmarkkanahalfwidth"]=65439, + ["sentisquare"]=13090, + ["sentosquare"]=13091, + ["seven"]=55, + ["sevenbengali"]=2541, + ["sevencircle"]=9318, + ["sevencircleinversesansserif"]=10128, + ["sevendeva"]=2413, + ["seveneighths"]=8542, + ["sevengujarati"]=2797, + ["sevengurmukhi"]=2669, + ["sevenhackarabic"]=1639, + ["sevenhangzhou"]=12327, + ["sevenideographicparen"]=12838, + ["seveninferior"]=8327, + ["sevenmonospace"]=65303, + ["sevenparen"]=9338, + ["sevenperiod"]=9358, + ["sevenpersian"]=1783, + ["sevenroman"]=8566, + ["sevensuperior"]=8311, + ["seventeencircle"]=9328, + ["seventeenparen"]=9348, + ["seventeenperiod"]=9368, + ["seventhai"]=3671, + ["shaarmenian"]=1399, + ["shabengali"]=2486, + ["shacyrillic"]=1096, + ["shaddadammaarabic"]=64609, + ["shaddadammatanarabic"]=64606, + ["shaddafathaarabic"]=64608, + ["shaddafathatanarabic"]=1617, + ["shaddakasraarabic"]=64610, + ["shaddakasratanarabic"]=64607, + ["shadedark"]=9619, + ["shadelight"]=9617, + ["shademedium"]=9618, + ["shadeva"]=2358, + ["shagujarati"]=2742, + ["shagurmukhi"]=2614, + ["shalshelethebrew"]=1427, + ["shbopomofo"]=12565, + ["shchacyrillic"]=1097, + ["sheenarabic"]=1588, + ["sheenfinalarabic"]=65206, + ["sheeninitialarabic"]=65207, + ["sheenmedialarabic"]=65208, + ["sheicoptic"]=995, + ["sheqelhebrew"]=8362, + ["shevawidehebrew"]=1456, + ["shhacyrillic"]=1211, + ["shimacoptic"]=1005, + ["shindageshhebrew"]=64329, + ["shindageshshindothebrew"]=64300, + ["shindageshsindothebrew"]=64301, + ["shindothebrew"]=1473, + ["shinhebrew"]=1513, + ["shinshindothebrew"]=64298, + ["shinsindothebrew"]=64299, + ["shook"]=642, + ["sigma"]=963, + ["sigmafinal"]=962, + ["sigmalunatesymbolgreek"]=1010, + ["sihiragana"]=12375, + ["sikatakana"]=12471, + ["sikatakanahalfwidth"]=65404, + ["siluqlefthebrew"]=1469, + ["sindothebrew"]=1474, + ["siosacirclekorean"]=12916, + ["siosaparenkorean"]=12820, + ["sioscieuckorean"]=12670, + ["sioscirclekorean"]=12902, + ["sioskiyeokkorean"]=12666, + ["sioskorean"]=12613, + ["siosnieunkorean"]=12667, + ["siosparenkorean"]=12806, + ["siospieupkorean"]=12669, + ["siostikeutkorean"]=12668, + ["six"]=54, + ["sixbengali"]=2540, + ["sixcircle"]=9317, + ["sixcircleinversesansserif"]=10127, + ["sixdeva"]=2412, + ["sixgujarati"]=2796, + ["sixgurmukhi"]=2668, + ["sixhackarabic"]=1638, + ["sixhangzhou"]=12326, + ["sixideographicparen"]=12837, + ["sixinferior"]=8326, + ["sixmonospace"]=65302, + ["sixparen"]=9337, + ["sixperiod"]=9357, + ["sixpersian"]=1782, + ["sixroman"]=8565, + ["sixsuperior"]=8310, + ["sixteencircle"]=9327, + ["sixteencurrencydenominatorbengali"]=2553, + ["sixteenparen"]=9347, + ["sixteenperiod"]=9367, + ["sixthai"]=3670, + ["slash"]=47, + ["slashmonospace"]=65295, + ["slong"]=383, + ["slongdotaccent"]=7835, + ["smonospace"]=65363, + ["sofpasuqhebrew"]=1475, + ["softhyphen"]=173, + ["softsigncyrillic"]=1100, + ["sohiragana"]=12381, + ["sokatakana"]=12477, + ["sokatakanahalfwidth"]=65407, + ["soliduslongoverlaycmb"]=824, + ["solidusshortoverlaycmb"]=823, + ["sorusithai"]=3625, + ["sosalathai"]=3624, + ["sosothai"]=3595, + ["sosuathai"]=3626, + ["space"]=32, + ["spadesuitblack"]=9824, + ["spadesuitwhite"]=9828, + ["sparen"]=9390, + ["squarebelowcmb"]=827, + ["squarecc"]=13252, + ["squarecm"]=13213, + ["squarediagonalcrosshatchfill"]=9641, + ["squarehorizontalfill"]=9636, + ["squarekg"]=13199, + ["squarekm"]=13214, + ["squarekmcapital"]=13262, + ["squareln"]=13265, + ["squarelog"]=13266, + ["squaremg"]=13198, + ["squaremil"]=13269, + ["squaremm"]=13212, + ["squaremsquared"]=13217, + ["squareorthogonalcrosshatchfill"]=9638, + ["squareupperlefttolowerrightfill"]=9639, + ["squareupperrighttolowerleftfill"]=9640, + ["squareverticalfill"]=9637, + ["squarewhitewithsmallblack"]=9635, + ["srsquare"]=13275, + ["ssabengali"]=2487, + ["ssadeva"]=2359, + ["ssagujarati"]=2743, + ["ssangcieuckorean"]=12617, + ["ssanghieuhkorean"]=12677, + ["ssangieungkorean"]=12672, + ["ssangkiyeokkorean"]=12594, + ["ssangnieunkorean"]=12645, + ["ssangpieupkorean"]=12611, + ["ssangsioskorean"]=12614, + ["ssangtikeutkorean"]=12600, + ["sterling"]=163, + ["sterlingmonospace"]=65505, + ["strokelongoverlaycmb"]=822, + ["strokeshortoverlaycmb"]=821, + ["subset"]=8834, + ["subsetnotequal"]=8842, + ["subsetorequal"]=8838, + ["succeeds"]=8827, + ["suchthat"]=8715, + ["suhiragana"]=12377, + ["sukatakana"]=12473, + ["sukatakanahalfwidth"]=65405, + ["sukunarabic"]=1618, + ["summation"]=8721, + ["sun"]=9788, + ["superset"]=8835, + ["supersetnotequal"]=8843, + ["supersetorequal"]=8839, + ["svsquare"]=13276, + ["syouwaerasquare"]=13180, + ["t"]=116, + ["tabengali"]=2468, + ["tackdown"]=8868, + ["tackleft"]=8867, + ["tadeva"]=2340, + ["tagujarati"]=2724, + ["tagurmukhi"]=2596, + ["taharabic"]=1591, + ["tahfinalarabic"]=65218, + ["tahinitialarabic"]=65219, + ["tahiragana"]=12383, + ["tahmedialarabic"]=65220, + ["taisyouerasquare"]=13181, + ["takatakana"]=12479, + ["takatakanahalfwidth"]=65408, + ["tatweelarabic"]=1600, + ["tau"]=964, + ["tavdageshhebrew"]=64330, + ["tavhebrew"]=1514, + ["tbar"]=359, + ["tbopomofo"]=12554, + ["tcaron"]=357, + ["tccurl"]=680, + ["tcheharabic"]=1670, + ["tchehfinalarabic"]=64379, + ["tchehmedialarabic"]=64381, + ["tchehmeeminitialarabic"]=64380, + ["tcircle"]=9443, + ["tcircumflexbelow"]=7793, + ["tcommaaccent"]=355, + ["tdieresis"]=7831, + ["tdotaccent"]=7787, + ["tdotbelow"]=7789, + ["tecyrillic"]=1090, + ["tedescendercyrillic"]=1197, + ["teharabic"]=1578, + ["tehfinalarabic"]=65174, + ["tehhahinitialarabic"]=64674, + ["tehhahisolatedarabic"]=64524, + ["tehinitialarabic"]=65175, + ["tehiragana"]=12390, + ["tehjeeminitialarabic"]=64673, + ["tehjeemisolatedarabic"]=64523, + ["tehmarbutaarabic"]=1577, + ["tehmarbutafinalarabic"]=65172, + ["tehmedialarabic"]=65176, + ["tehmeeminitialarabic"]=64676, + ["tehmeemisolatedarabic"]=64526, + ["tehnoonfinalarabic"]=64627, + ["tekatakana"]=12486, + ["tekatakanahalfwidth"]=65411, + ["telephone"]=8481, + ["telephoneblack"]=9742, + ["telishagedolahebrew"]=1440, + ["telishaqetanahebrew"]=1449, + ["tencircle"]=9321, + ["tenideographicparen"]=12841, + ["tenparen"]=9341, + ["tenperiod"]=9361, + ["tenroman"]=8569, + ["tesh"]=679, + ["tetdageshhebrew"]=64312, + ["tethebrew"]=1496, + ["tetsecyrillic"]=1205, + ["tevirlefthebrew"]=1435, + ["thabengali"]=2469, + ["thadeva"]=2341, + ["thagujarati"]=2725, + ["thagurmukhi"]=2597, + ["thalarabic"]=1584, + ["thalfinalarabic"]=65196, + ["thanthakhatthai"]=3660, + ["theharabic"]=1579, + ["thehfinalarabic"]=65178, + ["thehinitialarabic"]=65179, + ["thehmedialarabic"]=65180, + ["thereexists"]=8707, + ["therefore"]=8756, + ["theta"]=952, + ["thetasymbolgreek"]=977, + ["thieuthacirclekorean"]=12921, + ["thieuthaparenkorean"]=12825, + ["thieuthcirclekorean"]=12907, + ["thieuthkorean"]=12620, + ["thieuthparenkorean"]=12811, + ["thirteencircle"]=9324, + ["thirteenparen"]=9344, + ["thirteenperiod"]=9364, + ["thonangmonthothai"]=3601, + ["thook"]=429, + ["thophuthaothai"]=3602, + ["thorn"]=254, + ["thothahanthai"]=3607, + ["thothanthai"]=3600, + ["thothongthai"]=3608, + ["thothungthai"]=3606, + ["thousandcyrillic"]=1154, + ["thousandsseparatorpersian"]=1644, + ["three"]=51, + ["threebengali"]=2537, + ["threecircle"]=9314, + ["threecircleinversesansserif"]=10124, + ["threedeva"]=2409, + ["threeeighths"]=8540, + ["threegujarati"]=2793, + ["threegurmukhi"]=2665, + ["threehackarabic"]=1635, + ["threehangzhou"]=12323, + ["threeideographicparen"]=12834, + ["threeinferior"]=8323, + ["threemonospace"]=65299, + ["threenumeratorbengali"]=2550, + ["threeparen"]=9334, + ["threeperiod"]=9354, + ["threepersian"]=1779, + ["threequarters"]=190, + ["threeroman"]=8562, + ["threesuperior"]=179, + ["threethai"]=3667, + ["thzsquare"]=13204, + ["tihiragana"]=12385, + ["tikatakana"]=12481, + ["tikatakanahalfwidth"]=65409, + ["tikeutacirclekorean"]=12912, + ["tikeutaparenkorean"]=12816, + ["tikeutcirclekorean"]=12898, + ["tikeutkorean"]=12599, + ["tikeutparenkorean"]=12802, + ["tilde"]=732, + ["tildebelowcmb"]=816, + ["tildecomb"]=771, + ["tildedoublecmb"]=864, + ["tildeoperator"]=8764, + ["tildeoverlaycmb"]=820, + ["tildeverticalcmb"]=830, + ["timescircle"]=8855, + ["tipehalefthebrew"]=1430, + ["tippigurmukhi"]=2672, + ["titlocyrilliccmb"]=1155, + ["tiwnarmenian"]=1407, + ["tlinebelow"]=7791, + ["tmonospace"]=65364, + ["toarmenian"]=1385, + ["tohiragana"]=12392, + ["tokatakana"]=12488, + ["tokatakanahalfwidth"]=65412, + ["tonebarextrahighmod"]=741, + ["tonebarextralowmod"]=745, + ["tonebarhighmod"]=742, + ["tonebarlowmod"]=744, + ["tonebarmidmod"]=743, + ["tonefive"]=445, + ["tonesix"]=389, + ["tonetwo"]=424, + ["tonos"]=900, + ["tonsquare"]=13095, + ["topatakthai"]=3599, + ["tortoiseshellbracketleft"]=12308, + ["tortoiseshellbracketleftsmall"]=65117, + ["tortoiseshellbracketleftvertical"]=65081, + ["tortoiseshellbracketright"]=12309, + ["tortoiseshellbracketrightsmall"]=65118, + ["tortoiseshellbracketrightvertical"]=65082, + ["totaothai"]=3605, + ["tpalatalhook"]=427, + ["tparen"]=9391, + ["trademark"]=8482, + ["tretroflexhook"]=648, + ["triagdn"]=9660, + ["triaglf"]=9668, + ["triagrt"]=9658, + ["triagup"]=9650, + ["ts"]=678, + ["tsadidageshhebrew"]=64326, + ["tsadihebrew"]=1510, + ["tsecyrillic"]=1094, + ["tserewidehebrew"]=1461, + ["tshecyrillic"]=1115, + ["ttabengali"]=2463, + ["ttadeva"]=2335, + ["ttagujarati"]=2719, + ["ttagurmukhi"]=2591, + ["tteharabic"]=1657, + ["ttehfinalarabic"]=64359, + ["ttehinitialarabic"]=64360, + ["ttehmedialarabic"]=64361, + ["tthabengali"]=2464, + ["tthadeva"]=2336, + ["tthagujarati"]=2720, + ["tthagurmukhi"]=2592, + ["tturned"]=647, + ["tuhiragana"]=12388, + ["tukatakana"]=12484, + ["tukatakanahalfwidth"]=65410, + ["tusmallhiragana"]=12387, + ["tusmallkatakana"]=12483, + ["tusmallkatakanahalfwidth"]=65391, + ["twelvecircle"]=9323, + ["twelveparen"]=9343, + ["twelveperiod"]=9363, + ["twelveroman"]=8571, + ["twentycircle"]=9331, + ["twentyparen"]=9351, + ["twentyperiod"]=9371, + ["two"]=50, + ["twobengali"]=2536, + ["twocircle"]=9313, + ["twocircleinversesansserif"]=10123, + ["twodeva"]=2408, + ["twodotleader"]=8229, + ["twodotleadervertical"]=65072, + ["twogujarati"]=2792, + ["twogurmukhi"]=2664, + ["twohackarabic"]=1634, + ["twohangzhou"]=12322, + ["twoideographicparen"]=12833, + ["twoinferior"]=8322, + ["twomonospace"]=65298, + ["twonumeratorbengali"]=2549, + ["twoparen"]=9333, + ["twoperiod"]=9353, + ["twopersian"]=1778, + ["tworoman"]=8561, + ["twostroke"]=443, + ["twosuperior"]=178, + ["twothai"]=3666, + ["twothirds"]=8532, + ["u"]=117, + ["uacute"]=250, + ["ubar"]=649, + ["ubengali"]=2441, + ["ubopomofo"]=12584, + ["ubreve"]=365, + ["ucaron"]=468, + ["ucircle"]=9444, + ["ucircumflex"]=251, + ["ucircumflexbelow"]=7799, + ["ucyrillic"]=1091, + ["udattadeva"]=2385, + ["udblgrave"]=533, + ["udeva"]=2313, + ["udieresis"]=252, + ["udieresisacute"]=472, + ["udieresisbelow"]=7795, + ["udieresiscaron"]=474, + ["udieresiscyrillic"]=1265, + ["udieresisgrave"]=476, + ["udieresismacron"]=470, + ["udotbelow"]=7909, + ["ugrave"]=249, + ["ugujarati"]=2697, + ["ugurmukhi"]=2569, + ["uhiragana"]=12358, + ["uhookabove"]=7911, + ["uhorn"]=432, + ["uhornacute"]=7913, + ["uhorndotbelow"]=7921, + ["uhorngrave"]=7915, + ["uhornhookabove"]=7917, + ["uhorntilde"]=7919, + ["uhungarumlaut"]=369, + ["uhungarumlautcyrillic"]=1267, + ["uinvertedbreve"]=535, + ["ukatakana"]=12454, + ["ukatakanahalfwidth"]=65395, + ["ukcyrillic"]=1145, + ["ukorean"]=12636, + ["umacron"]=363, + ["umacroncyrillic"]=1263, + ["umacrondieresis"]=7803, + ["umatragurmukhi"]=2625, + ["umonospace"]=65365, + ["underscore"]=95, + ["underscoredbl"]=8215, + ["underscoremonospace"]=65343, + ["underscorevertical"]=65075, + ["underscorewavy"]=65103, + ["union"]=8746, + ["universal"]=8704, + ["uogonek"]=371, + ["uparen"]=9392, + ["upblock"]=9600, + ["upperdothebrew"]=1476, + ["upsilon"]=965, + ["upsilondieresis"]=971, + ["upsilondieresistonos"]=944, + ["upsilonlatin"]=650, + ["upsilontonos"]=973, + ["uptackbelowcmb"]=797, + ["uptackmod"]=724, + ["uragurmukhi"]=2675, + ["uring"]=367, + ["ushortcyrillic"]=1118, + ["usmallhiragana"]=12357, + ["usmallkatakana"]=12453, + ["usmallkatakanahalfwidth"]=65385, + ["ustraightcyrillic"]=1199, + ["ustraightstrokecyrillic"]=1201, + ["utilde"]=361, + ["utildeacute"]=7801, + ["utildebelow"]=7797, + ["uubengali"]=2442, + ["uudeva"]=2314, + ["uugujarati"]=2698, + ["uugurmukhi"]=2570, + ["uumatragurmukhi"]=2626, + ["uuvowelsignbengali"]=2498, + ["uuvowelsigndeva"]=2370, + ["uuvowelsigngujarati"]=2754, + ["uvowelsignbengali"]=2497, + ["uvowelsigndeva"]=2369, + ["uvowelsigngujarati"]=2753, + ["v"]=118, + ["vadeva"]=2357, + ["vagujarati"]=2741, + ["vagurmukhi"]=2613, + ["vakatakana"]=12535, + ["vavdageshhebrew"]=64309, + ["vavhebrew"]=1493, + ["vavholamhebrew"]=64331, + ["vavvavhebrew"]=1520, + ["vavyodhebrew"]=1521, + ["vcircle"]=9445, + ["vdotbelow"]=7807, + ["vecyrillic"]=1074, + ["veharabic"]=1700, + ["vehfinalarabic"]=64363, + ["vehinitialarabic"]=64364, + ["vehmedialarabic"]=64365, + ["vekatakana"]=12537, + ["venus"]=9792, + ["verticalbar"]=124, + ["verticallineabovecmb"]=781, + ["verticallinebelowcmb"]=809, + ["verticallinelowmod"]=716, + ["verticallinemod"]=712, + ["vewarmenian"]=1406, + ["vhook"]=651, + ["vikatakana"]=12536, + ["viramabengali"]=2509, + ["viramadeva"]=2381, + ["viramagujarati"]=2765, + ["visargabengali"]=2435, + ["visargadeva"]=2307, + ["visargagujarati"]=2691, + ["vmonospace"]=65366, + ["voarmenian"]=1400, + ["voicediterationhiragana"]=12446, + ["voicediterationkatakana"]=12542, + ["voicedmarkkana"]=12443, + ["voicedmarkkanahalfwidth"]=65438, + ["vokatakana"]=12538, + ["vparen"]=9393, + ["vtilde"]=7805, + ["vturned"]=652, + ["vuhiragana"]=12436, + ["vukatakana"]=12532, + ["w"]=119, + ["wacute"]=7811, + ["waekorean"]=12633, + ["wahiragana"]=12431, + ["wakatakana"]=12527, + ["wakatakanahalfwidth"]=65436, + ["wakorean"]=12632, + ["wasmallhiragana"]=12430, + ["wasmallkatakana"]=12526, + ["wattosquare"]=13143, + ["wavedash"]=12316, + ["wavyunderscorevertical"]=65076, + ["wawarabic"]=1608, + ["wawfinalarabic"]=65262, + ["wawhamzaabovearabic"]=1572, + ["wawhamzaabovefinalarabic"]=65158, + ["wbsquare"]=13277, + ["wcircle"]=9446, + ["wcircumflex"]=373, + ["wdieresis"]=7813, + ["wdotaccent"]=7815, + ["wdotbelow"]=7817, + ["wehiragana"]=12433, + ["weierstrass"]=8472, + ["wekatakana"]=12529, + ["wekorean"]=12638, + ["weokorean"]=12637, + ["wgrave"]=7809, + ["whitebullet"]=9702, + ["whitecircle"]=9675, + ["whitecircleinverse"]=9689, + ["whitecornerbracketleft"]=12302, + ["whitecornerbracketleftvertical"]=65091, + ["whitecornerbracketright"]=12303, + ["whitecornerbracketrightvertical"]=65092, + ["whitediamond"]=9671, + ["whitediamondcontainingblacksmalldiamond"]=9672, + ["whitedownpointingsmalltriangle"]=9663, + ["whitedownpointingtriangle"]=9661, + ["whiteleftpointingsmalltriangle"]=9667, + ["whiteleftpointingtriangle"]=9665, + ["whitelenticularbracketleft"]=12310, + ["whitelenticularbracketright"]=12311, + ["whiterightpointingsmalltriangle"]=9657, + ["whiterightpointingtriangle"]=9655, + ["whitesmallsquare"]=9643, + ["whitesmilingface"]=9786, + ["whitesquare"]=9633, + ["whitestar"]=9734, + ["whitetelephone"]=9743, + ["whitetortoiseshellbracketleft"]=12312, + ["whitetortoiseshellbracketright"]=12313, + ["whiteuppointingsmalltriangle"]=9653, + ["whiteuppointingtriangle"]=9651, + ["wihiragana"]=12432, + ["wikatakana"]=12528, + ["wikorean"]=12639, + ["wmonospace"]=65367, + ["wohiragana"]=12434, + ["wokatakana"]=12530, + ["wokatakanahalfwidth"]=65382, + ["won"]=8361, + ["wonmonospace"]=65510, + ["wowaenthai"]=3623, + ["wparen"]=9394, + ["wring"]=7832, + ["wsuperior"]=695, + ["wturned"]=653, + ["wynn"]=447, + ["x"]=120, + ["xabovecmb"]=829, + ["xbopomofo"]=12562, + ["xcircle"]=9447, + ["xdieresis"]=7821, + ["xdotaccent"]=7819, + ["xeharmenian"]=1389, + ["xi"]=958, + ["xmonospace"]=65368, + ["xparen"]=9395, + ["xsuperior"]=739, + ["y"]=121, + ["yaadosquare"]=13134, + ["yabengali"]=2479, + ["yacute"]=253, + ["yadeva"]=2351, + ["yaekorean"]=12626, + ["yagujarati"]=2735, + ["yagurmukhi"]=2607, + ["yahiragana"]=12420, + ["yakatakana"]=12516, + ["yakatakanahalfwidth"]=65428, + ["yakorean"]=12625, + ["yamakkanthai"]=3662, + ["yasmallhiragana"]=12419, + ["yasmallkatakana"]=12515, + ["yasmallkatakanahalfwidth"]=65388, + ["yatcyrillic"]=1123, + ["ycircle"]=9448, + ["ycircumflex"]=375, + ["ydieresis"]=255, + ["ydotaccent"]=7823, + ["ydotbelow"]=7925, + ["yeharabic"]=1610, + ["yehbarreearabic"]=1746, + ["yehbarreefinalarabic"]=64431, + ["yehfinalarabic"]=65266, + ["yehhamzaabovearabic"]=1574, + ["yehhamzaabovefinalarabic"]=65162, + ["yehhamzaaboveinitialarabic"]=65163, + ["yehhamzaabovemedialarabic"]=65164, + ["yehinitialarabic"]=65267, + ["yehmedialarabic"]=65268, + ["yehmeeminitialarabic"]=64733, + ["yehmeemisolatedarabic"]=64600, + ["yehnoonfinalarabic"]=64660, + ["yehthreedotsbelowarabic"]=1745, + ["yekorean"]=12630, + ["yen"]=165, + ["yenmonospace"]=65509, + ["yeokorean"]=12629, + ["yeorinhieuhkorean"]=12678, + ["yerahbenyomolefthebrew"]=1450, + ["yericyrillic"]=1099, + ["yerudieresiscyrillic"]=1273, + ["yesieungkorean"]=12673, + ["yesieungpansioskorean"]=12675, + ["yesieungsioskorean"]=12674, + ["yetivhebrew"]=1434, + ["ygrave"]=7923, + ["yhook"]=436, + ["yhookabove"]=7927, + ["yiarmenian"]=1397, + ["yicyrillic"]=1111, + ["yikorean"]=12642, + ["yinyang"]=9775, + ["yiwnarmenian"]=1410, + ["ymonospace"]=65369, + ["yoddageshhebrew"]=64313, + ["yodhebrew"]=1497, + ["yodyodhebrew"]=1522, + ["yodyodpatahhebrew"]=64287, + ["yohiragana"]=12424, + ["yoikorean"]=12681, + ["yokatakana"]=12520, + ["yokatakanahalfwidth"]=65430, + ["yokorean"]=12635, + ["yosmallhiragana"]=12423, + ["yosmallkatakana"]=12519, + ["yosmallkatakanahalfwidth"]=65390, + ["yotgreek"]=1011, + ["yoyaekorean"]=12680, + ["yoyakorean"]=12679, + ["yoyakthai"]=3618, + ["yoyingthai"]=3597, + ["yparen"]=9396, + ["ypogegrammeni"]=890, + ["ypogegrammenigreekcmb"]=837, + ["yr"]=422, + ["yring"]=7833, + ["ysuperior"]=696, + ["ytilde"]=7929, + ["yturned"]=654, + ["yuhiragana"]=12422, + ["yuikorean"]=12684, + ["yukatakana"]=12518, + ["yukatakanahalfwidth"]=65429, + ["yukorean"]=12640, + ["yusbigcyrillic"]=1131, + ["yusbigiotifiedcyrillic"]=1133, + ["yuslittlecyrillic"]=1127, + ["yuslittleiotifiedcyrillic"]=1129, + ["yusmallhiragana"]=12421, + ["yusmallkatakana"]=12517, + ["yusmallkatakanahalfwidth"]=65389, + ["yuyekorean"]=12683, + ["yuyeokorean"]=12682, + ["yyabengali"]=2527, + ["yyadeva"]=2399, + ["z"]=122, + ["zaarmenian"]=1382, + ["zacute"]=378, + ["zadeva"]=2395, + ["zagurmukhi"]=2651, + ["zaharabic"]=1592, + ["zahfinalarabic"]=65222, + ["zahinitialarabic"]=65223, + ["zahiragana"]=12374, + ["zahmedialarabic"]=65224, + ["zainarabic"]=1586, + ["zainfinalarabic"]=65200, + ["zakatakana"]=12470, + ["zaqefgadolhebrew"]=1429, + ["zaqefqatanhebrew"]=1428, + ["zarqahebrew"]=1432, + ["zayindageshhebrew"]=64310, + ["zayinhebrew"]=1494, + ["zbopomofo"]=12567, + ["zcaron"]=382, + ["zcircle"]=9449, + ["zcircumflex"]=7825, + ["zcurl"]=657, + ["zdotaccent"]=380, + ["zdotbelow"]=7827, + ["zecyrillic"]=1079, + ["zedescendercyrillic"]=1177, + ["zedieresiscyrillic"]=1247, + ["zehiragana"]=12380, + ["zekatakana"]=12476, + ["zero"]=48, + ["zerobengali"]=2534, + ["zerodeva"]=2406, + ["zerogujarati"]=2790, + ["zerogurmukhi"]=2662, + ["zerohackarabic"]=1632, + ["zeroinferior"]=8320, + ["zeromonospace"]=65296, + ["zeropersian"]=1776, + ["zerosuperior"]=8304, + ["zerothai"]=3664, + ["zerowidthjoiner"]=65279, + ["zerowidthnonjoiner"]=8204, + ["zerowidthspace"]=8203, + ["zeta"]=950, + ["zhbopomofo"]=12563, + ["zhearmenian"]=1386, + ["zhebrevecyrillic"]=1218, + ["zhecyrillic"]=1078, + ["zhedescendercyrillic"]=1175, + ["zhedieresiscyrillic"]=1245, + ["zihiragana"]=12376, + ["zikatakana"]=12472, + ["zinorhebrew"]=1454, + ["zlinebelow"]=7829, + ["zmonospace"]=65370, + ["zohiragana"]=12382, + ["zokatakana"]=12478, + ["zparen"]=9397, + ["zretroflexhook"]=656, + ["zstroke"]=438, + ["zuhiragana"]=12378, + ["zukatakana"]=12474, + + -- extras + + ["Dcroat"]=272, + ["Delta"]=8710, + ["Euro"]=8364, + ["H18533"]=9679, + ["H18543"]=9642, + ["H18551"]=9643, + ["H22073"]=9633, + ["Ldot"]=319, + ["Oslashacute"]=510, + ["SF10000"]=9484, + ["SF20000"]=9492, + ["SF30000"]=9488, + ["SF40000"]=9496, + ["SF50000"]=9532, + ["SF60000"]=9516, + ["SF70000"]=9524, + ["SF80000"]=9500, + ["SF90000"]=9508, + ["Upsilon1"]=978, + ["afii10066"]=1073, + ["afii10067"]=1074, + ["afii10068"]=1075, + ["afii10069"]=1076, + ["afii10070"]=1077, + ["afii10071"]=1105, + ["afii10072"]=1078, + ["afii10073"]=1079, + ["afii10074"]=1080, + ["afii10075"]=1081, + ["afii10076"]=1082, + ["afii10077"]=1083, + ["afii10078"]=1084, + ["afii10079"]=1085, + ["afii10080"]=1086, + ["afii10081"]=1087, + ["afii10082"]=1088, + ["afii10083"]=1089, + ["afii10084"]=1090, + ["afii10085"]=1091, + ["afii10086"]=1092, + ["afii10087"]=1093, + ["afii10088"]=1094, + ["afii10089"]=1095, + ["afii10090"]=1096, + ["afii10091"]=1097, + ["afii10092"]=1098, + ["afii10093"]=1099, + ["afii10094"]=1100, + ["afii10095"]=1101, + ["afii10096"]=1102, + ["afii10097"]=1103, + ["afii10098"]=1169, + ["afii10099"]=1106, + ["afii10100"]=1107, + ["afii10101"]=1108, + ["afii10102"]=1109, + ["afii10103"]=1110, + ["afii10104"]=1111, + ["afii10105"]=1112, + ["afii10106"]=1113, + ["afii10107"]=1114, + ["afii10108"]=1115, + ["afii10109"]=1116, + ["afii10110"]=1118, + ["afii10193"]=1119, + ["afii10194"]=1123, + ["afii10195"]=1139, + ["afii10196"]=1141, + ["afii10846"]=1241, + ["afii208"]=8213, + ["afii57381"]=1642, + ["afii57388"]=1548, + ["afii57392"]=1632, + ["afii57393"]=1633, + ["afii57394"]=1634, + ["afii57395"]=1635, + ["afii57396"]=1636, + ["afii57397"]=1637, + ["afii57398"]=1638, + ["afii57399"]=1639, + ["afii57400"]=1640, + ["afii57401"]=1641, + ["afii57403"]=1563, + ["afii57407"]=1567, + ["afii57409"]=1569, + ["afii57410"]=1570, + ["afii57411"]=1571, + ["afii57412"]=1572, + ["afii57413"]=1573, + ["afii57414"]=1574, + ["afii57415"]=1575, + ["afii57416"]=1576, + ["afii57417"]=1577, + ["afii57418"]=1578, + ["afii57419"]=1579, + ["afii57420"]=1580, + ["afii57421"]=1581, + ["afii57422"]=1582, + ["afii57423"]=1583, + ["afii57424"]=1584, + ["afii57425"]=1585, + ["afii57426"]=1586, + ["afii57427"]=1587, + ["afii57428"]=1588, + ["afii57429"]=1589, + ["afii57430"]=1590, + ["afii57431"]=1591, + ["afii57432"]=1592, + ["afii57433"]=1593, + ["afii57434"]=1594, + ["afii57440"]=1600, + ["afii57441"]=1601, + ["afii57442"]=1602, + ["afii57443"]=1603, + ["afii57444"]=1604, + ["afii57445"]=1605, + ["afii57446"]=1606, + ["afii57448"]=1608, + ["afii57449"]=1609, + ["afii57450"]=1610, + ["afii57451"]=1611, + ["afii57452"]=1612, + ["afii57453"]=1613, + ["afii57454"]=1614, + ["afii57455"]=1615, + ["afii57456"]=1616, + ["afii57457"]=1617, + ["afii57458"]=1618, + ["afii57470"]=1607, + ["afii57505"]=1700, + ["afii57506"]=1662, + ["afii57507"]=1670, + ["afii57508"]=1688, + ["afii57509"]=1711, + ["afii57511"]=1657, + ["afii57512"]=1672, + ["afii57513"]=1681, + ["afii57514"]=1722, + ["afii57519"]=1746, + ["afii57636"]=8362, + ["afii57645"]=1470, + ["afii57658"]=1475, + ["afii57664"]=1488, + ["afii57665"]=1489, + ["afii57666"]=1490, + ["afii57667"]=1491, + ["afii57668"]=1492, + ["afii57669"]=1493, + ["afii57670"]=1494, + ["afii57671"]=1495, + ["afii57672"]=1496, + ["afii57673"]=1497, + ["afii57674"]=1498, + ["afii57675"]=1499, + ["afii57676"]=1500, + ["afii57677"]=1501, + ["afii57678"]=1502, + ["afii57679"]=1503, + ["afii57680"]=1504, + ["afii57681"]=1505, + ["afii57682"]=1506, + ["afii57683"]=1507, + ["afii57684"]=1508, + ["afii57685"]=1509, + ["afii57686"]=1510, + ["afii57687"]=1511, + ["afii57688"]=1512, + ["afii57689"]=1513, + ["afii57690"]=1514, + ["afii57716"]=1520, + ["afii57717"]=1521, + ["afii57718"]=1522, + ["afii57793"]=1460, + ["afii57794"]=1461, + ["afii57795"]=1462, + ["afii57796"]=1467, + ["afii57797"]=1464, + ["afii57798"]=1463, + ["afii57799"]=1456, + ["afii57800"]=1458, + ["afii57801"]=1457, + ["afii57802"]=1459, + ["afii57803"]=1474, + ["afii57804"]=1473, + ["afii57806"]=1465, + ["afii57807"]=1468, + ["afii57839"]=1469, + ["afii57841"]=1471, + ["afii57842"]=1472, + ["afii57929"]=700, + ["afii61248"]=8453, + ["afii61289"]=8467, + ["afii61352"]=8470, + ["afii61664"]=8204, + ["afii63167"]=1645, + ["afii64937"]=701, + ["arrowdblboth"]=8660, + ["arrowdblleft"]=8656, + ["arrowdblright"]=8658, + ["arrowupdnbse"]=8616, + ["bar"]=124, + ["circle"]=9675, + ["circlemultiply"]=8855, + ["circleplus"]=8853, + ["club"]=9827, + ["colonmonetary"]=8353, + ["dcroat"]=273, + ["dkshade"]=9619, + ["existential"]=8707, + ["female"]=9792, + ["gradient"]=8711, + ["heart"]=9829, + ["hookabovecomb"]=777, + ["invcircle"]=9689, + ["ldot"]=320, + ["longs"]=383, + ["ltshade"]=9617, + ["male"]=9794, + ["mu"]=181, + ["napostrophe"]=329, + ["notelement"]=8713, + ["omega1"]=982, + ["openbullet"]=9702, + ["orthogonal"]=8735, + ["oslashacute"]=511, + ["phi1"]=981, + ["propersubset"]=8834, + ["propersuperset"]=8835, + ["reflexsubset"]=8838, + ["reflexsuperset"]=8839, + ["shade"]=9618, + ["sigma1"]=962, + ["similar"]=8764, + ["smileface"]=9786, + ["spacehackarabic"]=32, + ["spade"]=9824, + ["theta1"]=977, + ["twodotenleader"]=8229, } end -- closure @@ -12130,7 +15606,12 @@ function tfm.read(specification) local postprocessors = tfmtable.postprocessors if postprocessors then for i=1,#postprocessors do - postprocessors[i](tfmtable) -- after scaling etc + local extrahash = postprocessors[i](tfmtable) -- after scaling etc + if type(extrahash) == "string" and extrahash ~= "" then + -- e.g. a reencoding needs this + extrahash = gsub(lower(extrahash),"[^a-z]","-") + tfmtable.fullname = format("%s-%s",tfmtable.fullname,extrahash) + end end end -- @@ -12750,5 +16231,47 @@ fonts.strippables = table.tohash { 0xE0077, 0xE0078, 0xE0079, 0xE007A, 0xE007B, 0xE007C, 0xE007D, 0xE007E, 0xE007F, } +-- \font\test=file:somefont:reencode=mymessup +-- +-- fonts.enc.reencodings.mymessup = { +-- [109] = 110, -- m +-- [110] = 109, -- n +-- } + +fonts.enc = fonts.enc or {} +local reencodings = { } +fonts.enc.reencodings = reencodings + +local function specialreencode(tfmdata,value) + -- we forget about kerns as we assume symbols and we + -- could issue a message if ther are kerns but it's + -- a hack anyway so we odn't care too much here + local encoding = value and reencodings[value] + if encoding then + local temp = { } + local char = tfmdata.characters + for k, v in next, encoding do + temp[k] = char[v] + end + for k, v in next, temp do + char[k] = temp[k] + end + -- if we use the font otherwise luatex gets confused so + -- we return an additional hash component for fullname + return string.format("reencoded:%s",value) + end +end + +local function reencode(tfmdata,value) + tfmdata.postprocessors = tfmdata.postprocessors or { } + table.insert(tfmdata.postprocessors, + function(tfmdata) + return specialreencode(tfmdata,value) + end + ) +end + +table.insert(fonts.manipulators,"reencode") +fonts.initializers.base.otf.reencode = reencode end -- closure diff --git a/tex/generic/context/luatex-fonts.lua b/tex/generic/context/luatex-fonts.lua index cff1800e7..c96dada77 100644 --- a/tex/generic/context/luatex-fonts.lua +++ b/tex/generic/context/luatex-fonts.lua @@ -120,7 +120,7 @@ else loadmodule('font-otn.lua') loadmodule('font-ota.lua') loadmodule('font-otc.lua') - loadmodule('font-agl.lua') + loadmodule('font-age.lua') -- special for this variant loadmodule('font-def.lua') loadmodule('font-xtx.lua') loadmodule('font-dum.lua') |