Basic biblical tools.
[librarian.git] / src / librarian / elements / footnotes / __init__.py
index 82f6497..a342e05 100644 (file)
@@ -1,20 +1,46 @@
+# This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
+# Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
+#
 from ..base import WLElement
 
 
 class Footnote(WLElement):
+    NO_TOC = True
+    DISABLE_NUMBERING = True
+    START_INLINE = True
+    ASIDE = True
+    NUMBERING = 'fn'
+
+    def signal(self, signal):
+        if signal == 'INLINE':
+            self.START_INLINE = False
+        else:
+            super().signal(signal)
+    
     def txt_build(self, builder):
         pass
 
     def html_build(self, builder):
-        builder.footnote_counter += 1
-        fn_no = builder.footnote_counter
-        footnote_id = 'footnote-idm{}'.format(self.attrib['_compat_ordered_id'])
-        anchor_id = 'anchor-idm{}'.format(self.attrib['_compat_ordered_id'])
+        if not builder.with_footnotes:
+            return
+
+        fn_no = self.attrib.get('_visible_numbering')
+        footnote_id = 'footnote-id{}'.format(fn_no)
+        anchor_id = 'anchor-id{}'.format(fn_no)
 
-        builder.start_element('a', {"href": '#{}'.format(footnote_id), "class": "annotation"})
+        # Add anchor.
+        builder.start_element(
+            'a',
+            {
+                "href": '#{}'.format(footnote_id),
+                "class": "annotation-anchor",
+                "id": anchor_id,
+            }
+        )
         builder.push_text('[{}]'.format(fn_no))
         builder.end_element()
         
+        # Add actual footnote.
         builder.enter_fragment('footnotes')
         builder.start_element('div', {'class': 'fn-{}'.format(self.tag)})
         builder.push_text('\n') # Compat
@@ -34,6 +60,49 @@ class Footnote(WLElement):
         builder.end_element()
         builder.exit_fragment()
 
+    def epub_build(self, builder):
+        fn_no = builder.assign_footnote_number()
+        part_number = getattr(
+            builder,
+            'chunk_counter',
+            1
+        )
+
+        builder.start_element(
+            'a',
+            {
+                'class': 'anchor',
+                'id': f'anchor-{fn_no}',
+                'href': f'annotations.xhtml#annotation-{fn_no}',
+            }
+        )
+        builder.start_element('sup', {})
+        builder.push_text(str(fn_no))
+        builder.end_element()
+        builder.end_element()
+
+        
+        builder.enter_fragment('footnotes')
+        builder.start_element('div', {
+            'id': f'annotation-{fn_no}',
+            'class': "annotation"
+        })
+        builder.start_element('a', {
+            'href': f"part{part_number}.xhtml#anchor-{fn_no}"
+        })
+        builder.push_text(str(fn_no))
+        builder.end_element()
+        builder.push_text('. ')
+
+        super().epub_build(builder)
+        builder.push_text(' [' + self.qualifier + ']')
+        builder.end_element()
+
+        builder.push_text('\n')
+
+        builder.exit_fragment()
+
+        
 
 class PA(Footnote):
     """Przypis autorski."""
@@ -65,3 +134,11 @@ class PE(Footnote):
     def qualifier(self):
         _ = self.gettext
         return _("source editor's footnote")
+
+
+class PTrad(Footnote):
+    """Przypis tradycyjny."""
+    @property
+    def qualifier(self):
+        _ = self.gettext
+        return _("traditional footnote")