% $Id: tex4ht-docbook-xtpipes.tex 740 2020-06-13 22:35:32Z karl $
% htlatex tex4ht-docbook-xtpipes "xhtml,next,3" "" "-d./"
%
% Copyright 2009-2020 TeX Users Group
% Copyright 2000-2009 Eitan M. Gurari
% Released under LPPL 1.3c+.
% See tex4ht-cpright.tex for license text.

\documentclass{article}
    \Configure{ProTex}{log,<<<>>>,title,list,`,[[]]}
\begin{document}

\input{common}
\input{tex4ht-cpright}
\input{tex4ht-dir}



%%%%%%%%%%%%%%%%%%
\part{Post Processing for DocBook Output Mode}
%%%%%%%%%%%%%%%%%%


%%%%%%%%%%%%%%%%%%
\section{Outline}
%%%%%%%%%%%%%%%%%%

\AtEndDocument{\OutputCodE\<docbook.4xt\>}

\Needs{"xmllint --valid --noout docbook.4xt"} 

\<docbook.4xt\><<<
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE xtpipes SYSTEM "xtpipes.dtd" >
<!-- docbook.4xt (`version), generated from `jobname.tex
     Copyright (C) 2009-2010 TeX Users Group
     Copyright (C) `CopyYear.2008. Eitan M. Gurari
`<TeX4ht copyright`> -->
<xtpipes preamble="yes" signature="docbook.4xt (`version)">
   <sax content-handler="xtpipes.util.ScriptsManager" 
        lexical-handler="xtpipes.util.ScriptsManagerLH" >
     `<db links`>
     `<tabular hor lines`>
     `<trim() para`>
   </sax>
</xtpipes>
>>>


\AtEndDocument{\OutputCodE\<DbUtilities.java\>}

