Dependency-based Pipeline

<p:library xmlns:p="http://www.w3.org/ns/xproc"
	   xmlns:c="http://www.w3.org/ns/xproc-step"
	   xmlns:cx="http://xmlcalabash.com/ns/extensions"
	   xmlns:xs="http://www.w3.org/2001/XMLSchema"
	   xmlns:pl="http://www.w3.org/XML/XProc/docs/library">

<p:import href="http://xmlcalabash.com/extension/steps/library-1.0.xpl"/>
<p:import href="/home/ndw/xmlcalabash.com/library/depends.xpl"/>

<p:pipeinfo xml:id="langspec">
  <cx:depends>
    <cx:target>langspec.html</cx:target>
    <cx:source>langspec.xml</cx:source>
    <cx:source>parallel.xml</cx:source>
    <cx:source>schemas/xproc.rnc</cx:source>
    <cx:source>schemas/xproc.rng</cx:source>
    <cx:source>standard-components.xml</cx:source>
    <cx:source>references.xml</cx:source>
    <cx:source>error-vocabulary.xml</cx:source>
    <cx:source>conformance.xml</cx:source>
    <cx:source>namespace-fixup.xml</cx:source>
    <cx:source>language-summary.xml</cx:source>
    <cx:source>error-codes.xml</cx:source>
    <cx:source>../style/docbook.xsl</cx:source>
    <cx:source>../style/dbspec.xsl</cx:source>
    <cx:source>../style/xprocns.xsl</cx:source>
    <cx:source>../style/rngsyntax.xsl</cx:source>
  </cx:depends>
</p:pipeinfo>

<p:declare-step name="main" type="pl:main-spec">
  <p:input port="parameters" kind="parameter"/>

  <cx:out-of-date>
    <p:input port="source" select="id('langspec')/cx:depends">
      <p:document href="#"/>
    </p:input>
  </cx:out-of-date>

  <p:choose>
    <p:when test="/c:result = 'true'">
      <pl:format-spec name="fmat">
	<p:input port="source">
	  <p:document href="langspec.xml"/>
	</p:input>
      </pl:format-spec>
      <pl:tidy href="langspec.html"/>
      <pl:ancillary-files>
	<p:input port="source">
	  <p:pipe step="fmat" port="xincluded"/>
	</p:input>
      </pl:ancillary-files>
    </p:when>
    <p:otherwise>
      <cx:message message="langspec.html is up-to-date."/>
      <p:sink/>
    </p:otherwise>
  </p:choose>

  <pl:main-ns/>
</p:declare-step>

<p:declare-step name="main" type="pl:format-spec">
  <p:input port="source"/>
  <p:input port="parameters" kind="parameter"/>

  <p:output port="result" primary="true"/>
  <p:output port="xincluded">
    <p:pipe step="xinclude" port="result"/>
  </p:output>

  <p:sink/>
  
  <p:xslt name="make-glossary">
    <p:input port="source">
      <p:pipe step="main" port="source"/>
    </p:input>
    <p:input port="stylesheet">
      <p:document href="../style/makeglossary.xsl"/>
    </p:input>
  </p:xslt>
  <p:store href="glossary.xml"/>

  <p:xinclude name="xinclude" cx:depends-on="make-glossary">
    <p:input port="source">
      <p:pipe step="main" port="source"/>
    </p:input>
    <p:log port="result" href="/tmp/out.xml"/>
  </p:xinclude>

  <p:validate-with-relax-ng>
    <p:input port="schema">
      <p:document href="../schema/dbspec.rng"/>
    </p:input>
  </p:validate-with-relax-ng>

  <p:xslt name="style">
    <p:input port="stylesheet">
      <p:document href="../style/dbspec.xsl"/>
    </p:input>
  </p:xslt>
</p:declare-step>

