summaryrefslogtreecommitdiff
path: root/tex/context/base/mult-aux.mkiv
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mult-aux.mkiv')
-rw-r--r--tex/context/base/mult-aux.mkiv143
1 files changed, 94 insertions, 49 deletions
diff --git a/tex/context/base/mult-aux.mkiv b/tex/context/base/mult-aux.mkiv
index d9ac110c9..283c63cab 100644
--- a/tex/context/base/mult-aux.mkiv
+++ b/tex/context/base/mult-aux.mkiv
@@ -121,6 +121,13 @@
\fi\fi
\m_mult_interfaces_namespace{#1}{#2}}
+\newif\ifassignment
+
+\def\mult_check_for_assignment#1=#2#3\_end_
+ {\expandafter\if\detokenize{#2}@\assignmentfalse\else\assignmenttrue\fi}
+
+% usage: \mult_check_for_assignment##1=@@_end_
+
% End of experimental code.
\unexpanded\def\mult_interfaces_install_parameter_handler#1#2#3#4#5#6#7#8#9% inlining \csname*\endcsname is more efficient (#3 and #6 only)
@@ -129,7 +136,6 @@
\def#3##1{\csname\ifcsname#1#2:##1\endcsname#1#2:##1\else\expandafter#5\csname#1#2:\s!parent\endcsname{##1}\fi\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}% is {} needed around ##1 ?
- %\def#6##1##2{\csname#4{#1##1}{##2}\endcsname}%
\def#6##1##2{\csname\ifcsname#1##1:##2\endcsname#1##1:##2\else\expandafter#5\csname#1##1:\s!parent\endcsname{##2}\fi\endcsname}%
\def#7##1{\detokenize\expandafter\expandafter\expandafter{\csname#1#2:##1\endcsname}}% always root, no backtrack
\def#8##1{\csname\ifcsname#1#2:##1\endcsname#1#2:##1\else\s!empty\fi\endcsname}%
@@ -243,34 +249,38 @@
\let\definehandlerparent\empty
-\unexpanded\def\mult_interfaces_install_define_handler#1#2#3#4#5#6#7#8%
+\unexpanded\def\mult_interfaces_install_define_handler#1#2#3#4#5#6#7#8#9%
{\ifx#4\relax\let#4\empty\fi
\unexpanded\def#2{\dotripleempty#5}%
\newtoks#6%
\newtoks#7%
\def#5[##1][##2][##3]% [child][parent][settings] | [child][settings] | [child][parent] | [child]
- {\let\saveddefinewhatever#4%
+ {\let#9#4%
\edef#4{##1}%
\the#6% predefine
\ifthirdargument
\edef#8{##2}%
- % \getparameters[#1#4:][\s!parent=#1##2,##3]%
\mult_interfaces_get_parameters{#1#4:}[\s!parent=#1##2,##3]%
\else\ifsecondargument
- \doifassignmentelse{##2}
- {\let#8\empty
- % \getparameters[#1#4:][\s!parent=#3,##2]}
- \mult_interfaces_get_parameters{#1#4:}[\s!parent=#3,##2]}
- {\edef#8{##2}%
- % \getparameters[#1#4:][\s!parent=#1##2]}%
- \mult_interfaces_get_parameters{#1#4:}[\s!parent=#1##2]}%
+% \doifassignmentelse{##2}
+% {\let#8\empty
+% \mult_interfaces_get_parameters{#1#4:}[\s!parent=#3,##2]}
+% {\edef#8{##2}%
+% \mult_interfaces_get_parameters{#1#4:}[\s!parent=#1##2]}%
+ \mult_check_for_assignment##2=@@\_end_
+ \ifassignment
+ \let#8\empty
+ \mult_interfaces_get_parameters{#1#4:}[\s!parent=#3,##2]%
+ \else
+ \edef#8{##2}%
+ \mult_interfaces_get_parameters{#1#4:}[\s!parent=#1##2]%
+ \fi
\else
\let#8\empty
- % \getparameters[#1#4:][\s!parent=#3]%
\mult_interfaces_get_parameters{#1#4:}[\s!parent=#3]%
\fi\fi
\the#7%
- \let#4\saveddefinewhatever}}
+ \let#4#9}}
\unexpanded\def\installdefinehandler#1#2#3%
{\normalexpanded
@@ -282,30 +292,28 @@
\expandafter\noexpand\csname define_#2\endcsname % semi-public
\expandafter\noexpand\csname everypreset#2\endcsname
\expandafter\noexpand\csname everydefine#2\endcsname
- \expandafter\noexpand\csname current#2parent\endcsname}}
+ \expandafter\noexpand\csname current#2parent\endcsname
+ \expandafter\noexpand\csname saved_defined_#2\endcsname}}
-\unexpanded\def\mult_interfaces_install_setup_handler#1#2#3#4#5#6%
+\unexpanded\def\mult_interfaces_install_setup_handler#1#2#3#4#5#6#7%
{\ifx#3\relax\let#3\empty\fi
\unexpanded\def#2{\dodoubleempty#4}%
- % \unexpanded\def#6{\getparameters[#1#3:]}% no every ! don't change it
\unexpanded\def#6{\mult_interfaces_get_parameters{#1#3:}}% no every ! don't change it
\newtoks#5%
\def#4[##1][##2]% maybe helper
- {\let\savedsetupwhatever#3%
+ {\let#7#3%
\ifsecondargument
\def\mult_interfaces_with_comma_list_element####1% we will have a simple one as well
{\edef#3{####1}%
- % \getparameters[#1#3:][##2]%
\mult_interfaces_get_parameters{#1#3:}[##2]%
\the#5}%
\processcommalist[##1]\mult_interfaces_with_comma_list_element
\else
\let#3\empty
- % \getparameters[#1:][##1]%
\mult_interfaces_get_parameters{#1:}[##1]%
\the#5%
\fi
- \let#3\savedsetupwhatever}}
+ \let#3#7}}
\unexpanded\def\installsetuphandler#1#2%
{\normalexpanded
@@ -315,59 +323,88 @@
\expandafter\noexpand\csname current#2\endcsname
\expandafter\noexpand\csname setup_#2\endcsname % semi-public
\expandafter\noexpand\csname everysetup#2\endcsname
- \expandafter\noexpand\csname setupcurrent#2\endcsname}}
+ \expandafter\noexpand\csname setupcurrent#2\endcsname
+ \expandafter\noexpand\csname saved_setup_current#2\endcsname}}
+
+\let\doingrootsetupnamed\plusone % \setuplayout[name][key=value]
+\let\doingrootsetuproot \plustwo % \setuplayout [key=value]
+\let\doingrootsetnamed \plusthree % \setuplayout[name]
+\let\doingrootsetroot \plusfour % \setuplayout
-\unexpanded\def\mult_interfaces_install_switch_setup_handler#1#2#3#4#5#6%
+\unexpanded\def\mult_interfaces_install_switch_setup_handler_a#1#2#3#4#5%
{\ifx#3\relax\let#3\empty\fi
\unexpanded\def#2{\dodoubleempty#4}%
- % \unexpanded\def#6{\getparameters[#1#3:]}%
- \unexpanded\def#6{\mult_interfaces_get_parameters{#1#3:}}%
- \newtoks#5%
+ \unexpanded\def#5{\mult_interfaces_get_parameters{#1#3:}}}
+
+\unexpanded\def\mult_interfaces_install_switch_setup_handler_b#1#2#3#4#5#6#7%
+ {\newtoks#5%
+ \newconstant#2%
+ \ifx#6\relax\let#6\empty\fi
\def#4[##1][##2]% maybe helper
{\ifsecondargument % no commalist here
- \let\savedsetupwhatever#3%
+ % \setuplayout[whatever][key=value]
+ \let#7#3%
+ \let#6#3%
\edef#3{##1}%
- % \getparameters[#1#3:][##2]%
+ #2\doingrootsetupnamed
\mult_interfaces_get_parameters{#1#3:}[##2]%
\the#5%
- \let#3\savedsetupwhatever
+ \let#3#7%
\else\iffirstargument
- \doifassignmentelse{##1}
- {\let\savedsetupwhatever#3%
- \let#3\empty
- % \getparameters[#1:][##1]%
- \mult_interfaces_get_parameters{#1:}[##1]%
- \the#5%
- \let#3\savedsetupwhatever}
- {\edef#3{##1}% this will catch reset
- \the#5}%
+ \mult_check_for_assignment##1=@@\_end_ % \docheckassignment{##1}%
+ \ifassignment
+ % \setuplayout[key=value]
+ \let#7#3%
+ \let#6#3%
+ \let#3\empty
+ #2\doingrootsetuproot
+ \mult_interfaces_get_parameters{#1:}[##1]%
+ \the#5%
+ \let#3#7%
+ \else
+ % \setuplayout[whatever]
+ \let#6#3% % previous becomes current
+ \edef#3{##1}% this will catch reset so one needs to test for it
+ #2\doingrootsetnamed
+ \the#5% % we can check for previous vs current
+ \fi
\else
- \let#3\empty
+ % \setuplayout
+ \let#6#3% % previous becomes current
+ \let#3\empty % current becomes empty
+ #2\doingrootsetroot
\the#5%
- \fi\fi}}
+ \fi\fi
+ #2\zerocount}} % mode is always zero at the end
\unexpanded\def\installswitchsetuphandler#1#2%
{\normalexpanded
- {\mult_interfaces_install_switch_setup_handler
+ {\mult_interfaces_install_switch_setup_handler_a
{\noexpand#1}% \??aa
\expandafter\noexpand\csname setup#2\endcsname
\expandafter\noexpand\csname current#2\endcsname
\expandafter\noexpand\csname setup_#2\endcsname % semi-public
+ \expandafter\noexpand\csname setupcurrent#2\endcsname
+ \mult_interfaces_install_switch_setup_handler_b
+ {\noexpand#1}% \??aa
+ \expandafter\noexpand\csname #2setupmode\endcsname
+ \expandafter\noexpand\csname current#2\endcsname
+ \expandafter\noexpand\csname setup_#2\endcsname % semi-public
\expandafter\noexpand\csname everysetup#2\endcsname
- \expandafter\noexpand\csname setupcurrent#2\endcsname}}
+ \expandafter\noexpand\csname previous#2\endcsname
+ \expandafter\noexpand\csname saved_setup_current#2\endcsname}}
+
-\unexpanded\def\mult_interfaces_install_auto_setup_handler#1#2#3#4#5#6#7%
+\unexpanded\def\mult_interfaces_install_auto_setup_handler#1#2#3#4#5#6#7#8%
{\ifx#3\relax\let#3\empty\fi
\unexpanded\def#2{\dotripleempty#4}%
- % \unexpanded\def#6{\getparameters[#1#3:]}%
\unexpanded\def#6{\mult_interfaces_get_parameters{#1#3:}}%
\newtoks#5%
\def#4[##1][##2][##3]%
- {\let\savedsetupwhatever#3%
+ {\let#8#3%
\ifthirdargument
\def\mult_interfaces_with_comma_list_element####1%
{\edef#3{####1}%
- % \getparameters[#1#3:][\s!parent=#1##2,##3]%
\mult_interfaces_get_parameters{#1#3:}[\s!parent=#1##2,##3]% always sets parent
\the#5}%
\processcommalist[##1]\mult_interfaces_with_comma_list_element
@@ -375,17 +412,15 @@
\def\mult_interfaces_with_comma_list_element####1%
{\edef#3{####1}%
#7% checks parent and sets if needed
- % \getparameters[#1#3:][##2]%
\mult_interfaces_get_parameters{#1#3:}[##2]%
\the#5}%
\processcommalist[##1]\mult_interfaces_with_comma_list_element
\else
\let#3\empty
- % \getparameters[#1:][##1]%
\mult_interfaces_get_parameters{#1:}[##1]%
\the#5%
\fi\fi
- \let#3\savedsetupwhatever}}
+ \let#3#8}}
\unexpanded\def\installautosetuphandler#1#2%
{\normalexpanded
@@ -396,7 +431,8 @@
\expandafter\noexpand\csname setup_#2\endcsname % semi-public
\expandafter\noexpand\csname everysetup#2\endcsname
\expandafter\noexpand\csname setupcurrent#2\endcsname
- \expandafter\noexpand\csname check#2parent\endcsname}}
+ \expandafter\noexpand\csname check#2parent\endcsname
+ \expandafter\noexpand\csname saved_setup_current#2\endcsname}}
\unexpanded\def\installbasicparameterhandler#1#2%
{\installparameterhandler {#1}{#2}%
@@ -566,6 +602,9 @@
{\ifnum\c_mult_interfaces_n_of_namespaces<\plusten00\else\ifnum\c_mult_interfaces_n_of_namespaces<\plushundred0\fi\fi
\number\c_mult_interfaces_n_of_namespaces>}
+\def\v_interfaces_prefix_template % consistently %03i>
+ {\number\c_mult_interfaces_n_of_namespaces>}
+
\unexpanded\def\installnamespace#1% for modules and users
{\ifcsname ????#1\endcsname
\writestatus\m!system{duplicate user namespace '#1'}\wait
@@ -583,6 +622,12 @@
\ctxcommand{registernamespace(\number\c_mult_interfaces_n_of_namespaces,"#1")}%
\fi}
+% We install two core namespaces here, as we want nice error messages. Maybe
+% we will reserve the first 9.
+
+\installcorenamespace{fontinstancebasic}
+\installcorenamespace{fontinstanceclass}
+
% \enabletrackers[interfaces.namespaces,context.flush]
%
% \definenamespace