[yelp-xsl] Initial work on Mallard stacks



commit b34a615ff6c04c638805d73de26ecf195852bbd8
Author: Shaun McCance <shaunm redhat com>
Date:   Sat Oct 20 11:01:31 2018 -0400

    Initial work on Mallard stacks

 xslt/mallard/cache/mal-cache.xsl     | 24 +++++++++-
 xslt/mallard/html/mal2html-links.xsl | 90 ++++++++++++++++++++++++++++++++----
 xslt/mallard/html/mal2html-page.xsl  | 12 +++--
 3 files changed, 113 insertions(+), 13 deletions(-)
---
diff --git a/xslt/mallard/cache/mal-cache.xsl b/xslt/mallard/cache/mal-cache.xsl
index 3439f705..6305e0b9 100644
--- a/xslt/mallard/cache/mal-cache.xsl
+++ b/xslt/mallard/cache/mal-cache.xsl
@@ -56,8 +56,20 @@ mal.cache.info
   <xsl:param name="node_in"/>
   <info>
     <xsl:for-each select="$info/*">
-      <xsl:copy-of select="."/>
+      <xsl:choose>
+        <xsl:when test="$node/parent::mal:stack[@type = 'series'] and
+                        self::mal:link[@type = 'next']"/>
+        <xsl:otherwise>
+          <xsl:copy-of select="."/>
+        </xsl:otherwise>
+      </xsl:choose>
     </xsl:for-each>
+    <xsl:if test="$node/parent::mal:stack[@type = 'series']">
+      <xsl:variable name="next" select="$node/following-sibling::mal:page[1]"/>
+      <xsl:if test="$next">
+        <link type="next" xref="{$next/@id}"/>
+      </xsl:if>
+    </xsl:if>
   </info>
 </xsl:template>
 
@@ -67,7 +79,7 @@ mal.cache.info
 <!-- = /cache:cache = -->
 <xsl:template match='/cache:cache'>
   <cache:cache>
-    <xsl:for-each select="mal:page">
+    <xsl:for-each select="mal:page | mal:stack">
       <xsl:apply-templates select="document(@cache:href)/*">
         <xsl:with-param name="node_in" select="."/>
       </xsl:apply-templates>
@@ -75,6 +87,14 @@ mal.cache.info
   </cache:cache>
 </xsl:template>
 
+<!-- = mal:stack = -->
+<xsl:template match="mal:stack">
+  <xsl:param name="node_in"/>
+  <xsl:apply-templates select="mal:page">
+    <xsl:with-param name="node_in" select="$node_in"/>
+  </xsl:apply-templates>
+</xsl:template>
+
 <!-- = mal:page = -->
 <xsl:template match="mal:page">
   <xsl:param name="node_in"/>
diff --git a/xslt/mallard/html/mal2html-links.xsl b/xslt/mallard/html/mal2html-links.xsl
index 09b23e5f..7b63b4db 100644
--- a/xslt/mallard/html/mal2html-links.xsl
+++ b/xslt/mallard/html/mal2html-links.xsl
@@ -422,7 +422,7 @@ the links itself. They must be passed in with the $links parameter.
 <!--**==========================================================================
 mal2html.links.prevnext
 Output links to the previous and next pages.
-@revision[version=1.0 date=2011-06-15 status=final]
+@revision[version=3.32 date=2018-10-20 status=final]
 
 [xsl:params]
 $node: A `links` or `page` element to link from.
@@ -432,6 +432,11 @@ if they exist. The block containing the links is end-floated by default. The
 links use the text "Previous" and "Next", although the actual page titles are
 used for tooltips.
 
+If $node is part of a series-type stack, this template uses the previous and
+next pages in the stack. Otherwise, the previous page is a page with a next-type
+link to $node, and the next page is whatever is pointed to by the next-type link
+in $node.
+
 If the `links` element has the style hint `top`, it will be inserted before
 the page title, instead of in its position on the page. This is handled by the
 calling functions in {mal2html-page}.
@@ -445,9 +450,11 @@ calling functions in {mal2html-page}.
     </xsl:call-template>
   </xsl:variable>
   <xsl:variable name="next" select="$page/mal:info/mal:link[@type='next']"/>