<p:declare-step name="main" type="pl:main-req">
  <p:input port="parameters" kind="parameter"/>
  <p:option name="document" select="'langreq.xml'"/>
  <p:option name="href" select="'langreq.html'"/>

  <p:load dtd-validate="true">
    <p:with-option name="href" select="$document">
      <p:empty/>
    </p:with-option>
  </p:load>
  <pl:format-req/>
  <pl:tidy>
    <p:with-option name="href" select="$href"/>
  </pl:tidy>
</p:declare-step>

<p:declare-step name="main" type="pl:format-req">
  <p:input port="source"/>
  <p:input port="parameters" kind="parameter"/>
  <p:output port="result"/>

  <p:xslt name="style">
    <p:input port="stylesheet">
      <p:document href="../style/langreq.xsl"/>
    </p:input>
  </p:xslt>
</p:declare-step>

<p:pipeinfo xml:id="ns-xproc">
  <cx:depends>
    <cx:target>ns-xproc.html</cx:target>
    <cx:source>ns-xproc.xml</cx:source>
    <cx:source>../style/docbook.xsl</cx:source>
    <cx:source>../style/dbspec.xsl</cx:source>
    <cx:source>../style/xprocns.xsl</cx:source>
    <cx:source>../style/elemsyntax.xsl</cx:source>
  </cx:depends>
</p:pipeinfo>

<p:pipeinfo xml:id="ns-xproc-step">
  <cx:depends>
    <cx:target>ns-xproc-step.html</cx:target>
    <cx:source>ns-xproc-step.xml</cx:source>
    <cx:source>../style/docbook.xsl</cx:source>
    <cx:source>../style/dbspec.xsl</cx:source>
    <cx:source>../style/xprocns.xsl</cx:source>
    <cx:source>../style/elemsyntax.xsl</cx:source>
  </cx:depends>
</p:pipeinfo>

<p:pipeinfo xml:id="ns-xproc-error">
  <cx:depends>
    <cx:target>ns-xproc-error.html</cx:target>
    <cx:source>ns-xproc-error.xml</cx:source>
    <cx:source>../style/docbook.xsl</cx:source>
    <cx:source>../style/dbspec.xsl</cx:source>
    <cx:source>../style/xprocns.xsl</cx:source>
    <cx:source>../style/elemsyntax.xsl</cx:source>
  </cx:depends>
</p:pipeinfo>

<p:declare-step name="main" type="pl:main-ns">
  <p:input port="parameters" kind="parameter"/>

  <cx:out-of-date>
    <p:input port="source" select="id('ns-xproc')/cx:depends">
      <p:document href="#"/>
    </p:input>
  </cx:out-of-date>

  <p:choose>
    <p:when test="/c:result = 'true'">
      <pl:format-ns>
	<p:input port="source">
	  <p:document href="ns-xproc.xml"/>
	</p:input>
      </pl:format-ns>
      <pl:tidy href="ns-xproc-step.html"/>
    </p:when>
    <p:otherwise>
      <cx:message message="ns-xproc.html is up-to-date."/>
      <p:sink/>
    </p:otherwise>
  </p:choose>

  <cx:out-of-date>
    <p:input port="source" select="id('ns-xproc-step')/cx:depends">
      <p:document href="#"/>
    </p:input>
  </cx:out-of-date>

  <p:choose>
    <p:when test="/c:result = 'true'">
      <pl:format-ns>
	<p:input port="source">
	  <p:document href="ns-xproc-step.xml"/>
	</p:input>
      </pl:format-ns>
      <pl:tidy href="ns-xproc-step.html"/>
    </p:when>
    <p:otherwise>
      <cx:message message="ns-xproc-step.html is up-to-date."/>
      <p:sink/>
    </p:otherwise>
  </p:choose>

  <cx:out-of-date>
    <p:input port="source" select="id('ns-xproc-error')/cx:depends">
      <p:document href="#"/>
    </p:input>
  </cx:out-of-date>

  <p:choose>
    <p:when test="/c:result = 'true'">
      <pl:format-ns>
	<p:input port="source">
	  <p:document href="ns-xproc-error.xml"/>
	</p:input>
      </pl:format-ns>
      <pl:tidy href="ns-xproc-error.html"/>
    </p:when>
    <p:otherwise>
      <cx:message message="ns-xproc-error.html is up-to-date."/>
      <p:sink/>
    </p:otherwise>
  </p:choose>
