%D \module %D [ file=core-job, % copied from main-001, %D version=1997.03.31, %D title=\CONTEXT\ Core Macros, %D subtitle=Job Handling, %D author=Hans Hagen, %D date=\currentdate, %D copyright={PRAGMA / Hans Hagen \& Ton Otten}] %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 module is still to be split and documented. \writestatus{loading}{ConTeXt Core Macros / Job Handling} \unprotect \registerctxluafile{core-job}{1.001} \let \currentproject \empty \let \currentproduct \empty \let \currentenvironment \empty \let \currentcomponent \empty \let \loadedfiles \empty \let \processedfiles \empty \let \nomorefiles \relax \let \allinputpaths \empty \let \locatedfilepath \empty \newcount\textlevel \newcount\fileprocesslevel \setvalue{\c!file::0}{\jobname} \def\processedfile % is used in styles, don't change ! {\getvalue{\c!file::\number\fileprocesslevel}} \def\dostarttextfile#1% {\global\advance\fileprocesslevel\plusone \setxvalue{\c!file::\number\fileprocesslevel}{#1}% \doglobal\addtocommalist{#1}\processedfiles} \def\dostoptextfile {\global\advance\fileprocesslevel\minusone} \def\processlocalfile#1#2% {#1{#2}\donothing{\readfile{#2}\donothing\donothing}} \def\processfile #1{\ctxcommand{processfile("#1")}} \def\doifinputfileelse #1{\ctxcommand{doifinputfileelse("#1")}} \def\locatefilepath #1{\edef\locatedfilepath{\ctxcommand{locatefilepath("#1")}}} \def\usepath [#1]{\edef\allinputpaths{\ctxcommand{usepath("#1")}}} \def\usesubpath [#1]{\edef\allinputpaths{\ctxcommand{usesubpath("#1")}}} \def\usezipfile {\dodoubleempty\dousezipfile} \def\dousezipfile[#1][#2]{\ctxcommand{usezipfile("#1","#2")}} % [filename] [optional subtree] \def\loadexamodes {\dosingleempty\doloadexamodes} \def\doloadexamodes [#1]{\ctxcommand{loadexamodes("#1")}} \def\registerfileinfo[#1#2]#3% geen \showmessage ? {\writestatus\m!systems{#1#2 file #3 at line \the\inputlineno}} \def\doloadsystemfile#1% only mkiv files {\readsysfile{#1.\mksuffix}{\showmessage\m!systems2{#1.\mksuffix}}\donothing} \def\loadsystemfiles {\doloadsystemfile\f!newfilename % new code, to be integrated at some point, plus fixes posted on the list \doloadsystemfile\f!locfilename % new code, somewhat experimental, not distributed (outside the dev group) \doloadsystemfile\f!expfilename % new code, very experimental, can be engine specific, mostly for me only \doloadsystemfile\f!sysfilename} % local settings, but probably not that good an idea to use %D We don't want multiple jobfiles to interfere. \def\loadoptionfile % todo : mark document.* tables as storage {\readjobfile{\jobname.\f!optionextension} {\showmessage\m!systems2{\jobname.\f!optionextension}% \ctxcommand{logoptionfile("\jobname.\f!optionextension")}}% {\writestatus\m!systems {no \jobname.\f!optionextension}}} % Most natural ... % % \def\doateverystarttext % {\the\everystarttext % \global\let\doateverystarttext\relax} % % ... most practical, since we can load env's in a % something.run file (nested \starttext's; see for % instance x-res-08, where we definitely want to % open the file!). \def\doateverystarttext {\the\everystarttext \global\everystarttext\emptytoks} \unexpanded\def\starttext {\doateverystarttext \ifcase\textlevel \registerfileinfo[begin]\jobfilename \fi \global\advance\textlevel\plusone} \unexpanded\def\stoptext {\global\advance\textlevel\minusone \ifnum\textlevel>\zerocount \else \flushfinallayoutpage % optional \page % anyway \the\everystoptext %\the\everybye % %\the\everygoodbye % == \end (new) %\expandafter\normalend % \ifcase\textlevel \registerfileinfo[end]\jobfilename \fi \expandafter\finalend \fi} \def\forcequitjob#1% {\writestatus\m!systems{forcing quit: #1}% \batchmode \dorecurse\textlevel{\stoptext} \normalend} \let\autostoptext\relax \def\autostarttext {\ifcase\textlevel \starttext \writestatus\m!systems{auto \string\starttext..\string\stoptext}% \let\autostoptext\stoptext \fi} \def\finalend {\ifnum\textlevel>\zerocount \else \the\everybye \the\everygoodbye \doifsometokselse\everynotabene{\writeline\the\everynotabene\writeline}\donothing \global\everybye \emptytoks % rather unneeded \global\everygoodbye\emptytoks % but for sure \expandafter\normalend \fi} \let\end\finalend \def\emergencyend {\writestatus\m!systems{invalid \@EA\string\csname\e!start\v!text\endcsname...\@EA\string\csname\e!stop\v!text\endcsname\space structure}% \stoptext} \def\currentfile{\inputfilename} \def\doexecutefileonce#1% {\beforesplitstring#1\at.\to\currentfile \doifnotinset\currentfile\loadedfiles {\addtocommalist\currentfile\loadedfiles \doexecutefile{#1}}} \def\doexecutefile#1% {\registerfileinfo[begin]{#1}% \dostarttextfile{#1}% \processfile{#1}% \dostoptextfile \registerfileinfo[end]{#1}} \def\donotexecutefile#1% {} \unexpanded\def\project {\doifnextoptionalelse\useproject \redoproject} \unexpanded\def\environment{\doifnextoptionalelse\useenvironment\redoenvironment} \unexpanded\def\product {\doifnextoptionalelse\useproduct \redoproduct} \unexpanded\def\component {\doifnextoptionalelse\usecomponent \redocomponent} \def\redoproject #1 {\useproject [#1]} \def\redoenvironment #1 {\useenvironment[#1]} \def\redoproduct #1 {\useproduct [#1]} \def\redocomponent #1 {\usecomponent [#1]} \def\useproject[#1]% {} \def\useenvironment[#1]% maybe commalist {\pushmacro\dostartenvironment % we could use a depth counter \pushmacro\stopenvironment \unexpanded\def\dostartenvironment[##1]{}% \let\stopenvironment\relax \startreadingfile \doexecutefileonce{#1} \stopreadingfile \popmacro\stopenvironment \popmacro\dostartenvironment} \def\useproduct[#1]% {} \def\usecomponent[#1]% {\dostarttextfile{#1}% \processfile{#1}% \dostoptextfile} \newcount\filelevel \let\currentcomponent \v!text \let\currentcomponentpath\f!currentpath \def\donextlevel#1#2#3#4#5#6#7\\% we will move this to lua {\pushmacro\currentcomponent \pushmacro\currentcomponentpath \let\currentcomponent#1% \setsystemmode\currentcomponent \splitfilename{#1}% \ifx\splitoffpath\empty \let\currentcomponentpath\f!currentpath \else \let\currentcomponentpath\splitoffpath \fi \beforesplitstring#7\at.\to#2\relax % can become path + base \ifcase\filelevel\relax \starttext \unexpanded\def\useproject [##1]{#3{##1}}% \unexpanded\def\useenvironment[##1]{#4{##1}}% \unexpanded\def\useproduct [##1]{#5{##1}}% \unexpanded\def\usecomponent [##1]{#6{##1}}% \fi \advance\filelevel\plusone \addtocommalist{#1}\loadedfiles} \def\doprevlevel {\popmacro\currentcomponentpath \popmacro\currentcomponent \setsystemmode\currentcomponent \ifnum\filelevel=\plusone \expandafter\stoptext \else \advance\filelevel\minusone \expandafter\endinput \fi} \unexpanded\def\startproject {\doifnextoptionalelse\dostartproject \redostartproject} \unexpanded\def\startenvironment{\doifnextoptionalelse\dostartenvironment\redostartenvironment} \unexpanded\def\startproduct {\doifnextoptionalelse\dostartproduct \redostartproduct} \unexpanded\def\startcomponent {\doifnextoptionalelse\dostartcomponent \redostartcomponent} \def\redostartproject #1 {\dostartproject [#1]} \def\redostartenvironment #1 {\dostartenvironment[#1]} \def\redostartproduct #1 {\dostartproduct [#1]} \def\redostartcomponent #1 {\dostartcomponent [#1]} \def\dostartproject[#1]% {\donextlevel\v!project\currentproject \donotexecutefile\doexecutefileonce \doexecutefileonce\doexecutefile#1\\} \def\dostartproduct[#1]% {\doateverystarttext \donextlevel\v!product\currentproduct \doexecutefileonce\doexecutefileonce \donotexecutefile\doexecutefile#1\\} \def\dostartcomponent[#1]% {\doateverystarttext \donextlevel\v!component\currentcomponent \doexecutefileonce\doexecutefileonce \donotexecutefile\doexecutefile#1\\} \def\dostartenvironment[#1]% {\donextlevel\v!environment\currentenvironment \donotexecutefile\doexecutefileonce \donotexecutefile\donotexecutefile#1\\} % \startproject test % 1: \startmode[*project] project \stopmode \endgraf % 2: \startmode[*product] product \stopmode \endgraf % \stopproject \unexpanded\def\stopproject {\doprevlevel} \unexpanded\def\stopproduct {\doprevlevel} \unexpanded\def\stopcomponent {\doprevlevel} \unexpanded\def\stopenvironment{\doprevlevel} % more or less replaced by modes \setvalue{\e!start\v!localenvironment}[#1]% {\let\loadedlocalenvironments\empty \def\docommand##1% {\beforesplitstring##1\at.\to\someevironment \addtocommalist\someevironment\loadedlocalenvironments}% \processcommalist[#1]\docommand \expanded{\doifcommonelse{\currentproject,\currentproduct,\currentcomponent,\currentenvironment}{\loadedlocalenvironments}} % \expanded not needed {\letvalue{\e!stop\v!localenvironment}\relax} {\grabuntil{\e!stop\v!localenvironment}\gobbleoneargument}} \setvalue{\v!localenvironment}{\doifnextoptionalelse\uselocalenvironment\redolocalenvironment} \def\redolocalenvironment#1 {\uselocalenvironment[#1]} \def\uselocalenvironment[#1]{\doexecutefileonce{#1}} \neverypar\emptytoks % here ? % \appendtoks \flushnotes \to \everypar % \appendtoks \synchronizesidefloats \to \everypar % \appendtoks \checkindentation \to \everypar % \appendtoks \showparagraphnumber \to \everypar % \appendtoks \flushmargincontents \to \everypar % \appendtoks \flushcommentanchors \to \everypar % \appendtoks \synchronizenotes \to \everypar % \appendtoks \flushnotes \to \everydisplay % \appendtoks \adjustsidefloatdisplaylines \to \everydisplay \protect \endinput