Mercurial > jouvence
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 |