+  <xsl:variable name="stacknext"
+                select="$page[parent::mal:stack[@type='series']]/following-sibling::mal:page[1]"/>
   <xsl:for-each select="$mal.cache">
     <xsl:variable name="prev" select="key('mal.cache.link.key', concat('next:', $linkid))"/>
-    <xsl:if test="$prev or $next">
+    <xsl:if test="$prev or $next or $stacknext">
       <nav class="prevnext pagewide"><div class="inner">
         <xsl:if test="$prev">
           <a>
@@ -471,6 +478,27 @@ calling functions in {mal2html-page}.
           </a>
         </xsl:if>
         <xsl:choose>
+        <xsl:when test="$stacknext">
+          <a>
+            <xsl:attribute name="href">
+              <xsl:call-template name="mal.link.target">
+                <xsl:with-param name="node" select="$stacknext"/>
+                <xsl:with-param name="xref" select="$stacknext/@id"/>
+              </xsl:call-template>
+            </xsl:attribute>
+            <xsl:attribute name="title">
+              <xsl:call-template name="mal.link.tooltip">
+                <xsl:with-param name="node" select="$stacknext"/>
+                <xsl:with-param name="xref" select="$stacknext/@id"/>
+              </xsl:call-template>
+            </xsl:attribute>
+            <xsl:for-each select="$page">
+              <xsl:call-template name="l10n.gettext">
+                <xsl:with-param name="msgid" select="'Next'"/>
+              </xsl:call-template>
+            </xsl:for-each>
+          </a>
+        </xsl:when>
         <xsl:when test="$next">
           <a>
             <xsl:attribute name="href">
@@ -660,6 +688,8 @@ This template calls {mal2html.links.series.prev} and
   <xsl:param name="node" select="."/>
   <xsl:variable name="page" select="$node/ancestor-or-self::mal:page[last()]"/>
   <xsl:variable name="title" select="$node/self::mal:links/mal:title"/>
+  <xsl:variable name="stitle"
+                select="$node/ancestor::mal:stack/mal:info/mal:title[@type='series']"/>
   <xsl:variable name="style" select="concat(' ', $node/@style, ' ')"/>
   <xsl:variable name="role" select="$node/self::mal:links/@role"/>
   <div>
@@ -681,15 +711,22 @@ This template calls {mal2html.links.series.prev} and
       </xsl:choose>
       <xsl:call-template name="mal2html.ui.expander.class">
         <xsl:with-param name="node" select="$node"/>
-        <xsl:with-param name="hastitle" select="count($title) > 0"/>
+        <xsl:with-param name="hastitle" select="count($title) + count($stitle) > 0"/>
       </xsl:call-template>
     </xsl:attribute>
     <xsl:call-template name="mal2html.ui.expander.data">
       <xsl:with-param name="node" select="$node"/>
-      <xsl:with-param name="hastitle" select="count($title) > 0"/>
+      <xsl:with-param name="hastitle" select="count($title) + count($stitle) > 0"/>
     </xsl:call-template>
     <div class="inner">
-      <xsl:apply-templates mode="mal2html.block.mode" select="$title"/>
+      <xsl:choose>
+        <xsl:when test="count($title) > 0">
+          <xsl:apply-templates mode="mal2html.block.mode" select="$title[1]"/>
+        </xsl:when>
+        <xsl:when test="count($stitle) > 0">
+          <xsl:apply-templates mode="mal2html.block.mode" select="$stitle[1]"/>
+        </xsl:when>
+      </xsl:choose>
       <div class="region">
         <ul>
           <xsl:call-template name="mal2html.links.series.prev">
@@ -774,7 +811,7 @@ to it.
 <!--**==========================================================================
 mal2html.links.series.next
 Output following links to pages in a series.
-@revision[version=1.0 date=2011-06-15 status=final]
+@revision[version=3.32 date=2018-10-20 status=final]
 
 [xsl:params]
 $node: The current `page` element.
@@ -784,6 +821,9 @@ This template is called by {mal2html.links.series} to output the pages after
 the starting page in the series. This template finds the next page for the page
 $node. It outputs a link to that page, then calls itself recursively on that
 page.
+
+If $node is part of a series-type stack, this template uses the next page in
+the stack. Otherwise, it looks for a next-type link in $node.
 -->
 <xsl:template name="mal2html.links.series.next">
   <xsl:param name="node" select="."/>
