##// END OF EJS Templates
svgoutput
Matthias BUSSONNIER -
Show More
@@ -1,102 +1,108 b''
1 1 """Base classes for the notebook conversion pipeline.
2 2
3 3 This module defines Converter, from which all objects designed to implement
4 4 a conversion of IPython notebooks to some other format should inherit.
5 5 """
6 6 #-----------------------------------------------------------------------------
7 7 # Copyright (c) 2012, the IPython Development Team.
8 8 #
9 9 # Distributed under the terms of the Modified BSD License.
10 10 #
11 11 # The full license is in the file COPYING.txt, distributed with this software.
12 12 #-----------------------------------------------------------------------------
13 13
14 14 #-----------------------------------------------------------------------------
15 15 # Imports
16 16 #-----------------------------------------------------------------------------
17 17
18 18 from __future__ import print_function, absolute_import
19 19
20 20 # Stdlib imports
21 21 import jinja2
22 22 import codecs
23 23 import io
24 24 import logging
25 25 import os
26 26 import pprint
27 27 import re
28 28 from types import FunctionType
29 29
30 30 from jinja2 import Environment, PackageLoader, FileSystemLoader
31 31 env = Environment(loader=FileSystemLoader('./templates/'))
32 32
33 33 # IPython imports
34 34 from IPython.nbformat import current as nbformat
35 35 from IPython.config.configurable import Configurable, SingletonConfigurable
36 36 from IPython.utils.traitlets import (List, Unicode, Type, Bool, Dict, CaselessStrEnum,
37 37 Any)
38 38
39 39 # Our own imports
40 40 from IPython.utils.text import indent
41 41 from .utils import remove_ansi
42 42 from markdown import markdown
43 from .utils import highlight
43 from .utils import highlight,ansi2html
44 44 #-----------------------------------------------------------------------------
45 45 # Class declarations
46 46 #-----------------------------------------------------------------------------
47 47 def rm_fake(strng):
48 48 return strng.replace('/files/', '')
49 49
50 50 class ConversionException(Exception):
51 51 pass
52 52
53 53
54 54 def python_comment(string):
55 55 return '# '+'\n# '.join(string.split('\n'))
56 56
57 57 env.filters['pycomment'] = python_comment
58 58 env.filters['indent'] = indent
59 59 env.filters['rm_fake'] = rm_fake
60 60 env.filters['rm_ansi'] = remove_ansi
61 61 env.filters['markdown'] = markdown
62 62 env.filters['highlight'] = highlight
63 env.filters['ansi2html'] = ansi2html
63 64
64 65 class ConverterTemplate(Configurable):
65 66
66 67 display_data_priority = ['pdf', 'svg', 'png', 'jpg', 'text']
67 68 #-------------------------------------------------------------------------
68 69 # Instance-level attributes that are set in the constructor for this
69 70 # class.
70 71 #-------------------------------------------------------------------------
71 72 infile = Any()
72 73
73 74
74 75 infile_dir = Unicode()
75 76
76 77 def __init__(self, tplfile='fullhtml', config=None, **kw):
77 78 self.template = env.get_template(tplfile+'.tpl')
78 79 super(ConverterTemplate,self).__init__(config=config)
79 80
80 81 def _get_prompt_number(self, cell):
81 82 return cell.prompt_number if hasattr(cell, 'prompt_number') \
82 83 else self.blank_symbol
83 84
84 85
85 86 def process(self):
86 87 converted_cells = []
87 88 for worksheet in self.nb.worksheets:
88 89 for cell in worksheet.cells:
89 90 cell.type = cell.cell_type
91 cell.haspyout = False
92 for out in cell.get('outputs',[]):
93 if out.output_type == 'pyout':
94 cell.haspyout = True
95 break
90 96 converted_cells.append(worksheet)
91 97
92 98 return converted_cells
93 99
94 100 def convert(self, cell_separator='\n'):
95 101 return self.template.render(worksheets=self.process())
96 102
97 103
98 104 def read(self, filename):
99 105 "read and parse notebook into NotebookNode called self.nb"
100 106 with io.open(filename) as f:
101 107 self.nb = nbformat.read(f, 'json')
102 108
@@ -1,80 +1,96 b''
1 1 {%- extends 'null.tpl' -%}
2 2
3 3
4 4
5 5 {% block codecell %}
6 6 <div class="cell border-box-sizing code_cell vbox">
7 7 {{ super() }}</div>
8 8 {%- endblock codecell %}
9 9
10 10 {% block input_group -%}
11 11 <div class="input hbox">
12 12 {{super()}}
13 13 </div>
14 14 {% endblock input_group %}
15 15
16 16 {% block output_group -%}
17 17 <div class="vbox output_wrapper">
18 18 <div class="output vbox">
19 19 <div class="hbox output_area">
20 20 {{ super() }}
21 21 </div>
22 22 </div>
23 23 </div>
24 24 {% endblock output_group %}
25 25
26 26
27 27 {% block in_prompt -%}
28 28 <div class="prompt input_prompt">In&nbsp;[{{cell.prompt_number}}]:</div>
29 29 {%- endblock in_prompt %}
30 30
31 31 {% block output_prompt -%}
32 32 <div class="prompt output_prompt">
33 {%- if cell.prompt_number is not none -%}
34 {#- check the case of Out[#]-#}
33 {%- if cell.haspyout -%}
35 34 Out[{{cell.prompt_number}}]:
36 35 {%- endif -%}
37 36 </div>
38 37 {% endblock output_prompt %}
39 38
40 39 {% block input %}
41 40 <div class="input_area box-flex1">
42 41 {{cell.input | highlight }}
43 42 </div>
44 43 {%- endblock input %}
45 44
46 45
47 46 {% block markdowncell scoped %}
48 47 <div class="text_cell_render border-box-sizing rendered_html">
49 48 {{ cell.source | markdown| rm_fake}}
50 49 </div>
51 50 {%- endblock markdowncell %}
52 51
53 52 {% block headingcell scoped %}
54 53 <div class="text_cell_render border-box-sizing rendered_html">
55 54 <h{{cell.level}}>
56 55 {{cell.source}}
57 56 </h{{cell.level}}>
58 57 </div>
59 58 {% endblock headingcell %}
60 59
61 60 {% block rawcell scoped %}
62 {{ cell.source | pycomment }}
61 {{ cell.source }}
63 62 {% endblock rawcell %}
64 63
65 64 {% block unknowncell scoped %}
66 65 unknown type {{cell.type}}
67 66 {% endblock unknowncell %}
68 67
69 68
70 69 {% block pyout -%}
71 70 <div class="output_subarea output_pyout">
72 <pre>{{output.text}}</pre>
71 <pre>{{output.text | ansi2html}}</pre>
73 72 </div>
74 73 {%- endblock pyout %}
75 74
76 75 {% block stream -%}
77 76 <div class="output_subarea output_stream output_stdout">
78 <pre>{{output.text}}</pre>
77 <pre>{{output.text |ansi2html}}</pre>
79 78 </div>
80 79 {%- endblock stream %}
80
81 {% block display_data -%}
82 <div class="output_subarea output_display_data">
83 {{output.svg}}
84 </div>
85 {%- endblock display_data %}
86
87
88 {% block pyerr -%}
89 <div class="output_subarea output_pyerr">
90 <pre>{{super()}}</pre>
91 </div>
92 {%- endblock pyerr %}
93
94 {%- block traceback_line %}
95 {{line| ansi2html}}
96 {%- endblock traceback_line %}
@@ -1,787 +1,786 b''
1 1 {%- extends 'basichtml.tpl' -%}
2 2
3 3 {%- block header -%}
4 4 <html>
5 5 <head>
6 6 <style type="text/css">
7 7 /**
8 8 * HTML5 ✰ Boilerplate
9 9 *
10 10 * style.css contains a reset, font normalization and some base styles.
11 11 *
12 12 * Credit is left where credit is due.
13 13 * Much inspiration was taken from these projects:
14 14 * - yui.yahooapis.com/2.8.1/build/base/base.css
15 15 * - camendesign.com/design/
16 16 * - praegnanz.de/weblog/htmlcssjs-kickstart
17 17 */
18 18
19 19
20 20 /**
21 21 * html5doctor.com Reset Stylesheet (Eric Meyer's Reset Reloaded + HTML5 baseline)
22 22 * v1.6.1 2010-09-17 | Authors: Eric Meyer & Richard Clark
23 23 * html5doctor.com/html-5-reset-stylesheet/
24 24 */
25 25
26 26 html, body, div, span, object, iframe,
27 27 h1, h2, h3, h4, h5, h6, p, blockquote, pre,
28 28 abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp,
29 29 small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li,
30 30 fieldset, form, label, legend,
31 31 table, caption, tbody, tfoot, thead, tr, th, td,
32 32 article, aside, canvas, details, figcaption, figure,
33 33 footer, header, hgroup, menu, nav, section, summary,
34 34 time, mark, audio, video {
35 35 margin: 0;
36 36 padding: 0;
37 37 border: 0;
38 38 font-size: 100%;
39 39 font: inherit;
40 40 vertical-align: baseline;
41 41 }
42 42
43 43 sup { vertical-align: super; }
44 44 sub { vertical-align: sub; }
45 45
46 46 article, aside, details, figcaption, figure,
47 47 footer, header, hgroup, menu, nav, section {
48 48 display: block;
49 49 }
50 50
51 51 blockquote, q { quotes: none; }
52 52
53 53 blockquote:before, blockquote:after,
54 54 q:before, q:after { content: ""; content: none; }
55 55
56 56 ins { background-color: #ff9; color: #000; text-decoration: none; }
57 57
58 58 mark { background-color: #ff9; color: #000; font-style: italic; font-weight: bold; }
59 59
60 60 del { text-decoration: line-through; }
61 61
62 62 abbr[title], dfn[title] { border-bottom: 1px dotted; cursor: help; }
63 63
64 64 table { border-collapse: collapse; border-spacing: 0; }
65 65
66 66 hr { display: block; height: 1px; border: 0; border-top: 1px solid #ccc; margin: 1em 0; padding: 0; }
67 67
68 68 input, select { vertical-align: middle; }
69 69
70 70
71 71 /**
72 72 * Font normalization inspired by YUI Library's fonts.css: developer.yahoo.com/yui/
73 73 */
74 74
75 75 body { font:13px/1.231 sans-serif; *font-size:small; } /* Hack retained to preserve specificity */
76 76 select, input, textarea, button { font:99% sans-serif; }
77 77
78 78 /* Normalize monospace sizing:
79 79 en.wikipedia.org/wiki/MediaWiki_talk:Common.css/Archive_11#Teletype_style_fix_for_Chrome */
80 80 pre, code, kbd, samp { font-family: monospace, sans-serif; }
81 81
82 82 em,i { font-style: italic; }
83 83 b,strong { font-weight: bold; }
84 84
85 85 </style>
86 86 <style type="text/css">
87 87
88 88 /* Flexible box model classes */
89 89 /* Taken from Alex Russell http://infrequently.org/2009/08/css-3-progress/ */
90 90
91 91 .hbox {
92 92 display: -webkit-box;
93 93 -webkit-box-orient: horizontal;
94 94 -webkit-box-align: stretch;
95 95
96 96 display: -moz-box;
97 97 -moz-box-orient: horizontal;
98 98 -moz-box-align: stretch;
99 99
100 100 display: box;
101 101 box-orient: horizontal;
102 102 box-align: stretch;
103 103 }
104 104
105 105 .hbox > * {
106 106 -webkit-box-flex: 0;
107 107 -moz-box-flex: 0;
108 108 box-flex: 0;
109 109 }
110 110
111 111 .vbox {
112 112 display: -webkit-box;
113 113 -webkit-box-orient: vertical;
114 114 -webkit-box-align: stretch;
115 115
116 116 display: -moz-box;
117 117 -moz-box-orient: vertical;
118 118 -moz-box-align: stretch;
119 119
120 120 display: box;
121 121 box-orient: vertical;
122 122 box-align: stretch;
123 123 }
124 124
125 125 .vbox > * {
126 126 -webkit-box-flex: 0;
127 127 -moz-box-flex: 0;
128 128 box-flex: 0;
129 129 }
130 130
131 131 .reverse {
132 132 -webkit-box-direction: reverse;
133 133 -moz-box-direction: reverse;
134 134 box-direction: reverse;
135 135 }
136 136
137 137 .box-flex0 {
138 138 -webkit-box-flex: 0;
139 139 -moz-box-flex: 0;
140 140 box-flex: 0;
141 141 }
142 142
143 143 .box-flex1, .box-flex {
144 144 -webkit-box-flex: 1;
145 145 -moz-box-flex: 1;
146 146 box-flex: 1;
147 147 }
148 148
149 149 .box-flex2 {
150 150 -webkit-box-flex: 2;
151 151 -moz-box-flex: 2;
152 152 box-flex: 2;
153 153 }
154 154
155 155 .box-group1 {
156 156 -webkit-box-flex-group: 1;
157 157 -moz-box-flex-group: 1;
158 158 box-flex-group: 1;
159 159 }
160 160
161 161 .box-group2 {
162 162 -webkit-box-flex-group: 2;
163 163 -moz-box-flex-group: 2;
164 164 box-flex-group: 2;
165 165 }
166 166
167 167 .start {
168 168 -webkit-box-pack: start;
169 169 -moz-box-pack: start;
170 170 box-pack: start;
171 171 }
172 172
173 173 .end {
174 174 -webkit-box-pack: end;
175 175 -moz-box-pack: end;
176 176 box-pack: end;
177 177 }
178 178
179 179 .center {
180 180 -webkit-box-pack: center;
181 181 -moz-box-pack: center;
182 182 box-pack: center;
183 183 }
184 184
185 185 </style>
186 186 <style type="text/css">
187 187 /**
188 188 * Primary styles
189 189 *
190 190 * Author: IPython Development Team
191 191 */
192 192
193 193
194 194 body {
195 195 overflow: hidden;
196 196 }
197 197
198 198 blockquote {
199 199 border-left: 4px solid #DDD;
200 200 padding: 0 15px;
201 201 color: #777;
202 202 }
203 203
204 204 span#save_widget {
205 205 padding: 5px;
206 206 margin: 0px 0px 0px 300px;
207 207 display:inline-block;
208 208 }
209 209
210 210 span#notebook_name {
211 211 height: 1em;
212 212 line-height: 1em;
213 213 padding: 3px;
214 214 border: none;
215 215 font-size: 146.5%;
216 216 }
217 217
218 218 .ui-menubar-item .ui-button .ui-button-text {
219 219 padding: 0.4em 1.0em;
220 220 font-size: 100%;
221 221 }
222 222
223 223 .ui-menu {
224 224 -moz-box-shadow: 0px 6px 10px -1px #adadad;
225 225 -webkit-box-shadow: 0px 6px 10px -1px #adadad;
226 226 box-shadow: 0px 6px 10px -1px #adadad;
227 227 }
228 228
229 229 .ui-menu .ui-menu-item a {
230 230 border: 1px solid transparent;
231 231 padding: 2px 1.6em;
232 232 }
233 233
234 234 .ui-menu .ui-menu-item a.ui-state-focus {
235 235 margin: 0;
236 236 }
237 237
238 238 .ui-menu hr {
239 239 margin: 0.3em 0;
240 240 }
241 241
242 242 #menubar_container {
243 243 position: relative;
244 244 }
245 245
246 246 #notification_area {
247 247 position: absolute;
248 248 right: 0px;
249 249 top: 0px;
250 250 height: 25px;
251 251 padding: 3px 0px;
252 252 padding-right: 3px;
253 253 z-index: 10;
254 254 }
255 255
256 256 .notification_widget{
257 257 float : right;
258 258 right: 0px;
259 259 top: 1px;
260 260 height: 25px;
261 261 padding: 3px 6px;
262 262 z-index: 10;
263 263 }
264 264
265 265 .toolbar {
266 266 padding: 3px 15px;
267 267 }
268 268
269 269 #cell_type {
270 270 font-size: 85%;
271 271 }
272 272
273 273
274 274 div#main_app {
275 275 width: 100%;
276 276 position: relative;
277 277 }
278 278
279 279 span#quick_help_area {
280 280 position: static;
281 281 padding: 5px 0px;
282 282 margin: 0px 0px 0px 0px;
283 283 }
284 284
285 285 .help_string {
286 286 float: right;
287 287 width: 170px;
288 288 padding: 0px 5px;
289 289 text-align: left;
290 290 font-size: 85%;
291 291 }
292 292
293 293 .help_string_label {
294 294 float: right;
295 295 font-size: 85%;
296 296 }
297 297
298 298 div#notebook_panel {
299 299 margin: 0px 0px 0px 0px;
300 300 padding: 0px;
301 301 }
302 302
303 303 div#notebook {
304 304 overflow-y: scroll;
305 305 overflow-x: auto;
306 306 width: 100%;
307 307 /* This spaces the cell away from the edge of the notebook area */
308 308 padding: 5px 5px 15px 5px;
309 309 margin: 0px;
310 310 background-color: white;
311 311 }
312 312
313 313 div#pager_splitter {
314 314 height: 8px;
315 315 }
316 316
317 317 #pager_container {
318 318 position : relative;
319 319 }
320 320
321 321 div#pager {
322 322 padding: 15px;
323 323 overflow: auto;
324 324 display: none;
325 325 }
326 326
327 327 div.ui-widget-content {
328 328 border: 1px solid #aaa;
329 329 outline: none;
330 330 }
331 331
332 332 .cell {
333 333 border: 1px solid transparent;
334 334 }
335 335
336 336 div.cell {
337 337 width: 100%;
338 338 padding: 5px 5px 5px 0px;
339 339 /* This acts as a spacer between cells, that is outside the border */
340 340 margin: 2px 0px 2px 0px;
341 341 }
342 342
343 343 div.code_cell {
344 344 background-color: white;
345 345 }
346 346
347 347 /* any special styling for code cells that are currently running goes here */
348 348 div.code_cell.running {
349 349 }
350 350
351 351 div.prompt {
352 352 /* This needs to be wide enough for 3 digit prompt numbers: In[100]: */
353 353 width: 11ex;
354 354 /* This 0.4em is tuned to match the padding on the CodeMirror editor. */
355 355 padding: 0.4em;
356 356 margin: 0px;
357 357 font-family: monospace;
358 358 text-align:right;
359 359 }
360 360
361 361 div.input {
362 362 page-break-inside: avoid;
363 363 }
364 364
365 365 /* input_area and input_prompt must match in top border and margin for alignment */
366 366 div.input_area {
367 367 color: black;
368 368 border: 1px solid #ddd;
369 369 border-radius: 3px;
370 370 background: #f7f7f7;
371 371 }
372 372
373 373 div.input_prompt {
374 374 color: navy;
375 375 border-top: 1px solid transparent;
376 376 }
377 377
378 378 div.output_wrapper {
379 379 /* This is a spacer between the input and output of each cell */
380 380 margin-top: 5px;
381 381 margin-left: 5px;
382 382 /* FF needs explicit width to stretch */
383 383 width: 100%;
384 384 /* this position must be relative to enable descendents to be absolute within it */
385 385 position: relative;
386 386 }
387 387
388 388 /* class for the output area when it should be height-limited */
389 389 div.output_scroll {
390 390 /* ideally, this would be max-height, but FF barfs all over that */
391 391 height: 24em;
392 392 /* FF needs this *and the wrapper* to specify full width, or it will shrinkwrap */
393 393 width: 100%;
394 394
395 395 overflow: auto;
396 396 border-radius: 3px;
397 397 box-shadow: inset 0 2px 8px rgba(0, 0, 0, .8);
398 398 }
399 399
400 400 /* output div while it is collapsed */
401 401 div.output_collapsed {
402 402 margin-right: 5px;
403 403 }
404 404
405 405 div.out_prompt_overlay {
406 406 height: 100%;
407 407 padding: 0px;
408 408 position: absolute;
409 409 border-radius: 3px;
410 410 }
411 411
412 412 div.out_prompt_overlay:hover {
413 413 /* use inner shadow to get border that is computed the same on WebKit/FF */
414 414 box-shadow: inset 0 0 1px #000;
415 415 background: rgba(240, 240, 240, 0.5);
416 416 }
417 417
418 418 div.output_prompt {
419 419 color: darkred;
420 420 /* 5px right shift to account for margin in parent container */
421 421 margin: 0 5px 0 -5px;
422 422 }
423 423
424 424 /* This class is the outer container of all output sections. */
425 425 div.output_area {
426 426 padding: 0px;
427 427 page-break-inside: avoid;
428 428 }
429 429
430 430 /* This class is for the output subarea inside the output_area and after
431 431 the prompt div. */
432 432 div.output_subarea {
433 433 padding: 0.44em 0.4em 0.4em 1px;
434 434 }
435 435
436 436 /* The rest of the output_* classes are for special styling of the different
437 437 output types */
438 438
439 439 /* all text output has this class: */
440 440 div.output_text {
441 441 text-align: left;
442 442 color: black;
443 443 font-family: monospace;
444 444 }
445 445
446 446 /* stdout/stderr are 'text' as well as 'stream', but pyout/pyerr are *not* streams */
447 447 div.output_stream {
448 448 padding-top: 0.0em;
449 449 padding-bottom: 0.0em;
450 450 }
451 451 div.output_stdout {
452 452 }
453 453 div.output_stderr {
454 454 background: #fdd; /* very light red background for stderr */
455 455 }
456 456
457 457 div.output_latex {
458 458 text-align: left;
459 459 color: black;
460 460 }
461 461
462 462 div.output_html {
463 463 }
464 464
465 465 div.output_png {
466 466 }
467 467
468 468 div.output_jpeg {
469 469 }
470 470
471 471 div.text_cell {
472 472 background-color: white;
473 473 padding: 5px 5px 5px 5px;
474 474 }
475 475
476 476 div.text_cell_input {
477 477 color: black;
478 478 border: 1px solid #ddd;
479 479 border-radius: 3px;
480 480 background: #f7f7f7;
481 481 }
482 482
483 483 div.text_cell_render {
484 484 font-family: "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif;
485 485 outline: none;
486 486 resize: none;
487 487 width: inherit;
488 488 border-style: none;
489 489 padding: 5px;
490 490 color: black;
491 491 }
492 492
493 493 /* The following gets added to the <head> if it is detected that the user has a
494 494 * monospace font with inconsistent normal/bold/italic height. See
495 495 * notebookmain.js. Such fonts will have keywords vertically offset with
496 496 * respect to the rest of the text. The user should select a better font.
497 497 * See: https://github.com/ipython/ipython/issues/1503
498 498 *
499 499 * .CodeMirror span {
500 500 * vertical-align: bottom;
501 501 * }
502 502 */
503 503
504 504 .CodeMirror {
505 505 line-height: 1.231; /* Changed from 1em to our global default */
506 506 }
507 507
508 508 .CodeMirror-scroll {
509 509 height: auto; /* Changed to auto to autogrow */
510 510 /* The CodeMirror docs are a bit fuzzy on if overflow-y should be hidden or visible.*/
511 511 /* We have found that if it is visible, vertical scrollbars appear with font size changes.*/
512 512 overflow-y: hidden;
513 513 overflow-x: auto; /* Changed from auto to remove scrollbar */
514 514 }
515 515
516 516 /* CSS font colors for translated ANSI colors. */
517 517
518 518
519 519 .ansiblack {color: black;}
520 520 .ansired {color: darkred;}
521 521 .ansigreen {color: darkgreen;}
522 522 .ansiyellow {color: brown;}
523 523 .ansiblue {color: darkblue;}
524 524 .ansipurple {color: darkviolet;}
525 525 .ansicyan {color: steelblue;}
526 526 .ansigrey {color: grey;}
527 527 .ansibold {font-weight: bold;}
528 528
529 529 .completions {
530 530 position: absolute;
531 531 z-index: 10;
532 532 overflow: hidden;
533 533 border: 1px solid grey;
534 534 }
535 535
536 536 .completions select {
537 537 background: white;
538 538 outline: none;
539 539 border: none;
540 540 padding: 0px;
541 541 margin: 0px;
542 542 overflow: auto;
543 543 font-family: monospace;
544 544 }
545 545
546 546 option.context {
547 547 background-color: #DEF7FF;
548 548 }
549 549 option.introspection {
550 550 background-color: #EBF4EB;
551 551 }
552 552
553 553 /*fixed part of the completion*/
554 554 .completions p b {
555 555 font-weight:bold;
556 556 }
557 557
558 558 .completions p {
559 559 background: #DDF;
560 560 /*outline: none;
561 561 padding: 0px;*/
562 562 border-bottom: black solid 1px;
563 563 padding: 1px;
564 564 font-family: monospace;
565 565 }
566 566
567 567 pre.dialog {
568 568 background-color: #f7f7f7;
569 569 border: 1px solid #ddd;
570 570 border-radius: 3px;
571 571 padding: 0.4em;
572 572 padding-left: 2em;
573 573 }
574 574
575 575 p.dialog {
576 576 padding : 0.2em;
577 577 }
578 578
579 579 .shortcut_key {
580 580 display: inline-block;
581 581 width: 15ex;
582 582 text-align: right;
583 583 font-family: monospace;
584 584 }
585 585
586 586 .shortcut_descr {
587 587 }
588 588
589 589 /* Word-wrap output correctly. This is the CSS3 spelling, though Firefox seems
590 590 to not honor it correctly. Webkit browsers (Chrome, rekonq, Safari) do.
591 591 */
592 592 pre, code, kbd, samp { white-space: pre-wrap; }
593 593
594 594 #fonttest {
595 595 font-family: monospace;
596 596 }
597 597
598 598 .js-error {
599 599 color: darkred;
600 600 }
601 601
602 602 </style>
603 603 <style type="text/css">
604 604 .rendered_html {color: black;}
605 605 .rendered_html em {font-style: italic;}
606 606 .rendered_html strong {font-weight: bold;}
607 607 .rendered_html u {text-decoration: underline;}
608 608 .rendered_html :link { text-decoration: underline }
609 609 .rendered_html :visited { text-decoration: underline }
610 610 .rendered_html h1 {font-size: 197%; margin: .65em 0; font-weight: bold;}
611 611 .rendered_html h2 {font-size: 153.9%; margin: .75em 0; font-weight: bold;}
612 612 .rendered_html h3 {font-size: 123.1%; margin: .85em 0; font-weight: bold;}
613 613 .rendered_html h4 {font-size: 100% margin: 0.95em 0; font-weight: bold;}
614 614 .rendered_html h5 {font-size: 85%; margin: 1.5em 0; font-weight: bold;}
615 615 .rendered_html h6 {font-size: 77%; margin: 1.65em 0; font-weight: bold;}
616 616 .rendered_html ul {list-style:disc; margin: 1em 2em;}
617 617 .rendered_html ul ul {list-style:square; margin: 0em 2em;}
618 618 .rendered_html ul ul ul {list-style:circle; margin-left: 0em 2em;}
619 619 .rendered_html ol {list-style:upper-roman; margin: 1em 2em;}
620 620 .rendered_html ol ol {list-style:upper-alpha; margin: 0em 2em;}
621 621 .rendered_html ol ol ol {list-style:decimal; margin: 0em 2em;}
622 622 .rendered_html ol ol ol ol {list-style:lower-alpha; margin: 0em 2em;}
623 623 .rendered_html ol ol ol ol ol {list-style:lower-roman; margin: 0em 2em;}
624 624
625 625 .rendered_html hr {
626 626 color: black;
627 627 background-color: black;
628 628 }
629 629
630 630 .rendered_html pre {
631 631 margin: 1em 2em;
632 632 }
633 633
634 634 .rendered_html blockquote {
635 635 margin: 1em 2em;
636 636 }
637 637
638 638 .rendered_html table {
639 639 border: 1px solid black;
640 640 border-collapse: collapse;
641 641 margin: 1em 2em;
642 642 }
643 643
644 644 .rendered_html td {
645 645 border: 1px solid black;
646 646 text-align: left;
647 647 vertical-align: middle;
648 648 padding: 4px;
649 649 }
650 650
651 651 .rendered_html th {
652 652 border: 1px solid black;
653 653 text-align: left;
654 654 vertical-align: middle;
655 655 padding: 4px;
656 656 font-weight: bold;
657 657 }
658 658
659 659 .rendered_html tr {
660 660 border: 1px solid black;
661 661 }
662 662
663 663 .rendered_html p + p {
664 664 margin-top: 1em;
665 665 }
666 666
667 667
668 668 </style>
669 669 <style type="text/css">
670 670 /* Overrides of notebook CSS for static HTML export
671 671
672 672 */
673 673 body {
674 674 overflow: visible;
675 675 padding: 8px;
676 676 }
677 677 .input_area {
678 678 padding: 0.4em;
679 679 }
680 680
681 681 </style>
682 682 <meta charset="UTF-8">
683 683 <style type="text/css">
684 684 .highlight .hll { background-color: #ffffcc }
685 685 .highlight { background: #f8f8f8; }
686 686 .highlight .c { color: #408080; font-style: italic } /* Comment */
687 687 .highlight .err { border: 1px solid #FF0000 } /* Error */
688 688 .highlight .k { color: #008000; font-weight: bold } /* Keyword */
689 689 .highlight .o { color: #666666 } /* Operator */
690 690 .highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */
691 691 .highlight .cp { color: #BC7A00 } /* Comment.Preproc */
692 692 .highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */
693 693 .highlight .cs { color: #408080; font-style: italic } /* Comment.Special */
694 694 .highlight .gd { color: #A00000 } /* Generic.Deleted */
695 695 .highlight .ge { font-style: italic } /* Generic.Emph */
696 696 .highlight .gr { color: #FF0000 } /* Generic.Error */
697 697 .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
698 698 .highlight .gi { color: #00A000 } /* Generic.Inserted */
699 699 .highlight .go { color: #808080 } /* Generic.Output */
700 700 .highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
701 701 .highlight .gs { font-weight: bold } /* Generic.Strong */
702 702 .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
703 703 .highlight .gt { color: #0040D0 } /* Generic.Traceback */
704 704 .highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
705 705 .highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
706 706 .highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
707 707 .highlight .kp { color: #008000 } /* Keyword.Pseudo */
708 708 .highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
709 709 .highlight .kt { color: #B00040 } /* Keyword.Type */
710 710 .highlight .m { color: #666666 } /* Literal.Number */
711 711 .highlight .s { color: #BA2121 } /* Literal.String */
712 712 .highlight .na { color: #7D9029 } /* Name.Attribute */
713 713 .highlight .nb { color: #008000 } /* Name.Builtin */
714 714 .highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */
715 715 .highlight .no { color: #880000 } /* Name.Constant */
716 716 .highlight .nd { color: #AA22FF } /* Name.Decorator */
717 717 .highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */
718 718 .highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
719 719 .highlight .nf { color: #0000FF } /* Name.Function */
720 720 .highlight .nl { color: #A0A000 } /* Name.Label */
721 721 .highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
722 722 .highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
723 723 .highlight .nv { color: #19177C } /* Name.Variable */
724 724 .highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
725 725 .highlight .w { color: #bbbbbb } /* Text.Whitespace */
726 726 .highlight .mf { color: #666666 } /* Literal.Number.Float */
727 727 .highlight .mh { color: #666666 } /* Literal.Number.Hex */
728 728 .highlight .mi { color: #666666 } /* Literal.Number.Integer */
729 729 .highlight .mo { color: #666666 } /* Literal.Number.Oct */
730 730 .highlight .sb { color: #BA2121 } /* Literal.String.Backtick */
731 731 .highlight .sc { color: #BA2121 } /* Literal.String.Char */
732 732 .highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
733 733 .highlight .s2 { color: #BA2121 } /* Literal.String.Double */
734 734 .highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
735 735 .highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
736 736 .highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
737 737 .highlight .sx { color: #008000 } /* Literal.String.Other */
738 738 .highlight .sr { color: #BB6688 } /* Literal.String.Regex */
739 739 .highlight .s1 { color: #BA2121 } /* Literal.String.Single */
740 740 .highlight .ss { color: #19177C } /* Literal.String.Symbol */
741 741 .highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */
742 742 .highlight .vc { color: #19177C } /* Name.Variable.Class */
743 743 .highlight .vg { color: #19177C } /* Name.Variable.Global */
744 744 .highlight .vi { color: #19177C } /* Name.Variable.Instance */
745 745 .highlight .il { color: #666666 } /* Literal.Number.Integer.Long */
746 746 </style>
747 747 <script src="https://c328740.ssl.cf1.rackcdn.com/mathjax/latest/MathJax.js?config=TeX-AMS_HTML" type="text/javascript">
748 748
749 749 </script>
750 750 <script type="text/javascript">
751 751 init_mathjax = function() {
752 752 if (window.MathJax) {
753 753 // MathJax loaded
754 754 MathJax.Hub.Config({
755 755 tex2jax: {
756 756 inlineMath: [ ['$','$'], ["\\(","\\)"] ],
757 757 displayMath: [ ['$$','$$'], ["\\[","\\]"] ]
758 758 },
759 759 displayAlign: 'left', // Change this to 'center' to center equations.
760 760 "HTML-CSS": {
761 761 styles: {'.MathJax_Display': {"margin": 0}}
762 762 }
763 763 });
764 764 MathJax.Hub.Queue(["Typeset",MathJax.Hub]);
765 765 }
766 766 }
767 767 init_mathjax();
768 768 </script>
769 769 </head>
770 770 {%- endblock header -%}
771 771
772 772
773 773 {% block body %}
774 <body>{{ super() }}<body/>
775
776 {% endblock body %}
774 <body>{{ super() }}
775 </body>
776 {%- endblock body %}
777 777
778 778
779 779
780 780
781 781
782 782
783 783
784 784
785 785 {% block footer %}
786 </html>
787 {% endblock footer %}
786 </html>{% endblock footer %}
General Comments 0
You need to be logged in to leave comments. Login now