assigning ids 2.4.11
authorRadek Czajka <rczajka@rczajka.pl>
Mon, 3 Apr 2023 06:08:50 +0000 (08:08 +0200)
committerRadek Czajka <rczajka@rczajka.pl>
Mon, 3 Apr 2023 06:08:50 +0000 (08:08 +0200)
24 files changed:
setup.py
src/librarian/document.py
src/librarian/elements/blocks/dedykacja.py
src/librarian/elements/drama/didaskalia.py
src/librarian/elements/drama/lista_osob.py
src/librarian/elements/drama/miejsce_czas.py
src/librarian/elements/drama/naglowek_listy.py
src/librarian/elements/drama/naglowek_osoba.py
src/librarian/elements/figures/animacja.py
src/librarian/elements/figures/ilustr.py
src/librarian/elements/figures/tabela.py
src/librarian/elements/front/base.py
src/librarian/elements/front/motto.py
src/librarian/elements/front/motto_podpis.py
src/librarian/elements/headers/naglowek_czesc.py
src/librarian/elements/headers/naglowek_podrozdzial.py
src/librarian/elements/headers/naglowek_rozdzial.py
src/librarian/elements/headers/naglowek_scena.py
src/librarian/elements/headers/podtytul_czesc.py
src/librarian/elements/headers/podtytul_podrozdzial.py
src/librarian/elements/headers/podtytul_rozdzial.py
src/librarian/elements/paragraphs/akap.py
src/librarian/elements/poetry/strofa.py
src/librarian/xslt/book2html.xslt

index cdeb58f..c39d2bb 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -22,7 +22,7 @@ def whole_tree(prefix, path):
 
 setup(
     name='librarian',
-    version='2.4.10',
+    version='2.4.11',
     description='Converter from WolneLektury.pl XML-based language to XHTML, TXT and other formats',
     author="Marek StÄ™pniowski",
     author_email='marek@stepniowski.com',
index fbaf6ca..ea8a47a 100644 (file)
@@ -36,11 +36,37 @@ class WLDocument:
                 filename=self.provider.by_slug(part_uri.slug),
                 provider=self.provider
             )
-            
     
     def build(self, builder, base_url=None, **kwargs):
         return builder(base_url=base_url).build(self, **kwargs)
 
