annotate fontaine/html.py @ 9:a5488b474c6b

Add HTML renderer.
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 04 Jan 2017 02:56:08 -0800
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import os.path
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 from markupsafe import escape
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
3 from .renderer import BaseDocumentRenderer, BaseTextRenderer
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6 def _elem(out, elem_name, class_name, contents):
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7 f = out.write
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8 f('<%s' % elem_name)
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9 if class_name:
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10 f(' class="fontaine-%s"' % class_name)
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11 f('>')
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 f(contents)
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13 f('</%s>\n' % elem_name)
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16 def _br(text, strip_first=False):
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 lines = text.split('\n')
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 if strip_first and lines[0].strip() == '':
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 lines = lines[1:]
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 return '<br/>\n'.join(lines)
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23 def _res(filename):
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 path = os.path.join(os.path.dirname(__file__), 'resources', filename)
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25 with open(path, 'r') as fp:
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 return fp.read()
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29 class HtmlDocumentRenderer(BaseDocumentRenderer):
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30 def __init__(self, standalone=True):
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31 super().__init__(HtmlTextRenderer())
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32 self.standalone = standalone
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
34 def get_css(self):
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
35 return _res('html_styles.css')
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
36
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37 def write_header(self, doc, out):
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38 if self.standalone:
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39 meta = doc.title_values.get
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40 data = {
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
41 # TODO: need a "strip formatting" to have a clean title.
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42 'title': meta('title', "Fountain Screenplay"),
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
43 'description': meta('description', ''),
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
44 'css': self.get_css()
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
45 }
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46 out.write(_res('html_header.html') % data)
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
47 out.write('<div class="fontaine-doc">\n')
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
48
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49 def write_footer(self, doc, out):
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 out.write('</div>\n')
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
51 if self.standalone:
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52 out.write(_res('html_footer.html'))
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54 def write_title_page(self, values, out):
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55 out.write('<div class="fontaine-title-page">\n')
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57 _elem(out, 'h1', None, _br(values['title']))
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
58 _elem(out, 'p', 'title-page-heading', _br(values['credit']))
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
59 _elem(out, 'p', 'title-page-heading', _br(values['author']))
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
60
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
61 ddate = values.get('date') or values.get('draft date')
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
62 if ddate:
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
63 _elem(out, 'p', 'title-page-footer', _br(ddate))
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
64 contact = values.get('contact')
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
65 if contact:
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
66 _elem(out, 'p', 'title-page-footer', _br(contact))
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
67
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
68 out.write('</div>\n')
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
69 self.write_pagebreak(out)
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
70
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
71 def write_scene_heading(self, text, out):
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
72 _elem(out, 'p', 'scene-heading', text)
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
73
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
74 def write_action(self, text, out):
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
75 _elem(out, 'p', 'action', _br(text, True))
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
76
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
77 def write_centeredaction(self, text, out):
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
78 _elem(out, 'p', 'action-centered', _br(text, True))
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
79
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
80 def write_character(self, text, out):
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
81 _elem(out, 'p', 'character', text)
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
82
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
83 def write_dialog(self, text, out):
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
84 _elem(out, 'p', 'dialog', _br(text))
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
85
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
86 def write_parenthetical(self, text, out):
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
87 _elem(out, 'p', 'parenthetical', text)
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
88
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
89 def write_transition(self, text, out):
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
90 _elem(out, 'p', 'transition', text)
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
91
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
92 def write_lyrics(self, text, out):
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
93 _elem(out, 'p', 'lyrics', _br(text, True))
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
94
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
95 def write_pagebreak(self, out):
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
96 out.write('<hr/>\n')
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
97
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
98
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
99 class HtmlTextRenderer(BaseTextRenderer):
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
100 def render_text(self, text):
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
101 return super().render_text(escape(text))
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
102
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
103 def make_italics(self, text):
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
104 return '<em>%s</em>' % text
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
105
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
106 def make_bold(self, text):
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
107 return '<strong>%s</strong>' % text
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
108
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
109 def make_underline(self, text):
a5488b474c6b Add HTML renderer.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
110 return '<u>%s</u>' % text