comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:243401c49520
1 import sys
2
3
4 class FontaineDocument:
5 def __init__(self):
6 self.title_values = {}
7 self.scenes = []
8
9 def addScene(self, header=None):
10 s = FontaineScene()
11 if header:
12 s.header = header
13 self.scenes.append(s)
14 return s
15
16 def lastScene(self, auto_create=True):
17 try:
18 return self.scenes[-1]
19 except IndexError:
20 if auto_create:
21 s = self.addScene()
22 return s
23 return None
24
25 def lastParagraph(self):
26 s = self.lastScene(False)
27 if s:
28 return s.lastParagraph()
29 return None
30
31
32 class FontaineScene:
33 def __init__(self):
34 self.header = None
35 self.paragraphs = []
36 self._adders = {}
37
38 def __getattr__(self, name):
39 if name.startswith('add'):
40 add_type_name = name[3:]
41 try:
42 adder = self._adders[add_type_name]
43 except KeyError:
44 module = sys.modules[__name__]
45 add_type = getattr(module,
46 'TYPE_%s' % add_type_name.upper())
47
48 def _type_adder(_text):
49 self.paragraphs.append(
50 FontaineSceneElement(add_type, _text))
51
52 adder = _type_adder
53 self._adders[add_type_name] = adder
54 return adder
55 else:
56 raise AttributeError
57
58 def lastParagraph(self):
59 try:
60 return self.paragraphs[-1]
61 except IndexError:
62 return None
63
64
65 class FontaineSceneElement:
66 def __init__(self, el_type, text):
67 self.type = el_type
68 self.text = text
69
70 def __str__(self):
71 return '%s: %s' % (
72 _scene_element_type_str(self.type),
73 _ellipsis(self.text, 15))
74
75
76 TYPE_ACTION = 0
77 TYPE_CHARACTER = 1
78 TYPE_DIALOG = 2
79 TYPE_PARENTHETICAL = 3
80
81
82 def _scene_element_type_str(t):
83 if t == TYPE_ACTION:
84 return 'ACTION'
85 if t == TYPE_CHARACTER:
86 return 'CHARACTER'
87 if t == TYPE_DIALOG:
88 return 'DIALOG'
89 if t == TYPE_PARENTHETICAL:
90 return 'PARENTHETICAL'
91 raise NotImplementedError()
92
93
94 def _ellipsis(text, length):
95 if len(text) > length:
96 return text[:length - 3] + '...'
97 return text