0
|
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
|