cgitb is sometimes more trouble than it is worth, so make a flag
[objavi2.git] / config.py
blob8e39af12652426898b975179ab17c6dbba2ad912
1 # Part of Objavi2, which makes pdf versions of FLOSSManuals books.
2 # This python module contains or encapsulates configuration and
3 # constant data.
5 # Copyright (C) 2009 Douglas Bagnall
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 2 of the License, or
10 # (at your option) any later version.
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License along
18 # with this program; if not, write to the Free Software Foundation, Inc.,
19 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 """This module contains constant values used to produce books.
22 """
23 #XXX eventually, read in a real config file.
24 #XXX Some of these values should be editable via an admin cgi script
26 #Not really configurable (72 pt per inch / 25.4 mm per inch)
27 POINT_2_MM = 25.4 / 72.0
28 MM_2_POINT = 72.0 / 25.4
29 INCH_2_POINT = 72
31 KEEP_TEMP_FILES=True
32 TMPDIR = 'tmp'
34 FIREFOX = 'firefox'
35 WKHTMLTOPDF = '/usr/local/bin/wkhtmltopdf-static'
36 WKHTMLTOPDF_EXTRA_COMMANDS = []
37 #WKHTMLTOPDF_EXTRA_COMMANDS = ['--outline', '-t']
39 #CGITB_DOMAINS = ('203.97.236.46', '202.78.240.7')
40 CGITB_DOMAINS = False
42 #bookland is used to make isbn barcodes
43 BOOKLAND = 'bookland/bookland'
45 # how many pages to number in one pdfedit process (which has
46 # exponential memory leak)
47 PDFEDIT_MAX_PAGES = 40
49 #keep book lists around for this time without refetching
50 BOOK_LIST_CACHE = 3600 * 2
51 BOOK_LIST_CACHE_DIR = 'cache'
53 TOC_URL = "http://%s/pub/%s/_index/TOC.txt"
54 BOOK_URL = "http://%s/bin/view/%s/_all?skin=text"
55 PUBLISH_URL = "/books/"
57 #leave out vowels so as to avoid accidental words, and punctuation for bidi consistency
58 CHAPTER_COOKIE_CHARS = 'BCDFGHJKLMNPQRSTVWXYZ'
60 DEFAULT_SERVER = 'en.flossmanuals.net'
61 DEFAULT_SIZE = 'COMICBOOK'
62 DEFAULT_ENGINE = 'webkit'
63 #DEFAULT_MODE = None
65 RTL_SCRIPTS = ['persian', 'arabic', 'hebrew', 'urdu']
67 SERVER_DEFAULTS = {
68 'en.flossmanuals.net': {
69 'css-book': 'static/en.flossmanuals.net.css',
70 'css-web': 'static/en.flossmanuals.net-web.css',
71 'css-newspaper': 'static/en.flossmanuals.net-newspaper.css',
72 'lang': 'en',
73 'dir': 'LTR',
75 'fr.flossmanuals.net': {
76 'css-book': 'static/fr.flossmanuals.net.css',
77 'css-web': 'static/fr.flossmanuals.net.css',
78 'css-newspaper': 'static/fr.flossmanuals.net.css',
79 'css': 'static/fr.flossmanuals.net.css',
80 'lang': 'fr',
81 'dir': 'LTR',
83 'translate.flossmanuals.net': {
84 'css-book': 'static/translate.flossmanuals.net.css',
85 'css-web': 'static/translate.flossmanuals.net.css',
86 'css-newspaper': 'static/translate.flossmanuals.net.css',
87 'css': 'static/translate.flossmanuals.net.css',
88 'lang': 'translate',
89 'dir': 'LTR',
91 'nl.flossmanuals.net': {
92 'css-book': 'static/nl.flossmanuals.net.css',
93 'css-web': 'static/nl.flossmanuals.net.css',
94 'css-newspaper': 'static/nl.flossmanuals.net.css',
95 'css': 'static/nl.flossmanuals.net.css',
96 'lang': 'nl',
97 'dir': 'LTR',
99 'bn.flossmanuals.net': {
100 'css-book': 'static/bn.flossmanuals.net.css',
101 'css-web': 'static/bn.flossmanuals.net.css',
102 'css-newspaper': 'static/bn.flossmanuals.net.css',
103 'css': 'static/bn.flossmanuals.net.css',
104 'lang': 'bn',
105 'dir': 'LTR',
107 'fa.flossmanuals.net': {
108 'css-book': 'static/fa.flossmanuals.net.css',
109 'css-web': 'static/fa.flossmanuals.net.css',
110 'css-newspaper': 'static/fa.flossmanuals.net.css',
111 'css': 'static/fa.flossmanuals.net.css',
112 'lang': 'fa',
113 'dir': 'RTL',
117 # uncomment a debug mode to get messages about that topic.
118 DEBUG_MODES = (
119 #'STARTUP',
120 #'INDEX',
121 #'PDFEDIT',
122 #'PDFGEN',
123 #'HTMLGEN',
125 DEBUG_ALL = False
127 #convert all sizes to points
128 PAPER_SIZES = [(s, x * MM_2_POINT, y * MM_2_POINT) for s, x, y in (
129 ("A5", 148, 210),
130 #("B5", 176, 250),
131 ("A4", 210, 297),
132 #("B4", 250, 353),
133 ("A3", 297, 420),
134 #("B3", 353, 500),
135 ("A2", 420, 594),
136 #("B2", 500, 707),
137 ("A1", 594, 841),
138 #("B1", 707, 1000),
139 ("A0", 841, 1189),
140 ("B0", 1000, 1414),
143 # margins are BASE_MARGIN + PROPORTIONAL_MARGIN * min(width, height)
144 BASE_MARGIN = 22
145 PROPORTIONAL_MARGIN = 0.04
146 # gutter is BASE_GUTTER + PROPORTIONAL_GUTTER * width
147 BASE_GUTTER = 15
148 PROPORTIONAL_GUTTER = 0.011
150 PAGE_EXTREMA = {
151 'page_width': (1, 3000, MM_2_POINT),
152 'page_height': (1, 3000, MM_2_POINT),
153 'gutter': (-1000, 1000, MM_2_POINT),
154 'top_margin': (0, 1500, MM_2_POINT),
155 'side_margin': (0, 1500, MM_2_POINT),
156 'bottom_margin': (0, 1500, MM_2_POINT),
157 "columns": (1, 20, 1),
158 "column_margin": (0, 1000, MM_2_POINT),
161 PAGE_NUMBER_SIZE = 11 #XXX this is not used by pdfedit! (ie, it is a guess)
163 PAGE_SIZE_DATA = {
164 'COMICBOOK': {'pointsize': ((6.625 * 72), (10.25 * 72)), 'class': "lulu"},
165 "POCKET": {'pointsize': (4.25 * 72, 6.875 * 72), 'class': "lulu"},
167 "USLETTER": {'pointsize': (8.5 * 72, 11 * 72), 'class': "lulu"},
168 "USTRADE": {'pointsize': (6 * 72, 9 * 72), 'class': "lulu"},
169 "LANDSCAPE9x7": {'pointsize': (9 * 72, 7 * 72), 'class': "lulu"},
170 "SQUARE7.5": {'pointsize': (7.5 * 72, 7.5 * 72), 'class': "lulu"},
171 "ROYAL": {'pointsize': (6.139 * 72, 9.21 * 72), 'class': "lulu"},
172 "CROWNQUARTO": {'pointsize': (7.444 * 72, 9.681 * 72), 'class': "lulu"},
173 "SQUARE8.5": {'pointsize': (8.5 * 72, 8.5 * 72), 'class': "lulu"},
175 "A5": {'pointsize': (148 * MM_2_POINT, 210 * MM_2_POINT), 'class': "lulu iso"},
176 "A4": {'pointsize': (210 * MM_2_POINT, 297 * MM_2_POINT), 'class': "lulu iso"},
177 "A3 (NZ Tabloid)": {'pointsize': (297 * MM_2_POINT, 420 * MM_2_POINT), 'class': 'iso newspaper'},
178 "A2 (NZ Broadsheet)": {'pointsize': (420 * MM_2_POINT, 594 * MM_2_POINT), 'class': 'iso newspaper'},
179 "A1": {'pointsize': (594 * MM_2_POINT, 841 * MM_2_POINT), 'class': 'iso'},
180 "B4": {'pointsize': (250 * MM_2_POINT, 353 * MM_2_POINT), 'class': 'iso'},
181 "B3": {'pointsize': (353 * MM_2_POINT, 500 * MM_2_POINT), 'class': 'iso'},
182 "B2": {'pointsize': (500 * MM_2_POINT, 707 * MM_2_POINT), 'class': 'iso'},
183 "B1": {'pointsize': (707 * MM_2_POINT, 1000 * MM_2_POINT), 'class': 'iso'},
185 "UK Tabloid": {'pointsize': (11 * INCH_2_POINT, 17 * INCH_2_POINT), 'class': 'newspaper'},
186 "UK Broadsheet": {'pointsize': (18 * INCH_2_POINT, 24 * INCH_2_POINT), 'class': 'newspaper'},
187 "US Broadsheet": {'pointsize': (15 * INCH_2_POINT, 22.75 * INCH_2_POINT), 'class': 'newspaper'},
188 "Berliner" : {'pointsize': (315 * MM_2_POINT, 470 * MM_2_POINT), 'class': 'newspaper'},
189 "Foolscap (F4)": {'pointsize': (210 * MM_2_POINT, 330 * MM_2_POINT)},
190 #"Foolscap Folio": {'pointsize': (8.5 * INCH_2_POINT, 13.5 * INCH_2_POINT)},
192 "custom": {'class': "custom"},
195 PAGE_MIN_SIZE = (1.0, 1.0)
196 PAGE_MAX_SIZE = (3000.0, 3000.0)
198 ENGINES = {
199 'webkit' : [],
200 #'gecko' : [],
203 INSIDE_FRONT_COVER_TEMPLATE = 'templates/inside-front-cover.%s.html'
204 END_MATTER_TEMPLATE = 'templates/end_matter.%s.html'
206 FONT_LIST_INCLUDE = 'cache/font-list.inc'
207 FONT_LIST_URL = '/font-list.cgi.pdf'
208 FONT_EXAMPLE_SCRIPT_DIR = 'templates/font-list'
210 # for the license field, with a view to making it a drop down.
211 LICENSES = ('GPL', 'GPLv2', 'GPLv2+', 'GPLv3', 'GPLv3+', 'LGPL', 'LGPLv2.1',
212 'BSD', 'public domain', 'MIT', 'Artistic', 'CC-BY', 'CC-BY-SA')
214 DEFAULT_LICENSE = 'GPLv2+'
216 CGI_MODES = { # arguments are: (publication, )
217 'book': (True,),
218 'newspaper': (True,),
219 'web': (True,),
220 #'openoffice': (True,),
221 'booklist': (False,),
222 'css': (False,),
223 'form': (False,),
226 DEFAULT_MODE = 'book'
229 FORM_INPUTS = (
230 ("server", "FLOSS Manuals server", "select", "server_options", "", ""),
231 ("book", "Manual", "select", "book_options", "", ""),
232 ("title", "Book title", "input[type=text]", None, "", ""),
233 ("license", "License", "select", "licenses", "", ""),
235 ("isbn", "ISBN", "input[type=text]", None, "advanced", "(13 digits)"),
236 ("mode", "Document type", "select", "pdf_types", "advanced", ""),
238 ("booksize", "Page size", "select", "size_options", "advanced", '(Size compatibility: <span class="lulu">Lulu</span>, <span class="newspaper">newspapers</span>, <span class="iso">ISO standards</span>)'),
239 ("page_width", "Page width", "input[type=text]", None, "advanced booksize numeric-field", ""),
240 ("page_height", "Page height", "input[type=text]", None, "advanced booksize numeric-field", ""),
242 ("top_margin", "Top margin", "input[type=text]", None, "advanced margins numeric-field", ""),
243 ("side_margin", "Side margin", "input[type=text]", None, "advanced margins numeric-field", ""),
244 ("bottom_margin", "Bottom margin", "input[type=text]", None, "advanced margins numeric-field", ""),
245 ("gutter", "Gutter", "input[type=text]", None, "advanced margins numeric-field", ""),
247 ("columns", "Columns", "input[type=text]", None, "advanced columns numeric-field", ""),
248 ("column_margin", "Column margin", "input[type=text]", None, "advanced columns numeric-field", ""),
250 #("css_customise", "Customise CSS", "input[type=checkbox]", None, "advanced", "Enter a URL or "),
251 ("css-url", "CSS URL", "input[type=text][disabled]", "css_url", "advanced css-url", ""),
252 ("font_list", "Available fonts", "ul", "font_list", "advanced css-custom", ""),
253 ("font_links", "Font examples", "ul", "font_links", "advanced css-custom", ""),
254 ("css", "CSS", "textarea", "css", "advanced css-custom", ""),
256 ("rotate", "Rotate pages for binding", "input[type=checkbox]", None, "advanced", "(for RTL books on LTR printing presses, and vice versa)."),
257 ("engine", "Layout engine", "select", "engines", "advanced", ""),
258 #("header", "Header Text", "input[type=text]", None, "advanced", ""),
261 FORM_ELEMENT_TYPES = {
262 'input[type=text]' : '<input type="text" id="%(id)s" name="%(id)s" value="%(val)s" />',
263 'input[type=text][disabled]' : '<input type="text" disabled="disabled" id="%(id)s" name="%(id)s" value="%(val)s" />',
264 'input[type=checkbox]' : '<input type="checkbox" id="%(id)s" name="%(id)s" value="%(val)s" />',
265 'textarea' : '<textarea id="%(id)s" name="%(id)s">%(val)s</textarea>',
266 'select': '<select id="%(id)s" name="%(id)s">%(val)s</select>',
267 'ul': '<ul id="%(id)s">%(val)s</ul>',
270 PROGRESS_POINTS = (
271 ("__init__", "Initialise the book", ('book', 'newspaper', 'web')),
272 ("load_book", "Fetch the book", ('book', 'newspaper', 'web')),
273 ("load_toc", "Fetch TOC metadata", ('book', 'newspaper', 'web')),
274 ("add_css", "Add css", ('book', 'newspaper', 'web')),
275 ("add_section_titles", "Add section titles", ('book', 'newspaper', 'web')),
276 ("generate_pdf", "Generate the main pdf", ('book', 'newspaper', 'web')),
277 ("reshape_pdf", "Cut pages to size", ('book', 'newspaper',)),
278 #('make_body_pdf', "Generate the main pdf", ('book', 'newspaper', 'web')),
279 ("number_pdf", "Number pages", ('book', 'newspaper',)),
280 ("make_contents", "Calculate Table of Contents", ('book',)),
281 ("make_preamble_pdf", "Generate preamble pdf", ('book',)),
282 ('make_end_matter_pdf', "Generate end matter pdf", ('book',)),
283 ("concatenated_pdfs", "concatenate the pdfs", ('book',)),
284 #("publish_pdf", "Publish the pdf", ('book', 'newspaper', 'web')),
285 ("finished", "Finished!", ('book', 'newspaper', 'web')),
288 if __name__ == '__main__':
289 print ', '.join(x for x in globals().keys() if not x.startswith('_'))