annotate fontaine/renderer.py @ 8:02d2e4d8b0c1

Make renderers responsible for formatting the title page.
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 04 Jan 2017 02:55:20 -0800
parents e3d52edde00b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import re
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
2 from fontaine.document import (
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
3 TYPE_ACTION, TYPE_CENTEREDACTION, TYPE_CHARACTER, TYPE_DIALOG,
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
4 TYPE_PARENTHETICAL, TYPE_TRANSITION, TYPE_LYRICS, TYPE_PAGEBREAK)
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
5
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
6
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
7 class BaseDocumentRenderer:
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
8 def __init__(self, text_renderer=None):
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
9 self.text_renderer = text_renderer
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
10 if not text_renderer:
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
11 self.text_renderer = NullTextRenderer()
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
12
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
13 self._para_rdrs = {
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
14 TYPE_ACTION: self.write_action,
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
15 TYPE_CENTEREDACTION: self.write_centeredaction,
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
16 TYPE_CHARACTER: self.write_character,
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
17 TYPE_DIALOG: self.write_dialog,
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
18 TYPE_PARENTHETICAL: self.write_parenthetical,
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
19 TYPE_TRANSITION: self.write_transition,
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
20 TYPE_LYRICS: self.write_lyrics,
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
21 TYPE_PAGEBREAK: self.write_pagebreak,
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
22 }
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
23
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
24 def _tr(self, text):
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
25 return self.text_renderer.render_text(text)
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
26
7
e3d52edde00b Make renderers write to a provided output stream.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
27 def render_doc(self, doc, out):
e3d52edde00b Make renderers write to a provided output stream.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
28 self.write_header(doc, out)
e3d52edde00b Make renderers write to a provided output stream.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
29 self.render_title_page(doc.title_values, out)
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
30 for s in doc.scenes:
7
e3d52edde00b Make renderers write to a provided output stream.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
31 self.render_scene(s, out)
e3d52edde00b Make renderers write to a provided output stream.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
32 self.write_footer(doc, out)
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
33
7
e3d52edde00b Make renderers write to a provided output stream.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
34 def render_title_page(self, values, out):
8
02d2e4d8b0c1 Make renderers responsible for formatting the title page.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
35 clean_values = values.copy()
02d2e4d8b0c1 Make renderers responsible for formatting the title page.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
36 clean_values.setdefault('title', 'Untitled Screenplay')
02d2e4d8b0c1 Make renderers responsible for formatting the title page.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
37 clean_values.setdefault('credit', 'Written by')
02d2e4d8b0c1 Make renderers responsible for formatting the title page.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
38 clean_values.setdefault('author', 'Unknown')
02d2e4d8b0c1 Make renderers responsible for formatting the title page.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
39 for k in clean_values:
02d2e4d8b0c1 Make renderers responsible for formatting the title page.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
40 clean_values[k] = self._tr(clean_values[k])
02d2e4d8b0c1 Make renderers responsible for formatting the title page.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
41 self.write_title_page(clean_values, out)
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
42
7
e3d52edde00b Make renderers write to a provided output stream.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
43 def render_scene(self, scene, out):
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
44 if scene.header is not None:
7
e3d52edde00b Make renderers write to a provided output stream.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
45 self.write_scene_heading(scene.header, out)
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
46 for p in scene.paragraphs:
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
47 rdr_func = self._para_rdrs[p.type]
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
48 if p.type != TYPE_PAGEBREAK:
7
e3d52edde00b Make renderers write to a provided output stream.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
49 rdr_func(self._tr(p.text), out)
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
50 else:
7
e3d52edde00b Make renderers write to a provided output stream.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
51 rdr_func(out)
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
52
7
e3d52edde00b Make renderers write to a provided output stream.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
53 def write_header(self, doc, out):
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
54 pass
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
55
7
e3d52edde00b Make renderers write to a provided output stream.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
56 def write_footer(self, doc, out):
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
57 pass
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
58
8
02d2e4d8b0c1 Make renderers responsible for formatting the title page.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
59 def write_title_page(self, values, out):
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
60 raise NotImplementedError()
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
61
7
e3d52edde00b Make renderers write to a provided output stream.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
62 def write_scene_heading(self, text, out):
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
63 raise NotImplementedError()
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
64
7
e3d52edde00b Make renderers write to a provided output stream.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
65 def write_action(self, text, out):
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
66 raise NotImplementedError()
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
67
7
e3d52edde00b Make renderers write to a provided output stream.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
68 def write_centeredaction(self, text, out):
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
69 raise NotImplementedError()
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
70
7
e3d52edde00b Make renderers write to a provided output stream.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
71 def write_character(self, text, out):
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
72 raise NotImplementedError()
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
73
7
e3d52edde00b Make renderers write to a provided output stream.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
74 def write_dialog(self, text, out):
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
75 raise NotImplementedError()
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
76
7
e3d52edde00b Make renderers write to a provided output stream.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
77 def write_parenthetical(self, text, out):
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
78 raise NotImplementedError()
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
79
7
e3d52edde00b Make renderers write to a provided output stream.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
80 def write_transition(self, text, out):
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
81 raise NotImplementedError()
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
82
7
e3d52edde00b Make renderers write to a provided output stream.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
83 def write_lyrics(self, text, out):
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
84 raise NotImplementedError()
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
85
7
e3d52edde00b Make renderers write to a provided output stream.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
86 def write_pagebreak(self, out):
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
87 raise NotImplementedError()
1
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
88
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
89
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
90 RE_ITALICS = re.compile(
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
91 r"(?P<before>^|\s)(?P<esc>\\)?\*(?P<text>.*[^\s\*])\*(?=[^a-zA-Z0-9\*]|$)")
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
92 RE_BOLD = re.compile(
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
93 r"(?P<before>^|\s)(?P<esc>\\)?\*\*(?P<text>.*[^\s])\*\*(?=[^a-zA-Z0-9]|$)")
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
94 RE_UNDERLINE = re.compile(
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
95 r"(?P<before>^|\s)(?P<esc>\\)?_(?P<text>.*[^\s])_(?=[^a-zA-Z0-9]|$)")
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
96
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
97
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
98 class BaseTextRenderer:
1
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
99 def render_text(self, text):
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
100 # Replace bold stuff to catch double asterisks.
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
101 text = RE_BOLD.sub(self._do_make_bold, text)
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
102 text = RE_ITALICS.sub(self._do_make_italics, text)
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
103 text = RE_UNDERLINE.sub(self._do_make_underline, text)
1
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
104
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
105 return text
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
106
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
107 def _do_make_italics(self, m):
1
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
108 if m.group('esc'):
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
109 return m.group('before') + '*' + m.group('text') + '*'
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
110 return (
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
111 m.group('before') +
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
112 self.make_italics(m.group('text')))
1
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
113
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
114 def _do_make_bold(self, m):
1
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
115 if m.group('esc'):
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
116 return m.group('before') + '**' + m.group('text') + '**'
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
117 return (
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
118 m.group('before') +
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
119 self.make_bold(m.group('text')))
1
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
120
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
121 def _do_make_underline(self, m):
1
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
122 if m.group('esc'):
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
123 return m.group('before') + '_' + m.group('text') + '_'
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
124 return (
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
125 m.group('before') +
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
126 self.make_underline(m.group('text')))
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
127
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
128 def make_italics(self, text):
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
129 raise NotImplementedError()
1
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
130
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
131 def make_bold(self, text):
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
132 raise NotImplementedError()
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
133
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
134 def make_underline(self, text):
1
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
135 raise NotImplementedError()
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
136
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
137
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
138 class NullTextRenderer(BaseTextRenderer):
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
139 def make_bold(self, text):
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
140 return text
1
74b83e3d921e Add more states, add more tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
141
3
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
142 def make_italics(self, text):
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
143 return text
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
144
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
145 def make_underline(self, text):
6019eee799bf Add base classes for rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
146 return text