% $Id: logreq.sty,v 1.0 2010/08/04 16:12:57 lehman stable $
% Copyright (c) 2010 Philipp Lehman.
%
% Permission is granted to copy, distribute and/or modify this
% software under the terms of the LaTeX Project Public License
% (LPPL), version 1.3.
%
% The LPPL maintenance status of this software is 'maintained'.
%
% This software is provided 'as is', without warranty of any kind,
% either expressed or implied, including, but not limited to, the
% implied warranties of merchantability and fitness for a
% particular purpose.
\def\lrq@rcsid$#1: #2 #3 #4 #5${#4 v#3}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{logreq}
[\lrq@rcsid $Id: logreq.sty,v 1.0 2010/08/04 16:12:57 lehman stable $
xml request logger]
\RequirePackage{etoolbox}
\RequirePackage{keyval}
\let\lrq@tempa\@empty
\def\do#1{%
\edef\lrq@tempa{\lrq@tempa
\catcode\number`#1=\the\catcode`#1\relax}%
\@makeother#1}
\do\<\do\>\do\?\do\!\do\/\do\=\do\"
\let\do\noexpand
\AtEndOfPackage{\lrq@tempa\undef\lrq@tempa}
\def\lrq@version$#1: #2 ${#2}
\edef\lrq@version{\lrq@version$Revision: 1.0 $}
\newcount\lrq@indent
\def\lrq@nl{^^J}
\def\lrq@tab{\lrq@tab@i\lrq@indent}
\def\lrq@tab@i#1{%
\ifnumgreater{#1}\z@
{\space\space
\expandafter\lrq@tab@i
\expandafter{\the\numexpr#1-\@ne}}
{}}
\let\lrq@hook@data\@empty
\def\lrq@hook@init{%
\lrq@indent\@ne
\let\comment\lrq@xml@comment}
\def\lrq@xml@sig{}
\edef\lrq@xml@ver{}
\def\lrq@xml@comment#1{%
\xappto\lrq@hook@data{\lrq@tab\lrq@nl}}
\def\lrq@xml@container#1#2#3{%
\begingroup
\lrq@parseattributes{#1}{#2}%
\xappto\lrq@hook@data{\lrq@tab<#1\lrq@attribs>\lrq@nl}%
\advance\lrq@indent\@ne#3\advance\lrq@indent\m@ne
\xappto\lrq@hook@data{\lrq@tab#1>\lrq@nl}%
\endgroup}
\def\lrq@xml@element#1#2#3{%
\begingroup
\lrq@parseattributes{#1}{#2}%
\xappto\lrq@hook@data{\lrq@tab<#1\lrq@attribs>#3#1>\lrq@nl}%
\endgroup}
\def\lrq@xml@setup{%
\begingroup
\lrq@indent\@ne
\let\do\lrq@dtd@doelement
\dolistloop\lrq@lst@elm
\xdef\lrq@hook@data{%
\lrq@nl
\lrq@xml@sig\lrq@nl
\lrq@xml@ver\lrq@nl
\lrq@nl
\lrq@nl
\lrq@nl\lrq@hook@data}%
\endgroup
}
\def\lrq@dtd@doelement#1{%
\ifcsdef{lrq@lst@att@#1}%
{\xappto\lrq@hook@dtd{\lrq@tab\lrq@nl}}
{}}
\def\lrq@dtd@doattribute#1{%
\xappto\lrq@hook@dtd{\lrq@tab#1\lrq@nl}}
\def\lrq@writeout{%
\PackageInfo{logreq}{%
Writing requests to '\@reqoutput'\@gobble}%
\begingroup
\openin\@mainaux\@reqoutput\relax
\ifeof\@mainaux
\lrq@writeout@ii
\else
\endlinechar\m@ne
\readline\@mainaux to \lrq@tempa
\ifeof\@mainaux
\lrq@writeout@ii
\else
\readline\@mainaux to \lrq@tempa
\edef\lrq@xml@sig{\detokenize\expandafter{\lrq@xml@sig}}%
\ifx\lrq@xml@sig\lrq@tempa
\readline\@mainaux to \lrq@tempa
\edef\lrq@xml@ver{\noexpand\detokenize{\lrq@xml@ver}}%
\edef\lrq@xml@ver{\lrq@xml@ver}%
\ifx\lrq@xml@ver\lrq@tempa
\else
\PackageWarning{logreq}{%
File '\@reqoutput' created\MessageBreak
by different version of logreq.\MessageBreak
Overwriting file}%
\fi
\lrq@writeout@ii
\else
\lrq@writeout@i
\PackageError{logreq}
{File '\@reqoutput' not created by logreq}
{This file was apparently not created by logreq.\MessageBreak
I'm aborting now}%
\fi
\fi
\fi}
\def\lrq@writeout@i{%
\closein\@mainaux
\endgroup}
\def\lrq@writeout@ii{%
\lrq@writeout@i
\lrq@xml@setup
\immediate\openout\@mainaux\@reqoutput\relax
\immediate\write\@mainaux{\lrq@hook@data}%
\immediate\closeout\@mainaux}
\AtEndDocument{\AfterEndDocument{\lrq@writeout}}
\protected\def\lrq@container{\lrq@parser\lrq@xml@container}
\protected\def\lrq@element{\lrq@parser\lrq@xml@element}
\def\lrq@parser#1#2{%
\@ifnextchar[%]
{\lrq@parser@i{#1}{#2}}
{\lrq@parser@i{#1}{#2}[]}}
\def\lrq@parser@i#1#2[#3]#4{%
#1{#2}{#3}{#4}}
% {}{}
\newrobustcmd*{\DeclareLogreqContainer}{\lrq@defparser\lrq@container}
\@onlypreamble\DeclareLogreqContainer
\newrobustcmd*{\DeclareLogreqElement}{\lrq@defparser\lrq@element}
\@onlypreamble\DeclareLogreqElement
\def\lrq@defparser#1{%
\begingroup\@makeother\#%
\lrq@defparser@i{#1}}
\def\lrq@defparser@i#1#2#3{%
\endgroup
\eappto\lrq@hook@init{%
\def\expandafter\noexpand\csname#2\endcsname{%
\noexpand#1{#2}}}%
\listadd\lrq@lst@elm{#2}%
\begingroup
\lrq@indent\@ne
\xappto\lrq@hook@dtd{\lrq@tab\lrq@nl}%
\endgroup}
% {}[]{}{}
\newrobustcmd*{\DeclareLogreqAttribute}[1]{%
\@ifnextchar[%]
{\lrq@defattibute{#1}}
{\lrq@defattibute{#1}[]}}
\@onlypreamble\DeclareLogreqAttribute
\def\lrq@defattibute#1[#2]#3{%
\ifblank{#2}
{\define@key{lrq@att@#1}{#3}}
{\define@key{lrq@att@#1}{#3}[#2]}%
{\eappto\lrq@attribs{ #3="##1"}}%
\begingroup\@makeother\#%
\lrq@defattibute@i{#1}{#3}}
\def\lrq@defattibute@i#1#2#3{%
\endgroup
\listcseadd{lrq@lst@att@#1}{#2 #3}}
\def\lrq@parseattributes#1#2{%
\let\lrq@attribs\@empty
\setkeys{lrq@att@#1}{#2}}
% {}{}{}
\protected\def\lrq@request#1#2#3{%
\begingroup
\setbox\@tempboxa=\hbox{%
\let\if@safe@actives\iftrue
\let\protect\string
\lrq@hook@init
#1[#2]{#3}}%
\endgroup}
% package interface
% {}{}{}
\newrobustcmd*{\ltxrequest}[3]{%
\lrq@request\internal{package={#1},priority=9,active={#2}}{\generic{latex}#3}}
% [package=,priority=,active=<0|1>]{}
\newrobustcmd*{\logrequest}[2][]{%
\lrq@request\external{#1}{#2}}
% initialization
\newcommand*{\@reqoutput}{\jobname.run.xml}
\newcommand*{\LogreqDTDVersion}{}
\input{logreq.def}
\endinput