</p:declare-step>

<p:declare-step name="main" type="pl:format-ns">
  <p:input port="source"/>
  <p:input port="parameters" kind="parameter"/>
  <p:output port="result"/>

  <p:xinclude/>

  <p:validate-with-relax-ng>
    <p:input port="schema">
      <p:document href="../schema/dbspec.rng"/>
    </p:input>
  </p:validate-with-relax-ng>

  <p:xslt name="style">
    <p:input port="stylesheet">
      <p:document href="../style/dbspec.xsl"/>
    </p:input>
  </p:xslt>
</p:declare-step>

<p:declare-step type="pl:tidy">
  <p:input port="source"/>
  <p:option name="href" required="true"/>

  <p:store name="store">
    <p:with-option name="href" select="$href"/>
  </p:store>

  <p:exec name="exec" result-is-xml="false" source-is-xml="false"
	  command="/Users/ndw/bin/tidy" args="langspec.html"
	  cx:depends-on="store">
    <p:input port="source"><p:empty/></p:input>
  </p:exec>

  <p:sink/>
</p:declare-step>

<p:declare-step name="main" type="pl:ancillary-files">
  <p:input port="source"/>
  <p:input port="parameters" kind="parameter"/>

  <p:xslt>
    <p:input port="source">
      <p:pipe step="main" port="source"/>
    </p:input>
    <p:input port="stylesheet">
      <p:document href="../style/pipeline-library.xsl"/>
    </p:input>
  </p:xslt>
  <p:store href="pipeline-library.xml"/>

  <p:xslt>
    <p:input port="source">
      <p:pipe step="main" port="source"/>
    </p:input>
    <p:input port="stylesheet">
      <p:document href="../style/typed-pipeline-library.xsl"/>
    </p:input>
  </p:xslt>
  <p:store href="typed-pipeline-library.xml"/>

  <p:xslt>
    <p:input port="source">
      <p:pipe step="main" port="source"/>
    </p:input>
    <p:input port="stylesheet">
      <p:document href="../style/error-list.xsl"/>
    </p:input>
  </p:xslt>
  <p:store href="error-list.xml"/>
</p:declare-step>

<p:declare-step name="main" type="pl:main-diff">
  <p:option name="previous" required="true"/>
  <p:option name="current" select="'langspec.html'"/>
  <p:option name="href" select="'diff.html'"/>

  <pl:diff>
    <p:with-option name="previous" select="$previous">
      <p:empty/>
    </p:with-option>
    <p:with-option name="current" select="$current">
      <p:empty/>
    </p:with-option>
  </pl:diff>

  <p:store>
    <p:with-option name="href" select="$href"/>
  </p:store>
</p:declare-step>

<p:declare-step name="main" type="pl:diff">
  <p:option name="previous" required="true"/>
  <p:option name="current" required="true"/>
  <p:output port="result"/>

  <p:load name="previous">
    <p:with-option name="href" select="$previous">
      <p:empty/>
    </p:with-option>
  </p:load>

  <p:load name="current">
    <p:with-option name="href" select="$current">
      <p:empty/>
    </p:with-option>
  </p:load>

  <cx:delta-xml>
    <p:input port="source">
      <p:pipe step="previous" port="result"/>
    </p:input>
    <p:input port="alternate">
      <p:pipe step="current" port="result"/>
    </p:input>
    <p:input port="dxp">
      <p:document href="/usr/local/DeltaXMLCore-5_1/samples/dxp/compare-xhtml.dxp"/>
    </p:input>
  </cx:delta-xml>
</p:declare-step>

</p:library>