New Element-based builder API (WiP).
[librarian.git] / src / librarian / elements / poetry / strofa.py
diff --git a/src/librarian/elements/poetry/strofa.py b/src/librarian/elements/poetry/strofa.py
new file mode 100644 (file)
index 0000000..2d3a4c9
--- /dev/null
@@ -0,0 +1,50 @@
+from copy import copy
+from ..base import WLElement
+from .wers import Wers
+
+
+class Strofa(WLElement):
+    TXT_TOP_MARGIN = 2
+    TXT_BOTTOM_MARGIN = 2
+    TXT_LEGACY_TOP_MARGIN = 1
+    TXT_LEGACY_BOTTOM_MARGIN = 0
+
+    def get_verses(self):
+        from librarian.parser import parser
+
+        verses = [
+            parser.makeelement('wers')
+        ]
+        if self.text:
+            # Before any tags. These are text-only verses.
+            pieces = self.text.split('/')
+            for piece in pieces[:-1]:
+                verses[-1].text = piece
+                verses.append(parser.makeelement('wers'))
+            verses[-1].text = pieces[-1]
+
+        for child in self:
+            if child.tail:
+                pieces = child.tail.split('/')
+                child_copy = copy(child)
+                child_copy.tail = pieces[0]
+                verses[-1].append(child_copy)
+
+                for piece in pieces[1:]:
+                    verses.append(parser.makeelement('wers'))
+                    verses[-1].text = piece
+                
+            else:
+                verses[-1].append(child)
+
+        for verse in verses:
+            if len(verse) == 1 and isinstance(verse[0], Wers):
+                assert not (verse.text or '').strip()
+                assert not (verse[0].tail or '').strip()
+                yield verse[0]
+            else:
+                yield verse
+
+    def _build_inner(self, builder, build_method):
+        for child in self.get_verses():
+            getattr(child, build_method)(builder)