%D \module %D [ file=back-exp, %D version=2010.08.22, %D title=\CONTEXT\ Backend Macros, %D subtitle=XML export, %D author=Hans Hagen, %D date=\currentdate, %D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] %C %C This module is part of the \CONTEXT\ macro||package and is %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. \writestatus{loading}{ConTeXt Backend Macros / XML export} \registerctxluafile{back-exp}{} %D This is an experimental exporter and a logical follow up on tagging. The %D exporter assumes a properly tagged document. Some elements get a couple %D of attributes because otherwise rendering information would get lost. In %D general we assume that when the \XML\ is converted to \HTML\ some stylesheet %D is applied anyway. \unprotect % we can replace this by a more generic attributeset mechanism where we bind % to any element (needed anyway, see userdata thingies) \definesystemattribute[taggedpar][public] \unexpanded\def\setelementexporttag {\dotripleargument\back_export_set_element_tag} \def\back_export_set_element_tag {\ifthirdargument \expandafter \back_export_set_element_tag_a \else\ifsecondargument \doubleexpandafter\back_export_set_element_tag_b \fi\fi} \def\back_export_set_element_tag_a[#1][#2][#3]{\clf_settagproperty{#1}{#2}{#3}} \def\back_export_set_element_tag_b[#1][#2][#3]{\clf_settagproperty{#1}{export}{#2}} % todo: no need for calls when trialtypesetting \def\taggedctxcommand {\iftrialtypesetting \expandafter\gobbleoneargument \else \expandafter\ctxcommand \fi} \newcount\tagparcounter \let\dotagsetparcounter\relax \let\doresetparcounter \relax \appendtoks \doresetparcounter \to \everyflushatnextpar % \appendtoks % \dotagsetparcounter % \to \everypar \prependtoks \dotagsetparcounter \to \everypar % \appendtoks % \dotagsetparcounter % \to \neverypar \prependtoks \dotagsetparcounter \to \neverypar \appendtoks \dotagsetparcounter \to \everytabulatepar % tricky, maybe this should be neverypar \appendtoks \unexpanded\def\dotagTABLEcell {\iftrialtypesetting\else \clf_settagtablecell \numexpr\tablecellrows\relax \numexpr\tablecellcolumns\relax \numexpr\raggedstatus\relax \fi}% % brrr, we need to tag empty cells (unless we start numbering) \unexpanded\def\dotagTABLEsignal {\signalcharacter}% \to \everyenableelements \appendtoks \unexpanded\def\dotagtabulatecell {\iftrialtypesetting\else \clf_settagtabulatecell\c_tabl_tabulate_align\c_tabl_tabulate_kind \fi}% \unexpanded\def\dotagtabulatesignal {\dontleavehmode\signalcharacter\ignorespaces}% \to \everyenableelements \appendtoks \unexpanded\def\dotagsynonym {\iftrialtypesetting\else\clf_settagsynonym{\currentsynonymtag}\fi}% \to \everyenableelements \appendtoks \unexpanded\def\dotagsorting {\iftrialtypesetting\else\clf_settagsorting{\currentsortingtag}\fi}% \to \everyenableelements \appendtoks % frozen and assumed global per highlight class \unexpanded\def\dotagconstruct {\iftrialtypesetting\else \clf_settagconstruct {\currentstartstop}% {\startstopparameter\c!style}% \attribute\colorattribute \ifvmode\plusone\else\zerocount\fi \relax \fi}% \to \everyenableelements \appendtoks % frozen and assumed global per highlight class \unexpanded\def\dotaghighlight {\iftrialtypesetting\else \clf_settaghighlight {\currenthighlight}% {\highlightparameter\c!style} \attribute\colorattribute \ifvmode\plusone\else\zerocount\fi \relax \fi}% \to \everyenableelements \appendtoks % we can have differently scaled images \unexpanded\def\dotagfigure {\iftrialtypesetting\else \clf_settagfigure {\figurefileoriginal}% {\figurefullname}% {\figurefilepage}% \dimexpr\figurewidth\relax \dimexpr\figureheight\relax {\figurelabel}% \fi}% \to \everyenableelements \appendtoks \unexpanded\def\dotagcombination {\iftrialtypesetting\else \clf_settagcombination \numexpr\combinationparameter\c!nx\relax \numexpr\combinationparameter\c!ny\relax \fi}% \to \everyenableelements \appendtoks \unexpanded\def\dotagsetparcounter {\global\advance\tagparcounter\plusone\attribute\taggedparattribute\tagparcounter}% \unexpanded\def\doresetparcounter {\attribute\taggedparattribute\attributeunsetvalue}% \to \everyenableelements \appendtoks \unexpanded\def\dotagsetitemgroup {\iftrialtypesetting\else \clf_settagitemgroup \ifconditional\c_strc_itemgroups_pack true\else false\fi\space \numexpr\currentitemlevel\relax {\currentitemgroupsymbol}% \fi}% \unexpanded\def\dotagsetitem#1% {\iftrialtypesetting\else \clf_settagitem{#1}% \fi}% \to \everyenableelements % \appendtoks % \unexpanded\def\dotagsetdescription % {\iftrialtypesetting\else % \clf_settagdescription{\currentdescription}\currentdescriptionnumberentry\relax % \fi}% % \to \everyenableelements \appendtoks \unexpanded\def\dotagsetnotation {\iftrialtypesetting\else \clf_settagnotation{\currentnote}\currentnotenumber\relax \fi}% \to \everyenableelements \appendtoks \unexpanded\def\dotagsetnotesymbol {\iftrialtypesetting\else \clf_settagnotationsymbol{\currentnote}\currentnotenumber\relax \fi}% \to \everyenableelements \appendtoks \unexpanded\def\dotagregisterlocation {\iftrialtypesetting\else \clf_settagregister{\currentregister}\currentregisternumber\relax \fi}% \to \everyenableelements \appendtoks \unexpanded\def\dotaglistlocation {\iftrialtypesetting\else \clf_settaglist\currentlistindex\relax \fi}% \to \everyenableelements \appendtoks \unexpanded\def\dotagsetdelimitedsymbol#1% {\iftrialtypesetting\else \clf_settagdelimitedsymbol{#1}\relax \fi}% \to \everyenableelements \appendtoks \unexpanded\def\dotagsetsubsentencesymbol#1% {\iftrialtypesetting\else \clf_settagsubsentencesymbol{#1}\relax \fi}% \to \everyenableelements \appendtoks \unexpanded\def\dotagregisterfloat#1#2% {\iftrialtypesetting\else \clf_settagfloat{#1}{#2}\relax \fi}% \to \everyenableelements \appendtoks \let\specialfixedspace \explicitfixedspace \let\specialobeyedspace \explicitobeyedspace \let\specialstretchedspace\explicitstretchedspace \let\specialcontrolspace \explicitcontrolspace \to \everyenableelements \appendtoks \unexpanded\def\dotagregisterformula#1% {\iftrialtypesetting\else \clf_settagformulacontent#1\relax \fi}% \to \everyenableelements \appendtoks \unexpanded\def\dotagmarginanchor#1% {\iftrialtypesetting\else\clf_settagmarginanchor#1\relax\fi}% \unexpanded\def\dotagmargintext#1% {\iftrialtypesetting\else\clf_settagmargintext#1\relax\fi}% \to \everyenableelements \appendtoks \unexpanded\def\dotagpublication#1#2% {\iftrialtypesetting\else \clf_settagpublication{#1}{#2}\relax \fi}% \to \everyenableelements % The action: \setupbackend[export=yes] % or filename % maybe xhtml css settings will move to setupexport % maybe some day a definer \installcorenamespace{export} \installparameterhandler \??export {export} \installsetuphandler \??export {export} \setupexport [\c!align=\number\raggedstatus, \c!bodyfont=\bodyfontsize, \c!width=\textwidth, \c!title={\directinteractionparameter\c!title}, \c!subtitle={\directinteractionparameter\c!subtitle}, \c!author={\directinteractionparameter\c!author}, % \c!firstpage=, % imagename % \c!lastpage=, % imagename \c!properties=\v!no, % no: ignore, yes: as attribute, otherwise: use as prefix \c!hyphen=\v!no, \c!svgstyle=, \c!cssfile=, \c!file=] \resetsystemmode\v!export \unexpanded\def\doinitializeexport {\edef\p_export{\backendparameter\c!export}% \ifx\p_export\empty \else % yes | xml \setuptagging[\c!state=\v!start]% \clf_initializeexport \setsystemmode\v!export \exportingtrue \writestatus\m!backend\empty % so messages will stand out a bit \the\everyinitializeexport \writestatus\m!backend\empty % so messages will stand out a bit \glet\doinitializeexport\relax \fi} \unexpanded\def\dostartexport {%\glet\dostartexport\relax \let\currentexport\empty \clf_setupexport align {\exportparameter\c!align}% bodyfont \dimexpr\exportparameter\c!bodyfont\relax width \dimexpr\exportparameter\c!width\relax properties {\exportparameter\c!properties}% hyphen {\exportparameter\c!hyphen}% title {\exportparameter\c!title}% subtitle {\exportparameter\c!subtitle}% author {\exportparameter\c!author}% firstpage {\exportparameter\c!firstpage}% lastpage {\exportparameter\c!lastpage}% svgstyle {\exportparameter\c!svgstyle}% cssfile {\exportparameter\c!cssfile}% file {\exportparameter\c!file}% export {\backendparameter\c!export}% \relax} \unexpanded\def\dostopexport {\glet\dostopexport\relax \clf_finishexport} \appendtoks \doinitializeexport \to \everysetupbackend \appendtoks \ifexporting \dostartexport \fi \to \everystarttext % better (before pdf gets closed, so we can embed), but it needs testing: \appendtoks \ifexporting \dostopexport \fi \to \everystoptext \appendtoks \ifexporting \dostartexport % in case it is done inside \starttext \fi \to \everysetupdocument \protect \endinput