@@ -795,7 +835,40 @@ page.
     </xsl:call-template>
   </xsl:variable>
   <xsl:variable name="next" select="$node/mal:info/mal:link[@type='next']"/>
-  <xsl:if test="$next">
+  <xsl:variable name="stacknext"
+                select="$node[parent::mal:stack[@type='series']]/following-sibling::mal:page[1]"/>
+  <xsl:choose>
+  <xsl:when test="$stacknext">
+    <xsl:for-each select="$mal.cache">
+      <li class="links">
+        <a>
+          <xsl:attribute name="href">
+            <xsl:call-template name="mal.link.target">
+              <xsl:with-param name="node" select="$stacknext"/>
+              <xsl:with-param name="xref" select="$stacknext/@id"/>
+            </xsl:call-template>
+          </xsl:attribute>
+          <xsl:attribute name="title">
+            <xsl:call-template name="mal.link.tooltip">
+              <xsl:with-param name="node" select="$stacknext"/>
+              <xsl:with-param name="xref" select="$stacknext/@id"/>
+              <xsl:with-param name="role" select="concat($role, ' series')"/>
+            </xsl:call-template>
+          </xsl:attribute>
+          <xsl:call-template name="mal.link.content">
+            <xsl:with-param name="node" select="$stacknext"/>
+            <xsl:with-param name="xref" select="$stacknext/@id"/>
+            <xsl:with-param name="role" select="concat($role, ' series')"/>
+          </xsl:call-template>
+        </a>
+      </li>
+      <xsl:call-template name="mal2html.links.series.next">
+        <xsl:with-param name="node" select="key('mal.cache.key', $stacknext/@id)"/>
+        <xsl:with-param name="links" select="$links"/>
+      </xsl:call-template>
+    </xsl:for-each>
+  </xsl:when>
+  <xsl:when test="$next">
     <xsl:for-each select="$mal.cache">
       <li class="links">
         <a>
@@ -824,7 +897,8 @@ page.
         <xsl:with-param name="links" select="$links"/>
       </xsl:call-template>
     </xsl:for-each>
-  </xsl:if>
+  </xsl:when>
+  </xsl:choose>
 </xsl:template>
 
 
diff --git a/xslt/mallard/html/mal2html-page.xsl b/xslt/mallard/html/mal2html-page.xsl
index f2ce208e..f673d1f3 100644
--- a/xslt/mallard/html/mal2html-page.xsl
+++ b/xslt/mallard/html/mal2html-page.xsl
@@ -35,6 +35,11 @@ This stylesheet contains templates to process Mallard `page` and `section`
 elements, including implementations of the interfaces provided by the common
 {html} stylesheet.
 -->
+<xsl:template match="/">
+  <xsl:for-each select="mal:page | mal:stack/mal:page">
+    <xsl:call-template name="html.output"/>
+  </xsl:for-each>
+</xsl:template>
 
 
 <!--@@==========================================================================
@@ -63,7 +68,8 @@ the `page` element. Information is extracted from the `info` element of $node.
 -->
 <xsl:template name="mal2html.page.about">
   <xsl:param name="node" select="."/>
-  <xsl:if test="$node/mal:info/mal:credit or $node/mal:info/mal:license">
+  <xsl:variable name="infos" select="$node/mal:info | $node/parent::mal:stack/mal:info"/>
+  <xsl:if test="$infos/mal:credit or $infos/mal:license">
   <footer class="about ui-expander" role="contentinfo">
     <div class="yelp-data yelp-data-ui-expander" data-yelp-expanded="false"/>
     <div class="inner">
@@ -78,7 +84,7 @@ the `page` element. Information is extracted from the `info` element of $node.
     </div>
     <div class="region">
       <div class="contents">
-        <xsl:variable name="credits" select="$node/mal:info/mal:credit"/>
+        <xsl:variable name="credits" select="$infos/mal:credit"/>
         <xsl:variable name="copyrights"
                       select="$credits[contains(concat(' ', @type, ' '), ' copyright ')]
                               [mal:years]"/>
@@ -147,7 +153,7 @@ the `page` element. Information is extracted from the `info` element of $node.
             <div class="credits-blank"></div>
           </div>
         </xsl:if>
-        <xsl:for-each select="$node/mal:info/mal:license">
+        <xsl:for-each select="$infos/mal:license">
           <div class="license">
             <div class="title">
               <span class="title">


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]