Warning, /graphics/digikam/core/dplugins/generic/tools/htmlgallery/themes/html5responsive/template.xsl is written in an unsupported language. File is not indexed.

0001 <?xml version="1.0" encoding="UTF-8" ?>
0002 
0003 <!--
0004  * ============================================================
0005  *
0006  * This file is a part of a digiKam custom HTML gallery theme.
0007  * https://www.digikam.org
0008  *
0009  * Date        : 2019-11-17
0010  * Description : An HTML gallery theme based on HTML5, CSS3,
0011  *               UTF-8 and the PhotoSwipe utility.
0012  *
0013  * SPDX-FileCopyrightText: 2007 by Wojciech Jarosz <jiri at boha dot cz>
0014  * SPDX-FileCopyrightText: 2019 by Bobulous <https://www.bobulous.org.uk>
0015  *
0016  * SPDX-License-Identifier: GPL-2.0-or-later
0017  *
0018  * ============================================================
0019  -->
0020 
0021 <xsl:transform version="1.0"
0022                            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
0023                            xmlns:exsl="http://exslt.org/common"
0024                            xmlns:date="http://exslt.org/dates-and-times"
0025                            extension-element-prefixes="exsl date">
0026         
0027         <xsl:import href="resources/xslt/xmlJsEscapeTemplate.xsl"/>
0028         <xsl:import href="resources/xslt/convertNewlinesToHtmlBreaksTemplate.xsl"/>
0029         
0030         <xsl:output method="html"
0031                          indent="yes" 
0032                          encoding="utf-8" 
0033                          doctype-system="about:legacy-compat" />
0034         
0035         
0036         <!-- ##################### VARIABLE INITIALIZATION #################### -->
0037         <!-- Initialize some useful variables -->
0038         <xsl:variable name="theme" select="'grey'" />
0039         <xsl:variable name="outerBorder" select="boolean(0)" />
0040         <xsl:variable name="resizeSpeed" select="10" />
0041         <xsl:variable name="maxOpacity" select="80" />
0042         <xsl:variable name="navType" select="1" />
0043         <xsl:variable name="autoResize" select="boolean(1)" />
0044         <xsl:variable name="doAnimations" select="boolean(1)" />
0045         <xsl:variable name="showNavigation" select="boolean(1)" />
0046         <xsl:variable name="numCollections" select="count(collections/collection)"/>
0047         
0048         
0049 <!-- ##################### STARTING POINT ################################# -->
0050 <!--
0051 Determines if we need to create a collectionListPage or just one
0052 collectionStartPage.
0053 -->
0054 <xsl:template match="/">
0055         <xsl:choose>
0056                 <xsl:when test="$numCollections &gt; 1">
0057                         <xsl:call-template name="collectionListPage"/>
0058                 </xsl:when>
0059                 <xsl:otherwise>
0060                         <xsl:for-each select="collections/collection">
0061                                 <xsl:call-template name="generateDetailPages">
0062                                         <xsl:with-param name="soleCollection">true</xsl:with-param>
0063                                 </xsl:call-template>
0064                                 <xsl:call-template name="collectionPage">
0065                                         <xsl:with-param name="pageFilename">index.html</xsl:with-param>
0066                                         <xsl:with-param name="pageNum" select="0"/>
0067                                 </xsl:call-template>
0068                         </xsl:for-each>
0069                 </xsl:otherwise>
0070         </xsl:choose>
0071 </xsl:template>
0072 <!-- ##################### END STARTING POINT ############################# -->
0073 
0074 <!-- ##################### COLLECTION LIST PAGE GENERATION ################ -->
0075 <!--
0076 If more than one collection was selected for export then a collectionListPage
0077 is generated which provides a list of all the individual collections.
0078 -->
0079 <xsl:template name="collectionListPage">
0080         <html>
0081         <head>
0082                 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
0083                 <meta name="viewport" content="width=device-width, initial-scale=1.0" />
0084                 <meta name="generator" content="digiKam"/>
0085                 <title><xsl:value-of select="$i18nCollectionList"/></title>
0086                 <link rel="stylesheet" type="text/css" media="screen">
0087                         <xsl:attribute name="href">html5responsive/resources/css/<xsl:value-of select="$style"/></xsl:attribute>
0088                 </link>
0089         </head>
0090         <body class="collectionListPage">
0091                 <header>
0092                         <h1><xsl:value-of select="$i18nCollectionList"/></h1>
0093                 </header>
0094                 <main>
0095                         <ul class="collectionList">
0096                                 <xsl:for-each select="collections/collection">
0097                                         <xsl:call-template name="generateDetailPages">
0098                                                 <xsl:with-param name="soleCollection">false</xsl:with-param>
0099                                         </xsl:call-template>
0100                                         <xsl:variable name="imageAspect">
0101                                                 <xsl:call-template name="aspectLabel">
0102                                                         <xsl:with-param name="imageWidth" select="image[1]/thumbnail/@width"/>
0103                                                         <xsl:with-param name="imageHeight" select="image[1]/thumbnail/@height"/>
0104                                                 </xsl:call-template>
0105                                         </xsl:variable>
0106                                         <xsl:variable name="altName" select="name"/>
0107                                         <li class="{$imageAspect}">
0108                                                 <figure>
0109                                                 <a href="{fileName}.html" class="thumbnailLink">
0110                                                         <!-- Use first image as collection image -->
0111                                                         <img src="{fileName}/{image[1]/thumbnail/@fileName}" width="{image[1]/thumbnail/@width}" height="{image[1]/thumbnail/@height}" alt="{$altName}"/>
0112                                                 </a>
0113                                                 <figcaption><a href="{fileName}.html"><xsl:value-of select="name"/></a></figcaption>
0114                                                 </figure>
0115                                         </li>
0116                                         <exsl:document href="{fileName}.html"
0117                                         method="html"
0118                                         indent="yes" 
0119                                         encoding="utf-8" 
0120                                         doctype-system="about:legacy-compat">
0121                                                 <xsl:call-template name="collectionPage">
0122                                                         <xsl:with-param name="pageFilename"><xsl:value-of select="fileName"/>.html</xsl:with-param>
0123                                                         <xsl:with-param name="pageNum" select="0"/>
0124                                                 </xsl:call-template>
0125                                         </exsl:document>
0126                                 </xsl:for-each>
0127                         </ul>
0128                 </main>
0129                 <!-- /content -->
0130                 <xsl:if test="$author != ''">
0131                         <footer>
0132                                 <xsl:call-template name="copyrightNotice"/>
0133                         </footer>
0134                 </xsl:if>
0135         </body>
0136         </html>
0137 </xsl:template>
0138 <!-- ##################### END COLLECTION LIST PAGE GENERATION ############ -->
0139 
0140 <xsl:template name="aspectLabel">
0141         <xsl:param name="imageWidth"/>
0142         <xsl:param name="imageHeight"/>
0143         <xsl:choose>
0144                 <xsl:when test="$imageWidth &gt; $imageHeight">
0145                         <xsl:text>landscape</xsl:text>
0146                 </xsl:when>
0147                 <xsl:when test="$imageWidth &lt; $imageHeight">
0148                         <xsl:text>portrait</xsl:text>
0149                 </xsl:when>
0150                 <xsl:otherwise>
0151                         <xsl:text>square</xsl:text>
0152                 </xsl:otherwise>
0153         </xsl:choose>
0154 </xsl:template>
0155 
0156 <xsl:template name="copyrightNotice">
0157         <div class="copyright" lang="en">
0158                 <xsl:text>All Images Copyright © </xsl:text>
0159                 <xsl:value-of select="date:year()"/>
0160                 <xsl:text> </xsl:text>
0161                 <xsl:value-of select="$author"/>
0162         </div>
0163 </xsl:template>
0164 
0165 
0166 <!-- ##################### COLLECTION DETAIL PAGE GENERATION ################## -->
0167 <!--
0168 Each photo in a collection has a detail page which displays only that photo and
0169 data related to that photo (title, description, EXIF data, etc). This template
0170 generates all detail pages for the current collection.
0171 -->
0172 <xsl:template name="generateDetailPages">
0173         <xsl:param name="soleCollection"/>
0174         <xsl:variable name="folder" select='fileName'/>
0175         <xsl:for-each select="image">
0176                 <xsl:variable name="photoIndex" select="position() - 1"/>
0177                 <xsl:variable name="pageIndex" select="floor((position() - 1) div $pageSize)"/>
0178                 <!-- TODO: MODIFY THIS SO THAT EVERY PHOTO POINTS TO THE COLLECTION THUMBNAIL PAGE WHICH HOLDS IT (not just to the first thumbnail page) -->
0179                 <xsl:variable name="pageFilename">
0180                         <xsl:choose>
0181                                 <xsl:when test="$soleCollection = 'true' and $pageIndex = 0">
0182                                         <xsl:text>../index.html</xsl:text>
0183                                 </xsl:when>
0184                                 <xsl:otherwise><xsl:text>../</xsl:text><xsl:value-of select="$folder"/>
0185                                                 <xsl:choose>
0186                                                         <xsl:when test="$pageIndex = 0">
0187                                                                 <xsl:text>.html</xsl:text>
0188                                                         </xsl:when>
0189                                                         <xsl:otherwise>
0190                                                                 <xsl:text>_</xsl:text><xsl:value-of select="$pageIndex"/><xsl:text>.html</xsl:text>
0191                                                         </xsl:otherwise>
0192                                                 </xsl:choose>
0193                                 </xsl:otherwise>
0194                         </xsl:choose>
0195                 </xsl:variable>
0196                 <exsl:document href='{$folder}/{full/@fileName}.html'
0197                                 method="html"
0198                                 indent="yes" 
0199                                 encoding="utf-8" 
0200                                 doctype-system="about:legacy-compat">
0201                         <xsl:call-template name="imagePage">
0202                                 <xsl:with-param name="indexPage"><xsl:value-of select="$pageFilename"/></xsl:with-param>
0203                         </xsl:call-template>
0204                 </exsl:document>
0205         </xsl:for-each>
0206 </xsl:template>
0207 <!-- ##################### END COLLECTION DETAIL PAGE GENERATION ############## -->
0208 
0209 
0210 <!-- ##################### COLLECTION PAGE GENERATION ##################### -->
0211 <!--
0212 A page of thumbnails for a sigle collection.
0213 If there are too many thumbnails to fit on one page then the content is split
0214 up into multiple pages.
0215 -->
0216 <xsl:template name="collectionPage">
0217         <xsl:param name="pageNum"/>
0218         <xsl:param name="pageFilename"/>
0219         <!-- <xsl:variable name="pageFilename" select="concat(fileName, '_', $pageNum, '.html')"/> -->
0220         <html>
0221         <head>
0222                 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
0223                 <meta name="viewport" content="width=device-width, initial-scale=1.0" />
0224                 <meta name="generator" content="digiKam"/>
0225                 <title><xsl:value-of select="name"/></title>
0226                 <link rel="stylesheet" type="text/css" media="screen">
0227                         <xsl:attribute name="href">html5responsive/resources/css/<xsl:value-of select="$style"/></xsl:attribute>
0228                 </link>
0229                 <xsl:if test="$usePhotoSwipe = 'true'">
0230                         <xsl:call-template name="photoSwipeStylesheets"/>
0231                         <xsl:call-template name="photoSwipeJavaScriptLibraries"/>
0232                 </xsl:if>
0233         </head>
0234         <body class="collectionPage">
0235         <xsl:variable name="numPages" select="ceiling(count(image) div $pageSize)"/>
0236         <xsl:variable name="folder" select='fileName'/>
0237         <xsl:variable name="pageName" select="name"/>
0238 
0239         <header>
0240                 <div id="pageTitleAndPagination">
0241                         <h1>
0242                                 <xsl:value-of select="name"/>
0243                         </h1>
0244                         <xsl:if test="$numCollections &gt; 1 or $paginationLocation = 'top' or $paginationLocation = 'both'">
0245                                 <nav class="topOfPage">
0246                                         <xsl:if test="$numCollections &gt; 1">
0247                                                 <p class="upLink albumListLink">
0248                                                         <a href="index.html">
0249                                                                 <xsl:value-of select="$i18nCollectionList"/>
0250                                                         </a>
0251                                                 </p>
0252                                         </xsl:if>                               
0253                                         <xsl:if test="$paginationLocation = 'top' or $paginationLocation = 'both'">
0254                                                 <xsl:call-template name="pagination">
0255                                                         <xsl:with-param name="numPages" select="$numPages"/>
0256                                                         <xsl:with-param name="pageNum" select="$pageNum"/>
0257                                                         <xsl:with-param name="paginationMode" select="$paginationModeTop"/>
0258                                                 </xsl:call-template>
0259                                         </xsl:if>
0260                                 </nav>
0261                         </xsl:if>
0262                 </div>
0263         </header>
0264         <main>
0265                 <ol class="imageList">
0266                         <!-- Add thumbnails and links to all images for the current page. -->
0267                         <xsl:for-each select="image[(position() &gt;= ($pageNum * $pageSize) + 1) and (position() &lt;= $pageSize + ($pageSize * $pageNum))]">
0268                                 <xsl:variable name="photoIndex" select="$pageSize * $pageNum + position() - 1"/>
0269                                 <xsl:variable name="jiggleHooks">
0270                                         <xsl:if test="$addJiggle = 'true'">
0271                                                 <xsl:variable name="mod2" select="$photoIndex mod 2"/>
0272                                                 <xsl:variable name="mod3" select="$photoIndex mod 3"/>
0273                                                 <xsl:variable name="mod5" select="$photoIndex mod 5"/>
0274                                                 <xsl:text>mod2val</xsl:text>
0275                                                 <xsl:value-of select="$mod2"/>
0276                                                 <xsl:text> mod3val</xsl:text>
0277                                                 <xsl:value-of select="$mod3"/>
0278                                                 <xsl:text> mod5val</xsl:text>
0279                                                 <xsl:value-of select="$mod5"/>
0280                                         </xsl:if>
0281                                 </xsl:variable>
0282                                 <xsl:variable name="imageAspect">
0283                                         <xsl:call-template name="aspectLabel">
0284                                                 <xsl:with-param name="imageWidth" select="thumbnail/@width"/>
0285                                                 <xsl:with-param name="imageHeight" select="thumbnail/@height"/>
0286                                         </xsl:call-template>
0287                                 </xsl:variable>
0288                                 <li class="{$imageAspect} {$jiggleHooks}">
0289                                         <figure>
0290                                                 <xsl:variable name="onClickAction">
0291                                                         <xsl:if test="$usePhotoSwipe = 'true'">
0292                                                                 <xsl:text>openImageInPhotoSwipe(</xsl:text>
0293                                                                 <xsl:value-of select="$photoIndex"/>
0294                                                                 <xsl:text>); return false;</xsl:text>
0295                                                         </xsl:if>
0296                                                 </xsl:variable>
0297                                                 <a class="thumbnailLink" href="{$folder}/{full/@fileName}.html" id="collectionPhotoIndex_{$photoIndex}" onclick="{$onClickAction}">
0298                                                         <img src="{$folder}/{thumbnail/@fileName}" width="{thumbnail/@width}" height="{thumbnail/@height}" alt="{title}"/>
0299                                                 </a>
0300                                                 <figcaption>
0301                                                         <p class="imageTitle"><xsl:value-of select="title"/></p>
0302                                                         <xsl:if test="date != ''">
0303                                                                 <p class="imageDate">
0304                                                                         <time datetime="{date}">
0305                                                                                 <xsl:value-of select="date"/>
0306                                                                         </time>
0307                                                                 </p>
0308                                                         </xsl:if>
0309                                                         <xsl:if test="description != ''">
0310                                                                 <p class="imageDescription">
0311                                                                         <xsl:call-template name="convertNewlinesToHtmlBreaks">
0312                                                                                 <xsl:with-param name="rawText" select="description"/>
0313                                                                         </xsl:call-template>
0314                                                                 </p>
0315                                                         </xsl:if>
0316                                                 </figcaption>
0317                                         </figure>
0318                                 </li>
0319                         </xsl:for-each>
0320                 </ol>           
0321         </main>
0322         <xsl:if test="$paginationLocation = 'bottom' or $paginationLocation = 'both' or $author != ''">
0323                 <footer>
0324                         <div class="paginationAndCopyright">
0325                                 <xsl:if test="($paginationLocation = 'bottom') or ($paginationLocation = 'both')">
0326                                         <nav class="bottomOfPage">
0327                                                 <xsl:call-template name="pagination">
0328                                                         <xsl:with-param name="numPages" select="$numPages"/>
0329                                                         <xsl:with-param name="pageNum" select="$pageNum"/>
0330                                                         <xsl:with-param name="paginationMode" select="$paginationModeBottom"/>
0331                                                 </xsl:call-template>
0332                                         </nav>
0333                                 </xsl:if>
0334                                 <xsl:if test="$author != ''">
0335                                         <xsl:call-template name="copyrightNotice"/>
0336                                 </xsl:if>
0337                         </div>
0338                 </footer>
0339         </xsl:if>
0340         
0341         <xsl:if test="$usePhotoSwipe = 'true'">
0342                 <xsl:call-template name="photoSwipeDomElements"/>
0343                 <xsl:call-template name="photoSwipeJavaScriptInitialisation">
0344                         <xsl:with-param name="numPages" select="$numPages"/>
0345                         <xsl:with-param name="pageNum" select="$pageNum"/>
0346                         <xsl:with-param name="folder" select="$folder"/>
0347                 </xsl:call-template>
0348         </xsl:if>
0349         </body>
0350         </html>
0351         <xsl:if test="$pageNum = 0">
0352                 <!-- Generate all subsequent collection pages. -->
0353                 <xsl:call-template name="collectionPages"/>
0354         </xsl:if>
0355 </xsl:template>
0356 <!-- ##################### END COLLECTION PAGE GENERATION ################# -->
0357 
0358 
0359 <!-- ##################### PHOTOSWIPE COMPONENT GENERATION ###################### -->
0360 <!--
0361 Generates JavaScript and object data required by the PhotoSwipe software.
0362 -->
0363 
0364 <xsl:template name="photoSwipeStylesheets">
0365         <link rel="stylesheet" href="html5responsive/resources/css/photoswipe.css" type="text/css" media="screen"/>
0366         <link rel="stylesheet" href="html5responsive/resources/css/default-skin/default-skin.css" type="text/css" media="screen"/>
0367 </xsl:template>
0368 
0369 <xsl:template name="photoSwipeDomElements">
0370         <!-- Root element of PhotoSwipe. Must have class pswp. -->
0371         <div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">
0372                 <!-- Background of PhotoSwipe. 
0373                         It's a separate element as animating opacity is faster than rgba(). -->
0374                 <div class="pswp__bg"></div>
0375                 <!-- Slides wrapper with overflow:hidden. -->
0376                 <div class="pswp__scroll-wrap">
0377                         <!-- Container that holds slides. 
0378                                 PhotoSwipe keeps only 3 of them in the DOM to save memory.
0379                                 Don't modify these 3 pswp__item elements, data is added later on. -->
0380                         <div class="pswp__container">
0381                                 <div class="pswp__item"></div>
0382                                 <div class="pswp__item"></div>
0383                                 <div class="pswp__item"></div>
0384                         </div>
0385                         <!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
0386                         <div class="pswp__ui pswp__ui--hidden">
0387                                 <div class="pswp__top-bar">
0388                                         <!--  Controls are self-explanatory. Order can be changed. -->
0389                                         <div class="pswp__counter"></div>
0390                                         <button class="pswp__button pswp__button--close" title="Close (Esc)"></button>
0391                                         <button class="pswp__button pswp__button--share" title="Share"></button>
0392                                         <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>
0393                                         <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>
0394                                         <!-- Preloader demo https://codepen.io/dimsemenov/pen/yyBWoR -->
0395                                         <!-- element will get class pswp__preloader_active when preloader is running -->
0396                                         <div class="pswp__preloader">
0397                                                 <div class="pswp__preloader__icn">
0398                                                 <div class="pswp__preloader__cut">
0399                                                         <div class="pswp__preloader__donut"></div>
0400                                                 </div>
0401                                                 </div>
0402                                         </div>
0403                                 </div>
0404                                 <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
0405                                         <div class="pswp__share-tooltip"></div> 
0406                                 </div>
0407                                 <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
0408                                 </button>
0409                                 <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
0410                                 </button>
0411                                 <div class="pswp__caption">
0412                                         <div class="pswp__caption__center"></div>
0413                                 </div>
0414                         </div>
0415                 </div>
0416         </div>
0417 </xsl:template>
0418 
0419 <xsl:template name="photoSwipeJavaScriptLibraries">
0420         <script src="html5responsive/resources/js/photoswipe.min.js"/>
0421         <script src="html5responsive/resources/js/photoswipe-ui-default.min.js"/>
0422 </xsl:template>
0423 
0424 <xsl:template name="photoSwipeJavaScriptInitialisation">
0425         <xsl:param name="numPages"/>
0426         <xsl:param name="pageNum"/>
0427         <xsl:param name="folder"/>
0428         <script>
0429                 <xsl:text>
0430 var pswpElement = document.querySelectorAll('.pswp')[0];
0431 
0432 // build items array
0433 var items = [</xsl:text>
0434                 <xsl:for-each select="image">
0435                         <xsl:text>{</xsl:text>
0436                         <xsl:text>src: "</xsl:text><xsl:call-template name="escapeTextForJavaScript">
0437                                 <xsl:with-param name="text" select="$folder"/>
0438                         </xsl:call-template><xsl:text>/</xsl:text><xsl:call-template name="escapeTextForJavaScript">
0439                                 <xsl:with-param name="text" select="full/@fileName"/>
0440                         </xsl:call-template><xsl:text>",</xsl:text>
0441                         <xsl:text>w: </xsl:text><xsl:value-of select="full/@width"/><xsl:text>,</xsl:text>
0442                         <xsl:text>h: </xsl:text><xsl:value-of select="full/@height"/><xsl:text>,</xsl:text>
0443                         <xsl:text>title: "</xsl:text><xsl:call-template name="escapeTextForJavaScript">
0444                                 <xsl:with-param name="text" select="title"/>
0445                         </xsl:call-template><xsl:text>",</xsl:text>
0446                         <xsl:text>description: "</xsl:text><xsl:call-template name="escapeTextForJavaScript">
0447                                 <xsl:with-param name="text" select="description"/>
0448                         </xsl:call-template><xsl:text>",</xsl:text>
0449                         <xsl:text>detailPage: "</xsl:text><xsl:call-template name="escapeTextForJavaScript">
0450                                 <xsl:with-param name="text">
0451                                         <xsl:value-of select="$folder"/><xsl:text>/</xsl:text><xsl:value-of select="full/@fileName"/><xsl:text>.html</xsl:text>
0452                                 </xsl:with-param>
0453                         </xsl:call-template><xsl:text>"</xsl:text>
0454                         <!-- TODO: Work out whether there's an elegant way to avoid writing an unwanted comma at the very end of the list. -->
0455                         <xsl:text>},</xsl:text>
0456                 </xsl:for-each>
0457         <xsl:text>];
0458 
0459 // Define functions related to PhotoSwipe module.
0460 
0461 function openImageInPhotoSwipe(photoIndex) {
0462         var options, gallery;
0463         // Initializes and opens PhotoSwipe (at the specified photo).
0464         options = {
0465                 // optionName: 'option value'
0466                 // for example:
0467                 index: photoIndex, // start at selected photo
0468                 addCaptionHTMLFn: photoCaptionGenerator,
0469                 shareEl: </xsl:text><xsl:value-of select="$photoSwipeShowSharingButton" /><xsl:text>,
0470                 bgOpacity: </xsl:text><xsl:value-of select="$photoSwipeBackgroundOpacity" /><xsl:text> / 10
0471         };
0472         gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, options);
0473         gallery.init();
0474 }
0475 
0476 var photoCaptionGenerator = function(item, captionEl, isFake) {
0477         var html;
0478         if(!item.title &amp;&amp; !item.description &amp;&amp; !item.detailPage) {
0479                 captionEl.children[0].innerHTML = '';
0480                 return false;
0481         }
0482         html =  "&lt;div class=\"galleryPhotoCaption\"&gt;";
0483         if (item.title) {
0484                 html += "&lt;p class=\"galleryPhotoTitle\"&gt;" + item.title.replace(/(?:\r\n|\r|\n)/g, '&lt;br /&gt;') + "&lt;/p&gt;";
0485         }
0486         if (item.description) {
0487                 html += "&lt;p class=\"galleryPhotoDescription\"&gt;" + item.description.replace(/(?:\r\n|\r|\n)/g, '&lt;br /&gt;') + "&lt;/p&gt;";
0488         }
0489         if (item.detailPage) {
0490         html += "&lt;p class=\"galleryFullDetailsLink\"&gt;&lt;a href=\"" + item.detailPage + "\"&gt;</xsl:text><xsl:value-of select="$i18nOriginalImage"/><xsl:text>&lt;/a&gt;&lt;/p&gt;";
0491         }
0492         html += "&lt;/div&gt;";
0493         captionEl.children[0].innerHTML = html;
0494         return true;
0495 }
0496 
0497 // This photoswipeParseHash function was taken from the code provided by Dimitry
0498 // Semenov at https://photoswipe.com/documentation/getting-started.html
0499 var photoswipeParseHash = function() {
0500         var hash = window.location.hash.substring(1),
0501         params = {};
0502 
0503         if(hash.length &lt; 5) {
0504                 return params;
0505         }
0506 
0507         var vars = hash.split('&amp;');
0508         for (var i = 0; i &lt; vars.length; i++) {
0509                 if(!vars[i]) {
0510                         continue;
0511                 }
0512                 var pair = vars[i].split('=');  
0513                 if(pair.length &lt; 2) {
0514                         continue;
0515                 }           
0516                 params[pair[0]] = pair[1];
0517         }
0518 
0519         if(params.gid) {
0520                 params.gid = parseInt(params.gid, 10);
0521         }
0522 
0523         return params;
0524 };
0525 
0526 // If a PhotoSwipe history URL has been used then open PhotoSwipe directly at
0527 // the specified photo index.
0528 var hashData = photoswipeParseHash();
0529 if(hashData.pid &amp;&amp; hashData.gid) {
0530         openImageInPhotoSwipe(hashData.pid);
0531 }
0532 </xsl:text>
0533         </script>
0534 </xsl:template>
0535 <!-- ##################### END PHOTOSWIPE COMPONENT GENERATION ################## -->
0536 
0537 
0538 <!-- ##################### PAGINATION LINK GENERATATION ################### -->
0539 <xsl:template name="pagination">
0540         <xsl:param name="numPages"/>
0541         <xsl:param name="pageNum"/>
0542         <xsl:param name="paginationMode"/>
0543         <xsl:if test="$numPages &gt; 1">
0544                 <div class="pagination">
0545                         <xsl:choose>
0546                                 <xsl:when test="number($pageNum) = 0">
0547                                         <p class="previousLink disabled">
0548                                                 <xsl:value-of select="$i18nPrevious"/>
0549                                         </p>
0550                                 </xsl:when>
0551                                 <xsl:otherwise>
0552                                         <p class="previousLink">
0553                                                 <a>
0554                                                         <xsl:attribute name="href">
0555                                                                 <xsl:call-template name="pageLink">
0556                                                                         <xsl:with-param name="collectionFilename" select="fileName"/>
0557                                                                         <xsl:with-param name="pageNum" select="number($pageNum)-1"/>
0558                                                                 </xsl:call-template>
0559                                                         </xsl:attribute>
0560                                                         <xsl:value-of select="$i18nPrevious"/>
0561                                                 </a>
0562                                         </p>
0563                                 </xsl:otherwise>
0564                         </xsl:choose>
0565                         <xsl:choose>
0566                                 <xsl:when test="$paginationMode = 'fullList'">
0567                                         <ol class="pageNumbersList">
0568                                                 <xsl:call-template name="pagination.for.loop">
0569                                                         <xsl:with-param name="i" select="0"/>
0570                                                         <xsl:with-param name="count" select="$numPages"/>
0571                                                         <xsl:with-param name="currentPage" select="$pageNum"/>
0572                                                 </xsl:call-template>
0573                                         </ol>
0574                                 </xsl:when>
0575                                 <xsl:when test="$paginationMode = 'currentOfTotal'">
0576                                         <xsl:call-template name="currentPageOfTotal">
0577                                                 <xsl:with-param name="count" select="$numPages"/>
0578                                                 <xsl:with-param name="currentPage" select="$pageNum"/>                                                  
0579                                         </xsl:call-template>
0580                                 </xsl:when>
0581                         </xsl:choose>
0582                         <xsl:choose>
0583                                 <xsl:when test="number($pageNum) = number($numPages)-1">
0584                                         <p class="nextLink disabled">
0585                                                 <xsl:value-of select="$i18nNext"/>
0586                                         </p>
0587                                 </xsl:when>
0588                                 <xsl:otherwise>
0589                                         <p class="nextLink">
0590                                                 <a>
0591                                                         <xsl:attribute name="href">
0592                                                                 <xsl:call-template name="pageLink">
0593                                                                         <xsl:with-param name="collectionFilename" select="fileName"/>
0594                                                                         <xsl:with-param name="pageNum" select="number($pageNum)+1"/>
0595                                                                 </xsl:call-template>
0596                                                         </xsl:attribute>
0597                                                         <xsl:value-of select="$i18nNext"/>
0598                                                 </a>
0599                                         </p>
0600                                 </xsl:otherwise>
0601                         </xsl:choose>
0602                 </div>
0603         </xsl:if>
0604 </xsl:template>
0605 
0606 <!-- For loop used to generate pagination links -->
0607 <xsl:template name="pagination.for.loop">
0608         <xsl:param name="i"/>
0609         <xsl:param name="count"/>
0610         <xsl:param name="currentPage"/>
0611         
0612         <xsl:if test="$i &lt; $count">
0613                 <xsl:choose>
0614                         <xsl:when test="number($currentPage) = $i">
0615                                 <li class="pageNumber current"><xsl:value-of select="number($i)+1"/></li>
0616                         </xsl:when>
0617                         <xsl:otherwise>
0618                                 <li class="pageNumber">
0619                                         <a>
0620                                                 <xsl:attribute name="href">
0621                                                         <xsl:call-template name="pageLink">
0622                                                                 <xsl:with-param name="collectionFilename" select="fileName"/>
0623                                                                 <xsl:with-param name="pageNum" select="$i"/>
0624                                                         </xsl:call-template>
0625                                                 </xsl:attribute>
0626                                                 <xsl:value-of select="number($i)+1"/>
0627                                         </a>
0628                                 </li>
0629                         </xsl:otherwise>
0630                 </xsl:choose>
0631                 
0632                 <xsl:call-template name="pagination.for.loop">
0633                         <xsl:with-param name="i" select="$i + 1"/>
0634                         <xsl:with-param name="count" select="$count"/>
0635                         <xsl:with-param name="currentPage" select="$currentPage"/>
0636                 </xsl:call-template>
0637         </xsl:if>
0638 </xsl:template>
0639 
0640 <!-- Template which prints out the html url for a particular page -->
0641 <xsl:template name="pageLink">
0642         <xsl:param name="collectionFilename"/>
0643         <xsl:param name="pageNum"/>
0644         <xsl:choose>
0645                 <xsl:when test="($numCollections &gt; 1) and ($pageNum = 0)">
0646                         <xsl:value-of select="$collectionFilename"/><xsl:text>.html</xsl:text>
0647                 </xsl:when>
0648                 <xsl:when test="($numCollections &lt;= 1) and ($pageNum = 0)">index.html</xsl:when>
0649                 <xsl:otherwise><xsl:value-of select="$collectionFilename"/>_<xsl:value-of select="number($pageNum)" />.html</xsl:otherwise>
0650         </xsl:choose>
0651 </xsl:template>
0652 
0653 <xsl:template name="currentPageOfTotal">
0654         <xsl:param name="count"/>
0655         <xsl:param name="currentPage"/>
0656         <p class="currentOfTotal">
0657                 <span class="currentPageNumber">
0658                         <xsl:value-of select="$currentPage + 1"/>
0659                 </span>
0660                 <span class="currentTotalSeparator"> / </span>
0661                 <span class="totalPageCount">
0662                         <xsl:value-of select="$count"/>
0663                 </span>
0664         </p>
0665 </xsl:template>
0666 
0667 <!-- ##################### IMAGE PAGE GENERATION ########################## -->
0668 <!--
0669 Displays a single image on the page, with full details about that image.
0670 -->
0671 <xsl:template name="imagePage">
0672         <xsl:param name="indexPage"/>
0673         <html>
0674         <head>
0675                 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
0676                 <meta name="viewport" content="width=device-width, initial-scale=1.0" />
0677                 <meta name="generator" content="digiKam"/>
0678                 <title><xsl:value-of select="title"/></title>
0679                 <link rel="stylesheet" type="text/css" media="screen">
0680                         <xsl:attribute name="href">../html5responsive/resources/css/<xsl:value-of select="$style"/></xsl:attribute>
0681                 </link>
0682         </head>
0683         <body class="imagePage">
0684                 <header>
0685                         <div id="pageTitleAndPagination">
0686                                 <h1>
0687                                         <xsl:value-of select="title"/>
0688                                 </h1>
0689                                 <nav class="topOfPage">
0690                                         <p class="upLink albumNameLink">
0691                                                 <a href="{$indexPage}">
0692                                                         <xsl:value-of select="../name"/>
0693                                                 </a>                                    
0694                                         </p>    
0695                                         <xsl:if test="($paginationLocation = 'top') or ($paginationLocation = 'both')">
0696                                                 <xsl:call-template name="image.pagination">
0697                                                         <xsl:with-param name="indexPage" select="$indexPage"/>
0698                                                 </xsl:call-template>
0699                                         </xsl:if>
0700                                 </nav>
0701                         </div>
0702                 </header>
0703         <main>
0704                 <figure id="image">
0705                         <a href="{$indexPage}">
0706                                 <img src="{full/@fileName}" width="{full/@width}" height="{full/@height}" />
0707                         </a>
0708                         <xsl:variable name="exifTableRequired">
0709                                 <xsl:call-template name="isExifTableRequired"/>
0710                         </xsl:variable>
0711                         <xsl:if test="description != '' or original/@fileName != '' or $exifTableRequired = 'true'">
0712                                 <figcaption>
0713                                         <xsl:if test="description != ''">
0714                                                 <p class="imageDescription">
0715                                                         <xsl:call-template name="convertNewlinesToHtmlBreaks">
0716                                                                 <xsl:with-param name="rawText" select="description"/>
0717                                                         </xsl:call-template>
0718                                                 </p>
0719                                         </xsl:if>
0720                                         <xsl:if test="$exifTableRequired = 'true'">
0721                                                 <xsl:call-template name="addExifData"/>
0722                                         </xsl:if>
0723                                         <xsl:if test="original/@fileName != ''">
0724                                                 <p class="originalImageLink">
0725                                                         <a href="{original/@fileName}"><xsl:value-of select="$i18nOriginalImage"/></a>
0726                                                         (<xsl:value-of select="original/@width"/>x<xsl:value-of select="original/@height"/>)
0727                                                 </p>
0728                                         </xsl:if>
0729                                 </figcaption>
0730                         </xsl:if>
0731                 </figure>
0732         </main>
0733         <xsl:if test="$author != '' or ($paginationLocation = 'bottom') or ($paginationLocation = 'both')">
0734                 <footer>
0735                         <div class="paginationAndCopyright">
0736                                 <xsl:if test="($paginationLocation = 'bottom') or ($paginationLocation = 'both')">
0737                                         <nav class="bottomOfPage">
0738                                                 <xsl:call-template name="image.pagination">
0739                                                         <xsl:with-param name="indexPage" select="$indexPage"/>
0740                                                 </xsl:call-template>
0741                                         </nav>
0742                                 </xsl:if>
0743                                 <xsl:if test="$author != ''">
0744                                         <xsl:call-template name="copyrightNotice"/>
0745                                 </xsl:if>
0746                         </div>
0747                 </footer>
0748         </xsl:if>
0749 </body>
0750 </html>
0751 </xsl:template>
0752 
0753 <xsl:template name="isExifTableRequired">
0754         <xsl:choose>
0755                 <!-- IMPORTANT: IF THE EXIF FIELDS CONSIDERED HERE ARE CHANGED THEN THE EXACT SAME LIST OF FIELDS MUST BE LISTED IN THE "addExifData" TEMPLATE! -->
0756                 <xsl:when test="exif/exifimagedatetime != 'unavailable' or exif/exifimagemake != 'unavailable' or exif/exifimagemodel != 'unavailable' or exif/exifphotofocallength != 'unavailable' or exif/exifphotoaperturevalue != 'unavailable' or exif/exifphotoshutterspeedvalue != 'unavailable' or exif/exifphotoisospeedratings != 'unavailable' or exif/exifphotofnumber != 'unavailable' or exif/exifphotoexposuretime != 'unavailable' or ($showGPS = 'true' and (exif/exifgpslatitude != 'unavailable' or exif/exifgpslongitude != 'unavailable' or exif/exifgpsaltitude != 'unavailable'))">
0757                         <xsl:text>true</xsl:text>
0758                 </xsl:when>
0759                 <xsl:otherwise>
0760                         <xsl:text>false</xsl:text>
0761                 </xsl:otherwise>
0762         </xsl:choose>
0763 </xsl:template>
0764 
0765 <xsl:template name="addExifData">
0766         <table class="exifData">
0767                 <caption><abbr title="Exchangeable image file">Exif</abbr> data</caption>
0768                 <tr class="exifHeaderRow">
0769                         <th scope="col">Field</th>
0770                         <th scope="col">Value</th>
0771                 </tr>
0772                 <!-- IMPORTANT: IF THE EXIF FIELDS USED HERE ARE CHANGED THEN THE EXACT SAME LIST OF FIELDS MUST BE CONSIDERED IN THE "isExifTableRequired" TEMPLATE! -->
0773                 <xsl:call-template name="addExifTableRow">
0774                         <xsl:with-param name="cssClassName">exifDateTime</xsl:with-param>
0775                         <xsl:with-param name="fieldName" select="$i18nexifimagedatetime"/>
0776                         <xsl:with-param name="fieldValue" select="exif/exifimagedatetime"/>
0777                 </xsl:call-template>
0778                 <xsl:call-template name="addExifTableRow">
0779                         <xsl:with-param name="cssClassName">hardwareMake</xsl:with-param>
0780                         <xsl:with-param name="fieldName" select="$i18nexifimagemake"/>
0781                         <xsl:with-param name="fieldValue" select="exif/exifimagemake"/>
0782                 </xsl:call-template>
0783                 <xsl:call-template name="addExifTableRow">
0784                         <xsl:with-param name="cssClassName">hardwareModel</xsl:with-param>
0785                         <xsl:with-param name="fieldName" select="$i18nexifimagemodel"/>
0786                         <xsl:with-param name="fieldValue" select="exif/exifimagemodel"/>
0787                 </xsl:call-template>
0788                 <xsl:call-template name="addExifTableRow">
0789                         <xsl:with-param name="cssClassName">focalLength</xsl:with-param>
0790                         <xsl:with-param name="fieldName" select="$i18nexifphotofocallength"/>
0791                         <xsl:with-param name="fieldValue" select="exif/exifphotofocallength"/>
0792                 </xsl:call-template>
0793                 <xsl:call-template name="addExifTableRow">
0794                         <xsl:with-param name="cssClassName">apertureValue</xsl:with-param>
0795                         <xsl:with-param name="fieldName" select="$i18nexifphotoaperturevalue"/>
0796                         <xsl:with-param name="fieldValue" select="exif/exifphotoaperturevalue"/>
0797                 </xsl:call-template>
0798                 <xsl:call-template name="addExifTableRow">
0799                         <xsl:with-param name="cssClassName">shutterSpeedValue</xsl:with-param>
0800                         <xsl:with-param name="fieldName" select="$i18nexifphotoshutterspeedvalue"/>
0801                         <xsl:with-param name="fieldValue" select="exif/exifphotoshutterspeedvalue"/>
0802                 </xsl:call-template>
0803                 <xsl:call-template name="addExifTableRow">
0804                         <xsl:with-param name="cssClassName">fNumber</xsl:with-param>
0805                         <xsl:with-param name="fieldName" select="$i18nexifphotofnumber"/>
0806                         <xsl:with-param name="fieldValue" select="exif/exifphotofnumber"/>
0807                 </xsl:call-template>
0808                 <xsl:call-template name="addExifTableRow">
0809                         <xsl:with-param name="cssClassName">exposureTime</xsl:with-param>
0810                         <xsl:with-param name="fieldName" select="$i18nexifphotoexposuretime"/>
0811                         <xsl:with-param name="fieldValue" select="exif/exifphotoexposuretime"/>
0812                 </xsl:call-template>
0813                 <xsl:call-template name="addExifTableRow">
0814                                 <xsl:with-param name="cssClassName">isoSpeed</xsl:with-param>
0815                         <xsl:with-param name="fieldName" select="$i18nexifphotoisospeedratings"/>
0816                         <xsl:with-param name="fieldValue" select="exif/exifphotoisospeedratings"/>
0817                 </xsl:call-template>
0818                 <xsl:if test="$showGPS = 'true'">
0819                         <xsl:call-template name="addExifTableRow">
0820                                 <xsl:with-param name="cssClassName">gpsLatitude</xsl:with-param>
0821                                 <xsl:with-param name="fieldName">GPS latitude</xsl:with-param>
0822                                 <xsl:with-param name="fieldValue" select="exif/exifgpslatitude"/>
0823                         </xsl:call-template>
0824                         <xsl:call-template name="addExifTableRow">
0825                                 <xsl:with-param name="cssClassName">gpsLongitude</xsl:with-param>
0826                                 <xsl:with-param name="fieldName">GPS longitude</xsl:with-param>
0827                                 <xsl:with-param name="fieldValue" select="exif/exifgpslongitude"/>
0828                         </xsl:call-template>
0829                         <xsl:call-template name="addExifTableRow">
0830                                 <xsl:with-param name="cssClassName">gpsAltitude</xsl:with-param>
0831                                 <xsl:with-param name="fieldName">GPS altitude</xsl:with-param>
0832                                 <xsl:with-param name="fieldValue" select="exif/exifgpsaltitude"/>
0833                         </xsl:call-template>
0834                 </xsl:if>
0835                 <!-- IMPORTANT: IF THE EXIF FIELDS USED HERE ARE CHANGED THEN THE EXACT SAME LIST OF FIELDS MUST BE CONSIDERED IN THE "isExifTableRequired" TEMPLATE! -->
0836         </table>
0837 </xsl:template>
0838 
0839 <xsl:template name="addExifTableRow">
0840         <xsl:param name="cssClassName"/>
0841         <xsl:param name="fieldName"/>
0842         <xsl:param name="fieldValue"/>
0843         <xsl:if test="$fieldValue != '' and $fieldValue != 'unavailable'">
0844                 <tr class="{$cssClassName}">
0845                         <th scope="row"><xsl:value-of select="$fieldName"/></th>
0846                         <td><xsl:value-of select="$fieldValue"/></td>
0847                 </tr>
0848         </xsl:if>
0849 </xsl:template>
0850 
0851 <!-- ##################### END IMAGE PAGE GENERATION ###################### -->
0852 
0853 
0854 <!-- ##################### IMAGE PAGINATION LINK GENERATATION ############# -->
0855 <xsl:template name="image.pagination">
0856         <xsl:param name="indexPage"/>
0857         <div class="pagination">
0858                 <div>
0859                         <xsl:choose>
0860                                 <xsl:when test="position() &gt; 1">
0861                                         <p class="previousLink">
0862                                                 <a href="{preceding-sibling::image[position()=1]/full/@fileName}.html">
0863                                                         <xsl:value-of select="$i18nPrevious"/>
0864                                                 </a>
0865                                         </p>
0866                                 </xsl:when>
0867                                 <xsl:otherwise>
0868                                         <p class="previousLink disabled">
0869                                                 <xsl:value-of select="$i18nPrevious"/>
0870                                         </p>
0871                                 </xsl:otherwise>
0872                         </xsl:choose>
0873                         
0874                         <p class="currentOfTotal">
0875                                 <span class="currentPageNumber">
0876                                         <xsl:value-of select="position()"/>
0877                                 </span>
0878                                 <span class="currentTotalSeparator">/</span>
0879                                 <span class="totalPageCount">
0880                                         <xsl:value-of select="last()"/>
0881                                 </span>
0882                         </p>
0883                         
0884                         <xsl:choose>
0885                                 <xsl:when test="position() &lt; last()">
0886                                         <p class="nextLink">
0887                                                 <a href="{following-sibling::image[position()=1]/full/@fileName}.html"><xsl:value-of select="$i18nNext"/></a>
0888                                         </p>
0889                                 </xsl:when>
0890                                 <xsl:otherwise>
0891                                         <p class="nextLink disabled">
0892                                                 <xsl:value-of select="$i18nNext"/>
0893                                         </p>
0894                                 </xsl:otherwise>
0895                         </xsl:choose>
0896                 </div>
0897         </div>
0898 </xsl:template>
0899 <!-- ##################### END PAGINATION LINK GENERATATION ############### -->
0900 
0901 
0902 <!-- ##################### COLLECTION PAGES GENERATION ##################### -->
0903 <xsl:template name="collectionPages">
0904         <xsl:call-template name="collectionPages.for.loop">
0905                 <xsl:with-param name="i" select="1"/>
0906                 <xsl:with-param name="count" select="ceiling(count(image) div $pageSize)"/>
0907         </xsl:call-template>
0908 </xsl:template>
0909 
0910 <!-- For loop used to generate collection pages -->
0911 <xsl:template name="collectionPages.for.loop">
0912         <xsl:param name="i"/>
0913         <xsl:param name="count"/>
0914         
0915         <xsl:if test="$i &lt; $count">
0916                 <xsl:variable name="pageFilename" select="concat(fileName, '_', $i, '.html')"/>
0917                 <exsl:document href="{$pageFilename}"
0918                                 method="html"
0919                                 indent="yes" 
0920                                 encoding="utf-8" 
0921                                 doctype-system="about:legacy-compat">
0922                         <xsl:call-template name="collectionPage">
0923                                 <xsl:with-param name="pageNum" select="$i"/>
0924                                 <xsl:with-param name="pageFilename" select="$pageFilename"/>
0925                         </xsl:call-template>
0926                 </exsl:document>
0927                 
0928                 <xsl:call-template name="collectionPages.for.loop">
0929                         <xsl:with-param name="i" select="$i + 1"/>
0930                         <xsl:with-param name="count" select="$count"/>
0931                 </xsl:call-template>
0932         </xsl:if>
0933 </xsl:template>
0934 <!-- ##################### END COLLECTION PAGE GENERATION ################# -->
0935 
0936 </xsl:transform>