diff --git a/src/main/java/info/textgrid/services/aggregator/REST.java b/src/main/java/info/textgrid/services/aggregator/REST.java index fa504a17d56b3f504a35eb933c1416e9855c2f88..1c63f26d5c95eadb2d99c178f70034ab2c781494 100644 --- a/src/main/java/info/textgrid/services/aggregator/REST.java +++ b/src/main/java/info/textgrid/services/aggregator/REST.java @@ -130,6 +130,7 @@ public Response getHTML( @Description("The requested content type. E.g., text/html or text/xml") @QueryParam("mediatype") final String mediaType, @Description("An XML ID. If given, only this element will be transformed.") @QueryParam("id") final String id, @Description("If true, a full webpage that looks similar to textgridrep.de's browse view will be returned") @QueryParam("simulate") @DefaultValue("false") final boolean simulate, + @Description("If given, generate a table of contents instead of a full HTML document") @QueryParam("toc") final String toc, @Context final Request request) throws ObjectNotFoundFault, MetadataParseFault, IoFault, AuthFault, ProtocolNotImplementedFault, WebApplicationException, IOException, @@ -140,6 +141,7 @@ public Response getHTML( embedded, css, sid, mediaType, id, request); writer.simulate(simulate); writer.linkUrlPattern(linkURLPattern); + writer.toc(toc); return writer.createResponse().build(); } diff --git a/src/main/java/info/textgrid/services/aggregator/html/HTMLWriter.java b/src/main/java/info/textgrid/services/aggregator/html/HTMLWriter.java index 1dcded91dc27c64b254cefa5693e9c94f57c6944..72bab69dbf344edfcbd5bf8610e773eb8937f9e7 100644 --- a/src/main/java/info/textgrid/services/aggregator/html/HTMLWriter.java +++ b/src/main/java/info/textgrid/services/aggregator/html/HTMLWriter.java @@ -99,6 +99,7 @@ public class HTMLWriter extends CorpusBasedExporter implements StreamingOutput { private final StylesheetManager stylesheetManager; private Optional<String> id = Optional.absent(); private Optional<String> linkUrlPattern = Optional.absent(); + private Optional<String> toc = Optional.absent(); private static final Logger logger = Logger.getLogger(HTMLWriter.class.getCanonicalName()); @@ -240,6 +241,9 @@ public XsltTransformer getTransformer() throws SaxonApiException, IOException { if (id.isPresent()) transformer.setParameter(new QName("ID"), new XdmAtomicValue(id.get())); + + if (toc.isPresent()) + transformer.setParameter(new QName("onlyTOC"), new XdmAtomicValue(toc.get())); transformer.setSource(source); @@ -312,4 +316,9 @@ public ResponseBuilder createResponse() throws ObjectNotFoundFault, MetadataPars } return super.createResponse(); } + + public HTMLWriter toc(final String toc) { + this.toc = Optional.fromNullable(toc); + return this; + } } \ No newline at end of file diff --git a/src/main/webapp/stylesheets/tohtml.xsl b/src/main/webapp/stylesheets/tohtml.xsl index 28b70ad1b92e3ccebe091299da18dd7ddaa77cb2..751c85fafdedd37c30b92c78109ddccbd22c82a0 100644 --- a/src/main/webapp/stylesheets/tohtml.xsl +++ b/src/main/webapp/stylesheets/tohtml.xsl @@ -63,6 +63,7 @@ <xsl:param name="autoHead">false</xsl:param> <xsl:param name="showTitleAuthor">false</xsl:param> <xsl:param name="cssFile"/> + <xsl:param name="onlyTOC"/> <xsl:output method="xhtml"/> @@ -78,7 +79,57 @@ <xsl:template name="stdheader"> <xsl:param name="title">(no title)</xsl:param> </xsl:template> - + + <xsl:template match="/"> + <xsl:choose> + <xsl:when test="$onlyTOC"> + <xsl:message>Tunelling ...</xsl:message> + <ul class="toc"> + <xsl:apply-templates mode="toc"> + <xsl:with-param name="currentDepth" tunnel="yes" select="0"/> + </xsl:apply-templates> + </ul> + </xsl:when> + <xsl:otherwise> + <xsl:next-match/> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <xsl:template mode="toc" match="node()"> + <xsl:apply-templates mode="#current"/> + </xsl:template> + <xsl:template mode="toc" match="div[head][@xml:id]"> + <xsl:param name="currentDepth" tunnel="yes"/> + <li> + <a href="#{@xml:id}"> + <xsl:apply-templates select="head[1]/node()"/> + </a> + <xsl:if test="$currentDepth lt $tocDepth and (descendant::div[head] or descendant::TEI)"> + <ul> + <xsl:apply-templates> + <xsl:with-param name="currentDepth" tunnel="yes" select="$currentDepth + 1"/> + </xsl:apply-templates> + </ul> + </xsl:if> + </li> + </xsl:template> + + <xsl:template mode="toc" match="TEI[parent::teiCorpus][@xml:id]|teiCorpus[parent::teiCorpus][@xml:id]"> + <xsl:param name="currentDepth" as="xs:integer" tunnel="yes"></xsl:param> + <li> + <a href="#{@xml:id}"> + <xsl:call-template name="generateTitle"/> + </a> + <xsl:if test="$currentDepth < $tocDepth and (descendant::div[head] or descendant::TEI)"> + <ul> + <xsl:apply-templates mode="#current"> + <xsl:with-param name="currentDepth" tunnel="yes" select="$currentDepth + 1"/> + </xsl:apply-templates> + </ul> + </xsl:if> + </li> + </xsl:template> <xsl:template name="generateTitle"> <xsl:variable name="result"> diff --git a/transformations.xpr b/transformations.xpr index 238851f762c8b59db6b9d3234b1597c982cf9773..6310322fb87491b12779c578bd5c69511a81ad62 100644 --- a/transformations.xpr +++ b/transformations.xpr @@ -18,16 +18,14 @@ </field> <field name="scenarioIds"> <list> - <String>db2xhtml</String> - <String>db2xhtml-soll-haben</String> - <String>db2xhtml fragment</String> + <String>toc</String> + <String>notoc</String> </list> </field> <field name="scenarioTypes"> <list> <String>XML</String> <String>XML</String> - <String>XML</String> </list> </field> </scenarioAssociation> @@ -345,6 +343,111 @@ <String-array/> </field> </scenario> + <scenario> + <field name="advancedOptionsMap"> + <null/> + </field> + <field name="name"> + <String>db2xhtml fragment</String> + </field> + <field name="baseURL"> + <String></String> + </field> + <field name="footerURL"> + <String></String> + </field> + <field name="fOPMethod"> + <String>pdf</String> + </field> + <field name="fOProcessorName"> + <String>Apache FOP</String> + </field> + <field name="headerURL"> + <String></String> + </field> + <field name="inputXSLURL"> + <String>${currentFileURL}</String> + </field> + <field name="inputXMLURL"> + <String>${pdu}/src/test/resources/enztest.xml</String> + </field> + <field name="defaultScenario"> + <Boolean>false</Boolean> + </field> + <field name="isFOPPerforming"> + <Boolean>false</Boolean> + </field> + <field name="type"> + <String>XML</String> + </field> + <field name="saveAs"> + <Boolean>true</Boolean> + </field> + <field name="openInBrowser"> + <Boolean>false</Boolean> + </field> + <field name="outputFile"> + <null/> + </field> + <field name="openOtherLocationInBrowser"> + <Boolean>false</Boolean> + </field> + <field name="locationToOpenInBrowserURL"> + <null/> + </field> + <field name="openInEditor"> + <Boolean>true</Boolean> + </field> + <field name="showInHTMLPane"> + <Boolean>false</Boolean> + </field> + <field name="showInXMLPane"> + <Boolean>false</Boolean> + </field> + <field name="showInSVGPane"> + <Boolean>false</Boolean> + </field> + <field name="showInResultSetPane"> + <Boolean>false</Boolean> + </field> + <field name="useXSLTInput"> + <Boolean>true</Boolean> + </field> + <field name="xsltParams"> + <list> + <transformationParameter> + <field name="paramDescription"> + <paramDescriptor> + <field name="localName"> + <String>ID</String> + </field> + <field name="prefix"> + <null/> + </field> + <field name="namespace"> + <null/> + </field> + </paramDescriptor> + </field> + <field name="value"> + <String>ler-19122-d1e641</String> + </field> + <field name="hasXPathValue"> + <Boolean>false</Boolean> + </field> + </transformationParameter> + </list> + </field> + <field name="cascadingStylesheets"> + <String-array/> + </field> + <field name="xslTransformer"> + <String>Saxon-PE</String> + </field> + <field name="extensionURLs"> + <String-array/> + </field> + </scenario> <scenario> <field name="advancedOptionsMap"> <null/> @@ -682,7 +785,7 @@ <null/> </field> <field name="name"> - <String>db2xhtml fragment</String> + <String>toc</String> </field> <field name="baseURL"> <String></String> @@ -703,7 +806,7 @@ <String>${currentFileURL}</String> </field> <field name="inputXMLURL"> - <String>${pdu}/src/test/resources/enztest.xml</String> + <String>${pdu}/src/test/resources/gedichte-anakreons-corpus.xml</String> </field> <field name="defaultScenario"> <Boolean>false</Boolean> @@ -733,7 +836,7 @@ <Boolean>true</Boolean> </field> <field name="showInHTMLPane"> - <Boolean>false</Boolean> + <Boolean>true</Boolean> </field> <field name="showInXMLPane"> <Boolean>false</Boolean> @@ -753,7 +856,7 @@ <field name="paramDescription"> <paramDescriptor> <field name="localName"> - <String>ID</String> + <String>onlyTOC</String> </field> <field name="prefix"> <null/> @@ -764,7 +867,7 @@ </paramDescriptor> </field> <field name="value"> - <String>ler-19122-d1e641</String> + <String>true</String> </field> <field name="hasXPathValue"> <Boolean>false</Boolean> @@ -782,6 +885,89 @@ <String-array/> </field> </scenario> + <scenario> + <field name="advancedOptionsMap"> + <null/> + </field> + <field name="name"> + <String>notoc</String> + </field> + <field name="baseURL"> + <String></String> + </field> + <field name="footerURL"> + <String></String> + </field> + <field name="fOPMethod"> + <String>pdf</String> + </field> + <field name="fOProcessorName"> + <String>Apache FOP</String> + </field> + <field name="headerURL"> + <String></String> + </field> + <field name="inputXSLURL"> + <String>${currentFileURL}</String> + </field> + <field name="inputXMLURL"> + <String>${pdu}/src/test/resources/gedichte-anakreons-corpus.xml</String> + </field> + <field name="defaultScenario"> + <Boolean>false</Boolean> + </field> + <field name="isFOPPerforming"> + <Boolean>false</Boolean> + </field> + <field name="type"> + <String>XML</String> + </field> + <field name="saveAs"> + <Boolean>true</Boolean> + </field> + <field name="openInBrowser"> + <Boolean>false</Boolean> + </field> + <field name="outputFile"> + <null/> + </field> + <field name="openOtherLocationInBrowser"> + <Boolean>false</Boolean> + </field> + <field name="locationToOpenInBrowserURL"> + <null/> + </field> + <field name="openInEditor"> + <Boolean>true</Boolean> + </field> + <field name="showInHTMLPane"> + <Boolean>true</Boolean> + </field> + <field name="showInXMLPane"> + <Boolean>false</Boolean> + </field> + <field name="showInSVGPane"> + <Boolean>false</Boolean> + </field> + <field name="showInResultSetPane"> + <Boolean>false</Boolean> + </field> + <field name="useXSLTInput"> + <Boolean>true</Boolean> + </field> + <field name="xsltParams"> + <list/> + </field> + <field name="cascadingStylesheets"> + <String-array/> + </field> + <field name="xslTransformer"> + <String>Saxon-PE</String> + </field> + <field name="extensionURLs"> + <String-array/> + </field> + </scenario> </scenario-array> </entry> </serializableOrderedMap> @@ -802,4 +988,4 @@ <file name="src/main/webapp/stylesheets/extractbody.xsl"/> <file name="src/main/webapp/stylesheets/frame.xsl"/> </projectTree> -</project> +</project> \ No newline at end of file