back-exp.mkiv / last modification: 2020-01-30 14:16
%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

\appendtoks
    \unexpanded\def\dotagparagraph#1%
      {\iftrialtypesetting\else
         \clf_settagparagraph{#1}\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