X-Git-Url: https://git.mdrn.pl/librarian.git/blobdiff_plain/cbc4c58f8d8cc36b4608da2303047bfbf7fb6cdd..5204f573cb56433b53b1bd5a2daa1a467ab497b5:/librarian/xslt/book2html.xslt?ds=sidebyside diff --git a/librarian/xslt/book2html.xslt b/librarian/xslt/book2html.xslt old mode 100755 new mode 100644 index 752eade..1704953 --- a/librarian/xslt/book2html.xslt +++ b/librarian/xslt/book2html.xslt @@ -1,408 +1,66 @@ <?xml version="1.0" encoding="utf-8"?> <!-- - + This file is part of Librarian, licensed under GNU Affero GPLv3 or later. Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. - + --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" - xmlns:wl="http://wolnelektury.pl/functions" > + xmlns:wl="http://wolnelektury.pl/functions" + xmlns:dc="http://purl.org/dc/elements/1.1/" > <xsl:output encoding="utf-8" indent="yes" omit-xml-declaration = "yes" version="2.0" /> +<xsl:strip-space elements="opowiadanie powiesc dramat_wierszowany_l dramat_wierszowany_lp dramat_wspolczesny liryka_l liryka_lp wywiad"/> <xsl:template match="utwor"> - <!-- <html> - <head> - <title>KsiÄ Å¼ka z serwisu WolneLektury.pl</title> - <meta http-equiv="content-type" content="text/html;charset=utf-8"/> - </head> - <style> - body { - font-size: 16px; - font: Georgia, "Times New Roman", serif; - line-height: 1.5em; - margin: 0; - } - - a { - color: blue; - text-decoration: none; - } - - #book-text { - margin: 3em; - max-width: 36em; - } - - /* ================================== */ - /* = Header with logo and menu = */ - /* ================================== */ - #header { - margin: 3.4em 0 0 1.4em; - } - - img { - border: none; - } - - - #menu { - position: fixed; - left: 0em; - top: 0em; - width: 100%; - height: 1.5em; - background: #333; - color: #FFF; - opacity: 0.9; - z-index: 99; - } - - #menu ul { - list-style: none; - padding: 0; - margin: 0; - } - - #menu li a { - display: block; - float: left; - width: 7.5em; - height: 1.5em; - margin-left: 0.5em; - text-align: center; - color: #FFF; - } - - #menu li a:hover, #menu li a:active { - color: #000; - background: #FFF url(/static/img/arrow-down.png) no-repeat center right; - } - - #menu li a.selected { - color: #000; - background: #FFF url(/static/img/arrow-up.png) no-repeat center right; - } - #menu a.menu-link { - display: block; - float: left; - height: 1.5em; - margin-left: 0.5em; - text-align: center; - color: #FFF; - } - #menu span { - color: #888; - font-style: italic; - font-size: .75em; - margin-right: 0.5em; - } - - - #toc, #themes, #nota_red { - position: fixed; - left: 0em; - top: 1.5em; - width: 37em; - padding: 1.5em; - background: #FFF; - border-bottom: 0.25em solid #DDD; - border-right: 0.25em solid #DDD; - display: none; - height: 16em; - overflow-x: hidden; - overflow-y: auto; - opacity: 0.9; - z-index: 99; - } - - #toc ol, #themes ol { - list-style: none; - padding: 0; - margin: 0; - } - - #toc ol li { - font-weight: bold; - } - - #toc ol ol { - padding: 0 0 1.5em 1.5em; - margin: 0; - } - - #toc ol ol li { - font-weight: normal; - } - - #toc h2 { - display: none; - } - - #toc .anchor { - float: none; - margin: 0; - color: blue; - font-size: 16px; - position: inherit; - } - - /* =================================================== */ - /* = Common elements: headings, paragraphs and lines = */ - /* =================================================== */ - h1 { - font-size: 3em; - margin: 1.5em 0; - text-align: center; - line-height: 1.5em; - font-weight: bold; - } - - h2 { - font-size: 2em; - margin: 1.5em 0 0; - font-weight: bold; - line-height: 1.5em; - } - - h3 { - font-size: 1.5em; - margin: 1.5em 0 0; - font-weight: normal; - line-height: 1.5em; - } - - h4 { - font-size: 1em; - margin: 1.5em 0 0; - line-height: 1.5em; - } - - p { - margin: 0; - } - - /* ======================== */ - /* = Footnotes and themes = */ - /* ======================== */ - .theme-begin { - border-left: 0.1em solid #DDDDDD; - color: #777; - padding: 0 0.5em; - width: 7.5em; - - font-style: normal; - font-weight: normal; - font-variant: normal; - letter-spacing: 0; - text-transform: none; - text-decoration: none; - - font-size: 16px; - float: right; - margin-right: -9.5em; - margin-bottom: 0.5em; - clear: both; - left: 40em; - line-height: 1.5em; - text-align: left; - } - - .annotation { - font-style: normal; - font-weight: normal; - font-size: 12px; - padding-left: 2px; - position: relative; - top: -4px; - } - - #footnotes .annotation { - display: block; - float: left; - width: 2.5em; - clear: both; - } - - #footnotes div { - margin: 1.5em 0 0 0; - } - - #footnotes p { - margin-left: 2.5em; - font-size: 0.875em; - } - - blockquote { - font-size: 0.875em; - } - - /* ============= */ - /* = Numbering = */ - /* ============= */ - .verse, .paragraph { - position:relative; - } - .anchor { - position: absolute; - margin: -0.25em -0.5em; - left: -3em; - color: #777; - font-size: 12px; - width: 2em; - text-align: center; - padding: 0.25em 0.5em; - line-height: 1.5em; - } - - .anchor:hover, #book-text .anchor:active { - color: #FFF; - background-color: #CCC; - } - - /* =================== */ - /* = Custom elements = */ - /* =================== */ - span.author { - font-size: 0.5em; - display: block; - line-height: 1.5em; - margin-bottom: 0.25em; - } - - span.collection { - font-size: 0.375em; - display: block; - line-height: 1.5em; - margin-bottom: -0.25em; - } - - span.subtitle { - font-size: 0.5em; - display: block; - line-height: 1.5em; - margin-top: -0.25em; - } - - div.didaskalia { - font-style: italic; - margin: 0.5em 0 0 1.5em; - } - - div.kwestia { - margin: 0.5em 0 0; - } - - div.stanza { - margin: 1.5em 0 0; - } - - div.kwestia div.stanza { - margin: 0; - } - - p.paragraph { - text-align: justify; - margin: 1.5em 0 0; - } - - p.motto { - text-align: justify; - font-style: italic; - margin: 1.5em 0 0; - } - - p.motto_podpis { - font-size: 0.875em; - text-align: right; - } - - div.fragment { - border-bottom: 0.1em solid #999; - padding-bottom: 1.5em; - } - - div.note p, div.dedication p, div.note p.paragraph, div.dedication p.paragraph { - text-align: right; - font-style: italic; - } - - hr.spacer { - height: 3em; - visibility: hidden; - } - - hr.spacer-line { - margin: 1.5em 0; - border: none; - border-bottom: 0.1em solid #000; - } - - p.spacer-asterisk { - padding: 0; - margin: 1.5em 0; - text-align: center; - } - - div.person-list ol { - list-style: none; - padding: 0 0 0 1.5em; - } - - p.place-and-time { - font-style: italic; - } - - em.math, em.foreign-word, em.book-title, em.didaskalia { - font-style: italic; - } - - em.author-emphasis { - letter-spacing: 0.1em; - } - - em.person { - font-style: normal; - font-variant: small-caps; - } - - .verse:after { - content: "\feff"; - } - - - /* =================================== */ - /* = Hide some elements for printing = */ - /* =================================== */ - - @media print { - #menu {display: none;} - } - </style> - <body> --> - <div id="book-text"> - <xsl:apply-templates select="powiesc|opowiadanie|liryka_l|liryka_lp|dramat_wierszowany_l|dramat_wierszowany_lp|dramat_wspolczesny" /> - <xsl:if test="count(descendant::*[self::pe or self::pa or self::pr or self::pt][not(parent::extra)])"> - <div id="footnotes"> - <h3>Przypisy</h3> - <xsl:for-each select="descendant::*[self::pe or self::pa or self::pr or self::pt][not(parent::extra)]"> - <div> - <a name="{concat('footnote-', generate-id(.))}" /> - <a href="{concat('#anchor-', generate-id(.))}" class="annotation">[<xsl:number value="count(preceding::*[self::pa or self::pe or self::pr or self::pt]) + 1" />]</a> - <xsl:choose> - <xsl:when test="count(akap|akap_cd|strofa) = 0"> - <p><xsl:apply-templates select="text()|*" mode="inline" /></p> - </xsl:when> - <xsl:otherwise> - <xsl:apply-templates select="text()|*" mode="inline" /> - </xsl:otherwise> - </xsl:choose> - </div> - </xsl:for-each> - </div> - </xsl:if> - </div> - <!-- </body> - </html> --> + <xsl:choose> + <xsl:when test="@full-page"> + <html> + <head> + <title>KsiÄ Å¼ka z serwisu WolneLektury.pl</title> + <meta charset="utf-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" /> + <link href="https://static.wolnelektury.pl/css/compressed/book_text.css" rel="stylesheet" type="text/css" /> + </head> + <body> + <xsl:call-template name="book-text" /> + </body> + </html> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name="book-text" /> + </xsl:otherwise> + </xsl:choose> +</xsl:template> + +<xsl:template name="book-text"> + <div id="book-text"> + <xsl:apply-templates select="powiesc|opowiadanie|liryka_l|liryka_lp|dramat_wierszowany_l|dramat_wierszowany_lp|dramat_wspolczesny" /> + <xsl:if test="count(descendant::*[self::pe or self::pa or self::pr or self::pt][not(parent::extra)])"> + <div id="footnotes"> + <h3>Przypisy</h3> + <xsl:for-each select="descendant::*[self::pe or self::pa or self::pr or self::pt][not(parent::extra)]"> + <div> + <xsl:attribute name="class">fn-<xsl:value-of select="name()" /></xsl:attribute> + <a name="{concat('footnote-', generate-id(.))}" /> + <a href="{concat('#anchor-', generate-id(.))}" class="annotation">[<xsl:number value="count(preceding::*[self::pa or self::pe or self::pr or self::pt]) + 1" />]</a> + <xsl:choose> + <xsl:when test="count(akap|akap_cd|strofa) = 0"> + <p><xsl:apply-templates select="text()|*" mode="inline" /> + <xsl:if test="name()='pa'"> [przypis autorski]</xsl:if> + <xsl:if test="name()='pt'"> [przypis tÅumacza]</xsl:if> + <xsl:if test="name()='pr'"> [przypis redakcyjny]</xsl:if> + <xsl:if test="name()='pe'"> [przypis edytorski]</xsl:if> + </p> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates select="text()|*" mode="inline" /> + </xsl:otherwise> + </xsl:choose> + </div> + </xsl:for-each> + </div> + </xsl:if> + </div> </xsl:template> @@ -415,6 +73,7 @@ <xsl:if test="nazwa_utworu"> <h1> <xsl:apply-templates select="autor_utworu|dzielo_nadrzedne|nazwa_utworu|podtytul" mode="header" /> + <xsl:call-template name="translators" /> </h1> </xsl:if> <xsl:apply-templates /> @@ -430,6 +89,7 @@ </xsl:template> <xsl:template match="lista_osob"> + <xsl:call-template name="section-anchor"/> <div class="person-list"> <h3><xsl:value-of select="naglowek_listy" /></h3> <ol> @@ -442,6 +102,10 @@ <div class="dedication"><xsl:apply-templates /></div> </xsl:template> +<xsl:template match="ramka"> + <div class="frame"><xsl:apply-templates /></div> +</xsl:template> + <xsl:template match="kwestia"> <div class="kwestia"> <xsl:apply-templates select="strofa|akap|didaskalia" /> @@ -453,7 +117,26 @@ </xsl:template> <xsl:template match="motto"> - <div class="motto"><xsl:apply-templates mode="inline" /></div> + <xsl:call-template name="section-anchor"/> + <div class="motto"><xsl:apply-templates /></div> +</xsl:template> + +<xsl:template match="ilustr" mode="inline"> + <xsl:apply-templates select="."/> +</xsl:template> + +<xsl:template match="ilustr"> + <img> + <xsl:attribute name="src"> + <xsl:value-of select="$gallery" /><xsl:value-of select="@src" /> + </xsl:attribute> + <xsl:attribute name="alt"> + <xsl:value-of select="@alt" /> + </xsl:attribute> + <xsl:attribute name="title"> + <xsl:value-of select="@alt" /> + </xsl:attribute> + </img> </xsl:template> @@ -480,23 +163,28 @@ <!-- Section headers (included in index)--> <xsl:template match="naglowek_akt|naglowek_czesc|srodtytul"> + <xsl:call-template name="section-anchor"/> <h2><xsl:apply-templates mode="inline" /></h2> </xsl:template> <xsl:template match="naglowek_scena|naglowek_rozdzial"> + <xsl:call-template name="section-anchor"/> <h3><xsl:apply-templates mode="inline" /></h3> </xsl:template> <xsl:template match="naglowek_osoba|naglowek_podrozdzial"> + <xsl:call-template name="section-anchor"/> <h4><xsl:apply-templates mode="inline" /></h4> </xsl:template> <!-- Other paragraph tags --> <xsl:template match="miejsce_czas"> + <xsl:call-template name="section-anchor"/> <p class="place-and-time"><xsl:apply-templates mode="inline" /></p> </xsl:template> <xsl:template match="didaskalia"> + <xsl:call-template name="section-anchor"/> <div class="didaskalia"><xsl:apply-templates mode="inline" /></div> </xsl:template> @@ -505,32 +193,40 @@ </xsl:template> <xsl:template match="akap|akap_dialog|akap_cd"> - <p class="paragraph"><xsl:apply-templates mode="inline" /></p> + <p class="paragraph"> + <xsl:call-template name="section-anchor"/> + <xsl:apply-templates mode="inline" /> + </p> +</xsl:template> + +<xsl:template match="strofa" mode="inline"> + <xsl:apply-templates select="." /> </xsl:template> <xsl:template match="strofa"> <div class="stanza"> + <xsl:call-template name="section-anchor"/> <xsl:choose> - <xsl:when test="count(br) > 0"> + <xsl:when test="count(br) > 0"> <xsl:call-template name="verse"> <xsl:with-param name="verse-content" select="br[1]/preceding-sibling::text() | br[1]/preceding-sibling::node()" /> - <xsl:with-param name="verse-type" select="br[1]/preceding-sibling::*[name() = 'wers_wciety' or name() = 'wers_akap' or name() = 'wers_cd'][1]" /> - </xsl:call-template> + <xsl:with-param name="verse-type" select="br[1]/preceding-sibling::*[name() = 'wers_wciety' or name() = 'wers_akap' or name() = 'wers_cd' or name() = 'wers_do_prawej'][1]" /> + </xsl:call-template> <xsl:for-each select="br"> <!-- Each BR tag "consumes" text after it --> <xsl:variable name="lnum" select="count(preceding-sibling::br)" /> <xsl:call-template name="verse"> - <xsl:with-param name="verse-content" + <xsl:with-param name="verse-content" select="following-sibling::text()[count(preceding-sibling::br) = $lnum+1] | following-sibling::node()[count(preceding-sibling::br) = $lnum+1]" /> - <xsl:with-param name="verse-type" select="following-sibling::*[count(preceding-sibling::br) = $lnum+1 and (name() = 'wers_wciety' or name() = 'wers_akap' or name() = 'wers_cd')][1]" /> + <xsl:with-param name="verse-type" select="following-sibling::*[count(preceding-sibling::br) = $lnum+1 and (name() = 'wers_wciety' or name() = 'wers_akap' or name() = 'wers_cd' or name() = 'wers_do_prawej')][1]" /> </xsl:call-template> </xsl:for-each> </xsl:when> <xsl:otherwise> <xsl:call-template name="verse"> <xsl:with-param name="verse-content" select="text() | node()" /> - <xsl:with-param name="verse-type" select="wers_wciety|wers_akap|wers_cd[1]" /> - </xsl:call-template> + <xsl:with-param name="verse-type" select="wers_wciety|wers_akap|wers_cd|wers_do_prawej[1]" /> + </xsl:call-template> </xsl:otherwise> </xsl:choose> </div> @@ -557,15 +253,41 @@ <xsl:when test="name($verse-type) = 'wers_cd'"> <xsl:attribute name="style">padding-left: 12em</xsl:attribute> </xsl:when> + <xsl:when test="name($verse-type) = 'wers_do_prawej'"> + <xsl:attribute name="style">text-align: right</xsl:attribute> + </xsl:when> </xsl:choose> <xsl:apply-templates select="$verse-content" mode="inline" /> </p> </xsl:template> <xsl:template match="motto_podpis"> + <xsl:call-template name="section-anchor"/> <p class="motto_podpis"><xsl:apply-templates mode="inline" /></p> </xsl:template> +<xsl:template match="tabela|tabelka"> + <xsl:call-template name="section-anchor"/> + <xsl:choose> + <xsl:when test="@ramka = '1'"> + <table class="border"><xsl:apply-templates /></table> + </xsl:when> + <xsl:otherwise> + <table><xsl:apply-templates /></table> + </xsl:otherwise> + </xsl:choose> +</xsl:template> +<xsl:template match="wiersz"> + <tr><xsl:apply-templates /></tr> +</xsl:template> +<xsl:template match="kol"> + <td><xsl:apply-templates mode="inline" /></td> +</xsl:template> + +<xsl:template match="mat"> + <math xmlns="http://www.w3.org/1998/Math/MathML"><xsl:copy-of select="*" /></math> +</xsl:template> + <!-- ================================================ --> <!-- = INLINE TAGS = --> @@ -579,7 +301,7 @@ <!-- Other inline tags --> <xsl:template match="mat" mode="inline"> - <em class="math"><xsl:apply-templates mode="inline" /></em> + <math xmlns="http://www.w3.org/1998/Math/MathML"><xsl:copy-of select="*" /></math> </xsl:template> <xsl:template match="didask_tekst" mode="inline"> @@ -600,6 +322,14 @@ <em class="author-emphasis"><xsl:apply-templates mode="inline" /></em> </xsl:template> +<xsl:template match="wieksze_odstepy" mode="inline"> + <em class="wieksze-odstepy"><xsl:apply-templates mode="inline" /></em> +</xsl:template> + +<xsl:template match="indeks_dolny" mode="inline"> + <sub><xsl:apply-templates mode="inline" /></sub> +</xsl:template> + <xsl:template match="osoba" mode="inline"> <em class="person"><xsl:apply-templates mode="inline" /></em> </xsl:template> @@ -651,6 +381,23 @@ </xsl:template> +<xsl:template name="translators"> + <xsl:if test="//dc:contributor.translator"> + <span class="translator"> + <xsl:text>tÅum. </xsl:text> + <xsl:for-each select="//dc:contributor.translator"> + <xsl:if test="position() != 1">, </xsl:if> + <xsl:apply-templates mode="person" /> + </xsl:for-each> + </span> + </xsl:if> +</xsl:template> + +<xsl:template match="text()" mode="person"> + <xsl:value-of select="wl:person_name(.)" /> +</xsl:template> + + <!-- ================ --> <!-- = IGNORED TAGS = --> <!-- ================ --> @@ -658,6 +405,7 @@ <xsl:template match="extra|uwaga" mode="inline" /> <xsl:template match="nota_red" /> +<xsl:template match="abstrakt" /> <!-- ======== --> <!-- = TEXT = --> @@ -667,5 +415,19 @@ <xsl:value-of select="wl:substitute_entities(.)" /> </xsl:template> +<!-- ========= --> +<!-- = utils = --> +<!-- ========= --> +<xsl:template name="section-anchor"> + <!-- + this formula works as follows: + - get all ancestors including self + - choose the header (third one from root): utwor/book-type/header + - get all preceding siblings + - count them + - create an <a name="sec123"/> tag. + --> + <a name="{concat('sec', count(ancestor-or-self::*[last()-2]/preceding-sibling::*) + 1)}" /> +</xsl:template> -</xsl:stylesheet> \ No newline at end of file +</xsl:stylesheet>