diff fontaine/document.py @ 0:243401c49520

Initial commit.
author Ludovic Chabant <ludovic@chabant.com>
date Mon, 02 Jan 2017 12:30:49 -0800
parents
children 74b83e3d921e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fontaine/document.py	Mon Jan 02 12:30:49 2017 -0800
@@ -0,0 +1,97 @@
+import sys
+
+
+class FontaineDocument:
+    def __init__(self):
+        self.title_values = {}
+        self.scenes = []
+
+    def addScene(self, header=None):
+        s = FontaineScene()
+        if header:
+            s.header = header
+        self.scenes.append(s)
+        return s
+
+    def lastScene(self, auto_create=True):
+        try:
+            return self.scenes[-1]
+        except IndexError:
+            if auto_create:
+                s = self.addScene()
+                return s
+            return None
+
+    def lastParagraph(self):
+        s = self.lastScene(False)
+        if s:
+            return s.lastParagraph()
+        return None
+
+
+class FontaineScene:
+    def __init__(self):
+        self.header = None
+        self.paragraphs = []
+        self._adders = {}
+
+    def __getattr__(self, name):
+        if name.startswith('add'):
+            add_type_name = name[3:]
+            try:
+                adder = self._adders[add_type_name]
+            except KeyError:
+                module = sys.modules[__name__]
+                add_type = getattr(module,
+                                   'TYPE_%s' % add_type_name.upper())
+
+                def _type_adder(_text):
+                    self.paragraphs.append(
+                        FontaineSceneElement(add_type, _text))
+
+                adder = _type_adder
+                self._adders[add_type_name] = adder
+            return adder
+        else:
+            raise AttributeError
+
+    def lastParagraph(self):
+        try:
+            return self.paragraphs[-1]
+        except IndexError:
+            return None
+
+
+class FontaineSceneElement:
+    def __init__(self, el_type, text):
+        self.type = el_type
+        self.text = text
+
+    def __str__(self):
+        return '%s: %s' % (
+            _scene_element_type_str(self.type),
+            _ellipsis(self.text, 15))
+
+
+TYPE_ACTION = 0
+TYPE_CHARACTER = 1
+TYPE_DIALOG = 2
+TYPE_PARENTHETICAL = 3
+
+
+def _scene_element_type_str(t):
+    if t == TYPE_ACTION:
+        return 'ACTION'
+    if t == TYPE_CHARACTER:
+        return 'CHARACTER'
+    if t == TYPE_DIALOG:
+        return 'DIALOG'
+    if t == TYPE_PARENTHETICAL:
+        return 'PARENTHETICAL'
+    raise NotImplementedError()
+
+
+def _ellipsis(text, length):
+    if len(text) > length:
+        return text[:length - 3] + '...'
+    return text