diff options
Diffstat (limited to 'tex/context/base/mult-aux.mkiv')
-rw-r--r-- | tex/context/base/mult-aux.mkiv | 104 |
1 files changed, 76 insertions, 28 deletions
diff --git a/tex/context/base/mult-aux.mkiv b/tex/context/base/mult-aux.mkiv index 473a18e08..4087180c0 100644 --- a/tex/context/base/mult-aux.mkiv +++ b/tex/context/base/mult-aux.mkiv @@ -52,23 +52,26 @@ %D \stoptyping % problem: every* could clash - +% % There can be less {} in the following definitions if we assume \??aa and \c!somecs - +% % todo: \def\detokenized...parameter#1{\detokenize\expandafter\expandafter\expandafter{\csname#1#2\endcsname}} % always root +% +% it might be more efficient to do this at the lua and +% +% watch the push/pop and predefinition of current .. this is needed for nested +% definitions and overloaded defines using the predefined one -\unexpanded\def\doinstallparameterhandler#1#2#3#4#5#6#7#8#9% - {\def#3##1{\csname#4{#1#2}{##1}\endcsname}% +\unexpanded\def\doinstallparameterhandler#1#2#3#4#5#6#7% + {\ifx#2\relax\let#2\empty\fi + \def#3##1{\csname#4{#1#2}{##1}\endcsname}% \def#4##1##2{\ifcsname##1##2\endcsname##1##2\else\expandafter#5\csname##1\s!parent\endcsname{##2}\fi}% \def#5##1##2{\ifx##1\relax\s!empty\else#4{##1}{##2}\fi}% \def#6##1##2{\csname#4{#1##1}{##2}\endcsname}% - \def#7##1{\detokenize\expandafter\expandafter\expandafter{\csname#1##1\endcsname}}% always root - \def#8{\dosetvalue{#1}}% ##1 {##2} (braces are mandate) - \def#9{\doletvalue{#1}}}% ##1 ##2 + \def#7##1{\detokenize\expandafter\expandafter\expandafter{\csname#1##1\endcsname}}} % always root \unexpanded\def\installparameterhandler#1#2% - {%\message{\detokenize{#1}/\detokenize{#2}}% - \normalexpanded + {\normalexpanded {\doinstallparameterhandler {\noexpand#1}% \??aa \expandafter\noexpand\csname current#2\endcsname @@ -76,12 +79,11 @@ \expandafter\noexpand\csname do#2parameter\endcsname \expandafter\noexpand\csname do#2parentparameter\endcsname \expandafter\noexpand\csname named#2parameter\endcsname - \expandafter\noexpand\csname detokenized#2parameter\endcsname - \expandafter\noexpand\csname doset#2parameter\endcsname - \expandafter\noexpand\csname dolet#2parameter\endcsname}} + \expandafter\noexpand\csname detokenized#2parameter\endcsname}} \unexpanded\def\doinstallparameterhashhandler#1#2#3#4#5% - {\def#3##1{#4{#1#2}{##1}}% + {\ifx#2\relax\let#2\empty\fi + \def#3##1{#4{#1#2}{##1}}% \def#4##1##2{\ifcsname##1##2\endcsname##1\else\expandafter#5\csname##1\s!parent\endcsname{##2}\fi}% \def#5##1##2{\ifx##1\relax\else#4{##1}{##2}\fi}} @@ -94,6 +96,21 @@ \expandafter\noexpand\csname do#2parameterhash\endcsname \expandafter\noexpand\csname do#2parentparameterhash\endcsname}} +\unexpanded\def\doinstallparametersethandler#1#2#3#4#5% + {\ifx#2\relax\let#2\empty\fi + \def#3{\dosetvalue{#1#2}}% ##1 {##2} (braces are mandate) + \def#4{\doletvalue{#1#2}}% ##1 ##2 + \def#5{\doletvalue{#1#2}\empty}}% ##1 + +\unexpanded\def\installparametersethandler#1#2% + {\normalexpanded + {\doinstallparametersethandler + {\noexpand#1}% \??aa + \expandafter\noexpand\csname current#2\endcsname + \expandafter\noexpand\csname set#2parameter\endcsname + \expandafter\noexpand\csname let#2parameter\endcsname + \expandafter\noexpand\csname reset#2parameter\endcsname}} + \unexpanded\def\doinstallattributehandler#1#2#3% #1 not used here {\def#2##1##2% style color {\edef\fontattributehash {#3{##1}}% @@ -108,23 +125,32 @@ \expandafter\noexpand\csname doset#2attributes\endcsname \expandafter\noexpand\csname #2parameterhash\endcsname}} -\unexpanded\def\doinstalldefinehandler#1#2#3#4#5#6#7% - {\unexpanded\def#2{\dotripleempty#5}% +\let\definehandlerparent\empty + +\unexpanded\def\doinstalldefinehandler#1#2#3#4#5#6#7#8% + {\ifx#4\relax\let#4\empty\fi + \unexpanded\def#2{\dotripleempty#5}% \newtoks#6% \newtoks#7% - \def#5[##1][##2][##3]% [child][parent][settings] - {\edef#4{##1}% % [child] [settings] - \the#6% predefine % [child][parent] - \ifthirdargument % [child] + \def#5[##1][##2][##3]% [child][parent][settings] | [child][settings] | [child][parent] | [child] + {\let\saveddefinewhatever#4% + \edef#4{##1}% + \the#6% predefine + \ifthirdargument + \edef#8{##2}% \getparameters[#1#4][\s!parent=#1##2,##3]% \else\ifsecondargument \doifassignmentelse{##2} - {\getparameters[#1#4][\s!parent=#3,##2]} - {\getparameters[#1#4][\s!parent=#1##2]}% + {\let#8\empty + \getparameters[#1#4][\s!parent=#3,##2]} + {\edef#8{##2}% + \getparameters[#1#4][\s!parent=#1##2]}% \else + \let#8\empty \getparameters[#1#4][\s!parent=#3]% \fi\fi - \the#7}} + \the#7% + \let#4\saveddefinewhatever}} \unexpanded\def\installdefinehandler#1#2#3% {\normalexpanded @@ -135,13 +161,17 @@ \expandafter\noexpand\csname current#2\endcsname \expandafter\noexpand\csname d@define#2\endcsname \expandafter\noexpand\csname everypreset#2\endcsname - \expandafter\noexpand\csname everydefine#2\endcsname}} + \expandafter\noexpand\csname everydefine#2\endcsname + \expandafter\noexpand\csname current#2parent\endcsname}} -\unexpanded\def\doinstallsetuphandler#1#2#3#4#5% - {\unexpanded\def#2{\dodoubleempty#4}% +\unexpanded\def\doinstallsetuphandler#1#2#3#4#5#6% + {\ifx#3\relax\let#3\empty\fi + \unexpanded\def#2{\dodoubleempty#4}% + \unexpanded\def#6{\getparameters[#1#3]}% \newtoks#5% \def#4[##1][##2]% maybe helper - {\ifsecondargument + {\let\savedsetupwhatever#3% + \ifsecondargument \def\docommand####1% we will have a simple one as well {\edef#3{####1}% \getparameters[#1#3][##2]% @@ -151,7 +181,8 @@ \let#3\empty \getparameters[#1][##1]% \the#5% - \fi}} + \fi + \let#3\savedsetupwhatever}} \unexpanded\def\installsetuphandler#1#2% {\normalexpanded @@ -160,11 +191,13 @@ \expandafter\noexpand\csname setup#2\endcsname \expandafter\noexpand\csname current#2\endcsname \expandafter\noexpand\csname d@setup#2\endcsname - \expandafter\noexpand\csname everysetup#2\endcsname}} + \expandafter\noexpand\csname everysetup#2\endcsname + \expandafter\noexpand\csname setupcurrent#2\endcsname}} \unexpanded\def\installcommandhandler#1#2#3% \??self name \??parent (can be \??self) {\installparameterhandler {#1}{#2}% \installparameterhashhandler{#1}{#2}% + \installparametersethandler {#1}{#2}% \installdefinehandler {#1}{#2}{#3}% \installsetuphandler {#1}{#2}% \installattributehandler {#1}{#2}} @@ -216,5 +249,20 @@ \def\listnamespaces {\ctxlua{interfaces.namespaces.list()}} +%D Helper: +%D +%D \starttyping +%D \showparentchain{@@am}{left} +%D \stoptyping + +\def\doshowparentchain#1% + {#1 => % + \ifcsname#1\s!parent\endcsname + \expandafter\doshowparentchain\csname#1\s!parent\endcsname + \fi} + +\def\showparentchain#1#2% + {\writestatus\m!system{chain: [ \doshowparentchain{#1#2}]}} + \protect |