\ifdojava
  \Needs{"
    javac DbUtilities.java -d \XTPIPES
"}
\fi

\<DbUtilities.java\><<<
package tex4ht;
/* DbUtilities.java (`version), generated from `jobname.tex
   Copyright (C) 2009-2010 TeX Users Group
   Copyright (C) `CopyYear.2008. Eitan M. Gurari
`<TeX4ht copyright`> */

import org.w3c.dom.*;
public class DbUtilities {
  `<static void cline(dom)`>
  `<static void para(dom)`>
}
>>>
 

%%%%%%%%%%%%%%%%%%
\section{Trim Spaces of Paragraphs}
%%%%%%%%%%%%%%%%%%

\<trim() para\><<<
<script element="para" >
   <dom name="." xml="." method="para" class="tex4ht.DbUtilities" />
</script> 
>>>


\<static void para(dom)\><<<
public static void para(Node dom) {
   Node pNode = dom.getFirstChild();
   if( pNode.hasChildNodes() ){
      Node child = pNode.getFirstChild();
      if( child != null ){
         if(  (child.getNodeType() == Node.TEXT_NODE)
            &&
              ((Text) child).getWholeText().trim().equals("")  
         ){         
            pNode.removeChild( child );
   }  }  }
   if( pNode.hasChildNodes() ){
      Node child = pNode.getLastChild();
      if( child != null ){
         if(  (child.getNodeType() == Node.TEXT_NODE)
            &&
              ((Text) child).getWholeText().trim().equals("")  
         ){         
            pNode.removeChild( child );
   }  }  }
   if( pNode.hasChildNodes() ){
      Node child = pNode.getFirstChild();
      if(    (child != null) 
          && (child.getNextSibling() == null)
          && (child.getNodeType() == Node.TEXT_NODE)
      ){
         String txt = ((Text) child).getWholeText();      
         String trm = txt.trim();
         if( !trm.equals(txt) ){
            ((Text)child).replaceWholeText(trm);
   }  }  }
}
>>>



%%%%%%%%%%%%%%%%%%
\section{Title Elements}
%%%%%%%%%%%%%%%%%%



%%%%%%%%%%%%%%%%%%
\section{Internal Links}
%%%%%%%%%%%%%%%%%%


 Anchor within the document should use 
 
\begin{center}
  \verb+<link linkend="Ortsflaechen">...</link>+
\end{center}

without the `\verb+#+' character.  
The ulink element is used for URLs.
   
\begin{center}
  \verb+<ulink url="http://...">...</ulink>+
\end{center}
 
\<db links\><<<
<script element="ulink" >
   <set name="ulink" >
      `<open xslt script`>
      `<ulink templates`>
      `<close xslt script`>
   </set>
   <xslt name="." xml="." xsl="ulink" />
</script> 
>>>


\<ulink templates\><<<
<xsl:template match=" ulink[
   @url and starts-with( @url, '#')
]" >
   <link>
      <xsl:attribute name="linkend">
         <xsl:value-of select=" substring( @url, 2 )" />
      </xsl:attribute>
      <xsl:apply-templates select="*|text()|comment()" />
   </link>
</xsl:template> 
>>>

%%%%%%%%%%%%%%%%%%
\section{tabular hor lines}
%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%
\subsection{Outline}
%%%%%%%%%%%%%


\<tabular hor lines\><<<
<script element="tbody" >
   <set name="dirt" >
      `<open xslt script`>
      `<tbody dirt templates`>
      `<close xslt script`>
   </set>
   <set name="tbody" >
      `<open xslt script`>
      `<tbody templates`>
      `<close xslt script`>
   </set>
   <xslt name="." xml="." xsl="tbody" />
   <xslt name="." xml="." xsl="dirt" />
   <dom name="." xml="." method="cline" class="tex4ht.DbUtilities" />
</script> 
>>>






\<static void cline(dom)\><<<
public static void cline(Node dom) {
   Node row, entry, para, nextrow;
   Node node = dom.getFirstChild();
   if( node != null ){
      `<remove empty trailing rows`>
      `<merge cline rows into non-line rows`>
   }
}
>>>


\<remove empty trailing rows\><<<
row = node.getLastChild();
while(     (row != null)
        && ( (entry = row.getLastChild()) != null)
        && ( (para = entry.getFirstChild()) != null)
        && ( para.getNextSibling() == null)
        && ( para.getFirstChild() == null)
){
  node.removeChild(row); 
  row = node.getLastChild();
}
>>>

The merging of rows deal with cases similar to the following one.


\begin{verbatim}
<row> 
  <entry align="left"> 
    <para> 1</para> 
  </entry> 
  <entry align="left" nameend="3" namest="2"> 
    <para>2 to 3</para> 
  </entry> 
</row> 
<row role="cline"> 
  <entry rowsep="0"/> 
  <entry rowsep="1"/> 
  <entry rowsep="1"/> 
</row> 
\end{verbatim}

\<merge cline rows into non-line rows\><<<
row = node.getFirstChild();
while( row != null ){
  if(    (row.getNodeType() == Node.ELEMENT_NODE)
      && ((Element) row).getAttribute("rowsep").equals("") 
      && !((Element) row).getAttribute("role"  ).equals("cline")
      && ((nextrow = row.getNextSibling()) != null)
      && (nextrow.getNodeType() == Node.ELEMENT_NODE)
      && ((Element) nextrow).getAttribute("role"  ).equals("cline")
  ){
    `<boolean compatible = ...`>
    if( compatible ){
       `<row += nextrow`>
       node.removeChild(nextrow); 
    }
  }
  row = row.getNextSibling();
}
>>>

\<boolean compatible = ...\><<<
boolean compatible = true;
Node entry1 = row.getFirstChild();
Node entry2 = nextrow.getFirstChild();
while( true ){
  if( (entry1 == null) || (entry2 == null) ){ break; }
  int range;
  try{
    range =
          Integer.parseInt( ((Element) entry1).getAttribute("nameend") )
          -
          Integer.parseInt( ((Element) entry1).getAttribute("namest") )
          +
          1;
  } catch( Exception e){ range = 1;}
  if( range > 1 ){
    String rowsep = ((Element) entry2).getAttribute("rowsep");
    while( --range > 0 ){
       entry2 = entry2.getNextSibling();
       if( entry2 == null ){
          compatible = false;
          break;
       }
       String value = ((Element) entry2).getAttribute("rowsep");
       if( !value.equals( rowsep ) ){
          compatible = false;
          break;
       }
    }
  }
  if( !compatible ){ break; }
  entry1 = entry1.getNextSibling();
  entry2 = entry2.getNextSibling();
}
>>>

\<row += nextrow\><<<
entry1 = row.getFirstChild();
entry2 = nextrow.getFirstChild();
while( true ){
  if( (entry1 == null) || (entry2 == null) ){ break; }
  int range;
  try{
    range =
          Integer.parseInt( ((Element) entry1).getAttribute("nameend") )
          -
          Integer.parseInt( ((Element) entry1).getAttribute("namest") )
          +
          1;
  } catch( Exception e){ range = 1;}
  ((Element) entry1).setAttribute(
                       "rowsep",
                       ((Element) entry2).getAttribute("rowsep") );
  while( --range > 0 ){
     entry2 = entry2.getNextSibling();
  }
  entry1 = entry1.getNextSibling();
  entry2 = entry2.getNextSibling();
}
>>>



%%%%%%%%%%%%%
\subsection{Dirt Lines}
%%%%%%%%%%%%%

Can they be removed earlier  at the latex pass?


\<tbody dirt templates\><<<
<xsl:template match=" row[ 
  (count(child::entry) = 1)
 and
  ( normalize-space(child::entry[1]/child::para[1]/child::comment())
    = 'dirt'
  )
]">
</xsl:template>
>>>





%%%%%%%%%%%%%
\subsection{hline}
%%%%%%%%%%%%%



\<tbody templates\><<<
<xsl:template match=" row[ @role = 'hline' ]" />
>>>

\<tbody templates\><<<
<xsl:template match=" row[ @role = 'hline' ]" />
<xsl:template match=" row[ 
       following-sibling::*[1][ self::row[@role = 'hline'] ]
] ">
   <xsl:copy>
      <xsl:attribute name="rowsep"> 
         <xsl:text>1</xsl:text>
      </xsl:attribute>
      <xsl:apply-templates select="*|@*|text()|comment()" />
   </xsl:copy>
</xsl:template>
>>>

%%%%%%%%%%%%%
\subsection{cline}
%%%%%%%%%%%%%




\<tbody templates\><<<
<xsl:template match=" row[ 
     (@role = 'cline')
     and
     preceding-sibling::*[1]
                         [ self::row[ not(@role) ] ]
     and
     (   count(child::entry) 
       = count(preceding-sibling::*[1]/child::entry))
]" />
<xsl:template match=" row[ 
       not(@role)
   and
       following-sibling::*[1][ self::row[@role = 'cline'] ]
   and
     (   count(child::entry) 
       = count(following-sibling::*[1]/child::entry))
] ">
   <xsl:copy>
      <xsl:apply-templates select="@*" />
      <xsl:apply-templates select="*|text()|comment()" mode="cline" />
   </xsl:copy>
</xsl:template>
>>>

\<tbody templates\><<<
<xsl:template match=" text()|comment() " mode="cline">
   <xsl:copy>
      <xsl:apply-templates select="*|@*|text()|comment()"  />
   </xsl:copy>
</xsl:template>
>>>




\<tbody templates\><<<
<xsl:template match="*" mode="cline">
   <xsl:copy>
      <xsl:if test="self::entry">
         <xsl:attribute name="rowsep"> 
             <xsl:variable name="pos">
                <xsl:value-of select="position()" /> 
             </xsl:variable>
             <xsl:value-of select="parent::row
                                   / following-sibling::*[1]
                                   / child::entry[position()=$pos]
                                   / @rowsep
                                    " />
          </xsl:attribute>
      </xsl:if>
      <xsl:apply-templates select="*|@*|text()|comment()"  />
   </xsl:copy>
</xsl:template>
>>>









%%%%%%%%%%%%%%%%%%
\section{Shared}
%%%%%%%%%%%%%%%%%%



\<open xslt script\><<<
<![CDATA[ 
   <xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:db="http://docbook.org/ns/docbook"
   >
      <xsl:output omit-xml-declaration = "yes" />
>>>

\<close xslt script\><<<
      <xsl:template match="*|@*|text()|comment()" >
        <xsl:copy>
          <xsl:apply-templates select="*|@*|text()|comment()" />
        </xsl:copy>
      </xsl:template>
   </xsl:stylesheet> 
]]>
>>>


\<get content template\><<<
<xsl:template match="*" mode="content" >
  <xsl:choose>
     <xsl:when test=" @class = 'char' " >   
       <xsl:text>x</xsl:text>
     </xsl:when>
     <xsl:when test=" not( 
            (@title = 'speech-extra') or (@class = 'accent-char')
         ) " >
       <xsl:apply-templates select="*|text()" mode="content" />
     </xsl:when>
  </xsl:choose>
</xsl:template> 
>>>





%%%%%%%%%%%%%%%%%%
\section{Copyright}
%%%%%%%%%%%%%%%%%%

\let\newfilename=\relax

\<copy right\><<< 
/**********************************************************/ >>>



\<cont copy right\><<< 
/*                                                        */
/* This work may be distributed and/or modified under the */
/* conditions of the LaTeX Project Public License, either */
/* version 1.3 of this license or (at your option) any    */
/* later version. The latest version of this license is   */
/* in                                                     */
/*   http://www.latex-project.org/lppl.txt                */
/* and version 1.3 or later is part of all distributions  */
/* of LaTeX version 2003/12/01 or later.                  */
/*                                                        */
/* This work has the LPPL maintenance status "maintained".*/
/*                                                        */
/* The Current Maintainer of this work                    */
/* is the TeX4ht Project <http://tug.org/tex4ht>.         */
>>>

\ifdojava
\AtEndDocument{\Needs{%
    "pushd \XTPIPES || exit 1
     ;  
     jar cf tex4ht.jar *
     ;
     popd
     ;
     mv \XTPIPES tex4ht.jar \TEXMFTEXivBIN
     ;
     cp \XTPIPES xtpipes/lib/* 
        \TEXMFTEXivXTPIPES
"}}
\fi

%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\end{document}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%