+    def assign_ids(self):
+        # Find all existing IDs.
+        existing = set()
+        que = [self.tree.getroot()]
+        while que:
+            item = que.pop(0)
+            try:
+                item.normalize_insides()
+            except AttributeError:
+                pass
+            existing.add(item.attrib.get('id'))
+            que.extend(item)
+
+        i = 1
+        que = [self.tree.getroot()]
+        while que:
+            item = que.pop(0)
+            que.extend(item)
+            if item.attrib.get('id'):
+                continue
+            if not getattr(item, 'SHOULD_HAVE_ID', False):
+                continue
+            while f'e{i}' in existing:
+                i += 1
+            item.attrib['id'] = f'e{i}'
+            i += 1
+    
     def _compat_assign_ordered_ids(self):
         """
         Compatibility: ids in document order, to be roughly compatible with legacy
index 7ac809d..6cb68c0 100644 (file)
@@ -2,6 +2,8 @@ from ..base import WLElement
 
 
 class Dedykacja(WLElement):
+    SHOULD_HAVE_ID = True
+
     TXT_LEGACY_TOP_MARGIN = 2
 
     EPUB_TAG = HTML_TAG = "div"
index bf81b69..11ae486 100644 (file)
@@ -2,6 +2,8 @@ from ..base import WLElement
 
 
 class Didaskalia(WLElement):
+    SHOULD_HAVE_ID = True
+
     TXT_TOP_PARGIN = 2
     TXT_BOTTOM_MARGIN = 2
     TXT_LEGACY_TOP_MARGIN = 2
index 269b05c..8895aa8 100644 (file)
@@ -4,6 +4,7 @@ from ..base import WLElement
 
 class ListaOsob(WLElement):
     CAN_HAVE_TEXT = False
+    SHOULD_HAVE_ID = True
 
     TXT_TOP_MARGIN = 3
     TXT_BOTTOM_MARGIN = 3
index cf47ed2..8908bea 100644 (file)
@@ -2,7 +2,8 @@ from ..paragraphs import Akap
 
 
 class MiejsceCzas(Akap):
-    EPUB_CLASS = HTML_CLASS = 'place-and-time'
+    SHOULD_HAVE_ID = True
 
     EPUB_TAG = "div"
+    EPUB_CLASS = HTML_CLASS = 'place-and-time'
     
index 1f164a4..2f3eec4 100644 (file)
@@ -2,6 +2,8 @@ from ..base import WLElement
 
 
 class NaglowekListy(WLElement):
+    SHOULD_HAVE_ID = True
+
     HTML_TAG = "h3"
 
     EPUB_TAG = "div"
index afa16ce..b3f918e 100644 (file)
@@ -2,6 +2,8 @@ from ..base import WLElement
 
 
 class NaglowekOsoba(WLElement):
+    SHOULD_HAVE_ID = True
+
     TXT_TOP_MARGIN = 3
     TXT_BOTTOM_MARGIN = 2
     TXT_LEGACY_TOP_MARGIN = 3
index e98fa88..a32f9e0 100644 (file)
@@ -2,6 +2,8 @@ from ..base import WLElement
 
 
 class Animacja(WLElement):
+    SHOULD_HAVE_ID = True
+
     HTML_TAG = 'div'
     HTML_CLASS = "animacja cycle-slideshow"
     HTML_ATTR = {
index af936fb..9b3b165 100644 (file)
@@ -4,6 +4,8 @@ from ..base import WLElement
 
 
 class Ilustr(WLElement):
+    SHOULD_HAVE_ID = True
+
     EPUB_TAG = HTML_TAG = 'img'
 
     def get_html_attr(self, builder):
index 7da7877..ba02b20 100644 (file)
@@ -2,6 +2,8 @@ from ..base import WLElement
 
 
 class Tabela(WLElement):
+    SHOULD_HAVE_ID = True
+
     EPUB_TAG = HTML_TAG = 'table'
 
     def get_html_attr(self, builder):
index 9e961df..90ec348 100644 (file)
@@ -3,6 +3,7 @@ from ..base import WLElement
 
 class HeaderElement(WLElement):
     HTML_TAG = 'span'
+    SHOULD_HAVE_ID = True
     
     def txt_build(self, builder):
         builder.enter_fragment('header')
index 7f23ea6..48eac66 100644 (file)
@@ -2,6 +2,8 @@ from ..base import WLElement
 
 
 class Motto(WLElement):
+    SHOULD_HAVE_ID = True
+
     TXT_LEGACY_TOP_MARGIN = 4
     TXT_LEGACY_BOTTOM_MARGIN = 2
 
index 8fee127..4b2ee0d 100644 (file)
@@ -2,6 +2,7 @@ from ..base import WLElement
 
 
 class MottoPodpis(WLElement):
+    SHOULD_HAVE_ID = True
     HTML_TAG = "p"
     EPUB_CLASS = HTML_CLASS = "motto_podpis"
 
index 829e4f4..9caceb0 100644 (file)
@@ -3,6 +3,7 @@ from ..base import WLElement
 
 class NaglowekCzesc(WLElement):
     SECTION_PRECEDENCE = 1
+    SHOULD_HAVE_ID = True
     
     TXT_TOP_MARGIN = 5
     TXT_BOTTOM_MARGIN = 2
index ee338eb..a7328f5 100644 (file)
@@ -3,6 +3,7 @@ from ..base import WLElement
 
 class NaglowekPodrozdzial(WLElement):
     SECTION_PRECEDENCE = 3
+    SHOULD_HAVE_ID = True
 
     TXT_TOP_MARGIN = 3
     TXT_BOTTOM_MARGIN = 2
index 33ff355..7492da4 100644 (file)
@@ -3,6 +3,7 @@ from ..base import WLElement
 
 class NaglowekRozdzial(WLElement):
     SECTION_PRECEDENCE = 2
+    SHOULD_HAVE_ID = True
     
     TXT_TOP_MARGIN = 4
     TXT_BOTTOM_MARGIN = 2
index 8a52ca2..e4e0fd1 100644 (file)
@@ -3,6 +3,7 @@ from ..base import WLElement
 
 class NaglowekScena(WLElement):
     SECTION_PRECEDENCE = 2
+    SHOULD_HAVE_ID = True
 
     TXT_TOP_MARGIN = 4
     TXT_BOTTOM_MARGIN = 2
index df8fd5c..405f2d6 100644 (file)
@@ -2,6 +2,8 @@ from ..base import WLElement
 
 
 class PodtytulCzesc(WLElement):
+    SHOULD_HAVE_ID = True
+
     TXT_TOP_MARGIN = 2
     TXT_BOTTOM_MARGIN = 2
 
index cc00207..d6fc2ec 100644 (file)
@@ -2,6 +2,8 @@ from ..base import WLElement
 
 
 class PodtytulPodrozdzial(WLElement):
+    SHOULD_HAVE_ID = True
+
     TXT_TOP_MARGIN = 2
     TXT_BOTTOM_MARGIN = 2
 
index f8db548..e30a5e2 100644 (file)
@@ -2,6 +2,8 @@ from ..base import WLElement
 
 
 class PodtytulRozdzial(WLElement):
+    SHOULD_HAVE_ID = True
+
     TXT_TOP_MARGIN = 2
     TXT_BOTTOM_MARGIN = 2
 
index 18f69d7..004f8ec 100644 (file)
@@ -3,6 +3,7 @@ from ..base import WLElement
 
 class Akap(WLElement):
     STRIP = True
+    SHOULD_HAVE_ID = True
 
     TXT_TOP_MARGIN = 2
     TXT_BOTTOM_MARGIN = 2
index a843d20..e925571 100644 (file)
@@ -5,6 +5,8 @@ from .wers import Wers
 
 
 class Strofa(WLElement):
+    SHOULD_HAVE_ID = True
+
     TXT_TOP_MARGIN = 2
     TXT_BOTTOM_MARGIN = 2
     TXT_LEGACY_TOP_MARGIN = 1
index 2057326..c0567e8 100644 (file)
 
 <xsl:template match="motto">
     <xsl:call-template name="section-anchor"/>
-    <div class="motto"><xsl:apply-templates /></div>
+    <div class="motto">
+      <xsl:call-template name="block-args" />
+      <xsl:apply-templates />
+    </div>
 </xsl:template>
 
 <xsl:template match="ilustr" mode="inline">
 
 <xsl:template match="ilustr">
   <div>
+    <xsl:call-template name="block-args" />
 
     <xsl:attribute name="class">
       <xsl:text>ilustr </xsl:text>
 
 <xsl:template match="animacja">
   <div class="animacja cycle-slideshow" data-cycle-pause-on-hover="true" data-cycle-next="> img" data-cycle-fx="fadeout" data-cycle-paused="true">
+    <xsl:call-template name="block-args" />
     <xsl:apply-templates/>
   </div>
 </xsl:template>
 <!-- ========================================== -->
 <!-- Title page -->
 <xsl:template match="autor_utworu" mode="header">
-    <span class="author"><xsl:apply-templates mode="inline" /></span>
+  <span class="author">
+    <xsl:call-template name="block-args" />
+    <xsl:apply-templates mode="inline" />
+  </span>
 </xsl:template>
 
 <xsl:template match="nazwa_utworu" mode="header">
-    <span class="title"><xsl:apply-templates mode="inline" /></span>
+  <span class="title">
+    <xsl:call-template name="block-args" />
+    <xsl:apply-templates mode="inline" />
+  </span>
 </xsl:template>
 
 <xsl:template match="dzielo_nadrzedne" mode="header">
-    <span class="collection"><xsl:apply-templates mode="inline" /></span>
+  <span class="collection">
+    <xsl:call-template name="block-args" />
+    <xsl:apply-templates mode="inline" />
+  </span>
 </xsl:template>
 
 <xsl:template match="podtytul" mode="header">
-    <span class="subtitle"><xsl:apply-templates mode="inline" /></span>
+  <span class="subtitle">
+    <xsl:call-template name="block-args" />
+    <xsl:apply-templates mode="inline" />
+  </span>
 </xsl:template>
 
 <!-- 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>
+  <h2>
+    <xsl:call-template name="block-args" />
+    <xsl:apply-templates mode="inline" />
+  </h2>
 </xsl:template>
 
 <xsl:template match="podtytul_akt|podtytul_czesc">
   <div class="subtitle2">
+    <xsl:call-template name="block-args" />
     <xsl:apply-templates mode="inline" />
   </div>
 </xsl:template>
 
 <xsl:template match="naglowek_scena|naglowek_rozdzial">
     <xsl:call-template name="section-anchor"/>
-    <h3><xsl:apply-templates mode="inline" /></h3>
+    <h3>
+      <xsl:call-template name="block-args" />
+      <xsl:apply-templates mode="inline" />
+    </h3>
 </xsl:template>
 
 <xsl:template match="podtytul_scena|podtytul_rozdzial">
   <div class="subtitle3">
+    <xsl:call-template name="block-args" />
     <xsl:apply-templates mode="inline" />
   </div>
 </xsl:template>
 
 <xsl:template match="naglowek_osoba|naglowek_podrozdzial">
-      <xsl:call-template name="section-anchor"/>
-    <h4><xsl:apply-templates mode="inline" /></h4>
+  <xsl:call-template name="section-anchor"/>
+  <h4>
+    <xsl:call-template name="block-args" />
+    <xsl:apply-templates mode="inline" />
+  </h4>
 </xsl:template>
 
 <xsl:template match="podtytul_podrozdzial">
   <div class="subtitle4">
+    <xsl:call-template name="block-args" />
     <xsl:apply-templates mode="inline" />
   </div>
 </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:call-template name="section-anchor"/>
+  <p class="place-and-time">
+    <xsl:call-template name="block-args" />
+    <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:call-template name="section-anchor"/>
+  <div class="didaskalia">
+    <xsl:call-template name="block-args" />
+    <xsl:apply-templates mode="inline" />
+  </div>
 </xsl:template>
 
 <xsl:template match="lista_osoba">
 
 <xsl:template match="akap|akap_dialog|akap_cd">
     <p class="paragraph">
+      <xsl:call-template name="block-args" />
       <xsl:call-template name="section-anchor"/>
        <xsl:apply-templates mode="inline" />
     </p>
 </xsl:template>
 
 <xsl:template match="strofa">
-    <div class="stanza">
+  <div class="stanza">
+    <xsl:call-template name="block-args" />
       <xsl:call-template name="section-anchor"/>
         <xsl:choose>
             <xsl:when test="count(br) > 0">
 
 <xsl:template match="motto_podpis">
     <xsl:call-template name="section-anchor"/>
-    <p class="motto_podpis"><xsl:apply-templates mode="inline" /></p>
+    <p class="motto_podpis">
+      <xsl:call-template name="block-args" />
+      <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>
+          <table class="border">
+            <xsl:call-template name="block-args" />
+            <xsl:apply-templates />
+          </table>
         </xsl:when>
         <xsl:otherwise>
-            <table><xsl:apply-templates /></table>
+          <table>
+            <xsl:call-template name="block-args" />
+            <xsl:apply-templates />
+          </table>
         </xsl:otherwise>
     </xsl:choose>
 </xsl:template>
         <a name="{concat('sec', count(ancestor-or-self::*[last()-2]/preceding-sibling::*) + 1)}" />
 </xsl:template>
 
+<xsl:template name="block-args">
+  <xsl:if test="@id">
+    <xsl:attribute name="id">
+      <xsl:text>wl-</xsl:text>
+      <xsl:value-of select="@id"/>
+    </xsl:attribute>
+  </xsl:if>
+</xsl:template>
+
 <xsl:template match="numeracja">
        <span class="numeracja">
                <xsl:attribute name="data-start">