%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.lua}{1.001}

%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 becaus eitherwise 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]{\taggedctxcommand{settagproperty("#1","#2","#3")}}
\def\back_export_set_element_tag_b[#1][#2][#3]{\taggedctxcommand{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

\appendtoks
    \dotagsetparcounter
\to \everypar

\appendtoks
    \dotagsetparcounter
\to \neverypar

\appendtoks
    \dotagsetparcounter
\to \everytabulatepar % tricky, maybe this should be neverypar

\appendtoks
    \unexpanded\def\dotagTABLEcell  {\taggedctxcommand{settagtablecell(\number\tablecellrows,\number\tablecellcolumns,\number\raggedstatus)}}%
    \unexpanded\def\dotagTABLEsignal{\char\zerocount}% brrr, we need to tag empty cells (unless we start numbering)
\to \everyenableelements

\appendtoks
    \unexpanded\def\dotagtabulatecell  {\taggedctxcommand{settagtabulatecell(\number\c_tabl_tabulate_align)}}%
    \unexpanded\def\dotagtabulatesignal{\dontleavehmode\char\zerocount\ignorespaces}%
\to \everyenableelements

\appendtoks
    \unexpanded\def\dotagsynonym{\taggedctxcommand{settagsynonym("\currentsynonym","\currentsynonymtag")}}%
\to \everyenableelements

\appendtoks % frozen and assumed global per highlight class
    \unexpanded\def\dotaghighlight{\taggedctxcommand{settaghighlight("\currenthighlight","\highlightparameter\c!style",\number\attribute\colorattribute)}}%
\to \everyenableelements

\appendtoks % we can have differently scaled images
    \unexpanded\def\dotagfigure{\taggedctxcommand{settagfigure("\figurefileoriginal","\figurefilepage",\number\dimexpr\figurewidth,\number\dimexpr\figureheight)}}%
\to \everyenableelements

\appendtoks
    \unexpanded\def\dotagcombination{\taggedctxcommand{settagcombination(\combinationparameter\c!nx,\combinationparameter\c!ny)}}%
   %\unexpanded\def\dotagcombination{\taggedctxcommand{settagcombination(\number\horcombination,\number\totcombination)}}%
\to \everyenableelements

\appendtoks
    \unexpanded\def\dotagsorting{\taggedctxcommand{settagsorting("\currentsorting","\currentsortingtag")}}%
\to \everyenableelements

\appendtoks
    \unexpanded\def\dotagsetparcounter{\global\advance\tagparcounter\plusone\attribute\taggedparattribute\tagparcounter}%
\to \everyenableelements

\appendtoks
    \unexpanded\def\dotagsetitemgroup{\taggedctxcommand{settagitemgroup("\currentitemgroup",\ifconditional\c_strc_itemgroups_pack true\else false\fi,"\currentitemgroupsymbol")}}%
\to \everyenableelements

\appendtoks
    \unexpanded\def\dotagsetdescription{\taggedctxcommand{settagdescription("\currentdescription",\currentdescriptionnumberentry)}}%
\to \everyenableelements

\appendtoks
    \unexpanded\def\dotagsetnotesymbol{\taggedctxcommand{settagdescriptionsymbol("\currentnote",\currentnotenumber)}}%
\to \everyenableelements

\appendtoks
    \unexpanded\def\doverbatimspace{\char32\relax}% will be done permanently
\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!hyphen=\v!no]

\def\dosynchronizeexport
  {\let\currentexport\empty
   \ctxcommand{setupexport{
       align     = "\exportparameter\c!align",
       bodyfont  = \number\dimexpr\exportparameter\c!bodyfont,
       width     = \number\dimexpr\exportparameter\c!width,
       hyphen    = "\exportparameter\c!hyphen",
       title     = \!!bs\exportparameter\c!title\!!es,
       subtitle  = \!!bs\exportparameter\c!subtitle\!!es,
       author    = \!!bs\exportparameter\c!author\!!es,
       firstpage = "\exportparameter\c!firstpage",
       lastpage  = "\exportparameter\c!lastpage",
   }}}

\appendtoks
    \doifsomething{\backendparameter\c!export}\dosynchronizeexport
\to \everystarttext

\appendtoks
    \doifsomething{\backendparameter\c!export}\dosynchronizeexport % in case it is done inside \starttext
\to \everysetupdocument

\appendtoks
    \doifsomething{\backendparameter\c!xhtml}
      {\enabledirectives[backend.export.xhtml=\backendparameter\c!xhtml]}%
    \doifsomething{\backendparameter\c!css}
      {\enabledirectives[backend.export.css={\backendparameter\c!css}]}%
\to \everysetupbackend

\appendtoks
    \doifelsenothing{\backendparameter\c!export}
      {\resetsystemmode\v!export}
      {\setuptagging[\c!state=\v!start]%
       \enabledirectives[backend.export=\backendparameter\c!export]%
       \setsystemmode\v!export}%
\to \everysetupbackend

\protect \endinput
